2014年7月29日 星期二

sicp metacircular evaluator (0) - map/car/cdr

sicp 4.1 要寫一個 Metacircular Evaluator, 有個部份在處理 environment。把 car, cdr, +, - 這些 primitive procedure 定義在這環境裡, 是很重要的一步。不過 scheme cons pair 資料結構實在難倒我, 把這些部份獨立出來測試。

t1.scm
 1 (define primitive-procedures
 2   (list (list '- -)
 3         (list '+ +)
 4         (list 'car car)
 5         (list 'cdr cdr)
 6         (list 'cons cons)
 7         (list 'null? null?) 
 8         ))
 9 (display primitive-procedures)
10 (newline)
11 (display (car primitive-procedures))
12 (newline)
13 (display (map car primitive-procedures))
14 (newline)

t1.scm L13 是最主要的部份, 結果是 res L5, 把 symbol -, + , car, cdr, cons, null? 集合成一個 list。

res
1 1 ]=> (load "t1.scm")
2 
3 ;Loading "t1.scm"...((- #[arity-dispatched-procedure 11]) (+ #[arity-dispatched-procedure 12]) (car #[compiled-procedure 19 (list #x1) #xf #x3218d3]) (cdr #[compiled-procedure 14 (list #x2) #xf #x321917]) (cons #[compiled-procedure 16 (list #x3) #xc #x32195c]) (null? #[compiled-procedure 18 (list #x5) #xc #x3219b8]))
4 (- #[arity-dispatched-procedure 11])
5 (- + car cdr cons null?)
6 ;... done
7 ;Unspecified return value
8 
9 1 ]=> 

t2.scm 這個複雜一點, res2 L23 是要達成的效果。

t2.scm
 1 (define primitive-procedures
 2   (list (list '- -)
 3         (list '+ +)
 4         (list 'car car)
 5         ))
 6 
 7 
 8 (define (primitive-procedure-objects)
 9   (map (lambda (proc) (newline) (display proc) (newline) (newline) (display (cdr proc)) (newline)  (newline) (display (cadr proc)) (newline) (list 'primitive (cadr proc)))
10        primitive-procedures))
11 
12 (newline)
13 (display primitive-procedures)
14 (newline)
15 (display (primitive-procedure-objects))
16 (newline)

res2 L4 的 list 由 t2.scm L1~5 構成。L9 的 map 難倒我, proc 可以想成 res2 L4 的 list 裡頭的 list, 就是 L6, L12, L18, 把他們 cdr 後, 就變成 L8, L14, L20, 再 car 後, 就是 L10, L16, L22, 因為 (a) 其實是用 'a, nil 構成的 pair, car 取前面 ('a), cdr 取後面 (nil)。

res2
 1 1 ]=> (load "t2.scm")
 2 
 3 ;Loading "t2.scm"...
 4 ((- #[arity-dispatched-procedure 11]) (+ #[arity-dispatched-procedure 12]) (car #[compiled-procedure 13 (list #x1) #xf #x3218d3]))
 5 
 6 (- #[arity-dispatched-procedure 11])
 7 
 8 (#[arity-dispatched-procedure 11])
 9 
10 #[arity-dispatched-procedure 11]
11 
12 (+ #[arity-dispatched-procedure 12])
13 
14 (#[arity-dispatched-procedure 12])
15 
16 #[arity-dispatched-procedure 12]
17 
18 (car #[compiled-procedure 13 (list #x1) #xf #x3218d3])
19 
20 (#[compiled-procedure 13 (list #x1) #xf #x3218d3])
21 
22 #[compiled-procedure 13 (list #x1) #xf #x3218d3]
23 ((primitive #[arity-dispatched-procedure 11]) (primitive #[arity-dispatched-procedure 12]) (primitive #[compiled-procedure 13 (list #x1) #xf #x3218d3]))
24 ;... done
25 ;Unspecified return value
26 
27 1 ]=> 

2014年7月24日 星期四

bochs 2.5.1/bochs 2.6 編譯/指令介紹

the 1st edition: 2012/02/11
the 2nd edition: 2013/02/05
the 3rd edition: 2014/07/24

從 source code 編譯 bochs 2.5.1/bochs 2.6.6/bochs 2.6.8, 通常我會需要以下這兩種版本的除錯方式。

使用內建 debugger

因為需要內建 debug 的功能, 所以從 source code 編譯開始 (通常預先編譯好的版本都沒這功能)。這只能針對組合語言除錯。

download source code: http://jaist.dl.sourceforge.net/project/bochs/bochs/2.6.6/bochs-2.6.6.tar.gz

apt-get build-dep bochs 會安裝編譯 bochs 所需要的 library

apt-get build-dep bochs
apt-get install libreadline6-dev libsdl1.2-dev libwxgtk2.8-dev

預設會使用 intel syntax, 想要改 at&t 語法的話可以修改

bochs-2.6.8/disasm/disasm.h
1 class disassembler {
2 public:
3 -  disassembler(): offset_mode_hex(0), print_mem_datasize(1) { set_syntax_intel(); }
4 +  disassembler(): offset_mode_hex(0), print_mem_datasize(1) { set_syntax_att(); }
重新編譯有點麻煩, 請手動刪除 *.o, 不要用 make clean, 若是第一次編譯, 就沒這問題。 ./configure --enable-debugger --enable-debugger-gui --enable-iodebug --enable-readline --with-sdl --with-x11 --with-x --with-wx --enable-disasm --enable-smp make make install --enable-smp : 多 cpu 支援。


readline 建議加上, 你能想像 dos 沒有 doskey 或是 bash 沒有 history 的功能嗎?

我在 debian jessie x64 上遇到一些問題, 改用 gcc 4.6, g++ 4.6, 並拿掉 --with-wx

export CC=gcc-4.6
export CXX=g++-4.6
../bochs-2.6.6/configure --enable-debugger --enable-debugger-gui   --enable-iodebug --enable-readline --with-sdl --with-x11 --with-x --with-wx --enable-disasm

最後 link 還得手動把 -lpthread 加入 Makefile LIBS 變數, 才能編譯成功。

ls /usr/local/bin/ 就可以看到相關檔案:
bochs  bxcommit  bximage 

複製 /usr/local/share/doc/bochs/bochsrc-sample.txt 為自己的 bochs 設定值檔案 bb, 這很重要, 請不要使用舊版的設定, 可能無法正常啟動 bochs, 然後修改需要的設定值。

執行 bochs:
bochs -f bb

bochs 模擬的硬體:
http://bochs.sourceforge.net/doc/docbook/user/features.html

使用 GDB 來配合除錯

使用Bochs和GDB对内核进行源代码级调试 (連接已經失效): http://osfromscratch.org/articlescn/5-articlecn/16-bochsgdb

qemu + gdb 的版本: http://dc0d32.blogspot.tw/2010/03/debugging-kernel-with-qemu-and-gdb.html

這兩種 debug 方式不能並存, 所以得編譯兩種不同的版本。
support remote gdb:

./configure --prefix=/home/descent/bochs-2.5.1-gdb --enable-gdb-stub --enable-debugger-gui --enable-iodebug --enable-readline --with-sdl --with-x11 --with-x --with-wx --enable-disasm

這個方法好酷, 可以針對 c 語言除錯, 不用辛苦和組合語言拼鬥。

From write_os

bochs 執行時需要設定檔, 這個部份比較麻煩, 安裝目錄會有一個範例, 以我的例子是在
/home/descent/bochs-2.6.8-default-debug/share/doc/bochs/bochsrc-sample.txt
需要修改這個, 在使用 -f 載入這個設定檔。

/home/descent/bochs-2.6.8-default-debug/bin/bochs -f bochsrc-sample.txt

不同版本的設定檔可能無法使用, 若新版 bochs 無法使用舊版設定檔, 請從範例修改。

常用 command

有些命令似乎有改過, 和書中 (書上的版本比較舊) 提的有些不同

切換反組譯的組合語言程式碼是 at&t 還是 intel 語法。
u switch-mode

觀察記憶體指令
from 0x0007d20 開始 5 byte 以 16 進位顯示
x /5xb 0x0007d20
x /5xbm 0x0007d20 
r, sreg 分別秀出 register 的值
r
eax: 0x00001301 4865
ecx: 0x00090005 589829
edx: 0x000f0000 983040
ebx: 0x0000000c 12
esp: 0x0000ffff 65535
ebp: 0x00007c4c 31820
esi: 0x000e7c84 949380
edi: 0x00007c84 31876
eip: 0x00007c11
eflags 0x00000046: id vip vif ac vm rf nt IOPL=0 of df if tf sf ZF af PF cf

sreg
es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x000fbb67, limit=0x30
idtr:base=0x00000000, limit=0x3ff

bochs 2.4.5 設定 (linux)

the 1st edition: 20111007

bochs 2.4.5 已經過時, 這只是紀錄用。

binary 安裝方式:
2.4.5 bochs 的設定檔和之前不同, 從 /etc/bochs-init/bochsrc 修改比較沒問題,

這幾個 ui 相關 library 最好也要安裝, 免得有什麼奇怪的錯誤訊息。
apt-get install bochs-wx bochs-x bochs-sdl

可能和這一行有關, sdl 大概需要安裝 sdl 的 library, wx, x 可能是 wx, x lib。
display_library: sdl

有出現 ROM: System BIOS must end at 0xfffff
修改 romimage

#romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
romimage: file=/usr/share/bochs/BIOS-bochs-latest

config_interface: textconfig
#romimage: file=/usr/share/bochs/BIOS-bochs-latest, address=0xf0000
romimage: file=/usr/share/bochs/BIOS-bochs-latest
megs: 32
vgaromimage: file=/usr/share/vgabios/vgabios.bin
floppya: 1_44=freedos.img, status=inserted
floppyb: 1_44=pm.img, status=inserted

boot: a

mouse: enabled=0

hd image 的製作方式:
http://bochs.sourceforge.net/doc/docbook/user/howto.html

2014年7月23日 星期三

[pc game]: American McGee's Alice



發售日期:2000-12-06, 我大概是西元 200? 左右買的, 花了 864nt, 不算便宜的大作。有著討人厭的光碟壞軌保護。這不是和 alice madness returns bound 的版本, 在我買這款遊戲時, 還沒有 alice madness returns。



這樣的人物在 2014 年, 已經不能算是「好看」了。和 alice madness returns (愛麗絲驚魂記:瘋狂再臨) 相比, 畫面真的不怎麼樣, 十年電腦動畫的進步有著顯著的不同。已經沒有那麼稜稜角角了, 不過在當時已經算是不錯的畫面。

我是先玩 alice madness returns 然後才來回味 American McGee's Alice, American McGee 是開發這個遊戲的作者, 我一開始還搞不清楚這遊戲名, 和美國有什麼關係, 中文翻做愛麗絲驚魂記, 就打在盒子的側邊。



一樣有瘋狂模式, 不過真的太醜了。連 boss 等級的怪物也很醜, 3D 感也很不足, 好像是平面的感覺。



alice madness returns 的畫面 (下圖) 真的是漂亮多了。沒有「愛」還真的玩不下去。



遊戲方式當然差不多, 跳跳一些障礙物, 拉動一些開關, 打打怪物, 動腦袋解謎。貓、兔子、西洋棋衛兵這些人物當然也都有。

steam 大約是在 2002 開始開發, 買這個遊戲時自然還沒有 steam, 但 steam 可以加入這個遊戲, 也可使用 steam 的抓圖功能, F12 按下去就搞定了。

遊戲難度自然沒有 alice madness returns 難, 不過 Machinations 那關真的有難到, 一直在轉動的齒輪中跳躍, 很容易就摔下來, 還好可以隨時存檔, 這是比 alice madness returns 好的一點, alice madness returns 無法隨時存檔, 很容易得重完一些關卡。

20140715 我終於破關了, 累積了十幾年才破了這個遊戲, 總算也完成一個心願。剛買的時候也不是沒玩過, 只是一直卡關, 沒想到這次玩的還蠻順利, 搭配網路上找的攻略/祕技, 花的時間不算多。2014 的硬體來玩這塊遊戲自然沒問題, 跑的很順, 只是解析度和目前主流的寬螢幕不一樣, 兩邊就被去掉了。

破關動畫 (下圖) 沒特別精彩, 以前的遊戲動畫和遊戲畫面差很多, 下圖就好了不少, 因為是動畫, 不過解析度並不高就是。

寄件者 American McGee's Alice

一樣是驚悚劇情為主, 音樂風格就類似電影的鬼片, 晚上自己一個人玩的話還真有點怕怕的,不過畫面給人的感覺倒是沒有那麼驚悚, alice madness returns 的畫面比較驚悚。

這種類似古墓奇兵的類型是我喜歡的遊戲類型, 麻煩的就是按鍵操作, 我不喜歡使用 mouse, 但偏偏得使用 mouse 才能方便的觀看整個遊戲方向, 我也總是有著自己的按鍵設定, 預設的按鍵總是用不習慣。

最後的「紅心女王」大魔王, 被我用 Blunderbuss (喇叭槍) 轟個幾下就掛了, 喇叭槍威力太強了。

Blunderbuss
RTENOTITLE

拿來打 boss 等級的魔王都很好用。



由於我又卡關了, 所以找了攻略來看。以下是從攻略 1 節錄出來的祕技, 我的版本有 console mode, 可以使用。

密技修改器 & 遊戲小語
■>按此下載 ! 修改器(適用2011年隨「愛麗絲:瘋狂回歸」一起發售完整收藏版中的1代) ~ 解壓密碼為本站網址:http://vvv.myweb.hinet.net
PS 1:或許有些防毒軟體會將修改器判定為病毒,若有此安全上之疑慮,則請勿使用,謝謝!
2:本站若有提供下載的檔案,解壓密碼一律為本站固定網址:http://vvv.myweb.hinet.net
3:本站檔案皆解壓測試OK!倘若您下載後、解壓發生密碼錯誤問題:
(1)或許是您下載不完全導致,請重新下載再解壓試試。
(2)檔案是以WinRAR軟體製作,請以WinRAR軟體來執行解壓縮。
■>遊戲密技:(筆者玩的是2011年收藏版,所以此密技沒試過!)
  此密技適用於2000年發行的單獨版本,2011年隨「愛麗絲:瘋狂回歸」一起發售的完整收藏版中一代則不適用 (因為沒CONSOLE這選項了>'<)。
進入遊戲主選單的設定 (SETTINGS) 畫面,選擇4 (GAME OPTIONS),將裡面的 CONSOLE 這個選項打勾;進入遊戲後,按下 " ~ " 鍵(ESC下方那個鍵) 打開控制台模式,輸入密技 :
god =無敵
wuss =得到所有武器
noclip =穿牆模式
health # =將生命值設定為# (最多100)
notarget =敵人看不見你
give all =得到所有武器及子彈
map # =跳關 (#為關卡代號)

跳關英文代號:

命運峽谷(VILLAGE OF THE DOOMED)
gvillage [重現夢境]
pandemonium [尋訪智者]

城堡之門(FORTRESS OF DOORS)
fortress2 [前進城堡內部]
fortress1 [變身藥水]
skool2 [尋要糖塊和罌粟]
skool1 [尋找天文館]

眼淚池塘(POOL OF TEARS)
potears1 [追蹤牛怪]
potears2 [順流而下]
potears3 [公爵夫人]
utemple [跟隨牛怪]

大陸森林(WONDERLAND WOODS)
garden1 [飛越石澗]
garden2 [白兔慘死]
garden3 [巨石追殺]
garden4 [尋找毛毛蟲]
centipede1 [蘑菇森林]
centipede2 [對戰蜈蚣]
謎鏡大陸(LOOKING GLASS LAND)
wchess1 [象棋王國]
wchess2 [白棋王宮]
rchess1 [生死之際]
funhouse [魔鏡幻像]

烈焰大陸(LAND OF FIRE AND BRIMSTONE)
jlair1 [離奇火域]
jlair2 [決戰翼龍]

大陸森林(WONDERLAND WOODS)
wforest [毛蟲廣場]

美麗花園(QUEEN OF HEARTS LAND)
hedge1 [錯綜迷宮]
tower1 [恐怖飛行]
hedge2 [瘋狂迷境]
tower2 [水塔通道]
hedge3 [迷宮復仇]
tower3 [齒輪跳躍]

女王大陸(QUEENSLAND)
grounds1 [龍獸大戰]
grounds2 [戰在曲橋]
facade [飛渡天塹]
keep [王宮大殿]
qlair [黑暗之心]

■>遊戲操作:(建議把W改成↑,S改成↓;這樣就可用↑↓←→來操控較順手哦^^)
W、A、S、D 控制方向 / 攀岩時:左右移、爬上下
空白鍵 跳躍 / 懸空抓繩時則為放手
滑鼠 左鍵 (普通攻擊)、右鍵 (特殊攻擊) / 爬繩時:左鍵 (爬下)、右鍵 (爬上)
視野轉向 ← 視野向左轉、→ 視野向右轉;滑鼠移動
數字鍵 更換武器 (所持有的武器種類,由1~0排列 ,共有10種武器如下:)
1:斬首之刃 6:血蒺藜
2:魔術花牌 7:惡魔骰子
3:鳥喙杖 8:惡龍之瞳法杖 (劇情必要取得之武器)
4:狂怒箱 9:老獵槍
5:冰蓓蕾 0:卡西歐懷錶
「愛麗絲」手上武器不同,其在靜止時的小動作也會有所不同哦^^
ESC鍵 取消 / 回選單儲存讀取檔
Enter鍵 使用

攻略:
  1. http://vvv.myweb.hinet.net/pcgame/gametxt/14_alice.htm
  2. http://obscure502.blogspot.tw/2009/06/american-mcgees-alice_10.html
ref:
http://www.ign.com/wikis/american-mcgees-alice/Guide_Part_3_-_Weapons

    2014年7月8日 星期二

    sicp: 開發工具 - mit-scheme

    這本書使用的語言是 scheme, 是 lisp 的一種方言, scheme 有很多實作品, 書是 mit press, 我自然找了 mit-scheme 來用, 也是 gnu 的產品之一, 在 ms windows, linux 都可以使用; guile 也是 gnu 的 scheme 實作品。

    據聞在最後一堂課時, 使用的 scheme 是 DrScheme (目前已更名為 Racket), 我沒有特別研究那個好, 只是這本書是 mit press, 我當然找 mit-scheme 來用, 書上也多少會提到 mit-scheme 有哪些 feature, 正好也是這本書的範例可以使用的功能。

    其他的 Scheme implementations: http://community.schemewiki.org/?scheme-faq-standards#implementations

    雖然有很多的 scheme 實作, 不過 4.1 的 metacircular evaluator 範例我在 guile, chicken 的 scheme 實作品上都無法順利執行, 若不想修改程式碼, 還是跑在 mit-scheme 比較保險。

    這篇不是 scheme 的教學, 我都還不會怎麼可能寫得出教學文, 這只是在說明如何使用 mit-scheme 的開發環境和比較常用的功能。

    想學 lisp 很久了, 這次就靠這本書來學習吧, scheme 也可以啦, 反正都是那種很多小括弧的東西。本書並不是專門用來教學 scheme, 只會提到範例程式中所需要的語法, 不過這樣也算夠用, 要深入的話還得參考相關 scheme 書籍。

    如果要編譯 mit-scheme 可以從 http://www.gnu.org/software/mit-scheme/ 下載 Portable C 的版本, 我希望你不需要用到這招, 我在 gentoo 上需要這麼做, http://www.gnu.org/software/mit-scheme/liarc-build.html 這裡有編譯方法。

    linux/debian 安裝還是用 apt-get:

    apt-get install mit-scheme

    windows 的安裝應該難不倒你, 你都挑了這麼冷門的東西來學, 應該和我一樣, 是個品味很特別的程式員。

    最好也安裝一下說明文件, 這東西很冷門的, 幾乎找不到什麼網路教學文章, 自己 K 文件吧!

    apt-get install mit-scheme-doc

    執行: mit-scheme

    descent@debian-vm:~$ mit-scheme

    會跑出一個 mit-scheme 環境, 可以輸入程式碼, 結果會立刻跑出來, 很像 dos 下的 etbasic。

    mit-scheme
     1 descent@deb64:/media/sdb1/descent/git/blog_articles/lisp$ mit-scheme
     2 MIT/GNU Scheme running under GNU/Linux
     3 Type `^C' (control-C) followed by `H' to obtain information about interrupts.
     4 
     5 Copyright (C) 2011 Massachusetts Institute of Technology
     6 This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or
     7 FITNESS FOR A PARTICULAR PURPOSE.
     8 
     9 Image saved on Friday August 30, 2013 at 4:37:34 PM
    10   Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118 || Edwin 3.116
    11 
    12 1 ]=> (+ 1 2 3)
    13 
    14 ;Value: 6
    15 
    16 1 ]=> 
    

    L12 就是我輸入的程式碼。

    說真的, 我還真不習慣在一個 interpretation 環境下開發程式, 。

    文件上建議使用 Edwin 來輸入 scheme 程式, edwin 很類似 emacs, 有除錯器的功能。
    file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/Edwin.html#Edwin
    說明如何使用 edwin。

    我敢打賭, 你要是沒用過 emacs, 絕對恨透了 edwin 這東西, 難用到暴。還是先回到 interpretation 環境下。

    mit-scheme document
    file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/index.html
    這文件最好先看一下, 要不然還真的不知道怎麼使用 interpretation 環境下的操作方式。

    ctrl+c q exit mit-scheme
    (exit) 也可以離開 mit-scheme。

    (quit) 不是離開, 而是在背景執行 mit-scheme, fg 就可以把畫面叫回來。

    (load "filename.scm")
    可以載入一個 scheme 檔案。

    4.1 Compilation Procedures
    file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/Compilation-Procedures.html#Compilation-Procedures
    (cf "foo")

    不像 c compiler 一樣, 可以很乾脆的產生一個執行檔。他產生的 binary 只是讓 interpretation 環境載入用。

    再回到開頭的 edwin, 它很難用, 不過我還是比較常用這個, 因為那個 interpretation 環境我覺得更難用。

    file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/Edwin-Scheme-Evaluation.html#Edwin-Scheme-Evaluation
    會說明如何執行在 edwin 敲入的程式碼。簡單點就是在你要執行的程式碼後面按下 ctrl+x ctrl+e。

    M-o 會計算檔案中所有的 express。

    edwin 很類似 emacs, 所以連按鍵都很類似。

    ctrl+x ctrl+f 可以載入檔案。
    ctrl+x ctrl+c 離開 edwin。
    ctrl+x ctrl+s 存檔。

    C-@ mark
    C-x C-x 可以查看 mark 的位置, 不知道意思的話, mark 完之後一直按 C-x
    M-w copy
    C-w delete

    C-x b switch buffer
    C-x k kill buffer

    C-x o 切換 window
    C-x 2 分割成兩個 window
    C-x 0 (數字0) 關掉游標在的那個 window

    edwin REPL mode:
    M-x repl 可進入 REPL mode

    這東西太冷門了, 希望有人因為我這篇文章一起來學習 scheme。

    scheme compiler: CHICKEN Scheme, 這東西可以產生一個獨立的執行檔, 真是太酷了。

    用 apt-get 搞定它。

    apt-get install chicken-bin

    編譯用法:
    http://wiki.call-cc.org/man/4/Using%20the%20compiler

    最簡單的用法, 來個階乘測試:

    factorial_1.scm
     1 (define (factorial n)
     2   (define (iter product counter)
     3     (if (> counter n)
     4       product
     5       (iter (* counter product)
     6             (+ counter 1))))
     7     (iter 1 1))
     8 
     9 (write (factorial 5))
    10 (newline)
    

    csc factorial_1.scm
    
    descent@deb64:3.1.3$ ./factorial_1 
    120
    

    要先產生出 c souce code 也行, 文件拉到最下方, 麻煩多了。

    mit-scheme 教學:
    1. http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/MITScheme_tutorial.pdf
    2. http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/Scheme_tutorial.pdf
    3. Simply Scheme, second edition
    4. The Little Schemer book
    5. http://www.cs.rpi.edu/academics/courses/fall05/ai/scheme/starting.html
    6. Scheme 語言概要(上/下):
      http://www.ibm.com/developerworks/cn/linux/l-schm/index1.html
      http://www.ibm.com/developerworks/cn/linux/l-schm/index2.html
    7. http://blog.csdn.net/zzulp/article/category/682234
    8. MIT Scheme 的基本使用:
      http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm

    ref:
    as script:
    http://snippets.dinduks.com/mit-scheme-run-a-script
    http://vepa.in/technology/mit-scheme-unix-scripts-and-cgi

    scheme < script.scm | grep ";Value:" | sed "s/;Value: /Result: /" 
    scheme-run () { scheme < $1 | grep ";Value:" | sed "s/;Value: /Result: /" } 
    

    Petite Chez Scheme (從 Scheme 编程环境的设置得知, 據說效能很好):
    http://scheme.com/download/index.html#sec:petitechezscheme

    2014年7月6日 星期日

    將 moulton tsr 旅行車化 - 三部曲 - moulton 的側邊菜籃



    之前有買過類似的, 不過已經損毀了, 20140704 購於高雄華廈捷安特, 100nt, 我因為要維修後煞車線找上這家店, 維修花了 150, 順便帶了這個。和之前那個比起來, 這個間隙比較大, 也小了點, 不過我還蠻喜歡的, 有這個就不用把馬鞍袋掛上了。


    2014年7月1日 星期二

    北美洲大陸一行 (2) - 加拿大/多倫多

    20130524 ~ 20130525 墨西哥 -> 加拿大/多倫多
    停留時間: 20130525 ~ 20130526 (加拿大時間)

    一出機場, 和墨西哥完全相反的天氣, 冷爆了。有著代理商接應, 比起自己要搞定行程實在溫馨多了, 上了一台廂型車, 足夠放上佔據不少空間的行李箱。享用了一頓中國式的晚餐料理, 這才是菜阿! 我完全不能適應墨西哥料理。



    這算是港式料理, 不過也算是熟悉的味道, 吃的好飽好滿足。



    這兩天是天堂般的享受, 我真想一輩子待在這裡。



    和悶熱煩雜的墨西哥有著完全相反的感受。



    高級住宅區原來是長這樣阿!

    這兩天剛好是六、日, 沒什麼公事可辦也是很合理的。

    2013 年 5 月 25 日到尼加拉瓜瀑布一遊, 先到賭場裡頭的港式飲茶吃中餐, 類似昨天的晚餐, 熟悉的味道, 又是一頓酒足飯飽, 爽阿!

    午餐後散個步欣賞一下雄偉的尼加拉瓜瀑布, 讓肚子消化一下美食。



    尼加拉瓜瀑布在加拿大、美國各佔一個部份, 所以只要過個橋, 都會到美國了。這邊還有船可以搭乘, 每個人都會穿上藍色雨衣, 我從上望下去, 依稀看到藍色小點, 那就是滿船的觀光客, 能那麼接近瀑布, 想必是很壯觀的畫面吧。



    今天的陽光大叔也很關照, 讓我得以不再面對昨天的寒冷, 這是個適合出遊的好天氣。在步道上來回的散步, 看看不熟悉的金髮臉孔, 我真的是身處異國, 到處都是陌生的感覺, 陌生的人物, 陌生的車輛, 陌生的景色, 陌生的陌生, 置身於這樣的環境, 抒解的之前的緊張芬圍, 總算能喘口氣, 享受難得的出國旅程 (不過我不是來旅行的就是)。

    龍蝦大餐:


    加拿大的龍蝦, 一隻約台幣 450, 換算物價所得不算貴, 那兩隻螯大的嚇人, 應該是長在螃蟹上才對吧! 井底之蛙如我就是這樣, 什麼事情都足以讓我小驚大怪, 驚呼連連,

    料理這個之前要先用筷子插屁股, 當然是龍蝦的屁股, 不是我的, 放尿之後味道會更鮮美。



    蒸一下就熟啦, 很多隻每個人都夠吃, 不過我吃了一隻就飽了, 味道實在是太棒了, 原諒我用這麼庸俗的辭彙, 好吃的東西哪需要什麼形容詞呢? 看也知道好吃的不得了。



    據說這是有名的建築物, 其腰身就是她最著名的特點, 據說難倒不少工程師, 可不是那麼容易蓋的。這兩天真的見識到天堂般的生活, 要住在這裡, 應該得花上不少銀子吧! 夢醒了, 該回到現實了, 明天前往芝加哥, 準備上工了。

    2014年6月26日 星期四

    自己要吃的麵自己做

    油麵 材料 % 重量
    1 水 33 330
    2 鹽 1 10
    3 鹼水 0.3 3
    4 中粉 100 1000
    5 沙拉油 10 100

    合計 144.3 1443

    1,2,3,4,5 打成糰, 用壓延機壓到光亮, 分成幾個小糰再壓, 因為麵糰很乾, 這樣比較好壓。再用機器壓成麵條。



    沒有機器怎麼辦, 只好靠雙手和菜刀了, 會很難做, 麵圖實在太硬了。