読者です 読者をやめる 読者になる 読者になる

oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

「HBase徹底入門」を読みました。

「HBase徹底入門」という本を同僚が書き、クレクレ言いまくったら苦い顔されて快くおこぼれを頂くことが出来ました。

今までHBaseと言えば良く知らないけど

 

 

 というようなツイートをしまくって、おそらく同僚からは「マジで知りもしないで言いやがって・・・(#^ω^)ピキピキ」という僕だったので大変勉強になりました。

 

HBase徹底入門 Hadoopクラスタによる高速データベースの実現

HBase徹底入門 Hadoopクラスタによる高速データベースの実現

 

 おおまかに紹介すると

  • HBaseとはなんぞや
  • どうやってJavaアプリから使うのか
  • データモデリング
  • クラスタ構築・運用
  • 監視
  • 障害対応
  • チューニング

といった内容が網羅されておりまさしく「徹底入門」の名にふさわしい内容なのではないでしょうか。特にCassandraの運用経験がある自分としてはクラスタ構築、運用もそうだが、障害対応やチューニングの内容が「初めて触るならこの辺絶対に知りたいなぁ」って内容が書かれているのでとても参考になる。まさに

 この時に欲しかった本だと思う。この時の自分に渡してあげたい。

 

障害対応項目などは「このノードが死んだら」だけではなく、運用担当としては考えたくないけどありうる「このノードが死んでそのまま復活できない時は」という点も書かれており非常に助かる内容になっている。また、チューニングについては各パラメータがそもそも何を指し示しているのか、それを弄るとどういう事が起きるのか、という点まで記載されているのも嬉しい限りです。

 

とりあえず分散データストア入門本としても「どういう事までケアをしないといけないのか」というのが網羅的に分かるし、「会社に気づいたらHBaseがあって運用担当になりそう」という人は是非買うと良いと思いますよ。

 

著者の三人の今までの苦労がキラキラとした結晶になっている本だと思います。これからも運用頑張ってね(・ω<)

golangでunsupported protocol scheme "" というエラーが出た場合

理由はおそらくURLの記述間違えているパターン。

例としてslackのAPIを叩きたい時に僕は

resp, err := http.PostForm("https://hooks.slack.com/ 〜〜略〜〜
と書くべき所を
resp, err := http.PostForm(" https://hooks.slack.com/ 〜〜略〜〜

httpsの前にスペース入れているのを気づかなくて、このunsupported protocol scheme "" というエラーが出ました。

年末なのではてなブログへ移行しました&今年の雑記


フォロワーのブログのはてブ数を調べてみた - mikedaの日記

この記事にブログ書いているおじさんみんながハートを鷲掴みにされ、ブクマ数を統合するために移行した人もいたので、僕もせっかくなのでいい機会なので移行してみた。

 

で、今年の雑記としては

2014年ブログ記事は29件で、割りとジャンルはバラけた・・かな・・・?


2014-01-01から1年間の記事一覧 - oranie's blog

途中からAndroidの記事を書いていたがすぐに書かなくなっている所が僕らしくて良いですね。理由としては単純で8月以降Androidの簡単なモック書いたり勉強していたが、色々またありまして今はサーバサイドのアプリをちょろっと書きつつ、AWSの構築とかほか雑用おじさんをやっていました。なので、Androidはキャッチアップはしつつ自分はコード書いていないというまあお察し下さいという状況です。まあ、個人的にはこの機会でも無ければ手を出さなかったジャンルだったので基礎だけでも知れたのは良かったです。

 

今年は自分の中で大きなイベントとしては、色々あったことで技術的にひと通りつまみ食いをしたという所でしょうか。

 

来年の抱負としては、こういうつまみ食いをいつまでもしている場合では無いので、もう少し注力する部分などを色々と考えて行きたいなと思います(小並感

 

あと移行したので、良い機会なのでまたブログのタイトルを考えてみます。はてなダイアリーで良いタイトルが無いと言って思いつきで公募したら「iをgに変えたらorangeになることに気づいたoranieの日記」というタイトルを付けてくれた@repeatedlyさんありがとうございました。

【追記あり】td-agent2 + fluent-plugin-bigqueryで、起動時にエラーになる問題

【追記】

https://twitter.com/tagomoris/status/546981761385639937
との事で直りました。このエントリの寿命1時間くらいでした!

                                                                                                                                  • -

もうISSUE上がっているけど、同様のエラーが出た。
https://github.com/kaizenplatform/fluent-plugin-bigquery/pull/31
要するにgoogle-api-clientが古い。ただ、

/opt/td-agent/usr/sbin/td-agent-gem update google-api-client

でやってもfluent-plugin-bigqueryが使うのが
https://github.com/kaizenplatform/fluent-plugin-bigquery/blob/master/fluent-plugin-bigquery.gemspec
にも書かれているが、

 spec.add_runtime_dependency "google-api-client", "~> 0.7.1"

なので、以下は自己責任でお願いします。とりあえず

git clone https://github.com/kaizenplatform/fluent-plugin-bigquery.git

で現行のソース拾ってきて、

fluent-plugin-bigquery.gemspec
の
 spec.add_runtime_dependency "google-api-client", "~> 0.7.1"
を
https://github.com/hakobera/fluent-plugin-bigquery/commit/57253b092d3d023755f167741c2c7eb0aed515ea
で修正されている
 spec.add_runtime_dependency "google-api-client", "~> 0.8.0"

に書き換えて

rake build
して出来上がったやつを
/opt/td-agent/usr/sbin/td-agent-gem install -l ./pkg/fluent-plugin-bigquery-0.2.5.gem
で入れた

以上です。

CentOS 6.5でgo get gopkg.in/hogehogeした時に固まる事象

結論:gitのVerが古いから。多分1.7.1系とかが入っているとダメで、2.0系とかにアップデートすると解決した。

ソース
https://github.com/spf13/hugo/issues/297

解決方法
http://www.torutk.com/projects/swe/wiki/CentOS_6%E3%81%A7git%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%92%E4%B8%8A%E3%81%92%E3%82%8B

とりあえずこれでgo get gopkg.in/hogehogeが問題無く出来る様になりました。

Go + mgo (MongoDB)でauto increment的な事をやる。

自分メモなので簡単に。

  1. MongoDB側にcounter用コレクション作る
  2. Go側でcounter用のstructを定義しておく。
  3. Apply()を利用してcounterをインクリメントし、その値を使ってドキュメントをINSERTする。

という流れになる。
mgoのドライバ公式にApplyの代表的な使い方として書かれているが初め良く分からずハマったのでメモ。
http://godoc.org/labix.org/v2/mgo#Query.Apply

MongoDB側にcounter用コレクション作る

とりあえずここを読みましょう。
http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
コンソールからauto incrementする方法がオフィシャルドキュメントに書いてあります。

Go側でcounter用のstructを定義しておく。

こんな感じ。

	type  Counter struct {
		Object_Id  bson.ObjectId`json:"_id" bson:"_id,omitempty"`
		Id string `json:"id"`
		Seq int64`json:"seq"`
	}

これはなんで定義するかというと、インクリメント処理が終わった際にそのドキュメントを受け取るインターフェイスが必要で、そこに格納された値を用いてINSERTする時にインクリメントされた値をセットする。なので、MySQLのテーブルスキーマに設定するauto incrementとかと一緒かというと、別に採番テーブルを作成してその値を使った用いた処理と一緒になる。
DeNAさんが前に技術ブログで書いた
http://engineer.dena.jp/2010/11/mysql-for-socialgame.html
ログIDの払い出しの時と同じイメージですね。

Apply()を利用してcounterをインクリメントし、その値を使ってドキュメントをINSERTする。

	change := mgo.Change{
		Update: bson.M{"$inc": bson.M{"seq": 1}},
		ReturnNew: true,
	}

こんな感じでまずincrementする処理を書き、

	var result Counter //change処理結果のドキュメントを受け取る変数
	info,err := t.Find(bson.M{"id":"seqNo"}).Apply(change,&result) //change処理が成功したら、&resultに更新したドキュメントが格納される。
	fmt.Println(result.Seq) //resultのseqメンバの値を標準出力してみる

という形でインクリメントした値を標準出力出来るので、これを用いてINSERT処理に使えば良い。

で、さっきも書いたけど、採番テーブルを使うパターン + transactionが無いからincrementは成功したけど、その後INSERTする時にアプリがダウンとかすると、counterは進んだけどその値を持ったドキュメントはいないとかになるので、そのレベルになる事を注意。

あと、公式に書いてあるようなMongoDB側にincrementする関数を設定して、それをクエリ時に使おうと

db.users.insert(
   {
     _id: getNextSequence("userid"),
     name: "Sarah C."
   }
)

こんな感じのクエリを投げようとしても、getNextSequence()を実行したいがそれがただの文字列に扱われてしまったので、こんな感じになった。もしmgoを使ってこれを叩く方法があれば教えて下さい><

開発中にAndroidアプリでSQLiteに格納したデータをデータファイルコピーせずに確認する方法

【追記】
このブログ書いた後に改めてググったら普通にこの方法見つかるね。俺が見逃していただけですな・・・。

                                                                                                                                    • -

表題のままで、開発中にAndroid アプリで定義したSQLiteスキーマをちゃんと確認したいとか、中にどんなデータが入ったかを確認したかったが、ググっても出てくるのが「SQLite3のファイルをローカルにコピーしてきて、それを見る」ばっかりだったので、面倒くせーと思ったらファイルコピーしなくても出来た。
環境はMac + Android Studio + Genymotion上のNexus端末なので、実機ではRoot権限を取らないと多分この方法はムリ。試しにやったらroot権限無くて対象のディレクトリに入れないので出来なかった。

方法としては

  • adb shellで端末に入る
  • cd /data/data/{アプリ名}/databases/してディレクトリを移動。
  • 中にあるSQLiteデータファイルを指定してSQLite3コマンドラインインターフェイスを起動。
  • 後は普通にクエリを実行して確認する
例えばexample-appという名前のアプリでexample-dbというテーブルを作成していた場合はexample-dbというデータファイルがあると思うので
# adb shell (PATH通っていないとかは知らん)
# cd /data/data/example-app/databases/
# sqlite3 ./exampl-db

SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
で中に入れるので、
sqlite> .databases  
でdatabaseの一覧を見たり
sqlite> .schema example-db
でスキーマを確認したり
sqlite> select * from example-db;
で普通にSELECT文を実行出来る。

という流れになる。Android StudioのTerminalからadb shellを実行すれば良いので確認が楽になった。別に普通のTerminalからでも出来る。

ただ、以前までは普通にadb shellで端末に入れたのに実機のNexus7に一度繋げてから、Genymotionの端末に入ろうとadbコマンド実行すると

$ adb shell
adb server is out of date.  killing...
cannot bind 'tcp:5037'
ADB server didn't ACK
* failed to start daemon *
error: 

とかで入れなくて、これがAndroidの洗礼か・・・誰か助けて・・・。もちろんこの直前にはAndroidStudioからアプリを端末にインストール出来ている。

なので、こういう時はGenymotionを使って端末起動した場合、ps auxwwとかで確認するとそもそもshellで接続しているので

こんな感じ
 /Applications/Genymotion.app/Contents/MacOS/player.app/Contents/MacOS/tools/adb -s 192.168.56.101:5555 shell

このコマンドをコピペすると中に入れる。