星期二, 2月 26, 2013

jruby中java的implements interface



好久沒有更新了,這次遇到的問題是ruby。
因為這邊沒有markdown,就直接放gist連結。
效果有點不好,所以就直接貼這邊,也可以參考放在gist的說明
有任何更動就只會在gist上更動囉。



jruby中java的implements interface

on jruby-1.6.8


implement interface的作法

如果在jruby想操作java的interface,如Runnable
直接include但不override需要的method,在還沒有執行前都是不會出現錯誤的
jruby-1.6.8 :075 > class MyRunnable
jruby-1.6.8 :076?>   include java.lang.Runnable
jruby-1.6.8 :077?> end
 => MyRunnable 
jruby-1.6.8 :078 > t = java.lang.Thread.new MyRunnable.new
 => #<Java::JavaLang::Thread:0x7a0aae8a> 
但是到執行的時候,因為沒有override method,就會出現沒有method的錯誤
jruby-1.6.8 :079 > t.start
Exception in thread "Thread-9"  => nil 
org.jruby.exceptions.RaiseException: (NoMethodError) undefined method `run' for #<MyRunnable:0x470794d4>
只要加入必要的method就好
jruby-1.6.8 :087 > class MyRunnable
jruby-1.6.8 :088?>   include java.lang.Runnable
jruby-1.6.8 :089?>   
jruby-1.6.8 :090 >     def run
jruby-1.6.8 :091?>        puts 'on run'
jruby-1.6.8 :092?>     end
jruby-1.6.8 :093?>   end
 => nil 
jruby-1.6.8 :094 > t = java.lang.Thread.new MyRunnable.new
 => #<Java::JavaLang::Thread:0x461d318f> 
jruby-1.6.8 :095 > t.start
on run
 => nil 

另外也有類似java裡anonymous inner class的用法。

在所有java的interface,都有impl這個method,且只有interface有,class沒有。
在interface沒有找到必要的method時,就會呼叫impl,有點像是missing_method。
jruby-1.6.8 :096 > r = java.lang.Runnable.impl do |method, evt|
jruby-1.6.8 :097 >     puts 'method: '+method.to_s
jruby-1.6.8 :098?>     puts 'evt: '+evt.to_s
jruby-1.6.8 :099?>   end
 => #<#<Class:0x5ad3c69c>:0x519549e> 
jruby-1.6.8 :100 > t = java.lang.Thread.new r
 => #<Java::JavaLang::Thread:0x35a271f5> 
jruby-1.6.8 :101 > t.start
 => nil 
method: run
evt: 


該怎麼用就見仁見智了
如有理解有誤的地方請務必聯絡我,一起學習!

星期一, 3月 12, 2012

[Android] AsyncTask、HandlerThread原理分析


寫Android時難免會遇到UI要回應使用者的動作,同時還要執行一些計算
通常的解決辦法是使用HandlerThread和AsyncTask

AsyncTaskHandlerThread當官見自就可以google出很多使用方法
不過最近看到比較特別的是這篇: Android應用程序線程消息循環模型分析
比較深入的介紹這些事件驅動的原理

雖然HandlerThread和AsyncTask看網路上的一些例子就會用了
但有機會我想還是多了解一點比較好吧

[紀錄] Android Out Of Memory


詳細請見: [Android]Android Out Of Memory(OOM) 的詳細研究

這篇主要是講大量的圖片檔案轉換成Bitmap物件時,出現Out Of Memory Exception的問題
不過其實也可以延伸思考「Android的記憶體分配」

以下節錄一小段:
通過一些瞭解,得知如下:
優化Dalvik虛擬機的堆記憶體分配

對於Android平臺來說,其託管層使用的Dalvik Java VM從目前的表現來看還有很多地方可以優化處理,比如我們在開發一些大型遊戲或耗資源的應用中可能考慮手動干涉GC處理,使用 dalvik.system.VMRuntime類提供的setTargetHeapUtilization方法可以增強程式堆記憶體的處理效率。當然具體原理我們可以參考開源工程,這裡我們僅說下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程式onCreate時就可以調用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。
Android堆記憶體也可自己定義大小

對於一些Android專案,影響性能瓶頸的主要是Android自己記憶體管理機制問題,目前手機廠商對RAM都比較吝嗇,對於軟體的流暢性來說RAM對性能的影響十分敏感,除了 優化Dalvik虛擬機的堆記憶體分配外,我們還可以強制定義自己軟體的對記憶體大小,我們使用Dalvik提供的 dalvik.system.VMRuntime類來設置最小堆記憶體為例:

//設置最小heap記憶體為6MB大小。當然對於記憶體吃緊來說還可以通過手動干涉GC去處理
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);

[紀錄] 在Android中使用ormlite


可以參考:
Android中使用ormlite實現持久化--HelloOrmLite
Android中使用Ormlite實現持久化(二)--持久化類的詳細配置

另外補充:
DAO設計模式

星期二, 3月 06, 2012

一個高品質的js統計圖製作: highchartsjs

highcharts js: http://www.highcharts.com/
highchartjs 讓你只要寫一些簡單的javascript,就可以在你的網頁上做出漂亮的圖表
圖表涵蓋了各種常用的類型,如長條圖、圓餅圖等
特別的是它還可以用動畫展示,真的是非常花俏
有興趣的話點網址進去看看就知道多花俏了XD

它的範例及API也很豐富完善,基本需求通常只要改改範例就可以完成
不過要注意的是,若用免費版本,圖表下方會有一個他們的logo
就看介不介意囉


其他的 javascript chart library:
http://wowtree.com/tree.php?aid=864


htaccess使用


很多範例及flag的用法
http://www.cccspace.net/b/htaccess.html

使用實例,可以複製過來直接改
http://www.zzbaike.com/wiki/Htaccess%E4%BD%BF%E7%94%A8%E5%AE%9E%E4%BE%8B#.E7.A6.81.E6.AD.A2.E6.98.BE.E7.A4.BA.E7.9B.AE.E5.BD.95.E5.88.97.E8.A1.A8

星期一, 3月 05, 2012

[javascript] 物件存取特性


一般有在寫javascript的話,都會知道要取一個如下物件
var obj = { a: '123', b: '456' }
的a值,應該要這麼用:
console.log( obj.a );

但是,其實還有另外一個方法,就是使用類似陣列的動態存取
console.log( obj['a'] );
這是一個很方便的特性,假設你要取的物件屬性是不一定的, 我們假設是一個變數。

這時候,如果不知道可以用動態存取方法的話,你就只能這麼寫:
var attr = 'a';
var value = eval('obj.'+attr);
用eval的話,在效能和安全性的考慮上就可能不是這麼的好。

改變一下作法,若是這麼寫:
var attr = 'a';
var value = obj[attr];
這樣不就簡潔又美觀了呢?

在用json的時候,也可以很方便的這麼用
var value = json['key'] || defaultVal;
是不是很棒呢!