這裡是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月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 |
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年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 |
![]() |
| 寄件者 scratchlab01 |
這是Physical Etoys團隊在ESUG的簡報影片
2011年10月30日 星期日
Dr. Geo
目前EToys最新版本已將Dr. Geo整合進來,有興趣的人可以去看看它的部落格Education 0.2
底下是Jimmy's papa的隨意測試
點選Object Catalog物件目錄
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
按滑鼠右鍵,周遭會出現叫做Halo的小工具,按右下角黃色小工具可拉大物件
![]() |
| 寄件者 scratchlab01 |
從外面拉圖檔進來,這次以麥田圈做測試
![]() |
| 寄件者 scratchlab01 |
準備做圓形
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
複製
![]() |
| 寄件者 scratchlab01 |
移動調整
![]() |
| 寄件者 scratchlab01 |
繼續複製
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
點選Halo的Menu
![]() |
| 寄件者 scratchlab01 |
準備改變線條顏色
![]() |
| 寄件者 scratchlab01 |
用滴管挑顏色
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 scratchlab01 |
![]() |
| 寄件者 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 |
![]() |
| 寄件者 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 |


























































