搬家,從 Subverion 到 Git

Git – Git 与 Subversion 整理出來的步驟,Git 本身就有可以從 Subversion 簽出程式的功能:git-svn,應用 git-svn 就可以成功的搬家:

  1. 先到原 svn 專案下,執行 svn log ^/ –xml | grep -P “^<author” | sort -u | perl -pe ‘s/<author>(.*?)<\/author>/$1 = /’ > users.txt ,產生 users.txt,編輯裏面 svn user 跟 git user 的對照。
  2. 接著用 git-svn 重新簽出 svn repository: git svn clone your_svn_url -T trunk -b branches -t tags -s your_project -git -Ausers.txt –no-metadata
    在 Subversion 裡,是以目錄 trunk/branches/tags 來區分主枝、分枝跟標籤,-T, -b, -t 就是告訴 Git 這些事情。
    -Ausers.txt 就是告訴 Git-svn 要參考前個步驟所產生的 users.txt 去做使用者的對照。
    –no-metadata 是處理掉一些 git-svn 加上的附加訊息,這可以用 git log 比較得知,沒有加的話,git log 結果會有 git-svn-id: …. 的訊息。
  3. 如果有 tags 的話,會需要處理:git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag “$tagname” “tags/$tagname”; git branch -r -d “tags/$tagname”; done
  4. 如果有 branch 的話,也需要處理:git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch “$branchname” “refs/remotes/$branchname”; git branch -r -d “$branchname”; done
  5. 接著加入 git remote repository :git remote add origin your_git_remote_repository ,再用 git push origin –all 推上去。
  6. 最後把 tags 也推上去: git push origin –tags

在 Linux 下摹擬 Serial Port

之前試 java rxtx 函式庫時找到的方法,雖然在 Linux 下都是操作檔案,不過檔案跟真的 Serial port 有點差異,後來我是用 socat 指令來摹擬。

socat -d -d pty,raw,echo=1 STDOUT

這行指令會在 /dev/pts 下建立一個 node,假若是 PTY is /dev/pts/7,那麼就 sudo ln -s /dev/pts/7 /dev/ttyS0 ,這樣 /dev/ttyS0 就可以當作 Serial Port 來用了,可以設 baud rate 等等 serial port 特有的參數。接著執行程式,可以在執行 socat 的 console 看到程式寫到 serial port 的訊息。

要對接也是可以的,這時要用:

socat -d -d pty,raw,echo=1 pty,raw,echo=1

這會在 /dev/pts 下建立兩個 node。

備註:

  1. 要用 ln 建 symbolic link 的原因是 rxtx 只檢查 ttyS*, ttySA*, ttyUSB* 資料來源

電子發票心得

用電子發票快一年了,覺得還蠻方便。

  1. 對獎很方便,不管是 android/ios 都有 app 可以代勞。我用的是「雲端發票」這個 app,「發票+」也不錯用。
  2. 領獎很方便,設定帳戶以後,獎金會直接轉到戶頭。
  3. 電子發票有額外開中獎號碼,中獎機率增加。在某個月,我因此中了 2000。

一些經驗分享:

  1. 商店的 POS 機上顯示的是共通載具,所以跟店員講時,要講刷共通載具,這樣店員才知道,一般的 7-11/全家/OK/萊爾富是不用特別講了,亮出條碼他們就知道。
  2. 目前支援的店家除了便利商店以外,還有美廉社、全聯、幾分甜,某些中油也導入了。好像百貨公司也有的樣子,但我很少去百貨公司,所以不清楚。
  3. 去網站申請好以後,網站上可以列印出條碼 (一個 PDF 檔,上面滿滿都是條碼),條碼剪下來可以拿來貼在會員卡上,這樣就可以不用手忙腳亂地拿手機開 app,可以帥氣的亮出會員卡,直接跟店員說刷共通載具。店員感應完會員卡直接就可以刷載具,自己方便,店員也方便。
  4. 網站設定裡,可以選擇把發票明細寄給自己(excel 可直接開啟),如果你有記帳的話,可以自己轉換。

Rogue-Like 與 DCSS

一開始是看到 Pixel-Dungeon 開放原始碼在 github watabou/pixel-dungeon 上,網頁的簡介提到 Rogue-Like,不明白是什麼,就去 Google ,然後就找到這篇神文:[備忘][轉貼]一個經典但被遺忘的遊戲類型–roguelike及dungeon crawl stone soup介紹 。透過這篇文章,也才知道之前在 Jedi 網站上看過的 NetHack 就是同類型的遊戲。

整篇看完,就試著去找 DCSS,DCSS 在 ubuntu 裡,可以用 sudo apt-get install crawl crawl-tiles 來安裝;而在 archlinux 裡,則是在 AUR 裡,名字叫做 stone-soup-git,得用 yaourt/pacaur 來安裝。除此之外,DCSS 網站 上也有 Windows 版本。

轉換超級大的檔案為 MySQL 可用的 .sql 檔

在大致看過原始檔案以後,可以知道原始檔案大致的格式是是這樣:

  • 每筆記錄以只有 ‘@’ 存在的行做分隔。
  • 每筆欄位,也就是每行以 @field: value 存在。
  • @content: 該行比較特別,有可能是多行,有可能是單行。

最簡單的想法就是逐行解析。一開始是先寫了一個小程式,確定一下有哪些欄位,結果這樣就執行了好久好久。所以為了實驗方便,後來改以 head -n 2000000 | tail -n 1000000 大致取了一小段來使用,來確定有多少欄位。為了以防萬一,有刻意改變數字,從尾段取部分、從中段取部分,確定三者得到的欄位都一致,就確定了 MySQL table 所需的欄位。這應該也算是統計吧,以採樣的方式來取得概略值。(之後稱這些部分的檔案為樣本檔)

接著用 grep ‘@content:’ | wc -l 算了一下樣本檔,想不到這樣就有上萬筆!! 看來逐行解析然後新增到 MySQL 伺服器裡是不太現實的,不管是新增或是導出 SQL 敘述檔案肯定都會花許多的時間。因此就改變策略,要把每筆記錄都輸出到檔案,然後再根據檔案來逐檔轉換。但是這樣也出了問題,Linux 檔案系統的 inode 就這樣被我用盡,即使 df 的結果顯示還有空間,但就是沒辦法再新增檔案了。只好再次改變策略,分割為每十萬筆記錄為一個檔案。

針對檔案的解析並不難,那想要直接輸出 SQL 敘述,使用字串參數的方式未免太麻煩。這裡藉助了 mosql 模組的幫忙,只要丟一個 dict 進去,可以很簡單的輸出 SQL INSERT 敘述。

接著為了要讓 CPU 能用到所有核心,使用了 python 的 multiprocessing 模組,先把上述分割好的檔案名稱存為 list,然後以 multiprocessing.Pool 的 map 方法去執行,這樣就大幅的縮短了處理時間。

針對大型的檔案處理,必須要分割為多個小檔案,才能善用運算資源,速度才會快。

InSync in CentOS5

InSync 本身可以使用 insync-headless 來啟動(http://goo.gl/bsKS2N),輸入 insync-headless –help 就可以看到可使用的指令。第一次要先 start ,然後 add_account ,add_account 時,會告訴你一個網址,你需要用 browser 去訪問這個網址,最後會取得 authcode。把 authcode 複製起來,輸入 insync-headless add_account authcode $HOME/insync 就可以把帳號加進去了。之後就只要 insync-headless start 就行。

在 CentOS 5 會比較麻煩的是,InSync 網站上取得的 portable 版本使用的是 GLIBC 2.7 ,但 CentOS 5 用的卻是 GLIBC 2.5。幸好,在 InSync 支援網站上有人詢問,而 InSync 也釋出了給 CentOS 5 使用的版本:Test CentOS 5.9 build 。這個版本裡只有 insync-portable 這指令,因此要把前面的 insync-headless 改為 insync-portable,這樣就行了。

Windows XP 的自動更新不簡單

之前幫家裡電腦重新安裝 Windows XP,結果在升級到 Service Pack 3 以後, Windows Update 頻頻失敗,我還以為是我安裝步驟出錯,重裝了好幾次,很氣人。上網找解決方案,是有找到幾個,但是都沒辦法真正徹底解決。

後來想,好像有人自己弄 Service Pack 4,不如找來試試看吧,於是就找到三秒的偽 SP4 :三秒練功房v3: (偽) Windows XP Pre-SP4。下載的網址在 github 上,檔案很小,解開以後可以看到裡面只有下載的 batch file 跟 wget.exe,點選 build.cmd 以後,就會開始去微軟網站下載個別的更新檔案。下載完畢以後,還沒 SP3 的,就升級到 SP3,然後裝 IE8、WMP11 。裝好以後,點選 hotfix.cmd 就開始真正的安裝 SP4 。

安裝完成以後,重新開機,Windows Update 就可以順利運作並且安裝其他更新了。

WinAMP 與 VFP

不,WinAMP 與 VFP 一點關係都沒有,相似的只是命運。

WinAMP 在前一陣子宣佈停止下載,也就是說,未來不會有更新了。今天在 solidot 上看到「Winamp用戶請求AOL開源代碼」,然後我就想到之前 Visual FoxPro 也是如此。微軟在 Visual Studio 6 之後,宣佈 VFP 將不再包含在 Visual Studio 裡;VFP 後續仍然有持續的更新,直到 9,然後微軟宣佈不再繼續開發,在當時就有不少人希望微軟能釋出原始碼到公眾領域,讓 VFP 能繼續存活下去。但是之後僅僅只有在 Codeplex 網站上有個 VFPX 在持續更新,為 VFP 9 提供 addon。

在 VFP 最大的社群 – Visual FoxPro Wiki 上,有一頁就是在討論這件事情,當然是不了了之。2010 年,Ken Levy 在他的 blog 發表了 Visual FoxPro Strategy at Microsoft ,他曾經擔任 VFP 的 Product Manager (也是最後一任),文章提到 VFP 的歷史以及為什麼微軟不開放的原因,主要原因就是 VFP 裡的許多技術與演算法已經被廣泛的應用在微軟其他產品上,像是 SQL Server 跟 Access,在商言商的結果,當然也不可能開放出來讓大眾檢視。

未來 WinAMP 的原始碼是否會釋出?我想如果沒有衝突到商業利益的話,也許會吧。

GoAgent 3.0.8 小記

升級以後,就爆炸了。而我居然直接覆蓋,沒留原來的檔案,只能摸摸鼻子把它修好。

是故,得重新設置,主要就只要改 proxy.ini 。第一個要動的部分是把 [proxy] 裡的 enable 設為 1,然後修改 host/port,這是因為公司內部需要透過 proxy 上網,而我又弄了 cntlm 去繞過 microsoft proxy server 的 NTLM 的關係,這裡的 host/port 是我的 cntlm 的 proxy/port。第二個要動的是 [gae] 裡的 appid/profile/obfuscate,appid 是 goagent 說明文件有特別提到的部分,profile 是為了解決 403 錯誤,詳情可以閱讀 【已解决】goagent打开页面出现403错误:Your client does not have permission to get URL /2 from this server,obfuscate 則是為了解決 Connection() argument 1 must be OpenSSL.SSL.Context 問題,這是我閱讀 local/proxy.py 以後看到的,設置 validate 應該也可以解決,但我沒試。

server 部分只要執行 server/uploader.bat 重新上傳就行了,執行的時候,會詢問你 appid/帳號跟密碼,依次輸入就可以。uploader.bat 裡蠻有趣的是, python 可以直接執行一個 .zip 檔。在閱讀原始碼的時候,發現 server 的版本沒跟著調整,仍然是 3.0.7 版。在上傳以後可以在瀏覽器裡輸入 <your_appid>.appspot.com/2 看是否順利運行。