VirtualBox的网络桥接

不知道什么时候开始,在Linux版的VirtualBox的网络设置中可以直接将虚拟机的网络连接方式设置成桥接方式了,省去了手动配置的麻烦,很不错的改进。

有图有真相

只是不知道这个改进是什么时候加进去的,我现在用的版本是2.2.2。

在debian中安装ibus

对ibus这个输入法引擎早有耳闻,一直想试试,通常尝试新的软件在debian的stable版里面总是一件不怎么方便的事情,好在有ubuntu这样一个“先锋”在,这样一来很多情况下都可以把for ubuntu的二进制包直接用在debian,省去了很多编译的麻烦。
ibus也一样,以lenny为例,如果不想再用scim的可以现卸载掉下列所有scim的安装包,我是连im-switch都卸掉了,因为它是scim依赖装上的,而我有洁癖=_=。。。
im-switch
libscim8c2a
scim
scim-gtk2-immodule
scim-modules-socket
scim-pinyin
之后在这里下载所有的4个deb安装包,其中python_dbus比lenny源里的版本要新一些,也是必须的,安装完毕用普通用户权限执行
ibus-setup
在“输入法引擎”标签页里勾选上“简体中文”下的“拼音”,在“通用”标签页中根据个人习惯勾选“启动桌面时自动启动ibus”和“自动隐藏语言栏”,之后注销重新登录系统,安装就完成了。
这个时候你可能会发现你无法写出“囧”、“㝹”、“鬱”这些少用字(这三个字是我测试字体和输入法的必选字,^_^),其实还需要一项设置,点击ibus浮动工具栏的最右边一个图标

在设置窗口中勾选“大字符集”,这样就大功告成了,这个设置窗口中还有更加丰富的选项可以根据需要自行调整。
使用一段时间之后发现,ibus的响应速度有时会比较慢,毕竟python的效率是不如C的,但是这个基本不会影响到输入操作,但是其丰富的设置,丰富的词库,漂亮的外观,都是scim目前所不及的。

Lenny中字体的困扰

写这篇的时候Lenny还没有发布,一直都在用testing,原因是etch用不了FF3——呃,或许该叫Iceweasel 3。
我不知道该怎么描述这个问题,首先这是一个中文字体显示的问题,现在它出了问题——在某种情形下我看不清所显示的中文,是字体模糊吗?也不是,通常在网上用“模糊”之类的关键字搜索到的结果并不能解决我的问题,可是除了“模糊”,我又找不到其他的词来形容这种情形,如图:

这是一种莫可名状的“模糊”~~

这种情况在刚刚执行了一个命令之后就不存在了:

sudo apt-get remove ttf-arphic-uming ttf-arphic-ukai

这是两个“文鼎”中文字体,我不知道该怎么设置字体的某种“顺序”或者开启/关闭某个特性使之不会把我的字体显示成上面那样子,我觉得,既然它会把字体弄成那样,那么它对我来说也没什么用处了,uming我记得是在安装SCIM和拼音的时候依赖装上的,可是删除的时候却没有提示因为依赖关系而不能删除,debian的高明无处不在,而ukai是怎么装上的我却不清楚,按理说我这么不爱折腾字体的人是不会自己去装自己不知道的字体的,应该是系统默认装上的吧,很多东西都还不懂,路漫漫……

Debian GNU/Linux 4.0(etch)中安装Nvidia显卡官方驱动

是的,用了一年的Ubuntu之后再次回到Debian,不需要像一年前一样列出十条理由,因为喜欢Debian不需要理由:)
促使我重新安装Debian的直接原因,是在一次Ubuntu的例行更新之后,Gnome变得异常缓慢,缓慢到无法使用,而我用的是官方的源,加上之前已经在虚拟机里开始评估Etch了,所以最后毅然决然地装回到Debian,Ubuntu非常不错,精美绝伦,白璧微瑕的是在稳定性上略微差些,而且随着半年一个版本的更新,对硬件的要求也迅速增长起来。
Etch和Sarge比起来改变还是很可观的,最直接的一点就是装完系统不用安装显卡驱动也能看到桌面壁纸了:),而且相比在Sarge上安装显卡驱动的艰难,Etch要容易得多了,不过也许我在Sarge上走了弯路,这也就不得而知了。
我的显卡是老前辈了:Geforce2 MX/MX 400,根据网上一些资料显示,此款显卡应使用1.0-96xx系列驱动,于是整个安装过程就是下面几条命令而已(root权限):
#apt-get install linux-headers-`uname -r` build-essential
#wget http://us.download.nvidia.com/XFree86/Linux-x86/96.43.05/NVIDIA-Linux-x86-96.43.05-pkg1.run
#chmod +x NVIDIA-Linux-x86-96.43.05-pkg1.run
#/etc/init.d/gdm stop
#./NVIDIA-Linux-x86-96.43.05-pkg1.run
然后按照提示一步一步操作即可。

96.43.05版驱动存在一个Bug,在使用wine的过程中会导致有些显卡的机器的X服务重启,尝试更新到最新版本(如:96.43.07),或者使用Project Nouveau开源驱动可能能修复该问题。

去除文泉驿正黑字体中内嵌的点阵信息

文泉驿矢量正黑字体的项目首页上如是说:
“该字体还嵌入了最新版本的文泉驿点阵宋体的中英文点阵,使得屏幕汉字显示清晰锐利,易于阅读。”
安装之后发现该字体显示在13号字体以上时才是正黑,小于等于12号字体时实际使用的是内嵌的点阵宋体,于是一番搜索,找到一个小技巧用来去除字体中的点阵信息:
sudo apt-get install fontforge
新建脚本如下:
#!/usr/bin/fontforge
Open(“wqy-zenhei.ttf”);
Generate(“wqy-zenhei-nobitmap.ttf”);
Close();

保存在wqy-zenhei.ttf同一目录下,文件名为script.sh,执行
fontforge -script script.sh
就可以在当前这个目录下生成一个不包含点阵字体信息的wqy-zenhei-nobitmap.ttf字体文件,相比之前的字体文件,去掉点阵信息之后的字体文件小了2M多。
这个方法的出处可能是这里
另外,文泉驿的所有字体目前好像均未能完整覆盖CJK EXT B的字符集。

在Linux中编译安装两个MySQL

在Linux中只要指定不同的安装路径,不同的数据库路径,不同的配置文件,以及不同的端口和不同的Socket就可以同时安装两个MySQL服务器。
安装第一个MySQL可以用默认的一些编译参数:
./configure –prefix=/usr/local/mysql
make
make install
cp ./support-files/my-medium.cnf /etc/my.cnf
cp ./support-files/mysql.server /etc/mysql.server
chmod +x /etc/mysql.server
……
然后用mysql.server脚本就可以直接控制服务器了,服务器默认使用my.cnf配置文件,运行在3306端口,并使用/tmp/mysql.sock作为Socket。
安装第二个的时候会麻烦一点,编译的时候需要指定不同的安装路径、端口和Socket:
./configure –prefix=/usr/local/mysql5 –with-unix-socket-path=/tmp/mysql5_sock –with-tcp-port=3307
make
make install
cp ./support-files/my-medium.cnf /etc/my5.cnf
……
而且启动和停止可能需要这样的命令:
/usr/local/mysql5/bin/mysqld_safe –defaults-file=/etc/my5.cnf –datadir=/usr/local/mysql5/var/ &
/usr/local/mysql5/bin/mysqladmin –defaults-file=/etc/my5.cnf -uuser -hlocalhost -ppassword shutdown
连接则需要这样:
/usr/local/mysql5/bin/mysql –defaults-file=/etc/my5.cnf -uuser -hlocalhost -ppassword
另外在用PHP连MySQL的时候,使用这样的语句会不成功:
mysql(“localhost:3307″,”user”,”password”);
必须使用这样的形式:
mysql(“localhost:/tmp/mysql5_sock”,”user”,”password”);
也不知道是什么原因!

使用XAJAX库编写的简单的日期级联菜单

<?php
include_once(“./xajax/xajax.inc.php”);
$cal = new xajax();
$cal->registerFunction(show_day);

function show_day($year,$month)
{
$resp = new xajaxResponse();
$days = date(‘t’,mktime(0,0,0,$month,1,$year));
$str = ”;
for($i = 1 ; $i <= $days ; $i++)
$str .= ‘<option value=’ . $i .’>’ . $i . ‘</option>’;

$resp -> addAssign(“day”,”innerHTML”, $str);

return $resp;
}

$cal -> processRequests();
$cal -> printJavascript();

echo ‘<select id=”year” name=”year” onchange=”document.getElementById(‘month’).value = 1,document.getElementById(‘day’).value = 1″>’;
$str = ”;
for($i = 1910 ; $i <= 2007 ; $i++)
$str .= ‘<option value=’ . $i .’>’ . $i . ‘</option>’;
echo $str;
echo ‘</select>&nbsp;年&nbsp;’;

echo ‘<select id=”month” name=”month” onchange=”xajax_show_day(document.getElementById(‘year’).value,document.getElementById(‘month’).value)”>’;
$str = ”;
for($i = 1 ; $i <= 12 ; $i++)
$str .= ‘<option value=’ . $i .’>’ . $i . ‘</option>’;
echo $str;
echo ‘</select>&nbsp;月&nbsp;’;

echo ‘<select id=”day” name=”day”>’;
$str = ‘<option value=”" selected=”selected”>–</option>’;
echo ‘</select>&nbsp;日&nbsp;’;
?>

解决Zend Optimizer的安装问题

安装ZO,在进行到选择PHP配置文件路径的时候,ZO默认到/usr/local/lib目录下去找,而在编译PHP5时,如果没有指定配置文件的路径,默认配置路径是/usr/local/php/lib,导致PHP无法调用ZO,执行“php -v”也看不到关于ZO的任何信息!
解决方法特别简单,安装ZO之前先执行“php -i | grep php.ini”看一下当前配置文件的路径,如果已经在错误的路径安装好配置文件了,那么在正确的路径下做个指向错误路径的链接也可以!

在PHP4中实现的生成验证码图片的类

在PHP4中Zend没有完全引入对OOP的支持,但是已经可以实现一些类的特性了,下面就是我写的生成验证码图片的类,说是类,其实就是用类的形式封装起来的过程,很初级的实现:

<?php
class check_code {
var $img_size_x; //图片大小参数
var $img_size_y;
var $shape; //背景用什么形状做“干扰”
var $shape_num; //“干扰”图形的数量
var $case_sensitive; //是否大小写区分
var $char_str; //返回的验证码值,用于验证

function check_code($pos_x,$pos_y,$bg_shape,$shape_num,$case_sensitive) {
//构造函数,需要提供以上变量的信息
$this->img_size_x = $pos_x;
$this->img_size_y = $pos_y;
$this->shape = $bg_shape;
$this->shape_num = $shape_num;
$this->case_sensitive = $case_sensitive;
$this->char_str = ”;
}

function draw() { //创建并显示图片
$bgim = imagecreate($this->img_size_x,$this->img_size_y);

$gray = imagecolorallocate($bgim,240,240,240);
$black = imagecolorallocate($bgim,0,0,0);

imagerectangle($bgim,0,0,$this->img_size_x-1,$this->img_size_y-1,$black);

for($i = 0; $i < $this->shape_num; $i++)
{
$shape_x = rand(0,$this->img_size_x);
$shape_y = rand(0,$this->img_size_y);
$rand_color = imagecolorallocate($bgim,rand(150,255),rand(150,255),rand(150,255));
imagestring($bgim,2,$shape_x,$shape_y,$this->shape,$rand_color);
}

for($i = 0; $i < 4; $i++)
{
$char = $this->char_gen();
$this->char_str .= $char;
$char_x = rand(10+(int)($this->img_size_x-20)/4*$i,(int)(($this->img_size_x-20)/4)*($i+1));
$char_y = rand(10,(int)($this->img_size_y-10)/2);
imagestring($bgim,5,$char_x,$char_y,$char,$black);
}
if($this->case_sensitive == FALSE)
$this->char_str = strtolower($this->char_str);
//可以将验证的字符串放到cookie或者session
header(“Content-type: image/png”);
imagepng($bgim);
imagedestroy($bgim);
}

function char_gen(){ //创建随机数,包括大小写字母和数字
$type = rand(0,2);
switch($type){
case 0:
return rand(0,9);
break;
case 1:
$char = rand(65,90);
$char = chr($char); //由ascii码转换成字符
return $char;
break;
case 2:
$char = rand(97,122);
$char = chr($char);
return $char;
break;
}
}
}
?>

参考了网上的一些其他类似程序,有些只能生成数字,有的用十六进制生成有限的几个字母,我这个就字符生成这点来看,好像还算是比较完整的。
本段代码需要GD库支持。