2013年12月15日 星期日

How to fix grub2

今天很不幸的,在 format 完畢後,我的 grub 就死蹺蹺了。
開機時只出現了
error: file not found.
grub rescue> _
如果你確定沒有把開機的 partition 弄壞,可以用以下指令試試看:
  1. ls
    • 會列出所有可用的 partition
    • 例如 (hd0) (hd0,gpt1) ....
  2. 找到可以開機的那個磁區
    • set prefix=(hd0,gpt2)/boot/grub
  3. insmod normal
  4. normal
選單 back。然後就開機吧!

開機完要記得重新裝一次 GRUB
  • $ grub-install /dev/sda
  • $ update-grub
Reference

Ubuntu remove NetworkManager


$ sudo vim /etc/network/interfaces

如果是 dhcp
auto eth0
iface eth0 inet dhcp

如果是指定 ip, 且走 1G
auto eth0
iface eth0 inet static
address 192.168.0.7
netmask 255.255.255.0
gateway 192.168.0.254
pre-up /sbin/ethtool -s eth0 speed 1000 duplex full
dns-nameservers 192.168.0.45 192.168.8.10 8.8.8.8
dns-search foo.org bar.com
$ sudo apt-get purge network-manager
$ sudo ifup eth0

Reference

Linux disk utility

今天終於下定決心,把 mac mini 第二顆硬碟也 format 起來用。

因為是 Mac, 所以首先要了解 GPT, 這是下一代的磁碟分割程式。這是介紹他的文章
這邊紀錄一下他有用到的指令:
  • blkid : 列出在目前 linux 登記有案的磁碟分割區,可以用來查 UUID (在 /etc/fstab 會用到)
  • gdisk : fdisk 只能處理 MBR 分割區格式。如果要處理 GPT 請改用 gdisk
    • gdisk -l : 列出目前分割區。
    • gdisk /dev/sdb : 不解釋
    • 進去 gdisk 後的指令
      • i 2 查看該分割狀態
      • p 同 gdisk -l
  •  lsblk : 取得詞區資訊
$ lsblk -t /dev/sdc
NAME   ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE
sdc            0   4096      0    4096     512    1 cfq       128
|--sdc1         0   4096      0    4096     512    1 cfq       128
|--sdc2         0   4096      0    4096     512    1 cfq       128
|--sdc3         0   4096      0    4096     512    1 cfq       128

這裡很有趣的是我們要看 PHY-SEC 的部分。這代表硬碟設計的時候每個 sector 是多少。新的大容量磁碟會是 4096 bytes (4K), 古早以前的硬碟會是 512 bytes。這要端看我們打算如何使用這顆硬碟。新的硬碟仍然可以把它格式化成 512 bytes,但是會進入相容模式,這樣我們就沒辦法善用這顆硬碟。


2013年12月14日 星期六

bash autocomplete 實作教學

最近在練習寫 bash 的指令自動補完。就是按兩下 Tab 就會把可以用的東西列出來,並且如果列出來的東西都有相同的開頭,他還會自動幫你補完,一直補到不一樣的東西為止。

開始開發以後,才發現這真的是 bash 自己提供的功能,相關產生名單的機制他也有指令可以幫你做好。

其實一般而言,要補完的東西不外乎這幾樣:
  • 檔名 & 目錄
  • 可用的命令與參數
  • 連線的機器
這些東西其實 bash 都已經有 compgen 指令幫我們做好了,我們只要拿來用就可以了。

另外要熟悉的是在 bash script 中,陣列的操作方式。

如何使用 compgen 

語法


compgen [參數] [清單] -- [目前已經輸入的內容]

補完自訂清單 (-W)


這是最常使用的功能。假設你有以下四個指令 list arg1 arg2 ls。你目前已經輸入 arg。那可以在 bash 環境下面試試看:

$ compgen -W "list arg1 arg2 ls" -- arg
arg1
arg2
$

補完目錄 (-d)


假設你有 dir1/ 和 dir2/ 兩個目錄,目前已經輸入 di。可以在 bash 環境下試試看:
$ compgen -d -- di
dir2
dir1
$

補完檔案 (-f)


假設目前有這六個檔案  file11  file12  file21  file22  text1.txt  text2.txt。可以在 bash 環境下試試:
  • 列出 file 開頭檔案: compgen -f -- file
  • 列出 txt 副檔名的檔案: compgen -f -X '!*.txt' --

補完機器清單 (-A) 

  1. 建立一個機器清單文字檔,一行一個 hostname。假設我們有以下機器:
    • host11.test.com
    • host12.test.com
  2. 把文字檔路徑指定到 HOSTFILE 環境變數
    • export HOSTFILE=~/testarea/hostlist
  3. $ compgen -A hostname -- ho

撰寫產生 list 的 bash function

讓我們看一下最簡單的範例。補完指令 --help --verbose --version。
(範例來自 www.debian-administration.org) 
_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo

我們產生了 _foo() 含式,並且用 complete 這個指令告訴 bash, foo 這個指令可以用 _foo() 這個含式來產生自動補完清單。

讓我們看一下 _foo() 裡面有哪些是重要的變數。
  • COMP_CWORD: 目前所在的 index
  • COMP_WORDS: user 輸入的指令 array
  • COMPREPLY: 產生出來的可用指令的 array。
$cur 就是目前使用者輸入的最後一個字。$prev 就是使用者輸入的前一個字。

剩下的,就是 bash 中複雜的 array 寫法了。
 

參考資料

  • http://www.debian-administration.org/article/317/An_introduction_to_bash_completion_part_2

2013年8月21日 星期三

Sphinx - documentation generator

Sphinx 是一套用 python 寫的文件產生工具。
他使用 reStructedText 作為文件標記語言。

原本想要寫點甚麼的,不過發現手冊還蠻完整的,就不多說了。

Installation

  •  sudo apt-get install python-sphinx

Reference

2013年7月27日 星期六

memcached quick note

Installation

  • sudo apt-get install memcached

Command line

  •  $ telnet localhost 11211
add foo 0 0 11
hello world
STORED
get foo
VALUE foo 0 11
hello world
END
delete foo
DELETED

PHP extension

  • sudo apt-get install php5-memcached
$m = new Memcached();
$m->addServer('localhost', 11211);

$m->set('int', 99);
$m->set('string', 'a simple string');
$m->set('array', array(11, 12));
/* expire 'object' key in 5 minutes */
$m->set('object', new stdclass, time() + 300);


var_dump($m->get('int'));
var_dump($m->get('string'));
var_dump($m->get('array'));
var_dump($m->get('object'));
?>

Example from: http://www.php.net/manual/en/memcached.set.php

Reference

2013年6月3日 星期一

PHP Extensions: php-filter & php-tidy

今天介紹兩個有用的 PHP Extensions: php-filter  & php-tidy。

php-filter

這是 input validator,可以用來過濾使用者輸入的資訊,避免 XSS 攻擊。
在 Ubuntu 中,如果 PHP 版本 > 5.2 ,則已經內建了這組函式庫。

使用範例:從 GET 裡面取得 'source' 變數。也就是我們要 Filter $_GET['source'] 的值

$source = filter_input(INPUT_GET, 'source', FILTER_SANITIZE_STRING);

參考文件:http://php.net/manual/en/book.filter.php

php-tidy

這可以幫你整理/修復 HTML 碼,讓 HTML 比較好被處理。
通常用在需要 parsing HTML 的時候。

Ubuntu 安裝:sudo apt-get install php5-tidy

使用:

$config = array(
                       'indent'         => true,
                );

$tidy = new tidy();
$tidy->parseString($html, $config, 'utf8');
$tidy->cleanRepair();

$output = (string) $tidy;

參考文件:

2013年3月9日 星期六

Windows 遠端桌面連線到 Ubuntu Desktop

我使用的 Ubuntu 版本是 12.04 LTS

Windows 遠端桌面用的是 RDP Protocal。
在 Linux 上可以藉由 xrdp 這個軟體讓 Ubuntu 桌面支援這個通訊協定,這樣我們就可以利用 Windows 的遠端桌面連線 Client 連到遠端的 Ubuntu Desktop。

安裝

Ubuntu 已經包好現成的 package,裝好就可以用了。
  • sudo apt-get install xrdp

設定

不用修改設定就可以使用。設定檔在 /etc/xrdp/xrdp.ini
如果你有用防火牆,記得開啟 3389/tcp

ufw 指令
  • sudo ufw allow from 192.168.1.0/24 to any port 3389 proto tcp

現在你可以從 Windows 的機器連過去看看,應該可以正常使用了。

參考資源

2013年3月3日 星期日

Ubuntu 動物機 + dlna Server

最近身邊有一些人在玩 NAS, 我也想用手做來架一個。我的需求:
  • BT 動物機 - Headless Transmission
  • DLNA Server - minidlna
Ubuntu: 12.04 LTS

廢話不多說, 直接來裝吧。

Headless Transmission

安裝 transmission-daemon + 設定防火牆 ufw
sudo apt-get install transmission-daemon
cd /home
sudo mkdir -p ./torrents/download
sudo mkdir ./torrents/upload
sudo mkdir ./torrents/incomplete
sudo chown -R debian-transmission:debian-transmission ./torrents
sudo chmod g+w -R ./torrents/
sudo ufw allow 9091
sudo ufw allow proto tcp to any port 49152:65535
sudo /etc/init.d/transmission-daemon stop
sudo vim /etc/transmission-daemon/settings.json
設定 /etc/transmission-daemon/settings.json
"download-dir": "/home/torrents/download",
"incomplete-dir": "/home/torrents/incomplete",
"incomplete-dir-enabled": true,
"rpc-authentication-required": true,      // 需要驗證
"rpc-whitelist": "127.0.0.1,192.168.*.*", // 可以連線的 ip
"rpc-username": "你的帳戶",
"rpc-password": "你的密碼",
"umask": 2, // 讓下載的檔案 user & group 擁有相同權限
"port-forwarding-enabled": false,
"peer-port-random-on-start": true,
"upload-limit": 100,       // 上傳限制 100 K
"upload-limit-enabled": 1, // 啟用上傳限制
把你的帳戶加入 transmission 所屬 group
sudo usermod -a -G debian-transmission
讓 transmission-daemon 重新讀取設定 (當他關閉時會自動複寫 settings.json)
invoke-rc.d transmission-daemon reload
啟動 transmission-daemon
sudo service transmission-daemon start
打開瀏覽器, 輸入網址
http://:9091/transmission/web/
就可以開始用網頁操作了。

minidlna

安裝
sudo apt-get install minidlna
建立 DLNA server 檔案目錄
sudo mkdir -p /d/music
sudo mkdir -p /d/photo
sudo mkdir -p /d/video
sudo chown -R minidlna:minidlna /d/

sudo mkdir -p /var/{cache,log}/minidlna
sudo chown -R minidlna:minidlna /var/{cache,log}/
設定防火牆 ufw (我的區網是 192.168.1.*)
sudo ufw allow from 192.168.1.0/24 to any port 1900 proto udp
sudo ufw allow from 192.168.1.0/24 to any port 8200 proto tcp
設定 /etc/minidlna.conf

把下面設定註解取消,並改成設定的值
friendly_name=Ubuntu DLNA Server    # 要顯示的名稱
network_interface=eth1  # 如果不是 eth0, 請指定

media_dir=A,/d/music
media_dir=P,/d/photo
media_dir=V,/d/video

db_dir=/var/cache/minidlna
log_dir=/var/log
inotify=yes         # (default)
enable_tivo=no  # (default)
strict_dlna=no    # (default)
notify_interval=900  # (default)
serial=12345678  # (default)
model_number=1  # (default)
重建 media db & restart
sudo service minidlna stop
sudo service minidlna force-reload
sudo service minidlna start

參考資源

2013年2月17日 星期日

Nokia Symbain to Android

最近 push 老人家,把 Nokia Symbain 手機改成 Android 手機。

但是因為受害者被迫強制轉移 (直接買一台手機送他叫他用 XD),加害者當然也要幫忙把該轉的東西轉過去。
 在尋找解法的時候,也漸漸體會舊式手機在一些設計上的哲學以及厲害之處,也是智慧型手機可以藉進改善的地方。不過這是題外話。

這邊講主要的聯絡人和簡訊的方法。

工具

備份 Nokia 手機

  • 安裝 Nokia 電腦端套件
  • 將原本手機資料全部備份, 會產生一個 .NBU 檔案

讀取並解開 Nbu 檔

  • 安裝對應的 .NET Framework
  • 解開並執行 NbuExplorer
  • File -> Open -> 開啟剛剛產生的 .NBU 檔案
  • File -> Export all -> 選擇匯出目錄 (例如: exports)
    • exports/Contacts/*.vcf : 每個 vcf 就是一個聯絡人
    • exports/Messages/*/*.vmg: 每個 vmg 就是一封簡訊

將聯絡人匯入到 Gmail 通訊錄

  • 首先要把所有 vcf 合併成一個檔案
    • cd exports/Contacts
    • copy /B *.vcf output.vcf
    • output.vcf 就是合併後的檔案
  • Gmail -> 通訊錄 ->  匯入通訊錄...
  • 將 output.vcf 上傳即完成匯入動作

將簡訊匯入

ABC Amber Nokia

  • 安裝並執行 ABC Nokia
  • Open a folder with VMG files
    • 選擇 exports/Messages 或其下面某些子目錄
  • 將所有簡訊選起來
  • Export (destination) 選擇 CSV
  • 按下 Save As... 存成指定 CSV 檔案

將 CSV 轉成 SMS Backup & Restore 可以吃的 XML 格式

使用 SMS Backup & Restore 匯入簡訊

  • 將 output.xml 複製到 Android 手機裡面
  • 可用 SMS Backup & Restore 先查看要匯入的檔案再決定是否匯入

其他方法