Squeak まとめサイトを作ろうと考えてみる
どうしても作ってみたかったまとめサイト.
まずはアドレスを公開.
http://tomoyo.mine.nu/~apple/squeak/
Mac関連とプログラミング言語に関するメモ.
どうしても作ってみたかったまとめサイト.
先日のMLにこんなのがありました.
[squeak-dev] Squeak Carbon OS-X VM 3.8.19beta2U ships.
http://lists.squeakfoundation.org/pipermail/squeak-dev/2008-November/132403.html
新しいVMが出たんだなって思ったら,4GBのメモリを搭載した場合の問題を解消したVMということ.
かなり英語には自信がないので,ググっていたら,
ぐる式のページにも書いてありました(さすがです).
Squeak VM 3.8.19b2 - ぐる式
ちょうど研究室の,MacProがそれに当たるので,使わないと.
僕が個人的にもっているMacはCore Duoなのでメモリが4GBなんて話ありませんね.
while や for がスコープを作らないのに対し、loop や each などのイテレータはスコープを作ります
(1..5).each do |i|
var = true
end
p var
$ ruby test.rb
test.rb:4: undefined local variable or method `var' for main:Object (NameError)
(1 to: 5) do:[:v |
| var |
var = true.].
var " popupが表示され,var appears to be undefined at this point. Proceed anyway"
最近,忙しくMLを読んでいなかったのですが,梅澤さんによるSeasideの解説の次回はDB接続らしい.
Seasideのアプリを作るのは凄く楽しいのだが,やはりDBとの接続はちょっと大変.
MLにはそれに関連したイメージがお試しで配布がされているが,それが凄いと思った.
[Squeak-ja: 4068] 「SeasideへGO!!」の第三回
DBと言っても,データを保存する方法はさまざまな方法があるので,それをいろいろ試せるようになっている.
また日本語を扱うためのさまざまなパッケージが同梱されている.
(それらはSqueakSourceJでダウンロードできるようだ.すごいな・・・)
一番の驚きはOmniBase.
Squeak3.9でもきちんと動作するんですね.
大元のOmniBaseは全く更新されていないのに・・・(元がしっかりしているのかな,それかOmniBaseJがきちんと改善しているのかな).
C言語のMath.hに定義されている円周率は
#define M_PI 3.14159265358979323846264338327950288
Float pi ==> 3.141592653589793
Float pi ==> 3.14159
Double pi ==>3.1415926535898d
以前書いた順序付き辞書をちょっとだけ改良(removeを実装しただけw).
う〜ん.
まだ僕のレベルだとエレガントには書けないな・・・.
Collection subclass: #OrderedDictionary
instanceVariableNames: 'keys content'
classVariableNames: ''
poolDictionaries: ''
category: 'Ringo-Collection'
OrderedDictionary methodsFor: 'enumerating'
do: aBlock
keys do:[:v | aBlock value:v].
OrderedDictionary methodsFor: 'initialize-release'
initialize
keys := OrderedCollection new.
content := Dictionary new.
OrderedDictionary methodsFor: 'accessing'
at: key
^ content at: key! !
OrderedDictionary methodsFor: 'accessing'
at: key put: value
content at: key put: value.
(keys includes:key) ifFalse:[
keys add: key.
].
^ value.
OrderedDictionary methodsFor: 'accessing'
keys
^ keys
OrderedDictionary methodsFor: 'accessing'
values
| out |
out := WriteStream on: (Array new: keys size).
keys do:[:v |
out nextPut: (content at:v)].
^ out contents
OrderedDictionary methodsFor: 'accessing'
removeKey: key
keys remove: key.
content removeKey: key.
x := OrderedDictionary new.
x
x at:#one put:1.
x at:#two put:2.
x values
x do:[:v | Transcript cr;show:v].
==>one
==>two
x removeKey:#one.
x removeKey:#two.
x ==> an OrderedDictionary()
sumimさんの日記により
Squeak は、Squeak Etoys なのか Squeak Smalltalk なのか区別しましょう
Etoys本がでるのはいいのですが,それがSqueakの全てと誤解されることが多く悲しい限りです.
というか最近人と話していると
Smalltalk > Etoys > Squeak Smalltalk
って感じの知名度のようです.
これは問題ありかなっと思ってしまいます.
Smalltalk by Exampleみたいな本が日本でもでればいいのかな?
青木さんのSmalltalk本がもうじきでますが,新しいSqueak Smalltalk本もでるといいかも.
(梅澤さんのSqueak自由自在はとてもすばらしい本だと思っています)
Smalltalk by Example本を訳したサイトでも作ればいいのか.
まとめサイトを作ってみようかな.(問題は僕のSmalltalkの能力と文書力と英語力.とほほ・・・)
以前からいっていた順序付きDictionaryを一部作ってみました.
どこを継承すればいいのかわからなかったので,とりあえずObjectクラスの下で作ってみました.
なぜ順序付きSet,Dictionaryがないのか不思議です.
Set系は集合だから順序なんて必要ないということなんでしょうかね・・・.
Object subclass: #OrderedDictionary
instanceVariableNames: 'keys content'
classVariableNames: ''
poolDictionaries: ''
category: 'Ringo-Collection'
OrderedDictionary methodsFor: 'enumerating'
do: aBlock
keys do:[:v | aBlock value:v].
OrderedDictionary methodsFor: 'initialize-release'
initialize
keys := OrderedCollection new.
content := Dictionary new.
OrderedDictionary methodsFor: 'accessing'
at: key
^ content at: key! !
OrderedDictionary methodsFor: 'accessing'
at: key put: value
content at: key put: value.
(keys includes:key) ifFalse:[
keys add: key.
].
^ value.
OrderedDictionary methodsFor: 'accessing'
keys
^ keys
OrderedDictionary methodsFor: 'accessing'
values
| out |
out := WriteStream on: (Array new: keys size).
keys do:[:v |
out nextPut: (content at:v)].
^ out contents
x := OrderedDictionary new.
x
x at:#one put:1.
x at:#two put:2.
x values
x do:[:v | Transcript cr;show:v].
==>one
==>two
いつの間にかGNU SmalltalkでもSeasideが対応しているみたいです.
夏休みにでも使ってみて調子がよければ,使ってみようと思います.
GNU Smalltalk
最近Squeakについて知りたいと思っていたら,SmalltalkのVM関連の情報がちらほら出ているようです.The Weekly Squeakに紹介されているVMを試したいと思ったのですが,そもそもSqueakのVMのsourceからコンパイルする方法すらわからないことが判明.
Linuxなら簡単にコンパイルできそうですが,Mac版VMを作成するには・・・.
最新のsourceを取得して・・・
svn co http://squeakvm.org/svn/squeak/trunk squeak-svn
ちょっと休憩中.
さて,大学院生になりました.
Squeakはもちろん使い続けようと思います.
今年度からコアなところアルゴリズムなどについてSqueakを使って勉強をしたいと思います.
そこでとりあえず数学を行列計算を.
Matrixってクラスが用意されているというのがいいですね.
わかりやすい.
x := Matrix rows:2 columns:2.
x atColumn:1 put:#(1 2).
x atColumn:2 put:#(3 4).
x ==> a Matrix(1 3 2 4)
x := x + x. ==> a Matrix(2 6 4 8)
Python,Rubyでは次のことが書けるらしい.
>> 'test'*2
=> "testtest"
s:='test'.
x := WriteStream on:''.
2 timesRepeat:[x nextPutAll:s].
x contents. 'testtest'
前回書いたプール辞書についてみねこあさんとUmejavaさんがいろいろ書いてくださったので,本当にうれしい限りです.
[Smalltalk]プール - みねこあ
各クラスは通常2つのプール——Smalltalk辞書と、クラス変数が在るプール を持ち、さらに セレクタ poolDictionaries: で指定したプールを オプショナルで持つことが出来る
Smalltalk at:#Smalltalk "print it =>" a SystemDictionary(lots of globals)
クラス変数があるプールを持つ
日経Linux4月号のまつもとさんの記事でガーベッジコレクションについて書かれていました.
とても興味深かったので,Squeakについて少し調べてみようと思いました.
「Squeakの仕様を知るには?」と思い調べていたら,Squeak入門(Squeak:Open Personal Computing and Mulimedia)に書かれていました.
ちなみに英語版ならSmalltalk FreeBooksで公開されています.
FreeBooks
oe-tour-sept19.pdf
どうやら,世代別GCとマークアンドスイープのハイブリッドみたいです.
すごいですね.
いきなり難しいことをやろうとはせず,まずは自分のできる範囲から.
「1日30分Squeakを続けなさい」と自分に言ってみる.
卒論が終わっても忙しかったのでなかなかSqueak自体の勉強ができなかったのですが,ようやく念願だったTraitsを使ってみました.
TraitsはSqueakで多重継承みたいなことができるようにするための仕組み?のようです.(RubyのMix-inとは違うらしい.)
本当にまだ勉強中なので実態はわからないのですが,非常に興味深いものです.
Squeak3.9から標準装備なので,使ってみました.
まずは,多重継承?(トレイトというべきなのでしょうか)するための定義を書きます.
Smalltalkおなじみの定義を書き換えます.
これは少しとまどいました.
Trait named: #Atok
uses: {}
category: 'Study-Traits'
Atok>>change
^ '日本語変換が得意です'
Object subclass: #KanjiTalk
KanjiTalk>>henkan
^ '日本語変換は苦手かもしれません'
----
KanjiTalk subclass: #Kotoeri
uses: Atok
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Study-Traits'
KanjiTalk>>conversion
^ '日本語変換はまぁまぁです'
x := Kotoeri new.
x henkan. '日本語変換は苦手かもしれません'
x conversion. '日本語変換はまぁまぁです'
x change. '日本語変換が得意です'
Squeakって日本語のクラス名もありなんですね.
日本語EToysで日本語のmethodを送っているので,同じ感じでクラス名も日本語で作成したらきちんと動作したので驚きです.
これを使えばオブジェクト指向の勉強にもいかせるのでは?
こういうメリットを生かして,新しいプログラミング学習方法を提案するのも面白いかもしれませんね.
ちなみに試しに作ったもの
以下の内容問題あり*1
Object>>りんご
りんご (class)>>身長
^"146cm"
りんご 身長 "146cm"
Squeak3.9に正式対応した日本語環境のパッケージが公開されたようです.
僕にとっては本当にうれしいことです.
英語が読み書きできれば,本当はいいんですけどね.
最近卒業論文を書いていてSqueakの良さを再認識しています.
卒研が終わったらいろいろとSqueakについて調べようと思っています.
TraitsとかSUnitの使い方,VMについてなどなど.
それにしてもSmalltalkerの人に弟子入りしたい気分です.
あけましておめでとうございます.
最近卒論を書くので急がしくてプログラミング言語に関して全然勉強ができていません.
卒研の発表が終わり次第,勉強を再開したいと思います.
sumimさんのblogを読んでいたら・・・
Ruby vs. Squeak SmalltalkCommentsAdd Star
Squeak3.9にはTraitsというメソッド再利用の機能があるらしい.
ちょっと調べたらかなり前から提案されているものらしく,知らない自分にちょっと失望.
僕みたいな素人にはなかなか多重継承という高度なことを使うことができないが,やはり勉強しておく内容だと思った.
以前RubyのMix-inについて勉強したので,もう一度そちらを学び直そうと思う.
オブジェクト指向についての勉強の旅はまだまだつづく.
今日もSqueakについて勉強です.(やっと趣旨らしくなってきた)
Squeakのcopyについてです.
Object>>copy
^self shallowCopy postCopy
まずはshallowCopyについて勉強していました.
x := {{'a'}}.
y := x shallowCopy.
x == y. "false"
x at:1 put:'b'.
x #('b')
y #(#('a'))
x := {{'a'}}.
y := x shallowCopy.
x == y. "false"
(x at:1 )at:1 put:'b'.
x #(#('b'))
y #(#('b'))
なるほどshallowCopyはその意味通り浅いcopyみたいですね.
deepCopyがあるので,そちらを試すと完全コピーになるようです.
ただこれはお互いに参照していたら,大変なことになります.
なのでcopyはpostCopyをオーバーライドすることで振る舞いを変更してcopyをきちんと指定するみたいです.
copyは気をつけないといけませんね.(現実世界に無いことをやっているのだから,当然ですね).
きっと僕はdeepCopyを何かと使いたくなりそうな・・・.
VisualWorksを少しながめていたらdeepCopyというmethodはなかった.正しいかもしれませんね.