WARNING: terminal is not fully functional

Mac OS X Lionを導入。いろいろ設定作業をしているとなぜかターミナルでlessやmanを使おうとすると

WARNING: terminal is not fully functional

という警告が出るように。

いろいろ調べているとどうやらApp StoreからXcodeをインストールした際にターミナルのプロファイルが削除されてしまうせいだとか。ちなみに以前のMacとは異なり, Lionはデフォルトでは環境変数$TERMがxterm-256colorに設定されている。少なくともLeopardではxterm-colorが使用されていた。このプロファイルを確認するには

$ infocmp

とする。Lion上では少なくともXcodeインストール後にこのコマンドを実行した際にエラーが出るため、プロファイルが欠けているということが分かる。

参考: marcoschuh.de » ssh and Lion’s xterm-256color terminfo

xterm系のプロファイルはMacでは /usr/share/terminfo/78/ 以下に格納されている。そのディレクトリの中身をLeopardと比較してみると確かになんだか少ない…。ともかくxterm-256colorをコピーすれば良さそう。LeopardMacの同じ場所からコピーしてもいいけれど、ファイルのやり取りがめんどくさいので手近なCentOSマシンからscpでコピーすることに。

$ sudo scp user@centos-host:/usr/share/terminfo/x/xterm-256color /usr/share/terminfo/78/

(user, centos-hostは適宜置き換えてください)

これでようやく解決。英語フォーラムではOS Xパブリックベータの頃からアップグレードの度に悩まされて来たというポストも見られたのでご参考までに。

The next generation of MacBooks

MacBook Air 11インチ欲しい!

MacBook Air 11inch (64GB)だからスペックはこんな感じ。

  • Core 2 Duo 1.4(1.6?)GHz
  • 2GB 1,066MHz DDR3 SDRAM
  • NVIDIA GeForce 320M, 256MB DDR3 SDRAMをメインメモリと共有
  • 64GB SSD
  • 11.6inch LED-backlight display (1,366 x 768)
  • IEEE 802.11n対応
  • バッテリー持続時間約5時間
  • 1.06kg

持ち運び用に欲しい!!

Perlで定数定義とファイルの行数カウント

Perlで多次元配列を作るときなどに予め入力ファイルの行数を知りたい、その行数を定数として保持しておきたいときがある。そのようなときは以下のようにしている。

#/usr/bin/perl
use Readonly;

my $filename = 'foo';
Readonly my $LEN => int(`wc $filename | cut -d' ' -f2`);

定数定義にはuse constantを使ってもいいがダブルクォーテーション内で変数展開できないなどのデメリットもあるため、Readonlyモジュールの方が便利なときもある。ただしReadonlyは最初からインストールされているわけではないので

# cpan
cpan> install CPAN
cpan> install Readonly

としておく必要がある。

Bashで複数のシンボリックリンクをまとめて張る方法

Bashを使っていてあるディレクトリにある大量のファイルへのシンボリックリンクをまとめて張りたいと思ったが、若干手こずったのでメモ。
カレントディレクトリのファイル(ここでは./*.txt)を対象とするとします。

単に

ln -s *.txt /path/to/destination

とするとワイルドカードが展開されないようで*が入ったままのファイル名でシンボリックリンクが張られ、そんなファイル知らないと怒られる。

そこで考えるのがシェルスクリプト。forループで*.txtというリストに対してlnを使えばいいんだろ、と安易に考え

for i in *.txt
do
  ln -s $i /path/to/destination
done

と書いて実行するも、絶対パスが渡されてないようで、これもリンク切れのシンボリックリンクが出来るだけ。で、やり直したのが以下の通り。

for i in *.txt
do
  ln -s $(pwd)/$i /path/to/destination
done

これは()内のコマンドが展開されるというBashの機能を使ったもの。これでカレントディレクトリ(pwdの出力)とファイル名をつないだ絶対パスが取得され、ようやく目的を達成することができた。

Bashの()コマンドの展開は入れ子にしても動くようで、これからもちょっとした応用に便利かも。

参考: http://labs.unoh.net/2008/09/bashtips.html

モデル名とテーブル名

Ruby on Railsでは基本的にはモデル名とテーブル名が対応づけられる。
しかし既存のテーブルを利用する、テーブル名に日本語が入っているなどの理由で任意のテーブル名を利用したいときはset_table_nameを呼び出す。
例えばFooというモデルをテーブルbarに対応させたいときはfoo.rbで以下のように書く。

class foo < ActiveRecord::Base
  set_table_name :bar
  ...
end