2007-03-31

廢言廢言廢言廢言

我在 ptt 的 Prob_Solve 版看到這句話:
popcorn5368:這個結構是有cycle的DAG(directed acyclic graph)
看他問的問題,應該是個研究生,是不是 computer science 領域的就很難講。anyway... 能寫出這種句子,有時候不禁懷疑,台灣的教育到底教出了什麼東西?

Java Browser Project 調查報告

→http://html.xamjwg.org/index.jsp
測試了幾個自己的網站,網頁 support 奇慘無比。我實在看不出來他哪裡支援 JavaScript 跟 CSS =.=(難道 JSPWiki 裡頭的 CSS 不是 2.0 版?)、編碼支援也很糟糕。重點是,連我的首頁(只有基本到不行的 html 碼)都顯示的很糟糕....

→http://browserlaunch2.sourceforge.net/
這是一個有點莫名其妙的 library,他不是寫一個瀏覽器,而是讓 Java 去呼叫外部的 browser 然後開啟你要的網頁(路人:人家明明 project 名稱就這樣寫了,幹麼說人家莫名其妙 [踹])。雖然跟要找的東西無關,不過還是順便 memo 一下。

→http://www.icesoft.com
這個測了一下,還不錯,不過他的 open source 很奇怪。有給某些 source,不過和新的部份好像都沒有附... 不過倒是在他的 Developer Guide 當中找到應該更貼近目前需要的名詞「HTML Rendering」

就先到這裡 hold 住吧...

2007-03-30

檔案系統?

這一篇速寫提到了檔案系統,然後包括梅老大跟路人(這位大大到底是誰 @_@??)都有回應。

我覺得,雙方的重點好像有點交錯。關鍵點似乎是「檔案系統」的定義問題。於是,讓我們翻開恐龍書第 6 版第 11 章 p.371,裡頭說:
The file system consists of two distinct parts: a collection of files, each storing related data, and a directory structure, which organizes and provides information about all the files in the system. Some file systems have a third part, partitions, which ar used to separate physically or logically large collections of directories.
再來跳到 p.383,有這段字:
First, disks are split into one or more partitions...... Second, each partition contains information about files within it. This information is kept in entries in a device directory or volume table of contents. The device directory (more commonly known simply as a directory) records information - such as name, location, size, and type - for all files on that partition.
在這樣的定義下,我會覺得不管是梅老大講的內容 or Cheng-Yen 講的內容,始終還是落在 file system 的範圍當中,是把功能縮減到只剩下必要的部份、刪去像樹狀結構、權限管理等等的顧慮。我的疑問也可以說由此而來。

好了,說完了,還請各位大師賜招... [擺茶點]

2007-03-29

碼的問題

咪的,我不是要故意罵髒話,而是真的是碼的問題。

這周上主題分析的時候,移師到社圖八樓上課,由圖書館負責編目的大姐大們實際操作 Millennium 來講解。由於這家公司完全沒有作 L&F,所以很快的就懷疑這套系統是 Java 寫的,事實上,也的確是 \囧/。(嗯... 發現有 Java 寫的 application 還是蠻值得高興的 \囧/)

講到日文書的編目的時候,大姐大們特別吐苦水,就是沒辦法用國圖的資料作抄編。原因是國圖的資料是用 Big5 來顯示日文,複製貼上到 Java 上頭會掛點。

於是研究了一下這件事情,於是好玩的事情來了。用 IE6.0 開國圖的資料,的確日文會出不來,複製到筆記本會掛掉;但是用 FireFox 0.9.2 看,資料都是好好的,複製到筆記本也 ok。

我在現場有 try 過,如果用 ZTerm 把 BBS 上的日文複製到 Millennium 上頭,又沒有問題。於是考察了一下 ZTerm 的處理方式... 看不太懂 T__T,Convertor.java 提供的 method 拿來亂測了一下,也都失敗。「可是 ZTerm 複製貼上沒有問題阿阿阿阿~~~」我心中如此吶喊著。

好了,爆笑的點來了 \囧/。

只要把字串這樣子處理:
String output = new String(context.getByte(), "Big5");
就沒問題了。(之前還懷疑是系統的剪貼簿有神秘的功能... lol)

這樣說來... 咪的... IE 是在幹什麼吃的... [飛踢]

2007-03-23

20070323 DistSys 速寫

lifetime 跟 scope,是各種議題始終不變的關注點。

安全性的部份... 帶過去的很快,我也昏沉的很徹底... \囧/

開始扯到 NFS 了,梅老大提到有些嵌入式系統沒有 File System。這點我提出問題「如果沒有 Fily System,那上層的 system 怎麼知道檔案從哪裡開始從哪裡結束?」梅老大回答的內容比較偏向「沒有 File System 會有什麼好處」,主要的論調是 File System 其實是個 overhead。但是... 嗯... 好像沒有回答到這個問題?(還是我曲解 File System 的涵蓋範圍跟功用? =.=?)

NFS 是 stateless server。

解決多個 cache 之間的資料同步,用 timestamp 作解決方法的起點。

====
咪的,講得多還不如講得深吧.... 都研究所了耶....

2007-03-18

快快樂樂學 RMI - Start!

身為一個只會寫 Java 的人而言,遇到分散式系統,好像不能不實際來 try 一下 RMI。不過對於用 Eclipse 習慣的人而言... 寫 RMI 實在好麻煩啊... [泣],google 找到的 plug-in 似乎只有這個,但是看到他要收費,馬上就軟掉(?)了。Ant 又完全沒有用的習慣,還是回憶一下 bat 檔怎麼寫吧... Orz

好了,言歸正傳。

因 為種種點點點我不知道的原因(理論上是因為 Java 沒有多重繼承,然後 RMI 又希望溝通的物件是 parent class 是 java.rmi.server.UnicastRemoteObject,不過這純屬猜測... API 懶得看 XD),所以真正要讓 client 可以遠端呼叫的物件,必須讓它 implement 自己訂做的 interface,而且這個 interface 還得 extend java.rmi.Remote。所以,就先來定義一下 interface 吧:

FooInterface.java
package test.remoteInterface;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Date;

public interface FooInterface extends Remote {
public Date getServerDate() throws RemoteException;

public String getServerMessage() throws RemoteException;

public void setServerMessage(String s) throws RemoteException;
}


這 裡留了幾個惡搞的空間。只要 Server 跟 client 不同機器,且時間調的不一樣,那麼 getServerDate() 就可以顯現出差異。而 serverMessage 的 setter 跟 getter 是用來測試 server 端的物件如果被改變,能不能 keep 住。下面這個實做就變得沒啥好講了... [茶]

FooObject.java
package test.remoteObject;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Date;
import test.remoteInterface.FooInterface;

public class FooObject extends UnicastRemoteObject implements FooInterface {
/**
* 為了減少 warning 而加的
*/
private static final long serialVersionUID = 1L;

private String message;

public FooObject() throws RemoteException {
super();
message = "Default Message";
}

public Date getServerDate() throws RemoteException {
return new Date();
}

public String getServerMessage() throws RemoteException {
return message;
}

public void setServerMessage(String s) throws RemoteException {
message = s;
}
}


然後追加一個 server,執行這個就可以讓他接客了 \囧/
FooServer.java
package test;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import test.remoteObject.FooObject;

public class FooServer {
public static void main(String[] args) {
FooObject foo;
try {
foo = new FooObject();
Naming.rebind("rmi://127.0.0.1/FooServer", foo);
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
}
System.out.println("Foo Server is ready");
}
}


最後,當然是來寫 client 端啊:
FooClient.java
package test;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.Date;
import test.remoteInterface.FooInterface;

public class FooClient {
/**
* 1: ip 位址
* 2: 設定字串
* @param args 參數
*/
public static void main(String[] args) {
try {
FooInterface foo = (FooInterface) Naming.lookup("rmi://" + args[0]
+ "/FooServer");
System.out.println("Server Date : " + foo.getServerDate());
System.out.println("Client Date : " + new Date());
System.out
.println("Before set message : " + foo.getServerMessage());
foo.setServerMessage(args[1]);
System.out.println("After set message : " + foo.getServerMessage());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}
給 我等一下![指],並不是這樣子 compile 完,分別執行 FooServer 跟 FooClient 就能用。你還得針對 FooObject 另外作 rmi compile 的處理。在這個 foo 的例子當中,就要下(classpath 等問題請自己搞定)
rmic test.remoteObject.FooObject
這會另外產生 FooObject_Stub.class,在包 client 的執行環境,這個檔也要加進去。

另外,在執行 FooServer 之前,得先執行一個程式 rmiregistry(在 {JDK}/bin/)。如果你也不幸是用 Windows,那在 command line 的環境下打「start rmiregistry」,會另外自動開個黑窗。

一切都順利的話,就可以來真正來玩玩看了。[茶]

錯誤排除區:
java.net.ConnectException→咪的,rmiregistry 啟動了沒?

備註區:
網路上的範例幾乎都有在 client/server 端的程式碼來這行:
System.setSecurityManager(newRMISecurityManager())
但是... 我用了反而問題一大堆(有設定 java.policy 了),還搞出一堆靈異現象。拿掉那行反而一點事情也沒有 [爆]。

2007-03-16

20070316 DistSys 速寫

JMS 跟 RPC 有什麼差別呢?目前好像在課堂上沒有看到 JMS 這個名詞,於是 google 了一下,發現這個 javaworld@tw 的這個連結Blogger 版)。好像就解決這個疑惑了... 不過瞄了一下其他 search 結果... ㄟ都... 那 JMS 跟 SOAP 呢? [抓頭]

idempotent:arbitrary failure will not occur
idempotent op:repeated execution is same as exact one execution(例如讀取資料)
有點雞肋的兩個詞... =.=

JINI v.s upnp,光聽 upnp 指定用 http 跟 XML,好像比較帥,不過聽到 M$ support,恩... 掰掰... [揮手] \囧/。我是不覺得 JINI 會被 upnp 幹掉... 不過這樣子的想法似乎只是空想,沒啥根據 [毆飛]

RMI 只支援 client polling,要作 callback,讓 client 也變成 server 就行啦 \囧/

分散式作業系統,用使用者的角度來說,就是使用者不用管程式在哪台機器上頭跑。

OS 當中....
Monolithic kernel:全部都塞在一起
Micro Kernel:分拆成不太小的小部份,組合在一起

Distributed System Challenges

(晚上被案主以及老友騷擾,原本想閒散的晚上就這樣沒了。睡覺前於心不安(尤其是看到 blog 的 comment... [炸]),於是打開課本隨手翻翻。看到第一章的這個環節,覺得有必要寫個籠統的亂譯 + 筆記。

那就來開打吧... \囧/

分散式系統的挑戰:
  • 異質性(Heterogeneity)
  • 公開性(Openness)
  • 安全性(Security)
  • 拓展性(Scalability)
  • 錯誤控制(Failure handling)
  • 同步(Concurrency)
  • (Transparency)
異質性的環節在於:要允許不同規格的硬體規格、OS、網路結構(當然,如果舉 Internet 為例子,最終還是得靠 TCP/IP 家族的 protocol 來溝通。這指的是比 IP 更低層的網路),甚至不同的 PL 以及不一致的 pr 實做,都能夠一起運作的很快樂。解決之道應該還是 Layer, Liar 的方式,然後要大家在某一層一致的遵守某個 spec,或是轉換成某個 spec。

開放性,其實對我來說,就是異質性的反向講法。所以跳過。

安全性... 應該不是這本書的重點(都可以另外寫好幾本書了 XD),只是觀念的話,也跳過。

拓展性,這裡提到了幾個關於這點的挑戰:
  • 控制實體資源的成本:「表面上添機器就能解決問題,實際上不然」說得好,不過實情還是等到第八章再說 \囧/
  • 控制效能的流失:最後一句說「如果一個系統要有拓展性,那麼效能的流失必須小於 O(log(n))」,這... 好像怪怪的...
  • 防止軟體資源用盡:舉 IPv4,實在是很好卻也很對不起當年 designer 的例子。以前江老師說:「要是當年 IP 是台灣人設計的,那大概五年之後就把 ip address 用光得改版了,2^32 次方已經算是天文數字了啊......」
  • 避免效能瓶頸
錯誤控制,好像沒啥值得特別一提的:錯誤的偵測、掩飾、容忍、修復... 幾乎跟 deadlock 一樣(廢話,deadlock 也算是一種在 OS 上出現的錯誤啊...),真希望看到一些新的招數 XD。另外 Masking Failures 的第二項不就是 Redundancy 嗎?是作者畫蛇添足 or 是我理解錯誤?

同步問題... 跳過。

我放棄把 Transparency 翻譯成中文。對我來說,transparency 也還是 Layer, Liar 的另一種講法(啊不就是用的人不用真正知道些什麼,還是可以用得很快樂 \囧/)。而這本書似乎是想要以此作為前頭六項的終極目標 or 總結。嗯... 這樣子是也還不錯啦... 不過當看完異質性的部份,應該就能了解 transparency 了,不是嗎? [抓頭ing]

好了,終於看完第一章了,從 03.12 寫到現在,還真 xx 的沒效率。

下面是縮寫區:
CORBA = Common Object Request Broker Architecture(課本 p.17 少了 A 的全文)
RMI = Remote Method Invocation
RFC = Requests For Comments

2007-03-11

weco.net 的 blog 又掛了 lol

昨天上分散式系統的時候問了一下關於 trackback 的問題,結果梅老大的回答很妙:
沒有 trackback 那你就不應該用那個系統,你就該用我們提供的 blog。trackback 是 blog 當中很重要的功能。
當然啦,我是不太喜歡 blog 這種傳播載體啦,現在會搞 blog,不是因為想靠 AdSense 賺錢,就是因為上課需要。trackback 重不重要... 我倒是沒資格講什麼,我又不是資深的 blogger。

不過,好笑的是:
  1. 梅老大壓根沒聽過 Blogger、BlogSpot。
  2. Blogger 其實有跟 trackback 一樣的功能,但只能對 Blogger 上的文章。[聳肩]
稍微關心一下 blog 發展的,很難不知道 Blogger 吧?尤其是他後來的東家變成 Google [無奈的攤手。至於 Blogger 沒有 trackback 的功能... 我只能說... 這是我討厭 blog 的原因之一,畢竟 blog 還是沒有正式的標準,像 RSS 這種文章訂閱的功能,LifeType(weco.net 用的 blog system)上頭就提供了四種規格 RSS 0.9, RSS 1.0, RSS2.0, Atom 0.3,我是沒研究這幾種規格上面到底差別在哪,但是重點是... 咪的,有沒有這麼多種啊... [飛踢]

好了,這些其實都是小事情... 最爆笑的一點是...

weco.net 的 blog service 又掛了... lol

說「又」,是因為在上個禮拜上完課就發現分散式系統的官方 blog 掛了,後來寫信給梅老大提過這件事情(還有 del.icio.us url 的錯誤),後來 fix 了。然後今天又炸了...

當 個 service provider,就要有 7*24 的覺悟、還包括資料備份等等的問題(哎呀... 關公面前耍大刀... 我修的可是分散式系統... [炸])。在一個禮拜內就發現 service 炸掉兩次,我想,會「自願」去用 weco.net 的 blog service 才是傻瓜。

好 啦... 我不想當傻瓜,所以繼續用我的 Blogger。反正除了 trackback 之外,文章該寫的都寫了,張貼時間也有 Google Analytics 可以幫忙證明,期末真的不行再惡性轉到 weco.net 上頭去吧... 哈哈哈哈 [逃]

2007-03-09

20070309 DistSys 速寫

Overview 似乎跟廢話很容易扯上關係....

講到 Transparencies 的時候,居然還扯到《世界是平的》的演講內容:UPS 現在 support 很多廠商的維修工作。這... 比喻是不錯啦... 但是,能講點實際 IT 領域的例子嗎? [嘆氣]

好了,第一章(花了一個小時)只留下這個印象...(這應該歸功於《世界是平的》 lol)喔對... 最好用 Java 寫 Web Server 兩行就可以寫完啦... [翻桌]

「Thin-Client 的觀念一直在變」這句話講的真是好... 不過 Fat Network 大概不會變... (Terminal 年代好像沒這個問題 XD)

TCP 跟 UDP 最大的差別:TCP 有建立 connection、有 flow control、有 congestion control。(謎之聲:離讀 network 的日子太遠了,居然回答不出來... [遠目])

Interconnection Network:指平行電腦當中眾多 CPU module 與 Memory Module 之間的 network。其他還有像電信的 switch 等等。(重點會在拓樸的問題)

中間其他的... 沒啥能留下印象... 畢竟太 overview 了... [炸]

然後又談了 20 分鐘的 second life... 重點是,講技術面的部份也沒有講的很深入啊....

好了,下課!

2007-03-08

無奈....

搞資訊的人,其實不見得怕寫系統,而是怕寫了系統卻沒有人用。同理可以推廣到「自己在用的系統別人沒有在用」。大概是搞資訊的人天生都沒啥號招力,然後不 搞資訊的人卻常常用一些很鳥的系統.... [笑],偏偏大部分的系統都會牽扯到使用族群大小的問題(想想當年的 ICQ 跟現在的 MSN 吧...)

最近修了輔大資工所的分散式系統,到目前為止,分散式系統長啥樣子還不知道,倒是聽了一堆 second life 的事情(喔~老師買了一塊有無敵海景的地)、要用 del.icio.us、要建立 blog、要在「官方課程 blog」有 comment、自己的 blog 上頭還要有 10 個 trackback post....... 我是不是要慶幸還好不用到 second life 上課...... lol

為了隱藏身份,所以用 pt2club 來開另外一個 blog,系統當然還是繼續用 blogger(這樣子這堂課修完,資料 copy 回本尊的 blog 不會有太大問題 \囧/)。

好了,就在「明天要上分散式系統了,今天來稍微準備一下」,於是爬上官方課程 blog、大概掃了一下有修課同學的 blog,恩... 怎麼大家 po 文的時間都差不多 [炸],看到這篇〈如何成功 "引用" 文章〉,嗯... 來研究一下 trackback 好了...(雖然說我壓根找不到那篇說的「真實引用網址」是啥)... 嗯? 嗯嗯嗯??

咪的!blogger 沒有 trackback 的功能???

說實在的,blogger 的中文 help 訊息也有夠「眼球博士」的(雖然說轉成英文語系也好像差不多意思),有些莫名其妙的功能實在是看不懂... Orz,只不過很肯定的查到... 是的... 沒有 trackback 功能...

不管了... 反正梅老大的規矩這麼多,我大概也沒那個腦袋可以全部遵守到底,萬一這點起紛爭然後被當,就在說吧... 哈哈哈哈... 反正我是 trouble maker... [挺]

測試