2012年9月29日 星期六

Jimmy的樂高積木修行--虎之卷135頁

為了決定每次修行的目標,我們父子倆都會小小地爭執一番,Jimmy喜歡做炫炫的車子,我則偏好簡單又能學得技巧,且半小時能搞定的項目,這次我倆妥協的結果,先讓Jimmy做他選的小車車的主體架構,然後再做我挑的第135頁小組件
寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02

2012年9月26日 星期三

JForthBlocks--Import New Blocks(.FS檔自動轉成新積木)

萬歲!!!JForthBlocks終於可以將.FS檔(Forth Library File)自動轉成新積木了

幫JForthBlocks做新積木是件繁瑣又累人的差事,Jimmy's papa已經將這部份自動化,讓使用者自行載入自己定義的Forth Library檔案,便可自動產生新積木,不用再做苦工了,不知道其他的程式語言的函式庫轉積木的難度如何,改天Jimmy's papa試著轉轉看

打從第一次接觸MIT Scratch,Jimmy's papa就夢想有朝一日能在Scratch-like tool上有豐富的函式庫支援,JForthBlocks能成功邁向這個目標一小步,真的很感謝Blockly與JeForth等專案相關開發者的貢獻哩!!!

打開文字編輯器先定義如下的My Library.fs,並存檔
: 3dup dup dup dup ;
: 4dup dup dup dup dup ;
: 5dup dup dup dup dup dup ;

請按Import Library
寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02

2012年9月21日 星期五

gForth--載入FFL(Forth Foundation Library)

FFL,一個通用的Forth詞庫(library),提供各類包括特殊資料型態,資料結構,雜錯與亂數,格式解析與檔案讀寫等等符式詞

Jimmy's papa已經玩好一陣子Forth,但總覺得沒有強大的library支援,就好像領導人背後沒有智庫運籌帷幄,事事校長兼撞鐘,實在成不了大事,所以今天抽空試試在Linux上執行gForth,然後執行FFL提供的範例,初步測試還蠻成功的

接下來,就是好好學習如何使用FFL了
寄件者 scratchlab02

2012年9月20日 星期四

Jimmy的樂高積木修行--虎之卷209頁

這次的修行,不知是否是虎之卷的作者設下的難題,Jimmy小朋友做好了這個超簡單的小組件,可以刷牙洗臉,準備上床睡覺蓋棉被純聊天(這似乎是除了看卡通玩平板外,Jimmy最期待的幸福時光),不過Jimmy's papa接過手試玩了一下,發覺齒輪卡死動彈不得,研究一下只要拆掉其中一個小齒輪,便能順利轉動,順便教Jimmy觀察大小齒輪轉速的差別

今天的心得是,虎之卷是有安排陷阱的,再簡單也不能傻傻的看圖照做,要動腦筋哩!!!

有四個齒輪,互相牽制動不了
寄件者 scratchlab02
拆掉一個就OK啦!!!
寄件者 scratchlab02
寄件者 scratchlab02

2012年9月19日 星期三

JForthBlocks--測試有無DoLit的效能

在Forth裡DoLit指令是用來取字面值(literal)的巧妙機制,當定義高階詞時,如有字面值(literal)編入詞典時,會同時夾帶DoLit編入字面值(literal)的前一個位址,如此一來,當Forth執行到DoLit指令時,便會自動取下一個位址的字面值(literal),這技巧在以低階語言開發的Forth系統上很有效率

不過,JForthBlocks所依賴的以Javascript開發的JeForth,DoLit是否還保有同樣的優勢?

Jimmy's papa動手修改JeForth部份程式碼,再用JForthBlocks同一份積木程式,測試看看有無DoLit的效能,是否有很大的差異,底下是跑五百萬次迴圈的輸出結果,第一次跑出的結果,有無DoLit指令似乎只有幾百微秒(milliseconds)的差異,隨後兩次的結果,執行時間會爆增,或許是垃圾收集機制的干擾

首先,測試compilecode('doLit',n)的效能
        function call(xt){// high level definition inner execution loop
            highLevelLooping=true; ip=xt;
            do{
                var id=dictionary[ip++];
                //if(typeof(id)=='object'){var v=id['lit'];stack.push(v);continue;}
                ........
                ........            
            }
        }

        function exec(src){ //source code interpreting loop
            .....
            .....
            do{token=nexttoken(); word=token;
                var id=findword(token);
                ......
                ......    
                       if(typeof(n)==='string'||n<=0||n>0){
                        if(compiling)
                            compilecode('doLit',n);// compile an literal
                            //compilecode({lit : n});
                ......
                ......
            }while(error===0&&ntib<tib.length);}

          }
寄件者 scratchlab02
連續執行三次的結果




再來,測試compilecode({lit : n})的效能,執行時則統一由call(xt)代勞取字面值(literal)
        function call(xt){// high level definition inner execution loop
            highLevelLooping=true; ip=xt;
            do{
                var id=dictionary[ip++];
                if(typeof(id)=='object'){var v=id['lit'];stack.push(v);continue;}
                ........
                ........            
            }
        }

        function exec(src){ //source code interpreting loop
            .....
            .....
            do{token=nexttoken(); word=token;
                var id=findword(token);
                ......
                ......    
                       if(typeof(n)==='string'||n<=0||n>0){
                        if(compiling)
                            //compilecode('doLit',n);// compile an literal
                            compilecode({lit : n});
                ......
                ......
            }while(error===0&&ntib<tib.length);}

          }
寄件者 scratchlab02
連續執行三次的結果,看來三戰兩勝,以微幅差距領先



底下是積木的XML,可以貼到JForthBlocks的XML編輯區,便會將這次測試所用到的積木載入
<xml xmlns="http://www.w3.org/1999/xhtml">
  <block type="procedures_defnoreturn" notchtype="Top_Bottom_Right" inline="false" x="137" y="55">
    <title name="NAME">TestLiteral</title>
    <statement name="STACK">
      <block type="math_PushNumber" notchtype="TOP_BOTTOM">
        <title name="NUM">5000000</title>
        <next>
          <block type="control_ForNext" notchtype="Top_Bottom_Right" inline="false">
            <statement name="STACK">
              <block type="math_PushNumber" notchtype="TOP_BOTTOM_RIGHT" inline="false">
                <title name="NUM">0</title>
                <value name="NEXTWORD">
                  <block type="math_PushNumber" notchtype="LEFT_RIGHT" inline="false">
                    <title name="NUM">0</title>
                    <value name="NEXTWORD">
                      <block type="stack_2drop" notchtype="LEFT_RIGHT" inline="false"></block>
                    </value>
                  </block>
                </value>
                <next>
                  <block type="math_PushNumber" notchtype="TOP_BOTTOM_RIGHT" inline="false">
                    <title name="NUM">0</title>
                    <value name="NEXTWORD">
                      <block type="math_PushNumber" notchtype="LEFT_RIGHT" inline="false">
                        <title name="NUM">0</title>
                        <value name="NEXTWORD">
                          <block type="stack_2drop" notchtype="LEFT_RIGHT" inline="false"></block>
                        </value>
                      </block>
                    </value>
                  </block>
                </next>
              </block>
            </statement>
          </block>
        </next>
      </block>
    </statement>
  </block>
  <block type="utility_milliseconds" notchtype="LEFT_RIGHT" inline="false" x="89" y="289">
    <value name="NEXTWORD">
      <block type="procedures_callnoreturn" notchtype="LEFT_RIGHT" inline="false">
        <mutation name="TestLiteral"></mutation>
        <value name="NEXTWORD">
          <block type="utility_milliseconds" notchtype="LEFT_RIGHT" inline="false">
            <value name="NEXTWORD">
              <block type="stack_swap" notchtype="LEFT_RIGHT" inline="false">
                <value name="NEXTWORD">
                  <block type="math_Minus" notchtype="LEFT_RIGHT" inline="false">
                    <value name="NEXTWORD">
                      <block type="print_DotS" notchtype="LEFT_RIGHT" inline="false"></block>
                    </value>
                  </block>
                </value>
              </block>
            </value>
          </block>
        </value>
      </block>
    </value>
  </block>
</xml>

2012年9月18日 星期二

"程式"一詞,原來早在清朝道光年間就出現啦!

『馬氏文通』是清朝道光年間的漢語文法書,Jimmy's papa隨興翻了幾頁,忽然一個熟得不能再熟的字眼跳入眼前,就好像站在台北街頭眺望,黑壓壓的人群中,冒出一個熟悉的面孔---"程式"

Jimmy's papa原以為它是電腦時代發明的新詞,原來是個古董啊!!!
寄件者 scratchlab02

2012年9月16日 星期日

Jimmy的樂高積木修行--虎之卷213頁

這個簡單的組件是週六上午給Jimmy的積木練習,讓他了解升降旗或是潛望鏡的升降機制也可以運用螺旋狀的齒輪達成喔!!!
寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02

Jimmy的樂高積木修行--虎之卷的212頁

虎之卷修行讓Jimmy小朋友獲益良多啊!不只減少他看卡通的時間,也培養耐心及解決問題的能力

寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02

2012年9月14日 星期五

Jimmy的樂高積木修行--虎之卷140頁

這台海灘越野機車酷吧!!!
這可是Jimmy與Jimmy's papa一齊動腦筋修修改改微調出來地!想讓大小齒輪能穩穩地上下嵌合而不會轉幾下就"出槌",可不是那麼容易的啦!!!
寄件者 scratchlab02
寄件者 scratchlab02


連上手動發電機就能在Jimmy的床單海灘上奔馳囉!!!

寄件者 scratchlab02

Jimmy的樂高積木修行--虎之卷32頁

這個小組件有點像蒸氣火車頭的傳動機械,Jimmy小朋友覺得有點太簡單而不想做,Jimmy's papa倒是覺得可以拿來作個變化擴充為其他的玩意兒

寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02

2012年9月11日 星期二

JForthBlocks--Linked List

目前JForthBlocks沒有高階的資料結構可用,或許過陣子引用其他現成的積木庫試試看效果如何,不過Jimmy's papa自己動手寫個簡單的連接串列,嗯!還蠻簡單的哩!!!

底下是配置ABCD四個記憶區塊,每個區塊都可儲存下一個連接地址與區塊紀錄的字串內容,ABCD區塊分別對應大野狼,大豬,二豬與豬小弟

不過區塊一多的話,就不能用這個法子,因為要幫每個區塊取名很麻煩!!!
寄件者 scratchlab02

Jimmy的樂高積木修行--虎之卷86頁

這次的修行Jimmy說學到不少東西,因為照圖施工後發覺機器人的動作僵硬,或許是NXT馬達造成的關係,Jimmy's papa就建議Jimmy小朋友拿另一個NXT馬達當手動發電機試試看,果然接上電源後,機器人雙腳開始活動起來,不過又來個問題是,機器人的尾部有點過重,導致尾部著地兩腳騰空,為了增加兩腳的重量,兩腳各裝上接觸感應器及光源感應器, 當作機器人的火箭炮與雷射砲,組裝後試驗結果,機器人果然可以順利的爬行

Jimmy說,他要這隻機器人當機器人小兵的隊長

寄件者 scratchlab02
寄件者 scratchlab02
寄件者 scratchlab02