aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYasutake Yohei <yohei@yasutakeyohei.com>2026-07-01 19:24:21 +0900
committerYasutake Yohei <yohei@yasutakeyohei.com>2026-07-01 19:24:21 +0900
commit1a357e558fb7336761cbd2241d285c6077a11216 (patch)
tree19e786c770f06561061e70f2c51acc7409142142
parent07a9910fbcfc702c6a1ac0f65242a96e145383b9 (diff)
OG画像: 一般質問サブページも個別OG画像を生成するよう対応
スラッシュを - に置き換えて単一セグメントルートで全ページ対応
-rw-r--r--src/content/docs/koubunsyo-kanri.mdx14
-rw-r--r--src/content/docs/textlint-guide.mdx2
-rw-r--r--src/content/docs/vaccine-kyuusai-tekiseika.mdx4
-rw-r--r--src/pages/og/[slug].png.ts52
-rw-r--r--src/plugins/og-image.ts9
5 files changed, 62 insertions, 19 deletions
diff --git a/src/content/docs/koubunsyo-kanri.mdx b/src/content/docs/koubunsyo-kanri.mdx
index db10dc4..db55ec1 100644
--- a/src/content/docs/koubunsyo-kanri.mdx
+++ b/src/content/docs/koubunsyo-kanri.mdx
@@ -11,7 +11,7 @@ tableOfContents: true
/>
<p class="image-credit" style="font-size:0.75rem;color:#999;text-align:right;margin-bottom:1.5rem;">画像提供:<a href="https://www.ac-illust.com/main/detail.php?id=25914623" target="_blank" rel="noopener noreferrer">イラストAC</a></p>
-小平市における公文書管理の問題——未作成・不存在、情報公開請求への不適切対応、改ざん疑い、個人情報漏洩のおそれ、保存期間1年未満での廃棄など——について、安竹洋平は令和7年度の全4回の定例会で継続的に追及してきました。公文書等の管理は刑事罰の対象となる重大な法的責任を伴う職務であるとの認識のもと、公文書管理法や条例に基づく適正化を求めています。
+小平市における公文書管理の問題——未作成・不存在、情報公開請求への不適切対応、改ざん疑い、個人情報漏えいのおそれ、保存期間1年未満での廃棄など——について、安竹洋平は令和7年度の全4回の定例会で継続的に追及してきました。公文書等の管理は刑事罰の対象となる重大な法的責任を伴う職務であるとの認識のもと、公文書管理法や条例に基づく適正化を求めています。
---
@@ -22,7 +22,7 @@ tableOfContents: true
| **令和7年6月** | 鷹の台駅前広場整備工事を中心に、CD-R交付やクラウド公開の非対応、公開決定通知書の交付方法の混乱、メールの適宜削除、職員私物カメラの写真が公文書とならない問題、協議書案等の保存期間1年未満での廃棄など10項目を追及 |
| **令和7年9月** | ときわ会の虐待通報文書の公開漏れから判明した保管場所の分離・フォルダー名未記載の問題、公文書の漏えい・改ざん防止策の不備、件名・作成日付のない公文書の存在、審議会の会議録公開遅延と掲載制限、全文書電子化保存の提案など14項目を追及 |
| **令和7年12月** | 保存年限1年未満の定めの欠如、私物使用の問題、公開文書の無償交付、電子決裁率の低迷、黒塗り作業、学校いじめ対策委員会の記録不存在・改ざん疑いなど13項目を追及。答弁から公用文書等毀棄罪や公文書偽造・変造罪といった刑事罰のリスクに直結する懸念も浮き彫りに |
-| **令和8年3月** | 公文書管理規則の解釈、システム上のメモ等の公開実績、マスキング処理の原則、公開決定取消後の再決定期限、学校いじめ対策委員会の記録不存在・改ざん疑いの調査結果、個人情報漏洩のおそれへの対応など13項目を追及 |
+| **令和8年3月** | 公文書管理規則の解釈、システム上のメモ等の公開実績、マスキング処理の原則、公開決定取消後の再決定期限、学校いじめ対策委員会の記録不存在・改ざん疑いの調査結果、個人情報漏えいのおそれへの対応など13項目を追及 |
---
@@ -43,13 +43,13 @@ tableOfContents: true
令和5年6月に個人情報開示請求で開示された花小金井小学校のいじめ対策委員会会議記録と、令和7年9月に公文書公開請求で公開された同記録の間に、様式・枚数・件名表記・校長印の有無・黒塗りと白塗りの使い分けなど明確な差異があり、公文書改ざんの疑いが指摘されています(調査中)。
-### 個人情報漏洩のおそれ
+### 個人情報漏えいのおそれ
-スクールカウンセラーに提出されたアンケートや児童の体罰アンケートには要配慮個人情報が含まれる可能性が極めて高いにもかかわらず、不存在・廃棄・持ち出し等の個人情報漏洩のおそれが複数回指摘されているにもかかわらず、個人情報保護法に基づく報告・調査・対応が適切に行われていません。
+スクールカウンセラーに提出されたアンケートや児童の体罰アンケートには要配慮個人情報が含まれる可能性が極めて高いにもかかわらず、不存在・廃棄・持ち出し等の個人情報漏えいのおそれが複数回指摘されているにもかかわらず、個人情報保護法に基づく報告・調査・対応が適切に行われていません。
### 保存期間1年未満での廃棄
-- 協議書案や工事のひな形、添付メールなどが「意思決定に影響を与えないもの」として1年未満で廃棄
+- 協議書案や工事のひな型、添付メールなどが「意思決定に影響を与えないもの」として1年未満で廃棄
- 公文書管理規則上の「保存期間1年未満のものを除き」という条文の解釈が不適切で、1年未満の公文書について保存期間や満了時の措置の定めが存在しない
### 職員の私物使用と公文書としての扱い
@@ -83,7 +83,7 @@ CD-R交付やクラウド公開の非対応、公開決定通知書の交付方
[公文書管理の様々な問題について](/ippan-situmon/r7d/3gatu/2-koubunsyo-kanri-syomondai/)
-公文書管理規則の解釈、システム上のメモ等の公開実績、マスキング処理の原則、公開決定取消後の再決定期限、学校いじめ対策委員会の記録不存在・改ざん疑いの調査進捗、個人情報漏洩のおそれへの対応、不服審査請求の放置状況など13項目を追及。
+公文書管理規則の解釈、システム上のメモ等の公開実績、マスキング処理の原則、公開決定取消後の再決定期限、学校いじめ対策委員会の記録不存在・改ざん疑いの調査進捗、個人情報漏えいのおそれへの対応、不服審査請求の放置状況など13項目を追及。
---
@@ -106,7 +106,7 @@ CD-R交付やクラウド公開の非対応、公開決定通知書の交付方
- **情報公開請求への公正な対応** — CD-R・クラウドなど電磁的方法での交付の原則化、公開決定通知書の交付方法の統一、請求内容の確認手段の確保
- **学校文書の作成と保存の徹底** — いじめ対策委員会の会議録作成・保存の全学校的な徹底、定期的な確認ルーチンの確立
- **改ざん防止と公文書の信頼性確保** — 電子データと紙媒体の併存による差異の防止、公文書偽造・変造のリスク管理
-- **個人情報保護の徹底** — 要配慮個人情報を含む文書の適正な管理と、漏洩時・漏洩のおそれがある場合の報告・調査の徹底
+- **個人情報保護の徹底** — 要配慮個人情報を含む文書の適正な管理と、漏えい時・漏えいのおそれがある場合の報告・調査の徹底
- **職員の私物使用の適正化** — 業務利用時の申請・承認の徹底と、公務で取得した情報の公文書としての保存
- **不服審査請求への迅速な対応** — 最長1年10か月放置されている案件の早期解決
diff --git a/src/content/docs/textlint-guide.mdx b/src/content/docs/textlint-guide.mdx
index f48c5df..6059dc8 100644
--- a/src/content/docs/textlint-guide.mdx
+++ b/src/content/docs/textlint-guide.mdx
@@ -88,7 +88,7 @@ Zedのコードアクションから自動挿入されるので、普段は手
### MDXファイルで `{ }` がエラーになる
-このPCではMermaid図の `{{ }}` がMDXパーサーにJSX式と誤認されることがあります。`{{` を `(` に置き換えてください。
+Mermaid図の `{{ }}` がMDXパーサにJSX式と誤認されることがあります。`{{` を `(` に置き換えてください。
### lintが重い
diff --git a/src/content/docs/vaccine-kyuusai-tekiseika.mdx b/src/content/docs/vaccine-kyuusai-tekiseika.mdx
index e7f9c42..32df587 100644
--- a/src/content/docs/vaccine-kyuusai-tekiseika.mdx
+++ b/src/content/docs/vaccine-kyuusai-tekiseika.mdx
@@ -161,7 +161,7 @@ tableOfContents: true
2. **「善意」が裏目に出る構造** — 担当課は相談者に利益があると思って副反応疑い報告の案内をしていたようですが、結果として**救済申請を抑制**する事態になっていました。「知らずに不適切な対応をしていた」ことを認め、改善する姿勢が組織には不可欠です。
-3. **内部統制の第一歩として** — 小平市が内部統制制度の試行導入を進めるにあたり、本事案はまさに**象徴的なケース**です。ここでつまずけば、その後の制度構築全体に悪影響が及びます。
+3. **内部統制の第一歩として** — 小平市が内部統制制度の試行導入を進めるに当たり、本事案はまさに**象徴的なケース**です。ここでつまずけば、その後の制度構築全体に悪影響が及びます。
4. **申請を諦めた方の存在** — 窓口で誤った対応を受けて、**健康被害救済制度の申請を諦めてしまった方の人数は分かりません**。この点は今なお課題として残っています。
@@ -169,7 +169,7 @@ tableOfContents: true
## 今後の課題
-- **制度の継続的な周知** — いまだに健康被害救済制度の存在を知らない市民は少なくありません。市報やウェブサイトでの積極的な周知が求められます
+- **制度の継続的な周知** — いまだに健康被害救済制度の存在を知らない市民は少なくありません。市報やWebサイトでの積極的な周知が求められます
- **窓口対応の定期的な監査** — 同じ過ちを繰り返さないために、定期的な監査と職員研修の継続が必要です
- **申請を諦めた方への遡及的対応** — 問題発覚前に不適切な対応で申請を諦めた方がいた場合の救済策の検討
- **内部統制の実効性確保** — 試行から本格運用への移行に当たり、議会報告の適正化や透明性の確保が不可欠です
diff --git a/src/pages/og/[slug].png.ts b/src/pages/og/[slug].png.ts
index 712a39f..67a4d7c 100644
--- a/src/pages/og/[slug].png.ts
+++ b/src/pages/og/[slug].png.ts
@@ -1,6 +1,9 @@
import satori from "satori";
import { Resvg } from "@resvg/resvg-js";
-import { readFileSync } from "node:fs";
+import { readFileSync, existsSync, readdirSync } from "node:fs";
+import path from "node:path";
+
+const contentDir = "src/content/docs";
const pages: Record<string, string> = {
index: "だれもがしあわせに暮らせるまちへ",
@@ -22,8 +25,45 @@ const pages: Record<string, string> = {
"ippan-situmon": "一般質問",
};
+function findMdxFiles(dir: string): string[] {
+ if (!existsSync(dir)) return [];
+ const files: string[] = [];
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
+ if (entry.name.startsWith(".") || entry.name.startsWith("_")) continue;
+ const full = path.join(dir, entry.name);
+ if (entry.isDirectory()) files.push(...findMdxFiles(full));
+ else if (entry.name.endsWith(".mdx")) files.push(full);
+ }
+ return files;
+}
+
+function readTitle(filePath: string): string | null {
+ try {
+ const content = readFileSync(filePath, "utf-8");
+ const m =
+ content.match(/^title:\s*"(.+?)"/m) ?? content.match(/^title:\s*(.+)/m);
+ return m?.[1] ?? null;
+ } catch {
+ return null;
+ }
+}
+
export async function getStaticPaths() {
- return Object.keys(pages).map((slug) => ({ params: { slug } }));
+ const slugs = new Set<string>();
+ // Manual pages
+ for (const s of Object.keys(pages)) slugs.add(s);
+ // Auto-discover ippan-situmon pages
+ for (const f of findMdxFiles(path.join(contentDir, "ippan-situmon"))) {
+ const s = f
+ .replace(/\\/g, "/")
+ .replace(contentDir + "/", "")
+ .replace(/\.mdx$/, "")
+ .replace(/\/index$/, "");
+ if (s) slugs.add(s);
+ }
+ return [...slugs]
+ .filter((s) => s.length > 0)
+ .map((slug) => ({ params: { slug: slug.replace(/\//g, "-") } }));
}
const fontBuffer = readFileSync("node_modules/.noto-sans-jp.otf");
@@ -72,7 +112,13 @@ const stars = [
export async function GET({ params }: { params: { slug: string } }) {
const slug = params.slug;
- const title = pages[slug] ?? "小平市議 安竹洋平 公式サイト";
+ // Convert - back to / for nested paths
+ const fileSlug = slug.replace(/-/g, "/");
+ let title = pages[fileSlug];
+ if (!title) {
+ const mdxPath = path.join(contentDir, fileSlug + ".mdx");
+ title = readTitle(mdxPath) ?? "小平市議 安竹洋平 公式サイト";
+ }
const svg = await satori(
{
diff --git a/src/plugins/og-image.ts b/src/plugins/og-image.ts
index f3534e6..7ee6568 100644
--- a/src/plugins/og-image.ts
+++ b/src/plugins/og-image.ts
@@ -18,12 +18,9 @@ export default function ogImageIntegration(): AstroIntegration {
let html = fs.readFileSync(htmlPath, "utf-8");
let slug = page.pathname.replace(/^\/|\/$/g, "") || "index";
-
- // 一般質問のサブページは共通のOG画像を使用
- if (slug.startsWith("ippan-situmon/") && slug !== "ippan-situmon") {
- slug = "ippan-situmon";
- }
- const ogImageUrl = `https://yasutakeyohei.com/og/${slug}.png?v=2`;
+ // URL-safe: replace / with - for nested paths
+ const imageSlug = slug.replace(/\//g, "-");
+ const ogImageUrl = `https://yasutakeyohei.com/og/${imageSlug}.png?v=2`;
html = html.replace(
/<meta property="og:image" content="[^"]*"/g,