2011年11月9日 星期三

神奇的linux/unix運算程式dc

dc是一個linux/unix指令列工具,完全運用stack做運算

用它可能沒什麼特別的好處(除了可能會很快之外。照理說這種純stack運算的語言可以做到飛快),但是如果想對程式運作有更深的了解,花點時間玩一下會有幫助,因為所有程式的函數呼叫控制都是用stack完成。

寫了一個hanoi tower自娛用,執行dc -f hanoi.dc就可以了
hanoi.dc的內容如下:
#function z : move source to destiny
[[ ]n ls n [ -> ] n ld n [ ]p]sz

#function Q : quit and clear top of stack n,s,d,i
[LnLsLdLi sbsbsbsb q]sQ

#function X(n,s,d,i) : hanoi tower function,
#n: number ; s: source ; d: destiny ; i: intermediate
[
 ln 0=Q
 ln 1- Sn
 li ld Si Sd ls Ss
 lXx
 lzx
 ln 1- Sn
 li ls Si Ss ld Sd
 lXx
 LnLsLdLi sbsbsbsb  #this line clears the top of parameter stacks
]SX

[number of disk:]P?
[start pillar:]P?
[destination pillar:]P?
[intermidiate pillar:]P?
SiSdSsSn
lXx

2011年10月26日 星期三

五個為什麼


印度神話世界觀


小孩:為什麼我們能站著不會往下掉呢?
錯誤的回答示範
"因為有大地支撐啊"
"那大地不會往下掉?"
"因為有四大神州支柱啊"
"支柱下面呢"
"有四隻牛啊"
"那牛下面呢"
"有八隻象啊"
"那象下面呢"
"有一隻大烏龜啊"
"那烏龜下面呢"
"..."(一巴掌打過去)
正確的回答方式
"因為有大地支撐啊"
"那大地下面"
"還是大地自己啊"
(完)

雖然看起來是狡猾的循環論證,但是實際上卻沒有錯
因為地球是球形,真的是大地互相支撐,不用再往下撐了

在被人不斷追根究底的追問時,能夠有本有據的連續回答出五次,這已經代表你算是一個博學多聞的人了。

2011年9月22日 星期四

postgresql 中階層式資料表查詢

comment_id | parent_id | author | comment
------------+-----------+--------+---------------------------------
1 | 1 | Fran | What's the cause of this bug?
2 | 1 | Ollie | I think it's a null pointer
3 | 2 | Fran | No. I checked for that.
4 | 1 | Kukla | We need to check invalid input.
5 | 4 | Ollie | Yes, that's a bug.
6 | 4 | Fran | Yes, please add a check.
7 | 6 | Kukla | That fixed it.
以上列資料表為例(SQL Antipatterns, Bill Karwin, p36.),每一列都有一欄指向父親,最上層的父親欄位設為1(用null可以解決問題,但是很奇怪。因為null在sql中的邏輯意義是"未知",而不是"沒有",總之必須要有一個辦法表示root。設成1之後避免recursive query跑不完的辦法是把下面code當中的union all 改成union)。

如果資料庫有支援遞迴式查詢,用上述的結構實現階層式資料的話,也能用簡單的查詢查出資料。例如要查出4號comment為根的subtree,在postgresql只要運用以下查詢查詢即可
with RECURSIVE subtree_4(comment_id, parent_id) as (
select comment_id, parent_id from comments where comment_id = 4
union all
select c.comment_id, c.parent_id
from subtree_4 sub, comments c
where c.parent_id = sub.comment_id
)
select * from subtree_4;
參考資料

2011年8月23日 星期二

樂透號碼產生器

所謂樂透號碼,就是從某範圍整數中,隨機且不重複的選取其中幾個。例如台灣的今彩就是從1到39當中選5個。要從電腦隨機產生一組號碼,比較基本的有以下兩種

1.每個號碼隨機選號,選重複的再去掉。但是這方法很笨,而且選號一多就會慢到不行。

2.模仿開彩方式,按照正確機率依序選擇號碼。以今彩為例,抽中39號的機率是5/39,下一步驟抽中38號的機率就變成5/38(上步驟未抽中39號)或4/38(上步驟抽中39號),依此類推。

第二個方式顯然快多了。下面awk程式(lottery.awk)實現此作法

在類似unix系統環境下,實行

echo "1 39 5" | awk -f lottery.awk

或是perl:
#!/usr/bin/perl
$min=$ARGV[0];
$max=$ARGV[1];
$needed=$ARGV[2];
$available=$max-$min+1;
while (@selected < $ARGV[2]) {
if(rand() < $needed/$available) {
push(@selected, $available);
$needed -= 1;
}
$available -= 1;
}
foreach $number (@selected) {
print($number . "\n");
}


執行
$./lottery.pl 1 39 5

會印出1~39隨機取5個的數字

2011年8月16日 星期二

程式研究:akka的remote actor

akka的remote actor 是個神奇的東西,自動幫你處理了傳輸格式,你只要關心scala當中跟actor互傳的信息就好了。不過要讓akka 首頁上那段非常簡短的程式碼跑起來,需要不少準備。

首先是sbt,這是scala用的build tool,設定檔完全用scala語法表達,簡單方便。
執行sbt只需要一個jar檔和一個script,windows是bat檔,linux是shell script,設好了之後任意目錄下
執行sbt,回答問題之後就會自動產生目錄架構,之後就可以開始寫設定檔和程式了。
設定檔都在project目錄下,源代碼在src目錄下
project/build 之下,建立一個Project.scala,內容如下:
import sbt._
class ChatProject(info: ProjectInfo) extends DefaultProject(info) with AkkaProject {
val akkaRepo = "Akka Repo" at "http://akka.io/repository"
val akkaSTM = akkaModule("stm")
val akkaRemote = akkaModule("remote")
}


project/plugins 之下,建立一個Plugins.scala,內容如下
import sbt._
class Plugins(info: ProjectInfo) extends PluginDefinition(info) {
val akkaRepo = "Akka Repo" at "http://akka.io/repository"
val akkaPlugin = "se.scalablesolutions.akka" % "akka-sbt-plugin" % "1.1.3"
}


之後在sbt下,執行reload和update,就會按照上述的設定抓好必要的檔案並決定從屬關係
之後執行console,可以在此環境下直接執行scala的類似直譯器。

打開第二個command prompt視窗,在工作目錄下再運行一個sbt,此視窗當作client用,第一個視窗當作server,兩個視窗都執行console
server視窗輸入
import akka.actor.Actor
import Actor._
class HelloActor extends Actor {
def receive = {
case "Hello" => self.reply("world")
}
}
remote.start("localhost", 9999)
remote.register("hello-service",actorOf[HelloActor])


client視窗輸入
import akka.actor.Actor
import Actor._
val actor = remote.actorFor("hello-service", "localhost", 9999)
val result = actor !! "Hello"


這樣就收到了server傳來的訊息了。把server當成一個actor用 akka 1.1.3的文件

2011年8月2日 星期二

程式語言研究:scala 1.9

半年前發覺一個有趣的語言scala,它企圖結合編譯式和直譯式語言,以及物件導向和函數導向語言的優點,形成一套有趣卻眉角很多的程式語言,不管怎樣比java好很多是真的,但是發覺缺點主要有兩個,第一是型別參數,因為型別可以不固定,但是卻必須遵從某種形式,第二是仍然擺脫不了java,光靠scala自己仍是不足,經常必須要去用到java的物件或函數。換句話說就是只學了scala仍然不夠,還是得學java,變成想要用scala的話得學兩種語言,相當麻煩。

1.9版新增功能中最有趣的還是maxBy, minBy, permutations 和 combinations這幾個在collection中的方法,後面兩個組合學的函數還是遵從辭典式排列的,不過一般這種函數輸出都會照辭典式排列就是。

scala自帶的actor其實還不夠好用,配合akka服用會愉快許多。

2011年7月10日 星期日

鹹豬手事件簿



「鹹豬手事件簿」這電影讓日本男人搭電車時手舉得高高的,就怕被認為色狼。

原因不是因為色狼被閹掉然後雞雞拿去去煎煮炒炸或被粗勇大男雞姦一百次,而是因為無辜的人被當作色狼判刑,審判過程冗長而痛苦,最後的結果還是判刑,這比殺的血淋淋的影片更可怕,因為這確實是有發生過,而且很可能會繼續發生。

這電影完全不是一個娛樂片,因為裡面沒有慷慨激昂,沒有灑狗血也沒床戲,正義也不會勝利,有的只是現實和...現實。我最討厭的是日本片通常愛說教,這片子的說教卻讓我覺得恰如其分。