PHP Extension作成

WebページでOpenTypeの対応がしたくなった。通常、ブラウザが対応しておれば問題ないのだろうが、自分の使用方法が文字列を受け取って1文字単位でのアウトラインデータを取得する必要があるためサーバー側で対応する必要ができた。(フォントが特殊でブラウザ側に書体データを渡したくない)HarfbuzzのユーティリティコマンドをPHPからshellexecで実行してと思ったが、どのコマンドも微妙に機能がたらない。いくつかのユーティリティコマンドを組み合わせればできるかもと思ったが、shellexecを何回も実行するのはレスポンスを考えるとやりたくない。ということでPHP Extensionでharfbuzzの関数を直接呼び出して自分のほしい結果を取得することを考える。

まずPHPのソースをダウンロードする必要があるらしい。

いくつかのページで

git clone git@github.com:php/php-src.git

でよいと書いてあるが、これはうまくいかない。メッセージからするとgithubのアカウントを設定しているかどうかのような気がするが匿名でダウンロードしたい。といろいろ探し回っていると下記のコマンドでダウンロードできた。

git clone http://git.php.net/repository/php-src.git

次にエクステンションのスケルトン生成だがこれも

cd ext
./ext_skel --extname=myext

でいけるとなっているが–extnameというオプションはないと怒られる。これは

cd ext
./ext_skel --ext myext

でいけた。こんなところで微妙な違いがあるのがなにかを間違えているのではという気がしてしまうがとりあえずこのまますすむ。ちなみにPHPバージョンは7.4(サーバーと開発機で微妙にバージョンが違うがそのうちサーバーのバージョンを上げたいのでこのまま進む)

うまくいくと下記のような表示がでてビルド方法を教えてくれる。

Success. The extension is now ready to be compiled. To do so, use the
following steps:
cd /path/to/php-src/harfbuzz
phpize
./configure
make
Don't forget to run tests once the compilation is done:
make test
Thank you for using PHP!

外部ライブラリの読み込み設定

外部ライブラリを使うことを宣言しておくと./configureやmakeを使うのに便利(というか必須)のためconfig.m4を書き換える。このファイルはpkg-configが対応している外部ライブラリを使う場合とそうでない場合で書き換える箇所がことなる。自分はharfbuzzとfreetype2を必要としており両方pkg-configに対応しているため下記のような記述となった。

dnl If your extension references something external, use 'with':
PHP_ARG_WITH([harfbuzz],
[for harfbuzz support],
[AS_HELP_STRING([--with-harfbuzz],
[Include harfbuzz support])])

if test "$PHP_HARFBUZZ" != "no"; then
dnl Write more examples of tests here…
dnl Remove this code block if the library does not support pkg-config.
PKG_CHECK_MODULES([LIBFOO], harfbuzz)
PHP_EVAL_INCLINE($LIBFOO_CFLAGS)
PHP_EVAL_LIBLINE($LIBFOO_LIBS, HARFBUZZ_SHARED_LIBADD)
PKG_CHECK_MODULES([LIBFO1], freetype2)
PHP_EVAL_INCLINE($LIBFO1_CFLAGS)
PHP_EVAL_LIBLINE($LIBFO1_LIBS, HARFBUZZ_SHARED_LIBADD)
PHP_SUBST(HARFBUZZ_PHP_SHARED_LIBADD)

dnl In case of no dependencies
AC_DEFINE(HAVE_HARFBUZZ, 1, [ Have harfbuzz support ])
PHP_NEW_EXTENSION(harfbuzz, harfbuzz.c, $ext_shared)
fi

dnlがついていない場所のみ抜粋(メモは残してある)。最初ファイルの記述が多いためこれだけの内容を自分が使いたいライブラリに合わせて書き換えるのかとげんなりしたが、よくよくメモを読んでみると一部のコメントアウトを外した上で使いたいライブラリ名を書くだけだった。これでphpizeと./configureを行うとライブラリの存在確認をしてくれるし、make時にパスを通したりライブラリのリンク設定もしてくれる。VisualStudio等のIDEのありがたみを実感した。

inkscape カスタマイズ

inkscapeをご存じだろうか。長い間Version1未満の状態で開発が継続していたOpenSourceのベクターグラフィックソフトである。正直Version1になることなく実質開発中断になるのではと思っていました。しかし、2020年4月くらいにふとみるとVersion1がリリースされてました。しかもなんかいい感じの絵がホームページに掲載されてる。起動画面に絵が表示されるようになるのかと思ったがそうでもないのが残念。

社内でイラレの代わりに使えないかと考えてみるが、機能的には十分でもブランドイメージで負けてしまうためカスタマイズして使いやすくできないか考える。

具体的には社内ルールに従ったファイル名やパスを自動選択したり、過去の同様の案件があればそれを自動的に探してくれたり、フォントのリストを使いやすいようにグループ化するなど。

これができればあとは、カッティングマシンと連動できれば完全にイラレを圧倒できるはず。(社内でのイラレの使い方は特殊な機能は使ってなくて互換性をそこまで気にしなくてもよい感じ)

ということでWindows向けにまずビルドできる環境を構築します。

VisualStudioでやろうかと思いましたが、クロスプラットフォームのソフトでGUIでデザインできるわけでもないことを考えると重いVisualStudioよりはVisualStudioCodeでやれることを目標としました。下記のリンクを参照にしました。

https://wiki.inkscape.org/wiki/index.php?title=Compiling_Inkscape_on_Windows_with_MSYS2

ちなみに、inkscape win buildで検索したときにMSYS2ではなくMINGWをインストールせよという情報がでてきたら古い情報のようなので注意が必要です。

上記URLによると

  • MSYS2のインストール
  • MSYS2の最新化
  • 必要なライブラリのインストール
  • Inkscapeのソース取得
  • ビルド
  • インストーラ生成

といった流れです

MSYS2のインストール

とにかくダウンロードしてインストールするだけ。注意する点をどうしてもあげるなら64bitでビルドしたいなら64bit版をインストールするということらしいが、なにも考えずにインストールしたら32bit版と64bit版の両方がインストールされました。以下MSYS2のURL

https://www.msys2.org/

MSYS2の最新化

  • MSYS2のシステムコンソール?(スタートメニューのMSYS2 MSYS)を起動し pacman -Syuu と打ち込む
  • アップデータが完了するまで待つ。

必要なライブラリのインストール

  • 以下のリンクからライブラリのインストールスクリプトをダウンロードしてMSYS2のホームフォルダに保存する(ちなみにMSYS2のホームフォルダは自分のPCのMSYS2のインストールフォルダ内にある。例:C:\msys64\home\「PCのログインユーザー名」)
  • MSYS2のコンソール(64bitの場合はスタートメニューのMSYS2 MinGW 64bit)を起動する。
  • MSYS2のコンソールでダウンロードしたスクリプトを実行( ./msys2installdeps.sh )

https://gitlab.com/inkscape/inkscape/blob/master/buildtools/msys2installdeps.sh

Inkscapeのソース取得

MSYS2 64bitのコンソールを使ってgitでクローンする。gitはMSYS2に入っているのでWindows用Gitクライアントは不要

git clone --recurse-submodules https://gitlab.com/inkscape/inkscape.git master

ビルド

とにかく次のコマンドを打ち込んで完了するのをまつ

  • cd master (incscapeのソースがmaster内に入っている)
  • mkdir build
  • cd build
  • cmake -G Ninja ..  (最後の「..」を見落とさないように)
  • ninja
  • ninja install

インストーラ生成

必要なインストーラ形式別に下記コマンドを実行

EXEのインストーラを作成する場合はNullsoft Scriptable Install Systemがインストールされている必要がある。下記URLよりダウンロード可能

https://nsis.sourceforge.io/Main_Page

単純にビルドとインストーラの作成はLibreOfficeに比べると圧倒的に簡単でした。やはり、必要な外部ライブラリのダウンロードスクリプトが用意されているのは大きいですね。ちなみにMSYS2の環境込みで使用したなストレージ容量は7.5GBでした。

今できることはすぐに行いましょう

2020年も半分の6カ月が過ぎて、年始にこれやろうとか思っていたことがなかなか進んでいなくて時間がたつのはあっという間だなと思います。会社が主に商売しているエクステリア業界は今後人が減ることで市場が小さくなっていくと予想されています。まだ、利益が出てはいますが今後はどうなるかわかりません。今できることを確実にやっていくことが大きく変わっていくための第一歩と思います。各部署、改善活動、クレーム対策を一つずつ確実に進めてほしいと思います。

よろしくお願いします。

FaxServer

会社のPC-Faxサーバーより会社の複合機にFAXを送ると画像が乱れる現象が発生していた。PC-FaxサーバーはインターコムのUSB接続のFaxモデムを使っているのだが、通信設定は4800bpsで圧縮もMHのみでエラー訂正(ECM)がオフとなっている(出入りのシステム会社がいろいろな送信不具合の末こうしたらしい) せっかく再現性が高い現象が捕まえられたので対策してみた。

1、社内の電話主装置の入出力レベルの調整:主装置メーカーの方曰く、入出力レベルが高すぎて飽和しているのではということ。FAXって昔のアナログ回線を前提とした仕組なので送出レベルはできるだけ高くしないと遠くのFAXにデータが届かなかったのかと。これだけでかなり良くなった。

2、インターコムのモデムの送出レベルの調整:インターコムのサポートに送出レベルを変更するATコマンドを聞けたので次のコマンドを追加「ATS92=14’」なんでもデフォルトが12で16が一番小さい送出レベルになるらしい。

3、さらにエラー訂正と圧縮方式を追加:FAXサーバーにECMとMR,MMRの設定があったのでONにする。これで送信ミスで画像が乱れることはなくなったはず。が、どうも画像は乱れないがエラー部分数センチが丸ごとなくなるという現象が起こることがあるらしい(受け側のFAXのエラー時動作設定によるように思うが)ということで送信速度を14400bpsに上げるのはあきらめて9600bpsにする。おそらく、出入りのシステム会社はエラー部分がなくなるのを恐れてECMをオフにしたのではと思われる。これはもしかするとOFFのままのほうが良いのかもと思うが、ECMがオフだと数ラインのみ飛ぶことがあるためとんだことがわかりやすいECMオンのほうがよいか微妙なところ

上記設定で社内複合機に送るときの画像乱れはなくなった。送出レベルが最適かはもっと直接的な方法で確認したいがそこまでの気合はない。だれか簡単な方法をおしえてくれたらうれしいです。

Print Spoolerが停止

突然Windows10のPCから印刷ができなくなった。LibreOfficeのアップデートが悪さしているのかと思い慌ててダウングレードしたが状況は変わらず、プリンタの再インストールしようとすると再インストールにも失敗した。よくよく調べてみるとPrintSpoolerサービスが停止しているらしい。PrintSpoolerサービスを手動で起動するとその直後はプリンタにアクセスできるが5秒もすると停止してしまう。まさかのWin10再インストールという言葉が頭をよぎるがとりあえずネット検索で同じような症状になった人を探してるとなんと最新のWindowsUpdateを当てた後に起こる症状とのこと。なんて迷惑な。

Spoolerのフォルダを削除とかレジストリエディタで…という情報もありましたがwindowsupdateを一旦アンインストールするのが手っ取り早いと思われます。(ただし2019年9月末限定)

windowsupdateから更新の履歴を表示し「更新プログラムをアンインストールする」を選択し「MicrosoftWindows(KBnnnnnnnn)の更新プログラム」を選択します。nnnnは更新プログラムの番号です。私のPCと隣席のPCではアンインストールが必要なnnnnが異なるようなのであえてここでは特定しません。(マイクロソフトが9月末の更新プログラムで不具合が発生したのを次の更新プログラムで修正するということをやっていたようで私のPCは両方の更新プログラムを当てても不具合が直らず、両方アンインストールしましたが、隣席のPCでは一つ目の更新プログラムでは不具合が出ずに2つ目の更新プログラムで不具合が出ていたように思います)最新の更新プログラムをアンインストールし、プリンタが直らなかったら次の更新プログラムをアンインストールするとよいのではと思います。

Win10は結構安定していると思っていましたがこんな落とし穴もあるんですね。プリンタドライバの問題なら再インストールとかで済みますがprint spoolerの問題だと全プリンタ使用不可&プリンタドライバインストール不可となって結構焦りました。

今に集中しましょう

私はこれまでに1度だけマラソン大会を途中でリタイヤしたことがあります。それは初めて100kmを走る大会に参加した時でした。天気も良く、コンディションは決して悪くなかったのですが、50kmを超えた時点で歩くようになって、70kmくらいでリタイヤしてバスに乗せられて帰ってきたことを覚えています。

その大会には2年後くらいに再度チャレンジして完走しました。

人生や仕事もマラソンと同じで過去にリタイヤした大会を今から頑張ってもゴールすることはできませんがこれから頑張って明日ゴールすることはできると思います。私も今に集中してよりよい会社となるように頑張りたいと思います。

変化を敏感にとらえましょう

うろ覚えなのでいろいろ間違っているかもしれませんが、昔聞いた話で松下電機の創業者が面接で必ず聞く質問というのがあって、それは「自分は運が良いと思いますか」という質問で運が悪いという学生は採用しないというようなことを聞いた覚えがあります。実際、面接をうけたわけではないので本当かはわかりませんがなぜ採用しないかというと、運が良いと思う人は、いろいろなことに対する感謝を素直に感じている前向きな人で、運が悪いと思う人は、そうではないからだというような話だっとと思います。

今日の心がけとはずれてしまいますが、日々、いろいろな人、事にお世話になっていることに感謝し、運がよいと思って生きていきたいと思いました。

PDFにSVG画像を埋め込む

Laravelからwkhtmltopdfを使ってPDFを生成するときにSVGを使おうとしてハマった。

もともと外注先で作ったプログラムではPNG画像を使っていた。開発を社内に引き取り改良を加えていくなかで、画像もできるだけSVGにしてぼやけた画像が表示されないようにしようと気づいた画像から変更していた時のこと。

もしかすると誰かが検索で引っ掛かってくるかもしれないので最初に原因と対策を書く。

原因 svgファイル内にsizeが設定されていない。imgタグで設定するサイズとは別にsvgファイル内にsizeの指定が無いと正しく埋め込めない。

対策 SVGファイル内に width=”200px” size=”50px”を追加(ピクセル値はviewBoxの値をそのまま持ってくるとよい)

以降 顛末

ブラウザで表示する画像はimgタグの画像ファイルをSVGに変えれば特に問題なかったのに、PDFだけはいろいろおかしな現象が発生した。最初の問題は画像が表示されないことだった。これはimgタグのsize指定がheightのみで合ったのでwidthも指定することで表示はされるようになった。が、あきらかに画像サイズがおかしい。具体的にいうと、縦横比が明らかに変。そのうえ画像の上下に不自然な空白が入る。

ここからが長かった。まず、PDF生成のライブラリが駄目なのかとバージョンを上げたり、ほかのライブラリに変えたり、、

最後にSVGファイル内で使えるタグになにかないかと見て回った結果sizeプロパティーがあることに気づき解決。imgタグのsize指定もheightのみ指定すればwidthは自動的に変更してくれた。SVGファイルはIncscapeで出力していたが、このプロパティを出力することができるのかは不明。とりあえず、エディタで修正することにする。

そもそもなぜheightとwidthがファイル内に存在しないのかは不明。外注先が管理していたファイルなので外注先が何かした、または変なコンバーターを使ってSVGにしておかしくなったとかか。Inkscapeで新規作成したところwidthとheightは普通に入っていた。イラレも同様(ということはこのページが参考になる人はほぼいないのでは、、)

この外注先は頑張ってはくれていたが、開発途中に何回か人が変わってごたごたしていて、今中身をみるとエッと思うようなところがあったりするので仕方ないかも。

一つだけ収穫があったのは wkhtmltopdfが最もきれいにPDFにできるということ。ほかのはCSSタグに対応していなかったり、枠が崩れたり。

以上

物事に区切りをつけましょう

以前、交通安全研修というのを受けた時、講師の方より事故を起こさないのに最も大切なことは何かという質問がありました。受講生は「一時停止を必ず守る」、「制限速度を守る」、「車間距離を守る」などいろいろ答えたのですが、講師の方は一番大事なことは運転に集中することだといわれました。真剣に運転に集中していればなかなか事故を起こすことは少なく、時間を気にして運転に集中していなかったり、スマホが気になっていたり、ぼっとして運転していたりしているときにおこるということでした。その時やらなければいけないことに集中するという単純なことを愚直にやることが運転でも仕事でも私生活でも大切なんじゃないかと思いました。