2016年4月18日 星期一

[Pidgin] Linux 上面安裝 Line 不用跑 Wine 的方法

Linux 上面可以用 pidgin 跑 facebook, google talk, IRC 等等通訊協定,所以今天的問題:「 Linux 上面要跑 Line 」的話,要怎麼做?

第一步:安裝 Pidgin
sudo apt-get install pidgin

第二步:安裝 libthrift 跟 purple-line
sudo apt-get install libthrift0
wget https://dl.dropboxusercontent.com/u/1117561/linux/purple-line_0.1.2-ubuntu2-trusty_amd64.deb
sudo dpkg -i purple-line_0.1.2-ubuntu2-trusty_amd64.deb


第三步:設定 Line 帳號

搞掂 !!

----

第二步應該會找不到套件來源,就在 sources.list 裡面加入:
deb http://debian.altrepo.eu/ trusty main

更新 key:
curl http://debian.altrepo.eu/altrepo_eu.pub|sudo apt-key add -
就好。


----
參考資料:
* ubuntu - 在 ubuntu 上不利用 WINE 運作 Line (Pidgin + purple-line)

2016年3月1日 星期二

[翻譯][Ubuntu] 14.04 安裝 Android Studio

簡單說明一下, Android Studio 是 Android 上面的開發工具,在 Ubuntu 上面安裝尤其方便。所以這邊找到一篇 How to Install Android Studio in Ubuntu 14.04/14.10/12.04 via PPA 時,就蠻想為它做個分享和記錄。

道先說明 Android Studio 有什麼特別的:

  • Gradle-based build support.
  • Android-specific refactoring and quick fixes.
  • Lint tools to catch performance, usability, version compatibility and other problems.
  • ProGuard and app-signing capabilities.
  • Template-based wizards to create common Android designs and components.
  • A rich layout editor that allows you to drag-and-drop UI components, preview layouts on multiple screen configurations, and much more.
  • Built-in support for Google Cloud Platform, making it easy to integrate Google Cloud Messaging and App Engine as server-side components.

再來是如何在 Ubuntu 上面透過 PPA 安裝:
先來安裝 Java 環境:
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java7-installer oracle-java7-set-default

再來安裝 Android Studio 的部份:
sudo apt-get update
sudo apt-get install android-studio


----
參考來源:How to Install Android Studio in Ubuntu 14.04/14.10/12.04 via PPA

2016年2月2日 星期二

[Linux] scp 傳大檔時接續傳檔

scp 傳大檔是一件蠻痛苦的事情,尤其是傳大檔遇到要 resume 的時候,遇到網路不穩時,要重傳時真的是很容易讓人捉狂。
還好 google 有找到一個方案:

rsync --partial --progress --rsh=ssh local_file user@host:remote_file

或

rsync --partial --progress --rsh=ssh user@host:remote_file local_file


---
參考資料:
http://stackoverflow.com/questions/20860896/is-there-a-way-to-continue-broken-scp-secure-copy-command-process-in-linux

2016年1月31日 星期日

[Linux] Pidgin 登入臉書 認證失敗 xmpp 未認證問題解法

pidgin 想要登入臉書,大概會遇到些問題,還好 google 大神給了解決辦法,只要安裝一個 purple-facebook 的 plugin 就好:


sudo sh -c "echo 'deb http://download.opensuse.org/repositories/home:/jgeboski/xUbuntu_$(lsb_release -rs)/ /' >> /etc/apt/sources.list.d/jgeboski.list"
cd /tmp && wget http://download.opensuse.org/repositories/home:/jgeboski/xUbuntu_$(lsb_release -rs)/Release.key
sudo apt-key add - < Release.key
sudo apt-get update sudo apt-get install purple-facebook


然後再來就是把 pidgin 煩死人的登入登出提醒關掉,這樣臉書總算可以用 pidgin 來傳訊息了。

--

參考:
* ubuntu 上面可以登入 facebook 的 client 軟體:
http://askubuntu.com/questions/662249/chat-client-supporting-facebook
* 如何關掉煩死人的臉書提醒:
https://adamwright.wordpress.com/2013/03/05/how-to-disable-pidgins-annoying-facebook-notifications/

2015年7月21日 星期二

[Linux][Ubuntu][14.04] 啟用你的 cryptswap

灌好 Ubuntu Linux 才發現原來 swap 沒有啟用。但是看 /etc/fstab 明明就說了 "# swap was on /dev/sda1 during installation"
好吧,Open Source 就是這樣,有些東西你得自己來,這是可以想見的。

所以接下來先檢查一下,系統有沒有啟用 swap 呢,可以使用下面的指令:
$ sudo swapon -s
呃,什麼都沒有,也對,這本來沒有東西,我才會現在來加 swap 啊 ...

Okay,正式來了。因為我在安裝 linux 的時候,已經給了 /dev/sda1 當 swap ,所以現在我只需要先 mkswap partition,理論上就可以開始用了。但是看了一下 /etc/fstab 才知道,原來已經有 cryptswap 可以用了。(應該是加密的 swap 格式吧,我沒摸過,所以就別獻醜了 ..)

mkswap 的指令是:
$ sudo mkswap /dev/sda1

然後執行
$ sudo ecryptfs-setup-swap

做完之後,它會到 /etc/fstab 裡面把你的 UUID 填上去,然後再去 /etc/crypttab 裡面把 swap 的部份也填上去。
這樣, swapon -s 的時候就應該有看到你的 swap 已經生效了。

更新 (20160315):
在 /etc/rc.local 裡面加上這幾行就好
sed -ie '/cryptswap1 UUID=/d' /etc/crypttab
mkswap /dev/sdb1
swapon /dev/sdb1
ecryptfs-setup-swap -f
swapon -s


--
參考文件:

  • http://fonger.logdown.com/posts/2015/02/01/setting-swap-for-ubuntu-to-solve-out-of-memory
  • http://askubuntu.com/questions/341979/what-to-do-about-the-disk-drive-for-dev-mapper-cryptswap1-is-not-ready-yet-or
--
更新[20150804]:
要確定現在有沒有用 cryptswap ,就打
$ sudo blkid | grep swap
應該要看到類似下面的結果:
/dev/sda1: UUID="b04fa6e3-4880-4b44-8aa6-c40157096595" TYPE="swap"
/dev/mapper/cryptswap1: UUID="34b3a33b-9b85-4fc3-b725-ded9e2c28295" TYPE="swap"

2015年7月20日 星期一

[LVM][快速參考] Ubuntu 上面 mount LVM 的磁區

老實說,Linux 上面 LVM 的技術用了很久了,但是我一直不大想用這個東西,而且 lvm 的 parition 用起來也覺得好麻煩,所以一直都沒有用。直到今天在 notebook 上面用 sdd 而重灌了我的 ubuntu 之後,才想到舊的資料要拿出來這件事,於是去查了一下 LVM 的使用方法:

sudo apt-get install -y lvm2
sudo fdisk -lu /dev/sdb
sudo lvscan # 查看目前可以用的 lvm partition
sudo lvchange -a y /dev/fedora/home # 讓 partition 生效,會在 /dev 底下長出 mount point
sudo mount /dev/fedora/home MOUNT_DIR


這樣就可以使用了

參考資料:
* http://www-01.ibm.com/support/docview.wss?uid=swg21501082

2015年6月24日 星期三

[Linux][HTTPFS2] ubuntu 上面使用 httpfs

用過 sshfs 的使用者大多覺得 sshfs 真是好用,除了 ssh 本身連線的速度會比較慢是難以避免的問題之外,其它的用起來的感覺就好像在本機上面直接使用一個檔案目錄一樣。所以很多時候,我也都愛用 sshfs 在近端網路(LAN)來代替 ftp 傳來傳去,或著 samba/cifs 這種過時的解決方案。

然而,對 server 管理員而言, ssh 帳號並不是那麼安全,可以很簡單的送人,所以大多時候,我們都還是給個 htaccess/mysql 的帳號就好,避免使用者直接接觸 server  的檔案系統,也可以避免掉大多數的 linux local exploits 的問題。

但是這樣子一來,原本用 sshfs 用的很開心的人就不開心了啊... 還好 Linux 上面的 solution 很多,我們可以安裝 httpfs2 來用,在 ubuntu 底下只要下:
sudo apt install -y httpfs2
就可以開始使用 httpfs2。

注意事項:

  • 請開啟 web server 的 webdav 功能,不然就會遇到下面的錯誤:


httpfs2: HEAD: server must Accept-Range: bytes
httpfs2: HEAD: exchange: server error


參考資料:
* https://altiscale.zendesk.com/hc/en-us/articles/202461926-Process-Data-Using-the-HttpFS-Service-in-your-Altiscale-Cluster
* https://code.google.com/p/mongoose/issues/detail?id=250

2014年7月28日 星期一

[Linux][script] gif 回放 script

因為每次看 gif 圖片,都會看到像這樣的東西:
覺得好像最後跳躍的感覺很不自然,所以心裡想說,用回放的機制就可以讓 gif 看起來比較自然了不是?
所以就用 imagick tool 寫了一個 script ,然後產生下面的結果:
這兩個結果,應該看得出來,下面那個比較自然一點了。(有嗎?

好啦,反正就是一個工具而已,試試看?

2014年7月1日 星期二

[Linux] Gnome-Shell Extension 推薦

Gnome-Shell 是這兩年 Linux 發行版上比較常見的視窗介面。它的特點除了漂亮之外,就是它的延伸套件(extension)相當容易撰寫。因此官方特別為了延伸套件的功能提供了一個安裝網站,你可以在 https://extensions.gnome.org/ 很簡單的找到最新公開的延伸套件,也可以在 https://extensions.gnome.org/local 管理自已已經安裝的延伸套件。

但是怕大家不知道要裝什麼延伸套件,所以今天才來推薦幾個簡單又必安裝的延伸套件 :

頭一個就是天氣功能(Open Weather):


特點就是有台灣的地標。(但是可惜不是每一個縣市都有測點,所以反正它是開源軟體,或許之後可以修改這個延伸套件成為適合台灣的版本)

第二個是輸入法指示區(Input Method Panel):


特點就是因為大家都不喜歡 ibus ,所以 gnome-shell 上面還是需要一個不是 ibus 的輸入法指示區來說明現在輸入法的狀態。

第三個就是處理 alt + tab 的問題(Alternate Tab):

其實在官網上面還有好幾個延伸套件也不錯,不過我選了一個比較陽春簡單的,但是不論是哪一個都還是很不習慣預設的操作方式,還好我們還有別的選擇。

最後一個要推薦延伸套件是 gpaste integration:

Gpaste 是 gnome 上面類似 xclip 可以把 command line 的 i/o 丟到 X 的剪貼簿的工具。但跟Clipboard indicator 不同的是,這個延伸套件需要 gpaste 的支援,所以你還需要安裝 gpaste,如果不想裝,可以只裝 Clipboard indicator 就好,但是 gpaste 這個功能真的蠻好用的,不但可以保留剪貼簿過去的歷史,還可以按個滑鼠右鍵就刪除跟調整,避免某些不想要留在歷史裡的東西被看到。

2014年6月15日 星期日

[Linux][Fedora] Fedora 20 上面安裝 fcitx

其實 Fedora 20 發布一段時間了,但是 ibus 的使用一直都覺得很不趁手,所以也難怪常常都看到人家把 ibus 移除然後裝 gcin 或 fcitx 的情況。這邊要記錄一下 Fedora 20 安裝 fcitx 輸入法的流程:

1. 移除 ibus
2. 安裝 fcitx
3. 指定輸入法
4. 設定 fcitx

1. 移除 ibus 的動作:
sudo yum remove ibus 

2. 安裝 fcitx: (這邊需要安裝最起碼是 fcitx fcitx-table-chinese fcitx-configtool fcitx-qt4,但是我偷懶,所以我就直接下 fcitx*)
sudo yum install fcitx* 

3. 指定輸入法,這邊也需要解除 gnome 對 ibus 的依賴,所以要先下:
gsettings set org.gnome.settings-daemon.plugins.keyboard active false 
然後查看一下你的輸入法目前的狀態,應該要下面這樣:
$ imsettings-info 
Xinput file: /etc/X11/xinit/xinput.d/fcitx.conf
GTK+ immodule: fcitx
Qt immodule: fcitx
XMODIFIERS: @im=fcitx
XIM server: /usr/bin/fcitx -D
Preferences: /usr/bin/fcitx-configtool 
Auxiliary:  
Short Description: FCITX
Long Description: 
Icon file: /usr/share/pixmaps/fcitx.png
Is system default: TRUE
Is user default: TRUE
Is XIM server: FALSE

所以我們需要修改 bash 環境,加入這三樣:
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx" 

可以直接用 vim 加到 /etc/profile 最下面,或著加入自已的 $HOME/.bashrc 就好。

這邊因為 ibus 移除了,所以理論上應該 imsettings-info 出來就只有 fcitx 可以選,它應該會自已跳成 default ,
如果沒有的話,就乾脆安裝 im-chooser 來選擇 fcitx 。

4. 設定 fcitx:這邊不想講輸入法表格的部份,想講的是 gnome3 的 panel ,可以開 firefox 安裝 input method panel。有輸入法的 status 的話,使用才會方便。如果要設定輸入法的話,可以再按裡面的 "IM Settings"


------
參考資料:
* http://shliyae.blogspot.tw/2013/07/fedora-19-fcitx.html
* http://yanue.net/post-140.html
* http://forum.ubuntu.org.cn/viewtopic.php?f=35&t=454042

2014年2月10日 星期一

[tiny] firefox 跟 google-chrome 跳過擋 port 的限制

Google 跟 firefox 都會針對某些安全上的考量,所以不允許用某些 port 來瀏覽網路。所以像 http://URL:110/ 或 http://URL:21/ 這樣的 URL 都會被擋下來,避免非法的使用。

但是這樣的使用方式,其實在某些 MIS 管的很嚴雞婆的時候,就會造成妨礙。

所以這篇要簡短註記一下, firefox 跟 google-chrome 怎麼跳過這種限制:

firefox 是在 pref.js 底下加入:
user_pref("network.security.ports.banned.override", "110,21"); 

google-chrome 是在 command line 底下加入:
--explicitly-allowed-ports=601

--
2014-02-20 更新:
google-chrome 在 linux 底下啟動 script 的修正有點麻煩,改在 google-chrome.desktop 底下基本上是沒辦法用到 xdg-open 上面的,所以要更新到 /usr/bin/google-chrome 的啟動的 script 裡面去:
--- /usr/bin/google-chrome.old      2014-02-20 10:21:54.072225459 +0800
+++ /usr/bin/google-chrome   2014-02-20 10:21:03.460228563 +0800
@@ -48,5 +48,6 @@
   fi
 fi
 
+EXTRA_OPT="--explicitly-allowed-ports=110,21"
 # Note: exec -a below is a bashism.
-exec -a "$0" "$HERE/chrome" --user-data-dir="${XDG_CONFIG_HOME:-${HOME}/.config}/google-chrome-unstable" "$@"
+exec -a "$0" "$HERE/chrome" --user-data-dir="${XDG_CONFIG_HOME:-${HOME}/.config}/google-chrome-unstable" "$@" $EXTRA_OPT

--
參考資料:
* http://www-archive.mozilla.org/projects/netlib/PortBanning.html
* https://productforums.google.com/forum/#!topic/chrome/wVmm0ZPexbA

2013年12月10日 星期二

[HACK] IP-CAMERA ID002A firmware backup [2]

之前寫過這篇 Hack ID002A Camera 的記錄,成功的更新 WebCam 的 script。

後來在 chrome 上面找到 tampermonkey 可以直接修改 script ,就寫了下面 script 出來,現在可以直接使用方向鍵上、下、左、右來控制 webcam 的方向了。

// ==UserScript==
// @name My Fancy New Userscript
// @namespace http://use.i.E.your.homepage/
// @version 0.1
// @description enter something useful
// @match http://YOUR_WEBCAM_URL:PORT/*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js
// @copyright 2012+, You
// ==/UserScript==
document.body.onkeydown = function(e){
var lbl, cmd;
switch (e.which) {
case 38: /* Up */
lbl = "Up";
break;
case 40: /* Down */
lbl = "Down";
break;
case 37: /* Left */
lbl = "Left";
break;
case 39: /* Right */
lbl = "Right";
break;
}
cmd = "/cmd.xml?cmd=moveptz&tick=100&dir=btnPtz" + lbl + "&nPtzTimes=0";
$.ajax({url: cmd, success:function(event){
var cmd = "/cmd.xml?cmd=moveptz&tick=100&dir=none&nPtzTimes=0";
$.ajax({url: cmd });
}});
};


--
參考資料:
[HACK] IP-CAMERA ID002A firmware backup

2013年11月13日 星期三

[Linux][Kernel] MAC_FMT 跟 NIPQUAD_FMT

在寫 kernel module 的時候,我們常常會需要寫到 ip format 的的資料印出來 debug,但是每次都
printfk("%d.%d.%d.%d") 寫到累,後來發現原來這樣寫就可以:
printk(KERN_INFO "br0 ip:"NIPQUAD_FMT"\n", NIPQUAD(br0_in_dev->ifa_list->ifa_address));
然後接著又發現了,原來常用的 ip 有這種簡單的 macro 定義,當然 mac address 也會有:
#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
printk("sa = '"MAC_FMT"' \n", MAC_ARG(mach->h_source));

這是早就發明好的輪子,如果不會用的話,是不是很可惜呢?

2013年11月11日 星期一

[Linux][FUSE] 在 Linux 上面使用 google drive 的方法

由於 Google 官方並不提供 google drive 的工具,所以在 Linux 上面只能使用 web 介面來存取 Google Drive 上的檔案。這點對 Linux 上面 Google Drive 的使用者而言實在是一大遺憾。還好有人找出了可以使用 Google Drive 的方法,就是使用 Linux 上面已經很常見的 fuse 的 solution。

(總共四個步驟)
第一步:
你需要先安裝 google-drive-ocamlfuse ,所以在 debian 上面你可以這樣下: $ sudo apt-get install ocaml camlp4-extra
$ git clone https://github.com/OCamlPro/opam.git
$ cd opam
$ ./configure
$ make
$ sudo make install
$ sudo apt-get install m4 libcurl4-gnutls-dev libfuse-dev libsqlite3-dev
$ opam init
$ opam update
$ opam install google-drive-ocamlfuse

在 fedora 上面可以這樣下:
$ sudo yum install ocaml ocaml-camlp4-devel ocaml-ocamldoc
$ git clone https://github.com/OCamlPro/opam.git
$ cd opam
$ ./configure
$ make
$ sudo make install
$ sudo yum install m4 fuse fuse-devel libcurl-devel libsqlite3x-devel zlib-devel
$ opam init
$ opam update
$ opam install google-drive-ocamlfuse

裝完之後需要在你的 PATH 裡面加入 $HOME/.opam/system/bin
原文是建議在 .bashrc 裡面加入。

第二步 你需要把自已的 id 加入 fuse 的群組
$ sudo usermod -a -G fuse
$ exec su -l $USER


第三步 獲得 Google 的授權,在 console 底下執行
google-drive-ocamlfuse
它會呼叫瀏覽器,然後給予你的 application 一份授權認證。

第四步,也是最後 執行 google-drive-ocamlfuse ~/googledrive
如果是 gnome 的使用者的話,可以在 .config/autostart 裡面加入一個 local_start.desktop 的檔案內容會像是:
[Desktop Entry]
Name=Local Start
GenericName=File Synchronizer
Comment=Sync your files across computers and to the web
Exec=/home/xxxxx/.local/bin/autostart
Terminal=false
Type=Application
Icon=dropbox
Categories=Network;FileTransfer;
StartupNotify=false
Name[zh_TW]=local_start.desktop
GenericName[zh_TW.utf8]=local start
Comment[zh_TW.utf8]=local my start script

然後再在這個 .local/bin/autostart 的 script 裡面加入上面提到的 google-drive-ocamlfuse ~/googledrive 執令就可以。

2013-12-03 更新:忘了附上 原文出處

[Linux][script] cp 的進度表

很早以前看過類似這邊(ubuntu 論壇)的問題,希望 cp 的時候可以有個進度條。同樣的需求在 google 裡面可以找到其它的解決方式,例如用 rsync 又可以有進度又可以保留權限之類的提案。

但是 rsync 的問題是,不如 cp 的直覺/簡單,而且權限那些東西,只要下 -a 就解決了,不是?

所以如果聚焦在進度這件事情上面的話,其實可以使用 strace 來處理,很簡單就有下面這樣的效果:
做法是在 $HOME/.bashrc 底下加入一個 function:
cp_p() {
strace -q -ewrite cp -- "${1}" "${2}" 2>&1 \
| awk '{
count += $NF
if (count % 10 == 0) {
percent = count / total_size * 100
printf "\b\b\b\b\b%03d %%", percent
}
}
END { print "\nDone\n" }' total_size=$(stat -c '%s' "${1}") count=0
}

需要使用時就用 cp_p 就可以

2013年10月20日 星期日

[Software][Linux] Xmind 畫流程圖

XMind 是一款很好用的心智圖軟體,我想很多人都知道了,但是沒有想到這款軟體原來跟 dia 一樣都可以拿來畫流程圖,而且其實畫的還不錯。

像下圖這樣的流程圖,其實只花了半個鐘頭不到,透過先畫流程圖的動作,就可以很簡單的把一些流程上的問題都過濾掉,或著先跟客戶跑過一遍,這樣就可以減少很多溝通上的問題,其實是很好的開發必備的技巧。



--
附件是給 Fedora 用的 beta rpm 包裝,因為是 beta 版本,所以每次都要上官網 download .deb 然後再自已 alien 成 rpm 才能使用。避免麻煩,我直接上傳 rpm 待用。
* Xmind Beta RPM Download

en → zh
Fedora的

2013年10月6日 星期日

[HACK] IP-CAMERA ID002A firmware backup

在 PCHOME 買了一台 IP-CAM 然後意外的在 這邊 找到很多有趣的討論。本來以為會很順利的刷新的軟體,結果不小心把整台 IP-CAM 都刷到不能動,還好這台的相關資料還不算太難找(只花了我兩個星期而已 Orz),所以最終把舊的版本再刷回來,然後看看是不是哪天想不開再回來改。


--
韌體備份:https://docs.google.com/file/d/0B0Ho92zQYcPCR1prM1BtZzdZVG8/edit?usp=sharing

2013年8月7日 星期三

[tiny][Ubuntu][Dropbear]

莫名奇妙我的 Ubuntu 不能連上開發的 dropbear server ,後來發現卡在 SSH2_MSG_KEXDEH_REPLY 的這個階段。
所以按下面重新設定 ssh client config (/etc/ssh/ssh_config) 的 Cipher 就解決了。

Cipher 3des-cbc
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc

2013年7月15日 星期一

[Kernel] 找出行程並傳送訊號

只是找一個 send_sig 的範例而已,找了半天看到不少範例,所以想做一個整理記錄,「如何在 Linux Kernel 中找出行程,並傳送訊號到這個行程」。這只是 Kernel 和 userspace 溝通的其中一個方法。

備註:
1. Kernel 版本間有差異,所以使用 task_struct 的方法不一樣。可以使用的方式計有:
a. for_each_process(task) { DO_SOMETHING; }

b. struct task_struct *task;
struct list_head *list;
list_for_each(list, &current->children) {
    task = list_entry(list, struct task_struct, sibling);
    DO_SOMETHING;
}

c. struct task_struct *task;
for (task = current; task != &init_task; task = task->parent) {
    DO_SOMETHING;
}

2. task->comm 定義 char 個數就只有 16 ,所以只能塞進 15 個字元。(還沒找到怎麼拿出行程全部名稱的方法,待查)
3. 送訊號使用 send_sig 來做。

參考資料:

2013年7月2日 星期二

[C][source][str2mac]

 #include <stdio.h>  
 #include <limits.h>  
 #include <string.h>  
 #include <stdint.h>  
 int str2mac(char *in, uint8_t *mac)  
 {  
     char c1, c2;  
     int len, i;  
     len = strlen(in);  
     for (i = 0; i < (len / 2); i ++) {  
         c1 = toupper(in[2*i]);  
         c2 = toupper(in[2*i + 1]);  
         if (c1 < '0' || (c1 > '9' && c1 <'A') || c1 > 'F')  
       return 0;  
         if (c2 < '0' || (c2 > '9' && c2 <'A') || c2 > 'F')  
       return 0;  
         c1 = (c1 > '9') ? (c1 - 'A' + 10) : (c1 - '0');  
         c2 = (c2 > '9') ? (c2 - 'A' + 10) : (c2 - '0');  
         mac[i] = c1 << 4 | c2;  
     }  
     return 1;  
 }  
 int main(int argc, char *argv[])  
 {  
     uint8_t mac[6];  
     int i;  
     memset(&mac, 0x0, sizeof(mac));  
     str2mac("0012cf368901", mac);  
     for (i = 0; i < 5; i ++) {  
         printf("%02X:", mac[i]);  
     }  
     printf("\n");  
     return 0;  
 }