tag:blogger.com,1999:blog-78332119080833318112024-03-14T16:05:56.100+08:00My Travel In Programmingsillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.comBlogger45125tag:blogger.com,1999:blog-7833211908083331811.post-71708089084255424742014-10-30T12:23:00.003+08:002014-10-30T12:23:47.227+08:00網頁要搬家了!最近其實越來越想要用markdown來寫blog了,因為markdown可以讓我更專注在內容上面,所以我找了一下有提供這種寫作方式的blog,於是就發現了 logdown,網址是<a href="http://sillygod-blog.logdown.com/" target="_blank">http://sillygod-blog.logdown.com/</a> 圖案如下<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/ZayeGlf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/ZayeGlf.png" height="360" width="640" /></a></div>
<br />
<br />
目前而言我已經把大部份的文章都轉到那邊了,可能有些文章會有格式的跑掉的問題,哈哈。<br />
<br />
以後我想有機會的話,我想會自己寫個blog的系統,有可能是純粹的static web site也說不定,這樣既可以放在github page了,要不然就是寫個有後端功能的blog放在pythonanywhere之類的地方,都有可能XD 只是現階段而言,先在logdown上面寫文章和記錄心得~ 短時間內是不會變動的。sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-29590954998363144812014-10-14T20:37:00.001+08:002014-10-14T20:38:01.164+08:00初嘗Responsive Web Design以前就稍微略有耳聞過這個東東,RWD到底是什麼東西呢?? 其實現在隨便google一下都會有答案,responsive 有點像 altermating的意思,就是交互的,響應的,所以網路上RWD翻譯常看到"響應式設計",我想這種設計網站的風格,主要是因為現在mobile發展的太好啦,隨著瀏覽網頁的裝置不同,想必要有針對性的頁面設計吧~~<br />
<br />
也因此這種RWD,需要已靠 css @media這類的東西,詳情看 <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media" target="_blank">這裡</a> ,這是CSS本身就有支援也比較方便,我想如果是以前的時代可能就要依靠javascript去控制了吧~ 回到正題,關於media這個語法我也不清楚,畢竟我不是專門寫網站設計的,後端OK,但前端我只是略懂略懂 :)<br />
<br />
其實現在framework這麼多,你也不用手刻這種css framework,況且css本身的特性,很容易覆蓋前者定義,哼哼,你一定想這樣可以幹嘛是吧! 個人是認為這樣你就放膽去用css framework,如果效果不合你意,你在自己定義去覆蓋就好囉,對於前端可以省超多麻煩,也可以放多的心力在JS和後端,當然如果是想要專精於前端的客官阿,我有找到一篇blog,內容挺不錯的 <a href="http://learn.shayhowe.com/advanced-html-css/" target="_blank">這裡</a> ,可以多看看,好拉說了這麼多,我也來說說我用了什麼framewrok,我個人目前用的是 <a href="http://getbootstrap.com/" target="_blank">bootstrap</a> ,這個其實不單是一個css framework,其中也包含了JS和一些東東。<br />
<br />
這邊要告訴你,如何快速上手 bootstrap,基本上官方文檔就夠了,而且我看也只有官方文擋了 :p "getting started" 那邊的連結基本上看了你也不懂怎麼用 :) 直接開一個 <a href="http://jsbin.com/" target="_blank">jsbin</a> 或者類似的網站都可以,目的就是讓你直接看到效果,最直接又方便,再來直接看官方的css和component的連結,他的說明都會有舉個小小例子,直接複製貼上,看看效果,我想你就略知一二了,對了,記得jsbin中,要加入library喔~ 要不然會沒看到效果,其實玩一玩後,我想你就大概知道怎用了,因為基本上只是把框架修改修改,遇到問題就去 stackoverflow查一下,基本上會有解答的。<br />
<br />
小弟基本上花了不到兩小時就稍微知道怎用了,也寫了一個前端,雖然我的頁面設計很不行 :( 沒有美感,加上又沒美工.... 預覽圖如下<br />
<br />
在PC上長這樣<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/B88wzQs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/B88wzQs.png" height="360" width="640" /></a></div>
<br />
在mobile下長這樣,這裡用chrom的開發工具預覽<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/gdvFqPY.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/gdvFqPY.png" height="360" width="640" /></a></div>
<br />
基本上我沒自己額外加寫css,就有這樣的效果了,只是純粹套用class,很方便。<br />
<br />
目前而言,這篇也只是跟你展現怎麼快速使用,至於要怎麼隨心所欲使用的話,看我以後會不會常用到這個,有個心得後,我再做多的解釋,或者是類似的framework的比較。<br />
<br />
退伍後的programming相關的第一個post :) 好久沒寫這樣的文章,有點累(眼睛 QQsillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-74284323629084523922014-10-06T15:55:00.003+08:002014-10-06T15:55:39.686+08:00退伍了!!! 自由萬歲千盼萬盼~ 終於等到這一天了,說我高興嗎? 想當然爾,回答是肯定的,但是不知為何,在我要離開航校的前一晚上,我一人獨自看著空無一人的房間,突然有種說不出的感覺,不知道那是要解脫後的鬆懈,還是捨不得在航校認識人事物的傷悲,我那時只是這樣望著牆壁,發呆了一陣子,直到10點就寢,其實那晚我睡不著,即使關著燈,我依然 看著黑壓壓一片的天花板,回憶起,我在航校快要一年的點點滴滴。<br />
<br />
初到組上的我,一開始完全沒有可以聊天的對象,因為我同梯的都在別的單位,說實在的前一個禮拜,真的過的有點痛苦,只有吃飯和睡覺的時候可以同梯的互相聊天,像是遇到哪個長官很機車的阿,有的沒的,各種八卦阿XD 還有那些日子我們一起幹譙長官的日子 :) <br />
<br />
前幾個禮拜,我會覺得痛苦是因為<br />
<br />
一來是事情真的有點多,動不動就被叫去支援做什麼事 <br />
二來是同為替代役的某個學長很白目<br />
三來再單位上找不到可以談話的對象,基本上年紀都有點差距,有點代溝吧~~<br />
<br />
直到學姊(算是組上帶領我的直屬吧? 也是年紀跟我差最小的一位)有時候會過來跟我聊聊天,雖然我也不太懂得怎麼開話題就是了 :( 之後慢慢的我跟組上也有點熟悉,更加後來組長幫我檔了一些雜事,讓我專心為組上moodle的架設,也因此跟部分長官也有點熟悉。大部分跟我比較有互動也才幾位就是了,而且絕大部分都是跟學姐,一起去掃地,過年將近為組上做佈置阿、大掃除阿,一起跑公文,在組上的期間過的都算順遂,讓我不開心的地方是在軍中認真做事,真的會吃很多虧,我看過太多人一開始跟我一樣,認真做事,但是不出一個月,就同流合汙了,為啥?? 因為擺爛就是爽,反正爛個一年,還不是可以退伍? 的確拉,我不是不能理解他們的想法,曾幾何時,我也在想為啥我不乾脆跟他們一起爽,反正我認真做事,事情越做越多呢 :) 很好奇為啥事情會越做越多吧,因為你雞婆去幫別人做事,做久了長官還以為那是就是你負責的,到最後沒做好反而是罵你,不是罵他呢,厲害吧 :) 已不知道要說啥<br />
<br />
這種情形不用說軍中拉,社會上也是一樣,基本上在軍中有絕大多數的時間,真的是浪費時間,常常做許多無意義的事,但是到最後我還是覺得,我不想成為那樣的人,不管如何還是要保持認真負責的態度,不過我還是會看長官是怎樣的人再說,如果它本身就是擺爛態度,我怎樣拿熱臉去貼他的冷屁股,也沒用,這時候我就會採取隨便的態度,不想多理他。<br />
<br />
在我剩下三個月附近就要退伍的時候,組上後來又來一位學姐,在期間當然也有一些長官,調差的,這也讓我覺得,單位上的人員這樣變動好大,要是我一定會覺得難過,一起做事的人都這樣離開單位了,話題回到學姐,一開始我帶他熟悉航校的各單位還有事情,途中也和她聊天,在某一次碎紙的時候,恩...別懷疑碎紙是軍中超容易遇到的事,一直重複著一樣的動作,不過這不是重點,和她聊一聊,才知道原來她是大學才想不開來當軍人XD 好吧,其實我也不清楚她是讀完才來當,還是讀到一半就來當,也不知道是為啥會想當軍人,我也不想多問,我猜十之八九不離十,應該是家境的關係吧,不過這只是個人的猜測,學姊人很好相處,想法也不錯,果然年輕一輩的想法都會比較好嗎?? 至少相處起來,不會覺得哪裡怪怪,或不舒服,現在回想起來,跟我比較好的,除了一開始的組長,還有身為我的經紀人的中尉XD,剩下都是士官等級跟我比較好~~<br />
<br />
說實在最後要退伍的時候,組上的各位,為我辦了歡送會,我感到很開心XD 我突然覺得這一年好像作夢一樣,怎麼轉瞬間,我就要回到死老百姓的生活了,當兵的這一年,真的有很多事可以寫,只是要是我每件事都拿出來講,應該是鳥事居多XD 況且很多事我都忘了,因為不值得回憶 :)<br />
<br />
<br />
最後真的有點捨不得組上的各位,我也要來面對現實了,是時候來調整好心態,認真找工作了。sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-615829005212840122014-07-13T14:39:00.000+08:002014-07-13T14:47:58.253+08:00how to resize the console window in windows最近在軍中時在遇到太多鳥事,同時也遇到一些不太如意的事情,再加上我開始有點迷茫了,關於學習方式的事 :( 所以已經有一段時間沒碰程式了,只有回家逛逛論壇,突然我看到一個議題讓我有點小興趣,那就是我今天要寫的東西。<br />
<br />
其實如果想要可以放大的console window,其實也不難而且也不需要寫程式,點個右鍵,去設定裡面的一些性質就可以,只是身為一個programmer,就是要寫程式去控制不是嗎? :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/K7gZ63v.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/K7gZ63v.png" height="360" width="640" /></a></div>
<br />
上面這張圖是我目前寫出來的樣子,只是我對某些地方仍然感到不解,就是當我點把視窗放到最大,他其實並非真的完全放大,下面仍然會有些空隙,目前的code我放在<a href="https://github.com/sillygod/my-travel-in-learning-python/tree/master/cli_chatroom" target="_blank">github</a>上面的console.py,其實這個project當初只是無聊試試看socket做個小小的consle介面的聊天室而已。<br />
<br />
關於撰寫這樣的功能,需要注意的地方,大概也只有幾點,這些心得是我觀察了一下,console的內容後得出來。<br />
<br />
首先,先來說說我的觀察,一開始windows的console window buffer的預設值是 80x300,我是不知道是不是每個windows系統都這樣啦,或許你自己也改過設定也說不定,之後你可以試試看點放到最大,你會發現視窗只有拉長高度,對於寬度他並沒有拉寬,所以可想而知,console buffer size,是一個關鍵點!! 所以想要放大視窗,我們必須為console準備相對應的buffer size,至於要怎麼計算呢? 我認為大概是這樣的<br />
<br />
console buffer width = screen width / console font width<br />
console buffer height = screen height / console font height<br />
<br />
以我電腦為例<br />
200 = 1600 / 8<br />
56 (大概值) = 900 / 16<br />
也就是說最少我也需要200x56的buffer size才可以放到最大....<br />
<br />
console font size的預設值通常是 8x16,當然關於這個可用winapi去取得,是用什麼函式這裡就不囉嗦了,詳細請看console.py裡的resizeConsoleWindow,算完後,要重新設定buffer size以至於放大時可以填充,我同時也設定了console window info 雖然有得到跟上面那張圖,不一樣的結果(更接近真的放大最大),上面那張是按了放大最大後的結果,關於這個行為我目前還是不解就是了,因為我已經準備足夠的buffer size讓他可以最大化,可是點了之後卻有點落差,不是很懂為什麼? 關於這點我還必須在研究一下 :(<br />
<br />
或者有誰知道為何的,可否告知小弟 :)sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-26144466265355149732014-06-02T13:06:00.001+08:002014-06-02T13:06:57.931+08:00快要破百了~最近沒什麼在寫blog,其實是有原因的,那就是最近又遇到不如意的事情了,讓我沒什麼心情,果然在軍中是不會平穩的過下去呢,總是會有鳥事跑到你身上,這幾天以來,我也重新回憶了,打從進成功嶺到現在的點點滴滴,赫然發現,其實這只不過是一連串的被政府陰了而已,為什麼我會這麼說呢?<br />
<br />
來看看接下來我寫的吧,選役別的那天,社會役的主官臨時公佈資工系限定20名,原本沒限定的話,那可有一百多,而且又在第二順位,這表明我是穩上的,很好被她這麼臨時一搞,我就摸著鼻子去法務部行政啥鬼署的,坐在那邊,我分析了當場的人數一看,大概是80抽60,大學生而言,這樣我看機會是頗高的,於是我就坐在那邊要來一場廝殺 :)<br />
<br />
不過呢,誰知道天殺的教育役,竟然事先偷跑,先行公佈結果,讓那些落選的碩士生,硬生生多了一次機會,很好,接下來知道發生什麼恐怖的事了嗎? 那就是在我這個役別即將開始公布結果的前五分鐘,突然殺來一批碩士,我看了都傻眼了,這是什麼情形,當初說好的全部役別,同時公佈的規定呢? 根本是屁,最氣的還不是這個,而且那些碩士有一半明明不是資工相關的,還是可以進入保送名單,我真的傻了,動力機械系也是資工相關,啥鬼能源系也是資工相關,我還真想問一下那個主官,他腦袋是不是有問題,被他這麼一搞,從原本的80抽60,變成80抽1X,機率整個變超低,那時我的心情整個已經是呈現無言狀態了,我只是默默看著主官的表情,和那些碩士生的嘴臉,之後我就默默的走了 <=想也知道是沒被抽中<br />
<br />
於是呢,我進去的第二階段,不過用你的小宇宙想也知道,還有什麼名額剩下來,一定都是屎缺,沒錯,我接下來就百般不願意坐在國防役那邊,聽著主官的像錄音帶式的官腔,他說什麼其實我也都沒在聽了,只是突然底下有人發問,問說中部地區也會開放嗎? 這個我可超有印象,主官連續重複了兩次,他一定會在中部開放地方,我聽到這個心中想,似乎也還可接受,至少有什麼離家不遠的地方,這樣交通費用也可以省下不少。<br />
<br />
只是誰知道呢? 我從沒想過,原來主官說的話,可以這樣一而再,再而三,如此沒信用,我真的應該在被陰了兩次後,就要想到會有第三次了,事實是中部根本連個屁都沒開, 最後只好選了在岡山的航技,只是這樣每周回家的交通費,其實也花了不少,一個月大概快2000,薪水剩下4000那邊,我能夠說什麼呢?<br />
<br />
好了,以上那些都是我回憶感想,就來說說最近發生的事吧,當初內政部說大概一月會來關心我們,這次果然有信用呢! 真的有來,而且還是在五月才來,最厲害的是,來的是國防部,我都無言了,隨便想想也知道,又是個摸(ㄕㄚ)頭會吧,自從被陰了那麼多次後,我只能說我對政府和國軍沒什麼好印象了,果然我們在那場會議,所有的要求全都被回絕,其實我也不意外拉,只是似乎那位國防部派來的,之後有和航校討論某些的東西的樣子呢 :p<br />
<br />
自從那場會議後,我們的生活就越過越苦了,因為他說替代役什麼事都可以做,就跟一般兵沒兩樣,好個沒兩樣,壞的都比照一般兵,好的都不能比照(例如:放軍人節),連吃飯夾多點,都會被罵,一樣都有繳錢耶,我是不能吃嗎? 我只能說當國防役就是會被無盡的被凹,想著想著也只有無盡的無奈,想著這些事情,覺得台灣會變成今天這樣,其實也是理所當然,感覺我遇到的事情,就是國家政府整個的縮影,如此沒信用,沒誠意,只會凹別人,又不給獎賞,試問有誰想要待在如此美好的地方?<br />
<br />
這篇又是個抒發心情的文章了~ 下次來PO點營養的文章 :)<br />
而且快要破百,也代表我該來想想以後工作的事情了,又來好好的計畫一下 <br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-39029210901166312522014-05-10T22:14:00.002+08:002014-05-10T22:27:06.330+08:00read open source pygments 2這篇就來,繼續上次的進度 :)<br />
<br />
上次code貼上來的結果不甚理想,所以我在想是不是要自己來寫一個format會比較方便,當然在動手之前,我想重新理解code的流程是必須的,因為要讓自己對這份open source掌握更加清楚,所以我決定利用debug的step into,來進行trace code :p<br />
<br />
這邊就來介紹一下我用的工具,關於debug,我還是選擇用IDE,因為比較直覺化又容易使用,我是覺得沒必要去聽信那些說用gdb才是王道,畢竟那要打一些指令,實在是有點麻煩,個人是認為有興趣的話再去用那種方式 :p<br />
<br />
說要介紹我是用哪款IDE都差點忘了 :) 這邊我是用<a href="http://www.jetbrains.com/pycharm/" target="_blank">pycharm</a> ,這一直以來都算很有名氣,雖然是要錢的,但是網路上總有...咳咳,不過那僅限以前!!,現在可好了呢,它有提供open source版,而且功能很夠用,有興趣的人可以去載來用看看 :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/gxPLPNv.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/gxPLPNv.png" height="360" width="640" /></a></div>
<br />
<br />
pycharm的介面如上,它提供了算是不錯的code intellisense,加上trace code也是方便,像是find definition,加上它的plugin也是挺多的,要說讓我說嘴的地方就是記憶體吃的有點多:(<br />
另外以介面來講,我還是喜歡sublime就是了,好啦,該來講講怎麼trace code的部分了,一般來講都要先下個所謂的break point,就是讓程式執行到該行時,停下來,接著就有如下幾個操作<br />
1. next line(step over)<br />
2. step into<br />
3. step out<br />
... 等等<br />
<br />
就先來看看這張圖吧<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/nhja3Fq.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/nhja3Fq.png" height="360" width="640" /></a></div>
<br />
我在40行的地方下了中斷點,所以程式執行到這邊就會停下來,之後呢,我特別在watch中加入一些我想看的變數,上面這張圖是我step over後,可以看出它是一個class,有興趣要看它是怎麼一步一步產生的話,就必須用step into,就像接下來的HtmlFormatter,我用了step into就會如下面這張圖<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/b57Jy6r.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/b57Jy6r.png" height="360" width="640" /></a></div>
<br />
程式碼頁面會跳到HtmlFormatter所在的檔案html.py,接著你更想的話,你當然可以繼續用step into,就看你想要鑽到的地方有多深,就跳多深吧 :)<br />
<br />
另外我覺得用pycharm來debug真的是頗爽 :) 老實講真的太方便了,看前面幾張圖就知道,它其實會自己監看一些變數,起初我用sublime text閱讀源碼時,其實有點卡卡的,當時我認為是我理解力不夠,因為有很多地方看過去,我會有種不知道這樣的code會產生什麼效果,但是用了pycharm就方便多了,因為你會看到這些變數,就知道他們是否如你所想像的一樣,這樣一來多了一些證實,自然就會多了信心,閱讀起來更加順遂,就舉個例子好了,請看下面這張<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/J9gGWbC.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/J9gGWbC.png" height="360" width="640" /></a></div>
<br />
<br />
我當初一眼看沒有懂的地方就是這裡<br />
arg = ('cssclass' in self.options and '.'+self.cssclass or '')<br />
從圖中可以看到arg的值是.highlight其實就是'.'+self.cssfile<br />
很好!! 這樣的寫法到底是怎麼運作呢? 詳細可以看看 <a href="http://www.diveintopython.net/power_of_introspection/and_or.html" target="_blank">這個</a>這樣的寫法不是每個programming language都可以寫的呢 :) 看看這個<a href="http://en.wikipedia.org/wiki/Short-circuit_evaluation" target="_blank">wiki</a> 就知道囉~<br />
<br />
回到正題,那行的意思是 'cssclass'有沒有在self.options裡,有的話就會回傳'.'+selfclass,沒有的話,就會繼續evaluate下去,那就是變成回傳'',這其實是用到short circuit的技術 :p<br />
其實個人認為這邊根本不需要用到這種寫法,只是徒增不可讀性就是了,用if else還親民多了,不過這不代表這樣的寫法沒用處,我想大概可以用在 lambda這地方吧 :)<br />
<br />
經過這次的閱讀,目前我想到一個,不用自己繼承一個HtmlFormatter的寫法了,我是用了擷取部分code,之後再自行增加一些必須的html的方式。<br />
<br />
目前我粗略地寫了個簡單測試腳本,效果如下<br />
<style>
.lineno {
color: #505050;
margin-right: 5px;
}
.highlight .hll { background-color: #404040 }
.highlight { background: #202020; color: #d0d0d0 }
.highlight .c { color: #999999; font-style: italic } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .g { color: #d0d0d0 } /* Generic */
.highlight .k { color: #6ab825; font-weight: bold } /* Keyword */
.highlight .l { color: #d0d0d0 } /* Literal */
.highlight .n { color: #d0d0d0 } /* Name */
.highlight .o { color: #d0d0d0 } /* Operator */
.highlight .x { color: #d0d0d0 } /* Other */
.highlight .p { color: #d0d0d0 } /* Punctuation */
.highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */
.highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
.highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */
.highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
.highlight .gd { color: #d22323 } /* Generic.Deleted */
.highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
.highlight .gr { color: #d22323 } /* Generic.Error */
.highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
.highlight .gi { color: #589819 } /* Generic.Inserted */
.highlight .go { color: #cccccc } /* Generic.Output */
.highlight .gp { color: #aaaaaa } /* Generic.Prompt */
.highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
.highlight .gt { color: #d22323 } /* Generic.Traceback */
.highlight .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #6ab825 } /* Keyword.Pseudo */
.highlight .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */
.highlight .ld { color: #d0d0d0 } /* Literal.Date */
.highlight .m { color: #3677a9 } /* Literal.Number */
.highlight .s { color: #ed9d13 } /* Literal.String */
.highlight .na { color: #bbbbbb } /* Name.Attribute */
.highlight .nb { color: #24909d } /* Name.Builtin */
.highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */
.highlight .no { color: #40ffff } /* Name.Constant */
.highlight .nd { color: #ffa500 } /* Name.Decorator */
.highlight .ni { color: #d0d0d0 } /* Name.Entity */
.highlight .ne { color: #bbbbbb } /* Name.Exception */
.highlight .nf { color: #447fcf } /* Name.Function */
.highlight .nl { color: #d0d0d0 } /* Name.Label */
.highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
.highlight .nx { color: #d0d0d0 } /* Name.Other */
.highlight .py { color: #d0d0d0 } /* Name.Property */
.highlight .nt { color: #6ab825; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #40ffff } /* Name.Variable */
.highlight .ow { color: #6ab825; font-weight: bold } /* Operator.Word */
.highlight .w { color: #666666 } /* Text.Whitespace */
.highlight .mf { color: #3677a9 } /* Literal.Number.Float */
.highlight .mh { color: #3677a9 } /* Literal.Number.Hex */
.highlight .mi { color: #3677a9 } /* Literal.Number.Integer */
.highlight .mo { color: #3677a9 } /* Literal.Number.Oct */
.highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */
.highlight .sc { color: #ed9d13 } /* Literal.String.Char */
.highlight .sd { color: #ed9d13 } /* Literal.String.Doc */
.highlight .s2 { color: #ed9d13 } /* Literal.String.Double */
.highlight .se { color: #ed9d13 } /* Literal.String.Escape */
.highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */
.highlight .si { color: #ed9d13 } /* Literal.String.Interpol */
.highlight .sx { color: #ffa500 } /* Literal.String.Other */
.highlight .sr { color: #ed9d13 } /* Literal.String.Regex */
.highlight .s1 { color: #ed9d13 } /* Literal.String.Single */
.highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */
.highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */
.highlight .vc { color: #40ffff } /* Name.Variable.Class */
.highlight .vg { color: #40ffff } /* Name.Variable.Global */
.highlight .vi { color: #40ffff } /* Name.Variable.Instance */
.highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */</style><br />
<div class="highlight">
<pre><span class="lineno"> 1</span> <span class="sd">'''</span>
<span class="lineno"> 2</span> <span class="sd">a script for python code highlighting is expected to partial html output.</span>
<span class="lineno"> 3</span> <span class="sd">That's output content without the whole html tags.</span>
<span class="lineno"> 4</span>
<span class="lineno"> 5</span>
<span class="lineno"> 6</span> <span class="sd">ex.</span>
<span class="lineno"> 7</span> <span class="sd"><style></span>
<span class="lineno"> 8</span> <span class="sd">xxx</span>
<span class="lineno"> 9</span> <span class="sd">xxx</span>
<span class="lineno">10</span> <span class="sd">xx</span>
<span class="lineno">11</span> <span class="sd"></style></span>
<span class="lineno">12</span> <span class="sd"><table></span>
<span class="lineno">13</span> <span class="sd"><div></span>
<span class="lineno">14</span> <span class="sd">xx</span>
<span class="lineno">15</span> <span class="sd">xx</span>
<span class="lineno">16</span> <span class="sd"></div></span>
<span class="lineno">17</span> <span class="sd"></table></span>
<span class="lineno">18</span>
<span class="lineno">19</span> <span class="sd">usage: test.py inputfile outputfile</span>
<span class="lineno">20</span>
<span class="lineno">21</span> <span class="sd">'''</span>
<span class="lineno">22</span>
<span class="lineno">23</span>
<span class="lineno">24</span> <span class="kn">from</span> <span class="nn">pygments.formatters</span> <span class="kn">import</span> <span class="n">HtmlFormatter</span>
<span class="lineno">25</span> <span class="kn">from</span> <span class="nn">pygments</span> <span class="kn">import</span> <span class="n">highlight</span>
<span class="lineno">26</span> <span class="kn">from</span> <span class="nn">pygments.lexers</span> <span class="kn">import</span> <span class="o">*</span>
<span class="lineno">27</span> <span class="kn">from</span> <span class="nn">pygments.styles</span> <span class="kn">import</span> <span class="o">*</span>
<span class="lineno">28</span> <span class="kn">import</span> <span class="nn">sys</span>
<span class="lineno">29</span>
<span class="lineno">30</span> <span class="k">try</span><span class="p">:</span>
<span class="lineno">31</span> <span class="n">readfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="s">'r'</span><span class="p">)</span>
<span class="lineno">32</span> <span class="k">except</span><span class="p">:</span>
<span class="lineno">33</span> <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="lineno">34</span>
<span class="lineno">35</span> <span class="n">code</span> <span class="o">=</span> <span class="n">readfile</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="lineno">36</span> <span class="n">readfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="lineno">37</span>
<span class="lineno">38</span> <span class="nb">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">'.'</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="s">'.html'</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span>
<span class="lineno">39</span>
<span class="lineno">40</span> <span class="n">st</span> <span class="o">=</span> <span class="n">get_style_by_name</span><span class="p">(</span><span class="s">'native'</span><span class="p">)</span>
<span class="lineno">41</span> <span class="n">myformat</span> <span class="o">=</span> <span class="n">HtmlFormatter</span><span class="p">(</span><span class="n">style</span><span class="o">=</span><span class="n">st</span><span class="p">,</span> <span class="n">linenos</span><span class="o">=</span><span class="s">'inline'</span><span class="p">)</span>
<span class="lineno">42</span>
<span class="lineno">43</span>
<span class="lineno">44</span> <span class="n">content</span> <span class="o">=</span> <span class="s">'''<style></span>
<span class="lineno">45</span> <span class="s">.lineno {{</span>
<span class="lineno">46</span> <span class="s"> color: {};</span>
<span class="lineno">47</span> <span class="s"> margin-right: 5px;</span>
<span class="lineno">48</span> <span class="s">}}</span>
<span class="lineno">49</span> <span class="s">{}</style>'''</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="s">'#'</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span> <span class="n">st</span><span class="o">.</span><span class="n">background_color</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span><span class="o">+</span><span class="mi">303030</span><span class="p">),</span> <span class="n">myformat</span><span class="o">.</span><span class="n">get_style_defs</span><span class="p">(</span><span class="s">'.highlight'</span><span class="p">))</span>
<span class="lineno">50</span> <span class="c">#rule the style</span>
<span class="lineno">51</span>
<span class="lineno">52</span> <span class="n">content</span> <span class="o">+=</span> <span class="n">highlight</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">get_lexer_for_filename</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span> <span class="n">myformat</span><span class="p">)</span>
<span class="lineno">53</span> <span class="c">#add the highlighted code</span>
<span class="lineno">54</span>
<span class="lineno">55</span>
<span class="lineno">56</span> <span class="nb">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
<span class="lineno">57</span> <span class="nb">file</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre>
</div>
<br />
<br />
比起上次用原來的指令,所產生出來的html檔,這次不需要再多做一些修正,可以將完整的內容直接複製貼上,相對起來大概是有比較方便吧 :) 這篇就先到此吧~<br />
<br />
下次再繼續PO心得<br />
最後來首音樂吧<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/vjMGtb3MDWo?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-69126894504775446992014-05-04T02:08:00.002+08:002014-05-04T02:12:55.495+08:00read open source pygments 1<a href="http://pygments.org/" target="_blank">pygments</a> 簡單說是一個syntax highlighter,他支援的語言十分之多,最近會突然想閱讀他源碼,其實有部分原因是想開始練習閱讀open source,畢竟為了我另外一個project,我想,閱讀open source的能力,勢必要有所上升才行 :)<br />
<br />
另外原因是,之前有朋友問,怎麼在blogger上面hightlight code,關於這個,我之前都是用<a href="http://alexgorbatchev.com/SyntaxHighlighter/" target="_blank">這個</a> ,這是based on javascript的,所以必須要在blogger的後端,加入一些連結,而且每次要寫code時,都必須把code包覆在<pre brush:xx></pre>裡面,才會有效果出現,其實就以寫blog而言,真的有那麼一點不順就是了 :(<br />
<br />
不過朋友說他做了設定後,卻沒有效果出來,好吧,我人沒在他旁邊,所以也不知道問題出在哪,所以最近在想乾脆用用pygments將code highlight後output成html格式,再將它PO在blog上面,這樣就比較簡單了 :) 於是我的閱讀之旅就這樣開始拉,雖然僅能利用假日來讀 :(<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/TlAATpe.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/TlAATpe.png" height="360" width="640" /></a></div>
<br />
我想,首先就從package的 __init__.py來開始看,應該是沒錯的,如上圖所示,它做了一些最基本的說明 "pygments 是一個用python寫的語法高亮器 bla bla bla" 以下省略 :p<br />
<br />
這邊特別說明一下 __all__ 這個東西的效用,其實看<a href="https://docs.python.org/3.2/tutorial/modules.html?highlight=__all__" target="_blank">官網</a> 的說明,就大概知道了,當你用 from pygments import *,如果你有定義 __all__ ,那它只會import 在all裡面的那些東東而已,沒定義的話,就會看你的 __init__.py 裡面有什麼就 import 啥,比如上面有import sys,那它也會跟著import sys,好啦轉回正題~<br />
<br />
這個檔案的結構也滿簡單的,highlight這個function用到了 lex 和 format,另外當__init__.py被當成執行入口時,它會import cmdline.py,所以接下來我要去讀的package和檔案其實也滿明顯的,接下來我是選擇先閱讀cmdline.py,其實從名字一看也知道這是關於在cmd中如何進行操作的檔案,看完這檔案,應該就知道怎麼使用 pygments了,畢竟先懂得怎麼使用,然後再試著修改,我想這應該是不錯的順序吧 :p,另外也不用再去看官方docments的操作說明 :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/bcecuSV.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/bcecuSV.png" height="360" width="640" /></a></div>
<br />
看吧,果然有使用方法,不過這檔案用到挺多東西的,其中它用到了兩個standard module,<br />
<br />
1. getopt<br />
2. textwrap<br />
<br />
python果然真的是太方便了,光是內建就有一堆好用的東西,雖然這些自己寫一個也是OK拉:p<br />
<br />
看了官方說明, getopt 主要是一個 sys.argv的parser, textwrap總之,方便文字格式處理的module,詳細不多說,畢竟這不是這篇文章的重點,且官方有不少說明,或者更有興趣直接看textwrap.py和getopt.py也是可以的。<br />
<br />
看了一些code後,使用上並不難,比如想要對test.py輸出一個語法高亮格式為html的檔案,打這樣的指令就可以了<br />
<br />
pygmentize -O full,style=emacs -o test.html test.py<br />
<br />
基本上只要你有提供輸入輸出檔,pygments會自動判斷該檔案的語法,當然你也可以自己輸入參數去規定syntax就是了,另外關於-O 那邊的設置,可以找源碼中的formatters的html.py裡面有相關說明,不同的輸出格式,會有一些有不同的option,效果如下<br />
<style type="text/css">
td.linenos { background-color: #f0f0f0; padding-right: 10px; }
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
pre { line-height: 125%; }
body .hll { background-color: #ffffcc }
body .c { color: #008800; font-style: italic } /* Comment */
body .err { border: 1px solid #FF0000 } /* Error */
body .k { color: #AA22FF; font-weight: bold } /* Keyword */
body .o { color: #666666 } /* Operator */
body .cm { color: #008800; font-style: italic } /* Comment.Multiline */
body .cp { color: #008800 } /* Comment.Preproc */
body .c1 { color: #008800; font-style: italic } /* Comment.Single */
body .cs { color: #008800; font-weight: bold } /* Comment.Special */
body .gd { color: #A00000 } /* Generic.Deleted */
body .ge { font-style: italic } /* Generic.Emph */
body .gr { color: #FF0000 } /* Generic.Error */
body .gh { color: #000080; font-weight: bold } /* Generic.Heading */
body .gi { color: #00A000 } /* Generic.Inserted */
body .go { color: #888888 } /* Generic.Output */
body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
body .gs { font-weight: bold } /* Generic.Strong */
body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
body .gt { color: #0044DD } /* Generic.Traceback */
body .kc { color: #AA22FF; font-weight: bold } /* Keyword.Constant */
body .kd { color: #AA22FF; font-weight: bold } /* Keyword.Declaration */
body .kn { color: #AA22FF; font-weight: bold } /* Keyword.Namespace */
body .kp { color: #AA22FF } /* Keyword.Pseudo */
body .kr { color: #AA22FF; font-weight: bold } /* Keyword.Reserved */
body .kt { color: #00BB00; font-weight: bold } /* Keyword.Type */
body .m { color: #666666 } /* Literal.Number */
body .s { color: #BB4444 } /* Literal.String */
body .na { color: #BB4444 } /* Name.Attribute */
body .nb { color: #AA22FF } /* Name.Builtin */
body .nc { color: #0000FF } /* Name.Class */
body .no { color: #880000 } /* Name.Constant */
body .nd { color: #AA22FF } /* Name.Decorator */
body .ni { color: #999999; font-weight: bold } /* Name.Entity */
body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
body .nf { color: #00A000 } /* Name.Function */
body .nl { color: #A0A000 } /* Name.Label */
body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
body .nt { color: #008000; font-weight: bold } /* Name.Tag */
body .nv { color: #B8860B } /* Name.Variable */
body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
body .w { color: #bbbbbb } /* Text.Whitespace */
body .mf { color: #666666 } /* Literal.Number.Float */
body .mh { color: #666666 } /* Literal.Number.Hex */
body .mi { color: #666666 } /* Literal.Number.Integer */
body .mo { color: #666666 } /* Literal.Number.Oct */
body .sb { color: #BB4444 } /* Literal.String.Backtick */
body .sc { color: #BB4444 } /* Literal.String.Char */
body .sd { color: #BB4444; font-style: italic } /* Literal.String.Doc */
body .s2 { color: #BB4444 } /* Literal.String.Double */
body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
body .sh { color: #BB4444 } /* Literal.String.Heredoc */
body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
body .sx { color: #008000 } /* Literal.String.Other */
body .sr { color: #BB6688 } /* Literal.String.Regex */
body .s1 { color: #BB4444 } /* Literal.String.Single */
body .ss { color: #B8860B } /* Literal.String.Symbol */
body .bp { color: #AA22FF } /* Name.Builtin.Pseudo */
body .vc { color: #B8860B } /* Name.Variable.Class */
body .vg { color: #B8860B } /* Name.Variable.Global */
body .vi { color: #B8860B } /* Name.Variable.Instance */
body .il { color: #666666 } /* Literal.Number.Integer.Long */
</style><br />
<table class="highlighttable"><tbody>
<tr><td class="linenos"><div class="linenodiv">
<pre>1
2
3
4
5</pre>
</div>
</td><td class="code"><div class="highlight">
<pre><span class="n">a</span> <span class="o">=</span> <span class="p">[</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="p">]</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">a</span><span class="p">[::</span><span class="mi">2</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</pre>
</div>
</td></tr>
</tbody></table>
<br />
<br />
我是將輸出的html內容擷取並貼上來,而且還要做一些小處理,只是如果每次都要這樣其實也滿累的 :( 目前就先到這邊吧,下次在PO繼續閱讀的心得,並且想個解決辦法 :p<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-50533885554176376912014-04-27T12:56:00.004+08:002014-04-27T13:04:58.601+08:00pygame framefork 持續進行中這個project的進度實在沒辦法進行的很快,畢竟現在我只有每周末可以回家寫,但是每次回到家都想要休息,另外一部份的原因實在是因為我對於設計GUI框架,沒有太多的概念,所以目前也只是按照我個人的想法來包裝,因此隨時都會有改動,最近感覺每次回到家,都要重新看code回想一下自己當初的想法是啥 :) 這樣感覺有點麻煩,所以這篇主要是來記錄一下目前的想法和進度的 :)<br />
<br />
目前寫到這樣的結構,其實我已經開始有點混亂了,目前我是寫在 imageCropper裡面,並沒有將這個framework分層,因為目前只是測驗性階段,加上python是動態語言,所以沒有將code分層是不會影響到效率的。<br />
<br />
我寫了這個測試,發現我的包裝少了什麼東西,就會回去把包裝修改一下,目前我有很多疑慮,像是<br />
<br />
1.寫個物件是處理座標系統的,因為發現了絕對座標和相對座標的問題。<br />
2.寫個物件是來計算每個widget位置的安排,像是考慮到margin padding等問題。<br />
3.widget是不是該包含update這樣的函式,可是如果在每次的gameloop都call update,這樣會不會有效率上的問題,這樣一直改來改去,想來想去,讓我有點不知道所措。<br />
4.需不需要把widget的屬性,另外用json的方式來進行讀取和設置 <br />
<br />
實在是有太多太多地方需要思考,現階段可能就以先增加其他widget再說吧,像是listbox、scrollbar等,另外我也在想寫遊戲裡的GUI,有必要寫到那麼麻煩嗎? 我一直在思考這些事情,所以project進度也一直沒很大的進展,所以我在想要不要稍微停下來,讀一下別人的open source來擷取一些想法,只是我查了一下pygame gui 的相關open source,大致上只有<a href="http://code.google.com/p/pgu/" target="_blank">pgu</a> 感覺比較好一點,可是我又覺得它似乎有點太雜了,再加上似乎沒有在維護了,到最後我找了一個based on pyglet 的game gui,就是這個<a href="https://code.google.com/p/simplui/" target="_blank">simplui</a> ,他也是沒在維護了 :( 只是相對我覺得他比較lightweight,所以我決定從這個下手,因為可能比較好讀 :) 不過我沒什麼閱讀open source project的經驗,所以可能會讀比較久一點,才會有相關的心得就是了,而且萬一他用到比較有技巧的東西,那可能就要更久了 :)<br />
<br />
目前大概要一段時間才會PO 跟 framework有關的文章了 :) <br />
<br />
<br />
<br />
<br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-64930364921020827792014-04-20T12:50:00.003+08:002014-04-20T12:52:28.440+08:00c++ static_cast, dynamic_cast, const_cast, reinterpret_cast最近又稍微碰到這類的問題,想說來複習一下也不錯,這邊有不錯的<a href="http://www.cplusplus.com/doc/tutorial/typecasting/" target="_blank">解說</a> ,可以參考一下,這篇主要是記錄一下這四種type conversion的方法,基本上一扯到conversion,想當然爾,就會關係到C++裡面有的一個很需要注意的東西,那就是implicit conversion和explicit conversion,所以就先來講這兩個東西,就如同字面上的意思一樣,explicit是明顯的意思,因此explicit conversion<br />
大家都應該很熟悉,就像是...<br />
<br />
<pre class="brush:cpp">int i(5.2);
</pre>
<br />
這樣藉由 ( ) 這樣的語法轉換型態,就是明顯的轉換,那麼implicit是隱含的,所以什麼是隱含的轉換呢? 其實大家應該都常常寫到,只是不自覺,所以會很恐怖 :) 像是..<br />
<br />
<pre class="brush:cpp">double d = 5.2;
int i = d; //相當於 int i = int(d) 或 (int)d
</pre>
<br />
在你initialize的同時,C++會自動幫你轉換型態 :)<br />
或許這樣一看你會覺得不知道恐怖在哪是吧 :p<br />
的確今天的型態如果只是primitive,那你大概是不用怎麼怕,那如果是自己定義的呢??<br />
舉個例子<br />
<br />
<pre class="brush:cpp">#include <iostream>
#include <typeinfo>
using namespace std;
class A
{
public:
A(int a=0)
:mx(a)
{
}
private:
int mx;
};
void test(A obj)
{
cout<<typeid(obj).name()<<endl;
}
int main()
{
test(2);
return 0;
}
</pre>
<br />
<br />
你將會看到,嘿嘿成功執行,你傳入的參數2,其實已經成為classA的copy constructor的參數了,你也可以看到印出來的type的確也是class A,上面只是跟你說一下,型態轉換在C++上面是很恐怖的,常常在很多你想不到的地方,他就發生了,就像這樣,如果哪個一個不小心,就會造成或許不是你預期的結果 :)<br />
<br />
哼哼尤其是在stl中,如果你想用到user defined class且有包含指標型態的話,通常最好要定義一下你的copy constructor,因為大概會被call到。關於這邊改天有心情的話,就來用個例子好啦 :)<br />
<br />
該來講一下四種cast的方法,在我上面給的那個連結基本上已經不錯的解說了,所以這邊就簡單總結一下而已<br />
<br />
static_cast<br />
可以call implict conversoin和explicit conversion<br />
另外還有upcasting和downcasting<br />
只是他不像dynamic_cast會做動態的檢查<br />
<br />
dynamic_cast<br />
負責掌控 upcasting 和 downcasting<br />
<br />
<br />
const_cast<br />
它可以強制加上或拿掉一個變數的const特性,雖然我不知道這樣的實用在哪就是了 :-S<br />
<br />
reinterpret_cast<br />
一個很恐怖的東西,它可以強制轉換型態,任意的轉換,所以不要亂用<br />
<br />
另外關於這些cast想要更詳細的,可以看看 <a href="http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used" target="_blank">這篇</a> :) <br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-24161963941944082252014-04-12T19:44:00.001+08:002014-04-12T19:44:24.151+08:00試著寫一個小小的framework for pygame首先就來說說,最近逛著一些論壇,發現越來越多framework跑出來,尤其是關於javascript的,看著那些強大的framework,總覺得自己的程式實力,仍需要很大的努力 :(<br />
<br />
有時候看著別人用framework寫出很多不錯的應用程式,我心裡常這麼想著我是否也該要試著玩玩看,像我用python寫程式,python其中的宗旨是do not repeat yourself,這想法的確沒錯,已開發產品來講確實是這樣,因為這樣開發速度才會快,畢竟從0~1是很辛苦的,也很耗時,所以我也碰過一些python的library,像是pygame、pyglet、pillow、pyqt...等,但是問我對他們有沒有完全熟悉,我只能說大概沒有吧,我並沒有把裡面所有個函式都碰過,甚至也沒有將他們記起來,我都是想到需要什麼功能,就去官方文件查查有沒有相關的功能,所以我很常邊查文件邊寫程式。<br />
<br />
其實這樣讓我有點擔心,因為要是沒有網路這樣一來我就不是變的不會寫程式了嗎?? 因為沒有文件可以查...可是對於python這語言大概是不太用擔心,因為library本身就幾乎是源代碼,所以可以直接去看源碼,除非他將一些核心用成dll等藏起來,但是對於C++呢? 除非library本身自帶文件那就不用怕了,只看header file你也不會懂那是啥,除非它有寫註解 :P。<br />
<br />
在此同時,大量framework充斥的現在,讓我開始擔心起一件事,那就是我們這些後人,或許懂得快速利用哪棵樹來乘涼,但是懂得種樹嗎? 現在已經越來越少人種樹了,因為耗時、耗力,甚至是因為你自己種的樹不見的比其他人好 :(<br />
<br />
就以小弟學了演算法來講,光是排序的問題好了,別人的library,可是有顧慮到對於不同的compiler和不同的作業系統甚至是記憶體的情況也考量進去,並分別給予不同的優化,這些種種,不是光隨便看幾天的書就可以寫出來的東西,自己或許真的可以寫出來,但是要花多久時間呢? 但是相對的,用別人的library呢? 花個幾秒的時間,你就可以達到相同效果,的確是何樂而不為呢 :) 這也是為啥懂得用別人的library,也是一件很重要的事 :)<br />
<br />
話雖如此我還是覺得身為一個programmer,必須要懂得種樹,要不然programmer還有什麼價值? 只是看看文件,call一下function,說難聽點誰不會啊? 所以我還是選擇一個比較不好走的路,就是每個東西,都玩玩看,不管是底層,還是高階的framework,也因此我決定先來個小小的嘗試,那就是為pygame這個library寫個小小的framework,由於pygame本身並沒有GUI,所以我決定來練練如何自己包裝出一個GUI framework,雖然這並不是多底層的技術,但是我覺得這可以訓練一下,如何讓自己寫出一個大程式且附有重用性,以前我寫過最多行的專案了不起也才快2000行,我想要讓自己有更大的進步,目前我心中也沒有把整個程式結構想出來,一來是因為我查了一下網路,並沒有發現關於設計GUI的程式結構概念,或許有的? 如果有的話,希望好心人可以告訴我一下(留個言),目前的結構是這樣的,我先實現幾個widget,label、button和一個可show image的widget,如下圖,當然我也有包裝了一下,事件處理迴圈,相關code可以看<a href="https://github.com/sillygod/my-travel-in-learning-python/tree/master/imageCropper" target="_blank">這邊</a> <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/lmPRiqR.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/lmPRiqR.png" height="308" width="400" /></a></div>
<br />
只是目前我覺得我寫的這些code,可能以後會有很大的改變,畢竟目前我是依照直覺去包裝,往後如果有了整體的想法,就會另外PO一篇來記錄一下 :)sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-85967148803817853692014-03-22T21:40:00.003+08:002014-03-22T21:41:08.667+08:00js function invocation and function context目前學習javascript,其中有個好玩的地方同時我也覺得頗重要的地方,今天就特別來記錄一下,那就是如標題所述,function invocation 和 function context,在js當中呢,每個函式都會有兩個隱性的parameter,分別是 this 和 arguments。<br />
<br />
arguments是一個很像Array的物件但是注意! 它不是Array,如同名字表是那樣,它代表的是實際傳入的參數。關於this在我看來就是指function context,根據不同的function invocation就會決定不同的function context,那麼this到底是何物呢? this它指向一個物件,並且這個物件是有關於這個函式是怎麼被invoke的,聽起來還是有點模糊對吧 :) 先繼續往下看便知曉。<br />
<br />
關於function invocation基本上有四種<br />
<br />
1. invocation as a function<br />
<pre class="brush: js">function ja(){
console.log(this);
}
var vja = function(){
console.log(this);
}
</pre>
<br />
你執行上面code,將會看到function context是window(global context),<br />
<br />
2. invocation as a method<br />
看到名字就知道,這個function是屬於一個物件,因此我們創建一個物件<br />
給予一個property reference到一個function<br />
<pre class="brush: js">function globalSay(){console.log(this);};
var obj = {};
obj.say = globalSay;
obj.say();
</pre>
<br />
執行上面code後,將會看到function context是obj這個物件,因此光從這邊就可以看出this是由這個function是怎麼被invoke所決定的<br />
<br />
3. invocation as a constructor<br />
簡言之就是藉由new這個keyword所產生的結果<br />
<pre class="brush: js">function test(){
this.say = function(){
console.log(this);
}
}
var obj1 = new test();
var obj2 = new test();
obj1.say();
obj2.say();
</pre>
<br />
new這個keyword,它會產生一個新物件,並將這個物件的function context就是自己<br />
<br />
4. invocation with aplly and call method<br />
這個是我認為javascript很特別的地方這個方法可以,讓你隨意的指定function context<br />
舉個例子來看看<br />
<pre class="brush: js">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);
</pre>
如上obj1和obj2將會被增加value這個屬性。<br />
call和apply的差別是在<br />
xxx.call(this, x,x,x,x);<br />
xxx.apply(this, [x,x,x,x]); <br />
<br />
我覺得這功能的確滿方便的,javascript的this就是這麼....該說好用嗎?還是恐怖?<br />
因為用不好的話,似乎會造成很多問題的感覺。<br />
<br />
如果以前是學習C++來的人,會覺得js的this,會覺得非常與眾不同吧 :)<br />
動態語言就是如此,有著靜態語言不同的風格,隨著電腦速度越來越快,我不知不覺中越來越喜歡用動態語言來寫程式了,像是python,反而C++越來越少碰了 :( 不知道要不要找時間回去熟悉C++ :(<br />
<br />
回到正題,我覺得隨著mobile熱烈的發展,javascript已經越來越重要了,畢竟越來越多人已經支援js所規定出的標準了,已經是個合適的時機來學習JS了,而且可以另外學習function programming的style,會覺得別了一番滋味~<br />
<br />
<br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-51441810151721851872014-03-15T22:52:00.002+08:002014-03-15T22:52:47.797+08:00國軍online已過六個月時間總是不知不覺流逝,這半年來的當兵生活,我想是有讓我眼睛及身體獲得適當的休養,只是程式能力就可能稍稍退步了,總覺得每次回到家,都得重新熟悉寫程式的手感和閱讀英文文章的感覺,這種FU真不好受,不過換個角度想想,要是我可以訓練到快速熟悉,那似乎也是一個不錯的能力呢(笑<br />
<br />
好啦,這次文章也只是一個純粹抒發,沒目的性的亂寫而已 : ) 在航校的日子,其實也已經算是很熟悉了,每次晚上我都已經無聊到不知道做什麼了,幾乎都是在發呆,或是看看書,我一直都很期待可以帶筆電阿啊!! 我不懂裡面的學生都可以用了,為啥我們不能用? 替代役在航校總是一個特別的存在,在裡面被勤務連鄙視,但是卻又總在長官身邊有說有笑,平常作息卻又得像學生那樣,但卻不像學生那樣可以帶筆電 :-S 其實待了這麼久,我一直不知道替代役的地位到底算高還算低 :)<br />
<br />
話雖如此,但是平常我們還是得看長官臉色,其實我一直滿討厭裡面有些長官,真的很愛賣弄自己的官階,而且總感覺他們看不起替代役,但是需要做事的時候,卻又一直用我們....感覺我們比勤務連還好用阿,一想到這些我恨不得明天就是我退伍的日子:(<br />
<br />
不過呢,其實我還滿喜歡自己待的單位,因為這邊幾乎沒有我所說的那些長官臭脾氣,只是事情多了點雜了點,會有點累,但是我覺得這樣也好,這樣一來我晚上才會好睡點,反正晚上根本沒有任何娛樂,不如乖乖洗洗睡。在這邊其實我受到學姊滿多的照顧,很慶幸遇到她,這單位裡面也只有她跟我年齡最近 :) 剛開始我是覺得可能這樣彼此的代溝比較少會比較好聊天,但是其實我是一個不怎麼會講話的人,也不太懂開話題,而且腦子裝的都是跟程式有關的東西,所以其實也沒特別和她一直聊天,只是遇到問題就一直煩她:) 希望不會對她造成太多困擾。所以,我一直在想我是不是該訓練怎麼和人交際,可是我又很討厭去花力氣想話題,因為感覺有點假,我個人是認為遇到想法契合的人,話題應該就會源源不絕,想到什麼就說什麼,我比較喜歡自然的感覺 :) sigh,有時候我總覺得自己把這社會的一切想得太過美好,或許我該試著接受事實吧...<br />
<br />
在航校,我看到了人生百態,知道人可以有如此多面,上一秒對某人開口迎笑,下一秒變臉走人,其實這也是我覺得我在航校越待越累的原因,雖然我都是旁觀者的身分並非當局者,但是看到這些,心情總是無法好起來,不要說軍官了,其實我感覺替代役同伴們多少也存在這樣的人,而且好像還會在背後捅你一刀,說你壞話,尤其是航校又分校部、學部,以國家概念來講,就像中心和邊疆,學校本身就充滿不公,俗話說上樑不正下樑歪,所以...咳咳,話就不說的太明了,也因此我總是非常期待可以快點到放假時間,因為這樣充滿假面的地方,讓我非常不習慣,我不知道當前跟我講話的人是真心的,還是假的,我只能確定當彼此有利益關係時,雙方當下總會採取互利共生的合作方式。有些人總說看眼睛就知道他是說真話還假話,但是我覺得這完全不準,眼睛會飄移,不代表是說謊,就我感覺眼睛會飄移,有很多原因:<br />
1.沒信心<br />
2.不確定(可能再回憶<br />
3.不好意思盯著人<br />
有諸多原因。<br />
<br />
總之在航校看到許多不公平的地方,自己卻又無能為力改善,只能乖乖看著事情發生,我有點百感交集,有時候我很羨慕天上的鳥兒,那樣自由自在遨翔,看著他們的時候,總覺得身邊的迷霧消失無影無蹤,讓我暫時喘了一口氣 :) <br />
<br />
這篇好像寫的雜亂無序 :)<br />
不過到讓我抒發了不少心情,其實同時間我也是有再試著努力學習的 :)<br />
目前正在試著熟悉javascript中,或許改天就可以看到我發的心得了<br />
<br />
再來一首音樂~<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/m9u63Zij1jM?feature=player_embedded' frameborder='0'></iframe></div>
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-56195320201636363462014-02-15T21:42:00.002+08:002014-02-16T13:31:40.787+08:00create a blog on github (in process今天逛程式論壇偶然看到一個東西叫做 <a href="http://pages.github.com/" target="_blank">github page </a>似乎是可以把你的網站github上面託管,官網上面有簡短的幾個步驟,基本上照著做,就會看到他所跟你說的效果,只是剛開始我看到的時候,心裡遲疑了一下,他好像沒有說到關於後端的事情阿! blog雖然只是一個簡單的記錄用途,像是日記一般,但是他最少也有提供留言的功能,我想這應該需要用到後端的幫助吧? 所以我很好奇這個有辦法做出有留言功能的blog嗎? 可是當我在github page上,把滾輪滾到頁底,卻發現 Blogging with Jekyll 這樣的字眼,讓我有點好奇於是就來試著用用看了,而且我看似乎有不少人的部落格也是用github page來託管,所以我想如果我用好後大概就是用它了,這邊的blogger就不會再更新了 :P<br />
<br />
Jekyll 看官網說明它是由 <a href="https://www.ruby-lang.org/zh_tw/" target="_blank">ruby</a> 所寫的,這同時也代表你必須要擁有ruby才能用Jekyll,由於我目前沒興趣碰ruby,題外話,個人覺得ruby似乎有模仿python的味道,不過兩者所秉持的精神卻是大大不同就是了,有興趣的人可以去學學ruby:) 回到正題,由於上述原因,所以我就試著找尋看看有沒有類似的library是python所寫的,果然不出所料是有的,目前我發現兩個可能不錯的 <a href="http://ringce.com/hyde" target="_blank">hyde</a> 和 <a href="https://github.com/getpelican/pelican" target="_blank">pelican</a> 而且看了這兩個網站,他們也的確說自己是 static site generator,所以我更加好奇留言功能是怎麼用的 :P 雖然有的是方法,比如一有人留言就更改網頁內容這樣,只是要做到這樣的話,github網站就必須提供API讓我們可以控制這樣的行為...不管是怎樣,總之我很好奇 :)<br />
<br />
我挑的是pelican,不過如果你的平台跟我一樣是windows加上python的version是3以上的話,在安裝上可能就有點麻煩了 :P 因為他要藉助setuptools來安裝 :( 所以呢! 首先到 <a href="https://pypi.python.org/pypi/setuptools#id1" target="_blank">這個網站</a> 下載 ez_setup.py,別懷疑就是run它,安裝完後就可以安裝pelican,他會自動幫你安裝它所依靠的其它library,做完這些後,你會發現還是有問題!! 當你執行pelican-quickstart會跑出錯誤訊息 syntax error ,其實就是python2和3的問題,所以要用python3內附的py2to3去轉換後就OK了 :) 然後另外問題就是pelican文件上也有說明,如果你想要用markdown寫網頁的話,那你還要另外安裝python的package markdown就是了。<br />
<br />
目前我<a href="http://sillygod.github.io/blog/" target="_blank">做到如此</a>而已,畢竟還要讀一下pelican的document才知道後續的操作~ 這篇就先記錄在windows上安裝的流程這樣,至於怎麼把網站用到上面我想等我了解一些內部細節後,在一起記錄。<br />
<br />
其實如果是linux的環境應該是無痛安裝 :P這並不是代表windows suck,這只能說源自於linux的東西,本來就對linux友善,想要在不同平台使用就要靠自己去做修改 :) 幸好不用到改源碼的境界就該高興了 :P<br />
<br />
最後再來個音樂吧 :) <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/PYPkP0y_FC0/0.jpg" height="266" width="320"><param name="movie" value="https://youtube.googleapis.com/v/PYPkP0y_FC0&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/PYPkP0y_FC0&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-83726811669890199672014-02-05T12:42:00.003+08:002014-02-05T12:45:50.417+08:00pyqt designer 初體驗放了一個年假,總算是有點心情來搞跟程式有關的東西了 ˙ˇ˙ 這次呢~我是嘗試著把之前做的<a href="https://github.com/sillygod/my-travel-in-learning-python/tree/master/imageDisplayer" target="_blank">imageDisplayer</a>改成dark theme,功能還是一樣並沒有增加就是了:P 我只能說QT,真是讓人越用越愛阿,真的是一個很強大的library,他支援很強大的客製widget的功能,從官方網站的<a href="http://qt-project.org/doc/qt-4.8/stylesheet-examples.html#customizing-qscrollbar" target="_blank">文件說明</a>即可體會到這點,想到以前我在嘗試著用windows api去寫一個小小的GUI程式就搞了很久,要查很多api文件,而且那時候我還不知道怎樣去custom widget呢,舉例來說,把scroll bar改成很漂亮這樣,而不是一個很普通的樣子,從我給的連結應該就可以看出我要說的是什麼意思了。<br />
<br />
另外很特別的一點,QT他是使用css來改變GUI widget的外貌的,這點還真的是非常方便,從連結可以看到,你可以把scrollbar的上下箭頭改成其他圖案,或者是讓其不要顯示,上下箭頭的部分是這樣的 QScrollBar::up-arrow, QScrollBar::down-arrow 你只要設定他的background:none就會讓箭頭消失了,QScrollBar::handle則是中間那個長方形,你當然也是可以隨意改變他的樣子,剩下的我想官方說明已經非常清楚就不一一拿出來說嘴。<br />
<br />
不過目前我也是第一次用qt designer來做介面,另外我在實作時發現他好像有BUG,照理說這種WYSWYG,成品做出來後應該是不會差太多才對,不過很神奇的是,我用了Gridlayout去安排位置,結果我的button和lineEdit的位置都跑掉了...一整個滿神奇的,我為了搞這個搞了很久一再重複拉來拉去(感覺不太好拉阿sigh),然後再把ui檔compile到py檔,最後再看成品的UI位置,結果怎麼調都沒辦法,就暫時放下來了:P 因為目的也算是達到了,只是想要體驗custom widget的功能而已。<br />
<br />
QT實在還有太多地方可以去鑽研,只是目前還有八個月役期的我,最多也只能利用放假來寫code了~<br />
<br />
不知道是否各位寫code時,也會利用音樂增加寫code的動力 :P<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/KYBsYkEeK4A?feature=player_embedded' frameborder='0'></iframe> </div>
<br />
PS:太久沒碰,總是需要動力來幫助的sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-82824625448772725692014-01-31T21:37:00.002+08:002014-01-31T21:37:43.523+08:00介紹一本不錯的javascript的書目前仍然處於軍中,說實話回到家沒多少心情寫code,實在慚愧,於是乎小弟我轉換個用功方法,就是看看書囉~ 我目前在看的書是 <a href="http://eloquentjavascript.net/contents.html" target="_blank">eloquent javascript</a> ,看了幾章,覺得他講解的十分清楚,而且他的定位是把你當成一個程式新手 :P<br />
<br />
前幾章我是看的十分之快~ 畢竟都有一些基礎了.. 但是我不知道有沒有漏看什麼重點 :)<br />
目前我閱讀英文書的速度並不快,要是一加快速度老是會有地方,不是那麼懂,真不知道什麼時候可以練到跟看中文書一樣的速度。<br />
<br />
好啦 :) 回到正題,說一下這本書的教學安排<br />
基本上<br />
前四章,是把JS裡面的基本資料型態介紹給你知道。<br />
第五章,跟你說說例外處理。<br />
第六章,就是最近夯起來的function programming,裡面介紹一些基本概念這樣。<br />
第七章,這個如果你真的是一個新手(剛碰程式語言),這章可以跳過,因為這裡面有關於path-finding(演算法的東西) ,沒學過的會一個頭兩個大 :P<br />
第八章,則是講在JAVASCRIPT怎麼寫出物件導向的方法,多半是用到prototype拉 :P<br />
第九章,是講模組的方面,只是關於JS,他並不像其他語言有模組系統,不過這邊我也沒過多摸索,就不講太多了 :P<br />
第十章,regular expression,很值得練的東東,建議可以看熟一點<br />
第十一章,講一些關於http和web比較瑣碎的東西,想是protocol阿,webpage的post和get等<br />
再來後面還沒看~<br />
<br />
基本上我是不會寫每章的心得,因為這本書我是把它當作休閒看看,沒有打算精讀 :P 但是這樣略讀後,我是真心推薦新手可以看這本書,會學到很多東西的~~<br />
<br />
最後小小的期許 :) 希望過些日子可以取回寫code的心,即使在軍中心有多累,周末回到家仍然會有心情寫code :psillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-8433386222133362352014-01-02T23:29:00.000+08:002014-01-02T23:29:31.999+08:00python wsgi 初體驗~最近終於稍微將上進的心,慢慢抓回來了 : ) 所以特別來寫一篇,雖然質量可能沒說很好,但總也是一個進步,好了,回到正題,其實是最近開始對python的<a href="https://www.djangoproject.com/" target="_blank">django</a> 感到有點興趣 :P<br />
<br />
我照著官方的教學,跟著一步一步慢慢做,在其中赫然發現,有個東西叫做wsgi,那時我突然覺得奇怪,怎麼這東西似曾相似,於是我果斷就搬出我最會的技能( google it ),哈哈,原來python標準模組裡就有這種東西,難怪會有熟悉的感覺,看過wiki介紹後,才知道這是python所定出的一個interface,wsgi千萬不要硬記阿! 看過他全名後就很容易記起來 web server gateway interface,簡言之,它只是一種application和server間溝通的介面這樣,想要看更加詳細的解說,可以看看這個 <a href="http://webpython.codepoint.net/wsgi_tutorial" target="_blank">網站</a>,說得滿詳細的。<br />
<br />
<br />
跟往常一樣就先來個測試範例吧<br />
<br />
<pre class="brush: py">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()
</pre>
<br />
其實關於我給的那個網站,就有對於參數詳細的說明,或者去官方網站看也會得到解釋的,所以在這我就不會特別說明了 :P (其實是有點懶XD<br />
<br />
start_response就是將http的status和header傳給server,想當然爾,傳完了initial資訊,就要接著傳內容,這邊有個特別的地方那就是回傳的值(內容)! 似乎必須要是iterable的值,以我的python版本,如果只是單純回傳bytes物件會發生錯誤,因此我才會用list。再來就是python強大又好用的地方了,他很貼心,有做個小型Server可以讓我們測試結果,而不用再去安裝其他server,還要去做相關設定....。開啟localhost:8000後,就會跳出一個視窗上面寫著hello world囉~ 顯而易見的答案對吧。<br />
<br />
<br />另外關於ret你是可以改成讀取index.html檔案,然後encode後再回傳,這樣做的話,就更有server的FU吧 :) 我想django大概也是利用類似的做法,不過django也說了他是一個架構,而非server,所以自附的server僅供測試方便,要發佈網站時,還是用專業的server比較好。<br />
<br />sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-35943477729388735732013-12-07T13:35:00.001+08:002013-12-07T13:36:12.688+08:00在航技一個月的心得基本上這篇大概又是一篇抒發心情的文章了吧 :) 原本我以為我已經習慣了這邊的生活了,和我所在的單位裡面的長官,有慢慢熟悉了,每天的時間都過得非常快,因為每天都有事情做,時間自然流逝的快,但是! 就在最近發生了一件事,讓我和我同學十分不爽。<br />
<br />
事情是這樣的,基本上我們吃完晚餐後,由於遵守"節能省碳定律",路燈是幾乎沒再開的,很好這代表什麼事呢? 我走在路上基本上看到人都是一團黑影,我和同學就邊走邊聊天的回到宿舍,你一定在想有什麼事情發生嗎? 沒錯,我和那位同學就和往常一樣平安的走回宿舍,基本上是沒什麼事情發生的,但是在晚點名的時候,事情開始了,我們的管理幹部跟我和那位同學說,我們被投訴沒禮貌! 記你們點有沒有問題? 我們倆整個感到意外,但是嘴巴是自然反應的說沒問題,心裡盡是想的,我平常遠遠看到長官都大聲叫長官好,看到車子和機車經過也是停下來,並敬禮,連看到替代役學長都有問好,我是哪裡沒禮貌了? 哪位神人可以出來跟我們解釋一下,讓我心服口服?? 結果他說我晚上走回去沒跟長官問好,我整個冏掉,我他X的,根本連一個長官都沒看到,是要跟鬼問好? 結果他說他晚上和長官走在一起,有看到我們,結果我們沒問好,聽到這邊我更冏了,我連你在那條路上都不知道了,更何況是長官...但是那位管幹仍然說,不管~ 你們就是被投訴了,所以要記點,話說這邊,我整個就不想理他了,連這樣都可以記我點,那以後的生活要怎麼過? 改天夜黑風高,我他X的看到一堆人影,是不是該每個都問長官好,看到十個就喊十次長官好? 到底是哪個處室的神經病長官,如此無聊投訴我們? 還是說其實壓根沒長官,是該位管幹想要盯我們而已?<br />
<br />
發生這樣的事情後,讓我更沒心情待在那種鬼地方,因為我感到更絕望了,我絕望的不是因為我還要待10個月,我絕望的是,國家花錢養這些軍人,就是讓他們無聊電電和惡整替代役?這根本是浪費公帑,想說之前做事沒效率就算了,因為做事沒效率其實不只國軍,所以我可以理解,沒公正公義就算了,因為我在軍中,是講求階級的地方,所以我可以忍氣吞聲,讓你們感受到高高居上的爽感,但是今天無聊這樣投訴我們,就讓我覺得超不爽! 軍人可以無聊到這種程度,你以為你是皇帝喔,每個人是不是都要餵你吃飯,幫你擦鞋,一聽到你的聲音,就要馬上立正站好,在以前這樣的皇帝根本是廢渣,馬上就要滅國了。<br />
<br />
看到這樣的軍中,整個就是古代皇朝的縮影,我現在心裡想的沒有什麼,就是想要趕快離開這鬼地方,因為我不想自己被那些人同化,雖然我對自己忍耐力非常有信心,但是潛移默化這種力量是很恐怖的,即使你再怎樣不小心,或多或少都是會被感染的,我很怕自己會慢慢被他們同化...我不想成為自己討厭的那種人。<br />
<br />
這篇大概是我最後一篇軍中抒發心情的文章了吧,因為我決定了,我這部落格本來就不是拿來做這種事的,而且要記錄我的程式之旅,所以接下來要寫個跟programming有關的文章了,但是大概要等我下次回到家的時候了 :P sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-36350516760712939962013-11-10T15:47:00.001+08:002013-11-10T15:47:23.618+08:00下單位過一個禮拜後我在的單位是岡山航空技術學院某單位,這一個禮拜下來,其實感覺滿累的,我想一方面是對於新環境的不適應,另一個原因是畢竟我是替代役身分,多多少少會被長官凹去做事,不過我也早就有心理準備就是了,不過並非大部分長官會凹我就是了,只是整個單位基本上有一個長官會凹你,感覺就過得很累了,目前為止,我記得兩個會凹我,話雖如此,裡面也是有好長官,之前做事做到很累的時候,就有長官來關心我,雖然只是一個簡單的說說話,但是我心裡卻是得到很大的舒坦。<br />
<br />
另外目前我很難適應的是,我在的單位裡面全都長官,這代表什麼,萬一我說錯話,做錯事,不小心碰觸到他們的地雷,我恐怕就吃不完兜著走了,到目前為止,我都不太敢主動開口說話.....,畢竟我是裡面最小的,不知道踩到地雷會發生什麼可怕的事= =,其他同梯的朋友至少都有兩個替代役,他們可以互相扶持,老實說我有點覺得孤單,我只有吃飯,和下班的時候,可以和大家敞開心胸來聊天,我想這或許是給我一個訓練吧,不管如何,我會想辦法找到自己生存的空間,要不然這樣的生活持續一年,根本只有可怕。<br />
<br />
講到軍中做事,真的有很多方面都十分沒有效率! 甚至該說讓我感到無言....光是講收發公文好了,有時候只是為了一個簡單的蓋章,可以讓我等上一兩個小時....不知道該說什麼才好,個人是覺得有許多比較瑣碎的公文,可以改成電子方式,也就是用電腦的方式,這樣不僅可以節省紙張,也節省人力,可以把人力放在其他需要的地方,我相信這絕對很多人都有同樣的想法吧? 我光是進去的第一天就萌生這樣的想法了,我只能說軍中就是這樣死板板的地方,而且是講求階級,沒有公不公平,你資歷小,官階小,就是得像螞蟻一樣,默默做自己,一切就是聽長官的話,目前我也只能繼續忍耐下去,然後周末回家好好放鬆,就像現在的我一樣,在電腦前面打文章,好好的將五天累積的無奈、怒氣,發洩一下 :)。<br />
<br />
好啦~ 放假的時光總是短暫,過沒多久我又要回到那與世隔絕的地方囉~ <br />
<br />
<br />
sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-47085508765013637482013-10-20T13:38:00.002+08:002013-10-20T13:38:46.345+08:00放假兩天,準備回去撥交了 :(無奈無奈,明天撥交後就要去台北專訓了,雖然國防役的專訓聽說是不怎麼累,但是對我來說那不是重點,重點是以後下單位,根本就過著跟國軍一樣的生活,而且令我更怕的是會被欺負,畢竟我們跟國軍有所不同,在一個團體中如果和別人有特別不同之處,往往會被針對....,不用我多說,這大家應該都有所認同才是。<br />
<br />
我真的滿懷疑,政府到底有沒有腦袋,竟然故意讓國防部開那麼多缺額來消耗替代役,這根本是以替代役之名行國軍之實,沒能力消耗那麼多替代役,當初就不要信口開河讓每人都有獎。老實說心情真的不是很好,當初等那麼久的入伍令(原本應該會更早進去的,被其他人搞到延後),最後選到國防役? 雙重打擊,讓我對現在的政府感覺不到任何一點信心,甚至是這社會充滿著不公,sigh,我真的覺得我該找個時間,讓自己好好冷靜一下,其實我回到家後,根本沒心情學習程式和寫程式了,一來是想要讓自己好好冷靜,二是回家頂多兩天,根本沒啥時間寫程式,頂多就是看看一些程式論壇這樣而已,不知道這樣程式會不會退步....。<br />
<br />
話說,我在網路上查了許多資料跟國防部公共行政役有關的,大部份都是說忍著吧,忍一年就過去了....雖然也有人說他的單為挺涼的,但是依照歸納法則,看來應該是屎缺無誤,我看著那些文章,其實內心早已麻木,甚至到已不知眼見為何物的境界,因為我從以前到現在我運氣就沒很好,我早該想到,政府會做這種鬼事情,我這梯人數有2400,扣掉碩博900人,剩下1500人,國防部開缺300,恩.....知道大學畢業中這個的機率有多高了吧,我是成大資訊工程畢業的,在選役別時,讀哪間都不是重點了,"碩博"才是重點,我想後面幾梯應該都差不多的情形了吧。<br />
<br />
不管如何,只能希望下單位可以遇到好長官了,我這樣的需求應該不過份吧? 選替代役選到最屎缺,好歹也讓我下單位可以遇到好長官,不會被欺負....,剩下幾小時就要去做火車,準備回成功嶺了,等著明天的撥交,又是一個嶄新的旅程,看看能不能遇到好事情。sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-34235582363343859272013-10-10T10:28:00.001+08:002013-10-20T13:14:40.940+08:00雙十國慶 放假一天回來囉~這幾天成功領新訓,其實說操也沒有很操,唯一讓我十分不習慣的就是,幾乎沒有時間可以上大號= =,而且我非常建議以後的學弟,選公差的時候,千千萬萬不要選打飯班,它會讓你整理內務,還有喝水和上廁所的時間,幾乎等於0,尤其是剛進去的前幾天會比較忙,整個就超級不爽,你可以想想,忍著屎意跑三千,是他X得什麼滋味嗎? 有些人更誇張,剛進去三天都沒有大過便...我則是第一天晚上就拉肚子,至於是什麼原因,咳咳,新訓過的都大概知道是什麼原因了,我這邊就不說明了,另外或許是我太過聽話了,不懂得偷閒,一味乖乖的聽命令行事,我是覺得真的沒辦法忍,就舉手說你要去上廁所,只是呢~ 就是全部人就會等你一人上完再去跑三千。<br />
<br />
進去成功領,你就把你自己丟入與世隔絕的地方,這樣想你就會輕鬆多了 :) 要注意的地方其實也沒啥,只要不要天兵到神的境界,那應該一切都還好,長官大聲兇你是很正常的事 :) 另外新訓裡面最重要的事情就是,選役別!! 我這梯實在是太可恨了,碩博士整個逼近900人,這個意思就是說裡面所有的好缺,大概就是被他們包走了,你只能乖乖跟一大堆學士抽籤,如果你自認運氣一流,那你大概是不用害怕拉,我當天可是怕到手都用抖的...以前考指考也都沒這麼怕過,我就是運氣太背,抽籤都沒抽到= = 最後就選到聽說替代役裡面最屎缺國防部公共行政....名額還有剩咧!! 你就知道國防部開多少缺額!!! 我對整個選役別的流程整個感到不公平,竟然以學歷優先,X的咧,碩士有很屌嗎? 隨便私立碩沒聽過的系,都可以壓死名校名系了....我們這些被壓死的學士,也只能暗自罵在心裡,再不爽也沒用了,畢竟當國防部公共行政役,已經是天殺的事實了,而且又不能帶手機、NB,這樣跟當兵有什麼不同? 只是比當一般兵爽一點而已阿,還不是被關在那邊....真的很怕我這樣待了一年程式能力會退步很多= =,希望我到時候能夠選到好的單位,看能不能好過一點 :)<br />
<br />
這篇打完後,又要進去那個衛生環境不怎麼好的成功嶺了 :( 大概又要過10天左右才會放假出來了~ sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-76051544130450078012013-09-27T14:53:00.002+08:002013-09-27T14:58:32.772+08:00千等萬等,終於要國軍online了今年政府特別讓申請替代役的都人人有獎,當初我聽到消息滿開心的,因為聽說能當替代役就是爽? 一切我也是聽來的,所以我也傻傻的跟著高興 :) 但是一切從畢業後開始就不一樣了,起初我以為憑我的簽號,最晚應該也是九月就會進去,誰知道我一直等,不知不覺,九月過去了,我才開始擔心,打電話去公所問,現在籤號到哪了? 一問之下,整個人都傻了,怎麼速度如此之慢啊!! 每梯消化的人數也太少了吧,公所也無奈的口氣回應我,沒辦法,就是等吧~~~~我也很無奈 :(<br />
<br />
<br />
結果就在最近,我終於收到徵集令了,心裡鬆了一口氣,發現上面籤號,怎麼跟我當初看到的籤號,足足多了20幾,我又傻了一次,我以為我身處夢中,一切都是虛幻的,但是螞蟻咬我的手把我痛醒了,我才知道我在現實中,於是我輕輕吹走那隻螞蟻,然後我在心中開始想,甚至是幹譙! 該不會有人偷偷用權勢讓自己籤號往前移吧....,憑什麼我要乖乖得讓你們籤號後面的先進去,浪費我的時間? 我認為我脾氣算好的,但是這是我頭一次這麼氣的,經過網路上搜尋後,我想真的是有這樣的事。<br />
<br />
第一個我想每個公所分配的名額都不一樣,光這點就他X的不公平,很明顯北部的名額分配的比較多,消化的比較快,我想這是政府做事,小老百姓也只能無奈接受,再來就是可以用權勢、用鬧的,來讓自己早點入伍....,於是在我心中,浮現這樣的想法,這樣籤號有何意義,一切如同虛設??<br />
<br />
在這現實的社會,權力才是一切,懂得鬧的人才有糖吃,這樣像我傻傻的人,怎麼辦? 以為政府做事公正,所以就安心等待,現在,我才在這邊抱不平,事情也都過了,能怎樣嗎? 只能說整件事下來,讓我失望透頂,眼前所見的都只能參考參考而已,就像在台灣過馬路,看紅綠燈,看到綠燈也不要傻傻的就過去,因為交通號誌在台灣什麼也不是,有權有勢的人,可以無視這一切....新聞報導已經證實了許多次,現在想想我也太天真,我應該從這種事情就該聯想到會有人耍奧步。<br />
<br />
現在說什麼也沒用了,總之拿到徵集令了,終於可以進去,出來後就可以找工作了,同時也希望那些還沒進去的,能夠盡早進去:) 以後在社會上我也要多小心了,因為在航行在海上,何處有暗礁,你是不知道的.....,尤其是那些不是"天然"的暗礁,sigh。<br />
<br />
打完這篇心裡也稍微舒坦了一些,不過由於要國軍online了,這blog會荒廢一年吧,目前正在碰的common lisp,也只能暫緩了,希望到時候我的程式沒忘太多,甚至是沒忘 :) sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-79430901156257320372013-09-25T07:08:00.001+08:002013-09-25T07:09:02.991+08:00C++ regex之前看到C++ 11發表那些新特色,就滿懷心喜的想要來嘗試一下,第一個我就嘗試了一下regular expression,因為在python中用的十分爽,簡單易用,結果呢? 讓我又喜又氣! 沒錯你沒看錯,為何我會有這種奇異的感受呢?<br />
這就要請先看看下圖 :) <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/fGH5PBo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://i.imgur.com/fGH5PBo.png" width="640" /></a></div>
<br />
在visual studio裡面一切事都表現正常的,讓我十分開心,但是悲劇的是,當我開始用code blocks的時候,發現竟然得到的答案是不一樣的!! 竟然是沒有任何match,這讓我非常shock阿,起初我還以為是我regular expression寫錯了,畢竟又不是很常用,搞不好我忘了什麼重要的東西,心裡先這樣安慰自己一下:),但是經過多次嘗試後,仍然一樣,最後我用了python來測試一下,發現,很好,是我要的結果阿! 那到底是錯在哪?<br />
<br />
<br />
經過我的多次搜尋,我發現因為C++ 11還太過新,目前沒有compiler是能夠完全支援的,但我在網路上看到評分,VS的compiler支援度竟然是最差?,G++反而是最多的,誰知道今天VS反而能夠滿足我= =,而且G++竟然是沒支援,讓我原本滿懷期待的心情都落空了 :( 我真心懷疑那個評分是正確的嗎? 目前,我看大概要用一些新特色的話,就是用boost這個library吧,畢竟有許多C11的特色都是借鏡這個library的,另外,也免的到時候又哪個compiler沒支援你要的特色,都不知道錯在哪了。<br />
<br />
<br />
最後抱怨一下 :) 要是沒支援好歹也給的錯誤訊息,說你沒支援阿!! 讓我都不知道錯在哪... sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-37309635522770433112013-09-20T14:07:00.000+08:002013-09-20T18:53:19.748+08:00lisp note 2 最近讀lisp的心得,感覺的確是一個滿有趣的語言,要說讓我不怎麼喜歡的地方,大概就是那一堆(())這些符號,真的讓我剛開始,看到眼花,語言的可讀性跟python比起來真的差很多 :( 但是我也在想就是因為他的這種語言特性,才會讓lisp這麼多彩多姿 :),也讓lisp有個說法是lisp就像是DNA一樣。<br />
<br />
<br />
lisp全名是(list processor),從這名字就可以略知一二了,在這程式語言裡,你會看到一堆list,事實也是如此,大致上可以這樣看,lisp裡面的元素,可以分為兩種非cons,是cons,是什麼意思呢?<br />
<br />
cons掌控著兩個指標,第一個指標指的元素(car),第二個是(cdr),所以你會看到有語法是這樣的, (car '(1 2)), 這將會得到1,想當然爾(cdr '(1 2)),就是得到2,看到我看到這樣的語法時,心中就開始想了一件事.....<br />
那就是,既然這語法是成功執行的,那是不是代表後面那東西就是一種cons所組成的物件?<br />
後來,經過網路上的搜尋後,事實果然就是如此!!<br />
<br />
其實 (1 2),它相當於(cons 1 (cons 2 nil))這樣,當然你會想,要是你想建一個很長的list,那豈不是要打一長串這樣的東西,很麻煩 :( ,lisp是有提供一個syntax sugar的,那就是list,(list 1 2),這樣的效果是一樣的。因此這也給我了一個想法,用cons是可以做出額外許多東西的,或許可以建造新型態? 只是目前我也沒試過,所以說lisp裡面的元素非cons即cons,似乎也無可厚非呢 :)<br />
<br />
lisp這語言實在有好多東西要挖喔 :) 目前我沒辦法闡述太多心得,因為還有太多東西沒讀到,也還有太多東西沒釐清,所以沒辦法寫太多心得出來,但是,有一點是lisp有一些語法是有歷史淵源的,我覺得看那些歷史淵源,讓我了解更多的東西,千萬不要遇到語法就硬記,當你知道他的淵源,使用它就跟喝水一樣自然:)<br />
<br />
我是這麼認為的,有太多人只把語言當作工具而利用,而沒有去深層了解他背後的語意和哲學,我覺得這是很可惜的,就像是為了考試而讀書一樣,沒有去了解書中給你的意境,想當然爾,會覺得讀書無趣,食之無味。 或許這就是現實面吧,我想lisp有效率上的問題,所以在以前才沒有熱門起來,但是不管如何,我還是覺得lisp值得一學,至少它目前讓我開了許多眼界 :)<br />
<br />
<br />
在此提供一個可以當做文件查詢的網站<a href="http://clhs.lisp.se/Body/c_conses.htm" target="_blank"> reference</a><br />
另外lisp的表示法是用前序表達,這或許也是讓許多人第一次看不習慣的原因吧,這邊有個<a href="http://en.wikipedia.org/wiki/S-expression" target="_blank">wiki</a> 可以看 sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-87535233203326330522013-09-18T19:04:00.004+08:002013-09-19T12:57:34.278+08:00first time to play lisp最近不知道怎麼搞的,突然想要來碰一下這十分古老的語言 :) lisp是一個充滿分支的語言,我覺得他沒有像python那樣有一個強力標準在,意思是python有一個官方版本,雖然python也有眾多分支就是了,像是Jpython, Ironpython....有的沒的。<br />
<br />
其實在後來有一個算的上稱為標準的lisp,那就是common lisp,以後在網路上搜索的結果,發現比較多人在用的是clisp(common lisp)和SBCL,但是common lisp也是有眾多實做版本,,我是下載 <a href="http://sourceforge.net/projects/clisp/" target="_blank">gnu common lisp</a> ,如果想要玩SBCL請自行去找載點囉 :)<br />
<br />
lisp的在網路上的資源,說多也不多,說少也不少,但是我覺得似乎沒那麼熱門,畢竟這語言,曾經被冷落一段時間,但是經過我稍微一探lisp的世界,我發現這語言雖然古老,但是它卻有著許多現代語言的特性,甚至該說更好嗎? 垃圾回收機制他也擁有。但是令我比較驚訝的是它的例外處理,他不像目前的語言,一遇到錯誤就只是丟個訊息,然後程式結束,lisp它似乎會讓你進入debug模式的樣子,然後列出一些你可以執行的動作,目前我也才剛碰一兩天而已,所以還無法完整了解,lisp的哲學,必須過一段時間才能領域精髓。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/660Ts3S.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://i.imgur.com/660Ts3S.png" width="640" /></a></div>
<br />
<br />
上面是我的開發環境,因為網路上,我看到推薦的幾乎一致是 emacs + slime + your clisp,所以我就用囉,其實最近也在學vim,但是我看到的插件,竟然跟gnu screen配合,這實在是...很悲劇的他沒提供windows版的:( ,當然其實也有不是用gnu screen,純粹用vim buffer的,插件名字是slimv,但是目前還找不到無法使用的原因,目前猜想是我vim支持的python版本的不合的關係,但是我可不想為了這個,而重新去compile一個vim來用...,或許也是其他原因也說不定,只是想要無痛設定開發環境,就用emacs吧 :) 畢竟slime本來就是emacs的插件。<br />
<br />
<br />
其實如果你不想要為了學lisp而在去安裝emacs、學emacs的話,我有找到一個IDE,方便好用,以供參考<a href="http://www.franz.com/downloads/clp/survey" target="_blank">allegro common lisp</a> ,但是介面實在是...,如果你不介意介面的話,又不想碰emacs,那就用這個吧 :)<br />
<br />
<br />
另外這邊記錄一下目前找到的資源,滿意外的lisp,有不少免費電子書而且品質還算不錯!!<br />
<ul>
<li><a href="http://acl.readthedocs.org/en/latest/zhTW/index.html" target="_blank">ansi common lisp</a> </li>
<li><a href="http://zh.wikibooks.org/wiki/Category:Lisp_%E5%85%A5%E9%96%80" target="_blank">wiki tutorial</a> </li>
<li><a href="http://www.gigamonkeys.com/book/" target="_blank">practical common lisp</a> </li>
</ul>
我想看完這些就差不多了吧 :) sillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0tag:blogger.com,1999:blog-7833211908083331811.post-27776750293496419092013-09-13T19:30:00.001+08:002013-09-16T00:23:03.746+08:00初嘗vim其實很久以前就常聽人說,高手都用vim,但是我一直以來就不怎麼信這套 :) 但是最近常看一些論壇,偶然看到一些愛用編輯器或IDE排名,vim遙遙領先....emacs雖然是第二名,但是票數卻落後滿多的,sublime text則是第三名,票數跟emacs滿接近的,sublime會有這樣的票數,其實我不意外拉 :) 因為自己就很愛用sublime text理由大概有這些<br />
<ul>
<li>界面十分簡潔和漂亮</li>
<li>plugin很多很強大</li>
<li>script language是用python</li>
<li>開起速度很快,體積輕巧</li>
</ul>
還有很多,有興趣的就看看吧 <a href="http://www.sublimetext.com/2" target="_blank">sublime text</a><br />
<br />
哈有點離題 :) 我會突然想用用看vim的原因是就我看看emacs和vim的差別,其實我覺得emacs遠遠強於vim,它可以做的事太多了,我只能說emacs已經不能算是editor了,而且他的腳本語言是用lisp的方言,一個很有趣的語言,只是目前我也沒涉略太深就是了,但是vim有其吸引人的地方,我覺得他強調的特色是快速編輯,他的快捷鍵設定方式比較方便,相較之下emacs則是用到大量的ctrl、alt來結合,老實說這樣對於打字速度的確會慢下來,我想或許是這樣差異讓比較多人選擇vim吧,當然還有一些決定性的原因,但是就不一一列出來了,我就是因為快捷鍵和體積輕巧而從兩者間選擇vim來玩玩,來看看他到底有什麼魅力?<br />
<br />
首先就到<a href="http://www.vim.org/" target="_blank">這邊</a>下載vim,這邊有事情要注意的是,我平台是windows,要是你直接用網站上提供的windows installer,那到是一切順遂,不用擔心其他問題,但是如果你像我一樣選擇官方事先幫你built好的檔案(因為我想要portable版),會有個問題那就是,這個vim並沒有python surpport,意思是你沒辦法用python來custom vim,只能乖乖用vimscript來寫,這也代表你用的plugin也不能是用python寫的,因為沒support,要是你覺得沒差那就用吧 :)<br />
<br />
所謂的支不支持,輸入:version就可以看出來了如下圖<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/oFz3wT0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="http://i.imgur.com/oFz3wT0.png" width="640" /></a></div>
<br />
有+表示支持。<br />
<br />
下載下來後,當然就要去安裝一些好用的plugin,我想第一個要安裝的應該是 <a href="https://github.com/tpope/vim-pathogen" target="_blank">pathogen</a><br />
這個東西的作用就跟sublime text的package control一樣,管理你的插件,如果你不安裝這個也行,那就是你得手動慢慢安裝插件,把什麼檔放到什麼資料夾中....,到時候想要刪除該plugin嘿嘿也頗麻煩 :)<br />
<br />
再來我安裝的是 <a href="https://github.com/scrooloose/nerdtree" target="_blank">nerdtree</a> ,就是一個file browser,不解釋 :)<br />
<br />
這是我目前vim的樣子<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://i.imgur.com/usjdcQV.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="347" src="http://i.imgur.com/usjdcQV.png" width="640" /></a></div>
<br />
另外我還安裝一個東西,叫做 <a href="https://code.google.com/p/conque/" target="_blank">conque</a> ,這個讓你vim buffer來做為一個terminal emulator,滿方便的東西,這功能emacs本身就有,若是你沒在在意,快捷鍵設定的方式,那就用emacs或sublime看看吧,而且兩者都有提供"一定程度"的vim快捷鍵。<br />
<br />
目前用起來,就是還有好多快捷鍵要去記... 而且就算是我努力調整vim介面後,我還是感覺sublime text介面完勝阿,讓我動不動就關掉vim換sublime text:) 可能是我一直以來用sublime text,一個短暫時間沒用他,就開始想念它了吧。<br />
<br />
往後發現有什麼需要記錄的東西,在來POsillygodhttp://www.blogger.com/profile/09920365165435918660noreply@blogger.com0