Open Source WEB



2005-03-31 [hugs] 日本語処理

この「今日の一行」でもよく登場する Haskell スクリプトの処理系のひとつ Hugsの最新バージョンは Char型と Charモジュールが Haskell 98 の仕様どおり Unicode サポートを するようになった.これまでは,EUC-JP だと

Prelude> length "日本語"
6

のように日本語一文字は2文字として認識していたのが,

Hugs.Base> length "日本語"
3

のようにちゃんと日本語一文字も1文字として扱われるようになった. でも,

Hugs.Base> "日本語"
"\26085\26412\35486"

のようにリテラルはエスケープされてしまうこれは,仕様としては正しい動作 なんだけど,ちょっと面白くない. これを回避するには,酒井さんの 作成した パッチ を当ててビルドする.

% patch -p 1 < hugs98-Mar2005-unicode-display.diff
% ./configure --enable-char-encoding
% make
% sudo make install

こうすると

Hugs.Base> "日本語"
"日本語"

メデタシ,メデタシ.

--nobsun


Name:
Comment:

There is no comment.


2005-03-30 [正規表現] Cのコメントにマッチする正規表現

 /* Cスタイルのコメント */

にマッチする正規表現は

/\*([^*]|\*\**[^*/])*\*\**/

と思う.ほんとかな?

--nobsun


Name:
Comment:
cut-sea: (Wed Mar 30 12:47:02 2005 )
自分がCのコードからコメントをざっと取り出したいとか思った時は

% awk '/\/\*/,/\*\//' *.[hc]

ですか。でもこれは具体的な用途によりそう…。
自分ではちょっと複雑な正規表現とかは、ハマると時間くっちゃう事が
多いので、ついついヒキョーな技に逃げるという。


2005-03-29 [nl] ファイルに行番号をつける

ファイルに行番号を付けるためにある nl というコマンドがあるらしい.

% nl -b t foo.txt
     1  君がため
     2  はるの野に出て


     3  わかなつむ
     4  わが衣手に
     5  雪はふりつつ

とか

% nl -b a -n rz foo.txt
000001  君がため
000002  はるの野に出て
000003
000004  わかなつむ
000005  わが衣手に
000006  雪はふりつつ

とか.ちょっとオプションがわかりにくいかなぁ.

--nobsun


Name:
Comment:
cut-sea: (Tue Mar 29 22:18:30 2005 )
このコマンド知らなかったです。
行番号つけるとなったら真っ先には cat -n とかですか。
下の例みたいにやりたかったら、こうか。

% awk '{printf("%06d %s\n",FNR,$0)}' foo.txt

でも nl の多彩なオプションの模倣はちょっと面倒そう。
複数ファイル指定が出来る点だけが利点かな。
しかし百人一首とはシブイ。
cut-sea: (Tue Mar 29 22:33:19 2005 )
あ、上のはcat -nじゃなかったんですね。

% awk '/^$/;$0!~/^$/{print ++n OFS $0}' foo.txt

...なんか不細工。


2005-03-28 [tac] どんなときに使うの?

たとえば,

#!/usr/local/bin/runghc
\begin{code}
module Main where

defsep :: Char
defsep = '\n'

main :: IO ()
main = do { cs <- getContents
          ; mapM_ (\ s -> do { putStr s; putStr [defsep] })
          $ reverse $ separateBy defsep cs
          }

separateBy :: Eq a => a -> [a] -> [[a]]
separateBy sep [] = []
separateBy sep xs = let (l,xs') = break (sep==) xs
                    in  l: case xs' of {[]->[];_:xs''->separateBy sep xs''}
\end{code}

という内容のファイルがあったとしよう.これに tac を適用すると

% tac tac.hs
\end{code}
                    in  l: case xs' of {[]->[];_:xs''->separateBy sep xs''}
separateBy sep xs = let (l,xs') = break (sep==) xs
separateBy sep [] = []
separateBy :: Eq a => a -> [a] -> [[a]]

          }
          $ reverse $ separateBy defsep cs
          ; mapM_ (\ s -> do { putStr s; putStr [defsep] })
main = do { cs <- getContents
main :: IO ()

defsep = '\n'
defsep :: Char

module Main where
\begin{code}
#!/usr/local/bin/runghc

というわけ.tac って cat の逆綴りなんだね. 動作はわかるんだけど,どんなときに使うのだろう.

--nobsun


Name:
Comment:

There is no comment.


2005-03-25 [puzzle] n クィーンの最小決定パターン,最大非決定パターン

年度末の忙しい週末のための,現実逃避ネタ(おぃ).

よく知られた,8クィーン問題というのがあって,8×8 マスのチェスボードに 8個のクィーンを互いに効き筋にあたらないように置くというものです. でこれは,92通りの解があることが知られています.

8 を一般の n に拡張した問題を n クィーン問題といい,これを解くプログラ ムはSICPの問題2.42参照してください.

たとえば,8クィーンの問題なら,

             
               
               
               
               
             
               
             

の3個所にクィーンを置くと後の5つのクィーンの場所は一意に決定してしまう. このようなパターンを「8クィーン最小決定パターン」とよぼう.

また,

             
             
             
             
             
             
               
               

のように6個所にクィーンを置いても,あとの2つのクィーンの位置は一意に決 定できない.このようなパターンを「8クィーン最大非決定パターン」とよぼ う.

今日の一行は,

お題:「n クィーンの最小決定パターンと,最大非決定パターンを求めるプログラム」

もし,これはというのができたら,教えてくださいね. oss @ timedia . co .jp

--nobsun


Name:
Comment:

There is no comment.


2005-03-24 [Vine Linux] 無線LANでのWEP設定

Vine 3.1 の場合[アプリケーション]ー[システム・ツール]ー[ネットワークの 設定]では,無線LANでのWEP KEYの設定ができない. これは,/etc/sysconfig/network-scripts/ifcfg-eth1 (無線LANデバイスが eth1と認識されている場合)というファイルを直接編集する.

BOOTPROTO=dhcp
ONBOOT=yes
USERCTL=yes
NAME="無線 LAN カード"
DEVICE=eth1
ESSID=**********
PEERDNS=yes
KEY=s:*************

最後の行がそれ.16進で指定する場合には「s:」は不必要

--nobsun


Name:
Comment:

There is no comment.


2005-03-23 [script] 空行をかぞえる.

% runghc count-empty-lines.hs < 20050323.wiliki
2

スクリプト count-empty-lines.hs の中身は,次の一行.

main = getContents >>= print . length . filter (""==) . lines

--nobsun


Name:
Comment:
novice: (Wed Mar 23 14:53:39 2005 )
$ sed -e '/^$/!d' < 20050323.wiliki | wc -l

sedで空白行以外を削除してから行数を数えてみました。
cut-sea: (Wed Mar 23 22:28:31 2005 )
egrep -v '.+' 20050323.wiliki | wc -l

grepのvオプションを良く使う派。思考が天の邪鬼なのかな。


2005-03-22 [a2ps] GNU版の印刷

2004-09-16では perl版の a2ps での 「ヘッダなし,フッタなし,枠なし,時刻なし,ポートレートで印刷」を 紹介したが,今度はGNU版.GNU版はソースファイルの拡張子などを見てソース コードが書かれている言語を推定し,それにあわせて予約語などの書体を変え て印刷してくれる.SchemeやHaskellにも対応している.でも,これが余計な お世話だったりもして...で,単にタイプライターフォントで出してくれた ほうが嬉しかったりするときには,

% a2ps -R -B --columns=1 --borders no --hightlight-level=none -Pmyprinter foo.scm

--nobsun


Name:
Comment:

There is no comment.


2005-03-18 [MySQL] SQL文中のコメント

SQLでは文中にコメントを入れることができる.

SELECT * FROM foo -- これはコメント
/* これはコメント */ WHERE bar = 1;

とやる.MySQLでは /*! と */ の間にMySQLだけで有効な文のパーツを挿入できる.

CREATE TABLE tbl (i INT) /*! TYPE = HEAP */;

とやると,ほかのRDBMSでは

CREATE TABLE tbl (i INT);

だけど,MySQL 3.23.0 以降では,

CREATE TABLE tbl (i INT) TYPE = HEAP;

と解釈してくれる.あれっ.MySQL じゃ 3.23.0 より前のバージョンは? そんな古いバージョンは使うなってこと?いえいえ.使われる可能性があるな ら,

CREATE TABLE tbl (i INT) /*!32300 TYPE = HEAP */;

って書いとけばいいんだよ.

「MySQLってば...」...

--nobsun


Name:
Comment:

There is no comment.


2005-03-17 [cvs] リリースタグを付ける

ソフトウェアのリリースをするとき,cvs リポジトリのそのプロジェクトファ イル全体に同じタグを打っておく.

% cvs rtag -r HEAD release0_0_1 magic

これは magic ディレクトリ(モジュール)以下のすべてのファイルに release0_0_1 を適用する.-r HEAD はそれぞれのファイルの最新リビジョン にタグを打つことを指定するオプション.

--nobsun


Name:
Comment:

There is no comment.


2005-03-16 [misc] 更新したファイルを検索し更新順に表示する

ファイル検索にはfindコマンドがよく使われる. でも,findコマンドはファイルを更新順に並べて表示してくれない.

 find . -mtime -1 -type f | xargs -r ls -lt

これで,24時間以内に更新したファイルを検索し更新順に表示できる.

--shibata


Name:
Comment:
いけがみ: (Wed Mar 16 21:49:32 2005 )
シェルが zsh の場合、同様のことが以下のコマンドで可能です。
% ls -lt ./**/*(.mh-24)


2005-03-15 [date] 異る地域の時刻

普段JSTだけれど,たとえば Hawaii 標準時を知りたいとき.TZ変数をつかう.

% date
2005年  3月 15日 火曜日 07:30:31 JST
% TZ="HST" date
2005年  3月 14日 月曜日 12:30:36 HST

などとする.

--nobsun


Name:
Comment:

There is no comment.


2005-03-14 [misc] 順列の生成

組み合わせの生成だけでなく,順列の生成も 欲しい.

-- perm.hs
perm :: Int -> [a] -> [[a]]
perm 0 _  = [[]]
perm _ [] = []
perm n xs = concat $ map (pm n) $ splits xs
  where pm _ (_,[])   = []
        pm n (h,t:ts) = [ t:ys | ys <- perm (n-1) (hs ++ ts) ]
splits :: [a] -> [([a],[a])]
splits []         = [([],[])]
splits xxs@(x:xs) = ([],xxs) : [ (x:ys,zs) | (ys,zs) <- splits xs ]

実行例.ghciはGHC付属のインタープリタ.GHCを インストールすると一緒にインストールされる.GHCはWindowsバージョン,各 種UNIXバージョンが用意されている.インストールは簡単なので是非おためし あれ.

% ghci perm.hs
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.4, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base-1.0 ... linking ... done.
Compiling Main             ( perm.hs, interpreted )
Ok, modules loaded: Main.
*Main> perm 3 "123"
["123","132","213","231","312","321"]
*Main> perm 2 "1234"
["12","13","14","21","23","24","31","32","34","41","42","43"]

--nobsun


Name:
Comment:

There is no comment.


2005-03-11 [LaTeX] 出力の選択 version.sty

プリアンブルで,

\usepackage{version}

しておいてから

\excludeversion{EN}
\includeversion{JA}
\excludeversion{FR}

のようにしておくと,

\begin{EN}
 Now, we talk in English.
\end{EN}
\begin{JA}
 いまは日本語で話しています.
\end{JA}
\begin{FR}
 Nous parlons en fran\c{c}ais, maintenant.
\end{FR}

という部分は

いまは日本語で話しています.

となります.また

\includeversion{EN}
\includeversion{JA}
\excludeversion{FR}

とやると

Now, we talk in English. いまは日本語で話しています.

となる.

--nobsun


Name:
Comment:

There is no comment.


2005-03-10 [LaTeX] boxnote

ascmac.sty というパッケージにはこんなことができる boxnote環境が用意されている.

--nobsun


Name:
Comment:

There is no comment.


2005-03-09 [LaTeX] fancyvrb.sty

verbatime 環境を自力で拡張するのはかなり難しそう. でも,fancyvrb.sty には便利なマクロが定義されていてこれを使うのが簡単.

たとえば,Haskellの文藝的スクリプト .lhs では,\begin{code} \end{code}の間がプログラムコードとして解釈される.たとえば, \usepackage{fancyvrb}としてDefineVerbatimEnvironment マクロを使って code環境を定義しておく.

\documentclass{jsarticle}
\title{Hello, world!}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{code}{Verbatim}{frame=single,fontsize=\small}
\begin{document}
\maketitle
\section{Hello-world program in Haskell}
以下はHaskellで書いた''Hello world!''プログラムである
\begin{code}
module Main where
main :: IO ()
main = putStrLn "Hello, world!" 
\end{code}
\end{document}

これを hello.tex として保存しておけば,そのまま platex にかけて コンパイルできる.コードの部分は \small 指定されたフォントサイズで 単線の枠内に verbatime 環境と同等の表現で表示される.

一方,このファイルに hello.lhs というシンボリックリンクを張ると,これは Haskell のプログラムコードとして解釈できるので,

% runghc hello.lhs
Hello, world!

と表示される.

--nobsun


Name:
Comment:

There is no comment.


2005-03-08 [misc] 組み合わせの生成

データやインデックスの集りの中から指定個数とりだす場合の組み合わせが 欲しいときがある.そんな関数を定義する.

comb :: Int -> [a] -> [[a]]
comb 0 _      = [[]]
comb _ []     = []
comb n (x:xs) = map (x:) (comb (n-1) xs) ++ comb n xs

(2005/03/09):修正しました。

これでたとえば,a b c d e の5つから3つとりだす組み合わせが 欲しければ,hugs の対話環境あるいは,ghci の対話環境から

*Main> comb 3 "abcde"
["abc","abd","abe","acd","ace","ade","bcd","bce","bde","cde"]

のようにやる.さらに,指定した個数だけ取り出した残りも同時に 欲しいということがある.そんなとには,次のような関数を使う.

gcomb :: Int -> [a] -> [([a],[a])]
gcomb n xs = gcmb n (xs,[])
 where gcmb 0 (ps,qs)   = [([],ps++qs)]
       gcmb _ ([],_)    = []
       gcmb m (p:ps,qs) =  map (\(xs,ys) -> (p:xs,ys)) (gcmb (m-1) (ps,qs))
                        ++ map (\(xs,ys) -> (xs,p:ys)) (gcmb m (ps,qs))

実行例

gcomb 3 "abcde"
[("abc","de"),("abd","ce"),("abe","cd"),("acd","be"),("ace","bd")
,("ade","bc"),("bcd","ae"),("bce","ad"),("bde","ac"),("cde","ab")]

意外に便利...

--nobsun


Name:
Comment:
cut-sea: (Tue Mar 8 20:19:35 2005 )
むむ? comb の型や定義が…。(at Hugs)

comb :: Int -> [a] -> [[a]]
comb 0 _   = [[]]
comb _ []  = []
comb n (x:xs) = map (x:) (comb (n-1) xs) ++ comb n xs

これなら

Main> comb 3 "abcde"
["abc","abd","abe","acd","ace","ade","bcd","bce","bde","cde"]
nobsun: (Wed Mar 9 07:53:59 2005 )
うがぁーーっ。ひでぇorz 修正しました。
指摘ありがとうございます。


2005-03-07 [MySQL] enum 型

「MySQLってば...」シリーズ(ぉっ). MySQL には enum 型というのがある. これがまた,なかなか...

mysql> describe hage;
+-------+---------------+------+-----+---------+-------+
| Field | Type          | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| oyaji | enum('2','3') | YES  |     | NULL    |       |
+-------+---------------+------+-----+---------+-------+

でもって,

INSERT hage VALUES('3')
INSERT hage VALUES('4');
INSERT hage VALUES('1');

というINSERT操作を行った場合実際にどのような値が格納されるでしょう?

を見ず にどうぞ.

で,これってどうよ.

--nobsun


Name:
Comment:

There is no comment.


2005-03-04 [MySQL] Quiz: 日付型

以下のような,一つだけしかカラムを持たないテーブル datetest がある.

mysql> DESCRIBE datetest;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| d     | date | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+

以下のINSERT操作を行った場合実際にテーブル datetest に格納される値は何 でしょう.

INSERT INTO datetest VALUES ('2005-02-31');

を見ずにどうぞ.

で,これってどうよ.

--nobsun


Name:
Comment:

There is no comment.


2005-03-03 [network] ホスト名の変更

「おいおいシリーズ」だなこれは.まちがいない.

Linux を起動後のホスト名変更.知らないと,/etc 以下のファイルをあれこ れチェックして...なんてことになる.ネットワーク関連の設定ファイルは Linux のディストリビューションによってずいぶん違っていたりするので, 結構面倒.(おぃおぃ)

# hostname hogehoge.example.org

シェルのプロンプトにホスト名を出しているような場合は,再ログインした時 から有効になる.

--nobsun


Name:
Comment:

There is no comment.


2005-03-02 [SQL] カラム名の取得

テーブルに含まれるカラムの名前を取得する

SELECT * FROM atable WHERE 0=1;

本当は,それぞれのカラムの型や制約などのメタ情報を知りたいのだが, そのような Query は SQL では構成できない.

MySQL では,SQLの独自拡張としてSHOW 文が用意されている.

  • SHOW COLUMNS FROM atable
  • SHOW CREATE TABLE atable

など...

--nobsun


Name:
Comment:

There is no comment.


2005-03-01 [misc] 行儀の悪い圧縮ファイル対策

圧縮ファイル名がhogehoge-0.1.tar.gzの場合 中身はだいたい以下のようなフォルダ構造になっている.

 hogehoge-0.1/README
 hogehoge-0.1/src/foo.c
 hogehoge-0.1/src/bar.c

そのまま解凍しても一つのフォルダにまとまっているので分りやすい.

こーじゃなく,中身が

 README
 bin/a
 lib/c

みたいな行儀の悪い圧縮ファイルが時々ある.うっかり解凍しちゃうと, カレントフォルダがゴチャゴチャになる.

そこで,以下のようなスクリプトを用意する.

DIRNUM=`tar -ztf $1 | cut -d '/' -f 1 | uniq | wc -l`
DIRNAME=${1%.tar.gz}

case $DIRNUM in
    1) tar -zxvf $1 ;;
    *) mkdir $DIRNAME;
        cd $DIRNAME;
        tar -zxvf ../$1;;
esac

行儀の悪い圧縮ファイルの場合は圧縮ファイルから拡張子を除いた 名前のフォルダを作り,そこに解凍する.

(エラー処理してません.)

--shibata


Name:
Comment:

There is no comment.


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

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