2007年12月26日星期三

Picasa upload tool

以前在Windows用Picasa的时候,用客户端上传图片到picasaweb很方便,现在发现Linux版本的Picasa客户端没有上传功能。
所以我自己用API写了一个小程序,Java代码70行,支持创建相册、批量上传,使用及其简便。下面是ReadMe:

PicUp version 1.0 Readme

-What does this application do?
-Simple tool for picasa web. It helps you to create albums and upload picture files easily, just in console.

-How to install?
-Take these steps:
step 1)
Download the zip package from this URL
http://code.google.com/p/picasup/
and then extract all into a path whichever you like, for example /home/todwong/workspace/picUp/
step 2)
create an shell script file in $PATH, such as /home/todwong/bin/picup, type these into it:
/home/todwong/workspace/picUp/picup
step 3)
chmod +x /home/todwong/workspace/picUp/picup /home/todwong/bin/picup

-How to use?
cd into your folder with picture files, such as /home/todwong/pic/hangzhou/
execute this shell directly
picup
which refers /home/todwong/bin/picup
Now, input your picasa account info, and then determine whether to create a new album.
If you do, input y, and then it will create it with the title equals the current folder name.
Otherwise, just input Enter, in which case you means there exist the album with the title equals the current folder name already.
After that, the program will upload each jpg file in current folder onto this album, one after another.

-Can I use it in windows?
-Of course, but you have to create .bat files for convenience. Picasa client for windows might be a better choice, if you don't matter about his background process;p

Thanks to
http://code.google.com/apis/picasaweb

2007年12月23日星期日

resize jpeg in console

每次出去照相,回来就要处理很多照片,分批重命名可以在gThumb很方便的完成,但是他的"改变大小"工具一次只能改变一个文件。如果要批量压缩用于上传,则只好使用其他工具,我发现用命令行的convert命令非常快捷~
首先要安装convert,为了判断是否已经安装,可以测试convert --help
如果提示未找到该命令,则按照提示
sudo apt-get install ImageMagic
如果看到了好几屏的帮助信息,就表明已经安装了

然后进入你的图片的目录,随便找一个文件测试,比如叫test.jpg,执行
convert -resize 30% -quality 85% test.jpg test2.jpg
则转换好的文件命名为test2.jpg,去看看效果如何
可以调整参数resize和quality,感觉resize和文件大小呈2次方关系,quality和文件大小呈线性关系,没有严格统计过,因为后者应该和图片内容有关,resize后的尺寸到1024x768就够了,再大就马赛克了,除非你的相机真的很厉害(感觉现在傻瓜数码相机就是像素高,镜头差感光器也差,所以2MB的照片放大到100%根本没法看……)。quality不要设的太低,因为它和视觉体验不是线性关系,就是说,当你把quality从90%调成80%时,感觉图片没糙多少,但是从80%调成70%时,就觉得图片明显变糙了。(谁来做个视觉心理学实验?)


最后就是批量转换,最爽的时刻到了。参考http://www.ibm.com/developerworks/cn/linux/l-graf/
mkdir resized
for img in `ls *.jpg`
do
convert -resize 30% -quality 85% $img resized/$img
done
[预告:下一篇将接着这个话题讲述如何利用picasa api编写java桌面程序,上传你的照片文件夹到你的picasa网络相册]

2007年12月21日星期五

Tunet的gtk托盘

为了方便地一键上下线,我给命令行的tunet客户端包装了一个gtk托盘小程序,在ubuntu7.10下测试通过。python代码只有40行。
操作非常简单:左键点击托盘文字切换上下线状态,右键退出托盘小程序。托盘文字显式Off时表示不在线(假设没有运行其他tunet进程),此时点击后上线,托盘文字变为On,此时再点击则下线,文字变回Off。
代码如下:

#!/usr/bin/env python
#usage nohup ./trayTunet.py &
import os
import gtk
import egg.trayicon

class TrayTunet:
   
    def __init__(self):
        self.txt = gtk.Label("Off")
        self.icon = egg.trayicon.TrayIcon("Tray for Tunet")
        self.eventbox = gtk.EventBox()
        self.eventbox.add(self.txt)
    self.eventbox.connect("button-press-event", self.clicked)
        self.icon.add(self.eventbox)
        self.icon.show_all()

    def clicked(self,widget,event):
        if event.button == 1:
            if self.txt.get_text() == "Off":
                self.txt.set_text("On")
                self.getOnline()
            else:
                self.txt.set_text("Off")
                self.getOffline()
        elif event.button == 3:
            os.system("kill " + str (os.getpid()))

    def getOnline(self):
        os.system("/home/todwong/bin/tunet -p /home/todwong/bin/bao-wangyuantao -t o > nul &")

    def getOffline(self):
        os.system("ps -C tunet o pid= | grep -m 1 . | xargs kill")

    def start(self):
        gtk.main()

if __name__ == "__main__":
    tray = TrayTunet()
    tray.start()

2007年12月13日星期四

Ubuntu起步随笔

掐指算来,从小学用DOS6,到后来一路win3.2,95,98,me,xp,2k3,我的操作系统升级换代很多次,但和许多人一样,始终没有脱离M$的圈子。第一次接触Linux,是去年在做Merssenger的时候,合作的需要,服务器是Linux,还要感谢王慧文,很多命令就是当时在实战中他教我的,还要感谢黄驰,他帮我澄清了许多Linux基本的概念。今年夏天在实习的时候,开发机是Linux,接触的更多些,掌握了Web开发所需要的基本操作。不过第一次用Linux做桌面,仅仅是从上周开始。

其实对于很多人来说,用Linux做桌面最大的障碍不是可能命令记不住,而是担心在Windows下干得很顺手的事情变得麻烦。其实真做起来的时候,会发现没有那么麻烦,下面是我这周的一些随笔,记录了我刚刚开始使用Linux的一点经验和心得,当然也走了不少弯路。谨备忘,分享。

起因是我的win2k3装了太多的东西,已经跑不动了,忽然又中了莫名其妙的病毒。于是鼓起勇气决心彻底换掉windows。我用的是Ubuntu7.10, 从自动化FTP上down的。下文假设已经安装好了,而且选择了中文登录。

上网第一
在学校上外网要用某客户端,称为tunet,俗称二校门,Linux版的有二个编译好的不需要安装的可执行文件,tunet和tunetpasswd,后者用来生成登录的用户名密码的密文,存在一个本地文件里,前者用这个文件登录,不用每次输入密码。还有要改一下配置,因为老楼这边不用端口认证。把
/etc/tunetclient/tunet.conf
里的enabledot1x设为0
搞定后准备一个登录批处理,省得每次输入老长的命令。
./bin/tunet -p ./bin/bao-wangyuantao -t o
-t是type的意思,o表示open开放登录

中文输入第二
默认中文输入法是没有的,要自己安装。
在新立得中安装这些:scim-tables-zh,scim-pinyin
然后在支持的语言中选上Chinese。
之后可能需要注销或重启一下。

打开方式第三
RAR
下一个rarlinux-3.7.1,把rar和unrar两个可执行文件复制到/bin下。据说40天过期,我还没想好怎么办。
chm添加程序xChm即可
Firefox多线程下载插件downthemall,超快
IBM智能辞典没有Linux版,推荐用stardict,很强大

开发第四
实习时虽然开发机是Linux,但是通常我是在Windows下code好后ci,然后在dev上update,有点小问题就用vim简单改一下,复杂的就不行了。
jdk我下的jdk-6u3-linux-i586.bin在命令行chmod后运行安装,一路yes。
下载Eclipse的压缩包,和Windows的一样解压缩后就能直接运行了,很方便:)
MySQL的Admin和Browser可以直接添加程序,但是Server要自己装,用下面一句话搞定
sudo apt-get install mysql-server
python解释器默认内置了哈哈,添加程序里还有IDLE。
gcc自带的居然不能用,需要这样
sudo apt-get install build-essential
然后还需要插入安装的光盘

虚机第五
有些事情还得回Windows做,我装了VirtualBox
去官方下载virtualbox_1.5.2-25433_Ubuntu_gutsy_i386.deb
双击运行安装
命令行输入sudo VirtualBox启动

综上,我还是比较菜鸟的。
话说回来,连我这样的菜鸟都能用Ubuntu做桌面,可见Linux普及已经指日可待啦~

2007年12月10日星期一

JavaScript 数组的 uniq 方法

一篇Blog中,realazy提到了这样一个问题:
给Array本地对象增加一个原型方法,它的用途是删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

形式化描述:
input
Array(size=N)
output
Array1=Array的无重复保序的子集,
无重复是指,对任意a,b属于Array1,a!=b
保序是指,若a在Array的下标小于b在Array的下标,则a在Array1中的下标也小于b在Array的下标
Array2=Array-Array1,保序
realazy给出了一个新解,思路非常清晰:顺序遍历访问每个元素,如果这个元素的值已经访问过了,则加入Array2,否则加入Array1。判断当前元素的值是否已经访问过所采用的方法是顺序遍历已经访问过的所有元素。
易见该算法复杂度约O(N^2)。

我在他的算法框架下稍微做了一些改进,关键在于遍历过程中如何判断当前元素的值是否已经访问过。在原数组值域为正整数且极差(range=max value-min value)不太大的条件下,可以采用简单的"桶"算法。
准备一个长度为range的boolean数组b,初始化全为false。对于原数组中每个值value,如果b[value]=true,则表明这个值访问过,放入Array2,否则放入Array1同时令b[value]=true。
这显然是O(N)的算法,代价是额外的空间复杂度range,而且要求原数组值域为正整数。
不难推广到值域为整数的情形,事实上只需考察桶号value-min(Array)即可转化为正整数的情形。

为了避免range太大造成的空间的浪费,在"桶"算法基础上改进为散列算法,具体说来是线性同余开散列法。目的是将值域压缩映射到一个可控的小的连续正整数子集中,同时保证不同的原象对应的相同的象的概率要尽可能小,也就是说桶与桶之间要尽量负载均衡。
例如这是一个值域为实数的散列函数:
key=hashFun(value)=Math.floor(value)*37%91
这仍然是O(N)的算法,(显然O(N)是所有uniq算法的复杂度下界),好处是可以控制空间的开销,而且可以适应非整数值域,只需要设计相应的散列函数即可。



下面是桶(bucket)算法的实现:
   var resultArr = [],
       returnArr = [],
       origLen = this.length,
       resultLen;
   var maxv=this[0],minv=this[0];
   for (var i=1; i<origLen; ++i){
       if(this[i]>maxv)maxv=this[i];
       else if(this[i]<minv)minv=this[i];
   }
   var blen=maxv-minv+1;
   var b=new Array(blen);
   for(var i=0;i<blen;++i)b[i]=false;
   for (var i=0; i<origLen; ++i){
       if (b[this[i]-minv]){
           returnArr.push(this[i]);
       } else {
           resultArr.push(this[i]);
           b[this[i]-minv]=true;
       }
   }
   resultLen = resultArr.length;
   this.length = resultLen;
   for (var i=0; i<resultLen; ++i){
       this[i] = resultArr[i];
   }
   return returnArr;
下面是散列(hash)算法的实现
var shuffler = 37
var beta=0.007;
var origLen=this.length
var bucketSize=Math.ceil(origLen*beta);
var hashSet=new Array(bucketSize);
var hashFun = function(value){
var key = (Math.floor(value)*shuffler)%bucketSize;
return key;
}
//init hashSet
for(var i=0;i<bucketSize;i++)hashSet[i]=new Array();
//
var ret=[],self=[];
var key,value;
var bucket,openLen;
var everConflict;
for(var i=0;i<origLen;i++){
value=this[i];
key=hashFun(value);
bucket = hashSet[key];
openLen=bucket.length;//if(openLen>1)return;
everConflict=false;
for(var j=0;j<openLen;j++){
 if(bucket[j]==value){
  ret.push(value);
  everConflict=true;
  break;
 }
}
if(!everConflict){
 bucket.push(value);
 self.push(value);
}
}
   selfLen = self.length;
   this.length = selfLen;
   for (i=0; i<selfLen; ++i){
       this[i] = self[i];
   }
//compute average bucket size
var lens=[],sum=0;
for(var i=0;i<hashSet.length ;++i){lens.push(hashSet[i].length);sum+=hashSet[i].length};
average=sum/hashSet.length;//watch lens,average
   return ret;


用k*10000个0~k*100的随机整数测试计算时间(ms)
k 1 2 3 4 5
realazy 240 693 1399 2301 3807
bucket 55 101 141 219 293
hash 214 411 654 844 1083
测试框架借鉴了http://realazy.org/lab/uniq.html
测试环境Firefox2.0.0.6/Ubuntu7.10/2.66GHzP4/1024MBDDR

2007年12月4日星期二

[笔记]豆瓣校园宣讲会

宣讲会上透露了不少信息,以下是断章取义。

一、概述
远景:帮助每个人发现最适合自己的未知事物。
用户群:中高端,千万人。不包括在网吧用QQ的。
盈利模式:和电子商务(当当、卓越等)分帐。未来要定向投放广告。
前辈:学亚马逊做推荐,现在GR也有推荐。推荐引擎在工业界和学术界都很领先。
核心:阿北,老板,搞物理的,洪强宇,技术,精仪的,王守�,算法,自动化的,搞TSP出身的。
创业精神:对风险的态度显著区别于IBM。
团队:纵向划分,每个人看一个产品,从最后台的SQL到最前台的HTML。scrum.sprint每周迭代。
有钱:不再找风投的话,而且没有意外扩张的话,豆瓣现有的钱还够折腾四五年。
有人:20人精英团队,技术7,算法3,运营5,产品3,营销2。其中6人来自清华。年龄平均27.2,中位数25。明年要翻番到40人。

二、技术
技术:前瞻性,第一个版本零访问的时候就能支持百万级了。
硬件:15台服务器全部自己攒,用指环王人物命名,数据挖掘有专用服务器,5台支撑起5M的PV
开发:python=很算法,为了性能一些挖掘算法用C实现,分布式:Web服务,缓存memcache,DB=mysql,存储。容器=lighttpd。搜索引擎=xapian。应用框架=quixote。
后台:大量脚本,monitor和spider。

三、算法
海量数据:十万电影,百万书,千万RSS,亿URL。
实验场:数据挖掘应用于社会化过滤器,协同过滤,聚类,关联规则,机器学习,文本挖掘,教科书上见得到的都有实验,此外最强的一点是利用社会网络进行挖掘,效果显著。
数据挖掘效果评估:不用学术界常用的指标hit rate而是用户反馈。
algorithm should facilitate rather than replace social processes

四、杂项
社会化:豆瓣的社会化网络是实用主义的,不构滥交友,也不复制真实关系,而是按兴趣把人们聚在一起。
开放:即将开放更多API,是Atom格式。暂时不打算开放数据,因为现在只有五千万,不够多?和netflix还比不了。

五、进去之后什么样儿
工作:每周40个小时。一三五要到公司,上午10点到下午6点。其他时间可以在家上班。要上班是为了保证足够的沟通时间。
讨论会:叫做Hall of fire,也是典出指环王。
腐败:每周有一笔钱必须一起糟掉。

六、怎么进
加入豆瓣意味着:高风险高回报机会。
待遇:比不过Google,但是相当有竞争力。(都说自己的待遇有竞争力)
简历:非常看重对open sourse的贡献。
面试:行业证书起副作用,看能力。问你以前做的事过程中,表现出你的聪明之处。问你一道编程题,考你逻辑思维能力。

2007年11月29日星期四

begin with the Prisoner's Dilemma

相信很多人都听说过囚犯两难问题,那是几乎在讲纳什均衡时必讲的例子。在亚当•斯密的假设下,这个问题有解,而且有初等的证明。如果你对这个问题本身兴趣,可以看这个网址
用我的话来说,就是你和他两个人在斗心眼儿,如果你坑他,那么两个人都得倒霉,如果你一上来就服软,则会被他弄死,他就很High,如果你保持不卑不亢,则他也不会怎么样。vice versa 。纳什说,如果你有理性,那么你就会保持不卑不亢。

这周自然辩证法的课上有个同学提到了另一个有趣的两难问题,关于上帝与石头的,相信也有很多人都听说过。其实这个是无神论者的诡辩,如果你对问题本身感兴趣,可以看这个网址,这个网址比较强
问题的提法是:如果上帝是万能的,那么他是否可以造出一块自己也搬不起来的石头?
形式上和罗素悖论很像:所有集合的全体不是集合。(请给出这个命题的证明,re贴证对了的有奖,上过集合论的除外,哈哈)

今天在某人的日志发现了一个生活中的两难问题,这个问题不是人为构造的,而是活生生的存在在每个人的成长道路上的。
如果真的了解我,就不需要我过多解释;
如果不了解我,那我就更没必要解释了。
于是误会就这么产生了。
从逻辑上看,没人会相信这种推理能够成立。但是生活中时不常又会陷入这种尴尬的局面。
解?可能说起来容易做起来难吧——主动沟通。

谨与 遇到和遇到过这个两难问题的人 共勉。

2007年11月22日星期四

SWT图模型可视化工具包

以前在Swing下用prefuse很爽,如今需要用SWT了,只好又在sf.net上寻觅良久,终于找到了"梦中情人"――JUNG
也许,图模型可视化算法在计算机图形学或计算机模拟中也是一个问题吧。记得当时看到prefuse里面有Force类,Spring类,很诧异它何苦为了一点交互可视化效果引入如此sophisticated的力学模型。印象最深刻的是,作者在NBodyForce 类的注释中非常学术地写道:
/**
* <p>Force function which computes an n-body force such as gravity,
* anti-gravity, or the results of electric charges. This function implements
* the the Barnes-Hut algorithm for efficient n-body force simulations,
* using a quad-tree with aggregated mass values to compute the n-body
* force in O(N log N) time, where N is the number of ForceItems.</p>
*
* <p>The algorithm used is that of J. Barnes and P. Hut, in their research
* paper <i>A Hierarchical  O(n log n) force calculation algorithm</i>, Nature,
*  v.324, December 1986. For more details on the algorithm, see one of
*  the following links --
* <ul>
*   <li><a href=" http://www.cs.berkeley.edu/~demmel/cs267/lecture26/lecture26.html">James Demmel's UC Berkeley lecture notes</a>
*   <li><a href=" http://www.physics.gmu.edu/~large/lr_forces/desc/bh/bhdesc.html">Description of the Barnes-Hut algorithm</a>
*   <li><a href=" http://www.ifa.hawaii.edu/~barnes/treecode/treeguide.html">Joshua Barnes' recent implementation</a>
* </ul></p>
*
* @author <a href="http://jheer.org ">jeffrey heer</a>
*/

如今的"用户"比较仁慈,他说不需要交互,我终于大松一口气,可以不用再去管弹簧啦!
然而打开JUNG的Layout引擎的代码,我又被他折服了。先看看类定义,非常OO
public class FRLayout extends AbstractLayout implements LayoutMutable
再看一眼注释,非常简短两行
/**
* Implements the Fruchterman-Reingold algorithm for node layout.
*
* @author Scott White, Yan-Biao Boey, Danyel Fisher
*/

搜一下这个算法,发现也是有来路滴~
T. Fruchterman and E. Reingold
Graph drawing by force-directed placement.
Software--Practice & Experience, 21 (11), pp. 1129-1164, 1991.


2007年11月21日星期三

迅雷的明天会更好,后天呢?

上周讨论班,竟然讨论的是迅雷。
我非常看好迅雷,因为中国互联网一向是流氓的天下。我用迅雷有着充分的并且简单的理由,就像我用QQ一样:我用QQ是因为我的朋友在用QQ,我喜欢GTALK但是我的朋友不用,我用迅雷是因为用迅雷什么都能下而且下得就是快,我喜欢eMule但是用它下东西太慢。
健明不同意,他把迅雷比作垄断资本主义,把电驴比作人民公社。当然,他赞赏的是电驴的共享理念,人文精神。不过,在我看来,人文精神在初级阶段提,太超前了。迅雷更懂得最广大网民的迫切需要,他是一个工具,好用的工具,大家就用了。我敢打赌,在可以预见的相当长一段时间里,迅雷还会增长。
健明指出,迅雷缺乏滥用网络资源,走的是一条不可持续发展的道路。确实,当迅雷包揽了所有的下载入口,那些下载网站的广告位就没人要了,所以有人指责迅雷是盗链王。而且,当迅雷支持BT和ED2K以后,eMule社区、BT社区都很不爽。我也发现,VeryCD的资源用电驴下还不如用迅雷下快。
迅雷潜在问题,在缺乏用户粘性。假设存在一个开源的绿色软件,比如叫FreeThunder,迅雷能下的他都能下,而且下得不比迅雷慢,就是没广告,你说大伙儿用哪个?我相信中国程序员的反汇编能力,相信已经或即将有一个像珊瑚虫一样的去广告版迅雷。(然后出现一堆打着去广告版迅雷的旗号发放去广告带木马版的迅雷的垃圾软件……)
为增加用户粘性,社会化下载是出路吗?我以为不然。下载者关心的资源的丰富和下载的速度,也许并不关心朋友们在下载什么,或者更多时候下载者并不希望朋友知道自己都在下载些什么。

迅雷的P2SP技术可以给我们很重要的启示,那就是拿来主义。其实很久以前就有博客搬家工具,Facebook等SNS支持msn联系人导入等,都是把其他原有的服务资源、内容直接复制过来。拿来,为我所用,是新事物扩张的有力手段。但是,损人利己、零和博弈不是我们愿意看到的。我们希望互联网的使用价值总和是增加的,比如,当迅雷用户下载电驴资源的时候,也默认允许电驴用户下载迅雷的资源,即真正的对等共享。这样才能实现两个P2P下载阵营的双赢。互通有无,取长补短,合理竞争,共同提高。踩着别人的脑袋往上爬,损人品。
SNS阵营其实也并非不能实现共赢。比如提供跨社区实体绑定,可绑定的实体包括用户、好友、Blog等。YY一下:
我在Fanfou上留了一条消息,然后我在hainei上绑定的帐号下,也多了一篇新的迷你博客,同时xiaonei的我也多了一个新的日志。
我在xiaonei上加了一个小学同学,xiaonei发现他也用hainei,然后我和他自动也成为hainei的好友了。
一天我在手机版hainei的朋友换手机号了,然后,我的手机通讯录里他的号自动更新了。
……

统一通讯的梦已经做了很多年,还没有实现。现在又做起了统一社区的梦,不知道opensocial能走多远,还是成为openid一样的鸡肋?
迅雷的启示,预示着统一下载的梦离现实越来越近了。
期待着,天下大同。

2007年11月5日星期一

笔记:体验项目经理

笔记:体验项目经理
前天去听了一个讲座,下面是整理的笔记

时间:11.3(周六)晚上7:00-9:00
地点:就业中心报告厅2
嘉宾:管延放,微软亚洲工程院资深项目经理
Alvin Guan
ATC Mobile Media Team
05年春毕业,PM至今

一、四种PM
1.Feature PM
带领2~3(小)5~10(大)人的开发团队
Tester:Dev=2:1

2.Partner PM
与外部合作伙伴沟通

3.Release PM
协调多个Feature team为一个发行版工作

4.杂
部署等其他事宜

软件工程三要素:质量、费用、进度


二、PM的使命
predictable
glue the team
cover all(大家都没想到的你要想到)
让大家能专注与自己的工作
用通俗语言回答上级领导的问询

任务
在大家开始工作之前做visioning,考虑市场、客户、对手
管理开发进度
做communication hub
解决疑难问题,处理问题升级

小兵也要有全局意识,主人翁意识,看到问题及时报告,才有机会提升
说服别人:对比分析,学会在必要时放弃自己的偏见,合并大家的意见
不要什么都自己扛
技术专家才是真正的leader
项目可以失败,团队不能失败,不要压榨他们,学会诱导他们主动加班
让他们认识到工作的重要性,培养主人翁精神,才能调动他们的积极性

在微软有一半的人一辈子专注于一个领域的技术

三、PM三大基石
理解技术
理解用户需求(知道最有价值的用户需要什么,而不是自己认为好的)
会管理团队

上层建筑:leadership,communication(言辞达意)

四、PM成长要素
7工作中摸索2与别人交流1training
微软公司内部有Mentorship的机制,类似一帮一,师傅带徒弟(由HR组织)

正反馈循环:
做事情
经验丰富
能力提高
升职
做更重要的事情

pm->vp
pm v.s. ae:pm偏向于需求与沟通,ae关心架构,是资深dev出身。pm->ae > ae->pm

图为与pm有关的组织结构,虚线方块包围的部分表示一个feature team

2007年10月9日星期二

【速记】听讲座-关于简历

联想,田雅琳

招聘者看什么
相关工作经验、与工作匹配的能力、曾经的项目
one of 个人成就、课外活动
除了学习工作还干什么

简历要写什么
联系信息、照片、教育经历
专业(成绩可选)、社团
实习、兼职经验
荣誉、"特异功能"

格式
就一页
12号New Rom

作文
多用动词

Star
场景、任务、行动、结果

2007年9月16日星期日

load a pic with as 3

ActionScript3看起来更像一门程序设计语言了
//load a pic
var url0:String = "http://avatar.fanfou.com/l0/00/3f/v2.jpg?1188900628";
var url:String = " http://a1vatar.fanfou.com/l0/00/3f/v2.jpg?1188900628";


LoadPic(url);

function LoadPic(url:String):void {
    var requeste:URLRequest = new URLRequest(url);
    var loader:Loader = new Loader();
    configureListeners(loader.contentLoaderInfo);
    loader.load(requeste);
}

function configureListeners(dispatcher:IEventDispatcher):void {
    dispatcher.addEventListener (Event.COMPLETE, completeHandler);
    dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}
function ioErrorHandler(event:IOErrorEvent):void {
    trace("ioErrorHandler: " + event);
    LoadPic(url0);
}
function completeHandler(event:Event):void {
    trace("completeHandler: " + event);
    addChild(event.target.content);
}

2007年9月15日星期六

My Desktop

利用Windows自定义桌面的Web元素,做了一个Todolist小工具。
可能只适合我这种不用壁纸的Windows用户吧。
存储列表简单地使用了Cookie,不一定适用于所有用户。
CSS滤镜的光效还是挺有趣的,呵呵。


<style>
body{
    background:background;
}
textarea{
    background:infobackground;
    color:windowtext;
    position:absolute;
    top:0px;
    left:0px;
    width:100%;
    height:100%;
    border:0px;    
}
</style>
<SCRIPT>
function w(txt){
    if(event.keyCode==10 ){//Ctrl + s    保存
        document.cookie = "s="+encodeURIComponent(txt)+"; expires=Fri, 31 Dec 2999 23:59:59 GMT;";
        saveit();
    }else if(event.keyCode==17){//Ctrl + q    隐藏
         t.style.display = "none";
    }
}
function saveit(){
    t.style.color = "graytext";
    setTimeout("t.style.color = \"windowtext\"",500);
    alert("保存成功");
}
function lightit(){根据鼠标位置给光
    r=Math.sqrt(Math.pow(event.clientX,2)+Math.pow(event.clientY,2));
    r=r/86;
    x=event.clientX/r;
    y=event.clientY/r;

    turnoff();
    t.filters[0].addCone(-60,-60,12*(1+r), event.clientX/2,event.clientY/2,255,255,0,10,22.5);
}
function turnoff(){//关灯
    t.filters[0].clear();
    t.filters[0].addAmbient(90,140,210,90);
}
window.onload=function(){
    t.value=decodeURIComponent (document.cookie.substr(2).replace(/;\sshowInheritedProperty\=false/mg,""));
    turnoff();
}

</SCRIPT>

<textarea onkeypress = "w(this.value)" onmouseover="this.focus();" onmousemove="lightit()" onmouseout="turnoff()" id="t"  style="filter:progid: DXImageTransform.Microsoft.Light();"></textarea>
<span>Note</span>

2007年9月9日星期日

Trackback的思考

曾经幻想过一个Blog服务统一的局面,然而没有,反而出现了越来越多的BSP。竞争的格局一定程度上促进了UE的改进,然而并没有很多本质的提升,反而在倒退。缺乏统一的规范,许多Blog的功能不互通,很影响Bloggers的交流。TrackBack Ping禁用,订阅缺乏可定制性,发布方式单一,备份和搜索的欠缺,太多基础的问题需要BSP考虑。
其中我认为TrackBack Ping作为Blog的最具革命意义的发明之一,一直以来没有受到Blog服务设计者足够的重视。我认为它重要,原因如下:
1、 Trackback符合以个人为中心的内容生产理念。Comment,只是对Topic author的贡献,这部分信息量不属于Comment author。人是自私的,他们希望占有自己生产的有价值的信息。很多Blog topic下面的comments是垃圾,正是因为发布者对自己生产的内容可以不负责任。
2、Trackback ping让Topics之间的拓扑可结构化。这对搜索引擎是个福音。这是内容挖掘,乃至关系挖掘的物理基础。网络内容的可结构化,内容之间关系的可结构化,意味着怎样的商机?
3、Trackback在学术讨论中应用,蕴含了一种学术道德――被引用者有权利获知自己生产的内容被用于何处,这是对内容生产者的尊重,更是对内容生产者的激励。
[以上部分摘抄自我的 sohu blog,以下部分是在Blogger续写的]

Trackback现在的困境主要是缺少服务商支持。这种局面好比几年前传统新闻门户不支持RSS订阅一样。慢慢地,传统新闻门户发现用户有订阅的需求,或者说发现越来越多的用户已经养成了"阅读摘要"地习惯,自然努力做好RSS的支持。有一派悲观的论点认为Trackback是被垃圾TB消息搞死的,就是说,因为TB不需要身份验证所以spam的成本非常之低。本人在本地写个html网页在用XMLHTTP就可以Trackback ping,本人以前实现过。
但是,TB的spam和comment的spam并没有本质上的差别。anti spam的障碍不再技术,而是在用户习惯,当用户养成TB的习惯后,服务商投入精力解决技术的问题不是难事。

我认为 .Text的做法很可取,根据发表文章的正文自动识别trackback ping target。不开放给用户trackback的接口。
比如只有经过认证的用户才能使用这项服务。不同的服务商之间采用IP白名单制度实现无spam互通。

2007年9月8日星期六

How to merge Gmail

需求:
用户A有两个Gmail,记做x和y,今需要merge x to y,即将x中的邮件(除Gtalk聊天记录以外的所有邮件)转发到y。
解决方案:过滤器+outlook中转
1、在x中设置过滤器,将今后x收到的邮件自动转发到y
2、将x的所有邮件转移到收件箱,用于outlook下载。
3、在选项中设置POP接收所有(包括以前的)
4、添加outlook邮件规则,将收到的x的邮件自动转发到y
5、添加outlook邮件账户,输入x的账户信息,收邮件,自动把每封邮件转发到了y
6、删除outlook邮件规则和账户信息
至此merge x to y完成!

2007年8月28日星期二

php文件函数的通配符

试一试
echo file_get_contents('d:\ab.*');
如果有多个文件匹配,仅打印第一个文件。规则未知。

2007年8月9日星期四

HTML表格的游戏

画一个回形的图案
<table border="1">
<tr>
<td colspan="2">1</td>
<td rowspan="2">2</td>
</tr>
<tr>
<td rowspan="2">3</td>
<td>4</td>
</tr>
<tr>
<td colspan="2">5</td>
</tr>
</table>
呵呵,是不是很有趣?

2007年7月22日星期日

Squid2.6实践初步

本实践旨在用squid反向代理,来做cache前端。
测试用例:
客户浏览器:162
cache:107
original webserver:200
今200上静态图片需要cache
server来分流,host为avatar.mydomain.com,在162的etc/hosts将avatar.mydomain.com指向107。实际应用中不可能配置用户dns,这项工作应该在mydomain.com的dns上完成。
现在的任务是配置107上的squid,充当cache
server,当162正常请求avatar.mydomain.com时,如果107已经保存了此uri的图片,且尚未到达cache时限,则107直接response,否则向200请求改图片,然后relay给用户。当用户请求并声明no-cache时,squid总是请求原始图片。

一、wget http://www.squid-cache.org/Versions/v2/2.6/squid-2.6.STABLE14.tar.gz
按照
http://home.arcor.de/jeffpang/squid/chap03.html#a5(注意此为2.5版本的指南,一定要看新的release
note!)
的说明来设置、编译、安装。默认路径在/usr/local/squid/
如果是在windows上,可以下载已经编译好的版本
http://squid.acmeconsulting.it/download/squid-2.6.STABLE14-bin.zip
按照
http://www.acmeconsulting.it/SquidNT/
的说明来设置即可


二、修改配置文件
./etc/squid/conf
默认是代理模式,我们使用加速模式。
1、源服务器
cache_peer 192.168.0.200 parent 80 0 no-query originserver
2、本地监听端口
http_port 80 vhost
vhost表示携带host信息到源服务器,不加它的话,
请求都是192.168.0.200/a.jpg
而不是avatar.mydomain.com/a.jpg
如果二级域名avatar在apache中有用到,则必须设vhost。
3、权限控制
http_access allow all
为了安全,应该设置更精细些

三、过期
默认是三天过期
refresh_pattern . 0 20% 4320
为了防止over hit的情况发生,比较好的做法是给uri加时间戳,例如a.jpg?123456789

2007年6月23日星期六

浏览器兼容的Web矢量图形脚本库

tags: svg vml firefox ie opera js

abstract: 未来的Web体验将超越现在的xhtml,主流浏览器内置对矢量图形的渲染是重要标志之一。

对手1: Flash
浏览器插件普及率高,对流媒体支持好,但
swf二进制格式使得他与Web工作流的整合相对困难,应用逻辑的更改可能需要rebuild
swf内容生产者多是美工,他们创作动画习惯使用引导线、蒙版和滤镜等工具,而不是script
对手2: WPF
支持DirectX,对权限管理控制的好,但
浏览器插件不普及,内容生产工具昂贵

不久svg vml的方案很可能会向Ajax一样被人炒作,因为他们有一些相通之处:
1、浏览器无插件地支持
不同浏览器的Web矢量图形容器在抽象层高度一致,
在Ajax实现层中,IE有xmlhttp的ActivX控件,Firefox和Opera有XMLHttpRequest对象;
在Web矢量图的实现层中,IE支持VML标签,通过样式v\:* { behavior: url(#default#VML);
}渲染,而firefox和opera中有type='image/svg+xml'的object标签
2、不是新技术,但创造了新体验
Ajax是脚本代替浏览器地址栏去http get/post,无刷新和异步操作带来良好的体验。
Web矢量图是svg和vml两种古老的图形标记语言,相信交互可视化也可以带来良好的体验。
3、基础工作:脚本库的开发
Ajax的脚本库层出不穷,以prototype为代表,开发人员不必关心Ajax的实现,只需要在抽象层上使用他即可,降低生产成本
Web矢量图的脚本库也能找到,Igor
Krupitsky的工作似乎并没有得到足够的重视,下面是他发布的脚本库。(笔者测试,需要修改一些代码才能使用,而且需要手动调整才能支持opera)http://www.1delphistreet.com/vb/scripts/ShowCode.asp?txtCodeId=5607&lngWId=2
google code上有一些工作已经走得更远,如果你感兴趣可以去google一下svgvml3d

想象一下,在js中new Polyline是什么感觉?而且不需要Flash或Java Applet小程序?

2007年6月21日星期四

王子午说,密钥和私钥是两个概念

中午冲凉出来,遇到王子午,对门儿的"the will-be expert on infomation
security",我问他,密钥和私钥是什么关系,他说,是两个概念……

前几天,我信誓旦旦要把QQ协议搞清楚,因为工作中需要做这样一件事,从头说起:
设A,B为两个QQ用户,身份认证方式都是"需要验证"。
今A向B提出加好友请求,消息经服务器中转给B,B收到后回复给服务器一条消息(outpacket a8),服务器收到outpacket
a8后四件事:1、在A的好友列表中添加B,2、在B的好友列表中添加A,3、通知A说B已经同意你的请求并且加你为好友了,4、返回给B一条消息(inpacket
a8)说你同意A为你的好友的操作完成了。
利用ethereal+lumaqq debugger工具,可以成功解密inpacket
a8,正文内容和lumaqq接口定义一致,这里解密用到了B登录时服务器返回的Session
Key。但是无法用这个会话密钥解密outpacket a8,虽然这才是我想要的。捕获到的outpacket
a8是用另一种方式加密的,可能是密钥不同,也可能是算法不同。
一旦成功解密outpacket a8,就可以从接口直接完成"同意加好友并反过来加请求者为好友"的操作了。

密码学很有用,要求数学功底很深。王子午同学在数论方面很强,去了中科院安全所,令我十分钦佩。我不打算研究加密算法,但是基本的密码学常识还是应该具备的……

2007年6月20日星期三

显示一棵数组存储的二叉树

void show(){
int width=(size-1)*2;
int lbsize=lb(size);
int i=1;
for(int l=0;l<lbsize+1;l++){
int num=pb(l);
space(pb(lbsize-l)-1);
for(int k=0;k<num;k++){
cout<<a[i++];
space(pb(lbsize-l+1)-1);
}
cout<<endl;
}
}

创建main.cpp的宏

Option Strict Off
Option Explicit Off
Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module RecordingModule


Sub TemporaryMacro()
DTE.ItemOperations.AddNewItem("Visual C++\C++ 文件(.cpp)", "main.cpp")
DTE.ActiveDocument.Selection.Text = "#include <>"
DTE.ActiveDocument.Selection.CharLeft()
DTE.ActiveDocument.Selection.Text = "iostream"
DTE.ActiveDocument.Selection.EndOfLine()
DTE.ActiveDocument.Selection.NewLine()
DTE.ActiveDocument.Selection.Text = "using namespace std;"
DTE.ActiveDocument.Selection.NewLine(2)
DTE.ActiveDocument.Selection.Text = "void main(){}"
DTE.ActiveDocument.Selection.CharLeft()
DTE.ActiveDocument.Selection.NewLine(2)
DTE.ActiveDocument.Selection.LineUp()
DTE.ActiveDocument.Selection.Indent()
DTE.ActiveDocument.Selection.Text = "getchar();"
End Sub
End Module

2007年6月13日星期三

svn起步

参考http://www.phpchina.com/?1703/action_viewspace_itemid_2036.html
1、安装服务器端
http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
URL http://subversion.tigris.org/files/documents/15/36797/svn-1.4.3-setup.exe
安装shell客户端
http://tortoisesvn.net/downloads
URL http://easynews.dl.sourceforge.net/sourceforge/tortoisesvn/TortoiseSVN-1.4.3.8645-win32-svn-1.4.3.msi
2、服务器
创建仓库
svnadmin create D:\repository\subversion\multiring
在D:\repository\subversion\multiring\conf
根配置svnserve.conf,取消注释
账户配置passwd,添加账户
开启服务
svnserve -d -r D:\repository\subversion

3、客户端
到原来的工程的文件夹,import
到工作同步路径,checkout
修改后,commite
别人动过,我准备继续工作,在工作同步路径下update

2007年6月10日星期日

[zz]关于打开水的数学模型

 
 

Sent to you by 王元涛 via Google Reader:

 
 

关于打开水的数学模型

via aleck胡乱写... by aleck on Jun 01, 2007

不要说我变态,我先承认并自罚三杯,然后大家心平气和的听我讲述这个"打开水的数学模型"。

背景:紫荆9#楼一共六层,居住者数学系、物理系及其杂交的数理基科班学生数百人,其中平方数层(1、4)的水房有洗衣机,素数层(2、3、5)的水房有纯净水,当然,我们注意到6不是平方数也不是素数,所以在水仙花数层(6)什么都没有。看来主办方也很了解大家的劣根性,在安排布置上都显示出独特用心。故事就从次开始。

模型构造:本宿舍一共有3个开水壶,打开水的时候通常到4层水房。
水房的开水机比较独特,有两个出水口记为O1、O2,出水口单位时间的流量为F1和F2。开水机计费是按照时间来计的,两个口的单位时间费用相同,都为C分钱/秒。由于是机械操作,开关开水机的时候会有一定时间的误差,在这段误差内流量慢慢减小为零。开关是红外遥感开关,因此一旦发出停水信号就会停止计费,此时水不会立即停止,而是会慢慢减少到零。多流出来的一部分两个口子分别为R1和R2。计费最小单位是分。
目前已知F1<F2,R1=R2,如何构造最优打水方案。

模型求解
首先,出水口O1被完全抛弃,原因是大家都不是傻子,在O1打满一壶要0.30元,而在O2只需要0.17元。
其次,出水口02的使用方法值得推敲。
平时使用,一次性加满一壶水需要在计费到0.17元的时候关开关,此时流出来的水会刚好打满一壶。一壶水的容量为L=0.17/M*F1+R1,其中M为某常量,量纲是[价格]/[时间]。我们发现,机器有自动保护功能,打开开关之后至少需要0.04/M的时间才能关闭。以此为基础假定每次花费x的钱可以达到最大效益,有如下约束:

min T
s.t T/x * R1 + T/M*F1 >= L
x >= 0.04

求解可知x=0.04时就是最优解。

模型检验
最优方案构造:每次打开开关,放到0.04元将要变成(又没变)0.05的一瞬间,将开关关闭,此时会有一部分多余的水流出来,等流完了再重新开始。实践发现这样的方法只需要0.12元即可几乎打满,比原来的0.17甚至0.30分别降低了约30%和60%,极大限度的产生了经济效益。

模型不足
没有考虑时间效益,按上面方法操作会导致大水时间大大延长,但对于大四百般无聊的生活来说,也不失为一种调节。
没有考虑楼长的脾气,这样玩弄开水机可能会让她老人家发疯掉。

结论
1、学数学还是有用的;
2、要用知识武装自己;
3、做人要厚道;

 
 

Things you can do from here:

 
 

2007年4月25日星期三

哥本哈根

今晚去看了一场话剧《哥本哈根》,有几处印象极深
1、一段台词:有的人错以为弱小的国家的臣民的民族自尊心自然会弱些,还有人错以为邪恶的国家的臣民就不那么热爱自己的祖国。
2、我看着他看到的我看不到的
3、投影;中场休息
4、导演说,最煽情的未必是真实的,所以没有必要放到最后
5、海森堡说,我既是粒子,又是波
6、玛格丽愤怒地对海森堡说,"那是因为你不敢!"听到这句话我忽然感到一种极大的惶恐和不安,女人的尖锐。
7、滑雪的暗示――势不可挡,快感与畏惧,计算变得毫无意义
8、工科学生的快乐,理科学生的痛苦,文科学生的反思

2007年4月16日星期一

Miranda is nice!

赞美Miranda这个软件!
现在,我抛弃了Gaim,因为Miranda的插件对QQ的支持足够好,又不需要gtk,而且非常节省资源!
QQ,MSN都Merge到一个非常精简的界面中了。

2007年4月12日星期四

以概率执行的代码段

首先定义随机数静态类,防止每次new Random();
public class Rnd{
    private static Random _rnd=new Random();
    public static boolean p(double d){
        return _rnd.nextDouble()<d;
       
    }
}

使用起来很方便,例如
if(Rnd.p(0.2)){
             //do sth.
}
以0.2的概率执行一段代码。

这种方法也许在随机算法的实现中较为有用

2007年4月10日星期二

notify失效?

用wait/notify同步的时候,有时notify会失效?notify上下文语句都已经执行了,但是wait却没有过去,不知道为什么。
这个问题出现了多次,而且只有在跑好几个程序的的时候才发生。很奇怪……

2007年4月8日星期日

阳台山备忘

今天和宋老师一家去爬阳台山,早上八点启程,下午六点回城。
忘记带的物品:水果、湿纸巾、垃圾袋。
多余的东西:棉袄。
现在防火道查的很严,有摄像头,不硬闯过不来。我们没闯,买门票进来的。有强人云:管,是他们的义务,走路,是我们的权利。不禁汗颜。
上山时,能走土路就不走柏油路。下山时,石板路最令人精神崩溃,所以要走一些提神的有挑战性的路,比如必须手脚并用的路。
对讲机是很好玩的东西,可以听不认识的人群聊,谁也见不着谁,但是知道都在这个山里。
宋老师的女儿伊文从四岁开始爬山,体力比我好,宋老师更是多年的绿野元老,所以我常常不得不在后面追他们。
伊文听到对讲机里有人呼叫"山羊哥哥",自言自语:我还"绵羊妹妹"呢。让人忍俊不禁。



2007年4月6日星期五

LordKelvin的问题与水立方

今晚在建管报告厅有一个水立方的讲座,我去听了。原来里面还有数学物理的问题,LordKelvin提出的:如果我们将三维空间细分为若干个小部分,每个部分体积相等,但要保证接触表面积最小,这些细小的部分应该是什么形状?后来发现气泡泡很像,很符合物理直觉。不知道有没有人给出过严格的证明?
我感觉这个问题不是很简单,优化的目标和约束都比较好刻画,比如不失一般性取空间为单位正方体,做N等分体积的分割,目标是一个二重积分,约束是一个三重积分方程组,但决策变量怎么描述?所有可能的边界分布吗?这肯定是一个无穷维空间,即使考虑二维的问题,决策空间也是无穷维的……看来不得不用到泛函了。

2007年4月5日星期四

利用反射编写简单的Java Shell

反射和annotation是以前我很少用的功能。最近发现,利用他们可以做很漂亮的shell,在原型开发的命令行控制中,还是很有用的:)

例如最经典的一个命令:用help输出所有支持的命令
    @Description("查看命令清单")
    public void help(){
        //echo("命令与参数用一个空格分开,参数字符串中不得含有空格");
        Method[] ms=Shell.class.getDeclaredMethods();
        for(Method m : ms){
            Class[] cs=m.getParameterTypes();
            if(cs.length==0)
                echo(m.getName());
            else
                echo(m.getName()+" [par]");
            System.out.println("\t"+m.getAnnotation(Description.class).value());
        }
    }
其中Description是定义的一个annotation,从此我们发现,注释作为文档的一部分不仅仅是文本,而且是"有结构的"、"可编程的",还是javadoc文档的一部分。shell只用到其中很小的一点作用,这样声明

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@interface Description { 
    String value(); 
}


然后利用命令行输入的字符串,就可以执行相同方法名的方法了

String cmd = ReadLine();
Method m = Shell.class.getMethod(cmd, new Class[0]);
m.invoke(sh, new Object[0]);

大的框架是这样了,api细节参考jdk doc或google

2007年4月4日星期三

试用Google拼音输入法

上网收到twitter来得消息
http://tools.google.com/pinyin/index.html
Google竟然出拼音输入法了!互联网发展到今天,连操作系统的许多基本的构件,都被陆续拿到了网上。我们的互联网的依赖越来越深。想象有一天,当我们不能上网时,也许就像断水断电一样痛苦不堪了。

泛型・模版・类型安全集合类

模版技术是C++得很强的功能,模版类、模版函数等配合起来让程序非常简洁。
在C#中有了泛型的概念,和模版很像。
Jdk1.5以后也有了类型安全集合类的概念,为此我们甚至可以声明这样的接口
/**对象池接口
 */
public interface ObjectPool<E> {
    /**签入*/
    void checkIn(E e);
   
    /**签出*/
    E checkOut();
}

在模版符号E可用以前,我们可能用一个抽象类或接口。
/**可重用对象接口
 */
public interface Reusable {
    /**放回对象池中*/
    void turnBack();
   
    /**是否正在使用*/
    boolean isUsing();
}
但是通常后文免不了需要装箱,这样对性能和类型安全都是隐患。
有了模版,Java更强了。

2007年4月1日星期日

小心ByteBuffer的array()

今天调试程序,发现jdk中ByteBuffer与字节数组之间关系暧昧。
首先,同一个字节数组上可以构建许多个甚至重叠的ByteBuffer,他们在同一段内存上读写。
其次,这许多ByteBuffer的array()方法返回的都是同一个底层的字节数组,而不是他标记的这一段。
事实上,ByteBuffer通过如下三个字段来标记自己与底层数组的关系:
array
arrayoffset//起始偏移
capacity//大小

ByteBuffer完整控制对应的底层数组,当且仅当
arrayoffset=0且capacity=array.length

通常使用的时候,我们只用上面一小段,精细控制。但是别忘了他底层实现的机理。

2007年3月30日星期五

学通社的Feed

这是学通社的Feed,校园网里面为数不多的RSS源
http://snews.thu.cn/rss.xml

2007年3月29日星期四

eclipse 3.0 is too old

今天上午忽然被老板叫去,说我的代码在他的电脑上用不了。我觉得是他jdk版本太老了,他说已经是1.5了,叫我马上过去。
我过去一看,发现他的eclipse是3.0版,可以引用1.5的类库,但是编译器不认1.5的"新"语法,比如for(A a : arrayA)等等。
于是上sheenk.com下了一个3.2版,在看我的代码就行了。

现在jdk6,7都陆续出了,又有了很多新的特性。要是运行java程序不用客户端安装JRE就好了。

2007年3月28日星期三

yodao.com

今晚去听了一个yodao.com的讲座,笔记散列如下

UI法则:Don't make users think!
排序因子:除了page rank 还有访问量、点击流、DNS
Amazon有20%的收入来自他在网站上对用户推荐商品
网易97年到现在发展到2000余人,研发中心从2005年开始。
庄莉说:如果不会打桌面足球,你会死得比较抽象
豆瓣的实体概念很清晰(书籍、音乐、电影)
技术项:转载重复排除50%、骗排名、并发与容量的直积、至少索引200亿pages、不用比300ms快更多

他们要招的,还是工程师。
A paradise especially for engineer, not for me?

2007年3月27日星期二

RSS Reader online

前一段时间一直在用猫爪,因为它能够在我不上线触发的情况下,自动给我拉取Feed Data,当我上线时候,他已经给我准备好了。尤其是对于日更新超过items.length的Feed,用它非常合适。
然而我将opml导出,搬到google reader去了,因为界面更明快,UI更人性化,他根据你滚动条的移动,标记已读。

要是能像opera搜索就更好了。

2007年2月9日星期五

[新知]精神分裂症

精神病按照情绪表现分为三类,非别是躁狂症、抑郁症和精神分裂症。躁狂症,喜;抑郁症,悲;精神分裂症,时喜时悲。
今天看《A beautiful mind》,其中Nash的精神疾病是比较典型的妄想症,英文字幕显示为Hallucination,但是中文字幕却显示为精神分裂症,我认为欠妥。精神分裂应该用Schizophrenia。我至今从未见过精神病患者发作,但是表现出轻度抑郁症的症状的人却不少,那就是"郁闷"。郁闷没什么大不了,一阵凉风吹过,打个喷嚏而已。

2007年2月8日星期四

[琐忆]薛定谔猫

今天走在路上,遇到一只流浪猫从面前走过,忽然想起大一的时候,卢老师给我们讲过的"薛定谔的猫"的故事。
"一只猫关在一个钢盒内,盒中有下述极残忍的装置(必须保证此装置不受猫的直接干扰):在盖革计数器中有一小块辐射物质,它非常小,或许在 1 小时内只有一个原子衰变。在相同的几率下或许没有一个原子衰变。如果发生衰变,计数管便放电,并通过继电器释放一锤,击碎 一个小的氢氰酸瓶。如果人们使这整个系统自己存在 1 个小时, 那么人们会说,如果在期间没有原子衰变,这猫就是活的。而第一次原子衰变必定会毒杀了猫"。 
当时我就很不解,这是否是物理学家对数学上的"随机性"和自然语义下的"随机性"的理解产生分歧的结果呢?不,他反思得更深刻,那就是"量子纠缠"。
有兴趣的朋友可以看看这篇文章:
physics.nankai.edu.cn/grzy/suncp/kepu/q-cat.pdf

2007年2月6日星期二

[阅读]《中国社会的阶层分析》

今天拿到了一个9Mb之大的pdf文件,1997年经济日报出版社出版的高晓声的《中国社会的阶层分析》。作者将当时的中国社会不加定义地分为如下七个阶层:
  1. 资产者
  2. "买办"者
  3. 中产者
  4. 知识分子
  5. 平民和贫民
  6. 农民
  7. 黑社会
在我看来,书中许多事情已经和现在不太一样了,但是更多的现在仍旧。对于涉世不深的我们,它可以给我们很多多方面的、学院环境所不能提供的信息。更重要的是,现在的社会的中坚力量,正是成长在书中所描述的的一种社会状况中,了解他们的成长环境,对我们与他们交往是大有裨益的,从而,为我们取代它们成为下一代社会中坚力量给与间接经验的支持。
感兴趣的读者可以到这里去下载pdf
http://club.beelink.com.cn/dispbbs.asp?boardID=168&amp;ID=17535&page=1

[英语]Internet Boom in China Is Built on Virtual Fun

Source:
http://www.nytimes.com/2007/02/05/world/asia/05virtual.html?ex=1328331600&en=92496de3170c3303&ei=5088&partner=rssnyt&emc=rss

In the two years since Mr. Ma's company, Tencent, went public in Hong Kong, it has grown into a powerhouse that has crushed everyone else in the field.
crush in the field---在一个领域中挤垮所有竞争对手

"Well, they've got all the eyeballs in China. And now they're beginning to cash in on that."
cash in on---利用..捞好处

It is a world that now dominates the life of Li Meixuan, a 21-year-old college student in Beijing who became hooked on Tencent's QQ offerings in high school.
彻底迷恋上,就像上钩了一样。在我看来,这个词生动地反映了作者对Tencent的否定态度。

Tencent will not release statistics on how its Q-coins are doing, but analysts say the currency is so popular that an underground economy in Q-coins has emerged, even though the coins are not redeemable for cash. 兑现


技术提示:
可以在maozhua.com等在线RSS阅读网站订阅纽约在线,The feed for nytimes is " http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml"

[发现]如何使用Google的网页快照

具体操作可以在Google以"网页快照"为keyword搜索得到答案,本文解释其中的原理。
在Google搜索结果中,每个item下面都有一个"网页快照"链接,理论上通过点击此链接可以看到Google缓存服务器存储的该Web的HTML,即,不含图片等元素的网页。原理很像清华大学图书馆 学术信息资源门户提供的文献全文数据库,搜索引擎提供者不仅为海量信息建立了索引,而且提供了包含充分信息量的内容镜像,极大地方便了用户。 实际上,大陆用户却可能不能正常访问Google的网页快照,这是因为GWF(China's Great Fire Wall)对其进行了屏蔽。
屏蔽的技术细节非常简单,就是敏感字过滤,在这个案例中,过滤的可能是url中
/search?q=cache:
因为这是提取缓存的http get参数。
解决思路:crack the filtered word
解决方案:在?q中间加入其他参数,并且不破坏http get参数序列。例如
google搜索tsinghua wiki
得到第一个结果的网页快照链接为
http://72.14.235.104/search?q=cache:ls8NeFLhB8QJ:en.wikipedia.org/wiki/Tsinghua_University+tsinghua+wiki&hl=zh-CN&ct=clnk&cd=1&client=firefox
我们在?q中间插入ognize=true&
http://72.14.235.104/search?ognize=true&q=cache:ls8NeFLhB8QJ:en.wikipedia.org/wiki/Tsinghua_University+tsinghua+wiki&hl=zh-CN&ct=clnk&cd=1&client=firefox
输入地址栏,即可察看wiki对清华的介绍
技术提示:Firefox用户可以使用greasemonkey插件加载js代码来自动替换url,从而无缝地使用google网页快照。具体方法见Reference。
遗留问题:如果被缓存信息正文包含敏感字,或信息源被屏蔽,缓存页面仍然无法打开,例如,Google对中文wikipedia的缓存内容全部无法查看。

参考资料
www.williamlong.info/archives/634.html
www.klogs.org/archives/000290.html

2007年2月5日星期一

本Blog的用途

  1. 专注学术
  2. 读书新知
  3. 英语学习