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
Wicket – Implement SyntaxHighlightingBlock
SyntaxHightlightingBlock v0.2
因為推銷同事使用之後,在ajax rerender SyntaxHighlightingBlock會無法正確的顯示資料,一方面因為趕時間,所以弄了一個醜醜的解法。
2009年6月22日 星期一
Wicket – ExternalInlineFrame and CollapsalbeLabel
從上禮拜開始心情又開始有些許波動,大概是自己腦袋知識太少,所以自悲而產生的自我防禦機制。其實自己所知太少,一直以來也沒興趣加入哪個framework好這種意識形態之爭的戰爭。自己對Wicket Source code也沒有了解的很透徹,但畢竟在有時間限制,又只有自己一個搞定所有東西的前提下,選擇framework的時候,還是要選擇自己比較熟悉的framework來做。畢竟對我這種入門等級的騙子而言,那麼多MVC frameworks是不同的人在HTTP和OO之間用自己的方法和自己想解決問題的方向來搭起的橋樑。從來都不知道也認為自己沒那個能力知道那個比較好;哪個比較不好(或許改天有時間把兩個framework的source code都了解透徹之後,可以比較一下)。對我而言,只有用過Struts 1和看過一點點JSF, Struts 2,在眾多橋樑之間,Wicket的想法是一個很有創意想法,他跳脫了Taglib...有時間的前提下,會列為可以多花點時間深入了解的好玩東西 。
在wicket的世界,要製作Component是相當簡單的一件事,在這邊就因為某些狀況而做了兩個簡單的component。一個是連結到Wicket之外的iframe的component,另一個是有可縮合功能的Label。
PDF Document here
2009年5月14日 星期四
How To - Extending Ruby with Visual C++
我的XPS上作業環境
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年3月19日 星期四
[Oracle] About Count
有的時候認同墨子講的東西、有的時候認同莊子講的東西;所以有的時候認同There's more than one way to do it、有的時候認同There should be one -- and preferably only one -- obvious way to do it。對我而言,希望藉由了解創造這些知識的人解決遇到問題的思路,讓自己學會更多知識才是重點。至於誰好誰不好、誰賺錢手段難看、誰是王道那是高手的事,與我這個低手沒關係。
回到Oracle看Execution Plan Operation的時候,看到的東西所以特別記下來。主要是糾正自己以往對count錯誤的推想。
PDF Document here
2009年3月5日 星期四
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月23日 星期五
[Fatwire Content Server] Create Custom Tab for Advanced UI
Content Server提供相當多的功能給BA、Content 管理人員、Developer等使用,但是有的時
候並不能按照我們的想法,或更好的方式來呈現資料給Content 管理人員維護Content。Flex
Asset Type提供相當強大的功能,但是複雜度對Developer、BA而言,應該也是很大的負擔。
有的時候換一個角度來呈現資料可以達到維護性夠高的介面,這次剛好有機會遇到自己嘗試
寫Tab來呈現維護介面的功能。
2009年1月13日 星期二
[Fatwire Content Server] Content Server meet jQuery
PDF Document here