GMT ver.5で日本語を表示する

あちこちのサイトにも書いてくれてますし、CookBook の 22.1. Using non-default fonts with GMT にも書かれているように

$GMT_dir/share/postscriptlight/PSL_custom_fonts.txt

というファイルに使いたいフォントを追記します。$GMT_dir というのはGMTをインストールしたディレクトリのことで、うちの環境では/usr/local/gmt5 というディレクトリになっています。多くのサイトでは、Ryumin-Light-UniJIS-UTF8-H と GothicBBB-Medium-UniJIS-UTF8-H の追記を紹介しているようです。ところが、先月GMTをインストールする際に同じようにしても日本語フォントが使えなくなるという大変困った事態を経験しました。

 色々試した結果、出力後のポストスクリプト画像ファイルをWindows10に持ってくるとちゃんと(?)代替フォントで表示されることが確認できました。また、古いUBUNTUの環境へ持ち込んでも、同じポストスクリプト画像ファイルで日本語フォントが表示できることもわかりました。どうやらGMTは正常に設定していたのですが、新しい環境のドキュメントビューアの日本語設定が不十分であったため、結果的に日本語が表示されなかったということのようです。

つまりGMTのnon-default なフォントというのは書き出す側の環境ではなく、表示する側の環境に依存しているようですね。ということで、こんなことを試してみました。

 

#	$Id: PSL_custom_fonts.txt 14657 2015-07-30 21:26:18Z pwessel $
#
#	Listing of additional PostScript fonts than those found on most PS printers.
#	Add your extra font information there.  This is the only required change as
#	far as GMT goes.  However, you most likely will have to modify GhostScript
#	font tables, place font files in certain system directories, and possibly
#	upload purchased fonts to a PostScript printer.  Search for help on how
#	to install new fonts on your particular system.
#
#	The fontheight below is the height of A for unit fontsize.
#	Encoded = 0 if we may reencode this font as needed.
#
#Fontname			Fontheight	Encoded

#Ryumin-Light-EUC-H              0.700           1
#Ryumin-Light-EUC-V              0.700           1
Ryumin-Light-UniJIS-UTF8-H              0.700           1
Ryumin-Light-UniJIS-UTF8-V              0.700           1
Ryumin-Light-RKSJ-H              0.700           1

#GothicBBB-Medium-EUC-H          0.700           1
#GothicBBB-Medium-EUC-V          0.700           1
GothicBBB-Medium-UniJIS-UTF8-H          0.700           1
GothicBBB-Medium-UniJIS-UTF8-V          0.700           1
GothicBBB-Medium-RKSJ-H          0.700           1

MS-Gothic-90ms-RKSJ-H	          0.700           1
MS-Mincho-90ms-RKSJ-H	          0.700           1

PSL_custom_fonts.txt の中身です。

最後のMS-Gothic-90ms-RKSJ-H と MS-Mincho-90ms-RKSJ-H は、いわゆるMSゴシックとMS明朝のことです。RKSJというのはローマ字-カタカナ-シフトJISの略なのだそうです。だからUTF8で日本語を流し込んでも文字化けします。私の場合は nkf -s を使ってsjisに変換しました。しかし、それでもまだubuntuのドキュメントビューアでは日本語表示できませんよ。だってubuntuにはマイクロソフト系のフォントは載ってませんから...。これをWindowsAdobe Illustrator で読み込んだものが下の画像です。

f:id:S_E_Hyphen:20190807095013j:plain

代替フォントを経由せずにMSゴシックやMS明朝を使えるようになりました。

私は余りこれを使おうとは思いませんが、WindowsGMTを使用しているユーザーさんには便利な機能かも知れませんね。

 

#!/bin/bash
psfile=font_tab.ps
gmt gmtset FONT_TITLE 16p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_LABEL 12p,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset FONT_ANNOT_PRIMARY 0.35c,GothicBBB-Medium-UniJIS-UTF8-H
gmt gmtset MAP_GRID_PEN_PRIMARY 0.5p,128/128/128

# 方眼紙の描画
title=`echo Japanese Charactars`
gmt psbasemap -JX15c/20c -R0/15/0/20 -BnSeW+t"$title" \
 -Bxa5g1+l"(cm)" -Bya5g1+l"(cm)" -P -K > $psfile
cat << + |\
 nkf -s |\
 gmt pstext -J -R -F+f+jLM+a0.0  -O >> $psfile
1.0 12.5 16p,MS-Mincho-90ms-RKSJ-H これはMS明朝です
1.0  7.5 18p,MS-Gothic-90ms-RKSJ-H これはMSゴシックです
+

 

祈り

本日2019年8月2日、INF条約が失効しました。テレビでは条約締結当時のレーガン米大統領ゴルバチョフソ連書記長の映像が何度も繰り返し放送されていました。

中高生だった私は、全世界同時核戦争の恐怖に怯えていました。そんな時代の終止符を打ってくれたのが1987年のINF(中距離核戦力全廃条約)だったと、私は認識しています。そして実際、以来30余年が経過した現代では局地戦ならともかく全世界核戦争なんて空想上の出来事のように感じられる世界が実現しています。

そんな役割を果たしてくれたINFが今日失効し、時計の針が逆戻りを始めようとしています。

f:id:S_E_Hyphen:20190802125933j:plain

この世界がいつまでも平和であることを心より祈ります。

 

為替相場の自動取得

米ドル建一時払い終身保険に加入しました。加入時の利率に応じた定期支払金を毎年米ドルで受け取ることとなります。

通常、銀行などで円をドルに両替してもらうにはTTSというレートを使用されます。しかし保険の場合、加入時はTTM+50銭というレートを使用してくれるので、若干有利です。

一方、毎年受け取った米ドルを日本円に両替する場合はTTBというレートが使われますので、日々のTTBの動きは把握しておきたいところです。

ということで、為替相場を自動的に取得しデータベースに登録するシェルスクリプトを作成してみました。TTM+50銭とTTM-50銭の値は 日本生命 のホームページから取得します。一方、TTSとTTBは 三菱UFJ銀行 のものを使用しました。

 

#!/bin/bash

mysql -h 192.168.0.16 life_log << _SQL_
 create table if not exists dollar(
  seq int primary key auto_increment,
  kind varchar(10),
  UpdateDate date,
  rate float,
  insertDate datetime,
  comment varchar(20)
 );
_SQL_
work=`test_day | head -1`
if [ $work = "OFF" ]
then
 echo `date` "市場は休みです"
 exit
fi

# ニッセイ指定通貨建積立利率変動型一時払終身保険(米ドル建・豪ドル建) 為替レートのダウンロード
wget https://va-dmn2.nissay.co.jp/vkhengaku/servlet/JP.co.nissay.KE8.KE8S007Z -O nissay.html
# MUFG外国為替相場一覧表のダウンロード
wget https://www.bk.mufg.jp/gdocs/kinri/list_j/kinri/kawase.html -O mufg.html

# 円入金特約用為替レート(TTM+50銭)
date=\
`w3m nissay.html |\
 sed -e "s/\*//g" |\
 sed -n '14p' |\
 awk '{print $1}' |\
 nkf -Z |\
 sed -e "s/年/\-/g" |\
 sed -e "s/月/\-/g" |\
 sed -e "s/日//g" `
rate=\
`w3m nissay.html |\
 sed -e "s/\*//g" |\
 sed -n '13p' |\
 awk '{print $2}' |\
 nkf -Z`
echo TTM+50 ${date} ${rate}
mysql -h 192.168.0.16 life_log << _SQL_
 insert into dollar(kind,UpdateDate,rate,insertDate)
    value("TTM+50","${date}","${rate}",now());
_SQL_

# 円支払特約用為替レート(TTM-50銭)
date=\
`w3m nissay.html |\
 sed -e "s/\*//g" |\
 sed -n '89p' |\
 awk '{print $1}' |\
 nkf -Z |\
 sed -e "s/年/\-/g" |\
 sed -e "s/月/\-/g" |\
 sed -e "s/日//g" `
rate=\
`w3m nissay.html |\
 sed -e "s/\*//g" |\
 sed -n '88p' |\
 awk '{print $2}' |\
 nkf -Z`
echo TTM-50 ${date} ${rate}
mysql -h 192.168.0.16 life_log << _SQL_
 insert into dollar(kind,UpdateDate,rate,insertDate)
    value("TTM-50","${date}","${rate}",now());
_SQL_

# 電信売り相場(TTS)
date=\
`w3m mufg.html |\
 sed -n '25p' |\
 nkf -Z |\
 awk -F":" '{print $2}'`
rate=\
`w3m mufg.html |\
 grep USD |\
 awk '{print $4}'`
echo TTS ${date} ${rate}
mysql -h 192.168.0.16 life_log << _SQL_
 insert into dollar(kind,UpdateDate,rate,insertDate)
    value("TTS","${date}","${rate}",now());
_SQL_

# 電信買い相場(TTB)
date=\
`w3m mufg.html |\
 sed -n '25p' |\
 nkf -Z |\
 awk -F":" '{print $2}'`
rate=\
`w3m mufg.html |\
 grep USD |\
 awk '{print $7}'`
echo TTB ${date} ${rate}
mysql -h 192.168.0.16 life_log << _SQL_
 insert into dollar(kind,UpdateDate,rate,insertDate)
    value("TTB","${date}","${rate}",now());
_SQL_

rm nissay.html mufg.html

 ニッセイのホームページからは、13行目と14行目あるいは88行目と89行目を取り出して加工するという方法で値を取り出しています。一方銀行のホームページも、日付は25行目のものを半角に変換(nkf -Z)して使用していますが、レートはUSDという文字列を含む行をgrep で検索して、第4フィールドと第7フィールドをawkで取得するという方法をとっています。

このシェルスクリプトを crontab に登録し、平日正午頃に実行することで日々の相場の値がmysqlに登録されるようになりました。

f:id:S_E_Hyphen:20190727150956j:plain

 

スマホのアドレス帳編集

最近交際範囲に変化が有ったことから、携帯電話のアドレス帳を抜本的に編集してみようと思いました。ドコモショップで教えてもらったデータコピーは本体のアドレス帳データをMicroSDカードに転送できるとのことでした。

そこで実際に試してみると、SD_PIM とcom.nttdocomo.android.sdcardbackup というフォルダの下に、どちらもPIM00001.VCFというファイルが作成されていました。拡張子vcfのファイルはvCardといって、結構あちこちのアドレス帳で使用されているファイル形式なのだそうです。後者のファイルを実際に開いてみると、下図のようなテキストファイルが現れました。ちなみにSD_PIM の下のPIM00001.VSFはSiftJIS形式でした。これについては試していません。

  f:id:S_E_Hyphen:20190726152137j:plain

BEGIN:VCARDという行で始まり、END:VCARDという行で終わる一連のデータが一人分のアドレスです。これが延々登録人数分続いているわけです。

テキスト形式ですからエディターで編集できますし、sedawkを使いこなせば特定のフィールドを自動的に加工することも可能です。なお実際には試していませんが、perlにはvCardに特化したライブラリが用意されているそうです。私はperlを使ったことがないので、下記のようなシェルスクリプトを作成してみました。

#!/bin/bash
# 変数nameにはアドレス帳の見出し欄の名前が入る
# 配列変数bodyにはnameに対応するvCardの各行が格納される
infile="PIM00001.VCF"
declare -a begin_a=(`\
 grep -n "BEGIN:VCARD" ${infile} |\
 awk -F":" '{print $1}' \
`)
declare -a end_a=(`\
 grep -n "END:VCARD" ${infile} |\
 awk -F":" '{print $1}' \
`)

for (( seq=1; seq<=${#end_a[@]}; seq++ ))
do
 seq1=`expr $seq - 1`
 BEGIN=${begin_a[${seq1}]}
 END=${end_a[${seq1}]}

 name=`cat $infile |\
  sed -n ${BEGIN},${END}'p' |\
  grep "^N;" |\
  awk -F"[;:]" '{print $3}'`

 declare -a body=(\
 `cat $infile |\
  sed -n ${BEGIN},${END}'p'` \
 )

 echo $seq ${name}

 for (( i=0; i<${#body[@]}; i++ ))
 do
  echo $seq ${body[$i]}
 done

done

上記のシェルスクリプトでは、vCardを登録人数分に切り分けて名前(変数$name)を表示します。最初に配列変数 ${begin_a} と ${end_a} を定義した時点で、そのファイルのBEGIN:VCARDとEND:VCARDが何行目なのか全て把握しているため、変数$seqに任意の数字を指定するだけで、N枚目のアドレスを抽出できるようになっています。

ところで、実際にアドレス編集を行うにあたっては「グループ」の扱いが厄介そうです。X-GNO、X-GN、X-DCM-GN-ORIGINLの各フィールドが、それぞれ整合していないとエラーになってしまいます。しかもX-GNOは携帯電話でグループの並び替えをする都度値が変化してしまいます。

また、固定電話はTEL;VOICE:というフィールドなのですが、FAXの場合はTEL;WORK;FAX:というフィールドと X-DCM-TEL-ORIGINAL;WORK;FAX: フィールドが一致していないと認識してもらえないという冗長な構造になっているようです。

いずれにしても、大切なアドレス帳を壊してしまいかねませんので、編集の過程を頻繁に別メディアへ保存しておくなどして作業は慎重に行うようにしましょう。

編集後、再度データコピーアプリの復元機能を使用すると、編集結果が携帯電話本体のアドレス帳に反映されます。このとき、SD_PIMの下の同じ名前のファイルが残存しているとバージョン管理が面倒くさいことになりそうですので、別メディアにバックアップしたうえで削除しておいた方が良さそうです。

GMT ver5がダウンロードできない

GMT5.4.1をインストール  の手順で新しいPCにGMTをインストールしようとしたのですが、ハワイ大学 のサイトにアクセス出来ないためダウンロードできなくなっていました。ちなみに、GMT4のサイト には入れるのですけどね…。

しかたがないので探し回った挙句、下記のミラーサイトを発見しました。

http://gmt.mirror.ac.za/

f:id:S_E_Hyphen:20190723141907p:plain

ミラーサイトのツリー構造

ここから、gmt-5.4.1-src.tar.gzとgshhg-gmt-2.3.7.tar.gz、dcw-gmt-1.1.4.tar.gzをダウンロードしました。ちなみに gmt-5.4.1-src.tar.gz は legacy/ フォルダーの下に有ります。

余談ですが、2019年7月からgmt6がリリースされているようですね。

 

あと、ライブラリ(パッケージ)はしっかりインストールしておかないといけません。私の場合は、apt を使って libxaw7-dev libxt-dev libnetcdf-dev libblas-dev liblapack-dev fftw3 libcurl4-openssl-dev cmake を準備しておきました。

 

tar を使って、ダウンロードした圧縮ファイルを展開します。

tar xvfz ~/MyDoc/GMT_install/gmt-5.4.1-src.tar.gz
sudo mkdir -p /usr/local/gmt5/share/gmt
cd /usr/local/gmt5/share/gmt
sudo tar xvfz ~/MyDoc/GMT_install/gshhg-gmt-2.3.7.tar.gz
sudo ln -s gshhg-gmt-2.3.7 gshhg
sudo tar xvfz ~/MyDoc/GMT_install/dcw-gmt-1.1.4.tar.gz
sudo ln -s dcw-gmt-1.1.4 dcw

次にcmake の準備をします。

cd ~/gmt-5.4.1
cp cmake/ConfigUserTemplate.cmake cmake/ConfigUser.cmake

(cmake/ConfigUser.cmakeの編集)

set (CMAKE_INSTALL_PREFIX "/usr/local/gmt5")
set (GSHHG_ROOT "/usr/local/gmt5/share/gmt/gshhg")
set (DCW_ROOT "/usr/local/gmt5/share/gmt/dcw")

 

さらに ~/gmt-5.4.1の下で mkdir build ; cd build して、

cmake ..

make

sudo make install 

 とすればOKなのですが、どういう訳か gmt_api.c の861行目でFALSEという変数を知らないというエラーが発生してしまいました。FALSEなんて、かなり基本的なヘッダーファイルの中で #define されているはずなのですけどね...。とりあえずFALSEを0に置き換えて凌ぎました。

 

/* curl_easy_setopt(Curl, CURLOPT_SSL_VERIFYPEER, FALSE); Tell libcurl to not verify the peer */
curl_easy_setopt(Curl, CURLOPT_SSL_VERIFYPEER, 0);