僕の Mac の US キーボード設定 3 つ

リクエストに答えて、僕のMacBook Airのキーボード設定を公開します。

US キーボードを使う理由

僕は US キーボードを利用しています。理由は、

  • US キーボードだと 小指で Enter キーを押すので、入力がスムーズ(JIS キーボードだと薬指で Enter キーを押すことになる)

というもので、他に、

  • Delete キー(Back Space)が押しやすい
  • キートップの文字がごちゃごちゃしていない
  • '(シングルクォート)が指に近くて打ちやすい
  • @(アットマーク)が Shift + 2 で、JISキーボードよりも指が憶えていて打ちやすい

など、いくつかあります。

  • Windows だと Alt + ` でIME 切り換えをしなきゃならない

というのはけっこうマイナスですが。後述するように Mac ではこれからも開放されるので、そもそも Windows ノートで US キーボードを入手するのはけっこう大変です。

JISキーボードのように「かな」「英数」を切り替える

Mac の JIS キーボード には Windows キーボードにはない特徴があります。Space キーの隣に「かな」「英数」の切り換えキーがあるのです。親指は、一番力が強いはずなので、ちゃんと使ってタイピングしたいですよね。ところが、 US キーボードにはこのキーがありません。そこで、左右の Cmd キーに「かな」「英数」を割り当てましょう。

使うツールは、 KeyRemap4MacBook です。ダウンロードは以下から。
http://pqrs.org/macosx/keyremap4macbook/index.html.ja

インストールして再起動すると、「システム環境設定」の「その他」に現れます。

「For Japanese」 の項目を探し、「左右のコマンドキーを「英数/かな」としても使う」の項目から「コマンドキーの動作を優先モード」をチェックします。

これで、左右の Cmd キーを単独で押したときに「英数/かな」として使えるようになりました。Cmd + C や Cmd + V といった通常のショートカットも使えます。

なお、僕の環境では、かな入力中に Cmd を連打すると英数に変換されたものが繰り返し出力されます。

例えば、かな入力中に、

左 Cmd を2回押すと英数に変換され、

さらにもう2回押すと繰り返し入力になります。

Cmd + W と間違って Cmd + Q を押してしまってアプリが終了しないように、Cmd + Q は長押しで有効になるようにする

ブラウザのタブを閉じようとして、 Cmd + W を押したつもりが、 W の隣の Q を押してしまって Cmd + Q でブラウザが終了してしまった。おまけに書きかけのテキストが消失してしまったという悲しい記憶はないでしょうか?そんな悲しみを避けることができます。そう、KeyRemap4MacBook ならね。

「Custom Shortcuts」から「Hold Command + Q to Quit Application」にチェックを入れます。

これで、 Cmd + Q をほんの少し長めに押さないと動作しないようになります。

CapsLock に Esc を割り当てる(主にVim用)

これは、正直世界が変わりました。 USキーボードだと、Shift と組み合わせなくても単独で CapsLock キーがトグルで動作してしまいます。僕はよく Vim で j キーを連打して下にカーソル移動したつもりが、 CapsLockがオンになっていて J キーで大量に行連結してしまうということがありました。大文字を入力するときは Shift キーを使うからいっそのこと CapsLock キーを殺してしまおうかと思ったのですが、 Emacs ユーザが Ctrl キーと入れ替えるくらいなので、完全に殺してしまうのはもったいないです。そこで、 CapsLock キーに Esc キーを割り当てることを思いつきました。

調べると、 KeyRemap4MacBook の設定例に出てくるくらいなので、それほど珍しい方法でもないようです。似たような考えをする人はいるもんです。ただ、この設定をするには、「 PCKeyboardHack を使え」と書いてあります。なんと親切な。

というわけで、PCKeyboardHack を入れます。以下でダウンロードできます。KeyRemap4MacBook と同じ方が開発されているようです。ありがとうございます。
http://pqrs.org/macosx/keyremap4macbook/extra.html.ja

これもインストール後「システム環境設定」の「その他」から設定します。

「 CapsLock 」にチェックを入れて、 keycode に Esc の値である 「 53 」を入力します。

ちなみに、 Vim ユーザには、 Esc キーを使わずに、 Ctrl + [ を使う人も結構いるようです。(viだとこの動作をしないような?)Vim と結婚したという噂の方は Jキー連打で Esc になる設定をしているそうです。

お願い

もっといい方法がある、自分はこうしている、といったことをコメントやはてブでぜひ、教えてください。

NHKスペシャル 「コンピューター革命 最強×最速の頭脳誕生」を見た

録画したものを見て、面白かったのでちょっとしたメモを。

ググったらまとめがあった。余談だけど、このサービスにすごい可能性を感じる。
http://6mj.tv/episode_D7672DAD03FA3465A2C35D4C3E1373B3.html

  • 駅名にもなっているスーパーコンピュータ「京」の話。

絵でわかるスーパーコンピュータ (KS絵でわかるシリーズ)

絵でわかるスーパーコンピュータ (KS絵でわかるシリーズ)

  • IBMのワトソンの話。

IBM 奇跡の“ワトソン”プロジェクト: 人工知能はクイズ王の夢をみる

IBM 奇跡の“ワトソン”プロジェクト: 人工知能はクイズ王の夢をみる

  • 東大入試コンピュータの話。

新井紀子教授「人間がどういうことをしてくか、が新たにデザインされる」

コンピュータが仕事を奪う

コンピュータが仕事を奪う

ちなみに、東大の研究室に次の本が置いてあった。
日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

日本語入力を支える技術 ?変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

DNAの塩基配列からタンパク質の3次元モデルをシミュレーションする話は大学の研究室で経験していたので、親近感があった。

自動売買で株価が乱降下した事件は知っていたが、番組をみて、自分が考えるよりもおそろしく速いタイミングで売買が行われていることを知った。あの速さで処理ができるとは。

NY株乱高下、高速取引も一因か コンピューター売買
http://blog.livedoor.jp/ss2286234570/archives/65578667.html

ゴードン・ベルについては、以前、次のDVDで見た。

このDVDも見たい。
シリコン・バレーの百年 [DVD]

シリコン・バレーの百年 [DVD]

本人も書いてるライフログの本。
ライフログのすすめ―人生の「すべて」をデジタルに記録する! (ハヤカワ新書juice)

ライフログのすすめ―人生の「すべて」をデジタルに記録する! (ハヤカワ新書juice)

個人的にライフログ系のサービス作りたいと思って、iPhoneアプリ作りたいと準備しだしている。

Rails で十分に活用されていなくてもったいない ActiveRecord::Relation のメソッド TOP 10

2013年12月2日更新: 参照されることが多いので Rails 4 の情報を訳注として追記しました。また、Rails 4 に関する情報は、 WEB+DB PRESS Vol.73 が非常に参考になるので、一読をおすすめします。

この文章は Mitch Crowe 氏のブログより 2012年4月14日の記事を翻訳したものです。


The 10 Most Underused ActiveRecord::Relation Methods
http://blog.mitchcrowe.com/blog/2012/04/14/10-most-underused-activerecord-relation-methods/


昨日は ActiveRecord::Relation のコードに膝まで浸かって、使われているのをこれまで全然見たことがない面白いナゲットを思い出させてくれた。この記事で、十分に活用されていない Relation クラスのメソッドのトップ10をリストにしたので、楽しんでもらいたい。

10位 ブロック付きの first_or_create

first_or_create はとてもなじみ深い。

Book.where(:title => 'Tale of Two Cities').first_or_create

そして、名前通りのことをやってくれる。だが、特定の属性を持つレコードを find するとか、それらの属性を持つレコードを create して、さらに追加で属性を設定したくなることが頻繁にあると思う。これを簡潔にやるには first_or_create にブロックを与えればいい。

Book.where(:title => 'Tale of Two Cities').first_or_create do |book|
  book.author = 'Charles Dickens'
  book.published_year = 1859
end

9位 first_or_initialize

このレコードをまだ保存したくない場合は、 first_or_initialize が使える。

Book.where(:title => 'Tale of Two Cities').first_or_initialize

8位 scoped

あるクラスの持つすべてのレコードを表した ActiveRecord::Relation がほしいことがある。そんなときは scoped メソッドを使えば簡単に生成できる。(訳注: Rails 4 では、 scoped が非推奨になり、 all が Array から ActiveRecord::Relation のオブジェクトを返すようになりました。Rails 4 では scoped から all に変更してください。)

def search(query)
  if query.blank?
    scoped
  else
    q = "%#{query}%"
    where("title like ? or author like ?", q, q)
  end
end

7位 none ( Rails 4 のみ)

同じように、オブジェクトを含まない ActiveRecord::Relation がほしいことがある。空の Array を返すことが、大抵それほどよくないのは、 API の利用者が Relation オブジェクトを期待しているからだ。代わりに none を使えばいい。

def filter(filter_name)
  case filter_name
  when :all
    scoped
  when :published
    where(:published => true)
  when :unpublished
    where(:published => false)
  else
    none
  end
end

注意:最先端を行く人は今すぐ none を使いたくなっていることだと思う。これは、 Rails 3 ではなく、 Rails 4 で利用できる。だが、Rails 4 を待つまでの間も簡単に書くことができる。 この Stack Overflow のスレッドをチェックしてほしい。

6位 find_each

数千レコードをイレテートさせたくなっ場合、each を使いたくはないだろう。
each は1 つのクエリを実行して、全レコードを取得し、それらすべてをメモリ上にインスタンス化してしまう。メモリを十分に確保しているならいい。確保してなければ、これは Rails アプリをフリーズさせる素敵な方法になる。find_each は、そうではなく、レコードをバッチ処理で find して(デフォルトは1000件)、一度に yield する。その結果、同時に全レコード分のメモリを確保する必要がなくなる。

find_each は yield されるレコードの順序を指定できないので注意だ。指定してもただ単に無視される。

Book.where(:published => true).find_each do |book|
  puts "Do something with #{book.title} here!"
end

5位 to_sql と explain

ActiveRecord は素晴らしいが、思った通りのクエリをいつも生成してくれるとは限らない。コンソールに飛んで、組み立てた Relation で この 2 つの命令を実行してみよう。賢いクエリにマップされているか確認して、そうなってなかったら愛情込めて作ったインデックスを使うようにしよう。

Library.joins(:book).to_sql
# => SQL query for you database.
Libray.joins(:book).explain
# => Database explain for the query.

4位 find_by(Rails 4 のみ)

Rails で書いたコードは次のような行で散らかったものになりやすい。

Book.where(:title => 'Three Day Road', :author => 'Joseph Boyden').first

代わりに、 find_by というショートカットメソッドが使える。

Book.find_by(:title => 'Three Day Road', :author => 'Joseph Boyden')

これは上と同じものが実行される。

注意:最先端を行く人は今すぐ find_by を使いたくなっていることだと思う。これは Rails 3 ではなく、 Rails 4 で利用できる。

3位 scoping

scope メソッドを特定の Relation として使える。Rails のドキュメントにある次の例を検討してみよう。

Comment.where(:post_id => 1).scoping do
  Comment.first # SELECT * FROM comments WHERE post_id = 1
end

これはまったくもって使いやすい。

2位 pluck

特定のレコードのカラムで配列にしたいことがないだろうか?私はこういうにを本当にたくさん見てきた。

published_book_titles = Book.published.select(:title).map(&:title)

さらに悪い場合だとこうだ。

published_book_titles = Book.published.map(&:title)

代わりに pluck を使おう。

published_book_titles = Book.published.pluck(:title)

(訳注: Rails 3 では、pluck の引数に指定できるシンボルは 1 つでしたが、 Rails 4 ではシンボルの配列を指定することで、属性を複数指定することができます。select で複数の属性を指定した場合と違い、2次元配列を返します。3 系でも比較的最近のバージョンで使えるはずです。)

1位 merge

僕はこの宝石なしには生きられない。しかし奇妙なことに、これはソース中にドキュメントされていないし、今まで見たガイドでも言及がない。これを使うと、結合( JOIN )ができて、結合されたモデルに対して名前付きスコープでフィルタできる。(訳注: 私見ですが、4.0.0 では merge が意図と違う動作をしないかよく確認した方がよいと思います。*1 いくつか修正が入っている4.0.1 以降でも試してみてください。)

class Account < ActiveRecord::Base
  # ...

  # Returns all the accounts that have unread messages.
  def self.with_unread_messages
    joins(:messages).merge( Message.unread )
  end
end

WEB+DB PRESS Vol.73

WEB+DB PRESS Vol.73

シェルスクリプトで $0 使うときの注意

これも同じメモに書いてあった小ネタ。

/Users/username/test.sh というファイル名のスクリプト中に

echo $0

とあった場合、$0 は起動時のパスになるので、

% ./test.sh 
./test.sh
% 
% /Users/username/test.sh
/Users/username/test.sh
%
% ~/test.sh 
/Users/username/test.sh
% 

といった具合で、同じ環境でも起動の仕方で出力が変わる。$0 の値からパスを解析してゴニュゴニョしようとするとバグになるので注意。

SQL で 300 個の空白を出力する

小ネタです。昔々のメモが見つかったので、紙を捨てる前にこちらに転記しておく。間違っているかもしれない。

select LPAD(' ', 300, ' ') from dual;
select CAST(' ' AS CHAR(300)) from dual;

こちらはCHAR型に変換しているので、2000バイトまで。

みなとRuby会議01 に参加した #minatork01

ちゃんと書こうとすると出せなくなるので、細かいこといろいろ書いたけど消した。感想としては、ずいぶん前からスタッフが準備している様子を Twitter のタイムラインで見ていたので、上手くいってよかったなと思う。自分は当日スタッフぐらいはやるつもりだったけど、多くのスタッフがいたので、その必要もなく。あっという間だったという声が聞かれたのは、みんなが楽しんだということではないかなと。Yokohama.rb に参加したことがないという人が結構挙手していたけど、司会をはじめとした、Yokohama.rb の主要メンバーの中には横浜から遠いところに住んでいる人が結構いるのはもっと知られた方がいいんじゃないかな。スタッフと参加者のみなさん、どうもありがとうございました。

rbenv で新しいバージョンの ruby を入れたときの備忘録

2014年1月8日追記:
検索で辿り着いた方へ
以下の情報は古くなっているので別の情報をお探しください。
追記ここまで。

Ruby のバージョン を 1.9.3-p125 から 1.9.3-p194 に上げようとしたときにどうやるか理解していなかったので、備忘録代わりにメモ。OS は Lion 。

% rbenv install 1.9.3-p194
ruby-build: definition not found: 1.9.3-p194

と出たので、 rbenv install でインストール可能なバージョンを確認する。

% rbenv install
usage: rbenv install VERSION
       rbenv install /path/to/definition

Available versions:
  1.8.6-p383
  1.8.6-p420
...
  1.9.3-p0
  1.9.3-p125
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  jruby-1.6.3
...

当然 1.9.3-p194 はない。rbenv rehash をやってみたけど、さすがにネットワークから取得してくれたりはしなかった。ruby-build の定義情報はどうやって更新されるのかなと思ったのだが、

  • ruby-build 自体に ビルド方法の定義を更新するオプションやサブコマンドはない
  • ruby-build 自体を Homebrew などで入れ直す必要がある

ということらしい。

自分の ruby-build のバージョンは、2012年2月16日のものだった。

% ruby-build
ruby-build 20120216
usage: ruby-build [-v|--verbose] definition prefix
       ruby-build --definitions

brew install --HEAD ruby-build で ruby-build を入れ直す。 事前準備として brew unlink が必要。

% brew install --HEAD ruby-build
Error: ruby-build-20120216 already installed
To install this version, first `brew unlink ruby-build'
% brew unlink ruby-build
Unlinking /usr/local/Cellar/ruby-build/20120216... 3 links removed
% brew install --HEAD ruby-build
==> Cloning https://github.com/sstephenson/ruby-build.git
Cloning into '/Library/Caches/Homebrew/ruby-build--git'...
remote: Counting objects: 55, done.
remote: Compressing objects: 100% (46/46), done.
remote: Total 55 (delta 27), reused 29 (delta 8)
Unpacking objects: 100% (55/55), done.
==> ./install.sh
/usr/local/Cellar/ruby-build/HEAD: 45 files, 196K, built in 6 seconds

というわけで 1.9.3-p194 のインストール。

% rbenv install 1.9.3-p194      
Downloading http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz...
Installing yaml-0.1.4...
Installed yaml-0.1.4 to /Users/username/.rbenv/versions/1.9.3-p194
Downloading http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz...
Installing ruby-1.9.3-p194...
Installed ruby-1.9.3-p194 to /Users/username/.rbenv/versions/1.9.3-p194
% rbenv global 1.9.3-p194

ちなみに、rbenv install した直後は rbenv rehash は不要。bundle コマンドを叩くと ruby のバージョンが違うと怒られたので、Bundler も入れ直し(これでは ruby のバージョンを切り替えられるメリットが少ない気が)。Bundler がどうやって ruby のバージョンを参照しているかすぐにはわからなかったのですが、知っていたらぜひ教えてください。

% sudo gem install bundler