<?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>Engineer Ryo Blog</title>
	<atom:link href="https://engineer-ryo-blog.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://engineer-ryo-blog.com</link>
	<description></description>
	<lastBuildDate>Sun, 20 Sep 2026 11:13:18 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.1</generator>

<image>
	<url>https://engineer-ryo-blog.com/wp-content/uploads/2022/11/cropped-site-icon-1-32x32.jpg</url>
	<title>Engineer Ryo Blog</title>
	<link>https://engineer-ryo-blog.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>iOSDC 2026 (i will blog)</title>
		<link>https://engineer-ryo-blog.com/2026/09/20/iosdc-2026-i-will-blog/</link>
					<comments>https://engineer-ryo-blog.com/2026/09/20/iosdc-2026-i-will-blog/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Sun, 20 Sep 2026 11:13:17 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=263</guid>

					<description><![CDATA[i will blog というわけで書いています。3回目のiOSDC、オフラインでの参加は2回目でした。day0〜day2まで3日間いました！ Optional&#60;Bar>がよかった 会場にあったバー「Optiona [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">i will blog</h2>



<p class="wp-block-paragraph">というわけで書いています。3回目のiOSDC、オフラインでの参加は2回目でした。day0〜day2まで3日間いました！</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Optional&lt;Bar>がよかった</h2>



<p class="wp-block-paragraph">会場にあったバー「Optional&lt;Bar>」がとてもよかったです！</p>



<p class="wp-block-paragraph">3日間、それぞれ違うカクテルが提供されていました。</p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="683" src="https://engineer-ryo-blog.com/wp-content/uploads/2026/09/E0474ABD-0E50-4C89-80A1-3B2F1F6B2B30_1_105_c-1024x683.jpeg" alt="" class="wp-image-264" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2026/09/E0474ABD-0E50-4C89-80A1-3B2F1F6B2B30_1_105_c-1024x683.jpeg 1024w, https://engineer-ryo-blog.com/wp-content/uploads/2026/09/E0474ABD-0E50-4C89-80A1-3B2F1F6B2B30_1_105_c-768x512.jpeg 768w, https://engineer-ryo-blog.com/wp-content/uploads/2026/09/E0474ABD-0E50-4C89-80A1-3B2F1F6B2B30_1_105_c-300x200.jpeg 300w, https://engineer-ryo-blog.com/wp-content/uploads/2026/09/E0474ABD-0E50-4C89-80A1-3B2F1F6B2B30_1_105_c.jpeg 1086w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">1日目のカクテル。カップのロゴが基板パターンになっている</figcaption></figure>



<p class="wp-block-paragraph">写真のとおり、底のほうが濃い青緑で、上に向かってすっと色が抜けていくグラデーション。しっかり炭酸。カップに刷られたロゴが基板のパターンになっていて、すごい&#8230;!! (語彙力)</p>



<p class="wp-block-paragraph">シークレットLTの「Optional&lt;Bar>うらばなし」で裏側がのお話しも聞けて、運営の皆さんに感謝です！</p>



<h2 class="wp-block-heading">CallKitの通話、やっぱり大変だよね</h2>



<p class="wp-block-paragraph">技術面でいちばん刺さったのこちらです！</p>



<p class="wp-block-paragraph"><a href="https://fortee.jp/iosdc-japan-2026/proposal/db0b002a-ed2b-47e8-b798-3b8f8bcc4007">通話はつながれば終わりじゃない ― CallKitで通話機能の裏側</a>（金 瑠加須 / @LucasGoldner さん）</p>



<p class="wp-block-paragraph">Agoraを使った音声通話を例に、CallKitとの組み合わせ方、通話ステートの設計、ライフサイクル管理、実装上の落とし穴とデバッグ方法を扱うセッションでした。</p>



<p class="wp-block-paragraph">私自身、Flutterで通話のアプリを作っていたので、共感できる部分が多かったです。というか、聞きながら何度も「わかる〜」となっていましたw</p>



<p class="wp-block-paragraph">通話機能って、外から見ると「つながればOK」に見えるんですよね。<br>発信して、相手が出て、話せる。PoC的な形だと意外とすぐできます。<br>でも実際に作ってみると、大変なのはその先でした。。。</p>



<p class="wp-block-paragraph">私が特に苦しんだのは、セッションでも触れられていたこのあたりでした。</p>



<ul class="wp-block-list">
<li><strong>着信（PushKit）まわり</strong>。アプリがバックグラウンドにいるとき、あるいは落とされているときに、ちゃんと着信させる。ここが動かないと通話アプリとして成立しないのに、ここがいちばん手元で再現しづらい。</li>



<li><strong>通話ステート管理</strong>。発信中、呼び出し中、通話中、保留、終了。紙に書くとただの状態遷移図なのに、実機では「終わったはずの通話が残っている」「切ったのにUIが戻らない」みたいなことが起きる。ネットワークが切れたときの扱いを決めていないと、あっという間に破綻します。</li>



<li><strong>音声ルーティング</strong>。AVAudioSessionの設定、スピーカーとイヤホンとBluetoothの切り替え。音が出ない、意図しない出力先から鳴る、途中でデバイスを繋ぎ変えられる。ここは本当に、地道に潰していくしかない領域でした。<br></li>
</ul>



<p class="wp-block-paragraph">(世の中の通話機能があるアプリってすげぇ！ってなりますよね！)</p>



<h2 class="wp-block-heading">ペンライトを自動制御したい！</h2>



<p class="wp-block-paragraph"><a href="https://fortee.jp/iosdc-japan-2026/proposal/e3e8e210-c405-45f4-a101-5baed82df109">iOSDCのペンライトを自動制御したい！</a>（akkey / AkkeyLab さん）</p>



<p class="wp-block-paragraph">Swiftでペンライトを制御する、という話です。<br>ライブ会場のRF制御、テーマパークのIR・音声信号制御、Bluetooth制御と、用途ごとの制御方式を整理したうえで、AVFoundationとAVAudioEngineで制御信号をリアルタイムに生成・出力して、実際にペンライトを光らせてみる。</p>



<p class="wp-block-paragraph">見ていて、素直に「自分もやりたい！」と思いました。</p>



<p class="wp-block-paragraph">10年くらい前はよりハードウェアに近い部分の実装をしていたので、懐かしいな〜と思うと同時に、またやってみたいな〜と思ったりしていました！</p>



<h2 class="wp-block-heading">次は、登壇したい！</h2>



<p class="wp-block-paragraph">というわけで、次回は登壇したい！！(<strong>ペンライトを制御して、LTで登壇する側に回りたい。</strong>)</p>



<p class="wp-block-paragraph">とりあえずテーマを考えておきます！</p>



<p class="wp-block-paragraph">i will blog、ちゃんと書きました！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/09/20/iosdc-2026-i-will-blog/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>再起動したらカーネルパニック。原因はNVIDIAドライバのビルド失敗でした&#8230;</title>
		<link>https://engineer-ryo-blog.com/2026/08/22/vma-lock-offset-error/</link>
					<comments>https://engineer-ryo-blog.com/2026/08/22/vma-lock-offset-error/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Sat, 22 Aug 2026 10:39:36 +0000</pubDate>
				<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=259</guid>

					<description><![CDATA[ある日、いつものように再起動したら起動しませんでした。カーネルパニックです&#8230; (数年ぶり) そのまま固まってしまったので、電源を落として GRUB のメニューから一つ前の 6.17 系カーネルを選んだところ、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ある日、いつものように再起動したら起動しませんでした。カーネルパニックです&#8230; (数年ぶり)</p>



<p class="wp-block-paragraph">そのまま固まってしまったので、電源を落として GRUB のメニューから一つ前の 6.17 系カーネルを選んだところ、あっさり起動しました。パニックしたのはたぶん 7.0.0-28 だったと思うのですが、慌てていたので画面を控えておらず、ここは記憶が曖昧です。</p>



<p class="wp-block-paragraph">何度か試してみましたが、7.0系を選ぶと毎回パニック、6.17を選ぶと毎回ちゃんと起動する、という具合にきれいに再現しました。たまたま一度コケただけならまだしも、これでは新しいカーネルが完全に使い物になりません。逆に言えば、まぐれや気まぐれな不具合ではなく、原因がはっきり存在するということでもあります。</p>



<p class="wp-block-paragraph">とりあえず生きているカーネルで起動できたので、腰を据えて原因を追うことにしました。結論から言うと、<strong>NVIDIAドライバのカーネルモジュールがビルドできず、その巻き添えでカーネルのインストールが中途半端なまま放置されていた</strong>のが原因でした。</p>



<p class="wp-block-paragraph">環境は Ubuntu 24.04、GPUはRTX 2060とRTX 3060の2枚挿しです。</p>



<h2 class="wp-block-heading">aptが壊れていた</h2>



<p class="wp-block-paragraph">6.17で起動して <code>apt</code> を叩いたら、見慣れないエラーが流れてきました。</p>



<pre class="wp-block-code"><code>Error! Bad return status for module build on kernel: 7.0.0-30-generic (x86_64)
dkms autoinstall on 7.0.0-30/x86_64 failed for nvidia(10)
dpkg: パッケージ linux-image-7.0.0-30-generic の処理中にエラーが発生しました (--configure):
E: Sub-process /usr/bin/dpkg returned an error code (1)
</code></pre>



<p class="wp-block-paragraph">これ以降、何をインストールしようとしても同じところで止まります。しかも処理中にエラーが出ていたパッケージの一覧に、パニックした 7.0.0-28 と、その次の 7.0.0-30 が両方並んでいました。</p>



<p class="wp-block-paragraph">つまり僕が気づいていなかっただけで、<strong>カーネルのインストールはずっと前から失敗し続けていた</strong>わけです。エラーは <code>apt upgrade</code> の出力の中を流れていったはずなんですが、完全に見逃していました。再起動して初めて気づいたという。</p>



<p class="wp-block-paragraph">パニックの直接の原因は、たぶんカーネルの設定が完了しなかったせいで initramfs やモジュール周りが不完全なまま残っていたことだと思います。ここは画面を控えていないので断定はできませんが、少なくとも「起動に必要な処理が最後まで終わっていないカーネル」で起動しようとしていたのは確かです。</p>



<h2 class="wp-block-heading">先に結論</h2>



<p class="wp-block-paragraph">同じところで詰まった人向けに、直し方を先に書いておきます。</p>



<pre class="wp-block-code"><code># 1. 詰まりの原因になっているDKMSを外す
sudo apt purge nvidia-dkms-590

# 2. 保留されていた設定を完了させる
sudo dpkg --configure -a
sudo apt --fix-broken install

# 3. 新しいドライバを入れる
sudo ubuntu-drivers install nvidia:610
</code></pre>



<p class="wp-block-paragraph"><code>apt purge</code> が処理の冒頭で同じエラーを出して止まる場合は、dpkgで直接引き剥がします。</p>



<pre class="wp-block-code"><code>sudo dpkg --purge --force-depends nvidia-dkms-590
sudo dpkg --configure -a
</code></pre>



<p class="wp-block-paragraph">ポイントは、<strong>ドライバのバージョンを上げるしかない</strong>ということです。設定をいじって直る類のものではありませんでした。理由は以下。</p>



<h2 class="wp-block-heading">何が起きていたのか</h2>



<p class="wp-block-paragraph">まず <code>make.log</code> を見ました。DKMSは失敗の詳細をここにしか書いてくれません。</p>



<pre class="wp-block-code"><code>sudo tail -n 50 /var/lib/dkms/nvidia/590.48.01/build/make.log
</code></pre>



<p class="wp-block-paragraph">決定的だったのがこの行です。</p>



<pre class="wp-block-code"><code>nvidia/nv-mmap.c:928:42: error: ‘VMA_LOCK_OFFSET’ undeclared (first use in this function);
                          did you mean ‘VGA_CRTC_OFFSET’?
  928 |  detached = refcount_sub_and_test(VMA_LOCK_OFFSET, &amp;vma-&gt;vm_refcnt);
</code></pre>



<p class="wp-block-paragraph">カーネル7.0でper-VMAロックまわりの実装が変わり、<code>VMA_LOCK_OFFSET</code> が廃止されていました。NVIDIAドライバ側は古い前提のままなので、コンパイルが通らないというわけです。ヘッダもgccも揃っているし、Secure Bootも無関係。純粋にバージョンの非互換でした。</p>



<p class="wp-block-paragraph">連鎖を整理するとこうなります。</p>



<ol class="wp-block-list">
<li>HWEカーネルが6.17系から7.0系に切り替わった</li>



<li>新カーネルのpostinstがDKMSを呼び、NVIDIAモジュールをビルドしようとする</li>



<li>API変更でビルドが落ちる</li>



<li><code>linux-image-7.0.0-XX-generic</code> の設定が失敗する</li>



<li>dpkgが中途半端な状態で止まり、以降のaptが全部巻き添えになる</li>



<li>その状態で7.0系を選んで起動 → 毎回カーネルパニック ← イマココ</li>
</ol>



<p class="wp-block-paragraph">設定が完了していないカーネルは、何度起動し直したところで完了しません。毎回同じところでコケていたのはそういうことでした。</p>



<h2 class="wp-block-heading">590は既に終わっていた</h2>



<p class="wp-block-paragraph">じゃあどのバージョンに上げればいいのか。ここで <code>apt-cache policy</code> が効きました。</p>



<pre class="wp-block-code"><code>$ apt-cache policy nvidia-dkms-590
nvidia-dkms-590:
  インストールされているバージョン: 590.48.01-0ubuntu0.24.04.4
  候補:               590.48.01-0ubuntu0.24.04.5
</code></pre>



<p class="wp-block-paragraph">新しい <code>.5</code> があるじゃないか、と思って中身を調べたら、変更内容がこれでした。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Transition the 590 driver to 595 (LP: #2146602)</strong></p>
</blockquote>



<p class="wp-block-paragraph"><code>.5</code> は中身のあるアップデートではなく、<strong>595へ移行させるためのパッケージ</strong>でした。590はUbuntu側で既に終息扱いだったんですね。だから <code>ubuntu-drivers list</code> の選択肢にも590は出てきませんし、カーネル7.0対応のパッチも当たらない。590を直す道はそもそも存在しなかった、というオチです。</p>



<p class="wp-block-paragraph">移行先を決めるときは、ビルド済みモジュールの有無を見ると確実です。</p>



<pre class="wp-block-code"><code>$ apt-cache policy linux-modules-nvidia-610-generic-hwe-24.04
  候補:               7.0.0-30.30~24.04.1
</code></pre>



<p class="wp-block-paragraph">候補のバージョンが <code>7.0.0-30</code> になっています。これは「カーネル7.0.0-30用にビルド済み・署名済みのモジュールが実在する」という直接の証拠なので、対応状況を推測しなくて済みます。</p>



<p class="wp-block-paragraph">僕の場合は最終的に595.84に着地しましたが、両方のカーネル向けにビルドが通ったので問題なしとしました。</p>



<pre class="wp-block-code"><code>$ dkms status
nvidia/595.84, 6.17.0-35-generic, x86_64: installed
nvidia/595.84, 7.0.0-30-generic, x86_64: installed
</code></pre>



<p class="wp-block-paragraph">この状態で再起動したら、あれだけ毎回パニックしていた7.0系が何事もなかったように立ち上がりました。<code>nvidia-smi</code> もGPU2枚をきちんと認識してくれています。</p>



<h2 class="wp-block-heading">次に同じことを起こさないために</h2>



<p class="wp-block-paragraph">今回の構成はDKMS方式なので、次にカーネルが上がるときも同じようにビルドが走ります。595系が終息扱いになった頃に、また同じことが起きる可能性があるわけです。</p>



<p class="wp-block-paragraph">予防したいなら、<code>linux-modules-nvidia-610-generic-hwe-24.04</code> 形式のビルド済みモジュールに移しておく手があります。Canonicalがカーネルに合わせてビルドしたものが降ってくるので、手元でのビルド失敗という事故が構造的になくなります。Secure Boot環境でも署名済みなのでMOK登録が要らないのも地味に嬉しいところ。</p>



<p class="wp-block-paragraph">とはいえ今は安定して動いているので、僕は次のカーネル更新のタイミングで移そうと思っています。</p>



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



<ul class="wp-block-list">
<li>カーネルパニックの原因が、実は数日前の <code>apt upgrade</code> の失敗だったというパターンがある</li>



<li>DKMSのビルド失敗は <code>/var/lib/dkms/&lt;name>/&lt;version>/build/make.log</code> を見ないと原因が分からない</li>



<li><code>VMA_LOCK_OFFSET</code> のエラーはカーネル7.0のAPI変更が原因。設定では直らないのでドライバを上げるしかない</li>



<li>移行先を選ぶときは <code>apt-cache policy linux-modules-nvidia-XXX-generic-hwe-24.04</code> の候補バージョンを見ると確実</li>
</ul>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">HWEカーネルはこれからも上がっていくので、同じ踏み方をする人はぼちぼち出てくる気がします。誰かの役に立てば嬉しいです！</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/08/22/vma-lock-offset-error/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>OllamaとXcodeを統合する方法</title>
		<link>https://engineer-ryo-blog.com/2026/03/23/ollama%e3%81%a8xcode%e3%82%92%e7%b5%b1%e5%90%88%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/</link>
					<comments>https://engineer-ryo-blog.com/2026/03/23/ollama%e3%81%a8xcode%e3%82%92%e7%b5%b1%e5%90%88%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Mon, 23 Mar 2026 13:56:25 +0000</pubDate>
				<category><![CDATA[LLM]]></category>
		<category><![CDATA[Ollama]]></category>
		<category><![CDATA[モバイルアプリ]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[開発ネタ]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=245</guid>

					<description><![CDATA[はじめに 最近 Ollama でローカルLLMにハマっています。 LAN内にあるOllama と Xcode を統合する手順をメモします。 公式ドキュメント) https://docs.ollama.com/integr [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">最近 <a href="https://ollama.com/" data-type="link" data-id="https://ollama.com/">Ollama</a> でローカルLLMにハマっています。</p>



<p class="wp-block-paragraph">LAN内にある<a href="https://ollama.com/" data-type="link" data-id="https://ollama.com/">Ollama</a> と <a rel="noopener" href="https://developer.apple.com/xcode/" target="_blank">Xcode</a> を統合する手順をメモします。</p>



<p class="wp-block-paragraph">公式ドキュメント) <a href="https://docs.ollama.com/integrations/xcode">https://docs.ollama.com/integrations/xcode</a></p>



<h2 class="wp-block-heading">構成</h2>



<p class="wp-block-paragraph">僕は手元のMacから、Ubuntu 上の Ollama を参照したい&#8230;</p>



<ul class="wp-block-list">
<li>開発端末 (192.168.100.200)
<ul class="wp-block-list">
<li>MacBook Pro</li>



<li>Xcode 26.3</li>
</ul>
</li>



<li>ローカルLLMサーバー (192.168.100.201)
<ul class="wp-block-list">
<li>Ubuntu</li>



<li>RTX 3060</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">統合方法</h2>



<h3 class="wp-block-heading">Xcodeの設定画面から、Intelligence→「Add a Provider」をクリック</h3>



<figure class="wp-block-image size-large is-resized"><img decoding="async" width="1024" height="703" src="https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1-1024x703.png" alt="" class="wp-image-247" style="aspect-ratio:1.4566342428265642;width:730px;height:auto" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1-1024x703.png 1024w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1-300x206.png 300w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1-768x527.png 768w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1-1536x1054.png 1536w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1.png 1644w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading">ローカル LLM サーバーのアドレスをポート番号込みで指定する</h3>



<figure class="wp-block-image aligncenter size-large is-resized"><img decoding="async" width="1024" height="874" src="https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1024x874.png" alt="" class="wp-image-246" style="aspect-ratio:1.1716472443367563;width:476px;height:auto" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-1024x874.png 1024w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-300x256.png 300w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-768x656.png 768w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image.png 1164w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>URL</td><td>{ローカルLLMサーバーのIP}:11434<br>例) 192.168.100.201:11434</td></tr><tr><td>API Key</td><td>なし</td></tr><tr><td>API Key Header</td><td>なし</td></tr><tr><td>Description</td><td>適宜</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Models（モデル一覧）が表示されることを確認</h3>



<figure class="wp-block-image aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="703" src="https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-2-1024x703.png" alt="" class="wp-image-248" style="aspect-ratio:1.4566342428265642;width:621px;height:auto" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-2-1024x703.png 1024w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-2-300x206.png 300w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-2-768x527.png 768w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-2-1536x1054.png 1536w, https://engineer-ryo-blog.com/wp-content/uploads/2026/03/image-2.png 1644w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">これで、OllamaとXcodeの統合が完了しました！！</p>



<p class="wp-block-paragraph">レート制限を気にせず、どんどんトライ&amp;エラーができるので、家にGPUが余っている方は試してみてもいいかもですね！</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/03/23/ollama%e3%81%a8xcode%e3%82%92%e7%b5%b1%e5%90%88%e3%81%99%e3%82%8b%e6%96%b9%e6%b3%95/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>cliでAndroidのエミュレータをCold bootしたい</title>
		<link>https://engineer-ryo-blog.com/2026/03/11/cli%e3%81%a7android%e3%81%ae%e3%82%a8%e3%83%9f%e3%83%a5%e3%83%ac%e3%83%bc%e3%82%bf%e3%82%92cold-boot%e3%81%97%e3%81%9f%e3%81%84/</link>
					<comments>https://engineer-ryo-blog.com/2026/03/11/cli%e3%81%a7android%e3%81%ae%e3%82%a8%e3%83%9f%e3%83%a5%e3%83%ac%e3%83%bc%e3%82%bf%e3%82%92cold-boot%e3%81%97%e3%81%9f%e3%81%84/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Tue, 10 Mar 2026 17:38:38 +0000</pubDate>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[モバイルアプリ]]></category>
		<category><![CDATA[開発ネタ]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=240</guid>

					<description><![CDATA[エミュレータを一覧で取得 Cold boot]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">エミュレータを一覧で取得</h2>



<pre class="wp-block-code"><code>emulator -list-avds</code></pre>



<h2 class="wp-block-heading">Cold boot</h2>



<pre class="wp-block-code"><code>emulator -avd {デバイス名} -no-snapshot-load

# 例
# emulator -avd Medium_Phone -no-snapshot-load</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/03/11/cli%e3%81%a7android%e3%81%ae%e3%82%a8%e3%83%9f%e3%83%a5%e3%83%ac%e3%83%bc%e3%82%bf%e3%82%92cold-boot%e3%81%97%e3%81%9f%e3%81%84/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>dart fix</title>
		<link>https://engineer-ryo-blog.com/2026/01/12/dart-fix/</link>
					<comments>https://engineer-ryo-blog.com/2026/01/12/dart-fix/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Mon, 12 Jan 2026 05:13:13 +0000</pubDate>
				<category><![CDATA[flutter]]></category>
		<category><![CDATA[エンジニア]]></category>
		<category><![CDATA[モバイルアプリ]]></category>
		<category><![CDATA[開発ネタ]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=228</guid>

					<description><![CDATA[dart fix とは？ 静的解析での警告やエラー等の修正を行うためのコマンド。 これまで、1個ずつ手動で修正していたが、それらを自動的に修正するコマンドがあることにAndroid Studioの通知をみていて気づいた。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">dart fix とは？</h2>



<p class="wp-block-paragraph">静的解析での警告やエラー等の修正を行うためのコマンド。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="229" src="https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-1-1024x229.png" alt="" class="wp-image-232" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-1-1024x229.png 1024w, https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-1-300x67.png 300w, https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-1-768x172.png 768w, https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-1-1536x344.png 1536w, https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-1-2048x458.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">これまで、1個ずつ手動で修正していたが、それらを自動的に修正するコマンドがあることにAndroid Studioの通知をみていて気づいた。(もっと早く気づいていたら&#8230;)</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="900" height="176" src="https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image.png" alt="" class="wp-image-229" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image.png 900w, https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-300x59.png 300w, https://engineer-ryo-blog.com/wp-content/uploads/2026/01/image-768x150.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">ざっくりとした使い方</h2>



<h3 class="wp-block-heading">&#8211;dry-run</h3>



<p class="wp-block-paragraph">修正内容の確認を行うコマンド。</p>



<p class="wp-block-paragraph"><code>--dry-run</code> オプションをつけて実行し、検出された問題を修正する場合は、<code>--apply</code> オプションで修正する。</p>



<p class="wp-block-paragraph">実行すると以下のような形で、修正対象が列挙される。</p>



<pre class="wp-block-code"><code>-> % dart fix --dry-run 
Computing fixes in frontend (dry run)... 19.6s

4 proposed fixes in 3 files.

lib/src/presentation/screens/example_screen.dart
  unnecessary_import • 1 fix

lib/src/services/example_service.dart
  unnecessary_import • 2 fixes

pubspec.yaml
  missing_dependency • 1 fix

To fix an individual diagnostic, run one of:
  dart fix --apply --code=missing_dependency 
  dart fix --apply --code=unnecessary_import 

To fix all diagnostics, run:
  dart fix --apply </code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading">&#8211;applyオプション</h3>



<p class="wp-block-paragraph"><code>--dry-run</code> を実行して、検出した問題を修正するコマンド。</p>



<p class="wp-block-paragraph"><code>--dry-run</code> 実行時に下記のように、一部のみ修正する場合と、全て修正する場合のコマンドが記載されているので、必要に応じて選択する。</p>



<pre class="wp-block-code"><code>To fix an individual diagnostic, run one of:
  dart fix --apply --code=missing_dependency 
  dart fix --apply --code=unnecessary_import 

To fix all diagnostics, run:
  dart fix --apply </code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">今回は一部のみ修正を選択したため、実行すると以下のような形となった。</p>



<pre class="wp-block-code"><code> dart fix --apply --code=missing_dependency 
Computing fixes in example... 8.6s
Nothing to fix!</code></pre>



<p class="wp-block-paragraph"></p>



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



<p class="wp-block-paragraph">dartの静的解析の警告や、エラーは <code>dart fix</code> コマンドで修正できるので、使っていきましょう！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/01/12/dart-fix/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>1Passwordに乗り換えた</title>
		<link>https://engineer-ryo-blog.com/2026/01/04/1password%e3%81%ab%e4%b9%97%e3%82%8a%e6%8f%9b%e3%81%88%e3%81%9f/</link>
					<comments>https://engineer-ryo-blog.com/2026/01/04/1password%e3%81%ab%e4%b9%97%e3%82%8a%e6%8f%9b%e3%81%88%e3%81%9f/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Sun, 04 Jan 2026 02:47:04 +0000</pubDate>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[エンジニア]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=219</guid>

					<description><![CDATA[パスワードマネージャー何を使えばいいんじゃ パスワードマネージャー何を使えばいいんじゃ&#8230;。2025年の終わりごろにそう思うようになった。 これまでSafariをメインのブラウザにしていたこともあって、パスワー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">パスワードマネージャー何を使えばいいんじゃ</h2>



<p class="wp-block-paragraph">パスワードマネージャー何を使えばいいんじゃ&#8230;。2025年の終わりごろにそう思うようになった。</p>



<p class="wp-block-paragraph">これまでSafariをメインのブラウザにしていたこともあって、パスワードマネージャーにあまりこだわりがなかった。</p>



<p class="wp-block-paragraph">昨年末に重い腰をあげてChromeに移行することにしたので、パスワードマネージャーの導入を検討した。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">1Passwordという選択肢</h2>



<p class="wp-block-paragraph">ログイン情報のほか、SSHキーも保存できることが結構良さそうに感じて、1Passwordを選ぶことにした。</p>



<p class="wp-block-paragraph">そして、CLIが用意されているというところも開発者に優しいなと思った。<br>(ベータ版だけども、.envも管理できるっぽいのでこれも良さそう)</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">UIも良さげなので、しばらく使ってみることにした。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">数日使ってみて</h2>



<p class="wp-block-paragraph">Chromeへの乗り換えも成功し、iPhone版のアプリを使えばiPhoneでも純正っぽく使えるのでかなり良さそうだ。</p>



<p class="wp-block-paragraph">これならもっと早く乗り換えておけばよかったとちょっと後悔している&#8230;w</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/01/04/1password%e3%81%ab%e4%b9%97%e3%82%8a%e6%8f%9b%e3%81%88%e3%81%9f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>flutter コマンドのtips</title>
		<link>https://engineer-ryo-blog.com/2026/01/03/flutter-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%aetips/</link>
					<comments>https://engineer-ryo-blog.com/2026/01/03/flutter-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%aetips/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Sat, 03 Jan 2026 11:49:31 +0000</pubDate>
				<category><![CDATA[flutter]]></category>
		<category><![CDATA[エンジニア]]></category>
		<category><![CDATA[モバイルアプリ]]></category>
		<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=213</guid>

					<description><![CDATA[はじめに flutter で開発していますか？ ネイティブ(swift・kotlin)・react-native・.NET MAUIなど、アプリ開発の選択肢が多く、技術選定に悩むこの頃です&#8230; クロスプラットフ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><span style="color: rgb(255, 255, 255); font-size: 24px; background-color: rgb(162, 210, 255); font-family: var(--cocoon-default-font);">はじめに</span></h2>



<p class="wp-block-paragraph">flutter で開発していますか？</p>



<p class="wp-block-paragraph">ネイティブ(swift・kotlin)・react-native・.NET MAUIなど、アプリ開発の選択肢が多く、技術選定に悩むこの頃です&#8230;</p>



<p class="wp-block-paragraph">クロスプラットフォームで開発したいな〜という時はflutterを選ぶことが多いのですが、そこで得た <code>flutter</code> コマンドのtipsを紹介します。</p>



<h2 class="wp-block-heading">僕は ホットリスタート をしたい&#8230;</h2>



<p class="wp-block-paragraph">これまでホットリスタートする時に、毎回 <code>flutter run</code> を実行したいたのですが、<code>Shift + R</code> でホットリスタートができるらしい。</p>



<p class="wp-block-paragraph">-&gt; % flutter run<br>Connected devices:<br>macOS (desktop) • macos • darwin-arm64 • macOS 26.2 25C56 darwin-arm64<br>Chrome (web) • chrome • web-javascript • Google Chrome 143.0.7499.170</p>



<p class="wp-block-paragraph">No wireless devices were found.</p>



<p class="wp-block-paragraph">この状態でデバイスを選んで、<code>Shift + R</code> を入力すると、ホットリロードできました！！！(もっと早く知ってたら&#8230;)</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">他のコマンドも知りたい</h2>



<p class="wp-block-paragraph"><code>flutter run</code> でデバイスを選んだあと、<code>h</code> を入力するとヘルプが表示された。</p>



<p class="wp-block-paragraph">(色々便利なコマンドがあるっぽい)</p>



<pre class="wp-block-code"><code>Flutter run key commands.
r Hot reload. 🔥🔥🔥
R Hot restart.
v Open Flutter DevTools.
w Dump widget hierarchy to the console.                                               (debugDumpApp)
t Dump rendering tree to the console.                                          (debugDumpRenderTree)
L Dump layer tree to the console.                                               (debugDumpLayerTree)
f Dump focus tree to the console.                                               (debugDumpFocusTree)
S Dump accessibility tree in traversal order.                                   (debugDumpSemantics)
U Dump accessibility tree in inverse hit test order.                            (debugDumpSemantics)
i Toggle widget inspector.                                  (WidgetsApp.showWidgetInspectorOverride)
p Toggle the display of construction lines.                                  (debugPaintSizeEnabled)
I Toggle oversized image inversion.                                     (debugInvertOversizedImages)
o Simulate different operating systems.                                      (defaultTargetPlatform)
b Toggle platform brightness (dark and light mode).                        (debugBrightnessOverride)
P Toggle performance overlay.                                    (WidgetsApp.showPerformanceOverlay)
a Toggle timeline events for all widget build methods.                    (debugProfileWidgetBuilds)
g Run source code generators.
h Repeat this help message.
d Detach (terminate "flutter run" but leave application running).
c Clear the screen
q Quit (terminate the application on the device).
</code></pre>



<h2 class="wp-block-heading">表にまとめてみた</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>キー</th><th>アクション</th><th>日本語での説明</th></tr></thead><tbody><tr><td><strong>r</strong></td><td>ホットリロード</td><td>コードの変更を即座に反映します（状態を維持）</td></tr><tr><td><strong>R</strong></td><td>ホットリスタート</td><td>アプリを再起動して変更を反映します（状態をリセット）</td></tr><tr><td><strong>v</strong></td><td>DevTools</td><td>Flutter DevTools をブラウザで開きます</td></tr><tr><td><strong>w</strong></td><td>ウィジェットツリー</td><td>ウィジェットの階層構造をコンソールに表示します</td></tr><tr><td><strong>t</strong></td><td>レンダリングツリー</td><td>レンダリングツリーの詳細をコンソールに表示します</td></tr><tr><td><strong>L</strong></td><td>レイヤーツリー</td><td>レイヤーの階層構造をコンソールに表示します</td></tr><tr><td><strong>f</strong></td><td>フォーカスツリー</td><td>現在のフォーカス状態をコンソールに表示します</td></tr><tr><td><strong>S</strong></td><td>アクセシビリティ(順)</td><td>アクセシビリティツリーをトラバーサル順に表示します</td></tr><tr><td><strong>U</strong></td><td>アクセシビリティ(逆)</td><td>アクセシビリティツリーを逆ヒットテスト順に表示します</td></tr><tr><td><strong>i</strong></td><td>インスペクタ</td><td>ウィジェットインスペクタの表示を切り替えます</td></tr><tr><td><strong>p</strong></td><td>ガイド線表示</td><td>レイアウト確認用の補助線（サイズ等）の表示を切り替えます</td></tr><tr><td><strong>I</strong></td><td>巨大画像の反転</td><td>オーバーサイズの画像を反転表示して特定しやすくします</td></tr><tr><td><strong>o</strong></td><td>OSシミュレート</td><td>AndroidやiOSなどのOS表示を切り替えます</td></tr><tr><td><strong>b</strong></td><td>明るさ切り替え</td><td>ダークモードとライトモードを切り替えます</td></tr><tr><td><strong>P</strong></td><td>パフォーマンス</td><td>パフォーマンスオーバーレイの表示を切り替えます</td></tr><tr><td><strong>a</strong></td><td>ビルドタイムライン</td><td>全ウィジェットのビルドイベント記録を切り替えます</td></tr><tr><td><strong>g</strong></td><td>コード生成</td><td>ソースコードジェネレータを実行します</td></tr><tr><td><strong>h</strong></td><td>ヘルプ</td><td>コマンドのヘルプメッセージを再表示します</td></tr><tr><td><strong>d</strong></td><td>デタッチ</td><td>アプリは動かしたまま、コンソールとの接続を解除します</td></tr><tr><td><strong>c</strong></td><td>画面クリア</td><td>コンソールのログ表示をクリアします</td></tr><tr><td><strong>q</strong></td><td>終了</td><td>アプリを終了してプロセスを停止します</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2026/01/03/flutter-%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%81%aetips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>IPv6のみの環境でcloudflaredを使用する時の注意点</title>
		<link>https://engineer-ryo-blog.com/2025/05/06/ipv6%e3%81%ae%e3%81%bf%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7cloudflared%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9/</link>
					<comments>https://engineer-ryo-blog.com/2025/05/06/ipv6%e3%81%ae%e3%81%bf%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7cloudflared%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Tue, 06 May 2025 13:50:20 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=208</guid>

					<description><![CDATA[(詳細はあとで書きます。) 何が起きたか IPv6のみのEC2にcloudflaredをインストールした際に、IPv4のアドレスで名前解決してしまい、タイムアウトが発生していた。 対処方法 /etc/systemd/sy [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">(詳細はあとで書きます。)</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">何が起きたか</h2>



<p class="wp-block-paragraph">IPv6のみのEC2にcloudflaredをインストールした際に、IPv4のアドレスで名前解決してしまい、タイムアウトが発生していた。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">対処方法</h2>



<p class="wp-block-paragraph">/etc/systemd/system/cloudflared.service を変更し、IPv6のエッジサーバーに向けた。</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">変更前</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target

&#91;Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate run --token &lt;token>
Restart=on-failure
RestartSec=5s

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">変更後</p>



<p class="wp-block-paragraph"> <strong>&#8211;edge-ip-version 6</strong> を追記</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target

&#91;Service]
TimeoutStartSec=0
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate <strong>--edge-ip-version 6 </strong>tunnel run --token
Restart=on-failure
RestartSec=5s

&#91;Install]
WantedBy=multi-user.target
</code></pre>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2025/05/06/ipv6%e3%81%ae%e3%81%bf%e3%81%ae%e7%92%b0%e5%a2%83%e3%81%a7cloudflared%e3%82%92%e4%bd%bf%e7%94%a8%e3%81%99%e3%82%8b%e6%99%82%e3%81%ae%e6%b3%a8%e6%84%8f%e7%82%b9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>clamav-milterを動かしたら、メールサーバーが落ちた？</title>
		<link>https://engineer-ryo-blog.com/2025/01/05/clamav-milter/</link>
					<comments>https://engineer-ryo-blog.com/2025/01/05/clamav-milter/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Sun, 05 Jan 2025 04:38:37 +0000</pubDate>
				<category><![CDATA[エンジニア]]></category>
		<category><![CDATA[クラウド]]></category>
		<category><![CDATA[メールサーバー]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=199</guid>

					<description><![CDATA[ことの始まり clamav-milterの検証のため、すでに構築済みのメールサーバーに対して、clamav-milterを導入し運用していた。 導入してから、2～3日後にメールの送受信が行えなくなり、メールサーバーへのs [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">ことの始まり</h2>



<p class="wp-block-paragraph">clamav-milterの検証のため、すでに構築済みのメールサーバーに対して、clamav-milterを導入し運用していた。</p>



<p class="wp-block-paragraph">導入してから、2～3日後にメールの送受信が行えなくなり、メールサーバーへのsshもできない状況になってしまった。。。(サーバー負荷だろうなと思っていた)</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">切り戻しをした</h2>



<p class="wp-block-paragraph">(自分一人しか使っていないけれども)メールの送受信ができないと困ってしまうので、一度切り戻しを行った。</p>



<p class="wp-block-paragraph">切り戻し作業を行っているうちに、clamd, clamav-milterを動かすと、そこそこメモリを消費するということに気づいた。<br>もともとメールサーバー自体への負荷は低いだろうということで、 2vCPU / 2GB RAMのインスタンスとしていたのだが、2GBのRAMでは足りずハングアップしていたようだ。</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">htopで見ると、clamdがかなりのメモリを消費している。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="547" src="https://engineer-ryo-blog.com/wp-content/uploads/2025/01/image-1-1024x547.png" alt="" class="wp-image-201" srcset="https://engineer-ryo-blog.com/wp-content/uploads/2025/01/image-1-1024x547.png 1024w, https://engineer-ryo-blog.com/wp-content/uploads/2025/01/image-1-300x160.png 300w, https://engineer-ryo-blog.com/wp-content/uploads/2025/01/image-1-768x411.png 768w, https://engineer-ryo-blog.com/wp-content/uploads/2025/01/image-1-1536x821.png 1536w, https://engineer-ryo-blog.com/wp-content/uploads/2025/01/image-1.png 1734w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">スワップ領域を作成した</h2>



<p class="wp-block-paragraph">CPUへの負荷は低く、インスタンスサイズを変更するほどでもないと考え、スワップを領域を作成することにした。</p>



<p class="wp-block-paragraph">スワップファイルの作成</p>



<pre class="wp-block-code"><code>sudo dd if=/dev/zero of=/var/swpfile bs=1M count=4096
sudo mkswap /var/swpfile
sudo chmod 600 /var/swpfile
sudo swapon /var/swpfile</code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">/etc/fstabへ以下を追記</p>



<pre class="wp-block-code"><code>/var/swpfile none swap sw 0 0</code></pre>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">スワップ追加後</h2>



<p class="wp-block-paragraph">スワップ領域に4GBほど割り当てたため、clamd, clamav-milterを動かしても安定して稼働するようになった。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2025/01/05/clamav-milter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>AWS Amplifyでモバイルアプリケーションへのプッシュ通知を行う</title>
		<link>https://engineer-ryo-blog.com/2024/12/02/mobile-push/</link>
					<comments>https://engineer-ryo-blog.com/2024/12/02/mobile-push/#respond</comments>
		
		<dc:creator><![CDATA[ryo]]></dc:creator>
		<pubDate>Mon, 02 Dec 2024 14:47:31 +0000</pubDate>
				<category><![CDATA[aws]]></category>
		<category><![CDATA[エンジニア]]></category>
		<category><![CDATA[クラウド]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[開発ネタ]]></category>
		<guid isPermaLink="false">https://engineer-ryo-blog.com/?p=195</guid>

					<description><![CDATA[この記事を書いた理由 AWS Amplify Gen2がリリースされたものの、日本語での解説記事が少なく(探し方が悪い？)、困っている人がもし居たら&#8230;.と思い記事にすることにした。(特にモバイルアプリケーショ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">この記事を書いた理由</h2>



<p class="wp-block-paragraph">AWS Amplify Gen2がリリースされたものの、日本語での解説記事が少なく(探し方が悪い？)、困っている人がもし居たら&#8230;.と思い記事にすることにした。(特にモバイルアプリケーション向けの記事は少ない&#8230;)</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">そもそも、AWS Amplifyとは</h2>



<p class="wp-block-paragraph">AWS上のさまざまなサービスをラッピングし、Webやモバイルアプリケーションに特化したサービス。</p>



<p class="wp-block-paragraph">詳しくは→<a href="https://aws.amazon.com/jp/amplify/">https://aws.amazon.com/jp/amplify/</a></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">僕はプッシュ通知を送りたい</h2>



<p class="wp-block-paragraph">僕の中で、少し前までモバイルアプリケーション向けのプッシュ通知をAWSで実現したい場合には、Amplifyがすぐ候補となっていた。</p>



<p class="wp-block-paragraph">周りを見てもPinpointでの実装は少なく、Amplifyでの実装例が多かった。</p>



<p class="wp-block-paragraph">いつもの通り、amplify initしようとしたら、Gen2使ってねというメッセージが表示され、「せっかくだから&#8230;」という軽い気持ちで足を踏み入れることにした。(違いも何も調べずにね)</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Get Startからはじめた</h2>



<p class="wp-block-paragraph">Get Startから始めたものの、プッシュ通知に関するサンプルが見当たらなかった。(もしかしたら今後更新されているかもしれない。)</p>



<p class="wp-block-paragraph">公式ドキュメント以外も探したが、それらしきものは見当たらず&#8230;</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">Gen1のころを思い出した</h2>



<p class="wp-block-paragraph">Gen1の頃に使っていたライブラリと全く同じであることに気づいた。</p>



<p class="wp-block-paragraph">Amplify Gen2では、バックエンドの構成がtypescriptによるCDKであるため、そこさえできれば実装できそうだ。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">そして完成</h2>



<pre class="wp-block-code"><code>backend.addOutput({
  /* 省略 */
  notifications: {
    aws_region: Stack.of(pinpoint).region,
    amazon_pinpoint_app_id: pinpoint.ref,
    channels: &#91;'IN_APP_MESSAGING', 'APNS'],
  }
});</code></pre>



<p class="wp-block-paragraph">これをamplify/backend.tsに記載することで、プッシュ通知の配信対象となった。</p>



<p class="wp-block-paragraph">addOutputに追加することで、amplify_outputs.jsonに出力されるためだと思われる。</p>



<p class="wp-block-paragraph"></p>



<h2 class="wp-block-heading">この後について</h2>



<ul class="wp-block-list">
<li>Pinpointプロジェクト上でAPNsのキーなどの情報をセットしているが、自動化できれば自動化したい。</li>



<li>auth周りも実装してみたい。</li>
</ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://engineer-ryo-blog.com/2024/12/02/mobile-push/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
