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虚拟用户设置

2010年9月30日星期四

Ubuntu下配置和运行Heritrix

1. 因为决定从源码运行Heritrix, 所以首先安装Eclipse:
$sudo apt-get install eclipse

2. 下载Heritrix源码:
http://sourceforge.net/projects/archive-crawler/files/

3. 解压:
$tar xzvf /home/xxx/workspace/heritrix-1.14.4-src.tar.gz

4. 将文件夹改名为heritrix(不是必须的, 这里是便于导入到eclipse):
$mv heritrix-1.14.4 heritrix

5. 打开eclipse, New->Java Project->Create Project from exsiting source
注意保证输入的Project Name和项目文件夹名称一致.

6. 进入Run Configurations, 指定Main class为
org.archive.crawler.Heritrix
添加VM arguments:
-Dheritrix.development -Xmx512m

添加Classpath: Advanced->Add External Folder, 将src/conf和src/resources添加到Classpath中. 否则会报两个错误:
Exception in thread "main" java.io.IOException: Failed to load properties file from filesystem or from classpath.
    at org.archive.crawler.Heritrix.getPropertiesInputStream(Heritrix.java:924)
    at org.archive.crawler.Heritrix.loadProperties(Heritrix.java:863)
    at org.archive.crawler.Heritrix.containerInitialization(Heritrix.java:492)
    at org.archive.crawler.Heritrix.main(Heritrix.java:555)

2010-07-10 10:03:01.250 严重 thread-10 org.archive.util.ArchiveUtils.() TLD list unavailable
java.lang.NullPointerException
 at java.io.Reader.(Unknown Source)
 at java.io.InputStreamReader.(Unknown Source)
 at org.archive.util.ArchiveUtils.(ArchiveUtils.java:759)
 ........
更严重的是, 会使Heritrix的Modules界面不能改变选择项.


7. 其他诸如设置用户名密码, 添加和运行job之类的, 这里就不详细说明了, 以下是一些参考链接:
Heritrix User Manual
Heritrix developer documentation
基于lucence+heritrix的开源搜索引擎构建(一)
Heritrix使用的初步总结

2010年9月24日星期五

[Notes] Real World Haskell (1): 运算符

运算符列表:

运算符 含义 示例
&& logical "and" True && False
|| logical "or" Flase || True
/= 不等于 2 /= 3
^ (整数次)幂 3 ^ 2
** (浮点数次)幂 3 ^ 2.0
++ 连接两个lists [3,1,3] ++ [3,7]
: 将一个元素插入列表头部 1:[2,3]
% 比例(表示分数) 11 % 29

2010年8月12日星期四

2010年6月2日星期三

长 夜 -- 丽尼

长        夜
丽尼
    那时,我织着我自己底梦,你也有你自己底沉思,我们是各自组成着各自底世界,完全是陌生而不相识的人了呢。我们往往只各人沉浸在自己底哀愁之中,虽然彼此都深深地感觉了难耐的重负,然而也不肯互相告诉而做出安慰。
    唉,我们底郁结的心是什么时候始能消解呢?到了这里,我老实地给你说罢,我不能不希望一个末日底来到啊。
    一个毁灭会给我们一个结束,那时,我们彼此将不存一点怨尤,这岂不更好么?为了我们底历史我是不能再有眼泪。
    过去犹如梦一般地依稀,而且,我们是从来不曾有过欢乐的啊。如同在黑暗之中的一对伴侣,我们是这样偕行着的呀。
    我搀扶着你,越过了森林与大海。你曾说“多么疲倦的途程”,我无语,因为我也有着自己底苦痛。你岂不曾看见有眼泪挂在我底眼角,而我也是几乎要昏倒于我底道路么?我忍住了叹息,这是因为有了你在我底身旁。岂不知道,一个叹息会在你底心里种下不幸的种子而给我以永远也不能解脱的哀愁么?我们是相互扶依的伴侣,而又是完全陌生的旅客哟。
    在人海之中你是怎样地奔向了我来,而我也曾怎样地对你张开了我底寒冷的手臂!我曾说:“这个相逢会使你失去少女底容颜,而忘却青春底梦的呀。”一丝眼泪曾流下了你底眼前,而我亦只能忍住哭泣。于是我们互相结合了冰冷的唇,而偕行于这植满了哀愁与寂寞的道路了。你无言,时时窥视了我以沉默的眼。然而,这岂是我们底希求,这是我们底不幸哟。
    夜已深了,去罢,我们:我们无有故旧,也无有朋友,我们只各人自己认取自己底道路,趁着这黑夜而作出一个渺茫的摸索罢。
    到那时我们会有记忆,然而,记忆是属于过去的事了。我将在黑夜里频频呼唤你底名字;你将永远低垂了头,感觉辛苦。
    我们将希望着毁灭如同一个救赎。我们将把生命看做不能摆脱的负累,在沉默的忆念之中我们将随着草木而腐朽。
    世界底末日与宇宙底哀愁;我们将战栗于暗夜的途中,不复再有言语。在倦怠的途程之中我们会永远无有苏醒。
    这样,我们结束了我们底梦寐罢。然而,我们仍将互相表示着平寂,如辞枝的落叶互相作出沉默之睇视而得到了解了。
                                                                                 一九三二年,三月。

——————————————————————
非常喜欢“希望着毁灭如同一个救赎”这句话。

2010年5月7日星期五

Mac OS X中不尽如人意的地方

可能吧发了一篇文章: Macbook Pro初体验, 基本说出了我想说的.

所以好处就不说了, 这里只列出使用时感觉到不方便的地方:

1. delete键
别告诉我"要删除文件只要拖到废纸篓就好了"

2. 图片预览时没有上一张和下一张图片这个按钮或者快捷键
别告诉我"先Ctrl-A, 然后再预览图片就好了"

3. Ctrl-X
每次要剪切文件的时候只能先复制再删除...

4. Finder没有地址栏
切换文件夹的时候不是特别方便.

5. 没有最大化
所谓的"最适合大小", 对我来说说服力不那么大.


暂时这么多.

ps. 那个磁性电源的设计虽然很人性化, 但是会不会容易吸附一些铁器从而造成短路啊?

2010年5月5日星期三

[Note] Programming In Lua 笔记(2): 函数

21.
调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。
上述规则有一个例外,当函数只有一个参数并且这个参数是字符串或者表构造的时候,()可有可无:
print "Hello World" <--> print("Hello World")
dofile 'a.lua' <--> dofile ('a.lua')
print [[a multi-line message]]<--> print([[a multi-line message]])
f{x=10, y=20} <--> f({x=10, y=20})
type{} <--> type({})

22.
Lua函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用nil补足。
-- 不知道Lua里面有没有与python类似的默认参数? 支持, 不过有所不同, 参见PIL 5.3 命名参数

23.
多返回值的函数调用 的 返回值:
1). 当调用作为表达式最后一个参数或者仅有一个参数时,根据变量个数函数尽可能多地返回多个值,不足补nil,超出舍去。
2). 其他情况下,函数调用仅返回第一个值(如果没有返回值为nil)。
3). 可以使用圆括号强制使调用返回一个值。

-- 这个部分的规则比较奇怪. 例子比较长, 就不贴出来了, 还是仔细看原文吧.

24.
特殊函数unpack,接受一个数组作为输入参数,返回数组的所有元素。unpack返回a所有的元素作为f()的参数
f = string.find
a = {"hello", "ll"}
print(f(unpack(a))) --> 3 4

25.
可变参数:
Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(...)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,除了参数以外,arg表中还有一个域n表示参数的个数。

26.
如果我们只想要string.find返回的第二个值。一个典型的方法是使用哑元(dummy variable,下划线):
local _, x = string.find(s, p)
-- now use `x'
...


初级语法知识似乎到这里就结束了, 后面的(从第6章再论函数开始)是稍微高级一点的内容了, 或者说是Real world Lua?

[Note] Programming In Lua 笔记(1): 类型, 值, 表达式, 基本语法

1.
prompt> lua -la -lb
命令首先在一个Chunk内先运行a然后运行b。(注意:-l选项会调用require,将会在指定的目录下搜索文件,如果环境变量没有设好,上面的命令可能不能正确运行。)

2.
prompt> lua -i -la -lb
将在一个Chunk内先运行a然后运行b,最后直接进入交互模式。
-i选项要求Lua运行指定Chunk后进入交互模式.

3.
在交互模式下加载库:
> dofile("lib1.lua") -- load your library

4.
Lua的变量默认是全局的. 定义局部变量使用local关键字.
--[[
应该尽可能的使用局部变量,有两个好处:
1. 避免命名冲突
2. 访问局部变量的速度比全局变量更快.
--]]

5.
注释:
单行注释:--
多行注释:--[[ --]]

6.
nil是Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量赋nil可以删除该变量。类似python中的None.

7.
在控制结构的条件中除了false和nil为假,其他值都为真。所以Lua认为0和空串都是真。

8.
string
用单引号和双引号表示字符串, 多行字符串使用[[...]]

9.
运行时,Lua会自动在string和numbers之间自动进行类型转换,当一个字符串使用算术操作符时,string就会被转成数字。反过来,当Lua期望一个string而碰到数字时,会将数字转成string。
-- 尽量避免自动转换, 避免数字与字符串的混合操作.

10.
".."在Lua中是字符串连接符,当在一个数字后面写".."时,必须加上空格以防止被解释错。

11.
显式将string转成数字可以使用函数tonumber(),如果string不是正确的数字该函数将返回nil。反之,可以调用tostring()将数字转成字符串.

12.
and和or的运算结果不是true和false,而是和它的两个操作数相关。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
-- pretty tricky

13.
一个很实用的技巧:如果x为false或者nil则给x赋初始值v
x = x or v
等价于
if not x then
    x = v
end

14.
C语言中的三元运算符
a ? b : c
在Lua中可以这样实现:
(a and b) or c

15.
not的结果只返回false或者true, 和and/or不同

16.
table是非常强大的一个存在. 它的索引下标"默认"从1开始, 而不是0.
它的元素可以是任何类型, 也可以包含数据成员(如下面的x和y).
a = {x=0, y=0, 'aaa', 'bbb', {1,2}, 123}

可以指定索引(模拟字典):
opnames = {["+"] = "add", ["-"] = "sub", ["*"] = "mul", ["/"] = "div"}

强制下标从0开始:
days = {[0]="Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}

在构造函数中域分隔符逗号(",")可以用分号(";")替代,通常我们使用分号用来分割不同类型的表元素。
{x=10, y=45; "one", "two", "three"}

17.
多个变量同时赋值:
当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:
a. 变量个数 > 值的个数 按变量个数补足nil
b. 变量个数 < 值的个数 多余的值会被忽略 容易引起误解的变量初始化:
a, b, c = 0
print(a,b,c) --> 0 nil nil
容易误解为c=0或者a=b=c=0

-- 尽量保证变量个数和值的个数一致

18.
控制结构语句:
if ... then ... elseif ... then ... else ... end
while ... do ... end
repeat ... until ...
for ... do ... end
for ... in ... do ... end

19.
for语句有两大类:

第一,数值for循环:
for var=exp1,exp2,exp3 do
    loop-part
end
exp1,exp2,exp3分别为初始值,终止值,步进值. exp3默认为1, 此时可省略.
注意: 这三个表达式只会被计算一次,并且是在循环开始前。

第二,范型for循环:
for i,v in ipairs(a) do print(v) end
for k in pairs(t) do print(k) end

20.
Lua语法要求break和return只能出现在block的结尾一句(也就是说:作为chunk的最后一句,或者在end之前,或者else前,或者until前),例如:
local i = 1
while a[i] do
    if a[i] == v then break end
    i = i + 1
end
有时候为了调试或者其他目的需要在block的中间使用return或者break,可以显式的使用do..end来实现:
function foo ()
    return --<< SYNTAX ERROR
    -- 'return' is the last statement in the next block
    do return end -- OK
    ... -- statements not reached
end

[Tips]如何快速打开豆瓣电台精简版

新建书签,地址为:
javascript:if(!window.open('http://douban.fm/radio','radiowin','height=186,width=420,toolbar=no,menubar=no,scrollbars=no,location=no,status=no')){location.href='http://douban.fm/radio'}

ps. 为什么我觉得豆瓣改版改得很失败呢?首先是打开电台比原来要麻烦;其次那个搜索栏不再是全能的了。

2010年4月20日星期二

折腾Hackintosh的小结

[声明]
本文仅仅是作者安装Mac OS X的备忘,作者不对任何因为参考本文安装美国苹果公司发行的系统而导致的后果负责。任何企图追究作者责任的人,你在这里看到的都是幻觉。


参考:
[1] 新手安装指南:一步一步在Windows安装苹果雪豹系统
[2] 放出MBR分区硬盘安装雪豹最新系统10.6.2_10C2234所需破解文件osinstall!
[3] PS2键盘+USB鼠标/PS2鼠标+USB键盘/PS2鼠标+键盘的完美解决!!!


1。下载安装盘,我用的是MAC.OSX.SNOW.LEOPARD.V10.6.2-HOTiSO。现在系统最新版已经是10.6.3了。建议使用原版安装盘吧。
2。在Windows下用PQ调整硬盘,分出来一个8G的逻辑分区(用于放安装盘)。后面留20G的空白空间(用于安装系统),这个空间暂时不需要建立分区。
3。进入cmd,使用宇宙无敌超级强大分区小工具diskpart(说实话Windows下面有这么强大的命令行工具总能让我惊讶万分)在最后这20G空间建立一个分区,并把分区类型ID标为AF。大体过程(声明:仅供参考,不保证回忆的准确性,而且这里所用的参数不一定适合你所用的机器。为了您的资料安全,请自行google diskpart的准确用法。):
diskpart
DISKPART> list disk
DISKPART> select disk 0
DISKPART> create partition primary id=AF
我用的是Windows XP,貌似还不支持set ID这个命令,所以只能在创建分区的时候指定ID。可能Windows 7支持随时修改。
这个步骤的目的是建立一个分区类型为AF的分区,即HFS+(MacOSX所用的文件系统)分区。
4。用“leopard硬盘安装助手”复制安装盘镜像到8G分区。
5。安装“MacDrive”,便于对安装盘进行适当的修改。
6。将“合适”的OSInstall文件覆盖安装盘的/System/Library/PrivateFrameworks /Install.framework/Frameworks/OSInstall.framework/Versions/A/下同名文件
7。安装Bootthink
8。将“必要”kext(内核扩展)文件放到“合适”的文件夹下面。这些“必要”的kext文件一般包括:AppleACPIPS2Nub.kext NullCPUPowerManagement.kext fakesmc.kext PlatformUUID.kext ApplePS2Controller.kext OpenHaltRestart.kext Natit.kext VoodooHDA.kext。当然这个和机器硬件配置是有关的,需要反复地尝试才能知道需要哪些文件。“合适”的文件夹一般是C:/Darwin/System/LibrarySL/Extensions。
9。万事俱备,只差重启。现在重启电脑,进入BIOS,确保硬盘工作模式为AHCI而不是IDE。什么,你的BIOS里面没有这个选项?⋯⋯谢谢阅读本文,欢迎下次再来。
10。现在进入到启动画面后,启动菜单应该多了一个“Bootthink”。进入后应该有个叫做“Mac OS X Install DVD”的选项。如果相信自己RP好的话直接按回车。否则你应该按F8键,然后输入“-x32 -v”,如果是64位机器则输入“-v”即可。
11。如果启动有问题则请阅读参考[1]Troubleshooting一节。如果顺利的话会进入语言选择界面。
12。然后就没啥了,抹盘的时候别把不该抹的抹了就行。记住只抹该抹的。给你讲个故事吧:从前有个人他不会抹盘,然后把电脑送给维修,后来⋯⋯后来你都知道了。
13。安装系统成功后如果有的设备不能用,比如PS2的键盘鼠标,USB存储设备,声卡,显卡,网卡等等,安装合适的驱动(即kext)即可,需要大量的搜索和尝试。
14。如果系统启动不了,比如遇到了“无尽的菊花”,可以使用“-s”参数启动,之后会进入单用户模式。此时文件系统是只读的,如果需要修改文件可以使用此命令挂载分区以进行写操作:
#mount -w /
15。Good Luck!


至于Mac OS X的使用体会有心情再写。

2010年3月15日星期一

正在做的twitter"客户端"的截图

项目主页: http://code.google.com/p/twiterm/
CodeName: Darter

把截图放出来给大家预览一下.
目前只有阅读Home时间线的功能.
欢迎提意见和建议!

From Twitter

2010年2月27日星期六

[Twisted学习笔记] Deferred机制

参考阅读:
[1] Deferred Reference
[2] Deferreds are beautiful! (A Tutorial)


最近在研究Twisted, 其中一个会把像我这样的初学者吓住的概念就是Deferred.

我们知道, Twisted是一个异步(asynchronous)基于事件回调(callback-based)的框架, 而Deferred是实现这一特性的关键之一.

Twisted使用Deferred对象来管理回调函数序列(callback sequence).
具体来说:
1) 通过Deferred对象可以为某个事件增加一个或多个事件处理函数(即回调函数);
2) 多个回调函数构成了函数链(callback chain);
3) 增加回调函数的顺序决定了事件响应的"相对顺序";
4) 增加回调函数的方式决定了回调函数的调用时机.

当Deferred对象的请求得到满足, 添加的第一个callback会被调用, 并且其输出会作为第二个callback的输入, 然后像这样沿着函数链依次传递下去. 如下图所示:

[以下为翻译Deferred Reference中的相关段落]
  • 当请求得到结果后, 如果操作成功, 会通过Deferred.callback(result)传递到Deferred Object; 如果失败则通过Deferred.errback(failure).
  • Deferred Object将结果传递给此前注册的回调函数链, 规则如下:
    • 一个callback的输出总是作为下一个callback的第一个参数, 这样就构成了一个处理器链.
    • 如果一个callback产生异常, 则立即转到下一个errback.
    • 如果errback内部产生了异常, 则转到下一个errback.
    • 如果errback没有产生异常, 或者返回了一个twisted.python.failure.Failure实例, 则回到下一个callback.








上图可能会有些误导性, 我又画了一幅示意图:

deferred

2010年1月18日星期一

[攻略]使命召唤-现代战争2-Special Ops-CHARLIE-Homeland Security

参考:
http://tieba.baidu.com/f?kz=667762334
http://tieba.baidu.com/f?kz=679642109
http://3dmgame.chnren.com/bbs/showtopic-1026140.html

其实不用以上攻略中说得这么麻烦,我是这样过关的(Veteran级):
1. 拿到地雷,然后抓住自动机枪左转90°,跑到餐厅里;
2. 把自动机枪架在柜台后面;
3. 把柜台右前方的另一台自动机枪也架到柜台后面,二者保持一定距离;
4. 把手枪换成柜台上的机枪,从后门跑出餐厅;
5. 在后门口和后门口旁边的墙角放置两个地雷;
6. 往巷子里面跑,躲在网后面的那个柱子后面;
7. 用机枪对准后门,然后就等没有被自动机枪消灭的漏网之鱼吧。

用以上方法可以消灭全部的步兵。步兵被灭之后,可以跑到餐厅里,用火箭弹消灭直升机和装甲车。
这种方法比较简单,不用拼命跑来跑去。但是耗时会长一些。

2010年1月17日星期日

Hello World!

Across the Great Wall we can reach every corner in the world. (越过长城,走向世界)

原来的博客挂掉了,可能是暂时的,不过鉴于某国当前的互联网状况,我还是早做打算,干脆迁到blogspot吧。
虽然blogspot频频被墙奸,但是由于“翻墙”已经逐渐成为某国网民除了上QQ之外的基本技能,而且GReader已经被普遍使用,blogspot是一个还不错的选择。

最近谷歌退出中国的事情闹得沸沸扬扬,不知道最后如何收场。
无论如何,could it be any worse?
亲身经历了中国互联网这一年来的各种闹剧,还有什么无耻的做法不能承受,还有什么无耻的人不能忍受?!
在这里引用一下狄更斯的《双城记》开头的一段话:

这是最好的时代,这是最坏的时代;
这是智慧的时代,这是愚蠢的时代;
这是信仰的时期,这是怀疑的时期;
这是光明的季节,这是黑暗的季节;
这是希望之春,这是失望之冬;
人们面前有着各样事物,人们面前一无所有;
人们正在直登天堂,人们正在直下地狱。

很高兴活在这样一个时代。