Gentoo : Intel® Pentium® 4 Computer Language Benchmarks Game
很有趣,OCaml 其實還蠻快的,Python/PHP/Ruby 自然慢得不得了,Scheme 竟然很慢(怪!) 但 LISP SBCL 非常快!
有兩個語言出乎意料:
Isaac
Smart Eiffel
該找時間研究一下...
2008-09-06
DOS下使用flat mode的好工具 -- Watcom C
部門的專案要在 DOS 下存取 ACPI Table。依據 ACPI Specification 3.0b,ACPI Table 首先是在 F000:0000-FFFF 段中放一段 RSDP,由 "RSD PTR " 標示 RSDP 進入點,從那找到 XSDT (32位元位址,通常在 0x7Fxx_xxxx) 後,再查到 FADT 及 DSDT 。由於 XSDT, FADT, DSDT 都在32位元位址,偷懶的我自然想找些 DOS Extender 來處理,不想自己切進保護模式。
我首先想到的是 djgpp 。一直以來 djgpp 用得十分順手,像這樣:
可是,不知道為什麼,只要存取到 0x7F 位址,SIGSEGV 馬上就跑出來,查了 ds selector 的範圍,一切都 OK ,但程式就是動不了。
爬文爬了很久,有人用 Borland C++ 編出來的程式能動,但我不想裝 Borland C++. 靈機一動,想起 DOS4GW ,上網一找果然 Watcom C 已經釋出成為免費軟體了,改名叫 Open Watcom。
照著範例寫一寫,32-bit flat mode 真的很棒,像這樣:
這樣就可以存取了耶,讚!因為這樣我就可以
了,簡捷易懂,而且以 Watcom C 的強大最佳化能力,應該不會和 djgpp 的 movedate() 差多少。
Watcom 的編譯是另一個問題。DOS 下編譯器的開關百百種,Makefile 也是各家不同。Turbo C 和 GNU Make 很不同,Watcom 也有自己的 wmake 格式。此外,32-bit flat mode 可以選的 DOS extender 非常多種,但同樣的 ACPI 程式,用 CauseWay 一樣會 SIGSEGV,但用 DOS4GW 和 PMODE/W 卻非常 OK。幸好,Open Watcom 附上了一個 IDE, 可以幫忙設定幾個旗標,再配上 sample 目錄下的 makefile, 很快就可以做出自己想要的效果了。
Watcom 的 makefile 長這樣:
天啊! 什麼鬼... 還好有 sample 可以參考。把 LNKOPT 的 pmodew 換成 dos4g, 就可以做成用 DOS4GW 的執行檔了。
選用哪個 extender 也得比較比較。djgpp 預設使用 CSDPMI,沒事帶著幾個 DPMI run-time 挺煩人的。DOS4GW 一叢大大 200 多 K, 一樣讓人心情不佳。DOS/32A 很棒,但 PMODE/W 更棒更小,整個程式做完只要 30K ,不需外掛 run-time. 使用 extender 省下的切進切出保護模式的時間,也實在是讓人夠開心了。
最後講一些 djgpp 和 Watcom 的差異。這困擾了我幾個小時...
makefile 不同是小事,反正我都寫些小工具,大不了寫批次檔。差異都是些討厭的地方,像..
djgpp:
Watcom:
這點比較起來,Watcom 的似乎比較 ANSI 一點呢! 可是啊,我真是太~~愛 djgpp 的 AT&T 式組語了。真好用。這下要切回 MASM 相容模式,還需要一點點適應的時間...
我首先想到的是 djgpp 。一直以來 djgpp 用得十分順手,像這樣:
char x = _farpeekb(_dos_ds, 0xFFFFFFE4); 或是
movedata(_dos_ds, base, _my_ds(), (unsigned)buf, len);
可是,不知道為什麼,只要存取到 0x7F 位址,SIGSEGV 馬上就跑出來,查了 ds selector 的範圍,一切都 OK ,但程式就是動不了。
爬文爬了很久,有人用 Borland C++ 編出來的程式能動,但我不想裝 Borland C++. 靈機一動,想起 DOS4GW ,上網一找果然 Watcom C 已經釋出成為免費軟體了,改名叫 Open Watcom。
照著範例寫一寫,32-bit flat mode 真的很棒,像這樣:
char *ptr = (char *)0x000FFFEA;
char x = ptr[0];
這樣就可以存取了耶,讚!因為這樣我就可以
for(i = 0; i < len; i++) buf[i] = ptr[i];
了,簡捷易懂,而且以 Watcom C 的強大最佳化能力,應該不會和 djgpp 的 movedate() 差多少。
Watcom 的編譯是另一個問題。DOS 下編譯器的開關百百種,Makefile 也是各家不同。Turbo C 和 GNU Make 很不同,Watcom 也有自己的 wmake 格式。此外,32-bit flat mode 可以選的 DOS extender 非常多種,但同樣的 ACPI 程式,用 CauseWay 一樣會 SIGSEGV,但用 DOS4GW 和 PMODE/W 卻非常 OK。幸好,Open Watcom 附上了一個 IDE, 可以幫忙設定幾個旗標,再配上 sample 目錄下的 makefile, 很快就可以做出自己想要的效果了。
Watcom 的 makefile 長這樣:
LNKOPT = option quiet system pmodew
exes = oemid.exe pmbase.exe
all : $(exes) .SYMBOLIC
@%null
oemid.exe : oemid.obj
wlink $(LNKOPT) name oemid file oemid
.c.obj :
$(CC) $^& $(CFLAGS)
天啊! 什麼鬼... 還好有 sample 可以參考。把 LNKOPT 的 pmodew 換成 dos4g, 就可以做成用 DOS4GW 的執行檔了。
選用哪個 extender 也得比較比較。djgpp 預設使用 CSDPMI,沒事帶著幾個 DPMI run-time 挺煩人的。DOS4GW 一叢大大 200 多 K, 一樣讓人心情不佳。DOS/32A 很棒,但 PMODE/W 更棒更小,整個程式做完只要 30K ,不需外掛 run-time. 使用 extender 省下的切進切出保護模式的時間,也實在是讓人夠開心了。
最後講一些 djgpp 和 Watcom 的差異。這困擾了我幾個小時...
makefile 不同是小事,反正我都寫些小工具,大不了寫批次檔。差異都是些討厭的地方,像..
djgpp:
asm { "cli" }
outportl(0xcf8, i & ~3);
x = inportl(0xcfc);
asm { "sti" }
movedata(_dos_ds, RSDP+24, _my_ds(), XSDT, 4); /* 32位元位置 = 4 bytes */
Watcom:
__asm { "cli" }
outpd(0xcf8, i & ~3);
x = inpd(0xcfc);
__asm { "sti" }
#define PTRPTR(x) (char *) *(char **)(x)
XSDT = PTRPTR(RSDP+24); /* 存取指標的指標 */
這點比較起來,Watcom 的似乎比較 ANSI 一點呢! 可是啊,我真是太~~愛 djgpp 的 AT&T 式組語了。真好用。這下要切回 MASM 相容模式,還需要一點點適應的時間...
2008-08-22
DOS 下使用 NetBIOS
有經過 DOS 時代的人應該不陌生,所以只是寫在這裡留個紀錄。程式不知道還受不受版權保護,所以先不放上來...
config.sys:
DEVICEHIGH=\NET\PROTMAN.DOS /i:\NET
DEVICEHIGH=\NET\B57.dos
DEVICEHIGH=\NET\NTSTS.DOS
DEVICEHIGH=\NET\DLSHELP.SYS
DEVICEHIGH=\NET\DIS_PKT.DOS
autoexec.bat:
NETBIND.COM
SET TCPHELP=A:\NET
SET ETCDIR=A:\NET
set wattcp=a:\net\wattcp.cfg
\NET\NET START /YES /COMPUTERNAME:*
\NET\NET.EXE USE X: \\server\dir
config.sys:
DEVICEHIGH=\NET\PROTMAN.DOS /i:\NET
DEVICEHIGH=\NET\B57.dos
DEVICEHIGH=\NET\NTSTS.DOS
DEVICEHIGH=\NET\DLSHELP.SYS
DEVICEHIGH=\NET\DIS_PKT.DOS
autoexec.bat:
NETBIND.COM
SET TCPHELP=A:\NET
SET ETCDIR=A:\NET
set wattcp=a:\net\wattcp.cfg
\NET\NET START /YES /COMPUTERNAME:*
\NET\NET.EXE USE X: \\server\dir
2008-08-14
在 Aspire One Linux 安裝 VirtualBox
即使 Linux 桌面已經很好用了,還是難免有需要用到 IE 、網路銀行、電子下單等等功能的時候,所以安裝一套 VirtualBox 再裝個 Windows XP 或 2000 應該是再好不過的選擇了。恰好,宏碁今天早上釋出了 Aspire One Linux 用的 2.6.23.9lw 的 kernel source ,我們正好拿來試試。
先說個題外話。他們剛釋出原始碼不久,我就接到宏碁請託本公司某部門的人來電關切,說大家可以認識認識,有什麼需求當面比較容易談清楚。不過既然原始碼都放出來,也就不用見面了,廠商客戶雙贏,挺好的。
安裝有一些要點: (1)需要 vboxdrv.ko (2)要把 user 加進 vboxusers 群組 (3)之前關掉 swap 的人記得先暫時加回去。以下分項說明。
先去下載VirtualBox,選擇 Fedora 8 (i386) 版,進 terminal 中 rpm -ivh VirtualBox-1.6.4_33808_fedora8-1.rpm 。這時候一定會看到無法編譯 kernel module 的訊息。沒關係,我們下一步就要處理。
編譯 vboxdrv.ko
先講正規的做法。首先,去 Aspire One 的FTP站下載核心原始碼。建議下載到裝在桌機的 Linux 再編譯...
由於他們使用 zip 壓縮,symbole link 被還原了,所以其中有一個目錄得先砍掉,否則不能編譯。假設你下載到另一台 Linux 上的 /usr/src ,解開來,然後輸入以下命令:
編譯完後,把整個目錄 tar 起來 copy 到 Aspire One 上面,或是 rsync 一下... 然後,為了編譯 vboxdrv 需要再安裝一些套件:
最後執行
我知道這些步驟對一般 user 來說不容易,所以準備好編譯完的檔案,請下載後,輸入
修改執行環境
打開編輯器,修改 /etc/group ,找到下面這行,然後加上 user:
vboxusers:x:502:user
需要重新開機。
安裝 Guest OS
安裝前,記得進 terminal ,掛進剛剛做好的 module 。如果你按照前幾篇關掉了 swap,這時候最好先加回來... 建議! 如果你在桌機上裝好再 copy vdi 檔過來,就不用加 swap 了。
然後在桌面上按右鍵選「系統→Sun xVM VirtualBox」,用 user 的權限開進去。
建議先在桌機上安裝,安裝好後再把 .vdi copy 進來。安裝需要一點時間...
有圖有真相:

切 Virtual Disk 的時候記得指定 /media/disk/xp.vdi ,不然它還是會寫進 SSD 裡。

快照資料夾順便改一下:

要從網路芳鄰 share CD-ROM 再安裝雖然可以,但還是比較建議先在桌機裝好再說:

如果出現這個畫面,表示你忘了 /etc/init.d/vboxdrv start:

裝吧裝吧~~

繼續努力~~

開起來了! 耶~

補充說明
如果要外掛 USB 硬碟,或許你需要 ntfs 驅動程式... 試試
如果你在桌機安裝,建議先把 Storage Expansion 裡的 SD 卡拿到桌機再 copy vdi 檔,不然你會覺得 Aspire One 好像當掉一樣,但事實上... 我也不確定當了沒。在桌機 copy 一整個 4GB 的 vdi 檔到 SD 卡,約需要 13 分鐘。
先說個題外話。他們剛釋出原始碼不久,我就接到宏碁請託本公司某部門的人來電關切,說大家可以認識認識,有什麼需求當面比較容易談清楚。不過既然原始碼都放出來,也就不用見面了,廠商客戶雙贏,挺好的。
安裝有一些要點: (1)需要 vboxdrv.ko (2)要把 user 加進 vboxusers 群組 (3)之前關掉 swap 的人記得先暫時加回去。以下分項說明。
先去下載VirtualBox,選擇 Fedora 8 (i386) 版,進 terminal 中 rpm -ivh VirtualBox-1.6.4_33808_fedora8-1.rpm 。這時候一定會看到無法編譯 kernel module 的訊息。沒關係,我們下一步就要處理。
編譯 vboxdrv.ko
先講正規的做法。首先,去 Aspire One 的FTP站下載核心原始碼。建議下載到裝在桌機的 Linux 再編譯...
由於他們使用 zip 壓縮,symbole link 被還原了,所以其中有一個目錄得先砍掉,否則不能編譯。假設你下載到另一台 Linux 上的 /usr/src ,解開來,然後輸入以下命令:
# unzip ~/Aspire_One_Linpus_Linux/Aspire_One_Source/linux-2.6.23.9lw.zip
# cd linux-2.6.23.9/
# cp ../config_080627 .config
# cd include
# rm -fr asm
# cd ..
# make oldconfig
# make bzImage modules
編譯完後,把整個目錄 tar 起來 copy 到 Aspire One 上面,或是 rsync 一下... 然後,為了編譯 vboxdrv 需要再安裝一些套件:
yum install make gcc
最後執行
/etc/init.d/vboxdrv setup就解決了。
我知道這些步驟對一般 user 來說不容易,所以準備好編譯完的檔案,請下載後,輸入
tar zfx vboxdrv.tgz -C /就裝好 vboxdrv.ko 了。
修改執行環境
打開編輯器,修改 /etc/group ,找到下面這行,然後加上 user:
vboxusers:x:502:user
需要重新開機。
安裝 Guest OS
安裝前,記得進 terminal ,掛進剛剛做好的 module 。如果你按照前幾篇關掉了 swap,這時候最好先加回來... 建議! 如果你在桌機上裝好再 copy vdi 檔過來,就不用加 swap 了。
su -
/etc/init.d/vboxdrv start
/etc/init.d/vboxnet start
# 要加 swap 的話請打下面 4 行. 這樣才不會傷害脆弱的 SSD? (誤)
cd /media/disk
dd if=/dev/zero of=swap.1 bs=1k count=1024k
mkswap swap.1
swapon swap.1
然後在桌面上按右鍵選「系統→Sun xVM VirtualBox」,用 user 的權限開進去。
建議先在桌機上安裝,安裝好後再把 .vdi copy 進來。安裝需要一點時間...
有圖有真相:

切 Virtual Disk 的時候記得指定 /media/disk/xp.vdi ,不然它還是會寫進 SSD 裡。

快照資料夾順便改一下:

要從網路芳鄰 share CD-ROM 再安裝雖然可以,但還是比較建議先在桌機裝好再說:

如果出現這個畫面,表示你忘了 /etc/init.d/vboxdrv start:

裝吧裝吧~~

繼續努力~~

開起來了! 耶~

補充說明
如果要外掛 USB 硬碟,或許你需要 ntfs 驅動程式... 試試
yum install ntfs-3g
如果你在桌機安裝,建議先把 Storage Expansion 裡的 SD 卡拿到桌機再 copy vdi 檔,不然你會覺得 Aspire One 好像當掉一樣,但事實上... 我也不確定當了沒。在桌機 copy 一整個 4GB 的 vdi 檔到 SD 卡,約需要 13 分鐘。
賀! 宏碁釋出 kernel 原始碼
需要的人請到 ftp://Guest@csdftp.acer.com.tw/ 下載。
晚一點來把它 compile 起來... 然後把 VirtualBox 包一包吧~~:D
晚一點來把它 compile 起來... 然後把 VirtualBox 包一包吧~~:D
2008-08-08
調校你的 Aspire One (Linux) #8 - 雙螢幕顯示
因為有 xrandr 的關係,雙螢幕顯示再容易不過了。Aspire One 上的雙螢幕顯示出處在此,我只是翻譯整理一下。
以下設定要改動 /etc/X11/xorg.conf ,請小心使用,以免開不了機。真的改壞了,用任何一張 Linux LiveCD 開起來再改回來就好。
接投影機一般是 1024x768, 接 19" 液晶螢幕一般是 1280x1024, 把掃瞄頻率定在 60Hz. 修改 xorg.conf, 把倒數第 3 行的 Virtual 1024 600 改成 Virtual 2304 1024。
上面幾行有一個 Modeline "1024x600", 在那下面加上
Modeline "1024x768" 64.11 1024 1080 1184 1344 768 769 772 795 -HSync +Vsync
Modeline "1280x1024" 108.88 1280 1360 1496 1712 1024 1025 1028 1060 -HSync +Vsync
如果覺得麻煩,請到這裡下載我的 xorg.conf
雖然 Aspire One 手上冊說外接螢幕前必須重開機,可是實驗發現,可以不用重新開機,直接使用下列命令:
xrandr --output VGA --right-of LVDS --mode 1280x1024
把 1280x1024 改成 1024x768 就適用於投影機了。
VGA 指的是外接螢幕,LVDS 指的就是筆電上的 LCD。如果要回到原來的單螢幕,只要下:
xrandr --output VGA --off
更多 xrandr 的使用方法請看這裡。
這兩行 Modeline 的產生方法是從這裡看來的,使用以下命令:
gtf 1024 768 60 # 60Hz
Aspire One 不支援 --rorate 命令,算是美中不足之處。
以下設定要改動 /etc/X11/xorg.conf ,請小心使用,以免開不了機。真的改壞了,用任何一張 Linux LiveCD 開起來再改回來就好。
接投影機一般是 1024x768, 接 19" 液晶螢幕一般是 1280x1024, 把掃瞄頻率定在 60Hz. 修改 xorg.conf, 把倒數第 3 行的 Virtual 1024 600 改成 Virtual 2304 1024。
上面幾行有一個 Modeline "1024x600", 在那下面加上
Modeline "1024x768" 64.11 1024 1080 1184 1344 768 769 772 795 -HSync +Vsync
Modeline "1280x1024" 108.88 1280 1360 1496 1712 1024 1025 1028 1060 -HSync +Vsync
如果覺得麻煩,請到這裡下載我的 xorg.conf
雖然 Aspire One 手上冊說外接螢幕前必須重開機,可是實驗發現,可以不用重新開機,直接使用下列命令:
xrandr --output VGA --right-of LVDS --mode 1280x1024
把 1280x1024 改成 1024x768 就適用於投影機了。
VGA 指的是外接螢幕,LVDS 指的就是筆電上的 LCD。如果要回到原來的單螢幕,只要下:
xrandr --output VGA --off
更多 xrandr 的使用方法請看這裡。
這兩行 Modeline 的產生方法是從這裡看來的,使用以下命令:
gtf 1024 768 60 # 60Hz
Aspire One 不支援 --rorate 命令,算是美中不足之處。
調校你的 Aspire One (Linux) #7 - MSN
官方的 IM 在失效後 3 天終於放出更新了! 不過,我們可以改用其他同樣是開放原始碼的 IM ,才不用等待官方修正的時間。
建議安裝 emesene: 在桌面按右鍵,選「新增/移除軟體」,點「搜尋」並輸入 "emesene",打個勾,就安裝好了。
M$ 在 7/20 左右更改了 MSN protocol (這也是宏碁的IM之前失效的原因吧?),所以我們要修改一下:
想要修改桌面上的捷徑嗎?用編輯器打開 /usr/share/applications/acerim.desktop ,找到 Exec=UIM 改成 Exec=emesene 就可以了。記得重新開機 reload 桌面哦!
建議安裝 emesene: 在桌面按右鍵,選「新增/移除軟體」,點「搜尋」並輸入 "emesene",打個勾,就安裝好了。
M$ 在 7/20 左右更改了 MSN protocol (這也是宏碁的IM之前失效的原因吧?),所以我們要修改一下:
sudo sed -i.bak 's/09607671-1C32-421F-A6A6-CBFAA51AB5F4/CFE80F9D-180F-4399-82AB-413F33A1FA11/g' /usr/share/emesene/emesenelib/XmlTemplates.py
想要修改桌面上的捷徑嗎?用編輯器打開 /usr/share/applications/acerim.desktop ,找到 Exec=UIM 改成 Exec=emesene 就可以了。記得重新開機 reload 桌面哦!
調校你的 Aspire One (Linux) #6 - Firefox 3
安裝 Firefox 3 的方法,原出處在 Acer Aspire One User Forum。
簡言之,到官網下載 Firefox 3.0.1 (或更新版本),然後 alt-f2 進 terminal 後打指令:
就搞定了。Firefox 的 Cache 會存在 ~/.mozilla/firefox/... 裡面,這樣有幾個問題 1.可能比較慢 2.沒裝 Storage Expansion (左手邊插的SD卡) 的話,會操到 SSD 。如果你很在意這個問題,並且沒那麼在意浪費一點網路頻寬,那可以做下面的修改...
剩下調校效能的設定,像 turbo 或 pipeline 請參考來自火星maggie的秘密花園。
Firefox 的 plugin ,建議安裝 Adblock Plus 和 Flashblock ,否則一開起來就很吃資源。
Firefox 操作介面的字型大小,在 ~/.mozilla/firefox/*-default/chrome 裡可以修改,可是我有點改不動... 有心得再貼上來。
簡言之,到官網下載 Firefox 3.0.1 (或更新版本),然後 alt-f2 進 terminal 後打指令:
tar jfx firefox-3.0.1.tar.gz -C /opt
cd /usr/bin
mv firefox ff2
ln -s /opt/firefox/firefox
# 不安裝 plugins 的話不用打下面這兩行
cd /opt/firefox/plugins
ln /usr/lib/mozilla/plugins/* .
就搞定了。Firefox 的 Cache 會存在 ~/.mozilla/firefox/... 裡面,這樣有幾個問題 1.可能比較慢 2.沒裝 Storage Expansion (左手邊插的SD卡) 的話,會操到 SSD 。如果你很在意這個問題,並且沒那麼在意浪費一點網路頻寬,那可以做下面的修改...
- 打開 Firefox
- 在網址列打 about:config, 在空白的地方按右鍵新增機碼。
新增「字串」 browser.cache.disk.parent_directory 填入 /tmp
新增「真假」 config.trim_on_minimize 填入 true
剩下調校效能的設定,像 turbo 或 pipeline 請參考來自火星maggie的秘密花園。
Firefox 的 plugin ,建議安裝 Adblock Plus 和 Flashblock ,否則一開起來就很吃資源。
Firefox 操作介面的字型大小,在 ~/.mozilla/firefox/*-default/chrome 裡可以修改,可是我有點改不動... 有心得再貼上來。
調校你的 Aspire One (Linux) #5 - GNU parted
注意! 請插上 AC 電源後再操作。
我們把 swap 關掉後,空出來的 1GB 可以不理它,也可以另外切成 partition 掛在某個目錄下。如果你一定想要把原來的 /dev/sda1 擴大到整顆 SSD 的話,就需要使用 GNU parted 。帝國反抗君寫了一篇很實用的文章,照著他的步驟操作,格式化一顆 32MB 的隨身碟,放進 GNU parted,裝上 syslinux ,放到 Aspire One 上開機... 就可以直接擴大分割區了。
擴大約需 30 分鐘(很傷 MLC SSD, 嗚~~) 擴大後,我目前的分割區如下:
我們把 swap 關掉後,空出來的 1GB 可以不理它,也可以另外切成 partition 掛在某個目錄下。如果你一定想要把原來的 /dev/sda1 擴大到整顆 SSD 的話,就需要使用 GNU parted 。帝國反抗君寫了一篇很實用的文章,照著他的步驟操作,格式化一顆 32MB 的隨身碟,放進 GNU parted,裝上 syslinux ,放到 Aspire One 上開機... 就可以直接擴大分割區了。
擴大約需 30 分鐘(很傷 MLC SSD, 嗚~~) 擴大後,我目前的分割區如下:
[user@localhost ~]$ df -h
檔案系統 容量 已用 可用 已用% 掛載點
/dev/sda1 7.4G 2.7G 4.5G 37% /
none 755M 0 755M 0% /dev/shm
none 755M 184K 755M 1% /var/tmp
none 755M 48K 755M 1% /var/log
none 7.4G 2.7G 4.5G 37% /mnt/home
/dev/mmcblk0p1 7.6G 221M 7.4G 3% /media/disk
posix-overlay(/media/disk)
7.6G 221M 7.4G 3% /tmp/posixdir
2008-08-07
調校你的 Aspire One (Linux) #4 - tmpfs, swap
如果你的 Aspire One 安裝超過 1GB (建議 1.5GB) 的記憶體,才要使用本節的內容。
首先,把一些常用的快取目錄掛上 tmpfs ,tmpfs 相當於 ramdisk ,存取速度很快、又可以保護脆弱的 MLC SSD。
試了很久,可行的做法如下:進 terminal 後 sudo 成 root, 修改 /etc/fstab 檔
並在 swap 所在的那行前面打 # 如 # /dev/sda2 swap ...
(註: /var/tmp 不打 mode=1777 也可以,事實上 /etc/rc.d/rc.last 裡每次開機都會重新設定權限。)
如果你看了 Ubuntu 的討論串,就會像我一樣很想把 tmpfs 也掛上 /tmp. 可惜我試了幾次,都沒成功... 直接把 none /tmp tmpfs defaults 0 0 放進 /etc/fstab 是不行的,在 vim /etc/rc.d/rc.last,加上 mount none /tmp -t tmpfs -o mode=1777 ,乍看之下很 OK,可是重開機後卻只能進 X ,看不到桌面啟動。
經過一番 trace, 似乎是因為沒有 /tmp/.x11-unix/X0 的關係,所以桌面沒有啟動 (/home/user/.bash_profile) ,但我們看到在 rc.S 裡,/tmp 早就 mount 成 tmpfs 了,只是我們打 mount 時看不出來而已。測試一下這個說法:
很好,這證明了/tmp 本來就是 tmpfs ... 我們不用再辛苦一次
首先,把一些常用的快取目錄掛上 tmpfs ,tmpfs 相當於 ramdisk ,存取速度很快、又可以保護脆弱的 MLC SSD。
試了很久,可行的做法如下:進 terminal 後 sudo 成 root, 修改 /etc/fstab 檔
none /var/tmp tmpfs defaults,mode=1777 0 0
none /var/log tmpfs defaults 0 0
並在 swap 所在的那行前面打 # 如 # /dev/sda2 swap ...
(註: /var/tmp 不打 mode=1777 也可以,事實上 /etc/rc.d/rc.last 裡每次開機都會重新設定權限。)
如果你看了 Ubuntu 的討論串,就會像我一樣很想把 tmpfs 也掛上 /tmp. 可惜我試了幾次,都沒成功... 直接把 none /tmp tmpfs defaults 0 0 放進 /etc/fstab 是不行的,在 vim /etc/rc.d/rc.last,加上 mount none /tmp -t tmpfs -o mode=1777 ,乍看之下很 OK,可是重開機後卻只能進 X ,看不到桌面啟動。
經過一番 trace, 似乎是因為沒有 /tmp/.x11-unix/X0 的關係,所以桌面沒有啟動 (/home/user/.bash_profile) ,但我們看到在 rc.S 裡,/tmp 早就 mount 成 tmpfs 了,只是我們打 mount 時看不出來而已。測試一下這個說法:
free
dd if=/dev/zero of=/tmp/test bs=1k count=20k
free
很好,這證明了/tmp 本來就是 tmpfs ... 我們不用再辛苦一次
調校你的 Aspire One (Linux) #3 - 右鍵選單、輸入法、livna
建議先使用宏碁提供的還原光碟,將 Aspire One 還原到出廠值。外接 USB 光碟約需20分30秒。
還原後,開機,在桌面上按 alt-f2 打 xfce-setting-show 。桌面→行為→按下右鍵時顯示桌面清單,打勾。這樣以後就可以在桌面上按右鍵直接使用 XFCE 的選單。
做兩次「即時更新」(需重開機兩次),但自從 7/20 MSN 又改 protocol 後,他們的 IM 應該已經不能登入 MSN 了。建議按右鍵→系統→新增移除程式,找到 emesene ,按裝起來後再按 alt-f2 打 terminal ,並剪下貼上這段字:
嘸蝦米輸入法的使用者,請想辦法製作出 liu.bin (或是... 網路上找找做好的?XD) 為了節省資源,請修改 SCIM 的偏好設定,把不要的泛用輸入法表格拿掉。這樣做其實只會移除 /home/user/.scim 裡的備份,所以別擔心,隨時可以再加回去。
我裝的 liu.bin 是按 starjou 的方法,把 uni*.tab 都放了去進。雖然 SCIM 不支援 ,,j ,,c ,,ct 但仍然可以直接打。請參考這篇。
Livna 是一個額外的套件包,會讓一些不適合包進 Fedora、不夠自由的軟體也能透過 yum 安裝。下載 livna
裝好後,新增/移除程式就會多一些可選套件了。
還原後,開機,在桌面上按 alt-f2 打 xfce-setting-show 。桌面→行為→按下右鍵時顯示桌面清單,打勾。這樣以後就可以在桌面上按右鍵直接使用 XFCE 的選單。
做兩次「即時更新」(需重開機兩次),但自從 7/20 MSN 又改 protocol 後,他們的 IM 應該已經不能登入 MSN 了。建議按右鍵→系統→新增移除程式,找到 emesene ,按裝起來後再按 alt-f2 打 terminal ,並剪下貼上這段字:
sudo sed -i.bak 's/09607671-1C32-421F-A6A6-CBFAA51AB5F4/CFE80F9D-180F-4399-82AB-413F33A1FA11/g' /usr/share/emesene/emesenelib/XmlTemplates.py
嘸蝦米輸入法的使用者,請想辦法製作出 liu.bin (或是... 網路上找找做好的?XD) 為了節省資源,請修改 SCIM 的偏好設定,把不要的泛用輸入法表格拿掉。這樣做其實只會移除 /home/user/.scim 裡的備份,所以別擔心,隨時可以再加回去。
我裝的 liu.bin 是按 starjou 的方法,把 uni*.tab 都放了去進。雖然 SCIM 不支援 ,,j ,,c ,,ct 但仍然可以直接打。請參考這篇。
Livna 是一個額外的套件包,會讓一些不適合包進 Fedora、不夠自由的軟體也能透過 yum 安裝。下載 livna
wget http://rpm.livna.org/livna-release-8.rpm
rpm -ivh livna-release-8.rpm
裝好後,新增/移除程式就會多一些可選套件了。
調校你的 Aspire One (Linux) #2 - 更新 BIOS
注意! 更新 BIOS 可能造成電腦無法開機,需要送回原廠修理。雖然燒壞 BIOS 應該在保固範圍內,但世事難料,小心比較好。
1. 使用 USB 隨身碟或 USB 軟碟,格式化成開機片。USB 隨身碟可以用 HPUSBFW (使用請參考這篇) 格式化。
2. 做好後,去抓 BIOS 0.3114,解壓縮到隨身碟
3. 打開 Aspire One,按 F12 從 USB 開機,就可以順利更新了。
1. 使用 USB 隨身碟或 USB 軟碟,格式化成開機片。USB 隨身碟可以用 HPUSBFW (使用請參考這篇) 格式化。
2. 做好後,去抓 BIOS 0.3114,解壓縮到隨身碟
3. 打開 Aspire One,按 F12 從 USB 開機,就可以順利更新了。
調校你的 Aspire One (Linux) #1
隨手寫一寫,做做記錄。宏碁採用 Linpus 我認為是個錯誤,但仍然有些優點,讓我在灌完 Ubuntu 後又重新灌回 Linpus Linux Lite 的桌面。
- Linpus 桌面開機只要 20 秒,全部 load 完約 40 秒,很快。對我這種一定要關機、每週充放電一次的愛護電池的人來說,快點開機關機很重要。Ubuntu 預設安裝開機要超過一分鐘,全部開完至少 90 秒。看著硬碟燈拼命亮,就一種 MLC 漸漸死掉的感覺...
- Linpus 預先調校過省電問題,雖然 Ubuntu 也可以調,但是要改不少地方。既然都要大改特改,那我直接從 Linpus 下手比較快,也順便了解一下它快速的理由
給宏碁鼓鼓掌! Kernel 仍未釋出
本來以為爭取原始碼的動作需要更長的努力,結果才 4 天,宏碁就放出原始碼了。我正在下載,晚一點會驗證,並 build 一些 AspireOne 用的套件放上網路。宏碁願意遵守 GPL ,給他們鼓掌!
Acer MSN (acerim) 還是不能登入,沒關係,裝 emesene 就好...
Kernel Source 還是沒放出來! 得持續要求宏碁才行。
P.S.為了他們沒放原始碼的事情,我試著寫信聯絡中研院的開放原始碼論壇 (OpenFoundry), 結果 contact 信箱竟然退信...
您好:
有關Aspire one AOA110 Linpus linux source code,可至以下ftp site 下載
ftp://Guest@csdftp.acer.com.tw/
若您有任何問題或建議,歡迎聯絡我們,我們將竭誠為您服務.
宏碁客服中心 敬上
Acer MSN (acerim) 還是不能登入,沒關係,裝 emesene 就好...
Kernel Source 還是沒放出來! 得持續要求宏碁才行。
P.S.為了他們沒放原始碼的事情,我試著寫信聯絡中研院的開放原始碼論壇 (OpenFoundry), 結果 contact 信箱竟然退信...
2008-08-06
宏碁的客服應該改進
我是指網站上的「連絡我們」。汐止服務站的客服很不錯。
以下是他們回覆的「不能連上MSN」:
造成大家的困擾,竟然連聲道歉都沒有?這種態度真的太糟糕了!
以下是他們回覆的「不能連上MSN」:
您好:
己反應至相關單位處理,若有新改版,請執行線上更新.
宏碁客服中心 敬上
造成大家的困擾,竟然連聲道歉都沒有?這種態度真的太糟糕了!
2008-08-05
MSN 不能登入 #2
用 recovery disc 灌回去,共花了20分30秒。MLC 寫入有夠慢,由此可見一斑。
重灌後仍然不能登入,所以應該是 M$ 又改 protocol 了(或是: M$ 兩星期前就改了)。百資還在慢慢來... 可是因為他們的 MSN 能用視訊、自定小圖示,所以我還是想忍耐一下...
(謎之音: 退貨換硬碟版吧...)
重灌後仍然不能登入,所以應該是 M$ 又改 protocol 了(或是: M$ 兩星期前就改了)。百資還在慢慢來... 可是因為他們的 MSN 能用視訊、自定小圖示,所以我還是想忍耐一下...
(謎之音: 退貨換硬碟版吧...)
BIOS OK, MSN 不能登入

可惜 pidgin 不支援新增小圖示,不然我用 pidgin 就好了...
更新: 過了 8 小時後,宏碁的回應如下:
您好:
請執行"設定">>"即時更新",完成之後,請重新開機,再進行MSN登入動作.
宏碁客服中心 敬上
我暈。好吧,這是標準答案,因為出廠的 MSN 有 bug 所以不更新根本不能用。於是我重新說明了我的問題,希望他們明天會有答案。
先用 recovery disc 還原吧!釐清是我 yum 了太多套件、還是他們的 libpurple 太舊了。雖然這台的硬體到目前為止表現不錯,可是他們的服務,讓人很想在七天內退貨。
2008-08-04
Aspire One BIOS 0.3114
難怪一直覺得休眠偶爾會一睡不醒... 雖然不知道何時會切進 C4 (S4 的時候嗎?) 但這版主要解掉了 C4 的問題。
Aspire One 的用戶請多多光臨 AspireOneUser.com (靠! 竟然是英文站) 我在官網沒看到任何 BIOS (不論是 A110 或 A150) 宏碁你好好反省吧! 有圖有真相。
0.3114 版 BIOS 可以在這裡下載,按論壇的說法,不論 110/150、歐洲/北美用的都是同一個 image.
這裡有份很詳細的 BIOS Release Note,才知道原來我們拿到出貨的 0.3109 版 BIOS, 才剛剛解掉了在 Linux 下不能用讀卡機的問題:
6/29 才調了 FAN curve, 6/17 把回到 S0 的 timer 清掉... 這或許暗示了 BIOS team 非常匆忙地趕進度?辛苦你們(也辛苦之後的user了...)
言歸正傳,本版的 RN:
更新看看吧!
哦,對了,值得一提... 2GB 的 DIMM 插上去真的不開機。燦坤你們麻煩大了... (會場 +$499 加購一條 2G DIMM) 宏碁汐止服務站的服務很不賴,可是他們的網站客服還真是需要好好檢討。
Aspire One 的用戶請多多光臨 AspireOneUser.com (靠! 竟然是英文站) 我在官網沒看到任何 BIOS (不論是 A110 或 A150) 宏碁你好好反省吧! 有圖有真相。
0.3114 版 BIOS 可以在這裡下載,按論壇的說法,不論 110/150、歐洲/北美用的都是同一個 image.
這裡有份很詳細的 BIOS Release Note,才知道原來我們拿到出貨的 0.3109 版 BIOS, 才剛剛解掉了在 Linux 下不能用讀卡機的問題:
Date : 2008/06/21
BIOS Version : v0.3109
EC Version : 2.8
BIOS:
1. Fixed card reader can't work under Linux OS.
2. Improve Lan transmission issue.
6/29 才調了 FAN curve, 6/17 把回到 S0 的 timer 清掉... 這或許暗示了 BIOS team 非常匆忙地趕進度?辛苦你們(也辛苦之後的user了...)
言歸正傳,本版的 RN:
POST
1. Set C4 timing to 0×06.
2. Disable LAN device and host L0s and L1.
3. Enable PCIE break event.
OS
1. Check if OS is XP, then
1. Set C4 timing to 0×0A.
2. Enable LAN device and host L0s and L1.
3. Disable PCIE break event.
EC:
1. Fix EC 4sec shutdown no function issue.
更新看看吧!
哦,對了,值得一提... 2GB 的 DIMM 插上去真的不開機。燦坤你們麻煩大了... (會場 +$499 加購一條 2G DIMM) 宏碁汐止服務站的服務很不賴,可是他們的網站客服還真是需要好好檢討。
宏碁不想提供原始碼 #2
又過了半天,收到一封回信...
好吧,我等幾天...
您好:
有關Aspire One linux Kernel Source問題, 我們已反應給相關單位協助提供, 若有進一步的消息, 我們將儘快回覆給您.
宏碁客服中心 敬上
好吧,我等幾天...
SCIM 與嘸蝦米
Aspire One 裡頭的 SCIM 我不是很熟悉 (畢竟之前一直在用 gcin), 也不了解為什麼 scim 都 kill 光再重新 load 了,還是一樣會把輸入法表格 cache 住,非重開不可。不過,至少現在把嘸蝦米搞定了。
先找到 liu-uni.tab, liu-uni[234].tab 四個檔案,然後按小光光的做法,把 tab 轉成 txt 檔,再把 4 個 txt 檔合併,轉成 SCIM 格式,再 scim-make-table 就成了。
為了避免忘記,把 script 留在這裡:
小光光的script
txt2scim.sh
請參考其他「如何在SCIM上裝嘸蝦米」的網站使用....
先找到 liu-uni.tab, liu-uni[234].tab 四個檔案,然後按小光光的做法,把 tab 轉成 txt 檔,再把 4 個 txt 檔合併,轉成 SCIM 格式,再 scim-make-table 就成了。
為了避免忘記,把 script 留在這裡:
小光光的script
txt2scim.sh
請參考其他「如何在SCIM上裝嘸蝦米」的網站使用....
宏碁不想提供原始碼
看來宏碁沒學到 EeePC 的教訓,在包裝盒上寫說有原始碼可以下載,但寫信去客服卻不願意提供原始碼。
今天早上收到他們的回信如下:
我決定回一封信,看他們怎麼處理:
這樣的公司真是太糟糕了!
又,他們的線上客服沒辦法用 Firefox 填資料,一定要開 IE ... 還好我有桌機,不然用 Aspire One Linux 版連客服都不能用呢!
今天早上收到他們的回信如下:
您好:
Aspire One 出貨己將作業系統環境設計完好,使用者經過些許
設定畫面即可使用,故不再提供kernel Source.
宏碁客服中心 敬上
我決定回一封信,看他們怎麼處理:
您好,
我有開發 Aspire One 相關應用軟體、以及安全 VMWare 的需求。
依照 GPLv2 協議,貴公司必須提供修改過的 Kernel Source.
如果貴公司不提供,我將連繫相關自由軟體協會提告。
謝謝。
這樣的公司真是太糟糕了!
又,他們的線上客服沒辦法用 Firefox 填資料,一定要開 IE ... 還好我有桌機,不然用 Aspire One Linux 版連客服都不能用呢!
2008-08-03
Acer Aspire One (Linux 版)
星期五去應用展會場敗了台 Acer Aspire One (Linux), 原先想買 EeePC 901 的,可是它的鍵盤真的太...小了,小到我這個並不肥的手指仍然沒辦法在上面打字。
就規格來說,XP 版可能比 Linux 版更好:除了可以自己花錢把 SATA HDD 換成 SSD 外,6-cell 的電池要價約 4000 元,那些買 Linux 版再花錢多買電池的人,並沒有佔到什麼便宜。
Aspire One 的 Linux 採用 Linpus (百資) 的 Linux Lite ,乍看之下蠻好用,加上宏碁自己客製化的 IM (為什麼版權沒寫是從哪裡改來的! 原始碼吐出來!) 應該是OK了。宏碁的相容版 Outlook 因為我自己用不到的關係,沒做多少測試,可是它的速度比起 Outlook 慢上太多 (甚至比 Thunderbird 還慢),用起來並不順手。
最大的問題,其實是套件。它是 Fedora 8 改來的,理論上 yum update 一下就好,於是我在裝了 glibc-devel, gcc, php, erlang, lighttpd 之後,想說 update 一下 Firefox ... 結果卡在一些相依性問題上。Google 的結果是,直接去 Firefox 網站下載 Binary 解到 /opt, 然後 ln -s 就搞定了。這... 對一般 user 來說會不會太難了點?
宏碁的支援網站很爛,從「設定」裡點選「支援」可以看到英文版網站,下面的「註冊」點進去後,竟然找不到 Taiwan/Trad. Chinese 的選項;包裝裡的手冊說可以到百資下載原始碼,可是我怎麼也找不到。我想裝 VirtualBox (偶爾還是有跑跑 IE 的需求唄) ,卻找不到它客製化過的 2.9.23.9lw 的 kernel-devel。我可不想冒著無線網路 driver 不能用的危險自己升級 kernel 啊...
宏碁的 Media Player 寫得非常的糟,介面整合不好,此外撥放一整個目錄的 ogg 檔案,螢幕就會黑掉(但是可以 alt-tab 切到別的視窗),按 alt-f4 關程式的時候,可以發現螢幕閃了一下,播放清單原來藏在後面,被程式的 bug 蓋住了。
另一個 bug 在我把電池用完後出現。電腦自動待機,我插上AC,再按下空白鍵,就完全是黑屏了,怎麼按都沒用,不得不強制關機。它在設計上為了減少 SSD 寫入(MLC比SLC更快因為多次寫入壞掉),採用 ext2 而不是 ext3 ,因此這個 bug 讓我蠻擔心的。
百資的 Linux Lite 的桌面也非常的糟。簡言之就是從 xfce 改來的,剛開始覺得很討喜,可是當發現 1.沒有 virtual desktop 2.不能放桌面背景。這樣失去了很多樂趣,我不認為他們會很快修改這個問題,Aspire One 官網上很直接承認「目前不支援此功能」。此外,官網上也寫了,必須先插好投影機再開機才能用。這個 hardware design 實在應該好好檢討。
值得讚許的是它的無線網路 agent 寫得很親和,一下子就連上去了,完全無痛。可是,怎麼沒有支援網芳啊?smb:// 不支援,samba:// 不支援,非得要我進 terminal 打 mount -t cifs ... 而且系統裝了 samba 卻沒有 config 好, 我也不能 share 給別人。
宏碁你這樣做真的對嗎... 不要逼我退貨換成 XP 版啊!
就規格來說,XP 版可能比 Linux 版更好:除了可以自己花錢把 SATA HDD 換成 SSD 外,6-cell 的電池要價約 4000 元,那些買 Linux 版再花錢多買電池的人,並沒有佔到什麼便宜。
Aspire One 的 Linux 採用 Linpus (百資) 的 Linux Lite ,乍看之下蠻好用,加上宏碁自己客製化的 IM (為什麼版權沒寫是從哪裡改來的! 原始碼吐出來!) 應該是OK了。宏碁的相容版 Outlook 因為我自己用不到的關係,沒做多少測試,可是它的速度比起 Outlook 慢上太多 (甚至比 Thunderbird 還慢),用起來並不順手。
最大的問題,其實是套件。它是 Fedora 8 改來的,理論上 yum update 一下就好,於是我在裝了 glibc-devel, gcc, php, erlang, lighttpd 之後,想說 update 一下 Firefox ... 結果卡在一些相依性問題上。Google 的結果是,直接去 Firefox 網站下載 Binary 解到 /opt, 然後 ln -s 就搞定了。這... 對一般 user 來說會不會太難了點?
宏碁的支援網站很爛,從「設定」裡點選「支援」可以看到英文版網站,下面的「註冊」點進去後,竟然找不到 Taiwan/Trad. Chinese 的選項;包裝裡的手冊說可以到百資下載原始碼,可是我怎麼也找不到。我想裝 VirtualBox (偶爾還是有跑跑 IE 的需求唄) ,卻找不到它客製化過的 2.9.23.9lw 的 kernel-devel。我可不想冒著無線網路 driver 不能用的危險自己升級 kernel 啊...
宏碁的 Media Player 寫得非常的糟,介面整合不好,此外撥放一整個目錄的 ogg 檔案,螢幕就會黑掉(但是可以 alt-tab 切到別的視窗),按 alt-f4 關程式的時候,可以發現螢幕閃了一下,播放清單原來藏在後面,被程式的 bug 蓋住了。
另一個 bug 在我把電池用完後出現。電腦自動待機,我插上AC,再按下空白鍵,就完全是黑屏了,怎麼按都沒用,不得不強制關機。它在設計上為了減少 SSD 寫入(MLC比SLC更快因為多次寫入壞掉),採用 ext2 而不是 ext3 ,因此這個 bug 讓我蠻擔心的。
百資的 Linux Lite 的桌面也非常的糟。簡言之就是從 xfce 改來的,剛開始覺得很討喜,可是當發現 1.沒有 virtual desktop 2.不能放桌面背景。這樣失去了很多樂趣,我不認為他們會很快修改這個問題,Aspire One 官網上很直接承認「目前不支援此功能」。此外,官網上也寫了,必須先插好投影機再開機才能用。這個 hardware design 實在應該好好檢討。
值得讚許的是它的無線網路 agent 寫得很親和,一下子就連上去了,完全無痛。可是,怎麼沒有支援網芳啊?smb:// 不支援,samba:// 不支援,非得要我進 terminal 打 mount -t cifs ... 而且系統裝了 samba 卻沒有 config 好, 我也不能 share 給別人。
宏碁你這樣做真的對嗎... 不要逼我退貨換成 XP 版啊!
2008-07-31
用 PXE 做備份/還原
最近為了無碟備份,在公司玩了 symantec ghost 11.x 版,和開源的 PING.
為了把 PXE 和 Ghost (Linux版) 整合在一起,我們採用 SLAX 6.0.7 搭配 Samba,再用 Jeff Sadowski 提供的PXE initrd,就可以直接 PXE 開機,用 httpfs 開進 SLAX,把硬碟備份到網路上的 server ,再還原回來,速度很快很方便 (不是很黃很暴力哦!)
當然,如果你不堅持使用商業軟體(和圖型化介面),這裡有更好的選擇: PING 是開源的備份軟體,速度比 Ghost 更快,而且 PXE 整套包好了。唯一的問題是,用較大的硬碟備份的 image 不能還原到較小的硬碟去,據說他們已經著手 (用 partition magic?) 處理這個問題了...
為了把 PXE 和 Ghost (Linux版) 整合在一起,我們採用 SLAX 6.0.7 搭配 Samba,再用 Jeff Sadowski 提供的PXE initrd,就可以直接 PXE 開機,用 httpfs 開進 SLAX,把硬碟備份到網路上的 server ,再還原回來,速度很快很方便 (不是很黃很暴力哦!)
當然,如果你不堅持使用商業軟體(和圖型化介面),這裡有更好的選擇: PING 是開源的備份軟體,速度比 Ghost 更快,而且 PXE 整套包好了。唯一的問題是,用較大的硬碟備份的 image 不能還原到較小的硬碟去,據說他們已經著手 (用 partition magic?) 處理這個問題了...
2008-05-12
用 YUI imagecropper (beta) 做 step-by-step 設計/顯示
對一張給定的圖檔做 step-by-step 設計,說穿了就是用 AJAX 拉幾個長方型,記下它們的座標,存進資料庫;而顯示,就是倒過來,步驟幾就 new 幾個 DIV ,一個個蓋上去。
這邊講的是利用 YUI imagecropper (beta) 的做法,只要 hack YUI 就不需要自己寫 wrapper, mask, resizer 等等麻煩的東西了!
記下座標:
顯示:
這邊講的是利用 YUI imagecropper (beta) 的做法,只要 hack YUI 就不需要自己寫 wrapper, mask, resizer 等等麻煩的東西了!
記下座標:
var crop = new YAHOO.widget.ImageCropper(id, {
initialXY: [0, 0], keyTick: 5,
minHeight: 10, minWidth: 10 });
var div = new Array();
var it = 0;
function readpoint() {
var coords = crop.getCropCoords();
var img = document.getElementById(id);
// some YUI bugs triggered by this hack
if(coords.top < 0) coords.top = 0;
if(coords.left < 0) coords.left = 0;
if(coords.top + coords.height > img.height)
coords.height = img.height - coords.top;
if(coords.left + coords.width > img.width)
coords.width = img.width - coords.left;
var data = '('+coords.left+','+coords.top+','+coords.width+','+coords.height+')';
results.innerHTML += data+'<br>'; // all coordinates stored here
var url = crop.get('element').getAttribute('src', 2); // image URL
div[it] = document.createElement('div'); // create a div with border and number
div[it].id = 'div_'+it;
div[it].className = 'step-by-step';
div[it].innerHTML = '<h1 style="color:red">'+(it+1)+'</h1>';
div[it].style.position = 'absolute';
div[it].style.border = '1px solid red';
div[it].style.top = coords.top + 'px';
div[it].style.left = coords.left + 'px';
div[it].style.width = coords.width + 'px';
div[it].style.height = coords.height + 'px';
div[it].style.backgroundImage = 'url(' + url + '#)';
div[it].style.backgroundPosition = '-'+coords.left+'px -'+coords.top+'px'; // as indicated in YUI source
crop._wrap.appendChild(div[it]);
it++;
crop._resizeEl.style.left = (coords.left + coords.width) + 'px';
crop._resizeEl.style.top = coords.top + 'px';
crop._syncBackgroundPosition();
};
顯示:
var cx = someJSONDataSource; // [ { top:0,left:0,width:0,height:0 }, { ... } ]
var divs = new Array();
function removeMasks() {
var x = document.getElementById('image');
for(var i = x.childNodes.length - 1; i >= 0; i--) { // remember we're removing...
var o = x.childNodes[i];
if(o.tagName.toLowerCase() == 'div') x.removeChild(o); // eliminate divs
}
}
function showStep(n) {
removeMasks();
for(var i = 1; i <= n; i++) {
document.getElementById('image').appendChild(divs[i]);
}
}
function init() {
var img = document.getElementById('ans');
var n = 1;
cx[cx.length] = { top: 0, left: 0, width: img.width, height: img.height };
for(var i in cx) {
steps.innerHTML += '<span class="solutions" onClick="showStep('+n+');">步驟'+n+'</span>';
if(n < cx.length) steps.innerHTML += ' >> ';
divs[n] = document.createElement('div');
divs[n].style.position = 'absolute';
divs[n].style.top = cx[i].top + 'px';
divs[n].style.left = cx[i].left + 'px';
divs[n].style.width = cx[i].width + 'px';
divs[n].style.height = cx[i].height + 'px';
divs[n].style.backgroundImage = 'url(' + img.src + '#)';
divs[n].style.backgroundPosition = '-' + cx[i].left + 'px -' + cx[i].top + 'px';
n++;
}
}
2008-04-27
不能選擇的 option
在<select>裡頭,偶爾會有單純解說、不能選擇的<option>標籤。標準的做法如下:
<option disabled="disabled">
但在 IE7 以下都不支援。以下是網路上領領有名的 "select-option-disabled-emulation.js" 解法,為了減少 Firefox 等支援標準的瀏覽器的載入時間,我多加了一行。
<option disabled="disabled">
但在 IE7 以下都不支援。以下是網路上領領有名的 "select-option-disabled-emulation.js" 解法,為了減少 Firefox 等支援標準的瀏覽器的載入時間,我多加了一行。
function setDisabledSelect() {
if(navigator.appName != 'Microsoft Internet Explorer')
return; // only for bogus IE
if(document.getElementsByTagName) {
var s = document.getElementsByTagName("select");
if (s.length > 0) {
window.select_current = new Array();
for (var i=0, select; select = s[i]; i++) {
select.onfocus = function(){ window.select_current[this.id] = this.selectedIndex; }
select.onchange = function(){ restore(this); }
emulate(select);
}
}
}
}
function restore(e) {
if (e.options[e.selectedIndex].disabled) {
e.selectedIndex = window.select_current[e.id];
}
}
function emulate(e) {
for (var i=0, option; option = e.options[i]; i++) {
if (option.disabled) {
option.style.color = "graytext";
} else {
option.style.color = "menutext";
}
}
}
2008-04-13
用 PHP 排序含有 1,2,3,A,B,C,甲乙丙 的陣列
以一維陣列舉例。因為裡面用的是 array_multisort(), 所以從資料庫裡抓出來的也可以一次排序。這種做法只是可行而已,具體的限制請看程式碼...
測試:
// sort data records according to natural order and Chinese order
function zhNatSort(&$data) {
$key1 = array();
$zh = array('甲','乙','丙','丁','戊','己','庚','辛','壬','癸');
foreach($data as $l => $v) {
if(ereg('^[0-9]+$', $v))
$v = sprintf('%09d', $v);
elseif(in_array($v, $zh))
$v = sprintf('zzzz%02d%s', array_search($v, $zh), $v);
$key1[$l] = $v;
}
array_multisort($key1, SORT_ASC, $data);
}
測試:
$t = array('1','11','5','15','51','4','7','A','E','C','B','丁','甲','辛','己');
zhNatSort($t);
print_r($t);
2008-03-29
在 td 中 createElement() / appendChild()
常常在需要做「新增」「刪除」的時候,我們會這樣做:
然後在 JavaScript 裡寫:
在 IE 裡表現很正常,按新增後表格會變大,自動塞進新增的那個 div,但在 FireFox 下卻不行。有人說加上 style.display='none'; 和 style.display='block'; 就好了,但我試的結果不行。怎麼辦?手動觸發 window.resize() 事件即可:
有點醜,但可行哦!
<td valign="top" id="category_">
<?=inputCategories($r)?>
</td>
然後在 JavaScript 裡寫:
function appenddiv(id) {
var x = document.getElementById(id);
if(x == undefined) return false;
for(var i = 0; i < 999; i++)
if(document.getElementById(id+i) == undefined) break;
var newDiv = document.createElement('div');
newDiv.id = id+i;
newDiv.innerHTML = document.getElementById(id+'prepare').innerHTML;
x.appendChild(newDiv);
}
在 IE 裡表現很正常,按新增後表格會變大,自動塞進新增的那個 div,但在 FireFox 下卻不行。有人說加上 style.display='none'; 和 style.display='block'; 就好了,但我試的結果不行。怎麼辦?手動觸發 window.resize() 事件即可:
x.style.display = 'none'; // maybe effective for firefox
x.style.display = 'block';
window.innerHeight--;
window.innerHeight++;
有點醜,但可行哦!
2008-03-28
2008-02-14
[舊文]懷念的 8088 (3) 8288
8288 bus controller
在網路上可以找到 data sheet.
S0, S1, S2 -> status decoder
CLK, AEN, CEN, IOB -> control logic
MRDC, MWTC, AMWC, IORC, IOWC, AIOWC, INTA -> command signal generator
DT/R DEN MCE/PDEN ALE -> control signal generator
ALE = address latch enable
DEN = data enable
DT/R=1 表從CPU寫入記憶體;0 表從記憶體讀到CPU
AEN = address enable 延遲指令控制訊號
CEN = 1 叫 8288 把控制訊號丟上匯流排
IOB = 1 表 I/O bus mode; IOB = 0 表 system bus mode
AIOWC = advanced I/O write command 通知週邊要準備寫入
IOWC 通知週邊要寫入
在網路上可以找到 data sheet.
S0, S1, S2 -> status decoder
CLK, AEN, CEN, IOB -> control logic
MRDC, MWTC, AMWC, IORC, IOWC, AIOWC, INTA -> command signal generator
DT/R DEN MCE/PDEN ALE -> control signal generator
ALE = address latch enable
DEN = data enable
DT/R=1 表從CPU寫入記憶體;0 表從記憶體讀到CPU
AEN = address enable 延遲指令控制訊號
CEN = 1 叫 8288 把控制訊號丟上匯流排
IOB = 1 表 I/O bus mode; IOB = 0 表 system bus mode
AIOWC = advanced I/O write command 通知週邊要準備寫入
IOWC 通知週邊要寫入
2008-02-08
懷念的 8088 (2) 8259A & INT
8259A 包括... (方塊圖和 spec 見此)
Interrupt Request Reg (IRR)
Priority Resolver
In service reg (ISR)
Interrupt mask reg (IMR)
Control logic
Data bus buffer
R/W Logic
Cascade buffer / Comparator
比較值得注意的是,CS = 0 表示將 8259A enable, WR = 0 表示要寫入。
A0 要怎麼和 CS/WR/RD 配合,來存取 IRR,ISR,IMR,ICW1-4,OCW1-3 呢?
A0=0, D4=1 表寫入 ICW1
A0=1, 表寫入 ICW2-4, OCW1 (依序寫入)
A0=0, D4=0, D3=0 表寫入 OCW2
A0=0, D4=0, D3=1 表寫入 OCW3
初始完後,A0=1 就直接寫入 OCW1. (A0=1 要從 port $+1 送出).
Master 8259A ICW3 S0-S7 表示有幾個 Slave.
Slave 8259A ICW3 ID0-ID2 表示接在 Master 的 IRx
OCW1 的 D0-D7 代表 IMR.
OCW2 控制 rotate on non-specific EOI, specific EOI, in AEOI, 設定優先權
OCW3 控制讀取 ISR/IRR. Special Mask mode.
插斷流程(pp.96-7)
1. IR0 - IR7 = 1 時,IRR 拉高
2. PR 決定誰先,送 INT 給 CPU
3. CPU 如果 STI, 送 INTA 給 8259A
4. 收到 INTA 後 ISR 拉高,IRR 重設
5. CPU 再送 INTA, 8259A 收到後把 INT 號碼告訴 CPU, 以查詢中斷向量表
6. 如果在 AEOI, 8259A 把 ISR 重設,不然等到中斷服務程式 EOI 才重設。
平常用的中斷都不會忘記,可是千萬別忘了這幾個更重要的:
INT 0 Divide by zero :: 8088和286以上作用不同
INT 1 Single step (TF=1) :: 386以上有新的意義
INT 2 NMI
INT 3 Breakpoint (指令 CCh)
INT 4 Overflow (OF=1, INTO)
INT 5 PrtScr / Bound error
INT 6 Illegal instruction
INT 7 No FPU
INT A lllegal TSS (>=286)
Interrupt Request Reg (IRR)
Priority Resolver
In service reg (ISR)
Interrupt mask reg (IMR)
Control logic
Data bus buffer
R/W Logic
Cascade buffer / Comparator
比較值得注意的是,CS = 0 表示將 8259A enable, WR = 0 表示要寫入。
A0 要怎麼和 CS/WR/RD 配合,來存取 IRR,ISR,IMR,ICW1-4,OCW1-3 呢?
A0=0, D4=1 表寫入 ICW1
A0=1, 表寫入 ICW2-4, OCW1 (依序寫入)
A0=0, D4=0, D3=0 表寫入 OCW2
A0=0, D4=0, D3=1 表寫入 OCW3
初始完後,A0=1 就直接寫入 OCW1. (A0=1 要從 port $+1 送出).
Master 8259A ICW3 S0-S7 表示有幾個 Slave.
Slave 8259A ICW3 ID0-ID2 表示接在 Master 的 IRx
OCW1 的 D0-D7 代表 IMR.
OCW2 控制 rotate on non-specific EOI, specific EOI, in AEOI, 設定優先權
OCW3 控制讀取 ISR/IRR. Special Mask mode.
插斷流程(pp.96-7)
1. IR0 - IR7 = 1 時,IRR 拉高
2. PR 決定誰先,送 INT 給 CPU
3. CPU 如果 STI, 送 INTA 給 8259A
4. 收到 INTA 後 ISR 拉高,IRR 重設
5. CPU 再送 INTA, 8259A 收到後把 INT 號碼告訴 CPU, 以查詢中斷向量表
6. 如果在 AEOI, 8259A 把 ISR 重設,不然等到中斷服務程式 EOI 才重設。
平常用的中斷都不會忘記,可是千萬別忘了這幾個更重要的:
INT 0 Divide by zero :: 8088和286以上作用不同
INT 1 Single step (TF=1) :: 386以上有新的意義
INT 2 NMI
INT 3 Breakpoint (指令 CCh)
INT 4 Overflow (OF=1, INTO)
INT 5 PrtScr / Bound error
INT 6 Illegal instruction
INT 7 No FPU
INT A lllegal TSS (>=286)
2008-02-04
懷念的 8088 (1)
8088 用的是 14.31818MHz 的石英振盪晶體,除3後 4.77MHz 給 CPU (CLK),除4後 3.58MHz 給顯示卡。8088 有4個DMA, 3個 16-bit timer counter (TC), 8個INT, 一個 NMI. 其中 DMA#4 要拿來給記憶體充電,充電時 address bus 不能用,所以 CPU 要等記憶體 refresh.
TC Channel 0: 系統時間
TC Channel 1: 和 DMA#4 一起幫 RAM 充電
TC Channel 2: speaker 用的

8087 有 8 個 80-bit 暫存器,可以透過 QS0, QS1 和 8088 一起抓指令。8088 抓到 8087 的指令後丟掉不管,8087 會撿起來執行。在計算的時候,BUSY 拉起來,8088 就知道要等結果。它們用同一個 CLK. 8087 用 RQ/GT0 告訴 8088 它想用 bus. 這本書講了一堆 8087 運作方式和指令集,先跳過。
古老的時代,PIC 用的是 8259A. 如果在觸發 INT 的時候剛好 stack overflow 會怎樣?
訂閱:
文章 (Atom)