# C01: Ternary ###### tags: `sysprog2017` ## 預期目標 * 準備 GNU/Linux 開發工具 * 學習使用 HackMD 和 LaTeX * 學習使用 Git 與 GitHub * 掌握數值系統 * 技術報告寫作練習 ## 技術報告寫作 * 為什麼你該在大學時代學好技術報告撰寫呢? * 在這個資訊爆炸的時代裡,資訊接受者往往習慣於以快速瀏覽的方式搜尋所要的資訊...文字可能是最容易讓資訊接受者「失去耐性」的一種資訊型態。 * 一篇技術報告即使文字內容非常有內涵,如果不能有分明的段落,讓讀者一開始便能快速、清晰地掌握報告內涵,恐怕讀者根本不會有意願或耐性深入閱讀這份報告。 :::info 「你我在 21 世紀都該以專業獲利 (技術授權、商業模式、顧問諮詢),並非一味出賣勞務」 -- [2017 年秋季課程簡介和注意須知](https://docs.google.com/presentation/d/1-6ZlaL3vd-a54omTpcTQPudbpxz-eqisyd7PY4e_Ctc/edit#) ::: * 平行式思考可讓寫作變得更有效率,作者不必等到整篇文章構思完成後才開始寫作,而可以先把構思比較成熟、材料比較完整的文字段落先行記載下來,這時也先不必花太多時間顧慮用字遣詞,或者文章的組織與結構。 * 這些文字段落開始也許十分零散,但是累積足夠內容後,作者便可以利用電腦軟體將全文從頭編輯一次,包括修飾所用詞句,增添不足的內容,刪除重複或不相關的內容,調整文字段落順序,組織文章的結構,賦予不同文字段落應有的格式等。 * 作者可以一次又一次地重頭編輯整篇文章,每次編輯都像是為文章「穿衣」,都可能有新的想法或素材為文章作更新,每次編輯對於文字內容和文章結構或格式的講究也越加細膩,直到交卷期限到了才停止。 * 一般習慣上技術報告或論文都有以下的基本結構: * 摘要簡介 * 文獻回顧 * 研究方法 * 研究結果 * 結論與討論 * 章節標題訂定一個重要的原則是要有「敘述性」,讓讀者能夠望文生義,而對章節內容有所期待。像是「第一章 簡介」、「第二章 文獻回顧」這樣的標題可能太過籠統,「第一章 多重障礙者運動機能訓練科技輔具研發背景與目的」、「第二章 科技輔具研究文獻探討」便比較有敘述性。 * 在建立研究的動機、凸顯此研究問題的重要性時,常需引用文獻、數據客觀地支持作者的論點。在技術報告中文獻的引用有許多功能,除了建立研究的整體動機、凸顯此問題的重要性之外,文獻回顧也可對此領域的研究分門別類作一整體瞭解,除了避免重複別人已經做過的研究工作外,更可以具體指出哪些部分研究還沒有作,或是目前作得不夠完整,有繼續研究的必要。另外在敘述研究方法時,也常需引用研究文獻中既有的方法或數據,或使用文獻中的例子重複執行,與之比對,證實本研究之效果 * 參考資料: [技術報告撰寫的基本原則](http://designer.mech.yzu.edu.tw/articlesystem/article/compressedfile/(2004-06-21)%20%e6%8a%80%e8%a1%93%e5%a0%b1%e5%91%8a%e6%92%b0%e5%af%ab%e7%9a%84%e5%9f%ba%e6%9c%ac%e5%8e%9f%e5%89%87.aspx?ArchID=639), [Webcache](http://webcache.googleusercontent.com/search?q=cache:MS991iGLlMIJ:designer.mech.yzu.edu.tw/article/articles/course/file/(2004-06-21)%2520%25A7%25DE%25B3N%25B3%25F8%25A7i%25BC%25B6%25BCg%25AA%25BA%25B0%25F2%25A5%25BB%25AD%25EC%25ABh.pdf+&cd=1&hl=en&ct=clnk&gl=tw) ## Balanced Ternary * 回顧第 1 週課程 [重新理解數值](https://hackmd.io/s/BkRKhQGae) 的「電腦不是只有二進位」一節,提及了 [Ternary numeral system](https://en.wikipedia.org/wiki/Ternary_numeral_system) 和 [Balanced ternary](https://en.wikipedia.org/wiki/Balanced_ternary) * 留意 Addition, subtraction and multiplication and division 的章節 ![](https://i.imgur.com/S96fuNs.jpg) * [Binary to trinary conversion and vice versa](https://forum.iota.org/t/binary-to-trinary-conversion-and-vice-versa/201) * 工具: [Base Converter](https://www.cut-the-knot.org/binary.shtml) ## 測試 Balanced Ternary * 在 GNU/Linux 環境中,開啟 (虛擬) 終端機,輸入並執行以下命令: ```shell $ mkdir -p ~/workspace $ cd ~/workspace $ git clone https://github.com/sysprog21/balanced-ternary $ cd balanced-ternary $ make ``` * 預期會在 `~/workspace` 目錄看到新建立的執行檔 `b3k`,測試方式如下: ```shell echo 0 | ./b3k ``` 預期輸出為: ``` ┌───┐ │ │ └───┘ ``` * 將上一步驟的 `0` 更換為 `27`, `-27`, `9`, 和 `-9`,觀察其輸出: (或者執行 `make check` 命令) ``` ├───┐ ┌┬──┐ ┌───┐ ┌───┐ │ │ │ │ ┤ │ ├ │ └───┘ └───┘ └───┘ └───┘ (27) (-27) (9) (-9) ``` 再對照下圖,思考這些數值在 balanced ternary 表示的關聯 ![](https://i.imgur.com/phR7VSX.jpg) ## Balanced Ternary 教學影片 (務必詳閱) * [Number Systems: Ternary](https://www.youtube.com/watch?v=vOyiHMa-mtQ) * [Non-Binary Computing](https://www.youtube.com/watch?v=TFTK074nG_M) * [Full Adder](https://www.youtube.com/watch?v=v7XxIjv_mUc) * [Modulo 3 Sum and Product Functions](https://www.youtube.com/watch?v=cgcXoCnyZhQ) * [Ripple Adder in Binary and Ternary Logic](https://www.youtube.com/watch?v=TfJxAb0owj8) ## 作業要求 1. 研讀 Balanced Ternary,並依據 [課前測驗參考解答: Q1](https://hackmd.io/s/ByzoiggIb) 的風格和探討方式,涵蓋以下: * 解釋 Balanced Ternary 原理; * Balanced Ternary 的設計要解決什麼類型的問題,需要詳述實際應用案例 (如 IOTA/Tangle)。提示:從算術表達的精準度和空間使用效率去探討; * 針對特定的領域 (如加密貨幣),列出在 GitHub 裡頭可找到的應用案例,不僅列出程式碼,還要解說; * 在研究的過程中,應該會對既有工具進行修改或者重新開發 (不限程式語言),也該一併指出,程式碼應該維護在 GitHub 上; 2. 建立新的 HackMD 頁面,並列於 [作業區](https://hackmd.io/s/HyxQTaZj-)。撰寫數學式應該全部[用 LaTeX 表示](https://hackmd.io/s/B1RwlM85Z),不該用圖片 3. 在 GitHub 上 fork [balanced-ternary](https://github.com/sysprog21/balanced-ternary),針對你的分析需求,進行必要的修改 * 提交修改前,務必確認詳讀 [如何寫好 Git Commit Message](https://blog.louie.lu/2017/03/21/%E5%A6%82%E4%BD%95%E5%AF%AB%E4%B8%80%E5%80%8B-git-commit-message/) 4. 繳交截止日期: Oct 8, 2017 * 越早在 HackMD/GitHub 上有動態、越早接受批評檢閱,評分越高