2009-12-15

Mac OS X から Samba の共有フォルダに素早く接続する方法

Mac OS X から Samba の共有フォルダに接続するには,Finder のウィンドウのサイドバーの「共有」からサーバ名をクリックし,その中の共有フォルダ名をダブルクリックするのだが,サーバ名をクリックしてから共有フォ ルダ名が現れるまで既に接続済みでも1秒くらい必ず待たされてしまう.

ところが,この共有フォルダ名を Finder ウィンドウのツールバー領域に登録すると,接続済みなら一瞬で内容が表示されるようになる.

難しいのはこの登録方法である.サイドバーの共有フォルダ名をドラッグ&ドロップしても何も起きない.以下のようにする必要がある.

  1. Finder のウィンドウのサイドバーの [共有] からサーバ名をクリックし,その中の共有フォルダ名をダブルクリックする.
  2. Command-3 を押して表示を [カラム] にする.
  3. 左の列に現れる共有フォルダ名をツールバーにドラッグ&ドロップする.

これでディスクドライブのアイコンがツールバーに表示される.未接続の時には?マークが表示されるが,クリックすると接続されてドライブアイコンになる.いったんドライブアイコンになると非常に素早くアクセスできるようになる.

何か他にもっとましな方法がある気がするけど... デスクトップに共有フォルダへのエイリアスを置くにはどうしたらいいんだろう?

2009-11-24

Vim で git commit 時に差分を表示する

git commit 時に差分を表示する機能が最近動作しなくなっていた.原因は debian の vim-scripts パッケージの変更であった(Bug #539380).

具体的には vim-scripts に入っていた git-commit プラグインが消滅し,代わりに vim-runtime にその機能相当のものが入ることになった.

.vimrc では,

let g:git_diff_spawn_mode = 1

を削除し,以下に変更する必要がある.

augroup vimrc
  autocmd FileType gitcommit DiffGitCached | wincmd L
augroup END

上下均等2分割にするにはどうするんだろう?

augroup vimrc
  autocmd FileType gitcommit DiffGitCached | only | split | b 1
augroup END

こうですか?わかりません!

2009-11-23

distcc で高速コンパイル

$ sudo aptitude install distcc
$ sudo vi /etc/defaults/distcc
ALLOWEDNETS="192.168.1.0/24"
LISTENER=""
$ DISTCC_HOSTS='localhost example.local' scons -j 3 example_all

Debian で Bonjour を利用する

  • Bonjour のプロトコルは mDNS
  • .local は mDNS で使われるドメイン名(mDNS 専用なのか?)
# aptitude install libnss-mdns

とやるだけで動作.

/etc/nsswitch.conf が書き換えられ,背後では avahi-daemon がインストールされて動いている.

2009-08-23

Scala が生成する一時ファイル

Scala を実行すると output-redirects と scalac-compile-server-port というディレクトリが作成され,そのなかにファイルが生成された.これは一体何?どうもカレントディレクトリに生成されるのでな く,${HOME}/tmp に作られるようだ.

Scala のソースコードを見ると,src/compiler/scala/tools/nsc/CompileSocket.scala の class CompileSocket の val tempDir あたりに,

  val tmpDir = {
    val totry = List(
        ("scala.home", List("var", "scala-devel")),
        ("user.home", List("tmp")),
        ("java.io.tmpdir", Nil))

というコードが見え,ホームディレクトリに tmp というディレクトリがあった場合にはそこに生成されるようになっているようだ.多分普通なら /tmp に作られるのであろう.

2009-07-26

複数の apt リポジトリ

/etc/apt/sources.list に複数のリポジトリを設定するとどうなるだろうか?

APTはそれらの行から得られたPackagesを結合する.重複が見つかった場合には,最初に見つけたパッケージが優先される(!).

情報源

The Debian System―その概念と技法 (MYCOM UNIX Books)

しかし...

上記の本の別の場所,例えば p. 391~「リリースの混在」を見ると,優先度で管理されていることがうかがえる.こちらが正しいのではないだろうか.

適当に /etc/apt/sources.list にリポジトリを追加してみて,

$ sudo apt-get update
$ apt-cache policy

としてみれば何かがわかるかも.

2009-06-23

ターミナルにダイアログを表示するコマンド whiptail

Linux でターミナルにダイアログを表示するコマンド whiptail を発見した.

$ whiptail --msgbox hello 25 80

とか.

2009-06-17

Objective-C のメソッドは virtual か?

Objective-C のメソッドは C++ でいうところの virtual なのだろうか?

#include <stdio.h>
#import <objc/Object.h>

@interface B : Object
- (void)speak;
@end

@implementation B
- (void)speak
{
    printf("speak B\n");
}
@end

@interface D : B
- (void)speak;
@end

@implementation D
- (void)speak
{
    printf("speak D\n");
}
@end

int
main()
{
    B *b = [[D alloc] init];
    [b speak];
    return 0;
}

をコンパイル,実行すると speak D と表示されるので,答えは "Yes" である.

このサンプルコードを書く時にうまくいかなかったこと

alloc の呼び出しが undefined になる.

これは以下のように解決できる.

  • B を Object から派生させる.そのためには #import <objc/Object.h> が必要になる.
  • -lobjc で objc ライブラリをリンクする.

これらは Objective-C の環境では標準なのだろうか?

2009-06-14

Perl で強制的にリストコンテキストで評価する方法

Perl で強制的にスカラーコンテキストで評価するには scalar を用いるが,強制的にリストコンテキストで評価するための list (仮称) は用意されていない.

man perlfuncscalar の項によると,これは実質的には全く必要無いからだそうであるが,両コンテキストで異なる値を返す関数がリストコンテキストで返すリストの要素数を中間変数なしに知りたい場合に困る.

例えば文字列中の / の数を数えようと思って,

$n = scalar split "/", $s;

とすると,split がスカラーコンテキストで評価されることにより @_ の変更が副作用として起こってしまう.use warnings をしていると警告も出力される.そこで強制的にリストコンテキストで split を呼び,それを scalar に渡すようにすれば解決する.これには @{[...]} を用いる.

$n = scalar @{ [ split "/", $s ] };

[ ] はリストへのリファレンスを返し,その中はリストコンテキストで評価される.@{ } はリファレンスをリストに戻す.[ ] 内におく表現によってはそれを ( ) で囲む必要があるかもしれない.

今回の場合には適用できないが,単に (...) で済む場合が多い.

2009-06-10

git push の警告

git clone したものを単に引数なしで git push すると警告が出る.

warning: You did not specify any refspecs to push, and the current remote
warning: has not configured any push refspecs. The default action in this
warning: case is to push all matching refspecs, that is, all branches
warning: that exist both locally and remotely will be updated.  This may
warning: not necessarily be what you want to happen.
warning:
warning: You can specify what action you want to take in this case, and
warning: avoid seeing this message again, by configuring 'push.default' to:
warning:   'nothing'  : Do not push anything
warning:   'matching' : Push all matching branches (default)
warning:   'tracking' : Push the current branch to whatever it is tracking
warning:   'current'  : Push the current branch

リポジトリとブランチを指定しない git push は危険なので,次のメジャーリリースでは引数なしの動作が config されていない場合は拒否されるようになる.その予告として 1.6.3 から上記の長い警告が出るようになった.

回避するには push.default オプションを明示的に指定すればよい.

$ git config push.default matching

参考

With the next major release, "git push" into a branch that is
currently checked out will be refused by default.  You can choose
what should happen upon such a push by setting the configuration
variable receive.denyCurrentBranch in the receiving repository.

To ease the transition plan, the receiving repository of such a
push running this release will issue a big warning when the
configuration variable is missing.  Please refer to:

  http://git.or.cz/gitwiki/GitFaq#non-bare
  http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007

for more details on the reason why this change is needed and the
transition plan.

2009-05-27

ファイルの Mac OS X 特有の情報を調べる

ファイルの Mac OS X 特有の情報を調べるには GetFileInfo コマンドを用いる.

$ GetFileInfo test.jpg
file: "/Users/yourname/Desktop/workspace/test.jpg"
type: "JPEG"
creator: "MKBY"
attributes: avbstclinmedz
created: 05/24/2009 14:53:11
modified: 05/24/2009 14:53:11

応用

カスタムアイコンを持つファイルを調べる.

find . | while read a; do
    if [ `GetFileInfo -ac "$a"` = '1' ]; then
        echo "[$a]"
    fi
done

OS X 特有情報を取り去るには

OS X 特有情報を取り去るには,ditto コマンドを用いる.

$ ditto --norsrc test.jpg test2.jpg

あるいは cat すればいい.

$ cat test.jpg >| test2.jpg

TODO

Mac OS X におけるファイルの基本原理,基本原則がわかっていないので知りたい.

2009-05-21

Bash でパイプの使用時に気をつけること

bash スクリプトでパイプを使用するとサブシェルが走る.気をつけるべきは,while のような複合コマンド内で変数を利用する場合である:

i=0
find . -name '*.c' | while read file; do
    let i++
done
echo i

では find した .c ファイルの個数ではなく,0 が表示される.while .. done がサブシェルで実行されるからである.

以下のような workaround がある.

i=0
find . -name '*.c' >| find.out
while read file; do
    let i++
done < find.out
echo i

bashクックブック p.139~

2009-05-09

apt の sources-list を自動生成する

Debian で /etc/apt/sources-list に記述するサーバとして,最もスループットがよいものを自動的に計測する方法を示す.netselect-apt パッケージを用いる.

$ cd /tmp
$ sudo netselect-apt -ns squeeze
$ view sources.list
$ sudo cp souces.list /etc/apt/sources.list

-n オプションは nonfree を含めるという意味で,-s オプションは deb-src を含めるという意味である.また,現在のところ引数の squeeze は受け入れてもらえないので,lenny で生成してから squeeze に書き換える必要がある.

2009-03-26

Subversion の意外な挙動

Subversion (svn) ではリポジトリ全体に通しリビジョン番号が付いている.ファイルを変更してコミットするとリポジトリ全体のリビジョンがインクリメントされる.しかしそのコミットを実行したワーキングコピーにおいては,リビジョンがインクリメントされるのはコミットしたファイルのみになる.

例えばカレントディレクトリの a.c を変更してコミットしたとしよう.

$ svn ci a.c
$ svn info a.c
Revision: 100
$ svn info
Revision: 99

というようにワーキングコピーにおいてリビジョンの一貫性が失われてしまう.これを解消するには svn update コマンドを用いる.

$ svn update
At revision 100
$ svn info
Revision 100

このことがこれまで何か不思議な挙動をしていると感じた原因に違いない.

2009-01-09

Firefox で拡張をインストールするときの遅延を無くす方法

Firefox で拡張をインストールするときに一定時間のカウントダウンが行われて,即時のインストールの実行ができないようになっているが,これを回避する方法.

プロファイルディレクトリに user.js というファイルを用意し,

user_pref("security.dialog_enable_delay", 0);

と記述する.