とりあえずぐだぐだと現状を書いておくだけの記事。
リポジトリはこのへん。
2018年の夏頃に開発をはじめたのだけど、途中止まってしまって最近開発を再開した。 自分がGitHubのNotificationsから乗り換えるぐらいにはできてきたので、途中経過報告。
使ってみたい人がいたら、声をかけてくれれば使い方を教えることはできる。READMEも書いてあるし動かすぐらいはできると思う。 とはいえ、まだ破壊的変更も入れると思うし自分以外の人が使うには厳しい点も多いから、まだあんまりオススメはしない。
koratとはなんなのか
コラット(泰:โคราช,英:Korat)は、タイ王国に起源を有する、猫の品種のひとつ。
プロジェクトの名前はだいたいネコの品種から取っている。 ただネコの品種ってあまり多くなかったり地名そのままの品種名だったりして、あまり使える数が多くない。悲しい。
グラフ描画ライブラリを作るときはChartreuxって名前にしようと決めている。ただそういうライブラリを作る機会に恵まれなくて困っている。
閑話休題。
KoratはGitHubのIssue Readerである。 GitHubのIssue ReaderといえばJasperが有名であり、Koratも大分参考にさせてもらっている。1 ユーザーから見えるインターフェイスはだいたいJasperと似たようなものになると思う。2 Channel (Jasperで言うところのStream)にGitHubのsearch queryを指定して、それをupdated_at順に並べるアプリケーションである。
何故Koratを作ったのか
Jasperがあるのに、何故作ったのか。
開発をはじめた当初はJasperはクローズドソースで、途中からオープンソースになった。3 Jasperを使っていていくつか改善したいアイディアがあったりして、ただ手が出せなかったから自作しはじめたような気がする。
Jasperをベースに切り替えても良かったのだけど、JavaScriptを書きたくなかったので諦めた。
とは言うもののとくに大きな理由はなくて、作ってみたかったからというのが大きい気がする。
便利機能
現時点での便利機能として、Issueのキャッシュ機能がある。アメリカは遠く、光は遅いので、IssueのURLをGitHubにリクエストしてからブラウザが表示するまでは時間がかかる。 ところがKoratではこれが一瞬である。 Koratはユーザーが見そうなIssueを事前に取得してキャッシュしておくので、ユーザーがIssueを選択したタイミングでは(運が良ければ)HTTPリクエストが走らずIssueを選択できる。
この機能はめちゃくちゃに便利で、私は既にキャッシュなしでは生きていけなくなってしまった。
その反面キャッシュ機能にはデメリットもある。
ユーザーがIssueを開く前にKoratが内部的にIssueを開いてしまうので、GitHub側のNotification機能の未読管理がハチャメチャになる。
そのためこの機能を使うにはGitHubのNotification機能を捨てる覚悟が必要である。あとKORAT_ENABLE_PREFETCH=true
という環境変数のセットも必要である。
Koratにまだない機能
多分そのうち実装する機能
- GUIから設定する方法
- 今は設定はSQLを書いてデータをインサートする必要がある
- デスクトップ通知
- 外部ブラウザでページを開く機能
- ブラウザのヒストリ機能
- コンテキストメニュー
- いい感じのUI
- 簡単にインストールできるパッケージ
- GHE対応
- これは当分やる気がない。設計上 GitHub.com とGHEでKoratのデータベースを共用しなくていいならすぐ実装できると思うけど、どっちのアカウントも使いたいという場合はいろいろ面倒そう。
- GHE使ってる会社で働くことになったら多分実装する
内部実装
Electronアプリとして動いている。またIssueを検索、保存する部分はGoで切り出されて書かれている。4 GoのプロセスとElectronはHTTPとWebSocketでおしゃべりをしている。
Electron側はTypeScript、Reactなどを使って書かれている。 Goに切り出すことでElectronのメインプロセス側のコードをほとんど消せるかなと思っていたけど、BrowserViewの管理とかコンテキストメニュー(まだないけど)とか結構出番はありそうで悲しい。
Goのほうはsqlite3とかechoとかを使って書いている。 SQLを手書きするのがつらくなってきた。今からでもORMとかクエリビルダとか入れたい気がする。
人に使ってもらうインターフェイスがもうちょっとちゃんと整ったらリリースする。今月中にリリースしたい。
-
とはいえ内部的な実装は結構違う。Streamの取得方法もコードを読んでみたらちょっと違う発想でやってそうだった。↩
-
UIをJasperのものをそのまま参考にしたら本当にそのままになってしまったので、これはそのうちどうにかしたい。↩
-
JavaScript書きたくなかったから分けた。↩