CAKE(6) FreeBSD Games Manual CAKE(6) NAME ふりぽけ日記 - 2001年08月 SYNOPSIS cake [-vd] [garbage-in garbage-out] DESCRIPTION Cakeは駄文製造プログラムです。一般に、ゴミを入力するとゴミを出力す る、とされています。 OPTIONS なにも指定をせずに立ち上げると、標準入力(/dev/ear)から読んで標準出 力(/dev/mouth) に書こうとします。(放っておくと、ずっとそのままで入力を 待っています。)入力ファイルと出力ファイルを指定すると、それらを読み書き します。 -v オプションを指定すると、何をやっているのか細かく報告します。 -d オプションはデバッグモードです。 2001.08.01 Wed : Palm : もう数ヶ月ぶりだとおもうけど、Palmを家に忘れて来てしまったけど、そんなに 困らないなぁ。もちろん予定がデスクトップにもシンクロされているからです が。 最近のPocketPC勢対Palm勢の競争を見ていると、Zen of Palm はどこいっちゃっ たんでしょうね…。としみじみ思います。 すぐ飽きて使われなくなる機能に、そんなに血道を上げてどうするんだろうか。 中古屋にゴロゴロ転がっている真新しいPDA達を見るのはちょっと寂しい。 HotDrow : Eric Gamma作の JHotDraw(http://jhotdraw.sourceforge.net/) もともとはSmalltalk にあったHotDrawをJavaに移植(?)したもの。 (Smalltalk版はVisualWorksに付属。非商用フリー版にもついてくる。) 2001.08.02 Thu : ジェネレータ : Pythonの新しい機能にジェネレータというのがあるらしい。 イテレータと関係があるか、似ているか、もっと進んでいるかするものらしい。 …結局なんなのかサパーリ分からない。 Javaの格言 : げっちゅー。最近何故かJavaづいている。 YahooBB : なんだか採算とれず撤退、となるような気がして申し込む気になれず。 ええ、ソフトバンクは信用してません。 2001.08.03 Fri : 悪夢? : 分散コンピューティングソフト導入で牢屋行き? システム管理者の悪夢(http://www.zdnet.co.jp/news/0108/02/e_mcowen_m.html) これ、分散コンピューティングどうのこうのじゃなくて、管理者が自分の私物で もないものに勝手なことしたっていうだけなような。 2001.08.05 Sun : 今回のイテレーション : ここまでの成果物 42 90 837 MyDataBase.php 61 98 673 NullSong.php 84 167 1414 Song.php 195 575 4693 SongCabinet.php 28 64 557 SongNote.php 28 64 557 SongSize.php 43 99 984 SongView.php 22 43 437 StrUtility.php 503 1200 10152 total 58 119 1096 MyDataBaseTester.php 90 156 1685 NullSongTester.php 217 467 6105 SongCabinetTester.php 54 105 930 SongNoteTester.php 54 105 933 SongSizeTester.php 142 246 2836 SongTester.php 129 271 4670 SongViewTester.php 50 96 893 StrUtilityTester.php 794 1565 19148 total …テストクラスのほうが量があるな。まあテストデータのテキストがかなりの部 分を占めているし。 でもテストファーストのほうが断然いいことはよく分かった。思い違いやケアレ スミスをその場でほぼ潰せるというのはかなり画期的。 プラグイン : 冗談で言ってたら、本当にあるらしい。ブラウザのSqueakプラグイン。 動いてるよブラウザの中で。(syouko.gif) ビデオ : ネオゲッター対真ゲッターの1巻を視聴。感想は後日。 CCさくら最終巻を視聴。 明日はCCさくら劇場版を視聴予定。これ観ないとちゃんと終ったことにならない らしい。 2001.08.06 Mon : 終劇 : 「劇場版CCさくら・封印されたカード」を鑑賞終了。 ふう、ごちそうさま。(ほんとにそういう話だし) 作画も粒が揃っているし、とてもいい感じに楽しめました。 …。 それにしてもケロもユエも、あれ以来カードが一枚増えていたことに本当に気づ いていなかったんでしょうか。 \ あと結局、アニメ版ではさくらのお父さんは、クロウとは関係ない人になってた んですね。 てっきり映画で言及あるのかと思いきや。 2001.08.08 Wed : 二週間ほど前の話 : 咳ばかりでる変な風邪をひいて、喋れなくなったので、某部署に打合せにいくと き紙とサインペンを持って行った。 第一声(?)を 「あのね」 にしたら、ごく一部で受けた。ここ、分かる人が一人だけいたんだった。 あぅぅ : VisualWorksやSqueakで日本語を入力できるようになったので、テキストデータを PIMによくあるようなメモ帳アプリみたいに名前で管理/保管したいと思った。 多分、クラス変数に辞書でも置いておけばデータを永続化できるんじゃないかな ーというところまでは考えたんだけど、いざクラスを定義しようとしてハタと気 がついた。 ワークスペースってなんていうクラスのインスタンスなん? どうやって開くん? おーい。 Javaの格言 : 10章まで読了。 あと1章。 いい本です。Java用のOO版「プログラミング作法」みたいな感じ。 2001.08.09 Thu : 諸君、わたしはネタが好きだ : ああっ、OURSで元ネタをチェックしようと思ってたのに、昨日もまた忘れてた よ。 2001.08.10 Fri : ケロちゃんにおまかせ/劇場版 : 本編の感動が薄れぬようにと後回しにしていたのだが…、ぬぉぅ、このような カットが… まさに隠し玉。 って、違うぞ。俺は決して大きいお友達の眷族ではない。そんなものに心踊らせ たりはせぬぞぉ。 \ 2001.08.11 Sat : Workspace : のクラスは、CompesedTextView でした。「Smalltalkイディオム」に載ってまし た。テヘ。 しかし今度は、accept したタイミングで辞書にテキストを書き戻すというのをや りたんだけど、やり方がよく分からない。 ComposedTextView の model に String を入れた ValueHolder を使っているんだ けど、 accept したときのイベントの流れがいまいちよく分かっていない。 …もうちょっと調べてみよう。 2001.08.13 Mon : 夏休み : 家族で恵比寿ガーデンプレイスへ遊びに行く。 目的地は絵本カーニバル。疲れた。 その後、サンジェルマンでお茶。 流行りものらしいのでミートパイにしておいた。:D 2001.08.14 Tue : ふと発見 : ともよさまって、眉けっこう太めなのね。 夏休み2日目 : 洗足池で家族4人白鳥ボートに乗る。 隅っこのほうにはまって脱出に苦労したり。 足がだるい〜。 2001.08.15 Wed : 夏休み3日目 : 今日は家族4人、近所のホームセンターでお買いもの。 売場が広大で、子どもたちが興奮しまくり走り回りで困った。 2階が家具売場になっていて、そこでウッドカーペットとパソコンラックを購 入。 ここにくるといつも思うのが、「いつかソファセット」「いつかウォーターベッ ド」「いつか大型ワイドテレビ」。 いつも最後のひとつだけは配偶者の賛同を得ることはない。 2001.08.16 Thu : SqueakCE : 久しぶりに、MC/R430 で、 Squeak3.0final.image を m17n した奴と、もなかさ んちの SqueakCE.EXE の組み合せをためしてみたら、以前のバージョン(2.7と か2.8とか)でなぜか出ていたブラウザなどでフォントが崩れるという謎の症状が 出なくなっていた。 まともに字が読めない(一度 selection すると直るが redraw が入るとまた崩れ る)という状態で、通勤Smalltalkerを諦めていた主原因だっただけに、これは嬉 しい。 ところで、外から読み込んだ ChangeSet と現在のソースを並べて表示させて、問 題ある部分を直しながら適用していくのってどうするんだろう。 …などと、Smalltalkと真面目につき合おうと思って触り始めると、疑問がこんこ んと湧いてくる。“Smalltalk のツールは触るだけで使い方が分かるから本やマ ニュアルがいらない”なんてのはうそっぱちダー。 長年使い続けているうちに自分の手足の延長になっちゃってる人には、素人の“ 勝手の分からない”という感覚が分からなくなっちゃうんだろうな。 PDA : Squeakに PDA というクラスがあるのを発見した。( category: 'Morphic-PDA' ) * 昔からあったんだろうか? ブラウザでソースを眺めてみたけど、使い方がよく分からない。 PDA new initialize openMonthView というメッセージ式で カレンダー窓(MorphicPDA.gif) を出すところまではできたものの、これはマウスでクリックしても無反応で、見 た目から想像されるような機能はまったくない。(涙) PDA>>initialize で sample データを読み込むようになっていたりする し、ひょっとして実装がまだ終ってない、ということなのだろうか? 2001.08.17 Fri : SmalltalkのArray : Squeakでの配列の記法 { 'home'. 'work'. 'services' } VisualWorksでは #( 'home' 'work' 'services' ) という Lispっぽい書き方しか できない。しかし区切りがピリオドっちゅーのが…。 SmalltalkのArrayその2。 : リテラル表現で、ネストした配列を書くときは内側のリストは '#' を省略でき る。 #((1 2 3) (4 5 6)) ==> #(#(1 2 3) #(4 5 6)) #((foo bar baz) (foo bar baz)) ==> #(#(#foo #bar #baz) #(#foo #bar #baz)) うーん、Lispっぽ〜い。 Smalltalkと某言語 : Smalltalkって文法そのものに限ってみれば充分ミニマリストなんだよね。多バイ ト文字のシンボルが通るようなインタプリタを実装できれば、 Forth, PostScriptよりも日本語に近い文法の処理系に育て上げられるような気がする …。 感じを : 掴めて来たような気がする。 | str char | str := '日本語'. 1 to: 3 do: [ :i | char := str at: i. Transcript show: char; cr]. 文字列操作、ファイルの読み書きあたりの目星はついてきたような。 あ、でもパターンマッチがまだだった。Squeak用のRegexクラスってどこかに落ち てないかな。 2001.08.18 Sat : やっと見れた〜 : 正解はこうでした。 PDAMorph new initialize openInWorld こんな画面(PDA.gif) でした…。モバでも動くには動いたけど、天地の尺が足りずにカレンダーがグ シャグシャ。 それにしても、そもそも PDA>>initialize のコメントにあった PDA new openAsMorph openInWorld が動かないのがいけないのだ。 Smalltalkと某言語2 : 参考書にバイトコードを生成して逆アセンブルするメッセージが載っていたので それを眺めつつ。 [ | aStringA aStringB aStringC | aStringA := 'Hello '. aStringB := 'Smalltalk world.'. aStringC := aStringA add: aStringB. aStringC asWordArray. ] method symbolic 'normal CompiledBlock numArgs=0 numTemps=3 frameSize=12 literals: (''Hello '' ''Smalltalk world.'' #asWordArray ) 1 <1C> push ''Hello '' 2 <4C> store local 0; pop 3 <1D> push ''Smalltalk world.'' 4 <4D> store local 1; pop 5 <10> push local 0 6 <11> push local 1 7 <B8> send add: 8 <4E> store local 2; pop 9 <12> push local 2 10 <72> send asWordArray 11 <65> return なんだか、某言語でSmalltalk型の文法を解するパーサを書いて、(またはCで書 いてプリミティブ化して)文字列/ストリームから読み込み、某言語の実行可能 配列を生成するような仕組みにしたら、某言語が高級言語処理系に化けるような …、そんな予感。 2001.08.19 Sun : 図書館で : SICP 2nd 和訳本がやっと来た。 リクエストカードを出したのが6月だからかなり待ったよ。 2001.08.20 Mon : 編上長靴紐問題 : それにしても気になるのが、 SmalltalkのパーサーはSmalltalkで書かれている という点。 やはり最初に簡単なインタプリタくらいは別の言語で書かないと、そもそも動か ないよねえ。青本とかには書いてあるのだろうか? え? VMコード手書き? PocketScheme : WindowsCE で動く Scheme 処理系 PScheme(http://www.angrygraycat.com/scheme/pscheme.htm) をげっちゅー。 これで社内^H^H車内 SICP ができるぞ。 ってSqueakは? (和訳:身体も頭脳もひとつじゃ足りません) Smalltalkの変数 : #どこかでだれかが「きぼーん」と書いていたような :D Smalltalkの変数は、大まかにいって3種類あると思う。 1.ローカル変数 これが一番分かりやすい。Smalltalkの(文法要素としての)programの冒頭部、 '|' で囲む部分で宣言される。(Rubyのブロックの記法にも受け継がれてる) Lispでいう (let (foo bar...) ****) の (foo bar...) にあたる。ただし初期化の構文はない。 バイトコンパイルされた結果を観察するに、ローカルのスタックフレームに宣言 した変数のぶんだけ領域が確保され、VMの命令では store local n push local n (nは0オリジンのインデクス)といった形で読み書きされるような気がする。 2.大域変数 Smalltalk という名前のオブジェクトがあって、これがシステム全体の大域辞書 になっている。エントリはシステム内の全クラス。Smalltalk 自体は SystemDictionaryクラスのソルインスタンス。(今風にいうとSingleton) つまり Smalltalk-80 レベルのアーキテクチャでは、クラス名は一つのグローバ ルな名前空間しか持てないということになる。(最新のVisualWorksとかではどー なっているか知らない) Smalltalk at: #fuga put: 'hoge'. とやって単なる大域変数として使えなくもないが気持ち悪いし恐いのでやっては いけない。(否定の否定の否定) 危険な賭じゃが、勉強のために敢えてやってみよう。(Cyborg G-chan風に) Smalltalk at: #hogehogehoge put: 1. "値のセット" Smalltalk at: #hogehogehoge "値の取り出し" => 1 hogehogehoge "直で叩いてみる" => 1 やはり、Smalltalk辞書に存在するエントリは、裸のシンボルをそのまま評価して も名前解決されるようだ。クラス名を書くとクラスの実体が返ってくるのはこの 辞書を検索していることが分かる。 Smalltalk辞書そのものはクラスではないが、上で「Smalltalk という名前のオブ ジェクト」と言ったその名前は、クラスと同じ名前空間内にある。 Smalltalk辞 書のエントリ #Smalltalk が自分自身を指しているからだ。 分かりやすく言うとこれがヘビの尻尾なんです。(<余計分かりにくいです。) ちなみに、 Smalltalk := nil. というハットトリック(ただし自殺点)も存在するらしい。:D 3.クラス・オブジェクトに関る変数 クラス変数、インスタンス変数、クラスプール変数(詳細不明)など。 Smalltalkでは「メンバ」はすべて protected で、「アクセサ」は慣習的に get がメンバ名と同じ、 set はメンバ名 + ':' となる。 aPerson name. => インスタンス変数 name の値を返す aPerson name: 'new name'. => インスタンス変数 name に文字列 'new name' を設定する あとずっと誤解していたのが、メタクラスというものは Integer のメタクラス、 String のメタクラス…というようにクラスの数だけ存在する、いわばクラスの 幽波紋スタンド のようなものらしい。(<どこが「いわば」じゃ) 今日みつけたCOOLなコード : Squeakより一部抜粋してお送りします。 | answer writer iter | answer := String streamContents: [ :strm | writer := [ :msg :doer | ms := [iter timesRepeat: doer] timeToRun. strm nextPutAll: msg,((ms * 1000 / iter) roundTo: 0.01) printString,' usec'; cr. ]. : iter := 1000000. writer value: 'empty loop ' value: [self]. writer value: 'modulo ' value: [12345678 \ 256]. writer value: 'bitAnd: ' value: [12345678 bitAnd: 255]. : ]. StringHolder new contents: answer; openLable: 'send/receive stats'. * 抜粋の仕方が分かりにくかったのでちょっと修正。[Tue Aug 21 20:14:09 2001] ブロックの実行にかかった時間を計測し表示するというメトリクス用のメソッ ド。こういう「手続きを渡して結果を報告させる」という書き方は Lisp方面の由 来だろうか。CやBASICばかりかじっていても到底でてこない発想だと思ったり。 全貌は、 Morphic-Remote>>CanvasEncoder class>>timeSomeThings をどうぞ。 ちなみに、 ','(カンマ)はSequenceableCollectionの連結メソッド(二項 メッセージ)だったりする。 2001.08.21 Tue : Binary Message is not a Operator. : Squeakで定義されている二項メッセージの一覧。 & * *= + += , - -= -> / // /= < << <= = == > >= >> @ \\ \\\ | ~= ~~ これを求めるためのプログラム。青木淳さんの Smalltalk Ideoms -- chapter2(http://www.sra.co.jp/people/aoki/SmalltalkIdioms/chapter2/Chapter2.htm#SmalltalkProgram) よりSqueakで動くようにちょっと修正。 | aCollection aStream | aCollection := Set new. Smalltalk allBehaviorsDo: [:each | aCollection addAll: each selectors]. aCollection := aCollection select: [:each | each numArgs = 1 and: [each isKeyword not]]. aCollection := aCollection asSortedCollection asArray. aStream := WriteStream on: String new. aCollection do: [:each | aStream nextPutAll: each asString; cr]. StringHolder new contents: aStream contents; openLabel: 'Binary Messages'. ^aCollection 昨日の string - stream - writer パターン(勝手に命名)に書き換えてみるのも 面白いかも。 soucesとchanges : Squeakの処理系には.soucesファイルと.changesファイルが存在する。 * VisualWorksでは.souと.cha どちらも、システム内のブラウザから参照するソースコードを、チャン ク(fileIn)形式でため込んでいる。 .soucesファイルはメジャーバージョンごとにリリースされるようだ。 SqueakV3.souces .changesファイルは、イメージファイルと対になっている。 Squeak3.0final.images / Squeak3.0final.changes 簡単に言うと、soucesファイルが幹で、changesファイルはブランチにあたる。 imageをsave as...で新しい名前で保存すると、世界が分岐する。 CVSなどと違うのは、changesが差分ではなく各世代をまるまる追記していく形を とっていること。イメージ中のバイトコードは、最新の当該ソース部分へのポイ ンタと関連づけて管理されているらしい。(どのレベルでかは不明) あと、ソースの変更だけでなく、Do itの履歴もChangesに記録される。 ChangeSet : もうひとつ似たものにChangeSetがある。 これは、今のところ僕はブランチのスナップショットと捉えている。ただのス ナップショットと違うのは、あるプロジェクトと関係する変更だけが抽出されて いるという点だ。 プロジェクトというのは見た感じWindowManagerのVirtualDeskTopの様に見える。 Smalltalkでのプログラミングは大小のウィンドウがたくさん散らかってしまいが ちなので、やることごとに作業場所を作って整理しておくのは大切だ。 で、その作業場所がプロジェクトで、中で行った変更トランザクションのサマリ が ChangeSetというわけだ。 なにかプログラムを作成したり、システムの拡張を行ったとき、プロジェクトの ChangeSetをファイルに落とせば、そのままパッチとして使うことができると思 う。 ChangeSetの閲覧 : 外部からもらってきたChangeSetファイルを、システムに適応せずに中を覗いて見 る方法。 以前 どうやるんだ?(d200108b.html#16-1) と思っていたやりかたが分かった。 open... => file list でファイルリストを開き、見たいChangeSetファイルを選 択する。 右クリックメニューから browse changes を選択。 でオッケー。あとは、調べたいメソッドを選択して右クリックから compare to current とか、select conflicts with *** とか、いろいろ。(まだ詳細はよく わからん) 2001.08.22 Wed : 最近 : すっかり "Squeakヒッチハイカーズガイド"と化しているな。 * 元ネタまだ一度も読んだことありませんごめんなさい。 Squeak VM C CodeGenerator : Smalltalk で書かれた Squeak VM のコードを C に変換するメッセージ式 Interpreter translate: 'interp.c' doInlining: true. ちなみに、変換もとのクラスは Interpreter と ObjectMemory。 Cのコードを生 成するクラスは CCodeGenerator。 それらのカテゴリは "VMConstruction-Translation to C"。 : : senders とか implementers とかで、どこから呼ばれているのか、なにを呼んで いるのか、ポンポン開いて参照できる。 ブラウザのすごさが分かって来た…。 って、VC とか Del とか、世間一般の IDE を知らないから比較できないんだけ ど。 デスクトップメニューの正体 : クラスは TheWorldMenu 。第一階層の生成式は TheWorldMenu>>buildWorldMenu 中身を見ると大体構造が分かる。 #('メニュー項目の文字列' (レシーバ #メッセージセレクタ)) 選択すると、レシーバにメッセージを送るというシンプルでカコイイ仕組み。 2001.08.23 Thu : うーん? : Smalltalk/Squeakスレ、立てたの誰だろう? そういえば「教えろやゴルァ」という言い回しで連想される人が約一名…。 2001.08.24 Fri : ProcessorScheduler : VM内のスレッドを管理するクラス。 唯一のインスタンスが Proccessor というグローバルな名前を持つ。 #これもなんだけど、実は最近のネタのほとんどがSMLからいただきもの。 Linux Japan : ナノカーネル萌え〜 マウス入力にウエイト : InputSensor>>waitButton に、50ミリセカンドのウェイトが入っている。 ザウ、モバなど非力なペンベースマシンでSqueakしている人は外すといいらし い。 [self anyButtonPressed] whileFalse: - [(Delay forMilliseconds: 50) wait]. + ["(Delay forMilliseconds: 50) wait"]. ^self cursorPoint ここではまるっきり消してしまったが、ビジーループになるっぽい気がする。 50 を 5 とかに減らしてみたほうがいいのかも? これは [SML:4286] より。 Squeakのためのフォントコンバータ : BDFFontReader class>>convertFilesNamed:toFamilyNamed:inDirectoryNamed: "This utility converts X11 BDF font files to Squeak .sf2 StrikeFont files." だそうで。 TTFontReader>>readFrom: aStream -> TTFontDescription TTFontDescription>>asStrikeFontScale: scale -> FormSetFonts "Generate a StrikeFont (actually a FormSetFont) for this TTF font at a given scale." 手順をもうちょっと調べてみよう。 2001.08.26 Sun : アラン=ケイ曰く : 「オブジェクトとは再帰的に組み合わせることのできる小さなコンピュータであ る」 だそうな。 2001.08.27 Mon : たとえば… : VisualWorksにできてSqueakにできないことの例:ブロックの再帰 | aBlock | aBlock := [:i | i < 1 ifTrue: [ 0 ] ifFalse: [ i + (aBlock value: i - 1) ]]. aBlock value: 10. ==> 55 ところで、再帰するためにわざわざ aBlock と名前をつけているが、 Y-combinatorみたいにしてブロックの名前を消すことはできるのだろうか? 2001.08.29 Wed : 続ブロック話 : [SML:2602](http://www.sra.co.jp/smalltalk/SML/2001-2827/mails/2601-2700/2602.txt) 参照。 もともとSmalltalk-80の仕様では[](ブロック)はBlockContextというクラス で、ブロック内のテンポラリ変数は局所化されておらず、外側のコンテキストか ら丸見えになってしまっていた。もちろん再帰不能。 市場環境で進化していったVisualWorksではそれがBlockClosureというものに置き 換えられ、ブロックがLisp系でいうところの真のクロージャとして使えるように なったそうな。 Smalltalk-80をベースに再スタートをきったSqueakは、まだそこまでたどり着い ていないということらしい。 SUnit : Squeak付属のテストユニット SUnit をいじりはじめる。 JUnitなどと同じはずだ がブラウザ越しに眺めるとちょっと勝手が違う。 2001.08.30 Thu : ParagraphEditor : MVCにおいてWorkSpaceなどのテキスト入力を司っているのはParagraphEditor。 dispatchOnCharacter: char with: typeAheadStream "Carry out the action associated with this character, if any. Type-ahead is passed so some routines can flush or use it." ここでコントロールキーなどの特殊機能を定義しているようだ。 キーバインドの変更や、例えばSKKのような独自IMEを実装するなら、このへんを 中心にオーバーライドする必要がある。 (詳細まで見ていないので曖昧な言い方になってるが ^^;) SEE ALSO Top(1), PocketBSD(1), シュミプロ(1), ぽめれちょう掲示板(3), きまたま日記(6), 過去日記インデックス(1) AUTHOR Cake(SHIMADA Keiki) BUGS IE 4.0 以降や Netscape Navigator 6 以降などよりも、単純な VT 端末やライン プリンタからの出力のほうが見やすいかも知れません。 この日記に書かれた内容が客観的に正しいという保証はありません。また、内容 が予告なく変更されることもあります。 Sorry, This page is English free. nroff nikki system 0.01 September 1, 2001 13