Hello Two Tigers

0

源起

兩隻老虎跑的快,這次需要兩隻老虎(JRE5)在不同山(OS)上,用之前做過一陣子的 Slax 練習延伸出來,同時改用 SLAX 5.1.8 正式版。

參閱 Native Tomcat in SLAX 或是 SLAX Popcorn in vmplayer

先搬一座山

首先要到網路邊的 SLAX 網站搬來一座山 SLAX Popcorn Edition v 5.1.8, 這裡是下載 slax-popcorn-5.1.8.iso。

http://www.slax.org/download.php

找塊地

再來裝個建一座山的基地,這裡因為在 windows 上跑,就用 VMware Player 來當 基地。

http://www.vmware.com/products/player/

http://www.slax.org/forum/viewtopic.php?t=7338

http://software.newsforge.com/article.pl?sid=06/05/16/1940214

找點土

這座山本身很硬都是石頭,不長東西,於是接下來你還需要一些土(硬碟),讓老虎有地方住。

http://www.easyvmx.com/downloads.shtml

找人整理一下

有了 iso/vmdk 原料,就可以寫個 tiger1.vmx 文字檔來將這些東西黏起來。

guestOS = "linux" 
displayName = "tiger1" 
config.version = "7" 
memsize = "256" 
ide0:0.present = "TRUE" 
ide0:0.fileName = "500MB.vmdk" 
ide1:0.present = "TRUE" 
ide1:0.fileName = "slax-popcorn-5.1.8.iso" 
ide1:0.deviceType = "cdrom-image" 
floppy0.present = "FALSE" 
Ethernet0.present = "TRUE" 
ethernet0.addressType = "generated" 

這些材料放一起(同目錄)後,直接按兩下 vmx 檔,應該就會跑起來。

整土

開始規劃硬碟,並測試,注意 player 認為有硬碟就會從硬碟開,但是系統放在 iso 中, 所以規劃硬碟後第一次啟動要改 biso (F2) 將 CDROM 啟動放前面。

  1. dmesg | grep hda
  2. fdisk /dev/hda
  3. n p 1 enter enter w
  4. mke2fs /dev/hda1
  5. mkdir /mnt/hda1
  6. reboot

山在哪裡 ?

  1. ifconfig
  2. netstat -at
  3. chmod +x /etc/rc.d/rc.sshd
  4. /etc/rc.d/rc.sshd start
  5. netstat -at

放隻老虎

可以下載 slackware 來裝比較快。

http://packages.slackware.it/search.php?v=current&t=1&q=jdk

  1. scp jdk-1_5_0_09-i586-1.tgz to tiger1 /mnt/hda1
  2. cd /mnt/hda1
  3. tgz2mo jdk-1_5_0_09-i586-1.tgz jdk-1509.mo
  4. uselivemo jdk-1509.mo
  5. /usr/lib/java/bin/java -version

其實安裝過程有裝 /etc/profile.d/jdk.sh 不過一開始沒有啟用這個 jdk mo 所以無法幫忙 設定路徑。

調整一下

主要是啟動 sshd 跟使用 jdk。

  1. mc -e /etc/rc.d/rc.local
  2. configsave /mnt/hda1/slaxconf.mo
  3. reboot
uselivemod /mnt/hda1/jdk-1509.mo
chmod +x /etc/rc.d/rc.sshd
/etc/rc.d/rc.sshd start

啟動過程會問要不要用自動找到的 slaxconf.mo,如果沒有按下確認,不會載入這個 slaxconf。

兩隻老虎兩座山

建立 tiger2 目錄,複製 iso/vmdk/tiger1.vmx,改個名字 tiger2.vmx,把 vmx 檔案中 後來 player 加的東西刪掉,按兩下啟動,記得第一次啟動要按 F2 改 bios 啟動順序, 啟動後會問是否要使用 /mnt/hda1/slaxconf.mo ,按 enter 就可以用了。

每次放老虎實在太煩了

先下載這個編輯程式。

http://myslax.bonsonno.org/download.php

再來取出之前作好的 jdk-1509.mo,開啟 myslax creator 放進去,再建立新的 ISO 檔來用。 這次的 ISO 檔不需要靠 /etc/rc.d/rc.local 手動起用 jdk。

接下來可以刪掉 /mnt/hda1/jdk-1509.mo,如果不需要啟動 sshd,可以連 slaxconf.mo 刪掉。

觀察

  1. tiger1 比較費工,接下來要幾台有幾台,裝起來很輕鬆。
  2. 將 jdk mo 寫到 iso 中會比較方便複製。

build.xml in haha.remix.foo

0

源起

之前包的 haha.remix.xxx 採用 Bundle-ClassPath: lib/xxx.jar 的做法,這樣比較快, 不過在採用端,eclipse 會發生 PDE 無法編譯的現象,猜是 jar 放在 jar 之中緣故, 於是改一下作法。

做法

就是解開重新包而已,同時修改 MANIFEST.MF 去掉 Bundle-ClassPath,這時候 如果有 Export-Package,會出現叉叉,只要將 eclipse 的 build path 加上 build/classes 就可以了。

<target name="unzip.jar">
  <delete dir="build/classes"/>
  <mkdir dir="build/classes"/>
  <unzip dest="build/classes">
    <fileset dir=".">
      <include name="lib/*.jar" />
    </fileset>
  </unzip>
</target>
<target name="make.bundle">
  <jar destfile="dist/haha.remix.foo-1.0.0.jar" 
      manifest="META-INF/MANIFEST.MF" 
      basedir="build/classes">
  </jar>
</target>

觀察

  1. 這裡用 ant 來處理這些工作,似乎 maven 也可以做,有機會再試看看。
  2. 做這些事有時非必要,如果已經提供現成的包,又可以解決,還是用現成的方便。

hello xmlbeans 2

0

源起

在 spring-osgi 練習中,使用 Apache Xmlbeans 來做 XML 的工作,這裡紀錄一些常見的問題。

java 5

加個 javasource 參數可以不用陣列,改回傳有型的 List,方便使用。

<xmlbean schema=”schemas” destfile=”dist/Schemas.jar” classgendir=”build” srcgendir=”src” javasource=”1.5” />

基本產出過程

ProjectDocument foodoc = 
ProjectDocument.Factory.newInstance();
ProjectType pj = foodoc.addNewProject();
ProfileType pf = pj.addNewProfile();
pf.setName("HAHA");
pf.setSummary("SUMMARY");

XmlOptions opts = new XmlOptions();
opts.setSavePrettyPrint();
// namespace 
HashMap suggestedPrefixes = new HashMap();        suggestedPrefixes.put(
"http://config.service.haha/ns/project", "so");
opts.setSaveSuggestedPrefixes(suggestedPrefixes);

foodoc.save(System.out, opts);

會輸出下列結果 :

<?xml version="1.0" encoding="UTF-8"?>
<so:project xmlns:so="http://config.service.haha/ns/project">
  <profile>
    <name>HAHA</name>
    <summary>SUMMARY</summary>
  </profile>
</so:project>

xpath

xpath 的支援有限,而且不同版本之間不是相當穩定, 採用的 namespace 方式似乎和文件本身有很大關係, 不支援屬性的比對來取出 id 小於 10 的原因還要再查。

String ns = "declare namespace pj='http://extremepattern.com/ns/project';";
// error $this/pj:project/pj:requirements/pj:summaryGoal;
// error $this/pj:project/pj:requirements;
// error $this/pj:project/requirements/summaryGoal[@id < 10];
String xpathStatement = ns + "$this//pj:project/requirements/summaryGoal";        
XmlObject[] queryResult = pinfo.getProjectDoc().selectPath(xpathStatement);

另外就是取出的物件並非拷貝版,任何更動都會改變原文件。

http://xmlbeans.apache.org/docs/2.0.0/guide/conSelectingXMLwithXQueryPathXPath.html

foreach

常常需要取出部份的符合條件的節點,可以用 xpath 或是自己 foreach 去取出來。

List<SummaryGoalType> summaryList = reqs.getSummaryGoalList();
List<SummaryGoalType> result = new ArrayList<SummaryGoalType>();        
for (SummaryGoalType type : summaryList) {
  if (type.getId() < 10 ) {
    result.add((SummaryGoalType) type.copy());
  }
}

和 xpath 相比,可以比較的方式更複雜,也可選擇取出複製版或是原始版, schema 變動反應 refactoring 需求時,編譯會直接出問題無法過,用 xpath 方式 需要用 unit test 去反應出來,編譯可能不會出問題。

srcgetidr

srcgendir 輸出的東西和 jar 的東西不一樣,只有使用產生的程式碼可以 編譯,但是執行時期會出現錯誤。

<target name="schmea.to.java">
<xmlbean schema="schemas" 
   destfile="schemas/haha.service.config.schemas.jar" 
   fork="false" 
   classpathref="supportlib.classpath" 
   javasource="1.5" srcgendir="xsdsrc" 
/>
</target>

所以在開發 bundle 時候,需要將 haha.service.config.schemas.jar 掛起來,等到要包裝時,再把 haha.service.config.schemas.jar 打散,一起放到 jar 根目錄去。

參考之前的做法 build-xml-in-haha-remix-foo

觀察

  1. 需要跟 JAXB 2.0 比較看看。

Bundle-to-bundle OSGi Network

0

源起

日前進行了一陣子的 hello spring-osgi 系列練習,學著如何將原先緊密結合的軟體分散為較為鬆散的網絡結合方式,對 OSGi 的觀察集中在這裡寫。

因為是一種包包(Bundle)之間的網路,下簡稱為 B2B,並非企業對企業的意思,反而比較像是 P2P 這類網路。

Anemic Bundle Model ?

做這類網絡需要平台支援,這裡用的是 OSGi,練習做著做著想到似乎越做越像某種貧血模式。之前大量採用空轉包 remix bundle 的方式來當這類網路的節點,這樣是否會形成某種 Anemic Bundle Model 現象,花費成本在這類不穩定關係網路平台(OSGi)上,卻只建構不需要這類不穩定關係平台的包(Bundle)。

在整合 spring 上,需要跟很多的既有 lib 連結,來使用這些既有 API 提供的服務,一開始為求方便與習慣,會反覆地作之前提到的 remix 轉包動作,慢慢地感覺到包包之間這種去中心化的連結方式和之前 jar 連結方式的不同,這樣做是否適合。

觀察增加的工作量有不少是調整包與包之間的輸出的服務(API)規格,之前的 Jar-to-jar(J2J) 是綁進來就可以用,屬於比較一種堅固的既有關係,類似人類的血緣關係,B2B 則是一種鬆散的關係,類似朋友之間的關係。

這種關係的不確定性會帶來彈性跟成本,就像交朋友一樣,可選擇,可拒絕,可接受但是也代表維護這種複雜不穩定關係的成本比較高。

朋友關係可不可以像親人關係一樣對待永遠沒有答案,只是採用某種連結特徵意味著某種特徵成本,舉 Anemic Domain Model 為例,採用 Domain Model 這類關係網路需要花費錢在 ORM 上面,但是卻在網路節點上大量採用不需要 ORM 的簡單物件,有點本末倒置。

http://en.wikipedia.org/wiki/Decentralization

http://en.wikipedia.org/wiki/Peer-to-peer

Spring-OSGi = BB2BB Network

Spring 提供另一種 B2B 網路是 Bean-to-bean,這類網路也是類似 J2J 網路,屬於既有堅硬關係的網路。利用 Spring-OSGi 將這個 B2B 包在另一個 B2B 之中形成簡稱的 BB2BB Network 如下,於是 beanHehe 可以連結到 beanHaha,通過堅固穩定關聯的 BeanNetwork 與鬆散不穩定關聯的 BundleNetwork。

BeanHaha-BeanNetwork-Bundle-BundelNetwork-Bundle-BeanNetwork-BeanHehe

這類網路有緊有密的網路關係類似人際網路,也代表人際網路的不特定性也會展現在這類網路, 物件導向利用抽象化映射現實環境以解決問題,這類關係是否可以用服務導向來映射,還要再觀察。

SOA (TODO)

Service-oriented architecture (SOA) http://en.wikipedia.org/wiki/Service-oriented_architecture

Hello Wicket and Spring-OSGi

0

源起

想要嘗試 wicket 開發網頁的方式,並套到 Spring-OSGi 的環境中。

hello wicket

在 web.xml 中可以看出整合的關係,上半部是 Spring 的部份喚起 ContextLoaderListener 並 採用 OsgiWebApplicationContext 當 ContextClass。

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
  <param-name>contextClass</param-name>
  <param-value>
  org.springframework.osgi.context.support.OsgiWebApplicationContext
  </param-value>
</context-param>
<listener>
  <listener-class>
  org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

下半部就是宣告 wicket 的使用,並用 SpringWebApplicationFactory 來注入 bean。

<servlet>
<servlet-name>HelloWorldApplication</servlet-name>
<servlet-class>
  wicket.protocol.http.WicketServlet
</servlet-class>
<init-param>
  <param-name>applicationFactoryClassName</param-name>
  <param-value>
    wicket.spring.SpringWebApplicationFactory
  </param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>HelloWorldApplication</servlet-name>
  <url-pattern>/hello/*</url-pattern>
</servlet-mapping>

applicationContext.xml 中 BundleViewer 是一個 BundleContextAware 介面的實做,利用 BundleContext 可以得到 Bundles 的資料。 HelloWorldApplication 則是 wicket.protocol.http.WebApplication 的實做。 實際上 BundleViewer 這個 bean 會被注到某些 Page 去,但是在這個 xml 檔案中 無法看到這些關聯,注入行為由 HelloWorldApplication 負責。

<bean id="bundleViewer" 
  class="haha.osgi.webconsole.wicket.BundleViewer"/>

<bean id="wicketApplication" 
  class="haha.osgi.webconsole.wicket.HelloWorldApplication" />

HelloWorldApplication 需要加個 init 來注入需要的 bean。

public class HelloWorldApplication extends WebApplication {

@Override
protected void init() {
  // THIS LINE IS IMPORTANT - IT INSTALLS THE COMPONENT INJECTOR THAT WILL
  // INJECT NEWLY CREATED COMPONENTS WITH THEIR SPRING DEPENDENCIES
  addComponentInstantiationListener(new SpringComponentInjector(this));
}

@Override
public Class getHomePage() {
  return HelloWorldPage.class;
}

HelloWorldPage 只要加一行,不能初始化,也不需要 setter。

@SpringBean
private BundleViewer bundleViewer;

觀察

  1. wicket 跟 Spring 的整合有許多方式,這是利用其中 wicket-spring-annot 提供的支援 來做的。
  2. wicket 還需要多練習。

Older posts: 1 2 3 4 5 6 ... 18