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

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月4日 星期三

Install scat (Scratch) to Android Tablet(XOOM)--簡易安裝Scratch到Android平板

今天Jimmy's papa將XOOM成功的升級到Android 3.2版本,雖然沒看到什麼讓人驚豔的功能,但很高興我的XOOM沒有成為棄嬰,希望MOTO給我努力用力的升級下去,因為Jimmy's papa很想吃到Ice Cream啊!!!

Jimmy's papa也趁便測試一下是否不需要PC,直接在Android安裝scat(Scratch)及CogDroid,安裝流程如下,希望大家看得懂我的poor english,haha!!!

1.Open Web Browser in Android
啟動平板電源,並且打開Android Browser

2. Download CogDroidVM APP
http://code.google.com/p/squeakvm-tablet/downloads/list
downloadCogDroid.apk

3. Install CogDroid.apk
Open Files Manager on your Android Tablet.
Find /Download/CogDroid.apk in Internal Storage and install it.

4. Download http://jimmyscratchlab.googlecode.com/files/scat.zip

5.Unzip scat.zip
Open Files Manager and unzip /Download/scat.zip,
you will get 3 file(scat.image , scat.changes , PharoV10.sources).

5. Create /Presentation directory
Open Files Manager and create /Presentation in Internal Storage

6.Copy scat.image
Open Files Manager and copy 3 file(scat.image , scat.changes , PharoV10.sources) to /Presentation

7. Open CogDroid App

8. Select scat.image in CogDroid's Files List

9.Enjoy scat(Scratch)!!!
Don't worry 'PrimitiveFailed' warning,just click 'Abandon' Button.

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年11月2日 星期三

Physical Etoys--用Smalltalk EToys玩機器人

Physical Etoys這套軟體,讓小朋友可藉由Etoys簡易的開發環境,以物件導向的方式拖拉腳本程式碼區塊,就能玩多種教育性機器人與硬體

目前支援的硬體有
Arduino
Nintendo Wiimote
Parallel port
RoboSapien v2
Roboquad
I-Sobot
Lego Mindstorms Nxt

下載軟體
Physical Etoys 1.8.1 for Windows
Physical Etoys 1.7 for Linux

進入主畫面,會出現Physical Etoys目前支援哪些機器人,Jimmy's papa當然選小兒Jimmy平常在玩的NXT機器人

寄件者 scratchlab01

會出現NXT機器人的簡單範例,此時顯示EToys尚未連結到機器人
寄件者 scratchlab01

先確認你的藍牙使用的serial port,再按Connect,如果手邊正好有聲音偵測器的話,便可試試畫面下方的簡單測試腳本(script)
寄件者 scratchlab01

到Object Catalog的LegoNxt分頁,可看到幾個常用的馬達及偵測器物件
寄件者 scratchlab01
這是Jimmy's papa測試時的畫面
寄件者 scratchlab01

這是Physical Etoys團隊在ESUG的簡報影片

2011年10月30日 星期日

Dr. Geo

目前EToys最新版本已將Dr. Geo整合進來,有興趣的人可以去看看它的部落格Education 0.2
底下是Jimmy's papa的隨意測試

點選Object Catalog物件目錄

寄件者 scratchlab01
點選tool分頁,這時看到了Dr. Geo物件
寄件者 scratchlab01
點一下,現出了Dr. Geo工作區,哈哈,這叫做借殼上市
寄件者 scratchlab01

按滑鼠右鍵,周遭會出現叫做Halo的小工具,按右下角黃色小工具可拉大物件
寄件者 scratchlab01

從外面拉圖檔進來,這次以麥田圈做測試
寄件者 scratchlab01

準備做圓形
寄件者 scratchlab01
好簡單,做好一個圓圈了
寄件者 scratchlab01

複製
寄件者 scratchlab01

移動調整
寄件者 scratchlab01

繼續複製
寄件者 scratchlab01
寄件者 scratchlab01

點選Halo的Menu
寄件者 scratchlab01

準備改變線條顏色
寄件者 scratchlab01

用滴管挑顏色
寄件者 scratchlab01
寄件者 scratchlab01
哇勒!!!,做好了9個,可是每個都對不準,難道麥田圈的空拍圖有扭曲變形??? 不要緊,還有其他的法寶可用
寄件者 scratchlab01
出現Viwer視窗,這時可將圓形的屬性做各種微調
寄件者 scratchlab01

不過,上述的作法在Dr. GeoII本身是做不到的,因為拉出來的幾何物件的Z-order會排到麥田圈圖的後面
寄件者 scratchlab01

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學到許多寶貴的經驗