企鹅's Blog

Happy coding

仰泳,Ollie

上周六下午游泳,仰泳有了新的进步,可以很放松的蛙式仰游了,手不动都行。还看到有人玩漂浮,真能漂在水面上,神。

最近又新开始玩滑板了,上上上周在公园练 Ollie,把一个轴承弄坏了,上上周末去新街口燃烧冰滑板店换了新的轴承和轮子,还买了双新滑板鞋,老板叫杨子,以前在中关村广场认识过,然后一群人玩到晚上7:00 才回家,上周五在中关村,练 Ollie,原地,初见成效。

昨天周末下午去鸟巢了,呆到晚上灯亮了才回家,仅相当于刷街。

系统管理员们的牢骚

如何让服务器更容易部署?

如何让 LAMP 更容易部署,定制,管理?

参考 http://bbs2.chinaunix.net/viewthread.php?tid=1495792

DNS 劫持问题

最近上网老是遇到域名不能访问,就被自动转到一个很恼人的网站上,发生 DNS 劫持了。

参考: http://bbs3.chinaunix.net/viewthread.php?tid=1494909&extra=&page=2

有以下几种方法:

1。使用国外或港台的 DNS 服务器

2。使用 OpenDNS

3。通过 Tor 解析 DNS

关于第三种方法,我准备尝试一下在写细节的配置方法。

一个网络编程库引发的讨论

以为网友在 CU 上发了自己的代码,

http://bbs2.chinaunix.net/viewthread.php?tid=1492378&extra=&page=1

网友 6.16 的评价:

 

好了,你想知道事实,那下面我来告诉你什么是事实:

1. 你的项目,测试模块在那里,example又在那里?

成熟的项目,没有那个没有测试模块和example模块的。无论是Unit Test,还是Acceptance Test、Performance Test、Stabe Test还是其他。
测试模块式质量的保证,敢问你的测试模块又在那里?
Example模块式告诉别人,每个常用的功能是怎么使用的,但请问,你的example模块又在那里?难道一个log server就完了?

写了四年的库,居然没有与之配套的Test和example,说你不成熟,我想光这一点也就足够了吧?

好了,在来看看其他的方面。

2. think_os.h 里,60到65行,居然屏蔽了4个windows版的wraning,虽然Boost里面有模块这样做,但本人作为一个Windows的开发者而言,你连 Windows的警告都高不定,还需要靠屏蔽来粉饰。高不定的人会旭辉认为没有什么大不了的,但在我看来,的确还有待提高。换用flw的话说,就是 “次”。

3. 你在很多头文件里Hard code了一堆ULL的值,也就是unsigned long long,你是怎么确定这个的长度的?
32 bits的系统? 64-bits的系统?
如果是64-bits,请问是哪种数据模型?LLP64?ILP64?还是其他?

4. 不少地方,嵌套得太恐怖,比如 think_utility.c 的  think_getopt 函数。在第528行到631行。自己去看。

5. 某些函数太长,是否需要重构一下?
think_db.c, think_db_open 函数,86到313行。
think_cfg.c,__think_loadcfg函数,24到197行。

6. Log? Log就这么简单?
为什么用你的Log而不用Logcxx的呢?你的Log的可定制程度又有多少呢?你的Log能否自动回滚、自动根据时间分别保存、自动级别分类呢?
如果能,你的手册在那里?

7. 网络?
网络就这么简单?哦,我看到了有poll,有select。但是,这也叫“很高”?你到底测过没有?并发量,压力数?
哦,IOCP, epoll,kqueue呢?
难道你给用户写复杂通讯程序的库,一个初级的select/poll就搞定了?你知不知道select的上限和瓶颈?

8. 代码不想看下去了。风格还算可以。但功能太简单。
首先,你的那些功能,那些函数是多线程安全的,那些是多线程不安全的?
那些是可重如的?那些是不可重入的?
每个调用的输入输出有什么意义和限制,边界条件时又会怎样?返回值又代表什么意义?
请问,你的手册上面写了么?
难道你让用户去看你的代码?
搞笑!!

9. 配置:

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
1。配制文件:
          不管什么程序总要读取配制文件吧?
          我的配制文件特别之处在于:支持继承、别名、覆盖、include、行内注释

实在想象不出,这真有什么特别的么?
还是说,你见过的太少了?


10. 通讯协议

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
5。通讯语言:
          写通讯类程序总要用到语言吧(也可称为协议)
          如果用XML语言来定义协议,解析效率会很差,协议定义复杂了,别人也很难解析
          8583类协议吧,又不支持字段乱序存放,1、2、3、4等位元必须依次存放,而且做字段嵌套也麻烦
          本人定义的GL语言,简单到极致,就是域号、域长度、域内容,很好解析,也很好嵌套,也可以乱序存放,增加字段,删除字段都很容易

XML是工业标准,为什么不用。不用你又怎么和其他的兼容?
私有协议?私有协议不是不行,但为什么又要用你这个而不是根据项目实际需求定义?
而且,你只说了文本协议,你真的知道文本协议和二进制协议各自的优缺点和适用场合么?

11. TCP封装

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
6。TCP库封装:
          connect,listen,accept,send,recv,close,select特别是前三个,总要做个封装吧,总不能把sockaddr这种东西留给用户层做吧

前面第7点我已经说了,太弱。完全不值得一用!

12.

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
7。通讯框架:
           仅仅封装几个系统函数对开发复杂的通讯程序还远远不够吧?
           本框架提供了单进程处理多个socket连接的框架,你只把建好的连接注册进来,再注册一个数据处理函数来处理接收到数据,发送数据时,尽管往缓冲区里发就是了,至于数据怎么缓冲的,各个socket怎么管理的,都不用关心了

同上。

 

 

另一网友提供了 CUer 的类似项目,以做比较:

http://code.google.com/p/sbase/
http://code.google.com/p/traxex/
http://sourceforge.net/projects/traxex/
http://libasdl.sourceforge.net/
http://code.google.com/p/libinet/
http://code.google.com/p/netdkit/
http://sourceforge.net/projects/echozhang/

--------------

启发:

1。代码质量必须由测试代码来保证

2。提供例子程序,以便演示你的功能

3。日志需要更细致的处理

4。尽量采用通用的标准

。。。

SVN sync 镜像备份

今天检查 svn 备份[1]时发现,备份从2周前就停止了,错误日志如下:

Failed to get lock on destination repos, currently held by 'cvs:7123ebf6-309e-4e42-af32-a6e456b02617'

Google 后,说[2]是这个 lock 是存在 -r0 上的,并用如下的方法去除掉:

svn propdel svn:sync-lock --revprop -r 0 {REPO PATH}

然后再 sync 就好了。

原因是某一次 sync 操作被中断了,而目前没有恢复的办法。

参考:

[1] SVN 仓库备份

[2] http://journal.paul.querna.org/articles/2006/09/14/using-svnsync/

Moblin 2.0 beta

I've downloaded the moblin 2.0 image, I tried to use win32-image-writer from luanchpad.net which I mentioned in previous blog to write the image into USB disk, but failed, maybe it jsut suite for ubuntu notebook version ? then I copy the image into that USB disk and use another laptop with linux, 'dd' command always can be truthed.:)

* Bootup

Moblin is booting, I hearded that the 'fast boot' techology has been included in the moblin release as default, Yeah, It's very fast, about 10s, with USB disk (it's a compressed filessytem with squash filesystem):

[root@localhost moblin]# df -h

Filesystem Size Used Avail Use% Mounted on

/dev/root 2.5G 1.5G 938M 62% /
tmpfs 4.0M 0 4.0M 0% /var/lock
tmpfs 4.0M 68K 4.0M 2% /var/run
tmpfs 499M 6.1M 493M 2% /dev/shm
/dev/sdb1 666M 666M 0 100% /mnt/live
/dev/sdc1 1.9G 1.6G 378M 81% /media/disk

* User interface

The moblin 2.0 user interface is amazing, powered by clutter, very fast.

There is an automatic hide panel in the top. from left to right, clock, m_zone, status (twitter, yes, it is), pepole, internet, media, pasteboard, applications, zone (application switcher), power & brightness, volume, internet connection status.

* Connectivity

Wifi works fine, also come with WiMAX, 3G, new and clean network managerment. But I cann't setup my bluetooth wireless mouse, use 'hcitool dev' can see the bluetooth dev, but here is not utility to setup it (connect my mouse or send file etc).

* prons, cons

Localization is not ready, That's why I cann't type this blog entry in Chinese.
Media function is poor, I guess only ogg is supported, I tried to play a rm file, failed. I found it just a 'playqueue come soon', it's a mockup. :)
Browser: widget in web page is not themed

Image Writer for Windows

https://launchpad.net/win32-image-writer

This tool is used for writing images to USB sticks on Windows.

Linux 可以使用 dd 命令制作磁盘映像,也可以把磁盘映像写回磁盘。最常用的就是在服务器上安装 RedHat 等 Linux 时,需要载入额外的驱动,才能识别服务器上的 RAID 设备,通常服务器厂商会提供一个软盘(3.5 英寸,1.44M)映像文件,把这个文件写入软盘中,不使用复制的办法,而得用专门的软件, Linux 系统下通常用 dd 命令,Windows 下有 rawwrite (不是系统自带的),另外,也有图形界面的工具,就是上面的 win32-image-writer。

1. Linux 下使用 dd

dd if=driver.img of=/dev/fd0

其中 driver.img 是下载的软盘映像文件, /dev/fd0 是 Linux 中的软盘设备文件。

2. 图形工具不用介绍不。

python: datetime.delta timezone bug ?

20090514172307.000000+000

20090513115527.000000+480
 

有这么两个 datetime 的值

period = d1 - d2

print period

得到的时间比预料的多了 8 小时,即我们的时区时间差

如果用如下的代码则没事

period = time.mktime(d1.timetuple()) - time.mktime(d2.timetuple())
delta = datetime.timedelta(seconds = period)

print delta

暂时把问题留这里,有时间再深入调查。

Lxr ng 安装

http://lxr.linux.no/

lxrng 新版本的 lxr.

在 Asianux 3 中安装 lxr 很费劲,后来找到了如下两份参考文档:

[Howto] LXRng on Ubuntu 7.10

http://lxr.linux.no/.static/contrib/lxr-notes-ubuntu.txt

对安装很有帮助。

Hello GTK+ in Linux Assembly Language

学着书里的例子,写一个 GTK+ 程序:

 

# Hello GTK+ in Assembly
#
# as -g asm-gtk.s -o asm-gtk.s.o
# gcc asm-gtk.s.o `pkg-config --libs gtk+-2.0` -g -o test
# ./test
#
# Author: Pengu1n , Date: 20090508
#

 .section .data

 # Strings
 APP_TITLE:
 .ascii "GTK+ in ASM\0"

 HELLO_ASM:
 .ascii "Hello ........ ASM!\0"

 BUTTON_CLICKED_INFO:
 .ascii "Hello button clicked!\n\0"
 .equ BUTTON_CLICKED_INFO_LEN, . - BUTTON_CLICKED_INFO    # '.' means current address

 # Constants
 .equ GTK_WINDOW_TOPLEVEL, 0
 .equ NULL, 0

 # GTK+ Signal name
 signal_button_clicked:
 .ascii "clicked\0"

 signal_delete_event:
 .ascii "delete_event\0"

 .section .bss

 .equ WORD_SIZE, 4
 .lcomm main_window, WORD_SIZE
 .lcomm hello_button, WORD_SIZE

 .section .text

 .global main
 .type main, @function

main:

 pushl %ebp
 movl  %esp, %ebp   # args is here, but howto get &argc ?

 # TODO: pass &argc, &argv to gtk_init
 pushl $NULL
 pushl $NULL
 call  gtk_init
 addl  $8, %esp

 pushl $GTK_WINDOW_TOPLEVEL
 call  gtk_window_new
 addl  $4, %esp
 movl  %eax, main_window

 pushl $APP_TITLE
 pushl main_window
 call  gtk_window_set_title
 addl  $8, %esp

 # Setup destory singal handler
 pushl $NULL
 pushl $NULL
 pushl $NULL
 pushl $destroy_handler
 pushl $signal_delete_event
 pushl main_window
 call g_signal_connect_data    # g_signal_connect is just a macro,
                               # so we must call g_signal_connect_data directly
 addl $24, %esp

 pushl $HELLO_ASM
 call  gtk_button_new_with_label
 addl  $4, %esp
 movl  %eax, hello_button

 # Setup destory singal handler
 pushl $NULL
 pushl $NULL
 pushl $NULL
 pushl $button_clicked_cb
 pushl $signal_button_clicked
 pushl hello_button
 call g_signal_connect_data
 addl $24, %esp

 pushl hello_button
 pushl main_window
 call gtk_container_add
 addl  $8, %esp

 pushl main_window
 call gtk_widget_show_all
 addl  $4, %esp

 call gtk_main

 movl $1, %eax
 movl $0, %ebx
 int  $0x80

 .type destroy_handler, @function
destroy_handler:

 pushl %ebp
 movl  %esp, %ebp

 call gtk_main_quit

 movl $0, %eax
 leave
 ret

 .type button_clicked_cb, @function
button_clicked_cb:

 pushl %ebp
 movl %esp, %ebp

 movl $4, %eax          # syscall __NR_write
 movl $1, %ebx          # stdout
 movl $BUTTON_CLICKED_INFO, %ecx
 movl $BUTTON_CLICKED_INFO_LEN, %edx
 int $0x80

 movl $0, %eax
 leave
 ret

 

 

 

遗留问题:还没有找到如何传 argc, argv 给 gtk_init。