Friday, December 23, 2011

三分鐘熱度?

今晚與一眾人玩三國殺,水平很菜,玩得一般。主要是興趣不大,一直沒有研究,連哪個武將作甚都記不住。

按道理來說,這種 board game 是比較合我胃口的:做工精美,人物豐富,老少咸宜。但不知怎的就是提不起興趣去玩好。

忽然一驚,以前的自己對這種東西可是很著迷的,睡覺想,上課想,但現在,竟然不 fancy 了。

突然覺得以前大人所說的三分鐘熱度,不是什麼壞東西。世上的東西那麼多,值得研究的千千萬,可以學習的萬萬千。三分鐘熱度,說明你能對一樣東西提起興趣;三分鐘熱度,不至於讓你以生之有涯,去花在學之無涯。最重要的,還是保持對萬事萬物的好奇之心,自己覺得喜歡的,大可不必在意旁人的眼光,而自己決定是否要花時間在上面。沉迷於一樣東西的感覺也是很好很妙的,它可以讓你廢寢忘食,它可以讓你如痴如醉。即使時間很短,但事半功倍,往往效率很高地能在很短時間內達到業餘的水平。最後,把自己的才智與時間花在有興趣的東西上,豈不妙哉?

三分鐘熱度,可以保持人的敏感性。這樣才能多嘗試不同事物,最終找到不是"三分鐘熱度"而是三年,三十年熱度的東西的幾率也就大大增加了,興趣也就自然廣泛。

希望我繼續多一點三分鐘熱度。

Friday, December 9, 2011

Applescript to export your iPhoto albums according to the hierachy



iPhoto has one thing that drives me nuts: one cannot export photos in folder/album while keeping the hierarchy!

This is very useful when your want to export them to some external device, say, a digital photo frame.

I did some search and found that people are using some cumbersome trick, i.e., to batch rename the photos with prefix of the event, export, and then move the photos with the same prefix into folders with the prefixes. This is not so elegant because people may want to give meaningful name the photos and this will certainly destroy it.

So I wrote this little script to make life easier. Extract it and drag to  ~/Library/Services. This will add it as an service of iPhoto. Now you can just select an album and choose 

    'iPhoto -> Service -> Export Album'

then select a folder to export to. Enjoy!

Monday, November 7, 2011

蛋疼了,剛發現 GFW 還是雙向的

最近訪問 dapenti.com 一直鏈接被重置 (connection refused).
然後做了個測試:
1. dig 查找 dapenti.com 的 IP 為 61.147.103.165
2. ping 可以通
3. wget  61.147.103.165 得到完整的首頁,此時用 IP 在瀏覽器可正常訪問。
4. wget dapenti.com,鏈接被重置。瀏覽器用 IP 也失效。

完整的 log 在這裡:https://gist.github.com/1344235

Friday, October 14, 2011

最近的一些事

最近發生的事不少,稍微記錄一下,感慨。

大事:
Apple CEO Jobs 辭世
C 語言創始人之一,UNIX 创造者之一 Dennis Ritchie 辭世
以上兩個都不多說了,無法盡言。

瑣碎:
今年忘記關注圖靈獎了。後來發覺 Leslie Valiant 是得獎者。
剛好在上 Machine Learning,有學到他提出的 PAC, 以及一篇影響深遠的paper ``A theory of learnable''.
之前在做 approximation algorithm 的時候,也拜讀過他關於 network reliability 與 counting 的複雜度文章。

一間 local guitar store 促銷,入了一把 American Standard Stratocaster,我最喜歡的 3-color sunburst!

訂了回國機票。

(完)

Thursday, September 22, 2011

"哥哥,我想你了"

家裡能上網了,想起好幾天沒跟家裡聯系,怕父母在 QQ 上留言給我,於是便登陸了半個月沒上過的 QQ。

他們沒留言給我,倒是我表弟留言給我,說已經在大學城上學了。突然覺得時間過得很快,當年我在北中上學的時候,他還在小學。現在他已然從北中畢業並且上大學了。

隨便說了幾句話,由於他有事要走了,於是便準備道別。最後他說,"哥哥,我想你了"。

雖然是很普通的一句話,不過由於從一個男性口中發出,不由得讓我感到很肉麻…… 但是同時也感到很溫馨。

父母從來都不是善於表達感情的人,潛移默化,我甚至也沒對他們說過一句"想你"的話,更無論其他人。

也許表弟比我更善於表露感情罷了。但換過來想,如果這句話由我口中冒出,也許那已經是我情感近乎崩潰的時候,說出這句話的時候,必然正是淚流滿面。

來美國不知不覺已經一年有餘,果然是人越大越心煩,因為要處理的事情越來越多。特別是在異國他鄉,事無鉅細,都要自己一人包辦。

房租、電話、銀行、網絡、水電、油費、騎車、課程、研究,單單是 name 已經可以 name a few,繼續 enumerate 下去可以嘮叨一天。

於是忙得甚至沒有時間去寫篇 blog,於是忙得週末從來也不出門,於是忙得一星期也沒有彈一次琴打一次球,於是忙得一星期也沒有關心家人一次。

一直很怕跟人 keep in touch 會浪費時間,這也的確如此。我相信五分鐘已經可以讓對方感覺到你在關心他,但理想狀況往往達不到,往往需要半個小時才能把近況說清楚。

而家人與朋友那麼一大把,實在很難勻出時間來分給他們。不是我自私,而是實際情況就是這樣的。感覺給家裡電話、視頻已經是我的極限。

所以我的朋友們,不是我我不關心大家,而是家人已經優先了。

於是朋友大概會越來越少罷。

Friday, September 9, 2011

Survey on Network Reliability Problem

The network reliability problem ask one to determine the survival/failure probability of some terminals in a probabilistic network. In particular, the network is given as a graph, either directed or undirected. Each edge is associated with failure (survival) probability q_e (p_e = 1-q_e), which means it will fail (survive) with probability q_e (p_e). The problem ask you to compute the failure/survival rate of some terminals. The simplest version is s-t reliability, where the terminal sets contains only two terminals. Other variants include k-terminal and all-terminal reliability. The problem is known to be hard: it is #P-complete. It remains hard even when the graph is directed acyclic with maximum degree three. No computational effective methods exist unless P=NP. Hence people are interested in finding approximation algorithms.

Last semester I wrote an survey for the problem as a project in Approximation Algorithm course. The article introduces three methods for the problem, all of them utilize Monte-Carlo as the basic framework.

1. R. Karp and M. Luby's Monte Carlo [Karp and Luby]
R. Karp and M. Luby showed that Monte Carlo algorithm is an FPRAS (Fully polynomial time randomized approximation scheme) when the number of samples are sufficiently small. Furthermore, the number of samples are linear to the ratio of the size of positive samples and size of the sample space. Hence, how to formulate the sample space becomes the most important problem. They proposed several methods, which includes K-separating cuts, paths and cycles, and finally walks. The first two modeling is straightforward and easy to understand, however it utilized some false assumptions. The last one makes the Monte Carlo truly FPRAS. But personally I found it very hard to follow, and impractical.

2. Karger's alpha-Minimum Cut method [Karger FPRAS]
I have to say this is an interesting and clever method. First note that the network breaks only when the failure edges are in one of the cuts. He showed that only small cuts are vital when computing the failure probability. Here `small cuts' can be interpreted as the set of min cuts and `near' min cuts. In another Karger's paper, he showed that these cuts can be found can be found in polynomial time and the number is polynomial [Karger min cut] (very interesting algorithm, highly recommended). Hence, the problem can be reduced to DNF counting: 

We assign a boolean variable xe to each edge e, where xe = true if e fails and false otherwise. For the ith small cut c_i, it disconnects the network if and only if all of its edges fail. Let F_i be the conjunction of all x_e, for all e in c_i. Clearly F_i is true if and only if c_i fails. Hence, the event that some small cuts fail can be written as F = disjunction of all F_i. We want to know the probability that F is true, which is clearly the failure probability of the network. Note that F is in disjunctive normal form, and the number of clauses in F is exactly the number of small cuts, which is a polynomial. There is a FPRAS for the DNF counting problem, which also uses Monte-Carlo. It is straight-forward now.

3. Zenklusen's FPRAS for s-t reliability problem on acyclic network [Zenklusen]
This is a relatively new result. The basic idea is, in a DAG, one can compute the mean number of intact path between s and t after the failure process. In a highly unreliable network, this number is a good estimate for the s-t reliability. Monte Carlo is used to estimate the ratio between reliability(s,t) and the mean number of intact s-t paths. He showed that the s-t paths can be sampled in linear time. 

[Karp and Luby]: Monte-carlo algorithms for the planar multiterminal network reliability problem.
[Karger FPRAS]: A randomized fully polynomial time approximation scheme for the all-terminal network reliability problem.
[Karger min cut]: An O~(n^2) algorithm for minimum cuts. 
[Zenklusen]: Combinatorial methods for analyzing network security and reliability

----

I decided to release my manuscript from CS598: Approximation Algorithms, which is a survey on network reliability problem. I am not an expert on approximation algorithm, and my writing may not be so great. For any mysterious or unclear part, please refer to the original papers.

The file can be downloaded from here. The password is 'cs598'. If this document is of any help, please give appropriate citation in your work.

Wednesday, August 31, 2011

Suffix tree: an illustration of the algorithm

I recently did some study on suffix tree, and found Ukkonen's linear time online algorithm quite hard to understand. Mark Nelson has a good article about this, however, in my opinion the writing is not so great and some part is confusing.

For example, the active point and end point concepts are very important. It is defined as 'the first non-leaf node'. However it is not actually a node when you are looking at the tree, because there may be some 'implicit nodes', which you cannot find anywhere when you draw a tree. Indeed, it should be viewed from the suffix's point.

I have to read his source code to completely understand how it works. To better demonstrate, I designed the following example to illustrate the algorithm.
This is how the algorithm works step by step when the input string is 'cacao'. Hope this helps.


20110831-esemmwq7yh2ks751s5atwuw39i.png

Other useful resource include this tutorial and online suffix tree computation form. Here's an excellent java applet that can generate the suffix tree on the fly. Finally, another detailed tutorial is given by Prof Sartaj Sahni, but I found the presentation introduced lots of symbols and quite hard to follow. A lecture note from Prof. Shaojie Zhang is written clearly, though not many details given.

Here is some points that I want to clarify about the algorithm and suffix tree, assuming you know how a suffix tree looks like:
- Intuitively, suffix tree is a compressed trie. You can construct it trivially by inserting each suffix one by one into a trie tree, then compress it. However, this takes quadratic time.
- To speed up, people proposed different approach. A little history from wikipedia:

The concept was first introduced as a position tree by Weiner in 1973, which Donald Knuth subsequently characterized as "Algorithm of the Year 1973". The construction was greatly simplified by McCreight in 1976, and also by Ukkonen in 1995. Ukkonen provided the first online-construction of suffix trees, now known as Ukkonen's algorithm, with running time that matched the then fastest algorithms. 
Ukkonen is the easiest to understand and it is on-line. Most people should be using this one.

- The basic idea of the algorithm is, given an string S[1..n], we process the characters one by one. We extend the previously inserted suffix by adding the current processing character to them. For example, suppose we are given 'cacao'. When we are processing 'o', the existing suffix is 'caca', 'aca', 'ca' and 'a'. We want to append 'o' to each of them. 
- For character S[i+1], the current suffices are S[j..i], where j=1..i. In the current tree we trace a path that contains substring S[j..i]. Note that this path may stop at an edge (implicit node), an explicit node or leaf node. There are basically three case when you want to insert a character for suffix S[j..i],
 1. There is already a path from the end of S[j..i] that starts with S[i+1], or S[j..i+1] corresponds to a path. We do nothing. This in fact introduce an implicit node.
 2. S[j..i] ends at a leaf, simply append S[i+1]. 
 3. No path from the end of S[j..i] starts with S[i+1]. Split the edge at the branching position, and add a new leaf with S[i+1]. Note that this is the ONLY case that will introduce new leaf.
- However, the above method has to go through all suffices at each iteration, still quadratic time.
- The speed up and memory reduction come from the following important observations and techniques:
 1. We only have to consider the suffices between the Active Point and End point at each iteration. It can be shown that suffices outside this range are already at leaf nodes, and hence require do nothing (See Case 1). Furthermore, the end point will be the active point at the next iteration.
 2. We introduce a suffix pointer for each internal node (non-leaf non-root) node, which points to a node that contains the Longest Proper Suffix of the current suffix. For example, the longest proper suffix of "cacao" is "acao". With this technique, we don't need to search for the node that contains the next suffix from root every time, instead, we jump from the just processed one to the next one, e.g., from "cacao" to "acao".
 3. We don't need to actually store the substrings in the nodes, we just need to know the index of the starting and ending characters. Hence, we actually do nothing when encounters Rule #2.
 4. We can use hash table to store the edges, which can help inserting, removing and finding edges in constant time. The details can be found in Mark's algorithm implementation, and the comparison in the wiki.
- Intuitively, the active point is the first suffix that requires you to do something, that is, when encounters Rule #3. The end point is the first suffix that you should do nothing again, i.e., when we encounters Rule #1 or Rule #2 again when processing the active point during the iteration.
- To avoid a suffix being a prefix of another suffix, the last character in the string must be unique. In general, we can just append a special character that is not in the vocabulary, e.g., the '$' used in the example. For example, 'book' does not need to append since 'k' is unique, but 'banana' needs since 'a' is not unique. In this case, after the algorithm terminates, there will be exactly |S| + 1 leaves in the tree, one for each suffix, or, all the suffices end at leaf!

Important application of suffix tree includes:
- Find a substring P in S in O(|P|) time. Note that other linear algorithm such as KMP requires O(|P|+|S|). When there are multiple Ps, suffix tree is more efficient.
- Find the longest common substring (LCS) between P and S. We can construct a suffix tree for string P#S\$, where '#' and '\$' are two characters that are not in the vocabulary. To find the LCS, we traverse the suffix tree and sum up the number of characters visited for each internal node. Then, an internal node that has the largest sum and has at least one leaf node that represents the suffix of P and S, respectively, is the desired node. This can be done in O(|P|+|S|) time. Note that the typical solution, i.e., dynamic programming, requires O(|P||S|) time. This can be extended to a more general case where there are multiple strings S1, S2, ..., Sn. And the runtime is the sum of the lengths of the strings.
- Find the longest palindrome in S. Here is one excellent article in Chinese. The basic idea is, let P be the reverse of S, construct suffix tree for S#P$. Then for each S[i], find the largest Least Common Ancestor of S[i], S[n-i+1] (even length) and S[i+1], S[n-i+1] (odd length). LCA can be done in linear time using Tarjan's algorithm.
- Given a set of strings S1, S2, ..., Sn, find all the Si such that Si contains pattern P. This is a typical application in computational biology. The set of strings are gene banks, the pattern is a gene segment. Let T=S1#S2#...#Sn$. This is called a multiple string suffix tree. To find all the Si that contains P, we walk down from root according to P. If we cannot complete a path that represents P, no string contains P. Otherwise, we will stop at a node N, then from its leaves we can know what strings Si contains P. A special case is that N is a leaf node, which means only one string contains P. To speed up, we can maintain a list of indices of Si for each node, which lists all the Si that are a start point of the suffices in the leaves.
- Refer to this and this for more detail.

Tuesday, July 26, 2011

[Update] 关于 Mac OS X 的 filesystem encoding

跟上一个问题有关。在 stackoverflow 上问了问题,得到了如下答复 [1]:

The problem is that MacOS X's default filesystem changes all filenames you give it to an unusual normalization form which does not use precomposed characters. 

根据 Python unicodedata 的文档 [2]:

The Unicode standard defines various normalization forms of a Unicode string, based on the definition of canonical equivalence and compatibility equivalence. In Unicode, several characters can be expressed in various way. For example, the character U+00C7 (LATIN CAPITAL LETTER C WITH CEDILLA) can also be expressed as the sequence U+0327 (COMBINING CEDILLA) U+0043 (LATIN CAPITAL LETTER C).

其中的 U+00C7 是 'Ç'

对应的 python 源代码我也更新了。

请参考:

Monday, July 25, 2011

[Update] 重命名 GBK 乱码文件的 Python 脚本

详细的问题描述请见之前两个帖子: [1] [2] 
写了一个重命名乱码文件的 Python 脚本,在这里
注意在 Mac OS X 下有点问题,看这里

Sunday, July 24, 2011

Update: 关于迅雷离线下载 以及 Windows 的 zip 在 Linux 下乱码

现在发觉这两个问题其实是同一个问题,而且找到了更方便简洁的方法去做,
主要是利用了 encode('latin-1') 不对 unicode 做任何编码转换而转换为 ascii 字符串。
代码如下:

#!/usr/bin/env python
import sys
for i in sys.argv[1:]:
    print i.decode('utf8').encode('latin-1').decode('gbk')

PS. 不知道为什么我用网上介绍的 convmv 做不出来。
[tags python encoding charset 乱码]

关于在 linux 下,用 chrome 下载迅雷离线文件乱码的问题

一扯到编码问题就很难说清楚。情况是这样的。迅雷的网页本身是用 UTF-8 编码的,所以在浏览器里显示正常。但是点击下载后,浏览器识别出的文件名却是这么一串:

> [ĸÇ×].Mother.mkv
>

如果在 python 里面 print 出来则是这么一段:

> '[xc3x84xc2xb8xc3x87xc3x97].Mother.mkv'

(原串是 '[母亲].Mother.mkv')。我的用户编码设置是 en_US.UTF-8,如果我设置为 zh_CN.GB18030,则能正确识别出该字串,但是不能保存该文件到硬盘,因为我的 hdd 都是用 UTF-8 编码的。所以猜测是,在 UTF-8 环境下,浏览器读入了 GBK 编码的字串,但是直接理解为了 unicode 的字串,并且直接把它们编码成了 UTF-8。

以'母'字为例,下面这幅图解释了问题所在:

http://iveney.files.wordpress.com/2011/07/image.png&h=297

所以,上面字串中,'xc3x84xc2xb8'对应了'母'字,而 'xc3x87xc3x97' 对应了'亲'字。
解决的方法就是把这个过程逆转过来做一次。我用 python 稍微写了一下,稍微有点繁琐,不知道能不能简化。
大致的思路就是,先把非ascii的字符匹配出来,然后每4个作为一个组(代表了一个 GBK 的字符),
然后decode 为 unicode code point。这时的 code point 的 *value* 实质上是 GBK 的字符编码,但因为它是一个 unicode object,因此必须把它转换为一个普通的 str。转换完后,就可以从 GBK decode 为 unicode 了。当然输出时,我们要再 encode 它为 UTF-8。
示例代码在这里 (https://gist.github.com/1101679) 。

Wednesday, July 20, 2011

klayout

klayout 可以很方便地使用 ruby script 進行操作。
但是 Mac 的 precompiled version 沒有 klayout 這個命令。
事實上,直接調用 /Applications/klayout.app/Contents/MacOS/klayout 即可。
但是如果直接 soft link 會有一個問題,就是pwd的問題,
因爲該app打包了qt,rblib等資源,所以會搜索不到。
解決方法是像 mvim 那樣,寫一個 script 把它包裝起來:

#!/bin/sh

KLAYOUT_APP_DIR=/Applications
binary="$KLAYOUT_APP_DIR/klayout.app/Contents/MacOS/klayout"
exec "$binary" ${1:+"$@"}


CS study

既然偶像写了一篇,我也写一篇发表自己的拙见。

首先,师兄写的文章我基本赞同,不过个人觉得稍微" 局限"了一点。
这里的局限,指的是师兄认为需要侧重掌握的能力,可能更偏向适合某类具体的工作。
因为强调要知道系统底层运作,则显得非常computer engineering,更偏向的系统运维类的工作。
但是,有些人可能比较感兴趣于其他方面,如网页前端设计等(当然这个就有点偏离CS了),
则不一定对某些细节需要钻研得那么仔细。
再者,加上由于technology的限制,有些时候成立的观点日后不一定成立。
比如深刻钻研磁盘读写调度算法会对performance有很大的改进,
但这些算法都被限制于现在外存存储的碟片模型,说不定以后SSD之类的全面dominaate市场了,
那些算法就可能成为一些legacy的东西了。

我个人认为,作为一个合格的CS毕业生/IT民工/xyz(这里有很多label可以用的。。)
可以从以下几个方面评价、学习:
- 基本素质
- 生存技能
- 自身修养

1. 基本素质
我认为,作为一个合格的CS毕业生/从业人员,必须拥有的基本素质有:

 - 程序设计。如了解10门以上的语言,精通2-3门语言。 程序设计语言这是作为一个CS科班出身的人所必须拥有的与别人交流的能力。
无论你算法、理论多牛B也好,我也窃以为起码要掌握一种能与人沟通的语言。
其中我认为,C语言是最接近现今主流计算机实现模型 (limited resource TM)而又不至于太low level的描述,所以强烈建议任何人都精通之。
其次,think like a computer scientist,掌握一门高级语言,如Python/Apple script,你会发觉自己不再拘泥于底层细节,而是天高任鸟飞。
不再拘泥于一些底层的、重复性的东西,而是把自己的表达能力提高了一个层次,因此瞬间能力强大了很多。

 - 算法与数据结构。排序、查找、搜索我想是工程里最最常用的case,一定要熟练。
关于它们的重要性,我想CLRS 的序言比我说得好一百倍,不再强调。这对于想做研究的人来说更要。
自我读研以来,越来越发现他们的重要性——除了数学逻辑、可计算性等理论中的战斗机较少用到,之外的几乎任何方向,归根结底总是要设计出一个好的算法解决问题。
如果让我再读一次本科,我会选择少学些花里胡哨的技术,多学些算法。
注意这里说的算法与数据结构,不是指你知道回字有多少种写法,而是你的思维锻炼得究竟如何。

- 根据IEEE/ACM 的Computing Curriculum(CC),你必须熟悉(越深越好)计算机的一些核心课程,如Discrete Math, OS, Networking等。
接下来,具体的侧重点可以参考最新的CC(好像是03,里面具体分了IT/CS/CE/Management/DB等,好像是七种方向)。
在这个基础上,大量了解CS-related的各个方面(extensive study),并且在你的职业道路上做好intensive study。

- 了解各大平台与流行的技术以及*系统*底层,这就与pudding的建议有点接近但又没有具体。
这需要时间的积累。以下随便列举一些能学到的并且可能颇为重要的:
 -- Windows: Win32 API/MFC/WPF/.Net
 -- Linux: shell, kernel, its philosophy, scripting, X
 -- OS X: kernel, Cocoa, Obj C, MVC-style Inter Process Communication (IPC)
 -- Server side: AIX/SunOS/Solaris etc. system mangement & operation

2. 生存技能


3. 自身修养
- 掌握解决问题(Problem Solving)的基本思路(如Divide & Conquer, Recursion, DP等)与常用Heuristic(如'无机为先'的思路,推荐Polya的How to solve it)。不断提高自己解决问题的能力。
掌握一些解决问题的基本工具、技术。如DP,LP,simulated annealing, genetic algorithm,taboo search,data mining,machine learning(后面这两个已经成为无数research topic的有力灌水工具囧)

- 建议了解一门functional PL,如pudding推崇的scheme/LISP(学习递归思维的利器),或者haskel, O'Caml等。
这是接近从递归论/lambda calculus出发的计算模型描述,让你更深刻地理解计算本质。

- 发挥优秀程序员"懒"的本性,培养"计算机为我所用"的观点,深刻挖掘"Automation"的潜力。
如何让计算机为你干活?这就需要有广度深度并重的结合。在这个思想的指导上,你才能发挥程序员lazy的本性,让计算机帮你做更多的东西,一劳永逸。
我认为一个有水平的程序员必须学会脚本/批处理来处理一些繁琐、周期性的任务,如文本处理、资料备份压缩,等。

- 优秀的学习能力。比方说,能快速地上手工具、学习一门新的语言、借助文档快速开发(给你手册,你能快速地开发如Firefox 插件,Twitter Gadget,系统管理script等的东东吗)。

- 保持学习的动力与激情。技术总是不断淘汰与更新的,必须保持良好的心态与兴趣动力,才能在历史的潮流中屹立不倒。

- 数学修养。不知道pudding 大神碰到了虾米问题让他觉得数学不够,可能是因为接触到B公司的核心IR技术,必须从理论上研究东西的层面上了?
不讨论究竟做IT究竟需不需要数学,但是最起码数学是可以作为一门兴趣培养,并且锻炼思维的。
首先离散数学的各个方向肯定是我们必须要掌握的东西,包括: 集合论、数理逻辑、关系与函数、抽象代数、图论、组合数学、数论、运筹学、形式语言与自动机等。
这一堆是最体现CS背景的东西。离开了这一堆,只能称作CE/IT毕业生了。
其余的各种数学理论,我不敢说干IT究竟能不能用到(比如我就很难看到做系统管理员与近世代数有什么关系),但是如果你aim at research,就很容易碰到。
起码我以前觉得用不上的东西,现在全部都能碰到,如:
-- 几乎所有的research都能或多或少用到微积分/转化为图论、combinatorics的问题
-- image processing: 需要一些信号分析、微积分、微分方程等
-- quantum computing: 线性代数、概率统计
-- cryptography: 代数系统、数论
-- system research: 排队论、博弈论、马尔可夫链、控制论、运筹
-- 就连一些泰勒展开式之类的我以前觉得超级恶心的东西,用来解决某些问题也能屡试不爽。
除此之外,还建议看一些拓扑学、逻辑学等的开拓智力的东西,提高自己的修养。

- 理论层面的兴趣培养。Computer Science 之所以能被称为Science,就是因为其基础Theoretical Computer Science,实质上与数学、物理等能归结到一起,上升到哲学的层面。
首先我们可以从历史层面开始研究计算的历史,从第一个算法GCD到Diophantine Equation与费马最后定理,从abacus到calculus machine,从第一个女程序员ada到第一个女图灵奖获得者Frances Allen
从到图灵机与递归论,从图灵的gay友死去到阿西莫夫再到强人工智能主义的兴衰,从第一台晶体管计算机到冯诺伊曼机,
从几合原本到罗素悖论再到哥德尔不完备性定理,数学史上与物理史上的三次危机,等等等等,都是非常生动有趣的故事。
然后,我们可以阅读一些TCS的东西,体验一下理论带给我们的震撼。可计算性、计算复杂性、形式语言、量子计算,都是值得思考玩味的学科。
最后,我们也可以从信息论(Informatics, Information Theory)的角度入手研究计算,体验一下Shannon 截然不同的观点。

----------

最后,我觉得还有一些off topic但很重要的points……
- mm问题
- 培养一门兴趣爱好,琴棋书画(艺术)方面的兴趣
- 身体健康问题

往事如阉

那幽暗的岁月
每每让我蛋疼不已
往事如阉
往事如阉.

Eva补完计划

源自Neon Genesis Evangelion, 新世纪福音战士

人类补完计划, 补, 补充, 完, 完成. 在TV版里, 可以简单理解为人类心灵的补完.
当然其内涵远远不止这么简单. 而我,要发动一个Eva补完计划.
最近逐渐开始收集购买Eva的各种模型.
亦可谓对童年愿望的一种"补完".
补完童年的缺憾.
重温当年的感动.
小时候囊中羞涩, 没有办法购买一些相关的物品,来保存那份时光.
一个模型要价200多人民币, 放在高中,也已经接近一个月的伙食费.
更无论到了初中还没见过这么大数量金额的自己.
时至今日, 终于有能力并下定决心一一补完.
永远不要忘记当年心底那一丝美好的愿望.
小孩子渴望玩具的心情, 自己长大后弥补.

Wednesday, June 29, 2011

Embedding Lua for scripting




最近 Lua 似乎挺火。它被設計爲一門輕量級的、可供嵌入到其它語言作爲膠水 (Gluing) 的語言。
一直很好奇這是怎麼做到的,於是仔細研究了一下,在網上發現了這篇文章,作者提供了一個 minimal 的源代碼。
閱讀完大概明瞭,但原來的程序有些 bug,而且有些小細節沒有說明清楚(比如,原文基於 Lua 5.0,但最新的 Lua 5.2 有 major changes)。
於是 fork 之修改完成,並記錄如下。

Disclaimer:
正如作者聲明,裏面的 C 以及 Lua 都沒有寫得非常優美或規範。
由於是做示範性用途,所以許多地方都採取了 quick & dirty 的方法,還有各種 magic number。
雖然在代碼裏沒有標明,程序版權屬於原作者。

Prerequisites:
OS X (測試環境,10.6.8 ) / Linux (原文提到支持,但未測試。不過沒道理不成功 :p )
Lua 5.2 & liblua:
- 在 OS X 下, 可以安裝 Lua.framework,我用的是自己編譯的版本。
- 在 linux 下,可以通過各種包管理工具直接安裝 lib 以及 interpreter。
注: LuaJIT 應該也可以,但現階段尚未更新至 5.2 compatible
pkg-config
SDL 1.2.14: OSX 可直接下載 SDL.framework,注意必須 copy sdl.dmg 裏面的 devel-lite 裏面的 SDLmain.{m,h},以把程序包裝成一個 Cocoa 程序。Linux 無此問題。
OpenGL

介紹及原理:
Python/Ruby/Lua 之類的語言都可以作爲嵌入式的語言使用,然而 Lua 以其簡潔的語法、支持多範式編程以及極小的庫體積(~100K),受到衆人的青睞。
它被大量運用在 Game Programming 裏,比如魔獸世界(WoW)就是用它來做各種 extension 的。
這些動態語言比起編譯型語言的主要好處,就是更加抽象,更加高層次,支持 Functional programming, 有各種語法糖衣輔助等寫出 human-readable 的簡潔代碼。
不足之處在於,本質上它們的運行都需要經過一層中間層—— Virtual Machine 來與系統底層進行交互。所以效率往往比起 C/C++ 等要低。
所以人們想出了一個好方法:主要的程序邏輯使用 scripting language 編寫,而一些要求高性能或者底層的代碼段,則還是由編譯語言完成。
這裏有一份更詳細的介紹文檔。示意圖來自該文檔。



程序流程:
程序本身應該是一個編譯型語言生成的程序,在裏面提供了各種基礎設施,如繪製圖形等。
在程序裏面會鏈接到腳本語言的庫,然後主要的工作在腳本語言裏面完成,比如定義各種 Object,
它們之間的 interaction 等。這裏可以看到另外一個好處:一些經常需要改動的值,我們不需要
寫在C/C++裏,因此不需要重複編譯程序,而只需要把它們保存在腳本文件裏即可方便讀出。
因此腳本語言也可以當做配置文件使用。

The Pong Game (這個遊戲不用介紹了吧?):



讓我們來看看具體是怎麼實現的。在這裏採用了 C+Lua 的組合。
在 C 程序裏,定義了如何繪製榘形 (draw_rectangle),以及處理方向鍵的函數(由 SDL 提供)。
以上的函數都被 register 到 Lua 裏面(具體來說,是程序運行后生成的 Lua VM instance)。
而 C 裏也可以通過 Lua 提供的 API 調用 Lua VM 定義的函數。
在這裏,是一個名爲 "pulse" 的函數 (好吧, 老外覺得這個詞很直觀形象, 請深入理解...)
在初始化好 SDL 的一些咚咚後, 程序進入 main loop.
如果寫過 OpenGL 或者 Win32 之類的採用事件模型 (Event model)的程序, 就知道這個
main loop 拿來做什麼的. 基本上, 這個 main loop 就是監聽外部輸入 (這裏是鍵盤),
每次循環會間隔一定時間, 並調用 Lua 的 pulse 函數進行畫面的更新.

在 Lua script 裏, 定義了兩個類, 分別是作爲板子的 paddle 以及球 ball.
當程序運行后, Lua 會創建兩個 paddle 以及 一個 ball 並更新它們的位置.
如果有按鍵事件, 則根據它更新 paddle 的位置; 同時也進行碰撞檢測.

簡單來說:
(in C) main loop -> call Lua pulse -> (in Lua) crash detection, drawing (call C's draw_rectangle) -> (in C) main loop ...
That's all!

Note: 原來版本的程序裏, 如果 ball 飛出了 y 方向, 則它真的飛了出去...
於是我稍微改了一下腳本, 增加了 y 方向的邊緣碰撞檢測.
注意, 這裏完全沒有改 C 程序代碼或編譯, 而是直接修改腳本即可.
可以修改的地方還有很多, 比如改變 paddle 的大小, 球的速度, 電腦 AI 等.
另外, x 方向上的碰撞檢測也沒有完成 :)

我適當地在源代碼裏加上了一些註釋, 需要知道得更清楚的, 可以 RTFSC.

Tuesday, June 28, 2011

用DNS隧道实现免费上网

 
 

Sent to you by Ivan Z. Siu via Google Reader:

 
 

via FeedzShare 1天最热 on 6/27/11

来自: Creke Blog - FeedzShare  
发布时间:2011年06月20日,  已有 5 人推荐


大多数机场、酒店之类场所,当你输入一个网址比如www.google.com时,会弹出一个页面要你输入帐号密码才能上网。这个时候DNS能正确解析,但是上网要付费认证。

可以通过DNS隧道来实现免费上网。具体做法是:

(1)找一个支持DNS解析的域名,现在这类免费域名很多,比如tk的、co.cc的。假设该域名是

abc123.tk

(2)在tk的注册机构里,设置abc123.tk的NS服务器为你自己的主机(最好是Linux VPS),例如:

abc123.tk.     IN  NS  ns.abc123.tk.
ns.abc123.tk.  IN  A   74.81.81.81

(3)在74.81.81.81上,以root身份运行一个Perl脚本(这个脚本来自Dan Kaminsky的OzymanDNS包):

./nomde.pl -i 0.0.0.0 abc123.tk

上述脚本会侦听在UDP 53端口,接受DNS请求,并且只解析abc123.tk域。

(4)在客户机上(要求有ssh,最好是Linux系统),运行如下命令:

ssh -ND 7070 -o ProxyCommand="./droute.pl sshdns.abc123.tk" user@localhost

上述ssh命令,-ND 7070表示在本机打开7070的socks 5代理端口。droute.pl是DNS隧道的客户端工具,同样来自于OzymanDNS包。sshdns是固定的主机名,加在域名abc123.tk前面。user是你在74.81.81.81上的登录名字,@localhost是固定的,不需要改(因为隧道过去后,就是74.81.81.81本机)。

运行上述ssh命令后,会提示输入密码。输入正确密码后,就和远程主机建立了ssh连接,获取到一个SSH终端。并且,在本机打开了7070的socks 5代理端口。配置浏览器使用这个代理端口,开始享受免费冲浪吧!

 

转自:http://www.nsbeta.info/archives/96


 
 

Things you can do from here:

 
 

Wednesday, June 22, 2011

关于 Mac 自带的 Cairo, libpng

Cairo
=====

最近在编译一些 graphics 有关的程序碰到了这个问题:
Mac 自带了 Cairo 库, 但是版本已经很老了 (1.8.6).
许多程序都要求 >= 1.10.0
从brew里安装了新的 cairo, 由于brew为了防止破坏原先系统上的软件依赖, 因此没有为pkg-config安装对应的 .pc 文件.
因此, 我在编译 pycairo 时, 还是会找到旧的 cairo.
解决方法很简单, 当需要用到新版本cairo时, 可以:

 1. export PKG_CONFIG_PATH=/path/to/cairo/pc/file   这样, pkg-config就会找到新版本cairo的.pc文件.
 2. 使用正确的 LDFLAGS 和 CPPFLAGS 进行编译.

由于 pycairo 使用了一个叫 waf 的东西进行编译, 而我有又没找到在哪里定义方法2所提到的变量,
因此只能使用方法1.

libpng
=======
Mac 自带了 X11.app (也叫 XQuartz), 是 Apple 版本的 X11, 基于 Xorg. 里面自带了 libpng 1.2.
最新版本的 XQuartz 使用了 libpng 1.4. 但是安装了它会造成许多 confusion. 而旧的 X11.app 用起来也没什么大问题.
于是最好把新的 XQuartz 卸载掉.
具体方法见:

主要是:

sudo rm -rf /opt/X11* /Library/Launch*/org.macosforge.xquartz.* /Applications/Utilities/XQuartz.app /etc/*paths.d/*XQuartz
sudo pkgutil --forget org.macosforge.xquartz.pkg

Tuesday, May 24, 2011

[FOSS] get-shit-done

最近比较迷 homebrew 与 github
brew update 时会看被更新的 formula 是什么东西,
github 的 reflog 也很有趣, 会定期推荐一些 promising 的 project.
今天就见到一个很简单同时也很有趣的东东: get-shit-done.
这是它的介绍:

    Small script to configure your hosts file so you don't get distracted during the day

它的原理很简单, 通过修改 hosts 文件, 屏蔽一些容易让人分心的社交网站 (facebook, twitter, etc)
使你偷懒打开网页时被重定向. 命令很简单,

    sudo get-shit-done work

即可修改 hosts 并且重启 network daemon, 

    sudo get-shit-done play

则是回复正常状态.
有趣的是, 这个小工具在 hacker news 引起了很大的反响.

Thursday, May 5, 2011

[繼續貢獻]我是一名吉他手,昨天晚上去相親,感覺現在的女生..

我是一名音樂傢,昨天晚上去相親,感覺現在的女生... 相親時,我就隨便問了三個問題,她竟然一個都答不上來,也沒有討論的氣氛。。。

先問了一個"大三和絃與小三和絃有什麼區別?",她楞在那裏半天,既不回答,也不說說自己的觀點。

看她對和絃理論沒什麼研究,就問一點實際一點的問題吧"怎麼在雙搖琴上實現Joe式的尖叫人工泛音",她說話了"雙搖琴?人工泛音?" 

崩潰了,萬般無奈之中,記得女孩子普遍對感情敏感,"爲什麼英格威使用的和聲小調音階會給人帶來一種古典音樂的感覺?"她終於活躍了:"英格威是誰?...和聲小調音階?..."

[貢獻一個爛gag]我是一名理論計算機研究僧,昨天晚上去相親,感覺現在的女生⋯⋯

我是一名理論計算機研究僧,昨天晚上去相親,感覺現在的女生... 相親時,我就隨便問了三個問題,她竟然一個都答不上來,也沒有討論的氣氛。。。

先問了一個"確定性圖靈機與非確定性圖靈機有什麼區別?",她楞在那裏半天,既不回答,也不說說自己的觀點。

看她對複雜性理論沒什麼研究,就問一點簡單的證明問題吧"怎樣證明一般圖上的旅行推銷員問題是無法近似的",她說話了"旅行推銷員問題?無法近似?" 

崩潰了,萬般無奈之中,記得女孩子普遍對時間敏感,"怎麼實現背包問題的僞多項式時間的動態規劃?"她終於活躍了:"僞多項式時間?...動態規劃?..."

給 blogspot 裝了一個插件,可以顯示 TeX 公式了

根據這個 post,可以安裝 MathTeX 到template裏面。
測試:

If $G$ has uniform arc failure probability $p$,
arc-vertex bound $\mu$ and let $l_\text{min}$ and
$l_\text{max}$ be the minimum and maximum length of any
$s$-$t$ path in $G$, then we have:

$\frac{w(S)}{w(A)} \le \min\left\{\left( \frac{2}{2-q} \right)^{m-l_\text{min}},\exp_2(1+(\mu/m)[(q m+\ln2)(qm+\ln 2 +l_\text{max})])\right\}$

where $\exp_2(x)=2^x$.

Friday, March 11, 2011

顺应潮流,咆哮一下:在美国读PhD的男纸乃们伤不起啊伤不起!!!!!!!!!!!!!!!!!!

【纯搞笑,请勿对号入座与联想……】

在美国读PhD的男纸乃们伤不起啊伤不起!!!!!!!!!!!!!!!!!!

老子半年前开始读PhD!!!!!于是尼玛踏上了不归路啊!!!!!!!

现在搞得老子天天睡不着觉啊!!!!!!各种内分泌失调啊!!!!!!!!!!!!!!!!

别人都用PhD猥琐男来称呼我啊!!!!!!!!!!!谁TM想做wsn啊!!!!!!!


读PhD的男纸很辛苦啊!!!!!!!!

每天上课有没有有有没有!!!!!!!!!!

每天做作业有没有有有没有!!!!!!!!!

每天写report有没有有有没有!!!!!!!!!有没有有有没有!!!!!!!!!

每天搞project有没有有有没有!!!!!!!!!有没有有有没有!!!!!!!!!

每天写代码有没有有有没有!!!!!!!!!有没有有有没有!!!!!!!!!

尼玛很累的啊!!!!

别人晚上都在抱妹子啪啪啪神马的啊!!!!!!!!!!!!!

哥还必须在实验室呆到3点然后坐半小时公车回家啊!!!!!!!!!!!!!!

每天睡眠不足5个小时啊!!!!!!!!!!!!!

一到due day就各种通宵啊!!!!!!!!!!!!!!!!!!!!!!!!

上班时间不固定啊!!!!!!!!!!!!!!!!有尼玛自由啊!!!!!!!!!!!!!

有没有周末都一个鸟样啊!!!!!!!!!

在美国读PhD的男纸更是伤不起中的战斗机啊!!!!!!!!!!

都说美国是什么好地方啊!!!!!!!!!!!!!!!!!!!!

破农村走5分钟路碰到一个人就算多的啦!!!!!!!!!!!!!!!!!

都说韩国菜墨西哥菜西餐好吃啊!!!!!!!!!!

尼玛好吃条毛啊!!!!!!!!!!!!!!!!!!!!!!

中餐馆10块美金一碟青菜啊!!!!!!!!!!!!!!!!

尼玛敢再贵一点吗!!!!!!!!!!!!!!!!!!

每个月房租电话费伙食费油费加起来上千美金啊!!!!!!!!!!!!!!!


以上省略三万字,有没有!!!!!!!!!!!!!!!!!!!!!!!

总之读PhD的上辈子都是折翼的天屎啊!!!!!!!!!!

在美国读PhD的上辈子都是折了翼又折小鸡鸡的天屎啊!!!!!!!!!!!

Tuesday, February 15, 2011

Short notes about LaTeX2e fonts

对LaTeX上的字体概念一直很混淆,所以这里大概总结一下一点概念与机制。
主要涉及到字体的使用与选择,但不包括使用任意自定义字体/系统字体,以及中文字体。
关于中文字体+LaTeX,可以使用CJK[utf8]宏包,可以参考以前一篇旧文
关于使用任意字体,太复杂,此处不表。参考[1]的section 4,文档 [8], 以及tex-font-cheatsheet [5] (also available using texdoc).
以上两个问题比较简单的处理方法是使用XeTeX/LuaTeX,它们都能直接使用系统的字体。因此顺带也把中文的问题给解决了。

所谓的NFSS, New Font Selection Scheme。
参考 fntguide [1], psnfss2e [2](可用texdoc docname打开),
以及Font selection in LATEX: The most frequently asked questions (schmidt.pdf) [3]。
以上三个都是只有十来页的文档,非常值得一读。
另外,有一个非常好的网站 [4] 列出了LaTeX上主要能用的字体(depends on distribution)。
想用某种字体前可以先去参考。

以下为summary:
  • 每种font有五个attributes:
    • encoding, 如OT1, T1 等。
    • family, 如cmr (=Computer Modern Roman), ptm (=Adobe Times)等. 值得注意的是,family 又分为三种:
      • roman (serif),即衬线字体
      • sans serif,即无衬线字体
      • typewriter (monospace),即等款字体
    • series, 如m for medium, b for bold
    • shape, 如n for normal, it for italic, sl for slanted, sc for caps and small caps.
    • size, 如1.5in, 3mm
  • 所以,OT1 cmr m n 10 就是指 Computer Modern Roman 10 point, TeX 里面的font name就是cmr10
  • 所以,平时见的\textxx command就是用来设置这写attr的。如\textrm{..} 用来更改 family, \textbf{..} 更改 series, \footnotesize 更改size 为 8pt
  • 用于底层的font selection command为\font... 系列。如\fontfamily 用来选择family
  • 使用author commands来直接选择字体。上面所说的如\textrm会选择一种现在选定的roman字体(\rmdefault)。因此要更改这个设置,则可以更新\rmdefault:
    • \renewcommand{\rmdefault}{ptm}
  • 数学字体与文本字体不同,并且更复杂。比如上面的命令只改变了文本字体,而没有改变数学字体。所以一般是用package来封装、完成上面所说的这些命令。
    • 比如要把文本和数学字体都改为Times, 则执行 \usepackage{mathptmx}
  • LaTeX包含有可用的minimum font sets ``PSNFSS collection'',除了默认的Knuth大爷的Computer Modern,还有Times, Helvetica, Palatino, Chater等,强烈建议参考 [2].
    • 注:在 PSNFSS 里有一个pifont,包含了一些有趣的符号。如扑克牌……
  • 执行 pdftex testfont 可以测试LaTeX能用的字体。执行后,输入字体名字(如cmr10),然后 \sample, \bye。TeX会生成对应的一个示例。font-change [6] 给出了一份不错的参考。
关于数学字体:
  • 通过\mathbf 等命令来使用某种特别的数学字体。型如 \mathbf 的字体称为 math alphabets。它们只能在数学模式内使用。
  • 数学字体与文本字体一样具有五个attribute。然而,它们并不能被单独设置,而只能通过设置 "math version" 来设置。predefined的math version有normal和bold。它们只能在数学模式外调用。如 \mathversion{bold} 选择使用了 \boldmath 这个math version。
  • 综上所述,要选择特定的数学字体,必须使用如下的步骤:
    • 定义一个新的mathversion:如 \DeclareMathVersion{normal}
    • 定义相应的mathalphabet,如\SetMathAlphabet{\baz}{normal}{OT1}{cmss}{m}{n}, 它设置 \baz 为 normal 这个 math mode 的一个math alphabet,其中的OT1, cmss m, n参数意义如文本字体
    • 定义数学符号字体以及数学符号。以上只是设置了math alphabet的字体,还必须为符号再定义一套字体。参考 [1]。
    • 定义数学字体大小。有四种大小:\textstyle, \displaystyle, \scriptstyle 与 \scriptscriptstyle,使用\DeclareMathSizes设置。
    • 最后,使用 \mathversion 来选用这个 math version.
最后,The UK TeX FAQ [7] 也是一份非常不错的文档,它的section K 包含了字体相关的FAQ。 可以使用 texdoc FAQ-en 来察看一份pdf copy。

Reference:
[1] fntguide
[2] psnfss2e
[3] schmidt.pdf
[4] The LaTeX Font Catalogue, http://www.tug.dk/FontCatalogue/
[5] tex-font-cheatsheet
[6] font-change
[8] 为LaTeX 添加英文 TrueType 字体, http://giantchen.googlepages.com/TrueTypeFonts_en.pdf

Tuesday, February 1, 2011

用 ruby 做url decode

最近用iGetter从离线迅雷的服务器下载文件时, 发觉文件名会成为这样的东西:

%C0%EE%BD%A1.(%B8%BD%D4%F9MV).%B7%E7%B4%B5%C2%F3%C0%CB

这是encode过的url。
于是必须进行url decode。发觉竟然没有一个现成的command line tool能用。
网上的资源中, 英文版的一般不能处理这样的字符串, 因为它是用GBK编码再encode的。
于是自己用ruby简单地写了一下:

#!/usr/bin/env ruby
# -*- coding: utf-8 -*- 

require 'uri'
require 'iconv'

if ARGV.size <= 0 
        puts "Usage: ./urldecode url ..."
        exit
end

ARGV.each do |a| 
        str=URI.decode("#{a}")
        puts Iconv.conv("utf-8", "gbk",str)
end

注意国内资源一般是在win下用gbk编码的, 所以带来了很多不方便, 直接url decode得到的并不是utf8编码的字串。
因此必须用iconv转换一下。

使用方法为:
./urldecode "%C0%EE%BD%A1.(%B8%BD%D4%F9MV).%B7%E7%B4%B5%C2%F3%C0%CB"

得到正确的字串为:

李健.(附赠MV).风吹麦浪

参考文档:

Thursday, January 27, 2011

vim 匹配 latex 一个 block (environment)

想把型如

\caption{...
...
...}

这样的东西删掉.
必须做到: 
1. multiple line (跨行匹配) => 使用 \_. 而不是 .
2. non-greedy (否则会到下一个block的`}')  => 使用 \{-} 而不是 *

所以写出来就是:

\\caption{\_.\{-}}\n

注意我用了\n 在最后面, 否则会匹配到\caption环境里面的某个`}'.
因为一般我caption后面不加东西. 所以使用\n作为终止判断.
当然也可以用$, 如果有空格则失效.
不过, 可以extend成后面带任意whitespace的版本. 此略.

Sunday, January 16, 2011

很久没发文了... 发一个我的浏览器a-z提示的网址吧...

a: amazon.com, 我經常在這買東西.
b: busey.com, C-U 地區的一間銀行.
c: cs.uiuc.edu/class/fa10/cs573/, 上學期上的算法課網址
d: dealnews.com, 找deal網站
e: ebates.com, cashback網站
f: facebook.com, 君要臣死臣facebook
g: google.com/calendar/render, calendar 重度依賴者
h: hertz.co.uk, hertz的英國站點(租車公司), 很驚訝竟然是這個東西 ... 只是上次去vegas之前做的調查
i: illinois.edu, 敝校
j: jitapu.com, 有時上去看看吉他譜
k: kbb.com, kelly's blue book, 二手車價格查詢
l: localhost:4080, 那個... 這個... mldonkey的admin web界面地址
m: maps.google.com, 路癡之愛
n: 尚空! 尚空!
o: one-illinois.com, 現在居住地方的網站
p: pncvirtualwallet.com, 網銀地址
q: 還是空
r: renren.com, 人人你贏了
s: slickdeals.net, ft, 發覺我已經找deal上癮
t: twitter, 再加一個gossip上癮
u: uiucer.com/bbs, 學校CSSA的bbs
v: verycd.com, 找資源
w: wikipedia.org, 知識的源泉
x: xiaonei.com, 校內不是一個人在戰斗!
y: youtube.com, 娛樂休閒各種八卦
z: zzsound.com, 買音樂器材

另外數字的(出去空的):
1: 192.168.11.1: router 的 web 界面
5: 52internet.net/autocheck/, 免費查autocheck

over~