2017年11月11日土曜日

PAD図を描くツール PadTools がすごい

 構造型プログラミングを学ぶとき、処理の流れを図示して整理するために、フローチャートなどといったダイアグラムをよく書きます。

 このときに用いる作図ツールとしては dia が有名で、フローチャートやUMLの一部のダイアグラムは、これがあれば何とか作図出来るのですが、PAD (Problem Analysis Diagram, プログラム構造表記法) については、どうもdiaのテンプレートが見当たりません。SDL (Specification and Description Language) はあるのですが、PADは国産だし、しょうがないかな、と思っていました。

 ところが、PadTools なるPAD作図ソフトウェアがあるじゃないですか。しかもJavaで。

PadTools 1.2
http://naou.cool-ex.com/padtools/

 このツールの素晴らしいところは、PAD図を書くために、SPD (Simple PAD Description) 文というものを書かせるんです。 これ、疑似コードにとても近い存在なんですよね。ということは、このツールでPADが書ける=処理の流れが書ける=プログラミングも出来る、はず、という素晴らしい連携が期待出来るわけです。

 但し構造化プログラミング向けなので、オブジェクト指向プログラミングの場合は素直にUMLを使うことを考えた方が良いでしょう。関数型プログラミングの場合は…もしかして図から入ることがない、のかな? 

というわけで PadTools おすすめです。Package化したい。

2017年10月1日日曜日

BSD date で日付文字列を書き換える

BSD date コマンドでは、オプション -j を付け、-f と + のオプションを使うことで、OSの日付を設定することなく、日付文字列を書き換えることが出来ますね。(LANG=C が前提です。)

% date
Sun Oct  1 00:08:38 JST 2017
% date -j -f "%a %b %d %T %Z %Y" "`date`" "+%y%m%d%H"
17100100

で、FreeBSD snapshot manager を使っていると、zfs のスナップショットを世代番号で作ってくれるのですが、何時のものなのかが、ちょっとわかりにくい。実際は、こう書けば日付が出てくるわけです。

% zfs get creation zfspool/home@daily.0
NAME                  PROPERTY  VALUE                  SOURCE
zfspool/home@daily.0  creation  Sun Oct  1  0:00 2017  -
% zfs get -H -o value creation zfspool/home@daily.0
Sun Oct  1  0:00 2017
% zfs get -H -o value creation zfspool/home@daily.1
Sat Sep 30  0:00 2017

ってことは、

% date -j -f "%a %b %d %T %Y" "`zfs get -H -o value creation zfspool/home@daily.0`"+%y%m%d%H"
17100100
% date -j -f "%a %b %d %T %Y" "`zfs get -H -o value creation zfspool/home@daily.1`"+%y%m%d%H"
17093000

なんて具合に日付文字列を取り出せるわけです。FreeBSD snapshot manager と zfs send で差分バックアップしたい、でもファイル名をどうしたらいいか分からない、と悩んでいたんですが、これで何とかなりそう。

ちなみにLANGがC以外だと…

% setenv LANG ja_JP.UTF-8
% date
2017年 10月 1日 日曜日 00時23分52秒 JST
% date -j -f "%a %b %d %T %Z %Y" "`date`" "+%y%m%d%H"
Failed conversion of ``2017年 10月 1日 日曜日 00時23分54秒 JST'' using format ``%a %b %d %T %Z %Y''
date: illegal time format
usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
            [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]

% setenv LANG C
% date
Sun Oct  1 00:24:06 JST 2017
% date -j -f "%a %b %d %T %Z %Y" "`date`" "+%y%m%d%H"
17100100

まあ、こんなもんです。

2017年9月30日土曜日

fopen_s() を fopen() で書き直す?

逆はあるんですけどね。
fopen_sとかsscanf_sとかの"_s"関数書き換え例まとめ
http://blog.livedoor.jp/mrcom511/archives/51270788.html

この例だと fopen() を fopen_s() に書き換えてますが、逆はこんな感じでしょうか?

#include<stdio.h>
#include<errno.h>       /* to rewrite fopen_s() as fopen() */
#include<string.h>      /* strerror() */

int main()
{
        int ferrno = 0;
        FILE *fp = NULL;

/*
ferrno=fopen_s(&fp,\"testfile.txt\",\"r\");
*/

        errno = 0;
        fp = fopen(\"testfile.txt\", \"r\");
        ferrno = errno;

/* print some variables */

        printf(\"ferrno: %d fp: %p strerror: %s \\n\", ferrno, fp,
               strerror(ferrno));

        if (fp != NULL) {
                fclose(fp);
        }

        return 1;
}

ferrno なんて使わないし、って場合は errno.h を読まずに捨ててしまえばいいだけ、かな?

2017年6月5日月曜日

e2psのpatchを作ってみた

日本語を含むテキストファイルを PostScript形式に変換するプログラムの一つに、 e2ps があります。LinuxのディストリビューションやFreeBSDなどにもパッケージがあったりしますね。

オリジナル: http://wtpage.info/wtseries/unix.html#e2ps
Debian: https://packages.debian.org/ja/stretch/e2ps
FreeBSD: http://www.freshports.org/japanese/e2ps/

で、色々あってこれを使ってみたのですが、どうにも動きがおかしい。
というわけで patch を作ってみたわけです。
https://gist.github.com/taraijpn/ea10ff9e908befafab7cff719f26dd20

どれくらい需要があるのか分かりませんが、とりあえず公開しておきます。

何がおかしかったかは以下の通り。

1)出力ページ枚数のカウントがおかしい。
2ページ以上になっても「One page was outputed」になる。1ページのときは「 1 pages were outputed.」って何故に複数形??

2)複数ページを出力するPostScriptなのに、何故かEPSだと言い張る。
おかげで psset に出来上がったファイルを渡すと、(pssetが内部で呼んでいる) fixpsから「fixps: DSC broken.  gs will be asked a full rewrite of the file.」と言われ、正しいPostScriptと認識されず、きちんと動かない。

3)内部で持っている用紙のサイズ(ポイント数)がおかしい。
なんでこんな数値にしたんだろう。複数面付けするときの計算の事情?

4)オリジナルのソースコードで何故かコンパイルが通らない(うちでだけ?)
ps-font.c に、gsFonts という静的配列の宣言があるのですが、さすがにこれはコンパイル通らないんじゃあ……でもFreeBSD portsmonでは何故かビルド出来てる……何故だ……
http://portsmon.freebsd.org/portoverview.py?category=japanese&portname=e2ps
※FreeBSDの ports では、ps-font.c の内容を修正するための sed コマンドが Makefile 側に書かれていました。どおりで files/ の中を見ても分からないわけだよ!
buildしたログで気づきました orz

===>  Patching for ja-e2ps-4.34
===>  Applying FreeBSD patches for ja-e2ps-4.34
/usr/bin/sed -i.bak -e '/Times-Roman$/,/^Gothic-Medium.Katakana$/{s,$,\\,;}' /usr/ports/japanese/e2ps/work/e2ps-4.34/ps-font.c


続き:https://taraijpn.blogspot.com/2019/05/e2ps.html