ここのところEmacsについて勉強していて、「何を言っているかはわかる」という程度に理解した。
入口を理解するのに苦労しているものというのがいくつかあって、Emacsはそのひとつだった。でもたくさんの人が使っているのだからそんなにとんでもなく難しいわけはない。
こういう場合、最初の一歩の足の置き場を教えてくれるのは、誰かのなんてことないような一言だったりする。そしてわかってみればなぜわからなかったのかがわからなくなる。
JavaScriptなんかもそうだ。わからなかった頃が長くあったから「わからない」という状態をちゃんと知っているが、何をそんなに難しく思っていたのかはわからなくなりつつある。「わからない」と「多少わかる」の境界というのは実はごくごく薄いのである。
ここまでの歩み
コンピューター的な――アナログのメタファーではカバーできない種の――概念を自分なりにいろいろ習得してきた。CSSに始まり、JavaScriptであれこれやれるようになり、CLIに慣れ、今夏はLinuxとEmacsに入門した。だいたい四年から五年の間のことである。その前はほとんど何もわかっていなかった。
今でも別にすごく詳しくなったわけではない。理数系じゃないし、コンピューターが得意なタイプではない。まだわからないことはたくさんある。多分ほとんどわかっていないのだと思う。でも「全くわからない」からは抜け出した。このことはとても大きい。
経た過程を整理すると六段階くらいに分けられる。
- 機械が読むための記述に慣れる期
- Scrapbox(Cosense)のUserCSSいじり
- HTML/CSSで自分用ページ作り
- プログラミング挑戦期
- JavaScript
- ブックマークレット作り
- Scrapbox(Cosense)のUserScript
- (Python)
- ツール作り期(サーバーサイド理解期)
- Electron・Node.js
- AutoHotkey
- TypeScript
- CLI理解期
- Deno
- Gitコマンド
- 既存アプリケーション拡張期
- API利用
- Fresh(Deno×Preact)
- プラグイン・拡張機能開発
- OS期
- Linux
- Emacs
記憶を辿っているので細かいところでは順番が前後する可能性があるが、おおよそはこんな感じだ。
機械が読むための記述に慣れる期
スタートはCSSで、Scrapboxの見た目をScrapbox上で変えられるということに感動して、頑張って調べて自分好みに変えていった。
それがうまくいくと、Scrapboxの構造に縛られずゼロから自分で作ってみたくなる。
■HTML日誌:自分のためだけにHTMLを書く(2021/09/24)
まだJavaScriptが使えないので、予め用意してあるデータを一度にバッと表示するだけのものだが、それでもダッシュボードとしてなかなかよかった。で、データを表示する、つまり一件ずつHTML要素にして並べるということをするにはJavaScriptを使えばいいらしいということがわかってきたのだったと思う。
ただしここから実際にJavaScriptの勉強を始めるまでは四ヶ月ほどかかっている。当時はそれくらいにハードルを高く感じていた。スタートしたのは2022年1月27日で、ここがプログラミング挑戦の始まりである。
プログラミング挑戦期
最低限の文法を覚えるのには何日もかからなかった。自然言語で言う品詞のようなものが理解できると、そこら辺で(例えばCosenseのUserScriptで)見かけるコードが「わかりそう」な感じがしてくる。意味はわからなくとも読めるのである。
そして自分が必要とするような処理のほとんどは、ごく基本的な処理の組み合わせでできていることがわかってくる。割といろんなことがすぐできるようになるのだ。
■JavaScript日誌:一歩進んだら十回足踏みせよ(2022/03/07)
実際にできるようになったことの多さよりも、「できない気がする」と感じていた領域が無闇に果てしなかったのがある程度狭められたことが、自分の中では大きな意義に感じられる。
人の書いたコードをいじれるようになると世界は劇的に広がる。まず手近なところでブックマークレットとCosenseのUserScriptがある。これらは動かすための環境を自分で整える必要がないので、JavaScriptさえわかれば実用できるものを作ることができる。
HTMLを自分で書いて動かすという時には、セキュリティの都合上ローカルファイルの読み込みを許可する設定をする必要があったりして、JavaScript以外の知識が求められるのが少し厄介だった。まあ今なら生成AIに聞けば何の苦労もないだろう。
三ヶ月が経つ頃にはかなりのものが作れるようになった。データの保存方法を覚え、エディタとして成り立つようになると、思いつくものを試作したくなってしょうがなくなる。
■ツール製作日誌:三ヶ月で劇的ビフォーアフター① 自作ツール紹介編(2022/04/23)
■ツール製作日誌:三ヶ月で劇的ビフォーアフター② 生き方改革編(2022/04/24)
誰かがやってくれるのを待つしかなかった生活から、頑張れば自力でなんとかできる生活へとデジタルライフが転換したのである。何が何だかさっぱり分からなかった世界で主体性を手に入れたことは、精神的に劇的な変革をもたらしたと感じている。ますますデジタル化が進む中でも自分の生活をコントロールしていられるかもしれないという希望がある。
ちなみにPythonもちょっと齧ったのだが、この先サーバーサイドの処理もJavaScript系(Node.jsとDeno)でやっつけていったので使う機会がないままほとんど忘れてしまった。
ツール作り期(サーバーサイド理解期)
保存データが数MBで済むならブラウザだけでデータの保存までまかなえるが(localStorage)、長期的に使っていくとなるとそれでは不安がある。データがブラウザに閉じ込められていること自体、いつ消えてしまうかわからなくて心配だ。
それを解決するには、Googleドライブなどのクラウドストレージと連携するか、ローカルファイルを読み書きする形にするか、どちらかを選ぶ必要がある。クラウド連携は初心者にはあまりにもハードルが高いのでローカルファイルを選ばざるを得なかったが、これはこれでちょっと大変である。Node.jsとElectronというものを使えるようになる必要があった。
Webブラウザはセキュリティ保全のためローカルファイルを編集することはできないようになっている。そこで、Webブラウザと同じように動かせてローカルファイルを読み書きできる手段として登場するのがElectronである。
Electronを理解するには、サーバーサイド(↔️クライアントサイド)の処理ということの意味をわかる必要がある。初心者には抽象的に感じられてよく躓くポイントじゃないかと思うが、「自分が作ったエディタのデータをなんとしてもローカルファイルに書き込みたい」という強い目的意識があったのでどうにか突破した。願望は重要で、逆に願望なしに「ただ学ぶ」というのはかなり難しい。
■ツール製作日誌:プログラミングの勉強を開始して半年の振り返り(2022/07/27)
さすがにElectronの全てを理解するのは困難で、半年時点では「なんだかよくわからないがとりあえず動く」というレベルで留まっている。よくわからなくても動けばいい、というのが趣味のプログラミングのよいところだ。
データをローカルファイルに保存できるようになると、作ったツールがいまいちでもデータは簡単に取り出せるという安心感が生まれる。加工して規格を変えれば他のツールに引き継ぐこともできる。そうなるとますますツール作りの意欲は高まり、いろいろなことを試したくなる。そうして技術の吸収速度がぐんと上がった。
なおここまでの経験談は過去に記事にまとめている。
■ゼロからのプログラミングについての所感(2022/09/22)
2023年に入り、上半期頃にはノートテイキングアプリDIY体験記というシリーズ記事を書いている。
この頃にはスキルも上がり、例えばTypeScriptをほぼ自由に使えるようになった。型を理解できるようになったのだが、それは後にAPIやプラグインの仕様書を読む時に非常に役立った。
そして2023年の後半あたりでプログラミング熱は一度失速する。未知の領域を開拓する喜びが薄れたことと、素人の自作ツールの安心感のなさがストレスになったことが主な理由である。
■作るためのツール作りから使うためのツール作りへ①目的の変化(2023/09/12)
しかしある程度慣れてくると、「何ができるか」ということについては「まあ何でもできんだろ」というような感覚になっていった。具体的なコードが想像できるようになって、その通りに書けば再現できることがわかってくるからだ。もちろん実際に取り組めば気づいていなかった落とし穴に嵌ったりするだろうが、それでも未知への挑戦という気分はだいぶ薄れている。
■作るためのツール作りから使うためのツール作りへ②感覚の変化(2023/09/13)
初めの頃に想像していた「こんなツールが欲しい」と、今考えている「こういうツールを作りたい」とは、かなり大きな違いが生じている。
■作るためのツール作りから使うためのツール作りへ③力量の変化(2023/09/14)
正直ただ機能を作るだけなら割と簡単で、垢抜けないコードで良いなら基本的な処理をどうにか組み合わせれば結構色々なものを作ることができる。しかしアプリケーションに於いて重要なのは「起きてはならないことが起きないようにする」ということで、これが大変なのである。
CLI理解期
それからいくらもしないうちに、また新たな扉が開かれた。Denoとの出会いである。一言で言うと「Node.jsを洗練させたもの」で、サーバーサイドでJavaScript/TypeScriptを動かす手段だ。
■Denoを使い始めた(2023/10/05)
Denoにすることで自分に可能なことが増えた、というわけではない。Denoでできること、少なくとも今の私がやれることはNode.jsでもやろうと思いさえすればできることである。しかし、潜在的に可能なことについて「できそう」と思うに至れるかどうか、という点で私の中ではNode.jsとDenoの間に大きな違いがあるのだと思う。
Denoが自分にとって劇的だったのは、「面倒くさくなくなった」ということに尽きる。Node.jsはいちいち面倒くさかった。書き方が今となっては独特だし、なんだかよくわからないファイルが大増殖するし、自分の感覚とさっぱり合っていないのである。それがDenoだと全て解消され、実際に書くコードや「できること」はほとんど変わっていないにもかかわらず、「できそうなこと」「やりたいこと」が急激に広がった(→血流が良くなる)。
もうひとつ大事なことは、DenoがCLIへの苦手意識を解消してくれたことだ。
CLIコマンドにも急に親しみ(?)を感じ始め、コマンドへの苦手意識がすっと消えた。Denoの仕様を知ることで、そもそもコマンドとは何なのかというのがちょっとわかったような気がする。
前からGitを使っていたわけなので若干はCLIに触れてはいたが、正直よくわからない感じがつきまとっていた。その理由は、こちらのコマンドを受け取った向こうのプログラムがコマンドをどう処理していくのか、そのイメージが湧かなかったからだと気がついた。これはJavaScriptで「関数の引数に関数を渡す」という状態がしばらく理解できなかったのと同じ構図である。
それがDenoに親しむことでちょっとだけわかった。それにより、CLIの「わからなさ」は随分薄れた。このことが、この先の可能性を大きく広げることになる。
既存アプリケーション拡張期
きっかけは定かでないが、この直後あたりから突如Dynalistの使い方に革命が起きた。タグやノート欄などDynalist自体の機能についての理解も急に深まったのだが、同時にDynalistとスクリプトをかけ合わせるという発想を得たのが大きい。
■Chrome拡張機能を自分で作って活用する(Dynalist)(2023/10/16)
この延長で、サイトのデータをDynalistに作ってAPIで取ってくるという形式を見出した。
■個人サイトを作りました(2023/11/03)
つまり、Dynalist内ではDynalist上で扱うものとして自然な書き方で書いて、それをサイト仕様にコンバートすれば、投稿先の仕様に合わせて無理をする必要がなくなるのです。
データを作る時に必要な形式と、データそのものの型、そしてそのデータを活用する時に必要な型というのを分けて考えるようになった。このことが、APIを利用するイメージというものを具体的にした。
一般的に、人力で記述する必要があるデータベースには、人間がデータを入力するためのフォームというものが備えられている場合が多い。それと同じだと考えるようになった。つまり、Dynalistというのを単に「アウトライナー」ではなく、「アウトライナー型のフォーム」と考え、それによって入力されたデータ群であるDynalistのデータベースにAPIでアクセスする。データベースの利用方法がフォームの形とは全く関係ないように、Dynalistのデータの使い方はアウトライナーの機能や形式とは一切関係がない。これはかなりコンピューター的な発想転換だと思う。
同時進行で、DenoのFreshというものを導入した。Preact(Reactの軽量版)を使ったコードをDenoがいい感じに整えて静的サイトを生成してくれる仕組みである。これまでReactに何度か挑んでは挫折していたのが、ここに来てようやく理解できるようになった。
■サイトの引っ越しをしました(2024/02/25)
2023年末から2024年にかけて、それ以前の時点で理解を諦めていたようなことが急にわかるようになった。転機というのはわからない、というかそもそもないのだと思う。RPGに於いて、経験値が溜まっていってレベルアップする、その前後に特別なことは別にないのと同じだ。2022年1月末から約2年の間溜め続けた経験値で至ったレベルがここということだろう。
Chrome拡張機能とAPIが分かれば、プラグイン開発も怖くない。やがてObsidianのプラグイン開発にも手を出せるようになった。
2025年に入ってからはNotionとGyazoのAPIを多用するようになった。Chrome拡張機能に組み込んだりDenoで実行したりしてNotionを機械的に操作する手段を得ると、Notionというのが極めて便利なツールになった。
当たり前といえば当たり前の話で、APIを使わないNotionは見た目がどれだけ洗練されていても人力データベースなのである。もちろんある程度の自動化の機能は備わっているが、APIとAPIを繋いで情報をガッと取り込むみたいなことができるかできないかで、データベースの価値は大きく左右されるだろう。
OS期
今夏、自分としては大きな一歩を踏み出した。
■はじめてのLinux
古いPCにLinuxをネイティブインストールしたのである。Linuxは私にとって「なんだかよくわからないもの」代表のようなもので、自分にはきっとずっと縁のないものだろうと思っていた。PCに詳しいプログラマーじゃないととても扱えないOSのような気がしていたからだ。
もしかしたら昔は実際そうだったのかもしれないが、しかし今のLinuxはそんなことはないようだ。Windowsに近いらしいディストリビューションを選んだら、確かにほとんどWindowsで、「普通に使える」という感じだ。
そして既にCLIにも慣れているから、Linuxについての解説を読んで大体意味がわかる。とはいえ難易度が低いとはとても言えないので、「今だから導入できた」というのが正直なところだが、今ならLinuxも使えちゃうもんね、というのは結構な自信になった。
もうひとつ、つい最近突破したのが冒頭にも書いたEmacsである。
まだ入口に立ったばかりで全然使いこなせてはいないが、Emacsとは何がどうなって成り立っているものかというのは理解したので、あとはひとつひとつやりたいことを調べさえすればどうにかなる。
結構前に一度インストールしたのだが、起動した時点で次にどうしたらいいのかがわからず、また解説を見ても「これのどこが便利なんだ?」という気持ちになって挫折してしまった。話をちょこちょこ見かけるから試しにインストールしたものの、Emacsでやりたいことというのがなかったのでそれ以上努力するモチベーションが生まれなかった。
そこからしばらく経ち、Linuxも導入できたし、今ならEmacsがわからないわけはないだろうと思って再び挑むことにした。Emacsならこれをやれそうだと期待しているものもある。多少の躓きは乗り越えられる程度のモチベーションがある。
私は子どもの頃からずっとWindows一筋で、最近になるまでコマンドラインとも無縁だったわけなので、環境自体を云々するというのは全く想像の及ばない世界だった。しかしスタイルシートの書き換えから始まりじわじわと「コンピューター的なもの」に迫っていって、ようやくここまできた。
もちろんちゃんとわかったわけではない。それでも「全然わからないし、到底わかりそうにないもの」から「まだわからないが、もしかしたらわかるかもしれないもの」になった気がして、それはとても大きな変化である。
所感
こう振り返ってみると、やはり各段階に意味があって、手前の段階があるからその先のことができるようになったのだなと思う。
最初のうちはかなり強引に突き進んだ感があって、例えばElectronなんかは当時の自分の実力には荷が重い技術だったと思う。それでもやりたいことが明確にあったからどうにかできた。
しかしながら、今はElectronは使っていないし、それどころか自作のデジタルノートツールというのをもうさっぱり使っていない。あれほど頑張って様々作ったのに、ただのひとつも生き残っていないのである。
色々作って思ったのが、自分の力では砂上の楼閣を免れないということだ。「当たり前にやる操作」ほど技術が必要で、それを絶対にエラーなく実装するのが私には難しかった。
代わりに、APIとChrome拡張機能開発、プラグイン開発を通して、既存のちゃんとしたアプリケーションをカスタマイズする方向にシフトした。これができるためには仕様書を読めなければならず、TypeScriptに習熟して型を理解することが必要だった。いちから全部自作してしまう方がある意味では簡単なのである。
APIを開放してくれていたりプラグイン機能を提供してくれていたりするアプリケーションを使う限り、それら全てが連結し得る。アプリケーションごとの得意不得意はアプリケーション間で補えばいい。さいきょうのアプリケーションを自前で作ろうとしなくても、メジャーなアプリケーションをいくつか橋渡しできれば大抵死角はなくなる。
とはいえ、それはデータベースとしての話であり、エディタについてはまた別の問題がある。そのために今更ながらEmacsを試そうとしているくらいで、まだこの旅路は続きそうである。
関連度が高いかもしれない記事
- ゼロからのプログラミングについての所感
- JavaScript日誌:一歩進んだら十回足踏みせよ
- ツール製作日誌:三ヶ月で劇的ビフォーアフター② 生き方改革編
- ツールを「使いこなす」という余計な構え
- よくわかるNoratetsu Lab(2022年版)~後編~
「ノートテイキングアプリDIY体験記」シリーズの記事
- NTA-DIY:何をどう書いたらいいか考え直す
- NTA-DIY:2ヶ月目④~よくわからん三銃士~
- NTA-DIY:糸口②~環境を整えよう~
- NTA-DIY:なんでこれを書いているのか考え直す
- NTA-DIY:2ヶ月目③~付箋ツールを自作してみる-後編-~
- NTA-DIY:2ヶ月目②~付箋ツールを自作してみる-前編-~
- NTA-DIY:糸口①~結局何をどうしたら動くのさ~
- NTA-DIY:2ヶ月目①~アウトライナーを自作してみる~
- NTA-DIY:前日譚④~VBScriptの感動~
- NTA-DIY:余談①~ScrapboxとGitの貢献~
- NTA-DIY:1ヶ月目⑩~初めてのノートテイキングアプリDIY~
- NTA-DIY:前日譚③~Excelの拡張としてのデジタルDIY~
- NTA-DIY:1ヶ月目⑨~ブックマーク管理ツールを作ってみる~
- NTA-DIY:1ヶ月目⑧~ScrapboxのUserScriptを作ってみる~
- NTA-DIY:1ヶ月目⑦~DOMとAmazonブックマークレット~
- NTA-DIY:1ヶ月目⑥~実作:簡単なブックマークレット~
- NTA-DIY:1ヶ月目⑤~小さいチャレンジ集~
- NTA-DIY:1ヶ月目④~for文を解らないまま使う~
- NTA-DIY:1ヶ月目③~おみくじいろいろ~
- NTA-DIY:前日譚②~JavaScriptを書けると何が嬉しいの?~
- NTA-DIY:1ヶ月目②~感動したもの勝ち~
- NTA-DIY:1ヶ月目①~どうせならTypeScriptを覚えればいいんじゃね~
- NTA-DIY:前日譚①~カスタマイズできる人ずるい!~
- NTA-DIY:まえがき
他の「プログラミング」タグの記事