最早是朋友 D 介紹我認識這家工具鉗大廠的,但最近連著幾次人在外頭找不到工具,才認真研究起來。底下是一點小筆記:
首先,Leatherman 網站本身還蠻有用,除了詳盡的介紹跟說明書以外,應該就屬 Compare 最好用,可以快速比較不同工具鉗的異同。 首先就是,並不是越多功能就越好,主要是看自己會用到什麼,所以要先想想看平時缺工具的時候都是缺啥。有一些細節要注意,這裡只寫應該最常用的 FULL SIZE 跟 HEAVY DUTY 系列。
FULL SIZE 乍看之下很多型號,其實只有三個系列:
1. Kick -> Fuse -> Blast 功能由少到多,這個系列的特色是,有獨立的螺絲起子,平口跟十字,不是可以換的 bit drive。乍看之下比較沒彈性,但其實很關鍵的是它有長度,而且比較細,所以很多螺絲要用這系列的才鎖的到。搭配的 Removable Bit Driver 感覺非常好用,搭上去以後雖然口徑變大,但長度又增加,多了十個不同的螺絲頭。另一個重要特徵就是,他的主刀都是 Leatherman 中第三等級的 420HC,硬度稍低些,而且「不能單手開刀」。這系列的定位感覺是做工的,就是真的拿來五金工作,而不是日常隨時要拿出來開個信之類。Blast 多一個細的 bit drive 是拿來修眼鏡的。
2. Wave -> Charge ,其實 Charge 系列根本可以視為 Wave 的後繼,功能變多,一些設計也有改進,我如果需要這系列的話,應該會跳過 Wave 直接從 Charge 看起。這系列重點是用了 bit drive,可以換很多螺絲頭,然後可以單手開刀。AL 包括了一般的最常用功能,ALX 把剪刀換成開刃的鉤子(不知道中文專有名詞是啥),然後 TTi 是兩者合一。TTi 的主刀 S30V 最高級,外殼用了鈦也讓它變輕,Charge AL 跟 ALX 的主刀都是次級的 154CM,比 Wave 的 420HC 好些,Charge 系列附送的 bit drive 也多。這個應該是最多功能的 every day carry,以及野外的情境下適用。是我一定挑 TTi,因為沒比較重,大不了多少,功能又最強。
3. Wingman, Sidekick 這系列其實很有趣,看來是新出的,而且兩個功能差異頗大,特色是都沒有 bit drive 而有獨立的平口十字起子各一,鉗子有彈簧,可以單手開刀,就是比 Wave/Charge 更輕量些,然後 Sidekick 有鋸子跟鋸齒刀(繩子用),比較偏野外,Wingman 換成開箱/開包裹的鉤子跟「大」剪刀,比較偏都市日常使用。這系列其實蠻有吸引力,因為少得很剛好,少用的都拿掉了,然後要用的功能都弄得蠻好用。但讓我有疑慮的是沒見過實物,不知道螺絲起子夠不夠細,會不會又容易卡住。然後不能換上其他的螺絲頭也是減分。主刀都是 420HC。
HEAVY DUTY 蠻單純的,Surge 就是更強版的 Charge,然後鋸子可以跟附上的鑽石銼刀互換著用。Super Tool 300 就是加強的 Blast,一樣主刀無法單手開,螺絲頭全部不可拆,也可以搭配 Removable Bit Driver 這樣。重點是剪線鉗口可換,就是拿來做粗重五金工作的意思。最後是 Crunch,這支重點是那個壓力鉗,其他連刀子都省成鋸齒刀一把而已,明顯是打算在機械、修繕的場合搭配其他工具一起使用。
最後提到我的選擇。我不想拿工具鉗(奇怪吧,介紹這麼多結果不想拿),因為日常不太用到那麼多,最常用的應該是開瓶器、刀跟螺絲起子,所以一開始買了 c33Bx,原因是它就有刀跟開瓶器,螺絲起子是可以換的 bit drive,附送的是一邊平口一邊十字,感覺剛剛好。結果買來一用才知道不對,首先我買了半齒半刃,齒刃那邊根本用不著。而起子長度不夠是致命的。最後只好換買 c33T,沒有 "x" 所以是平刃的刀,加上開瓶器跟固定的十字平口起子各一。由於也可以搭配 Removable Bit Driver,不帶替換的螺絲頭的話,等於兩把螺絲起子、開瓶跟刀合一。帶的話,變成幾乎整組螺絲起子都不用帶了,還有內六角跟小十字之類,感覺蠻不錯的。
這樣最遺憾的是沒有鉗子跟剪刀,但以我的使用而言,這兩個沒有還算可以忍受啦,至少這樣輕多了。如果是要挑更小號一點的工具,也蠻單純的,主要就是決定需不需要單手開刀,剪刀跟鉗子需不需要,這些決定以後就只是功能上取捨了。
2012年1月19日
2010年7月27日
Programming is The New Art
The CEO of my former company, Sean Moss-Pultz, once stated that he believes in the Internet era, the new generation of artists must know how to program. I heard the same thing again from a friend of mine, who is (supposed to be ;-) an artist as well. If you give it some thought, it actually makes a lot of sense.
This starts with the fact that the tools we used to create artwork are becoming digitized. Many will resist but the resistance will be futile, just like writing with pen and paper or sending a greeting card. Yes, it's still there and people still do that, but it's drifting further and further away from the mainstream.
So, what does this mean? Digitized tools generate digitized works, and digitized works could be easily modified by software. So, if an artist's technique could be achieved by software means, then boom, everyone could do the same. For example, combining two images on the same photo used to be an art, and shooting firework pictures used to be difficult.
In the end, it all comes down to creativity. Artists can use the same tools and materials to create something different, and that cannot be taught by software. In other words, they use the existing stuffs in a 'creative' way. In a not so ancient time, people do tricks on films, modify lens, etc. to be creative, and nowadays people use software tools. However, it's rather constrained by the toolbox of the software, and people may have a hard time to use/misuse these to mirror the idea in their mind, which may or may not be what these are designed to do.
Now what's the most direct and flexiable way to manipulate digits? What's the most powerful tool? "Programming" comes to mind. We have seen a lot like this before: Processing, Pure Data, etc. ,and we see more and more like this, for example, a programmable camera.
What does this mean? I don't know. People say you use right brain to do art, left brain to do math. Programming is considered to be more like a left brain thing, and now you have to use it to create art? I guess this means we need a more intuitive, less 'mathematical' programming tool, and it doesn't have to be a 'language'. It could be something like App Inventor, in which you can create program by putting together building blocks, just like LEGO.
By the way, I know the title does not really match the content, but I still like it. ;-)
This starts with the fact that the tools we used to create artwork are becoming digitized. Many will resist but the resistance will be futile, just like writing with pen and paper or sending a greeting card. Yes, it's still there and people still do that, but it's drifting further and further away from the mainstream.
So, what does this mean? Digitized tools generate digitized works, and digitized works could be easily modified by software. So, if an artist's technique could be achieved by software means, then boom, everyone could do the same. For example, combining two images on the same photo used to be an art, and shooting firework pictures used to be difficult.
In the end, it all comes down to creativity. Artists can use the same tools and materials to create something different, and that cannot be taught by software. In other words, they use the existing stuffs in a 'creative' way. In a not so ancient time, people do tricks on films, modify lens, etc. to be creative, and nowadays people use software tools. However, it's rather constrained by the toolbox of the software, and people may have a hard time to use/misuse these to mirror the idea in their mind, which may or may not be what these are designed to do.
Now what's the most direct and flexiable way to manipulate digits? What's the most powerful tool? "Programming" comes to mind. We have seen a lot like this before: Processing, Pure Data, etc. ,and we see more and more like this, for example, a programmable camera.
What does this mean? I don't know. People say you use right brain to do art, left brain to do math. Programming is considered to be more like a left brain thing, and now you have to use it to create art? I guess this means we need a more intuitive, less 'mathematical' programming tool, and it doesn't have to be a 'language'. It could be something like App Inventor, in which you can create program by putting together building blocks, just like LEGO.
By the way, I know the title does not really match the content, but I still like it. ;-)
2010年2月11日
2009年11月30日
2009年4月18日
2008年11月2日
2008年8月25日
MSN 中毒怎麼辦?
好吧,雖然我很不想幫 Microsoft 收爛攤子,但如果有人因為誤填了自己的帳號密碼導致病毒(其實應稱做 phishing) 一直送有毒的網址給你 MSN 裡頭的人,這裡是解決方法:
到 https://accountservices.passport.net/?lc=1033 ,把你自己的密碼改掉。因為之前病毒記得的密碼改變了,所以就無法再假扮身份啦。
到 https://accountservices.passport.net/?lc=1033 ,把你自己的密碼改掉。因為之前病毒記得的密碼改變了,所以就無法再假扮身份啦。
2008年8月18日
2008年7月21日
Firefox: Recently Closed Tabs
新的 firefox 3 提供一個超級貼心的功能,習慣用 tab 瀏覽的人經常會不小心關錯 tab,雖然可以從 history 裡頭找出來,只要選擇按照 last visited 排列就可以,不過還是不太方便。現在只要到 history 功能表裡頭就可以直接重新開回來,相當方便!
2008年2月27日
FOSDEM 2008
FOSDEM 的全名是 Free and Open Source Software Developers' European Meeting,姑且譯作「開源碼開發者歐洲會議」。這是歐洲最大的開源碼年會。由於工作關係,公司願意派人參加。第一次加入西方的此類會議,對我算是頗為新奇的經驗。
今年 FOSDEM 是在比利時布魯塞爾舉行。當地英文不是主要語言,而是以法語、德語為主。一出機場,英文就看不見了,只在旅館等屬於觀光客的地方才有。好在大眾運輸系統標示相當清楚,就算是文盲,憑著拼字以及圖示猜測,還是正確地火車轉捷運抵達旅館。年會歷時一個週末,從周五晚上開始,到周日下午結束。周五晚開場的活動是Beer event,「啤酒聚會」,在 Delirium Café 舉行,20歐元的費用就隨你喝到爽。比利時啤酒天下第一,吧台光是新鮮的加壓啤酒大概就有20多種,景象頗為壯觀,啤酒們口味濃淡各自不同,不過酒精濃度都比普通的高些,一般在7%甚至到15%左右。經過親身試驗,忙著聊天的結果只嘗試了五六種,全都很好喝。在這暖身活動就見到不少人物,除了之前幾位合作的舊識之外,也看到一些名人,總之就是些大鬍子、光頭,不是很胖就是很瘦,諸如此類。不過由於 FOSDEM 已經屬於比較商業的活動,許多人都是公司付錢來參加,據同事說,氣味比較不像之前他去過的 CCC 那麼嬉皮,大部分人看起來都正常多了。
例如席間跟新認識的 Mark Brown 聊天,此人自我介紹是 Debian zlib 以及其他幾個 package 的維護者,類似如此的小驚奇層出不窮,很容易就會認識到原本在某某專案中看過的名字。這可說是開源碼相當令人興奮的特色之一,就是個人名譽。這對於做開源碼的個人生涯有非常大的相關,只要你有顯著貢獻,財務上會有穩定保障,可繼續專心發展軟體。聊著聊著,話題不知怎麼的,帶到開源碼的工程師待遇問題,我說在臺灣這邊的公司,有許多人是放棄了更加高薪的職位,為了想發展開源碼而加入的。他的反應頗大,指出其實這問題很普遍,他個人也是同樣情況。當然為了這種信仰,人們會願意放棄一些金錢上的好處,但我想繼續尋求更佳的開源碼獲利方式,才是皆大歡喜的策略。
FOSDEM 正式舉行的場地當然不是酒吧,而是 Université Libre de Bruxelles (ULB),布魯塞爾自由大學。接下來兩天正式的活動大概分成兩大類,其一是演講類,其中又分在大間教室舉辦的較一般性的大演講,以及所謂的 lightening talk,每人15分鐘的時間發揮。還有在各小間教室舉行,針對比較特定族群的演講,例如 Mozilla, gnome, kde, x.org 以及 embedded 等等。另一類是專案攤位,例如耗去我大部分時間的 OpenEmbedded 攤位,旁邊就是 PostgreSQL,另一邊則是 Debian 等等不同專案的地盤。這些攤位主要目的是公關,海報、傳單、紀念品,以及向有興趣的人介紹、推廣自身 project。會場氣氛相當熱烈,不論是在演講中提出的問題,以及在各攤位、走廊間,四處都可見到三五成群的各色人等,操著不同口音的各種語言,討論充滿奇怪名詞以及縮寫字的議題。雖說各類網路溝通工具都已經相當發達,但目前這種面對面討論以及演講等等所傳達的訊息濃度,仍是無法取代的。原本只是網路上暱稱的人們聚集一處,互相認識,對於日後合作也會有相當助益。
技術方面就這次參與到的部份簡單敘述一些比較有趣的:OpenEmbedded(OE)的發展看來仍然很不錯,最近的技術 package staging 如果能夠發展成熟,將能顯著減少系統編譯的時間。一般來說,嵌入式系統困難的部份在於軟硬體的整合,這部份搞定之後,就是系統其他部份要添加血肉。而一般開發者要進入嵌入式領域,cross compiling (抱歉,此專有名詞不翻譯比較好)通常是個門檻,而且經常在重新創造輪子,解決已經有人解掉的問題。OE 原本做得最好的就是這部份,但相對的,動輒數十 GB 的磁碟消耗量以及編譯消耗的時間,還有陡峭的學習曲線等,都是問題。這次修改應該對磁碟消耗量以及編譯時間有相當的幫助,但在學習曲線部份,就沒什麼助益。希望隨著專案日益穩定,以往由於本身瑕疵造成的學習困難可以日漸減少。
另外在系統安全的部份,SELinux 或許已經可以決定是個失敗的嘗試,因為實在太難用了。這次聽到的 Tomoyo Linux 至少很容易懂,但相對來說比較新,還有不少功能沒做進去。等到都進去之後是不是還這麼好懂,以及由於是日本人做的專案,宣傳上沒有西方人這麼強,日後的發展,拭目以待。Tomoyo Linux 的演講者 Toshiharu Harada 相當有趣,日本腔很重,一開始就很有禮貌的給每個人名片及測試光碟,讓大家可以直接拿來開機嘗試。首張投影片就說 FOSDEM 是歐洲人的聚會,但他是日本人,為了要推廣 Tomoyo,公司花了很多錢讓他飛了很遠來到這裡介紹。我好像也飛了很遠,而且當時整個 FOSDEM 裡頭只有我跟他兩張亞洲面孔,真是心有戚戚焉哪。
我想 embedded 系統很值得關注的部份,應該是手持裝置的領域。之前我不知道 smartphone 以及 pda 在歐洲極度普及,歐洲朋友告訴我,如果是白領階級,使用 smartphone 且隨時收發 email 已經成為常態。這跟臺灣的狀況明顯不同,所以很容易忽略這塊是多麼可怕的市場。由於手持式裝置的天性,許多組織,包括公家機關、企業等等,會希望能夠對軟體取得更多的控制,做出組織專屬的客製化手機。而一般使用者也會希望對應用軟體有更多選擇,這點可由 iPhone installer[1] 的成功看出。此類需求隱約與自由精神相合,故開源碼在這應該是很有機會的。OpenMoko 目前是唯一的開放平台,軟硬體都公開,所以仍然獲得許多專注目光,可惜專案公司本身似乎不太確定之後的腳步該怎麼走,跟社群的連繫也不佳,導致希望幫忙的人不得其門而入。
iRex 所出產的裝置之前只聞其名,這次真正見識,令人印象深刻。撇開裝置本身輕薄不談,最驚人的是螢幕,僅有黑白兩色,顯示細緻、清晰,在陽光下的表現更加清楚,品質已經直追紙張,真正達到易讀的目的。螢幕上的字母不像一般液晶顯示器,反而有紙張印刷的質感。另外有專用的觸控筆,除了專用筆以外的東西接觸螢幕,就不會感應,行為與筆記本相同,避免此類裝置在背包或口袋中胡亂感應的問題。或許在將來的大學,會人手一本也說不定。

參加此類聚會,個人有一深刻感覺,就是談理論的不多,大部分都是談實作。這再次碰觸到經常被忽略的一點,即電腦科學與電腦工程師是相當不同的領域。電腦科學家偏向數學,事實上僅需要紙筆就可以發展,僅需要實作來證明。但對工程師來說,實作才是真正重點,因為理論僅發展一次,其後都是各種應用,這就需要工程師來填補。對科學家而言,理論是研究的目標,但對工程師而言,其在電腦科學的素養經常只是為了理解理論,進而應用。我們在學校所受的訓練,經常著重理論教育,對各種程式庫 API 熟悉、對通訊協定熟悉、對現有軟體架構熟悉,往往不會被視為真正的成就。但一旦真正進入業界,才會知道這些才是真正把東西做出來的能力,反而理論方面,只要熟習現有的東西,並且靈活運用,就已經非常足夠。我認為在現今電腦教育中,加入更多專案,以開源碼、Google summer of code 等等為目標,由真正會寫程式的助教或老師來帶領,對學生們會是非常有用的。
在會議將近結束時,發生一件有趣的小插曲。一位看起來非常熱血模樣的年輕人,操著歐洲口音很重的英文,衝向我們詢問有沒有 Debian 的使用者。我回答有,他立刻抽出一台華碩 Eee PC,開機,嘴巴喃喃念著說他有個問題不知道怎麼解決,希望我能幫忙。開機開到一半,他激動的指著一行錯誤訊息說,他的電腦在這裡發生問題,會停頓兩秒鐘才繼續開機。他不能容許他的機器在開機的時候停下來兩秒,他一定要把他修好!我問他有沒有試過直接開到 shell 下執行相關的 init scripts 來找出問題出在哪個 script,進而找出是哪個指令,然後再追蹤下去就行了。他嘴中唸唸有詞,手中打字打個不停,然後指著螢幕說,哈,找到了,這個我可以修!
我正以為可以開始打包閃人的時候,他繼續發問。我無辜的開始念一些我只是剛好坐在這其實不是 Debian 攤位的人之類的話,他才不管,他說他希望得到 Debian 同伴們的支持。好吧。這次是有關 tty1 的問題,看來他不喜歡 tty1 的 login,但卻不知道該在哪裡控制,upstart 的地方他又找不到。看來他是從 Ubuntu 開始轉到 Debian 的。我把 /etc/inittab 列給他看,他高興得很,謝了大家就愉快的走了。這時我有點傻眼,同伴說,他記得以前第一次參加這類開源碼會議的時候,他請一位不認識的人幫他安裝 Linux,那人先設定了網路安裝,幾個命令就開始動了。他說他當時覺得那人真是太神奇了,好想知道自己什麼時候才能做一樣的事情。真是值得回憶的熱血年代啊。
在法蘭克福到香港的飛機上敲著鍵盤,此時若要對 FOSDEM 做個總結,那就是覺得自己實在太過渺小,對太多東西都還不懂,寫程式的量也實在太少了。臺灣受限於語言與地理位置,要跟上世界發展的腳步,只有充分利用 Internet,訓練英文,直接參與最上游的互動以及吸取資訊才最有效。
p.s.非認真的小心得:
[1] iPhone 是被一個升大學的男生利用暑假破解的。他把第一支破解的 iPhone 拿上網拍賣,最後交換了一台 Nissan 350Z 和好幾隻全新的 iPhone,還有幾間公司的顧問職務。很不錯吧?他在硬體方面先破解之後,軟體方面就簡單很多,最後由社群力量做出 installer,一個可以自由安裝各種社群開發程式的軟體。有 installer 之後,iPhone 可是比原來有趣多了。
今年 FOSDEM 是在比利時布魯塞爾舉行。當地英文不是主要語言,而是以法語、德語為主。一出機場,英文就看不見了,只在旅館等屬於觀光客的地方才有。好在大眾運輸系統標示相當清楚,就算是文盲,憑著拼字以及圖示猜測,還是正確地火車轉捷運抵達旅館。年會歷時一個週末,從周五晚上開始,到周日下午結束。周五晚開場的活動是Beer event,「啤酒聚會」,在 Delirium Café 舉行,20歐元的費用就隨你喝到爽。比利時啤酒天下第一,吧台光是新鮮的加壓啤酒大概就有20多種,景象頗為壯觀,啤酒們口味濃淡各自不同,不過酒精濃度都比普通的高些,一般在7%甚至到15%左右。經過親身試驗,忙著聊天的結果只嘗試了五六種,全都很好喝。在這暖身活動就見到不少人物,除了之前幾位合作的舊識之外,也看到一些名人,總之就是些大鬍子、光頭,不是很胖就是很瘦,諸如此類。不過由於 FOSDEM 已經屬於比較商業的活動,許多人都是公司付錢來參加,據同事說,氣味比較不像之前他去過的 CCC 那麼嬉皮,大部分人看起來都正常多了。
例如席間跟新認識的 Mark Brown 聊天,此人自我介紹是 Debian zlib 以及其他幾個 package 的維護者,類似如此的小驚奇層出不窮,很容易就會認識到原本在某某專案中看過的名字。這可說是開源碼相當令人興奮的特色之一,就是個人名譽。這對於做開源碼的個人生涯有非常大的相關,只要你有顯著貢獻,財務上會有穩定保障,可繼續專心發展軟體。聊著聊著,話題不知怎麼的,帶到開源碼的工程師待遇問題,我說在臺灣這邊的公司,有許多人是放棄了更加高薪的職位,為了想發展開源碼而加入的。他的反應頗大,指出其實這問題很普遍,他個人也是同樣情況。當然為了這種信仰,人們會願意放棄一些金錢上的好處,但我想繼續尋求更佳的開源碼獲利方式,才是皆大歡喜的策略。
FOSDEM 正式舉行的場地當然不是酒吧,而是 Université Libre de Bruxelles (ULB),布魯塞爾自由大學。接下來兩天正式的活動大概分成兩大類,其一是演講類,其中又分在大間教室舉辦的較一般性的大演講,以及所謂的 lightening talk,每人15分鐘的時間發揮。還有在各小間教室舉行,針對比較特定族群的演講,例如 Mozilla, gnome, kde, x.org 以及 embedded 等等。另一類是專案攤位,例如耗去我大部分時間的 OpenEmbedded 攤位,旁邊就是 PostgreSQL,另一邊則是 Debian 等等不同專案的地盤。這些攤位主要目的是公關,海報、傳單、紀念品,以及向有興趣的人介紹、推廣自身 project。會場氣氛相當熱烈,不論是在演講中提出的問題,以及在各攤位、走廊間,四處都可見到三五成群的各色人等,操著不同口音的各種語言,討論充滿奇怪名詞以及縮寫字的議題。雖說各類網路溝通工具都已經相當發達,但目前這種面對面討論以及演講等等所傳達的訊息濃度,仍是無法取代的。原本只是網路上暱稱的人們聚集一處,互相認識,對於日後合作也會有相當助益。技術方面就這次參與到的部份簡單敘述一些比較有趣的:OpenEmbedded(OE)的發展看來仍然很不錯,最近的技術 package staging 如果能夠發展成熟,將能顯著減少系統編譯的時間。一般來說,嵌入式系統困難的部份在於軟硬體的整合,這部份搞定之後,就是系統其他部份要添加血肉。而一般開發者要進入嵌入式領域,cross compiling (抱歉,此專有名詞不翻譯比較好)通常是個門檻,而且經常在重新創造輪子,解決已經有人解掉的問題。OE 原本做得最好的就是這部份,但相對的,動輒數十 GB 的磁碟消耗量以及編譯消耗的時間,還有陡峭的學習曲線等,都是問題。這次修改應該對磁碟消耗量以及編譯時間有相當的幫助,但在學習曲線部份,就沒什麼助益。希望隨著專案日益穩定,以往由於本身瑕疵造成的學習困難可以日漸減少。
另外在系統安全的部份,SELinux 或許已經可以決定是個失敗的嘗試,因為實在太難用了。這次聽到的 Tomoyo Linux 至少很容易懂,但相對來說比較新,還有不少功能沒做進去。等到都進去之後是不是還這麼好懂,以及由於是日本人做的專案,宣傳上沒有西方人這麼強,日後的發展,拭目以待。Tomoyo Linux 的演講者 Toshiharu Harada 相當有趣,日本腔很重,一開始就很有禮貌的給每個人名片及測試光碟,讓大家可以直接拿來開機嘗試。首張投影片就說 FOSDEM 是歐洲人的聚會,但他是日本人,為了要推廣 Tomoyo,公司花了很多錢讓他飛了很遠來到這裡介紹。我好像也飛了很遠,而且當時整個 FOSDEM 裡頭只有我跟他兩張亞洲面孔,真是心有戚戚焉哪。
我想 embedded 系統很值得關注的部份,應該是手持裝置的領域。之前我不知道 smartphone 以及 pda 在歐洲極度普及,歐洲朋友告訴我,如果是白領階級,使用 smartphone 且隨時收發 email 已經成為常態。這跟臺灣的狀況明顯不同,所以很容易忽略這塊是多麼可怕的市場。由於手持式裝置的天性,許多組織,包括公家機關、企業等等,會希望能夠對軟體取得更多的控制,做出組織專屬的客製化手機。而一般使用者也會希望對應用軟體有更多選擇,這點可由 iPhone installer[1] 的成功看出。此類需求隱約與自由精神相合,故開源碼在這應該是很有機會的。OpenMoko 目前是唯一的開放平台,軟硬體都公開,所以仍然獲得許多專注目光,可惜專案公司本身似乎不太確定之後的腳步該怎麼走,跟社群的連繫也不佳,導致希望幫忙的人不得其門而入。
iRex 所出產的裝置之前只聞其名,這次真正見識,令人印象深刻。撇開裝置本身輕薄不談,最驚人的是螢幕,僅有黑白兩色,顯示細緻、清晰,在陽光下的表現更加清楚,品質已經直追紙張,真正達到易讀的目的。螢幕上的字母不像一般液晶顯示器,反而有紙張印刷的質感。另外有專用的觸控筆,除了專用筆以外的東西接觸螢幕,就不會感應,行為與筆記本相同,避免此類裝置在背包或口袋中胡亂感應的問題。或許在將來的大學,會人手一本也說不定。參加此類聚會,個人有一深刻感覺,就是談理論的不多,大部分都是談實作。這再次碰觸到經常被忽略的一點,即電腦科學與電腦工程師是相當不同的領域。電腦科學家偏向數學,事實上僅需要紙筆就可以發展,僅需要實作來證明。但對工程師來說,實作才是真正重點,因為理論僅發展一次,其後都是各種應用,這就需要工程師來填補。對科學家而言,理論是研究的目標,但對工程師而言,其在電腦科學的素養經常只是為了理解理論,進而應用。我們在學校所受的訓練,經常著重理論教育,對各種程式庫 API 熟悉、對通訊協定熟悉、對現有軟體架構熟悉,往往不會被視為真正的成就。但一旦真正進入業界,才會知道這些才是真正把東西做出來的能力,反而理論方面,只要熟習現有的東西,並且靈活運用,就已經非常足夠。我認為在現今電腦教育中,加入更多專案,以開源碼、Google summer of code 等等為目標,由真正會寫程式的助教或老師來帶領,對學生們會是非常有用的。
在會議將近結束時,發生一件有趣的小插曲。一位看起來非常熱血模樣的年輕人,操著歐洲口音很重的英文,衝向我們詢問有沒有 Debian 的使用者。我回答有,他立刻抽出一台華碩 Eee PC,開機,嘴巴喃喃念著說他有個問題不知道怎麼解決,希望我能幫忙。開機開到一半,他激動的指著一行錯誤訊息說,他的電腦在這裡發生問題,會停頓兩秒鐘才繼續開機。他不能容許他的機器在開機的時候停下來兩秒,他一定要把他修好!我問他有沒有試過直接開到 shell 下執行相關的 init scripts 來找出問題出在哪個 script,進而找出是哪個指令,然後再追蹤下去就行了。他嘴中唸唸有詞,手中打字打個不停,然後指著螢幕說,哈,找到了,這個我可以修!
我正以為可以開始打包閃人的時候,他繼續發問。我無辜的開始念一些我只是剛好坐在這其實不是 Debian 攤位的人之類的話,他才不管,他說他希望得到 Debian 同伴們的支持。好吧。這次是有關 tty1 的問題,看來他不喜歡 tty1 的 login,但卻不知道該在哪裡控制,upstart 的地方他又找不到。看來他是從 Ubuntu 開始轉到 Debian 的。我把 /etc/inittab 列給他看,他高興得很,謝了大家就愉快的走了。這時我有點傻眼,同伴說,他記得以前第一次參加這類開源碼會議的時候,他請一位不認識的人幫他安裝 Linux,那人先設定了網路安裝,幾個命令就開始動了。他說他當時覺得那人真是太神奇了,好想知道自己什麼時候才能做一樣的事情。真是值得回憶的熱血年代啊。
在法蘭克福到香港的飛機上敲著鍵盤,此時若要對 FOSDEM 做個總結,那就是覺得自己實在太過渺小,對太多東西都還不懂,寫程式的量也實在太少了。臺灣受限於語言與地理位置,要跟上世界發展的腳步,只有充分利用 Internet,訓練英文,直接參與最上游的互動以及吸取資訊才最有效。
p.s.非認真的小心得:
- 歐洲正妹輕軟的說著法語... 很棒。
- Brussels 漂亮的不像話,不過生活費用也貴的不像話。我三天的時間花掉一萬臺幣左右,還不包括旅館錢!
- 歐洲服務業的態度很冷淡,台灣好多了。
- Lufthansa 德國航空的椅子難坐到爆炸。
[1] iPhone 是被一個升大學的男生利用暑假破解的。他把第一支破解的 iPhone 拿上網拍賣,最後交換了一台 Nissan 350Z 和好幾隻全新的 iPhone,還有幾間公司的顧問職務。很不錯吧?他在硬體方面先破解之後,軟體方面就簡單很多,最後由社群力量做出 installer,一個可以自由安裝各種社群開發程式的軟體。有 installer 之後,iPhone 可是比原來有趣多了。
2007年9月20日
2007年8月17日
誰會寫程式?
Computer science 相關科系的學生一畢業進入業界,要不了多久,聰明的孩子們就會發現學術研究跟實做的不同。例如不懂詳細 SMTP 或是 HTTP 並不代表你在 computer science 的領域學得不好,只表示截至目前為止還沒有用到這些東西的必要。又譬如熟悉不熟悉 MFC 或是其他種種 library, framework 的用法,也是相同。
然而對於業界而言,程式設計師多半是可取代的一堆螺絲,最好是拿來就能用,所以一個才智平庸但是熟悉這些玩意的工程師往往吃香。要注意我在這裡所指的平庸是相當嚴格的。那麼當你想在這領域取得一席之地,該如何瞄準目標?選擇目標就已經是個大學問了。
假定,你知道自己是平庸的。那麼瞄準各類電腦補習班(包括那些有頭有臉機構辦的)、證照等等或許是不錯的手段。在那些地方你多半只能學到技而學不到藝,那將使你成為成功的工人,但甚至達不到中級以上水準。這類的人,在台灣 MIS 相關公司最多,你會注意到這些公司多半執行軟體專案,掛許多 CMMI、證照之類,喜歡宣傳各類成功案例等等。他們喜歡告訴你他們如何專業、如何以客為尊,如何採用最新的技術達成需求等等。當你越來越熟練,你會在這類公司佔有一席之地,並且開始懂得各種政治技巧來保衛自己的地盤。
假定是中才以上呢?這裡定義的中才,是至少你要可以直接閱讀 RFC, datasheet 等等英文資訊,並且有能力自行消化、寫出程式。對你來說,取得經驗是最佳競爭力。不要管什麼學理了,往那冷僻的技術細節鑽就對啦。會寫 driver、懂詳細的 protocol、實務上對業界常用的工具熟悉,可以用毫不精巧的手段達成目的... 又或者你處在比較高階的軟體領域,那就比較危險,表示你至少要熟讀 design pattern/UML/一種以上的專案開發模式(extreme programming? RUP?),並且可以毫不猶豫的運用其中詞語。達成以上,那麼恭喜你,你的工作非常安全,而且只要具有正常人格,很快你就可以升經理讓新進工程師覺得莫測高深,或是轉換跑道嚇嚇那些以為你不懂的無知研發人員。
那,你會問,要如何才能成為精英呢?你能使用的工具應該包括 Lex & Yacc、能讀懂 assembly、知道 functional programming 是什麼意思、熟用一種以上 scripting language 並真正理解部份 compiler/os 內部運作。除此之外,你必須謹記所受過的一切學術訓練,那有助於你在最短時間內猜測/理解一個新的規格/問題,並且將你已有的技能集恰當的運用於其上。你應該會擁有自己的工具集,並且善用他們,以其他工程師無法理解的速度產生正確程式。
理解自己身處的位置只是容易(或者有些殘酷)的部份。困難的是如何接受並執行自己該做的事。
然而對於業界而言,程式設計師多半是可取代的一堆螺絲,最好是拿來就能用,所以一個才智平庸但是熟悉這些玩意的工程師往往吃香。要注意我在這裡所指的平庸是相當嚴格的。那麼當你想在這領域取得一席之地,該如何瞄準目標?選擇目標就已經是個大學問了。
假定,你知道自己是平庸的。那麼瞄準各類電腦補習班(包括那些有頭有臉機構辦的)、證照等等或許是不錯的手段。在那些地方你多半只能學到技而學不到藝,那將使你成為成功的工人,但甚至達不到中級以上水準。這類的人,在台灣 MIS 相關公司最多,你會注意到這些公司多半執行軟體專案,掛許多 CMMI、證照之類,喜歡宣傳各類成功案例等等。他們喜歡告訴你他們如何專業、如何以客為尊,如何採用最新的技術達成需求等等。當你越來越熟練,你會在這類公司佔有一席之地,並且開始懂得各種政治技巧來保衛自己的地盤。
假定是中才以上呢?這裡定義的中才,是至少你要可以直接閱讀 RFC, datasheet 等等英文資訊,並且有能力自行消化、寫出程式。對你來說,取得經驗是最佳競爭力。不要管什麼學理了,往那冷僻的技術細節鑽就對啦。會寫 driver、懂詳細的 protocol、實務上對業界常用的工具熟悉,可以用毫不精巧的手段達成目的... 又或者你處在比較高階的軟體領域,那就比較危險,表示你至少要熟讀 design pattern/UML/一種以上的專案開發模式(extreme programming? RUP?),並且可以毫不猶豫的運用其中詞語。達成以上,那麼恭喜你,你的工作非常安全,而且只要具有正常人格,很快你就可以升經理讓新進工程師覺得莫測高深,或是轉換跑道嚇嚇那些以為你不懂的無知研發人員。
那,你會問,要如何才能成為精英呢?你能使用的工具應該包括 Lex & Yacc、能讀懂 assembly、知道 functional programming 是什麼意思、熟用一種以上 scripting language 並真正理解部份 compiler/os 內部運作。除此之外,你必須謹記所受過的一切學術訓練,那有助於你在最短時間內猜測/理解一個新的規格/問題,並且將你已有的技能集恰當的運用於其上。你應該會擁有自己的工具集,並且善用他們,以其他工程師無法理解的速度產生正確程式。
理解自己身處的位置只是容易(或者有些殘酷)的部份。困難的是如何接受並執行自己該做的事。
python: import this!
I have just found out a cool easter egg in python:
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
2007年8月15日
Unix/Windows 通用 print server
知道怎麼做的話,其實要架是很簡單的。但問題是之前從未在 Linux 下處理列印過,真正做起來,走了許多冤枉路。過程也就不提了,總之,最終成果是將原有的一台 Debian server 接上 usb 連結的雷射印表機,在區域網路上同時有 Linux/Windows 的情況下列印。
採取的架構是 cups + samba. CUPS 是 the common unix printing system,可以直接分享列印服務給其他 Unix like 的機器。而與 Windows 的接軌,就要靠 samba。首先必須先讓印表機在 Linux 下正常動作。就我的例子而言, HP LaserJet 1000 需要由網路上下載 open source 的驅動程式,並且另行下載 firmware,搭配 udev 或者是 hotplug,讓主機在印表機連結的時候,自動上傳 firmware,印表機才能正確工作。
安裝 HP LaserJet 1000
先不要接上印表機。LaserJet 1000 需要的驅動程式名為 foo2zjs,頗為好裝,照著網頁做就沒問題。裝完後印表機先接好電,再連結 USB。用 usb_printerid,後頭接 device 位置,通常是 /dev/usb/lp0,來確認 firmware 有沒有正確的 upload 了。FWVER 後頭有接版本名稱就是正常。
若有問題,可以看一下 /etc/hotplug/usb/hplj1000 這個 script。我把 DEV=""這行 mark 掉,省去自動搜尋的麻煩。
CUPS 設定
啟動 CUPS,這東西的方便之處就是直接連結 http://localhost:631/ 就可以進入網頁操作介面,可是我的 server 只有文字介面,用 lynx 看又有點麻煩,所以還先進去 /etc/cups/cupsd.conf 改了一下設定檔,讓其他台也可以連。改掉的內容包括 Listen 127.0.0.1:631 改成 Listen 0.0.0.0:631,以及全部設 Allow all 諸如此類。進入 admin 介面後,應該可以看到印表機已經自動偵測到了,直接加入即可。basic server settings 裡頭有些預設的設定可以直接勾選,我選了 Share published printers connected to this system 還有 Allow remote administration,允許所有在 LAN 上的使用者都可以直接列印。
Linux Client 設定
把 cups 網頁介面上某印表機的網址複製,然後開頭改成 ipp,就是這台印表機的分享位置。例如我的是 ipp://192.168.1.1:631/printers/hp_LaserJet_1000_USB_1,直接加入即可。
Samba 設定
在此我碰到最大的問題是 Windows 上的使用者名稱與 Linux 上不相同,我不想一個個輸入 smbpasswd 中,而且還有密碼同步問題,可見不是正確解法。最後才發現有 map to guest = Bad User 這種設法,亦即當使用者輸入的帳號在系統中不存在,就當成 guest。正是我要的功能。目前 smb.conf 設定如下:
採取的架構是 cups + samba. CUPS 是 the common unix printing system,可以直接分享列印服務給其他 Unix like 的機器。而與 Windows 的接軌,就要靠 samba。首先必須先讓印表機在 Linux 下正常動作。就我的例子而言, HP LaserJet 1000 需要由網路上下載 open source 的驅動程式,並且另行下載 firmware,搭配 udev 或者是 hotplug,讓主機在印表機連結的時候,自動上傳 firmware,印表機才能正確工作。
安裝 HP LaserJet 1000
先不要接上印表機。LaserJet 1000 需要的驅動程式名為 foo2zjs,頗為好裝,照著網頁做就沒問題。裝完後印表機先接好電,再連結 USB。用 usb_printerid,後頭接 device 位置,通常是 /dev/usb/lp0,來確認 firmware 有沒有正確的 upload 了。FWVER 後頭有接版本名稱就是正常。
若有問題,可以看一下 /etc/hotplug/usb/hplj1000 這個 script。我把 DEV=""這行 mark 掉,省去自動搜尋的麻煩。
CUPS 設定
啟動 CUPS,這東西的方便之處就是直接連結 http://localhost:631/ 就可以進入網頁操作介面,可是我的 server 只有文字介面,用 lynx 看又有點麻煩,所以還先進去 /etc/cups/cupsd.conf 改了一下設定檔,讓其他台也可以連。改掉的內容包括 Listen 127.0.0.1:631 改成 Listen 0.0.0.0:631,以及全部設 Allow all 諸如此類。進入 admin 介面後,應該可以看到印表機已經自動偵測到了,直接加入即可。basic server settings 裡頭有些預設的設定可以直接勾選,我選了 Share published printers connected to this system 還有 Allow remote administration,允許所有在 LAN 上的使用者都可以直接列印。
Linux Client 設定
把 cups 網頁介面上某印表機的網址複製,然後開頭改成 ipp,就是這台印表機的分享位置。例如我的是 ipp://192.168.1.1:631/printers/hp_LaserJet_1000_USB_1,直接加入即可。
Samba 設定
在此我碰到最大的問題是 Windows 上的使用者名稱與 Linux 上不相同,我不想一個個輸入 smbpasswd 中,而且還有密碼同步問題,可見不是正確解法。最後才發現有 map to guest = Bad User 這種設法,亦即當使用者輸入的帳號在系統中不存在,就當成 guest。正是我要的功能。目前 smb.conf 設定如下:
設完以後重新啟動 samba,應該可以從任一 Windows client 那邊看到分享出來的印表機。接下來若某使用者 foo 在 Linux 端是 lpadmin 群組的一份子,那在 Windows 下用 foo 連結印表機後,選內容 -> 進階 -> 新增驅動程式,另外在內容的其他頁面中,也可以新增其他作業系統例如 Win NT, 98 等等用的驅動程式,如此可以讓 Windows client 連結後自動下載安裝,不需要另外尋找。這部份功能我還沒確實試出,但應該是可行的。
[global]
workgroup = MSHOME
server string = %h server
map to guest = Bad User
log level = 1
syslog = 0
log file = /var/log/samba/log.%m
max log size = 1000
ldap ssl = no
panic action = /usr/share/samba/panic-action %d
invalid users = root
printer admin = @lpadmin
create mask = 0644
printing = cups
print command =
lpq command = %p
lprm command =
[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No
[printers]
comment = Generic dot-matrix printer entry
path = /var/spool/samba
guest ok = Yes
printable = Yes
use client driver = Yes
browseable = No
[print$]
comment = Printer Drivers
path = /var/lib/samba/printers
write list = @lpadmin
guest ok = Yes
2007年7月4日
acpid 與 notebook 的特殊按鍵
經常會大家很講究某 Linux distribution 有沒有 out-of-box 就支援某某 notebook,其實這很不容易的。要想想廠商都已經特別裝好、設定好了 Windows 才拿出來賣,但 Linux 經常可沒先裝好。如果從一台沒裝好的 Notebook 自己拿原版 Windows 光碟開始裝,也是要下載很多東西,一點也不容易啊。
目前的 distribution 設計都進步很多了,各層分工合作,就算有特殊鍵沒支援的,要改成支援也是很簡單。這裡大致介紹一下怎樣讓特殊按鍵們產生作用。先說明原理:特殊鍵一般都是會產生 acpi event,但這個 event 往往系統認不得。這裡 acpid 扮演的角色就是把這個認不得的 event 利用呼叫 acpi_fakekey 的方式變成假裝按了一個鍵,而這個鍵系統認得,就可以產生相對應功能啦。
實例說明:我的 volume-down 降低音量鍵沒用,那先跑 acpi_listen,然後按 volume-down 一下,看看出來的結果。以下是我的 notebook 上出現的:
目前的 distribution 設計都進步很多了,各層分工合作,就算有特殊鍵沒支援的,要改成支援也是很簡單。這裡大致介紹一下怎樣讓特殊按鍵們產生作用。先說明原理:特殊鍵一般都是會產生 acpi event,但這個 event 往往系統認不得。這裡 acpid 扮演的角色就是把這個認不得的 event 利用呼叫 acpi_fakekey 的方式變成假裝按了一個鍵,而這個鍵系統認得,就可以產生相對應功能啦。
實例說明:我的 volume-down 降低音量鍵沒用,那先跑 acpi_listen,然後按 volume-down 一下,看看出來的結果。以下是我的 notebook 上出現的:
john@Portege-2000:~$ acpi_listen嗯嗯,可見按下跟放開都會產生事件,我們這裡抓那個放開的事件就好。畢竟按下了才有可能發生放開嘛。然後把這個事件加到 /etc/acpi/events 底下,新增一個檔案 tosh-volume-down
hkey VALD 00000000 00000102
hkey VALD 00000001 00000102
# /etc/acpi/events/tosh-volume-down這裡頭的意思是說,如果抓到了這個事件,就呼叫 /etc/acpi/voldownbtn.sh。這個 script 其實就是統一拿來降低音量的,內容為:
event=hkey VALD 00000001 00000102
action=/etc/acpi/voldownbtn.sh
#!/bin/bash其中 /usr/share/acpi-support/key-constants 就是 kernel 認得的按鍵代碼,$KEY_VOLUMEDOWN 的值是 114。所以日後每當我按了 Toshiba 自己特別的 volume-down,就會對應到 acpi_fakekey 114,等於是按下了系統認得的降低音量鍵。在新版的 gnome 中,這鍵系統會認得(也可以自訂,把他的作用換成其他的,例如升高音量? = =),所以會有漂亮的 UI 一起搭配起來,讓我看到目前的音量大小。一般說來特殊鍵也不過就那幾個,所以就算完全沒支援,也一下子就設起來啦。
. /usr/share/acpi-support/key-constants
acpi_fakekey $KEY_VOLUMEDOWN
2007年7月3日
"Agile" Development?
If you're reading this and you're unfortunately a software developer, I do suggest you read Good Agile, Bad Agile. It has been in my bookmarks for almost an year and now I finally managed to read it. That gives me a whole different view towards the agile method.
2007年6月28日
CMClass: 微軟徵才試題 in Prolog
一開始是在 thinker 那邊偶然看到這個題目,正文如下:
永源拿了兩個不同數字...大家已經做出了 Python 跟 C 的解法,但這題目感覺起來可以用 Prolog 解,自從修完 programming language 之後就再也沒碰過了(還被教授用一個很混蛋的理由當掉),正好複習一下。
這兩個數字分別大於 1 ,也分別小於 50
永源只把這兩個數字的乘積告訴了亞譚 ...
永源再只把這兩個數字的和告訴了明歆 ...
永源問, 這兩個數字是什麼 ?
以下是亞譚和明歆的對話... (小強, 小毛, 小燕在旁坐陪)
亞譚: 我不知道這兩個數字是什麼!
明歆: 但我也還是不知道這兩個數字是什麼!
亞譚: 喔!那我知道那兩個數字是什麼了 !
明歆: 喔!那我也知道那兩個數字是什麼了 !
突然間 ....聰明的三位陪客同時也說: 我們也知道那兩個數字是什麼了 !
聰明的你, 告訴我....那兩個數字是什麼 ?
solution(Set) :-餵給 Prolog 之後打
stage3(Set).
values(Set, S) :-
findall(V, (member(X, S), V is X), Set),
sort0(Set).
duplicate_values(Set, S) :-
values(Values, S),
findall(X, (member(X, Values), sublist([X,X], Values)), Set),
sort(Set).
single_values(Set, S) :-
values(Values, S),
findall(X, (member(X, Values), \+ sublist([X,X], Values)), Set),
sort(Set).
range(Set) :-
findall(I, for(I, 2, 49), Set).
solution_space(Set) :-
range(Range),
findall([A,B], (member(A, Range), member(B, Range), A < B), Set).
stage1(Set) :-
solution_space(S),
findall(A*B, member([A,B], S), S1),
duplicate_values(Values, S1),
findall([A,B], (member([A,B], S), V is A*B, member(V, Values)), Set).
stage2(Set) :-
stage1(S),
findall(A+B, member([A,B], S), S1),
duplicate_values(Values, S1),
findall([A,B], (member([A,B], S), V is A+B, member(V, Values)), Set).
stage3(Set) :-
stage2(S),
findall(A*B, member([A,B], S), S1),
single_values(Values, S1),
findall([A,B], (member([A,B], S), V is A*B, member(V, Values)), Set).
?- solution(Set). 就可以算出答案啦。
2007年6月20日
Debian lenny 上 OpenOffice 中文顯示問題解決
不知從哪一次 update 之後,我的 Debian lenny 上 OpenOffice 就沒法顯示中文了,一進去原本的介面就全是亂碼。火大了把 zh-tw 的 l10n 移除,用英文介面也撐了好一陣子,直到我今天第一次要打中文為止。不光是介面,原來直接輸入的中文也會變方格字,這可不行啊。
翻來翻去找了一陣子,終於發現原來它預設的中日韓顯示字型是 Andale Sans UI,在我的系統上這字型根本不存在,當然就顯示不出啦。解決法是先用
OpenOffice 真是傷腦筋哪,這樣下去怎能取代 MS Office 咧?
翻來翻去找了一陣子,終於發現原來它預設的中日韓顯示字型是 Andale Sans UI,在我的系統上這字型根本不存在,當然就顯示不出啦。解決法是先用
LANG=C openoffice進去看到英文介面,然後到 Tools -> Options -> OpenOffice.org -> Fonts ,把 Andale Sans UI 這個鳥字型替換成隨便一個 true type 的中文字型就好啦。
OpenOffice 真是傷腦筋哪,這樣下去怎能取代 MS Office 咧?
2007年6月14日
Joost on Debian lenny
雖然已經出來有段時間了,還是簡介一下:
Joost 是真正的網路電視,可以讓人免費觀看高畫質、全螢幕的影音,而且有許多頻道可以切換、選節目、隨時可以暫停、往前往後移動。能夠做到高畫質的原因是因為背後採用了 p2p 分散式技術,讓使用者互相傳來傳去,所以頻寬需求不像集中式的 YouTube 之類那麼恐怖。這毋庸置疑的會是另一次風暴,創始人之一正是之前引起風潮的 Skype 作者。目前仍在 beta 測試階段,不開放給所有人下載,若有興趣想試試的,請留下您的 email 給我。
這麼好玩的東西讓我在工作室的時候也想看,偏偏那邊沒有 Windows,於是我當然就想把它裝到 Linux 上啦...(以下火星文出現)
基本上參考 HOWTO: Joost (with sound) 就可以搞定,我採用的是第二種方法,用 wine.git 自己 compile 一個版本來跑,直接用 debian 附的 wine 不行。值得注意的是 libasound2-dev, fontforge, freeglut-dev 要裝起來,不然 ./configure 出來會自動 disable 掉這些功能。
成功裝好 Joost 以後,一跑就狂當,只好執行 winecfg 調來調去。首先要注意 Windows 版本要調到 Windows XP 不然根本進不去。其他設定 audio 是用 alsa,graphic 用 virtual desktop ,解析度 800x600,let windows manager manage 那個選項關掉。跑起來很順,附上辣妹圖為證:
2007年6月7日
FizzBuzz?!
今早看到一篇文章,說來應徵的 200 個工程師中有 199 個不會寫 FizzBuzz 程式。需求是這樣的:
印出 1 到 100,但如果是 3 的倍數就印 Fizz,如果是 5 的倍數就印 Buzz,如果同時是 3 和 5 的倍數就印 FizzBuzz。簡單到近乎腦殘對吧?但好笑的是就連自認會解的 programmers 在留下的 comments 裡面自己都寫錯。最常見的解法當然是:
for i in xrange(1,101):然而如果要把 Fizz 改成 Bizz,我們就需要改兩個字串,那如果這兩個相距很遠或是其他甚麼原因,就容易漏掉,違反 DRY (Do Not Repeat Yourself) 原則。結果想要改進的人就修成這樣:
if i%15 == 0:
print "FizzBuzz"
elif i%3 == 0:
print "Fizz"
elif i%5 == 0:
print "Buzz"
else:
print i
for num in range(1, 101):結果在 15 時,只會印 bizz 而印不出 buzz 就錯掉啦。目前看到我覺得最帥的寫法是:
if not num % 3:
print "bizz"
elif not num % 5:
print "buzz"
else:
print num
for i in range(1, 100) :用上了 binary 的想法在裡頭,很有 fu 喔。我自己的版本是這樣:
fmt = [i, "fizz", "buzz", "fizz buzz"]
print fmt[(i % 3 == 0) + 2 * (i % 5 == 0)]
for i in xrange(1,101):但我覺得速度應該不快。Anyway 實務上我覺得最好的版本是第一版啦,重複的問題可以用常數定義的方式解掉,如下:
s = []
if i%3 == 0:
s.append("Fizz")
if i%5 == 0:
s.append("Buzz")
print "".join(s) or i
three = "Fizz"這樣直接列出來快而且也易懂。有沒有讀者想玩一下啊? ;-)
five = "Buzz"
for i in xrange(1,101):
if i%15 == 0:
print "".join((three, five))
elif i%3 == 0:
print three
elif i%5 == 0:
print five
else:
print i
訂閱:
文章
(
Atom
)


