2014年7月20日 星期日

Mac OSX 10.9 查詢listening ports

在Linux中可以簡單透過netstat -tulnp列出目前系統listening ports,但OSX 10.9上這招行不通,要改用以下指令才能查詢到目前系統正在listening的ports

Shiun@ShiundeMacBook-Pro ~ sudo lsof -i -P | grep -i "listen"

2014年7月17日 星期四

Mac OSX Apache 啟用/停止 開機啟動

由於筆者最近跑去玩RoR使用Pow作為web server,之前在MAC上開啟的Apache每次都會開機自動啟動,老實說要手動關後才能開Pow真的很煩,因此筆者上網找要怎麼關閉開機啟動Apache

停止開機啟動Apache

  1. 打開瀏覽器並輸入http://127.0.0.1先確認Apache是開啟狀態,若是關閉狀態請先執行以下指令開啟Apache
Shiun@ShiunMac ~ sudo apachectl start
  2. 打開終端機

  3. 輸入以下指令
Shiun@ShiunMac ~ sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 此時Apache也會被一起關閉


啟用開機啟動Apache

  1. 確認Apache是關閉狀態,若是開啟狀態請先執行以下指令關閉Apache
Shiun@ShiunMac ~ sudo apachectl stop
  2. 打開終端機

  3. 輸入以下指令
Shiun@ShiunMac ~ sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist 此時Apache會跟著一起被啟動

2014年7月14日 星期一

PHP 比對非0字串與整數0時卻回傳true問題

今天強者我朋友遇到PHP比對字串和0時卻發生回傳結果不如預期的問題,因為還挺有趣的所以就筆記下來

以下用簡單的switch case程式碼說明
<?php
$foo = 0;
switch ($foo)
{
    case "str1":
        echo "str1";
        break;
    case "str2":
        echo "str2";
        break;
    default:
        echo "default";
}
?>
Result
str1
由於直覺上0不可能等於"str1"應該要印出"default"才合理,為此筆者翻了一下PHP的文件Comparison Operators,其中有一句話這麼說

If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically. These rules also apply to the switch statement.

簡單翻譯:
   若用"=="比對的是數字和字串時,字串會被轉換為數字再進行比對,此規則也適用於switch-case

因此上述的switch-case程式碼實際比對的流程如下
  1. 由於比對的是整數和字串,因此準備開始轉換字串"str1"為整數
  2. 無法將字串由"str1"轉換為整數,因此PHP將字串"str1"轉換為0
  3. 由於"str1"轉換為0且$foo也為0,因此PHP判斷條件式case "str1"成立印出"str1"到網頁上

同樣的問題可以簡化為
<?php
echo (0 == "str1" ? "true" : "false") . "<br />";
var_dump((int)"str1");
?>
Result
true // 0等於"str1" int(0) // 整數型態的0
顯然地,要比對字串和數字時千萬要小心,不然就是用"==="來進行比對避免出問題
那若我們比對的是0和"1str"呢?
<?php
echo (0 == "1str" ? "true" : "false") . "<br />";
echo (1 == "1str" ? "true" : "false") . "<br />";
var_dump((int)"1str");
?>
Result
false // 0不等於"1str" true // 1等於"1str" int(1) // 整數型態的1 至於為啥會有這樣的結果呢?不要懷疑,就只是PHP的規則如此而已XD

參考資料
1. Comparison Operators