2014年7月13日 星期日

how to resize the console window in windows

最近在軍中時在遇到太多鳥事,同時也遇到一些不太如意的事情,再加上我開始有點迷茫了,關於學習方式的事 :( 所以已經有一段時間沒碰程式了,只有回家逛逛論壇,突然我看到一個議題讓我有點小興趣,那就是我今天要寫的東西。

其實如果想要可以放大的console window,其實也不難而且也不需要寫程式,點個右鍵,去設定裡面的一些性質就可以,只是身為一個programmer,就是要寫程式去控制不是嗎? :)


上面這張圖是我目前寫出來的樣子,只是我對某些地方仍然感到不解,就是當我點把視窗放到最大,他其實並非真的完全放大,下面仍然會有些空隙,目前的code我放在github上面的console.py,其實這個project當初只是無聊試試看socket做個小小的consle介面的聊天室而已。

關於撰寫這樣的功能,需要注意的地方,大概也只有幾點,這些心得是我觀察了一下,console的內容後得出來。

首先,先來說說我的觀察,一開始windows的console window buffer的預設值是 80x300,我是不知道是不是每個windows系統都這樣啦,或許你自己也改過設定也說不定,之後你可以試試看點放到最大,你會發現視窗只有拉長高度,對於寬度他並沒有拉寬,所以可想而知,console buffer size,是一個關鍵點!! 所以想要放大視窗,我們必須為console準備相對應的buffer size,至於要怎麼計算呢? 我認為大概是這樣的

console buffer width = screen width / console font width
console buffer height = screen height / console font height

以我電腦為例
200 = 1600 / 8
56 (大概值) = 900 / 16
也就是說最少我也需要200x56的buffer size才可以放到最大....

console font size的預設值通常是 8x16,當然關於這個可用winapi去取得,是用什麼函式這裡就不囉嗦了,詳細請看console.py裡的resizeConsoleWindow,算完後,要重新設定buffer size以至於放大時可以填充,我同時也設定了console window info 雖然有得到跟上面那張圖,不一樣的結果(更接近真的放大最大),上面那張是按了放大最大後的結果,關於這個行為我目前還是不解就是了,因為我已經準備足夠的buffer size讓他可以最大化,可是點了之後卻有點落差,不是很懂為什麼? 關於這點我還必須在研究一下 :(

或者有誰知道為何的,可否告知小弟 :)

2014年6月2日 星期一

快要破百了~

最近沒什麼在寫blog,其實是有原因的,那就是最近又遇到不如意的事情了,讓我沒什麼心情,果然在軍中是不會平穩的過下去呢,總是會有鳥事跑到你身上,這幾天以來,我也重新回憶了,打從進成功嶺到現在的點點滴滴,赫然發現,其實這只不過是一連串的被政府陰了而已,為什麼我會這麼說呢?

來看看接下來我寫的吧,選役別的那天,社會役的主官臨時公佈資工系限定20名,原本沒限定的話,那可有一百多,而且又在第二順位,這表明我是穩上的,很好被她這麼臨時一搞,我就摸著鼻子去法務部行政啥鬼署的,坐在那邊,我分析了當場的人數一看,大概是80抽60,大學生而言,這樣我看機會是頗高的,於是我就坐在那邊要來一場廝殺 :)

不過呢,誰知道天殺的教育役,竟然事先偷跑,先行公佈結果,讓那些落選的碩士生,硬生生多了一次機會,很好,接下來知道發生什麼恐怖的事了嗎? 那就是在我這個役別即將開始公布結果的前五分鐘,突然殺來一批碩士,我看了都傻眼了,這是什麼情形,當初說好的全部役別,同時公佈的規定呢? 根本是屁,最氣的還不是這個,而且那些碩士有一半明明不是資工相關的,還是可以進入保送名單,我真的傻了,動力機械系也是資工相關,啥鬼能源系也是資工相關,我還真想問一下那個主官,他腦袋是不是有問題,被他這麼一搞,從原本的80抽60,變成80抽1X,機率整個變超低,那時我的心情整個已經是呈現無言狀態了,我只是默默看著主官的表情,和那些碩士生的嘴臉,之後我就默默的走了 <=想也知道是沒被抽中

於是呢,我進去的第二階段,不過用你的小宇宙想也知道,還有什麼名額剩下來,一定都是屎缺,沒錯,我接下來就百般不願意坐在國防役那邊,聽著主官的像錄音帶式的官腔,他說什麼其實我也都沒在聽了,只是突然底下有人發問,問說中部地區也會開放嗎? 這個我可超有印象,主官連續重複了兩次,他一定會在中部開放地方,我聽到這個心中想,似乎也還可接受,至少有什麼離家不遠的地方,這樣交通費用也可以省下不少。

只是誰知道呢? 我從沒想過,原來主官說的話,可以這樣一而再,再而三,如此沒信用,我真的應該在被陰了兩次後,就要想到會有第三次了,事實是中部根本連個屁都沒開, 最後只好選了在岡山的航技,只是這樣每周回家的交通費,其實也花了不少,一個月大概快2000,薪水剩下4000那邊,我能夠說什麼呢?

好了,以上那些都是我回憶感想,就來說說最近發生的事吧,當初內政部說大概一月會來關心我們,這次果然有信用呢! 真的有來,而且還是在五月才來,最厲害的是,來的是國防部,我都無言了,隨便想想也知道,又是個摸(ㄕㄚ)頭會吧,自從被陰了那麼多次後,我只能說我對政府和國軍沒什麼好印象了,果然我們在那場會議,所有的要求全都被回絕,其實我也不意外拉,只是似乎那位國防部派來的,之後有和航校討論某些的東西的樣子呢 :p

自從那場會議後,我們的生活就越過越苦了,因為他說替代役什麼事都可以做,就跟一般兵沒兩樣,好個沒兩樣,壞的都比照一般兵,好的都不能比照(例如:放軍人節),連吃飯夾多點,都會被罵,一樣都有繳錢耶,我是不能吃嗎? 我只能說當國防役就是會被無盡的被凹,想著想著也只有無盡的無奈,想著這些事情,覺得台灣會變成今天這樣,其實也是理所當然,感覺我遇到的事情,就是國家政府整個的縮影,如此沒信用,沒誠意,只會凹別人,又不給獎賞,試問有誰想要待在如此美好的地方?

這篇又是個抒發心情的文章了~ 下次來PO點營養的文章 :)
而且快要破百,也代表我該來想想以後工作的事情了,又來好好的計畫一下

2014年5月10日 星期六

read open source pygments 2

這篇就來,繼續上次的進度 :)

上次code貼上來的結果不甚理想,所以我在想是不是要自己來寫一個format會比較方便,當然在動手之前,我想重新理解code的流程是必須的,因為要讓自己對這份open source掌握更加清楚,所以我決定利用debug的step into,來進行trace code :p

這邊就來介紹一下我用的工具,關於debug,我還是選擇用IDE,因為比較直覺化又容易使用,我是覺得沒必要去聽信那些說用gdb才是王道,畢竟那要打一些指令,實在是有點麻煩,個人是認為有興趣的話再去用那種方式 :p

說要介紹我是用哪款IDE都差點忘了 :) 這邊我是用pycharm ,這一直以來都算很有名氣,雖然是要錢的,但是網路上總有...咳咳,不過那僅限以前!!,現在可好了呢,它有提供open source版,而且功能很夠用,有興趣的人可以去載來用看看 :)



pycharm的介面如上,它提供了算是不錯的code intellisense,加上trace code也是方便,像是find definition,加上它的plugin也是挺多的,要說讓我說嘴的地方就是記憶體吃的有點多:(
另外以介面來講,我還是喜歡sublime就是了,好啦,該來講講怎麼trace code的部分了,一般來講都要先下個所謂的break point,就是讓程式執行到該行時,停下來,接著就有如下幾個操作
1. next line(step over)
2. step into
3. step out
... 等等

就先來看看這張圖吧

我在40行的地方下了中斷點,所以程式執行到這邊就會停下來,之後呢,我特別在watch中加入一些我想看的變數,上面這張圖是我step over後,可以看出它是一個class,有興趣要看它是怎麼一步一步產生的話,就必須用step into,就像接下來的HtmlFormatter,我用了step into就會如下面這張圖


程式碼頁面會跳到HtmlFormatter所在的檔案html.py,接著你更想的話,你當然可以繼續用step into,就看你想要鑽到的地方有多深,就跳多深吧 :)

另外我覺得用pycharm來debug真的是頗爽 :) 老實講真的太方便了,看前面幾張圖就知道,它其實會自己監看一些變數,起初我用sublime text閱讀源碼時,其實有點卡卡的,當時我認為是我理解力不夠,因為有很多地方看過去,我會有種不知道這樣的code會產生什麼效果,但是用了pycharm就方便多了,因為你會看到這些變數,就知道他們是否如你所想像的一樣,這樣一來多了一些證實,自然就會多了信心,閱讀起來更加順遂,就舉個例子好了,請看下面這張



我當初一眼看沒有懂的地方就是這裡
arg = ('cssclass' in self.options and '.'+self.cssclass or '')
從圖中可以看到arg的值是.highlight其實就是'.'+self.cssfile
很好!! 這樣的寫法到底是怎麼運作呢? 詳細可以看看 這個這樣的寫法不是每個programming language都可以寫的呢 :) 看看這個wiki 就知道囉~

回到正題,那行的意思是 'cssclass'有沒有在self.options裡,有的話就會回傳'.'+selfclass,沒有的話,就會繼續evaluate下去,那就是變成回傳'',這其實是用到short circuit的技術 :p
其實個人認為這邊根本不需要用到這種寫法,只是徒增不可讀性就是了,用if else還親民多了,不過這不代表這樣的寫法沒用處,我想大概可以用在 lambda這地方吧 :)

經過這次的閱讀,目前我想到一個,不用自己繼承一個HtmlFormatter的寫法了,我是用了擷取部分code,之後再自行增加一些必須的html的方式。

目前我粗略地寫了個簡單測試腳本,效果如下

 1 '''
 2 a script for python code highlighting is expected to partial html output.
 3 That's output content without the whole html tags.
 4 
 5 
 6 ex.
 7 <style>
 8 xxx
 9 xxx
10 xx
11 </style>
12 <table>
13 <div>
14 xx
15 xx
16 </div>
17 </table>
18 
19 usage: test.py inputfile outputfile
20 
21 '''
22 
23 
24 from pygments.formatters import HtmlFormatter
25 from pygments import highlight
26 from pygments.lexers import *
27 from pygments.styles import *
28 import sys
29 
30 try:
31     readfile = open(sys.argv[1], 'r')
32 except:
33     sys.exit()
34 
35 code = readfile.read()
36 readfile.close()
37 
38 file = open(sys.argv[1].split('.')[0]+'.html', 'w')
39 
40 st = get_style_by_name('native')
41 myformat = HtmlFormatter(style=st, linenos='inline')
42 
43 
44 content = '''<style>
45 .lineno {{
46     color: {};
47     margin-right: 5px;
48 }}
49 {}</style>'''.format('#'+str(int( st.background_color[1:])+303030), myformat.get_style_defs('.highlight'))
50 #rule the style
51 
52 content += highlight(code, get_lexer_for_filename(sys.argv[1]), myformat)
53 #add the highlighted code
54 
55 
56 file.write(content)
57 file.close()


比起上次用原來的指令,所產生出來的html檔,這次不需要再多做一些修正,可以將完整的內容直接複製貼上,相對起來大概是有比較方便吧 :) 這篇就先到此吧~

下次再繼續PO心得
最後來首音樂吧



2014年5月4日 星期日

read open source pygments 1

pygments 簡單說是一個syntax highlighter,他支援的語言十分之多,最近會突然想閱讀他源碼,其實有部分原因是想開始練習閱讀open source,畢竟為了我另外一個project,我想,閱讀open source的能力,勢必要有所上升才行 :)

另外原因是,之前有朋友問,怎麼在blogger上面hightlight code,關於這個,我之前都是用這個 ,這是based on javascript的,所以必須要在blogger的後端,加入一些連結,而且每次要寫code時,都必須把code包覆在<pre brush:xx></pre>裡面,才會有效果出現,其實就以寫blog而言,真的有那麼一點不順就是了 :(

不過朋友說他做了設定後,卻沒有效果出來,好吧,我人沒在他旁邊,所以也不知道問題出在哪,所以最近在想乾脆用用pygments將code highlight後output成html格式,再將它PO在blog上面,這樣就比較簡單了 :) 於是我的閱讀之旅就這樣開始拉,雖然僅能利用假日來讀 :(


我想,首先就從package的 __init__.py來開始看,應該是沒錯的,如上圖所示,它做了一些最基本的說明 "pygments 是一個用python寫的語法高亮器 bla bla bla" 以下省略 :p

這邊特別說明一下 __all__ 這個東西的效用,其實看官網 的說明,就大概知道了,當你用 from pygments import *,如果你有定義 __all__ ,那它只會import 在all裡面的那些東東而已,沒定義的話,就會看你的 __init__.py 裡面有什麼就 import 啥,比如上面有import sys,那它也會跟著import sys,好啦轉回正題~

這個檔案的結構也滿簡單的,highlight這個function用到了 lex 和 format,另外當__init__.py被當成執行入口時,它會import cmdline.py,所以接下來我要去讀的package和檔案其實也滿明顯的,接下來我是選擇先閱讀cmdline.py,其實從名字一看也知道這是關於在cmd中如何進行操作的檔案,看完這檔案,應該就知道怎麼使用 pygments了,畢竟先懂得怎麼使用,然後再試著修改,我想這應該是不錯的順序吧 :p,另外也不用再去看官方docments的操作說明 :)


看吧,果然有使用方法,不過這檔案用到挺多東西的,其中它用到了兩個standard module,

1. getopt
2. textwrap

python果然真的是太方便了,光是內建就有一堆好用的東西,雖然這些自己寫一個也是OK拉:p

看了官方說明, getopt 主要是一個 sys.argv的parser, textwrap總之,方便文字格式處理的module,詳細不多說,畢竟這不是這篇文章的重點,且官方有不少說明,或者更有興趣直接看textwrap.py和getopt.py也是可以的。

 看了一些code後,使用上並不難,比如想要對test.py輸出一個語法高亮格式為html的檔案,打這樣的指令就可以了

pygmentize -O full,style=emacs -o test.html test.py

基本上只要你有提供輸入輸出檔,pygments會自動判斷該檔案的語法,當然你也可以自己輸入參數去規定syntax就是了,另外關於-O 那邊的設置,可以找源碼中的formatters的html.py裡面有相關說明,不同的輸出格式,會有一些有不同的option,效果如下

1
2
3
4
5
a = [ x for x in range(10) ]
b = a[::2]

print(a)
print(b)


我是將輸出的html內容擷取並貼上來,而且還要做一些小處理,只是如果每次都要這樣其實也滿累的 :( 目前就先到這邊吧,下次在PO繼續閱讀的心得,並且想個解決辦法 :p









2014年4月27日 星期日

pygame framefork 持續進行中

這個project的進度實在沒辦法進行的很快,畢竟現在我只有每周末可以回家寫,但是每次回到家都想要休息,另外一部份的原因實在是因為我對於設計GUI框架,沒有太多的概念,所以目前也只是按照我個人的想法來包裝,因此隨時都會有改動,最近感覺每次回到家,都要重新看code回想一下自己當初的想法是啥 :) 這樣感覺有點麻煩,所以這篇主要是來記錄一下目前的想法和進度的 :)

目前寫到這樣的結構,其實我已經開始有點混亂了,目前我是寫在 imageCropper裡面,並沒有將這個framework分層,因為目前只是測驗性階段,加上python是動態語言,所以沒有將code分層是不會影響到效率的。

我寫了這個測試,發現我的包裝少了什麼東西,就會回去把包裝修改一下,目前我有很多疑慮,像是

1.寫個物件是處理座標系統的,因為發現了絕對座標和相對座標的問題。
2.寫個物件是來計算每個widget位置的安排,像是考慮到margin padding等問題。
3.widget是不是該包含update這樣的函式,可是如果在每次的gameloop都call update,這樣會不會有效率上的問題,這樣一直改來改去,想來想去,讓我有點不知道所措。
4.需不需要把widget的屬性,另外用json的方式來進行讀取和設置

實在是有太多太多地方需要思考,現階段可能就以先增加其他widget再說吧,像是listbox、scrollbar等,另外我也在想寫遊戲裡的GUI,有必要寫到那麼麻煩嗎? 我一直在思考這些事情,所以project進度也一直沒很大的進展,所以我在想要不要稍微停下來,讀一下別人的open source來擷取一些想法,只是我查了一下pygame gui 的相關open source,大致上只有pgu 感覺比較好一點,可是我又覺得它似乎有點太雜了,再加上似乎沒有在維護了,到最後我找了一個based on pyglet 的game gui,就是這個simplui ,他也是沒在維護了 :( 只是相對我覺得他比較lightweight,所以我決定從這個下手,因為可能比較好讀 :) 不過我沒什麼閱讀open source project的經驗,所以可能會讀比較久一點,才會有相關的心得就是了,而且萬一他用到比較有技巧的東西,那可能就要更久了 :)

目前大概要一段時間才會PO 跟 framework有關的文章了 :)





2014年4月20日 星期日

c++ static_cast, dynamic_cast, const_cast, reinterpret_cast

最近又稍微碰到這類的問題,想說來複習一下也不錯,這邊有不錯的解說 ,可以參考一下,這篇主要是記錄一下這四種type conversion的方法,基本上一扯到conversion,想當然爾,就會關係到C++裡面有的一個很需要注意的東西,那就是implicit conversion和explicit conversion,所以就先來講這兩個東西,就如同字面上的意思一樣,explicit是明顯的意思,因此explicit conversion
大家都應該很熟悉,就像是...

int i(5.2);

這樣藉由 ( ) 這樣的語法轉換型態,就是明顯的轉換,那麼implicit是隱含的,所以什麼是隱含的轉換呢? 其實大家應該都常常寫到,只是不自覺,所以會很恐怖 :) 像是..

double d = 5.2;
int i = d; //相當於 int i = int(d) 或 (int)d

在你initialize的同時,C++會自動幫你轉換型態 :)
或許這樣一看你會覺得不知道恐怖在哪是吧 :p
的確今天的型態如果只是primitive,那你大概是不用怎麼怕,那如果是自己定義的呢??
舉個例子

#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;
}


你將會看到,嘿嘿成功執行,你傳入的參數2,其實已經成為classA的copy constructor的參數了,你也可以看到印出來的type的確也是class A,上面只是跟你說一下,型態轉換在C++上面是很恐怖的,常常在很多你想不到的地方,他就發生了,就像這樣,如果哪個一個不小心,就會造成或許不是你預期的結果 :)

哼哼尤其是在stl中,如果你想用到user defined class且有包含指標型態的話,通常最好要定義一下你的copy constructor,因為大概會被call到。關於這邊改天有心情的話,就來用個例子好啦 :)

該來講一下四種cast的方法,在我上面給的那個連結基本上已經不錯的解說了,所以這邊就簡單總結一下而已

static_cast
可以call implict conversoin和explicit conversion
另外還有upcasting和downcasting
只是他不像dynamic_cast會做動態的檢查

dynamic_cast
負責掌控 upcasting 和 downcasting


const_cast
它可以強制加上或拿掉一個變數的const特性,雖然我不知道這樣的實用在哪就是了 :-S

reinterpret_cast
一個很恐怖的東西,它可以強制轉換型態,任意的轉換,所以不要亂用

另外關於這些cast想要更詳細的,可以看看 這篇  :)

2014年4月12日 星期六

試著寫一個小小的framework for pygame

首先就來說說,最近逛著一些論壇,發現越來越多framework跑出來,尤其是關於javascript的,看著那些強大的framework,總覺得自己的程式實力,仍需要很大的努力 :(

有時候看著別人用framework寫出很多不錯的應用程式,我心裡常這麼想著我是否也該要試著玩玩看,像我用python寫程式,python其中的宗旨是do not repeat yourself,這想法的確沒錯,已開發產品來講確實是這樣,因為這樣開發速度才會快,畢竟從0~1是很辛苦的,也很耗時,所以我也碰過一些python的library,像是pygame、pyglet、pillow、pyqt...等,但是問我對他們有沒有完全熟悉,我只能說大概沒有吧,我並沒有把裡面所有個函式都碰過,甚至也沒有將他們記起來,我都是想到需要什麼功能,就去官方文件查查有沒有相關的功能,所以我很常邊查文件邊寫程式。

其實這樣讓我有點擔心,因為要是沒有網路這樣一來我就不是變的不會寫程式了嗎?? 因為沒有文件可以查...可是對於python這語言大概是不太用擔心,因為library本身就幾乎是源代碼,所以可以直接去看源碼,除非他將一些核心用成dll等藏起來,但是對於C++呢? 除非library本身自帶文件那就不用怕了,只看header file你也不會懂那是啥,除非它有寫註解 :P。

在此同時,大量framework充斥的現在,讓我開始擔心起一件事,那就是我們這些後人,或許懂得快速利用哪棵樹來乘涼,但是懂得種樹嗎? 現在已經越來越少人種樹了,因為耗時、耗力,甚至是因為你自己種的樹不見的比其他人好 :(

就以小弟學了演算法來講,光是排序的問題好了,別人的library,可是有顧慮到對於不同的compiler和不同的作業系統甚至是記憶體的情況也考量進去,並分別給予不同的優化,這些種種,不是光隨便看幾天的書就可以寫出來的東西,自己或許真的可以寫出來,但是要花多久時間呢? 但是相對的,用別人的library呢? 花個幾秒的時間,你就可以達到相同效果,的確是何樂而不為呢 :) 這也是為啥懂得用別人的library,也是一件很重要的事 :)

話雖如此我還是覺得身為一個programmer,必須要懂得種樹,要不然programmer還有什麼價值? 只是看看文件,call一下function,說難聽點誰不會啊? 所以我還是選擇一個比較不好走的路,就是每個東西,都玩玩看,不管是底層,還是高階的framework,也因此我決定先來個小小的嘗試,那就是為pygame這個library寫個小小的framework,由於pygame本身並沒有GUI,所以我決定來練練如何自己包裝出一個GUI framework,雖然這並不是多底層的技術,但是我覺得這可以訓練一下,如何讓自己寫出一個大程式且附有重用性,以前我寫過最多行的專案了不起也才快2000行,我想要讓自己有更大的進步,目前我心中也沒有把整個程式結構想出來,一來是因為我查了一下網路,並沒有發現關於設計GUI的程式結構概念,或許有的? 如果有的話,希望好心人可以告訴我一下(留個言),目前的結構是這樣的,我先實現幾個widget,label、button和一個可show image的widget,如下圖,當然我也有包裝了一下,事件處理迴圈,相關code可以看這邊


只是目前我覺得我寫的這些code,可能以後會有很大的改變,畢竟目前我是依照直覺去包裝,往後如果有了整體的想法,就會另外PO一篇來記錄一下 :)