[[📒Productivityを上げるために大切な100のこと]] No52. 🥈
----
今までに[[📗何度でも挑戦する]]、[[📗毎年新しい言語を学ぶ]]といった話をしてきたが、そうは言っても**モチベが上がらない..**という人は多いと思う。ただそれは普通だ。
> したい人、10000人。始める人、100人。続ける人1人。
[[女子高生サヤカが学んだ「1万人に1人」の勉強法]]の表紙に記載された言葉だ。何かを始められる人はせいぜい1%、そしてそれを続けられる人は0.01%しかいない..ということを意味する。
そんな99.9%の方へ、ことプログラミングに関してオススメの勉強法がある。それは、==好きなツールのプラグインをつくってみる==ことだ。
## なぜプラグインなのか?
プラグインを推すには3つの理由がある。
1. 好きなツールであれば**提供されていない欲しい機能**が大抵1つはあるから
2. 最低限の手間と知識で最大限の恩恵を得られるから
3. プラグインシステムの設計を目の当たりにすることで**設計力が上がる**から
普段なんとなく使っているツールには大抵必要な機能が揃っている。愛着がそこまでなければ必要以上にカスタマイズしたいと思うこともないだろう。
一方、好きなツールなら話は別だ。使用している時間や用途も長いことが想像でき、自分の痒い所まで手が届く機能が欲しいと思う瞬間があるはずだ。更にそれは**自分だけのニッチな需要であることも多く、だからこそ自作する必要性と意義ができる**ためモチベに繋がる。
また、プラグインシステムは基本的なバックボーンやUIが既に作成済みだ。プラグイン開発者はツールの一部処理に対してちょっとした手を加えるだけでいい。**ソースコードにして高々数十行の実装で欲しい機能を作成できる**ことも珍しくない。フルスクラッチは魅力的ではあるが、ほとんどの人は熱が冷めた途端に諦めてしまうものだ。
最後に、**プラグインの実装をすると設計力が上がる**というメリットがある。なぜなら、ツール全体におけるプラグインのインターフェースを意識することになり、結合度の低い開発を体験できるからだ。たとえ、**自分が開発するプロダクトにプラグインシステムが不要であっても、**==プラグインを意識したインターフェースを設計することでメンテナンス性は格段に上がる==。
## 今までに作ってきたプラグイン
私が今までにプラグインを開発したことのあるツールと、可能なものはプラグインも紹介しよう。
### [[Sublime Text]]
当時、2013年頃はバージョン2が流行っていた。[[VSCode]]は勿論のこと[[Atom]]さえ無かった時代だ。[[Sublime Text]]は触れ込みの通り、まさしく『恋するエディタ』であった。
<div class="link-card">
<div class="link-card-header">
<img src="https://www.sublimetext.com/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">www.sublimetext.com</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Sublime Text - the sophisticated text editor for code, markup and prose</p>
</div>
<div class="link-card-description">
Available on Mac, Windows and Linux
</div>
</div>
<img src="https://www.sublimetext.com/images/og-full.jpg" class="link-card-image"/>
</div>
<a href="https://www.sublimetext.com/"></a>
</div>
[[Sublime Text]]は[[Python]]でプラグイン開発ができ、当時[[Python]]を学び始めたばかりだったのでプラグイン開発にチャレンジした。何を作ったのかもはや覚えていないし、公開もしていない。実際に作って、[[VSCode]]に移行するまでの間使っていたという事実だけ述べておく。
### [[VSCode]]
しばらくして、今では皆知っている[[VSCode]]が登場した。[[VSCode]]は[[TypeScript]]を使ってプラグインを開発できる。2017年頃、[[VSCode]]はメインエディタとして使用しており、ちょうど[[TypeScript]]も始めたところだったのでチャレンジをした。
作成したプラグインは[[Markdown]]の見出し作成をサポートするものだ。マーケットには公開していないが、[[GitHub]]では[[🧊owlcode]]というリポジトリを公開している。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/owlcode: A VSCode extension for owl 🦉</p>
</div>
<div class="link-card-description">
A VSCode extension for owl 🦉. Contribute to tadashi-aikawa/owlcode development by creating an account on GitHub.
</div>
</div>
<img src="https://opengraph.githubassets.com/47bb17f3d7e77148a6810a8ab9038b91bccf433723b1cdf6ee34e0bb710fc357/tadashi-aikawa/owlcode" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/owlcode"></a>
</div>
その後、[[Markdown]]エディタとしての役割は[[IntelliJ IDEA]]や[[Obsidian]]に移っていったので今では使っていない。ただ、[[VSCode]]が好きな人は多いと思っているので、貴方がもしそうであれば是非チャレンジしてほしい。
### [[Keypirinha]]
[[Keypirinha]]は[[📗できる限りステートレスな操作を採用する]]でも紹介した[[ランチャー]]だ。こちらも[[Python]]でプラグインを開発できる。同様に[[GitHub]]でリポジトリを公開している。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/keypirinha-OwlTodoist</p>
</div>
<div class="link-card-description">
Contribute to tadashi-aikawa/keypirinha-OwlTodoist development by creating an account on GitHub.
</div>
</div>
<img src="https://opengraph.githubassets.com/df01864881aa5a5672043b47195950b469c56b4d6445d5f3336dcd39fb0c330b/tadashi-aikawa/keypirinha-OwlTodoist" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/keypirinha-OwlTodoist"></a>
</div>
[[ランチャー]]は限られたUIで実装しなければならないが、すべての操作のベースとなるためアイデアを持っている人も多いのではないだろうか。私の場合は[[Googleカレンダー]]のテキスト形式から[[Todoist]]のタスク形式に変換して、クリップボードに保存するためチャレンジした。
### [[Google Chrome]]
2018年頃に初めて本格的な[[Google Chrome]]のプラグインを作った。いわゆる[[Chrome Extension]]は[[JavaScript]]や[[HTML]]、[[CSS]]といったWebの技術を使って開発できる。もちろん[[TypeScript]]でもOKだ。
当時、[[Todoist]]と[[Toggl]]を使っていたが、[[Toggl]]の画面から[[Todoist]]のタスク名で計測を開始したり、計測結果を[[Slack]]に通知したかったのでチャレンジしてみた。マーケットに公開こそしていないが、[[GitHub]]にアーカイブされたリポジトリは残っている。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/zzz-togowl: A Google Chrome extension for toggl</p>
</div>
<div class="link-card-description">
A Google Chrome extension for toggl :owl:. Contribute to tadashi-aikawa/zzz-togowl development by creating an account on GitHub.
</div>
</div>
<img src="https://opengraph.githubassets.com/2e7f17c582049db5d6c511cb3bdd77e534da88c4d3bcbcc7002f07659be4e1db/tadashi-aikawa/zzz-togowl" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/zzz-togowl"></a>
</div>
なお、こちらを[[PWA]]として1からフルスクラッチしたツールが、度々紹介している[[🧊Togowl]]である。アイコンや名前が同じなのはそういうわけだ。
### [[IntelliJ IDEA]]
[[IntelliJ IDEA]]は[[Java]]や[[Kotlin]]を使ってプラグイン開発ができる。当時はちょうど[[Markdown]]の編集を[[VSCode]]から[[IntelliJ IDEA]]に移したところであり、[[🧊owlcode]]をパワーアップさせた[[🧊Markowl]]を開発した。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/markowl: Markdown extended plugin for Jet Brains IDEs and owl🦉</p>
</div>
</div>
<img src="https://opengraph.githubassets.com/03710ae3de0cf1b6d1031c47a027a8f4ddfc443d2bf3515e407752bde2c1687d/tadashi-aikawa/markowl" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/markowl"></a>
</div>
[[🧊Markowl]]は==はじめてマーケットに一般公開したプラグイン==という意味で非常に感慨深いプロダクトである。嬉しいことにそこそこダウンロードしていただき、Issueもいくつか作成してもらった。
<div class="link-card">
<div class="link-card-header">
<img src="https://resources.jetbrains.com/storage/ui/favicons/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">JetBrains Marketplace</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">Markowl - IntelliJ IDEs Plugin | Marketplace</p>
</div>
<div class="link-card-description">
Markdown extended plugin for JetBrains IDEs and owl🦉
</div>
</div>
<img src="/assets/icons/default_icon.png" class="link-card-image"/>
</div>
<a href="https://plugins.jetbrains.com/plugin/14116-markowl"></a>
</div>
当時は[[Kotlin]]のプラグイン開発情報が乏しかったため、調査はかなり大変だったが、[[Kotlin]]だけでなく[[Unicode]]、他国の言語文化など勉強になることが多かった。開発の詳細はブログ [[📘IntelliJ IDEAのプラグインを作ってみた]] でも紹介している。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">minerva.mamansoft.net</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">📘IntelliJ IDEAのプラグインを作ってみた</p>
</div>
<div class="link-card-description">
IntelliJプラグインをKotlinで作ってみました。
</div>
</div>
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/%F0%9F%93%98Articles/attachments/2020-04-22.jpg" class="link-card-image"/>
</div>
<a href="https://minerva.mamansoft.net/%F0%9F%93%98Articles/%F0%9F%93%98IntelliJ+IDEA%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F"></a>
</div>
### [[Obsidian]]
そして最後は、まさにこの記事を執筆している[[Obsidian]]だ。周知のとおり、私が現時点で一番愛着を持っているツールだ。[[Obsidian]]の良さは[[📘Obsidianは10年後の礎になると半年間使って確信した話]]を見てほしい。
<div class="link-card">
<div class="link-card-header">
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/favicon.ico" class="link-card-site-icon"/>
<span class="link-card-site-name">minerva.mamansoft.net</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">📘Obsidianは10年後の礎になると半年間使って確信した話</p>
</div>
<div class="link-card-description">
Obsidianを使い始めてからちょうど半年が経過した。これまでの体験から私は自信をもって言える。Obsidianは次の10年の礎になるツールであると。
</div>
</div>
<img src="https://publish-01.obsidian.md/access/35d05cd1bf5cc500e11cc8ba57daaf88/%F0%9F%93%98Articles/attachments/2021-07-14.jpg" class="link-card-image" />
</div>
<a href="https://minerva.mamansoft.net/%F0%9F%93%98Articles/%F0%9F%93%98Obsidian%E3%81%AF10%E5%B9%B4%E5%BE%8C%E3%81%AE%E7%A4%8E%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%A8%E5%8D%8A%E5%B9%B4%E9%96%93%E4%BD%BF%E3%81%A3%E3%81%A6%E7%A2%BA%E4%BF%A1%E3%81%97%E3%81%9F%E8%A9%B1"></a>
</div>
[[Obsidian]]は[[TypeScript]]を使ってプラグインを開発できる。私も今まで3つのプラグインを開発しており、[[🦉Various Complements]]と[[🦉Embedded Code Title]]はコミュニティプラグインとして公開中、[[🦉Another Quick Switcher]]はレビュー通過待ちだ。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/obsidian-various-complements-plugin: This plugin for Obsidian enables you to complements input in markdown files. 🦉</p>
</div>
</div>
<img src="https://opengraph.githubassets.com/f4b89d87351a1f2ae22b1bc4f9abda452e6b7b03faff4c752f114b82b19d4326/tadashi-aikawa/obsidian-various-complements-plugin" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/obsidian-various-complements-plugin"></a>
</div>
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/obsidian-embedded-code-title: It is an Obsidian plugin which can embeds title to code blocks.</p>
</div>
</div>
<img src="https://opengraph.githubassets.com/6e1887946e55769440627f36f2a7934f6297f57f354902ef0ee6a01ee958ad50/tadashi-aikawa/obsidian-embedded-code-title" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/obsidian-embedded-code-title"></a>
</div>
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<div>
<p class="link-card-title">GitHub - tadashi-aikawa/obsidian-another-quick-switcher: This is an Obsidian plugin which is another choice of Quick switcher.</p>
</div>
</div>
<img src="https://opengraph.githubassets.com/588ff364f9251d47c556f1576137409ef5b6133481b8d586532a243e8e70f0a8/tadashi-aikawa/obsidian-another-quick-switcher" class="link-card-image"/>
</div>
<a href="https://github.com/tadashi-aikawa/obsidian-another-quick-switcher"></a>
</div>
[[Obsidian]]は2020年に誕生したこともあり、かなり早熟なプロダクト・コミュニティだ。他のツールなら存在するようなプラグインがまだ作られていなかったりする。また、[[VSCode]]や[[IntelliJ IDEA]]と異なり、エンジニアが主なユーザー層ではない点もユニークだ。
だからこそ、プラグインを開発・公開したときのリアクションもひとしおだ。エンジニア向けの開発ガイドを [[📕Obsidianプラグイン開発チュートリアル]] にまとめたので、興味があれば是非チャレンジしてほしい。そして共に[[Obsidian]]を盛り上げていこう。