Astro製のブログで読んだ本リストを管理するためにmicroCMSを使ってみた

Astro製のブログで読んだ本リストを管理するためにmicroCMSを使ってみた

目次

はじめに#

Web クリエイターボックスみたいに読んだ本リストを自分のプラットフォームで管理したいと思い、このブログ内に読んだ本リストを追加しました。サイドバーにリンクがあるので覗いてみてください!

読んだ本の管理に microCMS を使ったので、Astro 製のブログで本の管理を microCMS で行う方法をまとめます。まだ、データ数が少ないのでページネーションは実装してないのですが、実装したら追記します。

microCMS の準備#

microCMS のアカウントを作成して、コンテンツ(API)を作成し API 設定をしましょう。下記のように設定します。

APIスキーマ
APIスキーマ

読んだ本リスト API のエンドポイントは book にしました。

API スキーマの例#

本のリストなので、自分は下記のように設定しました。

フィールド ID表示名種類
titleタイトルテキストフィールド
reviewレビューリッチエディタ
urlAmazon リンクテキストフィールド
cover表紙画像テキストフィールド
author著者テキストフィールド
publishedDate発売日日時
categoryカテゴリーコンテンツ参照
postlink紹介記事テキストフィールド

環境変数の設定#

microCMS の API にアクセスするために、登録情報と API キーを環境変数に設定しましょう。
クライアントサイドで記事ページの下にも読んだ本を表示したかったので、PUBLICを先頭につけています。PUBLICを先頭に付けるとクライアントサイドでも環境変数を読み込めるようになります。

.env
PUBLIC_MICROCMS_SERVICE_DOMAIN=<YOUR_SERVICE>
PUBLIC_MICROCMS_API_KEY=<YOUR_API_KEY>

microCMS JavaScript SDK のインストール#

microCMS を Astro で使うために、microcms-js-sdk をインストールしましょう。

npm install microcms-js-sdk

読んだ本リストを作成する#

microCMS の API を使って、読んだ本リストを作成しましょう。今回は/bookページに読んだ本リストの一覧を表示するサイトを想定します。

まずは、microCMS にある読んだ本リストの全件とカテゴリーを取得するコードを書きます。src/scripts/library/microcms.tsに API 呼び出しのコードを書きます。

src/scripts/library/microcms.ts
// SDK利用準備
import type { MicroCMSListContent, MicroCMSQueries } from "microcms-js-sdk";
import { createClient } from "microcms-js-sdk";
 
// クライアントの作成
const client = createClient({
  serviceDomain: import.meta.env.PUBLIC_MICROCMS_SERVICE_DOMAIN,
  apiKey: import.meta.env.PUBLIC_MICROCMS_API_KEY,
});
 
// 型定義
export type Books = {
  title: string;
  review: string;
  url: string;
  cover: string;
  author: string;
  category: BooksCategory;
  publishedDate: Date;
  postlink: string;
} & MicroCMSListContent;
 
export type BooksCategory = {
  name: string;
  slug: string;
} & MicroCMSListContent;
 
// 本の一覧を全件取得
export const getBooks = async (queries?: MicroCMSQueries) => {
  return await client.getAllContents<Books>({ endpoint: "books", queries });
};
 
// カテゴリーの一覧を取得
export const getBooksCategory = async (queries?: MicroCMSQueries) => {
  return await client.getList<BooksCategory>({ endpoint: "category", queries });
};

client.getListメソッドもありますが、こちらは取得数に制限があるので、全件取得するclient.getAllContentsを使っています。引数にはエンドポイント(books や category)を設定して、クエリは関数の引数から渡すことができます。

詳しいクエリパラメータに関しては、公式ドキュメントを参照してください。

次に、src/pages/book/index.astroに読んだ本リストを表示するコードを書いていきましょう。

src/pages/book/index.astro
---
import MainGridLayout from "@/layouts/MainGridLayout.astro";
import { getBooks, getBooksCategory } from "@/scripts/library/microcms";
 
// 本リストとカテゴリーを取得
const books = await getBooks({ fields: ['id', 'title', 'cover', 'category']});
const categories = await getBooksCategory({ fields: ['id', 'name', 'slug']});
---
 
<MainGridLayout>
  <ul class="category__list card-base">
    {categories.contents.map((category) => (
      <li class="category__item">
        <a class="category__link btn-regular" href={`/book/category/${category.slug}`}>
          {category.name}
        </a>
      </li>
    ))}
  </ul>
  <ul class="book__list">
    {books.map((book) => (
      <li>
        <a class="book__card" href={`/book/${book.id}`}>
          <div class="book__card-img">
            <img src={book.cover} alt={book.title} />
          </div>
          <div class="book__card-title">
            {book.title}
          </div>
        </a>
      </li>
    ))}
  </ul>
</MainGridLayout>

ここでは、先程作成したgetBooksとgetBooksCategoryを使って、読んだ本リストとカテゴリーを取得し map で回して表示しています。fields には取得したいデータのキーを指定します。

次に本の詳細ページとカテゴリー別のページを作成しましょう。

本の詳細ページを作成する#

本の詳細データを取得するコードを書きます。src/scripts/library/microcms.tsにコードを追加しましょう。

src/scripts/library/microcms.ts
export const getBooksDetail = async (
  contentId: string,
  queries?: MicroCMSQueries
) => {
  return await client.getListDetail<Books>({
    endpoint: "books",
    contentId,
    queries,
  });
};

getListDetailメソッドは contentId を指定して、指定した ID のデータを取得することができます。

続いて本の詳細ページ用にsrc/pages/book/[bookId].astroを作成しましょう。getBooksDetail関数を使って、本の詳細データを取得して表示します。

src/pages/book/[bookId].astro
---
import MainGridLayout from "@/layouts/MainGridLayout.astro";
import { getBooks, getBooksDetail } from "@/scripts/library/microcms";
import { Icon } from "astro-icon/components";
 
// 詳細記事ページの全パスを取得
export async function getStaticPaths() {
  const response = await getBooks({ fields: ['id'] });
  return response.map((content) => ({
    params: { bookId: content.id },
  }));
}
 
// 詳細記事ページのデータを取得
const { bookId } = Astro.params;
const book = await getBooksDetail(bookId as string);
// 日付をフォーマット
const date = new Date(book.publishedDate as Date);
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
---
 
<MainGridLayout>
  <div class="book__detail card-base">
    <h1 class="book__detail-title">{book.title}</h1>
    <div class="book__detail-body">
      <div class="book__detail-right">
        <a href={book.url} class="book__detail-img" target="_blank">
          <img src={book.cover} alt={book.title} />
        </a>
        <div class="book__detail-links">
          <a href={book.url} class="book__detail-link btn-regular" target="_blank">Amazon</a>
          {book.postlink && (
            <a href={`/blog/${book.postlink}`} class="book__detail-link btn-regular">記事を見る</a>
          )}
        </div>
      </div>
      <dl class="book__detail-info">
        <div class="book__detail-info-category-wrap">
          <a href=`/book/category/${book.category.slug}` class="book__detail-info-category">
            {book.category.name}
          </a>
        </div>
        <div class="book__detail-info-item">
          <dt>著者</dt>
          <dd>{book.author}</dd>
        </div>
        <div class="book__detail-info-item">
          <dt>発売日</dt>
          <dd>{`${year}年${month}月${day}日`}</dd>
        </div>
        <div class="book__detail-info-body" set:html={book.review}></div>
      </dl>
    </div>
    <div class="book__detail-bottom-link-wrap">
      <a href="/book" class="book__detail-bottom-link">
        <span class="link__icon">
          <Icon name="material-symbols:chevron-left-rounded" />
        </span>
        <span class="book__detail-bottom-link-text">読んだ本リストに戻る</span>
      </a>
    </div>
  </div>
</MainGridLayout>

getStaticPaths関数は動的なパスがどういう値をとるかを定義します。ここでは、getBooks関数で取得した ID をパスとして設定しています。

book.reviewはリッチエディタで入力したデータなので、改行などを正しくレンダリングするためset:htmlを使って HTML をそのまま表示します。

これで本の詳細ページができました。

カテゴリーページを作成する#

カテゴリー別のページを作成しましょう。src/pages/book/category/[slug]/index.astroを作成します。

src/pages/book/category/[slug]/index.astro
---
import MainGridLayout from "@/layouts/MainGridLayout.astro";
import { getBooks, getBooksCategory } from "@/scripts/library/microcms";
 
// カテゴリー別のパスを取得
export async function getStaticPaths() {
  const response = await getBooks({ fields: ['id', 'category'] });
 
  return response.map((content) => ({
    params: { slug: content.category.slug },
    props: {
      categoryId: content.category.id,
      slug: content.category.slug,
      name: content.category.name,
    },
  }));
}
 
const { categoryId, slug, name } = Astro.props;
 
// カテゴリー別の本のリストを取得
const books = await getBooks({
  fields: ['id', 'title', 'cover', 'category'],
  filters: `category[equals]${categoryId}`
});
 
const categories = await getBooksCategory({ fields: ['id', 'name', 'slug']});
---
 
<MainGridLayout>
  <ul class="category__list card-base">
    {categories.contents.map((category) => (
      <li class="category__item">
        <a class="category__link btn-regular" href={`/book/category/${category.slug}`}>
          {category.name}
        </a>
      </li>
    ))}
  </ul>
  <ul class="book__list">
    {books.map((book) => (
      <li>
        <a class="book__card" href={`/book/${book.id}`}>
          <div class="book__card-img">
            <img src={book.cover} alt={book.title} />
          </div>
          <div class="book__card-title">
            {book.title}
          </div>
        </a>
      </li>
    ))}
  </ul>
</MainGridLayout>

ここでもgetStaticPaths関数を使って、カテゴリー別のパスを取得しています。getBooksの引数にfiltersをでカテゴリー ID を指定することで、そのカテゴリーの本のリストを取得できます。

category[equals]${categoryId}のように[equals]を使うことで、id と一致する本のデータを取得できます。

以上で、本の一覧・詳細・カテゴリー別のページができました!
最後におまけでブログ記事の下に PR として本のリストをランダムで 4 件表示する方法を紹介します。

おまけ: ブログ記事の下に本のリストをランダムで 4 件表示する#

新しくコンポーネントとしてPostBookArea.astroを作成しました。このコンポーネントではクライアントサイドで JavaScript を使って、microCMS の API からデータを取得しています。

このブログは SSG として公開しているので、Astro のコードフェンスの中で取得すると、ビルド時にデータを取得するので固定になってしまいます。なので、クライアントサイドで取得するように<script>の中で microCMS の API からデータを取得するコードを書いていきます。

src/components/PostBookArea.astro
<div class="post-book-area card-base">
  <h2>PR</h2>
 
  <ul class="post-book-area__list"></ul>
</h2>
 
<script>
  import { getBooks } from "@/scripts/library/microcms";
 
  const allBooks = await getBooks({ fields: ['title', 'cover', 'url'] });
  const randomBooks = allBooks.sort(() => Math.random() - 0.5).slice(0, 4);
  const bookList = document.querySelector(".post-book-area__list");
 
 
  if (randomBooks && bookList) {
    bookList.innerHTML = randomBooks.map((book) => `
      <li class="post-book-area__item">
        <a class="post-book-area__link" href="${book.url}" target="_blank">
          <div class="post-book-area__img">
            <img src="${book.cover}" alt="${book.title}" />
          </div>
          <div class="post-book-area__title">${book.title}</div>
        </a>
      </li>
    `).join('');
  }
</script>

ここでは microCMS の API から取得したデータをランダムに 4 件取得して表示しています。
このコンポーネントをブログ記事の詳細ページに追加します。

src/pages/blog/[slug]/index.astro
---
import PostBookArea from "@/components/PostBookArea.astro";
---
 
<MainGridLayout>
  <div class="article card-base">
    <MarkdownBody>
      <Content components={{ img: Figure }} />
    </MarkdownBody>
 
  <div class="post-book-area">
    <PostBookArea />
  </div>
 
</MainGridLayout>

これでブログ記事の下に本のリストをランダムで 4 件表示することができました。

まとめ#

Astro 製のブログに microCMS で管理した読んだ本リストを表示する方法を紹介しました。読書メーターも使ってましたが、自分のプラットフォームで読んだ本を管理することができるようになったので、気軽に読んだ感想を残せるようになってよかったです!

サイドバーにリンクがあるのと、このページにあるので覗いてみてください!

参考#

Related Post
ブログのデザインを大幅に変更しました
image

はじめに

このブログのデザインを大幅に変更しました。

変更後のTopページ

変更した経緯としては、2つあります。 以前のブログのデザインは、Astroのfuwariテーマを参考にして作成していたのですが、fuwariベースの派生テーマが公式の方でも増えてきており、ブログのデザインが他の人と被るのが嫌だなとなり思い切ってデザインを大幅に変更してみました。

また、以前は記事にカテゴリーを設定していたのですが、この雑記ブログにはタグのみの方が記事の分類として迷いがなくなって書きやすくなると感じたので、カテゴリーを廃止して一覧性をよくしようと思いました。

この記事では、デザインを変更したAstro製のこのブログについて、サムネイルに記事の一部を表示する方法を紹介します。

Meta Data
公開日:2026-02-06
Tags:
#ブログ
#Astro
Astroで作ったブログで更新日時を自動で取得する方法

はじめに

このブログのデザインを大幅に変更したいのと、記事の一覧を更新順で表示したいと思ってたのですが、更新日の取得方法に悩んでいました。

Astro の公式のチュートリアルでは更新日は記事のフロントマターに設定する方法が紹介されていましたが、毎回手動で設定するのは面倒です。

そこで自動で取得する方法を考えた結果、Git のコミット日時を取得してその日付を更新日として表示する方法を実装できたので紹介します。

Git のコミット日時を取得する

それでは、Git のコミット日時を取得する方法について説明します。 Git 関連の情報はgit logコマンドで取得できます。 次のようにコマンドを打ってみましょう。

# 指定したファイルの最新のコミット日時を取得する
## -1 : 最新の1件のみ取得
## %ai : 日付
## filePath : 調べたいファイル
git log -1 --format=%ai -- filePath

オプションについてはコメントの通りになります。

Meta Data
公開日:2026-01-25
更新日:2026-02-04
Tags:
#Astro
技術ブログにブラウザの対応状況を表示するBaseline Status Webコンポーネントを入れる方法

はじめに

技術ブログを複数運営しているのですが、CSS などのプロパティで一部のブラウザのみでしか対応していないものがあります。その際に、ブラウザの対応状況を表示するコンポーネントを入れておくと、ブラウザの対応状況が分かるので、ブログを見ている人にも分かりやすいと思います。

↓ 運営している技術ブログ

https://hypb.dev

https://feylo.dev

今回紹介する Baseline Status Web コンポーネントは、ブラウザの対応状況を表示するための Web コンポーネントです。このコンポーネントをブログ内で使用することで、ブラウザの対応状況を簡単に表示することができます。この Web コンポーネントを Astro 製のブログと Nuxt 製のブログで使う方法を紹介します。

使用イメージは ↓ のような感じになります。

<BaseLineStatus featureId="anchor-positioning" />

Baseline Status Web コンポーネントの使い方

npm で使う場合

npm でbaseline-statusをインストールします。

npm install baseline-status

使用する際はそのまま import して表示する featureId を指定するだけで上記のような感じで表示されます。

import "baseline-status";
<baseline-status featureId="anchor-positioning" />
Meta Data
公開日:2025-07-16
Tags:
#ブログ
#Astro
Astro製のブログにCloudinaryを導入する
image

はじめに

このブログと技術ブログは、Astro の Content Collection を使ってマークダウンでブログを書いていて、記事は GitHub で管理してます。

Astro の Image コンポーネントを使うために、ブログ記事の画像も src/assets/images/配下に配置していました。しかし、ローカルで画像を管理したくないなと思ったので Cloudinary を導入してみました。

Astro での Cloudinary の導入方法について、この記事では紹介します。 Cloudinary の詳しいオプションなどは解説しないのと、Cloudinary のアカウントが既にあるのを前提に説明します。

まだの方は下記 URL からアカウントを作成してください。

https://cloudinary.com/

Astro Cloudinary のインストール

Astro で使える Cloudinary のコンポーネントが用意されてます。下記コマンドで Astro Cloudinary をインストールしましょう。

npm install astro-cloudinary

インストールできたら、プロジェクトのルートに.envファイルを作成して、Cloudinary のアカウント情報を記述します。

PUBLIC_CLOUDINARY_CLOUD_NAME="<Your Cloud Name>"
Meta Data
公開日:2025-05-19
Tags:
#Web
#Astro
Astroで作ったサイトをGitHub Pagesにデプロイする
image

はじめに

Astro で作ったサイトを GitHub Pages にデプロイする方法について紹介します。 GitHub Pages を使うことで簡単に作ったサイトを公開することができます。

基本的には公式サイトのドキュメント通りにやればできるでしょう。 ここではカスタムドメインを使わないリポジトリ名が後ろにつくデプロイ方法を紹介します。

https://docs.astro.build/ja/guides/deploy/github/

GitHub Pages 用に Astro の設定をする

astro.config.mjs にsiteとbaseオプションの設定を追加します。

import { defineConfig } from "astro/config";

export default defineConfig({
  site: "https://<username>.github.io",
  base: "<your-repo-name>",
});

ここでsiteの username にはご自身の GitHub のユーザー名を、baseの your-repo-name にはデプロイするリポジトリ名入れてください。

Meta Data
公開日:2025-04-27
Tags:
#Astro
#GitHub
Astroで雑に書ける個人ブログを作りました
image

雑に書ける場所が欲しくなったので、Astro で 2 個目の個人ブログを作成しました。 普段は、👇 の技術ブログで主にフロントエンドに関しての記事を書いています。

https://hypb.dev

上記のブログでは、技術系しか書けない感じになっていたので、こちらではもっと雑にインターネット上に残していきたいと思います。

Aboutページに書いてある通り、音楽・映画・小説などが好きなので、それらに関する記事を書いていきたいです。

デザインについて

デザインに関しては、Astro テーマのFuwariを参考にして作成しました。 ほぼ丸パクリですが、Fuwari テーマを見て雑記ブログを作りたいと思ったのでこれで良しとします。

フォントは日本語はKiwi Maru、英語はIBM Plex Monoを使っています。フォントのおかげで可愛い感じが出て良かったです ✨

Fuwari テーマの方は、Svelte や swup を使ってたりでカスタマイズするのが難しそうな感じですが、自分の作成した本ブログはコードも分かりやすく作成したので、サクサク作成することができました!

Meta Data
公開日:2025-04-01
Tags:
#ブログ
#Astro
読んだ本リスト
セックスはなぜ楽しいか
セックスはなぜ楽しいか
セックスはなぜ楽しいか
著者
ジャレド ダイアモンド
発売日
1999年3月31日

タイトルにある「セックスはなぜ楽しいか」ばかりが書かれているわけではなく、本書では、人間の性がどのようにして進化・淘汰されて現在のようなものになったのかを考察するものである。

本書で随所に書かれていることが、人間の性的特徴を理解するには、まず人間を中心とした偏った考え方を捨てるべきだという主張だろう。人間は他の動物と比べても、奇妙な性生活を送っているのだという。

例えば、人間の女性は排卵が自分自身でほとんど確認できないが、これは動物の世界ではごく少数派という。ヒヒのメスなどは、排卵時期には膣のまわりの皮膚が膨張して真っ赤になることで、遠くからでもひと目で分かりオスに知らせる役割をもつ。他の動物のメスでも、自分の排卵を知っていて、目に見えるサインや匂いや行動で、排卵をはっきりとオスに知らせる。

なぜ人間は他の動物と同じように進化しなかったのかを、様々な説の紹介とともに考察していく。男性が授乳しない理由なんて考えたこともなかったし、理論的には可能であるらしい。進化理論を基軸に科学的発見を織り交ぜながら解説している。

1997年に書かれた本ではあるので、この説は現在は本当なのか?と思うこともあったが、タイトルとは裏腹に真面目なサイエンス本であり読んでいて面白かった。

ヒトのセクシャリティにかかわる大きな謎は、究極要因にかかわる進化論的な問いであり、生理学的な直接のメカニズムを詮索することではない。 なぜそのように進化しなかったのかの理由をどう理解するかが大切なのだ。

関連サイト(外部サイト)
「セックスはなぜ楽しいか」の参考文献一覧

Meta Data
公開日:2026-11-10
Tags:
レプリカ---文化と進化の複製博物館
レプリカ---文化と進化の複製博物館
レプリカ---文化と進化の複製博物館
サイエンス
著者
武村政春
発売日
2012年11月25日

タイトルから美術関係の複製の話だと思ったが、それだけでなく、著者の専門でもある生物学、DNAの複製の話が後半はメインで書かれている。

本書では「複製」という言葉を次のように扱っている。

「それは「複製されたもの」に代表される「産物」の意味を持つ言葉ではなく、「複製する物質」などの言い方に代表される、いわゆる「行為」を表す言葉としてである。

事例として前半は「身のまわりの複製」を、後半は「生物の世界の複製」から考察していく。専門ではないとのことだが、妖怪・怪談からの複製の考察は面白い。

本書の特徴としては、今までは文化の視点からみた複製文化論が多くの論客によってなされていたが、われわれ生命世界を含めたこの世のすべての複製について書かれているのが特徴だろう。

様々な話題で複製について考察されているので、気になるトピックから読んでいくこともできるだろう。

関連サイト(外部サイト)
「レプリカ---文化と進化の複製博物館」の参考文献一覧

Meta Data
公開日:2026-11-08
Tags:
#サイエンス
肉体美大全
肉体美大全
肉体美大全
文化論
著者
ジュリアン ロビンソン
発売日
2005年9月30日

以前、近代の裸体画から抜け落ちてしまった日本の裸体芸術としての刺青についてや、日本人の裸体観について書かれた「刺青とヌードの美術史 - 宮下 規久朗」という本を読んだが、本書は世界の肉体美、身体装飾について膨大な資料を掲載し、紹介してくれる一冊である。

著者は、ロンドン生まれで元々はファッションデザイナーであったが、その傍ら世界中で弄放なフィールドワークを行っていた。表紙にもあるように世界中の広告であったりや、現地の痛みを伴う身体装飾、性的魅力を高めるものであったりが、全ページに渡って載っているので、眺めるだけでも楽しめる。刺青、ピアス、ボディ・アートの数々に人種も肌の色も関係なくただただ圧倒される。

著者の現地の体験からも、美的・性的に魅力的だとされる形態の概念は地域によって異なっており、どれが一番魅力的な肉体なのかという点で、意見を同じくする社会はほとんどない。土地によって美的基準が変わっているので、ここまでの多様な美的装飾が生まれるのであろう。

だが、エピローグで書かれているように、現代の「グローバル・ヴィレッジの拡大」により、身体装飾における民族的な「多様性」の排除と画一化に警鐘を鳴らしている。はたして全世界と繋がることができることが良いことなのか、考えさせられる。

著者の基本理念通り、「身体装飾は人間存在の根源的なところにある強い衝動・快楽で、何者にもそれを規制したり排除したりする権利はない」のだ。

決して体系的にまとめられている本ではないが、西欧、非西欧の区別なく膨大な資料が載っているのは貴重であるだろう。これらの資料を眺めるだけでも十分元は取れるでしょう。

関連サイト(外部サイト)
「肉体美大全」の参考文献一覧

Meta Data
公開日:2026-11-05
Tags:
#文化論
「愛」と「性」の文化史
「愛」と「性」の文化史
「愛」と「性」の文化史
人文・思想・社会
著者
佐伯 順子
発売日
2008年11月9日

「愛」や「性」という言葉は、昔から現在と同じような意味で存在していたのではない。これらの言葉は、日本の歴史の過程で誕生したものであり、私たちの恋愛観や性愛観も、こうした歴史の過程抜きでは語れないことを著者は述べる。

本書では、「愛」や「性」という言葉が、現在の私たちになじみのあるような意味で使われる以前の男女関係のあり方を、文学作品や絵画といった様々な表現のなかから考察する。

例えば、江戸時代の春画の話では、スピリチュアルの視点で考察される。当時は「笑い絵」と呼ばれていたものだが、交合も笑いも、ともに神の力によって幸いを得る宗教的パワーを持つものと信じられてきたのではという。それゆえに、春画では遊女が少ないとのこと。それはスピリチュアルなパワーが期待できないからなのだと。

このことからも、春画というメディアが西洋的「ポルノグラフィー」の枠組みでは捉えられないことが知れる。明治の文明開化後に西洋からの「愛」や「性」といった、概念が入ってくるのだ。

その他にも、与謝野晶子の「貞操」と「処女」論、谷崎潤一郎の夫婦恋愛小説家としての面や、御伽草子の夫婦の「情」、心中の変容、高齢化社会における恋愛の将来などについて考察される。

文学作品からの考察なので、実態はどうだったのかが述べられてないのが気になったが、日本における「愛」や「性」の変容について知れる一冊となります。

関連サイト(外部サイト)
「「愛」と「性」の文化史」の参考文献一覧

Meta Data
公開日:2026-11-04
Tags:
#人文・思想・社会
タタール人の砂漠
タタール人の砂漠
タタール人の砂漠
小説
著者
ディーノ・ブッツァーティ
発売日
2013年4月16日

イタリアの著者ディーノ・ブッツァーティの長編三作目に当たる「タタール人の砂漠」
訳者解説でも書かれているが、「幻想小説」の世界的古典として知られるが、ここにはいつの時代の人々にも当てはまるものが含まれているだろう。

主人公ジョヴァンニ・ドローゴは将校で、俗世から隔離された娯楽ひとつない砦での勤務に当たる。若さを自覚する主人公は、理想的な未来を想像するが、時の流れは残酷だ。

一度は故郷に戻るが、再び砦に戻ってしまうのはなぜか。先輩中佐が先に退官する場面、反対のことを願いながら敵が来ることを話す。ほぼ三十年というものの、同じ砦で過ごし、同じ敵を待ち続けていたが、ふたりの道は分かれるのだ。

はたして敵は来るのだが、そのころにはドローゴは年を取りすぎていた。読者は主人公を青年時代から見てきたが、役立たずな老人として他の若い兵士に見られながら砦を去るドローゴを見る。

まさに不条理といってもいい小説なのだ。
だが人生もそんなものかもしれない。

Meta Data
公開日:2026-11-03
Tags:
#小説
レストランの誕生 ――パリと現代グルメ文化
レストランの誕生 ――パリと現代グルメ文化
レストランの誕生 ――パリと現代グルメ文化
文化論
人文・思想・社会
著者
レベッカ・L・スパング
発売日
2021年10月10日

レストランが食べる場所を意味するようになるまでは、数世紀にわたって、レストランといえば食べる物、すなわち元気を回復させるだし汁のことであった

本書では、小さなカップ一杯のブイヨンから、現代の意味での場所としてのレストランが出現する過程を辿っていきます。

初期のレストランが食を提供したのは、食欲を失い疲れ果てた口と虚弱な胸に悩む衰弱した者たちに対してでした。その起源から見ても、レストランは必ずしも豪華な食事とは無縁だったことが知れます。

しばしばレストランはフランス革命により貴族などに雇われていたシェフが開業したとの言説がありますが、革命前から自分の事業に身を投じているのでその言説は間違いであると著者は述べます。こうした飽食の時代としてのレストランではなく、本書では空間・場所としてのレストランを見ていくことができるでしょう。

ヨーロッパの食文化としては、イギリスではカフェがありますが、パリのレストランの文化とは何でしょう。レストランをすでに存在していた他の公共食堂の類と区別していたのは、ブイヨンとライスクリームの載ったメニューであったと同時に、そのサービス様式であったといいます。例えば、定食用のテーブルであったり、密会の場にもなった個室、料理のメニューのリストの必要性などです。

メニューの存在により、レストランは初めて、実際に料理を分け合うことなく他人と食事をともにすることを可能にしました。カフェの客は新聞を読み、身の回りの世界について考えますが、レストランの顧客はメニューを読み、自分自身の体調を考えたのでした。

本書を読むことで、「レストラン」という概念を違った視点で見ていくことができるでしょう。著者自身が述べているように「レストランについて本を書くとは、ほとんどすべてについて本を書くようなもの」なのだから。

関連サイト(外部サイト)
「レストランの誕生 ――パリと現代グルメ文化」の参考文献一覧

Meta Data
公開日:2026-10-30
Tags:
#文化論
#人文・思想・社会
レタースペーシング タイポグラフィにおける文字間調整の考え方
レタースペーシング タイポグラフィにおける文字間調整の考え方
レタースペーシング タイポグラフィにおける文字間調整の考え方
フォント
デザイン
著者
今市達也
発売日
2021年7月20日

意外にも類書がないレタースペーシングについて書かれた本。

レタースペーシングとは、文字の間隔を視覚的に均等に見えるように調整する作業のことです。デザインにおいて、文字の詰め方で読みやすさや見た目の印象が大きく変化します。デザイン初学者にとっては、文字間を意識することは少ないかと思われますが、プロのデザイナーにとっては、この文字間に常に気を配って文字組みを行っています。

そもそものレタースペーシングの歴史では、金属活字の時代では、正方形に収められている活字の影響で活字同士がぶつかって文字詰めをすることが技術的にできませんでした。しかし、写植に以降したことで文字が詰められるようになります。その時代(1960年代)以降の日本の雑誌では、見出しの字間を極端に狭くするレタースペーシングが流行していたみたいです。

このことを踏まえると、時代や技術が変化すると文字の組み方が変わり、それに合わせてスペーシングに対する価値観も変わっていくと著者は述べます。また、和文と欧文でも文字の形状やボディ、ベースラインの考え方が違うでしょう。本書のようなレタースペーシングについての入門書を読むことで、文字に対しての基礎知識を得ることで、なぜそのスペーシングなのかを感覚ではなく言語化して説明できるようになり、「なんとなく」からの卒業ができそうです。

本書の最後では実際のロゴタイプを例にとり、なぜそのスペーシングなのか解説してくれます。ロゴタイプは企業としても大事なものであり、目にする機会も多いため、そのスペーシングに対しての考察は勉強になります。例えば、商品パッケージで縦組みと横組みのロゴタイプがある場合は、それぞれで文字の形を微妙に変化させスペーシングを調整しているなど、すごいなと思いました。

今まで文字組みをなんとなく行っていた方が読むと勉強になるので、おすすめの一冊となります。

関連サイト(外部サイト)
「レタースペーシング タイポグラフィにおける文字間調整の考え方」の参考文献一覧

Meta Data
公開日:2026-10-29
Tags:
#フォント
#デザイン
トンデモと科学のあいだ
トンデモと科学のあいだ
トンデモと科学のあいだ
サイエンス
著者
田口 善弘
発売日
2026年9月9日

科学・物理学の世界では、中身や理由が分かっていない、かつてはトンデモな扱いだったものが、今では主流になったりする。

生成AIはどうだろう。科学者も中身が分かっていないながらも使用しているという。科学の歴史がそうであったように、恐れずに生成AIを使用していこうというのが主張か。

正直、科学のトンデモな概念の歴史と、生成AIとの議論がつながってなくない?となり、あまり話が入ってこなかった。

生成AIがどのようにして答えを出力しているのかを著者は知っているのかと、書きぶりから心配したが、ブルーバックスから出ている「はじめての機械学習」の著者でもあるのですね。それなら、今の科学者がどのようにして生成AIを使用して研究しているのかを書いて欲しかったな。

そもそも、「科学者が中身が分からなくても生成AIを平然と使えるのはなぜ?」と疑問に思ったことがないので噛み合わなかったかも。

題名から、ニュートンが晩年錬金術に情熱を注いだみたいなトンデモ話のことが書かれているのかと思って買ったんだけれども、錬金術みたいなトンデモ話は出てこなかったです。

収穫としては、ガリレオとケプラーの話でしょうか。あとは、参考文献にも複数挙げられている山本義隆の著書群が気になりました。

関連サイト(外部サイト)
「トンデモと科学のあいだ」の参考文献一覧

Meta Data
公開日:2026-10-20
Tags:
#サイエンス
センスをみがく文章上達事典 新装版
センスをみがく文章上達事典 新装版
センスをみがく文章上達事典 新装版
文章術
著者
中村 明
発売日
2016年12月9日

多くの文章術の著書がある中村明氏の文章観のエッセンスを一望できる一冊である。

本書の構成は基礎編、応用編、実践編の三つに分かれる。第Ⅰ部「書く」では、相手に正しく伝わる文章を書くための基礎的な技術について書かれている。第Ⅱ部「練る」では、「表現をゆたかに」とあるように小説などでの表現技法について解説されている。第Ⅲ部「研く」では、「文体をしなやかに」とあるように自己のスタイルを確立するまでや、文章の深みといった点について書かれている。

全体として、プロの実例をもとに解説していく流れになる。よりよい文章を書きたい人にもおすすめだが、実例にもある小説についての読み方の視点も変わっていきそうだ。

「センスをみがく」ということは、多く良い文章に触れていくことなのだろう。
本書の見出しをみるだけでもためになりそう。

書く - 文章をはっきりと

  • 句読点のルール - 打つも打たぬも思いやり
  • 記号類の活用 - 使いすぎは品格をおとす
  • 漢字・ひらがな・カタカナの使い分け - 文字に思想をこめて
  • 漢字の書き分け - ニュアンスを書き分ける
  • ことばの選択 - 三方向から一語にしぼる
  • 和語と漢語 - 硬軟おりまぜて
  • 擬声語・擬態語 - 感覚の新鮮さがいのち
  • 修飾語を効果的に - 適量のさじ加減
  • 並列 - 両輪をバランスよく
  • 語順と表現意図 - 繰り出し方で感じが変わる
  • 文末表現 - 足もとのおしゃれ
  • 文構造と文の筋 - 述語は忘れないうちに
  • 文の長さ - 手を抜くと文が長くなる
  • わかりやすい表現 - 読まれなければ始まらない
  • あいまいな表現 - 誤解の芽を摘む
  • 文と文との接続 - 関係は書き手がつくる
  • 段落づくり - 迷ったら改行する
  • 引用を明記する - 借用証書のすすめ
  • 敬語表現 - 形式よりも気持ちが問題
  • 読者への配慮 - いやいや読む人の身になって
  • 執筆態度を明確に - 情報を鼓動とともに
  • 構想と展開 - 調理の腕で素材が生きる
  • 文章の調子 - こなれがいいほど心になじむ
  • 推敲 - 見知らぬ読者になりすます

練る - 表現をゆたかに

  • 情報待機 - サスペンスをつくりだす
  • 漸層・漸降 - 上りと下りは勢いが違う
  • 倒置表現 - 計画的に取り乱す
  • 反復法 - 畳みかけて弾みをつける
  • 尻取り文 - 展開は鎖のように
  • リズムのある文章 - 軽くステップを踏んで
  • 対句表現 - 形式美はシンメトリックから
  • 挙例法 - 理屈より実感
  • 列挙法 - ことばの洪水で圧倒
  • 省略法 - 沈黙がものをいう
  • 名詞止め - ことばを置き去りにして
  • 否定表現 - 打ち消すのもレトリック
  • 婉曲表現 - 身もふたもある
  • 反語表現 - ばれるように嘘をつく
  • 比喩表現 - 心の風景をのぞかせる
  • 擬人法 - 万物と語らう
  • 洒落 - ことばで遊ぶ
  • パロディー - 二重映しの愉しみ
  • 現写法 - 臨場感を高める
  • 誇張表現 - 望遠レンズで迫力を
  • 逆説 - 常識を逆なでする

研く - 文体をしなやかに

  • 語感 - ことばのにをいを嗅ぎ分ける
  • 書き出し - もう読まずにはいられない
  • 結び - ギュッと締めて、フワッと放す
  • 書き手の視点 - カメラワークを意のままに
  • 人物描写 - のこのこ歩き出す
  • 心理描写 - 心のひだを映し出す
  • 感覚描写 - イメージに限りなく近づける
  • 自然描写 - 風景に体温を添えて
  • 表現の深さ - ことばに奥行きを感じるとき
  • 表現の間 - 息づかいが聞こえる
  • 余韻・余情 - 文章の奥へ、その先へ
  • ユーモア - 弱さや愚かしさをしみじみと笑う
  • スタイル - 譲れない文体の熟すまで
  • 文章の雰囲気 - 表現の奥に人のけはいを聴く
Meta Data
公開日:2026-10-25
Tags:
#文章術
日本語の作文技術
日本語の作文技術
日本語の作文技術
文章術
著者
本多 勝一
発売日
2015年12月6日

1982年に刊行された文章術の名著となります。

この本は、小説などの物語を書くためではなく、「事実的」「実用的」な文章を分かりやすく書くための本になります。悪い文章の例を提示しながら、どの部分が読みづらくなっているのや、改善方法などが解説されています。

自分では良い文章だと思っていても、他人から見たら読みづらい文章になっていることがあるでしょう。著者自身も例外に漏れず、悪い文章の例として、自分の文章も提示されています。日本語の文章を分かりやすく書くことの難しさを感じます。

日本語は非論理的だと外国語を優遇する人たちを著者は批判します。そうではなく、日本語を使いこなせない「使い手自身」こそが非論理的なのであると主張されているのが印象的でした。

学校で習う日本語の文法は、明治以降の西洋の文法からの影響に築かれたものであるので、本来の日本語にそぐわない形で体系化された経緯があります。英語などの影響により、文章の最初に「主語」を書かなくてはいけない風潮がありますが、日本語には「主語」は存在せず、あるのは「主格」にすぎないとの論には、なるほどなと思いました。

文章術の本を読んでいくと、いかに分かりやすい日本語で書くことが難しいのかを感じます。読みやすいリズムかどうかは、朗読してみれば分かると本書にかかれていたので、こうしたブログを書く際に実践してより多く文章を書いていきたいです。

関連サイト(外部サイト)
「日本語の作文技術」の参考文献一覧

Meta Data
公開日:2026-10-17
Tags:
#文章術
Info