| @雑談

仙酔峡から見る鷲ヶ峰
仙酔峡から見る鷲ヶ峰

2020 年の途中( 7 月)から #100DaysToOffload に挑戦し始めた。

本当は挑戦し始めてから一年間で 100 記事かければ良いのだけど、自分の場合はコロナ禍の自粛期間中に結構ブログたくさん書いてたこともあり、 2020 年内に 100 記事書くことを目標にした。 10 月まではいいペースで推移していたが、 11 月に Apple のプライバシー問題の件の翻訳記事を書くので燃え尽きてしまってペースが鈍り、 12 月も調子が上がらず結局 79 記事で止まってしまった。

2020 年の前半は Lokka の ActiveRecord 化も頑張っていて、あと一歩で master ブランチに merge できるところまでこぎ着けたのだが、こちらも途中で燃え尽きてしまった。

自分の手元では ActiveRecord 化が完了していて満足してしまったし、そもそもいまは Lokka を使っている人がほとんどいなくて、誰も望んでいないことに精一杯時間を割くのが虚しく感じられるようになってやる気が萎えてしまった。

燃え尽きは突然やってくる。目標が達成できていないのにほどほどのところで自分自身が満足してしまうとか、自分がやっていることを誰も望んでいないということに気がついたときに、突然やる気が萎えてしまって燃え尽きてしまう。仕事でも 2017 年から 2018 年にかけては結構頑張っていたのだけど、頑張りが成果に結びつかなくて正直燃え尽きてしまった感がある。その後は惰性で何とか今日までやってきているけど、あまり良い状態ではない。

若い頃はモチベーションなんてものは無限に涌いて出てくるものだと思っていたけど、年をとってくると金を積まれても乗り気になれなくてやれないということが出てくることを知った。自分の時間やモチベーションの希少性・有限性を理解し、下手なことに使ってしまって燃え尽きてしまうのは避けなければならない。

新年早々どんよりした記事になってしまった

| @雑談

2020 年、時系列でふりかえるとこんな感じだった。

できたこと

ハワイ旅行

ハワイで最近の SUV に乗って Car Play に感動した。車の買い換えを検討するきっかけになった。ハワイ楽しかったのでまた行きたい。

Akaka Falls
Akaka Falls
Cadillac XT4
Cadillac XT4
Volks Wagen Atlas
Volks Wagen Atlas

ブログの ActiveRecord 化

脱 DataMapper できた。

ブログ UI 刷新

トップページの見た目、アーカイブページにグラフを表示するようにした。ブログ記事を書いてきた実績が可視化されるとやる気が出る。

ウッドデッキの塗り替え

サンドペーパーをかけて塗り直した。

ウッドデッキ塗り直し
ウッドデッキ塗り直し

庭で焼き鳥

バーベキューに飽きて焼き鳥おじさんになった。

焼き鳥
焼き鳥

ハンモック入門

ウキグモ Light & ウンカイ Light 購入。

ハンモック
ハンモック

UL クッカー購入

アルコールストーブ、チタンカップ、メスティン、アルミフライパンなどなど。

アルコールストーブ
アルコールストーブ

山で肉まん・焼売・炊飯

カップラーメンとおにぎりからの卒業。メスティンでの炊飯はめちゃ美味くて感動する。

焼売
焼売
メスティンで炊いた米でたまごかけご飯
メスティンで炊いた米でたまごかけご飯

車の買い換え

スバルインプレッサから Jeep Compass へ。ハワイ旅行でアメ車の SUV に乗って車に対する考え方が変わり、車を買い換えたくなった。国産車はディーラーとの交渉がわずらわしすぎて値引き交渉やオプションがほとんどない外車になってしまった。アメ車はアホみたいにガソリン喰って笑える。プラスチック部品の質が悪い(ゴルフ 2 を思い出す)。

Jeep Compass
Jeep Compass

ソロで脊振山・金山を縦走

2 年ぶりのソロ縦走。盛夏にソロで 20km 歩いてつら寂し楽しかった。

脊振山
脊振山
猟師岩鼻
猟師岩鼻

腕時計の買い替え

Pebble Time Round から Apple Watch へ。

Apple Watch
Apple Watch

朝駆け登山

明け方前に出発して日の出を山頂で見るというやつをやった。

天山から見る日の出
天山から見る日の出

友だちとキャンプ

家族以外とのキャンプは初めてだった。複数の男手がある状態でのキャンプは楽だった(力仕事を分散)。食事は taketin さんが作ってくれて超楽だった。

ピザを焼く taketin さん
ピザを焼く taketin さん

ジョギング再開

年末から走るようになった。Apple Watch でリング閉じたい病にかかった。走るときに聞くのは Podcast よりも音楽の方が良い( Podcast だと気が散る)。

一切れ 3000 円の肉を焼く

肉屋で ¥880/100g のリブロースを厚さ 3cm でカットしてもらった。良い肉を低温調理すると柔らかくなりすぎてブヨブヨになった。和牛は普通に焼いてうまくなるように育てられてるのかも知れない。

一切れ 3000 円の肉
一切れ 3000 円の肉

Rebuild サポーターに登録

RAW エピソードと Extra エピソードが聞けて全文検索できるようになった。全文検索できると N さんが昔言ってたあの話をもう一回聞きたいというときに便利。サポーター向けの機能差別はもうちょいあってもよいのではと思ったけど( Rebuild を聞くに際してお金払わなくても困ることがない)、実利を得るためというより支援のためにみんな入っているのかな。

できなかったこと

こっちは箇条書きで。

  • Lokka の ActiveRecord 化を master に merge
    • あと一歩のところで燃え尽きてしまった
  • iOS / Mac のプログラミング
    • 毎年やりたいと思ってやれない
    • Xcode がでかすぎる&重すぎる
  • Rust の勉強
    • ちょびっとやってたけど難しくて途中でやめてしまった
  • 英会話の勉強
    • 会社の制度でレアジョブを始めたけどなかなか時間を捻出できない
    • 休みには休みたくなってしまう
  • ブログを 100 記事書く
    • 11 月に重めの翻訳記事を書いて燃え尽きてしまった
  • 庭の屏の塗り替え
    • ウッドデッキの流れで塗り替えたかったが梅雨入りして夏が来て冬になってしまった
  • 体重の維持
    • 前回リモートワークをしていたとき( Kaizen Platform 時代)はリモートワークしながら減量できたのに今回は太ってしまった
  • ソロでハンモック泊
    • ハンモックを買ったはいいが、ソロで山に泊まりに行けていない
  • 高い山に登る
    • 今年は標高 1500m 以上の山(ハワイーの Pu'u Kalepeamoa は除く)に登っていない
    • 火山規制が解除されたので阿蘇高岳に登りに行きたかったが、休日にソロでの外出はなかなか難しい
    • 年に一回は久住か祖母山、九州脊梁の山(標高 1700m 程度)に登りたい
  • 仕事でめざましい成果を残す
    • いつも通り

いつものようにあまりパッとしない一年だった。

| @ブログ

先日 secondlife さんのブログについて触れたが、最近は r7kamura さんも頻繁にブログを書かれるようになった。

ブログハック的な記事を良く書かれていて読むのが楽しい。特に画像にキャプションを入れる手法が参考になった。

Markdown のパース & HTML への変換を Markdown パーサー任せにするのではなく、 html-pipeline.gem を使って良い感じに挟み込みたい処理を入れているようだ。

このブログでも結構ごちゃごちゃやっている。例えばコードスニペットのシンタックスハイライトがそうだ。 Markdown から HTML にしたあと Nokogiri で HTML を読み込んで解析し、コードスニペットをハイライトされた <code> ブロックに置換している。

これに加えて OGP 読み込み君も存在しているし、 Amazon Associate のタグを読み込んでアフィリエイトリンクに置換するための処理も存在している。

いまのところそれぞれ処理を Lokka プラグインとして実装しているので一つ一つが独立して動く必要があり、 Nokogiri による HTML の解析回数が無駄になっている。 r7kamura さん方式で、ルールだけそれぞれのモジュールで定義して、 HTML の解析と置換処理は 1 回で済むようにするのが効率的だと思う。


2010 年以降も自前でブログを運用してハックの様子をシェアしてくれている hail2u.netlowreal.net はとても参考にしているし、勝手に同志のような感覚を抱いていた。自分も細々と頑張ってはいたが、ながしまきょうさん、 cho45 さんのほかには同じようにブログの運用に情熱を持っている人を見つけられなくて少しさみしい気持ちがしていたところ、 secondlife さんや r7kamura さんが加わってきて盛り上がってきた。 Blog Hacks 2020 の様相を呈してきている。

| @技術/プログラミング

7 年間眠っていたブランチを起こして、 Lokka の ActiveRecord 化に取り組み始めた。元のブランチは hrysd さんが取り組んでいたやつだ。

現在の master の内容を取り込むのが大変だった。 active-record ブランチでは ActiveRecord 化と同時に様々な改良・改変が行われていて、 master の内容と思い切りコンフリクトするものがあったりして、コンフリクトの解消作業はかなり大変だった。

active-record の大きな変更点は以下。

  1. カスタムパーマリンク機能の削除
  2. 「もっと読む」機能の削除
  3. カテゴリーをネストさせる機能の削除
  4. ユーザー認証方法の変更(カラムの追加)

このうち 1 と 2 は削除された機能を復活させた。自分が使っていてなくなると困るし、特にカスタムパーマリンクは既存サイトでこの機能を使っているところがデッドリンクだらけになって散々な目に遭ってしまう。 4 に関しても、 master の認証方法と互換性を持たせないと既存ユーザーがログインできなくなるので古い認証方法でもログインできるようにした。

3 に関しては WordPress との互換性を考えると必要かもしれないが、自分で使ってなくてユースケースが思い浮かばないのでいらないかなという感じがする。そもそも Lokka は WordPress キラーとなるべく Fjord 社内で作られ始めたと認識しているが、 WordPress は相変わらず元気だし Lokka の利用状況的にも WordPress alternative を目指す必要はないと思う。

そのほか、 rake db:delete が動かなかったのを直したり bundle update をしてぶっ壊れたところを直したり、デフォルト以外のテーマが ActiveRecord 化してなかったのを対応させたり( dm-pagination から kaminari へ移行)して ActiveRecord 5 で概ね動くところまで持ってくることができた。

ActiveRecord は良くできていて、 DataMapper だと難しかった JOIN した上での集計クエリなどが書きやすい。ドキュメントが山ほどあるのもよい。 DataMapper は情報が少ないのが一番つらかった。一方で DataMapper だと気にする必要がなかった N+1 問題を自分で解決する必要がある。 View でうかつに参照するテーブルのデータを増やすと N+1 問題が発生して途端にパフォーマンスが劣化する。

また、誰がどんな DB で利用するかわからない状況で db/schema.rb を git で追跡してよいものかというのもひかっかる。 ActiveRecord を使う以上、 migration と schema.rb からは逃げられないのだが、 MySQL で使う人も PostgreSQL で使う人も SQLite で使う人もいて、それぞれの DB でマイグレーションを実行するごとに異なる schema.rb が吐き出されるので git で追跡すべきではないのではないかと思う。どんなデータベースで利用されるかを意識せずに開発できる、という点では DataMapper の方が CMS 開発向きだったと思う。

以前の Lokka であればあまり Ruby 知らない人でもとりあえず git clone して自分の好みのテーマを追加して Heroku に push すれば動かせたが、 ActiveRecord 化することで N+1 問題など Rails に強くないと触りにくい感じになってしまった。ただ、 Sass は Ruby を捨てて C に移行したし、 Slim なんかも JavaScript フロントエンド技術の盛り上がりの陰で開発は停滞している。こういう時勢になってくるとフロントエンドに強いマークアップエンジニア兼ウェブデザイナー的な人が Ruby 製の CMS を使う動機はなくなってしまう。 CMS を使ったサイト構築でも Sass や Slim を使って HTML コーディングの生産性を上げ、 Heroku を使って簡単に deploy できる、というのが komagata さん達が最初に想定してた Lokka のユースケースだと思うけど、 JavaScript によるフロントエンド技術が強力になりすぎて、生産性の高いフロントサイド開発のために Ruby を経由する必要がなくなってしまった。


これから Lokka はどうあるべきなのだろうか。モダンなフロントエンドフレームワークは強力だ。否が応でも JAMStack に対応していくしかないだろうと思う。つまり Sinatra で作るのは API (と管理画面)だけになり、フロントエンドは React や Vue.js で作るべきだろう。ちょっとしたサイトを JAMStack で構築したいが、 API に良いのがない、とはいえ Rails は使いたくない、というケースで Lokka を使うという感じだろうか。ただ、いまは Firebase なんかもあるのでそもそも API を自前で持つ必要はないのかもしれない。どのみちかなりニッチなユースケースになるだろう。

ちなみにこのブログの Archive ページは中途半端ながら React で作っていて割といい感じに動いている。 ActiveRecord 化が済んだら React でサイト全体を作り直してみたい。

| @技術/プログラミング

DataMapper のドキュメントを見たくてググったが出てくるのは Stack Overflow ばかりで公式サイトが検索結果に出てこない。 GitHub の DataMapper のリポジトリ( Archive されている)経由で見に行ってみると、なんと ROM ( Ruby Object Mapper ) のページにリダイレクトされた。

ROM は Hanami で使われる ORM で、 DataMapper よりもさらに ActiveRecord と使い心地が異なる。

Qiita の以下の記事を読むと使い方のイメージが湧く。

軽くてシンプルなのだろうがだいぶ特殊だ。

Lokka の使い手は少なくとも Heroku が使える人で、そういう人ならば ActiveRecord の方が Rails の本やドキュメントで学びやすいはずだ。というわけで早めに、真剣に ActiveRecord への移行を考えなければならない。

| @ブログ

noisy-ads.jpg
noisy-ads.jpg

スマートフォンで検索していてある大手ブログサービスでホストされているブログの記事に辿り着いた。記事を読んでいくと、ページ構造が「パーマリンクとは?」という感じになっていて驚いた。まるで蟻地獄で、下にスクロールしても終わりがなく、一度入り込んだら逃げられない感じだった。一つの URL に一つのコンテンツというインターネットのお約束を無視していて、 URL は個別記事のものだけど、下までスクロールすると次の記事の本文が読み込まれる。さらにスクロールするとそのまた次の記事が読み込まれる。 AutoPagerize がページャーのないところでも有効化されている感じで、読者の好みで無効化できない状態になっていた。

記事と記事の間には芸能ニュース記事へのリンクが差し込まれたり、そのブログサービス内で人気の記事ランキングが挟まれたりする。 A さんのブログを読んでいたはずなのに気がつくとゴシップニュースか他の人の炎上記事を読むことになっている。おまけにそこに広告も挟まれてくる。ページ内で URL が指し示すオリジナル記事の分量が 10% に満たないこともあるんじゃないだろうか。書き手にとっても読み手にとっても体験が良くない。大手のブログサービスはどこも同じような感じで、他のニュース記事や人気記事への誘導が激しい。

Twitter を追い出されたあとの Evan Williams が Medium を始めたときは意味がわからなかった。今時ブログサービスなんて始めてどうするんだろうと思った。はてなブログに関しても、なぜいま新しいブログサービスが必要なのかわからなかった。しかしいまならその理由がわかる気がする。

インターネット上でのコミュニケーションの場がブロゴスフィア(死語)から SNS へ移り、ブログの読者は SNS を流し読みしていてタイムラインに流れてきたコンテンツを消化するだけ。著者はコンテンツを提供するだけの存在となってしまい、両者の間でインタラクティブなやりとりが生まれなくなった。そんな状況でもう一度著者と読み手を中心に据えようとして始まったのが Medium だったのではないだろうか。

Medium もはてなブログも広告は表示されないか表示されても少しだし、 Medium の人気記事への誘導は控えめで、はてなブログは同一ブログ内の記事しかお勧めしてこない。

はてなブログを開始されて間もないときに jkondo が書いている記事の最後にこんなフレーズが出てくる。

「個」としての活動が、人生に新しい展開を持ち込み、より豊かな人生につながります。

SNS 、ブログ、あらゆるところで巨大なサービス(=プラットフォーム)が幅を効かせて個人を飲み込もうとしているいま、どこでブログを書くと一番記事の価値を毀損しないかまで考えてブログを書く場所を選んだ方がよいと思う。はてなブログや Medium 、 note も流行ってるっぽいが、自分としてはやっぱり自分のブログを持つのが最高だと思ってる。

独立自営のブログをやる人の選択肢を増やすために、今後も Lokka のメンテナンスはやっていきたい。やりたい・やると宣言して出来てないことだらけで申し訳ないけど、少しずつこのブログの機能を master ブランチに移植していって 2020 年でも常用できるブログにしていきたい。ちなみに以下は Markdown をオン・ザ・フライでプレビューする機能の Pull Request 。

あと Slack に Workspace を作った。何年か前に調べたときは lokka.slack.com が空いてたんだけど誰かに取られてたので lokkahq.slack.com となった。良かったら入ってください。ちなみにまだ僕しかいません。

追記 2020-04-13

cho45 さんの昔のブログ記事を読んでたらわかる(わかる)という記事があったのでリンクしておきます。

ノウハウ蓄積みたいなコンテンツってASP型で預けるのは不安がありすぎるので、自力で配信しようねみたいなウェブ縄文時代みたいな話になるんですが……

CGMサービスの矜持について - 氾濫原

ウェブ縄文時代 ってのは言い得て妙だと思いました。残念だけど一周回って個人ウェブサイトは縄文時代を迎えつつあるんだと思う。

| @ブログ

最近、やたらこのブログにスパムコメントが来るようになった。コメントがあったらメールで通知されるようにしてるのだけど、コメント通知メールが一日十件くらい届く。

スパムコメント
スパムコメント

Google の reCAPTCHA を入れたことでほぼほぼスパムコメントは弾けていたのだけど、最近のスパムは reCAPTCHA をすり抜けるようになってしまったっぽい。加えて Akismet のスパム判定ロジックもポンコツになってしまったようで、ほぼほぼすべてのコメントをスパムと判定しなくなってしまった。

Lokka では Akismet でスパム判定されたコメントは一括削除できるようになっている(この機能は自分で作った)が、スパム判定されなかったコメントはちまちま一つずつ削除しなければならないのが非常に煩わしかった。

なのでコメント一覧にチェックボックスを表示して、チェックを入れたコメントを一括で削除できるようにしてみた。めっちゃ便利。

コメント一括削除
コメント一括削除

Akismet プラグインも少し改造して、自分で NG ワードを設定できるようにした。最近のスパムは露骨に Viagra とか Cialis みたいなキーワードが入ってて、どうしてこんなわかりやすいやつを Akismet は素通りさせてしまうのかわからないのだけど、自前の NG ワードフィルターで二重にチェックするようにした。

NG ワード
NG ワード

最後にアクセスログからスパムっぽいコメントの数を集計して管理画面のダッシュボードで閲覧できるようにした。引き続き監視していきたい。

スパムの状況
スパムの状況