2007年11月27日火曜日

rubyではまる

最近, 下のようなrubyのプログラムを書いてはまった.

def f x
p x
x.each do |y|
y.each do |z|
f z
end
end
end

f '0'


原因は String の each が1文字ずつ返すもんだと勘違いをしていたこと.
リファレンスマニュアルを読んで勉強勉強.


http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=String#each より
each([rs]) {|line| ... }
each_line([rs]) {|line| ... }

文字列中の各行に対して繰り返します。行の区切りは rs に指定した文字列で、そのデフォルトは変数 $/ の値です。各 line には区切りの文字列も含みます。

rs に nil を指定すると行区切りなしとみなします。空文字列 "" を指定すると連続する改行を行の区切りとみなします (パラグラフモード)。

self を返します。

2007年11月25日日曜日

vim syntax file for CUDA

今日は大学祭を後輩と回って気分転換. 紅葉の季節ということもあって人手が尋常ではない. 明日は自宅で頑張るか.

vimの設定ファイルを見ていたら, 以前作ったCUDA用のsyntax fileが見つかったのでアップしてみる.

" Vim syntax file
" Language: CUDA
" Maintainer: ztw
" Last Change: 2007 Nov 23

runtime! syntax/cpp.vim

syn keyword cType char1 uchar1 char2 uchar2 char3 uchar3 char4 uchar4 short1 ushort1 short2 ushort2 short3 ushort3 short4 ushort4 int1 uint1 int2 uint2 int3 uint3 int4 uint4 long1 ulong1 long2 ulong2 long3 ulong3 long4 ulong4 float1 float2 float3 float4 dim3

syn keyword cStorageClass __device__ __global__ __host__ __constant__ __shared__ __inline__

let b:current_syntax = "cu"

" vim: ts=8

2007年11月23日金曜日

教授の証明

以前やった証明のメモを教授に渡したら, 原稿に起こしてくれた. 多分先生も僕がやばいことに気づきつつあるらしい. ともかくその証明を見たら, あまりに簡潔になっていたので驚いた. そこでこの話を使うかー, っていうのはまさに目から鱗だった. 自分の未熟さを改めて痛感. 一個証明ができたぐらいでいい気になってはいけない.
それにさっさと原稿を書いていかなければやばい. なのにinkscapeが謎のクラッシュを起こす. xfigに戻るべきかも.

2007年11月18日日曜日

xdvi

現在論文執筆中. vimで書いてxdviで確認するのだけど, 今まではlatexでコンパイルするたびに, xdviのウインドーに移って再描画のコマンド'R'を打っていたが, 面倒なのでマニュアルを調べてみたら, SIGUSR1のシグナルを送ればxdviが再描画してくれることを発見. Makefileの中で, latexの後にkillをたして, 期待通りの動作をするようになった.

2007年11月17日土曜日

vimトリビア

なんとなくvimのユーザーマニュアルを読んでいたら, 次のような記述を見つけた. hjklが上下左右のどれに当たるかの*日本人向き*覚え方らしい.

usr_02.txt
For Japanese users, Hiroshi Iwatani suggested using this:

Komsomolsk
^
|
Huan Ho <--- ---> Los Angeles
(Yellow river) |
v
Java (the island, not the programming language)


まず"Komsomolsk"ってどこっすか? Google Mapによるとトルクメニスタンらしい. Wikipediaによるとウクライナにもあるらしい. なんでこんな地名を使うのだろうか?



あと, 確かに"Huan Ho"は中国語読みの"黄河"のことなのだが, 普通日本語だと"Kohga"って読むので"k"と間違えちゃうんじゃないかなあ.

この覚え方初めて見た. 有名なのかなあ. ちなみに僕はrogue cloneで覚えた.

2007年11月16日金曜日

現実逃避

論文を書かないといけないのだけれども, 全然モチベーションが湧かず, 思いつきでいろいろ実験してしまった... 結果は出ないし, 論文は進まないし...

2007年11月15日木曜日

LNCSの原稿の拡大

Changing PDF Margins With The pdfpages Packageにインスパイヤされて, LNCSの小さい原稿をA4一杯にするrubyスクリプトを書いてみた. パラメータは適当に試行錯誤してみてください.

#!/usr/local/bin/ruby
# pdf-rescale.rb [infile] [outfile] [scale=1.4] [offset=0]
#

def usage
exit
end

usage if ARGV.size < 2

infile = ARGV[0]
outfile = ARGV[1]
scale = 1.2

scale = ARGV[2].to_f if ARGV.size > 2
offset = 0
offset = ARGV[3].to_i if ARGV.size > 3

tmpfile='_pdf-rescale_'

latex=<<"EOS"
\\documentclass[twoside]{article}

\\usepackage{a4wide,pdfpages}
\\begin{document}
\\includepdf[pages=-,scale=#{scale},offset=0 #{offset}]{#{infile}}

\\end{document}
EOS

f = File.open(tmpfile+'.tex','w')

f.puts(latex)
f.close

system("pdflatex #{tmpfile}.tex > pdf-rescale.log")
system("pdftops #{tmpfile}.pdf #{tmpfile}.ps")

system("ps2pdf #{tmpfile}.ps #{outfile}")
system("rm #{tmpfile}*")

2007年11月14日水曜日

Android

最近ずっと考えている証明は一応完成した. 先生に説明して納得してもらえた. 次は原稿に書く.

ところで, GoogleのAndroidが面白そうだ. 時間さえあれば何か作って遊びたい所. タイミング的にMulticsのエミュレーターでも作ってみるかw

2007年11月8日木曜日

CUDA on FreeBSD part 2

Linuxの開発環境を整えてからの話. 今回は"linux_base-fc4"を入れたことを前提に話を進める.

1. NVIDIAのドライバやらSDKをダウンロード
NVIDIAのドライバの最新版は多分ここの上に載っている.
portsから入れても多分大丈夫.

CUDAのSDKはここから.
"CUDA Toolkit version 1.0 for Redhat Enterprise Linux 4.x"と"CUDA SDK version 1.0 for Linux"をダウンロード.

2. Linux用のXorgのインストール
Fedora Core 4 の xorg-x11-6.8.2-31.i386.rpm, xorg-x11-libs-6.8.2-31.i386.rpm, xorg-x11-devel-6.8.2-31.i386.rpm をダウンロードして以下を実行.
freebsd$ su
freebsd# cd /usr/local/gentoo-stage3
freebsd# rpm2cpio xorg-x11-6.8.2-31.i386.rpm | cpio -idv
freebsd# rpm2cpio xorg-x11-libs-6.8.2-31.i386.rpm | cpio -idv
freebsd# rpm2cpio xorg-x11-devel-6.8.2-31.i386.rpm | cpio -idv


3. Linux用NVIDIAドライバーのインストール
portsで入れた人は省略.
freebsd# cd /tmp
freebsd# ./NVIDIA-Linux-x86-100.14.xx-pkg1.run -x
freebsd# cp -rp NVIDIA-Linux-x86-100.14.xx-pkg1/usr /usr/local/gentoo-stage3/


4. CUDAのインストール
ユーザー名は"foo"を仮定.
freebsd# chroot /usr/local/gentoo-stage3
linux # ./NVIDIA_CUDA_Toolkit_1.0_rhel4_x86.run
linux # su foo
linux $ ./NVIDIA_CUDA_SDK_1.0.run


5. GLU & GLUT のインストール
Mesa Home PageからMesaLibとMesaGLUTの最新版をダウンロードする.
linux$ tar jxvf MesaLib-X.Y.tar.gz
linux$ tar jxvf MesaGLUT-X.Y.tar.gz
linux$ cd Mesa-X
linux$ make linux-x86
(すぐにCtrl-Cで止める)
linux$ su
linux# cd src/glu; make install
linux# cd ../glut/glx/; make install
linux# cp /usr/local/lib/* /usr/X11R6/lib


6. 調整
linux$ su
linux# cd /usr/lib
linux# ln -sf libGL.so.100.14.xx libGL.so.1
linux# ln -sf libGL.so.100.14.xx libGL.so
linux# ln -sf libGLcore.so.100.14.xx libGLcore.so.1


(linux側)
linux$ export LD_LIBRARY_PATH=/usr/X11R6/lib:/usr/local/cuda/lib
linux$ export PATH=/usr/local/cuda/bin:/usr/local/bin:/usr/bin:/bin


(FreeBSD側)
freebsd$ setenv LD_LIBRARY_PATH /usr/local/gentoo-stage3/usr/lib: /usr/local/gentoo-stage3/usr/local/lib/: /usr/local/gentoo-stage3/usr/local/cuda/lib


7. 確認
CUDAのToolkitを展開したディレクトリにて
linux$ cd projects/deviceQuery
linux$ make
linux$ ../../bin/linux/release/deviceQuery
There is 1 device supporting CUDA

Device 0: "GeForce 8600 GTS"
Major revision number: 1
Minor revision number: 1
Total amount of global memory: 267714560 bytes
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 8192
Warp size: 32
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 1458000 kilohertz

Test PASSED

Press ENTER to exit...

と表示したらOK. 出力内容はビデオカードによって違います. 上の出力はGeForce 8600 GTSのもの. これが動けば他のもOpenGL関係のを除いて動くでしょう.

Happy CUDA Hack!

証明が思いついた

数週間ずっと悩んでいた証明ができたような気がした. 昨日の帰りの電車の中でふと思いついたアイデアをこねくり続けて, うまくいった気がした. それを今日先生に説明したら, 納得してもらえたので良かった. あとは, これをまとめて論文にするべし. 締切りは1ヵ月後.

2007年11月6日火曜日

FreeBSDでLinuxの開発環境を作る

FreeBSD上でCUDAを使う話を書くはずだったのに, いつの間にか放置してしまっていました. 今回は反省して, 第一歩としてFreeBSD上にLinuxの開発環境を作る方法を述べます.


  1. ports/emulators/linux_base-(fc4 | fc6 | f7)
    ports/emulators/linux_dist-gentoo-stage3
    をインストール. linux_baseは適当なのをどうぞ.
    僕は少し古くfc4を入れています.

  2. 設定ファイルへの追加

    loader_conf:
    linux_load="YES"

    rc.conf:
    linux_enable="YES"

  3. chroot環境の構築
    shells/bashのインストール. rootのデフォルトシェルをbashに変更. その後, いろいろ設定. mount_nullfsのところはまとめてシェルスクリプトにしておくとCUDA環境を立ち上げるのが楽になるかも. ユーザー名の"hoge"は適当にどうぞ.
    freebsd$ su
    freebsd# chsh -s bash
    freebsd# cd /usr/local/gentoo-stage3
    freebsd# cp bin/bash usr/local/bin/
    freebsd# mkdir dev
    freebsd# mount_devfs devfs dev
    freebsd# mkdir proc
    freebsd# mount_linprocfs linprocfs proc
    freebsd# mkdir home
    freebsd# mount_nullfs /home home
    freebsd# mkdir tmp
    freebsd# mount_nullfs /tmp tmp
    freebsd# chroot .
    linux# passwd
    linux# adduser hoge ...

  4. 試してみる.
    freebsd$ uname -sr
    FreeBSD 6.2-STABLE
    freebsd$ su
    freebsd# cd /usr/local/gentoo-stage3
    freebsd# chroot .
    linux# su hoge
    linux$ cd
    linux$ uname -sr
    Linux 2.4.2


近況

先週末は東京にACM-ICPCにコーチとして参加してきた. 色々ありましたが, 京都大学のチームが外国チームを抑えて1位になってよかった! 苦節10年, 初めての快挙にみんな盛り上がりました.

話は変わりますが, Googleが携帯用のOSを発表したようですね. 僕は詳細を見ていないのですが, 結構興味があります. 最近の携帯は無駄な昨日ばかり増える一方で, 基本的なレスポンスが低かったり, 通話音質が大してよくなってなかったりして大いに不満があります. そのせいで4年前の携帯をいまだに変更せずに使っています.

そんな中Googleのニュースを見て, 気に入らないなら自分で携帯を作っちゃえばいいんじゃないかと思い始めました. 本体自体はそこそこ汎用的なものにして, OSはPCみたいに自由に入れられるようにならんかなあと妄想中.