2008年1月17日木曜日

Smalltalk入門.オブジェクト指向の始祖だよね.

久しぶりの更新.卒論がねぇ・・・.(いいわけにつき,以下略.

今回は,Smalltalkの入門について.Simulaはどうしたといわれそうなタイトルだな.まあ,僕の中ではSmalltalkが始祖なんだって.

なんで,Smalltalkって思う人もいるかもしれないんだけど,オブジェクト指向について考えててぶつかったからなんだよね.(「オブジェクト指向における再利用のためのデザインパターン」を読んでるせいもある.)オブジェクト指向の始祖であるSmalltalkのオブジェクト指向ってのが,いま主流のC++とかJavaとかのクラスベースオブジェクト指向とJavaScriptとかSelfとかのプロトタイプベースオブジェクト指向のどちらとも違うってところでね.だけど,どこが違うとかの情報がなくて,どう違うのかがいまいちピンとこないから,実際に書いてみればわかるはずだってことで,Smalltalk入門ってなわけだ♪

処理系は,MacPortsで,GNU Smalltalkをインストール.(MacPortsを$ sudo port selfupdateしてからインストールしよう.なんか,アップデート前はIntel Macに対応してないとかで,インストールできなかった・・・.)
$ sudo port -c install gst


とりあえず,起動,Hello, world!,終了をやってみた.
$ gst
GNU Smalltalk ready

st> 'Hello, world!' printNl(「Hello, world!」文字列オブジェクトにprintNlメッセージを送信する.)
'Hello, world!'(表示結果.)
'Hello, world!'(評価結果の戻り値.)
st> ObjectMemory quit(終了方法.)
$


Hello, world!は,ほとんど普通の言語と同じだねぇ・・・.普通の言語は述語,主語の順だけど,Smalltalkは主語,述語の順ってかんじだね.

さてと,つぎはお約束の階乗計算プログラム♪っていつもなら軽いノリで書くんだけど,Smalltalkのプログラミングはかなり苦戦した〜.その苦戦したソースをどうぞw
Integer extend [
factorial [
self = 0 ifTrue: [ ^1 ].
self > 0 ifTrue: [ ^(self - 1) factorial * self ].
]
]

10 factorial printNl.


これは,既存のIntegerクラスを拡張して,factorialメソッドを追加する(実際は,factorialメソッドが存在するのでオーバライドになる.)という意味.末尾の10 factorial printNlでメッセージ送信をしてて,10っていうIntegerインスタンスへfactorialメッセージを送信し,その結果にprintNlメッセージを送信しているってかんじ.10は,factorialメソッドでいうところのselfになって,再帰されるようなね,そんな感じだと思う・・・たぶん・・・.

実行結果は当然普通だ.
$ gst factorial.st
3628800
$


Smalltalkって言語と環境ってこともあるせいか,処理系によって方言がある模様.ってかそもそも,Smalltalkのシステムブラウザから追加するもんだから,GNU Smalltalkは独自の記述に近いのね・・・.悩ましいなぁ.それに,GNU Smalltalkで解説してるとこってほとんどないんだね.やっぱり,Squeakが多いみたい.まだまだわからないことだらけだなぁ・・・.

FizzBuzzもやってみたけど,ひどいな・・・.
| fizzbuzz |
fizzbuzz := [
(1 to: 100) do: [ :n |
n \\ 3 = 0 ifTrue: [
n \\ 5 = 0 ifTrue: [
'FizzBuzz' printNl.
] ifFalse: [
'Fizz' printNl.
].
] ifFalse: [
n \\ 5 = 0 ifTrue: [
'Buzz' printNl.
] ifFalse: [
n printNl.
].
].
].
].

fizzbuzz value.


無理矢理4つに分岐させるようなコードを書いたかんじ.Smalltalkerはこれをどうやって書くんだろう.まだまだ理解不足だね.

うむぅ.不出来すぎるんで,Squeak本読んで出直してこよう・・・.Smalltalkの考え方についていけてない.必要なのは,オブジェクト脳っていうよりSmalltalk脳?

参考文献:
GNU Smalltalk User's Guide
Smalltalkイディオム

2008年1月16日水曜日

MacBook AirとTime Capsule.

詳細は,Appleで見てね.ニュースサイトとかでも取り上げられてるし.さて,林檎生活100としては,MacBook AirTime Capsuleが買いかどうかを考えてみる.

まずは,MacBook Airだね.僕としては,MacBook miniってかんじのものを期待してたんだけど,これはMacBook Pro slimってかんじで値段もそこそこするから手を出しづらいね.まあ,デザインは秀逸ですばらしいから欲しいけどねwこのデザインからすると,iMacと並べたとしてもMac Proと並べたとしても似合うから,MacBook Airの立ち位置はいいよね.Mac mini,MacBookユーザを対象としてる製品ではないはずだし.あとは実物を見てみないとね.デザインの観点からはこんなところで,スペックの観点からが重要かな.スペックからすると買いじゃないというのが正直なところ.CPUはとりあえずいいんだけど,メモリが2GBでオンボードだから長い期間使えない気がするんだよね.あと,やっぱりSSDがいいよね.でも,SSDが搭載されてる方はかなり高いんだよな.SSDが高いから仕方ないってのもあるし,SSDの64GB搭載でこの値段はむしろ安いんだろうけどね.これからSSDは間違いなく値下がりするんだから,2世代目のMacBook Airを買うべきかなぁと.マイナーアップデートでSSD標準搭載になって,4GBメモリ搭載モデルがラインアップされるんじゃないかなぁと思うのさ.20万円台で.(希望的観測だけどね・・・.)だから,僕としては待ってて,マイナーアップデートされた瞬間に購入が正解だと思う.

次は,Time Capsule.AirMac ExtremeにUSB接続HDDを外付けするか,HDDを内蔵しているTime Capsuleにするかの比較次第だろうけど,値段的に500GBならとんとん,1TBならTime Capsuleのがちょっと高いってかんじかな.ただ,ひとつにまとまってくれた方がデザイン的にいいなぁって思う.相性問題もないし.容量足りなくなってHDDを交換ってことができないのはあるけどね.MacBookでIEEE802.11nを使えるのに,Wi-FiはAirMac Expressで対応してないって僕としては買いだね.この前,バックアップ用に外付けHDDを買ってしまったけどね・・・.

ぐだぐだ書いてしまったな.あと,MacBook Airの外付け光学ドライブってMacBookで使えないのかなぁ.DVD-R DLを書けるドライブがほしいんだよねぇ.

2007年12月15日土曜日

オブジェクト指向プログラミング機能の空間を限定したい.

変なタイトルになってしまった.思ったことを記述していることもあり間違ってること書いてるかもしれないので,適宜つっこみをいれてほしいw

さて,オブジェクト指向プログラミング機能の実装は,大きく分けてメッセージベースとクラスベース,プロトタイプベースがあると思う.最近特に興味があるのは,プロトタイプベース.なんでかというと,クラスベースが,オブジェクト指向プログラミング機能をプログラムの広い空間に保持しているのに対し,プロトタイプベースは,比較的狭い空間に保持しているから.(あいまいな表現で,僕の主観的イメージ.)

もうすこし具体的な話.クラスベースで,クラスはさまざまなメソッドからnewできるようなところに存在しなければならない.スコープによる限定があるじゃないかって話もあるとは思うんだけどね.プロトタイプベースでは,オブジェクトをメソッドでnewする形になるので,オブジェクトがそこに受け渡されなければならない.オブジェクトにもスコープがあるじゃないかって話もあるだろうね.

うん,なんというか,newの被演算子であるひな形にあたるもの(クラスベースならクラス.プロトタイプベースならオブジェクト(とプロトタイプ).)が,イメージとして,メソッドの外にあるのがクラスベースで,内にあるのがプロトタイプベースだなぁと.

で,何を考えているのかというと,宣言型言語へオブジェクト指向プログラミング機能を入れるとしたら,プロトタイプベースが向いているんじゃないかなってこと.たとえば,Prologへのオブジェクト指向の導入とかね.

オブジェクト指向設計からオブジェクト指向プログラミングをするとしたら,クラスベースの考え方を実現できる必要がある.プロトタイプベースではある程度実現できる.プロトタイプベースなら宣言型言語へ導入しやすいのではないか.ということ.

ただ,今日ECMAScriptの仕様書であるECMA-262 第3版を読んでて気づいたんだけど,プロトタイプチェーンという存在(プロトタイプベースの要なんだけどねwww)が裏側では広い空間を使っちゃってるなぁと.なんでいままで気づかなかったのかといわれると馬鹿だからってしかいえないけどw

それで,プロトタイプベースよりもさらに空間を限定できる.つまり,狭い空間だけで完結するオブジェクト指向言語はないものかということになった.調べたけど,見つからなかったwんー,そもそもこれ以上狭い空間だけで完結するオブジェクト指向プログラミング機能は実装できるのかどうかがあやしい.これから考えていこうと思う.

今回は,かなりグダグダだな〜.

2007年11月17日土曜日

Javaメモ.アクセス制御.#1

アクセス修飾子によるアクセス制御の詳細をよく忘れる.たまにしかJavaを書かないせいかな.

●アクセス制御
・private:クラス
・(なし):パッケージ
・protected:パッケージ&サブクラス
・public:全体

2007年11月16日金曜日

CentOS 5でつくるPHP開発サーバ.Zend Core編#6

林檎生活100: CentOS 5でつくるPHP開発サーバ.Zend Core編#5の続き.昨日,友だちと話してて気付いたんだけど,mbstringの設定やってないねwということで,日本語を扱えるように,mbstringの設定をしよう.

今回は,UTF-8を使うように設定する.その手順は次のとおり.

1.ZendCoreにアクセスする.

2.Configuration>Extensionsとクリックする.

3.mbstringの項目を次のように設定する.

mbstring.detect_order = auto
mbstring.encoding_translation = Off
mbstring.func_overload = No overload
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.internal_encoding = UTF-8
mbstring.language = Japanese
mbstring.strict_detection =
mbstring.substitute_character =


4.Save Settingsをクリックして設定を反映させ,Restart Serverでサーバを再起動する.

これでOK.Control CenterのPHPinfoなどでチェックしてみると設定が反映されていると思う.次回こそ,MySQLだぁ.

2007年11月15日木曜日

Wireless Mighty Mouseの交換.

Wireless Mighty Mouseの右クリックが効かなくて,Appleのサポートセンターに電話してみた.

混んでるせいか,電話でかなり待たされたんだけど,結局新しいやつを送ってもらって,いま使ってるやつと交換って話になった.親切な対応だったし,新しいやつが次の日に届いたってことw早すぎだろw宅配便の人にいま使ってるのを渡して,新しいのをもらうかんじだった.

いま使ってみてるかんじだと,とくに問題なく右クリックは動いてる.交換品もAppleの対応もいいかんじ♪

2007年11月8日木曜日

CentOS 5でつくるPHP開発サーバ.Zend Core編#5

林檎生活100: CentOS 5でつくるPHP開発サーバ.Zend Core編#4の続き.今回は,Zend CoreへのPEARPECLのインストール方法をやってこう.

PHPのわかりづらいところのひとつが,PEARとPECLだと思うのは僕だけかな.PHPで書かれたライブラリを提供しているサービスがPEARで,Cで書かれたライブラリを提供しているサービスがPECL.とくに,PECLは拡張モジュールという位置づけだね.そして,それらをインストールするコマンドがpearとpeclなわけだ.手動で配置してもインストールはできるけど,コマンドを使ったほうが便利♪依存関係とか解決してくれるしね♪

ちなみに,PHPマニュアルでは,PECLのライブラリをインストールすることで使えるようになる関数も説明してたりするから,その量が膨大になってる.インストールする方法によって,PHPに最初からインストールされているライブラリが異なるのも,PHPならではかなw

さて,実際にやってみよう.今回は,PEARのHTML_QuickFormとPECLのpecl_httpをインストールしてみる.その手順は次のとおり.

1.PEARのアップデートを実行する.これで,peclコマンドのインストールも行われる.
# /usr/local/Zend/Core/bin/pear upgrade-all


2.PEARのHTML_QuickFormをインストールする.
# /usr/local/Zend/Core/bin/pear install HTML_QuickForm


3.PECLのpecl_httpをインストールする.
3-1.必要なツールやライブラリをインストールする.そうしないと,pecl_httpのインストール時にエラーが出る.
# yum -y install autoconf
# yum -y install gcc
# yum -y install zlib-devel
# yum -y install curl-devel


3-2.
# /usr/local/Zend/Core/bin/pecl install pecl_http
.
.
.
1. whether to enable cURL HTTP requests; specify libcurl directory : yes

1-1, 'all', 'abort', or Enter to continue: [Enter]
1. whether to enable support for gzencoded/deflated message bodies; specify zlib directory : yes

1-1, 'all', 'abort', or Enter to continue: [Enter]
1. whether to enable response content type guessing; specify libmagic directory : no

1-1, 'all', 'abort', or Enter to continue: [Enter]
1. whether to depend on extensions which have been built shared : yes

1-1, 'all', 'abort', or Enter to continue: [Enter]
.
.
.
You should add "extension=http.so" to php.ini
(php.iniにextension=http.soを追加してね.)
#


3-3.php.iniの末尾にextension=http.soを追加する.
# nano /usr/local/Zend/Core/etc/php.ini
.
.
.
;extension=xsl.so
;extension=zip.so
extension=http.so(この行を追加する.)
#


3-4.Zend Core管理画面からApacheを再起動する.

3-5.Zend Core管理画面>Configuration>Extensions>External Extensionsに追加されていることを確認する.そこで設定ができるのが便利♪

こんなとこだね.PEARのインストールは簡単なんだけど,PECLはコンパイルやphp.iniへの記述が含まれるのでちょっと面倒だね.次回は,MySQLをやりますか〜.