printf and write

  一般在使用 printf 都會直接將結果印出在螢幕上,都不會發生問題,也不會發現其實 printf 的行為背後其實有一個緩衝區在紀錄。除非遇到 \n 或 程式結束,或者有其他東西要輸出,否則不會自動 flush 緩衝區,要強制清空緩衝區可以使用 fflush(stdout) 。

而 write(1 /*stdout*/, buffer ,size) 則可以直接將字串印到 stdout 中,不經由緩衝區處理。

  在一般的情況下還是 printf 效能會比較好,在多執行緒或多行程的情況下也比較不會有不合乎預期的情況發生。例如 兩個行程同時輸出 output 變成  ooututppuutt 之類的。

  會發生這種現象通常是在無窮迴圈的程式,由於程式沒有結束,又沒有輸出一些換行符號,造成輸出一直卡在緩衝區中。

#include <stdio.h>
int main()
{
  while(1)
  {
    printf("hello");// printf("hello\n")
    sleep(1);
  }
}

參考資料:

WordPress 3.2.x SlimStat-Ex 2.1 issue

可能是 WordPress 3.2.1 的 jQuery 版本變更了,造成 SlimStat-Ex js 執行錯誤,造成整個頁面無法產生。

把這行改成這樣就好了。

if (!((el.attr('title') == '') || (typeof(el.attr('title')) == 'undefined'))) {

看起來是 jQuery().attr(‘title’) 是空值時的回傳值改變了。

由於原始版本已經沒有維護了,這個版本的瀏覽器判斷有些舊了,沒有把 chrome 包含進去,我想要把他加入統計所以改了一些地方~

程式碼是參考原始的 slimstat 的

function parse_browser(..) {
..
432             } else {
433                 $info['version'] = $sniff[3];
434             }
+435             if($info['browser'] == '190' || $info['browser'] == '191') {
+436                 mb_eregi( "^([0-9]*).(.*)$", $info['version'], $v );
+437                 $info['version'] = $v[1];
438             }
439             if ( sizeof( $sniff ) == 5 && $info['platform'] == '-1' ) {
440                 $info['platform'] = $sniff[4];
441             }
..
}
function _determineBrowser(..) {
..
455             array( 'netscape', '1', 'netscape[0-9]?/([[:digit:]\.]+)', 1 ),
+456             array( 'chrome', '190', 'chrome/([[:digit:]\.]+)', 1 ),
+457             array( 'chromium', '191', 'chromium/([[:digit:]\.]+)', 1 ),
458             array( 'safari', '2', 'safari/([[:digit:]\.]+)', 1, '10' ),
459             array( 'icab', '3', 'icab/([[:digit:]\.]+)', 1,  '10' ),
..
}
$this->browserString2ID = array(....., 'Chrome' => '190', 'Chromium' => '191');
$id2browser = array(..
 190 =>'Chrome' , 191 => 'Chromium'
  ..
);

這樣就不會再誤判成 Safari 了,附上我修改完的版本…

wp-slimstat-ex-mlwmlw.tar

or

https://github.com/mlwmlw/wp-slimstat-ex