2008年3月31日星期一

Ubuntu和手机通过蓝牙互传文件

Ubuntu 7.10 Gutsy,手机Nokia 6120c,蓝牙适配器是让朋友帮买的,朋友不懂Linux,卖这个的也不懂,随便买了一个叫什么艾思凯(issk)蓝牙博士(BLUETOOTH DOCTOR)的,还行,一插机器上就认出来了,就是不知道各种参数如何,初步使用感觉传输距离或者说穿透力不强:

$ lsusb Bus 001 Device 002: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter 

首先安装一些必要的东东:

sudo aptitude install gnome-bluetooth gnome-phone-manager 

然后配置/etc/bluetooth/hcid.conf

# Security Manager mode # 安全设置模式,改成auto security auto; ... # Default PIN code for incoming connections # 匹配码/通行码,为安全起见,建议自己设一个。 passkey "1234"; ... # Local device name #   %d - device id #   %h - host name # 电脑在蓝牙设备中显示的名称,改不改无所谓,自己认识就行。 name "%h-%d"; 

重启服务/etc/init.d/bluetooth,从手机上查找匹配设备,找到电脑以后,输入刚才设定的匹配码;匹配成功之后,提示"授权设备自动连接"选"是"。

配置/etc/bluetooth/rfcomm.conf

rfcomm0 {     # 启动时自动绑定地址(什么意思?)     bind yes;     # 蓝牙设备地址(用$ hcitool scan查找,用$ sdptool browse [地址]查看频道)     device 00:1C:D6:AC:7D:88;     # 通迅频道     channel 11;     # 说明,自己随便写     comment "Fwolf Nokia 6120c"; } 

然后就可以用rfcomm connect 0连接手机了(测试一下):

$ rfcomm connect 0 Connected /dev/rfcomm0 to 00:1C:D6:AC:7D:88 on channel 1 Press CTRL-C for hangup Disconnected 

现在就可以传文件了:从电脑向手机发送文件用gnome-obex-send 文件名,按照提示选择蓝牙设备后,成功完成文件传输;从手机向电脑发送文件,电脑上要先运行gnome-obex-server,收到文件发送信号之后,会提示是否接收,接收完成后还会弹出一个如何处理的提示框,同时传多个文件的时候会比较烦人。传过来的文件都保存在$HOME/Desktop下,重名文件会自动更名。不过两个方向的传送方式传中文文件名都会乱码,文件内容没事。

但gnome-phone-manager能发现手机但就是连不上,不知道是不是channel设置的问题,又好像是软件本身的问题,不知道回头升级到Hardy能好些不。

下面是一些网上搜到可能有用的东东:

电脑上寻找蓝牙设备:
$ hcitool scan Scanning ...         00:1C:D6:AC:7D:88       Fwolf Nokia 6120c 
电脑上查询蓝牙手机(有时候只在适配器刚插上的时候能查询出数据,后来再用就连接超时):
$ sdptool browse 00:1C:D6:AC:7D:88 Service Name: AVRCP Target Service Description: Audio Video Remote Control Service Provider: Symbian Software Ltd. Service RecHandle: 0x10000 Service Class ID List:   "AV Remote Target" (0x110c) Protocol Descriptor List:   "L2CAP" (0x0100)     PSM: 23   "AVCTP" (0x0017)     uint16: 0x100 Profile Descriptor List:   "AV Remote" (0x110e)     Version: 0x0100  Service Name: Hands-Free Audio Gateway Service RecHandle: 0x10004 Service Class ID List:   "Handfree Audio Gateway" (0x111f)   "Generic Audio" (0x1203) Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 1 Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "Handsfree" (0x111e)     Version: 0x0105  Service Name: Headset Audio Gateway Service RecHandle: 0x10005 Service Class ID List:   "Headset Audio Gateway" (0x1112)   "Generic Audio" (0x1203) Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 2 Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "Headset" (0x1108)     Version: 0x0100  Service Name: Audio Source Service RecHandle: 0x10011 Service Class ID List:   "Audio Source" (0x110a) Protocol Descriptor List:   "L2CAP" (0x0100)     PSM: 25   "AVDTP" (0x0019)     uint16: 0x100 Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "Advanced Audio" (0x110d)     Version: 0x0100  Service Name: AVRCP Controller Service Description: Audio Video Remote Control Service Provider: Symbian Software Ltd. Service RecHandle: 0x10012 Service Class ID List:   "AV Remote" (0x110e) Protocol Descriptor List:   "L2CAP" (0x0100)     PSM: 23   "AVCTP" (0x0017)     uint16: 0x100 Profile Descriptor List:   "AV Remote" (0x110e)     Version: 0x0100  Service Name: SyncMLClient Service RecHandle: 0x10013 Service Class ID List:   UUID 128: 00000002-0000-1000-8000-0002ee000002 Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 10   "OBEX" (0x0008) Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "" (0x00000002-0000-1000-8000-0002ee000002)     Version: 0x0100  Service Name: OBEX File Transfer Service RecHandle: 0x10014 Service Class ID List:   "OBEX File Transfer" (0x1106) Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 11   "OBEX" (0x0008) Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "OBEX File Transfer" (0x1106)     Version: 0x0100  Service Name: Nokia OBEX PC Suite Services Service RecHandle: 0x10015 Service Class ID List:   UUID 128: 00005005-0000-1000-8000-0002ee000001 Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 12   "OBEX" (0x0008) Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "" (0x00005005-0000-1000-8000-0002ee000001)     Version: 0x0100  Service Name: Nokia SyncML Server Service RecHandle: 0x10016 Service Class ID List:   UUID 128: 00005601-0000-1000-8000-0002ee000001 Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 13   "OBEX" (0x0008) Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "" (0x00005601-0000-1000-8000-0002ee000001)     Version: 0x0100  Service RecHandle: 0x10017 Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 3  Service Name: OBEX Object Push Service RecHandle: 0x10018 Service Class ID List:   "OBEX Object Push" (0x1105) Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 9   "OBEX" (0x0008) Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "OBEX Object Push" (0x1105)     Version: 0x0100  Service Name: Dial-Up Networking Service RecHandle: 0x10019 Service Class ID List:   "Dialup Networking" (0x1103) Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 4 Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "Dialup Networking" (0x1103)     Version: 0x0100  Service Name: Imaging Service RecHandle: 0x1001a Service Class ID List:   "Imaging Responder" (0x111b) Protocol Descriptor List:   "L2CAP" (0x0100)   "RFCOMM" (0x0003)     Channel: 15   "OBEX" (0x0008) Language Base Attr List:   code_ISO639: 0x454e   encoding:    0x6a   base_offset: 0x100 Profile Descriptor List:   "Imaging" (0x111a)     Version: 0x0100 

这个可以用来查channel号码,不同手机的号码可能会不同,大概是要选择OBEX File Transfer所在的channel(我的手机是11),也有人说是用OBEX Object Push的频道(我的手机是9),再好像有时候瞎设一个或者干脆用1也能进行文件传输,总之有点深奥没弄明白,期待明白人发言。

在手机上查看蓝牙设备地址:*#2820
备注:gnome-obex-send找不到手机的解决办法(未测试)
sudo hciconfig hci0 inqmode 0 

参考

Source: http://www.fwolf.com/blog/post/393

2008年3月28日星期五

virtualbox连接usb设备

环境:Ubuntu 7.10 Gutsy, VirtualBox 1.5.6

网上虽然已经有很多介绍的文章了,但我还是遇到了一点小问题,别人好像没有说到。

首先就是得使用virtualbox的闭源版本,也就是非ose版本,如果你细心上virtualbox的开源、闭源版本区别页面去看看的话,可以清楚的看到ose版本是没有包含usb设备支持的,怪不得我的vb窗口右下角没有usb图标呢。

其次就是不用加什么usbfs组,只要在/etc/fstab中添加一句:

none /proc/bus/usb usbfs devgid=1002,devmode=664 0 0 

其中1002用你机器上真实的vboxusers组的id替换,然后sudo mount -a就可以正常使用了。

参考

顺便再多说一句,virtualbox支持网络要想设置成桥接(结果是client就像局域网中正常的另外一台电脑一样)好像是麻烦了些,其实我觉得nat模式挺好挺够用的,虽然通讯上要麻烦一些,但client中的winxp就像是运行在一个"纯净"的网络环境当中一样,非常安全,杀毒软件什么的一概不用装,很好。

再补充

又遇波折,usb设备已经能够正常识别了,Nokia 6120c插上也能够被winxp识别出来,但pc套件就是找不到设备,到virtualbox的论坛上查了一下,发现很多人使用1.5以后的版本都是这样,降级(卸载再安装)到1.4就没事了。

降级之后默认1.5的虚拟机无法启动,根据错误提示删掉几行1.5添加的专用属性就可以了,比较简单:

Could not load the settings file '/home/fwolf/.VirtualBox/Machines/WinXP/WinXP.xml' (VERR_OPEN_FAILED). FATAL ERROR: Unknown element 'Uart' Location: '/home/fwolf/.VirtualBox/Machines/WinXP/WinXP.xml', line 45, column 15. 

另外,还需要usb 2.0 ?? 找了一台usb 2.0接口的电脑试了还不行,没有办法了,关掉virtualbox,用vmware一连接就ok了,郁闷至极。

用obex连接Nokia 6120c

首先,把电话的控制权限赋予当前用户,通过dialout用户组,编辑/etc/udev/rules.d/40-permissions.rules文件,在最后添加上:

# NOKIA 6120 BUS=="usb", SYSFS{idVendor}=="0421", SYSFS{idProduct}=="002f", GROUP="dialout" 

其中的0421和002f是手机设备的供应商和产品号,可以用lsusb看:

$ lsusb Bus 005 Device 014: ID 0421:002f Nokia Mobile Phones 

然后将当前用户加入dialout组:

$ sudo adduser fwolf dialout 

最后重启udev:

$ sudo /etc/init.d/udev restart 

第二步,安装obex相关程序:

$ sudo aptitude install openobex-apps obexftp obextool 

根据环境不同,可能还会要求装一些其他的包,比如bwidget, tablelist什么的。装好以后,启动obextool:

$ obextool --obexcmd "obexftp -t /dev/ttyACM0 -u 1" 

等待一会儿,会提示错误:

It seems, that your device does not support the memory status feature. Memory status will be disabled 

/etc/obextools/obextool.cfg中找到下列内容:

### ### Enable memory status display - only works with Siemens :-( ### set ObexConfig(config,memstatus) 1 # set ObexConfig(config,memstatus) 0  ### ### Enable file move command - only works with Siemens :-( ### set ObexConfig(config,filemove) 1 # set ObexConfig(config,filemove) 0 

看到没有,这两项只对西门子有效,所以要把设置值改为0。上传文件的时候还有错误提示:

FIle '/path/to/upload/file' could not be uploaded to '/'! Please check your file permissions. 

还是在/etc/obextools/obextool.cfg中,有如下内容:

### Nokia 6670 requires the trailing slash on all directory names # set ObexConfig(config,dir_slash) 1 set ObexConfig(config,dir_slash) 0 

如果是Nokia手机,还是设置为0,但是。。。但是始终无法连接上手机,很不情愿的放弃了。参考:

闲话

又搜寻了很久,目前没有软件能在Linux下实现Nokia pc suite的全部功能,大部分都只解决了文件传送问题,二我所想要的却是电话本、短信、日历同步功能。

恼啊,Nokia的pc suite巨慢还不说,连Linux版也没有。又从网上找了很多参考以后,我决定搞一种自助、土点儿的通讯录同步方法(这个是最重要的,短信、日历没准儿也可以照葫芦画瓢一样搞定):

  1. 备份通讯录:打开名片夹->选项->全部标记->复制->至存储卡。
  2. 准备数据:用php写一个小程序,同步abook数据和存储卡中的vcf文件,usb数据通讯模式还是很好用的,同步的处理得智能一些,让手机和abook里的更新都有效。
  3. 恢复通讯录:打开名片夹->选项->复制->从存储卡。

短信输出使用MsgExport_v1.00汉化版,感觉还不错,剩下的就是需要正则表达式发威了。


Source: http://www.fwolf.com/blog/post/392

2008年3月25日星期二

adodb5连接sybase的一个错误

这个错误比较蹊跷,所以拿出来说一说。环境:php 5.2.3, adodb 5.04, ubuntu 7.10 Gutsy.

前两天为了使用adodb和sqlite3,就把adodb升级成了只支持php5的adodb5(5.0.4),过两天发现另外一个使用sybase的程序不正常了,运行时不工作直接退出,没有任何错误信息,通过添加die('hi');的方式定位到错误发生在$db = &ADONewConnection('sybase');这一行。

adodb对sybase的支持一直不强,不过还没有到不工作的地步,但这个错误没有任何提示,实在是不好找,无奈之下用ZendStudio来跟踪一下,弄了一个最简单的小程序,当然,它是不工作没错误直接结束:

#! /usr/bin/php Connect('server3', 'sa', '', 'dbname'); $rs = $db->Execute('select 1'); print_r($rs); ?> 

ZendStudio下Debug就报错了:

Compile Error: /home/fwolf/dev/include/adodb5/drivers/adodb-sybase.inc.php line 271 - Cannot make static method ADOConnection::UnixDate() non static in class ADODB_sybase 

拿着错误信息上网一查,原来是在adodb-sybase.inc.php文件中,180行开始的地方定义了两个函数UnixDate()和UnixTimeStamp()(提示错误在271行,271行是类ADODB_sybase的定义结束位置,所以这个错误是在代码编译是产生的,而不是运行时),而这两个函数在adodb.inc.php中是作为static函数定义的(2481、2505行),php5不允许覆盖static函数(这个在oop中好像是叫重载,太长时间没摸书本,记不清了),所以产生编译错误,程序中止。在adodb.inc.php的4089行,包含adodb-sybase.inc.php的时候又加上了@符号:

@include_once($file); 

所以错误信息被屏蔽,不显示了。ZendStudio由于Debug的原因,可能所有的错误都捕捉到了,忽略@。去掉@之后,直接运行就也可以报错了。

问题弄清楚了,如何改呢,我想大概有两种方式:

  1. 修改adodb.inc.php,不将UnixDate()函数定义为static。
  2. 修改adodb-sybase.inc.php,取消两个函数的重复定义。

相比之下,觉得第一种方法更好一些,第二种方法可能会引发其它的错误。所以改下来一共是去掉四个static:

Line 2481: ADOConnection::UnixDate() Line 2505: ADOConnection::UnixTimeStamp() Line 3204: ADORecordSet::UnixDate() Line 3215: ADORecordSet::UnixTimeStamp() 

简单测试了一下,基本工作正常。

参考

PS: ZendStudio使用单独的一套php.ini,放在/path/to/ZendStudio-5.5.0/bin/php5目录下,我总是忘记,每次include path不对劲的时候都要找半天。

Source: http://www.fwolf.com/blog/post/391

两部“小”片

也是奇怪,周末休息随便找了两部电影看,居然全都是"小"电影,"小"是相对于制作华丽、场景宏大的大片而言的,但"小"并不代表就不精彩,两部电影让我看得一点儿也不困。

The Man From Earth/这个男人来自地球/地球男人/地底奇人/长生不老/不死之身

首先就是这个啦,第一个译名还是不错的,其它的中文译名简直就是胡扯。整个影片就没出那栋房子,从一开始要搬家,到片子结束也没搬走。几个所谓的科学家,其中一个还泡了个学生,在一起絮絮叨叨,听老男人讲故事,一会儿相信一会儿不信的。而那14000年的历史,按照豆瓣上网友说的,都在老男人的嘴里了

但是,这部电影也向我们证明了,科幻就是科幻,虽然动画技术能够让科幻更加"直观"的展现在观众面前,但科幻的精髓依然是人的想像。高明的科幻电影都是已勾起人的想像为核心吸引力的,The Man From Earth就是一个成功的证明,老男人先说自己不得不搬走,又说自己活了14000年,然后在众人的烘托之下,把这14000年的经历颠三倒四的娓娓道出。在观众快要听烦了的时候,又拐弯抹角借一个教徒的嘴,表明了这个男人就是耶酥,神哪,从那一刻,我也开始怀疑他到底是不是个大骗子了。

最后骗子终于"承认"了自己的谎言,不过谁都知道这是假的,可科学家们却如获重视,借这个台阶下台一一回家了。导演还不罢休,在片尾又给老男人安插了一个孩子,得,故事的真实性终于板上钉钉,剩下的,就是观众们自己去想像了。

Bloody Numbers/血腥数字/带血的号码

虽然稍逊于上面那个,但依然是一部以小搏大的优秀作品。场景小了,就一个房间而已,"外景"有三个,楼梯间、卫生间和透过窗户看到的楼下。

剧情也是简单到不能再简单,某人捡到彩票,给主人留言,想还给人家,后来一看中奖了,就不想还了,用自己那张替了过去。后来人家上门来拿,一个不愿给,一个由于各种机缘不能离开,僵持之下之后和室友一起玩扑克,满满又发展为用彩票作为赌注。奇妙的事情来了,有的人知道彩票已中奖而有的人不知道,一场牌桌上和牌桌下的博弈演得有滋有味。最终某人良心发现,而室友则丧心病狂,好在事情还在控制当中,某人把彩票交给了警察,让警察完成归还的任务。

看到这里,猪都知道某人给警察的是一张没中奖的彩票,果不奇然,在大结局中,某人顺利将彩票归还他的主人,开始专心搞定女友的事情。。。。咚咚,又有人敲门,打开一看,真正的彩票主人刚刚来到。。。

如果你是看到这里才睡醒的人,强烈建议睡饱之后再重看一遍。故事的前面虽然的确有点拖沓,但也是必要的铺垫,人物心理的飘忽不定、左右摇摆才是最有滋味的。不要只想着最后时刻的那点"噱头",怀疑那只是叫醒电影院中沉睡着的一个惯用伎俩而已。

带血的号码,真的是名副其实,还一点也不暴力,不看可惜哦。

Source: http://www.fwolf.com/blog/post/390

[PHP]在bash中输出彩色文本

先看图吧:

PHP在bash中输出彩色文本

乱不乱?这是我自己用的一个web游戏机器人程序的输出,游戏自然一切都是数字说了算,可每次看这一大堆数字实在是让我头疼,从中找出有用的数据太难了,对齐、缩进都办法也不怎么见效,突然我想到,如果用escape color输出彩色的文本,应该看起来会舒服很多吧?

说到escape color,用过bash的人应该都见过,只是不知道它叫这么名字而已。ls中彩色的文件、目录名就是用escape color来实现的。早些年用得比较多的telnet形式的bbs,它的颜色也是escape color,最明显的特征就是bbs文章被转贴到别处的时候,经常会多出一些ESC什么的字符出来,这就是escape color的控制字符。

想完整的了解escape color,资料很多,wikipedia - ANSI escape code就有比较完整的解释,中文的资料也不少,比如啦啦~在bash下输出彩色的文本,甚至还有人做出了颜色表:The 256 color mode of xterm

不用觉得眼花缭乱,简单说来,escape code就是在终端(terminal)中输出的控制字符,不光包括文字颜色,还可以控制很多其它内容,当然,颜色是比较常用的,所以习惯称之为escape color。我在这里也只讲颜色,其它控制字符的使用方式大同小异,但需要主意不同的终端类型可能会略有区别。

escape color的格式为:

[{attr};{fg};{bg}m 

其中[是起始字符,在bash中一般是16进制的0×1b,也就是八进制的033,十进制的27,另外一种表现方式就是^[,熟悉吧,在bash中按一下Ctrl+v再按ESC它就出来了。后面分别是attr模式、fg前景色、bg背景色,中间用逗号;间隔,最后用字母m结尾。

attr的取值有:

0   Reset All Attributes (return to normal mode) #重置所有设置,回归自然 1   Bright (Usually turns on BOLD) # 高亮/加粗 2   Dim 3   Underline 5   Blink 7   Reverse 8   Hidden 

fg的取值有:

30  Black 31  Red 32  Green 33  Yellow 34  Blue 35  Magenta 36  Cyan 37  White 

bg的取值有:

40  Black 41  Red 42  Green 43  Yellow 44  Blue 45  Magenta 46  Cyan 47  White 

可以看到,attr/fg/bg的用值范围不重叠,所以空缺哪个无所谓。

在用php输出的时候,只需要在正常字符串内容中,加入适当的escape color代码就可以了,其实其它应用程序也是类似操作的,并不需要额外的设置,比如:

$ php -r 'echo "\x1b[5;31;44m第一种色彩\x1b[3;34;41m第二种色彩\x1b[0m 回归自然\n";' 

看到彩色了吧?秀一下我那个机器人美化之后的界面:

PHP在bash中输出彩色文本

顺便说一句,把字符串储存到文件中的时候,escape color也可以一起存上的,浏览时,cat和tail默认就支持颜色显示,less则需要带上-R参数才行。

Source: http://www.fwolf.com/blog/post/389


.NET还是PHP?

最近有一个项目,在讨论是用.NET还是PHP开发,这个讨论并非基于语言的优劣性,而是根据实际环境、情况考虑的结果。

这是以前开发、现在用着的一个web系统,类似mis的一个业务系统,他的一个相对独立一些的子系统(和其它部分联系也有,但比较少)。原先使用JSP/java开发,现在维护和开发都没有java的人了,所以必需要换开发语言。系统的逻辑处理相比之前有不少变化,但大的过程没有动,UI方面也有许多需要改,并且想更换数据库,把以前写在存储过程中的逻辑搬出来,便于维护。系统平台方面,虽然都是跑在apache/tomcat下,但以前是windows平台,打算迁移到Linux下。大概就是这么个样子吧。

支持使用.NET、不用PHP的理由有:

  • 开发团队对.NET熟悉、熟练。
  • 系统平台的切换可以以后作。
  • 开发时间太紧、任务不少,用PHP还要现学,怕完不成。

支持使用PHP,不用.NET的理由有:

  • 坚持大环境的转换(从windows到Linux,不考虑mono之类的东东)。
  • 以后再作=不作,能用的系统谁没事出钱让你再改一遍?
  • PHP学习很快,有人带。
  • .NET对维护不利,和svn配合不畅,在运行处无法直接修改小错误(必需编译,开发方不在现场,响应速度满足不了需要,当然只是在说小错误
  • 优先将紧急的任务先完成,争取到一些时间后再完善周边功能。

其实老实说,主张使用PHP是带有一些个人色彩的,但我觉得开源、Linux是大方向,及早动手对以后的工作有利,并且Linux下的管理明显要比windows要方便很多,对于要使用几年的系统来说这个投资应该是很"值"的;并且我也主观臆断一下,开发方在学习新的开发语言上是有"惰性"的,毕竟现在的人员配备都是.NET系的,学习不光耗时耗力,可能还会牵涉到人力成本的上升。

矛盾一:任务、时间、质量。
矛盾二:仅仅是完成任务 VS 系统平台迁移的总体部署
矛盾三:如果我有时间,那我有能力和信心让PHP发挥出应有的威力,可我既不属于开发方,也没有足够的时间(当然一些辅助性的工作或帮忙还是没有问题的)。

该如何选择呢?我这里虽然人少,但应该都是技术圈的人,大家给出出主意吧,或者转到其它人多的地方也行(恕我很少跑坛子),如何使PHP在短时间内让几位.NET系的开发人员学会,并做出质量不太差的系统?

开发方人员有code基础,我这里有些PHP经验,但现成可用的架构没有,adodb和smarty是肯定要用的,系统架构难道不成现搭一个?头疼ing。。。

传统的IT企业真的是在windows上"陷"得太深了,开源的路依然漫长哪~~

Source: http://www.fwolf.com/blog/post/388

向太空移植生命


人类从来没有停止过探索太空的步伐,无论是科学幻想或者是把什么东东真的送到天上去,可我们不得不面对一个现实,在没有有效的运输工具被发明出来之前,我们基本上只能等着外星人来串门了。

换一个思路,太空中到底有没有生命?虽然现在理论上已经"证明"了这一点,可谁也拿不出有效的证据来。UFO的传言也时常出现但众说不一,美国51区依然神秘。与其这么麻烦,我们为什么不把地球上的生命"传播"出去呢?现在知道的就是原来抛出去过一个留声机什么的,那玩意儿搁现在的地球上都落后了,天知道能被外星人当什么看。再说了,茫茫宇宙,找个星星都困难,发现一台小机器的几率又有多大呢?

所以啊,想增加发现或者被发现的几率,弄不了太大的东西,只能靠数量补,搞"人海战术"了。最小的生命体大概就是细菌、病毒什么的了,这些东西体积又小,又不值钱,最重要的,适应能力强,高温黑暗无氧都难不倒他们,把这些东西传播到太空中,让他们随宇宙里的各种"风"四处传播好了。

不用担心这些东西再被重新传播到地球上,给人类带来什么危害,因为他们本来就产生于地球,既然以前我们能够对付他们,将来也能。

这样一来,也许在将来的某一天,某处的外星人会收到来自地球的礼物,凭借他们强大的科技,追本溯源找到我们,岂不皆大欢喜?另也许在将来的某一天,当我们的后代的后代的后代与外星人相聚的时候,他们会说:"我们在800x年爆发了非典疫情,在900x年流行禽流感,合着都是你们地球人搞的鬼啊?",呵呵。还也许在将来的某一天,我们会登陆到一个陌生的星球上,发现与我们同一起源,但随着完全不同的进化过程形成的"新人类",和我们的远方亲戚亲密接触不知感觉如何。

涉及到地球上最早的生命体的问题,有一说是"古菌、细菌和真核生物",并不影响我的想法的施行,不管科学的答案怎样,扔太空里就是了。一公斤就能装很多哦,超值的"大礼包"。

你能一眼找到下载链接在哪儿么?

Free Image Hosting at www.ImageShack.us

Source: http://www.fwolf.com/blog/post/387


蒼き狼〜地果て海尽きるまで〜/苍狼:直至天涯海角


我想说这部电影不好看的人,要么是没看进去,要么是太年轻。铁木真的故事已经妇孺皆知了,能以外国人的身份在蒙古国拍中国人的电影,拍到这种程度,知足吧。

蒙古的草原不算完美,大概是季节不对,有些镜头中花花草草蓝天白云是挺漂亮,另外一些镜头马儿跑起来照样是尘土飞扬,不愧为沙尘暴的发源地之一。打打杀杀的场面咱们也见多了,虽然比不上欧美的大片场面壮观,相对于东方电影来说也算不错了,呼啦啦的人也是一大片一大片的,rmvb版就更加分不清那些是真人那些是特技了。但这些不影响真正的剧情,铁木真和札木合的安达之交,铁木真为父的心酸才是精髓啊。

本来想着这部电影还是挺适合孩子们看的,可想到那几个砍人喷血的优美镜头,以及从小就弑兄的事情,还是罢了。

反町隆史虽然个子是不太像蒙古大块头,可消瘦的脸庞却更能衬托铁木真的沧桑,这可是重要的剧情需要,像大块头有大智慧里刘德华那样用模具"强身"日本人又不是作不出来。但是,我一直有一个深深的问号,每次呐喊怎么都那么嘶哑,看过的其它日本片也几乎都是这样,这大概也是日本语言的特点吧,所以有人说日剧味儿太浓了。其实看过一些韩剧,韩语说起来也是大呼小叫的,都差不多,还是中文好,绵甜静柔啊。还有,那么大一片人,没有扩音器,谁能听见啊,风有那么大,真的内功练到家了,太阳穴高高鼓起、中气十足、会千里传音么?光顾场面大,把这头给忽略了吧。

还有,蒙古人怎么都不带盾牌啊,蒙古包里不都挂着了么,弓箭那么狠,盔甲跟没穿一个样,不重视防御,真以为自己是barbarian了。

蒙古马真是又经济又实惠,个头不高,适合东方人,操纵性强,草料肯定吃得也少,也不用豪华马厩,还能征善战,让铁木真横扫欧亚大陆,哇噻哇塞,和大众甲壳虫有得一拼。

再翻回来说两句剧情,说铁木真和札木合的安达之交,其实结拜的时候都还小不懂事,可都成了气候之后展开了一场半个蒙古与半个蒙古的战争,不仅让我猜想如果Intel和AMD的老大也是结拜兄弟会怎样。。。?与这种天翻地覆的气魄相比,什么"决战紫禁之颠"就太小家碧玉喽。

史诗片算不上,年代不够远,虚构成分太少。

花瓶式的人物,Ara柯兰,体现铁木真的凝聚力和号召力也不用如此手段吧,口口声声说要作soilder,到头来又主动献身,参政的时候在旁边补衣服,打仗时又穿着盔甲却不动手,一搭没一搭啊。哦对了,札木合的弟弟暗杀那一场戏的需要,远程武器还是厉害啊,札木合的弟弟要是也会飞刀就好了,野蛮人玩暗杀的确不行哪。总是觉得野蛮人柯南里面的阿诺和女剑士更般配一些,啧啧。。。

光瞎说了,盼望着哪一天,我们也到韩国去拍拍什么太阁立志传、信长之野望、德川家康什么的,别老让日本人玩咱们的三国志、西游记。

官方网站用Firefox进不去,残念。。。对于电影的官网来说好像这种情况很少见哦。

======== 分隔符,第二场电影 =========

之所以在这里随便写几句,是因为感觉这片子得太烂了,本以为揭密大兵们在伊战中的感受,谁知道一直在拿虐囚事件说事,说得还不明不白,藏着掖着,很有耐心的我都忍不住按快进了。

看完以后,没啥感觉,所以也就写不出什么来了。


 

Source: http://www.fwolf.com/blog/post/386

2008年3月7日星期五

ssh的连接重用

原理很简单,开一个ssh连接在后台放着,以后再有需要用到ssh到同样主机的时候,直接使用这个连接的socket文件,不用再创建连接了,同理,也不需要再进行用户身份验证。

默认是关闭的,可以在~/.ssh/config中打开:

Host *     ControlMaster auto     ControlPath ~/.ssh/master-%r@%h:%p 

创建"Master"连接就可以用:

ssh -M -N -f fwolf.com 

认证成功后会创建socket文件master-fwolf@fwolf.com:22

其它的介绍资料也很多,我是在邮件列表中看到的,惭愧,使用ssh很久了,现在才知道,网上用ssh master ControlMaster搜索资料很多。

实际使用中,我倒有一个反面的感觉,创建了"Master"之后,一般的scp什么的操作的确是快了,可如果单独开一个ssh terminal上去的话,输入的响应速度很变慢。开始以为是这个ssh连接也重用了"Master"的原因,后来加上-o ControlMaster=no参数强制不使用Master,单独创建新连接也是一样,不知道是什么原因导致的。

仔细测试一下效果,首先在已经创建Master的情况下连接主机,执行命令并马上退出:

$ time ssh fwolf.com -C pwd 

执行多次,得到的执行时间一般在0.33秒左右,然后关闭Master,再次执行这个命令,平均执行时间为6.7秒,的确是快了许多。

后来才发现,刚才对响应速度"慢"的感觉应该是错误的,可能是由于另外开着一个scp的缘故,scp完成之后,速度就快很多了。之所以会感觉"慢",其实也是相对而言的,因为单独ssh连接上去之后,也是不中断的持续连接、持续响应,同样没有重新建立连接的时间,速度也是非常快的。开启Master主要对那些一会儿连接、一会儿断开,请求断断续续的情况最有效果。

另外,还有两个比较有用的相关控制命令:

# 检查当前是否已经创建Master连接 $ ssh fwolf.com -O check Master running (pid=6350)  # 发送断开当前Master连接的请求,比我用的笨kill方式好多了 $ ssh fwolf.com -O exit Exit request sent. $ ssh fwolf.com -O check Control socket connect(/home/fwolf/.ssh/master-fwolf@fwolf.com:22): No such file or directory 

参考

Accelerating OpenSSH connections with ControlMaster

Source: http://www.fwolf.com/blog/post/385

PDO和sqlite的一点体会

用php写了一个小工具,顺便体验了下PDO和sqlite,一个是php5自带的数据库层,一个是简易的文件型数据库,没什么章法,简单记录在这里。

  • 配合pdo使用,只用安装php5-sqlite即可,php5-sqlite3这个extension可能是单独的sqlite支持,就是类似mysql,有专门的sqlite_connect函数。
  • 系统中也可以安装单独的sqlite3(不带3的是sqlite2),采用类似mysql的shell方式管理库文件。
  • 通过PDO好像无法查询数据库的结构等信息,只能操作DML。
  • 不知道pdo使用sybase(dblib)的时候是否能在sql中使用limit,以及使用了是否有效,要到hardy 8.04 php5-sybase才支持pdo,到时候再试验。
  • Bug: rowCount()无法工作于pdo_sqlite数据库,其他一些函数也有小问题,官方文档的user comment中有说到。
  • PDO的exec方法可以一次执行多条sql,但不返回结果,而query则只能执行一条,返回结果信息。
  • 使用PDO的prepare和PDOStatement的execute不仅有助于加速同一sql不同参数的调用速度,还有助于防止sql注入攻击。
  • prepare的:name不能是表名,大概只能是where中的变值,prepare中的字符型:name不需要带上引号,这一点很方便。

总体感觉,PDO还没有AdoDb方便,大概是用熟了的感觉,但功能上的确要少一些。sqlite数据库表现不错,但由于数据类型、结构、功能相对简单,还是主要用在小型、简单一点的应用里更合适。

Source: http://www.fwolf.com/blog/post/384

[MediaTemple]虚拟主机内存优化的一点心得

今天下午好像有人对服务器ddos,或者大量灌spam(我不敢说每个人都安装了anti spam插件,即使安装了,"应对"spammer也要消耗服务器资源),http服务器耗尽服务器资源后挂掉,一会儿被watchdog重启,过不了多一会儿再次挂掉。。。以前也尝试过优化apache,不过今天似乎终于摸到了一点儿窍门。

我们合租的MediaTemple服务器cpu负载不高,内存相对紧张:

top - 23:39:45 up 16 days,  7:24,  2 users,  load average: 0.58, 0.50, 0.47 Tasks:  46 total,   1 running,  45 sleeping,   0 stopped,   0 zombie Cpu(s):  9.9% us,  2.5% sy,  0.0% ni, 87.6% id,  0.0% wa,  0.0% hi,  0.0% si Mem:    689496k total,   550892k used,   138604k free,        0k buffers 

所以优化主要针对如何节约内存。主机内存实际是256M,可能是多核的缘故,总显示接近700M内存,不过对应的各个进程占用的内存也相应增加了。MediaTemple的KB中有一篇(dv) HOWTO: Performance tuning (Optimization),先按照这个来优化一下,主要分为三个部分。

优化Apache(httpd)

缩短超时时限:

#Timeout 120 Timeout 30 

调整prefork参数,我调整的结果是:

 #1/1/3 StartServers       1 MinSpareServers    1 MaxSpareServers    3 # 50 ? ServerLimit       20 MaxClients        20 MaxRequestsPerChild  2000  

StartServers是开始的httpd进程数,Min和Max SpareServers是最少和最多空闲进程数,ServerLimit和MaxClients是总进程数限制,这两个参数一般来说是相同的,httpd所消耗的总内存数就和这个相关(实际进程数还会多两个,应该是负责管理子进程的"父进程"),内存不够可以把这两个数值进一步缩小,但这也同时对应着httpd同时处理的并发数。MaxRequestsPerChild是每个进程在处理多少个任务后自杀,根据需要和相关设置还会再启动新的子进程,这种机制有利于释放一些内存碎片。

MaxClients不够会在log产生错误信息,可以用下面的命令查询:

grep -i maxclient /var/log/httpd/error_log 

可以根据情况再调整MaxClients的值,但如果内存就是短缺,又能有什么办法呢?

优化Mysql

设置缓存,在my.cnf的[mysqld]段中增加:

# Cache query-cache-type = 1 query-cache-size = 16M 

虽然会多占用一些内存,但能加快处理的速度,尽快把等待队列"消化"掉,还是有利于加速的。在mysql中可以查询cache使用情况:

mysql> show status like 'Qcache%'; +-------------------------+----------+ | Variable_name           | Value    | +-------------------------+----------+ | Qcache_free_blocks      | 12       | | Qcache_free_memory      | 13028408 | | Qcache_hits             | 35117    | | Qcache_inserts          | 751      | | Qcache_lowmem_prunes    | 0        | | Qcache_not_cached       | 56       | | Qcache_queries_in_cache | 377      | | Qcache_total_blocks     | 872      | +-------------------------+----------+ 8 rows in set (0.00 sec) ...... some times late ...... mysql> show status like 'Qcache%'; +-------------------------+---------+ | Variable_name           | Value   | +-------------------------+---------+ | Qcache_free_blocks      | 88      | | Qcache_free_memory      | 8837920 | | Qcache_hits             | 164437  | | Qcache_inserts          | 3572    | | Qcache_lowmem_prunes    | 0       | | Qcache_not_cached       | 432     | | Qcache_queries_in_cache | 1177    | | Qcache_total_blocks     | 2579    | +-------------------------+---------+ 8 rows in set (0.00 sec) 

调整query-cache-size的值让Qcache_lowmem_prunes保持在0最好,设置太大了也是浪费内存。

关闭不需要的服务

比如named,域名解析使用域名注册商提供的就足够了,关闭spamassassin,邮件服务仅限于对外发送邮件,不接收:

chmod 644 /etc/init.d/psa-spamassassin 

watchdog暂时不建议关闭,人不在的时候它会自动重启服务,还是有一点用处的。

其它优化设置

从其它地方还看到可以开启KeepAlive:

KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 15 

这样每个连接可以发送100次请求,超时时间为15秒。如果KeepAliveTimeout减少一些,MaxKeepAliveRequests还可以设置得更大一点。

还可以启用apache的压缩输出功能:

 #   DeflateCompressionLevel 2     AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-php application/x-javascript text/css  

简单观察一下,开启deflate之后,服务器cpu idle值大概会减少15~20%,国外主机数据传输本身就慢,希望这些花销值得。

top - 01:39:03 up 16 days,  9:23,  3 users,  load average: 2.16, 2.09, 1.97 Tasks:  48 total,   1 running,  47 sleeping,   0 stopped,   0 zombie Cpu(s): 24.1% us,  8.4% sy,  0.0% ni, 67.6% id,  0.0% wa,  0.0% hi,  0.0% si Mem:    689496k total,   431452k used,   258044k free,        0k buffers Swap:        0k total,        0k used,        0k free,        0k cached 

结果

现在看一下结果,ps -U apache u能看到一共有20个apache进程在运行,占用内存总量为:

root@fwolf:~# ps -U apache u|awk '{S+=$6} END {print S}' 385396 

随着服务运行,内存使用量还会增加(所以MaxRequestsPerChild别设太大,定期重启一些进程)。再看看那个疑似对我ddos的家伙:

root@fwolf:~# netstat -nap|grep :80|wc -l 513 root@fwolf:~# netstat -nap|grep TIME_WAIT|wc -l 9 root@fwolf:~# netstat -nap|grep 124.115|wc -l 464 root@fwolf:~# netstat -nap|grep 124.115.0|wc -l 376 root@fwolf:~# netstat -nap|grep 124.115.4|wc -l 93 

此时服务器访问稍慢,有时会超时,但起以前动不动内存不足,httpd挂掉要好一些了。查了一下,这个IP地址属于"陕西省西安市 电信",地址总换,但基本都在上面两个网段之内。

再后来,访问量降下来之后,系统就恢复正常了,优化应该还是对服务器速度有一些作用的。

root@fwolf:~# netstat -nap|grep :80|wc -l; netstat -nap|grep TIME_WAIT|wc -l 69 47 

最后贴两张后台流量图表,异常大概开始于18号下午16点,导致18号流量剧增。服务器时间是西8区,所以小时图表中的0点就是16点。按天的那个图表不知为什么出不来,不过注意18号的流量只是前9个小时的就是了。

Free Image Hosting at www.ImageShack.us

Free Image Hosting at www.ImageShack.us

另外,合租的兄弟们,现在新的dv主机默认是PHP 5.2了,咱们啥时候升级呢?

参考

Source: http://www.fwolf.com/blog/post/383

为了Linux,BT可别没喽

看标题,Linux怎么能和BT扯上关系呢?并非因为这两个都是开源东东,而是,对日常拿linux作为桌面系统的使用者来说,BT真是越来越重要了。。。为什么捏?

现在用Linux免不了上网,上网就免不了下载东西,传统的下载无外呼http或者ftp方式,这两种方式基本上用wget都能搞定,除非文件比较大,而比较大的文件提供的更多下载方式是BT,包括我们喜爱的各种电影,应该说现在下载电影的主要方式就是BT了。所幸,Linux下的BT软件还是非常丰富的,那我们还担心什么呢?

说实话,我担心的是迅雷、脱兔之类的软件,今天在神话论坛下载电影的时候就发现,下载的链接是这样的:

下载 || 迅雷下载:【www.btmyth.com】先婚后友◎BT神话论坛◎神话.torrent (42.62 KB) 

只有前面两个字"下载"点击是BT的种子,后面包括名称的一长串链接都是迅雷的下载链接,作为BT用户有一种"失落"感。还有很多软件下载站,提供的http或ftp下载链接根本不能用,然后再给一个迅雷的下载链接,简直就是逼良为娼,好在我很少上这种下载站。

迅雷、脱兔在国内占有很大市场,很多人也都喜欢用,在这里我不评论他们的好歹,但我知道他们都没有linux版,所以作为linux桌面用户,下载我还是只能用BT。至于emule/amule,一般下载站很少提供这样的链接,不讨论了,和BT性质类似,反正用mldonkey也都支持。

对了,现在还有个新出的什么scm烂格式,别说不兼容linux了,在windows下也不稳定,还没法转码,比avchd还难搞定。

假如没有了BT,大家都只提供迅雷或脱兔的下载链接,电影都是scm格式,Linux用户怎么办?像qq一样放弃么?

Source: http://www.fwolf.com/blog/post/382

Ô-oku/大奥

不得不承认,这部影片对于不太熟悉那段日本历史的我来说,有些拖沓,虽然在神话的介绍里说明了是"日本06古装真实历史丑闻大片",看完之后对丑闻还真没什么感觉,但还是有很多看点的,故事性上评C的话,制作工艺上就要给A-的成绩了。

画风很好,优美得像日式的漫画,片中角色也都像在作慢动作,随时都可以停下来成为一幅照片,加上女美男俊,甚是养眼。

伎不是妓,很讲究"技"的,和中国以前一样,女人地位低下,是不能参与戏曲表演这种"高尚"行为的,戏中的女人仍然要让男人来扮演。不过片中那么多疯狂的女观众实在出乎我的意料,不知道是史实还是改编,中国古代定然是不会有的啦。

从古至今,宫廷都是人心最险恶之处,尤以后宫为甚(这一点现代社会好多了),万恶的封建社会哦。

天英院老大自己也不干净,还有很多人也是有贼心无贼胆,往好了想也许是日本战国时代男人比较稀缺的自然产物,往坏了想也许是编剧加入了更多的现代社会的意识形态。

绘岛工作的时候要比谈对象的时候漂亮,真的。(涂老鸦甚至还会联想到"不纯洁了。。。" XD)

和服很漂亮,男士的服装(也叫和服么?)也不错,并且,从后面看显得男人上身很宽大、魁梧,真是比唐朝的大宽袖子好看多了。

将军的每个家臣衣服上的"标识"好像都不一样啊,太阁立志传什么的我是外行,这个。。。正常么?

所有的人都是白袜子,看来日本空气真的很好,地板擦得也干净,也没有人汗脚、臭脚,搁现在的中国北方还没出门估计就得换袜子了。

最搞笑的是轿子啊,那么矮,难道他们都不会把抬杠放在轿箱腰部么?

最让人着急的就是女士们上台阶,还是想不通,和服在脖子后面舍得空那么大一块,怎么在脚下就不会开个分叉呢,像旗袍那样。

日本人真的很勤劳,戏院里倒茶的都是一路小跑。

有机会真想看一场原味的日本戏曲,那个戏台也很讲究哦,后面布景的更换,前面还是个歪T字布局。

Source: http://www.fwolf.com/blog/post/381