MacOSの配布用Qtアプリケーション作りが難解過ぎた

黒基調のウィンドウは格好良いです。

1週間以上掛けて、ようやく配布用アプリケーションが作成できました。
MacOS版チケットぴあ自動購入の処理は、1年前のソースコードをそのまま持ってきました。(プラスnewspプラグインの処理を入れています)
MacOS版の方がWindows版よりも購入できるという報告をちらほら聞くため、敢えてそのようにしています。Success PostでMac版を使った時にはそれが分かるようにしているので、そこで判断できます。

今のバージョンである、macOS Sequoiaは、AppleシリコンのM1以降でのみ対応されており、そのCPUでビルドしたアプリケーションを作成する必要がありました。

別件でMac Miniを購入したことと、ユーザからの要望があったので作成してみようと思った訳ですが、情報が殆どないためAIサービスに頼るしかありませんでした。

最初は、ChatGPTに聞いていたのですが、開発者IDを取得するところで躓いてしまい、先に進めなくなってしまったため、ChatGPTよりも賢いと評判のClaudeに相談することにしました。

Apple M1以降のCPUを搭載しているMacOS用に配布するためのQtアプリケーションを作成するには、アプリケーションに開発者IDを署名する必要があります。

公式には以下に作成方法が書かれているのですが、中途半端な開発者ID証明書を作成するところまでは簡単にできます。
https://developer.apple.com/jp/help/account/create-certificates/create-developer-id-certificates/

結論から言うと、開発者ID証明書には、中間証明書とCA証明書を付加する必要があります。

Apple Root CAは以下からダウンロードして、キーチェーンアクセス.appにダブルクリックして取り込みます。
https://www.apple.com/certificateauthority/

中間証明書のありかは、Claudeに聞いて取得してきました。

1.G2の中間証明書を直接ダウンロード:
curl http://certs.apple.com/devidg2.der -o devidg2.der
2.ダウンロードした証明書をインストール:
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain devidg2.der

コマンドで「find-identity -v -p codesigning」を実行して、Developer ID Applicationがvalid状態であり且つ、ルートCA証明書まで正しく登録できていれば証明書の作成は完成です。

次に、アプリケーションに署名を付与していきます。

プロジェクト内に「entitlements.plist」を作成し、内容を以下にします。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

proファイルに以下の項目を追加します。

macx {
ICON = res/ticketpia.icns
QMAKE_INFO_PLIST = Info.plist
ENTITLEMENTS.files = entitlements.plist
ENTITLEMENTS.path = Contents
QMAKE_BUNDLE_DATA += ENTITLEMENTS
}

ビルドを行い、macdeployqtにて必要なライブラリをapp内に取り込みます。QtWebEngine.appも同様に行います。

% macdeployqt ticketpia.app 
% macdeployqt ticketpia.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app

# パスを変更
install_name_tool -change /opt/homebrew/opt/brotli/lib/libbrotlidec.1.dylib @executable_path/../Frameworks/libbrotlidec.1.dylib ticketpia.app/Contents/MacOS/ticketpia

install_name_tool -change /opt/homebrew/opt/brotli/lib/libbrotlienc.1.dylib @executable_path/../Frameworks/libbrotlienc.1.dylib ticketpia.app/Contents/MacOS/ticketpia

install_name_tool -change /opt/homebrew/opt/brotli/lib/libbrotlicommon.1.dylib @executable_path/../Frameworks/libbrotlicommon.1.dylib ticketpia.app/Contents/MacOS/ticketpia

以下にてアプリケーションに署名していきます。

# 拡張属性をクリア
xattr -cr ticketpia.app

# メインアプリの署名
codesign --deep --force --verify --verbose \
--sign "Developer ID Application: KAZUHIRO OZAWA (VSAYCF9RQD)" \
--options runtime ticketpia.app

# WebEngineProcessの署名(entitlementsを指定)
codesign --deep --force --verify --verbose \
--sign "Developer ID Application: KAZUHIRO OZAWA (VSAYCF9RQD)" \
--options runtime \
--entitlements ticketpia.app/Contents/entitlements.plist \ ticketpia.app/Contents/Frameworks/QtWebEngineCore.framework/Helpers/QtWebEngineProcess.app

この2つの署名を行わないと、例えばWebEngineProcessの署名を行わない場合、ticketpia.appのアプリは起動するがWebEngineが表示されずに落ちてしまう現象が発生します。

この情報がどこかに刺さったら嬉しいです。

今年もお世話になりました!

今年は、会社の事業を拡大しようと試みた年でした。

去年からとてもしつこく勧誘電話を受けていたアイドマホールディングスという会社があります。とても胡散臭い会社だと思っていましたが、いざ今年の売上が落ちることが分かると、騙されたと思ってやってみようと契約したのが6月中旬でした。

そこからは、DXという新規事業を立ち上げるために、仮想的な組織を作るというアイドマホールディングスの言うがままに、営業を配置して新規顧客開拓を行いました。

私は営業という行為に苦手意識があり、また新たな商品開発をしなければDXだけでは顧客は付かないとひと月経ったあたりから気づきだし、電子帳簿保存法対応のアプリケーション開発に乗り出しました。

新規アプリの中核機能として、AIを使った文字認識に取り組みました。しかし知識ゼロからの開発は時間が掛かるのと、営業による新規顧客開拓も結果が出ないまま8月下旬になり、アイドマホールディングスとの契約を打ち切りました。

アイドマホールディングスの契約は2年契約が基本となっており、それを破棄したために違約金を払わなければならず、当時は騙された感がとても強かった。そのときはこの顔が江戸時代の武士みたいに見えて、農民のわずかな備蓄を、根拠も無い儲け話で奪っていくビジネスモデルで株式上場までしているのだから、如何に騙されている人が多いことか。やっていることは、ねずみ講と何ら変わらない。

独立したときから売上が少しずつ増えていた中で、今年は減収になることが見えていることの不安から自分を見失い、無謀な挑戦をしてしまったと反省しました。

AI技術は、機械学習させるときは、人間が学習させる方向を決めますが、機械学習の過程はコンピュータ任せのため、ブラックボックス感が強くて自分で作った実感があまり湧きません。

それに比べてBOT開発は、サーバサイトの仕様はブラックボックスですが、ブラウザで動作するように設計されたものなので、ブラウザの動きを解析すれば、ある程度自分で作ることができる点が面白い。

そんなこんなで、DX関連のアプリ開発が滞ってしまっています。

ただ、電子帳簿保存法は2024年1月から施行されることは確実であり、自分自身が使うためにもアプリ開発は継続していく予定です。

Emperorの新規開発として、新たな画像認証が導入されたハピネットをターゲットにしています。以前から次の開発候補としてハピネットが上がっていたのですが、やろうとするとほかの仕事が割り込んできたり、風邪を引いてそれどころでは無かったりという状況が続いて早1年が経ってしまいました。

リモートワークをしているので、通勤やオフィスで風邪菌をもらうことはありませんが、4歳の息子が幼稚園から強力な風邪菌を家へ持ち帰り、毎回家族全員にうつします。もーやだ。。。

わくわくするような画像認証なんですが、12月から新たな組織で働きだして、そこでの技術もなかなか難易度が高く、そちらの方が優先になってしまいました。

当社のアプリはQtというフレームワークを使っています。20代後半にこのフレームワークに出会って以降、個人的に使い続けています。Qtはとても使いやすく、マルチOSなアプリケーションを作れるという点に惹かれました。

Qtは欧州では認知度が高く、車載器などにも搭載されているのですが、日本ではほとんど使われておらず、自分が仕事で触れたのは数える程しかありません。日本では、C#やPythonなど、非コンパイラ言語の方が圧倒的に多く使われています。

12月からの仕事でC#からC++に移植するということを行い、初めて仕事でC#に触れましたが、非コンパイラ言語ならではの、柔軟なソースコードの書き方を見てしまうと、C++は神だと思っていたのが揺らいでしまうぐらい良くできた言語だと思ってしまいました。

私が使うC++は、2003年に出たC++03ぐらいまでの仕様しか使っていなかったし、それで必要十分だと思っていましたが、C++11以降(C++11,C++14,C++17,C++20)の仕様に触れて、C++の進化を改めて実感しました。

C++の進化について、簡単な例を上げます。

int a = 1 ;  ・・・①
int *b = &a; ・・・②
int &c = a;  ・・・③
int &&d = 1; ・・・④

①は、左辺の1を右辺のaへ代入する処理です。
②は、左辺のaのアドレスをbポインタに設定しているという意味で、aを参照していることから、左辺値のアドレスを指していることになります。
③は、a自体が左辺値であり、cがaを参照しているので、左辺値参照という解釈となります。
④は・・・これがC++11以降の仕様で、&&は右辺値参照という意味で、dは1を格納しているメモリの中身を参照しています。

左辺値のアドレスを参照とか、そんなこと考えなくてよくね??と思いたいですが、C++はアセンブリ言語の次に速い言語としての進化をし続けているわけで、私のC++の知識は20年ぶりにアップデートされました。

ということで、ここまで言い訳をダラダラ書きましたが、要は来年もよろしくお願いします、ということを言いたい!!

チケットぴあが何やらごにょごにょやっているなぁというのは気づいています。これはフレームワークのブラウザによる影響が高そうなので、ブラウザを変えることを検討しています。

来年も、常に最速を目指していきます!


モジュールアップデートを簡素化します

先々週対応した新暗号化ライブラリ版をインストーラにも適用したため、オンライン版のインストーラが例のVPS上においても動作するようになりました。

今後は、オンライン版インストーラのみに統一していくことにします。

当社のモジュールアップデートは、2種類の方法があります。

1つは、デスクトップのショートカットを起動すると表示するソフトウェアの更新ダイアログによるモジュールアップデートがあります。これは、同じバージョンのフレームワークを使用している場合に有効で、BOTの処理を更新するときなどに使用します。

もう1つは、インストーラからアップデートする方法で、これは未インストールのPCに対してインストールする場合や、フレームワークの更新がある場合は、こちらで行う必要があるため、fastBOTサイトでアップデートを通知していますが、なかなかアップデートが進んでいない場合は、前者の更新で強制的にインストーラの再インストールを促すことを行っています。

今後は、ソフトウェアの更新ダイアログがBOTのアップデート前に、オンラインインストーラの更新チェックを行い、更新があったときは以下の画面を表示するようにします。

上記画面でコンポーネントの更新を行うことで、インターネットから最新のモジュールに入れ替える作業をインストーラが行ってくれます。

今回はチケットぴあ自動購入のみ行っていますが、順次他のBOTも切り替えていきます。

無題

あれやこれややっていたので追記が遅れたのだが、実は2日後には以下の回答が来ていた。

この言い分は、Windows OSについてはカスタマイズは一切していないよ!ということだ。

Windows OSのNDIS中間ドライバやもっと下位のドライバでブロックすることもできそうだが、上記のことがあるため、ルータでブロックしていることはほぼ間違いないだろう。

このようなケースが他にも考えられるため、自分的には意地でもOpenSSL以外の暗号化スイートを使用したいと考えていて、今はそこに全力投球している。

今は良さげな暗号化スイートをフレームワークに移植することを行っているのだが、その暗号化スイートはOpenSSL ver 1系に合わせたI/Fを用意している一方で、フレームワークはOpenSSL ver 3系のI/Fになっているため、こちらで合わせ込みをしなければならず、予想外に時間が掛かりそうな状況になっている。

ぴあの座席指定機能を追加して欲しいとか、TicketBookに対応して欲しいとか要望を頂いているのは認識しているが、直ぐの実現は難しい。

TicketBookは、去年の年末にサイト側が刷新されたので、アップデートしようとしていたのだが、ブラウザではなく通信データでリストック監視を行った途端にBOTだと判断されてカートにチケットが入らなくなる。これについて色々悩んでいたら風邪を引いてしまい、モチベーションが落ちてしまってほったらかし状態になっていた。

当社BOTは必ずブラウザと共存した作りにしているので、ブラウザの自動操作も駆使することで対応は可能だったとは思うのだが、モチベーションが下がってしまっては元も後もない。

脈絡とは全然関係無いのだが、問い合わせをもらうときに、「いつもお世話になっております」という文言が最初に入ることが多くなった。

実はこれ、俺からするとかなり違和感がある。

サブスクの商品であればまだ理解はできるが、売り切りの商品についてこれを言われても、契約書を交わしている訳でも無いわけで、こちらからすれば赤の他人から言われても違和感しかない。カスタマーサポートが存在する企業であれば、そこが一次受付するから、開発部署には問題の内容ぐらいしか届いてこないのが普通なのだが、当社は俺しかいないので仕方ないのかもしれないが、変えていきたい。

問題提起をしてくれるのはありがたい反面、只々動かないとしか書かれていると、これで何を判断しろって言うんだ?!と思う。ログや画面キャプチャーなどの証拠を提示してくれれば、こちらのことも考えてくれていると思える。

Google DriveやOne Driveにログや画面キャプチャーをアップロードさせておいて、そのリンクを問い合わせフォームに貼り付けてくれれば助かります。Driveにアップロードしたログは共有状態にしておくことを忘れずに。

自動電話発信機能連携の追加

前回の便利ツール(Androidアプリ)と連携する機能を、チケットぴあ自動購入に追加しました。

使用するには、最新のインストーラをインストールする必要があります。

ヘルプメニューの「MQTT Settings」を選択すると、以下の画面が表示されます。

MQTT Brokerに接続のための情報を設定後、Connectボタン押下で、接続されます。

次に、Topicを指定します。指定後、TabキーでSubscribeボタンが有効になります。

Topicは、便利ツール(Androidアプリ)と同じにする必要があります。

試しに、Publish欄に、「tel:xxxxxxxxxxxx」(x=電話番号)を設定してPublishボタンを押下すると、便利ツールが起動状態であれば、その電話番号に発信することが確認できます。

以下は、チケットぴあ自動購入ツール自身も「tt」TopicをSubscribeしているため、送信したデータを受信しているのが分かります。

チケットぴあ自動購入の右側には、MQTTの状態が表示されており、以下の表示になっていれば、繋がった状態になります。この状態であれば、電話認証が表示されたときに、スマホと連携する動きになります。

便利ツールv2.0.0をリリースしました。

この便利ツール(Androidアプリ)は、v1.0.0ではYahoo!ショッピングのSMS認証で、スマホに受信された認証コードをBOTに連携するツールとして、Emperor AIOで使用するためにリリースしたものです。

名前は適当です。当初はGoogle Playに登録しようかと思い、分かりやすい名称ということで選んだものですが、当方の時間的余裕が全く無いので、Google Playからのインストールではない方法でインストールするやり方を採用しています。

野良アプリをインストールするやり方をググれば色々出てきます。

APK(Androidアプリ)は、https://zatturight.com/fastbot/products/detail/38 の下の方にダウンロードリンクがあります。

LAN環境以外でも利用できるようにするため、MQTTというプロトコルを使用することにしました。以下が便利ツールアプリ画面です。

便利ツールはMQTTのクライアント側で、サーバ(Broker)はPublic Freeなところを使用することを想定しています。
個人で使用する分には、有料になることがまず無い程のリソースが用意されている以下のサーバを使用することを前提に進めていきます。
https://www.emqx.com/ja/pricing

MQTTは、世界規格統一された通信プロトコルで、LINEやDiscordなどのチャットシステムで利用されています。

MQTTを簡単に説明すると、Publish アンド Subscribe モデルで動作するマシン間接続プロトコルです。

MQTT クライアントは、MQTT を使用して MQTT サーバーへのネットワーク接続を作成するプログラムまたはデバイスであり、 ブローカー とも呼ばれます

通信が確立されると、クライアントはブローカーにメッセージを送信できるようになります。

他のクライアントは、クライアントから送信された特定のトピックに関する通知を購読できます。

Brokerとして今回利用させて頂くのが www.emqx.com 、SubscribeするだけのClientが便利ツールアプリ、PublishするだけのClientがチケットぴあ自動購入ツールとなります。

何をしたいのかというと、チケットぴあのログイン後にたまに電話認証になりますが、これを自動化したいというのが目的です。

Cloakでリストック監視を行っていると、1日に2~3回は遭遇します。手間でも認証を通しておけば、発生頻度は減ります(と思う)が、電話を掛けること自体が手間です。例え自動化させても、電話認証が出た段階で速度的に不利になることは間違いないので、電話認証が出たときは厳しいかもしれませんが、自動化によってストレスフリーになることをモチベーションとしています。

スマホ側のセットアップが完了したら、次はBroker側の準備です。

https://cloud-intl.emqx.com/console/deployments/new
上記リンクから、無料開始ボタンを押して、アカウントを作ります。

個人情報を入力する欄がありますが、クレカは登録しなくても使用できます。

無料枠は個人利用としては使いきれない程の上限幅なのでクレカを登録する必要は無いでしょう。

アカウントを作成したら、ログインします。
https://cloud-intl.emqx.com/console/

Console画面に行くと、接続先が表示されているので、便利ツールの接続先に指定します。

左側の認証メニューから、ユーザを作成して、便利ツールのユーザとパスワードを指定します。

便利ツールアプリ側でConnectボタンを押して、接続されたら、動作確認をしてみましょう。

サーバ側Consoleメニューのオンラインデバッグを開きます。Connection Nameは適当で構いません。

Topicは、便利ツールのTopicと合わせる必要があります。tel:の後に電話番号を入れてPublishボタンを押してみてください。スマホが自動的に電話発信されたら成功です。

チケットぴあ自動購入ツールの対応後に続きを書きます。

チケットぴあCloakの対応は結構きつかった

リストック監視はいつ来るのか分からない点と、今回の様に、普段出ない画面がプレミアムチケットのときだけ出現するというのがあると対応が厄介だ。

以前からCloak対応して欲しいという要望があったのだが、先着で取れば良いのでは?と思っていたが、時代はそうじゃないことに今回初めて気づいた。

転売禁止の法律が出来てから、チケットは電子的なやり取りに変わっていたのは知っていたが、流通自体も変わっているのは知らなかった。。。

今回は長期にわたってリストックし続けるという性質があったお陰で、苦労はしたが結果は残せた。

Cloakの画面にチケットがあるのは新鮮だ。。。

1枚チケットでも2枚チケットでも対応しており、2枚目は、BOTの右側に個人情報を入れておけばOK。
残件として、電話認証を自動化するAndroid用のアプリの開発が残っている。Google Playには置かずに、ローカルからインストールする形にします。
※iPhone用は作りません

次は、Global interparkを対応します。
Pythonはちょっと弄りたいときに手軽に作れるのが気持ち良い!!

最新フレームワークに対応していきます

当社が使っているフレームワークのメジャーバージョンが9年ぶりに更新したため、それに対応するために調整していましたが、遂に対応させることができたため、第1段としてチケットぴあ自動購入をリリースしました。

チケットぴあ自動購入は、ぴあサイト、チケット大相撲、piaspサイトの3つのサイトに対応していますが、そのなかでぴあサイトだけは自動購入中にブラウザ画面遷移を挟みます。そのブラウザ画面遷移の動作が旧フレームワーク版と同じパソコンもあれば、遅くなるパソコンもあり、その理由が分かっていません。

旧フレームワーク版と新フレームワーク版は混在でも動作するように設計しているので、新フレームワーク版をインストールして頂き、動作状況を報告してください。
ご協力のほど、よろしくおねがいします。

少し時間に余裕ができたので色々書きます

子供がいると、面倒を見ない訳には行かないのでやりますが、やりだすと切りがないので自分の時間を捻出するのがとても大変なのを身に沁みている状況です。
子供が大きくなるにつれて時間が取れるようになってくると思うので、あと1~2年は、上手くやっていくしかありません。

前置きはさておき、今日は奥さんと子供がいないので、久しぶりにのんびりできています。なので、思っていることを色々書いていこうと思います。

私は組織が嫌いです。
組織が嫌いというより、組織に染まる人が嫌いです。
組織の中に順応できるようになると、あたかもその組織の力を自分の力と勘違いする輩が一定の割合で必ず現れます。
私はこういう人になりたくなかったし、ある意味どうでもよかったので、昔は自分の意見はあまり主張してきませんでした。
最近は、自分に実力がついてきたことで、染まった輩に対して圧力を掛けるようになりました。染まった輩は実力が俺より上ではないので反論することはありません。
染まった輩は、会社の売上にはあまり貢献してはいないけど、組織には順応できているので、首を切られることもなく、ずっとその座を守り続けるために力を注ぐのでしょう。こういう人が増えたから、日本の経済成長率は、先進国の中でも最下位になり、給料も年々下がり続けているということなんだと思います。

今の小学生は、我々の世代と比べても少し難易度が高いことをやらされています。小学1年生で既に漢字を習っていて、うる覚えですが、私が小学1年生のときには漢字まで行かなかったように思うのですが。。。宿題も毎日出ていて、色々詰め込まされているなぁという印象を受けます。

橋本首相か小泉首相か忘れましたが、ゆとり教育を経て、世界情勢もリーマンショックがあり悲惨なものだったので、日本の経済がどんどん悪くなっていきました。そういう経験があるからなのか、今の小学生は英語の科目も含まれていて、再び日本が海外で活躍できるようにという思いが伝わってきます。

インターネットの世界では、アメリカの力は今もなお絶大です。Googleを始めとして、色々なことがアメリカを中心に回っているのは今も変わりありません。ブラウザではシェアが高いのはChromeですし、マイクロソフトも既にChrome技術を取り入れています。
Chromeを使ったGoogle関連ページは、httpという通信規格を発展させたquicというプロトコルが既に動いています。インターネットページ閲覧をより高速化するための規格でhttp/2を更に発展させたものです。
こういうことは、表面上では変化がないことなのでほとんどの人は知る由も無いですが、技術は常に発展しています。

当社の製品もインターネットを使ったものなので常に新しくしていく必要があるのですが、なかなか追いついてないのが現状です。
ですが、時間を作ってはアップデートを行っており、近いうちにチケットぴあの新ブラウザ対応をリリースします。
また、以前からご利用頂いているユーザからticketbookの対応を依頼されており、こちらも年内にはリリースできるように動いています。