iPhoneアプリPhotosynthで鴨川デルタを撮影

投稿者 nanki 2011-04-20 10:14:00 GMT

こういうエントリはほとんど書かないんだけど、Photosynthはそのはじめのころからずっと見ていたし、首の消えてしまったおじさん(プライバシーに配慮して)の向うには出町ミスドがあるし、なによりPhotosynthが素晴らしかったので。

iPhone持ってる人は一度は試してみるべき。共有しなければアカウント作成とか要らない。

一部破綻が見られるけど、iPhoneで誰でも撮れるというのはかなりインパクト大きい。 bing map今からでもGoogleMapsと張り合える。

しかし相変わらず弱そうなソーシャルパートw 外部にライセンスするか、api公開していい会社買った方がいいものできそう。


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

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

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


死のイメージ

投稿者 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使ったらタブのタイトルとれるかな?
参考:

今日のgolf - るびまゴルフ第七回

投稿者 nanki 2009-09-14 15:02:00 GMT

月に一度のgolf. というか、人がやっているのを目にすると、手を出したくなってくる。
たぶん、子供がプラモデル組み立てているのを見て「ちょっとお父さんにかしてみなさい」というタイプ。

結局、前回の最短は23Bだったらしい。変数名まで同じだった :)
文字数を削るという共通の目的が、変数名から意味すら奪うのだろうか。

20Bという噂はなんだったんだろう…

反省を生かして、今回は、27Bまで縮んだところで寝かせておく。

続きにあるのはお気に入りの答えだが、パー。

追記: 2009/09/17 いくつかの方針で使っている方法を組み合わせたら23Bになった。驚き。

参考:

夏の終わりに

投稿者 nanki 2008-10-02 00:42:00 GMT

夏の終わりに、久しぶりに会った君の目は、無邪気さと少し狡猾な光をたたえて、僕を見ていた。
君がそんな目をしたことはない。
初めてみるその目は、みたままを表しているようには思えなかった。
必死に自分を守ろうとしている、しかしそれすらもさとらせまいとしている、そんな目だった。

何が君を変えてしまったのか。
変わってしまったのは僕の方だろうか。
あの頃の君はもういない。

僕は黙って、あの頃の君を思い出にしまい、新しい君を受け入れる。


この間の.zshrc - cheat 補完

投稿者 nanki 2008-09-30 00:25:00 GMT

netswitch! | 今日の.zshrc - cheat 補完 の補完関数だけど、なんだか遅いなと思ってたら間違いがあって、毎回cheatコマンドを実行していた。

元エントリ中のコードは修正済みだが、差分は以下の通り。

-    echo $*[1,-2] | sed -e 's/^/compadd /g' > ~/.zsh/completion/$*[-1]
+    eval $*[1,-2] | sed -e 's/^/compadd /g' > ~/.zsh/completion/$*[-1]

-  completion_list `cheat sheets | grep -v All` _cheat
+  completion_list 'cheat sheets | grep -v All' _cheat

遅さに困ってた人ごめんなさい。


今日の.zshrc - cheat 補完

投稿者 nanki 2008-09-25 07:00:00 GMT

cheatsheet を集めた cheat という gem があって、たまに便利である。

გ gem install cheat
გ cheat assertions
assertions:
  # Credit: http://nubyonrails.com/articles/ruby-rails-test-rails-cheat-sheet
  # Use 'cheat assert_raise' for more details
  
  # Standard Ruby Assertions
  
  assert                  boolean 
  assert_equal            expected, actual 
  assert_raise            *args 
  assert_raises           *args, &block 
  …
  …

cheat自身の使い方は

გ cheat cheat

どんなcheatsheetがあるのかは

გ cheat sheets

で見られる。

なんだけど、数が多すぎてもうどうしようもないので、さらに便利にするために、zshの補完を使ってみた。

見よう見まね。

completion_list () {
  mkdir -p ~/.zsh/completion
  if [ ! -f ~/.zsh/completion/$*[-1] ]; then
    eval $*[1,-2] | sed -e 's/^/compadd /g' > ~/.zsh/completion/$*[-1]
  fi

  `cat ~/.zsh/completion/$*[-1]`
}

_cheat () {
  completion_list 'cheat sheets | grep -v All' _cheat
}

compdef _cheat cheat

completion_list は一応再利用できるようにしてあるけど、ちゃんと調べたら既にありそうだ。

追記:

いつまでたってもassertionsの内容が古いままだなぁと思っていたら、キャッシュしてた。

გ cheat --new

でキャッシュをクリア。


実践 Common Lisp

投稿者 nanki 2008-07-29 14:04:00 GMT

RubyKaigi2008のゴルフ大会の景品としてオーム社様よりいただきました。

Rubyistこそ読めとのこと、じっくり読ませていただきます。


英数を英数+ESCに - KeyRemap4MacBook

投稿者 nanki 2008-04-28 23:38:00 GMT

vimで日本語を入力していると、ESC押しても日本語が解除されない。

そもそも、ESC遠すぎる。

以前使っていたThinkpadでは、半角/全角、無変換、F1が全てESCで便利だったのに。

DefaultKeyBindings.dictでなんとかなると思ったけど、ならなさそうなので、KeyRemap4MacBookを導入してみた。

英数をESCにする設定はあるが、英数を英数+ESCにする設定はないようだ。 というわけで、しばしの格闘の末…よくわかってないけど動いているっぽい。

たまに、英数にしようとして、検索ボックスの文字列を消したりする。 英数x2を英数+ESCにしたほうがいいかもしれないけど、取りあえずしばらく使ってみる。

diff -r 7af393f8e690 files/prefpane/checkbox.xml
--- a/files/prefpane/checkbox.xml Mon Apr 28 06:27:59 2008 +0900
+++ b/files/prefpane/checkbox.xml Mon Apr 28 23:37:57 2008 +0900
@@ -1053,6 +1053,10 @@
               <sysctl>remap.jis_eisuu2escape</sysctl>
             </item>
             <item>
+              <name>EISUU to EISUU &amp; Escape</name>
+              <sysctl>remap.jis_eisuu2jis_eisuu_escape</sysctl>
+            </item>
+            <item>
               <name>EISUU to Tab</name>
               <sysctl>remap.jis_eisuu2tab</sysctl>
             </item>
diff -r 7af393f8e690 src/kext/RemapUtil.cpp
--- a/src/kext/RemapUtil.cpp  Mon Apr 28 06:27:59 2008 +0900
+++ b/src/kext/RemapUtil.cpp  Mon Apr 28 23:37:57 2008 +0900
@@ -749,6 +749,15 @@
   }

   void
+  FireFunc::firefunc_jis_eisuu_escape(const RemapParams &params) {
+    unsigned int flags = allFlagStatus.makeFlags(params);
+    listFireExtraKey.add(FireExtraKey::TYPE_AFTER, KeyEvent::DOWN, 0, KeyCode::JIS_EISUU, CharCode::JIS_EISUU);
+    listFireExtraKey.add(FireExtraKey::TYPE_AFTER, KeyEvent::UP, 0, KeyCode::JIS_EISUU, CharCode::JIS_EISUU);
+    listFireExtraKey.add(FireExtraKey::TYPE_AFTER, KeyEvent::DOWN, flags, KeyCode::ESCAPE, CharCode::ESCAPE);
+    listFireExtraKey.add(FireExtraKey::TYPE_AFTER, KeyEvent::UP, flags, KeyCode::ESCAPE, CharCode::ESCAPE);
+  }
+
+  void
   FireFunc::firefunc_space(const RemapParams &params) {
     unsigned int flags = allFlagStatus.makeFlags(params);
     listFireExtraKey.add(FireExtraKey::TYPE_AFTER, KeyEvent::DOWN, flags, KeyCode::SPACE, CharCode::SPACE);
diff -r 7af393f8e690 src/kext/RemapUtil.hpp
--- a/src/kext/RemapUtil.hpp  Mon Apr 28 06:27:59 2008 +0900
+++ b/src/kext/RemapUtil.hpp  Mon Apr 28 23:37:57 2008 +0900
@@ -178,6 +178,7 @@
     void firefunc_commandSpace(const RemapParams &params);
     void firefunc_enter(const RemapParams &params);
     void firefunc_escape(const RemapParams &params);
+    void firefunc_jis_eisuu_escape(const RemapParams &params);
     void firefunc_space(const RemapParams &params);
     void firefunc_jis_kana(const RemapParams &params);
     void firefunc_jis_kana_x2(const RemapParams &params);
diff -r 7af393f8e690 src/kext/remap.cpp
--- a/src/kext/remap.cpp  Mon Apr 28 06:27:59 2008 +0900
+++ b/src/kext/remap.cpp  Mon Apr 28 23:37:57 2008 +0900
@@ -1589,6 +1589,15 @@
   }

   void
+  remap_jis_eisuu2jis_eisuu_escape(const RemapParams &params)
+  {
+    if (! config.remap_jis_eisuu2jis_eisuu_escape) return;
+
+    static KeyOverlayedModifier kom;
+    kom.remap(params, KeyCode::JIS_EISUU, ModifierFlag::NONE, FireFunc::firefunc_jis_eisuu_escape);
+  }
+
+  void
   remap_jis_eisuu2tab(const RemapParams &params)
   {
     if (! config.remap_jis_eisuu2tab) return;
@@ -2122,6 +2131,7 @@
   remap_jis_eisuu2optionL(params);
   remap_jis_eisuu2shiftL(params);
   remap_jis_eisuu2escape(params);
+  remap_jis_eisuu2jis_eisuu_escape(params);
   remap_jis_eisuu2tab(params);
   remap_jis_eisuu2middleclick(params);
   remap_jis_eisuu2rightclick(params);
参考: