顯示具有 Pharo 標籤的文章。 顯示所有文章
顯示具有 Pharo 標籤的文章。 顯示所有文章

2013年2月18日 星期一

Smalltalk是個好東西,可惜它不說中文

Jimmy's papa好久沒碰Smalltalk or Pharo,換句目前比較流行的清宮劇說法,就是許久沒翻它們的牌子了,已打入冷宮久矣

回想當初放棄的理由之一,應該是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
目標是加到Control分類底下
寄件者 scratchlab01

首先打開SystemBrowser,依下列順序點選各項
>NScratch-Objects>ScriptableScratchMorph>block specs>blockSpecks
寄件者 scratchlab01
可以看到ScriptableScratchMorph類別在blockSpecs這裡定義所屬的每個程式積木的詳細規格,blockSpecs將會回傳一個多維陣列,內含多個分類命名字串(category name)及各分類所屬的程式積木規格說明陣列(Block specificaton Arrays)

程式積木規格說明格式如下
<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
將它改成('wait 10 secs' t wait:elapsed:from: 10)
寄件者 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
接著編寫shared library的c原始碼
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平板

以下是Jimmy's papa整理出來的安裝步驟,由於我的工作環境大多在linux上,Windows的使用者可能要稍微注意不同處,而且提供的檔案連結可能因為新版本而失效,可能要麻煩各位網友到原始下載頁面點選下載 ,倉促之間寫成有任何問題歡迎告訴Jimmy's papa

下載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
執行完成後,會發現多了好幾個目錄,其中的/platform-tools目錄裡,有我們要的adb(Android Debug Bridge)這隻程式
寄件者 scratchlab01
準備傳輸檔案及APP到Android平板
將先前四個檔案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開發的簡易專家系統

Jimmy's papa一直以來對人工智慧(AI)很有興趣,不久前稍微翻閱了CLIPS專家系統的使用手冊,感覺它的操作指令如果以Smalltalk來開發的話,應該不會太困難,所以動手做了一個雛型,順便為它在SqueakSource成立了SmallExpert的新專案
安裝指令如下
MCHttpRepository
location: 'http://www.squeaksource.com/SmallExpert'
user: ''
password: ''
這是指令的用法,目前規則(Rule)僅支援簡單的事實(Fact)字串比對
寄件者

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
將解開的cogvm-blessed-master.tar.gz的所有檔案拉進去上述的/Contents目錄
寄件者 scratchlab01
檔案一堆,其實依照這篇文章有些檔案目錄是不需要
寄件者 scratchlab01


啟動Pharo
寄件者 scratchlab01
然後打開Workspace,輸入逐步以下指令
下載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
/src/plugins,,一堆擴展虛擬機器功能插件的C原始碼
寄件者 scratchlab01

接著打開Linux/Ubuntu的終端機shell,執行
cd build
cmake .
跑出一卡車訊息
寄件者 scratchlab01
不過,到訊息結尾說少了tribox.c這個檔,不過為了完成整個步驟,Jimmy's papa將那個CMakeLists.txt稍做處理,再次cmake
寄件者 scratchlab01
接著
make
還是一堆編譯訊息
寄件者 scratchlab01
最後結果,由於我的執行環境的關係,當然還得再接再厲,不過這次建置實驗讓Jimmy's papa學到許多寶貴的經驗

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 RoseTogether開發過專案,卻是頭一次聽過Moose,而且還是免錢的開放程式碼工具,這在台灣應該沒機會採用^ ^,以下是Jimmy's papa牛刀小試一番

  • 下載最近的版本 Moose Suite 4.5
  • 啟動程式
  • Mac: launch the app file;
  • Linux: launch .app/moose.sh
  • Windows: launch .app/moose.lnk
  • 文件可參考這裡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