Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
- 2004: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005: 01 02 03 04 05 06 07 08 09 10 11 12
- 2006: 01 02 03 04 05 06 07 08 09 10 11 12
- 2004-11-30 [zsh] ターミナルのウィンドウ・タイトルを動的に変更する
- 2004-11-29 [Fibonacci] 高速フィボナッチ
- 2004-11-26 [kakasi] 日本語のファイル名をローマ字表記に変換する
- 2004-11-25 ネットワーク経由の tar
- 2004-11-24 [Puzzle] カックロヘルパー
- 2004-11-22 [BEL] コマンドの終了を音で知らせる
- 2004-11-19 [script] テキストファイル中で一番長い行の桁数
- 2004-11-18 [pstree] プロセスのツリーを表示する
- 2004-11-17 複数のソースコードファイルの印刷
- 2004-11-16 [Emacs] 時刻の挿入
- 2004-11-15 [linux] console の解像度
- 2004-11-12 簡易チャット
- 2004-11-11 [printf] シェルからコマンドの標準入力に改行の入った文字列を渡す
- 2004-11-10 [rcs] ひとりRCS
- 2004-11-09 [nkf] UTF-8へ変換
- 2004-11-08 [zsh] =()構文
- 2004-11-05 [netstat] リッスン状態にあるポート
- 2004-11-04 [SKK] 句読点
- 2004-11-02 [Emacs] emacsclient
- 2004-11-01 [CVS] /etcやホームディレクトリにある設定ファイルの管理
2004-11-30 [zsh] ターミナルのウィンドウ・タイトルを動的に変更する
複数のターミナル・ウィンドウを開いて作業していると、タスクバーのウィンドウ一覧などからウィンドウを選択する時に区別がつかなく迷ってしまいます。
そこで~/.zshrc に以下のように書いておくと
if [ "$TERM" = "kterm" ] || [ "$TERM" = "rxvt" ] || [ "$TERM" = "mlterm" ]; then
precmd() {
print -Pn "\e]0; %~\a"
}
preexec () {
print -Pn "\e]0;[$1]: %~\a"
}
fi
ターミナルのウィンドウ・タイトルにカレントディレクトリを表示してくれます。また、コマンドの実行中はそのコマンド名を表示します。
precmd()
は、zshシェルのプロンプトが表示される前に毎回実行され
preeexec()
は、コマンドが実行される直前に実行される。
2004-11-29 [Fibonacci] 高速フィボナッチ
フィボナッチ数列(n ≧ 0)の一般項 f(n)は
f(n) = n ,if n < 2
= f(n-1) + f(n-2) ,otherwise
で定義されている。これを定義どおり、たとえば Haskell で実装すると、
fib n = if n < 2
then n
else fib (n-1) + fib (n-2)
これの計算の手間は、n について指数オーダになるので、とても遅い。 たとえば、fib 50 の計算は待てないくらいおそい。 これには工夫がいくつかあって、nのオーダになる計算は
fib n = fib' 0 1 n fib' a b 0 = a fib' a b 1 = b fib' a b n = fib b (a+b) (n-1)
これで計算すると fib 10000 なんてのも楽々求められる。 さらに驚くべき工夫があって、log n のオーダまで高速化できる
fib n = fib' 1 0 0 1 n fib' a b p q c | c == 0 = b | even c = fib' a b (p*p+q*q) (2*p*q+q*q) (c`div`2) | otherwise = fib' (b*q+a*q+a*p) (b*p+a*q) p q (c-1)
ちなみに、fib 10000 は 2090桁、fib 100000 は 20899桁、 fib 1000000 は20万桁を超える数です。
There is no comment.
2004-11-26 [kakasi] 日本語のファイル名をローマ字表記に変換する
日本語ファイル名だとファイル名を補完しずらかったり、ちょっと不便な時が あります。そんな時はkakasiコマンドを利用してファイル名の漢字かなを ローマ字表記に変換しちゃいます。
以下のような内容のスクリプトromajing
#!/bin/sh echo $* | kakasi -Ha -Ka -Ja -Ea -ka -C | sed 's/ /_/g' |sed 's/\^/-/g'
を用意しておくと、たとえば、
% romajing ITソリューション事業部 ITsoryu-shonJigyoubu
になります。このスクリプトを使って、たとえば、ディレクトリ内の pdf ファイルの日本語名をローマ字に一括変換するには、
% for i in *.pdf; do mv "$i" `romajing $i`; done
とします。
There is no comment.
2004-11-25 ネットワーク経由の tar
ネットワーク経由でのファイルのやりとりはいろいろありますが、そのうちの一つ
% tar cjvf - foo | ssh bar.example.org '(cd /home/me/; tar xjfB -)'
There is no comment.
2004-11-24 [Puzzle] カックロヘルパー
カックロというパズルが があります。このパズルに習熟すると、いろいろなパターンが反射的に出てくる ようになりますので、ヘルパなぞ必要ないのですが、初心者のうちは、
1から9までの数字をk個(同じ数字はなし)使って、和がSになる組合せ
をさっと表示してくれるヘルパがあると便利です。
% ./kakro 28 4 [[4,7,8,9],[5,6,8,9]] % ./kakro 29 4 [[5,7,8,9]]
スクリプトは、組合せを生成する部分と、和によってフィルタする部分に 分けて考えると簡単です。組合せを生成する部分はいろいろな用途に使えるので 自分用のスクリプトライブラリとして整備しておくといいでしょう。
以下は runhugs 用のスクリプトです。
#!/usr/local/bin/runhugs +l
\begin{code}
module Main where
import System
main :: IO ()
main = do { args <- getArgs
; case map read args of
[s,k] -> putStrLn $ show $ kakro s k
_ -> error "Usage: kakro sum n"
}
kakro :: Int -> Int -> [[Int]]
kakro s k = filter ((==) s . sum) (comb [1..9] k)
comb :: [a] -> Int -> [[a]]
comb [] _ = []
comb xs 1 = map (:[]) xs
comb (x:xs) n = map (x:) (comb xs (n-1)) ++ comb xs n
\end{code}
Gauche には util.combinations というライブラリモジュールがあるので これと、srfi-1 のモジュールを使うのが簡単ですね。 どう書くかは練習問題です :)
ヒントから素直に書いた版
(use srfi-1)
(use util.combinations)
(define (kakro sum n)
(filter (lambda (lst)
(= sum (apply + lst)))
(combinations (iota 9 1) n)))
#!/usr/bin/perl
($sum,$len) = @ARGV;
for($i=1<<9;--$i;) {
$s=0,$str="";
for(1 .. 9) { $s+=$_, $str.=$_ if 1<<($_-1) & $i; }
print "$str " if $s==$sum && length($str)==$len;
}
print "\n";
実行結果
$ kakro.pl 23 3
689
$ kakro.pl 23 4
1589 2489 1679 2579 3479 3569 2678 3578 4568
$ kakro.pl 23 5
12389 12479 12569 13469 23459 12578 13478 13568 23468 14567 23567
$ kakro.pl 23 6
123458 123467
$
2004-11-22 [BEL] コマンドの終了を音で知らせる
t0m0h1s4 さんからの投稿
ビープ音を鳴らすには制御文字BELを使います. BELのASCIIコードは7なので printfコマンド
printf "\7"又は エスケープシーケンスを使って
printf "\a"とします.
これを使って
make ; printf "\a"とすればmakeコマンドの終了をビープ音で知らせてくれます.
2004-10-28で紹介したzshのグローバルエイリアスを使って
alias -g B="; printf '\a';"としておくと
make Bとできます.
thanks > t0m0h1s4
gauche だと(write-byte 7)ですね。 繰り返し鳴らしたかったらflushが必要らしい。 (for-each (lambda (x) (sys-sleep 1) (write-byte 7) (flush)) (iota 10)) これで1secおきにBeep音が鳴る。
2004-11-19 [script] テキストファイル中で一番長い行の桁数
yasuyuki さんによるお題。
#!/usr/local/bin/gosh
(use srfi-1)
(define (main args)
(call-with-input-file (cadr args)
(lambda (in)
(display
(fold
(lambda (s max-len) (max max-len (string-length s)))
0
(port->string-list in))))))
by yasuyuki さん↑
awk '{if(n<length)n=length}END{print n}' Sourcecode.java
「awkで書いてみたら短かくなりました」 by shibata さん↑
(use srfi-1) (use file.util) (define (max-line-length file) (reduce max 0 (map string-length (file->string-list file))))
by shiro さん↑
awk '{print length}' Sourcecode.java | sort -n | tail -1
「こんな風にも書けました。」 by fuji さん↑
#!/usr/local/bin/runhugs import System;main=getContents>>=print.foldl max 0.map length.lines
「Haskellのスクリプトで、詰めて書けば」 by nobsun ↑
foldl max 0 を maximum に変えて4バイト短くなる。 import System; はなくても大丈夫。
2004-11-18 [pstree] プロセスのツリーを表示する
「知らんかったこんなコマンド」シリーズ (^^;)
% pstree
init-+-apache-+-8*[apache]
| `-cronolog
|-apmd
|-atd
...
|-emacs-+-emacsserver
| `-zsh---pstree
...
|-kdm-+-XFree86
| `-kdm---gnome-session-+-emacs
| |-skkinput
| `-ssh-agent
...
ほぉ〜。
There is no comment.
2004-11-17 複数のソースコードファイルの印刷
ソースコードのレビューを複数人でやるためにソースコードを印刷する場合 行番号をつけると便利である。そんな場合例えば、
$ a2ps -n hoge.c | lpr
とする。複数のソースコードファイルなら、たとえば、
$ a2ps -n *.c | lpr
とすればよい。複数のソースコードファイルの場合、 通しの行番号の方がよいときは、
$ cat -n *.c | a2ps | lpr
えっ!ファイル毎に改頁してくれない?ファイル名がわかりにくい? ファイル毎の行番号もほしい?わがままだなぁ。
$ for i in *.c ; do printf "$i\n"; cat -n %i ; printf "\f" ; done | cat -n | a2ps -nh -nf -ns -L "" -l "" -w | lpr
でどうよ。
There is no comment.
2004-11-16 [Emacs] 時刻の挿入
Emacs でメモをなどを取っているときに、現時刻を挿入したいときが良くあるので 以下のような設定を .emacs に入れてある。
(defun instime ()
"Insert current time"
(interactive)
(let ((time (current-time-string)))
(insert "(" (aubstring time 11 19) ")")))
(global-set-key "\C-ct" 'instime)
これで
C-ct
とやると、
(08:14:01)
のように時刻が挿入される。
There is no comment.
2004-11-15 [linux] console の解像度
Linux のブート時(X Window が起動する前)にコンソールに流れる情報を 一度のできるだけ多く見たい。Server機で、X Window は使わないけど、 解像度1024 x 768 のディスプレイが常に接続されている。
そんなとき、640 x 480 の解像度を前提とした 80 x 32 行の表示じゃねぇ。 そこで、ブート時にカーネルに
vga=0x317
を渡すようにする。ブート時に boot: プロンプトが入力待ちになっているなら、 そこで、たとえば、
boot: linux vga=0x317
のようにカーネルを指定して、それに vga=0x317 を渡せばよい。 ブートローダの設定ファイルに書いておけば、デフォルトでそのような 設定になるようにできるはず。
Debian GNU/Linux の serge では、/boot/grub/menu.lst を変更する。
There is no comment.
2004-11-12 簡易チャット
cut-sea さんから以下のような「一行」をいただきました。 talk を使わない簡単 chat。
制約ありますが、極簡易 chat 。
nobsun@system> mknod nobsun p nobsun@system> mknod yasuyuki pとしてパイプをこさえておいて、
nobsun は自分の terminal から
nobsun@system> tail -1cf yasuyuki & cat -u > nobsunyasuyuki も自分の terminal から
yasuyuki@system> tail -1cf nobsun & cat -u > yasuyukiポイントはバッファリングしないように tail には 1c を cat には u をそれぞれオプションつけることかな。
あとはそのままチャットっぽくお話しできます。 本格的なチャットとは程遠いですし、制約もきついので使う場面は 限られますから私も一度くらいしかやったことないけど、 まず UNIX の標準インストールで実現できるから間に合わせに。
制約
- 1対1でのみお話しする場合に限る
- 共に同じマシンにログインしている必要あり
- パイプの名前をパス含めて予め取り決めておく必要あり
thank you > cut-sea さん
手元の Linux では、tail が上手くパイプから読みだせないようでした。 cut-sea さんによると、NetBSD では OK のようです。
で、記録がのこってしまいますが、名前付きのパイプではなくて、 通常のファイルを使って、以下のようにすることもできます。
nobsun@system> touch /tmp/nobsun cut-sea@system> touch /tmp/cut-sea
とやっておいて、
nobsun@system> tail -f /tmp/cut-sea & cat >> /tmp/nobsun cut-sea@system> tail -f /tmp/nobsun & cat >> /tmp/cut-sea
write(1) なんて使う人はもういない?
2004-11-11 [printf] シェルからコマンドの標準入力に改行の入った文字列を渡す
zsh や tcsh なら
% echo "sum [1..10] \n product [1..10]" | ghci -v0 55 2628800
bash なら
$ echo sum [1..10]' > product [1..10]' | ghci -v0 55 2628800
共通して使えそうなのが、echo のかわりに printf を使う方法
% printf "sum [1..10] \n product [1..10]" | ghci -v0 55 2628800
ヒアドキュメントも便利ですね % python << EOF > print sum(range(11)) > print reduce(lambda x,y:x*y,range(1,11),1) > EOF 55 3628800
2004-11-10 [rcs] ひとりRCS
ひとつのファイル(たとえば、hoge.txt)だけ、rcs で管理したければ、
% ci -l -zLT hoge.txt
だけ覚えていれば OK (たぶん^^;)
There is no comment.
2004-11-09 [nkf] UTF-8へ変換
nkf - ネットワーク用漢字コード変換フィルタ v2.0 を使う。
% nkf -w -OW foo.txt
-w が UTF-8 への変換、-OW がファイルの上書き(取り扱い注意)。
iconv -f eucjp -t utf8 foo.txt
gauche-cesconv -f eucjp -t utf8 foo.txt jisx0213対応。
2004-11-08 [zsh] =()構文
t0moh1s4 さんから以下のような「一行」をいただきました。
自慢の一行ではないんですけど、検収作業の時に使ったコマンドを。 データのチェックぐらいはコンピュータにして欲しいですね。
以下のような内容のデータファイル(file1.data)があった場合
111 112 113 114 115 115 118 120 119
- 数値が正しく並んでいるかチェック
% diff file1.data =(sort file1.data)- 数値に重複が無いかチェック
% diff =(sort file.data) =(sort file.data | uniq)- 数値に飛びが無いか
% diff file.data =(for i ({111..119}) {echo $i})使っているのは定番コマンドだけですが、zshの=()構文を使うと コマンド出力をファイルのように扱えるので一行でハッピーです。
thank you > t0m0h1s4
数値に重複がないかチェックなら % sort file.data | uniq -d だけで十分のような...
2004-11-05 [netstat] リッスン状態にあるポート
リッスン状態にあるポートとそのポートを利用していプロセスを調べるには、
# netstat -nlp
稼働中のUnixドメインソケットも表示してくれる。
lsofも便利
2004-11-04 [SKK] 句読点
SKK で`,'で「,」を、`.'で「.」を入力するように設定するには、$HOME/.skk に
(setq skk-kutouten-type 'en)
と書いておく、で一時的に「、」「。」が使いたいときには
M-x skk-toggle-kutouten
とやる。これはトグルになっていいて、もう一度やると、元にもどる。 .tex ファイルだけで「,」「.」を使いたいときには、その .tex ファイルの 最後に、
% Local Variables: % skk-kutouten-type: en % end:
を書いておく。
There is no comment.
2004-11-02 [Emacs] emacsclient
以前からEmacsをたくさん開く癖(?)があって、その度に新しいEmacsを 起動していた。Emacsの起動の遅さが段々気になってきたので、emacsclient を 使うことにした。で、最初にloginしたときに、サーバとして起動しておいて、 これをアイコン化しておく、
% emacs -f server-start --iconic &
こうしておいて、emacsclient を使うのだけれど、これをたくさん同時に 使うので、そのたびに、別フレームにを開くようにする。これは、 $HOME/.emacs に
(if window-system
(setq server-visit-hook
'(lambda () (setq server-window
(make-frame '((width . 80)
(height . 25)))))))
とやっておけばよい。これで快適な Emacs 起動があじわえる。
えっ?
C-x 5 f
をなぜ使わなかって?ワークスペースをたくさん使うし。。。 terminal とかも使うし。。。まぁ。私にはこれのほうがいいんです。(^^;)
There is no comment.
2004-11-01 [CVS] /etcやホームディレクトリにある設定ファイルの管理
自分のつかっているシステムを再構築したり、別のマシンに移植したり するたびに、あるいは、実験用に自分の使っているシステムの設定を一時的に大きく 変更するとき、
- /etc 以下にあるいくつかの設定ファイル
- ホームディレクトリ下の、.emacs とか .zshrc とかの環境設定ファイル
をCVS管理にしておくと便利なのにと思う。
当該ディレクトリで、cvs import するとそのディレクトリ以下が全部 import されてしまう。実際には、ホームディレクトリ以下のファイルを全部リポジトリに 入れたいわけじゃない。むしろ少しだけなんだ、というとき、以下の用な手順で でよいことに気づいた。もっと良い方法があれば是非教えてください
- 一時的なダミーディレクトリを作成する
- 作成した空のディレクトリに移動
- cvs モジュール名を決めて cvs import
- cvs checkout
- cvs 管理下に置きたいファイルを add
- cvs commit
% pwd /home/foo % mkdir dummy % cd dummy % ls -a ./ ../ % cvs import -m "foo's home on bar" bar/home/foo Foo start No conflicts created by this import % cd /home % cvs checkout -d foo bar/home/foo % cd foo % cvs add .emacs .zshrc cvs server: scheduling file `.emacs' for addition cvs server: scheduling file `.zshrc' for addition cvs server: use 'cvs commit' to add these files permanently % cvs commit -m "Added" .emacs .zshrc RCS file: /var/lib/cvs/nike/home/nobsun/.emacs,v done Checking in .emacs; /var/lib/cvs/nike/home/nobsun/.emacs,v <-- .emacs initial revision: 1.1 done RCS file: /var/lib/cvs/nike/home/nobsun/.zshrc,v done Checking in .zshrc; /var/lib/cvs/nike/home/nobsun/.zshrc,v <-- .zshrc initial revision: 1.1 done
There is no comment.
emacsも~/.emacs.elに (setq frame-title-format '("%b " (buffer-file-name "::%f"))) (setq icon-title-format '("%b " (buffer-file-name "::%f"))) で わかりやすくなりますね。