目前分類:資訊電腦 (121)

瀏覽方式: 標題列表 簡短摘要

閱畢日期:2016/3

這本書在新北市圖書館還蠻熱門的,蠻多人在排隊,記得我是去年年底排的,今年終於排到了。

裏面介紹不少 AWS 的服務與技巧,是蠻實用的一本書,但是內容有點過時了,建議在使用這本書的時候,要對照目前最新的 console 與文件。在看這本書之前看了不少 AWS 提供的文件,但是仍然有些技巧或限制是沒注意到或沒看到的,看這本書真的讓我受益良多。

 

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

起手式
4.0 以後,需要另外安裝 express-generator。

npm install -g express-generator  
npm install --save express


其實這邊小矛盾,express-generator 要裝到 global,而 express 則要裝到 local

產生專案,css 用 stylus ,template engine 用 ejs

express -c stylus -e your_project 


-c 可以選 less/sass/stylus ,不加就是 plain
-e 是 ejs,不加,預設是 jade ,還可以選其他 template engine,需要另外設定。

TDD/BDD

內建有 assert,但不是很口語化。


var assert = require('assert');
var expected, current;
before(function() {
expected = ['a', 'b', 'c'];
});
describe('String#split', function() {
beforeEach(function() {
current = 'a,b,c'.split(',');
});
it('should return an array', function() {
assert(Array.isArray(current));
});
it('should return the same array', function() {
assert.equal(expected.length, current.length, 'array have equal length');
for(var i=0; i<expected.length; i++) {
assert.equal(expected[i], current[i], i+'element is equal');
}
});
});

可以加裝 chai/expect ,會更口語化。


var expect = require('expect.js');
var expected, current;
before(function() {
expected = ['a', 'b', 'c'];
});
describe('String#split', function() {
beforeEach(function() {
current = 'a,b,c'.split(',');
});
it('should return an array', function() {
expect(Array.isArray(current)).to.be.true;
});
it('should return the same array', function() {
expect(expected.length).equal(current.length);
for(var i=0; i<expected.length; i++) {
expect(expected[i]).equal(current[i]);
}
});
});


簡單說就是 up to you 。 主要搭配的工具是 mocha,這個要裝在 global:npm install -g mocha

第三章最後有介紹如何測試網頁,是使用 superagent,在網路上找到一篇 simple test first express setup & tutorial

這篇也是用 mocha,主要是用 supertest 來做測試,另外比較特別的一點是用 supervisor 來啟動 server,supervisor 會幫你監視程式的變動,然後自動重新啟動。

packages.json

在這檔案裡也可以放一些預設的指令,例如 npm start 就是啟動 nodejs application server,所以可以在此加入 test,這樣就可以 npm test 進行測試。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

大部份看過就算了,debugger 是比較不知道的部份,就紀錄下來。

debug

安插 debugger; 然後用 node debug your_program.js ,然後就會停在 debugger; 所在的行數

node-inspector

npm install node-inspector

用法:
node --debug-brk your_program.js
node --debug your_program.js


實際上是開一個 web server,讓你可以用瀏覽器進行 debug ...
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2015/3

Ruby 之父松本行弘寫的。

跟之前的「松本行弘的程式世界」一樣,屬於那種類似閒聊的技術介紹,不過這也不能怪出版社,因為裏面的文章本身就是在雜誌裡的連載。
這本書比較偏向於電腦語言、Multiprocessing、Multithread、NoSQL、未來架構的介紹與探討,有些不是很深入,但是都介紹的不錯,看完會有一定的認識這樣。

我是去年年初(應該是)在「多看閱讀」網站上買的電子書,原來的價錢不便宜,是趁特價時買的。繁體中文的版本好像是去年才在台灣看到。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

先翻目錄,然後大致翻過一遍。

Linux Mint 是這兩三年出的 distribution (發行套件),是從 Ubuntu 分支出來的。我所知道的最大的特色應該是 Cinnamon 跟 MATE 這兩個桌面環境,這兩者是從 GNOME3 跟 GNOME2 這兩個桌面環境分支出來的。這兩者,我都有試著用過,相當不錯。我主要是偏好 GNOME2,所以有試著拿 MATE 來換掉原來的 GNOME2,但我遇到的問題是,一切原來熟悉的 GNOME2 應用程式的名稱也都換掉了,因為不太想重新記,就放棄了。

這本書主要就是介紹 Linux Mint,鎖定的對象是入門者,講的挺淺顯易懂,從一般的使用到如何保護自己、資料備份等等,該講到的都有講到。然後除了 GUI 的使用之外,也有提到簡單的命令列使用。我覺得這本書還不錯。

更多有關 Linux Mint Essentials 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

跟 Windows 8: this missing manual 一樣是看目錄,找想看的部分看過一次。

主要是看 saved search 跟 ripples

saved search 在現在的 Google+ 裡找不到了,輸入關鍵字搜尋以後,搜尋結果頁面上找不到 save this search 。因此 saved search result 的 what's hot 功能也沒看到了,我在想應該是被整理到「趣事」那邊去了。

ripples 就是「分享關係圖」,但有些貼文有這選項,有些貼文則沒有,這跟作者分享的社交圈有關係,要設定為公開,才會有這選項;有限定分享圈,就不會有此選項。

最近 Google+ 的負責人離職了,大家都在猜會有所變動,且拭目以待吧。

更多有關 Google : The Missing Manual 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

不算是看完啦,就是大致翻過一遍。
這本書寫的還蠻詳盡的,很適合給初學者來看。除了介紹基本操作之外,還有兩種操作模式的操作方式跟各類 app 的使用,該有的圖也都有,不會讓人不知所云。這本書並沒有比較跟之前版本的不同,書最後有附上 cheatsheet ,我覺得這是很實用的地方。

更多有關 Windows 8: The Missing Manual 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2014/2/5

我誤會了,以為裡面會透露不少 iPhone 使用上的訣竅,但其實只是很單純的 iPhone 使用手冊,missing 的意思應該是 Apple 沒提供這麼詳細的使用手冊的意思吧。
我看的是更新到 iOS 7 以後的版本,對於新功能的說明還蠻詳細的。作者對於耗電這件事情還蠻在意的,前前後後我就看到兩次作者提到這件事情。這本書就在參考目錄選擇想看重點的情況下,走馬看花的看完了。

更多有關 iPhone: The Missing Manual 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2014/2/2

跟新北市圖書館借來的書。前幾年就有在 Google 黑板報 看到這系列的文章,只是不知道這些文章後來有集結成書,而且我也沒全部拜讀完。

這本書前面幾章著重在 IBM、Intel、HP、Cisco、Microsoft、Google...等等幾家大公司的崛起與興衰更替,介紹的很不錯,蠻值得一看。其中在 Cisco 一章有提到所謂的內部創業,這個名詞我之前是聽老師說「王品」才知道的,但看了 Cisco 這章,我想,王品應該是參考 Cisco 的吧。所謂的「內部創業」,指的是公司並不阻擋員工創業,反而因為員工的創造與發明往往是補公司所不足的地方,所以公司反而鼓勵員工去創業,甚至之後還將其收購回來。Cisco 循此模式,讓其網路基礎設備帝國日益龐大。

幾家大公司介紹完,作者介紹了美國的創投,針對遇到創投時的投資比例、會問到的問題、投資人關心的事情、有名的創投公司等等,介紹了不少,不能說鉅細靡遺。建議有志創業的人務必借來一看,畢竟國內對這方面的資訊不多,往往是要靠著參加創業的聚會或是朋友、學長的提攜才能得到這些資訊。

接著很難得的是介紹了金融危機,作者認為金融財經的東西不能不懂,公司的營運還是受到外部大環境的影響很大。另外,也介紹了華爾街,雖然公司的營運不應該看人臉色,但華爾街的力量不能小覷。作者有舉了一個例子,是講公司被華爾街搞倒的例子。此外,介紹金融危機也是為了一點,作者認為技術人不應該只專注在技術。幾乎每個有名的 CEO 並不是都只專注一項,而是或多或少都會涉獵,像 Google 的 Eric Schmidt 就是 Lex 的作者之一 (不是 flex)。

最後是預測未來,作者認為可能會是雲端運算,或者是貼近人類生活的科技。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2014/1/29

市面上難得的介紹 PySide 的書。PySide 簡單說就是 Python + QT ,市面上有另外一個專案,叫作 PyQT。PyQT 比較早出現,原本 QT 是不願意再另行開發 Python binding 的,但因為授權談不攏 (PyQT 開發團隊只願意使用 GPL ),才自己跳出來做。但是使用上其實差不多,甚至 PyQT 的範例拿來只要改一下 import 模組的名字,就可以執行了。

書的內容不多,前面幾章就介紹基礎的使用,像是介紹、使用基礎元件等等的。第六章是介紹跟資料庫存取相關的部份,有使用過 Microsoft .Net 的朋友應該知道 .Net 的 Data binding 相當好用,我本來以為 QT/PySide 是沒有這部份的 API 的,看了才知道 QT 有提供 Model/DataMapper 之類的類別,也可以很方便的存取資料庫。這本書談的都是蠻基礎的,比較沒有進階的應用,例如我想知道如果跟 ORM 之類的 module 合作的話,Model 這邊可以怎麼做,這部份都沒有提到,看來只能自己再去看 QT 文件來擴充了。

更多有關 PySide GUI Application Development 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

閱畢日期:2013/12/31

從圖書館借來第二天其實就已經翻完了,後來就放到快到期前一天才還書。

這本書主要是圍繞在 Evernote 的使用上,不過我看的還是作者怎麼去發掘跟使用 Evernote。很多好的工具都是要去想怎麼用,這點還蠻重要的,知道一個新的用法,可以節省很多時間。目前來說,我真的也不太會用,一堆資料丟在 Evernote 裡,只有少數幾篇會不時的整理。往往都是一開始有個想法,就開始找資料,開 Note 往裏面丟,等到已經弄的差不多了,Note 大概也沒繼續用了。是說之後會想起來翻一下,但用到機率畢竟不高。作者是建議說碰到這種情況就要整理成 blog 文然後刪除掉,或許未來我該朝這方向前進然後要多想怎麼用,才能把這工具發揮的更好。

更多有關 Evernote 超效率數位筆記術 的事情
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

13.1 fileinput: 用法很簡單,就 fileinput.input(),他會傳回一個 file descriptor,操作就跟一般的檔案一樣。使用 fileinput 的好處是他會自動處理參數有多檔案以及 stdin 的情況。這個模組 2.x 跟 3.x 都有,但 2.x 還不支援 context manager,3.x 才支援,因此 2.x 裡沒辦法用 with。fileinput 模組本身的說明跟例子就很清楚,更詳細的用法可以看 PyMOTW - fileinput – Process lines from input streams
13.2 raise SystemExit(): 這還蠻好用的,你可以帶訊息 raise SystemExit("failed."),也可以帶數字 raise SystemExit(10)。帶字串的話,會自動印出錯誤訊息,然後離開程式,program return value 會是 1。帶數字的話,一樣也是離開,但沒有訊息,program return value 就是指定的數字。根據 Built-in Exceptions 裡的說明,呼叫 sys.exit() 就會丟出這個例外,所以看起來直接 raise 會比 sys.exit() 稍稍快一點點。
13.3 介紹 argparse 模組,這是 python 用來處理參數的模組,在網路上還可以看到 optparse,但現在已經建議都改用 argparse 了。
13.4 輸入密碼,可以使用 getpass 模組裡的 getuser()/getpass() 函式來取得帳號跟密碼。作者提醒 getuser() 不會顯示提示字串,可以自己先用 print() 輸出。
13.5 取得 terminal 視窗的寬跟高:os.terminal_size()
13.6 取得外部程式的輸出,這是介紹 subprocess 模組裡的 check_output() 。比較特殊的處理可以用 Popen() 去接 stdout 跟 stderr。
13.7 複製與移動目錄或檔案:介紹 shutil ,這個模組裡包含了很多方便的函式來處理跟 shell 相關的事情。這一節介紹的是 copy, copy2, copytree, move 。
13.8 建立/解壓 tarball:也是 shutil,介紹的是 unpack_archive, make_archive
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

2.16 介紹 textwrap,就是一個很長很長的字串,然後想要整體寬度固定,就可以用這個模組。大致上的效果就像是在記事本裡輸入很長的字串,然後選「自動換行」的樣子。除了可以指定寬度外,也可以指定縮排。
2.17 處理 HTML/XML,HTML/XML 裡有些字是需要特別處理才能顯示出來的,例如 < > & ,Python 可以使用 html 模組裡的 escape() 將這些字轉成 &lt; &gt; &amp; (html 在 Python 3 裡才有)。 在 Python 2 裡,只能用 cgi 模組裡的 escape() 來達成。有特殊字元的話,則可以使用字串的 encode 函式,例如 s.encode('ascii', errors="xmlcharrefreplace")。轉回來在 Python 3 可以用 html.parser 的 HTMLParser.unescape() 來做,Python 2 裡則是 HTMLParser 模組。
2.18 用 re 做一個小的 token 切割器,這個還蠻神奇的,大致就有點像是 PLY 的前段工作,餵給 re 多個 pattern 編譯以後,在進行比對時,他會告知符合哪個 pattern ,那就可以接著做後續處理。
2.19 這個是接續 2.18 ,做 parser,結果是可以弄出 AST tree。我沒細看,之後要找時間仔細看這段。
2.20 在 byte string 上做處理,基本上用法跟一般字串的用法是一樣的。


參考資料:

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

2.11 strip()/lstrip()/rstrip() 清除左右/左邊/右邊的無謂空白字元,空白字元包括 \t, ' ', \n 。
2.12 多條件的替換字串,一般要替換字串是用 replace,可是一次只能替換一種,多個的時候,可以用 translate() 來做替換。使用 translate 時,要建立一個 dict,key 就是要替換掉的字串,value 則是新字串。同樣可以搭配前面提到的 unicodedata 來使用。
2.13 字串對齊:ljust()/rjust()/center() ;也可以用 format(),format() 的第二個參數帶 > ^ < 就可以達到靠右、置中、靠左的效果。
2.14 字串串接:就用 + 或是 join 或是 format。這邊提到一個有趣的用法: s = "hello" "world" ,這樣也可以。字串輸出也不一定要先串到一起,搭配 print 函式,就可以:print(a, b, c, sep=':')
2.15 字串裡直接使用變數名稱 (interpolating):這個也是用 format ,例如 "Hello! {name}".format(name="John") 。這裡有額外提到一個 vars(),vars 可以把一個物件實體的屬性名稱跟值轉換為 dict

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

2.6 搜索與取代忽略大小寫,這也是利用 re 模組,在使用 sub/findall 的時候可以加上 flags=re.IGNORECASE ,這樣就可以忽略大小寫。
2.7 只想找到符合 pattern 的最短字串,一般來說,regular expression 是貪婪 (greedy) 的,他會試著去找最符合 pattern 的最長字串,因此作者舉了雙引號的例子,在文字裡有兩個被雙引號包起來的字串時,如 "hello" is a "word",re 得到的結果會是 hello" is a "word 。這時候可以用 ? 避掉,原本是 r'\"(.*)\"',可以改為 r'\"(.*?)\"' 。
2.8 要 match 多行的情況,例如 C 註解跨了多行 /* ... */ ,就可以加 \n,例如 r'/\*((?:.|\n)*?)\*/'
2.9 Unicode 問題,有些字元可以用多種表示方式,可是又需要視為一樣,這時候要利用 unicodedata 模組裡的 normalize()。到時候有用到再去查這部分好了。
2.10 re 有支援 unicode,pattern 字串裡用 \u 即可,用法其實跟一般字元一樣。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

2.1 split :字串原本的 split 只能認一個字元,改用 re.split 就可以依據多個字元來切割。例如: re.split(r'[;,\s]\s*', 'asdf fjdk; afed, fjek,asdf, foo')
2.2 starswith/endswith :只要前面或後面幾個字元符合指定字串就傳回 true。除了可以用在字串上,也可以用在 tuple 上。
2.3 用 shell 裡的萬用字元來判斷:利用 fnmatch 模組裡的 fnmatch, fnmatchcase 就可以辦到。要注意的是 fnmatch 會因為平台不同,而有可能判斷不同,Linux 上對大小寫判斷很嚴格,但 Windows 則否。因此 fnmatch('foo.txt', '*.TXT') 在 Linux 上會傳回 false,但在 Windows 則會傳回 true,這時候就得用 fnmatchcase 。
2.4 介紹 regular expression ,也就是 re 模組了,這部分可以講的實在很多。用 re 就可以用規則來判斷字串是否符合。
2.5 取代:字串一般就是用 replace,也可以用 re 模組來做,re.sub (substitude)

文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.14 跟 1.13 也是應用 operator 模組,這次用的是 attrgetter。應用這個,就可以方便的進行排序而無需自行寫比較函數了。 sorted(users, key=attrgetter('user_id'))
1.15 講的是 group,依據元素裡的某屬性來做分類。除了使用前面提到的 itemgetter 之外,還使用了 itertools.groupby 函式。
1.16 篩選:這可以用 comprehension 輕易達成,像是 [n for n in mylist if n>0] 這樣,或者也可以利用 filter() 函式達成。在討論裡有提到 itertools.compress 函式,這個函式可以根據第二個 list 裡的 boolean 來決定要取出第一個 list 裡的哪些元素,例如 list(compress(['a', 'b', 'c', 'd'], [False, True, False True])) 會得到 ['b', 'd']。
1.17 從 dict 提取所需的部分:這也是應用 comprehension 來達成, p2 = { key:value for key,value in prices.items() if key in tech_names }
1.18 namedtuple :介紹 collections.namedtuple ,這個很方便,可以簡易的做出一個簡單的類別,又具有 tuple 的特性,而不用寫 class,例如: Animal = namedtuple('Animal', ['name', 'description']) : animal = Animal('Bird', 'Can fly')
1.19 介紹 generator expression,說真的,我快搞不清楚 comprehension 跟 generator expression 的差別了,這篇 python - Generator Expressions vs. List Comprehension - Stack Overflow 有說明,大致上的差異就是在於 generator expression 傳回的結果無法以 indexer 存取,也就是不能用 [0] 這樣的形式來存取。實際上 generator expression 傳回的形態是 generator,而 list comprehension 傳回的形態是 list。
1.20 介紹 collections.ChainMap ,這可以把兩個 dict 結合在一起,看起來像是一個 dict ,實際上在存取時,會去真正的 dict 拿。另外一個是用 dict 原本的 update method 來做,但這速度上就會比 ChainMap 來的慢了,因為需要做複製的動作。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.11 介紹 slice(),slice 函式傳回來的是一個 slice 形態的變數,藉著這個,可以把一些東西固定下來,例如 a=slice(10,20): print s[a] ,這樣就不用每次都繁瑣地輸入 s[10:20] 。 slice 型別的變數還有一個 indices() 函式,可以避免存取超出陣列限制。
1.12 偵測串列裡最常出現的元素,這可以用 Collections.Counter 來做到。Counter 會幫你統計每個元素出現的次數,也會告訴你最常出現的元素是誰。
1.13 排序,這個很方便啊,就可以不用寫 lambda 了。假設 rows 是一個 list,元素則是 dictionary,就類似 JSON ,那可以這樣排序:sorted(rows, operator.itemgetattr('fname'))
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.6 是介紹 collections.defaultdict ,如果你希望預先指定 dict 裡元素的形態的話,就可以用這個。例如 d = defaultdict(list): d['a'].append('hello') ,d 裡的元素會預先宣告為 list ,後續就可以直接用,不需要額外作。
1.7 collections.OrderedDict 會保證裡面的順序跟你放進去的順序一致,比如你先放 d, c, b, a,那麼印出來時,就會是一樣的順序。如果是預設的 dict ,那就不一定了。
1.8 取 dict 裡的最大值跟最小值,作者一開始使用 zip() 來組,但因為 zip() 傳回的是 iterable,無法做第二次使用,所以作者建議直接用 dict.values()。要再額外取得 key 的話,就得用 min()/max() 的第二個參數,例如:min_value = prices[min(prices, key=lambda k: prices[k])] 。也可以繼續用 zip,但就不要二次運用 zip() 傳回的值: min(zip(prices.values(), prices.keys()))
1.9 取兩個 dict 的交集,這可以運用 keys() 來做,例如 new_dict = {key:a[key] for key in set(a.keys()) & set(b.keys())}
1.10 在保持原來元素的排序情況下移除 list 裡的重覆元素:作者自己寫了一個 dedupe() 函數來做,主要原理是利用 set 的特性。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()

1.1 Unpack a sequence: 還蠻常用的技巧, p = (1, 2): x, y = p ,也可以拿來作 swap,x, y = (y, x)
1.2 這是 1.1 的延伸應用,Unpack 可以 unpack 成 list,也就是 x, *y, z = range(10) ,但很不幸,這在 3.x 才能使用。說真的,我沒想過可以這樣用,這真的很方便。
1.3 留住最近的 5 個值:介紹 collections.deque ,這裡舉的例子是讀檔,假定你需要參考當前讀取位置的前五行,例子就巧妙地建立了 search() 函式,傳回當前行跟前五行。前五行的歷史就利用 deque 的特性-先進先出而一直保留住最近的五行。
1.4 找出最大的 5 個值或最小的 5 個值:介紹 heapq,heapq 有提供 nlargest() 與 nsmallest() 函式,可以很方便的取得。
1.5 Priority Queue: 這也是利用 heapq 模組,heapq 模組裡有 heappush/heappop 。
文章標籤

elleryq 發表在 痞客邦 留言(0) 人氣()