2017 KMOLab 總結

2017 年的課程在兩個禮拜前結束, KMOLab 也在秋季學期完成了計算機程式與電腦輔助設計實習的課程.

PyQt5 事件導向教起

原本只教導基本 Python3 語法的計算機程式課程, 首度以 PyQt5 的物件導向與事件導向為課程主體, 然後讓學員從中了解各種語法的使用時機. 儘管相較於一般工學院科系的計算機程式課程, 從 C++ 或 C 的內容學起, 有很大的差異, 但是出發點在於: 要讓大一的機械設計工程系學生儘快了解, 電腦程式語言該如何應用, 就必須把握機會, 在學生迷失於各種程式語法之前, 設法讓各學員提起更大的學習動機.

這著險棋因為有 Eric6Qt Designer 的協助, 才值得一試, 從基本視窗按鈕元件與 lineEdit 元件的置入, 到對話框布局的配置, 因為都採用 Qt Designer 的滑鼠互動操作, 相信沒有太大的難度, 但是當 .ui XML 檔案轉為 Python3 原始碼之後, 到配合對話框建立與視窗元件互動的程式邏輯編寫, 就在在考驗著每一位程式初學者的耐性與學習動機.

過程中, 利用 PyQt5 建立了一個簡單的電腦輔助設計實習相關的機電系統控制介面程式, 用來控制 V-rep 鋼珠軌道運動模擬系統的視窗程式, 如下列影片所示, 希望以此為例說明在隨後的課程中, 如何使用 PyQt5 程式, 協助完成構想中的機電資產品設計:

上述這個簡單的視窗程式, 與計算機程式中所建立的簡易計算機程式, 非常類似, 僅使用了按鈕與 lineEdit 元件, 且利用 V-repPython remote API 模式編寫, 最大的教學目標是希望大一計算機程式課程學生, 到了大二上電腦輔助設計實習課程時, 能夠運用 PyQt5 建立監控用的視窗程式, 實際用來控制虛擬的 V-rep 機電系統, 或者是控制根據模擬設計過程所完成的實體系統.

全面採用 Fossil SCM

2017 Fall KMOLab 課程的另外一個特點是, 在兩門課程初期, 利用下列 Python 程式, 為每一位學員建立區域網路 Fossil SCM 主機上的倉儲帳號:

import os
import string
import random
# 使用 Gmail 寄信必須導入下列模組
import smtplib
import re
from email.mime.text import MIMEText  
from email.header import Header

# 用來以亂數建立密碼的函式
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    '''
    source: https://stackoverflow.com/questions/2257441/random-string-generation-with-upper-case-letters-and-digits-in-python
    '''
    return ''.join(random.choice(chars) for _ in range(size))

# 讀取學員名單, 逐一取得學員學號, 學員名單, 檢查點 1/7
student_data = open("2017fall_list/1b.txt").read()
student_list = student_data.splitlines()

# 利用 gmail smtp 功能寄信
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
# 以下必須準備好對應郵件帳號與密碼的外部檔案, 所提供的寄信帳號, 是否可以寄信, 檢查點 2/7
'''
寄信之前必須到 https://www.google.com/settings/security/lesssecureapps 修改權限, 改為較低安全權限
否則無法使用程式寄信!
'''
# 從外部檔案讀取要用來寄信的 gmail 帳號與密碼
# mail.txt 格式為: 電子郵箱,對應密碼, 以逗點隔開, 檢查點 3/7
email_data = open("z:/2017fall/mail.txt").read()
email, email_password= email_data.split(",")
print(email, email_password)
# 是否登入所提供寄信的電子郵箱, 4/7
server.login(email, email_password)
# 不同課程名稱, 與對應主機名稱, 必須配合修改 5/7
course_title = "計算機程式"
fossil_server = "cpb.kmol.info"

for student_num in student_list:
    username = student_num
    repository = username + '.fossil'
    # 利用所提供的字串, 以亂數組成六個字元的密碼
    password = id_generator(6, "23456789abcdef")
    print(student_num, ", " , password)

    # 執行 dos command 指令, 建立倉儲
    os.system("fossil init -A " +username + " " + repository)
    print("已經建立倉儲 " + repository)

    # 執行 dos command 指令, 修改使用者密碼
    os.system("fossil user password " + username + " " + password + " -R " + repository)
    print("已經修改密碼")

    # 利用 Gmail 寄信, 告知各學員倉儲連結與帳號密碼
    # 每一位學員收到的 output 都從這裡 reset
    output = ""
    # 若學號欄為空, 則不寄信
    if student_num != "":
        # output 為寄給每一位學員的資料表格
        mail_content = student_num+' 您好: 

您在 '+course_title+' 課程中的區域網路倉儲: https://'+fossil_server+'/'+student_num+'

' mail_content += '管理帳號為:'+ student_num + '
管理密碼為: '+ password+'

' print(student_num) print(mail_content) # 至此 mail_content 已經確定 # 在測試與實際寄送資料, 也必須配合修改, 檢查點 6/7 receiver_email = student_num + "@gm.nfu.edu.tw" # 測試用 #receiver_email = student_num+"@mde.tw" # 列出收信人 email 位址 #print(receiver_email) #message= MIMEText(mail_content,'plain','UTF-8') # 以 html 格式寄信 message= MIMEText(mail_content,'html','UTF-8') message['Subject'] = Header(course_title+" Fossil SCM 帳號通知", 'UTF-8') # 可以先不寄信, 確定格式正確後再開啟, 是否實際寄出信件, 檢查點 7/7 server.sendmail("gmail_address", receiver_email, message.as_string()) server.quit()

由於先前的 KMOLab 課程, 都是在第一時間就導入 Github 帳號與用法教學, 好處是無需自行維護實體伺服器, 但是缺點則是 Git 的 Windows client 指令依賴一個大約 200 MB 目錄中的許多套件工具, 與初學者的距離較遠, 而 Fossil SCM 的 client 程式只有一個 6MB 的 fossil.exe 檔案, 且若在進階的計算機程式課程中可以直接利用可攜的 MSYS2 視窗環境自行從 Fossil SCM 網站中下載原始碼, 然後自行編譯出內含 https 協定連線的 fossil.exe, 這可以是一位大一機械設計工程系學生自行利用一個 32 GB USB 3.0 隨身碟, 自行打造 Windows 視窗環境下工具的第一步, 因此才從 2017 Fall 開始決定全面導入 Fossil SCM.

另外一個導入 Fossil SCM 的好處是, 其中大量使用 SQLite 的 SQL 語法存取資料 (因為都是由 D. Richard Hipp 建立), 因此也讓學生有機會及早一窺 SQL 語言的用法.

機電資導向的電腦輔助設計實習

過去的電腦輔助設計實習課程, 頂多只是利用機械類電腦輔助設計套件 (例如: PTC Creo, Solidworks, Autodesk Inventor, Siemens NX 或 Simens Solid Edge 等) 建立相關零組件, 或者利用 PTC Creo 應用程式延伸介面中的 Pro/Web.Link 程式架構, 直接在嵌入的 Internet Explorer 瀏覽器中, 進行 Javascript 的程式化參數零組件應用, 雖然可以利用瀏覽器中的 html 表單, 達到設計流程中的網際客製化, 但是隨著 Onshape 在 2015 年起提供教育界免費使用後, 連可以簡單放入隨身碟, 以網路取得認證的 PTC Creo 容量都超過 5GB 來看, 都嫌笨重, 更不用提其他無法輕易放入隨身碟中的固定式機械類電腦輔助設計套件, 在輕薄短小, 敏捷協同過程中所帶來的不便.

因為在一般的機械概念設計初期, 通常需要進行機構的結構設計, 而這些套件卻無法簡易讓初級使用者快速驗證目標機構的可行性, 因此在 2013 年 Solvespace 開源之後, KMOLab 就開始在課程中導入, 動機與採用 Fossil SCM 相同, 使用者可以利用 MSYS2 可攜套件, 在 Windows 10 64 位元環境中, 自行從 C++11 的原始碼編譯出所需的 3.0 版 solvespace.exe, 含執行時所需的 libwinpthread-1.dll 與 d3dcompiler_43.dll, 總容量大約只有 20 MB, 若採用官方以 Visual Studio 編譯的 2.0 版 solvespace.exe, 更只需要約 7 MB, 直接放在隨身碟中, 使用非常方便.

電腦輔助設計實習課程中結合 SolvespaceV-rep 的過程可以參考下列影片:

至於結合 Solvespace, OnshapeV-rep 的教學影片範例如下:

而實際從設計, 模擬到實體機電系統測試的範例可參考:

從概念轉為知識, 用知識解題

最後, 在 2017 Fall 教學的最後階段, KMOLab 還導入了一項源自法國的 C-K 設計理論, C 代表 Concept 指設計過程中的許多概念, 而 K 則是 Knowledge, 也就是設計者已經掌握, 可以用來解決問題的知識, 這個設計理論中最重要的概念是, 沒有所謂愚笨或可笑的設計概念, 而應當視為閱聽者在面對這些概念時, 還不具備實現這些概念所需的知識.

簡言之, C-K 設計理論 闡述設計是可以被教導的, 而且可以引用數學原理, 從概念中衍生出更多概念, 將概念轉化為知識, 利用知識推演出更多知識, 同時, 許多知識隨著時空環境的變化, 也可能會轉為概念, 因為已經無法解決當時所面臨的實際問題.

C-K 設計理論 的引領下, 任何一個從事機械設計流程的成員, 都不再會因為掌握一些片段知識而自滿, 因為若這些知識沒有持續改進, 未來將無法用來解題, 同時, 初學者也不會因為在協同設計過程中, 擔心提出所謂離譜可笑的概念, 因為理論上所有的概念都可能被實現, 就好像對於一個在數學理論上擁有無限大知識的成員, 就學理上, 根本沒有解決不了的問題, 呵呵, 這確實有些抽象.

歡迎各位來到 2018 年, 一個深度學習與智慧口號滿天的歷史元年, 我們有整整一年的時間來探討, 大家所擁有的所謂深度學習與智慧機械, 到底是概念還是真能用來解決問題的知識.