2007年3月26日 星期一

vi 無所不在

根據小道消息(有人告訴我)
bash 中也有 vi
就是使用 set -o vi
這時候就可以開始使用 vi 模式
一開始會是 Insert Mode
當按下 Esc 後會進入 Command Mode
hjkl 左下上右
hl 會在目前的指令前後移動
jk 會在 history 前後項移動
另外像是 /? 可以搜尋啟動 vi 模式後所打過的指令
還有 x,X 可以刪除字元
dd 可以整行刪除
0 可以移到指令"前頭"
^ 可以移到指令"開頭"
$ 可以移到指令結尾
W,w,B,b,E,e 可以在單字間移動
v 會進入真正的 vi 介面
A,I,a,i 進入 Insert Mode
... 繁多不即備載
有興趣的朋友可以自己研究研究... ^_^
最後...
set -o 或是 set +o 可以看到其它可以玩弄的選項
所以想要離開 vi 模式就可以執行 set +o vi
不過這時候會覺得使用上會有點奇怪
像是上下鍵的 history 不見了
原來 bash 的預設值是設定成 emacs 模式
所以只要再執行 set -o emacs 就回復到原本的 bash 了
以上的操作是在 Fedora Core 6 上所觀察到的
其它的系統可能功能上稍有出入

2007年3月22日 星期四

什麼!vim 可以編輯 tarball !

這是真的!
剛剛在 Fedora Core 6 上
不小心對 tarball 使用了 vim
突然發現可以直接對 tarball 裡面的檔案做編輯
查了一下
# rpm -ql vim-common | grep tar.vim
/usr/share/vim/vim70/autoload/tar.vim
/usr/share/vim/vim70/syntax/tar.vim
原來是裝 tar.vim 這個 plugin 的關係啊!
喔齁齁~~~ ^o^

2007年3月20日 星期二

Google 網上論壇 - 直譯式語言使用者社群大亂鬥

最近在 Google 網上論壇 亂逛了一下
找到了
perl@taiwan
python. tw
PHP 台灣
台灣Ruby使用者群組
其中以 Python 以及 Ruby 的台灣使用者群組較為活躍許多 (以 Google 網上論壇為參考範圍)
直譯式語言的四大天王~~~ ^_^

2007年3月14日 星期三

極簡風格的 Window Manager - wmii

http://www.suckless.org/wiki/wmii

Alt + d 標準模式 (水平視窗分割)
Alt + s 堆疊模式
Alt + m 最大化模式
Alt + Shift + l 垂直視窗分割
Alt + hjkl 控制視窗移動
Alt + Enter 叫出終端機
Alt + p 程式隨打執行
類似 MacOSX 上的 QuickSilver
Alt + a 主選單
只有四個選項, 也許可以再自訂
Alt + Shift + [0-9] 將目前的視窗搬到 Workspace [0-9]
Alt + [0-9] 切換 Workspace 到 [0-9]

這不就是我夢想中的桌面嗎!?
整個就是有效率啊~~~ 喔齁齁~~~ ^o^
--
不過在 Ubuntu 6.10 上的 wmii 中的中文顯示有點問題... :(

2007年3月13日 星期二

fc6 upgrade trac to 0.10.3.1 broken

升級了在 Fedora Core 6 上裝的 trac
結果發現到 trac 整個爛掉
http://bugzilla.redhat.com/bugzilla 找了一下
結果找到了這篇 http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=231836
總之... 暫時的解法就是
# rpm -e --nodeps python-sqlite2

vim :TOhtml

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("Hello World!\n");
return 0;
}

喔~ 效果還不錯喔~ ^_^

2007年3月12日 星期一

Blogger Help : Can I get site feeds for specific labels?

哇喔~ 原來 Blogger 有提供依照 Label 來產生不同的 Feed 啊! :|

Template:
http://blogname.blogspot.com/feeds/posts/default/-/labelname

如果想要做出 Linux 的 Feed 的話就使用
http://fourdollars.blogspot.com/feeds/posts/default/-/Linux

如果想要做出 Debian 的 Feed 的話就使用
http://fourdollars.blogspot.com/feeds/posts/default/-/Debian

如果想要做出 Ubuntu 的 Feed 的話就使用
http://fourdollars.blogspot.com/feeds/posts/default/-/Ubuntu

如果想要做出 Fedora 的 Feed 的話就使用
http://fourdollars.blogspot.com/feeds/posts/default/-/Fedora

如果想要做出 Mac 的 Feed 的話就使用
http://fourdollars.blogspot.com/feeds/posts/default/-/Mac

如果想要做出 Windows 的 Feed 的話就使用
http://fourdollars.blogspot.com/feeds/posts/default/-/Windows

應該可以利用這種方式來加入各種不同類型的 Planet 吧~
也比較容易保持 Planet 的一致性
Planet 上面的文章更符合該 Planet 的主題
不過也同時排除了接觸其他知識的機會... :P

P.S. 大小寫有分喔~ :o

2007年3月9日 星期五

FreeNode 要如何設定 Channel 的 OP

可以先參考 Canydz 寫的這篇 還有我以前寫的那篇
如果是要註冊一個 Channel 的話,必須先註冊一個帳號才能註冊 Channel
帳號有帳號本身的密碼
Channel 有 Channel 本身的密碼
也就是說想要設定 Channel 的 OP 的話
要先經過 Channel 密碼的認證
/msg ChanServ IDENTIFY #ChatRoom [ChatRoom's Password]
/msg ChanServ ACCESS #ChatRoom add FourDollars 30
這樣才能把我設定成 OP
--
另外... 要特別感謝 Mat0220 不厭其煩地幫忙我做些實驗.... ^_^

2007年3月8日 星期四

CMClass: 微軟徵才試題 (完)

算錯篇: http://fourdollars.blogspot.com/2007/03/cmclass.html
算對篇: http://fourdollars.blogspot.com/2007/03/cmclass_08.html
這篇要來個總結... :P
原始的題目是
永源拿了兩個不同數字...
這兩個數字分別大於 1 ,也分別小於 50
永源只把這兩個數字的乘積告訴了亞譚 ...
永源再只把這兩個數字的和告訴了明歆 ...
永源問, 這兩個數字是什麼 ?

以下是亞譚和明歆的對話... (小強, 小毛, 小燕在旁坐陪)
亞譚: 我不知道這兩個數字是什麼!
明歆: 但我也還是不知道這兩個數字是什麼!
亞譚: 喔!那我知道那兩個數字是什麼了 !
明歆: 喔!那我也知道那兩個數字是什麼了 !
突然間 ....聰明的三位陪客同時也說: 我們也知道那兩個數字是什麼了 !
聰明的你, 告訴我....那兩個數字是什麼 ?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "set.h"

#define LOWER 2
#define UPPER 49

#define for_ij_do(A...) \
for (i = LOWER; i <= UPPER - 1; i++) \
for (j = i + 1; j <= UPPER; j++) \
do { A } while (0);

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

int m[UPPER * UPPER] = {0};
int a[UPPER + UPPER] = {0};

Set *setA = newSet();
Set *setB = newSet();

for_ij_do (
m[i * j]++;
);

for_ij_do (
if (m[i * j] >= 2)
appendSet(setA, newPair(i, j));
);
/* 亞譚: 我不知道這兩個數字是什麼!*/
/* setA->size == 638 */

for_ij_do (
if (findElement(setA, newPair(i, j)))
a[i + j]++;
);

for_ij_do (
if (a[i + j] >= 2 && findElement(setA, newPair(i, j)))
appendSet(setB, newPair(i, j));
);
/* 明歆: 但我也還是不知道這兩個數字是什麼!*/
/* setB->size == 629 */

memset(m, 0, sizeof(int) * UPPER * UPPER);

for_ij_do (
if (findElement(setB, newPair(i, j)))
m[i * j]++;
);

for_ij_do (
if (m[i * j] == 1 && findElement(setB, newPair(i, j)))
printf("%d %d\n", i, j);
);
/* 亞譚: 喔!那我知道那兩個數字是什麼了! */
/* 明歆: 喔!那我也知道那兩個數字是什麼了! */

destorySet(setB);
destorySet(setA);

return 0;
}
兩篇相關的討論
http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/226
http://hoamon.blogspot.com/2007/03/cmclass.html
總算是想出來了... ^o^
Source Code 放在 http://fd.idv.tw/tux/CMClass.tar.bz2
因為不知道 C 上面有什麼 Set 的相關函式, 所以就自己硬幹一個簡易版出來... XD
另外... 為了把 Source Code 貼到 Blog 上, 用到了一段 command
cat main.c | sed -e 's/</\&lt;/g' | sed -e 's/>/\&gt;/' | less
如果有程式有辦法把 Source Code 轉成 HTML 外加彩色應該會很方便好用吧!?

CMClass: 微軟徵才試題 (續)

昨天的文章算錯答案了... :P
所以... 重寫一個程式... ^o^
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "set.h"

#define LOWER 2
#define UPPER 49

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

int m[UPPER * UPPER] = {0};
int a[UPPER + UPPER] = {0};

Set *setA = newSet();
Set *setB = newSet();
Set *setC = newSet();

Node *index = NULL;

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++) {
m[i * j]++;
a[i + j]++;
}

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (m[i * j] >= 2)
appendSet(setA, newPair(i, j));

memset(m, 0, sizeof(int) * UPPER * UPPER);
memset(a, 0, sizeof(int) * UPPER * 2);

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (findElement(setA, newPair(i, j))) {
m[i * j]++;
a[i + j]++;
}

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (a[i + j] >= 2 && findElement(setA, newPair(i, j)))
appendSet(setB, newPair(i, j));

memset(m, 0, sizeof(int) * UPPER * UPPER);
memset(a, 0, sizeof(int) * UPPER * 2);

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (findElement(setB, newPair(i, j))) {
m[i * j]++;
a[i + j]++;
}

for (i = LOWER; i <= UPPER - 1; i++)
for (j = i + 1; j <= UPPER; j++)
if (m[i * j] == 1 && findElement(setB, newPair(i, j)))
appendSet(setC, newPair(i, j));

for (index = setC->head; index != NULL; index = index->next)
printf("%d %d\n", index->curr->x, index->curr->y);

destorySet(setA);
destorySet(setB);
destorySet(setC);

return 0;
}
完整的 Source Code 在 http://fd.idv.tw/tux/CMClass.tar.bz2
有興趣可以幫忙 debug ... :P

2007年3月7日 星期三

CMClass: 微軟徵才試題

http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/226 看到的題目
我的解答是 3 跟 4 (這不是正確答案喔!請看意見)
求解的程式在這裡

#include <stdio.h>

int main(int argc, char *argv[])
{
int i, j;
int a[100] = {0};
int m[2500] = {0};

for (i = 2; i < 50; i++) {
for (j = i; j < 50; j++) {
a[i+j]++;
m[i*j]++;
}
}

for (i = 2; i < 50; i++) {
for (j = i; j < 50; j++) {
if (a[i+j] == 2 && m[i*j] == 2) printf("%d %d\n", i, j);
}
}

return 0;
}

從以前就很喜歡寫程式來解數學問題... ^_^