2013年9月19日 星期四

[Android] Zygote, Dalvik and JVM

Android 系統開啟時 由 init.rc 來啟動外部程式

其中 Zygote 是 Android 的 monitor process,負責:
1. Listening Socket (Forking child process, 執行 Android 應用程式)
2. Preload Resource
3. Preload Class
4. Start System Server
5. Enter Zygote Fork Mode

「System Server」是由 Zygote 所建立的另外一個 process
  • 建立的方式是使用典型的 Linux system call - fork()
  • 當 Zygote 成功建立 system server 後,便進入 socket listening 模式。在此模式下,zygote 會監聽(listen)由 socket 所傳入的「命令」,並依據命令的內容啟動 Android 應用程式

「Zygote Mode」: 在 socket 做 listening,並依據命令來 fork() 並執行外部 Android 應用程式。


Dalvik VM Class preloading 
  • 與 JVM 最大的不同是,Dalvik VM 透過 Zygote 進行「Class Preloading」,是 Dalvik VM 最重要的特色之一。
  • 意思是,把絕大部份的「Java class file」載入記憶體。
  • Java class file 被打包成 *.jar 檔,Java class file 就是 Java library,提供 Android 應用程式與框架所需的 API。
  • 所載入的 class file,幾乎包含所有的 API,當然,大部份自已都用不到,因此稱之為「preload」,也就是「預載」。
  • 透過 preload,讓 Android 應用程式在載入時,不需要重覆「class loading」的動作,除了加快應用程式啟動速度外,也達到許多效果。
  • 在 Android 裝置開機時進行,可能產生的不良效應之一就是「開機變慢」,不過,已經有一些方法可以解決這個問題。


* Reference
- Jollen 的 Android 觀念解析, #1: Zygote Mode
- Dalvik VM 與 JVM 差異比較:Zygote 與 Class Preload

marshalling/unmarshalling

傳遞變數的過程。

在不同機器間通過網路傳遞變數(包括Java基本類型和物件),如果目的機器表示資料的方式和原機器不同(ex: 二進位庫),就必須轉譯變數(ex: 序列化),marshalling/unmarshalling 就是傳遞變數的過程。



* Reference
- Java RMI-IIOP - ulinaboy 的部落格 - udn部落格

2013年9月18日 星期三

[Struts2] Interceptor

struts2 重點在於加入 MVC
所以 interceptor 是和 struts1 很大的不同處


struts2 中有預設的 interceptor
package struts-default
name defaultStack

當我們的 package extends struts-default 就繼承了 struts-default 中的所有設定!


ActionInvocation: 包裝所有與 Action 執行有關資訊的物件
在開發 interceptor 時,我們並不會直接的與 ActionInvocation 物件互動,而是間接的與 ActionInvocation 有關係!
當我們的 framework 接收到一個使用者的 request 時,Struts2 framework 會根據使用者呼叫的 URL 來 mapping 所對應的 Action,並將此 Action 的相關資訊加入到 ActionInvocation 物件中,接著 Struts2 framework 就會搜尋所有 configuration file 中的所有 interceptors 並且加到 ActionInvocation 中,幫助 ActionInvocation 走訪所有的 interceptors。



    
    
        
    
     .......

    
    
        
    

    
    
        
            dojo\..*        
    
      ..........     





    
    
    /WEB-INF/pages/finish.jsp



* Reference
- [Struts2] Introduce Interceptor
- [Struts2] 宣告與設定 Interceptors
- [Struts2] 深入探討 Interceptor

2013年9月3日 星期二

[JPA] Note

<tx:jta-transaction-manager>
觸發系統去找 JTA Transaction Manager


singulatAttribute 
A extends B, if B 中的屬性不是基本型別 在 A 中無法識別 所以 singulatAttribute 要寫在 A 中 寫在 B 中無效

embedded object 必須宣告在 child's metamodel


namedQuery
server 開啟後便會執行 像是函數 只要有參數就能直接執行
不能做子查詢
不能使用 like


entityManager.detach(Object);
和 Object 脫鉤


construct
建立物件時 只取出其中某些欄位
criteriaQuery.select(builder.construct(
    User.class,
     root.get(User_.name)
))


boolean attribute 
預設是 insert 0/1
加上 @Type(type = "yes_no") 則 insert Y/N


A join B
In A, if joinColumn is not primary key JPA not allowed lazy fetch.


@filterDef
filter join 後的結果

2013年9月2日 星期一

[Java] Not a Number (NaN)

NaN - Not a Number 表示非定義的數字

ex:
0.0 / 0 (被 0 除的結果)
0.0 / 0.0

不論是和數字或是和 NaN 都不能用關係運算子做比較(<, <=, >, and >=)

Double.isNaN()/Float.isNaN()


* Reference

[SQL] ORA-00937:非單組分組函數

Error

ORA-00937:非單組分組函數


Solution

如果 select 了一個分組函數,其它也必須是分組函數,否則就出錯。這是語法規定的

ex:

select min(sal), max(sal) from emp;



* Reference
- 韓順平老師Oracle教程筆記——網摘_StackDoc

[Android] View API

setPivotX(0)
圖上的位置 非螢幕上位置


getLeft
relative parent 從 parent 上算來的位置 (由 parent's top and left 為初始)


[Android] The key must be an application-specific resource id.

Error

E/AndroidRuntime(15393): java.lang.IllegalArgumentException: The key must be an application-specific resource id.


Solution

新增 id resource

使用此 resource 作為 key 以確定為 unique.


[Web] Note

disable
設為 true 欄位值不會被送出




< form:input path= "name" value = "${name}" ${xxx ?  "disabled='disbaled'" : ""}  />




value
沒有 value 不會觸發 setXXX 用 getParameter 會取到 null
value="" 會送空的
value 會送null


url mapping
"/{" + ATTRIBUTE_PACKAGE_NAME + ":.+}"


htmlEscape
true = render(escape?) to html
false = show the text

[JQuery] API


:first 


.prev()      


  
$(selector1).find(selector2);      


$(selector1).filter(selector2);  



$(selector).length 


$(selector).eq(i)  


$("p").insertBefore("#foo") = $("#foo").before("p")   



* Reference
- jQuery基础---filter()和find()
- Difference Between Filter() And Find() In JQuery

[Web] enum form value

Error

<form:radiobutton value="enum type object">

post 時發生 mistypematched exception



Solution

<form:radiobutton value="enum.toString">

因為 enum 會被 toString


http param string <-> enum name