Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

『リファクタリング・ウェットウェア』を読んだ

TL;DR

今までのやり方に行き詰まっている、意識的に学びたい、そんなときに読むと実践的な知見が得られてオススメです。

概要

原著の題名は "Pragmatic Thinking and Learning" ということで、実践的な思考法と学習法、といったところでしょうか。日本語訳の題名は、ウェットウェア(脳)のリファクタリング、となっていて何だろうと思わせるような感じになっています。副題は、達人プログラマーの思考法と学習法、です。

章の構成としては以下のようになってます。

  • ドレイファスモデルを使い、初心者と達人にはどのような違いがあるのか、どのように達人になっていくのかを始めに説いています。
  • 次に、人間の脳はどうなっているのか?というプログラマーは普段興味を持たない(であろう)分野の解説をしています。
  • 脳の特性を理解した上で、達人に近づくべく思考法や学習法を学んでいきます。
  • 最後に達人になってからのちょっとした注意喚起が書かれて締められています。

ここからは私が気になったトピックを2つ挙げて感想を書いていきます。

コンテキストスイッチングのコスト

短期記憶を全て読み込み直すには平均20分かかると言われています。コンテキストスイッチングをいかに行わないか、またそれを行うとしても集中状態を保つかということが書かれています。

これは自分自身の最近の仕事のやり方にもあてはまるな、と感じていて、複数のプロジェクトを進行したり、メールの対応、各種質問の対応、ミーティングなどコンテキストスイッチングが多く発生する状況になっています。自分自身のリソースは限られているため効率的に作業できないかなと考えていたところにこの本に出会ったので、なにか運命めいたものを感じました。意識的に割り込みを遮断するコントロールや他のコンテキストに戻れるように簡単なメモを残しておくなどのテクニックはすぐに実践しようと思います。

RモードとLモード

人間の脳には大きく2つのモード(Lモード: リニアモード, Rモード: リッチモード)があると書かれています。Lモードは言語的、分析的、計数的などのプログラミングに必要そうな特徴をもっています。Rモードは非言語的、総合的、具体的、非合理的などプログラミングとは一見かけ離れた特徴をもっています。しかし、このRモードを活用することで達人プログラマーに近づけると書かれています。

Rモードの脳は強力なパターンマッチングと検索機能を備えている、Rモードからの出力は言語で表現することができない、などかなり興味深い動きをするRモード。この機能を利用して思考を高める方法や効率的な学習法を提起していて、面白いアプローチだなと思いました。中には(科学的に実証されていないなどで)あやしげな方法もあるので自分の判断で取り入れるのをオススメします。

Rモードの働きをトレーニングするということで試しに上下反転になった絵を見てそれをそのまま描く、ということをやってみました。注意点は、30-40分くらい静かで邪魔の入らない環境を用意する。お手本にする絵の向きを変えてはいけない。特定の部位を認識しても、その名前を意識してはいけない。結果としてこのような絵を描くことができました。

読み込み中

リファクタリング・ウェットウェア』の認知転換の話で描いてみた絵。上下反対になったものを書き写しただけだが、うまく描けてる感があるw

Instagramで閲覧

私は絵が得意ではないので、認知の仕方を変えるだけでこうも違うのだなあと驚きました。

おわりに

普段使っている脳の働きを知ってそれに合うやり方を行う、というのは合理的だなあと思いました。プログラミング言語フレームワークの特性や中の処理を理解しそれを利用することと似ていて、プログラマーにもスッと入ってくる方法だと思います。個人的にはドレイファスモデルや認知の部分にも興味を持ったので、これらの分野の書籍も読んでみたいです。

AnsibleでRails appが動く環境を作ってる

先日のほっかい道場にてAnsibleを学ぶモチベーションが高まったので、早速ドットインストールのAnsible入門をやりました。 ここでは、基礎的なAnsibleの使い方を学んで、LAMP構成の環境を作りました。

ふむふむ、なるほど、と思いRailsアプリケーションが動く環境を作ってみようと思いました。 仕事でもプライベートでもRails使うことが多いので、より実践的な感じですね! ひとまずガガッと作ってRails appが動くところまでできたので感想などつらつら書いてきます。

ソースコード

https://bitbucket.org/TAKAyuki_atkwsk/ansible-rails-work/src/f3a7dbd72091

サーバー構成

こんな感じで環境を構築してみます。Vagrantを使って立てたサーバーに対して、ローカルからAnsibleであれやこれや行うイメージです。 Rails appは別途デプロイツール(Capistranoとかminaとか)でデプロイします(詳細は割愛)。

ハマったところ

  • Vagrantで立ち上げたサーバーに対してplaybookを適用するときに、単純に ansible-playbook コマンドを実行してもうまくいかなかった。
    • Vagrantfile のなかで config.vm.provision "ansible" do ... のブロックを書いておくと vagrant provision コマンドで playbook を適用することができる。
  • rbenvの初期化コマンドを .profile に書き込むのだが、playbook適用ごとに毎回追記されてしまった。
  • playbook 適用時に rbenv コマンドを絶対パスで指定しないと実行できない?
    • パスが通っていない模様。
    • 厄介そうだったのでいったん放置した。
    • playbookをリファクタするときに解決したい。

やってみて

とりあえずymlにやりたいことを書いて置けば、あとはコマンド実行すればインストールや設定などいい感じにやってくれるのでカジュアルでいいなと思いました。 参考にしたplaybookを見ているとディレクトリ構成などちゃんとしているので、ドキュメント見ながらリファクタしていきたいです。 ひとまずはRails appが動く最低限の環境が整ったのでよしとしよう。

Try

  • playbookのリファクタ
    • best practicesなど参考にする
    • ベタ書き部分の変数化(ユーザー名、パス、Ruby versionなど)
    • role を理解する
  • nginx.conf の管理
    • unicorn使いたいのでその設定を管理したい
  • rbenv コマンド実行できない問題
    • ハマったところを参照

参考

ほっかい道場 第二回勉強会に参加してきた

こちらの勉強会に参加してきました。 第二回勉強会 | GeekDojo 〜プログラミングの学習にぬくもりを〜

コンセプトとしてはこんな感じです。

DockerとかAnsibleを題材にディスカッションします。 作っているものとか、作っている資料とかあれば見てもらったりしましょう。

私の参加目的としては、インフラまわりももっと知りたいなあ、というところと自動化して楽したいなあ、というところでした。 とはいえ、ChefやPuppet, Docker などはちょろっと触ったぐらいなので、この道場を通してなにか一つでもモノにできたらいいなあ、という感じです。

話題

感想

今回は私を含め3人で雑談したりコード見たり、という感じでいい距離感でコミュニケーションできたなあと思いました。 (ほっかいさんが共通の知りあいだったというのもあって安心だった。) また、会場もおしゃれなところで、たまにラテン系の陽気なBGMが流れたりして雰囲気良かったです。 事前にツールをあまり触れられなかったのが私自身の課題でした。なので、次回までにドットインストールのAnsible入門をできるところまで進めていきたいです。

ということで次回も参加できたらなあと思います。

hubot-queue というのを作ってみた

今日の午前中を使って、hubot-queueというhubot scriptを作ってみました。

TAKAyukiatkwsk/hubot-queue
hubot-queue

文字列を格納できるQueueを提供します。ただそれだけ。 使い方はREADMEを見ていただけるとお分かりいただけると思います。 enqueuedequeueというコマンドしか用意していません。(今のところ)

以下に使用例を挙げておきます。storageのqueue.Shellに配列で文字列が格納されています。 デフォルトではコマンドを叩いたユーザーの名前がqueueのkeyになります。

Hubot> hubot enqueue hello world
Hubot> hubot enqueue hello hubot
Hubot> hubot show storage
Hubot> { users: { '1': { id: '1', name: 'Shell', room: 'Shell' } },
  _private: {},
    queue: { Shell: [ 'hello world', 'hello hubot' ] } }
Hubot> hubot dequeue
Hubot> hello world
Hubot> hubot dequeue
Hubot> hello hubot

なんで作ろうと思ったのか

朝シャワーを浴びているときにパッと思いついて作りました。 「あとで読む」みたいな記事とかサイトをとりあえずここに突っ込んでおいて、 暇なときに取り出して続きを読む、みたいなのを気軽にやりたいなと思って作った次第です。

参考にした記事

ハマったところ

  • パッケージ化してexternal-scriptsとして読み込もうとしたのですが、Error loading scripts from npm package と怒られてしまった
    • グローバルでインストールしたHubotを実行していたのが原因
    • カレントディレクトリで bin/hubot で実行すれば問題なくパッケージ読み込めた
    • ここに書いてある https://github.com/github/hubot/tree/master/docs
  • Queueに入れるデータをJSON化して保存しようと思ったが断念した
    • データ型によって文字列だったらクオーテーションを文字列として追加するとか、数値型はそのままでいいとか、厄介だった

あとがき

チャットで使うときにhubot dequeueの結果がコマンドとして実行されるようになるとおもしろそう。(できるのか??) あとちゃちゃっと作ったのでQueueのサイズを全然気にしていません。Redisに格納できるサイズってどんなもんなんだろうか...。 そういえば、これが初めてのnpm publishとなりました。

MongoDBで配列の要素数を条件にしたクエリ

$size 演算子を使うとよい。

http://docs.mongodb.org/manual/reference/operator/query/size/

例えばブログの記事のコレクションがあったとする。

{
  "_id": ObjectId("53c5339ab967a1dd52f52402"),
  "title": "Rubyでhogehoge",
  "tags": [
    "ruby", "programing", "rails"
  ],
  "body": "..."
}
{
  "_id": ObjectId("53c5339ab967a1dd52f52403"),
  "title": "MongoDBでfugafuga",
  "tags": [
    "mongodb", "database"
  ],
  "body": "..."
}

タグがちょうど2つ付いた記事を検索したいときは以下のようにする。

db.blogs.find({ "tags": { $size: 2 } });
// { "_id": ObjectId("53c5339ab967a1dd52f52403"), ... }

Mongoidだと with_size というのを使うと抽出できる。

http://mongoid.org/en/origin/docs/selection.html

Blog.where(:tags.with_size => 2)
Blog.with_size(tags: 2)

参考:
http://stackoverflow.com/questions/4705024/mongodb-query-based-on-count-of-embedded-document

AngularJS ng-click で preventDefault したい

AngularJS を使っていて、 <a> タグの ng-click に設定した処理のあとリンク先に遷移しないようにしたいことがありました。

$event というオブジェクトを評価したい関数に渡すことができます。 この $event に対して preventDefault()stopPropagation() が呼び出せます。

ということで簡単なサンプルを書いてみました。

また、<a> タグの href 属性の値を空にすることでページ遷移やリロードすることなく、ng-click に設定した式を評価できます。

ソースコードを見ると click イベントが発生すると preventDefault() していますね。

どこにもリンクしないのに <a> タグを使う必要があるのか、とあまり腑に落ちませんが、こういうやり方もあるということで書いておきます。

Try Hubot

週末にHubotを使ってみたのでメモ。ローカル環境で動かすところまでです。

OS X にインストール

はじめてのHubot - Qiita

ここを参考にしてHubotをOS Xにインストール。node.jsとRedisがあれば手元ですぐに動かす事ができます。

hubot-scripts を使う

github/hubot-scripts ここに登録されているスクリプトを使うことができます。

Hubotのルートディレクトリに hubot-scripts.json というファイルがあるので、ここに使いたいスクリプトのファイル名を追加します。

["redis-brain.coffee", "shipit.coffee", "ruby.coffee", "aws.coffee", "base64.coffee"]

このあとHubotを再起動すれば追加したスクリプトが使えるようになります。 スクリプトにモジュールの依存関係がある場合は、 package.json に依存するモジュールを定義して npm install し、Hubotを起動します。 例えば base64.coffee を追加すると以下のようなコマンドが使えるようになります。

Hubot> hubot base64 encode asdfghjk
Hubot> YXNkZmdoams=

環境変数を渡す

例えば aws.coffee を使う場合、AWSのアクセスキーなどが必要になります。 ローカルで動かす場合には変数をコマンドと一緒に指定するとうまくいきます。

$ HUBOT_AWS_ACCESS_KEY_ID=access_key \
    HUBOT_AWS_SECRET_ACCESS_KEY=secret_key \
    HUBOT_AWS_SQS_REGIONS=ap-northeast-1 \
    HUBOT_AWS_EC2_REGIONS=ap-northeast-1 \
    bin/hubot

参考: Node.js の起動オプション、環境変数、npm start の話 - Block Rockin’ Codes