Wednesday, July 20, 2011

Android 手機程式

急急忙忙的安裝好ADK就花了8小時,其實是因為開始程式後模擬器跑太慢,害我以為裝失敗了,一直重弄=口=,後來餵他吃1G的記憶體就好很多,這個教學站真不錯,寫得深入淺出,從昨天早上到現在就搞懂基本UI還有API的互動方式了,現在再補一些應用應該就能開發簡單的App了,話說我根本沒正式學過Java啊,突然覺得自己很神=W=

Sunday, July 17, 2011

FLTK、TARGA、2D影像操作…@o@

最近找了教授提早做下學期的專案,我只能說,還好能提早做,光是FLTK的機制就可以搞一本書了,還要配合各種操作弄成介面的形式,要不是我之前一直在研究GUI根本做不出來,下學期修這門客的同學該怎麼辦呢,現在就想替他們默哀了。

Sunday, July 10, 2011

咦?!GUICHAN不是Unicode喔

不對啊,GUICHAN內部的函數是抽象的,真正的內容都是用後端實做,難道是SDL的問題?把範例Hello World層層剝開之後(過程中發現GUICHAN包裝的模式真的很好,不過現在沒時間慢慢看),發現Label是用*TTF_RenderText_Blended(TTF_Font *font, const char *text, SDL_Color fg)畫出來的,而宣告一個新的Label時用的名字就會傳到const char *text的位置,難怪在外部不管怎麼調整,中文都指後顯示亂碼,明明還有另一個函數啊,SDL_Surface *TTF_RenderUNICODE_Blended(TTF_Font *font, const Uint16 *text, SDL_Color fg)看起來能歡樂的顯示中文,不過這樣就要把這個GUI的核心架構重整一遍了,其實不困難,但是實在無法估計工作量啊,還是GUICHAN認為標籤的名稱用英文就夠了?還是怕寬字元渲染太慢?現在正考慮重整架構中

Saturday, July 9, 2011

好痛啊GUICHAN

這兩天不斷地跟Linker奮鬥,差點被號稱easy to use的GUICHAN,如果用hge作後端就算了,用SDL作後端就是LNK2001、2005、2019、4098不斷亂跳,連U++我都只看一下午而已,這家火卻花了我整整兩天啊...,連介紹的力氣都沒了,指個一個提示,SDLmain.lib會衝突是因為他把main #define成 SDL_main,讓你主程式的main()消失於無形,然後再跟msvcmtf.lib不斷衝突,這不是Linker子系統的問題,把SDLmain.lib槓掉,include SDL_main.h後開檔案,把#define main SDL_main那行註解掉,編譯就能通過了,注意只是通過而已,這會導致跟其他SDL的子系統有銜接問題...,雖然目前測試沒感覺,但到底有沒有更好得解決方案啊,我快掛了=口=,下午來安裝OpenGL作後端好了...

Thursday, July 7, 2011

MSN 封包研究

今天的問題是:

有沒有辦法利用封包偵測器分辨一個人是隱形還是離線?

開一下 Wireshark 就知道,MSN 軟體其實一值在收送各種封包。這樣它才有辦法紀錄好友的狀或是知道 "某某某在打字"。

首先先看看可不可以在封包裡面直接讀我在對話送的言語。可以。所以在公用網路,應該很容易偷聽別人的私語... ...

不久,發現一個可能有小用途的事情:當別人開視窗準備要跟你說話,就會有封包出現。所以可以事先跟他說話嚇嚇他吧。

不過再怎麼弄,都好像沒辦法看到隱藏的人。MSN 軟體如果覺得某人好像離線,會讓很多選項(所有不跟文字對話有關的選項)變暗。原本想說跟離線的人傳檔案之類可能有分辨的辦法,可是根本就沒那個選擇。

所以,(我的)結論是: (我)沒辦法。

也不對,還是有直接開口問人的辦法。

Wednesday, July 6, 2011

Agar實做GUI

今天把VC++2010給廢了,雖然這幾天用起來感覺不錯,編出來的執行檔不會太大、速度也頗快,可是向下支援卻是問題不斷,畢竟有許多好專案是用被大家罵翻的VC6做出來的啊,所以我改用前後支援都不錯的VC++2008了,反正先把基礎框架打好,等那些好用的東西用VC2010的版本出來實在慢慢更新就好,VC2010在開源專案還沒普及啊...

總之後來改裝了2008,先後裝了Boost、SDL狀況不錯,想說乘勝追擊安裝Agar試試,結果變成我至今看到最多Bug的一天,啊對了,Agar是一個用SDL實做的GUI介面,畫面雖然不是噗拎噗拎閃亮亮又經美得那種,不過簡便高效有質感,畫面像是質樸的工藝品一樣也挺有風味的,至於為啥會有一大堆Bug呢?其實是我手癢把專案設置成多執行緒DLL模式了,而我用的Agar版本是基於pthread得多執行緒GUI,結果就跟原生的DLL衝突了,Bug多到VC都停住了呢,原來這就是傳說中的DLL地獄啊,真是百聞不如一見,幸好找到忽略原生DLL編譯的方法,加上官方文件提到的另一個檔案後就沒問題了,不過把警告全開後還是看到一些問題啊,尤其是Boost用VC9重新編譯後會出現一些型態轉換的警告,不過既然是Boost那應該就代表不會出問題了,嘛~~~今天看到的LNKxxxx的xxxx大概破千了吧,在繼續研究吧=W=

http://libagar.org/screenshots.html.en

用C++實做策略模式

為了增加軟體的彈性,現在流行使用一些著名的設計模式使程式與資料型態鬆綁,而策略模式主要用來使物件內的數能夠動態改變,聽起來很好,但是後來發現一個問題,C++如果要動態配置資料的話必須new一個指標,然後在初始化,可是這樣對於型態的相依性不就變得更高了嗎@@

#include < iostream>
#include "fly.h"//定義一個類別,只含有虛擬函數fly()

using std::cout;
using std::endl;

class Duck {
public:
    Duck();
    virtual void display(void) = 0;
    void performfly(void);
protected:
    I_Fly* fly_behavior;//一個飛行行為的物件
};

class Big_Duck : public Duck {
public:
    Big_Duck();
    void display(void);
};

int main() {
    Big_Duck dunky;
    dunky.display();
    dunky.performfly();//讓鴨子飛

    return 0;
}

Duck::Duck() {

}

void Duck::performfly(void) {
    fly_behavior->fly();//這裡,用fly_behavior來決定到底該怎麼飛
}

void Big_Duck::display(void) {
    cout<<"Im a big duck!!!"<<endl;
}

Big_Duck::Big_Duck() {//大鴨子是繼承鴨子的類別
    Fly1 current_fly;//在初始化時決定使用Fly1這種飛行方式(除此之外,fly.h中還有很多其他的飛行方式)
    Fly1 *fly = new Fly1;
    *fly = current_fly;
    fly_behavior = fly;//就是這裡!!!!!!!!!!!!!!!!!!!!!!!!!!一大堆的型態轉換
}

這是很奇怪的,我本來想從型態中鬆綁,實際做起來卻越來越嚴重,但其實這是C++語法才有的問題,在Java中用一個new就可以一行帶過,但這也說明即使是Java只要一接觸到實做(new)就一定會跟型態榜定,因為到這個階段就已經不是抽象方法的範圍了,所以C++花了4行的寫法的問題,其實只有資料型態Fly1一直不必要的重複出現而已,既然我都要實體化物件了,型態當然會統一用同一個啊,可是C++很嚴格,一直逼我指定型態,明明都一樣啊,所以我後來使用樣板函數把
    Fly1 current_fly;
    Fly1 *fly = new Fly1;
    *fly = current_fly;
    fly_behavior = fly;

改成類似於Java的
    fly_behavior = new Fly1;囉~~~=W=

這樣策略模式的實做就很方便了,就算在增加其他的behavior或其他的fly方法,<span style="color:#FF0000"><span style="font-size:x-large;">都不用在更改已經寫好得程式碼囉</span></span>

這是使用設計模式真正的好處,雖然把類別硬是作成這個樣子挺累人的,但是她卻經得起改變,不會因為增加功能就到處修改、DeBug、陷入除錯的地獄中,事實上,打開fly.h,你就知道增加新方法是多麼簡單了=W=

#ifndef __FLY_H__
#define __FLY_H__

#include <iostream>

using std::cout;
using std::endl;

class I_Fly {
public:
    I_Fly();
    virtual void fly(void);
};

I_Fly::I_Fly() {

}

void I_Fly::fly(void) {

}

class Fly1 : public I_Fly {
public:
    Fly1();
    void fly(void);
};

Fly1::Fly1() {

}

void Fly1::fly(void) {
    cout<<"Fly~~~"<<endl;
}

class Fly2 : public I_Fly {
public:
    Fly2();
    void fly(void);
};

Fly2::Fly2() {

}

void Fly2::fly(void) {
    cout<<"Flyyyyyyy"<<endl;
}

#endif
是不是都長一個樣啊~~~~~~~

Monday, July 4, 2011

啊...來玩玩tk吧

這是哪招,怎麼VC6的專案VC++2010打不開,這是什麼世界啊,連Lua都不能裝了啦,害我還跑去看make、cmake、cygwin一些有的沒 的結果連makefile都有Bug喔= =,是不是有人偷改忘了修回來啊...,VC2010真的比較好嗎?CodeBlock有那麼差嗎?搞了半天還是要靠bash嗎?程式越大、引用的原始碼 (澄清!LGPL的源碼很棒,只是太複雜編譯容易出錯)專案在設定上的小細節就越麻煩,拜託,我只寫好好寫程式啊,結果這些東東我剛才竟然得靠nmake 搞定,是不是想把大家逼回Unix的世界啊,雖然我承認那裡很強大,但想不到Unix世界和MS世界溝通這麼麻煩,又不是異度風景還要穿越位面,從之前累 積的經驗現在使我越來越相信真正完全跨平台的專案其實根本就寫不出來了(虛擬機器不算喔)= =+

好了,tk是一個功能強大的腳本語言,其強大的GUI開發能力是有目共睹的,現在也有各個語言的封裝版本,如Ruby、Python、Lua、C++至於怎麼封裝其實不會很難,只要我能把那個VC專案打開我之後一定PO...,所以現在先看看使用Tcl語言的教學網站,另外,一般在windos上都是直接使用安裝版的Tcl\Tk,如果你想像我一樣嘗試一下手動編譯那種溫腥快樂的感覺的話,可以去他的開發網站找原始碼試試看,如果你不斷碰壁的話可以看一下我拿到的回復咒文,掰~~。

cd C:\tcl8.5.10\win
nmake nmakehlp.exe
nmake -nologo -f makefile.vc INSTALLDIR=C:\tools\tcl\8.5.10
nmake -nologo -f makefile.vc INSTALLDIR=C:\tools\tcl\8.5.10 install
cd C:\tk8.5.10\win
nmake -nologo -f makefile.vc TCLDIR=C:\tcl8.5.10\win INSTALLDIR=c:\tools\tcl\8.5.10\include
nmake -nologo -f makefile.vc TCLDIR=C:\tcl8.5.10\win INSTALLDIR=c:\tools\tcl\8.5.10\include install

自製跨平台遊戲,選SDL就對了

之前安裝過SDL,那時候還不太瞭解她厲害在哪,說她是迷你版的DX真的太小看她了,WIKI:SDL是一套開放原始碼的跨平台多媒體開發函式庫,使用C 語言寫成,提供了數種控制圖像、聲音、輸出入的函式,讓開發者只要用相同或是相似的程式碼就可以開發出跨多個平台的應用軟體,多用於開發遊戲、模擬器、媒 體播放器等多媒體應用領域。

原本以為只能跨PC平台,想不到連手機也可以,而且SDL只是一個API使用起來非常方便沒啥限制,目前還有Python的版本,不過效率真的會變太低,還是用C的就好,這裡有完整的SDL教學,從安裝到、動畫製作都有,作者仔細到各個平台、各種編譯環境都有介紹,雖然是用英文寫但是用字潛顯易懂,是難得的好文章,而且他的範例根本是為了作遊戲才出現的,對於想瞭解製作遊戲的基本技巧的人很適合。

之後在試試看跟Squirrel、tk、Ogre結合,另外timer也可以用Boost內建的來寫,到底會變成什麼樣子呢=W=

來喔~好用的Boost喔

常常看到有人在抱怨C++的標準庫內容不夠實用,看看JAVA、Pythov、Ruby不只可以貼圖放音樂,連GUI都是內建的!

好吧,其實那是因為平常用的C++只是皮毛,大家認為的C++的標準函式庫其實只是核心庫,真正的標準內容其實是在Boost!!!!!

簡 單來說,那些用來貶低C++功能不健全的其他語言,其內容、靈感都是源自於Boost,甚至編譯器都是用C寫得...,唉壓壓C++雖然難寫但果然還是最 強啊,搞了半天原來Boost<什麼都有>只是門檻稍高,不過光是編譯就耗了我一段時間,官方文件寫了一堆廢話讓人越看越不懂,要是用 Unix-like的系統大概早就放棄了,不過現在已經編到正則表達式了,嗯~~狀態不錯到現在只花了18分鐘,真是狀大的函式庫啊哈哈。

到底Boost能做什麼還是看這裡比較清楚,太多了懶得講~"~,趕緊練習去~~~

Doxygen產生說明文件

終於有時間仔細一下Doxygen的文件了,先不論註解的撰寫方式,光是組態檔的設定就令人眼花撩亂啊,全部的設定都看完後想來作一個基本功能的組態檔,這樣以後要用比較方便,只要改一改路徑就好了。

DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = "project_name"
PROJECT_NUMBER = 1.1.1
PROJECT_BRIEF = "By Fnaith"
#PROJECT_LOGO = {C:/src/}src{n}/{img}/{icon}/{logo.png}#h<=55,w<=200
OUTPUT_DIRECTORY = project_name_document
CREATE_SUBDIRS = YES
OUTPUT_LANGUAGE = English
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ABBREVIATE_BRIEF = "The $name class" \
"The $name widget" \
"The $name file" \
is \
provides \
specifies \
contains \
represents \
a \
an \
the
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = YES
FULL_PATH_NAMES = YES
STRIP_FROM_PATH = $(SRC_DIR)
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
QT_AUTOBRIEF = NO
BUILTIN_STL_SUPPORT = NO
CPP_CLI_SUPPORT = NO
SIP_SUPPORT = NO
DISTRIBUTE_GROUP_DOC = NO
MULTILINE_CPP_IS_BRIEF = NO
INHERIT_DOCS = NO
SEPARATE_MEMBER_PAGES = NO
TAB_SIZE = 8
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
OPTIMIZE_FOR_FORTRAN = NO
OPTIMIZE_OUTPUT_VHDL = NO
SUBGROUPING = YES
INLINE_GROUPED_CLASSES = NO
TYPEDEF_HIDES_STRUCT = NO
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = NO
EXTRACT_ANON_NSPACES = NO
EXTRACT_LOCAL_METHODS = NO
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_CLASSES = NO
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = NO
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = YES
SORT_BRIEF_DOCS = NO
SORT_GROUP_NAMES = NO
SORT_BY_SCOPE_NAME = NO
SORT_MEMBERS_CTORS_1ST = NO
GENERATE_TODOLIST = NO
GENERATE_TESTLIST = NO
GENERATE_BUGLIST = NO
GENERATE_DEPRECATEDLIST= NO
MAX_INITIALIZER_LINES = 30
SHOW_USED_FILES = YES
SHOW_DIRECTORIES = YES
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO
WARN_FORMAT = "$file:$line: $text"
INPUT = C:\src\class.h #\
# = C:\src\author.cpp \
# = C:\src\qtstyle.cpp \
# = C:\src\templ.cpp
INPUT_ENCODING = UTF-8
FILE_PATTERNS = *.c \
*.h \
*.cpp \
*.hpp
RECURSIVE = YES
#EXCLUDE = $(SRC_DIR)/img
EXCLUDE_SYMLINKS = NO
EXAMPLE_RECURSIVE = NO
#IMAGE_PATH = $(SRC_DIR)/img
FILTER_SOURCE_FILES = NO
SOURCE_BROWSER = YES
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
REFERENCES_LINK_SOURCE = YES
VERBATIM_HEADERS = NO
USE_HTAGS = NO
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 5
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_TIMESTAMP = YES
HTML_ALIGN_MEMBERS = YES
HTML_DYNAMIC_SECTIONS = NO
GENERATE_DOCSET = YES
DOCSET_FEEDNAME = "Fnaith's Project"
GENERATE_HTMLHELP = NO
GENERATE_CHI = NO
BINARY_TOC = NO
TOC_EXPAND = NO
GENERATE_QHP = NO
SEARCHENGINE = YES
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = YES
TREEVIEW_WIDTH = 250
GENERATE_LATEX = NO
GENERATE_RTF = NO
GENERATE_MAN = NO
GENERATE_XML = NO
GENERATE_AUTOGEN_DEF = NO
GENERATE_PERLMOD = NO
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
SKIP_FUNCTION_MACROS = YES
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
CLASS_DIAGRAMS = YES
HAVE_DOT = YES
DOT_NUM_THREADS = 0
#DOT_FONTNAME = $(SRC_DIR)/fong/fong.ttf
DOT_FONTSIZE = 10
#DOT_FONTPATH = $(SRC_DIR)/fong/
CLASS_GRAPH = NO
COLLABORATION_GRAPH = NO
GROUP_GRAPHS = NO
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
HIDE_UNDOC_RELATIONS = YES
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = YES
CALLER_GRAPH = YES
GRAPHICAL_HIERARCHY = NO
DIRECTORY_GRAPH = YES
DOT_GRAPH_MAX_NODES = 25
MAX_DOT_GRAPH_DEPTH = 2
DOT_IMAGE_FORMAT = png
DOT_TRANSPARENT = YES
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = YES
DOT_CLEANUP = YES

本來想使用相對路徑的,不過仔細想一想,這其實還要配合各個專案內容的配置,而且必須把設定直接寫在被註解的檔案內,感覺難以更改所以就先算了,改天再來設定Icon跟配色,這樣我的說明文件也可以美每的=W=

附上Doxygen的教學好站可能要換一下編碼方式喔