Inkdropのロードマップ vol.5

Inkdropのロードマップ vol.5

Inkdropのロードマップ vol.5

個人開発者として成功し続けるための戦略

英語で先に書いてから日本語に訳しています

どうもみなさん、お元気ですか。Inkdrop作者のTAKUYAです。先月、Inkdrop v5がリリースされました。よりあなたのノートの整理を支援する新しい機能や改善がふんだんに盛り込まれました。みなさんが気に入ってくださっているのをみてとても嬉しく思います。そして今、ロードマップvol.4がついに完走を迎えました。めでたい。では早速Inkdropの未来について語りましょう。

TL;DR

  • 総売上は2,000万円を超えました
  • 僕は自分と似ている人を助けます
  • 僕はコア体験に集中します。そしてあなたの好きに拡張できるようにします
  • モバイルプラットフォームで1stクラスの体験を実現する

なかなか遠いところまでやってきました

Inkdropはロードマップを毎年アナウンスしています。今回のロードマップはVolume 5を数えます。5です!なかなかの所にまで来ました。最初のロードマップを発表したのは4年前になります。それもこれも支えて下さっているみなさんのお陰です。ありがとうございます。売上は幸いコロナ時代にも関わらず安定しており、総売上は2,000万円を超えました 🎉

Stripeのダッシュボード

その売上で開発機にMac Proを買うことが出来ました。初期の頃の事はよく覚えています — — 沢山の人が、僕が個人開発だから何年持つか分からないし信用出来ないという理由でInkdropを使いたくないと言っていました。でもご覧の通り、僕もプロジェクトも健在しています。これはInkdropが突然あなたのデータと共に消え去るなんて事はない裏付けとなるでしょう。

僕は自分と似ている人を助けます

なぜこの僕が燃え尽きずにこのプロジェクトを何年も続けられたかというと、その大きな理由はメインのターゲット層に大きく関係しています。僕は自分と似た人に向けて作っています — — Markdownをプレーンテキストで書き、個人のメモ用途で使いたい人たちです。つまり、これはとてもニッチな製品です。万人向けでは決してありません。なので、今まで沢山の機能要望に対してノーと言い続けてきたため、沢山の人がInkdropから去りました。自分が使いもしない機能を追加する代わりに、コアの機能の改善に集中して取り組み続けてきました。これが走り続けるために最も大事なファクターです。売上を倍にするため、ターゲット層を広げることも出来たでしょう。例えば、Markdownとは何かすら知らない初心者のプログラマーは世の中にごまんといます。彼らをターゲットにするのは確かに良さそうです。でももしやったら、すぐさま何が分からないのか分からないような問い合わせに埋もれるのは間違いありません。それらに答えようとしても、彼らは僕の言ってる事がさっぱり分からないでしょう。謎の理由で怒った人たちの対応にも追われることになります。そうして僕は疲れ果てて、開発の時間をなんとかこじ開けるために、ユーザサポートを任せる人を雇う事になります。しかしそれでは解決しません。サポートチームの人材を教育し、マネージメントする必要が生じます。そして倍増したはずの売上は彼らの報酬に消えます。この道を辿らなくて本当に良かった。僕は小さくある事を愛しています。小さいという事は、自由な事です。

つまり、僕は万人を喜ばせる事はしません。それが走り続けるために重要な事です。でも、あなたの声は喜んで聞きます。過去のリリースノートをご覧ください。各リリースで、コントリビュートして下さった人をクレジット記載しています。ご覧の通り、多くの追加された機能と修正された問題は、ユーザの皆さんからリクエスト・報告いただいたものです。それはInkdropがあなたと共に進化してきたという意味です。僕は全てを把握している訳ではありませんから、あなたのフィードバックはいつも僕に考えさせ、新しいアイデアを与えてくれます。最初は機能要望にノーと断っても、他の人からも同じ要望を受け続ければ、再検討します。なので、ぜひ遠慮せずにあなたの考えを聞かせてください。いつもフィードバックありがとうございます!

僕はコア体験に集中します。そしてあなたの好きに拡張できるようにします。

機能要望は当初から変わってきています。v5にもなり、基本的にノートアプリとして基本的に必要な機能は揃いました。ユーザさんがそれらに満足しているからか、最近では特定の用途に特化した提案をしてくる傾向にあります。それは僕が正しい問題に取り組んできている事を示します。それらの正しい問題に取り組めば取り組むほど、人々はユニークなアイデアを思いつくようになります。もしアプリが正しい問題を解決していなければ、あなたはアイデアを提案する前にとっくに使うのをやめてしまっているでしょう。しかしながら、一部のアイデアはアプリの基本コンセプトに影響を与えるため、残念ながら受け入れられません。同時に、僕らには沢山の個人的好みとユースケースがあることも理解しています。そこでこれらの要望に対しては、プラグインで実現できないかまず考えます。Inkdropは様々な機能が実現できるパワフルなAPIを提供しています。プラグインの数は既に100個を超えました。素晴らしい。彼らの貢献のお礼にプラグイン開発者ライセンスを提供しています。なので、僕は特定のユースケースのための機能を付けるのではなく、パワフルなAPIを提供する事に集中します。v5では、これまでCLIでしか出来なかったプラグインのインストールをもっと手軽にできるようにGUIを備えました。

一方で、このようにアプリをシンプルで簡潔に保とうと努力していますが、既に一部の人たちは本アプリが「いろいろ出来すぎる」と言っています。これにはちょっと同意します。更なる機能の対応は、必ずしもすべての人にとっていいニュースとは限りません。僕はこのアプリをAdobe製品のように勉強しなければ使えないような膨れ上がったものにしたくありません。最良のユーザ体験とは、ユーザがドキュメントを読まなくても使える事です。

という訳で、僕はコア体験に集中します。そしてみなさんが自由に拡張できるように配慮します。

モバイルプラットフォームで1stクラスの体験を実現する

オーケー、では僕はこのロードマップでどんなコア体験に取り組むのでしょうか?それはモバイル版です。これまでも各ロードマップでモバイル版の改善を掲げて取り組んできましたが、その完成度はデスクトップ版と比べてもまだまだ劣っています。iOSとAndroidの両方において、パフォーマンスや編集体験に深刻な問題が未だにあります。それらの問題を解決して、モバイル版でのノートの読み書きをもっと快適にしたいと思います。では行きましょう。

E2EEでの画像読み込みパフォーマンスを改善

モバイル版はReact Nativeで開発されています。そのお陰でデスクトップ版とJavaScriptの大部分のコードベースを共通化出来ています。個人開発者として、それはモバイル版を素早く開発するには素晴らしい恩恵でした。しかしながらReact Nativeも銀の弾丸ではありません。画像や暗号といったバイナリ処理にはめっぽう弱いという点があります。例えば、PouchDBをハックしてRNで画像の添付を取り扱えるようにしました。更に、RNはNodeJSにある crypto のようなモジュールは提供しません。そのため、モバイル版でEnd-to-End暗号化に対応するためにreact-native-cryptoという pbkdf2 のような暗号系関数をshimしてくれるライブラリを使わざるを得ませんでした。それは全てJavaScriptで実行されるため、一定量のデータを取り扱うにはあまりパフォーマンスの点でよくありません。これらのRNの弱点はパフォーマンスにおいて以下のような問題を引き起こしています:

もし大きな画像をノートに添付していた時、その読み込みはとても時間がかかるか、最悪永遠に読み込まれません。その場合悪いことに、JavaScriptのメインスレッドをブロックするので、アプリそのものが反応しなくなります。

より高速かつ非同期的な画像と暗号データの処理の実現に向けて、ネイティブモジュールを作って解決したいと思います。そしたらreact-native-crypto の依存も無くせるかもしれませんし、アプリの内部がよりシンプルになります。

iOSとAndroid向けのネイティブなMarkdownエディタの実装

モバイル版の現在のMarkdownエディタの実装はWebView内でCodeMirrorを動かして実現しています。CodeMirror自体が苦しんでいるように、WebViewはタッチスクリーン上でのエディタの提供には適していません。僕はAndroidとiOS上でCodeMirrorを動かすためにいくつかの即席パッチを当てています。それでも尚、以下のような問題に直面するかもしれません:

残念ながら、上記の問題は現在のWebベースの実装では解決できません。いろんなエディタライブラリをiOSとAndroid上で試しましたが、どれも基本はPC向けに設計されているため、上手く動きませんでした。その上、Androidはauto-correctなどの入力補助機能を制御するためのソリッドなAPIを提供していません。AndroidはCodeMirrorのステートを頻繁に荒らします。そのため、モバイルデバイス上での編集体験はひどいものとなってしまっています。

新バージョンのCodeMirrorが目下開発されており、彼らはタッチスクリーンもサポートするよと目標を掲げていますし、僕らはそれに期待することも出来るでしょう。しかしながらプロジェクト開始から既に2.5年経っており、ETAは未だ不明です。Xi Editorの開発者が回顧するように、コードエディタを作るのはめちゃくちゃ大変で時間がかかります。

CodeMirror.nextはまだまだ初期開発段階のようなので、別の道を検討したいと思います。それはネイティブのMarkdownエディタを開発することです。はい、それは大きなチャレンジになるでしょう。上手くいくかどうか分かりません。でも聞いてください、その実現のために良さそうなアイデアがあります。こちらが今考えているネイティブエディタのアーキテクチャです:

iOSでは UITextView 、Androidでは EditText をベースにして、バックエンドとしてCodeMirrorを動かしてシンタックスのハイライトや入力補助を行うというアイデアです。このアイデアはHighlightrというコンポーネントを見つけた時に思いつきました。これはhighlight.jsをコアに使っています:

CodeMirrorの方がIncremental Parsingに対応しているのでより良く動くはずと考えます。現行のモバイル版にてダーティ・ハックを既にしているため、CodeMirrorの内部構造は既に少し理解しています。HighlightrはHTMLをNSAttributedString に変換していますが、それはパフォーマンス面であまり良くないでしょう。CodeMirrorをバックエンドにすることで、シンタックスのメタデータをより効率的かつインクリメンタルに取得できます。その方が良さそうです。

これはReact Nativeのコミュニティへ恩返しをする良い機会だという事に気付きました。彼らも同様にソリッドなコードエディタコンポーネントを求めているはずだからです。Markdownだけでなく、HTML, CSS, PythonやRubyなどを書く用途にも使えます。もしこの試みが成功してオープンソースとして公開したら、コミュニティからそれなりの注目が得られるのではないかと思っています。それはInkdropのマーケティングとしても良さそうです。

AndroidのEditTextとiOSのTextKitをいじって、軽いPoCを作り、いけそうだと判断しました。トライしてみましょう。

シェアターゲット&シェアエクステンション

僕らはウェブ上やアプリ内で様々な情報のピースを見つけます。それらを素早くストックできることは重要です。その実現には各プラットフォームでネイティブ実装が必要となります。ただし、ウェブクリッパーではない事に注意してください:

PDFとHTML形式のエクスポート

よりよいエクスポート対応は前回のロードマップに掲げていました。上記のようにネイティブエディタの実装を検討していたので、これはまだ対応していません。今回のネイティブ実装が上手くいったら取り組みます。

ノート内検索

長いノートの閲覧に必要です。

キーバインディング

ハードウェアキーボードを使っている場合、キーバインディングは素早いアクションの実行が出来るため、生産性の向上に大きく寄与します。しかしRNはキーバインディングに対応するAPIを持っていないため、各プラットフォームに特化したネイティブ実装が必要になります。

APIの改善

Command palette

Inkdropには沢山のコマンドを備え、キーストロークに割り当てて使うことが出来ます。でもAtomやSublime Textのようにコマンドパレットがあれば、どんなコマンドがあるのか見つけやすいですし、キーマップを設定しなくてもすぐに試すことが出来ます。

Let’s make it together

最後までお読みくださりありがとうございます。Inkdropをより洗練し成熟させていくためには、あなたのサポートが必要不可欠です。ぜひロードマップに関するあなたのご意見をお聞かせください。

Read more

貫禄を捨てて愛嬌で生き延びろ!40代オッサンの生存戦略

貫禄を捨てて愛嬌で生き延びろ!40代オッサンの生存戦略

どうもTAKUYAです。 つい先週(11月19日)に誕生日を迎え、41歳になりました。40代と言うのは若い頃には想像もしなかった年代で、どう生きれば良いのかというイメージがあまり具体的に湧かない、曖昧な年齢ではないでしょうか?自分の父親を想像するも、日中はいつも仕事でいなかったのであまり参考になりません。 自分は個人開発で生計を立てていて20代、30代で積み上げて来たものが上手く実を結んだおかげで今の生活があります。育児にも、いわゆるサラリーマンよりかは柔軟に参加できていて、子供との時間も沢山取れています。ママ友も出来ました(迷惑かけっぱなしですが)。 本記事では、そんなライフスタイルを送る自分が40代で大事にしたいことについて書きたいと思います。タイトルにもある通り、結論から言うとそれは「愛嬌」だと思います。以下、中年男性の愛嬌の重要性について説明します。 TL;DR * 「貫禄が出てきたね」と言われたら注意 * 笑顔を作れ。オッサンがムスッとしてたら普通に怖い * 謙虚に振る舞え。実績を積むと周りが萎縮する * ギャップ萌えを活用しろ 「貫禄が出てきたね」と言わ

By Takuya Matsuyama
過集中を避けるための働き方とルーティン(二児の父ver.)

過集中を避けるための働き方とルーティン(二児の父ver.)

どうもTAKUYAです。 先日書いた通り、最近個人開発を頑張りすぎて体を壊してしまいました。 その原因の一つが過集中癖です。自分はもともと何かに集中すると周りが見えなくなる傾向があり、それがたまに私生活にも影響を及ぼします。同じ失敗を繰り返さないためにも、ちょっと働き方を再設計したいと思います。 働き方に対して他人の指摘をアテにしない 自分のようなフリーランサーまたは自作サービスで生計を立てている人は、時間の使い方を自分で自由に決められます。その反面、どこまでも極端な働き方が出来てしまい、それを指摘したり止めてくれる人がいないという欠点もあります。自分には妻がいますが、全く違う業界なので自分の作業ペースがどのようなものか具体的に把握できません。 「疲れた!」と言えば「休んだら?」と言ってくれますが、働き方やペース配分などにまで口は出しません。なので、他人のストップサインはアテに出来ません。 (心理カウンセラーの可能性を別途検討中) 最近子供が生まれたので厳密なルーティン実行は出来ない 一日を時間単位・分単位で区切ってルーティンを組むのは気持ちがいいですよね。僕もそうしたい

By Takuya Matsuyama
なぜ体を壊してまで個人開発を頑張るのか?自尊心の欠如や過集中癖と向き合う

なぜ体を壊してまで個人開発を頑張るのか?自尊心の欠如や過集中癖と向き合う

どうもTAKUYAです。最近、個人開発を頑張りすぎて体調を崩してしまいました。アトピーが猛烈に悪化して、QoLが著しく下がってしまいました。まだ療養中ですが、毎日1万歩以上歩いて、徐々に回復しつつあります。 この過ちを繰り返さないためにも、自分は一体何が原因で頑張りすぎてしまうのか?という事について深堀りして考えてみたいと思います。また、個人開発におけるメンタルヘルスはあまり語られていないトピックだと思います。本記事が、同じように仕事を頑張りすぎてしまう人の助けになれば幸いです。 TL;DR * なんとなく続けていたソフト開発が自分を救った * 原体験が歪んだモチベーションを生んでしまった * 親が引くほどの過集中癖がある * 生得的な直せないバグと考えることにする * アプリの成功に関係なく、自分をあるがままに受け入れる * 挫折しないのは、なんだかんだで前向きだから * ユーザさんから「休め!」と叱咤された * 人生は長い。個人開発なんかで死ぬな 自己の原体験について振り返ってみる 個人開発だけで生活するようになって、かれこれ8年ぐらいが経ちます。こう

By Takuya Matsuyama
ユーザサポートの問い合わせを装った攻撃が怖すぎた

ユーザサポートの問い合わせを装った攻撃が怖すぎた

どうもTAKUYAです。個人開発をしていてアプリの知名度が上がってくると、作者個人(あるいはサイト管理人)を狙った攻撃というのをたまに受けます。つい先日も、怖すぎるメールを受け取ったのでシェアします。 件名: Cookie consent prevents platform access Hello, I cannot access use the store. The cookie consent notice keeps appearing and nothing happens once I approve or try to close it, so I’m unable to interact with the website. Please provide guidance on

By Takuya Matsuyama