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

aspec7's garage

エンジニア生活の中で学んだことの備忘録

MongoDB 3.0 を試してみて分かったWiredTigerの威力

f:id:aspec7:20150329194752j:plain

MongoDB3.0!

2月にリリースされた3.0には、ストレージエンジンが選択できるようになり、新しいストレージエンジンとして WiredTiger が選べるようになっています。

従来のエンジンは「MMAPv1」として継続利用可能です。

ということで、旧バージョンと比較してみました。

続きを読む

スクラム初学者の人に伝えている10のこと

f:id:aspec7:20160318095017j:plain

自分が、これからスクラムをやっていく人向けに教えている内容です。
とりあえずこれだけ覚えておけば、あとは本なりWebなりから断片的な情報でもうまく利用できるのではないかと思っています。
認定スクラムマスター研修で学んだ内容から、以下に挙げる項目を大きく2部に分け、計3〜5時間程度つかって伝えています。

続きを読む

よく使うDockerコマンドの一覧

f:id:aspec7:20160318095017j:plain

最近、Dockerにお世話になることが多いので、基本的なコマンドのうちよく使うのを、Ver.1.5.0ベースでまとめます。

イメージ操作とコンテナ操作時にハッシュを指定する場合は、全桁入力しなくても一覧の中で一意になれば1桁でも受け付けてくれます。

続きを読む

Xcodeでunrecognized selector sent to instance **** エラー

個人的な覚書です。

メインビューから、サブビューを呼んでそれを閉じるだけのロジック作ってた際に、閉じるボタンを押したときに落ちました。
どうせ、いつものポカだろうと思っていたのですが、思いのほかハマりました。
結論から言えば、やっぱりポカだったんですが。。

エラーメッセージは、抜粋すると以下のようなものでした。

unrecognized selector sent to instance
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ViewController hogeView:]: unrecognized selector sent to instance'


しばらく悩んだあげく原因が特定出来ず、Storyboardの動きも怪しくなっていたので、駄目元で再起動してみるも治らずなんてしているところで、気付きました。


原因は、メソッド名が違っていました・・・

[self.delegate hogeHuga:self];


などとデリゲートで呼び出しているところの定義先が

- (void)hoge:(DestController *)controller

と、Hugaが抜けてました。
何度も確認したところなのに気付かないとか。。

無駄な時間を過ごした訳ですが、もうちょっと分かりやすいエラーメッセージ出してくれないかしらと思ったりして八つ当たりしておきます。
「Undefined」 とか 「Not found」とか他にもわかりやすいのがあるじゃないかと。。

Windowsでsublime-text-2-gitプラグインを動かす

WindowsSublime Text 2のセットアップをする際に、文字コード絡みで色々手間取る事があったのでメモがてら書き記しておきます。
WindowsXPWindows VistaWindows7Windows8で試して見ましたがどれも同じなようです。
ちなみにいずれもDisplay Languageが日本語の場合です。

プラグインの「sublime-text-2-git」は日本語版のWindowsの場合そのまま使う事が出来ません。
コマンドプロンプトで日本語出力されるような場合は全てデコードエラーになってしまう為のようです。
ちなみにコンソールには以下のようなエラーが出ます。

Exception in thread Thread-7:
Traceback (most recent call last):
File ".\threading.py", line 532, in __bootstrap_inner
File ".\git.py", line 128, in run
File ".\git.py", line 85, in _make_text_safeish
File ".\encodings\cp1252.py", line 15, in decode
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 8: character maps to


ということで、プラグインの一部を修正しておきます。
上記のエラーにも出てくるgit.pyの85行目あたりに、下記のようなデコード処理があります。
そこの「fallback_encoding」を「'sjis'」に変えます。

    try:
unitext = getattr(text, method)('utf-8')
except (UnicodeEncodeError, UnicodeDecodeError):
# unitext = getattr(text, method)(fallback_encoding)
unitext = getattr(text, method)('sjis')
return unitext


これだけです。
git.exeへのパスが通ってなければ、環境変数のPathに、git.exeのあるフォルダを追加してください。
この2点で動くようになります。

Sublime Text 2 の CTagsプラグイン利用時にハマったこと

Windows環境にSublime Text入れて、CTagsプラグインを入れたものの「.tags」ファイルが全く作成されない、なんて問題にぶつかりました。


CTagsコマンドはあり、コマンドプロンプトからも実行し「.tags」が出来ることは確認出来たのですが、Sublime Textからはうんともすんとも。

Sublime上のコンソールを表示して、エラー内容を確認してみたらDecodeエラーが出ていました。
ctagsのターゲットとなるプログラムファイルは全てUTF-8なので、いったい何の事かとプラグインで問題となっているエラーの箇所を見てみたら、プラグイン内のファイルパスを受け取る際にエラーとなっている様子。

ん・・・?

そう、とりあえずでダウンロートしたSublime Textのポータブル版を、普段一時領域用に使ってる日本語名ディレクトリ内に安易に配置してしまった為にエラーとなっていただけでした。

ちなみにSublime Textを別の場所に移してみたら、普通に動きました・・

 

MongoDB 2.4 のユーザーロールについて

MongoDBの2.4から追加されたユーザーロール機能を触ってみました。

mongodを起動するときに「--auth」つけて起動すると認証必須モードになりますが、そのログインユーザーにロール(役割)つけてユーザーごとに権限コントロールをする機能です。

とりあえず、「--auth」オプションなしで起動しているMongoDBにDB管理者アカウントと、コレクションの読み書きだけできるアカウントを作ってみます。

まずは、mongoシェルからユーザー管理用アカウントの「useradmin」を作成します。

> use admin
> db.addUser({user:"useradmin", pwd:"useradmin", roles:["userAdminAnyDatabase"]})


rolesキーには配列で値を設定します。「userAdminAnyDatabase」はsystem.usersコレクションに対して読み書きの権限を与えます。

次に、通常のコレクションへの読み書き用アカウント「test」を作ります。

> use test_db
> db.addUser({user:"test", pwd:"test", roles:["readWrite"]})


この段階で、「--auth」オプションを付けてmongodを再起動します。
ちなみにレプリカセットを構成している場合は、「--keyFile」オプションつけて認証出来るようにする必要があるので注意です。

まずは、読み書き用アカウントでログインして、ユーザー一覧を見てみます。

> use test_db
> db.auth("test", "test")
1
> show users
Mon Jul 22 21:40:07.329 JavaScript execution failed: error: { "$err" : "not authorized for query on admin.system.users", "code" : 16550 } at src/mongo/shell/query.js:L128


権限が無いと怒られました。
次に、適当なデータのあるDBに移動して、コレクションを参照してみます。

> db.sample.find()
{ "_id" : ObjectId("51e7cf03e1a94de3af2761f8"), "no" : 4, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761f9"), "no" : 5, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761fa"), "no" : 6, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761fb"), "no" : 7, "value" : 0 }
{ "_id" : ObjectId("51e7cf03e1a94de3af2761fc"), "no" : 8, "value" : 0 }


ちゃんと検索出来ました。
書き込みも試してみます。

> db.sample.insert({no:2, value:100})
> db.sample.find({no:2})
{ "_id" : ObjectId("51ed295fd538306cd84ac806"), "no" : 2, "value" : 100 }


ちゃんと機能しています。
次に、ユーザー管理用アカウントでログインしてユーザー一覧を表示してみます。

> use admin
> db.auth('useradmin','useradmin')
1
> show users
{
"_id" : ObjectId("51ed2020d538306cd84ac802"),
"user" : "useradmin",
"pwd" : "884fda66c1cb62e62246f4f6293a813e",
"roles" : [
"userAdminAnyDatabase"
]
}


このユーザー一覧は、読み書き用アカウントでは見る事が出来ません。

> use test_db
> db.auth('test','test')
1
> show users
Mon Jul 22 22:40:36.243 JavaScript execution failed: error: {
"$err" : "not authorized for query on test_db.system.users",
"code" : 16550
} at src/mongo/shell/query.js:L128


このような感じで、ユーザーにロールを割り当てる事で、そのユーザーが操作出来る範囲をコントロール出来ます。
rolesキーは配列なので、複数ロールを割り当てる事も可能です。
ユーザーに割り当てられるロールは、下記の通りです。
「***AnyDatabase」は、全論理DBに対しての権限が付加されるようです。
「readWrite」は「read」の権限を全て持っています。
「***Admin」だけの指定では、通常のコレクションを参照出来ないので、参照出来るようにするには「read」か「readWrite」の権限も一緒に定義してあげる必要があります。

  • read
  • readWrite
  • dbAdmin
  • userAdmin
  • clusterAdmin
  • readAnyDatabase
  • readWriteAnyDatabase
  • userAdminAnyDatabase
  • dbAdminAnyDatabase


権限の詳細はマニュアルをどうぞ。

ちなみに権限を割り当てる過程で、アカウントの管理ミスによりオペレーション出来なくなった場合は、慌てなくても「--auth」と「--keyFile」オプション外して再起動すれば、認証なしで利用出来ます。