2009年7月20日 星期一

複習Groovy (3) - Sql

針對自己的小作業複習Groovy,所以把Groovy Sql看看。因為小作業需要ResultSet Metadata,所以第一步搞定資料庫連線之後,第二步就開始搞看看ResultSet Metadata,最後就寫一個簡單的程式用comboBox帶出所有的Basic AssetType然後用table帶出該AssetType的ResultSet Metadata。一切隨性,下了班玩自己喜歡的東西好玩就好。


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還要玩出下列兩項

  1. closureColumn

  2. 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的第一章

最近被Manning的Groovy in Action 2Ed預購所吸引...60% off的吸引力太大,就敗了Groovy in Action第二版。因此也把書櫃裡的Groovy in Action第一版拿出來複習一下。自己學東西都是不注重用不用的到,只在乎自己爽不爽,因此學的很發散也忘的很快。哈,記憶體有限很快就purge掉。
因為google要關閉page creator本來打算把用部落格作筆記的做法關掉,一方面也很討厭自己在筆記本唉唉叫的做法,又不是有病幹麻管別人那麼多閒事。為了備份方便,後來改用html搞,沒啥美工天份反正自己看不礙眼就好。網站先放在so-net個人網頁。

2009年6月23日 星期二

Wicket – Write out Binary WebResource

製作ResourceLink的時候,原本都是用WebResourceCSV檔或文字資料。剛好遇到要透過POIHSSFSpreadSheet出來,參考ByteArrayResource,如果只是單純使用ByteArrayResource也可以,因為我打算維持自己之前webresources的做法把自己寫的IExportableDataProvider傳進來再製作出要export的內容。這邊只是POC確定可以跑的版本,不包含任何該公司的資訊。



PDF Document here

Wicket – Implement SyntaxHighlightingBlock

昨天白天不知為啥心情不佳,一整個懶。昨天出門前想到Syntax Highlighting的東西,下班之後就開始玩玩看。單純做好玩所以做來看看,沒想過實際使用的修正。之前雖然就覺得貿然使用Wicket對其他同事和Wicket而言,或許不是很好,畢竟對很多一堆小朋友而言,只有Struts才是王道。即使根本不了解Wicket更甚者連Struts都不是很清楚。哈 不過話說回來我對Wicket也不是了解很多。

SyntaxHightlightingBlock v0.2

因為推銷同事使用之後,在ajax rerender SyntaxHighlightingBlock會無法正確的顯示資料,一方面因為趕時間,所以弄了一個醜醜的解法。


PDF document here
Code @ google code url: http://code.google.com/p/syntaxhighlightingblock/

2009年6月22日 星期一

Wicket – ExternalInlineFrame and CollapsalbeLabel

從上禮拜開始心情又開始有些許波動,大概是自己腦袋知識太少,所以自悲而產生的自我防禦機制。其實自己所知太少,一直以來也沒興趣加入哪個framework好這種意識形態之爭的戰爭。自己對Wicket Source code也沒有了解的很透徹,但畢竟在有時間限制,又只有自己一個搞定所有東西的前提下,選擇framework的時候,還是要選擇自己比較熟悉的framework來做。畢竟對我這種入門等級的騙子而言,那麼多MVC frameworks是不同的人在HTTPOO之間用自己的方法和自己想解決問題的方向來搭起的橋樑。從來都不知道也認為自己沒那個能力知道那個比較好;哪個比較不好(或許改天有時間把兩個frameworksource code都了解透徹之後,可以比較一下)。對我而言,只有用過Struts 1和看過一點點JSF, Struts 2,在眾多橋樑之間,Wicket的想法是一個很有創意想法,他跳脫了Taglib...有時間的前提下,會列為可以多花點時間深入了解的好玩東西

wicket的世界,要製作Component是相當簡單的一件事,在這邊就因為某些狀況而做了兩個簡單的component。一個是連結到Wicket之外的iframecomponent,另一個是有可縮合功能的Label



PDF Document here

2009年5月14日 星期四

How To - Extending Ruby with Visual C++

一方面家裡有事,一方面案子又趕,只能靠自己,忙到沒時間打電動沒時間看書。這次整理的是以前看Ruby Cookbook Recipe 22.1在Windows + Visual C++環境踹踹看的東西。
被「啊欠打」這家豬腦美工公司搞的...心情超差...hmm 污辱了豬,要跟豬對不起

我的XPS上作業環境
  • Windows XP
  • Visual C++ 2008
  • Ruby 1.8.6

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年3月19日 星期四

[Oracle] About Count

不知道從哪時候開始自己對知識和技術就從以某些意見領袖的文章和說法為方向,轉變成單純只以自己興趣為主看自己想看的東西。或許是自己大腦成長的慢,比較晚才定型成Chaotic Neutral陣營;又或許是發現追求知識本身的價值大於信仰知識...不知道,反正總算是回到當初無知的高中時代,單純為了興趣去學MASM的樣子。用自己的大腦思考知識本身的含意和目的而不是被灌注別人的想法思考。就很像當初唸研究所單純為了想知道更多讓自己有判斷的能力去生圖印一堆paper回來k一樣。期望自己也能夠保持這樣的心態一直努力追求更多更多的知識。只有興趣學自己有興趣的知識,我就是我,沒興趣影響任何人也沒興趣成為任何一方的奴才。
有的時候認同墨子講的東西、有的時候認同莊子講的東西;所以有的時候認同There's more than one way to do it、有的時候認同There should be one -- and preferably only one -- obvious way to do it。對我而言,希望藉由了解創造這些知識的人解決遇到問題的思路,讓自己學會更多知識才是重點。至於誰好誰不好、誰賺錢手段難看、誰是王道那是高手的事,與我這個低手沒關係。

回到OracleExecution Plan Operation的時候,看到的東西所以特別記下來。主要是糾正自己以往對count錯誤的推想。



PDF Document here

2009年3月5日 星期四

[Fatwire Content Server] 改Template的template

餓死抬頭
就只是改Fatwire Content Server的Template的template
看是要加author or 自己寫的taglib or 共用頁面設定

PDF Document here

2009年2月27日 星期五

UTL_I18N.UNESCAPE_REFERENCE Note

遇到Numeric Character Reference表示的文字檔,因此找到Oracle的UTL_I18N這個package來幫忙轉換內容。大概紀錄一下UNESCAPE_REFERENCE和ESCAPE_REFERENCE的簡單使用方法。見PDF文件...搞定,睡覺去

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的出現可以協助optimizerhard parse的時候scan databasesegments取得對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

過了九天的年假,除了和家人、小狗玩之外,大多都是XBOX 360、WoW。雖然開始研究Oracle Execution Plan各個Operation。就從前鎮子遇到的簡單疑問開始解,會遇到通常是因為Oracle Instance的Character Set和Client不同在匯出的時候有可能會遇到的小問題。

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來呈現維護介面的功能。
據說這樣搞"肥的線"就不support...所以移除基礎tag ><"

PDF Document here

2009年1月13日 星期二

[Fatwire Content Server] Content Server meet jQuery

寒流冷颼颼,最近工作有機會接觸Commercial CMS的產品。有一些奇怪想法,週末終於覺得有一點點能力可以開始踹看看。主要是想嘗試在Content Server裡使用jQuery和嘗試讓Template產出JSON給jQuery用看看這樣想法可不可以...沒有實驗總覺得不踏實...太嫩了沒辦法。

PDF Document here