前からこのブログで書いてましたが、SashimiというCMSを作っています。
これはWordpressが使いにくいと思っているためです。Wordpressの解決したい点は、主に「初心者でもかんたんに扱える」というのを優先している(ように見える)ため、Web関連の技術をある程度理解している人にとっては冗長と思えたり不足していると思える機能が多いからです。具体的には、
- コンテンツのパスを自由に決めれない
- コンテンツの一部または全部をエクスポート・インポートする標準の手段がない
- プラグインが干渉する
- コンパイルしないためエラーを含んだコードを保存してしまうとサイト全体が落ちることがある
- コンテンツのパスを自由に決定できない
- エディタ画面が非常にプア。画像のエディタ画面へのコピペ機能とサイズ違いの画像を生成する機能と簡易編集機能は必須(一応あるがボタンをプチプチして作る必要があり非常にきつい)
- めちゃくちゃ遅い。一般的なサーバーで秒間数十アクセス。キャッシュしてチューニングすると今度はいろんな機能がちゃんと動かない
- PHPでテンプレートを書くのがしんどい
- SCSSが標準で使えない
- 一方でメニュー、リンク、GUIテンプレートエディタなどはWeb関連技術を理解している人にとっては冗長
- 学習コストが非常に高い
というあたりです。個人的には特にエディタ画面への不満と動作速度への不満が大きいです。
ということでSashimiを作ってきましたが、平日は仕事、休日は家族対応で全然作る時間がなかったです。かれこれ作ろうと決意してから2年位経ってしまいました。このままでは本当にいかんと思うので、週1回は開発日記を書くと決め、定期的に進捗を報告することとしたいと思います。
あと、この日記では初心者でも理解できるように説明を増やそうと思ってます。
で、名前ですがSashimiからIkuraに変えました。なぜか?私は海産物で食べられないものが多く(光り物、エビ、カニ、うに、活造りなど)、どちらかというとイクラのほうが好きだからです。まあ名前は何でもいいと思ってるので適当です。
第一回はとりあえず使ってる技術スタックの紹介を。
- Akka HTTP
- Twirl
- Scala
- Vue
- Element UI
- vue-element-admin
HTTPフレームワークの選定は非常に紆余曲折ありました。最初はFinagleを使おうと思っていたのですが、アイドル時にもCPUを10%ほど消費し続けるのがなんとなく嫌でやめました。コードを追っていくと、どうもレスポンス速度を高めるため?に一部でビジーループを採用しているみたいです。別にそれでも良いかなぁとは思うものの、個人的には「安いサーバーでも快適な速度が出る」というのを重視しているため、例えばAWSではt3インスタンスなどで利用することを想定しており、すると無駄にCPU資源を消費してほしくないなというのがあります。(t3インスタンスはCPUクレジットが枯渇すると遅くなる)
次にUndertowを使用しようと決め実装を進めていたのですが、これは書かなければならないコードが結構多く、API的にもどこからHTTPヘッダを持ってくるのかとか、Bodyをバイナリで読むにはどうしたらよいかなどが分かりにくいということもあってやめました。パフォーマンス的には非常に優秀なので悩みましたが…。
今は多分一番使い慣れてるAkka HTTPで実装しています。
テンプレートエンジンにはTwirlを採用しようとしています。TwirlはPlayFramework(Scala)で使用されてるテンプレートエンジンで、世界一書きやすいテンプレートエンジンと思っています。
Vueあたりは管理画面で使用することを想定しています。
今取り組んでる課題はTwirlテンプレートををライブでコンパイルしてすぐに反映するというあたりです。
TwirlテンプレートはSbtプラグインとして動作してバイトコードにコンパイルされる…というのが普通の使い方ですが、これをサーバアプリケーションの再起動なしにできるかなぁと。Sbtプラグインの仕組みも知らないですがなんとかなるかなーとは思ってますが。