Jan 29, 2006

[Misc] Microsoft Physics Illustrator for Tablet PC にチャレンジ

Microsoft Physics Illustrator for Tablet PC とは

Physics Illustrator はタブレット PC 用の物理シミュレータ。 hirax.net さんのところで 手書きの「ピタゴラ・シミュレータ」 として紹介されていたのを見て、楽しそうだったので試してみた。 (結城浩の日記 さんの 手書きの「ピタゴラ・シミュレータ」 経由) ただ、タブレット PC 用と銘打っているだけあって、普通の Windows XP Professional で動かすには一工夫必要。

Microsoft Physics Illustrator for Tablet PC
http://www.microsoft.com/downloads/details.aspx?FamilyID=56347faf-a639-4f3b-9b87-1487fd4b5a53

インストール時のメモ

Physics Illustrator for Tablet PCの動かし方(修正版) で紹介されている方法で問題なく動作した。 手元の環境 (Windows XP Professional) では以下の通りで動作した。

  1. .net framework は既にインストールされている(ver.1.1)ので何もしなかった
  2. Tablet PC Platform Software Development Kit (SDK) v1.5 をインストール。
  3. Microsoft Physics Illustrator for Tablet PC を起動

遊んでみる

期待通りかなり楽しめた。 ただ、トラックパッドではなかなか直線、曲線を描くのが大変。 やはり Tablet PC の方が操作はし易いだろうな、という感じ。
ところで、だれかこういうインターフェースの IDE を作ってくれないかな。

[physics(01)] [physics(02)] [physics(03)] [physics(04)] [physics(05)]

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

Jan 28, 2006

[Misc] xfy にチャレンジ

xfy とは

xfy とは Justsystem が公開している XML オーサリングツール(?)。 XHTML、SVG など様々な規格に対応していて便利。 しかも Java でプラグインも作成可能。

xfy
http://www.xfytec.com/
what's xfy
https://www.xfytec.com/whats/

実際に試してみる

  1. ダウンロードページからバイナリ(ここでは xfy_combo_pack_051114.exe)をダウンロード。(要ユーザ登録)
  2. インストーラの指示に従ってインストール
  3. 起動してサンプルを開いてみる
    [xhtmlのサンプルを開いたところ]

付属のサンプル

xfy には以下のサンプルが付属していた。 サンプルはデフォルトのインストール先を選択した場合、C:\Program Files\Justsystem\xfy Basic Edition 1.0\doc\samples にある。

  • compound
  • mathml
  • shapeml
  • svg
  • tutorial
  • xhtml

xfy アプリケーション

xfy 用のアプリケーション(プラグイン??) がいくつか公開されていたので、その中で CML Viewer XVCD というのを試してみた。 CML Viewer XVCD は、Chemical Markup Language(CML) のビューア。 CMLViewerXVCD_kisi_060117.zip をダウンロードして、index.xml を xfy で開くとサンプルを見ることができる。
[CML Viewer XVCD の画面]

CML Viewer XVCD
https://www.xfytec.com/community/modules/mydownloads/singlefile.php?cid=24&lid=24

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

Jan 27, 2006

[Library] クラスの依存関係チェックツールをメモ

クラスの依存関係をチェックできるツールをメモ。 コードレビューなどで重宝する。 とは言うものの、パッケージ間の依存に関する規約がプロジェクト毎にマチマチだったり、パッケージの数が膨大だったりするので、こういうアリモノのツールだと開発標準との摺り合わせが大変だったりする。 なので、個人的にはニーズに合わせて自作した方が手っ取り早いだろう派。

JDepend
http://www.clarkware.com/software/JDepend.html
Byecycle
http://byecycle.sourceforge.net/

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

Jan 24, 2006

[Book] 実務で役立つ WBS 入門

書籍情報


実務で役立つ WBS 入門

レビュー

WBS はいつの間にか何となく人マネで作成している。 それはそれで別に困ったこともないのだが、今更な感じで読んでみると気付かされることが多々あった。

  1. WBS 入門
  2. 基本概念
  3. ライフサイクル計画
  4. プロジェクトでの WBS の利用
  5. WBS の利用例
  6. WBS の作成
という構成になっているのだが、個人的には「基本概念で述べられていたレベルの粒度の話」「WBS の作成で述べられていた WBS 作成フロー」「WBS にまつわる Q & A」が参考になった。 WBS なら知ってる、書けるという人でも一度読んでみると多少なりとも得るものがあると思う。

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

Jan 22, 2006

[Misc] 今更 ajax にチャレンジ

ajax でちょっとしたタブ型のインターフェースを作ってみた。 こういうものと昨日調べた JavaScript のテンプレートエンジンを組み合わせると面白いのではないかと思って。 テンプレートエンジンとの組み合わせはまだ出来ていないのだけれど。

2006/01/21 2006/01/20 2006/01/18 2006/01/17 2006/01/16

JavaScript を有効にすると動作します。

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

Jan 21, 2006

[Misc] JavaScript のテンプレートエンジン

JavaScript のテンプレートエンジンを集めてみた。 意外と見つからなかった。もう少し見付かるかと思ったのだけれど・・・。

Ajax Pages
http://ajax-pages.sourceforge.net/
Jamritas
http://sourceforge.net/projects/jamritas/
JKL.Hina
http://www.kawa.net/works/js/jkl/hina.html
TrimPath
http://sunset.freespace.jp/smarty/
Lyase.View
http://inforno.net/articles/2006/02/15/the-embed-javascript-implementation
(2006/02/21) Inforno さんのテンプレートエンジン追加。Trackback Thanx!! > Inforno さん
(2006/02/24) Inforno さんのテンプレートエンジン名称を正式なものに修正。

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

Jan 20, 2006

[WebService] Google Maps API を利用しているサイトを調査

ふと思い立って Google Maps API を利用しているサイトを調べてみた。 とは言え、既にかなりの数のサイトが Google Maps API を利用している模様。 とりあえず検索エンジンで適当にかき集めてみた。

Google Maps API はクライアント側に負荷がかかるのが難点ではあるけれど、皆が色々工夫しているのが楽しい。 もっと探せばいくらでも見付かりそうだな。

サービス検索

地図でホテルの料金比較:ホテル情報館
http://www.bit-style.com/travel/
関東のデートスポットマップ
http://www.date2.jp/
地図から検索 Find Job! Mapsβ
http://www.find-job.net/fj/mapsearch.cgi
食べログ.com
http://tabelog.com/restaurant/tokyo/

ブログ・SNS連携

はてなマップ
http://map.hatena.ne.jp/
なビログ
http://navilog.manno.jp/mailbbs.php
BLOGエントリを地図に
http://daily-archive.com/
マイミクマップ
http://www.flatz.jp/var/miximap/index.php
どこだログ
http://www.platypus.st/exec/show-tb4gmap.rb
お散歩マニア
http://www.osanpomania.net/

ゲーム

Google Maps で鈴鹿サーキット試走
http://tech.nitoyon.com/javascript/application/racing/1/
Google Maps APIシューティング挫折版
http://www.asahi-net.or.jp/~cs8k-cyu/javascript/gma_shmup_test/
らくがきマップ
http://playon.jp/mm/map/

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

Jan 18, 2006

[VMWare] Samba + LDAP の VMware 仮想ディスク(2)

実際に試してみた。 まずは起動と Samba へのアクセスに挑戦。

  1. VMWare Player を起動
  2. root/samba でログイン
  3. ifconfig で IP アドレスを調べる
  4. Windows からエクスプローラでアクセス
  5. ldap01/ldap01 で認証
  6. 問題無く Samba に接続。ファイルの読み書きも問題無し
というわけで、何事も無く終了。
[Samba へ無事接続]

次にドメインへの参加に挑戦。 ・・・ここで問題発生。 色々試してはみたもののドメインには参加できなかった。 クライアントは Windows XP Professional。 ローカルセキュリティポリシーとかも調整したが無理だった。 Samba の勉強が必要か。 とりあえず今回は時間が無いので断念。

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

Jan 17, 2006

[VMWare] Samba + LDAP の VMware 仮想ディスク

hard で loxse な日々さんがSamba + LDAP の VMware 仮想ディスクを紹介していた。 公開元のだめだめ日記さんによると・・・

  • Samba+LDAPでPDCの構成済
  • smbldap-tools設定済
  • Windowsから管理するための設定済
  • UNIXとWindowsのアカウント同期設定済
です。

ベースは Debian GNU/Linux 3.1(Sarge) です。base-system に最低限 Samba+LDAPを動作させるのに必要なパッケージ+αを入れることで、200MB程度の容量に抑えました。
というものらしい。素晴らしい!! 「ActiveDirectory までは別に要らないなぁ」という場合に何とも便利。 試してみたいのだが、ダウンロードが終わらない・・・後 4 時間orz 明日試してみよう。

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

Jan 16, 2006

[Library] Restlet にチャレンジ (2)

サンプルコード(1)

まずはリクエストの内容を表示するサンプル。

package jp.in_vitro.codelets.restletsample;

import org.restlet.AbstractRestlet;
import org.restlet.Restlet;
import org.restlet.RestletCall;
import org.restlet.RestletException;
import org.restlet.component.DefaultRestletContainer;
import org.restlet.component.RestletContainer;
import org.restlet.data.MediaTypes;
import org.restlet.data.Preference;

import com.noelios.restlet.data.StringRepresentation;
import com.noelios.restlet.ext.jetty.JettyServer;

public class RestletContainerSample {

    public static void main(String[] args) throws Exception {
        RestletContainerSample me = new RestletContainerSample();
        me.initialize();
        me.execute();
    }

    public RestletContainerSample() {
        super();
    }

    protected void initialize() {
        // Restlet API に Restlet 実装を登録。
        com.noelios.restlet.Engine.register();
    }

    protected void execute() throws Exception {
        // Jetty と Restlet コンテナの準備
        RestletContainer restletContainer = new DefaultRestletContainer(
                "My container");
        JettyServer httpServer = new JettyServer("Web Server", 8080,
                restletContainer);
        restletContainer.addServer(httpServer);

        // Restlet コンテナに Restlet を登録して、Restlet コンテナを開始。
        Restlet myRestlet = new MyRestlet(restletContainer);
        restletContainer.attach("http://localhost:8080/restlet", myRestlet);
        restletContainer.start();
    }

    protected static class MyRestlet extends AbstractRestlet {

        public MyRestlet(final RestletContainer restletContainer) {
            super(restletContainer);
        }

        public void handle(final RestletCall call) throws RestletException {
            StringBuffer message = new StringBuffer();
            message.append("<html><body>");
            message.append("<dl>");
            message.append("<dt>Client Address</dd>");
            message.append("<dd>" + call.getClientAddress() + "</dd>");
            message.append("<dt>Client Name</dd>");
            message.append("<dd>" + call.getClientName() + "</dd>");
            message.append("<dt>Method</dd>");
            message.append("<dd>" + call.getMethod() + "</dd>");
            if (call.getReferrerRef() != null) {
                message.append("<dt>Referrer Ref</dd>");
                message.append("<dd>" + call.getReferrerRef().getPath()
                        + "</dd>");
            }
            if (call.getResourceRef() != null) {
                message.append("<dt>Resource Ref</dd>");
                message.append("<dd>" + call.getResourceRef().getPath()
                        + "</dd>");
            }
            if (call.getSecurity() != null) {
                message.append("<dt>Security (description)</dd>");
                message.append("<dd>" + call.getSecurity().getDescription()
                        + "</dd>");
                message.append("<dt>Security (challenge request)</dd>");
                message.append("<dd>"
                        + call.getSecurity().getChallengeRequest() + "</dd>");
                message.append("<dt>Security (challenge response)</dd>");
                message.append("<dd>"
                        + call.getSecurity().getChallengeResponse() + "</dd>");
            }
            if (call.getStatus() != null) {
                message.append("<dt>Status</dd>");
                message.append("<dd>" + call.getStatus() + "</dd>");
            }
            if (call.getMatches() != null) {
                message.append("<dt>Matches</dd>");
                message.append("<dd>");
                for (String match : call.getMatches()) {
                    message.append(match);
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getPaths() != null) {
                message.append("<dt>Paths</dd>");
                message.append("<dd>");
                for (String path : call.getPaths()) {
                    message.append(path);
                    message.append("<br>");
                }
                message.append("</dd>");
            }
            if (call.getMediaTypePrefs() != null) {
                message.append("<dt>Media Type Prefs</dd>");
                message.append("<dd>");
                for (Preference preference : call.getMediaTypePrefs()) {
                    message.append(preference.getMetadata());
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getLanguagePrefs() != null) {
                message.append("<dt>Language Prefs</dd>");
                message.append("<dd>");
                for (Preference preference : call.getLanguagePrefs()) {
                    message.append(preference.getMetadata());
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getCharacterSetPrefs() != null) {
                message.append("<dt>Character Set Prefs</dd>");
                message.append("<dd>");
                for (Preference preference : call.getCharacterSetPrefs()) {
                    message.append(preference.getMetadata());
                    message.append(",");
                }
                message.append("</dd>");
            }
            if (call.getConditions() != null) {
                message.append("<dt>Conditions (description)</dd>");
                message.append("<dd>" + call.getConditions().getDescription()
                        + "</dd>");
                message.append("<dt>Conditions (modified since)</dd>");
                message.append("<dd>" + call.getConditions().getModifiedSince()
                        + "</dd>");
                message.append("<dt>Conditions (unmodified since)</dd>");
                message.append("<dd>"
                        + call.getConditions().getUnmodifiedSince() + "</dd>");
            }
            message.append("</dl>");
            message.append("</body></html>");
            call.setOutput(new StringRepresentation(new String(message),
                    MediaTypes.TEXT_HTML));
        }
    }
}

サンプルコード(2)

URL に従ってファイルを返すサンプル。

package jp.in_vitro.codelets.restletsample;

import org.restlet.component.DefaultRestletContainer;
import org.restlet.component.RestletContainer;
import org.restlet.data.MediaTypes;

import com.noelios.restlet.DirectoryRestlet;
import com.noelios.restlet.ext.jetty.JettyServer;

public class DirectoryRestletSample {

    public static void main(final String[] args) throws Exception {
        DirectoryRestletSample me = new DirectoryRestletSample();
        me.initialize();
        me.execute();
    }

    public DirectoryRestletSample() {
        super();
    }

    protected void initialize() {
        // Restlet API に Restlet 実装を登録。
        com.noelios.restlet.Engine.register();
    }

    protected void execute() throws Exception {
        // Jetty と Restlet コンテナの準備
        RestletContainer restletContainer = new DefaultRestletContainer(
                "My container");
        JettyServer httpServer = new JettyServer("Web Server", 8080,
                restletContainer);
        restletContainer.addServer(httpServer);

        // リクエストのパスに従ってファイルを返す Restlet
        DirectoryRestlet dirRestlet = new DirectoryRestlet(restletContainer,
                "c:/tmp", true, "index");
        dirRestlet.addExtension("txt", MediaTypes.TEXT_PLAIN);

        // Restlet コンテナに Restlet を登録して、Restlet コンテナを開始。
        restletContainer.attach("http://localhost:8080/", dirRestlet);
        restletContainer.start();
    }
}

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

Jan 15, 2006

[Library] Restlet にチャレンジ

Restlet とは

Restlet は、Java の Webアプリケーション用フレームワーク。 REST アーキテクチャの考え方をベースにしているフレームワークでちょっと目新しい。

Restlet
http://www.restlet.org/
Restlet Tutorial
http://www.restlet.org/tutorial
Java開発をWeb 2.0に対応させる「Restlet」プロジェクト
http://www.itmedia.co.jp/enterprise/articles/0601/10/news022.html
RESTアーキテクチャとは? SOAPとの関係は?
http://www.goodpic.com/mt/archives/000185.html

Restlet の実行環境構築

  1. こちらから Restlet をダウンロードする。ここでは ver.0.19 を前提とする。
  2. アーカイブの中の lib ディレクトリにある以下の jar をクラスパスに追加する。
    • com.noelios.restlet.jar
    • freemarker.jar
    • javax.servlet.jar
    • mail.jar
    • org.apache.commons.logging.jar
    • org.mortbay.jetty.jar
    • org.restlet.jar
    • restlet.freemarker.jar
    • restlet.javamail.jar
    • restlet.jetty.jar

サンプルコード

Web ブラウザに "Hello Restlet World" という文字列を送るサンプルコード。 Jetty を使うと気軽に Web アプリケーションが作成できる。 アプリケーションサーバをわざわざ用意したくないような小規模な Web アプリで使うと便利かも。

package jp.in_vitro.codelets.restletsample;

import org.restlet.UniformCall;
import org.restlet.UniformInterface;
import org.restlet.data.MediaTypes;

import com.noelios.restlet.data.StringRepresentation;
import com.noelios.restlet.ext.jetty.JettyServer;

public class UniformInterfaceSample {

    public static void main(final String[] args) {
        UniformInterfaceSample me = new UniformInterfaceSample();
        me.execute();
    }

    public UniformInterfaceSample() {
        super();
    }

    protected void execute() {
        // Web ブラウザに "Hello Restlet World" という文字列を text/plain で返す。
        UniformInterface handler = new UniformInterface() {
            public void handle(final UniformCall call) {
                call.setOutput(new StringRepresentation("Hello Restlet World!",
                        MediaTypes.TEXT_PLAIN));
            }
        };
        // HTTP サーバを起動する。
        new JettyServer("Web Server", 8080, handler).start();
    }
}

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

Jan 13, 2006

[Misc] パスワード強度に関するメモ

ちょっと気になったのでパスワード強度に関して調べてみた。 いくつかメモ。 パスワード強度は"password strength"とか"password quality"とか言うみたい。 調べた限りではパスワード強度の標準的な算出方法は見付からなかった。 サイト毎に独自で実装しているのだろうか??

Iris Today Archives - パスワード・クオリティーを理解する
http://www-06.ibm.com/jp/software/lotus/developer/iris_today/20010904_5.html#1
Understanding password quality
http://www-10.lotus.com/ldd/today.nsf/8a6d147cf55a7fd385256658007aacf1/098c9f7d4a0cccbd85256abc0011e4f0?OpenDocument
Password Quality Scale
http://www.eclipse-education.com/eclipseweb.nsf/0/b565c53895a58b170525693f001037c2?OpenDocument

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

Jan 11, 2006

[Misc] サニタイズ言うなキャンペーンについてメモ

「サニタイズ言うなキャンペーン」に関するメモ。 サニタイズという言葉が問題だということは分かるけれど、Web アプリケーションにおけるプレゼンテーション層の標準的なフローがイマイチ明確にされていないのがそもそもの問題だと思う。

「サニタイズ言うなキャンペーン」とは何か
http://takagi-hiromitsu.jp/diary/20051227.html#p02
はてなダイアリー - サニタイズとは
http://d.hatena.ne.jp/keyword/%A5%B5%A5%CB%A5%BF%A5%A4%A5%BA?kid=127293
要約版:「サニタイズ言うなキャンペーン」とは
http://takagi-hiromitsu.jp/diary/20051231.html#p02
「サニタイズ言うなキャンペーンがわかりにくい理由」
http://bakera.jp/hatomaru.aspx/ebi/2006/1/5
セキュアなWebアプリ実現のために本来やるべきことは? - 高木浩光氏
http://pcweb.mycom.co.jp/articles/2005/07/12/wasf/

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

Jan 08, 2006

[Misc] LANDISK の telnet に関するメモ

LANDISK の telnet サポート

I・O Data 製 NAS の LANDISK で簡単に telnet サーバを立ち上げる方法をメモ。 wizd on LANDISK さんが公開されているアップデータを利用すると簡単にできる。 wizd on LANDISK さんに感謝!!

LANDISK HDL シリーズ
http://www.iodata.jp/prod/storage/hdd/2005/hdl-u/
LANDISK HDL シリーズサポートソフトライブラリ
http://www.iodata.jp/lib/
wizd on LANDISK
http://landisk.sealandair.info/

手順

  1. ここから最新ファームウェアをダウンロードする。
  2. ファームウェアを最新のものに更新する。
  3. ここから landisk_telnetd_v2.0.zip をダウンロードする。
  4. landisk_telnetd_v2.0.zip 内の update.tgz で再度 LANDISK を更新する。
  5. LANDISK に ユーザ "landisk" を追加する。
  6. LANDISK に telnet で接続してみる。
    Linux 2.4.21 (hoge.example.com) (0)
    
    
    hoge.example.com: landisk
    Password:
    No directory, logging in with HOME=/
    bash$ uname -a
    Linux hoge.example.com 2.4.21 #48 Tue Mar 22 22:03:49 JST 2005 sh4 unknown
    bash$

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

Jan 06, 2006

[Library] jLHA にチャレンジ

jLHA とは

jLHA は、名前の通り Java で LHA を扱うためのライブラリ。 J2SE にある ZIP 用 API と似通ったインターフェースを持っているため使いやすい。 ライセンスは独自ライセンスになっている。

LHA Library for Java
http://homepage1.nifty.com/dangan/Content/Program/Java/jLHA/LhaLibrary.html

jLHA の実行環境構築

  1. こちらから jLHA のソースコードをダウンロードする(ここでは version 0.06-05 を使用)。
  2. compile.xml 内の javac.target のvalue="1.1"をvalue="1.5"に変更する。
  3. jLHA をコンパイルして jar を生成する。ここでは、JDK 1.5.0_05 と Ant 1.6.2 を使用した。
    > ant -f compile.xml compileRelease
    > jar cvf jlha-0.06-05.jar jp
  4. jlha-0.06-05.jar をクラスパスに指定する。

サンプルコード

package jp.in_vitro.codelets.jlha;

import java.io.IOException;
import java.io.InputStream;

import jp.gr.java_conf.dangan.util.lha.LhaFile;
import jp.gr.java_conf.dangan.util.lha.LhaHeader;

public class Codelet {

    public Codelet() {
        super();
    }

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

    protected void execute() throws IOException {
        LhaFile file = new LhaFile("c:\\sample.lzh");
        LhaHeader[] entries = file.getEntries();
        String path = null;
        for (LhaHeader entry : entries) {
            path = entry.getPath();
            System.out.println("" + path);

            InputStream is = null;
            try {
                is = file.getInputStream(path);
                int ch = 0;
                while ((ch = is.read()) >= 0) {
                    System.out.print((char) ch);
                }
                System.out.println();
            } finally {
                if (is != null) {
                    is.close();
                }
            }
        }
    }
}

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