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が書ける=処理の流れが書ける=プログラミングも出来る、はず、という素晴らしい連携が期待出来るわけです。逆に言うと、出来ないとつらい。

というわけで 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 を読まずに捨ててしまえばいいだけ、かな?