QtとWindowsと流川ガールズと

Qtと沙織さんのお話。

Creatorも含めてQtでコードを書くと言うのは基本的にプラットフォーム依存を少なく出来る、と言う利点があると思うのだけど、実際は書いてると結構出てくる。別件で書いてるOpenGL周りのコードもQt+Creatorを使っているけど、そりゃあもうね。

なのだけど、saoriに関しては当初から「できるだけQtに依存して同一コードを以って特定環境で動かないところを無くしてみよう」と考えて書いております。まあ、いつまでこれ続けられるかは謎ですけどねえ。
結果、実は現状同じコードでWindows上でも動きます。


素敵ですねえ。
まあandroidは素晴らしいクライアントが存在するから試す気も無いし、アポー系は宗教上の理由で試す環境が無いのでWindowsしか試してませんが、Windwos10のノートPCで出先で思いついた修正をさくっと出来て試せるのはそれだけでも素晴らしいし便利ですねえ。

とは言え、既に問題は見つかっていて、例えばWindowsでQNetworkReply::readAll()が空な場合がある、とかね。色々調べた結果どうも一定データ量を超えるとダメっぽくて、最終的に落ち着いたのが「タイムラインの取得量(limit=で指定するんですが)を若干小さくすることで回避」だったりします。内部バッファ量の違いかなーと思ったりもするんですが、このへんはQtのコード見てみないとなんとも。Windowsの場合OpenSSL周りも別個用意してたりするわけだったりするのでこの辺の差もあるのかも。

もうひとつはまりかけたのが、変数長の違い。
statusのidを保存するのに最初longを使ってたのだけど、どうもWindowsだとおかしくなる、結局qlonglongに落ち着いたのだけど、後で気になってlimit.h見てみたら、linux(64)だとlong=longlong、Windows(64)だとint=long、うおおおい!って感じ。難しい。

まあどこまで頑張れるかは分かりませんが、一応Windowsでもコンパイルして動かしてみてますよと言うお話。

Qtとmastodonと糞コードと流川ガールズと

お久しぶりどころか、あけましておめでとうですが、すっかり春めいてといいますかやや暑い日もあったりする梅雨前のひととき、皆様いかがお過ごしでしょうか。

えーとりあえずmastodonクライアントを昨年から作ってて本当は年末には見せびらかす予定だったんですけど、色々バタバタしまして気がつけばゴールデンウィークですよ。まあいいんですけど。
と言うわけで、機能足らなすぎで作りかけ感満載ですが、

沙織さんです。見ての通りマルチアカウント対応のMDIクライアント。名前の由来は特にありませんが、俺は流川ガールズが大好きです。

現状できることと言うのは本当に少なく、インスタンスに接続して一部タイムラインや通知を読み出すくらいです。Tootもまだ出来ませんし画面には機能しないボタンが並んでいたりしますが、まあmastodonにおけるごくごく基本的な「認証してアクセストークンをゲットしてJSONデータを得る」は実装されております。

コード化結構簡単ですので是非皆さんも手作りmastodonクライアント挑戦して欲しい感じですかねえ。まあ色々勉強になったところもあるので、何回かに分けてこのへん日記にまとめようかな。

以下、認証まわりのコード的な話。

twitterクライアントもそうなんだけど、ぶっちゃけアクセストークンを取得してAPIに正しくアクセスできれば後はデータをいじるだけ、mastodonはJSONでデータくれるのでQtのQJsonDocument他をごっそり使うことで手軽に得たデータを利用できます。素晴らしいですねえ。

ポイントはどうやって認証するのって話ですが、saoriでは

  1. Saoridonクラスでクライアント登録。
  2. SaoriAddAccountDialogで認証、アクセストークン取得。
  3. SaoriAccountに情報を保存、アクセス時もここからAPIにアクセス。

こんな感じの流れになってます。

相変わらずコードにコメントを書かない糞コード書きなのでわかりにくいですが、Saoridon::clientRedistration()でクライアントをインスタンスに登録します。
若干ずるのようなイメージもありますがQEventLoopを回してQNetworkAccessManagerからのQNetworkReplyをその場でもらうと言うテク、これ便利で結構使ってしまいますがさておき。

登録が済んだらclient_secretとclient_idがJSONで帰ってきますので、今度はSaoriAddAccountDialogでアクセストークンを取ります。実際は上のクライアント登録もこのダイアログでやるんだけどね。
Saoridon::getAuthorizedUrl()でURLを作りWebブラウザで開いて認証、コードをコピーしてそれをSaoridon::getAccessToken()で渡すとアクセストークンが返ってくる、と言う手順ですねえ(grant_typeはauthorization_codeです)。SaoriAddAccountDialog自体はボタンを押せなくしたり複雑に組んでありますが、実際に必要なコードはSaoridonの方にほぼほぼまとめられています。

で、client_idとclient_secretからaccess_tokenとれたらそれをSaoriAccountに保存し、実際のAPIアクセスはこのクラスからアクセス、と言う感じです。
アクセストークンはヘッダにぶち込むだけでいいのでSaoriAccount::createHeader()を見てもらえば簡単かと。あとは、mastodonのAPIとにらめっこどぞー、って感じですね。

ここまでくればQNetworkReplyでJSON取れますからあとは煮るなり焼くなり。QJsonObjectで取得してHTMLに整形してQTextBrowserに流しこむ、と言うことをsaoriではやってますが、この辺はまた今度。