2012/02/28

網路相關的 Linux 指令

此篇筆記主要是參照以下文章:
http://dougvitale.wordpress.com/2011/12/21/deprecated-linux-networking-commands-and-their-replacements/

文中提到,很多舊的網路相關指令雖然還是可以使用(而且很常用),但其實過時了(Deprecated)。
特別點出的老舊指令有:arp, ifconfig, iptunnel, iwconfig, nameif, netstat, route

作者將推薦的替代指令做成了表格給大家參考,非常用心。
我將自己常用的整理一下,完整的列表請閱讀原作者的 blog。

[arp]

ARP stands for Address Resolution Protocol. ARP is used to find the media access control address of a network neighbour for a given IPv4 Address. arp command manipulates or displays the kernel's IPv4 network neighbour cache. arp command can add entries to the table, delete one or display the current content.

簡單說,ARP 網路協定就是 MAC address 與 IP address 的 mapping,
而 arp 指令就是用來管理 Linux 主機上的 ARP table(或說 ARP cache)。

arp -a [host] 建議用 ip n 來取代,其中 n 代表 neighbor 的意思,應該很好理解。
arp -d [ip] 建議用 ip n del [ip] 來取代,就是刪除 ARP 表內指定的 IP 記錄。
arp -s 建議用 ip -stat n
arp -e

[ifconfig]

ifconfig 建議使用 ip a
ifconfig [interface] 建議使用 ip a show dev [interface]
ifconfig [interface] up 建議使用 ip link set [interface] up
ifconfig [interface] address [address] 建議使用 ip a add [ip_addr/mask] dev [interface]

[netstat]

ss:utility to investigate sockets.
通常預設 ss 會安裝,或使用 sudo yum install iproute 安裝。

netstat -a 換成 ss -a
netstat -l 換成 ss -l
netstat -t 換成 ss -t
netstat -u 換成 ss -u
netstat -s 換成 ss -s
netstat -n 換成 ss -n
netstat -N 換成 ss -r
netstat -r 換成 ip route
netstat -C 換成 ip route list cache

[route]

[iptunnel]

Reference:
http://dougvitale.wordpress.com/2011/11/28/troubleshooting-faulty-network-connectivity-part-1/
http://dougvitale.wordpress.com/2011/12/11/troubleshooting-faulty-network-connectivity-part-2-essential-network-commands/
http://www.study-area.org/network/network_ip_arp.htm
http://www.cyberciti.biz/tips/linux-investigate-sockets-network-connections.html
http://www.cyberciti.biz/files/ss.html

2012/02/15

轉出 UTF8 編碼的 MySQL 檔

這真的是非常煩人的又浪費生命的問題!

如果您跟別人介紹您是一位網頁設計師,您寫 html,您設計 CSS,您使用 MySQL,
可是您不知道什麼是 utf8(!?)
拜託搞清楚它,拜託 ...

網頁 html 是 utf8 編碼,
可傳送到 MySQL 時連線是用 latin1 編碼(沒有先執行 SET NAMES 'utf8';),
存到 MySQL 時將也會是使用 latin1 編碼(MySQL 預設沒有強制轉碼)。

那這個資料庫用 phpMyAdmin 來瀏覽,將會是非常不堪的(phpMyAdmin 是全 utf8 連線)。
不管用什麼編碼都無法將 phpMyAdmin 介面正常顯示資料庫內的中文。
(p.s. 請參考 http://www.adsenseor.com/mysql/256.html 的狀況二)
(p.s. 如果有 Navicat 或類似的 GUI 工具,或許可以正常瀏覽、修改)

請使用 command line 模式進入 MySQL 的 bin 目錄,執行:
mysqldump --default-character-set=latin1 -u root -p 資料庫名稱 > to_utf8.sql

這時候產生的「to_utf8.sql」檔案,
其中的 row of data 的內容是 ANSI 編碼(default-character-set 指定的 latin1)!

在 Winodws 底下,可以用 notepad++ 之類的編輯器開啟「to_utf8.sql」,
然後轉存成 utf8 編碼,按鈕在最上面「檔案、檢視 ...」那排,麻煩找一下,記得存檔。

在 Linux 底下,可以使用:
iconv -f big5 -t utf8 to_utf8.sql > utf8.sql

此時,row of data 的內容也都會轉成 utf8 了。
但完成編碼轉換後,還有很重要的後續工作!

開啟轉成 utf8 編碼的 .sql 檔,應該會發現裡面有些地方還有:
「DEFAULT CHARSET=latin1」

用 vim 或隨便什麼編輯器,把 latin1 全部取代!

在 vim 使用:
%s/latin1/utf8/g

阿彌陀佛,放下 big5,立地成佛。

Reference :
http://www.adsenseor.com/mysql/256.html
http://blog.derjohng.com/2006/01/18/backup-mysql-utf8-data/
http://a-wei.net/archives/4
http://www.phpwact.org/php/i18n/utf-8/mysql
http://akrabat.com/php/utf8-php-and-mysql/
http://tympanus.net/codrops/2009/08/31/solving-php-mysql-utf-8-issues/
http://stackoverflow.com/questions/1707792/problem-in-utf-8-encoding-php-mysql
http://dev.mysql.com/downloads/gui-tools/5.0.html

2012/02/09

呼叫自定義的 Javascript 函式

最近碰到一個有趣的事情,不過說不定其實只是很基礎的問題。
(我基礎沒打好,所以說不定這問題根本不是問題 ...)

果然是很基礎的問題:
Javascript 的 eval 行為與 function pointer

在 http://html5boilerplate.com 的環境下,我寫了這段 javascript 在 script.js 檔:
Test 1
(function($){
$(document).ready(function(){

  function sayHi()
  {
    console.log('hello');
  }

  $(function()
  {
    setInterval( "sayHi()", 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
在執行的時候,Firefox 說:sayHi is not defined

Test 2
(function($){
$(document).ready(function(){

  $(function(){

    function sayHi()
    {
      console.log('hello');
    }

    setInterval( "sayHi()", 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
一樣是 sayHi is not defined.

因為 sayHi() 是在:
(function($){ 底下的 ...
$(document).ready(function(){ 底下的 ...
$(function(){ 底下的 scope 內,
而使用雙引號 "sayHi()" 呼叫時,Javascript 會尋找全域環境下的 sayHi(),當然找不到。

Test 3
(function($){
$(document).ready(function(){

  $(function(){

    function sayHi()
    {
      console.log('hello');
    }

    setInterval( sayHi(), 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
可以執行,但是只執行一次。

因為呼叫時加了 () 等於是執行這個 function,而不是 refer 到這個 function 而不執行。
function 在 Javascript 是類似 object(打類比成 Linux 把所有東西看成檔案一樣)。

Test 4
(function($){
$(document).ready(function(){

  $(function(){

    function sayHi()
    {
      console.log('hello');
    }

    setInterval( sayHi, 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
it works.

sayHi function 的 scope 在:
(function($){ 底下的 ...
$(document).ready(function(){ 底下的 ...
$(function(){ 底下。

setInterval 內的 sayHi refer 到同一層的 sayHi function(object?)

Test 5
(function($){
$(document).ready(function(){

  $(function()
  {
    setInterval( function(){ console.log('hello'); }, 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
it works.
直接綁定一個匿名函式,沒有問題。

Test 6
(function($){
$(document).ready(function(){

  function sayHi()
  {
    console.log('hello');
  }

  $(function()
  {
    setInterval( sayHi, 2000 );
  });

}); // end of $(document).ready
}(jQuery)); // end of all
it works!?

Test 7
function sayHi()
{
  console.log('hello');
}

$(function()
{
  setInterval( "sayHi()", 2000 );
});
it works.

(function($){ 與 $(document).ready(function(){ 都要拿掉,留下任何一個也不行。
如此一來,宣告的 sayHi function 才是在全域範圍下,"sayHi()" 才 refer 得到。

最後,如果要宣告一個全域的 Javascript function,
或是說“假裝”成 Class 那樣用(Javascript 是 classless 的!),
可以這樣做:
var ClassName = window.ClassName = function()
{
    // your code
};
    
ClassName.prototype.method_of_class = function()
{
    // your code
};

function pointer
function scope

Reference:
http://stackoverflow.com/questions/1191833/how-to-run-a-function-in-jquery
http://jquery-howto.blogspot.com/2008/12/what-heck-is-function-jquery.html
http://jibbering.com/faq/notes/closures/
http://www.javascriptkit.com/javatutors/closures.shtml
http://www.robertsosinski.com/2009/04/28/binding-scope-in-javascript/
http://audi.tw/Blog/JavaScript/javascript.eval.asp
http://24ways.org/2005/dont-be-eval
http://docs.jquery.com/How_jQuery_Works
http://jquery-howto.blogspot.com/2008/12/what-heck-is-function-jquery.html