2011年2月21日星期一

[NOTE]在联想V460上安装Mac OS X 10.6.3并升级到10.6.6

无法查看这则摘要。请 点击此处查看博文。

2011年1月6日星期四

使用 Apache Mahout 和 Google Reader Share 搭建社会化阅读推荐引擎

一. Google Reader分享数据的抓取

主要参考以下文章:
Google Reader的数据收集
google提供的几种读取feed的API

值得注意的地方是在请求中可以添加以下参数:
1. 返回数量
2. 返回格式(json/xml)

用Python写了一个爬虫, 单线程抓取, 用的默认参数(n=20, xml). 目前已经爬了将近48小时, 共抓取了30000+个中文用户, 此外有20000+个不活跃用户或非中文用户.

判断中文用户的所使用的方法是: 在返回的结果中查找"的"字, 这种方法同时适用于简体中文和繁体中文. 目前看来效果良好.

抓回来的数据目前是保存为本地xml文件.

二. 数据解析

扫描所有xml文件, 产生打分数据.
打分数据格式为:
userID,itemID
表示用户(userID)喜欢/分享了文章(itemID).
第三项"分值"(preference)可以省略.
因为这里的打分的分值是bool值, 不是1就是0.

三. 搭建社会化阅读推荐引擎

1. 首先需要编译Mahout, 主要参考:

Recommender Documentation
基于 Apache Mahout 构建社会化推荐引擎
BuildingMahout
Recommender First-Timer FAQ
Apache Mahout 简介
RecommenderJob in mahout-0.4 returning 1.0 score for each recommendation

2. 然后基于grouplens的sample修改, 需要修改的主要是recommender:
public MyRecommender(DataModel dataModel) throws TasteException {

        UserSimilarity userSimilarity = new LogLikelihoodSimilarity(dataModel);
        // Optional:
        //userSimilarity.setPreferenceInferrer(new AveragingPreferenceInferrer(dataModel));
        UserNeighborhood neighborhood = new NearestNUserNeighborhood(3, userSimilarity, dataModel);

        recommender = new CachingRecommender(
                new GenericBooleanPrefUserBasedRecommender(dataModel, neighborhood, userSimilarity));
    }

值得注意的是, 因为我们的分数是bool值, 所以这里使用的是GenericBooleanPrefUserBasedRecommender.

3. DataModel比较好修改, 将
    super(convertGLFile(ratingsFile));
改为
    super(ratingsFile);
就可以了.

4. 编译生成jar包, 拷贝到taste-web的lib下, 然后生成war文件, 然后拷贝到tomcat的webapps下, OK, 部署完毕.
另外需要修改JVM的最大堆尺寸: 修改/usr/share/tomcat6/bin/catalina.sh,
在第一行添加CATALINA_OPTS="-Xmx1024M"
然后重启tomcat:
#/etc/init.d/tomcat6 restart

四. 结果

OK, 现在用浏览器打开http://localhost:8080/[my app name]/RecommenderServlet?userID=[some user id]

能够看到输出 T___T, 类似于:
0.8012257 9162463033714117388
0.8012257 -4561230713080859140
0.8012257 2660300300542533338
0.8012257 -2449470947652448865
0.8012257 4517199100982238889
0.8012257 8506464146746528189
0.8012257 -3632037840702745266
0.8012257 -8137494627916127284
0.8012257 -4976713633681791837
0.8012257 1080507498851365445


推荐效果不明, 因为都是文章的数字ID

暂时不会根据这堆数字产生人类可以理解的推荐结果网页
所以只能对着一堆数字泪流满面......

五. TODO

1. 根据推荐结果生成网页?
2. 调整recommender的类型/参数

2011年1月2日星期日

在Ubuntu10.04上安装Simplescalar

主要参考:
[1] Simplescalar installation instructions
[2] Installing Simplescalar

需要补充的一点是:
在执行$ make enquire这一步时,会遇到错误:
./xgcc -B./ -DCROSS_COMPILE -DIN_GCC   -g -I./include -I/usr/include    -DNO_MEM -DNO_LONG_DOUBLE_IO -O0 -I. -c ./enquire.c
In file included from /usr/include/sys/types.h:270,
                 from ./enquire.c:401:
/usr/include/bits/pthreadtypes.h:99: warning: unnamed struct/union that defines no instances
./xgcc -B./ -DCROSS_COMPILE -DIN_GCC   -g -I./include -I/usr/include  enquire.o -o enquire
enquire.o: In function `fCheck':
./enquire.c:2186: undefined reference to `__isoc99_sscanf'
enquire.o: In function `dCheck':
./enquire.c:2186: undefined reference to `__isoc99_sscanf'
enquire.o: In function `ldCheck':
./enquire.c:2186: undefined reference to `__isoc99_sscanf'
make: *** [enquire] Error 1
解决方法:
在enquire.c的第8行添加:
#define _GNU_SOURCE
这样就可以了。

目前遇到的问题是使用sim-cache和sim-outorder执行gzip时会遇到错误(用sim-profile执行gzip是正常的;用这三个执行mcf都是正常的):
fatal: cache: access error: bad size or alignment, addr 0x00009a71
不知道该怎么解决,快要崩溃了……

>>>> update 2011-01-06
在Red Hat 9上面安装没有这些问题. 应该和编译器版本啥的有关系.

2010年11月21日星期日

用NutchWAX搭建本地搜索引擎

目的:
使用NutchWAX对使用Heritrix抓下来的arc(Internet Archive)文件进行索引, 并搭建检索系统.

环境:
ubuntu 10.10
OpenJDK 6.x
NutchWAX 0.13
tomcat 6.x

步骤:
 * tar xzvf nutchwax-0.13.tar.gz
 * cd nutchwax-0.13
 * 创建文件manifest, 内容如下:
/absolute/path/to/your/somearchive0.arc.gz mycollection
/absolute/path/to/your/somearchive1.arc.gz mycollection
 * bin/nutchwax import manifest
 * bin/nutchwax index indexes segments/*
 * bin/nutchwax merge index indexes  
 * sudo apt-get install tomcat6
 * sudo mkdir /var/lib/tomcat6/crawl
 * sudo mv index /var/lib/tomcat6/crawl
 * sudo mv indexes /var/lib/tomcat6/crawl
 * sudo mv segments /var/lib/tomcat6/crawl
 * sudo cp nutch-1.0.war /var/lib/tomcat6/webapps/


现在打开http://localhost:8080/nutch-1.0应该可以进行搜索了.
下面稍微对nutch的界面进行一下修改:

修改/var/lib/tomcat6/webapps/nutch-1.0/search.jsp :


1. 将 int hitsPerSite = 2; 修改为:
int hitsPerSite = 0;
这样就不会在显示搜索结果时只显示两个了.

2. 默认搜索结果页面只有"下一页"按钮, 很不方便, 所以需要添加分页显示功能. 在尾部添加:

(代码就不贴了, 贴出来是乱码...具体参考Nutch的分页功能)


这样可以显示附近11页(这段代码是别人写的, 可能有点bug )的页面链接.




TODO:
1. 中文分词?
2. wayback网页快照?
3. 排序算法?





参考:
HOWTO.txt
Nutch的分页功能
搜索引擎nutch分页功能
NutchWAX-0.12.9 Japanization

2010年11月6日星期六

入手华为U8220

昨天上午下的单,今天下午到的.

T-Mobile的小内存版, 响应稍微有点慢, 不过可以忍受.
屏幕色彩数低, 有些有渐变的图标仔细看来会觉得惨不忍睹.
机器平放之后总是转到横屏...
其它--目前看来还可以, 毕竟只是1K出头的机子, 别指望有四五千的机器的表现.

装驱动遇到问题, PC套件和adb都检测不到, 后来下来一个Win7下面的驱动更新之后才能识别.
然后调程序的时候又发现logcat中无输出, Google之后找到解决方案:

http://www.eoeandroid.com/thread-30265-1-1.html
问题表现:连接手机与电脑后,保证驱动安装正确,debug模式打开,在ddms中可以看到进程信息,但是logcat中无信息输出
问题原因:一些rom默认关闭logcat
问题说明:ddms中设备名字显示为问号不影响,即adb get-serialno显示为问号不影响.
解决方法:
   1.需要root权限(部分rom不需要)
   2.打开logcat,并设置level
    adb shell
    echo 1 > /sys/kernel/logger/log_main/enable // 这里为注释,将1写入开关文件,1为开,0为关
    echo 2 >/sys/kernel/logger/log_main/priority // 里为注释,将代表level的2写入优先级文件
   3.重启adb,如果使用eclipse,先关闭eclipse,再重启adb,再启动eclipse
     adb kill-server
     adb start-server
   4.此时70%的logcat应该能正常工作了.如果此时logcat仍旧不工作,更新adb(只是一条指令,不需联网,很快执行完毕)
     android update adb
   5.重复第3步.此时80%的logcat应该能正常工作了
   6.如果logcat仍旧不工作
      找到个人主目录下的android目录,如我的是C:\Documents and Settings\lypoint\.android
      找到这个目录下的adb_usb.ini文件,其内容默认只有三行,全为注释,在后面添加一行,内容为0x12d1
   7.重复第三步,此时90%的logcat应该能正常工作了
   8.未完待续...
   9.G客工作室原创www.gker.net,转载请注明.

>>>>>>>>>>>>>>>>>>>>>

顺便记录一下Android 2.1的一个bug:

就是tablelayout中的button的文字会对不齐.

解决方法: 用linearlayout + layout_weight代替

参考: Buttons in TableLayout cropped on Android 1.6 and 2.1 (but not on 1.5 or 2.2)


>>>>>>>>>>>>>>>>>>>>>

祈祷我在Google Android 应用开发中国大学生挑战赛中拿手机吧!
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

话说回来, 程序还没进行完整的测试……

2010年10月10日星期日

Ubuntu下用vsftpd架设FTP服务器

目的:

架设FTP服务器,并有三个帐户:
  • download: 下载帐号,主目录为/home/vsftpd, 在该目录下只有只读权限;
  • upload: 上传帐号,主目录为/home/vsftpd/upload, 在该目录下有读写权限,但是不能删除和修改已有文件;
  • admin: 管理员帐号,主目录为/home/vsftpd,有所有权限。

步骤:

1. 安装vsftpd和db4.8-util
sudo apt-get install vsftpd db4.8-util
2. 建立虚拟用户口令库文件(奇数行用户名,偶数行密码)。文件内容示例:
xxx@ubuntu:~$ cat /tmp/loguser.txt
download
downloadpass
upload
uploadpass
admin
adminpass
注意:不要有多余的空格和空行

3. 生成数据库文件,并设置其访问权限
sudo db4.8_load -T -t hash -f /tmp/loguser.txt /etc/vsftpd_login.db
sudo chmod 600 /etc/vsftpd_login.db
4. 修改文件/etc/pam.d/vsftpd,使其内容如下(注释掉原有内容):
xxx@ubuntu:~$ cat /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd_login
5. 为虚拟用户创建本地系统用户
新建一个系统用户vsftpd,用户家目录为/home/vsftpd, 用户登录终端设为/bin/false(即使之不能登录系统)
sudo useradd vsftpd -d /home/vsftpd -s /bin/false
sudo mkdir /home/vsftpd
sudo mkdir /home/vsftpd/upload
sudo chown vsftpd:vsftpd /home/vsftpd
sudo chown vsftpd:vsftpd /home/vsftpd/upload
6. 修改/etc/vsftpd.conf,一般要确保含有以下设置:
listen=YES
anonymous_enable=NO
pam_service_name=vsftpd
guest_enable=YES
guest_username=vsftpd
user_config_dir=/etc/vsftpd_user_conf
7. 创建虚拟用户权限配置文件夹和配置文件
sudo mkdir /etc/vsftpd_user_conf
cd /etc/vsftpd_user_conf
sudo touch download upload admin
download文件内容如下:
anon_world_readable_only=NO
local_root=/home/vsftpd
upload文件内容如下:
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
local_root=/home/vsftpd/upload
admin文件内容如下:
write_enable=YES
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/home/vsftpd
注意:不要有多余的空格(和空行)

8. 重启vsftpd:(phew~)
/etc/init.d/vsftpd restart
9. 测试一下:
lftp localhost -u download,downloadpass
lftp down@localhost:/>ls
应该可以看到目录下的文件(如果有的话)
 
其他:

1. 还有一些其他参数,如速度限制、登录数限制等都可以在vsftpd.conf进行相应设置,甚至可以针对每个用户进行相应的设置。

2. 按照以上方法进行配置,目前还有个问题:本地用户无法登陆。报的错误是:
Login failed: 530 Login incorrect.
根据Manpage of VSFTPD.CONF所说:
guest_enable
If enabled, all non-anonymous logins are classed as "guest" logins. A guest login is remapped to the user specified in the guest_username setting.
local_enable
Controls whether local logins are permitted or not. If enabled, normal user accounts in /etc/passwd (or wherever your PAM config references) may be used to log in. This must be enable for any non-anonymous login to work, including virtual users.
如果使用了虚拟用户,那么所有非匿名用户(包括本地用户)都会映射到guest_username,即vsftpd这个用户,这样就造成了冲突。就是说鱼与熊掌不可兼得,本地用户和虚拟用户不能同时得到支持。不知道我理解得对不对。

参考链接:

Manpage of VSFTPD.CONF
vsftpd用户权限设置
为VSFTPD配置虚拟用户(文本方式)
vsftpd的虚拟用户配置
Vsftpd虚拟用户设置