Import Vagrant box into VirtualBox

vagrant package 得到的 package.box 實際上是一個 tarball 檔案,用 tar xzf 就可以解開。裏面會有 box.ovf, *.vmdk, private key … 等檔案,使用 vboxmanage import box.ovf 就可以匯入。

在匯入以後,要注意幾點,第一個是名稱,名稱是之前 Vagrantfile 所在目錄的名稱再加上一串數字,你可以用 vboxmanage modifyvm your_vm –name “new name”。

第二個是網路介面名稱,因為在你匯入的機器上可能沒有這個網路介面,如果你跟我一樣在 Vagrantfile 裡是設定用 public network 的話,可以用 vboxmanage modifyvm your_vm –bridgeadapterN new_network_adapter 來替換,那如果是用 private network 之類的,也是用 modifyvm ,總之原理一樣就是。

其他你可能還會用到的指令:

  • 列出 VirtualBox 裡有哪些 VM:vboxmanage list vms
  • 列出指定 VM 的資訊:vboxmanage showvminfo your_vm
  • 刪除 VM:vboxmanage unregistervm your_vm –delete

簡單的組合技可以參考這個 gist

nodeschool.io expressworks

最近看到 nodeschool.io ,所以就照著說明來上 expressworks 的課。

首先就是要安裝:npm install -g expressworks workshopper-exercise

接著建立一個目錄,作為練習用,例如 expressworks_practice ,然後在該目錄下安裝 express jade :npm install express jade

最後就可以練習了,要練習,就是輸入 expressworks,就可以看到選單,選定項目後,會有題目的說明。

以下是你可用的指令:

  • 執行程式並自動驗證:expressworks run program.js
  • 執行:node program.js
  • 檢查:expressworks verify program.js
  • 顯示題目說明:expressworks print
  • 顯示選單:expressworks

但要注意的是,expressworks 似乎是用關鍵字來檢查程式,所以有可能用 node 執行時會有錯誤發生,但 expressworks 卻告訴你通過了的情況。

搬家,從 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

docker-gitlab 與 docker-redmine 的結合

這兩者是由同一個開發者建立的,兩者可以結合。主要設定有兩個:

  1. docker-gitlab :要指定 REDMINE_URL 這個環境變數,假設你把 docker-gitlab 與 docker-redmine 放到一台機器上,利用 apache mod_proxy 來區分路徑的話,那麼就是 REDMINE_URL=http://your_ip/redmine
  2. docker-redmine:要指定 –volumes-from= ,例如:–volumes-from=gitlab_gitlab_1 。

在建立專案的時候,要依照下面步驟:

  1. 在 redmine 建立專案,下面以 Demo 為例。
  2. 在 gitlab 建立專案,並且記住專案網址,假設是 your_name/demo.git。
  3. 在 redmine 的 Demo 專案設定裡的「儲存機制清單」裡建立新儲存機制,取一個好名字,然後在網址裡填入 /home/git/data/repositories/your_name/demo.git ,建立。
  4. 回到 gitlab,去專案設定裡,把 Issue tracker 改為 Redmine ,然後填入專案名稱 demo 。

這樣做之後,在 gitlab 點選 Issues 時,畫面會帶到 Redmine 去,而在 Redmine 專案的儲存機制頁籤也可以存取到跟 gitlab 的 repository,也不需要利用 git hook 機制來做同步了。

使用者帳號同步的部份應該是可以用 LDAP 來達成,這部份還要試驗看看。

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 版本。

PHP Cannot create references to/from string offsets

之前在自家的 wordpress 上用了 muki-tag-cloud ,在翻 apache log 時,發現常會出現這錯誤:

PHP Fatal error: Cannot create references to/from string offsets nor overloaded objects in wp-content/plugins/muki-tag-cloud/widget.php on line 230

今天發狠找出原因了,首先還是要先瞭解 PHP 的 reference 是幹嘛的,我覺得這篇 PHP Reference 測試 不錯,裡面沒什麼解說,就是幾個範例與執行結果,看完大概可以了解到 PHP 的 reference 的行為是什麼。

接著就是試著寫小程式複製出錯誤。

可以複製出來之後,就知道問題在哪裡了 (好吧,我知道 log 的訊息其實很清楚,但我對 PHP 不熟,所以…),PHP 不允許建立字串中字元的參考。知道問題了,就可以解決了,後來就簡單加上判斷,如果發現 $widget[‘callback’] 是字串的話,就跳過,不建立 $widget[‘callback’][0] 的參考,如此一來就解決問題了。

順手發了 pull request 給作者,希望是會改,要不然每次更新這 plugin 時,都要再改一次。

awk 的 pipe

之前都很笨,用 awk 處理完,還是都先用 printf 輸出到檔案,再用 sh 去執行。今天終於去查了 awk script 裡是否有類似 system() 的用法,果然 awk manual 裡就有提到 system() ,不過該小節建議了更好的做法,就是直接用 | 把輸出的指令 pipe 到 sh 去。

作法大致是這樣:

awk '{printf("cp %s /media/usbdisk%s\n", $1, $1) | "/bin/sh" }' files-list.txt

AngularJS 起手式

我是參考這篇教學:Learn to Build Modern Web Apps with the AngularJS Tutorial

教學裡使用的是 yeoman ,這真的有方便。首先要安裝 nodejs 跟 npm,在 Ubuntu 13.10 裡,就用 sudo apt-get install nodejs npm 就行了,如果是 Ubuntu 12.04,得另外裝 chris lea 的 PPA,再 update/install。教學裡的第一步,就是安裝 yeoman,用 sudo npm install -g yo 來安裝,可是我不太喜歡直接裝到 /usr 系統資料夾去,所以找了一下,看能不能像 Python 的 pip install xxx –user 一樣裝到使用者目錄下。

搜尋的結果是可以的,但需要做些設定。設定值大致如下:

這樣就可以不用 sudo,然後用 npm install yo 就可以把相關模組都裝到使用者目錄下了,而且相關的指令也都可以用。

參考資料: