2009年7月20日 星期一
複習Groovy (3) - Sql
My HomePage Link
2009年7月14日 星期二
複習Groovy (2) - SwingBuilder - table -- cellRender & closureColumn
Preface
寫FTCS XMLPost tool和看書進度緩慢,這個算是寫FTCS XMLPost tool想用的東西。主要的想法是有一塊用JTable來呈現
該Basic Asset Type table的Metadata,然後我可以用勾選的方式,最後產生XMLPost執行的ini設定檔。^^純粹是初步想法
希望會堅持下去用SwingBuilder做完,而不會做到一半覺得改用Wicket做比較快(雖然對我而言是事實)。
Environment
- Groovy 1.6.3
- Sun JDK 1.6.0_10
最初版本和想法
最初是Groovy in Action裡面有關table的範例,作者使用了propertyColumn展示這個componet的做法和功能。以我這個Swing門
外漢想的到,距離心理想要做的東西,針對table還要玩出下列兩項
- closureColumn
- cellRenderer, cellEditor
測試用的殼
Listing. GroovyTest.java
package script;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class GroovyTest {
public static void main(String[] args) throws ScriptException, FileNotFoundException {
if(args.length != 1) {
System.err.println("Missing Required Parameter");
System.exit(-1);
} // if
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("groovy");
engine.eval(new InputStreamReader(ClassLoader.getSystemResourceAsStream(args[0])));
} // main()
} // GroovyTest class
closureColumn property
就只是根據書上的範例多的data加一個欄位,用closureColumn來呈現,特別用selected順便在下一個可以用checkbox來
呈現和設定這欄的資料。
Listing. tabDemo0.groovy
package script
/**
* @author Terry
*
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JCheckBox
import javax.swing.DefaultCellEditor
import javax.swing.WindowConstants as WC
def data = [
[nick:'MrG', full:'Guillaume Laforge', selected: false],
[nick:'jez', full:'Jeremy Rayner', selected: false],
[nick:'fraz', full:'Franck Rasolo', selected: false],
[nick:'sormuras', full:'Christian Stein', selected: false],
[nick:'blackdrag', full:'Jochen Theodorou', selected: false]
]
swing = new SwingBuilder()
generateAction = swing.action( name: 'Execute', closure: {
for (Map row : data) {
println row
}
})
frame = swing.frame(title: 'SwingBuilder - table 踹踹係',
defaultCloseOperation: WC.EXIT_ON_CLOSE) {
panel(layout: new BorderLayout()) {
scrollPane(constraints: BorderLayout.CENTER) {
table() {
tableModel(list: data) {
propertyColumn(header: 'Nickname', propertyName: 'nick')
propertyColumn(header: 'Full Name', propertyName: 'full')
closureColumn(header: 'Import ?',
read: { row -> return row.selected },
write: { row, newValue ->
row.selected = newValue })
}
}
}
hbox(constraints: BorderLayout.SOUTH) {
button( 'Execute' ) {
action(generateAction)
}
}
}
}
frame.pack()
frame.show()
Figure. 程式執行結果

cellRenderer, cellEditor property
對Groovy還沒有到那種感覺的程度,所以就只能按照對Swing的了解用Java的方法搞。所以寫了
一個TableCellRenderer。所以先看到的是CheckCellRenderer.groovy之後在tabDemo.groovy裡面
cellRenderer property就設定這個自訂TableCellRenderer,至於CellEdtor則使用DetaulCellEditor
餵給他JCheckBox的物件就可以了。
Listing. CheckCellRenderer.groovy
package script
import java.awt.Component
import javax.swing.JTable
import javax.swing.JCheckBox
import javax.swing.border.EmptyBorder
import javax.swing.table.TableCellRenderer
class CheckCellRenderer extends JCheckBox implements TableCellRenderer {
CheckCellRenderer() {
super()
setOpaque(true)
setBorderPainted(true)
setBorder(new EmptyBorder(1, 1, 1, 1))
setHorizontalAlignment(JCheckBox.CENTER)
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
setSelected(value)
setForeground(table.getForeground())
setBackground(table.getBackground())
return this
}
}
Listing. tabDemo.groovy
package script
/**
* @author Terry
*
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import javax.swing.JCheckBox
import javax.swing.DefaultCellEditor
import javax.swing.WindowConstants as WC
def data = [
[nick:'MrG', full:'Guillaume Laforge', selected: false],
[nick:'jez', full:'Jeremy Rayner', selected: true],
[nick:'fraz', full:'Franck Rasolo', selected: false],
[nick:'sormuras', full:'Christian Stein', selected: false],
[nick:'blackdrag', full:'Jochen Theodorou', selected: false]
]
swing = new SwingBuilder()
generateAction = swing.action( name: 'Execute', closure: {
for (Map row : data) {
println row
}
})
frame = swing.frame(title: 'SwingBuilder - table 踹踹係',
defaultCloseOperation: WC.EXIT_ON_CLOSE) {
panel(layout: new BorderLayout()) {
scrollPane(constraints: BorderLayout.CENTER) {
table(cellSelectionEnabled: false) {
tableModel(list: data) {
propertyColumn(header: 'Nickname', propertyName: 'nick')
propertyColumn(header: 'Full Name', propertyName: 'full')
closureColumn(header: 'Import ?',
cellRenderer: new CheckCellRenderer(),
cellEditor: new DefaultCellEditor(checkBox(horizontalAlignment: JCheckBox.CENTER)),
read: { row -> return row.selected },
write: { row, newValue ->
row.selected = newValue } )
}
}
}
hbox(constraints: BorderLayout.SOUTH) {
button( 'Execute' ) {
action(generateAction)
}
}
}
}
frame.pack()
frame.show()
Figure. 程式執行結果

Reference
- Groovy Web Site
- Groovy in Action, First Edition
- Swing, Second Edition
Terence Chao, 2009/07/14
2009年7月7日 星期二
複習Groovy的第一章
- 有點問題的: SyntaxHighlighter - Groovy
- SwingBuilder的練習: SwingBuilder - tabbedPane
2009年6月23日 星期二
Wicket – Write out Binary WebResource
PDF Document here
2009年4月14日 星期二
[Fatwire Content Server] 自己猜測的部分Data Model

四月以來諸事不順、心情不佳,煩到一個不行
把前幾個月來工作時陸陸續續整理的東西,既然是沒用的東西放上來應該也沒差 (link)
壓縮檔中
1. 用DBDesigner 4做的Data Model,Data Type都是用MySQL的
2. 圖檔是export出來的東西
這幾天整理自己的lab發現
1. 以前用velocity寫的Masm32的makefile產生程式不見了
2. 竟然看不太懂自己之前寫的Win32 Assembly程式
...也一整個無言
附上一張同事問到的SystemSQL Result Cache問題的解決圖
在deftable這欄透過逗號分隔設定相關的table,當這些table透過Advance UI變更的時候就會清掉該筆SystemSQL的result cache (這個是同事問到的答案)。
2009年2月27日 星期五
UTL_I18N.UNESCAPE_REFERENCE Note
PDF Document here
2009年2月11日 星期三
Filter Operation Notes
因為興趣而努力看Oracle的東西,也因為興趣看.NET自己覺得好玩的東西。因為不知道未來會怎樣,也不想為了用而學知識...反正好玩就好。有關Oracle execution plan裡的Filter Operation簡單的筆記。
PDF document here
BTW 熊本城寶寶看起來很不錯...希望有機會可以去一趟熊本城瞻仰加藤清正蓋的城...順便抱一隻熊本城寶寶回台灣 哈哈
2009年2月9日 星期一
dynamic sampling notes
就菜鳥所知,自從Oracle使用Cost-Based Optimization之後,statistics data對於讓Cost-Base Optimizer(CBO)產生較有效率的execution plan就相當重要。在處理SQL時,遇到沒有分析任何statistics data的時候,CBO會使用預設的資料來產生execution plan。這樣就完全仰賴『運氣』,比如說SQL Statement用到的objects的狀況和預設的差不多...。Dynamic Sampling的出現可以協助optimizer在hard parse的時候scan database的segments取得對optimzation有幫助的資訊,然而在某些狀況下即使我們有分析statistics data,但是或許是因為資料的缺乏,optimizer會產生不是那麼有效率的execution plan,在這種情形下dynamic sampling也可以提供有用的資料給optimizer產生有效率的execution plan。
PDF Document here
上半年
- Troubleshooting Oracle Performance (orcl)
- Oracle 11g PL/SQL Programming (orcl)
- Applied Mathematics for Database Professionals (basic)
- Lucene in Action 2Ed (java)
- Real World Functional Programming (ms)
- IronPython in Action (ms)
下半年
- Secret of Oracle Database (orcl)
- Programming Ruby 1.9 (os)
- Building Domain Specific Languages in Boo (ms)
- Applied Mathematics for Database Professionals (basic)
2009年2月3日 星期二
About EXP-00091
Document here
過完年書單也瘋狂成長 -"-
排進書單新書
1. Troubleshooting Oracle Performance (兩三年沒看Oracle的東西了...,最近又開始看了)
2. Lucene in Action
3. OSGi in Action
4. Developing Web Services with Apache Axis2
5. jBoss in Action
6. Real World Functional Programming
7. IronPython in Action
8. AspectJ in Action
9. jQuery in Action (隨便翻過)
Secrets of the Oracle Database
Oracle Database 11g New Features (考慮要不要去升級...雖然在正港DBA眼中偶只是拿牌騙吃騙喝)
Building Domain Specific Languages in Boo (還要先看恐龍書 >"<)
Programming Ruby 1.9
大概差不多可以開始整理最近玩的Filter Operation
2009年1月13日 星期二
[Fatwire Content Server] Content Server meet jQuery
PDF Document here
2008年12月8日 星期一
[Eclipse Plug-in] XML Formatter 0.0.1
PDF Document here
Plug-in file here
JDOM plug-in here
搞定睡覺去...明天還要上班
2008年9月12日 星期五
Longest Common Subsequences For Dummies
寫了兩個版本,一個是最早寫的版本,第一個版本是寫一個functor來計算s和b的two-dimension array的值,然後透過一個method解讀array得到LCS的結果。後來想想用Nontype Template Parameter來搞。因為在編譯期就可以知道陣列大小,所以用Template搞就很方便。因此寫了v2版本。
Doc here
Code here
2008年9月6日 星期六
About Motif Finding Problem
針對Motif Finding Problem的學習,書上寫的很清楚可是總覺得畫圖對自己比較容易了解,所以把看書過程當中想的東西畫下來並整理一下。對自己瞭解這個東西有點幫助,也希望可以對別人也有點幫助。整裡的東西是用OpenOffice Impress搞得加上還有自己寫的Score(s, DNA)的簡單程式碼,所以包成一個Zip檔。
Document and Code Package here
2008年8月27日 星期三
Partial Digest Problem – Brute Force Algorithm Brute Force Implementation
自從多年以前在某生物資訊公司上班時很無知的買了本 Computational Biology的書,看了一點點被嚇到,嚇到好幾年都不敢講bioinformatics這個單字。哈!過了幾年來終於鼓起勇氣再敗一本bioinformatics的書來看。哈哈!還好目前為止這次看的章節數比較多,書上大多是pseudo code,因為會的太少,所以不做看看會怕怕的。也是因為會的太少,因此這寫的實作版本也叫brute force implementation。
看起來很多頁其實都只是程式碼列表,寫的才一點點。搞定 洗澡去 今天一定要早點睡 哈哈!
PDF Document here
2008年8月22日 星期五
Metaprogram for dummies
緣起是在學侯Sir說的第零境界當中一直受到相當的挫折又再度奮起繼續作戰,好像學到點東西但是又不確信是不是真的學到東西。就會東想西想些case來看看能不能自己用第零境界講的東西來做看看。這邊就是剛好看到Metaprogram的章節之後,一直在想那個東西可以拿來踹踹看,又剛好看到BSA和Arpin的部落格有講用Markov Chain來檢定某段DNA序列是不是CpG island,所以這邊就用來踹Unroll loops的東西。
....好難的第零境界....不過看看之後竟然發現古早以前買的『泛型程式設計與STL』好像有越來越看有的趨勢,哈!大概是假象吧!
看來template快卡關了,正好拿到An Introduction to Bioinformatics Algorithms可以交互喘息。哈哈! 搞定睡覺去...
PDF Document here
2008年8月21日 星期四
Building Board Library with Visual Studio 2008
晚上回來還是要搞些正常的...話說以前在玩Java的時候曾經玩過一陣子Batik,就想到C++應該也有類似製作vector graphics的library,就從咕狗大神找一下,就碰到Board Library。在Windows用VS 2008 build的時候發生一些問題,所以就把自己解決的方法記錄下來,或許將來有機會要用的時候可以查的到資料。
PDF document here
2008年8月4日 星期一
Copy constructor and allocator for dummies
呵!正因為是門外漢又不聰明,所以看到書上寫的東西就會手賤想實驗看看,不然會覺得不踏實。會踹allocator並不是想自己寫STL Container(儘管The Art of C++有一章有寫Custom STL Container),純粹只是因為看到C++ Primer其中一句話就想用allocator踹看看、實驗看看是不是真的跟書上講的一樣。另一方面也想說可以趁機學學allocator怎麼玩。
PDF document here