Open Source WEB



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()

は、コマンドが実行される直前に実行される。


Name:
Comment:
shibata: (Tue Nov 30 19:37:22 2004 )
emacsも~/.emacs.elに
(setq frame-title-format '("%b  "
                           (buffer-file-name "::%f")))
(setq icon-title-format  '("%b  "
                           (buffer-file-name "::%f")))
で わかりやすくなりますね。


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万桁を超える数です。


Name:
Comment:

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

とします。


Name:
Comment:

There is no comment.


2004-11-25 ネットワーク経由の tar

ネットワーク経由でのファイルのやりとりはいろいろありますが、そのうちの一つ

% tar cjvf - foo | ssh bar.example.org '(cd /home/me/; tar xjfB -)'


Name:
Comment:

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 のモジュールを使うのが簡単ですね。 どう書くかは練習問題です :)


Name:
Comment:
cut-sea: (Thu Nov 25 20:22:26 2004 )
ヒントから素直に書いた版

(use srfi-1)
(use util.combinations)

(define (kakro sum n)
  (filter (lambda (lst)
            (= sum (apply + lst)))
          (combinations (iota 9 1) n)))
novice: (Thu Dec 23 18:11:55 2004 )
#!/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


Name:
Comment:
cut-sea: (Fri Nov 26 00:58:37 2004 )
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 ↑


Name:
Comment:
y.hanatani: (Sun Nov 21 15:59:26 2004 )
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
     ...

ほぉ〜。


Name:
Comment:

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

でどうよ。


Name:
Comment:

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)

のように時刻が挿入される。


Name:
Comment:

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 を変更する


Name:
Comment:

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 > nobsun

yasuyuki も自分の 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


Name:
Comment:
shiro: (Sat Nov 13 16:29:45 2004 )
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


Name:
Comment:
shibata: (Fri Nov 12 02:02:58 2004 )
ヒアドキュメントも便利ですね
% 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 (たぶん^^;)


Name:
Comment:

There is no comment.


2004-11-09 [nkf] UTF-8へ変換

nkf - ネットワーク用漢字コード変換フィルタ v2.0 を使う。

% nkf -w -OW foo.txt

-w が UTF-8 への変換、-OW がファイルの上書き(取り扱い注意)。


Name:
Comment:
setu: (Fri Nov 12 04:43:45 2004 )
iconv -f eucjp -t utf8 foo.txt
shiro: (Sat Nov 13 16:32:59 2004 )
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


Name:
Comment:
通りすがり: (Thu Feb 10 09:31:52 2005 )
数値に重複がないかチェックなら
  % sort file.data | uniq -d
だけで十分のような...


2004-11-05 [netstat] リッスン状態にあるポート

リッスン状態にあるポートとそのポートを利用していプロセスを調べるには、

# netstat -nlp

稼働中のUnixドメインソケットも表示してくれる。


Name:
Comment:
ますく: (Mon Nov 22 16:16:29 2004 )
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:

を書いておく。


Name:
Comment:

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 とかも使うし。。。まぁ。私にはこれのほうがいいんです。(^^;)


Name:
Comment:

There is no comment.


2004-11-01 [CVS] /etcやホームディレクトリにある設定ファイルの管理

自分のつかっているシステムを再構築したり、別のマシンに移植したり するたびに、あるいは、実験用に自分の使っているシステムの設定を一時的に大きく 変更するとき、

  • /etc 以下にあるいくつかの設定ファイル
  • ホームディレクトリ下の、.emacs とか .zshrc とかの環境設定ファイル

をCVS管理にしておくと便利なのにと思う。

当該ディレクトリで、cvs import するとそのディレクトリ以下が全部 import されてしまう。実際には、ホームディレクトリ以下のファイルを全部リポジトリに 入れたいわけじゃない。むしろ少しだけなんだ、というとき、以下の用な手順で でよいことに気づいた。もっと良い方法があれば是非教えてください

  1. 一時的なダミーディレクトリを作成する
  2. 作成した空のディレクトリに移動
  3. cvs モジュール名を決めて cvs import
  4. cvs checkout
  5. cvs 管理下に置きたいファイルを add
  6. 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


Name:
Comment:

There is no comment.


このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us