傅 騫 羅開(kāi)亮 陳 露
(北京師范大學(xué) 教育技術(shù)學(xué)院,北京 100875)
面向創(chuàng)客教育普及的Mixly圖形化編程工具開(kāi)發(fā)*
傅 騫 羅開(kāi)亮 陳 露
(北京師范大學(xué) 教育技術(shù)學(xué)院,北京 100875)
創(chuàng)意電子是創(chuàng)客教育的重要載體,但由于受技術(shù)門(mén)檻的限制,它的課程開(kāi)設(shè)給教師帶來(lái)了極大的挑戰(zhàn)。文章首先對(duì)現(xiàn)有的創(chuàng)意電子圖形化編程工具進(jìn)行了深入分析對(duì)比,然后描述了一個(gè)新的圖形化編程系統(tǒng)Mixly(米思齊)的實(shí)現(xiàn)。具體來(lái)說(shuō),Mixly包括軟件的系統(tǒng)架構(gòu)和關(guān)鍵技術(shù)的實(shí)現(xiàn)兩部分內(nèi)容,并在最后通過(guò)用戶的反饋數(shù)據(jù)驗(yàn)證了該軟件的價(jià)值。
創(chuàng)客教育;Arduino;圖形化編程;Mixly
隨著社會(huì)生產(chǎn)力的不斷發(fā)展,重復(fù)性的機(jī)械勞動(dòng)將更多地被機(jī)器所取代,未來(lái)社會(huì)更需要?jiǎng)?chuàng)新型人才;與此同時(shí),社會(huì)物質(zhì)水平不斷提高,人類在物質(zhì)得到滿足的條件下將越來(lái)越多地追求精神層面的滿足。在這樣的大背景下,以激發(fā)學(xué)生“享受創(chuàng)新與分享的快樂(lè)”為目標(biāo)的“創(chuàng)客教育”在全球迅速流行開(kāi)來(lái),在我國(guó)也得到了迅猛的發(fā)展[1]。
為了實(shí)現(xiàn)讓學(xué)生“享受創(chuàng)新與分享的快樂(lè)”這一目標(biāo),眾多研究者設(shè)計(jì)了多種創(chuàng)客教育的開(kāi)展形式,如基于Scratch的創(chuàng)意編程、基于Arduino的創(chuàng)意電子、基于AppInventor的創(chuàng)意APP、基于3D打印的創(chuàng)意設(shè)計(jì)以及各類機(jī)器人相關(guān)課程等。其中,創(chuàng)意電子因課程開(kāi)設(shè)簡(jiǎn)單、容易引起興趣、方便激發(fā)創(chuàng)新和易于成果展示等特點(diǎn),成為了當(dāng)前創(chuàng)客教育的主流。創(chuàng)意電子課程活動(dòng)一般由物理搭建和程序編寫(xiě)兩部分組成,開(kāi)設(shè)年級(jí)橫跨小學(xué)三年級(jí)至高中二年級(jí)。在當(dāng)前的技術(shù)條件下,物理搭建已非課程的難點(diǎn),而程序編寫(xiě)部分往往因其過(guò)于復(fù)雜容易使學(xué)生產(chǎn)生認(rèn)知負(fù)荷,從而影響創(chuàng)意的激發(fā)與實(shí)現(xiàn)。因此,創(chuàng)客教育中的創(chuàng)意電子課程需要更好的編程工具。
為了給創(chuàng)意電子課程提供更好的編程工具,各類研究者、開(kāi)源團(tuán)體和商業(yè)公司都付出了大量的努力。當(dāng)前創(chuàng)意電子課程均以Arduino為基礎(chǔ),所以目前的這些編程工具都為Arduino編程服務(wù)。創(chuàng)意電子課程主要分為基于文本的課程和基于圖形的課程兩大類,前者有Arduino IDE、SMeshStudio等,后者有Ardublock、BlocklyDuino等。創(chuàng)客教育關(guān)注的是技術(shù)的整合創(chuàng)新而非知識(shí)的簡(jiǎn)單復(fù)制,所以創(chuàng)客教育強(qiáng)調(diào)學(xué)生學(xué)習(xí)使用基于圖形的編程方式,即圖形化編程,而非學(xué)習(xí)編程語(yǔ)法。隨著研究的深入,教育工作者認(rèn)識(shí)到編程的核心是邏輯和思維、是想象力和創(chuàng)造力,而這正是圖形化編程的核心思想,也是未來(lái)非專業(yè)人士編程的主流。當(dāng)前已經(jīng)出現(xiàn)不少面向Arduino開(kāi)發(fā)的主流編程工具,主要有以下三類:
1 Ardublock
Ardublock[2]是Arduino官方編程環(huán)境認(rèn)可的第三方軟件,基于Java開(kāi)發(fā),必須依附在Arduino軟件下運(yùn)行。區(qū)別于Arduino的文本式編程環(huán)境,Ardublock以搭建圖形化積木的方式編程。這種方式會(huì)使編程的可視化和交互性加強(qiáng),并且編程門(mén)檻降低,使沒(méi)有編程經(jīng)驗(yàn)的人也可以嘗試給Arduino控制器編寫(xiě)程序。
Ardublock是目前功能比較完善的一款A(yù)rduino圖形化編程工具,不僅集成了邏輯控制、引腳操作、數(shù)學(xué)運(yùn)算、變量定義、通訊等基本功能,也包括第三方公司的傳感器拓展模塊。如圖1所示,這是可調(diào)燈的Ardublock圖形化代碼,可以使燈的亮度隨著用戶按鈕的轉(zhuǎn)動(dòng)而變化。
圖1 Ardublock界面
2 BlocklyDuino
BlocklyDuino[3]是一款基于網(wǎng)頁(yè)的Arduino圖形化編程工具,基于HTML 5技術(shù)開(kāi)發(fā),底層使用Google的Blockly圖形化編程框架,同樣需要使用官方的Arduino IDE軟件。和Ardublock類似,它也是以圖形化積木搭建的方式編程,且支持使用瀏覽器編程。但當(dāng)需要把編好的程序上載到Arduino開(kāi)發(fā)板上時(shí),用戶還必須運(yùn)行一個(gè)Web服務(wù)器來(lái)輔助完成此工作,所以使用起來(lái)并不是很方便。
目前,BlocklyDuino功能簡(jiǎn)單,僅包含基本的邏輯控制、數(shù)學(xué)運(yùn)算、文本處理、變量定義、函數(shù)定義、管腳控制等,也加入了一些Grove傳感器模塊,但遠(yuǎn)沒(méi)有Ardublock豐富,缺乏對(duì)于Arduino編程必須的數(shù)學(xué)映射函數(shù)、三角函數(shù)等模塊,不支持變量的數(shù)據(jù)類型,不支持中文,因此其應(yīng)用的范圍有限。如圖2所示,這是可調(diào)燈的BlocklyDuino圖形化代碼,與圖1實(shí)現(xiàn)的功能相同,即燈的亮度可隨著用戶按鈕的轉(zhuǎn)動(dòng)而變化。
圖2 BlocklyDuino界面
3 mBlock
Scratch是當(dāng)前最完善的圖形化編程工具。Scratch在設(shè)計(jì)之初并沒(méi)有考慮與硬件結(jié)合的問(wèn)題,隨著電腦軟件有感知環(huán)境和控制硬件的需求,S4A的技術(shù)隨之而生,其本質(zhì)是讓硬件設(shè)備和Scratch程序之間快速地通過(guò)串口進(jìn)行數(shù)據(jù)交換,從而達(dá)到與Arduino交互的效果。但這本質(zhì)上并不是對(duì)Arduino編程,所以一旦離開(kāi)了Scratch,板子便停止工作。為了讓Scratch更好地控制Arduino,并對(duì)Arduino實(shí)現(xiàn)真正意義上的編程,很多團(tuán)體都對(duì)Scratch進(jìn)行了改進(jìn),比較有代表性的是mBlock[4]——它是Scratch的非官方改進(jìn)版本,由國(guó)人開(kāi)發(fā),并同樣基于Flash客戶端技術(shù)開(kāi)發(fā),支持中文版,為大部分國(guó)人用戶提供了便利。
mBlock 2.2是最新版本,既可以在類似于S4A的串口交互模式下工作,也可以實(shí)現(xiàn)程序的編譯上載,且支持Arduino的多塊主控板,系統(tǒng)功能比較強(qiáng)大。但因Scratch擴(kuò)展的復(fù)雜性,在Arduino硬件控制功能的支持上還不是很完善,只能實(shí)現(xiàn)最基本的管腳控制功能,也無(wú)任何第三方擴(kuò)展模塊可用。如圖3所示,這是mBlock版本的可調(diào)燈代碼。
圖3 mBlock界面
4 總結(jié)
上述三個(gè)Arduino圖形化編程工具雖各具特色,但仍無(wú)法滿足實(shí)際課程的需要。
(1)編程功能不完善。圖形化編程工具的定位是替換原有復(fù)雜的文本編程方式,但上述3個(gè)軟件都無(wú)法較好地滿足此要求,這就限制了用戶創(chuàng)意的發(fā)揮和實(shí)現(xiàn)。其中亟待增加的功能是硬件中斷的處理、函數(shù)定義的引入及使用、必備數(shù)學(xué)函數(shù)的加入、數(shù)據(jù)類型的引入和使用等。
(2)系統(tǒng)擴(kuò)展性不強(qiáng)。上述3個(gè)軟件都沒(méi)有考慮系統(tǒng)的可擴(kuò)展性,不支持用戶自定義新的模塊供后期使用,因此將限制用戶創(chuàng)意的發(fā)揮,工作難以復(fù)用,也難以完成復(fù)雜的創(chuàng)意應(yīng)用。
(3)不便于二次開(kāi)發(fā)。上述3個(gè)軟件都屬于開(kāi)源免費(fèi)軟件,它們的生命力與其二次開(kāi)發(fā)能力密切相關(guān)。Ardublock基于OpenBlocks框架開(kāi)發(fā),mBlock基于Adobe Air技術(shù)開(kāi)發(fā),這兩類技術(shù)的使用群體有限,從而限制了它們的二次開(kāi)發(fā)范圍。BlocklyDuino采用Google的Blockly框架,全部采用JavaScript語(yǔ)言實(shí)現(xiàn),所以開(kāi)發(fā)群體較大,具有較好的發(fā)展前途;但它須用Python實(shí)現(xiàn)Web與Arduino IDE的交互,因此開(kāi)發(fā)難度依然較大。
綜上所述,創(chuàng)客教育需要更好的圖形化編程工具,Mixly(米思齊)因此應(yīng)運(yùn)而生。考慮到系統(tǒng)開(kāi)發(fā)的方便性、擴(kuò)展性以及用戶使用的簡(jiǎn)單性,Mixly在系統(tǒng)架構(gòu)上使用混合架構(gòu)模式,即客戶端應(yīng)用和網(wǎng)頁(yè)應(yīng)用相結(jié)合的模式:在圖形化編程框架上采用Blockly核心的網(wǎng)頁(yè)結(jié)構(gòu);在技術(shù)上則采用基于Java的客戶端編程技術(shù),以便于用戶上載編譯。Mixly系統(tǒng)架構(gòu)如圖4所示。
圖4 Mixly系統(tǒng)架構(gòu)
Mixly基于Google的Blockly[5]圖形化編程框架進(jìn)行了二次開(kāi)發(fā),在核心層完成了變量類型定義和模塊的生成功能,然后針對(duì)Arduino硬件編程的需要加入大量的硬件控制和傳感器、執(zhí)行器相關(guān)的交互功能,以達(dá)到圖形化編程完美操控Arduino的效果;再使用Java的JavaFX技術(shù),在客戶端顯示Blockly網(wǎng)頁(yè)并實(shí)現(xiàn)網(wǎng)頁(yè)和客戶端功能的交互。當(dāng)用戶完成基于網(wǎng)頁(yè)的圖形化編程后,客戶端將其轉(zhuǎn)換成Arduino代碼,并調(diào)用Arduino官方IDE完成程序的編譯和上傳功能。
Mixly系統(tǒng)架構(gòu)綜合了網(wǎng)頁(yè)開(kāi)發(fā)和Java客戶端開(kāi)發(fā)技術(shù),在開(kāi)發(fā)上同時(shí)享受網(wǎng)頁(yè)開(kāi)發(fā)的方便性和客戶端開(kāi)發(fā)的簡(jiǎn)單性,在應(yīng)用上同時(shí)享受網(wǎng)頁(yè)應(yīng)用的靈活性和客戶端應(yīng)用的強(qiáng)大性,從而使Mixly的圖形化編程模塊隨同用戶主控板選擇的變化而變化成為可能,并使程序的編譯和上傳更加方便。隨著Mixly JavaFX部分功能的完善,日后Mixly的改進(jìn)工作將全部集中于網(wǎng)頁(yè),而網(wǎng)頁(yè)無(wú)需編譯就可以直接使用,所以基于該架構(gòu)的Mixly的后續(xù)升級(jí)將會(huì)變得非常方便。Mixly的主界面如圖5所示,這是Mixly的可調(diào)燈代碼,但使用了按鍵調(diào)光方式。
圖5 Mixly主界面
為了完成Mixly整體的開(kāi)發(fā),本研究團(tuán)隊(duì)對(duì)其中的圖形化編程呈現(xiàn)、網(wǎng)頁(yè)與客戶端應(yīng)用的融合、Arduino數(shù)據(jù)類型實(shí)現(xiàn)、可擴(kuò)展模塊管理這四個(gè)關(guān)鍵技術(shù)進(jìn)行了重點(diǎn)研究。
1 圖形化編程呈現(xiàn)
為了實(shí)現(xiàn)普適的圖形化編程效果,Mixly采用了Google的Blockly圖形化編程框架。Blockly 是Google公司在2012年發(fā)布的完全可視化編程語(yǔ)言,類似于麻省理工學(xué)院的Scratch,用戶可以通過(guò)搭積木的方式用一塊塊圖形模塊拼出應(yīng)用程序。每個(gè)圖形模塊是一個(gè)代碼塊,用戶可將它們拼接起來(lái),創(chuàng)造出簡(jiǎn)單功能,然后將一個(gè)個(gè)簡(jiǎn)單功能進(jìn)行組合,構(gòu)建出一個(gè)復(fù)雜程序。
Blockly是一個(gè)免費(fèi)開(kāi)源程序,它的定位就是讓開(kāi)發(fā)人員進(jìn)行二次開(kāi)發(fā)從而滿足不同領(lǐng)域的需要,包括教育工具的開(kāi)發(fā)、機(jī)器人應(yīng)用的開(kāi)發(fā)等,這剛好符合了Mixly的需求。Blockly的核心功能是提供圖形模塊的定義機(jī)制和圖形模塊對(duì)應(yīng)代碼塊的生成方式,使開(kāi)發(fā)人員可以很方便地基于Blockly創(chuàng)建自己的模塊,并把想生成的代碼與圖形模塊進(jìn)行綁定。
模塊的定義和代碼的生成是使用Blockly生成自定義模塊最關(guān)鍵的兩步。其中,模塊的定義就是定義模塊的長(zhǎng)相,使用“Blockly.Blocks['模塊名稱']”來(lái)定義;代碼的生成就是定義圖形模塊所對(duì)應(yīng)的代碼塊,是圖形模塊的真面目,使用“Blockly.Arduino.模塊名稱”來(lái)定義。由于Blockly的簡(jiǎn)單可行,Mixly所有圖形模塊的呈現(xiàn)與代碼的生成工作便交給了Blockly,因此可以說(shuō)Blockly 是Mixly軟件的核心與基礎(chǔ)、是Mixly圖形化編程的關(guān)鍵。
2 網(wǎng)頁(yè)與客戶端應(yīng)用的融合
由于Blockly的所有代碼都使用JavaScript腳本語(yǔ)言編寫(xiě),其生成的圖形化模塊只能在網(wǎng)頁(yè)中運(yùn)行,而Arduino所使用的編程語(yǔ)言是基于C/C++的,Arduino控制器要運(yùn)行程序需要經(jīng)過(guò)代碼的編譯和上傳兩個(gè)過(guò)程,因此,如果通過(guò)瀏覽器編程,需要搭建Web服務(wù)器來(lái)進(jìn)行編譯和上傳。但搭建服務(wù)器對(duì)普通用戶來(lái)說(shuō)過(guò)于繁雜,故用戶更傾向于使用完全綠色免安裝的程序,這就要求Mixly必須是一個(gè)本地應(yīng)用?;诖耍琈ixly引入了JavaFX技術(shù)來(lái)實(shí)現(xiàn)網(wǎng)頁(yè)及客戶端應(yīng)用的融合。
JavaFX完全基于Java語(yǔ)言,具有很好的跨平臺(tái)性。最重要的是,JavaFX在開(kāi)發(fā)互聯(lián)網(wǎng)應(yīng)用程序上有獨(dú)特的優(yōu)勢(shì),可以很好地將Blockly整合到本地化應(yīng)用中。有了JavaFX,Mixly便可以在本地化的應(yīng)用中通過(guò)JavaFX.scene.web.WebView類內(nèi)嵌一個(gè)Web瀏覽器,用于呈現(xiàn)Blockly的圖形化功能,同時(shí)JavaFX的JavaFX.scene.web.WebEngine類可以很好地與JavaScript進(jìn)行交互。此外,由于JavaFX是基于Java的,用戶能夠利用Java對(duì)生成的C/C++代碼進(jìn)行編譯和上傳,這樣就很好地達(dá)到了本地化應(yīng)用與Blockly的融合。
3 Arduino數(shù)據(jù)類型實(shí)現(xiàn)
Blockly本身并沒(méi)有數(shù)據(jù)類型的概念,所以官方的Blockly只能生成JavaScript、Python之類的無(wú)數(shù)據(jù)類型語(yǔ)言。但Arduino程序是建立在C/C++語(yǔ)言基礎(chǔ)之上的,是強(qiáng)類型語(yǔ)言,因此Mixly必須在底層加入數(shù)據(jù)類型定義功能。
多種變量類型的支持乃建立在Blockly源碼的基礎(chǔ)上。Blockly源碼原本只支持一種類型的變量,但Mixly在其基礎(chǔ)上進(jìn)行了修改和升級(jí),使其能夠支持更多類型的變量。具體來(lái)說(shuō),一方面需要修改Blockly.Blocks['variables_declare']塊,以增加下拉列表方式表示的數(shù)據(jù)類型:
this.appendTitle(new Blockly.FieldDropdown([['long','long'],['float','float'],…]),"TYPE")
另一方面需要相應(yīng)的Blockly.Arduino.variables_declare函數(shù),以實(shí)現(xiàn)數(shù)據(jù)類型的獲?。?/p>
var dropdown_type = this.getTitleValue('TYPE');
Blockly.Arduino.variableTypes_[varName] = dropdown_type;
經(jīng)過(guò)上述改進(jìn),Mixly可以支持整數(shù)、小數(shù)、布爾、字符串這4種類型,這使得Mixly的功能比其它Arduino圖形化軟件更強(qiáng)大,成為了目前Arduino圖形化編程工具中功能最全的軟件。
4 可擴(kuò)展模塊管理
為了讓Mixly用戶更好地體現(xiàn)自己的價(jià)值,實(shí)現(xiàn)工作共享,本研究團(tuán)隊(duì)在Mixly中加入了可擴(kuò)展模塊管理功能,體現(xiàn)出一定的生態(tài)性,使軟件變得開(kāi)放和自由。該功能具體體現(xiàn)在用戶可以編寫(xiě)自己的庫(kù),進(jìn)行“導(dǎo)出庫(kù)”和“導(dǎo)入庫(kù)”操作,使用戶可以編寫(xiě)自己的圖形模塊并整合到軟件中去。
本研究采用動(dòng)態(tài)改變JavaScript的方法實(shí)現(xiàn)生態(tài)性。在程序啟動(dòng)時(shí),系統(tǒng)會(huì)自動(dòng)獲取用戶自定義的所有庫(kù)文件,讀取庫(kù)文件中的數(shù)據(jù),并將數(shù)據(jù)存入到.js文件中,以達(dá)到持久化的目的,使軟件啟動(dòng)即可看到自定義的庫(kù)。
Mixly初始版本開(kāi)發(fā)完成后,先后在新疆生產(chǎn)建設(shè)兵團(tuán)第二師華山中學(xué)、黑龍江省蘭西縣崇文實(shí)驗(yàn)學(xué)校、北京市石景山區(qū)楊莊中學(xué)、河南溫縣及廣東佛山等地投入使用。為了進(jìn)一步調(diào)研用戶的體驗(yàn)情況,以便為后期改進(jìn)設(shè)計(jì)提供建設(shè)性的意見(jiàn),本研究隨機(jī)選取13位學(xué)習(xí)者作為研究對(duì)象進(jìn)行問(wèn)卷調(diào)查和訪談,且實(shí)驗(yàn)過(guò)程中學(xué)習(xí)者全程使用Mixly作為編程工具開(kāi)展學(xué)習(xí)活動(dòng)。
表1 學(xué)習(xí)者對(duì)Mmixly的評(píng)價(jià)信息統(tǒng)計(jì)表
學(xué)習(xí)活動(dòng)開(kāi)始之前,本研究對(duì)學(xué)習(xí)者進(jìn)行了前測(cè)調(diào)研,通過(guò)問(wèn)卷的形式調(diào)查學(xué)習(xí)者是否曾接觸過(guò)編程課程或者編程軟件,以觀察學(xué)習(xí)者在使用的過(guò)程中是否存在一定的認(rèn)知負(fù)荷差異。結(jié)果顯示,有11名學(xué)習(xí)者曾接觸過(guò)編程課程、9名學(xué)習(xí)者曾接觸過(guò)其它編程軟件,這些編程軟件主要包含C語(yǔ)言、Borlandc、Scratch等。學(xué)習(xí)活動(dòng)結(jié)束后,從兩個(gè)方面對(duì)13位學(xué)習(xí)者進(jìn)行用戶體驗(yàn)調(diào)查:一是學(xué)習(xí)者對(duì)Mixly的整體評(píng)價(jià),二是學(xué)習(xí)者對(duì)Mixly的界面、模塊、參數(shù)等方面的體驗(yàn)評(píng)價(jià)。所得調(diào)查結(jié)果如表1所示。
Mixly作為一個(gè)開(kāi)源免費(fèi)軟件,現(xiàn)已發(fā)布至0.96版,且還在持續(xù)開(kāi)發(fā)中,所有用戶都可以從創(chuàng)客教育實(shí)驗(yàn)室(http://maker.bnu.edu.cn)處免費(fèi)下載使用。從當(dāng)前創(chuàng)客教育群體的反應(yīng)來(lái)看,效果相當(dāng)不錯(cuò)。Mixly的使用人數(shù)正在逐步增加,其中既有中小學(xué)教師和學(xué)生,也有大學(xué)教師和學(xué)生。大家一致認(rèn)為,Mixly的出現(xiàn)大大降低了創(chuàng)客教育相關(guān)課程的開(kāi)課門(mén)檻,激發(fā)了學(xué)生更多的創(chuàng)意與分享熱情。相信在大家的共同努力下,Mixly將會(huì)成為業(yè)界最好用且最流行的Arduino圖形化編程工具,并為創(chuàng)客教育的發(fā)展作出應(yīng)有的貢獻(xiàn)。
[1]傅騫,王辭曉.當(dāng)創(chuàng)客遇上STEAM教育[J].現(xiàn)代教育技術(shù),2014,(10):37-42.
[2]陳有志.ArduBlock:物理世界與虛擬世界的橋梁[J].中國(guó)信息技術(shù)教育,2013,(12):76-78.
[3]BlocklyDuino.BlocklyDuino is a web-based visual programming editor for arduino[EB/OL].
[4]MakeBlock.Using scratch-style coding to program arduino robots inspired by scratch[EB/OL].
[5]Google.Blockly is a library for building visual programming editors[EB/OL].
Development of a Graphical Programming Tool Named Mixly for Popular Maker Education
FU Qian LUO Kai-liang CHEN Lu
(School of Education Technolog,Beijing Normal University,Beijing,China 100875)
Although Arduino is the important media of maker education,the course setting of Arduino poses great challenge to teachers duing to technical threshold limitation.After analyzing and comparing the existing graphic programming tools for Arduino deeply,a new graphical programming system name Mixly was described here.The value of Mixly that were constituted by the system framework and key technologies implementation was verified by the users’ feedback data.
maker education; Arduino; graphical programming; Mixly
小米
G40-057
A 【論文編號(hào)】1009—8097(2016)01—0120—07
10.3969/j.issn.1009-8097.2016.01.018
本文受北京市教育科學(xué)“十二五”規(guī)劃2015年度課題“面向北京市中小學(xué)創(chuàng)客教育的教學(xué)體系研究——以創(chuàng)意電子教育為例”(項(xiàng)目編號(hào):CJA15234)資助。
傅騫,副教授,博士,研究方向?yàn)槲锫?lián)網(wǎng)技術(shù)及教育應(yīng)用、創(chuàng)客教育支持生態(tài)建設(shè),郵箱為fredqian@bnu.edu.cn。
2015年7月31日