Archive for 六月, 2010

svm是一种常用的分类方法,libsvm一个开源库,提供了c、java、python的接口。

而我需要用到的是php来使用svm方法,所以找了php-svm作为php的扩展。

按照php-svm的README中介绍的方法开始安装。在安装过程中,先是报 Unable to find svm.h 。即使指定了configure的with-svm也不行。之后,查看config.m4,发现以下代码:

AC_MSG_CHECKING([for svm.h header])
for i in $PHP_SVM /usr/local /usr;
do
test -r $i/include/libsvm-2.0/libsvm/svm.h && SVM_PREFIX=$i && SVM_INC_DIR=$i/include/libsvm-2.0/ && SVM_OK=1
done
if test “$SVM_OK” != “1”; then
for i in $PHP_SVM /usr/local /usr;
do
test -r $i/include/libsvm/svm.h && SVM_PREFIX=$i && SVM_INC_DIR=$i/include/ && SVM_OK=1
done
fi

这显然不对啊!它会在/usr/local和/usr的include/libsvm下去找svm.h文件!

解决方法两种:一是在/usr/local下建立符合其要求的目录,并且把svm.h复制过去;另一种,就是修改config.m4,添加上你的svm.h路径。

继而configure、make完毕。但是在make test的时候,报如下错误:

PHP Warning:  PHP Startup: Unable to load dynamic library 'modules/svm.so' - modules/svm.so: undefined symbol: svm_print_string in Unknown on line 0

但是在php-svm和libsvm的源码里grep,发现都没有svm_print_string 的定义:

svm.c:  extern void (*svm_print_string) (const char *);
svm.c:  svm_print_string = &print_null;
svm.c:  extern void (*svm_print_string) (const char *);
svm.c:  svm_print_string = &print_null;

所以,修改libsvm:

在svm.cpp中注释掉以下代码:

/* cy delete, move to svm.h */
  /*
  static void print_string_stdout(const char *s)
  {
      fputs(s,stdout);
      fflush(stdout);
  }
  static void (*svm_print_string) (const char *) = &print_string_stdout;
  */


在svm.h中新增:

 /* cy add, from svm.cpp */
  static void print_string_stdout(const char *s)
  {
      fputs(s,stdout);
      fflush(stdout);
  }
  static void (*svm_print_string) (const char *) = &print_string_stdout;


然后,重新在libsvm中make lib,再安装php-svm就可以了。

测试代码如下:

$data = array(
          array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2),
          array(+1, 1 => 0.75, 3 => 0.35, 9284 => 0.9),
          );

  $svm = new SVM();
  $model = $svm->train($data);
  #$model->save('train.model');
  #var_dump($model);
  unset($model);

  $data = array(1 => 0.73, 3 => 0.32, 9284 => 0.8);
  $model = new SVMModel();
  $model->load('train.model');
  $result = $model->predict($data);
  var_dump($result);

CTRL

Ctrl + a - Jump to the start of the line
Ctrl + b - Move back a char
Ctrl + c - Terminate the command  //用的最多了吧?
Ctrl + d - Delete from under the cursor
Ctrl + e - Jump to the end of the line
Ctrl + f - Move forward a char
Ctrl + k - Delete to EOL
Ctrl + l - Clear the screen  //清屏,类似 clear 命令
Ctrl + r - Search the history backwards  //查找历史命令
Ctrl + R - Search the history backwards with multi occurrence
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
Ctrl + xx - Move between EOL and current cursor position
Ctrl + x @ - Show possible hostname completions
Ctrl + z - Suspend/ Stop the command 
补充:
Ctrl + h - 删除当前字符
Ctrl + w - 删除最后输入的单词

ALT 键

平时很少用。有些和远程登陆工具冲突。

Alt + < - Move to the first line in the history
Alt + > - Move to the last line in the history
Alt + ? - Show current completion list
Alt + * - Insert all possible completions
Alt + / - Attempt to complete filename
Alt + . - Yank last argument to previous command
Alt + b - Move backward
Alt + c - Capitalize the word
Alt + d - Delete word
Alt + f - Move forward
Alt + l - Make word lowercase
Alt + n - Search the history forwards non-incremental
Alt + p - Search the history backwards non-incremental
Alt + r - Recall command
Alt + t - Move words around
Alt + u - Make word uppercase
Alt + back-space - Delete backward from cursor
// SecureCRT 如果没有配置好,这个就很管用了。

其他特定的键绑定:

输入 bind -P 可以查看所有的键盘绑定。这一系列我觉得更为实用。

Here "2T" means Press TAB twice
$ 2T - All available commands(common) //命令行补全,我认为是 Bash 最好用的一点
$ (string)2T - All available commands starting with (string)
$ /2T - Entire directory structure including Hidden one
$ ./2T - Only Sub Dirs inside including Hidden one
$ *2T - Only Sub Dirs inside without Hidden one
$ ~2T - All Present Users on system from "/etc/passwd" //第一次见到,很好用
$ $2T - All Sys variables //写Shell脚本的时候很实用
$ @2T - Entries from "/etc/hosts"  //第一次见到
$ =2T - Output like ls or dir //好像还不如 ls 快捷
补充:
Esc + T - 交换光标前面的两个单词

前些天,为公司的音乐频道添加了一个sitemap页面:MySpace音乐人地图

其间过程如下:

1、做了一个很大的页面,把所有音乐人的链接都放进去了,页面大约3M以上,而且url是动态的。结果很久未收录。

2、进行页面切分,将音乐人地图区分为主页和内容页。其中,主页地址为:http://music.myspace.cn/sitemap/ ,内容页为 http://music.myspace.cn/sitemap/A 等。

5月27日sitemap页面上线,到6月3日,被收录,baidu快照时间是2010-5-27。

在此期间,sitemap.xml中并没有添加该地址。仅是在MySpace音乐频道的底部添加了指向http://music.myspace.cn/sitemap/的链接。

现在,即6月3日,将sitemap主页以及内容页都加入到sitemap.xml中。

另外,一般情况下,应该保证一个页面仅有一个uri,即http://music.myspace.cn/sitemap 与 http://music.myspace.cn/sitemap/、http://music.myspace.cn/sitemap/index.html 如果都指向一个页面,那么应该统一起来,使其他url都301跳转到该url上。

通过dispatch里一些简单的字符串处理就可以做到:

if (preg_match(‘#\.php/?$#’, $uri) > 0){
$uri = preg_replace(‘#\.php/?$#’, ”, $_SERVER[‘SCRIPT_URI’]) . ‘/';
header(“Location: “. $uri, true, 301);
exit;
}
if (substr($uri, -1) != ‘/’){
header(“Location: “.$_SERVER[‘SCRIPT_URI’] . ‘/’, true, 301);
exit;
}