2007年8月31日

A Fork.

其實是老早就想做的事情。總要有些觸發去真的執行。

一向認為軟體與其他各部份的自己,是不可分割的整體。既是我的 blog,就該完整呈現。然而最終我理解到,由於呈現介面的不完美,讀者無法選擇,只能看到他們並不感興趣的部份。因此必須尋找合理的方式,來克服這種痛苦。

日後,這裡所有的內容將沒有程式碼、不再牽涉技術領域,就算有,也僅是科技資訊,以一般詞句表達。軟體相關文章,將發表在其他網站,與本站互相連結。

我仍然認為個人發表平台,應可集中於一處存取,作為巨觀呈現。現時無法做到,是因為呈現方式的不完美,也就是軟體的不完美。在找到解決方式之前,自我分割,似乎是可行的暫時解法。

2007年8月26日

怎麼大家都變成演藝人員了?

說也奇怪,最近相關的人出片越來越多,現在還加上我親愛的老友皮博士(因為以後會很紅所以要先諂媚)繼出唱片後,狠狠的出現在報紙上大幅報導,帥氣的照片加上經紀人簽約,即將成為金城武第二(對不起我實在忍不住要寫出來...),實在太強了啊!建議大家想進演藝圈的可以來認識我,大概我莫名的有這種幫朋友運勢,當然也要像他們一樣努力才行喔!

是不是該強調年輕貌美的女性特別歡迎呢?還是不要好了。

2007年8月19日

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 內部運作。除此之外,你必須謹記所受過的一切學術訓練,那有助於你在最短時間內猜測/理解一個新的規格/問題,並且將你已有的技能集恰當的運用於其上。你應該會擁有自己的工具集,並且善用他們,以其他工程師無法理解的速度產生正確程式。

理解自己身處的位置只是容易(或者有些殘酷)的部份。困難的是如何接受並執行自己該做的事。

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 設定如下:

[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
設完以後重新啟動 samba,應該可以從任一 Windows client 那邊看到分享出來的印表機。接下來若某使用者 foo 在 Linux 端是 lpadmin 群組的一份子,那在 Windows 下用 foo 連結印表機後,選內容 -> 進階 -> 新增驅動程式,另外在內容的其他頁面中,也可以新增其他作業系統例如 Win NT, 98 等等用的驅動程式,如此可以讓 Windows client 連結後自動下載安裝,不需要另外尋找。這部份功能我還沒確實試出,但應該是可行的。