水曜日, 12月 31, 2008

【クラウドコンピューティング】 5年後のIT市場 このエントリーを含むはてなブックマーク



クラウドが5年後にIT市場の4割に、上流シフトできないベンダーは消える

日本IBMの中島丈夫エグゼクティブ・テクニカル・アドバイザー(技術理事)は、クラウドをもう少し過激に見ている。
「クラウドは現在、IT業界や企業のIT部門が開発したり構築・運用している業務ソフトやITインフラ環境のすべてを収容し代替するパラダイムシフトとなり得る。
クラウドでデータセンターが産業化、工場化すると、ソリューション提供とかシステム構築などの業界用語は死語になる。顧客の欲しい“最終製品” がクラウドから出荷されるからだ」


IBMの中島理事は昔から過激だ。私が中島さんからe-DataCenterの話を聞いたのは10年以上前のこと。
 新しいものをプロデュースすることは本当に難しい。
Webサービス、SaaS、クラウドと、世の中はそのとおりに進化してきた。中島さんから未来の姿を教えてもらいながら何もできていない自分がもどかしい。
でもあきらめずに、着実に、頑張るしかない。(ちなみに中島理事は私をハマスのように過激だという)

火曜日, 12月 30, 2008

【雑記】 3分で分かる設計の話 このエントリーを含むはてなブックマーク



 外部設計で重要なのは項目の整理。画面->テーブル->I/Fの順番で見ていく。項目の整理で必要なことは名前と型と多重度の定義。ただし長さの定義は内部設計でやってもOK。
 内部設計で重要なのはロジック。主にControlとBlogicが実装できるかどうか考えていく。ウォークスルーをやって項目の抜けや矛盾を見つけ出し不都合があれば外部設計で定義したI/Fを修正する。(ここで修正作業が起きることを懸念してはいけない。修正はおそらく最後の局面まで発生するだろう)
 Modelはdataとblogicに分かれる。(ドメインモデルではこれが一つになる一方、Controlの定義が曖昧になる)blogicでは外部参照をなくし揮発性(ステートレス)とすることが重要。
 テストはUT、IT、STの順番で行う。UTは内部設計書を元にチェックするテスト。ITは外部設計書、STはユースケースを元にチェックする。

<関連>
MVCモデルは進化する
ドメインモデル貧血症、サービスと振る舞いについて

日曜日, 12月 28, 2008

【雑記】 著作権について このエントリーを含むはてなブックマーク


 今日の日経新聞に出ていた「歌詞は盗作」認めずという記事が面白かったので一言。
問題となったのは、CHEMISTRYの「約束の場所」のなかの「夢は時間を裏切らない 時間も夢を決して裏切らない」という部分で、銀河鉄道999の「時間は夢を裏切らない 夢も時間を裏切ってはならない」という表現からの盗作ではないかということ。漫画家の松本零士さんは作詞した槙原敬之さんが電話で参考にしたことを認めたとも主張していた。

結局、「歌詞と漫画の表現は相似も大きく、漫画に依存しているとは断定できない」、「槙原さんが電話で認めたとも認定できない」との理由で、槙原さんに軍配が上がった。

この話のポイントは、著作権が相対的独占権(あるいは排他権)であること。
特許権や意匠権のような絶対的独占権ではない。すなわち、既存の著作物Aと同一の著作物Bが作成された場合であっても、著作物Bが既存の著作物Aに依拠することなく独立して創作されたものであれば、両著作物の創作や公表の先後にかかわらず、著作物Aの著作権の効力は、著作物Bの利用行為に及ばない。・・wikipedia


つまり、明らかに盗作だと思える表現でも盗んだことが立証されなければ有罪とはならないということ。「槙原さんが電話で認めたかどうか」が勝敗の分かれ目だったのだろう。

ソフトウェアの著作権についても同様の考え方ができる。

オリジナルのソースを入手してcopyrightのコメントをすげかえてもNGだし、コピーしたことがわからないように変数名やコメントを変えてもNG。
ただし、結果的に同じものができたと主張できれば、全く同じものでもOKとなる。

特許などと違い、結果的に同じものができても著作権侵害にはならないがオリジナルのソースを見て作った(=盗作)のであれば侵害となる。

木曜日, 12月 11, 2008

【Reflex】 MorphとDropBoxでクラウドPDFサービスを実現 このエントリーを含むはてなブックマーク




 Reflex itextの機能説明にもDEMOをのせているが、これはMorph Appspaceで動いているサービスである。デプロイは簡単で、以下のようにjarを実行するだけである。

java -jar morph-deploy.jar --user hoge --password piyo --config morph_deploy.properties pdfservice.war
Uploading the code...
Creating new appspace version...
Deploying the application...
Deploy Done.

For more information on the status of this deployment, you
can view the Deployment Logs by clicking 'Manage' located
on your subscription widget and by clicking the Logs tab.

In this same page, you can also view your Production logs
and Scheduled task logs.

** transaction commit **


さらに、Dropboxを使うことで、データもサービスもクラウドで提供できる。これが無料だからすばらしい。ちなみに、Morph AppSpaceもDropBoxも裏ではAmazon S3が動いている。

以下のリンクをクリックするとPDFが生成される。実行


http://pdfservice.morphexchange.com/?template=http://dl.getdropbox.com/u/200214/pagesample.html&entity=http://dl.getdropbox.com/u/200214/pagelist.xml


自分のパソコンのDropBox publicフォルダに、pagesample.htmlと、pagelist.xmlを置いて、あとは、これらのリンクをPDFサービスに渡してあげるだけだ。

グラフも出せるが文字化けする。海外のサービスだからしかたないところかな。実行

http://pdfservice.morphexchange.com/?template=http://dl.getdropbox.com/u/200214/areachartsample.html&entity=http://dl.getdropbox.com/u/200214/stocklist.xml


セキュリティの考慮点は暗号化とアクセス制御の2つ。
httpsで暗号化、アクセス制御はDropBoxのグループフォルダの考え方がヒントになると思っている。

クラウドで安全にPDF文書化ができたらWebEDIに応用できる。PDFに署名できたら取引は全部Webだけ、ということになるかもしれない。エンドユーザはサーバもストレージも用意する必要がない。Gmailのように過去のデータもすべてクラウドが保管する。

クラウドの可能性を考えると、とてもわくわくするなあ。



関連: 最初は無料が流行?Morph AppSpaceとdropbox

月曜日, 11月 17, 2008

【本日の嵌り】 Outputstreamをメモリにキャッシュ このエントリーを含むはてなブックマーク


 今作成しているWebアプリは画像生成処理の際に一時保管用としてテンポラリファイルに出力している。それがセキュリティ対策のためファイルへの書き出しが禁止されてしまった。さあ、どうしよう。
 幸い画像のファイルサイズも小さく出力後は消しても構わないのでメモリをテンポラリファイル代わりにして書き出せばよさそうである。そこで以下のようなOutputstreamをメモリにキャッシュするものを作成した。画像作成時にファイル名の代わりにキーを指定して書き出して出力時にキーを元に読み出せばよい。サーブレットなどマルチスレッドに対応するには、ファイル名にスレッド番号をつけてやればよい。

これで解決。


金曜日, 11月 14, 2008

【Reflex】 なぜAkamaiと組んだのか このエントリーを含むはてなブックマーク


非常に単純な理由である。
 
 Reflex iTextはデータとテンプレートを与えることでPDFを生成する。PDF生成処理は重くサーバリソースを圧迫するため、クラウド・コンピューティング・サービスを利用するのは理にかなっているからだ。
 
 また、AkamaiがGoogleやAmazonなどと異なるのはネットワークのクラウドであるということ。特にAmazonは日本にサーバを置いていないためレイテンシーが問題となる。Akamaiであれば心配する必要がない。

「インターネット・エッジに置いたサーバー群でクラウドを加速化」、アカマイがアライアンスを設立

 「クラウド・コンピューティング・サービスを提供する他の企業は、データ・センター内の設備のスケール・アウトを進めている。ところが、インターネット側のスケール・アウトを実施する企業はあまりない。アカマイはそこを狙っていく。グーグルやアマゾンのクラウドを巨大な発電所に例えると、送電線と変電所の役割を果たすのがアカマイだ」(アカマイ日本法人の小俣修一社長)






水曜日, 11月 12, 2008

【Reflex】 アカマイ様とのアライアンスとReflex iTextの発表 このエントリーを含むはてなブックマーク


 アカマイ様と弊社は、Reflex iTextのサービスについてのアライアンスを結び、本日プレスリリースした。

アカマイ、精鋭ソフトウェア開発会社とアライアンスを結成

 また、Reflex iTextのドキュメントを以下にUpしているので興味がある方はぜひ参照してみてください。
Reflex iText Overview

ポイントは、以下の2点です。

1)Akamai様がグローバルに展開した膨大なコンピューティング環境にPDF出力エンジンを分散配置することでシステム負荷軽減を図れる。

2)トランザクションによる従量課金となるため、使った分だけのコストしか発生しない。PDFサーバにかける初期投資を低く抑えることができる。

月曜日, 11月 10, 2008

【JavaScript】 高速化プロジェクト その1 このエントリーを含むはてなブックマーク


 先日、ある家電大手ECサイトのレスポンスが極端に低下するという事故が起きた。すぐに復旧できなかったところを見ると設計に何らかの問題があったのかもしれない。ECサイトにおけるレスポンス低下は致命的である。また、完成後のプログラムのパフォーマンスチューニングは難しい。サービスインしてから発覚したのでは取り返しがつかなくなることもあるので、設計の段階でよく考える必要がある。

今年の春頃のことだが、あるプロジェクトでJavaScriptのパフォーマンスが極端に遅くなるのを何とかしてほしいという相談を受けた。

 AJAXブーム以降、大規模な業務アプリケーションでもJavaScriptはよく使われるようになってきたが、多用するとパフォーマンス低下の心配が出てくる。これは特にDOM操作の多いアプリで起こりがちである。今回のプロジェクトでも、ベンチマーク結果によるとDOM操作に問題があるアプリであることがわかった。とりあえず、アプリの修正は行わないで以下のような対処療法をやってみた。


1.prototype.jsライブラリ改善

    ・HTMLファイル内のparentをいじる参考
    ・$()にcacheを持たせる参考
    ・prototype.jsファイルのサイズ縮小参考

 初期表示にかかる時間を計ったところ、9秒強(サーバ経由だと17-18秒) => 書き換え後8秒強(サーバ経由だと16-17秒)

2.変数格納

・for文の.lengthを一旦変数に格納

     初期表示にかかる時間を計ったところ、変化なし

3.jsファイルの圧縮

・他のjsファイルの圧縮もしてみたが、まったくと言っていいほど変わらなかった。



 対処療法ではまったくといっていいほど効果がなかった。しょうがなく設計からやりなおしてスクラップ&ビルドすることにした。結果は以下のように、初期ロードで倍のスピードとなり、また瞬時にタブ移動やページ移動ができるようになった。それでも初期ロードに時間がかかっているのは、DOMのリンク生成とサーバにおける検索処理時間が短縮できなかったことが原因である。DOMのリンク生成についてはどうしても時間がかかってしまうが、遅いのは最初だけなのでお客様にはなんとか納得してもらうことができた。
 どのようにしてこれだけの高速化ができたのか、詳細については「高速化プロジェクト その2」以降で説明したい。

旧アプリ(Core2 2.0GHz、メモリ2GB) 単位ms

初期ロードタブ移動ページ移動
APPL117.94.16.8
APPL212.54.03.8
APPL318.85.76.5
APPL411.31.42.3


新アプリ(Core2 2.0GHz、メモリ2GB) 単位ms

初期ロードタブ移動ページ移動
APPL18.90.10.1
APPL26.10.10.1
APPL315.50.60.1
APPL43.10.10.1


<関連>
高速化プロジェクト その2

木曜日, 10月 30, 2008

【雑記】 失敗しないことがよいことか このエントリーを含むはてなブックマーク


 小野さんのサイトで勧められていたので今こういう本を読んでいる↓。



 この本では、IBMのトーマス・J・ワトソンの言葉が数回出てくる。トーマス・J・ワトソン・シニアの名言・格言

 早く成功したいなら、失敗を二倍の速度で経験することだ。成功は失敗の向こう側にあるのだから・・・・


 要は失敗を恐れずに何事も果敢に取り組めということだが無謀な挑戦をやれといっているわけではない。やる前に少なくとも次の2つの検証は必要だと思われる。


 1)目的がはっきりしているか
 2)致命的な失敗にならないか


 発明王トーマス・エジソンも、「失敗は成功の母である」という言葉を残している。失敗から学んで次に生かすことは、「電球を発明する」などの目的があってはじめて成り立つことだと思う。
 また、何かをやるには大小のリスクは必ずある。それを無謀というかどうかは意見の分かれるところでもある。失敗には致命的な失敗とそうでない失敗の2種類あり、致命的な失敗さえしなければリスクを取っても気にする必要はない。失敗することを心配するのではなく致命的な失敗の危険性をどれだけ回避するかが重要である。致命的な失敗さえしなければ次のアクションをとることができる。(←こういう感じの話が本に書いてあった)

 ところで、失敗を好んでやっているとしか思えない確信犯的な企業がある。

 GoogleはGmailでメールをWeb化している。メール情報を預かるリスクは相当高いが、それを使う側にも分担させる(覚悟してもらう)ことで成り立たせている。つまり、データ損失や漏洩などの事故が起きる危険性はゼロではなく無償サービスということで免責されているが、それを承知で私を含め多くの人が使っている。
 その他、Youtube、Google Book Searchでは著作権問題を抱えており、Street Viewではプライバシー問題と向き合っている。これらのサービスが問題になることはやる前から分かっていたはずで、googleにとっては、ある程度起こることを見越した問題であったことは間違いないだろう。

 googleのすごいところは決して目的がぶれず後ずさりしないこと。以下の記事は一例であるが、情報公開の自由化と著作権者保護という2つの相容れない問題を「手打ち」により同時に解決させている。動画像のアップロードなどは限りなく違法コピーに近く、著作権をないがしろにしているように見えるが、一方で著作権者を保護することで著作権者と消費者の双方に支持されるモデルとなった。そのベースには広告モデルがあり、この文化が定着すれば広告モデルの可能性がまた大きくクローズアップされるかもしれない。いずれにしても、Googleが人柱となってこの業界を進化させているのは間違いない。恐るべしGoogle。

「Google Book Search」訴訟で米出版業界と和解合意

YouTubeとJASRACが利用許諾契約、演奏動画の投稿が可能に

水曜日, 10月 29, 2008

【クラウドコンピューティング】 Microsoft Azure このエントリーを含むはてなブックマーク


丸山先生のPDC報告です。


ロスアンゼルスで開催されている、MSさんのイベント、Professional Developer Conference 2008に出ています。
他のメーリングリストに投稿した内容ですが、次回の僕のCloud研究会での報告に関連していますので、ダブル・ポストします。
---------------------------------------------------------------------------------------------------

初日のレイ・オジー(チーフ・ソフトウェア・アーキテクト)のキーノートは、
すべて、同社のクラウド製品、Azure Software Platformにあてられました。MS
が、公式にCloudサービスへの参入を表明したことは、とても大きな意味のある
ことだと思います。すでに、日本のメディアにも、いろいろな紹介が行われてい
ると思いますが、僕には、とても面白いものでした。

どんなものかといわれると、AmazonのEC2/S3+SimpleDBにGoogleのGoogle App
Engineを足して、もっと、使いやすくしたようなものです。サービスの中核は、
前から僕が予想していたように、SSDS(SQL Service Data Service)によるデー
タ・サービスです。

AmazonのEC2との対比で言うと、EC2が潜在的には前提にしていた、Cloud上での
サーバやディスク等のリソース管理の機能を、明示的に、「CloudのOS」として
のAzureが担うことを明確にしています。EC2では、Cloudの利用者は、具体的に
は、AmazonのCloud OSが提供する、個々のマシンを利用するのですが、Azureで
は、MSのCloud OSであるAzureの提供するサービスを利用することになります。
同じだろうと思うかも知れませんが、その違いは、大きいのです。

Google App Engineでも、利用者は、知らないうちに、Googleの提供するCloud
サービスを利用しているのですが、Azureでは、Cloudサービスの利用は、もっと
Cloudのリソースの利用に、自覚的です。例えば、EC2のように、個々のサーバ利
用を意識する必要はないのですが、Webのサーバをいくつ立てて、ビジネスロ
ジック用のプロセスをいくつは知らせるかというような設定が、Azureでは可能
になります。その点では、僕のCloud研究会の第一回の資料で指摘した、「Multi
-TierアプリのScale-out戦略」の図を見てもらうと、そのイメージはわかりやす
いと思います。Cloud内のいくつかの基本的なサービスのブロック(ロードバラ
ンサ、Web、Worker)のコンフィグが、AppLogicのように、簡単にできます。

この点では、Azureは、Google App Engineと同様に、エンタープライズでの開発
の中心である、Webアプリの開発のCloud化に、明確に焦点を合わせています。
MapReduceのような、汎用の分散アルゴリズムのサポートは、ありません。た
だ、Cloudで動くWebアプリの開発、deploy、実行は、Google App Engineより、
はるかに、簡単で、直観的です。

余談になりますが、キーノートでは、Cloud上で動く、Hello Worldのデモが行わ
れたのですが、これはちょっとわかりにくかったかも。だって、Hello Worldの
文字列が、直接ページに埋め込まれているのか、あるいは、隣のサーバが返す
ページに入っているのか、はたまた、Cloudから来たものかは、見ている人には
わかりませんからね。もっとも、このあたりは、Cloudを概念的にとらえること
の難しさを示しているのかも知れません。

その他、いくつかの特徴があります。思いつくままに触れると、

・Cloud アプリの開発環境の提供。
・Cloud上でのユーザの認証、アクセス管理。(OpenIDを使うのだと思います)
・既存のWeb Appsをクラウド化する手段の提供。
これは、.NET Servicesという製品群にまとめられていますが、以前の
BizTalkの機能をまとめたものですね。個人的には、SOAの発展形としての
Cloud利用という切り口が明確で、面白かったです。
・Cloud内のサービスの連携に、非同期なメッセージングを使うとか、Queuを
使うという話も、なるほどと思って興味深いものでした。もっとも、この
あたりは、数年前から、SOAの世界では言われてきたもので、大事だと思い
つつ、僕は、爆睡してしまいましたが。
・MSのOffice製品群のCloud利用を可能にする、SharePointとの連携。
・企業内(On Premise)既存サービスと、Cloudとの区別と関連付け

最後の点は、IBMさんにしろOracleさんにしろ、既存の製品群とCloud利用が、あ
る点では競合するという問題を、MSさん自身も抱えているという点を示している
訳で、面白い問題だと思っています。

聞いていたひとの反応は、「地味だった」という声が多かったように、思いま
す。以前、マルメでも書いたのですが、このPDCの焦点の一つが、MSのCloudへの
参入の表明にあるという意識は、事前には弱かったのですが、まだ、ちょっと実
感がわいていないようです。(Vistaの後継としてのWindows 7に対する関心の方
が、ずっと高いですね) 講演者も、例えば、Cloudにとって、本質的に重要
な、SSDSのScale-outする特徴に、踏み込まないまま、SSDSの説明をしようとし
たり、MS内部でも、明確な語り口が統一されていないようなところもありました。

ただ、初日のキーノート、まるまるすべてAzureに使ったわけで、それなりに関
心は高まったとは思います。Bill Gatesが引退して、はじめてのPDCらしいので
すが、僕には、別の意味でも、歴史的な会議になるだろうと思っています。

http://www.microsoft.com/azure/solutions.mspx
に、すでに、情報が出ています。是非、チェックしてください。

P.S. CloudのSOA利用のセッションは、激しく寝てしまったのですが、
寝ようと思って出た、「C#の未来」というセッションは、とても
面白かったです。C# 4.0って、Dynamic言語に対応するんですね。
「静的な型として、dynamicという型を導入するんだ」という彼の
説明に、つい笑ってしまったのですが、なかなかの人でした。

火曜日, 10月 28, 2008

【本日の嵌り】 SVNレポジトリを作成する このエントリーを含むはてなブックマーク


SVNレポジトリを最初から作りたい。さあ、どうしよう。

まず、

mkdir /usr/local/svn/repos
svnadmin create /usr/local/svn/repos


とやってsvnのdbを作成する。(bdbとかfsとか細かいことは省略)

実際に作業したいフォルダに移動して、
home/hoge/svnの上で


svn import file:///usr/local/svn/repos -m "" 


とするとインポートされる。次に、


svn co file:///usr/local/svn/repos      


とやってチェックアウトすると


  home/hoge/svn/repos


ができるので以後、


svn up /home/hoge/svn/repos/fuga.csv    アップデートや
svn ci /home/hoge/svn/repos/fuga.csv -m "" コミット


などができるようになる。これで解決。

月曜日, 10月 27, 2008

【EC開発体験記-EDI-】 SVNを業務で使い倒す このエントリーを含むはてなブックマーク



 EDIで外部システムとの連携を考えるときに最も注意しなければならないのはデータの不整合である。これは、送ったはずのデータが送られていない、あるいは、受け取ったはずのデータがなくななるといったことであるが、基本的にこういったものは「性悪説のスタンス」で設計した方がよく、むしろ、日常茶飯事でトラブルが起きるぐらいの覚悟でいるとちょうどよいと思われる。
 
 ということで、EDIをSVNで管理することを考えてみた。SVNといえば、ソースコードやドキュメントの履歴管理によく使われる、開発者にとってはお馴染みのバージョン管理ソフトである。これをEDIに活用して、送受信データをいつでも再送/再受信できるようにしようというわけだ。特に人手を介して入手するマスター類の登録などでは真価を発揮する。いつも送った送らないで揉める人間系でもSVNの履歴には反論の余地がない。SVNを業務アプリケーションに使うことに違和感を覚える方も多いと思われるが一度利用してみることをおすすめする。


<SVNによるEDI> 


<SVNをEDIで使うメリット>

1)一貫性確保 ・・・ コミットしたものと送受信したものが同一であることを保障できる
2)実績確認  ・・・ いつ何をどれくらい送受信したか実績を確認できる
3)リカバリ対応・・・ 履歴から過去データを取り出せるためいつでも再送できる

<SVNをEDIとして使うケース>

1)物流      ・・・ 物流業者への出荷指示データの送信と出荷済データの受信
2)商品マスタ  ・・・ 商品部からの商品マスタの受信とホームページへの反映
3)在庫管理    ・・・ 倉庫からの在庫データの受信とたな卸しデータの送信


 一貫性が保障できて実績が確認できればエビデンスとしても利用できる。対外システム側との取り決めが必要だが、例えば、SVNファイルを正と取り決めておけば、物流業者の請求金額についてはSVNファイルの「出荷済」のレコード数をカウントすることで確認できる。また受け取ったデータをそのままコミットしておけばトラブルがあったときにリカバリーも確実に行えて原因を突き止めることが容易になる。
 EDIでは、まず、送ったものと受け取ったものを確実に管理することが重要である。基本はトランザクション処理と同様の考え方で、成功でコミット、失敗でロールバックとすればよい。以下の例では、SVNのDIFFをとり新規分があればupdateして送信するが、失敗すればリビジョンを元に戻すという動きをする。これは実際に使っている全銀システムと通信するコードの抜粋である。全銀ISDN回線で話中で数回に1回の確率で失敗するようなFuck!な連携システムでもSVN履歴管理はとても有効である。


# 未送信分チェック(送信すべき新規のファイルがSVNにあるかどうかをDIFFを使って調べる)
DIFF1=`svn diff --revision BASE:HEAD hoge.dat`
if [ $? != "0" ]; then
    echo [`date`] ファイルが未更新
else
    if [ -n "$DIFF1" ]; then
      echo [`date`] ファイルが更新されています
      svn update hoge.dat

      # 送信処理
       ・・・
      # 送信成功?
      if [ $? != "0" ]; then
        # もし送れなかったらエラーを報告してリビジョンを1つ前に戻す
        echo [`date` ] エラーが発生したため処理を中断します。
        svn update -r PREV hoge.dat

      else
        # 送信成功
        echo "送信成功!"
      fi
    fi
fi



 また、TortoiseSVNとの組み合わせにより、Windowsフォルダを操作する感覚でSVNを扱えるのも嬉しい。これにより、オペレータさんなど、SVNコマンドの特別な知識がない方でも扱えるようになる。オペレータさんは通常はデータを生で見ることはあまりないが、エラー発生時のファイルの状態やコミット時間、件数を報告してもらうとトラブルに迅速に対応できるようになる。

 たまに、SVNのdb内で不整合が発生してエラーになることがあるが大抵svnadminコマンドでリカバリーできる。


/usr/bin/svnadmin recover /usr/local/svn



 SVNエラーは大きいファイルをhttp(https)でコミットしようとすると起きやすいため、svn+sshで接続することをおすすめする。実際にsvn+sshで50万件の商品マスタを毎日コミットしていたが特に問題なく運用できていた。
 TortoiseSVNからsvn+sshで接続するのは以下のように設定するとよい。






 ちなみに、弊社では上記のSVN EDIソリューションを、Reflexパッケージとともに提供していきたいと考えている。SVNは内部的にberkeley dbを使用しているため再販するためにはOracleライセンスが必要になるが、弊社はReflexパッケージのなかでライセンス許諾権を結ぶことでOracle社と基本合意している。(11月中に締結予定)
 
<関連>

【EC開発体験記-スケーラビリティ-】信頼性とジレンマ
【EC開発体験記-トランザクション処理-】古くて新しい永遠のテーマ

金曜日, 10月 24, 2008

【クラウドコンピューティング】 クラウドの本質と動向 このエントリーを含むはてなブックマーク


今、あるお客様にクラウドの提案を行っている。
クラウドによって何か新しいことができそうという期待感がある一方で、クラウドという言葉がバズワード化する中で、かえって誤解が多くなって苦戦を強いられている。
今回はそのことについて説明したい。

クラウドに限らないことだが、「XXとは何か」といった議論をするのが私は大嫌いだ。
もし社内でこういった議論に明け暮れているようなら時間の無駄だと思った方がいい。こういった議論は大体、声の大きな人が勝つことになっているからだ。

しかし、お客様に対しては、こちらに目を惹きつけないといけないので、バズワードであってもクラウドという言葉を使いたくなる。ちなみに、バズワードは、Wikipediaにはこのように説明されている。

その分野に明るくない人にイメージだけを押し付けたり、「よくわからないが凄そうなこと」を想起させることを目的とした宣伝文句として使うことも可能であり、言葉だけが先歩きして広まることも多いため、事情を知らない多くの人は価値のある言葉として捉えてしまうことがある。

要は、お客様の都合のいいように解釈してもらって、興味をもってもらえたらそれでOKということなのだが、前述したように、具体的な提案の段階に入ると先入観が邪魔をして誤解だらけとなり、なかなか前に進まなくなる。

具体的には、大規模なトランザクションを抱えているお客様への「企業内クラウド」の提案を行ったのだが、それが、クラウドという言葉とAmazonやGoogleを強く結びつけると、基幹系ではちょっとね、と短絡的に受け取られてしまった。
 クラウドを説明するときのAmazonやGoogleなどのPaaS/SaaSのメッセージが強すぎるのも悪いのだが、そもそも、提案する側がよく整理できていないままミソクソに話してしまったことが一番悪い。というわけで、自分なりに「クラウドとは何か」を整理することにした。

まず、
クラウドの目的と要件

 1.どんなにトランザクションが増えてもスケールできること
 2.その大規模なシステムを安く利用できること
 3.サービスレベルを保証できること


 要は、サービスレベルを保証しつつスケールできるシステムを安く提供することが第一の目的である。
サービスレベルの保証とは、主にパフォーマンスと耐障害性の保証で、トランザクションの量が増えてもパフォーマンスが劣化しないようにすること、また、一部のノードが故障しても動的なノードの追加/削除機能により回復できてダウンタイムを最小にできることである。

実際に、AmazonやGoogleなどのPaaSなどを利用したり、Hadoopなどのオープンソース分散システムを活用することで、サーバやソフトウェアの利用コストを削減できる。また、本日、AmazonのEC2が正式サービスになってSLA稼働率99.95%保障という発表を行っている。(EC2は正式サービスじゃなかったのね・・)

これらに共通するアーキテクチャーが、Scale-outモデル。Scale-outできれば、高価な高性能なマシンは必要なく、比較的安価なマシンで十分である。ただし、これまでのSMPやクラスタリングによるScale-upのアーキテクチャから、Grid的なScale-outのアーキテクチャへの移行が必要となる。

また、多くはRDBではなくkey/valueで格納する方式をとっている。
key/value方式における検索技術では、memcachedなどの分散メモリー・キャッシュ技術や、MapReduceなどの並列分散処理技術が注目されている。

次に、
クラウドの提供手段

 1.企業内クラウド
 2.PaaS/SaaS型クラウド
 

 OracleのCoherence、IBMのWebsphere XD Data Gridといった、Scale-outモデルのエンタープライズ製品がある。
これらは、キャッシュ機能を前面に出しているものの、key/valueで格納するというアーキテクチャーになっておりScale-outできる。ベンダはこれらを「企業内クラウド」と呼んでいる。
年々増加するトランザクションに対応するには、Scale-upのアーキテクチャではいずれ破綻すると考えられるので、Scale-outアーキテクチャへの移行は早い段階で準備すべきである、というのが企業内クラウドのキーメッセージ。
 また、現在すでに金融系の大手で大量なトランザクション処理を安価なクラスターで、高信頼に実施している実績があり、クラウドというイメージよりは基幹系そのものというイメージになってきている。(By IBM Sさん)
 特に、最初はお客様のシステムにキャッシュを目的で導入したが、最後はシンプルなAPIで統一された企業内クラウドとしての形になって、DB性能がボトルネックにならなくなった、という結果は非常に評価できる。(By Aさん)



 PaaS/SaaS型クラウドは、AmazonやGoogleなどが提供するサービス。企業内クラウドとアーキテクチャは同じであるが、従量制サービスであることが違う。
また、格納する場所が自社のデータセンターか、あるいは、AmazonやGoogleという雲の上のストレージかの違いはある。
 下図は、ECサイトのクラウド利用例であるが、商品詳細ページや画像といったものをクラウド上に置くことで、検索レスポンスの向上、および、自社サーバへの負荷軽減をもたらす。商品情報は、原価などを除けばセキュリティを心配する類のものではなく、基本的に人の目に触れさせるべきものなので社内のサーバにおく必要はない。



最後に、

クラウドの本質と動向


 1.抽象的に定義されたデータベースサービスへのアクセス手段である
 2.企業内クラウドとPaaS/SaaS型クラウドの融合


 クラウドで重要なのは、データの格納場所というよりは、データの検索、更新といった処理を含めて、サービスとして、データベースのサービスを受け取るというところにある。(By M先生)
クラウドを抽象的に定義されたデータベースサービスへのアクセス手段と定義するのはどうだろう。



 企業内クラウドは、最初は大手ベンダーによるキャッシュ目的で導入され、最後はアーキテクチャ変更をもたらす。
柔軟にScale-outする複数の比較的安価なサーバー構成のもとで、企業内クラウド製品を提案できれば、お客様のニーズにもこたえられると思われるが、ベンダーにとって安いサーバをいれてビジネスになるかどうかは疑問である。ただ、Cloudが本格的に立ち上がるまでの、この数年の間は、こうしたスタイルで、ベンダーさんが「企業内クラウド」で頑張るしかないだろう。
そして、数年後には、これらのシステムををベンダーさんのクラウドが引き取ることになるかもしれない。(By M先生)

 基幹系システムを雲の上に置くなんてナンセンスである、なんて思われない日が将来やってくるのだろうか。

<関連>
クラウドを15の否定で表現
セキュリティは最後の難問題

Object Grid(IBMのWebsphere XD Data Grid)に関する情報:

WebSphere
清水さんの資料 オブジェクト・グリッド


Object Gridは、Billy Newportという方が作ったもの。(IBM社員らしくない天才といわれているらしい)
Billy Newport's blog
OGのすべての説明が書かれているWikiがあります。例えば、EntityManagerに関しては:
Entity Manager

ReferenceタグやSampleなどのタグから色々な情報に移れます。
読みやすいのは、例えば、
Reference Sample
でしょうか。

月曜日, 10月 20, 2008

【雑記】 書けないことを書いてみる このエントリーを含むはてなブックマーク


 先週から今週にかけてイベント盛りだくさんだったのでネタは豊富にあるのだがなぜか書けない。Inputが多いとOutputできないといった方がいたがそれは本当のことだ。

今、頭の整理中。

1)クラウド研究会の話(Oracle Coherence、楽天ROMA)
2)JUGGの話(JavsScript高速化、Android)
3)企業内クラウドを提案してみて思ったこと

火曜日, 10月 14, 2008

【本日の嵌り】 MySQLバックアップファイルから部分的に復元する このエントリーを含むはてなブックマーク


 あるテーブルを復元したいのだが、mysqldumpで取っているバックアップファイルから復元すると、すべてのテーブルが対象になって何時間もかかってしまう。さあ、どうしよう。
 
 そこで、csplitでファイルを分割して該当のものだけ復元することにした。
 まず、egrep 'CREATE TABLE' xxxx.sql で何個目にあるかを調べる。xxxx.sqlはmysqldumpで取ったときのバックアップファイルである。

[hoge@hoge batch]$ egrep 'CREATE TABLE' xxxx.sql
 CREATE TABLE `aaaa` (
 CREATE TABLE `bbbb` (
  ・・・
 CREATE TABLE `koreda` ( <= 35番目



次に、以下を実行して分割する

[hoge@hoge batch]$ csplit xxxx.sql /^DROP/ {*}



そこから特定のテーブルのみ復元するには、35番目の分割ファイルだけを指定すればよい。xx35はcssplitが作成する35番目の分割ファイルである。

[hoge@hoge batch]$ mysql --user=hoge --password=xx sampledb < xx35



これで解決。

土曜日, 10月 11, 2008

【EC開発体験記-出荷-】 ヤマトB2と連携する このエントリーを含むはてなブックマーク


 今回は出荷管理システムについて説明する。

 受注管理機能や決済機能が充実しているECサイトは多いが出荷機能が備わっているものは意外と少ない。楽天やYahooなどの大手のモールであっても、実際には受注だけが可能であり、出荷のためには別途システムを使わなければならないのが現状である。通常は、その日に受付けた注文をモールからEXPORTして出荷管理システムにIMPORTしなおすといったことをしなければならない。また、実際の商品の出荷では送り状が必要になるため、送り状発行ソフトとの連携も必要になる。

このように出荷管理システムでは以下のようなモールには備わっていない機能が必要となる。


1.受け付けた注文を取込む機能
2.送り状発行ソフトに渡す出荷データを出力する機能
3.(送り状発行ソフトから)出荷済となったものを取込む機能
4.納品書発行機能
5.ステータス管理機能(受付、確定、出荷済、キャンセル、配完、返品など)

また、必須ではないが以下のような機能も求められる。

6.確定時のカードオーソリ機能
7.受付時と出荷時に案内メールを送信する機能


 送り状発行ソフトは、4辺160㎝までの小物商品であればヤマト運輸のB2という送り状発行ソフトを使うと便利である。B2には、顧客データの一括取込機能があるので、出荷管理システム側でB2の指定するレイアウトにしたがってCSVを出力する機能を用意すればよい。また、ステータスの一括出力機能もあるため、出荷管理システム側で、出荷済となったステータスデータを取込み、商品のステータスを一括で更新する機能を持たせればよい。

B2 顧客データの一括取込

<B2用CSVを出力PHPサンプル>


# データ出力
$n = 0;
while ($n < mysql_num_rows($res)) {

  $l = array();

  # CSV編集
  $l[] = date('Ymd');   # 出荷日
  $l[] = $d[$n]["odrno"]; # 受注番号
  if($d[$n]["pay_flg"]=="1") {
    # 代引受注のとき
    $l[] = "2";
  }else {
    # その他
    $l[] = "0";
  }
  $l[] = "";
  $l[] = "";
  $l[] = $d[$n]["to_tel"]; # 届先電話番号
  $l[] = "";
  $l[] = $d[$n]["to_name"]; #届先氏名
  $l[] = $d[$n]["to_zip"];  #届先郵便番号
  $l[] = $d[$n]["to_add1"] . $d[$n]["to_add2"] . $d[$n]["to_add3"];  $l[] = ""; #届先住所
  $l[] = "";
  $l[] = "";
  $l[] = mb_convert_encoding("様", "CP932","UTF-8");
  $l[] = "";
  $l[] = "0311112222"; # 電話番号
  $l[] = "";
  $l[] = mb_convert_encoding("XXXX商店", "CP932","UTF-8"); # 送主名
  $l[] = "1050014"; # 送主郵便番号
  $l[] = mb_convert_encoding("東京都港区芝3-X-X","CP932","UTF-8"); # 送主住所
  $l[] = "";
  $l[] = "XXXXXXXXX"; # B2契約番号
  $l[] = "";
  $l[] = "1";
  $l[] = $d[$n]["product_code"]; # 商品コード
  $l[] = mb_convert_encoding("XXXXご注文商品", "CP932","UTF-8");
  $l[] = "";
  $l[] = "";
  $l[] = "";
  $l[] = "";
  $l[] = "";
  $l[] = $d[$n]["sitei_date"];
  if($d[$n]["sitei_class"]=="1") {
    # 午前中指定のとき
    $l[] = "0812";
  }else {
    # それ以外    
    if($d[$n]["sitei_class"]=="2") {
    # 午前中指定のとき
      $l[] = "1214";
    }else {
      if($d[$n]["sitei_class"]=="3") {
      # 1214指定のとき
        $l[] = "1416";
      }else {        
        if($d[$n]["sitei_class"]=="4") {
        # 1618指定のとき
          $l[] = "1618";
        }else {
            if($d[$n]["sitei_class"]=="5") {
          # 1820指定のとき
            $l[] = "1820";
          }else {
            if($d[$n]["sitei_class"]=="6") {
            # 2021指定のとき
              $l[] = "2021";
            }else {
              if($d[$n]["sitei_class"]=="7") {
              # 午前後指定のとき
                $l[] = "0017";
              }else {
              # その他
                $l[] = "";
              }
            }
          }
        }
      }
    }    
  }
  $l[] = $d[$n]["amt"]; # 金額
  
  fwrite($h, join(",", $l) . "\r\n");  # MS改行コード
  
  $n ++;
}



木曜日, 10月 09, 2008

【EC開発体験記-Mashup-】 商品情報とカテゴリの正規化 このエントリーを含むはてなブックマーク


 暮らしのデザインサイト(http://kurashide.com)がリニューアルオープンした。これに関連して今回は商品情報とカテゴリの正規化について述べたいと思う。

 サイトの設計方針の一つはMashupである。つまり、自己完結したEntityの集合であるResourceをMashupして1つのページに編集する仕組みを取り入れること。また、ResourceをRESTfulにしてCoolURIとなるように設計することである。

例えば、サイトでは以下のようにCoolURIとなるように設計している。


1) http://kurashide.com/item/4979247561321.html のように、item/{JANコード}.htmlでJANコードさえ分かれば簡単に商品ページを表示できる。

2) http://kurashide.com/category/sofa_zaisu_cushion/sofa/systemsofa/ のように、category/{大カテゴリ}/{中カテゴリ}/{小カテゴリ}といったように、直感的なURL指定でカテゴリに属する商品の一覧を表示できる。また、{小カテゴリ}を省略すると{中カテゴリ}に属する/{小カテゴリ}の一覧が表示され、さらに{中カテゴリ}を省略すると{大カテゴリ}に属する{中カテゴリ}の一覧が表示される。


 Resourceの設計ではまずEntityの正規化を考える。お互いに干渉するところのない、自己完結した集合を見いだすのがEntityの正規化である。例えば、単品の詳細ページとカテゴリは別々のEntityにできる。単品詳細ページでは商品の詳細情報をEntityとするが、カテゴリではEntityのURIの集合という形で定義する。(中カテゴリは小カテゴリの集合であり大カテゴリは中カテゴリの集合となる。)
 このように単品の詳細ページとカテゴリは、同じ商品に関する情報であるが、お互いに干渉するところがないように、敢えて1つに括らないようにする。 また、そうすることで、商品情報プロバイダ、カテゴリプロバイダといったように、それぞれのサービスプロバイダを立てることができる。プロバイダでは単にXMLやJSONで出力できればよい。HTMLページを生成するのはMashupの仕事であり、それをPHPリクエスタが行っている。Reflex設計的に整理すると、サービスプロバイダがResource層、PHPリクエスタがMashup層、ブラウザがView層となる。
 この考え方は、ソーシャルブックマークサービスと似ている。ブックマークサービスはHTMLページを管理するのではなく、リンクされるURLとそれに紐づくタグやコメントなどを管理するだけである。

 Reflex設計による疎結合なサービス化がもたらすメリットは、主に並行開発ができるようになること、スケーラビリティが高くなることの2つである。特に商品情報とカテゴリについてはクラウド化などを見据えたときに非常に有効になる。クラウドではセキュリティ確保の心配があるが、そもそも商品情報は(原価などを除いて)人目に触れさせるべき情報なのでクラウドにフィットすると思われる。さらには商品詳細を静的なものとして分離してAmazonS3に置けばCDS対応もしているのでレスポンス速度向上も期待できる。ただし、商品詳細には商品ごとにお届け目安日や在庫数など、リアルタイム表示が要求される項目もあるので、ページ表示後にJSONPで再検索するなどの変更が必要となってくる。一方、お届け目安日の取得サービスや在庫数検索サービスなどは既に作成されているので、そのまま利用できる。

 ちなみに、これらのサービスプロバイダはReflexで構築されている。 

火曜日, 10月 07, 2008

【Reflex】 小さな政府によるガバナンス このエントリーを含むはてなブックマーク


 タイムリーな記事を発見。

完璧なSOAなんてあり得ないからこそガバナンスが重要 - ミコ・マツムラ氏

 先日の記事のコメントで「小さな政府」という表現でどのようにガバナンスを考えればよいかを説明したが、ミコ・マツムラ氏も同様の意見をお持ちのようである。

理想的な実装が難しい現実


最初に述べたように、SOAのブループリント策定はうまく行ってもIT実装は難しい、この理由はごく簡単です。ユートピア(理想郷)の青写真を描くだけなら、つまるところ、誰にでもできるわけです。だが、それを実現するには、"部族間主義"のような人間のもつ自然な本質を越える必要があります。一ベンダがそこまで企業の内部に立ち入るのは難しい。


大きな開発は失敗するリスクが高い


何千とあるSOA導入失敗例を見てきてつくづく思うことは、SOA導入とは「ロケットの発射」に非常によく似ている、ということです。言うまでもなく、ロケットというのは非常に大きなシステムで、それを発射させるにもさまざまな仕組みが必要です。そして発射が失敗するとき、たいていは大きなシステムの中にある小さなコンポーネントどうしの依存関係に問題があります。SOAも同じです。サービスそのものの大きさ(粗さ)よりも、あるサービスは、別のどのサービスにどれだけ依存しているのか、それに対する認識があいまいだと失敗も生じやすくなります。


個別に柔軟に対応することが重要


トップダウンか、ボトムアップか -- SOAに限らずITシステムの導入/リプレースを議論する際、よく登場するフレーズだが、結局のところ、そのどちらであっても組織内から100%の合意が得られることはまずあり得ない。トップから押しつけられた、下の人間が勝手にやった、といった類の言い訳はいつの時代、どこの組織、どのソリューションを使っていても起こるものである。
だが100%は無理でも、少なからず多くの人々が気持ちよく使えるITシステムがあるとしたら、それはやはり、ある一定のルールの下で運営されていることが条件になるだろう。そしてそのルールは、時代と組織に合わせて柔軟な変更が可能であることも求められる。SOAガバナンスの基本はそこにある。


月曜日, 10月 06, 2008

【Reflex】 RESTfulな新3層アーキテクチャ このエントリーを含むはてなブックマーク


 従来の典型的なWebアプリの設計では、下図のように主にサービス層がEntityを包含するイメージとなる。オブジェクト設計をすることで、Serviceを見いだすという段取りとなるが、ここでも述べたとおりうまくいっていない。



 一方、Reflexでは、ここ で説明したように、オブジェクト設計をやらず、ドメインを単なるデータの集合とみなす。Entityという形で取り出したデータをシステム全体で使用し、また、サービス(Blogic)を各層で実装するため下図のようなきれいな3層構造となる。




 このような新しい3層アーキテクチャは、RESTfulな設計思想に基づいている。つまり、RESTのような疎結合APIがなければ実現できないモデルである。特に、AJAXやMashupの概念は重要で、サーバでHTMLを生成するのではなくクライアントとはデータだけをやりとりする。

 APIをやめデータ構造に着目するより抜粋

 これは要するに、システム共通のentityを定義して、それをやりとりすることだけに注力しようということだ。SOAPやAtomPubなどのAPIを介さないし、そのような共通APIに該当するものを敢えて開発しない。しかし、最低限は必要になるので、先に挙げたリソース志向を踏まえて定義する。具体的には次のような非常にシンプルなAPIを定義することになる。

<API例(entityはリソースの1インスタンス)>

entity = create(entity);
entity = retrieve(entity);
entity = update(entity);
entity = delete(entity);


<関連>
ヘテロ環境のインターオペラビリティを考える

土曜日, 10月 04, 2008

【JavaScript】 TABキーで移動後にFocus、Select このエントリーを含むはてなブックマーク


 複数の入力ボックスがある画面で、TABキーで移動させる際に、思ったところに移動できるよう細かく順番を指定したいことがある。そこで、JavaScriptを利用して以下のようなものを考えてみた。

TABをjavascriptで制御

1.入力ボックスの移動順に入力ボックスIDの配列を作成し
2.タブキーが押されたら
3.次の入力ボックスを取得して
4.focus()→select()


 order = ['input_box_id_01', 'input_box_id_04', 'input_box_id_02','input_box_id_03'...]
 if (window.event.keyCode == 9) {
  //_getNextCell()は次の順番を知るための自前関数
  var ele = document.getElementById(_getNextCell(order));
  ele.focus();
  ele.select();
 }



しかし、これだとShift+Tabで前の入力ボックスに移動できない。(必要であれば実装してあげないといけない。)また、フォーカスは移動するが、select()がかからないことが時々あるので強引にHTMLのタグにonfocus="this.select();"を付けて対処する必要がある。これはHTMLのすべてのInputboxに付けてあげなければならない。

HTML側で使っていたタグ

 <input onblur="control(this.id, this.value);" type="text" id="hoge"
 <span style="font-weight:bold;">onfocus="this.select();"</span>>



いろいろ面倒なので、JavaScriptの利用をやめてtabindexに順番を入れてあげるようにした。
これであれば、TabキーもShift+Tabキーもブラウザが勝手に解釈して動かしてくれるので楽だ。

tabindexに順番を入れる


1.入力ボックスの移動順に入力ボックスIDの配列を作成し
2.入力ボックスのtabIndex属性に順番をセットして
3.onfocusイベントにselect()を追加してあげる



 order = ['input_box_id_01', 'input_box_id_04', 'input_box_id_02','input_box_id_03'...]
 for (var i = 0, l = order.length; i < l; i++) {
  //ele[i]は入力ボックスオブジェクトを予め格納しておいたもの
  ele[i].tabIndex = i+1;
  ele[i].onfocus = function(e) {this.select();}
 }



 
© 2006-2015 Virtual Technology
当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。