Upload
masashi-umezawa
View
1.249
Download
2
Embed Size (px)
Citation preview
Pyonkeeの皮をはぐiPadでSmalltalkハッキング
第69回Smalltalk勉強会合同会社ソフトウメヤ 梅澤真史
合同会社ソフトウメヤ梅澤真史
Smalltalkビアバッシュ2014
ピョンキーとは?● iPadで動くScratchクローン
○ Scratch 1.4ベース
○ JMMさんのScratch Viewerを復活させたもの
■ http://www.slideshare.net/umejava/i-padscratch○ タッチ UIに最適化
○ カメラとの連携など
● App Storeで入手可能
○ https://itunes.apple.com/jp/app/pyonki/id905012686○ 4ヶ月で10000 DL 突破!
ピョンキーはOSS● GPLまたはScratchライセンス
● githubでソースの閲覧可能
○ https://github.com/SoftUmeYa/Pyonkee● 自由にカスタマイズして好きな環境にできる
ウサギの皮をかぶったネズミ
● Squeak がいる!
● ちょっとしたハッキングで
Smalltalk環境としてピョンキーを動かしてみる
○ PyonTalk と命名
● 評判よければ単体でAppStoreに出します!?
改造のポリシー
● あまり頑張らない
○ ビアバッシュ向けに最小限の変更で対処
● 破壊的にはやらない
○ Smalltalk側もObjective-C側も、手を加えた部分は
明確に分離できるようにする
■ 将来のピョンキーのバージョンアップにも
追随できるように
Smalltalk側の改造の前に
● PyonkeeのScratch.imageはレガシーVM用(Cogでない)○ 古いVMを入手する必要あり
● Squeak 3.10.2J-all-in-one.zip ○ http://sourceforge.jp/projects/squeak-
ja/downloads/51524/Squeak3.10.2J-all-in-one.zip/○ 同梱されるSqueak-4.2.2beta1Uの VMを使う
開発用モードでの作業
● Scratch.image起動後、Shiftを押しながらFileメニューを選
ぶと、”Exit User Mode”の項目がある
○ Smalltalkでの開発モードへ
● Change Sorterを開き、 PyonTalkといった
名前で新たなチェンジセットを作って
作業すると良い
● 作業後はShift+Fileメニューから
”Save Image in User Mode”で抜けること
Hack1: 起動後いきなり開発者モードに
● IPhoneScratchProxy classの起動時フック
(prepareScratchFrameMorphBeforeOpen)に2行追加
prepareScratchFrameMorphBeforeOpen
SqueakProxy scratchMorphic: ScratchFrameMorph allInstances first.SqueakProxy scratchMorphic setupTheLanguageOnThisDevice.
SqueakProxy scratchMorphic fillScreenOff.Preferences useLargeFonts
フルスクリーンoff
フォントを大きく
Hack2: 開発ツールを楽に起動
● 右上のモード切り替えボタンを流用
○ IPhoneScratchProxy>>setViewModeIndex:の書き換え
○setViewModeIndex: viewModeNumberviewModeNumber caseOf: {
[0]->[Transcript open].[1]->[Workspace open].[2]->[Browser openBrowser].
}
0,1,2をそれぞれTranscript, Workspace, Browserの起動に割りあてる
Hack3: 黄ボタンメニューを楽に表示(1)● Escキーで黄色ボタンメニューが瞬時に開くように
○ PluggableListMorph○ TextMorphForEditorView
の書き換え
Hack3: 黄ボタンメニューを楽に表示(2)● PluggableListMorph>>specialKeyPressed:
specialKeyPressed: asciiValue | oldSelection nextSelection max howManyItemsShowing |nextSelection := oldSelection := self getCurrentSelectionIndex.max := self maximumSelection.asciiValue == 27 ifTrue: [
self yellowButtonActivity: false.].asciiValue == 31 ifTrue: [...
Esc(ASCIIコード27)で黄ボタンメニューが開くように
Hack3: 黄ボタンメニューを楽に表示(3)● TextMorphForEditorView>>keyStroke:
keyStroke: evt| view |evt keyValue == 27 ifTrue: [
^ editView yellowButtonActivity.].(editView scrollByKeyboard: evt) ifTrue: [^self]....
Esc(ASCIIコード27)で黄ボタンメニューが開くように
Hack4:一発でdo it, print it, inspect it ● TextMorphForEditorView>>keyStroke:
keyStroke: evt| view |evt keyValue == 27 ifTrue: [
^ editView yellowButtonActivity.].evt keyValue == 24 ifTrue: [^ editView doIt].evt keyValue == 25 ifTrue: [^ editView printIt].evt keyValue == 26 ifTrue: [^ editView inspectIt]....
普段使わない制御文字(24,25,26)をdo it, print it, inspect itに
Hack5:ハロを2本指クリックで(1)● PyonkeeのMorphicEventでは2本指クリックでreserverd=3
のフラグが立つ
○ 条件を黄ボタンメニューから青ボタン(ハロ)メニューへ移す
● MorphicEvent>>rightButtonPressed:rightButtonPressed
^ (buttons anyMask: 3) or: [self redButtonPressed & self controlKeyPressed]
”or: [self reserved = 3]”or: [IPhonePresentationSpaceKeyState isCommandPressed]
reserved = 3の条件をコメントアウト
Hack5:ハロを2本指クリックで(2)● MorphicEvent>>blueButtonPressed:
blueButtonPressed^ (buttons anyMask: 1) or: [self reserved = 3]
ST側は以上!
reserved = 3の条件を追加
Objective-C側の準備
● Xcode 6.1があれば良い
○ https://developer.apple.com/jp/xcode/downloads/● Obj-Cソースの直接書き換えは避け
PyonTalkカテゴリを作って対応
○ SUYScratchPresentationSpace+PyonTalk.h○ SUYScratchPresentationSpace+PyonTalk.m
の追加
● XIB部分は面倒なので直接書き換え
モード切り替えボタン対応
● SUYScratchPresentationSpace+PyonTalk.m○ モード切り替えボタン選択時のコールバックを書き換え
■ そのままでは表示が消えてしまうため
- (void)radioButtonSetController:(GSRadioButtonSetController *)controller didSelectButtonAtIndex:(NSUInteger)selectedIndex{ //[self changedViewModeIndex:selectedIndex]; [self setViewModeIndex:selectedIndex];}
表示が消えないようコメントアウトに
両サイドボタンを開発向けに
● ScratchIPhonePresentationSpaceiPad.xib○ 両サイドのボタンに Esc, Backspace, Enterなど配置
● SUYScratchPresentationSpace+PyonTalk.m○ 各キー押下時のメソッドを追加していく
- (IBAction) keyEscape: (id) sender { [self pushCharacter: [NSString stringWithFormat:@"%c", 27]];}- (IBAction) keyBackspace: (id) sender { [self pushCharacter: [NSString stringWithFormat:@"%c", 8]];}...
ESC(ASCIIコード27)をSmalltalk側に送る
Do it系ツールバーの追加
● ScratchIPhonePresentationSpaceiPad.xib○ 左上が空いているので”do it”, “print it”, “inspect it”ボタンを配置
● SUYScratchPresentationSpace+PyonTalk.m○ 各キー用のメソッドを追加 (前ページとキーが違うだけ)
- (IBAction) doIt: (id) sender { [self pushCharacter: [NSString stringWithFormat:@"%c", 24]];}- (IBAction) printIt: (id) sender { [self pushCharacter: [NSString stringWithFormat:@"%c", 25]];}...
制御文字24をSmalltalk側に送る
縦向き対応は?● Auto Layoutでちまちま指定することでなんとかなる
○ ScratchIPhonePresentationSpaceiPad.xib○ 省略
○ 次期Pyonkeeが最初から縦向き対応になるため
ObjC側も以
上!
変更分のソースなど
● とりあえずGistに置いています
○ Smalltalk■ https://gist.github.com/mumez/8390779c2913bfec79ff
○ Objective-C■ https://gist.github.com/mumez/98a55fba675e417425c8
● 次期Pyonkeeのソース公開時のタイミングで
PyonTalkプロジェクトとして独立させたい