2012年4月26日 星期四

在*nix上使用 google drive 同步程式

google drive 竟然發佈了,但竟然沒有附帶給 linux 的 client !!! 好吧只好自力救濟,拿win32版湊合著用。

方法:
  1. 先找一台安裝好google drive sync的機器(推薦找WinXP 32bits),把 C:\Program Files\Google\Drive 這目錄 copy 出來。
  2. 在你要跑的 *nix 機器上裝好 wine1.3 和 winetricks
  3. 執行 winetricks 選擇 "Select the default wineprefix" => "Install a Windows DLL or component", 把 "ie8", "mdac28", "vcrun2008" 這三項勾起來,按下確定,然後等對話框出現,按確定、按確定、按確定。
  4. 把步驟1.複製出來的檔案放進 wine 的 virtual disk 下的路徑。
  5. 以 wine 執行 googledrivesync.exe 
我在 Ubuntu 11.10 上以 wine1.3 測試正常。

附註 : 第一次安裝時因為要答一些對話框,所以一定得在 GUI 下跑,但一次設定完畢後,其實gui幾乎就用不到了。所以可以考慮改用 Xvfb 來執行,讓他變成背景 daemon。

2012年3月11日 星期日

中斷沒有timeout參數的php function

注意:
  1. 這種方法只能用在cli下, apache,(f)cgi 下使用可能會出現難料的結果
  2. 沒看過別人用這招,考靠度未經驗證,所以有支援timeout的function還是用他內建的為先
  3. 測試過後還是有些function不吃這招(只好再想別的方法中斷他)
<?php
declare(ticks = 1);

function throw_exception($signal) {
  pcntl_signal(SIGALRM, SIG_IGN);
  throw new Exception('throw_exception');
}

pcntl_signal(SIGALRM, "throw_exception", false);
pcntl_alarm(1);

$connect_timeout = false;
try{
  $data = file_get_contents('http://1.1.1.1');
  pcntl_signal(SIGALRM, SIG_IGN);
}catch(Exception $e){
  $connect_timeout = true;
}

if($connect_timeout){
  echo "timeout!\n";
}else{
  echo "ok got data:".$data."\n";
}
?>

2012年2月26日 星期日

整理太亂的tabs

Components.utils.import("resource://gre/modules/Services.jsm");
var gBrowser = Services.wm.getMostRecentWindow("navigator:browser").gBrowser;
var tabs = [];
for (var i = 0; i < gBrowser.tabs.length - 1; i++){
  tabs[i] = gBrowser.tabs[i];
}
tabs.sort(
  function(a, b)(
    (a.linkedBrowser.currentURI.asciiSpec < b.linkedBrowser.currentURI.asciiSpec) ? -1 : 1
  )
);
tabs.forEach(gBrowser.moveTabTo.bind(gBrowser));