星期四, 4月 05, 2007

啟發式搜尋演算法 - A* Algorithm

恩... AI 的作業 - A* Search Algorithm

老師是要我們寫八陣圖啦!不過我看到 A* 的時候想,其實 A* 需要的也就是這些東西:

  • 當前的 state
  • 接下來可能的 state
  • 要能計算兩個 state 之間的距離

所以,我把 code 提煉成一個 template function,只要餵他一個 start 一個 target,他就會把中間要走的路找出來。而這個 template function 需要:

  • NODE_T:表示 state
  • distance(NODE_T, NODE_T):用來計算兩個 state 之間的距離
  • solution(NODE_T, NODE_T):驗證是否能從一個 state 走到另一個 state
  • NODE_T::childs():接下來可以走的 state

board.h:這是用來測試的 node class 與 distance() function 實做: #ifndef _BOARD_H
#define _BOARD_H

#include <vector>
#include <algorithm>
#include <iostream>
#include <set>

template <int SIZE>
class basic_board
{
public:
        typedef std::vector< char > storage_t;

private:
        class INDEX_HELPER
        {
        public:
                INDEX_HELPER(int const x, const storage_t & s):
                        idx_x_(x), storage_(s)
                { }

                int const operator[] (int const idx_y) const
                {
                        return storage_[idx_y * SIZE + idx_x_];
                }

        private:
                int idx_x_;
                storage_t const & storage_;
        };
public:
        basic_board(storage_t const & prototype):
                storage_(prototype)
        { }

        basic_board(bool random_init = false):
                storage_(SIZE*SIZE)
        {
                for (int i=0;i<storage_.size();++i)
                        storage_[i] = i;
                if (random_init)
                        std::random_shuffle(storage_.begin(), storage_.end());
        }

        template <int S>
        friend class board_distance;

        template <int S>
        friend class board_solution;

        bool operator != (basic_board const & rhs) const
        {
                return storage_ != rhs.storage_;
        }

        INDEX_HELPER const operator [] (int const idx_x) const
        {
                return INDEX_HELPER(idx_x, storage_);
        }

        std::vector< basic_board > childs()
        {
                std::vector< basic_board > ret;

                // first find empty node and its (x, y)
                storage_t::iterator e = std::find(storage_.begin(), storage_.end(), 0);
                int e_x = ( e - storage_.begin() ) % SIZE,
                    e_y = ( e - storage_.begin() ) / SIZE;

                basic_board tmp(*this);
                storage_t::iterator ee = tmp.storage_.begin() + e_y * SIZE + e_x, ii;
                if (e_y - 1 >= 0)        // move up?
                {
                        ii = tmp.storage_.begin() + (e_y - 1) * SIZE + e_x;
                        std::iter_swap(ee, ii);
                        ret.push_back(tmp);
                        std::iter_swap(ee, ii);
                }
                if (e_y + 1 < SIZE)        // move down?
                {
                        ii = tmp.storage_.begin() + (e_y + 1) * SIZE + e_x;
                        std::iter_swap(ee, ii);
                        ret.push_back(tmp);
                        std::iter_swap(ee, ii);
                }
                if (e_x - 1 >= 0)        // move left?
                {
                        ii = tmp.storage_.begin() + e_y * SIZE + e_x - 1;
                        std::iter_swap(ee, ii);
                        ret.push_back(tmp);
                        std::iter_swap(ee, ii);
                }
                if (e_x + 1 < SIZE)        // move right?
                {
                        ii = tmp.storage_.begin() + e_y * SIZE + e_x + 1;
                        std::iter_swap(ee, ii);
                        ret.push_back(tmp);
                        std::iter_swap(ee, ii);
                }

                return ret;
        }

private:
        storage_t storage_;
};

template <int SIZE>
std::ostream &
operator << (std::ostream & lhs, basic_board<SIZE> const & rhs)
{
        for (int i = 0; i < SIZE; ++i)
        {
                for (int j = 0; j < SIZE; ++j)
                        lhs << rhs[j][i] << ", ";
                lhs << std::endl;
        }
}

// solution verifier
template <int SIZE>
class board_solution
{
public:
        bool operator() (basic_board<SIZE> lhs, basic_board<SIZE> rhs)
        {
                // move both empty cell to upper-left corner
                typename basic_board<SIZE>::storage_t::iterator e, i;
                int e_x, e_y;
                
                e = std::find(lhs.storage_.begin(), lhs.storage_.end(), 0);
                e_x = ( e - lhs.storage_.begin() ) % SIZE;
                e_y = ( e - lhs.storage_.begin() ) / SIZE;
                while (e_y - 1 >= 0)        // move up?
                {
                        i = lhs.storage_.begin() + (e_y - 1) * SIZE + e_x;
                        std::iter_swap(e, i);
                        e = i;
                        e_x = ( e - lhs.storage_.begin() ) % SIZE;
                        e_y = ( e - lhs.storage_.begin() ) / SIZE;
                }
                while (e_x - 1 >= 0)        // move left?
                {
                        i = lhs.storage_.begin() + e_y * SIZE + e_x - 1;
                        std::iter_swap(e, i);
                        e = i;
                        e_x = ( e - lhs.storage_.begin() ) % SIZE;
                        e_y = ( e - lhs.storage_.begin() ) / SIZE;
                }
                
                e = std::find(rhs.storage_.begin(), rhs.storage_.end(), 0);
                e_x = ( e - rhs.storage_.begin() ) % SIZE;
                e_y = ( e - rhs.storage_.begin() ) / SIZE;
                while (e_y - 1 >= 0)        // move up?
                {
                        i = rhs.storage_.begin() + (e_y - 1) * SIZE + e_x;
                        std::iter_swap(e, i);
                        e = i;
                        e_x = ( e - rhs.storage_.begin() ) % SIZE;
                        e_y = ( e - rhs.storage_.begin() ) / SIZE;
                }
                while (e_x - 1 >= 0)        // move left?
                {
                        i = rhs.storage_.begin() + e_y * SIZE + e_x - 1;
                        std::iter_swap(e, i);
                        e = i;
                        e_x = ( e - rhs.storage_.begin() ) % SIZE;
                        e_y = ( e - rhs.storage_.begin() ) / SIZE;
                }

                std::cout << lhs << std::endl;
                std::cout << rhs << std::endl;

                // checking parity
                int p(0);
                for (e = lhs.storage_.begin() + 1;
                     e != lhs.storage_.end();
                     ++e)
                {
                        i = std::find(rhs.storage_.begin()+1, rhs.storage_.end(), *e);

                        for (typename basic_board<SIZE>::storage_t::iterator j = e;
                             j != lhs.storage_.end();
                             ++j)
                                if (std::find(rhs.storage_.begin()+1, i, *j) != i)
                                        ++p;
                }
                std::cout << "Parity: " << p << " (" << p%2 << ")" << std::endl;

                return (p%2) != ((SIZE*SIZE)%2);
        }
};

// manhatten distance
template <int SIZE>
class board_distance
{
public:
        board_distance(basic_board<SIZE> const & target):
                pos_cache_(SIZE*SIZE)
        {
                for (int i=0;i<SIZE*SIZE;++i)
                {
                        typename basic_board<SIZE>::storage_t::const_iterator
                                t = std::find(target.storage_.begin(), target.storage_.end(), i);
                        pos_cache_[i] = std::make_pair(
                                ( t - target.storage_.begin() ) % SIZE,
                                ( t - target.storage_.begin() ) / SIZE
                        );
                }
        }

        int operator() (basic_board<SIZE> const & lhs)
        {
                int ret(0);
                for (int i=1;i<SIZE*SIZE;++i)
                {
                        typename basic_board<SIZE>::storage_t::const_iterator
                                l = std::find(lhs.storage_.begin(), lhs.storage_.end(), i);
                        ret += std::abs(
                                        pos_cache_[i].first - 
                                        ( ( l - lhs.storage_.begin() ) % SIZE )
                                ) + std::abs(
                                        pos_cache_[i].second - 
                                        ( ( l - lhs.storage_.begin() ) / SIZE )
                                );
                }
                return ret;
        }

        int operator() (basic_board<SIZE> const & lhs, basic_board<SIZE> const & rhs)
        {
                int ret(0);
                for (int i=1;i<SIZE*SIZE;++i)
                {
                        typename basic_board<SIZE>::storage_t::const_iterator
                                l = std::find(lhs.storage_.begin(), lhs.storage_.end(), i),
                                r = std::find(rhs.storage_.begin(), rhs.storage_.end(), i);
                        ret += std::abs(
                                        ( ( l - lhs.storage_.begin() ) % SIZE ) -
                                        ( ( r - rhs.storage_.begin() ) % SIZE )
                                ) + std::abs(
                                        ( ( l - lhs.storage_.begin() ) / SIZE ) -
                                        ( ( r - rhs.storage_.begin() ) / SIZE )
                                );
                }
                return ret;
        }
private:
        std::vector< std::pair<int, int> > pos_cache_;
};

typedef basic_board<3> Board_3x3;
typedef basic_board<4> Board_4x4;
typedef basic_board<5> Board_5x5;

typedef board_distance<3> Distance_3x3;
typedef board_distance<4> Distance_4x4;
typedef board_distance<5> Distance_5x5;

typedef board_solution<3> Solution_3x3;
typedef board_solution<4> Solution_4x4;
typedef board_solution<5> Solution_5x5;

#endif

astar.h:這是 A* 演算法與一個 helper class。

#ifndef _ASTAR_H
#define _ASTAR_H

#include <map>
#include <vector>

template <typename COST_T, typename NODE_T>
class NODE_HELPER
{
public:
        NODE_HELPER(COST_T c, NODE_T const & s, int p):
                cost_(c), state_(s), parent_(p)
        { }

        int parent() const { return parent_; }
        int cost() const { return cost_; }
        NODE_T & state() { return state_; };

        std::vector< NODE_T > childs() { return state_.childs(); }

private:
        int parent_;        // parent step
        COST_T cost_;        // cost from start to this state
        NODE_T state_;        // current state
};

template <typename NODE_T, typename DISTANCE_T, typename VERIFIER_T>
std::vector< NODE_T >
astar_search(NODE_T const & start, NODE_T const & target, DISTANCE_T dist, VERIFIER_T sol)
{
        if (!sol(start, target))
                return std::vector< NODE_T >();

        std::multimap<int, NODE_HELPER<int, NODE_T> > pending;
        pending.insert(std::make_pair(dist(start, target), NODE_HELPER<int, NODE_T>(0, start, 0)));

        std::vector< NODE_HELPER<int, NODE_T> > solution;

        int n_iter(0);
        while(dist(pending.begin()->second.state()))
        {
                solution.push_back(pending.begin()->second);
                int cost_so_far = pending.begin()->second.cost();
                pending.erase(pending.begin());

                std::vector< NODE_T > tmp_cld = solution.rbegin()->childs();
                for(typename std::vector< NODE_T >::iterator i = tmp_cld.begin();
                    i != tmp_cld.end();
                    ++i)
                {
                        int cost = cost_so_far + dist(solution.rbegin()->state(), *i);
                        pending.insert(
                                std::make_pair(
                                        cost + dist(*i),
                                        NODE_HELPER<int, NODE_T>(
                                                cost,
                                                *i,
                                                solution.size() - 1)
                                )
                        );
                }
        }

        std::vector< NODE_T > ret;
        ret.push_back(pending.begin()->second.state());
        for (int p_idx = pending.begin()->second.parent();
             p_idx != 0;
             p_idx = solution[p_idx].parent())
                ret.push_back(solution[p_idx].state());
        ret.push_back(start);
        std::reverse(ret.begin(), ret.end());
        return ret;
}

#endif

main.cpp:用來測試的...

#include <iostream>
#include <vector>
#include <sstream>

#include <unistd.h>

#include "board.h"
#include "astar.h"

typedef Board_4x4 BOARD_T;
typedef Distance_4x4 DIST_T;
typedef Solution_4x4 SOL_T;

int main(int argc, char* argv[])
{
        int random_seed = 0;
        if (argc > 1)
        {
                std::stringstream ss(argv[1]);
                ss >> random_seed;
        }
        srand(random_seed);

        std::cout << "Random seed: " << random_seed << std::endl;

        BOARD_T b(true), t(false);

        std::cout << "Start:" << std::endl << b << std::endl;
        std::cout << "End:" << std::endl << t << std::endl;
        std::cout << "Trying hard to solve (with A*)..." << std::endl;

        std::vector< BOARD_T > result = astar_search(b, t, DIST_T(t), SOL_T() );

        std::cout << "Solution steps: " << result.size() << std::endl;
        for(std::vector< BOARD_T >::iterator i = result.begin();
            i != result.end();
            ++i)
        {
                //sleep(1);
                std::cout << *i << std::endl;
        }

        return 0;
}

如果編不起來,那是的問題!BSD License

星期二, 3月 27, 2007

螢幕燒掉了 @o@

昨天(March 26, 2007)中午左右,在我回味老動畫 - MADLAX 的時候,突然螢幕一黑,伴隨而來一陣燒焦的味道。我首先以為是顯示卡燒了,所以馬上去按著主機上的 Power Button 四秒(感謝 Journaling Filesystem 的加持,沒有 dataloss。)然後又想到也可能是螢幕的問題,所以馬上又伸手按下螢幕的電源開關。

後來靠近聞主機屁股,並沒有半導體的焦味,再去聞一下螢幕... 果然是 AG Neovo E19 A 燒了...... 幸好機板跟面板都是三年保固,May 2004 買的,差兩個月就過期了 = = 趕快打他網頁上的電話,問他要怎麼辦。

AG Neovo 的處理還蠻迅速的,昨天下午打電話,今天上午在我睡夢中就來拿了。不過他沒有收件的單子給我,也不知道要多久才會送回來,看來我這兩個禮拜電話要開著了 @@

所以,這台電腦現在完全從 MultiMedia Center + Server 退化成 Server 了 QQ,主要跑的服務剩下:

  • 動物
  • NAT
  • mpd
  • apache2 + php
  • dante

星期日, 3月 25, 2007

netconsole & syslog-ng

最近我的筆電動不動就 kernel panic,也不知道到底出了什麼問題。想看 backtrace 也不行,因為總是在 X 底下死掉,沒有 console 讓我看 log。而 kernel panic 的時候 print 出來那些東西,也不會跑進 syslog 裡。所以啦,只好讓他 log 到 remote 了...

其實,在 Gentoo 要用 netconsole 是很簡單的。因為是 "NET"console,所以當然會有一台 client 一台 server。首先假設我們的環境看起來像這樣:

  • Server:192.168.1.1:6667
  • Client:192.168.1.99:6665

Client 端(Kernel module 與 cancd)

首先在 client 上,編譯核心的時候,選擇 netconsole 模組(記得選 M 唷!):

  Device Drivers  --->
    Network device support  --->
      <M>   Network console logging support (EXPERIMENTAL)
      [*] Netpoll support for trapping incoming packets
      [*] Netpoll traffic trapping

好啦,雖然我不知道最下面兩個是幹嘛的,不過還是把他們打開吧(反正打開也不用錢...)!順便打開 Magic SysRq:

    Kernel hacking  --->
      [*] Magic SysRq key

編譯並安裝,請把 {N} 替換為您的 cpu core 數量 +1:

# make modules -j{N} && make modules_install

然後,裝上 cancd(CA NetConsole Daemon)...

# emerge cancd -va

設定 /etc/conf.d/netconsole:

# 填入 Server 的 IP,這裡以 192.168.1.1 為例:
TGT_IP='192.168.1.1'

# 與該 IP 對應的 device
DEVICE=eth0

# 如果沒寫的話,會用該 device 的第一個 IP 位置。
# 如果該設備在開機時不會拿到 IP 位置,則您必須在這裡輸入它。
SRC_IP=''

# Client 要使用的 Port,可以隨便給。以下為預設值!
SRC_PORT=6665

# Server 端的 Port,當然要與 Server 上設定的相同
TGT_PORT=6667

# 如果要使用廣播,則輸入 'broadcast'。但是要注意安全性!
# 我們不用,所以就不輸入了...
TGT_MAC=''

# 紀錄的等級,從 [0..7] 分為:
# EMERG, ALERT, CRIT, ERR, WARNING, NOTICE, INFO, DEBUG
# 恩... 我選了 7 (DEBUG)
LOGLEVEL='7'

將 netconsole 加入 default runlevel 並啟動它...

# rc-update add netconsole default
# /etc/init.d/netconsole start

「咦~」您也許會問,「就這樣丟 log 出去不會連線失敗嗎?那 Server 咧?」。別急別急,反正也不會直接有訊息丟出來(唔,如果您很倒楣的,Client 在此時 Kernel Panic 了,那我只能說很抱歉 = =),馬上接著來設定 Server!

Server 端(Syslog-ng)

編輯 /etc/syslog-ng/syslog-ng.conf,「加入」以下設定(別把上面之前的東西刪掉喔,不然本來系統的 log 就不知道要記到哪裡去了 = =):

# 首先是 ip 與 port,如果不知道要改哪裡,
# 請把 Linux 分區 format 掉,去買套 Windows Vista
source net_src { udp(ip(192.168.1.1) port(6667)); };

# 在這裡設定紀錄檔,此以 /var/log/net_msgs 為例。
destination net_msgs { file("/var/log/net_msgs"); };

# 接著是要從哪裡紀錄到哪裡...
log { source(net_src); destination(net_msgs); };

# 如果要順便寫到 tty12,就加入以下這行:
# (一般來說都是 tty12 吧?要看之前上面的設定。)
log { source(net_src); destination(console_all); };

好啦,重新啟動 syslog-ng 吧!用 reload 他就會重新讀取設定檔了,不必用 restart。

# /etc/init.d/syslog-ng reload

測試一下!

恩... 我想,您剛才應該有把 Magic SysRq 打開吧?如果有的話,請在 Client 按下 Alt-SysRq-m,然後去 Server 看一下 /var/log/net_msgs 從 Client 傳來的訊息!

星期六, 3月 17, 2007

如果你想知道磁碟 I/O 到底會拖慢多少啟動程式的速度

那就這麼作吧!

// 首先當然是關掉你要測的那個程式, 別忘了先把重要資料存檔
# killall -9 firefox-bin
// 呼叫 sync 把重要資料寫入硬碟
# sync
// 然後清掉 buffer/cache
# echo 3 > /proc/sys/vm/drop_caches
// 重新啟動(Enjoy the waiting :P )!
$ firefox

星期日, 3月 04, 2007

令我日思夜想的檔案系統

奇怪,怎麼都沒人想到呢?

先前提到說,適當的將檔案系統壓縮,可以提高磁碟的存取效率 - 尤其是 CPU 速度與 IO 速度差很多的時候。雖然沒有完整的數據顯示到底快多少,不過 RANMA K 兄有初步測試過不壓縮與壓縮時的寫入、讀取速度。況且還有個良好的副作用 - 同樣大的硬碟空間裡,可以裝的東西更多了,而且完全不會變重

根據用屁股思考就可以領悟的常識,我們知道:

  1. CPU 的 IO 速度非常快(相對於硬碟)
  2. Disk 的 IO 速度非常慢(相對於 CPU)
  3. 大部分人的 Desktop PC,CPU 使用率並不會常保 100%...
  4. 越大的檔案越有機會產生 Fragmentation,而 Fragmentation 會增加 Seek Time。
  5. 若資料已經壓縮過了,再壓一次只是浪費時間。(呃... 廢話! = =)

所以,希望有一種檔案系統的,會根據檔案的狀態來選擇性的壓縮檔案,大概像這樣:

  1. 首先有個選項來針對檔案設定是否壓縮,例如 compress_attribute:
    • Always:總是壓縮
    • Automatic:根據下述規則決定是否壓縮
    • Never:絕對不要壓縮
  2. 如果檔案太小,就不壓縮。
  3. 如果檔案已經被壓縮過,就不壓縮。例如:
    • 一般壓縮檔:ace, bz2, gz, rar, tbz2, tgz, zip... etc.
    • 壓縮過的多媒體檔案:avi, mpg, mpeg, mp3, wma, wmv... etc.
    • 壓縮過的圖片檔:gif, jpg, mng, png... etc.
  4. 其他還沒想到的規則...

當然,這個檔案系統要有現代檔案系統該有的功能,例如:

  • Journaling
  • Online Repacker
  • POSIX ACL
  • Online resizing (grow and shrink)
  • 其他還沒想到的功能...

如果有相關的資料或論文,還請不吝留個言... 多謝!

星期四, 2月 22, 2007

小時候寫的作文

過年嘛,總是要掃除一下。雖然我沒有想要打掃的意思,但是還是把櫃子裡的東西拿出來,東翻翻西翻翻以後再放回去,假裝有整理過些什麼。

翻一翻,找到了國小五年級的作文簿!真感謝我媽沒把他當資源垃圾拿去回收,讓我看到我以前有多麼無厘頭。下面還只是其中一篇(其實我懶得打字,而且其他幾篇寫的還蠻丟臉的 |||>_<b)...

冬天

今天是冬天。(啊!說錯台詞!?現場直播!不能改了。繼續編下去吧!)那一顆松是在搖。對,他在姚。它是咖啡色的,葉子也是。很醜。對!很... 什麼?很醜?你... 算了。我有一個故事,我們來分享一下:

在一個大雪紛飛的冬天,在那個森林裡...。「那個」森林是什麼東東?就是「這個」森林!有一對父子,在打獵。嗯!廁所在哪裡。廁所?你說「廁所」做什麼?你「嗯!」不是要「便」魔術嗎?你不必管!繼續說!經過一天,也打不到東西,卻在森林中迷路了。在那時,他們看到一間小屋,就近去了。這時,他們因為很累,就睡了下來。到了半夜,兒子看到了一個「石膏色」的女人,從們旁邊的牆中飛了進來。向他爸爸吹了一口氣。他爸爸的血液就結冰了!雪女說:「我不要你的命。但是你把今天的事情說出去,你也是我牙下的客人。」說完,就走了。這個小男孩長大以後,在十二月十二日的晚上十二點十二分十二秒,遇到了一個名叫「小雪」的女孩。這個小男孩就和這女孩結婚了。在洞房的那一天,那個小男孩說:「我...,」那小雪的眼睛為之一亮!「就是『怪歐吉桑』!」結果,在外面的爸爸靈魂跌了一跤「掉」進來,這場戲再也演不下去了。

完!

現在看看,發現...

  • 我以前一定很討厭寫字 - 加超多標點符號(很多單引號跟驚嘆號)跟簡單的字(十二月十二日的晚上十二點十二分十二秒)撐篇幅。
  • 喜歡自言自語 - 第一段沒用的前導跟故事開始的第一段,因為一直在跟讀者說話,所以搞不清楚到底要表達些什麼。
  • 故事中的人物也搞不清楚自己在幹嘛 - 雪女說「你也是我牙下的客人」,但是她並沒有嚼食他爸爸啊...!
  • 從頭爛到尾 - 一定是因為老師說要寫四頁,所以我一寫超過四頁,馬上就隨便作個結束 = =
  • 導師評語 - 文章形式特殊,但似乎沒有表達出「冬天」!(哪有!看完後不覺得很冷嗎?想想其實蠻切題的 = =)

PS. 『怪歐吉桑』是志村大爆笑裡,由志村健飾演的那個怪叔叔。

星期二, 2月 13, 2007

圖片加密函式庫

最近獨孤木前輩弄了個 Diggirl.Net 出來,服務的內容... 恩... 連過去玩一圈就知道了。於是,就搞得一些相簿的主人不開心了!

其實,我也認為任何資料只要放到網路上(應該說,資料公開以後),就不能再做什麼進一步的禁止行為了。因為網路本身是一種類似「群播(broadcast)」的機制,放出去的東西就是放出去了,沒什麼好限制的。就好像你想到台北車站前面大喊「我腦殘啊!」,卻又不想讓任何人聽到,是不可能的事情一樣。所以,圖片如果不想流出去,就好好收在自己的硬碟裡吧!

Okay... 以上是前言,接下來進入我實際想到的東西。

也許,在某些時候,你會希望能在相簿上分享某些圖片,卻又只想給指定的某些人看到。其實有很多 PKI 早已行之有年,也在很多關鍵應用上扮演重要的角色。所以,應該也可以應用到這個狀況上來!

讓我們拿 Alice 跟 Bob 來當例子,他們是我眾多虛擬朋友中的兩位:

Alice 想傳一些裸照給 Bob,可是又怕被別人看。因為有幾萬張照片要傳,用 email 又太花時間了。於是,她決定選用由 Palatis Inc. 所開發的圖片加密函式庫!

首先,他使用程式提供的兩套軟體,產生適當的 keypair,並使用該 keypair 將資料加密:

  1. 使用函式庫提供的 keygen 產生 keypair (pubkey, prikey)
  2. 將自己的裸照 (naked*.{jpg,png,gif,bmp,tiff, ... }) 經程式轉為 bitmap (naked*.bmp),並使用 pubkey 加密以後,轉回 png 一類非破壞性壓縮的圖檔 (naked*_secured.png)。於是,轉出來的東西用其他圖形函式庫看起來,就像是白胡椒鹽撒在黑胡椒鹽(... 總之就是胡椒鹽)上一樣。

再來,將這些胡椒鹽照片傳送到適合大量下載的網路空間(如網頁、相簿、ftp、bt)上。

使用另外的管道(如 email)將 prikey 送給 Bob,並祈求 Bob 不會把她的裸照洩漏出去。當然,該 email 會用其他軟體(如 GnuPG)加密。(或簽章,否則 Bob 可能也不知道收到的是否真的是 Alice 的裸照。)

Bob 本來去 Alice 的相簿看到的只是一堆胡椒鹽的裸照,但是當他拿到 Alice 送來的 prikey 以後,世界頓時亮了起來!

  1. Bob 把 Alice 給他的 prikey 放到函式庫搜尋 key 的資料夾(如 /home/bob/.libsecreatpic/received_keys/)底下。
  2. 然後用他心愛的網頁瀏覽器(順便廣告一下 Firefox!)開啟 Alice 的相簿。

Yeah~胡椒鹽都不見了,取而代之的,是 Alice 性感火辣(?)的曲線!

至於實做細節的部份,因為沒空,所以以後再想 *flee*。

星期六, 1月 06, 2007

Hidden 火星文++

之前提到我們學校某教授在個人網頁上弄了這個東西,今天又因緣際會的去到了他的網站。耶~他把那篇文章拿掉了耶!

可是... 直接輸入 http://seafood.csie.cyut.edu.tw/seafood/HSIEN.htm 的話,還是連的到說... 因為看起來的跟之前一樣,所以就不重複貼了。

恩... 這就是所謂的「眼不見為淨」嗎?

星期一, 1月 01, 2007

libata - 新的 ata 子系統!

赫然發現我的 Linux 還在用舊的 ATA Subsystem,而使用 SCSI Layer 的 libATA 已經出來很久了!

所以,今天來升級!

因為我是個懶得作 initrd 的懶人,所以底下的支援都編進核心。如果您要編譯成模組,則必須自己想辦法作 initrd。

Device Drivers --->
    SCSI device support --->
        <*> SCSI disk support
    Serial ATA (prod) and Parallel ATA (experimental) drivers --->
        <*> ATA device support
        // 這邊請選與您 IDE 晶片對應的驅動程式
        <*>   ATI PATA support (Experimental)
        <*>   Generic ATA support

然後去 /boog/grub/grug.conf 與 /etc/fstab 或其他設定檔中,把用到 hdXY 的地方統統改成 sdXY 就可以了!

不知道用新的 ATA Layer,會不會有感覺得到 performance boost?

sdparm 的使用方法徵求中!

星期三, 12月 27, 2006

擠壓你的檔案系統

/***********************************
大肥警告!
Big Fat Warning!

這篇文章裡提到的技術可能讓您的資料爆炸,請斟酌使用!
The techniques introduced in this article may blow your data, use them at your own risk!
***********************************/

最近總覺得硬碟很慢... 應該說,作一些需要磁碟 I/O 的動作的時候,感覺硬碟一直嘎啦嘎啦的上氣不接下氣。所以有了這樣的想法:

  1. 現在 CPU 速度呈指數成長
  2. 磁碟傳輸速度呈線性成長(大部分的瓶頸在磁頭讀寫動作)

既然如此,何不適當的要求 CPU 作多一點計算,減少磁碟 I/O 呢?於是就想到要壓縮檔案系統。

可是... 要怎麼壓縮呢?可以從兩個地方著手:

  1. Loop Device Level:使用如 cloopcompFUSEd 等辦法,在 regular filesystem 的 regular file 上再多加一層間接層來壓縮。
  2. Block Device Level:在 Device Driver 加上一層間接層來壓縮,例如使用 dm-cryptcryptsetup-luks
  3. Filesystem Level:讓 Filesystem Driver 來負責處理壓縮,例如使用 jffs2、ext2compr 或 Reiser4experimental cryptcompress plugin

我的想法是,我是要來增進磁碟效能的,所以不應該搞一大堆間接層來拖慢系統速度,所以 cloop 那種東西就根本不考慮了。後來又想從 Block Device Level 來做的,可是 dm-crypt 與 cryptsetup-luks 非常悲慘,還真的只能作 CRYPTographic,沒辦法做 COMPRESSion。我嘗試用 cryptsetup -c lzf luksFormat 來建立 lzf compressed block device,可是殘念的失敗了 XD~

於是,只好讓 Filesystem 來壓啦!可是 jffs2 的間接更多,必須先有個 loopfile map 到 mtd(Memory Technology Device)上,再 mount mtdblock 來用。處理起來速度比沒壓縮的 ext3 還慢,所以... 還是算了吧!而 ext2compr 這個東西實在太老了,只有在 google 搜尋的時候隱約發現他的蹤跡,可是真的想要找 howto 的時候卻什麼也找不到。所以... 這個也算了吧 = =

最後的救星是 Reiser4 的 Cryptcompress plugin,也是要 patch kernel source,也要升級 reiser4progs。

安裝的方法比想像中簡單的多。首先,你需要一個支援 Reiser4 與 cryptcomress 的 kernel,再來就是支援 cryptcompress 的 {mkfs,fsck,debugfs,measurefs}.reiser4。讓我們從 kernel 開始:

// 如果您已經有裝 app-portage/layman,可以省略這個步驟:
# emerge app-portage/layman
// 如果您已經有加入該 custom-kernels overlay,可以省略這個步驟:
# layman -a custom-kernels
// 最後,這是支援 reiser4 與 cryptcompress 的 kernel:
# emerge sys-kernel/beyond-sources

然後,在 make *config 的時候,把 reiser4 support 打開(廢話!),編譯您的新 kernel,然後用它開機。

再來是 userspace tools - 新版的 reiser4progs。這個我沒有找到任何 overlay 裡面有(其實它也還沒有正式 release),所以先貼在這吧!

# Copyright 1999-2006 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-fs/reiser4progs/reiser4progs-1.0.5.ebuild,v 1.5 2006/08/20 21:23:43 vapier Exp $

inherit toolchain-funcs

MY_P=${PN}-${PV/_p/-}
DESCRIPTION="reiser4progs: mkfs, fsck, etc..."
HOMEPAGE="http://www.namesys.com/v4/v4.html"
#SRC_URI="ftp://ftp.namesys.com/pub/reiser4progs/${MY_P}.tar.gz"
SRC_URI="ftp://ftp.namesys.com/pub/tmp/cryptcompress/2.6.19-rc4-mm1/${MY_P}.tar.gz"

LICENSE="GPL-2"
SLOT="0"
#KEYWORDS="amd64 ppc ppc64 -sparc x86"
KEYWORDS="~amd64"
IUSE="static debug readline"

DEPEND=">=sys-libs/libaal-1.0.5
       readline? ( sys-libs/readline )"

S=${WORKDIR}/${MY_P}

src_unpack() {
    unpack ${A}
    cd "${S}"
    # bundled libtool sucks, so rebuild autotools #74817
    aclocal && libtoolize -c -f && autoconf && automake || die "autotools failed"
    cat <<-EOF > run-ldconfig
        #!/bin/sh
        true
    EOF
}

src_compile() {
    econf \
        $(use_enable static full-static) \
        $(use_enable static mkfs-static) \
        $(use_enable static fsck-static) \
        $(use_enable static debugfs-static) \
        $(use_enable static measurefs-static) \
        $(use_enable static cpfs-static) \
        $(use_enable static resizefs-static) \
        $(use_enable debug) \
        $(use_with readline) \
        --enable-libminimal \
        --sbindir=/sbin \
        || die "configure failed"
    emake || die "make failed"
}

src_install() {
    make DESTDIR="${D}" install || die
    dodoc AUTHORS BUGS CREDITS ChangeLog NEWS README THANKS TODO
    #resizefs binary doesnt exist in this release
    rm -f "${D}"/usr/share/man/man8/resizefs*

    # move shared libs to /
    dodir /$(get_libdir)
    mv "${D}"/usr/$(get_libdir)/lib*.so* "${D}"/$(get_libdir)/ || die
    gen_usr_ldscript libreiser4-minimal.so libreiser4.so librepair.so
}

把這個檔案放到 /usr/local/portage/sys-fs/reiser4progs/reiser4progs-1.0.6.ebuild,然後...

# cd /usr/local/portage/sys-fs/reiser4progs
# ebuild reiser4progs-1.0.6.ebuild digest
# emerge reiser4progs -va

編完以後,就可以來作新的分割區了!別忘了將各參數改成您的設定。

// 先將檔案備份起來
# cd /
# tar cp /path/to/mounted_dir > /path/to/backup_file.tar
// 卸載檔案系統
# umount /dev/hdXY
// 建立檔案系統(使用 lzo 壓縮演算法)
# mkfs.reiser4 -o create=ccreg40 /dev/hdXY
// 建立檔案系統(使用 gzip 壓縮演算法,較耗費 CPU)
# mkfs.reiser4 -o create=ccreg40,compress=gzip1 /dev/hdXY
// 掛載檔案系統
# mount /dev/hdXY
// 還原備份檔
# cd /
# tar xf /path/to/backup_file.tar
# sync

在 umount 之前可以先 df 紀錄用掉的空間,跟改用 cryptcompress 以後比較看看。我的狀況是 855M 變成 524M,省了 331M 的空間。

星期日, 11月 12, 2006

用 webSnarp 在網頁上顯示小預覽圖

webSnarp 2.0 是個提供網頁預覽圖服務的網站,詳情請上該網站去了解... 底下有提供一些小玩具,可以在網頁上加上一些特殊功能,讓滑鼠經過連結的時候跳出該連結的預覽圖。

但是我試圖將它套用在 Blogger 上的時候,若是想在以前的文章上也套用該功能,就必須去修改之前的所有文章。想當然我沒那麼勤勞,所以就把其中 Link Preview V2 提供的 JavaScript 改了一下,放在這裡,有需要的人可以去下載來用。

不過有一點需要注意,因為是寫來套用在 Blogger Beta 上的舊文章的,所以我讓他掃描所有的網址,並依照一定的規則排除要跳出預覽圖的網址。詳情請見 websnapr.js 內的「excludeDomains」與「excludeExtensions」兩個變數。

這是適合 Blogger beta 的版本,請不要套用在其他地方。安裝的步驟如下:

  1. 這裡 下載 websnapr.tar.bz2
  2. 修改「websnarp.js」中的「myBaseURI」變數至您的網頁空間
  3. 將所有檔案放到自己網頁空間下,記得要放在同一個資料夾裡!
  4. 去 Blogger 範本中修改 html 的地方,找到 <title> 標籤,在底下插入: <style media='screen' type='text/css'>@import "[您的網頁空間]/websnapr.css";</style>
    <script src='[您的網頁空間]/websnapr.js' type='text/javascript'/>
最後,顯示出來的效果就像這樣

星期日, 10月 29, 2006

COSCUP 2006~~

COSCUP 2006 晃了一圈回來,感覺功力增進了不少!不同於那個偽.OSS 社群本次的議程採雙軌制,一邊以技術議程為主,另一邊則是從 User && Promotor 的角度切入。會外還附點心、午餐、跟晚餐,最重要的是「這些統統都是免費的」!!!話雖如此,由於這次的主辦單位透露經費還是赤字,所以我丟了 TWD$100 進捐款箱...(是... 我知道很少... 我知道我吃了很多點心、喝了很多飲料、還拿了個便當......)

想當然爾,我聽的當然全都是技術議程啦!(程式設計之神來演講,去聽什麼 Open Source 數位生活還是Open Source 最佳實踐的,實在太浪費了!)我聽的是「中文輸入工作坊」、「羽量級桌面」、與「Web-Oriented Architecture」三項,議題內容就不再贅述,只提一下自己覺得有趣的東西好了~

首先一開始介紹的輸入法技術,真是救了我一條命 @@ 我的畢業專題是 OSS 的手寫輸入法(目前有一點點 code 可以從 svn checkout),而今天的議程有提到許多數學模型與相關演算法,給了我個大方向!其中提到目前中文分詞技術的進展,講了許多技術性的議題,非常有意思。

接下來的羽量級桌面,jserv 與 pcman 發表了一堆好玩的東西,包括如何從根本的設計上改善桌面效能,還有 FreeDesktop.org 這個邪惡組織公佈的黑心標準有多可惡怎樣讓效能好不起來。

然後是 Web-Oriented Architecture,介紹了目前很紅(比 Britney Spears 還要紅上好幾倍)的 Web 2.0。先前有在構思一個線上翻譯網站,其技術實現的部份,就很想朝 Web 2.0 與 AJAX 的方向走。而為了縮短開發時間,應該會使用某些既有的 Framework,如 Ruby on RailsCakePHP 等。雖然目前已經申請了專案網頁,但是目前還沒有開始動手作。想想,應該也是時候開始了,就在期中考週有空的時候 來作吧!

另外... 必須對 jserv 的筆記型電腦表達哀悼之意,它被 PingYeh 踢到地上以後,就不會開機了...

總覺得,來這裡聽一天演講,學到的東西比去學校聽黃國安陳金鈴劉啟東陳宏達這些爛教授上課 自己在家猛 k 文件 得到的東西多的多!

星期五, 10月 06, 2006

愛因斯坦他老師

今天上通識課(中國經籍與說話藝術)的時候,老師跟我們講了個愛因斯坦的故事...

大家都知道愛因斯坦小時候是個不討老師喜愛的學生吧?有一次上勞作課的時候,老師要求每個同學作一張小板凳當作業。當愛因斯坦交出他所作的板凳給老師的時候,老師對他說:「我想,在這個世界上,大概找不出比這張板凳更爛的作品了。」

但是「不,」愛因斯坦說道,「老師你錯了!」。接著,他從旁邊拿出另外兩張板凳,「這張是我第一次做的,這張是第二次做的。」

說完這個故事,老師要求我們在一張紙上寫下一句話的啟發,並交上來當成一次課堂成績。於是我寫下了...

  • 當老師的不要太機車。

就交過去了......

哎呀... 真糟糕... 不知道會不會被當 = =

星期二, 9月 19, 2006

你會上網買新台幣 $236,600,000 的東西嗎?

知名網路公司 PCHome 在網路上賣遊艇耶!

有誰會在網路上買一台價值超過兩億三千萬的遊艇呢?即使買了,要怎麼付錢呢?如果刷卡,有什麼卡一個月可以刷六百五十萬(36 期 0 利率)的嗎?如果有,我還真想知道 XD~~

照 PCHome 標錯價格的機率,等他少標個幾個零就可以趕快去下標了。

星期六, 9月 16, 2006

圖書館排擠我,不准我推薦書~

我們學校圖書館有個立意甚好的服務,叫做「線上圖書薦購系統」。可是這個立意甚好的服務,被這個兩光的網頁設計公司(好啦,我不知道這個是外包給外面的廠商,還是「外包」給我們學校資管系的...)一搞,變得亂七八糟...

怎麼說是亂七八糟呢?因為...

  1. 縮排亂七八糟,想 trace 還要先整理一次。
  2. 檔頭趾高氣昂的說自己是 XHTML,可是卻用了一堆 HTML 的 tag(如 center、font... 等等)。(不能因為是 Transitional 就這樣惡搞吧?)
  3. 使用 VBScript 作為 User 端的驗證,搞得只有用 IE 的使用者有辦法推薦...

我只是百無聊之中想看一下 ARM(The Annotated C++ Reference Manual),所以想說去圖書館找找,卻找不到這本書,想讓他們下次買個幾本放著生菇。不能推薦實在不方便,於是寫了封信給圖書館...(個人資料部份消音)

Subject: 圖書薦購系統能不能不要使用 VBScript 作驗證?

辛勞的圖書館採編組工作人員您們好,

能不能不要用 VBScript 作用戶端資料驗證?因為敝人並非使用微軟作業系統,沒有 Internet Explorer。如果有需要,我可以寫好有相同功能的 JavaScript 讓您替換就好。

因為此 VBScript 驗證碼的緣故,造成敝人在推薦書籍時的不便,所以懇請您們換用其他方法。

諸多感謝!
**同學,您好!

先謝謝你的來信建議!

圖書薦購系統開發之初,由於上線時間急迫,確實僅能以大多數用者作業環境為優先考量,以求立竿見影之效。在本館戮力於提供更便利、多元、精緻的服務過程中,"人力" 問題則是我們經常感到捉襟見肘之處;若你真願意義務性提供協助,我們則熱誠的歡迎,一起來嘗試並努力,以期能縮短過程、增進時效。

後續就有請你主動與本館資訊組**小姐聯繫
(分機:****, mail address :   *****@cyut.edu.tw)。

謝謝您!!

圖書館採編組 敬上

基本上,我實在看不出什麼原因會導致上線時間急迫就必須採用 ASP+VBScript。說實在 Server 端用什麼系統跟 Client 端一點關係也沒有,反正 Server 就那麼一台(一群?),關起門來愛怎麼搞都沒差。不過丟出來給 Client 的東西,難道不值得多考慮一下嗎?還是因為「上線時間急迫,所以省去評估的時間,直接下去 Coding」?

我一直以為,「網路服務」應該要以「能服務越多客戶越好」為目標。採取開放規格開發出來的東西,總是能比較簡單的符合各式客戶的需求。無論如何,支援 JavaScript 的瀏覽器再怎樣也比支援 VBScript 的多吧?

好啦,可能廠商要賺錢,賣 MS 的東西賺比較多,所以最後搞出來這個亂七八糟的系統吧 = =

測試編譯器功力的九九乘法表原始碼

最近迷上 template meta-programming,所以百無聊之中(相對於百忙之中...)寫了個入門等級的小程式。類似功能的程式應該很多程式設計師還沒出茅廬的時候就都寫過了吧!

為什麼說是測試「編譯器」的功力呢?因為這個程式用到了一些高階的 template 功能,並不是所有 compiler 都支援。如果您手上的編譯器是 VC6 的話,請去 Program Files 底下把它拖曳進資源桶,然後改用 dev-c++(它使用 GCC 3.4.2)。使用 GCC 4.1.1(我是用這個編譯、測試的)是完全沒有問題的 :)

本來想稍微講解,可是想想又覺得沒什麼好說的,畢竟只是無聊的小作業 = = 如果有什麼問題,歡迎留言、MSN、Email、電話討論。以下附上程式碼!


/*
 * Meta-programming Infrastructure
 */

struct NullType { };

template <typename Head, typename Tail>
struct Typelist { };

/**
 * meta-(data structure) to store "X x Y = Z"
 */

template <unsigned int X, unsigned int Y>
struct ChartNode
{
    enum { first = X, second = Y, product = X * Y };
};

/**
 * Chart Maker...
 *
 * @param X, Y: current X and Y
 * @param XN, YN: max X and Y
 */

template <unsigned int X, unsigned int Y, unsigned int XN, unsigned int YN>
struct makeChart
{
    typedef Typelist< ChartNode<X, Y>, typename makeChart<X+1, Y, XN, YN>::Result > Result;
};

template <unsigned int Y, unsigned int XN, unsigned int YN>
struct makeChart<XN, Y, XN, YN>
{
    typedef Typelist< ChartNode<XN, Y>,
        Typelist< NullType, typename makeChart<1, Y+1, XN, YN>::Result > > Result;
};

template <unsigned int XN, unsigned int YN>
struct makeChart<XN, YN, XN, YN>
{
    typedef Typelist< ChartNode<XN, YN>, NullType > Result;
};

/**
 * Algorithm to write a ChartNodeList to an Ostream
 */
template <typename TList>
struct toOstream;

template <typename X, typename XS>
struct toOstream< Typelist<X, XS> > : toOstream< XS >
{
    template <typename OST, typename DELIM>
    OST & operator() (OST & dest, DELIM delim1, DELIM delim2)
    {
        dest << X::first << "x" << X::second << "=" << X::product << delim1;
        return toOstream<XS>::operator()(dest, delim1, delim2);
    }
};

template <typename XS>
struct toOstream< Typelist<NullType, XS> > : toOstream< XS >
{
    template <typename OST, typename DELIM>
    OST & operator() (OST & dest, DELIM delim1, DELIM delim2)
    {
        dest << delim2;
        return toOstream<XS>::operator()(dest, delim1, delim2);
    }
};

template <>
struct toOstream<NullType>
{
    template <typename OST, typename DELIM>
    OST & operator() (OST & dest, DELIM, DELIM delim2)
    {
        dest << delim2;
        return dest;
    }
};

/*
 * Main Program...
 */
#include <iostream>
#include <iterator>
using namespace std;

int main()
{
    enum { x = 9, y = 9 };
    cout << "make a Chart from [(1x1=1) .. (" << x << "x" << y << "=" << x*y << ")]:" << endl;

    typedef makeChart<1, 1, x, y>::Result ChartList;
    toOstream<ChartList> generator;
    generator(cout, ", ", "\n");

    return 0;
}

整個演算法包裝成一系列的 template objects,最後再丟給 toOstream<> 這個唯一有被具現化的 template object,其他程式碼全部都在編譯時期被展開了!帶入 x = 9, y = 9 的結果:

$ ./ninenine
make a Chart from [(1x1=1) .. (9x9=81)]:
1x1=1, 2x1=2, 3x1=3, 4x1=4, 5x1=5, 6x1=6, 7x1=7, 8x1=8, 9x1=9,
1x2=2, 2x2=4, 3x2=6, 4x2=8, 5x2=10, 6x2=12, 7x2=14, 8x2=16, 9x2=18,
1x3=3, 2x3=6, 3x3=9, 4x3=12, 5x3=15, 6x3=18, 7x3=21, 8x3=24, 9x3=27,
1x4=4, 2x4=8, 3x4=12, 4x4=16, 5x4=20, 6x4=24, 7x4=28, 8x4=32, 9x4=36,
1x5=5, 2x5=10, 3x5=15, 4x5=20, 5x5=25, 6x5=30, 7x5=35, 8x5=40, 9x5=45,
1x6=6, 2x6=12, 3x6=18, 4x6=24, 5x6=30, 6x6=36, 7x6=42, 8x6=48, 9x6=54,
1x7=7, 2x7=14, 3x7=21, 4x7=28, 5x7=35, 6x7=42, 7x7=49, 8x7=56, 9x7=63,
1x8=8, 2x8=16, 3x8=24, 4x8=32, 5x8=40, 6x8=48, 7x8=56, 8x8=64, 9x8=72,
1x9=9, 2x9=18, 3x9=27, 4x9=36, 5x9=45, 6x9=54, 7x9=63, 8x9=72, 9x9=81,

令人驚豔的囉唆... @@

星期日, 8月 20, 2006

這東西只要 USD $18,500!

之前提到過,使用 Quantum-Optimized CPU 的 Super Notebook,一台只要 $18,500!

規格好像有點變化...

  • 中央處理器:AtomChip® Quantum® II @ 6.8GHz
  • 主記憶體:AtomChip® Quantum-Optical 非揮發性記憶體 1TB
  • 螢幕: 12.1" WXGA (1280x800, 16:10) TFT 背光 LCD 顯示器
  • 顯示晶片:整合式圖形控制器 [ 支援 AtomChip® DVM(動態顯示記憶體)]
  • 輔助儲存媒體:AtomChip® Quantum Storage 2TB
  • 光碟機:DVD Super Multi
  • 網路介面:802.11 無線網路 [ Intel® PRO/Wireless 2100/2200GB/2915ABG ]、藍牙、GPS、LAN、Modem
  • 連線介面:IEEE1394A x 1、USB 2.0 x 3、SVGA-out、立體聲耳機孔
  • 插槽:PCMCIA x 1、四合一讀卡機 [ SDIO、SD、MS Pro、MS ]
  • 其他週邊:內建 1.3 百萬像素相機、立體聲喇叭、麥克風
  • 輸入介面:多媒體鍵盤 [ E-Mail、Internet、Capture、WLAN 按鍵 ]、內建 4 方向捲動按鈕的 Synaptics 觸控版
  • 大小:(寬)320.0 x (長)242.0 x (高)22.0mm/28.0mm (前/後)
  • 重量:約 4.18lb (1900g)
  • 作業系統:Windows XP 或 Linux

不知道什麼時候開始出貨...

星期日, 8月 13, 2006

線上翻譯網站

不,你錯了!我並不是要介紹什麼類似 AltaVista - Babel Fish Translation 的線上翻譯網站,而只是在這裡貼上一點個人想法與計畫。我可能會在不久以後的將來動手實做軟體的部份,不過資料可能就得靠大家幫忙一起輸入。

想做的東西,是可以讓有意幫忙翻譯 Linux 軟體的使用者直接在線上翻譯軟體的介面網站。這個網站跟一般認領軟體的 .pot、回家翻譯好、再上傳給翻譯協調者的作法不一樣,而是讓你直接在網站上翻譯軟體!作法有點類似 WindizUpdate 的翻譯方法,他隨機列出網頁上的一句英文讓使用者翻譯,收集了許多使用者的回饋以後,由演算法決定最適當的翻譯。

我想做的東西也有點類似這樣!也許您今天閒的發慌,想作些本地化(Localization)的工作。於是,來到了這個線上翻譯網站。或是,您是專程為了翻譯某個軟體,或是發現某個軟體的翻譯有不完全、翻譯錯誤的部份想要幫忙修改。首先您可能會看到個這樣的畫面...

歡迎您的到來,在這裡您可以讓世界更美好云云...

  • 我想翻譯特定軟體
    經由搜尋、清單... 等功能,直接進入該軟體的翻譯區。
  • 沒有特定的目標
    由系統隨機選取需要翻譯的軟體,讓使用者翻譯。

選定了想翻譯的軟體(隨便舉一個簡單的範例,例如 gcalctool 好了!),網頁上會列出目前翻譯的狀態與累計的翻譯。您可以直接選擇使用已經有的翻譯,也可以加入新的翻譯。若是不想翻譯,可以在前面的核取方塊設定。

全選
原文 翻譯
......
Set numeric base to binary (base 2)
......
Set display type to engineering format
......

翻好之後,使用者就暫時沒事了,輪到翻譯協調者啦!翻譯協調者可以從下載系統產生的 .po,將它回饋給更上游的軟體設計團隊。

此篇文章只描述 Use Case,系統內部的資料格式、介面呈現等還需要另外設計,如何從上游取得需要翻譯的資料也必須另外考慮(是直接從 cvs/svn/git checkout、還是由翻譯協調者手動輸入、還是有其他作法?),如何與上游協調更是想都沒想到。不過... 算是先起個頭!

星期六, 8月 12, 2006

愁緒...

這似乎是一篇很老的文章,個人覺得(從文學的角度分析)寫的很好,情節緊湊並押韻、也用了許多修辭學的技巧。原作者不可考,不過似乎一開始是貼在巴哈 Kuso 版。Google 搜尋只找到兩個來源,為避免他就這樣銷聲匿跡,還是轉貼一下!

國中生老趙,穿著制服... 白上衣藍短褲。在他家到學校這段路的中間點有一間廟,每天老趙就從家裡出發,走過台北吵雜的街道,目送穿著淺黃制服的女高中生上公車,經過那座不知名不曉得拜什麼神的廟,買過校門口的美而美早餐後到達學校。

某天,老趙下午放學,美而美已經不賣早餐了。老趙有感時光之匆匆啊!想要在年輕的臉龐之上,試圖流露出成熟深沉的笑容。

「哎唷喂呀!」難道是這個年紀不適合這樣的表情,突然一陣腹痛如絞、冷汗直流。國中生老趙此時若是回到學校上廁所,難保不在同學與可愛的宜靜面前丟了顏面。只好,他只好忍著痛往前走,同學們一一從後頭超車。漸漸的,老趙落後了,回家的路好遙遠、好漫長!

這時,中間點的那座廟出現了!此時,老趙感覺到腹痛如絞、冷汗直流。重要的是呼之欲出的那陣軟黃已經蠢蠢欲動,頗有千軍萬馬之勢。不曉得是急中生智還是學校老師有教,國中生老趙想「廟裡有廁所!」不管了!什麼都不管了!老趙忍住,忍住那些不該此時此地出現的東西,加速向前... 走去!來不及看看廟裡供奉的什麼神,來不及向香火舖示意,來不及心存敬意,直奔廟後的廁所。

廁所有兩間,老趙打開一間,裡面有前人的遺跡。想必是遺跡的威力太過強大,老趙開門才剛剛看見,幾欲被那遺跡的味道之強大的威力震倒,震倒前管理直腸的那幾條肌肉還突然鬆開了一下!好樣兒的老趙,不虧是強者。在那東西將出未出之際,猛然一蹲,在感受到地心引力的招喚之前,再次縮緊那幾條肌肉,就這麼硬生生的由外而內接住了那坨,呼之欲出的、萬頭鑽洞的、有如猛虎出閘的東西。這下來不及高興,老趙心想禁不起再一次了。好樣兒的老趙拿的起放的下,馬上關上門,拉開隔壁那間!

..............................

拉不動?再試,還是拉不動。莫非......?

老趙敲門...

「叩?」

「叩!」

「叩叩??」

「叩叩!!」

「叩叩叩!?!?」

「五郎啦!但基勒啦!」

說時遲,來不及,還來不及但基勒!老趙放了個屁,一切,一切都白費了。從肛門、從內褲、由大腿內側到小腿、到白襪、到過年買的球鞋,就這樣緩緩流到廟後的水泥地上。塵歸塵,土歸土,化作春泥(?)更護花。

國中生老趙呆了,就這麼杵在那兒,就這麼杵著。右手還在不死心的敲著門,但是目光已經沒有焦距。嘴巴微張,腦中閃過一幕幕畫面,同時不斷蒐詢他十幾年有記憶以來的所有經驗法則,想要試圖解決此時此刻的問題。

沒有用,人腦當機,剩下的是機械式的敲門。張開的嘴,還有遲遲找不到焦距的眼。一切都好安靜... 霎時,門開了!

「嘎哩共五郎,哩洗謀聽丟洗喔 ?」

「......」

「............. 哩挫賽喔?」

出來的那人,說完就走了...

老趙不走!他不能走!不能只是走!突然,他放棄一切的跑回家,不顧一切的向前跑去,不管在身後飛揚的是塵土還是什麼,不顧一切的朝家裡跑去。在空中,彷彿看見由大腿內側到小腿間,在空中的一絲絲黃色的線... 飛揚,如老趙十來歲的青春,那麼自由、那麼奔放!但是就在那條線就在剛落地那一剎那,卻是一記記忘記聲響的雨點。無奈、委屈、還有濃的化不開的... 愁緒。

「這就是青春嗎?」

才回到家的老趙,來開門後吃驚又憤怒的母親,在門口就把老趙給脫個精光,把全身的衣褲都丟到垃圾桶裡,試圖忘記這一切。可是,母親卻忘了,那個站在門口,仍在當機狀態下的老趙。夕陽西下,倦鳥歸巢時,仍有一隻年輕的雛鳥,一面映著夕陽,一面無聲的把影子扔在門上。

老趙傻傻的站在屋前,公車剛過,黃制服的女孩才下公車。出現在她眼前的,便是這一幕。蒼白而略顯孱弱的少年,孤獨又悲傷的站在迎接她回家的夕陽下。還有,不管是女孩還是老趙這一生的不能忘記的,那股濃的化不開的... 稠 Shit...

................................

星期五, 8月 11, 2006

灌票

這次的「2006 自由軟體傑出應用推廣選拔大賽」似乎有點... 呃~不說了,因為已經被罵得很慘了。

只是這次的灌票,讓我想起在我國中(還是高中)的時候(超過五年以前)曾經發生的一件趣事...

Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz

某音樂製作公司(因為年代久遠,我已經忘記是哪個公司了...)在網站上舉辦了票選活動,票選的內容大致如下:

今年暑假,您最希望我們能邀請哪位國外藝人來台灣?

  • 阿豆仔藝人甲 - 123 票
  • 阿豆仔藝人乙 - 234 票
  • 阿豆仔藝人丙 - 456 票
  • 阿豆仔藝人丁 - 345 票
(實際要邀請哪些藝人我忘記了,票數也是胡謅的,不過很確定是暑假!)

我的某個同學非常喜歡... ㄟ... 當作是目前得票最少的藝人甲好了,於是就 IM 我,叫我幫他投票。

舉手之勞嘛!當然就幫他投一下啦!

結果左鍵點點點的,發現他可以重複投票,於是我就用 php 寫了個灌票的小程式。當時還很得意的跟同學拍胸脯保證,有了我的灌票程式,藝人甲一定有機會高票當選!

好啦~放著電腦出去看電視... 過一陣子回來...

今年暑假,您最希望我們能邀請哪位國外藝人來台灣?

  • 阿豆仔藝人甲 - 56789 票
  • 阿豆仔藝人乙 - XXX 票
  • 阿豆仔藝人丙 - 67890 票
  • 阿豆仔藝人丁 - XXX 票

「吶尼!?怎麼藝人丙的票也增加的那麼恐怖?難不成有人也跟我一樣在灌票嗎!?」奇怪,把灌票程式先關掉看看。

今年暑假,您最希望我們能邀請哪位國外藝人來台灣?

  • 阿豆仔藝人甲 - 56890 票
  • 阿豆仔藝人乙 - XXX 票
  • 阿豆仔藝人丙 - 67912 票
  • 阿豆仔藝人丁 - XXX 票

「... 怎麼我灌他也灌,我不灌他就不灌了?」不相信,再把灌票開起來...

今年暑假,您最希望我們能邀請哪位國外藝人來台灣?

  • 阿豆仔藝人甲 - 123456 票
  • 阿豆仔藝人乙 - XXX 票
  • 阿豆仔藝人丙 - 134567 票
  • 阿豆仔藝人丁 - XXX 票

後來,我發現不管怎樣,藝人丙的得票一定比藝人甲多出 10%。聰明的您一定知道是怎麼一回事了吧?

「繼續灌吧」,我這麼想著「反正等下吃完晚飯回來,網站的人應該就會發現了吧。」結果果然如我所料,吃完飯再回來,那個投票的活動就從此消失了。

Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz 分隔線 Orz

沒有任何影射任何其他活動的意思,只是突然想起這件很久以前的往事...

星期六, 7月 15, 2006

教育是魚還是釣竿?

上星期六因為我媽的關係,我參加了「九五暫行綱要新課程配套暨九十八學年度大學指考加考公民與社會座談會」(好長的名字 =.=+)。會中有許多家長、老師、教育部的官員、記者等人到場,學生倒是沒幾個。根據他們討論的認知,大家對考試的概念似乎還停留在「讓學生背書,記比較多的人贏!」。我反而有不同的看法。

我們都知道,科舉這種制度,是唐朝就流傳下來,已經用了幾千年的東西。在唐宋那時候,可謂「熟讀唐詩三百首,不會作詩也會吟」。所以要求學生背東背西,反正以前有的東西全部背下來就是了!到了今天,社會也用這種制度分辨「有出息的好學生」與「沒出息的壞學生」。但是大家都忽略了一點 -「唐詩三百首」到頭來也就那麼「三百首」。在二十一世紀的今天,每個月出版的報章雜誌加起來,恐怕都超過過去幾千年那些唐詩、宋詞、元曲、小說... 哩哩叩叩阿里不達加起來要多。這麼龐大的資訊,要叫學生全部記起來,到了考試測試你記得百分之幾,實在是很無聊也很不公平的作法。

現在是資訊爆炸的時代,任何人在隨時隨地都可能產生新資訊。而傳佈資訊與儲存資料的媒體也夠發達,能有效將資料存下來,並在需要的時候在幾乎任何地方存取。這時候,只顧著讓人類重複其他一些非人類科技產品就能達到的功能,實在很無聊也無意義。就像最近在讀者文摘(註)上看到一個新竹縣新埔鎮的白痴,背了包括學校、郵局、戶政事務所、自來水廠、監理所、電信局等各機構電話一樣(居然還有更白痴的送匾額給他,真是瘋了!金氏世界紀錄如果有「白痴」這項,他們一定是第一名!)。

我認為目前的教育,不應只侷限於「從一大堆資料中,挑一些符合各階段(國小、國中、高中、大學)學習過程的資訊出來,編成課本教學生,然後考他們記得多少」這樣的辦法,而是應該教導學生「如何從一大堆資料中,挑出需要的東西」,也就是「資訊檢索」的方法,適當建立團隊合作分工協調的概念,並且不要再考選擇題了

考試當然還是評斷學生學習成果的標準,只是考試的辦法應該有所改變:

  • 取消選擇題這種猜猜都會對的測驗方法,或是降低選擇題配分所佔比例,並採取倒扣機制。
  • 增加簡答與申論題的比重,並增加讓考生表達自己看法的機會。
  • 採 Open Book 制度,讓考生可以從資料中擷取所需資訊來回答問題。而參考的資料由考生自己準備。
  • 讓考生有與他人合作的機會,提供一至兩題申論題是要由小組討論回答的。而分組則由考生自己決定。

這裡針對以上辦法說明:

  • 選擇題全部由單選改成複選,可以選零個、一個、或多個選項,並增加「以上皆非」來判斷「已作答」與「未作答」的題目。選項可以採加權記分法,例如某題有四個選項,第一個選項 5 分,第二個 3 分,其他 0 分這樣。
  • 針對簡答與申論題可能產生的標準不公,可以讓多個老師批改一部分考卷,然後將批改後的結果與樣本輸入電腦,建立類神經網路批改剩下的部份。讓二十個老師批改同一份考卷,每個老師有五分的權重。而批改的老師由電腦隨機選擇,有可能台北的老師改到高雄的考卷,台中的老師改到花蓮的考卷這樣。
  • Open Book 則符合 國父「立足點平等」精神,讓學生自己準備要參考的資料,沒準備資料就來考試... 考試ㄟ~叫你準備不準備,考不好死死算了!
  • 共同申論題由學生自己選擇合作的隊友。沒朋友找不到隊友的自己去死,在二十一世紀的今天人際關係處理不好,不是想辦法自己把所有事情作掉,就是自己去死。而某些能力較強的將題目回答得很漂亮也沒關係,這個社會本來就是能者多勞。共同回答題目的成績將與單獨回答的成績作比較,若「共同回的很好,單獨卻答的很爛」,就表示可能是隊友回答的,則這題的分數要打折。又若「單獨答的很好,共同卻回的很爛」,那... 你活該嘛,誰叫你不好好回答?共同回答的考試要與單獨回答的分開,避免考生修改答案。

以上概念還在草稿階段,可能還有很多弊端,不過應該不會有什麼「絕對無法修正的重大缺陷」。我覺得可行度應該有 70% 以上,只是可能那些八股的老人家不能接受。所以,若你不能接受,不是我的辦法不好,而是因為你太八股,瞭解了嗎?

註、讀者文摘二零零六年六月,第十一頁「活人電話簿」

星期一, 5月 29, 2006

接軌國際標準 台灣 OSS 慢半拍

新聞一則:「CPRO 資傳網--接軌國際標準 台灣OSS慢半拍

同樣,全文引用:

接軌國際標準 台灣OSS慢半拍

面臨執行單位未定、預算有限,人才無著落窘境。

2006-5-29/ 侯俊宇/ 撰文

在今年的 Linux 台灣計畫(Linux Taiwan Project)中,四大工作重心之一為「一項共通標準規範」,希冀建立Linux台灣的文件維護機制,以及示範應用系統測試驗證規範,以求奠定自由軟體未來產業的發展基礎。為求不落於國際社群以外,民間業者也提出與國際標準組織的接軌的聲浪,然而,儘管政策要求,卻面臨實際執行單位未定、預算有限,人才亦無著落的窘境,業者搖頭說,「要談參與國際標準組織,台灣還是慢半拍。」

在此次Linux Taiwan計畫中,分別列出一項共通標準規範、二個技術研發中心、三類重點應用領域,及四組示範應用服務體系等四項計畫重心,而列在首位的就是「一項共通標準」,其他亦有相關規劃在「國際社群能量」上,針對國際標準組織訂定兩岸中文共通平台規格,加強國際標準宇社群接軌的技術交流。然而,儘管口號喊的響,實際的作為卻不被業界人士所認同。

「先看預算就好了,位居未來台灣開原碼軟體( OSS ) 基礎核心的平台標準,一年只有新台幣1,000萬,要怎麼做事?」相關人士指出,儘管多次政策指導台灣OSS應走向與國際接軌、或是從既有硬體優勢發展出更多加值產品與服務,才能帶來商機,不過在基礎平台未能獲得共識之前,業者間仍然各行其是。誰也不服誰的情況,就是未來面臨產品的互不相容,或是需要額外的整合工夫。

再看執行單位,每天汲汲營營在開創商機的開原碼民間業者,早已透露出對創立標準興趣缺缺的態勢。而Linux促進會等組織,也透露出希望由政府單位擬定,主導標準走向的意願。然而,相關人士透露,儘管今年Linux Taiwan計畫明定與國際標準接軌為計畫成果之一,卻未見到實際的執行單位接手。

「如果單以標準議題來看,似乎應該是中央標準局的業務範圍,但是如果從研發角度來看,中研院與國科會似乎能夠扮演的更好,而事實上,若是資策會能夠培養更多人才,態度更為中立,也不失為可以加強與國際自由軟體社群連結的一大組織。」

不過,業者也說,儘管可以運作的組織不少,實際上已經開始動作的卻仍闕如,「目前為止,我們並未看到台灣OSS社群與國際組織的接洽,不管是官方或是非官方的接觸都不頻繁,也是我們最為憂心的地方。」

Linux促進會副會長劉龍龍這麼說,「我們一直試圖尋找,『台灣OSS社群為國際社群做了什麼?』的答案,不過可惜的是我們尚未見到。」劉龍龍說,在缺乏積極接洽,彼此連結又有限的情況之下,台灣OSS與國際間的接軌仍屬緩慢。

稍早時在Linux Taiwan計畫中,提及一項共通標準規範分別在共通規範及文件維護機制上投入700萬元,示範應用系統測試驗證機制投入300萬元;而國際社群能量上,也希望參與如OSDL、LSB、OASIS與ODF Alliance等相關組織,亦預期加強兩岸中文共通平台規格的建立,預計經費亦約1,000萬元。

而在缺乏雙方互動的前提之下,國內OSS業者要談產品的連結、平台標準的建立,都有一定難度。究竟OSS在台灣是能夠乘勢而起或是難以抬頭,仍看主事者的智慧。

胡說八道些「台灣 OSS 社群都沒做事」就想跟政府要錢?一千兩百萬還不如分給真的有在 contribute 的 developer.

為避免某些官員連 Google 都懶得上,放兩句話就有人幫他整理好資料可以拿去交報告,所以在這裡不列出有參與國際專案,並有貢獻的 contributers。

星期五, 5月 26, 2006

Atomic Copy

今天檢查 dmesg 的時候,赫然發現裡面有 Suspend2 的 Debugging info:

[   36.450825] Suspend2 debugging info:
[   36.450828] - SUSPEND core   : 2.2.5
[   36.450830] - Kernel Version : 2.6.16-suspend2-r6-palatis
[   36.450832] - Compiler vers. : 3.4
[   36.450833] - Attempt number : 1
[   36.450834] - Parameters     : 0 32 0 1 0 0
[   36.450835] - Overall expected compression percentage: 0.
[   36.450836] - Compressor lzf enabled.
[   36.450837]   Compressed 1001496576 bytes into 493573087 (50 percent compression).
[   36.450838] - Swapwriter active.
[   36.450839]   Swap available for image: 250817 pages.
[   36.450841] - I/O speed: Write 50 MB/s, Read 48 MB/s.

沒想到這台 nb 的硬碟(Model=TOSHIBA MK6025GAS, FwRev=KA200A, SerialNo=Z4PN3916S)居然可以跑出 50MB/48MB 的成績... 而且寫入還比讀取快!?

傻眼中...

(也許 suspend2 才是最好的純磁碟效能測試軟體?)

星期日, 5月 14, 2006

生命的鬥士?還是分數的鬥士?

今天在 FreeNode IRC 的 #dot 看到 chiashin 貼了「與時間競賽的人 - 俊翰的故事」出來。的確,乍看起來的確很感人,可是仔細想想... 這不過是另一個填鴨式教育造成的悲劇表揚劇...

分成三個部份來看 - 他媽媽、本身困苦的生理狀況、世人認知的成就。的確我佩服他媽媽不放棄自己小孩的偉大精神,這是本劇中唯一一點讓我打從心底 100% 佩服的地方。這種犧牲奉獻的愛真正可歌可泣。

從生理狀況的角度切入,如果你一生下來就是某個樣子(例如少一條腿、多一隻手、或其他「與別人不同的地方」),這有什麼好值得自怨自艾的?如果你天生就是 A 罩杯或老二只有 5 公分(的確啦,這兩個「缺陷?」不會對你造成生命威脅)或是同性戀,除了接受「這就是我」以外還能怎麼辦?每個人本來就應該接受自己的全部,不管是(世人認定的)優點還是缺點,因為他們沒有好壞,只是一個「現象」。

至於我最厭惡也最看不起的,就是貫穿全劇的「成績優異」。如果今天主角是去搶銀行(不管有沒有搶到),我也還是會很佩服他(跟他媽媽,當然!)。重點是他「克服困難,造成某些成就」的精神,而不是「成績很好就是優秀的人」。而且真的要說他成績好嗎...??「要是我國小到大學都被媽媽盯著上課,下課回家也沒有任何休閒活動(想看漫畫、小說,可是媽媽不買、想看電視媽媽不准... etc)、哪裡也去不了(也不能去網咖、不能跟同學逛街、不能做什麼運動... etc),吃了飯就念兩小時的書,我也可以每次都考第一名。」

這樣一想,也許他自己(還有許多看到這個故事的人)認為他成就非凡是由於自己不畏艱難的上進心。可是,我覺得這是這個「高分導向社會」造就出來的悲慘學生罷了。也許,如果他小時候父母沒有一直灌輸「萬般皆下品,唯有讀書高」的觀念,他今天會成為一個作曲家、程式設計師、作家、發明家、思想家... 等,比律師、法官、會計師有趣些的優秀精英。

星期二, 4月 25, 2006

測試點兮廿二行,編譯錯誤兮信息:長長長兮、過份長兮、姬兮兮

沒想到我過了一年才看到這篇...

的而且確,自認為一個程式設計師,很多時候還是需要些 Orz Programming 與 XD Programming...!!!

星期六, 4月 22, 2006

Orz Programming Certified

有鑑 Jserv's BlogOrz ProgrammingOrz Programming Certified 標籤,做了這個東西:

請隨意利用,Licence 是 CC-BY-SA。這裡有 svg 的版本,要的人請聯絡我。

星期六, 4月 08, 2006

金耳?木耳?

Eason's Blog 看到的,測看看你是金耳還是木耳!

Interactive Listening Test

我的分數是...

附帶一提,音效卡是 Gigabyte 7VAXP 內建的 Realtek AC97,喇叭是 JS 的 J9915,音量 Master 在 50%,PCM 100%,喇叭上 Volumn 約轉到 9:30 的位置,Treble 跟 Bass 都在 12:00 位置,3D 那個殘害聲音的按鈕當然是沒按下去。

盡信新聞不如無新聞

嗯... 不是因為它說 Linux 壞話我才跳出來,是因為這起新聞「IThome - 愚人節駭客惡搞Linux網站」(相關的還有「中時電子報:一至四日 入侵比例佔全球七成 攻擊台灣 國際駭客發動網路戰」等)實在太扯了。

根據中華民國著作權法第九條,新聞著作可以全文引用。為了避免這些新聞網站怕丟臉撤下原 post,所以這裡把中時的報導貼過來(因為它比較短...)。

2006.04.06  中國時報
一至四日 入侵比例佔全球七成 攻擊台灣 國際駭客發動網路戰
趙國明/台北報導

台灣的電腦資訊能力世界聞名,卻被國際電腦駭客組織列為主要侵入攻擊目標。調查局日前發現,國內共有近二百個網站遭到自稱un-root的國際駭客組織入侵,並置換網站首頁,受害單位包括政府部門、民間企業及學校,台灣已被國際駭客組織列為全球主要的攻擊入侵目標之一。

調查局指出,自四月一日至四月四日,陸續發現國內網站遭到自稱un-root的國際駭客組織入侵,並置換網站首頁,受害單位包括政府部門、民間企業、大學院校、國中小學,初步研判應是駭客為了證明自己的駭客功力,所進行的炫耀式攻擊。

調查局電腦犯罪偵辦科目前除針對尚未恢復的網站進行通知,並針對遭入侵網站進行清查過濾及分析比對,以進一步瞭解攻擊發生的原因與駭客入侵之目的,是否有重要政府機密資料或企業機密遭竊。

近二百個網站遭攻擊

調查局經分析後發現,此次受攻擊的網站遍佈全世界,共約有三百多個網站遭受攻擊,台灣部分則近二百個網站,接近七成,顯然台灣已經成為亞洲地區,甚至於是全世界主要的被攻擊國家,其中九五%的電腦設備是以Linux系統為主。

過去一般使用者的電腦作業系統多是安裝微軟視窗(Windows)平台,但隨著開放原始碼的興起,企業基於預算的考量,免費的Linux逐漸成為市場的主流,但是因為Linux的維護與防毒能力大多是靠有志之士自動自發的維護,品質難以與微軟視窗作業系統匹敵,也自然成為駭客攻擊的對象。去年以前,Linux遭受攻擊的比率還低於兩成,現在因為使用逐漸普及,導致攻擊的頻率逐漸升高,目前已接近四成。

防駭危機感亟待加強

調查局在處理類似案件時,曾與某重要的資訊安全A級單位(資訊安全要求最高的等級)聯繫,通知可能因為網站權限設定有問題,導致任何人都可以在網站上放入任何的檔案,該單位卻質疑表示權限本來就是開放的,不以為意,令調查局對國內資訊防駭觀念的淡薄,深感憂心。

網頁遭駭客置換的情況最易被發現,據現有網頁遭攻擊情形分析,台灣地區每月約有五百至一千個網站遭駭客置換成功,但潛在性的犯罪黑數更難發現,尤其是被植入木馬的狀況恐怕更為嚴重,這種入侵方式從外觀上很難發現,此類入侵事件,可能遠遠超過置換網頁模式的數十倍。

而根據 chihchun 的調查,其中許多東西都是胡扯亂寫的。

其中提到,台灣地區有兩百餘網站被入侵(接近七成)一事,根本就是胡扯。一般人以為「網址不同 = 不同伺服主機」就算了,寫資訊新聞的人不知道就該抓去重修電腦網路。不同 dn 是可以指向相同一個 ip 的。如 palatis.blogspot.com 與 freesamael.blogspot.com。在 4/1 ~ 4/4 被攻擊的兩百個台灣網站,其實只是兩百個不同的 dn,實際上只有 17 台機器。

再者,文中也提到被攻擊的機器中有 95% 是 Linux 機器........ 他們是眼睛瞎了看不到統計資料中那堆 Win 2003 嗎!?好啦,如果只算台灣區 + 兩百個網站被入侵來算,的確是 95%。可是這只能推斷出兩點 - (1) 台灣的公司為了省錢大部分都用 Linux,可是卻沒請網管(或是請到等於沒請的網管)。(2) 台灣的網管普遍 Linux 訓練不足。

不過政府機關的資安控制也很扯,之前總統府網站也曾經被入侵,宣佈 4/1 愚人節為國定假日放假一天。後來查出是一名高中生做的,而當時的總統府網站跑的是 Windows 2000。政府的作法是最後把總統府網站丟給中研院管理。

星期日, 3月 19, 2006

強迫自己開始用 vim...

Linux 用快三年了,VIMEMacs 卻都還不是很熟。因為... Gentoo 預設的 EDITOR 是 nano 嘛!Orz...(為什麼用大寫?「echo $EDITOR」就知道了!XD~~)

決定先從 Vi IMproved 開始,所以把 /etc/rc.conf 中的 EDITOR 改成了 /usr/bin/vim。

除此之外,還在 /etc/bash/bashrc 加了一行...

alias nano='printf "LEARN vim!\n"'

很暴力而且骯髒的作法...

附上 vimrc...

set nu
set exrc
set nohlsearch

map #2 :wq^M
map! #2 ^[:wq^M
map #3 :q!^M
map! #2 ^[:q!^M

au VimLeave *.sh !chmod +x %^M

給不會用 VIM 的人... 要輸入 ^[^M,不是直接打 ^ 跟 [ 或 M,而是必須按下 Ctrl-v 再按 Esc 或 Enter。

星期四, 3月 16, 2006

網站邪惡度測試

由於參加 ICTC Linux 講師訓練班(第一期 XD~~),有個作業是要寫個個人網站,所以... 就寫吧!

網址是:http://main.advice.com.tw/~palatis/

無聊之下又跑去測了一下邪惡度...

This site is certified 1% EVIL by the GematriculatorThis site is certified 99% GOOD by the Gematriculator

哇哇哇哇哇!!!!!

星期五, 3月 10, 2006

C# && Glade# && Mono

這學期的資料庫系統,老師要求使用 VB.Net。撇開「不太會寫」先不談,Linux 上「根本沒有」VB.Net 的可行(usable)方案!所以... 雖然不太會用 GTK、不太懂 Glade、更不會寫 C#。但還是硬著頭皮啃了下來。

首先安裝 .Net Environment,很自然的選了 Mono Project,因為他是 Only Solution(Wine 不算的話 XD~~)。順手裝了 IDE - MonoDevelopGlade

# emerge mono monodevelop glade

MonoDevelop 還在發展階段,雖然尚嫌陽春,不過算堪用了。Mono 的 Online Documentation 做的雖然不怎樣,不過大部分的東西還是查的到(有許多 Entries 還是 Undocumented...)。

我的作業是這個,好啦!我知道很無聊,因為我自己也這麼覺得... 當成複雜一點的 HelloWorld 摟!

丟臉的是,弄 Mono、Glade、C# 等一堆東西,花了我 5、6 個小時才做出來(而且自己還不是很滿意...)。

不滿意的地方...(按照不爽度排序)

  1. C#!!!!!!!!!!!!
  2. 不知道老師會不會讓我用 C# + Gtk# + Glade# 交作業 = =
  3. 中間那堆「if (Convert.ToDouble(EntryHwTimes.Text) >= 1) total += Convert.ToDouble(EntryHw1.Text);」
  4. 不知道怎樣過濾 KeyPress event,讓 Entry 只能輸入數字(跟 BackSpace)。也不會用 KeySnoop... QQ
  5. 不知道 Windows 上到底能不能編... = =

火星文++

之前大學學測一篇火星文的考題被罵的臭頭(小站還有幫他弄個修訂版),沒想到今天又看到另我哭笑不得的東西...

這是我們學校某教授的個人網頁。看來他不但懶得寫網站(原始碼裡有「<meta name="GENERATOR" content="Microsoft FrontPage 4.0">」字樣),還懶得把中文打好。

為什麼會跑去找他網頁呢?因為這學期的資料庫系統他要求使用 VB.NET。但是我的 Linux 沒有 VB.NET 可以跑,於是裝了 Mono,想用 GTK# 來交作業。但是不知道老師收不收這個環境的東西(也許他不會用?),想寫信請他裝起來編我交的程式。沒想到居然讓我看到這麼個鬼東西,真是太出乎意料了 XD~~

還不知道他會不會同意咧...

星期三, 3月 08, 2006

[轉載] 卡奴什麼都不必負責!?

我在網路上逛來逛去,還是找不到原作者。如果有人知道來源,請告訴我。如果您就是原作,又不希望我散佈此篇文章,也請告訴我,我將馬上把它拿掉。謝謝!

卡奴自己又負了什麼責任?

十四歲的外甥女兒回家說 :「我們班同學都覺得當卡奴沒什麼不好,可以買很多名牌,然後上電視哭一哭說不定就不用還錢了,反正大家都在幫卡奴想辦法。」聽聽,這是下一代卡奴說的話。 當各立委、民意代表、理財專家一面倒地幫卡奴出聲時,可曾想過奉公守法市井小民的心情?卡奴的負面教育還要繼續下去嗎?

筆者的月薪六萬五千元,每個月在貸款、生活費中量入為出,從來不敢欠過信用卡公司一塊錢。我們每個週末到大賣場都盡量挑特價促銷品,百貨公司沒有打折絕不敢買,工作近十年連一個名牌包包都沒有買過,我並不是沒有慾望,而是在我的能力範圍內很辛苦地克制自己。

反觀在電視新聞中泣訴的卡奴楊小姐,臉上掛著上萬元的古馳鏡框、手上拎著比我一個月薪水還高貴的 LV提包,口口聲聲她活不下去、看不到明天,要求銀行寬貸、政策救命。

憑什麼?我們的心中只有一句,憑什麼? 妳又願意付出什麼來得到這些救援?是獻身公益?還是義務勞動?社會幫了卡奴,卡奴們要付出什麼來換?

社會上有很多經濟弱勢者,像失業的單親父母、繳不起營養午餐錢的偏遠地區兒童,他們都得不到社會資源的妥善照顧,筆者不明白這些卡奴憑什麼在享受奢華生活以後,竟以厚顏要求社會資源協助?

當他們佔用大量媒體曝光、煩擾許多財經專家出面研商時,正是變相在消費高昂的社會成本,但 卡奴們自身又付出了什麼代價?

卡奴原本就是相對沒有責任感的一群人,如今他們在享受不屬於自己的繁華富貴以後,反過來可憐兮兮地要求銀行、政府為其善後,依然不需為自己的行為負責任,未來難道不會出現更多的卡奴嗎?

我們的義務教育中對於理財、稅法等生活教育極度貧乏,很多大學生連基礎的財務知識都不具備,再加上社會風氣盡是向錢看,也難怪年輕不懂事的卡奴越來越多,一出社會就累積了完全無力償還的巨額債務。

既然卡奴風暴已經形成,國、高中學校正應該藉此機會,教導學生基本理財知識和正確的理財觀念,除了救卡奴救經濟,更重要的是提早預防下一代的小小卡奴繼續出現。

星期五, 3月 03, 2006

2006 年中區春季電腦展一元愛心參觀券

我收到學校寄給我一封 email,標題是「Fw: 2006中區春季電腦展ㄧ元愛心參觀券數量有限,索完為止!」。點進去看看...

其中提到「看展一元,所得將捐贈台中生命線協會」。所以...

  1. 他發給我們學校 500 張,最多也不過募到新台幣 $500。
  2. 如果全中區算 30 所學校、每個學校都發 500 張,他也不過募到 $15000。

我的看法是...

  1. 要募款幹麼不弄 $10、$20,應該還是很多人搶,可是就可以募到 10 倍、20 倍的錢。
  2. 台中生命線真不值錢...
  3. 教育部宣導「增強國文素養,避免使用火星文、注音文」的活動似乎不太成功,標題跟內文中都用了注音文 XD~~

前面比後面快!

由於 64bit 的機器會使用比較多記憶體(Pointer、Data Type 佔用的記憶體都比 32bit 機器來的多些),所以我的小筆電總是會吃到 swap。今天無聊的時候上網逛了一圈,發現這篇文章中提到「Putting your swap partitions near the beginning of your drive may give you some acceptable improvement.」(將置換分割區放在磁碟的前端將增進一些磁碟效能),差異可以高達 3mb/s!可是... 那裡才是磁碟的前端呢?

於是... 做了以下測試:

# hdparm -tT /dev/hda9

/dev/hda9:
 Timing cached reads:   2608 MB in  2.00 seconds = 1302.24 MB/sec
 Timing buffered disk reads:   58 MB in  3.02 seconds =  19.23 MB/sec
# hdparm -tT /dev/hda1

/dev/hda1:
 Timing cached reads:   2592 MB in  2.00 seconds = 1294.26 MB/sec
 Timing buffered disk reads:   74 MB in  3.04 seconds =  24.36 MB/sec

看來... 我的磁碟前端是數字較小的分區。剛好,我把 swap 放在 hda3!

# hdparm -tT /dev/hda3

/dev/hda3:
 Timing cached reads:   2592 MB in  2.00 seconds = 1295.55 MB/sec
 Timing buffered disk reads:   74 MB in  3.05 seconds =  24.30 MB/sec

不過,/ 放在 hda2 似乎有點浪費,畢竟它是很少用到的分區。算了!才 500mb...

結論... 下次配置磁碟分區時,應該把 / 拿到最後去,中間分給 LVM 才對。

星期二, 1月 24, 2006

火星文

原文...

一、語文修正(佔 9 分)

語文的使用需要注意場合、對象的分別, 不同的場合、不同的對象, 都有它不同的語文表達方式。例如上台演講和平日死黨之間說話便大不相同, 而寫作文章和口語敘述也絕不應該完全沒有差別。

下面是一篇題為「運氣」的中學生作文, 即使暫不考慮文字的優美與否,其中除了以下說明文字的範例之外,尚有九處應予修正――或使用了不當的俗語、口語、外來語, 或犯了語法上的錯誤, 或是受媒體、網路流行用語誤導,或以圖案代替文字, 請加以挑出, 並依序標號( 1、2、3… … 9) 改正之。

【說明】例如文中「3Q得Orz」即為不當用法, 3Q意指thank you」, Orz則藉三字母表示「跪拜在地」之狀。改正之方式如下:3Q得Orz → 感謝得五體投地

今天我們班的運氣實在有夠衰,開朝會時被學務主任點名, 說我們班秩序不良而且教室環境髒亂。我們班導師氣到不行,回到班上嚴辭訓斥大家一頓,問我們究竟安什麼心? 林大同立刻舉手發言說, 我們一定會好好做反省的動作。衛生股長漲紅著臉幾乎快 ::>_<:: 了, 他拜託大家每天確實打掃,他一定3Q得Orz。王明問班上的星座達人到底我們班為何如此時運不,接二連三被挨罵受罰。更慘的是, 班上的蒸飯箱莫名其妙又壞了,害得全班只好吃冷便當。偶氣ㄉ 要死, 媽媽昨天為我準備的便當, 本來粉不錯吃滴, 卻變成難以下嚥的冷飯。想不到今天這麼倒楣,昨天真不該聽信風紀股長的話, 到學校理髮部去理一顆一百塊的頭, 今天還不是一樣諸事不順!

真正的火星文版...

尖天5ㄇ搬ㄉ運氣實在有夠衰,開朝會十倍學物主任點名,說我ㄇ搬秩序ㄅ涼而且教室環境髒亂,5ㄇ搬導師\_/到抓狂,回到班上言詞訓斥ㄌ大家一頓,問5ㄇ究竟安什麼新?林大同立刻舉手發言說,5ㄇ一定惠好好做反省的動作。衛生股長*>_<*幾乎快::>_<::ㄌ,ㄊ_nO大家每天確實打掃,ㄊ一定3Q的Orz。王名問班上的星座達人到底為何我們搬如此時運不濟,接二聯三倍挨罵受罰。更慘ㄉ是,班上ㄉ蒸飯箱莫名其妙又壞了,害ㄉ全班只好吃冷便當。偶ㄑㄉ要死,ㄇㄇ昨天為偶準備ㄉ便當,本來粉ㄅ錯吃低,卻變成難以下研ㄉ冷飯。想不到今天這ㄇ倒楣,昨天真ㄅ該聽信封技股長ㄉ話,到學校理髮部去理一顆一百塊ㄉ頭,今天還ㄅ是一樣豬是ㄅ順!

如果覺得其他地方有待加強,歡迎提出討論...

星期日, 1月 22, 2006

三隻小豬快跑!(3D 加速)

之前提到過,換了 X.org 7.0 以後,這台電腦喪失了 render 3D 能力...

今天做例行更新的時候,發現 ati-drivers 有了 8.21.7 版。

於是,熊熊給他更新下去以後,現在...

$ X -version

X Window System Version 7.0.0
Release Date: 21 December 2005
X Protocol Version 11, Revision 0, Release 7.0
Build Operating System:Linux 2.6.14-gentoo-r4-palatis x86_64
Current Operating System: Linux Nichelle 2.6.14-gentoo-r4-palatis #2 PREEMPT Thu Dec 15 15:24:19 CST 2005 x86_64
Build Date: 13 January 2006
        Before reporting problems, check http://wiki.x.org
        to make sure that you have the latest version.
Module Loader present
$ glxinfo | grep rendering
direct rendering: Yes
$ glxgears
6685 frames in 5.0 seconds = 1336.886 FPS
6792 frames in 5.0 seconds = 1358.380 FPS
6852 frames in 5.0 seconds = 1370.342 FPS
6853 frames in 5.0 seconds = 1370.418 FPS
$

星期日, 1月 15, 2006

無法精確的說最大支援多少

我外公的電腦不知道出了什麼問題,昨天吵著要重灌(視窗千禧版)。可是那個東西太舊了,我找不到光碟... 於是,就想說幫他灌視窗經驗版好了。可是似乎因為 ABIT BE6 這片主機板上 HighPoint HPT366 IDE 控制器似乎跟不知道什麼東西衝到了,只要那兩顆 IBM Deskstar 60G 接上,視窗經驗就怎樣也進不去(卡在開機那條光棒)。

於是,想說更新一下 BIOS,來到了 ABIT BE6 的 BIOS 下載網頁,沒想到居然看到這種字樣...

雖然已經是很久以前的東西了,不過還是每日一笑吧... :P

覺得看不懂或不好笑的,請檢討自己的幽默感。

性向測驗

剛剛在 Jserv 那邊看見的性向測驗,我的選項是...

兔、蛇、貓、獅、羊、牛、獵豹、貓

覺得還蠻準的,除了牛那個以外。

來玩玩吧!

星期五, 1月 13, 2006

難怪沒 3D 加速...

不知道為什麼,使用 Xorg 6.8 的時候,一直給我出:

Elf_RelocateEntry() Unsupported relocation type 10
Elf_RelocateEntry() Unsupported relocation type 10
Elf_RelocateEntry() Unsupported relocation type 10
...

於是,我只好更新到 Xorg 7.0。

但是,ATIpropertiary Linux Driver 卻不支援 Xorg 7.0。所以,想說用 mesa 的 software GLX Driver,可是卻遇到了這個情況...

(WW) RADEON(0): Enabling DRM support

        *** Direct rendering support is highly experimental for Radeon 9500
        *** and newer cards. The 3d mesa driver is not provided in this tree.
        *** A very experimental (and incomplete) version is available from Mesa CVS.
        *** Additional information can be found on http://r300.sourceforge.net
        *** This message has been last modified on 2005-08-07.

煩死啦~~ 降回 xorg 6.8.2 再試一次好了......

星期四, 1月 12, 2006

系統程式 part2

曠課補假事假公假病假總計扣分
200044.00

首先... 我覺得我一個月只去兩三次,這裡居然只記到兩次曠課跟四次病假(我去請的)...

學期成績平時-1平時_2期中考平時_3平時_4平時_5實作_1期末考
個人成績9000990100909564
全班最高95851009995100959564
全班平均6663634269726743 31
及格分數606060336060606024

然後... 期中考莫名其妙的考了 99 分(本來以為只有 7X 分),那是個美麗的意外... 讓我不解的是期末考,全班平均 31 可是及格分數卻只要 24 是怎麼回事??另外,上次那個組合語言作業,明明就做了一半,最後還是唬過去的,居然真的被唬住了,給了我 95 分...

曠課一堆,缺一堆平時考,居然期末成績有 90 分......

本週運勢

牡羊座:再坐在電腦前不準備期末考,你就要倒大霉了!
金牛座:再坐在電腦前不準備期末考,你就要倒大霉了!
雙子座:再坐在電腦前不準備期末考,你就要倒大霉了!
巨蟹座:再坐在電腦前不準備期末考,你就要倒大霉了!
獅子座:再坐在電腦前不準備期末考,你就要倒大霉了!
處女座:再坐在電腦前不準備期末考,你就要倒大霉了!
天秤座:再坐在電腦前不準備期末考,你就要倒大霉了!
天蠍座:再坐在電腦前不準備期末考,你就要倒大霉了!
射手座:再坐在電腦前不準備期末考,你就要倒大霉了!
魔羯座:再坐在電腦前不準備期末考,你就要倒大霉了!
水瓶座:再坐在電腦前不準備期末考,你就要倒大霉了!
雙魚座:再坐在電腦前不準備期末考,你就要倒大霉了!

雖然已經星期四了,不過還是貼一下。

ps. 我考完啦!

星期六, 12月 31, 2005

近況與挖礦

我們的系統程式老師,在學期初給了我們一個「x86 組譯器」專題,讓我們回來做。

組譯器做了一半(照我的人月粗估,大約 5%~10% 吧...),deadline 就到了,沒的玩啦!反正我是班上進度最快的,很多人什麼都沒寫就去 demo 了... 有可以執行的 code base 的只有兩個人,我朝 ELF Binary Format 走,它朝 parser 跟 assembler 走。(說不定我們兩個人合作,剛好可以弄出完整的東西...)

總之,花了我四天不眠不休 trace ELF SpecificationAMD64 Architecture Programmer's Manual,寫出了半個有點可以跑的東西(其實還稍微差一點)。

如果有人想看的話,以下是報告跟程式碼(需要 x86-64 平台):

這個作業告一段落以後,找到了一個讓我玩了很久還在玩的 flash game -「Mother Load」。目前挖到五千多呎,碰到瓦斯就爆掉了。

這個遊戲的玩法是,慢慢往下挖... 然後挖礦回來賣錢、升級船。要注意的是,若燃料(Fuel)用完或殼(Hull)壞掉船就會爆炸。挖到 3000 呎以後要小心岩漿,挖到五千呎以後可能會挖到瓦斯,記得多帶點備用燃料跟修護包,身上準備個傳送器也會比較安全。船挖太多礦石可能會太重飛不起來,要小心。

就這樣啦!

星期日, 12月 18, 2005

63% Evil, 37% Good

http://palatis.blogspot.com is 63% evil, 37% good

This site is certified 63% EVIL by the Gematriculator This site is certified 37% GOOD by the Gematriculator

為什麼我有 63% 的邪惡度,可是 Microsoft.com 只有 20%???

星期六, 12月 17, 2005

變態軟體

今天(Dec 17, 2005)的 Yahoo! 奇摩新聞 裡,有「全球第二例 我首宗BT侵權案 分享電影檔案台灣論壇遭法辦」。礙於版權不能貼出全文,不過該文其中一段...

原來 BitTorrent 是「變態軟體」... 這個記者真應該被抓去打屁股 = =

話說回來...

不過話說回來,現在的著作權法應該是管不太到這種 torrent 交流論壇。目前的中華民國著作權法要有「重製」與「公開散佈」的情事,才能起訴當事人。但是根據 p2p 技術,這種站台只是告訴使用者「那裡可以下載到什麼東西」,而沒有實際的經手重製與散佈(就像人家來問你「那裡可以找到 xxx 影片」,你回答「百事達有!」一般)。

如果真的要若要考慮 torrent 檔的著作權,也不屬於唱片、電影、軟體公司,而是該 torrent 的原作者。

要說協助散佈?如果有個殺手搭計程車去殺人,那計程車司機也是共犯嗎?如果這司機事前不知道他要去殺人,他當然什麼也不能做。即使這司機知道了他要去殺人,也不能怎樣啊...(難不成要送他去警察局嗎?)

那到底是誰在散佈?答案是「有用 BitTorrent Client 並且有使用那些 torrent 的人。」畢竟,也不能說所有拿著刀子的人都是殺人犯啊!

好啦,我也討厭盜版。畢竟生為一個程式設計師,若人人都使用盜版,那寫的程式該賣給誰呢?我只是想澄清,若從技術的角度看來,那些「torrent site」是沒有構成任何犯罪行為的。

聖誕禮物

我那遠在美國的舅舅每年聖誕節都會回家一趟,今年聖誕節他理所當然的要回來。回來之前呢,他寄了 email 問我跟我妹想要什麼聖誕禮物。

其威, 琪聆,

我下個月中旬要回台北, 不知道要帶些什麼回去. 你媽媽叫我直接問你們, 有那些類東西是喜歡的或是想要的? 那些類東西是不喜歡的?

喜歡想要的東西不能保證一定找的到, 但是可以避免帶些不喜歡的東西回去.

可別說要 xBox, PSP, 或 iPod.

舅舅

然後是我的回信...

我想要 PSP 跟 iPod, 不想要 xBox XD~~

hmm...
我想要美國買的到最大包的洋芋片(吃完的也沒關係, 我只想要包裝袋.)

於是,他這樣對我說...

PSP太傷眼, iPod太傷耳, 所以我帶洋芋片好了.

我們都不吃洋芋片, 所以沒有空袋子. 我會帶找到最大包的洋芋片 (20 oz./包). 只是洋芋片可能會變成洋芋"碎"片.

沒關係, 也許可以泡牛奶或豆漿吃.

--
Cosmos Wang

今天我舅舅一家人回來,果然就帶了這包洋芋片來給我。(聽說被我表妹壓到,所以現在似乎真的變成了粉。)非常的大包,有 567 克重!從照片也許可以看出些端倪...(下面那個銀色的東西是我的筆記型電腦跟滑鼠。)

星期二, 12月 06, 2005

Matrox DualHead2Go

大家還記得 Matrox 這家公司嗎?他們的新產品 - DualHead2Go 似乎還蠻有意思的。真想弄一個來玩玩!

如果在 $3000 以內的話...(因為還得多弄台螢幕!)

星期五, 12月 02, 2005

Firefox 1.5

跟大家說的一樣,Firefox 1.5 的 Gecko 真是非常的快!新引擎果然不一樣!

可是升級的代價是... 瀏覽網頁時字型變得很小...

我不知道這是 bug 還是只是自己電腦的問題。不過如果有人發現跟我一樣的困擾的話,可以在「~/.mozilla/firefox/<profile>/chrome/userContent.css」加入以下這段解決(我是改成 12pt,如果您覺得太大或不夠大,請改成其他數字):

* {
  font-size: 12pt !important
}

藏於民間的高手

說不定他正在看的是我的 blog......

星期六, 11月 26, 2005

AMD64 筆記型電腦

最近一場車禍,把我撞進醫院躺了一個多禮拜。到現在雖然可以下床了,但是右腳骨折不能走。同學、教官看到我機車斷成三截,都說「人只有這樣算命大了!」。我媽來醫院看我的時候,這樣消遣我:「給你台機車嘛,你就把自己弄得破破爛爛的。還是給你台電腦比較有生產力。」我老爸聽說了,就弄了台之前肖想很久的 MEGABOOK S270 給我。

這台其實是 Yahoo!奇摩拍賣標來的二手機,而且說是 MSI Megabook s270,其實是德國 MEDION 公司 OEM 的機器(神奇的是,我在 MEDION 的網站上找不到這台電腦,只找到一堆 Disney PC),所以上面打的 Mark 是個大大的「MEDION」,其餘都與 MSI Megabook s270 一模一樣。反正... Mark 這種東西... 我應該還是會弄個「請勿拍打餵食」的貼紙上去吧~ XD~~

根據原本賣家的說法,這台電腦是他在公司用員工價標到的電腦,原本的配備是非常陽春的 Sempron 2800+、256MB RAM、並沒附作業系統。後來他有升級一些東西,下面列個清單吧!我拿到手的東西也很簡單,什麼配備也沒有,就一台電腦與電源線而已。

  • CPU:Mobile AMD Athlon64 3000+ @ 2GHz(原本是 Sempron,升級成了 Mobile A64,可能 Turion64 買不到吧?L2 只有 512KB... 用了一會感覺有點熱...... 62W 與 35W/25W 的 TDP 果然不能比...)
  • RAM:256MB DDR SD-Ram x2(本來只有一條,後來加成兩條。)
  • GPU:ATI Radeon Xpress 200M(分享主記憶體 QQ...)
  • HDD:Toshiba MK6025GAS(60G/8M/4200RPM)
  • *D-ROM:QSI CDRW/DVD SBW242B
  • Battery:鋰電池 4 cells, 2200mAh
  • 其他東西大概就不會變了。
  • Price:NTD $32,000.-(以這等級的東西說來,可算是非常便宜!而且原賣家只用了兩個月,可說非常新。)

接下來,就是要想辦法放 Gentoo 上去。反正我會想玩的電動,Wine 應該都可以跑(附帶一提,經過十年的 Alpha,Wine 終於 Beta 囉!)。目前正在想辦法把 Gentoo AMD64 Minimum CD 用這台內建的燒錄機燒成光碟(Windows 真不好用...),祝我好運吧!

星期四, 11月 03, 2005

1、妳2、與我

當妳1迷惘的時候,我沒能體諒妳1,所以選擇離開。
當妳2沒能說出心裡話的時候,我沒能體諒妳2,所以還是選擇離開。

當妳1想通的時候,我跟妳2在一起。
當我離開妳2的時候,妳1有了另一個他。

1幸福嗎?跟一個覺得還 ok 的他在一起,我不知道。
2不幸福嗎?至少我不會再逼妳2
他幸福嗎?與覺得他還 ok 的妳1在一起,也許可以給妳1幸福。
我幸福嗎?幸福過,因為妳1跟妳2都是我深愛過,也深愛過我的人。

剩下的,都是我不成熟的代價。

後輪加大鎖

今天牽車以前,忘記開大鎖... 幸好我還沒摧油門,只是立著中架的時候踩到檔,所以輕輕的卡進去而已。無論如何,因為還是卡進去了,普通的辦法是拿不出來的...

所以,我就把後輪放氣,於是就可以轉了...

也許,您騎車也會忘記先開大鎖,不過如果還沒卡得很死,說不定把輪胎放氣以後可以拿的出來。

給各位做個參考!

星期日, 10月 30, 2005

程式、設計與程式設計

從大學一年級開始,我就常常被同學抓去問程式。不過,我從來不直接寫好程式給人家抄,都是要看到寫好的程式碼才會幫忙指出邏輯上的錯誤。(或是看到註解,卻發現動作似乎不是那麼回事的程式碼。)拜此「只教你釣魚卻不給你魚」的邏輯之賜,漸漸的,來要作業的人少了,留下了真正想學東西的人。

最近跟同學吃飯的時候,聊到他們來問我程式的「感想」- 雖然被我冷嘲熱諷,但還是覺得有學到東西。尤其是最近程式越寫越大,聽到我說的一段話,覺得感觸良多:

「程式設計」為什麼叫做程式「設計」,就是因為重點在「設計」。否則它就會叫「程式撰寫」之類的東西了。

寫程式如果不先設計,很容易花很多時間卻只寫出一個爛程式。你也許會認為,不設計可以節省時間,但是那是錯的。不先設計只會讓你寫到一半的時候不知道該怎麼辦,然後花更多時間思考。卻又因為沒經過完整的設計,最後寫出一個不怎麼樣的(爛)程式。看著這個爛程式,你當然會想再花時間把它改好,卻因為沒有設計不知該如何下手。但是這是你「已經」花了很多時間寫出來的程式,捨不得把它丟掉。於是花下比之前還多的時間下去除錯、增刪功能,最後還是做出一個不怎麼樣的爛程式。然後你覺得它還是不夠好,可是又更捨不得把它丟掉(因為你已經為它付出太多了!),於是花下更多時間修改,然後更捨不得,然後修改,然後更捨不得... 可是總歸要變成個爛程式,因為缺乏設計。死馬當活馬醫不是不行,但是可能會比直接換匹馬來的麻煩。就算真的醫好了,遇上你們這些實習醫生,這匹馬也不會變的活跳跳,大概還是個半死不活的樣子,絕對不會比經過適當調教的健康馬跑的好。

所以,如果你們給我一個程式,我看了以後叫你重寫,意思不是叫你直接去重寫,而是我覺得你必須重新設計你的邏輯,然後重寫。寫程式之前要先設計,是天經地義的道理。為什麼程式設計一開始要教流程圖?為什麼計概一開始要教流程圖?為什麼組語一開始要教流程圖?都只是為了教你一套設計程式的方法。我不是說一定要畫什麼鬼流程圖,因為我自己也不畫那個東西,但是至少要先設計過才開始寫程式。

後來,有位同學告訴我他的心得...

你知道第一次我來問你程式的時候,也是一直被罵「上課沒專心聽」、「去看課本第 xx 頁」之類的。也許當時我問的只是一些「for 迴圈怎麼用」或「switch ... case 的語法是什麼」的問題,上課老師一定教過、課本上也一定有。但是當時我只覺得「如果我上課都聽的懂、課本都看的懂,幹麻還來問你?」

後來有一個比較大的作業,也是寫到一半拿來問你。當時你看了一眼程式碼以後,指著螢幕問我「這幾行程式碼在幹什麼?」的時候,我整個人傻掉,因為真的回答不出來。當時你只說了「連你都不知道在作什麼的碼,寫它幹麻?」後來,你一點一點的改我的程式,一點一點告訴我哪裡可能該怎麼寫,一點一點把東西加進去,寫出來的東西,我只覺得「這根本不是我寫的!」。

最後終於全部寫完、可以正確跑出結果,但是我還是霧煞煞。這個時候你又做了另一件讓我吐血的事 - 把視窗整個關掉,跟我說「好啦!我已經告訴你該怎麼寫了,回去以後自己重寫一次。」當時我整個人抓狂,那是我花了三天才寫出來的東西,你看了兩個小時、改了一堆東西以後叫我重寫?

後來我回去以後當然沒重寫,又抓著原來那塊半死不活的程式屍體改來改去,花了一個晚上,寫出了一個勉強可以跑,但是很多功能做不到的爛程式。當時的感覺,就真的是捨不得把它丟掉重寫一個。

突然之間,我終於知道為什麼新手容易寫出爛程式,除了技術功力以外,最根本的問題就是他們懶的作設計。許多老師在一開始給的都只是小程式(Hello World!),幾乎一看就可以知道該怎麼寫,或是只要照著黑板抄就會跑,不需要什麼設計。很多時候,連為什麼要這樣寫都不知道。但是,隨著課程的深入,依樣畫葫蘆已經不能作出作業。可是因為之前沒有設計解法的能力,所以想破頭也不知道該怎麼把答案弄出來。

後來繼續聊下去,發現大家都不知道該怎樣作設計才好。我是覺得,雖然有許多文章要你別再畫流程圖了,但是那是寫給已經畫過幾百張流程圖的老手看的,新手還是得從流程圖開始。所以,畫流程圖的時候...

  1. 不要超過一張 A4 紙(即使有那些「至下頁」的小圓點,你還是不會知道自己在畫些什麼的!相信我。)
  2. 不要過度詳細(如果一個方塊對一行程式碼,直接去寫就好了,別浪費時間畫圖。)
  3. 從大問題開始畫起(例如,直接畫「程式開始 -> 擷取聲音 -> 傅立葉轉換 -> RLE 編碼 -> 赫夫曼編碼 -> 存檔 -> 結束」,別把 FFT、RLE、Huffman Encoding 到底怎麼做畫進同一張圖內。)
  4. 解決小問題(慢慢開始畫出怎樣開音效卡、怎樣收麥克風、讀進來的串流應該放在哪裡...)
  5. 照著畫出來的東西用手算一遍,看看有沒有邏輯錯誤。
  6. 把鍵盤拉過來開始打程式。

所以... 新手們...... 看看這篇文章,然後回去畫流程圖吧!!!

星期五, 10月 28, 2005

void operator-(工程數學, 微積分一年份);

這個禮拜要交工程數學第一章的作業 -「分離係數法」與「正合微分方程」。

分離係數法還蠻能理解的,雖然不能算的很快,但是至少寫的出東西(七題寫了五小時...)。

可是正合... 嗯... 還勉勉強強,但是配上三角函數(或雙曲線函數)就把我吃得死死的了... 積分因子就更糟糕了,先算積分因子再用正合求解真是要我的命 = =

很沒有效率的寫了十五小時,也才寫完一半的作業。剩下的一半是白努力等式(Bernoulli Equation),完全(100%)不會寫。

算了... 看開吧!對微積分被當一年份的我來說,能做到這樣已經另自己很滿意了...

星期三, 10月 26, 2005

Quote: Think Different!

這兒是一群瘋子 - 不適應者、叛逆者、麻煩製造者、硬要穿過方洞的圓木椿,他們看世界就是與人不同。他們對規則毫無興趣,對現狀一無尊敬。你可以引述他們、反對他們、榮耀他們、或是詆毀他們,但唯一不能作的,就是忽視他們。因為他們改變了世界、推著人類往前邁進。當有些人將他們視為瘋子,我們則當他們是天才。因為 - 唯有瘋狂到自認可以改變世界的人,才是真正改變世界的人!

Think different!

1997 年 9 月 28 日,蘋果電腦電視廣告 - 「思索不同」(Think Different)

星期四, 10月 20, 2005

禍不單行的 shift...

這台 Acer TravelMate 360 鍵盤上,左邊的 Shift 鍵掉了下來...

完了... 我很依賴那個 Shift 的... 怎麼辦......??

台中沒有相機,照片稍後補上。

星期三, 10月 19, 2005

不怕死的吉峰村老芋頭跳出來給我撞

前天(2005/10/17)下午放學回家的時候,撞到一個老芋頭。

放學時間(5:30),我開了大燈,前面兩台車,後面一排車,我是第三台,時速約 40km/h(約保持在速限。而且放學時間車一大堆,要騎快也沒辦法...)。過一個路口的時候,他騎著腳踏車在路中間等著過馬路。我認為前面後面那麼多車,他應該不會走,而且轉彎讓直行也是台灣的交通規則,所以就繼續騎。誰知道他等我前面兩台車過了以後,突然不怕死的左轉了出來。我當然就緊急煞車(「口幾~~~」過去)+ 閃車,但是還是撞上了。(有 ?% 的人可以在相同狀況下閃過前面 3m 突然衝出的東西?)

既然都撞到啦!先看看他人有沒有事,所以我就先問他:「啊你干有安怎?」。結果他跳起來就徹髒話罵我:「夭壽死小孩,騎車騎價緊!」(天啊,我騎速限ㄟ...)。看他神智清楚、可以自己走路,我就先把車牽到旁邊,避免阻礙交通。他就說「撞到我你想走?你要給我腳踏車修理好。」我還覺得蠻委屈的,既開了燈、也在速限、也是直走,於是就問他「你沒看到那麼多車嗎?怎麼還繼續走?」,他居然回我「你們沒一個人要停下來,我什麼時候才能走?」。

好吧!我覺得無法跟他溝通(他一直說台語,我聽不太懂,又一直凹要我幫他修理腳踏車),找警察吧!於是我拿手機打了 110,等警察來畫圖、拍照、做筆錄。

然後,他在我簽了名的現場圖上也簽了名,去醫院處理了擦傷,就回家了。我就在交通大隊那裡做筆錄,還被警察罵「你看到有人就是要預設他會突然衝出來,會撞上就是兩邊都有問題。」(最好是啦,那你還敢跟我坐這麼近,你是可以預測到我下一秒會不會灌你一拳?我灌你一拳你是也有什麼問題(太欠打)?)

後來,我打了個電話給他家人(事故當事人登記單上留的電話),問看後續要怎麼談。當時是告訴我人目前沒什麼事,所以我就跟他說有事可以再打電話給我。

結論...

  • 看到人就要預設他會跳出來給你撞
  • 不管多小的傷都去醫院驗一下
  • 車子也是,不管多小的傷都要報。
  • 報警不代表完全沒事,對方還是有六個月的過失傷害追訴權。

無理!

星期六, 10月 15, 2005

Orz.dot

首先,如果不知道什麼是「Orz」的,請參考之前的文章 -「Orz 與駭客任務!?」。

事情跟 Jserv 說的一樣。

真是 Q))))))rz... XD~~

星期五, 10月 14, 2005

自由 vs. 免費

在 CNET 看到這篇新聞:向自由軟體看齊 微軟要多提供免費下載

微軟表示將透過免費下載的開發工具進行對自由軟體市場的反攻動作。

從微軟近幾個月來積極宣傳其新版開發工具的動作,並不難看出這款即將發表上市的 Visual Studio 2005 開發工具,對這家公司的重要性究竟有多高,包括發展協同作業版本 Team System 向上開拓大型開發團隊市場外,更開放免費下載的 Express 版本產品,用意反攻現有熱門的自由軟體市場。

台灣微軟開發工具暨平台推廣處產品行銷經理胡德民表示,過去微軟在開發工具市場上,有些忽視自由軟體所佔地位、意義,然在今年推出新版開發工具提供可免費下載應用的 Express 版本軟體後,將會嚴肅看待此一市場,主要將搶攻現有由 Linux、Apach、MySQL、PHP 等自由軟體雄踞的市場範疇。

近年來,使用者接受自由軟體的意識逐漸蓬勃發展,並進一步影響商業軟體的市場狀況,也讓商業軟體霸主微軟,不得不思索反攻策略。

胡德民說,微軟從自由軟體精神學得的經驗就是開放免費下載的工具軟體,將可降低使用者學習相關工具技術的成本、門檻,並增加使用意願、擴大應用範圍。他舉例道,例如在學學生若可免費下載學習微軟的開發工具,進入企業後也比較有意願使用微軟的工具,若微軟未提供這樣的免費工具,學生在學校則只能學習 Java,出社會後則自然向 Java 靠攏。

一直以來微軟最為人所詬病的話題,在於其開發工具無法脫離微軟平台獨存,即便開發工具開放免費下載,所開發出的應用程式仍須依附微軟平台而生,此一情況恐將使得自由軟體愛好者,試用微軟工具的意願大幅降低。

胡德民則表示,除開發工具外,即將發表的 SQL Server 2005 同時提供免費下載的 Express 版本、且新發表的 .Net Framework 2.0 則因為內建 Web Server,開發者在開發階段將無須安裝 Web Server 便可進行作業。此外,在現有出貨的個人電腦中,約有近八成已內建 OEM 版本的 Windows 作業系統,其中所整合的 Web Server,對學生開發者來說,所能提供應用的資源已與自由軟體無異。

微軟用以提供免費下載的開發工具 Visual Web Developer Express Edition,自今年四月在台灣地區推出 Beta 2 版本開放下載以來,至今已累積 5,000 次下載人次,為微軟全球下載排名第12名。

自由與免費,猛然一聽覺得好像沒什麼差別(自由使用 vs. 免費下載),但是實際上是差非常多的。沒有太大的動力學習 Java 的原因(請見之前的「JavaTM」),也是因為它不夠自由(雖然用的人蠻多的)。

所以,即使任何商業公司「免費」提供再多軟體,我也盡量只用「開放」的東西。(說實在,我蠻想移除掉電腦上這個 Flash Player 的 = =)

另外... 胡德民是誰啊...?? Google 一下

健保局的錢花到那裡了?

健保局不是有很多錢嗎?為什麼這頁看起來好像學過三小時的 html 就可以打出的作品一樣?

http://seh1.nhi.gov.tw/nhi/index.asp

而且這頁看起來更像是 Word 打好直接存成 html 的東西?

網際網路加退保作業Q&A

一看之下... 真的是 Word 存出來的......

<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">

星期四, 10月 13, 2005

JavaTM

我沒有修這門課,我也不會 Java。因為我覺得應該先專心把一樣東西(C++)學好,然後再學其他的。

可是,那些修了 Java 的同學,一直跑來問我作業...

據說,黃惠俞上課的時候,根本沒有寫過任何一個 Java 程式,也沒有編過任何東西,甚至連 Java 都沒灌,就教到了第五章,甚至還出了六個作業。

所以... 明明沒有修 Java 又不用 Windows 的我,幫一堆人在 Windows 上灌了 J2SDK 跟 Eclipse(還得幫他們中文化)。

他馬的黃惠俞,教課又不教清楚,害我在這裡浪費時間。(應該跟他收助教費。)

他馬的懶惰同學,明明課本裡就有寫的東西還跑來問我,不會去問老師啊?(今天就要交作業,今天才來問我怎麼灌...)

打領帶

我很喜歡領帶。雖然現在的大學生活中沒有打領帶的需要(打著領帶去上課應該也蠻怪的),但是我還是很喜歡領帶。

今天在 chauny 的 blog 看到了一篇有關領帶打法的文章,特別記下來放在這裡。

星期四, 10月 06, 2005

OpenOffice.org 中文粗體的吶喊

首先,給不知道的人...

學會基本的 MicrosoftTM Office(r) 操作,已經可以說是現代人必備的技能之一。要是不會使用 Word、Excel、Powerpoint 等軟體的基本功能,在今天的社會中,您的價值可是會打折的。可是 Microsoft 是家不折不扣的商業公司,搞出個 Microsoft Office 來也是要賣錢的,而且它的價錢實在不便宜。要買套完整版的 Microsoft Office 授權,可能得花上普通人半個月到一個月的薪水,簡直可以另外買台電腦了!

OpenOffice.org 這套軟體,提供了與 Microsoft Office 類似的功能。最重要的是它是自由軟體,您可以自由的下載、自由的使用、自由的修改他的原始碼、自由的送給別人,或是自由的拿去賣。

發生了什麼事?

OpenOffice.org 2.0 正緊鑼密鼓的開發中,在最新的版本中,許多功能已經與 Microsoft Office 不相上下。而且與 Microsoft Office 的相容性也越來越高,日常使用上取代 Microsoft Office 已經不是什麼大問題。

不過在 Linux 上的 OpenOffice.org,在中文上卻有個問題。由於許多中文字型沒有內建粗體與斜體(必須靠軟體計算模擬),而官方版本的 OpenOffice.org 中並沒有相關的程式碼。

其實早在兩年多前,國內一位註明程式設計師 - 營火飛(Firefly),早已修正了該問題,並發佈了修正檔。只是一直沒有受到 OpenOffice.org 官方開發人員的重視。

所以,請大家幫忙!

現在,為了讓 OpenOffice.org 官方的開發人員聽到中文(其實是中、日、韓)使用者的聲音,請至 OpenOffice.org 投『OpenOffice 中文粗斜體修正程式』一票!

詳細的投票方法請見 Tetralet 的 Blog

我們需要您的幫忙!

參考資料

星期一, 10月 03, 2005

typeof(Yahoo 奇摩知識+) == wiki!?

本月的「Linux Guide(No. 9)」附的「超值學習別冊(TaviWiki)」中,說「Yahoo 奇摩知識+」是使用 Wiki 技術建立的網站。

不會吧...!? Wiki 在那裡...??我分明就不能改啊!

星期二, 9月 20, 2005

病毒廣告信 (SPAM)...

真扯... 雖然其他帳號(palatis _AT_ gentoo _DOT_ org _DOT_ tw、palatis _AT_ gmail _DOT_ com)已經收到許多這種東西,但是 Mailing-List 也有真是還真是讓我無言...

[Chewing-user] chewing-user有沒有收到我寄的資料啊?

我上次傳給你ㄉ一些資料你有沒有收到啊?
因為都等不到你的回應><",所以再E-mail問你一下!
如沒收到跟我講一下,我再重寄!
如果已收到了,也請回覆一下,讓我知道你已經收到了!謝謝!^^"
                      Joyce ^^"

雖然 Chewing-user 信很少,但是也不用這樣吧...?

Linux(tm)?

今天 CNET 說,「Linux」這個字想當商標被澳洲當局否決了。否決的理由... 節錄 該新聞中的一段:

檢察員Andrew Paul Lowe在信中寫道:「你當事人若要根據商標法註冊商標,必須具有充分的『可在市場上凸顯特色的潛在改作』條件。換句話說,要註冊的商標,不可是其他提供類似貨物與勞務的商家平常交易必須使用到的名稱。」但IP Australia斷定,別的商家會需要使用「Linux」的字眼。

不過,Linux Australia 這個機構並沒有得到 Linus 本人的背書,所以沒申請通過似乎應該拍拍胸埔說:「好險!」。

但是... 引用 ljmid迴響

連 Linux 這個字典裡沒有的字都不特殊了,那「窗戶」還能當商標。

這... 似乎... 說不過去 XD~~

星期三, 9月 07, 2005

Quantum-Optical CPU?

突然在 Freenode IRC 的 #dot 看到 Atom Chip Corporation 這家廠商的「AtomChip® SG220-2」這項產品。

稍微整理一下它的規格,不讓我感興趣的都踢掉了:

  • 處理器:AtomChip® Quantum® II @ 6.8Ghz 或 Intel® Pentium® M @ 1.7Ghz x 4
  • 記憶體:1TB 非揮發性 Quantum-Optical RAM (NvIOpSRAM-SODIMM 200-pin)
  • 儲存空間:2TB 非揮發性 Quantum-Optical RAM (NvIOpRAM-ATA IDE)
  • 光碟機:DVD Super Multi
  • 顯示器:12.1" WXGA (1280x800, 16:10) TFT 背光 LCD 顯示器
  • 顯示晶片:兩個整合式圖形控制器 [Intel® 855GME 內建顯示,支援 Intel® DVMT(動態顯示記憶體)與 AtomChip® DVM(動態顯示記憶體)]
  • 通訊介面:內建 Intel® 乙太網路、Intel® PRO/Wireless 2100/2200BG/2915ABG、Bluetooth、GPRS
  • 四合一讀卡機(SDIO/SD/MS Pro/MS)、一個 PCMCIA(支援 CardBus)、三個 USB 2.0、一個 1394A(mini jack)
  • 電池:6 巢鋰離子電池(配合 AtomChip® Quantum® 處理器可用八小時,Intel® Pentium® M 可使用八小時)
  • 充電:開機四小時,關機三小時
  • 大小:(寬)320.0 x (長)242.0 x (高)22.0mm/28.0mm (前/後)
  • 重量:1.9kg(AtomChip® Quantum® II)或 2.20kg(4 x Intel® Pentium® M)

不過,這台 NB 可能會超過 USD$20k,因為那個 RAM $6k、IDE Memory $5k,加起來就 $11k 了。

我知道 IBM 有個「千足計畫」,說「This thermomechanical storage technique is capable of achieving data densities exceeding 1 Tb/in²」(這個技術可以實現 1Tb/in² 的儲存容量),不過以為還有一段時間才會量產。沒想到 Atom Chips 似乎要在 2006 年的 Consumor Electronics Show 上賣這個東西!

沒想到科技進步的這麼快!

星期二, 9月 06, 2005

學歷?學力?

今天在 rickliu's blog 看到「台灣不承認大陸學歷 謝長廷開炮事件.」這篇文章。扯到台灣學歷與學制,我必須出來說句話。

我媽以前是我就讀的高職 - 「臺北市立南港高級工業職業學校」的家長成員,後來更選上家長會長。為什麼呢?因為我以前缺曠太多(一個禮拜去個兩三天...),操行 60 分兩年,她為了我這不成材的兒子,只好去幫我跟學校打好關係。(雖然我曠課多,成績還是很好的。四技二專統一入學測驗,我的成績是班上第二。第一名的 Samael 跑去北科大了。)

好,自我介紹到此結束,接下來是我對這個事件的看法。不過我對高中升大學的狀況不太了解,所以底下就技職體系討論。

學校都想要好學生,學生都想念好學校。

是的,不管是高中、高職、普通大學、科技大學、四技、二專、研究所... 都想要好學生。而不管是任何學生(事實上大部份是學生家長),也都希望能念好學校。對學校而言,「好學生」就是聽話、會讀書、好管、不愛鬧事的學生。不過對學生來說就沒那麼簡單了,每個人心中的理想都不太一樣,異性同學多不多、離家遠近也可以拿來當標準。

所以,一些技職大學(科技大學、四技、二專,下同)就打出一堆「優惠」高中生的標準,例如「專業科目 x0%,英文 x200%、數學 x200%、國文 x200%」等(請各位去參考近年的台科、北科... 等學校申請入學、推薦甄試標準。),吸收在學校沒有唸專業科目的高中生。而那些成績比較差的高中生,就本著「寧為雞首,不為牛後」的精神,進了本來不是給他們念的好學校。但是,專業科目好的高職學生該何去何從?本著以習得一技之長的理想,努力鑽研技術,得到好成績以後,銜接的大學卻不理你的專業,反而問你要國、英、數。結果是,後段大學收不到學生,高職的頂尖學生流進中段四技,高職的後段生面臨沒學校念的窘境。

而且,前段大學也不喜歡收大學生,而喜歡收研究所的學生。有許多前段學校就在抱怨研究所招不到有潛力的學生,其實根本就是自己砍掉的。沒有道理大學部不收學生,卻自動生出一堆學士來唸研究所吧?

大陸的學校比較好

大陸的學校真的比較好。雖然他們有能力念到大學的學生可能比較少,但是整體來講,「十三億人去擠的北京大學」也比「兩千萬人念的台灣大學」來的競爭激烈。當然,這是以頂尖大學論,普通即使差一點的「好學校」,花錢也可以進去唸。有錢的家長可能會認為,與其讓小孩在這種擠破頭的環境唸書,不如讓他們出去遊學,多見見世面,畢竟以後亞洲主要市場就是在大陸。

多元入學是迷思?

在國外(歐洲、美洲),高中、大學大多是用所謂多元入學方案收學生。在外國有辦法這樣作,是因為他們給很多時間讓學生「多元」發展。外國學校上午八點上課,下午兩點就下課了。剩下的時間,還有很多時間發展自己的興趣。喜歡運動的出去打球、喜歡生物的在房間解剖青蛙、喜歡電腦的寫一堆病毒、喜歡化學的把車庫炸掉... 大概都是發生在課外的時間。反觀台灣?早上七點到學校,晚上五點下課,去 7-11 買個御飯糰就接著去補習班,晚上十一點才回到家,回家以後還有學校與補習班交代的作業。那來的時間多元?你要台灣的學生什麼時候去撐竿跳、什麼時候製作昆蟲標本、什麼時候開發 Open Source 程式、什麼時候在車庫造火箭?

題外話... 我手上這張 LPI Level 2,對我考大學一點幫助也沒有。也不能抵修什麼東西。 XD~

總之...

我才不管台灣成不承認大陸文憑,美國、日本、英國、法國、德國、美索不達米亞、沙烏地阿拉伯... 等等國家承認就好了,誰管你承不承認?

人格測驗

這 24 小時以內,我做了兩個人格測驗。

I am nerdier than 90% of all people. Are you nerdier? Click here to find out!
You are Windows 95.  You look better than your older brother, but your communication skills are still lacking.  You start well, but often zone out.

結果讓我啞口無言...

一個說我是 90% 的書呆子,另一個說我是 Windows 95!

這是怎樣???(怒 |||= =")

不知道該說什麼......

玩完 OPIE,來搞 GPE

看到這個 Theme,我真不知道該說什麼...

無言啦!

不過很慢倒是真的,StrongARM 1110 @ 206Mhz 恐怕負荷不來吧...

星期一, 9月 05, 2005

塞進去了...

今天試著把 Konqueror-Embedded 塞進那台 iPAQ 小小的 16mb rom 裡...

結果.....

塞進去了!!!

字型是 simsun qpf 12pt,因為 Arphic 要 1.8mb,這個只有 600kb。當然,不可避免的,字也少了一些。

iPAQ + Familiar + 中文

寫輸入法寫到頭昏,所以想休息一下,跑去編 RackLin 兄寫給 Zaurus 的 CKeyboard

沒想到一編之下編起來了!所以我就懶得繼續寫了... 所謂「軟體就是要用現成的,避免重複開發」。但是,看了 CKeyboard 的 source code,我決定多花點時間規劃個更好的 framework,然後重寫一個更模組化、更省磁碟空間的輸入法。

總之,底下是目前的 Screenshot,字型是 10 點的 Arphic Ming(自己轉的 qpf)。

Orz 與駭客任務!?

今天看 Jserv's blog這篇文章時,看到

請用 [Google 圖形查詢] 找 "Orz",左邊第一張圖片就是。

雖然我知道什麼是 "Orz",但是就... 還是跑去找啦!於是... 找到了這張圖... 真是令人 Orz......

另外,在該圖片原始網站 - エルエル上,又另外看到了這篇文章。裡面指出的這個連結,更是讓人 Orz...

網路真是一種會讓人 Orz 的東西...

星期三, 8月 31, 2005

換個皮膚吧!

MSN Shell 的網站,中文似乎是完全照翻的...

甩開一成不變的界面 - 更換皮膚

打破 MSN Messenger 一成不變的界面,提供多種可選皮膚方案。換個皮膚,換個心情,使用 MSN Messenger 更有個性,更可自定義更多皮膚方案。

說真的... 要我看這種翻譯,我會選擇看英文 = =

星期日, 8月 28, 2005

Compaq iPAQ H3600

最近收房間的時候,突然找出了這個東西 -「Compaq iPAQ H3630」。

記者 Palatis 為您播報!您現在看到的就是我的 iPAQ!它坐在 USB Sleeve 上,穿了 Back Jacket,還背了一張神腦 WL-2011CD 無線網路卡

這個是在 COMPAQ 還沒被 HP 併購以前的老東西了,否則最上面的商標就不會是 COMPAQ... 稍微介紹一下它的硬體規格:

  • StrongARM-1110 @ 206Mhz
  • 103Mhz 64MB Samsung SDRAM (CL3)
  • 16MB Flash Memory
  • 240x320 Color Display
  • Phillips UDA1341TS Sound Chip
  • 詳細資訊點我

其實它來我家很久了,最初是我爸第一台 PDA。跑 WinCE 3.0 英文版 + 中文化套件,而且中文的部份還放不進它小小的 16MB ROM 裡,每次重新開機就要灌中文化軟體。而且它原本的記憶體只有 32MB,是我爸拿去升級才有 64MB 的。

兩年多前吧,我爸買了隻跑 Smartphone 的 PDA 手機(搞不清楚那一隻了,好像是 Mio 的不知道那一台什麼東西),於是這個就被我偷來當玩具啦!

有了這麼高科技的玩具(其實我拿到的時候它已經出約兩年了),當然要好好的蹂躪一番。還記得我當時馬上就抓了 Familiar Linux 灌進去。當時最新的 Familiar 0.5.3 中文實在差勁,而我那時候剛開始玩 Linux,還沒有太多經驗,所以灌著灌著就灌進雜物箱裡去了。

時間來到 2005 年 8 月,最近翻箱倒櫃它突然跳了出來。本著「相逢即是有緣」的精神,我決定再給 Familiar 一個機會!

經過兩年,Familiar 也進步到了 0.8.2。安裝跟之前差不多,把 rom image 複製到 PCMCIA CF 卡上,然後透過 Boot Loader 刷新 FlashROM,很簡單就裝好了。先拍張照:

然後跑了 Benchmark程式(Benchmark Suite in OPIE System Info):

這次的版本中,CJK 支援增強了不少。不過這台 iPAQ 內建 ROM 實在太小,想在 16MB 裡面塞進驅動程式、應用軟體、跟中文字型是不可能的。我移除了一堆 bluetooth 支援、USB 支援、用不到的驅動程式、用不到的英文字形、用不到的佈景主題、用不到的軟體(如英文手寫辨識),好不容易擠出 2.7MB 的空間來放中文環境所需的資料。

首先裝了 opie-language-zh-tw,這樣至少先有了中文語系檔,不過切過去的話中文字都會變成方格... 所以接著放了 10pt 與 12pt 的台北 qpf 字形。開個中文檔看看... 可以看了耶!不過台北字形好醜... 等下來作其他 qpf!

中文輸入目前無解,還在努力想辦法中。我跟 Zaurus 偷了 CKeyboard 可是不能用,接下來試試 opie-ckeyboard 吧!如果還是不行,恐怕就得弄 Cross Compile Environment 了。

總之... 努力吧!

星期四, 8月 25, 2005

進貨+1

之前提過的 Bluetooth 耳機跟耳機麥克風我拿到了。會來看我 BLOG 的,還是給優惠價~(以下價格含運費)

Bluetooth Stereo Headset(AWBSH1)搭配 Bluetooth Audio Transmitter (AWBST1):$3100
Bluetooth Mono Headset:$950

價錢應該還算蠻低的,而那款 Mono Headset 跟 Motorola 是同一間 OEM 廠商。

量大(5pcs+)價格另議!

星期四, 8月 18, 2005

Taskbar Icon Hell...

想以前在 Windows 的時候,右下角工作列中總是有一整排的小圖示。換了 Linux 之後,這些東西少了不少。

但是... 但是... 但是... 現在又回來了!!

最左邊那個灰色的不算,是虛擬桌面切換器的尾巴。其餘從左到右依序是... SCIM、XFCalendar、GnomeICU、Gaim、StarDict、XChat 2、Azureus、Skype。

星期三, 7月 27, 2005

進貨

冠寶進了一批貨,順便在這裡打打廣告。

會來看我 BLOG 的,有需要的話給以下的優惠價喔~(以下價格含運費)

802.11b/g WLAN USB Dongle(AWG01U):$700
802.11b/g WLAN + Bluetooth Class 2 v1.2 USB Dongle(AWGB2U):$1350

以後還會陸續有「音響等級 Bluetooth 耳機」還有「雙聲道 Bluetooth 耳機麥克風」等等,不過價錢還不確定。

如果有人想大量進貨(5pcs+)的話,價錢可以更低。

想買冠寶其他商品的,也可以找我。

星期日, 7月 17, 2005

是 sATA 真的比較快還是硬碟進步了?

我妹的電腦一直不甚穩定。在我仔細的推敲(其實只是看看錯誤訊息列出的字...)之下,發現到可能是主機板(Albatron KM18G Pro)晶片組(nForce2 IGP/MCP)內建顯示所以容易過熱,總是開沒多久就開始兩光,過一會就當機。所以我就先把主機板拆了出來,準備換一片給她。看著散落一地的電腦內臟,我突然大發好心,把 ram 跟 hdd 裝到我的電腦上,幫他跑了趟 memtest 跟 badblocks。memtest 順利跑完,沒有發現問題。但是 badblocks 可就沒那麼幸運了。在極度不耐煩之下(用 badblocks 測有壞軌的硬碟,想不耐煩還真的不行。),我決定除了主機板之外,順便買顆硬碟給他。

新的主機板是 Gigabyte 7VT600P-RZ - 一張已經快停產的主機板。買他的原因是因為他只要新台幣 $1,550... 至於硬碟,則選了 Seagate Barracuda 7200.7 sATA NCQ - ST380817AS,因為這顆硬碟只要 $1,990,而且有 NCQ(雖然這張板子不支援)...

買回來之後弄好硬體、安裝作業系統之前,我突然異想天開,測了一下 hdparm -tT...

# hdparm -tT /dev/sda

/dev/hde:
 Timing cached reads:   1313 MB in  2.02 seconds = 650.15 MB/sec
 Timing buffered disk reads:   139 MB in  3.00 seconds =  46.35 MB/sec

接下來安裝 Windows XP,一下就裝好了。開機進作業系統也非常順暢,幾乎沒有 delay...

不知道是硬碟進步了,還是 sATA 真的那麼快但是... 我不依~我不依~我不依~我不依~我不依~我不依~...

我下一台電腦也要用 sATA II RAID5...

煙斗

話說我可憐的打火機被我玩到花紋掉下來以後,我就一直很想買一隻便宜的來練習,順便把這隻拿回給 Zippo 送修。所以,買了這傢伙:

只花了 $690,算是入門級的 Zippo。又發現,他是煙斗用的打火機,所以順便買了隻 $390 的便宜煙斗:

感想... 煙斗真是難抽死了!點個火麻煩的要死,點不著就算了,點著了照顧不好會熄掉,放太久沒抽會熄掉,抽太大口會熄掉,抽太小口也會熄掉... 點起來感覺跟去烤肉的生火差不多,要慢吸慢吐,照顧進出空氣的量。想抽個菸這麼辛苦,真不知道是為了什麼...

大概知道啦,為了好玩跟品味。抽煙斗,在某種程度上看來似乎也蠻屌的。下課大家去吸煙區吸煙,我從口袋拿出煙斗跟菸草開始點...(不知道會不會被拖去打...)

另外,Captain Black GOLD 味道好辣!抽完去喝一大杯水還是好辣。下次也許會選淡一點,有香草調味的菸草。

星期三, 7月 13, 2005

分屍了...

我的 Zippo 打火機,被我玩一玩,竟......

本來是這樣:

變成了這樣:

我並沒有很粗魯的對待它阿... 只是偶爾拿來玩玩而已。聽說 Zippo 有 512 種玩法,我也只會其中三種(而且都算初級玩法吧)...

幸好 Zippo 打火機是終身保固,把屍體寄回美國賓州的布萊德福特鎮(Bradford),對方還會退郵資回來!明天來聯絡台灣的代理商,看看他們是不是會幫我寄。可是又聽說台灣代理商每季寄回原廠修理一次,所以拿去以後要半年一年才回的來。真是勞頓了這隻 2002 年 9 月的打火機。

所以... 奉勸各位 Zippo 迷,要玩的話不要拿上面有貼東西的來玩,甩一甩是會掉下來的... 過幾天來去買隻便宜的($600)來練那 512 招,這隻「小貴」($2700)就收在櫃子上當收藏品吧!