退職しました

4月末日付けで株式会社マイニングブラウニーhttp://www.miningbrownie.co.jp/を退職しました。



アルバイトから正社員にしていただき、そのときから数えると約2年半お世話になりました。
その間、API経由で利用できるwebクローラの開発保守やそれを使用したシステムの開発などをしていました。



マイニングブラウニーではインフラはすべてAWSを使用しており、

様々なサービスの使い方を知ることができ、とても刺激的でした。
様々なことを教えていただき、とても感謝しています。


今後は、次の就職先などは決まっていないので、しばらくゆっくり勉強をしなおしたりしたいと思います。
家事とか料理とかも手早く効率的にできるように花嫁修業的なこともしていこうかと。


今まで通りコミュニティには、ちらほらと顔を出して行きたいと思いますので
どこかで見かけた際にはよろしくお願いします!

SimpleDBにもCloudWatchのメトリックスが欲しい

こんにちは。
アドベントカレンダー初挑戦のはっぱのこです。
AwsAdventCalender14日目を担当します。

先日の得上さんの記事の内容が濃くて、その翌日ということで、この内容でいいのか
(((((((( ;゚Д゚))))))))ガクガクブルブル しております。
さすが、jawsug代表!

さて、気を取り直して、本題です。

AWS初心者の私が好きなサービスはSimpleDBとCloudWatchです。
CPU使用率やディスク容量など様々な値を保持してくれている縁の下の力持ちなCloudWatchですが、残念なことにSimpleDBのメトリックスがございません。

SimpleDBには以下のような制限があります。


なので、これを今回は、ドメインサイズなどの値を取得し、カスタムメトリックスに入れて、アラートを設定をするということをやりたいと思います。

得上さんが日頃から、jawsugに関連するツイートを集めてSimpleDBに保存しているということなので、
値の取得対象にそのドメインを使用させていただきました。

■ SimpleDBからメタデータを取得して、CloudWatchに入れるプログラム

SDBからドメインサイズとアトリビュート数を取得するメソッド

	protected HashMap<String, String> getMetaData(String domainName) {

                // GetMetaData
		DomainMetadataRequest domainMetadataRequest = new DomainMetadataRequest();
		domainMetadataRequest.setDomainName(domainName);
		DomainMetadataResult result = this.sdb.domainMetadata(domainMetadataRequest);
		
		// GetBoxUsage
		AmazonSimpleDBClient client = (AmazonSimpleDBClient) this.sdb;
		float boxUsageFloat = client.getCachedResponseMetadata(domainMetadataRequest).getBoxUsage();
		String boxUsageString = new java.text.DecimalFormat("####0.0###############################").format(boxUsageFloat);
	
		System.out.println("=======================================");
		System.out.println("DomainName = " + domainName);
		System.out.println("ItemCount = " + result.getItemCount());
		System.out.println("DomainSize = " + result.getAttributeValuesSizeBytes() + " byte");
		System.out.println("BoxUsate = " + boxUsageString);

		HashMap<String, String> resultMap = new HashMap<String, String>();
		resultMap.put("domainName", domainName);
		resultMap.put("itemCount", result.getItemCount().toString());
		resultMap.put("domainSize", result.getAttributeValuesSizeBytes().toString());
		resultMap.put("boxUsage", boxUsageString);

		return resultMap;
	}

SimpleDBでは、5秒以内に処理できたクエリの結果しか返さないという仕様なので、ドメイン内のデータ数が多い場合は
「select count(*) from ドメイン名」をやっても、正確なアイテム数を取得することができません。

そのため、DomainMetaDataから取得する必要があります。

また、SimpleDBのお値段の指標となるBoxUsageの値も取得しています。


カスタムメトリックスに値を入れるメソッド

	protected void putCustomMetrics(HashMap<String, String> data)  {

		Dimension dimension = new Dimension().withName("DomainName").withValue(
				data.get("domainName"));

		// Put [ItemCount]
		PutMetricDataRequest request = new PutMetricDataRequest()
				.withNamespace("SimpleDB").withMetricData(
					new MetricDatum()
								.withDimensions(dimension)
								.withMetricName("ItemCounts")
								.withUnit(StandardUnit.Count)
								.withValue((Double) Double.parseDouble(data.get("itemCount"))));

		cw.putMetricData(request);
		
		// Put [domainSize]
		request = new PutMetricDataRequest()
		.withNamespace("SimpleDB").withMetricData(
				new MetricDatum()
						.withDimensions(dimension)
						.withMetricName("DomainSizes")
						.withUnit(StandardUnit.Count)
						.withValue((Double) Double.parseDouble(data.get("domainSize"))));

         cw.putMetricData(request);
         
         // Put [BoxUsage]
 		request = new PutMetricDataRequest()
 		.withNamespace("SimpleDB").withMetricData(
 				new MetricDatum()
 						.withDimensions(dimension)
 						.withMetricName("BoxUsages")
 						.withUnit(StandardUnit.Count)
 						.withValue((Double) Double.parseDouble(data.get("boxUsage"))));

          cw.putMetricData(request);
	}

メイン処理

public class AdventCalendar2012 {
        private final String AccessKey = "MyAccessKey";
        private final String SecretKey = "MySecretKey";

        protected AmazonSimpleDB sdb = new AmazonSimpleDBClient();
        protected AmazonCloudWatchClient cw = new AmazonCloudWatchClient();

        public AdventCalendar2012(){
            this.sdb = new AmazonSimpleDBClient(new BasicAWSCredentials(AccessKey,SecretKey));
            this.sdb.setEndpoint("sdb.ap-northeast-1.amazonaws.com");
            
            this.cw = new AmazonCloudWatchClient(new BasicAWSCredentials(AccessKey, SecretKey));
            this.cw.setEndpoint("monitoring.ap-northeast-1.amazonaws.com");
        } 

	public static void main(String[] args) {
                Main m = new Main();

		String[] domainNames = {"jawsug"};
		
		for (String domainName : domainNames) {
                        // メタデータを取得する
			HashMap<String, String> data = m.getMetaData(domainName);
                        // CloudWatchに値を入れる
			m.putCustomMetrics(data);
		}
	}
}

上記のプログラムをEC2に配置して、cronで1分おきに実行するように設定しました。

■ 入れた結果を確認

しばらく動かした後、マネージメントコンソールで値が入っているかを確認してみます。


入っていますね。

■ アラートの設定と確認

さて、CloudWatchのいいところ。アラート機能の設定。

マネージメントコンソールのCloudWatchのメトリクスを確認した画面でCreateAramのボタンをポチとして
条件を入力してポチっとすれば、アラートの設定がいとも簡単にできます。メールで通知する設定も簡単です。

今回は、ドメインサイズが47369000byteを超えたら、アラートを出してメール飛ばすように設定しました。

ドメインにはデータがどんどん入っていくのでしばらく待つと、メールが来ました。
メールに書いてあるリンクをクリックすると、マネージメントコンソールで確認ができます。


今回は、アラートに使う数値を適当にしましたが、今後は
ドメインサイズの10Gの容量に近づいてきたらアラート出してメールを飛ばす設定をしておけば安心ですね!

また、SimpleDBにリクエストを送るたびにBoxUsageの値を取得してカスタムメトリックスにいれていき
別途、CloudWatchから値を取得して集計するプログラムを書いたりしたら、時間ごとや日ごとにどのくらい使用したか分かったりもしますね。


さて、今回、カスタムメトリックスに定期的に値を入れるためにバッチ実行用にEC2 microインスタンスを立ちあげたのですが
料金的なところを考えると、、、、


  • SimpleDBの魅力はお値段がお安いところでは?
  • RDSのmicroつかったら、EC2と同じくらいの金額でできるんじゃない?
  • RDSだったら、メトリックスもいろいろあるよ?
  • DynamoDBのほうが容量制限とかないし、メトリックスもあるよ?
  • カスタムメトリックスも料金かかるよね?



っていう疑問がいろいろ浮かんできますが、まだまだSimpleDB愛好家として、たくさん使っていきたいのでサンタクラウドにお願い。


AWSの2012 Xmas企画「サンタに願いを」

awsに欲しい機能などお願いごとがあったら、皆様もどんどん #jawsug #サンタクラウドハッシュタグをつけてつぶやいたり、
他の方のお願いを公式RTするといいことあるかもしれません。

s3cmdで日本語のファイル名のものをダウンロードするためのメモ

AWSのS3のファイル操作などを便利にできるツールのひとつにs3cmdがありますが、
それで日本語名のファイルをダウンロードできなかったときにあれこれやったメモ。

s3://バケット名/hoge/テスト.txt

のようなファイルがあったとします。
これを

s3cmd get s3://バケット名/hoge/テスト.txt

と、やろうとしたら、

Problem: UnicodeEncodeError:('ascii', 〜

というようなエラーが出て、ダウンロードできず。

調べていたら、s3cmdはPythonで書かれていて、
Pythonのデフォルトエンコーディングがasciiになっているのが原因のよう。

Pythonのインストールディレクトリの/site-packagesの下にsitecustomize.pyを置けばいいとのこと。

だけど、まずPythonディレクトリを探したら、いっぱいあって、どれだか分からず
手当たりしだいやることに。

sudo find / -name site-packages

で、Pythonディレクトリを検索。

Macで標準で入ってるPythonだと、以下の場所にあるらしい。

/Library/Python/2.x/

ので、自分が使ってるPythonのバージョンは2.6なので

sudo vi /Library/Python/2.6/site-packages/sitecustomize.py

以下の内容を記述

import sys
sys.setdefaultencoding('utf-8')

で、設定できてるか確認。

$ python
Python 2.6.1 (r261:67515, Aug  2 2010, 20:10:18)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
>>> 

できた!
からの、

s3cmd get s3://バケット名/hoge/テスト.txt

で、無事にダウンロードすることができました。


参考にさせていただいたリンク

[Python] UnicodeEncodeErrorが発生した場合は、sitecustomize.pyでデフォルトのエンコーディングを指定する。 - SumiTomohikoの日記

Rubyで標準出力に色をつける

業務で簡単なチェックスクリプトを書いていて、ごにょごにょやったことメモ。

Rspecを色つきで使っていると、チェック結果は色がついているほうが見やすいなーと思うわけで
Rubyの標準出力にどうやって色をつけるのかをしらべました。

Rubyで標準出力に色をつける
こちらのページを参考にさせていただいて、gemでterm-ansicolorを入れた。

で、rubyスクリプトを書いて試してみる。

require 'term/ansicolor'
include Term::ANSIColor

print red,"red string" + "\n"
print reset
print red, bold, "bold string" + "\n" + reset
print green, "green string" + "\n"
print reset

実行結果

print resetで色を標準に戻す感じかな。
boldってなんだかよくわからないけど、
とりあえずred と boldを指定するとオレンジっぽい色になりました。
putsと違って、行末に「\n」を付けないと改行されません。



githubのterm-ansicolorのexsamples.rbを見ると、いろいろ指定ができそう。

チェック結果がNGのときは、赤、OKだったら緑にすると見やすい〜。


ちなみにirbで試してみてて、最後の行のprint resetをしないで抜けると
そのまま標準出力が色つきのままになるのでご注意を。
もう一回、irbを起動して print reset すれば戻りますがね。

第11回 JAWSUG 東京勉強会に参加してきました

2011年12月22日(木)に第11回 AWS User Group - Japan 東京勉強会参加してきました。

内容が盛りだくさんでAWSサムライアワードの発表や、AWS新メンバー@understeer様のご紹介、
富士ソフトCIOの河野様のスピーチ、いつものごとく様々な会社様の仕様事例や
サーバーワークスの@ooishi様の懺悔LT、クラウドパックの@suz_lab様によるサンタクラウドの集計結果、
アマゾンデータサービスジャパンの@j3tm0t0様によるS3のアップロードフォームの紹介などの例もあり、とても充実した内容でした。


本編につきましては、クラスメソッド様のブログにとても綺麗にまとまっていたり、
Ustアーカイブにまとまっているので、そちらもご参照いただければと思います。

だけれども、そんなUstアーカイブについてなのですが
勉強会、終了後にtwitterハッシュタグ #jawsug を追っていたら、こんなやりとりが。

AWS新メンバー@understeer様と@tottokugさんの録画アーカイブだけが無いようです。

@tottokugさんが当日LTで発表された集計内容などの詳しい説明については@tottkugさんのブログや以下のスライドにアップもされているのですが、同じ株式会社マイニングブラウニーの社員として、合わせてレポしていきます。

内容としましては、クラウドパック様が集計してくださったサンタクラウドでつぶやかれた内容を
テキストマイニングして図式化したものです。

サンタクラウドのつぶやきの中から、AWS関連の人気ワードとその人気ワードと一緒につぶやかれていたワードを
登場回数の多いものほど、大きい丸で表現していました。

さらにどんな人達がその人気ワードをつぶやいていたかの図や
その人気ワードをつぶやいていた人達が普段はどんなこをとつぶやいているのかの踏み込んだ集計の紹介がありました。

RDS、S3、EC2について掘り下げられていました。

最後に@tottokugさんが大好きなSimpleDBについての掘り下げ。

こころなしか、丸の数が少ないような・・・。

しかし、注目すべきはそこではなく、SimpleDBについてつぶやいているのは女子が多いということ!
女子が多いです! 
大事なことなので2回言われてました。

そして、SimpleDBについてつぶやいている人が普段なにをつぶやいているのかというと、
ここでのポイントは「女子」と「忘年会」というキーワードが共につぶやかれているということ。

そこから推測されるに
「忘年会に行く女子はSimpleDBが大好き」
つまりは
「SimpleDB好きな男子のことも大好き」

となると

クラウド女子にモテたければSimpleDBを使え!」

という結論になるそうです。



なるほど。
しかし、一応自分も女子ですが、私が一番好きなAWSのサービスはS3です。
SimpleDBの魅力にまだ気づいてないだけかもしれないので、それを教えてくださるクラウド男子募集中!!
@tottokugさんも、男子のみなさんへ
「SimpleDBを使ってブログを書いて、クラウド女子にアピールしましょう」とおっしゃってました。



実際、SimpleDB男子が女子にモテるのかということを懇親会で
@tottokugさんが証明していて証拠写真もありますが
女子に囲まれてどや顔をなさってるので、さわやかな(?)イメージを壊さないように、その写真を載せるのは自粛します

そして最後にAWSのMr.エバンジェリスト @KenTamagawaさんの動向も集計されてました。
@KenTamagawaさんファンの女子必見かもですよ。

〜感想〜
JAWSUGの勉強会は、いつも楽しくてスタッフの皆様に感謝しています。
AWS初心者としては分からないことも多々でてきたりするのですが
本編終了後の懇親会などで質問させていただくと皆様丁寧に教えてくださるのでAWSをまったく知らない方でもどんどん参加することをオススメします。

本編&懇親会のLT大会も楽しいものばかりです!


文章が長くなってしまいましたが、読んでいただいた皆様ありがとうございました。

MongoDB女子部 startupイベントに行って来ました

12月7日にMongoDB女子部 startupイベントに行って来ました。
女子部と名前はついていますが、MongoGirlはまだ少ないのか女性参加者は
15名程度だったそうです。


このイベントは前回の第七回MongoDB勉強会のときに女性参加者が3名しかいなかったため
もっと女性陣の交流を増やしたいということで hatchupさんが企画されたそうな。



〜発表内容〜
1.gumiの@CkRealさんの発表「MongoDBの概要と機能のお話」


まず自己紹介にて。
「好きなMongoDBの機能はReplicaSetsです。」
とのこと。


この自己紹介はjawsugで定番の自己紹介「好きなAWS」にならったらしく、
ぐっときました(笑)


MongoDBといえばこの方!ということで有名な@doryokujinさんはMongoSV出席のため渡米中らしく、
今回はいらっしゃらなかったそうです。

発表は初心者として、とてもためになりました。
もう一度じっくりスライドを見て、実際に手を動かして試してみたいです。

gumiさんで使われているドキュメントの例なども、参考にさせていただきたいです。

あと、MongoDBの導入事例としてDisneyさんの名前もあって、おー、と思いました。
10genに詳しく事例が載ってるとのことだったので
英語を翻訳サイトで訳してざっくりみたところ、オンラインゲームやモバイルゲームで使ってるようです。
Disneyのゲームなんてあったのね。

あと、MongoDBを知るのに日本語で書かれていてオススメの書籍は
NoSQLデータベースファーストガイドだそうです。

NoSQLデータベースファーストガイド

NoSQLデータベースファーストガイド

version1.8version1.6.5のMongoDBが紹介されているらしい。
※version についてCkRealさんからコメントをいただいたので訂正しました。

質疑応答では、MongoSは冗長化するのか?との質問があり、
MongoSをアプリサーバやDBサーバにも入れることも出来る。との回答でした。

あと、レプリカセットは奇数構成のほうがいいのか?との質問もあったのですが
偶数だと、プライマリが落ちたときに過半数がとれないため奇数のほうがいい。
2系だと、とか投票権とか単語がいろいろでてきたけど、初心者のため、そこはよく理解できませんでした・・・。


2.次にフューチャーアーキテクト@kulikalaさんの発表。

業務でもfacebookみたいなアプリが欲しいということで社内向けに開発しているアプリでの
MongoDBの使い方を解説してくださいました。

RedmineSubversionの更新状況をブラウザに通知するアプリってのはいいなぁ。

ためになることがいっぱいありました。
10genが配布しているカードが便利。日本語もあるよ。
ということで早速ダウンロードしました。
カードと言ってもPDFで操作メソッドなどが簡潔にまとめてあります。


〜発表の感想〜
今回発表してくださった方々は、触り始めて1ヶ月、2ヶ月という方が多かったなぁ。
実際手を動かすのが一番だよ。
monogDBはデータ設計を考えなくていいのが楽なのだが
ShardingとかReplicaSetの機能とかを使いこなせて、なんぼなんだろうか。

〜そして懇親会へ〜
第七回MongoDB勉強会に参加した方からGMOさんの会場すごいよと、噂を聞いていたのですが
想像以上でした。




オサレな料理!ニョッキとかブルスケッタとか。
まずは一番最初のビールがプレミアムモルツだったことに感動しました。
そして、バーカウンターもあって、生ビールや黒ビールやオリジナルカクテルまである!

GMOさん、マジ、GMO!

参加費無料でこんなにいただいていいのかしらと、感動しました。
ありがとうございます。
また行きたいなー。
次回もあったらLTとかで発表できるように、ちゃんと勉強しておきたいです。
楽しかったー。

〜余談〜
懇親会のLTにて
MongoTokyo2012の宣伝がされていました。
1月18日に品川でカンファレンスMongoTokyo2012 が開催されるらしい。
10genのサイトで参加募集中。12月18日まではEalyBird料金で参加可能だそうです。

あと、TecLIONの宣伝もされてました!

〜当日のUstアーカイブ
http://www.ustream.tv/channel/mongogirl/videos

社内勉強会で基礎からAWSハンズオン その1

弊社では、毎日社内で13時から30分〜1時間程度の勉強会を開催しています。
お題は自由で、業務が忙しい時には実行されないこともあったりするのですが・・・。


こないだ、第1回 ビギナー編 AWS User Group – Japan 東京勉強会 に参加して
次はハンズオンなどあるといいねーという話がでていたので
一人だとなかなかやらないために、一緒に勉強会に参加した同期の子と一緒に社内勉強会の時間を使ってAWSハンズオンを開催しました。

そのときやったことのメモと感想をまとめておきます。

自分は業務ではEC2にログインして触ってたりするのですが
実際に立ち上げたことはないというレベル。


せっかくAWS無料使用枠があるので、ということで、まずアカウント作成するところから始めました。


1日目

AWSエバンジェリスト玉川さんのスライドを参考に進めていきました。

まず、最初の難関が住所入力のところ。
英語での入力の仕方をgoogle先生に聞きながらやったのですが
合っているかどうかが自信がない。


玉川さんのスライドでは、入力項目が日本語で書いてあるのに
自分達がアクセスしたところは英語表記だったので、ページ間違えてたのかなぁ・・・。


結構、ここで10分くらいかかってしまったかもしれません。

ここらへんを詳しい人に聞けたらいいなーと思いました。
適当でも大丈夫なのかなぁ。

そして、次の難関。
身元確認の電話がかかってきます、のところ。

すぐ取れるように会社の電話番号を登録していたのですが
ちゃんと社内にお知らせしてなかったので、他の営業の社員さんが電話をとってしまって、あたふた。
慌てて、その電話切らないでくださいーと叫んで、番号入力。

無事に済みました。


確認の電話は英語の自動音声なのですが
こないだチラリと「日本語対応しました!」と聞いた気がしたのですが
バッチリ英語でした。
4桁の番号を入力するだけだったので大丈夫でしたが、小心者なので、やはりここで少し焦ります。

けど、これで晴れてアカウント開設完了!


続けて、以下の2つのスライドを参考にしながらEC2を立ち上げてアクセスするところまでやりました。

初心者向け勉強会でのクラスメソッド 横田さん(@sato_shi)のスライド


玉川さんのスライド通りにQuickStartからAmazon Linux AMI 64bitを選択。

アベイラビリティゾーンについて、いつも忘れてしまう。
けど、やっと覚えました。


キーペアの作成のあたりも、若干、戸惑いながらも無事に完了。


まずは、ダウンロードしたpemファイルのアクセス権を変えてターミナルからのssh接続。
ここらへんは玉川さんのスライドだとTeraTermでの接続例だったので
横田さんのスライドの29ページあたりを参考にさせていただきました。


次に、EC2立ち上げ時にHTTPのポートも開けたので
http経由でのブラウザからの接続を試しました。
玉川さんのスライドに戻り、21ページを参考にして
apacheのイントール->httpdの起動->ブラウザからアクセス。



とりあえず、接続できた後はマネージメントコンソールをさわさわ。
Treminate、Reboot、Stop
の違いが、なんとなく分かるけど、具体的にイメージがわかないので実際いろいろ試したりしました。
やっぱり知識だけより、触ってイメージするのが一番ですね。


と、ここまでで約1時間。
30分くらいで終わるかなーと想定してたけど、結構かかってしまいました。


玉川さんのスライドの23ページからの補足部分
EBSをつけたり、AMIを作成したり、、、もやりたかったのですが時間がなかったので
今回はここまでにして、また後日やることにしました。



〜感想〜

こないだのAWS初心者向け勉強会 @dzさんが
ハッカソンをやるとしたら、講師陣をいっぱい用意してマンツーマンでできたらいいな。
そしたら、教えた人も力がつくし、そのとき教えられた人が次回、講師側にまわれば、どんどん参加人数も増やせるから。
とおっしゃってたのを参考に、今回、とりあえず二人でやってみました。


一応、自分が教える側としてやったのですが、分からないことがいっぱいあり
結局、これなんだろう、と言いながら一緒に調べてやってたのですが
それもまた楽しいなと思いました。

ただ、やはり詳しい人もいる状況で困ったり疑問に思ったら教えてもらえる状況が理想だなぁ、と。


今回、教えられた側の子がまた別の社内のまだAWSに触ったことない人に教える予定です。


無料枠があると言っても一人だとなかなかやる気が起こらないし
詳しい人に教えてもらうだけっていうのもスラスラ進んでしまうし、
今回、二人で出来て楽しかったです。

引き続き、EBSをくっつけたり、他のサービスを使ってみたりもしていきたいと思います。