2012年1月26日 星期四

FreeBSD 單機使用光世代多個 IP

跟中華電信申請光世代網路,會有八個 public ip。八個動態IP 或是一個固定+七個動態IP。一台電腦用一個 IP,總覺得剩下的放著不用有點浪費…所以我嘗試一些設定方式希望能把剩下的 IP 拿來用。

小知識
setfib(1)
FreeBSD 自 7.1 開始,支援 multiple routing table。只要在 kernel config 裡加一行
options         ROUTETABLES=16          # max 16. 1 is back compatible.
 之後在執行程式前加上 setfib N 就能指定使用第 N 個 routing table (預設是 0)。譬如
$ setfib 1 route add default 192.168.1.1
$ setfib 1 netstat -rn
使用 setfib 命令不需 root 權限。

光世代 VDSL modem
從網路上可以找到許多教學,還有 admin default 帳號密碼。進入 http://192.168.1.1/ 管理介面發現可以動手設定的東西還不少。
(比較新的 modem 預設開啟無線網路,也設好了 modem 撥號+DHCP server。)
我用的這台型號是 ZyXEL VDSL2 P874。


1. 開多個 PPP 連線 (fail)
用光世代上網有兩種方式,一是從電腦 dial PPPoE,一是 VDSL modem 撥號再從電腦 DHCP。兩種方式可以共存。
我原本就是 dial PPPoE 上網的,因此直覺是能不能 dial 多個。將原本設定檔整段複製一份,device 從 re0 改成 re1 (我有兩張網路卡),但不知道為什麼不成功。

2. 一個 PPP 連線一個 DHCP
這個方式可以很簡單的使用兩個 IP。

第二個 IP 就用 dhcp 拿到。要注意 dhcp 跟 ppp 都會設 default gateway,不要互相蓋到了。可以寫 dhclient config 或 script 解決;一個簡單的方法是用 setfib 跑 dhclient,這樣剛好 gateway 設定分開設在不同的 routing table 上。

因為 ppp (public ip)跟 dhcp 的 ip (192.168.1.x)在不同的網段,所以只要 setfib 就能選用不同的 gateway,自然連出去的 ip 也就不同。也就是說
$ w3m http://www.whatismyip.com # 是用第一個 ip
$ setfib 1 w3m http://www.whatismyip.com # 是用第二個 ip
其實也不一定要用 DHCP,只要是 192.168.1.0/24 的 ip,gateway 設 192.168.1.1就會走 modem 自己撥號拿到的 ip 出去。

3. Modem dial PPPoE 兩次
延續先前的設定。在 modem 的 web 管理介面中,
Advanced Setup -> WAN 裡面可以新增 PPPoE 的連線,讓 modem 自己多撥幾個 IP 來。現在多加一組就好。假設新加的 interface 叫做 ppp1_4。
Advanced Setup -> LAN 裡面可以勾選,增加第二組 LAN IP,譬如 192.168.3.1。
Advanced Setup -> Routing -> Policy Routing 裡面可以設定符合某些條件的連線使用不同的 routing。這裡設定 192.168.3.0/24 走 ppp1_4。

在 FreeBSD 這邊, ifconfig alias 一個 192.168.3.x 的 IP, gateway 設 192.168.3.1 (可以用 setfib 2 設在第三個 routing table 上)。
$ setfib 2 w3m http://www.whatismyip.com 會用第三個 ip

4. Modem dial PPPoE 多次
以下內容我還沒試過。
在 modem 的 web 管理介面中新增 WAN 更多組 PPPoE 連線。
因為沒辦法新增更多 LAN ip,所以只能讓 FreeBSD 這邊的 ip 用相同的網段、相同的 gateway。譬如 192.168.1.2, 192.168.1.3, etc.
Policy Routing 就設 192.168.1.2/32 走 ppp1_5,192.168.1.3/32 走 ppp1_6…依此類推。

比較麻煩的是,都是相同的網段相同的 gateway,FreeBSD 上如何指定出去的 IP。
a. 如果程式是自己寫的,可以 bind socket 到指定的 address。也許可以用 LD_PRELOAD 幫別人寫的程式 bind,我猜這個方法不是每個程式都能成功。
b.  jail 可以不同 jail 使用不同的 ip。我覺得這很可行,只是要管理及使用 jail 稍麻煩一點。
c. 可能可以用 ipfw 或 pf 做 policy routing,以 user 或 group 當條件來 rewrite。我跟 pf 不熟,還試不出來。

其他
a. 我一開始想改 modem admin 帳號(cht) 的密碼,但不知為何改了之後並沒有完全生效 --- 有時要輸入我改的密碼,有時要輸入預設密碼,相當困擾,於是我又改回去。
b. modem 有些設定 save 之後去改其他東西,回頭來看竟然發現之前改的設定消失了,只好重改一次。有時設定要過好久才生效。於是我在測試時,就很難了解到底是我設錯還是 modem 發生什麼怪事。
c. 我還曾發現我連出去的 ip 不是 dial PPPoE 拿到的 ip,相當神秘。
d. modem 裡面預設就有一組 PPPoE 帳號密碼,但那組帳號不是我的 hinet 帳號。不知道這代表什麼。

2011年8月27日 星期六

漫談 nonogram

我本來想寫兩篇文章,一篇寫我 survey nonogram 的心得,一篇寫我自己的 nonogram solver 用到的演算法跟技巧。後來想想,決定先寫這篇一般性的介紹。

什麼是 nonogram
wikipedia 這張圖應該就很清楚了。nonogram 是個單人用紙筆玩的邏輯遊戲,題目是一個 m*n 大小的方格及左邊跟上面的數字,遊戲目的是根據這些數字提示,解出中間的圖形來。數字表示黑色色塊的數量,譬如第五橫列的 3 3 4 表示那一列中,由左至右有連續 3 個黑色,之後又有 3 個黑色,之後又有 4 個黑色。連續的黑色色塊之間至少有一個白色隔開。



很容易能理解,nonogram 出題很簡單,隨便畫出中間的圖,算出旁邊的數字就是一題,但 nonogram 的題目隨便出的話,很容易有不止一組解,也很可能難以解出。就像 sudoku 一樣,人們在設計 nonogram 題目時,常會要求要能夠用邏輯推理解題,而且只有唯一解才是好題目。
Nonogram 這種 puzzle 似乎沒有統一的名字,只有各公司給的產品名稱,因為商標的關係,很多公司推出 nonogram 的遊戲時會另外再取名字。因此 nonogram 有超過十幾種稱呼,除了 nonogram 之外,常見的稱呼還有 Griddler、Picross、Paint by Numbers、甚至有的人直接用 "Japanese Puzzles" 來稱呼 nonogram。nonogram 也沒有統一的中文譯名。



相似或相關的問題
Nonogram 是黑白、2D、矩形的盤面。有許多類似的 puzzle 是用一樣的玩法規則,但加一些變化。譬如變成彩色(Picross)、變成3D(Picross 3D)、或變成六角形(Triddlers)。也有一種玩法是數字提示只給總合,不像 nonogram 會給出每一段的長度。
值得一提的是最後這種變形,學術上叫做 Discrete Tomography,是 Tomography 的特例。Tomography 是醫學或一些應用科學實際會遇到的問題,有相當多的研究。譬如用 X 光照相,根據陰影的濃度大概可以知道穿過多厚的東西,如何從不同方向照的相片,反推出被照物體的 3D 結構。



nonogram 的人類解法
一般的解法都是一次以一直行或一橫列,只看該行或該列,利用數字提示加上已知部分的黑或白,通過邏輯推理求出更多的色塊。也可以用試誤法、窮舉法等比較暴力的解法。會需要一次觀察多行/列才能解的題目算是難度相當高的。
很多網站的解法教學都只講了最基本的,剩下就讓人自行領略 en.wikipedia 算是把這些基本方法列得比較詳細的。很少看到網站介紹比較進階的解法,推薦 webpbn 的這篇 Advanced Puzzle Solving Techniques


nonogram 的難度
一般在報紙或書本上的 nonogram 題目,為了畫出好看的圖形、為了讓人解得出來,其實都不會太難。若是整個盤面隨機填黑白色塊,不限一定要用邏輯推理來解題,難度就會高非常多。也就是說,盤面的大小跟難度不一定有關係,雜誌上的 80x80 盤面可能很簡單,30x30的 random 盤面可能就很難,用電腦解可能要數分鐘、小時、甚至更久。
在 1996 年,有論文證明了 nonogram 是 NP-complete 問題。在該論文中,也同時證明了,如果已知 nonogram 的其中一組解,求是否有第二組解,也是 NP-complete 問題。

哪裡可以玩 nonogram
有許多網站可以玩 nonogram,其中我最推薦的是 http://webpbn.com/ 這個網站。與其他網站相比,他有這些優點:

  • 免費
  • 只要瀏覽器(javascript)就能玩,不用裝 flash 或是 java plugin
  • 遊戲操作介面良好。滑鼠左右鍵可設定,支援鍵盤快速鍵,還有 undo、redo、save,還有貼心的顏色提示(不喜歡可以關掉)。
  • 題目是人出的,而不是程式 random 出題。網站上也有 quality、difficulty 標示,還能對題目寫 comment。
在 Android/iOS 上也有 app 可以玩 nonogram,只是手機上不易操作,可能還是在 pad 之類螢幕比較大的裝置比較適合。

用程式解 nonogram
事實上網路上有不少人寫過 nonogram solver,但大多只能解簡單的題目。目前有公開程式最強的 solver 應該是 webpbn 網站作者 Jan Wolter 寫的 pbnsolve。Jan 也寫了一篇詳細的 solver survey 比較各 solver。也有一些論文在討論如何解 nonogram,我大概整理成一個列表,有空的話我會寫篇文章聊聊我看那些論文的心得。

nonogram 程式比賽
ICGATAAITCGA 這幾個單位每年都會舉辦棋牌類的電腦程式比賽,像是象棋、圍棋、西洋棋、六子棋、暗棋等,最近幾年也加入了 puzzle 項目。從 2010 年開始有 nonogram 程式的比賽。比賽方式是比賽雙方事先出好題目,交換讓對方解,解得多的獲勝。老實說我覺得用對奕的方式比較 puzzle 輸贏是很奇怪的事。不過這比賽才兩年,也許賽制、形式還會再調整。
今年六月 TCGA 辦的比賽我有參加,也許是這比賽知道的人不多,參賽者還太少,我覺得參賽的程式(包括我自己的)都還比 pbnsolve 弱很多。

2010年12月27日 星期一

Nexus S 入手感想

我從 milestone (2.1) 換用 nexus s (2.3) 不到一週的感想

列出一些我喜歡的改變:
  • contacts 可以 search 到 nickname 了, 而且中文名字不再全列在最後, 改成用漢語拼音排列, 也可以用漢語拼音 search
  • gmail 支援有顏色的 label, 切換帳號跟 folder/label 變方便了(少一次 click)
  • "管理應用程式" 拉到主 menu, 在 app list 按 option 也會出現
  • "管理應用程式" 內建最基本的 disk/process 管理功能
  • calendar 也支援 multi-account 了
  • 震動跟音量不再是分開設定了, 不用再裝 Silent Mode Jam
  • 電池電量那邊, 可以顯示電量變化的折線圖, 還有各時段各種功能的開關狀態. 可惜圖沒辦法縮放, 不然就能完全取代 JuicePlotter 了
還有一些不喜歡的, 大多是手機本身, 而不是 android 的問題:
  • 好像更耗電, 充電時間更久. 不過這我要多試幾次確定
  • 不知道是不是因為螢幕 LCD 的 rgb 排列問題, 在白色底色可以看出一點點網點, 當看小字時會感到字變毛掉/鋸齒狀, 比較難以閱讀. 我懷疑因為這樣讓我用久了覺得不舒服.
  • 沒了鍵盤, 連 trackball 都沒有, 這是要怎麼輸入密碼/玩遊戲...
  • 我不喜歡 app list: 捲動停下來時會對齊, 造成捲動長度小於 0.5 就會被拉回去一些. 而且無法拉下方 fade out 區往上捲動... 總的來說我覺得是浪費上下兩排的空間作特效.
  • Back 鍵沒有延伸到手機面板邊緣, 好處也許是比較不會誤按, 可是缺點是常常沒按到.
  • 鬧鐘 App 不見了, 改成要先進時鐘再選鬧鐘, 不知道是舊版才有還是那是 motorola 自製的.

2010年12月16日 星期四

我在用的 Android Apps

補足基本功能
  • Silent Mode Jam - 預設的來電音量跟震動是分開設定的. 當你把音量調成靜音時, 這個 app 會自動把震動打開. (update: 2.3 已經內建)
  • Battery Indicator - 狀態列預設的電池電量只有圖示, 這個 app 會另外用一個 notify icon 用數字顯示. 缺點是沒辦法取消原本的 icon.
  • Brightness Level - 一個 1x1 的 widget. 按一下就能設定螢幕亮度.
  • Handcent Sms - 簡訊程式, 比系統預設的稍好看一點.
  • No Signal Alert - 當手機沒有訊號時, notify
省電相關
  • JuiceDefender - 我希望手機時常保持網路連線(譬如每隔一段時間就 sync gmail/gtalk/reader), 但我又不想自己手動開關網路連線, 我又想省電. 如果你的需求跟我一樣, 我相當推薦這個 app. 根據這個 app 的計算, 我的使用情況, 免費版大概讓我的電池使用時間變 1.5 倍, 付費版約 2~2.5 倍. 我不知道這數字多準, 但的確可以感受到可以用更久.
  • JuicePlotter - 如果你很在意電池電量的變化, 這個 app 可以畫出電池電量對時間的折線圖, 還標示出何時開網路/GPS/螢幕/溫度. 搜集資料幾乎不會耗電(event driven, not polling), 只是畫圖並不快. (update: 2.3 內建簡化的功能)
  • APNdroid

備份
  • App List - 備分已安裝的 app list (一個文字檔) 到 SD card 上
  • AppMonster - 備分已安裝的 app 的 apk 檔到 SD card 上
  • Call Logs Backup & Restore - 把 call log 備分到 SD card 上(xml)
  • SMS Backup & Restore - 把 SMS 備分到 SD card 上(xml)

遊戲 - 我玩得不多就是了
  • Angry Birds, Angry Birds season
  • Jewels
  • Sudoku Daily - 我覺得這個 sudoku app 比其他的好. 有分很多 level, 有 undo/redo/hint, hint 很詳細還有教學. UI/操作也比較好. 如果你不是純紙筆派的, 需要或多或少(可設定)電腦輔助玩 sudoku 的話, 很推薦.

其他
  • ColorDict - 離線字典, Google Translate 線上字典
  • Divi Clock - 1x1 的 world clock widget, 支援 timezone, 免費
  • Gmail Notify Free - 當 gmail 收到符合特定條件的信, 會 notify(可設定). 免費版一個 account 只能設一個 rule. 不過可以 match label, 所以也很夠了. (gmail 預設的 notify 是有信就 notify)
  • handyCalc - 比較強的計算機, 內建單位/幣值換算功能
  • RealCalc Scientific Calculator - 比較像傳統的科學計算機
  • NewsRob - 如果有在用 google reader, 非常推薦這個 app
  • Pluroid - plurk client 我不喜歡河道, 比較喜歡條列式的方式看 plurk
  • NetCounter - 記錄每天的網路用量, 分 3G/wifi
  • rTerm - bbs client
  • ConnectBot - telnet/ssh client
  • Dropbox - sync files between windows/mac/android
  • KeepassDroid - manage password, 配合 Dropbox 使用
Google
  • Google Talk
  • Google Translate
  • Google Finance
  • Google Map Street view
  • My Maps editor by google
  • Gesture Search
  • Barcode Scanner
  • Goole Sky Map
  • Voice Search - 比預期的還要好很多
工具類
  • Compass
  • StopWatch & Timer
  • TeslaLED Flashlight
  • Voice Recorder
  • Ruler
No comments
  • aContactss
  • ActionComplete
  • AK Notepad
  • Calendar Pad
  • EasyProfiles
  • GPS Test
  • Opera Mini
  • 台北公車
  • 台灣天氣圖
  • 高速公路
  • 注音倉頡輸入法
  • 嘸蝦米輸入法

2010年2月19日 星期五

用 hugin 接合多張掃描圖檔(更新)

本文介紹如何用 hugin 接圖, 專為掃描器掃描的圖檔而寫, 而非全景圖.

這篇是前一篇的加強版. 根據 Hugin tutorial — Stitching flat scanned images 及 hugin 2009.4.0 而寫.



  1. 準備工作:

    • 先用其他軟體將 image 轉成相同方向, 同向就可以了(不一定要轉正). hugin 不認得 EXIF 旋轉 tag, 要真的轉 bitmap.
    • 若是 jpeg 檔, 我會用 jpegcrop 無失真旋轉. 並順便把多餘的部份切掉(不要切得剛剛好, 稍留幾個 pixel, 等最後完成時再切)



  2. File->Preferences 設定

    • Control Points Editor 裡, 把 "Enable rotation search" 勾起來. start/stop angle 設小一點, 譬如 5, step 設小一點, 譬如 6. 若要接全景圖時記得調回來比較好.


  3. 在 "Images" tab

    1. "Add individual images...", 載入全部的 image, HFOV 填 10.
    2. (hugin 2009.4.0 沒附 autopano-sift-c.exe, 要自己去抓或自己 compile) 按 "create control points", 讓程式自動產生 control point. 若是掃描文件, 自動產生的效果並不好, 可以略過這步

    3. 對比較中間, 或比較正的那張圖, 按 "Anchor this image for position". 對亮度比較對的圖按 "Anchor this image for exposure". (預設值是第一張).


  4. 在 "Camera and Lens" tab

    1. 在每張 image 上按 new lens, 確定 "Lens no." 都不一樣
    2. 確定每張的 Lens type 都是 "Normal (rectilinear)"
    3. 把每張圖的 view(v), horizontal shift(d), vertical shift(e) 的 link 都取消不要勾選



  5. 在 "Control Points" tab

    1. 可以自己增減 control points, 要幾個才夠我也不知道, 我的習慣是大約 10 個
    2. 我習慣 zoom 50%, 比較容易看
    3. 加 control point 時, 可以用滑鼠左鍵拖拉, 看好位置再放開左鍵
    4. "auto fine-tune" 有勾起來或自己按 "Fine-tune", 程式會自動找滑鼠點的附近最合的點, 因此也可不用點很準.
    5. 左右圖各選一點後, 確定沒問題可以按 "Add" 新增, (或是在圖上按滑鼠右鍵)
    6. 若圖都是斜的, 圖中又有水平或垂直線, 可以加 control point, mode 選 vertical line 或 horizontal line.


  6. 在 "Optimizer" tab

    1. 選 custom parameter
    2. 勾 reference image 以外的 r, v, d, e
    3. 若 reference image 也是歪的, 把 r 也勾起來
    4. 其他不要勾
    5. 按 "Optimize now!", "Apply". 注意一下數值, 若太大的話回到 Control points tab 增刪調整.



  7. 在 "Stitcher" tab

    1. projection(f) 選 "Rectilinear"
    2. 按 "calculate field of view", "calculate optimal size".
    3. output 選 jpeg, quality 90
    4. ctrl-shift-p fast preview

      • 若歪一邊, 選 "Drag" 調整. 可以按住 Shift, 再 drag, 比較容易水平或垂直調整
      • 調整完回到 Stitcher tab 按 "calculate field of view", "calculate optimal size". 然後重新 fast preview
      • 若 image 還是超出範圍, 只好自己手動填值
      • 若 image 比範圍小, 可以選 "Crop" 切掉超出去的部份

    5. "Stitch now"



  8. 存檔, 方便以後修改, (也許將來 hugin 新版重做效果更好?)



簡單解釋參數:
  1. yaw(y), pitch(p), roll(r): yaw 是左右偏角, pitch 是仰角, roll 是旋轉. 細節跟圖請參考Yaw, pitch, and roll. 由於掃描器都是垂直文件掃描, yaw 跟 pitch 都是 0.
  2. view(v): 相當於縮放比例
  3. x shift(d), y shift(e): 直跟橫方向的平移量


注意事項:

  • hugin 有些地方 (nona.exe, enblend.exe) 對中文檔名的處理有問題, 當 "Stitch now" 真的開始接圖時, 可能會出現檔案無法開啟的錯誤訊息. 為了避免剛辛苦工作要重來, 先存 project 檔, 用文字編輯器開 .pto 把裡頭的檔名改掉就好.

2008年12月5日 星期五

用 hugin 接合多張掃描圖檔

不知道用什麼 keyword 比較適當, search 找到的大多是接合全景圖的方案. 若是全景接合, autostitch 簡單易用, 效果又不錯.

若是一般的平面圖檔接合, 目前只有找到 hugin 比較合用. Hugin tutorial — Stitching flat scanned images 這篇有教學, 配合 0.7.0 版的 hugin, 我的經驗跟步驟如下:
  1. 先用其他軟體將 image 轉成相同方向, 否則沒辦法讓程式自動產生 control point. 同向就可以了, 不用轉正.
  2. 在 image tab, add individual images, 載入全部的 image, HFOV 填 10.
  3. 按 "create control points", 讓程式自動產生 control point
  4. 簡單看一下 control point, 若是掃描文件, 比較容易有錯, delete 掉錯的點
  5. 如果圖都是歪的, 自己增加 control point, type 選 horizontal 或 vertical line
  6. 對比較正/比較好的 image 設 anchor reference, "anchor this image for position", "anchor this image for exposure"
  7. 在 camera and lens tab, 在每張 image 上按 new lens, 確定 "lens no." 都不一樣
  8. 在 optimizer tab, 選 custom parameter, 勾 reference image 之外的 v, d, e.
  9. 比較不歪的當基準, 勾其他的 r. 若都是歪的, 前面設了 control point, 那就全勾.
  10. 按 "optimize now", apply
  11. 在 stitcher tab, projection 選 rectilinear. 按 "calculate field of view", "calculate optimal size". output 選 jpeg, quality 85
  12. ctrl-p preview, 調整一下 center 跟 h-fov, v-fov
  13. "Stitch now"

2008年2月9日 星期六

gmake remove intermediate file

通常在 windows 寫簡單的程式時, 我習慣用 nmake, 雖然功能少, 但還堪用, 省得還得另外張羅或設定.
這幾天想用 suffixes 讓 make 自動推論來避免寫重複的 rule, 譬如像這樣(這是簡化過的例子)

$ cat makefile
.SUFFIXES : .c .obj .exe
all: file.exe
.c.obj:
touch $*.obj
.obj.exe:
touch $*.exe

當新增加 file2.c 時, 我只要在 makefile 多加 file2.exe, 剩下的事 make 會自動搞定.

然而事情沒我想像得那麼順利: 如果 file.obj 不存在, nmake 就會叫不知道怎麼生 file.exe. 也就是說, nmake 只能自動推論實際存在檔案的規則. 實在是相當差啊. 之後我原本想一些招數 workaround, 後來受不了乾脆換用 gmake.

雖然 gmake 如預期完成工作. 但它竟然在工作完成後把 file.obj 砍了. 以下是在 FreeBSD 做的實驗:

$ gmake
touch file.obj
touch file.exe
rm file.obj
$ make # bsdmake
touch file.obj
touch file.exe

可以看到 bsdmake 跟 gmake 行為不同. 查 gmake 文件才知道這是 feature, 可以用 .SECONDARY 語法避免砍檔.
intermediate files ...... if make does create b in order to update something else, it deletes b later on after it is no longer needed.
...... You can prevent automatic deletion of an intermediate file by marking it as a secondary file. To do this, list it as a prerequisite of the special target .SECONDARY.

2007年12月17日 星期一

初試 waf

最近在看 build system, 目前比較喜歡的是 waf.

原本偏好的是 scons. 但 scons 只能在 top level build, 不能只在子目錄中 build subtree, 除非在 top level 中用 name 來指定 build 那個 component, 感覺不好用, 我已經習慣現在 recursive make 這種 style 的用法了.
加上當時許多文件都說 scons performance 不好(不知道新版修好沒).

waf 的設計及語法我滿喜歡的. 唯一的問題是 depend on python. 雖然現在這應該不是大問題了.

在 google 及實際使用 waf 之後, 簡短的結論是
  • waf 的開發還很 active, 我發的幾個 bug report 當天就修好了, 從 svn log 來看也算 active
  • 由於很少 project 用, 因此可能有些問題要有人遇到才知道.
  • waf 對各 language/tool 的支援不一定夠成熟/portable, 尤其是非 c/c++ 系列 tool 在 windows 平台可能會是個問題.
  • waf 的 tool 實作採用類似 shell variable expansion 的作法, 因此目錄或檔名有空白會有問題. 短期內看來不會改 (README 說的).
  • 我的建議是可以在以 unix 為主的 c/c++ 小 project 試用看看. 若是複雜 build rule 的 project, 又想超級 portable, 現在用還太早.