Dec 26, 2007

[Library] Commons Logging 1.1.1 で Log4j の trace レベルを有効にする。

(2008/01/25) 致命的な間違いのため訂正

桜が咲く頃にふと想ふ さんの 「Commons Loggin + Log4jでTRACEレベルのログを出力CommentsAdd Star」 で、本エントリが根本的に間違っていることを指摘いただいた。ありがとうございます。

Commons Logging 1.1.1 + Log4j 1.2.12 で一切カスタマイズ無しで普通に Trace ログを出力できた。 ソースコード でも確認済み。 ・・・カスタマイズしたときに見たソースコードは一体何だったのだろう??

お詫びして訂正致します。取消線が入っている情報は間違っています。信じないで下さい。

Commons Logging 1.1.1 から Log4j を使用する場合、デフォルトでは Commons Logging の trace ログレベルは Log4j の debug ログレベルに対応付けられる。 Log4j では永らく trace ログレベルがサポートされていなかったので当然こういう実装になるだろう。

Log4j 1.2.12 で trace ログレベルがサポートされたのだけれど、残念ながら Commons Logging では未対応の様だ。 というわけで、自力で Commons Logging の trace ログレベルを Log4j の trace ログレベルに対応付けてみた。

Apache Logging Services
http://logging.apache.org/
ASF Bugzilla Bug 35711 Add TRACE level to 1.2 api
http://issues.apache.org/bugzilla/show_bug.cgi?id=35711
Apache Commons - Commons Logging
http://commons.apache.org/logging/

Commons Logging の設定

Commons Logging と Log4j の橋渡しは Log4JLogger というクラスが行っているので、Log4JLogger を拡張して差し替える。

Log4JLogger の拡張クラス


package jp.in_vitro.codelet.logging;

import org.apache.commons.logging.impl.Log4JLogger;
import org.apache.log4j.Logger;

public class TracableLogger extends Log4JLogger {

    public TracableLogger() {
        super();
    }

    public TracableLogger(final Logger logger) {
        super(logger);
    }

    public TracableLogger(final String name) {
        super(name);
    }

    @Override
    public boolean isTraceEnabled() {
        Logger logger = getLogger();
        return logger.isTraceEnabled();
    }

    @Override
    public void trace(final Object message, final Throwable t) {
        Logger logger = getLogger();
        logger.trace(message, t);
    }

    @Override
    public void trace(final Object message) {
        Logger logger = getLogger();
        logger.trace(message);
    }
}

Commons Logging の設定ファイル

クラスパスのルートに "commons-logging.properties" を作成する。


org.apache.commons.logging.Log=jp.in_vitro.codelet.logging.TracableLogger

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Dec 05, 2007

[Misc] IE6 と IE7 の同居にチャレンジ

チャレンジも何も。 やり方を丁寧に説明してくれているサイトがあったのでその通りやってみただけ。 Altstack さん、TredoSoft さん、Microsoft さん(?) に感謝。

IE6とIE7の同居と、Windowsでwebkit(Safari)の表示確認
http://www.altstack.com/weblog/archives/2007/03/28/index.php
Windows XP SP2 向け Windows Internet Explorer 7
http://www.microsoft.com/downloads/details.aspx?FamilyId=9AE91EBE-3385-447C-8A30-081805B2F90B&displaylang=ja
Internet Explorer 7 running side by side with IE6. (standalone)
http://tredosoft.com/IE7_standalone
[IE6 and IE7]

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Bookmark] Today's bookmark

[Misc] A Preview of HTML 5... header, nav, article に footer かー。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Dec 04, 2007

[Apple] /private/etc/hosts の変更内容がすぐに反映されない

Mac OS X で /private/etc/hosts を変更しても、変更内容がすぐに反映されないことがある。 調べてみたら

osxでetchostsをすぐに反映させる方法
http://ido.nu/kuma/2007/03/23/osxでetchostsをすぐに反映させる方法/
に情報があった。
$ sudo lookupd -flushcache
でキャッシュをクリアすれば良いらしい。実際に試してみたところ上手く行った。感謝。

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 28, 2007

[Bookmark] Today's bookmark

[Maven] Release Notes - Maven 2.0.8... Maven 2.0.8 がリリースされた!!
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 24, 2007

[Bookmark] Today's bookmark

[Maven] Release Notes - Continuum - Version 1.1... Continuum 1.1 Final がリリースされた。アップデートしないと。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 21, 2007

[Misc] Eclipse 3.3.1.1 の "Ctrl contrib"

Eclipse 3.3 -> 3.3.1.1 にアップグレードしたら左下に "Ctrl contrib" という不思議なコンポーネントが現れた。 押しても無反応。引いても(?)無反応。 調べてみたら Eclipse SDK Examples というものだった。 Examples を表示しておく必要もないのでとりあえず消しておいた。

[Ctrl Contrib]

"Ctrl contrib" の消し方

  1. "Help" -> "Software Updates" -> "Manage Configuration" を実行。
  2. "Eclipse SDK Examples" を選択。
  3. "Disable" のリンクをクリック。

[Ctrl Contrib]

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Bookmark] Today's bookmark

[Mustang] Open Source Java 6 on Leopard... 悔しいが Leopard 環境がない・・・。
[Maven] Buildr:RubyがJavaより速く構築するとき... シンプルな Java のビルドツールを目指した Buildr。今度試してみよう。
[Maven] buildr... Ruby が要るのか・・・。うーん。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 20, 2007

[Linux] "yum remove openssl" の恐怖

会社の先輩が苦悶しているので何事かと思ったら。 "yum remove openssl" を実行したら 200 以上のパッケージと "yum 自身" が削除されたらしい。 確かに openssl は他パッケージからの依存がかなり多くてもおかしくはない。 とは言え、yum 自身までもが消えるとは。恐るべし。

ちなみに、"ls" まで使えなくなったらしいので shell にもダメージがある模様。 注意されたい。

・・・apt は大丈夫なのだろうか?? 怖くて試す気にはなれないが。

再現実験をしてみた(w

2008/01/25 追記

apt で試したという強者が(w。

☆★☆- ログ倉庫・・・っぽいもの、若しくは鯖メモ -☆★☆ さんの 「 便利さの裏側に潜む狂気」というエントリ。

厳しい警告が出る様だが、強行してしまうと yum 同様取り返しのつかないことになるそうだ。

Posted in Linux | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Bookmark] Today's bookmark

Eclipse Project Release Notes (Release 3.3.1.1)... Eclipse 3.3.1.1 がリリース (via Java News)
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 14, 2007

[Bookmark] Today's bookmark

[Misc] NetCommons におけるクロスサイトスクリプティングの脆弱性... NetCommons は前に試したのでメモ。XSS って本当に厄介だな。
[Library] WebTest vs. Selenium: 本物のテストとシミュレートされたブラウザテスト... WebTest 試してみないとな・・・。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Apple] Mac OS X(Tiger) で Apache を停止する方法

Mac OS X (Tiger) で Apache HTTP Server が起動していることを知った。 で、Apache HTTP Server の停止方法をメモ。

Apache HTTP Server の停止方法

システム環境設定 -> 共有 -> パーソナル Web 共有で停止できる。システム環境設定で試しに「apache」を検索してみたらシステムが教えてくれた。素晴らしい。
[Apache on Mac OS X] [Apache on Mac OS X]

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 13, 2007

[Misc] Android SDK にチャレンジ

Android SDK が公開されたので、少し遊んでみた。 とりあえず SDK を入れて、Eclipse でプロジェクトの作成→パッケージ作成→エミュレータ上で動作確認。 特に困ることもなく簡単に遊ぶことができた。

Android - An Open Handset Alliance Project
http://code.google.com/android/index.html
Download the Android SDK
http://code.google.com/android/download.html
Android Developers Blog
http://android-developers.blogspot.com/

Android SDK のインストール

ここからアーカイブをダウンロードして解凍するだけ。android_sdk_darwin_m3-rc20a.zip を使用した。

Android Eclipse plugin のインストール

Eclipse の Software Update 機能で簡単にインストールできる。 アップデートサイトは https://dl-ssl.google.com/android/eclipse/ 。
[Installing Android Eclipse plugin] [Installing Android Eclipse plugin] [Installing Android Eclipse plugin] [Installing Android Eclipse plugin]

Android Eclipse plugin の設定

Android Eclipse plugin を使用するには Android SDK のパスを設定する必要がある。 Window -> Preferences -> Android を表示し、Android SDK のパスを指定する。
[Setting Android Eclipse plugin]

Android Project を作成する

Project の作成画面を開くと、Android Project が作成できるようになっている。 Android Project を作成し、適当にソースコードをいじって、実行。 実行すると Android emulator が起動して作成したコードが動作する。
[Android Project] [Android Project] [Android Project]
[Android emulator] [Android emulator]

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 12, 2007

[Bookmark] Today's bookmark

[Misc] Google デベロッパー ホーム... おぉ!日本にも開発者用コミュニティが。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Trac] Trac で画像のプレビューが表示されない

「Trac で画像のプレビューが表示されないのだけれど・・・」という相談を受けた。 で、調べた結果をメモ。

症状の内容

Trac Wiki の添付アップロード画面(ex. http://example.com/trac/attachment/wiki/WikiStart?action=new) や添付ファイル表示画面(ex. http://example.com/trac/attachment/wiki/WikiStart/photo.jpg) で、以下のエラーメッセージが表示され画像のプレビューが表示されない。

HTML preview not available, since the file size exceeds 262144 bytes. You may download the file instead.

回避方法

trac.ini の mimeviewer セクションに max_preview_size という設定項目があるので、それを変更。 デフォルトでは 262144 になっているので、適当な値 (1Mbyte の場合は 1048576) にするだけ。

[mimeviewer]
enscript_modes = text/x-dylan:dylan:4
enscript_path = enscript
max_preview_size = 262144
mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb

補足

trac.ini の max_preview_size を変更する前にアップロードしてプレビューが表示されていない画像は、 max_preview_size を変更してもプレビューは表示されない模様。詳しく調べていないので断定はできないけれど。 その場合は再度添付作業をやり直す必要がある。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 09, 2007

[Misc] quickSub にチャレンジ

quickSub とは

百聞不如一見。 → RSS

というもの。 便利かどうか分からないけれど、まぁ、動きがあって面白いということでここにも適用してみた。

quickSub
http://www.methodize.org/quicksub/

quickSub の使い方

とても簡単。ドキュメントに書いてある通りなので、 取り立てて書くこともないのだけれど、一応。

<html>
<head>
  <link rel="stylesheet" href="/blog/quicksub.css" type="text/css" />
  <script type="text/javascript" src="/blog/quicksub.js"></script>
</head>
<body>
  <a href="$url/index.rss" 
     onmouseout="return timeqs();" 
     onmouseover="return quicksub(this, 'http://www.in-vitro.jp/blog/index.cgi/index.rss');">
    <img src="/blog/rss.png" alt="RSS" style="border:none;"/>
  </a>
  <div id="quickSub" 
       style="position:absolute; visibility:hidden; z-index:1000;" 
       onMouseOut="return timeqs();" 
       onMouseMove="return delayqs();">
  </div>
</body>
</html>
こんな感じ。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 08, 2007

[Misc] Interface elements for jQuery にチャレンジ

Interface elements for jQuery とは

jQuery は

jQuery is a fast, concise, JavaScript Library that simplifies how you traverse HTML documents, handle events, perform animations, and add Ajax interactions to your web pages. jQuery is designed to change the way that you write JavaScript.
というもの。で、Interface elements for jQuery は
Interface is a collection of rich interface components which utilizes the lightweight JavaScript library jQuery.
というもの。

今回は Interface elements for jQuery の中の ImageBox をここに適用してみた。
ImageBox というのはこういうもの(画像をクリック) → [in-vitro.jp's logo]
Interface elements for jQuery
http://interface.eyecon.ro/
jQuery
http://jquery.com/

ImageBox の使い方

とても簡単。jquery.js, interface.js をダウンロードしてきて、後は HTML を少しいじるだけ。 <a> タグの title 属性が ImageBox の左下に表示される画像のタイトルとして使用される。 rel 属性は画像のグルーピングに使用される。例えば、rel="imagebox-travel" を指定した画像を 3 枚用意すると、タイトルの下に「Showing image 3 from 1」 と表示される。 またグルーピングを使用するとスライドショーも可能となる(様だ)。

<html>
<head>
  <script type="text/javascript" src="/blog/jquery.js"></script>
  <script type="text/javascript" src="/blog/interface.js"></script>
  <link rel="stylesheet" href="/blog/interface.css" type="text/css" />
</head>
<body>
  <a href="/images/sample.png" title="Sample Image" rel="imagebox">
    <img src="/images/sample-thumbnail.png" alt="Sample Image"/>
  </a>
  <script type="text/javascript">
<!--
$(document).ready(
  function() {
    $.ImageBox.init(
      { loaderSRC: '/blog/loading.gif',
        closeHTML: '<img src="/blog/close.jpg" />' }
    );
  }
);
//-->
  </script>
</body>
</html>
HTML はこんな↑感じ。interface.css はこんな↓感じ。
#ImageBoxOverlay {
  background-color: #000000;
}
#ImageBoxCaption {
  background-color: #FFFFFF;
}
#ImageBoxContainer {
  width: 250px;
  height: 250px;
  background-color: #FFFFFF;
}
#ImageBoxCaptionText {
  font-weight: bold;
  padding-bottom: 5px;
}
#ImageBoxCaptionImages {
  margin: 0;
}

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 07, 2007

[Bookmark] Today's bookmark

[Apple] Macユーザーを狙うウイルスの亜種が続出... アンチウィルスソフト入れよっと。遅いか・・・。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Apple] ClamXav メモ

ClamXav は Mac OS X で動作するフリーのアンチウィルスソフト。 2007/11/07 時点で Leopard で動作するバイナリは公開されていない模様。

ClamXav is a free virus checker for Mac OS X. It uses the tried, tested and very popular ClamAV open source antivirus engine as a back end.
ClamXav
http://www.clamxav.com/

ClamXav のインストール

ClamXav は ClamAV というアンチウィルスソフトをベースにしているので、ClamAV を同時にインストールする。 現在の ClamXav のインストーラは ClamAV もしてくれる様だが、何故か手元の環境ではうまく動かなかった。 権限関連の問題だと思うが、原因を調べるのが面倒だったので ClamAV は MacPorts を使ってインストールした。

というわけで、ClamXav のインストール手順は

  1. MacPorts で ClamAV をインストール
  2. ClamXav をインストール
  3. ClamXav を設定
という感じ。

ClamAV のインストール

$ sudo port -d sync
Password:
DEBUG: Synchronizing ports tree(s)
Synchronizing from rsync://rsync.macports.org/release/ports/
  :
sent 107556 bytes  received 2316556 bytes  68284.85 bytes/sec
total size is 15752431  speedup is 6.50
$ sudo port -d selfupdate
DEBUG: Rebuilding the MacPorts base system if needed.
DEBUG: Synchronizing ports tree(s)
  :
The MacPorts installation is not outdated and so was not updated
DEBUG: Setting ownership to root
selfupdate done!
$ sudo port install clamav
--->  Fetching gmp
--->  Attempting to fetch gmp-4.2.1.tar.bz2 from http://ftp.gnu.org/gnu/gmp
  :
--->  Installing clamav 0.91.2_0

You need to add a new clamav user and clamav group to your system if you want to use clamav in superuser mode.

--->  Activating clamav 0.91.2_0
--->  Cleaning clamav
$ 
インストールが完了したら、ClamXav から呼び出せるように権限を変更しておく。
$ sudo touch /opt/local/share/clamav/freshclam.log
$ sudo chmod 664 /opt/local/share/clamav/freshclam.log
$ sudo chown -R clamav:clamav /opt/local/share/clamav/
$ sudo chmod u+s /opt/local/bin/freshclam 

ClamXav のインストール

ClamXav の公式サイトから dmg をダウンロードする。dmg をマウント後、以下の通りファイルを移動する。 ここでは ClamXav_1.0.8_Tiger_e912.dmg を使用した。

  • ClamXav.app → /Applications
  • ScanWithClamXav.plugin → /Library/Contextual Menu Items

ClamXav の設定

ClamXav の設定は素晴らしい解説を発見したので参考にさせていただいた。 .Mac Tips さんに多謝!!

ClamAV と ClamXav: 第一回 ClamXav の環境設定
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20060429010224/index.html
ClamAV と ClamXav: 第二回 ClamAV による定期スキャンと更新
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20060502200534/index.html
ClamAV と ClamXav: 第三回 ウィルス定義ファイルの自動更新
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20060508141731/index.html
ClamAV と ClamXav: 第四回 ClamXav 1.0.3 の新設定
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20060512153400/index.html
ClamAV と ClamXav: 第五回 ClamAV のパーミッションを補強する
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20060517015523/index.html
ClamAV と ClamXav: 第六回 他の対策ソフトの共同作業
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20061123181450/index.html
ClamAV と ClamXav: 第七回 ClamAV 0.90 の設定ファイルの変更点まとめ
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20070214182533/index.html
ClamAV と ClamXav: 第八回 clamav-update プロジェクト
http://homepage.mac.com/yuji_okamura/iblog/DotMac/Tips/C1181169702/E20070729134015/index.html

ClamXav の実行

[ClamXav]
ClamXav を起動して、定義ファイルの更新をした。

[ClamXav]

とりあえず小さいディレクトリを検索してみた。

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 06, 2007

[Bookmark] Today's bookmark

[Apple] FreeBSD's 1.6 JDK on Mac OS X... Apple が早く JavaSE 6.0 を出してくれないかな・・・。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Apple] Prism メモ

[prism] [prism gmail]

Prism は Web アプリケーションの実行に特化した Thin Client。 シンプルな Web ブラウザといったところか。 とりあえず頻繁に利用する Gmail を Prism から利用するようにしてみた。 アイコンは Google Notifier のものを流用させていただいた。

Prism is a simple XULRunner based browser that hosts web applications without the normal web browser user interface.
mozilla wiki - Prism
http://wiki.mozilla.org/Prism
mozilla wiki - Prism Installs
http://wiki.mozilla.org/Prism#Installs

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 05, 2007

[Apple] Transmission メモ

[transmission]


Transmission は Mac OS X にも対応した BitTorrent クライアント。

Transmission is a fast, easy, and free multi-platform BitTorrent client with a focus on being lightweight yet feature-filled.
Transmission
http://transmission.m0k.org/

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Bookmark] Today's bookmark

[Misc] SEO 診断ツール Dipper β... 手軽で面白い。
[Misc] gOS... Parallels 上にはインストールできなかった。無念。
[Misc] RSS のセキュリティ... いつもコメントや Trackback を RSS で配信するのは危険だと思うのだが。
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 04, 2007

[Misc] Wapiti にチャレンジ

Wapiti とは

Wapiti は Web アプリケーションの脆弱性チェックを行うスキャナ。

Wapiti can detect the following vulnerabilities :

  • File Handling Errors (Local and remote include/require, fopen, readfile...)
  • Database Injection (PHP/JSP/ASP SQL Injections and XPath Injections)
  • XSS (Cross Site Scripting) Injection
  • LDAP Injection
  • Command Execution detection (eval(), system(), passtru()...)
  • CRLF Injection (HTTP Response Splitting, session fixation...)
この類のソフトウェアは有償のものが多いのだけれど、Wapiti は珍しくオープンソースでフリー。 というわけで、インストールして実際に自作のサンプルアプリをチェックしてみた。
Wapiti - Web application vulnerability scanner / security auditor
http://wapiti.sourceforge.net/

Wapiti のインストール

Wapiti は Python で実装されているので、python の実行環境があればすぐに使用できる。 ここでは Mac OS X (Tiger) に MacPorts を使用して Python とその他必要となるライブラリをインストールした。

$ sudo port install python25
Password:
--->  Fetching python25
--->  Attempting to fetch Python-2.5.1.tar.bz2 from http://www.python.org//ftp/python/2.5.1/
--->  Verifying checksum(s) for python25
--->  Extracting python25
--->  Applying patches to python25
--->  Configuring python25
--->  Building python25 with target all
--->  Staging python25 into destroot
--->  Installing python25 2.5.1_2+darwin_8
--->  Activating python25 2.5.1_2+darwin_8
--->  Cleaning python25
$ /opt/local/bin/python2.5 -V
Python 2.5.1
$ sudo port install py25-hashlib
--->  Fetching py25-hashlib
--->  Verifying checksum(s) for py25-hashlib
--->  Extracting py25-hashlib
--->  Configuring py25-hashlib
--->  Building py25-hashlib with target build
--->  Staging py25-hashlib into destroot
--->  Installing py25-hashlib 2.5.1_0
--->  Activating py25-hashlib 2.5.1_0
--->  Cleaning py25-hashlib
$ sudo port install py25-socket-ssl
--->  Fetching py25-socket-ssl
--->  Verifying checksum(s) for py25-socket-ssl
--->  Extracting py25-socket-ssl
--->  Configuring py25-socket-ssl
--->  Building py25-socket-ssl with target build
--->  Staging py25-socket-ssl into destroot
--->  Installing py25-socket-ssl 2.5.1_0
--->  Activating py25-socket-ssl 2.5.1_0
--->  Cleaning py25-socket-ssl
$

Wapiti によるサンプルアプリケーションのスキャン

サンプルアプリケーションのセッション取得

スキャンを行う前に、まずはサンプルアプリケーションにログインする。 Wapiti にログイン用の URL, アカウント情報を指定してサンプルアプリケーションにログインさせ、セッション維持用の Cookie をファイルに保存しておく。

$ /opt/local/bin/python2.5 getcookie.py cookies.txt http://127.0.0.1:8080/sample/login
lswww will be far less effective without tidy
please install libtidy ( http://tidy.sourceforge.net/ ),
ctypes ( http://starship.python.net/crew/theller/ctypes/ )
and uTidylib ( http://utidylib.berlios.de/ )
Please enter values for the folling form :
url = http://127.0.0.1:8080/sample/login
loginname (on) : scott
loginpassword (on) : tiger
0 : <Cookie JSESSIONID=6E4E47C3C907D6EF9C0771920220AC135 for 127.0.0.1/sample>
$

サンプルアプリケーションのスキャン

XSS を仕込んだサンプルアプリケーションをでっち上げてスキャンしてみた。 要は GET で取得した値をそのままレスポンスの HTML に埋め込んだだけ。

$ /opt/local/bin/python2.5 wapiti.py http://127.0.0.1:8080/sample/ -c cookies.txt -x 
http://127.0.0.1:8080/sample/logout
lswww will be far less effective without tidy
please install libtidy ( http://tidy.sourceforge.net/ ),
ctypes ( http://starship.python.net/crew/theller/ctypes/ )
and uTidylib ( http://utidylib.berlios.de/ )
Wapiti-1.1.6 (wapiti.sourceforge.net)
........................................................
Attacking urls (GET)...
-----------------------
XSS (danger_value) in http://127.0.0.1:8080/sample/index
        Evil url: http://127.0.0.1:8080/sample/index?danger_value=<script>var
+wapiti_687474703a2f2f3132372e302e302e313a383038302f4242617369632f636f6d6d756e69747
92f4242534c697374_735f305f305f305f305f736f72745470=new+Boolean();</script>
  :
Wapiti は XSS をきちんと検出してくれた。 Wapiti でオールグリーンだからといって安心は出来ないけれど、最小限のセキュリティチェックを自動化できるメリットは大きそう。

ちなみに・・・

必要なライブラリがインストールされていないと Wapiti のスクリプトを実行したときに下記の様なエラーが出る。

ImportError: No module named cookielib
ImportError: No module named _md5
AttributeError: 'module' object has no attribute 'HTTPSHandler'

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 02, 2007

[Bookmark] Today's bookmark

[Apple] Apple Updates MacBooks to Santa Rosa, GMA X3100; 2.6GHz MacBook Pro... 「そろそろ」と噂されていたノートのモデルチェンジはこれのこと??
[Misc] 大規模日本語 n-gram データの公開... Google の N-gram データ!!! 欲しい!!!
Posted in Bookmark | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Nov 01, 2007

[Misc] OpenPNE にチャレンジ

OpenPNE とは

OpenPNE はオープンソースの SNS エンジン。 面白そうなのでインストールして動かしてみた。

OpenPNE
http://openpne.jp/

OpenPNE のインストール

OpenPNE を Debian Etch 環境にインストールしてみた。 PHP, MySQL のバージョンは以下の通り。

# php --version
PHP 5.2.0-8+etch7 (cli) (built: Jul  2 2007 21:46:15) 
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2006 Zend Technologies
# mysql --version
mysql  Ver 14.12 Distrib 5.0.32, for pc-linux-gnu (i486) using readline 5.2

OpenPNE のダウンロードと解凍、設置

OpenPNE をダウンロードして適当な場所に設置する。 OPENPNE_HOME/public_html だけ Apache HTTP Server が直接アクセスする必要があるため /var/www に設置する。 それ以外のファイルは /opt に設置した。

# wget http://internap.dl.sourceforge.net/sourceforge/openpne/OpenPNE-2.10.0.tar.gz
--19:57:52--  http://internap.dl.sourceforge.net/sourceforge/openpne/OpenPNE-2.10.0.tar.gz
           => `OpenPNE-2.10.0.tar.gz'

  :

19:58:20 (187.97 KB/s) - `OpenPNE-2.10.0.tar.gz' saved [5194807/5194807]

# tar zxvf ./OpenPNE-2.10.0.tar.gz 
OpenPNE-2.10.0/
OpenPNE-2.10.0/bin/
OpenPNE-2.10.0/bin/tool_send_dairy_news.cron

  :

OpenPNE-2.10.0/webapp/templates/mail/m_pc_friend_intro.tpl
OpenPNE-2.10.0/webapp/templates/debug.tpl
OpenPNE-2.10.0/webapp/templates/error.tpl
# mv ./OpenPNE-2.10.0 /opt/
# ln -s /opt/OpenPNE-2.10.0 /opt/OpenPNE
# mv /opt/OpenPNE/public_html /var/www/openpne
# chown www-data:www-data -R /var/www/openpne/

OpenPNE の設定

OpenPNE の設定を行う。 設定が必要なのは

  • /var/www/openpne/config.inc.php
  • /opt/OpenPNE/config/php
の 2 つのファイル。 環境に合わせて適当に編集を行う。
# cp /var/www/openpne/config.inc.php /var/www/openpne/config.inc.php.original
# vi /var/www/openpne/config.inc.php
# diff /var/www/openpne/config.inc.php.original /var/www/openpne/config.inc.php
7c7
< define('OPENPNE_DIR', realpath('../'));
---
> define('OPENPNE_DIR', realpath('/opt/OpenPNE'));
# chown www-data:www-data -R /opt/OpenPNE/var/
# cp /opt/OpenPNE/config.php.sample /opt/OpenPNE/config.php
# vi /opt/OpenPNE/config.php

# diff /opt/OpenPNE/config.php.sample /opt/OpenPNE/config.php
7c7
< define('OPENPNE_URL', 'http://sns.example.com/');
---
> define('OPENPNE_URL', 'http://192.168.11.12/openpne/');
13,14c13,14
<     'username' => '',
<     'password' => '',
---
>     'username' => 'openpne',
>     'password' => 'openpne',
16c16
<     'database' => '',
---
>     'database' => 'openpne',
22c22
< define('ENCRYPT_KEY', '');
---
> define('ENCRYPT_KEY', 'password');
26c26
< define('MAIL_SERVER_DOMAIN', 'mail.example.com');
---
> define('MAIL_SERVER_DOMAIN', 'mail.example.co.jp');
# chown www-data:www-data /opt/OpenPNE/config.php

DB の作成

MySQL に DB, ユーザ、テーブルを作成し、初期データを流し込む。

# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 337
Server version: 5.0.32-Debian_7etch1-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> CREATE DATABASE `openpne` DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on openpne.* to openpne identified by 'openpne';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
# mysql -u openpne -p --default-character-set=utf8 openpne < /opt/OpenPNE/setup/sql/mysql41/install/install-2.10-create_tables.sql 
Enter password: 
# mysql -u openpne -p --default-character-set=utf8 openpne < /opt/OpenPNE/setup/sql/mysql41/install/install-2.10-insert_data.sql   
Enter password: 
#

OpenPNE セットアップ画面表示

Web ブラウザから http://example.com/openpne/?m=setup にアクセスして初回設定を行う。

OpenPNE の利用

トップ画面
http://example.com/openpne/
[openpne] [openpne]
管理コンソール
http://example.com/openpne/?m=admin
[admin console] [admin console]

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 30, 2007

[Misc] CAPTCHA の安全性についてメモ

CAPTCHA の安全性が話題になっているみたいなのでメモ。

凪瀬 Blog - はてなのCAPTCHAは簡単に破れる
http://blogs.wankuma.com/nagise/archive/2007/10/26/104428.aspx
Radium Software Development - Breaking CAPTCHAs with NNs
http://www.radiumsoftware.com/0611.html#061110
高木浩光@自宅の日記 - 飾りじゃないのよCAPTCHAは 〜前代未聞のCAPTCHAもどき
http://takagi-hiromitsu.jp/diary/20060810.html#p01
Wikipedia - CAPTCHA
http://ja.wikipedia.org/wiki/CAPTCHA

より安全な CAPTCHA とは?

はてなの CAPTCHA が問題視されているわけだが、「では一体どういう CAPTCHA がより安全なのだろう?」 という疑問が当然出てくる。
Breaking CAPTCHAs with NNsによると、

CAPTCHA 破りの工程は,画像から文字を1文字づつ切り出す「分割」 (segmentation) の段階と, 切り出した文字を1文字ごとに解析する「認識」 (recognition) の段階から構成されるが, このうちコンピュータにとって困難なのは「分割」の方であり,「認識」は比較的容易であるとされる。
Kumar らの研究の結果は,文字による視覚 CAPCHA に関して, 文字毎の「認識」を困難にさせることを意図した歪みやノイズには全く意味が無く, そのような労力は文字の「分割」を困難にさせる方へと注がれることが望ましいという結論を導き出している。
ということで、「分割」し難い CAPTCHA が安全であるという研究結果が発表されているそうだ。 その研究結果を直接参照してみると、何故「分割」がコンピュータにとって難しいのかが説明されている。
4.1 The segmentation problem
As a review, segmentation is difficult for the following reasons:
  1. Segmentation is computationally expensive. In order to find valid patterns, a recognizer must attempt recognition at many different candidate locations.
  2. The segmentation function is complex. To segment successfully, the system must learn to identify which patterns are valid among the set of all possible valid and non-valid patterns. This task is intrinsically more difficult than classification because the space of input is considerably larger. Unlike the space of valid patterns, the space of non-valid patterns is typically too vast to sample. This is a problem for many learning algorithms which yield too many false positives when presented non-valid patterns.
  3. Identifying valid characters among a set of valid and invalid candidates is a combinatorial problem. For example, correctly identifying which 8 characters among 20 candidates (assuming 12 false positives), has a 1 in 125,970 (20 choose 8) chances of success by random guessing.
より安全な CAPTCHA が具体的にどういうものかというと、同じ論文内では以下の様に提案されている。
4.2 Building better/harder HIPs
The idea is that the additional arcs are themselves good candidates for false characters. The previous segmentation attacks would fail on this HIP. Furthermore, simple change of fonts, distortions, or arc types would require extensive work for the attacker to adjust to.
[stronger captcha]
この方式のより詳細な情報が Building Segmentation Based Humanfriendly Human Interaction Proofs (HIPs) に記載されている。
Using Machine Learning to Break Visual Human Interaction Proofs (HIPs)
http://research.microsoft.com/~kumarc/pubs/chellapilla_nips04.pdf
Building Segmentation Based Humanfriendly Human Interaction Proofs (HIPs)
http://research.microsoft.com/~kumarc/pubs/chellapilla_hip05.pdf

CAPTCHA の実装(Java)

Wikipedia の CAPTCHA によると、CAPTCHA の Java 実装は結構あるようだ。

The JCAPTCHA Project
http://jcaptcha.sourceforge.net/
The reCAPTCHA Project
http://www.crt.realtors.org/projects/reCaptcha/
The simple CAPTCHA Project
http://simplecaptcha.sourceforge.net/
この中でどれがより安全だろうか?? JCAPTCHA の DoubleRandomListGimpyEngineCaptcha が分割しにくいように見えるけれど・・・。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 26, 2007

[Merlin] J2SE 1.4.2 EOL プロセス開始

J2SE 1.4.2 EOL かい?? 早い! 早いよ!!

J2SE 1.4.2 は Sun のサポート終了 (End of Life, EOL) のプロセスを開始しました。 EOL 移行期間は 2006 年 12 月 11 日から次のバージョンである Java SE 7 の提供開始 (現時点では 2008 年 夏の予定) までです。この掲示をもってユーザの皆様は、 最新リリースである Java SE 6 への移行を開始する必要があります。

[J2SE 1.4.2 EOL announce]

Sun Develper Network - J2SE 1.4.2
http://java.sun.com/j2se/1.4.2/ja/
Java Technology EOL Policy
http://java.sun.com/products/archive/eol.policy.html
JPCERT/CC REPORT 2007-10-24 - 今週のひとくちメモ J2SE 1.4.2 のサポート終了
http://www.jpcert.or.jp/wr/2007/wr074101.html#Memo

Posted in Merlin | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 25, 2007

[Misc] NetCommons にチャレンジ

NetCommons とは

NetCommons というのは

このサイトは国立情報学研究所が次世代情報共有基盤システムとして開発したNetCommonsの公式サイトです。
NetCommonsはCMS(Contents Management System)とLMS(Learning Management System) とグループウェアを統合したコミュニティウェアです。NetCommonsによって簡単に構築できるサイトとして、 次のようなものが挙げられます。
  • e-ラーニングサイト
  • NPOやNGOのためのバーチャルオフィス
  • 共同研究・学会活動のポータルサイト兼グループウェア
  • オフィス用グループウェア
  • ソーシャルネットワークサービス
というものだそうだ。Xoops ベースで構築されているとのこと。 LMS のシステムは今まで触ったことが無かったので試してみた。
NetCommons
http://www.netcommons.org/

NetCommons のインストール

NetCommons には MySQL, PHP, Apache Web Server が必要。 それだけ揃えてしまえば、後は tar ball を拾ってきてインストーラを実行するだけ。 以下は Debian Etch 環境にインストールしたときのメモ。

環境の準備

MySQL 5, PHP5 をインストール。Apache Web Server は 2.x がインストール済みだったのでそのまま利用。

# apt-get install mysql-server-5.0 php5 php5-mysql libapache2-mod-php5
Reading package lists... Done
Building dependency tree... Done

# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.32-Debian_7etch1-log Debian etch distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database netcommons;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on netcommons.* to netcommons identified by 'netcommons';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit       
Bye

# cp /etc/php5/apache2/php.ini /etc/php5/apache2/php.ini.original
# vi /etc/php5/apache2/php.ini
# diff /etc/php5/apache2/php.ini.original /etc/php5/apache2/php.ini
599c599
< ;extension=mysql.so
---
> extension=mysql.so

# /etc/init.d/apache2 restart
Forcing reload of web server (apache2)... waiting .

#

NetCommons の設置

NetCommons をダウンロードしてきて設置。 *.php ファイルが EUC-JP の CRLF になっていたので EUC-JP の LF に変換した。

# wget http://www.netcommons.org/modules/cabinet/downloadnum_add.php?
path=%2Fcabinet%2F3%2F%A5%B3%A5%A2%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%CD%
D1%2FNetCommons-1.1.2%2FNetCommons-1.1.2.tar.gz&file_id=1941
[1] 2621

# tar zxvf ./NetCommons-1.1.2.tar.gz 
./NetCommons-1.1.2/
./NetCommons-1.1.2/html/

# cd ./NetCommons-1.1.2
# cp -r ./html ./html.converted
# cd ./html
# for i in `find . -name '*.php'`; do nkf -Lu -e $i > ../html.converted/$i; done
# mv ./NetCommons-1.1.2/html.converted /var/www/netcommons
# chmod 777 -R /var/www/netcommons/uploads/ /var/www/netcommons/cache/ 
/var/www/netcommons/templates_c/ /var/www/netcommons/themes/

NetCommons のインストール

"http://example.com/netcommons/" にアクセスしてインストーラを起動する。

[NetCommons installer(0)] [NetCommons installer(1)] [NetCommons installer(2)]

NetCommons インストールの後片付け

インストーラの削除と設定ファイルの権限変更を行う。

# rm -rf /var/www/netcommons/install/
# chmod 444 /var/www/netcommons/mainfile.php 
# 

NetCommons にアクセス

"http://example.com/netcommons/" にアクセスする。 とりあえずインストール時に設定した管理者でログイン。 とりあえずは動いたが、何故か管理室に入ることが出来なかった。 NETCOMMONS_SYSTEM_PATH というグローバル変数(?) がセットされていないのだが・・・。 何故?? (面倒なので調べていないw)

[NetCommons Home]

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 24, 2007

[WebService] PlaceEngine API にチャレンジ

PlaceEngine とは

PlaceEngine は、Wi-Fi 機器を使って簡単に現在位置を推定してくれるソフトウェア。 以前 Mac OS X にインストールして放置してあったのだけれど、API があるということを知ったので早速試してみた。

PlaceEngine
http://www.placeengine.com/
PlaceEngine 技術資料
http://www.placeengine.com/doc
PlaceEngine API ローカルアプリケーションプログラミング
http://www.placeengine.com/doc/tutl

サンプルコード

サンプルコードは、PlaceEngine API ローカルアプリケーションプログラミングとほとんど同じ。 Mac OS X 版では LocalDB 機能(ローカルに位置情報を記録する機能) は使用できないということなので、PlaceEngine サーバに位置情報を問い合わせるサンプルだけ試してみた。

サンプルアプリを作成するためには、

  1. ここ から PlaceEngine クライアントをダウンロードし、インストールする。ここでは 2007/10/24 現在最新の o070531 を使用するものとする。 [PlaceEngine version]
  2. PlaceEngine を起動する。
  3. ここで PlaceEngine API アプリケーションキーを取得する。
の準備が必要。 PlaceEngine API は直接 PlaceEngine サーバに問い合わせるわけではなく、ローカルの PlaceEngine クライアントに問い合わせるものなので、PlaceEngine クライアントがローカルで起動していないと動作しない。

サンプルを動作させると PlaceEngine がセキュリティ警告ダイアログを表示する。 実行しても安全だと思う場合は YES をクリックする。
[PlaceEngine warning]

package jp.in_vitro.codelets;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Codelet {

    private static final String KEY = "aNR3HYXx1jzYqw24...";
    private static final String URL_RTAGJS = "http://localhost:5448/rtagjs";
    private static final String URL_LOC = "http://www.placeengine.com/api/loc";
    private final long t;

    public Codelet() {
        super();

        System.setProperty("http.nonProxyHosts", "localhost");
        this.t = System.currentTimeMillis() / 1000;
    }

    public Loc getLoc() throws IOException {
        Rtag rtag = this.getRtag(t);

        if (rtag.getNumap() > 0) {
            String locRequest = URL_LOC + "?t=" + this.t + "&rtag="
                    + rtag.getRtag() + "&appk=" + KEY + "&fmt=json";
            StringBuilder locResponse = sendHttpRequest(new URL(locRequest));
            return parseLocResponse(locResponse);
        }
        return null;
    }

    protected Loc parseLocResponse(final StringBuilder response) {
        Loc location = new Loc();

        response.deleteCharAt(0);
        String responseAsString = new String(response);
        String param[] = responseAsString.split(",");
        String param2[] = responseAsString.split("\\{");

        if (param.length >= 4 && param2.length >= 2) {
            location.setLon(param[0]);
            location.setLat(param[1]);

            String info[] = param2[1].substring(0, param2[1].length() - 1)
                    .split(",");
            for (int i = 0; i < info.length; i++) {
                String tk[] = info[i].split(":");
                String name = tk[0].substring(1, tk[0].length() - 1);
                String value = tk[1];
                if ("addr".equals(name)) {
                    location.setAddr(value);
                } else if ("msg".equals(name)) {
                    location.setMsg(value);
                } else if ("floor".equals(name)) {
                    location.setFloor(value);
                } else if ("t".equals(name)) {
                    location.setT(value);
                }
            }
        }
        return location;
    }

    protected void printLoc(final Loc loc) {
        System.out.println("Longitude(経度) : " + loc.getLon());
        System.out.println("Latitude(緯度)  : " + loc.getLat());
        System.out.println("Address(住所)   : " + loc.getAddr());
        System.out.println("Floor          : " + loc.getFloor());
        System.out.println("Message        : " + loc.getMsg());
    }

    public Rtag getRtag(final long t) throws IOException {
        String rtagRequest = URL_RTAGJS + "?t=" + this.t + "&appk=" + KEY;
        StringBuilder rtagResponse = sendHttpRequest(new URL(rtagRequest));
        Rtag rtag = this.parseRtagResponse(rtagResponse);
        return rtag;
    }

    protected Rtag parseRtagResponse(final StringBuilder response) {
        Rtag rtag = new Rtag();

        String splitRtagjsResponse[] = response.substring(9,
                response.length() - 2).split(", *");
        String r = splitRtagjsResponse[0].substring(1, splitRtagjsResponse[0]
                .length() - 1);
        int numap = Integer.parseInt(splitRtagjsResponse[1]);
        String t = splitRtagjsResponse[2];

        rtag.setRtag(r);
        rtag.setNumap(numap);
        rtag.setT(t);

        return rtag;
    }

    protected StringBuilder sendHttpRequest(final URL url) throws IOException {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try {
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            reader = new BufferedReader(new InputStreamReader(connection
                    .getInputStream(), "UTF-8"));
            StringBuilder response = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            return response;
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } finally {
                if (connection != null) {
                    connection.disconnect();
                }
            }
        }
    }

    public static void main(final String[] args) throws Exception {
        Codelet me = new Codelet();
        Loc loc = me.getLoc();
        me.printLoc(loc);
    }

    public static class Rtag {

        private String rtag;
        private int numap;
        private String t;

        public Rtag() {
            super();
        }
        public String getRtag() {
            return this.rtag;
        }
        public void setRtag(final String rtag) {
            this.rtag = rtag;
        }
        public int getNumap() {
            return this.numap;
        }
        public void setNumap(final int numap) {
            this.numap = numap;
        }
        public String getT() {
            return this.t;
        }
        public void setT(final String t) {
            this.t = t;
        }
    }

    public static class Loc {
        private String lat;
        private String lon;
        private String addr;
        private String msg;
        private String floor;
        private String t;

        public Loc() {
            super();
        }

        public String getLat() {
            return this.lat;
        }
        public void setLat(final String lat) {
            this.lat = lat;
        }
        public String getLon() {
            return this.lon;
        }
        public void setLon(final String lon) {
            this.lon = lon;
        }
        public String getAddr() {
            return this.addr;
        }
        public void setAddr(final String addr) {
            this.addr = addr;
        }
        public String getMsg() {
            return this.msg;
        }
        public void setMsg(final String msg) {
            this.msg = msg;
        }
        public String getFloor() {
            return this.floor;
        }
        public void setFloor(final String floor) {
            this.floor = floor;
        }
        public String getT() {
            return this.t;
        }
        public void setT(final String t) {
            this.t = t;
        }
    }
}

サンプルコードの実行結果

Longitude(経度) : 13*.******
Latitude(緯度)  : 3*.******
Address(住所)   : '東京都************'
Floor          : null
Message        : '位置が取得できました'

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 23, 2007

[Library] jMock で java.sql.Connection のモックオブジェクト生成にチャレンジ

JMock で java.sql.Connection のモックオブジェクト作成に挑戦してみた。 ・・・と言っても、まだ jMock のサンプルを眺めただけ。

jMock
http://www.jmock.org/

サンプルコード - その1

とりあえず基礎の基礎。 単純な java.sql.Connection のモックオブジェクトを作成してみた。 example1 はテスト成功パターン。example2 はテスト失敗パターン。

package jp.in_vitro.codelets.jmock;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import org.jmock.Expectations;
import org.jmock.Mockery;

public class Codelet {

    public static void main(String[] args) throws SQLException {
        Codelet me = new Codelet();
        me.example0();
        me.example1();
    }

    protected void example0() throws SQLException {
        Mockery context = new Mockery();
        final Connection connection = context.mock(Connection.class);
        context.checking(new Expectations() {
            {
                one(connection).close();
            }
        });

        connection.close();
        context.assertIsSatisfied();
    }

    protected void example1() throws SQLException {
        Mockery context = new Mockery();
        final Connection connection = context.mock(Connection.class);
        context.checking(new Expectations() {
            {
                one(connection).close();
            }
        });

        // connection.close();
        context.assertIsSatisfied();
    }
}

サンプルコード - その2

次に java.sql.Connection から java.sql.Statement を返してみた。 とりあえず指定した java.sql.Statement を java.sql.Connection#createStatement から返すことに成功。

package jp.in_vitro.codelets.jmock;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import org.jmock.Expectations;
import org.jmock.Mockery;

public class Codelet {

    public static void main(String[] args) throws SQLException {
        Codelet me = new Codelet();
        me.example2();
    }

    protected void example2() throws SQLException {
        Mockery context = new Mockery();
        final Connection connection = context.mock(Connection.class);
        final Statement expected = context.mock(Statement.class);
        context.checking(new Expectations() {
            {
                one(connection).createStatement();
                will(returnValue(expected));
            }
        });

        Statement actual = connection.createStatement();
        System.out.println("expected: " + expected + "@" + expected.hashCode());
        System.out.println("actual: " + actual + "@" + actual.hashCode());
        context.assertIsSatisfied();
    }
}

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 22, 2007

[Misc] 各社携帯の XHTML 対応状況メモ

NTT Docomo, AU, Softbank mobile の XHTML 対応状況を調べたのでメモ。

NTT Docomo

「端末スペック一覧」ページに XHTML の対応状況が記載されている。

XHTML Basic 1.1
http://www.w3.org/TR/xhtml-basic/
作ろう i モードコンテンツ
http://www.nttdocomo.co.jp/service/imode/make/
端末スペック一覧
http://www.nttdocomo.co.jp/service/imode/make/content/spec/index.html
iモード対応XHTMLの考え方
http://www.nttdocomo.co.jp/service/imode/make/content/xhtml/outline/s1.html

AU

「XHTML 対応機種」ページによると

「XHTML」で表記されたコンテンツを、作成者の意図どおりのデザインで閲覧するには、WAP2.0ブラウザ搭載端末で表示する必要があります。HDMLブラウザ搭載端末では、HDML標準対応となり、「XHTML」コンテンツに関しては、EZサーバによるコンテンツ変換機能を使用し「XHTML → HDML」の変換を行って表示することになります。
ということだそうだ。WAP2.0ブラウザ搭載状況は「機種別情報一覧」ページに記載されている。
技術情報
http://www.au.kddi.com/ezfactory/tec/index.html
XHTML 対応機種
http://www.au.kddi.com/ezfactory/howtoxhtml/02.html
機種別情報一覧
http://www.au.kddi.com/ezfactory/tec/spec/new_win/ezkishu.html

Softbank mobile

「ウェブ技術資料 - 概要編」によると

1.2 サービス世代
以降、回線交換のみに対応する端末を C 型端末と呼称し、パケット交換サービス(PDC-P)にも対応する端末を P 型端末と呼称し、3G サービスに対応する端末を W 型端末、WAP/MMS サービスに対応する端末を 3GC 型端末と呼称する。

1.3.1. ウェブ
・コンテンツは HTML(Hyper Text Markup Language) もしくは MML(Mobile Markup Language), XHTML で記述する。ただし、MML は C 型および P 型端末でのみ利用可能であり、 XHTML は W 型、3GC 型端末でのみ利用可能である。
だそうだ。3G サービス対応端末、WAP/MMS サービス対応端末で表示可能ということのようだ。 ・・・残念なことに、3G サービス対応端末、WAP/MMS サービス対応端末の情報は見当たらなかった。
Softbank Developers Support Site
http://developers.softbankmobile.co.jp/dp/
ウェブ技術資料 - 概要編
http://www2.developers.softbankmobile.co.jp/dp/tool_dl/download.php?docid=110&companyid=
ウェブ技術資料 - XHTML 編
http://www2.developers.softbankmobile.co.jp/dp/tool_dl/download.php?docid=135&companyid=
端末情報
http://developers.softbankmobile.co.jp/dp/tech_svc/info/

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 16, 2007

[Apple] Pathway メモ

[Pathway]

Pathway は Wikipedia ビューア。 Wikipedia の関連付けられたエントリからエントリへ渡り歩きながら必要な知識を得ることができる。 これは便利。

Pathway is an app designed to solve the aforementioned problems. Its aim is to help you discover Wikipedia without having to worry whether you’ll have enough time to read everything you want, or if you’ll get lost.

It accomplishes this by presenting you with a graphical “network” representation of your visited article pages. A node represents an article, a connection between two nodes means, of course, that you’ve gone from the first article to the second one. You can save the network you’ve created to disk and recover it.
Pathway
http://pathway.screenager.be/
About Pathway
http://pathway.screenager.be/about-pathway/

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 14, 2007

[Apple] Shrook メモ

[Shrook]

Shrook は Mac OS X 用の RSS Reader。 しばらく Vienna を使用していたのだが、唐突に Feed の読み込みをしてくれなくなった。 どうも過去のエントリデータが破損した模様。 機能的には満足していたのだが、どうも動作がもっさりしていたこともあり Shrook を試してみることにした。 さて、データ量が増えてきたときにどうなることやら・・・。

Shrook
http://www.utsire.com/shrook/

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 13, 2007

[Misc] SSL 証明書のインストール時に X509_check_private_key:key values mismatch エラー

Apache Web Server 2.2.6 に SSL 証明書をインストールしたときに不思議なエラーに遭遇した。

[warn] RSA server certificate CommonName (CN) `hoge.example.com' does NOT match server name!?
[error] Unable to configure RSA server private key
[error] SSL Library Error: 185073780 error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch
何のことはない、間違って別サーバの SSL 証明書を使っていただけだった(^^;
  # openssl x509 -noout -text -in ./server.crt
で SSL 証明書の内容を確認したら別サーバのものであることが一瞬で判明。 正しい SSL 証明書を持ってきたらすぐに解決。やれやれ。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 10, 2007

[Apple] ImageMagick を Mac OS X にインストール

ImageMagick を Mac OS X にインストールした際のメモ。 メモと言っても、MacPorts を使っているので大したことはやっていない。

ImageMagick: Convert, Edit, and Compose Images
http://www.imagemagick.org/

MacPorts を使って ImageMagick をインストール

$ sudo port install ImageMagick

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

[Apple] ImageMagick を Mac OS X にインストール

ImageMagick を Mac OS X にインストールした際のメモ。 メモと言っても、MacPorts を使っているので大したことはやっていない。

ImageMagick: Convert, Edit, and Compose Images
http://www.imagemagick.org/

MacPorts を使って ImageMagick をインストール

$ sudo port install ImageMagick

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Oct 09, 2007

[Apple] MacPorts を Mac OS X にインストール

MacPorts を Mac OS X にインストールした際のメモ。

MacPorts
http://www.macports.org/

MacPorts のインストール

  1. MacPorts のサイトから dmg ファイルを拾ってくる。
  2. dmg をマウントし、インストーラを実行。後はウィザードの指示通り。
  3. /Users/me/.bashrc を編集。以下を追加する。
    export PATH=/opt/local/bin:/opt/local/sbin/:$PATH
    export MANPATH=/opt/local/man:$MANPATH
    
  4. MacPorts の初期設定。
    $ sudo port -d selfupdate
    $ sudo port -d sync
    

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 27, 2007

[Apple] Growl メモ

[Growl notifier]

Growl
http://growl.info/
growliChat
http://growlichat.com/
Gmail + Growl for Google Notifier
http://wafflesoftware.net/gmailgrowl/
NETAFULL - アプリケーションのイベントを通知してくれる「Growl」
http://netafull.net/macsoft/020136.html
ステキMac使いを目指す日記 - Growlを使ってMac OS Xの様々なイベントを通知する
http://d.hatena.ne.jp/mteramoto/20070404/p1

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 26, 2007

[Misc] HTML5 メモ

HTML 5 の関連情報をメモ。

HTML 5 Working Draft
http://www.whatwg.org/specs/web-apps/current-work/
WAHTWG - WHATWG and HTML 5 FAQ 日本語訳
http://www.html5.jp/trans/whatwg_html5faq.html
HTML 5 の新要素
http://www-06.ibm.com/jp/developerworks/xml/library/x-html5/index.shtml?ca=drs-

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 18, 2007

[Apple] POPFile を Mac OS X にインストール

何故か MTA に SPAM FILTER が導入されていない我が社。 Apple Mail にも SPAM FILTER があるが、いまいち精度が悪い。 というわけで、メール振り分けソフトの POPFile を Mac OS X にインストールしてみた。

POPFile - Automatic Email Classification
http://sourceforge.net/projects/popfile/
POPFile Documentation Project
http://popfile.sourceforge.net/wiki/jp
POPFile(自動メールフィルター)の日本語化
http://sourceforge.jp/projects/popfile/files/

POPFile のインストール

POPFile のインストールはインストーラにお任せで OK。 但し、ポートの 8080 を使用する(後で変更可能)ので、Apache Tomcat などがポート 8080 を使用している場合は予め終了しておいた方が良い。

  1. 日本語化プロジェクトのダウンロードサイトから POPFile-0.22.5ub.dmg をダウンロード
  2. POPFile-0.22.5ub.dmg をマウントし、インストーラ実行
  3. ウィザードの指示に従ってインストールを完了

POPFile の設定

POPFile は内部に Web インタフェースを持っており、設定はその Web インタフェースを使用する(以降、POPFile コントロールセンターと記述)。 Web ブラウザで http://localhost:8080/ にアクセスする。

日本語表示設定

POPFile コントロールセンターの日本語化
Configuration -> User Interface -> Choose language -> "Nihongo"
※"Japanese" ではなく "Nihongo" なので注意。いいね。

環境設定

設定 -> ポート番号 -> ユーザーインターフェース用ポート番号
※ポート 8080 を他のソフトで使用する場合はポート番号を変更する。
POPFile コントロールセンターのパスワード
セキュリティ -> ユーザーインターフェースパスワード
※指定しない(デフォルト)場合は、パスワード入力なしで POPFile コントロールセンターが使用できる。

バケツ設定

バケツは、メールの振り分け先となる場所。 SPAM FILTERING を行うのであれば、"spam" と "notspam" の 2 つがあればいい。 より詳細な振り分けを行うのであれば、適宜必要な分だけバケツを作成する。 バケツ名には 半角"小文字"アルファベットとハイフン、アンダースコアしか使用できないので注意。

バケツの作成
バケツ -> 管理 -> バケツ作成
※"spam", "work" の 2 つのバケツを作成した。

マグネット設定

FILTERING の前に、特定の条件にヒットしたメールを強制的に指定のバケツに振り分けることができる。 この条件をマグネットと言うらしい。

マグネットの作成
マグネット -> 新規マグネット作成
※マグネットタイプ: 差出人、値: @example.com、分類先のバケツ: work というマグネットを作成した。

Apple Mail 設定

http://popfile.sourceforge.net/wiki/jp:howtos:mail に従って Apple Mail を設定した。

POPFile の起動・終了・リブート

起動
$ sudo /Library/StartupItems/POPFile/POPFile start
Password:
Starting POPfile POP mail proxy
$
終了
$ sudo /Library/StartupItems/POPFile/POPFile start
Password:
Stopping POPfile POP mail proxy
$
リブート(動作しなかった)
$ sudo /Library/StartupItems/POPFile/POPFile restart
Restarting POPfile POP mail proxy
kill: usage: kill [-s sigspec | -n signum | -sigspec] [pid | job]... or kill -l [sigspec]
$

FILTER の学習

メール受信時に subject ヘッダに付加される Prefix を見て適宜 FILTER に振り分けの指示を出す。 "[unclassified]" という Prefix が付いているメールが来たら POPFile コントロールセンターで振り分け先のバケツを指定するだけ。 後は、振り分け先バケツが間違っていたら修正したりする。

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 10, 2007

[Apple] QuickSilver メモ

[QuickSilver]

QuickSilver に関するメモ。

QuickSilver
http://quicksilver.blacktree.com/
コマンドランチャーだけではもったいない強力フリーウェア - QuickSilver
http://journal.mycom.co.jp/column/lifehack/024/
Blue Dot - ange on QuickSilver
http://bluedot.us/users/ange/tag/queue
43 Folders
http://www.43folders.com/category/quicksilver/

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 03, 2007

[Maven] deploy の際に、Javadoc もリモートリポジトリに登録したい

ついでに、"mvn deploy" 時に Javadoc もリモートリポジトリに登録するように設定をしてみた。

pom.xml の設定方法

設定はいたって簡単。、 maven-javadoc-plugin を pom.xml に登録するだけ。 設定方法は下記の通り。

<project>
  <build>
    <plugins>
      <plugin>
      	<groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <goal>jar</goal>
            </goals>
            <phase>deploy</phase>
          </execution>
        </executions>
        <configuration>
          <outputEncoding>Shift_JIS</outputEncoding>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Sep 02, 2007

[Maven] deploy の際に、ソースコードもリモートリポジトリに登録したい

"mvn deploy" を実行するとリモートリポジトリに bytecode の jar が登録される。 とりあえずそれで十分と言えば十分なのだけれど、Maven 2.x Integration for Eclipse を使っているとソースコードがリモートリポジトリにあるととても幸せになれる。 というわけで、"mvn deploy" 時にソースコードもリモートリポジトリに登録するように設定をしてみた。

pom.xml の設定方法

設定はいたって簡単。、 maven-source-plugin を pom.xml に登録するだけ。 設定方法は下記の通り。

<project>
  <build>
    <plugins>
      <plugin>
      	<groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
            <phase>deploy</phase>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 29, 2007

[Apple] Mac OS X 起動時のソフトウェア自動起動方法メモ

Mac OS X 起動時にソフトウェアを自動起動したい。 というわけで、関連リンクをメモ。

SystemStarterで、OS起動時にアプリも起動
http://www.0-i-0.com/tips/38-startup/startup.html
SystemStarter memo
http://www.eternal.nest.or.jp/shiro/macosx/systemstarter.html
Windows も 2000 以降はなかなか使い易くなったけれど、 やはり UNIX ベースの OS の方が馴染みやすいな。

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 24, 2007

[Apple] Dashboard Widget をデスクトップ上におく

padmacolors.org さんDashboard Widget をデスクトップ上におくというエントリを読んで、Dashboard Widget をデスクトップ上におけることを知った。 便利そうなので早速試してみた。

padmacolors.org さんのエントリにある通り、

$ defaults write com.apple.Dashboard devmode YES
を実行するだけで準備完了。

Dashboard Widget をデスクトップ上においてみる。

とりあえず電卓をデスクトップ上においてみた。 やり方は簡単。 下記は Dashboard のショートカットキーが "F12" になっている前提。

  1. "F12" を押して Dashboard を表示する。
  2. 電卓をドラッグする(ドラッグしたまま)。
  3. 電卓をドラッグしたまま "F12" を再度押して Dashboard を抜ける。
  4. 電卓がデスクトップ上に出てくる。
[Calcurator on Desktop]

Dashboard Widget を Dashboard に戻す。

ではデスクトップ上に出てきた電卓を Dashboard に戻してみようと思う。 やり方はデスクトップに出したときと同じ。

  1. 電卓をドラッグする(ドラッグしたまま)。
  2. 電卓をドラッグしたまま "F12" を押して Dashboard を表示する。
  3. 電卓が Dashboard 上に戻る。

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Aug 20, 2007

[Apple] Fink にチャレンジ

Fink とは

Fink は

Fink プロジェクトは オープンソースソフトウェアを Darwin と Mac OS X で使えるようにするものです。 Mac OS X 上でコンパイルと実行できるよう、 Unix ソフトウェアを修正 ("ポート") しています。 こうしてできたものは全て一つのディストリビューションに統合されます。 Fink では dpkg や apt-get などの Debian ツールを使い、バイナリパッケージ管理を行っています。 ユーザーはコンパイル済みのパッケージをダウンロードことも、すべてソースからビルドすることもできます。
というものらしい。 普段 Debian 系に慣れ親しんでいる関係で、apt が Mac OS X でも使用できたら便利だろうと思っていたので早速インストールしてみた。

Fink
http://finkproject.org/index.php

Fink のインストール

  1. ダウンロードページから Fink 0.8.1 バイナリインストーラ (Intel) をダウンロード。
  2. ダウンロードした Fink-0.8.1-Intel-Installer.dmg をマウント。
  3. Fink-0.8.1-Intel-Installer.pkg を実行。
  4. インストーラの指示に従ってインストールを行う。
  5. apt インデックスを作成する。
    $ fink scanpackages
    Information about 1723 packages read in 2 seconds.
    dpkg-scanpackages dists/local/main/binary-darwin-i386 override | gzip >dists/local/main/binary-darwin-i386/Packages.gz
     Wrote 0 entries to output Packages file.
    dpkg-scanpackages dists/stable/main/binary-darwin-i386 override | gzip >dists/stable/main/binary-darwin-i386/Packages.gz
     Wrote 0 entries to output Packages file.
    dpkg-scanpackages dists/stable/crypto/binary-darwin-i386 override | gzip >dists/stable/crypto/binary-darwin-i386/Packages.gz
     Wrote 0 entries to output Packages file.
    $ fink index
    Reading package info...
    Updating package index... done.
    $
    
  6. fink を最新バージョンにアップデート。
    $ sudo apt-get update
    Hit http://bindist.finkmirrors.net 10.4/release/main Packages
    Hit http://bindist.finkmirrors.net 10.4/release/main Release
    Hit http://bindist.finkmirrors.net 10.4/release/crypto Packages
    Hit http://bindist.finkmirrors.net 10.4/release/crypto Release
    Get:1 http://bindist.finkmirrors.net 10.4/current/main Packages [9745B]
    Hit http://bindist.finkmirrors.net 10.4/current/main Release                   
    Get:2 http://bindist.finkmirrors.net 10.4/current/crypto Packages [20B]        
    Hit http://bindist.finkmirrors.net 10.4/current/crypto Release                 
    Fetched 9765B in 6s (1461B/s)                                                  
    Reading Package Lists... Done
    Building Dependency Tree... Done
    $ sudo apt-get install fink
    Reading Package Lists... Done
    Building Dependency Tree... Done
    1 packages upgraded, 0 newly installed, 0 to remove and 13  not upgraded.
    Need to get 856kB of archives. After unpacking 4096B will be used.
    Get:1 http://bindist.finkmirrors.net 10.4/current/main fink 0.24.23-31 [856kB]
    Fetched 856kB in 5s (151kB/s)
    (Reading database ... 4131 files and directories currently installed.)
    Preparing to replace fink 0.24.17-31 (using .../fink_0.24.23-31_darwin-i386.deb) ...
    Unpacking replacement fink ...
    Setting up fink (0.24.23-31) ...
    Checking system... i386-apple-darwin8.10.1
    This system was not released at the time this Fink release was made. 
    Prerelease versions of Mac OS X might work with Fink, but there are no
    guarantees.
    Using the new 10.4 tree...
    ln -s 10.4 /sw/fink/dists
    Reading package info...
    Updating package index... done.
    
    $
    

試しに XEmacs をインストール

$ sudo apt-get clean
$ sudo apt-cache search xemacs
cssed - CSS editor
cssed-dev - CSS editor
flim - Library to provide basic features about message for Emacsen
jove - Small, fast, portable Emacs clone
mew - MIME mail reader for Emacs/XEmacs
mew-bin - MIME mail reader for Emacs/XEmacs
wl - Yet Another Message Interface on Emacsen
xemacs - Highly customizable text editor
xemacs-base-pkg - Basic files needed for xemacs package installation
xemacs-efs-pkg - Allows xemacs to fetch files from the FTP site or mirrors
xemacs-sumo-pkg - All xemacs packages together
$ sudo apt-get install xemacs
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
  gdbm3-shlibs libjpeg-shlibs libpng3-shlibs libtiff-shlibs xaw3d-shlibs
  xemacs-base-pkg xemacs-efs-pkg xfree86 xfree86-shlibs 
The following NEW packages will be installed:
  gdbm3-shlibs libjpeg-shlibs libpng3-shlibs libtiff-shlibs xaw3d-shlibs
  xemacs xemacs-base-pkg xemacs-efs-pkg xfree86 xfree86-shlibs 
0 packages upgraded, 10 newly installed, 0 to remove and 13  not upgraded.
Need to get 61.4MB of archives. After unpacking 39.1MB will be used.
Do you want to continue? [Y/n] Y
Get:1 http://bindist.finkmirrors.net 10.4/release/main libjpeg-shlibs 6b-16 [73.8kB]
Get:2 http://bindist.finkmirrors.net 10.4/release/main libtiff-shlibs 3.6.1-4 [110kB]
Get:3 http://bindist.finkmirrors.net 10.4/current/main xfree86-shlibs 4.5.0-1040 [2570kB]
Get:4 http://bindist.finkmirrors.net 10.4/current/main xfree86 4.5.0-1040 [47.8MB]
Get:5 http://bindist.finkmirrors.net 10.4/release/main libpng3-shlibs 1:1.2.8-1 [207kB]
Get:6 http://bindist.finkmirrors.net 10.4/release/main gdbm3-shlibs 1.8.3-1 [42.4kB]
Get:7 http://bindist.finkmirrors.net 10.4/release/main xemacs-base-pkg 1.84-1 [481kB]
Get:8 http://bindist.finkmirrors.net 10.4/release/main xemacs-efs-pkg 1.32-1 [377kB]
Get:9 http://bindist.finkmirrors.net 10.4/release/main xaw3d-shlibs 1.5-12 [400kB]
Get:10 http://bindist.finkmirrors.net 10.4/release/main xemacs 1:21.4.15-1002 [9301kB]
Fetched 61.4MB in 6m38s (154kB/s)                                              
Selecting previously deselected package libjpeg-shlibs.
(Reading database ... 4131 files and directories currently installed.)
Unpacking libjpeg-shlibs (from .../libjpeg-shlibs_6b-16_darwin-i386.deb) ...
Selecting previously deselected package libtiff-shlibs.
Unpacking libtiff-shlibs (from .../libtiff-shlibs_3.6.1-4_darwin-i386.deb) ...
Selecting previously deselected package xfree86-shlibs.
Unpacking xfree86-shlibs (from .../xfree86-shlibs_4.5.0-1040_darwin-i386.deb) ...
Selecting previously deselected package xfree86.
Unpacking xfree86 (from .../xfree86_4.5.0-1040_darwin-i386.deb) ...
WARNING: if you compile X11 applications against this XFree86 release,
you will *not* be able to run them if you decide to revert to Apple's
X11 provided with the OS.
Selecting previously deselected package libpng3-shlibs.
Unpacking libpng3-shlibs (from .../libpng3-shlibs_1%3a1.2.8-1_darwin-i386.deb) ...
Selecting previously deselected package gdbm3-shlibs.
Unpacking gdbm3-shlibs (from .../gdbm3-shlibs_1.8.3-1_darwin-i386.deb) ...
Selecting previously deselected package xemacs-base-pkg.
Unpacking xemacs-base-pkg (from .../xemacs-base-pkg_1.84-1_darwin-i386.deb) ...
Selecting previously deselected package xemacs-efs-pkg.
Unpacking xemacs-efs-pkg (from .../xemacs-efs-pkg_1.32-1_darwin-i386.deb) ...
Selecting previously deselected package xaw3d-shlibs.
Unpacking xaw3d-shlibs (from .../xaw3d-shlibs_1.5-12_darwin-i386.deb) ...
Selecting previously deselected package xemacs.
Unpacking xemacs (from .../xemacs_1%3a21.4.15-1002_darwin-i386.deb) ...
Setting up libjpeg-shlibs (6b-16) ...
Setting up libtiff-shlibs (3.6.1-4) ...
Setting up xfree86-shlibs (4.5.0-1040) ...
Setting up xfree86 (4.5.0-1040) ...

Setting up libpng3-shlibs (1.2.8-1) ...
Setting up gdbm3-shlibs (1.8.3-1) ...
Setting up xemacs-base-pkg (1.84-1) ...
Setting up xemacs-efs-pkg (1.32-1) ...
Setting up xaw3d-shlibs (1.5-12) ...
Setting up xemacs (21.4.15-1002) ...

$ /sw/bin/xemacs

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 30, 2007

[Trac] 既存の Trac 0.9 のデータを Trac 0.10 に移行する

既存の Trac 0.9 環境を Trac 0.10 に移行したときの作業メモ。

yum でインストールして、trac-admin で既存データの upgrade を行うだけ。

# yum update trac.noarch
Loading "installonlyn" plugin
Setting up Update Process
Setting up repositories
    (SNIP)
Updated: trac.noarch 0:0.10.3.1-2.fc5
Complete!
# trac-admin /home/trac/myproject hotcopy /home/trac/myproject.backup
Hotcopying /home/trac/myproject to /home/trac/myproject.20070801 ... Hotcopy done.
# trac-admin /usr/local/beattrac upgrade --no-backup
Upgrade done.
# trac-admin /usr/local/beattrac wiki upgrade
 /usr/share/trac/wiki-default/TracGuide => TracGuide
  TracGuide already up to date.
 /usr/share/trac/wiki-default/TracBackup => TracBackup
 /usr/share/trac/wiki-default/TracRoadmap => TracRoadmap
 /usr/share/trac/wiki-default/TracIni => TracIni
 /usr/share/trac/wiki-default/TracAccessibility => TracAccessibility
 /usr/share/trac/wiki-default/TracUnicode => TracUnicode
 /usr/share/trac/wiki-default/TracInstall => TracInstall
 /usr/share/trac/wiki-default/TracEnvironment => TracEnvironment
 /usr/share/trac/wiki-default/InterMapTxt => InterMapTxt
 /usr/share/trac/wiki-default/TracQuery => TracQuery
 /usr/share/trac/wiki-default/TracReports => TracReports
 /usr/share/trac/wiki-default/TitleIndex => TitleIndex
  TitleIndex already up to date.
 /usr/share/trac/wiki-default/TracTicketsCustomFields => TracTicketsCustomFields
 /usr/share/trac/wiki-default/WikiPageNames => WikiPageNames
 /usr/share/trac/wiki-default/TracUpgrade => TracUpgrade
 /usr/share/trac/wiki-default/TracRss => TracRss
 /usr/share/trac/wiki-default/RecentChanges => RecentChanges
  RecentChanges already up to date.
 /usr/share/trac/wiki-default/WikiProcessors => WikiProcessors
 /usr/share/trac/wiki-default/TracSyntaxColoring => TracSyntaxColoring
 /usr/share/trac/wiki-default/TracPlugins => TracPlugins
 /usr/share/trac/wiki-default/TracPermissions => TracPermissions
 /usr/share/trac/wiki-default/TracChangeset => TracChangeset
 /usr/share/trac/wiki-default/TracRevisionLog => TracRevisionLog
 /usr/share/trac/wiki-default/TracFastCgi => TracFastCgi
 /usr/share/trac/wiki-default/TracTickets => TracTickets
 /usr/share/trac/wiki-default/TracLogging => TracLogging
  TracLogging already up to date.
 /usr/share/trac/wiki-default/WikiFormatting => WikiFormatting
 /usr/share/trac/wiki-default/TracLinks => TracLinks
 /usr/share/trac/wiki-default/TracTimeline => TracTimeline
 /usr/share/trac/wiki-default/TracSearch => TracSearch
 /usr/share/trac/wiki-default/CamelCase => CamelCase
 /usr/share/trac/wiki-default/TracBrowser => TracBrowser
 /usr/share/trac/wiki-default/TracImport => TracImport
 /usr/share/trac/wiki-default/WikiHtml => WikiHtml
 /usr/share/trac/wiki-default/TracWiki => TracWiki
 /usr/share/trac/wiki-default/TracCgi => TracCgi
 /usr/share/trac/wiki-default/TracStandalone => TracStandalone
 /usr/share/trac/wiki-default/WikiMacros => WikiMacros
 /usr/share/trac/wiki-default/TracInterfaceCustomization => TracInterfaceCustomization
 /usr/share/trac/wiki-default/TracModPython => TracModPython
 /usr/share/trac/wiki-default/WikiRestructuredTextLinks => WikiRestructuredTextLinks
 /usr/share/trac/wiki-default/TracNotification => TracNotification
 /usr/share/trac/wiki-default/TracSupport => TracSupport
 /usr/share/trac/wiki-default/WikiRestructuredText => WikiRestructuredText
 /usr/share/trac/wiki-default/InterWiki => InterWiki
 /usr/share/trac/wiki-default/TracAdmin => TracAdmin
 /usr/share/trac/wiki-default/SandBox => SandBox
  SandBox already up to date.
 /usr/share/trac/wiki-default/WikiNewPage => WikiNewPage
 /usr/share/trac/wiki-default/WikiDeletePage => WikiDeletePage
 /usr/share/trac/wiki-default/InterTrac => InterTrac
#

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 26, 2007

[Trac] 静的リソースの trac.ini での指定方法

Trac の静的リソースには、個々の Trac インスタンス毎のものと、同一サーバ上の全 Trac から参照されるものの二種類がある。 それぞれストレージ上の設置場所が異なるので、trac.ini では指定方法をかえなければならない。 今回はロゴを変更したかったので、Trac インスタンス単位のリソースとして画像を設置してみた。

静的リソースの trac.ini での指定方法

Trac インスタンス毎のリソース
ストレージの "/usr/share/trac/htdocs/" が trac.ini の "common/" に相当する。
全 Trac から参照されるのリソース
ストレージの "$TRAC_ENVIRONMENT_HOME/htdocs/" が trac.ini の "site/" に相当する。
http://www.example.com/trac/wiki/TracInterfaceCustomization

Change the src setting to site/ followed by the name of your image file. The width and height settings should be modified to match your image's dimensions (the Trac chrome handler uses "site/" for files within the project directory htdocs and "common/" for the common ones).

ロゴの登録方法

$TRAC_ENVIRONMENT_HOME/htdocs/logo.png という名前でロゴ画像を設置し、trac.ini に

[header_logo]
height = -1
link = site/logo.png
を指定する。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 24, 2007

[Apple] Mac 用アプリケーションメモ

生まれて初めて Mac OS を使い始めたわけだが。 とりあえず困るのは Windows で手に馴染んでいたアプリケーションの代わりになるものがあるかどうかということ。 というわけで、知り合いの Mac OS 使いの方の助力を仰いで、Windows で良く使うアプリケーションの Mac OS 版(?) を教えてもらった。

Jedit X ( ← 秀丸エディタ)
http://www.artman21.net/product/JeditX/index.html
シイラ ( ← Sleipnir)
http://shiira.jp/
Fugu ( ← WinScp)
http://rsug.itd.umich.edu/software/fugu/
TinkerTool ( ← 窓の手)
http://www.bresink.de/osx/TinkerTool.html

Posted in Apple | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 20, 2007

[Trac] Trac チケット起票時の "Assign to" フィールドをコンボボックス化する

Trac のチケットを起票する際、デフォルトでは "Assign to" フィールドは TextField になっている。 そのため、担当者のアカウント名を調べて入力するという作業が必要になる。 これが意外と面倒なので、"Assign to" を選択式に設定してみた。

設定方法

設定は非常に簡単。 $TRAC_HOME/myproject/conf/trac.ini の [ticket] セクションにある restrict_owner を false → true に変更するだけ。 この設定はデフォルトで false になっている。

[ticket]
restrict_owner = true

詳細情報

Trac の Help から関連情報を転載。 コンボボックスにプロジェクトメンバーが表示されない場合、下記の通り当該メンバーに Setting の変更などを行ってもらい、Trac セッションを作成する必要がある。

Assign-to as Drop-Down List
If the list of possible ticket owners is finite, you can change the assign-to ticket field from a text input to a drop-down list. This is done by setting the restrict_owner option of the [ticket] section in trac.ini to “true”. In that case, Trac will use the list of all users who have logged in and set their email address to populate the drop-down field.
To appear in the dropdown list, a user needs be registered with the project, i.e. a user session should exist in the database. Such an entry is automatically created in the database the first time the user submits a change in the project, for example when editing the user's details in the Settings page. Also, the user must have TICKET_MODIFY permissions.

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 19, 2007

[Trac] Trac の XML-RPC API にチャレンジ

Trac XML-RPC Plugin
http://trac-hacks.org/wiki/XmlRpcPlugin
root/xmlrpcplugin/0.10/tracrpc/api.py
http://trac-hacks.org/browser/xmlrpcplugin/0.10/tracrpc/api.py

Trac 0.10.3 の XML-RPC API

Trac XML-RPC Plugin を導入すると、http://example.com/mytrac/xmlrpc (Trac のトップ画面の URL に /xmlrpc を付加する)で API を閲覧することができる。 Trac 0.10.3 に 0.10 用の XML-RPC Plugin を導入した環境では下記の API が使用できる。


wiki
Function Description Permission required
struct wiki.getRecentChanges(dateTime.iso8601 since) Get list of changed pages since timestamp WIKI_VIEW
int wiki.getRPCVersionSupported() Returns 2 with this version of the Trac API. WIKI_VIEW
string wiki.getPage(string pagename, int version=None) Get the raw Wiki text of page, latest version. WIKI_VIEW
string wiki.getPageVersion(string pagename, int version=None) Get the raw Wiki text of page, latest version. WIKI_VIEW
string wiki.getPageHTML(string pagename, int version=None) Return page in rendered HTML, latest version. WIKI_VIEW
string wiki.getPageHTMLVersion(string pagename, int version=None) Return page in rendered HTML, latest version. WIKI_VIEW
array wiki.getAllPages() Returns a list of all pages. The result is an array of utf8 pagenames. WIKI_VIEW
struct wiki.getPageInfo(string pagename, int version=None) Returns information about the given page. WIKI_VIEW
struct wiki.getPageInfoVersion(string pagename, int version=None) Returns information about the given page. WIKI_VIEW
boolean wiki.putPage(string pagename, string content, struct attributes) writes the content of the page. WIKI_CREATE
array wiki.listAttachments(string pagename) Lists attachments on a given page. WIKI_VIEW
base64 wiki.getAttachment(string path) returns the content of an attachment. WIKI_VIEW
boolean wiki.putAttachment(string path, base64 data) (over)writes an attachment. Returns True if successful.This method is compatible with WikiRPC. putAttachmentEx has a more extensive set of (Trac-specific) features. WIKI_MODIFY
boolean wiki.putAttachmentEx(string pagename, string filename, string description, base64 data, boolean replace=True) Attach a file to a Wiki page. Returns the (possibly transformed) filename of the attachment. Use this method if you don't care about WikiRPC compatibility. WIKI_MODIFY
boolean wiki.deleteAttachment(string path) Delete an attachment. WIKI_DELETE
array wiki.listLinks(string pagename) Not implemented WIKI_VIEW
string wiki.wikiToHtml(string text) Render arbitrary Wiki text as HTML. WIKI_VIEW

search - Search Trac.
Function Description Permission required
array search.getSearchFilters() Retrieve a list of search filters with each element in the form (name, description). SEARCH_VIEW
array search.performSearch(string query, array filters=[]) Perform a search using the given filters. Defaults to all if not provided. Results are returned as a list of tuples in the form (href, title, date, author, excerpt). SEARCH_VIEW

ticket.milestone - Interface to ticket milestone objects.
Function Description Permission required
array ticket.milestone.getAll() Get a list of all ticket milestone names. TICKET_VIEW
struct ticket.milestone.get(string name) Get a ticket milestone. TICKET_VIEW
int ticket.milestone.delete(string name) Delete a ticket milestone TICKET_ADMIN
int ticket.milestone.create(string name, struct attributes) Create a new ticket milestone with the given attributes. TICKET_ADMIN
int ticket.milestone.update(string name, struct attributes) Update ticket milestone with the given attributes. TICKET_ADMIN

ticket.severity - Interface to ticket severity.
Function Description Permission required
array ticket.severity.getAll() Get a list of all ticket severity names. TICKET_VIEW
string ticket.severity.get(string name) Get a ticket severity. TICKET_VIEW
int ticket.severity.delete(string name) Delete a ticket severity TICKET_ADMIN
int ticket.severity.create(string name, string value) Create a new ticket severity with the given value. TICKET_ADMIN
int ticket.severity.update(string name, string value) Update ticket severity with the given value. TICKET_ADMIN

ticket.type - Interface to ticket type.
Function Description Permission required
array ticket.type.getAll() Get a list of all ticket type names. TICKET_VIEW
string ticket.type.get(string name) Get a ticket type. TICKET_VIEW
int ticket.type.delete(string name) Delete a ticket type TICKET_ADMIN
int ticket.type.create(string name, string value) Create a new ticket type with the given value. TICKET_ADMIN
int ticket.type.update(string name, string value) Update ticket type with the given value. TICKET_ADMIN

system - Core of the XML-RPC system.
Function Description Permission required
array system.multicall(array signatures) Takes an array of XML-RPC calls encoded as structs of the form (in a Pythonish notation here): {'methodName': string, 'params': array} XML_RPC
array system.listMethods() This method returns a list of strings, one for each (non-system) method supported by the XML-RPC server. XML_RPC
string system.methodHelp(string method) This method takes one parameter, the name of a method implemented by the XML-RPC server. It returns a documentation string describing the use of that method. If no such string is available, an empty string is returned. The documentation string may contain HTML markup. XML_RPC
array system.methodSignature(string method) This method takes one parameter, the name of a method implemented by the XML-RPC server. It returns an array of possible signatures for this method. A signature is an array of types. The first of these types is the return type of the method, the rest are parameters. XML_RPC
array system.getAPIVersion() Returns a list with two elements. First element is the major version number, second is the minor. Changes to the major version indicate API breaking changes, while minor version changes are simple additions, bug fixes, etc. XML_RPC

ticket.resolution - Interface to ticket resolution.
Function Description Permission required
array ticket.resolution.getAll() Get a list of all ticket resolution names. TICKET_VIEW
string ticket.resolution.get(string name) Get a ticket resolution. TICKET_VIEW
int ticket.resolution.delete(string name) Delete a ticket resolution TICKET_ADMIN
int ticket.resolution.create(string name, string value) Create a new ticket resolution with the given value. TICKET_ADMIN
int ticket.resolution.update(string name, string value) Update ticket resolution with the given value. TICKET_ADMIN

ticket.priority - Interface to ticket priority.
Function Description Permission required
array ticket.priority.getAll() Get a list of all ticket priority names. TICKET_VIEW
string ticket.priority.get(string name) Get a ticket priority. TICKET_VIEW
int ticket.priority.delete(string name) Delete a ticket priority TICKET_ADMIN
int ticket.priority.create(string name, string value) Create a new ticket priority with the given value. TICKET_ADMIN
int ticket.priority.update(string name, string value) Update ticket priority with the given value. TICKET_ADMIN

ticket.component - Interface to ticket component objects.
Function Description Permission required
array ticket.component.getAll() Get a list of all ticket component names. TICKET_VIEW
struct ticket.component.get(string name) Get a ticket component. TICKET_VIEW
int ticket.component.delete(string name) Delete a ticket component TICKET_ADMIN
int ticket.component.create(string name, struct attributes) Create a new ticket component with the given attributes. TICKET_ADMIN
int ticket.component.update(string name, struct attributes) Update ticket component with the given attributes. TICKET_ADMIN

ticket.version - Interface to ticket version objects.
Function Description Permission required
array ticket.version.getAll() Get a list of all ticket version names. TICKET_VIEW
struct ticket.version.get(string name) Get a ticket version. TICKET_VIEW
int ticket.version.delete(string name) Delete a ticket version TICKET_ADMIN
int ticket.version.create(string name, struct attributes) Create a new ticket version with the given attributes. TICKET_ADMIN
int ticket.version.update(string name, struct attributes) Update ticket version with the given attributes. TICKET_ADMIN

ticket - An interface to Trac's ticketing system.
Function Description Permission required
array ticket.query(string qstr="status!=closed") Perform a ticket query, returning a list of ticket ID's. TICKET_VIEW
array ticket.getRecentChanges(dateTime.iso8601 since) Returns a list of IDs of tickets that have changed since timestamp. TICKET_VIEW
array ticket.getAvailableActions(int id) Returns the actions that can be performed on the ticket. TICKET_VIEW
array ticket.get(int id) Fetch a ticket. Returns [id, time_created, time_changed, attributes]. TICKET_VIEW
int ticket.create(string summary, string description, struct attributes={}, boolean notify=False) Create a new ticket, returning the ticket ID. TICKET_CREATE
array ticket.update(int id, string comment, struct attributes={}, boolean notify=False) Update a ticket, returning the new ticket in the same form as getTicket(). TICKET_APPEND
int ticket.delete(int id) Delete ticket with the given id. TICKET_ADMIN
struct ticket.changeLog(int id, int when=0) Return the changelog as a list of tuples of the form (time, author, field, oldvalue, newvalue, permanent). While the other tuple elements are quite self-explanatory, the permanent flag is used to distinguish collateral changes that are not yet immutable (like attachments, currently). TICKET_VIEW
array ticket.listAttachments(int ticket) Lists attachments for a given ticket. Returns (filename, description, size, time, author) for each attachment. TICKET_VIEW
base64 ticket.getAttachment(int ticket, string filename) returns the content of an attachment. TICKET_VIEW
string ticket.putAttachment(int ticket, string filename, string description, base64 data, boolean replace=True) Add an attachment, optionally (and defaulting to) overwriting an existing one. Returns filename. TICKET_APPEND
boolean ticket.deleteAttachment(int ticket, string filename) Delete an attachment. TICKET_ADMIN
array ticket.getTicketFields() Return a list of all ticket fields fields. TICKET_VIEW

ticket.status - Interface to ticket status.
Function Description Permission required
array ticket.status.getAll() Get a list of all ticket status names. TICKET_VIEW
string ticket.status.get(string name) Get a ticket status. TICKET_VIEW
int ticket.status.delete(string name) Delete a ticket status TICKET_ADMIN
int ticket.status.create(string name, string value) Create a new ticket status with the given value. TICKET_ADMIN
int ticket.status.update(string name, string value) Update ticket status with the given value. TICKET_ADMIN

Java から Trac XML-RPC API にアクセスしてみる

試しに Java から Trac 上の Ticket を取得してみた。 ライブラリをインストールするのが面倒だったので、自前で HTTP コネクションを張っている。

サンプルコード

public void testTracApi() throws Exception {

  URL url = new URL("http://example.com/trac/xmlrpc");
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setDoOutput(true);
  con.setDoInput(true);
  con.setRequestMethod("POST");
  con.addRequestProperty("content-type", "text/xml");
  OutputStream os = null;

  try {
    os = con.getOutputStream();
    String request = 
      "<methodCall>\n" + 
      "  <methodName>ticket.get</methodName>\n" +
      "  <params>" + 
      "  <param><value><int>3</int></value></param>" + 
      "  </params>" + 
      "</methodCall>\n";
    os.write(request.getBytes());
  } finally {
    if (os != null) {
      os.close();
    }
  }

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  InputStream is = null;
  try {
    is = con.getInputStream();
    int ch = 0;
    while ((ch = is.read()) >= 0) {
      baos.write(ch);
    }
  } finally {
    if (is != null) {
      is.close();
    }
  }

  System.out.println("" + baos.toString("UTF-8"));
}

レスポンス

<?xml version='1.0'?>
<methodResponse>
<params>
<param>
<value><array><data>
<value><int>3</int></value>
<value><int>1179403566</int></value>
<value><int>1179403566</int></value>
<value><struct>
<member>
<name>status</name>
<value><string>new</string></value>
</member>
<member>
<name>description</name>
<value><string>基本的な設定を行う。</string></value>
</member>
<member>
<name>reporter</name>
<value><string>et</string></value>
</member>
<member>
<name>cc</name>
<value><string></string></value>
</member>
<member>
<name>resolution</name>
<value><string></string></value>
</member>
<member>
<name>component</name>
<value><string>Continuum</string></value>
</member>
<member>
<name>summary</name>
<value><string>Continuum 設定</string></value>
</member>
<member>
<name>priority</name>
<value><string>major</string></value>
</member>
<member>
<name>keywords</name>
<value><string></string></value>
</member>
<member>
<name>version</name>
<value><string></string></value>
</member>
<member>
<name>milestone</name>
<value><string>[Continuum] M1</string></value>
</member>
<member>
<name>owner</name>
<value><string>me</string></value>
</member>
<member>
<name>type</name>
<value><string>task</string></value>
</member>
</struct></value>
</data></array></value>
</param>
</params>
</methodResponse>

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 18, 2007

[WebService] XML-RPC 用 JavaScript ライブラリ

JavaScript で XML-RPC をサポートするライブラリをメモ。 結構揃っているので、クロスブラウザ、クロスプラットフォームの品質が高いものもありそう。

Mimic XML-RPC Client for Java Script(GPL)
http://sourceforge.net/projects/mimic-xmlrpc/
jsxmlRPC(BSD License)
http://sourceforge.net/projects/jsxmlrpc/
JS-RPC Client(GPL)
http://sourceforge.net/projects/jsrpc/
XML-RPC in Mozilla(Mozilla Public License)
http://www.mozilla.org/projects/xmlrpc/
vcXMLRPC(GPL)
http://www.vcdn.org/Public/XMLRPC/
Jamritas(独自ライセンス)
http://jamritas.sourceforge.net/
jsolait(LGPL)
http://jsolait.net/

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 17, 2007

[WebService] XML-RPC メモ

XML-RPC に関する情報をメモ。 例によって Google 先生の覚えが良いものを適当に列挙しただけ。 技術資料をざっと眺めてみたが、単純なので実装はかなり簡単そう。

技術資料

XML-RPC.com
http://www.xmlrpc.com/
XML-RPC Specification
http://www.xmlrpc.com/spec
Wikipedia - XML-RPC
http://ja.wikipedia.org/wiki/XML-RPC
XML-RPC for Newbies
http://www.scripting.com/davenet/1998/07/14/xmlRpcForNewbies.html
XML-RPC HOWTO
http://www.linux.or.jp/JF/JFdocs/XML-RPC-HOWTO/

XML-RPC が使用できる公開サービス

XEP-0009: Jabber-RPC
http://www.xmpp.org/extensions/xep-0009.html
Movable Type で使える XML-RPC API
http://www.na.rim.or.jp/~tsupo/program/blogTool/mt_xmlRpc.html
tDiary ドキュメント - xmlrpc.rb
http://docs.tdiary.org/ja/?xmlrpc.rb
XML-RPC for Wiki (FreeStyle Wiki 用の XML-RPC モジュール)
http://www.donzoko.net/cgi/fswiki_xmlrpc/
郵便専門ネットを XML-RPC で活用する
http://yubin.senmon.net/service/xmlrpc.html

XML-RPC 用ライブラリ(Java)

Apache XML-RPC
http://ws.apache.org/xmlrpc/
Crispy
http://sourceforge.net/projects/crispy/

Posted in WebService | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 16, 2007

[AS] JBoss AS 4.2.0 の Windows サービス化にチャレンジ

JBoss AS 4.2.0 を Windows サービスとして登録する方法をメモ。 Getting Started with JBoss 4.0Running as a Service の情報が古く、少々戸惑ったが Java Service Wrapper を使用することで無事 JBoss AS 4.2.0 を Windows サービスとして登録できた。

Java Service Wrapper
http://wrapper.tanukisoftware.org/doc/english/integrate-simple-win.html
RunJBossAsAServiceOnWindows
http://jboss.org/wiki/Wiki.jsp?page=RunJBossAsAServiceOnWindows
Running Jboss as a Windows Service
http://www.theserverside.com/discussions/thread.tss?thread_id=21279

Java Service Wrapper を JBoss AS 4.2.0 にコピー

まず、Java Service Wrapper を %JBOSS_HOME% にコピーする。

> copy %WRAPPER_HOME%\bin\Wrapper.exe %JBOSS_HOME%\bin\
> copy %WRAPPER_HOME%\src\bin\App.bat.in %JBOSS_HOME%\bin\
> move %JBOSS_HOME%\bin\App.bat.in %JBOSS_HOME%\bin\JBoss.bat
> copy %WRAPPER_HOME%\src\bin\InstallApp-NT.bat.in %JBOSS_HOME%\bin\
> move %JBOSS_HOME%\bin\InstallApp-NT.bat.in %JBOSS_HOME%\bin\InstallJBoss-NT.bat
> copy %WRAPPER_HOME%\src\bin\UninstallApp-NT.bat.in %JBOSS_HOME%\bin\
> move %JBOSS_HOME%\bin\UninstallApp-NT.bat.in %JBOSS_HOME%\bin\UninstallJBoss-NT.bat
> copy %WRAPPER_HOME%\lib\Wrapper.DLL %JBOSS_HOME%\lib\
> copy %WRAPPER_HOME%\lib\wrapper.jar %JBOSS_HOME%\lib\
> md %JBOSS_HOME%\conf
> copy %WRAPPER_HOME%\src\conf\wrapper.conf.in %JBOSS_HOME%\conf\
> move %JBOSS_HOME%\src\conf\wrapper.conf.in %JBOSS_HOME%\conf\wrapper.conf

Java Service Wrapper の設定

%JBOSS_HOME%\conf\wrapper.conf を編集する。

#********************************************************************
# Wrapper Properties
#********************************************************************
# Java Application
wrapper.java.command=c:/jdk1.5.0_12/bin/java

# Java Main class.  This class must implement the WrapperListener interface
#  or guarantee that the WrapperManager class is initialized.  Helper
#  classes are provided to do this for you.  See the Integration section
#  of the documentation for details.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

# Java Classpath (include wrapper.jar)  Add class path elements as
#  needed starting from 1
wrapper.java.classpath.1=c:/jboss-4.2.0.GA/lib/wrapper.jar
wrapper.java.classpath.2=c:/jdk1.5.0_12/lib/tools.jar
wrapper.java.classpath.3=./run.jar

# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=c:/jboss-4.2.0.GA/lib

# Java Additional Parameters
wrapper.java.additional.1=-server

# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=3

# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=64

# Application parameters.  Add parameters as needed starting from 1
wrapper.app.parameter.1=org.jboss.Main
wrapper.app.parameter.2=-b 0.0.0.0

#********************************************************************
# Wrapper Logging Properties
#********************************************************************
# Format of output for the console.  (See docs for formats)
wrapper.console.format=PM

# Log Level for console output.  (See docs for log levels)
wrapper.console.loglevel=INFO

# Log file to use for wrapper output logging.
wrapper.logfile=c:/jboss-4.2.0.GA/server/default/log/wrapper.log

# Format of output for the log file.  (See docs for formats)
wrapper.logfile.format=LPTM

# Log Level for log file output.  (See docs for log levels)
wrapper.logfile.loglevel=INFO

# Maximum size that the log file will be allowed to grow to before
#  the log is rolled. Size is specified in bytes.  The default value
#  of 0, disables log rolling.  May abbreviate with the 'k' (kb) or
#  'm' (mb) suffix.  For example: 10m = 10 megabytes.
wrapper.logfile.maxsize=0

# Maximum number of rolled log files which will be allowed before old
#  files are deleted.  The default value of 0 implies no limit.
wrapper.logfile.maxfiles=0

# Log Level for sys/event log output.  (See docs for log levels)
wrapper.syslog.loglevel=NONE

#********************************************************************
# Wrapper Windows Properties
#********************************************************************
# Title to use when running as a console
wrapper.console.title=JBoss Server

#********************************************************************
# Wrapper Windows NT/2000/XP Service Properties
#********************************************************************
# WARNING - Do not modify any of these properties when an application
#  using this configuration file has been installed as a service.
#  Please uninstall the service before modifying this section.  The
#  service can then be reinstalled.

# Name of the service
wrapper.ntservice.name=JBoss

# Display name of the service
wrapper.ntservice.displayname=JBoss Server

# Description of the service
wrapper.ntservice.description=JBoss Server

# Service dependencies.  Add dependencies as needed starting from 1
wrapper.ntservice.dependency.1=

# Mode in which the service is installed.  AUTO_START or DEMAND_START
wrapper.ntservice.starttype=AUTO_START

# Allow the service to interact with the desktop.
wrapper.ntservice.interactive=false
Java Service Wrapper の JMX サービスを JBoss AS に登録

%JBOSS_HOME%\server\default\deploy\java-service-wrapper-service.xml を作成する。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>
<server>
    <mbean code="org.tanukisoftware.wrapper.jmx.WrapperManager"
           name="JavaServiceWrapper:service=WrapperManager"/>
    
    <mbean code="org.tanukisoftware.wrapper.jmx.WrapperManagerTesting"
           name="JavaServiceWrapper:service=WrapperManagerTesting"/>
</server>

JBoss AS 4.2.0 を Windows サービスとして登録

> cd %JBOSS_HOME%\bin
> InstallJBoss-NT.bat
  

JBoss AS 4.2.0 の起動と停止

起動は下記のコマンドで行う。

> net start JBoss
停止は下記のコマンドで行う。
> net stop JBoss

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 14, 2007

[Library] Ant から Subversion へのアクセスにチャレンジ

チャレンジというほどのものでもない。 単に SvnAnt を使ってみただけ。 Ant 1.7.0 と簡単に連携できた。 これは便利。 ちょっと Ant で簡単なスクリプトを書くときに重宝しそう。

SvnAnt
http://subclipse.tigris.org/svnant.html
Apache Ant
http://ant.apache.org/

build.xml

<?xml version="1.0" encoding="UTF-8"?>

<project name="my project" default="checkout" basedir=".">

  <property name="workspace.dir" value="c:\workspace\myproject" />
  <property name="svn.userid"    value="scott" />
  <property name="svn.password"  value="tiger" />
  <property name="svn.url"       value="https://svn.example.com/svn/myproject/trunk" />
  <property name="svn.revision"  value="HEAD" />

  <path id="svnant.class.path">
    <fileset dir="${env.ANT_HOME}/antsvn/">
      <include name="*.jar" />
    </fileset>
  </path>

  <typedef resource="org/tigris/subversion/svnant/svnantlib.xml"
           classpathref="svnant.class.path"/>

  <target name="checkout">
    <delete dir="${workspace.dir}" />
    <mkdir dir="${workspace.dir}" />
    <svn username="${svn.userid}"
         password="${svn.password}">
      <checkout url="${svn.url}"
                revision="${svn.revision}"
                destPath="${workspace.dir}" />
    </svn>
  </target>
</project>

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 10, 2007

[Library] Apache Struts の Upgrade 方法をメモ

既存アプリケーションで使用している Apache Struts を Upgrade するときに便利なドキュメントがあったのでメモ。

StrutsUpgradeNotes10to12
http://wiki.apache.org/struts/StrutsUpgradeNotes10to12
StrutsUpgradeNotes11to124
http://wiki.apache.org/struts/StrutsUpgradeNotes11to124
StrutsUpgradeNotes124to127
http://wiki.apache.org/struts/StrutsUpgradeNotes124to127
StrutsUpgradeNotes127to128
http://wiki.apache.org/struts/StrutsUpgradeNotes127to128
StrutsUpgradeNotes128to129
http://wiki.apache.org/struts/StrutsUpgradeNotes128to129
StrutsUpgradeNotes12to13
http://wiki.apache.org/struts/StrutsUpgradeNotes12to13

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Jul 05, 2007

[AS] JBoss AS 4.2.x に外部(loopback外)からアクセスする方法

JBoss AS 4.2.x はデフォルト状態では loopback address 以外からのアクセスを受け付けない様、仕様が変更されたらしい。 loopback address 以外から接続する場合は起動時に "-b" オプションを指定する必要がある。 Release Notes には書いてあるけれど、こういう影響の大きい変更はもう少し派手に情宣して欲しいな・・・。

JBoss AS 4.2.0.GA Release Notes
http://sourceforge.net/project/shownotes.php?group_id=22866&release_id=507793
JBossAS now binds its services to localhost (127.0.0.1) *by default*, instead of binding to all available interfaces (0.0.0.0). This was primarily done for security reasons because of concerns of users going to production without having secured their servers properly. To enable remote access by binding JBoss services to a particular interface, simply run jboss with the -b option, but be aware you still need to secure you server properly.

> run.bat --help

usage: run.bat [options]

options:
    -h, --help                    Show this help message
    -V, --version                 Show version information
    --                            Stop processing options
    -D<name>[=<value>]            Set a system property
    -d, --bootdir=<dir>           Set the boot patch directory; Must be absolute or url
    -p, --patchdir=<dir>          Set the patch directory; Must be absolute or url
    -n, --netboot=<url>           Boot from net with the given url as base
    -c, --configuration=<name>    Set the server configuration name
    -B, --bootlib=<filename>      Add an extra library to the front bootclasspath
    -L, --library=<filename>      Add an extra library to the loaders classpath
    -C, --classpath=<url>         Add an extra url to the loaders classpath
    -P, --properties=<url>        Load system properties from the given url
    -b, --host=<host or ip>       Bind address for all JBoss services
    -g, --partition=<name>        HA Partition name (default=DefaultDomain)
    -u, --udp=<ip>                UDP multicast address
    -l, --log=<log4j|jdk>         Specify the logger plugin type

Posted in AS | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 30, 2007

[Maven] Maven2 の assembly プラグインにチャレンジ

maven-assembly-plugin とは

いわゆる「出荷用アーカイブの作成」に近いイメージのプラグイン。 特に出荷用というわけではないのだけれど、プロジェクト内の好きなファイルをアーカイビングすることが出来る。 アーカイブの形式も zip、tar.gz、tar.bz2、jar など様々な形式に対応している。 今回は、開発環境(要するにソース一式)を他の開発者にそのままアーカイビングして渡すことをイメージして遊んでみた。

Maven Assembly Plugin
http://maven.apache.org/plugins/maven-assembly-plugin/
assembly:assembly
http://maven.apache.org/plugins/maven-assembly-plugin/assembly-mojo.html
Guide to creating assemblies
http://maven.apache.org/guides/mini/guide-assemblies.html
ソースコード
https://svn.apache.org/repos/asf/maven/plugins/tags/maven-assembly-plugin-2.2-beta-1/

pom.xml の設定

<project>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptor>assemple.xml</descriptor>
          <outputDirectory>..</outputDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

maven-assembly-plugin の設定ファイル

pom.xml で指定した名称で maven-assembly-plugin の設定ファイルを作成する。 下の例は開発環境を渡すことを想定しているため、ソースコード類とビルドツールをアーカイビングしている。

<?xml version="1.0" encoding="UTF-8"?>

<assembly>
  <id>src</id>
  <formats>
    <format>tar.gz</format>
  </formats>
  <fileSets>
    <fileSet>
      <includes>
        <include>*.*</include>
        <include>.settings/**/*.*</include>
        <include>module1/pom.xml</include>
        <include>module1/src/**/*.*</include>
        <include>module2/pom.xml</include>
        <include>module2/src/**/*.*</include>
        <include>tool/maven-2.0.6/**/*.*</include>
      </includes>
    </fileSet>
  </fileSets>
</assembly>

maven-assembly-plugin の実行

下のコマンドで実行できる。今回の例では、プロジェクトホームと同じディレクトリに ${finalName}-src.tar.gz というアーカイブが作成される。 アーカイブファイルに設定ファイルの id が付加される。

> mvn assembly:assembly

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 26, 2007

[Subversion] Subversion と Trac の連携にチャレンジ (2)

Subversion の Issue Tracker 連携機能は便利なのだけれど、ディレクトリ毎にいくつものプロパティを設定しなければいけないという面倒さがある。 auto-props を使用できれば良いのだが、auto-props は残念なことにファイル専用でディレクトリには適用されない。 ディレクトリを作成する度にプロパティを手動で設定するのは馬鹿らしいので、自動化を考えてみた。

自動化の方法

auto-props
ディレクトリには auto-props は適用されない。不可能。
svn propset を CRON で実行。
ディレクトリ作成直後に連携機能が使用できない。さすがに /etc/cron.minutely というのは無いし。
pre-commit hook を利用
pre-commit で svn co、svn propset、svn commit を実施するとコンフリクトが発生して元の svn commit が失敗してしまう。NG。ちなみに、svn propset は working copy が無いと動作しないので、面倒でも一度 svn co しないと propset できない(Subversion subversion Issue 2238 で議論されている)。ちなみに、proplist や propget は working copy 無しでも実行できる。
post-commit hook を利用
これが唯一の方法?? post-commit で svn co、svn propset、svn commit を行う。パフォーマンス的には問題だが、所詮個人用途のサーバだから大丈夫だろう。

post-commit で bugtraq プロパティ追加の自動化

/var/svn/hooks/post-commit

というわけで、post-commit 用のスクリプトを作成してみた。 善し悪しは別として、bugtraq:url プロパティが設定されていないディレクトリ(もしくはその直下のファイル)が commit された際に自動的に bugtraq 関連のプロパティをセットする。 ユーザ情報を埋め込まないと行けないのが難と言えば難だが、他に方法が無かったので必要悪ということで諦めた。 ちょっとややこしくなってしまったが、結果的に期待通りの動作が得られたので良しとする。

# cat /var/svn/hooks/post-commit
#!/bin/sh
# POST-COMMIT HOOK

BUGTRAQ_PROPS=/var/svn/bugtraq_props.conf
TMP_DIR=/var/tmp/svn
SVN_REPOSITORY=file:///var/svn/
SVN_USER=me
SVN_PASSWORD=mypassword
SVNLOOK=/usr/bin/svnlook
SVN=/usr/bin/svn
REPOS="$1"
REV="$2"

#-----------------------------------------------------------------
# propset bugtraq conrigurations to directories
#-----------------------------------------------------------------
configureBugtraqProps() {

  #---------------------------------------------------------------
  # load configuration for bugtraq.
  # if configuration file does not exist, do nothing.
  #---------------------------------------------------------------
  test -x $BUGTRAQ_PROPS || return
  . $BUGTRAQ_PROPS
  CHANGED_DIRS="$1"
  for i in $CHANGED_DIRS;
  do

    #-------------------------------------------------------------
    # if "bugtraq:url" prop is not set, assume that this directory
    # has no bagtraq configuration
    #-------------------------------------------------------------
    BUGTRAQ_URL=`$SVNLOOK propget -r "$REV" "$REPOS" "bugtraq:url" "$i"`
    if [ "$BUGTRAQ_URL" == "" ]
    then

      #-----------------------------------------------------------
      # unfortunately, svn propset command needs working copy of repository.
      # so, checkout target directory to temporary working copy
      #-----------------------------------------------------------
      rm -rf $TMP_DIR
      mkdir $TMP_DIR
      cd $TMP_DIR
      $SVN checkout "$SVN_REPOSITORY$i" --non-recursive -r HEAD --username "$SVN_USER" --password "$SVN_PASSWORD" --non-interactive

      #-----------------------------------------------------------
      # propset to target directory
      #-----------------------------------------------------------
      $SVN propset "bugtraq:url" "$bugtraq_url" `ls $TMP_DIR`
      $SVN propset "bugtraq:label" "$bugtraq_label" `ls $TMP_DIR`
      $SVN propset "bugtraq:message" "$bugtraq_message" `ls $TMP_DIR`
      $SVN propset "bugtraq:warnifnoissue" "$bugtraq_warnifnoissue" `ls $TMP_DIR`
      $SVN propset "bugtraq:number" "$bugtraq_number" `ls $TMP_DIR`
      $SVN propset "bugtraq:append" "$bugtraq_append" `ls $TMP_DIR`
      $SVN propset "bugtraq:logregex" "$bugtraq_logregex" `ls $TMP_DIR`

      #-----------------------------------------------------------
      # commit prop changes
      #-----------------------------------------------------------
      $SVN commit `ls $TMP_DIR` --username "$SVN_USER" --password "$SVN_PASSWORD" --message "set bugtraq props"

      #-----------------------------------------------------------
      # clean up temporary working copy
      #-----------------------------------------------------------
      rm -rf $TMP_DIR
    fi
  done
}

CHANGED_DIRS=`$SVNLOOK dirs-changed -r "$REV" "$REPOS"`
configureBugtraqProps "$CHANGED_DIRS"
exit 0

/var/svn/bugtraq_props.conf

この設定は環境に併せて適宜変更する必要がある。

# cat /var/svn/bugtraq_props.conf
bugtraq_url=https://www.example.com/trac/ticket/%BUGID%
bugtraq_label="Ticket ID"
bugtraq_message="#%BUGID%"
bugtraq_warnifnoissue=false
bugtraq_number=true
bugtraq_append=false
bugtraq_logregex="#?(\d+)"

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 25, 2007

[Subversion] Subversion と Trac の連携にチャレンジ (1)

Subversion には、クライアントプログラム用に "bugtraq" で始まるプロパティが規定されている。 このプロパティが指定されているディレクトリはバグトラッキングシステムとの連携機能が特別に用意される(大抵のクライアントで)。 というわけで、Subversion と Trac を連携させてみた。

Issue Tracker Integration
http://svn.collab.net/subclipse/help/topic/org.tigris.subversion.subclipse.doc/html/reference/issuetracker.html
Integration of Subversion (GUI) clients with Bug Tracking Tools
http://guest:guest@tortoisesvn.tigris.org/svn/tortoisesvn/trunk/doc/issuetrackers.txt

設定したプロパティ

設定するのはディレクトリのみで OK。 TortoiseSVN を使用すると再帰的に設定を行ってくれるので便利。

bugtraq_url https://www.example.com/trac/ticket/%BUGID% Issue Tracker の URL。"%BUGID%"という文字列がコミット時に入力された Issue ID に自動的に置換される。
bugtraq_label "Ticket ID" Subversion クライアントに表示される ID 用のラベル。Trac の場合は Bug も Issue も Ticket と呼ばれているので Ticket ID にしている。
bugtraq_message "#%BUGID%" コミット時、コメントに自動的に追記されるメッセージ。
bugtraq_warnifnoissue false コミット時に Issue ID が指定されなかった場合に警告をするか否か。個人的にコード以外の情報も Subversion で管理しているので false にしているが、開発用リソースのみが格納されているディレクトリの場合は true の方が良いかもしれない。
bugtraq_number true Issue ID が数値かどうか。Issue ID が Subversion クライアントに入力された際、クライアントが Issue ID をバリデーションしてくれる。
bugtraq_append false bugtraq_message で指定したメッセージを、ユーザが入力したコメントの「前」に追記するか「後」に追記するかを指定する。false の時に前になる。
bugtraq_logregex "#?(\d+)" Issue ID の正規表現。Issue ID が Subversion クライアントに入力された際、クライアントが Issue ID をバリデーションしてくれる。

TortoiseSVN のコミット画面の変化

設定前 設定後
[TortoiseSVN設定前] [TortoiseSVN設定後]

Subclipse のコミット画面の変化

設定前 設定後
[Subclipse設定前] [Subclipse設定後]

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 24, 2007

[Library] Log4j を使用してログを syslog に出力する

Debian Etch の syslog にリモートから Log4j を使用してログを出力する方法をメモ。

syslogd の設定

Debian Etch では、デフォルト状態の syslogd はリモートからのログを受け付けない設定になっている。 そのため、syslogd の設定を変更して syslogd をリブートする必要がある。 設定は /etc/default/syslogd で行う。

# diff /etc/default/syslogd.original /etc/default/syslogd
13c13
< SYSLOGD=""
---
> SYSLOGD="-r"
# /etc/init.d/sysklogd restart
#
設定が正常に反映されたか確認するために、syslog のポートが開いているかチェックする。
# netstat -an | grep -i udp | grep 514
udp        0      0 0.0.0.0:514             0.0.0.0:*
#
UDP の 514 が開いていたら設定は成功。

Log4j の設定

Log4j にはデフォルトで syslog にログを出力してくれる org.apache.log4j.net.SyslogAppender が用意されている。 しかし、残念なことに org.apache.log4j.PatternLayout が文字エンコーディングの変換機能を持っていないので、マルチバイト文字をメッセージに使用するとログが文字化けしてしまう。 そのため、PatternLayout を拡張して文字エンコーディングを変換する機能を持った Layout クラスを自作する必要がある。 Debian Etch の場合は(インストール時の設定にもよるけれど)、通常デフォルトの文字エンコーディングは EUC-JP になっていると思うので、EUC-JP に変換できればマルチバイト文字をログに出力できる。

文字エンコーディング変換機能付き PatternLayout

PatternLayout の拡張は非常に簡単。 単純に文字エンコーディングを設定内容からインジェクションしてもらい、PatternLayout でメッセージをフォーマットした後に変換処理をするだけ。

package jp.in_vitro.samplecode;

import java.io.UnsupportedEncodingException;

import org.apache.log4j.PatternLayout;
import org.apache.log4j.spi.LoggingEvent;

/**
 * メッセージのフォーマット後に文字エンコーディング変換を行う {@link PatternLayout}。
 */
public class CharsetSupportPatternLayout extends PatternLayout {

    /** メッセージをフォーマット後に変換する文字エンコーディング。 */
    private String charset;

    public CharsetSupportPatternLayout() {
        super();
    }

    public CharsetSupportPatternLayout(final String pattern) {
        super(pattern);
    }

    public void setCharset(final String charset) {
        this.charset = charset;
    }

    @Override
    public String format(final LoggingEvent event) {
        String message = super.format(event);
        if (this.charset != null) {
            try {
                message = new String(message.getBytes(this.charset));
            } catch (UnsupportedEncodingException e) {
            }
        }
        return message;
    }
}

Log4j の設定

log4j.properties に下記の様な感じで設定する。log4j.xml にする場合はこの内容に準じて XML に書き直せば良い。 Facility は syslog のカテゴリに相当するもので、デフォルトでは user、uucp などが規定されている。 システムにもよるけれど、専用の Facility を用意した方が分かり易いと個人的には思う。 前述の通り、Debian Etch の場合、charset は EUC-JP を指定する(と大抵は上手くいくと思う)。 ConversionPattern は通常と少し違い、時刻と改行コードを省略している。 時刻は syslogd が自動的に付加してくれるのと、改行コードはプラットフォーム毎に異なるのでメッセージには付加しないようにしている。 メッセージに改行コードが付いていなくても、syslogd が付加してくれる様なので特に問題はない(はず)。

log4j.appender.syslog=org.apache.log4j.net.SyslogAppender
log4j.appender.syslog.Facility=[facility]
log4j.appender.syslog.SyslogHost=[syslog server]
log4j.appender.syslog.layout=jp.in_vitro.samplecode.CharsetSupportPatternLayout
log4j.appender.syslog.layout.charset=[syslog server default character encoding]
log4j.appender.syslog.layout.ConversionPattern=%5p %c{1} - %m

実験

下記の様なテストコードを Windows XP 上で実行してみた。 面倒なので facility は uucp を間借りした。

Logger log = Logger.getLogger(CharsetSupportPatternLayoutTest.class);
log.fatal("Oh, my god!!");
log.error("緊急事態");
log.warn("気をつけて");
log.info("お知らせ");
log.debug("デバッグ");
リモートの Debian Etch では以下の様なログが出力された。
# tail -f /var/log/uucp.log
May 26 16:14:03 192.168.1.101 FATAL Hoge - Oh, my god!!
May 26 16:14:03 192.168.1.101 ERROR Hoge - 緊急事態
May 26 16:14:03 192.168.1.101  WARN Hoge - 気をつけて
May 26 16:14:03 192.168.1.101  INFO Hoge - お知らせ
May 26 16:14:04 192.168.1.101 DEBUG Hoge - デバッグ
というわけで、実験成功。 但し、何故か変な化け方をする文字が結構ある。 メッセージの 'る' が 'た' に変わってしまうといった感じ。 後で原因を調査しないと・・・。

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 23, 2007

[Misc] Subversion Web UI のデザインをカスタマイズする

Apache2 + Subversion で運用している場合、Subversion の Web UI を簡単にカスタマイズできる。 Debian Etch での方法をメモ。

svnindex.xsl、svnindex.css のコピー

/var/www/apache2-default/ に svnindex.xsl と svnindex.css が設置されているので、 この 2 つのファイルを Apache2 が参照可能な位置にコピー(DocumentRoot 直下など)。

/etc/apache2/mods-available/dav_svn.conf の編集

dav_svn.conf に SVNIndexXSLT を指定する。パスは DocumentRoot からの相対パスを指定。

<Location /svn>

  ...SNIP...

  # Web UI Design
  SVNIndexXSLT /svnindex.xsl

  ...SNIP...

</Location>

svnindex.xsl、svnindex.css の編集

後はお好みで svnindex.xsl、svnindex.css を編集する。 デフォルト状態に多少手を入れたものが こちら。 興味のある方はお持ちください。

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 22, 2007

[Maven] packaging の際にソースコードの jar も生成する。

Maven2 で "mvn package" する際に同時にソースコード及びリソースを jar でアーカイビングする方法をメモ。 納品の際に便利。

pom.xml の設定

maven-source-plugin を使用するだけなので、設定は非常に簡単。 ただ、maven-source-plugin のソースコードを見ると、pom.xml に登録するだけで package phase になると自動的に実行される設定になっているのだが、 実際に動作させてみると何故か動かない。仕方がないので、executions を指定して実行するようにした。環境の問題だろうか?? バグだろうか??

<project>

    ...SNIP...

  <build>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-source-plugin</artifactId>
      <executions>
        <phase>package</phase>
        <execution>
          <goals>
            <goal>jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </build>

    ...SNIP...

</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 21, 2007

[Library] Mock ライブラリを調査

Java で利用できる Mock ライブラリを調べてみた。 昔使用していた MockObjects は いつの間にか開発が停止して現在ではダウンロード出来なくなっているようだ。

Mock ライブラリ

EasyMock

現時点で一番情報が多そうなのが EasyMock か。 多少慣れるのに時間がかかりそうだが、結構使い出はありそう。 jMock とどちらを選択するかは好みの問題になるだろうか。

EasyMock
http://www.easymock.org/
EasyMock 2.2 Readme
http://www.easymock.org/EasyMock2_2_Documentation.html
EasyMock 2 License (MIT License)
http://www.easymock.org/License.html

jMock

EasyMock とどちらを選択するか悩むところ。 とりあえず両方試してみて自分に合う方を選択するということになりそう。

jMock
http://www.jmock.org/index.html
Getting Started
http://www.jmock.org/getting-started.html
jMock Project License
http://www.jmock.org/license.html

RMock

RMock testing framework
http://rmock.sourceforge.net/
The RMock 2.0.0 user guide
http://rmock.sourceforge.net/documentation/xdoc.html
Project License (Apache License Version 2.0)
http://rmock.sourceforge.net/documentation/license.html

mocquer

mocquer
https://mocquer.dev.java.net/
CPL
http://www.opensource.org/licenses/cpl1.0.php

Posted in Library | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 20, 2007

[Misc] GUI プログラミングで使用できるフリーのアイコン集

GUI プログラミングをすると、いつもアイコンをどうするかで困ってしまう。 大抵は簡単なものを自作するのだが、時間がかかって仕方がない。 というわけで、フリーで使用できる GUI 用のアイコン集を探してみた。

Icon Collection
http://sourceforge.net/projects/icon-collection/
Ximian Open-Officeのアイコン
http://www.novell.com/coolsolutions/nnlsmag/assets/ooo-stock.zip
Gnomeのアイコン:
http://art.gnome.org/themes/icon/
SVG BlueSphereのアイコンとテーマ:
http://svgicons.sourceforge.net/
KDEのアイコン:
http://www.buzzard.me.uk/jonathan/kde-icons.html
http://www.kde-look.org/
Iconize Textlinks with CSS
http://www.pooliestudios.com/projects/iconize/
Drunkey Love
http://www.el73.be/drunkey-love/downloads/
Eclipse Icons
http://codehaus.org/~bwalding/eclipse-icons/
Sanscons
http://somerandomdude.net/srd-projects/clearbits

情報源

上記のアイコン集は下記のサイトから GUI に使用できそうなものをチョイスした。 下記のサイトを公開してくださっている方に感謝。

Java GUIプログラミングの、とてもBasicなFAQ
http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html
POP*POP的アイコン配布サイトまとめ
http://www.popxpop.com/archives/2006/12/post_48.html

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 18, 2007

[Maven] Maven2 Cobertura plugin でカバレッジにチャレンジ

Cobertura とは

Cobertura は、Java 用のカバレッジツール。類似のものに CloverEMMAjcoverage などがある。 けれど、Clover は商用利用はライセンス購入が必要、EMMA は Maven2 用のプラグインが無い、JCoverage はいつの間にか Eclipse Plugin 専用になっている、ということで現状 Maven2 で気楽にカバレッジツールを使用する場合は Cobertura しか選択肢が無い。 というわけで、Cobertura を使用してカバレッジレポートを作成してみた。

Cobertura
http://cobertura.sourceforge.net/

pom.xml の設定

Cobertura の設定は build で instrument して、report で結果を出力するようにすれば良い。 pom.xml に下記の様な設定をして、"mvn site" で簡単にカバレッジレポートを見ることができる。

<project>

    ...SNIP...

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
        <executions>
          <phase>pre-site</phase>
          <execution>
            <goals>
              <goal>clean</goal>
              <goal>check</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

    ...SNIP...

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>cobertura-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </reporting>

</project>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 17, 2007

[Trac] Mylar で Eclipse + Trac Ticket 連携にチャレンジ

Mylar とは

Eclipse Mylar Project によると、Mylar とは

Eclipse Mylar is a task-focused UI that reduces information overload and makes multi-tasking easy.
というものだそうだ。要するに、Eclipse 上で Eclipse UI に従ってタスク管理をすることができるというプラグインのこと。 面白いのは、Trac 用の Mylar Connector が用意されていて、Trac 側で XML-RPC プラグインを用意しておくと Mylar で Trac のチケットを管理できるようになるということ。 Trac はチケットの上手な活用が肝になるので、Eclipse と連携できると便利。 ということで、早速試してみた。
Eclipse Mylar
http://www.eclipse.org/mylar/
Trac XML-RPC プラグイン
http://trac-hacks.org/wiki/XmlRpcPlugin

Trac XML-RPC プラグインのインストール

これは、上記の Trac XML-RPC プラグインのページに従ってインストール作業をすれば OK。

Eclipse Mylar のインストール

Eclipse 3.3M7 で Mylar のインストールを試してみた。 Mylar は Callisto の後継となる Europa に含まれているので、インストールは非常に簡単。 Subversion にも Mylar 用プラグインがあったので、ついでにインストールしておいたが、 何の役に立っているのか良くわかっていない(^^; まぁ、大は小を兼ねるということで。

[Mylar インストール(1)]
Mylar は Europa でインストールできるので、Software Updates の機能を使用する。

[Mylar インストール(2)]
"Search for new features to install" を選択して次へ。

[Mylar インストール(3)]
今回は Mylar 関連のプラグインとして Europa に登録されている Mylar プラグインと Subclipseに含まれている Mylar プラグインをインストールするので、Europa と Subclipse にチェックして次へ。

[Mylar インストール(4)]
Mylar 関連のプラグインをチェックして次へ。図では全て選択してあるが、Connector は必要なものだけで良い。例えば、Trac にしか接続しないのであれば、Trac Connector だけ選択しておけば良い。

[Mylar インストール(5)]
後はお決まりのライセンス確認。次へ。

[Mylar インストール(6)]
インストールされるプラグインを確認。次へ。

[Mylar インストール(7)]
インストールの最終確認。次へ。

[Mylar インストール(8)]
Eclipse リブートの確認。次へ。

Eclipse Mylar の設定

Eclipse Mylar プラグインのインストールが終了して、Eclipse の再起動が終わったら Mylar の設定を行う。

[Mylar 設定(1)]
Eclipse のリブートが完了すると、Mylar の設定画面が表示される。特に変更すべき内容も無かったのでデフォルトの設定のまま次へ(変更したい方はどうぞ)。

[Mylar 設定(2)]
"Task List" View を右クリックして "New" を選択すると、"Query..." が表示されるのでこれを選択。

[Mylar 設定(3)]
デフォルトではタスクリポジトリに "Eclipse.org" しか登録されていないので、自分の Trac を登録する。"Add Task Repository" を選択。

[Mylar 設定(4)]
Server に Trac の URL を入力。Label は任意の文字列で良い。後は、認証が必要であれば認証情報を入力。Trac の場合、Access Type は XML-RPC にする。一通り入力が終わったら、"Validate Settings" を押して一度タスクリポジトリに接続してみる。エラーが出なければ設定完了。

[Mylar 設定(5)]
今追加したタスクリポジトリを選択して次へ。

[Mylar 設定(6)]
クエリの内容を入力する。今回は全てのチケットを表示する様にしておくため何も設定を行わずに次へ。

[Mylar 設定(7)]
"Task List" にチケットが表示されたら設定完了。後は、ここからチケットの起票や更新が可能となる。便利。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 16, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(4)

まとめ

結局、Maven2 の Inheritance と Aggregation は上手く使いわけると結構便利だと再認識できた。 Maven2 の POM を階層化して管理する場合は下記の図の様になるだろうか。

[Inheritance と Aggregation の使い分け]

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 14, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(3)

inheritance & aggregation の実験

inheritance & aggregation 用のサンプルプロジェクトは下記の様な構成。 基本的には前回 2 つと全く同じ。 \both\pom.xml は packageing=pom で aggregation を使用できるようにしてある。 \both\child\pom.xml は継承を表す parent タグを使用して \both\pom.xml を継承してある。

\both
  ├pom.xml
  └child
    ├pom.xml
    └src
      └java
        └com
         └example
           └HelloWorld.java

\both\pom.xml

artifactId、name 以外は aggregation のサンプルと全く同一。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>pom both sample</name>
  <groupId>com.example</groupId>
  <artifactId>pom-both-sample</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <organization>
    <name>example.com</name>
    <url>http://www.example.com/</url>
  </organization>

  <developers>
    <developer>
      <id>me</id>
      <name>me</name>
    </developer>
  </developers>

  <issueManagement>
    <system>Bugzilla</system>
    <url>http://www.example.com/bugzilla</url>
  </issueManagement>

  <ciManagement>
    <system>continuum</system>
    <url>http://www.example.com/continuum</url>
  </ciManagement>

  <mailingLists>
    <mailingList>
      <name>Developer ML</name>
      <subscribe>subscribe@example.com</subscribe>
      <unsubscribe>unsubscribe@example.com</unsubscribe>
      <post>developer@example.com</post>
    </mailingList>
  </mailingLists>

  <scm>
    <connection>scm:svn:http://www.example.com/svn/my-project</connection>
    <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
    <tag>HEAD</tag>
    <url>http://www.example.com/websvn/my-project</url>
  </scm>

  <repositories>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>
  
  <distributionManagement>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>scp://www.example.com/maven2</url>
    </repository>
  </distributionManagement>
  
  <modules>
    <module>child</module>
  </modules>

</project>

\both\child\pom.xml

artifactId、name 以外は inheritance のサンプルと全く同一。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>pom-both-sample</artifactId>
    <version>1.0.0</version>
  </parent>

  <artifactId>pom-both-sample-child</artifactId>
  <name>pom both sample - child</name>
  <packaging>jar</packaging>

</project>

\both で Maven2 による compile を実行した結果

aggregation を使用しているので、\both\pom.xml を使用してコンパイルを実行すると \both\child\pom.xml も同時に処理されている。 また、inheritance も使用しているので、\both\pom.xml の設定項目が \both\child\pom.xml に継承されている。


both>mvn compile
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   pom both sample
[INFO]   pom both sample - child
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom both sample
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-both-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample
  version : 1.0.0
  name : pom both sample
***********************************************************
Parent : null
File : D:\both\pom.xml
Basedir : D:\both
Repositories : [org.apache.maven.model.Repository@13059051[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@3945515[name=M
aven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=
default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@8530b8],
]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1deeb40,]
Developers : [org.apache.maven.model.Developer@30633470[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@25109548[name=example.com,url
=http://www.example.com/]

[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom both sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\both\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-both-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample-child
  version : 1.0.0
  name : pom both sample - child
***********************************************************
Parent : org.apache.maven.project.MavenProject@f328409
File : D:\both\child\pom.xml
Basedir : D:\both\child
Repositories : [org.apache.maven.model.Repository@29857804[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@13594894[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1077fc9
],]
Modules : []
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@a2220f,]
Developers : [org.apache.maven.model.Developer@1668655[name=me,email=null,id=me,
organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@7388808[name=example.com,url=
http://www.example.com/]

***** POM INFORMATION *************************************
  id : com.example:pom-both-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample
  version : 1.0.0
  name : pom both sample
***********************************************************
Parent : null
File : D:\both\pom.xml
Basedir : D:\both
Repositories : [org.apache.maven.model.Repository@13059051[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@3945515[name=M
aven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=
default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@8530b8],
]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1deeb40,]
Developers : [org.apache.maven.model.Developer@30633470[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@25109548[name=example.com,url
=http://www.example.com/]

[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] pom both sample ....................................... SUCCESS [0.969s]
[INFO] pom both sample - child ............................... SUCCESS [1.766s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Mon May 14 00:14:11 JST 2007
[INFO] Final Memory: 4M/13M
[INFO] ------------------------------------------------------------------------

both>

\both\child で Maven2 による compile を実行した結果

\both\child\pom.xml を使用してコンパイルを実行してみる。 \both\pom.xml を継承しているので、\both\child\pom.xml がきちんと \both\pom.xml の内容を引き継いでいることが分かる。


both\child>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom both sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\both\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-both-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample-child
  version : 1.0.0
  name : pom both sample - child
***********************************************************
Parent : org.apache.maven.project.MavenProject@f328409
File : D:\both\child\pom.xml
Basedir : D:\both\child
Repositories : [org.apache.maven.model.Repository@33459432[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@13948523[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@149105b
],]
Modules : []
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@196f4b5,]
Developers : [org.apache.maven.model.Developer@33445663[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@6326112[name=example.com,url=
http://www.example.com/]

***** POM INFORMATION *************************************
  id : com.example:pom-both-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-both-sample
  version : 1.0.0
  name : pom both sample
***********************************************************
Parent : null
File : D:\both\pom.xml
Basedir : D:\both
Repositories : [org.apache.maven.model.Repository@13301441[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@17708501[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1f03691
],]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1b03c1a,]
Developers : [org.apache.maven.model.Developer@5313146[name=me,email=null,id=me,
organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@6888942[name=example.com,url=
http://www.example.com/]

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4 seconds
[INFO] Finished at: Mon May 14 00:22:39 JST 2007
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

both\child>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 13, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(2)

aggregation の実験

aggregation 用のサンプルプロジェクトは下記の様な構成。 基本的には inheritance 用と全く同じ。 \aggregation\pom.xml は packageing=pom で aggregation を使用できるようにしてある。 \aggregation\child\pom.xml は inheritance の時とは異なり、継承を表す parent タグを外してある。

\aggregation
  ├pom.xml
  └child
    ├pom.xml
    └src
      └java
        └com
         └example
           └HelloWorld.java

\aggregation\pom.xml

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>pom aggregation sample</name>
  <groupId>com.example</groupId>
  <artifactId>pom-aggregation-sample</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <organization>
    <name>example.com</name>
    <url>http://www.example.com/</url>
  </organization>

  <developers>
    <developer>
      <id>me</id>
      <name>me</name>
    </developer>
  </developers>

  <issueManagement>
    <system>Bugzilla</system>
    <url>http://www.example.com/bugzilla</url>
  </issueManagement>

  <ciManagement>
    <system>continuum</system>
    <url>http://www.example.com/continuum</url>
  </ciManagement>

  <mailingLists>
    <mailingList>
      <name>Developer ML</name>
      <subscribe>subscribe@example.com</subscribe>
      <unsubscribe>unsubscribe@example.com</unsubscribe>
      <post>developer@example.com</post>
    </mailingList>
  </mailingLists>

  <scm>
    <connection>scm:svn:http://www.example.com/svn/my-project</connection>
    <developerConnection>scm:svn:https://127.0.0.1/svn/my-project</developerConnection>
    <tag>HEAD</tag>
    <url>http://www.example.com/websvn/my-project</url>
  </scm>

  <repositories>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>
  
  <distributionManagement>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>scp://www.example.com/maven2</url>
    </repository>
  </distributionManagement>
  
  <modules>
    <module>child</module>
  </modules>

</project>

\aggregation\child\pom.xml

今回は aggregation のみ使用することが目的なので、inheritance を表す parent タグは使用していない。 \aggregation\pom.xml との違いを明確にするために、わざとほとんどの設定を省略している。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>pom-aggregation-sample-child</artifactId>
  <version>1.0.0</version>
  <name>pom aggregation sample - child</name>
  <packaging>jar</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

</project>

\aggregation で Maven2 による compile を実行した結果

aggregation を使用しているので、\aggregation\pom.xml を使用してコンパイルを実行すると \aggregation\child\pom.xml も同時に処理されている。 今回は inheritance を使用していないので、\aggregation\child\pom.xml では \aggregation\pom.xml の内容は引き継がれていない。 例えば、Developer や Organization といった項目に注目してみると、\aggregation\child\pom.xml では空になっていることが分かる。 また、\aggregation\pom.xml では、Modules に child が設定されていることが分かる。


aggregation>mvn compile
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO]   pom aggregation sample - child
[INFO]   pom aggregation sample
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom aggregation sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\aggregation\child\tar
get\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-aggregation-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-aggregation-sample-child
  version : 1.0.0
  name : pom aggregation sample - child
***********************************************************
Parent : null
File : D:\aggregation\child\pom.xml
Basedir : D:\aggregation\child
Repositories : [org.apache.maven.model.Repository@29345020[name=Maven Repository
 Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=default,release
s=null,snapshots=org.apache.maven.model.RepositoryPolicy@11db6bb],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : []
Developers : []
Organization : null

[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom aggregation sample
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-aggregation-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-aggregation-sample
  version : 1.0.0
  name : pom aggregation sample
***********************************************************
Parent : null
File : D:\aggregation\pom.xml
Basedir : D:\aggregation
Repositories : [org.apache.maven.model.Repository@30311876[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@28326938[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@139e351
],]
Modules : [child,]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@51127a,]
Developers : [org.apache.maven.model.Developer@30167145[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@13594894[name=example.com,url
=http://www.example.com/]

[INFO]
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] ------------------------------------------------------------------------
[INFO] pom aggregation sample - child ........................ SUCCESS [2.640s]
[INFO] pom aggregation sample ................................ SUCCESS [0.047s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 18:05:02 JST 2007
[INFO] Final Memory: 4M/9M
[INFO] ------------------------------------------------------------------------

aggregation>

\aggregation\child で Maven2 による compile を実行した結果

\aggregation\child\pom.xml を使用してコンパイルを実行してみる。 aggregation を使用していても、基本的には \aggregation\pom.xml との親子関係は無いので単体で問題なくコンパイルできる。

aggregation\child>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom aggregation sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\aggregation\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-aggregation-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-aggregation-sample-child
  version : 1.0.0
  name : pom aggregation sample - child
***********************************************************
Parent : null
File : D:\aggregation\child\pom.xml
Basedir : D:\aggregation\child
Repositories : [org.apache.maven.model.Repository@33459432[name=Maven Repository
 Switchboard,url=http://repo1.maven.org/maven2,id=central,layout=default,release
s=null,snapshots=org.apache.maven.model.RepositoryPolicy@d4d66b],]
Modules : []
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : []
Developers : []
Organization : null

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 18:12:51 JST 2007
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

aggregation\child>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 12, 2007

[Maven] Maven2 で POM の inheritance & aggregation を整理してみる(1)

POM の inheritance & aggregation

普段何気なく使っている POM の inheritance や aggregation だけれど、 考えてみると極端に複雑なプロジェクトを構築したことが無いので常に両方を同時に使用することが多かった。 そこで、一度 inheritance と aggregation の違いとそれぞれの意味を整理してみた。

inheritance の実験

下記の様な構成のプロジェクトをでっち上げてみた。 \inheritance\pom.xml は packageing=pom で親 POM になれるようにしてある(下記参照)。 \inheritance\child\pom.xml は \inheritance\pom.xml を継承するように設定してある。

\inheritance
  ├pom.xml
  └child
    ├pom.xml
    └src
      └java
        └com
         └example
           └HelloWorld.java

\inheritance\pom.xml

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>
  <name>pom inheritance sample</name>
  <groupId>com.example</groupId>
  <artifactId>pom-inheritance-sample</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>

  <build>
    <plugins>
      <plugin>
        <groupId>jp.in-vitro.largo</groupId>
        <artifactId>largo-support-pom</artifactId>
        <version>2.0.0</version>
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <goal>dumpPom</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <configuration>
          <charset>Shift_JIS</charset>
        </configuration>
      </plugin>
    </plugins>
  </reporting>

  <organization>
    <name>example.com</name>
    <url>http://www.example.com/</url>
  </organization>

  <developers>
    <developer>
      <id>me</id>
      <name>me</name>
    </developer>
  </developers>

  <repositories>
    <repository>
      <id>repository.example.com</id>
      <name>example.com repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>

</project>

\inheritance\child\pom.xml

今回は inheritance のみ使用することが目的なので、aggregation を表す modules タグは使用していない。 ただ、parent タグで親の POM を指定しているため、記述量が圧倒的に減少していることがすぐに分かる。 ちなみに、POM の内容は簡単な自作の Maven Plugin で出力している。

<?xml version="1.0" encoding="UTF-8" ?>

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>com.example</groupId>
    <artifactId>pom-inheritance-sample</artifactId>
    <version>1.0.0</version>
  </parent>

  <artifactId>pom-inheritance-sample-child</artifactId>
  <name>pom inheritance sample - child</name>
  <packaging>jar</packaging>

</project>

\inheritance で Maven2 による compile を実行した結果

aggregation を使用していないので、\inheritance\pom.xml が表しているプロジェクトのみがコンパイルされている。 \inheritance\child\pom.xml は全く無視されていることに注目。

inheritance>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom inheritance sample
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\inheritance\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-inheritance-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-inheritance-sample
  version : 1.0.0
  name : pom inheritance sample
***********************************************************
Parent : null
File : D:\inheritance\pom.xml
Basedir : D:\inheritance
Repositories : [org.apache.maven.model.Repository@33459432[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@13948523[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@149105b
],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
maven.plugins:maven-resources-plugin],Plugin [org.apache.maven.plugins:maven-com
piler-plugin],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@196f4b5,]
Developers : [org.apache.maven.model.Developer@17427094[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@14069849[name=example.com,url
=http://www.example.com/]

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 16:40:33 JST 2007
[INFO] Final Memory: 4M/9M
[INFO] ------------------------------------------------------------------------

inheritance>

\inheritance\child で Maven2 による compile を実行した結果

\inheritance\child\pom.xml を使用してコンパイルを実行してみる。 こちらもこちらで自分自身のプロジェクトのみを処理対象としている。 但し、POM の内容は \inheritance\pom.xml の内容を継承しているため、 \interitance\child\pom.xml では設定をしていない項目もきちんと設定が受け継がれていることが分かる。 例えば、Developer や Organization といった項目を見ると良く分かる。

inheritance>cd child
inheritance\child>mvn compile
[INFO] Scanning for projects...
[INFO] -------------------------------------------------------------------------
---
[INFO] Building pom inheritance sample - child
[INFO]    task-segment: [compile]
[INFO] -------------------------------------------------------------------------
---
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Compiling 1 source file to D:\inheritance\child\target\classes
[INFO] [largo-support-pom:dumpPom {execution: default}]
***** POM INFORMATION *************************************
  id : com.example:pom-inheritance-sample-child:jar:1.0.0
  groupId : com.example
  atrifactId : pom-inheritance-sample-child
  version : 1.0.0
  name : pom inheritance sample - child
***********************************************************
Parent : org.apache.maven.project.MavenProject@a6be9458
File : D:\inheritance\child\pom.xml
Basedir : D:\inheritance\child
Repositories : [org.apache.maven.model.Repository@13948523[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@21565531[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1d0d45b
],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],Plugin [org.apache.
ReportPlugins : [org.apache.maven.model.ReportPlugin@19ba640,]
Developers : [org.apache.maven.model.Developer@539419[name=me,email=null,id=me,o
rganization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@13878877[name=example.com,url
=http://www.example.com/]

***** POM INFORMATION *************************************
  id : com.example:pom-inheritance-sample:pom:1.0.0
  groupId : com.example
  atrifactId : pom-inheritance-sample
  version : 1.0.0
  name : pom inheritance sample
***********************************************************
Parent : null
File : D:\inheritance\pom.xml
Basedir : D:\inheritance
Repositories : [org.apache.maven.model.Repository@26117441[name=example.com repo
sitory,url=http://www.example.com/maven2,id=repository.example.com,layout=defaul
t,releases=null,snapshots=null],org.apache.maven.model.Repository@30311876[name=
Maven Repository Switchboard,url=http://repo1.maven.org/maven2,id=central,layout
=default,releases=null,snapshots=org.apache.maven.model.RepositoryPolicy@1b03c1a
],]
BuildPlugins : [Plugin [jp.in-vitro.largo:largo-support-pom],]
ReportPlugins : [org.apache.maven.model.ReportPlugin@1578aab,]
Developers : [org.apache.maven.model.Developer@19658898[name=me,email=null,id=me
,organization=null,organizationUrl=null,roles=[]],]
Organization : org.apache.maven.model.Organization@13594894[name=example.com,url
=http://www.example.com/]

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sun May 13 17:28:32 JST 2007
[INFO] Final Memory: 4M/8M
[INFO] ------------------------------------------------------------------------

inheritance\child>

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 09, 2007

[Maven] Maven2 で AbstractMethodError

まれに Maven2 実行時に AbstractMethodError が発生することがある。

[INFO] Velocimacro : initialization complete.
[INFO] Velocity successfully started.
[INFO] [site:site]
[INFO] ------------------------------------------------------------------------
[ERROR] FATAL ERROR
[INFO] ------------------------------------------------------------------------
[INFO] null
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.AbstractMethodError
        at org.apache.maven.plugins.site.SiteMojo.filterReports(SiteMojo.java:40
7)
        at org.apache.maven.plugins.site.SiteMojo.execute(SiteMojo.java:221)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPlugi
nManager.java:443)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(Defa
ultLifecycleExecutor.java:539)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLi
fecycle(DefaultLifecycleExecutor.java:480)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(Defau
ltLifecycleExecutor.java:459)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHan
dleFailures(DefaultLifecycleExecutor.java:311)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegmen
ts(DefaultLifecycleExecutor.java:278)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLi
fecycleExecutor.java:143)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:334)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:125)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:272)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:585)
        at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
        at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
        at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)

        at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 minute 31 seconds
[INFO] Finished at: Thu May 10 09:11:00 JST 2007
[INFO] Final Memory: 15M/27M
[INFO] ------------------------------------------------------------------------
例えば、mvn site 実行時に上記の様に発生する。 この場合、%USER_HOME%\.m2\repository\org を全部削除すれば良い。 Maven2 のバージョンアップを繰り返しているうちに plugin 関連の依存関係が実行時におかしくなることがあるようだ。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 08, 2007

[Maven] プライベートなリモートリポジトリの設定変更

Maven2 用のプライベートなリモートリポジトリを整理してみた。 今までは URL を一切公開していないので、特にアクセス制限はかけていなかったのだが、 とりあえず HTTPS + Basic 認証 くらいはかけておこうかと設定を変更してみた。

Maven2 リモートリポジトリの Basic 認証

これは非常に簡単。 サーバ側で Basic 認証の設定をしておいて、pom.xml、settings.xml を編集するだけ。

pom.xml

<project>
  ...SNIP...
  <repositories>
    <repository>
      <id>my-private-repository</id>
      <name>my private repository</name>
      <url>http://www.example.com/maven2</url>
    </repository>
  </repositories>
  ...SNIP...
</project>

settings.xml

<settings>
  ...SNIP...
  <servers>
    <server>
      <id>my-private-repository</id>
      <username>me</username>
      <password>mypassword</password>
    </server>
  </servers>
  ...SNIP...
</settings>

Maven2 リモートリポジトリの HTTPS アクセス

これは結局実現できなかった。 プライベートサーバなのでディジタル証明書を正規に購入するわけもなく、 オレオレ証明書で運用しているのだが、結局はそれがネックになってしまった。 JDK の cacerts にオレオレ証明書を登録してみたり、独自の keystore にオレオレ証明書を登録して MAVEN_OPTS に "-Djavax.net.ssl.trustStore=keystore -Djavax.net.ssl.trustStorePassword=password" を指定したりと色々試してみたのだが、結局動作しなかった。

自前のコードで HTTPS 接続を試してみたところ、証明書に問題がある可能性も出てきてこれ以上の調査は結構時間がかかりそうだったので断念。 いつの日か HTTPS + Basic 認証で Maven2 リモートリポジトリにアクセスしたいものだ。 ・・・ディジタル証明書を買う、というのが一番手っ取り早い解決方法なのだが。

Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

May 01, 2007

[Linux] Debian Etch + Apache2.2 で ActiveDirectory 認証にチャレンジ

Debian Etch で Apache2.2 から Windows 2003 Server の ActiveDirectory を使用してユーザ認証設定をした。 上手く行くまでに結構苦労したので、メモ。

今回は Subversion の認証を ActiveDirectory で行うことにした。 /etc/apache2/mods-available/dav_svn.conf を色々編集していたのだが、中々上手く行かなかった。 結局下記の様に設定することで正常にユーザ認証できるようになった。

<Location /svn>

    ...SNIP...

    AuthType Basic
    AuthName "Subversion Repositoryr"
    AuthBasicProvider ldap
    AuthLDAPUrl "ldap://pdc.example.com:389/OU=employees,dc=example,dc=com?sAMAccountName?sub?(objectClass=*)"
    AuthLDAPBindDN ldap@example.com
    AuthLDAPBindPassword ldap-user-password
    Require ldap-attribute objectClass=person

</Location>
  

AuthLDAPUrl、AuthLDAPBindDN、AuthLDAPBindPassword は色々なサイトに記述されている通りで問題は無かったのだが(強いて言えば、私の試した環境では AuthLDAPUrl に OU を指定しないと動作しなかった)、 Require ディレクティブの設定でかなり時間をかけてしまった。

Require ディレクティブに

    Require valid-user
    Require ldap-user
と記述すると、ActiveDirectory の認証は上手く行くのだが Apache が認証エラーを返してしまう。 その場合、Apache の error.log には何も表示されず原因が分かりづらい。 結局、mod_authnz_ldap のマニュアルに記述されていた Require ディレクティブの解説通りの設定をしたら正常に認証されるようになった。
Apache Module mod_authnz_ldap
http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
require ldap-attribute
http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html#reqattribute

Posted in Linux | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 27, 2007

[Linux] 巨大なデータの tar アーカイビングに苦戦

大量のデータを tar でアーカイビングしようとして苦戦。 最初は特に意識せず普通に

tar cvf /home/foo.tar ./foo
とやったのだが、
tar: Cannot write to /home/foo.tar: File too large
tar: Error is not recoverable: exiting now
と怒られてしまった。 それなら、と
tar --use=bzip2 -cvf /home/foo.tar.bz2 ./foo
と bzip2 圧縮をかけたのだが、
bzip2: I/O or other error, bailing out.  Possible reason follows.
bzip2: File too large
        Input file = (stdin), output file = (stdout)
Broken pipe
と、またツレナイ結果に。 結局仕方が無いので
#!/bin/sh

src=./foo
dest=/home/
prefix=foo.
suffix=.tar.bz2

cd $src
for i in * ; do
  if [ -d $i ] ; then 
    echo "archiving $i... -> $dest/$prefix$i$suffix"
    tar --use=bzip2 -cvf $dest/$prefix$i$suffix $i > /dev/null
  fi
done
とディレクトリ個別にアーカイビングするハメに。 もっと良い方法がある気がするのだが。 どうすれば良いのだろう??

Posted in Linux | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 26, 2007

[Maven] Maven2 で JUnit4 を使用する。

ようやく Maven2 で JUnit4 のテストが出来るようになった。 ただ、2007/04/26 時点で最新の Maven2.0.6 でもデフォルトでは JUnit4 はサポートされていない。 pom.xml で Surefire のバージョンを最新(?) のものに指定する必要がある。 毎回設定するのも面倒なので、早くデフォルトで JUnit4 がサポートされないものか。

pom.xml の設定方法(最小限)
<?xml version="1.0"?>
<project>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.5</source>
          <target>1.5</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.3</version>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>
Posted in Maven | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Apr 19, 2007

[Linux] Debian Etch で Apache2.2 + SSL

Debian Etch がリリースされたので、Sarge からアップグレードしてみた。 apt の dist-upgrade は少々不安だったので(^^;、クリーンインストールで。 特に何事もなく進んで喜んでいたのだが、Apache2.2 + SSL の設定で思わぬ苦戦をした。 ということで、最終的に上手くいった方法をメモ。

openssl のインストール

example:/# apt-get install openssl
Reading package lists... Done
Building dependency tree... Done
Suggested packages:
  ca-certificates
The following NEW packages will be installed:
  openssl
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1004kB of archives.
After unpacking 2351kB of additional disk space will be used.
Get:1 http://ftp.jp.debian.org etch/main openssl 0.9.8c-4 [1004kB]
Fetched 1004kB in 8s (122kB/s)
Selecting previously deselected package openssl.
(Reading database ... 18787 files and directories currently installed.)
Unpacking openssl (from .../openssl_0.9.8c-4_i386.deb) ...
Creating directory /etc/ssl
Setting up openssl (0.9.8c-4) ...

example:/#

openssl の設定

よしだメモ さんの [linux]Debian etchでSSL に書いてあった通りに /etc/ssl/openssl.cnf を編集。

[usr_cert]セクションのnsCertType=serverのコメントアウトを外す
[v3_ca]セクションのnsCertType=sslCA,emailCAのコメントアウトを外す

証明書の作成

こちらもよしだメモさんのエントリ通りに作業。

example:/# cd /usr/lib/ssl/misc/
example:/usr/lib/ssl/misc# ./CA.sh -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 1024 bit RSA private key
.............++++++
..................................................................++++++
writing new private key to './demoCA/private/./cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----

    ...SNIP...

Certificate is to be certified until Apr 17 01:07:26 2010 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
example:/usr/lib/ssl/misc# openssl rsa -in ./demoCA/private/cakey.pem -out ./demoCA/private/cakey.pem
Enter pass phrase for ./demoCA/private/cakey.pem:
writing RSA key
example:/usr/lib/ssl/misc# openssl x509 -in ./demoCA/cacert.pem -out ./demoCA/cacert.crt
example:/usr/lib/ssl/misc# openssl x509 -inform pem -in ./demoCA/cacert.pem -outform der -out ./demoCA/ca.der

証明書を Apache に登録

example:/usr/lib/ssl/misc/demoCA# mkdir /etc/apache2/ssl
example:/usr/lib/ssl/misc/demoCA# cp ./cacert.crt /etc/apache2/ssl
example:/usr/lib/ssl/misc/demoCA# cd private/
example:/usr/lib/ssl/misc/demoCA/private# mkdir /etc/apache2/ssl/private
example:/usr/lib/ssl/misc/demoCA/private# cp ./cakey.pem /etc/apache2/ssl/private/
example:/usr/lib/ssl/misc/demoCA/private# cd /etc/apache2/sites-available
example:/etc/apache2/sites-available# cp /usr/share/doc/apache2.2-common/examples/apache2/extra/httpd-ssl.conf.gz ./
example:/etc/apache2/sites-available# gzip -d ./httpd-ssl.conf.gz
example:/etc/apache2/sites-available# ln -s /etc/apache2/sites-available/httpd-ssl.conf /etc/apache2/sites-enabled/httpd-ssl.conf
example:/etc/apache2/sites-available# vi ./httpd-ssl.conf
で、/etc/apache2/ssl/cacert.crt と /etc/apache2/ssl/private/cakey.pem を httpd-ssl.conf に登録。 ついでに、ServerName やら何やらも設定しておく。

Apache で ssl モジュール有効化
example:/etc/apache2/sites-available# a2enmod ssl
Module ssl installed; run /etc/init.d/apache2 force-reload to enable.

Apache 再起動
example:/etc/apache2/sites-available# apache2ctl -t
Syntax OK
example:/etc/apache2/sites-available# /etc/init.d/apache2 restart
Forcing reload of web server (apache2)...httpd (no pid file) not running
.

ローカルからの接続確認

example:~# openssl s_client -connect localhost:https
CONNECTED(00000003)

    ...SNIP...

---
GET / HTTP/1.0  ← これを入力して \n\n

HTTP/1.1 200 OK
Date: Thu, 19 Apr 2007 14:45:57 GMT
Server: Apache/2.2.3 (Debian) DAV/2 SVN/1.4.2 mod_ssl/2.2.3 OpenSSL/0.9.8c
Last-Modified: Fri, 11 Nov 2005 08:09:59 GMT
ETag: "1508105-65-a5c6e3c0"
Accept-Ranges: bytes
Content-Length: 101
Connection: close
Content-Type: text/html; charset=UTF-8

<html>
<head>
  <meta http-equiv="refresh" content="0; URL=./blog/">
</head>
<body>
</body>
</html>

closed
example:~#

リモートから Web ブラウザで確認

後はリモートから Web ブラウザで https の接続を確認して完了。 たったこれだけで 1 週間以上悩んだ・・・ orz よしだメモ さんに大感謝!!

Posted in Linux | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Mar 29, 2007

[Trac] Trac のバージョンアップメモ

Debian Sarge の Stable で提供されている Trac は未だに 0.8.x のまま。 残念なことに、最新は 0.10.x まで進化していて 0.8.x では動かないプラグインが山の様に存在する。 なかなか素敵なプラグインを発見したのに 0.8.x では動かないことが分かりガッカリ、という経験を繰り返したので Trac をバージョンアップすることに。

Debian Sarge で Trac を 0.10.x にバージョンアップ

当然 Sarge の Stable では提供されていないので、tar ball を自分で取得してインストールする。 Trac のインストール方法に関しては やどりぎ@NET さんの trac + TracBurndownプラグインでスクラム開発のすすめ を参考にさせていただいた。多謝。

Trac 0.10.x の取得 & 解凍

2007/03/29 現在、0.10.3.1 が最新の様なのでそれを取得する。 取得したらついでに解凍しておく。

$ wget http://ftp.edgewall.com/pub/trac/trac-0.10.3.1.tar.gz
--19:53:27--  http://ftp.edgewall.com/pub/trac/trac-0.10.3.1.tar.gz
           => `trac-0.10.3.1.tar.gz'
Resolving ftp.edgewall.com... 83.168.202.212
Connecting to ftp.edgewall.com[83.168.202.212]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 443,713 [application/octet-stream]

100%[====================================>] 443,713      140.37K/s    ETA 00:00

19:53:34 (139.99 KB/s) - `trac-0.10.3.1.tar.gz' saved [443713/443713]

$ tar zxvf ./trac-0.10.3.1.tar.gz 
trac-0.10.3.1/
trac-0.10.3.1/AUTHORS
trac-0.10.3.1/cgi-bin/
trac-0.10.3.1/cgi-bin/trac.cgi

  (snip)

/usr/lib/python2.3/traceback.pyo
/usr/lib/python2.3/trace.pyo
/usr/sbin/traceroute
$

Trac のインストール

とりあえず Trac のインストーラを実行してみる。

$ cd trac-0.10.3.1
# python ./setup.py install --force
running install
error: invalid Python installation: unable to open /usr/lib/python2.3/config/Makefile (No such file or directory)
#

というわけで、どうやら Python の環境が足りないらしい。 これは python-dev というパッケージをインストールすれば良いらしい。

# apt-get install python-dev

Reading Package Lists... 0%

Reading Package Lists... 0%

  (snip)

The following extra packages will be installed:
  python2.3-dev
The following NEW packages will be installed:
  python-dev python2.3-dev
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 1488kB of archives.
After unpacking 4678kB of additional disk space will be used.
Do you want to continue? [Y/n] Y


0% [Working]
            
Get:1 http://www.jp.debian.org sarge/main python2.3-dev 2.3.5-3sarge2 [1481kB]

            
0% [1 python2.3-dev 2288/1481kB 0%]
                                   
37% [1 python2.3-dev 564816/1481kB 38%]
66% [1 python2.3-dev 990528/1481kB 66%]
                                       
99% [Waiting for headers]
                         
Get:2 http://www.jp.debian.org sarge/main python-dev 2.3.5-2 [6638B]

                         
100% [Working]
              
Fetched 1488kB in 1s (800kB/s)
Selecting previously deselected package python2.3-dev.
(Reading database ... 24304 files and directories currently installed.)
Unpacking python2.3-dev (from .../python2.3-dev_2.3.5-3sarge2_i386.deb) ...
Selecting previously deselected package python-dev.
Unpacking python-dev (from .../python-dev_2.3.5-2_all.deb) ...
Setting up python2.3-dev (2.3.5-3sarge2) ...

Setting up python-dev (2.3.5-2) ...
#

再度 Trac のインストーラを実行。

# python ./setup.py install --force
running install
running build
running build_py
creating build
creating build/lib
creating build/lib/trac
copying trac/__init__.py -> build/lib/trac
copying trac/About.py -> build/lib/trac
copying trac/attachment.py -> build/lib/trac
copying trac/config.py -> build/lib/trac
copying trac/core.py -> build/lib/trac

  (snip)

copying wiki-default/WikiProcessors -> /usr/share/trac/wiki-default
copying wiki-default/WikiRestructuredText -> /usr/share/trac/wiki-default
copying wiki-default/WikiRestructuredTextLinks -> /usr/share/trac/wiki-default
copying wiki-default/WikiStart -> /usr/share/trac/wiki-default
creating /usr/share/trac/wiki-macros
copying wiki-macros/HelloWorld.py -> /usr/share/trac/wiki-macros
copying wiki-macros/Timestamp.py -> /usr/share/trac/wiki-macros
copying wiki-macros/TracGuideToc.py -> /usr/share/trac/wiki-macros

Thank you for choosing Trac 0.10.3.1. Enjoy your stay!
#
今度は正常にインストールされた。

Trac 0.10.x の動作確認

やどりぎ@NET さんの情報でそのままでは動作しないことは分かっていたのだが、 とりあえずアクセスしてみた。情報通り TracError が発生して動作しなかった。 エラーページに記載されていたコマンドをそのまま実行。

# trac-admin /tmp/trac/myprojects upgrade
Please perform a "resync" after this upgrade.
Upgrade done.
#
今度は正常に動作した。 これで Trac 0.8.x → 0.10.x のバージョンアップはとりあえず完了(と思いたい)。

Posted in Trac | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 25, 2007

[dotNet] Windows PowerShell にチャレンジ (6)

サンプルスクリプトの実行

List Basic Computer Information
http://www.microsoft.com/technet/scriptcenter/scripts/msh/hardware/basic/hwbams01.mspx
を試しに実行してみた。 ページに記述されているスクリプトを ListBasicComputerInformation.ps1 というファイルに貼り付けて Windows PowerShell のコンソールから実行してみる。
PS C:\> .\ListBasicComputerInformation.ps1
File C:\ListBasicComputerInformation.ps1 cannot be loaded because the execution
 of scripts is disabled on this system. Please see "get-help about_signing" for
 more details.
At line:1 char:34
+ .\ListBasicComputerInformation.ps1 <<<<
PS C:\>
セキュリティポリシーに引っかかってしまった(^^;
PS C:\> Get-ExecutionPolicy
Restricted
PS C:\> Set-ExecutionPolicy RemoteSigned
PS C:\>
でセキュリティポリシーをローカルのスクリプトファイルは署名無しで実行出来るように変更。
PS C:\> .\ListBasicComputerInformation.ps1
Administrator Password Status:  3
Automatic Reset Boot Option:  True
Automatic Reset Capability:  True
Boot Option On Limit:
Boot Option On WatchDog:
Boot ROM Supported:  True
Bootup State:  Normal boot
     (略)
WakeUp Type:  7
Workgroup:

PS C:\>
ということで、PC の基本情報を取得することが出来た。

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 23, 2007

[dotNet] Windows PowerShell にチャレンジ (5)

一通り基本的なところを眺め終わったので、スクリプトのサンプルを見てみることに。 Microsoft のサイトに Windows PowerShell のサンプルスクリプト用リポジトリが用意されている。 結構充実していて勉強にはもってこいな感じ。

Scripting with Windows PowerShell
http://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx
The Script Center Script Repository: Sample Windows PowerShell Scripts
http://www.microsoft.com/technet/scriptcenter/scripts/msh/default.mspx

提供されているサンプルスクリプト

  • Active Directory - Sample scripts for managing Active Directory and Active Directory objects.
    • Domains - Sample scripts for managing Active Directory domains.
      • List Domain Information
  • Applications - Sample scripts for managing software and applications on servers and client computers.
    • Client Applications - Sample scripts for managing software on user computers, including scripts for installing, updating, and deleting software installed using Windows Installer.
      • List Information About the Binary Files Used by an Application
      • List Installed Software
      • List Installed Software Features
      • List the Codec Files on a Computer
  • Desktop Management - Sample scripts for managing such things as desktop settings, computer startup and shutdown, and System Restore.
    • Logon Sessions - Sample scripts for retrieving information about computer logon sessions, including identifying the user logged on to a remote computer.
      • List Logon Session Information
    • Startup and Shutdown - Sample scripts for managing Windows startup settings and for shutting down computers.
      • List Computer Startup Commands
      • List Recovery Configuration Options
      • List the Boot Configuration Properties of a Computer
    • Windows Activation - Sample scripts for managing Windows Activation, including scripts for activating Windows both online and offline.
      • List Windows Product Activation Status
    • Windows and Windows Explorer Settings - Sample scripts for configuring Windows and Windows Explorer settings.
      • List Desktop Settings
      • List Environment Variables on a Computer
      • List Shortcuts on a Computer
      • List Start Menu Groups
      • List Start Menu Items
      • List Start Menu Program Groups
  • Hardware - Sample scripts for managing and monitoring computer hardware.
    • Basic Hardware and Firmware - Sample scripts for retrieving information about the hardware and firmware installed on a computer.
      • List Basic Computer Information
      • List Computer Baseboard Properties
      • List Computer Bus Properties
      • List Computer Chassis Information
      • List Computer Fan Information
      • List Infrared Device Information
      • List IRQ Settings
      • List Motherboard Device Information
      • List Onboard Devices
      • List Processor Information
    • Batteries and Power Supplies - Sample scripts for retrieving information about batteries and power supplies installed in a computer.
      • List Battery Information
      • List Portable Battery Information
      • List UPS Information
    • Memory - Sample scripts for retrieving information about the physical memory installed in a computer.
      • List Cache Memory Information
      • List Device Memory Addresses
      • List DMA Channel Information
      • List Memory Array Information
      • List Memory Devices
      • List Physical Memory Properties
      • List Physical Memory Array Properties
    • Peripherals and Devices - Sample scripts for retrieving information about peripherals and other devices installed on a computer.
      • List Keyboard Properties
      • List Modem Information
      • List Plug and Play Devices
      • List Plug and Play Signed Drivers
      • List Pointing Device Properties
      • List Sound Card Properties
    • Ports and Slots - Sample scripts for retrieving information about ports and system slots installed in a computer.
      • List 1394 Controller Settings
      • List Parallel Port Properties
      • List PCMCIA Controller Information
      • List Port Connector Properties
      • List Port Resource Information
      • List Serial Port Configuration Properties
      • List Serial Port Properties
      • List System Slot Properties
    • Video and Display - Sample scripts for retrieving information about video controllers, display cards, and monitors installed on a computer.
      • List Current Display Configuration Values
      • List Desktop Monitor Properties
      • List Display Controller Configuration Settings
      • List Video Controller Properties
  • Logs - Sample scripts for managing event logs and plain-text log files.
    • Event Logs - Sample scripts for managing event logs (for example, backing up and clearing event logs), and for retrieving events from event logs.
      • List Event Log Properties
      • List Events from the Event Logs
  • Networking - Sample scripts for managing and monitoring network configurations and network applications.
    • Client-Side Management - Sample scripts for configuring TCP/IP settings (IP address, DNS Server, WINS Server, etc.) on client computers.
      • Retrieving Network Configuration Information - Sample scripts for retrieving information about TCP/IP settings on client computers.
        • List IP4 Route Table Information
        • List Network Adapter Configuration Properties
        • List Network Adapter Properties
        • List Network Client Information
        • List Network Login Profiles
        • List Proxy Server Information
        • List the Network Protocols on a Computer
  • Operating System - Sample scripts for managing and monitoring the Windows operating system.
    • COM and DCOM - Sample scripts for retrieving information about COM and DCOM settings and classes found on a computer.
      • List Classic COM Class Settings
      • List Classic COM Classes
      • List Component Categories
      • List DCOM Application Settings
      • List DCOM Applications
      • List ProgIDs
    • Dates and Times - Sample scripts for retrieving date and time information (including local time and time zone information) from computers.
      • List the Local Time on a Computer
      • List Time Zone Information for a Computer
    • Page Files - Sample scripts for retrieving information from and configuring page files.
      • List Page File Properties
      • List Page File Settings
      • List Page File Use
    • Processes - Sample scripts for managing and monitoring the processes running on a computer.
      • Processes and Threads - Sample scripts for managing processes and threads, including scripts for creating new processes and terminating existing processes.
        • List Information about the Threads Active on a Computer
        • List the Processes Running on a Computer
    • Registry - Sample scripts from retrieving information from and writing information to the Windows registry.
      • List Registry Properties
    • Services - Sample scripts for managing Windows services and for listing and/or modifying the properties of those services.
      • List Service Load Order Groups
      • List Service Properties
    • Task Scheduling - Sample scripts for creating, modifying, and deleting scheduled jobs on a computer.
      • List Scheduled Tasks
    • Version Information - Sample scripts for retrieving information about the version of Windows installed on a computer.
      • List Operating System Properties
  • Other Directory Services - Sample scripts for managing directory services other than Active Directory.
    • Local Accounts and Windows NT 4.0 Accounts - Sample scripts for managing user and group accounts on local computers and in Windows NT 4.0 domains.
      • Groups - Sample scripts for managing security groups on local computers and/or in Windows NT 4.0 domains.
        • List Group Information
      • User Accounts - Sample scripts for managing user accounts on local computers and/or in Windows NT 4.0 domains.
        • List User Account Information
  • Printing - Sample scripts for managing printers, print jobs, print servers, and other parts of the Windows printing infrastructure.
    • Print Servers, Print Queues, and Print Jobs - Sample scripts for managing print servers, print queues, and individual print jobs.
      • List Print Job Information
      • List Printer Capabilities
      • List Printer Information
    • Printer Ports and Printer Drivers - Sample scripts for retrieving information about and for configuring printer ports and printer drivers on a computer.
      • List Printer Drivers
      • List Printer Port Properties
  • Scripting Techniques - Sample scripts demonstrating a wide variety of scripting tips, tricks, and techniques useful to script writers.
    • Dates and Times - Sample scripts for manipulating dates and times, particularly the UTC times used by WMI.
      • List the UTC Time on a Computer
    • WMI - Sample scripts for retrieving information about objects that can be used in WMI scripts.
      • List WMI Setting Information
  • Service Packs and Hot Fixes - Sample scripts for retrieving information about service packs and hot fixes installed on a computer.
    • List Installed Hot Fixes
  • Storage - Sample scripts for managing files, folders, file systems, and storage devices.
    • Disk Drives and Volumes
    • Disk Quotas
    • Folders
    • Shared Folders
  • Terminal Server - Sample scripts for managing Windows Terminal Server.
    • Retrieving Terminal Server Properties - Sample scripts for retrieving information about Terminal Server configuration settings.
      • List Terminal Service Service Properties
      • List Terminal Services Accounts
      • List Terminal Services Client Settings
      • List Terminal Services Environment Settings
      • List Terminal Services General Settings
      • List Terminal Services Logon Settings
      • List Terminal Services Network Adapter List Settings
      • List Terminal Services Network Adapter Settings
      • List Terminal Services Permission Settings
      • List Terminal Services Remote Control Settings
      • List Terminal Services Session Directory Settings
      • List Terminal Services Session Settings
      • List Terminal Services Terminal Settings
      • List Terminal Services Terminals

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 22, 2007

[dotNet] Windows PowerShell にチャレンジ (4)

Windows PowerShell のリファレンス

Windows PowerShell の演算子や変数の取り扱い、制御文などの詳細を知りたい場合はドキュメントパックをダウンロードする。 下のリンク先のページにある "Files in This Download" の "WindowsPowerShell_Localized_DocumentationPack.zip" をダウンロードすると日本語のドキュメントを入手できる。

Windows PowerShell 1.0 Documentation Pack
http://www.microsoft.com/downloads/details.aspx?FamilyId=B4720B00-9A66-430F-BD56-EC48BFCA154F

リファレンスの内容

ドキュメントパックでは以下のファイルが提供されている。

  • gettingStarted.rtf ・・・ Windows PowerShell ファースト ステップ ガイド
  • quadfold.rtf ・・・ Windows PowerShell ランゲージ クイック リファレンス
  • releaseNotes.rtf ・・・ Windows PowerShell V1.0 (.NET Framework 2.0 RTM 用) Release Notes
  • userGuide.rtf ・・・ Windows PowerShell 入門
とりあえず、演算子や制御文などはクイックリファレンスを見ると手っ取り早い。 もう少し細かくオブジェクトのことを知りたい場合は入門を参照。

とりあえず foreach が使えることが分かったので、Get-Command で試してみた。
PS C:\> foreach($command in Get-Command){if($command.Name.contains("Get-")){$co
mmand}}

CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Get-Acl                         Get-Acl [[-Path] <String[]>]...
Cmdlet          Get-Alias                       Get-Alias [[-Name] <String[]...
Cmdlet          Get-AuthenticodeSignature       Get-AuthenticodeSignature [-...
Cmdlet          Get-ChildItem                   Get-ChildItem [[-Path] <Stri...
Cmdlet          Get-Command                     Get-Command [[-ArgumentList]...
Cmdlet          Get-Content                     Get-Content [-Path] <String[...
Cmdlet          Get-Credential                  Get-Credential [-Credential]...
Cmdlet          Get-Culture                     Get-Culture [-Verbose] [-Deb...
Cmdlet          Get-Date                        Get-Date [[-Date] <DateTime>...
Cmdlet          Get-EventLog                    Get-EventLog [-LogName] <Str...
Cmdlet          Get-ExecutionPolicy             Get-ExecutionPolicy [-Verbos...
Cmdlet          Get-Help                        Get-Help [[-Name] <String>] ...
Cmdlet          Get-History                     Get-History [[-Id] <Int64[]>...
Cmdlet          Get-Host                        Get-Host [-Verbose] [-Debug]...
Cmdlet          Get-Item                        Get-Item [-Path] <String[]> ...
Cmdlet          Get-ItemProperty                Get-ItemProperty [-Path] <St...
Cmdlet          Get-Location                    Get-Location [-PSProvider <S...
Cmdlet          Get-Member                      Get-Member [[-Name] <String[...
Cmdlet          Get-PfxCertificate              Get-PfxCertificate [-FilePat...
Cmdlet          Get-Process                     Get-Process [[-Name] <String...
Cmdlet          Get-PSDrive                     Get-PSDrive [[-Name] <String...
Cmdlet          Get-PSProvider                  Get-PSProvider [[-PSProvider...
Cmdlet          Get-PSSnapin                    Get-PSSnapin [[-Name] <Strin...
Cmdlet          Get-Service                     Get-Service [[-Name] <String...
Cmdlet          Get-TraceSource                 Get-TraceSource [[-Name] <St...
Cmdlet          Get-UICulture                   Get-UICulture [-Verbose] [-D...
Cmdlet          Get-Unique                      Get-Unique [-InputObject <PS...
Cmdlet          Get-Variable                    Get-Variable [[-Name] <Strin...
Cmdlet          Get-WmiObject                   Get-WmiObject [-Class] <Stri...


PS C:\>

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 21, 2007

[dotNet] Windows PowerShell にチャレンジ (3)

Windows PowerShell のヘルプ機能

コマンドの使用方法が良く分からないものも多数あるので、ヘルプを表示してみる。

PS C:\> Help Get-Date

NAME
    Get-Date

SYNOPSIS
    Gets the current date and time.


SYNTAX
    Get-Date [[-date] <DateTime>] [-displayHint {<Date> | <Time> | <DateTime>}]
     [-format <string>] [-year <int>] [-month <int>] [-day <int>] [-hour <int>]
     [-minute <int>] [-second <int>] [<CommonParameters>]

    Get-Date [[-date] <DateTime>] [-displayHint {<Date> | <Time> | <DateTime>}]
     [-uFormat <string>] [-year <int>] [-month <int>] [-day <int>] [-hour <int>
    ] [-minute <int>] [-second <int>] [<CommonParameters>]


DETAILED DESCRIPTION
    Gets the current date and time.


RELATED LINKS
    Set-Date
    New-TimeSpan

REMARKS
    For more information, type: "get-help Get-Date -detailed".
    For technical information, type: "get-help Get-Date -full".

PS C:\>
ということで、Get-Date の使用方法が分かったので、ちょっと使ってみる。
PS C:\> Get-Date -format yyyy
2007
PS C:\> Get-Date -format yyyyMMdd
20070129
PS C:\> Get-Date -format yyyyMMddHHmmss
20070129013010
PS C:\>
ちなみに、UNIX 風に問い合わせてみると、
PS C:\> man date

Name                       Category                   Synopsis
----                       --------                   --------
Get-Date                   Cmdlet                     Gets the current date ...
Set-Date                   Cmdlet                     Changes the system tim...
となった。やはり "Get-Help Get-Date" で問い合わせてくれ、ということなのだろう。

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 18, 2007

[dotNet] Windows PowerShell にチャレンジ (2)

Windows PowerShell のコマンド一覧

Get-Command でコマンド一覧を表示できる。 .Net を使ったことがないので馴染みの無いコマンドばかり。 機能を類推し易い命名になっているので有り難い。

PS C:\> Get-Command | sort

CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
Cmdlet          Add-Member                      Add-Member [-MemberType] <PS...
Cmdlet          Add-PSSnapin                    Add-PSSnapin [-Name] <String...
Cmdlet          Clear-Content                   Clear-Content [-Path] <Strin...
Cmdlet          Clear-Item                      Clear-Item [-Path] <String[]...
Cmdlet          Clear-ItemProperty              Clear-ItemProperty [-Path] <...
Cmdlet          Clear-Variable                  Clear-Variable [-Name] <Stri...
Cmdlet          Compare-Object                  Compare-Object [-ReferenceOb...
Cmdlet          ConvertFrom-SecureString        ConvertFrom-SecureString [-S...
Cmdlet          Convert-Path                    Convert-Path [-Path] <String...
Cmdlet          ConvertTo-Html                  ConvertTo-Html [[-Property] ...
Cmdlet          ConvertTo-SecureString          ConvertTo-SecureString [-Str...
Cmdlet          Copy-Item                       Copy-Item [-Path] <String[]>...
Cmdlet          Copy-ItemProperty               Copy-ItemProperty [-Path] <S...
Cmdlet          Export-Alias                    Export-Alias [-Path] <String...
Cmdlet          Export-Clixml                   Export-Clixml [-Path] <Strin...
Cmdlet          Export-Console                  Export-Console [[-Path] <Str...
Cmdlet          Export-Csv                      Export-Csv [-Path] <String> ...
Cmdlet          ForEach-Object                  ForEach-Object [-Process] <S...
Cmdlet          Format-Custom                   Format-Custom [[-Property] <...
Cmdlet          Format-List                     Format-List [[-Property] <Ob...
Cmdlet          Format-Table                    Format-Table [[-Property] <O...
Cmdlet          Format-Wide                     Format-Wide [[-Property] <Ob...
Cmdlet          Get-Acl                         Get-Acl [[-Path] <String[]>]...
Cmdlet          Get-Alias                       Get-Alias [[-Name] <String[]...
Cmdlet          Get-AuthenticodeSignature       Get-AuthenticodeSignature [-...
Cmdlet          Get-ChildItem                   Get-ChildItem [[-Path] <Stri...
Cmdlet          Get-Command                     Get-Command [[-ArgumentList]...
Cmdlet          Get-Content                     Get-Content [-Path] <String[...
Cmdlet          Get-Credential                  Get-Credential [-Credential]...
Cmdlet          Get-Culture                     Get-Culture [-Verbose] [-Deb...
Cmdlet          Get-Date                        Get-Date [[-Date] <DateTime>...
Cmdlet          Get-EventLog                    Get-EventLog [-LogName] <Str...
Cmdlet          Get-ExecutionPolicy             Get-ExecutionPolicy [-Verbos...
Cmdlet          Get-Help                        Get-Help [[-Name] <String>] ...
Cmdlet          Get-History                     Get-History [[-Id] <Int64[]>...
Cmdlet          Get-Host                        Get-Host [-Verbose] [-Debug]...
Cmdlet          Get-Item                        Get-Item [-Path] <String[]> ...
Cmdlet          Get-ItemProperty                Get-ItemProperty [-Path] <St...
Cmdlet          Get-Location                    Get-Location [-PSProvider <S...
Cmdlet          Get-Member                      Get-Member [[-Name] <String[...
Cmdlet          Get-PfxCertificate              Get-PfxCertificate [-FilePat...
Cmdlet          Get-Process                     Get-Process [[-Name] <String...
Cmdlet          Get-PSDrive                     Get-PSDrive [[-Name] <String...
Cmdlet          Get-PSProvider                  Get-PSProvider [[-PSProvider...
Cmdlet          Get-PSSnapin                    Get-PSSnapin [[-Name] <Strin...
Cmdlet          Get-Service                     Get-Service [[-Name] <String...
Cmdlet          Get-TraceSource                 Get-TraceSource [[-Name] <St...
Cmdlet          Get-UICulture                   Get-UICulture [-Verbose] [-D...
Cmdlet          Get-Unique                      Get-Unique [-InputObject <PS...
Cmdlet          Get-Variable                    Get-Variable [[-Name] <Strin...
Cmdlet          Get-WmiObject                   Get-WmiObject [-Class] <Stri...
Cmdlet          Group-Object                    Group-Object [[-Property] <O...
Cmdlet          Import-Alias                    Import-Alias [-Path] <String...
Cmdlet          Import-Clixml                   Import-Clixml [-Path] <Strin...
Cmdlet          Import-Csv                      Import-Csv [-Path] <String[]...
Cmdlet          Invoke-Expression               Invoke-Expression [-Command]...
Cmdlet          Invoke-History                  Invoke-History [[-Id] <Strin...
Cmdlet          Invoke-Item                     Invoke-Item [-Path] <String[...
Cmdlet          Join-Path                       Join-Path [-Path] <String[]>...
Cmdlet          Measure-Command                 Measure-Command [-Expression...
Cmdlet          Measure-Object                  Measure-Object [[-Property] ...
Cmdlet          Move-Item                       Move-Item [-Path] <String[]>...
Cmdlet          Move-ItemProperty               Move-ItemProperty [-Path] <S...
Cmdlet          New-Alias                       New-Alias [-Name] <String> [...
Cmdlet          New-Item                        New-Item [-Path] <String[]> ...
Cmdlet          New-ItemProperty                New-ItemProperty [-Path] <St...
Cmdlet          New-Object                      New-Object [-TypeName] <Stri...
Cmdlet          New-PSDrive                     New-PSDrive [-Name] <String>...
Cmdlet          New-Service                     New-Service [-Name] <String>...
Cmdlet          New-TimeSpan                    New-TimeSpan [[-Start] <Date...
Cmdlet          New-Variable                    New-Variable [-Name] <String...
Cmdlet          Out-Default                     Out-Default [-InputObject <P...
Cmdlet          Out-File                        Out-File [-FilePath] <String...
Cmdlet          Out-Host                        Out-Host [-Paging] [-InputOb...
Cmdlet          Out-Null                        Out-Null [-InputObject <PSOb...
Cmdlet          Out-Printer                     Out-Printer [[-Name] <String...
Cmdlet          Out-String                      Out-String [-Stream] [-Width...
Cmdlet          Pop-Location                    Pop-Location [-PassThru] [-S...
Cmdlet          Push-Location                   Push-Location [[-Path] <Stri...
Cmdlet          Read-Host                       Read-Host [[-Prompt] <Object...
Cmdlet          Remove-Item                     Remove-Item [-Path] <String[...
Cmdlet          Remove-ItemProperty             Remove-ItemProperty [-Path] ...
Cmdlet          Remove-PSDrive                  Remove-PSDrive [-Name] <Stri...
Cmdlet          Remove-PSSnapin                 Remove-PSSnapin [-Name] <Str...
Cmdlet          Remove-Variable                 Remove-Variable [-Name] <Str...
Cmdlet          Rename-Item                     Rename-Item [-Path] <String>...
Cmdlet          Rename-ItemProperty             Rename-ItemProperty [-Path] ...
Cmdlet          Resolve-Path                    Resolve-Path [-Path] <String...
Cmdlet          Restart-Service                 Restart-Service [-Name] <Str...
Cmdlet          Resume-Service                  Resume-Service [-Name] <Stri...
Cmdlet          Select-Object                   Select-Object [[-Property] <...
Cmdlet          Select-String                   Select-String [-Pattern] <St...
Cmdlet          Set-Acl                         Set-Acl [-Path] <String[]> [...
Cmdlet          Set-Alias                       Set-Alias [-Name] <String> [...
Cmdlet          Set-AuthenticodeSignature       Set-AuthenticodeSignature [-...
Cmdlet          Set-Content                     Set-Content [-Path] <String[...
Cmdlet          Set-Date                        Set-Date [-Date] <DateTime> ...
Cmdlet          Set-ExecutionPolicy             Set-ExecutionPolicy [-Execut...
Cmdlet          Set-Item                        Set-Item [-Path] <String[]> ...
Cmdlet          Set-ItemProperty                Set-ItemProperty [-Path] <St...
Cmdlet          Set-Location                    Set-Location [[-Path] <Strin...
Cmdlet          Set-PSDebug                     Set-PSDebug [-Trace <Int32>]...
Cmdlet          Set-Service                     Set-Service [-Name] <String>...
Cmdlet          Set-TraceSource                 Set-TraceSource [-Name] <Str...
Cmdlet          Set-Variable                    Set-Variable [-Name] <String...
Cmdlet          Sort-Object                     Sort-Object [[-Property] <Ob...
Cmdlet          Split-Path                      Split-Path [-Path] <String[]...
Cmdlet          Start-Service                   Start-Service [-Name] <Strin...
Cmdlet          Start-Sleep                     Start-Sleep [-Seconds] <Int3...
Cmdlet          Start-Transcript                Start-Transcript [[-Path] <S...
Cmdlet          Stop-Process                    Stop-Process [-Id] <Int32[]>...
Cmdlet          Stop-Service                    Stop-Service [-Name] <String...
Cmdlet          Stop-Transcript                 Stop-Transcript [-Verbose] [...
Cmdlet          Suspend-Service                 Suspend-Service [-Name] <Str...
Cmdlet          Tee-Object                      Tee-Object [-FilePath] <Stri...
Cmdlet          Test-Path                       Test-Path [-Path] <String[]>...
Cmdlet          Trace-Command                   Trace-Command [-Name] <Strin...
Cmdlet          Update-FormatData               Update-FormatData [[-AppendP...
Cmdlet          Update-TypeData                 Update-TypeData [[-AppendPat...
Cmdlet          Where-Object                    Where-Object [-FilterScript]...
Cmdlet          Write-Debug                     Write-Debug [-Message] <Stri...
Cmdlet          Write-Error                     Write-Error [-Message] <Stri...
Cmdlet          Write-Host                      Write-Host [[-Object] <Objec...
Cmdlet          Write-Output                    Write-Output [-InputObject] ...
Cmdlet          Write-Progress                  Write-Progress [-Activity] <...
Cmdlet          Write-Verbose                   Write-Verbose [-Message] <St...
Cmdlet          Write-Warning                   Write-Warning [-Message] <St...


PS C:\>

Windows PowerShell のエイリアス一覧

Get-Alias でコマンドに割り当てられたエイリアスを一覧表示できる。 UNIX 系コマンドをかなり意識したエイリアスがデフォルトで用意されているので、UNIX に慣れていればエイリアスが便利そう。

PS C:\> Get-Alias | sort

CommandType     Name                            Definition
-----------     ----                            ----------
Alias           %                               ForEach-Object
Alias           ?                               Where-Object
Alias           ac                              Add-Content
Alias           asnp                            Add-PSSnapin
Alias           cat                             Get-Content
Alias           cd                              Set-Location
Alias           chdir                           Set-Location
Alias           clc                             Clear-Content
Alias           clear                           Clear-Host
Alias           cli                             Clear-Item
Alias           clp                             Clear-ItemProperty
Alias           cls                             Clear-Host
Alias           clv                             Clear-Variable
Alias           copy                            Copy-Item
Alias           cp                              Copy-Item
Alias           cpi                             Copy-Item
Alias           cpp                             Copy-ItemProperty
Alias           cvpa                            Convert-Path
Alias           del                             Remove-Item
Alias           diff                            Compare-Object
Alias           dir                             Get-ChildItem
Alias           echo                            Write-Output
Alias           epal                            Export-Alias
Alias           epcsv                           Export-Csv
Alias           erase                           Remove-Item
Alias           fc                              Format-Custom
Alias           fl                              Format-List
Alias           foreach                         ForEach-Object
Alias           ft                              Format-Table
Alias           fw                              Format-Wide
Alias           gal                             Get-Alias
Alias           gc                              Get-Content
Alias           gci                             Get-ChildItem
Alias           gcm                             Get-Command
Alias           gdr                             Get-PSDrive
Alias           ghy                             Get-History
Alias           gi                              Get-Item
Alias           gl                              Get-Location
Alias           gm                              Get-Member
Alias           gp                              Get-ItemProperty
Alias           gps                             Get-Process
Alias           group                           Group-Object
Alias           gsnp                            Get-PSSnapin
Alias           gsv                             Get-Service
Alias           gu                              Get-Unique
Alias           gv                              Get-Variable
Alias           gwmi                            Get-WmiObject
Alias           h                               Get-History
Alias           history                         Get-History
Alias           iex                             Invoke-Expression
Alias           ihy                             Invoke-History
Alias           ii                              Invoke-Item
Alias           ipal                            Import-Alias
Alias           ipcsv                           Import-Csv
Alias           kill                            Stop-Process
Alias           lp                              Out-Printer
Alias           ls                              Get-ChildItem
Alias           mi                              Move-Item
Alias           mount                           New-PSDrive
Alias           move                            Move-Item
Alias           mp                              Move-ItemProperty
Alias           mv                              Move-Item
Alias           nal                             New-Alias
Alias           ndr                             New-PSDrive
Alias           ni                              New-Item
Alias           nv                              New-Variable
Alias           oh                              Out-Host
Alias           popd                            Pop-Location
Alias           ps                              Get-Process
Alias           pushd                           Push-Location
Alias           pwd                             Get-Location
Alias           r                               Invoke-History
Alias           rd                              Remove-Item
Alias           rdr                             Remove-PSDrive
Alias           ren                             Rename-Item
Alias           ri                              Remove-Item
Alias           rm                              Remove-Item
Alias           rmdir                           Remove-Item
Alias           rni                             Rename-Item
Alias           rnp                             Rename-ItemProperty
Alias           rp                              Remove-ItemProperty
Alias           rsnp                            Remove-PSSnapin
Alias           rv                              Remove-Variable
Alias           rvpa                            Resolve-Path
Alias           sal                             Set-Alias
Alias           sasv                            Start-Service
Alias           sc                              Set-Content
Alias           select                          Select-Object
Alias           set                             Set-Variable
Alias           si                              Set-Item
Alias           sl                              Set-Location
Alias           sleep                           Start-Sleep
Alias           sort                            Sort-Object
Alias           sp                              Set-ItemProperty
Alias           spps                            Stop-Process
Alias           spsv                            Stop-Service
Alias           sv                              Set-Variable
Alias           tee                             Tee-Object
Alias           type                            Get-Content
Alias           where                           Where-Object
Alias           write                           Write-Output


PS C:\>

Windows PowerShell のコマンドを試してみる

試しに Get-Service を実行してサービスの一覧を表示してみた。

PS C:\> Get-Service

Status   Name               DisplayName
------   ----               -----------
Stopped  Alerter            Alerter
Running  ALG                Application Layer Gateway Service
Stopped  AppMgmt            Application Management
Stopped  aspnet_state       ASP.NET State Service
Running  AudioSrv           Windows Audio
    (略)
Running  wscsvc             Security Center
Running  wuauserv           Automatic Updates
Stopped  WZCSVC             Wireless Zero Configuration
Stopped  xmlprov            Network Provisioning Service


PS C:\>
きちんとサービスがリストアップされた(当たり前か)。 サービスの開始や停止も試してみることに。
PS C:\> Start-Service Themes
PS C:\> Get-Service Themes

Status   Name               DisplayName
------   ----               -----------
Running  Themes             Themes


PS C:\> Stop-Service Themes
PS C:\> Get-Service Themes

Status   Name               DisplayName
------   ----               -----------
Stopped  Themes             Themes


PS C:\>
非常に簡単にサービスの開始や停止ができた。 便利。

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 16, 2007

[dotNet] Windows PowerShell にチャレンジ (1)

Windows PowerShell とは

Windows PowerShell は、Windows のコマンドライン機能を強化したものらしい。 要するに、cmd.exe の機能強化版ということだろう。 Windows PowerShell の公式サイトによると、

Microsoft Windows PowerShell command line shell and scripting language helps IT Professionals achieve greater productivity. Using a new admin-focused scripting language, more than 130 standard command line tools, and consistent syntax and utilities, Windows PowerShell allows IT Professionals to more easily control system administration and accelerate automation.
というものだそうだ。 未だにバッチファイルで何とか凌いでいた(何ともならない場合は Linux (^^;) ので、Windows PowerShell を少し勉強してみることに。
Windows PowerShell Web Site
http://www.microsoft.com/windowsserver2003/technologies/management/powershell/default.mspx
Windows PowerShell Blog
http://blogs.msdn.com/powershell/
Knowledge Base Article
http://support.microsoft.com/kb/926139
Windows PowerShell SDK
http://msdn2.microsoft.com/en-us/library/aa830112.aspx
@IT - 次世代Windowsシェル「Windows PowerShell」を試す
http://www.atmarkit.co.jp/fdotnet/special/powershell01/powershell01_01.html

Windows PowerShell のインストール

Windows PowerShell は最近 1.0 がリリースされたばかりの様だが、Windows Vista だけでなく Windows XP 版も用意されている。 素晴らしい。 とりあえず Windows Vista 環境が無いので、Windows XP Professional 環境に Windows PowerShell をインストールしてみた。 インストール手順は以下の通り。

  1. .Net Framework 2.0 をインストール。Microsoft .NET Framework Version 2.0 Redistributable Package (x86)からアーカイブをダウンロードしてインストール。
  2. Windows PowerShell 1.0 をインストール。Windows PowerShell 1.0 English-Language Installation Package for Windows XP (KB926139)からアーカイブをダウンロードする。
    1. Windows PowerShell のダウンロードをするためには Genuine Check をする必要がある。指示に従い GenuineCheck.exe をダウンロードして実行する。
    2. GenuineCheck で表示されるコードをダウンロードサイトに入力すると Windows PowerShell のアーカイブ WindowsXP-KB926139-x86-ENU.exe がダウンロードできる。
    3. WindowsXP-KB926139-x86-ENU.exe を実行し、後はインストーラの指示に従い Windows PowerShell をインストールする。
[インストール画面(1)] [インストール画面(2)] [インストール画面(3)] [インストール画面(4)]

Windows PowerShell の実行

Windows PowerShell のインストーラがスタートメニューにも登録してくれるが、一々面倒なので「ファイル名を指定して実行」から "powershell.exe" を実行しても良い。 一見 cmd.exe と変わらないウィンドウが表示されるが、コマンドプロンプトの前に "PS" が付いているので Windows PowerShell が実行されていることが分かる。
[Windows PowerShell 実行] [Windows PowerShell ウィンドウ]
とりあえず使用できるコマンド一覧を表示してみる。

PS C:\> Get-Command | sort

CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
Cmdlet          Add-Member                      Add-Member [-MemberType] <PS...
Cmdlet          Add-PSSnapin                    Add-PSSnapin [-Name] <String...
Cmdlet          Clear-Content                   Clear-Content [-Path] <Strin...
Cmdlet          Clear-Item                      Clear-Item [-Path] <String[]...
Cmdlet          Clear-ItemProperty              Clear-ItemProperty [-Path] <...
Cmdlet          Clear-Variable                  Clear-Variable [-Name] <Stri...
Cmdlet          Compare-Object                  Compare-Object [-ReferenceOb...
Cmdlet          ConvertFrom-SecureString        ConvertFrom-SecureString [-S...
Cmdlet          Convert-Path                    Convert-Path [-Path] <String...
Cmdlet          ConvertTo-Html                  ConvertTo-Html [[-Property] ...
Cmdlet          ConvertTo-SecureString          ConvertTo-SecureString [-Str...
Cmdlet          Copy-Item                       Copy-Item [-Path] <String[]>...
Cmdlet          Copy-ItemProperty               Copy-ItemProperty [-Path] <S...
Cmdlet          Export-Alias                    Export-Alias [-Path] <String...
         (略)
ということで、.Net Framework が提供してくれる機能をかなり利用できることが分かる。

Posted in dotNet | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 12, 2007

[Misc] 米国総合宅配サービス OPAS

OPAS というサービスを見つけた。 米国内に住所を持てるというサービスらしい。 宅配の転送なども請け負ってくれるそうなので、Amazon.com のマーケットプレイスで米国内のみ配達可能な商品の購入もできそう。 洋書の技術書を古本で大量購入するのに使えるかも。 ただ、コスト的に折り合うかどうか・・・。 何人かで共同利用すれば元は取れるかな??

OPAS
http://www.opasexpress.com/tanomail.htm
FAQ
http://www.opasexpress.com/tanomail_faq.htm
料金
http://www.opasexpress.com/tanomail_rates.htm

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 11, 2007

[Misc] Callisto

Callisto とは

Callisto は Eclipse のサブプロジェクトで、EMF、GEF、WTP、TPTP といったプラグインを同期してリリースすることを目的としているらしい。
Callisto プロジェクトのサイトによると

Callisto is about improving the productivity of the developers working on top of Eclipse frameworks by providing a more transparent and predictable development cycle. By releasing 10 projects at the same time, the goal is to eliminate uncertainty about version compatibility and make it easier to incorporate multiple projects into your environment.

While Callisto is about the simultaneous release of ten projects, it is not a unification of the projects - each project remains a separate open source project operating with its own project leadership, its own committers, and its own project plan.

ということだそうだ。

Callisto が現在対応してくれているのは、

  • Business Intelligence and Reporting Tools (BIRT) Project
  • C/C++ IDE (CDT)
  • Data Tools Platform (DTP)
  • Eclipse Modeling Framework (EMF)
  • Graphical Editing Framework (GEF)
  • Graphical Modeling Framework (GMF)
  • Eclipse Project
  • Eclipse Test and Performance Tools Platform Project (TPTP)
  • Eclipse Web Tools Platform Project (WTP)
  • Visual Editor (VE)
で、Java EE 開発で必要なプラグインはほとんど Callisto から取得できるのが分かる。 EMF、GEF、GMF、WTP、VE を一括で管理してくれるのは嬉しい限り。 とはいえ、プラグインのダウンロードに時間がかかるのは今まで通りなのだろうな・・・。 Callisto のリポジトリをそのまま適当な非公開サーバに構築出来ると非常に便利なのだけれど。

Eclipse Callisto Project
http://www.eclipse.org/callisto/
Callisto Update Site
http://download.eclipse.org/callisto/releases/
Eclipse V3.2 Callisto では何がホットなのか
http://www-06.ibm.com/jp/developerworks/opensource/library/os-ecl-callisto/index.shtml

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 09, 2007

[Misc] Apache Struts Platform Requirements

Apache Struts の動作環境をまとめてみた。 まとまった資料が見つからなかったので。

Servlet JSP J2SE(Java SE)
Apache Struts 2.0.x 2.4 ~ 2.0 ~ 5.0 ~
Apache Struts 1.3.x 2.3 ~ 1.2 ~ 1.4 ~
Apache Struts 1.2.x 2.2 ~ 1.1 ~ 1.3 ~
Apache Struts 1.1.x 2.2 ~ 1.1 ~ 1.3 ~
Apache Struts 1.0.x 2.2 ~ 1.1 ~ 1.2 ~
Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 08, 2007

[Misc] Apache Struts Release Notes

Apache Struts のリリースノートは結構仕事で参照するのだけれど、 場所が分かりづらくていつも右往左往する。というわけで、とりあえずメモ。・・・と言っても、新しいバージョンがリリースされたらまた URL が変わるのだろうな、この感じだと orz

2.0.x

2.0.5
http://struts.apache.org/2.0.5/docs/release-notes-205.html
2.0.4
http://struts.apache.org/2.0.5/docs/release-notes-204.html
2.0.3
http://struts.apache.org/2.0.5/docs/release-notes-203.html
2.0.2
http://struts.apache.org/2.0.5/docs/release-notes-202.html
2.0.1
http://struts.apache.org/2.0.5/docs/release-notes-201.html
2.0.0
http://struts.apache.org/2.0.5/docs/release-notes-200.html

1.3.x

1.3.5
http://struts.apache.org/1.3.5/userGuide/release-notes.html
1.3.3
http://struts.apache.org/1.3.5/userGuide/release-notes-1_3_3.html
1.3.2
http://struts.apache.org/1.3.5/userGuide/release-notes-1_3_2.html
1.3.1
http://struts.apache.org/1.3.5/userGuide/release-notes-1_3_1.html

1.2.x

1.2.9
http://struts.apache.org/1.2.9/userGuide/release-notes.html
1.2.8
http://struts.apache.org/1.2.9/userGuide/release-notes-1.2.8.html
1.2.7
http://struts.apache.org/1.2.9/userGuide/release-notes-1.2.7.html
1.2.4
http://struts.apache.org/1.2.9/userGuide/release-notes-1.2.4.html

1.1.x

1.1
http://struts.apache.org/1.1/userGuide/release-notes-1.1.html
1.1 RC2
http://struts.apache.org/1.1/userGuide/release-notes-1.1-rc2.html
1.1 RC1
http://struts.apache.org/1.1/userGuide/release-notes-1.1-rc1.html
1.1 b2
http://struts.apache.org/1.1/userGuide/release-notes-1.1-b2.html

1.0.x

1.0.2
http://struts.apache.org/1.0.2/release-notes-1.0.2.html
1.0.1
http://struts.apache.org/1.0.2/release-notes-1.0.1.html
1.0
http://struts.apache.org/1.0.2/release-notes-1.0.html
1.0 b3
http://struts.apache.org/1.0.2/release-notes-1.0-b3.html
1.0 b2
http://struts.apache.org/1.0.2/release-notes-1.0-b2.html
1.0 b1
http://struts.apache.org/1.0.2/release-notes-1.0-b1.html
Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 06, 2007

[Misc] J2EE (Java EE) を構成する仕様一覧

J2EE (Java EE) は複数の仕様で構成されているが、Java EE 5 まで来ると仕様が多すぎる && 仕様のバージョンアップが入り乱れているといった理由で非常に憶えづらい。 というわけで、一度整理してみた。

Java EE 5 Technologies
http://java.sun.com/javaee/technologies/
J2EE 1.4 Document
http://java.sun.com/j2ee/1.4/docs/index.html
J2EE 1.3_01 Release Notes
http://java.sun.com/j2ee/sdk_1.3/1.3_01/techdocs/release/ReleaseNotes.html
J2EE 1.2.1 Release Notes
http://java.sun.com/j2ee/sdk_1.2.1/techdocs/release/ReleaseNotes.html

J2EE (Java EE) を構成する仕様一覧

Java EE 5
  • Web Services Technologies
    • Implementing Enterprise Web Services (JSR 109)
    • Java API for XML-Based Web Services (JAX-WS) 2.0 (JSR 224)
    • Java API for XML-Based RPC (JAX-RPC) 1.1 (JSR 101)
    • Java Architecture for XML Binding (JAXB) 2.0 (JSR 222)
    • SOAP with Attachments API for Java (SAAJ) (JSR 67)
    • Streaming API for XML (JSR 173)
    • Web Service Metadata for the Java Platform (JSR 181)
  • Web Application Technologies
    • Java Servlet 2.5 (JSR 154)
    • JavaServer Faces 1.2 (JSR 252)
    • JavaServer Pages 2.1 (JSR 245)
    • JavaServer Pages Standard Tag Library (JSR 52)
  • Enterprise Application Technologies
    • Enterprise JavaBeans 3.0 (JSR 220)
    • J2EE Connector Architecture 1.5 (JSR 112)
    • Common Annotations for the Java Platform (JSR 250)
    • Java Message Service API (JSR 914)
    • Java Persistence API (JSR 220)
    • Java Transaction API (JTA) (JSR 907)
    • JavaBeans Activation Framework (JAF) 1.1 (JSR 925)
    • JavaMail (JSR 919)
  • Management and Security Technologies
    • J2EE Application Deployment (JSR 88)
    • J2EE Management (JSR 77)
    • Java Authorization Contract for Containers (JSR 115)
J2EE 1.4
  • J2EE Connector Specification 1.5
  • J2EE Deployment API Specification 1.1
  • J2EE Management Specification 1.0
  • Enterprise JavaBeans Specification 2.1
  • Enterprise JavaBeans to CORBA Mapping 1.1
  • Java API for XML Processing Specification 1.2
  • Java API for XML Registries Specification 1.0
  • Java API for XML-based RPC Specification 1.1
  • Java Authorization Contract for Containers 1.0
  • Java IDL API
  • Java Naming and Directory Interface Specification 1.2.1
  • Java Message Service Specification 1.1
  • Java Servlet Specification 2.4
  • Java Transaction API Specification 1.0.1B
  • Java Transaction Service Specification 1.0
  • JDBC Specifications, 3.0, 2.1, and Optional Package API (2.0)
  • JavaBeans Activation Framework Specification 1.0.2
  • JavaMail API Specification 1.3
  • JavaServer Pages Specification 2.0
  • RMI over IIOP
  • SOAP with Attachments API for Java Specification 1.2
J2EE 1.3_01
  • HTTP and HTTPS
  • COS naming
  • Enterprise JavaBeansTM (EJB) 2.0
  • JavaTM Servlets 2.3
  • JavaServer PagesTM (JSP) 1.2
  • JavaTM Messaging Service (JMS) 1.0.2
  • J2EETM Connector 1.0
  • JDBCTM Standard Extension 2.0
  • JavaTM Transaction API (JTA) 1.0
  • JavaMailTM 1.2
  • JavaTM API for XML Parsing (JAXP) 1.1
J2EE 1.2.1
  • Enterprise JavaBeansTM API, v. 1.1
  • JavaTM Servlets, v. 2.2
  • JavaServer PagesTM technology, v. 1.1
  • JDBCTM Standard Extension, v. 2.0
  • Java Naming and Directory InterfaceTM API, v. 1.2 (CosNaming SPI)
  • RMI/IIOP
  • JavaTM Transaction API, v. 1.0
  • JavaMailTM API, v. 1.1
  • JavaTM Messaging Service, v. 1.0 (API only, no implementation)
Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |

Feb 01, 2007

[Misc] Google Mini がやってきた

と言っても自宅にではなくて会社に。当然か。 以前プロジェクトで導入したいと思ったことがあったのだけれど、そのときは未だ日本法人で取り扱っていなくて断念。
先日ふと会社のマシンルームに入ってみると、見慣れない筐体が。 しかも、Google と書いてある。
[Google Mini] [Google Mini] [Google Mini]

早速担当の人に声をかけて少し遊ばせてもらった。 まだ国内では導入実績が少ないのか色々問題含みではあるようだが、なかなか面白い。 小規模検索なら、コストパフォーマンスも性能も良いので、一つの選択肢にはなるだろう。
[Google Mini]

後、オマケで Google Mini T シャツが付いてきたのも結構嬉しい。
[Google Mini] [Google Mini]

Google Mini
http://www.google.co.jp/enterprise/mini/

Posted in Misc | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |