2015-09-30

PHP 的 stack trace

若是要追踨單支php的stack,可用如下做法:
$debug = debug_backtrace();
file_put_contents("/path/to/log.txt", date("Y-m-d H:i:s",time())." file:".$debug[1]['file']." php_thread:".getmypid().", mysql_thread:".mysql_thread_id(self::$Link_ID)."(".self::$Link_ID.")\r\n", FILE_APPEND|LOCK_EX);

若是要追踨整個php的stack,可能得用gdb,且前提是php在compile時有加入 --enable-debug 選項:
$ gdb -p $PHP_PID
(gdb) bt     # Get a system-level stacktrace, might already give some info
(gdb) source /path/to/php-src/.gdbinit # Load some useful macros
(gdb) dump_bt executor_globals.current_execute_data
            # Macro from PHP's .gbinit giving PHP stack trace
            # If you for whatever reason are using a thread-safe PHP build you have to do this:
(gdb) ____executor_globals
(gdb) dump_bt $eg.current_execute_data

2015-06-24

youtube id & query string parser

每次看到有人用indexof()、substring()等笨方法去解析字串抓資料,真的看得很痛苦,
請多用正則表示式來解析字串,即簡潔又不易出錯,
畢竟寫程式連基本的正則表示式都不學,而只會用笨方法從字串抓東西,說寫出來的東西有多嚴謹我都不相信。
以下示範二個網頁最常用的parser範例(youtube & query string):
http://jsfiddle.net/24mw91hq/

2015-06-04

TABLE PARTITIONS 分區

為了讓LOG TABLE能分區PARTITION,就用了這個指令....
當然也有能自動化新增PARTITION的指令啦,不過我為了保險起見還是用這種手動的:

ALTER TABLE SMS_LOG
PARTITION BY RANGE(yearmonth DIV 100)
SUBPARTITION BY HASH(yearmonth MOD 100)
(
  PARTITION p2014 VALUES LESS THAN (2015) (SUBPARTITION s0a,SUBPARTITION s0b,SUBPARTITION s0c,SUBPARTITION s0d,SUBPARTITION s0e,SUBPARTITION s0f,SUBPARTITION s0g,SUBPARTITION s0h,SUBPARTITION s0i,SUBPARTITION s0j,SUBPARTITION s0k,SUBPARTITION s0l),
  PARTITION p2015 VALUES LESS THAN (2016) (SUBPARTITION s1a,SUBPARTITION s1b,SUBPARTITION s1c,SUBPARTITION s1d,SUBPARTITION s1e,SUBPARTITION s1f,SUBPARTITION s1g,SUBPARTITION s1h,SUBPARTITION s1i,SUBPARTITION s1j,SUBPARTITION s1k,SUBPARTITION s1l),
  PARTITION p2016 VALUES LESS THAN (2017) (SUBPARTITION s2a,SUBPARTITION s2b,SUBPARTITION s2c,SUBPARTITION s2d,SUBPARTITION s2e,SUBPARTITION s2f,SUBPARTITION s2g,SUBPARTITION s2h,SUBPARTITION s2i,SUBPARTITION s2j,SUBPARTITION s2k,SUBPARTITION s2l),
  PARTITION p2017 VALUES LESS THAN (2018) (SUBPARTITION s3a,SUBPARTITION s3b,SUBPARTITION s3c,SUBPARTITION s3d,SUBPARTITION s3e,SUBPARTITION s3f,SUBPARTITION s3g,SUBPARTITION s3h,SUBPARTITION s3i,SUBPARTITION s3j,SUBPARTITION s3k,SUBPARTITION s3l),
  PARTITION p2018 VALUES LESS THAN (2019) (SUBPARTITION s4a,SUBPARTITION s4b,SUBPARTITION s4c,SUBPARTITION s4d,SUBPARTITION s4e,SUBPARTITION s4f,SUBPARTITION s4g,SUBPARTITION s4h,SUBPARTITION s4i,SUBPARTITION s4j,SUBPARTITION s4k,SUBPARTITION s4l),
  PARTITION p2019 VALUES LESS THAN (2020) (SUBPARTITION s5a,SUBPARTITION s5b,SUBPARTITION s5c,SUBPARTITION s5d,SUBPARTITION s5e,SUBPARTITION s5f,SUBPARTITION s5g,SUBPARTITION s5h,SUBPARTITION s5i,SUBPARTITION s5j,SUBPARTITION s5k,SUBPARTITION s5l),
  PARTITION p2020 VALUES LESS THAN (2021) (SUBPARTITION s6a,SUBPARTITION s6b,SUBPARTITION s6c,SUBPARTITION s6d,SUBPARTITION s6e,SUBPARTITION s6f,SUBPARTITION s6g,SUBPARTITION s6h,SUBPARTITION s6i,SUBPARTITION s6j,SUBPARTITION s6k,SUBPARTITION s6l),
  PARTITION p2021 VALUES LESS THAN (2022) (SUBPARTITION s7a,SUBPARTITION s7b,SUBPARTITION s7c,SUBPARTITION s7d,SUBPARTITION s7e,SUBPARTITION s7f,SUBPARTITION s7g,SUBPARTITION s7h,SUBPARTITION s7i,SUBPARTITION s7j,SUBPARTITION s7k,SUBPARTITION s7l),
  PARTITION p2022 VALUES LESS THAN (2023) (SUBPARTITION s8a,SUBPARTITION s8b,SUBPARTITION s8c,SUBPARTITION s8d,SUBPARTITION s8e,SUBPARTITION s8f,SUBPARTITION s8g,SUBPARTITION s8h,SUBPARTITION s8i,SUBPARTITION s8j,SUBPARTITION s8k,SUBPARTITION s8l),
  PARTITION p2023 VALUES LESS THAN (2024) (SUBPARTITION s9a,SUBPARTITION s9b,SUBPARTITION s9c,SUBPARTITION s9d,SUBPARTITION s9e,SUBPARTITION s9f,SUBPARTITION s9g,SUBPARTITION s9h,SUBPARTITION s9i,SUBPARTITION s9j,SUBPARTITION s9k,SUBPARTITION s9l),
  PARTITION p2024 VALUES LESS THAN (2025) (SUBPARTITION s10a,SUBPARTITION s10b,SUBPARTITION s10c,SUBPARTITION s10d,SUBPARTITION s10e,SUBPARTITION s10f,SUBPARTITION s10g,SUBPARTITION s10h,SUBPARTITION s10i,SUBPARTITION s10j,SUBPARTITION s10k,SUBPARTITION s10l),
  PARTITION p2025 VALUES LESS THAN (2026) (SUBPARTITION s11a,SUBPARTITION s11b,SUBPARTITION s11c,SUBPARTITION s11d,SUBPARTITION s11e,SUBPARTITION s11f,SUBPARTITION s11g,SUBPARTITION s11h,SUBPARTITION s11i,SUBPARTITION s11j,SUBPARTITION s11k,SUBPARTITION s11l),
  PARTITION p2026 VALUES LESS THAN (2027) (SUBPARTITION s12a,SUBPARTITION s12b,SUBPARTITION s12c,SUBPARTITION s12d,SUBPARTITION s12e,SUBPARTITION s12f,SUBPARTITION s12g,SUBPARTITION s12h,SUBPARTITION s12i,SUBPARTITION s12j,SUBPARTITION s12k,SUBPARTITION s12l),
  PARTITION p2027 VALUES LESS THAN (2028) (SUBPARTITION s13a,SUBPARTITION s13b,SUBPARTITION s13c,SUBPARTITION s13d,SUBPARTITION s13e,SUBPARTITION s13f,SUBPARTITION s13g,SUBPARTITION s13h,SUBPARTITION s13i,SUBPARTITION s13j,SUBPARTITION s13k,SUBPARTITION s13l),
  PARTITION p2028 VALUES LESS THAN (2029) (SUBPARTITION s14a,SUBPARTITION s14b,SUBPARTITION s14c,SUBPARTITION s14d,SUBPARTITION s14e,SUBPARTITION s14f,SUBPARTITION s14g,SUBPARTITION s14h,SUBPARTITION s14i,SUBPARTITION s14j,SUBPARTITION s14k,SUBPARTITION s14l),
  PARTITION p2029 VALUES LESS THAN (2030) (SUBPARTITION s15a,SUBPARTITION s15b,SUBPARTITION s15c,SUBPARTITION s15d,SUBPARTITION s15e,SUBPARTITION s15f,SUBPARTITION s15g,SUBPARTITION s15h,SUBPARTITION s15i,SUBPARTITION s15j,SUBPARTITION s15k,SUBPARTITION s15l),
  PARTITION p2030 VALUES LESS THAN (2031) (SUBPARTITION s16a,SUBPARTITION s16b,SUBPARTITION s16c,SUBPARTITION s16d,SUBPARTITION s16e,SUBPARTITION s16f,SUBPARTITION s16g,SUBPARTITION s16h,SUBPARTITION s16i,SUBPARTITION s16j,SUBPARTITION s16k,SUBPARTITION s16l),
  PARTITION p_MAXVALUE VALUES LESS THAN (MAXVALUE) (SUBPARTITION s17a,SUBPARTITION s17b,SUBPARTITION s17c,SUBPARTITION s17d,SUBPARTITION s17e,SUBPARTITION s17f,SUBPARTITION s17g,SUBPARTITION s17h,SUBPARTITION s17i,SUBPARTITION s17j,SUBPARTITION s17k,SUBPARTITION s17l)

);


ref:
http://article.denniswave.com/6342
http://www.codedata.com.tw/database/mysql-performance-tuning
https://mariadb.com/kb/en/mariadb/create-table/#partitions
https://dev.mysql.com/doc/refman/5.1/en/partitioning-subpartitions.html

dynamic partition:
http://stackoverflow.com/questions/13839177/dynamic-mysql-partitioning-based-on-unixtime
http://code.openark.org/blog/mysql/your-magical-range-partitioning-maintenance-query
http://datacharmer.blogspot.co.il/2008/12/partition-helper-improving-usability.html

2015-04-23

APC BE550G-TW UPS 入手

前二天辦公室短暫跳電,CODE打到一半消失...

為了預防慘劇再次發生,自費入手了台APC BE550G-TW UPS放在辦公室。

(本來想買他牌有AVR穩壓的,可惜要嘛價錢較高,不然就是低階的沒有軟體支援...)

科風BNT-500AP/BNT-600AP似乎也不錯,小貴BE550G-TW一些,但有軟體監控(功能較多)跟在線互動(即AVR穩壓),有點小後悔。

這台號稱550va,乘上轉換率0.6來算,大概是330w,夠用了,反正只接主機沒接螢幕。 (低階的轉換率大約是0.6~0.8,高階的可以到0.8以上)

如果是要保持電腦復電後重新開機,記得進電腦BIOS的電源管理,在「Restore on AC Power Loss」(或類似)打開「Power On」,

通常斷電時,UPS的處理步驟是這樣的:

2015-03-23

爬iPeen座標的小程式

昨天幫網友寫的一個爬iPeen座標的小程式。
http://goo.gl/R4EeIW

如果用網頁介面跑到一半會中斷,檢查Apache的 http.conf 及 httpd-mpm.conf
...
Timeout 300000
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 0
...

   ThreadsPerChild    350 #default 150
   MaxRequestsPerChild    10000 #default 0
   ThreadStackSize 8388608 #8MB <--- fmodule="" preg_match="">
...

ini_set('max_execution_time', 0);
ini_set('memory_limit', '2G');
@ob_end_flush();
@ob_implicit_flush();

$page = 2;
$regexp1 = '/(?:[\s\S]*?)]*>([\s\S]*?)<\/a>(?:[\s\S]*?)<\/h3>/i';
$regexp2 = '/(?:[\s\S]*?)longitude"\s+?content="(.*)"\s?\/?>(?:[\s\S]*?)]+?data-action="up_small_classify"[^>]*?>([\s\S]*?)<\/a>(?:[\s\S]*?)]+?data-action="up_address"[^>]*?>([\s\S]*?)<\/a>/i';
$www = 'http://www.ipeen.com.tw';
$www_page = $www.'/search/taiwan/000/4-7-0-0/?p=';

for($i=1;$i<=$page;$i++){
 preg_match_all($regexp1, get_html($www_page.$i), $t);
 foreach($t[1] as $key=>$url){
     preg_match($regexp2, get_html($www.$url), $info);
     echo trim($t[3][$key])."(".$t[2][$key].")\n".trim($info[3])."\n".trim($info[4])."\n".$info[1].", ".$info[2]."\n=================================".PHP_EOL;
    }
}

function get_html($url=''){
    if(empty($url)) return null;
 $opts = stream_context_create(['http'=>['method'=>'GET', 'max_redirects'=>200, 'header'=>"User-Agent: 安全衛士360+hao123\r\n"]]);
 return file_get_contents($url, false, $opts);
}

2015-02-28

無相正法

斯世因緣

你在這個世界無法回憶前世,斯是這個世界的因緣,但,將來去了其他世界,未必無法回憶前世。基本上,我們如同罪人,關押的的地球等同監獄,以致被設置防火牆,無法回憶前世,並配合催眠洗腦(世俗宗教及社會價值觀等)機制,致人們不斷失憶重來。人們被長期催眠,來此世是有課業要完成的,但犯人實際上哪需要完成什麼呢?

不需要學習什麼,首要任務是去回憶起自已是誰,並不要再失憶。

一但能回憶,你就能銜接實相、得慧取智,故人們無意識的學習本來就是不需要的。

人們出生就被強迫灌輸了相信必須繁衍、相信上帝、相信天堂來世等…概念與衝動,這就是一種無意識造成的業。

這些道理要靠自己修行去體證,不要盲目地尋找答案。

無相正法

金剛經要修行人應觀、正觀、正見,星、翳、燈、幻、露、泡、夢、電、雲。九種列表不止是宇宙自然界秒秒在發生也是內觀要面對的九種境界。修行要耐心觀察生滅,直到所緣証得九種禪那心。

《大般若波羅蜜多經.卷第五百七十七》唐三藏法師玄奘奉詔譯
爾時世尊而說頌曰:諸以色觀我,以音聲尋我。彼生履邪斷,不能當見我。應觀佛法性,即導師法身。法性非所識,故彼不能了。
諸和合所為,如星、翳、燈、幻、露、泡、夢、電、雲,應作如是觀。

末法七根

  上上根人,一月證果。
   上根人,一年證果。
  中上根人,二年證果。
   中根人,三年證果。
  中下根人,五年證果。
   下根人,七年證果。
  下下根人,十年證果,三十年證四果阿羅漢。
  行者依循無相正法進修,悟道不難,人人可以證果。

四念法:

  意守呼吸,放空身心。不意守呼吸是難以進行放空身心的步驟,因為意識無著立點。等待放空身心,自然地會忘記意守呼吸才是正確的四念法。每次靜坐的入手都是從意守呼吸開始,直到放鬆入眠、睡覺。若四念法修的好,自然地會得到「四無量心」,也就是「慈、悲、喜、捨」。不修四念法,難以成就四無量心。

  每日靜坐或取淨的時間長達十四個小時,費時三年約可小成。(故取淨門檻各人皆不同)

  慈:「色、眼」,觀死屍、腐敗,轉化入淨而得來的神通力謂之「慈」。
  悲:「聲、耳」,聽惡言、炸聲,轉化入淨而得來的神通力謂之「悲」。
  喜:「香、味」,嘗百苦、腐臭,轉化入淨而得來的神通力謂之「喜」。
  捨:「觸、法」,知五塵之無常,轉化入淨而得來的神通力謂之「捨」。

四觀(四念處):

  「觀身不淨、觀受是苦、觀心無常、觀法無我」。

  四無量心具足才能進行四觀,否則會產生「八觸」,也就是「動、癢、冷、暖、輕、重、滑、澀」。八觸的產生乃是身心沒有放鬆達到一定水平而必然發生的「意識魔受」。勤修四念法可將「八觸轉四無量心」,一切盡在無形之中完成,不需要去取證。

  身心達到高水平的放鬆,是「淨」,乃釋迦牟尼原始教法及行門次第的重要基礎。

參話頭:

  參話頭是一種「頓悟」的行門辦法之一,針對上根利智人而設的教法。原理是從「六七八」的運作得來,非憑空而來。
  參話頭是運用「般若的相對法則」,強迫性的重複夾殺念頭,直到頓悟為止。

  人的心意識只能一次感覺到一個念頭。之所以感覺到念頭是用後來產生的念頭去碰觸而產生的覺受,乃是後來居上的捕捉行為。但是每一個念頭的背景其實仍然有一個念頭隱藏起來,是無法覺受到的念頭,而參話頭就是要利用這兩個念頭(覺非覺、受非受、念非念)來夾殺取證,直證元神(證真如、證佛性)。

  參話頭仍須一定水平的「四念法」為基礎,只是要求較低,不同釋迦牟尼的原始教法需要高深的定力。

2015-02-12

IE取得radio value的問題

假設有如下一個form, 含有二個radio buttons:

Male Female

若不用jQuery而用javascript,在chrome或firefox你可以直接取得checked的value:

document.forms[0].sex.value;

在ie就不是這麼回事了...得先一個個檢查是否checked再取得value:

var radios = document.forms[0].sex;
for(var i=0;i < radios.length;i++){
 if(radios[i].checked) alert(radios[i].value);
}

真的是,好爛...