daisy_sequenceについて 動機・リリースまで・今後

daisy_sequenceについて、まずは動機・リリース前後の振り返り・今後について、ポエムと時系列を書いておきます。
ドキュメント作成の前準備として、また忘れないうちに備忘録として。

daisy_sequenceについて

 daisy_sequenceはマルチプラットフォームなGUIシーケンス図エディタです。フリーソフト。オープンソースにはしていませんがソースコードは読んだりコントリビュートすることができます。

本記事を書いた時点で、以下の特長を持っています。
  • マルチプラットフォーム(Windows/Mac/Linux)
  • 印刷/HiDPIにも使えるSVG/PNG書き出し
  • CLIからの書き出し処理によるCI連携が可能
  • PlantUML書き出し
  • バージョン管理しやすいJSONテキストベースのネイティブファイルフォーマット

# 開発の動機

最終的にはLinuxでの使用を含め、自分で自由に改変できる気楽なシーケンス図エディタが欲しかったので書きました。






実際に作り始めるまでにはもうちょっと長いストーリーがあり、動機は複合的です。
- Aster* Community(以下Aster)がversion7から有償版に移行した。
- 複数Elementのrotateを気合で実装してしまったために、vecterion_vgeプロジェクト(以下vecterion)が行き詰まってしまった。
- lina_dictoプロジェクトが一段落して、electron(node.js)は速度が出ることがわかった。もう少し高度なGUIアプリケーションを試したくなった。

AsterはGUIによる高度なUMLエディタです。クラス図とかも描ける。
vecterionでもわざわざWindows環境を用意して使った(vecterionはUbuntuで開発している)くらいなのですが、無償利用できるのはversion6.9が最後となりました。これはそれなりに昔の話で、当時は自分のところでは6.9を引き続き使わせてもらおうということで決着していました。
vecterionは自作のベクタグラフィクスエディタです。マルチプラットフォームで、C/Gtk3で開発しています。
ベクタグラフィクスエディタを開発するにあたって、最大の問題は高速なラスタライザの実装なのですが、Gtk3がバックエンドでも使っているCairoライブラリが実用的に高速なラスタライザで、今のところ高速化を意識しない設計で書けています。
vecterionベクタグラフィクスエディタ
とはいえ、Cairoはあくまでラスタライザなので、ドキュメントの管理とレンダリングの指示はvecterion側でするわけで、そこが複雑化してしまいました。良くなかったのは「複数Elementのrotateを気合で実装してしまった」ことで、ここでいう気合とは、ドキュメントも設計もなくとりあえず動くまで実装をトライアンドエラーしてしまった、という意味です。これはわりと真剣に反省してます。
で、vecterionが行き詰まる前後に、lina_dictoシリーズが始まりました。これはElectron製の日本語とエスペラント語の辞書アプリケーションで、後に英語版を作りました。Javascriptエンジンで辞書データを回すことが最大の懸念でしたが、実用的な速度が出て、以前はこてんぱんに言われていたJavascriptを見直しました。
lina_dictoは当初の目的を叶えるすばらしい辞書アプリケーションとなり、開発は一段落しました。

lina_dicto辞書

次に何をしようかなと考えたとき、まだvecterion_vgeのエンジン改修は荷が重いだろうから、もう少し規模の小さいものをやって慣れよう、ということにしました。
というわけで、vecterionの知見を活かしつつ整理でき、lina_dictoよりElectron利用として発展的な課題になる、規模が小さいGUIエディタアプリケーションとして、シーケンス図エディタdaisy_sequenceを始めました。

# リリース前後
土日で実証モデルを構築しました。具体的には、JSONオブジェクトによるシーケンス図データ構造と、それを元にしたSVGエンジンによるシーケンス図描画、描画速度がユーザの編集操作に耐えることを、モックで確認しました。
02/03にgitリポジトリに最初のコミットをしています。開発開始はこの日のはずです。
03/01に最初のリリース。最低限の実用化に一ヶ月ということになります。
04/07頃に(当初の予定になかった)PlantUMLのエクスポートを追加しました。

本アプリケーションは実証モデルの頃から、必要十分なフォーマットのSVG、有用なラスタライザ・ライブラリのSVG.js、そしてChromeの高速なSVGレンダラ実装に支えられています。
Cairoも良かったのですが、Javascript動的変数とSVGの組み合わせは、GUIエディタのモックを作るにあたって強力です。

daisy_sequence実証モデル

daisy_sequence実証モデル



最初のリリースにおいて最大の問題はアプリケーション・アイコンでした。アイデアが早く思いついていれば、リリースは5日くらい早かったと思います。もちろんその間もコードを書いていたので機能的にはアップしていますが。
以前から、自作アプリケーションのアイコンは自分でデザインしています。得意というほどではないですが、フォントとか作っていたこともあるので。現在のアイコンはわりと気に入っています。

最初のリリース後、スラドの日記に書いたり周囲に見せたりして、いろいろ反応をいただきました。
その中で多かったのはPlantUML対応でした。
(Asterのネイティブフォーマットが読み書きしたいと言われたらどうしようと思っていたのですが、それは今の所まったく要望が無いです。)
また、自分しか要望していないですが、CI/Makefile連携のためにコマンドラインからのエクスポート機能を付けました。内部的にはテストにも使っています。

# 反省点
PlantUMLについて、事前にもっと調べておけばよかった。

# 今後について
- 本アプリケーションで描いたシーケンス図の見た目が、必要十分ではありますが、良いとは言えないので良くしたい。個人的に一番の問題。残念ながら自分では良いデザインを思いつかなかったので、できればどこか自分以外の外部にデザインを依頼したいのですが、その費用が捻出できるかどうかはちょっとわかりません。
- PlantUMLへの対応強化はちょっと考え中。インポートはPlantUMLの記法をフルサポートするのが厳しそうなので、ちょっとズルいショートカットで対処できないかなと、これは妄想段階ですが考えています。
- UML図フルサポートは大変なのでやらないつもりですが、最低限クラス図との連携はあると良いというアドバイスを頂いたので、これはいずれやれるといいなと思っています。
- 取扱説明書を書く。

開発自体はシーケンス図エディタが書けて、一段落したつもりです。今後については、何か新しいアイデアを思いつくかどうか、ユーザがどれくらい増えるかどうか次第ということにしています。
いろいろ手を入れたい気持ちはあるのですが、他にも書きたいものや作りたいものがあるので。

# おわりに
というわけで、自作シーケンス図エディタでした。今回のように一ヶ月くらいで作れてしまうものもあるので、みなさんもっと軽率にGUIな開発支援系エディタとか書くと良いと思います。




次はdaisy_sequenceの設計的なこと、技術的なことなどについて書きます。

jsのasyncなメソッドをfor,loop内で同期的に呼び出す

async/awaitを使ったjavascriptのコードをnodejsで使用する際、非同期呼び出しとなっている関数をloopの中で動機呼び出しする方法。 この前かなり真剣にPromiseのドキュメントを読んで、これをいずれ使うことになるのか、使いこなすの大変そうだな、と思っ...