Hatena::ブログ(Diary)

足掻きながら必死に生きてるよ

2011-09-03 GrailsからS3を扱う

GrailsAmazon Web Services Simple Storage Service (S3)を使ってみる。

プラグインがあるので、利用は簡単。

http://www.grails.org/plugin/amazon-s3

まずは、インストールから。ドキュメントとしては、install-pluginコマンドを使っているけども、

BuildConfig.groovyに以下のように記述してインストール

plugins {

runtime ':quartz:0.4.2'

runtime ':amazon-s3:0.8.2'

}

Config.groovy

aws {

domain="s3.amazonaws.com"

accessKey="【accesskey】"

secretKey="【secretKey】"

bucketName="grails"

}

データをアップロードすると、S3上で以下のような名前でバケットが作成されて、そのバケットにデータが保存されていく。

【accessKey】.grails

存在しないバケットの場合はUSの方に作られてしまうので、事前に使いたいリージョンでこの名前のバケットを作成しておく。作成さえしておけば、そのバケットを利用するようになっている。

このプラグインは、S3の操作にJetS3tというライブラリ(と言っていいのかわからないけど)を利用していて、現在のバージョンは、日本リージョンに対応しているみたいだけど、プラグインに入っているバージョンでは、日本リージョンに対応していない。USと、EUROPEには、対応しているけども、プラグインソースコードでは、リージョンの指定すらしていない。

これでS3を利用する準備は完了。次に、データを登録してみる。

プラグインで用意されているS3AssetControllerを使ってデータの登録が出来るようになっている。

デフォルトパッケージで作成されているので、あくまで確認用の位置づけになっていると思われる。

実際にプロジェクトにプラグインを組み込む際は、このControllerは、なにかしらのアクセス制御をしておく必要があるだろう。

http://【serverHost】/【appName】/s3Asset/create

f:id:kokum:20110903214733p:image

http://【serverHost】/【appName】/s3Asset/list

f:id:kokum:20110903214734p:image

データをアップロードすると、一旦サーバーローカルにファイルが保存され、その後、バックグラウンド処理として、S3にデータがアップロードされる。

このプラグインは、S3のファイルの管理情報をGrailsドメインで管理していて、プラグイン経由でアップロードされたファイルのみ操作可能になる。

ドメイン上に、アップロードの状況など(アップロード中とか、保存済みとか)が書き込まれていく。

データを削除した場合は、そのステータスが削除済みになり、ドメイン上に情報は残される。当然、S3上のファイルは削除される。

別途ツールなどを使ってアップロードしても、Grailsアプリケーションの一覧に出てこない。

そういったファイルは、何かしらの方法でGrailsドメインにデータを登録すればリストに出すことは出来そうだ。

あと、バケット内にフォルダを作って登録することができないので、ファイルをグループに分けて管理するした場合は、ドメイン上にあるdescriptionとかに管理用情報を入れておくか、動的にバケットを作成、利用してアプリケーション上で工夫する必要がある。

2011-07-10 電子出版 EXPO

去年まではデジタルパブリッシングフェアという名前で行われたイベント。

電子出版とか、電子書籍という言葉がよく聞かれるようになってきたためなのだろうか。確かにこの名称の方が、意味が分かりやすい。

去年のデジパブは、「電子書籍ってこういうもの」みたいなものが多かった覚えがある。

まだまだ、各社手探り状態のようなところがあり、iPadや、iPhoneで見る電子書籍のもの珍しさが目立っていた気がする。

今年は、明確に方向性が絞られていて、あくまで、個人的な感覚なんだろうけど、イベントの主旨がわかりやすかった。

大きく分けて、2つの特徴を感じた。

 ・電子出版(電子書籍販売)サイトを始めました

 ・電子出版してみませんか?

いわゆる大手企業がこぞって、電子出版サイトを始めるという内容で出展していた。細かい特色の違いはあるのだろうけど、思ったより電子出版サイトが多かったので、ちょっと驚いた。

iPhoneや、iPadが普及する前から電子書籍を販売するサービスは、なくなったり淘汰されている中、昔からあるパピルスなどのサイトが、大手参入による競争激化が予想される中、どうなっていくのかが興味深い。

そして、そういった電子出版サイトがどのようなインフラで行われるのか興味があったので、それとなく聞いてみたりした。

本当は、電子出版をするためのソリューションを提供するようなサービスがあれば、「どれぐらいのインフラが必要なの?」とかで聞きやすいのだけど、そういうものはなく、サイトを運営するところばかりなので、インフラがどうなっているのかなどは、なかなか聞き出せない。というか、そこまで知っている人が、ブースにいない。

いちおう、クラウドとかの用語は出てくるものの、やはり、プライベートクラウドということぐらいしか聞き出せなかった。Amazon EC2を使うとか、そういうおもしろそうな話しは聞けなかった。

データセンターが壊れたらどうなるのか?」と聞いても、サイトが止まりますと言われてしまった。

元々インフラを提供している企業が、そのインフラを有効活用するために、自社インフラ上に電子出版サイトを載せてサービスを提供するというものもあった。なるほどという感じである。

今まで、自費出版という世界があったわけだけれども、それが、電子書籍という形であれば、ものすごく簡単にできるようになってきた。

サイトにアップロードすれば、販売してくれるわけで、電子書籍は、印刷する必要も、製本する必要もない。多少のデータ加工知識さえあれば、簡単に作れるわけで、今までは高かった自費出版のしきいが、ほとんどなくなったようなものである。

これからは、個人作成書籍などがものすごく流通するようになるかもしれない。

そうなってくると、世の中に電子書籍があふれるようになり、良い電子書籍が埋もれていくかもしれない。

そういう良書が埋もれてしまう事態を解消しようとする試みのサービスを出展している企業もあった。キーワードによる「あいまい検索」のようなことを行えるようにして、自分の興味から、書籍をリストできるサイトだった。今後ソーシャル的な機能も追加していくとも言っていた。

電子出版、電子書籍のサービスをまわりから支えるようなサービスもこれからどんどん増えていくのだろう。

ソーシャル的な機能というのは、最近のWEB環境では流行ものになっていて、サイトを提供しようとしているところは、ほとんど、取り込んでいるか、今後、充実させていくという話しが出ていた。

あとは、電子書籍を作るためのツールも、よく見られた。

まさに、電子出版するための環境が整いつつあるという印象を受けた。

気がかりなのは、やはり、版元の動きであり、今後は、著作権に関する問題をどう解消していくかということだろうか。

2010-11-18 2010 vForumに行ってきたよ

Move beyond. 乗り越えていこう。始めてみよう。ということだろうか。

それが、今年のvForumのキャッチフレーズだった。でも、話を聞いていても、キャッチフレーズとしては、いまいちぴんと来ない。

IT as a Service というほうが、まだぴんと来る。

1)vSphereや、vCenterなどのクラウドインフラストラクチャおよび管理ソリューション

2)開発ツールとしてのSTSなどのクラウドアプリケーションプラットフォーム

3)Viewや、Thin Appといったエンドユーザーコンピューティングソリューション

という3階層に分けて提供していこうとしている。

いわゆる、SaaSでも、PaaSでも、IaaSでもない。それを、IaaSと呼んでいた。

IT全体を提供してくれるわけだ。そして、VMware自体は、実サービスを提供するのではなく、Amazonや、Niftyのような、実サービスを提供するインフラプロバイダなどに、自社製品を売り込んでいく。

一番最初のセッションは、「いまさら聞けない!クラウド入門」

特に書くことはないけど、上で書いたような話の概要をかいつまんで説明してくれた。

そして、ゼネラルセッション

VMware代表取締役が、立って話し始めた。よくAppleや、欧米の企業がこういうものをやるときに、立って、歩きながら話すという形式だ。生でははじめて見たけど、まあ、なんとなく、かっこいいね。

でも、日本人がやると、いまいち、決まらないんだけど。

途中から、どこかの国の人がしゃべって、同時通訳レシーバーを使ったわけだけど、いつもながら、同時通訳の人って、すごいなと思う。

次にランチセッションの「サーバ仮想化を成功に導く、ストレージ・インフラ選択のポイント」

要は、メーカーが自社製品を売り込むタイプのセッションである。

この手のセッションは、一つ二つなにかしら、知らなかったことを知ることが出来たら、儲け物である。

ストレージの話だったこともあり、スピーカーがクライアントストレージに関するサポートなどをしている人のようで、SATAの評価について、「よく壊れる」「遅い」という現実の評価を改めて聞けた。うちの社内サーバなどは、金額的な要因から、たいていSATAを使っているわけだけど、稼働数自体がそんなに多いわけじゃないので、壊れやすいだの感じるほどではない。大規模なミッションクリティカルなシステムを稼働しているわけでもないので、速度もまあ足りる。でもその人が言うにはSATAは「ほんとうによく壊れる」と言っていたので、そうなのだろう。

実際のところ、予算の関係で、社内で使うときでも、お客さんに納めるときでもSATAになってしまうわけだが。

そういえば、先日、立て続けに、HDDトラブルがあったなぁ。。。

当然のことながら、こういうフォーラムを提供する側は、ビジネスに結びつけるために行うわけで、小規模に、お金をほとんどかけないで実践しようとしている場合は、ちょっと寂しい結果に終わってしまう。運用していく上でのちょっとしたコツを聞ければいいなと出席しても、たいていの場合、こういう(有償の)ツールを使えば、こうやってできるみたいなことになり、「でもお高いんでしょ?」という結果に終わる。

今回のフォーラムもやはりそういう結果に終わり、VMwareの進む先という情報を得るという意味では、有意義ではあったのかな。。。

VMware見える化とパフォーマンス管理手法のご紹介」

管理ツール製品の紹介。まあ確かに、そういうツールがあれば、管理も楽になるのだろうね。大規模な場合は。。

「迅速なデプロイと管理に対応したクラウド時代のアプリケーションインフラストラクチャ

同時通訳セッションVMwareの提供する3つの階層のうちの、開発階層で提供されるソリューションを使った開発手法の提案という感じ。まあ、あまり縁のない話だけど、vFabricがあると、開発も楽しいのだろう。。

アプリケーションサーバ、ロードバランス、データ管理、パフォーマンス管理、メッセージング、ポリシーベースの自動化など、一つの製品グループになっていて、統合管理できて、開発に専念できる。非常に魅力的な話。実行環境が欲しくなれば、簡単な手順でサーバが用意できたりできたりするわけで、いろいろと楽になる。

「仮想プラットフォーム徹底比較」

vSphereと、Microsoft Hyper-Vとの導入時間、コストの比較をしていた。

当然、導入時間も、コストもvSphereが安いという話。

Linuxしか使わない場合には、なんの意味もないわけで、Xenと比較して欲しかったものだ。

VMware vSphere Essentials Plusで小さく始める仮想化環境構築のポイント」

期待していたけど、やっぱり、がっかり感が大きい。

ESXiというか、vSphereでは、物理メモリを超える状態でサーバの運用が出来る。バルーニングという、ゲストOS間でメモリを分け合う機能があるからだ。

当然、メモリがあまりないホストマシンでは、頻繁にメモリの分け合いが起こって、感覚としては、スワップみたいな状態になって、稼働が少ないゲストOSに接続すると、最初の接続時に、結構、待たされる。一回動き出すと、その後は普通に稼働するものの、やはり、最初のもたつきは寂しいものだ。でもバルーニングがなければ、起動すら出来ないわけで、起動するだけマシなんだけども。

一日目のセッションが終わった。明日はもっといい話が聞ければいいなと、宿への道を急ぐ。

ゼネラルセッション

事例紹介。やっぱり、使っているところは2005年ぐらいから、徐々に使い出していたようだ。

今後も、仮想化を導入するところと導入しないところが分かれていくような気がする。仮想化したくてもできない環境が多い場合には、導入できないから、何年もハードウェアの危機感を持ちながら運用していくしかないことも結構ありそうだ。

あと、昨日とは違って、もうちょっとインパクトのあるデモを見せてもらえた。当然、大規模運用の場合の話にはなってしまうのだけど、なんと、マシンの電源入れ、ネットワークをつなぎさえすれば、ESXiの導入から自動処理。あれよあれよと、ホストマシンができあがり、vCenterの管理下に入る。「すげー」の一言。まあ、これまた縁のないもの。ESXiのライセンスが必要になるのだろうし、Essentialのライセンスでは、出来ない話だろう。

でも、これぐらいの規模の管理者は、仮想化で、ものすごい管理が楽になるのは、明らかである。

あと、デスクトップ仮想化のデモもあって、なんとこのソリューションを使うと、ie8と、ie6が同じデスクトップで稼働するらしい。というか、いい加減、ie6は、辞めようよ。。

「企業の業務品質を大きく変えるデスクトップ仮想化」

メーカーによるセッションVMwareの話?という感じの内容だったけど、一応、仮想化の話。クライアント環境を仮想化で運用するユーザが利用するデスクトップ仮想化。内部的には、Viewか、ThinAppを使っているのかな?

従来デスクトップ仮想化は、データの流出を防ぐ目的だったりした物が、最近は、モバイル環境への対応や、パンデミックに対する業務の継続性の目的でも考えられるようになった。

社内でも、インフルエンザが流行っているときの業務の継続は課題の一つになっていて、仮想化デスクトップで運用していれば、そんな問題は、まったくどこ吹く風状態。ドングルとかいう悪しき風習があるので、実現は難しそうだけど、仕事がどこでもできて、かつ、データも安全に管理できるところは、やはり、すばらしい。

「仮想化環境におけるJavaアプリケーションの管理」

ふたたび、vFabric的なお話し。さすがにSpringSourceを傘下に持つVMwareだけあって、めずらしいことに、Grailsという名前がでてきた。話をしている人はGrailsをどれだけ知っているか分からないけど、こうやって普段はあまり耳にしないGrailsの話が出てくると、なんとなくうれしいものだ。

「仮想化の落とし穴、この一年でどうなった?業界レビューします!」

今回のフォーラムで、一番プレゼンがおもしろかったというか、うまかったセッション

エバンジェリストを自称するだけあるのか、話し方がうまかった。話したいことがいっぱいあるとかで、ものすごく早口だったけど、こういうセッションというかプレゼンが出来るっていうのは才能の一つだと思う。

内容としては仮想化する際の落とし穴の話な訳だけど、やっぱり、結構大規模の場合の落とし穴な話。うーん、縁がない。

VMware vShpere 4.1 バックアップベストプラクティス

DataRecoveryというツールで簡単にできる。内部的にはvSphereで提供されているvStorage APIを使っているとことなので、APIを直接叩いてやれば同じようなことができるのだろうか。

vSphere Essentialライセンスでも、このvStorage APIが使えるらしいので、ちょっと使ってみたいというか、普通に使えるのであれば、使わない手はない。もちろん、DataRecoveryは、Essential Plusからなので、APIを叩くプログラムを作らないといけない。

VMware vShpere 4.1 ネットワークベストプラクティス

いまいち感たっぷりのセッション。最初から最後まで、縁がないからなのか、話がさっぱり頭に入ってこなかった。

大規模運用の場合は、ネットワークをどう構成するかもシビアに設計しないといけないのだろう。

というわけで、vForumが終わった。

vForumの参加者は、年々増えているようで、今回のフォーラムの参加者数を見ても、じわじわと仮想化が普及段階に入ってきた感じがする。今後新規導入するシステムは、仮想化を採用するしないにかかわらず、一度は採用を検討しないといけないぐらいにはなってきている気がする。それは、プライベートクラウドかもしれないし、パブリッククラウドかもしれない。いずれにしろ、仮想化のメリットは、それほど大きいと思う。

実際に社内で運用するサーバハードウェアがどんどん増えていかないというのは、ものすごいメリットがある。

もちろん、ただ単に複数のサーバを1台のサーバに押し込んだだけでは、ホストマシンの故障などで、一気にすべてのシステムが停止することになり、リスクが跳ね上がるので、それなりの構成にする必要がある。でもその構成もそれほど大それた物である必要はなく、2、3台のマシンで余裕を持った運用をするだけでよい。

もはや、自分自身が、仮想化運用から離れられなくなっているのは、事実だ。

2010-09-12 grails blazeds 自前アダプタ

前回まででは、クライアントから送ったデータを、そのままの状態で、サーバからクライアントへ配信していた。

では、サーバー側で受け取ったデータを加工して、それをクライアントへ配信するにはどうするのか。アダプタというものを介してやることになる。

messaging-config.xml赤字部分を追加および変更。

<?xml version="1.0" encoding="UTF-8"?>
<service id="message-service" class="flex.messaging.services.MessageService">

    <adapters>
        <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true"></adapter-definition>
        <adapter-definition id="ChatAdapter" class="blaze.ChatAdapter"/>
    </adapters>

    <default-channels>
        <channel ref="my-streaming-amf"></channel>
    </default-channels>

    <destination id="chat">
        <adapter ref="ChatAdapter"/>
    </destination>

</service>

ChatAdapterというアダプタを追加して、destinationで利用するアダプタとして設定する。

ここから推測すると、アダプタが設定されていないdestinationは、デフォルトアダプタとして登録されているアダプタが利用されるということかと。上記の例では、デフォルトアダプタは、actionscriptということになる。


以下のファイルを追加。

src/groovy/blaze/ChatAdapter.groovy

package blaze

import flex.messaging.messages.Message
import flex.messaging.services.MessageService;
import flex.messaging.services.ServiceAdapter

class ChatAdapter extends ServiceAdapter {
    Object invoke(Message message) {
        message.body.receiveTime = new Date().format('yyyy/MM/dd HH:mm:ss')
        getDestination().getService().pushMessageToClients(message, false)
        return null
    }
}

アダプタは、ServiceAdapterを継承して作成する。

クライアントからメッセージを受け取ったアダプタは、invokeというメソッドをキックする仕組みのようだ。

アダプタが利用されていることが分かるように、受信時間をメッセージに付加して、クライアントへ配信してみることにする。


クライアント側の実装

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       creationComplete="consumer.subscribe();"
                       width="500" height="250">
  <fx:Script>
    <![CDATA[
      import mx.messaging.ChannelSet;
      import mx.messaging.channels.StreamingAMFChannel;
      import mx.messaging.messages.AsyncMessage;
      import mx.messaging.messages.IMessage;
      
      private function send():void{
        var message:IMessage = new AsyncMessage();
        message.body.message = msg.text;
        producer.send(message);
        msg.text = "";
      }

      private function messageHandler(message:IMessage):void{
        log.text += '['+message.body.receiveTime+'] '+message.body.message + "\n";
      }
    ]]>
  </fx:Script>
  <fx:Declarations>
    <s:ChannelSet id="channelMsgSet">
      <s:StreamingAMFChannel id="amfchannel" url="http://localhost:8080/blaze/messagebroker/streamingamf"></s:StreamingAMFChannel>
    </s:ChannelSet>
    
    <s:Producer id="producer" destination="chat" channelSet="{channelMsgSet}" ></s:Producer>
    <s:Consumer id="consumer" destination="chat" channelSet="{channelMsgSet}" message="messageHandler(event.message)"></s:Consumer>
  </fx:Declarations>
  
  <s:Panel title="チャットサンプル" width="500" height="230" y="0" x="0">
    <s:TextArea id="log" width="500" height="160"></s:TextArea>
    <s:controlBarContent>
      <s:TextInput id="msg" width="100%" enter="send()"></s:TextInput>
      <s:Button label="送信" click="send()"></s:Button>
    </s:controlBarContent>
  </s:Panel>  
</s:WindowedApplication>

赤字部分を変更。

f:id:kokum:20100912224451p:image

チャットログ欄に時間が付加されるようになった。

ここからは、チャットに限らず、いろんな可能性を感じ取る事が出来る。

2010-09-08 grails blazedsプラグイン FLEX側の実装

前回、1.3系では動かないと書いたけど、試しに、1.3.4にして起動してみたら、ちゃんと起動した。

なにが動かないんだろうか・・

そして、本題、FLEXアプリの作り方。SDKのバージョンは、4.1。

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
                       xmlns:s="library://ns.adobe.com/flex/spark"
                       xmlns:mx="library://ns.adobe.com/flex/mx"
                       creationComplete="consumer.subscribe();"
                       width="500" height="250">
  <fx:Script>
    <![CDATA[
      import mx.messaging.ChannelSet;
      import mx.messaging.channels.StreamingAMFChannel;
      import mx.messaging.messages.AsyncMessage;
      import mx.messaging.messages.IMessage;
      
      private function send():void{
        var message:IMessage = new AsyncMessage();
        message.body.message = msg.text;
        producer.send(message);
        msg.text = "";
      }

      private function messageHandler(message:IMessage):void{
        log.text += message.body.message + "\n";  
      }
    ]]>
  </fx:Script>
  <fx:Declarations>
    <s:ChannelSet id="channelMsgSet">
      <s:StreamingAMFChannel id="amfchannel" url="http://localhost:8080/blaze/messagebroker/streamingamf"></s:StreamingAMFChannel>
    </s:ChannelSet>
    
    <s:Producer id="producer" destination="chat" channelSet="{channelMsgSet}" ></s:Producer>
    <s:Consumer id="consumer" destination="chat" channelSet="{channelMsgSet}" message="messageHandler(event.message)"></s:Consumer>
  </fx:Declarations>
  
  <s:Panel title="チャットサンプル" width="500" height="230" y="0" x="0">
    <s:TextArea id="log" width="500" height="160"></s:TextArea>
    <s:controlBarContent>
      <s:TextInput id="msg" width="100%" enter="send()"></s:TextInput>
      <s:Button label="送信" click="send()"></s:Button>
    </s:controlBarContent>
  </s:Panel>  
</s:WindowedApplication>

f:id:kokum:20100909001517p:image

短いコードなので、説明はするほどのことは、ないかな・・・

ChannelSetを作って、それに対するProducerと、Consumerを作る。

Producerでメッセージを送信して、Consumerのmessage属性で、戻りを操作する。

一番簡単なチャットアプリということで。