2010年1月21日 星期四

[語言] __FILE__, __LINE__

上次在神人那看到....他說:我就是要挺慣C,
恩...
可以交到這麼多正妹的慣C,我也很挺XD

看過
__FILE__, __LINE__ 沒?

C語言常常有那種知道的不要問,不知道的不要說的詭異(取自某討論區的黑暗氣氛...這根本是死結嘛)





其實這是GCC complier 預先就定義好的變數,不只這兩個,只要符合C99的標準有以下七個
__LlNE__
__FILE__
__FUNCTION__
__TIME__
__DATE__
__STDC__           (是否遵守ISO C )
__STDC_HOSTED__  (是不是HOST,非寄居)
__STDC_VERSION__ (版本)

用GCC的話並不完全符合上面的定義
__STDC_VERSION__ 就變成 __VERSION__
__func__ 等同於__FUNCTION__ 不過聽說GCC建議使用前者。

另外complier,我用GCC試過存在
__TIMESTAMP__

寫個程式印一下就知道了
printf("line: %d \n", __LINE__);
printf("file: %s \n", __FILE__);
printf("function: %s \n", __FUNCTION__);
printf("function: %s \n", __func__);
printf("time: %s \n", __TIME__);
printf("date: %s \n", __DATE__);
printf("STDC: %d \n", __STDC__);
printf("STDC_HOSTED: %d \n", __STDC_HOSTED__);
printf("VERSION: %s \n", __VERSION__);
printf("TIMESTAMP: %s \n", __TIMESTAMP__);


輸出:
line: 150
file: test.c
function: main
function: main
time: 15:13:28
date: Jan 21 2010
STDC: 1
STDC_HOSTED: 1
VERSION: 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
TIMESTAMP: Thu Jan 21 15:13:26 2010

這東西就可以視情況取用,很方便。
多方便?

例如我們要重新定義一個DBG()函數來幫忙debug好了

#define DBG(msg, arg...) printf("%s:%s(%d): " msg, __FILE__, __FUNCTION__, __LINE__, ##arg)

這樣我們就可以把DBG()當作printf()使用還多增加function name 行數等等可以查詢。


DBG("index:%d str = %s\n", index, str);
輸出: test.c:main(146): index:2147483647 str = bejo

--
那define 看起來十分詭異對吧 XD
其實那也只是置換的意思,把置換ㄧ下就很清楚了

DBG("index:%d str = %s\n", index, str);

被置換成

printf("%s%s(%d): " "index:%d str = %s\n", __FILE__, __FUNCTION__, __LINE__,  index, str);

DBG --> printf
msg --> "index:%d str = %s\n"
arg --> index, str

就ㄧ點都不奇怪了...

補充一下假指令#line 的用法
這用法可以在openl2tp這包open source看到,用在bison paswer相關

例如當
testA.c 是由bejo.c 自動產生時,run testA.c包好的檔案去debug會產生一些困擾,這時候我們可以這樣做

#line 888 "bejo.c"
        printf("%s line: %d\n", __FILE__, __LINE__);
        printf("line: %d\n", __LINE__);

輸出
bejo.c line:888
line:889

就會知道該去看該死的bejo.c 第888行

---
自動產生的code聽起好夢幻XD

2010年1月12日 星期二

[Ubuntu] SCIM - 輸入法

SCIM - 整合性的輸入法伺服 平常屋邦兔都是拿來工作,很少會打到中文,這次要裝上注音輸入法,哪有那種裝scim會動,裝gcin會動,等一下通通不會動這種鳥事阿,還真的有點稿死我 囧>

照慣例這是官網:
http://www.scim-im.org/

這篇是用SCIM的酷注音完成...... 很不順手 =___=
首先安裝好Ubuntu之後應該會有scim,但因為我是英文環境所以安裝上有點問題。

  • 確認language support 裝上中文包
  • 安裝scim- chewing
  • 需要一個工具:im-switch
          用來切換輸入法,尤其是在不同語系裡切換預設。

 執行
        im-switch -s scim
會發現
        Cannot find alternative `/e tc/X11/xinit/xinput.d/scim'
原因:
        scim沒有被加入到alternatives列表中
解法:
        update-alternatives --install /etc/X11/xinit/xinput.d/all_ALL xinput-all_ALL /etc/X11/xinit/xinput.d/scim 30

另外用im-switch -c 也可以用表單來切換輸入法。

#pkill scim
#scim -d
重新執行

不過..... 我還是登出登入才可以用,真他x的奇怪阿 囧>

ps. 新酷音還是很不順手...某後用

2009年9月9日 星期三

[Ubuntu] Synergy - 讓小兔兔變成八爪章魚(KVM)

以前總是在小微微使用而已,最近才知道原來屋邦兔也有<O>

Synergy - 可以讓你多台電腦共用一套鍵盤滑鼠。

照慣例:這是官網


支援的OS:
  • Microsoft Windows 95, Windows 98, Windows Me (the Windows 95 family)
  • Microsoft Windows NT, Windows 2000, Windows XP (the Windows NT family)
  • Mac OS X 10.2 or higher
  • Unix
    • X Windows version 11 revision 4 or up
    • XTEST extension
      (use "xdpyinfo | grep XTEST" to check for XTEST)

(靠~~~真多)


WIN:安裝SynergyInstaller-1.3.1.exe

Ubuntu:一樣使用靠北好用的aptitude安裝選擇
  • quicksynergy
  • synergy

For SV: 分享此台的鍵盤,滑鼠。
[WIN]
安裝完畢之後到share-->configure設定螢幕位置(上、下、左、右),因為是SV+Client,所以要2個設定

[Ubuntu]
(驚驚驚~~~
好啦好啦...因為GUI設定太好用了
那設定檔在
  • ~/.synergy.conf
--
推薦
用很簡單的
quicksynergy來設定,
打開之後會有一個上下左右的格子,填入要連線近來被控制的電腦名稱即可

For Client:
被附身的電腦(誤)
[WIN]
填入SV IP 即可

[Ubuntu]
填入SV IP 即可(大概啦 囧?)

2009年7月24日 星期五

在新技術面前,我們都應該保持謙卑的態度...

宅男生死鬥文宣








這世界上有安眠藥跟振奮藥...

實在是很妙的事...
很久沒有寫blog,其實我ㄧ直很想寫,真的...

現在時間是早上五點半,我還在公司...
很奇怪,現在我應該是打完電動很愉快的在床上睡大頭覺的時候,現在卻在加班
也不是被逼的,我知道我沒剩多少時間,天曉得哪時候就沒有這種無止盡當海棉的日子

有時候好倦ㄧ切,越來越不喜歡說話,尤其是現在根本沒睡飽 囧>

昨天下午我們自己內部辦了ㄧ場"宅男生死鬥",規則就像日本節目ㄧ樣,分成兩個小組,然後把挑選出來沒救的阿宅,改造成型男,再找公司15隻正妹來投票票選,搞的超級大,我也有參賽>/////< 不過我不是宅男,所以是當設計師那邊的.....助手(打雜),雖然說是設計師,我還真的只能做打雜的工作,不過能加入設計師邊就表示我已經比以前懂得穿衣服,懂得打扮自己,就算只是個打雜的 囧>

跟兩年前的自己變好多... 也許是某些人的離開讓我變的越來越來好,所以?我得先感謝她,不是?

我在一間很有趣的公司上班,雖然下班時間越來越晚,也越來越不喜歡說話...

算了~~~下禮拜就到墾丁好好透透氣吧!!!!!!!!!!



2009年6月26日 星期五

[Ubuntu] PPPoE-server

突然發現以前曾經記錄PPPoE client 卻忘記Server 了 囧>

老規矩~~ rp-pppoe 套件

這是官網

http://www.roaringpenguin.com/products/pppoe
理論上這個套件要自己拿package 自己make 裝到小兔兔的身體裡

不過我還是用靠北好用的aptitude 裝好就好

選擇 "pppoe" 安裝完畢即可

  • 程式本體
         pppoe-server
  • 設定檔
         /etc/ppp/option
         /etc/ppp/pppoe-server-options(要自己產生)

/etc/ppp/option 內容
#
lock
crtscts
nobsdcomp
nodeflate
nopcomp
#

/etc/ppp/pppoe-server-options
#
require-chap
default-mru
default-asyncmap
lcp-echo-interval 60
lcp-echo-failure 5
ms-dns 168.95.1.1
noipdefault
noipx
nodefaultroute
#


指令
pppoe-server -I eth1 -L 192.168.1.1 -R 192.168.1.10-200

-L IP : 指定interface 端的IP
-R IP: 發出去的IP範圍

----------------------------------
PS. 有些文章說要加-k 不然小微微撥上可能會有問題,這次加了會有error 因為我沒重新編譯kernel,不過倒是撥的很順

附記chap 與 pap

修改
/etc/ppp/pppoe-server-options
require-chap 或 require-pap
可選擇兩種之ㄧ

/etc/ppp/pap-secrets
test    *       123    *

/etc/ppp/chap-secrets
test    *       123    *


2009年6月24日 星期三

[Ubuntu] Mplayer - memcoder

Mplayer - The Movie Player

這是linux 上面很好用的撥放器

照慣例

這是官網
http://www.mplayerhq.hu/

不過... 本篇不是紀錄 Mplayer (逃

是裡面的小工具

mencoder (MEncoder )

功能介紹:
  • 轉檔 (說明完畢)
<O>

真的只有這樣...

很早之前都在忙的部份,把mplayer porting 到嵌入式的開發版,順便對arm作一下最佳化

注意Mplayer跟ㄧ般的configure 的方式不同,porting方式要小心。

通常用法:
mencoder -of mpeg -mpegopts format=mpeg1:vbitrate=192 mp3lame -ovc lavc -lavcopts vcodec=mpeg1video -o out.mpeg avi.avi

這是最簡單的轉檔方式,單純轉檔的話還是推薦ffmpeg
  • FLV: ffmpeg -i movie.avi -acodec mp3 -ar 11025 movie.flv

不過當初porting 這些檔案是為了轉錄串流影音所以要幫這幾個daemon 應用上
live555 - 負責讓程式讀懂RTSP protocol

那就可以拿
mencoder 直接轉
  • mencoder <RTSP/MMS PATH> -of avi -o new1.avi -ovc copy -oac pcm -rtsp-stream-over-tcp
  • ffmpeg -i <RTSP/MMS PATH> -f avi -vcodec copy -acodec copy filename.avi
ffmpeg 不支援需要帳密的link,有試著自己在source code修改,運作還是怪怪的。

話說
這幾個套件的開發團隊成員,似乎都有交叉參予,source 跟討論區成員都很類似。

其他參數紀錄:
  • -cache 設定 buffer 單位 K
  • nosound 禁止聲音
  • ovc (影像)有copy ... 等可選 用 mencoder ovc help 可查詢
  • oac (聲音)同上
  • -rtsp-stream-over-tcp 透過TCP來傳送,網路怪怪的時候可加上

Mplayer 喔? 那要有GUI 桌面環境才能用啦 囧>
讀取RTSP link 還有openRTSP 可以用
下次再來寫...

2009年6月8日 星期一

[Ubuntu] 標準輸入 輸出 標準錯誤輸出

這個跟屋幫兔沒關係XD
單純LINUX .....

剛剛被問怎麼用跑去翻筆記之後發現沒寫在Blog 上...

command > get.log 2>&1

這行是說

錯誤的訊息丟到 "1"
再丟到 get.log

WHY?

跳轉後說明XD
0:標準輸入    Keyboard Input    Read
1:標準輸出    terminal    Write
2:標準錯誤輸出    terminal(錯誤訊息是寫到此)    Write

正常訊息是丟到 "1"
錯誤訊息是丟到 "2"

所以 2>&1

&符號指的是取記憶體位置 "1"

就這樣!!!

command 2>&1 > get.log

那這個呢?

(ans: 標準輸出到 get.log ,錯誤訊息顯示到 terminal )