2016/5/19

昕創第一屆APP大賽心得

這是我第一次參加團隊撰寫APP的比賽,學到了不少東西,以下是一些心得跟大家分享:
一、如果團隊沒有任何討論甚至爭執,可能代表大家並沒有認真思考。
    我認為如果經過認真思考後,每個人都會有自己的想法,而各自的想法在討論時,就會產生融合或碰撞,進而得到更全面整合的目標,大家也更有共識去完成那個目標才對;而如果沒有討論和爭執,則可能代表著忍氣吞聲或是沒有全面性的思考,這並不是一件好事。
二、線上協作的心態,是非常重要的。
    像是Git、Trello、Teamviewer等等的一些線上協作平台,除了技術上要如何操作之外,我更認為的是心態。
    心態上,一個是應該把自己的問題當成大家的問題,而大家的問題同時也是自己的問題;又或是自己的解答分享給大家,而他人的答案同時也是拿來參考。
    另一個是要立刻分享自己的狀況,就如同一天到晚FB分享、發噗浪那樣,把CODE當成美食美景分享;針對特別問題,還可以TAG別人請求協助。
    這兩點是我認為這次團隊寫APP當中,我學到最重要的心得,也許這次的結果不是那麼的好,做出來的程式也還有很多地方可以加強,不過我想,這次的經驗真的幫助我不少,也希望分享出來能給大家一些幫助!
完整APP使用示範影片:

以下是一些照片分享:
入圍決賽獎座

組員照


2016/1/11

程式設計常見的幾個原則整理


  • SOLID原則(SRP, OCP, LSP, ISP, DIP)
    • SRP(Single responsibility,單一職責)
      • 定義:一個class應該只有一個需要改變的原因。There should never be more than one reason for a class to change.
      • 白話:一個class只作一件事。
    • OCP(Open-closed,開放封閉)
      • 定義:軟體設計,應該對擴充開放,對修改封閉。Software entities like classes, modules and functions should be open for extension but closed for modifications.
      • 白話:軟體要很容易擴充功能,且擴充時原有的code都不需修改。
    • LSP(Liskov substitution,Liskov替換)
      • 定義:子類必須能夠替換其父類別。Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.
      • 白話:設計父類別時,只把所有的子類都有的東西放進來。
    • ISP(Interface segregation,介面隔離)
      • 定義:客戶(Client)只要依賴它們所需的介面Clients should not be forced to depend upon interfaces that they don't use.
      • 白話:設計介面也盡量簡單,別把不相關的東西放進來。
    • DIP(Dependency inversion,依賴倒轉)
      • 定義:
        • 高階模組不應依賴低階模組,兩者應依賴抽象概念。High-level modules should not depend on low-level modules. Both should depend on abstractions. 
        • 抽象概念不應依賴細節,細節應依賴抽象概念。Abstractions should not depend on details. Details should depend on abstractions.
      • 白話:不要具體的指明物件的關係,而要抽象觀念替代之。

[心得]30天快速上手TDD讀後心得

看完了《30快速上手TDD》,整理一些我認為蠻重要的心得跟大家分享。

1.
ATDD(USER STORY)
  <->BDD(DSL TO Programming Language)
  <->TDD(include integration test, unit test and refactor)
白話來說,就是用戶使用ATDD來寫好USER STORY後,用BDD轉成程式設計師看得懂的規格後,再讓程式設計師用TDD的方式開發測試
Ref:
[30天快速上手TDD][Day 26]User Story/ATDD/BDD/TDD - 總結
2.
職責分離==>
找出誰,在做什麼事!
要找出「誰,做什麼事」,有一個相當相當簡單的技巧,相信大家一學就會。針對前面透過人話所整理出來的 function ,只要找出該 function 代表的意義中的「主詞」、「動詞」、「受詞」即可。 
什麼意思?很簡單: 
  主詞:代表類別; 
  動詞:代表方法; 
  受詞:通常是方法參數; 
  形容詞:通常是呼叫物件行為後,物件產生的狀態變化。
  EX1-CalculatedByBlackCat():黑貓,計算運費
Ref:
[30天快速上手TDD][Day 12]Refactoring - 職責分離
3.
介面導向==>
『用該物件的角度去看世界,除了物件自己本身以外,看出去外面的世界,都是介面。』 
Ref:
[30天快速上手TDD][Day 16]Refactoring - 介面導向

2015/12/28

[心得] TDD已死?總結一下最近我對於程式測試的想法

最近在研究程式設計的測試部份,總結一下我目前對測試的看法,
因此如果覺得測試是狗屁的,可以跳過不看這篇文章;
而如果想要了解更多測試的知識,可以參考一下:

2015/10/3

Linux基礎概念(Linux Basic Concept)

一、Linux 核心(Kernel)
    Shell/KDE/Application <-> Kernel <-> Hardware

    從技術上說Linux只是一個內核。
    「內核」指的是一個提供硬體抽象層、磁碟及檔案系統控制、多工等功能的系統軟體。
    一個內核並不是一套完整的作業系統。
    有一套基於Linux內核的完整作業系統叫作Linux作業系統
    Ref: 

    PS:
    沒有永遠不會當機的系統:
    只有Windows會藍屏嗎?不
    我們偉大的MAC(UNIX),有四國語言的當機畫面,
    而LINUX則是有內核錯誤(Kernel panic)。

二、Linux檔案系統(File System)
    Windows有所謂的FAT16、FAT32、NTFS,當然LINUX也不例外,
    LINUX從一開始的EXT2->EXT3演進到目前的主流EXT4,
    以及一些更加先進的FileSystem如:ZFS、XFS、BTRFS等等,
    也如同Windows一樣,你可以自行更換FileSystem,只是是比較大的工程,
    如果有興趣的話,可以參考其他的相關資料進行研究。

    Ref:
      http://linux.vbird.org/linux_basic/0230filesystem.php#harddisk
      Linux 檔案格式 ext2 ext3 ext4 比較

三、Linux目錄結構(Filesystem Hierarchy Standard, FHS)
    Linux的目錄基本上是根據Filesystem Hierarchy Standard (FHS)制定的,
    有興趣的可以去研究一下,基本上有幾個比較重要的路徑要記得:
    a. 根目錄( / )
    b. /etc 放設定檔
    c. /opt 放第三方協力軟體又或是自己Compile的資料夾
    d. /usr 放原生軟體相關的東西
    e. /var 放與系統運作有關的東西
    f. /home 放各個使用者家目錄的地方,除了root的家目錄之外
    g. /root root的家目錄
    h. /usr/bin 通常會把自己寫的Script放在這裡
    i. /var/log/ 紀錄許多重要的log
    j. /var/mail/ 個人的email目錄

    Ref:
      http://linux.vbird.org/linux_basic/0210filepermission.php#dir

四、絕對路徑與相對路徑(Relative Path vs Absolute Path)
    絕對路徑:由根目錄(/)開始寫起的檔名或目錄名稱, 例如 /home/dmtsai/.bashrc;
    相對路徑:相對於目前路徑的檔名寫法。
      例如 ./home/dmtsai 或 ../../home/dmtsai/ ,又或是~/test等等。
      反正開頭不是 / 就屬於相對路徑的寫法

    Ref:
      http://linux.vbird.org/linux_basic/0210filepermission.php#dir

五、Linux檔案權限管理(Linux ACL ( Access Control List ) )
    用ls -l指令時,我們可以看到類似於下面的權限表,可以分別看成六個區塊:
     -   rwx rwx rwx root root
     1    2    3     4     5      6

    1.如果是檔案,顯示「-」;如果是目錄,顯示「d」;如果是軟連結,顯示「l」
    2.擁有者的權限
    3.擁有群組的權限
    4.其他人的權限
    5.own-user 擁有者
    6.own-group 擁有的群組
    r-Read,表示是否可以讀取, w-Write,表示是否可以寫入, x-Excute,表示是否可以執行
    而一組權限(rwx),我們可以分別將
    x視為2的0次方(1),w視為2的1次方(2),r視為2的2次方(4),
    則如果權限全開的時候就是4+2+1=7。大家可以思考一下,權限5是怎樣的權限?

六、Shell
    Shell就是我們利用指令跟Kernel溝通的一種文字介面,
    就跟我們使用Windows的GUI圖形介面來設定和使用是一樣的,只是改成全部用指令完成。
    Shell可以分成這幾種:
      /bin/sh (已經被 /bin/bash 所取代)
      /bin/bash (就是 Linux 預設的 shell)
      /bin/tcsh (整合 C Shell ,提供更多的功能)
      /bin/csh (已經被 /bin/tcsh 所取代)
   其中最常用也是目前Linux大部份預設的是bash(Bourne-Again SHell),基本上只要會用這個就OK了

Linux vs Windows

一、What is Linux?
    毫無反應,就是一隻企鵝(誤
    好,不開玩笑了,其實Linux是根據是一種自由和開放原始碼的類UNIX作業系統。
    而UNIX也是一種電腦作業系統,具有多工、多用戶的特徵。
    像是FeeeBSD、MAC都是UNIX系統的代表。(UNIX = FreeBSD、MAC)

二、POSIX
    說到Linux,一定要提到相關的POSIX,而POSIX = UNIX + LINUX,
    想要了解更多的可以去看一下維基百科。
    POSIX Ref:
    https://zh.wikipedia.org/wiki/POSIX

三、Linux Family
    Linux家族的家族樹(Family Tree):
      1.Debian家族(Debian, Ubuntu(桌面使用者較多), Linux Mint)
      2.Fedora家族(
              Fedora(最多新功能、RedHat的測試實驗所),
              RedHat Enterprise Linux,
              CentOS(模仿RedHat Enterprise Linux所做出來的版本,相對較穩定))
      3.OpenSUSE

    PS: 在各個Linux版本當中,有些時候我們會發現有所謂的LTS版本,
    LTS就是所謂的LongTerm Service版本,該版本會提供比一般正式版本更長的後續維護,
    像是臭蟲的修正以及其他更新等等的,
    如果有要建立一個較正式的服務時應優先考慮LTS版本。

    Linux Ref: https://zh.wikipedia.org/wiki/Linux

四、Everything is File. vs Registry.
    在Linux當中,一切東西都可以看成檔案,
    只有檔案權限的差別以及是否是目錄、可否執行之類的,詳細的可以參考:
    https://en.wikipedia.org/wiki/Everything_is_a_file

    在Windows當中,許多的設定值為了統一管理,所以是放在Registry當中,
    Registry是使用DB-Based存放相關設定,
    而其實Windows一開始也是使用File-Based來進行管理,像是「WIN.INI」、「SYSTEM.INI」
    就是舊時代留下來的檔案。
    Registry缺點:
      1 所有設定集中,可能有些東西不需一啟動就載入,系統變慢
      2 使用者還是可能意外修改到
   Ref:
     http://www.ithome.com.tw/node/59748

五、User Is Genius. vs User Is Ordinary People.
    Linux當中,會認為使用者都不是一般人,而是對系統有了解,想要更多自訂性可以讓其自行設定;
    Windows則是認為很多使用者都只是一般人,所以做了許多通用的預設值,可自訂的部份較少,
    而且就如同之前所說的,甚至有些設定要去Registry才可以修改到,有著相當的危險性。

六、Linux, the Most Safe OS ever?
    很多人誤解Linux是世界上最安全的系統,而Windows則是最容易被入侵的系統,
    但這其實是一個錯誤的印象,
    真實的狀況是,因為Linux需要進行很多的設定,而如果設定不當或是根本沒有設定,
    那麼Linux反而會是更加不安全的。
    而Windows則是因為久病成良醫,對於現在許多的病毒他反而更容易處理,
    因此,我們要使用Linux時,一定要好好的學習如何進行設定才行!

2015/9/13

Virtualbox OVA匯出匯入

其實很簡單,這邊只是帶大家做一遍而已。

匯出步驟:

一、首先要先將機器關機後才可以正常的匯出