トミー
saekitominaga.fedibird.com.ap.brid.gy
トミー
@saekitominaga.fedibird.com.ap.brid.gy
Web / HTML / Accessibility / 東急電車 / 久米田康治作品
#searchable_by_all_users

🌉 bridged from https://fedibird.com/@SaekiTominaga on the fediverse by https://fed.brid.gy/
暖房のみ:乾燥で死
暖房+加湿器:結露で死
暖房切る:極寒で死
January 2, 2026 at 10:52 AM
'00年代にお世話になっていた「HTMLクイックリファレンス」がいつの間にかオンラインカジノのサイトに変貌していた……。
January 1, 2026 at 11:26 AM
新年なので Windows 2000 をセットアップするなどしています。(IE 5 の挙動を確かめたくなったため)
January 1, 2026 at 10:38 AM
Honoのコードを整頓された状態にするためのeslint-pluginをリリースした - 空の箱 https://blog.inorinrinrin.com/entry/2025/12/25/084537

ちょろっと試した程度だけれどよさげ
Honoのコードを整頓された状態にするためのeslint-pluginをリリースした
この記事はHono Advent Calendar 2025 最終日の記事です。今回は自分が作ったeslint-pluginについて書く。とりあえず作ったものを見て!!そしてLGTMならStarください!!! github.com # きっかけ Honoは非常に柔軟で軽量なWebフレームワークだけど、自由度が高いゆえにチーム開発や規模が大きくなった際にコードの書き方が統一されにくいという課題に直面することがある。特にAIにコーディングをさせているとこの傾向は顕著だ。これは自分がHono Conference 2025での発表内容で登場したプロジェクトを進めているときの経験談からきている*1。 そこで思いついたのがESLintでガードレールを設けること。 そして自作する前にさらっと調べてみたところ、まだ誰かが作って世界に公開している様子はなさげ。ってことで「お、自分で作るか」となった。 # インストールと設定 まずはインストールから*2。 npm install -D eslint-plugin-hono@alpha ESLintのフラット設定(`eslint.config.js`)を使用する場合の設定例は以下の通り。 import globals from "globals"; import pluginJs from "@eslint/js"; import tseslint from "typescript-eslint"; import hono from "eslint-plugin-hono"; export default [ { plugins: { hono: hono, }, }, pluginJs.configs.recommended, ...tseslint.configs.recommended, ...hono.configs.recommended, { files: ["**/*.{ts,tsx,cts,mts}"], languageOptions: { parser: tseslint.parser, parserOptions: { ecmaVersion: "latest", sourceType: "module", project: "./tsconfig.json", }, globals: globals.node, }, }, ]; # 自作したルールの紹介 ここからは、`eslint-plugin-hono` が提供するルールのうち、特に自分でも気に入っている4つのルールについて紹介する。それぞれの意図と Good/Bad パターンを解説する。 ## route-grouping ルート定義を整理整頓するためのルール。Honoでは `app.get` や `app.post` を自由に書ける。けど、パスごと、あるいはインスタンスごとに定義が散らばっていると可読性が下がると自分は思っている。なので、このルールは以下をチェックする。 * 同じパス (`/api/v1`) に対するメソッド (`GET`, `POST`) はまとめて書く。 * `GET` -> `POST` -> `PUT` -> `DELETE` のような一貫した順序を強制する。 ### 👎 Not LGTM const app = new Hono(); // 同じパスなのに定義が離れている app.get('/path1', (c) => c.text('get')); app.get('/path2', (c) => c.text('get')); app.post('/path1', (c) => c.text('post')); // 同じrouteに対しては必ず決まった順番で app.post('/path3', (c) => c.text('post')); app.get('/path3', (c) => c.text('get')); ### 👍 LGTM const app = new Hono(); // パスごとにまとまり、GET -> POST の順になっている app.get('/path1', (c) => c.text('get')); app.post('/path1', (c) => c.text('post')); app.get('/path2', (c) => c.text('get')); app.get('/path3', (c) => c.text('get')); app.post('/path3', (c) => c.text('post')); ## global-middleware-placement 「グローバルミドルウェアはルート定義よりも前に記述すべき」というルール。 基本的に`app.use('*', ...)` のようなグローバルミドルウェアは同じファイル内であればどこでも自由に書ける。が、無秩序にミドルウェアが書かれていくのは個人的に好きではない。特にグローバルミドルウェアは全てのルートに対する副作用だと考えているので、最初にその影響があることを頭に入れてからソースを読み進めたい。 なので、とある`Hono`インスタンスへのグローバルミドルウェアは、そのインスタンスが定義された直後かつ、`get`, `post`などの定義が始まる前に書かれていてほしい。これによって可読性が上がると考えてのルール。 ### 👎 Not LGTM import { serve } from "@hono/node-server"; import { Hono } from "hono"; import { logger } from "hono/logger"; const app = new Hono(); const book = new Hono(); app.get('/', (c) => c.text('Hello')); book.get('/', (c) => c.text('Book Home')); // いろいろ定義があって... // 不意にここでミドルウェアを書く app.use('*', logger()); book.use('*', logger()); serve(app); ### 👍 LGTM import { serve } from "@hono/node-server"; import { Hono } from "hono"; import { logger } from "hono/logger"; const app = new Hono(); const book = new Hono(); app.use("*", logger()); app.get("/", (c) => c.text("Hello")); book.use("*", logger()); book.get("/", (c) => c.text("Book Home")); serve(app); ## param-name-mismatch 個人的に一番気に入っているルール。 ルート定義のパスパラメータ(例: `:id`)と、ハンドラ内で取得する際のパラメータ名(`c.req.param('id')`)が一致しているかをチェックする。 単純なタイポや、仕様変更時の修正漏れを防ぐのに役立つはず。 ### 👎 Not LGTM import { Hono } from "hono"; const app = new Hono(); // 定義は :postId だが、取得しようとしているのは 'id' app.get("/posts/:postId", (c) => { const id = c.req.param("id"); return c.text(`Post ID is ${id}`); }); ### 👍 LGTM import { Hono } from "hono"; const app = new Hono(); app.get("/posts/:postId", (c) => { const id = c.req.param("postId"); // ここを正しくした return c.text(`Post ID is ${id}`); }); ## prefer-http-exception HTTPのエラーレスポンスを返す際に、標準の `Error` ではなく Hono の `HTTPException` を使うよう促すルール。結構Hono初心者向けかも。 `throw new Error('Not Found')` としても、処理が終わるわけではなく、ましてや404がレスポンスされるわけではない。実際にはInternal Server Errorで終了する。`HTTPException` を使うことで、Honoが適切にレスポンスを生成してくれるので、そっちへ誘導する。 ### 👎 Not LGTM import { serve } from "@hono/node-server"; import { Hono } from "hono"; const app = new Hono(); app.get("/posts/:postId", (c) => { const id = c.req.param("postId"); if (id === "1") { // 400ではなくInternal Server Errorになる throw new Error("Bad Request"); } return c.text(`Post ID is ${id}`); }); serve(app); ### 👍 LGTM import { HTTPException } from 'hono/http-exception'; // ステータスコードとメッセージを明示できる throw new HTTPException(404, { message: 'Not Found' }); throw new HTTPException(401, { message: 'Unauthorized' }); ただこのルールは現時点では`Not Found'`のように`Error`に特定の文言を渡している場合にしか検知できないので、改善の余地はまだまだある状態... # おわりに `eslint-plugin-hono` は、Honoを使った開発をより安全により快適にするためのツールで、AIや人間、誰が書いても整頓されたコードになってくれるのを期待する。 現状はまだこのルールたちが予期せぬ動きをしないことを実践でガリガリ使って試し切れてる自信がないので、Alpha版として公開している。なので、ぜひ使ってみて、バグ報告や機能要望などを リポジトリ に送ってほしい。そしてこの記事を読んでみた結果だったり、実際に使ってみたりした結果、応援の気持ちが芽生えたらぜひStarをください! Happy Hono Coding!! 🔥 *1:Hono Conference 2025の登壇内容はこちら。https://blog.inorinrinrin.com/entry/2025/10/18/162046 *2:現状はAlpha版として公開しているため、タグをalphaと指定する必要がある
blog.inorinrinrin.com
December 31, 2025 at 1:20 PM
Chrome の DevTools を開いた状態で localhost にアクセスすると自動的に /.well-known/appspecific/com.chrome.devtools.json へのリクエストが飛ぶようになっていた。
何かと思ったら Automatic Workspace Folders なる機能が最近追加されていたらしい。 https://chromium.googlesource.com/devtools/devtools-frontend/+/main/docs/ecosystem/automatic_workspace_folders.md
Chromium DevTools Ecosystem Guide - Automatic Workspace Folders
chromium.googlesource.com
December 30, 2025 at 2:12 PM
右 Shift キーを押した瞬間に頭が考え中モードに入ってしまい、離すのも面倒だから押したままにしていたら8秒後になんか出た(Windows)
December 30, 2025 at 12:58 PM
Does Chrome get the header element wrong? - Max Design https://www.maxdesign.com.au/articles/header.html

sectionheader role って、実際に使われ出したら sectionhead と混同される例が多発しそう。
……と思ったけれど と
が両立しているくらいなので大丈夫かな。これも HTML5 策定時は絶対混乱するだろと思っていたけれど。
Does Chrome get the header element wrong? - Max Design
If a header sits inside another landmark, it should be defined as generic, but Chrome defines it as sectionHeading - is this wrong?
www.maxdesign.com.au
December 27, 2025 at 12:42 AM
WCAG Understanding SC 1.4.1 で追加される予定のリンク文字色の事例👉https://deploy-preview-3717--wcag2.netlify.app/understanding/use-of-color#focus-on-links
元の PR はこちら👉https://github.com/w3c/wcag/pull/3717

SC 1.4.1 の輝度差に関するコントラスト比は、SC 1.4.3 での前景色と背景色とのコントラスト比と比べてあまり注目されていないように思えるが【要出典】、この追記によって周知が進むだろうか。まーしかし難しい(笑)
1.4.1 Use of color: adding examples to understanding text by detlevhfischer · Pull Request #3717 · w3c/wcag
Adding two examples for using color in focusing elements with the keyboard, one for links that have an additional underline, and one for buttons where the background color changes and focused and u...
github.com
December 26, 2025 at 3:08 AM
For the Love of
- HTMHell https://www.htmhell.dev/adventcalendar/2025/23/

排他的アコーディオンのアクセシビリティの問題で、印刷時の処理はどう決着したのかとブラウザの挙動を見てみたら、Firefox: 強制展開する、Chrome: 強制展開せずだった。
Open UI では言及があったものの、HTML 仕様に name 属性が取り込まれた時には記述なし、というところまでは追っていたけれど、その後議論があったのかしら。
For the Love of <details> - HTMHell
A collection of bad practices in HTML, copied from real websites.
www.htmhell.dev
December 25, 2025 at 12:53 AM
Web 標準動向 2025年12月版 https://zenn.dev/cybozu_frontend/articles/web_standards_trends_202512

aria-focus-combine の提案、これを HTML 属性として個々に付けるのは厳しい……と思ったけれど、Issue の議論を読むと Apple の中の人に iOS VoiceOver のバグと認識されていて、Web ページ側での対応は必要なくなりそうな予感。
Web 標準動向 2025年12月版
zenn.dev
December 24, 2025 at 9:42 AM
これいつの間にか直ってた。Elon Musk はじめて見直した(見直してない)。 https://x.com/search?q="高度な検索" "3月" filter:images&src=typed_query&f=live
December 23, 2025 at 3:54 AM
WebAIM: 2026 Predictions: The Next Big Shifts in Web Accessibility https://webaim.org/blog/2026-predictions/

> Users increasingly rely on system and browser preferences,
同意。続く文章で「increasingly anticipate and respect user preferences across environments」と書かれているけれど、ほんそれ。 […]
Original post on fedibird.com
fedibird.com
December 23, 2025 at 2:45 AM
ブログ書いた。

WCAG 以外の Web アクセシビリティ https://blog.w0s.jp/entry/759
WCAG 以外の Web アクセシビリティ
blog.w0s.jp
December 21, 2025 at 6:31 AM
自分だったら「とんがり帽子の取水塔」の情報は含めるけれどね。
December 20, 2025 at 10:18 AM
アニメ「新こちら葛飾区亀有公園前派出所」公式サイト https://kochikame-anime.com/

正しい代替テキストの使い方だ。アニメのキービジュアルでこれができているサイトは多くないので(というか皆無)、良い事例として覚えておきたい。
アニメ「新こちら葛飾区亀有公園前派出所」公式サイト
連載開始50周年記念「こちら葛飾区亀有公園前派出所」新アニメプロジェクト始動!
kochikame-anime.com
December 20, 2025 at 10:18 AM
iOS Firefox の「ウェブサイトのダークモード」機能はクセがあって見にくいサイトも多いので、Vivaldi をインストールして「すべてのウェブサイトにダークテーマを強制適用」を設定してみた。
こちらはこちらで Firefox とは別のクセがあるので、閲覧するサイトによって使い分ける必要がありそう。
とりあえず自分のブログがとんでもないことになっているのだけれど、何が悪いのか分からない。
December 20, 2025 at 5:56 AM
勘違いされやすい HTML 属性三銃士を連れてきたよ。
勘違いされやすい HTML 属性三銃士?

人間が見るものと思われていない <link title>。うっす、よろしく。(Firefox だと目に見える形でメニューに表示されるんだよ)

アクセシビリティ初心者がやりがちな <section aria-labeledby>。よっす、どうも。(付ければいいってものじゃないよ、ランドマークを理解してから必要な箇所に限って使ってね)

コピペで済まされがちな <iframe title>。がんばります、よろしく。(YouTube の埋め込みコードをコピーする際は title="YouTu […]
Original post on fedibird.com
fedibird.com
December 18, 2025 at 9:02 AM
いやもうすぐ18年かよ……うそだろ https://www.w3.org/TR/2008/WD-html5-20080122/
December 15, 2025 at 12:22 PM
WAI-ARIA 1.3 で datetime 属性相当のプロパティが本当に追加さればそうなる可能性はありそうですが、それを夢見てはや17年(?)が経ってしまいましたから……。
QT: https://m.yufushiro.dev/@yufushiro/115723502631588429 [参照]
m.yufushiro.dev
December 15, 2025 at 12:21 PM
ブログ書いた。

`
December 15, 2025 at 11:57 AM
The
The <time> element should actually do something
nolanlawson.com
December 15, 2025 at 1:33 AM
WebKit Features for Safari 26.2 | WebKit https://webkit.org/blog/17640/webkit-features-for-safari-26-2/

「To improve accessibility, off-screen radio buttons now automatically scroll into view when focused.」ってなんだろう。ラジオボタン限定?
WebKit Features for Safari 26.2
Safari 26.2 is a big release.
webkit.org
December 13, 2025 at 3:34 AM
PC メモリの高騰、噂には聞いていたけれど予想以上に狂っていますね。夏に買い換えておいて良かった……。
December 12, 2025 at 2:03 AM
Issue で怒られてヘコむわー。
そりゃ Deprecate しただけではすでにインストール済みのユーザーへは通知されないけれども、完全削除まで2年近く猶予期間は設けたわけだし、そもそもなんの対価も受け取っていない個人開発よ。突然使えなくなる可能性も含めて自己責任で使って欲しい。
December 11, 2025 at 1:00 PM