跳至主要内容

29 篇文章 含有標籤「code」

檢視所有標籤

如何在 Windows 打造 JavaScript Web 開發環境入門教學

· 閱讀時間約 2 分鐘

如何在 Windows 打造 JavaScript Web 開發環境

所謂工欲善其事,必先利其器。我們開發程式之前我們最重要的就是要設定好開發環境,接下來我們將帶領讀者體驗如何在 Windows 打造 JavaScript Web 開發環境。

安裝軟體步驟

  1. 下載安裝 google chrome 瀏覽器
  2. 下載安裝 Visual Studio CodeSublime text 文字編輯器
  3. 下載安裝 cmder terminal 終端機程式 (請下載含 git 的 full 完整版本)
  4. 下載安裝 Node.JS 選擇左邊穩定版本,按照指令安裝完成
  5. 在終端機輸入 node -v 若成功顯示版本,代表安裝完成
  6. 安裝 http-server 套件:npm install http-server -g

撰寫第一個 JavaScript 程式

  1. 打開 Visual Studio Code 或 Sublime text 並建立一個 index.html 檔案:

  2. index.html 輸入:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>Test</title>
    <script>
    console.log(‘hello JS!);
    </script>
    </head>
    <body>
    </body>
    </html>
  3. 儲存後在終端機移動到該檔案資料夾下,輸入 http-server -p 7777 啟動伺服器

  4. 打開瀏覽器輸入網址:http://127.0.0.1:7777http://localhost:7777

  5. 開發者工具,可以在 console 中看到 hello JS!

  6. 恭喜讀者完成第一個 JavaScript 應用程式啦!

影片教學

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

· 閱讀時間約 17 分鐘

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

要成為一個真正的軟體工程師(Software Engineer)除了掌握基礎開發能力外,更重要的是和其他工程師和開發者團隊合作和溝通的能力,所以若你能培養出掌握 Git 等版本控制操作和 Git server 架設的能力,你會更容易參與開放原始碼(open source)的社群和提昇自己在職場上的價值。關於相關環境工具若你還沒準備好,可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學 這篇教學文章。好,那我們就準備開始吧!

什麼是版本控制系統(Version Control System)?

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

版本控制系統是一種軟體工程的開發技巧,可以透過這個系統讓每位成員的軟體版本可以方便同步和維護管理(不然要用 email 或是其他工具傳送和管理十分麻煩,尤其程式又常常會有不同版本修改的問題!)。在沒有版本控制系統時,我們常會在編輯檔案前複製一個備份,或是在更新檔案後產生許多重複檔案,非常不便且難以維護。因此,使用版本控制系統的需求就應運而生啦!

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

一般在軟體開發中又分為中央式系統(例如:SubversionCVS 等)與分散式系統(例如:GitBitKeepermercurial 等),中央式版本控制系統的工作主要在一個伺服器進行,由中央管理存取權限「鎖上」檔案庫中的檔案,一次只能讓一個開發者進行工作。而分散式系統讓不同開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一個檔案,而每個檔案庫有另外一個合併各個改變的功能。分散式系統讓開發者能在沒有網路的情況下也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央管理者的許可,但分散式系統仍然可以有檔案上鎖功能。

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

什麼是 Git?什麼是 Github?

Git 是一個分散式版本控制軟體,最初由 Linus Torvalds 創作(也是作業系統 Linux 系統的開發者),其最初目的是為更好地管理 Linux kernel 開發而設計,其具備優秀的 merge tracing 合併程式碼的能力(使用程式碼 snapshot 來比較歷史版本差異)。

Github 則是一個支援 git 程式碼存取和遠端托管的平台服務,有許多的開放原始碼的專案都是使用 Github 進行程式碼的管理。若是讀者未來有志於從事程式設計相關工作的話,建議可以熟悉掌握 Git 和 Github 的使用,並建立自己的 Github profile 作品集。

Git 基本觀念

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

Git 可以分為 Local(本地)和 Remote(遠端)兩個環境,由於 Git 屬於分散式的版本控制系統,所以開發者可以在離線 local 環境下開發,等到有網路時再將自己的程式推到 Remote 環境或 pull 下其他開發者程式碼進行整合。在 Local 中我們又分為 working directory(工作資料夾)、staging area(暫存區)和 repositories(檔案庫)。

當自己開發時會在工作資料夾工作,當要進入檔案庫之前會先將檔案加入暫存區,確認沒問題則 commit 到檔案庫中,最後 push 上去 remote 環境。在 Git 中若是有和其他開發者一起合作,則會需要處理不同 branch 之間 conflict 和 merge 的問題。

自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

Git 與 Github 實戰操作入門教學

接下來我們用一個實際的實戰範例讓讀者可以快速的掌握那些基礎必知必會的 Git/Github 操作技能:

  1. 安裝並且設定 Git

    任務 1:安裝 Git 到你的電腦上,並且設定好 Git 內部的使用者名稱和電子信箱

    Linux 若是使用 Debian 基礎的作業系統可以在終端機輸入以下指令安裝 git:

    $ apt-get install git

    若是 Fedora 系列可以輸入:

    $ yum install git-core

    若是 windows 可以下載安裝 cmder 這個模擬 Linux terminal 終端機時選擇完整版本就會順便安裝或是到 Git 官網安裝。當然在市面上有許多免費 GUI 圖形化的 Git 操作軟體,若是初學者則建議先熟悉整個 git 工作模式和指令,再去使用圖形化工具會比較好,這樣你才比較知道圖形化程式背後做了什麼事情。Mac 則是可以到 Git 官方網站 選擇對應作業系統,按照步驟完整下載安裝。另外也可以參考中文安裝教學

    由於我們會選擇 Github 當作遠端托管程式的環境,所以我們也可以根據作業系統安裝 Github 桌面版當作操作工具(內建安裝 Git)。

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    若是安裝完成,打開終端機(terminal)或 cmder 輸入以下指令,若成功顯示版本(建議 Git 版本在 2 以上),代表安裝成功囉!terminal(終端機)是一個可以下指令讓電腦做事情的互動介面(例如:新增檔案、移動到資料夾等)

    // 其中 $ 為提示字元,在輸入指令時不用輸入該符號,否則會錯誤,若是使用 windows cmder 預設是 λ
    $ git --version

    接下來設定你的帳戶,讓 Git 知道這台電腦做的修改要連結到哪一個使用者(待會我們要在 Github 上註冊帳號,建議使用一致的帳號和電子信箱):

    $ git config --global user.name "<Your Name>"

    設定電子郵件:

    $ git config --global user.email "<your@gmail.com>"
  2. 建立一個本機的 repository

    任務二:在自己的電腦上建立一個新的 local repositories(本地檔案庫)

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    repository(檔案庫)是一個什麼樣的概念呢?事實上 repository 就是一個專案,又簡稱 repo。以電腦的檔案資料管理來看,我們通常會把同一個專案的資料放到同一個資料夾下,所以我們也可以把 repository 看成一個資料夾。

    // 建立一個 hello-git 資料夾
    $ mkdir hello-git
    // 移動到 hello-git 資料夾
    $ cd hello-git
    // 將專案資料夾建立成 git repository
    $ git init
    // 列出專案資料夾下的檔案和資料夾(-l 參數為列出詳細資料,-a 為列出隱藏資料夾)
    $ ls -la

    當你執行 git init 後,你可以發現多出了 .git 這個隱藏資料夾,可以看到裡面檔案和資料夾如下:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    到這邊恭喜讀者,完成你第一個 git 專案資料夾改造計畫!

  3. 檢視狀態、新增或修改 commits

    任務三:在你的 repository 檔案庫中建立一個新檔案,新增一些內容到該檔案並且將那些檔案修改提交 commit 到 Git 中

    接著我們使用文字編輯器,新增一個 hello.py 的檔案(裡面是一個會印出 hello python & git 字串的 python 程式):

    print('hello python & git')

    然後在終端機的專案資料夾下輸入 git status 顯示目前工作環境狀態:

    $ git status
    On branch master

    Initial commit

    Untracked files:
    (use "git add <file>..." to include in what will be committed)

    hello.py

    nothing added to commit but untracked files present (use "git add" to track)

    我們會發現因為我們有新增新的檔案,但是還沒進到 git 追蹤範圍中/暫存區,所以我們要使用 git add hello.py 加入追蹤,這樣之後檔案有修改就可以追蹤到。

    $ git add hello.py
    $ git status
    On branch master

    Initial commit

    Changes to be committed:
    (use "git rm --cached <file>..." to unstage)

    new file: hello.py

    若是確認沒問題我們就準備 commit 進去 repository 囉!

    // 比較現在檔案和上次 commit 之間的差異,也就是說你做了哪些修改
    $ git diff
    // -m 為輸入 commit message,也就是說這個 commit 內做了哪些事情
    $ git commit -m "Init hello.py"
    [master (root-commit) ad6d328] Init hello.py
    1 file changed, 1 insertion(+)
    create mode 100644 hello.py

    // commmit 完成
    $ git status
    On branch master
    nothing to commit, working tree clean

    若是想反悔不想把檔案加入追蹤呢?

    // 檔案尚未加入過追蹤時使用,即可恢復到檔案尚未加入暫存區
    $ git rm --cached hello.py

    // 若檔案已經在 repository 內,則使用以下指令
    // repository 與 stage 的檔案都會被還原到 HEAD,但 working directory 內的檔案不變
    $ git reset HARD

    當你追蹤後修改了檔案,例如把 hello.py 的內容改成:

    print('hello python & git rock')

    若有檔案修改,記得要再 add 修改的檔案(這是新手比較容易忘記的部分),若是要放棄修改可以使用 git checkout -- 檔案名稱

    // 比較現在檔案和上次 commit 之間的差異,也就是說你做了哪些修改
    $ git diff
    // 查看目前工作狀態
    $ git status
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

    modified: hello.py

    commit 這個修改時簡寫會寫成這樣(-a 是 add,-m 為 message 簡寫,後面接訊息資訊):

    $ git commit -a -m "修改了 hello.py"
  4. 註冊 GitHub 帳號

    任務四:建立一個 GitHub 帳號,並在 Git 設定中加入使用者帳號

    到目前為主我們程式主要是在我們 local 工作環境中操作,但還記得我們在 Git 基本觀念中有提到,git 分為 local 和 remote,若是我們想要和全世界其他開發者合作或是貢獻開放原始碼的話,我們可以透過 github 來當作我們 remote 工作環境,去管理我們程式碼,同樣的也可以透過 github 平台和其他開發者一起合作,參與開放原始碼的開發。github 若是公開的 repo 是無限制數量免費的,但是若是想使用 private repo 可以參考付費方案

    // 注意大小寫要一致
    $ git config --global user.username <你的 github 使用者名稱>

    先到 github.com 註冊帳號:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    註冊成功後登入,可以點選右上顯圖下拉式選單進到個人頁面(profile),觀看個人頁面:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    點選右上角 + 來新增 new repository(檔案庫):

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    輸入 repository name(你要取的專案名稱),最好跟電腦 local 專案一致,我們這邊輸入 git-example。然後輸入簡短專案描述並先不勾選初始化 README 和,也先不要選擇 .gitignore 和 License 授權(不然會造成本地端和遠端不一致會需要額外一些處理):

    .gitignore:要忽略的檔案清單,這是用來告訴 Git,當在做版本控制記錄的時候,忽略這些檔案。通常一些機密資料,如資料庫帳號密碼或是 server IP 位置等,記得要加入。也可以參考 github 上面的一些範本 在新增 repository 時選取對應的程式語言

    README.md:repository 介紹和使用方式說明(例如:使用方法、參與專案方式等),使用 markdown 語法撰寫。另外通常有 CONTRIBUTING.md 額外說明如何參與貢獻。

    LICENSE:專案使用何種授權方式,例如:MIT、BSD 等

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    接著按 create 按鈕!恭喜你新增成功,創建了自己第一個 github repository(遠端檔案庫)!

  5. 將 repository 做本機和遠端的連結

    任務五:把電腦裡 Local(本地端)的 repository(檔案庫)和 remote(遠端)的 repository(檔案庫)連結起來,並 push 電腦上的修改

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    因我們已經在專案有把 hello.py 修改加入追蹤並 commit 到 local 檔案庫,所以我們可以參考下方的指令說明把 remote 網址加入:

    // 本地端專案知道 origin 對應到遠端網址
    $ git remote add origin <remote 網址>

    接者準備將本地端程式 push 到遠端檔案庫:

    // 觀看情況
    $ git status
    // 將本地端程式 push 到遠端檔案庫
    $ git push -u origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 239 bytes | 0 bytes/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    To https://github.com/happycodergit/git-example.git
    * [new branch] master -> master
    Branch master set up to track remote branch master from origin.

    參數 -u 等同於 --set-upstream,設定 upstream 可以使分支開始追蹤指定的遠端分支。事實上,只要做過一次 $ git push -u <remote name> <branch name>,並且成功 push 出去;本機端的 master 就會被設定去追蹤遠端的 <remote name>/<branch name> 分支。只要成功設定好 upstream 後,第二次以後要上傳分支時,就只需要透過 git push 就可以了,不必再帶 <remote name><branch name> 等參數。例如:$ git push

    事實上,$ git push -u origin master 可以拆解成:

    $ git push origin master
    $ git checkout master
    $ git branch -u origin/master

    恭喜你成功把你的專案推送上去 github 啦!

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

  6. Fork 和 clone 一個 open source(開源)的計畫

    任務六:從 GitHub.com 建立專案,複本 fork,並下載 clone 到電腦上

    點選左上角 github icon 回到首頁,我們從上面搜尋欄搜尋 react:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    點選右上角 fork 按鈕,複製一份專案到我們這:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    等待 fork 中:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    點選右邊綠色按鈕 clone download 複製 HTTP 網址:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    // 複製到本地端
    $ git clone https://github.com/happycodergit/react.git
    // 移動到 react 資料夾
    $ cd react
    // 切出自己的新分支(使用 -b)
    $ git checkout -b happycoder@feature_branch
    // 做一些 README.md 檔案修改,然後 commit 到自己 fork 過來的專案
    $ git commit -a -m "Update README"
    $ git push origin happycoder@feature_branch

    事實上,每個開放原始碼都有他自己貢獻的方式,記得要先了解。例如可以參考 react 貢獻說明

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

    你可以透過將自己的修改 commit 到自己 fork 過來的專案,然後到原始專案頁面點選 new pull request 按鈕發 pull request(會比對程式碼的差異)。若對方 review 完後接受就可以將自己的程式碼合併到原始專案中,為開放原始碼做出第一步貢獻!

    // 若完成 pull request 記得讓 master(或是合併進去的 branch)保持同步
    $ git pull upstream master
  7. 練習建立一個 feature branch

    任務七:回來原來的 git-example 專案新增 feature branch(分支)

    // 建立一個名為 dev 的 branch
    $ git checkout -b dev

    hello.py 最上面多加一行 # hi, this is comment 註解後存檔

    // commit 到本地端更新
    $ git commit -a -m "Init dev branch"
    $ gut push origin dev
  8. 邀請別人和你合作

    任務八:在專案新增夥伴 collaborator

    在右上角進入 setting 可以選擇到 collaborator 新增合作者:

    自學程式設計與電腦科學入門實戰:Git 與 Github 版本控制基本指令與操作入門教學

  9. 利用 push 和 pull 來和 GitHub.com 同步

    任務九:用 pull 來和其他 collaborators(合作者)同步更新,確保程式是最新的版本

    請其他開發者 git colone 下來你的 git-example 專案並 checkout 到 dev branch,並完成新增一個 README.md 檔案後發 pull request 過來,若沒問題就按同意並合併。我們則透過 git pull 來保持本地端和遠端程式碼同步:

    $ git pull origin dev
  10. Merge(合併)和刪除 branches

    任務十:在本機上 merge 合併你的 branch(分支),刪除舊的 branch(分支)

    // 移動到 master branch
    $ git checout master
    // 合併 dev 到 master
    $ git merge dev
    // 刪除 dev branch
    $ git branch -d dev
    // 將合併後的 master 推送到遠端
    $ git push origin master

總結

以上就是 Git 與 Github 版本控制基本指令與操作入門教學!希望讀者可以動手一起操作,漸漸就能感受到 git 的威力和好處,同時也有能力參與開放原始碼(open source)的社群和提昇自己在職場上的價值,朝成為一個真正的軟體工程師(Software Engineer)邁進!

參考文件

  1. 30 天精通 Git 版本控管
  2. Git 官方網站
  3. Try Git
  4. Git-it
  5. GitHub Guides
  6. 如何將檔案從 stage 移除?
  7. Git 教學

(image via git-scmqboxquoracdnytimglinuximgurmartinfitzpatrick

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

· 閱讀時間約 11 分鐘

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

要成為一個真正的軟體工程師(Software Engineer)不一定一定要使用 vim 之類的編輯器進行開發,但熟悉使用終端機(terminal)操作和常用的 Linux 命令列指令碼操作則是必須的。因此接著我們將介紹軟體工程師在開發上常用的 Linux 命令列指令碼給讀者參考。若讀者使用的是 Windows 建議安裝 VirtualBox 並在上面跑 Linux/Ubuntu 來進行指令碼操作,或是使用像是 Cmder 的工具來進行操作。關於相關工具安裝可以參考 如何在 Windows 打造 Python 開發環境設定基礎入門教學 這篇教學文章。好,那我們就準備開始吧!

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

什麼是 Linux?

Linux 是一種自由開放原始碼的類 Unix 的作業系統,其廣泛運用於伺服器和嵌入式系統中。目前主流的 Linux 發佈版本(Linux distributions,係指可完整安裝使用的套件版本)包括:Debian、Fedora、CentOS、Ubuntu 等。以下我們主要將會聚焦在 Linux/Ubuntu 常用指令和基礎操作的入門教學介紹上(每個指令前使用 $ 當作提示字元,不用輸入)。

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

Linux 檔案系統架構

理論上所有的 Linux 發佈版本應該都要遵守檔案系統的標準(Filesystem Hierarchy Standard, FHS),但根據發佈版本不同或有差異,不過大致上檔案系統架構如下:

  1. /bin, /sbin
    /bin 主要放置一般使用者可以操作的指令,/sbin 放置系統管理員可以操作的指令。連結到 /usr/bin/usr/sbin

  2. /boot
    主要放置開機相關檔案

  3. /dev
    放置 device 裝置檔案,包話滑鼠鍵盤等

  4. /etc
    主要放置系統檔案

  5. /home, /root /home 主要是一般帳戶的家目錄,/root 為系統管理者的家目錄

  6. /lib, /lib64 主要為系統函式庫和核心函式庫,若是 64 位元則放在 /lib64。連結到 /usr/lib, /usr/lib64

  7. /proc 將記憶體內的資料做成檔案類型

  8. /sys 與 /proc 類似,但主要針對硬體相關參數

  9. /usr /usr 全名為 unix software resource 縮寫,放置系統相關軟體、服務(注意不是 user 的縮寫喔!)

  10. /var 全名為 variable,放置一些變數或記錄檔

  11. /tmp 全名為 temporary,放置暫存檔案

  12. /media, /mnt 放置隨插即用的裝置慣用目錄, /mnt 為管理員/使用者手動掛上(mount)的目錄

  13. /opt 全名為 optional,通常為第三方廠商放置軟體處

  14. /run 系統進行服務軟體運作管理處

  15. /srv 通常是放置開發的服務(service),如:網站服務 www

檔案與目錄管理指令

在 Ubuntu 中我們可以打開終端機進行指令操作,就可以透過指令來管理檔案。

一般指令格式如下:

$ 指令 [選項] [選項值]

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

  1. ls:list,查看檔案及子目錄

    列出基本資料夾資料:

    ls

    列出詳細資料和隱藏資料:

    // -l 列出詳細資料 -a 列出隱藏資料
    $ ls -la

    列出部分檔案:

    // 列出為 .js 的檔案
    $ ls *.js
  2. pwd:print work directory,印出目前工作目錄

    $ pwd
    // /Users/happycoder/Desktop/projects/HappyCoder
  3. cd:change directory,移動進入資料夾

    移動到目前資料夾下的 examples 資料夾:

    $ cd ./examples

    移動到家目錄:~

    $ cd ~

    移動到上一層目錄 ..

    $ cd ..

    移動到根目錄 /

    $ cd /
  4. mkdir:make directory,創建新資料夾

    $ mkdir examples
  5. cp:copy,複製檔案

    先將字串 TEST 存入 README.md 文件中

    $ echo "TEST" > README.md
    $ cp README.md
  6. mv:move (rename) files,移動檔案或是重新命名檔案

    移動檔案:

    $ mv README.md /examples/README.md

    重新命名

    $ mv README.md README_MV.md
  7. rm:remove file,刪除檔案

    $ rm README.md

    刪除目前資料夾下副檔名為 .js 檔案:

    $ rm *.js

    刪除資料夾和所有檔案:

    $ rm -f examples
  8. touch:用來更新已存在文件的 timestamp 時間戳記或是新增空白檔案

    $ touch README.md
  9. cat:將文件印出在終端機上

    $ cat README.md
  10. tail:顯示檔案最後幾行內容

    $ tail README.md

    持續顯示更新內容,常用於 web server 看 log debug 使用:

    $ tail -f README.md
  11. more:將檔案一頁頁印在終端機上

    可以使用上下移動換頁,按 q 離開:

    $ more README.md
  12. file:檢查檔案類型

    $ file README.md
    // README.md: HTML document text, UTF-8 Unicode text

編輯文字檔案

  1. nano:在終端機編輯文字檔案

    編輯或是新增文字檔案:

    $ nano README.md

    啟動編輯完後可以使用 Ctrl + X 離開,Ctrl + V 移動到上一頁,Ctrl + Y 移動到下一頁,Ctrl + W 搜尋文字內容

  2. vim:在終端機編輯文字檔案

    $ vim README.md

    啟動後,使用 i 進入編輯,esc 離開編輯模式,:q 不儲存離開,:wq 儲存離開,:q! 強制離開

檔案權限設定

在 Linux 系統中,每一個 Linux 檔案都具有四種存取權限:

  1. 可讀取(r,Readable),用數字 4 表示
  2. 可寫入(w,writable),用數字 2 表示
  3. 可執行:(x,eXecute),用數字 1 表示
  4. 無權限(-),用數字 0 表示

系統管理者依據使用者需求來設定檔案權限,若我們想檢視檔案權限可以使用 $ ls -l 來查看

自學程式設計與電腦科學入門實戰:Linux Command 命令列指令與基本操作入門教學

  1. 第一欄:使用者權限 由 10 個字元組成,第一個字元表示檔案型態(- 為檔案,d 表示目錄,1 表示連結檔案)。字元 2、3、4 表示檔案擁有者的存取權限。字元 5、6、7 表示檔案擁有者所屬群組成員的存取權限。字元 8、9、10 表示其他使用者的存取權限

    舉例來說 -rwxrwxr--,代表這是一格檔案,擁有者和群組都具備讀取、寫入和執行權限,其他使用者只擁有讀取權限

  2. 第二欄:檔案數量

  3. 第三欄:擁有者

  4. 第四欄:群組

  5. 第五欄:檔案大小

  6. 第六欄:檔案建立時間

  7. 第七欄:檔案名稱

接下來介紹如何透過指令修改權限:

  1. chmod:修改檔案權限

    將權限設為 rw-rw-r--

    $ chmod 664 README.md

    將檔案的使用者和群組加入執行權限

    $ chmod ug+x README.md
  2. chown:修改檔案擁有者與群組

    $ chown www-data:www-data README.md

系統管理

  1. sudo:使用最高權限(superuser)執行指令,會要求輸入自己密碼,使用上必須非常小心

    $ sudo git clone xxx.py
  2. su:su 指令可以讓一般的 Linux 使用者輸入 root 密碼取得 root 權限,暫時取得 root 權限的使用者就如同 root 一樣可以對系統進行各種變更動作

    $ su
  3. kill:根據 Process ID 指定要終止程式

    $ kill PID

    立即強制執行:

    $ kill -9 PID
  4. killall:直接使用程式的名稱來指定要終止的程式

    $ killall hello.py

套件管理

  1. apt-get:套件管理工具

    更新套件資料庫列表:

    $ sudo apt-get update

    升級套件並下載安裝套件:

    $ sudo apt-get upgrade

    搜尋相關軟體套件(使用名稱):

    $ apt-cache search --names-only fortune

    安裝套件:

    $ sudo apt-get install fortune

    移除套件:

    $ sudo apt-get remove fortune

網際網路相關操作

  1. ping:網路檢測工具,透過發送 ICMP ECHO_REQUEST 的封包,檢查自己與特定設備之間的網路是否暢通,速度是否正常

    可輸入 hostname 或是 IP:

    $ ping google.com

    PING google.com (172.217.160.110): 56 data bytes 64 bytes from 172.217.160.110: icmp_seq=0 ttl=57 time=7.037 ms 64 bytes from 172.217.160.110: icmp_seq=1 ttl=57 time=9.411 ms 64 bytes from 172.217.160.110: icmp_seq=2 ttl=57 time=22.690 ms 64 bytes from 172.217.160.110: icmp_seq=3 ttl=57 time=6.561 ms 64 bytes from 172.217.160.110: icmp_seq=4 ttl=57 time=6.909 ms 64 bytes from 172.217.160.110: icmp_seq=5 ttl=57 time=6.311 ms 64 bytes from 172.217.160.110: icmp_seq=6 ttl=57 time=6.860 ms 64 bytes from 172.217.160.110: icmp_seq=7 ttl=57 time=6.583 ms

  2. traceroutes:檢查從你的電腦到網路另一端的主機是走的什麼路徑

    $ traceroute google.com

    traceroute to google.com (172.217.27.142), 64 hops max, 52 byte packets 1 zyxel.home (192.168.1.1) 2.047 ms 1.208 ms 1.888 ms 2 h254.s98.ts.hinet.net (168.95.98.254) 6.189 ms 8.556 ms 5.875 ms 3 168-95-85-2.hinet-ip.hinet.net (168.95.85.2) 7.057 ms 5.796 ms 5.998 ms 4 211-22-226-1.hinet-ip.hinet.net (211.22.226.1) 9.766 ms 10.422 ms 72.14.222.94 (72.14.222.94) 9.744 ms 5 108.170.244.97 (108.170.244.97) 8.386 ms 108.170.244.129 (108.170.244.129) 11.500 ms 12.247 ms 6 209.85.142.13 (209.85.142.13) 7.015 ms 7.505 ms 209.85.240.15 (209.85.240.15) 6.750 ms 7 tsa03s02-in-f142.1e100.net (172.217.27.142) 11.478 ms 6.608 ms 6.893 ms

  3. nslookup:查詢 DNS 回應是否正常

    $ nslookup google.com

    Server: 192.168.1.1 Address: 192.168.1.1#53

    Non-authoritative answer: Name: google.com Address: 216.58.200.238

其他好用指令

  1. man:查詢 Linux 線上手冊(man page)

    $ man

    例如我們可以使用 man 來查詢 ls 的使用用法:

    $ man ls
  2. find:查詢檔案

    在目前目錄下尋找檔名為 README.md 檔案

    $ find . -name README.md
  3. grep:強大文件字串搜尋工具

    $ grep '找這個字串' file_name

    找所有目錄(含子目錄)下檔案

    $ grep -r '字串' *

  4. crontab:例行性工作排程

    編輯 crontab

    $ crontab -e

    crontab 格式:

    分 時 日 月 星期 要執行的指令

    30 12 * * * python /projects/hello.py &

    在 12:30 時執行 hello.py,& 表示背景執行
    * 號表示每日每月每星期都執行

撰寫第一個 shell script

Shell 是我們和 Linux 系統的介面,我們可以透過終端機在上面輸入指令和作業系統互動,讓他做我們想做的事情。在 Linux 中標準的 Shell 為(Bourne Again Shell),檔案路徑為 /bin/sh,我們可以透過 $ echo $SHELL 去印出目前使用的 shell

其中 Shell Script 為使用 shell 所提供的語法所撰寫的程式碼,其為直譯式不用編譯。可以讓你將複雜或是重複性的指令寫成程式碼檔案

$ vim example.sh

在編輯模式輸入以下程式碼,:

#!/bin/bash
# 這是註解,上面所使用的 shell

echo "日期"
date
echo "印出檔案列表"
ls -l

修改權限成可以執行:

$ chmod u+x example.sh

接著執行,若是一切順利就可以在終端機看到時間日期和檔案列表!恭喜你完成你的第一個 shell script!

$ ./example.sh

總結

以上介紹了 Linux/Ubuntu 常用指令和基礎操作的入門教學介紹上,實際上讀者不用刻意去背誦,而是在實際上操作中練習,多累積撰寫程式並使用指令碼去加快程式開發的速度自然而然就會把指令碼記憶起來了,若是真的忘記再去網路上查找就好,加油!

參考文件

  1. 初窥Linux 之 我最常用的20条命令
  2. 【L】Linux 常用指令集
  3. Linux 的 su 與 sudo 指令教學與範例
  4. dig、host 與 nslookup 指令的查詢語法
  5. nslookup — 查詢 DNS 指令
  6. 在 Linux 下使用 find 指令查詢目錄與檔案的速查筆記
  7. grep 搜尋目錄下所有檔案字串
  8. 第十五章、例行性工作排程(crontab)

(image via unixmencloudxlabytimgytimglinuximgur

如何在 Windows 打造 Python 開發環境設定基礎入門教學

· 閱讀時間約 13 分鐘

如何設定開發環境應該是每個初學程式設計者的痛(即便是老手有時也會覺得苦惱),尤其當你需要在終端機(terminal)輸入指令(command)來操控你的指令時(好吧,若你完全只走圖形化介面,習慣 GUI 操作就另當別論,但若你有志於往程式設計領域發展,建議還是熟悉一下指令碼)。

要在 LinuxMac OS 這種屬於類 Unix 系統(指各種 Unix 的衍生系統,而 Unix 指的是一種電腦作業系統,具有多工、多使用者的特色,是許多作業系統的父親)上打造 Python 開發環境相對容易,但當你使用 Windows 作業系統並希望在終端機下指令操作或開發應用程式時,往往受限於環境而產生許多困難和誤踩地雷。因此,接下來本文將教大家如何在 Windows 打造屬於自己的 Python 開發環境(包含一般 Winodows 安裝和使用虛擬機在 Windows 環境下建立 Linux/Ubuntu 作業系統,開發 Python 程式一般建議使用 Linux/Ubuntu 環境避免環境設定除錯困擾)!

開始建置 Python 開發環境

所謂工欲善其事,必先利其器,在開始之前我們必須先建置相關的開發環境,讓自己從麻瓜(不會寫程式的人)變成擁有程式魔力的魔法師。以下介紹我們在接下來開發 Python Web 應用程式所需要安裝的開發環境工具(強烈建議使用 Virtual Box 虛擬機搭配 Linux/Ubuntu 環境,若你真的很想使用 Windows 環境就繼續往下看吧!)。

  1. Microsoft VSCode 編輯器 Microsoft VSCode 是 Microsoft 推出的編輯器(非整合開發環境 IDE),夾帶著 Microsoft 過去打造 Visual studio 整合開發環境的豐富經驗,相比 Sublime Text 和其他編輯器,VSCode 的優勢在於開源且活躍的開發社群、內建 debugger 框架、原生 Git 整合、套件整合容易等特性。綜合以上幾點,對於初學者來說 VSCode 是一個蠻適合入門的開發環境。它的安裝方式也十分簡易,在官網下載後按照指示安裝完成即可,下載完成後可以打開看看。

    title: 如何在 Windows 打造 Python 開發環境設定

    我們可以點選左邊 icon 欄的第五個(長得像正方形拼圖),安裝 Python 語法和格式檢查的相關套件幫助除錯(搜尋 Python),選擇 Python 並點選 install 安裝:

    title: 如何在 Windows 打造 Python 開發環境設定

    你也可以於檔案(file)-> 開啟(open)打開你在電腦中已經準備好的專案資料夾,同時也可以在資料夾中新增檔案,我們之後的程式也會希望在建立好的專案資料夾中進行開發。這邊我們建立一個 hello.py 的檔案並印出 hello 訊息。

    print('hello python')
  2. 終端機環境(iTterm/內建 terminal) terminal(終端機)是我們下指令的地方,許多時候我們進行程式開發時不會使用 GUI 圖形化介面而是使用下指令方式請電腦做相對應的行為(記得寫程式就是下指令請電腦做事情!)。在 Linux 和 Mac 裡面都有內建的 terminal 的應用程式,以下為 MacOS 的 iTerm2 終端機下指令示意圖(iTerm2 中 $ 為提示字元,不用輸入):

    title: 如何在 Windows 打造 Python 開發環境設定

    使用 Windows 讀者可以使用 Cmder 這個軟體當做終端機環境。

    title: 如何在 Windows 打造 Python 開發環境設定

    比起 Winodws 內建的命令列 CMD,cmder 更貼近 Unix 的命令列指令碼:

    title: 如何在 Windows 打造 Python 開發環境設定

    首先到 Cmder 官網先安裝 Cmder Full 版本(含 git),安裝完成後解壓縮資料夾到桌面,執行裡面的 cmder.exe 檔案即可。

    title: 如何在 Windows 打造 Python 開發環境設定

    Cmder 預設是 λ,如果不習慣可以改成 Mac / Linux 環境下的 $,具體流程請參考這份文件

    title: 如何在 Windows 打造 Python 開發環境設定

    對於有志於從事程式開發相關工作的讀者建議可以多熟悉指令碼的輸入,更多指令碼可以參考鳥哥撰寫的 Linux 基本指令介紹Linux 學習資源

    以下是常用指令
    # 移動到桌面
    cd \Users\XXXX\Desktop
    # 列出資料夾下檔案
    ls
    # 刪除檔案
    rm 檔名
    # 複製檔案
    cp 檔名
  3. Git 版本控制系統/註冊 GitHub 帳戶 Git 是一種分散式版本控制系統,可以讓我們可以更方便地管理我們的程式碼。在網路上有非常多優秀的 Git 教學文件(連猴子都能懂的Git入門指南寫給大家的 Git 教學初心者 Git 上手攻略)。安裝 Git 方式是到官網下載軟體,依照指示安裝(若您使用 Cmder 的完整安裝 Download Full 的版本就不用安裝 git,因為已經幫你安裝好了)。

    title: 如何在 Windows 打造 Python 開發環境設定

    互動式語法學習:

    title: 如何在 Windows 打造 Python 開發環境設定

    在介紹完 git 之後我們來了解一下 GitHub。GitHub 是一個可以存放 git 程式碼專案的平台,透過 GitHub 我們可以接觸到最新的開放原始碼資訊,也可以將我們的程式碼開源出來。

    title: 如何在 Windows 打造 Python 開發環境設定

    從 GitHub 上複製程式碼

    # 複製一份到本地端
    $ git clone https://github.com/happycoderorg/python101.git
    # 移動到資料夾
    $ cd python101

    常見 Git 指令:

    # 初始化專案
    $ git init
    # 查看狀態
    $ git status
    # 檢查差異
    $ git diff
    # 將變更檔案放入暫存區
    $ git add index.py
    # 使用 commit -m 提交變更
    $ git -a -m 'init commit'
    # 查看歷史
    $ git log
    # 放棄已經 commit 的檔案重回暫存區
    $ git reset HEAD index.py
    # 放棄檔案變更
    $ git checkout index.py
  4. Anaconda Python3 版本 Anaconda 是一個 all-in-one 的 Python 開發環境,對於初學者來說是個十分合適的開發環境包。Anaconda 具備了幾項特點:

    • 便於安裝許多流行的科學、數學、工程、資料分析的 Python 模組
    • 免費並支援跨平台:Linux、Windows、Mac
    • 內建 Spyder 編輯器和 Jupyter Notebook 環境
    • 方便建立不同的虛擬開發環境

    安裝流程也十分簡單,進入 Anaconda 首頁,選擇對應作業系統(這邊使用 Windows)和是屬於 64 還是 32 位元: title: 如何在 Windows 打造 Python 開發環境設定

    Windows10 可以在系統看到位元資訊; title: 如何在 Windows 打造 Python 開發環境設定

    Windows7 可以在控制台->系統與安全->系統觀看作業系統位元資訊: title: 如何在 Windows 打造 Python 開發環境設定

    選擇對應 Python 版本下載(這裡選擇 Python3 以上版本),我們使用 Graphical Installer(圖像介面安裝方式),接著在下載完成時按照預設的安裝方式完成安裝; title: 如何在 Windows 打造 Python 開發環境設定

    記得安裝時要注意建議在安裝 anaconda 時勾選把環境變數加入(path environment variable),這樣在使用 cmder 時使用 conda 相關指令才不會出現錯誤,若一開始沒有勾選的話建議解除安裝後再重新安裝 anaconda 勾選加入環境變數。

    title: 如何在 Windows 打造 Python 開發環境設定

    若是完整安裝成功,可以打開 Cmder 終端機輸入,若是顯示 Python 3.6.0 :: Anaconda 4.3.0 (x86_64) 版本號即安裝成功(若沒成功可能要檢查一下是不是環境變數路徑的問題):

    $ python -V
    Python 3.6.0 :: Anaconda 4.3.0 (x86_64)

    接著要建立我們專案虛擬環境,這樣在安裝操作套件時比較不容易被污染到 root 全域的環境(因為你可能會有很多專案,專案使用的套件不盡相同,正式上線時只要把相關套件資訊透過 pip freeze > requirements.txt 存起來,然後在正式上線的伺服器安裝 pip install -r requirements.txt 即可),啟動後會出現(套件名稱)的提示字元:

    顯示目前虛擬環境列表
    conda info -e
    創建虛擬環境
    conda create -n 套件名稱 python=3.6
    進入虛擬環境(若是非 Windows cmder 環境加 source 於開頭) ,成功後提示字元變成:(套件名稱)$
    activate 虛擬環境名稱
    離開虛擬環境(若是非 Windows cmder 環境加 source 於開頭)
    deactivate

建立虛擬環境(virtual environment)

接著我們正式來建立一個 Python 的專案,打開終端機移動到桌面,建立專案資料夾(在輸入指令時可以使用 tab 自動補完指令)

# 移動到桌面
cd \Users\XXXX\Desktop
# 建立資料夾
mkdir python_examples
# 移動到資料夾
cd python_examples

建立獨立虛擬環境,並進入虛擬環境:

# 創立虛擬環境
conda create -n python_examples_venv python
# 啟動虛擬環境
activate python_examples_venv

成功進入虛擬環境後(會出現小括號 python_examples_venv)代表已經進入虛擬環境,即可以在裡面執行 Python 程式並安裝相關套件於該虛擬環境下:

# 安裝 django web 框架套件
pip install django
# 執行 python 檔案
python hello.py

事實上,在 Python3 中還有另外兩種建立虛擬開發環境的方式,包括使用 Python 內建工具:

# 使用 Python3 內建工具建立名為 example_venv 的虛擬開發環境
python -m venv example_venv

使用 virtualenv,和 anaconda 不同的是 virtualenv 會在建立虛擬環境的專案資料夾下建立一個資料夾裡面放虛擬環境的東西:

# 先安裝 virtualenv
pip install virtualenv
# 使用 virtualenv 產生一個名為 example_venv 的
virtualenv example_venv
# 移動到 example_venv 的外面資料夾,執行進入虛擬環境
example_venv\Scripts\activate
# 安裝 django web 框架套件到虛擬環境中(只會安裝在該虛擬環境中)
pip install django

整合在一起:在 Windows 撰寫你的第一個 Python 程式

確認安裝好以下工具後,我們就可以開始撰寫你的第一個 Python 程式

  1. 安裝 Microsoft VSCode
  2. 安裝 Cmder
  3. 安裝 Anaconda(記得勾選加入環境變數)
  4. 安裝 virtualenv (在終端機使用:pip install virtualenv 安裝)
  5. 在桌面創建一個 python_example 資料夾,打開 Microsoft VSCode 後開啟該專案資料夾,創建一個 hello.py 的檔案並在裡面打上 print('hello python!!')
  6. 打開 cmder 終端機 cd 移動到 hello.py 所在資料夾
  7. 執行 python hello.py,恭喜你完成第一個 Python 程式!

在 Windows 上安裝 Linux/Ubuntu

  1. 安裝 VirtualBox 對應版本虛擬機(這邊安裝 Windows 版本,若你是 Mac 想嘗試 Linux 也可以安裝 Mac 版本),下載完按照步驟安裝完成

    title: 如何在 Windows 打造 Python 開發環境設定

  2. 官網下載 Linux/Ubuntu 光碟映像檔案,請根據電腦位元架構選擇最新桌面穩定版本 16.04 LTS(for windows)

    title: 如何在 Windows 打造 Python 開發環境設定

  3. 建立 Linux Ubuntu 虛擬機,可以參考這篇 VirtualBox 虛擬機器安裝 Ubuntu 設定教學,設定一下名稱、作業系統類型和版本,欲分配給虛擬的記憶體大小(建議調整為大約實體記憶體的 1/3,舉例來說你有 30G 記憶體,可以分配 10G 給虛擬機)。接著選擇立即建立虛擬硬碟、VDI (VirtualBox 磁碟映像)、動態配置硬碟大小不會造成浪費(虛擬硬碟容量建議 30G 以上)。

    title: 如何在 Windows 打造 Python 開發環境設定

  4. 選擇建立好的虛擬機並選設定值按鈕,選擇存放位置選項,控制器中選擇虛擬 CD/DVD 檔案選擇剛剛從官網下載下來的檔案,確定後接著選擇虛擬機並啟動,接下來選擇安裝 Linux/Ubuntu,選擇立即安裝和預設值,需要一段時間安裝和設定(中間會有語言相關的選擇和密碼設定)

    title: 如何在 Windows 打造 Python 開發環境設定

  5. 啟動使用 Linux/Ubuntu,按照上面教學安裝 Microsoft VSCode 編輯器,安裝 Anaconda,建立第一個 Python 檔案、打開終端機(termical)安裝 ,執行 Python 程式

    title: 如何在 Windows 打造 Python 開發環境設定

網路上也有許多相關參考教學文章:VirtualBox 5.2安裝Ubuntu 16.04 相關教學VirtualBox 虛擬機器安裝 Ubuntu 設定教學

若是螢幕太小可以在上排選單中選擇:裝置->插入 Guest Additions CD 映像...->執行->重開虛擬機->可以調整大小

整合在一起:用 Linux 撰寫你的第一個 Python 程式

確認安裝好以下工具後,我們就可以開始撰寫你的第一個 Python 程式

  1. 進入虛擬機的 Linux/Ubuntu
  2. 安裝 Microsoft VSCode
  3. 安裝 Anaconda(記得勾選加入環境變數)
  4. 安裝 virtualenv (在終端機使用:pip install virtualenv 安裝)
  5. 在桌面創建一個 python_example 資料夾,打開 Microsoft VSCode 後開啟該專案資料夾,創建一個 hello.py 的檔案並在裡面打上 print('hello python!!')
  6. 打開 terminal 終端機 cd 移動到 hello.py 所在資料夾
  7. 執行 python hello.py,恭喜你完成第一個 Python 程式!

總結

如何設定開發環境應該是每個初學程式設計者的痛(強烈建議使用 Virtual Box 虛擬機搭配 Linux/Ubuntu 環境),以上介紹了如何在 Windows 打造 Python 開發環境設定,請讀者務必照著自己的電腦作業系統環境安裝一次,當然若你有志於往程式設計領域發展,也要熟悉一下指令碼操作。

參考文件

  1. VirtualBox 5.2安裝Ubuntu 16.04
  2. Create virtual environments for python with conda
  3. conda vs. pip vs. virtualenv
  4. Anacodna之conda VS Virtualenv VS Python 3 venv 对比使用教程,创建虚拟环境
  5. 命令列指令碼查詢

(image via githubusercontentwebsiteoptimizationytimgytimgostechnix

用 Python 自學程式設計:list、tuple、dict and set

· 閱讀時間約 6 分鐘

Python 自學程式設計:程式設計思維入門

Markdown 是一種輕量級的標記語言,最初為 John Gruber 所設計。Markdown 特色在於允許人們「使用易讀易寫的純文字格式編寫文件,然後轉換成有效的 HTML 文件」。簡而言之,Markdown 就是一種簡潔易懂的語法,讓我們可以專注在內容上,不用花時間思考外觀樣式,在透過轉換變成可以呈現在網頁上的 HTML 語法。目前在許多知名技術/開發者論壇或是開發者工具(例如:Github)、技術部落格工具都有支援 Markdown 語法。

什麼是 HTML?

在開始學習 Markdown 之前我們先來認識一下 HTML,畢竟 Markdown 最終還是要轉換成 HTML 這個網頁上內容結構的標準語法。HTML 中文稱作超文本標記語言(英文全名為 HyperText Markup Language,簡稱 HTML),是一種用於建立網頁的標準標記語言。

這樣講起來有點抽象,事實上我們每天在觀看瀏覽的網頁就是由一個個 HTML 所組成。所以我們可以透過瀏覽器的檢視原始碼功能去一窺目前網頁的 HTML 樣貌。

這邊我們使用 Google Chrome 瀏覽器當作範例,可以在畫面中點選右鍵 > 檢視原始碼(View Page Source):

就可以看到該網頁的 HTML 內容:

網頁來源:Wikipedia HTML 頁面

由於這個網頁已經有點複雜,因為它已經包含了 CSS 外觀樣式語法和 JavaScript 互動邏輯程式的部分,對於初學者來說比較難一眼理解。所以我們用一下範例來介紹 HTML 最基礎的部分:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<h1>我是標題</h1>
<p>我是段落</p>
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png" alt="">
</body>
</html>

若是使用瀏覽器打開這個 HTML 網頁會呈現:

HTML 標籤語法每個標籤皆有其意義且大部分成對出現,標籤元素內可以設定屬性值。網頁元素主要放置於 <body></body> 中,<head></head> 內主要放置 meta data 設定檔案和放置引入的外觀樣式檔案、程式邏輯等。元素內可以透過設定屬性值(attribute)來宣告元素功能,以下 href="https://zh.wikipedia.org/zh-tw/Markdown" 代表點擊該連結會到該 wikipedia 網址。

<!-- href 是屬性,決定連結點擊後目的地 -->
<a href="https://zh.wikipedia.org/zh-tw/Markdown">我是超連結</a>

<!-- src 是屬性,決定載入圖片位置-->
<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">

元素包裹內容在內,代表標題元素:

<h1>我是標題</h1>

Markdown 常見語法教學

一般 Markdwon 段落以空白行分隔。若是序列則內容需要內縮(一個 tab)。

標題

是一级標題
=======

# 一級標題
## 二级標題

其 HTML 元素為:

<h1>是一级標題</h1>
<h1>一級標題</h1>
<h2>二级標題</h2>

效果如下:

是一级標題

一級標題

二级標題

文字

_斜體_
**粗體**
`等寬字型Monospace`

其 HTML 元素為:

<em>斜體</em>
<strong>粗體</strong>
<code>等寬字型Monospace</code>

效果如下:

斜體 粗體 等寬字型Monospace

多行程式碼

其 HTML 元素為:

<pre>
<code>
<span>print('hello world')</span>
</code>
</pre>

效果如下:

print('hello world code :)')

水平線

---

其 HTML 元素為:

<hr>

效果如下:


無序列表

* 張三
* 李四
* 王二

其 HTML 元素為:

<ul>
<li>張三</li>
<li>李四</li>
<li>王二</li>
</ul>

效果如下:

  • 張三
  • 李四
  • 王二

有序列表

1. 不論
2. 三七
3. 二十一

有序列表,其 HTML 元素為:

<ol>
<li>不論</li>
<li>三七</li>
<li>二十一</li>
</ol>

效果如下:

  1. 不論
  2. 三七
  3. 二十一

巢狀有序列表

1. 不論
- 第一
- 第二
- 第三
2. 三七
1. 第一
2. 第二
3. 第三
3. 二十一

有序列表,其 HTML 元素為:

<ol>
<li>不論
<ul>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ul>
</li>
<li>三七
<ol>
<li>第一</li>
<li>第二</li>
<li>第三</li>
</ol>
</li>
<li>二十一</li>
</ol>

效果如下:

  1. 不論
    • 第一
    • 第二
    • 第三
  2. 三七
    1. 第一
    2. 第二
    3. 第三
  3. 二十一

超連結

[連結文字](連結網址)

其 HTML 元素為:

<a href="https://upload.wikimedia.org/wikipedia/commons/thumb/8/84/HTML.svg/200px-HTML.svg.png">連結文字</a>

效果如下:

連結文字

圖片

![文字屬性](Icon-pictures.png "文字標題")

其 HTML 元素為(少數沒有成對出現的元素標籤):

<img src="連結網址" alt="文字屬性" title="文字標題" />

效果如下:

圖片文字

注釋引用

> Markdown使用電郵用字元「>」來引用。

其 HTML 元素為:

<a href="連結網址">連結文字</a>

效果如下:

Markdown 使用電郵用字元「>」來引用。

表格

| Column 1 | Column 2 | Column 3 |
| -------- | -------- | -------- |
| Text | Text | Text |

其 HTML 元素為:

<table>
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Text</td>
<td>Text</td>
<td>Text</td>
</tr>
</tbody>
</table>

效果如下:

Column 1Column 2Column 3
TextTextText

總結

以上簡單介紹了:

  1. 什麼是 HTML?
  2. Markdown 常見語法教學

以上介紹了 HTML 和 Markdown 基礎語法的教學,透過 Markdown 這一種簡潔易懂的語法,我們可以更專注在內容創作上。對於一個自學程式設計新手而言,培養撰寫文章的習慣(例如:建立自己的技術部落格)是很重要的環節,不但可以累計自己經歷也可以強化記憶並幫助到需要的人。若是需要完整語法介紹可以參考markdown.tw,當然,只要多加練習就可以慢慢掌握 Markdown 語法的訣竅,進而喜歡這種簡潔的書寫方式。

參考文件

  1. Github Basic writing and formatting syntax
  2. markdown.tw
  3. markdown wiki

用 Python 自學程式設計:list、tuple、dict and set

· 閱讀時間約 5 分鐘

Python 自學程式設計:程式設計思維入門

在前一單元中我們了解了變數和 Python 世界物件的重要性,也介紹了簡單的資料型別,我們也有提到簡單資料型別(布林、整數、浮點數和字串)就像是原子一樣,而複雜資料型別就像是分子一樣,在這一單元中我們將更進一步了解 Python 複雜的資料型別以及如何操作它們。

串列 list 與元組 tuple

在程式語言中通常可以利用序列式方式去記錄資料,在 Python 中,我們使用 list 串列和 tuple 元組來儲存序列式資料。兩者最大的不同在於 tuple 是不可以改變的。

  1. 串列 list 串列是一連串順序性的元素組成,我們可以新增、讀取、刪除和修改串列,串列中可以有重複的元素。

    • 建立串列

    串列可以透過中括號或是使用 list 關鍵字來創建,裡面元素由逗號分隔

    my_list0 = []
    my_list1 = list()
    my_list2 = ['python', 'js', 'SQL']

    list('js')
    # ['j', 's']
    • 使用 index offset 和範圍來取得元素

    在電腦科學世界,index 通常是從 0 開始,-1 從結尾數回來:

    languages = ['python', 'js', 'go']
    languages[0] # python
    languages[1] # js
    languages[-1] # go

    範圍取值 [開始:結束(不含):間隔(default 1)]:

    languages = ['python', 'js', 'go']
    my_list2[0:1] # ['python']
    • append 元素到串列最後
    languages = ['python', 'js', 'go']
    languages.append('java')
    • extend 串連串列
    languages = ['python', 'js', 'go']

    languages.extend('c++') # ['python', 'js', 'go', 'c++']

    languages += ['ruby', 'c'] # ['python', 'js', 'go', 'c++', 'ruby', 'c']
    • insert 插入元素到位置上
    languages = ['python', 'js', 'go']
    languages.insert(0, 'java') # ['java', 'python', 'js', 'go']
    • del 刪除特定 index 值
    languages = ['python', 'js', 'go']

    del languages[-1] # ['python', 'js']

    • len() 元素長度
    len(['python', 'js', 'go']) # 3
    • in 檢查元素是否在串列
    'java' in ['python', 'js', 'go'] # False

    還有更多好用的方法,讀者可以進一步查詢使用: remove()index()count()join()、sort()、copy()

  2. 元組 tuple 元組可以視為不可改變的串列,使用方式如下:

    languages = python', 'js', 'go' # (python', 'js', 'go')
    tuple(['python', 'js', 'go'])

    元組比起串列好處:

    • 佔用空間較少
    • 可以當做字典的 key(因不可變)
    • 具名 tuple 可當做物件替代
    • 當做函式引數

字典 dict 和集合 set

  1. dict 在其他程式語言可能稱 {'key':'value'} 字典為關聯式陣列或是雜湊表,其用獨一無二不可變的鍵(布林、整數、浮點數、字串和串列)去對應值,字典通常是可變的,可以新增刪除、修改鍵值。

    • 創建 dict
    languages = {
    'name': 'python',
    'version': '3.5'
    }

    dict([('name', 'python'), ('version', '3.5')])
    • 新增和取值
    languages = {}

    languages['name'] = 'python'

    print(languages['name']) # python
    • 合併
    languages = {
    'name': 'python',
    'version': '3.5'
    }

    languages2 = {
    'name': 'js',
    'version': '6'
    }

    languages.update(languages2)
    • keys() 取得所有鍵、values() 取得所有值、items() 取得所有鍵值對
    languages = {
    'name': 'python',
    'version': '3.5'
    }

    languages.keys() # ['name', 'version']
    languages.values() # ['python', '3.5']
    languages.items() # [('name', 'python'), ('version', '3.5')]
    • 使用 in 判斷 key 是否存在 dict
    languages = {
    'name': 'python',
    'version': '3.5'
    }

    'name' in languages # True
  2. set 類似小學時候學習的數學集合,可以想成就是留下鍵值的 dict。由於 set 存不重複值。當你只想知道值是否存在就是使用 set 的時機,例如使用 in 來判斷值是否存在。

    • 建立 set
    languages = set()

    languages = {'python', 'js', 'python', 'go'}
    # {'python', 'js', 'go'}
    • 轉換成 set
    set('python') # {'p', 'y', 't', 'h', 'o', 'n'}
    set(['python', 'js']) # {'python', 'js'}
    set(('python', 'js')) # {'python', 'js'}
    • 使用 intersection 取交集,union 取聯集,difference 取差集
    languages1 = {'js', 'python', 'go'}
    languages2 = {'python', 'go', 'java'}
    languages1.intersection(languages2) # {'python', 'go'}
    languages1.union(languages2) # {'js', 'python', 'java', 'go'}
    languages1.difference(languages2) # {'js'}

整合在一起

回想一下,我們可以使用 [] 建立 list 串列,用 , 來創立 tuple 元組,使用 來建立字典。雖然建立方式不盡相同,但相同的是你都可以透過中括號來存取內容值:

languages0 = ['python', 'js'] # languages0[0]
languages1 = ('python', 'js') # languages1[0]
languages2 = {
'name': 'python',
'version': '3.5'
} # languages2['name']

總結

以上就是程式設計思維入門簡介,透過了解什麼是程式設計思維和不同語言的特性,我們將對於自學程式設計有更正確的認識。接下來我們將透過 Python 介紹程式設計的內涵和不同的應用情境。當然,網路上也有許多學習資源可以當做參考。

(image via mshcdn

延伸閱讀

  1. Python 官網
  2. JavaScript 程式設計新手村
  3. Python Web 程式設計入門實戰
  4. 非本科生,我想半路出家學寫程式,該如何開始?
  5. 自學程式設計學習資源懶人包

用 Python 自學程式設計:變數(variable)與資料型別(type)

· 閱讀時間約 7 分鐘

Python 自學程式設計:程式設計思維入門

在前一單元中我們了解了程式設計思維的概念和建立了 Python 的開發環境,在這一單元中我們將了解 Python 變數與資料型別以及如何操作字串。

電腦最初的用途就是一台超大台計算機

資料的儲存以及操作在程式設計中扮演非常重要的角色,因為最早的電腦程式就是一種大型的計算機(最早的電腦就稱為計算機),即便現在學校教授電腦科學概論往往都會把課程稱為計算機概論呢!在操作資料的過程中如何儲存資料就是非常重要的事情,一般而言資料儲存有分為暫時儲存的揮發性資料(儲存在記憶體中的變數資料)和持久性儲存的資料(例如:資料庫、檔案等),在這邊我們討論的是變數的資料。

在 Python 世界,所有東西都是物件

在 Python 世界中,所有東西都是物件,物件可以視為透明的箱子,裡面存了一些資料。物件會有自己的資料型別,決定它做什麼樣的操作。另外,又依據箱子內的值可否改變而分為不可變物件可變物件

在前面我們有提到資料可以儲存在記憶體中的變數,在 Python 中變數只是一種名稱,當給定值時不會將值複製,而是將名稱貼到給定的物件上(注意 Python 程式語言中的 = 是給定值,== 才是相等的意思)

談到資料,就不得不談一下資料型別(type),雖然在 Python 不用像 C 語言之類程式語言需要在變數前面定義資料型別(在 Python 中 class 類別和 type 類型幾乎代表同一件事情,class 類別則是定義物件的基礎),但物件的資料型別會影響資料操作,所以值得我們好好認識。在 Python 世界裡,可以分為以下幾種簡單資料型別(可以想像成化學課中的原子):

  1. bool 布林,分為 TrueFalse 通常用於條件判斷
  2. int 整數,例如: 10999999
  3. float 浮點數,係指有小數點的整數:1.2221.0e7 等同於 10 的 7 次方
  4. string 字串,一串文字字元

我們可以透過 type(物件) 去確認該物件的型別:

print(True)
print(101)
print(3.14)
print('happy coding')

另外一種是複雜資料型別(可以想像成是化學課中的分子),這個我們會在下一個單元做討論:

  1. list 串列,用於儲存一系列序列資料(可以儲存不同資料型別),類似於其他程式語言的陣列但更為強大
  2. tuple 元組,類似於 list 串列,但不同的是 tuple 給定元素後不能改變
  3. dict 字典,和串列很像但不在乎元素順序,而且不會使用 0,1,...等的序列 index 來選擇項目,反之我們必須宣告唯一的 key 鍵值來對應想儲存的 value 值
  4. set 集合,集合就像是被移除 value 值的字典,只有保留 key 鍵值,也就是說 set 的內容元素都必須是獨一無二的

物件又分可變和不可變物件

  1. 不可變物件(int, string, float, tuple),亦即若資料改變,會複製一份資料到新的記憶體空間然後資料更新,下面是一個簡單範例:

    i = 101 # 宣告一個變數將 i 便條紙貼到 101 物件
    j = 101 # 宣告一個變數將 j 便條紙貼到 101 物件
    print(id(101)) # 印出 101 物件 id,可以想成是記憶體位置
    print('i id:' + str(id(i))) # 印出 i 指向的 id,和 101 物件值相同
    print('j id:' + str(id(j))) # 印出 j 指向的 id,和 101 物件值相同
    print(i is j) # 因為兩者會貼到同一個物件所以會顯示相等,True
    j = j + 1 # 若資料改變,會複製一份資料到新的記憶體空間然後資料更新
    print('new i id:' + str(id(i))) # 印出一樣的 id
    print('new j id:' + str(id(j))) # 印出新的 id
    print(i is j) # 兩者指到不同的記憶體位置,False

    執行結果:

    140181136769920
    i id:140181136769920
    j id:140181136769920
    True
    new i id:140181136769920
    new j id:140181136769952
    False
  2. 可變物件(list, dict, set),亦即若資料改變則直接在指向的記憶體空間改變資料,下面是一個簡單範例:

    a = {} # 宣告一個變數指到一個空字典 dict
    b = a # 將 b 變數指到 a 同樣記憶體位置
    print(id(a)) # 印出 a 的 id
    print(a is b) # 兩者指到相同的記憶體位置,True
    a['a'] = 'python' # 改變 a 的鍵值
    print('id a:' + str(id(a))) # 印出 a id
    print('a:' + str(a)) # 印出內容值
    print('id b:' + str(id(b))) # 印出 b id,dict 為可變物件,印出 id 會和 a 一樣
    print('b:' + str(b)) # dict 為可變物件,印出內容值會和 a 一樣
    print(a is b) # 兩者指到相同的記憶體位置,True

    執行結果:

    140181112792336
    id a:140181112792336
    a:{'a': 'python'}
    True
    id b:140181112792336
    b:{'a': 'python'}
    True

另外,Python 支援強制轉換資料型別: 可以透過 int()、float()、str() 進行資料型別轉換

int(1.2)
float('1.3')
str('1')

字串操作好好玩

在程式設計的世界中,操作字串基本上是家常便飯,接著我們來談談在 Python 中如何進行字串的操作:

在 Python 中若要宣告字串,可以使用單引號或雙引號,會有兩種方式是因為讓開發者可以產生有 '" 內容的字串。

my_str = 'This is a "good" language!'

但要特別留意的是在 Python3 和 Python2 對於字串的支援不盡相同,在 Python 中支援 Unicode 標準。與其他程式語言不同的是 Python 字元是不可變的,不能直接改變字串,但可以將一部分字串複製到其他字串。

以下是常見字串操作方式:

  1. 宣告字串

    language = 'python'
  2. 串連字串 +

    language = 'python'
    word = 'I love'
    word + language
  3. 複製字串 *

    language = 'python'
    language * 3
  4. 選取字串 [開始:結束:間隔]

    language = 'python'
    language[0:1] # p
    language[0:-1] # pytho
    language[0:4:2] # ph
  5. len、split、join、replace 字串操作

    language = 'python'
    print(len(language)) # 印出字串長度 6
    print(language.split(3)) # 切割字串長度
    print(language.join(3)) # 切割字串長度
    print(language.replace(3)) # 切割字串長度

總結

以上我們介紹了在 Python 世界中物件是基本元素,也介紹了變數以及字串的操作,接下來我們將透過 Python 介紹程式設計的內涵和不同的應用情境以及複雜資料型別的使用。

(image via mshcdn

延伸閱讀

  1. Python 官網
  2. JavaScript 程式設計新手村
  3. Python Web 程式設計入門實戰
  4. 非本科生,我想半路出家學寫程式,該如何開始?
  5. 自學程式設計學習資源懶人包
  6. python可变和不可变对象

用 Python 自學程式設計:程式設計思維入門

· 閱讀時間約 14 分鐘

Python 自學程式設計:程式設計思維入門

最近幾年全球刮起了一股爭相學習電腦科學(Computer Science)和程式設計(Programming)的風氣,上至總統、首相下至升斗小民都爭相開始學寫程式。事實上,學寫程式最重要的是學習電腦科學背後思考方式和邏輯,學習如何透過科技解決生活上的問題。更進一步說,程式設計與其說是一種科學,更偏向一種藝術人文的創作與科學的混合體。以前畫家或是作家是拿紙筆創作,現在只要有一部電腦,連上網路,就可以透過敲打鍵盤將自己的創意付諸實踐。

有人說:程式設計 = 演算法 + 資料結構

這樣的說法不能說錯。事實上,具備良好資料結構和演算法素養的程式設計師往往可以寫出品質較好的程式碼,但大部分人看到演算法和資料結構就已經滿臉問號了,更別提曾經在學校被這兩門課程心靈受挫的學生們。所以對於初學者來說,更應該讓他了解,事實上學程式設計思維就是在學習解決問題的能力:

  1. 尋找並發現問題
  2. 釐清並定義問題
  3. 分解問題
  4. 尋找解決方法和資源
  5. 驗證問題和解決方式

唯有具備這樣解決問題的能力,才能稱得上真正學會程式設計思維。而這樣的思考方式的訓練是不管將來到哪裡,是否有從事程式設計相關工作都受用,這才是對於學習電腦科學與程式設計思維正確的認知。

寫程式就是下指令請電腦做事情

剛剛我們在上面提到程式設計思維中有一個部分是分解問題,事實上,寫程式在定義問題後,我們必須把問題切分,就像是食譜一樣,不管是再豐盛的料理或是滿漢全席,都有一個個步驟去完成。舉例來說,我們今天要創作一道蔥花蛋或菜脯蛋,我的步驟會是:

  1. 放點油
  2. 打蛋
  3. 如果喜歡蔥花可以加入蔥花,如果喜歡菜脯可以加入菜脯(程式術語:if...else 條件判斷)
  4. 放入少許鹽巴
  5. 中火快炒,翻五次面(程式術語:for 迴圈)
  6. 當看到蛋面呈現金黃色時可以起鍋,結束料理(程式術語:while 迴圈)
  7. 好吃的蔥花蛋或菜脯蛋上桌

再大程式切分後就變成一個個小程式和指令,將程式切分成一個個模組,再將它們都組裝起來就成我們的應用程式和系統。

第一次學寫程式,學哪一種語言好呢?

既然程式設計思維很重要,究竟第一次學寫程式,學哪一種語言好呢?

先講結論:Python 語法平易近人,學習曲線平緩,應用廣,可以很快做出一些解決生活上問題的應用,累積成就感,適合初學者。當然若你是國中小的學生,Scratch 之類的拖拉式圖象化程式語言或許是合適選擇,但成人一般對於這種玩具比較排斥些,認為不是真正在學寫程式。

一般而言除了區分高低階程式語言外,我們會把程式語言分為:

靜態語言:在程式語言中我們會使用變數(variable)儲存程式的值,在靜態語言中需要事先宣告變數型態(type),也宣告了它會在記憶體中佔有多少空間等資訊。電腦會透過這些資訊把程式編譯(compile)成低階的機器語言讓電腦可以執行。這樣的設計可以讓電腦執行起來更有效率,但對於開發者來說會比較繁瑣一些(例如:宣告字串變數要在變數前加 string 宣告),也由於類型被宣告後無法改變,所以被稱為靜態語言。常見的靜態語言包括:C/C++、Java、C#、Go、Swift 等)。

動態語言(又稱為 script language):相對於靜態語言,動態語言不會強制變數類型宣告,它不是使用編譯器而是使用直譯器(interpreter)來解譯。動態語言雖然開發和撰寫程式上效率較快,但執行速度往往比靜態語言慢(現在差距已經慢慢變小)。一般常見的動態語言包括:Python、JavaScript、PHP、Ruby 等)。

以下就來先簡單介紹常見程式語言和它的簡單語法範例(可以透過 repl.it 可以將程式碼貼在網頁上呈現所見即所得效果):

  1. Python 本系列文章的主角,Python 是一種物件導向、直譯式的跨平台動態程式語言,它包含了一組功能完備的標準庫和豐富套件生態系,可以輕鬆完成很多常見的任務(例如:物聯網應用開發、遊戲、讀寫檔案、自然語言處理、網路爬蟲、網站開發、機器學習等),因為它可以很輕易整合其他底層語言,所以又稱為膠水語言。它的語法簡單,與其它大多數程式設計語言使用大括弧不一樣,它使用縮進來定義語句塊。由於具備簡潔易學等特性,是許多開發者推薦 Python 為初學者第一個學習的程式語言。由於版本更迭,我們接下來討論的主要是以 Python3 為主。以下是使用 Python 印出最喜歡的語言:

    language = 'Python'
    print('My favorite Language is {}'.format(language))
  2. C 經典的傳統主力程式語言,適用於需要效能重視速度的應用,可以操作許多小細節,但學習門檻稍微高一些,執行前需要事先編譯完成:

    #include <stdio.h>
    int main(int atgc, char *argv[]) {
    string language = "C++";
    printf("My favorite Language is %s", language);
    return 0;
    }
  3. C++ 屬於 C 家族成員,具備物件導向特性,同樣是適用於需要效能重視速度和操作底層韌體、硬體的好選擇:

    #include <iostream>
    using namespace std;
    int main() {
    string language = "C++";
    cout << "My favorite Language is " << language;
    return(0);
    }
  4. Java 常見於企業系統和 Android 行動應用開發的 Java 是物件導向程式語言,由於跨平台開發等特性讓 Java 一直是市場蠻熱門的語言。

    public class CodeLanguage {
    public static void main(String[] args) {
    string language = "Java";
    System.out.format("My favorite Language is %s", language);
    }
    }
  5. C# 由微軟推出吸收了 C++/Java 等優點的物件導向程式語言,常見於開發微軟平台相關的應用程式。

    using System;
    namespace CodeLanguage {
    class CodeLanguage {
    static void Main() {
    string language = "C#";
    Console.WriteLine("My favorite Language is {}", language);
    }
    }
    }
  6. JavaScript 隨著版本演進和 Node.js 的推出後從玩具語言到可以挑大樑的程式語言,應用範圍遍及網頁前後端開發、遊戲開發、物聯網程式開發、手機程式開發等。是程式設計師社群平台 Github 和程式問答平台 StackOverflow 上最受歡迎的程式語言之一。且由於應用範圍廣泛,程式江湖更傳言:可以使用 JavaScript 編寫的程式,最終都會出現 JavaScript 版本。

    var language = 'JavaScript'
    console.log('My My favorite Language is ' + language);
  7. PHP 吸收了 C/Java/Perl 特點的網站開發主力語言,世界上有許多的網站都是使用 PHP 進行開發。

    <?php
    $language = 'PHP';
    echo 'My favorite Language is ' + language;
    ?>
  8. Ruby 常見於網頁 Web 開發,以 Ruby on Rails Web 開發框架聞名於程式設計社群。

    language = 'Ruby'
    puts 'My favorite Language is #{language}'
  9. Swift 由 Apple 推出的推出的程式語言,主要用於開發 iOS/Mac 系列產品,應用範圍也涉及到了伺服器端開發(Server)。

    let language = 'Swift'
    print("My favorite Language is ", language)

  10. Go 由 Google 推出的程式語言,適合用於平行化程式開發。

    package main
    import "fmt"

    func main() {
    language := 'Go'
    fmt.Printf("My favorite Language is %s", language)
    }

看完了眾多語言是不是發現其實 Python 語法還蠻可愛平易近人的呢?事實上,世界上沒有最好的程式語言,只有最適合的使用地方。接下來我們將透過 Python 學習程式設計思維。

Python 環境建置

在開始之前我們必須先建置相關的開發環境,讓自己從麻瓜(不會寫程式的人)變成擁有程式魔力的魔法師。

所謂工欲善其事,必先利其器,要開發好的應用程式必須先準備好開發環境才行。以下介紹我們在接下來開發 Python Flask Web 應用程式所需要安裝的開發環境工具(以下以 Mac OS 等 Unix-like 作業系統為示範,若是 Windows 使用者建議安裝 Virtualbox 並運行 Linux Ubuntu 作業系統,參考安裝文件):

  1. Microsoft VSCode 編輯器 Microsoft VSCode 是 Microsoft 推出的編輯器(非整合開發環境 IDE),夾帶著 Microsoft 過去打造 Visual studio 整合開發環境的豐富經驗,相比 Sublime Text 和其他編輯器,VSCode 的優勢在於開源且活躍的開發社群、內建 debugger 框架、原生 Git 整合、套件整合容易等特性。所以對於初學者來說 VSCode 是一個蠻適合入門的開發環境。它的安裝方式也十分簡易,在官網下載後按照指示安裝完成即可。

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    我們可以安裝 Python 語法和格式檢查的相關 Python 套件幫助除錯:

    Python Web Flask 實戰開發教學 - 簡介與環境建置

  2. 終端機環境(iTterm/內建 terminal) terminal(終端機)是我們下指令的地方,許多時候我們進行程式開發時不會使用 GUI 的介面而是使用下指令方式請電腦做相對應的行為。在 Linux 和 Mac 裡面都有內建的 terminal 的應用程式,若你是 Mac 用戶想使用更便利的工具(分割視窗、熱鍵、搜尋、自動補完等)可以額外安裝 iterm2 做使用。若是不想使用 Virtualbox,使用 Windows 讀者可以使用 Cmder 這個軟體當做終端機環境。

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    下指令($ 為提示字元,不用輸入):

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    對於有志於從事程式開發相關工作的讀者建議可以多熟悉指令碼的輸入,更多指令碼可以參考鳥哥撰寫的 Linux 基本指令介紹Linux 學習資源

  3. Git 版本控制系統/註冊 GitHub 帳戶 Git 是一種分散式版本控制系統,可以讓我們可以更方便地管理我們的程式碼。在網路上有非常多優秀的 Git 教學文件(連猴子都能懂的Git入門指南寫給大家的 Git 教學初心者 Git 上手攻略)。安裝 Git 方式是到官網下載軟體,依照指示安裝。

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    互動式語法學習:

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    在介紹完 git 之後我們來了解一下 GitHub。GitHub 是一個可以存放 git 程式碼專案的平台,透過 GitHub 我們可以接觸到最新的開放原始碼資訊,也可以將我們的程式碼開源出來。

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    從 GitHub 上複製程式碼

    Python Web Flask 實戰開發教學 - 簡介與環境建置

    # 複製一份到本地端
    $ git clone https://github.com/happycoderorg/flask101.git
    # 移動到資料夾
    $ cd flask101

    常見 Git 指令:

    # 初始化專案
    $ git init
    # 查看狀態
    $ git status
    # 檢查差異
    $ git diff
    # 將變更檔案放入暫存區
    $ git add index.py
    # 使用 commit -m 提交變更
    $ git -a -m 'init commit'
    # 查看歷史
    $ git log
    # 放棄已經 commit 的檔案重回暫存區
    $ git reset HEAD index.py
    # 放棄檔案變更
    $ git checkout index.py
  4. Anaconda Python3 版本 Anaconda 是一個 all-in-one 的 Python 開發環境,對於初學者來說是個十分合適的開發環境包。Anaconda 具備了幾項特點:

    • 便於安裝許多流行的科學、數學、工程、數據分析的 Python 模組
    • 開源和免費
    • 跨平台支持:Linux、Windows、Mac
    • 支持 Python 版本切換,方便建立不同的虛擬開發環境
    • 內建 Spyder 編輯器和 Jupyter Notebook 環境

    安裝流程也十分簡單,進入 Anaconda 首頁,選擇對應作業系統(這邊使用 Mac OS): Python Web Flask 實戰開發教學 - 簡介與環境建置

    選擇對應 Python 版本下載,我們使用 Graphical Installer(圖像介面安裝方式),接著在下載完成時按照預設的安裝方式完成安裝; Python Web Flask 實戰開發教學 - 簡介與環境建置

    若是完整安裝成功,可以打開終端機輸入,若是顯示 Python 3.6.0 :: Anaconda 4.3.0 (x86_64) 版本號即安裝成功:

    $ python -V
    Python 3.6.0 :: Anaconda 4.3.0 (x86_64)

    接著要建立我們專案虛擬環境,這樣在安裝操作套件時比較不容易被污染到 root 的環境,啟動後會出現(套件名稱)的提示字元:

    # 顯示目前虛擬環境列表
    $ conda info -e
    # 創建虛擬環境
    $ conda create -n 套件名稱 python=3.6
    # 進入虛擬環境(若是 Windows cmder 環境不用加 source) ,成功後提示字元變成:(套件名稱)$
    $ source activate 套件名稱
    # 離開虛擬環境(若是 Windows cmder 環境不用加 source)
    $ source deactivate

建立虛擬環境

在建立相關開發工具後我們正式來建立一個 Python 的專案:

打開終端機移動到桌面,建立專案資料夾

$ cd ~/Desktop
$ mkdir python_examples
$ cd python_examples

建立獨立虛擬環境,並進入虛擬環境:

$ conda create -n python_examples_venv python
$ source activate python_examples_venv

成功進入虛擬環境後

你的第一個 Python 程式

一般而言我們會使用編輯器或是整合開發環境(IDE)進行程式撰寫,然後在終端機下指令執行程式。當然你也可以在終端機上使用內建互動式介面或是 jupyter notebook 進行。以下是我們要介紹給大家的簡單範例,第一個是隨機印出不同的喜愛程式語言,第二個是使用第三方套件擷取政府公開資料。程式設計唯有動手實際操作和實踐才能學的好,希望讀者打開你的編輯器透過自己實作去熟悉 Python 程式撰寫:

隨機印出不同的喜愛程式語言:

  1. 引入 random 套件
  2. 定義 language 變數,並將儲存程式語言字串的串列(list)資料結構給定給變數
  3. 產生 1 到 2 之間的隨機整數
  4. 列印出最喜歡的程式語言字串(含根據隨機產生的 index 選取到的串列值)
import random

language = ['Python', 'JavaScript', 'Java']
rnd = random.randint(1, 2)
print('My favorite Language is' + language[rnd])

可以在終端機移動到檔案資料夾執行程式檔案,例如:

python favorite_language.py

使用第三方套件擷取政府公開資料:

  1. 引入 requests 套件
  2. 爬取政府公開 Wifi 熱點資料,將取得資料回應給定給 response 變數
  3. 將資料轉換成以 { "key": "value "} 形式的 json 格式
  4. 印出取得的資料
import requests

url = 'http://data.taipei/opendata/datalist/apiAccess?scope=resourceAquire&rid=b087af42-2c54-4dbf-86c8-427d788779e5'
response = requests.get(url)
data = response.json()
print(data)

總結

以上就是程式設計思維入門簡介,透過了解什麼是程式設計思維和不同語言的特性,我們將對於自學程式設計有更正確的認識。接下來我們將透過 Python 介紹程式設計的內涵和不同的應用情境。當然,網路上也有許多學習資源可以當做參考,若你需要先建立基本的電腦科學知識的話,可以參考哈佛大學的熱門公開課程 CS50

(image via mshcdn

延伸閱讀

  1. Python 官網
  2. JavaScript 程式設計新手村
  3. Python Web 程式設計入門實戰
  4. 非本科生,我想半路出家學寫程式,該如何開始?
  5. 自學程式設計學習資源懶人包
  6. CS50
  7. CS50 TV

Go Web 程式設計入門教學:Web 基礎

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

前面幾個單元中我們介紹了許多 [Go 程式語言](https://en.wikipedia.org/wiki/Go_(programming_language) 的基本語法,讓我們了解了 Go 程式語言的用法。接下來我們將透過 Go 來架設簡單的 Web Server。

Web 基本工作流程

Go Web 程式設計入門教學

在我們平常透過瀏覽器(Browser)瀏覽網站時,其背後事實上進行了一連串 Client 客戶端和 Server 伺服器端的互動,以下介紹 Web Server 工作流程簡介:

  1. 使用者在瀏覽器(Browser)網址列輸入 URL,瀏覽器會透過 DNS 伺服器進行解析,取得 Domain 對應伺服器(Server)的 IP 位置
  2. 找到對應 Server IP 後,Client 透過 TCP/IP 協定建立到 Server 的 TCP 連接
  3. Client 向 Server 發送 http 協定請求(request)封包,請求 server 資料
  4. 若請求資源中有動態網站的內容,Server 端會先呼叫伺服器端的程式語言解譯引擎負責處理內容。Server 將組好的內容向 Client 發送 http 協定回應(response)封包
  5. Client 和 Server 中斷 TCP 連線,等待下一次請求。由 Client 解析收到的回應(response)封包內容(body),在瀏覽器繪製 HTML/CSS/JavaScript 檔案內容

Go Web 程式設計入門教學

  • URL 解析

一般 URL(Uniform Resource Locator)結構大概長這樣:

Scheme://host{:port#}/path/.../[?query-string][#anchor]
  1. scheme:底層使用的協定(例如:https、http 或 ftp 等)
  2. host:http 伺服器 ip 位置或 domain
  3. port:http 預設是 80 可以省略,如果是使用其他則需要填寫,可以想成是 ip 的名牌號碼
  4. path:資源路徑
  5. query-string:使用 get 傳送的參數
  6. anchor:記錄超連結錨點
  • DNS(Domain Name System)解析路徑

    1. 輸入網址,查找本機的 host 檔案
    2. 若 host 沒有 domain/ip 對應,則查找本機的 DNS 解析器快取
    3. 若 host/本機 DNS 快取都沒有 domain 對應則解析 TCP/IP 參數中設定的第一個 DNS 伺服器或其快取回傳(不具權威性)
    4. 若都故障,則會由 domain 右往左查找對應 DNS 伺服器(轉發/非轉發模式),回傳給本機 DNS 伺服器
  • HTTP request 請求解析 接著我們聊聊在 HTTP 協定中有定義許多和伺服器互動的方式,最基本的有四種:GETPOSTPUTDELETE,分別對應資源的查增更刪,最常見的舊是 GETPOST

    其中 GET 會把傳送資料放在網址後面,資料為明碼且有長度限制,一般用於查找資料。而 POST 資料傳遞主要是放在 http request 的 body 中,所以新增資料或是傳遞較敏感資料通常會用 POST 傳送

  • HTTP response 回應解析 http response 封包組成由版本編號、狀態碼、狀態訊息組成

    HTTP 狀態碼是使用三位數字組成,在 HTTP/1.1 中定義五大類狀態碼:

    1XX 提示訊息 2XX 成功 3XX 重新導向 4XX client 錯誤 5XX server 錯誤

使用 Go 架設基本 Web Server

在 Go 中可以使用 net/http 套件建立 Web 伺服器:

  1. Request:使用者請求的資訊,包含 post, get, cookie 等
  2. Response:伺服器需要回饋給使用者的資訊
  3. Conn:使用者請求每次產生連結
  4. Handler:處理請求和產生傳回資訊的處理邏輯
package main

import (
"fmt"
"net/http"
"log"
)

// 處理函式
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world!")
}

func main() {
// 網址對應處理函式
http.HandleFunc("/", helloHandler)
// 監聽通訊 port
err := http.ListenAndServe(":7777", nil)
if err != nil {
log.Fatal("ListenAndServe", err)
} else {
log.Println("listen 7777")
}
}

總結

以上就是關於 Go 程式語言的 Web 基礎和 http 協定簡介,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install

(image via slidesharecdnwebsiteoptimization

Go Web 程式設計入門教學:語法基礎之函式(function)篇

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

前面單元我們介紹了如何使用流程控制改變我們的程式執行順序,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 函式的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。

函式簡介

有經驗的程式設計都知道程式撰寫的維護性很重要,其中模組化就是很重要的元素。當我們有一組程式出現過兩三次,那就很適合把它當做函式包裝起來。在程式語言中函式和數學上的函數有蠻多類似之處。我們可以把函式想成是一個黑盒子,透過呼叫函式可以完成我們想要做的工作,可能是傳入參數相加或是執行某段沒有回傳值的程式碼。

// 有一個關鍵字 func 其後接函式命名,可以傳入參數名稱和其資料型別(也可以不傳參數),後面是帶若有回傳值時的回傳值名稱和資料型別(也可以沒有回傳值)
func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) {
// 若有回傳值
return value1, value2
}
  1. 基本函式 基本款的函式就是有函式名稱,傳入參數和回傳值:

    package main

    import "fmt"

    func add(a, b int) int { // 當只傳一個回傳值且沒有定義回傳值變數時可以簡化括號
    return a + b
    }

    func main() {
    fmt.Println(add(1, 2))
    }
  2. 多回傳值

    package main

    import "fmt"

    func addAndProduct(a, b int) (int, int) { // 多回傳值要用括號括起
    return a + b, a * b
    }

    func main() {
    fmt.Println(addAndProduct(1, 2))
    }
  3. 長度不固定參數

    func argFunc(arg ...int) {}
  4. 傳值與傳指標
    一般來說我們傳入函式的參數是複製一份傳入,改動參數不會影響原有值。若今天我們傳入的不是複製值而是記憶體位置的指標,則會更改到原有值。

    package main

    import "fmt"

    func add(a int) int {
    return a + 10
    }

    func main() {
    a := 1
    fmt.Println(add(a)) // 11
    fmt.Println(a) // 1
    }

    換傳指標進去:

    package main

    import "fmt"

    func add(a *int) int {
    *a = *a + 10
    return *a
    }

    func main() {
    a := 1
    fmt.Println(add(&a)) // 11
    fmt.Println(a) // 11
    }
  5. defer 採用後進先出方式在函式全部執行結束前執行,常用於開啟資源後關閉檔案:

    func ReadFile() bool {
    file.Open("./file.txt")
    defer file.Close()
    if failureA {
    return false
    }
    if failureB {
    return false
    }
    return true
    }
  6. 函式當做值和類型

    type test func(int) (bool)

    func testIt(f test, a int) {

    }
  7. Panic、Recover 中斷程式進入 panic 狀態,用 Recover 可以恢復

模組

  1. main 函式和 init 函式

    當程式很複雜時,可以拆成不同 package 和檔案,其中 package main 為必要,其於 package 可以放置其他函式,在 Go 中函式或變數開頭大寫代表公有露出可以讓其他套件使用,反之為私有。其中 main 和 init 是保留函式,init 函式可以用於所有 package,main 用於 package main。Go 語言會自動呼叫兩者,init 是可選的,程式初始化是從 main 開始,如果有匯入其他套件會在編譯時依序匯入。如果有一個套件被引入多次,只會被引入一次。

    相對路徑:

    import "./model" // 同一目錄的 model 下

    絕對路徑:

    import "xxx/model" // gopath/src/xxx/model

    一般引用套件用法:

    import (
    "fmt"
    )

    fmt.Println("hi")

    點用法:

    import (
    . "fmt"
    )

    Println("hi")

    別名:

    import (
    f "fmt"
    )

    f.Println("hi")

    只執行套件中 init,不使用裡面函式:

    import (
    _ "fmt"
    )

總結

以上就是關於 Go 程式語言的基本語法中流程控制介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

Go Web 程式設計入門教學:語法基礎之流程控制(flow control)篇

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

前面單元我們介紹了如何建置 Go 變數和資料型別的使用,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 的流程控制的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。

流程控制簡介

一般而言,程式語言是由上往下執行,若我們需要程式依照我們設計的邏輯方向執行就需要流程控制的協助。在這邊主要談的流程控制有三部分:條件判斷、迴圈循環、跳躍控制。

我們使用制做菜脯蛋食譜步驟來講解範例:

  1. 放點油
  2. 打蛋
  3. 如果喜歡蔥花可以加入蔥花,如果喜歡菜脯可以加入菜脯(程式術語:if...else 條件判斷)
  4. 放入少許鹽巴
  5. 中火快炒,翻五次面(程式術語:for 迴圈)
  6. 當看到蛋面呈現金黃色時可以起鍋,結束料理(程式術語:while 迴圈)
  7. 好吃的蔥花蛋或菜脯蛋上桌

首先介紹,條件判斷,如果 if...。條件判斷是一種邏輯判斷,當符合條件就怎麼樣,不符合條件就怎麼樣。

  1. if...else

    package main

    import "fmt"

    var taste = "菜脯蛋" // 喜歡菜脯蛋

    if taste == "菜脯蛋" {
    fmt.Println("加入菜脯")
    } else {
    fmt.Println("加入蔥花")
    }

    Go 語言中除了條件判斷不用加 () 外,也可以在條件判斷敘述宣告變數,但只會存活於條件邏輯區塊使用上。

    package main

    import "fmt"

    if taste := "蔥花蛋"; taste == "菜脯蛋" {
    fmt.Println("加入菜脯")
    } else {
    fmt.Println("加入蔥花")
    }

    fmt.Println(taste) // 編譯錯誤,條件判斷敘述宣告的變數,只會存活於條件邏輯區塊使用上
  2. goto Go 中還提供了 goto 語法,讓你可以直接跳躍到某定義區塊,但建議小心使用。

    package main

    import "fmt"

    func main() {
    num := 91

    if num >= 60 {
    fmt.Println("hi true")
    goto PASS
    } else {
    fmt.Println("hi false")
    }
    PASS:
    fmt.Println("hi pass")
    }
  3. for 迴圈 在 go 中 for 迴圈的功能強大,既可以被當做循環讀取資料,又可以當做 while 來控制邏輯,還能反覆操作運算,以下介紹 for 語法:

    for 變數宣告或函式回傳值; 條件判斷; 每輪結束時操作 {
    // ...
    }

    我們接著使用食譜範例,中火快炒,翻五次面:

    package main

    import "fmt"

    func main() {
    for index := 0; index < 5; index++ {
    fmt.Println("翻面", index + 1, "次")
    }
    }

    當我們不知道具體要迴圈幾次時可以使用 while,但由於 Go 中沒有 while 關鍵字,當忽略了 ;,就可以當 while 迴圈使用:

    package main

    import "fmt"

    // 從 1 加到 10
    func main() {
    sum := 0
    i := 0
    for i <= 10 {
    sum += i
    i++
    }
    fmt.Println(sum)
    }

    使用 break 和 continue 可以跳出整個循環和跳過當下:

    package main

    import "fmt"

    // 從 1 加到 10
    func main() {
    sum := 0
    i := 0
    for i <= 10 {
    if i == 3 {
    break; // continue 跳過 3,break 到 3 整個循環跳出
    }
    sum += i
    i++
    }
    fmt.Println(sum)
    }

    善用 for 也可以把 slicemap 資料一一取出:

    package main

    import "fmt"

    for key, value := range map { // 也可以忽略其中一值,for _, value := range map
    fmt.Println(key, value)
    }
  4. switch 當我們需要寫很多 if...else 時就是使用 switch 的好時機:

    package main

    import "fmt"

    func main() {
    i := 2
    switch i {
    case 1:
    fmt.Println("hello:", i) // go 中不用加 break 會自己跳出不會往下執行
    case 2:
    fmt.Println("hello:", i) // 加上 fallthrough 可以強制往下執行
    fallthrough
    default:
    fmt.Println("hello: default")
    }
    }

總結

以上就是關於 Go 程式語言的基本語法中流程控制介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

Go Web 程式設計入門教學:語法基礎之變數(variable)和資料型別(type)篇

· 閱讀時間約 5 分鐘

Go Web 程式設計入門教學

前面單元我們介紹了如何建置 Go 開發環境,接下來的單元我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。而在這個單元中我們將介紹 Go 的變數和常數宣告以及資料型別的使用。程式語言唯有動手作才能學的好,你可以參考之前的文章建置開發環境或是使用線上開發環境進行學習。

定義變數和使用

變數是程式語言中暫存資料的盒子,在 Go 中比較特別的是定義變數有多種方式(特別的是 Go 語言和 C 語言在設計上比較不同的地方是 Go 語言把變數型別宣告放在變數名稱後面),以下列出比較常見的變數使用方式:

  1. 一般變數宣告

    // var 關鍵字 變數名稱 資料型別
    var varName type

    範例:

    var str string
  2. 定義多個變數

    var var1Name, varName2 type

    範例:

    var str1, str2 string
  3. 定義變數並初始化

    var varName type = value
  4. 同時初始化多個變數

    var varName1, varName2, varName3 type = v1, v2, v3
  5. 簡化宣告

    var varName1. varName2, varName3 = v1, v2, v3

    另外一種是使用 := 符號取代 vartype,但要注意的是這樣的方式只能在函式內部使用,若是在全域使用會出現編譯錯誤,一般使用 var 定義全域變數。它的變數生命週期為 block 內。

    package main

    import "fmt"

    var num = 10

    // 編譯錯誤
    str0 := "world"

    func main() {
    var str1 = "hello"
    str2 := "world"
    fmt.Println(num)
    fmt.Println(str1)
    fmt.Println(str2)
    if true {
    var str3 = "XD" // str3 := "XD"
    fmt.Println(num)
    fmt.Println(str1)
    fmt.Println(str2)
    fmt.Println(str3)
    }
    fmt.Println(num)
    fmt.Println(str1)
    fmt.Println(str2)
    // 變數生命週期結束 undefined 錯誤
    fmt.Println(str3)
    }

    值得注意的若是在函式內宣告但沒使用會出現編譯錯誤:

    package main

    import "fmt"

    var num = 10

    func main() {
    var str = "hello"
    fmt.Println(str)
    }
    ./main.go:10:6: str declared and not used

定義常數

常數和變數不同是在編譯時就確認值,在程式執行期間不可以更改值。在 Go 程式語言使用 const 定義常數,其語法如下:

const constName = value
const Pi = 3.14
const Name string = "Mark"

內建簡單資料型別

  1. 布林值 在 Go 布林值是 truefalse,預設為 false

    var isActived = true
  2. 數字 在 Go 語言中主要分為 intuint 兩類型數字資料型別,個別之間還有位元可以做選擇,例如:int32。注意兩種數字資料型別不能互相設定或操作(例如:相加)

    var num = 12
  3. 字串 Go 語言中使用 UTF-8 字元編碼,使用 "" 來包裹字串:

    var str string = "hello"
    str[1] // e

    ch = []byte(str)
    ch[1] = 'w'
    str2 = string(ch)
    fmt.Println(str2) // hwllo
  4. 錯誤類型 在 Go 語言中有一個 error 類型,在套件中也有個 errors 負責處理錯誤訊息:

    import errors
    err := errors.New("throw error")

    if err != nil {
    fmt.Println(err)
    }

複雜資料型別

  1. array array 就是一般程式語言的陣列,基本上和其他程式語言相同:

    // 變數名稱 [長度]類別
    var arrayName [n]type

    陣列長度宣告後不能改變,傳入函式為副本,若需要傳指標進去可以使用 slice。實際使用方式:

    // 宣告長度為 10 類型為 int 的陣列
    var arr [10]int
    arr[0] = 7
    arr[1] = 13

    a := [3]int{1, 2, 3}
    b := [10]int{1, 2, 3}
    // 自動計算元素長度
    c := [...]int{1, 2, 3}
    // 二維陣列
    dArry := [2][4]{[3]{1, 2, 3}, [3]{2, 3, 4}}
  2. slice 有時候我們不會一開始就知道需要宣告多長的陣列,這時就需要使用動態陣列(是一個參考類型,總是指向底層 array):slice,其使用方式:

    var sliceName = []type

    實際使用:

    slice = []byte{1, 3, 4}
    array = [3]int{1, 3, 4}
    bySlice :=
  3. map map 和其他程式語言的 dict 和 hash map 相似,使用方式:

    var mapName = map[keyType]valueType

    key 可以是除了 int 外其他類型,取值使用 key 取值:

    // 第一種宣告方式
    var numbers map[string] int
    // 第二種宣告方式
    numbers := make(map[string]int)
    numbers["one"] = 1
    numbers["two"] = 7
    numbers["three"] = 13
    fmt.Println("three", numbers["three"])

    // key 數量
    m := map[string]int {"1": 1, "3": 2}
    fmt.Println(len(m))

    // map 新增、刪除、修改、查找
    numbers["three"] = 13
    value, ok := numbers["three"]
    numbers["three"] = 17
    delete(numbers["three"])

    此外 map 是無序的,也是個參考類型指到底層:

    numbers := make(map[string]int)

    numbers["three"] = 13
    numbers2 := numbers
    numbers2["three"] = 1 // numbers["three"] 也變成 1

make、new 比較

make 一般用於內建資料型別(map、slice 和 channel)的記憶體分配,而 new 用於各種類型記憶體分配。make 回傳有初值的 T 類型,而 new 回傳指標。

總結

以上就是關於 Go 程式語言的基本語法中的變數和資料型別介紹,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

Go Web 程式設計入門教學:基礎介紹與環境建置

· 閱讀時間約 4 分鐘

Go Web 程式設計入門教學

[Go 程式語言](https://en.wikipedia.org/wiki/Go_(programming_language) 是 Google 推出的靜態程式語言,其特色在於核心語法和關鍵字非常精簡(全部只有 25 個關鍵字!)並擷取了靜態語言的效能和動態語言的開發效率的優點,具備垃圾回收、快速編譯等特性,且針對平行化程式設計在使用上非常方便。接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言。程式語言唯有動手作才能學的好,你可以參考本篇文章建置開發環境或是使用線上開發環境進行學習。

Go 環境建置

安裝方式:

  1. 官網套裝安裝,線上也有官方提供的 playground 線上執行環境可以使用

  2. 使用套件管理工具 homebrew(mac)、apt-get(linux) 等進行安裝

    例如,在 linux 上安裝:

    $ sudo apt-get install golang-go

    或是主動宣告版本

    $ sudo apt-get install golang-1.8-go

    在 mac 上安裝:

    $ brew install go
  3. 使用 gcc、MinGW(windows)等編譯器編譯原始 Go 檔案

對於一般初學者來說,可以使用官網或是套件管理工具來安裝,可以留意環境變數是否有設定成功。

若有成功安裝,可以打開終端機執行 go version 會出現相關版本訊息,以下是 mac 的範例:

$ go version
go version go1.9 darwin/amd64

在 Go 中也提供了許多方便指令,方便我們編譯、測試和執行程式:

Go Web 程式設計入門教學

編譯檔案

$ go build

執行單元測試(unit testing),Go 一開始就內建了測試的機制,執行 go test 的話,會自動讀取套件目錄中的 *_test.go 來進行編譯、測試

$ go test

讓程式可以格式化 formatting,符合 go 的 convention

$ go fmt

安裝套件

$ go get

靜態分析潛在 bug

$ go vet

可以快速 build 並執行程式

$ go run

展示 go 相關文件

$ godoc

重新命名變數和函式

$ gorename

產生程式碼

$ go generate

你的第一個 Go 程式

在 Go 中程式運行的入口是套件 main。在這個程式中使用並導入了套件 "fmt",在 Go 程式中程式執行入口是 main function,若成功在終端機執行 $ go run,則會在終端機印出 Hello, World! 的 Go 程式,恭喜完成你的第一個 Go 程式了!

// 宣告程式屬於哪個 package
package main

// 引入套件
import (
"fmt"
)

// 程式執行入口
func main() {
// 使用 fmt 套件印出字串 word,使用 := 簡化原本變數宣告 var word string = "Hello, World!"
word := "Hello, World!"
fmt.Println(word)
}

另外一個範例是引入了 math/rand 套件產生隨機整數(由於環境中 seed 一樣所以會印出同樣值)

package main

import (
"fmt"
"math/rand"
)

func main() {
fmt.Println("My favorite number is", rand.Intn(10))
}

Go 有支援許多網路程式開發的套件,可以用很簡單的幾行就完成網路伺服器的建置:

package main

import (
"io"
"net/http"
)

// 處理 request 和 response 的函式
func hello(w http.ResponseWriter, r *http.Request) {
// 印出 hello world
io.WriteString(w, "Hello world!")
}

func main() {
// router 讓網址可以對應處理函式
http.HandleFunc("/", hello)
// 監聽 8000 port
http.ListenAndServe(":8000", nil)
}

總結

以上就是關於 Go 程式語言的基本教學介紹和環境建置,接下來的文章我們將透過 Golang Web 程式設計來學習 Go 這個程式語言的方方面面。

參考文件

  1. A tour of go
  2. Go Tutorial
  3. Go by Example
  4. Go Programming Language: An Introductory Tutorial
  5. Go tour Exercise
  6. Ubuntu Go install
  7. 從Go看現代程式語言

(image via cuelogic

自學程式設計學習資源懶人包

· 閱讀時間約 7 分鐘

隨著資訊科技的發展,目前網路上和坊間有許多的自學電腦科學和程式設計的學習資源,但初學者在面對琳琅滿目的學習資源往往無所適從,因此本文整理了散落各地的自學程式設計學習資源懶人包和學習藍圖提供讀者參考,也歡迎讀者一起補充:)

學習程式設計最重要的是了解電腦科學背後的思考模式和邏輯分析,對於非本科系或是程式設計自學者來說,培養興趣累積成就感是最重要的,建議先從解決生活上著手,透過寫程式解決生活上的問題,等累積了興趣和成就感後重新學習基礎電腦科學知識。以下是初學者學習藍圖建議供讀者參考:

  1. 確認你的學習動機、設定個學習目標
  2. 選擇一門適合你的程式語言入門和工具
  3. 大量閱讀、參與課程、動手實作解決生活上問題,把手弄髒並記錄心得
  4. 組織、參與社群、練習問個好問題
  5. 熟悉函數程式設計、物件導向、框架、設計模式
  6. 重新學習資料結構、演算法、作業系統/系統程式、計算機組織、網路通訊等基礎電腦科學知識(程式解題)
  7. 學習進階電腦科學知識

延伸閱讀:

  1. 非本科生,我想半路出家學寫程式,該如何開始?
  2. Python Web 程式設計入門實戰
  3. JavaScript 程式設計新手村課程
  4. HappyCoder 自學程式設計學院臉書社團

實務程式設計

  1. [中 & 英] Codecademy

    codecademy

    Codecademy 是非常知名的線上學習程式設計的平台(有許多免費的課程),課程設計互動性和趣味性都相當不錯,相當適合初學者練習。課程也運用遊戲化(gamification)徽章和關卡設計也讓學習者更有動力學習。目前除了 HTML/CSS/JavaScript 網頁程式設計外,也有 Python、Ruby、Java 等程式語言可以學習(課程也有持續更新),不過 Codecademy 的內容相對基本,若想要在熟悉語法外更進一步學習實務開發應用程式的話就要額外再找其他學習資源了,但仍不失為一個很好的新手入門方式。

    課程深度:✦ 費用:免費、付費

  2. [英] Code School

    codeschool

    Code School 也是蠻知名的線上程式設計學習平台,與 Codecademy 類似,除了有提供學員線上即時動手實作練習、遊戲化徽章累積的設計外也有影片教學。課程內容也相當豐富貼近實務(JavaScript、Ruby、Git 等)。

    課程深度:✦✦ 費用:免費、付費

  3. [英] Code.org

    code.org

    適合中小學或完全初學的朋友練習,使用圖形化 Scratch 式拖拉程式設計方式。透過簡單的方式體驗程式設計的背後邏輯運作原理。

    課程深度:✦ 費用:免費

  4. [英] W3Schools Online Web Tutorials

    w3schools

    提供豐富的 Web 開發相關學習資源和查詢,適合在實際開發時學習參考查詢使用。

    課程深度:✦ 費用:免費

  5. [中 & 英] Mozilla Developer Network

    MDN

    由 Mozilla 社群維護的技術文件和教學內容,提供 Open Web 相關學習資源(HTML/CSS/JavaScript、Web API、Python)和 API 標準查詢。

    課程深度:✦✦ 費用:免費

  6. [英] FreeCodeCamp

    freecodecamp

    主要提供 HTML/CSS/JavaScript 線上學習資源和討論社群,並提供非營利組織專案實習機會。

    課程深度:✦ 費用:免費

  7. [英] TreeHouse

    teamtreehouse

    TreeHouse 和 Code School 類似,有影片教學也有互動練習,主要提供各種主流程式語言和技術組合的線上課程,包含了行動應用開發、網站開發、遊戲開發等實務課程。

    課程深度:✦✦ 費用:付費

  8. [中 & 英] Udemy

    udemy

    Udemy 是一個全面性的線上課程平台,提供素人講師線上分享技能的機會,課程十分多元貼近實務。除了網站開發、行動應用程式等技術領域外,也有許多非技術領域的課程(例如:行銷管理、創業、攝影、音樂創作等)。

    課程深度:✦✦ 費用:付費

  9. [中 & 英] Udacity

    udacity

    Udacity 與許多知名企業(Google、Facebook)合作提供許多前沿技術的線上教學,例如:人工智慧、深度學習、VR、Web、Mobile 技術等。此外,也提供微專業(Nanodegree)一系列課程和工作機會的媒合。

    課程深度:✦✦✦ 費用:免費、付費

  10. [英] DataCamp

    datacamp

    可以稱作資料科學版本的 Codecademy,使用互動學習方式線上學習資料科學,對於資料科學有興趣的讀者可別錯過了。

    課程深度:✦✦ 費用:免費、付費

基礎電腦科學

  1. [英] Coursera

    coursera

    Coursera 與許多知名大學合作(Stanford、賓州大學、北京大學、台灣大學等),提供教授可以線上授課的平台,學生也可以在家就上到一流學府的課程。與一般課程一樣需要繳交作業,若能完成課程修業規定,可以申請證書。

    課程深度:✦✦✦ 費用:免費、付費

  2. [英] edX

    edx

    edX 與 Coursera 類似與許多知名大學合作(MIT、哈佛大學、UCB等),提供教授可以線上授課的平台。

    課程深度:✦✦✦ 費用:免費、付費

程式解題

  1. [英] LeetCode

    leetcode

    LeetCode 又稱軟體工程師的 GRE(英文檢定),是一個線上解題平台,內含許多演算法和資料結構的題目,是許多準備軟體工程面試的面試者常用的工具。

  2. [英] Hacker Rank

    hackerrank

    Hacker Rank 也是一個線上解題平台,除了解題外也提供教學內容幫助學員學習,適合不想單純解題的使用者。

  3. [英] CodeFights

    codefights

    CodeFights 可以讓你和世界各地的程式設計師對戰,讓寫程式變成像圍棋一樣一場場對奕,十分有趣。

  4. [英] Codewars

    codewars

    Codewars 也是一個程式挑戰的解題平台,提供許多種語言讓使用者可以練習。

  5. [英] Kaggle

    kaggle

    Kaggle 和許多知名企業和單位合作提供資料科學問題,讓參賽者可以解題獲得獎勵和合作機會。

總結

以上整理了散落各地的自學程式設計學習資源懶人包和學習藍圖提供讀者參考,歡迎讀者一起補充,也歡迎加入我們的 臉書學習社群,分享你的自學程式設計心得和經驗。至於初學者若對於程式設計有興趣的話,不妨從 PythonJavaScript 入手,開啟你的程式設計之旅吧:)

參考文件

  1. Google - Guide for Technical Development
  2. Coursera
  3. edX
  4. Udacity
  5. OSS
  6. FreeCodeCamp
  7. Future Learn
  8. Stanford University
  9. MIT Open Courseware
  10. Obtaining a Thorough CS Background Online
  11. JavaScript 程式設計新手村課程
  12. 非本科生,我想半路出家學寫程式,該如何開始?
  13. 卡卡MOOC資源站