Wednesday, September 29, 2010

[转载]渭南,我梦魇的30个日子


Sent to you via Google Reader

[转载]渭南,我梦魇的30个日子

玩聚SR还知道:



一五一十部落头条发表于2010-09-28 13:08:00

作者:郭于华 | 评论(0) | 标签:转载

谢朝平好样的!围观也是力量。

------------------------------------------------------------------------------------

原文地址:渭南,我梦魇的30个日子 http://blog.sina.com.cn/s/blog_6c865be10100llyf.html

作者:谢朝平 http://blog.sina.com.cn/u/1820744673

"我们是市领导派来的,案子办错了我不怕!"

8月19日,燥热。北京的空气异常沉闷。

我身着T恤短裤在电脑前整理资料。下午5时,敲门声响起,操着京腔的人说他们是搞人口普查的。妻子李琼打开门,七八个大汉立即蜂拥而入,问清我的身份后,一领头的厉声道:"把他铐起来!"一身穿白T恤和黑T恤的人扑过来,使劲朝后拧我的手。左手一阵剧痛,虚汗直冒,我奋力挣扎着。拧伤我左手的"白T恤"只好朝前铐住我的双手。我提高声音问:"你们到底是什么人?"一渭南口音说:"警察!""警察抓人也应先出示你们的证件啊!"

"白T恤"递上警官证。我这才知道,此人是陕西渭南市公安局临渭分局的王鹏。

在王鹏出示警官证的同时,他的同事刘延欣出示了自己的证件。"领头的"也说:"我是北京市公安局朝阳分局刑警队的陈旭,来协助他们执行任务。"

"这里是八宝山派出所的辖区,朝阳区的警察怎么跑来协助?" 在政法部门呆了十多年,我知道,跨区办案需要当地派出所的配合。我怀疑他们是违规操作,利用关系办人情案。

陈警官支支吾吾地答道:"只要是北京的警察都可以协助。"

"但根据规定……"我还要提出质疑,王鹏高声喝道:"闭嘴!搜查了。"

搜查前,临渭公安分局刑警大队副大队长朱福利想把我带走,我坚持:搜查我必须在场。他们只好把我留在现场。

翻箱倒柜的搜查在三小时后结束。王鹏要我在一张事先打印好的拘传证上签字。我很疑惑:"拘传证上怎么没有我涉嫌什么罪名?"王鹏答道:"非法经营!"

夜幕完全笼罩了京城时,7个警察抱着我的笔记本电脑和《大迁徙》书稿及上网卡、优盘等战利品,将双手紧铐的我塞进警车向朝阳区方向驰去。

当晚,临渭的警察们饭饱酒足之后,将我带进审讯室。我抚着伤痕愤愤地问:你们如此下狠手,把案子弄错了怎么办?

刘延欣得意地答道:"我们是市领导派来的,案子错了我不怕!也不会负责!"这位快言快语的老兄在渭南审讯时还"威慑"我说:"现在的科技多发达呀,你住在哪里我们通过你的手机就查到了。通过电话监控我们知道你在写书,你把书拉到渭南我们知道,你跟谁联系我们也知道。当晚为什么没有对你们动手,是想看你们把书究竟要拉到哪里……"

那一刻,公民的通讯、出版、言论自由被人偷窥侵害后的愤怒包围着我。

不过,我很快就平衡了:想想这些人也挺可怜——我是身躯失去了自由,他们却是灵魂失去了自由……



Regards,
Zigang Xiao,
Department of Electrical and Computer and Engineering,
University of Illinois at Urbana-Champaign

Sunday, September 26, 2010

理解scheme里的list與pair

(继续考古, 此为一年前写的备忘.)

首先,pair是最基礎的數據結構。

一個pair寫出來是點對的形式(a . b),形象地表示如下:

 /\
a  b

其中取左邊的元素用car,取右邊的用cdr。

因此,(1 . (2 . (3 . ()))),可以表示為

 /\
1 /\
 2 /\
  3 ()

在scheme裏面可以簡寫為 (1 2 3)

而 (1 . (2 . 3) ),則可以劃爲

 /\
1 /\
 2  3

因此簡寫為(1 2.3)

注意 點 與元素之間必須用空格隔開,否則如果是數字就變成小數了。
對: (1 . 2)
錯: (1.2)

cons 用於生成一個新的pair,如下:

(cons '(1 2) '(3) ) => ((1 2) 3)
   / \
  /   \
 /\   /\
1 /\ 3 ()
 2 ()


(cons '(1) '(2 3) ) => ((1) 2 3)
   / \
  /   \
 /\   /\
1 () 2 /\
      3 ()

(cons '1 '(2 3) ) => (1 2 3)

 /\
1 /\
 2 /\
  3 ()


可以理解為:生成一個pair,第一個元素直接copy,對第二個元素先去掉括號再copy過去。
也可以形象想為,把兩個參數分別作為左右子女掛到新的root上。

而list可以想像成把元素逐個作為左子女貼上去,如
(list 'a 'b '3 '4) => (a b 3 4)

 /\
a /\
 b /\
  3 /\
   4 ()

THE SCHEME PROGRAMMING LANGUAGE里面一个continuation的例子

继续发躺在邮箱里死掉的文章……

----------------------------

(define retry #f)

(define factorial
  (lambda (x)
    (if (= x 0)
        (call/cc (lambda (k) (set! retry k) 1))
        (* x (factorial (- x 1))))))


這裡定義了一個階乘,而continuation位於階乘遞歸展開后的最後一步。
以x=4為例子,執行如下語句得到:
(factorial 4)
=> 24
(retry 6)
=> 144


其中,第一句執行時,展開應該為:
4*3*2*1*1
                 |
            *得到的continuation在這裡* 最後的1是call/cc的返回值

因此,當我們保存了這個continuation到retry時,
再次應用retry到某個數,如上例的6,則返回到剛才的計算中,
此時計算已經進行到4*3*2*1*?
最後的?應該是call/cc的返回值,因為我們應用retry到6,所以這時最終的展開式變為
4*3*2*1*6
因此,求值得到了144.

理解:在call/cc里,每次apply continuation的變量名(記為cont)到某個值時,從call/cc返回,並且返回值是這個值。
當再次apply cont到某個值時,這個值作為call/cc的返回值,回到call/cc(continuation)定義的地方繼續執行。

Saturday, September 25, 2010

老文: A gentle interpretation of continuation

Ivan: 写完后想完善, 但是后来一直没有继续. 在邮箱躺了一年后... 决定还是抛弃了...

------

Continuation 顾名思义,可以理解为继续计算。
我觉得这个概念可能是FP里最难理解的了。
很多文章介绍scheme的call/cc 我都沒看懂。
這兩天看到newsmth有人推薦看看python的yield時,
結合這篇文章,好像懂了點:
http://ttsiodras.googlepages.com/yield.html

总的来说,它给人的感觉有点像memoization,又有点像call back。
用我自己的话概括,就是能把当前计算的状态保存下来,下次要用到的时候可以接着计算。
如果单单只是保存一个状态,那似乎没多大作用,但是如果能保存很多个,那就似乎很方便了。

可枚举的对象可以看做应用场景之一。
正如文章里面提到的,考虑做一个Permutation Generator,
更抽象一點,考慮一個遞歸樹,我們在這個遞歸樹里搜索某些符合條件的節點(solution).
放到permutation generator里面来说,就是搜索叶节点。
但是我们希望搜索到一个solution时能"暂停"搜索,先返回到调用的程序里(callee)里
对当前得到的solution做一些操作,迟点可以回去继续搜索。
因为在递归树里面搜索是递归的,所以用正常的编程思路实现似乎有点困难。
而如果引入了continuation的概念,如果我们可以把当前的计算状态作为一个对象保存下来,
迟点回去继续,那就非常自然方便了。
给出一个伪代码如下:

searcher.initialize()
while(searcher.next()){
   // do some other...
}

這是一段很典型的constraint-programming style的代碼。
next()  的实现,就可以使用continuation的机制完成。

現在的程序设计语言基本上是一系列的函数调用过程,
因此整个程序的执行可以看做是在一个栈里面进行的操作,
当前的例程位于栈顶top,而调用它的例程位于top-1的位置。
而在支持continuation的PL里,程序的执行过程更像一棵树。
当执行到某个节点时,如果调用了一个例程,则从这个节点生成一个子节点并进入,
这个节点作为子节点的父节点存在;
返回时返回到父节点,但子节点仍然存在,以后有需要时可以重新进入到这个子节点继续计算。
此时程序的执行就不是结构化的了,所以说continuation有点类似goto。

Monday, September 20, 2010

為毛要用/usr/bin/env python,而不是直接/usr/bin/python

Q:一些python script的第一行會寫成:
#!/usr/bin/env python

而不是
#!/usr/bin/python

A: 因為不是每部機器的python都裝在/usr/bin這個path,並且一部機器也可能有多個python。
用第一種方法portability不好。

但env則幾乎都是裝在/usr/bin,它能正確找到python的地址並調用,同時還可以使用name=vaule的方法指定一些環境變量。
詳細參考manual。

是為記。

Sunday, September 12, 2010

【旧文】近距离接触美国嬉皮青年:Daniel同学二三事

这篇文章一直躺在邮箱里,之前写好想贴些相片的,但后来太忙就一直忘记贴。

------

这次去San Francisco,个人感觉最有意思的一件事就是碰上了Daniel同学。

第一次见到这个家伙时,他在房间里睡觉。
那时候没仔细看,只看到是一个留着山丘之王般的头发与胡须的家伙,所以一直以为他是大叔,后来才发现他比我还小一岁。

第二天早上,看到他在房间里收拾东西,便与他攀谈起来。
不说不知道,一聊吓一跳。这位同学大学毕业后就一直在流浪,现在打算在SF呆比较长的一段时间。
我们最先聊的是音乐。因为他自我介绍说自己是一位musician,主攻drum & keyboard,喜欢的genre是Jazz。
我一听就来了劲,能近距离接触美国乐手,这真TM cool。
向他讨教了关于调式音阶的一些问题,然后他给我介绍了不少出名的乐团,包括在SF发迹的Grateful Dead
后来还往我移动硬盘里塞了几十张专辑(作为回报,我给他塞了几部李小龙的电影)。
接着,我还玩了玩他随身携带的花$50买的Ukelele,不过不大会玩 :(

Daniel同学貌似家里非常有钱。因为他说他流浪在外没有赚钱,都是靠家里给的钱。

Daniel同学喜欢吸食大麻,他给我观摩了他们的作案工具:类似香烟的过滤器与一个奇形怪状的管状水滤器。
同时也给我介绍了不少相关的知识,比如LSD
不过他非常nice的一点就是,他没有强迫我跟他一起hi :)
Daniel同学嫌我们住的地方一天$25太贵,于是我们搬到了Mission Street上的The Elements,$19一天。
感谢他,在那里我遇到了很多好玩的人,比如一位来自丹麦与一位来自maryland的gay,两位来自Wales的ppmm,
一位来自以色列的流浪者,哦还有一位在KSU读书的潮州mm。

Daniel同学与他的SF朋友带我到了当地的hippie青年聚集地:Mission Dolores Park
在那里我见到了一群美国年轻人,或吸大麻,或kiss。颇有Woodstock feel。
Daniel同学欠我一美元 :)

非常遗憾的就是,没有跟Daniel同学来一张合照 :(

希望下次有机会再见。

Saturday, September 11, 2010

余以为:粤语是通用语,不是方言

轉載按:
談到中國語言問題時,如果稱呼粵語為方言,那麼從一開始就完全是錯誤的。
方言的定義,並不是由使用人數而定義,更不是由政治原因而人為定義。

----

在限制粤语和保护粤语的争论中,有一种声音认为方言应该和粤语一样受到保护。保护方言没有错,但是将粤语与其他方言等量齐观,就有问题了。

方言没有标准音,标准音是指那种脱离某一具体地域,而普遍被认同的发音。湘语、吴语、闽语、客语、赣语都没有标准音,每一座城市,甚至每一个乡镇都不相同。粤语却有标准音,全球公认的标准音。无论粤、港、澳,还是美加,粤语发音完全一样,只是个别词句有差别。

一般以为广州话就是粤语标准音,实际上广州存在大量操客家话的本地人,而且白话口音也五花八门,基本上每个区都不同。粤语标准音是受过较高教育的人士之间交流的口语,与生活用语有些微差别,好比北京土话与普通话之间的差别。粤语和普通话一样具备通用语的特征与功能。
(在廣東各個城市,粵語都被當地語言影響,以致發音、語法有略微區別。廣州話就是標準音,所以也被稱作省城話。各地的口音,一般稱作白話,比如中山白話,韶關白話,等等。另一個例子是客家話,在我家那邊,幾乎每個縣城都使用不同口音的客家話,多達數十種,但是也幾乎交流無礙。四川話與北京話聽起來就幾乎一樣,只是音調上有了變化。)

粤语的通用语特征并非上个世纪粤语白话文运动的功劳,而是因为粤语最大程度保持了古代官话特征,世世代代被读书人用作读书朗诵和训诂研究的发音标准,所以保持了发音的精确性。反而上世纪白话文运动将口语中的非汉语词汇带进了粤语,损害了粤语的纯洁性。普通话受方言口语伤害的程度更严重,篡改了传统汉语语法。
(粵語保留了大量古漢語的用法,有漢唐遺風。細心觀察會發現很多詞語在粵語裡看起來都是"倒裝"的。如公雞在於與裡,是雞公。類似的還有夜宵/宵夜,要緊/緊要等)

北方方言由于音节简化,很多字词发音混淆。比如用普通话说"你俩明天早晨一起来",会有两种歧义,粤语就不会,因为粤语"一齐来"和"一起来"发音差别明显,既不会说混,也不会写混。普通话发音分不清"做"和"作",粤语分得清清楚楚,做只能用作动词。粤语"就"只有"到位、凑近"的意思,普通话却将 "即"的用途混淆在"就"身上,滥用了"就",以致伤害了"就"的组词能力,就位、就任、就近等词语在普通话出现的频率明显比粤语低。"法治"和"法制" 不分,让法学教授只好用于英语区分。
(評論裡有人說,粵語很難入字。這又是一個很大的誤區。粵語並不是不能入字,而正是因為五胡亂華,當年的推普與漢字簡化,使得許多老祖宗遺留下來的字詞在當代都幾乎已經無人懂得使用。這不能不說是民族與文化的一種悲哀。)

受日本启发,民国初年着手设计通用语。北京政府委托赵元任曾经设计出一套老国音,保留了入声、区分尖团等汉语特征,但是在北方方言区推广困难,因为母语方言中缺乏相应的音位音素。又因为缺乏方言支持,找不到以及很难培训语音教师。后来南京政府为了加速通用语推广速度,宣布废除老国音,改以北京方言为模板制定新国音,这就是后来的普通话。

如果制定老国音的同时,以广州话为基本方言,训练广州人为国音教师,老国音的命运可能完全不同。即便如此,在普通话的基础之上,仍然可以指定第二套通用语,用于普通话不便之处,比如学术研究、文学创作。第二套通用语不用另行设计,粤语即可。由于粤语有书面语支持,非常容易学习,比任何方言都容易。只要用国际音标注音,粤语发音也不是难事,比英语容易多了。
(有人說,你們粵人老是拿傳統文化說事,體現出一種地區、種族優越感。事實上,老廣們只是在用客觀事實就事論事而已。正如現在的標語"說普通話,做文明人"一般,不也透露出一種優越感嗎? 老廣們聽到別人稱呼其為"南蠻"時,更多的只會付諸一笑。當代的推普教育,使得所有的中小學生都能說一口流利的普通話,相比起來,外人就未必能說一口流利的粵語了。)

我平时讲普通话远多于粤语,但是写稿的时候,却用粤语思考,这样让文字更精炼。将粤语定位汉语第二通用语没有客观困难,只有主观困难。粤语不应该专利于广东人,它属于全体华人。
(這個要求似乎有些過份,能保住不受打壓已經是萬幸。)

Tuesday, September 7, 2010

[也来流水账] 必须追求一个healthy的生活style

之前CSSA组织去Chicago时, 在忙作业没来得及报名, 后来想报已经满了.

于是一个周末+labour day, 都窝在宿舍里做算法作业, 进度龟速, 半天才憋出一题

(还是连搜带问的, 平田真悲剧男啊...).

今天下午终于憋不住出去游泳了.

去之前先把东西扔煲里烧开转小火熬汤, 然后洗米煮饭, 肉拿出来解冻腌上, 其他蔬菜也先去皮切好, 总之就是一回来马上就能开炒的状态.

游泳池隔壁就是健身房, 跑步机正对着泳池, 上面有一个ppmm(隔着玻璃, 看不清的都是pp的) 在跑步, 于是在ta的鼓励下我也来来回回游了一个多小时 (可惜后来换成了一个黑哥), 这时还大概想出了某作业是用SAT来reduce的...(事实证明那是用3SAT)

回来后跟妈子先交流一下做菜经验, 然后下厨炒来吃饭. 做多剩下的明天中午吃.

完后洗碗时舍友回来了, 竟然跑去北卡潇洒去了. 

东西弄完, 给朋友打个电话吹吹水 (还一边穿针线补了个口袋), 就已经11点了.

想好了3SAT的证明, 然后用LaTeX写好solution, 修修改改英文语法, 恩, 可以交了 :)

 

现在想想, 如果每天下午都能坚持锻炼(同时sketch一个proof...)并且有效率地解决做饭问题, 生活将会多么美好!

 - Q.E.D

Friday, September 3, 2010

Local hostname workaround (via mDNS)

今晚在宿舍里折腾了半天终于把问题解决了.

scenario: 
屋里有个wireless router, 想让自己的linux, mac osx, iphone, ipod touch能互相用hostname resolve. 而不用static ip.
这样就能很方便地在机器之间访问(比如ssh, ftp, 甚至互相导git的commit等), 而不是依赖于有可能会更改的dhcp分配的ip地址. 

workaround:
这主要是使用zeroconf协议集里的mDNS技术来完成的, 使得在同一个网段内的机器可以互相discover.
并且使用 hostname.local 能解析出对方的IP地址.

首先, linux要安装avahi-daemon等一系列工具.
avahi是zeroconf的一种implementation, 支持mDNS协议, 
它使得机器能在LAN范围内广播service(SSH)等, 而不用通过外围DNS解析.
(router没有DNS功能)
安装成功后, 可以使用avahi-discover, avahi-resolve等工具测试是否成功.

最重要的是, 必须安装libnss-mdns
这个lib使得其它如ssh/ping等程序能使用mDNS正确解析出local domain的hostname.
(我的机器已经把avahi/bonjour都配置好了, 但在这个问题上折腾了两小时, 悲剧啊... 后来总算google到了答案.)

而apple家的产品用的是bonjour, 已经preinstalled. 无需额外配置.

teststing:
ping/ssh 到 hostname.local 检查是否能正确解析出主机ip即可.

注册了一个is-a-geek.com的子域名

形如 HuJinTao.is-a-geek.com

是free的, 可以在DynDNS注册.

我的router可以支持动态DNS并自动更新IP,

通过forward不同的port可以指定访问不同的机器.

这样的话, 在外面也能访问回宿舍网络了~