| @ブログ

インデックスページをいじって各カテゴリーの最新記事 4 件を配置するようにしてみた。最近の個人サイト復興ブームでみなさんインデックスページを工夫されているのを見ていて真似したくなってやった。

カテゴリーごとに最新記事 4 件を表示

昔ながらのブログだとインデックスページというのは最新の記事 10 件くらいが表示されていて、「次へ」を押すと古い記事が出てくるという構成になっている。以前のこのブログもそうだった。

しかし自分自身が他人のブログで「次へ」を押して次々に記事を読んでいくということをやった記憶がほとんどない。自分のブログでだって何か目的があって特定のキーワードで検索したあとに引っかかった記事を読むという感じなので、時系列に本文とセットで記事が 10 件ずつ表示される UI というのは意味をなしていないと思った。そもそもインデックスという名称なのに最近の記事数件しか表示していないのはおかしい。インデックスというからにはすべての記事の目次になるべきだ。

このブログはカテゴリーがあるので、サイトマップを作るとするとこんな感じになると思う。

+----------+        +------------+        +-----------+
|          |        |            |        |           |
|   Blog   +---+--->+  Category  +------->+   Entry   |
|          |   |    |            |        |           |
+----------+   |    +------------+        +-----------+
               |
               |
               |    +------------+        +-----------+
               |    |            |        |           |
               +--->+  Category  +---+--->+   Entry   |
                    |            |   |    |           |
                    +------------+   |    +-----------+
                                     |
                                     |
                                     |    +-----------+
                                     |    |           |
                                     +--->+   Entry   |
                                     |    |           |
                                     |    +-----------+
                                     |
                                     |
                                     |    +-----------+
                                     |    |           |
                                     +--->+   Entry   |
                                          |           |
                                          +-----------+

第一階層がインデックスページで、第二階層がカテゴリートップ、そして各記事がある。なのでインデックスページは二階層目の一覧ページになっているのが望ましいはずだ。しかし伝統的なブログはカテゴリーという記事をまとめる概念がありつつも、インデックスページから各記事ページへ直接遷移するのが主な導線だった。常に最新の記事が時系列順に並んでいるだけでは味気ないし、常連の読者ではないコンテキストを知らない訪問者には不親切だろう。

しかも SNS の隆盛で個人のブログのインデックスページが参照される機会というのはとんとなくなってしまった。個人が書いたブログ記事は SNS 経由で読まれ、個別記事だけが読まれる。インデックスページやトップページが読まれることはほとんどない。 SNS でシェアされている URL をクリックして個別記事を読んで、それ以上そのブログのほかの記事を読むことなく離脱してしまう。前後のコンテキストは無視して、一つのコンテンツだけがつまみ食いされてしまう。そんな流れにあらがいたいと思った。

これまで関連記事を記事下に表示するなどやってきたが、気に入っていくつか記事を読んで「ホーム」( = インデックスページ)を訪れたユーザーがもう少しブログを深掘りしてみたくなるようにインデックスページを各カテゴリーの最新記事一覧とするようにしてみた。このブログは現在カテゴリーが 13 個あるので、それぞれから 4 件ずつ記事を取得すると 52 記事になる。全カテゴリーからまんべんなく 4 記事ずつ取得して表示するのは簡単なようで結構難しい。普通の SQL ではできない。 OR マッパーではまず無理だろう。

いろいろ調べてみた結果、 MySQL では GROUP_CONCAT というのが使えそうだった。以下のような SQL を書いた。

select entries.id
from entries
inner join (
  select
    category_id,
    GROUP_CONCAT(id order by created_at desc) as entry_ids,
    max(created_at) as last_created_at
  from entries
  where entries.draft = false
  group by category_id
) as grouped_entries
on grouped_entries.category_id = entries.category_id
and FIND_IN_SET(id, entry_ids) between 1 and 4
order by last_created_at desc, entries.id desc;

GROUP_CONCATFIND_IN_SET という関数を組み合わせることで、各カテゴリーから作成日の降順に記事を 4 件ずつ取得できた。このクエリでは記事 id のみ取得して、もう一回 DB に記事を取得するクエリを ActiveRecord で投げる。 ActiveRecord でクエリを組み立てるときは N+1 が起こらないように関連テーブルを JOIN する。

query = <<~SQL
  select entries.id
  from entries
  inner join (
    select
      category_id,
      group_concat(id order by created_at desc) as entry_ids,
      max(created_at) as last_created_at
    from entries
    where entries.draft = false
    group by category_id
  ) as grouped_entries
    on grouped_entries.category_id = entries.category_id
    and find_in_set(id, entry_ids) between 1 and 4
  inner join categories on categories.id = entries.category_id
  order by last_created_at desc, entries.id desc;
SQL
entry_ids = ActiveRecord::Base.connection.select_all(query).rows.flatten
entries = Entry.includes(:category, :user, :tags, :comments).where(id: entry_ids)

PostgreSQL のときに最初に取得した entry_ids の並び順通りに結果が受け取れるかは怪しいが、 MySQL の場合は一回目のクエリで取得した id 順に各レコードが ActiveRecord のクエリ結果として取得できた。あとはこれをカテゴリーごとにグルーピングして View でよろしくやれば良い。

なお各カテゴリーはカテゴリー内の最新の記事の作成日で降順ソートするようにしている。例えば現在のインデックスページの最下部には音楽カテゴリーがあるが、これは音楽についての記事を最後に書いたのが一年以上前だからだ。もしいま音楽の記事を書けば音楽カテゴリーがトップに浮上するようになっている。

見た目に関しては各カテゴリーの記事最新一件は大きなサイズで表示している。最も最近書かれた記事なのでより多く人の目に付いた方がよいだろうという考えだ。またすべての記事にサムネイルというか、アイキャッチ画像を表示するようにした。画像がない記事に関してはデフォルトのサイトアイコン画像を表示するようにしている。やっぱり視覚的に情報を捉えられるのは重要だ。画像がごちゃごちゃ表示されるのを嫌う人もいるかもしれないが、テキストだけでは人間の認知というのはどうしても追いつかない。

あわせて今回、インデックスページの冒頭部にこのサイトについての説明文を載せることにした。ながしまきょうさんr7kamura さんがやっているののパクりだ。伝統的なブログのインデックスページは初めて訪れた人のことを無視しすぎていたと思う。そのブログ自体について説明するページがあるブログは少ない。最初の記事でブログを始めた経緯みたいなことが書かれたきり、そのブログは何なのか、誰が書いているのかが書かれることは希だ。きちんとブログについての説明ページと著者についての説明ページがあっても、左右のサイドバーやトップのナビゲーションの端っこに押し込まれて見られることはない。これではいけないだろう。というわけでインデックスページの一番目立つ位置にブログと自分自身の簡単な紹介を入れた。

インデックスページトップに紹介文を表示

ブログはなぜ衰退したかを考えてみると、 Facebook や Twitter の隆盛はあるにせよ、ブログ自体に初めて訪れた人に読まれるための工夫が欠けていたのだと思う。誰も自分のブログの継続率を計測したりコホート分析したりはしない。読者が前後の記事を読んでいることを前提に書かれた記事やサイト構成では初めて訪れた人はどうやっても離脱してしまう。特に書き手が芸能人でもない一般人の場合はなおさらだ。誰も RSS フィードを購読していないし、ほとんどの読者は初めて訪れる人なのだから、そういう人たちが読んでブログのテーマや著者の人となりが分かる構成にしていかなければならないのだと思う。でないと SNS でたまにバズったときだけ読んでもらえる、ソーシャルメディアの肥やしにしかならない。

この新しいインデックスページが正解なのかどうかは分からないが、ブログ衰退の流れにあらがっていきたい。

| @ブログ

画像を拡大できるようにしたいという欲求は前々からあった。この手のものでは Lightbox が有名だが、 jQuery べったりなのでいまさら使いたくない。 P_BLOG の頃は FacyZoom というやつを使っていて好きだったが、 2008 年から更新されていない。何かいいのがないかなと探していて Medium Zoom というのを見つけた。

ブログサービスの Medium の画像拡大機能のコピープラグインだ。 npm パッケージになっているので導入も楽だった。

実際のこんな感じ。

Medium Zoom 利用風景

| @散財

ウキグモ Light & ウンカイ Light & Hammock Trekking Tarp

一つ前に「キャンプもんなんてするもんじゃない」という趣旨の記事を書いたが、その記事を書いた日の午後に佐賀のキャンプ場までキャンプをしに行った。

池と月

家族はテントの中で寝たが、自分はハンモックで寝てみたいと思っていたので外で寝ることにした。 9 月の連休に久住のキャンプ場に行ったときはキャンプサイトが原っぱでちょうどいい感じの木が生えておらずハンモックを張れなかったので初めて実際のフィールドでハンモックを使うことになる。

ハンモックの中からの景色

ちなみに以前書いた記事ではウキグモ Light (ダウンハンモック)を買ったということは書いていたが、その後ヤフオクを物色していてトップキルト(ハンモック用掛け布団)のウンカイ Light が安く出品されているのを発見したのでサクッと落札した。これによりウキグモ Light とウンカイ Light 、 Exped Hammock Trekking Tarp (軽量タープ)のハンモック泊三種の神器がそろい、温かい低山であればいつでも野営できるようになった。

ハンモック泊三種の神器: ウンカイ Light 、ウキグモ Light 、 Exped Hammock Trekking Tarp

ウンカイ Light に関しては以下のブログが参考になる。

メーカーのアクシーズクインのページと GRiPS のブログも。

実際に張っている様子は以下。

三種の神器

キャンプ場の標高は 550m くらいで、ふもとの気温と標高差からこの日のキャンプ場の最低気温は 15 度前後だったと想像される。ウキグモ Light の快適使用温度は 15 度以上となっていて、またウンカイ Light とも組み合わせていたので条件的には問題ないはずだが、明け方に風が吹くと寒さで目が覚めてしまった。

9 月下旬の久住のキャンプで寒さ対策の必要性を痛感していたので今回は寝るとき用にスウェットパンツと厚手のセーターを着込んでいた。それでも風が吹くと背面が冷えた。 XERO SHOES のサンダルを履いていた都合上、足は裸足で靴下ははいていなかった。ウンカイ Light には足を突っ込めるフットボックスがあるが、それでも足下からも冷気が入り込んで足が冷えた。またウンカイ Light からはみ出している頭にも寒気を感じたので、一度ハンモックから這い出して薄手のウィンドシェルをセーターの上から着てフードを被ってハンモックに入り直した。そうすると随分寒さは軽減されたが、 5 時頃からキャンプ場に合宿に来ていた少年野球クラブの子ども達がわーわーと騒ぎ始め、またあたりが明るくなってきたことにより寝付けなくなってしまった。結局 3 時間しか寝られなかった。以下の学びを得た。

  • ハンモックは寒い。寝るときは厚着が必要。
  • トップキルトからはみ出る頭の部分や足が冷えるのでフードのある服かニットキャップが必要。靴下もはいておく。
  • ハンモック&タープでは外の影響をもろに受ける。周囲の音や日の出で目が覚めるので早寝早起きが快適。

ダウン入りハンモックなので九州の低山であれば真冬でも使えるのではと期待していたが、やはり山は寒い。この感じだとやはりウキグモ Light & ウンカイ Light は晩春から早秋にかけてしか使えない、夏用の寝具と捉えるしかない。どうしても冬場も使いたいなら、ブランケットで体をぐるぐる巻きにするか、ハンモックをまるごと覆ってしまうモグを検討するしかないだろう。

テントと寝袋を買いそろえると高い(テントが 5 万円、寝袋が 3 万円、マットが 1 万円くらいする)し重い(テント 1kg 、寝袋とマットで 1kg くらい)から、ハンモックなら軽いし安く宿泊装備がそろうはず、と思って揃えたハンモックシステムなので、これ以上何か買って本末転倒にならないように気をつけたい。

| @ブログ

blog.8-p.info の過去記事ページの真似をして、 Archive ページにタグを表示するようにしてみた。

Archive ページにタグを表示

タグはあまり使っていなかったのだけど、一覧で記事タイトルだけ並んだときその記事にどんな内容が書いてあるのかを把握するためにはタグが便利だなと思い直し、タグを表示させてみることにした。いくつか過去のタグが付いていない記事にタグを振ってもみた。

このブログは技術情報からポエム、日々の日記まで何でもありのごった煮ブログなので、カテゴリーによる情報分類には限界がある。現在 13 個のカテゴリーがあるが、記事数にバラツキがあり、情報分類としてあまり機能していない。カテゴリーの粒度をもっと荒くして緩い分類に変更し、そこから先はタグによって超細かくラベリングすると情報の分類としてはまともになるのではないかと思った。

いま、カテゴリーの内訳がこんな感じ。

- "雑談":303
- "技術/プログラミング":272
- "映画/ドラマ/テレビ":150
- "Mac/iPhone":134
- "WWW":113
- "散財":95
- "旅行/ハイキング":70
- "ブログ":69
- "音楽":63
- "読書":34
- "写真":32
- "料理/食事":31
- "労働":27

もっと緩い分類にして以下みたいな感じにするとよさそう。

- 雑記
- パソコン・インターネット
- 見た・読んだ・聞いた
- 出かけた・撮った・食べた

カテゴリーとタグの使い分けは 10 年以上前から悩んでいる気がする。

情報分類の手法でありつつコンテンツの内容そのものを指し示すものでもあるからだろう。インスタグラムで #ラーメン #からの #うどん とかやってる投稿を見るととても嫌な気持ちになるのだけど、そういうことがされるくらいにタグというものは不安定なもので、正しく使おうとか気負わず、もっと緩く使えばいいのかもしれない。

もう廃れてしまったが、フォークソノミーが勢いを取り戻して、情報の発信者ではなく受け取り側がコンテンツにタグ付けできるような世の中になるとおもしろいのかもしれない。

| @ブログ

小国のタクシー会社跡地

8 月は 11 記事、 9 月は 6 記事しか書けなかった。

2020 年 8 月のふり返り

8 月は結構駄記事を書いて量産したが、あまり大きな反響を得ることもなく不発に終わった。 Article of the month を自分で挙げるとするとプルドポークについて書いた記事になると思う。プルドポークはおいしいので是非お試しください。

2020 年 9 月のふり返り

9 月に関しては数は書けなかったがじっくり記事を書けたと思う。ウェブ縄文時代についての記事は結構反響があった。

Kazuyoshi Kato さんや「ウェブ縄文時代」という概念の提唱者の cho45 さんにもブログで言及してもらった。

その後 Blog Hacks 2020 という記事を書いた。これに関してはほとんど反響はなかったが、 r7kamura さんが頻繁にブログを更新するようになって個人ブログ界隈がにわかに盛り上がってきている気がする。この流れで今年はこれから年末にかけてウェブ縄文ムーブメントが来る気がする。

その r7kamura さんの記事にヒントを得て画像にキャプションを入れるやつをやってみたけどなかなか良かった。

こういうのができるのがセルフホストのブログを持つことの醍醐味だと思う。

もうちょいペース上げて書かないと 100 記事達成できないので10 月は頑張りたい。

| @ブログ

先日 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 の様相を呈してきている。

| @WWW

新聞社のウェブサイトの記事、ほとんどがペイウォール入るようになったけど社会の不公正や富の格差を是正したい、みたいなテンションの記事がペイウォールに阻まれてると何だかなという感じがする。新聞社は読者にどんな価値を提供して対価を得ようとしているのか分からない。

自分たちの主義主張を読ませるために金を取るのはおかしな話で、そんなビジネスは消費者から受け入れられないと思う。金を取るなら一週間のニュースダイジェストとか、読者 = ユーザーの課題(忙しくてニュースを読む暇がないなど)を解決する何かを提供しないとだめだと思う。

昔はインターネットなかったから紙に文字が印刷してあればどんな内容であっても希少価値があって、それ配布するだけで価値があって消費者が金払ってくれてたのかもしれないけど、いまはインターネットがあるから情報の集約と配布はコストが下がっててそこに価値を見いだすことは難しい。

多くの人は新聞社にストレートニュースを効率的に届けてくれることや、素人には解釈が難しい政治経済の解説などを期待していると思う。金を払って新聞社の主義主張を読みたいのは一部の思想的に偏った人たちだけなはずで、その人達をターゲットにすると思想的にどんどん先鋭化していくしかない。

毎日配達しなくてもいいから週に一回届いて、一週間の出来事ダイジェストと難しい政治経済の事柄を解説してくれるメディアが欲しいよなと思う。 6 年前に同じようなことをブログに書いてた。

21 世紀を生きるフツーの人が求めているのはそういうメディアではないだろうか。

追記 2021-10-28

観念して毎日新聞のスタンダードプランに登録した。