這些文章屬於 '程式筆記' 類別

全形空白

Thursday, July 24th, 2008

PHP 下處理全形空白的筆記

繼續閱讀 »

Mac 下開發 Firefox Addon 筆記

Friday, June 20th, 2008

主要參考這篇來進行: Building an Extension-MDC 

Firefox/Thunderbird Extension Wizard : 先產生一份 extension framework (helloworld.zip)。 解開之後,build.sh 要改下面這些東西

1.

mkdir --parents --verbose $TMP_DIR/chrome

改成

mkdir -p -v $TMP_DIR/chrome

2.

cp --verbose --parents $FILES $TMP_DIR

改成

cp -v -p $FILES $TMP_DIR

3.

cp --verbose $ROOT_FILE $TMP_DIR

改成

cp -v $ROOT_FILE $TMP_DIR

4. 也可能會有下述的錯誤訊息

sed: 1: "s/^(content\s+\S*\s+)(\ ...": \1 not defined in the RE

sed: 1: "s/^(skin|locale)(\s+\S* ...": \1 not defined in the RE

這是 sed 處理內,\\1 似乎 backslash 處理不好,

sed -i -r s/^\(content\\s+\\S*\\s+\)\(\\S*\\/\)$/\\1jar:chrome\\/$APP_NAME\\.jar!\\/\\2/ chrome.manifest

sed -i -r s/^\(skin\|locale\)\(\\s+\\S*\\s+\\S*\\s+\)\(.*\\/\)$/\\1\\2jar:chrome\\/$APP_NAME\\.jar!\\/\\3/ chrome.manifest

一直調不好,只好這兩行改用 perl 處理

perl -i -pe 's/^(content\s+\S*\s+)(\S*\/)(\s+\S*\s*)$/\1jar:chrome\/'$APP_NAME'\.jar!\/\2\3/' chrome.manifest

perl -i -pe 's/^(skin|locale)(\s+\S*\s+\S*\s+)(.*\/)$/\1\2jar:chrome\/'$APP_NAME'\.jar!\/\3/'   chrome.manifest

 

 

◎ 在測試 (Test) 的情形下,不用每次都重新建立 helloworld.xpi,安裝再重開 Firefox.

  1. 在 ~/Library/Apllication Suppor/Firefox/Profiles/ 目錄,會有類似 <xxxyxxy>.default 的目錄,其中 <xxxyxxy> 名稱每次新增都會不一樣。
  2. 在該目錄下的 extensions 目錄新增一個檔案,該檔名為 extension 的 ID,可在 install.rdf 內的 <em:id> 內找到,比如 helloworld@derjohng.sun
  3. 比如
     ~/Library/Apllication Suppor/Firefox/Profiles/xxxyxxy.default/extensions/helloworld@derjohng.sun
  4. 該檔案內填入,你在開發的 extension 的目錄位置。
  5. 這樣改完程式,重開 Firefox 即可。
  6. 原本 Extension Developer Addon  有「Reload Chrome」可以不用重開 Firefox,但我每試必當掉,所以,只好改用另一個 QuickRestart Addon  來重開了。

 

◎ 在 GreaseMonkey 開發的 Script 可以藉由 User Script Compiler  轉換成 Firefox Addon。

 

◎ 在 Firefox2 下寫好的 Addon,轉到 Firefox3 下執行,Error Console 可能會有下列的訊息,

Security Error: Content at ********** may not load or link to chrome://helloworld/skin/hellow.png

只要在 chrome.mainifest 原來的

content    helloworld    content/

加上 contentaccessible=yes 即可

content    helloworld    content/   contentaccessible=yes

 

◎ 這裡有關於開發 Addon 的簡體中文版 。

 

XULRunner  是個蠻好玩的東西

可以用做 Firefox Addon 的相同架構,用 XUL 和 Javascript 就可以做成應用程式,比如 Chatzilla on XULRunner 。就是和 Adobe AIR 相同概念的東西。

◎ Addon 開發,如何有新的版本,如何發布更新機制,有二種方法:
一種是放在 https 的 secure web server 下,這又分兩種

  • 一是放到 Mozilla 下,但一開始放在實驗並不提供下載,等到有人「查核」,才會開放。
  • 一是自己要有 https 伺服器,這種在 webhosting 很貴,而自己架 self-CA 的話,在 Firefox3之後,這種是不准許的

另一種就是 http 但要加 hashKey  的方式,流程整理如下:

  • 安裝 McCoy 軟體
  • 新增一個 Key
  • 在 Addon 包裝成 xpi 前,用McCoy 的「Install」選單將公開 Key 放到 Install.rdf.
  • 包裝成 xpi
  • 準備好 update.rdf 的描述檔,內容要指定到上述包裝好的 xpi,並放在一起
  • 用 McCoy 的「Sign」選單指定 update.rdf
  • 將 xpi 和 update.rdf 一起放到 install.rdf 指定的公開網址。

蠻有趣的機制

六子棋動態棋盤 for Firefox Addon

Tuesday, June 17th, 2008

最近在學 Firefox Addon 的 Coding,所以,將原來的 Greasemonkey 版的六子棋動態棋盤改成 Firefox Addon 版的。

繼續閱讀 »

jQuery and Greasemonkey Notes

Friday, April 18th, 2008

Greasemonky : 一個 Firefox/IE 下的 Addon,可以另外寫 Javascript Script 在於特定網頁的 Client 端執行。
jQuery : 一套 javascript library,用在協助做 HTML DOM element 處理。

繼續閱讀 »

Jasmin 筆記

Friday, January 11th, 2008

現在做個簡單的 Compiler,包括三個部份,scanner 用 flex/scangen,parser 用 bison/yacc/llgen,剩下 code generation 可以直接輸出 assembly code 來做,也可輸出成 JVM bytecode。我之前沒學過 assembly code,直接學學這個也不錯,概念和 x86 差不多吧。

繼續閱讀 »

Java 只有傳值,沒有傳址

Wednesday, December 26th, 2007

Java 是否有傳址 (pass by reference)?根據這裡 ,Java 是只有傳值 (Pass by value) 的,最近才搞懂的觀念 

繼續閱讀 »

Javascript && HTML

Monday, December 17th, 2007

今天遇到一個情形,所寫的某隻 Javascript 在某些版本的 IE 會沒有辦法正常執行。

繼續閱讀 »

URI scheme is not "file"

Tuesday, September 25th, 2007

Java 下,若要用 File class 來讀取 url 的話。

繼續閱讀 »

C# garbage collection 筆記

Wednesday, June 6th, 2007

最近有點被 C# 的 Garbage collection(GC) 的機制搞得有點昏頭 故查點資料整理一下。

繼續閱讀 »

在 dll 的 Dialog 內嵌個 WebBrowser 元件會有問題.

Thursday, November 2nd, 2006

Case: 在 dll 內包 WebBrowser 元件會造成當掉?

繼續閱讀 »

一個 Makefile 小錯誤

Friday, April 14th, 2006

# INCLUDE_THIRDPART = /usr/local/include/xxxx
cvars = -I. -I../../include -L../../libs -I$(INCLUDE_THIRDPART)

.cpp.o:
$(cc) -fPIC $(cdebug) $(linkdebug) $(cflags) $(cvars) $(MYFLAGS) -c $<

一個讓我 trace 有點時間的小錯誤,因為我會改變 Makefile 供其他用,而會 Comment 掉其他程式不會用的變數,比如上面 INCLUDE_THIRDPART 的變數,因而編譯的過程變成下面...

g++ -fPIC -O3 -DLINUX -Wall -L../../libs -I. -I../../include -L../../libs -I -c LibXXX.cpp

而會有類似下面的錯誤訊息,*吐血*
在搞懂是上面問題之前,我一直在想我是在做 lib 啊,怎會缺 main() 哩? 花了一段才找到,時間又這樣過了~~~

/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0×18): In function `_start':
../sysdeps/i386/elf/start.S:77: undefined reference to `main'

Takahashi Method 簡報

Wednesday, April 12th, 2006

上星期去參加 OSDC.TW 2006,看到很多人在用一種字很大,然後,說很容易產生上百張投影片,我原本在試 Perl Sporx, 但怎樣試都不太像大家在用的簡報方式,然後在一個講簡報禪 的網站,找到這篇 Takahashi Method ,但這篇好像還是沒有講到用什麼程式。

繼續閱讀 »

OSDC.TW 2006

Monday, April 10th, 2006

OSDC.TW 2006  (Open Source Development Conference) 筆記:

這兩天和熊去台北參加 OSDC 的活動,好久好久沒參加類似的活動了,真的沒想到資訊的活動也可以辦得如此讓人愉悅 ^_^ 真的是高手如雲,和他們比起來,我真的是肉腳地很~~ 但也覺得有一群傳奇瘋子在裡面當道

繼續閱讀 »

C++ 筆記:OPERATOR::AND is not an aggregate type

Wednesday, February 22nd, 2006
最近在用 enum 時,遇到一個問題,如下:
class A
{
public:
enum OPERATOR
{
AND=0,
OR
};

dosomething(int type=OPERATOR::AND);

}

這段在 VC7.1 編譯得過,但在 gcc 下就不會過了,就會呈現 'OPERATOR::AND' is not an aggregate type 的錯誤訊息了,網路上查一下得知,

Enumerators are names in the same scope where the enumeration type is declared.

所以,必需寫成如下:

class A

{

public:

enum OPERATOR

{

AND=0,

OR

};

dosomething(int type=A::AND);

}

這樣在兩個平台就都可以編譯了,但真是傷腦筋了,我倒覺得 VC7.1 的用法比較 Make Sense 哩!! 比如我想用兩組 enum type,而其中的成員命名一樣? 這要怎樣用?

class A

{

public:

enum OPERATOR

{

DISABLE=0,

ENABLE

};

enum SEARCH

{

DISABLE=0,

EXACT,

LOCAL_OPTIMIZE

};

dosomething(int search_type=A::DISABLE);

}

目前我只知道在 class 外的 enum 宣告,可以用 namespace 的方式來達到此目的,比如

namespace Sense{
enum SenseType
{
Vision, Hearing, Touch, Smell
};
}

就可以用 Sense::Vision 等..

但 class 內? 目前我還不知道,還沒有這個需要 ^_^ 有需要再研究。

C++ 筆記

Friday, February 17th, 2006
  • Alarm Clock
    • 在 Solaris 下,有時會出現 "ALARM CLOCK",然後中斷。
    • 有可能是 usleep() 等造成的? 不太確定。
    • 方法:略去 SIGALRM 的 signal.
      • signal(SIGALRM, SIG_IGN);
  • 在 DLL 內實作 template class 有煩人的 explicit instantiation 的問題...
    • 參考這裡 
    • 另一篇有關 Template 實作的文章: 這裡 ,有一段 the "traditional" way of organizing source code (declarations in *.h files, and definitions in *.cpp files) does not work with templates,所以,我看到的 template 實作似乎都是整個放在 .h 。
    • 結論在 DLL 內實作 template class 有點煩人。
  • 少用 strdup,用 new/delete
    • 這樣常常會有問題 (不知為什麼?)
      • string pSrc;
      • strdup(pTarget, pSrc.c_str());
      • free(pTarget);
    • 改用這樣就沒問題
      • string pSrc;
      • pTarget = new char[pSrc.length()+1];
      • delete []pTarget;