Comments

這兩天在研究 testflight 碰到了一點 Xcode 4.3 的小雷,記錄一下。

按照 testflight 的教學上傳 ipa 檔,一直出現 mismatched-ubiquitykvstore-identifier-value 的錯誤,但是憑證已經確認多次,肯定沒有問題。

翻了一下應該是 APP ID enable iCloud 的問題,但是不能 disable 掉的狀況,只好自己去 entitlement 補上需要的參數。

Xcode 4.3 的 entitlement 換地方了。

  • 請到 target 的 summary tab 拉到最底下找到 entitlement 區塊,勾選 enable Entitlement
  • iCloud key-value Store 這個欄位填上 .*
  • iCloud Container 這個部分自己加一個值 .*

存檔後你的專案就會多一個 專案名.entitlements 的檔案,打開確認一下內容是否有

1
2
3
4
5
6
<key>com.apple.developer.ubiquity-container-identifiers</key>
 <array>
     <string>$(TeamIdentifierPrefix).*</string>
 </array>
 <key>com.apple.developer.ubiquity-kvstore-identifier</key>
 <string>$(TeamIdentifierPrefix).*</string>

再做 Archive, Share 成 ipa 檔上傳就可以了。

2012/04/42 補充

用 .* 的 key 送審 AppStore 時會被 reject,請設成跟你的 bundle identifier 一樣即可。

也就是:

1
2
3
4
5
6
<key>com.apple.developer.ubiquity-container-identifiers</key>
 <array>
     <string>$(TeamIdentifierPrefix)com.yourcompany.coolapp</string>
 </array>
 <key>com.apple.developer.ubiquity-kvstore-identifier</key>
 <string>$(TeamIdentifierPrefix)com.yourcompany.coolapp</string>
Comments

PHP-Resque is an amazing PHP port of Resque. After playing it for a while, an idea crossed my mind: It’s a total waste to create numbers of workers when there’s not many jobs to do. How about auto scale it? With the EventListener design of PHP-Resque, we could achieve it by writing some simple hooks.

Also, it solved issue #32 of PHP-Resque.

Here’s my code: PHP-Resque Auto Scale

Introduction

This is a project trying to build an auto scale architecture of PHP-Resque.

Read on →
Comments

這個標題很冗長,不過正是 Youtube 加入我的最愛後自動抓檔上傳到 Google Music 。

這個需求是這樣來的,我常常在 Youtube 聽到喜歡的歌,習慣性按加入最愛,隨時可以拿出來重複播放。不過在最近都用 Google Music 來管理我的音樂庫,行進時也可以用 Android 上的 Google Music App 聆聽音樂。

但這樣一來,就要透過 Youtube Downloader 等網站或軟體抓下影片檔後再轉檔、上傳到 Google Music ,這樣實在是太麻煩了。

有沒有什麼方法可以把這個過程自動化呢?第一個想到的是利用 ifttt 。不過 ifttt 要達成這個功能需要繞許多彎路,最後決定自己寫一個。

Read on →
Comments

This article will demostrate a near perfect redmine migration from trac 0.12 step by step.

1
2
3
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-3.0.11
PassengerRuby /usr/bin/ruby
* /etc/httpd/conf.d/redmine.conf
1
2
3
4
5
6
7
8
   <VirtualHost *:80>
      ServerName redmine.miiicasa.com 
      DocumentRoot /home/m/share/htdocs/redmine/public
      <Directory /home/m/share/htdocs/redmine/public>
         AllowOverride all    
         Options -MultiViews    
      </Directory>
   </VirtualHost>
Read on →
Comments

Resque 是 Github 基於 Redis 開發的 background job 系統。相較其他肥大的 queue 系統, Resque 的設計真的非常單純簡潔,充分利用 Redis 的特性。更多介紹可以看原作者的 Blog

PHP-Resque 是把 Resque porting 到 PHP 的專案。使用和 原本 Resque 一樣的概念和設計。甚至連 Redis 的 key 命名都一樣,因此也可以使用 Ruby 版本的 resque-web 來監控 PHP-Resque 的運行狀況。

設計

Resque 的設計有兩個角色: Job 和 Worker。 每個 Job 都是定義成類別,新增 Job 的時候會將 Job 的類別和相關參數 json_encode 後儲存到不同的 queue 裡面,而 Worker(s) 則會依序從 redis 讀取 Job 出來執行。

執行的時候並不是這個 Worker 本身去執行,而是會 fork 一個 process 來執行。這樣設計是為了避免時間一長, Worker 的記憶體管理不良導致卡死的狀況。

讀取 queue 時會依據你啟動 worker 的時候給的 queue 順序來讀取,因此優先權較高的 queue 要設定在前面。 Redis 可以是單機或 RedisCluster。而許多不同伺服器上可以按需求部屬執行不同 queue 的 worker。

Resque Job 執行失敗並不會自動重試,而是把它丟到 fail 的 queue 裡面。如果你有重試的需求可能要自己處理。若是有特別重要的 Job 需要監控執行狀態的,可以參考 README 中的 Tracking Job Statuses 一節。

以下先來介紹如何使用 PHP-Resque:

安裝 PHP-Resque

安裝非常容易,只要 git clone https://github.com/chrisboulton/php-resque.git 下來,放到你想要的地方,由於 Resque 沒有 config 檔的設計,設定都是寫在環境變數中再執行就可以了。

Read on →
Comments

CentOS 5 上的 Redis 套件只有到 2.0 最近用一套 PHP-Resque 需求 Redis 2.2 以上,只好手動升級了。

首先抓下最新穩定版解壓

1
2
3
4
wget http://redis.googlecode.com/files/redis-2.4.5.tar.gz
tar zxvf redis-2.4.5.tar.gz
cd redis-2.4.5
make

跟原本的 redis 2.0 裝在同一個目錄

1
sudo make PREFIX=/usr install

再把新的 config 檔蓋過去

1
sudo cp redis.conf /etc/

為了讓原本的 init script 正常運作 redis.conf 要稍微修改

1
2
3
daemonize yes
...
pidfile /var/run/redis/redis.pid

原本 redis-server 是裝在 /usr/sbin 新的是裝在 /usr/bin 把 /usr/sbin/redis-server 覆蓋過去

1
sudo mv /usr/bin/redis-server /usr/sbin/

大功告成。

Comments

假設我們現在要執行一個重要的動作,想要紀錄 terminal 下面每一個輸出和輸入,當然我們可以在每個指令後面用 cmd > filename 把輸出導向 log 檔,但如果是一連串的動作時就很不方便了。

unix 系列內建一個指令叫 script ,他可以很方便的紀錄你每一個輸出和輸入。詳細用法可以參考 man script

在這邊講兩個常用的方法,一個是 script log.txt 會把紀錄存到 log.txt, 用 script -a log.txt 就可以把新的 log append 到檔案後,不會蓋掉原本檔案。當你動作結束,想停止紀錄時,只要打 exit 就可以停止紀錄。

另一個是 script -C "ls -al" log.txt 他會把你指定的指令存到 log.txt 中,這個用法的不需輸入 exit

如果你的 .bash_profile 裏面有用到一些自訂的函數例如 git-autocompletion 之類,那你在使用 script 的時候可能會發現每下一個指令都告訴你 command not found。正確的解法是把你的 function 移到 .bashrc 中,在 .bash_profile 裏面去 source .bashrc 即可。

最後說明一下 log 檔的觀看方式,因為 script 會把所有東西都紀錄下來,包括控制碼這些,所以可以用 less -r log.txtmore log.txt 來觀看。

如果需要把 log 的控制碼去掉,可以參考下面這個 script:

1
2
3
4
5
6
7
8
9
#!/usr/bin/env perl
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
    print;
}
Comments

之前 vim PHP syntax check 都是跟存檔綁在一起,同事想要不用存檔就可以檢查,就弄了一下。

用法直接 :call PHPsynCHK() 即可,可以自己綁定熱鍵。

Comments

今天 Even Wu 在 facebook 上問了一個問題:他的 Bash PS1 要補滿 dash 到換行為止,感覺很有趣,稍微研究了一下。

首先要取得 term 的寬度,這個很容易直接抓 $COLUMNS 就好。

再來要抓原本 PS1 的長度,原本打算用 $PWD 去抓,不過 \w 碰到自己的家目錄會變 ~ 所以長度不對,這邊要自己處理一下:

1
2
3
4
5
6
7
8
9
  if [ "$HOME" == "$PWD" ]
  then
    newPWD="~"
  elif [ "$HOME" ==  "${PWD:0:${#HOME}}" ]
  then
    newPWD="~${PWD:${#HOME}}"
  else
    newPWD=$PWD
  fi
Read on →
Comments

前陣子入手了 Logitech G300 這支滑鼠,相當優秀。
他的特色是把快速鍵記在滑鼠內,不需要安裝任何驅動程式。
其原理是送出「真正的鍵盤訊號」,因此可以相容所有遊戲。

不過在我的 ArchLinux 下這支 G300 使用不太正常
當我按下滑鼠鍵後,游標會飄移到螢幕左上方。
經過測試後,判斷是他送出的 keyboard 訊號問題
只要把 keyboard disable 掉就可以了。 Read on →