プログラミング

ここでは、「プログラミング」 に関する記事を紹介しています。

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
joinコマンドでハマった.

結合のjoinフィールドのソートをうっかり数値順でやっていて,
「join: ファイル 1 はソートされていません」
というエラーに遭遇していた.

参考ページ:
http://manpages.ubuntu.com/manpages/gutsy/ja/man1/join.1.html

FILE1 と FILE2 は実行前に join フィールドの昇順に
ソートしておかなければならない(数値順のソートはだめ)。


http://linuxjm.sourceforge.jp/html/GNU_textutils/man1/join.1.html

file1 と file2 はあらかじめ join フィールドの昇順にソートしておく必要がある (ソートは数値順ではなく、文字列順に行うこと)。



感謝トントン
スポンサーサイト
UNIXのフィルタでSQLみたいなことをしてみたくなった.

CodeZineに記事があったのでまとめ:
業務で楽するためのUNIXテクニック集 (保田和隆氏)

第3回のp.2に paste コマンドの説明が.
他にも具体的なコマンドがたくさんあるので,それを改造すればいろいろできそう.


本体を見るためのポインタ作りをしてみた.すなわち見出しをまとめてみた.


第0回 まずはおさらい、シェル制御構造と正規表現の基礎
  • パイプライン:コマンド1 | コマンド2 | ...
  • コマンドリスト:
    • コマンド1 ; コマンド2 ; ...
    • コマンド1 && コマンド2
    • コマンド1 || コマンド2
  • コマンド置換
    • bashでは `` で囲うことも $() で囲うこともできる
  • ブレース展開
    • 「,」カンマで区切った複数の文字列を「{}」ブレース(中括弧)で囲む
  • シェルの変数展開
    • ${パラメータ#パターン}
    • ${パラメータ##パターン}
    • ${パラメータ%パターン}
    • ${パラメータ%%パターン}
  • for文
    • for 変数 in リスト; do コマンド; done
    • for((i=0; i<5; i++)); do echo "$i"; done
    • for((i=1; i<5; i++)){ echo "$i"; }
    • for file in *; { mv -i "$file" "$file.bak"; }
  • while文
    • while 条件;do コマンド;done
    • find ./ -type f | while read file; do wc -l "$file"; done
  • if文
    • if コマンド1;then (終了コード0)コマンド; elif コマンド2; then コマンド;else コマンド;fi
    • for dir in *; { if [ -d "$dir" ] ; then echo "$dir:"; ls "$dir" | wc -l; fi; }
    • for dir in *; { [ -d "$dir" ] && (echo "$dir:"; ls "$dir" | wc -l); }
  • 理解しておくと便利な正規表現(sed、grep、exprはデフォルトでは基本正規表現)
    • ls * | sed 's/?.[^.]*$//'


第1回 find/grep/xargsコマンドを使いこなす 「検索」編
  • テキストファイルを検索する(grepコマンド)
    • 複数の検索文字を指定して検索(OR検索)する
    • 複数の検索文字を指定して検索する(AND検索)
  • 複雑な条件でファイル・ディレクトリを検索する(findコマンド)
    • findコマンドの代表的なオプション(-follow -maxdepth n -mindepth n)
    • findコマンドの代表的な判別式 
      • 基本:(-name [pattern] -path [pattern] -regex [pattern] -type [filetype] -group [group] -user [user])
      • 日時:(-atime (+/-)n -mtime (+/-)n -mmin (+/-)n -newer [file name])
      • サイズ:(-empty -size n[c/k/b])
      • アクセス権:(-perm mode -perm -mode -perm +mode)
    •  findコマンドの代表的な演算子
      • (\( 判別式 \) ! 判別式 判別式1 -a 判別式2「判別式1 -and 判別式2」「判別式1 判別式2」 判別式1 -o 判別式2)
    •  findコマンドの代表的なアクション
      • (-print -fprint ファイル名 -exec コマンド '{}' \; -exec コマンド '{}' + -ok コマンド \;)
  • 検索結果に対するコマンドの実行(find -exec/xargsコマンド)
    • find . -type f -exec コマンド '{}' \;
    • find . -type f -print0 | xargs -0 コマンド
    • find … -exec bash -c 'シェルコマンド文字列' \;
  • findコマンドを利用した便利なUNIXテクニック例
    • core、#*、*~を一括削除する
    • ユーザーが所有するファイルのみを検索して削除する
    • 検索して見つかった全ファイルを移動する
    • 検索して見つかった全ファイルをディレクトリ構造ごとコピーする
    • サイズと拡張子を条件にファイルを検索し、結果を別のファイルに書き込む
    • findコマンドの「許可がありません」を表示しない

第2回 ファイル・ディレクトリ名の一括置換/一括作成
  • 空のファイルを作成する
    • :,echo,cp を用いた方法に加え,mktemp.touchも.
  • ファイル・ディレクトリの一括作成
    • ディレクトリを一度に複数作成する
    • シェルの制御構文を利用してディレクトリを一度に複数作成する
    • ゼロパディングした名前のディレクトリを一度に複数作成する
    • シンボリックリンクのファイルを一括で作成する
  • ファイル名・ディレクトリ名の一括置換
    • 同一階層内のすべてのファイル・ディレクトリ名に拡張子を付ける
    • サブディレクトリに渡るすべてのファイル名から拡張子を取り除く
  • ファイル名置換に関する便利なUNIXテクニック例
    • サブディレクトリに渡るすべてのファイル名だけに拡張子「.bak」を付ける
    • 同一階層内のすべてのディレクトリ・ファイル名から拡張子「.bak」を取り除く
    • 同一階層の複数のファイル名の拡張子「.text」を「.txt」に置き換える
    • サブディレクトリに渡るすべてのファイルの拡張子「.text」を「.txt」に置き換える
    • サブディレクトリに渡るすべてのファイルの拡張子を「.txt」に変更する
    • サブディレクトリに渡る拡張子のないすべてのファイルに「.txt」を付ける
    • 同一階層のすべてのファイル名の先頭に「日付-」を加える
    • サブディレクトリに渡るすべてのファイル名の拡張子の前に「日付-」を加える

第3回「並べ替え」編 cut、head、tail、sort・・・定番のフィルタコマンドを使いこなす!
  • ファイル内文字列の分割(cut)
    • 例)「/etc/passwd」ファイルからユーザー一覧を出力
    • 例)カンマ区切りの2列目以降を切り出す
    • 例)1文字目と3文字目を切り出す
    • 例)スペース区切りの1列目と3列目を切り出す
    • 注:空白区切りの列を切り出すにはawk、sedなど
  • ファイル内文字列の結合(paste)
    • 例)2つのファイルの内容を結合して出力する
    • 例)lsコマンドの結果を3列で表示する
  • ファイル内文字列のソート
    • sort 例)CSV形式のファイルの2列目をソート対象として、昇順で並び替える
    • uniq 例)ファイルの重複行を1行にまとめ、同一行の数を出力
  • ファイル内の一部分を出力
    • head 例)1番最近更新されたファイルを表示する
    • tail 例)システムのログファイルをリアルタイムに表示する
  • ファイル内容の要約
    • wc 例)サブディレクトリを含むすべてのファイル数を数える
  • フィルタコマンドに関する便利なUNIXテクニック例
    • ディレクトリを「:(コロン)」で区切ってリストにする
    • 隠しファイル(.ファイル)を含むディレクトリ・ファイルのサイズを出力する
    • ランダムな文字列を出力する
    • IPアドレスをソートする
    • N行目からM行目を表示する
    • 末尾N行を削除して表示する
    • メモリを多用しているプロセス順に表示する
    • C言語ソースコードのステップ数(行数)をカウントする
    • よく利用するコマンドのリストを表示する
    • アクセスログから、アクセス数の多いIPアドレス順に並べる
    • アクセスログから、アクセスしたIPアドレスのホスト名一覧を取得する
    • 特定のディレクトリにアクセスした IP アドレス一覧を表示する


emacs の中で GDB を起動して,coreファイルを指定できるのかな?とおもって試してみたらできた.それはそうか.普通に

M-x gdb
gdb 実行ファイル名 coreファイル名

で OK だった.

つうか,coreファイルが 10GB 位あってわろた.その辺にポコポコできたら邪魔すぎるw



個人的覚書羅列開始:
  • core を吐くように設定すべし.こないだの記事を参照.
  • コンパイルオプションに -g を追加しる
  • emacs から M-x gdb,gdb 実行ファイル名 coreファイル名 でGDBモード開始.
  • スタックフレーム表示は where,bt でok
  • p 変数名 で変数の中身見られる.変数名を用いた数式もok
  • p 変数名の数式 の計算結果が 32bit を越えるとラップアラウンド.なんとかしる.
  • p 関数名::変数名 も便利.
難しいことなんかしてないにもかかわらず,えらく楽になった.

結論:GDB は文明の利器


なんでいままで GDB を使わなかったのか,つらつら考えてみた.

たぶん自分が管理している計算機じゃなかったから,設定を変えたり,
でかい core ファイルをポコポコ生産したりするのをためらっていたんじゃないか,
という気がする.


[Emacs から GDB 様を呼んでみた.]の続きを読む
計算開始後7500分以上経ったところで落ちてしまったが、coredumpを吐かせるのを忘れてたのでorz

反省。

Linux 環境設定/コアダンプを出力するようにする
などを見てみる。


今の設定を確認してみる:

$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 204800
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 204800
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited




では、こーすればいいのか?
/etc/profile の↓をコメントアウトして、コアダンプサイズの上限を0にしている箇所を回避:

# No core files by default
#ulimit -S -c 0 > /dev/null 2>&1


さらに /etc/security/limits.conf

* soft core unlimited
* hard core unlimited

と追加。ちゃんと core を吐いてくれるようになった。




[coredump吐かせるの、忘れてた]の続きを読む
多倍長ライブラリ GMP(GNU MP)の関数一覧を作ってみたくなった.
正確にはプロトタイプ宣言の一覧が欲しい:

void mpz_add (mpz t rop, mpz t op1, mpz t op2) [Function]
void mpz_add_ui (mpz t rop, mpz t op1, unsigned long int op2) [Function]


結論的には

$ wget --accept=html --no-parent --limit-rate=10k -r --level=0 --relative http://gmplib.org/manual/
$ find ./ -name '*.html' | xargs sed -e 's/<[^>]*>//g' | sed -e 's/&nbsp;/ /g'|grep '&mdash; Function:' | sort | sed -e 's/&mdash; Function: //g' | less

でおk.




考えたことは次のとおり:

最初はマニュアル PDF からコピペしてみたが,明らかにめんどい.

そこで,HTML版のマニュアルから作ることにした.環境は Ubuntu 10.04.



まずマニュアルをもらってくる.適当なディレクトリで

$ wget --accept=html --no-parent --limit-rate=10k -r --level=0 --relative http://gmplib.org/manual/

とすれよい.やってることは,マニュアルのディレクトリから相対リンクされているhtmlファイルを(親ディレクトリを除いて)再帰的にダウンロード,ということ.ただし,回線に負担をかけないよう,スピードを 10k に制限.

もらってきたHTMLを見てみると,

― Function: void mpz_add (mpz_t rop, mpz_t op1, mpz_t op2)
― Function: void mpz_add_ui (mpz_t rop, mpz_t op1, unsigned long int op2)

の中身は,

&mdash; Function: void <b>mpz_add</b> (<var>mpz_t rop, mpz_t op1, mpz_t op2</var>)<var><a name="index-mpz_005fadd-283"></a></var><br>
&mdash; Function: void <b>mpz_add_ui</b> (<var>mpz_t rop, mpz_t op1, unsigned long int op2</var>)<var><a name="index-mpz_005fadd_005fui-284"></a></var><br>

こんな感じになってた.htmlタグが邪魔な気がするので除去したい.調べてみると,
サラトガIT日記さんのところのsedでhtmlのタグを除去する
IBM developerWorks Japan共通テーマ: 実例でわかるsed: 第2回
という記事が見つかった.HTMLタグの除去は

$ sed -e 's/<[^>]*>//g' hoge.html

で実現できる.<.*> でうまくいかない理由も書いてある.感謝.


あとは関数の行だけを出力すればよいが,「&mdash; Function: 」を目印に探すことにした.というわけで,単純にソートすると

find ./ -name '*.html' | xargs sed -e 's/<[^>]*>//g' | sed -e 's/&nbsp;/ /g'|grep '&mdash; Function:' | sort | sed -e 's/&mdash; Function: //g' | less

で,ファイルごとに表示するなら

$ find ./ -name '*.html' | xargs grep --with-filename .* | sed -e 's/&nbsp;/ /g'| sed -e 's/<[^>]*>//g'|grep '&mdash; Function:' | sed -e 's/&mdash; Function: //g' | sed -e 's/.*\///g'

そこからファイル名を除去すると

$ find ./ -name '*.html' | xargs grep --with-filename .* | sed -e 's/&nbsp;/ /g'| sed -e 's/<[^>]*>//g'|grep '&mdash; Function:' | sed -e 's/&mdash; Function: //g' | sed -e 's/.*://g' | less

こんな感じか.



せっかくなので,得られた一覧を貼ってみる:
[gmp の関数一覧を生成してみた]の続きを読む
python で uniq コマンドみたいなものを書いた.いきさつは以下のとおり:


uniq コマンドにバカでかい CSV ファイルを食わせたら,

セグメンテーション違反です

とメゲてしまった.頑張れよ,uniq.cat も sort も awk も大丈夫だったのに...
まぁ、1行がメガバイト単位なCSVを食わせるのが悪いのかもしれんね。

環境は

$ uname -a
Linux tekitobibouroku.jp 2.6.18-164.ydl.3 #1 SMP Mon May 10 13:46:45 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

uniq のソースをチラ見したが、バッファを固定値で取っているモヨン。修正する根性がないので,代替手段を探しに出かけた.


すると,python で uniq コマンド的なものを作られた方の記事を発見した.
Pythonでuniqコマンドのように重複行を削除する
そうかこの手の処理も python でいけるやんか.感謝!


さて,こちらの python のバージョンは

$ python
Python 2.4.3 (#1, Sep 3 2009, 15:37:37)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-46)] on linux2
Type "help", "copyright", "credits" or "license" for more information.




自分の状況では CSV ファイル,すなわち「各行内にカンマが入っている」データを処理したい.カンマのせいか,set で重複を弾こうとすると不具合が出る.
あんまり綺麗じゃないけど次のようになった:

#!/usr/bin/python
import sys
data = []
last = ""
for line in sys.stdin:
  if line != last:
    data.append(line)
    last = line
for a in data:
  print a,

その場で標準出力に投げればメモリも食わなくて安心的:

#!/usr/bin/python
import sys
lastline = ""
for line in sys.stdin:
  if line != lastline:
    print line,
    lastline = line

綺麗かどうかは分からんが,短くはなった.これを uniq.py とでも名づけて保存し,chmod u+x ./uniq.py とかすれば実行できるようになる.
スピードが出るのか心配だったが,自分の用途に関しては特に問題はなかった.


案外フィルタも書きやすいのかも試練とオモタ.Python いいな.
いい本見つけた:

Inside Linux Software オープンソースソフトウェアのからくりとしくみInside Linux Software オープンソースソフトウェアのからくりとしくみ
(2007/03/14)
佐藤 竜一

商品詳細を見る

オープンソースでソフトウェア開発する際に必要になりそうな知識をまとめてくださっている。

こういう本がほしかった。Binary Hacksでは前提知識が多くて、正直難しかった感じがしたが、この本でいい感じに間を埋めていけるように思う。
  • ELFファイルのしくみ
  • gccの内部動作
  • make → configure → autoconf
  • rpmのしくみ
といった話が自分にとってうれしい。

ところで、レビューのコメントにもあるように、

実践的で良い本なのだが、タイトルと内容が全く一致していないのが不思議だ。

まさしくそうおもた。

最初、本屋で見たときはスルーしそうになったが、何らかの予感がしたので開いてみたら正解だった。
問答無用でレジへ。



この本と一緒に読んでいこうと思う:
UNIXプログラミングの道具箱―プロフェッショナルが明かす研ぎ澄まされたツール群の使いこなしUNIXプログラミングの道具箱―プロフェッショナルが明かす研ぎ澄まされたツール群の使いこなし
(2004/06)
工藤 智行

商品詳細を見る

こちらは
  • emacs
  • cvs
  • CUnit
  • GDB
などの話が紹介されていて貴重。




今年もあと少しだ。

よいお年をお迎えください。

そば食べたい。
[ELFやconfigure, autoconfの解説ありの本を発見!]の続きを読む
こないだのこと。
C言語でなぞのSegmentation Faultが発生して、しばらく悩んだ。
原因は、馬鹿でかい自動変数の配列を作っていたため、スタック領域を食いつぶしていたことのようだった。

現象:
main関数の先頭に
printf("hoge");
fflush(stdout);
を入れてみても、表示される前にSegmentation Faultで落ちた。

どこかスタックぶっ壊しているくさいなぁ、と思ってよく見てみると、自動変数の配列のサイズ大きすぎたことに気づいた。(そもそも設計がよくない?)
配列のサイズを修正して事なきを得た。


Stack Heapでググってみたら
オブジェクト指向講座 スタック領域とヒープ領域
という記事が見つかった。

C#などの言語でのスタック、ヒープの説明がなされている。分かりやすかったので感謝。


こんな記事も見つけた:
Javaの知られざる欠陥(上)
無料でSubversionリポジトリを使用できるサービスを探してみた。
先人の知恵を感謝しつつ借りる:

Assenblaがよさそうかな…


非公開リポジトリをもてそうなのは、るらしい。


まとめサイト:
Subversion、Git、Mercurial などが使えるリポジトリ サービス 大量!


いいサイト見つけた!

gccとかgdbとかgoogle-perftoolsとか、C言語のLinux環境関連のメモ
うまくまとめてくださっている。ありがたや(’人`)

関係ないが、Knoppix MathにCUnitとかValgrindとかOprofileとか入れてみたい。

最近、↓の本を呼んでいたのでタイムリーだった。
UNIXプログラミングの道具箱―プロフェッショナルが明かす研ぎ澄まされたツール群の使いこなしUNIXプログラミングの道具箱―プロフェッショナルが明かす研ぎ澄まされたツール群の使いこなし
(2004/06)
工藤 智行

商品詳細を見る
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。