JavaScriptの<<とMath.powの違い

投稿者 nanki 2010-05-18 22:26:00 GMT

某所で話題になったのでまとめ。

JavaScriptで、

200 << 24
=> -939524096

200 * Math.pow(2, 24)
=>3355443200

の結果が違うという話。

200 が 7~8bitなので、すぐに32bitの壁だとわかるが、これは仕様なのか、実装によるものなのか。

ECMA-262, p.76

  1. Let lref be the result of evaluating ShiftExpression.
  2. Let lval be GetValue(lref).
  3. Let rref be the result of evaluating AdditiveExpression.
  4. Let rval be GetValue(rref).
  5. Let lnum be ToInt32(lval).
  6. Let rnum be ToUint32(rval).
  7. Let shiftCount be the result of masking out all but the least significant 5 bits of rnum, that is, compute rnum & 0x1F.
  8. Return the result of left shifting lnum by shiftCount bits. The result is a signed 32-bit integer.

つまり、

(signed int32)(ToInt32(200) << (ToUint32(24) & 0x1F))

こういう感じになる。

結果は32bit符号付き整数なので、こうなるのは仕様。

参考:

HP PSC 1500というプリンタで名刺を刷ろうと思ったのだが、ミシン目のできないシール台紙のやつは厚みがありすぎて紙が滑り紙送りが正常にできない。

そんな時は、定規などで3mmくらい残して、両端のシールを剥がすとよい。 忘れずに、プリンタに最初に突っ込む方のシールも剥がしておく。

印刷範囲の拡張もできて便利!


Ruby1.8, Ruby1.9のIOの挙動の違い

投稿者 nanki 2010-04-28 04:47:00 GMT

表にまとめてみた。 主な違いは、getc/readcharがbyteを返すだけみたいだ。

getchar/getlineがあってほしい((# getcは数値を返して欲しい))

get - nil at EOFread - EOFError at EOFenumeach
(char) 1.8 N/A N/A chars each_char
1.9 getc readchar chars each_char
(byte) 1.8 getbyte, getc readbyte, readchar bytes each_byte
1.9 getbyte readbyte bytes each_byte
(line) 1.8 gets readline lines each_line, each
1.9 gets readline lines each_line, each

死のイメージ

投稿者 nanki 2010-02-25 10:02:00 GMT

初めて人の死に接したのは、ひいおばあちゃんのお葬式で、4〜5歳くらいだった。
今でも覚えているが、別に悲しいことではなかった。
誰だかわかっていなかったし、親戚の家で行われた式だったが、その家にはお気に入りのおもちゃ群があって、僕が騒がないように親戚のお兄さんが遊んでくれた。

棺に花を詰め、霊柩車に載せて、火葬場まで行って、遺体が焼かれるのを見守った。
死んだ、というのはわかっていたが、生きている姿を見たことがなかったからか、眠っているような遺体をみんなで囲む会が催された、というだけだった。

それからしばらくして、バイオリンの練習をサボったかどで母親に怒られ、ふてくされて、布団にくるまりながら泣いている時に、初めて死を意識した。
といっても、母親に殺されそうになったとか、あまりのひどい仕打ちに自殺を考えたとかではなく、 母親の言い放った、空からひいおばあちゃんが見てるぞ、というような意味の言葉について考えていた。

全くくだらない脅しを言ったものだと思うけど、カーテンの隙間から曇った夜空を覗いてみて、今日は曇ってるから大丈夫だな、と思ったのを覚えている。

曇った空と、閉まったカーテンで、脅しの効果はなかったが、 その言葉から、死んだ後も意識が存続し続けるのだ、という概念を感じ取ったに違いない。

当時知り得た知識から、死とは、

  • 眠るようなもので、
  • 息をしてなくて、
  • しゃべれない、
  • 燃やされる、
  • 埋められる

というものだった。

意識の主体が、脳という物理的容器に束縛されていて(この認識の正しさは主張しないが)、 燃やされたらなくなってしまうということすらわかってなかったので、 眠りながら、息を止めて(ここまではやってみた)、燃やされて、埋められる、その間中ずっと喋れないのが何十年も(永遠に!)続くのを想像して怖くなり、 全然泣き止まなくて、この時ばかりは厳しくしすぎたと思ったのか、その晩だけは母親は優しかった、と思うのは美化された記憶かもしれない。

今では、死はそういうものではない、とわかってはいるものの、あの時見た死のイメージは今でも残っていて、死に対しては悲しさよりも恐怖、時には憤りすら覚える。


MacOSXで最強のTerminal環境を構築するには

投稿者 nanki 2010-02-11 04:00:00 GMT

screenshot

大それたタイトルだが、Terminal.app(以下Terminal)のタブ機能を快適に使う話である。

Terminalを使い倒している皆様なら、当然のことながら、5~10の端末が開いていると思うが、僕は今までタブを使ってこなかった。

これは大体次のような理由によるものである。

  1. 切替が面倒くさい
  2. 中身が分からない
  3. タブの分狭くなる

今回は、この三つの問題を解決して、タブを快適に使おうじゃありませんか。

問題: 切替が面倒くさい

これはTerminal.app が、次のタブ/前のタブ、という操作しか用意していないことに起因する。 2~3つなら問題ないが、5~10のタブを切り替えるには機能不足。

これを terminaltabswitchingを使って解決する。

terminaltabswitching はTerminal.appのタブの切替を⌘0-9 で行えるようにするSIMBLプラグイン。 本家からforkされ、いくつかSnowLeopard関連の変更などがあたっていそうな niw’s terminaltabswitching at master - GitHub に、このコミットをマージしたものを使っている。

ビルド方法は

$ xcodebuild -configuration Release build

buildするだけで勝手にinstallされる。

これで、タブの切替が楽になった。

問題: 中身が分からない

タブの切替は出来るようになったが、タブの中身は切り替えるまでわからない。 プロセス名が書いてあったりするが、全部zshじゃあどれがどれだかわからないし、vimを終了すると、”Thanks for flying Vim”とかに書換えられて鬱陶しい。 ここでは、zsh と vim について掘り下げる。他の環境の人は各自深追いしてください。

# ~/.zshrc
function title {
  print -n "\e]0;$@\a"
  export TITLE="${(pj: :)@}"
}

chpwd() {
  title $(basename "$(pwd)")
}

cd .

まず、便利な関数titleを用意する。 $ title hello terminal! でタブのタイトルが設定できる。 また、現在のタブのタイトルを簡単に得る方法がたぶんないので、環境変数に保存する。

chpwd は、カレントディレクトリが変化した時に呼び出され、現在のディレクトリ名をタイトルに設定する。 これで、どのタブが何か一目瞭然となる。わからないのは、ディレクトリ名をつける人のセンスの問題に帰着する。

# ~/.vimrc
execute ":set titleold:".fnameescape($TITLE)
execute ":set titlestring:".fnameescape($TITLE." - %t")

vimは終了時に、titleoldをタイトルとして設定するので、それを、環境変数$TITLEにしておく。 さらに、ファイル編集中は、ファイル名が表示されるようになった。

問題: タブの分狭くなる

MacOSXの画面はただでさへ、Dockやメニューバー、タイトルバーで狭くなっているのに、この期に及んでタブバーでさらにせまくなるなんて許せない。 もう、画面を90度回転させて使いたい。

回転は首が痛くなりそうなのであきらめて、アプリケーションをフルスクリーンで使う方法ならある。 megazoomerがそれ。これもSIMBLプラグイン。SIMBL様さま。 使い方は、ここぞという時に⌘Enter

どうせ、タブとか考慮されてないから、変な事になるんでしょ、と思いきや、Dockもメニューバーもタイトルバーもきれいに消えて、すごい快適。

難点は、

  • そのアプリケーションがアクティブな間Spotlightが使えなくなる
  • マウスで履歴などを選択する時に、ウィンドウ下端に行っても、自動でスクロールしない

ついでにSafariでも使ってみたけど、たまに変になる。

数々の苦難を乗り越えて

当初の問題を解決したので、次いってみよう。

Marc Liyanage - Blog - Mac OS X - Terminal Tricks: “term” revisited, with tabs で公開されているスクリプトでは、AppleScriptを通して、Terminalを操作し、コマンドラインからタブを開く事ができる。

これを、~/bin/term などに保存すると、$ term -t ~/work でタブを開く事ができる。 コマンドの実行などもできる。 さらに、こんな感じのコマンドも用意した。zshのaliasでいい人はそっちの方がいいと思う。

#!/bin/sh
# ~/bin/tab
term -t "$@"

僕の場合、今手を付けている作業を、ブラウザのタブやTerminalのカレントディレクトリなどを外部記憶として保存しているので、OSの再起動はとても避けたい作業のひとつだが、 次のようなコマンドを実行することで、zshが開いているタブ群を再現できるスクリプトが得られるのでとてもよい。

$ lsof -a -c zsh -d cwd  | tail +2 | awk '{print "tab " $9}' | sort | uniq
tab /Users/nanki/*******/****
tab /Users/nanki/*******/*********/****/**********
tab /Users/nanki/*******/********************
tab /Users/nanki/****/*********/****/****/****
tab /Users/nanki/****/****/*********

(あ、エスケープしてない)

疑問点まとめ

  • 10を超えるタブはどうするのかしらん
  • screen はどうしよう
  • AppleScript使ったらタブのタイトルとれるかな?
参考: