昔はマリオも悪役だった

ドンキーコングJr.でしょ?知ってるよ!
という方は閉じていただいて結構です。

娘にテトリス以外のゲームで動画を撮れと言われた結果がコレね。
初!顔出しゲーミング!(自宅だと背景がアレでできないw)

ドンキーコング、ドンキーコングJr.、テニス、マリオブラザーズ、レッキングクルーをプレイしております。

これと平行して毎日(毎朝)テトリス99もやっております…

PSQL Windows ODBC Linux SQL 接続

要約:
DB MagicのBtrieveファイルをPSQLを介して、LinuxのPHPからODBC経由で読み書きできる
なかなか苦労したので、こんなことやる人少ないだろうけど、記しておく

前置き

DOS時代から聞いたことがあったBtrieveというファイル内DBの仕組み。固定長データベースですからなかなかとっつきにくいし、Windows時代になって長いこと過ぎて、既に使われていないのでは…と思ったら結構あるもんですね。DB Magic(UniPaaSを経て今はMagic XPA)で採用されてるからかな。

で、そのBtrieveファイルをもとにSQLとして扱える仕組みが提供されており、だったらPHPからBtrieve読み書きできたりしちゃうんじゃないのーということで、そういう話が始まりまして、結構苦労したので記します。日本語のソースもあんまりなかったし。

Btrieveを使ったDBMSとしてActian PSQLというのがあります(以前はPervasive PSQLでした)。このPSQLエンジンがあれば、バックエンドはBtrieveですが、SQLを使って問い合わせができます。
そしてさらにPSQLはODBCインターフェースを提供しているので、Windowsはもちろん、LinuxでもODBCドライバが存在しています。

ということでWindows側でBtrieve、PSQL、ODBC、Linux側でPSQLドライバ、unixODBC、php-odbcと重ねていくことで、PHPからWindows上のPSQLエンジンを利用することができるわけです。

Windows側の準備

Actian PSQLをセットアップすると大体入ってます。Magic XPA付属のPSQLでも入ってました。適当にBtrieveファイルをもとにPSQLが利用できるようです。

Btrieveデータファイルだけがある状態ではSQLは利用できません。
PSQL Control Centerから「データベースの作成」を行い、データパスにBtrieveデータがあるフォルダを指定してやります。
さらにPSQL DDF Builderを起動し、作ったデータベースのデータパス内から使用するデータファイルを探し出します。そこで右クリック「テーブル定義の作成」です。

Btrieveファイルは固定長データベースですが、デリミタがありませんので、あらかじめ「Xバイト目からはYというフィールドで型がINTEGERだから4バイトです」という定義が必要なのです。データファイルがあるだけではPSQLはこれを知りませんので、定義を別途作ってPSQLに読ませます。この作業をするのがDDF Builderです。きっとData Definition Fileかなんかの略です。

DDFができたらPSQL上でテーブルが扱えるようになっています。初回開くとインデックスが作成されたりしてRDBMSっぽいです。スキーマをエクスポートしておくと、他の環境にデータファイルを持っていった際にDDFをインポートするだけで動くようになります。
ちなみにスキーマの頭には CREATE TABLE “hoge” USING “hoge.dat” なんて書かれていて、ああファイルに対するテーブル定義なんだなぁと確認できます。

WindowsのODBCデータソースからPervasive ODBC Unicode Interfaceなんかのドライバを使ってDSNを作れます。フリーソフトのcse(Common SQL Environment)などで接続すると、DB内にDDFで定義されたテーブルが存在しているように見えるのがわかります。

PSQLはTCPポート1583で動くらしいので、他のマシンからアクセスさせるためにファイヤウォールの解除をしておきます。いまどきはポート指定じゃなくてPSQLエンジンのプログラムを指定したほうがいいんだろうけど、やってないからわかりません。

Linux側の準備

今回はCentOS8上でApache+php-fpmを用意してましたのでこれでやります。
CentOS8上にあるApache2.4はmod_phpじゃなくてphp-fpmを使うようになってますのでそのへんセットアップしておきます。
Apache2.4はデフォルトで全体がdenyされているのではじめてセットアップするとforbiddenの嵐で大抵ハマります。

とりあえずパッケージとして php-odbc unixODBC あと使う人は php-pdo 他使うモノを入れておきます。

Linux用のPSQL Clientをダウンロードしてきます。
PSQL v12 SP1 インストール用ファイル(ダウンロード情報)
64bit Linux rpmをインストールします。あっさり終わりますが、環境設定は自前でやる必要があります。

psqlユーザーが作られているので、~psql/.bashrc に書いてある環境変数をコピーしておけばrootでも動きます。なんかごちゃごちゃ書いてありますが、元のPATHが消えたりしてて困るので必要そうな部分だけコピーして書き直します。

export PVSW_ROOT=/usr/local/psql
export PATH=$PVSW_ROOT/bin:$PATH
export LD_LIBRARY_PATH=$PVSW_ROOT/lib64:$PVSW_ROOT/bin:$LD_LIBRARY_PATH
export MANPATH=$PVSW_ROOT/man:$MANPATH
export BREQ=$PVSW_ROOT/lib
export LD_BIND_NOW=1

PSQL ClientにDSN追加を命じます(内部的に何をしているのかわからんけど、少なくともodbc.iniファイルを置くだけではダメなのでコマンド実行は必須のようです)
# dsnadd -dsn=MYDSNNAME -db=DBNAME -host=WindowsHostIP
/usr/local/psql/etc/odbc.ini が作成されるので、これを /etc/odbc.ini に追記しておきます。
また /usr/local/psql/etc/odbcinst.ini を同様に /etc/odbcinst.ini に追記しておきます。

お気づきかもしれませんが、PSQL関連の環境変数がないとPSQL ClientおよびODBCドライバは動作しません。なのでphp-fpmに環境変数を渡す必要があります。
CentOS8ではphp-fpmはsystemd経由で動いてますので、 /etc/systemd/system/php-fpm.service.d/ の中に pvsw.conf とでもファイルを作成して、環境変数を渡してやります。

[Service]
Environment=LD_LIBRARY_PATH=/usr/local/psql/lib64:/usr/local/psql/bin:/usr/lib Environment=PATH=/usr/local/psql/bin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/sbin:/usr/sbin:/root/bin
Environment=PVSW_ROOT=/usr/local/psql
Environment=BREQ=/usr/local/psql/lib

設定ファイルの変更ということになるので
# systemctl daemon-reload
# systemctl php-fpm reload
しておきます。

ここまでで準備完了です。適当にコードを書いて走らせてテストしましょう。

$conn = odbc_connect('MYDSNNAME', '', ''); // user/passは空で良い
$odbc_q = odbc_exec($conn, "SELECT * FROM sometable;");
$odbc_r = odbc_fetch_array($odbc_q);

なお、Windows側は文字コードがsjisですので、SQL文は適宜mb_convert_encodingなどしてやる必要があります。文字コードが適切なら日本語カラム名もクォート等なしで通るようです。

CentOS8にはOpenDKIMがないのでEPEL7から拝借

愕然。しかもググっても日本語情報がない。
このためだけにCentOS7に入れ直そうかと思っちゃった。

CentOS8になってsendmailが削除されたのだが(もともとpostfix推奨)、OpenDKIMはsendmail-develに含まれるmilter関係のコードが必須で、それも削除されちゃってるもんだから無いという理屈のようです。英語の掲示板ではOpenDKIMをソースから構築しようにもsendmail-develがねぇじゃんという書き込みがありました。

ならばOpenDKIMが含まれるCentOS7用のEPELから入れればいいじゃないかというので実施。
CentOS 8: Not Ready for Prime Time Mail Server for Us!

※CentOS8ですがまだ慣れてないのでyum使ってます
# yum remove epel-release
↑8.xが削除される
# yum install https://download-ib01.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
↑7用EPELを導入
# yum install opendkim
↑OpenDKIMを導入
# yum remove epel-release
↑7.xが削除される
# yum install epel-release
↑再度8用EPELを導入

警告も出るのでこれがそのまま使えるとは限りませんが、とりあえずOpenDKIM設定して起動はできたし署名もつきました。

ちょっと他のサーバーでは使いづらいな…

楽天Edyのキャッシュレスポイント還元、機種変更したらどうなる

長いタイトルですがそのまんまそれ。

キャッシュレス還元のおかげで毎日Edyギフトの受け取りを促すメールが来ます。
利用から1ヶ月後に還元されてくるようです。

しかし先週機種変更をしてEdy番号が変わってしまった私は受け取りようがない。
仕方ないのでサポートにメール&電話。
どうでもいいけど電話は窓口にたどり着くまでのメニューが長いです。余計な問い合わせがたくさん来るんだろうなぁ。

電話のオペレーターさんも質問のあと結構長く保留されて、新Edy番号を伝えることでギフトの付け替えをしてくれるとのこと。しかしこれが2ヶ月後ですって。

あれ、ギフトの有効期限って3ヶ月じゃなかった?あれ?うーん?
まぁ、それが問題になるようならまたサポートに電話するまでね。

CentOS8で名前解決できない(RTX830の下)

新規環境でCentOS8を入れてみたら、名前解決ができない。
digコマンドをたたいてもFORMERRと出て解決できない。
mxが引けないのでメールが送れない…

LAN内でのIPv6が悪いのか?などと思ったが違った。
dig +noedns example.com と、+noednsをつければ引ける。

EDNS、EDNS0という拡張プロトコルで問い合わせをする方式。
digコマンドでは+noednsによってEDNSを使わないで問い合わせする。

つまり、このCentOS8の上位のネームサーバーがEDNSに対応していないことが問題だった。
となれば疑うは上位のルーター。今回はYAMAHA RTX830。

27.4 DNS サーバーを通知してもらう相手先情報番号の設定

ばっちり、ファームウェアアップデートでEDNS対応していた。
Windowsからtftpでrtx830.binを送ってやる。

アップデート完了後
dns server pp 1 edns=on
と設定し、CentOS8側でも名前解決できるようになりました。