たつをの ChangeLog : 2010-08-13

Wikipedia によると早産とは「妊娠22週-37週未満の分娩」のこと。
そして、「妊娠22週-37週未満で規則的な子宮収縮、少量の性器出血、水様帯下などを自覚した場合は切迫早産である可能性がある」とのことです。

つまり切迫早産とは、まだ産まれる時期じゃないのに産まれそうになっちゃう状態のことで、早産になる可能性の高い状態なのです。

切迫早産の症状の一つが子宮収縮(お腹の張り)。
妻は7月頭ごろからお腹がよく張っており、そのころから医師の指示により自宅で安静にしていました。なるべく立ち仕事は控えて、お腹の張りを抑える薬(ウテメリン)を飲んで、ゆったりごろごろと過ごしていました(とはいえ、ときどき気分転換に散歩などのちょっとしたお出かけはしていました)。

6週間ほどなんとか安静にすごしてきたのですが、ついに今朝の定期健診で「2週間弱の入院」との判断が下されました(比較的安心に産める「37週」に入るまであと2週間弱なのです)。

病室

本来ならもっと早い段階で入院となっていたのですが、妻が自宅安静をがんばって継続してくれたので最低限の入院期間で済みそうです。
先生からは「今までよくもたせましたね」とのお言葉を頂きました。
家に居ても思う存分家事ができずストレスがたまりがちだったろう妻も、これでしばらくは(強制的ながら)ゆったりと過ごせるかと。

入院中はウテメリン(ルオテニン)の点滴を24時間行います。
今までは1日4回飲んでいた薬が常に体に注入されるので、がっつりとお腹の張りが抑えられてるみたいです。



あとはモニターで心音とお腹の張りのチェックを行います。これは24時間ではないですが。

私は当面、平日は毎日病院に寄ってから帰る生活になります。
それもまた変化があって良いかと。

§

切迫早産といっても赤ちゃんが早く出たがっているだけで特に体調は悪くなく、そこらへんは安心です。
各方面からご心配頂きました。
この場を借りて感謝いたします。
ありがとうございます!

インデックスを使った指定行取り出しプログラム[2010-08-10-1]
についての記事を先日公開した。
そのプログラムを作成した動機の一つが
「リードオンリーのテキストファイル(それもメモリに読み込むのがうんざりするくらいに巨大なやつ)からランダムに複数の行を取り出したい」
というもの。

この記事ではランダム複数行取り出しタスクについて、先日の記事[2010-08-10-1]に沿って先頭から走査する方法とインデックスを用いた方法を紹介する。

頭から操作する方法


ランダムに一行だけ取り出すには定番の方法がある。
詳しくは[2004-11-30-5]を参照のこと。
エッセンスだけ一行で書くとこんな感じ:
rand($.) < 1 && ($line = $_) while <>;

複数行を取り出すのも同じようにできそうなんだけど分からない(未調査)。

なのでここではファイルの頭から走査するナイーブな方法で実装。
@lns に取り出したい行番号リストが格納される。

■コード(getlines-naive.pl):
#!/usr/bin/perl
use strict;
use warnings;
my $num = shift @ARGV;
my $tgtfn = shift @ARGV;

open(my $fh, "<", $tgtfn) or die;

while (<$fh>) { }
my $line_max = $.;
die if $line_max < $num;

my @lns;
my %seen;
for (my $i = 0; $i < $num; $i++) {
    do {
        $lns[$i] = int(rand($line_max));
    } while (defined $seen{$lns[$i]});
    $seen{$lns[$i]} = 1;
}

seek $fh, 0, 0;
$. = 0;
my @res = ();
while (<$fh>) {
    for (my $i = 0; $i < $num; $i++) {
        next if $. != $lns[$i] + 1;
        $res[$i] = $_;
        last;
    }
}

close $fh;

print @res;

以下、小さいファイルでの実行例。
第一引数は取り出したい行の数。

■実行例:
% cat test.dic
Japan
Tokyo
Yokohama
This is a pen
Hello World
% ./getlines-naive.pl 3 test.dic
Tokyo
This is a pen
Yokohama
% ./getlines-naive.pl 3 test.dic
Yokohama
Tokyo
Hello World
% ./getlines-naive.pl 3 test.dic
Japan
This is a pen
Yokohama

行番号をランダムに生成するには事前に全体の行数を知る必要があるため最初に一回走査する。

何度も呼び出すことを考えるとちょっとわずらわしい。
走査する時点でインデックス作っちゃった方がいいし。

インデックスを使う方法


ということでインデックスを使う。
前回の記事と同じく mkidx.pl [2010-08-10-1]で作成。

■コード(mkidx.pl):
#!/usr/bin/perl
use strict;
use warnings;
my $ip = 0;
while (<>) {
    print pack("N", $ip);
    $ip += length($_);
}

行数はインデックスファイルのサイズで分かるので、あとはランダムに行番号を選んで指定行取り出しを行うだけ。

■コード(getlines.pl):
#!/usr/bin/perl
use strict;
use warnings;

my $len_of_N = 4;

my $num = shift @ARGV;
my $tgtfn = shift @ARGV;
my $idxfn = shift @ARGV || $tgtfn.".ary";

my $tfsz = -s $tgtfn;
my $ifsz = -s $idxfn;
my $line_max = $ifsz / $len_of_N;
die if $line_max < $num;

my @lns;
my %seen;
for (my $i = 0; $i < $num; $i++) {
    do {
        $lns[$i] = int(rand($line_max));
    } while (defined $seen{$lns[$i]});
    $seen{$lns[$i]} = 1;
}

open(my $fi, "<", $idxfn) or die;
open(my $fh, "<", $tgtfn) or die;

my @res = ();
for (my $i = 0; $i < $num; $i++) {
    my ($ixf, $len) = get_info($fi, $lns[$i]);
    my $str = get_string($fh, $ixf, $len);
    $res[$i] = $str;
}

close $fi;
close $fh;

print @res;

sub get_info {
    my ($fh, $qidx) = @_;
    my $buf = "";
    seek $fi, $qidx * $len_of_N, 0;
    read $fi, $buf, $len_of_N;
    my $ixf = unpack("N", $buf);
    my $ixt = (tell $fi < $ifsz) ? do {
        read $fi, $buf, $len_of_N;
        unpack("N", $buf);
    } : $tfsz;
    return ($ixf, $ixt-$ixf);
}

sub get_string {
    my ($fh, $ixf, $len) = @_;
    my $buf = "";
    seek $fh, $ixf, 0;
    read $fh, $buf, $len;
    return $buf;
}

以下、小さいファイルでの実行例。
getlines.pl の第一引数は取り出したい行の数。

■実行例:
% cat test.dic
Japan
Tokyo
Yokohama
This is a pen
Hello World
% ./mkidx.pl test.dic > test.dic.ary
% ./getlines.pl 3 test.dic
Hello World
Yokohama
Japan
% ./getlines.pl 3 test.dic
This is a pen
Tokyo
Japan
% ./getlines.pl 3 test.dic
Tokyo
Japan
Yokohama

速度比較


速度の差は前回のタスクと同じなので割愛。
理論的には O(N) と O(logN) の差。

関連記事


- [を] インデックスを使った指定行取り出しプログラム(Pure Perl)[2010-08-10-1]
(前回のタスク)
- [を] chalowの記事をランダムに取り出して表示[2004-11-30-5]
(ランダムに1行だけ取り出す手法の解説あり)
この記事に言及しているこのブログ内の記事

今週の平日のランチ。
自分用メモ。

■8/9(月) うどん

軽くうどんでした。

■8/10(火) つけ麺

六本木に三田製麺所ができていたのでつけ麺を食べました。
100810 三田製麺所(六本木)でつけ麺

■8/11(水) お弁当

社内売り弁当。400円のかつ丼。
100811 かつ丼弁当400円

■8/12(木) つけ麺

ばくだん屋で廣島風つけ麺。
100812 ばくだん屋でつけ麺

■8/13(金) ラーメン

一蘭でちゅるりとラーメンでした。
100813 一蘭でラーメン

たつをの ChangeLog
Powered by chalow