2008年9月15日 星期一

封存網誌

這個網誌將不再更新,僅用於封存以前的文章,也不再提供留言功能。之前的文章我僅挑了些可能有用的出來,其他的都刪掉了。

以Erlang實作Port Mapping

最近又開始在閒暇時看Erlang的東西....
練習寫了一些簡單的東西,如這個映射TCP Port的程式 (將本地port映設到其他host的port)
例如 tcp_bridge:start("ptt.cc", 23, 1000) 後, telnet localhost:1000就會連到ptt bbs



其實上面的實作碼潛藏著一些問題,但是當作一個telnet的跳版已經夠用了。
這個邏輯以Erlang實作算是相當精簡的。

2008年8月20日 星期三

Boost 1.36.0 Released

Boost 1.36.0 Released

增加了四個Library

  • Unordered
    我覺得這是最簡單實用的一個Library
    長久以來,C++ STL都缺乏了Hash容器的支持
    std::tr1目前還很少compiler內建支援
    在VC可用stdext::unordered_set(map),但非標準,portability差

    boost這次納入了unordered_set, unordered_map
    遵循standard library命名的概念,類別名稱描述介面不描述實作
    其實骨子裡就是HashSet和HashMap,介面相容於tr1

  • Accumulators,簡單的統計用工具

  • Unit
    號稱Zero-overhead dimensional analysis and unit/quantity manipulation and conversion
    (其實就是在compile-time做掉檢查)
    大量使用MPI及template metaprogramming。

  • Exception
    這我沒仔細看....


另外已存在的Library也有很多的更新,改變最大的應該是ASIO。例如支持Windows下透過IOCP存取named pipe,剛好最近有要寫一些IPC的東西,之後應該會看一下ASIO這方面是否變利。

2008年8月3日 星期日

Linux+EeePC? It’s not easy….

這篇要講的是「EeePC Linux版不適合給不懂電腦的人使用」…

華碩一開始在出產7吋的EeePC時,對EeePC有這樣的定位:
「Easy to play, easy to work, easy to learn」1
「EeePC不是PC、不是筆記型電腦」
當時EeePC的規格低,運算能力較差
官方只有搭載Xandros Linux的作業系統,而沒有MS Windows的版本

EeePC具備有無線上網、文書、撥放DVD及特定格式的影片….等功能….
官方也僅止於保證這些功能可以正確運作而已,確實不到一般筆電的所有功能。
但是這樣C/P值不錯的硬體,落到電腦玩家的手上,
網路上開始流傳「解放EeePC的實力」的方法
例如安裝LazyEeePC、使用Debian的套件庫、在7″ EeePC上灌Windows XP等等…

後來隨著8.9″及10″的EeePC上市
EeePC也開始同時販售Linux和Windows版
無論從價位或者效能來看
似乎再也沒有人能說EeePC不是筆電、只是玩具

價位落在13K~19K間的新型EeePC,大家應該會期待他能夠做到筆電能做的大部份功能
如果使用Windows,應該是沒問題的
可是Linux版的功能卻沒有跟上硬體的演進,內建的功能依然相當簡陋
當然,網路上有很多非官方的教學,教人如何擴充EeePC Linux的功能
但是我必需指出,這些教學的內容相當不easy,也不一定在每個版本上的EeePC上能夠正常工作
甚至,對Linux有一定概念的人,也不一定能解決每一個遇到的問題。

以下是我使用EeePC 901 + Linux所遇到的問題…

多媒體撥放
DVD的方面
原本EeePC內建的SMPlayer+MPlayer組合可以正確的撥放

EeePC並沒有內建rmvb的解碼器
網路上有一個lazyeeepc的懶人包,可以幫我們安裝一些EeePC Linux版上好用的工具
包括了rmvb的解碼器,讓我們可以直接用MPlayer撥放rmvb檔案

安裝了LazyEeePC之後,試著撥放rmvb影片看看
結果聲音和影像都停格的慘不忍睹

在網路上找到一些文章,說這是因為LazyEeePC安裝的是RealPlayer 9的codec
如果安裝了RealPlayer 10或11的Linux版,就可以順暢的撥放影片
於是我試著裝了這兩個版本….不管那一個版本
一開始撥放影片時程式就會馬上當掉
後來發現是XVideo的問題,關掉XVideo就可以撥放,但仍然有非常嚴重的停格現像

後來又無意間找到一篇教學….
在SMPlayer中將影像輸出裝置設成X11
音訊輸出裝置設成ALSA
RMVB就可以很順暢的撥放了….

一切事情解決了嗎?還沒有
在這個環境下,我試著用MPlayer撥放DVD,結果卻會當機!
以有其他人和我遇到同樣的問題。
經過交叉測試之後,發現不管是Debian或者XEPC套件庫的MPlayer,都無法在我的電腦上正常撥放DVD

無線網路
Xandros管理無線網路的GUI相當簡陋
(我沒在有NB上跑過Linux, 不清楚他是不是直接拿debian的套件來用)
做連線/斷線動作時,有時會跳出視窗顯示ifconfig等指令的執行過程,有時不會顯示
有時連不上網路時,也不會顯示錯誤訊息
另外,我找不到如何在UI中直接調整認證方式為Shared key..
在使用Shared Key認證方式時,好像唯有打指令設定一途

其他Linux Distribution
EeePC內建的Xandros功能明顯不足,或許有人會想要使用其他版本的Linux
但目前並沒有一個Linux Distribution對EeePC有完整的支援
eeebuntu, eeexubuntu這兩個專案,都還不能支援EeePC的所有硬體
PCMan等人開發的LXDE目前尚不支援EeePC 901

結語
本人並非微軟的愛好者。
我也相當遵敬、感謝lazyeeepc, LXDE, eeebuntu, eeeXubuntu的開發者。

我也可以想像,應該護有人跳出來說我資料找的不足。
在那裡有解決我遇到問題的方法。
但我必需指出,目前在EeePC上,Windows XP的支援性、易用性比Windows好的多。
對一個自認對Linux有一定程度了解的人,花兩個晚上還搞不定多媒體、無線網路。
這些東西使用Windows XP+MPlayer, KLite等免費軟體,幾分鐘就可以設定完閉。

對有一定Linux知識的玩家來說,Linux或許是你的好選擇。
但若你是要推薦給不太會用電腦的長輩、朋友、或是不想花太多時間調整系統。
我想「EeePC上Linux其實比Windows還簡單易用」這句話離限實還有一大段距離
如果你不想花一堆時間解決系統的問題,拿8G MLC硬碟去換XP的正版授權,我想是值得的。

最後,以上是我在2008/7月的使用心得。
這篇文章應具有時效性。
我也期待開源社群的活躍,或許有朝一日Linux會比Window還要Easy to use…


Footnotes:
  1. 參考此網頁的標題 [up]

4 Responses to “Linux+EeePC? It’s not easy….”

  1. songsongboyon 05 Aug 2008 at 2:07 am

    聽起來真是恐怖…連你都覺得難用的話 Orz

    不過是資工學生的就該買 Linux 版阿 XD (<= 偏見)

    反正現在也沒錢買這種東西,相信等我有錢時情況應該會好很多…吧?

  2. 大鳥on 09 Aug 2008 at 11:46 am

    你什麼時候留言的….
    我過了好幾天看到
    我WP的E-mail通知功能好像有點問題 Orz

  3. 玉子@香港on 29 Aug 2008 at 2:42 am

    咁 你一定要去呢度至得了,問 asus 係無用的, 佢地 d 技術人員一點都唔 pro, 夠胆同我講話 eeepc 目前係無任何 player 可以 support 到佢, 點知唔夠一個鐘我就搵到呢個網站, 我試過睇 rmvb, 不錯, 都幾流暢, 睇過呢個網站後, 包你愛上你的 eeepc.

    讓Eee PC內建的影音播放器支援rmvb
    http://blog.yam.com/tad0616/article/12306274

    Eee PC改造手冊
    http://blog.yam.com/BlogIndex.php?BLOG_ID=tad0616&CATEGORY_ID=1626347

2008年7月19日 星期六

一段愛與極座標系統的故事

被標題騙進來的人....這是數學文章不是愛情故事 XD

前陣子在同學Honda的BBS個版上看到一個關於笛卡兒的故事。其實這個故事源自於網路流傳,出處已經不詳了 (記得很久以前曾經看過不同的版本) ,在這裡引述一下....
十七世紀出生於法國的笛卡兒是第一個發現直角坐標的人,這對後人的貢獻相當大,可惜一生窮困潦倒。
一直到52歲,仍一直默默無名。當時法國正流行黑死病,笛卡兒不得不逃離,流浪到瑞典當乞丐。

某天,他在市場乞討時,有一群少女經過,
其中一名少女發現他的口音不像是瑞典人,她對笛卡兒非常好奇,於是上前問他:

「你從哪來的啊?」

「法國。」

「你是做什麼的啊?」

「我是數學家。」

這名少女叫克麗絲汀,18歲,是位公主,她和其它女孩不同,
克麗絲汀不喜歡文學,而是熱衷數學。
當她聽到笛卡兒說明身份後,感到相當大的興趣,於是把笛卡兒邀請回宮。

笛卡兒就成了她的數學老師,將一生的研究傾囊相授,
而克麗絲汀的數學也日益進步,直角坐標當時也只有笛卡兒這對師生才懂。

後來,他們之間產生了不一樣的情愫,發生喧騰一時的師生戀。
然而這件事傳到國王耳中,讓國王相當憤怒!下令將笛卡兒處死,克麗絲汀以自縊相逼,
國王害怕寶貝女兒真的會想不開,於是...將笛卡兒放逐回法國,也將克麗絲汀軟禁。

笛卡兒一回到法國沒多久就染上黑死病,躺在床上奄奄一息。
笛卡兒不斷地寫信到瑞典給克麗絲汀,都被國王攔截沒收。
克麗絲汀也就不曾收到過笛卡兒寫來的信...

就在笛卡兒快要死去的時候,他寄出了第13封信,當他寄出去沒多久後就氣絕身亡。
這封信的內容只有短短的一行...

r = a(1-sinθ)

國王攔截到這封信後拆開看,發現並不是一如往常的情話。
於是找來城裡所有科學家來研究,但都沒有任何人能夠解開。
國王心想...反正笛卡兒就快要死了,而且公主被軟禁時都悶悶不樂,便把信交給克麗絲汀。

故事暫停一下。




前陣子在PTT程設版看到有人問這樣的問題:
請問版上大大 我現在有一張image(方形)
想把他 warping 成環型(甜甜圈)
網路上沒看到相似的方法
不知道版上的高手有沒有任何想法呢
可以提供給小弟

極座標系統(Polar coordinate system)是解決這個問題的一個快速途徑。下圖 ((圖片引用自維基共享資援)) 是極座標系統的一個範例。



極座標系統定義一個中心點O,並且以與中心點的距離r,以及夾角θ,定位平面上的任何一個點。

極座標系統 (r, θ) 和我們更熟知的直角座標系 (x,y) 間,可以下列公式轉換:

[tex]x = r cos \theta[/tex]
[tex]y = r sin \theta[/tex]
記得這是理組高中數學的內容....

這樣對我們先前提到的問題有什麼幫助呢?

讓我們想想,怎樣在極座標系上,表示半徑為10的圓?
[tex]r = 10[/tex]
怎樣在極座標系上,表示一個內圈半徑為10,外圈半徑為15的環?
[tex]10 < r < 15[/tex]

要怎麼把一個矩型的圖片Wrap(變型)到一個環上,答案就呼之欲出了。


(x,y)為原圖上的座標
(x',y')為目的圖上的座標 (使用直角座標系,x軸向右,y軸向上)
(r,θ)為目的圖上的極標
(w,h)為原圖上的寬及高
R1為環內圈半徑,R2為環的寬度

讓我們觀查一下這組等式:
[tex] r = \frac{y}{h} \times R_{2} + R_{1} [/tex]
[tex] \theta = \frac{x}{w} \times 2\pi [/tex]

第一式讓y值越高時,r越大,距離原點越遠
第二式讓原圖的x座標轉變為目的圖的θ角,達成繞原點一週

但電腦在運算時,最直觀的方法是用點陣圖來處理。
所以我們最好把找到給定(x', y'),找到(x,y)的公式。
因此,將上述等式移項

[tex]x = \theta \times \frac{w}{2\pi} [/tex]
[tex] y = (r-R_{1}) \times \frac{h}{R_{2}} [/tex]

配合

[tex]x' = r cos \theta[/tex]
[tex]y' = r sin \theta[/tex]

便可以(x',y')反查(x,y)

讓我們直接看看實作出來的效果
假設這是原圖(點擊放大) ((這是Gun and roses樂團Paradise City的第一句歌詞)) :



經過上述公式映射後會變成



看起來怪怪的應該是我沒有做Anti-aliasing。我用Matlab實作的程式碼置於文末,取樣時我是用nearest point,有興趣的人可以試著改成bilinear interpolation看看。




回到笛卡兒的故事吧....
當克麗絲汀收到這封信時,雀躍無比,她很高與她的愛人還是想念她。
她立刻動手研究這行字的秘密。沒多久就解出來了,用的就是「直角坐標圖」....

當 θ=0度時,r=a(1-0)=a
θ=90度時,r=a(1-1)=0
θ=180度時,r=a(1-0)=a
θ=270度時,r=a(1+1)=2a,

其中a為四截距的比值,再將所有的點連接起來...就是有名的心臟線

這是網路流傳文章的全文....可是看來他用的是極座標系統,與直角座標系並沒有直接的關係啊。

先不管這個,我們試著把這張圖畫出來吧,使用matlab是很簡單的..
close all; figure;
n = 10000;
a = 10;
X = zeros(n, 1);
Y = zeros(n, 1);
i = 0;
for theta = linspace(0, 2*pi, n+1)
i = i + 1;
r = a * ( 1 - sin(theta) );
X(i) = r * cos(theta);
Y(i) = r * sin(theta);
end
line(X,Y);




原來這張圖代表了笛卡兒對於公主的愛意啊....




至於這個故事的真實性,我想本來就是漏洞百出的,如果有興趣的話,這邊有人考據過了。我想,故事有趣就好,這時候真相可能不是那麼重要吧....XD如果有興趣,可以參考這篇文章

最後,我們可以用上面的方法,把一張矩型的圖片Wrap到一個心型的環上嗎?
原本的等式是
[tex]x = \theta \times \frac{w}{2\pi} [/tex]
[tex] y = (r-R_{1}) \times \frac{h}{R_{2}} [/tex]
我們簡單的以
[tex]R_{1} = a \times ( 1 - sin\theta ) [/tex]
代入即可得到


看起來怪怪的,圖片被太過扭曲了。至於為什麼會這樣,答案就留給有興趣的讀者自己找尋吧...

附上本文所用到的源碼及圖片,很久沒寫Matlab了,很多地方都沒寫好。[Link]