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 連結後自動下載安裝,不需要另外尋找。這部份功能我還沒確實試出,但應該是可行的。

2007年7月25日

@openmoko.com

很快的更新一下我的現況。最近太忙,連寫 blog 的閒情都沒。

從上週開始回到職場,在 openmoko.com 工作。公司到目前尚未跑完登記程序,也就是還沒成立。core team 包括 Sean Moss-Pultz, Harald 'LaForge' Welte and Michael ‘Mickey’ Lauer. 台灣這邊則包括 jserv, OLV (freetype developer)等人。

略查一下的話可以發現這是非常恐怖的團隊,例如 LaForge 是 netfilter/iptables 的主要作者,Mickey 則是 OpenEmbedded 創始者。最驚人也最令人慚愧的是,以上提到的這些開發者,除了 Mickey 以外,全部比我年輕。所謂歲月不饒人,我在吃喝玩樂的時候,很多人可是認真的在研究呢。總之是間非常有趣的公司,靜觀其變。

另一件事情,之前拿來當作工作室的安東街公寓,原是鐵路局員工宿舍,現在確定遲早要收回了。另找了間套房租下來,現在得處理搬家事務,講起來真是多如牛毛。總之變動可以視為常態,塵埃落定之後,且看這一波人生轉折會有甚麼結果吧。

2007年7月11日

幡然有悟

不知為何,這陣子以來,心情持續感到一種平靜。莫名的就出了這標題。

其實是不應該平靜的。出租的房子最近問題一直很多,當年貿然無知的找人裝潢,又沒有監工,現在問題就一一冒出,還得面對敷衍欺騙客戶的水電工人。財務麻煩不小,畢竟現在的生活方式也不過是把債務延後用以維持生活罷了。

我想原因應該是最近做的一個案子。說真的並不是很難的工作,雖說有部分不熟悉,但有原先的程式碼可參考,評估一下也就接了。似乎案主挺高興的,應該是燙手山芋,時間又趕。真的做下去,果然發現問題很多,規格不明、變數多、文件與資料都欠奉,但總之最後都找到方法繞過問題。需要對方提供資料所以卡住的時候,就先切換到不會卡住的地方繼續做。

我發現,我似乎自動地在做著一些以前會讓我不滿的事情。工作態度以及心態上似乎都微妙地改變了。這一年多來的經歷,大概是我人生最缺錢最困苦的時期,但從那中間,我好像領悟了些甚麼,思考的方式不自覺地延著與一年前不同的迴路在運作著。

自己最大的問題,是我總是從錯誤中學習,而非直接由別人經驗學到。世上可犯的錯誤很多,有些錯誤的後果是擔負不起的。至今為此我已經付出很大代價。

但好處是,一旦我學到甚麼,最終修正到了正途,便總有莫名的篤定,似乎知道繼續走就對了。對人生,我從來不是很講邏輯,總是憑著感覺任性的前進。也許這次的經驗讓我感到,還是有些能力可以運用,只是要找出適合的場域。很奇怪的我並不擔心,時機總會來到,若永遠沒有,也是命定,但求無愧於心。

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 上出現的:
john@Portege-2000:~$ acpi_listen 
hkey VALD 00000000 00000102
hkey VALD 00000001 00000102
嗯嗯,可見按下跟放開都會產生事件,我們這裡抓那個放開的事件就好。畢竟按下了才有可能發生放開嘛。然後把這個事件加到 /etc/acpi/events 底下,新增一個檔案 tosh-volume-down
# /etc/acpi/events/tosh-volume-down

event=hkey VALD 00000001 00000102
action=/etc/acpi/voldownbtn.sh
這裡頭的意思是說,如果抓到了這個事件,就呼叫 /etc/acpi/voldownbtn.sh。這個 script 其實就是統一拿來降低音量的,內容為:
#!/bin/bash
. /usr/share/acpi-support/key-constants
acpi_fakekey $KEY_VOLUMEDOWN
其中 /usr/share/acpi-support/key-constants 就是 kernel 認得的按鍵代碼,$KEY_VOLUMEDOWN 的值是 114。所以日後每當我按了 Toshiba 自己特別的 volume-down,就會對應到 acpi_fakekey 114,等於是按下了系統認得的降低音量鍵。在新版的 gnome 中,這鍵系統會認得(也可以自訂,把他的作用換成其他的,例如升高音量? = =),所以會有漂亮的 UI 一起搭配起來,讓我看到目前的音量大小。一般說來特殊鍵也不過就那幾個,所以就算完全沒支援,也一下子就設起來啦。

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.