前回のiPhoneアプリでは、URLの作成およびレスポンスの取得まで行いました。
今回、取得したレスポンスを整形し、簡単なViwerを作成します。
Titanium Mobileのtable viewテンプレート(Master/Detail Application)を利用しました。
Bucket内のファイルの一覧。
選択したファイルの詳細画面。
ファイル名、最終更新日時、サイズを表示します。
今回は、Bucket内のファイルの一覧および詳細情報を表示するだけの簡単なviwerを作成しました。
S3互換ストレージを操作するポイントは、専用URLの作成(もっというとsignatureの生成)ですが、今回は、S3用のモジュールを利用する事で、signature生成手順を特に意識することなく、実装することができました。
前回作成したアプリの仕組みを利用すると、複数ストレージサービスの切り替え、ファイル管理などもできそうです。
(iPhone上でのファイルのupload/downloadは、やった事ないので調べないといけない。。。)
簡単ですが、今日はここまで。
===
<追記>
2012/11/25 まとめを追記しました。
2012年11月24日土曜日
2012年11月23日金曜日
S3互換ストレージ用clientを作成してみた その3
前々回、前回に続き、今回はiPhoneアプリ作成に挑戦します。
ソースコード整理できたら、githubで公開したいと思います。
開発環境はTitanium Mobileを利用します。使用verは2.1.xです。
(ver3.0はかなりエラーでたので、今回はver2.1で作成することにしました)
モジュールとしては、下記を利用しました。
- amazon-s3-url-signer
S3互換ストレージ用URL作成モジュール
https://github.com/dyashkir/amazon-s3-url-signer - crypto(sha1.js)
暗号化モジュール
https://github.com/Gozala/crypto - TiDomParser.js
XML->JSON変換モジュール
http://hamasyou.com/blog/archives/000377
TitaniumMobileを使用するのは久しぶりなので、取り急ぎ下記を実装しました。
- S3互換ストレージ用URLを作成
- レスポンスを取得
- レスポンスをXMLからJSONに変換
実行結果は下記の通りです。
自分のBucket内のファイル一覧を取得しています。
ここまでできれば、fileのget,putも同様の手順で実装可能です。
アプリとしては、UIを作り込む必要がありますが、TitaniumはVer3.0で、alloyというフレームワークが導入されたりと、いろいろと環境変化が激しいようなので、そのあたりを見極めた上で、どのように実装するか考えたいと思っています。
(要は、今はUIの実装までしません)
ソースコード整理できたら、githubで公開したいと思います。
今回はここまで。。。
2012年11月20日火曜日
S3互換ストレージ用clientを作成してみた その2
前回に続き、今回はjavascript(node.js)でサンプルを作成します。
npmからamazon-s3-url-signerというものを見つけました。
(knoxというものもあったのですが、うまく動作させることができず断念しました。)
ポイントは、endpoint(host名の事)を任意のものに変更できる事です。任意のs3互換のストレージを指定できます。
まずはinstallから。
key,secret key,host,bucket名などを渡すことで、URLを生成します。
下記はbucket内のobjectをリストするサンプルです。
上で出力されるURLをcurlなどで実行すればレスポンスを得る事ができます。
結果、以下のようなAPIのレスポンスを得ることができます。
これで、javascriptを用いたS3互換ストレージ用clientの目処は立ちました。
次は、いよいよ、Titanium Mobileを利用してiPhoneアプリ作りに挑戦です。
npmからamazon-s3-url-signerというものを見つけました。
(knoxというものもあったのですが、うまく動作させることができず断念しました。)
ポイントは、endpoint(host名の事)を任意のものに変更できる事です。任意のs3互換のストレージを指定できます。
まずはinstallから。
$sudo npm install amazon-s3-url-signer
key,secret key,host,bucket名などを渡すことで、URLを生成します。
下記はbucket内のobjectをリストするサンプルです。
var s3 = require('amazon-s3-url-signer');
var putUrl = s3.urlSigner('<key>','<secret key>', {
host: '<host name>',
}).getUrl('GET', '/', '<bucket>', 600);
console.log(putUrl);
上で出力されるURLをcurlなどで実行すればレスポンスを得る事ができます。
$curl "http://<host>/?Expires=1353454181&AWSAccessKeyId=<key>&Signature=<signature>"
結果、以下のようなAPIのレスポンスを得ることができます。
<?xml version="1.0" encoding="UTF-8"?><ListBucketResult><Name>testsnumano</Name><Prefix/><Marker/><MaxKeys>1000</MaxKeys><Delimiter>/</Delimiter><IsTruncated>false</IsTruncated><Contents><Key>CentOS-6.3-x86_64-LiveCD.iso</Key><Size>725614592</Size><LastModified>2012-11-18T08:52:52.000Z</LastModified><ETag>"9953ff1cc2ef31da89a0e1f993ee6335"</ETag><Owner><ID>b13accef9968b0ebbef4023cc8b9ddbf11970175f1e64727a39142c3cfc7acc5</ID><DisplayName>snumano</DisplayName></Owner></Contents></ListBucketResult>
これで、javascriptを用いたS3互換ストレージ用clientの目処は立ちました。
次は、いよいよ、Titanium Mobileを利用してiPhoneアプリ作りに挑戦です。
ラベル:
API,
javascript,
riak,
s3
S3互換ストレージ用clientを作成してみた
といっても、既存のライブラリで簡単に作りたいので、cpanで探してみました。
Amazon::S3が簡単そうです。
$access_key, $secret_keyおよび、hostに適当な値を入力してください。
下記のサンプルだと、bucketの一覧およびbucket内のコンテンツの一覧を表示します。
実行結果は下記の通りです。
こちらを参考にしました。(ほとんどコピペです)
細かいメソッドについては、Amazon::S3::Bucketを参考にしました。
add_key_filenameやget_key_filenameで、fileのPUT,GETもできそうです。
後になって気づきましたが、Furl::S3 も使えそうです。
次は、javascriptに挑戦です。
$access_key, $secret_keyおよび、hostに適当な値を入力してください。
下記のサンプルだと、bucketの一覧およびbucket内のコンテンツの一覧を表示します。
#!/usr/bin/perl
use strict;
use warnings;
use Amazon::S3;
my $access_key = '<input access_key>';
my $secret_key = '<input secret_key>';
my $conn = Amazon::S3->new({
aws_access_key_id => $access_key,
aws_secret_access_key => $secret_key,
host => '<input host>', # S3使用の場合は省略
retry => 1,
});
my @buckets = @{$conn->buckets->{buckets} || []};
foreach my $bucket (@buckets) {
print $bucket->bucket . "\t" . $bucket->creation_date . "\n";
my @keys = @{$bucket->list_all->{keys} || []};
foreach my $key (@keys) {
print "+- "."$key->{key}\t$key->{size}\t$key->{last_modified}\n";
}
}
実行結果は下記の通りです。
$ ./s3.pl
testsnunmano2 2012-11-15T16:26:50.000Z
+- crm-search-result.csv 2260132 2012-11-15T16:26:56.000Z
testsnumano 2012-11-12T14:47:58.000Z
+- CentOS-6.3-x86_64-LiveCD.iso 725614592 2012-11-18T08:52:52.000Z
こちらを参考にしました。(ほとんどコピペです)
細かいメソッドについては、Amazon::S3::Bucketを参考にしました。
add_key_filenameやget_key_filenameで、fileのPUT,GETもできそうです。
後になって気づきましたが、Furl::S3 も使えそうです。
次は、javascriptに挑戦です。
2012年11月3日土曜日
webサイト情報調査用bookmarklet作成してみた
webサイトを閲覧していて「このサイトはどこのデータセンター・ネットワークに属しているんだろう?」と調べたくなることがあると思います。
whoisなどでdomain情報や、IPが属するネットワーク事業者情報(AS)を調べれば、だいたいはわかります。しかし、いろいろなサイトでそれぞれの情報を調べる必要があり手間です。
そこで、下記サイトを以前作成しました。使い方は簡単、調査したいサイトのFQDNを入力して、「submit」をクリックするだけです。複数行入力も可能です。
http://whois.workaround.jp/
しかし、いちいち入力するのが手間だと感じていたので、今回bookmarkletを用意しました。bookmarklet作成については下記を参考にしました。
whois
スマホの方は下記をブックマークとして保存してください。その後ブックマークを編集して、「https://sites.google.com/site/whoisdummy/?」の部分を削除して、保存してください。
whois
サイトに関する情報が表示されます。
domain,IPなどの登録情報や、所属するネットワークの情報がわかります。
閲覧中のURLからFQDNを抜き出し、以前作成したサイトに対して引数:textareaの値として、getで渡します。
whoisなどでdomain情報や、IPが属するネットワーク事業者情報(AS)を調べれば、だいたいはわかります。しかし、いろいろなサイトでそれぞれの情報を調べる必要があり手間です。
そこで、下記サイトを以前作成しました。使い方は簡単、調査したいサイトのFQDNを入力して、「submit」をクリックするだけです。複数行入力も可能です。
http://whois.workaround.jp/
しかし、いちいち入力するのが手間だと感じていたので、今回bookmarkletを用意しました。bookmarklet作成については下記を参考にしました。
- Bookmarkletの作り方 - catch.jp
- 5 Bookmarklets to Learn More About a Site | The Blog Herald
これらもサイト情報を調査するbookmarkletです。私にはこれらでは情報不足なので、作成してみました。
準備
作成したbookmarkletは下記です。PCをご利用の方はブラウザのブックマークバーにドラッグしてください。whois
スマホの方は下記をブックマークとして保存してください。その後ブックマークを編集して、「https://sites.google.com/site/whoisdummy/?」の部分を削除して、保存してください。
whois
使い方
気になるwebサイトで、上記で登録したbookmarkletをクリックしてください。サイトに関する情報が表示されます。
domain,IPなどの登録情報や、所属するネットワークの情報がわかります。
動作説明
bookmarkletの中身は下記です。閲覧中のURLからFQDNを抜き出し、以前作成したサイトに対して引数:textareaの値として、getで渡します。
javascript:(function(){var u=new String(window.location);u=u.substring(2+u.indexOf('//'));var p=u.indexOf('/');if(p!=-1)u=u.substring(0,p);window.open('http://whois.workaround.jp/result?textarea='+u);})();
2012年10月16日火曜日
複数のクラウド(IaaS)を1つのAPIで利用できるApache Libcloudとlc-toolsを使ってみた
数ヶ月前に「Apache Libcloud」の存在を知り、やっと触る時間がとれたので備忘録的に記載します。また、この間にLibcloudが少しは盛り上がるかと思いましたが、全く盛り上がっていません。今後に期待しつつ。。。
詳細は下記をご参照ください。
「メタクラウドAPI」がオープンソースで登場 - Publickey
Apache、共通クラウドAPIを目指す「Libcloud」をトップレベルプロジェクトに:ITpro
LibcloudのHPにも少しサンプルやDocumentはあるのですが、やはり分からない、もしくは難しくて理解できない。。。ネットで調べても情報が少ない。。。
分かりやすいDocumentやサンプルって重要だなと、改めて感じました。
DocumentやTutorialが用意されていますので、参考にしながら、まずは下記でlc-toolsをinstallします。
IDCFクラウドはCloudStackを利用しており、CloudStackはLibcloudのサポート対象になっています。
~/.lcrcに下記設定ファイルを用意しました。(一部伏せ字)
期待通り、VM2台の情報が出力されました。が、出力結果が意外にシンプルすぎます。
(一部伏せ字。出力結果は見やすくするため改行をいれています。)
Apacheのプロジェクトなので、今後、盛り上がる事を期待したいです。
Apache Libcloudとは
Apache Libcloud(以降、Libcloud)は、Amazon EC2、Rackspace Cloud Servers等、20種類以上のクラウドサービスのAPIを抽象化(1つのAPIで利用できるように)したpythonライブラリです。2009年にApache Software Foundation(ASF)のプロジェクトに加わったようです。詳細は下記をご参照ください。
「メタクラウドAPI」がオープンソースで登場 - Publickey
Apache、共通クラウドAPIを目指す「Libcloud」をトップレベルプロジェクトに:ITpro
実際に使ってみる
こちらを参考に、Libcloudのinstallおよび、AWS EC2のVM listを取得してみました。
ACCESS_IDとSECRET_IDを記載するだけで、簡単に取得できました。
(一部伏せ字。出力結果は見やすくするため改行をいれています。)
(一部伏せ字。出力結果は見やすくするため改行をいれています。)
$ python test.pyしかし、他のクラウド事業者(CloudStack等)で試そうと思った所、Provider名や、API_KEY,SECRET_KEY,URLなどの指定方法が分からない。
---snip---
list_nodes-----------------
[<Node:
uuid=xxxxxxxxxxxxxxxxxxxxxxxx,
name=test,
state=0,
public_ips=['x.x.x.x'],
provider=Amazon EC2 (ap-northeast-1)
...>]
---snip---
LibcloudのHPにも少しサンプルやDocumentはあるのですが、やはり分からない、もしくは難しくて理解できない。。。ネットで調べても情報が少ない。。。
分かりやすいDocumentやサンプルって重要だなと、改めて感じました。
Libcloud用コマンドラインツール lc-tools
Libcloudの使用をあきらめかけた時、「lc-tools」なるものを見つけました。ここ10ヶ月程更新がないのは気になりますが、まずは使ってみます。DocumentやTutorialが用意されていますので、参考にしながら、まずは下記でlc-toolsをinstallします。
%git clone https://github.com/novel/lc-tools.git次にVM listの取得に挑戦です。今回は、私が開発に携わっているIDCフロンティア クラウドセルフサービス(以後、IDCFクラウド)を対象とします。
%cd lc-tools
%sudo python setup.py install
IDCFクラウドはCloudStackを利用しており、CloudStackはLibcloudのサポート対象になっています。
~/.lcrcに下記設定ファイルを用意しました。(一部伏せ字)
[idcf]下記、実行結果です。
driver = cloudstack
access_id = xxx
secret_key = xxx
extra = { "host": "xxx.jp", "secure": True, "path": "/portal/client/api" }
期待通り、VM2台の情報が出力されました。が、出力結果が意外にシンプルすぎます。
(一部伏せ字。出力結果は見やすくするため改行をいれています。)
$ cd lc-tools/
$ ls -1
LICENSE
MANIFEST.in
NEWS
README.md
TODO
VERSION
build
doc
lb-add
lb-destroy
lb-list
lb-member-add
lb-member-list
lb-member-remove
lc-drivers-list
lc-image-list
lc-locations-list
lc-node-add
lc-node-do
lc-node-list
lc-sizes-list
lctools
man
media
provider_specific
scripts
setup.py
test
$ ./lc-node-list -p idcf
---snip---
<Node:
uuid=xxx,
name=test,
state=2,
public_ips=[],
provider=CloudStack
...>
<Node:
uuid=xxx,
name=test2,
state=2,
public_ips=[],
provider=CloudStack
...>
まとめ
- Libcloudは20種以上のクラウドサービスに対応しているので、複数サービスを利用している人にとっては、管理が集約できる可能性あり。
- しかし、現時点では、こちらにも記載があるようにクラウドによって、使用可能な機能に差異がある。また、当然、native API程細かい操作はできない。出力結果も情報が少なすぎるかな。。。
- Libcloudに関する情報が少なく、ほとんどの人にとっては敷居が高い。
- Libcloudのコマンドラインツールであるlc-toolsによって、この敷居が低くなる事を期待したい。
Apacheのプロジェクトなので、今後、盛り上がる事を期待したいです。
ラベル:
API,
cloud,
CloudStack,
IDCF
2012年10月14日日曜日
blogにFacebookのlikeボタンをつけてみる
少しハマったので、備忘録として。
ブログ環境としては、Bloggerを使用しています。
ここを参考にlikeボタンのHTML5コードを作成します。
しかし、作成されたコードをそのまま<body>タグを直後にペーストして保存しようとすると、下記エラーが表示されます。
encodeしたものを<body>タグの直後の再度ペーストしたところ、今度は問題なく保存できました。
このブログの右上に、likeボタン設置できました。
ぜひ、"like"をお願いします!
ブログ環境としては、Bloggerを使用しています。
ここを参考にlikeボタンのHTML5コードを作成します。
しかし、作成されたコードをそのまま<body>タグを直後にペーストして保存しようとすると、下記エラーが表示されます。
"The reference to entity "appId" must end with the ';' delimiter."こちらで紹介されている、コードencodeツールを使ってencodeします。
encodeしたものを<body>タグの直後の再度ペーストしたところ、今度は問題なく保存できました。
このブログの右上に、likeボタン設置できました。
ぜひ、"like"をお願いします!
登録:
投稿 (Atom)


