sicp 4.1 要寫一個 Metacircular Evaluator, 有個部份在處理 environment。把 car, cdr, +, - 這些 primitive procedure 定義在這環境裡, 是很重要的一步。不過 scheme cons pair 資料結構實在難倒我, 把這些部份獨立出來測試。
t1.scm L13 是最主要的部份, 結果是 res L5, 把 symbol -, + , car, cdr, cons, null? 集合成一個 list。
t2.scm 這個複雜一點, res2 L23 是要達成的效果。
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)。
2014年7月29日 星期二
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 語法的話可以修改重新編譯有點麻煩, 請手動刪除 *.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-bochsgdbqemu + 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 0x0007d20r, 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: 20111007bochs 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
拿來打 boss 等級的魔王都很好用。




由於我又卡關了, 所以找了攻略來看。以下是從攻略 1 節錄出來的祕技, 我的版本有 console mode, 可以使用。
密技修改器 & 遊戲小語 | ||||||||||||||||||||||||||||||||||
■>按此下載 ! 修改器(適用2011年隨「愛麗絲:瘋狂回歸」一起發售完整收藏版中的1代) ~ 解壓密碼為本站網址:http://vvv.myweb.hinet.net
■>遊戲操作:(建議把W改成↑,S改成↓;這樣就可用↑↓←→來操控較順手哦^^)
| ||||||||||||||||||||||||||||||||||
攻略:
- http://vvv.myweb.hinet.net/pcgame/gametxt/14_alice.htm
- http://obscure502.blogspot.tw/2009/06/american-mcgees-alice_10.html
http://www.ign.com/wikis/american-mcgees-alice/Guide_Part_3_-_Weapons
標籤:
pc game
2014年7月8日 星期二
sicp: 開發工具 - mit-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。
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
最簡單的用法, 來個階乘測試:
csc factorial_1.scm descent@deb64:3.1.3$ ./factorial_1 120
要先產生出 c souce code 也行, 文件拉到最下方, 麻煩多了。
mit-scheme 教學:
- http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/MITScheme_tutorial.pdf
- http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/Scheme_tutorial.pdf
- Simply Scheme, second edition
- The Little Schemer book
- http://www.cs.rpi.edu/academics/courses/fall05/ai/scheme/starting.html
- Scheme 語言概要(上/下):
http://www.ibm.com/developerworks/cn/linux/l-schm/index1.html
http://www.ibm.com/developerworks/cn/linux/l-schm/index2.html - http://blog.csdn.net/zzulp/article/category/682234
- 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, 換算物價所得不算貴, 那兩隻螯大的嚇人, 應該是長在螃蟹上才對吧! 井底之蛙如我就是這樣, 什麼事情都足以讓我小驚大怪, 驚呼連連,
料理這個之前要先用筷子插屁股, 當然是龍蝦的屁股, 不是我的, 放尿之後味道會更鮮美。

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

據說這是有名的建築物, 其腰身就是她最著名的特點, 據說難倒不少工程師, 可不是那麼容易蓋的。這兩天真的見識到天堂般的生活, 要住在這裡, 應該得花上不少銀子吧! 夢醒了, 該回到現實了, 明天前往芝加哥, 準備上工了。
停留時間: 20130525 ~ 20130526 (加拿大時間)
一出機場, 和墨西哥完全相反的天氣, 冷爆了。有著代理商接應, 比起自己要搞定行程實在溫馨多了, 上了一台廂型車, 足夠放上佔據不少空間的行李箱。享用了一頓中國式的晚餐料理, 這才是菜阿! 我完全不能適應墨西哥料理。

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

這兩天是天堂般的享受, 我真想一輩子待在這裡。
和悶熱煩雜的墨西哥有著完全相反的感受。
高級住宅區原來是長這樣阿!
這兩天剛好是六、日, 沒什麼公事可辦也是很合理的。
2013 年 5 月 25 日到尼加拉瓜瀑布一遊, 先到賭場裡頭的港式飲茶吃中餐, 類似昨天的晚餐, 熟悉的味道, 又是一頓酒足飯飽, 爽阿!
午餐後散個步欣賞一下雄偉的尼加拉瓜瀑布, 讓肚子消化一下美食。
尼加拉瓜瀑布在加拿大、美國各佔一個部份, 所以只要過個橋, 都會到美國了。這邊還有船可以搭乘, 每個人都會穿上藍色雨衣, 我從上望下去, 依稀看到藍色小點, 那就是滿船的觀光客, 能那麼接近瀑布, 想必是很壯觀的畫面吧。
今天的陽光大叔也很關照, 讓我得以不再面對昨天的寒冷, 這是個適合出遊的好天氣。在步道上來回的散步, 看看不熟悉的金髮臉孔, 我真的是身處異國, 到處都是陌生的感覺, 陌生的人物, 陌生的車輛, 陌生的景色, 陌生的陌生, 置身於這樣的環境, 抒解的之前的緊張芬圍, 總算能喘口氣, 享受難得的出國旅程 (不過我不是來旅行的就是)。
龍蝦大餐:
加拿大的龍蝦, 一隻約台幣 450, 換算物價所得不算貴, 那兩隻螯大的嚇人, 應該是長在螃蟹上才對吧! 井底之蛙如我就是這樣, 什麼事情都足以讓我小驚大怪, 驚呼連連,
料理這個之前要先用筷子插屁股, 當然是龍蝦的屁股, 不是我的, 放尿之後味道會更鮮美。
蒸一下就熟啦, 很多隻每個人都夠吃, 不過我吃了一隻就飽了, 味道實在是太棒了, 原諒我用這麼庸俗的辭彙, 好吃的東西哪需要什麼形容詞呢? 看也知道好吃的不得了。
據說這是有名的建築物, 其腰身就是她最著名的特點, 據說難倒不少工程師, 可不是那麼容易蓋的。這兩天真的見識到天堂般的生活, 要住在這裡, 應該得花上不少銀子吧! 夢醒了, 該回到現實了, 明天前往芝加哥, 準備上工了。
標籤:
north_america
訂閱:
文章 (Atom)

