2007/10/18

Hudson(winstone)の起動ポート(port)の変更方法

Hudsonはwinstoneのコマンドラインがそのまま使えます。

このため起動portを変えたかったら「Command-line options」にある「--httpPort」でport番号を指定すればOK
java -jar hudson.war --httpPort=1192


なのでwinstoneも同じ方法でportが変更できる。


なんかもったいないので見つけ出した過程を書いとく。

ずっと探してたけどわかんなくて結局Hudsonのコードを見て探し当てた。

winstoneの起動コマンドでportが変更できるのを知ってたので
hudsonからwinstoneの起動場所のコードをいじる方針で調査開始!

<起動Mainのクラス名の検索>
・Hudsonは起動時に%TEMP%フォルダにhudson.warを解凍するので見に行く
・META-INF\MANIFEST.MFのMain-Classを見る
・Mainというクラスが始めに起動することがわかった

<起動Mainのクラスコードの検索>
・HudsonのコードからMain.javaを検索
・4つMain.javaあったがデフォルトパッケージの「hudson/war/src/launcher/java/Main.java」を開く

<winstone起動場所の調査>
・Main.main(String[] args)を見るとjarを読み込んでる
・winstoneのMainクラス「winstone.Launcher」を呼び出してる場所を発見
・Mainクラスのコマンドライン引数に「--warfile」を追加して、
 winstone.Launcher.mainを起動しているだけと判明




ちなみに、hudsonのプラグインで「port-allocator」なるものがあった。
ヘルプを見るとHTTP_PORT, ADMIN_PORT, SHUTDOWN_PORTが指定できるそうなので、引数指定しなくてもよくなるかもしれない

2007/10/16

Hudson(winstone)で日本語が文字化けたのをむりくり直す

CIツールとして個人的に大流行のHudson!
簡易httpサーバとしても利用できるので大変重宝している。

しかし、こやつを介して静的なHTMLを表示しようとすると
日本語が文字化けるんです…

HTML側でContent-Typeで「Shift_JIS」とかにしても
強制的に「ISO-8859-1」になってしまう。

なんか優先順があるのかなーと思ったらあった

確かにfirefoxのLiveHTTPheadersで見ると強制的に指定されている…

でもどこでHTTPのContent-Typeヘッダのcharsetパラメータを変えてるのかずっと探していた

が、どうやらwinstone↓が原因…
http://blog.cles.jp/item/2173
※clesさんありがとうございます

修正方法は2種類あるようだ、しかし↓にFilter変更は目的違いなのでは?と書いてあった
http://d.hatena.ne.jp/chinpeinet/20070919
※chinpeinetさんありがとうございます


なので、doGet()/doPost()を修正する方法でチャレンジ!

したのですがうまくいかない…


ひとまず強制的に「UTF-8」にするように変更してみた。


<1.winstoneのコードを取得>
・「winstone java」あたりでググってコードを持ってくる
・適当な場所で解凍
※今回は「winstone-src-0.9.9.tar.gz」を使った

<2.winstoneのコードを変更>
・Eclipse>ファイル>インポート>既存のプロジェクトをインポートでwinstoneを指定
・mavenの依存関係があるので「ビルドパス」で関係を削除
※使用しているjreのversionが直書きなので、異なっていたら変更
・src/java/winstone.WinstoneResponse.getCharacterEncoding()の「ISO-8859-1」を「UTF-8」に変更



・保存してコンパイル
・「winstone-src-0.9.9\build-eclipse\winstone\WinstoneResponse.class」をコピー

<3.hudson.warの解凍>
・hudson.warをzip解凍

<4.winstone.jarの再生成>
・hudson直下にあるwinstone.jarをzip解凍
・「winstone\winstone」に「2」でコピったファイルを上書きペースト
・winstoneフォルダで「jar cvfm winstone.jar META-INF\MANIFEST.MF .」
・winstoneフォルダにできた「winstone.jar」を取得

<5.hudson.warにwinstone.jarの配置>
・「3」のhudsonフォルダに「4」のwinstone.jarを上書き

<6.hudson.warの再生性>
・hudsonのソースを取得&解凍、直下にある「dummy.keystoreファイル」を取得して「3」に配置
ここからでも取得可
※今回は「hudson-1.146-src.zip」を使った
・以下のようなantスクリプト(build.xml)を作成して「3」に配置
<project name="hudson" default="war" basedir=".">
<target name="war">
<war destfile="hudson.war" webxml="WEB-INF/web.xml" manifest="META-INF/MANIFEST.MF">
<fileset dir="." excludes="META-INF/**,WEB-INF/**,build.xml,dummy.keystore,hudson.war" />
<metainf dir="META-INF" includes="maven/**"/>
<webinf dir="WEB-INF" includes="*" excludes="web.xml"/>
<lib dir="WEB-INF/lib" includes="*.jar"/>
</war>
<signjar jar="hudson.war" alias="hudson" keystore="dummy.keystore" storepass="hudson"/>
</target>
</project>

・コマンドラインから「ant」を実行

<7.hudson.warの起動>
・いつもと同じように「java -jar hudson.war」で起動


この方法だとfirefoxはうまく表示できたが、IE6では表示できなかった。

「2」の処理の時に「強制的にContent-Typeを指定しない」ように
修正をしたら、IE6でも文字化けしなかった。
(WinstoneResponse.validateHeaders():L242~253をコメントアウト)

表示方法をブラウザ側に委ねるので危険そうだ…

もうちょいよい修正方法はないものか…

2007/10/15

StatSVN(StatCVS)の文字化け(charset)をソースを変更して直す

StatCVSはCVSのCommit履歴を表示してくれるだけでなく
いつ、誰が、どれだけ開発しているかをまとめてくれる優れもの!

なんですが…

生成されるHTMLの「charset」が「ISO-8859-1」になってて
Commitログが文字化けてしまいます…

今までは生成されたHTMLのcharsetを「Shift_JIS」に変換するスクリプトで
対応していたのですが、生成するHTMLの数も多く変換処理が重くなってきたので
「最初っからShift_JISで出せよ!」と思い、オプション指定を探すためコードを見てたら


めちゃ直書きだ!!

「charset」はオプション変更で変えられないみたい…

なのでコードを直修正!!


<statCVSのソースを取得>
http://sourceforge.net/project/showfiles.php?group_id=57558
※現時点ではstatcvs-0.3のソースを利用

<Eclipseでプロジェクトをインポート>
Eclipse>ファイル>インポート>既存のプロジェクトをインポート

<コードの修正>
statcvs-0.3/src/net.sf.statcvs.pages.MarkupHTML.java
33行目の「ISO-8859-1」を「Shift_JIS」に変更



<statcvs.jarの展開>
statcvs.jarを取得して、zip展開する

<MarkupHTML.classの配置>
statcvs-0.3/classes/net.sf.statcvs.pages.MarkupHTML.classを取得
zip展開したstatcvsのstatcvs/net.sf.statcvs.pages.MarkupHTML.classに上書き

<JARの生成>
cd statcvs
jar cvfm statcvs.jar META-INF\MANIFEST.MF .


同じ方法でstatSVNも変更できます。
※statSVNのほとんどはstatCVSを使ってる

2007/10/12

maven2でソース(sourceDirectory)フォルダを複数指定

mavenでコンパイルする対象のソースフォルダ(sourceDirectory)を追加するには
maven1では「maven.xml」ファイルに「maven.compile.src.set」でパスを追加すればよかったけど、
maven2では「build-helper-maven-plugin」というプラグインで指定するようになった。



<project>
...
<build>
<sourceDirectory>src</sourceDirectory>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-source</goal>
</goals>
<configuration>
<sources>
<source>src2</source>
<source>src3</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>



ちなみにテストフォルダ(testSourceDirectory)を追加するには
maven1では「maven.xml」ファイルに「maven.test.compile.src.set」でパスを追加すればよかったけど、
maven2では同じように「build-helper-maven-plugin」で指定できる。



<project>
...
<build>
<testSourceDirectory>test</testSourceDirectory>
...
<plugins>
...
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>add-test-source</id>
<phase>generate-sources</phase>
<goals>
<goal>add-test-source</goal>
</goals>
<configuration>
<sources>
<source>test2</source>
<source>test3</source>
</sources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
...
</build>
...
</project>

2007/10/01

JavaPathFinderがコード提供なのでJarを作った

JavaPathFinderがコード提供なのでEclipseからコンパイルしてJarを作ってみた。
※やっぱNASAだから特殊なJDKつかってんのかなぁ…

「jpf release\build\lib」に「env_jpf.jar」「env_jvm.jar」「open-jpf.jar」を
作るために「ant」の「jar」ターゲットを実行しないと「jpf.bat」が動かない









これはEclipseと連動させたいなぁ

2007/07/06

Eclipse3.3のタスク管理(mylyn)をtracでやる

タスク管理の「mylar」が「mylyn」に変わり、eclipseのデフォルトプラグインになったそうな

これは使わねば!!

ということでeclipse3.3をインストールしたのですが



「trac」のコネクターがない!!




ので、UpdateSiteに接続
URLに「http://download.eclipse.org/tools/mylyn/update/e3.3」を指定




「trac」のコネクターだけを指定してインストール




無事tracにつなぐことができたとさ



つながらなかったら「XML_RCP権限の追加」をしてみるとよいかも

世間一般のBTSは「Bugzilla」なのかなぁ…

2007/06/06

Continuumの起動ポート(port)の変更方法

既存のApache等が立ち上がってる場合、Continuumが8080ポートで起動するのが困る場合があります。

そんなときは[Continuum]/apps/continuum/conf/application.xmlのportを変更しましょう



今回は8080から2236(富士山麓)に変更~

ちなみにこのファイルは初回起動時に作成されるので、初回起動してすぐに停止させてから編集しましょう

Continuumをサービスにしたらcvs loginで失敗する!?

「Windows」+「Continuum」+「CVSNT」でサービスにしようとしてる方は注意!!

なかなか便利なContinuumをサービスに登録してみた
登録バッチがあるので簡単かとおもいきや意外な落とし穴があった…

<サービス登録>
[Continuum]\bin\win32\InstallService.batを起動
※JAVA_HOMEがシステム環境変数に設定されていること

<環境変数設定>
バッチに環境変数を書いてる方は全てシステム環境変数に設定する(ユーザ環境変数ではない)
※cvs, java, ant, maven等のPATH、MAVEN_HOME、ANT_HOME

ここまでは順調だったがBuildしてみると以下のエラーがContinuum上に出ていた

Provider message: The cvs command failed.
Command output:
-------------------------------------------------------------------------------
cvs update: Empty password used - try 'cvs login' with a real password

cvs [update aborted]: authorization failed: server **.**.**.** rejected access to /PATH for user USER
-------------------------------------------------------------------------------


Adminや別Userでcvs loginしても.cvspassを作ってもダメ…


しかし、ContinuumのFAQを見てたら発見!!

CVSNT stores passwords in the registry


なにーレジストリ使ってるだと~!
さらに、

If you're running Continuum as a service, double-check the user it is running as, and make sure that you run cvs login as that user.


サービス起動ユーザをcvs loginしたユーザに指定しろとな



そしたらBuild成功~♪

2007/05/28

「Trac月1.3」+「Eclipse3.2」+「Mylar3.2(XML_RCP)」でタスク管理

ちょろいだろうと思っていた↑でかなり手間取ったのでメモっておく

1.「Trac月1.3」をインストール
2.「Eclipse3.2」をインストール
3.「Mylar3.2」をインストール
4.「Eclipse3.2」で「Windows-Show View-Mylar-Task Repositiories」ビューを追加
5.「Task Repositiories-右クリック-Add Task Repository」をクリック
6.「Server」「Label」を入れてから、「Access Type」を「XML-RCP」にして「Validate Settings」ボタンを押す

これでServerと接続できるはずが↓が出た?
Insufficient permissions for selected access type.

「Trac月1.3」は「XML_RCP」がインストールされているからいけるんじゃないの!?



…と思ったら、「Trac月1.3」は「XML_RCP」プラグインは入っているが「権限が付いていなかった」!

なので「XML_RCP」権限の追加を行う

1.「[TRACLIGHT_HOME]\bin」で「コマンドプロンプト」を開く
2.「setenv.bat」を実行
3.「trac-admin.bat [TRACLIGHT_HOME]\projects\trac\SampleProject」を実行
4.「permission add anonymous XML_RCP」を実行
※.「permission list」で追加されたことを確認

「all-in-one trac」と「trac-admin」の使い方が微妙に違ったのでてこずった…
当分tracで遊べそうだ♪

2007/05/10

JavaFXを試してみた!

巷で話題のJavaFXがどんなもんか試してみた。

HPのチュートリアルではNetBeansプラグインで動かしてるが
開発環境もどきが付属してるので問題なし。jreは必要。

1.openjfxのHPからドラフト版をDL。
 https://openjfx.dev.java.net/servlets/ProjectDocumentList

2.解凍してからtutorial.batを実行。


3.Editor部にHPのコード貼り付けてみる
 貼り付けると勝手に実行する


注意)チュートリアルのコードをそのまま貼り付けると「import javafx.ui.*」が抜けてるのでエラーする
 https://openjfx.dev.java.net/Getting_Started_With_JavaFX.html

・GUI部は高度なことを短いコードで実現できてよいかも
・正直Groovyの方がJavaっぽくてわかりやすい…

もうちょっと見守ってみよう…

2007/05/08

jre1.6にしたらIllegalAccessErrorが発生するようになった!?

jre1.5で動いていたものがjre1.6にした途端動作しなくなった…
原因を突き止めると無意識に「package privateはずし」をしていたようだ

なお、jdk1.5でコンパイルしたclassだとjre1.6で動かないが
Eclipse3.1(jikes)でコンパイルしたclassだとjre1.6で動く

「package privateはずし」を意図的にやってたら結構な修正が必要になりそうだ

この変更はこれかなぁ
http://java.sun.com/javase/6/webnotes/adoption/adoptionguide.html
4293149, 6383849: Stop relaxed access checking for classes in the same package with local classloader for when version >= 49


>**/1.5/bin/java temp2.Temp2
A
B
>**/1.6/bin/java temp2.Temp2
Exception in thread "main" java.lang.IllegalAccessError: tried to access class temp1.Temp1 from class temp2.Temp2
    at temp2.Temp2.print(Temp2.java:9)
    at temp2.Temp2.main(Temp2.java:15)



package temp1;

class Temp1 {

  private String name;

  public Temp1(String name) {
    this.name = name;
  }

  public String toString() {
    return name;
  }
}


package temp1;

import java.util.ArrayList;
import java.util.List;

public class Temp11 extends Temp1 {

  private List temp1 = new ArrayList();

  public Temp11(String name) {
    super(name);
    temp1.add(new Temp1("A"));
    temp1.add(new Temp1("B"));
  }

  public List getList() {
    return temp1;
  }
}


package temp2;

import temp1.Temp11;

public class Temp2 {

  public static void main(String[] args) {
    Temp11 temp11 = new Temp11("C");
    for (Object obj : temp11.getList()) {
      System.out.println(obj);
    }
  }
}

2007/02/07

JavaのEnumのswitch文は$SWITCH_TABLEメソッド?

javaのパフォーマンスを測ってたら、$SWITCH_TABLE*なる妙なメソッドがあったのでちょっと調査

Enumのswitch文があやしいのでサンプル作って逆コンしてみる
環境:eclipse3.1.0(win), jre1.5.0_06

// Enum switch サンプル
public class EnumNum {
public enum Num {
ONE, TWO, THREE, FOUR
}
public static void main(String[] args) {
Num num = Num.valueOf(args[0]);
switch (num) {
case ONE:
System.out.println(num.name());
break;
case TWO:
System.out.println(num.name());
break;
case THREE:
System.out.println(num.name());
break;
case FOUR:
System.out.println(num.name());
break;
}
}
}


// Enum 逆コン
public static void main(String args[]){
Num num = Num.ONE;
switch($SWITCH_TABLE$EnumNum$Num()[num.ordinal()])
{
case 0: // '\0'
System.out.println(num.name());
break;
case 1: // '\001'
System.out.println(num.name());
break;
case 2: // '\002'
System.out.println(num.name());
break;
case 3: // '\003'
System.out.println(num.name());
break;
}
}

static int[] $SWITCH_TABLE$EnumNum$Num(){
$SWITCH_TABLE$EnumNum$Num;
if($SWITCH_TABLE$EnumNum$Num == null) goto _L2; else goto _L1
_L1:
return;
_L2:
JVM INSTR pop ;
int ai[] = new int[Num.values().length];
try{
ai[Num.ONE.ordinal()] = 0;
}catch(NoSuchFieldError _ex) { }
try{
ai[Num.TWO.ordinal()] = 1;
}catch(NoSuchFieldError _ex) { }
try{
ai[Num.THREE.ordinal()] = 2;
}catch(NoSuchFieldError _ex) { }
try{
ai[Num.FOUR.ordinal()] = 3;
}catch(NoSuchFieldError _ex) { }
return $SWITCH_TABLE$EnumNum$Num = ai;
}

private static int $SWITCH_TABLE$EnumNum$Num[];


switchを使う場所で、Enum.ordinal()と整合性を取るためのint[]を定義&生成してるようだ
いつもEnum.size()を作ればいいのにと思うけど、何かの仕様があるのだろう…

2007/02/02

Vista UpgradeのAdviseをしてくれない…

自分のPCはVistaに対応できるかなっと♪試してみたら



「Windows Vista Upgrade Advisor で、システムのスキャン中にエラーが発生しました。問題が解決しない場合は、Windows Vista Upgrade Advisor をアンインストールして、最新バージョンを再インストールしてください。」

…というか最新ですが?

WindowsUpdate(高速・カスタム全部)して、
アンインストール、再起動、再インストールしたらなぜか動いた!?

その後も↑のダイアログがでたりでなかったり…

気になる結果は、3つ指摘を受けました
・HDDの容量があと15G足りん!
・DVD付けろ!
・ビデオカードがしょぼい!

そんなこと言われてもな…

2007/01/29

BloggerのAdsenseを英語から日本語にする

BloggerだとGoogle Adsenseの登録&設置が簡単で便利なのですが、広告の内容が英語になってしまいます
なので、日本語にするためにちょっと小細工…

「Blogger」→「ダッシュボード」→「テンプレート」→「HTMLの編集」で
以下の一行を追加します

<!-- google_language = 'ja'; -->


これで広告の内容が日本語になります

2007/01/26

バッチ(dos)が途中で止まる!?

antのタスクを連続起動したくてバッチを作った
rem 自動化.bat

ant clean
ant compile
ant test

このバッチをダブルクリックしても、最初のcleanしか実行してくれなくて路頭に迷う…(-_-;)

調べてみると、DOSは「バッチ1」から「バッチ2」を呼ぶと
「バッチ2」の終了とともに「バッチ1」も終了してしまう

そして「ant」は「ant.bat」だった…

なので「バッチ2」の終了時に「バッチ1」へ処理を戻すため「call」を呼ぶ必要がある

だから、これが正解でした!
rem 自動化.bat

call ant clean
call ant compile
call ant test


コマンドがexeかbatかを意識しないといけないんだなぁ

2007/01/25

1台のPCにIE3~7を別々に入れる

Install multiple versions of IE on your PC | TredoSoft

紹介ページ

IE7を試したかったのでこれで気楽にできる♪
自分のシステムをIE7で動作させたところ問題はなかったが、このBloggerは形がくずれすなぁ…

2007/01/24

既存HPに付箋(noteit)

気軽に使えるHP付箋のnoteit 1.2

<すごい!>
・既存HPに付箋機能が追加できるので汎用性が高い(wikiとの連携は強力!!)
・消しても履歴がゴミ箱でわかる
・RSSで誰かが変更したらすぐにわかる
・軽快に動作する
<うーん…>
・印刷されない!!(致命的)
・ファイルが添付できない→wikiに添付してリンクを張れば代用可
・固定ボタンを押さないと位置保存されない
・編集を抜ける時のOKボタンをマウスで押さないとダメ
・インストールが(いくらか)大変
・線でつながるといいなぁ~draw2dに期待(wemaでもいいか…)
・複数選択ができない
・FirefoxとIEで付箋の位置がずれる

2007/01/23

TPTP設定自動化スクリプト

Test & Performance Tools Platform Project Downloads

TPTPにall-in-oneなるパッケージがあったのでインストールしてみた

設定がわずらわしいのでvbsスクリプトで自動化
Agent Controllerはeclipseフォルダに入れたパスなので適度に修正してください


' TPTP設定自動化スクリプト

Dim objShell, objFso, ret

Set objShell = WScript.CreateObject("WScript.Shell")
Set objFso = WScript.CreateObject("Scripting.FileSystemObject")

' RASERVER_HOME確認
ret = objShell.Popup("環境変数RASERVER_HOMEを設定します",,,vbOKCancel+vbQuestion)
Select Case ret
Case vbCancel
WScript.Quit(0)
End Select

' RASERVER_HOME変更
objShell.Environment.Item("RASERVER_HOME") = objFso.GetFolder(".\agntctrl.win_ia32")

' PATH確認
ret = objShell.Popup("環境変数PATHを設定します",,,vbOKCancel+vbQuestion)
Select Case ret
Case vbCancel
WScript.Quit(0)
End Select

' PATH変更
objShell.Environment.Item("PATH") = objShell.ExpandEnvironmentStrings("%PATH%") & ";" & objFso.GetFolder(".\agntctrl.win_ia32\bin")

' SetConfig実行確認
ret = objShell.Popup("設定ファイルを生成します",,,vbOKCancel+vbQuestion)
Select Case ret
Case vbCancel
WScript.Quit(0)
End Select

' SetConfig実行
objShell.CurrentDirectory = ".\agntctrl.win_ia32\bin"
Call objShell.Run("SetConfig.bat")
objShell.CurrentDirectory = "..\..\"


' サービス登録確認
ret = objShell.Popup("エージェントコントローラをWindowsサービスへ登録します",,,vbOKCancel+vbQuestion)
Select Case ret
Case vbCancel
WScript.Quit(0)
End Select

' サービス登録
objShell.CurrentDirectory = ".\agntctrl.win_ia32\bin"
Call objShell.Run("manageservice.exe add ""TPTP Agent Controller"" " & objFso.GetFolder("..\"))
objShell.CurrentDirectory = "..\..\"



' TPTP解除自動化スクリプト

Dim objShell
Set objShell = WScript.CreateObject("WScript.Shell")

' サービス解除
Call objShell.Run(".\agntctrl.win_ia32\bin\manageservice remove ""TPTP Agent Controller""")