<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    邋遢居

    我的Java天堂

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      61 Posts :: 2 Stories :: 90 Comments :: 0 Trackbacks

    2009年11月7日 #

    在過去的一年中。斷斷續續的使用了一些Grails。用他做了點東西。覺得不錯,所以希望更多的人來了解他。使用他。所以錄制了一點視頻,和大家分享。視頻會不定期持續更新!

    第一集 Grails 開發環境準備

    http://v.youku.com/v_show/id_XNjUxNjgxMjA4.html

     

    第二集 配置使用 Grails Spring security

    http://v.youku.com/v_show/id_XNjY2MDc4MDgw.html

     

    第三集  Grails中數據庫連接

    http://v.youku.com/v_show/id_XNjk4NTM2NDgw.html

    posted @ 2014-04-23 22:49 Jet Geng 閱讀(2505) | 評論 (0)編輯 收藏

    原起

    EverNote 的強大已經無需多說。他自己有很好的客戶端,不過那個只是對Windows和OS X。在linux下面就蝦米菜了。就是Windows和OS X下面的客戶端也存在一個致命的弱點:不支持 MarkDown
    不過有好人做了一個工具 Geeknote 讓我們可以在任何裝有python的機器上使用Evernote。 更強大的是他可以使用任何編輯器編輯筆記,支持 MarkDown 。 有如此好處還等什么啊趕緊用起來。
    個人在使用的時候發現原版有點點不舒服的地方,做了點點小改動放在了 GitHub。 具體是什么改動,先買個關子。

    安裝

    直接從源碼安裝

    1. 使用 git clone git@github.com:jetgeng/geeknote.git 命令下載源碼
    2. 進入 geeknote 目錄。
    3. 運行 python geeknote.py login 登錄evernote
    4. 通過 python geeknote.py create , python geeknote.py edit , python geeknote.py find 命令來創建,編輯和查詢你的ervernote 中的筆記。
    5. 通過 python geeknote.py settings --editor vim 命令把編輯Evernote的編輯器設定成我最喜歡的vim。 當然你可以設定成你喜歡的。
    6. 這個時候你已經用上了GeekNote。 但是還會有點不爽。最起碼我這個時候不爽。

    不爽的地方

    1. 當我用python geeknote.py edit 命令使用vim打開我要編輯的筆記時,筆記居然沒有把 MarkDown 語法給我高亮出來! 不爽!!
    2. 輸入命令一定要帶一個什么python 之類的太繁,而且我tab的時候也沒有給我把命令補全!在命令行中沒有自動補全,太不爽了!!

    改之

    讓vim正確設定filetype

    在 vim中一般是根據文件的后綴名來識別該文件是什么類型。然后為他加載相應的語法高亮,代碼補全什么的。在沒有改動前geeknote是為筆記創建的臨時 文件時沒有后綴的。只是隨機的創建一個形如 tmpsNbc8k這樣的文件。所以Vim無法識別他是何種文件,就無法為他加載對于的語法高亮之類的。

    既然找到原因了就先看一下geeknote是否有什么地方可以設定,讓他產生的臨時文件有后綴。最后在editor.py文件中發現了這么一行代碼: (tmpFileHandler, tmpFileName) = tempfile.mkstemp() 。 直接沒有給任何后綴的想法。
    那就加上吧。
    我所做的動作就是這個,給他加上了一個文件后綴的設定。
    通過python geeknote settings --suffix suffix 這樣的命令來設定零時文件的后綴。這樣語法高亮,代碼補全就回來了。小爽一下!

    命令行自動補全

    這個其實geeknote已經想到了,而且已經做了。代碼倉庫中的那個 bash_completion/geeknote 文件就是干這個活的。 所以我只要把這個文件copy到 /etc/bash_completion.d/ 下就可以了。
    但是copy進去后沒有達到我想要的效果。沒有自動補全。最后發現是geeknote配置的補全命令和我們執行的時候不一致。
    下面要做的就是把它們搞一致了。
    我的操作步驟如下:
    1. chmod +x geeknote.py 給geeknote.py加上可執行權限。
    2. 將geeknote.py所在路徑加入到PATH中去。
    3. 修改 /etc/bash_completion.d/geeknote 文件中的 geeknote 為geeknote.py 這個在我上面提到的github中可以找到。

    這個時候在新開一個控制臺,輸入 geeknote.py tab 可以自動補全了。小爽一下!

    posted @ 2013-05-31 22:57 Jet Geng 閱讀(8314) | 評論 (1)編輯 收藏


    Gemini測試小工具

    作 者: Jet Geng
    日 期: 2011-07-22

    概述

    Blueprint 起步中我們已經成功的通過 Blueprint 容器創建了一個POJO。我們只是通過log的方式查看到我們的POJO已經被創建了。無法深入的去了解容器內部Bean的運行狀態和行為。 所以才有必要創建一個Gemini控制臺這樣的程序。這個控制臺最初的需求是:

    • 能夠動態查看特定的Bean是否被創建。
    • 能夠動態的獲取特定的Bean。
    • 能夠檢查特定Bean的行為是否正確。

    解決方案

    為了解決以上的問題。我做了一個小工具。 這個小工具的目的讓客戶的動態腳本能在最終的目標環境中運行。使用方式如下:
    1. 從 git://github.com/jetgeng/OSGi.git 下載 org.gunn.gemini.consoleorg.codehaus.groovy 這兩個項目。
    2. 并把這兩項目加入到你的TargetPlatform中。
    3. 使用 invokegv 來運行groovy腳本。
      1. 直接在命令行輸入腳本。例如: invokegv print act.getBean(''myPOJO'')
      2. 通過輸入Groovy文件。例如: invokegv file:///Users/Puer/.../script.groovy

    注解

    在Groovy腳本中有一個內建的變量 act , 他又一個叫做 getBean 的方法。通過這個方法你可以獲得當前 OSGi 平臺中所有的BlueprintContainer中的組件。他的輸入參數時Bean或Service的id。 如果是使用Groovy文件的形式,注意文件的url格式。他是通過如下的正則表達式 file:\\/{2}(\\/[:\\w\\.]+)+ 進行驗證的。并且路徑中暫時不支持中文。

    這個周末(23或24日)完成一個簡單的錄屏,來演示這個小工具的使用。

    posted @ 2011-07-22 01:01 Jet Geng 閱讀(3139) | 評論 (0)編輯 收藏

    1 概述
    Blueprint 使用手記 Jet Geng
    July 10, 2011
    Blueprint 是 OSGi Service Platform Enterprise Specification 標準的一 部分。很多最佳實踐中也都推薦在應用程序中使用他。最近在項目中用他 來發布和應用服務。感覺效果不錯。所以就有了這篇使用手記!歡迎各位 看官拍磚!
    2 配置環境
    我們在前期找到了兩個 Blueprint 的實現:一個是 Apache 的 aries,另 外一個就是 Eclipse 的 Gemini。最后選擇了 Gemini。做出這樣的決定出于 兩點考慮:
    • Blueprint的標準就是由Spring提出。
    • Gemini的初始代碼由Srping所捐獻。 下面我就簡單介紹一下環境的配置過程:
    • 從http://eclipse.org/gemini/ 下載 Gemini 的合適的版本。我們 采用的是 1.0.0M1。并解壓到路徑 A
    • 從http://static.springsource.org/downloads/nightly/milestone-download. php下載 spring-osgi-2.0.0.M1-with-dependencies。并解壓到路徑 B。 他里面包括了 Gemini 所依賴的 bundle。說白了也就是 SpringFrame- work。
    • Eclipse 中新建一個 Target Platform。把上述的路徑 A和 B 加入到新 建的 Target Platform 中去。
    • 選擇新建的 Target Platform 為當前活動的 Platform。 3 啟航
    個人理解 Gemini 就是 OSGi 世界中的 IOC。既然是一個 IOC 框架,那 我們就從創建一個 Bean 開始吧!

    3.1    創建一個 Bean 首先我們來看一下我們要存入 Container 中的 POJO。
    Listing 1: POJOWillInContainer.java
    package org.gunn.gemini.demo;
    import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**
    * This pojo will create by blueprint container * 
    @author Jet Geng * */
    public class POJOWillInContainer { private Logger logger =
    }
    LoggerFactory.getLogger(POJOWillInContainer.
    class); private String name ;
    private String age;
    public void setName(String name) { logger.info("the new name is:" + name); this.name = name;
    }
    public void setAge(String age) { logger.info("the new age value is:" + age); this.age = age;
    }

    這個超級簡單的一個 POJO,我們如何通過 Gemini 來創建他呢?我們通過 一個簡單的配置文件。具體如下。
    Listing 2: pojoconfig.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
        
    <bean id="myPOJO" class="org.gunn.gemini.demo.POJOWillInContainer" >
            
    <property name="name" value="JetGeng"/>
            
    <property name="age" value="32"/>
        
    </bean>
    </blueprint>

    用過 spring 的兄弟,第一眼就能看明白這個配置文件說的是什么。其實就 是創建了一個 bean。到這里,我們所需要做的工作其實就已經完成了。下 面就可以通過 Debug 來啟動了。
    3.2    運行 Blueprint 容器 首先把 pojoconfig.xml 文件放到 project path/OSGi INF/blueprint 目錄
    下。或者在 MANiFEST.MF 文件中通過如下語句進行指定。 Blueprint-Bundle: config/account-data-context.xml, config/osgi-*.xml
    更多內容參考http://www.eclipse.org/gemini/blueprint/documentation/ reference/1.0.0.RC1/html/app-deploy.html中的 8.2 Blueprint Manifest Configuration Comparison。好了,我們可以啟動我們的應用程序了。為了 能夠讓 blueprint 順利的跑起來,我們必須要把 blueprint 相關 bundle 以及 他所依賴的 bundle 都加入到運行時中。 按照上圖配置后,點擊運行。我們
    Figure 1: Debug 配置

    將在控制臺得到如下內容。

    控制臺中的黑色行顯示我們的 POJO 已經被 BlueprintContainer 創建

    了,并且設定了相關屬性。
    .
    這個部分的全部代碼已經放到了 git://github.com/jetgeng/OSGi.git 中了。 感興趣的筒子可以 down 下來玩玩。
    posted @ 2011-07-10 11:06 Jet Geng 閱讀(5047) | 評論 (4)編輯 收藏

    用Graphviz顯示樹

    緣起

    前幾天不知道那根筋搭錯,又拿出了大學時候買的一本講算法的書翻了起來。想起當年學習Tree的時候,看著數據結構憑空去想那顆倒著的樹。那個叫做苦啊。所以就像有沒有什么辦法讓Tree自己畫出這樣的結構圖出來。

    動手

    既然想到了,就動手做把。因為以前用Graphviz畫過一點mindmap,類圖之類的小東西。讓我一下子就想到了,我只要能從Tree結構中方便的輸出成一個能繪制出對應樹結構的Graphviz腳本就可以。這應該是代價最小的做法。 呵呵,廢話不多說了。看看的Tree的代碼吧!

     @Override
        
    public String toString() {
            StringBuffer strValue 
    = new StringBuffer();
            StringBuffer rout 
    =  new StringBuffer("{rank=same ");
            
            
    if(getLeftTree()  != null ) {
                strValue.append(root).append(ARROW).append( getLeftTree().getTreeNode()).append(
    ";\r").
                            append( getLeftTree());
                rout.append(getLeftTree().getTreeNode() ).append(ARROW).append(EXTEND).append(root);
          
            }
            
            strValue.append(EXTEND).append(root).append(
    "[label=\"\",width=.1,style=invis];\r");
            strValue.append(root).append(ARROW).append(EXTEND).append(root).append(
    "[style=invis];\r");
         
            
    if(getRightTree() != null) {
                strValue.append(root).append(ARROW).append( getRightTree().getTreeNode()).append(
    ";\r").
                append( getRightTree());
           
                rout.append(ARROW).append(getRightTree().getTreeNode());
            }
            strValue.append(rout).append(
    " [style=invis] } ;\r");
            
    return strValue.toString();
        }

    產生腳本的動作全部在這里完成了。我通過如下代碼創建了一顆樹

           ITree<Integer> tree = new TreeImpl<Integer>(6);   
            tree.addNode(
    3);
            tree.addNode(
    16);
            tree.addNode(
    5);
            tree.addNode(
    4);
            tree.addNode(
    2);
            tree.addNode(
    10);
            tree.addNode(
    30);

    最后得到的一副如下的圖

    呵呵,這樣的話就可以隨時查看樹的結構了,我們所需要做的只是把object toString一下就可以。

    附上一些文件

    演示的錄屏文件

    完整的代碼 

    posted @ 2010-08-11 12:59 Jet Geng 閱讀(3819) | 評論 (1)編輯 收藏

    近來想了解一下關于網站建設方面的內容。自然而然的就找到了Drupal這個東西。剛開始沒有發現他是多么的強大。抱著試試看的態度,

    搭建了一個環境跑跑看。看完之后驚呼強大!他的強大來源于他的高度的可擴展,豐富的模塊,主題。讓你可以不寫一行代碼構建出一個不錯的網站來。 看到這么強大的東西,就禁不住好奇往里看。于是找到了一些資料特與大家共享: 書籍:

    •  Using Drupal
    • Drupal 6 Attachment Views
    • Pro Drupal Development 悄悄的說一聲,這幾本書在itpub上都有下載。

    視頻:

    還有兩個很不錯的網站。

    上面提供了很多高質量的教學視頻。讓我這個初學者很快對drupal有個直觀和深入的了解。

    youtube.com上也有很多視頻,有梯子的童鞋可以過去看看!

    posted @ 2010-05-30 23:44 Jet Geng 閱讀(1662) | 評論 (0)編輯 收藏


    文中提到的代碼castexception_src
    編譯好了包括不同的版本org.gunn.castexception.supplier插件文件為castexception_bin
    posted @ 2010-05-14 19:15 Jet Geng 閱讀(2682) | 評論 (6)編輯 收藏

    問題

    這兩天在寫一個小東西。這個小東西是一個大東西的一部分。其實也就是其中的一兩個類。而這個大東西需要部署到一個特定的環境中去運行。所以有一堆的限制條 件,比如什么配置文件啊,包名,版本之類的什么東西。稍微有點差錯就沒有辦法運行。需要正確得到這些東西需要一個很龐大且冗長的構建過程。而我寫的也就是 兩三個類,所以最直接的方式就是把我寫的java 文件編譯或的class 文件直接復制到jar文件中。 完成這樣工作有好幾中方式,最直接的方式就是純手工打造


    GraphViz image

    PS: 這種方式費時費力,需要在不同的窗體間進行切換。例如我現在就在Eclipse、WinRaR和Windows資源管理器間切換。

    解決過程

    如何避免這個過程呢,盡量不用人來參與其中。這個肯定就是讓一個小程序來把這幾個動作連接起來。而且還要能夠方便變動。比如我現在不想往a.jar 里面copy了。我想向b.jar 中復制了。所以就想到了腳本。對讓腳本來完成這樣的事情。第一反應想到的是ant

    Ant 我的主角

      Ant 是 何須人,就不用我多說了。其實我了解也不多,只是知道這個小螞蟻蠻力超大。下面就著手解決問題。第一反應就是找到一個直接copy的任務,把 fileset中的文件復制到jar文件中。但是遺憾的是我沒有能夠找到這樣一個Task.這個時候我的思維陷入了困境。下面該怎么辦?

    困境

    沒有現成的東西,沒有現成的能一步完成的東西?如何是好? 我是程序員,所以我我自己可以寫一個task來滿足這樣的需求啊。對啊,我可以自己寫的!正當我為這個想法興奮不已時,正卷起袖子準備“大干”的時候。突然想起某人說過 不要重新造輪子! 。所以就追問了我自己一句: 角處會有什么呢?

    我的拐角

    既然Ant有蠻力,我可否利用一下他的蠻力呢?通過如下的這么一個流程來達到我的目的。


    GraphViz image

    這里用了一個temp文件夾作為中轉,先解壓,copy需要的文件,最后jar一下獲得最后的更新好的jar。 最終獲得了如下的build.xml

    <target name="prepare">
                    
    <mkdir dir="${temp_dir}"/>
            
    </target>
            
            
    <target name="build" depends="prepare">
                    
    <echo message="unzip">Uzip Jar file</echo>
                    
    <unjar dest="${temp_dir}" src="${comp_plugin}/${contain_plugin}">
                    
    </unjar>
                    
    <copy todir="${temp_dir}">
                            
    <fileset dir="./bin">
                                    
                            
    </fileset>
                    
    </copy>
                    
    <jar update="true"
                            destfile
    ="c:/${contain_plugin}" 
                            basedir
    ="${temp_dir}" >
                    
    </jar>
            
    </target>
      

    調整的過程

    看上去,所有問題都解決了。但是偏偏在使用的時候遇到了小問題。我的jar包是要在osgi環境下工作的。所以特別依賴MANIFEST.MF文件。偏偏jar 這個任務默認情況下會生成一個默認的MANIFEST.MF文件。如果任由他胡來的話,就全蝦米了。所以要稍微調整一下。


    <jar update="true"
                            destfile
    ="c:/${contain_plugin}" 
                            basedir
    ="${temp_dir}" 
                            manifest
    ="${temp_dir}/META-INF/MANIFEST.MF">
    </jar>
     

    這樣就可以了。大功告成!!

    posted @ 2009-11-26 18:07 Jet Geng 閱讀(2450) | 評論 (3)編輯 收藏

    在我們創建領域模型前,我們有必要了解一下我們的模型用來表達什么內容。 所以我就先解釋一下在這個系列文章中要實現應用。 假設Eclipse組織邀請你編寫一個讓他們管理貢獻者和項目的應用程序。

    我們需要創建一個模型來表達客戶提供的信息。他們有可能如下圖。

    讓我們進一步的看看這個模型。

    Fundation

    fundation是這個模型的根,他擁有兩個列表屬性。

    projects: 像EMF,Techonlogy,Platform這樣的頂級項目。
    persons: 參加一個或多個項目的人。
    Project

    Eclipse項目擁有很多屬性,比如項目開始和結束時間、項目的主頁的url等等。下面列出我們最感興趣的。

    subprojects: 一個項目可以擁有多個子項目。子項目本身也可以擁有多個子項目。
    parent: 項目有一個父親(除了頂級項目外)。這就意味著項目和子項目(project-subproject)的關系是一個雙向的關系。
    projectleads 一個項目有多個項目領導人。
    committers 一個項目可以擁有多個貢獻者。
    CommitterShip

    當一個用戶成為一個項目的貢獻者(Committer)時,這就建立了一個committership。他擁有一個開始時間和結束時間。另外我們還要記錄下下面的屬性。

    project: 和committership相關的項目。項目和committership是一個雙向的關系。
    person: 參加項目的人。
    Person

    貢獻者或項目領導人的信息。我們關系的信息如下:

    committerships: 用于保存和人相關的所有的committerships.這說明人和committership是一個雙向關系。

    下面這張類圖給出了關于上面模型的全貌。

    正如你所看到的,我把許多關系設成了雙向關系。 As you noticed I modeled many of the relations as bidirectional relations. 這個并不是嚴格要求所有地方都要這樣,因為有的地方可以通過eComtainer來獲取他的父親。就像project-subproject一樣。 但是包含關系(containment relationship)在使用databinding的情況下就不太合適了。因為從子到父親時沒有對應feature,只能通過調用eContainer()方法來獲得。 EMF提供了一個編輯器來創建你的Ecore-Model并把它保存成XMI格式。我們可以用它來創建測試數據。下圖就是一個例子。

    posted @ 2009-11-07 22:41 Jet Geng 閱讀(2048) | 評論 (0)編輯 收藏

    1.譯序

    在學習EMF-Databinding的時候發現了Tom Schindl的博客。他的博客中有一個關于EMF Databinding的專題。感覺很不多。想嘗試著翻譯一下。 那么Tom Schindl是何許人也?他是JFace項目的一個Contributor,在2007年Eclipse Zone 就曾經采訪過他。 所以稱他為EMF Databinding的專家一點也不過分。

    Note

    原文為路徑為http://tomsondev.bestsolution.at/2009/06/06/galileo-improved-emf-databinding-support/

    2. 原文

    我很高興的宣布在Eclipse-Galileo中EMF-2.5已經開始支持新的Eclipse-Databinding API了。榮譽歸Matthew Hall,他審查我的代碼,幫我整理支撐部分并且整理文檔(詳細內容在bug 262160 中)

    幾周前我成為了EMF項目的捐獻者,現在我負責Databinding對EMF的支持模塊。我將盡力修正API中的問題,回答Newsgroup中的問題。

    請允許我在介紹這個API的優點以及如何使用它之前聲明一點:這個API還處于過渡期,他可能會有一些細微的變化。不過我們將會詳細說明變化的部分。

    我將用一個系列文章來展現這個新的EMF-Databinding:

    第一部分:創建領域模型
    第二部分:介紹新的Properties API
    第三部分:用EMF-Databinding綁定到TreeViewer
    第四部分:在master-detail模式中使用Properties API
    第五部分:用EMF-Databinding綁定到TableViewer
    第六部分:Write your own Property for unsupport Widget-Types
    第七部分:Make the storage system plugable

    為了讓你快速進入EMF-Databinding中,我在前幾天做了一個例子。

    所有代碼都是基于EPL協議,你可以在從Eclipse-CVS 處獲得。

    posted @ 2009-11-07 22:39 Jet Geng 閱讀(2048) | 評論 (0)編輯 收藏

    在看《卓有成效的程序員》 迷你書的時候,發現gant這個小東西。一下子就被他鎮住了。心想原來還可以通過這種方式來使用ant。

    隨后在ibm的技術網站上找到了用Gant構建軟件 這個在線教程。簡單的過了一下,發現還真的好用。還有因為工作原因經常需要寫一點測試用的web service。而我對這個又不是特別屬性,想用Java來寫有怕太麻煩。所以想找一找有沒有什么動態語言很方便的能夠實現web service(其實重點是找python的)。最后還是發現GroovyWS. 通過這樣兩個小東西,我發現groovy真的很不錯。特別是對于java程序員來說。所以準備系統的學習一下他。特此記下。

    posted @ 2009-11-07 22:38 Jet Geng 閱讀(255) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲AV成人潮喷综合网| 亚洲一区二区三区乱码在线欧洲| 亚洲人成人网站色www| 一区二区三区亚洲| 亚洲国产成人精品无码区二本| 在线观看免费黄网站| 日韩精品视频免费在线观看| 亚洲成a人片77777kkkk| 羞羞的视频在线免费观看| 最近免费中文字幕大全免费| 亚洲高清国产拍精品青青草原| 亚洲精品综合久久中文字幕| av午夜福利一片免费看久久| 午夜免费福利影院| 亚洲综合激情六月婷婷在线观看 | a级毛片免费网站| 亚洲精品无码久久久久sm| 国产成人人综合亚洲欧美丁香花 | 亚洲乱码一二三四区乱码| 天天拍拍天天爽免费视频| 青青草原精品国产亚洲av| 1000部禁片黄的免费看| 国产l精品国产亚洲区在线观看| 成人免费乱码大片A毛片| 免费中文字幕一级毛片| 亚洲色大成网站www| 中文字幕影片免费在线观看| 亚洲福利一区二区| 在线观看免费大黄网站| 国产黄色免费观看| 亚洲精品无码久久久久久久| 日韩在线a视频免费播放| 久久久久国色AV免费观看| 亚洲欧洲日产国码一级毛片| 成a人片亚洲日本久久| 亚洲永久无码3D动漫一区| 波多野结衣免费在线观看| avtt天堂网手机版亚洲| 成人AV免费网址在线观看| 无码的免费不卡毛片视频 | 国产性爱在线观看亚洲黄色一级片 |