這裡是Jimmy的實驗室用來發表Jimmy的Scratch程式作品,還有LEGO WEDO & NXT機器人設計 & Android, (本部落格引用圖文為教育教學目的合理使用) 想與我(Jimmy的爸爸 )聯絡 jimmyscratchlab@gmail.com
2013年2月18日 星期一
Smalltalk是個好東西,可惜它不說中文
回想當初放棄的理由之一,應該是Smalltalk or Pharo這些洋妞打從DNA裡不支持Unicode,凡是寫入程式的中文字串或中文註解,編譯後一律成亂碼, 想要叫它們秀幾個漢字,總要用上間接迂迴的手段,曠日費時,雖然生命應該浪費在美好的事物上(我指的是Smalltalk的物件導向觀念及開發環境),但是說不了中文,有文化上的代溝,在漢字流行的地區終究不能天長地久
不過,或許情況有變,改天回頭研究看看
2012年3月3日 星期六
Smalltalk沒有Switch語法
Smalltalk沒有Switch語法?!
這會造成困擾嗎?
其實Switch語法蠻耗CPU時間,我們可以下列方法代替
1.使用多個IF-ELSE敘述
2.聯合多個selector(其實是第一種方法的變形)
3.利用陣列索引及多型
未完待續.....
2012年2月23日 星期四
如何改裝MIT Scratch-新增程式積木
當玩過一陣子Scratch後,有寫過其他程式語言經驗的人,會覺得Scratch這個小玩具有點綁手綁腳,看到官網論壇發表的一堆改裝版(Scratch Mod),一定有衝動想擴充程式積木或其他功能,但是看到陌生的Smalltalk語法後卻又不知從何著手,Jimmy's papa在這裡教大家改裝Scratch也順便幫自己備忘
這是Jimmy's papa打算新增的程式積木,功能是讓程式等待十秒
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
首先打開SystemBrowser,依下列順序點選各項
>NScratch-Objects>ScriptableScratchMorph>block specs>blockSpecks
![]() |
| 寄件者 scratchlab01 |
程式積木規格說明格式如下
<block spec string> <block type> <selector> [optional initial argument values]
以下是各細項說明
block spec string : 程式積木規格描述字串
block type : 程式積木型態,如K代表鍵盤事件帽, c代表C型包夾命令等等...
selector : 程式積木所對應的選擇子/函數
optional initial argument values:參數預設值
我們可以到下列的程式碼找到('wait %n secs' t wait:elapsed:from: 1)這一行,複製並且插入下一行
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
將分類切換一下,可發現屬於Control分類的黃色程式積木多了一個
![]() |
| 寄件者 scratchlab01 |
底下貼出blockSpecs程式碼供大家參考,並附上程式積木型態(block type)的中文說明,試著改改看,可以看到積木外觀型態的改變
blockSpecs
"Answer a collection of block specifications for the blocks that are common to all objects. are interspersed with category names (Strings). A block is an Array of the form: (<block spec string> <block type> <selector> [optional initial argument values]).
Explanation of flags:
- no flags 無
b boolean reporter 布林值回報
c c-shaped block containing a sequence of commands (always special form) C形包夾命令
r reporter 回報
s special form command with its own evaluation rule 特殊格式命令
t timed command, like wait or glide 定時命令
E message event hat 訊息事件帽
K key event hat 鍵盤事件帽
M mouse-click event hat 滑鼠點擊事件帽
S start event hat 起始事件帽
W when <condition> hat (obsolete)"
| blocks |
blocks := #(
'control'
('when %m clicked' S -)
('when %k key pressed' K -)
('when %m clicked' M -)
-
('wait %n secs' t wait:elapsed:from: 1)
-
('forever' c doForever)
('repeat %n' c doRepeat 10)
-
('broadcast %e' - broadcast:)
('broadcast %e and wait' s doBroadcastAndWait)
('when I receive %e' E -)
-
('forever if %b' c doForeverIf)
('if %b' c doIf)
('if %b' c doIfElse)
('wait until %b' s doWaitUntil)
('repeat until %b' c doUntil)
-
('stop script' s doReturn)
('stop all' - stopAll)
'operators'
('%n + %n' r + - -)
('%n - %n' r - - -)
('%n * %n' r * - -)
('%n / %n' r / - -)
-
('pick random %n to %n' r randomFrom:to: 1 10)
-
('%s < %s' b < '' '')
('%s = %s' b = '' '')
('%s > %s' b > '' '')
-
('%b and %b' b &)
('%b or %b' b |)
('not %b' b not)
-
('join %s %s' r concatenate:with: 'hello ' 'world')
('letter %n of %s' r letter:of: 1 'world')
('length of %s' r stringLength: 'world')
-
('%n mod %n' r \\ - -)
('round %n' r rounded -)
-
('%f of %n' r computeFunction:of: 'sqrt' 10)
'sound'
('play sound %S' - playSound:)
('play sound %S until done' s doPlaySoundAndWait)
('stop all sounds' - stopAllSounds)
-
('play drum %D for %n beats' t drum:duration:elapsed:from: 48 0.2)
('rest for %n beats' t rest:elapsed:from: 0.2)
-
('play note %N for %n beats' t noteOn:duration:elapsed:from: 60 0.5)
('set instrument to %I' - midiInstrument: 1)
-
('change volume by %n' - changeVolumeBy: -10)
('set volume to %n%' - setVolumeTo: 100)
('volume' r volume)
-
('change tempo by %n' - changeTempoBy: 20)
('set tempo to %n bpm' - setTempoTo: 60)
('tempo' r tempo)
'motor'
('motor on for %n secs' t motorOnFor:elapsed:from: 1)
('motor on' - allMotorsOn)
('motor off' - allMotorsOff)
('motor power %n' - startMotorPower: 100)
('motor direction %W' - setMotorDirection: 'this way')
'variables'
('show variable %v' - showVariable:)
('hide variable %v' - hideVariable:)
'list'
('add %s to %L' - append:toList: 'thing')
-
('delete %y of %L' - deleteLine:ofList: 1)
('insert %s at %i of %L' - insert:at:ofList: 'thing' 1)
('replace item %i of %L with %s' - setLine:ofList:to: 1 'list' 'thing')
-
('item %i of %L' r getLine:ofList: 1)
('length of %L' r lineCountOfList:)
('%L contains %s' b list:contains: 'list' 'thing')
).
^ blocks, self obsoleteBlockSpecs
2012年2月6日 星期一
永恆的終結(The End of Eternity)與Smalltalk AOP(Phantom for Pharo)
Jimmy's papa前陣子讀過美國科幻大師艾西莫夫(Isaac Asimov)的小說--永恆的終結(The End of Eternity),內容是描述在27世紀時地球出現一個掌握時空工程學的太上機構,藉由汲取當地球成為太陽超新星時的超級能源,撐開時間力場(Temporal Field)讓垂直性的時間--永恆時空(Eternity)覆蓋到一般的水平時間(Time),試圖操控每個時空分區(Section)人類文明的現實變革(Reality Change),成為超穩定結構狀態,整體人類命運被永恆時空(Eternity)的全時理事會(Allwhen Concil)一小撮病態獨裁的計算師(Commputer)擺佈著......
先不管小說裡頭提到的時空工程學是否可能存在,Jimmy's papa倒是對全時理事會(Allwhen Concil)的電腦所用的軟體科技有興趣,雖然小說中沒提到軟體技術,但我猜AOP(Aspect-Oriented Programming)或許是選項之一,
因為觀察現實變革(Reality Change)對各世紀的社經體系的影響是這個組織的工作之一,也就是所謂的Cross-cutting concerns,或許他們需要建立各種Aspect,透過綿密的時空切入點(Pointcuts),以Advice擷取資訊或導入物件,如果這項軟體開發專案外包給Jimmy's papa的話,或可採用PHANtom (PHaro Aspect laNguage),前提是他們的MIS也是採用Smalltalk,不過在時空的無限可能的現實中,這樣的Reality總會存在的啦!!!
![]() |
| 寄件者 scratchlab01 |
2012年1月15日 星期日
Talk2NXT beta released!!!
能夠以Smalltalk/Squeak/Pharo操控LEGO MINDSTORMS NXT 2.0樂高機器人,一直以來是Jimmy's papa的夢想,直到最近與Squeak FFI奮戰多日後,終於將Talk2NXT的部份功能實作出來,同時也寫了測試MotorA,MotorB以及port2的Color Sensor的簡單範例,提供給有興趣的網友鑑賞,目前我僅在Ubuntu 10.10的環境下測試過,這段時間讓我對Smalltalk有更深一層的理解,敲下程式碼毫不遲疑,然後不斷地重構(Refactoring)再重構,收穫不少!!!
ps.Jimmy's papa擅長寫又臭又長的程式碼命名(美其名所謂的"程式即說明文件"),但是請不要害怕,善用Tab key就讓Jimmy's papa撰寫Smalltalk的過程輕鬆不少
1.Unzip Talk2NXT-beta-XXXXXXXX-linux32-OneClick.app.zip
2.Run talk2nxt.sh
![]() |
| 寄件者 scratchlab01 |
3.Scan NXT MAC address.Please wait for 30 second.....
![]() |
| 寄件者 scratchlab01 |
4.Copy your NXT MAC address
![]() |
| 寄件者 scratchlab01 |
5.Paste your NXT MAC address to Test1 and Do it
![]() |
| 寄件者 scratchlab01 |
6.Paste your NXT MAC address to Test2 and Do it
![]() |
| 寄件者 scratchlab01 |
7.Try it with your NXT Robot
![]() |
| 寄件者 scratchlab01 |
2012年1月1日 星期日
迎接2012年 啟動talk2NXT新計畫
Jimmy's papa終於等到2012年的到來,這個傳說中充滿挑戰的一年
Jimmy's papa新年的新計畫打算將JNXT的middleware(以nxt-python開發的)換掉,改以暫名為talk2NXT的新專案代替,讓Pharo/Smalltalk直接透過FFI存取C Library,將可提供更多細部指令且更有效率的驅動LEGO Mind Storms NXT機器人
哇咧!想不到原本只是想改寫Scratch添上遙控NXT的陽春功能給我兒子玩玩的,想不到越搞越專業囉!!!
2011年12月31日 星期六
FFI(Foreign Function Interface)-擴展Smalltalk的特異功能
如果想讓Smalltalk能使用我們電腦平台的特殊硬體設備或是運算能力,那麼可以透過FFI,存取作業系統的library或是自行編寫shared library所提供的接口
例如,可以添購產生真實亂數量子物理設備或是為了加入全球意識計畫 (The Global Consciousness Project )而安裝REG(random event generators)設備,這時我們只要為Smalltalk/Squeak/Pharo加入一些程式碼,就能讓你的Smalltalk達成量子跳躍(Quantum leap)
關於FFI的詳細用法,請參考How to Use FFI
底下是Jimmy's papa的實驗過程
首先Pharo先載入FFI package
![]() |
| 寄件者 scratchlab01 |
junkDNA.c
#include <stdio.h>
char* quantumCommunication() {
return "hello parallel worlds!\n";
}
junkDNA.h
char* quantumCommunication();
編譯,產生junkDNA.o
gcc -fPIC -Wall -c junkDNA.c
編譯成libjunkDNA.so(必須是lib開頭),加入junkDNA.o
gcc -shared -o libjunkDNA.so junkDNA.o
直接copy檔案到預設Pharo的/Contents/Linux/目錄下
cp libjunkDNA.so /home/<your-dir>/Pharo-1.3-OneClick.app/Contents/Linux/
![]() |
| 寄件者 scratchlab01 |
耶!成功了,我的Pharo擁有新的特異功能囉!!!
![]() |
| 寄件者 scratchlab01 |
2011年12月21日 星期三
蒙地卡羅法求圓周率(Pi Estimation using Monte Carlo Method in Smalltalk)
蒙地卡羅方法可用於近似計算圓周率:讓計算機每次隨機生成兩個0到1之間的數,看以這兩個實數為橫縱坐標的點是否在單位圓內。生成一系列隨機點,統計單位圓內的點數與總點數,(圓面積和正方形面積之比為PI:4,PI為圓周率),當隨機點取得越多(但即使取10的9次方個隨機點時,其結果也僅在前4位與圓周率吻合)時,其結果越接近於圓周率。實際上,計算機產生的隨機數隻能精確到某位數,並不能產生任意實數(例如無理數等等);上述做法將平面分割成一個個網格,由此計算出來的面積當然與圓或多或少有差距。蒙地卡羅法求pi,在網路上可以查到C/C++,Java,Python,Ruby等等各種程式語言的寫法,唯獨似乎沒看過Smalltalk的實作,所以Jimmy's papa在這裡貢獻一下smalltalk程式碼寫法
n := 10000000.
sum := 0.
r := Random new.
1 to: n do: [:a | (r next squared) + ( r next squared ) <= 1 ifTrue: [sum := sum + 1] ].
pi := (4 * sum / n) asFloat.
Transcript show: 'pi =' , pi asString.
![]() |
| 寄件者 scratchlab01 |
2011年12月6日 星期二
安裝scat(Scratch)到Android平板
下載scratch image
為了簡化程序,Jimmy's papa將image相關檔案整理好了
下載scat.zip
將scat.zip解壓縮
內含scat.image , scat.changes , PharoV10.sources 三個檔
![]() |
| 寄件者 scratchlab01 |
CogDroid VM APP
到http://code.google.com/p/squeakvm-tablet/downloads/list
下載CogDroid-alpha-20111009.apk
安裝Android SDK
再到http://developer.android.com/sdk/index.html下載Android SDK(依你的OS擇一),並解壓縮
http://dl.google.com/android/android-sdk_r15-windows.zip
http://dl.google.com/android/installer_r15-windows.exe
http://dl.google.com/android/android-sdk_r15-linux.tgz
安裝SDK其他元件
# On Windows, double-click the SDK Manager.exe file at the root of the Android SDK directory.
Windows使用者請以滑鼠點擊SDK Manager.exe
# On Mac or Linux, open a terminal and navigate to the tools/ directory in the Android SDK, then execute: android
![]() |
| 寄件者 scratchlab01 |
Linux則須開啟終端機命令列視窗,執行
cd /tools
執行
./android
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
將先前四個檔案scat.image , scat.changes , PharoV10.sources , CogDroid-alpha-20111009.apk
複製到/(你安裝的目錄)/android-sdk-linux_x86/platform-tools
將你的平板的資料傳輸線,插入PC及平板的USB插槽
在你的終端機命令列視窗執行
cd ~/(你安裝的目錄)/android-sdk-linux_x86/platform-tools$
./adb push scat.image /sdcard/Presentation/scat.image
./adb push scat.changes /sdcard/Presentation/scat.changes
./adb push PharoV10.sources /sdcard/Presentation/PharoV10.sources
./adb push install CogDroid-alpha-20111009.apk
按一下平板的CogDroid圖示,會出現以下畫面
![]() |
| 寄件者 scratchlab01 |
若出現PrimitiveFailed警告視窗,沒關係,按下Abandon按鈕就對了
2011年11月29日 星期二
SmallExpert--以Smalltalk開發的簡易專家系統
安裝指令如下
MCHttpRepository這是指令的用法,目前規則(Rule)僅支援簡單的事實(Fact)字串比對
location: 'http://www.squeaksource.com/SmallExpert'
user: ''
password: ''
![]() |
| 寄件者 |
2011年11月18日 星期五
SandstoneDB
SandstoneDB一套以smalltalk開發的物件導向資料庫
下面是一些文章連結
http://onsmalltalk.com/sandstonedb-simple-activerecord-style-persistence-in-squeak
http://book.seaside.st/book/advanced/persistency/sandstone/api
http://www.pharocasts.com/2010/04/sandstonedb-simple-activerecord-style.html
http://onsmalltalk.com/simple-image-based-persistence-in-squeak
這篇說明以Fuel序列化機制加速SandstoneDB的存取
http://marianopeck.wordpress.com/2011/08/19/boosting-sandstonedb-with-fuel/
2011年10月28日 星期五
自己動手建置Smalltalk VM(CogVM)
Jimmy's papa平常都拿人家已建置好的VM執行Pharo,但讀了這篇文章後Building the VM from scratch using Git and CMakeVMMaker,
也搜尋了關於Slang這個有趣的東東,Slang是Smalltalk語法的子集合,可轉譯為標準C語言,Slang能夠用來撰寫Smalltalk VM自身,雖然以現在的編譯器技術這應該不是什麼先進的技術,但在早期的年代用Smalltalk開發Smalltalk這構想實在太厲害了!!!
以下是轉譯smalltalk "slang" to C的小小例子
這是Smalltalk程式
sayHello
<returnTypeC: 'char*'>
^ 'JimmyScratchLab say hello'
這是對應的C程式
static char*
sayHello(void)
{
return "JimmyScratchLab say hello";
}
看了那麼多資料,Jimmy's papa一時手癢也想親自動手建置虛擬機器,於是開始捲起袖子開始動工
安裝gcc, make...一些開發工具到Linux/Ubuntu
sudo apt-get install build-essential
安裝cmake
sudo apt-get install cmake
到這裡下載cogvm-blessed-master.tar.gz
https://gitorious.org/cogvm/blessed/archive-tarball/master
下載Pharo 1.3 one-click
http://www.pharo-project.org/pharo-download/release-1-3
解開Pharo 1.3 one-click,進入/Contents目錄
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
啟動Pharo
![]() |
| 寄件者 scratchlab01 |
下載VMMaker
Gofer new
squeaksource: 'MetacelloRepository';
package: 'ConfigurationOfCog';
load.
((Smalltalk at: #ConfigurationOfCog) project version: '1.5') load.
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
安裝VMMaker
Gofer new
squeaksource: 'VMMaker';
package: 'CMakeVMMaker';
version: 'CMakeVMMaker-MarianoMartinezPeck.73';
load.
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
使用VMMaker將Cog SLANG轉譯為C程式碼
CogUnixNoGLConfig new generateSources; generate.
![]() |
| 寄件者 scratchlab01 |
執行結果,會發覺多了/src目錄,還有供cmake作處理的/build目錄的相關檔案
/src/vm,一堆虛擬機器核心的C原始碼
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
接著打開Linux/Ubuntu的終端機shell,執行
cd build
cmake .
跑出一卡車訊息
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
make
還是一堆編譯訊息
![]() |
| 寄件者 scratchlab01 |
2011年10月27日 星期四
Smalltalk--物件模型的規則
以下是Jimmy's papa閱讀Pharo by Example關於物件模型規則的整理筆記
Rule 1. Everything is an object.
一切都是物件(包括類別)
Rule 2. Every object is an instance of a class.
每個物件是類別的一個實例(包括類別物件也是元類別的實例)
Rule 3. Every class has a superclass.
每個類別有一個超類別(雖然僅支持單一繼承,但可共享以Trait類別打包的一些方法實作)
Rule 4. Everything happens by sending messages.
一切發生皆由發送訊息(收到訊息才來找方法執行)
Rule 5. Method lookup follows the inheritance chain.
沿著繼承鏈查找方法
共享變數
有全域變數,類別變數,變數池共三類,命名開頭需大寫字母
全域變數(Global variables)在系統隨處皆可存取
類別變數(Class variables)由類別,其子類別及其實例共享
變數池(Pool variables)由一群選定的類別共享
2011年10月26日 星期三
Smalltalk--訊息語法
以下是Jimmy's papa閱讀Pharo by Example關於Message syntax的整理筆記,Smalltalk的訊息(message)相當於Java的物件方法(method)
術語解釋
一個訊息(message)是由訊息選擇子(selector)及選擇性參數組成
一個訊息(message)傳送給一個接收者(receiver)
一個訊息(message)與它的接收者(receiver)的組合稱為一個訊息發送(message send)
訊息種類
一元訊息(Unary),只有選擇子(selector),無參數,例如
Pen new
二元訊息(Binary),選擇子(selector)以下列字元構成+, −, *, /, |, &, =, >, <, ~, @,只有一個參數,例如
1 + 2
關鍵字訊息(Keywords),選擇子(selector)以多組"關鍵字加上字尾冒號(:)"組成 ,有多個參數,例如
aPen go: 100
Color r: 0 g: 0 b: 1
多訊息混合構造的處理優先順序
規則一
一元 > 二元 > 關鍵字
Unary > Binary > Keyword
Pen new go: 100 + 200
aPen go: 100 + 200
規則二
括號第一,括號裡的訊息優先處理
括號 > 一元 > 二元 > 關鍵字
(Msg) > Unary > Binary > Keyword
規則三
由左至右,若訊息優先權皆相同則由左至右解之
Pen new down
需注意,smalltalk二元訊息的乘號與加減除的優先權相同,所以下列算式需依由左至右規則解之
10 + 2 * 5 -> 60
若加上括號,則是
10 + (2 * 5) -> 20
句點(.),用來區隔表達式(Expressions)
Transcript show: 'JimmyScartachLab '.
Transcript show: 'say '.
Transcript show: 'hello '.
Transcript cr.
分號(;),可用來串連多個訊息依先後順序傳送至同一個接收者
Transcript
show: 'JimmyScartachLab ';
show: 'say ';
show: 'hello ';
cr
方括號([]),用來建立程式區塊閉包(block closure)
[ n := n*2 ]
[ :x | 1 + x ]
()括號,只會影響訊息的處理順序
2011年10月17日 星期一
如何在CogDroid上執行Pharo的DoIt功能
Jimmy's papa在平板上玩Smalltalk有個困擾,因為沒有滑鼠鍵或鍵盤Ctrl or Alt,讓我執行DoIt功能,不過後來Jimmy's papa找到變通的方式
首先在Linux啟動Pharo,打開Workspace然後在任意空白處按滑鼠右鍵會跳出選單,然後將鼠標滑至"DoIt"按滑鼠中鍵,會出現下圖,請選"Pick up"
![]() |
| 寄件者 scratchlab01 |
可將"Do it"拉到Pharo主畫面任意處,按"Do it"便可執行Worlspace上的指令
![]() |
| 寄件者 scratchlab01 |
可將以上的Pharo.image存起來,Push到Android-tablet的/Presentation目錄
![]() |
| 寄件者 scratchlab01 |
2011年10月9日 星期日
SCat-BlockMorph Class Diagram
Jimmy's papa想試著了解Scat/NScratch的內部架構,於是試著以Moose先將BlockMorph轉出類別圖,嗯!!一目了然,再也不用像之前為了將Scratch改裝成JNXT,看Smalltalk code看到頭昏眼花了,尤其是繼承CommandBlockMorph的CBlockMorph和IfElseBlockMorph這兩個類別
![]() |
| 寄件者 |
2011年10月7日 星期五
Pharo UIBuilder--使用者介面輔助設計工具
Jimmy's papa在找UITheme的相關教學文件時,找到一套叫做UIBuilder好東西,用來輔助Smalltalker設計使用者介面,在Monticello Browser執行下列指令即可下載
MCHttpRepository
location: 'http://www.squeaksource.com/UIBuilder'
user: ''
password: ''
不過經過Jimmy's papa測試後,目前僅能在Pharo 1.2正常執行,希望開發者能持續更新
![]() |
| 寄件者 scratchlab01 |
UIBuilder沒有官方網站及相關文件可參考,但在開發者的nullPointerSM's Channel有一些教學影片可參考
Pharo Smalltalk UIBuilder Tool
2011年10月5日 星期三
Moose--以Smalltalk開發的視覺化系統分析工具
Moose是一套以Smalltalk開發的視覺化系統分析工具,從1996年發展至今功能已非常強大,在產業及學界也有多個專案採用這套工具,Jimmy's papa曾用過Rational Rose和Together開發過專案,卻是頭一次聽過Moose,而且還是免錢的開放程式碼工具,這在台灣應該沒機會採用^ ^,以下是Jimmy's papa牛刀小試一番
文件可參考這裡The Moose Book
![]() |
| 寄件者 scratchlab |
在Workspace執行下列Smalltalk程式,則會產出NumberParser類別的Class Diagram
view := MOViewRenderer new.
view shape: UMLClassDiagram new umlShape.
view interaction popupText.
view nodes: NumberParser withAllSubclasses asArray.
view shape: (MOArrowedOrthoVerticalLineShape new).
view edgesFrom: #superclass.
view layout: MOTreeLayout new.
view open
![]() |
| 寄件者 scratchlab |
在Workspace執行下列Smalltalk程式,則會產出URL類別的Class Diagram
view := MOViewRenderer new.
view shape: UMLClassDiagram new umlShape.
view interaction popupText.
view nodes: Url withAllSubclasses asArray.
view shape: (MOArrowedOrthoVerticalLineShape new).
view edgesFrom: #superclass.
view layout: MOTreeLayout new.
view open
![]() |
| 寄件者 scratchlab |
2011年10月2日 星期日
Pharo UITheme
UITheme可用來安排UI畫面Layout,不過網路上的範例及說明文件很少,官方的資料只提到下列幾個範例,可以打開SystemBrowser閱讀相關程式碼
UITheme exampleBasicControls.
UITheme exampleColorControls.
UITheme exampleDialogs.
UITheme exampleGroups.
UITheme exampleOtherControls.
UITheme exampleWindowWithToolbars.
以下是Pharo轉出的Smalltalk程式碼,是Jimmy's papa整理過的簡單範例程式,看起來很多,其實在Pharo的環境下寫沒幾行,在加上Smalltalkm語法規則超簡單,蠻容易上手的
Object subclass: #HelloButton
instanceVariableNames: 'builder content'
classVariableNames: ''
poolDictionaries: ''
category: 'JimmyScratchLab'!
!HelloButton methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 23:35'!
aboutButtonClick
SmalltalkImage current aboutThisSystem.! !
!HelloButton methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 10:22'!
builder
^ builder
! !
!HelloButton methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 10:24'!
builder: anObject
builder := anObject
! !
!HelloButton methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 23:40'!
helloButtonClick
Transcript show: 'hello,JimmyScratchLab'; cr.
! !
!HelloButton methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 10:24'!
initialize
self builder: UITheme builder.
! !
!HelloButton methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 23:37'!
open
content := builder newColumn: {
builder newButtonFor: self
action: #helloButtonClick
label: 'Hello'
help: 'Say hello!!!!!!'.
builder newButtonFor: self
action: #aboutButtonClick
label: 'About'
help: 'Show About!!!!!!'.
}.
(content openInWindowLabeled: 'HelloBouton') extent: 300@50.
! !
"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!
HelloButton class
instanceVariableNames: 'content'!
!HelloButton class methodsFor: 'main' stamp: 'JimmyScratchLab 10/2/2011 10:20'!
open
^ self new open.
! !
在WorkSpace寫入HelloButton open後執行DoIt,便會在畫面出現HelloButton視窗
![]() |
| 寄件者 scratchlab |
2011年9月30日 星期五
Pharo StringMorph
Jimmy's papa參考petite-horloge這篇文章,自己稍微改寫一下,馬上就能在Pharo上看到成果!!!不過,多new幾個MyWatch後,時間的更新會出現落差,有點奇怪
宣告MyWatch類別
StringMorph subclas,s: #MyWatch
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Sandbox'
step是繼承而來的方法或訊息,顯示時時更新的內容
MyWatch>>step
self contents: '***' , Time now printString , '***'.
以下4行指令則在WorkSpace視窗依序個別DoIt
首先讓MyWatch出現在世界
MyWatch new openInWorld.
然後暫停更新內容
MyWatch allInstances last stopStepping
然後開始更新內容
MyWatch allInstances last startStepping
然後刪除
MyWatch allInstances last delete
![]() |
| 寄件者 scratchlab |













































