考えるとは何か

「考える」とは一体何だろう。何をすれば考えたことになるだろうか。考えたと言えるために必要なアウトプットはなんだろうか。

僕が考えたところによると、「考える」とは

  • 問いを立てる
  • 立てられた問いに対して解とその根拠を導く

ことだ。

特に重要なことは最初の「問いを立てる」ことだ。
問いというのは何かを考えているときには暗黙のうちに立っている。
しかしその初期の問いは曖昧だったり問いとして適切でなかったりする。
だから考える最初のステップは問いを洗練させることなのだ。


そのためにはまず問いを言葉にして表わそう。紙に書いて一度外部化するのが一番良い。そうすると5W1Hがすっぽり抜け落ちていたり、用語がとても曖昧だったり、そもそも大きすぎる問いだということに気づく。
そうしたら不足している言葉を補ったり、問いをさらに小さな問いの集合に分割して問いを洗練させていこう。
十分小さく明確な問いになればずっと解を出しやすくなる。


5W1Hが不明確な問いは答えようが無い。
用語の定義が定まっていない問いは思考がふらつく。
問いが曖昧なまま"考え"ても思考の迷路に入り込むだけだ。
思い悩むとは問いを立てずにあれこれ不安に思うこと。
誰かと一緒に考えるというのは問いを共有することから始まる。


僕らが日常で出会う「考える」は、問いを適切に立てさえすれば解決するものがとても多いのだ。

mysql で 全角-半角, ひらがな-カタカナ を同一視する utf8_unicode_ci

mysql のテーブルを作成するときに

  collate utf8_unicode_ci

というオプションをつけることで、like 検索において全角と半角、ひらがなとカタカナが同一視されて検索されるようになる。

カラム単位でも collate は設定可能。

ソース
http://www.tatamilab.jp/rnd/archives/000389.html

(追記)
like だけじゃなく、=検索でも同一視されますね。インデックスも利くので collation は mysql の文字の内部表現ということなのかな。

ビューファースト(view first)という考え方

最近何ごともゴール志向で考えるのがマイブームになっている。ゴール思考というのは、何をするにもまず目的(ゴール)を決めて、そのゴールから逆算してスケジュールやタスクを洗い出すというやり方。これはかなり汎用的な考え方で、仕事のスケジュールだけじゃなくて日常の生活でも使うべき方法だ。

では、ウェブアプリの開発でこのゴール志向をしようとしたときに、ゴールに相当するものは何だろうか。それは view になる。ユーザに届ける最終的なアウトプットはviewだからだ。

view (template)をどのように書くか?が思考のスタートポイントとなる。画面のラフ案やデザイン案をみながら、この画面を出力するためにはこのようなテンプレートを書かなければいけない、という風にまずは考える。ここが決まると、このようなテンプレートを書くためにはこのようなモデルがロードされていなければいけない。また、モデルはこれこれのインターフェースを持つ必要がある。モデルがロードされるにはコントローラーでこのような処理をしないといけない。さらにモデルはこのようなカラムが必要。。。という風に仕様が逆算されていく。手戻りも少ない。

view が全てのスタートポイントとなるので、ここに曖昧さを残さないように、どれだけ具体的に考えるか、がポイントとなる。

knoppix を使って raid1(ミラーリング) のデータ復旧

raid1(ミラーリング)を構成していた2つのディスクのうち、どちらか片方からデータを読み出す方法。knoppixを用いる。

まずはknoppixを起動する。バージョンは 5.3.1を使った。

起動後、modprobe raid1 として raid 用モジュールを読み込む
(raid5 の場合は raid456 というモジュール)。

まず、サーバにつながっているraidの構成を確認する。

  mdadm --examine --scan

すると、現在接続しているディスクをスキャンして、raid 用のパーティションを認識してくれる。この設定を /etc/mdadm/mdadm.conf に追記する。

  mdadm --examine --scan >> /etc/mdadm/mdadm.conf

矢印は二つ必要なことに注意。

この時点で mount 可能になる。

 mount /dev/md1 /mnt/hdb2

など。

(追記)
一つ手順が抜けていた。mount する前に

  mdadm --assemble /dev/md1

などのようにしないとマウントできなかった。このコマンドを実行するとエラーメッセージは出るが、コマンドの実行後
mount に成功するようになる。

rating に基づく正しいランキング方法

http://www.evanmiller.org/how-not-to-sort-by-average-rating.html

amazon のようなユーザが商品に対して点数をつけることができるサイトでユーザの採点に基づいて商品のランキングをつけるとする。さて、どのように順位を計算すべきか?というお話。

  • 方法1:positive rating - negative rating。この方法は1000人がgood, 900人がbadと採点したときと100人がgood,0人がbadと採点したときとを同一視してしまう。
  • 方法2:postive rating / negative rating。この方法はgood:bad = 100:10 よりも good:bad = 1:0 のほうを重視してしまうという問題がある。
  • 方法3(正しい?方法):Wilson score confidence interval(信頼区間) を用いる。数式はURL参照。

rails を graceful restart する方法

graceful restart とは、現在実行中のリクエストを処理し終えてから restart を行うこと。

rails そのものは graceful restart の仕組みを提供していない。fastcgi, mongrel などのコンテナレベルでの仕組みを使うことになる。他のコンテナでのやり方は調べていないが、fastcgi, mongrel ではいずれも USR2 というシグナルを送ることで restart してくれる。中で再度 exec を発行するので ruby プロセスが新たに作られる。そのため使用メモリが一旦リセットされる。

重たい処理をしてメモリが肥大してしまったプロセスなどを定期的に初期化するなどに使うとよい。

以下、方法。

fastcgi で起動している場合
killall -USR2 dispatch.fcgi

mongrel で起動している場合
killall -USR2 mongrel_rails

でいけると思う。

(追記) fcgi の場合、どうも USR2 によって exec しなおした際に、cmd (/proc/PID/cmdの中身)が "ruby dispatch.fcgi" から "ruby" に変わってしまうっぽい。そのため二度目以降 killall dispatch.fcgi としてもシグナルの対象から外れてしまう。
代わりに以下のようにして自前で kill すればよい。

ps aux | grep dispatch.fcgi | sed "s/ \+/ /g" | cut -d' ' -f 2 | xargs killall -USR2