Debian Squeeze/sid + Apache + Redmine 0.9.3/trunk + MySQL + git/hg

Update: 已可直接从库里安装了~。

# apt-get install redmine redmine-mysql libapache2-mod-passenger
_________________________________________________________________________

按:这是在公司 WIKI 上写的文章,难得这么认真,拿出来分享一下 :)。对比过十多个项目管理系统,然后在比较好的 Redmine, Trac, Mantis 三个当中选择了 Redmine。文中以 Debian Squeeze 为例,但其它 GNU/Linux 特别是 Debian Lenny / Sid、Ubuntu 应该基本一致。

_________________________________________________________________________

一、废话

Debian 的库里有最新的 redmine 发布版(0.9.3),一个命令就可以搞定:

#apt-get install redmine

However……,安装后运行会出现 http 500 service unavailable 等问题。因为 Debian 只有 2.2.3 的 rails,而 redmine 0.9.3 要求 rails 的版本为 2.3.5。

我第一个想法是,既然库里有 redmine,就不折腾了,删掉 rails,再手工装一个新版本。可是 redmine 是依赖于 rails 的,要删得一起删。然后我就想,好,保留它,再装一个新版本覆盖之!就是这个想法……,最后遇到了很多问题,又因为对 ror 不熟,在这上面浪费了不少时间。

没办法,全 purge 掉,实实在在从头来吧。以下以 redmine-trunk 版为例(解决了 0.9.3 中存在的 wiki+php 等一些 bug)。

注:以下 # 开头的命令需以 root 身份执行。

二、依赖关系

#apt-get install ruby rubygems rake mysql-server mysql-client libmysql-ruby libopenssl-ruby
#gem install rails

三、下载 redmine

/var/projects#svn checkout http://redmine.rubyforge.org/svn/trunk redmine

注:稳定发行版本下载 http://rubyforge.org/frs/?group_id=1850

四、创建数据库

# mysql -u root -p
mysql> create database redmine character set utf8;
mysql> grant all privileges on redmine.* to redmine@localhost identified by 'PASSWORD';

五、数据库配置文件

/var/projects/redmine#cat config/database.yml
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: redmine
  password: PASSWORD
  encoding: utf8

六、生成 session key

#rake generate_session_store

会将结果写入 config/initializers/session_store.rb

七、初始化数据库结构

#RAILS_ENV=production rake db:migrate

八、导入默认设置到数据库

#RAILS_ENV=production rake redmine:load_default_data

九、预览!

#ruby script/server webrick -e production

然后可以用浏览器访问 http://server:3000/ ,待测试没问题再继续。

十、用 apache 运行 redmine

WEBrick 虽然能跑,但是超慢!慢到无法忍受的地步(好奇的是,内存和cpu利用率都超低,它在干嘛呢……)。

安装:

#apt-get install apache2 libapache2-mod-passenger

权限:

#chmod -R g+w redmine
#chown -R root:www-data redmine

符号链接:

#ln -s /var/projects/redmine /var/www/redmine

配置文件:

#cat /etc/apache2/conf.d/redmine
RailsEnv production
RailsBaseURI /redmine

Done:

#/etc/init.d/apache reload
$firefox http://server/redmine/

十一、安装/修改 主题/样式(可选)

Redmine 支持基本的主题自定义(可以覆盖默认的 css)。

可以到 http://www.redmine.org/wiki/redmine/Theme_List 下载别人的主题包,解压后将包目录放到 public/themes/ 下面。

#/etc/init.d/apache reload

之后,即可访问 http://server/redmine/settings?tab=display 选择新的主题。

不过我觉得还是默认的耐看。我直接对默认的主题做了一点修改:

--- public/stylesheets/application.css    (revision 3628)
+++ public/stylesheets/application.css    (working copy)

+tr.priority-1, table.list.issues tr.priority-1 a { color: black; }
+
+tr.priority-2, table.list.issues tr.priority-2 a { color: #1c1cf3 /*similar to blue*/; }
+tr.priority-3, table.list.issues tr.priority-3 a { color: #1c1cf3; font-weight: bold; }
+
+tr.priority-4, table.list.issues tr.priority-4 a { color: red; }
+tr.priority-5, table.list.issues tr.priority-5 a { color: red; font-weight: bold; }
+
+tr.status-3, table.list.issues tr.status-3 a,
+tr.status-4, table.list.issues tr.status-4 a { color: green; font-weight: normal; }
+
+tr.status-5, table.list.issues tr.status-5 a,
+tr.status-6, table.list.issues tr.status-6 a { color: gray; font-weight: normal; }

以上加的几行,使得以不同的颜色区分不同优先级(低/高/紧急等)、不同状态(新建/进行中/反馈/已关闭等)的 issue。

十二、安装插件(可选)

很方便,下面是安装 email tls 插件的例子:

#ruby script/plugin install git://github.com/collectiveidea/action_mailer_optional_tls.git

更新数据库:

#RAILS_ENV=production rake db:migrate:upgrade_plugin_migrations
#RAILS_ENV=production rake db:migrate_plugins

十三、配置 email 发送功能 —— 任务建立/变更时,发送邮件提醒(可选)

以 GMail 为例,先要安装上一步提到的 email 插件,然后:

#cat config/email.yml
production:
  delivery_method: :smtp
  smtp_settings:
    tls: true
    address: "smtp.gmail.com"
    port: 587
    domain: "smtp.gmail.com" # 'your.domain.com' for GoogleApps
    authentication: :plain
    user_name: "xxxxx@gmail.com"
    password: "xxxxxxxxxxxxxxxx"

完了 reload apache 即可。这里 http://server/redmine/settings?tab=notifications 有一些设置选项。我去掉了 bcc,选中了纯文本。

修改 1:

--- app/models/mailer.rb    (revision 3628)
+++ app/models/mailer.rb    (working copy)
-    subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] (#{issue.status.name}) #{issue.subject}"
+    subject "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] #{issue.subject}" 

     s = "[#{issue.project.name} - #{issue.tracker.name} ##{issue.id}] "
-    s << "(#{issue.status.name}) " if journal.new_value_for('status_id')
     s << issue.subject

修改的目的,是使得 redmine 发送的邮件提醒在标题中不要包含 issue 的状态(新建/进行中/已关闭等),从而使得关于同一个问题的所有提醒邮件在 GMail 中都能自动组织成一个会话,非常有利于上下文的理解。

redmine 默认在邮件标题中包含 issue 的状态信息,使得每一次状态变更的邮件都分散到不同的会话中,很讨厌。

修改 2:

--- config/locales/zh.yml    (revision 3628)
+++ config/locales/zh.yml    (working copy)
-  text_journal_changed: "{{label}} 从 {{old}} 变更为 {{new}}"
-  text_journal_set_to: "{{label}} 被设置为 {{value}}"
-  text_journal_deleted: "{{label}} 已删除 ({{old}})"
-  text_journal_added: "{{label}} {{value}} 已添加"
+  text_journal_changed: "{{label}}:{{old}} -> {{new}}"
+  text_journal_set_to: "{{label}}: -> {{value}}"
+  text_journal_deleted: "已删除:{{label}} ({{old}})"
+  text_journal_added: "已添加:{{label}} {{value}}"

对中文翻译的一点修改,这是邮件提醒中对 issue 变更的说明,我觉得太啰嗦了,不直观明了,没有重点。

注:如果你发现发出去的邮件,issue 链接都是带 3000 端口号的,而你现在用 apache 跑 redmine 不需要端口号,可以去 http://server/redmine/settings 改“主机名称”。这是因为你第九步的时候无意中保存过这个设置。

十四、打 patch(可选)

以下是作者提供的一个 patch,使得在 redmine 中,可以将任务指派给一个组/group,该组的所有成员都会收到邮件提醒(只是,该任务不会显示在“我的工作台”里)。

redmine#wget http://www.redmine.org/attachments/download/2965/0001-Allow-issues-to-be-assigned-to-a-Group.-2964.patch
redmine#patch -p1 < 0001-Allow-issues-to-be-assigned-to-a-Group.-2964.patch

注一:执行 patch 的时候,它会有一点小抱怨,可不予理会。

注二:http://server/redmine/groups ,此处可以增删/编辑小组及其成员。

十五、与版本控制软件集成(Git / Mercurial)

配置系统(使得只有组内的成员才可以查看/修改项目代码,不同的项目使用不同的组):

#groupadd saas
#echo 'if [ "saas" == "$(id -gn $(whoami))" ]; then umask 007; fi' >> /etc/profile

Update:
在 /etc/profile 中设置 umask 只会影响 login shell,而我们通过 git push 过来的文件仍然是默认的 755 权限(修改 .bashrc 等亦无效)。

要设置 git push 到服务器的文件的权限为 770(同组成员可写),正确的做法是:

# echo "session optional pam_umask.so umask=007" >> /etc/pam.d/common-session

此外,以下方法应该也可以(没有测试):

# echo "Subsystem git /bin/bash -c 'umask 007; /usr/bin/git'" >> /etc/ssh/sshd_config

安装 git:

#apt-get install git-core

初始化 git 版本库:

#mkdir /var/projects/saas
#cd /var/projects/saas
#git --bare init
#chown -R root:saas ../saas
#chmod -R 770 ../saas

版本库初始化完成,若要增加新的开发者(各自使用自己的帐号),由管理员执行:

#useradd -m -s /bin/bash -g saas username # 注意,若不指定,默认的 dash 会出错

并将其 pub key 添加到 /home/username/.ssh/authorized_keys 之内。

开发人员在客户端的操作:

$git config --global user.name "xxx yyy"
$git config --global user.email "xxx@gmai.com"
$git clone username@server:/var/projects/saas

测试:

$cd saas
$echo hello > world
$git add .
$git commit -a -m 'hello world'
$git push origin master

以后再 push,就不需要 “origin master” 这两个参数了。

最后,因为初始化版本库的时候我们用了 –bare 参数,在 /var/projects/saas 下是看不到项目代码文件的。

可以生成一份代码拷贝,用来在 apache 下进行测试:

#cd /var/www
#git clone /var/projects/saas
#chown -R root:saas saas
#chmod -R 770 saas
#addgroup www-data saas

开发者 push 完后,apache 下的代码并不会自动更新,若想测试(这个测试相当于预览,因为开发人员 push 之前是需要先在自己的机器上认真测试的)更新后的代码:

/var/www/saas$git pull # 注意,各用自己的帐号执行,不要用 root

至此,版本管理系统已经正常工作,还剩最后一件事:那就是告诉 Redmine,我们版本库的路径。

浏览器里打开 Redmine,新建一个项目,然后在“设置”里会有个标签叫“版本库”,选择 git,并在 path 里填 /var/projects/saas 就搞定了!

另,hg 的设置与 git 非常相似,大部分参数都一样,不另述。

十六、升级 redmine svn trunk(可选)

#svn update
#rake tmp:cache:clear
#rake tmp:sessions:clear

可能还要执行第七步和第十二步提到的更新数据库的操作。升级之前应该先备份,在测试实例上确认没有问题再升级。

十七、备份redmine数据

一是数据库:

#mysqldump -u redmine -p redmine > redmine.$(date +%F).sql

二是上传的文件:

/var/projects/redmine#tar cvzf ../redmine.uploaded.files.$(date +%F).tar.gz files/

(完)

桌面 GNU/Linux 不仅仅是玩具

我想讲一个我自己的笑话 :-) 。

就在发本主题上一封邮件的时候,我也在升级系统,其中包括 ibus(我的系统 Debian sid/experimental, ibus 好像是从 1.2.0.20090723-1 到 1.2.0.20090806-1)。升级完后,我发现我输入不了汉字了。后来在 ibus-setup 中,找到了一个 “Use system keyboard layout setting” 的选项,选上,好了。

如果我把这个问题做一个 bug report,会被鄙视吧。确实,在这个问题上,ibus 没有 bug,可是这不应该是一个稳定版输入法的表现。

普通用户对于输入法的需求,就是随时随地在他/她需要的时候能打出字来。否则就写不了财报、写不了邮件、写不了合同……,就会严重影响他的工作,他就会打电话投诉服务商。如果服务商向他推荐的是 GNU/Linux 系统,他就会认为 GNU/Linux 系统打不了字,进而对此服务商心存疑虑(企业用户选择 GNU/Linux 作为办公环境,主要是信任服务商,而非单纯地认为 GNU/Linux 系统好用)。

我想,计算机系的同学对别的专业的知识不是样样精通吧。那么,我们也不能要求别的专业的用户花费大量时间,来学习计算机的知识。一个系统在他们眼里就是一个整体,他不会去分什么内核/桌面,甚至更多稀奇古怪的术语。如果 Firefox 出了问题,他们就会说 GNU/Linux 系统上不了网;如果 ibus 出了问题,他们就会说 GNU/Linux 系统打不了字。

用户关心的始终是自己的核心业务。我们推荐 GNU/Linux 时,从来都强调它很稳定、很安全,很简单、很好用。除了在服务端,在桌面端,GNU/Linux 系统也是 productive 的。对于普通用户来说,计算机是一个顺手的工具,时刻准备为你服务,而不是要你时不时地去伺候/配置一下。

希望这个笑话,可以让大家看到普通用户和开发社区的朋友看计算机的角度不太一样。在用户眼里,我们离稳定还有一些距离。如果说人手不够暂不考虑,自是合理,但希望稳定版是个方向。

GNU/Linux 不仅仅是一个可爱的玩具,它需要走向产品化,我们用自己的职业生涯努力促进这一进程。很多人反感“菜鸟”们来玷污他高深的玩具,但我想,一个真正认同自由软件理念的人,一定也是乐意分享、乐意看到自由软件发扬光大的。

从一个实际例子看Linux与Windows的哲学差异,及其影响下的用户心理

上一篇提到 GAppProxy,不妨说说我从中观察到的一个现象。

其实 GAppProxy 很早以前就挺好用了,但是一直有一个问题,就是很多时候会显示一个空白页面。显示空白的大部分都确实是不能访问的,并非 GAppProxy 搞错了。但是我对此很不爽,因为导致空白的原因是很多的。包括各种各样的异常没有catch,包括超出了 Google App Engine 平台的限制等等。它光显示一个空白,你根本不知道发生了什么。

前不久,我对它进行了各种边界测试,把能想到、能碰到的所有错误分类开来。然后在无法代理的时候,向用户浏览器显示一条信息。告诉用户现在是什么状况,具体是什么原因。dugang 也觉得这样很好,在我的基础上进一步细化了。然后,GAppProxy 1.0beta 发布了。

但是接下来的反馈有点出我意料。很多人说 GAppProxy 不能用了啊,怎么办啊?要知道,它以前输出空白的时候甚至没人反应过。

我有点纳闷:我不是解释得很清楚么,就那么一行字,您就不能看看?
后来我意识到,我们两都是典型的 Unix 的想法。就是认为,有问题你给它暴露出来,说明白咯、别藏着掖着。

但是用户有很多是 Windows 的用户。Windows 的一贯传统就是,把问题都藏起来,我们的用户是温室里的花朵,千万别让他们见到任何风雨。在这种风格的影响下,很多 Windows 的用户只要看见跳出一串英文就觉得很怕怕,根本不会去看它到底在说些什么。

其实,之所以有这么一串字符,是因为作者已经考虑到了这种情况。他既然已经考虑到了,自然会做最优的处理。这有什么好怕的。
反倒是那些出了问题也默不做声的,很可能是因为作者的逻辑出了问题,他根本没有考虑到这一点。还有什么比这更可怕的?

有时候我很想说:Don’t panic!

我的激情与喜新厌旧

昨天 twitterFeed 抽风,居然将去年的文章推到 twitter 上去了。我忽然记起来已经很久没写 Blog 了。

其实,我对很多事情充满着兴趣。比如说某一个知识点,我常常想,哇这玩意儿太牛叉了!一定要把它搞懂了、弄透了。然后开始幻想,如果这一切都了然于胸,自己将会多么牛叉。激情也就跟着来了,为了探个究竟,可以茶饭不思、夜不安寝。

按理说,我应该有很多话题想说的。可是偏偏,我又很“喜新厌旧”。无论之前觉得多么牛叉的东西,等到回过头来,都觉得不过尔尔,真的是沧海一粟、不值一提。大概这就是我的 Blog 好几个月才有一次更新的原因吧……。

虽然我对“物”喜新厌旧,但对“情”却是很怀旧的。这个 NN 年前的 Blog 的模板,我常常想换掉,常常打算换成独立 Blog,但都一直没舍得。自从与 Blogspot 并肩作战已经过去了 5 年,虽然成功地逃过了 GFW,但我与 Google 之间脆弱的协议,早已荡然无存。啊?什么???^H^H^H^H^H^H^H^H^H^H…..

P.S. “最近” 参与的一些社区活动:

Firebug 简体中文化。firebug 就不用介绍了吧。值得一提的是,虽然官方只写了我一个人的名字,但其实我开始这个项目的时候,已经有一些基础,并不是从零开始。作者说,是人家给他的,不知道是谁。。

Adblock PlusChinaList 维护。更不用介绍了。。一开始是一个台湾同胞维护的,不知什么原因他“失踪”了,我就接了下来,后来又成功地引诱了两个人加入~~。ChinaList 易主之后,有了天翻地覆的变化。很遗憾的是,它居然没进 ABP 的默认列表,偏偏我又是个不喜欢争的人。希望有一天作者会发现,我们维护得是多么认真负责,ChinaList 绝对算得上是列表中的典范。

e2fsprogs 简体中文化。e2fsprogs 是 Linux 内核中操作 ext2/3/4 文件系统的一系列工具的组合。比我想象的慢了不少,但是争取每个疑点都实际测试过后再作定夺。质量优先,慢就慢点吧。

加入 GAppProxy 项目。GAppProxy 最近才热起来,但其实这个项目开始已经快一年了。

AutoProxy。是 FoxyProxy 让我产生这些想法的。当时,我一方面欣赏 FoxyProxy 的强大,一方面又对它很不满。我就在想,一个“完美“的代理扩展应该是个什么样子。后来我把想法告诉了 FoxyProxy 的作者,费了老大的劲(几千的词汇量?)。他表示很有兴趣,但是好几个月过去了根本没动手。有个说法,这个东西 scratched my itch。我猜测其实他并不需要代理,自己都不是自己作品的用户,做起来自然没多少动力。原打算给 FoxyProxy 提交几个 patch 的,但是我对它的界面跟实现都很不满意。
AutoProxy 的传播超出了我的预料,本来只是打算非常小范围地测试一下看看反馈,毕竟很多想法还没完工。好在,从各方面反馈来看,没有什么大的问题。主要是菜单设置不合理,缺乏应有功能。这本来就在我的计划之中,正是下个版本首要解决的任务。

GNU 25周岁,生日快乐!

好久没更新了,感觉要学的东西太多,还没到总结的时候。:)

下面是刚刚发在哲思邮件列表的话,当是一次更新吧。

GNU生日快乐

—————————————————————————————————————————

争辩是最没有意思的事。
大部分的辩论不是为了证明真理,纯粹是为了打败别人保卫自己。

当私有软件横到我的面前,第一选择就是拒绝。

与其哭天喊娘请求别人开放自由,不如去做点实事。自己开发的东西,爱用什么协议用什么协议。
所以各位 idealist,最重要的还是努力提升自己的实力。当你成功了,俗人们自然会跟随而至。

这世界的主要组成部分,都是那些没有原则的人。他们会说,不自由又怎么样,不就是个软件么,又不是很了不起的事。尊严就是这样一步步地丧失的,就像那只温水里的青蛙。

我的想法是,自己的原则尽量坚持,旁人爱用什么用什么,你的自由关我什么事。

当然,这是很自私的想法。我做不到:
舍得放弃 MIT AI LAB 的工作;
一无所有、孤立一人的情况下宣布 GNU 这样庞大计划的气魄;
夜以继日、年复一年地 coding,不领一分工资、无视物质诱惑;
永远精力充沛、毫不厌倦地向各色人等宣讲自己的理念;
……
…………
所以,我敬佩他。这个世界正因为还有这样的理想主义者存在,才可能变得更加美好。
同时,我也感谢他,因为我正享受着 GNU 带给我的自由。

当然,不一定他提倡的所有的事都能做到,但做不到不代表不赞同。
譬如 Adobe Flash Player,有的人一边用着一边享受着被强插的快感。
但我使用它,更多地像是被监禁。Gnash 或是其它可替代的自由软件成熟之时,即是我越狱之时。我一点都不觉得处在这狱中是理所当然,并时刻准备着逃离它。
那一天,我会学着喊一句:Freedom!

对 Open Source 误解与批判

读了OSI 对于Open Source 的定义,我发现原来我一直误解了开源运动,开源软件定义基本是符合自由软件精神的。想当然的理解害死人啊。

Open Source 当年为了避免Free 这个词的歧义给人的误解而诞生,为了忽悠更多的企业参与,他们鼓吹开源的开发方式多么强大高效。

现在来看,成效显著,但却误导了更多的人。丢弃了自由软件对于社会心理、道德和自由精神的关怀。
那些成天把“开源”挂在嘴边的人们,你应该明白对于用户——你,这意味着——“freedom”。
如此,类似这样的问题才能少一点、再少一点:“我只是个普通的用户。我的目的就是让软件更好地为我工作,对源代码没兴趣,开源对我有什么用?”

诚如RMS 所言,人们害怕提及“自由”这样的字眼:Why “Open Source” misses the point of Free Software?

哀悼

死亡

摄影集《生命的肖像》:

2005年12月,辽宁教育出版社引进了摄影集《生命的肖像》,作者是德国摄影师瓦尔特·舍尔斯(Walter Schels)。我今天才看到,非常震动。

这本摄影集专门拍摄死者。每个人拍摄两张照片,一张是垂死的时候,另一张是过世的那一天。两相对比,效果非常强烈,你会感叹活着和死了是多么不同,你会追问自己到底什么是死亡!

记录下死者最后的面容,这就是这本《生命的肖像》的主题。

舍尔斯感到,我们这个社会有一个严重的缺陷,就是将那些垂死的人们排除在社会之外,仿佛他们已经不是人类了。他用这本摄影集,提醒人们关注这个问题,关注那些默默的、痛苦的、等死的人们。我们每个人都会有这一天。

在发文之前,我就知道这个话题很阴郁,这些照片本身也有点阴森(尽管它后来被选为德国年度最佳肖像作品),有的朋友可能不想看到。但是我还是想贴,而且今天还想接着谈谈我的感受。

我一直感到,我们这个社会不愿意谈论死亡。当然,不是真的不谈,而是将死亡说成好像是其他人的事情,完全用一种与己无关的口气在那里说。一个明显的例证是,当死亡发生,人们总是安慰家属节哀,但是好像没有人意识到,这个时候最悲痛的那个人正是死者本人!我们为什么不去关心死者怎么想呢,为什么不去思考怎样安慰那些将死、甚至已死的人们呢?

法国哲学家萨特在回忆录《词语》中说,在28岁之前,他从来没意识到有一天自己会死。但是,等他意识到以后,他觉得生命从此就不一样了,他看世界的方式完全变了。苹果公司的总裁乔布斯说:“生命很短,几十年,然后你就死了,你明白吗?”是啊,你明白吗,如果我们没有做好死亡的准备,那么其实我们也没有做好活着的准备。

My Comment:

这个话题,还有那些照片,确实很阴郁。

记得我看前一篇的时候,刚看了个头,就赶快换到下一篇文章去了。

但是之后又忍不住换回来细细读完。越读越认真,最后决定把它分享给其他人。

死亡是所有生物最终极的无奈与悲哀。我曾亲见过一只猪寂静地看着它的同伴死去而悄然落下泪来。况乎人类。。

人的一生当中,我们可以犯很多很多的错误。只要你有足够的勇气,大不了重头再来。但是当死亡来临,便再也无力抗拒。那是无穷的夜幕,徒留深深的悲凉。

后记:

记得我还在读中学时,就经常想到死亡的问题。想着想着就会流下泪来,觉得很悲哀。有时这种悲哀感会越陷越深,就像跌进无尽的深渊。时间越长、速度越快、陷的越深,四周越发黑暗,渐而感到恐惧。这时,特想找个温暖的怀抱,一头栽进去就再也不怕了;特想遇见一位大师,能够说服我死亡是件多么好的事情。可惜的是,面对死亡,没有终极温暖的怀抱。于是我说服自己不要再去想这样的问题,直至今日。

有人说,正因如此,我们要将有限的生命为人类做出卓越的贡献,以期流芳百世、传承千古。为善,的确是件伟大的事情。可是,这就是生命的原始意义么?我们穷其一生,就是为了流芳百世,为了别人评价我们是一名伟大的“科学家/哲学家/艺术家/革命家……”?

重要的是,“你”已经不存在了:你的身体不存在了、你的意识也不存在了。这个地球依然慢悠悠地转着,你却无法再回来看它一眼。
纵然你深深地爱恋,你热爱的人们,他们如今怎样?你热爱的这片地儿,你死后依然人来人往,你的幽魂可想再来逛逛?你喜欢的小吃,还是那么美味,却再也品尝不到。
纵然你学富六车、才高九斗。组成你大脑的那些分子,依然在这世上游荡,却再也无法组成一个整体,像你过去那样思考。你苦苦冥思的那些难题,如今被人攻克,你可想回来看看究竟?

对 GReader 之 "Share with note" 的评论,存个档

May 6

很好,很强大。。。抢 del.icio.us 的饭碗?
对用户来说,貌似很有诱惑。以前分享文章分两类,有 feed 的用 GReader,没 feed 的用 del.icio.us。这次整合,感觉不突兀,很自然。
其实受影响的站很多,比如最近豆瓣在大搞推荐跟分享。

当然,各个站的定位不一样。
del.icio.us 对于我来说,就是一个不设防的私人收藏夹。很多文章,并没有什么意义,甚至只是垃圾一篇。但考虑到某种原因(比如为了证明世上还有这么无耻的文章…)以后可能会用到,遂收藏之。
GReader 的 Share 就不能这么用。用 Reader 的目的就是为了阅读有价值的知识和资讯。Share 的原因必定是觉得写得不错,也许对别人有用。
豆瓣属于第三种了。它以社区见长,推荐的动机是为了交流,有强烈的意愿希望获得反馈。这就限制了它话题的广度和深度。有人分析过 digg 类网站趋同、趋俗的现象。
豆瓣有一点不同的是,它希望通过其它模块产生的用户行为分析结果,帮助用户从茫茫的信息海洋中过滤出适量的、符合个性化需求的信息。一个很好的想法。倒是建议豆瓣把“推荐”更名为“分享”,推荐是个很有心理压力的词儿,既然要向用户提供更精准的个性化信息,其源头自然要在广度和深度上尽量延伸。只是这需要足够强大的算法支持。

Feed 分享增加了评论跟 tag,相当棒。现在,针对一个热门文章,可以看到许多朋友伸出脑袋插话的现象了~。只是,,,Google 要托管所有评论么?想想有点邪恶了。。。虽然在 GReader 上的评论与在原文下的评论语境不同,但某些针对性不强的评论势必会产生困惑。在 Reader 上评论?在原文下评论?还是这边说完了再复制到另一边?豆瓣的“我说”就让我有点 confused(相对 twitter)。或许 Google 可以开放一个 api,使各个网站可以获取其任意页面在 Reader 上的评论(也许已经有了,没了解过)。其实,这样会更邪恶……。

最后BS一下,为什么不把 Google Notebook 上的数据搬过来,Notebook 现在显得重复了。

May 11, 0:57

Wiki 的提法有意思。
可以在原文的基础上改,然后这里就当是修改说明吧。
对同一主题不同人的修改加上相同的 tag 就类似版本记录了。

只是:
一、很多 blog 不是 cc-sa,这样做应该是不被允许的。
二、应该加强与 Blog 的整合能力。比如修改后的文章可以选择自动发布到自己的 blog;可以显示所有 Reader 用户对同一内容的评论,而不仅仅是好友(当然,有的人的评论不想被外人看,隐私设定);应该提供 api 使各网站可以查询并显示其文章在 Reader 上的评论(估计很难,相当于其它网站都在对 Google DDoS…Google云…据说很强,受得了么?做成了就NB了)。

May 11, 2:04

原来,阅读文章的时候,并不会自动显示好友的评论。

看起来,每一次评论都是包括全文内容的再发布,跟原 feed 似乎没什么关联。

这样来说,对于 Copyright 的文章,是不能 “Share with note” 的(即使未做任何修改)。或许删除原文只留一个链接,抑或留几个引用语句是可以的。

两个小问题(lcrypto, Py_InitModule4),记录一下~

一、cannot find -lcrypto
编译 fitx 时遇到的。一番 Google 之后,原来是指 libcrypto.so,而这个库属于 libssl-dev 包。
依赖里没有提这个包,装上后就没事了。

PS:因为 scim-python 是直接 make install 的,没有打包。fitx 依赖于 scim-python,我没有改依赖关系,而是用 dpkg -i –force- 安装。然后dpkg给出提示说:

dpkg:fitx:尽管有依赖关系的问题,但不管怎样,还是按照您的要求,继续配置:

不知怎的,我觉得这段话很好玩。有一种幽默感、亲切感、尊重感,还有……~~~

二、undefined symbol: Py_InitModule4
运行 awn-manager 时遇到的。这是配置错误,/usr/bin/awn-manager:

SITE_PKG = ‘/usr/lib/python2.4/site-packages’

将其中的2.4改成2.5就OK了。

原因是,python2.5 中,将 64bit 系统下的 Py_InitModule4 改名为 Py_InitModule4_64 了。改名目的是为了阻止2.4的模块调用2.5的解析器。因为2.5针对64bit机做了不兼容于2.4的修改,以支持 4GB+ 内存。

#if SIZEOF_SIZE_T != SIZEOF_INT
/* On a 64-bit system, rename the Py_InitModule4 so that 2.4 modules cannot get loaded into a 2.5 interpreter */
#define Py_InitModule4 Py_InitModule4_64
#endif

http://svn.python.org/projects/python/trunk/Include/modsupport.h

In Python 2.4, indices of sequences are restricted to the C type int. On 64-bit machines, sequences therefore cannot use the full address space, and are restricted to 2**31 elements. This PEP proposes to change this, introducing a platform-specific index type Py_ssize_t.

As the proposed change will cause incompatibilities on 64-bit machines, it should be carried out while such machines are not in wide use (IOW, as early as possible).

http://www.python.org/dev/peps/pep-0353/