Mysql show function list

Posted by ayuayu on 2014/08/25

....喵的明明有create function,drop function
可是根本沒說清楚怎麼查阿!

找了N久才看到可以
select * from mysql.func;


PHP測試小技巧

Posted by ayuayu on 2014/08/18

不能直接echo值怎麼辦?
試試echo "<script>console.log( '".$YourValueWantToDisplay."' )</script>"

註:僅供開發測試用,上線請避免使用這種寫法
更進階的用法參考 http://stackoverflow.com/questions/4323411/how-can-i-write-to-console-in-php

cli 和apache2

Posted by ayuayu on 2014/08/14

這是不同的環境設定

前面是指打cmdline的時候所引用的設定
以xdebug為例,我們灌好要新增這個功能的時候,必須要在php.ini裡面設定
zend_extension=xdebug.so

不過你如果locate,就會發現實際上有兩個php.ini

$ locate php.ini
/etc/php5/apache2/php.ini
/etc/php5/cli/php.ini


如果你在第一個做設定,那麼xdebug就會套用到apache server上面
簡單來說,如果在瀏覽器讀到什麼var_dump 或錯誤頁面或是有用到xdebug的相關套件,就會有套色或載入的行為

如果你在第二個做設定,那麼在terminal執行的php指令就會載入xdebug


Ubuntu 14 的GuestAddition 與字型

Posted by ayuayu on

VM必用到的無痕模式
其實不一定用到,但是可以隨意縮放視窗是賣點

...

但是14.04有部分特定版本(或者說,更新)讀光碟會異常(會告訴你檔案iso格式不符
阿google下去那就是光碟的標準格式阿....為什麼會讀不到.....orz

現在的最新版,嗯,老實說不太穩定,問題也比之前難解(畢竟才出沒多久

所以要做這類更新之前自己照個VM快照吧
------------
注意:這是"部分版本"對光碟格式判斷錯誤,不是"全部版本"
所以這邊才建議更新前照快照,如果內容有更動,第一次重新開機無痕模式仍然會失效

但是這個時候插入光碟並不會有錯誤訊息(如果不相容的版本,插光碟就會告訴你I/O錯誤,如果這個狀態再更新會不會解決就不清楚)

此時重新安裝Guest Addition

------------
原本以為只能忍耐用心細明體了,沒想到發現一篇
http://scar.simcz.tw/article/2014/04/22/fix-ubuntu-14-04-lts-zh-font-selector/

phpmyadmin 提示缺少mcrypt

Posted by ayuayu on 2014/08/13

php.ini裡面
Dynamic Extensions中
extension=mcrypt.so <=注意自己locate一下可能不同路徑 名字之類

還有一個做連結的方法
不過網路上的方法製造出來的可能跟旁邊的預設設定不一樣,同樣自行參照一下修正
理論上做一個就可以了....

php 資料庫編碼問題

Posted by ayuayu on 2014/08/12



$conn = mysql_connect(ConnectionProperty::getHost(), ConnectionProperty::getUser(), ConnectionProperty::getPassword());
mysql_select_db(ConnectionProperty::getDatabase());
mysql_query("set names utf8");
if(!$conn){
throw new Exception('could not connect to database');
}

在選擇db以後設定編碼
其他的做法莫名其妙的沒用...

phpunit+gearman產生的矛盾

Posted by ayuayu on 2014/07/29

嗯,經過各種接近極限整人的測試以後,發現以下幾點,有誤請指正
指正是拿具體例子或明顯可執行/實作的例子來反駁,如果舉不出可行的簡單例子,請勿來亂,謝謝。

------------------------
先說結論

phpunit沒有辦法正確顯示coverage的原因是沒有直接call,然而這個應該是gearman的必然現象

判斷的結果,既然是單元測試,那麼必然是我直接call他可以得到期望的回傳(即使中間有邏輯),好死不死gearman的運作機制並不是這類型的

首先是worker部分必然是脫離phpunit獨立執行,因為開worker那部份一定要無窮回圈來listen(不然用gearman就失去意義了)

phpunit比起coverage實際上assert才是重要的檢證機制(畢竟他不只可以用來assert true,assert false,或是assert 特定的value,還可以使用regexp來檢查return,是相當有效的防修改掛掉的test

然後listen的client部分為什麼沒有cover呢? 很簡單,即使用了class,即使require,我們也不會去直接執行那條function
因為在沒有job的狀態下,去執行那條function毫無意義,然而如果是發出去的worker需求,會變成這樣:
"我們(傳資料)給已經註冊的job server function,由他幫你處理註冊好先前設定的工作"
所以中間的code都是我們一開始註冊的無窮迴圈狀態的worker在執行的,既然是別人在執行,那就不會cover了


-----------------------
為了接近其他的測試範例,我們使用class gearman來完成這個目標

worker架構:
class裡面,先private $worker
然後在__construct裡面new Gearmanworker,addserver,addfunction (注意第二個參數必須是 array($this, 'domyworker'),不然因為你寫在class裡面會找不到

註冊完,隨便寫個function來啟動
public function run(){
    while ($this->worker->work());
 }
當然這要在別的terminal開的,開始listen

client(test)架構:
 client test的寫法由於直接call沒有意義,我們要把assert放在job執行成功後的回傳裡面
然後addtask 完讓他run
請參照https://github.com/vlucas/phpunit-gearman-testing

同樣,由於在class裡面,因此如果想call functon請改成$this->function

再來就可以測試了
我們可以正確測到預期丟job過去應該有的回傳
(如果說實際應用的例子沒有值得回傳的資料,那就回傳個執行狀態的陣列總行吧)

不過你去開report就會發現,coverage居然是0%
一開始以為是什麼設定錯誤,寫法問題,或者根本是BUG之類的
但是理解一次以後就清楚了

在測試過程中,執行job那些code的是server,而不是測試程式(注意你的unittest只有丟job出去,phpunit還沒強大到可以trace到底,不過以後可能會更新?)

所以以上的程式都有執行到,但phpunit會認為他都沒執行到,很有趣吧

--------------------------
二三事:
1.$task = self::$client->addTaskBackground($name, $params, null, $taskId);
如果你改成這樣,因為return會直接切掉,因此你的assert會直接失效

2.使用gearman來寫code的時候,完全沒有辦法靠php本身的debug機制來除錯
因為你註冊好job以後,出錯的話永遠是錯在無窮迴圈那行
(因為正在執行的行永遠是那條無窮迴圈,由那個區域去call其他的function)
解法也直覺,自己echo var_dump吧..