仰泳,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 很费劲,后来找到了如下两份参考文档:
http://lxr.linux.no/.static/contrib/lxr-notes-ubuntu.txt
对安装很有帮助。
Hello GTK+ in Linux Assembly Language
学着书里的例子,写一个 GTK+ 程序:
#
# 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。