はじめに
そういえば、WebViewの練習で作ったメモアプリについてまだ記事にしてなかったなと思ったのでメモします。
GitHub: https://github.com/kojix2/memo.cr
Crystalで気軽にデスクトップアプリ作りたいと思ったら、私が作ってるお手軽派の uing とか、本格派の gtk4 とかあるわけです。
が、CrystalだとWebアプリ作りたい人も多いから、WebView使った方が資産使えるんじゃないか、と思ってやってみたわけです。
個人的にはWebアプリとかJavaScriptとか全然わからないので、気が進まなかったわけですが。
WebViewとは
そもそも論として、WebView界隈って概念がごちゃごちゃしてよくわからんですよね。
ElectronとかTauriとか有名ですけど、あれはレベルの高い話で、実際にはそれぞれのOSが提供しているブラウザっぽいコンポーネントとか呼び出してて、Crystalからだと、もうちょっと低いところからライブラリを使わなきゃいかんわけですね。
ほんで、WebView っていうクロスプラットフォームのライブラリがあって、これをCrystalから使います。
使った技術など
ぶっちゃけ全部AI頼みです。Webアプリとか自分で作ったこと一回もないから1、出来るわけないだろと。
CrystalはそんなにWebアプリに向いている言語ではないのですが、ユーザーはRubyから流れてきた人たちが多く、Webアプリを作りたい人は多いんですよね。それでライブラリはそこそこ充実しています。
が、私は詳しくないので常に kemal を使います。
kemal
kemalっていうのは sinatra とか Flask みたいなやつで、テンプレートには ERB のかわりに ECR を使います。
なぜ、kemalを使うかというと、Web技術に詳しくないから、なるべく単純に ECR のテンプレートで済ませたいと考えているからです。
自分で書くのではなくAIにもっぱら書いてもらいます。だからなるべくシンプルでAIが書いた内容がすぐ理解できる方がいいです。
crystal-db
それから、Crystal は Active Record とか、めっちゃ苦手ですよ。そこは完全にRubyとか動的言語の領域ですよね。Crystalに勝ち目はない。Sequel みたいなライブラリをCrystalで作ることはできません。
CrystalがORMに弱いのは、そもそも静的言語であることと関係が深いと思っています。実は私、Crystalは静的言語だから良いとか全く思っていません。高速だから好き。もし、Crystalと同じ速度のRubyがあったら、Ruby使います。細かい記法はCrystalの方が合理的なところも多いけど、動的メタメタメタプロが動く方が先進的に決まってます。だいたい、今のRubyって動的さが足りてないと思いませんか?
ふう。。。
このあたり、多分一般的なCrystalistsとは話が合わないです。
まあ、どっちしろ今はAIが書いてくれるから関係ないです。
今回は小さなデスクトップアプリなので sqlite を使いました。
このあたりの領域は、頑張っているユーザーがたくさんいるので、Crystalのライブラリを信じていいはずです。(※Crystalのライブラリは最新のCrystalに追従できていないことがよくある)
実装で詰まったところ
全部 AI にやらせているので記憶が薄いのですが、だいたいこのセッティングでアプリ作っていて特に詰まるのは JavaScript のまわりの気がします。クリックしたのにデータベースに反映されないとか、そんな感じ。
だから JavaScript の知識がある人は有利だと思います。僕はないです。
あと、こういうアプリはマルチスレッドにして -Dpreview_mt でビルドしないと動かないのですが、
まあ、そのあたりは ExecutionContext とか日進月歩で改善されつつあるんで、知識の問題であって、動作的にはそんなに心配ないと思います。
AIのコメントによると、生WebView使う方法は、Tauriと比較して一番薄いのがセキュリティーの部分っぽいです。そこは個人がデスクトップで使うメモアプリだし気にしないことにしてます。
人間は未知のセッティングを頑張る
こんな、なんでもAIにやってもらったら、あと人間は何をやるのって感じなんですけど、実は結構やることはあります。っていうのは、CrystalとWebViewでデスクトップアプリ作るのって、未開の地なんですよ。
やってる人間がすごい少なくて、GitHub見ても、別にサンプルコードとかほとんどないわけです。そもそもCrystalがWindowsでまともに動くようになったのは最近で、ノウハウの蓄積とかない。AIはすごいコピペマシンという言説もあながち嘘ではありません。誰もやってないか、やってる人が少ないところは、一発でうまくいくわけもなく、試行錯誤する必要があります。
そこで、AIにいろいろ質問したり命令したりしながら、Windows / MinGW などのアウェイ環境でも動くようにするわけですよ。
まあ結局AIにやらせるわけですけどね、正直めっちゃ面倒くさいっす。
いまのところ build-mingw.sh とか build-mac.sh とか build-deb.sh みたいプラットフォームごとにビルドスクリプトにしてるけど面倒くさいっすね。
それから、Inno Setup とかにパッケージ作らせたりします。
まあ Mac でも DMG にしたり、Linux でも deb にしたりも頑張ればできます。その際に静的にリンクするか、共有ライブラリを同封するかの議論もあります。
まーこういうのって、普通に面倒くさすぎて誰もやらないですよね。Tauri とか Qt とか使ったらよしなにクロスプラットフォームやってくれるのかな??
自分でもアホだと思いますが、今は時間かけてAIに命令しまくって、できない理由聞きつつ、トライしてればいずれ有限時間内に完成するので、それでもいいかな~と思ってます。Crystal好きだし。
そして、Crystalで作ったデスクトップ自作アプリを常用するのは割と満足感があります。
私はとくに Macでこのメモ帳を普段使いしています。
なになに、このアプリの元になってる本家Appleのメモアプリ使えばいいって?
……
そんなに合理的なこと言われたら、何も言い返せないではありませんか……。
追加のポエム
今回の記事も十分にポエムだと思いますが、なんでこんなことやってるのかとか、さらに背景を知りたい、ポエムが読みたい人はこっち読んでください。
この記事は以上っす。
-
AIに作らせてるWebアプリはある。 ↩
