2014年3月22日 星期六

js function invocation and function context

目前學習javascript,其中有個好玩的地方同時我也覺得頗重要的地方,今天就特別來記錄一下,那就是如標題所述,function invocation 和 function context,在js當中呢,每個函式都會有兩個隱性的parameter,分別是 this 和 arguments。

arguments是一個很像Array的物件但是注意! 它不是Array,如同名字表是那樣,它代表的是實際傳入的參數。關於this在我看來就是指function context,根據不同的function invocation就會決定不同的function context,那麼this到底是何物呢?  this它指向一個物件,並且這個物件是有關於這個函式是怎麼被invoke的,聽起來還是有點模糊對吧 :) 先繼續往下看便知曉。

關於function invocation基本上有四種

1. invocation as a function
function ja(){
    console.log(this);
}

var vja = function(){
    console.log(this);
}

你執行上面code,將會看到function context是window(global context),

2. invocation as a method
看到名字就知道,這個function是屬於一個物件,因此我們創建一個物件
給予一個property reference到一個function
function globalSay(){console.log(this);};

var obj = {};

obj.say = globalSay;
obj.say();

執行上面code後,將會看到function context是obj這個物件,因此光從這邊就可以看出this是由這個function是怎麼被invoke所決定的

3. invocation as a constructor
簡言之就是藉由new這個keyword所產生的結果
function test(){
    this.say = function(){
        console.log(this);
    }
}

var obj1 = new test();
var obj2 = new test();

obj1.say();
obj2.say();

new這個keyword,它會產生一個新物件,並將這個物件的function context就是自己

4. invocation with aplly and call method
這個是我認為javascript很特別的地方這個方法可以,讓你隨意的指定function context
舉個例子來看看
function test(value){
    this.value = value;
}

var obj1 = {};
var obj2 = {};

test.call(obj1, 2);
test.call(obj2, 3);

console.log(obj1.value);
console.log(obj2.value);
如上obj1和obj2將會被增加value這個屬性。
call和apply的差別是在
xxx.call(this, x,x,x,x);
xxx.apply(this, [x,x,x,x]);

我覺得這功能的確滿方便的,javascript的this就是這麼....該說好用嗎?還是恐怖?
因為用不好的話,似乎會造成很多問題的感覺。

如果以前是學習C++來的人,會覺得js的this,會覺得非常與眾不同吧 :)
動態語言就是如此,有著靜態語言不同的風格,隨著電腦速度越來越快,我不知不覺中越來越喜歡用動態語言來寫程式了,像是python,反而C++越來越少碰了 :( 不知道要不要找時間回去熟悉C++ :(

回到正題,我覺得隨著mobile熱烈的發展,javascript已經越來越重要了,畢竟越來越多人已經支援js所規定出的標準了,已經是個合適的時機來學習JS了,而且可以另外學習function programming的style,會覺得別了一番滋味~



2014年3月15日 星期六

國軍online已過六個月

時間總是不知不覺流逝,這半年來的當兵生活,我想是有讓我眼睛及身體獲得適當的休養,只是程式能力就可能稍稍退步了,總覺得每次回到家,都得重新熟悉寫程式的手感和閱讀英文文章的感覺,這種FU真不好受,不過換個角度想想,要是我可以訓練到快速熟悉,那似乎也是一個不錯的能力呢(笑

好啦,這次文章也只是一個純粹抒發,沒目的性的亂寫而已 : ) 在航校的日子,其實也已經算是很熟悉了,每次晚上我都已經無聊到不知道做什麼了,幾乎都是在發呆,或是看看書,我一直都很期待可以帶筆電阿啊!! 我不懂裡面的學生都可以用了,為啥我們不能用? 替代役在航校總是一個特別的存在,在裡面被勤務連鄙視,但是卻又總在長官身邊有說有笑,平常作息卻又得像學生那樣,但卻不像學生那樣可以帶筆電 :-S 其實待了這麼久,我一直不知道替代役的地位到底算高還算低 :)

話雖如此,但是平常我們還是得看長官臉色,其實我一直滿討厭裡面有些長官,真的很愛賣弄自己的官階,而且總感覺他們看不起替代役,但是需要做事的時候,卻又一直用我們....感覺我們比勤務連還好用阿,一想到這些我恨不得明天就是我退伍的日子:(

不過呢,其實我還滿喜歡自己待的單位,因為這邊幾乎沒有我所說的那些長官臭脾氣,只是事情多了點雜了點,會有點累,但是我覺得這樣也好,這樣一來我晚上才會好睡點,反正晚上根本沒有任何娛樂,不如乖乖洗洗睡。在這邊其實我受到學姊滿多的照顧,很慶幸遇到她,這單位裡面也只有她跟我年齡最近 :) 剛開始我是覺得可能這樣彼此的代溝比較少會比較好聊天,但是其實我是一個不怎麼會講話的人,也不太懂開話題,而且腦子裝的都是跟程式有關的東西,所以其實也沒特別和她一直聊天,只是遇到問題就一直煩她:) 希望不會對她造成太多困擾。所以,我一直在想我是不是該訓練怎麼和人交際,可是我又很討厭去花力氣想話題,因為感覺有點假,我個人是認為遇到想法契合的人,話題應該就會源源不絕,想到什麼就說什麼,我比較喜歡自然的感覺 :) sigh,有時候我總覺得自己把這社會的一切想得太過美好,或許我該試著接受事實吧...

在航校,我看到了人生百態,知道人可以有如此多面,上一秒對某人開口迎笑,下一秒變臉走人,其實這也是我覺得我在航校越待越累的原因,雖然我都是旁觀者的身分並非當局者,但是看到這些,心情總是無法好起來,不要說軍官了,其實我感覺替代役同伴們多少也存在這樣的人,而且好像還會在背後捅你一刀,說你壞話,尤其是航校又分校部、學部,以國家概念來講,就像中心和邊疆,學校本身就充滿不公,俗話說上樑不正下樑歪,所以...咳咳,話就不說的太明了,也因此我總是非常期待可以快點到放假時間,因為這樣充滿假面的地方,讓我非常不習慣,我不知道當前跟我講話的人是真心的,還是假的,我只能確定當彼此有利益關係時,雙方當下總會採取互利共生的合作方式。有些人總說看眼睛就知道他是說真話還假話,但是我覺得這完全不準,眼睛會飄移,不代表是說謊,就我感覺眼睛會飄移,有很多原因:
  1.沒信心
  2.不確定(可能再回憶
  3.不好意思盯著人
有諸多原因。

總之在航校看到許多不公平的地方,自己卻又無能為力改善,只能乖乖看著事情發生,我有點百感交集,有時候我很羨慕天上的鳥兒,那樣自由自在遨翔,看著他們的時候,總覺得身邊的迷霧消失無影無蹤,讓我暫時喘了一口氣 :) 

這篇好像寫的雜亂無序 :)
不過到讓我抒發了不少心情,其實同時間我也是有再試著努力學習的 :)
目前正在試著熟悉javascript中,或許改天就可以看到我發的心得了

再來一首音樂~

2014年2月15日 星期六

create a blog on github (in process

今天逛程式論壇偶然看到一個東西叫做 github page 似乎是可以把你的網站github上面託管,官網上面有簡短的幾個步驟,基本上照著做,就會看到他所跟你說的效果,只是剛開始我看到的時候,心裡遲疑了一下,他好像沒有說到關於後端的事情阿! blog雖然只是一個簡單的記錄用途,像是日記一般,但是他最少也有提供留言的功能,我想這應該需要用到後端的幫助吧? 所以我很好奇這個有辦法做出有留言功能的blog嗎? 可是當我在github page上,把滾輪滾到頁底,卻發現 Blogging with Jekyll 這樣的字眼,讓我有點好奇於是就來試著用用看了,而且我看似乎有不少人的部落格也是用github page來託管,所以我想如果我用好後大概就是用它了,這邊的blogger就不會再更新了 :P

Jekyll 看官網說明它是由 ruby 所寫的,這同時也代表你必須要擁有ruby才能用Jekyll,由於我目前沒興趣碰ruby,題外話,個人覺得ruby似乎有模仿python的味道,不過兩者所秉持的精神卻是大大不同就是了,有興趣的人可以去學學ruby:) 回到正題,由於上述原因,所以我就試著找尋看看有沒有類似的library是python所寫的,果然不出所料是有的,目前我發現兩個可能不錯的 hydepelican 而且看了這兩個網站,他們也的確說自己是 static site generator,所以我更加好奇留言功能是怎麼用的 :P 雖然有的是方法,比如一有人留言就更改網頁內容這樣,只是要做到這樣的話,github網站就必須提供API讓我們可以控制這樣的行為...不管是怎樣,總之我很好奇 :)

我挑的是pelican,不過如果你的平台跟我一樣是windows加上python的version是3以上的話,在安裝上可能就有點麻煩了 :P 因為他要藉助setuptools來安裝 :( 所以呢! 首先到 這個網站 下載 ez_setup.py,別懷疑就是run它,安裝完後就可以安裝pelican,他會自動幫你安裝它所依靠的其它library,做完這些後,你會發現還是有問題!! 當你執行pelican-quickstart會跑出錯誤訊息 syntax error ,其實就是python2和3的問題,所以要用python3內附的py2to3去轉換後就OK了 :) 然後另外問題就是pelican文件上也有說明,如果你想要用markdown寫網頁的話,那你還要另外安裝python的package markdown就是了。

目前我做到如此而已,畢竟還要讀一下pelican的document才知道後續的操作~ 這篇就先記錄在windows上安裝的流程這樣,至於怎麼把網站用到上面我想等我了解一些內部細節後,在一起記錄。

其實如果是linux的環境應該是無痛安裝 :P這並不是代表windows suck,這只能說源自於linux的東西,本來就對linux友善,想要在不同平台使用就要靠自己去做修改 :) 幸好不用到改源碼的境界就該高興了 :P

最後再來個音樂吧 :)


2014年2月5日 星期三

pyqt designer 初體驗

放了一個年假,總算是有點心情來搞跟程式有關的東西了 ˙ˇ˙   這次呢~我是嘗試著把之前做的imageDisplayer改成dark theme,功能還是一樣並沒有增加就是了:P 我只能說QT,真是讓人越用越愛阿,真的是一個很強大的library,他支援很強大的客製widget的功能,從官方網站的文件說明即可體會到這點,想到以前我在嘗試著用windows api去寫一個小小的GUI程式就搞了很久,要查很多api文件,而且那時候我還不知道怎樣去custom widget呢,舉例來說,把scroll bar改成很漂亮這樣,而不是一個很普通的樣子,從我給的連結應該就可以看出我要說的是什麼意思了。

另外很特別的一點,QT他是使用css來改變GUI widget的外貌的,這點還真的是非常方便,從連結可以看到,你可以把scrollbar的上下箭頭改成其他圖案,或者是讓其不要顯示,上下箭頭的部分是這樣的 QScrollBar::up-arrow, QScrollBar::down-arrow 你只要設定他的background:none就會讓箭頭消失了,QScrollBar::handle則是中間那個長方形,你當然也是可以隨意改變他的樣子,剩下的我想官方說明已經非常清楚就不一一拿出來說嘴。

不過目前我也是第一次用qt designer來做介面,另外我在實作時發現他好像有BUG,照理說這種WYSWYG,成品做出來後應該是不會差太多才對,不過很神奇的是,我用了Gridlayout去安排位置,結果我的button和lineEdit的位置都跑掉了...一整個滿神奇的,我為了搞這個搞了很久一再重複拉來拉去(感覺不太好拉阿sigh),然後再把ui檔compile到py檔,最後再看成品的UI位置,結果怎麼調都沒辦法,就暫時放下來了:P 因為目的也算是達到了,只是想要體驗custom widget的功能而已。

QT實在還有太多地方可以去鑽研,只是目前還有八個月役期的我,最多也只能利用放假來寫code了~

不知道是否各位寫code時,也會利用音樂增加寫code的動力 :P

 

PS:太久沒碰,總是需要動力來幫助的

2014年1月31日 星期五

介紹一本不錯的javascript的書

目前仍然處於軍中,說實話回到家沒多少心情寫code,實在慚愧,於是乎小弟我轉換個用功方法,就是看看書囉~ 我目前在看的書是 eloquent javascript ,看了幾章,覺得他講解的十分清楚,而且他的定位是把你當成一個程式新手 :P

前幾章我是看的十分之快~  畢竟都有一些基礎了.. 但是我不知道有沒有漏看什麼重點 :)
目前我閱讀英文書的速度並不快,要是一加快速度老是會有地方,不是那麼懂,真不知道什麼時候可以練到跟看中文書一樣的速度。

好啦 :) 回到正題,說一下這本書的教學安排
基本上
前四章,是把JS裡面的基本資料型態介紹給你知道。
第五章,跟你說說例外處理。
第六章,就是最近夯起來的function programming,裡面介紹一些基本概念這樣。
第七章,這個如果你真的是一個新手(剛碰程式語言),這章可以跳過,因為這裡面有關於path-finding(演算法的東西) ,沒學過的會一個頭兩個大 :P
第八章,則是講在JAVASCRIPT怎麼寫出物件導向的方法,多半是用到prototype拉 :P
第九章,是講模組的方面,只是關於JS,他並不像其他語言有模組系統,不過這邊我也沒過多摸索,就不講太多了 :P
第十章,regular expression,很值得練的東東,建議可以看熟一點
第十一章,講一些關於http和web比較瑣碎的東西,想是protocol阿,webpage的post和get等
再來後面還沒看~

基本上我是不會寫每章的心得,因為這本書我是把它當作休閒看看,沒有打算精讀 :P 但是這樣略讀後,我是真心推薦新手可以看這本書,會學到很多東西的~~

最後小小的期許 :) 希望過些日子可以取回寫code的心,即使在軍中心有多累,周末回到家仍然會有心情寫code :p

2014年1月2日 星期四

python wsgi 初體驗~

最近終於稍微將上進的心,慢慢抓回來了 : ) 所以特別來寫一篇,雖然質量可能沒說很好,但總也是一個進步,好了,回到正題,其實是最近開始對python的django 感到有點興趣 :P

我照著官方的教學,跟著一步一步慢慢做,在其中赫然發現,有個東西叫做wsgi,那時我突然覺得奇怪,怎麼這東西似曾相似,於是我果斷就搬出我最會的技能( google it ),哈哈,原來python標準模組裡就有這種東西,難怪會有熟悉的感覺,看過wiki介紹後,才知道這是python所定出的一個interface,wsgi千萬不要硬記阿! 看過他全名後就很容易記起來 web server gateway interface,簡言之,它只是一種application和server間溝通的介面這樣,想要看更加詳細的解說,可以看看這個 網站,說得滿詳細的。


跟往常一樣就先來個測試範例吧

from wsgiref.util import setup_testing_defaults
from wsgiref.simple_server import make_server
from wsgiref.validate import validator


def simple_app(environ, start_response):
    setup_testing_defaults(environ)

    status = '200 OK'
    headers = [('Content-type', 'text/html; charset=utf-8')]

    start_response(status, headers)

    ret = '<script>alert("hello world")</script>\n'.encode('utf-8')
    return [ret]


validator_app = validator(simple_app)

httpd = make_server('', 8000, validator_app)
print('serving on port 8000')
httpd.serve_forever()

其實關於我給的那個網站,就有對於參數詳細的說明,或者去官方網站看也會得到解釋的,所以在這我就不會特別說明了 :P (其實是有點懶XD

start_response就是將http的status和header傳給server,想當然爾,傳完了initial資訊,就要接著傳內容,這邊有個特別的地方那就是回傳的值(內容)! 似乎必須要是iterable的值,以我的python版本,如果只是單純回傳bytes物件會發生錯誤,因此我才會用list。再來就是python強大又好用的地方了,他很貼心,有做個小型Server可以讓我們測試結果,而不用再去安裝其他server,還要去做相關設定....。開啟localhost:8000後,就會跳出一個視窗上面寫著hello world囉~ 顯而易見的答案對吧。


另外關於ret你是可以改成讀取index.html檔案,然後encode後再回傳,這樣做的話,就更有server的FU吧 :) 我想django大概也是利用類似的做法,不過django也說了他是一個架構,而非server,所以自附的server僅供測試方便,要發佈網站時,還是用專業的server比較好。

2013年12月7日 星期六

在航技一個月的心得

基本上這篇大概又是一篇抒發心情的文章了吧 :)  原本我以為我已經習慣了這邊的生活了,和我所在的單位裡面的長官,有慢慢熟悉了,每天的時間都過得非常快,因為每天都有事情做,時間自然流逝的快,但是! 就在最近發生了一件事,讓我和我同學十分不爽。

事情是這樣的,基本上我們吃完晚餐後,由於遵守"節能省碳定律",路燈是幾乎沒再開的,很好這代表什麼事呢? 我走在路上基本上看到人都是一團黑影,我和同學就邊走邊聊天的回到宿舍,你一定在想有什麼事情發生嗎? 沒錯,我和那位同學就和往常一樣平安的走回宿舍,基本上是沒什麼事情發生的,但是在晚點名的時候,事情開始了,我們的管理幹部跟我和那位同學說,我們被投訴沒禮貌! 記你們點有沒有問題? 我們倆整個感到意外,但是嘴巴是自然反應的說沒問題,心裡盡是想的,我平常遠遠看到長官都大聲叫長官好,看到車子和機車經過也是停下來,並敬禮,連看到替代役學長都有問好,我是哪裡沒禮貌了? 哪位神人可以出來跟我們解釋一下,讓我心服口服?? 結果他說我晚上走回去沒跟長官問好,我整個冏掉,我他X的,根本連一個長官都沒看到,是要跟鬼問好? 結果他說他晚上和長官走在一起,有看到我們,結果我們沒問好,聽到這邊我更冏了,我連你在那條路上都不知道了,更何況是長官...但是那位管幹仍然說,不管~ 你們就是被投訴了,所以要記點,話說這邊,我整個就不想理他了,連這樣都可以記我點,那以後的生活要怎麼過? 改天夜黑風高,我他X的看到一堆人影,是不是該每個都問長官好,看到十個就喊十次長官好? 到底是哪個處室的神經病長官,如此無聊投訴我們? 還是說其實壓根沒長官,是該位管幹想要盯我們而已?

發生這樣的事情後,讓我更沒心情待在那種鬼地方,因為我感到更絕望了,我絕望的不是因為我還要待10個月,我絕望的是,國家花錢養這些軍人,就是讓他們無聊電電和惡整替代役?這根本是浪費公帑,想說之前做事沒效率就算了,因為做事沒效率其實不只國軍,所以我可以理解,沒公正公義就算了,因為我在軍中,是講求階級的地方,所以我可以忍氣吞聲,讓你們感受到高高居上的爽感,但是今天無聊這樣投訴我們,就讓我覺得超不爽! 軍人可以無聊到這種程度,你以為你是皇帝喔,每個人是不是都要餵你吃飯,幫你擦鞋,一聽到你的聲音,就要馬上立正站好,在以前這樣的皇帝根本是廢渣,馬上就要滅國了。

看到這樣的軍中,整個就是古代皇朝的縮影,我現在心裡想的沒有什麼,就是想要趕快離開這鬼地方,因為我不想自己被那些人同化,雖然我對自己忍耐力非常有信心,但是潛移默化這種力量是很恐怖的,即使你再怎樣不小心,或多或少都是會被感染的,我很怕自己會慢慢被他們同化...我不想成為自己討厭的那種人。

 這篇大概是我最後一篇軍中抒發心情的文章了吧,因為我決定了,我這部落格本來就不是拿來做這種事的,而且要記錄我的程式之旅,所以接下來要寫個跟programming有關的文章了,但是大概要等我下次回到家的時候了 :P