From 4d7c41d38e7ed6164aa01cf8cc340a89bcbe033f Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 4 Sep 2026 22:42:21 +0900 Subject: [PATCH 01/13] =?UTF-8?q?=E5=87=BA=E7=89=88=E3=83=BB=E5=AF=84?= =?UTF-8?q?=E7=A8=BF=E3=81=AE=E6=9B=B8=E7=B1=8D=E3=81=AE=E8=A1=8C=E3=81=AB?= =?UTF-8?q?=E6=9B=B8=E5=BD=B1=E3=82=92=E6=B7=BB=E3=81=88=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 書影は記事のサムネイルを既定にし、書影でないサムネの記事だけ cover: で上書きする。 技術誌には出さない(23件のうち13件が2本のまとめ記事に由来し、号ごとの表紙を持たない)。 関連タグの「外部寄稿」(4本)を「SoftwareDesign」(13本)に差し替えた。 Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/publish-qiita/SKILL.md | 3 +++ CLAUDE.md | 13 +++++++++- scripts/publications.js | 3 +++ themes/future/css-src/theme-styles.styl | 33 ++++++++++++++++++++++--- themes/future/layout/publications.ejs | 21 +++++++++++----- 5 files changed, 63 insertions(+), 10 deletions(-) diff --git a/.claude/skills/publish-qiita/SKILL.md b/.claude/skills/publish-qiita/SKILL.md index ff657d4d2d21..6835ef0f6382 100644 --- a/.claude/skills/publish-qiita/SKILL.md +++ b/.claude/skills/publish-qiita/SKILL.md @@ -61,6 +61,9 @@ description: Qiita の下書き URL と著者名を入力に、hexiita 変換 - `name` は書名・号の名前、`url` は**出版社の商品ページ**(Amazon ではなく、 オライリー・技術評論社・KADOKAWA など。Amazon しか無いならそれでよい) - `work` は雑誌だけ。その号に載った寄稿のタイトル。書籍には書かない + - `cover` は書籍だけ。**書影を一覧の行の左に出すので、記事のサムネイルが + 書影でないときだけ**(本棚や机の写真)画像のパスを書く。省くと + `thumbnail` が使われる - `by` は**記事の著者と書いた人が違うときだけ**書く(イベント参加レポートなど)。 省くと記事の `author` が使われる。連名は `、` で区切る - **1つの号に複数の寄稿があるなら、その記事が扱う分だけ書く。** 一覧は号ではなく diff --git a/CLAUDE.md b/CLAUDE.md index 4e382b47b934..52957b7f23ca 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -728,17 +728,20 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する 生まれない。以前は 2 / 3 / 5 / 6 / 10 / 14 / 25px が混ざっており、多くは 「円の直径の半分」のようにその場で計算した値で、隣の部品と揃える理由が無いまま 1px ずつ違っていた -- **サムネイルの寸法は4つしかない。新しい値を作らず、器の形で選ぶ**(#2790)。 +- **サムネイルの寸法は5つしかない。新しい値を作らず、器の形で選ぶ**(#2790)。 いずれも `object-fit: cover` で切り抜き、角丸は `radius-small`。サムネの実寸は 幅300px・高さがばらばら(比 1.0〜3.2)なので、寸法はこちら側の枠が決める | 器 | 寸法 | 使うところ | | --- | --- | --- | | 行に添える(`post-list-icon`) | 72×48 | 関連記事・被参照・ランキング・索引記事の表 | + | 書影(`publication-thumb`) | 60×80 | 出版・寄稿の書籍の行 | | 横並びのカード(`panel-thumb`) | 88×59 | サイドバーの枠・記事末のパネル・We're hiring | | パネルのグリッド | 200×135 | ホームの連載/特設パネル・`/series/` 一覧 | | 一覧カードの頭(`card-thumb`) | 幅100%・`aspect-ratio: 1200/630` | 記事一覧のカード(OGP と同じ比) | + - **書影だけ縦長(3:4)。** ほかの4つは横長で、比 0.71〜0.79 の書影を + `cover` で切ると書名が読めない。ここだけ器の向きが中身に従う - 比は 3:2 前後に揃っているが完全には一致しない(1.500 / 1.492 / 1.481)。 200×135 が標準サムネの寸法で、88×59 はその比を88px幅に丸めた値。 72×48 だけ 3:2 ちょうどなのは、48×32 では何の画像か読み取れず @@ -1968,6 +1971,14 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する (一度踏んだ)。全部を YYYYMM の数値1つに寄せてから比べる - **表紙は並べない。** 買い物ページではなく「誰が何を書いたか」の記録なので、 絵よりも書名・寄稿タイトル・執筆者が読めることを優先する + - **書影を添えるのは書籍の節だけ。** 8件すべての紹介記事がサムネイルに書影を + 使っているので、`cover:` が無ければ記事のサムネイルを借りる(新しい画像を + 増やさない)。書影でないサムネの記事だけ `cover:` が上書きする。 + **技術誌には出さない**——23件のうち13件が2本のまとめ記事に由来し、 + 号ごとの表紙を持たない(10件は同じコラージュ1枚、3件はサムネイル自体が無い)。 + **表紙は並べない**(#2912)を書籍だけ緩めた形で、「絵よりも書名・寄稿タイトル・ + 執筆者が読めることを優先する」は変えていない(書影は行の左の 60×80 で、 + 書名の可読性を奪わない) - **記事の無い書籍は載らない。** 「記事に付随して書く」ことの帰結。 **ページ本文にはそう書かない**(#2895。読者に語るのは中身であって、 ページの作り方と収録の運用ではない) diff --git a/scripts/publications.js b/scripts/publications.js index ad908ebd4719..456600c3226a 100644 --- a/scripts/publications.js +++ b/scripts/publications.js @@ -21,6 +21,9 @@ const entry = (post, item) => ({ url: item.url, work: item.work || '', by: item.by || post.author || '', + // 書影は記事のサムネイルを既定にする。書籍の紹介記事はサムネイルに書影を + // 使うのが慣例で、そうでない記事だけ cover: が上書きする + cover: item.cover || post.thumbnail || '', post: { title: post.title, path: '/' + post.path }, key: issueKey(item.url), date: post.date.valueOf(), diff --git a/themes/future/css-src/theme-styles.styl b/themes/future/css-src/theme-styles.styl index 616b0dc6c2f2..6428cbf773f4 100644 --- a/themes/future/css-src/theme-styles.styl +++ b/themes/future/css-src/theme-styles.styl @@ -6400,9 +6400,7 @@ sg-ratios(sg-dark-award, dark-surface-base) margin-top: 0; } -/* 出版・寄稿の一覧 (#2912)。表紙は並べない。買い物ページではなく - 「誰が何を書いたか」の記録なので、書名と執筆者が読めることを優先する。 - 1件は「書名」+「寄稿タイトル / 執筆者 / 記事」の2行 */ +/* 出版・寄稿の一覧 (#2912)。1件は「書名」+「寄稿タイトル / 執筆者 / 記事」の2行 */ .publication-list { margin-bottom: (space-step * 6); } @@ -6410,6 +6408,35 @@ sg-ratios(sg-dark-award, dark-surface-base) border-top: 1px solid var(--rule-weak); padding: (space-step * 3) 0; } +/* 書籍の行だけ左に書影を添える。既存の4つの器はどれも横長で、縦長(比 0.71〜0.79)の + 書影を cover で切ると書名が読めないので、5つ目の器として 3:4 を持つ */ +.publication-item-book { + display: flex; + gap: (space-step * 3); +} +.publication-thumb { + flex-shrink: 0; + line-height: 0; +} +.publication-thumb img { + width: 60px; + height: 80px; + object-fit: cover; + /* 透過PNGは白い紙の上で描かれている (#3194) */ + background-color: surface-base; +} +/* 書影を持たない書籍の空き枠。枠と大きさは書影があるときと同じに保つ (#2864) */ +.publication-thumb-empty { + display: block; + width: 60px; + height: 80px; + background: var(--surface-mute); + border-radius: radius-small; +} +/* 書名が長いときに flex アイテムがはみ出さないようにする */ +.publication-body { + min-width: 0; +} .publication-name { margin: 0; font-size: text-body; diff --git a/themes/future/layout/publications.ejs b/themes/future/layout/publications.ejs index 667d74956de0..a41e73185628 100644 --- a/themes/future/layout/publications.ejs +++ b/themes/future/layout/publications.ejs @@ -1,6 +1,6 @@ <%# 出版・寄稿の一覧 (#2912)。記事のフロントマターの books / magazines から - scripts/publications.js が集める。表紙は並べない——買い物ページではなく - 「誰が何を書いたか」の記録なので、書名・寄稿タイトル・執筆者が読めることを優先する。 + scripts/publications.js が集める。書影を添えるのは書籍の節だけ——技術誌は + 23件のうち13件が号ごとの表紙を持たない(2本のまとめ記事に由来する)。 行き先は出版社のページで、リンク1本ずつに印を付けずページの本文で一度名乗る (#2729) %> <% const pub = publications(); %>
@@ -18,9 +18,18 @@ <%- partial('_partial/section-heading', {id: 'books', text: '書籍'}) %>
    <% pub.books.forEach(function(b){ %> -
  • -

    <%= b.name %>

    -

    <%= b.by %> / <%= b.post.title %>

    +
  • + <%# 書影は書名と同じ行き先なので、タブ順と読み上げから外す (#2845)。 + 書影が無い書籍でも行の左端をそろえるため空き枠を置く %> + <% if (b.cover) { %> + + <% } else { %> + + <% } %> +
    +

    <%= b.name %>

    +

    <%= b.by %> / <%= b.post.title %>

    +
  • <% }) %>
@@ -40,7 +49,7 @@
<%- partial('_partial/tag-chips', {items: [ {name: '出版', path: '/tags/出版/'}, - {name: '外部寄稿', path: '/tags/外部寄稿/'}, + {name: 'SoftwareDesign', path: '/tags/SoftwareDesign/'}, ]}) %>
From f3a0bf300cec61d5203144b64131e5c810cba30a Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 4 Sep 2026 22:55:36 +0900 Subject: [PATCH 02/13] =?UTF-8?q?=E6=9B=B8=E7=B1=8D=E3=82=92=E3=83=91?= =?UTF-8?q?=E3=83=8D=E3=83=AB=E3=81=AE=E3=82=B0=E3=83=AA=E3=83=83=E3=83=89?= =?UTF-8?q?=E3=81=A72=E5=88=97=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 連載・HTTF と同じ panel-card を使い、書影は縦長の器(panel-thumb-book 60×80)を variant で持たせた。3列にすると添えの「執筆者 / 記事タイトル」が3〜4行に折り返し、 文字の塊が書影より高くなる。 Software Design 2026年1月号は /articles/20260217a/ も寄稿記事なので magazines: を書いた。 Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 6 ++- scripts/thumbnail_image_size.js | 13 +++++-- ...53\343\202\210\343\201\233\343\201\246.md" | 4 ++ themes/future/css-src/theme-styles.styl | 39 +++++-------------- themes/future/layout/_partial/panel-card.ejs | 13 +++++-- themes/future/layout/publications.ejs | 29 +++++++------- 6 files changed, 52 insertions(+), 52 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 52957b7f23ca..05a84cefc249 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -735,7 +735,7 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する | 器 | 寸法 | 使うところ | | --- | --- | --- | | 行に添える(`post-list-icon`) | 72×48 | 関連記事・被参照・ランキング・索引記事の表 | - | 書影(`publication-thumb`) | 60×80 | 出版・寄稿の書籍の行 | + | 書影(`panel-thumb-book`) | 60×80 | 出版・寄稿の書籍のパネル | | 横並びのカード(`panel-thumb`) | 88×59 | サイドバーの枠・記事末のパネル・We're hiring | | パネルのグリッド | 200×135 | ホームの連載/特設パネル・`/series/` 一覧 | | 一覧カードの頭(`card-thumb`) | 幅100%・`aspect-ratio: 1200/630` | 記事一覧のカード(OGP と同じ比) | @@ -1971,6 +1971,10 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する (一度踏んだ)。全部を YYYYMM の数値1つに寄せてから比べる - **表紙は並べない。** 買い物ページではなく「誰が何を書いたか」の記録なので、 絵よりも書名・寄稿タイトル・執筆者が読めることを優先する + - **書籍はパネルのグリッドで2列**(連載・HTTF と同じ `panel-card`)。**3列にしない** + ——添えが「執筆者 / 記事タイトル」で、3列だと列の文字幅が 122〜212px になり + 添えが3〜4行に折り返す。文字の塊が書影(80px)より高くなって帯が崩れる。 + 2列なら題は1行、添えは1〜2行で、塊は 43〜82px に収まる(実測) - **書影を添えるのは書籍の節だけ。** 8件すべての紹介記事がサムネイルに書影を 使っているので、`cover:` が無ければ記事のサムネイルを借りる(新しい画像を 増やさない)。書影でないサムネの記事だけ `cover:` が上書きする。 diff --git a/scripts/thumbnail_image_size.js b/scripts/thumbnail_image_size.js index b2c6f49fbd73..82c6805d68cb 100644 --- a/scripts/thumbnail_image_size.js +++ b/scripts/thumbnail_image_size.js @@ -8,14 +8,21 @@ const { imageSize } = require('image-size'); const currentDir = process.cwd(); +const measure = (path) => { + const buffer = readFileSync(currentDir + '/source/' + path); + const { width, height } = imageSize(buffer); + return { width, height }; +}; + hexo.extend.helper.register('image_size_attribute', (path) => { if (!path) { return ''; // pathが未定義の場合や空の場合は空文字を返す } - const fullPath = currentDir + '/source/' + path; - const buffer = readFileSync(fullPath); - const dimensions = imageSize(buffer); + const dimensions = measure(path); return `width="${dimensions.width}" height="${dimensions.height}"`; }); + +// 属性の断片ではなく数値で受け取る呼び出し元用(panel-card の thumb など) +hexo.extend.helper.register('image_size', (path) => (path ? measure(path) : null)); diff --git "a/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" "b/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" index a2c37f19b8c9..8ddc84399578 100644 --- "a/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" +++ "b/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" @@ -11,6 +11,10 @@ categories: thumbnail: /images/2026/20260217a/thumbnail.jpg author: 真野隼記 lede: "同僚の澁川さん、松本さんと一緒に、Software Design 2026年1月号の第1特集「アルゴリズムはどこに効く?」にて、第3章「パフォーマンス問題の診断とアーキテクチャの再考」を寄稿しました。" +magazines: + - name: "Software Design 2026年1月号" + url: https://gihyo.jp/magazine/SD/archive/2026/202601 + work: "アルゴリズムはどこに効く? 第3章 パフォーマンス問題の診断とアーキテクチャの再考" --- diff --git a/themes/future/css-src/theme-styles.styl b/themes/future/css-src/theme-styles.styl index 6428cbf773f4..181aa8ba3b25 100644 --- a/themes/future/css-src/theme-styles.styl +++ b/themes/future/css-src/theme-styles.styl @@ -5685,6 +5685,16 @@ p.more-link { background: var(--surface-mute); border-radius: radius-small; } +/* 書影の器(出版・寄稿の書籍)。ほかの4つはどれも横長で、縦長の書影(比 0.71〜0.79)を + cover で切ると書名が読めないので、ここだけ 3:4 を持つ */ +.panel-thumb-book { + flex-basis: 60px; +} +.panel-thumb-book img, +.panel-thumb-book.panel-thumb-empty { + width: 60px; + height: 80px; +} /* カテゴリページの見出し行(#2294)。RSS購読アイコンを見出しの右端に置く */ .list-page-header { @@ -6408,35 +6418,6 @@ sg-ratios(sg-dark-award, dark-surface-base) border-top: 1px solid var(--rule-weak); padding: (space-step * 3) 0; } -/* 書籍の行だけ左に書影を添える。既存の4つの器はどれも横長で、縦長(比 0.71〜0.79)の - 書影を cover で切ると書名が読めないので、5つ目の器として 3:4 を持つ */ -.publication-item-book { - display: flex; - gap: (space-step * 3); -} -.publication-thumb { - flex-shrink: 0; - line-height: 0; -} -.publication-thumb img { - width: 60px; - height: 80px; - object-fit: cover; - /* 透過PNGは白い紙の上で描かれている (#3194) */ - background-color: surface-base; -} -/* 書影を持たない書籍の空き枠。枠と大きさは書影があるときと同じに保つ (#2864) */ -.publication-thumb-empty { - display: block; - width: 60px; - height: 80px; - background: var(--surface-mute); - border-radius: radius-small; -} -/* 書名が長いときに flex アイテムがはみ出さないようにする */ -.publication-body { - min-width: 0; -} .publication-name { margin: 0; font-size: text-body; diff --git a/themes/future/layout/_partial/panel-card.ejs b/themes/future/layout/_partial/panel-card.ejs index 71d26a844cff..f95cc2599fda 100644 --- a/themes/future/layout/_partial/panel-card.ejs +++ b/themes/future/layout/_partial/panel-card.ejs @@ -10,7 +10,8 @@ 引数: url 行き先(必須) title 題(必須) - thumb {src, width, height, contain} か null。null なら空き枠を出す + thumb {src, width, height, contain, variant} か null。null なら空き枠を出す + variant は器の形を替える('book' で縦長の書影 60×80) label {icon, text} か null。種別の名札 (#2892) meta 題の下の添え。**HTML を受け取る**(HTTF はリンクを含む) more {url, text} か null。カードごとの全件導線 @@ -31,15 +32,19 @@ const panelMeta = typeof meta === 'undefined' ? null : meta; const panelMore = typeof more === 'undefined' ? null : more; const panelBlank = (typeof external !== 'undefined' && external) ? ' target="_blank" rel="noopener"' : ''; + const thumbShape = (panelThumb && panelThumb.contain ? ' panel-thumb-contain' : '') + + (panelThumb && panelThumb.variant ? ' panel-thumb-' + panelThumb.variant : ''); + %><%# 器の形(variant)は絵が無いときの空き枠にも要るので、src の有無だけで枝を分ける %><% + const hasThumb = panelThumb && panelThumb.src; %>
- <% if (panelThumb) { %> - <% } else { %> <%# サムネの無いものは同じ大きさの空き枠で行頭を揃える(post_list.js と同じ流儀) %> - + <% } %>
<%# 名札はリンクの外に置く。種別はカードの属性であって導線ではない (#2892) %> diff --git a/themes/future/layout/publications.ejs b/themes/future/layout/publications.ejs index a41e73185628..a77972ff3d01 100644 --- a/themes/future/layout/publications.ejs +++ b/themes/future/layout/publications.ejs @@ -16,23 +16,22 @@

フューチャーの社員が書いた書籍<%= pub.books.length %>点と、技術誌への寄稿<%= pub.magazines.length %>件です。書名・号の名前は出版社のページに、それぞれの行は書いた本人によるブログの記事にリンクしています。

<%- partial('_partial/section-heading', {id: 'books', text: '書籍'}) %> -
    + <%# 書籍はパネルのグリッド(連載・HTTF と同じ部品)で2列。3列にすると添えの + 「執筆者 / 記事タイトル」が幅122〜212pxで3〜4行に折り返し、文字の塊が + 書影(80px)より高くなる。2列なら題は1行、添えは1〜2行に収まる %> +
    <% pub.books.forEach(function(b){ %> -
  • - <%# 書影は書名と同じ行き先なので、タブ順と読み上げから外す (#2845)。 - 書影が無い書籍でも行の左端をそろえるため空き枠を置く %> - <% if (b.cover) { %> - - <% } else { %> - - <% } %> -
    -

    <%= b.name %>

    -

    <%= b.by %> / <%= b.post.title %>

    -
    -
  • +
    + <%- partial('_partial/panel-card', { + url: b.url, + title: b.name, + thumb: Object.assign({src: b.cover, variant: 'book'}, image_size(b.cover)), + meta: escape_html(b.by) + ' / ' + escape_html(b.post.title) + '', + external: true, + }) %> +
    <% }) %> -
+
<%- partial('_partial/section-heading', {id: 'magazines', text: '技術誌への寄稿'}) %> <%# まとめる単位は号ではなく寄稿1件。1つの号に複数の寄稿があり、書いた人も違う %> From 0d46a94cd25e9ba18f41fe3194ad4e4f15d0b945 Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 4 Sep 2026 22:56:45 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=E6=9B=B8=E7=B1=8D=E3=81=AE=E3=83=91?= =?UTF-8?q?=E3=83=8D=E3=83=AB=E3=81=8B=E3=82=89=E8=91=97=E8=80=85=E5=90=8D?= =?UTF-8?q?=E3=82=92=E8=90=BD=E3=81=A8=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit by(無ければ記事の author)は1名なので、共著・共訳でも単著に見える。 技術誌は「その号のその章を誰が書いたか」が単位なので出したままにする。 Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 4 ++++ themes/future/layout/publications.ejs | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 05a84cefc249..3ceb5e3ea556 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1971,6 +1971,10 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する (一度踏んだ)。全部を YYYYMM の数値1つに寄せてから比べる - **表紙は並べない。** 買い物ページではなく「誰が何を書いたか」の記録なので、 絵よりも書名・寄稿タイトル・執筆者が読めることを優先する + - **書籍のパネルに著者名を出さない。** `by`(無ければ記事の `author`)は1名なので、 + 共著・共訳でもその1名だけが出て単著に見える。添えは記事へのリンクだけにする。 + **技術誌には出す**——寄稿は「その号のその章を誰が書いたか」が単位で、 + 連名は `by` に `、` 区切りで書ける - **書籍はパネルのグリッドで2列**(連載・HTTF と同じ `panel-card`)。**3列にしない** ——添えが「執筆者 / 記事タイトル」で、3列だと列の文字幅が 122〜212px になり 添えが3〜4行に折り返す。文字の塊が書影(80px)より高くなって帯が崩れる。 diff --git a/themes/future/layout/publications.ejs b/themes/future/layout/publications.ejs index a77972ff3d01..c87d4425cc32 100644 --- a/themes/future/layout/publications.ejs +++ b/themes/future/layout/publications.ejs @@ -26,7 +26,8 @@ url: b.url, title: b.name, thumb: Object.assign({src: b.cover, variant: 'book'}, image_size(b.cover)), - meta: escape_html(b.by) + ' / ' + escape_html(b.post.title) + '', + // 著者名は出さない。共著・共訳でも1名しか出ないので単著に見える + meta: '' + escape_html(b.post.title) + '', external: true, }) %>
From 1d3d2d73cf9d14d48f4eb2559a3fd6d2ca07851a Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 4 Sep 2026 22:59:10 +0900 Subject: [PATCH 04/13] =?UTF-8?q?=E5=90=8C=E3=81=98=E5=8F=B7=E3=82=921?= =?UTF-8?q?=E8=A1=8C=E3=81=AB=E3=81=BE=E3=81=A8=E3=82=81=E3=80=81=E5=AF=84?= =?UTF-8?q?=E7=A8=BF=E3=82=92=E8=A1=8C=E3=81=AE=E4=B8=AD=E3=81=AB=E7=A9=8D?= =?UTF-8?q?=E3=82=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 号が2行に分かれると同じ号を2冊と読み違える。冊数は22、寄稿は24件なので、 本文が名乗る件数は magazineCount が持つ。 Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/publish-qiita/SKILL.md | 4 ++-- CLAUDE.md | 7 +++++-- scripts/publications.js | 21 ++++++++++++++++++++- themes/future/layout/publications.ejs | 9 ++++++--- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/.claude/skills/publish-qiita/SKILL.md b/.claude/skills/publish-qiita/SKILL.md index 6835ef0f6382..f1e68da6722e 100644 --- a/.claude/skills/publish-qiita/SKILL.md +++ b/.claude/skills/publish-qiita/SKILL.md @@ -66,8 +66,8 @@ description: Qiita の下書き URL と著者名を入力に、hexiita 変換 `thumbnail` が使われる - `by` は**記事の著者と書いた人が違うときだけ**書く(イベント参加レポートなど)。 省くと記事の `author` が使われる。連名は `、` で区切る - - **1つの号に複数の寄稿があるなら、その記事が扱う分だけ書く。** 一覧は号ではなく - 寄稿1件を単位にしているので、同じ号が2行出てよい + - **1つの号に複数の寄稿があるなら、その記事が扱う分だけ書く。** 同じ号を書いた記事が + 既にあっても気にしなくてよい。一覧は号ごとに1行へまとめ、寄稿をその行の中に積む - **参考として挙げた他者の本は書かない。** 一覧は「フューチャーの社員が書いたもの」で、 本文に出てくる書籍リンクをすべて拾う場所ではない - 並びは `url` から取る号の年月なので、記事の日付とずれていてよい diff --git a/CLAUDE.md b/CLAUDE.md index 3ceb5e3ea556..0d3d0eb7cee7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1962,8 +1962,11 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する 57件を実際に見ると、**自社の本と参考に挙げた他者の本が同じ形で混ざる** (「日本語書き下ろしで3版まで進んでいるのは Sphinxをはじめようと、本書のみ」・ 「後藤ゆきさん著の細かく紹介している本」)。どちらかは本文を読まないと分からない - - **まとめる単位は号ではなく寄稿1件。** 1つの号に複数の寄稿がある - (2019年3月号は機械学習の章とJavaScriptの章の2本で、書いた人も違う) + - **1行は号1冊。寄稿はその行の中に積む。** 1つの号に複数の寄稿があり + (2019年3月号は機械学習の章とJavaScriptの章の2本、2026年1月号は特集と第3章の2本で、 + 書いた人も記事も違う)、**号が2行に分かれると同じ号を2冊と読み違える**。 + 行の見出しは号の名前で、その下に「寄稿タイトル / 執筆者 / 記事」を寄稿の数だけ並べる。 + 冊数は22、寄稿は24件なので、**本文が名乗るのは寄稿の件数**(`magazineCount`) - **並べるのは記事の日付ではなく「出たもの」の順。** 号の年月は URL の `/archive/YYYY/YYYYMM` から取る(2024年8月号の記事が12月に出ていた)。 巻で数える WEB+DB PRESS は年までしか取れないのでその年の最後に置く。 diff --git a/scripts/publications.js b/scripts/publications.js index 456600c3226a..4b5f8cd1c098 100644 --- a/scripts/publications.js +++ b/scripts/publications.js @@ -29,6 +29,24 @@ const entry = (post, item) => ({ date: post.date.valueOf(), }); +/** + * 同じ号は1行にまとめ、寄稿を行の中に積む。1つの号に複数の寄稿があり + * (書いた人も記事も違う)、号が2行に分かれると同じ号を2冊と読み違える + */ +const groupByIssue = (magazines) => { + const issues = []; + magazines.forEach((m) => { + const last = issues[issues.length - 1]; + const item = { work: m.work, by: m.by, post: m.post }; + if (last && last.url === m.url) { + last.items.push(item); + return; + } + issues.push({ name: m.name, url: m.url, items: [item] }); + }); + return issues; +}; + hexo.extend.helper.register('publications', function () { const books = []; const magazines = []; @@ -38,5 +56,6 @@ hexo.extend.helper.register('publications', function () { }); books.sort((a, b) => b.date - a.date || (a.name < b.name ? -1 : 1)); magazines.sort((a, b) => b.key - a.key || b.date - a.date || (a.name < b.name ? -1 : 1)); - return { books, magazines }; + // 冊数ではなく寄稿の件数を本文が名乗るので、まとめる前の数も返す + return { books, magazines: groupByIssue(magazines), magazineCount: magazines.length }; }); diff --git a/themes/future/layout/publications.ejs b/themes/future/layout/publications.ejs index c87d4425cc32..ffb75ef46582 100644 --- a/themes/future/layout/publications.ejs +++ b/themes/future/layout/publications.ejs @@ -13,7 +13,7 @@
<%- partial('_partial/section-heading', {id: 'magazines', text: '技術誌への寄稿'}) %> - <%# まとめる単位は号ではなく寄稿1件。1つの号に複数の寄稿があり、書いた人も違う %> + <%# 1行は号1冊で、寄稿は行の中に積む。1つの号に複数の寄稿があり + (書いた人も記事も違う)、号が2行に分かれると2冊と読み違える %>
    <% pub.magazines.forEach(function(m){ %>
  • <%= m.name %>

    -

    <% if (m.work) { %><%= m.work %> / <% } %><%= m.by %> / <%= m.post.title %>

    + <% m.items.forEach(function(w){ %> +

    <% if (w.work) { %><%= w.work %> / <% } %><%= w.by %> / <%= w.post.title %>

    + <% }) %>
  • <% }) %>
From 1245d914d957fa34ed0af77807270a6c355ae90e Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 4 Sep 2026 23:02:57 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=E6=8A=80=E8=A1=93=E8=AA=8C=E3=81=AE?= =?UTF-8?q?=E8=A1=8C=E3=82=92=E3=80=8C=E5=8F=B7=EF=BC=8B=E7=AB=A0=E3=80=8D?= =?UTF-8?q?=E3=81=A8=E3=80=8C=E8=AA=B0=E3=81=8C=EF=BC=8F=E8=A8=98=E4=BA=8B?= =?UTF-8?q?=E3=80=8D=E3=81=AE2=E6=AE=B5=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1行目が What(号の名前+特集名。特集名は ink-mute)、2行目以降が Who(執筆者 / 記事)。 同じ特集に複数人が寄稿していれば人を行の中に積む。 Software Design 2026年1月号の work を特集名でそろえて1行にまとめた。 Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills/publish-qiita/SKILL.md | 4 +++- CLAUDE.md | 13 ++++++++----- scripts/publications.js | 10 +++++----- ...\201\227\343\201\237\343\201\212\350\251\261.md" | 2 +- ...\201\253\343\202\210\343\201\233\343\201\246.md" | 2 +- themes/future/css-src/theme-styles.styl | 6 ++++++ themes/future/layout/publications.ejs | 8 ++++---- 7 files changed, 28 insertions(+), 17 deletions(-) diff --git a/.claude/skills/publish-qiita/SKILL.md b/.claude/skills/publish-qiita/SKILL.md index f1e68da6722e..8e6b493cf291 100644 --- a/.claude/skills/publish-qiita/SKILL.md +++ b/.claude/skills/publish-qiita/SKILL.md @@ -60,7 +60,9 @@ description: Qiita の下書き URL と著者名を入力に、hexiita 変換 - `name` は書名・号の名前、`url` は**出版社の商品ページ**(Amazon ではなく、 オライリー・技術評論社・KADOKAWA など。Amazon しか無いならそれでよい) - - `work` は雑誌だけ。その号に載った寄稿のタイトル。書籍には書かない + - `work` は雑誌だけ。その号の**特集・章の名前**。一覧は「号+`work`」で1行にまとまるので、 + 同じ特集に複数人が寄稿しているなら**同じ文字列**にする(章番号や章タイトルまで + 書き分けると号が2行に分かれる)。書籍には書かない - `cover` は書籍だけ。**書影を一覧の行の左に出すので、記事のサムネイルが 書影でないときだけ**(本棚や机の写真)画像のパスを書く。省くと `thumbnail` が使われる diff --git a/CLAUDE.md b/CLAUDE.md index 0d3d0eb7cee7..316a1757ed42 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1962,11 +1962,14 @@ bootstrap-subset → theme-styles.styl の順で `/css/site.css` に連結する 57件を実際に見ると、**自社の本と参考に挙げた他者の本が同じ形で混ざる** (「日本語書き下ろしで3版まで進んでいるのは Sphinxをはじめようと、本書のみ」・ 「後藤ゆきさん著の細かく紹介している本」)。どちらかは本文を読まないと分からない - - **1行は号1冊。寄稿はその行の中に積む。** 1つの号に複数の寄稿があり - (2019年3月号は機械学習の章とJavaScriptの章の2本、2026年1月号は特集と第3章の2本で、 - 書いた人も記事も違う)、**号が2行に分かれると同じ号を2冊と読み違える**。 - 行の見出しは号の名前で、その下に「寄稿タイトル / 執筆者 / 記事」を寄稿の数だけ並べる。 - 冊数は22、寄稿は24件なので、**本文が名乗るのは寄稿の件数**(`magazineCount`) + - **1行は「号+章」。1行目が What、2行目以降が Who。** + 1行目は号の名前(リンク)と特集・章の名前(`ink-mute` で一段弱める。行き先を + 名乗るのは号の側)、2行目以降が「執筆者 / 記事」。**同じ章に複数人が寄稿していれば + 人をその行の中に積む**(2026年1月号は特集「アルゴリズムはどこに効く?」に2人)。 + 章まで書き分けると同じ号が2行に分かれるので、`work` は特集の名前でそろえる + - **号だけを見出しにはしない。** 章の違う寄稿を1行に畳むと、下に並ぶ「誰が」が + どちらの章のものか読めなくなる(2019年3月号は機械学習の章とJavaScriptの章) + - 冊数は22、寄稿は24件なので、**本文が名乗るのは寄稿の件数**(`magazineCount`) - **並べるのは記事の日付ではなく「出たもの」の順。** 号の年月は URL の `/archive/YYYY/YYYYMM` から取る(2024年8月号の記事が12月に出ていた)。 巻で数える WEB+DB PRESS は年までしか取れないのでその年の最後に置く。 diff --git a/scripts/publications.js b/scripts/publications.js index 4b5f8cd1c098..5d3c0d751068 100644 --- a/scripts/publications.js +++ b/scripts/publications.js @@ -30,19 +30,19 @@ const entry = (post, item) => ({ }); /** - * 同じ号は1行にまとめ、寄稿を行の中に積む。1つの号に複数の寄稿があり - * (書いた人も記事も違う)、号が2行に分かれると同じ号を2冊と読み違える + * 1行は「号+章」で、同じ章に複数人が寄稿していれば書いた人をその行の中に積む。 + * 号だけを見出しにすると、章の違う寄稿に並ぶ「誰が」がどちらの章のものか読めない */ const groupByIssue = (magazines) => { const issues = []; magazines.forEach((m) => { const last = issues[issues.length - 1]; - const item = { work: m.work, by: m.by, post: m.post }; - if (last && last.url === m.url) { + const item = { by: m.by, post: m.post }; + if (last && last.url === m.url && last.work === m.work) { last.items.push(item); return; } - issues.push({ name: m.name, url: m.url, items: [item] }); + issues.push({ name: m.name, url: m.url, work: m.work, items: [item] }); }); return issues; }; diff --git "a/source/_posts/2025/20251218a_Software_Design_2026\345\271\2641\346\234\210\345\217\267\343\201\256\343\202\242\343\203\252\343\202\264\343\203\252\343\202\272\343\203\240\347\211\271\351\233\206\343\201\253\345\257\204\347\250\277\343\201\227\343\201\237\343\201\212\350\251\261.md" "b/source/_posts/2025/20251218a_Software_Design_2026\345\271\2641\346\234\210\345\217\267\343\201\256\343\202\242\343\203\252\343\202\264\343\203\252\343\202\272\343\203\240\347\211\271\351\233\206\343\201\253\345\257\204\347\250\277\343\201\227\343\201\237\343\201\212\350\251\261.md" index 80191e11f39e..f97075e16441 100644 --- "a/source/_posts/2025/20251218a_Software_Design_2026\345\271\2641\346\234\210\345\217\267\343\201\256\343\202\242\343\203\252\343\202\264\343\203\252\343\202\272\343\203\240\347\211\271\351\233\206\343\201\253\345\257\204\347\250\277\343\201\227\343\201\237\343\201\212\350\251\261.md" +++ "b/source/_posts/2025/20251218a_Software_Design_2026\345\271\2641\346\234\210\345\217\267\343\201\256\343\202\242\343\203\252\343\202\264\343\203\252\343\202\272\343\203\240\347\211\271\351\233\206\343\201\253\345\257\204\347\250\277\343\201\227\343\201\237\343\201\212\350\251\261.md" @@ -15,7 +15,7 @@ lede: "真野さん、松本さんと一緒にSoftware Designの特集記事に magazines: - name: "Software Design 2026年1月号" url: https://gihyo.jp/magazine/SD/archive/2026/202601 - work: "アルゴリズム特集" + work: "アルゴリズムはどこに効く?" --- diff --git "a/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" "b/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" index 8ddc84399578..8b930007e6c9 100644 --- "a/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" +++ "b/source/_posts/2026/20260217a_\344\273\212\343\201\252\343\201\234\343\200\214\343\202\242\343\203\253\343\202\264\343\203\252\343\202\272\343\203\240\343\200\215\343\202\222\345\255\246\343\201\266\343\201\256\343\201\213\357\274\237_\342\200\224\342\200\224_Software_Design2026\345\271\2641\346\234\210\345\217\267\343\201\270\343\201\256\345\257\204\347\250\277\343\201\253\343\202\210\343\201\233\343\201\246.md" @@ -14,7 +14,7 @@ lede: "同僚の澁川さん、松本さんと一緒に、Software Design 2026 magazines: - name: "Software Design 2026年1月号" url: https://gihyo.jp/magazine/SD/archive/2026/202601 - work: "アルゴリズムはどこに効く? 第3章 パフォーマンス問題の診断とアーキテクチャの再考" + work: "アルゴリズムはどこに効く?" --- diff --git a/themes/future/css-src/theme-styles.styl b/themes/future/css-src/theme-styles.styl index 181aa8ba3b25..458e3be1af9b 100644 --- a/themes/future/css-src/theme-styles.styl +++ b/themes/future/css-src/theme-styles.styl @@ -6422,6 +6422,12 @@ sg-ratios(sg-dark-award, dark-surface-base) margin: 0; font-size: text-body; } +/* 章は号と同じ行に置くが、行き先を名乗るのは号の側なので一段弱める */ +.publication-work { + /* 同じ大きさの文字が続くので、全角空白ぶん(15.6px)に近い刻みを取る */ + margin-left: (space-step * 3); + color: var(--ink-mute); +} .publication-meta { margin: (space-step) 0 0; color: var(--ink-mute); diff --git a/themes/future/layout/publications.ejs b/themes/future/layout/publications.ejs index ffb75ef46582..8e0b24535cf1 100644 --- a/themes/future/layout/publications.ejs +++ b/themes/future/layout/publications.ejs @@ -35,14 +35,14 @@
<%- partial('_partial/section-heading', {id: 'magazines', text: '技術誌への寄稿'}) %> - <%# 1行は号1冊で、寄稿は行の中に積む。1つの号に複数の寄稿があり - (書いた人も記事も違う)、号が2行に分かれると2冊と読み違える %> + <%# 1行目が「何に書いたか」(号と章)、2行目以降が「誰が書き、どの記事で報告したか」。 + 同じ章に複数人が寄稿していれば、その行の中に人を積む %>