2011/09/24

Amazon Route 53でドメイン管理

EC2で遊ぶ際にドメインがないと不便なのでappbatake.comドメインを取得してみました。
現在はUnicode Charのプログラムを動作させています。
 http://appbatake.com/unicodeinfo/

 必要な情報はいろんな人がまとめているので、簡単な作業メモだけ書きます。
  1. ドメインを取得する
    1. Amazon Route 53はDNSサービスであり、ドメイン取得サービスではないため、ドメインは別サービスで取得、管理する必要があります。僕はお名前.comを使いました。
  2. EC2のインスタンスを準備する
    1. AWSのアカウントがない場合、まずAWSアカウントを取得します。
    2. テストに使うインスタンスがない場合、インスタンスを起動し、IPアドレスを確認します。
  3. Amazon Route 53にサインアップする
    1. Amazon Route 53にサインアップします。
    2. IAMでAmazon Route 53専用ユーザを作成します。
      1. 次のステップでSecret Keyを外部サイトに入力するため、Amazon Route 53の権限のみを与えたユーザを作成します。
    3. nephelai.orgを使ってドメインの設定
      1. @レコードにEC2インスタンスのIPします。
      2. Elastic IPやELBを使いたい場合には、そちらを設定してください。
  4. DNSを切り替える
    1. ドメインに設定しているDNSをAmazonのDNSに切り替えます。
空きのあるドメインを探すのが大変だったぐらいで、あとはさくさく進みました。やっぱりJava使うんだったらApp EngineよりもEC2の方が気楽ですね。

2011/09/09

Unicode Infoのページ(絵文字対応)

Unicode InfoをUnicode6対応にしてみました。
OS X Lionから入力する絵文字も正しく処理されます。

Unicode Infoのページ

実装にはicu4j 4.8.1を使用しています。ver 4.6.1以降はUnicode 6対応です。
http://site.icu-project.org/
http://site.icu-project.org/download
App Engineでも問題なく動作しました。

2011/09/08

OS X Lionにおける絵文字の混乱

OS X Lionの絵文字はUnicode 6に追加されたコードを使っており、フォントとしてはApple Color Emoji.ttfがバンドルされています。ここまではシンプル。ただ、ふたを開けると大混乱です。

一例として、絵文字の「☀」を取り上げます。 この文字はもともとUnicodeで定義されている「BLACK SUN WITH RAYS」という文字であり、Unicode6の絵文字としても従来の文字が採用されました。

実際に文字パレットで確認すると、同じ「BLACK SUN WITH RAYS」が、絵文字と象形文字で異なる表示になっていることがわかります。この時点でUnicode的には微妙な気がします。



さらに調べて行くと面白いことがわかりました。
これはSafariの検索窓です。「SMILING FACE WITH OPEN MOUTH AND SMILING EYES」「BLACK SUN WITH RAYS」の順で入力すると普通に表示されます。
次に、この二文字をまとめてコピーし、ペーストしてもそのまま表示されます。しかし、「BLACK SUN WITH RAYS」だけをコピーしてペーストすると黒い文字になります。

以下は僕の予想です。
Appleの文字表示ポリシーは「表示する」ことを重視しており、選択中のフォントで表示できない文字があると自動的に表示できるフォントに切り替わります。これは描画レイヤーに近い部分で行われており、フォント選択できない領域でも発生します。
「SMILING FACE WITH OPEN MOUTH AND SMILING EYES」は通常フォントにないためEMOJIフォントに切り替わり、絵文字に存在しない文字が現れるまで絵文字フォントが使用されます。
これで説明はつくのですが、かなり混沌としていますね。

Guice + One-Jar

最近はGoogle Guiceがマイブームです。

One-JarからGuiceを使用する場合には、One-Jarのバージョンを0.98にした上で、META-INF/MANIFEST.MFに下記の記述が必要です。
One-Jar-URL-Factory: com.simontuffs.onejar.JarClassLoader$OneJarURLFactory
One-Jar Frameworks

One-Jarの最新版は0.98 RC-2となっています。 ただ、"release early, release often"といいながら、2010/8/25以降変更がありません。



One-Jarについて詳しくはこちら
One-JARでアプリケーションの配布を単純化

2011/07/20

AWS Tips : EBSのスナップショット

EC2上の外付けハードディスクにあたるEBSには、スナップショットという非常に便利な機能があります。この機能によりEBSの内容を瞬時にS3にバックアップしたり、バックアップから新しいEBSを作成したりできます。

EBSはAvailability Zone内で冗長化されているのに対して、Snapshotが保存されるS3はリージョン内で冗長化されるため、より高い信頼性を得る事が出来ます。また、EBSにSnapshotを作成しておくことで、EBS自体の信頼性も高まるとのことです。

ソース https://forums.aws.amazon.com/thread.jspa?threadID=37676
Taking EBS snapshots is not just for restoring in the event of an EBS failure.  It actually reduces the failure rate of the EBS volume itself as a failed block on the EBS volume will transparently fail through and be read from the EBS snapshot on S3. 

「瞬時に」と書きましたが、スナップショットをとる瞬間は高速ですが、その後のS3への書き出しは非常に遅いです。今実行している800GBのスナップショット作成は24時間で60%程度しか進んでいません。ただ、S3書き出し中もEBSには通常通りアクセスできますし、データを修正してもスナップショットには影響ありません。

ソース https://forums.aws.amazon.com/message.jspa?messageID=108982
When your call to ec2-create-snapshot returns, any future writes to the volume will not be reflected in the snapshot. 

AWS関連まとめ

2011/06/10

ユニコードの文字コードを調べる(国際化ドメイン名)

下記のURLの違いわかりますか?
素朴な疑問 http://example.com  http://еxample.com って表示がわかれるのかな?」

下記ページにコピーしてみると、実際のUnicodeでの表記がわかります。

最初のURLはよく使われるサンプル。
二番目のものはe(U+65)をキリル文字のе(U+435)に置換したものです。このような非ASCII文字を使ったドメイン名は国際化ドメイン名と呼ばれており、内部ではpunycodeと呼ばれるエンコードが行われています。
http://еxample.com -> http://xn--xample-2of.com/

迷惑メール等に含まれるURLはこのような偽装がされている可能性もあるため、原則として怪しいメールのリンクはクリックしない方が良いと思います。

2011/6/10時点で確認した範囲では、facebook、twitterはそのままURLを表示しますが、iphone上のTwitterアプリはpunycodeでの表示を行っていました。

2011/06/06

ユニコードの文字コードを調べる(絵文字)

GoogleとAppleが提唱したマッピングをもとに、携帯電話の絵文字がUnicode6に採用されました。Mac OSX Lionでは絵文字に対応するという噂もあり、絵文字はさけて通れない問題になりつつあります。

Googleのemoji4unicodeプロジェクト
emoji4unicode

Unicode6の正式規格
EmojiSources.txt

標準化により簡単に絵文字を使えると思いきや、Unicode6の定義は意外と曲者です。
Unicode6規格の問題は主に3点

  1. ベンダ固有の記号が符号化されていない
    • ドコモロゴ等は符号化されていないため、独自にPUAに割り当てる必要があります。
  2. 合字の使用
    • 一部の文字は単一のコードポイントではなく、複数のコードポイントによる合字で表現されています。
  3. 定義がShift JISベース
これに対して、emoji4unicodeに含まれるGoogleの定義は、すべての絵文字が定義されているだけでなく、それぞれに単一のコードポイントが割り当てられています。Unicode6という標準は魅力的ですが、内部コードとしてはGoogle PUAの方が向いているようです。

2011/05/29

ユニコード文字のコードを調べる

追記
Wicket版をGWTで作り直してしまいました。


Wicket + Guiceの勉強をかねてユニコード検索ページを作ってみました。WicketでJavaScriptを1行も書かずにAJAXしてます。

Unicode Infoのページ

開発環境

  • eclipse3.6
  • Apache Maven 3.0.2
  • Wicket 1.5 M3
  • Guice 3.0


Wicket
Web用のフレームワークとしてはWicketを使用しています。
XML設定は最小限で、ほとんどがHTML+Javaで完結するのが非常に書きやすいです。Jettyと組み合わせるとさくさく開発が進められます。
WicketではAJAXもサーバサイドで書けるのですが、AJAXを使うと強制的にStatefulなページになってしまいます。回避する方法がないわけではないのですが、AJAXするならサーバ側Wicket、クライアントjQueryの方がわかりやすい気がします。
また、今回のテーマである「補助漢字」の扱いにバグがあるようで、そのまま出力すると文字化けしました。今回はユニコード実体参照に変換することで回避しています。



実行環境

通常のServletとして作成したので、Amazon EC2のMicro Instance上にTomcat6をインストールして動作させています。本当はApp Engineで動かしたかったのですが、ちょっとハマったので断念しました。

2011/05/11

AWS Tips : availability zone割り当てはアカウントによって異なる

考えてみれば当たり前なのですが、AWSのavailability zoneに付いている名前は論理的なマッピングであり、物理的な割り当てはアカウントによって異なります。
availability zone間の通信は課金対象となるので、複数アカウントを使用する場合には注意が必要です。

AWS関連まとめ

2011/05/06

MVN Tips : Maven + Eclipse

Mavenでビルド環境を構築しても、開発用のIDEは必要です。
IDEとしてeclipseを使用している場合には、m2eclipseによりmavenと統合して使用することができます。主な機能は下記のものです。
  • 依存関係の管理
    • Maven Dependencyという機能により、POMに記述した依存関係をそのままeclipseから使用できます。もちろん、UnitTestも可能です。
      • さらに、JavaDoc、Sourceのダウンロードも行えます。
    • Workspace Resolutionという機能を使うと、依存関係に含まれるプロジェクトをeclipse上で開いている場合には、jar依存ではなく、プロジェクト依存として利用できます。
  • Profileの適用
    • プロジェクトにactiveにするProfileを登録できます。Profileを適用した状態でプロジェクトが構築されるので、開発用の設定などを切り替えるのに便利です。
  • POMからeclipseプロジェクトの設定
    • POMの記述からEclipseのプロジェクト設定を更新できます。
  • WTP Integration
    • Extraに含まれるWTP Integrationを使用すると、eclipse WTPプロジェクトをそのままMaven管理出来ます。
プラグインのダウンロードについてはこちらから。
m2eclipse

基本的には、下記をEclipse Update Sitesとして追加するだけです。

もともとはSonatypeとMavenプロジェクトの創始者であるJason van Zylが作った会社が開発していましたが、Eclipseに移管されました。

2011/04/30

MVN Tips : 標準ディレクトリ構造

Mavenでは標準となるディレクトリ構造が決まっています。
もちろん標準以外の構成を使用することもできますが、標準構成ならPOMの記述もシンプルになるので、可能な限りこの構成に合わせてください。

  • pom.xml
  • src
    • main
      • java
      • resources
      • webapp
    • test
      • java
      • resources
  • target  (svn:ignore)

これに加えて、下記のような開発者用リソースを決めておくと便利です。

  • local-env
    • resources (svn:ignore)
    • default

開発者が手元で変更した設定が誤ってコミットされないように、設定例をdefaultに入れておき、各開発者はそれをresourcesにコピーして使用するようにしています。

ソース

Maven関連まとめ

2011/04/26

MVN Tips : 安定したビルドと柔軟なビルド

あるMavenプロジェクトを何回ビルドしても同じ結果が得られることを、ビルドが安定していると呼びます。逆に、ビルドした時点で新しい成果物を取り込むビルドを柔軟なビルドと呼びます。

ビルドの安定性を決めるのが、バージョンの指定方法です。
  1. 特定バージョンを指定
    • 1.0
      • 同じバージョンが更新されることはないため、ビルドは安定します。
  2. バージョンのレンジ指定
    • [1.0,)
      • 1.0以上
      • 特定バージョン以降のすべてのバージョンアップを取り込みます。
    • [1.0,2.0)
      • 1.0以上、2.0未満
      • 特定バージョン以降のマイナーバージョンアップを取り込みます。
  3. SNAPSHOTバージョンを指定
    • 1.0-SNAPSHOT
      • SNAPSHOTバージョンは同一バージョンのまま更新されます。
ビルドの安定性と柔軟性はトレードオフの関係にあるため、臨機応変に使い分けてください。

2011/04/21

MVN Tips : 親POMでprofileをactivateしても、継承されない

Profileには継承という概念はなく、各階層ごとに処理されます。
activationを使ってProfileを自動アクティベートする場合には注意してください。

Maven関連まとめ

MVN Tips : POMの親子関係

POMには親子関係を設定できますが、親から子の関係と、子から親の関係は目的が違います。

子から親を参照(Inheritance)
Parent POMを指定すると、他のPOMの情報を引き継ぐことができます。指定にはGroup等の成果物の情報が必要です。
依存ライブラリのバージョン管理、プラグインのバージョン管理、デプロイ設定など、mavenを使う上では必須のテクニックです。Parent POMは一つしか指定できませんが、複数階層設定することができます。

親の指定には追加で相対パスも指定できるのですが、これがちょっと曲者でデフォルトで../pom.xmlが指定されています。リポジトリ経由で親POMを指定する場合には、明示的に<relativePath/>としておいた方が良いです。

ソース

親から子を呼び出し(Aggregation)
POMの中でモジュールとして別のPOMを指定することで、ビルド時に連携してビルドさせることができます。指定には相対パスを利用します。Parent POMの親子関係とは関係なく設定できるので、複数のプロジェクトをまとめてビルドする際に便利です。



Maven関連まとめ

2011/04/20

AWS Tips : Reserved Instanceの適用範囲

AWSの使用料金をさらに安くするために重要なのが、Reserved Instanceです。
おさえておきたいポイントを何点か列挙します。
  • Reserved Instanceは一時金+従量課金で、使わなくても良い(ソース)
  • EC2のReserved InstanceはAvailability Zone単位(ソース)
  • RDSのReserved DB InstanceはRegion単位(ソース)
  • Consolidated Billingを使うと、アカウント間でReserved Instanceを共有できる(ソース)

AWS関連まとめ

MVN Tips : デプロイ先をReleaseとSnapshotで切り替える

Nexusを使用している場合、固定バージョンの成果物はReleaseリポジトリ、-SNAPSHOTバージョンの成果物はSnapshotリポジトリにデプロイする必要があります。

この場合には、distributionManagementにrepository、snapshotRepositoryの両方を指定しておけば、バージョン情報に応じて適切なリポジトリにデプロイされます。(ソース)

Maven関連まとめ

MVN Tips : MavenとNexusとJenkinsとSubversionの素敵な関係

Mavenをビルドツールとして使用する場合には、NexusとJenkinsを組み合わせることをお勧めします。僕はこの組み合わせに到達するまでMavenの便利さを過小評価していました。例えるなら、Javaを普通のエディタで書くのと、Java + eclipseぐらいに違います。

Nexus Repository Manager
Mavenのためのリポジトリマネージャ。社内成果物の管理だけでなく、社外リポジトリへのプロキシとして動作するためMavenビルドが非常に快適になります。

Jenkins
継続的インテグレーション(Continuous Integration)のためのツール。バージョン管理システムからの通知に応じてビルドを実行し、成果物をNexusに登録します。Maven専用のジョブタイプを利用すると、Mavenの依存関係に基づいて自動的に派生ビルドを実行してくれます。

Subversion(もしくは、他のバージョン管理システム)
Nexusに登録するのは各エンジニアではなく、かならずバージョン管理システムに登録されたコードを自動ビルドしたものにします。これにより、個人の環境に依存しない安定したビルド環境を実現できます。

最初のセットアップはちょっと面倒ですが、後が非常に楽になる素敵な組み合わせです。

Maven関連まとめ

MVN Tips : Mavenに入ればMavenに従え

Mavenでは、ソースの階層構造等の推奨構成が決まっており、その構成であれば設定を省略できるようになっています。また、構成だけでなく、「1つのプロジェクトからは原則として1つのプロダクトを生成する」等のMavenの哲学とでも呼ぶものが存在します。
この哲学は多くのエンジニアがたどり着いたベストプラクティスに基づいているため、できる限り従うことで後で楽をできます。

標準構成に基づくことで記述が簡単になるだけでなく、自分以外のエンジニアへの引き継ぎも非常に楽になります。もちろん、環境構築にはそれなりに苦労しますが、人のプロジェクトをビルドするために苦労する日々から解放されますよ。

僕の勤めるリプレックス社内のJavaプロジェクとはMaven標準に基づいているため、プロジェクトのビルド手順は下記のようになります。
1. 開発ツールインストール(eclipse,maven,subversion、1回だけ)
2. 社内Mavenレポジトリを登録(1回だけ)
3. プロジェクトをチェックアウト
4. ビルド
すべての依存関係はmavenによって解決され、必要なjarファイルが自動的にダウンロードされます。また、ソース、JavaDocも自動的にダウンロードされるため、ソースを見ながらのデバグも可能です。

TIpsと呼ぶには大げさかもしれませんが、Mavenを自分に合わせるのではなく、Mavenに自分を合わせましょう。

Maven関連まとめ

2011/04/19

AWS Tips : Elastic IPを使う場合でもCNAMEが便利

Amazon EC2では、Elastic IPという固定IPアドレスを使用することができます。
ただ、このElastic IPは外部公開用のIPアドレスであり、EC2内の通信には望ましくありません。もちろん使えない訳ではないですが、セキュリティーグループの設計等に頭を悩ませることになってしまいます。

そこで便利なのが外部DNS名です。
EC2の外部DNS名はIPアドレスに対して割り当てられるため、Elastic IPにも対応したDNS名があります。このDNS名をEC2内のDNSに問い合わせると内部のIPアドレスを取得することができます。もちろん、EC2外部からDNSに問い合わせればElastic IPを取得できます。

DNS登録する場合もElastic IPを直接登録するのではなく、このDNS名をCNAMEとして登録するのがおすすめです。

AWS関連まとめ

2011/04/18

まずは試作環境の構築から

まずは自由に使用できる試作環境を構築しましょう。

ただ単に自分が管理しているだけでなく、簡単にリセットできることが重要です。
この「リセットできる」という要求から、もし余っているパソコンをお持ちでも、仮想マシンを使用するクラウドサービスの契約をすることをお勧めします。

僕のおすすめはAmazon Elastic Computer Cloud(EC2)。他にもいろいろありますが、EC2は完全従量課金なので契約しておいて損はありません。2011年3月から東京データセンタでのサービスも始まりましたし、日本語での情報も豊富になってきました。

僕の勤めるリプレックスでは2008年からEC2を使用しており、「ウェブポ」は当初からEC2上に構築されています。