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-12-29 [skk] 点々
- 2004-12-28 [CVS] 削除してコミットしてしまったファイルを復活させる
- 2004-12-27 [正規表現] Jakarta OROでURLらしきものにマッチさせる
- 2004-12-24 [google] キーワードのヒット件数
- 2004-12-22 [misc] DCF(Discount Cash Flow)法によるNPV(Net Present Value)算出
- 2004-12-21 [emacs] ハノイの塔
- 2004-12-20 [misc] 英文の単語の出現頻度のカウント
- 2004-12-17 [misc] Hex -> Bin (また)
- 2004-12-16 [symlinks] リンク切れのシンボリックリンクを削除する
- 2004-12-15 [misc] Hex -> Bin
- 2004-12-14 [misc] 二日酔いしない飲酒量の算出
- 2004-12-12 [zsh] コマンドライン入力でディレクトリ単位の編集
- 2004-12-10 [X] 新しいモディファイヤキーを追加する
- 2004-12-09 [posix] テンポラリファイルを確実に削除する方法
- 2004-12-08 [zsh] パイプで繋いだコマンド列に対する time での時間計測
- 2004-12-07 [zsh] 連番の生成
- 2004-12-06 角谷(Collatz)予想
- 2004-12-03 [emacs] coding-system を指定してファイルを開く
- 2004-12-02 [Algorithm] メモ化
- 2004-12-01 [zsh] 環境変数を直接編集
2004-12-29 [skk] 点々
知らんかった。SKK では、…を出すには、
z.
でよい。
2004-12-28 [CVS] 削除してコミットしてしまったファイルを復活させる
リビジョン1.2で削除しコミットしてしまったファイルをリビジョン1.1の内容で復活する。
cvs update -j 1.2 -j 1.1 filename cvs commit -m "message" filename
There is no comment.
2004-12-27 [正規表現] Jakarta OROでURLらしきものにマッチさせる
Javaの正規表現ライブラリーのひとつ Jakarta ORO での例。
org.apache.oro.text.perl.Perl5Util#match()メソッドでは次の正規表現を使う。
static Stirng HTTP_REGEXP = "m/s?https?:\\/\\/[-_.!~*'()a-zA-Z0-9;\\/?:@&=+$,%#]+/";
Perl5Util#substitute()メソッドでは以下。
static Sring HTTP_REGEXP =
"s/(s?https?:\\/\\/[-_.!~*'()a-zA-Z0-9;\\/?:@&=+$,%#]+)/<a href=$1>$1<\\/a>\n/g";
Perl5UtilにはPerl正規表現文字列を与える必要があるが、 Javaのコンパイルを通すためにはJavaの文字列エスケープ表現を使い、 \自身は\\と書かねばならない。
(参考文献: http URLにマッチするPerlの正規表現)
There is no comment.
2004-12-24 [google] キーワードのヒット件数
google-count という Ruby スクリプトを使う。
$ google-count {喧々囂々,喧々諤々,侃々諤々,侃々囂々}
60400 喧々囂々
80900 喧々諤々
78100 侃々諤々
56500 侃々囂々
結構まちがいが多いのねぇ。
このスクリプトはakrさんの作品。 コードは ここ にあります。
There is no comment.
2004-12-22 [misc] DCF(Discount Cash Flow)法によるNPV(Net Present Value)算出
takahiro氏の連載 「オプション【思考・指向】とプロジェクト」 リアルオプション前章ー解答編に 出てきた、DCF(Discount Cash Flow)法によるNPV(Net Present Value)算出のための スクリプト。たとえば、記事にある例、割引率10% 初期投資 100000万、 一年目の予想利益は100万円、二年目の予想利益は500万円、 三年目の予想利益は1000万円 の場合、
% ./dcf 10 100000 100 500 1000 -98745.0
この場合の、正味現在価値は -98745万円 となる。 Gauche スクリプトの素朴な実装は以下のとおり、
#!/usr/local/bin/gosh
(use srfi-1)
(define (usage)
(format (current-error-port)
"Usage: ~a rate(%) cf0 cf1 cf2 ...~%" *program-name*))
(define (main args)
(if (> 2 (length args))
(usage)
(let ((1+r (+ 1 (/ (string->number (cadr args)) 100.0)))
(cfs (reverse (map string->number (cddr args)))))
(format (current-output-port)
"~d~%"
(truncate (fold (lambda (cf v) (+ (/ v 1+r) cf)) 0.0 cfs))))))
There is no comment.
2004-12-21 [emacs] ハノイの塔
意外に動かしてみたことない人が多いのではと思う。
M-x hanoi-unix
さて、これは途中からはじまるのだが、これは何時おわるのか きまっているらしい。これがおわったとき、なにかが起こる。
さて、それは何時で、何がおこるのか。。。
M-x hanoi-unix-64
これが終ったときには、この宇宙が存在するかどうかもわからない。 だから、「これが終わったとき、宇宙は破滅する」と予言しても、 だれも予言を確かめられないだろうね。
M-数字 M-x hanoi で枚数指定できるんですね。
こんな変型場−ジョンもあったよ。 http://www.pro.or.jp/~fuji/java/try/slide/index.html
2004-12-20 [misc] 英文の単語の出現頻度のカウント
ナイーブな(Haskellによる)実装
#!/usr/local/bin/runhugs
\begin{code}
module Main where
import System
import IO
import List
main :: IO ()
main = do { cs <- getContents
; mapM_ (hPutStrLn stdout . showFrequency)
$ map (\ ws -> (length ws, head ws))
$ group
$ sort
$ map (trim "\"',.:;?!")
$ words cs
}
trim :: [Char] -> String -> String
trim ps = dropWhile (flip elem ps).reverse.dropWhile (flip elem ps).reverse
showFrequency :: (Int,String) -> String
showFrequency (n,w) = show n ++ " " ++ w
\end{code}
実行例
% cat sample.txt Peter Piper picked a peck of pickled peppers; A peck of pickled peppers Peter Piper picked. If Peter Piper picked a peck of pickled peppers, Where's the peck of pickled peppers Peter Piper picked? % ./freequency.lhs < sample.txt 1 A 1 If 4 Peter 4 Piper 1 Where's 2 a 4 of 4 peck 4 peppers 4 picked 4 pickled 1 the
There is no comment.
2004-12-17 [misc] Hex -> Bin (また)
2004-12-15 で二進表記への変換スクリプトを書いたが、DEC は ■■□■ ■■■□ ■■□□ に変換されるほうが解りやすいと、わがままを言われたので、スクリプトを Haskell で書いてみた。素朴なコードなので、ながいなぁ。
#!/usr/local/bin/runhugs
\begin{code}
module Main where
import System
import IO
import Char
usage :: String
usage = "Usage: hex2bin hex"
table = zip hexc binsyms
main :: IO ()
main = do args <- getArgs
case args of
[h] -> hPutStrLn stdout (concat (map conv h))
_ -> hPutStrLn stderr usage
binsyms = map (concat . map toTofu) bins
bins = [" 0001"," 0001"," 0010"," 0011"," 0100"," 0101"," 0110"," 0111"
," 1000"," 1001"," 1010"," 1011"," 1100"," 1101"," 1110"," 1111"]
hexc = ['0'..'9'] ++ ['a'..'f']
toTofu '0' = "□"
toTofu '1' = "■"
toTofu c = [c]
conv c = case lookup (toLower c) table of
Nothing -> "????"
Just s -> s
\end{code}
実行例
% ./hex2bin.lhs dec ■■□■ ■■■□ ■■□□
#!/usr/bin/perl
$_=sprintf("%b\n",hex($ARGV[0]));
while(/.*\d\d\d\d\d/)
{s/(.*\d)(\d\d\d\d)/$1 $2/}
s/0/□/g;
s/1/■/g;
print;
実行例
$ hex2bin.pl dec
■■□■ ■■■□ ■■□□
2004-12-16 [symlinks] リンク切れのシンボリックリンクを削除する
たとえば、ホームディレクトリ以下にあるすべてのサブディレクトリで すべてのリンク切れしたシンボリックリンクを削除する。
% symlinks -r -d ~
こんなコマンド知らんかった。
There is no comment.
2004-12-15 [misc] Hex -> Bin
ビットフラグなどのチェックをしているとき、整数を二進法表現で見たい ときがある。そんなときは、gosh の format 手続きが便利。 コマンドラインからの「一行野郎」は
% gosh -E'format #t "~b~%" #xDEC' -Eexit 110111101100
#xDEC(16進表記 DEC = 10進表記 3564)のかわりにいろいろな整数を 入れれば 2進表記になる。
% perl -e 'printf "%b\n", 0xdec'; 110111101100
こんなこともできる。 gosh> (format "~,,'-,4:b" #xDEC) "1101-1110-1100"
2004-12-14 [misc] 二日酔いしない飲酒量の算出
この季節のお役立ち??スクリプト gendo.scm
#!/usr/local/bin/gosh
(define (usage)
(format
(current-error-port)
"Usage: ~a 体重(kg) 起床までの時間(h) アルコール度数(%)
ビール: 4.5〜6%
日本酒: 15〜16%
ワイン: 11〜13%
ウイスキー: 37〜43%
焼酎: 20〜25%
チューハイ: 3〜 8%
"
*program-name*))
(define (main args)
(if (not (= 3 (length (cdr args))))
(usage)
(let ((weight (x->number (cadr args)))
(hour (x->number (caddr args)))
(alcohol (x->number (cadddr args))))
(format
(current-output-port)
"二日酔いをしないための限度飲酒量(度数~s%): ~s ml~%"
alcohol
(truncate (/ (* 15 weight hour)
(* 0.8 alcohol)))
))))
たとえば、体重 70 Kg、飲みはじめてから翌朝起床まで、10時間ある。 ビール(アルコール 5%)だけでいくなら、
% ./gendo.scm 70 10 5 二日酔いをしないための限度飲酒量(度数5%): 2625.0 ml
ということで、大瓶 4本はだいじょうぶなのかなぁ。 あくまで目安ですからね。ホドホドに。
There is no comment.
2004-12-12 [zsh] コマンドライン入力でディレクトリ単位の編集
コマンドライン入力ではパスを入力する機会が非常に多い。 そこで、zshに用意されている単語単位の編集コマンドをディレクトリ単位の 編集にも対応させる。
man zshparamを見ると環境変数WORDCHARSで、単語の一部とみなす記号を指定している みたい。ここから'/'を外せばディレクトリを単語として扱ってくれる。
% echo $WORDCHARS
*?_-.[]~=/&;!#$%^(){}<>
なので
% export WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
とすれば、
| backward-word | (Alt-b) | 前の単語に移動 |
| forward-word | (Alt-f) | 次の単語に移動 |
| backward-kill-word | (Alt-Ctrl-h) | 前の単語を削除 |
| kill-word | (Alt-d) | 次の単語を削除 |
これらのコマンドをパスに対しても使えるようになる。
% ls /usr/local/share/emacs/site-lisp/□
ここで、
Alt-b Alt-b Alt-b Alt-Ctrl-h
とすると
% ls /usr/share/emacs/site-lisp/
こーなる。これでキー入力が少しは楽になったと思う。
今回始めて知ったのですが。 パスに空のスラッシュがあってもきちんと表示してくれるみたいです。
% ls /usr/////share/emacs/site-lisp/
quoteが必要でした。
% export WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
修正しました。
2004-12-10 [X] 新しいモディファイヤキーを追加する
標準的なキーボードには、Ctrl,Shift,Alt等のモディファイヤキーが用意されています。
これらのキーを使ったキーボードショートカットはアプリケーション毎にまちまちなので、自由に定義できません。
そこで無変換キーなどを以下のようにモディファイヤキーとして定義すると、マイショートカットキーを自由に定義できます。
まず無変換キーのキーコード(131)をxevコマンドで調べ、以下のような~/.Xmodmapファイルを作成し
keycode 131 = Super_R clear mod4 add mod4 = Super_R
xmodmap ~/.Xmodmap
コマンドを実行するだけです。
これでemacsでは
(define-key global-map [(super g)] 'goto-line)
sawfishでは
(bind-keys global-keymap "Super-m" maximize-window-toggle)
のように使えます。
There is no comment.
2004-12-09 [posix] テンポラリファイルを確実に削除する方法
「へぇ〜」知らんかったシリーズ(またかい?)
ファイルをオープン直後に unlink して、そのまま使いつつける
というのが定番 tips なんだって。 ( http://ns1.php.gr.jp/pipermail/php-users/2004-November/024120.html )
ファイルをオープンした得られたファイルハンドルは、クローズされるまでは 有効ということらしい。こうしておくと、例外処理の中に一時ファイルを 消してまわるコードをいちいち入れなくてもよいということ。
Haskell で実験 foo.lhs を作成
#!/usr/local/bin/runhugs
\begin{code}
module Main where
import System
import IO
import Directory
tmpfile = "MogeMoge"
message = "Operation with unlinked file."
main = do f <- openFile tmpfile ReadWriteMode -- ファイルをオープン
removeFile tmpfile -- ファイルを消去
system "sleep 5" -- 5 秒待つ
hPutStrLn f message -- ファイルハンドルへ書き出し
hSeek f AbsoluteSeek 0 -- 先頭へシーク
cs <- hGetContents f -- ファイルハンドルから読み込み
putStr cs -- 読み込んだ内容を出力
\end{code}
実行パーミッションをONにして、実行してみると
% chmod +x foo.lhs % ./foo.lhs Operation with unlinked file. % ls MogeMoge ls: MogeMoge: No such file or directory
なるほど。
There is no comment.
2004-12-08 [zsh] パイプで繋いだコマンド列に対する time での時間計測
そんなん知らんかった。なんのために。。。(しつこい^^;)
% time foo | bar ... some output ... foo 0.01s user 0.01s system 67% cpu 0.029 total bar 0.01s user 0.00s system 78% cpu 0.013 total
のように、各コマンド毎の時間を計測してくれる。全体での時間を知りたければ サブシェルにする。
% time (foo | bar) ... some output ... (; foo | bar; ) 0.01s user 0.00s system 19% cpu 0.050 total
There is no comment.
2004-12-07 [zsh] 連番の生成
「なんのために、zshつことんじゃぁ!」シリーズ第。。。わすれた。。。弾
{from..to} と書くと from から to までの連番を生成してくれる。
% echo {1..10}
1 2 3 4 5 6 7 8 9 10
% echo {00..15}
00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15
たとえば、
wget -r -L -N -nH --cut-dirs=2 http://www.example.org/download/sicp/ex-1.{1-46}.scm
とか。
There is no comment.
2004-12-06 角谷(Collatz)予想
正の整数を引数とする以下のような関数 f を考える。
f(n) = 1 , n = 1 のとき
= f(n/2) , n が偶数のとき
= f(3n+1) , n が奇数のとき
すべての正の整数 n について、f(n) が停止するという予想を 角谷予想あるいはCollatz予想というそうだ。「予想」というのだから、 まだ、反例が見つかったわけでも、正しい(あるいは間違い)という証明が なされているわけでもない。シンプルなアルゴリズムなのに不思議。
入力 n に対して、f が何ステップで停止するかは、
g(n) = 1 , n = 1 のとき
= 1+g(n/2) , n が偶数のとき
= 1+g(3n+1) , n が奇数のとき
を計算してみればよい。
さて、ある区間 0 < i ≦ n ≦ j の n について、g(n) の最大値を もとめる「効率」のよい関数 h(i,j) を工夫できるだろうか?
There is no comment.
2004-12-03 [emacs] coding-system を指定してファイルを開く
新しいファイルを utf-8-unix で開きたいとき
C-x RET-c
とやると
Coding system for following command (default,euc-japan-unix):
のように聞いてくる。ここで、utf-8-unix と入力すると、次に
Command to execute with utf-8-unix:
のように聞いてくるので、
C-x 5-f
などとやって、新しいファイル名を指定すると、そのファイルを utf-8-unix で開いてくれます。
There is no comment.
2004-12-02 [Algorithm] メモ化
最適化の手法に、「メモ化(memoization)」というのがあります。 これは、フィボナッチ関数のように定義どおり素朴に実装すると、 重複して冗長な再帰計算をやるような類いの問題に適用すると 効果を発揮することもある手法です。要するに、一度計算した 結果を、そのときの引数をキーに表に登録しておき、再計算する かわりに表を索くことで済ませようというものです。 以下は、SICP ##(link2sicp "book-Z-H-22.html#%_thm_3.27" "Exercise 3.27") にあるメモ化関数 memoize とその使い方です。
memoize の定義
(define (memoize f)
(let ((table (make-table)))
(lambda (x)
(let ((previously-computed-result (lookup x table)))
(or previously-computed-result
(let ((result (f x)))
(insert! x result table)
result))))))
memoise で使う表を作る make-table 手続き、 検索手続き lookup、表へエントリを登録する insert! 手続き は Gauche の util.list モジュールをつかって定義する
(use util.list) (define (make-table) (list '*table*)) (define (lookup key table) (assoc-ref (cdr table) key)) (define (insert! key value table) (set-cdr! table (assoc-set! (cdr table) key value)))
memoize を使った、fib の定義
(define fib
(memoize (lambda (n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))))
この定義では (fib n) は n に比例したステップ数で計算される。
There is no comment.
2004-12-01 [zsh] 環境変数を直接編集
環境変数に値を追加するには、
% export PATH=/usr/local/X11R6.8/bin:$PATH
のようにしますが、値を間違えて追加した場合などには
% export PATH=/usr/local/bin:/usr/bin
のように、正しい値をいちいち入れ直さなければなりません。
そんな時 zsh の vared コマンドを使うと、 環境変数の値を直接変数できます。
% vared PATH /usr/local/X11R6.8/bin:/usr/local/bin:/usr/bin■
(■はカーソル)
There is no comment.