2018年5月12日 星期六

練習Neo4j

之前都是自己偶而玩玩Neo4j,趁假日把上班遇到的問題改用Neo4j來解決。
先做一個簡單的資料
CREATE (ACME:DeptGroup:OrgGroup {id: 'Ga', name: 'ACME'})
CREATE (ACME_Member:UserGroup {id: 'Gb', name: 'allmember'})
CREATE (Keanu:Person {id: 'Ua', name: 'Keanu Reeves'})

CREATE (Dev1:DeptGroup:OrgGroup {id: 'Gc', name: 'Development 1'})
CREATE (Dev1_Mmember:UserGroup {id: 'Ge', name: 'allmember'})

CREATE (Project_Lineage:ProjectGroup:OrgGroup {id:'Gg', name: 'Project Lineage'})
CREATE (Lineage_Mmember:UserGroup {id: 'Gj', name: 'allmember'})

CREATE (Unity_ResearchGroup:ProjectGroup:OrgGroup {id:'Gh', name: 'Unity Research Group'})
CREATE (Unity_Mmember:UserGroup {id: 'Gk', name: 'allmember'})

CREATE (Dev2:DeptGroup:OrgGroup {id: 'Gd', name: 'Development 2'})
CREATE (Dev2_Mmember:UserGroup {id: 'Gl', name: 'allmember'})

CREATE (Project_X:ProjectGroup:OrgGroup {id: 'Gi', name: 'Social Game Project X'})
CREATE (X_Mmember:UserGroup {id: 'Gm', name: 'allmember'})

CREATE
  (Dev1)-[:SUPERVISED_BY]->(ACME),
  (Dev2)-[:SUPERVISED_BY]->(ACME),
  (Project_Lineage)-[:SUPERVISED_BY]->(Dev1),
  (Unity_ResearchGroup)-[:SUPERVISED_BY]->(Dev1),
  (Project_X)-[:SUPERVISED_BY]->(Dev2),
  (ACME_Member)-[:BELONG_TO]->(ACME),
  (Dev1_Member)-[:BELONG_TO]->(Dev1),
  (Dev2_Member)-[:BELONG_TO]->(Dev2),
  (Lineage_Mmember)-[:BELONE_TO]->(Project_Lineage),
  (Unity_Mmember)-[:BELONE_TO]->(Unity_ResearchGroup),
  (X_Mmember)-[:BELONE_TO]->(Project_X),
  (Dev1_Mmember)-[:SHARE_TO]->(ACME_Member),
  (Dev2_Mmember)-[:SHARE_TO]->(ACME_Member),
  (Lineage_Mmember)-[:SHARE_TO]->(Dev1_Mmember),
  (Unity_Mmember)-[:SHARE_TO]->(Dev1_Mmember),
  (X_Mmember)-[:SHARE_TO]->(Dev2_Mmember),
  (Lineage_Mmember)-[:SHARE_TO]->(Dev1_Mmember),
  (Unity_Mmember)-[:SHARE_TO]->(Dev1_Mmember),
  (X_Mmember)-[:SHARE_TO]->(Dev2_Mmember),
  (Keanu)-[:MEMBER_OF]->(ACME_Member)

目的透過成員查詢到所屬UserGroup的同時,把有設定[:SHARE_TO]的relation的多層關係的UserGroups都查詢出來。
match (p:Person {id:'Ua'})-[:MEMBER_OF]->(u:UserGroup)
return u.id as gid
union
match (udeep:UserGroup)-[:SHARE_TO*]->(u)
return udeep.id as gid
之前是自己實作adjacency list解決速度的問題,看來也可以輕鬆地改用Neo4j搞定。

2014年3月17日 星期一

Build SpiderMonkey on Mac OS X

平常都是玩node.js或V8,今天無聊想說裝SpiderMonkey來玩看看,結果腦殘遇到一些問題,把解決方法記下來,以免以後重裝又要重找答案。 主要步驟按照官方網站文件做就好(連結)。但是在Mac OS X遇到問題,關鍵還是autoconf213。
Note that autoconf version 2.13 is required. No later version will work. The MozillaBuild package for Windows includes autoconf 2.13.
看了官方文件(連結)之後,就透過brew安裝2.13版本。然後到src目錄下執行autoconf213就可以繼續按照官方步驟build下去了。
cd js/src
/Users/tzuyichao/local/homebrew/Cellar/autoconf213/2.13/bin/autoconf213 (取決於自己brew安裝的目錄)

...按照官方安裝說明執行

2011年11月8日 星期二

用了JavaScript framework就不會有跨瀏覽器的問題?!

即使我們有了『甘道夫』講了很多JavaScript的東西,yahoo UI團隊和許多JavaScript高手也寫了很多JavaScript的書來讓我們正確的認識這個有趣的語言。但是很多人都認為只要用了JavaScript Framework如jQuery, YUI, MooTools...就可以解決跨瀏覽器和要花時間瞭解JavaScript避免寫出有問題或效能不佳的程式碼。真的是如此嗎?
且不論JavaScript只有global, function scope變數這個議題。在工作當中可以發現,很多人都認為JavaScript的變數是不需要宣告的。但其實不是如此,只是當function scope找不到變數的時候,JavaScript engine會找到global scope,在瀏覽器執行環境global context通常就是window物件。反之,如果在function裡的變數沒有宣告的話,也會跑到global context去。(題外話,object resovle也帶來先把重復使用的object先cache到function scope裡的寫法,比如說native array的一些function object在JavaScript framework可以看到都會做cache)回到主題,大家都知道不同瀏覽器Browser Object Model (BOM)有一些許的差別,所以很多人都鄉愿的認為讓寫framework的搞定就好。但是即使用framework,寫程式的人如果不瞭解JavaScript也一樣會發生,跑起來IE不行,其他都行的類似事情。
來看個活生生的例子,因為SEO很多設計人員都會加上meta element,很容易看到類似下面的東西
<meta name="title" content="this is title@meta element" />
然後,用jQuery(其實這個例子用任何一個JavaScript framework這樣寫都會出事)寫一個簡單的程式如下
$( function() {
   $( '#titleContent' ).text( '>>' + title );
} );
有沒有注意到,沒有宣告title,會發生啥事?JavaScript error?在chrome, firefox會看到JavaScript Error,但是IE呢?

看到了吧,因為我沒有IE,所以是用公司配的PC上的IE9測試。如果扯到variable hoisting就更複雜(已經寫過就不想再寫以前的筆記)。這個例子是trace實際程式碼簡化呈現問題點的寫法,其實真實的程式碼是沒宣告title,然後就針對title設定值和做其他處理,因此在chrome/firefox變成操作window裡的title attribute,不會看到JavaScript Error;但是在IE卻變成嘗試對HTMLMetaElement作改變,所以產生錯誤導致後續的JavaScript程式碼都無法正確執行。

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