星期日, 四月 05, 2009

IE很任性

最近在寫ajax(javascript、DOM)的網頁,需要依使用者不同的選擇更新網頁文字內容(節點)

opera、Firefox都直接兩行解決:



tnode = "xmldoc.getElementsByTagName("foo")['0'].hasChildNodes().data"; //從XML產生文字節點

current.replaceChild(tnode,current.firstChild); //把舊的文字節點換成新的


但是碰到IE(我是用IE8測試)就會叫說節點不存在。
可能是XML剛好是空的(第一行),或是第一次執行所以沒有舊的文字節點(第二行)。臨時只想到用hasChildNodes()做檢查,然後code就變的好糟糕:

 


while(current.hasChildNodes())
{
current.removeChild(current.firstChild);
}

if(xmldoc.getElementsByTagName("foo")['0'].hasChildNodes())
{
tnode = document.createTextNode(xmldoc.getElementsByTagName("fax")['0'].firstChild.data);
current.appendChild(tnode); 
}


不知道有什麼好方法:q

星期日, 一月 04, 2009

phoneME advanced Garbage Collector

一、Build Options

-CVM_GCCHOICE (Generational/marksweep/semispace)
Default: generational
Example:-CVM_GCCHOICE=semispace

二、Runtime Options
-Xgc:gc_specific_options(In generational is youngGen=nnn in bytes)
Default: 1M

-Xmssize (memory allocation pool)
Default: 4M
Example: -Xms6291456, -Xms6144k, -Xms6m

三、Source Organization

  • src/share/javavm/include/gc_common.h:The shared GC interface.
  • src/share/javavm/include/gc/gc_impl.h :The gcimpl GC interface that has to be implemented for each GC.
  • src/share/javavm/include/gc//gc_config.h :The configuration file for a specific GC.
  • src/share/javavm/runtime/gc//gc_impl.c :The implementation file for a specific GC.

四、Execution Flow

  1. CVM allocates memory using the shared routine CVMgcAllocNewInstance().
  2. CVMgcAllocNewInstance() does some processing and calls the GC-specific
    CVMgcimplAllocObject() to allocate the actual space for the object.
  3. CVMgcimplAllocObject() performs the GC and calls the shared routine
    CVMgcStopTheWorldAndGC() to stop all threads at GC-safe points.
  4. CVMgcStopTheWorldAndGC() ensures that all threads rendezvous at GC-safe points. When that is done, it calls the GC implementation CVMgcimplDoGC() to perform the GC action.
  5. CVMgcimplDoGC() may call shared GC service routines to scan GC state: For example, CVMgcScanRoots() to scan all roots or CVMobjectWalkRefs() to scan the pointers in a given object or array.
  6. When CVMgcimplDoGC() returns, all threads that were stopped at GC points resume execution. Eventually, CVMgcAllocNewInstance() returns and the thread that originally initiated GC resumes execution.


五、測試

make clean; (win32 makefile有問題)
make CVM_GCCHOICE=[semispacegenerationalmarksweep]
bin/cvm -cp testclasses.zip HelloWorld;
bin/cvm -XshowBuildOptions;

六、reference

CDCfoundation_porting_guide.pdf

phoneME advanced 編譯筆記

一、JavaME CDC小簡介

從JavaME CDC的全名"Java Micro Edition Connected Device Configuration",可以大致看出他的特性。更進一步的介紹可以參考Sun官方網站,以及wikipedia的介紹。遠祖可以追朔到Personal Java(1999)。

JavaME CDC歷代版本(2001-2007):

  • CDC1.0 (based on JavaSE1.3)
  • CDC1.0.1 (based on JavaSE1.3.1)
  • CDC1.1 (based on JavaSE1.4)

此後設立open source專案,名為phoneME Advanced,基於JavaME CDC1.1,相關資訊可以參考phoneME官方網站(CDC是"phoneME Advanced",不是"phoneME Feature",不要搞錯啦!)。

目前Sun官方的JavaME CDC source code已無法自由取得,網路尚能取得最新的版本為CDC1.0.1,相關資訊及編譯筆記可以參考這篇。如果沒有特殊需求還是從phoneME Advanced入門是比較好的選擇。

二、編譯 phoneME advanced (Linux/x86)

如果是在Linux/x86環境,參考phoneME Advanced MR2 Getting Started Guide中的文章:Build Recipe: Linux/x86 Host Environment 應該可以順利完成。如果發生問題通常是相關工具程式沒有裝好設好。

第一個常碰到的問題是phoneME advanced MR2基於JavaME CDC1.1,意思是說要用JDK1.4才行!在編CDC1.0.1時我試過用JDK1.5/1.6在編譯時指定為1.4相容,但還是過不了。結論就是請用"Sun" JDK "1.4"。

第二問題繼承第一個問題。目前大部分GNU/Linux distribution內建的JRE/JDK為IceTea之類的,要設定換成Sun JDK 1.4才行。一般用update-alternates就能完成,但是常常只有設定java和javac,忘記"javah"!這個會用到。

第三個問題是phoneme advanced的Makefile寫的不太好,如果不是放在根目錄處理(e.g. /phoneme_advanced_mr2)可能會發生問題。(phoneme_advanced-mr2-dev-src-b97-20_nov_2008.zip有這個狀況。)

三、編譯 phoneME advanced (Win32/x86)

phoneME沒有提供Win32-x86的bundle release,要自己到 code repository抓。

編譯環境從無到有,過程簡單列表如下:

  1. 裝jdk1.4; 設定path(check java, javac, javah)
  2. 裝cywin and packages(binutils, bison ,diffutils ,flex ,gcc-g++ ,make ,perl ,subversion ,zip)
  3. 裝VC2005(VC8) express版 + win2003R2 platformSDK,或VC2005標準版(內建platformSDK) ;記得用windows update更新

編譯過程和Linux/x86差不多,值得注意的是win32-x86的Makefile好像有bug,在改某些Makefile flag時要先make clean,不能像Linux可以直接改。

星期三, 十一月 12, 2008

Java bytecode

java原始碼(.java)在經過java compiler(javac)編譯後形成bytecode(.class),再使用java virtual machine(JVM)直譯或JIT為physical machine code。java bytecode實際上就是由一串bytes所組成,可使用HEX editor檢視。


一. bytecode標準
可參考JVM Specification(http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html):
chapter4 "The class File Format" 以presudo code說明byte code格式。
chapter6 "The Java Virtual Machine Instruction Set"說明JVM opcode。


對照以上內容可使用HEX editor自行撰寫bytecode再以JVM執行。




二. java組合語言
相較於C編譯為assembler再組譯為machine code執行,如果將JVM視為physical machine,java bytecode相當於machine code的地位。但在java原始碼和bytecode之間,sun沒有定義標準的java assembler。

jasmin(http://jasmin.sourceforge.net/)是一個java assembler(非標準),相較於直接編輯bytecode,可以先撰寫jasmin再組譯為byecode較為容易。


JDK也提供一個bytecode類反組譯器,可將bytecode轉為ascii code,說明如下:

指令javap -c employeeName

employeeName.java內容
==========================================
public String employeeName()
{
return name;
}

==========================================

執行結果
==========================================
Method java.lang.String employeeName()
0 aload_0
1 getfield #5
4 areturn
==========================================


以 javap 列出來的內容對照 JVM spec可瞭解 JVM instructions 的用途以及 class file format。


三. 參考資料:

[1] Java bytecode: Understanding bytecode makes you a better programmer
http://www-128.ibm.com/developerworks/ibm/library/it-haggar_bytecode/

[2]JVM Specification
http://java.sun.com/docs/books/jvms/second_edition/html/VMSpecTOC.doc.html

[3]jasmin
http://jasmin.sourceforge.net/

[4]Decompiling Java
http://www.tenlong.com.tw/Read/readForm.php?i=16

[5]A Working Developer`s Guide to Java Bytecode
http://www.strongd.net/blog/show/75

星期三, 十一月 05, 2008

boats and birds


I Live To Let You Shine from Karen Abad loves Dinosaurs. on Vimeo.

星期三, 十月 29, 2008

Build Sun CDC1.0.1 in Ubuntu

這個版本(14_May_2002)的JavaME CDC開發環境為Redhat7.1/JDK1.3.1/egcs6,在Ubuntu上有很多水土不服的現象。這份筆記可以給想要考古的人一些參考。


I. source code
j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip
可於http://jtrue.pl/files/GPS/取得
這是我目前可以取得最新版本的Sun官方source code(原因有空再講)

II. Environment
以下分別列出原本的開發環境,與本篇所使用的環境

Redhat7.1 / Ubuntu 6.06
JDK1.3 / JDK1.4 
egcs6 / gcc3.3 and related C develop tool
ksh


III. Troubleshooting

問題一:
This Version's java code is based on JavaSE 1.3.1,JDK6即使使用javac -source 1.4或1.3還是會發生錯誤訊息如下:
../../src/share/classes/java/lang/SecurityManager.java:299: cannot find symbol
symbol : method initCause(java.lang.ClassNotFoundException)
location: class java.lang.NoClassDefFoundError
  synchronized(SecurityManager.class) {
  ^
解法:目前唯一解就是downgrade用JDK1.4或JDK1.3

問題二:GCC4 is restricted for nonstandard C code in this Version

錯誤訊息:
complie time Error:
Checking for test classes to compile ...
... ../../build/linux-i686/obj/globals.o
../../src/share/javavm/runtime/globals.c:121:1: 錯誤: 粘貼「.」和「nullClassLoaderLock」不能給出一個有效的預先處理識別字


解法:需安裝GCC3.3,如果本來是使用有裝GCC4,gcc -V3.3 指定使用V3.3
change line 117 of /cdcfoundation/src/share/javavm/runtime/globals.c from
#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals.##mutex, name}
#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals. mutex, name}
http://blog.csdn.net/huangqiqun/archive/2006/12/18/1447671.aspx

問題三:glibc <2.2 is needed in this Version,會在Linking Time發生錯誤訊息如下:

Linking ../../build/linux-i686/bin/cvm
../../build/linux-i686/obj/UNIXProcess_md.o:在函式「sigchld_handler」中
:../../src/linux/native/java/lang/UNIXProcess_md.c:213: 未定義參考到「
__libc_wait」
collect2: ld 回傳 1
make: *** [../../build/linux-i686/bin/cvm] Error 1

解法:

patch ../../src/linux/native/java/lang/UNIXProcess_md.c
34,53c34

< /* following lines Hacked by Kent Hulick based on
< * ftp://people.redhat.com/drepper/libcwait.c
< * fixes a broken calls to a removed glibc function:*/
< #include
< #include
< pid_t __libc_wait (int *status)
< {
< int res;
< asm volatile ("pushl %%ebx\n\t"
< "movl %2, %%ebx\n\t"
< "movl %1, %%eax\n\t"
< "int $0x80\n\t"
< "popl %%ebx"
< : "=a" (res)
< : "i" (__NR_wait4), "0" (WAIT_ANY), "c" (status), "d" (0),
< "S" (0));
< return res;
< }

--
http://forums.sun.com/thread.jspa?threadID=610934&tstart=555

IV. Preparation&Configure

#sudo su //root
#cd /usr/local/src //anywhere you want to play around
#wget http://jtrue.pl/files/GPS/j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip //download source bundle
#unzip j2me_cdcfp-1_0_1-fcs-src-b12-linux-i686-14_May_2002.zip //extracting cdcfoundation-1_0_1-fcs-src.zip and cdcfoundation-1_0_1-fcs-doc.zip
#unzip cdcfoundation-1_0_1-fcs-src.zip //extracting cdcfoundation
#cd cdcfoundation/build

edit following Makefile
#vi ./linux/defs.mk
./linux/defs.mk:#petertc1026
./linux/defs.mk-#CFLAGS_SPEED = -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPEED) $(CPPFLAGS)
./linux/defs.mk-#CFLAGS_SPACE = -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPACE) $(CPPFLAGS)
./linux/defs.mk-#SO_CFLAGS = -c $(SO_CC_ARCH_FLAGS) $(CCFLAGS) $(CPPFLAGS)
./linux/defs.mk-CFLAGS_SPEED = -V3.3 -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPEED) $(CPPFLAGS)
./linux/defs.mk-CFLAGS_SPACE = -V3.3 -c $(CC_ARCH_FLAGS) $(CCFLAGS) $(CCFLAGS_SPACE) $(CPPFLAGS)
./linux/defs.mk-SO_CFLAGS = -V3.3 -c $(SO_CC_ARCH_FLAGS) $(CCFLAGS) $(CPPFLAGS)

#vi ./share/defs.mk
./share/defs.mk:#petertc1026
./share/defs.mk-#CVM_GNU_TOOLS_PATH=/micro/tools/i686-redhat-linux/gnu/bin
./share/defs.mk-CVM_GNU_TOOLS_PATH=/usr/bin

patch source code
edit /usr/local/src/cdcfoundation/src/share/javavm/runtime/globals.c:117
//petertc1026
/*#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals.##mutex, name}*/
#define CVM_SYSMUTEX_ENTRY(mutex, name) {&CVMglobals. mutex, name}

edit /usr/local/src/cdcfoundation/src/linux/native/java/lang/UNIXProcess_md.c:213
34,53c34

< /* following lines Hacked by Kent Hulick based on
< * ftp://people.redhat.com/drepper/libcwait.c
< * fixes a broken calls to a removed glibc function:*/
< #include
< #include
< pid_t __libc_wait (int *status)
< {
< int res;
< asm volatile ("pushl %%ebx\n\t"
< "movl %2, %%ebx\n\t"
< "movl %1, %%eax\n\t"
< "int $0x80\n\t"
< "popl %%ebx"
< : "=a" (res)
< : "i" (__NR_wait4), "0" (WAIT_ANY), "c" (status), "d" (0),
< "S" (0));
< return res;
< }


V. build&demo
#cd linux-i686/
#make CVM_DEBUG=true JAVABIN=/usr/java/j2sdk1.4.2_18/bin
//zzz...
//Done Linking ../../build/linux-i686/bin/cvm!
# bin/cvm -Djava.class.path=testclasses.zip HelloWorld
> GC[SS]: Initialized semi-space gen for generational GC
> Size of *each* semispace in bytes=1048576
> Limits of generation = [0xb7942200,0xb7b42200)
> First semispace = [0xb7942200,0xb7a42200)
> Second semispace = [0xb7a42200,0xb7b42200)
> GC[MC]: Initialized mark-compact gen for generational GC
> Size of the space in bytes=3145728
> Limits of generation = [0xb7b42200,0xb7e42200)
> GC[generational]: Auxiliary data structures
> heapBaseMemoryArea=[0xb7942008,0xb7e42208)
> cardTable=[0x8322f90,0x8325790)
> objectHeaderTable=[0x8325798,0x8327f98)
> summaryTable=[0x8327fa0,0x8331fa0)
> Hello world.

星期日, 十月 19, 2008

兩則JavaME馬路消息

1. Sun release Java Platform Micro Edition Software Development Kit 3.0 Early Access。



Java ME Platform SDK is a state-of-the-art toolbox for developing mobile applications. It integrates CLDC, CDC and Blu-ray Disc Java (BD-J) technology into one SDK. Java ME SDK 3.0 is the successor to the popular Java Wireless Toolkit 2.5.2 and Java Toolkit 1.0 for CDC. It provides device emulation, a standalone development environment and a set of utilities for rapid development of Java ME applications.

此版本整合了CDC、CLDC的開發環境,不過BD-J是什麼鬼不太清楚,windows only。目前還不太實用:無法與eclipse整合(NetBeans大概可以),對在linux上得開發者來說更別無選擇使用WTK for CLDC




可以預期的好處是,只要出linux版,順便也可以在linux上開發CDC了。目前JavaTK for CDC也是windows only...




2. EclipseME has grown into the the Eclipse Foundation Mobile Tools for Java (MTJ) project.

EclipseME原本只能玩CLDC,EclipseMTJ支援CDC,兩家整合後對各家廠商支援度應該會更好。

星期日, 九月 07, 2008

張季雅:帶我去球場

【作者簡介】張季雅,1988年生,雲林縣斗六市人。自《挑戰者月刊》舉辦之「投稿戰場1985」活動脫穎而出,於同誌正式出道。熱愛漫畫與棒球。


帶我去球場(斗六球場、花蓮球場)
http://www.comibook.com/read.php?art_id=230

帶我去球場-【新竹市立中正棒球場】忘卻的熱情
http://www.comibook.com/read.php?art_id=178

帶我去球場-【台南市立棒球場】我們迷獅子-前篇
http://www.comibook.com/read.php?art_id=172

帶我去球場-【台南市立棒球場】我們迷獅子-後篇
http://www.comibook.com/read.php?art_id=173

帶我去球場-【台北市立棒球場】不連續的記憶
http://www.comibook.com/read.php?art_id=179

帶我去球場-【台中棒球場】留下的理由-前篇
http://www.comibook.com/read.php?art_id=386

帶我去球場-【台中棒球場】留下的理由-後篇
http://www.comibook.com/read.php?art_id=388

有沒有TML版本的呀(淚)

星期三, 八月 27, 2008

SQLWays - Database Migration Tool

最近要將一個用oracle作為DBMS的資料庫轉移到Mysql上面。


查了一下資料,大部分的人做的事都是mysql -> oracle,這比較好解決,畢竟一般來說oracle會比mysql強一點(像是trigger mysql5才有)。當然也是cost和performance的考量啦。最後在builder.com.cn找到一篇『Oracle移植到MySQL注意事项』(作者佚名,很酷)。這篇大致上講了一下兩邊DDL的差別,但實做流程看來還是要自己手工硬幹的。

後來在硬幹的過程中發現好像有個很神的軟體可以做這件事,叫做SQLWays,號稱data、schema、functions、triggers都能轉,而且也支援市面上絕大部分的DBMS(IBM DB2, Oracle, Microsoft SQL Server, Sybase, Informix, MySQL, PostgreSQL, Progress...)。抓下來試用一下,因為他是用ODBC連database,而且我已經硬幹的差不多了,就沒試這部份了。只試用了他的SQL converter。

SQLWays的SQL converter介面蠻簡潔的,就左邊貼source,選source DBMS,右邊選target DMBS,target SQL就跑出來了。

簡單的SQL他應該都可以幫你轉好啦,for example:

SELECT COUNT (NO) FROM BANKINFORM WHERE BANKINFORM.END_TIME >= SYSDATE-7 AND BANKINFORM.BEGIN_TIME <= SYSDATE

經過轉換就會變成:

SELECT COUNT(`NO`) FROM BANKINFORM WHERE BANKINFORM.END_TIME >= CURRENT_TIMESTAMP -7 AND BANKINFORM.BEGIN_TIME <= CURRENT_TIMESTAMP;

但是在用的時候也有發現問題,像是這段code:

SELECT to_char(TIME,'MM/DD') AS TIME, (DEPOSIT-WITHDRAWAL) AS TOTAL,MEMO FROM TRANSACTION_ACCT WHERE TRANSACTION_ACCT.ACCOUNT_NO ='49421045' ORDER BY TO_NUMBER(TRANSACTION_ACCT.NO) DESC

他轉出來的丟到mysql client commend會錯誤:

SELECT STR(`TIME`,'MM/DD') `TIME`,(DEPOSIT -WITHDRAWAL) TOTAL,MEMO FROM TRANSACTION_ACCT WHERE TRANSACTION_ACCT.ACCOUNT_NO = '49421045' ORDER BY CAST(TRANSACTION_ACCT.`NO` AS unsigned) DESC;

正確的SQL:

SELECT DATE_FORMAT(TIME,'%m/%d') AS "TIME", (DEPOSIT-WITHDRAWAL) AS "TOTAL",MEMO FROM TRANSACTION_ACCT WHERE TRANSACTION_ACCT.ACCOUNT_NO ='49421045' ORDER BY CAST(TRANSACTION_ACCT.NO AS SIGNED) DESC

使用上一些要注意的地方:

1.SQL一定要以分號(;)結尾,要不然他會一直說你寫錯,我試好幾次才知道問題在這裡。

2.因為Mysql是case sensitive的,和oracle不同。這在下SQL的時候會發生問題,如果之前大小寫沒統一的話。這是sematic的東西電腦不可能幫你轉,我的作法是把SQL貼到editor直接全部轉大寫再丟到SQLWays的converter去轉。

有空再寫整個porting的心得好了




星期二, 八月 05, 2008

慣性感應器(G-sensor)在相機的application

今天在整理相片的時候,覺得把直照的照片轉正實在是一件很麻煩的事。(而且我的老電腦要做JPEG lossless rotation又很慢= =)弄一弄,突然想到要是相機能內建慣性感應器(G-sensor)就好了。

如果相機內建G sensor,當相機向左或向右轉90度,也就是直立照相時,相機就可以在EXIF寫入這張照片的正確方向,或以直立方式存檔(3:2,如果不是用panasonic LX2之類是奇怪的16:9的話),不用使用者再傳到電腦上調整了。這種制式化的動作就該交給電腦來做呀!

小小idea,可以方便很多呢!很期待這樣的相機出現:p
硬體畢竟不像軟題,自己想做就做的出來呀...

目前最快的方法是去弄台iphone吧xd 不知道他的API可不可以讀寫G-sensor和exif的資料。