こんにちは、いちかわです。
昨日は久しぶりにHTML5とか勉強会に参加してきました。
Operaのダニエルさんのプレゼンは相変わらず面白かったです。
資料は公開されているので、こちらから。
「家電にもブラウザがあるさ」と言う内容だったのですが、家電にブラウザが組み込まれると家電単体が持っている機能をさらに拡張できるとの考えです。
プレゼンの中で台所にブラウザを!とありましたが、個人的にはこれが一番喰いつきました。
ダニエルさんもこのUIに食いついたというこのIHのテーブル。
テーブル内にはいっぱい電磁コイルがあって、好きなとこに鍋を置けばそこで調理ができる。
そのあたりの管理をタッチパネルで操作できる様子がこの動画で見れます。
http://www.youtube.com/watch?v=HWlhfvm3AXE
タッチパネルで加熱時間を指定して調理ができるとか、かなりの優れもの。
個人的には欲しくなってしまったw
このIHテーブルにブラウザが組み込まれたら。。
レシピサイトで調理時間とかの情報をひろえて、それを元に火加減の調整とかも自動でやってくれたら完璧です。
吹きこぼす心配も、焦がしてしまう心配も無くなるわけです。
メーカさんには、こんなIHテーブルの開発を真剣にやってほしい!!と思いました。
白石さんからは、「Web Intents入門」について話がありました。
資料は公開されているので、こちらから。
Web Intentsのホームページ。
Androidな開発者なら、”Intents”でピンとくるかもしれませんが、まさにあれをWebアプリでも行えるようにするための規格です。
(簡単に言うと、とあるアプリから、別のアプリを呼び出し、その結果をもらうと言う物)
こちらのサイトを読んでもらうとわかりやすいのですが、通常Webアプリを作る時は自分で色々な機能を自分で作らなければなりません。
しかし、Web Intentsで連携できれば、自分が思いついたサービス部分だけを開発するだけで済み、、
・認証
・決済
などなど、他のWebサービスを呼び出してお任せしてしまえばいいのです。
最近はKinectにハマっているところですが、やはりHTML5も面白いですね。
ちなみに、HTML5 Advent Calendarの16日目に参加しています。
すごいサンプルやデモかいっぱいありますので、ぜひ時間があるときにでも!
最近では、WEB2.0時代というか、REST時代というか
WEBサービス時代というかHTTP-API時代というか
分散並列時代というか
API提供者側から見ると、
1つの処理をどれだけ早く処理するか?とか、ターンアラウンドタイムを短くするか?
という議論は、まだあるものの
ここ数年は
1つの処理は2秒かかっていいので、どれだけ多くのリクエストを同時並列に処理できるか?
という議論のほうが多くなってきました。
なんでかというと、ハードウェアの進化方法が
クロック競争から、コア数競争に変化したことで、
1台のマシンに4コア8コア16コアCPUと並列で処理する方が
可能となってきたバックグラウンドがあります。
(ハンドヘルドでも2コアが出てきましたし。)
そんな時に「java.util.concurrent」は便利ですので紹介します。
要件ソーシャルグラフAPIから、友達の友達の情報をとってくる。
単純に実装すると、2重ループの簡単なプログラムですね。
Aさんの友達一覧をソーシャルグラフAPIから取得
for (Aさんの友達 in Aさんの友達一覧 ){
Aさんの友達の友達一覧をソーシャルグラフAPIから取得
for (Aさんの友達の友達 in Aさんの友達の友達一覧 ){
Aさんの友達の友達の情報をソーシャルグラフAPIから取得
}
}
要件に対する答えはこれでOKです。
問題点1ソーシャルグラフAPIは1リクエストに対し3秒でレスポンスを返してくる。
リクエスト投げる処理が0.0001秒だとすると、3/3.0001が相手サーバの返信待ちです。
問題点2ソーシャルグラフ数が半端ない
友達平均100ならば、上記の処理は100*100=10000回のループします。
ソーシャルグラフAPIをコールする回数は、1+100+10000の10101回のAPIコールしますね。
問題点31と2を考慮すると、シードが一人だとしても、
データを取得するのに、30303秒(8.4時間程度)ですね。
1日で3人分しか処理できません。
どんなに速いマシンをもってしてもです。
補足)対象のソーシャルグラフAPIにバッチ処理モードがある場合は
100人分を1リクエストで処理可能かもしれませんが、今回は考慮しません。
そんな99%WAIT処理となる場合に、並列処理の出番なのです!!
Javaでいうと、java.util.concurrentの出番です。
java.util.concurrent.Executors
//50のスレッドプールを作ります
ExecutorService ex = Executors.newFixedThreadPool(50);
//ループでガシガシとAPIリクエストをキューに突っ込んでいきます。
for (Aさんの友達 in Aさんの友達一覧 ){
Aさんの友達の友達一覧をソーシャルグラフAPIから取得
for (Aさんの友達の友達 in Aさんの友達の友達一覧 ){
//SocialGraphAPICall はrunnableインターフェースを実装したクラス。
//run()内で、uidプロパティの情報をソーシャルグラフAPIから取得してDBなどに保存する。
SocialGraphAPICall cmd = new SocialGraphAPICall();
cmd.uid = "xxxxxxx";
ex.submit(cmd);
}
}
//新規キュー受け付けを停止
ex.shutdown();
//最長99時間まで処理完了を待つ
ex.awaitTermination(99,TimeUnit.HOURS);
このプログラムが何をしているかというと、
10000個のソーシャルグラフAPIリクエストを
最大同時50個のスレッドによって、
順次処理していく事になります。
どれか1つのソーシャルグラフAPIリクエストが終わると
残りのキューに入っている51番目の処理を、とあるスレッドが
処理し始めます。
そんな感じで全体処理時間が50倍早くなります。
8時間かかっていた処理が、理論的には10分で終わるようになります。
This is 並列化!
#obj-cにもTaskQueueという名の同じような便利なスレッドを扱う処理系が実装されています。
こんにちは、いちかわです。
前回紹介しました、「Amazon Asia Pacific (Tokyo) Regionを使ってみる」に続き、気になる料金の比較をしてみました。
Japanリージョンは、US-Eastの約1.2倍ってとこですね。
エクセル版の比較表はこちらからどうぞ→ダウンロード
自分が気になった料金だけ調べたので、全部ではありません。。。
(注意:2011/3/9時点の情報を元に作成しています)
4/4
訂正) EC2とRDSの画像が逆転していましたので、直しました。
追記)「東京リージョンで2番目のアベイラビリティゾーンが使用可能に」と3/29に発表がありました。
これでさらに負荷分散や耐障害性の高いシステムが組めるようになりますね。
EC2

S3

RDS

こんにちは、いちかわです。
昨日、Amazon の新リージョンが発表されました。
それも待ち望んだ、Japanリージョンです!!
以前ブログで、シンガポールのリージョンについて書きましたが、今回もどれくらいの速度かをチェックしてみたいと思います。
まずは、コンソールからインスタンスを立ち上げます。
http://aws.amazon.com/jp/console/

「Asia Pacific(Tokyo)」ってあります!!
今回はただのテストなので、Basic 32-bit Amazon Linux AMI を選択しました。

今のところ、Availability Zoneは一つだけ。

yumでphpをインストールして、httpdを起動します。

ブラウザからアクセスすると、Apacheのページが表示されました。
ここまで、わずか数分。
Amazonのすごさの一つはこの手軽さですね!
ファイルをアップロードして、実際の速度を測ってみましょう。
今回も、ファイルを受け取るphpのファイルを用意し、jmeterでテストします。
せっかくなので、US East(Virginia),、Asia Pacific(Singapore)でも同じ環境を作ってテストします。
まずはアップロード。
20M(20,527,800)のファイルを使って、HTTPでPOSTしてみます。
|
平均(msec) |
最大(msec) |
最小(msec) |
| Japan |
2,481 |
2,694 |
2,350 |
| Singapore |
5,704 |
11,010 |
4,119 |
| Virginia |
11,871 |
21,886 |
9,466 |
と結果は、やはり国内にあるだけJapanリージョンが最速ですね。
けど、以前計ったときと比べると、Singaporeはかなり速くなっているのにビックリ。
次はダウンロードのテスト。
同じファイルをサーバ上において、HTTPでダウンロードしてくるだけです。
|
平均(msec) |
最大(msec) |
最小(msec) |
| Japan |
2,909 |
3,095 |
2,801 |
| Singapore |
10,369 |
12,866 |
7,828 |
| Virginia |
16,121 |
18,172 |
12,123 |
結果は、やはり国内が桁違いで速いですね。
使いやすさを考えると、ソーシャルアプリでの利用も十分考えられますね。
アプリは、EC2
データベースは、RDS
画像など静的な物は、S3
と構築すれば、大容量のトラフィックもオートスケーリングで運用も楽になりそうです。
ただ残念なのが、料金がUSはもちろん、シンガポールよりも高く設定されていることかな。。
2011/3/9追記:
比較表を作ってみました→「Amazon EC2とかリージョンの比較が出来る料金表を作ってみた」
こんにちは、いちかわです。
明けましておめでとうございます。
今年もよろしくお願いいたします。
今年はスマフォソーシャルもありますし、最新の開発環境を構築しようかなと思い、インストールメモを書いてみました。
新たに、Androidの開発を行う皆さまに参考にして頂ければ幸いです。
昔の環境は、Eclipse3.4上で構築していたので、今回は3.6で行ってみたいと思います!
1.本体のダウンロード
http://www.eclipse.org/helios/ から、「Download Helios」に進んで欲しいバージョンをダウンロードします。
自分の環境は、iMacなので OSX版が対象となります。
Android向けのアプリを開発するので、「Eclipse IDE for Java Developers」をダウンロードしました。
ところで、iMacって32bit?、64bit?
調べ方は、こちらから
自分のは64bit版です。
話はもどって、ダウンロードした物を解凍して適当なフォルダに置きます。
2.ソース管理
チームで作業する上で、ソース管理が不可欠なのでSVNのプラグインを入れます。
今回使うのは、Subversiveです。
Subversiveは最初からサイト登録されているので、探し出す作業から始めます。
Eclipseメニューから Help > Install new software… を選択。
「Work with」ドロップダウンから Helios – http://download.eclipse.org/releases/helios を選びます。
大量に表示されるので、「type filter text」の所に”subversive”と入力してしばらく待ちます。
絞り込まれた中から、
Subversive Revision Graph
Subversive SVN Integration for the Mylyn Project
Subversive SVN JDT Ignore Extensions
Subversive SVN Team Provider
にチェックを付けてインストールします。
インストールが成功すると、パースセクティブにSVNが追加されてているので、表示します。
表示させると、どのコネクターを使うか聞いてくるので、最新「1.3.2」にチェックを付けて、インストールをします。

この時自分の環境では何故か
Problems occurred while performing installation: Operation details
See error log for details.
とエラーが表示されて、どうしてもインストールが出来ませんでした。

色々と調べると上記のデフォルトで入る「Team Provider」だとエラーが出るみたいなので、違うサイトを参照してインストールします。
参考にしたサイト
ただ、この手順だとサイトを追加するとなっているのですが、登録しようとすると重複エラーが表示されたので、「Work with」に直接http://download.eclipse.org/technology/subversive/0.7/update-site/を入力してエンターを押すといくつか候補が出てきます。
Subversive Revision Graph (Optional) (Incubation)
Subversive SVN JDT Ignore Extensions (Optional) (Incubation)
Subversive SVN Team Provider (Incubation)
にチェックを付けて、インストールするとリストが更新されたので、「SVN Kit 1.3.3」を選んでOKとなりました。
3.日本語化
やっぱり日本語の方が分かりやすいかなという事で、日本語化しちゃいます。
今までは、Pleiadesとかを使っていたのですが、今回は試しにBabelにしてみようと思います。
EclipseメニューからHelp > Install New Software…を選択し、”Add…”ボタンをクリックします。
「Add Repository」ダイアログが表示されるので、Nameに「Babel」、Locationに先ほどのBabelのサイトの中にある「Babel Update Sites」の所の「Babel Language Pack Update Site for Helios」に書かれていたURLを貼り付けます。
サイトを登録すると、「Work with」のドロップダウンに表示されますので、選択します。
いろんな言語が表示されるので、その中から「Babel Language Packs in Japanese」にチェックを付けてインストールします。
4.やっとAndoridの環境作りw
「Android Developers」から、必要なSDKをダウンロードし解凍します。
環境変数に登録するので、.bash_profile に
export PATH=$PATH:/SDKまでのパス/android-sdk-mac_86/tools
を追加します。(source ~/.bash_profileですぐに反映しちゃいます)
本家サイト に以下の手順が詳しく解説されているので(英語)、そちらを参照して頂きたい。
次にEclipseにADT(Android Development Tools)をインストール。
日本語化されたので、ヘルプ > 新規ソフトウェアのインストール… からサイトを登録して、インストールをします。
ADTのインストールが終わったら、SDKの登録をします。
Eclipse > 環境設定… > Androidを選び、SDK Locationに先ほどダウンロードしたSDKを指定します。
次に、ウィンドウ > Android SDK and AVD Managerと開き、「Available Package」を選択し必要な物をインストールします。
私の場合は、「Android Repository」の全部と、「Third party Add-ons の Google Onc. add-ons」を入れました。
最後にエミュレーターの設定を行います。
ウィンドウ > Android SDK and AVD Managerと開き、「Virtual Device」を選んで、「New…」をクリックします。
「Name」に”DefaultPhone”と入力して、「Android 2.2 – API Level 8 」を選び「Create AVD」をクリックします。
これでエミュレータの作成は完了です。
試しに起動してみましょう。
先ほど作成した「DefaultPhone」を選び、「Start」をクリックすると、標準のが表示されます。(パチパチ)

あとは、開発するだけですね。
弊社サーバ群の中には、
典型的なLAMP環境で動いているマシンがあります。
(Linux+Apache+MySQL+PHPですね)
思えばSamuraiChessをリリースしたのが、
2008年9月で、それ以降ずっと止まっていない。
あまりにも嬉しくなってしまったのでPOSTします。
apache 7275 7939 0 19:10 ? 00:00:00 /usr/sbin/httpd
root 8658 1 0 2008 ? 00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/
mysql 8718 8658 28 2008 ? 225-01:15:33 /usr/libexec/mysqld --basedir=/usr --datadir
apache 8858 7939 0 19:41 ? 00:00:00 /usr/sbin/httpd
mysql さん
何時間動いてるのかさっぱり分からないぐらい稼働してます。
UPTIME
[conit@localhost ~]$ uptime
20:27:52 up 779 days, 8:48, 2 users, load average: 0.00, 0.01, 0.00
779days!
なんと2年以上動いております。
さくらインターネットさんの専用サーバ、本当にありがとうございます!!
来年の今頃は1000日稼働ですね!
サーバに保存しておきたいファイルがあるのに、Diskは有限。
ファイルサーバに保管でもしようか?
保管したファイルサーバ壊れたらどうしよう?
Diskからメディアに保存しておこうか。
メディアの寿命って何年だっけ?
でも、そこまで重要なデータでもないんだよな。。。
あとで使うかもしれないデータなんだよな。。。
なんて状態になってる人はクラウド上のストレージに置いときましょう。
世の中すっかりクラウド時代ですね。
私にとっては、アクセスログファイルが該当するんですね。
いつか使う。。いやすぐに使うんですけれど。。
こんな流れにしようかと。
1. ログを1時間ローテート。
2. bzip2圧縮
3. openssl ファイル暗号化
4. S3の適当な場所にUpload
5. ログファイルさん、また逢う日までさようなら。
s3ツールは、s3cmdを使う。urlはこちら
http://s3tools.org/s3cmd
今回は「s3cmd-1.0.0-rc1.zip」バージョンだった。
zipを解凍すると
s3cmd のpythonスクリプトが入っているので、こいつを使う。
初回はamazonのkey関係を設定するために、
./s3cmd –configure
で実行する。
accesskey,secretkeyなどを聞かれるので入力すると、~/.s3cfg に初期設定が保存される。
このファイルは見られないように注意しよう。
コマンドはいろいろあるけどバケット名が「hogesasaki」だった場合
ファイルリスト取得
./s3cmd ls
./s3cmd ls s3://hogesasaki
などでファイルリストが見れる。
ファイルアップロード
./s3cmd put enc_abc.txt s3://hogesasaki/enc_abc.txt
enc_abc.txtのアップロード
ファイルダウンロード
./s3cmd get s3://hogesasaki/enc_abc.txt enc_abc.txt
enc_abc.txtのダウンロード
エラー時はシェル変数の$?を見て、成功か失敗かを判定すれば良く
とても使い勝手が良いですね~
おまけ
ファイルの暗号化
openssl enc -e -aes256 -in abc.txt -out enc_abc.txt -k sasaki
ちなみに復号はこちら
openssl enc -d -aes256 -in enc_abc.txt -out dec_abc.txt -k sasaki
おまけのおまけ
s3cmd に 暗号化指定でアップロードする機能がありました。。
ソーシャルアプリのDBには運用が楽ちんなので、
MySQL clusterを使っています。
マスタDBをホットスタンバイさせて、keepaliveして落ちたら接続先を変えて・・・・・・っというのが面倒なので
そもそも1台落ちたって平気なcluterちゃんで運用しておりました。
SQL nodeが沢山
Manage nodeが2台
Data nodeが2台
で運用していました。
・・・稼働開始から半年以上・・・・・毎日、けなげに稼働していたのですが、、、、
10月の月末、ついに反乱を起こしやがりました。。
ある日の午後の私>>
「少しゴミデータ残ってるな~~」
「消してしまいますか」
「うんうん」
「delete from ほげほげ 」
「よしEnter!!バシっ!」
「・・」
「・・」
「なに? unknown error?」
「消す量多かったかな??汗汗」
「よしlimit だ。 delete from ほげほげ limit 100; Enter!!バシっ」
「ん?あれあれ?」
「select from ほげほげ limit 10; Enter!! バシっ!」
「ん?unknown error ??」
「やばい! (汗だらだら)」
「delete 文でdataノード全部落ちやがった!!バカやろー(涙)」
てな具合で、小一時間復旧作業に明け暮れましたとさ。
エラーログを見ると、
バグリポートしてね!というお茶目なエラーログ。
まったく、とほほな一日でした。
こんなエラーログ↓↓↓
Time: Monday 25 October 2010 – 16:20:17
Status: Unknown
Message: No message slogan found (please report a bug if you get this error code) (Unknown)
Error: 1217
Error data: Unable to store fragment during LCP. NDBFS Error: 1217
Error object: DBLQH (Line: 13051) 0x0000000a
Program: /opt/libexec/ndbmtd
Pid: 30856 thr: 3
Version: mysql-5.1.44 ndb-7.1.3
Trace: /opt/var/lib/mysql-cluster/ndb_3_trace.log.2 /opt/var/lib/mysql-cluster/ndb_3_trace.log.2_t1 /opt/var/lib/mysql-cluster/ndb_3_trace.log.2_t2
結局のところ、
99%で1万円のサーバと
99.999%で100万円のサーバがあったとしても
落ちる落ちないが99%であろうと、99.999%であろうと
100%でない限りは障害対応が必要なんだよね。
なので、
やっぱり、
商用DBだろうが、OpenSourceだろうが、
どっちにしろ
落ちた時の対策って必要には変わりない。
こんにちわ、いちかわです。
9月28日に行われたGoogle Developer Day 2010に参加してきました。
前回のDevFest 2010 Japanよりさらに大きなイベントという事で、参加する前から楽しみにしていました。
今回のイベントもDevQuizなる物が行われ、Quizに正解し合計得点が一定のラインを超えた人たちのみに参加資格が得られるという物でした。
前の方に座れるように、今回は早めに会場に到着するようにしました。受付に行ってみるとDroidくんがお出迎えしてくれました。

DroidくんもAndroid OSで動いてるとか。
会場が暗くなり、映像と音楽で盛り上げつつ基調講演が始まりました。

Androidのアクティベーションの伸びが示すように、Androidの市場は急速に拡大しているとの事。

のんびりしていると、おいて行かれてしまいますね。コニットでは前からAndroidの普及は確実と思っていたことから、アプリのリリースもしていますし、SamuraiPurchaseでもAndroidに対応をしています。
このようにドンドン普及しているAndroidですが、おもしろい話がありました。
基調講演の中で「Andoridのアプリは8万種類あるが、誰が作っていると思いますか? ここにいるみんなです!」と会場を沸かせたあとの話で、日本は世界で5番目にアプリのダウンロードが多く、アプリの配信数では世界2位とのことでした。
日本Androidの会の様な大きなコミュニティがあり、これらに大きく貢献しているとありました。
Androidはスマートフォンだけではなく、iPadのようなタブレットでも注目されており、サムスン社製の「Galaxy Tab」も披露されました。サンプルとしてゲームを見せられましたが、いい感じに動いていました。

基調講演のあと、激混みの中の移動とGoogle弁当をゲットすることに気を取られていたら、「未来のソーシャルウェブを占う」がすでにいっぱいで聞くことが出来ませんでした。。

セッションと引換にゲットした弁当。Chrome風なデザイン??
参加できたセッションは
・高性能な Android アプリを作るには
・HTML5 とウェブサイトデザイン
・クールな Android アプリを作るには
・Android でリアルタイムゲームを開発する方法: リベンジ
興味のあるAndroid、HTML5を中心に聞きました。
一番面白かったのは最後に聞いた「Android でリアルタイムゲームを開発する方法: リベンジ」でした。
クリス プルエット氏がこのセッションの中で紹介したReplica Islandはオープンソースとしてソースコードを全て公開しています。
実際にダウンロードしてソースを見ていると、非常に勉強となります。これから、Androidでゲームを作りたいと考えている人がいたら、まずはこれを参考にしてみるのも良いのではないでしょうか。
前回のようにDev Phoneを配布するようなサプライズ(笑)はありませんでしたが、内容が非常に濃く面白いイベントでした。
会社ではMacを使ってますが、自宅では未だにwindowsPCを使っているため、
未だにキーボードで日本語変換を間違える鵜沢です。
そんなわけでこの度は、windowsでしか使えないvbsの話。
vbsは非常に簡単なスクリプト言語ですので、
開発者でなくても、PC初心者でも使いこなせると思います。
で、今回はブラウザ操作(IEのみですが)をスクリプトで自動で行う方法について。
ブラウザの操作はDOM(Document Object Model)というものを使用して行うことができます。
以下のソースをtest.vbsというファイルタイトルで保存し、windowsで実行してみましょう。
単純にIEブラウザでグーグルのサイトを表示するだけのソースです。
実行は作ったファイルをダブルクリックで行えます。
——————————–
Option Explicit
Dim objIE
Dim strBody
Set objIE = CreateObject(“InternetExplorer.Application”)
objIE.Width = 800
objIE.Height = 600
objIE.Left = 0
objIE.Top = 0
objIE.Visible = True
objIE.Navigate “http://www.google.co.jp/”
‘<< A >>
Set objIE = Nothing
———————————
ただ、IEブラウザを表示しただけですが、
ここではIEブラウザをオブジェクトとしてとらえています。
そのオブジェクトのパラメータにサイズや遷移先を設定しています。
このソースをすこし改造してみましょう。
‘<< A >>の部分を以下のように書き換えて再度実行してみると、
ブラウザを開く→検索条件を入力する→検索を実行する
を自動で行ってくれます。
———————————
Do Until objIE.Busy = False
WScript.sleep(100)
Loop
objIE.document.getElementsByName(“q”).item(0).value = “test”
objIE.document.getElementsByName(“btnG”).item(0).click
———————————
Do~Loopはブラウザが開ききるまでの待ちです。
残りの2行が、検索条件を入力する。と、検索ボタンををクリック。
の処理になります。
ここで、”q”とか”btnG”といった文字が出てきていますが、
これはそれぞれのinputのnameを入れます。
nameの調べ方はブラウザで右クリック→「ソースを表示」でできるはずです。
vbsとHTMLのタグを使えばブラウザ上の処理が自動化できます。
上記のソースのNavigateの行のURLや入力、ボタンクリックの箇所を変更すれば、
毎日行うデスクワークが楽になるかもしれません。
ちなみにブラウザで右クリック→「ソースを表示」
でソースが取得できない場合は、
‘<< A >>の部分を以下のようにすると画面のHTMLソースが取得できたりします。
もちろん、取得できない画面もあります。
———————————
strBody = objIE.Document.Body.InnerHtml
WScript.echo strBody
———————————
最近はブラウザ操作の自動化の便利なツールがたくさん出ていますので、
わざわざvbsを使うこともないかもしれませんが、
vbsを使えば、IEで表示している内容を、
Excelに自動で書き込んで、グラフ化する・・・なんてことまでできるはずです・・・