月份: 2016 年 7 月

同步(Synchronous)、異步(Asynchronous)、阻塞(Block)、非阻塞(Non-block)

因為昨天的FileSystem提到了同步與異步(或稱非同步),所以今天的主題就是這個了。

阻塞與非阻塞

阻塞非阻塞主要是描述請求在等待結果時的狀態

假設今天有一個請求要讀取檔案,但是今天這個檔案被請求時是不可讀取的狀態。

如果設計是阻塞的,那麼這個請求便會進入等待狀態,直到它終於讀取到這個檔案,或者是等待久不想等了,才會換下一個。

如果設計是非阻塞的,那麼這個請求會因為檔案不能不讀取而立刻返回,不會在那邊乾等,而是去做其他事情,然後過一定時間再回來看檔案可不可以讀取,然後一直重複,直到檔案可以被讀取為止。

Continue reading

Node.js 筆記: FileSystem

其實Node.js只有剛碰到些皮毛,整個就是超級不熟,但今天因為工作上需要,所以只能查查資料硬上了,一整個就是大挫敗(死),目前需要做的是跟檔案處理有關,而說到檔案就不能不提到Node.js的FileSystem,簡稱fs

這篇文章應該不會做到詳細的介紹,後端Node.js還是超級初新者,所以本篇主要是筆記我實作上所遇到的問題與查詢到的資料,希望能幫助到同樣有問題的朋友。

Continue reading

OOP 物件導向程式設計筆記(一)

寫程式的基本觀念肯定少不了物件導向,雖然以前大學的時候就碰過了,但是沒有特別去複習也早就忘光了,這次來依照五大原則:S.O.L.I.D,依序筆記物件導向的重點觀念,因為我猜我今天打不完,而且也希望能夠多一點時間理解,所以這會是系列文的第一篇,一樣,有錯誤的地方歡迎指教喔!

Continue reading

CoffeeScript 學習筆記:變數、字串與函式

目前開始學習使用CoffeeScript,來自我筆記一下,歡迎討論指教喔!

簡單介紹

CoffeeScript是JavaScript的一個編譯語言,簡單來說明就是寫CoffeeScript,然後CoffeeScript的編譯器再轉換成JavaScript。

至於為什麼要用CoffeeScript?我想可讀性和便利性是最大的主因,一個好的程式語言要有三大條件:寫少做多、易於閱讀、方便維護,而CoffeeScript就是為了改善JavaScipt而誕生的,從以下的介紹便會開始了解CoffeeScript方便的地方。

CoffeeScript安裝與指令

安裝步驟

  1. 安裝 node.js
  2. 安裝 npm
  3. npm install -g coffee-script

CoffeeScript指令

  • coffee -h – 查看CoffeeScript指令
  • coffee -c foobar.coffee – 將foobar.coffee編譯成foobar.js
  • coffee -cw foobar.coffee – 當foobar.coffee有變更就會自動編譯成js檔
  • coffee -c src -o js – 將src內所有coffee檔編譯成js檔,存到js資料夾
  • coffee -cw src -o js – src內的檔案有變更時,就會自動轉換並編譯到js資料夾

變數宣告

在CoffeeScript裡面,我們不用去理會變數宣告,CoffeeScript會自動幫我們處理變數宣告這一塊,不用自己寫一堆var,並且確保我們的變數在想要的地方執行,我們只要在我們想要的時候使用變數就可以了,還有,CoffeeScript可以不用分號結尾,這點真是不錯。

感謝CrazyLion補充:JavaScript也沒有要求要分號結尾!只是在學習時都有分號結尾
查了之後才知道,原來是壓縮程式碼時,沒分號有時候會產生問題。

CoffeeScript

foo = "Coffee"
bar = "Script"
alert ( foo + bar ) #CoffeeScript

JavaScript

var bar, foo;
foo = "Coffee";
bar = "Script";
alert(foo + bar);

樣板字串

我們如果要用一堆變數串成一個字串,要放入一堆加號,什麼"Answer is " + ans +".",感覺就是非常地麻煩,coffee只要寫成 "Answer is #{ans}." 就完美解決了,注意!一定要用雙引號包起來,單引號只會顯示#{ans},而不會顯示ans內的數值!順便一提,ES6也趕緊加入了${foo}樣板字串的概念XD

CoffeeScript

ans = "Script"
alert ( "Coffee#{ans}" )

JavaScript

var ans;
ans = "Script";
alert ( "Coffee" + ans );

函式

JavaScript最重要的function,在CoffeeScript裡變得十分簡單,本來的匿名函式寫法是 function(){ … } ,在CoffeeScript裡面,只要 () -> … 就解決了。

  • 用縮排取代大括號
  • 函式沒有儲存參數時,可以省略小括號
foobar = () ->
	alert ( "foobar" )
#等於
foobar = ->
	alert ("foobar")
  • coffee永遠有個return value,會自動return該function的最末端

CoffeeScript

cookies = ->
	confirm "Do you want some cookies?";

JavaScript

var cookies;
cookies = function() {
	return confirm("Do you want some cookies?");
};

呼叫函式

學會怎麼定義函式後,當然也要知道該如何呼叫它,有以下幾種方式。

  • 不傳入參數
    • coffee()
  • 傳入參數(小括號是可以省略的)
    • coffee( “foo”, “bar” , true)
    • coffee “foo”, “bar” , true
  • 傳入的參數有函式時,即使該函式也要傳入參數,也可以忽略小括號(但建議除了最外面的小括號,其餘小括號不要省略)

CoffeeScript

confirm = (reallyWant) ->
	if reallyWant
		true
 
plus = (a , b, ifPlus ) ->
	if ifPlus
		result = a + b
	else
		result = a
	"Answer is #{result}"
 
alert plus 20, 10, confirm true

JavaScript

var confirm, plus;
 
confirm = function(reallyWant) {
	if (reallyWant) {
		return true;
	}
};
 
plus = function(a, b, ifPlus) {
	var result;
	if (ifPlus) {
		result = a + b;
	} else {
		result = a;
	}
	return "Answer is " + result;
};
 
alert(plus(20, 10, confirm(true)));

延伸閱讀:jQuery with CoffeeScript

Clustering and Segmentation 分群和分割

今天學習的主題跟機器學習有關,以下是簡單的筆記,初次理解可能有誤或過於粗淺,歡迎提出有問題的地方。

機器學習有兩種方法:

  1. supervised learning:監督式學習
  2. unsupervised learning:非監督式學習

首先是監督式學習:

假設我們給電腦一百張人臉照,同時也給它照片上的人臉是誰,而當我們在Test的時候,給電腦一張圖片,電腦能夠分辨出是否是人臉照以及這張人臉照是誰。

對比非監督式學習:

我們一樣給電腦一百張人臉,但是不給電腦任何標籤,由電腦自動去分群,並希望我們Test的時候也會得到跟上述一樣的結果。

Dimensionality Reduction

一張30*30px的圖,該維度就是900維,我們使用演算法(例如:PCA)來降維,將較多的變數縮減成較少的變數,但也能保留原data大部分資訊,降維後的資料,我們就可以將其表現在二維圖表上,進行後續的分析、分群等等,但有個缺點:只能分析原本的data,如果我們丟新data進去,電腦只會告訴我們大概會在這個圖表的哪個位置。

Generative Models 生成模型

我們給電腦一堆臥室的圖片,並且給電腦一組亂數,電腦就會依據我們給的亂數去排列我們給我臥室圖,而這個臥室的圖片每一張只改變一組亂數,所以會呈現出連續性。

room

[Radford, Metz and Chintala, 2016]

Segmentation 分割

一樣以圖形辨識舉例,我們有一張圖片,電腦有多種分割開圖片成元件的方法,可能是用人、樹、路分割開來,或者是人身、人頭、人腳等等,至於是否符合我們需要,則端看情境,而且電腦在元件的label上有時候會跟現實認知不同,例如人被label成車子之類的。