2013/12/31

Javascript 斷行造成 parse 錯誤

當宣告一個有換成的字串,部份程式語言允許可以在引號中直接加入換行:
var foo = "space 
inside"

但上面語句在 javascript 執行會產生 syntax error。

在 javascript 中,語句結束不一定要加上分號,直譯器會判斷在適當的位置加上「;」。所以上述的程式會被 javascript 解讀成:
var foo = { prop: "some;
thing"};


其他:
[JavaScript] 自動補上分號的機制造成非預期的回傳值
http://wbkuo.pixnet.net/blog/post/162042779

2013/12/19

GNU screen 交換 window 順序

若要交換 window 1 和 window 5 的順序,先 focus 到 window 1,再進入指令模式:
C-a :number 5

windows 1 和 windows 5 的順序便會對調。

2013/12/16

Chrome 透過 console.dir() 取得 javascript 物件屬性

若不曉得物件中有哪一些屬性、方法可以使用,可以透過 console.dir() 將其列出。
var foo = ['1', '2', 3];
console.dir(foo);

Chrome 會屬性、方法印出:



若不曉得傳入物件的詳細定義,這招很方便。但只有在 Chrome 上印出的資訊會這麼詳細,Firefox 和 nodejs console 上,印出來的就和 console.log() 差不多。

感謝 Eason 指點。

2013/12/11

網址特殊字元轉換

最近發現有釣魚連結將全形句號當作半形句號使用,但貼到瀏覽器網址列後,瀏覽器卻會自動轉成正常的網址格式。

如使用全形符號:
http://blog.zeroplex。tw

貼到瀏覽器以後會被自動轉換為:
http://blog.zeroplex.tw

這個方法可以繞過一些論壇、網站的檢查工具,雖然不會被系統加上 <a>,但若有人手動複製連結到瀏覽器上,還是被釣魚。

實在不解為什麼瀏覽器要這麼自作聰明,於是下載了 Firefox source code 來看。

在 grep "。" 找到的資料多與網址轉換無關,但可以發現一些符號對應表,其中程式多半以「\x3002」表示,且註記都會加上「full stop」。改 grep 3002 | grep \\.c,可以發現 netwerk/dns/nsIDNService.cpp 是與 DNS 有關,且同時提到 U+3002、「full stop」,打開來看 line 642:
// RFC 3490
// 1) Whenever dots are used as label separators, the following characters
//    MUST be recognized as dots: U+002E (full stop), U+3002 (ideographic full
//    stop), U+FF0E (fullwidth full stop), U+FF61 (halfwidth ideographic full
//    stop).

意思是當遇到以下符號時,直接視為英文的句點「.」,也就是網址打全形符號自動轉換以在 RFC 3490 規定。
  • U+002E:「.」
  • U+3002:「。」
  • U+FF0E:「.」
  • U+FF61:「。」

以後要判斷網址是否正確時,還是把這段規則一起加進去吧。



Ref:
RFC 3490
http://www.ietf.org/rfc/rfc3490.txt

2013/12/08

Setting Composer Autoload on FuelPHP

FuelPHP 升上 1.6 開始支援 PHP Composer。原以為按照文件上的步驟操作,執行時就會自動載入 composer 安裝的類別檔,但事實上還需要另外作設定。

/fuel/app/bootstrap.php 中,在「Autoloader::register()」後方引入 composer autoload:
require VENDORPATH.'autoload.php';


在 FuelPHP 中使用 Sentry,則加入 composer.json:
"require": {
   "cartalyst/sentry": "2.0.*",
   "illuminate/database": "4.0.*",
   "ircmaxell/password-compat": "1.0.*"
}


若 composer autoload.php 已設定好,則可以呼叫 Sentry 來使用:
Cartalyst\Sentry\Facades\FuelPHP\Sentry

由於路徑太常,可以使用 class_alias() 指定別名:
class_alias('Cartalyst\Sentry\Facades\FuelPHP\Sentry', 'Sentry');




Ref:

FuelPHP and Composer
http://fuelphp.com/blogs/2013/01/fuelphp-and-composer

FuelPHPでSentryを使おう
http://blog.fagai.net/2013/03/11/fuelphp_sentry/

2013/12/05

Unlock screen (terminal screen manager)

手殘常常不小心按到其他按鍵 (該說鍵盤太好按嗎?),而 terminal 就突然沒有反應了。以前的解法是先 terminate 以後,用 screen detach 再 attach。

今天才發現 screen 有個畫面鎖定的功能:
C-a C-x     (lockscreen)  Lock this terminal.

lock 以後,可以用 ^Q 或是 ^A^Q unlock。

Ref:
http://stackoverflow.com/questions/70614/gnu-screen-survival-guide