简单的到令人发指的perl6

zerray | 六月 18th, 2010 - 18:01

刚在搜erlang实现fibonacci方法的时候,看到wiki上这么一页:http://en.wikibooks.org/wiki/Fibonacci_Number_Program

列举了不同语言实现fibonacci数列计算的方法,每种语言都有各自的表达方式,可到了perl6这,就这么一句:

1,1...&[+]

无语了。。

不过话说perl6这玩意是夭折了吗?我上学那会儿就听说perl6要来了,还帮助翻译过perl6的文档,现在怎么没见有人用呢?

shell脚本中管道重定向read的问题

zerray | 六月 12th, 2010 - 15:19

同学问了这样一个问题:

#! /bin/bash

declare -a lines
i=0
cat /proc/net/netstat | while read line
do
    lines[$i]=${line}
    i=$((i+1))
done

echo ${lines[0]}

最终了输出结果${lines[0]}是空
试了一下果然如此
经过一番尝试,发现是使用了管道的问题,改为

#! /bin/bash

declare -a lines
i=0
while read line
do
    lines[$i]=${line}
    i=$((i+1))
done < /proc/net/netstat

echo ${lines[0]}

就没问题了
同样,如果管道前的cat换成ls、echo等,也会有相同问题
似乎是使用了管道后,变量的作用域发生了改变

关于这点在《高级bash脚本编程指南》上找到了相关提示

echo的输出通过管道传 递给read命 令可能会产生不可预料的结果. 在这种情况下, read命令的行为就好像它在子shell中运行一样. 可以使用set命 令来代替(就好像例子 11-17一样).

不过也没解释为什么,feature or bug?

sqlite3中show tables的实现

zerray | 六月 3rd, 2010 - 17:16

sqlite3 中每个 SQLite 数据库有一个 SQLITE_MASTER 表,用来存储所有表信息;

SQLITE_MASTER 表结构如下:

CREATE TABLE sqlite_master (
    type TEXT,
    name TEXT,
    tbl_name TEXT,
    rootpage INTEGER,
    sql TEXT
);

使用查询命令:

SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;

就可以实现show tables的功能了

python中类的静态成员函数和变量

zerray | 六月 2nd, 2010 - 17:25

类似C++中的:

class A {
    static int var;
    static int func(void);
}

在python中如何实现呢?
研究了下,静态函数可以这样:

class A():
    # non-static method
    def func1(self):
        pass

    # static method
    @staticmethod
    def func2():
        pass

但静态变量就麻烦些了,需要用classmethod来间接实现,如:

class A():

    last = -1

    @classmethod
    def last_argument(cls, n):
        temp = cls.last
        cls.last = n
        return temp

A.last_argument(1)
A.last_argument(17)

开发人员的固执

zerray | 九月 1st, 2007 - 16:20

最近学习xml,试图把我空间的 订阅RSS 用xslt解析一下,然后就碰到了一个问题:

文章内容是用<![CDATA[]]>标记起来的,使用<xsl:value-of select=”description”/>后,得到的页面中html tag都被显示了出来,like this:

很久没有遇到过梦魇了。<br>
<br>

网上搜解决方法,得到的方法是:<xsl:value-of select=”description” disable-output-escaping=”yes”/> 在IE下问题解决了,可是偶一直用firefox,不起作用

继续在网上搜,baidu来google去,渐渐认识到原来全世界人民都遇到了这个问题,是firefox没有支持disable-output- escaping。也有人提了bug,而firefox的开发人员在2001年就给出了解释 ,他们认为遵守标准比满足用户的需求更重要。于是这个不被他们认为是bug的bug至今也没有被修复。于是全世界想在firefox下使用 disable-output-escaping的人们,都不得不多写n行的js代码来自己处理这一问题。

我在想,如果这是在百度,早就当作重大事故做case study了……

安装ubuntu7.04的问题及解决方法

zerray | 七月 15th, 2007 - 18:08

写这么个标题是为了让搜索引擎更容易搜到,嘿嘿

终于还是忍不住在机器上装了linux。原本打算自己从编译内核开始手工打造一个linux系统,但编译内核首先得有一个能够运行的linux环境(先有鸡还是先有蛋的问题),再加上手工打造linux系统对我来说实在是个比较浩大的工程,所以还是先装个发行版吧。

选了ubuntu,主要是因为安装简单,界面漂亮。这2点上已经快赶上windows了,但不得不说MS的UE设计确实牛。

言归正传。安装过程中还是遇到了一些问题,在网上搜来搜去,得到了一些帮助,不过也有一些问题网上没有答案,所以写下来,希望能够帮助将来遇到这些问题的人:)

first,安装grub的问题。由于不想把grub装到主分区上(总觉得windows重装的频率会高些),所以在安装的时候选择了grub安装到 sda10(ubuntu所在分区)。结果在装到grub的时候安装失败,退出了……

解决方法:
mkdir /tmp/mnt
sudo mount /dev/sda10 /tmp/mnt
sudo grub-install /dev/sda10 –root-directory=/tmp/mnt /dev/sda10 (这一步,网上很多人问为什么grub-install失败,我一开始也是,提示”Not found or not a block device”,其实只要执行了mount,然后加上–root-directory就ok了)
然后上网搜一个menu.lst放到/boot/grub/下,改一改。
然后再mount一个windows分区,执行:
sudo dd if=/dev/sda10 of=/mnt/win_c/ubuntu.bin bs=512 count=1
重启到windows下把boot.ini里加上ubuntu.bin就大功告成了。
另外,安装grub之前最好用dd把mbr的512字节备份出来,否则装错了很麻烦的。

second,安装vim的问题。默认安装的vim居然连syntax on都不支持,只好再apt-get install vim了。但是安装完之后vim还是有个问题:在终端下一些关键字显示成灰色,根本没法看。百度了半天,是有不少人碰到同样的问题,但回答基本都一样 colorscheme evening。可是对于我来说没有效果啊。后来怀疑到显卡问题,ubuntu好像对ati的显卡支持不好。在终端下ll /dev了一下,发现原来应该显示成黄色的字体全都显示成灰色,看来跟vim没关系了。

解决方法:
在grub.lst里,kernel一行后面加上vga=791 (1024*768的分辨率),然后重启进终端,OK了。

最后,ubuntu的root口令的问题。其实很简单,sudo passwd root,然后先输入第一用户的密码就可以设置root的口令了。不过好像不是随便一个用户就可以用su成为root的。

RE:伪装ip的压力工具

zerray | 四月 13th, 2007 - 22:28

伪造ip的压力工具写好啦,证实了我之前的想法是可行的。
使用packet socket侦听网络上的数据包,从中找出tcp三次握手中的第二次的包,就可以完成tcp连接的建立了。这在本机压本机没有问题。但如果需要从另一台机器启压力,就需要修改被压机器的路由了,因为在交换网络中无法侦听到发给其他的机器的包。
修改路由也需要root权限,执行以下命令:
route add -net xxx.xxx.xxx.xxx netmask 255.255.0.0 gw xxx.xxx.xxx.xxx

需要注意的是,packet socket的close耗时很久,需要几十甚至上百毫秒。所以不能在每次需要侦听的时候建立侦听的socket。也不能每个工作线程中都打开一个 socket侦听,因为这样会需要过滤很多不需要的包,压力速度还是很低。可行的方法是在一个单独的线程中打开侦听socket,循环读取,将符合地址的包放进一个队列,工作线程从该队列中查找符合的包,得到seq。后面就是完成连接,发送请求数据了。

可能存在的问题有:1,可能造成默认网关收到大量无用的数据包,不过根据我实际测试,网关并不会接收到那些包,不知道为什么,难道是被本机丢掉了?2,只发送请求,不接收,可能导致被压的程序句柄数快速增加。不过这也可以通过相同的方法解决,只是麻烦些。

伪装ip的压力工具

zerray | 二月 6th, 2007 - 21:09

单调的生活只有写些单调的文章了
web的压力工具当然是越能模拟实际情况越好了,虽然只使用单ip来压多数情况下是差不多的,但拥有一个能够伪装自己ip的压力工具,或许能够暴露更多的问题,同时也是很酷的~

那么如何让压力工具伪装自己的ip呢?最简单的办法就是挂代理。可是,多数测试机是没有外网ip的,外网的代理访问不到,不可行。

那就换个方法吧。发出虚假ip的数据包是容易的,但要把服务器的返回收会来就成问题了。这就需要sniffer了,如果能够侦听到服务器返回的数据包,伪装ip就很容易了。可是在交换机环境里sniffer只能听到自己和广播,没啥用了,也不可行。

再想别的办法吧。web压力只要能和服务建立tcp连接,发送GET命令就ok了,不读返回也无所谓。也就是说只要能够完成3次握手问题就解决了。关键问题就是tcp header中的ISN了。如果能够预测到服务器返回的seq,那收不到服务器返回的SYN包也ok啦。百度一下,linux的isn算法在源码里可以找得到,就是secure_tcp_sequence_number函数。可是把这个函数从linux的源码里抽出来有些麻烦,而且即使弄出来可以用了,还涉及到两台机器间对表的问题,好不好用还很难说。有时间再尝试吧。

剩下的办法,就只剩本机压本机了。本机发出去的包总能sniffer到吧。只是sniffer到的包是如此的多,不知道能不能处理得过来。等有空了先写一个试试。

关于sniffer的方法,《网络编程》上对数据链路层的访问讲的很简略,只是推荐了libpcap和libnet,然而要学会用这2个库又是一项浩大的工作。百度来百度去,发现只要man 7 packet就能解决我的需求了。我需要的就是socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_ALL)); 记在这里备忘。

用gdb给程序打patch

zerray | 一月 29th, 2007 - 21:54

上次把代码丢了很是郁闷,还好有gdb帮我patch程序。今天又想起来要用,竟想不起用法了,看来这人哪,记忆力是越来越有限了……

写下来备忘:
set write on
然后file 重新载入文件
然后使用地址或是变量名修改就可以了,不仅可以修改数据,代码也是一样改的,core文件也可以。

在windows下用crontab

zerray | 九月 4th, 2006 - 22:05

windows的计划任务实在太弱了,想每个小时执行一条带参数的命令都实现不了。
还好我装了cygwin,需要启一个服务
$ cygrunsrv -I cron -p /usr/sbin/cron -a -D
$ cygrunsrv -S cron
然后就可以crontab -e添加任务了