LightTable

今天早上看到 LightTable 開放原始碼的消息:新一代IDE Light Table开源:让编程工作更简单,上去 github 看了一下,完全搞不清楚用什麼語言寫的,既然搞不清楚,那就只好裝來試試看了。

我的環境是 Ubuntu 12.04,安裝經過:

  1. git clone https://github.com/LightTable/LightTable
  2. 執行 ./linux_deps.sh ,提示說要安裝 leiningen,搜索了一下,找到 Leiningen 網站,閱讀之後,才知道 LightTable 應該是 Clojure 。Leiningen 應該是類似 Gradle 之類的軟體,可以自動化建置 Clojure 專案的工具。
  3. 如果 Ubuntu 有,當然是用 apt-get 安裝:sudo apt-get install leiningen ,但經過試驗,會有一些問題,版本太舊了。leiningen 網站上也建議自己另行安裝,不要使用 1.x 的版本。安裝的步驟可以參考 leiningen 的 README,只是簡單下載一個 bash 檔就能用了,然後先輸入 lein version 檢查看看版本,如果是第一次執行,會先下載檔案到 $HOME/.lein 下。
  4. 重新執行 ./linux_deps.sh ,這個步驟就會開始下載必要的檔案,然後建置,並放到 deploy 目錄下了。
  5. 執行 deploy/LightTable 就可以了。

LightTable 應該是使用 Clojure 寫的,至少 plugin 是,從下載過程看來,使用了 Maven,因此看起來是有借重 Java 的跨平台能力。Clojure 的語法真的是…看不太懂啊!! 似乎是該找 Clojure Tutorial 來看看了??

Apple TV 與 mt-daapd

Apple 寄信來說 1/10 有特價活動,上去一看,剛好看到 Apple TV。稍稍找了一下,Apple TV 可以用來播放影片、音樂之類的,就想說,那我可以架個 Media Server ,讓 Apple TV 存取嗎??

 

轉換超級大的檔案為 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 就可以順利運作並且安裝其他更新了。

百度雲網盤檔案的下載

前一陣子有趁中國那邊拼的火熱的時候去申請,拿到 1TB,現在升級成 2TB 了,是說也不知道該放些什麼。

後來才聽朋友說,可以 BT 下載,只要上傳種子以後,百度雲就會幫你下載。如果已經有人下載過,會一瞬間就下載完成,我試過幾個 Linux distro 都是如此,真的是瞬間下載好。但是人生往往就是這個 But,雖然已經下載好放到雲端,你還是要從雲端拉回本地端,這時候就杯具了,你要不就用百度提供的軟體,要不就只能用瀏覽器慢慢下載。我自己大部分時間都在 Linux 上,只能用瀏覽器,還蠻斷線的,而且還不能續傳。

後來找到好方法,可以取得真正的下載網址,然後就可以用續傳軟體下載。我自己是用 Firefox,然後在 http://userscripts.org 上找到 baidupandownloadhelper ,安裝以後,當你在百度雲的網頁介面上勾選要下載的檔案之後,上方會出現「批量下載」的按鈕,按下去以後,就可以看到連結,就可以拿這個連結來下載了。

我後來是額外安裝了 aria2,可以在 console 下載的工具,正好 baidupandownloadhelper 也可以直接複製 aria2 指令,真的是相得益彰。

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 看是否順利運行。

Vim C-] 失效

問題描述:vim 裡確定 tags 的設定都正確,但按下 Ctrl-] 卻沒有跳到游標所在函式的定義。

問題發生要件:

  1. 使用 gcin
  2. 使用 gnome-terminal, terminator … 等非 xterm 的終端機程式

原因:

gcin 設定的「內定輸入法」裡,「Ctrl 輸入標點符號」被勾選了。將這個設定取消,就沒有問題了,因為勾選時, gcin 會將 Ctrl-] 轉譯為 “」”。

gtk+ windows 應用程式裡的文字亂碼

大多數的 gtk+ Windows 應用程式都有相似的問題。

第一步,要先知道應用程式是使用哪裡的 gtk+ library,一般省麻煩的,會自己包在一起,安裝時會放在安裝目錄下。所以可以找到 etc/gtk-2.0 這個目錄,請編輯 gtkrc ,加上:

style "user-font"
{
    font_name="Sans 12"
}
widget_class "*" style "user-font"

就可以解決了。

如果不是在安裝目錄下的,就得自己回想一下看之前安裝在哪裡了。

gitlab on Ubuntu 12.04

基本安裝指南是參考 gitlab 上的文件:https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/installation.md

  1. Packages/Dependencies:提到的套件之前都安裝過了,寄送郵件的 SMTP server,文件裡是說要用 postfix,我是用 ssmtp。
  2. System Users:原本是先處理 Ruby,因為我想用 rvm,所以就先處理 System Users,這邊就建立 git 使用者,由於後續的 rvm 會需要用到 sudo,所以也順便把 git 加入 sudo 群組。
  3. Ruby:我是用 rvm 來安裝,所以就不移除原來系統的 ruby。這邊安裝稍微麻煩一些:
    1. cd /home/git
    2. curl -L https://get.rvm.io | sudo -u git -H bash -s stable –ruby=1.9.3
    3. sudo -u git -H vim .gemrc :填入 gem: –no-ri –no-rdoc
    4. sudo -u git -H mkdir bin
    5. sudo -u git -H vim bin/rvm:因為不知為什麼 bash 沒去讀 .bash_profile,所以就弄了一個 script 來含括環境變數,內容請參考這裡,做完以後,要用 sudo -u git -H chmod +x bin/rvm 變更其權限。
    6. sudo -u git -H bash -c “\$HOME/bin/rvm all do gem install bundler”
  4. GitLab shell:這邊照步驟做,最後的 Do setup 時,要改用 sudo -u git -H bash -c “\$HOME/bin/rvm all do ruby \$HOME/gitlab-shell/bin/install” ,強制用 rvm 的 ruby 來安裝。
  5. Database:照步驟做。
  6. GitLab:這也是照步驟做,但要注意使用 gem/bundle/rake 的指令,要改變為 sudo -u git -H bash -c “\$HOME/bin/rvm all do gem 跟 sudo -u git -H bash -c “\$HOME/bin/rvm all do bundle 跟 sudo -u git -H bash -c “\$HOME/bin/rvm all do rake

至此,大致就完成了。

實際上在測試的時候,發生一些問題,我遇到的問題跟解:

  1. 我用預設的帳號 admin@local.host 跟密碼 5iveL!fe 無法登入:後來找到文件,是說用 sudo -u git -H bash -c “\$HOME/bin/rvm all do bundle exec rake gitlab:setup RAILS_ENV=production” 重新執行,我發現我這個步驟有錯誤訊息,就修正以後,再執行一次,就可以登入了。主要是修正 gitlab-shell/config.yml 裡的 repos_path 跟 gitlab/config/gitlab.yml 裡的 repos_path ,這兩者要一致,我是設定為 /var/git/repositories ,之前照設定做的時候,漏了一個。
  2. 建立專案以後,無法 clone/push,這有兩種情況:
    1. gitlab-shell 用了錯誤的 ruby 版本:我是笨笨的去把 gitlab-shell/bin 下所有 script 的第1行修改為 /home/git/.rvm/bin/ruby ,後來有找到 gitlab 的 trouble shooting guide,他是把 PATH 寫到 /home/git/.ssh/environment,然後在 /etc/ssh/sshd_config 裡增加 PermitUserEnvironment yes。
    2. gitlab-shell config.yml 設定錯:我讓 gitlab 執行在 port 81 上,所以 config.yml 裡的 gitlab_url 也應該要調整為 http://localhost:81/ 才對。(來源:GitLab: Could not read from remote repository)
  3. git 版本需要 1.7.10 以上,就找了 git 的 ppa 來源安裝:sudo add-apt-repository ppa:git-core/ppa && sudo apt-get update && sudo apt-get upgrade

整個都確定完成才寫這篇,我想應該是沒漏掉吧。

除了官方的安裝文件之外,ArchLinux wiki 上的安裝指南也寫的很棒,不妨參考看看。