2013年12月9日 星期一

[PHP] dollar sign ($) 的陷阱

// == case 1 ==
$foo = 'foo';$
$bar = 'bar';
// expect: $foo = 'foo', $bar = 'bar'
// actual: $foo = 'foo', $bar = NULL
// hint:   PHP Notice: undefined variable: bar in test.php on line 4

// == case 2 ==
$foo = 'foo';$
bar  = 'bar';
// actual: PHP Parse error:  syntax error, unexpected T_STRING, expecting T_VARIABLE or '$' in test.php on line 3

// == case 3 ==
$foo = 'foo';$
// actual: PHP Parse error:  syntax error, unexpected $end, expecting T_VARIABLE or '$' in test.php on line 2

可以發現,在一些特定情形下,PHP 允許換行使用錢號 ($),但是不容易發現。 所以任何 PHP 的訊息應該都要注意。

PHP 5.3.24 (cli) (built: Jun 10 2013 16:42:20)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans

2013年11月19日 星期二

[PHP] Call By Reference 的陷阱

class ClassA
{
   private $fields;

   public function test1()
   {
      $this->fields = array(1,2,3);
      foreach ($this->fields as &$v) {
          $v += 1;
      }
                
      $localFields = array('x','y','z');
      foreach ($localFields as $v) {
      }
      echo json_encode($this->fields); // expect: [2,3,4], output: [2,3,"z"]
   }
                
   public function test2()
   {
      $this->fields = array(1,2,3);
      foreach ($this->fields as &$v) {
          $v += 1;
      }

      $v = 'abc';
      echo json_encode($this->fields); // expect: [2,3,4], output: [2,3,"abc"]
   }
                
   public function test3()
   {
      $this->fields = array(1,2,3);
      foreach ($this->fields as &$v) {
          $v += 1;
      }

      $this->inner();
   }

   private function inner()
   {
      $v = '***';
      echo json_encode($this->fields); // output: [2,3,4]
   }
}

$obj = new ClassA();
$obj->test1();
$obj->test2();
$obj->test3();

上面可以看到,雖然第一次使用 &$v 是在迴圈中,第二次使用 $v是在另一個迴圈。 原本預想應該是互不相關,但是顯然 Call By Reference 影響到第一次使用的欄位,造成出乎意料的狀況。


解決的方法:使用完 &$v 之後就馬上 unset($v); 缺點是可能會看不懂為什麼這樣做。

比較好的作法還是改用索引存取:

foreach ($this->fields as $k => $v) {
    $this->fields[$k] = $v + 1;
}

PHP 5.3.24 (cli) (built: Jun 10 2013 16:42:20)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.0rc1, Copyright (c) 2002-2012, by Derick Rethans

2013年9月28日 星期六

[FF] 利用 Greasemonkey 修改網頁內的連結

平時都有追蹤博○來新書上架的習慣﹐追蹤的方法就是簡單地依據連結是否開啟。但是在最近網站改版之後﹐連結會加上 ?loc=XXX_XXX。無法再從連結顏色來辨識是否追蹤過。

因此決定利用 Greasemonkey 去掉 "?loc=XXX_XXX" 。

安裝完之後,選擇「新使用者腳本」﹐

輸入內容大致如下:

只要懂一些 JavaScript,然後把內容改成如下,存檔之後 ?loc=XXX_XXX 就不再出現了。

// ==UserScript==
// @name        book.com
// @namespace   http://www.book.com/
// @description 博○來 ?loc=XXX_XXX
// @version     1.0.0
// @include     http://www.book.com/web/*
// @grant       none
// ==/UserScript==
(function(){
    var regex = /\?loc=.+/
    var elems = document.getElementsByTagName("a");
    for (var i = 0; i < elems.length; i++) {
        var href = elems[i].href;
        if (href != null && href.match(regex)) {
            elems[i].href = href.replace(regex, "");
        }
    }
})();
@name、@description 用來做插件的分類。
@namespace、@version 是在做版本控制。
@include 是用來過濾有哪些 URL 需要處理。
@grant 是在向瀏覽器請求授權。

參考資料:http://userscripts.org/

使用 google-code-prettify 在 Blogger 呈現 syntax highlight

echo "Hello world";
若要形成上述模樣﹐只需要在部落格貼入下方的程式碼即可:
<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?skin=sunburst"></script>
<pre class="prettyprint">
echo "Hello world";
</pre>

樣板(skin)可以輸入 default﹑desert﹑sunburst﹑sons-of-obsidian﹑doxy 等數種。 若是希望顯示行數﹐可於屬性 class 加入 linenums。

參考資料:http://code.google.com/p/google-code-prettify/

2015/10/13 更新:已經搬到 GitHub。
參考資料:https://github.com/google/code-prettify

[Java] Invalid HTTP method: PATCH

最近系統需要使用 Netty4,所以把衝突的 Netty3 拆掉,然後就出現了例外。 pom.xml <dependency> <groupId>com.ning</groupId> <artifactId>as...