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

<channel>
	<title>AppleScript &#8211; jaguchi log</title>
	<atom:link href="https://jaguchi.com/blog/tag/applescript/feed/" rel="self" type="application/rss+xml" />
	<link>https://jaguchi.com</link>
	<description>Speeding on training wheels</description>
	<lastBuildDate>Sat, 07 Sep 2024 17:46:35 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.7</generator>

<image>
	<url>https://jaguchi.com/wp-content/uploads/2017/02/cropped-low_res-32x32.png</url>
	<title>AppleScript &#8211; jaguchi log</title>
	<link>https://jaguchi.com</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">149953163</site>	<item>
		<title>LaunchBar action to generate spoken audio files</title>
		<link>https://jaguchi.com/blog/2018/09/launchbar-action-to-generate-spoken-audio-files/</link>
		
		<dc:creator><![CDATA[mirka]]></dc:creator>
		<pubDate>Mon, 24 Sep 2018 14:11:42 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[AppleScript]]></category>
		<category><![CDATA[LaunchBar]]></category>
		<guid isPermaLink="false">https://jaguchi.com/?p=944</guid>

					<description><![CDATA[Combine the macOS Speech Synthesis CLI with a LaunchBar action to instantly create spoken audio files. Great for Anki flashcards!]]></description>
										<content:encoded><![CDATA[
<p>You may know that macOS comes with a rather powerful text-to-speech system. It&#8217;s capable of speaking text in different languages, and can be triggered via <a href="https://support.apple.com/kb/ph25639">keyboard shortcut</a>&nbsp;or the &#8220;Speech&#8221; context menu.</p>



<p>A lesser-known fact is that it has a command line interface.</p>



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



<pre class="wp-block-code"><code lang="bash" class="language-bash">$ say "hello world"</code></pre>



<p>This CLI offers some useful options, like specifying a voice and saving to file. By pairing this with <a href="https://obdev.at/products/launchbar/">LaunchBar</a>, we can build actions that take text input and instantly generate a spoken audio file.&nbsp;I&#8217;ve been using this to add spoken audio files to my <a href="https://apps.ankiweb.net/">Anki</a> flashcards:</p>



<div class="wp-block-image aligncenter"><figure class="aligncenter"><img fetchpriority="high" decoding="async" width="480" height="240" data-attachment-id="945" data-permalink="https://jaguchi.com/blog/2018/09/launchbar-action-to-generate-spoken-audio-files/speak-launchbar/" data-orig-file="https://jaguchi.com/wp-content/uploads/2018/09/speak-launchbar.gif" data-orig-size="480,240" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="speak-launchbar" data-image-description="" data-image-caption="" data-medium-file="https://jaguchi.com/wp-content/uploads/2018/09/speak-launchbar-300x150.gif" data-large-file="https://jaguchi.com/wp-content/uploads/2018/09/speak-launchbar.gif" src="https://jaguchi.com/wp-content/uploads/2018/09/speak-launchbar.gif" alt="" class="wp-image-945"/><figcaption><a href="https://www.obdev.at/resources/launchbar/help/InstantSend.html">Instant send</a> the text to LaunchBar, invoke the action, and get the generated audio file. Ridiculously fast!</figcaption></figure></div>



<p>I used to go to <a href="https://forvo.com/">Forvo</a> to get audio spoken by actual humans, but there were too many downsides to this. The audio quality, volume, and accents are inconsistent, and it gets pretty tedious when you&#8217;re making lots of new flashcards each day. I also find it more effective to have my audio files include <a href="https://en.wikipedia.org/wiki/Article_(grammar)">articles</a> when learning gendered nouns. And sometimes, you just want to learn a specific phrase that isn&#8217;t available on Forvo.</p>



<p>The built-in speech synthesis CLI + LaunchBar combo is the perfect solution for this.</p>



<h2 class="wp-block-heading">Download on GitHub</h2>



<p><em>Update (Sep 10, 2020) — A more feature-packed polyglot version of this script, as well as my other LaunchBar actions, are now <a href="https://github.com/mirka/launchbar-actions">available on GitHub</a>. The rest of this page may be out of date.</em></p>



<h2 class="wp-block-heading">How to set up</h2>



<p>First, go to System Preferences&nbsp;▸ Accessibility&nbsp;▸ Speech, and make sure you&#8217;ve installed the voice you want to use.</p>



<p>Next, here&#8217;s the AppleScript we&#8217;ll be using as the LaunchBar action. The way I have it set up, the text is spoken by the voice chosen in the Accessibility settings, and the audio is saved as an .m4a file in my system&#8217;s temporary folder (so as not to clutter my desktop). You should alter this script to meet your exact needs. For example, you might want to add a voice argument to the shell script (e.g. <code>-v alex</code>) to specify a certain voice.</p>



<pre class="wp-block-code"><code lang="applescript" class="language-applescript">on handle_string(str)
	
	set timeStr to (time of (current date))
	set tempItemsPath to POSIX path of (path to temporary items)
	set filePath to tempItemsPath &amp; timeStr &amp; ".m4a"
	set output to do shell script "say " &amp; quoted form of str &amp; " --data-format=aac -o " &amp; filePath
	
	tell application "LaunchBar"
		set selection to filePath
		activate
	end tell
	
end handle_string</code></pre>



<p><em>Aug 2, 2020: Updated for macOS Catalina</em></p>



<div class="wp-block-file"><a href="https://jaguchi.com/wp-content/uploads/2018/09/speak_text_as_m4a.zip">Speak text as m4a.scpt</a><a href="https://jaguchi.com/wp-content/uploads/2018/09/speak_text_as_m4a.zip" class="wp-block-file__button" download>Download</a></div>



<div class="wp-block-file"><a href="https://jaguchi.com/wp-content/uploads/2018/09/speak_text_as_m4a_catalina.zip">Speak text as m4a.scpt (Catalina)</a><a href="https://jaguchi.com/wp-content/uploads/2018/09/speak_text_as_m4a_catalina.zip" class="wp-block-file__button" download>Download</a></div>



<p>Place the .scpt file in your LaunchBar actions folder: <code>~/Library/Application Support/LaunchBar/Actions/</code></p>



<p>That&#8217;s it!</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">944</post-id>	</item>
		<item>
		<title>アマゾンのTMG便 (ファイズ) に自動再配達電話をかける</title>
		<link>https://jaguchi.com/blog/2016/03/auto-call-amazon-tmg-phyz/</link>
		
		<dc:creator><![CDATA[mirka]]></dc:creator>
		<pubDate>Wed, 09 Mar 2016 08:36:07 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[AppleScript]]></category>
		<guid isPermaLink="false">https://jaguchi.com/?p=418</guid>

					<description><![CDATA[TMG便／デリバリープロバイダ／PHYZ (ファイズ) に再配達依頼の電話を自動的にかけるシステムを作った。]]></description>
										<content:encoded><![CDATA[
<p>（2017年2月8日 追記 — <a href="/blog/2016/03/auto-call-amazon-tmg-phyz/#tmg-caller-web-generator">ウェブ版</a>もできました）</p>



<p>このところアマゾンからの荷物がTMG便／デリバリープロバイダ／PHYZ (ファイズ) という、正式名称もはっきりしない配送業者から来ることが増えてきた。この業者、ウェブサイトにアマゾン客専用の照会・再配達ページがあるにも関わらず、実際に追跡番号を入力してみると「お問い合わせ情報が存在しません」と表示されるだけで、登録されていたためしがない。2016年にもなって、わざわざ電話をかけないと再配達の依頼もできない。</p>



<p>私は自動受付電話が肉声電話の次に嫌いなので、少しでも心労を和らげようと Mac の <a href="https://support.apple.com/kb/PH18756">iPhone通話機能</a>を利用して半自動的に再配達電話をかける AppleScript を書いてしばらく使っている。</p>



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



<figure class="wp-block-image alignwide"><img decoding="async" width="1736" height="1332" data-attachment-id="423" data-permalink="https://jaguchi.com/blog/2016/03/auto-call-amazon-tmg-phyz/018-options/" data-orig-file="https://jaguchi.com/wp-content/uploads/2016/03/018-options.jpg" data-orig-size="1736,1332" data-comments-opened="0" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}" data-image-title="018-options" data-image-description="" data-image-caption="" data-medium-file="https://jaguchi.com/wp-content/uploads/2016/03/018-options-300x230.jpg" data-large-file="https://jaguchi.com/wp-content/uploads/2016/03/018-options-1024x786.jpg" src="https://jaguchi.com/wp-content/uploads/2016/03/018-options.jpg" alt="入力画面" class="wp-image-423" srcset="https://jaguchi.com/wp-content/uploads/2016/03/018-options.jpg 1736w, https://jaguchi.com/wp-content/uploads/2016/03/018-options-300x230.jpg 300w, https://jaguchi.com/wp-content/uploads/2016/03/018-options-768x589.jpg 768w, https://jaguchi.com/wp-content/uploads/2016/03/018-options-1024x786.jpg 1024w, https://jaguchi.com/wp-content/uploads/2016/03/018-options-434x333.jpg 434w, https://jaguchi.com/wp-content/uploads/2016/03/018-options-868x666.jpg 868w" sizes="(max-width: 1736px) 100vw, 1736px" /><figcaption class="wp-element-caption">AppleScript 版のダイアログ</figcaption></figure>



<p>表示されるダイアログに追跡番号をコピペして、希望日時を選択すると、iPhone経由で自動的に発信して数字を全部入力してくれる。最後に音声案内が依頼内容をまとめて復唱して「よろしければ1を…」みたいに言ってくるので、それを一応確認して自分でキーパッドの “1” を押して終わりという感じ。気づかない間に電話システムが変わってたりしたら困るから最後の確認だけ手動にしてるけど、無鉄砲な人はここの段まで自動化しちゃっていいと思う。</p>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-dots"/>



<h2 class="wp-block-heading" id="tmg-caller-web-generator">ウェブ版も作ってみた</h2>



<p>【2017年2月8日 追記】Googleのページランクが想定外に高くなってしまい、なんか申し訳ないのでAppleScriptを使わずにウェブから電話をかけられるのも作りました。電話発信リンクに対応したスマートフォンやパソコンから使えます。</p>



<script type="text/javascript" src="https://jaguchi.com/tmg-phyz-caller/tmg-phyz-caller.js"></script>

<form id="tmg-phyz-caller">
	<h3>TMG再配達電話ジェネレーター</h3>
	<label for="tmg-tracking">追跡番号（12桁の半角数字）</label>
	<input id="tmg-tracking" title="半角数字12桁の追跡番号を入力してください" maxlength="12" name="tracking" pattern="\d*" required="" type="text">
	<fieldset class="radio-row">
		<legend>
			希望日
		</legend>
		<label>
			<input id="tmg-radio-today" checked="checked" name="day" type="radio" value="today" data-com="">
			当日
		</label>
		<label>
			<input id="tmg-radio-tomorrow" name="day" type="radio" value="tomorrow" data-com="">
			翌日
		</label>
	</fieldset>
	<label for="tmg-timeslot">希望時間</label>
	<select id="tmg-timeslot">
		<option value="1">9〜12時</option>
		<option value="2">12〜14時</option>
		<option value="3">14〜16時</option>
		<option value="4">16〜18時</option>
		<option value="5">18〜20時</option>
		<option value="6">20〜21時</option>
		<option value="7">指定時間なし</option>
	</select>
<p class="help-text">（受付時間: 9〜18時は当日9時まで、18〜21時は当日18時まで）</p>
<p><button type="submit">電話番号を生成する</button></p>

	<div id="tmg-phyz-caller-result" class="hide result">
		<a>再配達依頼の自動電話をかける →</a><br>
		<p class="help-text">
			（最後に依頼内容を復唱されるのでそれを確認して “1” を押してください）
		</p>
	</div>
</form>



<hr class="wp-block-separator has-alpha-channel-opacity is-style-dots"/>



<h2 class="wp-block-heading">AppleScript版</h2>



<pre class="wp-block-code"><code lang="applescript" class="language-applescript">-- 指定した内容でTMG便に再配達依頼の電話をかける。最後に依頼内容を復唱されるのでそのときに"1"を押して終わり。
-- 2017年2月8日 更新
property dialog_title : "TMG便 - 再配達依頼"
property phone_no : "050-5525-7445"
property my_days : {"当日", "翌日"}
property my_timeslots : {"9〜12時", "12〜14時", "14〜16時", "16〜18時", "18〜20時", "20〜21時", "指定時間なし"}

tell application "System Events"
	activate
	
	-- 追跡番号
	set track_no to text returned of (display dialog "追跡番号" default answer "" with title dialog_title)
	
	if (count of track_no) is not 12 then
		display alert dialog_title message "追跡番号が12桁ではありません"
		error number -128 -- exit
	end if
	
	-- 希望日
	set my_day_response to (choose from list my_days with title dialog_title with prompt "希望日:" default items (item 1 of my_days))
	if my_day_response is false then error number -128 -- exit
	set my_day_code to my getIndexInArray((item 1 of my_day_response), my_days)
	
	-- 希望時間
	set my_timeslot_response to (choose from list my_timeslots with title dialog_title with prompt "※ 受付時間" &amp; return &amp; "9〜18時は当日9時まで" &amp; return &amp; "18〜21時は当日18時まで" &amp; return &amp; return &amp; "希望時間:" default items (item 1 of my_timeslots))
	if my_timeslot_response is false then error number -128 -- exit
	set my_timeslot_code to my getIndexInArray((item 1 of my_timeslot_response), my_timeslots)
	
	-- 確認
	display dialog "【追跡番号】" &amp; track_no &amp; return &amp; "【希望日時】" &amp; (item 1 of my_day_response) &amp; " " &amp; (item 1 of my_timeslot_response) &amp; return &amp; return &amp; "この内容で発信しますか？" with title dialog_title
	
	-- 現在時刻を元に調整
	set current_time to time of (current date)
	if current_time &gt; (18 * 3600) then -- past 18:00
		set day_string to ""
	else
		set day_string to my_day_code &amp; ",,,1,,,"
	end if
	
	-- 発信
	open location "tel:" &amp; phone_no &amp; ",,,,,," &amp; track_no &amp; "#,,,,,,,1" &amp; ",,," &amp; day_string &amp; my_timeslot_code &amp; ",,,,1"
	
end tell

on getIndexInArray(my_item, my_array)
	repeat with i from 1 to the count of my_array
		if item i of my_array is my_item then return i
	end repeat
	return 0
end getIndexInArray</code></pre>



<p>TMGサイトの一時的なトラブルかと思って我慢していたけど、何ヶ月経っても直らないので早く直してほしい。</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">418</post-id>	</item>
		<item>
		<title>iTunes: 30-second skip podcasts/audiobooks only</title>
		<link>https://jaguchi.com/blog/2012/03/itunes-30-second-skip-podcasts-audiobooks-only/</link>
		
		<dc:creator><![CDATA[mirka]]></dc:creator>
		<pubDate>Fri, 23 Mar 2012 15:34:35 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[AppleScript]]></category>
		<category><![CDATA[iTunes]]></category>
		<guid isPermaLink="false">https://jaguchi.com/en/?p=149</guid>

					<description><![CDATA[Here’s a nice AppleScript I use to rewind or skip 30 seconds in iTunes, but only when the current track is a podcast or audiobook. This allows you to have a single keyboard shortcut that works as a normal “previous track” key when listening to music, but automatically switches to a 30-second rewind when listening [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Here’s a nice AppleScript I use to rewind or skip 30 seconds in iTunes, but only when the current track is a podcast or audiobook.</p>



<p>This allows you to have a single keyboard shortcut that works as a normal “previous track” key when listening to music, but automatically switches to a 30-second rewind when listening to podcasts, audiobooks, or whatever else you specify.</p>



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



<pre class="wp-block-code"><code lang="applescript" class="language-applescript">property skip_secs : 30 -- use negative value to rewind, positive value to skip ahead
property genre_list : {"Podcast", "Books &amp; Spoken"}

tell application "iTunes"
	if (exists of current track) is false then
		return
	end if
	
	if genre of current track is in genre_list then
		set target_time to (player position + skip_secs)
		
		if (target_time > finish of current track) then
			next track
		else if (target_time &lt; 2) then
			back track
		else
			set player position to target_time
		end if
		
	else -- rewind/skip the whole track
		if (skip_secs &lt; 0) then
			back track
		else
			next track
		end if
	end if
end tell</code></pre>



<h2 class="wp-block-heading">Options</h2>



<p>Change the <code>skip_secs</code> property to your preferred interval in seconds. For example, setting <code>skip_secs</code> to <code>30</code> will result in a 30-sec fast forward, while setting it to <code>-15</code> will make it a 15-sec rewind.</p>



<p>If you would like more kinds of tracks to respond to this skip behavior, add the genre names of those tracks to <code>genre_list</code>.</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">149</post-id>	</item>
		<item>
		<title>キーボード入力モードを確認するAppleScript</title>
		<link>https://jaguchi.com/blog/2012/03/check-input-mode-applescript/</link>
		
		<dc:creator><![CDATA[mirka]]></dc:creator>
		<pubDate>Mon, 05 Mar 2012 19:11:36 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[AppleScript]]></category>
		<category><![CDATA[Typinator]]></category>
		<guid isPermaLink="false">https://jaguchi.com/?p=170</guid>

					<description><![CDATA[選択されてる入力モードが英語のときにだけ実行してほしい処理があれば、こういうスクリプトでテストできる。 例えば Typinator でブラケット [] の auto-pairing を普通に設定すると、日本語モードでカギ括弧を打ってるときにまで自動補完してきて困る。そういうときに入力モードの判定スクリプトを挟むと、英語モードのときだけ自動補完してくれるように設定可能。 ※ GUIスクリプティングなので、システム環境設定 ＞ ユニバーサルアクセス ＞ 補助装置にアクセスできるようにする がオンになっている必要がある]]></description>
										<content:encoded><![CDATA[
<p>選択されてる入力モードが英語のときにだけ実行してほしい処理があれば、こういうスクリプトでテストできる。</p>



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



<p>例えば <a href="http://www.ergonis.com/products/typinator/">Typinator</a> でブラケット <code>[]</code> の auto-pairing を普通に設定すると、日本語モードでカギ括弧を打ってるときにまで自動補完してきて困る。そういうときに入力モードの判定スクリプトを挟むと、英語モードのときだけ自動補完してくれるように設定可能。</p>



<pre class="wp-block-code"><code lang="applescript" class="language-applescript">property true_if_input : "U.S." -- input mode name to test for

tell application "System Events"
	tell process "SystemUIServer"
		set current_input to value of first menu bar item of menu bar 1 whose description is "text input"
	end tell
end tell

if current_input is true_if_input then
	return true
else
	return false
end if</code></pre>



<p>※ GUIスクリプティングなので、システム環境設定 ＞ ユニバーサルアクセス ＞ 補助装置にアクセスできるようにする がオンになっている必要がある</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">170</post-id>	</item>
		<item>
		<title>iTunesを自動フェードイン／アウト</title>
		<link>https://jaguchi.com/blog/2011/04/itunes-fade-in-fade-out/</link>
		
		<dc:creator><![CDATA[mirka]]></dc:creator>
		<pubDate>Sat, 02 Apr 2011 01:22:00 +0000</pubDate>
				<category><![CDATA[Projects]]></category>
		<category><![CDATA[iTunes]]></category>
		<category><![CDATA[music]]></category>
		<category><![CDATA[AppleScript]]></category>
		<guid isPermaLink="false">https://jaguchi.com/2011/04/itunes%e3%82%92%e8%87%aa%e5%8b%95%e3%83%95%e3%82%a7%e3%83%bc%e3%83%89%e3%82%a4%e3%83%b3%ef%bc%8f%e3%82%a2%e3%82%a6%e3%83%88</guid>

					<description><![CDATA[iTunes を play/pause すると同時に音量をフェードイン／フェードアウトする AppleScript。 AirPlay 時代のエチケット。ステレオコンポのときから、ボリュームつまみをゆっくり絞ったあとに停止ボタンを押してたタイプの人用。 使い方 Spark や Quicksilver のようなツールにスクリプトを登録しておいて、ホットキーで呼び出す。たとえば F8 に設定しておくと、 F8 がフェード付きの iTunes 再生／停止キーになる。]]></description>
										<content:encoded><![CDATA[
<p>iTunes を play/pause すると同時に音量をフェードイン／フェードアウトする AppleScript。</p>



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



<pre class="wp-block-code"><code lang="applescript" class="language-applescript">property resolution : 10 (* Increase for smoother fades. Default: 10 *)
property delayIncr : 0.2 (* Decrease for faster fades. Default: 0.2 *)

tell application "iTunes"
	set originalVol to sound volume
	set volIncr to originalVol div resolution
	
	if player state is not playing then
		set sound volume to 0
		play
		
		-- Fade in
		repeat while (sound volume ≤ (originalVol - volIncr))
			set sound volume to (sound volume + volIncr)
			delay delayIncr
		end repeat
		
	else
		-- Fade out
		repeat while (sound volume > 0)
			set sound volume to (sound volume - volIncr)
			delay delayIncr
		end repeat
		
		pause
		
	end if
	
	set sound volume to originalVol
	
end tell</code></pre>



<p>AirPlay 時代のエチケット。ステレオコンポのときから、ボリュームつまみをゆっくり絞ったあとに停止ボタンを押してたタイプの人用。</p>



<h2 class="wp-block-heading">使い方</h2>



<p><a href="http://www.shadowlab.org/Software/spark.php">Spark</a> や <a href="http://qsapp.com/">Quicksilver</a> のようなツールにスクリプトを登録しておいて、ホットキーで呼び出す。たとえば F8 に設定しておくと、 F8 がフェード付きの iTunes 再生／停止キーになる。</p>
]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">13</post-id>	</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: jaguchi.com @ 2026-08-31 14:06:09 by W3 Total Cache
-->