記事一覧

2010年12月15日水曜日

ニュースリリースから思うこと ~ 益々個人の時代なのか ~

最近立て続けに以下のニュースリリースを行いました。

11月25日人材育成のためのスキル管理フレームワーク構築ツール「Enterprise Skills Inventory」(記事例:Cnet
12月7日『101will』のバージョンアップ ~ Windows 7に対応(記事例:Asahi.com

リリースは日本オラクル時代にお世話になっていたマーケティング部門の人で現在独立されているT川さんの助けを借りて行いました。
多くのメディア(それぞれ50社ぐらい)に取り上げられて掲載されたことはT川さんのおかげです。

インターネット全盛の現代では弊社のような小さなベンチャーでも時代にあったマーケティングスキルを保持した人の助けを借りれば非常に効果的にPRできることがわかります。
以前であれば弊社のような小資本の会社がこのようなことを仕掛けるのは難しいことでした。

一般的な広告業者にPRをお願いするのはとても高価でお願いすることなどほとんど考えられませんでした。
Oracleのイベントなどには在職中かなり深くかかわっていたのでコスト面など身にしみて理解していました。

ところが最近では情報発信できる環境がいろいろあるので大きな会社にPRを依頼するまでもない状況になっているなぁと思います。どうやったら効果が上がるのかは、わからなくても個人で独立されて広告コンサルティングをされている方は多数います。
今までは大企業の中にしかいなかったこのようなプロの方のアドバイスを受けることで小さいコストで効果的なPRができる環境が出来上がっているのです。

広告会社は今までメディアと一体となって、メディアというインフラの上で企業のPRを支援していたわけですね。
テレビや新聞などは有限のインフラといえるので広告できるキャパも限られている。
したがって掲載コストもほぼ広告会社さんの言い値のような感じでしたね。

ところがインターネットがインフラになると安ければ安いなりに誰でもPRすることができるようになりました。
何がヒットするかも非常に不確実な時代なので、いろいろと手続きを踏んで大金はたいてPRすることもナンセンスになって来ているのでしょう。
テレビコマーシャルなどを見れば気が付いている方々は大勢いることと思います。

ちょっとだらだらと書いてしまいましたが、時代はますます個人の時代になっていく過渡期であり、継続を切らさずに自身のコアスキルを時代に合わせて変化させつつ伸ばしていけば、きっと良い時代になるのだろうと思います。

インフラは限りなくただに近づき、利用コストは運用管理サービスへの対価。
付加価値サービスは、各分野のプロフェッショナルを選択して直接的に対価を払う。

これらの実現は的確な情報への可能なアクセスが大変重要になりますが、SNSが大きな役割をしてくれそうですね。

良いものだけが選択されてインフラとなる。
相互に助け合う(善良なプロを紹介し合える)環境ができる。
こうなってくると大きすぎることはハイリスクですかね。

明るい個人の時代を歓迎します!

若者は大企業に入れないからといって決して悲観してはいけない。
置かれた立場で自分を磨こう!

私もお役御免にならないようにガンバりまーす。(^o^)/~

2010年11月25日木曜日

【PR】企業における人材育成のためのスキル管理フレームワーク構築ツール リリース・ニュース

本日、ここのブログで何度か記載させていただいた製品の正式リリースを行いました。

製品名Enterprise Skills Inventory (ESI) 

まずはこちらのニュースリリースをご覧ください。

製品情報の詳細サイトも構築しましたのでぜひご覧ください。

デモサイト利用や無償プロトタイプのご用命もお待ちしています。

※プロトタイプの対応は先着順で順次対応させていただきますので予めご了承ください。m(_ _)m


【問い合わせ先】

株式会社ワン・オー・ワン
担当 : 金岡 竜夫
TEL : 03-3239-8313
E-Mail: esi@101s.co.jp


このブログでは小職一押しの製品ポイントをお知らせいたします。(^v^)/

◆カスタマイズの容易さ => 他社との差別化はあなたのアイディア次第!

  • IPAが規定するITスキル標準など公式フレームワークだけでなく自社にあった人材像をマスタ設定で柔軟に構築。
  • スキル分類やスキル設問の追加変更も自由自在
  • 基本的なカスタマイズはノンプログラミング

◆スキル・コンテンツの豊富さ => 標準コンテンツを参考に失敗のない人材育成!


◆業務と連動したスキル構築用機能 => 業務や既存教育制度とのシームレスな連携!素敵!

  • プロジェクト連動(業務)
  • 研修受講連動
  • 自己啓発連動(自己啓発問題構築機能)

業務連動が各自のスキル習得のリアリティを格段に高めます!


現在のスキル管理は現状把握のための登録システムになっているのでは?

ESIを使ってキャリアパスや短期目標に向かった日々の成長をいつでもビジュアルに確認できる管理フレームワークを構築することで働く人のモチベーションUPと企業全体の戦力アップが図れるのではないでしょうか?

ご用命はお気軽に!
全国各地どこへでもご説明にお伺いいたします。

代表取締役 二階堂隆

2010年11月23日火曜日

Enterprise Skills Inventory リリース裏話

2010年11月20日に弊社の新製品、戦略的人材育成を可能にするスキル管理システム「ESI」をリリースしました。

本製品は弊社の企業色からすると異色の製品です。

開発の発端は、日本オラクル時代の一時期の上司でもある現株式会社スキルスタンダード研究所(SSI)代表の高橋さんとの会話からでした。

高橋さんとは、お互いに前職を離れてからも定期的にお会いさせていただいて、うまいものを食べたり飲んだりの、いわゆる「飲み友達(この言い方は失礼ですが(笑))」でした。

ある飲み会で、めったにしたこともない仕事の話をちょっとしたことからとんとん拍子で弊社でプロジェクトを起こすことになりました。

あれから、かれこれ2年強が経過してようやく出来上がった製品です。

IT業界で人材育成というと「ITスキル標準(ITSS)」というのが有名ですが、高橋さんはこの標準化作業に経産省やIPAとともに尽力されていました。

当時、高橋さんから「ITSS」は定義もほぼ完成してIT企業には導入されたけど育成観点ではまだまだうまくいかされていない」とのことでした。

いろいろ聞いてみると標準化はあくまでも標準であり自社にあった仕組みを作るにはカスタマイズがほぼ必須とのことでした。またITスキルは技術者像の理想形をイメージしているので一般ユーザ企業のIT部門でもやや重厚長大になってしまう(そのためUISSという標準ができた)とのことでした。

標準を意識しながらユーザー要件にあったものをシステム化していくのはお金もかかるし、業務分析能力も必要でなかなか難しいテーマのようでした。

当時からITスキル標準準拠のパッケージは多数ありましたので、我々はそこをメインターゲットにせずにスキルを管理するというフレームワークを参考にしながら、ITSSも含めて、すべての業務に柔軟に対応できる製品化を目指しました。

またスキルを登録するだけの現状可視化にとどまらず、日々の業務や研修など育成に関連するものを連動して個人は無理なく業務スキルを習得できる仕組みを構築できるように製品化を進めました。

スキル管理システムとしてある特定のスキル(たとえばITSS)だけを管理するようにアプリケーションを開発するのは簡単なのですが、不特定多数のスキルを管理するアプリケーションとなるとそれなりに複雑になり結構大変な開発でした。

101NEO(当社独自のスクリプト言語(実態はServlet))で開発されたWebアプリケーションなので当初はカスタマイズも101NEOでと考えていたのですが。。より簡単にエンドユーザがアプリケーションをカスタマイズできるように、ブラウザからのシステム構成設定でユーザ要件にあったシステムが出来上がるような機能を持つ製品に仕上げました。

弊社若手を中心に進めたプロジェクトでここまでできるとは正直思いませんでしたが、大変うれしいい誤算(若手ごめん)でした(笑)
これからもどんどん便利にして、お客様にたくさん使っていただくよう、知恵を出してほしいと願うばかりです。

また、管理対象になるスキルコンテンツ(データ)は、長年蓄積しているSSIさんの高度なコンサルノウハウを利用させていただくという戦略協業をしているので、短期システム導入も実現できるソリューションが確立できました。

上記文章でスキルと一言で表現していますが、ESIが管理できるスキルは、業務に直接かかわるものだけでなくヒューマンスキルや資格など様々なモチベーションに関係する要素を視覚的に管理できる可能性を持っています。

使い方次第では労使双方にとってとてもメリットがあるような気がします。

製品のリリースに当たってはSSIさんから提供いただいたコンサルティングが成功の大きな要因になっています。
この場をお借りしてSSIの皆さんに御礼申し上げます。

p.s.
手前味噌でいろいろ自慢してしまいましたがぜひ一度ご覧くださいませ。m(_ _)m

2010年9月30日木曜日

本日の日経ビジネスオンライン記事「人材育成は経営そのもの・・」で思ったこと

日経ビジネスオンラインの記事タイトルとURL:人材育成は経営そのもの、人事と経営の融合が始まる


「人を成長させることが経営そのものになる」確かにその通りだな。。
「消極的学習者を積極的学習者に変貌させる」どうやって。。

最近人材と経営というテーマの記事を多く見かける現実は、人材育成というテーマをほぼすべての企業経営者が最重要視していることは間違いないようですね。
ところが育成を担当する部門の力の入れようは企業によって様々です。

弊社も人材育成向けのシステムを手掛けている関係上。。お客様にいろいろヒヤリングしてわかったのですが、みなさん悩んでいるということは共通です。

育成の方法にある程度確信をもって計画的に改善を積み上げている企業と、成果をあげられる方法に確信を持てないままとりあえず、研修受講や資格取得を推進している企業があります。
また何もできていない企業もたくさんあります。

共通の悩みを一言でいうと「どうやったら成果を示せるのかわからない」です。

社の方針として最重要テーマであることが掲げられて、もちろん重要なことは分かっているのに取り組んだ結果として成果を示せるのかが分からないということのようです。

人材育成のビジネス市場には、育成目的として有望とされている仕組みがいろいろあります。

各種研修・資格取得教育・コーチングなど

ただし、これらの仕組みを使うけれどもその結果としてどうなったのかを管理する方法を確立している企業はまだあまり存在しないように思われます。

管理をして初めて効果が可視化できます。

可視化するための管理とは。。何をしなければいけないのでしょうか?

企業は自社で必要な人材像をイメージしなければいけません。

できるだけ具体的に。。

具体的にするにはイメージした人材像が保有すべきスキルを定義する必要があります。

企業が欲するスキルはなんでしょうか?

もう少し細分化して部門が必要とするスキルはなんでしょうか?

部門の業務を明確に定義することで必要なスキルも明確に定義できるようになります。

スキルを保有しているかどうかは通常どのように判断されているのでしょうか?

特にスキルを管理する仕組みがない企業は、それぞれの部門長の頭の中にあることでしょう。

これら頭の中にあるスキルの判断基準を部門横断的にさらに進めて全社的に可視化を進め、蓄積していくことでスキル判定基準が出来上がります。

ここまでできたら占めたものです。

自社にはどんなスキルを保有する人がどれだけいるのか、本来必要とされるスキルでも人材として不足しているのはどんな人材なのか、など経営戦略を立案するのに必要となる重要な要素を正しく把握することができます。

会社が必要な人材像が可視化できれば個人のキャリアパスも目標として設定できるようになることでしょう。

NBオンラインが指摘している「消極的学習者を積極的学習者に変貌させる」ことも実現できるのではないでしょうか?

「こうなれば評価してもらえるんだ。」がわかるようになるわけですね。

このように人材像・スキル・タスクが明確に定義できている企業は競争を勝ち抜いていくことができる思います。

ただ漠然と現場単位で必要な人材をマネージャ判断だけで補強・維持するだけで競争力を向上させるには限界があります。

一日も早く自社に合った人材像とスキルの分析を始めてはいかがでしょうか?

以下、【PR】です。m(_ _)m

101では、ITSSやUISSというIT技術のスキル標準作りで実績を上げてきたスキルスタンダード研究所とともにどんな業界・業務にも適用できる人材育成のためのスキル管理フレームワーク構築ツールを開発してきました。

上記で述べた人材像・スキル・タスクは企業によって千差万別です。
それらを固定的な人材管理パッケージでは管理することができません。
それぞれの要素を企業要件に応じて柔軟に定義できるシステムインターフェースを備えたパッケージを利用することでローコストで要求満足度の高い仕組みが構築できます。

ご興味がある方はぜひご一報ください。

2010年8月3日火曜日

【PR】101 Enterprise Skills Inventory - 人材育成のためのスキル管理フレームワーク構築ツール

新しいパッケージ製品(Webアプリケーション)のご案内です。
※ご紹介PPTの画面キャプチャはデザイン後変更される予定です。

※2010/09/24 に資料更新しました。キャッシュされている場合はクリアしてご覧ください。

◆製品カテゴリ:人材育成管理

◆製品構成:

【ハード】
x86互換プロセッサPC(台数はサイジングにより決定)
【ソフト】
OS:Linux、Windows、Unixなどマルチプラットフォーム
APサーバ:Tomcat(デフォルト)などJavaサーブレットコンテナ
HTTPサーバ:Apache(デフォルト)など
Database:Oracle(Oracle Database Standard EditionOne)
※Oracle以外のDBは要相談(JDBC対応必須)

◆価格:

500ユーザ例)月額利用料 500円/ユーザ(ユーザ数応じて変動)

◆製品の特長

企業人材の育成管理に必要な人材スキルの定義、人材像の構成、人材スキルの判定メソッドが体系化
社員にとってもGood:各自のスキルの可視化(目標設定と到達確認)
経営者にもGood:人材ポートフォリオの可視化

カスタマイズは自由なので時代の変化に応じて自社に合った人材像管理を構築し継続した人材資産の管理が可能です!

どんな人材像の管理も簡単に手早くノンプログラミングで構築
企業独自の人材定義やスキル判定基準も自由自在
参照権限レベルは自由自在

◆管理可能コンテンツ

1)ITスキル標準(ITSS)
2)情報システムユーザースキル標準(UISS)
3)一般間接部門業務人材像(経営企画・人事・経理・法務・広報・総務など)
4)ユーザ独自の人材像(コンサルタントサービスありスキルスタンダード研究所と提携)
※上記1)から3)は定義済みデータをロード後即利用可能
4)は顧客企業に最適な人材像の定義を設計 > Webインターフェースよりデータを登録 > 利用

ご興味がある方はお気軽にお問い合わせください。

補足)
ITSSとはITスキル標準といってIPA(独立行政法人の情報処理推進機構)が後押ししている各種IT関連サービスの提供に必要とされる能力を明確化・体系化した指標。

(概要資料PDF)

2010年7月7日水曜日

更新:IPA (独立行政法人 情報処理推進機構) の公表(2010/5/20) した「IT人材白書2010」を読んで。

5月後半に公表されたIT人材白書2010を読んでちょっと意外だなぁと思いました。

白書の内容は以下の通りいろいろと多岐にわたっているのですが。。

◆IT人材の動向
1)IT人材の需給バランスの変化
2)職種ニーズに変化の兆し
3)本格化するグローバル人材の活用

◆IT人材育成施策の現状と今後の期待
1)新たな発展段階に来たスキル標準の普及
2)成果が求められる産学連携教育
3)ビジネスに求められるIT活用力

◆IT人材の意識と環境
1)実態とは異なる3Kイメージ
2)IT人材個人の不安原因は将来の不透明さ
3)将来を支える専門性の追求が飛躍への道

人材育成に関する調査結果については弊社の製品でもフォーカスしているので興味深く読みました。
そこでちょっと意外に思いました。

人材育成において、企業はまず自社で保持している人材がどんなスキルを保有しているのかをある基準で見える化する必要があるといわれています。

自分の会社にどんな人がいるかもわからなければ、適材配置もできなければ採用計画もままならないですよね。

まあ当たり前のことですが。。この当たり前のことがなかなかできない。。

特にIT人材というのは基準となるスキルが多岐にわたり複雑で変化が激しいためなかなか基準を作るのも難しいとされています。

IT人材の育成指標として経済産業省とIPAが以下のような「スキル標準」を提供しています。

・ITスキル標準(ITSS)
・情報システムユーザースキル標準(UISS)
・組み込みスキル標準(ETSS)

ITSSが一番歴史があって2002年12月に経済産業省から公表されています。

ITベンダー向けというスキル標準ですが今回の調査(2009年調査)で大企業(従業員規模1001名以上)には、ほぼ普及が浸透したという結果が出たそうです。



<ITSSの活用状況(IT企業)> 出典(IPA)  IT人材白書2010


この結果は小職としては非常に意外でした。

ITSSのスキル標準はITプロフェッショナルとして11の職種(ITアーキテクト、コンサルティング、セールスなど)が35分野に分類されてレベルも7段階とかなり細分化されています。

ちなみに弊社の人材スキル管理製品でもITSSフレームワークをサポートしていますのでスキルコンテンツを定義してみると。。。

ITアーキテクトのレベル7などの定義では、そこまでの技術者がはたして日本に存在するのかなぁと思えるようなハイスペックに感じます。

つまり人材像という理想から定義されたスキル標準なのでどうしても現実離れしてしまうというのが実感です。

今回の白書の中では「ITSSを利用しない理由(IT企業)」という設問で調査結果も掲載されていますが、上位2つの回答が以下の2つです。

・35.4% ITスキル標準が自社の業務内容と合わないから
・31.6% ITスキル標準を活用しなくても、独自の人材育成体系や基準があるから


<ITSSを利用しない理由(IT企業)> 出典(IPA)  IT人材白書2010


この結果を見ると私と同じように感じている企業も多いのかなと思いました。
すでにITSSを活用しているという大企業もそのままのフレームワークを利用するのではなく自社に合わせたカスタマイズで試行錯誤しているのだと思います。

ITスキル標準はあくまでも指標として参考にする形で自社にあった人材スキルフレームワークを作ることが企業にとって必要なことですね。

【PR】
弊社ではITSSやUISSに限らず自社に合わせた人材スキルフレームワークを柔軟に構築できるWebアプリケーションパッケージを販売します。後発の良さを生かしてかなりカスタマイズが簡単な仕組みにしたので、ITSSなど以外にも自社の間接部門の業務スキルフレームワークの管理でもノンプログラミングで自在に定義可能です。お気軽にお問い合わせください。(^^)v

p.s.
IT人材白書2010で掲載されている調査結果の画像も抜粋して紹介したかったのですが。。権利の問題もあるので現在利用許諾をいただけるかIPAに問合せ中です。OKが出たらこのページに画像を貼り付けます。

==>すぐにIPAさんからOKが出ました。

2010年7月2日金曜日

第8期増収増益で完了。ありがとうございましたm(_ _)m

いつもお世話になっております。101二階堂です。

一昨日は弊社の決算日でした。
おかげさまで8期目を無事に終了することができました。

前年度に続き大変な激動の年でしたが増収・増益を確保することができました。
世間が不況の中でも数字を残せたことは、お客様に信頼をいただきパートナーさんの協力があって初めてできることと認識しております。

お客様をはじめ弊社を支えてくださった皆様には大変ありがたく本当に感謝いたします。

簡単に弊社の状況をコメントしますと。。

売上高対前年比約23%増、経常利益対前年比約27%増となりました。
増益とはいえ利益金額自体大きなものではありませんが、貴重な資産として保持することにしております。
開発投資などに積極的に使っていきたいと思います。

売上増の要因は弊社にとって大きな案件でも協業パートナーさんの力をお借りして対応できたことが成功のカギとなりました。もちろん弊社メンバーも地道に頑張りました。(^.^)

また新年度(第9期)から期待の新しいパッケージの展開準備も着々と進んでおります。

第9期の目標は新パッケージの立ち上げ&マーケティング戦略確立です。
Twitterなど話題のメディアもどんどん活用しながら潜在的なお客様とつながっていきたいと思います。

既存のお客様に対しては新年度も「クレーム・ZERO」を継続し満足度を高めていきたいと思います。
もちろん新規案件のお話をいただけるように積極的な提案もしたいと存じます。

以上 簡単ですが弊社速報と新年度の展望をご報告させていただきました。

引き続きご愛顧のほどよろしくお願いいたします。

p.s.
利益の範囲で社員全員にiPadを購入しました。
先端技術に触れて刺激を受け、自分でも何か面白いアプリケーションを世の中に出したいというモチベーションになることを期待しています。
ちなみに弊社はiPhone率も100%です(笑)

2010年6月29日火曜日

ホスト名が変わったときなどOracle11g Enterprise Managerは面倒な再構成が必要

Oracleの管理ツール:Oracle Enterprise Managerの構成をやってみました。

今まではインストールしてちょっと動きを確認しただけで特に使っていませんでしたので気がつきませんでしたが。。

ホスト名やIPアドレスが変わると面倒なことになるようです。
何とかconfig配下の構成ファイルを書き換えることで起動できるようになるかと思い試行錯誤しましたが。。
結局SSL用のキーファイルの情報を書き換えることができないので、構成ファイルを手(シェル)で修正して対応というのは断念しました。

マニュアルによると以下の通りです。

Using EMCA When Database Host Name or IP Address Changes

When the database host name (including the domain name) or the IP address changes, deconfigure and then reconfigure the Database Console with the repository create command. Run the following command:

emca -deconfig dbcontrol db -repos drop
emca -config dbcontrol db -repos create

or

emca -deconfig dbcontrol db
emca -config dbcontrol db -repos recreate

実際に実行すると以下のようなプロンプトが表示されますので会話形式で値を入力します。

◆構成情報(リポジトリ)の削除

[oracle@ip-10-130-31-53 db_1]$ emca -deconfig dbcontrol db -repos drop
EMCAの開始 2010/06/29 17:41:23
EM Configuration Assistant, リリース11.2.0.0.2 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

次の情報を入力してください:
データベースのSID: orcl
リスナーのポート番号: 1521
SYSユーザーのパスワード:
SYSMANユーザーのパスワード:

続行しますか。 [はい(Y)/いいえ(N)]: y

◆構成情報の作成

[oracle@ip-10-130-31-53 db_1]$ emca -config dbcontrol db -repos create
EMCAの開始 2010/06/29 17:46:16
EM Configuration Assistant, リリース11.2.0.0.2 Production
Copyright (c) 2003, 2005, Oracle. All rights reserved.

次の情報を入力してください:
データベースのSID: orcl
リスナーのポート番号: 1521
リスナーORACLE_HOME [ /vol/app/oracle/product/11.2.0/db_1 ]:
SYSユーザーのパスワード:
DBSNMPユーザーのパスワード:
SYSMANユーザーのパスワード:
通知用の電子メール・アドレス (オプション): xxxxx@xxxx
通知用の送信メール(SMTP)サーバー (オプション): localhost
-----------------------------------------------------------------

次の設定が指定されています

データベースのORACLE_HOME ................ /vol/app/oracle/product/11.2.0/db_1

ローカル・ホスト名 ................ hostname
リスナーORACLE_HOME ................ /vol/app/oracle/product/11.2.0/db_1
リスナーのポート番号 ................ 1521
データベースのSID ................ orcl
通知用の電子メール・アドレス ............... xxxxx@xxxx
通知用の送信メール(SMTP)サーバー ............... localhost

-----------------------------------------------------------------
続行しますか。 [はい(Y)/いいえ(N)]: y

上記を実行したことで確かにEMが起動しました。

んんん。使いづらいなぁ。

2010年6月17日木曜日

OracleベースのWebアプリをMySQLベースに移行した(最終回)

今回のエントリーが最終回です。

内容は「Webアプリケーションの改変(基本的にはSQL文)」についてです。
1)日付データの編集は? (to_char <-> date_format)
2)SEQUENCEの移行は? (SEQUENCE <-> auto_increment)
3)where句で使うrownumは? (rownum <-> limit)
4)NVL関数は? (nvl <-> ifnull)
5)CHR関数を使った「改行コード」の変換は?
6)そのまま使えた同一構文の関数
7)Oracle固有の表の外部結合を標準SQL化
8)日付型にNULLを許さないMySQL
9)DUAL表を使ったSQL文は?
10)弊社製品101NEO固有の問題
11)データベース接続について

参照:MySQLのSQLリファレンス
参照:OracleのSQL言語リファレンス

1)日付データの編集は?(to_char <-> date_format)
Oracle
SQL> select to_char(sysdate, 'yyyy/mm/dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY/MM/DDHH24:MI:SS')
---------------------------------------------------------
2010/06/17 11:18:58

MySQL
mysql> select date_format(now(), '%Y/%m/%d %H:%i:%s');
+-----------------------------------------+
| date_format(now(), '%Y/%m/%d %H:%i:%s') |
+-----------------------------------------+
| 2010/06/17 11:17:56 |
+-----------------------------------------+
Note:MySQLの現在日時は current_timestamp 関数も同義です。

2)SEQUENCEの移行は?(SEQUENCE <-> auto_increment)

カラムの値を自動採番させたい場合、OracleではSEQUENCEオブジェクトを使用しますが、MySQLではカラム属性の auto_increment を使用します。
Oracle
1.SEQUENCEオブジェクトの作成
 create sequence seq_tar_m;
2.INSERT
 insert into TAR_M
  values(seq_tar_m.nextval, 'Oracleの自動採番');
3.現在の採番値の確認
 select seq_tar_m.currval from dual;
MySQL
1.自動採番属性付きのカラム定義
 create table TAR_M (tar_id int(10) auto_increment
          , subject varchar(100));
2.INSERT
 insert into TAR_M (subject) values('Oracleの自動採番');
3.現在の採番済み最大値の確認
 select last_insert_id() from TAR_M;
Note:auto_increment 指定している tar_id の指定は不要です。

3)where句で使うrownumは?(rownum <-> limit)

検索条件にHitしたデータのうち10件だけ表示したいというようなクエリはMySQLの場合 limit 節を使用します。
Oracle
SQL> select t.* from
2 (select STATUS_ID, STATUS_NAME from TAR_STATUS_M order by STATUS_ID) t
3 where rownum < 6;

STATUS_ID STATUS_NAME
---------- --------------------------------------------------
1 ->未着手
2 ->検討中
5 ->連絡1回
6 ->連絡2回
7 ->緊急

MySQL
mysql> select t.* from
-> (select STATUS_ID, STATUS_NAME from TAR_STATUS_M order by STATUS_ID) t
-> limit 5;
+-----------+--------------+
| STATUS_ID | STATUS_NAME |
+-----------+--------------+
| 1 | ->未着手 |
| 2 | ->検討中 |
| 5 | ->連絡1回 |
| 6 | ->連絡2回 |
| 7 | ->緊急 |
+-----------+--------------+
MySQLのSELECT文のlimit節は引数が1つのときは取得する件数ですが以下のように「オフセット,取得件数」という指定ができます。
オフセットは0から始まります。
MySQL
mysql> select t.* from (select STATUS_ID, STATUS_NAME from TAR_STATUS_M order by status_id) t limit 0,4;
+-----------+--------------+
| STATUS_ID | STATUS_NAME |
+-----------+--------------+
| 1 | ->未着手  |
| 2 | ->検討中  |
| 5 | ->連絡1回  |
| 6 | ->連絡2回   |
+-----------+--------------+

4)NVL関数は? (nvl <-> ifnull)

OracleのNVL関数はIFNULL関数にそのまま置き換えればOKです。
Oracle
SQL> select nvl(null, 'TRUE') from dual;
NVL(
----
TRUE

MySQL
mysql> select ifnull(null, 'TRUE');
+----------------------+
| ifnull(null, 'TRUE') |
+----------------------+
| TRUE |
+----------------------+

5)CHR関数を使った「改行コード」の変換は?

クエリで取得するデータの文字列操作にCHR関数で「改行コード」を出力している箇所があったのでその部分を変換しました。
改行コードの扱いはOracleが特殊でMySQLは一般的ですね。

CR(キャリッジリターン):CHR(13) <-> '\r'
LF(ラインフィード)  :CHR(10) <-> '\n'
Oracle
select replace(h.his_report,chr(13)||chr(10), chr(10)) from TAR_HISTORY h;
MySQL
select replace(h.his_report,'\r\n', '\n') from TAR_HISTORY h;

6)そのまま使えた同一構文の関数
mod関数:mod(n,m)
case関数:case when [condition] then result else result end
replace関数:replace(a, 'AA', 'aa')

7)Oracle固有の表の外部結合を標準SQL化

Oracleの外部結合はwhere句の結合条件で以下のように指定することが可能です。

select p.name, i.ip_address
from pc p, iptbls i where p.key = i.key(+);

ただし、上記のSQL構文はOracle固有ですので標準的なSQL構文に変更しました。

select p.name, i.ip_address
from pc p left join iptbls i on where p.key = i.key;

内部結合は、そのままMySQLでも動作しますが、標準化として INNER JOIN に変更しました。
昔の書き方のほうが見た目はシンプルですが、わかりやすさはSQL標準の書き方ですね。

8)日付型にNULLを許さないMySQL

Oracleは日付型のデータにNULLを格納できるのですがMySQLはエラーになりますので'0000-00-00'セットします。
MySQLは格納する日付型のチェックはかなり緩いようです。詳しくはマニュアルを参照してください。

9)DUAL表を使ったSQL文は?

以下の通りシンプルです。

select 'xxxxxx' from dual; <-> select 'xxxxxx';

10)弊社製品101NEO固有の問題
現象
配列にセットした要素のデータ型が数値と文字列型が混在している場合にその配列内の日本語が文字化けした。

解決方法
クエリで値を取得する際に数値を文字列にcastしてした
SQL例:select cast(ifnull(VERSION,'-') as char) from PRODUCT_M;
以上 上記で説明したSQL文の変換をプログラム全体にわたり行ってWebアプリの移行は終了です。

11)データベース接続について

移行したWebアプリケーションは弊社の101NEOというスクリプト言語で記述されたServletアプリケーションですのでデータベースアクセスはJDBCドライバを介して行います。

具体的な作業は以下の通りです。

  • MySQL用のJDBCドライバの取得と配置
  • WebアプリケーションのJDBC接続構成ファイルの変更

◆MySQL用のJDBCドライバの取得と配置
以下のドライバーをsourceforgeサイトよりダウンロードしwarファイルを構成します。

mysql-connector-java-5.1.12-bin.jar

◆WebアプリケーションのJDBC接続構成ファイルの変更
101NEOアプリケーションのアプリケーション仕様定義書(構成ファイル)のDB接続識別子の記述をMySQL用に変更。

例)
db = org.gjt.mm.mysql.Driver,jdbc:mysql://localhost/helpdesk,helpdeskadmin,PASSWORD

(終わりに)
いかがでしたでしょうか。3回にわたって実際に弊社がプロジェクトで利用している課題管理サイト(インシデント管理)をOracleからMySQLへデータベース移行した内容を掲載しました。
実行結果がそまま張り付けてあったりとやや見栄え的に残念なところも多々ありますが。。ご容赦ください。

ご質問歓迎しますのでまずは twitter まで!(^^)/~

My Twitter account : tnikaido


(おわり)

2010年6月16日水曜日

OracleベースのWebアプリをMySQLベースに移行した(2)

昨日のエントリーに引き続き。。

今回は「データベースのデータ移行」について記載します。

1)データベース作成
2)ユーザの作成および権限付与
3)OracleのデータをCSVファイルへ出力
4)テーブル作成
5)CSVファイルをMySQLへロード

1)データベース作成

データベースの作成は mysqladmin のコマンドにもありますが mysql コマンドで実行します。

以下の例では文字コードセットを指定して作成していますが、指定しない場合は、my.cnf のシステム変数の設定値で決まります。
今回は my.cnf に utf8 をデフォルトして指定しているのでコマンド実行時に指定しなくても同じことですが、明示的に指定したスクリプトを残すほうがわかりやすいですね。

[root@ip-10-130-6-146 ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.0.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database helpdesk default character set utf8;
Query OK, 1 row affected (0.00 sec)

これで helpdesk という枠ができました。
create database は、create schema も同義。

Oracleのcreate database文は、実行可能なOracleデータベースのインストールのような位置づけです。
データベースのメタ情報を管理するシステム表領域やユーザ用の表領域、一時表領域やパッケージなどが作成されます。
そのデータベースの中にユーザを作成するとユーザ用のスキーマという枠が同時に作成されます。
このスキーマとMySQLのcreate database コマンドがほぼ同義ですね。

2)ユーザの作成および権限付与

データベースの枠ができたので次にその枠を使うユーザを作成して権限を付与します。
権限はとりあえず必要最低限で以下のようにしました。
ユーザの作成と権限付与は grant で同時に行えます。

mysql> grant select,insert,update,delete,create,drop,alter on helpdesk.*
-> to helpdeskadmin@localhost identified by 'helpdeskadmin';

Query OK, 0 rows affected (0.00 sec)

#Oracle風にするならデータベース名(スキーマ名)とユーザ名を合わせる感じですので helpdeskadmin は helpdesk ですね。

メモ:すべての権限を付与するコマンド
mysql> grant all PRIVILEGES ON helpdesk.* to helpdeskadmin@localhost;

メモ:権限変更が反映されるタイミング
権限(権限テーブル)はメモリにキャッシュされるので変更したら以下コマンドの実行してリロードさせましょうという記事も見かけますが grant や revoke で変更した権限情報は、変更直後にサーバーが自動的にリロードするようです。手動リロードが必要なのは権限テーブルを直接DMLで書き換えた場合だけですね。

mysql> flush privileges;


◆権限の確認

mysql> use information_schema
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> desc SCHEMA_PRIVILEGES;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| GRANTEE | varchar(81) | NO | | | |
| TABLE_CATALOG | varchar(512) | YES | | NULL | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| PRIVILEGE_TYPE | varchar(64) | NO | | | |
| IS_GRANTABLE | varchar(3) | NO | | | |
+----------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

mysql> select * from SCHEMA_PRIVILEGES where TABLE_SCHEMA = 'helpdesk';
+-----------------------------+---------------+--------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | PRIVILEGE_TYPE | IS_GRANTABLE |
+-----------------------------+---------------+--------------+----------------+--------------+
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | SELECT | NO |
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | INSERT | NO |
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | UPDATE | NO |
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | DELETE | NO |
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | CREATE | NO |
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | DROP | NO |
| 'helpdeskadmin'@'localhost' | NULL | helpdesk | ALTER | NO |
+-----------------------------+---------------+--------------+----------------+--------------+
7 rows in set (0.00 sec)


3)OracleのデータをCSVファイルへ出力

OracleのユーティリティSQL*Plusを使ってデータベースからCSVファイルを簡単に生成します。
※弊社提供のOracle専用ユーティリティ101will Free Editionをぜひご利用ください!

101will Free Editionでは以下のようなSQL文とSQLを実行する親シェルを自動生成することができます。

Oracleのhelpdeskスキーマ内にあるuser_mテーブルのデータをcsvファイルに抜き出すプログラム一式

すべての移行対象テーブルのCSVファイルを生成します。

4)テーブル作成

◆OracleとMySQLのデータ型マッピング

Oracleのデータ型をMySQLのデータ型に合わせてCREATE TABLE文をカスタマイズします。

メモ:データ型マッピングの詳細は、Oracle社のマニュアル:表2-4 Oracle SQL Developerで使用されるデフォルトのデータ型マッピングを参照

上記のマニュアルを参照しながら以下のようにDDLを変換します。
基本的な型は問題なく変換できます。
OracleのVARCHAR2は最大長4000バイトですがMySQL(ver5.0.34)のVARCHARは65,532バイトなのでスカラー型でもそこそこ大きなテキストを扱えるのでちょっといいなと思いました。

・MySQLのDDL例)

CREATE TABLE NEWS_M (
ID INT NOT NULL COMMENT "ニュースID",
REG_DATE DATETIME COMMENT "登録日",
NEWS VARCHAR(4000) COMMENT "ニュース内容",
PRIMARY KEY (ID)
)
COMMENT = "ニュースマスタ"
ENGINE = INNODB;

・OracleのDDL例)

CREATE TABLE "NEWS_M" (
NEWS_ID NUMBER(8) NOT NULL,
REG_DATE DATE,
NEWS_DETAIL VARCHAR2(4000),
STATUS VARCHAR2(10),
CONSTRAINT "NEWS_M_PK" PRIMARY KEY (NEWS_ID)
);
COMMENT ON TABLE "NEWS_M" IS 'ニュースマスタ';
COMMENT ON COLUMN "NEWS_M"."NEWS_ID" IS 'ニュースID';
COMMENT ON COLUMN "NEWS_M"."REG_DATE" IS '登録日';
COMMENT ON COLUMN "NEWS_M"."NEWS_DETAIL" IS 'ニュース内容';
COMMENT ON COLUMN "NEWS_M"."STATUS" IS 'ステータス';

◆テーブル作成スクリプトの作成

※変換したDDLスクリプトを cre_tables.sql に保存して実行しましょう。

# mysql -u helpdeskadmin -pPASSWORDTEXT helpdesk

mysql> source cre_tables.sql

◆作成したテーブルの確認

mysql> use information_schema
mysql> select TABLE_NAME, TABLE_TYPE, ENGINE, TABLE_COMMENT
-> from tables where TABLE_SCHEMA='helpdesk';
+--------------+------------+--------+---------------------------------------------
| TABLE_NAME | TABLE_TYPE | ENGINE | TABLE_COMMENT
+--------------+------------+--------+---------------------------------------------
| APSERVER_M | BASE TABLE | InnoDB | TPBコンポーネント; InnoDB free: 3072 kB
| COMPONENT_M | BASE TABLE | InnoDB | チーム内分類マスタ; InnoDB free: 3072 kB
| CUSTOMER_M | BASE TABLE | InnoDB | 顧客マスタ; InnoDB free: 3072 kB
| DB_M | BASE TABLE | InnoDB | ファンクション; InnoDB free: 3072 kB
| DOCTYPE_M | BASE TABLE | InnoDB | ドキュメントタイプ; InnoDB free: 3072 kB
| DOC_M | BASE TABLE | InnoDB | 技術資料; InnoDB free: 3072 kB
| FAQ_M | BASE TABLE | InnoDB | FAQテーブル; InnoDB free: 3072 kB
| IPTBLS | BASE TABLE | InnoDB | IPTBLS; InnoDB free: 3072 kB
| NEWS_M | BASE TABLE | InnoDB | ニュースマスタ; InnoDB free: 3072 kB
| OS_M | BASE TABLE | InnoDB | 新課題分類; InnoDB free: 3072 kB
| PRODUCT_M | BASE TABLE | InnoDB | チームマスタ; InnoDB free: 3072 kB
| ROLE_M | BASE TABLE | InnoDB | ロールマスタ; InnoDB free: 3072 kB
| SUP_LEVEL_M | BASE TABLE | InnoDB | サポートレベルマスタ; InnoDB free: 3072 kB
| SUP_TYPE_M | BASE TABLE | InnoDB | サポートタイプマスタ; InnoDB free: 3072 kB
| TAR_HISTORY | BASE TABLE | InnoDB | 問合せ履歴; InnoDB free: 3072 kB
| TAR_M | BASE TABLE | InnoDB | TAR_M; InnoDB free: 3072 kB
| TAR_STATUS_M | BASE TABLE | InnoDB | ステータスマスタ; InnoDB free: 3072 kB
| USER_M | BASE TABLE | InnoDB | ユーザーマスタ; InnoDB free: 3072 kB
+--------------+------------+--------+----------------------------------------------
18 rows in set (0.01 sec)


5)CSVファイルをMySQLへロード

OracleのSQL*LoaderのようなMySQLのユーティリティは mysqlimport です。

Oracleのsqlldrコマンドを実行するようにmysqlimportを実行します。

コマンド構文)
# mysqlimport -d -i --fields-terminated-by=, --fields-optionally-enclosed-by=\" -u root -pPASSWORDTEXT helpdesk /home/tnikaido/will/csvunloader/csv/USER_M.csv

上記コマンドの指定内容は以下の通りです。

ファイル形式:フィールドの区切り文字は「,」でデータに「,」を含む場合は「"」で囲う。
実行ユーザ:root
パスワード:PASSWORDTEXT
ロード先データベース:helpdesk
ロード先テーブル:USER_M
ロードするCSVファイル:/home/tnikaido/will/csvunloader/csv/USER_M.csv
※CSVファイル名は「テーブル名.csv」でなければいけないという規約があります。
※フルパスで指定しないとデフォルトのディレクトリは datadir(/etc/my.cnf)
 /var/lib/mysql/helpdesk/をみます。
実行オプション:-d 既存データを削除後にロード
        -i キーの重複エラーを無視して後続データのロードを行う

実行例)

[tnikaido@ip-10-130-6-146 csv]$ mysqlimport -d -i --fields-terminated-by=, --fields-optionally-enclosed-by=\" -u root -p helpdesk /home/tnikaido/will/csvunloader/csv/USER_M.csv
Enter password:
helpdesk.USER_M: Records: 2 Deleted: 0 Skipped: 0 Warnings: 0
[tnikaido@ip-10-130-6-146 csv]$

mysql> select USER_ID, NAME from USER_M;
+----------+--------------+
| USER_ID | NAME |
+----------+--------------+
| helpdesk | 二階堂隆 |
| test | テスト |
+----------+--------------+
2 rows in set (0.00 sec)

mysql>

生成したCSVファイルを任意のフォルダに作成して awk コマンドでmysqlimport実行コマンドを生成すると便利です。

% ls | grep csv| awk '{print "mysqlimport -d -i --fields-terminated-by=, --fields-optionally-enclosed-by=\\\" -u root -pPASSWORDtext helpdesk /home/tnikaido/will/csvunloader/csv/" $1}'

次回はアプリケーションの移行(ほとんどSQLの書き換え)についてエントリーします。

(おわり)

2010年6月11日金曜日

OracleベースのWebアプリをMySQLベースに移行した(1)

6月初めごろから始めたOracleベースのWebアプリケーションのMySQL化が完了しました。
BLOGへのエントリーがタイムリーでないのが、いまいちですが。。

基本的な作業タスクは以下の通りです。


・MySQL環境の構築
・データベースの移行(OracleからMySQLへ)
・Webアプリケーションの改変(基本的にはSQL文)


MySQLもRailsのチュートリアルで使用する程度で簡単にしか触ったことがなかったので本当にリアルに使っているWebアプリケーションが簡単に移行できるかは全くわかりませんでした。

実際にやってみると予想以上に簡単に移行できました。

工数的には4人日程度です。

アプリケーション規模は以下の通り

・テーブル数:18テーブル
・画面数:30画面
・CSV出力アプリ:1本

アプリケーションの概要はユーザマニュアル/管理者マニュアルを参照してください。

MySQLは、日本語情報もそこそこ多く、移行対象のWebアプリが使っているOracleの機能は、MySQLにも存在することが比較的簡単に知ることができて、実際に使ってみてもとても簡単でした。

ただし、日本語マニュアルに記載がないものがあるので、最新の英語マニュアルもチェックすると良いと思います。

この移行作業について何回かに分けてBLOGで紹介したいと思います。

#どこから記載するのがいいのかもいろいろ迷ったのですがMySQLはインストールされている状態で移行用のデータベース作成するMySQLシステムの設定から紹介したいと思います。

MySQL環境の構築


◆移行作業に必要な基本知識

・MySQLサービスの起動/停止は?(@Oracle:インスタンス起動とデータベースopen)

 mysqld スクリプトを使用します。

 起動・停止の例)
 # /etc/init.d/mysqld start
 # /etc/init.d/mysqld stop

 MySQLの推奨では、MySQL のサービスが障害で停止してしまっても自動的に再起動する mysqld_safe というスクリプトを使ってデータベースを起動させますが、更新系のアプリケーションで利用する場合は、自動的に再起動はしたくないので使いませんでした。参照系DBには良いかもしれませんね。

 # /usr/bin/mysqld_safe &
 
・利用するコマンドラインツールは?(@Oracle:sqlplus、sqlldr)

 mysqladmin、mysql、mysqlimport コマンドを利用します。

 インストール直後には root ユーザのパスワード設定で mysqladmin コマンドを使用します。

 # /usr/bin/mysqladmin -u root password 'new-password'

 rootパスワードを変更した後、mysql コマンドでログインしデータベース、ユーザ、権限付与、テーブル作成などを行い、mysqlimport でCSVデータをロードします。

・データベースのメタデータ情報はどうやって知るの?(@Oracle:ディクショナリビュー、DBA_xxx)

 MySQLには、information_schema データベースがあります。
 
 Oracleのメタ情報は、ディクショナリビュー(DBA_xxxx、ALL_xxx、USER_xxx)で確認しますが、

 MySQLのメタ情報は、information_schema で確認することができます。
 MySQLメタ情報は、Oracleのディクショナリビューのように膨大な情報ではないために把握するのは簡単ですね。
 information_schemaが保持しているテーブルは以下の通りです。
 それぞれのテーブル構造の確認もOracleでやるように mysql> desc table_name; で出来るんですね。

mysql> use information_schema
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------------------------+
| Tables_in_information_schema |
+---------------------------------------+
| CHARACTER_SETS |
| COLLATIONS |
| COLLATION_CHARACTER_SET_APPLICABILITY |
| COLUMNS |
| COLUMN_PRIVILEGES |
| KEY_COLUMN_USAGE |
| PROFILING |
| ROUTINES |
| SCHEMATA |
| SCHEMA_PRIVILEGES |
| STATISTICS |
| TABLES |
| TABLE_CONSTRAINTS |
| TABLE_PRIVILEGES |
| TRIGGERS |
| USER_PRIVILEGES |
| VIEWS |
+---------------------------------------+
17 rows in set (0.00 sec)

mysql> desc tables;
+-----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+---------+-------+
| TABLE_CATALOG | varchar(512) | YES | | NULL | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| TABLE_TYPE | varchar(64) | NO | | | |
| ENGINE | varchar(64) | YES | | NULL | |
| VERSION | bigint(21) | YES | | NULL | |
| ROW_FORMAT | varchar(10) | YES | | NULL | |
| TABLE_ROWS | bigint(21) | YES | | NULL | |
| AVG_ROW_LENGTH | bigint(21) | YES | | NULL | |
| DATA_LENGTH | bigint(21) | YES | | NULL | |
| MAX_DATA_LENGTH | bigint(21) | YES | | NULL | |
| INDEX_LENGTH | bigint(21) | YES | | NULL | |
| DATA_FREE | bigint(21) | YES | | NULL | |
| AUTO_INCREMENT | bigint(21) | YES | | NULL | |
| CREATE_TIME | datetime | YES | | NULL | |
| UPDATE_TIME | datetime | YES | | NULL | |
| CHECK_TIME | datetime | YES | | NULL | |
| TABLE_COLLATION | varchar(64) | YES | | NULL | |
| CHECKSUM | bigint(21) | YES | | NULL | |
| CREATE_OPTIONS | varchar(255) | YES | | NULL | |
| TABLE_COMMENT | varchar(80) | NO | | | |
+-----------------+--------------+------+-----+---------+-------+
21 rows in set (0.00 sec)

mysql>


・データベースの初期化パラメータは?(@Oracle:初期化パラメータ(init.ora)、環境変数)

 /etc/my.cnf に設定します。

 Oracleの場合は、環境変数および初期化パラメータによってデータベースの初期化が行われます。
 同様にMySQLでは my.cnf という構成ファイルにパラメータを設定してシステムの初期化を行います。
 今回は以下のような最低限必要そうな設定をしました。

 1)サーバーの文字コードセットのデフォルト設定(character-set-server)

  Oracleの場合はデータベースの文字コードはcreate databaseで設定します。データベース作成後にalter database文で変更することも9iまでは可能だったと思いますが、現在では文が廃止されて専用のコマンドDatabase Character Set Scanner(CSSCAN)を使って検証し、CSALTERというPL/SQLのスクリプトで変更(またはexp/impなど)するなど実際の文字コードの変換は非常に面倒です。

  ただしMySQLの場合は、文字コードは大変柔軟に設定できるのですね。
  以下の順で設定が有効になります。
  カラム属性 > テーブル属性 > データベース属性 > my.cnf(character-set-server)

 2)照合順序の指定(collation-server)

  照合順序の指定とマニュアルにあるが日本語の場合にどうなるのかいまいちよくわかりません。
  サーバーの文字コードをutf8にすると照合順序のデフォルトは
  utf8_general_ciになるようです。
  blogなどを見てみるとカタカナとひらがなを同一視するような記述もありますね。

 3)ストレージエンジンの設定(default-storage-engine)

  ストレージエンジンとはI/Oの実装部分の仕様です。
  MySQLには複数のストレージエンジンがありますが、デフォルトはMyISAMというISAMファイルです。
  Oracleから移行するデータベースにはACID特性をサポートしたINNODBを指定します。
  INNODBは行レベルロックもサポートする仕様です。
  人によっては完全にサポートされていないという話も聞きますが。。何か情報があれば教えてください。

 4)クライアントからの接続セッションの初期設定(init_connect)

  Oracleでは初期化パラメータやalter sessionで接続しているクライアントのセッション構成を変更することが可能ですが、MySQLにもSETコマンドが存在します。このSETコマンドを init_connect 変数に記述することですべてのクライアントのセッションに適用することができます。
  ※ただし init_connect 変数への記述は、SUPER権限をもつユーザ(root)には適用されません。ここで指定したコマンドがエラーになりSUPERユーザの接続の妨害を防ぐためだそうです。

  このパラメータには、以下のコマンドを設定しました。

  ・クライアントの文字コードセットの指定
  ・トランザクションのコミット属性(autocommitをfalseへ)

   MySQLのコミット属性のデフォルト autocommit です。
   デフォルトではmysqlコマンドで発行するSQLもすべて1文ずつコミットされてしまいます。
   Oracleと同様の動きを期待する場合は、上記のパラメータでautocommitを無効にします。

MySQLのシステム変数の詳細は以下のマニュアルを参考にしてください。

参考:MySQLのシステム変数の詳細日本語マニュアル

********* /etc/my.cnf の内容 ************
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
init_connect='SET autocommit=0; SET NAMES utf8'
default-storage-engine = INNODB

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
****************************************

※上記の1)-5)で説明したパラメータ以外はデフォルトで指定されています。
 datadir はMySQLにデータベースを作成した際に物理ファイルを配置するルートディレクトリを指定します。このディレクトリ配下にデータベース名のディレクトリが作成されてテーブルごとにテーブル名.frmというファイルが作成されます。


**** MySQLデータベースの物理ファイル例 ****
[root@ip-10-130-6-146 ~]# ls -al /var/lib/mysql/helpdesk
合計 256
drwx------ 2 mysql mysql 4096 2010-06-07 13:17 .
drwxr-xr-x 5 mysql mysql 4096 2010-06-15 13:38 ..
-rw-rw---- 1 mysql mysql 8726 2010-06-01 13:54 APSERVER_M.frm
-rw-rw---- 1 mysql mysql 8694 2010-06-01 13:03 COMPONENT_M.frm
-rw-rw---- 1 mysql mysql 8768 2010-06-01 13:03 CUSTOMER_M.frm
-rw-rw---- 1 mysql mysql 8696 2010-06-01 13:03 DB_M.frm
-rw-rw---- 1 mysql mysql 8626 2010-06-01 13:03 DOCTYPE_M.frm
-rw-rw---- 1 mysql mysql 13023 2010-06-03 10:40 DOC_M.frm
-rw-rw---- 1 mysql mysql 8965 2010-06-03 10:42 FAQ_M.frm
-rw-rw---- 1 mysql mysql 8558 2010-06-01 13:03 IPTBLS.frm
-rw-rw---- 1 mysql mysql 16857 2010-06-03 10:57 NEWS_M.frm
-rw-rw---- 1 mysql mysql 8675 2010-06-01 13:03 OS_M.frm
-rw-rw---- 1 mysql mysql 21019 2010-06-01 13:03 PRODUCT_M.frm
-rw-rw---- 1 mysql mysql 8629 2010-06-01 13:03 ROLE_M.frm
-rw-rw---- 1 mysql mysql 8633 2010-06-01 13:03 SUP_LEVEL_M.frm
-rw-rw---- 1 mysql mysql 8629 2010-06-01 13:03 SUP_TYPE_M.frm
-rw-rw---- 1 mysql mysql 9016 2010-06-03 10:56 TAR_HISTORY.frm
-rw-rw---- 1 mysql mysql 9825 2010-06-07 13:17 TAR_M.frm
-rw-rw---- 1 mysql mysql 8808 2010-06-01 13:03 TAR_STATUS_M.frm
-rw-rw---- 1 mysql mysql 13356 2010-06-01 13:03 USER_M.frm
-rw-rw---- 1 mysql mysql 61 2010-05-28 18:12 db.opt
[root@ip-10-130-6-146 ~]#
******************************

・設定したシステム変数の確認

my.cnf の指定が終わったらmysqlを再起動してシステム変数を確認してみましょう。

 show variables;


**** SUPER権限を持つ root ユーザで確認した例)****
[root@ip-10-130-6-146 ~]# mysql -u root -p
Enter password:

mysql> show variables like 'character_set%'; show variables like 'init_con%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+---------------+----------------------------------+
| Variable_name | Value |
+---------------+----------------------------------+
| init_connect | SET autocommit=0; SET NAMES utf8 |
+---------------+----------------------------------+
1 row in set (0.00 sec)
***************************************************

root ユーザはSUPER権限を保有するので init_connect に指定した文字コードの設定が無効になっているのがわかります。
一般ユーザでmysqlにログインして同様のコマンドを実行すると以下のようにクライアントの文字コードの設定もutf8になっているのがわかります。

***************************************************
mysql> show variables like 'character_set%'; show variables like 'init_con%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+---------------+----------------------------------+
| Variable_name | Value |
+---------------+----------------------------------+
| init_connect | SET autocommit=0; SET NAMES utf8 |
+---------------+----------------------------------+
1 row in set (0.00 sec)

mysql>
***************************************************


以上でやっとOracleのデータベースをMySQLデータベースに移行する環境が整いました。
次回は、テーブルの移行とデータのローディングについてエントリーしたいと思います。

Amazon Web Services Console が S3 をサポート

Amazonは着実にサービスをリリースしますね。
Googleも着実にサービスをリリースしてきていますがAmazonのほうが企業システム寄りの機能を地道にリリースしてきているように思います。

今回はAmazonが提供しているシステム管理者用のWeb ConsolでS3(ストレージサービス:99.999999999% availability)を管理できるというお知らせが届きました。



早速画面を見てみました。



ストレージなのでフォルダやファイル管理ですが直感的に操作することができて良いと思います。
もちろんすべてのリージョンをサポートしていますのでSingaporeに置いているファイルも管理できます。
ダウンロードが1ファイルづつしかまだ実行できないようなのは、改善してほしいですね。
(ファイルを選択して右クリックして表示されたメニューにDownloadがあります)

WindowsにインストールするようなCloudBerry Explorer for Amazon S3など便利なツールもfree版でありますが、AWS ConsolでS3をサポートしたことでWebブラウザがあればどこからでもAmazonのサービスを1つのコンソールから操作することができるのは大変便利ですね。

継続的にEnhanceされてくることは確実ですので期待したいと思います。

Microsoft Office 2010 優待アップグレード申し込みしてみた

最近PCを変えたので2007のpower pointを購入した。せっかくなのでMicrosoft Office 2010 優待アップグレード キャンペーンにのってみたのですが。。この手続きみなさんはどう思いますか?

1)購入確認の必読ページへ
2)Windows Live ID必須のためユーザ登録
3)ユーザ登録すると確認メールを受信するので受信のURLをクリック
4)Upgradeオンライン登録
 4-1)製品のプロダクトIDの入力必須のためパワポ起動、メニューから4階層クリックしてやっとプロダクトID表示
 4-2)上記の1)のページのリンクにある「購入証明申請書」をダウンロード&印刷
 4-3)製品購入時の領収書原本!を申請書に張り付け
   Amazon.comで購入したのだがすでに領収書は破棄しているためメールの購入確認を張り付けてみる
   これで駄目とか言われたら呆れるが。。
 4-3)購入パッケージの箱に入っているチケットみたいなものを切り取り上記4-2の申請書に張り付ける
 
 ※ここまでほんとに買ったのか?的な扱いをするMSさんをユーザはどう思うのだろうか?
  正直にいえば私は全く好きになれない。むしろ代替えが出たら即やめる!

 4-4)当オンライン登録サイトで送付先など個人情報入力
    Live ID作ったのにそのIDの入力と決済情報だけでいけるかと思いきや、住所とか普通に入力を
    要求される。Live IDは何のために作らせたの??
    決済情報の入力は、カード番号とカード有効期限、セキュリティコードのみ、カード登録氏名の入力もなしでやや不安。

 4-5)上記4-4で指定したmailアドレスに確認メールが届く。
    gmailのアドレスを受信アドレスにしていたらこのメールが迷惑メールに振り分けられる(笑)
    迷惑メールを解除して受信トレイで表示させると以下のように激しい警告(笑)



    これはMSからのメールだからというわけでもないだろうに。。アプリのつくりが悪いのか。。
    届いたメール本文に記載されているURLをクリックしなければ申請登録できないのだが
    gmail画面上では警告が出ているのでURLは無効になってクリックできない。
    ということでコピペで該当URLのページを表示。

 4-6)上記ページに申請書の記載に必要な「オーダーID」が表示される。
 4-7)上記の「オーダーID」を「購入証明申請書」に記入して郵送必須。
   さらにここでも個人情報を要求される。
   Live ID登録時、オンライン申請登録時、購入証明申請書 と何度も個人情報の入力を要求される。
   またキャンペーン対象商品が何かも上記の申請書のチェックボックスにチェックをするようになっている。
   オンラインでも登録している情報のはずであるが。。
    
以上 でやっと申請ができる。

情報の取り方も無駄が多くキャンペーンに準備したそれぞれのマテリアル(申請書やWebページ)間で
全く整合性が取れていないこの業務プロセンスは本当にセンスがない。
これは大企業病なのだろうかと思った。

あまりの面倒くささに若干いかりつつもblogネタとなった(笑)

MSさん関係者が見て改善の気づきになれば幸いです。それとも余計なお世話ですか。

2010年5月24日月曜日

不正アクセスの可能性 - 少々焦ったお話し

みなさんは、Gmailの「アカウントへの不正アクセス警告機能」をご存知でしょうか?

先日不正アクセスの可能性があるという警告がGmailの受信トレイ画面に表示されて非常に焦りました。
背景が赤い行に白抜き文字で警告が表示されたのです。



えええーなんで?
急いで確認をすすめるうちに。。

◆Gmailの「アカウントへの不正アクセス警告機能」とは

Gmailのページを表示すると画面のフッター部分(以下画面参照)に「アカウントアクティビティの詳細」というリンクがあります。



このリンクをクリックすると次の画面が表示されます。



この画面ではGmailアカウントに対してどこからどういうタイプのアクセスをいつしたかを確認することができます。


◆あやしいアクセス?

上記の画面をみると1行だけ赤くなっている行がありますね。
しかもアクセスタイプは不明と出ています。
これは一見やばそうですね。
ふつうはびびりますよね。
そこで該当のIPアドレスは何者なのかを確認しました。

nslookupでIPアドレスを確認してみるとUstreamとなっています。



そういえば最近アカウント登録したサイトです。
でも結構焦っていたので、これはホントに不正アクセスだと思い即 Ustream にmailで問い合わせをしてしまいました。

すると問い合わせが多いので順番に回答しているが返答には時間がかかるという悠長なAutoReplyメールが。。



ますます不安になりGoogle先生に聞いたりしたのですが「Ustream Gmail 不正アクセス」なんてキーワードでは何も探すことができず。。

そして何気なくUstreamのログインページを開いてみると「なあんだ」と気が付きホッとしました。
Utsream のログインページはGoogleやFacebookのアカウントでもログインができるようになっています。

そういえば、以前、Ustream アカウントを作成するときに特に何も考えずに外部連携でGoogleを追加していました。



どうも日付といい時間といいドンピシャでした。(^^;

自分で許可していながら他から警告されると、自分が許可したことをすっかり忘れて焦ってしまいました。

しかもUstreamに問い合わせメールまで。「自分が登録したメールアカウントでUstreamが勝手にアクセスをすることはあるんですか?」
なんて。。

いやあほんとに恥ずかしいことをしました。

でも特にあやしいアクセスではなかったことにホッとしてBLOGネタにしてしまいました。

恥はかきましたがGmailのほかの動きも確認できて多少ためにもなりました(笑)。

◆もう一つのアメリカ合衆国からのIMAPアクセス?

上記の「 アカウント アクティビティの詳細」画面ではもう一つUSサイトからのアクセスがあることに気づかれた方も多いと思います。
ただし、この行は赤くなっていませんよね。つまりGoogle側では安全なアクセスとみなしているのです。
このエントリも初めは驚いたのですが、これはGoogleカレンダーの予定通知機能でメール送信を設定していると発生する現象です。
とはいえIPアドレスからドメイン名を見てもGoogleという名称は出てこないのですごく心配になりました。

結論からするとなあーんだ。というお話ですが。。私としては非常に焦った出来事でした。

以上 しょうもない話を最後まで読んでいただいてありがとうございます!

2010年5月22日土曜日

[TechMemo] 第12回 Amazon EC2 利用するリージョンのデフォルト

今回は前回2回にわたって掲載したAmazon EC2のリージョン移行の補足です。

[TechMemo]Amazon EC2 USリージョンからAPリージョンへの移行
[TechMemo]Amazon EC2 USリージョンからAPリージョンへの移行(後半)

私が利用していたUS EastではEC2のコマンドを実行する際にリージョン(region)を意識する必要がなかった(まあEC2環境でのデフォルトということでしょうが)のですがAsia Pacificリージョンではコマンド実行時にregionを指定しなければうまくいきませんでした。

コマンドのhelpを後からゆっくり読み直したところregionも環境変数で指定できることに気がつきました。

はじめから気がつかずにシェルを書き直してしまいました。とほほ。

region のデフォルトを指定するための環境変数は EC2_URL です。
APリージョンの指定は以下のようにします。

export EC2_URL=https://ec2.ap-southeast-1.amazonaws.com

こうすればシェルはどこのリージョンでも同じように使うことができるわけですね。

まあ今考えてみれば当たり前ですね。
リージョン用の環境変数があるはずだとう感が働くなった私はそろそろ技術者としては厳しいかなぁ。。orz

環境構築やプログラミングの際には、感も重要ですよね。
皆さんはどう思いますか?

ではまた。

2010年5月11日火曜日

[TechMemo] 第11回 Amazon EC2 USリージョンからAPリージョンへの移行(後半)

今回は先日公開しようとしてしていた内容の後半部分を説明します。

なんか長くなってしまったのですが。。

内容サマリ
1)移行するEC2環境の構成について
2)AMIのリージョン間コピー/APリージョンでAMIの登録

*** 上記、二つの手順は前回に説明しています ***

3)Amazon EBS(Elastic Block Store)データの移行
4)移行後のシェルの修正
5)Amazon Machine Image(AMI)の再作成

Amazon EBS(Elastic Block Store)データの移行

Amazon EC2には不揮発性のディスクを提供するEBS(Elastic Block Store)というサービスがあります。
EBSはデータベースのデータなど永続的に保持したいデータの格納用に提供されたものです。
小職のテスト環境のデータベースは、Oracle社から無償で提供されている Oracle Database 10g Express Edition(XE) です。
このXEをEBS上に構築しています。
EBSを別のEC2リージョンに移行するコマンドは、見当たらなかった(たぶんない)のでLinuxのコマンドで移行作業を行いました。

*** 小ネタ: 無償のOracleはどこで手に入る? ***********************
Oracle Technology Network からDL

※ユーザ登録必須
※私はここからDLしたXEを自分のEC2にuploadしてOracle Database環境をEBS上に構築しました。

◆AmazonEC2のAMIもあった!
@US Eastリージョン
AMI ID:ami-98be5cf1
Source:incharge/www.mototaker.com/ja_JP.32/ruby-db-ami/oracle_10gR2_XE_Univ_32Bit-Ruby_on_Rails233_Server-1.0-image.manifest.xml
※AmazonのAMIでは日本語が使えるもの(Universal版)はあまりないのでご注意。
※上記のAMIは日本語っぽいですねw
※US East、APリージョンではキーワードoracleで検索してもありませんでした。
※APリージョンには製品版のOracleがバンドルされたAMIすら存在しません。
******************************************************************

*** 豆知識: リージョン間AMIコピーコマンド(ec2-migrate-image) ***
※昨年末くらいからEBS上にAMIを構築するサービスも提供されていますが、前回のBLOGで説明したAMIのリージョン間コピー用コマンド(ec2-migrate-image)はEBS上のAMIを移行できません。
******************************************************************

◆データ移行手順

@US Eastリージョンでの作業

1)EBSにあるすべてのファイルをtarなどでアーカイブ
2)アーカイブしたファイルをs3へアップロード

@Asia Pacificリージョンでの作業

3)APリージョンに登録したAMIの起動(前回のBLOGで説明したAMI)
4)EBS上にVolumを作成
5)S3からダウンロード
6)ダウンロードファイルの展開とファイルのアクセス権限変更

◆データ移行内容詳細

@US Eastリージョンでの作業

1)EBSにあるすべてのファイルをtar+gzipでアーカイブ

※EBSボリュームは/volというフォルダにマウントされています。
oracle関連のファイルはすべて/vol/oracle配下にありますので oracle フォルダ以下すべてをアーカイブして2GBづつのファイルに分割します。

cd /vol
tar czvf oracle.tar.gz ./oracle
split -b 500m oracle.tar.gz oracle.tar.gz.
mkdir /vol/oracleimg
mv oracle.tar.gz.* /vol/oracleimg/.

2)アーカイブしたファイルをs3へアップロード

EC2からS3へのアップロードはrubyで作成されたスクリプト:s3sync.rb で行います。
以下の例では、S3に101ora-ap バケットを作成しそこに /vol/oracleimg フォルダを
同一名でコピーします。

cd /usr/local/s3sync
export AWS_ACCESS_KEY_ID='xxxxxxxxxxxxxxxx'
export AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

ruby s3cmd.rb createbucket 101ora-ap
ruby s3sync.rb -r --delete /vol/oracleimg/ 101ora-ap:oracleimg

*** 小ネタ:s3sync.rb はどこで手に入る? *************************
以下の記事に書いてある通りやれば簡単に使えるようになります。
http://developer.amazonwebservices.com/connect/entry!default.jspa?categoryID=100&externalID=931&fromSearchPage=true

・s3sync.rbのセットアップ
wget http://s3.amazonaws.com/ServEdge_pub/s3sync/s3sync.tar.gz
tar -xzvf s3sync.tar.gz
cp -r s3sync/ /usr/local/
******************************************************************

@Asia Pacificリージョンでの作業

3)APリージョンに登録されているAMIの起動(前回のBLOGで説明したAMI)

※ここで起動されたAMIはrcが正しく動作しないためElasticIPも設定されずに動的なグローバルIPが割り当てられたままのとりあえずのインスタンスという状態です。

4)EBS上にVolumを作成

US Eastで使用しているボリュームは使えませんのでAPリージョン用にボリュームを作成します。
EC2コンソールで50GBのボリュームを作成後、フォーマット(/dev/sdh)してマウントします。

4-1.EC2コンソールで50GBのボリューム作成とアタッチ

コンソールのメニュー Volumes をクリックして EBS Volumes の画面を表示します。
「Create Volumes」をクリックすると以下の画面が表示されるので Size 入力エリアに50と入力します。
Availavility Zone:は現在インスタンスが起動しているZoneに合わせます。ボリュームはZone固有です。



※ec2-create-volumeというコマンドもあるのですがなぜか実行するとエラーになりました。
# ec2-create-volume --size 50 --availability-zone ap-southeast-1
Client.InvalidZone.NotFound: The zone 'ap-southeast-1' does not exist.

次に作成された Volume をデバイスに Attach します。
作成したVolumeはコンソールに表示されますので左のチェックボックスをチェックして「Attach Volumes」をクリックすると以下の画面が表示されるのでDevice:を選択して「Attach」ボタンをクリックします。



アタッチ後確認してみるとブロックデバイスができています。
# ls -al /dev/sdh
brw-r----- 1 root disk 8, 112 May 5 07:58 /dev/sdh

※コマンドで実行する場合は以下の通り
# ec2-attach-volume vol-80d160e8 --instance i-9dace8cf --device /dev/sdh

4-2.mkfsコマンドでデバイスのフォーマット(プロンプトはすべてyesとする実行例)

# yes | mkfs -t ext3 /dev/sdh
mke2fs 1.40.4 (31-Dec-2007)
/dev/sdh is entire device, not just one partition!
Proceed anyway? (y,n) Filesystem label=
OS type: Linux
Block size=4096 (log=2)

・・・省略・・・

This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

4-3.フォーマットされたデバイスのマウント

# mount /dev/sdh /vol

5)S3からダウンロード

作成したVolumeがファイルシステムから見えるようになったのでS3からoracle関連のアーカイブファイルをダウンロードします。
S3へのアクセスのために以下の環境変数を設定します。

# export AWS_ACCESS_KEY_ID='xxxxxxxxxxxxxxxx'
# export AWS_SECRET_ACCESS_KEY='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
# export AWS_CALLING_FORMAT='SUBDOMAIN'
※US Eastでは環境変数 AWS_CALLING_FORMAT はデフォルトの REGULAR でよいので指定していませんでしたがAPでは必須です。(参照

# cd /usr/local/s3sync
# ruby s3cmd.rb get 101ora-ap:oracleimg/oracle.tar.gz.ad /vol/oracle.tar.gz.ad &
# ruby s3cmd.rb get 101ora-ap:oracleimg/oracle.tar.gz.ac /vol/oracle.tar.gz.ac &
# ruby s3cmd.rb get 101ora-ap:oracleimg/oracle.tar.gz.ab /vol/oracle.tar.gz.ab &
# ruby s3cmd.rb get 101ora-ap:oracleimg/oracle.tar.gz.aa /vol/oracle.tar.gz.aa &
分割したファイルの結合
# cd /vol
# cat oracle.tar.gz.aa oracle.tar.gz.ab oracle.tar.gz.ac oracle.tar.gz.ad > oracle.tar.gz

6)ダウンロードファイルの展開とファイルのアクセス権限変更

# chown oracle oracle.tar.gz
# chgrp dba oracle.tar.gz
# su - oracle
% cd /vol
% ls
lost+found oracle.tar.gz
% tar xvfz oracle.tar.gz

◆sビットを付与
% chmod ug+s oracle
% chmod ug+s tnslsnr

移行後のシェルの修正

US EastリージョンからコピーしてきたAMIで起動されたインスタンスはrc(起動シェル)に記載された内容がUS Eastリージョン用になったままです。
ここではリージョン固有の記述がされたシェルの内容を修正します。

◆rcで実行させているシェルの修正について

1)Elastic IP Address
Elastic IP Addressとは固定IPを利用できるサービスです。
(Elastic IP Addressについては書きだめのテキストがあるのでこれも後日掲載します。鮮度はなくなってますが。。)
リージョンが変わればもちろんIPアドレスも振り直しですね。
まずはAWSのWebコンソールからAPリージョンのElasticIPを購入します。



購入したIPアドレスをインスタンスIDに関連付けなければいけません。
AmazonEC2のインスタンスIDは起動時に動的に付与されますので起動するたびに変化します。
起動後に手動で関連付けることももちろん可能ですが。。
インスタンス起動時に動的に関連付けるためのシェルが以下のようになります。
シェルをみるとわかると思いますが引数 region でAPリージョンの値を指定しています。
てっきりコマンドを実行しているインスタンスがデフォルトの region なると勝手に信じていたのでエラーになる理由がわからずちょっとハマりました。

#!/bin/bash
#
# Associate EC2 Elastic IP Address with INSTANCE
source /root/.ec2env
var1=`ec2din --region ap-southeast-1| grep running | gawk '{print $2}'`
#echo $var1
ec2assocaddr 購入したIPアドレス -i $var1 >/dev/null 2>&1

2)EBSのアタッチ
EBSを作成すると固定の識別ID(Volume ID)が付与されます。
インスタンスIDは起動時に動的に付与されますので起動ごとに変化します。
つまりEBSはインスタンス起動後にアタッチしてあげる必要があります。
そのための起動シェルは以下のようになります。
このシェルにも region 引数を追加しています。

#!/bin/bash
#
# Attach EBS VolumeID: vol-84ac00ec to INSTANCE
source /root/.ec2env
var1=`ec2din --region ap-southeast-1 | grep running | gawk '{print $2}'`
#echo $var1
ec2attvol --region ap-southeast-1 vol-84ac00ec -i $var1 -d /dev/sdh >/dev/null 2>&1
mount /dev/sdh /vol

Amazon Machine Image(AMI)の再作成

システム起動時のシェルを修正したら忘れずに再度AMIを作成します。

これを忘れてシステムを停止してしまうと設定が消えて苦労が水の泡なので注意しましょう!
※上記はRoot Device Type: instance-store

※EBS上にAMIを作成できるサービスも始まっているのでそれを利用すれば設定は消えません。

私のインスタンスはまだS3上に置いたAMIから起動するタイプです。
以下AMI再作成の手順です。

1)AMIのサイズは10GBまでという制限があるのでoracleが配置してあるボリュームをumountします。

umount /vol

2)AMIを作成するコマンドの実行

ec2-bundle-vol -d /tmp -k pk-xxxxxxxxxxxxxxxxx.pem -c cert-xxxxxxxxxxxxxxxx.pem -u 999999999 -r i386 -p oracle10gXE32bitUniv2

正常に終わると/tmpの下にmanifestファイルとAMIを10MB単位に分割したファイルがたくさんできています。

3)作成されたAMIをS3にアップロード

ec2-upload-bundle -r ap-southeast-1a -b tnoraclexe -m /tmp/oracle10gXE32bitUniv2.manifest.xml -a AccsessKey値 -s SecretAccessKey値

上記のコマンドが2)で作成したファイルをS3の tnoraclexe バケットにアップロードします。

4)S3に保管したAMIをAPリージョンに登録

ec2-register --region ap-southeast-1 tnoraclexe/oracle10gXE32bitUniv2.manifest.xml

※ここでも region 引数を指定しています。
US Eastでは指定する必要なかったのですが、ほとんどのコマンドで region 引数を明示的に指定する必要があるようですね。


以上、長々と書いてしまいましたがなんとなくお分かりいただけましたでしょうか?

おまけ

US East と AP ネットワークレイテンシを計測した結果の画面スナップショットを掲載します。
ググルとすでにBLOGなどで掲載しているのを見つけることができますね。

結論から言うとAPリージョンのほうがUS Eastに比べると2.5倍くらい早いですね。
いままでレイテンシーが大きいのではと懸念されていた方もAPリージョンならその心配もない様に思います。

ちなみにAmazonが提供しているAMIはデフォルトではpingは通らない設定になっているのでWebコンソールのSecurity Group設定でpingを通す設定してください。
ピングを通す設定は以下の通りです。

Protocol FromPort ToPort IP
-------------------------------------------
icmp -1 -1 許可するIPアドレス

◆以下レイテンシーの計測結果

1)ローカルPCからUS EastとAsia Pacificリージョンにping実行結果



2)US Eastインスタンスからwww.nikkei.comへping実行結果



3)Asia Pacificインスタンスからwww.nikkei.comへping実行結果



以上 前後半2回に分けて紹介したEC2インスタンスのリージョン間移行手順。

みなさまのお役立てば幸いです。

ではまた。

2010年5月10日月曜日

[TechMemo] 第10回 Amazon EC2 USリージョンからAPリージョンへの移行

相当ブランクが空いてしまったのでAmazonから提供されているサービスで私が利用しているのにご紹介してないサービスがいくつもあるのですが。。

先月末に待望のアジア圏でのAWSが開始しましたので、久しぶりにAmazonEC2ネタで記事を書きました。
US East(Virginia) リージョンに作成されているEC2サイトを Asia Pacific(Singapore) リージョンに移行する方法を簡単に説明します。

USのサイトに作成していたシェルがそのまま動くと思いきやそんなことはなかったので、少々ハマりました。(笑)
ハマった経験を皆様にお知らせして少しでもお役に立てばうれしく思います。

今回の内容サマリ
1)移行するEC2環境の構成について
2)AMIのリージョン間コピー/APリージョンでAMIの登録

*** 以下、二つの手順は次回に説明します ***

3)Amazon EBS(Elastic Block Store)データの移行
4)移行後のシェルの修正
5)インスタンス再起動

移行するEC2環境の構成について


Region:US East
OS:Linux
Root Device Type: instance-store(停止時にルートのイメージが消えるタイプ)
Database:Oracle 10g Express Edition
※データベースはAmazonEBSボリュームに配置
固定IP(ElasticIP)利用



上記の構成でrcにはEC2 Command Line Toolsコマンドを実行する以下のシェルを登録しています。
※このシェルがのちにハマった原因です。

1)固定IPアドレスの振り直し
※EC2インスタンスは起動時に動的にIPが割り振られる仕組みなのでIPが割り振られた後に購入している固定IPをマップするコマンドを実行する必要があります。
2)Amazon EBSのアタッチとmount
3)Oracle NetとOracle Databaseの起動

AMIのリージョン間コピー/APリージョンでAMIの登録


AWSはそれぞれのリージョンは独立したインフラ環境になっています。
したがって例えばUS Eastリージョンで作成したAMI(AmazonMachineImage)をAPリージョンで使用するには既存のAMIを予め新しいリージョンに転送してあげる必要があります。

◆Amazonが提供しているリージョン
US East(Virginia)
US West(California)
EU West(Ireland)
Asia Pacific(Singapore) ※今回新規に始まったリージョン

私がテストサイトとして使用しているのはUS Eastでしたのでそこに作成したAMIをEC2 Command Line Toolsのコマンドを使ってAPリージョンにコピーします。

※古いAPIにはAPリージョンに対応したコマンドがなかったので最新版をダウンロードして設定。
以前はec2-migrate-bundle というコマンドでコピーを作りましたが ec2-migrate-image に変わっています。

**** EC2 API Toolsの更新 ****
more .ec2env
export JAVA_HOME=/usr/local/java
export EC2_HOME=/usr/share/ec2/ec2-api-tools
export PATH=$PATH:$EC2_HOME/bin:$JAVA_HOME/bin
export EC2_PRIVATE_KEY=/root/.ec2/pk-xxxxxxxxxxxx.pem
export EC2_CERT=/root/.ec2/cert-xxxxxxxxxxxx.pem

cd tmp
wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip
unzip ec2-api-tools.zip
cd /usr/share/ec2
ln -s /root/tmp/ec2-api-tools-1.3-51254 ec2-api-tools
*****************************

◆AMIコピーの作成

US EastのS3バケットに保管されているAMIをAP South EastのS3バケットにコピーします。
このコピーには非常に時間がかかりました。
全体で約1.4GBのイメージを10MBに分割されたファイルで転送していますが完了するのに約2時間10分もかかりました。

ec2-migrate-imageの実行例

# ec2-migrate-image -K pk-xxxxxxxxx.pem -C cert-xxxxxxxxxx.pem -o AccessKeyID -w SecretAccessKey --bucket 101oraclexe2 --manifest oracle10gXE32bitUniv2.manifest.xml --location ap-southeast-1 --reagion ap-southeast-1 --destination-bucket ora10xe-101ap

各パラメータの詳細は以下のURL参照
http://docs.amazonwebservices.com/AWSEC2/latest/CommandLineReference/

※認証用のプライベートキーと証明書はパラメータではなくて環境変数(EC2_PRIVATE_KEY、EC2_CERT)で指定してもOKです。
※AWS認証用のアクセスキーとシークレットアクセスキーを指定するオプションが今までのコマンドと違って -o -w なので注意!
いままでEC2コマンドを使っていた人はきっと -a -s を指定してしまうと思います。

Downloading manifest oracle10gXE32bitUniv2.manifest.xml from 101oraclexe2... OK
Copying 'oracle10gXE32bitUniv2.part.000' to 'ora10xe-101ap/oracle10gXE32bitUniv2.part.000'... OK
Copying 'oracle10gXE32bitUniv2.part.001' to 'ora10xe-101ap/oracle10gXE32bitUniv2.part.001'... OK
Copying 'oracle10gXE32bitUniv2.part.002' to 'ora10xe-101ap/oracle10gXE32bitUniv2.part.002'... OK


Copying 'oracle10gXE32bitUniv2.part.136' to 'ora10xe-101ap/oracle10gXE32bitUniv2.part.136'... OK
Copying 'oracle10gXE32bitUniv2.part.137' to 'ora10xe-101ap/oracle10gXE32bitUniv2.part.137'... OK
Your new bundle is in S3 at the following location: ora10xe-101ap/oracle10gXE32bitUniv2.manifest.xml

※実際にS3にファイルがコピーされたかどうかはS3用のクライアントツールで確認してみてください。
以下はCloudBerryで確認した例です。



◆APリージョンでAMIの登録
AMIをAPリージョンにコピーしただけではそのAMIを起動することはできません。
EC2コンソールのAMIメニュー(Register New AMI)からコピーしたAMIを登録します。

・RegionをAsia Pacificにして左側のリストメニューの「AMIs」をクリックします。
・表示された画面の「Register New AMI」をクリックして以下のウィンドウを表示してコピーしたAMIのmanifestファイルを登録します。
manifestは「バケット名/マニフェストファイル名」と指定します。



**** コピー元で以下のように登録コマンドを実行すると。。***
# ec2-register ora10xe-101ap/oracle10gXE32bitUniv2.manifest.xml
[root@domU-12-31-39-0E-D8-13 ~]# ec2-register ora10xe-101ap/oracle10gXE32bitUniv2.manifest.xml
Client.InvalidManifest: HTTP 301 (Moved Permanently) response for URL http://s3.amazonaws.com:80/ora10xe-101ap/oracle10gXE32bitUniv2.manifest.xml: check your manifest path is correct and in the correct region.
リージョンが正しくないと言って怒られます。
**********************************************************

若干、長くなったので後半は次の回に掲載することにします。

ではまた。

2010年2月11日木曜日

GoogleのBuzzをやってみました。


今日Gmail画面を開いたら受信トレイの下に以下のように「バズ」機能が組み込まれていた。

「バズ」をクリックしたらfacebookっぽいつぶやきリストが表示されました。
はじめから自動的に10名フォローしてる状態でGmailで何度もやり取りしている人でアカウントを保有している人は自動でフォローするようですね。

んんん。他の機能や初期設定がどうなっているかは確認したほうがよさそうですね。

さらに「Google Reader の共有アイテム、Picasa の一般公開ウェブ アルバム、Google トークのステータス メッセージは自動的にバズで投稿として表示されます。」とか記載があります。

なんかぜんぶ自前でやります的でやな感じですが外部のサイトも簡単に接続できます。
画面の自分のアイコンの右側に「接続サイト数(0)」というリンクがあります。
このリンクをクリックすると以下のような外部のサイトとの接続設定画面が開きます。



私はとりあえずTwitter(リアルタイムブログ)とFlickr(写真アーカイブ)とBlogger(社用ブログ)サイトをリンクしてみました。すると以下のようなBuzzのTLになりました。

Flickrに投稿されたものや社用ブログ(101仕事日記)に投稿されたものがリスト表示されていますね。

いろいろ出てきてみんな絡み合ってすごいですね。
Google Waveはこれで消えていくかな。。

2010年1月25日月曜日

迷惑なコメント

大変久しぶりのBLOG更新が残念なお知らせです。

先程Bloggerのお知らせメールでBLOGに対してコメントがあった旨のメールが届きました。

「あれっ全然更新できていないのに誰からのコメントかな」と思い早速アクセスしてみて驚きました。

確実に嫌がらせとしか思えないコメントが残されていました。
怪しいリンクが付与された下劣な単語の羅列でした。

特に嫌がらせをされるような覚えはないのですが。。。Twitterで個人的なことも含めいろいろつぶやいているのでその内容がコメントしてきた方の琴線触れたのでしょうか?
単なるスパムかもしれませんが。。Bloggerはコメント・スパムには強いらしい
そうすると人がコメントを入れた可能性が高く非常に残念な出来事でした。

会社のBLOG上に好ましくない文字列が並んでしまうのは問題がありますので残念ですがコメントは受け付けない設定にさせていただきました。

ご了承のほどお願いいたします。

2010年1月2日土曜日

明けましておめでとうございます。

旧年中は格別のご高配を賜り、厚く御礼申し上げます。

2010年という21世紀の1つ目の区切りの年として弊社も新たな展開を開始する年と位置づけたいと思います。

今までの開発ツールおよび受託開発主体のビジネスモデルから特定業務パッケージのご提供するビジネスモデルをもうひとつの柱として育ててまいります。

特定業務パッケージとはいえ今までほとんどフォーカスされていないエリアですので競業メーカーもほとんどないのですが市場ができるぐらいがんばれれば面白くなるかなと思っています。
情報を小出しすると先進企業ほどフォーカスしているエリアですね。

パッケージついての情報発信も年明けからご期待いただければ幸甚です。

本年も、倍旧のお引き立てを賜りますよう何卒よろしくお願い申し上げます。

二階堂隆
twitter account:tnikaido
p.s.
社風は変わらず自主性を重んじて自己啓発を推進し、技術思考の本物のサービスが提供できるような会社であり続けたいと願いつつ。。