@kyanny's blog

Write down what I learnt.

MongoDB (MongoMapper) で「Array 型フィールドが空でない」条件で検索

User.where(permissions: {"$exists" => true, "$not" => {"$size" => 0}}).count
  • :permissions => [ ] である、という条件は { :permissions => { "$size" => 0 } } と書ける
  • :permissions => [ ] ではない、という条件は $not をはさんで { :permissions => { "$not" => { "$size" => 0 } } } と書ける
  • これだけだと :permissions => nil なレコードを除外できないので { :permissions => { "$exists" => true } } と組み合わせる
  • 最終的に上記のようになる

イシュー(チケット)のタイトルには「現状どのように間違っているか」を書くべきか「本来どのようであるべきか」を書くべきか

イシュー(チケット)のタイトルに、

「(本来ならばこれこれこういう振る舞いであるべきだが、現状だと)これこれこのように間違った振る舞いをしている(のでバグである)」

という風に書く人と、

「(本来ならば)これこれこういう振る舞いであるべき(だが、現状だとこれこれこのように間違った振る舞いをしているのでバグである)」

という風に書く人がいる。これは混乱を招きやすい。英語で書かれていると「べき」などがよく抜け落ちるので混乱に拍車がかかる。

タイトルを見たときに、「タイトルで述べられていることは間違いである、ので修正すべきである」と解釈するのと、「タイトルで述べられていることは正しい、しかし現状そうなっていないので修正すべきである」と解釈するのでは、全く真逆の意味になってしまう。

イシュー(チケット)の本文がスクリーンショットやスクリーンキャストのみで補足説明のコメントがないと余計に混乱を招く。最悪の場合、勘違いして真逆のバグ修正をしてしまい、一仕事終わってから気づく、ということも起こりうる。

ベストな解決策は as-is と to-be のいずれも省略せずに、

「本来ならばこれこれこういう振る舞いであるべきだが、現状だとこれこれこのように間違った振る舞いをしている(のでバグである)」

という風に冗長だが明瞭な書き方をすべきだ。また、タイトルと重複していたとしても本文に改めて

「本来ならばこれこれこういう振る舞いであるべきだが、現状だとこれこれこのように間違った振る舞いをしているのでバグである。」

のように完全なコメントを書くべきだ。

この例の場合、タイトルには「(のでバグである)」という一言が含まれていない。このタイトルを読んだ人はこれがバグ修正の依頼だと確信を持てないかもしれないし、解釈の仕方によってはこれは実装(振る舞い)のバグではなく仕様の間違いを指摘しているのだと誤解するかもしれない。


ブログ記事のタイトルにも同じことが言える。

この記事のタイトルを例にとると、

「イシュー(チケット)のタイトル」

というタイトルは言葉が足りなすぎる。イシューのタイトルが何なのか、がわからないので読み手の想像力を必要以上にかきたててしまう。もしかしたら「イシューのタイトルが面白かった」という笑い話を期待させてしまうかもしれない。

「イシュー(チケット)のタイトルはどう書くべきか」

だと、内容が問題提起であろうことはわかるが、個人的にはまだ物足りなく感じる。そこでこの記事のタイトルに落ち着いた。

「イシュー(チケット)のタイトルには「現状どのように間違っているか」と「本来どのようであるべきか」のどちらか一方ではなく両方を書くべき」

というタイトルであれば、タイトルを読むだけで完結するのでこれが最も良いタイトルだといえるが、せっかくブログを書いている身としてはタイトルだけでなく本文も読んで欲しい。なので読み手にとっては多少不便かもしれないが、ブログ記事のタイトルは少々曖昧さが残っていても良いと思う。

Homebrew でインストールした postgresql に接続できないときの原因と対処法

こういうやつ。類似の質問がたくさんある。

postgresql - Socket File "/var/pgsql_socket/.s.PGSQL.5432" Missing In Mountain Lion (OS X Server) - Stack Overflow http://stackoverflow.com/questions/13868730/socket-file-var-pgsql-socket-s-pgsql-5432-missing-in-mountain-lion-os-x-ser

こういうエラーがでて psql で接続できない場合

psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/var/pgsql_socket/.s.PGSQL.5432"?
原因と対処法その一

Homebrew でインストールする以前から postgresql がインストールされていることがある。 $PATH の設定次第で /usr/local/bin/psql ではなく /usr/bin/psql にパスが通っていたりする。 /usr/bin/psql と Homebrew でインストールした postgresql では Unix domain socket のパスが異なっていて接続エラーになる、みたいなことが起こりうる。

対処法としては、 /usr/local/bin/psql とフルパスで実行するか、 export PATH=/usr/local/bin:$PATH として psql コマンドのパスを変更する。

原因と対処その二

Rails アプリケーションから pg gem で postgresql に接続している場合、Homebrew で postgresql をインストールする前に pg gem を(システムに元からインストールされてた postgresql に対して)インストールし、その後 Homebrew で postgresql をインストールして起動、 Rails アプリケーションを起動しようとすると接続エラーが発生することがある。

対処法としては、 gem uninstall pg でインストールされてる pg gem を(バージョン違いで複数あれば全て)削除し、その後改めて gem install pg なり bundle install なりしてインストールしなおす。

原因と対処その三

Homebrew で postgresql 9.3 から 9.4 にアップグレードするとデータベースのデータ形式が変更されたらしく、データのマイグレーションをしないとデータベースサーバを起動できない。探せば公式のマイグレーション手順ドキュメントが見つかる。

開発環境用のデータベースなのでマイグレーション不要な場合の対処法としては、postgresql サーバを停止したあと rm -rf /usr/local/var/postgres なり mv /usr/local/var/postgres /tmp/postgres なりしたあと brew reinstall --force postgres すると /usr/local/var/postgres を新しいバージョンで initdb しなおしてくれるので、 postgresql を起動しなおして Rails アプリケーションから rake db:create なり rake db:setup なりすればよい。

A "nice to have" person

I had a conviction that I don't become a "Single point of failure" person.

I didn't keep my knowledges secret and shared them as much as possible, I spared no effort to share them for people around me, I didn't cut corners to explain what I know, what I think and what I want to let someone know.

As a results, what happened?

I'm sure to say that I am not a SPOF person. I think I can leave the organization anytime without any trouble. It seems like my effort was realized, wasn't it?

But, at the same time, I feel that I am no longer a crucial person in the organization. Unfortunately, I became a "nice to have" person.

That's my fault. It's pretty ironic but quite different ending from what I thought. I'm not sure where I went to wrong.