星期一, 7月 20, 2009

beamer template 釋出



原始碼在這裡 (beamer_template.tex)

這是參考 Josh Ko 的 Oxford Color Theme 改的,我原本也想釋出 Oxford Color Theme,不過他人當替代役去了,我想還是等他本人同意再說比較好。

預設的 outer theme 是我相當喜歡的 minipages ,效果如上圖。就原始的 theme 來說,都是做細微的調整,例如說加深顏色對比之類的,比較大的修改都是沿用 Josh Ko 而來,所以還是相當感謝他。

在最後加了一個獻醜的指令,\bigtitles ,能夠更快速的插入大標題與小標題,會做這個功能的原因是我還蠻常用到的。

排版部分,簡報字體使用的是華康黑體W5,而文件使用的是華康明體 W5,預設是使用 \chf{} 才能使用中文,對我影響不大,因為我用中文的機會比較少,也不是不能說把中文字體設為主要的字體,但是,這樣子 Computer Modern Fonts 就會消失了(取而代之的是中文字體裡面的英文字體 ... Orz),所以才會採取這樣子的折衷方法。

雖不能做到盡善盡美,不過我想我會用這樣子的設定用很久很久 XD。


---
不知道會不會有人用 XD。

星期三, 7月 15, 2009

最近

其實沒什麼可以寫的,但是又很想寫些什麼。

很想寫些長文章,但是沒有心思也沒有時間,所以大概只能這樣子渡渡混日子,然後希望自己不要變成廢物,希望明天該死的考試結束之後,我能夠寫一連串有關硬體的相關文字,當作是自己的一個學習筆記,常常覺得自己在越級打怪就是了,希望這一切可以趕快過去也趕快平靜。


---
雜記

星期三, 7月 08, 2009

名詞潮流

昨天有人跟我提 "執行力" 這個名詞,我覺得蠻感興趣的,因為我最近這一陣子還蠻常聽到這個名詞的,於是我無聊就 Google 了一下,沒有猜錯,是天下/ 商週的產物。老實說,我很久沒有看這種雜誌了,我也不是很喜歡看商週,但是對於這本雜誌所帶動的名詞潮流我倒是有點興趣。從 人脈、AQ、紫牛、藍海(還是紅海 XD?)、M型社會、執行力,這些名詞的流行,大概都跟這兩本雜誌脫離不了關係,而這些名詞的後面通常是一本書。其實我比較喜歡看的的是 "第三種猩猩", "槍炮、細菌與鋼鐵" 說 XD。

這些名詞的好與不好我不太會去評論,不過我知道的是,不管這些名詞有沒有被提出來,這些名詞所帶來的背後事實是早就存在了(說事實的原因是,有些是為了創造名詞而扭曲事實,這邊有個例子。),那麼為什麼這些名詞仍會流行 XD?

後來我在 Evil Capitalism Heroes中的 龐克扮高深(revised) 看到了如下文字:

市場經濟最迷人的地方就是
你要什麼
市場就會賣你什麼?
你要扮高深
市場就會賣你扮高深
你要義和團
市場就會賣你義和團

我不知道拿這一段話來解釋名詞潮流合不合適,但是這就是我所認為的答案。其實我說這種事並不是這麼好,因為我還在努力的尋找我的中心思維,一個沒有中心思維以及足夠強的訓練,是很容易在辯證式思考中造成自我混亂,不過仍然得依靠自我訓練以及辯證來達成目的,方法是不是對的,至今仍在摸索中。

那麼我現在到底要怎麼閱讀,我會選擇閱讀經典(但這些經典是怎麼判定的,仍有待商確),不斷的論證吧,至少就我的觀點而言,我只是一個會看著螢幕科科笑的阿宅,我不太需要趕市場的流行 XD 安靜的研究與思考就可以了。


---
繼續努力。

漫談 String Processing

String Processing 方法其實不少,剛好最近有學到,寫出來筆記一下。

C 的 string 其實是 char* 這點是非常顯而易見,若要說為什麼,不在這裡的討論範圍內,不過 C 的 string processing 幾乎是我所認為的基礎,就我所遇到的 programming language ,至少都有 C String library 所提供的功能(當然,大部分來的更多),所以要認識 function 背後所帶來的成本,學 C Standard Library 是一個不錯的選擇。

一般常見的處理方法如下:

  • naive method:
    我想這沒有什麼好解釋的 ... XD
  • Use library provided by programming language:
    其實以 Java, Python 而言,sting's function 可以解決大部分的常見問題,C++ 也可以,只是在操作上沒有這麼直覺(C++ Boost string algo 提供了不少好東西,也可以參考。)。
  • Consider a string as input/ output:
    • C: sscanf/ sprintf
    • C++: istringstream/ ostringstream
    • Java: StringReader/ StringWriter
    • 簡單的來說,就跟操作 scanf 一樣,所以 scanf 有的優點這個方法都有,缺點亦然,但是對於單一格式的字串處理,如果要轉換成 int, double 之類的,算是比較快速的一個選擇。
  • Regular Expression:
    C, C++, Java, Python 皆有相對應的 library 可供使用,這一招的用途非常的廣,通常也接近最後一招了,不過還是有死角,不建議使用 Regular Expression 在 XML 類的文件上。
  • Parser:
    通常就會針對特定文件了,例如說就有 XML parser, HTML paerser,使用這類的 parser 來處理相關格式會有事半功倍的效果。
目前想到的方法大概為這些,做個筆記,歡迎指正或補完哩。


---
想起來很多,寫起來很少 XD

星期二, 7月 07, 2009

vimrc

突然想到自己的 .vimrc 雖然不怎麼值錢,但是不見了也很麻煩,所以備份一下好了。


syntax enable 
set number

""" set encoding to UTF-8
set encoding=utf-8
set fileencoding=utf-8
set fileencodings=utf-8,big5,euc-jp,gbk,euc-kr,utf-bom,iso8859-1
set termencoding=utf-8
set ambiwidth=double

""" set color scheme
set background=dark
set t_Co=256
color yen3

set title
set showmode            " Show current input mode in status line
set cursorline         " Show Cursor Line in Underline
"set showtabline=2
set wildmenu " Show autocomplete menus.
set visualbell

""" enable mouse
set mouse=a
set ttymouse=xterm
set mousemodel=extend

""" Search Setting
set showcmd
set incsearch
set showmatch

set hls

""" Backup Setting
set backup
set backupdir=$HOME/.vim/backup

""" set status bar
set laststatus=2
set statusline=%4*%<\ %1*[%F]
set statusline+=%4*\ %5*[%{&encoding}, " encoding
set statusline+=%{&fileformat}]%m " file format
set statusline+=%4*%=\ %6*%y%4*\ %3*%l%4*,\ %3*%c%4*\ \<\ %2*%P%4*\ \>
highlight User1 ctermfg=red
highlight User2 term=underline cterm=underline ctermfg=green
highlight User3 term=underline cterm=underline ctermfg=yellow
highlight User4 term=underline cterm=underline ctermfg=white
highlight User5 ctermfg=cyan
highlight User6 ctermfg=white

""" set folding
set foldnestmax=3
"set foldmethod=syntax
"set foldcolumn=4

""" Set editing Tab
set autoindent
set expandtab
set shiftwidth=4
set softtabstop=8
set tabstop=4
set smarttab
set backspace=indent,eol,start 

""" set help doc
helptags $HOME/.vim/doc 

filetype on
filetype plugin on

""" Key Mapping
nnoremap <silent> <f2> :NERDTree<cr>
nnoremap <silent> <f3> :TlistToggle<cr>
nnoremap <silent> <f6> :set foldmethod=syntax<cr>
nnoremap <silent> <f7> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<cr>

nmap cr=    $F=lcf;
nmap cl=    $F=hc^

nmap <LEADER>tc :tabnew<CR>
nmap <LEADER>te :tabedit<SPACE>
nmap <LEADER>tm :tabmove<SPACE>
nmap <LEADER>tk :tabclose<CR>
nmap <C-H> :tabprev<CR>
nmap <C-L> :tabnext<CR>

""" 讓我們可以使用 tab 來縮排
nmap <tab> v>
nmap <s-tab> v<
vmap <tab> >gv
vmap <s-tab> <gv

""" let command mode has bash key binding
cmap <c-a> <home>
cmap <c-e> <end>
cnoremap <c-b> <left>
cnoremap <c-d> <del>
cnoremap <c-f> <right>
cnoremap <c-n> <down>
cnoremap <c-p> <up>
cnoremap <esc><c-b> <s-left>
cnoremap <esc><c-f> <s-right>

""" Source Code Formating
let OmniCpp_MayCompleteScope = 1
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
" automatically open and close the popup menu / preview window
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set completeopt=menuone,menu,longest,preview


""" Tab setting
autocmd TabLeave * let g:LastUsedTabPage = tabpagenr()
function! SwitchLastUsedTab()
    if exists("g:LastUsedTabPage")
        execute "tabnext " g:LastUsedTabPage
    endif
endfunction
nmap tt :call SwitchLastUsedTab()<CR>

""" Auto remove each line-end space 
autocmd FileType c,cpp,java,php,perl,python,ruby,sh,v autocmd BufWritePre  :call setline(1,map(getline(1,"$"),'substitute(v:val,"\\s\\+$","","")'))


com! -bang -nargs=? QFix cal QFixToggle(<bang>0)
fu! QFixToggle(forced)
    if exists("g:qfix_win") && a:forced == 0
        cclose
        unlet g:qfix_win
    else
        copen 10
        let g:qfix_win = bufnr("$")
        en
    endf
nn <leader>m :make<cr>
nn <leader>q :QFix<cr>

nmap <C-c><C-c> :!g++ -g -Wall % -o %:r.out<CR>

---
也可以當成參考 XD

星期四, 7月 02, 2009

最近


一直到今天,期末作業告了一個段落,同時也代表我大四下課程結束,可以繼續完成我的大學總回顧。

為了慶祝大學畢業,買了 FILCO 茶軸鍵盤當成自己的禮物,其實一直都很想買這個鍵盤,只是沒有什麼好理由,如果沒有意外就不會再換了(小白就是遭遇了意外,不見了...Orz),再加上 Logitech MX1100(原來的 MX1000 掛了),還有現役的 DELL 24 吋螢幕,形成現在的工作環境。

不過由於剛完成這些課業一段時間,所以這幾天會好好休息,有事請這幾天後再找我吧,我想也是該稍微停下來一下想想接下來要做什麼了。

花在 plurk 的時間上太多,這也是我要改進的地方,或許應該試著不要堅持把所有的訊息都看完,不然真的很浪費時間,可是又很難的過濾想看的訊息,或許還要試著找一個模式吧。


---
雜記。

星期二, 6月 30, 2009

ACM 532 - CHCRC

今天翻檔案時,翻到我在高中時,寫的 ACM 程式碼,果然有夠醜的,貼出來讓大家笑笑 XD

#include <stdio.h>
#define N 35

char maze[N + 2][N + 2][N + 2];
int a, b, c, fsp = 0, tsp = 0, qt = 0, qf = 0, times = 0;
int i, j, k;

struct use {
int x, y, z;
} sp[N * N * N * N];

int zero() {
for (k = 0; k < N + 2; k++) {
for (j = 0; j < N + 2; j++) {
for (i = 0; i < N + 2; i++) {
maze[i][j][k] = 0;
}
}
}
return 0;
}

int input() {
for (i = 0; i < a; i++) {
for (j = 0; j < b; j++) {
scanf("%s", maze[i][j]);
}
}
return 0;
}

int start() {
for (i = 0; i < a; i++) {
for (j = 0; j < b; j++) {
for (k = 0; k < c; k++) {
if (maze[i][j][k] == 'S') {
sp[fsp].x = k;
sp[fsp].y = j;
sp[fsp].z = i;
return 0;
}
}
}
}
return 0;
}

int run() {
i = fsp;
j = tsp;
while (1) {
if (maze[sp[i].z][sp[i].y][sp[i].x + 1] == 'E')
return 0;
if (maze[sp[i].z][sp[i].y][sp[i].x + 1] == '.') {
maze[sp[i].z][sp[i].y][sp[i].x + 1] = 'R';
j++;
qt++;
sp[j].x = sp[i].x + 1;
sp[j].y = sp[i].y;
sp[j].z = sp[i].z;

}
if (maze[sp[i].z][sp[i].y][sp[i].x - 1] == 'E')
return 0;
if (maze[sp[i].z][sp[i].y][sp[i].x - 1] == '.') {
maze[sp[i].z][sp[i].y][sp[i].x - 1] = 'R';
j++;
qt++;
sp[j].x = sp[i].x - 1;
sp[j].y = sp[i].y;
sp[j].z = sp[i].z;

}
if (maze[sp[i].z][sp[i].y + 1][sp[i].x] == 'E')
return 0;
if (maze[sp[i].z][sp[i].y + 1][sp[i].x] == '.') {
maze[sp[i].z][sp[i].y + 1][sp[i].x] = 'R';
j++;
qt++;
sp[j].x = sp[i].x;
sp[j].y = sp[i].y + 1;
sp[j].z = sp[i].z;

}
if (maze[sp[i].z][sp[i].y - 1][sp[i].x] == 'E')
return 0;
if (maze[sp[i].z][sp[i].y - 1][sp[i].x] == '.') {
maze[sp[i].z][sp[i].y - 1][sp[i].x] = 'R';
j++;
qt++;
sp[j].x = sp[i].x;
sp[j].y = sp[i].y - 1;
sp[j].z = sp[i].z;

}
if (maze[sp[i].z + 1][sp[i].y][sp[i].x] == 'E')
return 0;
if (maze[sp[i].z + 1][sp[i].y][sp[i].x] == '.') {
maze[sp[i].z + 1][sp[i].y][sp[i].x] = 'R';
j++;
qt++;
sp[j].x = sp[i].x;
sp[j].y = sp[i].y;
sp[j].z = sp[i].z + 1;

}
if (maze[sp[i].z - 1][sp[i].y][sp[i].x] == 'E')
return 0;
if (maze[sp[i].z - 1][sp[i].y][sp[i].x] == '.') {
maze[sp[i].z - 1][sp[i].y][sp[i].x] = 'R';
j++;
qt++;
sp[j].x = sp[i].x;
sp[j].y = sp[i].y;
sp[j].z = sp[i].z - 1;

}
if (qt <= 0 && qf == 0) {
times = -1;
return 0;
}
if (qf == 0) {
qf = qt;
qt = 0;
times++;
}
maze[sp[i].z][sp[i].y][sp[i].x] = 'R';
i++;
qf--;
}

return 0;
}

int main() {
zero();
while (scanf("%d%d%d", &a, &b, &c)) {
if (a == 0 && b == 0 && c == 0)
break;
input();
start();
run();
times++;
if (times != 0)
printf("Escaped in %d minute(s).\n", times);
else
printf("Trapped!\n");
fsp = tsp = qt = qf = times = 0;
}
return 0;
}

---
其實大一有重寫,大概 7x 行就結束了 XD

星期日, 6月 28, 2009

CLRS

從 fr3@K 的 Google 分享項目 看到 Introduction to Algorithm (CLRS)把 Multithreaded Algorithms 的章節免費讓人下載之後,連來連去發現

要出第三版啦啦啦啦~出來之後,一定要扛一本精裝版回家(握拳)

這也是繼強者的 blog 說計算機組織聖經 Computer Organization and Design: The Hardware/ Software Interface 4/e 出現之後,最讓我期待的一本書了,已經重量級的兩本書都出了,還會有什麼新書呢,真是令人期待(笑)。


---
什麼時候會有 The C++ PL 4/e XD?

星期六, 6月 27, 2009

返家

從端午節之後一直到現在才返家,姐姐從美國代買的書也到手了,共計有

  • Parallel Computer Architecture: A Hardware/ Software Approach
  • Peopleware: Productive Projects and Teams 2/e
  • Mathematics And Plausible Reasoning Volume I: Introduction and Analogy in Mathematics
  • Mathematics And Plausible Reasoning Volume II: Patterns of Plausible Infference

看來會有個充實的暑假 XD


---
火車誤點 50 分 ...Orz

星期一, 6月 22, 2009

LaTeX 與 Word

每次看到這兩個名詞排在一起時,我有一些想法。LaTeX 做出來的文件很漂亮,也很專業,要變更好也容易,雖然學習門檻較高,但是就我而言,我還是很喜歡用 XeLaTeX 系列來製作文件與簡報。Word (OpenOffice 為 Writter),入門門檻較低,那怕是不太會電腦,也能夠用暴力法做出大部分的人都能接受的漂亮文件。寫到這裡,我不禁思考

養出一個會用 LaTeX 排版的人成本有多高? 而 Word 讓大眾能更輕易的製作文件,是否又有這麼差?

身為一個資訊系學生,我還是義無反顧的為了最高品質而使用了 LaTeX ,但是看過我寫文件的人,有人覺得,很酷捏,寫文件跟寫程式一樣,也要 compile,也有人覺得,為什麼要這麼麻煩的去生成一份文件 XD? 其實沒有什麼絕對的論點,只是,當我們正視電腦所帶來的便利時,為什麼我寧願選擇越活越回去 ?(在這邊假設用 LaTeX 是越活越回去的話 XD),回到其他人的層面而言,我真的覺得 Word 沒什麼不好的,雖然在很多小細節上的處理不佳,但是一般狀況下,真的有人在意嗎?(我們也不能說不在意就是對的) 到底,在新舊技術交錯的時候,身為一個資訊系的學生又處於什麼地位呢 ?

我和 efang 曾經都和 ycma 學過 C Programming, 當然,ycma 的 C programming 是 1978 年的 style,我用的是 1989 年的 C standard,某程度上造成了她的困惑,我最近常常在思考一個問題,從 1990 年到 2009 年也將近 20 年了,想法不可能沒有進步,而 ycma 用 1978 年的寫法也無不好,我只是覺得,身為 2009 年的學生,是不是更應該進步一些 XD? 當然,也沒有任何事可以證明,新的就會比較好,不過身為一個學生,就應該努力嘗試。


---
思考

星期四, 6月 18, 2009

夜唱


我大學只有兩次夜唱,看到這張照片就充滿感觸。(這也是我大學所認識的同班同學全部了 XD)


---
我不會忘記你們的。

期末

Artificial Intelligence: Min-Max Tree
Computer Arithmetic: High-Speed Multiplter, Final Project
還有一個禮拜多 XD


---
寫完就畢業啦 XD

星期四, 6月 11, 2009

閱讀

我看書不會很快,大概只有中文小說比較快,一小時一百多頁吧,其他都慢到爆炸 XD

我的英文大概退化到大家說英語的程度,讀原文書的時候,我還是蠻習慣拿鉛筆和直尺畫線,我認識的頗多老師都是會畫線的,不過常看到誇張的時候,如果書的密度夠高的時候,整頁都是線也是不太舒服的 XD 所以有關程式設計的書我還是不免俗的畫個線,以 Thinking in Java 4/e 為例,在說明 Concurrency 時,以浴室和洗澡人當例子,我只在該段的旁邊註,略 XDXD。 所以其實要不要畫線,端看該本書的資訊密度為何,太高就不用畫了,不過也是有認識接近不畫線的,Josh Ko 我記得是如此(錯了要跟我說 XD), ycma 也是喔 XD,不過我自己仍是想畫就畫,不想畫就不要畫,偶爾寫個自己的註記是我的習慣 XD

看看別人的閱讀習慣也蠻有趣的,有時候看看別人,會覺得自己沒什麼效率,只好努力的用時間和改變習慣來換了 XD


---
雜記 XD

星期一, 6月 08, 2009

最近

在此,跟最近覺得我很衝的人道歉,是我不會控制自我脾氣,如果有什麼話直接的冒犯到,請直接跟我說,我會虛心接受。

最近還是覺得自己是一個一無是處的人。縱使不管再怎麼努力就有如不會游泳而溺水中不停掙扎卻越來看不見水面上的光亮。除了自己什麼都不會以外,我不知道怎麼幫自己下註解。

今天比較早回宿舍,因為一些讓人覺得不會生氣,但是無奈的事,我不是一個很重要的人,不要對人呼之及來,喚之及去,要給其他人給予應有的尊重。也很感謝馬麻,是一個很好的人,我還是會持續的感謝及幫助,若要說我學會什麼,我得說,感謝是一個很重要的力量,學會感謝,才有可能學會前進。然後


繼續寫作業,我不要我的期末炸掉啊啊啊~~~~~


---
所以其實重點是最後一句 XDDX

筆記: ssh 登出後 process 持續執行

nohup ./a.out > test.txt &

有這種指令,以後就方便多了 XD


---
我不要再用自己的電腦跑了啦...Orz

星期三, 6月 03, 2009

媽

yen3: 家人跟我說,我會講話的第一句話是 "媽" XD
gb014388: 你確定後面沒有 "的" XD?


---
如果有,我從小就看的出潛力了...XD

出錯

#include <iostream>
#include <boost/shared_ptr.hpp>

class TestA;

void printTestA(TestA* a){
std::cout << a << std::endl;
}

void printTestA(boost::shared_ptr<TestA> a){
std::cout << a << std::endl;
}

class TestA{
public:
TestA():x(0){}
void test(){
printTestA(this);
printTestA(boost::shared_ptr<TestA>(this));
}
private:
int x;
};


int main(){
boost::shared_ptr<TestA> x(new TestA());
x->test();
std::cout << x.get() << std::endl;
}

這樣子的程式碼會出錯,正在想怎麼解決 XD
好像有解,下午來菸酒菸酒~


---


這個問題其實是 boost::shared_ptr 遇到 this 會發生什麼有趣的事 XD
大鳥 在 comments 中解釋了為什麼會錯,感謝他(感覺比自己寫的還清楚,我就不重寫了 XD) fr3@K 有提到 enable_shared_from_this 是最佳解

對我而言,我利用這個機會好好看了一下 Boost smart ptr,看完才發現,離自己夢想中的 memory management ,還是有一段距離,這個問題在 mailing list 有人討論,也有人提出解法,官方建議兩種解法,一種是加入 weak_ptr,在建立此 object 時,利用 weak_ptr 指向自己,另外一種是 fr3@K 提的,其實這兩種方法殊途同歸,只是後面有包裝,當然,就我自己而言,我實在是不想為了解決這個問題再繼承一個 XD,但是自己寫也沒有多好。

這個 library 的邏輯我猜想是如此,要嘛你就全用(使用 boost::make_shared<T> 建立更好),使用 shared_ptr<T> ...etc 來管理,然後從頭用到尾,weak_ptr 就會出現在這種時候(在我下筆的此刻,雖然我知道它的用法與目的,但是還是不知道使用時機為何),如果想要在 C++ 使用懶人的方法來用記憶體,我們必需更努力的學會這個 library XD,身為一個學生,不太知道外面世界怎麼樣,只能說,盡量學習嘍 XD


補充一下修改後的程式碼:
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/make_shared.hpp>

class TestA;

void printTestA(TestA* a){
std::cout << a << std::endl;
}

void printTestA(boost::shared_ptr<TestA> a){
std::cout << a << std::endl;
}

class TestA{
public:
//TestA():x(0){}
void test(){
printTestA(this);
printTestA(boost::shared_ptr<TestA>(weak_this));
}

static boost::shared_ptr<TestA> create(){
boost::shared_ptr<TestA> u = boost::make_shared<TestA>();
u->weak_this = u;
return u;
}
private:
int x;
boost::weak_ptr<TestA> weak_this;
};


int main(){
boost::shared_ptr<TestA> x = TestA::create();

x->test();
std::cout << x.get() << std::endl;
}

星期一, 6月 01, 2009

片段

昨天開始寫回顧,卻很難寫出隻字片語,我的回憶總是存在於片段,也睡不太著,邊睡邊想出我想要寫的架構為何,希望今天能寫出比較完整的東西。


---
回顧。


11:39 大綱大概擬定出來了,看來要寫好多天 XD

星期日, 5月 31, 2009

復工

不知道自己己經頹廢多久了,從今天開始復工吧 ... 積極休息後總是要更積極的前進。


---
一堆事可以做了 XD

星期三, 5月 27, 2009

邯鄲學步

寫 C++ 的只有四種人

  • C++ 當 C++ 寫
  • C++ 當 C 寫
  • C++ 當 Java 寫
  • C++ 亂寫

---
看別人 code 有感...Orz