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

Jimmy 的畫畫

這是上週六,為了讓整個早上都在玩PS3的EyePet遊戲的Jimmy,能收收心,於是叫他畫幾張水彩畫

這張是彩虹與火車,不久前某天傍晚和Jimmy在他的學校打球時,被烏雲遮住的半邊天空,竟然出現一輪很漂亮的彩虹,這應該是Jimmy第一次見過真正的彩虹,趁他還有印象時要他畫出來,而火車是他最近喜歡畫的,或許他最近渴望出門旅行吧!!

寄件者 scratchlab

這張是寵物,因為Jimmy作畫時間超快的,於是要他加畫一張,參考EyePet那隻寵物狗(猴??),畫出他心中的寵物

寄件者 scratchlab

2011年9月26日 星期一

Amber Compiler--如何使用amberc

傳言Google秘密開發的新程式語言Dart,可能跟Smalltalk有點淵源,雖然目前我們還不清楚Dart語言到底會長成什麼樣子但是倒是可以從Amber身上想像一下,Jimmy's papa最近試玩一下Amber的Server端編譯器amberc,它負責將Smalltalk指令轉譯為Javascript指令

關於如何安裝Amber的官方網址在此
https://github.com/NicolasPetton/amber/wiki/Getting-started

請下載壓縮檔並解壓縮
https://github.com/NicolasPetton/amber/zipball/amber
安裝Nodejs--這是Javascript V8引擎的VM

apt-get install nodejs
記得,amberc第 268行
node $TMPDIR/compiler.js $DEPLOY $SUFFIX $COMPILE
必須改成
nodejs $TMPDIR/compiler.js $DEPLOY $SUFFIX $COMPILE
否則無法執行

這是/amber/examples/nodejs/hello/原有的內容

寄件者 scratchlab

將/amber/examples/nodejs/hello/Hello.st原有的內容改為

Widget subclass: #Hello
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Hello'!

!Hello methodsFor: 'Instance main' stamp: 'Anonymous 9/26/2011 02:01'!
renderOn: html
    "Render some html"
   | aArray |
   aArray := #( 69 8 5 7 1 -3  )  .
    html div class: 'section';
    id: 'headerSection';
    with: [ html h1:  ( Hello main) , '   ' , aArray  , ' -----> ' ,  ( Hello sort: aArray  )  ] ! !

"-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "!

Hello class
    instanceVariableNames: ''!

!Hello class methodsFor: 'class main' stamp: 'Anonymous 9/26/2011 01:57'!
main
    ^ 'JimmyScratchLab test Bubble Sort'
! !

!Hello class methodsFor: 'class main' stamp: 'Anonymous 9/26/2011 01:57'!
sort: anArray
   "I expect an array of numbers and I answer an array of those number, 
    but in sorted order. I am the actual guts of the bubble sort."
|answer swap itemCount hasChanged|
answer := anArray copy.
swap := 
    [:indexOne :indexTwo| 
    |temp|
    temp := answer at: indexOne.
    answer at: indexOne put: (answer at: indexTwo).
    answer at: indexTwo put: temp].
 
itemCount := answer size.
[hasChanged := false.
itemCount := itemCount - 1.
1 to: itemCount do:
    [:index | 
    (answer at: index) > (answer at: index + 1) ifTrue:
        [swap value: index value: index + 1.
        hasChanged := true]].
hasChanged] whileTrue.
^ answer
! !

打開檔案/amber/examples/nodejs/hello/Makefile將原來的內容

Program.js: Hello.st
    ../../../bin/amberc -m Hello Hello.st Program

改為

Program.js: Hello.st
    ../../../bin/amberc Canvas.st Hello.st  -m Hello   Program

run: Program.js
    ./hello

clean:
    rm -f Program.js Hello.js

記得將Canvas.st複製到/amber/examples/nodejs/hello/

執行
/amber/examples/nodejs/hello$ make

會增加幾個.js檔案

寄件者 scratchlab

複製Hello.js到/amber/examples/myproject/js
然後將/amber/examples/myproject/index.html的內容改為

<html>
<head>
<title>My Project</title>
<script src="../../js/amber.js" type="text/javascript"></script>
</head>
<body>
<script type="text/javascript"> 
    loadAmber({
        files: ['Hello.js'],
        prefix: 'examples/myproject/js',
        ready: function() {
            smalltalk.Browser._open();
        }}); 
</script>
</body>
</html>

用FireFox打開index.html

寄件者 scratchlab

在Workspace填入Smalltalk指令
Hello new appendToJQuery: 'body' asJQuery
執行DoIt

寄件者 scratchlab

2011年9月22日 星期四

哇!讓Jimmy很有精神的OMG美語

平常陪Jimmy讀兒童英文短篇故事時,他總是心不在焉,注意力沒多久就會飄移到他的玩具上,最近Jimmy's papa剛好看到新聞在介紹,網路上有個白潔姊姊的OMG!美语很夯,於是Jimmy's papa趕快找給他看,讓Jimmy偶而擺脫撲克臉換換口味,果然白潔姊姊的豐富表情還有輕切的笑容,成功的吸引Jimmy的目光

2011年9月19日 星期一

Jtalk現在已改名為Amber

Jimmy's papa之前介紹過的【Jtalk-以JavaScript實作的Smalltalk】 ,現在已改名為Amber(琥珀),開發者的意圖或許能從它首頁出現的琥珀圖片可看出端倪, 記得電影"《侏羅紀公園》(Jurassic Park)"中讓恐龍復活的最重要關鍵,就是被密封在琥珀中達億萬年之久的吸血巨蚊,那麼,想藉由Amber,將遠古程式語言Smalltalk的DNA借javascript之體還魂,重新活躍在行動網路設備的競技場,再造Smalltalk世紀就不言可喻了

以下是英文簡介
Amber, formerly known as Jtalk, is an implementation of the Smalltalk-80 language. It is designed to make client-side development faster and easier. It allows developers to write client-side heavy web applications in Smalltalk.

Amber includes an integrated development environment with a class browser, workspace, transcript, object inspector and debugger.

Amber is written in itself, including the parser and compiler, and compiles into efficient JavaScript, mapping one-to-one with the JS equivalent.

Amber的官網
http://amber-lang.net/

有興趣的網友,可以到Amber的線上教學頁面看看,它提供ProfStef(Professor Stef)互動式教學指令
http://amber-lang.net/learn.html

這裡也有一份關於Jtalk簡報可以參考看看
http://nicolas-petton.fr/presentations/esug2011/#intro

2011年9月16日 星期五

如何升級PharoCogOneClick一點靈套件

想在linux環境下學習smalltalk的初學者,目前Pharo-1.2.1-CogOneClick一點靈套件是個不錯的工具,但隨著CogVMPharo image不斷地改版,若想跟得上最新的版本,請參考Jimmy's papa下列的簡易教學筆記

download files
http://ci.lille.inria.fr/pharo/job/Pharo%201.4/lastSuccessfulBuild/artifact/Pharo-1.4.zip
http://www.mirandabanda.org/files/Cog/VM/VM.r2489/coglinux.tgz
http://gforge.inria.fr/frs/download.php/28439/Pharo-1.2.1-CogOneClick.zip

tar -zx coglinux.tgz
unzip Pharo-1.4.zip
unzip Pharo-1.2.1-CogOneClick.zip

cp coglinux/lib/squeak/4.0-2489/* Pharo-1.2.1-CogOneClick/Contents/Linux
mv Pharo-1.2.1-CogOneClick/Contents/Linux/squeak Pharo-1.2.1-CogOneClick/Contents/Linux/squeakvm
cp Pharo-1.4/Pharo-1.4.changes Pharo-1.4/Pharo.changes
cp Pharo-1.4/Pharo-1.4.image Pharo-1.4/Pharo.image
cp Pharo-1.4/* Pharo-1.2.1-CogOneClick/Contents/Resources
cd Pharo-1.2.1-CogOneClick
bash Pharo.sh
若出現Pharo字樣的使用者畫面,恭喜您升級成功!!!
退出程式後,可將Pharo-1.2.1-CogOneClick目錄名改為Pharo-1.4-CogOneClick

2011年9月15日 星期四

終於可以在Android平板上寫Scratch小貓咪程式了

Jimmy's papa參考了scatsqueakvm-tablet兩個專案,經過一番努力後,終於將兩者成功安裝到我的XOOM平板電腦,實在非常感謝兩個專案的開發人員的努力奉獻,讓Jimmy's papa也可以在Android平板上寫Scratch小貓咪程式!!!

ps.現在Sratch 2.0也可以囉!!!


安裝過程請參考這裡
寄件者 scratchlab

2011年9月11日 星期日

幾首簡單的英文歌

平常Jimmy's papa會找些簡單的英文歌讓Jimmy聽聽

下面兩首Nicholas Alan的blog找到的,歌詞超簡單,放給Jimmy聽時,他總是搖擺著身體,隨著歌詞哼哼唱唱

Lyrics:
Hello. How are you? How are you today? (4x)

I’m good. I’m great. I’m okay.
I’m happy you’re my friend.
Let’s go out and play.

Hello. How are you? How are you today? (4x)

I’m sleepy, so sleepy.
I’m tired, so tired.
I… (yawn)

Hello. How are you? How are you today? (4x)

Hello. Hello. Hello. (2x)

Hello. How are you? How are you today? (8x)

Lyrics:
My name is Erika. I’m from America.
I like hamburgers and potatoes.
She likes hamburgers and potatoes.

My name is Ray. I’m from the U.K.
I like fish, gravy, and potatoes.
He likes fish, gravy, and potatoes.

It’s twelve o’clock.
It’s time for lunch.
Let’s go to a restaurant.

My name is Joshua. I’m from Canada.
I like cheese, gravy, and potatoes.
He likes cheese, gravy, and potatoes.

My name is Donovan. I’m from Ireland.
I like butter, onions, and potaotes.
He likes butter, onions, and potatoes.

It’s twelve o’clock.
It’s time for lunch.
Let’s go to a restaurant.

這首Gary come home小蝸回家吧!!!對Jimmy來說有點難,不過他很喜歡聽

Gary, now I know I was wrong
I messed up, and now your gone

Gary, I'm sorry I neglected you
Oh, I never expected you to run away and leave me
Feeling this empty
Your meow right now would sound like music to me
Please come home, 'cause I miss you, Gary

(Gary come home...)
Gary come home
(Gary come home...)

Gary, can't you see I was blind

I'll do anything to change your mind

More than a pet, your my best friend
Too cool to forget, come back
'Cause we are family
And forgive me for making you wanna roam
And now my heart is beating like the saddest metronome
Somewhere I hope you're reading my latest three-word poem:
Gary come home

(Gary come home...)
Gary come home
(Gary come home...)
Gary come home
(Gary come home...)
Gary come home
(Gary come home)
Ahh... 
Gary, come home
Gary, come home
Gary, won't you come home

Android + Pharo + CogVM

上回安裝安裝squeakvm-tablet在XOOM Android平板之後,最近作者又釋出了CogVM(CogDroid)版本CogDroid-alpha-20110903.apk,Jimmy's papa安裝上去後並且載入Pharo,參考Pharo-the collaborActive book寫了個CreateWindow範例測試看看,嗯!漂亮,不過有個缺點是,找不到方法在Workspace視窗以do it(d)執行,只好先以TestRunner先頂著跑跑看

以下是Smalltalk程式碼及畫面

window := StandardWindow labelled: 'Painter'.

chooser := ColorChooserMorph new.
window addMorph: chooser.

window openInWorld.
寄件者 scratchlab

2011年9月10日 星期六

Android Realtime Line Chart Demo

下面這段影片顯示氣壓計(Barometer)的即時動態折線圖,網路上一直找不到現成的realtime圖表函數庫,Jimmy's papa只好動手修修改改別人的範例,花了許久的時間才做到能夠即時更新線圖畫面

2011年9月7日 星期三

原來Java List類別是Hold住哥

最近Jimmy's papa被List類別搞得快變成卡卡先生,進度一直卡卡卡,原本Jimmy's papa想為android寫個即時動態折線圖(realtime Line Chart),可是事與願違,折線圖永遠只顯示最初的十筆資料,後來發現,原來搗蛋的是List這個Hold住哥

以下是部份程式碼

//dataArraylist存放每條折線的所有資料點的x及y值
private ArrayList<GraphViewData> dataArraylist = new ArrayList<GraphViewData>();
//lineGraphSeries可存放多條折線
private  List<LineGraphViewSeries> lineGraphSeries;

//將dataArraylist塞入exampleSeries
exampleSeries = new GraphViewSeries(dataArraylist);
lineGraphView.addSeries(exampleSeries);

這個Thread會每隔0.5秒寫入一筆資料,填滿十筆資料後再開始顯示折線圖,"理論上"折線圖會一直更新,但"沒有"

runOnUiThread(new Runnable() {
    public void run() {
        dataArraylist.add(new GraphViewData(
            0.5 * (dataArraylist.size()+1),pressure_value));                
            if(dataArraylist.size()>10)
                {
                    drawLineGraph();
                }
            }

最後Jimmy's papa的解法是,每次update UI之前就將折線物件清掉

lineGraphSeries.clear();

然後再次執行

exampleSeries = new GraphViewSeries(dataArraylist);
lineGraphView.addSeries(exampleSeries);

就OK了

ps.Jimmy's papa懷疑這是否是因為ArrayList的某些內部資料成員被設為final的關係?