Open Source WEB



2004-12-29 [skk] 点々

知らんかった。SKK では、…を出すには、

z.

でよい。

TokuLog! -馴れ合い力-より。


Name:
Comment:
shibata: (Thu Dec 30 16:29:01 2004 )
他には
"z," → "‥"
"z-" → "〜"
"z/" → "・"
"z[" → "『"
"z]" → "』"
"zh" → "←"
"zj" → "↓"
"zk" → "↑"
"zl" → "→"
などが使えるみたいです
(skk-def.elより)


2004-12-28 [CVS] 削除してコミットしてしまったファイルを復活させる

リビジョン1.2で削除しコミットしてしまったファイルをリビジョン1.1の内容で復活する。

cvs update -j 1.2 -j 1.1 filename
cvs commit -m "message" filename


Name:
Comment:

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の正規表現)


Name:
Comment:

There is no comment.


2004-12-24 [google] キーワードのヒット件数

google-count という Ruby スクリプトを使う。

$ google-count {喧々囂々,喧々諤々,侃々諤々,侃々囂々}
60400   喧々囂々
80900   喧々諤々
78100   侃々諤々
56500   侃々囂々

結構まちがいが多いのねぇ。

このスクリプトはakrさんの作品。 コードは ここ にあります。


Name:
Comment:

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


Name:
Comment:

There is no comment.


2004-12-21 [emacs] ハノイの塔

意外に動かしてみたことない人が多いのではと思う。

M-x hanoi-unix

さて、これは途中からはじまるのだが、これは何時おわるのか きまっているらしい。これがおわったとき、なにかが起こる。

さて、それは何時で、何がおこるのか。。。

M-x hanoi-unix-64

これが終ったときには、この宇宙が存在するかどうかもわからない。 だから、「これが終わったとき、宇宙は破滅する」と予言しても、 だれも予言を確かめられないだろうね。


Name:
Comment:
novice: (Wed Dec 22 11:29:11 2004 )
M-数字 M-x hanoi

で枚数指定できるんですね。
novice: (Tue Feb 1 21:18:50 2005 )
こんな変型場−ジョンもあったよ。
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


Name:
Comment:

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
 ■■□■ ■■■□ ■■□□


Name:
Comment:
novice: (Fri Dec 17 21:00:54 2004 )
#!/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 ~

こんなコマンド知らんかった。


Name:
Comment:

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進表記になる。


Name:
Comment:
novice: (Thu Dec 16 21:11:38 2004 )
% perl -e 'printf "%b\n", 0xdec';
110111101100
shiro: (Sat Dec 18 14:47:59 2004 )
こんなこともできる。
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本はだいじょうぶなのかなぁ。 あくまで目安ですからね。ホドホドに。


Name:
Comment:

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/


Name:
Comment:
shibata: (Mon Dec 13 10:57:49 2004 )
quoteが必要でした。
% export WORDCHARS='*?_-.[]~=&;!#$%^(){}<>'
nobsun: (Tue Dec 14 08:19:26 2004 )
修正しました。


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)

のように使えます。


Name:
Comment:

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

なるほど。


Name:
Comment:

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


Name:
Comment:

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

とか。


Name:
Comment:

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) を工夫できるだろうか?


Name:
Comment:

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 で開いてくれます。


Name:
Comment:

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 に比例したステップ数で計算される。


Name:
Comment:

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■

(■はカーソル)


Name:
Comment:

There is no comment.


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

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