星期六, 十二月 16, 2006

将windows文件专为unix格式

通常Unix中文本文件以linefeed (LF) 表示一行结束。而DOS(Windows)文件以一个carriage-return (CR) 和一个 linefeed (LF) 结束一行。因此在linux中要可用用flip将文件在不同文件格式之间转换。另一个命令dos2unix也可以。
$ find /the_paht -type f |xargs flip -u
flip可以的参数m可以将文件从DOS格式转换为UNIX格式。-t参数可以改变一个文件的时间戳。

星期二, 十二月 12, 2006

Emacs23在ubuntu下的安装

Emace23是Emacs的Unicode分支,无法Ubuntu下直接安装。需要从CVS下载。
$ sudo apt-get install ssh texinfo
$ sudo apt-get install libncurses5-dev
$ export CVS_RSH="ssh"
$ cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs co -r emacs-unicode-2 emacs
然后configure,使其可以使用xft字体。
$./configure --prefix=/usr --enable-font-backend --with-gtk --with-xft --with-xpm --with-jpeg --with-tiff --with-png --x-includes=/usr/include/X11 --x-libraries=/usr/lib/X11
如果提示缺少gtk的开发文件,可以安装libgtk2.0-dev,再继续执行上面的命令。
make bootstrap
make info
sudo make install

可以这样来运行Emacs
$ emacs --enable-font-backend --font "Bitstream Vera Sans Mono-10"
或者在用户主目录下的.Xresources文件下加上:
Emacs.FontBackend: xft
Emacs.font: Bitstream Vera Sans Mono-8
在.bashrc里加入
alias emacs="emacs --enable-font-backend"
要用--enable-font-backend调用的原因是Emacs总是在检测Xresources之前调用字体相关的函数。运行:
$ xrdb -merge .Xresources
$ bash

需要说明的是,保留--enable-font-backend参数的原因是开发者对一些遗留的字体处理代码的移除还没有完成。很多用户也有意见,为什么不将--enable-font-backend作为缺省的参数。Kenichi Handa说,等他移除了那部分代码,这个参数就会消失的。这些,会写在Readme.Unicode里面。(See Here)

完成了以上的工作,Emacs可以很好的显示英文了。不过中文时候还有问题。Emacs好像随便显示了一个中文字体。这样在
.Xresources文件中改变一下字体。
Emacs.font: Monospace-10
在.emacs中加入
(set-fontset-font (frame-parameter nil 'font)
'han '("WenQuanYi Bitmap Song" . "unicode-bmp")
这里WenQuanYi Bitmap Song可以改为simsun或者Microsoft YaHei(如果你安装了这些字体的话)。要注意的是,写在xft相关的fontconfig文件中对于一些大小的字体的关闭反锯齿的功能似乎无效(See Here)。这个也许是现在这个Emacs23版本的bug。很多事情值得期待,慢慢等吧。

星期一, 十月 30, 2006

xoops的Criteria类

CriteriaElement类的作用是标准化你的SQL查询语句中的查询子句
CriteriaElementCriteria类和CriteriaCompo的基类。
Criteria的构造函数如下:
function Criteria($column, $value='', $operator='=', $prefix = '', $function = '') 
其中$column是列名称, $value是子句中要查询的列的值,$operator是查询操作,缺省是“”, $prefix是前缀,通常是表的名字,一般可以省略, $function 是操作函数,规定查询条件中的函数。这个类的使用通常是调用renderWhere()函数,通常会返回一个 where COLUMN = VALUE 这样的子句。function的话似乎要写成这样:比如ABS(),要写成 ABS(%s),其实是对$column的运算。返回的子句如下:where ABS( COLUMN )= VALUE

CriteriaCompo是一个子句的组合,其构造函数如下:
 function CriteriaCompo($ele=null, $condition='AND')
其中$ele是一个CriteriaElement对象,$condition是合并条件。

CriteriaCriteriaCompo中都有一个 renderLdap(),函数,是做LDAP查询时候的子句。

星期五, 十月 27, 2006

xoops_getmodulehandler方法

XOOPS系统中,xoops_getmodulehandler()方法的函数定义如下:
function &xoops_getmodulehandler($name = null, $module_dir = null, $optional = false)
这个函数会去$module_dir目录下找到$name为名字的那个php文件。这个文件里面通常有两个类的定义。一个以XoopsBaseObject为其基类,一个以XoopsObjectHandler为其基类。XoopsObjectHandler是一个抽象类,构造函数的参数是一个数据库的对象--XoopsDatabaseXoops里面自然多数都是XoopsDB了。每编写一个新的对象都要实现XoopsObjectHandler中定义的方法。

XoopsBaseObject这个类里,定义了一个vars数组,这个类的很多方法是对这个数组的操作。initVar()是初始化数组元素的函数。初始化的时候要指定数据类型
function initVar($key, $data_type,
$value = null, $required = false,
$maxlength = null, $options = '')

define('XOBJ_DTYPE_TXTBOX', 1);
define('XOBJ_DTYPE_TXTAREA', 2)
define('XOBJ_DTYPE_INT', 3);
define('XOBJ_DTYPE_URL', 4);
define('XOBJ_DTYPE_EMAIL', 5);
define('XOBJ_DTYPE_ARRAY', 6);
define('XOBJ_DTYPE_OTHER', 7);
define('XOBJ_DTYPE_SOURCE', 8);
define('XOBJ_DTYPE_STIME', 9);
define('XOBJ_DTYPE_MTIME', 10);
define('XOBJ_DTYPE_LTIME', 11);
vars这个数组是一个关联数组,结构如下:
key=>array(          
value=>
required=>
data_type=>
maxlength=>
changed=>
options=>
)
xoops_getmodulehandler()会返回这个XoopsObjectHandler对象。

xoops更新模版的问题

每次调试模版,需要将整个模块升级。
这样写在xoops_version.php中的定义模版文件的行以及关于block和config的定义都会在数据库里面重新定义。xoops会将数据库中config表和tplfile表中相关项目都删除(delete),再重新插入(insert)。
$modversion['templates'][1]['file'] = 'main_index.html';
$modversion['templates'][1]['description'] = 'Index Page';
这是一个定义模版的例子
$modversion['config'][1]['name'] = 'Enablebandwidth';
$modversion['config'][1]['title'] = '_MI_MY_CONFIG';
$modversion['config'][1]['description'] = '_MI_MY_CONFIG_DES';
$modversion['config'][1]['formtype'] = 'yesno';
$modversion['config'][1]['valuetype'] = 'int';
$modversion['config'][1]['default'] = 0;
这是一个定义config的例子
newblocks表中的数据只是更新(update)。下面是xoops_version.php中定义block的例子。
$modversion['blocks'][1]['file'] = "my_blocks.php";
$modversion['blocks'][1]['name'] = _MI_MY_NEWBLOCK;
$modversion['blocks'][1]['description'] = _MI_MY_NEWBLOCK_DESCRIPTION;
$modversion['blocks'][1]['show_func'] = "b_mynewblock";
$modversion['blocks'][1]['template'] = 'mynew_block.html';
这是一个定义block的例子
block定义的最后一行的模版是会insert到tplfile数据表的。

更新模块后,还要清空模板缓存才可以看到修改的结果。