Mac OS X 上で消せないファイルがある時に

そして消したいと思っても消せないので── そのうちボクはカーズ状態に陥って考えるのをやめた.

http://june29.jp/2008/10/26/un-removable-files/

ぼくは convmv で入力コードや出力コードを間違えて指定したファイルがこうなってしまいました。

この場合は single-user mode *1 で起動して

fsck -fy

を実行したら消えてくれました。お試しあれ :)

いやでも、もしHDDが死に掛けで、とかいう理由だったりすると、fsckがトドメになる気がするんだけど。。。一応そこら辺触れたほうがいい気がする。

http://b.hatena.ne.jp/m-bird/20081027#bookmark-10573201

おっと失念しておりました……。実行される方はその可能性も考慮しておいてくださいね >_<

ACL や permission が壊れていて消せない事もありますので、fcsk 後も件のファイルが残っているようでしたら

diskutil repairPermissions /

もお試しください*2。こちらは通常起動後でも動きます。

なお AppleJack ( http://applejack.sourceforge.net/ ) を使うと、これらを半自動的に行えるので大変便利です。

AppleJack 導入後に single-user mode で起動し

applejack auto shutdown

と打込めば連続で以下を行ってくれます。

  1. repair disks
  2. repair permissions
  3. cleanup cache files
  4. validate preference files
  5. clean up virtual memory

詳細は man を参照ください*3

番外

上記を実行しても一向に消えてくれないファイルが、「実は Finder で lock されていた」なんてこともありました。

今回は違うと思いますが、参考までに。
f:id:elim:20081027114050p:image

*1:[http://support.apple.com/kb/HT1492?viewlocale=ja_JP:title]

*2: ${HOME} 以下の面倒は見てくれないようですが……

*3:最近こればっかり

executable-find

exec-path 内に指定の実行ファイルがあるか、現在の OS の実行ファイル拡張子を補いつつ検索します。
見付かった場合はパスを文字列として返します。見付からなかった場合は nil が返ります。

実行結果
(executable-find "grep")    ;=> "/usr/bin/grep"
(executable-find "nowhere") ;=> nil
使用例
  1. exec-path 内に
    1. fastri-server があり
    2. fri がある場合に
    3. ri-emacs があれば ri-ruby-script へ setq し
    4. ri-ruby を load する
  2. 以上が全て non-nil を返した場合に続きを実行する
  (and
   (executable-find "fastri-server")
   (executable-find "fri")
   (setq ri-ruby-script (executable-find "ri-emacs"))
   (load "ri-ruby" t)
;;...snip...
http://github.com/elim/dotemacs/tree/1b1e99d1fb077d26f7e0bde1a827e5c338eb0ab2/init-ruby.el

実装

HEAD
(defun executable-find (command)
  "Search for COMMAND in `exec-path' and return the absolute file name.
Return nil if COMMAND is not found anywhere in `exec-path'."
  ;; Use 1 rather than file-executable-p to better match the behavior of
  ;; call-process.
  (locate-file command exec-path exec-suffixes 1))
http://cvs.savannah.gnu.org/viewvc/emacs/emacs/lisp/files.el?revision=1.1005&view=markup
Emacs21 時代
(defun executable-find (command)
  "Search for COMMAND in exec-path and return the absolute file name.
Return nil if COMMAND is not found anywhere in `exec-path'."
  (let ((list exec-path)
        file)
    (while list
      (setq list
            (if (and (setq file (expand-file-name command (car list)))
                     (let ((suffixes executable-binary-suffixes)
                           candidate)
                       (while suffixes
                         (setq candidate (concat file (car suffixes)))
                         (if (and (file-executable-p candidate)
                                  (not (file-directory-p candidate)))
                             (setq suffixes nil)
                           (setq suffixes (cdr suffixes))
                           (setq candidate nil)))
                       (setq file candidate)))
                nil
              (setq file nil)
              (cdr list))))
    file))
http://cvs.savannah.gnu.org/viewvc/emacs/emacs/lisp/progmodes/executable.el?revision=1.26.4.4&view=markup

ではこれの初出はいつ頃なのかと探りましたところ、どうやら Emacs CVS 内最古の executable.el でも実装されていたようです。

初出?
(defun executable (command)
  "If COMMAND is an executable in $PATH its full name is returned.  Else nil."
  (let ((list exec-path)
	path)
    (while list
      (setq list (if (and (setq path (expand-file-name command (car list)))
			  (file-executable-p path)
			  (not (file-directory-p path)))
		     nil
		   (setq path nil)
		   (cdr list))))
    path))
http://cvs.savannah.gnu.org/viewvc/emacs/emacs/lisp/progmodes/executable.el?revision=1.1&view=markup

1995 年のことですね。

実はこの関数に気付かないで、ほぼ同じ実装の locate-executable という関数書いて使っていました。

13 年も前からある関数を使っていなかったなんて……。よく調べないと無駄に再実装してしまうものですね。お恥ずかしい*1

*1:きっと他にも ~/.emacs.d 内に組込関数の再実装が転がっていると思います >_<

drutil and hdiutil.

CLIISO9660 image の作成/書き込みを行いたかったので MacPorts で cdrtools を導入しました……が。

mkisofs は他のプラットフォーム同様に使えたものの、 cdrecode の dev= に何を指定するか分からず、書き込みが行えませんでした :(

対処

これらは GUI では Disk Utility.app で行う作業です。Apple の事だから多分 Disk Utility.app の CLI があるだろうと探したところ、やはりありました。

機能ごとにいくつかに分かれていて diskutil(8), hdiutil(8), drutil(8) などがあるようです*1

名称 機能 相当する別コマンド
diskutil 主にローカルディスクに対する操作 fdisk, fsck など
hdiutil ディスクイメージの作成や操作 mkisofs(genisoimage)など
drutil ディスクイメージをメディアに書き込む cdrecode(wodim)など

ということで、 hdiutil でイメージを作成し、drutil で書き込んでみることにします。

イメージ作成
% hdiutil makehybrid -iso -joliet -default-volume-name 'Volume name' -verbose -o path/to/foo.iso path/to/source
イメージ書き込み
% drutil burn -speed 4 -verify -mount path/to/foo.iso

日本語のファイル名も問題なく通りました*2

便利なオプションが沢山ありますので、是非 man を一読ください。それぞれに EXAMPLES セクションが付いていますので、感覚を掴むのにも便利です。

追記

cdrecord の dev= へ渡す引数が分かりました。

% cdrecord dev=IODVDServices path/to/foo.iso

だそうです。

% cdrecord -scanbus

の出力に有効な値が現れなかったので諦めていたのですが

% cdrecord dev=help

してみれば良かったのですね……。先達に感謝です :)

*1:興味のあるかたは man diskutil して SEE ALSO セクションを参照ください

*2:Leopard はもちろん、Windows XP 上でも正しく表示できることを確認しました

増産

GitHubはてなブックマーク, Wassr, Twitter, IRC のログから記録を抜き出して、この日記へ書き付けてみています。

溜めに溜めたレシートを家計簿に付けていく気分です。飽きるまで続けます。

feed の順番が酷いことになりそうですが……どうぞご容赦を。

dbcli.py - Linux CLI in python

DropboxCLI client です。

Dropbox のフォーラムで公開されています。
Linux CLI in python « Dropbox Forums (閲覧には Dropbox へのログインが必要です)

とりあえず chmod u+x して dbcli.py すると help が出ます。

dbcli.py status すると必要に応じて dropboxd を起動して、常駐してくれます。

より細かい説明は…… CLI をほしがるような方には不要だと思いますのでソースを参照ください。

これで nautilus 要らずですね :)
初期設定(アカウントの入力など)には nautilus が入用でした >_<

新しめの Emacs をフルスクリーンにする設定

既出も良いところですが、Goolge Groups 内の Carbon Emacs グループに新しめの Emacs (含む Carbon) をフルスクリーンにする設定が流れていましたので書き留めておきます。
Re: the command for full screen never works

手元の .emacs にも取り入れてみました。

(when window-system
  (setq-default line-spacing
                (if (featurep 'mac-carbon) nil 2))
  (setq default-frame-alist
        (append
         '((foreground-color . "gray")
           (background-color . "black")
           (cursor-color  . "blue")
           (alpha . (90 95)))
         default-frame-alist))

  (setq initial-frame-alist
        (append
         '((fullscreen . fullboth))
         default-frame-alist))

  ;; http://groups.google.com/group/carbon-emacs/msg/287876a967948923
  (defun toggle-fullscreen ()
    (interactive)
    (set-frame-parameter nil
                         'fullscreen
                         (if (frame-parameter nil
                                              'fullscreen)
                             nil 'fullboth)))

  (global-set-key [(meta return)] 'toggle-fullscreen))

initial-frame-alist だけ fullscreen 設定にしてあります。lookup などが開くフレームは小さいままでいいかなーと思いまして。

Google Groups のスレッドから特定のメッセージの URL を取り出す

スレッドのままではポインタとして不適当なことがあるので。

  1. スレッド中の当該メッセージの More options をクリックします。
  2. Individual message をクリックします。

以上です。簡単ですね。