FreeBSD 8.3-RELEASE Announced2012年04月19日 12時30分03秒

FreeBSD 8.3-RELEASE が発表された。今回は、8 系の三つ目だったので、遅れはしたが当初の予定から一ヵ月ぐらいだろうか。いつ出るのか検討もつかないと言う程ではなかった。

まだ、試してはいないのだが、graid のサポートは geom のメーリングリストで、ZFS 28 のサポートはその他のあちこちで活発に投稿されていたのを覚えている。graid は面白そうだとは思ったものの、そんなにディスクを持っていないので、結局使ってはいない。その他の機能の細かいことは他で紹介されるだろう。

8.3 BETA の頃から試していて、良かったのが 8.2 からの互換性。新しい RELEASE に移るときは、同じ系列から出ていても、ハードウェアや一部のソフトウェアに動作の違いや、不具合、微妙な挙動の違いが見られて更新にためらう時もあるのだが、8.2 から 8.3 は目に付いたのは一つもなかった。時間が取れ次第本格的に更新したいと思う。とは言ったものの、各々の環境依存なので、鵜呑みにして更新することなかれ。

awk で sub 関数で適合した文字列を取得2012年04月03日 10時56分30秒

awk でも、sed などの用にパターンに適合した文字列を取得できる。ちょっと厄介なのが、その説明が man に載っていないので、思い出せない時に、その構文を捜し出すのが大変な点だ。

sub 関数の中で、& を使うと、パターンに適合した取り出せる。


% nawk 'BEGIN{ str = "daabaaa"; sub(/a+/, "c&c", str); print str}'
dcaacbaaa

このことは、Gawk: Effective AWK Programming に記載されていて、9.1.3 String-Manipulation Functions に載っている。 組み込み関数でも、日本語訳が掲載されていた。

この例では`dcaacbaaa'が出力される。これは`&'は非文字定数として扱われ、"最左最長"の規則に従っている為である。 (セクション How Much Text Matches?を参照)。 スペシャルキャラクタ(`&')の効果はその前にバックスラッシュを付けることによって抑制することができる。例によって、文字列中に一つのバックスラッシュを入れるためにはバックスラッシュを二つ続けて書かなければならない。従って、置換文字列中に`&'という文字を含ませるには`\\&'と記述する。次に挙げる例は各行で最初に現れる`|'を`&'で置き換える。
ただ、この日本語訳のページの daabaaa の例の正規表現は間違っていて、正しい結果は出ない。GNU のサイトのものは正しく修正されている。

8.3-RELEASE も間近な様だ2012年03月30日 12時06分44秒

FreeBSD 9.0-RELEASE は遅れに遅れたが、8.3-RELEASE は若干の遅れはあるものの順調に進んでいる様だ。

スケジュールは更新されていないのだが RC2 は既に一週間前になっていて、特にリリースに向けての既知の問題やコミット待ちも無いようだ。リリースの細かい動きが、外部の者には分りづらい。CVS/SVN のメーリングリストが一番かつ最も早い情報元だ。どうも、8.3 の準備も最終段階に入ったらしい。

8.2-RELEASE からの更新してからも、個人的には不具合や問題点などは一つも当たっていない。むしろ、幾つかの変更点で気に入った部分があった。7 系から 8.2 に上げるときは、半年くらい様子を見ていたが、今回はすぐに 8.3 に上げる事になるだろう。

OS のベースアップも一つだが、ports を更新していなくてだいぶ古くなっている。また、機械も古い機種なのでもう自らコンパイルする余力もあまり無いので、8.3 の package の公開が待ち遠しい。

大量のファイルを同時に圧縮する2012年03月25日 11時43分36秒

時折、大量のファイルを圧縮することがある。一つずつのファイルの大きさは、数 MB から数 GB まで、多種多様。そんなファイルが数百にも上る。Solaris など、特にコア数が多いホスト上の時は、手っ取り早く並列処理したい。CPU リソースは余っている事が多いので、100 以上あるコアのうち、20、30 ぐらい使ったところで気がつく人はほとんどおらず、苦情も来ない。Solaris ほどコアの数があると、CPU を全てしっかり使い切るのは結構難しい。とは言ったものの nice 20 で処理しても、流石に一人で全ての CPU を 100% 使うのは気が引ける。

実は、大きさの異なる仕事を並列的に処理するスクリプトを書くのはとても難しい。シェルスクリプトを筆頭に、特定の数だけ並列化するライブラリがない。そうなると、自分で子プロセスを生成し、管理することになる。それに、各々の仕事量が異なっているので、仕事の割り振りも工夫が必要になる。一つだけ、大きい仕事ばかり抱えて、他のプロセスが直ぐに終わってしまったのでは、効果が下がる。そう考えていくと、ささっと書いて使い捨てられるほど、簡単にはいかない。

いくつかそのようなスクリプトの尻拭いをしなければいけないことがあったが、どれも醜いものだった。コード数が不必要に長い。余計な処理ばかり増えて、本題の作業効率が余り上がっていない。負荷が偏っていて、無駄が多い。どれも一生懸命、書いたのは見て取れるのだが、直す人の気苦労などまったくわかっちゃいない。

実は、その様に百行から数百行にわたる、たった一行のプログラムで並列処理の仕事配分をしてくれるプログラムがある。その名も make。make だけだとちょっと扱いづらいので awk も当てる。

残念ながら、make にコマンドラインから直接 make ルールを打ち込む人たち等は見たことがない。make をシェルスクリプトの様に、手順を追って書く人たちや、make に依存関係の処理を任せれば簡単なのに、スクリプトで難解な発明をし、四苦八苦している人たちはよく見かけるが。

さて、愚痴と能書きが多くなったがさて本題。make での古いやつだと並列処理が出来ないものもあるので、GNU make や BSD make など若干新しいものが必要になる。


% cat bzip20
#!/bin/sh

exec $* | \
  nawk 'BEGIN{ print "ALL:" }
    { print $1 ".bz2 : " $1;
    print "\tbzip2 " $1;
    print "ALL : " $1 ".bz2" }' | \
  gmake -j 20 -f -
% bzip20 "ls *.txt"
% bzip20 "find . -name '*.log'"

exec を通して、ファイルを探し、それらのファイルを圧縮するターゲットを作る。ALL を一番最初にしているので、全てが圧縮される。exec を通しているので、圧縮順を気にせず適当に渡したり、逆に大きさ順に並べて、極力処理が偏らないように出来る。

御手洗いに興味を2012年03月18日 11時41分20秒

最近、二歳と三ヵ月の娘が御手洗いに興味を持ち始めた。特に、入浴前に服を脱いだ後に、「ぴっぴ」といって便座に座りたがる。

幼児用の補助便座は随分前から用意してあるのだが、使いたがらない。座るときは、手を貸しても怒られてしまう。踏台こそ使いはするが、自分で座らないといけないようだ。まだまだ、お尻が小さいので、到底座ることができない。そこで、両手で便座のわきを押さえつつ、お尻を浮かせる状態になる。二歳とはいえ結構力があるみたいで、自分で支えている。手を貸そうものなら、また怒られてしまう。まだまだ、座るだけの時も多いのだが、おならをした後、「おわり」といって満足して下りることも増えてきた。

そんなわけでおむつは欠かせない。おむつ自体は玩具としても好きなようで、よく自分のお人形達にも履かせている。最近は、取り換えるときに逃げたり、嫌だと拒否することも増えてきたので、おむつの交換は大変になってきた。

動的ライブラリのパスを指定する環境変数2012年02月18日 14時35分50秒

UNIX の動的ライブラリがある場所を指定する環境変数の名前はシステムによって色々と違う。中には同じものを用いるシステムもある。さて、わざわざシステムに依って変数の条件分けをしなくていいと喜ぶべきなのか、システム固有値のみを設定すべきなのか。中途半端な違いが悩みの種だ。

LD_LIBRARY_PATH 派

  • Solaris
  • FreeBSD
  • NetBSD
  • OpenBSD
  • Linux

LIBPATH 派

  • AIX

SHLIB_PATH 派

  • HP-UX

DYLD_LIBRARY_PATH 派

  • MacOS X

コンパイラオプションの対比表2012年02月15日 20時35分35秒

C/C++ コンパイラの各種オプションのアーキテクチャ毎の対比が C/C++ Comparison tables に良くまとめられている。サポートをするアーキテクチャが増えてくると、個々のコンパイラのオプション時折こんがらがるので、便利に使っている。

AIX 上での readdir_r は戻り値が若干違う2012年02月10日 20時41分28秒

他のシステムでは問題なく動いているのだが、AIX でのみ問題が起きる現象があったので調べた。AIX では全てのディレクトリを読み終わった時に、readdir_r が 9 を返すのが原因だった。

以下の様に、戻り値が 0 でない時に、処理を中断するようにしてあった。目的のファイルが存在するかを調べるため、ディレクトリを調べているコードだった。


    struct dirent* ent;
    ret = readdir_r(path, (struct dirent*)buf, &ent);

    if (ret != 0)
        return false;

そこで、愚直に直せば以下の形になる。

    struct dirent* ent;
    ret = readdir_r(path, (struct dirent*)buf, &ent);

#ifdef _AIX
    if (ret != 0 || ret != 9)
#else
    if (ret != 0)
#endif
        return false;

readdir_ も他のシステムコールや多々の標準関数の様に errno を設定する。各種システムの man readdir_r を読み比べると、どのシステムでも、正しく読めた場合は第三引数にポインタを設定するらしい。そして、ファイルの終端に付いたときは、AIX を含めてエラーではないため、errno を変更せず、そして、第三引数に NULL を設定するらしい。そこで、errno を調べれば、AIX の 9 の点検が必要なくなる。


    struct dirent* ent;
    errno = 0;
    ret = readdir_r(path, (struct dirent*)buf, &ent);

    if(errno != 0 && env == NULL)
        return false;

上記の例では、一応 env も調べるようにしている。

以下、 AIX の man readdir_r より抜粋。

Return Values
0 Indicates that the subroutine was successful.
9 Indicates that the subroutine was not successful or that the end of the directory was reached. If the user has set the environment variable XPG_SUS_ENV=ON prior to execution of the process, then the SIGXFSZ signal is posted to the process when exceeding the process' file size limit, and the subroutine will always be successful.

Error Codes
If the readdir_r subroutine is unsuccessful, the errno global variable is set to one of the following values:

FreeBSD 8.3-RELEASE の予定表が提示された2012年02月07日 20時38分15秒

FreeBSD 8.3-RELEASE の予定表が提示された。現在時点の予定は以下の通り。
The summary of the target dates is:

Code Freeze:    Feb 15, 2012 
BETA1 builds:   Feb 17, 2012 
RC1 builds:     Mar  2, 2012 
RC2 builds:     Mar 16, 2012 
REL builds:     Mar 23, 2012 

そして、8.2-RELEASE のサポートが七月の末までサポート。そして、8.3-RELEASE が長期サポートの対象になる予定だそうだ。

The Security Officer has pushed back the estimated End of Life for 8.2-RELEASE to July 31, 2012. That will give three months between the release of 8.3-RELEASE and the EoL for 8.2-RELEASE. It is expected that 8.3-RELEASE will be an Extended Support release.

自転車がパンク2012年01月31日 13時58分13秒

自転車が実に八ヵ月振りにパンクした。新しい自転車を購入してからは初。今冬は暖冬で雪がほとんど降らなかったのも幸いだったのもある。タイヤもブランド物は、安物とは質が全然違うようだ。以前は一、二ヵ月毎でパンクして付け換えなければいけなかった。やっぱりパンクしないと楽だ。

実のところ、ここ一、二週間はパンクした後輪の空気が抜けるのが早くなっていた。これはチューブが古くなっていて、交換が必要な目印。そろそろだとは思っていた。

購入した自転車屋に持ち込み、同じく擦り減っていた前後のタイヤのブレーキも併せて交換。急ぎではないので、翌日に引き取りに行った。