Tuesday, May 26, 2009

busybox 怎麼寫出來的

busybox將大部分的command全部link到一個主程式內

當執行某個command時, 由該主程式檢查第1個參數名稱, 再執行相對應的動作

test.c
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
int i;

for (i=0;i<argc;++i) {
printf("%s ", argv[i]);
}
printf("\n");

if ( strstr(argv[0], "iamlink") ) {
printf("hello, link\n");
}
}

>gcc -o test test.c
>ln -sf test iamlink
>./iamlink
hello, link

Wednesday, May 20, 2009

在mac上開發xcode的經驗

在此記錄 xcode & Objective-C 的經驗

1)
在 mac 上編譯
gcc -o prog file.m -lobjc -framework cocoa
在 ubuntu 上編譯
gcc -o prog file.m -lobjc -lgnustep-base

筆記,
1) Every method has an implicit local variable called self, which is a pointer
to the object that is executing the method.
2) Because you will frequently need objects that you are not retaining, many classes have class methods that return autoreleased objects.
3) outlet感覺有點像class AppController, 透過outlet, 存取 UI 的 controller. 或者 class AppController 如何存取 UI 的 controller, 則是透過 outlet 指向這個 controller.

Tuesday, May 19, 2009

我的第一台公路車

為了慶祝我剛出社會找到工作, 所買的人生第一台公路車

版本2,
為了慶祝我剛滿20歲, 所買的人生第一台公路車

KHS R3000

P5180250

P5180251

P5180253

P5180254

P5180255

P5180256

Monday, April 20, 2009

程式開發技巧x

連續2個 if 的陷井

試問以下的程式碼, 結果為何

if (1) {
if (0) {
return 2;
}
} else {
return 1;
}


結果應該會回傳一個"不確定的值"
可能會馬上出錯
也有可能一個月才會出錯(或當掉)
然後要review code, 再加點運氣就會發現這裡可能有問題
再放上三個月, 好像不會再出錯了
當做這個問題已經好像似乎已經好像似乎...沒有把握的...解決了

這個範例只是要點出幾個潛在的問題
1)if之後要不要加else
如果每個if之後都有else, 那這個範例應該不會有機會出錯

2)預設的回傳值
也就是無論如何, 一定都會有一個預設的回傳值會傳回去

3)應該不會發生
這句話的代價可能要用時間去驗證"是不是可以獲得解決"

正確寫程式的習慣, 遠比測試1天沒發生問題, 來得重要

Tuesday, April 07, 2009

perl - hash, array, reference

About hash, array, reference

solution 1,

#!/usr/bin/perl -w

use strict;

my @array;
foreach (0..9) {
handler(\@array);
}
for my $i (0..$#array) {
print $array[$i]->{key},"\n";
}

sub handler {
my ($aryhref)=@_;
my (%hash);
$hash{key}="abc";
push @$aryhref, \%hash;
}

=========================
solution 2,

#!/usr/bin/perl -w

use strict;

my @array;

my %hash;
foreach (0..9) {
ca(\%hash);
push @array, \%hash;
}
for my $i (0..$#array) {
print $array[$i]->{username},"\n";
}

sub ca {
my ($hashref)=@_;
$hashref->{username}="abc";
}

use strict;
%{hashref}->{key}
got "Using a hash as a reference is deprecated"
suggest ${hashref}{key} instead.

about Perl Module installation

Monday, April 06, 2009

雨刷與車前玻璃

好長一段時間, 只要下雨, 用雨刷, 就可以聽到雨刷跟前玻璃之間的呱呱聲

"其實只要用魔術靈就可以了", 一天高愛倫這樣跟我說
他繼續說到, "好像是玻璃有黏黏的東西, 所以雨刷會不順"

剛好家裡有一罐魔術靈, 還是玻璃東西的, 噴了幾下
似乎現在已經沒再聽到呱呱聲了

繼續追蹤看看

Friday, March 27, 2009

My Socket Experience

Non-blocking Mode


fcntl

int flags=fcntl(sockfd, F_GETFL, 0);
flags |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, flags);

ioctl

int on=1;
ioctl(sockfd, FIONBIO, &on);

Raw Socket

man 7 raw

Thursday, March 26, 2009

perl experience - module installation

perl安裝新的 module 步驟
>perl -MCPAN -e shell
>install Bundle::CPAN
>reload cpan
或其他 module
經常會遇到 Permission denied 的問題

此時,可以嘗試
>o conf make_install_make_command 'sudo make'
每次 make 時, 會先 su , 再執行 make
>o conf commit
儲存上述設定

出現這種錯誤
500 Can't connect to secure.ogone.com:443 (Invalid argument)
or
501 Protocol scheme 'https' is not supported (Crypt::SSLeay or IO::Socket::SSL not installed)
>install Crypt::SSLeay

>apt-get install perl-doc

Symptom
when executing widget, the error message "no event type or button # or keysym..." shown out.
My Tk version seemed Tk-804.028 installed by CPAN.

Solution
Manually download and install Tk-804.028_501
http://search.cpan.org/CPAN/authors/id/S/SR/SREZIC/Tk-804.028_501.tar.gz

install occurred "permission denied"
>o conf mbuild_install_build_command 'sudo ./Build'
>o conf commit

Tuesday, March 24, 2009

最近的經驗

把rx跟tx分成2個thread, 是個很大的錯誤

會有很多同步的問題要考慮並解決

Wednesday, March 18, 2009

x11 on mac

最近遇到一個問題
AUDIT: Wed Mar 18 11:08:34 2009: 243 X: client 4 rejected from IP 192.168.200.66

解決的方法, 透過 xhost
在10.4時,
1)先啟動 startx
2)再 xhost + 或 xhost +ip 即可
另外, 直接啟動xhost, 不會啟動x server, 所以記得先 startx
在10.5
由於 xhost 會再多啟動一個x server
所以直接啟動 xhost即可,不需要 startx

Friday, March 13, 2009

linked list

一般常見的linked list問題

1) delete node
2) copy structure with next pointer

Tuesday, March 10, 2009

停電篇

停電, 筆電還有電, 可以幹什麼?

1) wireless ap, 或 modem 沒電, 也不能上網
2) 沒電, 也不能用筆電看電子書
3) 只好看紙本的書
4) 沒電, 3.5吋的外接硬碟, 也不能用
5) 免外接電源的外接硬碟, 這時候就是價值所在了, 不過筆電也是要供電給它用
6) 沒電, 桌上型電腦也不能用
7) 沒電, 不能開電視, 看CSI

Thursday, March 05, 2009

聊聊

每次面試完, 都會問對方, 還有什麼要補充的或是還有什麼問題?
就被問到工作的成就感在哪裡?與是否寫一輩子的程式?

第1次寫程式, 覺得程式可以跑就很有成就感了
不過工作之後, 程式會跑, 已經無法滿足自己了
而是追求程式的穩定, 與架構的相容性
穩定度愈高, 代表當初的problem domain survey要完整, 才能夠提出相對應的solution
analysis, design, coding, unit-test and handle citical section
相容性高, 表示已經預測到將來的可能性擴充, 以相容性設計為提前

是否寫一輩子的程式, 我倒沒想過這樣子的問題
不過我的回答倒是這樣
總不能跳去做硬體吧
軟體有很多領域, 網路, 多媒體, 嵌入式等
所以, 如果可以找到自己的挑戰, 那應該無所謂是不是寫一輩子的程式吧

Wednesday, March 04, 2009

ACM problem 100

problem id 100
3n+1 problem
solved

今天終於解了
原來重點在於輸入的範圍介於i,j
其中 i不一定小於j
就因為這個一直給我wrong answer

Monday, February 23, 2009

exit, _exit

exit() 與 _exit() 之間的差異性

1)fork()出來的process, 不要用exit(), 用_exit()
2)exit()會依序呼叫以下函式
cleanup()
atexit()時註冊的callback function
_exit()

我的想法如下
為什麼child process, 不要用exit()
因為atexit()註冊的callback function, 可能會含有移除一些共用的resource釋放的程式碼
所以如果在child process結束時, 移除共用的resource, 可能會造成其他process的問題
尚待驗證

Thursday, February 19, 2009

strace on macosx

cannot find out strace on macosx or fink

using tool below instead,
1) /usr/bin/fs_usage
2) ktrace & kdump
3) /Application/Utility > Acitvity Monitor > Inspector or Sample Process

wget easy howto

如果wget遇到要username跟password時

wget --user=XXX --password=??? http_download_url

Wednesday, February 18, 2009

dropbox

Install dropbox on ubuntu 8.10

0) get dropbox source
1) sudo apt-get install libnautilus-extension-dev
2) sudo apt-get install libnotify-dev
3) ./configure && make
4) make install

The most important is logout & login to launch dropbox.

Friday, December 19, 2008

學習道2

學習道記錄之2

基本3階pipeline
fetch -> decode -> execute
================================
Usage convention 使用習慣
每一種語言, 含assembly language, 都會有各自的使用習慣
================================
一般多音節的名詞單字, 重音會放在第2個字母上?
preference
================================

Tuesday, November 25, 2008

筆記

最近學習的筆記

filename是已經存在的10MB檔案,
sample 1)
fopen(filename, "wb");
sample 2)
fp=fopen(filename, "ab");
rewind(fp);
之間的差異
--------------------------------------------------------------
理論上從上層來看是沒啥差異, 但談到kernel如何配置
新的區塊, 就有不一樣的結果
sample 1, 會先縮減filename的大小, 再重新配置一塊區塊使用
並且將index指到檔案起始位置.
sample 2, 打開filename後, 會將index指到檔案尾,
rewind再重新將index指回檔案頭.
因此, sample2會比較有的效率, 少了重新配置區塊的動作,
以及, 減少fragment的機會.
=========================================================
fprintf(stdout, "hello world\n");
fprintf(stderr, "hello world\n");
Q:之間的差異?
-------------------------------------
stdout會先要列印的字串, 收集到預設的buffer,
待buffer滿時, 再一次輸出
stderr會直接輸出要列印的文字
=========================================================
Q:如何判斷檔案的大小
Sol1,
用 fstat(fd, &statbuf) 取得, statbuf.st_size即為檔案的大小
Sol2,
fseek(fp, 0, SEEK_END);
filesize=ftell(fp);
=========================================================
何時使用multi-process?何時使用multi-thread?
一般建議用multi-thread, 比較節省resource的使用, 但缺點在於當其中某個thread發生問題, 整個processs, 會隨之crash.
sol1, 找出造成問題的點
sol2, 趕時間的話, 保留multi-thread的架構, 但試著將會crash的函式以multi-process方法產生, 這樣會crash的, 只有那個process, 而不是主process.
=========================================================
Kernel不允許User space Application攔j載SIGKILL, 所以最後手段可以透過 kill -9 app, 結束程式.
但何時送SIGKILL, 也沒有辦法結束程式呢?
有可能該程式正卡在底層driver, 或是kernel space某處, 因此送出SIGKILL, 會沒有反應, 這種情況通常可以透過 ps, 看該程式的process status是否為 D ( Uninterruptible sleep (usually IO) )得知.
=========================================================
什麼時候用udp?什麼時候用tcp?
case1,
case2,
傳送資料量小時, 可以考慮用udp,相反的,資料量大的,考慮用tcp吧
=========================================================
同步與非同步的例子?
=========================================================
signal handler內是否要重新註冊signal handler
it depends.
舊時期的系統會將signal導給已註冊的handler後, 回到預設的handler
近期的linux, 則相反, 會一直保留已註冊的handler
為了相容性考量, 建議重新註冊signal handler
總之, 要跑過才能知道真正的行為表現
=========================================================
給測試部時, 要給release版或debug版呢?
如果測試部人手比較多的話, 可以建議2種版本都出
但如果人手不夠的話, 還是只能出release版的
=========================================================
export LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH)
=========================================================