Carbon Emacs から emacs-app へ

Emacs22 ベースの Carbon Emacs をやめて Emacs23 ベースの emacs-app を使うことにした。
インストールは MacPorts で簡単。fullscreen モードを使いたいので、 +fullscreen を付けた。

# port install emacs-app +fullscreen

フォントの設定

/Applications/MacPorts/Emacs.app を起動したら、日本語が豆腐になってしまったので、 Emacs23 (Cocoa Emacs) 入門から中毒まで : 紹介マニア を読んで、以下の設定を ~/.emacs.d/init.el に追記。

(when (eq system-type 'darwin)
  (if (>= emacs-major-version 23)
      (cond (window-system
	     (create-fontset-from-ascii-font "Menlo-12:weight=normal:slant=normal" nil "menlomarugo")
	     (set-fontset-font "fontset-menlomarugo"
			       'unicode
			       (font-spec :family "Hiragino Maru Gothic ProN" :size 14)
			       nil
			       'append)
	     (add-to-list 'default-frame-alist '(font . "fontset-menlomarugo"))
	     ))))

org-mode と color-theme

文章作成支援モードの org-mode と、外観を格好良くする color-theme homepage を同じく MacPorts で入れた。

# port install color-theme-mode.el org-mode

org.el 等は /opt/local/share/emacs/site-lisp の下に、 color-theme.el 等はさらにその下の color-theme-6.6.0 の下に入る。
デフォルトの設定では color-theme のディレクトリを load-path に追加してくれないので *1

(setq load-path (cons "/opt/local/share/emacs/site-lisp/color-theme-6.6.0/" load-path))

を ~/.emacs.d/init.el に追記した。

*1:site-lisp には subdirs.el が入ってるんだがなぁ……

Kindle3 で使えるWebサービス

よく知られているのかどうかは知らないが、Amazon.comで買える電子書籍リーダ Kindle の3G版は、日本でもDocomoやらSoftbankやらの3G回線を使って外でWebに接続できる。回線使用料はAmazon.comが払ってくれているので、無料である。
とはいえ、Kindleが持っているWebブラウザは大変貧弱であり、

  • ページ描画が遅い
  • 別ウィンドウ(タブ)を開くリンクは開けない
  • 日本語入力機能を持たない
  • ページの横幅を画面サイズに合うよう縮小するので、ほとんどのサイトではいちいち拡大しないと見づらい

などの問題がある。普段使いには少々心もとない。*1
しかしまぁ多少の不便には目をつむり、外では Kindle でもなんとか見るに耐えるページだけを見ることにすれば、 Kindle を持ってない頃に比べれば少しだけ幸せな生活が送れるのではないかと期待できる。そこで、Kindle のブックマークに入れておくと便利そうなWebサービスをリストアップすることにした。上記の欠点を鑑み

  • 横幅が短いこと
  • 必要な機能がページの上の方にあること
  • 別のウィンドウを開こうとしないこと

を条件に選ぶ。早い話が、ケータイ向けのサイトを見てればいいのである。

[http
//matsuu.org/kindle/google/:title=きんどるぐぐる]: Kindle向けの検索サイト。Javascriptかな漢字変換して、日本語でGoogle検索できる
[http
//mobile.goo.ne.jp/transit/:title=goo路線]: 乗り換え案内。駅名をローマ字で入れても大丈夫。
[http
//www.weathermap.co.jp/mobile/:title=WeatherMap]: 天気予報。地名を選べば、その土地の週間天気が出る
[http
//m.kakaku.com/:title=価格.com]: 若干文字が小さい。型番は大抵アルファベットと数字なので、ヨドバシで使うのだ。

また思いついたら付け足すことにしよう。

*1:僕のような、電子書籍をほとんど買わないくせに3G回線を使いまくるユーザが増えることは、Amazon的にまったくうれしい話ではないので、将来的にはAmazon.com以外のサイトにはアクセス制限がかかるかもしれない

CUBLASを使ってみたぞ

「はじめてのCUDAプログラミング」*1を読んで、CUDA用の線形計算ライブラリCUBLASを使ってみた。サンプルコードそのままではちょっと分かりにくいのでメモ。
CUBLASの元になってるBLASライブラリはそもそもFortran用のライブラリで、C/C++で使うときには注意が必要であることが知られている。それは、行列演算を行う場合の数値のメモリ上の配置がFortranC/C++で違うこと。行列Aのi行j列目を普通Aijと書くんだけど、これをFortranA(i,j)と書いた場合はメモリ上でこのお隣はA(i+1,j)になる。一方で、C/C++A[i][j]と書いた場合お隣はA[i][j+1]((一次元配列でAijを書く場合でも、A[i*N+j]と書きたくなるのがC/C++プログラマなのだ))。前者を行指向の配置(column-major storage)、後者を列指向(row-major storage)と呼ぶらしい。
さて、BLASが元になってるCUBLASは当然行指向が想定されているけれど、「はじめてのCUDAプログラミング」はいまいちこの件に関する言及が微妙で、慣れていないと容易に間違える。間違えないようにするには、行指向で普段から考えておくか、

#define IDX2C(i,j,ld) (((j)*(ld))+(i))

みたいなマクロを定義しておくこと*2。ここでldはleading dimensionで、早い話が行の数だ。
このマクロを使って書き直したコードを以下に貼っておく。

#include<stdio.h>
#include<stdlib.h>
#include<cublas.h>
#define N 1000
#define M 1500
#define K 500
#define IDX2C(i,j,ld) (((j)*(ld)+(i)))
int main(int argc,char **argv){
  double alpha = 3.0, beta = 1.0;
  double *A,*B,*C;
  double *dA,*dB,*dC;
  int LDA = M, LDB = K, LDC = M;
  int i,j;
  cudaSetDevice(0);
  cublasInit();
  cudaMallocHost((void **)&A,sizeof(double) * M * K);
  cudaMallocHost((void **)&B,sizeof(double) * K * N);
  cudaMallocHost((void **)&C,sizeof(double) * M * N);
  for(i=0;i<M;++i) 
    for(j=0;j<K;++j) A[IDX2C(i,j,M)] = i*K+j + 1;
  for(i=0;i<K;++i)
    for(j=0;j<N;++j) B[IDX2C(i,j,K)] = i*N+j + 1;
  for(i=0;i<M;++i)
    for(j=0;j<N;++j) C[IDX2C(i,j,M)] = 0.0;
  cublasAlloc(M*K,sizeof(double),(void **)&dA);
  cublasAlloc(K*N,sizeof(double),(void **)&dB);
  cublasAlloc(M*N,sizeof(double),(void **)&dC);
  cublasSetMatrix(M,K,sizeof(double),A,LDA,dA,M);
  cublasSetMatrix(K,N,sizeof(double),B,LDB,dB,K);
  cublasSetMatrix(M,N,sizeof(double),C,LDC,dC,M);
  
  cublasDgemm('N','N',M,N,K,alpha,dA,LDA,dB,LDB,beta,dC,LDC);
  cublasGetMatrix(M,N,sizeof(double),dC,M,C,LDC);
  cublasFree(dA);
  cublasFree(dB);
  cublasFree(dC);
  cublasShutdown();
  return 0;
}

ちなみに、Intel Math Kernel LibraryについてるCBLASは、引数で行指向と列指向を切り替えられて便利なので、CUBLASも将来のバージョンでは見習って欲しいものである。

*1:

*2:CUDA Toolkit Archive | NVIDIA DeveloperにあるCUBLAS User Guideを参考にしました。

Debian lennyでSSHFS

SSHサーバの彼方にあるディレクトリを手元のマシンにマウントできるSSHFSを、家のDebian GNU/Linux lennyに導入したメモ。

研究室でのプログラミングの続きを家でやろうと思ったときに、いちいちscpかrsyncかでファイルを手元に持ってきて、編集して、アップロードする、という手間をかけるのが面倒になった。というか、研究室に出かけるためにPCの電源を落としたときに、編集したファイルをアップするのを忘れたことに気づくの多過ぎ、というおマヌケな自分を、コンピュータはもっと影ながら支援すべきだと思った。

まずはsshfsのインストール

 # aptitude install sshfs

sshfsによるマウントが出来るのはfuseグループのユーザだけなので、自分をfuseグループに追加。

 # usermod -G dialout,cdrom,floppy,audio,video,plugdev,netdev,powerdev,fuse hogehoge

usermodの-Gオプションは所属グループを書き直すので、それまで入っていたグループも指定しないとダメ。
最後の引数は自分のユーザ名。
usermodを使わずに、/etc/group,/etc/gshadowを手で書き換えてもよいと思う。
グループの情報を有効にするため、hogehogeでログインしてる場合は一度ログアウトした後

 $ sshfs hogehoge@remote:/home/hogehoge/fuga ~/fuga

とやれば、自分のホームディレクトリのfugaにリモートのディレクトリがマウントされてるはず。

Debian lenny(amd64)にAdobe AIRをインストールする。

TwitterクライアントのSpazってのを使ってみたくて、AdobeAIRを入れようとするも、64bit Linux用のバイナリは無いとのことで、なんとか頑張ってみた記録。
だいたいここに書いてあることをやったようだ。

必要な32bitライブラリのうちaptitudeで入れれるものは入れる。

# aptitude install ia32-libs-gtk

入れられないものは、Debianのパッケージ一覧からi386用のdebファイルを入手し、file-rollerで展開してライブラリを取り出し、/usr/lib32の下に置く。
入れたのは

のふたつ。
ここまでやった後、上記Adobeのサイトからダウンロードできる

# ./AdobeAIRInstaller.bin

を実行すれば、AIRが入る。
このままではライブラリのインストール先がおかしいらしく、最後に

# cp /usr/lib/libadobecertstore.so /usr/lib32

を実行する。

SoftBank C01LCユーティリティ


SoftBankEmobileを使う端末C01LCにくっついてくるユーティリティは、接続を開始すると接続時間と通信量を教えてくれる。
だけど実は、画面外の見えない部分にもう少し詳しいデータを表示しているみたい。
普通の方法ではウィンドウのリサイズはできないのだけど、ウィンドウをタイル状に配置するためのソフトWinSplit Revolutionで強制的にウィンドウサイズを変えたら発見できたのだ。

それにしてもこのユーティリティー、スリープから復帰するたびに表示がおかしくなるのはどうにかならないものか。

auto-Install.el

Elispのインストールをある程度自動化できるElispであるauto-install.elを知ったのでメモ。
http://www.emacswiki.org/emacs/AutoInstall

auto-install.elのインストールと設定

  1. EmacsWiki: auto-install.elをダウンロードし/usr/local/share/emacs/site-lisp/に保存
  2. 以下の行を.emacsに書いて、C-xC-e
(require 'auto-install)
(setq auto-install-directory "~/.emacs.d/auto-install/")
(auto-install-update-emacswiki-package-name t)
    • 2行目はデフォルトなので、変更しないなら書かなくてもよさげ。
    • 3行目はEmacs起動時にemacswikiのパッケージからアップデートしたものをチェックする設定。これを書かない場合は‘auto-install-from-emacswiki’を実行した時にチェックされる。

使い方

anything.elをインストールしてみる

  1. M-x auto-install-from-emacswiki RET anything.el RETでファイルをダウンロード
  2. C-cC-cでインストール

これでいいかと思ったら、上記Anythingのページに

  1. M-x auto-install-batch
  2. anything

とやれと書いてあった。

C-cC-cはバイトコンパイルするってことでいいのかな?