言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Squeak プロジェクト・コードリーディング

微妙に現れる不具合やパフォーマンスの低下を何とかしようと、ここの所SuperSwiki の日本語化問題に取り組んでいる。これは長くて苦しい茨の道である。しかしなんとなく道筋が分かってきたので書いておく。プロジェクトの保存は、Project>>storeOnServerShowProgressOn:forgetURL: から処理が始まる。しかしあわててここからデバッグしたりベンチマークを取ろうとするとドツボにはまる。プロジェクト保存時にモーダルダイアログを表示するため、相当トリッキーな処理をしているため、全くデバッグを寄せ付けない。そういうややこしい所を抜かして本質的なコードから入らなくてはならない。様々な準備を含め、デバッグに参考になるコードは以下のようになる。

"プロジェクトの準備、保存サーバやプロジェクト名を設定しておく"
Project current storeNewPrimaryURL: 'http://languagegame.no-ip.com/super/SuperSwikiProj/'.
projectName _ '実験です'.
Project current renameTo: projectName.
World setProperty: #ProjectDetails toValue: (Dictionary new add: 'projectname' -> projectName; yourself).

CurrentProjectRefactoring xxxCurrent flapsSuppressed: true.			"フラップが邪魔"
Project current storeOnServerWithProgressInfo.			"実際の保存処理"
CurrentProjectRefactoring xxxCurrent flapsSuppressed: false.			"フラップを戻す"

実際にはプロジェクト保存のメインルーチンとでも言える箇所は Project >> storeOnServerInnards になる。ここで、以下のような順序で保存/アップロード処理が行われる。

  1. バージョン番号の決定
  2. ローカルへの保存 (Project >> exportSegmentFileName:directory:)
  3. サーバにアップロード (Project >> writeFileNamed:fromDirectory:toServer:)

なんでこんな長いメソッドを書くのだ。。。