2009年10月26日星期一

可恶,被 PHP-Mcrypt 的官方 Example 误导了

在看 php 的 mcrypt 加密,想使用对称算法,解决小块内容(比如 url、post)网上传输的安全性。即加密、解密用同一个密码。官方文档有个非常完整的演示功能的例子,大概顺序是:

  • 打开 module
  • 生成 IV
  • 得到 key/密钥/密码
  • 初始化(引擎?)
  • 进行加密操作
  • 关闭(引擎?)
  • 重新初始化(引擎?)
  • 进行解密操作
  • 关闭(引擎?)
  • 关闭 module

加密、解密放在了一个代码片段中,大概是想说,加、解密就那一句代码不同而已。

按照这个理解,为了使用方便,我把加、解密分解成了2个函数,内容都和例子差不多,不会有错。但一运行,不管用哪种加密算法,都会出现奇怪的解密后与原文不一致的错误。还不是完全不一致,后面大半段内容都是正确的,比如原文是包含 a-z 26个字母的字符串,运行结果如下:

$ ./mcrypt.php  Encrypt: M~<5¶¤Jw^TÝ×. ÃV¯ Decrypt: Âò¹ÁIijklmnopqrstuvwxyz 

好一通找原因,最后在支持算法列表页面中找到这么一句:The IV must be unique and must be the same when decrypting/encrypting.加、解密时所使用的 IV 必须相同。

昏,例子代码中 IV 是使用随机数生成的,分成2个函数之后,加、解密操作生成的 IV 肯定不一样,这就是解密失败的原因。mcrypt_create_iv() 函数文档页面的 user notes 中有位 Chris 还对 IV 纠正了一些错误观点。

综上,正确解密需要将 IV 与密文一同存储、传递。而我的需求比较简单,就没有必要这么作,反正 IV 也不需要保密,所以直接用 key 的 sha1 值的片断,比如前8位(与 git 版本号简写类似)作为 IV,对安全性影响不大,应该是可以接受的。

问题解决,收工,有和我一样吃过亏的同学么?

Tags: , , , , ,

Related posts

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


2009年9月28日星期一

Flash 无法修改设置的问题

Adobe flash player settings

这个怪怪的问题也不是一天两天了,就是 flash 设置窗口,或者当 flash 游戏需要使用本地存储空间时,自动弹出的设置窗口,这个窗口无法用鼠标点击,用键盘 TAB 键能在各部分之间游荡但还是无法调整设置,基本上就卡死在这里了。

遇到这种情况,可以访问这个链接:http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager07.html,注意链接中并不是图片,而是实际的设置调整组件。比如刚才说的访问本地资源需要确认的问题,在这里设置成Never Ask Again,同网站的资源就再也不会弹出窗口导致 flash 卡死了。

Ubuntu 9.04, Firefox 3.0.13, Flash Player 10.0 r32.

参考:

Tags: , ,

Related posts

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


2009年8月18日星期二

压缩网页图片

不压不知道,一压下一条,大部分图片几乎都能在近似无损的情况下压缩到 65% 原始大小左右,如果指明有损压缩,比如 jpeg 的 85 %,还能更小。

Smush.it

smushit 现在已经属于 Yslow 的一部分了,可以通过 firefox 插件使用,也能在线用,缺点就是你的图片必须能够从公网访问。

可以压缩各种图片,按照官方的解释,它会尝试各种工具和算法,找到最优的方式。因此,smushit 是一种很安全的压缩工具,几乎看不到差别,就是用起来麻烦些。

imagemagick

不同的图片格式有各自的特点,比如 gif 善于存储颜色较少的图片,也是动画图片的首选;png 善于存储能够矢量化的图片,jpg 则善于存储颜色、图片变化都比较多的图片。根据不同的图片特点,进行类型转换,有时能收到不错的效果。

图片 convert 之后,还可以利用其它工具进一步压缩,不过效果不大了。

另附一个转换图片类型之后,批量替换模板中调用文件名的脚本:

grep logo.gif * -R | awk '{print $1}' | sed 's/://' | xargs -I '{}' sed -i 's/logo.gif/logo.jpg/' '{}'

jpegoptim

这是今天刚发现的好东西,ubuntu 源中有,主要可以用它去除 jpg 图片文件当中的 comment exif IPTC 等无用标记,我测试的情况压缩率比 smushit 略低一点点。由于能够通过命令行使用,所以易用性更强。

一般我喜欢用 --strip-all 参数去除所有无用内容,实际压缩之前可以用 -n 参数预测一下压缩率(默认直接压缩覆盖源文件了),24bit Adobe 类型的图片基本上都能够压缩到 65% 原始大小,碰到 24bit JFIF 这种类型的图片一般压不动,但带上有损压缩参数比如 -m85之后,依然能够达到较理想的压缩率,并且图片损失效果不明显。

遇到无法压缩的图片、压缩后体积反而增大的图片会自动跳过,很贴心。

基本上,有了上面三种方式,就能够处理大部分网页图片了。

Tags: , , , , , , ,

Related posts

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


2009年8月4日星期二

[Git]初学者注意事项

实在是受不了有些人的 Git 提交,费大力气"回滚",遂整理了这些刚开始用 git 或者还没有建立 scm 概念时容易犯的错误。

和源码无关的东西,尽量不要进仓库

不得不说一些图形化软件,在提交内容的时候大多提供一个"全选"或者"Select All"功能,这是最不好的了,一些懒惰的同志看都不看就连瓢带碗都提交了。

  • 测试时上传的文件,测试时的临时文件,统统不要
  • 对应上一条,强烈建议把所有文件的上传保存目录另行设置,放到源代码目录以外
  • 编辑器产生的备份文件、临时文件,编译时的中间文件,统统不要
  • 对应上一条,有个例外就是为了实现通过 Git 更新系统,.NET 的 bin 文件要进仓库,导致那个仓库现在都 100+m 了
  • 图片等资源文件,进仓库也可以,但应当使用有意义的文件名,便于后期管理
  • 对应上一条,现在设计网站界面喜欢先作图然后切割,产生一大堆 001_r5_c1.jpg 这样的文件,讨厌之极
  • 使用的外部类库,比如 php 类、js 类等,统统扔到源码目录以外,如果实在没办法要放在目录树中,也可以留出空目录,打包发行的时候再包含进来,依然不进代码仓库
  • 不要中文文件名,主要是跨平台使用有问题,文件名完全能够只用字母数字减号下划线

尽量采用相对小、相对独立的提交

Git 是作什么用的?Git 不是代码上传工具,也不是网站更新工具,而是软件开发过程的记录工具,为了更加准确的定位每个问题、每个功能修改,就需要在每完成一部分可以称得上是"一项"的工作时,就 commit 一次。哪怕只是修改了一两行,只要产生了必要的功能改变,就有价值记录。

当采用代码审核机制或者需要用邮件提交补丁时,较小的提交能够更有效、更容易、更准确的被检查和审核,这个在 linux kernel 开发文档中也有提到。

当然不能矫枉过正,必须有可记录的改变才有提交的价值。对应的,Git 日志大多数情况下主要显示第一行,控制每次提交都能用一句话简单概括,也是有必要的。

注释格式

格式属于个人习惯和团队规范范围,有必要采用相对统一的风格。

Git 本身不允许空注释,同时建议注释的第一行写简要说明,下面留一行空行,再写详细说明。

我的个人习惯,喜欢在每条注释前面用大约三个字母来表示本次修改的性质:

  • Add something
  • Bug [fix|found]: describe the bug or fix.
  • Chg something
  • Del something
  • Enh some treatment
  • New something
  • Tmp for some cause

为了保持语法通顺,也可以采用前三个字母后面加冒号,后面有啥写啥的方法。

最后,我觉得,能够遵守行业规范和团队约定,主动养成良好习惯,应当是鉴别人才的一项重要因素。

Tags: , , , ,

Related posts

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


2009年8月2日星期日

Windows安全更新KB951748可能导致dns无法解析

很久没有鼓捣 windows 了,今天帮一个朋友修复他"不能上网"的问题,遇到了,记录于此。

首先遇到的是局域网 ip 设置问题,居然自己无法 ping 出去,别人却能 ping 通自己,怀疑是网络管理员作了什么设定,更改ip设置绕过。

然后就是 windows 里 dns 的怪问题了,具体表现为:用 nslookup 能够正常解析域名,直接 ping 域名却得到域名无法解析的错误。用 ip 地址可以直接打开网站,可输入域名却由于无法解析而打不开。

怀疑是 winsock 或者 lsp 的问题,尝试修复却未发现任何问题。

最终原因就是这个 windows 安全更新 KB951748,网上的说法是:

这个问题是microsoft把dns解析的本地端口改成了49152-65535,和visita一样(所以visita系统不受影响)。对于lns等 rules based firewall,只需要把dns rule的本地端口范围改成49152-65535就ok了(xp系统缺省是1024-5000)。

卸载之,一切恢复正常。

Tags: , ,

Related posts

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

2009年7月4日星期六

Curl奇怪的403错误

自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果设置为不使用proxy则都能正常访问。

难道google baidu就不让用proxy连接么?显然不可能,所以打开curl的信息输出(curl_setopt($this->mSh, CURLOPT_VERBOSE, 1);)看看,得到以下结果:

*   Trying 127.0.0.1... * connected * Connected to 127.0.0.1 (127.0.0.1) port 8118 (#0) * Establish HTTP proxy tunnel to www.baidu.com:80 > CONNECT www.baidu.com:80 HTTP/1.0 Host: www.baidu.com:80 User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) Proxy-Connection: Keep-Alive  < HTTP/1.0 403 Connection not allowable < X-Hint: If you read this message interactively, then you know why this happens ,-) <  * The requested URL returned error: 403 * Received HTTP code 403 from proxy after CONNECT * Closing connection #0 ... Failed. 

可以看到proxy服务器工作正常,的确是baidu返回了403错误,但原因肯定还在我这边。终于,从网上(1of2, 2of2)得到了点启发──我使用的是proxytunnel而非proxy。

在代码中,有这么一句:

	curl_setopt($this->mSh, CURLOPT_HTTPPROXYTUNNEL, true); 	curl_setopt($this->mSh, CURLOPT_PROXY, $phost);

php文档中没有详细说明,不过man curl中有详细解释,两者都是代理,proxytunnel(-p参数)允许其他协议通过http代理传输,而proxy(-x参数)则只能走http协议。所以我猜测,google baidu的服务器和curl的proxytunnel不和,所以返回403。

禁用掉上面2行代码的第一句后,curl访问恢复正常。

比较奇怪的是,几种操作系统下还不一样,一台MAC OSX就要显式的禁用proxytunnel才可以,curl版本:

$ curl --version curl 7.16.3 (powerpc-apple-darwin9.0) libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 Protocols: tftp ftp telnet dict ldap http file https ftps  Features: GSS-Negotiate IPv6 Largefile NTLM SSL libz  

而另外一台ubuntu则完全不受影响,怎么都能用,curl版本:

$ curl --version curl 7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.10 Protocols: tftp ftp telnet dict ldap ldaps http file https ftps  Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz  

MT主机上的centos也没事,curl版本:

$ curl --version curl 7.15.5 (i686-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5 Protocols: tftp ftp telnet dict ldap http file https ftps  Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz  

看来不完全是curl版本问题,MAC OSX的确与众不同啊。

还有一个原因也会导致curl返回403错误,如果设置了:

	curl_setopt($ch, CURLOPT_NOBODY, true);

则需要紧跟着设置:

	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

不然会因为http服务器不允许 HEAD 命令而返回403错误。参考:Trouble with a cURL request in PHP。MAC OSX上curl之所以特殊,也不排除是这种原因吧。

Tags: , , , , , ,

Related posts

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

配置安全的共享web服务器(抛砖引玉)

本文所讲的共享web服务器,并非共享文件的服务器,而是多人一起使用的web服务器,各有各自的网站、管理自己的文件,互不干涉,且对系统无影响。鉴于功力较浅,只敢对较信得过的朋友开放这种账号,本文涉及的范围也有限,所以安全漏洞可能还有,请诸位切勿直接用于生产环境。

服务器环境:Ubuntu 8.10, OpenSSH_5.1p1 Debian-3ubuntu1, Apache 2.2.9, PHP 5.2.6-2ubuntu4

登录 - SFTP

传统的 FTP 肯定是不如这个安全,telnet 更不用说了。使用 SFTP 还有一个起始想法是想配置证书自动登录,后来发现 SFTP 客户端(FileZilla)没这功能,就没再作下去,命令行下 scp 的自动登录倒是 和 ssh 的一样很好配置。

网上很多文章介绍把 sftp 用户限制在 $HOME 目录下的方法,使用的是 sshd 的 ChrootGroups 选项,这个选项在我的版本里没有找到,找到另外一篇参考文章使用的是 ChrootDirectory,也很好用。

创建一个用户组,作为所有 sftp 用户的用户组:

$ sudo groupadd sftp 

创建用户,设置密码,并归入 sftp 组:

$ sudo useradd -m friend $ sudo passwd friend $ sudo usermod -g sftp friend 

为了进一步增强安全性,还可以将用户的登录 shell 设置为 /bin/false,是个好习惯,但在本例中并非必须,下面的 sshd 设置也会让用户无法登录 shell (我观察的结果)。

$ sudo usermod -s /bin/false friend 

下来就要配置 sshd 了,编辑配置文件 /etc/ssh/sshd_config

# 修改下面这句 #Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp 

然后在此配置文件末尾添加:

Match group sftp     X11Forwarding no     ChrootDirectory %h     AllowTcpForwarding no     ForceCommand internal-sftp 

配置含义大概为:凡是 sftp 组的用户,关闭 X 转发,chroot 到 $HOME 目录,关闭 TCP 转发(无法使用隧道了?),强制使用 internal-sftp(这个不明白)。

现在,重启 ssh 服务,用户就只能通过 sftp 访问 /home/friend 下的文件了。

PS: 我发现 sshd 如果配置错误,在 restart 服务的时候会先检查,而不是直接 stop 服务然后在 start 的时候出现错误,搞得服务启不来。大概是考虑到很多人都是远程 ssh 上来进行维护,服务 down 了以后就麻烦了,很贴心的设置。

Apache & PHP

Apache 配置简单,创建 /home/friend/www 目录,约定网站文件都放在这个目录下,然后弄个 Alias 指向就可以了。

但有一个极大的安全隐患需要堵上,用户可以通过编写 PHP 程序,读取系统中任何 www-data 用户有权限访问的文件,包括系统的 shadow 文件,包括 其它用户的网站文件等等。解决这个问题,一种是开启 PHP 的 safe_mode ,安全模式下 PHP 将只能访问 owner 为自己(也就是 www-data)的文件;另外一种是使用 open_basedir,这将限制 PHP 只能打开某一目录树下的文件,并且不可能通过符号链接避开此限制。显然 safe_mode 的副作用太多,后一种方法更适合我的这种情况,配置写到 Apache 的 conf 里就行了:

<Directory /home/friend>     php_admin_value open_basedir "/home/friend/" </Directory> 

注意open_basedir 后面的参数只代表文件路径的前缀,所以要带上末尾的斜杠,明确指出是目录。

不使用 safe_mode 的另外一个原因是在未来的 PHP6 里就要删掉它了。

缺点

最大的缺点就是 sftp 用户无法自己更改密码,除非自己写个守护程序啥的。这个程序在写的时候要非常小心,因为操作的是系统用户文件,如果遗留有安全漏洞可能会使别人获得其它用户权限。一个折中的方法是写个程序,定期更改密码并通过邮件告知用户,虽不方便但安全性要好一些。

Tags: , , , , ,

Related posts

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

2009年5月18日星期一

Ubuntu升级到9.04 Jaunty的变化和遇到的问题

  • 长按键盘自动连续击键的间隔缩短了。
  • 显卡驱动没有问题,终于能够摆脱8.10里像涂了墨水一样的中文字乱码了。
  • Firefox的速度好像也快了不少,或许也是显卡驱动的原因?
  • Fluxbox apps文件中Position设置LOWERLEFT/BOTTOMLEFT原来时从屏幕最下方算间距,现在时从工具栏上方开始算,所以原来的值要减去工具栏的高度(25)。
  • 消失很久的启动时的Splash屏又回来了,不过是Xubuntu的小老鼠(我用的WM是Fluxbox),想取消的话,删掉usplash及其相关的包即可。

如果在没有正式发布的时候就升级了,每天的更新比正式发布后要多得多,每天都要下载一大堆包升级,得考虑好,当然你也可以忍着不频繁升级。

Fluxbox任务栏上当前聚焦的窗口和其他窗口的风格是一样的,区分不开了,更换任何styles都无效。

Firefox窗口的标题栏里中文字显示为方块

先这个是Gnome的问题,所有窗口标题栏中包含中文时都是方块,而Fluxbox工具栏上是能够正确显示中文的。尝试更换不同的fluxbox styles发现menu.title.font设置为dejavu字体时窗口标题栏就能正常显示中文了,其他的窗口内容、网页中文全部显示正常。

终于让我找到原因了,又是一个哭笑不得的问题,在我自定义风格里,使用了dejavusans这个字体,而这个字体现在好像在系统中找不到了,因此它就像出错后就不再往下执行了一样,导致后面overlay里定义的新字体也不生效,窗口栏上的中文就成方块了。换其他style之所以能正常显示窗口标题栏上的中文,是因为他们没用dejavusans这个字体。最后的解决方案,把这个自定义style里的dejavusans替换成dejavu -_-!

字体大小dpi优化

字体DPI设置会根据显示器进行优化,而不再局限于默认的96DPI,还可以在System → Preferences → Appearance → Fonts → Details里自行定义。原来是在.Xresources里设置的Xft.dpi:96,不知道还有用没。目前发现的问题是窗口标题栏中的文字比以前大了一些。

我的Fluxbox还遇到了一个问题,屏幕尺寸、位置计算出现了错误,原先我是/etc/gdm/Init/Default中用xrandr -s 1024x768强制重设分辨率,现在把这行禁用后发现桌面的"尺寸"比1024大,鼠标移动到屏幕边缘后会自动移动,但显示不全。

	$ xdpyinfo |grep resolution 	  resolution:    78x78 dots per inch

78是显示器真正的dpi数,但按这个设置又显得字太小了。最后,把xorg.conf里大于1024的分辨率都删掉,这样就可以去掉上面xrandr那句了,显示也正常了,dpi仍然用的是96。

上某些网站中文字模糊(像粗体字那样的模糊)

打开/etc/fonts/conf.d/44-wqy-zenhei.conf,找到下面这行:

	<edit name="antialias" mode="assign"><bool>true</bool></edit>

把true改成false后重启X即可。

Ctrl+Alt+Backspace关闭X的组合键被禁用了

编辑/etc/X11/xorg.conf,在最后加上:

	Section "ServerFlags" 		Option "DontZap" "no" 	EndSection
Tags: , , , , ,

Related posts

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

Mysql升级到5.1后库升级失败的问题

一台 mysql 5.0 服务器,升级到 5.1 后,发现原来有个 database 名字变成了 #mysql50#t-2008-zbb ,刚开始没在意想直接 RENAME DATABASE ,结果这个语法由于过渡危险已经取消了,改用ALTER DATABASE db_name UPGRADE DATA DIRECTORY NAME,结果执行错误:

mysql> ALTER DATABASE `#mysql50#db_name` UPGRADE DATA DIRECTORY NAME; ERROR 1450 (HY000): Changing schema from '#mysql50#db_name' to 'db_name' is not allowed. 

原来这里面还有个 BUG ,刚刚修正过来,发行版中肯定还没有呢。幸好,从中得到了提示,因为 View 的存在导致库无法升级的,删掉所有视图后 UPGRADE 成功:

mysql> ALTER DATABASE `#mysql50#db_name` UPGRADE DATA DIRECTORY NAME; Query OK, 0 rows affected (0.08 sec) 

这台服务器还作了双向同步,我还得手工重置同步状态,又是麻烦一连串儿的事情,幸亏这次操作的是测试服务器,下次升级正式服务器之前,记得先把所有 View 删掉,升级完成后再重新创建。

另外 RENAME DATABASE 实在是危险,我执行过程中出错终止了,结果一部分表在新库里、一部分表在旧库中,不小心把未转完的目标库删掉了(不然后面的正常 ALTER DATABASE 无法继续),结果就丢失了这些表的数据。

Tags: , , , ,

Related posts

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


2009年4月23日星期四

小巧的编辑器Geany

我对PHP编辑器的要求不高,不过很多软件却不合我意:

首先,最好是免费的,所以挺好用的Zend Studio落选了。并且我发现似乎Zend Studio与ibus或者ubuntu jaunty有点冲突,有时候中文就出不来了。

其次,小巧,java的最好不要,所以Eclipse也落选了。

最后,最小功能集:语法高亮(废话)以及类函数列表(可以帮助我快速定位)。就这两项功能,淘汰了gedit(支持得不好)、vim(无法列出类函数)等工具。

当然,隐含要求,支持中文输入法,所以gphpedit也不能用,正好也不喜欢它的颜色高亮模式(色彩搭配)。

所以,选来选去,今天才算碰到一个比较满意的────Geany,ubuntu源中有,目前版本0.14,看来开发历史并不长。使用gtk2,操作流畅。除了类函数列表以外,还有一些贴心的小功能,比如自动补齐文件末尾的空行、保存时自动删除行尾空格等。

geany screenshot

默认的,Geany的快捷键Complete Word与中文输入法冲突,还好,可以通过设置删掉:双击-->Del-->回车

geany-solve-conflict-with-input-method

可怜的gphpedit也是这种快捷键冲突,不过我没找到设置方法。

其实Geany不仅能够处理PHP文件,还能够编辑多种脚本文件,新建文件时有内置模板可选,能够自动生成文件头的copyright及GPL声明。

总之,到目前的感觉,挺好用的。

Tags: , , ,

Related posts

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

2009年4月12日星期日

控制ThinkPad的风扇

 Link    

我的旧本子X31风扇很久都不转了,今天查了点资料,搞了搞,感觉状态上好,记录如下:

首先要能了解当前温度和风扇转速,安装lm-sensors包就能用了:

$ sensors acpitz-virtual-0 Adapter: Virtual device temp1:       +42.0°C  (crit = +91.0°C)                    thinkpad-isa-0000 Adapter: ISA adapter fan1:       3614 RPM temp1:       +42.0°C                                     temp2:       +48.0°C                                     temp3:       +48.0°C                                     temp4:       +42.0°C                                     temp5:       +32.0°C                                     ERROR: Can't get value of subfeature temp6_input: Can't read temp6:        +0.0°C                                     temp7:       +29.0°C                                     ERROR: Can't get value of subfeature temp8_input: Can't read temp8:        +0.0°C       

按说lm-sensors也能控制风扇的,但对我的本子不适用。

然后就是在内核中挂载ThinkPad的高级电源控制模块,在/etc/modprobe.d/options里添加这么一句,后面的参数fan_control很重要:

options thinkpad_acpi fan_control=1 

重启,或者手工重新挂载模块:

rmmod thinkpad_acpi modprobe thinkpad_acpi 

好了,控制风扇转速,最基本的方法是(如无意外,本文中的大部分命令都要用root用户操作):

echo level [level] > /proc/acpi/ibm/fan 

[level]的取值可以是0-7之间的数字,或者auto,或者disengaged/full-speed,在不同的本子上会有不同的效果,总体来说数字越大转速越高,auto是系统自动判断,但在我的本子上却是不转,disengaged/full-speed是全速。我自己用的本子,设为4左右就能达到温度和噪音的平衡点。

还有人在这个基础上写了一些小工具,比如tp-fancontrol或者ThinkPad Fan Control,主要功能都是定时探测温度,然后安装预先的设定来控制风扇的转速。但由于不同硬件的差异,他们并不适用于所有情况,比如我的X31装上哪一个风扇都是auto不转,只好手工echo然后让风扇常转了。智能一点的,还可以借助cron来个定时开关、定时检测什么的。

参考

Tags: , , , , ,

Related posts

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

2009年3月29日星期日

/bin/sh: root: not found

root用户经常收到这样的错误邮件:

  From: Cron Daemon <root>   To: root   Subject: Cron <root@fwolf> root /home/fwolf/bin/cmd_run_in_crontab   X-Cron-Env: <SHELL=/bin/sh>   X-Cron-Env: <PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin>   X-Cron-Env: <HOME=/root>   X-Cron-Env: <LOGNAME=root>     /bin/sh: root: not found    

这个问题很简单,但也容易让人糊涂,先说原因吧, /etc/crontab 中格式是这样的:

  17 * * * * root cd / && run-parts --report /etc/cron.hourly    

root# crontab -e 出来的应该是这样:

  17 * * * * cd / && run-parts --report /etc/cron.hourly    

注意, /etc/crontab 是针对整个系统的,所以第6列是用户名, root# crontab -e 是root用户的,所以第6列就直接是命令了。

这有什么好糊涂的呢,因为这两个文件很可能会一模一样,我就是这样,后来才发现他们的不同,不信用 root# crontab -e 修改些内容再和 /etc/crontab 对比就知道了。

现在, /bin/sh: root: not found 这个错误不用我再解释了吧?直接拷贝crontab到root的后遗症。

Tags: , , ,

Related posts

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

2009年3月26日星期四

VirtualBox的VRDP运行模式

其实没什么深奥的,所谓VRDP运行模式,就是虚拟机运行的时候,没有图形窗口,但可以用VirtualBox的RDP模式远程管理,说是远程其实在本机上用很方便,用起来和windows下的远程桌面一样。如果虚拟机上安装了vncserver之类的远程控制软件,并且从主机上能够通过tcp访问,也一样可以管理的。

我使用的是非开源的VirtualBox,开源版本少一些功能。以下操作在windows下也是可以参照使用的。

启动VM的命令:/usr/bin/VBoxManage startvm WinXP -type vrdp,默认是-type gui即以图形界面启动虚拟机。

控制VM比如保存状态关闭的命令:/usr/bin/VBoxManage controlvm WinXP savestate

以上命令中WinXP是虚拟机的名称,也可以用uuid替代。

开启VRDP后远程控制端口默认是3389,默认认证方式是null,即无认证,任何人都可以连接上随意控制,放在网络环境下是很不安全的。还有一种认证方式是external,可以使用主机上的用户机制来认证,不过使用之前要稍微作一下设置:

cd /lib sudo ln -s libpam.so.0 libpam.so 

不然认证无法进行,连接闪一下就关闭了。远程桌面的客户端在gnome中可以用Terminal Server Client(tsclient)或者rdesktop-vrdp -u fwolf -p - localhost

要想随重启或者关机自动关闭虚拟机,要稍微麻烦一些了,首先在/etc/init.d/下创建一个文件fwolfrc

#! /bin/sh  # Using LSB funtions: . /lib/lsb/init-functions set -e PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="Fwolf's Init" NAME=fwolfrc SCRIPTNAME=/etc/init.d/$NAME  # Function that starts the daemon/service. d_start() {     touch /var/lock/subsys/$NAME     log_daemon_msg "Starting $DESC" "$NAME" }  # Function that stops the daemon/service. d_stop() {     su -c "/usr/bin/VBoxManage controlvm WinXP savestate" fwolf     rm /var/lock/subsys/$NAME }  # Function that sends a SIGHUP to the daemon/service. case "$1" in   start)         d_start     ;;   stop)         d_stop     ;;   *)     log_warning_msg "Usage: $SCRIPTNAME {start|stop}" >&2     exit 3     ;; esac  exit 0 

我也是直接从/etc/init.d/里套过来修改的,详细信息可以看参考文章或者其它关于关机自动执行脚本的资料。然后把这个文件ln为以下几个:

  • /etc/rc0.d/K01fwolfrc
  • /etc/rc6.d/K01fwolfrc
  • /etc/rc3.d/S99fwolfrc
  • /etc/rc5.d/S99fwolfrc

可以看到开机时是最后执行,而关机时是最先执行。注意我上面的脚本里,在开机是并没有自动启动虚拟机,习惯手工开。

参考

Tags: , , , ,

Related posts

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

2009年3月23日星期一

机房搬家过程中的几件趣事

 Link    

都是真事儿,先介绍现象,后面再说搞笑的原因。由于是搬家,目的地场地环境有一些变化,加上现在的机器上灰尘已经攒了好几年的了,所以每台机器都尽量拆开了、逐个零部件清洁,然后再装好开机检查,这一拆一装问题就来了。

  • 一台IBM X3650拆开清理后装好了,接上电,开机没反应,但电源线都正常插着呢。
  • 一台HP LH6000,3个电源模块,需要2条电源线,都接上了,开机,发现转几下后自动停机,有点儿带不动或者自检出错的感觉,怀疑是内存的原因(此机原来出现过类似的内存错误)。
  • 一台HP LH3000,网线接上了交换机,但不亮,系统中也显示"网线已断开",但这条网线测了N遍都是通而且很正常的,换别机器的网线仍然如故。
  • 防火墙内网、外网、SSN/DMZ的网线都接上了,也都通,可怎么配置就是连不上外网,奇怪啊,搬之前还正常用来着,就改了个互联IP的事嘛。

其实啊,这些活儿虽然很辛苦,还真多亏了这些"奇妙"的故障原因,实乃枯燥工作过程中的小小点缀,我下面要说的原因,你都猜到了么?

  • IBM X3650的电源模块的纵切面是长方形的,所以上下颠倒也可以放到槽里,就是卡子卡不紧而已,所以有位哥们儿就顺理成章的上下颠倒的安上了,还抱怨不好卡。我是看到电源上AC灯亮而DC灯不亮发现的,因为电源屁股后面的文字也都是倒的。
  • 虽然两条电源线都正确的接在了电源的屁股后面,但由于众台机器都拆去清洗了,地面上遗留的线缆比较多,所以。。。有一根电源线的另外一头不在插座上。同样是检查电源模块上的灯发现的,可怜之前我们插拔cpu/内存板子和调整内存N遍啊。
  • HP LH3000原先是用光纤与交换机连接的,搬家之后换用铜缆了,当然光纤网卡和铜缆网卡不是一块,最关键的是,以前我们为了不让数据从铜缆走,把接铜缆的网卡禁用了。所以换铜缆之后(此时还未开机或启动进入桌面),这根线也通线序也没问题,但肯定就是不会亮啊。
  • 这个最简单,防火墙和交换机都挨着装在机柜的最上方,而且我们的内网和SSN/DMZ都是连到一个交换机上,联通扯过来的光纤已经被机房管理人员用铜缆跳到了机柜自带交换机(位于机柜最下方)上,离得比较远而且也没有线头再外面露着,所以就用三根短跳线从防火墙接到了我们自带的交换机上,和联通光纤没有任何物理连接,能通才出鬼了。

还有一件我们研究了半天的事情,IBM机架服务器自带滑轨在前方除了有2个圆柱用于对入机架上的方形孔外,前面还有一个向下的小钩子,此时我们已将所有东西都拆了下来运到目的机房准备安装,恰好大家以前接触机架滑轨也少,也巧了机房现有服务器看了个遍滑轨全部都是用螺丝固定的,不像我们这个IBM滑轨只用卡件解决。最致命的是,滑轨前方的小钩比机柜上的方孔要宽,怎么也穿不过去,这样怎么才能把滑轨"钩"在机柜上固定啊?机柜是图腾的,滑轨是IBM的,按说都是符合标准的玩意儿,咋就不"兼容"了呢?研究了半天,一位聪明的小胖子终于发现,通过弹簧把2个圆柱压回去,空出的空间正常卡入机柜竖架,松开手弹簧自然把圆柱弹入机柜竖架上的方孔,这一端就固定完毕。至于那个向下的方形小钩子嘛,是在服务器装上、完全推入滑轨之后,"卡"得一声卡住服务器的,并非是要卡在机柜方孔中。可怜我们怀疑图腾和IBM不兼容老半天,就差打电话到他们公司去问了-_-!。

Tags: , , , , ,

Related posts

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

2009年3月13日星期五

好玩有趣又有用的Mockups

Balsamiq Mockups For Desktop

见过flash游戏中,鼠标画个圆就是球,画个方块就能站住,画条线就能成跑道(这个很经典了,滑雪橇的游戏),也见过一个视频,老师讲课的时候画个斜块、小车、轮子就能够产生物理动作,看到Mockups以后,就也有类似的感觉,不过这个是用来设计软件界面的。

以前设计界面的时候用什么?想过但用的相对比较少,笨办法就是文字描述,左边放什么,右边上面放什么,右边下面放什么等等,高手会用ps画,只要不嫌累,还有画在纸、黑板上的,这些手段都有个共同的缺点────不方便管理和变更。现在不易管理、不可变更的工具用起来太累了,Mockups正是很好的解决了这个问题。

就像上面这张图片一样,在Mockups里,提供了很多用户界面设计元素,拖过来调整、搭配就能形成一张设计示意图,在设计阶段、持续变更阶段应该都是很好的表达工具,毕竟一图胜千言嘛。风格上是手绘的草稿风格,让人感觉和在纸上没区标,估计打印出来蒙人也没问题。技术实现上,依赖Adobe AIR环境,所以也是跨平台的。从图上也能看到,只要选中了菜单里的View -> Use System Fonts,中文支持还是可以的,好像不能选字体,不过够用了。

缺点首先是没有我想像中的"手工画线",毕竟直接画和使用预制物件的感觉和灵活性还是有区别;第二就是速度,2006年买的电脑用起来都不算十分流畅;第三就是技术平台,个人对AIR不感冒,当然这个也没得改了,呵呵。

Tags: , , , ,

Related posts


teamol=WebCollab

Team Online 项目管理系统

如果你曾经在国内某个php源码下载网站下载过一个叫teamol的团队任务分配软件,不知你有没有注意到,它和国外开源项目WebCollab之间似乎有着亲密的联系。

本来我也没注意,可这个teamol下载回来以后安装颇不顺利,文档TeamOL setup.doc和安装界面有不一样的地方,虽然国内开源项目用doc写文档不算奇怪,但这个文档内容也太少了。代码注释中有个"官方网站"http://www.inodea.cn是打不开的,代码中很多地方标的版本号是0.1,可下载时我记得说的出3.0或者3.2版本。

开始安装以后有个地方卡壳了,还没安装数据库,就要从数据库里信息来验证用户是否有权限安装。hack安装之后,path配置也有问题,模板中还有一些错误,比如明明这段函数内没有$title这个变量却多次使用,要知道即使是global $title也是没有值的。

反正歪歪扭扭总算把程序配置得能运转了,开始试试,功能倒还有点让我满意的意思,除了日期选择的弹出窗口我极其不喜欢。然后我就发现了一件让我大跌眼镜的事情,这么一个错误百出或者说有点像半成品的"国产开源"作品,居然不仅有英、中文支持,还有一个看似排版比较成熟的英文帮助页面:

webcollab-help

好奇的我挑了帮助页面中的一句话上G一搜,便找到了WebCollab。仔细比较下来,两者的目录结构也几乎一样:

dir structure of teamol and webcollab

结果应该不用我说了,也或许teamol的作者原想只是以webcollab为蓝本边学习边制作一个全新的系统吧,从注释中的版本0.1和修改过使用frame的页面框架中能够看出作者还是付出了些劳动的。

回到主题,用于小组内工作任务分配跟踪,倒是可以试试WebCollab,界面是简陋了点,基本的内容算是都有了。但这类软件,至今没找到一个特别好用的,包括很多在线的GTD或者项目管理系统。

WebCollab login

Tags: , , ,

Related posts


转换静态图像为视频

需要把100+张大小不一的图片,转换为视频,上网查了些资料,关键词一般用still images或者image sequence,结果用mencoder就能作:

mencoder mf://*.jpg -vf scale=800:600,harddup -ofps 25 -ovc xvid -xvidencopts bitrate=800 -o dbb.avi 

结果出来的影片每秒25帧,也就是切换每秒切换25张图片,120多张一共耗时4秒,没法看。把fps调整为1或者0.1之类的数,mencoder运行就出错。没办法,我想了一笨办法。

按照每秒25帧算,那么如果一张图片想显示2秒,那么就把它复制(用ln更快,别傻傻的cp)2×25=50份,比如001.jpg.001, 001.jpg.002…按照这种方法把图片都整到一个目录中,然后再使用上面那个命令就能够正常转换了。

不过,当图片大小不一的时候,还是会出现错误,比如这个:

VDec: vo config request - 800 x 463 (preferred colorspace: Planar 444P)] VDec: using Planar 444P as output csp (no 0) Movie-Aspect is 1.33:1 - prescaling to correct movie aspect. [CROP] Bad position/width/height - cropped area outside of the original! FATAL: Cannot initialize video driver. 

mencoder转变源尺寸的东西我不熟悉,试了一些参数都不行,刚想放弃,从这里发现有images2mpg这个好东西。

images2mpg是在kipi-plugins这个包里(属于kde桌面下的插件),需要安装imagemagic等包,如果提示:

Can't find ppmtoy4m, please install it or check -M parameter 

这是缺少包mjpegtools,如果提示找不到ogg123,那是缺少包vorbis-tools。images2mpg就是利用这些包完成图片转换、压缩视频等工作的一个脚本。可以这样用:

images2mpg -o mzj.avi -t 4 -d 1 -S 420mpeg2 -M /usr/bin/ -i ???.jpg 
  • -t 4是淡入淡出的效果,4对应的时间消耗在帮助里面,约1秒
  • -d 1是每张图片停留1秒,很遗憾这个参数不能用小数
  • -S 420mpeg2指定mpeg2压缩方式
  • -M /usr/bin/指定mjpegtools的可执行文件位置,不知怎地images2mpg自己不会到/usr/bin下找
  • -i ???.jpg是源文件,必须放在最后

转换结果很贴心,图片自动都按长、短边缩放到了视频大小,空白的地方是黑色,淡入淡出效果也还能接受,就是转换速度有些慢。

有了这个素材,再进行添加声音、分段设置间隔时间等操作就都能够很简单的用mencoder完成了。附上一个视频片段合并,并且引入外部声音的例子:

mencoder -audiofile mzj.mp3 -ovc xvid -xvidencopts bitrate=800 -vf harddup -idx -oac copy -o mzj.avi mzj_1.avi mzj_2.avi 

不过这样声音在播放的时候会重复,如果合并完再加声音就没事了。

Tags: , , ,

Related posts


升级到Ubuntu Intrepid后感觉到的一些变化

第一,一台服务器,双网卡,配置两个ip地址,这两个ip地址同属一个网段,因此网关设置为相同。升级前一切正常,升级后只能让同网段的其它机器ping通,其它网段机器即使防火墙规则允许也ping不通,去掉其中一个ip地址的网关设置后就可以了。

第二是和mysql相关的怪怪的问题,以前mysql设置中都有一项:

innodb_flush_log_at_trx_commit=1 

升级后,一台P4 1.7 256M内存的机器insert数据正常,另外一台IBM x3650 双5160 3.0GHz cpu 4G内存机器的insert却极慢(10条数据要5秒),不光是比以前Feisty慢,比刚才那台P4机器都要慢很多倍。将此项值调整为2以后恢复正常,insert 1000条数据耗时0.25秒左右。P4机器也将此值调整为2后有改进,但不如x3650明显,insert 1000条数据耗时5秒多。

第三,登录后欢迎屏幕里的那个系统信息我很喜欢:

  System information as of Tue Jan  6 23:50:02 CST 2009    System load:    0.0                Memory usage: 77%   Processes:       118   Usage of /home: 19.4% of 24.03GB   Swap usage:   34%   Users logged in: 3 

如果没有出现,把landscape-common这个包装上,并且平时可以用landscape-sysinfo命令调出类似信息。

Update @ 2009-01-13

字体问题又出现了,网上有很多修改文泉驿字体的方法,我则是/etc/fonts/conf.avail44-wqy-zenhei.conf69-language-selector-zh-cn.confWenQuanYi Zen HeiWenQuanYi Bitmap Song前面加上Simsun,字体倒是还是原样(默认宋体),但firefox和其它X程序有时候字体乱成一片,也有说像墨点或者重叠的,反正鼠标选中后就恢复了,有人说是驱动的问题,把nvidia-glx-96换成nvidia-glx-71干脆X就起不来了,其它的173 177 180根本就不支持我的GForce4 MX440。

如果不换Simsun,用网上的方法调整一下文泉驿字体的处理方式,倒是不乱,但字体略显模糊,还能接受。但其它X程序依然有时文字是乱的。查到可能是显卡驱动的问题,只能等待了?

另外注意一点,nvidia-glx-??安装后必须重启系统,只重启X是不起作用的。

Update @ 2009-01-16

旧IBM本本,raedon9000的显卡,fglrx不支持,所以卸掉xorg-driver-fglrx后X能起来了,但登录界面无法输入,并且小红点失效,reinstall xserver-xorg-vesa后dpkg-reconfigure xserver-xorg后好了。总体来说反而比N卡好配。

Update @ 2009-02-08

如果安装nvidia显卡驱动时出现这样的错误:

  dpkg-divert: `diversion of /usr/lib/xorg/modules/extensions/libGLcore.so to /usr/lib/nvidia/libGLcore.so.xlibmesa by nvidia-glx-96' clashes with `diversion of /usr/lib/xorg/modules/extensions/libGLcore.so to /usr/lib/nvidia/libGLcore.so.xlibmesa by nvidia-glx-71'   dpkg: error processing /var/cache/apt/archives/nvidia-glx-96_96.43.09-0ubuntu1.1_i386.deb (--unpack):    subprocess pre-installation script returned error exit status 2   Errors were encountered while processing:    /var/cache/apt/archives/nvidia-glx-96_96.43.09-0ubuntu1.1_i386.deb   E: Sub-process /usr/bin/dpkg returned an error code (1) 

可以试着用dpkg-divert --list|grep GL找到libGLcore.so相关的内容,可能会定义到另外一个包里了:

$ dpkg-divert --list|grep GL diversion of /usr/lib/xorg/modules/extensions/libGLcore.so to /usr/lib/nvidia/libGLcore.so.xlibmesa by nvidia-glx-71 diversion of /usr/lib/libGL.so.1 to /usr/lib/nvidia/libGL.so.1.xlibmesa by nvidia-glx-96 diversion of /usr/lib/libGL.so.1.2 to /usr/lib/nvidia/libGL.so.1.2.xlibmesa by nvidia-glx-96 

可以看出是nvidia-glx-71没删干净,在这里手工清除就可以了:

$ sudo dpkg-divert --remove /usr/lib/xorg/modules/extensions/libGLcore.so Removing `diversion of /usr/lib/xorg/modules/extensions/libGLcore.so to /usr/lib/nvidia/libGLcore.so.xlibmesa by nvidia-glx-71' 

Update @ 2009-02-09

ati的驱动也出问题了,rv3??核心的显卡全不支持,比如我的Radeon X600,暂时只能删掉fglrx,用其它的驱动替代。删除xorg-driver-fglrx相关的包,装上xserver-xorg-video-ati,然后sudo dpkg-reconfigure xserver-xorg,生成了一个极小的xorg.conf,图形就有了,但据说3D性能几乎没有,办公用没啥大事。

Section "Device"     Identifier  "Configured Video Device"     Option      "UseFBDev"      "true" EndSection  Section "Monitor"     Identifier  "Configured Monitor" EndSection  Section "Screen"     Identifier  "Default Screen"     Monitor     "Configured Monitor"     Device      "Configured Video Device" EndSection 

Firefox工具栏的自定义设置总是丢失的问题原因也找到了,可以暂时禁用TabMixPlus扩展,或者是禁用Ubuntu Firefox Modifications,我选择后者。

字体也有一点小问题,比如方正小标宋的"黑体"效果就没有了,重新刷新一下fc-cache -fv就好了。

Tags: , , , , , , , , , , , ,

Related posts