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
- 2005-03-31 [hugs] 日本語処理
- 2005-03-30 [正規表現] Cのコメントにマッチする正規表現
- 2005-03-29 [nl] ファイルに行番号をつける
- 2005-03-28 [tac] どんなときに使うの?
- 2005-03-25 [puzzle] n クィーンの最小決定パターン,最大非決定パターン
- 2005-03-24 [Vine Linux] 無線LANでのWEP設定
- 2005-03-23 [script] 空行をかぞえる.
- 2005-03-22 [a2ps] GNU版の印刷
- 2005-03-18 [MySQL] SQL文中のコメント
- 2005-03-17 [cvs] リリースタグを付ける
- 2005-03-16 [misc] 更新したファイルを検索し更新順に表示する
- 2005-03-15 [date] 異る地域の時刻
- 2005-03-14 [misc] 順列の生成
- 2005-03-11 [LaTeX] 出力の選択 version.sty
- 2005-03-10 [LaTeX] boxnote
- 2005-03-09 [LaTeX] fancyvrb.sty
- 2005-03-08 [misc] 組み合わせの生成
- 2005-03-07 [MySQL] enum 型
- 2005-03-04 [MySQL] Quiz: 日付型
- 2005-03-03 [network] ホスト名の変更
- 2005-03-02 [SQL] カラム名の取得
- 2005-03-01 [misc] 行儀の悪い圧縮ファイル対策
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
2005-03-30 [正規表現] Cのコメントにマッチする正規表現
/* Cスタイルのコメント */
にマッチする正規表現は
/\*([^*]|\*\**[^*/])*\*\**/
と思う.ほんとかな?
--nobsun
自分が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
このコマンド知らなかったです。
行番号つけるとなったら真っ先には cat -n とかですか。
下の例みたいにやりたかったら、こうか。
% awk '{printf("%06d %s\n",FNR,$0)}' foo.txt
でも nl の多彩なオプションの模倣はちょっと面倒そう。
複数ファイル指定が出来る点だけが利点かな。
しかし百人一首とはシブイ。
あ、上のは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
There is no comment.
2005-03-25 [puzzle] n クィーンの最小決定パターン,最大非決定パターン
年度末の忙しい週末のための,現実逃避ネタ(おぃ).
よく知られた,8クィーン問題というのがあって,8×8 マスのチェスボードに 8個のクィーンを互いに効き筋にあたらないように置くというものです. でこれは,92通りの解があることが知られています.
8 を一般の n に拡張した問題を n クィーン問題といい,これを解くプログラ ムはSICPの問題2.42参照してください.
たとえば,8クィーンの問題なら,
| Q | |||||||
| Q | |||||||
| Q |
の3個所にクィーンを置くと後の5つのクィーンの場所は一意に決定してしまう. このようなパターンを「8クィーン最小決定パターン」とよぼう.
また,
| Q | |||||||
| Q | |||||||
| Q | |||||||
| Q | |||||||
| Q | |||||||
| Q | |||||||
のように6個所にクィーンを置いても,あとの2つのクィーンの位置は一意に決 定できない.このようなパターンを「8クィーン最大非決定パターン」とよぼ う.
今日の一行は,
お題:「n クィーンの最小決定パターンと,最大非決定パターンを求めるプログラム」
もし,これはというのができたら,教えてくださいね. oss @ timedia . co .jp
--nobsun
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
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
$ sed -e '/^$/!d' < 20050323.wiliki | wc -l sedで空白行以外を削除してから行数を数えてみました。
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
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
There is no comment.
2005-03-17 [cvs] リリースタグを付ける
ソフトウェアのリリースをするとき,cvs リポジトリのそのプロジェクトファ イル全体に同じタグを打っておく.
% cvs rtag -r HEAD release0_0_1 magic
これは magic ディレクトリ(モジュール)以下のすべてのファイルに release0_0_1 を適用する.-r HEAD はそれぞれのファイルの最新リビジョン にタグを打つことを指定するオプション.
--nobsun
There is no comment.
2005-03-16 [misc] 更新したファイルを検索し更新順に表示する
ファイル検索にはfindコマンドがよく使われる. でも,findコマンドはファイルを更新順に並べて表示してくれない.
find . -mtime -1 -type f | xargs -r ls -lt
これで,24時間以内に更新したファイルを検索し更新順に表示できる.
--shibata
シェルが 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
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
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
There is no comment.
2005-03-10 [LaTeX] boxnote
ascmac.sty というパッケージにはこんなことができる boxnote環境が用意されている.
--nobsun
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
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
むむ? 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"]
うがぁーーっ。ひでぇ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
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
There is no comment.
2005-03-03 [network] ホスト名の変更
「おいおいシリーズ」だなこれは.まちがいない.
Linux を起動後のホスト名変更.知らないと,/etc 以下のファイルをあれこ れチェックして...なんてことになる.ネットワーク関連の設定ファイルは Linux のディストリビューションによってずいぶん違っていたりするので, 結構面倒.(おぃおぃ)
# hostname hogehoge.example.org
シェルのプロンプトにホスト名を出しているような場合は,再ログインした時 から有効になる.
--nobsun
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
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
There is no comment.
There is no comment.