mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2008年12月 来月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

2008年12月01日(月) [n年日記]

#1 Talk集中

IBISの影響か, ここの所トークの連続。12/3はKさん, 今日は岡野原君が 13:15から3時間くらい!話してくれました。色々意見も出て, みんな鋭いなあというか, よかったような気がします。 個人的にはツリー上の回帰は平衡木でない場合は, Length biasと同じ問題 が生じるということにコメントして気付きました。

11月の後半は電通大の 脇さん, 厚木の音声の 亀岡さん @ベイズ勉強会, TTI Chicagoの Livescuさん と, 凄い人が次々とCS研で話してくれました。


2008年12月12日(金) [n年日記]

#1 NTT JTeX: 温故知新

NL研の準備でしばらくWeb日記を書く時間はないと思うので, 技術的なネタを 少し。

一般的に使われているTeXがASCIIの platex になってから後, platex のデフォルトの文書デザインが悪すぎなのがずっと気になっていた。 具体的には, \sectionや\subsection等のフォントがやたら大きく, また上下に 無意味にスペースが空いてしまう (下の左と中を比較のこと)。
また, 普通に \documentstyle[a4paper] とすると, 下の一番右のようにやたら幅が狭く なってしまい, \textwidth等をいちいち自分で設定しなければならない。[a4j]を 使うと中のように横幅に関しては改善されるが, フォントの問題は直らない。

学部生の時は大学のデフォルトがNTT JLaTeXで, 家でもEPSONのPC98にDOS Extender版の NTT-JTeX on MSDOS を入れて使っていたのですが *1 , その時はこんなことはなく, 文書のデザインはスマートでとても気に入っていた。
ATRに入った時は, ATRはNTTの兄弟機関なので皆, (今下の階にいる磯崎さんが開発した)NTT JLaTeXを使っているのかと思ったら全然 そんなことはなく, みんなASCII pLaTeX を使っていたわけですが(w (CS研でも同じだった), 普段ちょっとした文章を作る時に一々\sectionや\subsection を再定義するのは嫌なので, 何とかならないかとずっと思っていた。

NTT JLaTeXplatex a4jplatex a4paper

ハッと気がついたのですが, NTT JLaTeXのデザインを使うにはスタイルがそうで あればよく, 別にNTT jlatex自体を入れる必要はない (NTT JTeXはフォント等の システムが異なっている上, 開発が止まっているので, 今使うのは躊躇がある)。
調べてみると, NTT JTeXの jarticle.cls 等は, JTeXの置いてある千葉大の ftp://ftp.math.s.chiba-u.ac.jp/tex/ の中の texfam-1.4 にある texfam-texmf-j2.1.tar.gz に含まれている模様。 このファイルを展開した後, texmf/tex/jlatex/base を $TEXINPUTS の指定している 適当なディレクトリにコピーして, mktexlsr を実行しておけばこちらが先に使われる。 具体的には, 僕の場合は

% cp -r texmf/tex/jlatex/base ~/share/texmf/inputs/ntt/
として, ~/share/texmf/inputs/ で mktexlsr . を実行しておくと, 上の左のように jarticle が何も指定しなくても瀟洒なNTT版のデザインになります。素晴らしい。

・ ecl

NTTネタをもう一つ。
TeXにPostscriptの画像を貼り込む時, 以前は eclepsf.sty というファイルを 文書オプションで指定して, \epsfile{file=image.eps} のようにして使うのが普通 でした。
この "eclepsf" (えくれぴーえすえふ?) という名前は何だろう, とずっと思って いて, 稲妻(eclaire)と関係あるんだろうか.. と思っていたのですが, 最近これは「ECL Encapsurated Postscript file」の略だということに ハッと気が付いた。

"ECL"という名前は学部生の頃から何度か目にしたことはあったものの, http://www.ecl.ntt.co.jp/ は内部向けのサイトで外からは見れないため *2 , 何のことか全く分からなかった。 正解はNTTの電気通信研究所(通研)のことで, CS研のドメインの "kecl.ntt.co.jp" とは 「関西ECL」または「京都ECL」のことなのだと思う。ちなみに, eclepsf.sty の中を 見ると磯崎さんの名前が入っていたりして愉快です。
わかりにく杉ですよパパン..。(笑)


*1: ちなみに, 漢字Talk7のMac上で動く Mac MiNT というUnix環境上でも, Nemacs 3.3.2+NTT JTeX を使っていました。
*2: 実際には, NTTのR&D研究者のポータルサイトです。

2008年12月28日() [n年日記]

#1 logging

学習プログラムを動かす際に, パラメータ設定その他が後で わからなくなってしまうことがあるので(注: 自然言語処理はデータ量が多いので, 学習は通常数時間から数10時間かかる), それら+αの記録のために, logging というクラスを定義しておくことを 思いついた。 *1
class logging {
        logging (char *argv[], char *file);
        ~logging ();
};
のようなクラスを定義しておくと, mainで
#include "log.h"
int main (int argc, char *argv[])
{
	while ((c = getopt(argc, argv, opts)) != -1)
		何とか..
	logging start (argv, model);
	学習本体;
}
のようにするだけで, model.log にコンストラクタでargv,起動時刻,ホスト名 *2 などの情報が 書き込まれ, デストラクタで終了時刻が自動的に記録される。以下のような感じ。
init   : ./spylm -n 1 -e 1e-8 -a 4 -b 1 -N 2 ../data/genji.txt genji.model
host   : samurai5.cslab.kecl.ntt.co.jp
start  : Mon Dec 29 00:06:56 2008
--------
iter[0] char height = 9
iter[0] char height = 9
--------
finish : Mon Dec 29 00:10:39 2008
start というのはただの名前ですが, こうやって使うといかにも記録をスタート したかのように見えると思います。
logging.cpp の中身は大体こんな感じ。
#include <cstdio>
#include <cstdlib>
#include <cstdarg>
#include <unistd.h>
#include <ctime>

static FILE *lp = NULL;

logging::logging (char *argv[], char *file)
{
        char *s, hostname[BUFSIZ];
        time_t timer;

        if ((lp = fopen (strconcat(file, ".log"), "w")) == NULL)
        {
                perror("fopen");
                exit(1);
        }
        time(&timer);
        gethostname(hostname, BUFSIZ);

        fprintf(lp, "init   :");
        while (s = *argv++) fprintf(lp, " %s", s);
        fprintf(lp, "\n");
        fprintf(lp, "host   : %s\n", hostname);
        fprintf(lp, "start  : %s", ctime(&timer));
        fprintf(lp, "--------\n");
        fflush(lp);
}

logging::~logging ()
{
        time_t timer;
        time(&timer);
        
        fprintf(lp, "--------\n");
        fprintf(lp, "finish : %s", ctime(&timer));
        fclose(lp);
}

void
init_log ()
{
        if ((lp = fopen (DEFAULT_LOG_FILE, "w")) == NULL)
        {
                perror("fopen");
                exit(1);
        }
}

int
lprintf (const char *fmt, ...)
{
        int n;
        va_list ap;
        
        if (lp == NULL) init_log ();
        va_start(ap, fmt);
        n = vfprintf(lp, fmt, ap);
        va_end(ap);
        fflush(lp);
        return n;
}

中で lprintf() という関数を定義してあるので, これを使うと他の情報もログファイルに自動的に書き込める。 学習の途中で尤度等を記録しておくのによさげです。
もしかするとこういうテクは既に知られているのかも知れないですが, lprintf()みたいなものを絡めたものは多分ないと思うので, 書いてみました。


*1: 調べると似たようなものはあるようですが, ここでは最小限のもの, という感じです。
*2: 計算が長いと, この計算をどのサーバで行っているのかわからなくなったりします。 これまではノートや, テキストファイルに書いておくというローテクなことをして いました。;

3 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project