<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CFXLOG &#8211; CFXLOG</title>
	<atom:link href="https://cfxlog.com/author/admin/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>https://cfxlog.com/</link>
	<description></description>
	<lastBuildDate>Thu, 12 Nov 2026 07:38:44 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://cfxlog.com/wp-content/uploads/2026/07/cfxlog-favicon-150x150.png</url>
	<title>CFXLOG &#8211; CFXLOG</title>
	<link>https://cfxlog.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>スマホアプリを断捨離する方法【ミニマリストが使う13個のアプリ全公開】</title>
		<link>https://cfxlog.com/lifehacks-minimalist-smartphone-apps/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Thu, 12 Nov 2026 07:38:43 +0000</pubDate>
				<category><![CDATA[lifehacks]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=5740</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/11/lifehacks-minimalist-smartphone-apps-1024x538-1.jpg" class="webfeedsFeaturedVisual" /></p>このような方に向けて書きました。 スマホアプリは無料で簡単に入れられるので、気づいたら50個・100個と増えていることがあります。 でも、アプリが多ければ多いほど良いわけではありません。増えすぎたアプリには、見えないコス [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/11/lifehacks-minimalist-smartphone-apps-1024x538-1.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>スマホアプリが増えすぎて管理できていない</li>



<li>どのアプリを残してどれを消せばいいかわからない</li>



<li>ミニマリストが実際に使っているアプリを知りたい</li>
</ul>
</div></div>



<p class="wp-block-paragraph">このような方に向けて書きました。</p>



<p class="wp-block-paragraph">スマホアプリは無料で簡単に入れられるので、気づいたら50個・100個と増えていることがあります。</p>



<p class="wp-block-paragraph">でも、アプリが多ければ多いほど良いわけではありません。<strong>増えすぎたアプリには、見えないコストがかかっています。</strong></p>



<p class="wp-block-paragraph">僕はミニマリスト思考でスマホを整理した結果、今は13個のアプリだけで快適に暮らせています。</p>



<p class="wp-block-paragraph">この記事では、アプリを断捨離する具体的な手順と判断基準、そして僕が実際に残した13個のアプリを全公開します。</p>



<h2 class="wp-block-heading">アプリを断捨離すべき理由</h2>



<p class="wp-block-paragraph">「アプリは無料だし、入れておいても損はないでしょ？」と思いがちです。</p>



<p class="wp-block-paragraph">でも実際には、アプリが増えるほど次のようなデメリットが積み重なります。</p>



<h3 class="wp-block-heading">バックグラウンド通信で通信量が増える</h3>



<p class="wp-block-paragraph">使っていないアプリでも、バックグラウンドで通信を続けているものがあります。</p>



<p class="wp-block-paragraph">通知を受け取るためや、データを同期するためです。</p>



<p class="wp-block-paragraph">アプリを減らすだけで月々の通信量が減り、<strong>スマホプランを安いプランに変えられる可能性があります。</strong></p>



<p class="wp-block-paragraph">年換算すると数千円〜1万円以上の節約になるケースも。</p>



<h3 class="wp-block-heading">ストレージを圧迫してスマホ本体が高くなる</h3>



<p class="wp-block-paragraph">アプリそのものはもちろん、キャッシュデータもストレージを消費します。</p>



<p class="wp-block-paragraph">「256GBじゃないと足りない」と思って高いモデルを買ったけど、アプリを断捨離したら128GBで十分だった、という話はよくあります。</p>



<p class="wp-block-paragraph">スマホ本体の選び方にも影響するんです。</p>



<h3 class="wp-block-heading">必要なアプリを探せなくなる</h3>



<p class="wp-block-paragraph">アプリが増えると、ホーム画面がアイコンだらけになります。</p>



<p class="wp-block-paragraph">使いたいアプリをすぐに開けない、という地味なストレスが積み重なります。</p>



<p class="wp-block-paragraph">僕はアプリを絞り込んでから、<strong>「あのアプリどこだっけ？」と探す時間がゼロになりました。</strong></p>



<p class="wp-block-paragraph">小さなことですが、毎日積み重なると結構違います。</p>



<h2 class="wp-block-heading">スマホアプリを断捨離する手順</h2>



<p class="wp-block-paragraph">アプリの断捨離は「どれを残すか」から考えると迷います。</p>



<p class="wp-block-paragraph">おすすめは逆の発想、<strong>「全部消してから、必要なものだけ入れ直す」</strong>やり方です。</p>



<h3 class="wp-block-heading">ステップ1：削除できるアプリを全部消す</h3>



<p class="wp-block-paragraph">まずはシステムアプリ（消せないもの）以外を、思い切ってすべて削除します。</p>



<p class="wp-block-paragraph">「もしかしたら使うかも」というアプリは、その「もしかしたら」がほぼ来ません。</p>



<p class="wp-block-paragraph">アプリはいつでも再インストールできるので、迷ったら消す方針でいきましょう。</p>



<h3 class="wp-block-heading">ステップ2：1週間使って必要なものだけ入れ直す</h3>



<p class="wp-block-paragraph">消した後、日常生活の中で「このアプリが必要だ」と思った瞬間にだけ入れ直します。</p>



<p class="wp-block-paragraph">1週間やってみると、<strong>本当に必要なアプリは思った以上に少ない</strong>ことに気づきます。</p>



<p class="wp-block-paragraph">「なんとなく入れていた」アプリがいかに多かったかが実感できます。</p>



<h3 class="wp-block-heading">ステップ3：残すアプリの判断基準を持つ</h3>



<p class="wp-block-paragraph">入れ直すアプリを判断するときの基準はシンプルです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>週1回以上使う</strong>かどうか</li>



<li>そのアプリでしかできないことがあるか（<strong>代替できないか</strong>）</li>



<li>ブラウザで代用できるなら<strong>アプリは不要</strong></li>
</ul>
</div></div>



<p class="wp-block-paragraph">「週1回以上使うか」が一番シンプルで使いやすい基準です。</p>



<p class="wp-block-paragraph">これだけで大半のアプリは自然と絞れます。</p>



<h3 class="wp-block-heading">消してよかったアプリのカテゴリ</h3>



<p class="wp-block-paragraph">参考までに、僕が断捨離して「消してよかった」と感じたカテゴリを紹介します。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>SNSアプリ</strong><br>TwitterとInstagramとTikTokを全部入れていたが、全て不要だったので今はゼロ</li>



<li><strong>決済アプリの重複</strong><br>PayPay・d払い・au Pay・楽天ペイを全部入れていたが、楽天ペイ1つに絞った</li>



<li><strong>使っていないサブスクアプリ</strong><br>課金していないのにアプリだけ入っているもの</li>



<li><strong>ゲームアプリ</strong><br>やめるのが難しいので思い切って全削除</li>
</ul>
</div></div>



<h2 class="wp-block-heading">毎日使う基本アプリ5選</h2>



<p class="wp-block-paragraph">これがないと生活が成り立たない、インストール必須のアプリたちです。</p>



<h3 class="wp-block-heading">1Password</h3>



<p class="wp-block-paragraph">1Passwordは「ログイン情報」や「銀行口座」などの<strong>機密情報を管理するアプリ</strong>です。</p>



<p class="wp-block-paragraph">年会費4,000円ほどかかりますが、メリットだらけで手放せなくなりました。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li>Windows・Mac・スマホ共通でパスワード管理できる</li>



<li>パスワード生成機能が便利</li>



<li>セキュリティ的に安全</li>
</ul>
</div></div>



<p class="wp-block-paragraph">パスワードを忘れてあたふたする時間が消えます。</p>



<p class="wp-block-paragraph">もはや必須ツールです。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple116/v4/c8/21/57/c821574f-4153-3432-693a-49f96d51d2d1/AppIcon-0-0-1x_U007emarketing-0-0-0-6-0-0-sRGB-0-0-0-GLES2_U002c0-512MB-85-220-0-0.png/512x512bb.jpg" alt="1Password - Password Manager" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">1Password &#8211; Password Manager</p><p class="appreach__info"><span class="appreach__developper">AgileBits Inc.</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/1password-password-manager/id568903335?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.onepassword.android" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">Claude</h3>



<p class="wp-block-paragraph">どんな質問にも、相談にも答えてくれる「相棒」のような存在です。</p>



<p class="wp-block-paragraph">最近ではインターネット上から最新の情報を拾ってきたり、より詳細な会話もできるようになりました。</p>



<p class="wp-block-paragraph">僕はちょっと神経を使うメールのやり取りや、精神的にしんどい時の相談役として使っています。</p>



<p class="wp-block-paragraph">月額20ドルかかりますが、月給20ドルの社員を雇ったつもりで使っています。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/fb/80/26/fb802683-4a33-a1c3-017f-2fe51e26e35c/AppIcon-0-0-1x_U007epad-0-1-85-220.png/512x512bb.jpg" alt="Claude by Anthropic" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">Claude by Anthropic</p><p class="appreach__info"><span class="appreach__developper">Anthropic PBC</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/claude-by-anthropic/id6473753684?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.anthropic.claude" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">Google Maps</h3>



<p class="wp-block-paragraph">普段の移動はもちろん、旅行時にも目的地が一瞬で検索できます。</p>



<p class="wp-block-paragraph">「どこかいい飲食店ないかなぁ」という時もマップを開けば評判の良いお店が出てきます。「場所」に関する悩みはすべて叶えてくれるアプリです。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/6e/74/5b/6e745bef-0441-e5a5-5367-195b97f9cf2e/logo_maps_ios_color-0-1x_U007emarketing-0-0-0-6-0-0-0-85-220-0.png/512x512bb.jpg" alt="Google マップ -  乗換案内 &amp; グルメ" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">Google マップ &#8211;  乗換案内 &amp; グルメ</p><p class="appreach__info"><span class="appreach__developper">Google</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/google-%E3%83%9E%E3%83%83%E3%83%97-%E4%B9%97%E6%8F%9B%E6%A1%88%E5%86%85-%E3%82%B0%E3%83%AB%E3%83%A1/id585027354?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.maps" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">乗換案内</h3>



<p class="wp-block-paragraph">電車やバスの情報はこれ一本でいけます。</p>



<p class="wp-block-paragraph">Google Mapsでも乗り換え検索はできますが、まだこのアプリには敵わないという印象です。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/a7/0d/96/a70d96a7-5a1e-d6a0-5c63-c5d35da534f7/AppIcon-0-0-1x_U007emarketing-0-7-0-85-220.png/512x512bb.jpg" alt="乗換案内" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">乗換案内</p><p class="appreach__info"><span class="appreach__developper">Jorudan Co.,Ltd.</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/%E4%B9%97%E6%8F%9B%E6%A1%88%E5%86%85/id299490481?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=jp.co.jorudan.nrkj" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">Amazon</h3>



<p class="wp-block-paragraph">ネットショッピングはほとんどAmazonです。Prime会員なので送料無料ですぐ届くのが魅力。</p>



<p class="wp-block-paragraph">あまりにすぐ届くので、配送スタッフさんのことが心配になってしまうほどです。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/1b/b5/db/1bb5db12-22e8-05eb-dce9-f7cc33eb6ff0/AppIcon-0-0-1x_U007emarketing-0-6-0-0-85-220.png/512x512bb.jpg" alt="Amazon ショッピングアプリ" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">Amazon ショッピングアプリ</p><p class="appreach__info"><span class="appreach__developper">AMZN Mobile LLC</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/amazon-%E3%82%B7%E3%83%A7%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%E3%82%A2%E3%83%97%E3%83%AA/id374254473?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.amazon.mShop.android.shopping" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h2 class="wp-block-heading">娯楽・情報収集に使うエンタメアプリ3選</h2>



<p class="wp-block-paragraph">気を抜くと仕事漬けの毎日になってしまうので、息抜きも大切にしています。</p>



<p class="wp-block-paragraph">アプリが増えると管理が面倒になるので、少数精鋭で運用しています。</p>



<h3 class="wp-block-heading">YouTube</h3>



<p class="wp-block-paragraph">「娯楽」と言いつつも、主に情報収集用として使っています。</p>



<p class="wp-block-paragraph">家電はもちろん日用品なども、たいていの優れた情報はYouTubeに集まっている気がしており、頼りになる情報源です。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/23/a3/22/23a3229f-d019-2782-534a-564c09759675/logo_youtube_color-1x_U007emarketing-0-6-0-0-85-220-0.png/512x512bb.jpg" alt="YouTube" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">YouTube</p><p class="appreach__info"><span class="appreach__developper">Google</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/youtube/id544007664?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.google.android.youtube" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">YouTube Music</h3>



<p class="wp-block-paragraph">新旧・邦楽洋楽問わず、様々な音楽が視聴できます。「久々にあの曲が聴きたいな」という時にすぐ開けるのが便利です。</p>



<p class="wp-block-paragraph">Amazon Primeに加入していれば無料で使えます。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/85/a7/bf/85a7bfeb-cc75-8c75-6afd-dbb429163834/logo_youtube_music_2024_q4_color-0-1x_U007emarketing-0-0-0-7-0-0-0-85-220-0.png/512x512bb.jpg" alt="YouTube Music" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">YouTube Music</p><p class="appreach__info"><span class="appreach__developper">Google</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/youtube-music/id1017492454?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.youtube.music" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">Amazon Prime Video</h3>



<p class="wp-block-paragraph">よくアニメの視聴用に使っています。</p>



<p class="wp-block-paragraph">出社前にスマホにダウンロードしておき、電車内で観るのが日課です。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/67/9d/2f/679d2f94-1fcd-4f9f-faad-9eb13fa89f69/AppIcon-0-0-1x_U007epad-0-0-0-85-220.png/512x512bb.jpg" alt="Amazon Prime Video" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">Amazon Prime Video</p><p class="appreach__info"><span class="appreach__developper">AMZN Mobile LLC</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/amazon-prime-video/id545519333?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.amazon.avod.thirdpartyclient" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h2 class="wp-block-heading">スマホ一本でお金を管理する5個のアプリ</h2>



<p class="wp-block-paragraph">基本的にはスマホ決済・スマホ管理に一本化していて、家計簿も自動作成されるようにしています。</p>



<h3 class="wp-block-heading">MoneyForward</h3>



<p class="wp-block-paragraph">家計簿アプリはMoneyForwardを使っています。収入・支出の項目が一目でわかるので、家計管理はこれ一つで完結します。</p>



<p class="wp-block-paragraph">家計簿を作る時間を、別の作業に当てられます。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/11/6f/61/116f61a9-27d4-5e42-a0f0-e1c1ab2956ee/AppIcon-0-0-1x_U007emarketing-0-7-0-85-220.png/512x512bb.jpg" alt="家計簿マネーフォワード ME - 人気の家計簿(かけいぼ)" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">家計簿マネーフォワード ME &#8211; 人気の家計簿(かけいぼ)</p><p class="appreach__info"><span class="appreach__developper">Money Forward, Inc.</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/%E5%AE%B6%E8%A8%88%E7%B0%BF%E3%83%9E%E3%83%8D%E3%83%BC%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89-me-%E4%BA%BA%E6%B0%97%E3%81%AE%E5%AE%B6%E8%A8%88%E7%B0%BF-%E3%81%8B%E3%81%91%E3%81%84%E3%81%BC/id594145971?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.moneyforward.android.app" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">楽天銀行</h3>



<p class="wp-block-paragraph">銀行口座は楽天銀行に一本化しました。</p>



<p class="wp-block-paragraph">以前はかなり多くの口座を持っていましたが、<a href="https://ginyuwriter.com/lifehacks-bank-account-danshari/"><strong>こちらの記事</strong></a>で解説した通りすべて廃止しました。</p>



<p class="wp-block-paragraph">楽天銀行は条件達成で「ATM引き出し手数料」や「振込手数料」が無料になるので、最近では銀行に手数料を支払った覚えがありません。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/d9/a3/21/d9a321e4-623c-3e10-961d-a92d0435376c/AppIcon-1x_U007emarketing-0-6-0-0-85-220-0.png/512x512bb.jpg" alt="楽天銀行" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">楽天銀行</p><p class="appreach__info"><span class="appreach__developper">楽天銀行株式会社</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/%E6%A5%BD%E5%A4%A9%E9%8A%80%E8%A1%8C/id391048295?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=jp.co.rakuten_bank.rakutenbank" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">楽天ペイ</h3>



<p class="wp-block-paragraph">バーコード決済は楽天ペイ1本に絞りました。PayPay・d払い・au Payと複数入れていた時期もありましたが、今は楽天ペイだけです。</p>



<p class="wp-block-paragraph">期間限定ポイントや楽天キャッシュを使いきれない場合に消化するのがメインの用途です。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/5b/41/65/5b416589-5ca0-e861-961a-958997d3984e/AppIcon-0-0-1x_U007emarketing-0-5-0-85-220.png/512x512bb.jpg" alt="楽天ペイ-楽天ポイントカードも利用できるスマホ決済アプリ" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">楽天ペイ-楽天ポイントカードも利用できるスマホ決済アプリ</p><p class="appreach__info"><span class="appreach__developper">Rakuten Group, Inc.</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/%E6%A5%BD%E5%A4%A9%E3%83%9A%E3%82%A4-%E6%A5%BD%E5%A4%A9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%AB%E3%83%BC%E3%83%89%E3%82%82%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%B9%E3%83%9E%E3%83%9B%E6%B1%BA%E6%B8%88%E3%82%A2%E3%83%97%E3%83%AA/id1139755229?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=jp.co.rakuten.pay" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">メルカリ</h3>



<p class="wp-block-paragraph">ミニマリストの断捨離に欠かせないフリマアプリです。</p>



<p class="wp-block-paragraph">ラクマよりユーザーが多いのか、すぐに高く売れます。不用品の出品用としては最高のアプリです。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/1d/19/a0/1d19a033-befc-172a-a7cf-1520be148d41/AppIcon-0-0-1x_U007emarketing-0-4-0-85-220.png/512x512bb.jpg" alt="フリマアプリはメルカリ - メルペイのスマホ決済でもっとお得" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">フリマアプリはメルカリ &#8211; メルペイのスマホ決済でもっとお得</p><p class="appreach__info"><span class="appreach__developper">Mercari, Inc.</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/%E3%83%95%E3%83%AA%E3%83%9E%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AF%E3%83%A1%E3%83%AB%E3%82%AB%E3%83%AA-%E3%83%A1%E3%83%AB%E3%83%9A%E3%82%A4%E3%81%AE%E3%82%B9%E3%83%9E%E3%83%B3%E3%83%9B%E6%B1%BA%E6%B8%88%E3%81%A7%E3%82%82%E3%81%A3%E3%81%A8%E3%2081%8A%E5%BE%97/id667861049?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=com.kouzoh.mercari" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h3 class="wp-block-heading">マイナポータル</h3>



<p class="wp-block-paragraph">確定申告のe-Taxで年に一度使っています。</p>



<p class="wp-block-paragraph">ふるさと納税をする方や副業をする方は入れておいて損はないと思います。</p>



<div class="appreach"><img decoding="async" src="https://is1-ssl.mzstatic.com/image/thumb/Purple126/v4/d2/1b/68/d21b6851-1d0d-0cd1-9e32-67222d9d9939/AppIcon-0-0-1x_U007emarketing-0-8-0-sRGB-85-220.png/512x512bb.jpg" alt="マイナポータル" class="appreach__icon"><div class="appreach__detail"><p class="appreach__name">マイナポータル</p><p class="appreach__info"><span class="appreach__developper">デジタル庁</span><span class="appreach__price">無料</span><span class="appreach__posted">posted with<a href="https://mama-hack.com/app-reach/" title="アプリーチ" target="_blank" rel="nofollow noopener">アプリーチ</a></span></p></div><div class="appreach__links"><a href="https://apps.apple.com/jp/app/%E3%83%9E%E3%82%A4%E3%83%8A%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB/id1476359069?uo=4" rel="nofollow" class="appreach__aslink"><img decoding="async" src="https://nabettu.github.io/appreach/img/itune_ja.svg"></a><a href="https://play.google.com/store/apps/details?id=jp.go.cas.mpa" rel="nofollow" class="appreach__gplink"><img decoding="async" src="https://nabettu.github.io/appreach/img/gplay_ja.png"></a></div></div>



<h2 class="wp-block-heading">まとめ：アプリを断捨離すると、スマホが道具に戻る</h2>



<p class="wp-block-paragraph">断捨離して残ったのは13個。</p>



<p class="wp-block-paragraph">「少なすぎでは？」と思う方もいるかもしれませんが、実際にやってみると本当に快適です。</p>



<p class="wp-block-paragraph">アプリが減ると、スマホが「なんとなく触ってしまう機械」から「必要な時に使う道具」に変わります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>まずは全部消して、1週間必要なものだけ入れ直す</li>



<li>残す基準は「週1回以上使うか」だけでいい</li>



<li>アプリはいつでも再インストールできるので、迷ったら消す</li>
</ul>
</div></div>



<p class="wp-block-paragraph">まずはアプリを削除してみて、どれだけ身軽になれるかを試してみてください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>長財布をやめて5年。小型財布×Apple Payで整えた、お金まわりの断捨離</title>
		<link>https://cfxlog.com/lifehacks-minimalist-wallet/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Thu, 26 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[lifehacks]]></category>
		<category><![CDATA[キャッシュレス]]></category>
		<category><![CDATA[ミニマリスト]]></category>
		<category><![CDATA[断捨離]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=5569</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/lifehacks-minimalist-wallet-1024x538-1.jpg" class="webfeedsFeaturedVisual" /></p>このような方に向けて書きました。 僕は5年前に長財布をやめ、カードが5枚ほどしか入らない小型の二つ折り財布に乗り換えました。 決済はApple Payとクレジットカード中心。現金はほぼ使わない生活です。 この記事では、財 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/lifehacks-minimalist-wallet-1024x538-1.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>財布がかさばって、小さいバッグに入らない</li>

<li>ポイントカードで財布がパンパンになっている</li>

<li>キャッシュレス化したいけど、現金がないと不安</li>
</ul>
</div></div>



<p class="wp-block-paragraph">このような方に向けて書きました。</p>



<p class="wp-block-paragraph">僕は5年前に長財布をやめ、カードが5枚ほどしか入らない小型の二つ折り財布に乗り換えました。</p>



<p class="wp-block-paragraph">決済はApple Payとクレジットカード中心。現金はほぼ使わない生活です。</p>



<p class="wp-block-paragraph">この記事では、財布を小さくしたきっかけから、今の決済構成、実際にやってみてわかったことまで、5年間のリアルをまとめます。</p>



<h2 class="wp-block-heading">長財布をやめたきっかけ</h2>



<h3 class="wp-block-heading">「かさばる」という小さなストレス</h3>



<p class="wp-block-paragraph">長財布をやめた理由は、シンプルに「かさばるから」です。</p>



<p class="wp-block-paragraph">ちょっとしたお出かけに小さめのバッグを使いたいとき、長財布がどうしても入らない。</p>



<p class="wp-block-paragraph">かといってバッグを大きなものに変えるのも嫌で、「財布のせいで持ち物全体が制限される」という地味なストレスが積み重なっていました。</p>



<h3 class="wp-block-heading">「長財布は運気が上がる」は本当か</h3>



<p class="wp-block-paragraph">「長財布はお金が貯まる」「運気が上がる」という話、聞いたことがある方も多いと思います。</p>



<p class="wp-block-paragraph">僕も気になってはいました。でも実際のところ、財布の形よりも家計管理の仕組みの方がよほど大事だと感じています。</p>



<p class="wp-block-paragraph">長財布を使っていた頃の方が、レシートとポイントカードで財布がパンパンで、むしろお金の流れが把握できていませんでした。</p>



<h2 class="wp-block-heading">今の決済構成はこれだけ</h2>



<p class="wp-block-paragraph">財布を小さくすると同時に、決済の仕組みも整理しました。今の構成はシンプルです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>基本決済</strong><br>Apple Pay（クレジットカード紐付け）</li>

<li><strong>ポイント消化・楽天系の店舗</strong><br>楽天ペイ</li>

<li><strong>現金が必要な場面</strong><br>小型財布に最低限の小銭とお札</li>
</ul>
</div></div>



<h3 class="wp-block-heading">メインはApple Pay（クレジットカード）</h3>



<p class="wp-block-paragraph">コンビニ・スーパー・飲食店など、日常の支払いのほとんどはApple Payで完結します。</p>



<p class="wp-block-paragraph">スマホをかざすだけで支払いが終わるので、財布を取り出す手間がありません。</p>



<p class="wp-block-paragraph">クレジットカードはMoneyForwardと連携しているので、使った金額が自動的に家計簿に記録されます。レシートを管理する必要がないのが特に助かっています。</p>



<h3 class="wp-block-heading">楽天ポイントだけは例外的に貯める</h3>



<p class="wp-block-paragraph">ポイントカードは全廃しましたが、楽天ポイントだけは例外にしています。</p>



<p class="wp-block-paragraph">理由は、楽天ポイントが投資信託や普段の買い物にそのまま使えるから。</p>



<p class="wp-block-paragraph">楽天市場・楽天ペイ・楽天銀行をまとめて使うことで、日常的にまとまったポイントが貯まります。「ポイ活」として頑張るわけではなく、使うサービスを楽天に寄せているだけで自然と貯まる感覚です。</p>



<p class="wp-block-paragraph">楽天ペイが使える店舗ではできるだけ楽天ペイで支払い、期間限定ポイントや楽天キャッシュを消化するのがメインの使い方です。</p>



<h3 class="wp-block-heading">現金は「最低限だけ」と割り切る</h3>



<p class="wp-block-paragraph">完全にキャッシュレスにはしていません。現金が必要な場面は確実にあるからです。</p>



<p class="wp-block-paragraph">小型財布に少量のお札と小銭を入れて持ち歩いています。</p>



<h2 class="wp-block-heading">現金が必要な場面と現実的な対処法</h2>



<h3 class="wp-block-heading">完全キャッシュレスは難しい場面がある</h3>



<p class="wp-block-paragraph">「現金いらない生活」に憧れる気持ちはありますが、現実的にはまだ現金が必要な場面があります。</p>



<p class="wp-block-paragraph">僕の場合、よく行く銭湯が現金オンリーです。</p>



<p class="wp-block-paragraph">あとは下駄箱やロッカーの鍵。100円玉を入れないと使えないタイプのものは、スマホ決済では対応できません。</p>



<h3 class="wp-block-heading">100円玉を数枚持ち歩けば十分</h3>



<p class="wp-block-paragraph">対策はシンプルで、小銭入れに100円玉を数枚ストックしておくだけです。</p>



<p class="wp-block-paragraph">「現金が必要になったらどうしよう」と不安に思いがちですが、実際に必要になる金額は限られています。</p>



<p class="wp-block-paragraph">大きな買い物は基本的にキャッシュレスで対応できるので、財布の中に万円札を何枚も持ち歩く必要はありません。</p>



<h2 class="wp-block-heading">財布を小さくしてよかった3つのこと</h2>



<h3 class="wp-block-heading">1. 持ち運びが圧倒的に楽になった</h3>



<p class="wp-block-paragraph">一番の変化は、バッグ選びの自由度が上がったことです。</p>



<p class="wp-block-paragraph">以前は「長財布が入るバッグ」という制約がありましたが、今は小型財布がどんなバッグにも入るので選択肢が広がりました。</p>



<p class="wp-block-paragraph">ちょっとしたお出かけに小さいトートやサコッシュを使いたいときも、財布のことを気にしなくてよくなりました。</p>



<h3 class="wp-block-heading">2. ポイントカードという「義務感」がなくなった</h3>



<p class="wp-block-paragraph">長財布を使っていた頃は、ポイントカードが10枚以上入っていました。</p>



<p class="wp-block-paragraph">財布が小さくなると、物理的に入らないのでポイントカードを自然に断捨離できます。</p>



<p class="wp-block-paragraph">「このカード持ってますか？」と聞かれるたびに「持っていません」と答えるだけでよくなりました。レジでカードを探してモタつくこともなくなりました。</p>



<h3 class="wp-block-heading">3. 家計管理が自動化された</h3>



<p class="wp-block-paragraph">現金払いが減ったことで、支出のほぼすべてがクレジットカードの明細に集約されるようになりました。</p>



<p class="wp-block-paragraph"><a href="https://cfxlog.com/lifehacks-minimalist-smartphone-apps/"><strong>MoneyForward</strong></a>と連携しているので、家計簿は自動で作成されます。</p>



<p class="wp-block-paragraph">「先月いくら使ったっけ？」という疑問がアプリを開けば一瞬でわかるようになり、家計管理の精度が大幅に上がりました。</p>



<h2 class="wp-block-heading">小さくする前に不安だったこと→実際はどうだったか</h2>



<h3 class="wp-block-heading">お札を折らなきゃいけない問題</h3>



<p class="wp-block-paragraph">二つ折り財布に変える前に一番気になっていたのが、お札を折る必要があること。</p>



<p class="wp-block-paragraph">「きっちり折り畳まないといけないのは面倒では？」と思っていましたが、実際には問題ありませんでした。</p>



<p class="wp-block-paragraph">ふんわり入れられるゆとりのある財布を選んだので、きっちり折らなくても自然に収まります。現金をほとんど使わなくなってからは、そもそもお札を出し入れする頻度自体が減りました。</p>



<h3 class="wp-block-heading">小銭が入らない問題</h3>



<p class="wp-block-paragraph">「小銭が溜まったらどうするの？」という不安もありました。</p>



<p class="wp-block-paragraph">実際にはキャッシュレス決済を使うようになってから、そもそもおつりをもらう機会がほとんどなくなりました。</p>



<p class="wp-block-paragraph">小銭が増えにくくなるので、小さい小銭入れでも十分に対応できます。手持ちの小銭は意識して使うようにすれば、枚数はコントロールできます。</p>



<h3 class="wp-block-heading">カードが入らない問題</h3>



<p class="wp-block-paragraph">小型財布に変えると、クレジットカードが2〜3枚しか入らないものもあります。</p>



<p class="wp-block-paragraph">「カードが全部入らない」と不安に思いましたが、実際に必要なカードを数えてみると、ポイントカードを除いたら数枚で足りました。</p>



<p class="wp-block-paragraph">クレジットカード1〜2枚、身分証、保険証。これだけ入ればほぼ困りません。</p>



<p class="wp-block-paragraph">「念のため持ち歩く」カードは、実際にはほとんど使わないことが多いです。</p>



<h2 class="wp-block-heading">まとめ：財布断捨離は「小さくする」だけでいい</h2>



<p class="wp-block-paragraph">「財布をやめる」というと大げさに聞こえますが、やることはシンプルです。</p>



<p class="wp-block-paragraph">長財布を小型財布に変えて、決済をApple Payに寄せるだけ。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>決済はApple Pay（クレジットカード）メイン</li>

<li>ポイントは楽天ペイ1本に絞る</li>

<li>現金は「最低限だけ」と割り切る</li>

<li>ポイントカードは全廃、カードは必要最小限だけ</li>
</ul>
</div></div>



<p class="wp-block-paragraph">この構成にしてから5年、不便を感じたことはほぼありません。</p>



<p class="wp-block-paragraph">財布が小さくなると、バッグの選択肢が増え、余計なものを持ち歩かなくなり、家計管理まで楽になります。</p>



<p class="wp-block-paragraph">「財布を断捨離する」のハードルは、思っているより全然低いです。まずは今の財布の中身を一度全部出して、本当に必要なものだけを選んでみてください。</p>



<p class="wp-block-paragraph">関連記事として、<a href="https://cfxlog.com/lifehacks-bank-account-danshari/"><strong>銀行口座を7個→2個に減らした話</strong></a>や<a href="https://cfxlog.com/lifehacks-credit-card-danshari/"><strong>クレジットカードを10枚→1枚に断捨離した話</strong></a>もあわせて読んでみてください。お金まわりの断捨離が一気に進みます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Streamlitって何？5分でつくる Python 製 Web アプリ入門</title>
		<link>https://cfxlog.com/python-streamlit-intro/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Fri, 13 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Streamlit]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=5026</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-streamlit-intro.jpg" class="webfeedsFeaturedVisual" /></p>そんな時に頼れるのが Streamlit（ストリームリット） です。 HTML/CSS はもちろん JavaScript も不要、Python だけで “見た目も機能も” 完結 するライトフレームワーク。 この記事では、 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-streamlit-intro.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>Python で作ったアプリを誰かに見せたい</li>



<li>でも <strong>Flask や Django はちょっと難しそう…</strong></li>
</ul>
</div></div>



<p class="wp-block-paragraph">そんな時に頼れるのが <strong>Streamlit（ストリームリット）</strong> です。</p>



<p class="wp-block-paragraph">HTML/CSS はもちろん JavaScript も不要、<strong>Python だけで “見た目も機能も” 完結</strong> するライトフレームワーク。</p>



<p class="wp-block-paragraph">この記事では、完全初心者でも <strong>最短 5 分で動くサンプルアプリ</strong> を作れるように解説します。</p>



<h2 class="wp-block-heading">1. Streamlit とは？</h2>



<p class="wp-block-paragraph"><strong>Streamlit</strong> は、Python スクリプトをそのまま Web アプリに変換できる OSS（オープンソースソフトウェア）です。</p>



<p class="wp-block-paragraph">データサイエンティストや機械学習エンジニアの「共有したい！」を起点に誕生し、現在（2025 年 6 月時点）も急速に進化中。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>特徴</th><th>説明</th></tr></thead><tbody><tr><td><strong>HTML/CSS 不要</strong></td><td>UI を Python コードで直接記述</td></tr><tr><td><strong>超シンプル構文</strong></td><td>数行でフォームやグラフが完成</td></tr><tr><td><strong>即時リロード</strong></td><td>ファイルを保存するとブラウザが自動更新</td></tr><tr><td><strong>豊富なウィジェット</strong></td><td>ボタン・スライダー・チャート・ファイルアップロードなど</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">ぱっと作れる代表例</h3>



<div class="swell-block-capbox cap_box is-style-onborder_ttl2"><div class="cap_box_ttl"><span>代表例</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>チェックボックスやセレクトボックス付きフォーム</li>



<li>折れ線／棒グラフなどのデータ可視化ダッシュボード</li>



<li>画像・CSV・PDF などファイルを受け取って処理する小ツール</li>
</ul>
</div></div>



<h2 class="wp-block-heading">2. こんな人におすすめ</h2>



<p class="wp-block-paragraph">「自分に向いているか？」を 30 秒で判断できるよう、典型シーンを 3 つ紹介します。</p>



<h3 class="wp-block-heading">Python の処理をブラウザ操作に置き換えたい</h3>



<p class="wp-block-paragraph">「PDF→画像変換」「CSV からレポート生成」など、<strong>ターミナル操作だと利用ハードルが高い</strong> スクリプトを<br><strong>ボタン 1 つで動く Web ツール</strong> に変換できます。</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl2"><div class="cap_box_ttl"><span>具体例</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>ファイルをドラッグ→アップロード→即変換</li>



<li>入力欄でパラメータ調整→リアルタイム再計算</li>
</ul>
</div></div>



<h3 class="wp-block-heading">データを可視化してチーム共有したい</h3>



<p class="wp-block-paragraph"><code>pandas</code> + <code>plotly</code>/<code>matplotlib</code> 連携で、<strong>インタラクティブなダッシュボード</strong> を数行で構築。</p>



<p class="wp-block-paragraph">VPS や社内サーバーに置けば <strong>URL 共有だけ</strong> でメンバー全員が閲覧できます。</p>



<h3 class="wp-block-heading">Web の知識ゼロでも外部公開したい</h3>



<p class="wp-block-paragraph">ルーティング／テンプレート／認証…といった設定は一旦忘れて OK。</p>



<p class="wp-block-paragraph">既存の Python スクリプトに軽く追記するだけで、<strong>ポートフォリオや社内ツール</strong> を最速公開できます。</p>



<h2 class="wp-block-heading">3. 5 分で作る ToDo アプリ</h2>



<p class="wp-block-paragraph">ここからは “手を動かす” パートです。</p>



<p class="wp-block-paragraph">実際にコードを書きながら、Streamlit の流れを体験しましょう。</p>



<h3 class="wp-block-heading">3-1. インストール</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pip install streamlit</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">streamlit</span></span></code></pre></div>



<p class="is-style-icon_announce wp-block-paragraph">※ venv / conda など仮想環境をお使いの場合は、先にアクティベートしてください。</p>



<h3 class="wp-block-heading">3-2. サンプルコード（<code>app.py</code>）</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import streamlit as st

st.title("ToDoアプリ")

task = st.text_input("やることを入力してください")
if st.button("追加") and task:
    st.write(f"<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> {task}")</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> streamlit </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> st</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">st.title(</span><span style="color: #CE9178">&quot;ToDoアプリ&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">task = st.text_input(</span><span style="color: #CE9178">&quot;やることを入力してください&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> st.button(</span><span style="color: #CE9178">&quot;追加&quot;</span><span style="color: #D4D4D4">) </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> task:</span></span>
<span class="line"><span style="color: #D4D4D4">    st.write(</span><span style="color: #569CD6">f</span><span style="color: #CE9178">&quot;&#x2705; </span><span style="color: #569CD6">{</span><span style="color: #D4D4D4">task</span><span style="color: #569CD6">}</span><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading">3-3. 起動</h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>streamlit run app.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">streamlit</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">run</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">app.py</span></span></code></pre></div>



<p class="wp-block-paragraph">ブラウザが自動で開き、<code>http://localhost:8501/</code> にアクセスすると ToDo アプリが表示されます。</p>



<h2 class="wp-block-heading">4. よくある質問（Q&amp;A）</h2>



<p class="wp-block-paragraph">導入時に最も質問が多いポイントを先回りでまとめました。</p>



<p class="wp-block-paragraph">疑問があればまずここをチェック！</p>



<h3 class="wp-block-heading">Q. HTML / CSS は本当に不要？</h3>



<p class="wp-block-paragraph">はい。<strong>すべて Python で完結</strong> します。</p>



<p class="wp-block-paragraph">裏側で自動生成されるため、フロントエンド知識がなくても問題ありません。</p>



<h3 class="wp-block-heading">Q. 大規模アプリや複数ページは作れる？</h3>



<ul class="wp-block-list">
<li>Streamlit は <strong>単一ページ向け</strong> に最適化されており、URL 単位での画面遷移は非対応。</li>



<li>認証や REST API 提供が必要な場合は <strong>Flask / Django / FastAPI</strong> などを検討しましょう。</li>
</ul>



<h3 class="wp-block-heading">Q. 作ったアプリをネット公開できる？</h3>



<p class="wp-block-paragraph">できます。</p>



<p class="wp-block-paragraph">VPS や PaaS（Render・Railway・Streamlit Community Cloud など）を使えば、外部公開が可能です。</p>



<p class="wp-block-paragraph">次回記事で <strong>ConoHa VPS へのデプロイ手順</strong> を解説予定！</p>



<h2 class="wp-block-heading">5. まとめ</h2>



<p class="wp-block-paragraph"><strong>今回のポイントを 3 行で振り返りつつ、次のステップを案内します。</strong></p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>Streamlit は “Pythonだけ” で Web アプリを実現</strong></li>



<li>学習コストが低く、初心者もすぐ成果物を共有できる</li>



<li>軽量ツールやデータ可視化、プロトタイピングに最適</li>
</ul>
</div></div>



<p class="wp-block-paragraph">より詳しい構築方法や、Docker上にStreamlitアプリを構築する方法は、「<a href="https://cfxlog.com/python-streamlit-todo-app/"><strong>【15分で作る】爆速でStreamlitでTODOアプリを実装する方法</strong></a>」で解説しました。</p>



<p class="wp-block-paragraph">ぜひ、合わせて読み進めて見てください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Pythonで電子メール（.emlファイル）を読み込む方法</title>
		<link>https://cfxlog.com/python-read-eml-file/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=5023</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-read-eml-file.jpg" class="webfeedsFeaturedVisual" /></p>Pythonを使ってメールファイルを読み込みたい！ このような方に向けて、拡張子.emlファイルの読み込み方をご紹介します。 eml ファイルとは、電子メールのメッセージを保存するためのファイル形式です。 ファイルの中に [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-read-eml-file.jpg" class="webfeedsFeaturedVisual" /></p>
<p class="is-style-crease wp-block-paragraph">Pythonを使ってメールファイルを読み込みたい！</p>



<p class="wp-block-paragraph">このような方に向けて、拡張子<code>.eml</code>ファイルの読み込み方をご紹介します。</p>



<p class="wp-block-paragraph">eml ファイルとは、電子メールのメッセージを保存するためのファイル形式です。</p>



<p class="wp-block-paragraph">ファイルの中には以下のような情報が含まれています。</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>.emlファイルの内容</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li>送信者情報</li>



<li>受信者情報</li>



<li>件名</li>



<li>本文</li>



<li>添付ファイル</li>
</ul>
</div></div>



<p class="wp-block-paragraph">Python には email という標準ライブラリが用意されていて、これを使えば eml ファイルを読み込むことができます。</p>



<h2 class="wp-block-heading">eml ファイルを読み込む方法</h2>



<p class="wp-block-paragraph">「eml ファイルを読み込む」ということを分解すると、次のようなステップに分けられます。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ol class="wp-block-list is-style-num_circle">
<li>eml ファイル全体を読み込む</li>



<li>送信者情報、件名などの要素を取得する</li>



<li>本文を取得する</li>
</ol>
</div></div>



<p class="wp-block-paragraph">それぞれ順番に解説していきます。</p>



<h3 class="wp-block-heading">1. eml ファイル全体を読み込む</h3>



<p class="wp-block-paragraph">まずは eml ファイルを、Python で扱えるオブジェクトとして読み込みます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>from email import policy
from email.parser import BytesParser

def read_email(eml_file_path):
    """
    emlファイルを読み込む
    """
    with open(eml_file_path, mode="rb") as f:
        msg = BytesParser(policy=policy.default).parse(f)
    return msg</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> email </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> policy</span></span>
<span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> email.parser </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> BytesParser</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">read_email</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">eml_file_path</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #CE9178">    emlファイルを読み込む</span></span>
<span class="line"><span style="color: #CE9178">    &quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">with</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">open</span><span style="color: #D4D4D4">(eml_file_path, </span><span style="color: #9CDCFE">mode</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;rb&quot;</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> f:</span></span>
<span class="line"><span style="color: #D4D4D4">        msg = BytesParser(</span><span style="color: #9CDCFE">policy</span><span style="color: #D4D4D4">=policy.default).parse(f)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> msg</span></span></code></pre></div>



<p class="wp-block-paragraph">この read_email() 関数の引数として、拡張子が .eml のファイルパスを渡してあげればパースできます。</p>



<p class="wp-block-paragraph">戻り値の msg は、Message オブジェクトです。</p>



<p class="wp-block-paragraph">アノテーションをつけるなら、以下のような書き方になります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>from email import policy
from email.message import Message
from email.parser import BytesParser

def read_email(eml_file_path: str) -> Message:
    """
    emlファイルを読み込む
    """
    with open(eml_file_path, mode="rb") as f:
        msg = BytesParser(policy=policy.default).parse(f)
    return msg</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> email </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> policy</span></span>
<span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> email.message </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> Message</span></span>
<span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> email.parser </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> BytesParser</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">read_email</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">eml_file_path</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">str</span><span style="color: #D4D4D4">) -&gt; Message:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #CE9178">    emlファイルを読み込む</span></span>
<span class="line"><span style="color: #CE9178">    &quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">with</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">open</span><span style="color: #D4D4D4">(eml_file_path, </span><span style="color: #9CDCFE">mode</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;rb&quot;</span><span style="color: #D4D4D4">) </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> f:</span></span>
<span class="line"><span style="color: #D4D4D4">        msg = BytesParser(</span><span style="color: #9CDCFE">policy</span><span style="color: #D4D4D4">=policy.default).parse(f)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> msg</span></span></code></pre></div>



<p class="is-style-icon_pen wp-block-paragraph">パースとは「ただのテキストファイル」を解析して、Python で認識可能なオブジェクトに変換することです。</p>



<h3 class="wp-block-heading">2. 送信者情報、件名などの要素を取得する</h3>



<p class="wp-block-paragraph">1. で取得した Message オブジェクトから、以下の情報を取得していきます。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>送信者メールアドレス</li>



<li>受信者メールアドレス</li>



<li>件名</li>



<li>CC</li>



<li>送信日時</li>



<li>メールごとに振られたユニークな識別子</li>
</ul>
</div></div>



<p class="wp-block-paragraph">Message オブジェクトは辞書のような方法でアクセスできます。</p>



<p class="wp-block-paragraph">取得例は以下の通り。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 送信者メールアドレス
from_ = msg.get("From", None)

# 受信者メールアドレス
to = msg.get("To", None)

# 件名
subject = msg.get("Subject", None)

# CC
cc = msg,get("CC", None)

# 送信日時
date = msg.get("Date", None)

# メールごとに振られたユニークな識別子
message_id = msg.get("Message-ID", None)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 送信者メールアドレス</span></span>
<span class="line"><span style="color: #D4D4D4">from_ = msg.get(</span><span style="color: #CE9178">&quot;From&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 受信者メールアドレス</span></span>
<span class="line"><span style="color: #D4D4D4">to = msg.get(</span><span style="color: #CE9178">&quot;To&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 件名</span></span>
<span class="line"><span style="color: #D4D4D4">subject = msg.get(</span><span style="color: #CE9178">&quot;Subject&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># CC</span></span>
<span class="line"><span style="color: #D4D4D4">cc = msg,get(</span><span style="color: #CE9178">&quot;CC&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 送信日時</span></span>
<span class="line"><span style="color: #D4D4D4">date = msg.get(</span><span style="color: #CE9178">&quot;Date&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># メールごとに振られたユニークな識別子</span></span>
<span class="line"><span style="color: #D4D4D4">message_id = msg.get(</span><span style="color: #CE9178">&quot;Message-ID&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">もちろん通常の辞書と同様<code>msg["From"]</code>のような形でも取り出せますが、上記では取得できなかったときのために<code>get()</code>メソッドに<code>None</code>を明示しておくことで、安全にアクセスできるようにしました。</p>



<p class="wp-block-paragraph">なお、メールアドレスはname&lt;sample@name.com&gt;の形式になることがあります。<br>これを「名前部分」と「純粋なメールアドレス部分」を分けて取得したい場合にはparseaddr()メソッドを使って分離しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>def divide_name_and_mailaddress(mailaddress):
    """
    フルメールアドレス, 純粋なメールアドレス部分を分ける
    """
    try:
        return [parseaddr(mailaddress)&#91;0&#93;, parseaddr(mailaddress)&#91;1&#93;]
    except Exception:
        return None</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">divide_name_and_mailaddress</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">mailaddress</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #CE9178">    フルメールアドレス, 純粋なメールアドレス部分を分ける</span></span>
<span class="line"><span style="color: #CE9178">    &quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">try</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> [parseaddr(mailaddress)&#91;</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">&#93;, parseaddr(mailaddress)&#91;</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">&#93;]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">except</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Exception</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">None</span></span></code></pre></div>



<p class="is-style-icon_info wp-block-paragraph">BCC は受信者側から見えないので、<code>msg["BCC"]</code>とすることはまずありません。</p>



<h3 class="wp-block-heading">3. 本文を取得する</h3>



<p class="wp-block-paragraph">本文の取得には、一工夫が必要です。</p>



<p class="wp-block-paragraph">大前提として、メールファイルには次の2種類があります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>シングルパート</li>



<li>マルチパート</li>
</ul>
</div></div>



<p class="wp-block-paragraph">それぞれ簡単に説明します。</p>



<p class="wp-block-paragraph">まずシングルパートは、ただのテキストだけからなるシンプルな構成のものです。</p>



<p class="wp-block-paragraph">一方のマルチパートは、テキストとHTMLが混在していたり、テキストの他に添付ファイルを含む場合にあたります。</p>



<p class="wp-block-paragraph">つまり色々なコンテンツがある場合にはマルチパート、単一のコンテンツのメールならシングルパートということになります。</p>



<p class="wp-block-paragraph">メール本文を読み込むには、マルチパートかシングルパートかを場合分けして処理する必要があるので、以下のように条件分岐を組んで取り出します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>def get_email_body(msg: Message) -> str:
    """
    メール本文を取得する
    """
    if msg.is_multipart():
        # マルチパートメールの場合
        # つまり、添付ありやHTML形式のメールの場合
        for part in msg.walk():
            # コンテントタイプを取得
            content_type = part.get_content_type()
            # Content-Dispositionヘッダの内容を取得する
            content_disposition = str(part.get("Content-Disposition"))

            if content_type == "text/plain" and "attachment" not in content_disposition:
                payload = part.get_payload(decode=True)
                detected = chardet.detect(payload)
                encoding = (
                    detected&#91;"encoding"&#93;
                    if detected&#91;"encoding"&#93; is not None
                    else "utf-8"
                )
                # エラーの場合は文字化けしてでも文字列を出力
                return payload.decode(encoding, errors="replace")
    else:
        # メールの内容を取得
        payload = msg.get_payload(decode=True)
        # エンコード方式を確認
        detected = chardet.detect(payload)
        # 得られたエンコード方式がnoneならutf-8を、そうでなければ得られたものを採用
        encoding = detected&#91;"encoding"&#93; if detected&#91;"encoding"&#93; is not None else "utf-8"
        # エラーの場合は文字化けしてでも文字列を出力
        return payload.decode(encoding, errors="replace")</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">get_email_body</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">msg</span><span style="color: #D4D4D4">: Message) -&gt; </span><span style="color: #4EC9B0">str</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #CE9178">    メール本文を取得する</span></span>
<span class="line"><span style="color: #CE9178">    &quot;&quot;&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> msg.is_multipart():</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># マルチパートメールの場合</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># つまり、添付ありやHTML形式のメールの場合</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> part </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> msg.walk():</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># コンテントタイプを取得</span></span>
<span class="line"><span style="color: #D4D4D4">            content_type = part.get_content_type()</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># Content-Dispositionヘッダの内容を取得する</span></span>
<span class="line"><span style="color: #D4D4D4">            content_disposition = </span><span style="color: #4EC9B0">str</span><span style="color: #D4D4D4">(part.get(</span><span style="color: #CE9178">&quot;Content-Disposition&quot;</span><span style="color: #D4D4D4">))</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> content_type == </span><span style="color: #CE9178">&quot;text/plain&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">and</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;attachment&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">not</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">in</span><span style="color: #D4D4D4"> content_disposition:</span></span>
<span class="line"><span style="color: #D4D4D4">                payload = part.get_payload(</span><span style="color: #9CDCFE">decode</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                detected = chardet.detect(payload)</span></span>
<span class="line"><span style="color: #D4D4D4">                encoding = (</span></span>
<span class="line"><span style="color: #D4D4D4">                    detected&#91;</span><span style="color: #CE9178">&quot;encoding&quot;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> detected&#91;</span><span style="color: #CE9178">&quot;encoding&quot;</span><span style="color: #D4D4D4">&#93; </span><span style="color: #569CD6">is</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">not</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">None</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;utf-8&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">                )</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #6A9955"># エラーの場合は文字化けしてでも文字列を出力</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> payload.decode(encoding, </span><span style="color: #9CDCFE">errors</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;replace&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># メールの内容を取得</span></span>
<span class="line"><span style="color: #D4D4D4">        payload = msg.get_payload(</span><span style="color: #9CDCFE">decode</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># エンコード方式を確認</span></span>
<span class="line"><span style="color: #D4D4D4">        detected = chardet.detect(payload)</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># 得られたエンコード方式がnoneならutf-8を、そうでなければ得られたものを採用</span></span>
<span class="line"><span style="color: #D4D4D4">        encoding = detected&#91;</span><span style="color: #CE9178">&quot;encoding&quot;</span><span style="color: #D4D4D4">&#93; </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> detected&#91;</span><span style="color: #CE9178">&quot;encoding&quot;</span><span style="color: #D4D4D4">&#93; </span><span style="color: #569CD6">is</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">not</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">None</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;utf-8&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># エラーの場合は文字化けしてでも文字列を出力</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> payload.decode(encoding, </span><span style="color: #9CDCFE">errors</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;replace&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">emlファイルから情報取得する流れは以下の通りです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ol class="wp-block-list is-style-num_circle">
<li>emlファイルをMessageオブジェクトとして取得する</li>



<li>欲しい情報を辞書のような形で取り出す</li>



<li>本文はマルチパート、シングルパート別に処理を変える</li>
</ol>
</div></div>



<p class="wp-block-paragraph">この流れをおさえた上で本記事の内容を参考にしていただければ、メールデータを簡単に取り出せるはずです。</p>



<p class="wp-block-paragraph">ご不明な点などありましたら、コメント欄にメッセージいただければご回答させていただきます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Visual Studio Code をMac OSにインストールする方法【おすすめの拡張機能つき】</title>
		<link>https://cfxlog.com/mac-vscode-setup/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[環境構築]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=5002</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-1.png" class="webfeedsFeaturedVisual" /></p>Visual Studio Code（以下「VSCode」）のインストール方法を知りたい人向けの記事です。 本記事ではVSCodeをインストールする２つの方法をご紹介します。 基本的には一つ目の「公式サイトからダウンロー [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-1.png" class="webfeedsFeaturedVisual" /></p>
<p class="wp-block-paragraph">Visual Studio Code（以下「VSCode」）のインストール方法を知りたい人向けの記事です。</p>



<p class="wp-block-paragraph">本記事ではVSCodeをインストールする２つの方法をご紹介します。</p>



<p class="wp-block-paragraph">基本的には一つ目の「公式サイトからダウンロードする方法」が推奨です。</p>



<p class="wp-block-paragraph">一方で、普段からターミナルよく使う方は「Homebrew を使った方法」をおすすめします。（慣れてる方からしたら、こちらの方が簡単なため）</p>



<p class="wp-block-paragraph">以下が目次になっているので、お好きな方をクリックして進んでください。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="green"><div class="c-balloon__icon -square"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://cfxlog.com/wp-content/uploads/2026/07/01-150x150-2.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://cfxlog.com/wp-content/uploads/2026/07/01-150x150-2.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">CFXLOG</span></div><div class="c-balloon__body -speaking -border-none"><div class="c-balloon__text">
<p>最後におすすめの拡張機能も紹介します。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">方法1: 公式サイトからダウンロードする方法</h2>



<p class="wp-block-paragraph">アプリを公式サイトからダウンロードしてきて、インストールする方法です。</p>



<p class="wp-block-paragraph">ターミナル操作に不安がある方は、この方法をお試しください。</p>



<h3 class="wp-block-heading">VSCodeのダウンロード</h3>



<p class="wp-block-paragraph">以下の公式ページにアクセスします。</p>



<p class="wp-block-paragraph"><a href="https://code.visualstudio.com/">» 参考：Visual Studio Code &#8211; Code Editing. Redefined</a></p>



<p class="wp-block-paragraph">時期によって多少は画面が違うかもしれませんが、下のような画面が表示されるはずです。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="516" src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-1-1.jpg" alt="" class="wp-image-5015" srcset="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-1-1.jpg 1024w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-1-1-300x151.jpg 300w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-1-1-768x387.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">「Download for macOS」という青いボタンをクリックしましょう。</p>



<p class="wp-block-paragraph">しばらくするとDownloadフォルダにzipファイルが表示されるので、ダブルクリックして解凍します。</p>



<p class="wp-block-paragraph">アイコン付きのものが、VSCode本体です。</p>



<p class="wp-block-paragraph">これを<strong>アプリケーションフォルダにドラッグ&amp;ドロップで移動</strong>させましょう。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="942" height="451" src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-2-1.png" alt="" class="wp-image-5016" srcset="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-2-1.png 942w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-2-1-300x144.png 300w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-2-1-768x368.png 768w" sizes="(max-width: 942px) 100vw, 942px" /></figure>



<p class="wp-block-paragraph">これでインストールは完了です。</p>



<h3 class="wp-block-heading" id="spotlight">VSCodeの起動方法</h3>



<p class="wp-block-paragraph">「コマンド（⌘） + スペース」を同時押しして、Spotlight を起動しましょう。</p>



<p class="wp-block-paragraph">そこに<code>visual</code>と入力すると、Visual Studio Codeが表示されます。</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="625" height="272" src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-3-1.png" alt="" class="wp-image-5017" style="width:750px;height:auto" srcset="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-3-1.png 625w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-3-1-300x131.png 300w" sizes="(max-width: 625px) 100vw, 625px" /></figure>



<p class="wp-block-paragraph">これを選んでEnterキーを押せば、VSCodeが立ち上がります。</p>



<h2 class="wp-block-heading">方法2: Homebrew を使った方法</h2>



<p class="wp-block-paragraph">コマンド実行でVSCodeをインストールすることも可能です。</p>



<p class="wp-block-paragraph">ダウンロードする方法に比べて楽に導入できるので、ターミナル操作に抵抗がない方はこちらがおすすめ。</p>



<h3 class="wp-block-heading">Homebrewをインストールする</h3>



<p class="wp-block-paragraph">最初にHomebrewがインストールされているか確認するため、次のコマンドを実行してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>~ % brew -v
zsh: command not found: brew</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">~ % brew -v</span></span>
<span class="line"><span style="color: #DCDCAA">zsh:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">command</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">not</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">found:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">brew</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>command not found: brew</code>と表示された場合は、Homebrewがまだ入っていません。</p>



<p class="is-style-bg_stripe wp-block-paragraph">※ バージョンが返ってきた方はインストールの必要がないため、<a href="#install-homebrew"><strong>こちら</strong></a>にお進みください。</p>



<p class="wp-block-paragraph">以下のコマンドでHomebrewをインストールしましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">/bin/bash</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-c</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;$(</span><span style="color: #DCDCAA">curl</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-fsSL</span><span style="color: #CE9178"> https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">しばらくすると、次のようなメッセージが表示されるはずです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>==> Next steps:
- Run these commands in your terminal to add Homebrew to your PATH:
    echo >> /Users/****/.zprofile
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/****/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh/</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">==&gt; </span><span style="color: #CE9178">Next</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">steps:</span></span>
<span class="line"><span style="color: #DCDCAA">-</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Run</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">these</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">commands</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">your</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">terminal</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Homebrew</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">your</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PATH:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #CE9178">/Users/</span><span style="color: #569CD6">****</span><span style="color: #CE9178">/.zprofile</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&apos;</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #CE9178">/Users/</span><span style="color: #569CD6">****</span><span style="color: #CE9178">/.zprofile</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;$(</span><span style="color: #DCDCAA">/opt/homebrew/bin/brew</span><span style="color: #CE9178"> shellenv)&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">-</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Run</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">brew</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">help</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">started</span></span>
<span class="line"><span style="color: #DCDCAA">-</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Further</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">documentation:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">https://docs.brew.sh/</span></span></code></pre></div>



<p class="wp-block-paragraph">つまり、Homebrewを正しく動作させるためにコマンドの実行を求めています。</p>



<p class="wp-block-paragraph">指示にある通り、ターミナルで次のコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>echo >> /Users/****/.zprofile
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/****/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #CE9178">/Users/</span><span style="color: #569CD6">****</span><span style="color: #CE9178">/.zprofile</span></span>
<span class="line"><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&apos;</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #CE9178">/Users/</span><span style="color: #569CD6">****</span><span style="color: #CE9178">/.zprofile</span></span>
<span class="line"><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;$(</span><span style="color: #DCDCAA">/opt/homebrew/bin/brew</span><span style="color: #CE9178"> shellenv)&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">※ 上記はユーザー名を差し替えているので、必ずターミナル上に表示されたコマンドをコピペして実行してください。</p>



<p class="wp-block-paragraph">最後に次のコマンドを実行して、バージョンが戻ってくれば成功です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>~ % brew -v      
# Homebrew 4.4.0</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">~ % brew -v      </span></span>
<span class="line"><span style="color: #6A9955"># Homebrew 4.4.0</span></span></code></pre></div>



<h3 class="wp-block-heading" id="install-homebrew">VSCodeのインストール</h3>



<p class="wp-block-paragraph">あとは次のコマンドを実行するだけです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>brew install --cask visual-studio-code</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">brew</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--cask</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">visual-studio-code</span></span></code></pre></div>



<p class="wp-block-paragraph">コマンド実行後、successfully installed! と表示されるまで待ちましょう。</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="538" src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-4-1.jpg" alt="" class="wp-image-5018" srcset="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-4-1.jpg 1024w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-4-1-300x158.jpg 300w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-4-1-768x404.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">公式サイトからのダウンロードに比べて、格段にラクです。</p>



<h3 class="wp-block-heading">VSCodeの起動方法</h3>



<p class="wp-block-paragraph">起動方法は、ターミナルで以下のコマンドを実行するだけです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>code</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">code</span></span></code></pre></div>



<p class="wp-block-paragraph">特定のフォルダを開きたい場合は、引数として開きたい階層のパスを指定します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>code .</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">code</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span></span></code></pre></div>



<p class="wp-block-paragraph">上記の場合は引数を<code>.</code>にしたので、カレントディレクトリを開きます。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="green"><div class="c-balloon__icon -square"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://cfxlog.com/wp-content/uploads/2026/07/01-150x150-2.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://cfxlog.com/wp-content/uploads/2026/07/01-150x150-2.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">CFXLOG</span></div><div class="c-balloon__body -speaking -border-none"><div class="c-balloon__text">
<p>もちろん上で紹介したような<a href="#spotlight"><strong>通常の起動方法</strong></a>でも可能です！</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">最初に入れるべき拡張機能２選</h2>



<p class="wp-block-paragraph">最近のVSCodeはデフォルト機能がかなり充実しているので、必要な拡張機能はそう多くありません。</p>



<p class="wp-block-paragraph">ここではVSCodeインストールと同時に導入したい拡張機能をご紹介します。</p>



<p class="is-style-icon_announce wp-block-paragraph">インストールには、各拡張機能の最後に設置したリンクをクリックしてください。<br>ページ内の緑色のInstallボタンを押すとVSCodeで拡張機能が開くので、そこでInstallボタンを押します。</p>



<h3 class="wp-block-heading">Japanese Language Pack for Visual Studio Code</h3>



<figure class="wp-block-image size-full is-style-border"><img decoding="async" width="936" height="263" src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-5-2.png" alt="" class="wp-image-5019" srcset="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-5-2.png 936w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-5-2-300x84.png 300w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-5-2-768x216.png 768w" sizes="(max-width: 936px) 100vw, 936px" /></figure>



<p class="wp-block-paragraph">VSCodeはデフォルトで英語です。</p>



<p class="wp-block-paragraph">日本語化したい場合には、この拡張機能を入れましょう。</p>



<p class="wp-block-paragraph">microsoftが公式に提供しているので安心して使えます。</p>



<p class="is-style-bg_stripe wp-block-paragraph"><a href="https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja"><strong>» インストールはこちら：Japanese Language Pack for Visual Studio Code</strong></a></p>



<h3 class="wp-block-heading">Rainbow CSV</h3>



<figure class="wp-block-image size-full is-style-border"><img decoding="async" width="925" height="263" src="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-6-1.png" alt="" class="wp-image-5020" srcset="https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-6-1.png 925w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-6-1-300x85.png 300w, https://cfxlog.com/wp-content/uploads/2026/03/mac-vscode-setup-6-1-768x218.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></figure>



<p class="wp-block-paragraph">CSVを列ごとに色分けしてくれます。</p>



<p class="wp-block-paragraph">VSCodeではCSVを表示するときに、Excelのように表形式になりません。</p>



<p class="wp-block-paragraph">生のCSVを編集するときなど、どの列を編集しているか分かりやすくなるので便利です。</p>



<p class="is-style-bg_stripe wp-block-paragraph"><a href="https://marketplace.visualstudio.com/items?itemName=mechatroner.rainbow-csv"><strong>» インストールはこちら：Rainbow CSV</strong></a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">VSCodeのインストール方法をご紹介しました。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>公式サイトからダウンロードする方法</li>



<li>Homebrewを使ってインストールする方法</li>
</ul>
</div></div>



<p class="wp-block-paragraph">どちらを選んでも結果は同じなので、お好みの方を選んでください。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【配布用】Python スクリプトを実行ファイル化する PyInstaller を徹底解説！</title>
		<link>https://cfxlog.com/python-pyinstaller-guide/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Tue, 10 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=4998</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-pyinstaller-guide.jpg" class="webfeedsFeaturedVisual" /></p>このような方に向けて書きました。 頑張って開発したアプリケーションを他の人に使っていただくときに、通常のアプリケーションのようにダブルクリックで起動する「実行ファイル」にしておくと親切です。 Pyhthon の実行ファイ [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-pyinstaller-guide.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>Python で書いたスクリプトを配布したい！</li>
</ul>
</div></div>



<p class="wp-block-paragraph">このような方に向けて書きました。</p>



<p class="wp-block-paragraph">頑張って開発したアプリケーションを他の人に使っていただくときに、通常のアプリケーションのようにダブルクリックで起動する「実行ファイル」にしておくと親切です。</p>



<p class="wp-block-paragraph">Pyhthon の実行ファイル化ツールで最も利用されているのは PyInstaller です。</p>



<p class="wp-block-paragraph">初見ではオプションの指定方法や<code>.spec</code>ファイルの書き方など、なかなか理解できない箇所も多くあります。</p>



<p class="wp-block-paragraph">本記事では「これから PyInstaller で実行ファイル化したい！」という方に向けて、必要な知識や実行ファイル化の手順をわかりやすく解説します。</p>



<h2 class="wp-block-heading">PyInstaller の概要を解説</h2>



<p class="wp-block-paragraph">まずは、PyInstaller を使うために必要な前提知識からご紹介します。</p>



<h3 class="wp-block-heading"> PyInstallerの概要</h3>



<p class="wp-block-paragraph">PyInstaller は Python プログラムを「実行ファイル」に変換するツールです。</p>



<p class="wp-block-paragraph">Windows, Mac, Linux に対応しています。</p>



<p class="wp-block-paragraph">詳しくは後述しますが、<code>.spec</code>ファイルでビルドする際の挙動を調整できたり、細かい設定が効くので、配布用に変換するには絶好のツールです。</p>



<p class="wp-block-paragraph">ただし、出力される実行ファイルの容量は大きくなりがちなのがデメリットではあります。</p>



<h3 class="wp-block-heading">他のパッケージングツールと比較</h3>



<p class="wp-block-paragraph">他のパッケージングツールとの比較を表にまとめました。</p>



<figure class="wp-block-table"><table><thead><tr><th>ツール名</th><th>単一ファイル化</th><th>クロスプラットフォーム</th><th>ファイルサイズ</th><th>ビルド時間</th></tr></thead><tbody><tr><th>PyInstaller</th><td>○</td><td>○</td><td>×</td><td>△</td></tr><tr><th>py2exe</th><td>×</td><td>×（Winのみ）</td><td>△</td><td>○</td></tr><tr><th>cx_Freeze</th><td>×</td><td>○</td><td>×</td><td>○</td></tr><tr><th>py2app</th><td>×</td><td>×（Macのみ）</td><td>△</td><td>○</td></tr><tr><th>nuitka</th><td>○</td><td>○</td><td>○</td><td>×</td></tr></tbody></table><figcaption class="wp-element-caption">パッケージングツール比較</figcaption></figure>



<p class="wp-block-paragraph">海外では<code>nuitka</code>が使われることも多いようですが、設定が複雑なのでちょっと使いづらかったです。</p>



<p class="wp-block-paragraph">やっぱり<code>PyInstaller</code>が総合してバランスが取れていると思います。</p>



<h3 class="wp-block-heading">実行ファイルの構成</h3>



<p class="wp-block-paragraph">PyInstaller 実行後には、以下が出力されます。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>dist/</strong>: 実行ファイルを格納</li>



<li><strong>build/</strong>: ビルドの一時ファイルを格納</li>



<li><strong>myscript.spec</strong>: ビルド内容に関する設定ファイル</li>
</ul>
</div></div>



<p class="wp-block-paragraph">具体的には以下のような構成です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Plaintext</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>my_project/
├── my_script.py
├── my_script.spec
├── build/
│   └── my_script/
│       ├── base_library.zip
│       ├── my_script.exe.manifest
│       ├── my_script.exe.pyi
│       ├── warn-my_script.txt
│       └── &lt;その他の中間ファイル>
└── dist/
    └── my_script/
        ├── my_script.exe
        ├── &lt;依存ファイル1>
        ├── &lt;依存ファイル2>
        └── &lt;その他の依存ファイル></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">my_project/</span></span>
<span class="line"><span style="color: #D4D4D4">├── my_script.py</span></span>
<span class="line"><span style="color: #D4D4D4">├── my_script.spec</span></span>
<span class="line"><span style="color: #D4D4D4">├── build/</span></span>
<span class="line"><span style="color: #D4D4D4">│   └── my_script/</span></span>
<span class="line"><span style="color: #D4D4D4">│       ├── base_library.zip</span></span>
<span class="line"><span style="color: #D4D4D4">│       ├── my_script.exe.manifest</span></span>
<span class="line"><span style="color: #D4D4D4">│       ├── my_script.exe.pyi</span></span>
<span class="line"><span style="color: #D4D4D4">│       ├── warn-my_script.txt</span></span>
<span class="line"><span style="color: #D4D4D4">│       └── &lt;その他の中間ファイル&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">└── dist/</span></span>
<span class="line"><span style="color: #D4D4D4">    └── my_script/</span></span>
<span class="line"><span style="color: #D4D4D4">        ├── my_script.exe</span></span>
<span class="line"><span style="color: #D4D4D4">        ├── &lt;依存ファイル1&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        ├── &lt;依存ファイル2&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        └── &lt;その他の依存ファイル&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>.spec</code>ファイルについては、<a href="#build-by-spec">本記事の後半</a>で詳しく解説します。</p>



<h2 class="wp-block-heading">PyInstaller で実行ファイル化するまでの流れ</h2>



<p class="wp-block-paragraph">PyInstaller は Python プログラムをスタンドアロンの実行可能なファイル（.exe、.appなど）に変換するツールです。実行ファイル化には、以下の手順で行います。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li>インストール</li>



<li>Python スクリプトを用意する</li>



<li>PyInstaller の実行</li>
</ul>
</div></div>



<p class="wp-block-paragraph">順番に解説します。</p>



<h3 class="wp-block-heading">インストール</h3>



<p class="wp-block-paragraph">まずはお使いの環境に Python がインストールされているか確認します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>python --version

# 結果
# Python 3.11.7</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">python</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--version</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 結果</span></span>
<span class="line"><span style="color: #6A9955"># Python 3.11.7</span></span></code></pre></div>



<p class="wp-block-paragraph">バージョンが帰ってくれば、Python がインストールされているということなので次に進みましょう。</p>



<p class="wp-block-paragraph">続いて、PyInstaller のインストールをします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pip install pyinstaller</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pyinstaller</span></span></code></pre></div>



<p class="wp-block-paragraph">念の為以下のコマンドで、正常にPyInstaller がインストールされたか確認しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller --version

# 結果
# 6.6.0</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--version</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 結果</span></span>
<span class="line"><span style="color: #6A9955"># 6.6.0</span></span></code></pre></div>



<p class="wp-block-paragraph">バージョンが返ってくればインストールは成功です！</p>



<h3 class="wp-block-heading">Python スクリプトを用意する</h3>



<p class="wp-block-paragraph">ごく簡単なスクリプトとして<code>myscript.py</code>を作ります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>print("hello, world")</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;hello, world&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">次の手順で、このスクリプトを実行ファイル化していきます。</p>



<h3 class="wp-block-heading">PyInstaller の実行</h3>



<p class="wp-block-paragraph">コマンドラインから、以下のコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller myscript.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">myscript.py</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>dist</code>フォルダと<code>build</code>フォルダが作成されて、<code>dist</code>フォルダ内に実行ファイルが生成されます。</p>



<p class="wp-block-paragraph">ちなみにコマンドにはオプションを設定することができます。</p>



<figure class="wp-block-table"><table><thead><tr><th>オプション</th><th>内容</th></tr></thead><tbody><tr><td><code>--onefile</code></td><td>単一の実行ファイルにまとめる</td></tr><tr><td><code>--noconsole</code></td><td>コンソールウィンドウを表示しない</td></tr><tr><td><code>--icon</code></td><td>実行ファイルのアイコンを指定する</td></tr><tr><td><code>--clean</code></td><td>キャッシュを削除する</td></tr></tbody></table><figcaption class="wp-element-caption">オプションの説明</figcaption></figure>



<p class="wp-block-paragraph">上記のオプションを使った場合のコマンド例はこちら。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller --onefile --noconsole --icon=my_icon.ico --clean myscript.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--onefile</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--noconsole</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--icon=my_icon.ico</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--clean</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">myscript.py</span></span></code></pre></div>



<p class="wp-block-paragraph">その他のオプションについては、公式ドキュメントをご参照ください。</p>



<p class="wp-block-paragraph"><a href="https://pyinstaller.org/en/stable/usage.html#options">» 参考：Using Pyinstaller &#8211; Options</a></p>



<h3 class="wp-block-heading">実行方法</h3>



<p class="wp-block-paragraph"><code>dist</code>フォルダ内に生成された実行可能ファイルを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>./dist/myscript</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">./dist/myscript</span></span></code></pre></div>



<p class="wp-block-paragraph">これで先ほどの<code>myscript</code>が実行され、<code>Hello, World!</code>の文字列が表示されるようになります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>Hello, World!

Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.

&#91;プロセスが完了しました&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">Hello,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">World!</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">Saving</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">session...</span></span>
<span class="line"><span style="color: #DCDCAA">..</span><span style="color: #D4D4D4">.copying </span><span style="color: #CE9178">shared</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">history...</span></span>
<span class="line"><span style="color: #DCDCAA">..</span><span style="color: #D4D4D4">.saving </span><span style="color: #CE9178">history...truncating</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">history</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">files...</span></span>
<span class="line"><span style="color: #DCDCAA">..</span><span style="color: #D4D4D4">.completed.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;プロセスが完了しました&#93;</span></span></code></pre></div>



<p class="wp-block-paragraph">今回の場合にはコンソール上に<code>print()</code>するだけなので、実行ファイル化する際には<code>--noconsole</code>を入れないようにしましょう。</p>



<p class="wp-block-paragraph">入れてしまうと<code>print()</code>関数の結果が見られないためです。</p>



<h2 class="wp-block-heading" id="build-by-spec">spec ファイルを使ったビルド</h2>



<p class="wp-block-paragraph">PyInstaller では<code>--noconsole</code>などのオプションをつけてビルドを行うものが主流ですが、<code>.spec</code>ファイルでビルド内容を定義することができます。</p>



<p class="wp-block-paragraph">メリットは次のとおり。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>複雑な設定の管理</li>



<li>再利用性が向上</li>



<li>バージョン管理できる</li>
</ul>
</div></div>



<p class="wp-block-paragraph">何度もオプションを書いてビルドし直す、という面倒な作業がなくなります。</p>



<p class="wp-block-paragraph">以下、詳細を見ていきましょう。</p>



<h3 class="wp-block-heading">spec ファイルの生成方法</h3>



<p class="wp-block-paragraph"><code>.spec</code>ファイルは、通常のビルドコマンドを実行すると生成されます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller myscript.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">myscript.py</span></span></code></pre></div>



<p class="wp-block-paragraph">myscript.specというファイルが出力されるので、内容を確認していきましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(
    &#91;'myscript.py'&#93;,
    pathex=&#91;'/path/to/your/script'&#93;,
    binaries=[],
    datas=[],
    hiddenimports=[],
    hookspath=[],
    runtime_hooks=[],
    excludes=[],
    win_no_prefer_redirects=False,
    win_private_assemblies=False,
    cipher=block_cipher,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='myscript',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
)
coll = COLLECT(
    exe,
    a.binaries,
    a.zipfiles,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='myscript',
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># -*- mode: python ; coding: utf-8 -*-</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">block_cipher</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">None</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Analysis</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    &#91;</span><span style="color: #CE9178">&apos;myscript.py&apos;</span><span style="color: #D4D4D4">&#93;</span><span style="color: #DCDCAA">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">pathex</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;&apos;/path/to/your/script&apos;&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">datas</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hiddenimports</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hookspath</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runtime_hooks</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">excludes</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">win_no_prefer_redirects</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">win_private_assemblies</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">cipher</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">block_cipher,</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #DCDCAA">pyz</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PYZ</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">a.pure,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">a.zipped_data,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">cipher=block_cipher</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">exe</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">EXE</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">pyz,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.scripts,</span></span>
<span class="line"><span style="color: #D4D4D4">    []</span><span style="color: #DCDCAA">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exclude_binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">debug</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">bootloader_ignore_signals</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">strip</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx_exclude</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runtime_tmpdir</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">None,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #DCDCAA">coll</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">COLLECT</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">exe,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.binaries,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.zipfiles,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.datas,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">strip</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx_exclude</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading">specファイルを使ったビルド</h3>



<p class="wp-block-paragraph"><code>.spec</code>ファイルを使ってビルドする場合には、以下のコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller myscript.spec</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">myscript.spec</span></span></code></pre></div>



<p class="wp-block-paragraph">これで<code>.spec</code>ファイルの内容をもとに実行ファイルが出力されます。</p>



<h3 class="wp-block-heading">.spec ファイルのカスタマイズ</h3>



<p class="wp-block-paragraph"><code>.spec</code>ファイルをカスタマイズして、ビルドの内容を変更する方法をご紹介します。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li>単一ファイル出力</li>



<li>コンソールの非表示</li>



<li>アイコンの設定</li>
</ul>
</div></div>



<h4 class="wp-block-heading">単一ファイル出力</h4>



<p class="wp-block-paragraph"><code>onefile</code>オプションのように、単一ファイル出力する方法です。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li><code>EXE</code>関数の<code>exclude_binaries</code>を<code>True</code></li>



<li><code>COLLECT</code>ステップを削除</li>
</ul>
</div></div>



<p class="wp-block-paragraph">以下のように、<code>.spec</code>ファイルを編集します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>exe = EXE(
    ・・・
    exclude_binaries=True,  # onefileオプション
    ・・・
)

# onefileのためにCOLLECTステップを削除</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">exe</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">EXE</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">・・・</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exclude_binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># onefileオプション</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">・・・</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># onefileのためにCOLLECTステップを削除</span></span></code></pre></div>



<p class="wp-block-paragraph">仮に<code>exclude_binaries=False</code>とした場合、アプリの受付部分にあたる「実行ファイル」と実際のロジックを担当する「バイナリ」に分割されます。</p>



<p class="wp-block-paragraph">分割することで「各ファイルを独立して管理」できたり「ビルド時間やファイルサイズが小さくなる」というメリットもあります。</p>



<p class="wp-block-paragraph">ただし、配布時にはわかりやすさ重視で<code>onefile</code>オプションをつけることのほうが多いです。</p>



<h4 class="wp-block-heading">コンソールの非表示</h4>



<p class="wp-block-paragraph"><code>--noconsole</code>オプションと同じ設定を行います。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='myscript',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=False,  # noconsole オプション
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">exe</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">EXE</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">pyz,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.scripts,</span></span>
<span class="line"><span style="color: #D4D4D4">    []</span><span style="color: #DCDCAA">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exclude_binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">debug</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">bootloader_ignore_signals</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">strip</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx_exclude</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runtime_tmpdir</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">None,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># noconsole オプション</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">これでコンソールが非表示になります。GUIアプリなどはこの設定が良いです。</p>



<p class="wp-block-paragraph">逆に、あえてコンソールを表示させたい場合には<code>console=True</code>を指定しましょう。</p>



<h4 class="wp-block-heading">アイコンの設定</h4>



<p class="wp-block-paragraph"><code>EXE</code>セクションで<code>icon</code>パラメータを追加します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='myscript',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    upx_exclude=[],
    runtime_tmpdir=None,
    console=True,
    icon='path/to/icon.ico'
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">exe</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">EXE</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">pyz,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.scripts,</span></span>
<span class="line"><span style="color: #D4D4D4">    []</span><span style="color: #DCDCAA">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exclude_binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">debug</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">bootloader_ignore_signals</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">strip</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx_exclude</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runtime_tmpdir</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">None,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">icon</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;path/to/icon.ico&apos;</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h2 class="wp-block-heading">デバッグとトラブルシューティングの方法</h2>



<p class="wp-block-paragraph">PyInstaller でよくあるエラーと対処法をご紹介します。</p>



<p class="wp-block-paragraph">また、実行ファイル化後のトラブルについても具体的な対策に触れていきましょう。</p>



<h3 class="wp-block-heading">ModuleNotFoundError</h3>



<p class="wp-block-paragraph">モジュールがビルド対象から外れてしまった場合に表示されるエラーです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ModuleNotFoundError: No module named 'some_module'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ModuleNotFoundError:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">No</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">module</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">named</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;some_module&apos;</span></span></code></pre></div>



<p class="wp-block-paragraph">この場合、<code>.spec</code>ファイルの<code>hiddenimports</code>にモジュールを追加します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># .specファイルの編集
a = Analysis(&#91;'my_script.py'&#93;,
             pathex=&#91;'/path/to/my_project'&#93;,
             hiddenimports=&#91;'some_module'&#93;,  # 見つからなかったモジュールを指定
             ...)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># .specファイルの編集</span></span>
<span class="line"><span style="color: #DCDCAA">a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Analysis</span><span style="color: #D4D4D4">(&#91;</span><span style="color: #CE9178">&apos;my_script.py&apos;</span><span style="color: #D4D4D4">&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">pathex</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;&apos;/path/to/my_project&apos;&#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">hiddenimports</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;&apos;some_module&apos;&#93;,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 見つからなかったモジュールを指定</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #DCDCAA">...</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading">ImportError</h3>



<p class="wp-block-paragraph">外部ライブラリのインポートに失敗した場合のエラーです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ImportError: DLL load failed: The specified module could not be found.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ImportError:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DLL</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">load</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">failed:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">The</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">specified</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">module</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">could</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">not</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">be</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">found.</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>.spec</code>ファイルの<code>binaries</code>にライブラリのパスを追加します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># .specファイルの編集
binaries=&#91;('path/to/dll_or_shared_library', '.')&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># .specファイルの編集</span></span>
<span class="line"><span style="color: #9CDCFE">binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&apos;path/to/dll_or_shared_library&apos;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;.&apos;</span><span style="color: #D4D4D4">)</span><span style="color: #CE9178">&#93;</span></span></code></pre></div>



<h3 class="wp-block-heading">FileNotFoundError</h3>



<p class="wp-block-paragraph">指定されたファイルパスが間違っている場合のエラーです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>FileNotFoundError: &#91;Errno 2&#93; No such file or directory: 'some_file'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">FileNotFoundError:</span><span style="color: #D4D4D4"> &#91;Errno </span><span style="color: #B5CEA8">2</span><span style="color: #CE9178">&#93;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">No</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">such</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">file</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">or</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">directory:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;some_file&apos;</span></span></code></pre></div>



<p class="wp-block-paragraph">datasにデータファイルの絶対パスを追加します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># .specファイルの編集
datas=&#91;('path/to/datafile', 'destination_directory')&#93;</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># .specファイルの編集</span></span>
<span class="line"><span style="color: #9CDCFE">datas</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&apos;path/to/datafile&apos;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&apos;destination_directory&apos;</span><span style="color: #D4D4D4">)</span><span style="color: #CE9178">&#93;</span></span></code></pre></div>



<h3 class="wp-block-heading">デバッグモードの使用</h3>



<p class="wp-block-paragraph">PyInstaller のデバッグモードを使うことで、詳細なログを見ることができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller --onefile --debug=all my_script.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--onefile</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--debug=all</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">my_script.py</span></span></code></pre></div>



<p class="wp-block-paragraph">デバッグモードには二種類あります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><code>all</code>: すべてのデバッグ情報を有効にします。</li>



<li><code>noarchive</code>: アーカイブファイルを生成せず、すべてのファイルを展開された状態で保持します。これにより、ファイルの読み込みエラーを容易に特定できます。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">これにより、コンソール上に詳細なログが表示されるようになります。</p>



<p class="wp-block-paragraph">どこで問題が起きたかがわかるので、とても便利です。</p>



<h3 class="wp-block-heading">Python スクリプト内でログ出力する</h3>



<p class="wp-block-paragraph">アプリケーション実行中のエラーは、スクリプト内にログ出力するようにすることでも対応できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug("This is a debug message")</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">logging.basicConfig(</span><span style="color: #9CDCFE">level</span><span style="color: #D4D4D4">=logging.DEBUG)</span></span>
<span class="line"><span style="color: #D4D4D4">logging.debug(</span><span style="color: #CE9178">&quot;This is a debug message&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">※ ログ出力の方法については、後日別記事でご紹介する予定です。</p>



<h2 class="wp-block-heading">【アドバンス】PyInstaller が行う処理の流れ</h2>



<p class="wp-block-paragraph"><code>spec</code>ファイルを読み前提知識として、PyInstaller の処理の流れを理解しておきましょう。</p>



<p class="wp-block-paragraph">以下の順番で処理が流れていき、実行ファイルが生成されます。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li>ファイルを分析</li>



<li>PYZ オブジェクトを作成</li>



<li>EXE オブジェクトを作成</li>



<li>すべてのファイルを統合</li>
</ul>
</div></div>



<p class="wp-block-paragraph">順番に解説していきます。</p>



<h3 class="wp-block-heading">ファイルを分析</h3>



<p class="wp-block-paragraph">実行ファイル化したい Python スクリプトを含む、すべてのファイルを調べるフェーズです。</p>



<p class="wp-block-paragraph"><code>.spec</code>ファイルでは、<code>Analysis</code>オブジェクトとして表現されてます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>a = Analysis(
    &#91;'myscript.py'&#93;,  # 対象の Python スクリプト名
    pathex=&#91;'/path/to/your/script'&#93;,  # スクリプトのパスを指定
    binaries=[],  # 追加のバイナリファイル(DLL, SOファイル)
    datas=[],  # 追加のデータファイル(画像、設定ファイルなど)
    hiddenimports=[],  # PyInstaller が自動検出できないモジュールのリスト
    hookspath=[],  # カスタムフックファイル
    runtime_hooks=[],  # アプリ実行時に実行されるスクリプトのリスト
    excludes=[],  # PyInstaller に含めないモジュールリスト
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Analysis</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    &#91;</span><span style="color: #CE9178">&apos;myscript.py&apos;</span><span style="color: #D4D4D4">&#93;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 対象の Python スクリプト名</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">pathex</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;&apos;/path/to/your/script&apos;&#93;,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># スクリプトのパスを指定</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 追加のバイナリファイル(DLL, SOファイル)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">datas</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 追加のデータファイル(画像、設定ファイルなど)</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hiddenimports</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># PyInstaller が自動検出できないモジュールのリスト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hookspath</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># カスタムフックファイル</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">runtime_hooks</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># アプリ実行時に実行されるスクリプトのリスト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">excludes</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">[],</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># PyInstaller に含めないモジュールリスト</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">この場合には、<code>/path/to/your/script</code>から<code>myscript.py</code>を探して、これを実行ファイル化します。</p>



<p class="is-style-icon_announce wp-block-paragraph">複数のスクリプトで構築した場合には、最初に指定したスクリプトが最初に実行されるエントリーポイントになります。</p>



<h3 class="wp-block-heading">PYZ オブジェクトを作成</h3>



<p class="wp-block-paragraph">続いては、Analysis で対象とされた Python ファイルをアーカイブにまとめます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyz = PYZ(a.pure, a.zipped_data)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyz</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PYZ</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">a.pure,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">a.zipped_data</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>a.pure</code>は<code>Analysis</code>で取得された純粋な Python スクリプトのリストです。</p>



<p class="wp-block-paragraph"><code>a.zipped_data</code>はそれ以外のファイル群で、Python モジュールが依存している圧縮ファイルなどが指定されます。</p>



<p class="is-style-icon_announce wp-block-paragraph">いずれにせよ<code>PYZ</code>オブジェクトは PyInstaller のビルド時に自動的に出力されるものなので、手動でいじることはほとんどないです。</p>



<h3 class="wp-block-heading">EXE オブジェクトを作成</h3>



<p class="wp-block-paragraph">実際の実行ファイルを作成するステップです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>exe = EXE(
    pyz,  # 一つ前のステップで作成した PYZ オブジェクト
    a.scripts,  # Analysis オブジェクトで解析されたスクリプト
    [],  # 追加の Python スクリプトを指定する場合に必要
    exclude_binaries=False,  # バイナリと実行ファイルを分離しない
    name='myscript',  # 実行ファイルの名前
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">exe</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">EXE</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">pyz,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 一つ前のステップで作成した PYZ オブジェクト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.scripts,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># Analysis オブジェクトで解析されたスクリプト</span></span>
<span class="line"><span style="color: #D4D4D4">    []</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 追加の Python スクリプトを指定する場合に必要</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exclude_binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># バイナリと実行ファイルを分離しない</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 実行ファイルの名前</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h3 class="wp-block-heading">すべてのファイルを統合</h3>



<p class="wp-block-paragraph"><code>COLLECT</code>では、<code>Analysis</code>と<code>EXE</code>をまとめて「最終的なディレクトリ構造」を作成します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>coll = COLLECT(
    exe,  # 先に作成したEXEオブジェクト
    a.binaries,  # 解析されたバイナリのリスト
    a.zipfiles,  # 解析された圧縮ファイルのリスト
    a.datas,  # 解析されたエータファイルのリスト
    strip=False,  # デバッグ情報等を含めない
    upx=True,  # True にすると UPX で圧縮
    name='myscript',  # 出力ディレクトリ名を指定
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">coll</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">COLLECT</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">exe,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 先に作成したEXEオブジェクト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.binaries,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 解析されたバイナリのリスト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.zipfiles,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 解析された圧縮ファイルのリスト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.datas,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 解析されたエータファイルのリスト</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">strip</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">False,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># デバッグ情報等を含めない</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">upx</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># True にすると UPX で圧縮</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># 出力ディレクトリ名を指定</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>onefile</code>オプションをつけた場合には、<code>COLLECT</code>ステップがありません。</p>



<p class="wp-block-paragraph">そのため、<code>EXE</code>には以下のようになっているはずです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,  # これがonefileに相当
    name='myscript',
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">exe</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">EXE</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">pyz,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">a.scripts,</span></span>
<span class="line"><span style="color: #D4D4D4">    []</span><span style="color: #DCDCAA">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">exclude_binaries</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">True,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># これがonefileに相当</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;myscript&apos;,</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<h2 class="wp-block-heading">補足：こんなときにどうする？</h2>



<p class="wp-block-paragraph">PyInstallerを使っていると、たまに問題に出くわすことがあります。</p>



<p class="wp-block-paragraph">このセクションでは、Q＆A形式でお答えしていきます。</p>



<div class="wp-block-group has-border -border04"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<dl class="swell-block-faq is-style-faq-border" data-q="fill-custom" data-a="fill-custom">
<div class="swell-block-faq__item"><dt class="faq_q">インポートしたはずのモジュールがなぜかビルドされていない<br></dt><dd class="faq_a">
<p class="wp-block-paragraph">通常はインポートされたモジュールも一緒にビルドされますが、PyInstaller が自動的に認識できない場合もあります。</p>



<p class="wp-block-paragraph">このような場合には、追加されないモジュールを明示します。</p>



<p class="wp-block-paragraph"><code>.spec</code>ファイルで指定する場合には、以下になります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>a = Analysis(
    ・・・
    hiddenimports=&#91;'module1', 'module2'&#93;,  # ここに隠しインポートを追加
    ・・・
)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Analysis</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">・・・</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">hiddenimports</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&#91;&apos;module1&apos;,</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">&apos;module2&apos;</span><span style="color: #DCDCAA">&#93;,</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955"># ここに隠しインポートを追加</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">・・・</span></span>
<span class="line"><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">オプションで指定するなら、以下です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pyinstaller --hidden-import=module1 --hidden-import=module2 myscript.py</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pyinstaller</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--hidden-import=module1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--hidden-import=module2</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">myscript.py</span></span></code></pre></div>



<p class="wp-block-paragraph">これで、PyInstaller の解析で拾いきれなかったモジュールもビルド対象に含まれます。</p>
</dd></div>



<div class="swell-block-faq__item"><dt class="faq_q">セキュリティ対策はどうしたら良い？</dt><dd class="faq_a">
<p class="wp-block-paragraph">PyInstaller でできるセキュリティ対策には、例えば以下があります。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li>UPX圧縮の使用</li>



<li>難読化ツールの使用</li>



<li>機密情報は環境変数から読み込む</li>
</ul>
</div></div>



<p class="wp-block-paragraph">UPX圧縮については<code>.spec</code>ファイルの<code>EXE</code>で指定できます。これによって一応は解析が難しくなりますが、万全な対策ではありません。</p>



<p class="wp-block-paragraph">より高度な難読化については、<code>PyArmor</code>や<code>PyObfuscate</code>を検討してみてください。</p>



<p class="wp-block-paragraph">また機密情報を含めると漏洩リスクがあるので、以下のように環境変数から読むと安全性が高まります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import os
api_key = os.getenv("API_KEY")</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> os</span></span>
<span class="line"><span style="color: #D4D4D4">api_key = os.getenv(</span><span style="color: #CE9178">&quot;API_KEY&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>
</dd></div>
</dl>
</div></div>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">PuInstaller は、以下の内容を理解しておくと全体像が把握しやすいです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>処理の流れ（Analysis =&gt; PYZ =&gt; EXE =&gt; COL）</li>



<li><code>.spec</code>ファイルの内容理解</li>



<li>デバッグの方法</li>



<li>他のOSに配布する際のテクニック</li>
</ul>
</div></div>



<p class="wp-block-paragraph">ぜひ、参考にしてみてください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Python】requests ライブラリの使い方【Web API アクセス】</title>
		<link>https://cfxlog.com/python-requests-guide/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[API連携]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=4992</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-requests-guide.jpg" class="webfeedsFeaturedVisual" /></p>requests ライブラリの役割は、HTTP リクエストを行うことです。 つまり Python を使って Web 上から自由に情報取得できるようになるので、プログラムに実装できる機能の幅が一気に広がります。 本記事では [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-requests-guide.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>Web API から情報取得したい</li>
</ul>
</div></div>



<p class="wp-block-paragraph">requests ライブラリの役割は、HTTP リクエストを行うことです。</p>



<p class="wp-block-paragraph">つまり Python を使って Web 上から自由に情報取得できるようになるので、プログラムに実装できる機能の幅が一気に広がります。</p>



<p class="wp-block-paragraph">本記事では、難易度の低い「Web API へのアクセス方法」を解説します。</p>



<p class="wp-block-paragraph">後日 Beautiful Soup を併用した「スクレイピングの方法」を別記事にしようと思っていますので、記事が完成しましたらこちらでご案内する予定です。</p>



<p class="wp-block-paragraph">なお、requests ライブラリをさらに深く理解するためには HTTP 通信の理解が必須です。HTTP の理解に不安がある方には、『<a href="https://amzn.to/3Sbvu6x">Real World HTTP</a>』の通読を強くおすすめします。</p>



<h2 class="wp-block-heading">requests ライブラリのざっくりした説明</h2>



<h3 class="wp-block-heading">requests ライブラリの役割</h3>



<p class="wp-block-paragraph">Python を使って HTTP 通信するためのライブラリです。</p>



<p class="wp-block-paragraph">つまり自分の手元にある PC と遠隔地にあるサーバーとの間で、HTTP というルールに従って情報を送信したり受信したりできるものになります。</p>



<p class="wp-block-paragraph">ライブラリ名は、<strong>サーバーに情報を要求する = &#8220;requests&#8221; </strong>と考えるとわかりやすいかもしれません。</p>



<p class="wp-block-paragraph">直感的な理解のために、具体例をあげてみます。</p>



<p class="wp-block-paragraph">普段 Chrome などのブラウザのアドレスバーに「http://~」などと打ち込むことがあると思いますが、その時には裏側で以下のことが行われています。/</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>URLを入力してEnterを押す</li>



<li>サーバーにページの内容をリクエストする</li>



<li>ページの内容が自分のPCに返ってくる</li>



<li>ブラウザが画面を表示する</li>
</ul>
</div></div>



<p class="wp-block-paragraph">この「ページの内容を要求（リクエスト）する」ことと、「ページの内容が返却（レスポンス）される」部分にHTTP通信が利用されているというわけです。</p>



<h3 class="wp-block-heading">urllib ライブラリとの違い</h3>



<p class="wp-block-paragraph">Python には urllib という標準モジュールがあります。<br>実は、この urllib.request を使っても HTTP 通信を行うことは可能です。</p>



<p class="wp-block-paragraph">ただし、特別な理由がない限り requests ライブラリを推奨します。</p>



<p class="wp-block-paragraph">requests ライブラリは urllib をより使いやすくカスタマイズしたものであり、同じことをするにしても urllib.request を使うと相当コード量が増えてしまうからです。</p>



<h2 class="wp-block-heading">requests を使った Web API へのアクセス方法</h2>



<p class="wp-block-paragraph">Web APIへのアクセスは、以下の流れで行います。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ol class="wp-block-list is-style-num_circle">
<li>利用する Web API の調査</li>



<li>ライブラリのインストール</li>



<li>コードを作成・実行する</li>
</ol>
</div></div>



<p class="wp-block-paragraph">今回は、例として「<a href="https://weather.tsukumijima.net/">天気予報 API（livedoor 天気互換）</a>」を活用してみます。</p>



<p class="wp-block-paragraph">気象庁から配信されている日本全国の天気予報を取得できます。</p>



<h3 class="wp-block-heading">利用する Web API の調査</h3>



<p class="wp-block-paragraph">最初の段階で、以下の内容は調査しておくと良いです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>API の利用規約を精読する
<ul class="wp-block-list">
<li>利用料金</li>



<li>リクエストの制限回数</li>



<li>許可されている利用目的</li>
</ul>
</li>



<li>アクセス先のURL（エンドポイント）を調べる</li>



<li>認証系で必要な情報を確認する</li>
</ul>
</div></div>



<h4 class="wp-block-heading">API の利用規約を精読する</h4>



<p class="wp-block-paragraph">利用規約には API を使うためのお約束ごとです。必ず確認するようにしてください。</p>



<p class="wp-block-paragraph">まず、有料・無料を確認します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">サービスの利用は無料ですが、この API を利用したことで何らかの不具合が発生しても責任は負えません。自己責任にてお願いします。</p>
<cite><a href="https://weather.tsukumijima.net/">天気予報 API（livedoor 天気互換）</a></cite></blockquote>



<p class="wp-block-paragraph">そして必ず確認したいのが、<strong>リクエストのレート制限について</strong>です。</p>



<p class="wp-block-paragraph">過度に Web API に対してリクエストを送ってしまうとサーバーに大きな負担をかけてしまい、最悪の場合はサーバーがダウンしてしまいます。</p>



<p class="wp-block-paragraph">そのようなことがないよう、通常は API の利用規約内に「リクエストは〇〇秒以上の間隔をあけてアクセスするように」などの決まりが書かれています。</p>



<p class="wp-block-paragraph">今回の天気予報 API では、以下の記述がありました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">あまり強いサーバーではないので、API に連続してアクセスする場合は<strong>最低でも 0.5 秒以上間隔を空けてから行ってください</strong>。</p>
<cite><a href="https://weather.tsukumijima.net/">天気予報 API（livedoor 天気互換）</a></cite></blockquote>



<p class="wp-block-paragraph">仮に書かれていなかった場合には、API 提供者に確認をとってみるのも良いでしょう。</p>



<p class="wp-block-paragraph">また商用利用する場合には、商用 OK かどうかもチェックしてください。</p>



<p class="is-style-icon_info wp-block-paragraph">かなり大事なステップです。<br>利用規約の読み込みは丁寧に行ない、不明点を潰した状態で次のステップに進んでください。</p>



<h4 class="wp-block-heading">アクセス先のURL（エンドポイント）を調べる</h4>



<p class="wp-block-paragraph">続いて、アクセス先の URL を確認します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">JSON データをリクエストする際のベースとなる URL は以下になります。<br><strong>https://weather.tsukumijima.net/api/forecast</strong><br>この URL に下の表のパラメータを加え、実際にリクエストします。</p>
<cite><a href="https://weather.tsukumijima.net/">天気予報 API（livedoor 天気互換）</a></cite></blockquote>



<p class="wp-block-paragraph">上記をベースに、city パラメータを加えてリクエストする仕様のようです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">地域別に定義された ID 番号を表します。<br>リクエストする地域と ID の対応は、livedoor 天気で使われていた&nbsp;<a href="https://weather.tsukumijima.net/primary_area.xml" target="_blank" rel="noreferrer noopener">全国の地点定義表</a>&nbsp;内で「一次細分区域（cityタグ）」の ID をご参照ください。（例・佐賀県 伊万里 = 410020 ）</p>
<cite><a href="https://weather.tsukumijima.net/">天気予報 API（livedoor 天気互換）</a></cite></blockquote>



<p class="wp-block-paragraph">久留米市の天気を取得する場合は以下とするようです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">下記 URL にアクセスして JSON データを取得します。<br>基本 URL + 久留米の ID (400040)<br><a href="https://weather.tsukumijima.net/api/forecast/city/400040" target="_blank" rel="noreferrer noopener">https://weather.tsukumijima.net/api/forecast/city/400040</a></p>



<p class="wp-block-paragraph">クエリで取得することもできます。<br><a href="https://weather.tsukumijima.net/api/forecast?city=400040" target="_blank" rel="noreferrer noopener">https://weather.tsukumijima.net/api/forecast?city=400040</a></p>
<cite><a href="https://weather.tsukumijima.net/">天気予報 API（livedoor 天気互換）</a></cite></blockquote>



<p class="wp-block-paragraph">今回はエンドポイントが一つでしたが、APIによっては複数のエンドポイントが用意されていることの方が多いです。</p>



<p class="wp-block-paragraph">欲しい情報にアクセスできるエンドポイントを見つけ出してください。</p>



<h4 class="wp-block-heading">認証系で必要な情報を確認する</h4>



<p class="wp-block-paragraph">API によっては、以下のような追加の認証情報が必要になることがあります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>API Key</li>



<li>Access Token</li>
</ul>
</div></div>



<p class="wp-block-paragraph">これらは利用者を識別するためのものです。</p>



<p class="wp-block-paragraph">必要な場合に requests ライブラリでリクエストを送る際に、これらの認証情報を添付することになります。</p>



<p class="wp-block-paragraph">ちなみに今回利用する「天気予報 API」では認証情報は要求されないようでした。</p>



<h3 class="wp-block-heading">ライブラリのインストール</h3>



<p class="wp-block-paragraph">ライブラリ名は<code>requests</code>です。</p>



<p class="wp-block-paragraph">以下のコマンドを実行してインストールを行いましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>pip install requests</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">pip</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">requests</span></span></code></pre></div>



<h3 class="wp-block-heading">コードを作成・実行する</h3>



<p class="wp-block-paragraph">最後にコードを作成します。</p>



<p class="wp-block-paragraph">今回の「天気予報API」ではクエリパラメータとして場所に関する情報を渡す必要があるので、以下のように params をリクエストに含めました。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import requests

endpoint = "https://weather.tsukumijima.net/api/forecast"

params = {
    "city": 400040,
}

response = requests.get(endpoint, params=params)

# 結果を表示
print(response.text)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> requests</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">endpoint = </span><span style="color: #CE9178">&quot;https://weather.tsukumijima.net/api/forecast&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">params = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;city&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">400040</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">=params)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 結果を表示</span></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(response.text)</span></span></code></pre></div>



<p class="wp-block-paragraph">すると print(response.txt) の部分が実行され、以下が表示されるはずです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>{
  "publicTime": "2024-01-27T11:00:00+09:00",
  "publicTimeFormatted": "2024/01/27 11:00:00",
  "publishingOffice": "福岡管区気象台",
  "title": "福岡県 久留米 の天気",
  "link": "https://www.jma.go.jp/bosai/forecast/#area_type=offices&amp;area_code=400000",
  "description": {
    "publicTime": "2024-01-27T10:39:00+09:00",
    "publicTimeFormatted": "2024/01/27 10:39:00",
    "headlineText": "",
    "bodyText": "　福岡県は、高気圧に覆われて晴れの所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなっています。\n\n　２７日は、高気圧に覆われて晴れる所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなるでしょう。\n\n　２８日は、気圧の谷や寒気の影響により曇りで、雨や雪となり雷を伴う所がありますが、高気圧に覆われて次第に晴れとなるでしょう。\n\n＜天気変化等の留意点＞\n　２７日１２時から２８日１２時までに予想される１時間降水量は、多い所で、筑後地方で５ミリ、２７日１２時から２８日１２時までに予想される２４時間降水量は、多い所で、筑後地方で１０ミリの見込みです。",
    "text": "　福岡県は、高気圧に覆われて晴れの所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなっています。\n\n　２７日は、高気圧に覆われて晴れる所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなるでしょう。\n\n　２８日は、気圧の谷や寒気の影響により曇りで、雨や雪となり雷を伴う所がありますが、高気圧に覆われて次第に晴れとなるでしょう。\n\n＜天気変化等の留意点＞\n　２７日１２時から２８日１２時までに予想される１時間降水量は、多い所で、筑後地方で５ミリ、２７日１２時から２８日１２時までに予想される２４時間降水量は、多い所で、筑後地方で１０ミリの見込みです。"
  },
  "forecasts": [
    {
      "date": "2024-01-27",
      "dateLabel": "今日",
      "telop": "晴時々曇",
    ・・・
// 以下、省略</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;publicTime&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;2024-01-27T11:00:00+09:00&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;publicTimeFormatted&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;2024/01/27 11:00:00&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;publishingOffice&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;福岡管区気象台&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;title&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;福岡県 久留米 の天気&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;link&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;https://www.jma.go.jp/bosai/forecast/#area_type=offices&amp;area_code=400000&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;description&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;publicTime&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;2024-01-27T10:39:00+09:00&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;publicTimeFormatted&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;2024/01/27 10:39:00&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;headlineText&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;bodyText&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;　福岡県は、高気圧に覆われて晴れの所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなっています。</span><span style="color: #D7BA7D">\n\n</span><span style="color: #CE9178">　２７日は、高気圧に覆われて晴れる所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなるでしょう。</span><span style="color: #D7BA7D">\n\n</span><span style="color: #CE9178">　２８日は、気圧の谷や寒気の影響により曇りで、雨や雪となり雷を伴う所がありますが、高気圧に覆われて次第に晴れとなるでしょう。</span><span style="color: #D7BA7D">\n\n</span><span style="color: #CE9178">＜天気変化等の留意点＞</span><span style="color: #D7BA7D">\n</span><span style="color: #CE9178">　２７日１２時から２８日１２時までに予想される１時間降水量は、多い所で、筑後地方で５ミリ、２７日１２時から２８日１２時までに予想される２４時間降水量は、多い所で、筑後地方で１０ミリの見込みです。&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;text&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;　福岡県は、高気圧に覆われて晴れの所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなっています。</span><span style="color: #D7BA7D">\n\n</span><span style="color: #CE9178">　２７日は、高気圧に覆われて晴れる所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなるでしょう。</span><span style="color: #D7BA7D">\n\n</span><span style="color: #CE9178">　２８日は、気圧の谷や寒気の影響により曇りで、雨や雪となり雷を伴う所がありますが、高気圧に覆われて次第に晴れとなるでしょう。</span><span style="color: #D7BA7D">\n\n</span><span style="color: #CE9178">＜天気変化等の留意点＞</span><span style="color: #D7BA7D">\n</span><span style="color: #CE9178">　２７日１２時から２８日１２時までに予想される１時間降水量は、多い所で、筑後地方で５ミリ、２７日１２時から２８日１２時までに予想される２４時間降水量は、多い所で、筑後地方で１０ミリの見込みです。&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">  },</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #CE9178">&quot;forecasts&quot;</span><span style="color: #D4D4D4">: [</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #CE9178">&quot;date&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;2024-01-27&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #CE9178">&quot;dateLabel&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;今日&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #CE9178">&quot;telop&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;晴時々曇&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    ・・・</span></span>
<span class="line"><span style="color: #D4D4D4">// 以下、省略</span></span></code></pre></div>



<h2 class="wp-block-heading">実装のために知っておくと便利な知識</h2>



<h3 class="wp-block-heading">レスポンスのうち、要素の一部を取得する</h3>



<p class="wp-block-paragraph">上記で response として受け取ったデータは、Response オブジェクトです。</p>



<p class="wp-block-paragraph">これではちょっと扱いづらいので、以下の流れで辞書にしてから要素を取り出すことが多いと思います。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>Response オブジェクトを辞書に変換する</li>



<li>辞書として要素にアクセスする</li>
</ul>
</div></div>



<p class="wp-block-paragraph">先ほどのレスポンスを例に、title の値を取得するコード例を示します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import requests

endpoint = "https://weather.tsukumijima.net/api/forecast"

params = {
    "city": 400040,
}

response = requests.get(endpoint, params=params)

# json() メソッドで辞書に変換する
response_dict = response.json()
title = response_dict&#91;"title"&#93;

print(title) </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> requests</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">endpoint = </span><span style="color: #CE9178">&quot;https://weather.tsukumijima.net/api/forecast&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">params = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;city&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">400040</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">=params)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># json() メソッドで辞書に変換する</span></span>
<span class="line"><span style="color: #D4D4D4">response_dict = response.json()</span></span>
<span class="line"><span style="color: #D4D4D4">title = response_dict&#91;</span><span style="color: #CE9178">&quot;title&quot;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(title) </span></span></code></pre></div>



<p class="wp-block-paragraph">すると、title に対応する値のみが出力されました。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>福岡県 久留米 の天気</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">福岡県 久留米 の天気</span></span></code></pre></div>



<p class="wp-block-paragraph">例えば bodyText などのより深い階層にある要素も、一般的な辞書の操作方法で取り出せます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import requests

endpoint = "https://weather.tsukumijima.net/api/forecast"

params = {
    "city": 400040,
}

response = requests.get(endpoint, params=params)

# json() メソッドで辞書に変換する
response_dict = response.json()
# bodyText を取得する
body_text = response_dict&#91;"description"&#93;&#91;"bodyText"&#93;

print(body_text) </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> requests</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">endpoint = </span><span style="color: #CE9178">&quot;https://weather.tsukumijima.net/api/forecast&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">params = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;city&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">400040</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">=params)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># json() メソッドで辞書に変換する</span></span>
<span class="line"><span style="color: #D4D4D4">response_dict = response.json()</span></span>
<span class="line"><span style="color: #6A9955"># bodyText を取得する</span></span>
<span class="line"><span style="color: #D4D4D4">body_text = response_dict&#91;</span><span style="color: #CE9178">&quot;description&quot;</span><span style="color: #D4D4D4">&#93;&#91;</span><span style="color: #CE9178">&quot;bodyText&quot;</span><span style="color: #D4D4D4">&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">print</span><span style="color: #D4D4D4">(body_text) </span></span></code></pre></div>



<p class="wp-block-paragraph">実行結果は以下になります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>　福岡県は、高気圧に覆われて晴れの所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなっています。

　２７日は、高気圧に覆われて晴れる所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなるでしょう。

　２８日は、気圧の谷や寒気の影響により曇りで、雨や雪となり雷を伴う所がありますが、高気圧に覆われて次第に晴れとなるでしょう。

＜天気変化等の留意点＞
　２７日１２時から２８日１２時までに予想される１時間降水量は、多い所で、筑後地方で５ミリ、２７日１２時から２８日１２時までに予想される２４時間降水量は、多い所で、筑後地方で１０ミリの見込みです。</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">　福岡県は、高気圧に覆われて晴れの所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなっています。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">　２７日は、高気圧に覆われて晴れる所もありますが、気圧の谷や寒気の影響により、おおむね曇りとなるでしょう。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">　２８日は、気圧の谷や寒気の影響により曇りで、雨や雪となり雷を伴う所がありますが、高気圧に覆われて次第に晴れとなるでしょう。</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">＜天気変化等の留意点＞</span></span>
<span class="line"><span style="color: #D4D4D4">　２７日１２時から２８日１２時までに予想される１時間降水量は、多い所で、筑後地方で５ミリ、２７日１２時から２８日１２時までに予想される２４時間降水量は、多い所で、筑後地方で１０ミリの見込みです。</span></span></code></pre></div>



<h3 class="wp-block-heading">GET 以外の HTTP メソッドを使ってアクセスする方法</h3>



<p class="wp-block-paragraph">先ほどは<code>requests.get()</code>としてリクエストを送りました。</p>



<p class="wp-block-paragraph">これはサーバーに対して「GET メソッドでリクエストを送る」という指示になるのですが、HTTP メソッドには他にもいくつか種類が存在します。</p>



<figure class="wp-block-table"><table><thead><tr><th>HTTPメソッド</th><th>requests のメソッド</th></tr></thead><tbody><tr><td>GET</td><td>get()</td></tr><tr><td>POST</td><td>post()</td></tr><tr><td>PUT</td><td>put()</td></tr><tr><td>DELETE</td><td>delete()</td></tr><tr><td>HEAD</td><td>head()</td></tr><tr><td>OPTIONS</td><td>options()</td></tr><tr><td>PATCH</td><td>patch()</td></tr></tbody></table><figcaption class="wp-element-caption">HTTPメソッドとrequestsメソッドの対応関係</figcaption></figure>



<p class="wp-block-paragraph">Web API では、GET または POST を使うことが多いと思います。</p>



<p class="wp-block-paragraph">別のメソッドが指定されている場合にも、HTTP メソッドと完全に対応する形で requests のメソッドも用意されているのであまり混乱することはないと思います。</p>



<h3 class="wp-block-heading">リクエスト時に同時に送信できる情報</h3>



<p class="wp-block-paragraph">エンドポイントにアクセスする際に、特定の情報を添付することができます。</p>



<p class="wp-block-paragraph">添付方法には次のような種類があります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>クエリパラメータ</li>



<li>リクエストボディ</li>



<li>フォームデータ</li>



<li>HTTP ヘッダー</li>
</ul>
</div></div>



<p class="wp-block-paragraph">どの方法でデータを添付するかについては、API ドキュメントなどに書いてあります。</p>



<p class="wp-block-paragraph">ここではそれぞれ requests ライブラリでどのように情報を送信するかをサクッと解説します。</p>



<h4 class="wp-block-heading">クエリパラメータ</h4>



<p class="wp-block-paragraph">クエリパラメータをつける場合は、params 引数に辞書を渡します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># クエリパラメータを定義
params = {
    "city": 400040,
}

response = requests.get(endpoint, params=params)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># クエリパラメータを定義</span></span>
<span class="line"><span style="color: #D4D4D4">params = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;city&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">400040</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">params</span><span style="color: #D4D4D4">=params)</span></span></code></pre></div>



<p class="wp-block-paragraph">先ほどの天気予報APIでも、クエリパラメータを使ってリクエストを送りました。</p>



<h4 class="wp-block-heading">リクエストボディ</h4>



<p class="wp-block-paragraph">リクエストボディは、json 引数に辞書を渡します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># リクエストボディを定義
request_body = {
    "key": "value",
}

response = requests.get(endpoint, json=request_body)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># リクエストボディを定義</span></span>
<span class="line"><span style="color: #D4D4D4">request_body = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;key&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;value&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">json</span><span style="color: #D4D4D4">=request_body)</span></span></code></pre></div>



<h4 class="wp-block-heading">フォームデータ</h4>



<p class="wp-block-paragraph">ファイルアップロードやフォーム送信には、フォームデータが使われることがあります。</p>



<p class="wp-block-paragraph">data 引数に辞書を渡してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># フォームデータを定義
form_data = {
    "key": "value",
}

response = requests.get(endpoint, data=form_data)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># フォームデータを定義</span></span>
<span class="line"><span style="color: #D4D4D4">form_data = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;key&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;value&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">=form_data)</span></span></code></pre></div>



<h4 class="wp-block-heading">HTTP ヘッダー</h4>



<p class="wp-block-paragraph">HTTP ヘッダーに値を含める場合には、headers 引数に辞書を渡します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># HTTP ヘッダーを定義
headers = {
    "Authorization": "Bearer YOUR_TOKEN"
}

response = requests.get(endpoint, headers=headers)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># HTTP ヘッダーを定義</span></span>
<span class="line"><span style="color: #D4D4D4">headers = {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;Authorization&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Bearer YOUR_TOKEN&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">response = requests.get(endpoint, </span><span style="color: #9CDCFE">headers</span><span style="color: #D4D4D4">=headers)</span></span></code></pre></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Nginx入門】初心者でもわかるWebサーバーの設定ガイド</title>
		<link>https://cfxlog.com/nginx-beginner-guide/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 15:00:00 +0000</pubDate>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[デプロイ]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=5047</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/nginx-beginner-guide.jpg" class="webfeedsFeaturedVisual" /></p>このような疑問にお答えします。 これまでアプリケーションを作るためにプログラムを書き続けた方は、今回紹介するような少し低レイヤーのソフトウェアを苦手に感じる場合が多いと思います。 僕自身もPythonでデスクトップで動く [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/nginx-beginner-guide.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-bg_stripe"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>会社でNginxを使うことになったけど、何が何だかさっぱりだ…</li>



<li>Nginxはインストールできたけど、設定ファイルの意味が全然わからない。</li>



<li>エラーが出てもどう対処したらいいか不安…</li>



<li>前にNginxを挑戦したけど挫折。今度こそ成功させたい。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">このような疑問にお答えします。</p>



<p class="wp-block-paragraph">これまでアプリケーションを作るためにプログラムを書き続けた方は、今回紹介するような少し低レイヤーのソフトウェアを苦手に感じる場合が多いと思います。</p>



<p class="wp-block-paragraph">僕自身もPythonでデスクトップで動くだけの自動化ソフトばかり作っていた時期には、「Nginxってなんだか難しそうだな…」と漠然としたイメージがありました。</p>



<p class="wp-block-paragraph">ところがサーバーに触れる機会が増えていくに従って、「<strong>あ、なんとなくこんな感じのものなんだな！</strong>」という実感が徐々についてくるようになりました。</p>



<p class="wp-block-paragraph">本記事ではNginxに対して漠然とした恐怖を感じている方に、基礎から実際の運用までを詳しく解説していきます。</p>



<p class="wp-block-paragraph">書籍で学びたい方は『<a href="https://amzn.to/3OJDGuB">nginx実践ガイド</a>』はおすすめ。<br><strong>KindleUnlimitedに加入すれば無料で読めます</strong>し、かなり詳しく書かれているのでざっと一読しておくと良いと思います。</p>



<h2 class="wp-block-heading">Nginx入門: ウェブサーバとは何か？</h2>



<p class="wp-block-paragraph">ウェブサーバーは<strong>WebページやWebアプリケーションを配信するシステム</strong>です。ブラウザからのリクエストに従って、HTTPSなどのプロトコルで通信します。</p>



<p class="wp-block-paragraph">また、このようなコンテンツを配信する役割の他にも、セキュリティやパフォーマンス最適化も担当する結構重要な存在です。</p>



<h3 class="wp-block-heading">Nginxはウェブサーバーの一種</h3>



<p class="wp-block-paragraph">Nginxはウェブサーバーの役割を果たすソフトウェアです。</p>



<p class="wp-block-paragraph">とはいえ、他にも「ロードバランサの機能がある」だったり「リバースプロキシの機能もある」などと言われますが、<strong>これらはウェブサーバーの機能の一部を切り取って表現したもの</strong>と考えて良いかと思います。</p>



<p class="wp-block-paragraph">以下に、それぞれの概念をサクッと解説します。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li><strong>ウェブサーバー</strong><br>HTTPリクエストを受けて、対応するリソース（HTML, CSS, JavaScriptなどの静的ファイル）を返す役割。</li>



<li><strong>リバースプロキシ</strong><br>クライアントからのリクエストをバックエンドのサーバーに転送し、サーバーからのレスポンスをクライアントに返す役割。</li>



<li><strong>ロードバランサ</strong><br>リクエストを複数のバックエンドサーバーへのうまく分散させる役割。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">つまり、Nginxは<strong>基本的にウェブサーバー</strong>として使われる。<br>でも、その一部の機能であるリバースプロキシやロードバランサといった<strong>単体の機能を切り出して使うこともある</strong>と理解すると良いと思います。</p>



<h3 class="wp-block-heading">Nginxの特徴</h3>



<p class="wp-block-paragraph">Nginxの特徴は以下の通りです。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-check_list">
<li><strong>ハイパフォーマンス</strong><br>動作が高速。<br>非同期イベント駆動型の設計により、リソースの消費を抑えつつ効率的に同時接続の処理ができる。</li>



<li><strong>静的コンテンツ配信</strong><br>静的ファイル（HTML、CSS、JavaScript、画像など）の高速配信に優れる。</li>



<li><strong>リバースプロキシ</strong><br>セキュリティの強化、負荷分散、キャッシュ機能などを備える。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">最近では全世界のウェブサーバーの3分の1がNginxになったと言われていて、シェアとしてはトップクラスです。</p>



<p class="wp-block-paragraph">このシェアの高さを考えても、Nginxを学んでおく価値は十分にあると思います。</p>



<h3 class="wp-block-heading">Nginxの内部構造</h3>



<p class="wp-block-paragraph">Nginxは「マスタープロセス」と「ワーカープロセス」の二つで構成されています。</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl2"><div class="cap_box_ttl"><span>Nginx内部のプロセス</span></div><div class="cap_box_content">
<ul class="wp-block-list">
<li><strong>マスタープロセス</strong><br>設定ファイルの読み込み・検証 / ワーカープロセスの管理<br>※ rootユーザーで起動。</li>



<li><strong>ワーカープロセス</strong><br>実際のリクエストの処理<br>※ nginxやwwwなどの一般ユーザーで起動。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">マスタープロセスという親プロセスがいて、その配下に複数のワーカープロセスがぶら下がっているというイメージで考えると良いと思います。</p>



<p class="wp-block-paragraph">また、ワーカープロセスは複数のクライアントからのリクエストを非同期に処理できるので、システム全体の処理能力を向上することができています。<span class="swl-fz u-fz-xs">（つまりI/Oを多重化することで処理能力を上げている）</span></p>



<h3 class="wp-block-heading">Nginxで使うファイル名と一般的な保存先ディレクトリ</h3>



<p class="wp-block-paragraph">よく使う設定ファイルの場所とファイル名が以下となります。</p>



<figure class="wp-block-table is-style-regular"><table><thead><tr><th>dir</th><th>file / dir</th><th>内容</th></tr></thead><tbody><tr><td rowspan="3"><strong>/etc/nginx/</strong></td><td><strong>nginx.conf</strong></td><td>nginxの全体的な設定</td></tr><tr><td><strong>conf.d/</strong></td><td>個々のサーバーの設定ファイルを格納</td></tr><tr><td><strong>sites-available/</strong><br>と<br><strong>sites-enabled/</strong></td><td>サイトの設定はavailableに書き、enableより参照させる（シンボリックリンク）</td></tr><tr><td rowspan="2"><strong>/var/log/nginx/</strong></td><td><strong>access.log</strong></td><td>アクセスログ</td></tr><tr><td><strong>error.log</strong></td><td>エラーログ</td></tr><tr><td><strong>/user/share/nginx/html/</strong><br>または<strong><br>/var/www/html/</strong></td><td>&#8211;</td><td>デフォルトのドキュメントディレクトリ。ウェブサイトの静的コンテンツが保存される</td></tr></tbody></table><figcaption class="wp-element-caption">代表的なディレクトリとファイル</figcaption></figure>



<p class="wp-block-paragraph">これらのディレクトリは、nginx周りの設定の際によく使うことになります。</p>



<h2 class="wp-block-heading">Nginxのインストールと初期設定: 最初の一歩</h2>



<p class="wp-block-paragraph">Nginxのインストールと初期設定について解説します。</p>



<p class="wp-block-paragraph">パッケージの種類についても必要最低限の内容をさらっと解説していきますので、さらっと目を通してみてください。</p>



<h3 class="wp-block-heading">パッケージの種類</h3>



<p class="wp-block-paragraph">Nginxには二つのパッケージが用意されています。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li><strong>nginx Mainline</strong><br>最新の開発版で、新機能が搭載されたもの。安定性は保証されていない。</li>



<li><strong>nginx Stable</strong><br>安定版で新機能の追加は控えめ。安定性とセキュリティが重視される。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">Nginxの変更は、まずMainlineに反映されます。<br>そしてMainlineに取り込まれたもののうち、重大なバグ修正のみがStableに取り込まれる流れです。</p>



<p class="wp-block-paragraph">毎年4月にメジャーアップデートとしてMainlineからStableに分岐し、同時に古いStable版はサポート終了になります。</p>



<p class="is-style-icon_announce wp-block-paragraph">新機能を優先するか、安定性を優先するかでどちらかを選択してみてください。</p>



<h3 class="wp-block-heading">Nginxのインストール</h3>



<p class="wp-block-paragraph">Ubuntu環境では、以下の流れでインストールを行います。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># パッケージリストの更新
sudo apt-get update

# nginxのインストール
sudo apt-get install nginx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># パッケージリストの更新</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt-get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">update</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># nginxのインストール</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt-get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span></code></pre></div>



<p class="wp-block-paragraph">簡単にインストールする場合にはこれで良いですが、このコマンドでインストールされるのはStable版になります。</p>



<p class="wp-block-paragraph">また、Ubuntuのリポジトリの場合には最新のStable版とは限らないので、特定のバージョンを使いたい場合にはNginxの公式リポジトリを追加する必要があります。</p>



<h3 class="wp-block-heading">インストールされたファイルの全体構造</h3>



<p class="wp-block-paragraph">Nginxのインストールによって生成されるファイルの全体構造を見てみましょう。</p>



<p class="wp-block-paragraph">種類としては意外と少ないので、ざっと眺めて全体感をつかんでおきましょう。</p>



<figure class="wp-block-table"><table><thead><tr><th>Dir / File</th><th>内容</th></tr></thead><tbody><tr><td><strong>/etc/nginx</strong></td><td>Nginxの主要設定ファイルを格納するディレクトリ。<br>ここにはnginx.confという主要な設定ファイルと、サイト固有の設定を含むサブディレクトリ（/etc/nginx/sites-available/ と /etc/nginx/sites-enabled/）がある。</td></tr><tr><td><strong>/var/www/html</strong></td><td>デフォルトで設定されたWebルートディレクトリで、Webサイトのファイルを置く場所。</td></tr><tr><td><strong>/var/log/nginx/access.log</strong></td><td>Nginxのアクセスログが格納され、すべてのリクエスト情報がここに記録される。</td></tr><tr><td><strong>/var/log/nginx/error.log</strong></td><td>Nginxのエラーログが格納され、問題が発生した場合にはこのログを確認する。</td></tr></tbody></table><figcaption class="wp-element-caption">ファイルの全体構造</figcaption></figure>



<h3 class="wp-block-heading">ファイアウォールの設定</h3>



<p class="wp-block-paragraph">ファイアウォールはNginxではなくOS側で設定するものではありますが、必ず設定することになるのでここで説明します。</p>



<p class="wp-block-paragraph">ここではUbuntuなどで使われるufwコマンドを使った例を示します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># ufwを有効化する / 外部からのアクセスをすべて閉じる
sudo ufw enable

# HTTP(80), HTTPS(443), SSH(22)を解放する
sudo ufw allow 80
sudo ufw allow 443
sudo ufw allow 22

# ufwの状態や設定を確認する
sudo ufw status</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># ufwを有効化する / 外部からのアクセスをすべて閉じる</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ufw</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">enable</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># HTTP(80), HTTPS(443), SSH(22)を解放する</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ufw</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">allow</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">80</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ufw</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">allow</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">443</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ufw</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">allow</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">22</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># ufwの状態や設定を確認する</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ufw</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">status</span></span></code></pre></div>



<p class="wp-block-paragraph">CentOSなど別のOSをお使いの場合には別のコマンドが用意されていることがあります。お使いのOSに合わせて設定を進めて下さい。</p>



<p class="is-style-icon_info wp-block-paragraph">ファイアウォールの設定はネットワークセキュリティに直接関わる重要な操作なので、必ず十分に理解した上で行なって下さい。</p>



<h3 class="wp-block-heading">起動、終了、再起動、設定ファイルの再読み込み</h3>



<p class="wp-block-paragraph">UbuntuやCentOS7以降で使われるsystemdを使ったコマンド例を掲載します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 起動
sudo systemctl start nginx

# 終了
sudo systemctl stop nginx

# 再起動
sudo systemctl restart nginx

# 設定ファイルの再読み込み
sudo systemctl reload nginx

# nginxサービスをシステムの起動時に自動的に起動
sudo systemctl enable nginx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 起動</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">start</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 終了</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">stop</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 再起動</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">restart</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 設定ファイルの再読み込み</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">reload</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># nginxサービスをシステムの起動時に自動的に起動</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">enable</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span></code></pre></div>



<h3 class="wp-block-heading">Nginxコマンドの使い方</h3>



<p class="wp-block-paragraph">一般的にはシステムのサービスとしてNginxを管理するために、前にご紹介した<code>systemctl</code>コマンドを使用するのが推奨されています。</p>



<p class="wp-block-paragraph">一方、Nginxコマンドを使うとNginxの内部動作に直接影響を与えるので、<strong>設定ファイルの構文チェック</strong>や<strong>ログファイルの再オープン</strong>などはnginxコマンドの方が適している場合があります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Nginxを起動する("/etc/nginx/nginx.conf"を読み込み)
nginx

# Nginxを即座に停止
nginx -s stop

# Nginxをグレースフルに終了(現在の接続がすべて終了したらNginxを停止)
nginx -s quit

# 設定ファイルを再読み込み
nginx -s reload

# 既存のログファイルを閉じて、新しいログファイルを開く
nginx -s reopen

# 設定ファイルの構文チェック
nginx -t

# Nginxのバージョンを表示
nginx -v

# 別パスにある設定ファイあるを指定してNginxを起動
nginx -c /path/to/file</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># Nginxを起動する(&quot;/etc/nginx/nginx.conf&quot;を読み込み)</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Nginxを即座に停止</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">stop</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Nginxをグレースフルに終了(現在の接続がすべて終了したらNginxを停止)</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">quit</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 設定ファイルを再読み込み</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">reload</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 既存のログファイルを閉じて、新しいログファイルを開く</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">reopen</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 設定ファイルの構文チェック</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Nginxのバージョンを表示</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-v</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 別パスにある設定ファイあるを指定してNginxを起動</span></span>
<span class="line"><span style="color: #DCDCAA">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-c</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/path/to/file</span></span></code></pre></div>



<p class="wp-block-paragraph">必要に応じてsystemctlコマンドとnginxコマンドを使い分けてみて下さい。</p>



<h2 class="wp-block-heading">簡単な静的サイトをNginxで構築</h2>



<p class="wp-block-paragraph">Nginxの操作に慣れるには、まず静的なサイトを構成してみるのがおすすめです。</p>



<p class="wp-block-paragraph">Webアプリケーションのようにユーザー側のリクエストに応じて返すデータが異なると、設定ファイルなどが煩雑になるためです。</p>



<h3 class="wp-block-heading">基本操作</h3>



<p class="wp-block-paragraph">まずはNginxのインストールと起動を行います。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo apt-get update
sudo apt-get install nginx
sudo systemctl start nginx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt-get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">update</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt-get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">start</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span></code></pre></div>



<p class="wp-block-paragraph">この状態でWebブラウザからhttp://localhostにアクセスすると、Nginxのデフォルトのウェルカムページが表示されるはずです。/</p>



<h3 class="wp-block-heading">Webサーバーの構築</h3>



<p class="wp-block-paragraph">HTML、CSS、JavaScriptなどの静的ファイルをサーバー上に配置します。</p>



<p class="wp-block-paragraph">これらのデータはnginxのルートドキュメントディレクトリ（<code>/var/www/html</code>）に配置して下さい。</p>



<h3 class="wp-block-heading">設定ファイルの構造</h3>



<p class="wp-block-paragraph">Nginxの主な設定ファイルは/etc/nginx/nginx.confにあります。ところが、個々のサイトの設定は<code>/etc/nginx/sites-available/</code>にあるファイルに書くことが一般的です。</p>



<p class="wp-block-paragraph">例えばドメイン<code>example.com</code>に対する設定は以下のように書きます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>server {
    # 80番ポート(HTTP)でリクエストを受け付ける
    listen 80;
    # ドメイン名
    server_name example.com;

    location / {
        # リクエストされたURLのファイルがある場所を指定
        root /var/www/example.com;
        # リクエストを受けた時に提供するファイル名
        index index.html;
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">server</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 80番ポート(HTTP)でリクエストを受け付ける</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> listen </span><span style="color: #D4D4D4">80;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># ドメイン名</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> server_name </span><span style="color: #D4D4D4">example.com;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">location</span><span style="color: #D4D4D4"> / {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># リクエストされたURLのファイルがある場所を指定</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6"> root </span><span style="color: #D4D4D4">/var/www/example.com;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># リクエストを受けた時に提供するファイル名</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6"> index </span><span style="color: #D4D4D4">index.html;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">ファイル名は分かりやすいものでOKです。例えば、今回はexample.comというウェブサイトの設定なので、/etc/nginx/sites-available/example.comなどとしておけば良いと思います。</p>



<p class="is-style-icon_announce wp-block-paragraph">なお、Linuxのファイル名では<code>.</code>は特別な意味を持たないので、ドメイン名をそのままファイル名に使うことは一般的です。</p>



<p class="wp-block-paragraph">また、sites-availableディレクトリに配置した設定ファイルを有効化するには、/etc/nginx/sites-enabled/ディレクトリへのシンボリックリンクを作成します。<span class="swl-fz u-fz-xs">（つまり、参照先を明示する）</span></p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># シンボリックリンク(ショートカットのようなもの)を作成する
sudo ln -s /etc/nginx/sites-available/exapmle.com /etc/nginx/sites-enabled/</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># シンボリックリンク(ショートカットのようなもの)を作成する</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ln</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/etc/nginx/sites-available/exapmle.com</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/etc/nginx/sites-enabled/</span></span></code></pre></div>



<p class="wp-block-paragraph">Nginxでは、デフォルトでsites-enabledディレクトリ内の設定ファイルを読み込みますが、site-availableディレクトリ内は読み込みません。</p>



<p class="wp-block-paragraph">そのため、Nginxの読み込み対象のディレクトリにシンボリックリンクを配置することで、Nginxの設定対象範囲に含めることになります。</p>



<p class="is-style-icon_book wp-block-paragraph">つまり、設定の有効無効をシンボリックリンクの有無で切り替えることができます。</p>



<p class="wp-block-paragraph">最後に、設定の変更を反映させるためにNginxをリロードします。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo systemctl reload nginx</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">systemctl</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">reload</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span></span></code></pre></div>



<p class="wp-block-paragraph">これで先ほどセットしたページが読み込まれるようになるはずです。</p>



<h2 class="wp-block-heading">Nginxで実装するアクセス制限</h2>



<p class="wp-block-paragraph">Nginxでは、設定ファイルを使ってさまざまなレベルのアクセス制限を行うことができます。</p>



<p class="wp-block-paragraph">ちなみにファイアウォールはサーバー自体にアクセスできるかどうかを制御するものであるのに対して、アクセス制限はサーバーに入ってからの権限を細かく設定するという違いがあります。</p>



<h3 class="wp-block-heading">Basic認証によるアクセス制限</h3>



<p class="wp-block-paragraph">Nginxではユーザー名とパスワードによる認証を利用してアクセス制限することができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>location / {
    auth_basic "closed site";
    auth_basic_user_file conf/.htpasswd;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">location</span><span style="color: #D4D4D4"> / {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> auth_basic </span><span style="color: #CE9178">&quot;closed site&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> auth_basic_user_file </span><span style="color: #D4D4D4">conf/.htpasswd;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">この場合、ユーザー名とパスワードは.htpasswdファイルに記載することになります。</p>



<p class="wp-block-paragraph">ここで、<strong>htpasswdファイルに暗号化せず平文で記載してしまうと誰かに読まれた時に非常にリスキー</strong>です。そのため、ユーザー名・パスワードの登録にあたってはApacheのhtpasswdコマンドなどを使って暗号化しておきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># Apacheが未インストールの場合
sudo apt-get install apache2-utils

# 新しいファイルを作成(-cオプションを外すと上書きしない)
sudo htpasswd -c /etc/nginx/.htpasswd username</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># Apacheが未インストールの場合</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apt-get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">install</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">apache2-utils</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 新しいファイルを作成(-cオプションを外すと上書きしない)</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">htpasswd</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-c</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/etc/nginx/.htpasswd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">username</span></span></code></pre></div>



<p class="wp-block-paragraph">ただ、ここまでの例ではHTTPプロトコルによるアクセスを前提にしてきたため、このBasic認証を設定した場合には<strong>第三者に通信が傍受されてIDやパスワードが盗まれてしまう</strong>場合があります。<span class="swl-fz u-fz-xs">（認証情報はBase64エンコードで送信されるので、簡単にデコードできるため）</span></p>



<p class="wp-block-paragraph">これを避ける方法としては、HTTPではなくHTTPSで通信する方法があります。</p>



<p class="is-style-icon_good wp-block-paragraph">場合によってはOAuthやJWTなどのより安全性の高い認証方法を検討しましょう。</p>



<h3 class="wp-block-heading">IPアドレスによるアクセス制限</h3>



<p class="wp-block-paragraph">本来であればファイアウォールで制御するIPアドレスごとの許可・不許可も、Nginxのアクセス制限を使うことでIPアドレスごとの制御ができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>location / {
    deny   &lt;deny ip address>;
    allow  &lt;allow ip address>;
    deny   all;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">location</span><span style="color: #D4D4D4"> / {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> deny </span><span style="color: #D4D4D4">  &lt;deny ip address&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> allow </span><span style="color: #D4D4D4"> &lt;allow ip address&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> deny </span><span style="color: #D4D4D4"> </span><span style="color: #569CD6"> all</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">実際には会員専用ページなど、特定の人にしか見せたくないページの設定をする際に便利な機能かと思います。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>location /secret-page {
    deny all
    allow &lt;allow ip address>;
    root /var/www/html/secret;
    index index.html
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">location</span><span style="color: #D4D4D4"> /secret-page {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> deny </span><span style="color: #D4D4D4">all</span></span>
<span class="line"><span style="color: #D4D4D4">    allow &lt;allow ip address&gt;;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> root </span><span style="color: #D4D4D4">/var/www/html/secret;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> index </span><span style="color: #D4D4D4">index.html</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">この場合、許可されているIPアドレス以外からのアクセスでは、403 ForbiddenというHTTPステータスコードが表示されてアクセスができません。</p>



<h2 class="wp-block-heading">動的なWebアプリをNginxで構築する方法</h2>



<p class="wp-block-paragraph">一つ前のセクションでは静的サイトの構成をご紹介しましたが、ここでは一歩進んで動的なWebアプリケーションの構成を考えてみます。</p>



<h3 class="wp-block-heading">WebアプリケーションとWebサーバーの接続方法</h3>



<p class="wp-block-paragraph">動的なWebアプリケーションを動作させたい場合には、次のような通信方式によりアプリケーションサーバーと通信させます。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li><strong>FastCGI</strong>：PHPと連携するときに使用。</li>



<li><strong>Proxy Pass</strong>：Nginxがリバースプロキシとして動作する方法。HTTPリクエストをバックエンドのWebアプリに転送し、レスポンスをクライアントに返す。</li>



<li><strong>uwsgi</strong>：PythonアプリケーションをNginxに接続するためのプロトコル。</li>
</ul>
</div></div>



<p class="wp-block-paragraph">例えばDjangoを触り慣れている方であればuwsgiはごく見慣れたプロトコルだと思います。</p>



<h3 class="wp-block-heading">Webアプリケーションの設定によく使われる機能</h3>



<p class="wp-block-paragraph">Nginxをウェブサーバーとして使用する際、Webアプリケーションの設定によく使われる機能には以下のようなものがあります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-check_list">
<li><strong>Location Blocks</strong><br>Nginxの設定ファイルでは、location ブロックを使用して、特定のURLパターンに基づいてリクエストを処理します。これを使用して、特定のURLパターンに対するリクエストをWebアプリケーションにルーティングします。</li>



<li><strong>Reverse Proxy Settings</strong><br>リバースプロキシとしてNginxを使用する際、proxy_pass ディレクティブを使用して、リクエストをバックエンドのWebアプリケーションにルーティングします。</li>



<li><strong>Load Balancing</strong><br>複数のバックエンドサーバーがある場合、Nginxはロードバランサーとして機能し、リクエストを複数のサーバー間で均等に分散します。</li>



<li><strong>SSL/TLS Configuration</strong><br>NginxはSSL/TLSを使用した安全な接続を提供します。これには、証明書と秘密鍵の設定が必要です。</li>



<li><strong>HTTP/2 Settings</strong><br>NginxはHTTP/2をサポートしており、これを有効にすると、より高速なページのロードと優れたパフォーマンスが得られます。</li>



<li><strong>Caching Settings</strong><br>Nginxは、バックエンドからのレスポンスをキャッシュして、それを再利用することができます。これにより、バックエンドのロードが軽減され、レスポンス時間が短縮されます。</li>
</ul>
</div></div>



<h3 class="wp-block-heading">FlaskアプリとuWSGIの設定方法を解説</h3>



<p class="wp-block-paragraph">具体的な例として、FlaskアプリケーションとuWSGIが通信できるような設定をしてみましょう。</p>



<p class="wp-block-paragraph">例えば、Flaskアプリの内容を次のようにしたとしましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello_world():
    return "Hello, World!"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> flask </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> Flask</span></span>
<span class="line"><span style="color: #D4D4D4">app = Flask(</span><span style="color: #9CDCFE">__name__</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #DCDCAA">@app.route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/&quot;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">hello_world</span><span style="color: #D4D4D4">():</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Hello, World!&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">これをuWSGIで動かすために、次のようなuWSGI設定ファイルを作成します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Plaintext</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>&#91;uwsgi&#93;
module = app:app
master = true
processes = 5
socket = app.sock
chmod-socket = 660
vacuum = true
die-on-term = true</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&#91;uwsgi&#93;</span></span>
<span class="line"><span style="color: #D4D4D4">module = app:app</span></span>
<span class="line"><span style="color: #D4D4D4">master = true</span></span>
<span class="line"><span style="color: #D4D4D4">processes = 5</span></span>
<span class="line"><span style="color: #D4D4D4">socket = app.sock</span></span>
<span class="line"><span style="color: #D4D4D4">chmod-socket = 660</span></span>
<span class="line"><span style="color: #D4D4D4">vacuum = true</span></span>
<span class="line"><span style="color: #D4D4D4">die-on-term = true</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>module = app:app</code>とすることで、app.pyのappオブジェクトをアプリケーションとして使うことを示しています。</p>



<p class="wp-block-paragraph">この設定ファイルを元にuWSGIを起動するには、次のコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>uwsgi --ini app.ini</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">uwsgi</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--ini</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">app.ini</span></span></code></pre></div>



<p class="wp-block-paragraph">このコマンドを実行することで、app.sockというUNIXソケットが作成されて、uWSGIとFlaskアプリケーションの間の通信ができるようになりました。</p>



<p class="wp-block-paragraph">続いてNginxの設定です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>server {
    listen 80;
    server_name example.com;
    location / {
        include uwsgi_params;
        uwsgi_pass unix:/path/to/your/app.sock;
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">server</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> listen </span><span style="color: #D4D4D4">80;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> server_name </span><span style="color: #D4D4D4">example.com;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">location</span><span style="color: #D4D4D4"> / {</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6"> include </span><span style="color: #D4D4D4">uwsgi_params;</span></span>
<span class="line"><span style="color: #D4D4D4">       </span><span style="color: #569CD6"> uwsgi_pass </span><span style="color: #D4D4D4">unix:/path/to/your/app.sock;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">uwsgi_passディレクティブには、先ほどapp.iniで指定したsocketとして指定したファイルパスを指定します。</p>



<p class="wp-block-paragraph">最後にNginxにこの設定を有効化するため、シンボリックリンクの作成と再起動をするコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/
sudo service nginx restart</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ln</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-s</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/etc/nginx/sites-available/app</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/etc/nginx/sites-enabled/</span></span>
<span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">service</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">nginx</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">restart</span></span></code></pre></div>



<p class="wp-block-paragraph">以上で、Nginxは80ポートで受け取ったHTTPリクエストをUNIXソケットを通じてuWSGIに転送できるようになるはずです。</p>



<h2 class="wp-block-heading">HTTPSを使ったセキュアな接続</h2>



<p class="wp-block-paragraph">HTTPSは、HTTPの問題点だったセキュリティの脆弱性を改善した通信方法です。</p>



<p class="wp-block-paragraph">最近ではGoogleがHTTPS対応していないサイトに対して警告を出すなどペナルティを課しているので、最近ではHTTPS対応は必須になってきました。ここでは、このHTTPSをNginxで使うための基礎知識を共有します。</p>



<h3 class="wp-block-heading">SSL/TLSについて知ろう</h3>



<p class="wp-block-paragraph">SSL（Secure Sockets Layer）と、その後継規格のTLS（Transport Layer Security）は、<strong>インターネット上でデータ暗号化して傍受されても大丈夫なように送受信するプロトコル</strong>です。</p>



<p class="wp-block-paragraph">HTTPS（HTTP over SSL/TLS）はこの技術を使っているので、<strong>ウェブブラウザとウェブサーバー間の通信は暗号化</strong>されます。例えばクレジットカード番号やパスワードなどの機密情報を盗まれることのないよう、HTTPS通信でやり取りされるのが基本です。</p>



<h3 class="wp-block-heading">証明書の取得方法</h3>



<p class="wp-block-paragraph">サーバー証明書は認証局から取得していくことになります。</p>



<p class="wp-block-paragraph">これまではサーバー証明書を取得するには費用が必要でしたが、Let&#8217;s Encryptなどの認証局を使うことで無料で証明書の発行をしてもらえることもできます。</p>



<p class="wp-block-paragraph">証明書を取得するには、まずCSR（Certificate Signing Request）というファイルを生成した上で、これを認証局に提出し、証明書を取得する流れとなります。</p>



<p class="wp-block-paragraph">CSRには「ドメイン名」や「組織名」などが書かれており、このファイルを元に認証局がサイトの正当性を審査することになります。</p>



<p class="is-style-icon_book wp-block-paragraph">ちなみに、証明書を取得する目的は大きく「正しいウェブサイトであること」と「データが改ざんされていないこと」の2つです。</p>



<h3 class="wp-block-heading">nginxにサーバー証明書を設定しよう</h3>



<p class="wp-block-paragraph">証明書を取得したら、それをNginxに設定することでHTTPSを有効化します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>server {
    listen 443 ssl;
    server_name example.com;

    # 証明書のパスを指定
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    # 秘密鍵のパスを指定
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">server</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> listen </span><span style="color: #D4D4D4">443 ssl;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> server_name </span><span style="color: #D4D4D4">example.com;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 証明書のパスを指定</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> ssl_certificate </span><span style="color: #D4D4D4">/etc/nginx/ssl/example.com.crt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 秘密鍵のパスを指定</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> ssl_certificate_key </span><span style="color: #D4D4D4">/etc/nginx/ssl/example.com.key;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">上記の方法では/etc/nginx/conf.d/ディレクトリにファイルを格納しているので、sites-availableディレクトリに格納する場合と違ってシンボリックリンクを作成する必要はありません。<span class="swl-fz u-fz-xs">（conf.dディレクトリはNignxが自動的に読み込むため）</span></p>



<p class="wp-block-paragraph">HTTPからHTTPSへの自動リダイレクトをするには、以下を書きます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Nginx</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>server {
    listen 80;
    server_name example.com;

    location / {
        return 301 https://$host$request_uri;/
    }
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">server</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> listen </span><span style="color: #D4D4D4">80;</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6"> server_name </span><span style="color: #D4D4D4">example.com;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">location</span><span style="color: #D4D4D4"> / {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">301</span><span style="color: #D4D4D4"> https://$/</span><span style="color: #9CDCFE">host</span><span style="color: #D4D4D4">$</span><span style="color: #9CDCFE">request_uri</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">ちなみにLet&#8217;s Encryptを使った証明書の取得と設定に関しては、簡単なコマンドの実行で取得が完了するので便利です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo certbot --nginx -d example.com -d www.example.com</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">certbot</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--nginx</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-d</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">example.com</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-d</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">www.example.com</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>--nginx</code>フラグを使うことでサーバー設定を自動的に行ってくれます。また、サーバー証明書を取得するだけでなく、証明書の自動更新も設定してくれます。</p>



<p class="wp-block-paragraph"><code>-d</code>フラグに続けて、証明書を取得するドメイン名を指定してください。</p>



<p class="is-style-icon_info wp-block-paragraph">ちなみにLets Encryptの証明書は一般に公開されている状態でないと発行されませんので注意が必要です。</p>



<h2 class="wp-block-heading">トラブルシューティングとメンテナンス</h2>



<p class="wp-block-paragraph">Nginxではなんらかのタイミングでエラーが発生したり、予期せぬエラーが発生しないようにメンテナンスをする必要があります。</p>



<p class="wp-block-paragraph">ここではログファイルの役割や調べ方、基本的なメンテナンスについてお伝えしていきます。</p>



<h3 class="wp-block-heading">Nginxのログファイル</h3>



<figure class="wp-block-image size-full"><img decoding="async" width="1024" height="538" src="https://cfxlog.com/wp-content/uploads/2026/03/nginx-beginner-guide-1.jpg" alt="" class="wp-image-5050" srcset="https://cfxlog.com/wp-content/uploads/2026/03/nginx-beginner-guide-1.jpg 1024w, https://cfxlog.com/wp-content/uploads/2026/03/nginx-beginner-guide-1-300x158.jpg 300w, https://cfxlog.com/wp-content/uploads/2026/03/nginx-beginner-guide-1-768x404.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Nginxのログファイルには、アクセスログとエラーログの二つがあります。</p>



<h4 class="wp-block-heading">アクセスログ</h4>



<p class="wp-block-paragraph">サーバーへの全てのリクエストについて、次のような情報を記録します。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-good_list">
<li>リクエストしたIPアドレス</li>



<li>リクエスト日時</li>



<li>HTTPメソッド</li>



<li>リクエストURI</li>



<li>ステータスコード</li>



<li>ユーザーエージェント</li>
</ul>
</div></div>



<p class="wp-block-paragraph">サイト訪問者の行動を分析したり、エラーの原因調査に使います。</p>



<h4 class="wp-block-heading">エラーログ</h4>



<p class="wp-block-paragraph">次のようなサーバーのエラー情報を記録します。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-bad_list">
<li>設定エラー</li>



<li>サーバーの問題</li>



<li>クライアントからのリクエストに対するエラー</li>
</ul>
</div></div>



<p class="wp-block-paragraph">これらのログはデフォルトで<code>/var/log/nginx/</code>ディレクトリ内に記録されていきます。</p>



<h3 class="wp-block-heading">メンテナンスの考え方</h3>



<p class="wp-block-paragraph">Nginxの基本的なメンテナンスをまとめると次のようなものがあります。</p>



<div class="wp-block-group has-border -border03"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>定期的な更新</strong>：Nginxのバージョンを定期的に更新します。セキュリティパッチを当てたり、新機能を適用するのが目的です。</li>



<li>ログのモニタリング：ログを定期的に確認します。エラーなどの異常を発見したら対策を行います。</li>



<li><strong>パフォーマンスチューニング</strong>：Nginxの設定を最適化します。リソース使用量の監視とボトルネックの特定をしましょう。</li>



<li><strong>バックアップとリストア</strong>：重要な設定ファイルは定期的にバックアップをとります。必要な時にはリストアしましょう。</li>
</ul>
</div></div>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">以上、Nginxの基本的な知識を一つの記事にまとめてみました。全体のイメージはつきましたでしょうか？</p>



<p class="wp-block-paragraph">ご覧の通り、Nginxを理解するための鍵は設定ファイルにあります。</p>



<p class="wp-block-paragraph">簡単なWebサイトからconfファイルの内容を理解しつつ、少しずつ複雑なサイトにも対応できるようになっていきましょう。</p>



<p class="wp-block-paragraph">冒頭でも紹介しましたが、Nginxの全体像を知る上で『<a href="https://amzn.to/43ClxDi">Nginx 実践ガイド</a>』はおすすめです。<br>Kindle Unlimitedなら無料で読めちゃいますので、気になった方はざっとで良いので目を通してみましょう。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>【Python】業務系アプリケーションでよく使うPandas操作の基本</title>
		<link>https://cfxlog.com/python-pandas-basics/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Sat, 07 Mar 2026 11:13:18 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=4951</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-pandas-basics.jpg" class="webfeedsFeaturedVisual" /></p>Pandas は内部的に C 言語で最適化されているので、Python の CSV モジュールなどと比べても超高速に動作します。 また、Pandas で使われる DataFrame には痒いところに手が届くようなメソッド [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/python-pandas-basics.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>Pandas を使ってみたい！</li>



<li>DataFrame の取り扱い方に自信がない…</li>
</ul>
</div></div>



<p class="wp-block-paragraph">Pandas は内部的に C 言語で最適化されているので、Python の CSV モジュールなどと比べても超高速に動作します。</p>



<p class="wp-block-paragraph">また、Pandas で使われる DataFrame には痒いところに手が届くようなメソッドが多数実装されているので、少ないコード量でデータ分析ができる超便利なライブラリです。</p>



<p class="wp-block-paragraph">とはいえ DataFrame はコードの書き方にやや癖があるので、苦手意識やとっつきにくさを感じている方も多いと思います。</p>



<p class="wp-block-paragraph">本記事ではPandasの基本操作をシンプルにご紹介していきます。</p>



<h2 class="wp-block-heading">DataFrame として読み込む</h2>



<p class="wp-block-paragraph">すでにあるデータから DataFrame として読み込む方法から紹介します。</p>



<p class="wp-block-paragraph">ここで取得した DataFrame オブジェクトに対して加工・集計を行なっていくことになるのでファーストステップですね。</p>



<p class="wp-block-paragraph">引数にパラメーターを与えることで色々できますので、基本の使い方 =&gt; 応用的な使い方までご紹介します。</p>



<h3 class="wp-block-heading">Excel ブック</h3>



<p class="wp-block-paragraph">ただ単に Excel ブックを読み込みたい場合は以下のコードです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>excel_path = 'new_book.xlsx'
sheet_name = 'Sheet1'

# Excel => DataFrame
df = pd.read_excel(excel_path, sheet_name=sheet_name)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">excel_path = </span><span style="color: #CE9178">&apos;new_book.xlsx&apos;</span></span>
<span class="line"><span style="color: #D4D4D4">sheet_name = </span><span style="color: #CE9178">&apos;Sheet1&apos;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Excel =&gt; DataFrame</span></span>
<span class="line"><span style="color: #D4D4D4">df = pd.read_excel(excel_path, </span><span style="color: #9CDCFE">sheet_name</span><span style="color: #D4D4D4">=sheet_name)</span></span></code></pre></div>



<p class="wp-block-paragraph">DataFrame として読み込む場合にはシートを指定することに注意してください。<span class="swl-fz u-fz-xs">（CSVはシートという概念がないので<code>sheet_name</code>がない）</span></p>



<p class="wp-block-paragraph">エンコードの関係で文字化けする場合には、<code>encoding</code>引数でオプションを設定します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>excel_path = 'new_book.xlsx'
sheet_name = 'Sheet1'

# Excel => DataFrame
df = pd.read_excel(excel_path, sheet_name=sheet_name, encoding='utf-8_sig')</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">excel_path = </span><span style="color: #CE9178">&apos;new_book.xlsx&apos;</span></span>
<span class="line"><span style="color: #D4D4D4">sheet_name = </span><span style="color: #CE9178">&apos;Sheet1&apos;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Excel =&gt; DataFrame</span></span>
<span class="line"><span style="color: #D4D4D4">df = pd.read_excel(excel_path, </span><span style="color: #9CDCFE">sheet_name</span><span style="color: #D4D4D4">=sheet_name, </span><span style="color: #9CDCFE">encoding</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&apos;utf-8_sig&apos;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">基本的には<code>utf-8_sig</code>でいけますが、それでもダメな場合は<code>ANSI</code>や<code>cp932</code>を使ってみましょう。色々試してみてください。</p>



<h3 class="wp-block-heading">CSV ファイル</h3>



<p class="wp-block-paragraph">CSVファイルを読み込む方法です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>csv_path = 'somefile.csv'

# CSV => DataFrame
df = pd.read_CSV(csv_path, encoding="utf-8_sig")</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">csv_path = </span><span style="color: #CE9178">&apos;somefile.csv&apos;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># CSV =&gt; DataFrame</span></span>
<span class="line"><span style="color: #D4D4D4">df = pd.read_CSV(csv_path, </span><span style="color: #9CDCFE">encoding</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;utf-8_sig&quot;</span><span style="color: #D4D4D4">)</span></span></code></pre></div>



<p class="wp-block-paragraph">CSVファイルは文字化けの問題が多いので、基本的には<code>encoding</code>で指定します。</p>



<h2 class="wp-block-heading">データ整形</h2>



<h3 class="wp-block-heading">キーワードで絞り込み</h3>



<p class="wp-block-paragraph">基本的なデータの絞り込み方法は以下の通りです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 青森県を取得
df&#91;"都道府県"&#93; = df[df&#91;"都道府県"&#93; == "青森県"]</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 青森県を取得</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93; = df[df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93; == </span><span style="color: #CE9178">&quot;青森県&quot;</span><span style="color: #D4D4D4">]</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>df["都道府県"] == "青森県"</code>の部分では<code>True</code>か<code>False</code>のブール値が得られますので、これを外から<code>df</code>で囲むと<code>True</code>のものだけが抽出できるというわけです。</p>



<p class="wp-block-paragraph">逆に<code>False</code>のものだけで抽出したい場合には、以下のように<code>~</code>（チルダ）をつけます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 青森県以外を取得
df&#91;"都道府県"&#93; = df[~df&#91;"都道府県"&#93; == "青森県"]</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 青森県以外を取得</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93; = df[~df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93; == </span><span style="color: #CE9178">&quot;青森県&quot;</span><span style="color: #D4D4D4">]</span></span></code></pre></div>



<h3 class="wp-block-heading">数値で絞り込む</h3>



<p class="wp-block-paragraph">キーワードでの絞り込みと同様に、数値を比較演算子で繋げることで条件に合ったレコードを取得できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 得点が80点以上のレコードを取得
df&#91;"得点"&#93; = df[df&#91;"得点"&#93; &lt;= 80]</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 得点が80点以上のレコードを取得</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;得点&quot;</span><span style="color: #D4D4D4">&#93; = df[df&#91;</span><span style="color: #CE9178">&quot;得点&quot;</span><span style="color: #D4D4D4">&#93; &lt;= </span><span style="color: #B5CEA8">80</span><span style="color: #D4D4D4">]</span></span></code></pre></div>



<h3 class="wp-block-heading">あるキーワードを含むレコードで絞り込む</h3>



<p class="wp-block-paragraph"><code>isin</code>メソッドを使うことで「含む」を表現できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 「県」を含むレコードを取得
df&#91;"都道府県"&#93; = df[df&#91;"都道府県"&#93;.isin(&#91;"県"&#93;)]</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 「県」を含むレコードを取得</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93; = df[df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93;.isin(&#91;</span><span style="color: #CE9178">&quot;県&quot;</span><span style="color: #D4D4D4">&#93;)]</span></span></code></pre></div>



<p class="wp-block-paragraph">もちろん、「含まない」ということを表現する場合は<code>~</code>をつけることで実装可能です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 「県」を含むレコードを取得
df&#91;"都道府県"&#93; = df[~df&#91;"都道府県"&#93;.isin(&#91;"県"&#93;)]</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 「県」を含むレコードを取得</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93; = df[~df&#91;</span><span style="color: #CE9178">&quot;都道府県&quot;</span><span style="color: #D4D4D4">&#93;.isin(&#91;</span><span style="color: #CE9178">&quot;県&quot;</span><span style="color: #D4D4D4">&#93;)]</span></span></code></pre></div>



<h2 class="wp-block-heading">日時の操作</h2>



<h3 class="wp-block-heading">datetime型に変換する</h3>



<p class="wp-block-paragraph">日時に関するデータを読み込んだはずが文字列型で読み込まれていることがあります。</p>



<p class="wp-block-paragraph">そんな時は、<code>to_datetime</code>メソッドを使いましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>df&#91;"日時"&#93; = pd.to_datetime(df&#91;"日時"&#93;)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = pd.to_datetime(df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;)</span></span></code></pre></div>



<h3 class="wp-block-heading">timedelta型に変換する</h3>



<p class="wp-block-paragraph">時間計算などする場合には<code>timedelta</code>型に変換しておくと便利です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>df&#91;"時間"&#93; = pd.to_timedelta(df&#91;"時間"&#93;)</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;時間&quot;</span><span style="color: #D4D4D4">&#93; = pd.to_timedelta(df&#91;</span><span style="color: #CE9178">&quot;時間&quot;</span><span style="color: #D4D4D4">&#93;)</span></span></code></pre></div>



<h3 class="wp-block-heading">年 / 月 / 日だけを抽出する</h3>



<p class="wp-block-paragraph">年・月・日など単体で要素を取り出したい場合、dtアクセサを使うとうまく抽出できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 年だけ抽出
df&#91;"年"&#93; = df&#91;"日時"&#93;.dt.year
# 月だけ抽出
df&#91;"月"&#93; = df&#91;"日時"&#93;.dt.month
# 日だけ抽出
df&#91;"日"&#93; = df&#91;"日時"&#93;.dt.day</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 年だけ抽出</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;年&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.year</span></span>
<span class="line"><span style="color: #6A9955"># 月だけ抽出</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;月&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.month</span></span>
<span class="line"><span style="color: #6A9955"># 日だけ抽出</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.day</span></span></code></pre></div>



<h3 class="wp-block-heading">日時で丸め / 切り捨て / 切り上げ</h3>



<p class="wp-block-paragraph"><code>datetime</code>型はミリ秒単位で情報があるとかえって扱いが煩雑になってしまうことがあるので、必要な範囲でデータを削ぎ落としておくと扱いがラクになります。</p>



<p class="wp-block-paragraph"><code>dt</code>アクセサを使って<code>datetime</code>っぽい形で編集できるようにするのがポイントです。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Python</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 日時の丸め
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.round(freq="D")  # 日
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.round(freq="H")  # 時間
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.round(freq="15T")  # 15分

# 日時の切り捨て
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.floor(freq="D")  # 日
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.floor(freq="H")  # 時間
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.floor(freq="15T")  # 15分

# 日時の切り捨て
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.ceil(freq="D")  # 日
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.ceil(freq="H")  # 時間
df&#91;"日時"&#93; = df&#91;"日時"&#93;.dt.ceil(freq="15T")  # 15分</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 日時の丸め</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.round(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;D&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 日</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.round(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;H&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 時間</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.round(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;15T&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 15分</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 日時の切り捨て</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.floor(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;D&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 日</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.floor(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;H&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 時間</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.floor(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;15T&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 15分</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 日時の切り捨て</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.ceil(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;D&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 日</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.ceil(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;H&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 時間</span></span>
<span class="line"><span style="color: #D4D4D4">df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93; = df&#91;</span><span style="color: #CE9178">&quot;日時&quot;</span><span style="color: #D4D4D4">&#93;.dt.ceil(</span><span style="color: #9CDCFE">freq</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;15T&quot;</span><span style="color: #D4D4D4">)  </span><span style="color: #6A9955"># 15分</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>round</code>に渡す引数<code>freq</code>はかなりの数が用意されているので、目的に合わせて公式ドキュメントを参照してみましょう。</p>



<p class="wp-block-paragraph"><a href="https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#offset-aliases">» 参考：pandas Offset aliases</a></p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Python でデータを扱う場合に比べてややクセはありますが、Pandas なら高速に少ないコード量でやりたいことが実現できます。</p>



<p class="wp-block-paragraph">習得までには少し時間がかかるかもしれませんが、データを扱う場合に大きな力になってくれるライブラリです。</p>



<p class="wp-block-paragraph">ぜひ、スラスラと書けるようになるまで使い込んでみてください。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SSH接続の方法｜基本の手順から便利な設定・トラブルシューティングまで</title>
		<link>https://cfxlog.com/linux-ssh-guide/</link>
		
		<dc:creator><![CDATA[CFXLOG]]></dc:creator>
		<pubDate>Fri, 06 Mar 2026 13:10:12 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[CLIツール]]></category>
		<guid isPermaLink="false">https://cfxlog.com/?p=4899</guid>

					<description><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/linux-ssh-guide.jpg" class="webfeedsFeaturedVisual" /></p>このような方に向けて書きました。 Webのお仕事をしていると、当然のように触れるSSH接続。 なんとなく苦手意識を持っている方は多いのではないでしょうか？ 本記事ではSSH接続がどんなものかと、実務でよく使うコマンドを解 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://cfxlog.com/wp-content/uploads/2026/03/linux-ssh-guide.jpg" class="webfeedsFeaturedVisual" /></p>
<div class="wp-block-group is-style-crease"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>公開鍵方式ってなんだか苦手…</li>



<li>秘密鍵と公開鍵、何が違うの？</li>



<li>鍵のセットアップがわからん！</li>
</ul>
</div></div>



<p class="wp-block-paragraph">このような方に向けて書きました。</p>



<p class="wp-block-paragraph">Webのお仕事をしていると、当然のように触れるSSH接続。</p>



<p class="wp-block-paragraph">なんとなく苦手意識を持っている方は多いのではないでしょうか？</p>



<p class="wp-block-paragraph">本記事では<strong>SSH接続がどんなものか</strong>と、<strong>実務でよく使うコマンド</strong>を解説します。</p>



<p class="wp-block-paragraph">読了後にはSSH接続の仕組みはざっくり説明できるレベルになっているはずです。</p>



<p class="wp-block-paragraph">ぜひ、この機会に基礎をマスターしていきましょう！</p>



<h2 class="wp-block-heading">まずはSSH接続の概要を理解しよう！</h2>



<p class="wp-block-paragraph">SSH（Secure Shell）は、コンピュータ同士がやりとりをする方法の一つです。</p>



<p class="wp-block-paragraph">このやりとりの方法は、「<strong>プロトコル</strong>」と呼ばれます。</p>



<h3 class="wp-block-heading">SSH接続はサーバとの通信で使われる</h3>



<p class="wp-block-paragraph">結論、<strong>SSH接続はサーバーとの通信</strong>でよく使われます。</p>



<p class="wp-block-paragraph">たとえば新しくサーバーをレンタルしても、接続できなければ何の操作もできません。</p>



<p class="wp-block-paragraph">SSH接続を使うことで、手元のPCとサーバーの間でデータのやりとりができるようになります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-check_list">
<li>サーバーのコマンド実行</li>



<li>ファイル転送</li>



<li>リモートデスクトップ</li>



<li>SSHエージェントフォワーディング</li>
</ul>
</div></div>



<p class="wp-block-paragraph">しかも、これらの通信はセキュリティで保護されます。</p>



<p class="wp-block-paragraph">以前はTelnetやRloginといったものが使われていましたが、近年ではセキュリティが強化されたSSHを使うことが多くなりました。</p>



<h3 class="wp-block-heading">２種類の接続方法</h3>



<p class="wp-block-paragraph">SSH接続には、２種類の接続方法があります。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li>パスワード認証方式</li>



<li>公開鍵認証方式</li>
</ul>
</div></div>



<p class="wp-block-paragraph">パスワード認証方式は、ユーザー名とパスワードでログインする方法です。</p>



<p class="wp-block-paragraph"><strong>パスワードを知っていればどの端末からでもアクセスできる</strong>手軽さがある一方、パスワードが漏れてしまった場合には簡単に不正ログインされてしまいます。</p>



<p class="wp-block-paragraph">一方の公開鍵認証方式は、2種類の鍵（公開鍵と秘密鍵のペア）を使って「パスワードなし」でログインできる方法になります。</p>



<p class="wp-block-paragraph">この方法は、<strong>鍵がないとログインできないのでセキュリティが高い</strong>と言われています。</p>



<p class="wp-block-paragraph">ただし設定がやや面倒なのと、秘密鍵自体を盗まれた時に不正ログインリスクが上がってしまうというデメリットもあります。</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="green"><div class="c-balloon__icon -square"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://cfxlog.com/wp-content/uploads/2026/07/01-150x150-2.jpg" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://cfxlog.com/wp-content/uploads/2026/07/01-150x150-2.jpg" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">CFXLOG</span></div><div class="c-balloon__body -speaking -border-none"><div class="c-balloon__text">
<p>SSH接続では、このどちらかの方法を使ってログインします。</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h3 class="wp-block-heading">公開鍵認証方式について簡単に説明</h3>



<p class="wp-block-paragraph">公開鍵方式で理解しておくべきは、次の2点です。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li>秘密鍵は自分だけが持っておく</li>



<li>公開鍵はサーバーに置いておく</li>
</ul>
</div></div>



<p class="wp-block-paragraph">実務的には、まずこれだけ覚えておけば大丈夫です。</p>



<p class="wp-block-paragraph">公開してはいけないのは、その名の通り「秘密鍵」の方です。</p>



<p class="wp-block-paragraph">一方でばら撒いておくのが「公開鍵」となります。</p>



<h2 class="wp-block-heading">SSH接続でサーバーと通信する方法</h2>



<p class="wp-block-paragraph">ここからは実際にサーバーとSSH接続してみましょう。</p>



<p class="wp-block-paragraph">まずはパスワード方式と公開鍵方式の基本的な手順を解説します。</p>



<h3 class="wp-block-heading">パスワード方式を使った接続方法</h3>



<p class="wp-block-paragraph">初めてサーバーにログインする場合は、次の<code>ssh</code>コマンドを実行しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># IPアドレスでログインする場合の具体例
ssh ユーザー名@IPアドレス</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># IPアドレスでログインする場合の具体例</span></span>
<span class="line"><span style="color: #DCDCAA">ssh</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ユーザー名@IPアドレス</span></span></code></pre></div>



<p class="wp-block-paragraph">実行後にパスワードを聞かれるので、入力したらログイン完了です。</p>



<p class="wp-block-paragraph">ちなみに「ユーザー名」と「IPアドレス」は、契約したサーバーのマイページなどに記載があります。</p>



<p class="wp-block-paragraph">職場のアカウントでこれらが不明なら、システム管理者に問い合わせてください。</p>



<p class="is-style-icon_announce wp-block-paragraph">WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!というメッセージが表示された場合は、<a href="#warning_host_change">こちら</a>を参照してください。</p>



<h3 class="wp-block-heading">公開鍵方式を使った接続方法</h3>



<p class="wp-block-paragraph">公開鍵方式は次の手順で進めます。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li>キーペアを作る</li>



<li>公開鍵をサーバーに置く</li>



<li>sshコマンドでログインする</li>
</ul>
</div></div>



<p class="wp-block-paragraph">手順を踏んでいけば何となくわかるので、一つずつ進めていきましょう。</p>



<h4 class="wp-block-heading">1. キーペアを作る</h4>



<p class="wp-block-paragraph">公開鍵方式では「秘密鍵」と「公開鍵」のペア（キーペア）が必要です。</p>



<p class="wp-block-paragraph">このキーペアを作るために、次のコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh-keygen -t rsa -b 4096 -C "youremail@example.com"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ssh-keygen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-b</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">4096</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-C</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;youremail@example.com&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph"><code>youremail@example.com</code>の部分は、あなたのメールアドレスに置き換えましょう。</p>



<p class="wp-block-paragraph">これを実行すると、生成する鍵のファイル名とパスを聞かれます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>% ssh-keygen -t rsa -b 4096 -C "********@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa): </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">%</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ssh-keygen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-b</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">4096</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-C</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;********@gmail.com&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">Generating</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">public/private</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pair.</span></span>
<span class="line"><span style="color: #DCDCAA">Enter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">file</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">which</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">save</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">the</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> (/Users/user/.ssh/id_rsa): </span></span></code></pre></div>



<p class="wp-block-paragraph">ここは、何も入力せずにEnterを押していきましょう。<br>上記では<code>/Users/user/.ssh/id_rsa</code>がデフォルトになっているので、このパスに保存されます。</p>



<p class="wp-block-paragraph">すると上記のように、パスフレーズを設定するかどうか聞かれます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>% ssh-keygen -t rsa -b 4096 -C "********@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">%</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ssh-keygen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-b</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">4096</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-C</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;********@gmail.com&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">Generating</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">public/private</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pair.</span></span>
<span class="line"><span style="color: #DCDCAA">Enter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">file</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">which</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">save</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">the</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> (/Users/user/.ssh/id_rsa):</span></span>
<span class="line"><span style="color: #DCDCAA">Enter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">passphrase</span><span style="color: #D4D4D4"> (empty </span><span style="color: #CE9178">for</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">no</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">passphrase</span><span style="color: #D4D4D4">): </span></span></code></pre></div>



<p class="wp-block-paragraph">パスフレーズを設定すると、公開鍵認証でもログイン時にパスフレーズの入力も求められます。</p>



<p class="wp-block-paragraph">つまり、<strong>秘密鍵を盗んだ第三者が不正アクセスしづらくなります</strong>。</p>



<p class="wp-block-paragraph">セキュリティ的には設定するに越したことはないですが、ログインのたびに毎回パスフレーズを聞かれるのが面倒ならパスフレーズなしで設定を進めることもできます。</p>



<p class="wp-block-paragraph">今回はごく簡単なケースとして、パスフレーズなしにしましょう。<br>なので、何も入力せずにEnterを押してください。</p>



<p class="wp-block-paragraph">すると、もう一度パスフレーズの入力を求められるので、何も入力せずにEnterとしましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>% ssh-keygen -t rsa -b 4096 -C "********@gmail.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: </textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">%</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ssh-keygen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-t</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-b</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">4096</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-C</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;********@gmail.com&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">Generating</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">public/private</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rsa</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pair.</span></span>
<span class="line"><span style="color: #DCDCAA">Enter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">file</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">which</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">save</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">the</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> (/Users/user/.ssh/id_rsa):</span></span>
<span class="line"><span style="color: #DCDCAA">Enter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">passphrase</span><span style="color: #D4D4D4"> (empty </span><span style="color: #CE9178">for</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">no</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">passphrase</span><span style="color: #D4D4D4">): </span></span>
<span class="line"><span style="color: #DCDCAA">Enter</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">same</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">passphrase</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">again:</span><span style="color: #D4D4D4"> </span></span></code></pre></div>



<p class="wp-block-paragraph">最後に以下の<code>ls</code>コマンドを実行して、鍵が生成されたかを確認しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>% ls -la ~/.ssh 
drwxr-xr-x  10 user  staff   320 10 10 07:37 .
drwxr-x---+ 21 user  staff   672 10 10 19:32 ..
-r--------@  1 user  staff   464 10  6 14:14 id_rsa
-rw-rw-r--@  1 user  staff   102 10  6 14:14 id_rsa.pub</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">%</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ls</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-la</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #DCDCAA">drwxr-xr-x</span><span style="color: #D4D4D4">  </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">user</span><span style="color: #D4D4D4">  </span><span style="color: #CE9178">staff</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">320</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">07</span><span style="color: #CE9178">:37</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">.</span></span>
<span class="line"><span style="color: #DCDCAA">drwxr-x---+</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">21</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">user</span><span style="color: #D4D4D4">  </span><span style="color: #CE9178">staff</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">672</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">19</span><span style="color: #CE9178">:32</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">..</span></span>
<span class="line"><span style="color: #DCDCAA">-r--------@</span><span style="color: #D4D4D4">  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">user</span><span style="color: #D4D4D4">  </span><span style="color: #CE9178">staff</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">464</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">  </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">14</span><span style="color: #CE9178">:14</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">id_rsa</span></span>
<span class="line"><span style="color: #DCDCAA">-rw-rw-r--@</span><span style="color: #D4D4D4">  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">user</span><span style="color: #D4D4D4">  </span><span style="color: #CE9178">staff</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">102</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">  </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">14</span><span style="color: #CE9178">:14</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">id_rsa.pub</span></span></code></pre></div>



<p class="wp-block-paragraph">2つの鍵が生成されていることが確認できました。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-check_list">
<li><strong>id_rsa</strong>: 秘密鍵</li>



<li><strong>id_rsa.pub</strong>: 公開鍵</li>
</ul>
</div></div>



<p class="wp-block-paragraph">pubとついていないものが秘密鍵なので、これは外部に公開しないように注意しましょう。</p>



<h4 class="wp-block-heading">2. 公開鍵をサーバーに置く</h4>



<p class="wp-block-paragraph">続いて公開鍵をサーバーに登録します。</p>



<p class="wp-block-paragraph">次のコマンドを実行してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh-copy-id -i ~/.ssh/id_rsa.pub ユーザー名@サーバーアドレス</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ssh-copy-id</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-i</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh/id_rsa.pub</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ユーザー名@サーバーアドレス</span></span></code></pre></div>



<p class="wp-block-paragraph">これにより、サーバーの<code>~/.ssh/authorized_keys</code>ファイルに公開鍵が保存されます。</p>



<p class="wp-block-paragraph">すでに他の公開鍵が登録されていたとしても、上書きではなく追記になるのでご安心ください。</p>



<p class="wp-block-paragraph">もし<code>ssh-copy-id</code>コマンドが使えないなら、次の手順で公開鍵を登録できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># 1.公開鍵の内容をクリップボードにコピー
cat ~/.ssh/id_rsa.pub | pbcopy

# 2.サーバーにログイン
ssh ユーザー名@サーバーアドレス

# 3.公開鍵を追記
echo "ssh-rsa AAAAB3...（ここに貼り付け）" >> ~/.ssh/authorized_keys</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># 1.公開鍵の内容をクリップボードにコピー</span></span>
<span class="line"><span style="color: #DCDCAA">cat</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh/id_rsa.pub</span><span style="color: #D4D4D4"> | </span><span style="color: #DCDCAA">pbcopy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 2.サーバーにログイン</span></span>
<span class="line"><span style="color: #DCDCAA">ssh</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ユーザー名@サーバーアドレス</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 3.公開鍵を追記</span></span>
<span class="line"><span style="color: #DCDCAA">echo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;ssh-rsa AAAAB3...（ここに貼り付け）&quot;</span><span style="color: #D4D4D4"> &gt;&gt; </span><span style="color: #CE9178">~/.ssh/authorized_keys</span></span></code></pre></div>



<h4 class="wp-block-heading">3. sshコマンドでログインする</h4>



<p class="wp-block-paragraph">いずれかの方法でサーバーに公開鍵の登録ができたら、SSH接続でログインしましょう。</p>



<p class="wp-block-paragraph">次のコマンドを実行します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh ユーザー名@サーバーアドレス</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ssh</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ユーザー名@サーバーアドレス</span></span></code></pre></div>



<p class="wp-block-paragraph">パスフレーズを設定した場合にはパスフレーズの入力を求められます。</p>



<p class="is-style-icon_announce wp-block-paragraph">WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!というメッセージが表示された場合は、<a href="#warning_host_change">こちら</a>を参照してください。</p>



<h2 class="wp-block-heading">知っておくと便利な設定方法</h2>



<p class="wp-block-paragraph">SSH接続をさらに便利にする設定をご紹介します。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>パスフレーズの入力を省略する方法</li>



<li>SSHエージェントフォワーディング</li>
</ul>
</div></div>



<p class="wp-block-paragraph">それぞれ解説します。</p>



<h3 class="wp-block-heading">パスフレーズの入力を省略する方法</h3>



<p class="wp-block-paragraph">秘密鍵にパスフレーズを設定すると、毎回のSSH接続時にパスフレーズの入力が必要になります。</p>



<p class="wp-block-paragraph">セキュリティは高くなるものの、サーバーに頻繁に接続するとなると少し面倒。</p>



<p class="wp-block-paragraph">そこで活用したいのが ssh-agent です。</p>



<p class="wp-block-paragraph">ssh-agentを使えば、パスフレーズ付きの秘密鍵を一時的に記憶してくれるので、何度も入力せずに済むようになります。</p>



<p class="wp-block-paragraph">使い方は以下の通り。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># エージェントを起動（1回だけ）
eval "$(ssh-agent -s)"

# 鍵を登録（1回パスフレーズを聞かれる）
ssh-add ~/.ssh/id_rsa

# 以降はこのセッション中、パスフレーズ不要でSSH接続できる
ssh user@host</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955"># エージェントを起動（1回だけ）</span></span>
<span class="line"><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;$(</span><span style="color: #DCDCAA">ssh-agent</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-s</span><span style="color: #CE9178">)&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 鍵を登録（1回パスフレーズを聞かれる）</span></span>
<span class="line"><span style="color: #DCDCAA">ssh-add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh/id_rsa</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 以降はこのセッション中、パスフレーズ不要でSSH接続できる</span></span>
<span class="line"><span style="color: #DCDCAA">ssh</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">user@host</span></span></code></pre></div>



<p class="wp-block-paragraph">SSHエージェントはPCのメモリ上に「一時的に」パスフレーズ付きの鍵を保持します。</p>



<p class="wp-block-paragraph">なので、ターミナルを閉じたり、PCを再起動するなどしてセッションが切れると、再度ssh-addコマンドの実行が必要になります。</p>



<h3 class="wp-block-heading">SSHフォワーディング</h3>



<p class="wp-block-paragraph">SSHフォワーディングとは、あるサーバー（例：server1）にログインした状態から、<strong>自分のPCにある秘密鍵（ローカルのSSHエージェント）を経由して、さらに別のサーバー（例：server2）に接続する</strong>方法です。</p>



<p class="wp-block-paragraph">あらかじめ、ローカルのSSHエージェントに、最終接続先であるserver2の秘密鍵を登録します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>eval "$(ssh-agent -s)"
ssh-add ~/.ssh/server2</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">eval</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;$(</span><span style="color: #DCDCAA">ssh-agent</span><span style="color: #CE9178"> </span><span style="color: #569CD6">-s</span><span style="color: #CE9178">)&quot;</span></span>
<span class="line"><span style="color: #DCDCAA">ssh-add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh/server2</span></span></code></pre></div>



<p class="wp-block-paragraph">続いてserver1に対して<code>-A</code>オプションをつけてSSH接続します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh -A server1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ssh</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-A</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">server1</span></span></code></pre></div>



<p class="wp-block-paragraph">こうしておくと、server1に秘密鍵を設置しなくとも、<strong>ローカルにある秘密鍵を使ってserver2にログインできる</strong>ようになります。</p>



<p class="wp-block-paragraph">つまり、server1にいる状態でローカルのSSHエージェントが使えるようになるわけです。</p>



<h2 class="wp-block-heading">SSHのトラブルシューティング</h2>



<p class="wp-block-paragraph">SSHに問題が起こった場合の解決方法をご紹介します。</p>



<h3 class="wp-block-heading" id="warning_host_change">変な警告メッセージが表示されてログインできない</h3>



<p class="wp-block-paragraph">ログイン時に以下のメッセージが表示されることがあります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256: &lt;some key>
Please contact your system administrator.
Add correct host key in /Users/username/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/username/.ssh/known_hosts:5
Host key for &lt;IPADDRESS> has changed and you have requested strict checking.
Host key verification failed.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span></span>
<span class="line"><span style="color: #DCDCAA">@</span><span style="color: #D4D4D4">    </span><span style="color: #CE9178">WARNING:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">REMOTE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">HOST</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IDENTIFICATION</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">HAS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CHANGED!</span><span style="color: #D4D4D4">     </span><span style="color: #CE9178">@</span></span>
<span class="line"><span style="color: #DCDCAA">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span></span>
<span class="line"><span style="color: #DCDCAA">IT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">POSSIBLE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">THAT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SOMEONE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DOING</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">SOMETHING</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NASTY!</span></span>
<span class="line"><span style="color: #DCDCAA">Someone</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">could</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">be</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">eavesdropping</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">on</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">you</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">right</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">now</span><span style="color: #D4D4D4"> (man-in-the-middle </span><span style="color: #CE9178">attack</span><span style="color: #D4D4D4">)!</span></span>
<span class="line"><span style="color: #DCDCAA">It</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">is</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">also</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">possible</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">that</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">a</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">host</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">has</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">just</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">been</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">changed.</span></span>
<span class="line"><span style="color: #DCDCAA">The</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">fingerprint</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">for</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">the</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ED25519</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sent</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">by</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">the</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">remote</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">host</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">is</span></span>
<span class="line"><span style="color: #DCDCAA">SHA256:</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #CE9178">some</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ke</span><span style="color: #D4D4D4">y&gt;</span></span>
<span class="line"><span style="color: #DCDCAA">Please</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">contact</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">your</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">system</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">administrator.</span></span>
<span class="line"><span style="color: #DCDCAA">Add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">correct</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">host</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/Users/username/.ssh/known_hosts</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">get</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rid</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">of</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">this</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">message.</span></span>
<span class="line"><span style="color: #DCDCAA">Offending</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ED25519</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">in</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/Users/username/.ssh/known_hosts:5</span></span>
<span class="line"><span style="color: #DCDCAA">Host</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">for</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #CE9178">IPADDRES</span><span style="color: #D4D4D4">S&gt; </span><span style="color: #CE9178">has</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">changed</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">and</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">you</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">have</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">requested</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">strict</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">checking.</span></span>
<span class="line"><span style="color: #DCDCAA">Host</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">key</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">verification</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">failed.</span></span></code></pre></div>



<p class="wp-block-paragraph">このメッセージの原因は大きく3つに分けられます。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list is-style-num_circle">
<li>サーバーを再インストールした</li>



<li>ホストキーを定期的に変更するように設定していた</li>



<li>&#8220;man-in-the-middle&#8221; 攻撃を受けて通信を傍受されている</li>
</ul>
</div></div>



<p class="wp-block-paragraph">それぞれの対策方法を説明します。</p>



<h4 class="wp-block-heading">❶または❷の場合</h4>



<p class="wp-block-paragraph">ローカルのホストキーが古いためのエラーで、特に危険はありません。</p>



<p class="wp-block-paragraph">以下のコマンドを使ってホストキーを削除しましょう。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh-keygen -R &lt;IPADDRESS></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ssh-keygen</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-R</span><span style="color: #D4D4D4"> &lt;</span><span style="color: #CE9178">IPADDRES</span><span style="color: #D4D4D4">S&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">これで再度sshコマンドを実行すれば、普通にログインができるはずです。</p>



<h4 class="wp-block-heading">❸の場合</h4>



<p class="wp-block-paragraph">この場合は、<strong>絶対にログインしないでください</strong>。</p>



<p class="wp-block-paragraph">この危険性を理解するために、まずはSSH接続のたびに行われていることを理解する必要があります。</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>サーバー接続の際に行われていること</span></div><div class="cap_box_content">
<ol class="wp-block-list is-style-num_circle">
<li>初回接続時にサーバーのホストキーをローカルに記録</li>



<li>接続のたびにサーバーとローカルのホストキーを照合</li>



<li><strong>サーバーとローカルのホストキーに不一致があると警告を表示</strong></li>



<li>不一致が正常なら、ローカルにある古いホストキーを削除</li>



<li>今後は新しいホストキーを正とする</li>
</ol>
</div></div>



<p class="wp-block-paragraph">最初に示した警告が表示されるのは❸の段階です。</p>



<p class="wp-block-paragraph">ホストキーの不一致に心当たりがない場合には、<strong>最悪の場合サーバーが攻撃を受けている可能性</strong>があります。</p>



<p class="wp-block-paragraph">早めにサーバーの管理者に報告するようにして下さい。</p>



<h3 class="wp-block-heading">接続が拒否される</h3>



<p class="wp-block-paragraph">SSH接続が拒否されると、次のようなメッセージが返ってきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>ssh: connect to host &#91;ホスト名 or IPアドレス&#93; port 22: Connection refused</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">ssh:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">connect</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">to</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">host</span><span style="color: #D4D4D4"> &#91;ホスト名 </span><span style="color: #CE9178">or</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">IPアドレス&#93;</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">port</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">22</span><span style="color: #CE9178">:</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Connection</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">refused</span></span></code></pre></div>



<p class="wp-block-paragraph">接続が拒否されてしまう場合にの原因と対策は次の通りです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li><strong>SSHサーバーが稼働していない</strong><br>　&gt; SSHサーバーを動かす</li>



<li><strong>SSHサーバーのポートがファイアウォールでブロックされている</strong><br>　&gt; ファイアウォール設定で許可する</li>



<li><strong>ユーザー名またはパスワードが間違っている</strong><br>　&gt; 正しいものを入力する</li>
</ul>
</div></div>



<p class="wp-block-paragraph">基本的にはサーバーの管理者に連絡して指示を仰ぎましょう。</p>



<p class="wp-block-paragraph">たまにファイアウォールの設定を誤ってしまい、自分が締め出されてしまう場合もあります。</p>



<p class="wp-block-paragraph">どうしても入れなくなってしまった場合には、OSを再インストールしましょう。</p>



<h3 class="wp-block-heading">公開鍵が正しく認識されない</h3>



<p class="wp-block-paragraph">サーバーに登録した公開鍵が認識されていない場合もあります。</p>



<p class="wp-block-paragraph">このような場合にはサーバーからメッセージが返ってくることはありません。</p>



<p class="wp-block-paragraph">なぜなら、ここで具体的なメッセージが返ってきてしまうと<strong>不正アクセスの手助けをすることになってしまうから</strong>です。</p>



<p class="wp-block-paragraph">管理者権限でログインできれば、SSHログを参照して詳細を確認できます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo less /var/log/auth.log
# Authentication refused: bad ownership or modes for directory /home/username/.ssh</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">sudo</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">less</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">/var/log/auth.log</span></span>
<span class="line"><span style="color: #6A9955"># Authentication refused: bad ownership or modes for directory /home/username/.ssh</span></span></code></pre></div>



<p class="wp-block-paragraph">たとえば上記の場合、<code>~/.ssh</code>ディレクトリまたはその中のファイル（例えばauthorized_keys）のパーミッションが間違っていることがわかります。</p>



<p class="wp-block-paragraph">その他に考えられる主な原因と対策は次の通りです。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>サーバーへの公開鍵のコピーに失敗</li>



<li>公開鍵と秘密鍵のペアが不一致</li>



<li>サーバー設定で公開鍵認証を許可していない</li>



<li>権限設定が間違っている</li>
</ul>
</div></div>



<p class="wp-block-paragraph">権限設定は、<code>.ssh</code>ディレクトリは700、<code>authorized_keys</code>は600に設定することが一般的です。</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">Bash</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">chmod</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">700</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh</span></span>
<span class="line"><span style="color: #DCDCAA">chmod</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">600</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/.ssh/authorized_keys</span></span></code></pre></div>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">SSHはサーバーとの通信になくてはならない技術です。</p>



<p class="wp-block-paragraph">また、一口にSSH接続といっても二種類の認証方法があるのでした。</p>



<div class="wp-block-group has-border -border01"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<ul class="wp-block-list">
<li>パスワード方式</li>



<li>公開鍵方式</li>
</ul>
</div></div>



<p class="wp-block-paragraph">一般的にはセキュリティの高い公開鍵方式が採用されます。</p>



<p class="wp-block-paragraph">公開鍵方式ではパスワードなしでログインできるようになりますが、セキュリティ強化のためにパスフレーズが設定されることもあります。</p>



<p class="wp-block-paragraph">公開鍵方式は初期設定が少し面倒なので、本記事の内容を参考に手順を覚えていっていただけたら幸いです。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
