2008年12月31日水曜日

subversion+webdavのselinux on fedora10

subversion関係をインストールしておく。
  • yum install subversion
  • yum install mod_dav_svn
selinux設定変更
デフォールトではhttpdからの書き込みは出来ないので可能になるように設定
他のboolean設定は下記のような感じ適度にgrepして確認できます。
  • semanage boolean -l | grep http (要root権限)
  • getsebool -a | grep http
該当するディレクトリにcontextを設定
  • chcon -t public_content_rw_t /var/www/html/webdav/ -R
このままではrestoreconを実施したときにシステムデフォールトの/var/www/htmlの
設定で更新されてしまうので恒久的な設定になるように
を設定。確認のため
で"Verified"になればOK.

システムローカルの設定は
  • /etc/selinux/targeted/contexts/files/file_contexts.local
に保管される。

selinuxが稼働しているか
  • getenforce
  • sestatus
などで確認し"Enforcing"でなければ
  • setenforce 1
を設定し直して完了。

restoreconの利用

ls -l で確認できる限りrootで操作可能にファイルなのに
[Permission error]が発生した。
バックアップから取得してきたファイルだったのでselinuxの設定が生きている様子。

同じディレクトリのファイルと同じ設定にするには以下のコマンド

restorecon [file] コンテキストをファイルが配置してあるディレクトリと同じデフォルトの設定にする。


で解決。

2008年12月23日火曜日

eclipse ganymede subversive1222

12/22 1900のsubversiveを更新したら使えなくなった。
ワークスペースの.metadataディレクトリにある .bak_0.logファイルを確認すると、
"org.eclipse.team.svn.core.synchronize.UpdateSubscriber の変更セットを更新中" 中に内部エラーが発生しました。
java.lang.NoSuchMethodError: org.eclipse.team.svn.core.utility.FileUtility.isIgnored(Lorg/eclipse/core/resources/IResource;)Z


メソッドがない!ってどうしようもない・・・
「ヘルプ」-「ソフトウェア更新」-「インストール済みのソフトウェア」タブ 「構成を元に戻す」
でアップデート前に戻そうとしたけど、うまく行かず・・・

えらいクリスマスプレゼントもらっちゃいました。
会社の環境を(win XPだけど)更新するのはちょっと待っておこうっと。

12/31追記

workspace変更してsubversiveを再インストールしたら直った・・・
定期的にworkspaceのお掃除でもしないとダメなんですかね。

2008年12月3日水曜日

fedora10 eclipse

eclipse.orgのganymedeをfedora10で使っていると、コンテンツアシストやx-C x-Sで保存(emacsモード)しようとすると
フォーカスが?ずれてその後のキーボード入力をまったく受け付けてくれなくなってしまう。

fedora付属のeclipseを試すと若干いい感じになるけど、j2eeの開発環境(WTP)が揃えるのが大変そう…

ちょっと途方に暮れかけてたら、掲示板にネタがありました。

> 右クリックしてInput Methods > SCIM Input Method

これだけ。あーいつから初心者に戻ったんだろ。

2008年11月11日火曜日

maven test with IBM JDK

maven testを起動はClassLoaderが違うため結構戸惑う事が多い。
しかも、仕事上ではIBMのJDKを利用しているのでSUNとの違いがある場合にも戸惑ってしまった。

mavenで単体テストを駆動するのはsurefireのプラグインを下記のように仕込みます。

<reporting>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins<groupid>
<artifactid>maven-surefire-plugin<artifactid>
</plugin>
</plugins>
</reporting>
しかし現在のsurefireのバージョン2.4でClassLoaderの挙動を変更したらしく今まで動いていたテストがIBM JDKでは

java クラスが見つかりません: org/apache/maven/surefire/booter/SurefireBooter

といわれてしまいます。一度調査したところ、

<useSystemClassLoader>false<useSystemClassLoader>

を指定すれば解決する様子。

試してみると、今度は自作のテストライブラリで問題発生。
(具体的にはbetwixtを利用している部分でXXX.betwixtファイルが見つからなくなってしまった・・・)

しょうがないので
useSystemClassLoaderをtrueに戻し(デフォールト値のままなので削除)maven -X testのデバッグモードで探ってみるとテスト起動時のコマンドを探ります。

Forking command line: cmd.exe /X /C "C:\Progra~1\IBM\java\jre\bin\java -jar C:\DOCUME~1\myAccount\LOCALS~1\Temp\surefirebooter48643.jar C:\DOCUME~1\myAccount\LOCALS~1\Temp\surefire48641tmp C:\DOCUME~1\myAccount\LOCALS~1\Temp\surefire48642tmp"

起動しようとしている surefirebooter48643.jarの中身を確認するとMANIFEST.MFしか存在しません。
そのMANIFEST.MFで Class-Path,およびMain-Class を指定することでSurefireBooterを起動しようと
しているのですが、これがIBM JDKでは対応できていない?みたいなのです。

しょうがないのでmavenのサイト をよく確認すると
useManifestOnlyJarを改めて設定するとこの問題も解決するみたいです。

結果pom.xmlは下記のようになりました。

<reporting>
<plugins>
<plugin>
<groupid>org.apache.maven.plugins<groupid>
<artifactid>maven-surefire-plugin<artifactid>
<configuration>
<useManifestOnlyJar>false<useManifestOnlyJar>
</configuration>
</plugin>
</plugins>
</reporting>

ただし、useManifestOnlyJarの対応はsurefire2.4.3からのオプションなので

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins
<artifactId>maven-surefire-plugin
<version>2.4.3
</plugin>
</plugins>
</pluginManagement>
</build>

pluginManagementでバージョンも明示的に指定しておいたほうが無難です。

2008年10月30日木曜日

推奨ブラウザとWeb標準

Google Chromeも登場して再び"ブラウザ戦争"とあおる記事もありますが、かつてのIE,netscapeによる主導権争い
(プロプライエタリ)とは違うようです。

・独自拡張よりもWeb標準(W3C準拠)
 IE8 では標準モード/互換モードがあるとか。

Acid2 Acid3 に合格した事(何点とったか)が話題になる(話題にしてる?)

IEがまだ80%以上を占めている現状ではまだまだ難しいところだと思いますが、
ブラウザの選択肢も広がって、テストも各ブラウザごとに実施するコストは減るだろうし
ユーザー、開発者双方によいことだと思います。

現在ある程度の規模のサイトでは「推奨ブラウザ」を表示するのが一般的になっているみたいですが
これからはW3C準拠のアイコンに置き換わっていくのでしょうか?

少なくともブラウザの数が増えて、一定の占有度になれば
「推奨ブラウザ」の対象数を増やさないといけないでしょうからテストのコストと見合わせて
妥協点を探るのか、もしくはサイトをW3C準拠させるのかの判断が今後発生するのでは
ないかと思っています。

今まで開発現場はブラウザ独自仕様にずいぶん悩まされてきたのでいくらかでも開発が楽になってほしいものです。

2008年10月29日水曜日

jetty6 on windows with remote jmx

Jetty-Service.exe --install specific-service.conf
でWindowsサービス登録

JMX設定
特定のwindows用設定ファイルで以下の項目を追加(ポート番号は適当に)
認証を省いているのでもちろん、イントラ専用。
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=specific-port
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

jdk1.6 07 からに同梱されているjvisualvm.exeを起動し、
Remoteに"Add JMX Connection"で新規設定を行う。

hostname:specific-portを指定してOK。

自作のMBeanは次回がんばろうっと。
jetty with mx4j とどっちが良いのか不明。
mx4jのほうが機能が多いのかな・・・

2008年8月8日金曜日

RESTのHTTP認証

RESTアプリケーションをシステム間で採用する場合に認証処理を
利用することがよくありますが、プロバイダー側では提供するサービスによっては
複数の認証情報を扱わなければならないことがあります。

1.接続元システムの認証
2.プロバイダーが提供する会員のための認証

その認証を一緒くたには出来ないので、それぞれ認証処理を実施することになりますが、
1番はRESTなのでやはりHTTP認証(Basic,Digest等)+SSLあたりが現実的かと思います。

2番の認証のために複数のHTTP認証は利用可能でしょうか?

可能だとしても
・ログオフが出来ない。
・WSSEはplain passwordを保持しないとダメ。

のはプロバイダーとして頂けない
XML(entity)としてログイン情報を表現できるようになっていないとやっぱダメかも。

X- ヘッダー拡張して自作してみるか?
Query Stringに表現する?

2008年8月1日金曜日

イントラ用語集#5

Http Headerを取り扱う際の共通化をしたいのですが、いいサンプルが見当たりません。
RESTを取り扱う際には出来るだけServletAPI依存せずにHeaderを扱いたいのですが、
大抵はみかけるのは解析時にMapになっている程度のようです。

出力時にも便利な方法をさがしているのですが、

Restlet
でも実装のほうはcom.noelios.restlet.http.HttpConstantsで

public static final String HEADER_ACCEPT = "Accept";
public static final String HEADER_ACCEPT_CHARSET = "Accept-Charset";
public static final String HEADER_ACCEPT_ENCODING = "Accept-Encoding";
で宣言されてるだけ?みたいです。たぶん。


public class FieldName {
public static final FieldName ACCEPT = new FieldName("Accept", StringField.class);
public static final FieldName ACCEPT_CHARSET = new FieldName("Accept-Charset", StringField.class);
public static final FieldName IF_MODIFIED_SINCE = new FieldName("If-Modified-Since", DateField.class);
}

こんな感じで作ってみました。
ここで、ペアのStringField.classやDateField.classは出力時、解析時の
共通インターフェースをもつクラスです。

ここで問題になるのは、やっぱり拡張ヘッダーの扱いです。
このクラスはライブラリとして利用したいので逐一このクラスに追加される
のはやめておきたいので

public static final ArrayList<FieldName> EXTEND_FIELDS = new ArrayList<FieldName>(3);

拡張用の領域を設けてみて
(ArrayListの初期サイズに特別な意図はないです・・・)

public class XFieldName {
public static final FieldName X_WSSE = new FieldName("X-WSSE", StringField.class);

static {
FieldName.addFieldName(X_WSSE);
}
}


利用するプロジェクトで追加していくことでなんとかなるかもしれません。
このクラスを先にロードしてHTTPのリクエストが来る前に拡張ヘッダを追加しないと
いけないですよね。Servlet load処理にうまく関連づければいいのかな。

これで行ってみようと思います。

2008年7月31日木曜日

イントラ用語集#4

http://domain.name/context/servlet/path/info.ext

とURLが存在する時にRESTのアプリケーションを特定するルールを

springのbean idにそのまま割り当てて

Application application = (Application) ApplicationContext.getBean("path");

で取得することにしました。
"path"以降のPATH_INFOはそのままApplicationの引数に利用するので、
その仕様はApplication次第。
Applicationは以前のネタでHttpメソッドのHEADとexist()メソッドをマッピングさせようと思っていましたが
実装していったら、GETとHEADのレスポンスHTTPヘッダーは同じじゃないといけないみたいなので
参考になるのを探していたら、結局HTTPServlet#serviceメソッドと同じような実装になってしまいました。

でもServletAPIをラップしてコンテナ依存を実装では回避してテストしやすくなったかな?
JettyServletTesterがあるからコンテナ依存でもテストしやすくなったんだけど・・・

2008年7月28日月曜日

jetty on windows with p6psy

eclipse@windows, derbyで開発していたのですが、jetty6.1.7 をプラグイン経由で起動した時に
p6spyを利用すると"java.sql.SQLException: No suitable driver"が発生してしまう。

Derbyorg.apache.derby.jdbc.EmbeddedDriverに変更すれば問題なくDBアクセスもできるので
p6spyと相性がよくないみたい?

fedora8では問題ないみたい。
継続調査と。

2008年7月27日日曜日

eclipse@fedora8

fedora8でeclipse(ganymede)を利用しているのですが、今日のfedora のセキュリティーアップデート
を行ってから「BugBuddy」が登場して起動出来なくなってしまった…

コマンドラインから起動すると、

eclipse: xcb_xlib.c:82: xcb_xlib_unlock: Assertion `c->xlib.lock' が失敗しました

ってことみたい。

でもBugBuddyのダイアログを表示させたままならeclipseを利用できるようなのでなんとか
なったけど、何のアップデート入ってたかなー。忘れた…

ウロウロしてたら
LIBXCB_ALLOW_SLOPPY_LOCK=1
を設定することで回避できることがわかりました。

2008年7月23日水曜日

イントラ用語集#3

クールなURIは諸説イロイロあるみたいですが、用語集として扱う場合には
やっぱりwikipediaを参考にして

http://hogepedia/word/ブログ

見たいな感じがいいですね。

ここで拡張子を意識してURIを考えて、おおよその場合はHTMLで参照されることも考慮して
未指定の場合はHTMLとみなします。feedが欲しかったら

http://hogepedia/word/ブログ.atom

こんな感じでしょうか。
URIには不透明性が大事とも言われてますが、MUSTでもなさそうなので気にしないで
いきます。
たぶん、プログラムではURIをコテコテに組み立てるのは愚作だとは思いますが、
ユーザーがアドレスバーにキーワードを想定して入力するのは(想定できる事は)
便利なことではないかと思いますし。

IEではアドレスバーにはURLエンコードされないまま表示されていましたが、
firefox3でも同じように表示されるようになったため、メールなどにリンクを
貼り付ける場合には便利になりそうです。

蛇足ですが、firefox3 win版の場合はアドレスバーに「about:config」と入力して
「network.standard-url.encode-utf8」の値を"true"にしておいたほうがよさそうですね。

2008年7月22日火曜日

eclipse property editor

eclipse 3.4(ganymede)を利用していてプラグインのUPDATE通知が出来るようになって
property editor 5.0に更新されている通知がさっそく来たので
適応してみた所、ClassNotFoundが発生して使えなくなってしまった…

revertを実施しても戻らず、以前のバージョンを探しても見当たらず。
失敗した…

というか、上記は私が間違ってました。
インストールの際に表示される「インストール元の確認」(?)の
ダイアログが表示された際にチェックを入れるのを忘れてました…

一体なんだったんだ… 7days

2008年6月9日月曜日

ServletTesterとSpringFramework

jettyにServletTesterなるものがあるのに気がついた。
見てみると、Mockより現実的だし、Cactusよりも面倒くさくなさそう。

しかし、springのWebApplicationContextの取得に悪戦苦闘…

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener>

の部分は
addEventListenerメソッドですぐわかったのだけど、

<context-param>
<param-name>contextConfigLocation
<param-value>/WEB-INF/applicationContext.xml
</context-param>

どうもcontext-paramの設定がわからない。
setAttributeメソッドがあるけど、これはServletのInitParameterのようだし。

結局setResourceBaseを利用すればWebApplicationContextが取得出来ることがようやくわかった!
ソースはこんな感じ

private static ServletTester tester;
private static String baseUrl;

@Before
public void before() throws Exception {
tester = new ServletTester();
tester.setContextPath("/");
tester.addServlet(TestServlet.class, "/servlet");
// この方法はでは設定ファイルは見つからないよ
//tester.setAttribute("contextConfigLocation", "applicationContext.xml");
tester.addEventListener(new ContextLoaderListener());
// こっちの方法なら見つけられる
tester.setResourceBase("src/test/resources");
baseUrl = tester.createSocketConnector(true);
tester.start();
}

mavenな私のディレクトリ構造は

${project.home}
`- src/
|- main/
| |- java/
| `- resources/
|
|- test/
|- java/
`- resources/
`-WEB-INF/
`- applicationContext.xml

結局setResourceBaseはServlt環境から取得できるgetRealPath()にあたるのかな。
springではWebApplicationContext作成時に"WEB-INF/applicationContext.xm"が
定義されているのでうまいこと帳尻合わせた感じ。
なのでテストケースに合わせて設定ファイルの変更できず…ガックシ。

2008年6月3日火曜日

RESTとCRUD

Restfulで活用されるHTTP MethodはCRUDにあわせてPOST, GET, PUT, DELETEをマッピングして
考えられるが、HTTP/1.1に従う場合、「HEADメソッドも実装しなければいけない。」となっているのですが、
javaのメソッドとしてはどのように表現するのがしっくりくるのか悩んでます。
やっぱり、HTTP仕様を読む限り、existが正しいような気がする…


public class Application {
public void create() { } // POST
public void read() { } // GET
public void update() { } // UPDATE
public void delete() { } // DELETE

public void exist() // HEAD
}

2008年5月3日土曜日

イントラ用語集#2

前回の続き。
abderaのatom出力。

ソースは下記のような感じ。

Abdera abdera = new Abdera();
Feed feed = abdera.newFeed();
feed.addAuthor("著者");
feed.setTitle("タイトル");
feed.setLanguage("japanese");

Entry entry = abdera.newEntry();
entry.addAuthor("著者");
entry.setTitle("エントリー1");
entry.setPublished(new Date());
entry.addLink("http://hoge.jp");

feed.addEntry(entry);
feed.writeTo(System.out);


出力は下記のとおり。

<feed xmlns="http://www.w3.org/2005/Atom"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xml:lang="japanese">
<author>
<name>著者</name>
</author>
<title type="text">タイトル</title>
<entry>
<author>
<name>著者</name>
</author>
<title type="text">エントリー1</title>
<published>2008-05-03T04:27:27.960Z</published>
<link href="http://hoge.jp" />
</entry>
</feed>
romeとはnamespaceの違いがあるみたいですが、それぞれの実装を見てみると
abderaのほうが拡張性とか考えられてるみたいなのでabderaに決定。

2008年4月30日水曜日

イントラ用語集

wikipediaを参考に用語集の作成に挑戦するの巻。
  1. やっぱりREST
  2. 仕事的にjava
  3. 自分的にHITしたのでAtomPub
  4. spring使っておこう
  5. どれも仕事で使ったことはないけど、思いついたら実行してみる!
Atom
ライブラリを探してみると既にatom1.0に対応したライブラリも結構存在してた。
javaで選ぶとこのあたり?
ライセンスはどちらも問題ないみたい。(GNU系で芋づる式にopen souceということにはならないと思う。たぶん)
どちらも簡単に使ってみる。

まずはrome.

SyndFeed feed = new SyndFeedImpl();
feed.setAuthor("著者");
feed.setLanguage("japanese");
feed.setTitle("タイトル");

ArrayList list = new ArrayList();
SyndEntry entry = new SyndEntryImpl();
entry.setAuthor("著者");
entry.setTitle("エントリー1");
entry.setPublishedDate(new Date());
entry.setLink("http://hoge.jp/link");
list.add(entry);
feed.setEntries(list);

feed.setFeedType("atom_1.0");
SyndFeedOutput output = new SyndFeedOutput();
System.out.println(output.outputString(feed));


で出力がこれ。

<feed xmlns="http://www.w3.org/2005/Atom"
taxo="http://purl.org/rss/1.0/modules/taxonomy/"
rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
sy="http://purl.org/rss/1.0/modules/syndication/"
dc="http://purl.org/dc/elements/1.1/">
<title>タイトル</title>
<dc:creator>著者</dc:creator>
<dc:language>japanese</dc:language>
<entry>
<title>エントリー1</title>
<link rel="alternate" href="http://hoge.jp/link">
<author>
<name>著者</name>
</author>
<updated>2008-05-01T14:59:34Z</updated>
<published>2008-05-01T14:59:34Z</published>
<dc:creator>著者</dc:creator>
<dc:date>2008-05-01T14:59:34Z</dc:date>
</entry>
</feed>


うーん、abderaは次回。

2008年4月29日火曜日

firefox キーワード検索

Firefoxの覚書き(wikipediaのアドレスバー検索)
1.とりあえず wikipedia に行く。
2.左側中断の検索キーワードを入力するテキストボックスにマウスを持っていき、右クリック
3.「この検索にキーワードを設定」を選択
4.「ブックマークを追加」のダイアログが表示される
5.「名前」に"wiki"、「キーワード」に"w"を設定

アドレスバーに"w キーワード"と入力でwikipedia検索の出来上がり。

2008年3月11日火曜日

curl https

curtでhttpsアクセスする際には
・--with-ssl=$OPEN_SSL_LIBでコンパイル
・./configure時にsslのワーニングがないかチェック
(終了時にenable事項が表示される)

・CAの取得
・アクセスしたいURLを表示して右下の鍵をDクリック
・詳細タブを選択し「ファイル」にコピー
・所定のディレクトリに置く

・opensslでpemフォーマットに変換
・openssl x509 -inform DES -in $specificDir/ca.cer -out ca.pem -text

出来上がったca.pemでアクセス!
curl --cacert $specificDir/ca.pem https://secure.site.url