<?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>プログラミング | 浅井のブログ</title>
	<atom:link href="https://asaino.net/category/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://asaino.net</link>
	<description></description>
	<lastBuildDate>Thu, 31 Jul 2025 13:05:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://asaino.net/wp-content/uploads/2025/03/sakana-150x150.png</url>
	<title>プログラミング | 浅井のブログ</title>
	<link>https://asaino.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ESP32 の MicroPython を Wi-Fi 経由で更新する WebRepl の設定</title>
		<link>https://asaino.net/webrepl/</link>
					<comments>https://asaino.net/webrepl/#respond</comments>
		
		<dc:creator><![CDATA[浅井和久]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 08:58:54 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[成果物]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=1019</guid>

					<description><![CDATA[どんなもの？ ESP32 を MicroPython (軽量版 Python) で制御し、なおかつそのプログラムを Wi-Fi 経由で更新できる。IoT づくりで、自由度の高いプログラミングをする際の個人的最適解だと思っ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h5 class="wp-block-heading"><span id="toc1">どんなもの？</span></h5>



<p>ESP32 を MicroPython (軽量版 Python) で制御し、なおかつそのプログラムを Wi-Fi 経由で更新できる。<br>IoT づくりで、自由度の高いプログラミングをする際の個人的最適解だと思っている。</p>



<p>自由度が低くて簡単なら HomeAssistant + ESPHome？</p>



<h5 class="wp-block-heading"><span id="toc2">設定方法</span></h5>



<p>開発環境 Thonny の「実行」→「インタプリタの設定」→「Install or update MicroPython」で、使っている ESP32 を指定し、MicroPython をインストール。</p>



<p>シェルが開くので、</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import webrepl_setup</pre>



<p>を実行し、ウィザードに従って Repl をインストール。</p>



<p>ESP32 の boot に以下のようなコードを書き込む。<br>固定 IP にしておくと多分大抵の環境で便利。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import webrepl
import network
import time
import machine

# Wi-Fi設定
SSID = '**'
PASSWORD = '**'
IP_ADDRESS = '**'
SUBNET_MASK = '**'
GATEWAY = '**'
DNS_SERVER = '**'

# Wi-Fiに接続
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
    print('Connecting to network', end='')
    sta_if.active(True)
    sta_if.ifconfig((IP_ADDRESS, SUBNET_MASK, GATEWAY, DNS_SERVER))
    sta_if.connect(SSID, PASSWORD)
    
    # 接続待ち
    while not sta_if.isconnected():
        print('.', end='')
        time.sleep(1)
        
print('Network config:', sta_if.ifconfig())

# WebREPLを開始
webrepl.start()
</pre>



<p>ESP32 側に忘れず保存しておく。</p>



<h5 class="wp-block-heading"><span id="toc3">接続方法</span></h5>



<p>Thonny の「実行」→「インタプリタの設定」→「ポートまたは WebRepl」で、さっき設定した IP とパスワードを入れる。</p>



<h5 class="wp-block-heading"><span id="toc4">注意点</span></h5>



<p>main.py としてプログラムを ESP32 に書き込むと、boot.py 終了後に実行される。<br>Repl 接続中は Thonny から実行することになる。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/webrepl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Style-Bert-VITS2でマルチGPUで学習を回す</title>
		<link>https://asaino.net/style-bert-vits2%e3%81%a7%e3%83%9e%e3%83%ab%e3%83%81gpu%e3%81%a7%e5%ad%a6%e7%bf%92%e3%81%99%e3%82%8b/</link>
					<comments>https://asaino.net/style-bert-vits2%e3%81%a7%e3%83%9e%e3%83%ab%e3%83%81gpu%e3%81%a7%e5%ad%a6%e7%bf%92%e3%81%99%e3%82%8b/#respond</comments>
		
		<dc:creator><![CDATA[東久部良 和真]]></dc:creator>
		<pubDate>Sat, 24 May 2025 15:49:41 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=946</guid>

					<description><![CDATA[3090 が2枚ある環境で、マルチGPUを活用したい。]]></description>
										<content:encoded><![CDATA[
<p>3090 が2枚ある環境で、マルチGPUを活用したい。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">torchrun --standalone --nnodes=1 --nproc_per_node=2 train_ms_jp_extra.py -c Data/&lt;model_name&gt;/config.json -m Data/&lt;model_name&gt;</pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/style-bert-vits2%e3%81%a7%e3%83%9e%e3%83%ab%e3%83%81gpu%e3%81%a7%e5%ad%a6%e7%bf%92%e3%81%99%e3%82%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python でpipを入れようとするとBus error が生じる。</title>
		<link>https://asaino.net/pip-error/</link>
					<comments>https://asaino.net/pip-error/#respond</comments>
		
		<dc:creator><![CDATA[東久部良 和真]]></dc:creator>
		<pubDate>Fri, 09 May 2025 13:49:21 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=755</guid>

					<description><![CDATA[背景 Pythonのインストール後、Python3 -m ensurepip を実行してpipのインストールを試みたが、Bus error:10 と表示され、プログラムが終了する。 エラー原因の調査 エラーがどこで起きた [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h5 class="wp-block-heading"><span id="toc1">背景</span></h5>



<p>Pythonのインストール後、<code>Python3 -m ensurepip</code> を実行してpipのインストールを試みたが、<br><code>Bus error:10</code> と表示され、プログラムが終了する。</p>



<h5 class="wp-block-heading"><span id="toc2">エラー原因の調査</span></h5>



<p>エラーがどこで起きたのかがわからないと原因の究明に至れないので、faulthandler を使ってエラー発生箇所を特定する。faulthandleはtracebackを明示的にダンプしてくれる関数である。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">python3 -X faulthandler -m ensurepip --upgrade</pre>



<p>これを実行すると、エラー内容が次のように表示された</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Current thread 0x0000000104c1f880 (most recent call first):
  File "/usr/local/lib/python3.7/ctypes/__init__.py", line 273 in _reset_cache
  File "/usr/local/lib/python3.7/ctypes/__init__.py", line 543 in &lt;module&gt;

...省略

  File "/usr/local/lib/python3.7/ensurepip/__init__.py", line 27 in _run_pip
  File "/usr/local/lib/python3.7/ensurepip/__init__.py", line 117 in _bootstrap
  File "/usr/local/lib/python3.7/ensurepip/__init__.py", line 204 in _main
  File "/usr/local/lib/python3.7/ensurepip/__main__.py", line 5 in &lt;module&gt;
  File "/usr/local/lib/python3.7/runpy.py", line 85 in _run_code
  File "/usr/local/lib/python3.7/runpy.py", line 193 in _run_module_as_main
Bus error: 10</pre>



<p>どうやらctypesをimport した時にエラーを吐くっぽい。実際に対話モードで<code>import ctypes</code> と明示的にctypes を入れてやると、<code>Bus error</code> と表示されて異常終了した。</p>



<h5 class="wp-block-heading"><span id="toc3">うーん</span></h5>



<p>エラーの再現には成功した。しかし同様の事例があまりネットに転がっておらず、似たような事例の解決案を試してみても<code>bus error</code> は消えない。。。<code>bus error</code> の原因がctypes だけとも限らないし、Python のバージョンを変更したら解決できるのだろうか。<br>明日(土曜)に色々試したい、って明日は休日出勤だった。。。(~_~);</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/pip-error/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dockerfile からビルド時にpip install に失敗する</title>
		<link>https://asaino.net/docker-build-failed/</link>
					<comments>https://asaino.net/docker-build-failed/#respond</comments>
		
		<dc:creator><![CDATA[東久部良 和真]]></dc:creator>
		<pubDate>Mon, 28 Apr 2025 16:23:42 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[寄稿]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=701</guid>

					<description><![CDATA[ビルド時にpip install に失敗する DockerfileにRUN pip install --no-cache-dir -r requirements.txt と記述し、buildした際、txtファイル内に記述 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h5 class="wp-block-heading"><span id="toc1">ビルド時にpip install に失敗する</span></h5>



<p>Dockerfileに<code>RUN pip install --no-cache-dir -r requirements.txt</code> と記述し、buildした際、txtファイル内に記述したnumpy などのパッケージが<code>No matching distribution found for</code> というエラーを吐いて失敗する。しかしながら、pip install を記述せずに先にビルドしてコンテナ起動後に、コンテナ内でpip install すると成功してしまう。</p>



<h5 class="wp-block-heading"><span id="toc2">ビルド時に追加のオプションを指定</span></h5>



<p>このエラーはDNS失敗に起因するものである。<code>docker build --network=host -t &lt;コンテナ名&gt;</code> のように<code>--network=host </code>という引数を追加することで、DNS問題を回避できる。</p>



<h5 class="wp-block-heading"><span id="toc3">docker-compose.yml の場合</span></h5>



<p>docker-compose.ymlにnetwork_modeをhostに指定する。ホストと同じ DNS / proxy を使えるのでDNS失敗を回避できる。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">version: "3.9"

services:
  app:
    build:
      context: .
      network: host         # ←★ここ
    network_mode: host      # ←★ここ</pre>



<p><br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/docker-build-failed/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>iOS向けのONNX Runtimeを用いたObject Detectionを試してみる</title>
		<link>https://asaino.net/onnxtest-for-ios-1/</link>
					<comments>https://asaino.net/onnxtest-for-ios-1/#respond</comments>
		
		<dc:creator><![CDATA[東久部良 和真]]></dc:creator>
		<pubDate>Tue, 08 Apr 2025 18:48:45 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[寄稿]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=649</guid>

					<description><![CDATA[基本的には以下のgithub のreadme の内容に従えばいいが、特に使い慣れないxcode を使う作業を含めて戸惑った点について記載する。 rubyのバージョンが古い onnx runtime を使うためのツールとし [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>基本的には以下のgithub のreadme の内容に従えばいいが、特に使い慣れないxcode を使う作業を含めて戸惑った点について記載する。</p>



<div class="wp-block-cocoon-blocks-blogcard blogcard-type bct-none">

<a rel="noopener" href="https://github.com/microsoft/onnxruntime-inference-examples/tree/main/mobile/examples/object_detection/ios" title="onnxruntime-inference-examples/mobile/examples/object_detection/ios at main · microsoft/onnxruntime-inference-examples" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://opengraph.githubassets.com/d8a5cfeb0e04dea3eaab3f36c187229d719a8a3f54067beaed7d630993c0a83b/microsoft/onnxruntime-inference-examples" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">onnxruntime-inference-examples/mobile/examples/object_detection/ios at main · microsoft/onnxruntime-inference-examples</div><div class="blogcard-snippet external-blogcard-snippet">Examples for using ONNX Runtime for machine learning inferencing. - microsoft/onnxruntime-inference-examples</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/microsoft/onnxruntime-inference-examples/tree/main/mobile/examples/object_detection/ios" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>
</div>



<h5 class="wp-block-heading"><span id="toc1">rubyのバージョンが古い</span></h5>



<p>onnx runtime を使うためのツールとしてcocoapodsをインストールしようとすると、rubyのバージョンが古いと怒られた。mac にはruby がデフォルトで入っているものの、そのバージョンが古いため、アップデートする必要がある。</p>



<h5 class="wp-block-heading"><span id="toc2">tensorflowがインストールできない。pythonのパッケージが合わない</span></h5>



<p>仮想環境を作成する際、誤ってPython3.13 で作成していた。tensorflowはpython3.13向けに公開されていない（2025/04/09現在）。python3.11で環境を作り直すと正常に動作した。パッケージのインストールでトラブルがあった際はpythonのバージョンを確認してみるのが大事だ。</p>



<h5 class="wp-block-heading"><span id="toc3">xcodeでチームを設定するとFailed to register bundle identifier と表示される。</span></h5>



<p>bundle identifier が同じだと上記のエラーを吐く。bundle identifierが同じにならないように末尾に適当な数字（日付など）の追記などの対策をする必要がある。</p>



<h5 class="wp-block-heading"><span id="toc4">すべての手順を実施してもビルドに失敗する</span></h5>



<p>onnxruntime.h not found というエラーが出た。ccoapodで正しくライブラリが構築できていないことが疑われたので、ライブラリの再構築をしてみた。<code>pod deintegrate</code> でプロジェクトからライブラリ を切り離して、もう一度<code>pod install</code> で構築したが、それでも治らない。</p>



<p>しかし、xcode を再起動すると<s>なぜか</s>ビルドに成功した。</p>



<figure data-wp-context="{&quot;imageId&quot;:&quot;69b2a3bc6c726&quot;}" data-wp-interactive="core/image" data-wp-key="69b2a3bc6c726" class="wp-block-image aligncenter size-large is-resized wp-lightbox-container"><img fetchpriority="high" decoding="async" width="473" height="1024" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://asaino.net/wp-content/uploads/2025/04/A238BB50-3EDD-41FF-8737-2AA9435A8DD3_1_102_o-473x1024.jpeg" alt="" class="wp-image-657" style="width:171px;height:auto" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/onnxtest-for-ios-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>cocoon+Enlighterで謎のHTMLコードが表示される</title>
		<link>https://asaino.net/cocoonenlighter%e3%81%a7%e8%ac%8e%e3%81%aehtml%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%82%8b/</link>
					<comments>https://asaino.net/cocoonenlighter%e3%81%a7%e8%ac%8e%e3%81%aehtml%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%82%8b/#respond</comments>
		
		<dc:creator><![CDATA[浅井和久]]></dc:creator>
		<pubDate>Thu, 27 Mar 2025 13:35:47 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=447</guid>

					<description><![CDATA[症状 コードブロックでコピーができるようにEnlighterを導入したのだが、見えちゃいけないはずのHTMLコードが表示され、うまくレンダリングされなかった。↓見た目だけ再現 原因 cocoon設定の方の「ソースコードを [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h5 class="wp-block-heading"><span id="toc1">症状</span></h5>



<p>コードブロックでコピーができるようにEnlighterを導入したのだが、見えちゃいけないはずのHTMLコードが表示され、うまくレンダリングされなかった。<br>↓見た目だけ再現</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">&lt;span class="hljs-function">&lt;span class="hljs-keyword">function&lt;/span> &lt;span class="hljs-title">custom_category_card_widget&lt;/span>&lt;span class="hljs-params">()&lt;/span> &lt;/span>{
    $args = &lt;span class="hljs-keyword">array&lt;/span>(
        &lt;span class="hljs-string">'post_type'&lt;/span>      => &lt;span class="hljs-string">'post'&lt;/span>,
        &lt;span class="hljs-string">'posts_per_page'&lt;/span> => &lt;span class="hljs-number">10&lt;/span>,
        &lt;span class="hljs-string">'category_name'&lt;/span>  => &lt;span class="hljs-string">'seikabutsu'&lt;/span>,
    );
    $query = &lt;span class="hljs-keyword">new&lt;/span> WP_Query($args);
    &lt;span class="hljs-comment">// ラッパー div を追加&lt;/span>
    $html = &lt;span class="hljs-string">'&lt;div class="custom-widget">&lt;div class="custom-post-cards">'&lt;/span>;
    &lt;span class="hljs-keyword">if&lt;/span> ($query->have_posts()) {
        &lt;span class="hljs-keyword">while&lt;/span> ($query->have_posts()) {
            $query->the_post();
            $link    = get_permalink();
            $title   = get_the_title();
            $date    = get_the_date(&lt;span class="hljs-string">'Y.n.j'&lt;/span>);
            $excerpt = get_the_excerpt();
            $excerpt = str_replace(&lt;span class="hljs-string">'[...]'&lt;/span>, &lt;span class="hljs-string">' ...'&lt;/span>, $excerpt);
            $thumb   = has_post_thumbnail()</pre>



<h5 class="wp-block-heading"><span id="toc2">原因</span></h5>



<p>cocoon設定の方の「ソースコードをハイライト表示する」がONになっていると、ソースコードのレンダリングで競合するらしい。</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="465" src="https://asaino.net/wp-content/uploads/2025/03/image-2-1024x465.png" alt="" class="wp-image-449" srcset="https://asaino.net/wp-content/uploads/2025/03/image-2-1024x465.png 1024w, https://asaino.net/wp-content/uploads/2025/03/image-2-300x136.png 300w, https://asaino.net/wp-content/uploads/2025/03/image-2-768x349.png 768w, https://asaino.net/wp-content/uploads/2025/03/image-2.png 1494w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h5 class="wp-block-heading"><span id="toc3">ついでに</span></h5>



<p>フォントをVScodeで見慣れた consoles + MS ゴシック にした。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="css" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* 2025.3.27 Enlighter フォント*/
.enlighter-code {
    font-family: Consolas, "MS Gothic", "Courier New", monospace;
	font-size: 1.3em
}</pre>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/cocoonenlighter%e3%81%a7%e8%ac%8e%e3%81%aehtml%e3%82%b3%e3%83%bc%e3%83%89%e3%81%8c%e8%a1%a8%e7%a4%ba%e3%81%95%e3%82%8c%e3%82%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>トップページ用ウィジェットの作成</title>
		<link>https://asaino.net/top-widget/</link>
					<comments>https://asaino.net/top-widget/#comments</comments>
		
		<dc:creator><![CDATA[浅井和久]]></dc:creator>
		<pubDate>Wed, 26 Mar 2025 17:28:45 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[成果物]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=390</guid>

					<description><![CDATA[このブログの備忘録的側面が大きすぎて、他の人に自分がどんなことしてるか見てもらうのに適していなかったので、トップページを刷新。真面目に書いた記事には「成果物」カテゴリをつけて、そのカテゴリがついた記事だけ一覧表示させるウ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このブログの備忘録的側面が大きすぎて、他の人に自分がどんなことしてるか見てもらうのに適していなかったので、トップページを刷新。<br>真面目に書いた記事には「成果物」カテゴリをつけて、そのカテゴリがついた記事だけ一覧表示させるウィジェットを作った。<br><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-light-grey-color">なんかもっと王道なやり方がある気がするが、目的は達成できたのでよしとする。</mark><br>共同作成者のChatGPTには感謝申し上げます。</p>



<p>↓作ったトップページ</p>



<figure class="wp-block-image size-full is-resized"><a href="https://asaino.net/wp-content/uploads/2025/03/image.png"><img decoding="async" width="738" height="539" src="https://asaino.net/wp-content/uploads/2025/03/image.png" alt="" class="wp-image-392" style="width:435px;height:auto" srcset="https://asaino.net/wp-content/uploads/2025/03/image.png 738w, https://asaino.net/wp-content/uploads/2025/03/image-300x219.png 300w" sizes="(max-width: 738px) 100vw, 738px" /></a></figure>



<h5 class="wp-block-heading"><span id="toc1">成果物ウィジェット</span></h5>



<p>「成果物」カテゴリがついた記事を、新しい順に10件表示する。<br><code>外観 &gt; テーマファイルエディタ &gt; functions.php</code>に記載</p>



<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function custom_category_card_widget() {
    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => 10,
        'category_name'  => 'seikabutsu',
    );
    $query = new WP_Query($args);
    // ラッパー div を追加
    $html = '&lt;div class="custom-widget">&lt;div class="custom-post-cards">';
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $link    = get_permalink();
            $title   = get_the_title();
            $date    = get_the_date('Y.n.j');
            $excerpt = get_the_excerpt();
            $excerpt = str_replace('[...]', ' ...', $excerpt);
            $thumb   = has_post_thumbnail()
                ? get_the_post_thumbnail(get_the_ID(), 'medium')
                : '&lt;img src="https://via.placeholder.com/180x180?text=No+Image" alt="No Image">';
            // カテゴリをバッジ風に出力
            $categories = get_the_category();
            $cat_labels = '';
            if (!empty($categories)) {
                foreach ($categories as $category) {
                    $cat_labels .= '&lt;span class="card-category">' . esc_html($category->name) . '&lt;/span>';
                }
            }
            $html .= '&lt;a class="custom-post-card" href="' . esc_url($link) . '">';
            $html .= '  &lt;div class="card-thumb">' . $thumb . '&lt;/div>';
            $html .= '  &lt;div class="card-meta">';
            $html .= '    &lt;div class="card-header">';
            $html .= '      &lt;div class="card-title">' . esc_html($title) . '&lt;/div>';
            $html .= '      &lt;div class="card-date">';
            $html .= '        &lt;span class="date-text">' . esc_html($date) . '&lt;/span>' . $cat_labels;
            $html .= '      &lt;/div>';
            $html .= '    &lt;/div>';
            $html .= '    &lt;div class="card-excerpt">' . esc_html($excerpt) . '&lt;/div>';
            $html .= '  &lt;/div>';
            $html .= '&lt;/a>';
        }
    } else {
        $html .= '&lt;p>該当する記事がありません&lt;/p>';
    }
    $html .= '&lt;/div>&lt;/div>'; // custom-post-cards と custom-widget の終了タグ
    wp_reset_postdata();
    return $html;
}
add_shortcode('seikabutsu_widget', 'custom_category_card_widget');</pre>



<h5 class="wp-block-heading"><span id="toc2">すべての新着記事ウィジェット</span></h5>



<pre class="EnlighterJSRAW" data-enlighter-language="php" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">function custom_category_card_widget() {
    $args = array(
        'post_type'      => 'post',
        'posts_per_page' => 10,
        'category_name'  => 'seikabutsu',
    );
    $query = new WP_Query($args);
    // ラッパー div を追加
    $html = '&lt;div class="custom-widget">&lt;div class="custom-post-cards">';
    if ($query->have_posts()) {
        while ($query->have_posts()) {
            $query->the_post();
            $link    = get_permalink();
            $title   = get_the_title();
            $date    = get_the_date('Y.n.j');
            $excerpt = get_the_excerpt();
            $excerpt = str_replace('[...]', ' ...', $excerpt);
            $thumb   = has_post_thumbnail()
                ? get_the_post_thumbnail(get_the_ID(), 'medium')
                : '&lt;img src="https://via.placeholder.com/180x180?text=No+Image" alt="No Image">';
            // カテゴリをバッジ風に出力
            $categories = get_the_category();
            $cat_labels = '';
            if (!empty($categories)) {
                foreach ($categories as $category) {
                    $cat_labels .= '&lt;span class="card-category">' . esc_html($category->name) . '&lt;/span>';
                }
            }
            $html .= '&lt;a class="custom-post-card" href="' . esc_url($link) . '">';
            $html .= '  &lt;div class="card-thumb">' . $thumb . '&lt;/div>';
            $html .= '  &lt;div class="card-meta">';
            $html .= '    &lt;div class="card-header">';
            $html .= '      &lt;div class="card-title">' . esc_html($title) . '&lt;/div>';
            $html .= '      &lt;div class="card-date">';
            $html .= '        &lt;span class="date-text">' . esc_html($date) . '&lt;/span>' . $cat_labels;
            $html .= '      &lt;/div>';
            $html .= '    &lt;/div>';
            $html .= '    &lt;div class="card-excerpt">' . esc_html($excerpt) . '&lt;/div>';
            $html .= '  &lt;/div>';
            $html .= '&lt;/a>';
        }
    } else {
        $html .= '&lt;p>該当する記事がありません&lt;/p>';
    }
    $html .= '&lt;/div>&lt;/div>'; // custom-post-cards と custom-widget の終了タグ
    wp_reset_postdata();
    return $html;
}
add_shortcode('seikabutsu_widget', 'custom_category_card_widget');</pre>



<h5 class="wp-block-heading"><span id="toc3">CSS</span></h5>



<pre class="EnlighterJSRAW" data-enlighter-language="css" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/* ■ ウィジェット全体のラッパ */
.custom-widget .custom-post-cards {
  display: flex;
  flex-direction: column;
 &amp;nbsp;gap: 0px; /* 成果物ウィジェット：カード間のスペースを小さく */
}
/* 新着記事ウィジェット専用：カード間の余白を完全になくす */
.custom-widget .custom-post-cards.new-posts {
  gap: 0 !important;
}
/* ■ 個別カードのベース（共通） */
.custom-widget .custom-post-card {
  display: flex;
  border: 1px solid #ddd;
  border-radius: 8px;
  background-color: #fff;
  text-decoration: none;
  color: inherit;
  overflow: hidden;
  padding: 12px;
}
/* 成果物ウィジェット専用（画像あり）の場合：外枠を削除し、左側の余白をなくす */
.custom-widget .custom-post-cards:not(.new-posts) .custom-post-card {
  border: none !important;
  padding-left: 0;
}
/* 成果物ウィジェット専用：画像とテキスト情報の間に余白を追加 */
.custom-widget .custom-post-card:not(.new-posts) .card-meta {
  margin-left: 20px;
}
/* ※ スマホ版ではこの余白を少し縮める */
@media (max-width: 768px) {
  .custom-widget .custom-post-card:not(.new-posts) .card-meta {
    margin-left: 10px;
  }
}
/* ■ サムネイル領域（成果物ウィジェット用） */
.custom-widget .card-thumb {
  width: 180px;
  height: 180px;
  flex-shrink: 0;
}
.custom-widget .card-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* ■ テキスト情報領域 */
.custom-widget .card-meta {
  flex: 1;
  display: flex;
  flex-direction: column;
}
/* ■ ヘッダー：タイトルと日付＋カテゴリを縦に配置 */
.custom-widget .card-header {
  display: flex;
  flex-direction: column;
  margin-bottom: 8px;
}
/* タイトル（1行目） */
.custom-widget .card-title {
  font-size: 18px;
  font-weight: bold;
  margin: 0;
}
/* 日付＋カテゴリ（2行目）、右揃え */
.custom-widget .card-date {
  display: flex;
  justify-content: flex-end;
  align-items: center;
  margin-top: 4px;
}
.custom-widget .date-text {
  font-size: 14px;
  color: #999;
  margin-right: 12px;
}
/* ■ カテゴリバッジ */
.custom-widget .card-category {
  display: inline-block;
  font-size: 11px;
  color: #999;
  border: 1px solid #ddd;
  border-radius: 2px;
  padding: 0 10px;
  margin-left: 8px;
  background-color: transparent;
}
/* ■ 抜粋（成果物ウィジェット用）：文字サイズを少し小さくし、通常配置に */
.custom-widget .card-excerpt {
  font-size: 13px;
  color: #555;
  /* margin-top: auto; を削除して、通常の流れで配置 */
}
/* ■ スマホ版 */
@media (max-width: 768px) {
  .custom-widget .card-title {
    font-size: 16px;
  }
  .custom-widget .date-text {
    font-size: 13px;
  }
  .custom-widget .card-category {
    font-size: 10px;
    padding: 0 8px;
  }
  /* スマホではサムネイル画像を小さめに */
  .custom-widget .card-thumb {
    width: 100px;
    height: 100px;
  }
  /* スマホでは抜粋部分を非表示 */
  .custom-widget .card-excerpt {
    display: none;
  }
}
/* ■ 新着記事ウィジェット専用の調整 */
/* 個別カード（新着記事）の枠を削除し、カード内の余白も小さく */
.custom-widget .custom-post-card.new-posts {
  border: none;
  padding: 0px;
}</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/top-widget/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>GeminiAPIとりあえず使う</title>
		<link>https://asaino.net/use_geminiapi/</link>
					<comments>https://asaino.net/use_geminiapi/#comments</comments>
		
		<dc:creator><![CDATA[浅井和久]]></dc:creator>
		<pubDate>Wed, 22 Jan 2025 06:42:51 +0000</pubDate>
				<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://asaino.net/?p=239</guid>

					<description><![CDATA[とりあえず使ってみる トークンについて 参考文献]]></description>
										<content:encoded><![CDATA[
<h5 class="wp-block-heading"><span id="toc1">とりあえず使ってみる</span></h5>



<ol class="wp-block-list">
<li><a href="https://aistudio.google.com/app/apikey">https://aistudio.google.com/app/apikey</a> からAPIキーを取得する</li>



<li>以下のテストコードを動かしてみる</li>
</ol>



<pre class="wp-block-code"><code>API_KEY = ＜さっき取得したAPIキー＞
model = genai.GenerativeModel(
    model_name="gemini-1.5-flash", 
    system_instruction=＜システム指示＞
)
self.chat = model.start_chat(history=&#91;])
response = self.chat.send_message(＜メッセージ＞)
print(response.txt)</code></pre>



<h5 class="wp-block-heading"><span id="toc2">トークンについて</span></h5>



<ul class="wp-block-list">
<li>日本語は大体 1文字/token っぽい（実測）</li>



<li>アルファベットは 4文字/token らしい（ドキュメントより）</li>



<li>システム指示とhistoryは、メッセージのたびに送信され、ちゃんとトークンが消費される</li>



<li>32,768token以上のトークンは、コンテキストキャッシュを利用するとトークンを節約出来るらしい</li>



<li>関数を用意して渡しておけば、必要に応じてGeminiAPIが利用してくれるらしい</li>
</ul>



<h5 class="wp-block-heading"><span id="toc3">参考文献</span></h5>



<ul class="wp-block-list">
<li><a href="https://ai.google.dev/gemini-api/docs?hl=ja">https://ai.google.dev/gemini-api/docs?hl=ja</a></li>
</ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://asaino.net/use_geminiapi/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
