Mar 26, 2009

[Maven] Apache Maven 2.1.0 がリリースされた!!

2009/03/21 に Apache Maven 2.1.0 がリリースされていた。 暇を見つけて早速入れ替えてみよう。 リリースノートをざっと見た感じでは関係ありそうなのはバグ FIX くらいで、嬉しい新機能はなさそう。

Apache Maven Project
http://maven.apache.org/
Maven 2.1.0
http://maven.apache.org/release-notes.html
Release Notes - Maven 2 - Version 2.1.0 - HTML format
http://jira.codehaus.org/secure/ReleaseNote.jspa?version=14587&styleName=Html&projectId=10500

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

Mar 25, 2009

[Apple] Parallels のイメージサイズを最適化する方法

Parallels も長く使っていると、ゲスト OS 上でのファイルの作成・削除の繰り返しでイメージが肥大化してくる。 そうした時に有効なのが、"Parallels Compressor"。 不要なデータを削除し、イメージを最適なサイズまで縮小してくれる。 多少時間はかかるものの(MacBook Pro 2GHz で 3 〜 4 時間程度かかった)、かなりディスクスペースの節約になる。

[Parallels Compressor]

[最適化前]
最適化前
[最適化後]
最適化後

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

Mar 19, 2009

[Misc] OpenSearch に対応する方法

OpenSearch とは

OpenSearch.org によると、OpenSearch とは

OpenSearch is a collection of simple formats for the sharing of search results.
You can use OpenSearch formats to help people discover and use your search engine and to syndicate search results across the web.
というものらしい。 対応すると Firefox の検索バーに Google や Yahoo と並んで自分のサイトを表示できる様だ。 早速遊んでみることに。
OpenSearch.org
http://www.opensearch.org/Home
Creating OpenSearch plugins for Firefox
https://developer.mozilla.org/ja/Creating_OpenSearch_plugins_for_Firefox

OpenSearch description document の作成

まずは OpenSearch description document を作成する。 詳細は OpenSearch description document に譲ることにして、ここではこのブログ用の内容をメモしておく。

<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
  <ShortName>in-vitro.jp blog search</ShortName>
  <Description>in-vitro.jp blog search</Description>
  <InputEncoding>UTF-8</InputEncoding>
  <Image width="16" height="16">data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAPSGlDQ1BJQ0...(略)</Image>
  <Url type="text/html" method="GET" template="http://www.in-vitro.jp/blog/google.cgi">
    <Param name="key" value="site:www.in-vitro.jp/blog/"/>
    <Param name="q" value="{searchTerms}"/>
  </Url>
  <moz:SearchForm>http://www.in-vitro.jp/blog/</moz:SearchForm>
</OpenSearchDescription>
以下の 2 点だけ気をつければ作成自体は特に難しいことではない。
  1. 検索のクエリ文字列は {searchTerms} で置換される。
  2. アイコン 16 x 16 で作成し、Base64 でエンコードして <Image> 内に埋め込む。サーバに置いて参照することもできる様だ(上の例では埋め込んでいる)。アイコンを Base64 でエンコードするのは The data: URI kitchen を使うと楽。
作成できたら適当なファイル名でサーバ上に設置する。

HTML ヘッダにリンクを設定

HTML ヘッダに OpenSearch description document へのリンクを設定する。

<html>
  <head>
    ...
    <link rel="search" type="application/opensearchdescription+xml" title="in-vitro.jp blog" href="/blog/opensearch.xml" />
  </head>
  ...
</html>

Firefox で検索

OpenSearch に対応したサイトを開き、Firefox 検索バーのプルダウンを開くと

[Firefox検索バー]

の様に検索バーへの登録メニューが表示される。登録を行い、検索をしてみると・・・

[検索を実行]

検索できた。

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

Mar 18, 2009

[Misc] P3P に関するメモ

The Platform for Privacy Preferences 1.0 (P3P1.0) Specification
http://www.w3.org/TR/P3P/
P3P 1.0 の公開について (W3C 勧告)
http://www.w3.org/2002/04/p3p-pressrelease.html.ja
P3P Validator
http://www.w3.org/P3P/validator.html
P3P 1.0 Implementations
http://www.w3.org/P3P/implementations
【絵で分かるキーワード】P3P(The Platform for Privacy Preferences Project、ぴーすりーぴー)
http://review.ascii24.com/db/review/soft/web/2003/06/01/643973-000.html

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

Mar 16, 2009

[Misc] CentOS 5 に memcached をインストール

CentOS 5 に memcached をインストールしたときのメモ。 ・・・メモと言っても yum を流しただけ。

# yum search memcached
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile

  (略)

python-memcached.noarch : A Python memcached client library
memcached.i386 : High Performance, Distributed Memory Object Cache
memcached-selinux.i386 : SELinux policy module supporting memcached

# yum install memcached.i386
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
 * epel: ftp.jaist.ac.jp
 * extras: ftp.nara.wide.ad.jp

  (略)

Running Transaction
  Installing: memcached                    ######################### [1/1] 

Installed: memcached.i386 0:1.2.5-2.el5
Complete!

# /etc/init.d/memcached start
Starting memcached:                                        [  OK  ]
#

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

Mar 15, 2009

[Tiger] RSA 暗号の鍵を DB に格納する方法

RSA 暗号の公開鍵を DB に格納しようと苦心惨憺したときのメモ。 以下のサイトが非常に参考になった。多謝。

Java Cryptgraphy
http://tokyo.cool.ne.jp/hharuki/java/81crypt.html
@//メモ - JavaSE RSA暗号
http://hondou.homedns.org/pukiwiki/index.php?cmd=read&page=JavaSE%20RSA%B0%C5%B9%E6

コード

ここではテストのためファイルから公開鍵、秘密鍵を取得している。

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.mail.internet.MimeUtility;

...

public void test() throws Exception {

  String data = "hogehogehogehoge";

  // 公開鍵の読み込み
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  InputStream is = null;
  try {
    is = new FileInputStream(new File("./mykey.x509"));
    int ch = 0;
    while ((ch = is.read()) >= 0) {
      baos.write(ch);
    }
  } finally {
    if(is != null) {
      is.close();
    }
  }
  // 暗号化。
  byte[] encrypted = this.encrypt(data.getBytes(), baos.toByteArray());
  System.out.println("" + new String(encrypted));

  // 秘密鍵の読み込み
  baos = new ByteArrayOutputStream();
  try {
    is = new FileInputStream(new File("./mykey.pkcs8"));
    ch = 0;
    while ((ch = is.read()) >= 0) {
      baos.write(ch);
    }
  } finally {
    if(is != null) {
      is.close();
    }
  }
  // 復号化。
  byte[] decrypted = this.decrypt(encrypted, baos.toByteArray());
  System.out.println("" + new String(decrypted));
}

public byte[] encrypt(final byte[] text, final byte[] publicKey)
        throws Exception {
  PublicKey key = KeyFactory.getInstance("RSA").generatePublic(
         new X509EncodedKeySpec(this.decodeBase64(publicKey)));

  Cipher cipher = Cipher.getInstance("RSA");
  cipher.init(Cipher.ENCRYPT_MODE, key);

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  CipherOutputStream cos = new CipherOutputStream(baos, cipher);
  cos.write(text);
  cos.close();

  return baos.toByteArray();
}

public byte[] decrypt(final byte[] text, final byte[] privateKey)
        throws Exception {
  PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(
         new PKCS8EncodedKeySpec(this.decodeBase64(privateKey)));

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  Cipher cipher = Cipher.getInstance("RSA");
  cipher.init(Cipher.DECRYPT_MODE, key);
  CipherOutputStream cos = new CipherOutputStream(baos, cipher);
  cos.write(text);
  cos.close();

  return baos.toByteArray();
}

protected byte[] decodeBase64(final byte[] text) throws MessagingException,
        IOException {
  InputStream is = MimeUtility.decode(new ByteArrayInputStream(text), "base64");

  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  int ch = 0;
  while ((ch = is.read()) >= 0) {
    baos.write(ch);
  }
  return baos.toByteArray();
}

鍵の作成

下記で作成した mykey.x509, mykey.pkcs8 がそれぞれ公開鍵、秘密鍵になる。

$ openssl genrsa -des 1024 > ./mykey.pem
Generating RSA private key, 1024 bit long modulus
...............++++++
............++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
$ openssl pkcs8 -topk8 -in ./mykey.pem -out ./mykey.pkcs8 -nocrypt
Enter pass phrase for ./mykey.pem:
$ openssl rsa -in ./mykey.pem -pubout -out ./mykey.x509
Enter pass phrase for ./mykey.pem:
writing RSA key
$ cp ./mykey.pkcs8 ./mykey.pkcs8.original
$ vi ./mykey.pkcs8
$ diff ./mykey.pkcs8.original ./mykey.pkcs8
1d0
< -----BEGIN PRIVATE KEY-----
16d14
< -----END PRIVATE KEY-----
$ cp ./mykey.x509 ./mykey.x509.original
$ vi ./mykey.x509
$ diff ./mykey.x509.original ./mykey.x509
1d0
< -----BEGIN PUBLIC KEY-----
6d4
< -----END PUBLIC KEY-----
$ 

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

Mar 10, 2009

[Maven] 何かに依存するライブラリを使用する

たまに「何かに依存するライブラリ」というものがある。 例えば、JDK のバージョンに依存する json-lib。 例えば、OS に依存する Eclipse SWT。
この様なライブラリは groupId, artifactId, version 以外の属性で jar を切り替えるものと考えることができる。 素晴らしいことに Maven2 ではこの様な状況も想定し、classifier という属性が用意されている。 pom.xml に classifier を指定することで「依存する何か」で jar を切り替えることができる。

Maven Documentation - Technical Project Descriptor
http://maven.apache.org/ref/current/maven-model/maven.html#class_dependency

pom.xml の記述方法

pom.xml の dependency に classifier を指定するだけで良い。 OS 毎に Eclipse SWT を切り替える場合は以下の様になる。 ちなみに、http://repo1.maven.org/maven2/ にはこの例の jar は登録されていない。

  <project>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>swt</artifactId>
        <version>3.4</version>
        <classifier>carbon-macosx</classifier>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  </project>


properties を使用すると設定が楽になる。
  <project>
    <properties>
      <swt-classifier>carbon-macosx</swt-classifier>
    </properties>
    <dependencies>
      <dependency>
        <groupId>org.eclipse.swt</groupId>
        <artifactId>swt</artifactId>
        <version>3.4</version>
        <classifier>${swt-classifier}</classifier>
        <scope>compile</scope>
      </dependency>
    </dependencies>
  </project>

リモートリポジトリの構成

リモートリポジトリのディレクトリ構成、pom.xml は classifier 無しのものと同じ。 異なるのは jar ファイルが classifier 毎に複数用意されるというところ。 jar ファイル名は <artifactId>-<version>-<classifier>.jar となる。 上の Eclipse SWT の例の jar を登録する場合、下記の様な構成となる。

  $REPOSITORY_HOME
    └ org
       └ eclipse
           └ swt
              └ swt
                 └ 3.4
                    ├ swt-3.4.pom
                    ├ swt-3.4-carbon-macosx.jar
                    └ swt-3.4-gtk-linux-x86.jar

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

Mar 09, 2009

[Misc] Eclipse 3.5 M5 の更新内容が素晴らしい。

2009/02/03 に Eclipse 3.5 M5 がリリースされていた。 今更更新内容を確認してみて驚いた。 素晴らしすぎる。

Eclipse 3.5 M5 - New and Noteworthy
http://download.eclipse.org/eclipse/downloads/drops/S-3.5M5-200902021535/eclipse-news-M5.html

テキストエディタのブロック選択サポート

Platform Text - Block selection mode in textual editors
    Textual editors now support block (aka column or rectangular) selection mode:
テキストエディタでブロック選択がサポートされた。 Java エディタでも当然ブロック選択できる。 Mac OS X の場合、alt + command + a でブロック選択モードに入る。解除も同じ。
これでわざわざ Windows と秀丸を立ち上げて、という作業から少し解放される。 次はキーボードマクロを是非!! (Emacs 覚えろよ、という提案は聞こえないふりで・・・)

[Block Selection]

コンペアエディタで文字エンコーディング指定をサポート

Compare - Set encoding in Compare Editor
    The Set Encoding... action has been added to the Compare Editor context menu. This allows you to change the encoding of each side of the comparison.
コンペアエディタで文字エンコーディングを指定出来るようになった。

[Compare(0)]
UTF-8 と Windows-31J のファイルを比較してみる。片方が化けている。
[Compare(1)]
化けている方のコンテクストメニューから "Set Encoding..." を選択して・・・
[Compare(2)]
正しい文字エンコーディングを指定。
[Compare(3)]
比較できた!!

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

Mar 08, 2009

[JSR] JCP の更新情報を Twitter で確認する

JCP-INTEREST というメーリングリスト で JCP の最新情報を受け取ることができる。 メーリングリストも良いが、Twitterで更新情報を逐次確認できると個人的には非常に便利。 ということで、Twitter に JCP-INTEREST の情報を自動配信してみた。

jcp_unofficial
http://twitter.com/jcp_unofficial

個人的な利用を目的としたものではあるけれど、もし Twitter を利用していて JCP に興味のある方がいたらどうぞ(そんな人居るのか??)。

    follow me on Twitter

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

    Mar 06, 2009

    [WebService] API 経由で Google からウェブページを検索する。

    一昔前には API 経由でウェブページの検索ができる Google Web APIs というものがあった。 ・・・のだけれど、久しぶりに検索しようと思ったら無くなっている。 どうやらサービスの改変やら何やらでサービス名が変わったり無くなったり新設されたり、と色々あった模様。

    『Google Web APIs』
        |
    (サービス名変更)
        ↓
    Google SOAP Search API
        ↓
    (Google SOAP Search API 新規登録停止。)
        ↓
    Google AJAX Search API』 提供開始


    結局現時点(2009/03/06)では Google AJAX Search API の一部に Google WEB APIs の機能制限版に近いものが提供されている。

    Developer's Guide - Google AJAX Search API - Flash やその他 JavaScript を使用しない環境
    http://code.google.com/intl/ja/apis/ajaxsearch/documentation/#fonje


    Google というと、既に Web サービスのインフラに近い位置にあると思うので、Web 検索 API はまともなものを提供して欲しいと切に思う。

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

    Mar 03, 2009

    [WebService] Skittles.com が面白いことになっている

    Skittles.com が面白いことになっている。 サイト更改後、Skittles.com 内コンテンツのほとんどをインターネット上にある CGM のデータで構成しているのだ。 利用している CGM サービスは、Twitter(ミニブログ), Wikipedia(百科事典), YouTube(動画共有), Flickr(写真共有), Facebook(SNS)。 自社サイト内のコンテンツを顧客(というか、不特定多数?)に委ねてしまおうという何とも極端な試み。

    [Skittles Home]
    Skittles.com Home - Twitter

    [Skittles Home]
    Skittles.com Products - Wikipedia

    [Skittles Home]
    Skittles.com Media(Videos) - YouTube

    [Skittles Home]
    Skittles.com Media(Pics) - Flickr

    [Skittles Home]
    Skittles.com Friends - Facebook


    Skittles.com は CGM 上の情報を一切フィルタリングせずに表示する、という極めてオープンな構成になっている。 グランズウェルを味方に付けるため情報操作を行っていないということを前面に押し出したかったのだろう。 営利企業がここまで思い切ったことをするのは評価に値する。 流石米国企業、といったところか(いや、米国企業でもここまで思い切ったことをするのは珍しいのかも)。

    Skittles.com はオープンであることを選択したわけだけれど、その代償も当然払うことになる。 早速 Skittles.com ホームの Twitter 上にはネガティブな書き込みや不適切なサイトへのリンクが表示され始めている。

    [I hate Skittles]
    Skittles に対するネガティブな書き込み。
    [Adult link]
    アダルトサイトへのリンク(リンク先に飛ばない様に(w)。

    自分たちでは制御できないものを取り込んだサイトはこの先どうなって行くのだろう。 グランズウェルの最先端を行く取り組みがどうなっていくのか注視したい。

    参考資料

    グランズウェルについて詳しく知りたい方はこちらの書籍がお薦め。というか、今のところこれしかない??


    グランズウェル ソーシャルテクノロジーによる企業戦略

    (Amazon.co.jp の商品紹介より)

    米国ベストセラーの待望の邦訳! “Business Week”のベストセラーにも堂々ランクイン! ソーシャルテクノロジーが生みだすグランズウェル(大きなうねり)の正体をつかみ、 戦略的に使いこなせ!

    ソニー・エレクトロニクスの広報責任者リック・クランシーは、ある「力」に悩まされていた。 その力は、とどまるところを知らずに成長していたが、正体がわからない。ブロガー。 ディスカッショングループ。ユーチューブ。会ったこともない消費者たちが、誰もが 閲覧できるフォーラムで製品を格付けしていた。会社が大切に育ててきたブランドを、 あらゆるものが攻撃していた。従来の広報ツールは何の役にも立たなかった。そう、 本書で「グランズウェル(大きなうねり)」と呼ぶトレンドと格闘しているのであった。

    本書は著者らと数百人のクライアントとのやり取りと、数千時間に及ぶコラボレーションや 分析作業から生まれた。その目的はただひとつ---あなたが、テクノロジーの変化の波に 圧倒されることなく、ソーシャルテクノロジーが生みだす世界を航海できるよう支援する ことだ。どのようにビジネスに活かせるか、収益を上げ、あるいはコスト削減を実現し、 そして顧客とのエンゲージメントを強めているのか、事例に基づいて解説する。さらに、 実用可能なROI(費用対効果)のモデルも提供している。

    企業がコントロールできない状況で個人がよりパワーを持つことを脅威と捉える企業も 少なくない。しかし、企業にとって、本当は個人と深い関係を築くための絶好の機会に なるのだ!さあ、グランズウェルの世界にようこそ。

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