開發者筆記

我的Vim設定檔分享

Posted on

vim-config

我的Vim設定檔公開了。誠意推薦給初以Vim工作的人使用。

Github: https://github.com/archer1609/vimrc

眾所周知Vim擁有非常高的可塑性,能按自已需要加入不同的設定,也有不少人製作各種插件為vim提供進階功能,但自己動手設定也是一件頗為繁複的工作,故分享自己的設定檔供各位取用。

因為青鳥也是為日常編程需要才最近開始注重vim的使用技巧,並一步步地為自己擴充Vim的功能和設定,所以這個設定檔現時還是相當簡單容易理解,新增的功能也不多卻非常實用。這讓大家可以慢慢熟習vim的不同插件和設定。

Github內的說明檔會詳細地說明新增的功能,vimrc內亦有附註說明,讓大家輕易了解這個設定檔的特性。因為本人現時工作主要使用C/C++,因此設定上不傾向切合這方面的工作需要。

設定檔會不時更新,歡迎定期瀏覽我的Github追蹤變化。

Happy Coding!

廣告

Vim多檔作業操作技

Posted on Updated on

Vim split and tab

Vim作為一個Command line的文件編輯器,功能強大就眾所周知,不少開發者都愛用它來寫程式和操作系統文木檔,而寫程式往往需要編輯大量檔案,也需要開啟不同的檔案文件交互參照,但我們總不能開著一大堆視窗逐個切換吧?所以要用Vim寫程式,就不得不知如何應付多個檔案。

Vim不用另加插件,就支援多檔作業,當中最重要的就是視窗分割(Split Windows)、分頁(Tab Pages)和會話(Session)。學懂它們就能令Vim如IDE或其他圖形介面的進階文字編輯器一樣方便好用,以下就是這些功能的相關常用指令:

(為方便起見以下用英文)

繼續閱讀文章 »

[OpenCV]在Windows環境下安裝OpenCV、設定Visual Studio及Python

Posted on Updated on

近期青鳥將要展開Final Year Project,並會用到OpenCV。OpenCV是一個開源(Open Source)、跨平台(Cross Platform)的電腦視覺庫(Computer Vision Library)。這個Library支援能協助處理和開發很多複雜的Computer Vision問題,支援C++, Python, Java等多種程式語言,更支援Windows、Linux甚至是Android、iOS等多個作業系統(OS)。雖然它功能強大,但安裝上也是非常複雜,所以特別寫下此筆記。

範疇:OpenCV, Computer Vision
程度:中
簡述:安裝OpenCV2.4.11到Windows系統,並設定Visual Studio及Python開發環境。
安裝環境及涉及軟件:

  • Windows 8.1
  • Visual Studio 2013 Express for Desktop with Update 4
  • Python 2.7.10
  • numpy-1.9.2+mkl-cp27-none-win_amd64

雖然OpenCV已發展到3.0.0 RC1版,但它似乎仍未正式支援Python 3,也未必足夠穩定,所以本教學基於現時最新的穩定版本OpenCV 2.4.11,並使用它所支援的Python 2.7。 繼續閱讀文章 »

[Linux/RPi]用SAMBA在家中共用檔案

Posted on Updated on

範疇:Linux, Raspberry Pi Project
程度:中
簡述:教授掛載外置硬碟的方法;利用SAMBA共用Linux系統的檔案

家中有一部PC和一部Notebook,平常要在兩部電腦之間互傳檔案都會用HomeGroup,亦即是我們從前認識的「網絡上的芳鄰」,相信不少人都用慣了,如果真的不知道是什麼的話請自行Google。用了這個後兩部電腦猶如合為一體,我可以在PC上開啟Notebook上的檔案,又可以將Notebook上的檔案傳回PC,使用方式和一般存取的方式幾乎一模一樣。

不過,現在手上多了一部行Linux的Raspberry Pi,還給它搭上了一個外置硬碟。本來想用這樣的配置來做File Server,方便我做Backup、日常取用和其他用途,可是Linux本身並無法與Windows的HomeGroup相容,如果用WinScp、FileZile等來傳檔案的話又比較不方便,更無法直接開啟檔案,所以要另外想些辦法來解決。

其實解決方案早於90年代已經出現,1991年時有一個名叫 Andrew Tridgell 的博士研究生為解決相同問題,特意探取Windows網絡共用所用的Protocol來進行逆向工程,最終編寫出Server Message Block (SMB),使Linux可以與Windows網絡共用相容。由於美國商標注冊的限制,軟件最終取名SAMBA。這個軟件到今時今日仍受Linux用家愛戴,現在就讓我們一起森巴舞吧!

所需軟件:

  • samba
  • samba-common-bin
  • ntfs-3g

Part 1: 掛載外置硬碟

Raspberry Pi用SD卡來作儲存裝置,空間緊拙,實在不適合作為File Server。所以在開始之前,我會先額外教大家掛載外置硬碟:

1. 連接硬碟

首先,當然是要將硬碟接上電腦。對,就是將USB線插上!

然後使用fdisk查看新加的外置硬碟是在哪個接口(需要sudo)。以我為例,現在我的外置硬碟就在/dev/sda1

# sudo fdisk -l

Disk /dev/sda: 2000.4 GB, 2000365289472 bytes
255 heads, 63 sectors/track, 243197 cylinders, total 3906963456 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0d0af321

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048  3906963455  1953480704    7  HPFS/NTFS/exFAT

2. 掛載硬碟

在掛載之前,我們需要為硬碟劃定一個固定位置,以便共用,現在我會在/media建立一個名為WDMyBook的資料夾,作為外置硬碟的存取點:

# cd /media
# mkdir WDMyBook

接著,就正式將硬碟掛上:

# sudo mount -t ntfs-3g /dev/sda1 /media/WDMyBook

-t後面是指定裝置的格式,因為我的外置硬碟使用NTFS格式,需要ntfs-3g這個driver來進行存取,Raspbian原生沒有這個Driver,需另行安裝:

# sudo apt-get install ntfs-3g

3. 設定開機自動掛載硬碟

現在你只要瀏覽/media/WDMyBook的話應該就可以見到硬碟內的檔案了,不過到你下次重新開機,一切都會打回原型。要每次開機都自動mount上硬碟的話,就要修改/etc/fstab這個開機掛載設定檔:

# sudo vi /etc/fstab

; 請在檔案內加入以下一行:
/dev/sda1       /media/WDMyBook ntfs-3g defaults   0       2

“/dev/sda1″是裝置位置;"/media/WDMyBook"是掛載位置;"ntfs-3g"是儲存格式;"defaults"是掛載時的設定,使用預設已足夠;"0″是dump backup,不用開啟;"2″是fsck 檢驗,優先度設定為2,不用跟主要磁區搶。

現在,你每次開機外置硬碟都會自動掛載好了!

Part 2: 安裝SAMBA

1. 安裝SAMBA

返回正題,我們開始要安裝samba了,我們除了samba主程式外,還需要samba-common-bin來執行需要的功能:

# sudo apt-get update
# sudo apt-get install samba, samba-common-bin

2. 建立帳號

安裝完成後,你需要建立登入的帳號,這裡要注意帳號名稱必須和你在Linux上的帳戶一樣:

# sudo smbpasswd -a USERNAME   ; USERNAME為你的Linux系統上一個用戶的名稱
; 輸入密碼兩次
; smbpasswd是舊式方法,不過亦足夠使用
; 更改密碼也是要用smbpass,但不用輸入-a

; 以下是新式方法
# sudo pdbedit -a USERNAME
; 輸入密碼兩次
; 有關pdedit的其他功能請參考 pdbedit -h

3. 設定smb.conf

現在來到最重要一步,設定你要共用的檔案,設定檔位於/etc/samba/smb.conf,打開後你會發現裡面已經有預設的設定和詳細說明,你可以參考說明自行配置,以下解釋其中一些基本設定。

[global]底下的是系統設定,大多設定都可按預設,但需留意以下參數:

workgroup = WORKGROUP
; 工作群組名稱,WORKGROUP是Windows預設的名稱,所以一般不用更改

security = user
; 設定為user的話就需要使用者登入方可存取檔案,需要設定為user

; 下面是有關共用Printer的設定,在第182行附近,如不用share printer建議這樣設定:
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes

; uncomment下面這句或有助連線速度,這句在207行左右:
socket options = TCP_NODELAY

接著到下面會有[homes]的一項,這是一個特殊項目,會指向使用者的home目錄,設定解說如下:

[homes]
   comment = Home Directories   ; 純粹是目錄描述
   browseable = no   ; 設定此目錄可否被所有人看見,注意這只是看見,並不代表可以進入存取
   read only = yes   ; 設定檔案是否為唯讀,
   ;writable = yes  ; 與read only相反,這兩句只需選擇一個,所以comment out
   create mask = 0700   ; 設定新增檔案的預設權限
   directory mask = 0700   ; 設定新增目錄的預設權限
   valid users = %S    ; 允許存取的使用者,對於homes一般使用%s,這樣就限定使用者只能進入自己的home

以上的設定已經可以讓你進入到自己的home目錄。因為home是使用者的根目錄,等同可以存取使用者的所有個人檔案,因安全性問題所以建議只作唯讀(read only = yes),然後另外設置其他共用資料夾作讀寫。

要設立共用資料夾,做法和上面基本一樣,只是將[homes]改為其他名稱,其他可用的設定基本一樣,你可根據自己需要調節,另外要加上一句"path = xxx"來指定共用資料夾的所指位置。

以下的例子是共用我的外置硬碟,讓使用者"Archer", “King"可以進入並享有正常讀寫權限:

[MyBook]
   comment = External Hard disk on RaspberryPi
   brwoseable = yes   ; 讓任何人都可以看到此目錄
   writable = yes   ; 讓使用者可以修改檔案
   create mask = 0700
   directory mask = 0700
   valid users = Archer, King
   path = /media/WDMyBook   ; 當使用者從網絡進入MyBook後,實際會連到/media/WDMyBook這個位置

你會發現檔案下面還有例如[profiles]、[printers]之類的共用資料夾,但這些我們暫時都不會用到,而且預設也是停用的,所以不用理會。

4. 檢查設定

好了,現在你已經設定好兩個共用資料夾,分別是你自己的home和外置硬碟的空間,接下來你可以用以下指令檢查你的設定是否有誤:

# testparm

假如出現"Loaded services file OK."這句,代表設定基本沒有問題,否則請按錯誤描述進行修正。

當出現"Press enter to see a dump of your service definitions"後,按下enter便會產生一份設定報告供你參考。

5. 重啟服務

最後,只要重新啟動samba的service,samba這一邊就完成啦!

# sudo /init.d/samba restart
[ ok ] Stopping Samba deamons: nmdb smdb.
[ ok ] Starting Samba deamons: nmdb smdb.

Part 3: Windows端連線

辛辛苦苦來到這一步,最重要當然是要讓Windows可以存取Raspberry Pi上的資料啦,接下來的工作就簡單得多了,不過還是有些地方要留心。

1. 透過家用網路連線

當你打開「電腦」後,你應該已經可以在左邊欄的「網絡」內看到新的成員了!

Pi0

當你點選你的新成員(ARCHER-PI),即可輸入使用者名稱和密碼登入,必須注意如果要切換使用者的話會比較麻煩,所以請儘量使用單一使用者存取共用檔案。

登入後你可以看到對登入的使用者共用的資料夾:

Pi1

你可以右擊一個資資夾,將它設定為網絡磁碟機,方便進入:

pi2

然後你可以在「電腦」中看到你的共用資料夾變成了一個網絡磁碟:

pi4

你亦可以在「電腦」上方選擇「連線網絡磁碟機」來手動建立。

2. 切換使用者

要切換到另一個使用者存取只有該使用者方可存取的共用文件,你必須登出,因為一部電腦只能同時使用一個使用者登入到其他電腦。但Windows似乎沒有方便的方法讓你直接登出SAMBA上的使用者,如果要登出,只好透過command將現有所有連線砍掉。

另外,你還要在「電腦」中將所有已連接的網絡磁碟機中斷:

pi6

pi5

然後,在網址列輸入:\\IP or NetName\Username,例如\\Archer-Pi\King,Windows即會嘗試登入另一使用者,輸入使用者名稱和密碼後應該就可以切換了。不過這個方法有時都會失敗,或許需要重新開機方能完全斷開連線。

教學就此完結,有空再教建立VPN的方法,使你可以在戶外安全地經Raspberry Pi連到家用網絡存取資料。


下面來個bouns:Raspberry Pi File Server + 小型影院

DSC_2655

[HTTP]POST與GET

Posted on Updated on

按:日常生活與社會過於疏離,以致實在很難提起勁寫那些有內涵的文章。但不希望就此封筆。近來身邊最密切的事就是Programming,就試著轉為寫Programing的學習筆記,分享教授之餘亦可鞏固編程概念。起初時盡量寫一些比較大眾化的題目,跟大家日常的電腦使用習慣拉上關系,就好像接下來要介紹的這個網頁傳遞資料的方法。

範疇:HTTP、Web App
程度:低
簡述:介紹HTTP協定中POST和GET資料傳遞模式及分別

一個動態網頁能在同一頁面上根據不同的情況作出不同的反應,從而做到實時與用家互動,亦方便開發人員更簡便地設計網頁,不用設計大量頁面來提供適當的內容,亦能使一個頁面提供靈活多變的資訊和處理辦法。在用家(Client)和網站(Server)互動的過程中,往往都需要互相交換資料,而在傳送資料的時候一般都會涉及兩種傳送方法(Method):GET和POST。

GET

當大家上Youtube的時候,應該會留意到影片網址後面是watch,然後就有一個問號再加一串代碼,例如這個:http://youtube.com/watch?v=Yv5YRLvGmzA&t=3s。當中「?v=Yv5YRLvGmzA&t=10s」這一段其實就用了GET Method來向Server傳送了一段訊息。

雖然GET和POST都是向Server傳送資料的方法,但GET多了一重意思,就是顧名思意要向Server索取自己想要的資料,所以我們用GET Method時都會期望Server會根據我提供的資料而給予回應。就以上面的網址為例,我們希望它能傳回一個網頁,當中是要包含了我們想要的影片:「Arduino 行人過路燈 」,而且影片是要在第10秒開始的,這些請求其實都隱藏在網址中。

GET Method最大的特色就是所有要傳送的資料全部都顯示在網址(URL)上,一個網址只要出現「?」,後面所有的內容都是你要傳送的資料。在上面的網址中,我們傳送了兩個參數(parameter),一個是影片代碼v,數值(value)是"Yv5YRLvGmzA“;另一個是開始時間t,數值是"10s“。兩個變數用「&」來分隔識辨。當Youtube Server收到這兩個變數後,就會作出相應的程序,將"Yv5YRLvGmzA“所表的影片嵌入頁面中的播放器,然後將開始時間調校至第10秒,最後將調校的頁面內容傳送回用家的瀏覽器上顯示。

POST

大家登入Facebook或其他網站,按下登入按扭的一刻,資料就用POST Method傳送到Server了。但是你的帳號和密碼資料藏了在什麼地方呢?其他它藏到了message-body內,是無法循一般途徑看到的。

POST的原意是向Server提交資料,例如表格(form)讓Server處理,並沒有意思要求Server回傳特定的內容,但當然Server應作出相應的反應,例如給予你瀏覽自己Facebook的權限。

現今POST的用途廣泛,除了因為POST的資料不會顯示在URL之餘,它支援傳送ASCII字符以外的資料和其他多變的封裝方式也是主因之一。例如表格中包含檔案時,可以將檔案以Multi-part封裝,然後以POST方式傳回Server。

GET與POST的比較

GET POST
重用性 可Bookmark、Cache和儲存在History中(因為它只是個URL) 不可Bookmark、Cache或儲存在History中
編碼類型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multipart/form-data
數據長度 受URL最大長度限制(2048bytes) 無限
數據類型 只支援ASCII 沒有限制,甚至支援Binary資料
可見性 任何人都可從URL見到 不能從URL看見,一般用家無從看見。

因為可見性的源故,POST Method是稍為安全的,而且限制較少,所以在傳送資料時一般都推薦使用POST。

不過同樣因為可見性的源故,GET Method可以方便用家使用,就像瀏覽Youtube時可以透過在網址上加入不同參數來得到想要的資料和功能。網頁設計師可按情況使用GET,但如果涉及諸如密碼的敏感資料,就絕對不要用使GET!