2009年9月17日 星期四

PLT-Scheme Contracts

一歩一歩讀著「Guide: PLT Scheme」,讀到 PLT Scheme 的 Contracts。我使用 Eiffel 的 Design by Contract 多年。感到 PLT Scheme 的 Contracts 設計過於瑣碎。缺少 Eiffel 的簡單明瞭容易使用。

但是 PLT Scheme 的支持者說 PLT Scheme 的設計是健全的。我不禁好奇又感到懷疑。Behavioral Contracts and Behavioral Subtyping 嘗試說明 Eiffel 的問題。但顯然文章的作者不瞭解 DbC。DbC 的設計,在繼承的子類別處,precondition 可以放寬, postcondition 則必須更緊縮。這文章不同意 DbC 的看法。舉了以下例子:J 繼承 I。J 和 I 都有一個函式 m (x)。m 的引數 x 在 I 中的要求是 x>0。在 J 中的要求是 x > 10。於是 Eiffel 的 DbC 認為使用 J 的 m 時 x 可以為 5。但這篇文章認為不行,使用 J 的 m 時 x 必須大於 10。我同意 DbC 的作法。J 是 I  的繼承者,必須繼承 I 的責任和義務。在 I 中認為只要 x > 0 就有資格使用 m 這個函式時,J 的函式設計就必須滿足這條件,否則,J 不應該繼承 I。J 中的 m 寫著 x > 10。只是說明 J 中的 m 承諾在 x > 10 時可以使用 m。透過繼承 J 還同時承諾了 x > 0 時也可以使用 m。因此,雖然 x > 10 這條件有點多餘,但不表示它是錯的。

這讓我對 PLT scheme 的 contracts 設計感到失望,也許這就是為何 PLT Scheme 一直無法推出 Class 的 contracts 的原因:他們根本想錯了。

2009年9月6日 星期日

風雨將至?Scheme 來援?

出於興趣,工作之餘,我撰寫網路游戲,透過這努力,我吸收新的,工作以外的專業技術。這是必須的,因為,工作的內容常一成不變,以致於人無法單靠工作成長。在技術瞬息萬變的軟體世界,不成長就等著被淘待。在休閒時撰寫網路游戲,使我能任意選擇我想要學習的技術,也沒有工作上必須完成的壓力,能依自己的狀況或快或慢,漸進地成長。

雖說技術瞬息萬變,但值得學習的常常是那些老舊的東西,那些老舊但又能持續推陳出新的東西。在此我指的是一種古老的語言:Scheme。我在前幾天發現 PLT Scheme 提供了 Web Server。

對於 Scheme 這語言,我早充滿好奇。一直沒能派它上用場,只能止於欣賞,無緣深入。我開始撰寫網路游戲時,未曾考慮它。我使用 Javascript,另一個我以為值得學習的語言。我以 Helma NG 為我開發的平台。在這過程中,我停歩了。我發覺自己需要一個 DSL以撰寫游戲的腳本。我考慮自行設計,或直接用 Javascript,前些時決定用 jLINQ+JSON。這組合總算初歩滿足我的需求。不幸,撰寫工作還是一停在停。

「一定是在哪兒有問題,讓游戲的撰寫工作少了一種流暢感。」我心想,「可能游戲複雜度將至的警訊。」

這流暢性的缺乏來自我的游戲中需要有能和資料完美結合的 DSL。但 Javascript 或 jLINQ 或 JSON 並不適合。

這時發現 PLT Scheme 提供了 Web Server 讓我十分開心。我打算以 Scheme 改寫游戲,評估它的實用性。希望這次能讓我進入 Scheme 的領域。

2009年7月28日 星期二

AWS 的 EBS 和 snapshot

EBS 相當於 RAID,提供比一般硬碟還可靠的儲存能力。
使用 EBS 的一個好習慣是:
  1. 結束一個 instance 時,就做一次 EBS 的 snapshot。同時,刪除 EBS。
  2. 要啟動一個 instance 時,從 snapshot 重建一個 EBS 來使用。
  3. 要做 snapshot 前要先停止 application, umount EBS, 以免在產生 snapshot 的過程中 EBS 上的資料還在變動。
如此的好處是:
  1. 不必在未使用時佔用一個 EBS。省錢。
  2. 新建的 EBS 可以配合 instance 的 availability zone。

2009年7月26日 星期日

Domain Setup with DNSMadeEasy

依以下指示在 DNSMadeEasy 設好給 Elastic IP 用的 DNS Server。
Domain Setup with DNSMadeEasy
在 DNSMadeEasy 使用我在 Yahoo 的 email 名為 user name。

第二個 AMI

建了第二個 AMI,以 alestic/ubuntu-8.10-intrepid-base-20090614.manifest.xml 為基礎。並安裝以下軟體:

apt-get install sun-java6-jdk ant git-gui rhino user-setup

安裝後移除了 package cache 以簡省空間。

不安裝 Destop 軟體,它只是一個單純的 server。

這次學乖了,並未以 user-setup 建立任何 user。保持 AMI 的乾淨,只在起動 instance 後才臨時建立一個 user。這臨時建立的 user 名稱和密碼可以隨便給。因為它用一次即丟。

建立了第一個 AMI

閱讀 EC2 的 Getting Started Guide

學到以下:
  • 閱讀了Web Services Tutorial。Web Services 的基礎是 XML+HTTP。Web Services 的平台是 SOAP、UDDI、WSDL。
  • 下載了 ec2 api tools 及 ec2 ami tools。
  • 以 ssh 連上時要檢查 finger print 是否和起動 AMI 時 instance output 顯示的 ssh host finger print 相同,以避免 "man-in-the-middle" 攻擊。
  • 設 JAVA_HOME=/usr/lib/jvm/java-6-sun/
  • 設定 .ec2 環境。
  • 最後,建立了自己的第一個 AMI ami-novplay/myimage.manifest.xml

2009年7月25日 星期六

更簡單的安裝 EC2 AMI 中文的方法

在 ssh 及 apt-get update 及 user-setup 之後,以NX登入。
再選擇 Language support。

之後可以以 sudo 執行以下命令執行 helma ng:
apt-get install sun-java6-jdk ant git-gui
git clone git://github.com/hns/helma-ng.git
cd helma-ng; ant jar
export PATH=$PATH:`pwd`/bin
helma apps/demo/main.js