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

2016年10月22日土曜日

bash on ubuntu on Windows とMintty/wsltty

bash on ubuntu on Windows を日本語環境( ja_JP.UTF-8 ) で使いたいなら、Mintty/wsltty を使うと幸せかも知れません。という話。

Big Sky :: Bash on Ubuntu on Windows の最高の端末環境を教えてやるからちょっと来い。
http://mattn.kaoriya.net/software/bow/20160824234928.htm

で紹介されている内容が、今は
wsltty: https://github.com/mintty/wsltty
インストーラーを使うだけでほぼ出来上がりますので、導入がぐっと楽になっています。
動作比較はこんな感じ。



左下が Mintty/wsltty をインストールし、 Bash on UoW in Mintty を実行してvimを起動した場合。
右上は標準の端末からvimを起動した場合。どちらもVLゴシックをフォントに指定しています。
w3mでgoogleを見た場合と合わせてみると、Minttyのほうが日本語表示の崩れが少ないことが分かります。素晴らしい。



端末上で開いているemacsに、Windowsの日本語入力機能を用いて日本語を入力することもできます。テキストのコピペも出来そう?



さらに、sixel にも対応しているので、こんな表示も出来ますね。

( sixel については、『Sixel Graphicsを活用したアプリケーションの御紹介』


gnuplot 5.0.5 を ./configure --with-bitmap-terminals で make すると、terminal として sixel を選択出来るようになります。描画範囲の背景は白で塗りつぶさないようなので、端末背景は白ないし明るい色にしないと綺麗に見えないのがネックでしょうか。暗い背景だと線やラベルが見えません。



terminalに sixel がない場合は、libsixel 内にある img2sixel を用いて、png画像などを sixel で出力してやればよいでしょう。右側がその例なのですが、outputにコマンドを指定して、フィルタとして使う場合、 gnuplot が終了しないと標準出力に書き出されたsixel画像が表示されませんので、ちょっと不便かも知れません。

libsixel は、ubuntu 14.04LTS (trusty) ではパッケージ化されていないので、自力導入する必要があるのがやや面倒ですね。

sixel 対応は、Windows側でXサーバプログラムを用意するなど、いろいろ面倒な bash on UoW にとって、古くて新しい解決方法になってくれそうな気がします。

それにしても bash on Ubuntu on Windows, trusty のサポート期限が2019年までなので当分これでいくと思うんですが、次はどうするつもりなんだろう。 systemd 対応が立ちはだかってる気がするんだけど、なんとかするのかな。