<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>文字フォント on Miura Computer Club</title>
    <link>/tags/%E6%96%87%E5%AD%97%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/</link>
    <description>Recent content in 文字フォント on Miura Computer Club</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja-JP</language>
    <lastBuildDate>Fri, 17 Jul 2026 17:00:00 +0900</lastBuildDate><atom:link href="/tags/%E6%96%87%E5%AD%97%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>レッスン105</title>
      <link>/lessons/lesson105/</link>
      <pubDate>Fri, 17 Jul 2026 17:00:00 +0900</pubDate>
      
      <guid>/lessons/lesson105/</guid>
      <description>シーザー暗号を作る文字フォントを作る この教材では、普段何気なく使っている「文字フォントファイル」の構造を解き明かし、Pythonを使って文字の対応関係を書き換えることで、「Aと打つとBが表示される」という不思議なシーザー暗号フォントを自作します。
１．文字フォントファイルとは何か？ 私たちがパソコンやスマホで文字を入力すると、画面に美しい文字が表示されます。この「文字の見た目」を提供しているのがフォントファイル（拡張子が .ttf や .otf のもの）です。
フォントファイルの中身は、単なる画像データの集まりではありません。主に以下の2つの要素がセットになった**「巨大なデータベース（データベーステーブルの集まり）」**です。
グリフ（Glyph）： 文字の「形（アウトライン）」そのもののデータ。ベジェ曲線という数学的な数式で線の引き方が記録されています。 テーブル（Tables）： フォントのデータ（フォント名、著作権情報、文字の割り当てなど）を管理する各種の表。 フォントファイルはバイナリデータ（コンピュータしか読めないデータ）で固められているため、通常はそのまま編集できませんが、プログラムを使うことでこのデータベースを直接書き換えることができます。
２．Pythonでフォントを編集する準備と基本 Pythonでフォントファイルを操作するには、世界標準のライブラリである FontTools を使用します。まずは環境を整え、フォントファイルをプログラムで読み込む基本を学びましょう。
準備：ライブラリのインストール コマンドライン（ターミナルやコマンドプロンプト）で以下のコマンドを実行します。
pip install fonttools 基本プログラム：フォントを読み込んで保存する まずは、既存のフォントファイルを読み込み、何もせず別名で保存するだけの「基本の骨組み」を確認します。
from fonttools.ttLib import TTFont # 既存 of フォントファイルを読み込む（同じフォルダに sample.ttf を用意してください） font = TTFont(&amp;#34;sample.ttf&amp;#34;) # フォントに特別な処理を施す（中身の書き換えはここに記述します） print(&amp;#34;フォントファイルを正常に読み込みました。&amp;#34;) # 新しい名前でフォントファイルを保存する font.save(&amp;#34;output_sample.ttf&amp;#34;) print(&amp;#34;フォントファイルを保存しました。&amp;#34;) ３．文字コードとグリフの対応関係（cmap）を解析しよう キーボードで「A」を押したとき、なぜ画面に「Aの形」が出るのでしょうか？ それを管理しているのが、フォントの内部にある cmap（シーマップ / Character Map） というテーブルです。
文字コードとグリフの関係 文字コード（Unicodeなど）: コンピュータが文字を識別するための背番号（例：大文字の「A」は 65 または 0x0041）。 グリフ名（Glyph Name）: フォント内で「デザインデータ」につけられた名前（例：A や uni0041 など）。 cmap は、「背番号 65 が来たら、A という名前の形を表示しなさい」 という仲介役（辞書）の役割を果たしています。</description>
      <content>&lt;h1 id=&#34;シーザー暗号を作る文字フォントを作る&#34;&gt;シーザー暗号を作る文字フォントを作る&lt;/h1&gt;
&lt;p&gt;この教材では、普段何気なく使っている「文字フォントファイル」の構造を解き明かし、Pythonを使って文字の対応関係を書き換えることで、&lt;strong&gt;「Aと打つとBが表示される」という不思議なシーザー暗号フォント&lt;/strong&gt;を自作します。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;１文字フォントファイルとは何か&#34;&gt;１．文字フォントファイルとは何か？&lt;/h2&gt;
&lt;p&gt;私たちがパソコンやスマホで文字を入力すると、画面に美しい文字が表示されます。この「文字の見た目」を提供しているのが&lt;strong&gt;フォントファイル&lt;/strong&gt;（拡張子が &lt;code&gt;.ttf&lt;/code&gt; や &lt;code&gt;.otf&lt;/code&gt; のもの）です。&lt;/p&gt;
&lt;p&gt;フォントファイルの中身は、単なる画像データの集まりではありません。主に以下の2つの要素がセットになった**「巨大なデータベース（データベーステーブルの集まり）」**です。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;グリフ（Glyph）：&lt;/strong&gt; 文字の「形（アウトライン）」そのもののデータ。ベジェ曲線という数学的な数式で線の引き方が記録されています。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;テーブル（Tables）：&lt;/strong&gt; フォントのデータ（フォント名、著作権情報、文字の割り当てなど）を管理する各種の表。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;フォントファイルはバイナリデータ（コンピュータしか読めないデータ）で固められているため、通常はそのまま編集できませんが、プログラムを使うことでこのデータベースを直接書き換えることができます。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;２pythonでフォントを編集する準備と基本&#34;&gt;２．Pythonでフォントを編集する準備と基本&lt;/h2&gt;
&lt;p&gt;Pythonでフォントファイルを操作するには、世界標準のライブラリである &lt;strong&gt;&lt;code&gt;FontTools&lt;/code&gt;&lt;/strong&gt; を使用します。まずは環境を整え、フォントファイルをプログラムで読み込む基本を学びましょう。&lt;/p&gt;
&lt;h3 id=&#34;準備ライブラリのインストール&#34;&gt;準備：ライブラリのインストール&lt;/h3&gt;
&lt;p&gt;コマンドライン（ターミナルやコマンドプロンプト）で以下のコマンドを実行します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pip install fonttools
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;基本プログラムフォントを読み込んで保存する&#34;&gt;基本プログラム：フォントを読み込んで保存する&lt;/h3&gt;
&lt;p&gt;まずは、既存のフォントファイルを読み込み、何もせず別名で保存するだけの「基本の骨組み」を確認します。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; fonttools.ttLib &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; TTFont
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 既存 of フォントファイルを読み込む（同じフォルダに sample.ttf を用意してください）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;font &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; TTFont(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sample.ttf&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# フォントに特別な処理を施す（中身の書き換えはここに記述します）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;フォントファイルを正常に読み込みました。&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 新しい名前でフォントファイルを保存する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;font&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;output_sample.ttf&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;フォントファイルを保存しました。&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;３文字コードとグリフの対応関係cmapを解析しよう&#34;&gt;３．文字コードとグリフの対応関係（cmap）を解析しよう&lt;/h2&gt;
&lt;p&gt;キーボードで「A」を押したとき、なぜ画面に「Aの形」が出るのでしょうか？
それを管理しているのが、フォントの内部にある &lt;strong&gt;&lt;code&gt;cmap&lt;/code&gt;（シーマップ / Character Map）&lt;/strong&gt; というテーブルです。&lt;/p&gt;
&lt;h3 id=&#34;文字コードとグリフの関係&#34;&gt;文字コードとグリフの関係&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文字コード（Unicodeなど）:&lt;/strong&gt; コンピュータが文字を識別するための背番号（例：大文字の「A」は &lt;code&gt;65&lt;/code&gt; または &lt;code&gt;0x0041&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;グリフ名（Glyph Name）:&lt;/strong&gt; フォント内で「デザインデータ」につけられた名前（例：&lt;code&gt;A&lt;/code&gt; や &lt;code&gt;uni0041&lt;/code&gt; など）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;cmap&lt;/code&gt; は、&lt;strong&gt;「背番号 &lt;code&gt;65&lt;/code&gt; が来たら、&lt;code&gt;A&lt;/code&gt; という名前の形を表示しなさい」&lt;/strong&gt; という仲介役（辞書）の役割を果たしています。&lt;/p&gt;
&lt;h3 id=&#34;解析プログラムフォントの対応関係をのぞいてみよう&#34;&gt;解析プログラム：フォントの対応関係をのぞいてみよう&lt;/h3&gt;
&lt;p&gt;実際にフォントファイルの中身を解析し、文字コードとグリフ名がどう結びついているかを確認してみましょう。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; fonttools.ttLib &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; TTFont
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;font &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; TTFont(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sample.ttf&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# フォント内の cmap テーブルを取得&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cmap_table &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; font[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cmap&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 最も標準的なUnicode対応表（サブテーブル）を見つける&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;unicode_table &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; table &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; cmap_table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tables:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isUnicode():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        unicode_table &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cmap
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; unicode_table:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--- 文字コード と グリフ名 の対応関係（一部抜粋） ---&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 最初の20個だけ表示してみる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    count &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; code, glyph_name &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; unicode_table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;items():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# code（数値）を実際の文字に変換して表示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        char &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; chr(code) &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; code &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[特殊文字]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;文字: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;char&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; (Unicode: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;code&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;) ---&amp;gt; グリフ名: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;glyph_name&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        count &lt;span style=&#34;color:#f92672&#34;&gt;+=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; count &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Unicode対応表が見つかりませんでした。&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;【学習のポイント】&lt;/strong&gt;
このプログラムを実行すると、&lt;code&gt;文字: A (Unicode: 65) ---&amp;gt; グリフ名: A&lt;/code&gt; のようなペアがずらりと並びます。このペアを意図的に「狂わせる」のが次のステップです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;４シーザー暗号作成フォントを実装する&#34;&gt;４．「シーザー暗号作成フォント」を実装する&lt;/h2&gt;
&lt;p&gt;仕組みがわかったところで、いよいよ本番です。
&lt;code&gt;A&lt;/code&gt; の文字コード（65）のときに、&lt;code&gt;B&lt;/code&gt; のグリフ名が呼び出されるように &lt;code&gt;cmap&lt;/code&gt; を書き換えます。アルファベット26文字が綺麗にローテーションするように計算（余り算 &lt;code&gt;%&lt;/code&gt;）を使いましょう。&lt;/p&gt;
&lt;h3 id=&#34;暗号フォント作成プログラム&#34;&gt;暗号フォント作成プログラム&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; fonttools.ttLib &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; TTFont
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;create_caesar_font&lt;/span&gt;(input_path, output_path, shift&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    font &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; TTFont(input_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cmap_table &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; font[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cmap&amp;#39;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; table &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; cmap_table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;tables:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;isUnicode():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;# 現在の「文字コード -&amp;gt; グリフ名」の対応表をコピー（参照用にキープ）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        original_cmap &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; dict(table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cmap)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; code &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; original_cmap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;keys():
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# 大文字 A(65) 〜 Z(90) の処理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; code &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;90&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# shift分だけ「手前」の文字コードのグリフを持ってくることで、&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;# 入力した時に「後ろ」の文字が表示されるようにする&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                shifted_code &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (code &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;65&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; shift) &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; shifted_code &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; original_cmap:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cmap[code] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; original_cmap[shifted_code]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#75715e&#34;&gt;# 小文字 a(97) 〜 z(122) の処理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            &lt;span style=&#34;color:#66d9ef&#34;&gt;elif&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;97&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; code &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;122&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                shifted_code &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;97&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (code &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;97&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; shift) &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; shifted_code &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; original_cmap:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                    table&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cmap[code] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; original_cmap[shifted_code]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 保存する&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    font&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;save(output_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;シーザー暗号フォント（ずらし量: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;shift&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;）を作成しました！&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 実行（sample.ttf を読み込んで、caesar_font.ttf を出力）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;create_caesar_font(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;sample.ttf&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;caesar_font.ttf&amp;#34;&lt;/span&gt;, shift&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;実験してみよう&#34;&gt;実験してみよう！&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;作成された &lt;code&gt;caesar_font.ttf&lt;/code&gt; をパソコンにインストールするか、フォントプレビューで開いてみてください。&lt;/li&gt;
&lt;li&gt;メモ帳などのテキストエディタを開き、フォントをこの暗号フォントに切り替えます。&lt;/li&gt;
&lt;li&gt;キーボードで &lt;code&gt;HELLO&lt;/code&gt; と打ち込んでみましょう。画面には &lt;code&gt;IFMMP&lt;/code&gt; （それぞれ1文字ずれた文字）と表示されるはずです！&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;５ステップアップ発展課題&#34;&gt;５．ステップアップ！発展課題&lt;/h2&gt;
&lt;p&gt;基本が完成したら、さらにプログラムを改造してフォントの理解を深めてみましょう。&lt;/p&gt;
&lt;h3 id=&#34;課題１ずらす数を自由に変えられるようにしよう&#34;&gt;課題１：ずらす数を自由に変えられるようにしよう&lt;/h3&gt;
&lt;p&gt;現在のプログラムは1文字ずらすだけですが、関数の引数 &lt;code&gt;shift=3&lt;/code&gt; にしたときに3文字ずれる（A➔D、B➔Eになる）ようにコードが正しく動くか検証してください。また、&lt;code&gt;shift=-1&lt;/code&gt;（逆方向にずらすデコードフォント）を作ってみましょう。&lt;/p&gt;
&lt;h3 id=&#34;課題２数字09もループさせてみよう&#34;&gt;課題２：数字（0〜9）もループさせてみよう&lt;/h3&gt;
&lt;p&gt;アルファベットだけでなく、数字の &lt;code&gt;0&lt;/code&gt;（文字コード48）から &lt;code&gt;9&lt;/code&gt;（文字コード57）が入力されたときも、1つ後ろの数字が表示され、&lt;code&gt;9&lt;/code&gt; のときは &lt;code&gt;0&lt;/code&gt; に戻るような処理をコードに追加してみましょう。&lt;/p&gt;
&lt;h3 id=&#34;課題３高難易度日本語ひらがなの暗号化に挑戦&#34;&gt;課題３：【高難易度】日本語（ひらがな）の暗号化に挑戦&lt;/h3&gt;
&lt;p&gt;日本の文字コードの並びを利用して、「あ」のキーを押したら「い」、「ん」のキーを押したら「あ」が表示されるような「ひらがな版シーザー暗号フォント」を作ってみましょう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;ヒント:&lt;/em&gt; ひらがなのUnicodeの開始位置は &lt;code&gt;0x3041&lt;/code&gt;（ぁ）から &lt;code&gt;0x3093&lt;/code&gt;（ん）の付近です。まずは「３」の解析プログラムを使って、ひらがなの文字コードがどう並んでいるか調べてみましょう。&lt;/li&gt;
&lt;/ul&gt;
</content>
    </item>
    
  </channel>
</rss>
