<?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/"
	xmlns:media="http://search.yahoo.com/mrss/">

<channel>
	<title>estampie</title>
	<atom:link href="https://blog.estampie.work/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.estampie.work</link>
	<description>のくの備忘録サイトです。</description>
	<lastBuildDate>Mon, 10 Nov 2025 00:16:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
<atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
<atom:link rel="hub" href="https://websubhub.com/hub"/>
<atom:link rel="self" href="https://blog.estampie.work/feed"/>
	<item>
		<title>obsidianで読書管理</title>
		<link>https://blog.estampie.work/archives/4416</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Wed, 05 Nov 2025 15:30:45 +0000</pubDate>
				<category><![CDATA[obsidian]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=4416</guid>

					<description><![CDATA[最近Notionよりも軽くて好きな機能だけプラグインで入れられるobsidianを多用しています。 同期はObsidian Self-hosted LiveSyncを使用しているのでスマホともサクサク同期が出来て良いです [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-164328.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-164328-1024x551.png" alt="" class="wp-image-4501" style="width:500px"/></a></figure>
</div>


<p>最近Notionよりも軽くて好きな機能だけプラグインで入れられる<a href="https://obsidian.md/">obsidian</a>を多用しています。</p>



<p>同期は<a href="https://github.com/vrtmrz/obsidian-livesync">Obsidian Self-hosted LiveSync</a>を使用しているのでスマホともサクサク同期が出来て良いです。</p>



<p>Obsidian Self-hosted LiveSyncはこちらのサイトを参考に自宅鯖にDockerでCouchDBサーバを立てて運用しています。</p>



<style>
.simpleblogcard_img_block1fa04ef8f7eed1d40e2163b454d89b54 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border1fa04ef8f7eed1d40e2163b454d89b54 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title1fa04ef8f7eed1d40e2163b454d89b54 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description1fa04ef8f7eed1d40e2163b454d89b54 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://zenn.dev/false/articles/0013-baa404ed0412e8 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_block1fa04ef8f7eed1d40e2163b454d89b54">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 52px;" src="https://res.cloudinary.com/zenn/image/upload/s--vlgXA_sS--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_72:Obsidian%2520Self-hosted%2520LiveSync%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:false%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9saDMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL2EtL0FPaDE0R2o0OVhvUm9PLTNoU2Y5VjhPTTZMeHNMaWg1cmpUV0lQUVZIeVF4blE9czI1MC1j%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png?_a=BACAGSGT" alt="Obsidian Self-hosted LiveSync" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border1fa04ef8f7eed1d40e2163b454d89b54">
			zenn.dev			<div class="simpleblogcard_title1fa04ef8f7eed1d40e2163b454d89b54">
				Obsidian Self-hosted LiveSync			</div>
							<div class="simpleblogcard_description1fa04ef8f7eed1d40e2163b454d89b54">
									</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<p>obsidianテーマはPrimaryを使用しています。</p>



<h2 class="wp-block-heading">obsidianで読書管理</h2>



<p></p>



<p>obsidianのBook-Searchプラグインにタイトルなどを入力すると自動で書籍情報をネットから拾ってきてくれるので、それを自動集計プラグインDataview使って取り込んだ本データを一覧に出せるようにしています</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-170216.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-170216.png" alt="" class="wp-image-4495" style="width:500px"/></a></figure>
</div>


<p>各書籍のページはデフォルトでこんな感じ。（発行日は邦訳でなく原作の初版発行日を入れています）</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-165659.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-165659-618x1024.png" alt="" class="wp-image-4490" style="width:500px"/></a></figure>
</div>


<p>フォルダ構成はこんな感じで、booksフォルダ内に各書籍のページデータ、本棚ファイルにはDateviewのコードを記述しています。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-170322.png" alt="" class="wp-image-4497"/></figure>
</div>


<p>書籍データはBook-searchプラグインがネット上から取得してくれますが、発行日など上手く取れなかった場合は手動で入力しています。</p>



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



<p>設定→コミュニティプラグインから<strong>Book Search</strong>と<strong>Dataview</strong>プラグインを検索してインストールし、それぞれ有効化します。</p>



<p></p>



<h3 class="wp-block-heading">Book Searchの設定</h3>



<p>適当なフォルダに<strong>book-template.md</strong>を作成します（名前は何でもいいです）。自分の場合templetesフォルダを作成したので<strong>templetes/book-template.md</strong>になります。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">book-template.md</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>---
title: "{{title}}"
author: "{{author}}"
publisher: "{{publisher}}"
publishedDate: "{{publishDate}}"
isbn: "{{isbn13}}"
series:
genre:
tags:
  - "読書"
  - "{{author}}"
cover: "{{coverUrl}}"
---

# {{title}}

&lt;img src="{{coverUrl}}" alt="{{title}}" width="200px">

**著者:** {{author}}  
**出版社:** {{publisher}}  
**発行日:** {{publishDate}}  

---

## 概要
{{description}}

---

## 備考・メモ
- </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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">---</span></span>
<span class="line"><span style="color: #8FBCBB">title</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{title}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">author</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{author}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">publisher</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{publisher}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">publishedDate</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{publishDate}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">isbn</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{isbn13}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">series</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #8FBCBB">genre</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #8FBCBB">tags</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">読書</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{author}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">cover</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">{{coverUrl}}</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">---</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># {{title}}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C">&lt;img src=&quot;{{coverUrl}}&quot; alt=&quot;{{title}}&quot; width=&quot;200px&quot;&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9">*著者:**</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{{</span><span style="color: #A3BE8C">author</span><span style="color: #ECEFF4">}}</span><span style="color: #D8DEE9FF">  </span></span>
<span class="line"><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9">*出版社:**</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{{</span><span style="color: #A3BE8C">publisher</span><span style="color: #ECEFF4">}}</span><span style="color: #D8DEE9FF">  </span></span>
<span class="line"><span style="color: #ECEFF4">*</span><span style="color: #D8DEE9">*発行日:**</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{{</span><span style="color: #A3BE8C">publishDate</span><span style="color: #ECEFF4">}}</span><span style="color: #D8DEE9FF">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">---</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">## 概要</span></span>
<span class="line"><span style="color: #ECEFF4">{{</span><span style="color: #A3BE8C">description</span><span style="color: #ECEFF4">}}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">---</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">## 備考・メモ</span></span>
<span class="line"><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span></span></code></pre></div>



<p>必要な情報があればテンプレートに追加します。（<code>translator:</code>で翻訳者や<code>readDate:</code>で読書完了日、未読/既読フラグなど）isbnは古い本だとisbn10なので二項目作ってもいいかも</p>



<p>また、Book-Searchプラグインでwebから取得できる情報は<a href="https://github.com/anpigon/obsidian-book-search-plugin?tab=readme-ov-file#template-variables-definitions">こちらを参照</a>。</p>



<p><strong>設定→Book Search</strong>から<strong>Templete file</strong>の項目に上記のテンプレートファイルを設定します。ついでに<strong>New File location</strong>に書籍ファイルのデフォルトの作成場所を指定しておきます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-170456.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-170456.png" alt="" class="wp-image-4498" style="width:500px"/></a></figure>
</div>


<p>また可能であればGoogle CloudにてAPIキーを作成し、APIライブラリからBooks APIをONにしてAPIキー欄に打ち込みます。これでGoogle Booksからデータを取得出来るようになります。</p>



<h4 class="wp-block-heading">書籍の登録</h4>



<p><code>Ctrl+P</code>を押して<strong>Book Search: Create new book note</strong>を選択し、出てきたウィンドウにタイトルなどを打ち込むと指定したフォルダに書影のファイルが作成されます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-05-235029.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-05-235029.png" alt="" class="wp-image-4422" style="width:500px"/></a></figure>
</div>


<p>取得出来ない情報は手打ちで入力していきます。</p>



<p>読み終えた感想なども手打ちで最後の備考メモに書いていきます。</p>



<p>このメニュー（Book Search: Create new book note）はobsidianの設定→ホットキーから<code>Ctrl+B</code>などに設定しておくと便利です。</p>



<h4 class="wp-block-heading">Dateviewで一覧画面を作成</h4>



<p>書籍一覧を表示したいページを作成し、下記を入力します。</p>



<p>FROMには書影ファイルの入っているフォルダを指定してください。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">本棚</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>```dataview
TABLE WITHOUT ID
"[&#91;" + file.path + "|" + title + "&#93;]" AS "タイトル",
author AS "著者",
dateformat(publishedDate, "yyyy/MM/dd") AS "発行日",
series
FROM "読書/books"
SORT author ASC, publishedDate ASC
```</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">```dataview</span></span>
<span class="line"><span style="color: #8FBCBB">TABLE WITHOUT ID</span></span>
<span class="line"><span style="color: #8FBCBB">&quot;[&#91;&quot; + file.path + &quot;|&quot; + title + &quot;&#93;]&quot; AS &quot;タイトル&quot;,</span></span>
<span class="line"><span style="color: #8FBCBB">author AS &quot;著者&quot;,</span></span>
<span class="line"><span style="color: #8FBCBB">dateformat(publishedDate, &quot;yyyy/MM/dd&quot;) AS &quot;発行日&quot;,</span></span>
<span class="line"><span style="color: #8FBCBB">series</span></span>
<span class="line"><span style="color: #8FBCBB">FROM &quot;読書/books&quot;</span></span>
<span class="line"><span style="color: #8FBCBB">SORT author ASC, publishedDate ASC</span></span>
<span class="line"><span style="color: #8FBCBB">```</span></span></code></pre></div>



<p>上記では発行日→著者名の順でソートします。SORT部分を<code>publishedDate ASC</code>のみにすれば発行日順となります。</p>



<p><code>WHERE genre = "ミステリ"</code>をFROMの行の下に入れるとジャンルだけで絞り込めます。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-165743.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-165743.png" alt="" class="wp-image-4493" style="width:500px"/></a></figure>
</div>


<p>作成したファイルは<a href="https://github.com/bwydoogh/obsidian-force-view-mode-of-note">Force note view mode</a>プラグインで閲覧モード固定にしておくと便利です。</p>



<p>また、Dataviewの設定でJavascriptを有効化するとさらに色々できます。</p>



<p>下記では作者の一番古い本を参照し、作者ごとに年代順に並べることができます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">本棚-作者順</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>```dataviewjs
const P = dv.pages('"読書/books"')
  .where(p => p.author &amp;&amp; p.publishedDate)
  .array();

// 著者ごとの最古発行日を計算（ソート用）
const oldestByAuthor = {};
for (const p of P) {
  const author = p.author;
  const dateMs = dv.date(p.publishedDate).toMillis();
  if (!(author in oldestByAuthor) || dateMs &lt; oldestByAuthor&#91;author&#93;) {
    oldestByAuthor&#91;author&#93; = dateMs;
  }
}

const rows = P
  .map(r => ({
    author: r.author,
    title: r.title ?? r.file.name,
    path: r.file.path,
    published: dv.date(r.publishedDate).toMillis(),
    series: r.series ?? "",
    sortKey: oldestByAuthor&#91;r.author&#93;
  }))
  .sort((a, b) =>
    a.sortKey - b.sortKey || a.published - b.published
  );

dv.table(
  &#91;"タイトル", "著者", "発行日", "シリーズ"&#93;,
  rows.map(r => [
    `[&#91;${r.path}|${r.title}&#93;]`,
    r.author,
    dv.luxon.DateTime.fromMillis(r.published).toFormat("yyyy/MM/dd"),
    r.series
  ])
);</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">```dataviewjs</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">P</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">dv</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">pages</span><span style="color: #8FBCBB">(</span><span style="color: #81A1C1">&#39;</span><span style="color: #A3BE8C">&quot;読書/books&quot;</span><span style="color: #81A1C1">&#39;</span><span style="color: #8FBCBB">)</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">where</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">p</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">p</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">author</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">&amp;&amp;</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">p</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">publishedDate</span><span style="color: #8FBCBB">)</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">array</span><span style="color: #8FBCBB">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// 著者ごとの最古発行日を計算（ソート用）</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">oldestByAuthor</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=</span><span style="color: #8FBCBB"> {}</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">for</span><span style="color: #8FBCBB"> (</span><span style="color: #81A1C1">const</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">p</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">of</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">P</span><span style="color: #8FBCBB">) {</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #81A1C1">const</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">author</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">p</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">author</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #81A1C1">const</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">dateMs</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">dv</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">date</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">p</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">publishedDate</span><span style="color: #8FBCBB">)</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">toMillis</span><span style="color: #8FBCBB">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #81A1C1">if</span><span style="color: #8FBCBB"> (</span><span style="color: #81A1C1">!</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">author</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">in</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">oldestByAuthor</span><span style="color: #8FBCBB">) </span><span style="color: #81A1C1">||</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">dateMs</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">oldestByAuthor</span><span style="color: #8FBCBB">&#91;</span><span style="color: #D8DEE9">author</span><span style="color: #8FBCBB">&#93;) {</span></span>
<span class="line"><span style="color: #8FBCBB">    </span><span style="color: #D8DEE9">oldestByAuthor</span><span style="color: #8FBCBB">&#91;</span><span style="color: #D8DEE9">author</span><span style="color: #8FBCBB">&#93; </span><span style="color: #81A1C1">=</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">dateMs</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #8FBCBB">  }</span></span>
<span class="line"><span style="color: #8FBCBB">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">rows</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">P</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">map</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">r</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #8FBCBB"> ({</span></span>
<span class="line"><span style="color: #8FBCBB">    author</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">author</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    title</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">title</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">??</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">name</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    path</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">file</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">path</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    published</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">dv</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">date</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">publishedDate</span><span style="color: #8FBCBB">)</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">toMillis</span><span style="color: #8FBCBB">()</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    series</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">series</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">??</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">&quot;&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    sortKey</span><span style="color: #ECEFF4">:</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">oldestByAuthor</span><span style="color: #8FBCBB">&#91;</span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">author</span><span style="color: #8FBCBB">&#93;</span></span>
<span class="line"><span style="color: #8FBCBB">  }))</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">sort</span><span style="color: #8FBCBB">(</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">,</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">)</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=&gt;</span></span>
<span class="line"><span style="color: #8FBCBB">    </span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sortKey</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">-</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">sortKey</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">||</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">a</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">published</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">-</span><span style="color: #8FBCBB"> </span><span style="color: #D8DEE9">b</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">published</span></span>
<span class="line"><span style="color: #8FBCBB">  )</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">dv</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">table</span><span style="color: #8FBCBB">(</span></span>
<span class="line"><span style="color: #8FBCBB">  &#91;</span><span style="color: #81A1C1">&quot;</span><span style="color: #A3BE8C">タイトル</span><span style="color: #81A1C1">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">&quot;</span><span style="color: #A3BE8C">著者</span><span style="color: #81A1C1">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">&quot;</span><span style="color: #A3BE8C">発行日</span><span style="color: #81A1C1">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">&quot;</span><span style="color: #A3BE8C">シリーズ</span><span style="color: #81A1C1">&quot;</span><span style="color: #8FBCBB">&#93;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">  </span><span style="color: #D8DEE9">rows</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">map</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">r</span><span style="color: #8FBCBB"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #8FBCBB"> [</span></span>
<span class="line"><span style="color: #8FBCBB">    </span><span style="color: #81A1C1">`</span><span style="color: #A3BE8C">[&#91;</span><span style="color: #8FBCBB">${</span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">path</span><span style="color: #8FBCBB">}</span><span style="color: #A3BE8C">|</span><span style="color: #8FBCBB">${</span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">title</span><span style="color: #8FBCBB">}</span><span style="color: #A3BE8C">&#93;]</span><span style="color: #81A1C1">`</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">author</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    </span><span style="color: #D8DEE9">dv</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">luxon</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">DateTime</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">fromMillis</span><span style="color: #8FBCBB">(</span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">published</span><span style="color: #8FBCBB">)</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">toFormat</span><span style="color: #8FBCBB">(</span><span style="color: #81A1C1">&quot;</span><span style="color: #A3BE8C">yyyy/MM/dd</span><span style="color: #81A1C1">&quot;</span><span style="color: #8FBCBB">)</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #8FBCBB">    </span><span style="color: #D8DEE9">r</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">series</span></span>
<span class="line"><span style="color: #8FBCBB">  ])</span></span>
<span class="line"><span style="color: #8FBCBB">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-165727.png"><img decoding="async" src="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-165727.png" alt="" class="wp-image-4491" style="width:500px"/></a></figure>
</div>


<p>最初のコードでは著者名順でしたが、こちらでは作者の年代ごとに並べることができます。</p>



<p>あとは書籍を追加する度に自動で更新してくれるので楽ちん！だいぶ便利です</p>



<p></p>
]]></content:encoded>
					
		
		
		<media:thumbnail url="https://img.estampie.work/wps/2025/11/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-11-09-164328-150x150.png" width="150" height="150" />	</item>
		<item>
		<title>小説のgit管理 iPhone用メモ</title>
		<link>https://blog.estampie.work/archives/4356</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Tue, 08 Jul 2025 14:10:18 +0000</pubDate>
				<category><![CDATA[小説]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=4356</guid>

					<description><![CDATA[家のサーバーにgitのリモートリポジトリを置いて小説をgit管理しています。 リポジトリは自宅鯖(123.456.789.01)の/home/owner/novel/mynovel.gitにあると想定して記述します。 （ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>家のサーバーにgitのリモートリポジトリを置いて小説をgit管理しています。</p>



<p>リポジトリは自宅鯖(123.456.789.01)の<strong>/home/owner/novel/mynovel.git</strong>にあると想定して記述します。</p>



<p>（もちろん<a href="https://github.co.jp/">GitHub</a>で非公開のリポジトリを作成してOK、ただしGithubは性的な内容は置けないので注意）</p>



<p>iPhoneで編集したりするので設定メモです。</p>



<p>Androidでも<a href="https://f-droid.org/en/packages/com.termux/">Termux</a>などのLinuxエミュを使えば同様に行えます。(Turmuxの場合<code>apt</code>コマンド、ストレージは<code>termux-setup-storage</code>コマンドで連携)</p>


<p class="mymore"><a href="https://blog.estampie.work/archives/4356">続きを読む</a></p>


<span id="more-4356"></span>



<h2 class="wp-block-heading">iOSでのgit管理</h2>



<h4 class="wp-block-heading">iSH導入</h4>



<p>iPhoneにLinuxエミュの<a href="https://apps.apple.com/jp/app/ish-shell/id1436902243">iSH</a>をインストールします。</p>



<h4 class="wp-block-heading">ssh接続</h4>



<p><strong>iSH</strong>はAlpine Linuxなので<code>apk</code>コマンドで<strong>openssh</strong>を追加、さらに<strong>~/ssh</strong>フォルダと空の<strong>~/ssh/config</strong>ファイルを作成</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>apk update
apk add openssh
mkdir ssh
echo -n > ssh/config</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">apk</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span></span>
<span class="line"><span style="color: #88C0D0">apk</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">openssh</span></span>
<span class="line"><span style="color: #88C0D0">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ssh</span></span>
<span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ssh/config</span></span></code></pre></div>



<p>iPhoneのファイルブラウザでiSH→rootフォルダ→sshフォルダへ移動</p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><a href="https://img.estampie.work/wps/2025/07/IMG_5406.jpg"><img fetchpriority="high" decoding="async" width="749" height="630" src="https://img.estampie.work/wps/2025/07/IMG_5406.jpg" alt="" class="wp-image-4366" style="width:400px" srcset="https://img.estampie.work/wps/2025/07/IMG_5406-300x252.jpg 300w, https://img.estampie.work/wps/2025/07/IMG_5406.jpg 749w" sizes="(max-width: 749px) 100vw, 749px" /></a></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="598" height="1024" src="https://img.estampie.work/wps/2025/07/IMG_5407-598x1024.jpg" alt="" class="wp-image-4368" style="width:400px" srcset="https://img.estampie.work/wps/2025/07/IMG_5407-175x300.jpg 175w, https://img.estampie.work/wps/2025/07/IMG_5407-598x1024.jpg 598w, https://img.estampie.work/wps/2025/07/IMG_5407.jpg 750w" sizes="(max-width: 598px) 100vw, 598px" /><figcaption class="wp-element-caption">Screenshot</figcaption></figure>
</div>


<p>先に自宅サーバのssh接続の秘密鍵ファイル（ここでは<strong>id_mypc</strong>）をicloud経由などで端末にコピーしておき、<strong>iSH/root/ssh</strong>フォルダ内に放り込んでおく</p>



<p>さらに端末上のファイルが変更できるタイプのテキストエディタで<strong>iSH/root/ssh/config</strong>ファイルを編集し、ホスト名：mypcで簡単に接続できるよう設定</p>



<p>（<code>apk add vim</code>などでvimやnanoを入れてiSH上から編集してもOK）</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH/root/ssh/config</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>Host mypc
    HostName 123.456.789.01 # 自鯖のipアドレス
    Port 22                 # 自鯖のsshポート
    User owner              # 自鯖のユーザ名
    IdentityFile ~/.ssh/id_mypc  # 秘密鍵ファイルの場所</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">Host</span><span style="color: #D8DEE9FF"> mypc</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">HostName</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">123</span><span style="color: #D8DEE9FF">.</span><span style="color: #B48EAD">456</span><span style="color: #D8DEE9FF">.</span><span style="color: #B48EAD">789</span><span style="color: #D8DEE9FF">.</span><span style="color: #B48EAD">01</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># 自鯖のipアドレス</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">Port</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">22</span><span style="color: #D8DEE9FF">                 </span><span style="color: #616E88"># 自鯖のsshポート</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">User</span><span style="color: #D8DEE9FF"> owner              </span><span style="color: #616E88"># 自鯖のユーザ名</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">IdentityFile</span><span style="color: #D8DEE9FF"> ~/.ssh/id_mypc  </span><span style="color: #616E88"># 秘密鍵ファイルの場所</span></span></code></pre></div>



<p>ここまで設定したら<strong>ssh</strong>フォルダを<strong>.ssh</strong>へリネーム(ファイルブラウザからは隠しファイルへアクセスできないため)</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>mv ssh/ .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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">mv</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ssh/</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.ssh/</span></span></code></pre></div>



<p>ファイルの権限を変更</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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 600 ~/.ssh/config ~/.ssh/id_mypc</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">chmod</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">600</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">~/.ssh/config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">~/.ssh/id_mypc</span></span></code></pre></div>



<p>ここまで出来たら下記コマンドでssh接続が出来るかテスト</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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 mypc</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">ssh</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mypc</span></span></code></pre></div>



<p>fingerprintを聞かれたらyesにして接続テスト完了　<code>exit</code>コマンドで終了する</p>



<h4 class="wp-block-heading">git導入</h4>



<p>gitのインストールと初期設定を行います。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">Bash</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>apk add git
git config --global user.name "名前"
git config --global user.email "メアド"</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">apk</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">git</span></span>
<span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--global</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">user.name</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">名前</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--global</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">user.email</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">メアド</span><span style="color: #ECEFF4">&quot;</span></span></code></pre></div>



<p>ssh接続でリポジトリから<code>git clone</code>します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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>git clone ssh://mypc/home/owner/novel/mynovel.git</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clone</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ssh://mypc/home/owner/novel/mynovel.git</span></span></code></pre></div>



<p>これで小説の取り込みとファイルブラウザから<strong>iSH/root/mynovel/</strong>フォルダ以下で小説が編集できるようになりました。</p>



<h4 class="wp-block-heading">pull,commit→pushを簡略化する</h4>



<p>次に<code>git pull</code>したり小説を編集したあとコミット&amp;pushするのが手間なのでコマンド化します。</p>



<p><strong>~/pull.sh</strong>と<strong>~/push.sh</strong>ファイルを新規作成します</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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 -n > pull.sh
echo -n > push.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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pull.sh</span></span>
<span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-n</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push.sh</span></span></code></pre></div>



<p>iOSのテキストエディタかvimなどで編集します</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">~/pull.sh</span><span role="button" tabindex="0" style="color:#d8dee9ff;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/sh

cd /root/mynovel
git pull
cd ../</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#!/bin/sh</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/root/mynovel</span></span>
<span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pull</span></span>
<span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">../</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">~/push.sh</span><span role="button" tabindex="0" style="color:#d8dee9ff;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/sh

cd /root/mynovel
git add -A
git commit -m "iOS"
git push
cd ../</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">#!/bin/sh</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/root/mynovel</span></span>
<span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-A</span></span>
<span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">commit</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-m</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">iOS</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #88C0D0">git</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push</span></span>
<span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">../</span></span></code></pre></div>



<p>権限を付与</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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 +x pull.sh push.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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">chmod</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+x</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pull.sh</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push.sh</span></span></code></pre></div>



<p>上記でコミットコメント「iOS」で毎回コミットする設定になります。</p>



<p>これらをコマンド化します。iSHで下記コマンドを実行</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">iSH</span><span role="button" tabindex="0" style="color:#d8dee9ff;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 'alias pull="$HOME/pull.sh"' >> ~/.profile
echo 'alias push="$HOME/push.sh"' >> ~/.profile
. ~/.profile</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">alias pull=&quot;$HOME/pull.sh&quot;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">~/.profile</span></span>
<span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">alias push=&quot;$HOME/push.sh&quot;</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">~/.profile</span></span>
<span class="line"><span style="color: #88C0D0">.</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">~/.profile</span></span></code></pre></div>



<p>これでPCで小説を編集した後はiSH上で<code>pull</code>と打つとgit pull出来て端末上に最新ファイルを同期でき、iPhoneで小説を編集した後iSH上で<code>push</code>コマンドを打つだけでリモートリポジトリへコミット＆pushができるようになります。</p>



<div class="wp-block-luxe-blocks-border-block" style="margin-top:10px;margin-bottom:30px"><div class="wp-block-luxe-blocks-border-block-content" style="border:1px solid #006edc;border-radius:0px;padding:0px 15px 0px 15px">
<p>・PCなどで小説を編集しpushしたあと→iSHで<code>pull</code></p>



<p>・iPhoneで小説を編集したあと→iSHで<code>push</code></p>
</div></div>



<p>お疲れさまでした！</p>



<p>競合が発生したときは<code>git diff --name-only --diff-filter=U</code>とかで手動解決してるかも</p>



<p></p>



<h2 class="wp-block-heading">iPhoneでの小説執筆テキストエディタ</h2>



<p>git管理するにはファイルブラウザでiSH上のファイルを編集できないといけないので、いくつか挙げておきます。</p>



<p><a href="https://apps.apple.com/jp/app/koder-code-editor/id1447489375">koder</a>　無料コード用簡易エディタ。行番号さえ消せたらこれで書きたかったかも</p>



<p><a href="https://apps.apple.com/jp/app/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF-liquidlogic/id1458566442">LiquidLogic</a>　コードエディタの中では使いやすい部類の印象</p>



<p><a href="https://apps.apple.com/jp/app/runestone-text-editor/id1548193893">Runestone</a>　コードエディタ。テーマが変えやすいかも</p>



<p><a href="https://apps.apple.com/jp/app/ia-writer/id775737172">iA Writer</a>　3000円買い切りアプリですが、今のところ無駄なアイコンなどがなく一番集中して使いやすいのでこれを使用しています。小説を.mdファイル(マーウダウン形式)として作成しておくと見出しもつけられて便利です。最初に設定→エディタ→インデントで「折り返しインデントに含む：ホワイトスペース」をオフにしておかないと段落の字下げが変になるのでここ設定おすすめ。</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Next.js15のアップロード上限を回避</title>
		<link>https://blog.estampie.work/archives/4271</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Sun, 13 Apr 2025 06:59:11 +0000</pubDate>
				<category><![CDATA[Next.js]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Nextjs]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=4271</guid>

					<description><![CDATA[画像をMiniOサーバにアップロードするアプリを作成してビルド後自鯖にデプロイしてみたところ、Server Actionsの1MB制限に引っかかってしまいアップロードできない事態に見舞われました。開発環境だと問題なく上げ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>画像をMiniOサーバにアップロードするアプリを作成してビルド後自鯖にデプロイしてみたところ、Server Actionsの1MB制限に引っかかってしまいアップロードできない事態に見舞われました。開発環境だと問題なく上げられたのでちょっと困りました。</p>



<p>Next.js13以下ではnext.config.tsに下記を追加することで回避できたようですが、Next.js15 App Routerでは使用できません。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">next.config.ts</span><span role="button" tabindex="0" data-code="// Next.js13以前の設定
import type { NextConfig } from &quot;next&quot;;

const nextConfig: NextConfig = {
  // これを追記
  experimental: {
    serverActions: {
      bodySizeLimit: '500mb',
    },
  },
};

export default nextConfig;" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">// Next.js13以前の設定</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NextConfig</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">next</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nextConfig</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">NextConfig</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">// これを追記</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">experimental</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">serverActions</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #D8DEE9">bodySizeLimit</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">500mb</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nextConfig</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p>Next.js15ではスタンドアロンモード（最小限の構成でビルド）でデプロイすることでExpressのserver.js側でアップロード上限を設定できるようなのでやってみました。next.config.tsに下記を追記します。</p>



<div class="blogcard"><a href="https://nextjs.org/docs/pages/api-reference/config/next-config-js/output" target="_blank" rel="noopener noreferrer" data-blogcard="1">Next.js &#8211; Configuration next.config.js > Options > output</a></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">next.config.ts</span><span role="button" tabindex="0" data-code="import type { NextConfig } from &quot;next&quot;;

const nextConfig: NextConfig = {
  // スタンドアロンモードで出力
  output: &quot;standalone&quot;,
};

export default nextConfig;" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">type</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">NextConfig</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">next</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nextConfig</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">NextConfig</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">// スタンドアロンモードで出力</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">output</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">standalone</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">nextConfig</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p>設定系は<strong>/myapp/.env.production</strong>に書いています。</p>



<p>ディレクトリ構成が下記になっているので適宜変更してください。</p>



<pre style="line-height:100%">/
├─ myapp/ (Next.jsアプリ)
│  ├─ app/
│  │  └─ page.tsx
│  ├─ .env.production
│  ├─ next.config.ts
│  ├─ package.json
│  ├─ package.lock.json
│  ├─ server.js
│  └─ tsconfig.json
└─ docker-compose.yml</pre>



<p>自前でserver.jsを用意します</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">server.js</span><span role="button" tabindex="0" data-code="/* eslint-disable @typescript-eslint/no-require-imports */

// server.js
const express = require(&quot;express&quot;);
const next = require(&quot;next&quot;);
const path = require(&quot;path&quot;);

const port = parseInt(process.env.PORT || &quot;3000&quot;, 10);
const dev = process.env.NODE_ENV !== &quot;production&quot;;

const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() =&gt; {
  const server = express();

  // 最大アップロードサイズを設定
  server.use(express.json({ limit: &quot;500mb&quot; }));
  server.use(express.urlencoded({ extended: true, limit: &quot;500mb&quot; }));
  
  server.use(
    &quot;/_next/static&quot;,
    express.static(path.join(__dirname, &quot;.next/static&quot;))
  );

  server.all(&quot;*&quot;, (req, res) =&gt; {
    return handle(req, res);
  });

  server.listen(port, () =&gt; {
    console.log(`&gt; Ready on http://localhost:${port}`);
  });
});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88">/* eslint-disable @typescript-eslint/no-require-imports */</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88">// server.js</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">express</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">require</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">express</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">next</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">require</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">next</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">path</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">require</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">path</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">port</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">parseInt</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">PORT</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">||</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3000</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">10</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">process</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">NODE_ENV</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">!==</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">production</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">next</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">dev</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">handle</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">getRequestHandler</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9">app</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">prepare</span><span style="color: #D8DEE9FF">()</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">then</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">express</span><span style="color: #D8DEE9FF">()</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">  </span><span style="color: #616E88">// 最大アップロードサイズを設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">use</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">express</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">json</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">limit</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">500mb</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">use</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">express</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">urlencoded</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">extended</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">limit</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">500mb</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">))</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">use</span><span style="color: #D8DEE9FF">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/_next/static</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">express</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">static</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">path</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">join</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">__dirname</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">.next/static</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">  )</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">all</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">*</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">req</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">res</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">handle</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">req</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">res</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">server</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">listen</span><span style="color: #D8DEE9FF">(</span><span style="color: #D8DEE9">port</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">console</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">log</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">`</span><span style="color: #A3BE8C">&gt; Ready on http://localhost:</span><span style="color: #81A1C1">${</span><span style="color: #D8DEE9">port</span><span style="color: #81A1C1">}</span><span style="color: #ECEFF4">`</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">Dockerfile</span><span role="button" tabindex="0" data-code="# Dockerfile

FROM node:20-alpine AS base
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci

FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=base /app/node_modules ./node_modules
COPY . .
RUN npm run build

# 本番用
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production

COPY --from=builder /app/public ./public
COPY --from=builder /app/.next ./.next
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./package.json
COPY --from=builder /server.js ./server.js

# Next standalone実行に必要
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static

EXPOSE 3000
CMD [&quot;node&quot;, &quot;server.js&quot;]" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Dockerfile</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">FROM</span><span style="color: #D8DEE9FF"> node:20-alpine </span><span style="color: #81A1C1">AS</span><span style="color: #D8DEE9FF"> base</span></span>
<span class="line"><span style="color: #81A1C1">WORKDIR</span><span style="color: #D8DEE9FF"> /app</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> package.json package-lock.json ./</span></span>
<span class="line"><span style="color: #81A1C1">RUN</span><span style="color: #D8DEE9FF"> npm ci</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">FROM</span><span style="color: #D8DEE9FF"> node:20-alpine </span><span style="color: #81A1C1">AS</span><span style="color: #D8DEE9FF"> builder</span></span>
<span class="line"><span style="color: #81A1C1">WORKDIR</span><span style="color: #D8DEE9FF"> /app</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=base /app/node_modules ./node_modules</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> . .</span></span>
<span class="line"><span style="color: #81A1C1">RUN</span><span style="color: #D8DEE9FF"> npm run build</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 本番用</span></span>
<span class="line"><span style="color: #81A1C1">FROM</span><span style="color: #D8DEE9FF"> node:20-alpine </span><span style="color: #81A1C1">AS</span><span style="color: #D8DEE9FF"> runner</span></span>
<span class="line"><span style="color: #81A1C1">WORKDIR</span><span style="color: #D8DEE9FF"> /app</span></span>
<span class="line"><span style="color: #81A1C1">ENV</span><span style="color: #D8DEE9FF"> NODE_ENV=production</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /app/public ./public</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /app/.next ./.next</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /app/node_modules ./node_modules</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /app/package.json ./package.json</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /server.js ./server.js</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># Next standalone実行に必要</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /app/.next/standalone ./</span></span>
<span class="line"><span style="color: #81A1C1">COPY</span><span style="color: #D8DEE9FF"> --from=builder /app/.next/static ./.next/static</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">EXPOSE</span><span style="color: #D8DEE9FF"> 3000</span></span>
<span class="line"><span style="color: #81A1C1">CMD</span><span style="color: #D8DEE9FF"> [</span><span style="color: #A3BE8C">&quot;node&quot;</span><span style="color: #D8DEE9FF">, </span><span style="color: #A3BE8C">&quot;server.js&quot;</span><span style="color: #D8DEE9FF">]</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">docker-compose.yml</span><span role="button" tabindex="0" data-code="services:
  app:
    build:
      context: ./myapp
      dockerfile: Dockerfile
    container_name: myapp-app
    restart: unless-stopped
    ports:
      - &quot;3000:3000&quot;
    environment:
      - NODE_ENV=production
    env_file:
      - ./myapp/.env.production
    depends_on:
      - db

volumes:
  postgres_data:" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">build</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">context</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./myapp</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">dockerfile</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Dockerfile</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">myapp-app</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">unless-stopped</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">3000:3000</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">NODE_ENV=production</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">env_file</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./myapp/.env.production</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">depends_on</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">db</span></span>
<span class="line"></span>
<span class="line"><span style="color: #8FBCBB">volumes</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">postgres_data</span><span style="color: #ECEFF4">:</span></span></code></pre></div>



<p>あとはNginx側でもclient_max_body_sizeを設定してあげます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">Nginx</span><span role="button" tabindex="0" data-code="server {
    listen 32222 ssl;
    ssl_certificate /home/owner/system/pem/server_cert.pem;
    ssl_certificate_key /home/owner/system/pem/server_key.pem;
    client_max_body_size 500m; # ここで上限設定
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">server</span><span style="color: #D8DEE9FF"> {</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1"> listen </span><span style="color: #D8DEE9FF">32222 ssl</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1"> ssl_certificate </span><span style="color: #D8DEE9FF">/home/owner/system/pem/server_cert.pem</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1"> ssl_certificate_key </span><span style="color: #D8DEE9FF">/home/owner/system/pem/server_key.pem</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1"> client_max_body_size </span><span style="color: #D8DEE9FF">500m</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># ここで上限設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">location</span><span style="color: #D8DEE9FF"> / {</span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span><span style="color: #81A1C1"> proxy_pass </span><span style="color: #D8DEE9FF">http://localhost:3000</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span><span style="color: #81A1C1"> proxy_set_header </span><span style="color: #D8DEE9FF">Host </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">host</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span><span style="color: #81A1C1"> proxy_set_header </span><span style="color: #D8DEE9FF">X-Real-IP </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">remote_addr</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span><span style="color: #81A1C1"> proxy_set_header </span><span style="color: #D8DEE9FF">X-Forwarded-For </span><span style="color: #81A1C1">$</span><span style="color: #D8DEE9">proxy_add_x_forwarded_for</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    }</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span></code></pre></div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Next.jsのApp routerの同じファイル名だらけでタブの視認性が悪い問題解決</title>
		<link>https://blog.estampie.work/archives/4262</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Fri, 11 Apr 2025 14:54:08 +0000</pubDate>
				<category><![CDATA[Next.js]]></category>
		<category><![CDATA[VScode]]></category>
		<category><![CDATA[Nextjs]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=4262</guid>

					<description><![CDATA[Next.jsのApp routerの同じファイル名だらけでタブの視認性が悪い問題解決！ globパターンが分かってなくてちょっと戸惑いました VScodeのsetteing.jsonに下記 admin/*/*/page [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Next.jsのApp routerの同じファイル名だらけでタブの視認性が悪い問題解決！</p>



<p>globパターンが分かってなくてちょっと戸惑いました</p>



<div class="blogcard"><a href="https://code.visualstudio.com/updates/v1_88#_custom-labels-for-open-editors" target="_blank" rel="noopener noreferrer" data-blogcard="1">Custom labels for open editors</a></div>



<p>VScodeのsetteing.jsonに下記</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">setting.json</span><span role="button" tabindex="0" data-code="  // タブ名カスタム
  &quot;workbench.editor.customLabels.enabled&quot;: true,
  &quot;workbench.editor.customLabels.patterns&quot;: {
    &quot;**/admin/*/*/page.tsx&quot;: &quot;${dirname(1)}${dirname(0)} - Page&quot;,
    &quot;**/admin/*/page.tsx&quot;: &quot;${dirname} - Page&quot;,
    &quot;**/api/*/*/route.ts&quot;: &quot;${dirname(1)}${dirname(0)} - API&quot;,
    &quot;**/api/*/route.ts&quot;: &quot;${dirname} - API&quot;,
    &quot;**/layout.tsx&quot;: &quot;${dirname} - Layout&quot;,
    &quot;**/page.tsx&quot;: &quot;${dirname} - Page&quot;,
    &quot;**/route.ts&quot;: &quot;${dirname} - API&quot;
  }" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #616E88">// タブ名カスタム</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">workbench.editor.customLabels.enabled</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #81A1C1">true</span><span style="color: #D8DEE9FF">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">workbench.editor.customLabels.patterns</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF">: </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/admin/*/*/page.tsx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname(1)}${dirname(0)} - Page</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/admin/*/page.tsx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname} - Page</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/api/*/*/route.ts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname(1)}${dirname(0)} - API</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/api/*/route.ts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname} - API</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/layout.tsx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname} - Layout</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/page.tsx</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname} - Page</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">**/route.ts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">${dirname} - API</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p><strong>admin/*/*/page.tsx</strong>などにすることで階層を指定できるようです。</p>



<p><strong>admin/upload.tsx</strong>は「upload &#8211; Page」、<strong>admin/edit/[id]/page.tsx</strong>は「edit[id] &#8211; Page」と[slug]が分かるようにしたかったので</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://img.estampie.work/wps/2025/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-04-11-234627.png"><img decoding="async" src="https://img.estampie.work/wps/2025/04/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-04-11-234627-1024x561.png" alt="" class="wp-image-4264"/></a></figure>
</div>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>メギド絵の進捗とか</title>
		<link>https://blog.estampie.work/archives/3734</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Thu, 13 Mar 2025 10:06:54 +0000</pubDate>
				<category><![CDATA[メギド72関連]]></category>
		<category><![CDATA[絵のまとめ]]></category>
		<category><![CDATA[イラスト]]></category>
		<category><![CDATA[メギド72]]></category>
		<category><![CDATA[ブフサタ]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=3734</guid>

					<description><![CDATA[SNSに上げていた進捗をまとめてみました。NSFW(背後注意)な絵もあるのでご注意 お空のデート ブフサタプチ カレンダー企画10月絵 バニーサタン様 バニーアスモ すやすやブフサタ ルシファー その他いろいろ 同人誌通 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>SNSに上げていた進捗をまとめてみました。NSFW(背後注意)な絵もあるのでご注意</p>



<h4 class="wp-block-heading">お空のデート</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/dfjhfjffhj.jpg"><img decoding="async" width="690" height="940" data-id="3740" src="https://img.estampie.work/wps/2025/03/dfjhfjffhj.jpg" alt="" class="wp-image-3740" srcset="https://img.estampie.work/wps/2025/03/dfjhfjffhj-220x300.jpg 220w, https://img.estampie.work/wps/2025/03/dfjhfjffhj.jpg 690w" sizes="(max-width: 690px) 100vw, 690px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/hkghj.jpg"><img loading="lazy" decoding="async" width="782" height="1024" data-id="3739" src="https://img.estampie.work/wps/2025/03/hkghj-782x1024.jpg" alt="" class="wp-image-3739" srcset="https://img.estampie.work/wps/2025/03/hkghj-229x300.jpg 229w, https://img.estampie.work/wps/2025/03/hkghj-782x1024.jpg 782w, https://img.estampie.work/wps/2025/03/hkghj-768x1006.jpg 768w, https://img.estampie.work/wps/2025/03/hkghj.jpg 1022w" sizes="auto, (max-width: 782px) 100vw, 782px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/fkjk.jpg"><img loading="lazy" decoding="async" width="628" height="937" data-id="3738" src="https://img.estampie.work/wps/2025/03/fkjk.jpg" alt="" class="wp-image-3738" srcset="https://img.estampie.work/wps/2025/03/fkjk-201x300.jpg 201w, https://img.estampie.work/wps/2025/03/fkjk.jpg 628w" sizes="auto, (max-width: 628px) 100vw, 628px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/gjhf.jpg"><img loading="lazy" decoding="async" width="825" height="941" data-id="3737" src="https://img.estampie.work/wps/2025/03/gjhf.jpg" alt="" class="wp-image-3737" srcset="https://img.estampie.work/wps/2025/03/gjhf-263x300.jpg 263w, https://img.estampie.work/wps/2025/03/gjhf-768x876.jpg 768w, https://img.estampie.work/wps/2025/03/gjhf.jpg 825w" sizes="auto, (max-width: 825px) 100vw, 825px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r037.png"><img loading="lazy" decoding="async" width="654" height="1024" data-id="3747" src="https://img.estampie.work/wps/2025/03/r037-654x1024.png" alt="" class="wp-image-3747" srcset="https://img.estampie.work/wps/2025/03/r037-192x300.png 192w, https://img.estampie.work/wps/2025/03/r037-654x1024.png 654w, https://img.estampie.work/wps/2025/03/r037-768x1202.png 768w, https://img.estampie.work/wps/2025/03/r037.png 833w" sizes="auto, (max-width: 654px) 100vw, 654px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">空のデート</figcaption></figure>


<p class="mymore"><a href="https://blog.estampie.work/archives/3734">続きを読む</a></p>


<span id="more-3734"></span>



<h4 class="wp-block-heading">ブフサタプチ カレンダー企画10月絵</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/hfjgh-1.jpg"><img loading="lazy" decoding="async" width="560" height="560" data-id="3763" src="https://img.estampie.work/wps/2025/03/hfjgh-1.jpg" alt="" class="wp-image-3763" srcset="https://img.estampie.work/wps/2025/03/hfjgh-1-300x300.jpg 300w, https://img.estampie.work/wps/2025/03/hfjgh-1-150x150.jpg 150w, https://img.estampie.work/wps/2025/03/hfjgh-1.jpg 560w" sizes="auto, (max-width: 560px) 100vw, 560px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/yoi-1.jpg"><img loading="lazy" decoding="async" width="560" height="560" data-id="3765" src="https://img.estampie.work/wps/2025/03/yoi-1.jpg" alt="" class="wp-image-3765" srcset="https://img.estampie.work/wps/2025/03/yoi-1-300x300.jpg 300w, https://img.estampie.work/wps/2025/03/yoi-1-150x150.jpg 150w, https://img.estampie.work/wps/2025/03/yoi-1.jpg 560w" sizes="auto, (max-width: 560px) 100vw, 560px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/kghkjg-1.png"><img loading="lazy" decoding="async" width="812" height="809" data-id="3766" src="https://img.estampie.work/wps/2025/03/kghkjg-1.png" alt="" class="wp-image-3766" srcset="https://img.estampie.work/wps/2025/03/kghkjg-1-300x300.png 300w, https://img.estampie.work/wps/2025/03/kghkjg-1-768x765.png 768w, https://img.estampie.work/wps/2025/03/kghkjg-1.png 812w" sizes="auto, (max-width: 812px) 100vw, 812px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/octover.png"><img loading="lazy" decoding="async" width="1024" height="1024" data-id="3767" src="https://img.estampie.work/wps/2025/03/octover-1024x1024.png" alt="" class="wp-image-3767" srcset="https://img.estampie.work/wps/2025/03/octover-300x300.png 300w, https://img.estampie.work/wps/2025/03/octover-1024x1024.png 1024w, https://img.estampie.work/wps/2025/03/octover-150x150.png 150w, https://img.estampie.work/wps/2025/03/octover-768x768.png 768w, https://img.estampie.work/wps/2025/03/octover.png 1121w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">ブフサタプチ<br>カレンダー企画の10月ハロウィン絵</figcaption></figure>



<h4 class="wp-block-heading">バニーサタン様</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/drjhgkhkfkjk.jpg"><img loading="lazy" decoding="async" width="844" height="872" data-id="3772" src="https://img.estampie.work/wps/2025/03/drjhgkhkfkjk.jpg" alt="" class="wp-image-3772" srcset="https://img.estampie.work/wps/2025/03/drjhgkhkfkjk-290x300.jpg 290w, https://img.estampie.work/wps/2025/03/drjhgkhkfkjk-768x793.jpg 768w, https://img.estampie.work/wps/2025/03/drjhgkhkfkjk.jpg 844w" sizes="auto, (max-width: 844px) 100vw, 844px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/gdjh.jpg"><img loading="lazy" decoding="async" width="888" height="923" data-id="3773" src="https://img.estampie.work/wps/2025/03/gdjh.jpg" alt="" class="wp-image-3773" srcset="https://img.estampie.work/wps/2025/03/gdjh-289x300.jpg 289w, https://img.estampie.work/wps/2025/03/gdjh-768x798.jpg 768w, https://img.estampie.work/wps/2025/03/gdjh.jpg 888w" sizes="auto, (max-width: 888px) 100vw, 888px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/2024bunny.jpg"><img loading="lazy" decoding="async" width="793" height="1024" data-id="3749" src="https://img.estampie.work/wps/2025/03/2024bunny-793x1024.jpg" alt="" class="wp-image-3749" srcset="https://img.estampie.work/wps/2025/03/2024bunny-232x300.jpg 232w, https://img.estampie.work/wps/2025/03/2024bunny-793x1024.jpg 793w, https://img.estampie.work/wps/2025/03/2024bunny-768x992.jpg 768w, https://img.estampie.work/wps/2025/03/2024bunny.jpg 1069w" sizes="auto, (max-width: 793px) 100vw, 793px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">バニーサタン様</figcaption></figure>



<h4 class="wp-block-heading">バニーアスモ</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/iuoiu.jpg"><img loading="lazy" decoding="async" width="1001" height="949" data-id="3760" src="https://img.estampie.work/wps/2025/03/iuoiu.jpg" alt="" class="wp-image-3760" srcset="https://img.estampie.work/wps/2025/03/iuoiu-300x284.jpg 300w, https://img.estampie.work/wps/2025/03/iuoiu-768x728.jpg 768w, https://img.estampie.work/wps/2025/03/iuoiu.jpg 1001w" sizes="auto, (max-width: 1001px) 100vw, 1001px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/hdgjdfjhd.jpg"><img loading="lazy" decoding="async" width="661" height="639" data-id="3761" src="https://img.estampie.work/wps/2025/03/hdgjdfjhd.jpg" alt="" class="wp-image-3761" srcset="https://img.estampie.work/wps/2025/03/hdgjdfjhd-300x290.jpg 300w, https://img.estampie.work/wps/2025/03/hdgjdfjhd.jpg 661w" sizes="auto, (max-width: 661px) 100vw, 661px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/asumo.png"><img loading="lazy" decoding="async" width="767" height="1024" data-id="3748" src="https://img.estampie.work/wps/2025/03/asumo-767x1024.png" alt="" class="wp-image-3748" srcset="https://img.estampie.work/wps/2025/03/asumo-225x300.png 225w, https://img.estampie.work/wps/2025/03/asumo-767x1024.png 767w, https://img.estampie.work/wps/2025/03/asumo-768x1026.png 768w, https://img.estampie.work/wps/2025/03/asumo.png 999w" sizes="auto, (max-width: 767px) 100vw, 767px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">バニーアスモ</figcaption></figure>



<h4 class="wp-block-heading">すやすやブフサタ</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/gfhdgd.jpg"><img loading="lazy" decoding="async" width="646" height="797" data-id="3771" src="https://img.estampie.work/wps/2025/03/gfhdgd.jpg" alt="" class="wp-image-3771" srcset="https://img.estampie.work/wps/2025/03/gfhdgd-243x300.jpg 243w, https://img.estampie.work/wps/2025/03/gfhdgd.jpg 646w" sizes="auto, (max-width: 646px) 100vw, 646px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/wrry.jpg"><img loading="lazy" decoding="async" width="606" height="783" data-id="3770" src="https://img.estampie.work/wps/2025/03/wrry.jpg" alt="" class="wp-image-3770" srcset="https://img.estampie.work/wps/2025/03/wrry-232x300.jpg 232w, https://img.estampie.work/wps/2025/03/wrry.jpg 606w" sizes="auto, (max-width: 606px) 100vw, 606px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/jfghfg.jpg"><img loading="lazy" decoding="async" width="609" height="806" data-id="3769" src="https://img.estampie.work/wps/2025/03/jfghfg.jpg" alt="" class="wp-image-3769" srcset="https://img.estampie.work/wps/2025/03/jfghfg-227x300.jpg 227w, https://img.estampie.work/wps/2025/03/jfghfg.jpg 609w" sizes="auto, (max-width: 609px) 100vw, 609px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/shfhghf.png"><img loading="lazy" decoding="async" width="693" height="685" data-id="3768" src="https://img.estampie.work/wps/2025/03/shfhghf.png" alt="" class="wp-image-3768" srcset="https://img.estampie.work/wps/2025/03/shfhghf-300x297.png 300w, https://img.estampie.work/wps/2025/03/shfhghf.png 693w" sizes="auto, (max-width: 693px) 100vw, 693px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/0423bs2.jpg"><img loading="lazy" decoding="async" width="817" height="1024" data-id="3741" src="https://img.estampie.work/wps/2025/03/0423bs2-817x1024.jpg" alt="" class="wp-image-3741" srcset="https://img.estampie.work/wps/2025/03/0423bs2-239x300.jpg 239w, https://img.estampie.work/wps/2025/03/0423bs2-817x1024.jpg 817w, https://img.estampie.work/wps/2025/03/0423bs2-768x962.jpg 768w, https://img.estampie.work/wps/2025/03/0423bs2-1226x1536.jpg 1226w, https://img.estampie.work/wps/2025/03/0423bs2.jpg 1235w" sizes="auto, (max-width: 817px) 100vw, 817px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">すやすやブフサタ</figcaption></figure>



<h4 class="wp-block-heading">ルシファー</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/fhdhgfhgfj.jpg"><img loading="lazy" decoding="async" width="908" height="912" data-id="3774" src="https://img.estampie.work/wps/2025/03/fhdhgfhgfj.jpg" alt="" class="wp-image-3774" srcset="https://img.estampie.work/wps/2025/03/fhdhgfhgfj-768x771.jpg 768w, https://img.estampie.work/wps/2025/03/fhdhgfhgfj.jpg 908w" sizes="auto, (max-width: 908px) 100vw, 908px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/jfhfkjkh.jpg"><img loading="lazy" decoding="async" width="860" height="819" data-id="3776" src="https://img.estampie.work/wps/2025/03/jfhfkjkh.jpg" alt="" class="wp-image-3776" srcset="https://img.estampie.work/wps/2025/03/jfhfkjkh-300x286.jpg 300w, https://img.estampie.work/wps/2025/03/jfhfkjkh-768x731.jpg 768w, https://img.estampie.work/wps/2025/03/jfhfkjkh.jpg 860w" sizes="auto, (max-width: 860px) 100vw, 860px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/fjhjkfhk.jpg"><img loading="lazy" decoding="async" width="636" height="549" data-id="3775" src="https://img.estampie.work/wps/2025/03/fjhjkfhk.jpg" alt="" class="wp-image-3775" srcset="https://img.estampie.work/wps/2025/03/fjhjkfhk-300x259.jpg 300w, https://img.estampie.work/wps/2025/03/fjhjkfhk.jpg 636w" sizes="auto, (max-width: 636px) 100vw, 636px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/fdhkjhg.jpg"><img loading="lazy" decoding="async" width="946" height="948" data-id="3777" src="https://img.estampie.work/wps/2025/03/fdhkjhg.jpg" alt="" class="wp-image-3777" srcset="https://img.estampie.work/wps/2025/03/fdhkjhg-768x770.jpg 768w, https://img.estampie.work/wps/2025/03/fdhkjhg.jpg 946w" sizes="auto, (max-width: 946px) 100vw, 946px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/fjdhfkfh.jpg"><img loading="lazy" decoding="async" width="940" height="929" data-id="3779" src="https://img.estampie.work/wps/2025/03/fjdhfkfh.jpg" alt="" class="wp-image-3779" srcset="https://img.estampie.work/wps/2025/03/fjdhfkfh-300x296.jpg 300w, https://img.estampie.work/wps/2025/03/fjdhfkfh-768x759.jpg 768w, https://img.estampie.work/wps/2025/03/fjdhfkfh.jpg 940w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/tuouyoipupo.jpg"><img loading="lazy" decoding="async" width="918" height="951" data-id="3778" src="https://img.estampie.work/wps/2025/03/tuouyoipupo.jpg" alt="" class="wp-image-3778" srcset="https://img.estampie.work/wps/2025/03/tuouyoipupo-290x300.jpg 290w, https://img.estampie.work/wps/2025/03/tuouyoipupo-768x796.jpg 768w, https://img.estampie.work/wps/2025/03/tuouyoipupo.jpg 918w" sizes="auto, (max-width: 918px) 100vw, 918px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">ルシファー</figcaption></figure>



<h4 class="wp-block-heading">その他いろいろ</h4>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-7 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r035a.png"><img loading="lazy" decoding="async" width="737" height="1024" data-id="3744" src="https://img.estampie.work/wps/2025/03/r035a-737x1024.png" alt="" class="wp-image-3744" srcset="https://img.estampie.work/wps/2025/03/r035a-216x300.png 216w, https://img.estampie.work/wps/2025/03/r035a-737x1024.png 737w, https://img.estampie.work/wps/2025/03/r035a-768x1067.png 768w, https://img.estampie.work/wps/2025/03/r035a.png 1008w" sizes="auto, (max-width: 737px) 100vw, 737px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r035b.png"><img loading="lazy" decoding="async" width="720" height="1024" data-id="3743" src="https://img.estampie.work/wps/2025/03/r035b-720x1024.png" alt="" class="wp-image-3743" srcset="https://img.estampie.work/wps/2025/03/r035b-211x300.png 211w, https://img.estampie.work/wps/2025/03/r035b-720x1024.png 720w, https://img.estampie.work/wps/2025/03/r035b-768x1092.png 768w, https://img.estampie.work/wps/2025/03/r035b.png 1008w" sizes="auto, (max-width: 720px) 100vw, 720px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r035c.png"><img loading="lazy" decoding="async" width="720" height="1024" data-id="3745" src="https://img.estampie.work/wps/2025/03/r035c-720x1024.png" alt="" class="wp-image-3745" srcset="https://img.estampie.work/wps/2025/03/r035c-211x300.png 211w, https://img.estampie.work/wps/2025/03/r035c-720x1024.png 720w, https://img.estampie.work/wps/2025/03/r035c-768x1092.png 768w, https://img.estampie.work/wps/2025/03/r035c.png 1008w" sizes="auto, (max-width: 720px) 100vw, 720px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r030.jpg"><img loading="lazy" decoding="async" width="1024" height="715" data-id="3751" src="https://img.estampie.work/wps/2025/03/r030-1024x715.jpg" alt="" class="wp-image-3751" srcset="https://img.estampie.work/wps/2025/03/r030-300x209.jpg 300w, https://img.estampie.work/wps/2025/03/r030-1024x715.jpg 1024w, https://img.estampie.work/wps/2025/03/r030-768x536.jpg 768w, https://img.estampie.work/wps/2025/03/r030.jpg 1319w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/0723bs.jpg"><img loading="lazy" decoding="async" width="787" height="1024" data-id="3750" src="https://img.estampie.work/wps/2025/03/0723bs-787x1024.jpg" alt="" class="wp-image-3750" srcset="https://img.estampie.work/wps/2025/03/0723bs-231x300.jpg 231w, https://img.estampie.work/wps/2025/03/0723bs-787x1024.jpg 787w, https://img.estampie.work/wps/2025/03/0723bs-768x999.jpg 768w, https://img.estampie.work/wps/2025/03/0723bs.jpg 959w" sizes="auto, (max-width: 787px) 100vw, 787px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/ber.jpg"><img loading="lazy" decoding="async" width="1025" height="775" data-id="3735" src="https://img.estampie.work/wps/2025/03/ber.jpg" alt="" class="wp-image-3735" srcset="https://img.estampie.work/wps/2025/03/ber-300x227.jpg 300w, https://img.estampie.work/wps/2025/03/ber-768x581.jpg 768w, https://img.estampie.work/wps/2025/03/ber.jpg 1025w" sizes="auto, (max-width: 1025px) 100vw, 1025px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r27.jpg"><img loading="lazy" decoding="async" width="796" height="1024" data-id="3752" src="https://img.estampie.work/wps/2025/03/r27-796x1024.jpg" alt="" class="wp-image-3752" srcset="https://img.estampie.work/wps/2025/03/r27-233x300.jpg 233w, https://img.estampie.work/wps/2025/03/r27-796x1024.jpg 796w, https://img.estampie.work/wps/2025/03/r27-768x988.jpg 768w, https://img.estampie.work/wps/2025/03/r27-1194x1536.jpg 1194w, https://img.estampie.work/wps/2025/03/r27.jpg 1312w" sizes="auto, (max-width: 796px) 100vw, 796px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r022.png"><img loading="lazy" decoding="async" width="988" height="1024" data-id="3753" src="https://img.estampie.work/wps/2025/03/r022-988x1024.png" alt="" class="wp-image-3753" srcset="https://img.estampie.work/wps/2025/03/r022-289x300.png 289w, https://img.estampie.work/wps/2025/03/r022-988x1024.png 988w, https://img.estampie.work/wps/2025/03/r022-768x796.png 768w, https://img.estampie.work/wps/2025/03/r022.png 1074w" sizes="auto, (max-width: 988px) 100vw, 988px" /></a></figure>



<figure class="wp-block-image size-full"><a class="none-link" href="https://img.estampie.work/wps/2025/03/0317hyoshi.jpg"><img loading="lazy" decoding="async" width="512" height="723" data-id="3805" src="https://img.estampie.work/wps/2025/03/0317hyoshi.jpg" alt="" class="wp-image-3805" srcset="https://img.estampie.work/wps/2025/03/0317hyoshi-212x300.jpg 212w, https://img.estampie.work/wps/2025/03/0317hyoshi.jpg 512w" sizes="auto, (max-width: 512px) 100vw, 512px" /></a></figure>



<figure class="wp-block-image size-large"><a class="none-link" href="https://img.estampie.work/wps/2025/03/r021.jpg"><img loading="lazy" decoding="async" width="774" height="978" data-id="3742" src="https://img.estampie.work/wps/2025/03/r021.jpg" alt="" class="wp-image-3742" srcset="https://img.estampie.work/wps/2025/03/r021-237x300.jpg 237w, https://img.estampie.work/wps/2025/03/r021-768x970.jpg 768w, https://img.estampie.work/wps/2025/03/r021.jpg 774w" sizes="auto, (max-width: 774px) 100vw, 774px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">他いろいろ</figcaption></figure>



<h2 class="wp-block-heading">同人誌通販</h2>



<p>メギドのR18ブフサタ(ベルゼブフ×サタン)本を通販しています。成人済みの方のみお願いいたします。</p>



<div class="blogcard"><a href="https://estampie-noc.booth.pm/" target="_blank" rel="noopener noreferrer" data-blogcard="1">BOOTH &#8211; estampie</a></div>



<p>メギドくん、公式ガイドラインで同人誌やグッズの頒布、さらには販売しなければ公式画像や動画の加工・転載がOKという希有な作品でもあるので、本当にありがたいです。メギド所持率チェッカーに公式画像が使えているのもそのおかげ…</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>メギド72オフライン版のバックアップを取る</title>
		<link>https://blog.estampie.work/archives/3627</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 12:18:35 +0000</pubDate>
				<category><![CDATA[メギド72関連]]></category>
		<category><![CDATA[メギド72]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=3627</guid>

					<description><![CDATA[メギド72、ついに完結しオフライン版となりました。 他のゲームとかだとなかなか触れない部分を埋めてくれたり、家族愛や同性間の恋愛など、様々な愛について人外視点で解体して再構築するシナリオと、奥深いゲーム性、ミルトンの失楽 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>メギド72、ついに完結しオフライン版となりました。</p>



<p>他のゲームとかだとなかなか触れない部分を埋めてくれたり、家族愛や同性間の恋愛など、様々な愛について人外視点で解体して再構築するシナリオと、奥深いゲーム性、ミルトンの失楽園や黙示録はじめループ重力量子論などの量子力学・物理学にも通じたライターのSF作家としての力量、本当に大好きです…</p>



<p></p>



<p>弊アジトには実装された272体が全員揃い、衣装もすべて購入済み、全員Lv70(ブフ様&amp;サタン様はLv80)&amp;専用霊宝も全作成済み、全金冠にミッションもソロモンLv以外はスタイル縛りミッションも全て埋めたり、本当にやりこんだゲームでした。</p>



<p>自作したメギド所持率チェッカーも自鯖がダメになるまではずっと置き続ける予定です。是非攻略の際の手持ち共有などにもご利用ください。</p>



<div class="blogcard"><a href="https://mgd.estampie.work/" target="_blank" rel="noopener noreferrer" data-blogcard="1">〆所持チェッカー</a></div>



<h2 class="wp-block-heading">メギド72を永遠にしたい</h2>



<p>そういうわけでオフライン版となったメギド72ですが、オフライン化後は通信が一切行われず、運営のサーバーも閉じ、<strong>端末が壊れるまで</strong>はずっと遊べる仕様となりました。</p>



<p><span style="color: #ff0000" class="text-color"><span style="font-size: 26px" class="font-size"><strong>いやだーーーーーー！！！！！壊れないで！！！！！！！！！</strong></span></span></p>



<p>そういうわけで私は目論見ました。</p>



<p>Androidであればエミュレータもあるし、バックアップがうまくいけばメギドを永遠にできるのでは？</p>



<p>私はずっとiPhoneでメギドをやっていたのですが、このためだけにGoogle Pixel8aを買い、データ移行をしておきました。</p>



<p><span style="font-size: 12px" class="font-size">ちなみにpixelにしたのはroot化がXperiaよりしやすそうとかなだったのですが結局仕事とかがバタついていてその辺やらずにオフライン化突入</span>…</p>



<p><span style="font-size: 12px" class="font-size">iOSはシステムやアプリデータなど</span><span style="font-size: 12px" class="font-size">に</span><span style="font-size: 12px" class="font-size">ユーザーが触れないように割とガチガチなので、root化なしにアプリデータのバックアップできる可能性が割と低かったため</span></p>



<p><strong>結論から言うと、いけました。</strong></p>



<p>PCへバックアップを取ってそのデータでプレイできる感じになります。</p>



<p>現状<strong><span class="luxe-dot-hilight-pink">rootを取らなくてもできる</span></strong>ので良かったです<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>


<p class="mymore"><a href="https://blog.estampie.work/archives/3627">続きを読む</a></p>


<span id="more-3627"></span>



<h2 class="wp-block-heading">Android→PCのバックアップ</h2>



<h3 class="wp-block-heading">準備</h3>



<p>スマホ←→PC間でデータを転送する方法を用意しておきます。</p>



<p>・MTP対応USBケーブルを用意しておく</p>



<p>または</p>



<p>・microSDカード+microSDカードリーダーを用意しておく</p>



<p>MTP非対応だとデータの移動ができなかったりするため。スマホ付属のケーブルなら基本大丈夫かと思います。</p>



<h3 class="wp-block-heading">簡単めの方法</h3>



<p>ゆるめのスマホだとUSB接続だけで<code>Android/data/</code>以下のデータがPCへ直接コピーできるので、その場合はそれでやってください。下記は<code>Android/data/</code>以下が弄れないスマホ向けです。</p>



<p><strong>FolderVのファイルマネージャー</strong>を使うと通常触れない<code>Android/data/</code>以下のフォルダを触れるので、こちらをDLしてインストールしておきます。</p>



<div class="blogcard"><a href="https://play.google.com/store/apps/details?id=com.folderv.file&amp;hl=ja&amp;pli=1" target="_blank" rel="noopener noreferrer" data-blogcard="1">FolderV ファイルマネージャー</a></div>



<p><code>Android/obb/</code>以下はこのソフトでも触れないようなので、もしかするといずれはこちらも触れられなくなるのかもしれませんが、とりあえず今は使用できるので使います。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://img.estampie.work/wps/2025/03/Screenshot_20250312-203403.png"><img loading="lazy" decoding="async" width="1024" height="929" src="https://img.estampie.work/wps/2025/03/Screenshot_20250312-203403-1024x929.png" alt="" class="wp-image-3628" style="width:400px" srcset="https://img.estampie.work/wps/2025/03/Screenshot_20250312-203403-300x272.png 300w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-203403-1024x929.png 1024w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-203403-768x697.png 768w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-203403.png 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>


<p>内部共有ストレージをタップして、<code>Android/data/</code>以下の<code>com.dena.a********</code>フォルダをドキュメントフォルダなど、普通にアクセスできるフォルダへコピーします。<span class="luxe-dot-hilight-red">※7GBほどあるので空き容量に注意！</span></p>



<p>microSDカードでカードリーダーを使ってPC転送できる場合はmicroSDへコピーしましょう。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://img.estampie.work/wps/2025/03/Screenshot_20250312-203453.png"><img loading="lazy" decoding="async" width="995" height="1024" src="https://img.estampie.work/wps/2025/03/Screenshot_20250312-203453-995x1024.png" alt="" class="wp-image-3629" style="width:400px" srcset="https://img.estampie.work/wps/2025/03/Screenshot_20250312-203453-291x300.png 291w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-203453-995x1024.png 995w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-203453-768x791.png 768w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-203453.png 1080w" sizes="auto, (max-width: 995px) 100vw, 995px" /></a></figure>
</div>


<p>ケーブル転送の場合はスマホをPCとUSBケーブルでつなぎ、データ転送モードにします。</p>



<p>通常は充電時タップしてモードを切り替えればいけると思いますが、Pixel8aでは<strong>設定</strong>→<strong>接続設定</strong>でファイル転送モードにする必要がありました。</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="620" height="1024" src="https://img.estampie.work/wps/2025/03/Screenshot_20250312-202215-620x1024.png" alt="" class="wp-image-3630" style="width:400px" srcset="https://img.estampie.work/wps/2025/03/Screenshot_20250312-202215-182x300.png 182w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202215-620x1024.png 620w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202215-768x1269.png 768w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202215-929x1536.png 929w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202215.png 1080w" sizes="auto, (max-width: 620px) 100vw, 620px" /></figure>
</div>

<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="855" height="1024" src="https://img.estampie.work/wps/2025/03/Screenshot_20250312-202203-855x1024.png" alt="" class="wp-image-3631" style="width:400px" srcset="https://img.estampie.work/wps/2025/03/Screenshot_20250312-202203-250x300.png 250w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202203-855x1024.png 855w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202203-768x920.png 768w, https://img.estampie.work/wps/2025/03/Screenshot_20250312-202203.png 1080w" sizes="auto, (max-width: 855px) 100vw, 855px" /></figure>
</div>


<p>あとはPCへ該当フォルダを転送すればバックアップは完了です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="527" height="167" src="https://img.estampie.work/wps/2025/03/off01.png" alt="" class="wp-image-3634" srcset="https://img.estampie.work/wps/2025/03/off01-300x95.png 300w, https://img.estampie.work/wps/2025/03/off01.png 527w" sizes="auto, (max-width: 527px) 100vw, 527px" /></figure>
</div>


<p>大事なデータなので圧縮して複数箇所にバックアップを取っておきたいものです。</p>



<p>バックアップを取った時点の進行データとなるので、スマホ側で進めた場合は新スマホ移行前に再度バックアップを取りましょう。</p>



<h3 class="wp-block-heading">面倒めの方法</h3>



<p>アプリ開発とか慣れてる方向けの方です。最初にこちらで試しました。</p>



<p><strong>ADB</strong>+<strong>USBデバッグモード</strong>で直接<code>Android/data/</code>フォルダからデータを直接移動できます。PCに<a href="https://source.android.com/docs/setup/build/adb?hl=ja">ADB</a>をインストールしてコマンドを叩きます。詳しくは説明しないので適宜ｇｇってね</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="adb pull /sdcard/Android/data/ #パスは適宜" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">adb</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pull</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/sdcard/Android/data/</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">#パスは適宜</span></span></code></pre></div>



<h2 class="wp-block-heading">バックアップから新しいスマホへ移行</h2>



<p>Google自体のアプリバックアップ機能で移行できるなら大丈夫なのですが、それがダメな場合、Androidフォルダ内が弄れればさらに新しいスマホにデータ移行も可能かもしれません。</p>



<p>とりあえず<strong>新しいAndroidスマホにてストアからメギド72をDL</strong>→<strong>起動して少し進めた後<code>Android/data/</code>以下にバックアップデータを移動</strong>　でなんとかなりそう。</p>



<p class="has-text-align-center"><strong><span style="color: #ff0000" class="text-color">結論。できました！！！！</span></strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><a href="https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM.jpg"><img loading="lazy" decoding="async" width="854" height="1024" src="https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM-854x1024.jpg" alt="" class="wp-image-3831" style="width:400px" srcset="https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM-250x300.jpg 250w, https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM-854x1024.jpg 854w, https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM-768x921.jpg 768w, https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM-1281x1536.jpg 1281w, https://img.estampie.work/wps/2025/03/Gl7WEBZWUAAq-pM.jpg 1708w" sizes="auto, (max-width: 854px) 100vw, 854px" /></a></figure>
</div>


<p>今回はアプリDL→ブネが出るあたりまで進める→FolderVのファイルマネージャーで<code>Android/data/</code>以下にバックアップを上書きしました。</p>



<p>ただしこれも<span class="luxe-dot-hilight-blue"><strong>Playストアからメギド72オフライン版がDLできることが前提</strong></span>なので、やはりエミュレータのデータをまるごとPCに保管しておくのが良いのかもしれません。</p>



<p><span style="font-size: 11px" class="font-size">&lt;余談&gt; あと多分この方法使うとメギドくんインストールしてない方でも最低一括DLできる2話までは進んでしまってるけどプレイはできるようになる…けれど、不特定多数に著作物のデータを配るのは著作権法的にアウトなので、著作権法の範囲内である私的利用の複製に留めるべき</span></p>



<p><span style="font-size: 11px" class="font-size">メギドは同人誌やグッズの頒布、さらには販売しなければ公式画像・動画の加工転載までも公式ガイドラインで許可されてる有難いジャンルなので、この辺はちゃんとしたいね</span></p>



<h2 class="wp-block-heading">エミュレータでの起動</h2>



<p>Androidとはいえスマホはいつか壊れるしOSも非対応になっていくかもしれない…そういうわけでPC上のAndroidエミュレータでも使用したいです。</p>



<p>LDPlayer 3 3.130.0で動作確認できるということでこちらを使用しました。(9もいけるらしいですがとりあえず)</p>



<div class="blogcard"><a href="https://momo-app-player.jp.uptodown.com/windows/download" target="_blank" rel="noopener noreferrer" data-blogcard="1">LDPlayer 3 3.130.0</a></div>



<p>LDPlayerを起動してエミュ上でPlayストアにアクセスし、Googleにログイン後、<strong>メギド72</strong>と先ほどの<strong>FolderVのファイルマネージャー</strong>をインストールします。</p>



<p>メギド72を起動し、ストーリー最初にブネが出てきて喋るあたりまで進めれば十分かと思います。</p>



<p>そして<span style="" class="luxe-dot-hilight-red"><b>一度アプリを終了させます。</b></span></p>



<p>次に、PCからバックアップしたデータをエミュレータに導入します。システムメニューのPCマークをクリック</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="590" height="1020" src="https://img.estampie.work/wps/2025/03/off04.png" alt="" class="wp-image-3635" srcset="https://img.estampie.work/wps/2025/03/off04-174x300.png 174w, https://img.estampie.work/wps/2025/03/off04.png 590w" sizes="auto, (max-width: 590px) 100vw, 590px" /></figure>
</div>


<p>出てくるポップアップの「PCのフォルダを開く」をクリック</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="515" height="253" src="https://img.estampie.work/wps/2025/03/off05-1.png" alt="" class="wp-image-3637" srcset="https://img.estampie.work/wps/2025/03/off05-1-300x147.png 300w, https://img.estampie.work/wps/2025/03/off05-1.png 515w" sizes="auto, (max-width: 515px) 100vw, 515px" /></figure>
</div>


<p>すると<strong>Picturesフォルダ</strong>が自動で開くので、ここにバックアップした<code>com.dena.a********</code>フォルダをコピーします。</p>



<p>LDPlayerに戻り、<strong>FolderVのファイルマネージャー</strong>を起動します。起動したら<strong>Picturesフォルダ</strong>に入っている<code>com.dena.a********</code>フォルダをエミュレータ上の<code>Android/data/</code>以下の同名フォルダへ上書きします。</p>



<p>これで再度メギド72を起動すると完了です！<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f389.png" alt="🎉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://img.estampie.work/wps/2025/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-12-202116.png"><img decoding="async" src="https://img.estampie.work/wps/2025/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-12-202116-593x1024.png" alt="" class="wp-image-3639"/></a></figure>
</div>


<p class="has-text-align-center"><span class="serif-font"><strong><span style="color: #000000" class="text-color">私の遠き情景…ここが大いなる意思の中…</span></strong></span></p>



<p class="has-text-align-center"><span class="serif-font"><span class="serif-font">ずっと</span></span><span class="serif-font">ずっと</span><span class="serif-font">一緒だよ…</span></p>



<p>永遠にするためにもLDPlayerごとバックアップを維持したいものです。私には何故かWin98/Xp/7の仮想環境があるのでこの先OSがどうにかなっても多分なんとかはなる……</p>



<h2 class="wp-block-heading">Foreverメギド72</h2>



<p>これからコンサートの議席争奪戦やサントラ、シナリオブックとまだまだ展開のあるメギド72ですが、メディアビジョンさん是非……買い切り版やsteamやswitchなどでコンシューマ化を希望します……<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f62d.png" alt="😭" class="wp-smiley" style="height: 1em; max-height: 1em;" />！</p>



<p>メギドの醍醐味の一つはフォトンを指でスワイプして渡すフォトンドリブンシステムだとも思っているので、やはりスワイプ操作のできる端末が一番合っているかなと思ってます。</p>



<p>この素晴らしいシナリオにこれから新規で読める方が少ないという現状、あまりにも切ないので、是非とも新規ユーザーが触れることのできる展開を希望しています。完結を機に初めてくれたフォロワーさんの多いこと、やはりソシャゲはシナリオが終わらないことも不安の一つなのかなとも実感しました。</p>



<p>きっとコンシューマ版などが出れば触ってみる方も居ると思いますし、新規IPでこれだけの世界がここで終わるのももったいないな…と思っています。</p>



<p>さようならでなく、Someday, again&#8230;なのも希望が持ててうれしいです。</p>



<p>　</p>



<p class="has-text-align-center"><em>「いつか、また。」</em></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Win11proでのVT-x有効化(Hyper-V無効化)</title>
		<link>https://blog.estampie.work/archives/3609</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Wed, 12 Mar 2025 09:14:33 +0000</pubDate>
				<category><![CDATA[つれづれ]]></category>
		<category><![CDATA[仮想化ベースのセキュリティ]]></category>
		<category><![CDATA[Nox Player]]></category>
		<category><![CDATA[VT-x]]></category>
		<category><![CDATA[Hyper-V]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=3609</guid>

					<description><![CDATA[Nox playerを入れたかったのですが何やってもハイパーバイザー&#38;仮想化ベースのセキュリティが無効化できず困った備忘録です。 Intel 14700KF+MSI Z790 TOMAHAWK WIFIでWind [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Nox playerを入れたかったのですが何やってもハイパーバイザー&amp;仮想化ベースのセキュリティが無効化できず困った備忘録です。</p>



<p>Intel 14700KF+MSI Z790 TOMAHAWK WIFIでWindows11Proを使用しています。</p>



<p>VT-xの有効化の確認には<a href="https://leomoon.com/downloads/desktop-apps/leomoon-cpu-v/">LeoMoon CPU-V</a>などが簡単です。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://img.estampie.work/wps/2025/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-11-223630.png"><img decoding="async" src="https://img.estampie.work/wps/2025/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-11-223630.png" alt="" class="wp-image-3614"/></a></figure>
</div>


<p>こんな風になっちゃう…</p>



<p>またMicrosoftの<a href="https://learn.microsoft.com/ja-jp/sysinternals/downloads/coreinfo">coreinfo</a>でもチェックできます。コマンドプロンプトからソフトのあるフォルダに移動して<code>coreinfo64 -v</code>で実行します。</p>


<p class="mymore"><a href="https://blog.estampie.work/archives/3609">続きを読む</a></p>


<span id="more-3609"></span>



<h2 class="wp-block-heading">試したこと</h2>



<p>最初にMicrosoftサイトに載っている下記を試しています。</p>



<div class="blogcard"><a href="https://learn.microsoft.com/ja-jp/troubleshoot/windows-client/application-management/virtualization-apps-not-work-with-hyper-v" target="_blank" rel="noopener noreferrer" data-blogcard="1">仮想化アプリケーションが Hyper-V、Device Guard、Credential Guard と連携しない</a></div>



<p>全然ダメです。</p>



<p>各操作の後にはコマンド「<code>shutdown /s /f /t 0</code>」で完全シャットダウンして再起動しています。</p>



<h3 class="wp-block-heading">BIOS(UEFI)</h3>



<p>MSIのZ790 TOMAHAWK WIFIを使用しています。UEFIのAdvancedモードにて</p>



<ul class="wp-block-list">
<li><span style="font-size: 16px" class="font-size">Fast Boot無効化</span></li>



<li><span style="font-size: 16px" class="font-size">Secure Boot無効化</span></li>



<li><span style="font-size: 16px" class="font-size">「OC」→「CPUの機能</span><span style="font-size: 16px" class="font-size">」</span><span style="font-size: 16px" class="font-size">から「<strong>Intel Virtualization Technology</strong>」「<strong>VT-x</strong>」を有効化</span>（VT-xを無効にすると消えるの下の二つも有効化）</li>
</ul>



<h3 class="wp-block-heading">Hyper-Vの無効化</h3>



<p><em><strong>コントロールパネル</strong></em>→<strong>プログラム</strong>→<strong>Windowsの機能の有効化または無効化</strong>で</p>



<p>・<strong>Hyper-V</strong></p>



<p>・<strong>Windows サンドボックス</strong></p>



<p>・<strong>仮想マシンプラットフォーム(Virtual Machine Platform)</strong></p>



<p>・<strong>Windows ハイパーバイザープラットフォーム</strong></p>



<p>の無効化をしました。</p>



<p>また管理者権限で実行したコマンドプロンプトで下記を実行して再起動しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;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>bcdedit /set hypervisorlaunchtype off</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="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">bcdedit</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/set</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">hypervisorlaunchtype</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">off</span></span></code></pre></div>



<p>さらに管理者権限で実行したPowerShellで下記を実行して再起動しています。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;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>dism /online /disable-feature /featurename:Microsoft-Hyper-V-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="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">dism</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/online</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/disable-feature</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/featurename:Microsoft-Hyper-V-All</span></span></code></pre></div>



<h3 class="wp-block-heading">メモリ整合性をオフ</h3>



<p>設定の「<strong>Windows セキュリティ</strong>」 → 「<strong>デバイスセキュリティ</strong>」→「<strong>コア分離</strong>」→「<strong>メモリ整合性</strong>」をオフに。これは必須みたい</p>



<h3 class="wp-block-heading">Device Guard無効化</h3>



<p>これらをやってもファイル名を指定して実行→「msinfo32」で「ハイパーバイザーが検出されました。hyper-v に必要な機能は表示されません。」「仮想化ベースのセキュリティ：実行中」が消えてくれません。</p>



<p>ファイル名を指定して実行→「gpedit.msc」→<strong>「コンピューターの構成」</strong> → <strong>「管理用テンプレート」</strong> → <strong>「システム」</strong> → <strong>「デバイス ガード」</strong>→<strong>「仮想化ベースのセキュリティを有効にする」</strong> を開く→<strong>「無効」</strong> を選択 → <strong>適用</strong></p>



<p>これで再起動してもダメなので</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;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>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard</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="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceGuard</span></span></code></pre></div>



<p>レジストリで「<strong>EnableVirtualizationBasedSecurity</strong>」 を「<strong>0</strong>」に変更</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;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>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa</span></span></code></pre></div>



<p>レジストリで「<strong>LsaCfgFlags</strong>」  を「<strong>0</strong>」に変更</p>



<p>再起動……ダメです！</p>



<h2 class="wp-block-heading">最終的に</h2>



<p>解決したのですが、下記のファイルのDL&amp;実行でした…。</p>



<style>
.simpleblogcard_img_block279eab920646528c9c908b8378fa7ede {
  float: right;
  padding: 10px;
}
.simpleblogcard_border279eab920646528c9c908b8378fa7ede {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title279eab920646528c9c908b8378fa7ede {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description279eab920646528c9c908b8378fa7ede {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://www.microsoft.com/en-us/download/details.aspx?id=53337 target="_blank" rel="noopener">
			<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border279eab920646528c9c908b8378fa7ede">
			www.microsoft.com			<div class="simpleblogcard_title279eab920646528c9c908b8378fa7ede">
				Download Device Guard and Credential Guard hardware readiness tool from Official Microsoft Download Center			</div>
							<div class="simpleblogcard_description279eab920646528c9c908b8378fa7ede">
					Use this tool to see if y&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<p>一応セキュアブートを無効にしてからプログラムをPowershell上で実行、</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;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>DG_Readiness_Tool_v3.6.ps1 -Disable</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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">DG_Readiness_Tool_v3.6.ps1</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-Disable</span></span></code></pre></div>



<p>再起動すると上記プログラムが走るので指示に従いWinキーorF3キーで仮想化ベースのセキュリティとCredential Guard無効化を実行、再起動後はまたセキュアブートを戻しました。</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://img.estampie.work/wps/2025/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-12-174123.png"><img decoding="async" src="https://img.estampie.work/wps/2025/03/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-03-12-174123.png" alt="" class="wp-image-3613"/></a></figure>
</div>


<p>やった～…（疲れた…）</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>クリスタお絵描きメモ:素材など(随時更新)</title>
		<link>https://blog.estampie.work/archives/3513</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Wed, 25 Dec 2024 15:55:40 +0000</pubDate>
				<category><![CDATA[つれづれ]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=3513</guid>

					<description><![CDATA[最近のお絵描き関連のツールのメモをまとめてみました。 画像にはNSFWありますので注意 ↓クリスタ自作素材です。あんまりないです デバイス 液タブ wacom Cintiq13HD　 iPad proも買ったのですが ・ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最近のお絵描き関連のツールのメモをまとめてみました。</p>



<p>画像にはNSFWありますので注意</p>


<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" src="https://img.estampie.work/wps/2025/10/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2025-10-05-063636-1024x550.png" alt="" class="wp-image-4412" style="width:400px"/></figure>
</div>


<p>↓クリスタ自作素材です。あんまりないです</p>



<div class="blogcard"><a href="https://assets.clip-studio.com/ja-jp/search?user=NOC&amp;order=new" target="_blank" rel="noopener noreferrer" data-blogcard="1">クリスタ自作素材</a></div>


<p class="mymore"><a href="https://blog.estampie.work/archives/3513">続きを読む</a></p>


<span id="more-3513"></span>



<h2 class="wp-block-heading">デバイス</h2>



<h3 class="wp-block-heading">液タブ</h3>



<p><a href="https://101.wacom.com/UserHelp/ja/About_Cintiq13.htm">wacom Cintiq13HD</a>　</p>



<p>iPad proも買ったのですが</p>



<p>・ワコムの筆圧で沈むペン先から離れられなかった<br>・ペンの充電が要らない<br>・他のソフト(blenderとか)とすぐ行き来するタイプだった<br>・iPad版クリスタはフローティングウインドウにできない</p>



<p>辺りの要因で結局液タブのみ…</p>



<p>ワコムともFAVO→Intuos3→Intuos pro→…の付き合いです</p>



<p>最近原稿は見開きで描いてるので液タブを買い換えるときに16インチか22インチかが悩みどころ</p>



<div class="blogcard"><a href="https://www.amazon.co.jp/dp/B08GR2CK5P" target="_blank" rel="noopener noreferrer" data-blogcard="1">BoYata ノート パソコンスタンド</a></div>



<p>液タブ用アームも買ってみたのですが揺れるので上記のスタンドに置いて使用しています。</p>



<h2 class="wp-block-heading">ソフトウェア</h2>



<p>・<a href="https://www.clipstudio.net/ja/">CLIP STUDIO PAINT</a>　コミスタ3EXから。漫画描くときの機能や圧倒的素材数に現状これ以外が主なツールにならなそうです。株主優待が200株からになるのが痛い…</p>



<p>・<a href="https://www.adobe.com/jp/products/photoshop.html">Photoshop</a>　こちらも6.0の頃から　フォトプランで使っています。カラースペースの変換などはやはりこちらが安心。</p>



<p>・<a href="https://www.blender.jp/">Blender</a> 3Dモデル作成用。</p>



<h2 class="wp-block-heading">素材</h2>



<p>主にクリスタで使用してる素材です。</p>



<h3 class="wp-block-heading">ブラシ</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://img.estampie.work/wps/2024/12/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%83%9A%E3%83%B3.png"><img decoding="async" src="https://img.estampie.work/wps/2024/12/%E3%81%8A%E3%81%99%E3%81%99%E3%82%81%E3%83%9A%E3%83%B3-1024x988.png" alt="" class="wp-image-3516"/></a></figure>
</div>


<h4 class="wp-block-heading">下描き</h4>



<p>クリスタ初期ツールのこちらのシャーペンです。クリスタ2以降はデフォルトでない模様？</p>



<style>
.simpleblogcard_img_block367bcae9b8e673492a9dac7ee4f59fc2 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border367bcae9b8e673492a9dac7ee4f59fc2 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title367bcae9b8e673492a9dac7ee4f59fc2 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description367bcae9b8e673492a9dac7ee4f59fc2 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=1842019 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_block367bcae9b8e673492a9dac7ee4f59fc2">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/19/20/1842019/thumbnail?1622096453" alt="ペン・ブラシ_Ver.1.10.9 - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border367bcae9b8e673492a9dac7ee4f59fc2">
			assets.clip-studio.com			<div class="simpleblogcard_title367bcae9b8e673492a9dac7ee4f59fc2">
				ペン・ブラシ_Ver.1.10.9 &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_description367bcae9b8e673492a9dac7ee4f59fc2">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h4 class="wp-block-heading">主線</h4>



<p>カラーには向かないとあるのですがモノクロでもカラーでもこちらで描いています。</p>



<style>
.simpleblogcard_img_block4b14ed3645cd78e9545a9b78031a2eb6 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border4b14ed3645cd78e9545a9b78031a2eb6 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title4b14ed3645cd78e9545a9b78031a2eb6 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description4b14ed3645cd78e9545a9b78031a2eb6 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=2018888 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_block4b14ed3645cd78e9545a9b78031a2eb6">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/88/88/2018888/thumbnail?1690215336" alt="漫画インク潰れMペン - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border4b14ed3645cd78e9545a9b78031a2eb6">
			assets.clip-studio.com			<div class="simpleblogcard_title4b14ed3645cd78e9545a9b78031a2eb6">
				漫画インク潰れMペン &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_description4b14ed3645cd78e9545a9b78031a2eb6">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h4 class="wp-block-heading">塗り</h4>



<p>塗りはクリスタ初期ツールのこちらの不透明水彩が主です。他の水彩も合わせて使っています。</p>



<style>
.simpleblogcard_img_block367bcae9b8e673492a9dac7ee4f59fc2 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border367bcae9b8e673492a9dac7ee4f59fc2 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title367bcae9b8e673492a9dac7ee4f59fc2 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description367bcae9b8e673492a9dac7ee4f59fc2 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=1842019 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_block367bcae9b8e673492a9dac7ee4f59fc2">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/19/20/1842019/thumbnail?1622096453" alt="ペン・ブラシ_Ver.1.10.9 - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border367bcae9b8e673492a9dac7ee4f59fc2">
			assets.clip-studio.com			<div class="simpleblogcard_title367bcae9b8e673492a9dac7ee4f59fc2">
				ペン・ブラシ_Ver.1.10.9 &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_description367bcae9b8e673492a9dac7ee4f59fc2">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<p>不透明部分には同Gペンも使用しています。</p>



<h3 class="wp-block-heading">便利ツール</h3>



<p>大まかに塗った後の髪の先などは主線レイヤーを参照にしてこちらで補完しています。</p>



<style>
.simpleblogcard_img_blockb65bda884c609061f293928d44abec7d {
  float: right;
  padding: 10px;
}
.simpleblogcard_borderb65bda884c609061f293928d44abec7d {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titleb65bda884c609061f293928d44abec7d {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptionb65bda884c609061f293928d44abec7d {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=1759451 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_blockb65bda884c609061f293928d44abec7d">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/51/94/1759451/thumbnail?1726115530" alt="隙間無く囲って塗る＋消すツール 参照レイヤー用 - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_borderb65bda884c609061f293928d44abec7d">
			assets.clip-studio.com			<div class="simpleblogcard_titleb65bda884c609061f293928d44abec7d">
				隙間無く囲って塗る＋消すツール 参照レイヤー用 &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_descriptionb65bda884c609061f293928d44abec7d">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h3 class="wp-block-heading">効果素材</h3>



<h4 class="wp-block-heading">R18漫画用</h4>



<p>手軽に身体のブレを追加できるブラシ</p>



<style>
.simpleblogcard_img_blocka2169a010972c6fdec8b77c7f4793437 {
  float: right;
  padding: 10px;
}
.simpleblogcard_bordera2169a010972c6fdec8b77c7f4793437 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlea2169a010972c6fdec8b77c7f4793437 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptiona2169a010972c6fdec8b77c7f4793437 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=1770030 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_blocka2169a010972c6fdec8b77c7f4793437">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/30/00/1770030/thumbnail?1586602507" alt="モミジ式スピード線 - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_bordera2169a010972c6fdec8b77c7f4793437">
			assets.clip-studio.com			<div class="simpleblogcard_titlea2169a010972c6fdec8b77c7f4793437">
				モミジ式スピード線 &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_descriptiona2169a010972c6fdec8b77c7f4793437">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<p>衝撃系ブラシ</p>



<style>
.simpleblogcard_img_blockf3340ac330c097f1aa6f089c6f6d68d5 {
  float: right;
  padding: 10px;
}
.simpleblogcard_borderf3340ac330c097f1aa6f089c6f6d68d5 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlef3340ac330c097f1aa6f089c6f6d68d5 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptionf3340ac330c097f1aa6f089c6f6d68d5 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=1978063 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_blockf3340ac330c097f1aa6f089c6f6d68d5">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/63/80/1978063/thumbnail?1692550860" alt="衝撃びくブラシ - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_borderf3340ac330c097f1aa6f089c6f6d68d5">
			assets.clip-studio.com			<div class="simpleblogcard_titlef3340ac330c097f1aa6f089c6f6d68d5">
				衝撃びくブラシ &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_descriptionf3340ac330c097f1aa6f089c6f6d68d5">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h3 class="wp-block-heading">オートアクション</h3>



<p>「選択範囲を塗りつぶし→上書き保存」をオートアクションにしてF3ショートカットに当てています。これで保存忘れがだいぶ減りました。</p>



<h4 class="wp-block-heading">仕上げ系</h4>



<p>絵の仕上げにはこちらのとろみ加工をかけたものを不透明度50%↓でかけたりしています</p>



<style>
.simpleblogcard_img_blockfece3a4055452c8549fcbfc62c656164 {
  float: right;
  padding: 10px;
}
.simpleblogcard_borderfece3a4055452c8549fcbfc62c656164 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlefece3a4055452c8549fcbfc62c656164 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptionfece3a4055452c8549fcbfc62c656164 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=1747707 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_blockfece3a4055452c8549fcbfc62c656164">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/07/77/1747707/thumbnail?1672531565" alt="時短イラスト加工オートアクションセット - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_borderfece3a4055452c8549fcbfc62c656164">
			assets.clip-studio.com			<div class="simpleblogcard_titlefece3a4055452c8549fcbfc62c656164">
				時短イラスト加工オートアクションセット &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_descriptionfece3a4055452c8549fcbfc62c656164">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h3 class="wp-block-heading">3D素材</h3>



<p>ちょっと良いお値段しますが筋肉のアタリを取るときに便利です。</p>



<style>
.simpleblogcard_img_blocke426d645cbf74b1457809c7cfd0f9da9 {
  float: right;
  padding: 10px;
}
.simpleblogcard_bordere426d645cbf74b1457809c7cfd0f9da9 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_titlee426d645cbf74b1457809c7cfd0f9da9 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_descriptione426d645cbf74b1457809c7cfd0f9da9 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=2137282 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_blocke426d645cbf74b1457809c7cfd0f9da9">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://assets.clip-studio.com/view/img/index/rating_ja-jp.png" alt="【3D】筋肉質な体 Ver.2 - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_bordere426d645cbf74b1457809c7cfd0f9da9">
			assets.clip-studio.com			<div class="simpleblogcard_titlee426d645cbf74b1457809c7cfd0f9da9">
				【3D】筋肉質な体 Ver.2 &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_descriptione426d645cbf74b1457809c7cfd0f9da9">
					これはレーティング素材です				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<p>手はかなりハンドモデル頼り</p>



<style>
.simpleblogcard_img_block5e07e77c606e5a5ea14accf045cd1d67 {
  float: right;
  padding: 10px;
}
.simpleblogcard_border5e07e77c606e5a5ea14accf045cd1d67 {
  border-left: solid 5px #7db4e6;
  padding: 0.25em 0.25em;
  background: transparent;
}
.simpleblogcard_title5e07e77c606e5a5ea14accf045cd1d67 {
  line-height: 140%;
  font-weight: bold;
  display: block;
}
.simpleblogcard_description5e07e77c606e5a5ea14accf045cd1d67 {
  line-height: 130%;
  color: #333;
}
</style>
<div class="simpleblogcard_wrap">
			<a style="text-decoration: none;" href=https://assets.clip-studio.com/ja-jp/detail?id=2133893 target="_blank" rel="noopener">
				<figure class="simpleblogcard_img_block5e07e77c606e5a5ea14accf045cd1d67">
			<img decoding="async" style="border-radius: 5px; width: 100px; height: 100px;" src="https://celclipmaterialprod.s3-ap-northeast-1.amazonaws.com/93/38/2133893/thumbnail?1769997982" alt="【3D】男性の手 Ver.3.1 - CLIP STUDIO ASSETS" />
		</figure>
		<div class="simpleblogcard_inner">
		<div class="simpleblogcard_border5e07e77c606e5a5ea14accf045cd1d67">
			assets.clip-studio.com			<div class="simpleblogcard_title5e07e77c606e5a5ea14accf045cd1d67">
				【3D】男性の手 Ver.3.1 &#8211; CLIP STUDIO ASSETS			</div>
							<div class="simpleblogcard_description5e07e77c606e5a5ea14accf045cd1d67">
					イラスト・マンガ制作に役立つトーン、ブラシ、3Dデ&#8230;				</div>
					</div>
	</div>
	<div style="clear: both;"></div>
	</a>
</div>



<h2 class="wp-block-heading">絵の参考</h2>



<h3 class="wp-block-heading">書籍</h3>



<p>身体の描き方は上から順に参考にしてます</p>



<p>人体を描く上でのポイントがわかりやすいです</p>



<div class="blogcard"><a href="https://www.amazon.co.jp/dp/B0CMZBD5Q5" target="_blank" rel="noopener noreferrer" data-blogcard="1">TACO直伝！ 知っているだけで劇的に上達する 人体ドローイングのコツ390</a></div>



<p>身体の描き方がリアル→漫画的な絵への落とし込みが分かりやすいので入門に良いです。</p>



<div class="blogcard"><a href="https://www.amazon.co.jp/dp/4837308139" target="_blank" rel="noopener noreferrer" data-blogcard="1">お絵描きチュートリアル / パク・リノ</a></div>



<p>筋肉の構造の確認などはこちらを参照。描いてる途中に確認するときはこの辺</p>



<div class="blogcard"><a href="https://www.amazon.co.jp/dp/4837301800" target="_blank" rel="noopener noreferrer" data-blogcard="1">アーティストのための美術解剖学 / ヴァレリー・L・ウィンスロゥ</a></div>



<p>理論的な筋肉や骨の動きまで把握するのに良いです　が、分厚い…　描いてる途中ではあまり見ず、たまに読んで模写したりしています</p>



<div class="blogcard"><a href="https://www.amazon.co.jp/dp/4274507157" target="_blank" rel="noopener noreferrer" data-blogcard="1">ソッカの美術解剖学ノート / ソク・ジョンヒョン</a></div>



<p>塗りの参考に。光と色の関係がとてもわかりやすく描かれています。</p>



<div class="blogcard"><a href="https://www.amazon.co.jp/dp/4837308201" target="_blank" rel="noopener noreferrer" data-blogcard="1">光と色のチュートリアル / パク・リノ</a></div>



<h3 class="wp-block-heading">サイト</h3>



<p>・<a href="https://jp.pinterest.com/">Pinterest</a></p>



<p>転載なども多いのですが「muscle drawing」や「cloth painting」などで検索していくつかピン止めすると中韓絵描きさんなどの塗りのTipsなどがどんどん得られて大変活用しています。</p>



<p>特に「latex painting」なんかはテカテカの服を描くときにめちゃめちゃ参考になりました。</p>



<p>元URL付きの投稿が有り難い…</p>



<p>・<a href="https://www.artstation.com/artwork/GX3Ax1">LIGHT REFERENCE TOOL</a></p>



<p>3Dで顔への光の当たり方を見れるツール。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>letsencrypt-CloudflareでDNS-01チャレンジ&#038;ワイルドカード証明書の取得</title>
		<link>https://blog.estampie.work/archives/3472</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Fri, 09 Aug 2024 14:52:53 +0000</pubDate>
				<category><![CDATA[個人サイト作成]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[証明書]]></category>
		<category><![CDATA[letsencrypt]]></category>
		<category><![CDATA[ワイルドカード証明書]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=3472</guid>

					<description><![CDATA[m.estampie.work, blog.estampie.work&#8230; と個別に証明書を取っていたのですが面倒になってきたのでワイルドカード証明書を取ることにしました。またHTTP-01チャレンジで行ってい [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>m.estampie.work, blog.estampie.work&#8230; と個別に証明書を取っていたのですが面倒になってきたのでワイルドカード証明書を取ることにしました。またHTTP-01チャレンジで行っていたのでDNS-01チャレンジで取得してみます。</p>



<h2 class="wp-block-heading">DNS-01チャレンジで証明書取得</h2>



<p>サンプルは<strong>example.com</strong>です。</p>



<p>既にcerbotはインストール済みのため、追加で必要なパッケージを取得します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="sudo apt-get update
sudo apt-get install python3-certbot-dns-cloudflare" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">python3-certbot-dns-cloudflare</span></span></code></pre></div>



<p><a href="https://dash.cloudflare.com/profile/api-tokens">Cloudflareのダッシュボード</a>でAPIトークンを取得しておきます。テンプレートから「ゾーン DNS を編集する」を選び、対象ドメインを指定します。</p>



<p>取得したら<code>/etc/letsencrypt/cloudflare.ini</code>ファイルを作成してAPIトークンを記述します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="sudo vi /etc/letsencrypt/cloudflare.ini
sudo chmod 600 /etc/letsencrypt/cloudflare.ini" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">vi</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/letsencrypt/cloudflare.ini</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">chmod</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">600</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/letsencrypt/cloudflare.ini</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">/etc/letsencrypt/cloudflare.ini</span><span role="button" tabindex="0" data-code="dns_cloudflare_api_token = APIトークン" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">dns_cloudflare_api_token</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">APIトークン</span></span></code></pre></div>



<p>元々<strong>example.com</strong>で証明書を取得していたのでワイルドカード証明書もcert-nameを同名で取得します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
  -d &quot;*.example.com&quot; \
  -d &quot;example.com&quot; \
  --cert-name example.com" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">certbot</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">certonly</span><span style="color: #D8DEE9FF"> </span><span style="color: #EBCB8B">\</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">--dns-cloudflare</span><span style="color: #D8DEE9FF"> </span><span style="color: #EBCB8B">\</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">--dns-cloudflare-credentials</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/letsencrypt/cloudflare.ini</span><span style="color: #D8DEE9FF"> </span><span style="color: #EBCB8B">\</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">-d</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">*.example.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #EBCB8B">\</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">-d</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">example.com</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #EBCB8B">\</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">--cert-name</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">example.com</span></span></code></pre></div>



<p>完了したら下記コマンドで証明書を確認します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="sudo certbot certificates" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">certbot</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">certificates</span></span></code></pre></div>



<p>ワイルドカード証明書でカバーできる不要な証明書は下記で削除します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="sudo certbot delete --cert-name blog.example.com" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">certbot</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">delete</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--cert-name</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">blog.example.com</span></span></code></pre></div>



<p>Nginxに記述してある証明書ファイルの場所<strong>ssl_certificate, ssl_certificate_key</strong>を統一したcert-name example.comのものに置き換えます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">default</span><span role="button" tabindex="0" data-code="server {
    listen 443 ssl;
    server_name blog.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_verify_client off;
    ...
}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">server</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">listen</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">443</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ssl</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">server_name</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">blog.example.com</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ssl_certificate</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/letsencrypt/live/example.com/fullchain.pem</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ssl_certificate_key</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/letsencrypt/live/example.com/privkey.pem</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">ssl_verify_client</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">off</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">...</span></span>
<span class="line"><span style="color: #D8DEE9FF">}</span></span></code></pre></div>



<p>またHTTP-01チャレンジの際に必要だった/.well-known/へのアクセスの切り分けも不要になります。</p>



<p>書き換えたらNginxを再起動します。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="sudo nginx -t
sudo systemctl reload nginx" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nginx</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-t</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">systemctl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">reload</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nginx</span></span></code></pre></div>



<p>以上で完了です。</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>特定の件名のメールを受信したらLINE通知するpythonスクリプト</title>
		<link>https://blog.estampie.work/archives/3455</link>
		
		<dc:creator><![CDATA[nocturns]]></dc:creator>
		<pubDate>Wed, 07 Aug 2024 12:45:32 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Skeb]]></category>
		<category><![CDATA[LINE通知]]></category>
		<category><![CDATA[BOOTH]]></category>
		<guid isPermaLink="false">https://blog.estampie.work/?p=3455</guid>

					<description><![CDATA[IMAPメールの受信ボックスの未読メールから特定の件名&#38;送信元のメールを取得→LINE通知→既読にするPythonスクリプトです。 前回書いたものはGASを使ってGmailのみ対応でしたが、こちらはIMAPメール [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>IMAPメールの受信ボックスの未読メールから特定の件名&amp;送信元のメールを取得→LINE通知→既読にするPythonスクリプトです。</p>



<p><a href="https://blog.estampie.work/archives/3155">前回書いたもの</a>はGASを使ってGmailのみ対応でしたが、こちらはIMAPメールなら何でも大丈夫です。</p>



<p>サンプルではBoothの購入とskebリクエストが入ったら通知します。</p>



<p>自鯖があればLinuxならCronで定期実行してあげます。</p>



<p>24時間動いているPCがないといけないので、<a href="https://qiita.com/hiiii/items/0f442a2284cfdce7fbcf">AWSのLambdaを使って無料枠で実行</a>したりも良いかもです。(無料枠だと実行間隔に注意かも)</p>


<p class="mymore"><a href="https://blog.estampie.work/archives/3455">続きを読む</a></p>


<span id="more-3455"></span>



<p><code>requests</code>ライブラリが入っていない場合はインストールしておきます。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" data-code="pip install requests" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">pip</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">requests</span></span></code></pre></div>



<h4 class="wp-block-heading">mail.py(LINE Notefyバージョン)</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">mail.py</span><span role="button" tabindex="0" data-code="import imaplib
import email
from email.header import decode_header
import requests
# IMAPサーバー設定
imap_host = 'メールサーバー'
imap_user = 'メールアドレス'
imap_pass = 'メールパスワード'
# LINE Notify設定
line_access_token = 'アクセストークン'
def send_line_notify(access_token, message):
    url = 'https://notify-api.line.me/api/notify'
    headers = {
        'Authorization': 'Bearer ' + access_token
    }
    data = {
        'message': message
    }
    response = requests.post(url, headers=headers, data=data)
    print(response.text)
mail = imaplib.IMAP4_SSL(imap_host)
mail.login(imap_user, imap_pass)
mail.select('inbox')
type, data = mail.search(None, 'UNSEEN')
mail_ids = data[0]
if mail_ids:
    id_list = mail_ids.split()
    for num in id_list:
        typ, data = mail.fetch(num, '(RFC822)')
        raw_email = data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = email.message_from_string(raw_email_string)
        subject = decode_header(email_message['subject'])[0][0]
        if isinstance(subject, bytes):
            subject = subject.decode()
        from_email = email_message['from']
        
        if '@skeb.jp' in from_email and 'リクエストが届きました' in subject:
            send_line_notify(line_access_token, '&#x2728;skebリクエストが届きました')
        elif '@booth.pm' in from_email and '商品が購入されました' in subject:
            send_line_notify(line_access_token, '&#x2705;BOOTHに注文が入りました')
        
        # メールを既読に
        mail.store(num, '+FLAGS', '\Seen')
mail.logout()" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> imaplib</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> email</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> email</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">header </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> decode_header</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> requests</span></span>
<span class="line"><span style="color: #616E88"># IMAPサーバー設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">imap_host </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">メールサーバー</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">imap_user </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">メールアドレス</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">imap_pass </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">メールパスワード</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #616E88"># LINE Notify設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">line_access_token </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">アクセストークン</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">send_line_notify</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">access_token</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">message</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    url </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">https://notify-api.line.me/api/notify</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    headers </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Authorization</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Bearer </span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> access_token</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    data </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">message</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> message</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> requests</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">post</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">url</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">headers</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">data</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">data</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">print</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">text</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> imaplib</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">IMAP4_SSL</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">imap_host</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">login</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">imap_user</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> imap_pass</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">select</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">inbox</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #88C0D0">type</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> data </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">search</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">None</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">UNSEEN</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail_ids </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> data</span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> mail_ids</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    id_list </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> mail_ids</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">split</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> num </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> id_list</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        typ</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> data </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">fetch</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">num</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">(RFC822)</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        raw_email </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> data</span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">][</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        raw_email_string </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> raw_email</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">decode</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">utf-8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        email_message </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> email</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">message_from_string</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">raw_email_string</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        subject </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">decode_header</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">email_message</span><span style="color: #ECEFF4">[</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">subject</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">])[</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">][</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">isinstance</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">subject</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">bytes</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">            subject </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> subject</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">decode</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">        from_email </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> email_message</span><span style="color: #ECEFF4">[</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">from</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">@skeb.jp</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> from_email </span><span style="color: #81A1C1">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">リクエストが届きました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> subject</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">send_line_notify</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">line_access_token</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#x2728;skebリクエストが届きました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">elif</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">@booth.pm</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> from_email </span><span style="color: #81A1C1">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">商品が購入されました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> subject</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">send_line_notify</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">line_access_token</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#x2705;BOOTHに注文が入りました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #616E88"># メールを既読に</span></span>
<span class="line"><span style="color: #D8DEE9FF">        mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">store</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">num</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">+FLAGS</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">\Seen</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">logout</span><span style="color: #ECEFF4">()</span></span></code></pre></div>



<h4 class="wp-block-heading">mail.py(LINE Messaging APIバージョン)</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(12px, .75rem, 18px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(16px, 1rem, 24px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#39404f;color:#c8d0e0">mail.py</span><span role="button" tabindex="0" data-code="import imaplib
import email
from email.header import decode_header
import requests
# IMAPサーバー設定
imap_host = 'メールサーバー'
imap_user = 'メールアドレス'
imap_pass = 'メールパスワード'
# LINE Notify設定
line_user_id = 'Line Messaging APIのID'
line_access_token = 'アクセストークン'
def send_line_notify(user_id, access_token, message):
    url = 'https://api.line.me/v2/bot/message/push'
    headers = {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer ' + access_token
    }
    data = {
        'to': user_id,
        'messages': [{'type': 'text', 'text': message}]
    }
    response = requests.post(url, headers=headers, json=data)
    print(response.text)
mail = imaplib.IMAP4_SSL(imap_host)
mail.login(imap_user, imap_pass)
mail.select('inbox')
type, data = mail.search(None, 'UNSEEN')
mail_ids = data[0]
if mail_ids:
    id_list = mail_ids.split()
    for num in id_list:
        typ, data = mail.fetch(num, '(RFC822)')
        raw_email = data[0][1]
        raw_email_string = raw_email.decode('utf-8')
        email_message = email.message_from_string(raw_email_string)
        
        subject = decode_header(email_message['subject'])[0][0]
        if isinstance(subject, bytes):
            subject = subject.decode()
        from_email = email_message['from']
        
        if '@skeb.jp' in from_email and 'リクエストが届きました' in subject:
            send_line_notify(line_user_id, line_access_token, '&#x2728;skebリクエストが届きました')
        elif '@booth.pm' in from_email and '商品が購入されました' in subject:
            send_line_notify(line_user_id, line_access_token, '&#x2705;BOOTHに注文が入りました')
        
        # メールを既読に
        mail.store(num, '+FLAGS', '\Seen')
mail.logout()" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><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 nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> imaplib</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> email</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> email</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">header </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> decode_header</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> requests</span></span>
<span class="line"><span style="color: #616E88"># IMAPサーバー設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">imap_host </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">メールサーバー</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">imap_user </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">メールアドレス</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">imap_pass </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">メールパスワード</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #616E88"># LINE Notify設定</span></span>
<span class="line"><span style="color: #D8DEE9FF">line_user_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Line Messaging APIのID</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">line_access_token </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">アクセストークン</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">send_line_notify</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">user_id</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">access_token</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">message</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    url </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">https://api.line.me/v2/bot/message/push</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    headers </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Content-Type</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">application/json</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Authorization</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">Bearer </span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> access_token</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    data </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">to</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> user_id</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">messages</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">[{</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">type</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">text</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> message</span><span style="color: #ECEFF4">}]</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> requests</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">post</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">url</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">headers</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">json</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">data</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">print</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">text</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> imaplib</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">IMAP4_SSL</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">imap_host</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">login</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">imap_user</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> imap_pass</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">select</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">inbox</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #88C0D0">type</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> data </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">search</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">None</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">UNSEEN</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail_ids </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> data</span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> mail_ids</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    id_list </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> mail_ids</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">split</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> num </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> id_list</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        typ</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> data </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">fetch</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">num</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">(RFC822)</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        raw_email </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> data</span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">][</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        raw_email_string </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> raw_email</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">decode</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">utf-8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        email_message </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> email</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">message_from_string</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">raw_email_string</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span></span>
<span class="line"><span style="color: #D8DEE9FF">        subject </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">decode_header</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">email_message</span><span style="color: #ECEFF4">[</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">subject</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">])[</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">][</span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">isinstance</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">subject</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">bytes</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">            subject </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> subject</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">decode</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">        from_email </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> email_message</span><span style="color: #ECEFF4">[</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">from</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">@skeb.jp</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> from_email </span><span style="color: #81A1C1">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">リクエストが届きました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> subject</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">send_line_notify</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">line_user_id</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> line_access_token</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#x2728;skebリクエストが届きました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">elif</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">@booth.pm</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> from_email </span><span style="color: #81A1C1">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">商品が購入されました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> subject</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">send_line_notify</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">line_user_id</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> line_access_token</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">&#x2705;BOOTHに注文が入りました</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #616E88"># メールを既読に</span></span>
<span class="line"><span style="color: #D8DEE9FF">        mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">store</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">num</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">+FLAGS</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">\Seen</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">mail</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">logout</span><span style="color: #ECEFF4">()</span></span></code></pre></div>



<p></p>
]]></content:encoded>
					
		
		
		<media:thumbnail url="https://img.estampie.work/wps/2024/03/IMG_1771-150x135.jpg" width="150" height="135" />	</item>
	</channel>
</rss>
