<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Yoshiyuki Kurose</title><link>http://yoshiyuki-140.github.io/</link><description>Recent content on Yoshiyuki Kurose</description><generator>Hugo</generator><language>ja-JP</language><lastBuildDate>Mon, 15 Jun 2026 13:28:43 +0900</lastBuildDate><atom:link href="http://yoshiyuki-140.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>タイトルからHugoのSlugを自動生成してくれるCLIツールを作ってみた!</title><link>http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/</link><pubDate>Mon, 15 Jun 2026 13:28:43 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/</guid><description>&lt;h1 id="概要"&gt;概要&lt;/h1&gt;
&lt;p&gt;Hugo&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;は静的サイト生成のためのツールで，マークダウンで書いた記事等をHTML/CSSファイルにしてくれます．
しかしHugoは新しい記事のテンプレートを作る際にSlug&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;を考える必要があり，手間でした．
uuidgen&lt;sup id="fnref:3"&gt;&lt;a href="#fn:3" class="footnote-ref" role="doc-noteref"&gt;3&lt;/a&gt;&lt;/sup&gt;などを使っても同様の省力化はできますが，その場合は生成されるテンプレートファイル名と記事の中身が紐づかず管理が面倒になってしまいます．
そこで，軽量なローカルLLMを使うことでタイトルに意味が紐づいたSlugを生成してくれるCLIツール&lt;sup id="fnref:4"&gt;&lt;a href="#fn:4" class="footnote-ref" role="doc-noteref"&gt;4&lt;/a&gt;&lt;/sup&gt;を作成しました．&lt;/p&gt;
&lt;p&gt;&lt;img alt="動作例" loading="lazy" src="http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/images/output.gif"&gt;&lt;/p&gt;
&lt;h2 id="仕組み"&gt;仕組み&lt;/h2&gt;
&lt;p&gt;&lt;img alt="コンポーネント" loading="lazy" src="http://yoshiyuki-140.github.io/posts/generate-hugo-slugs-cli-tool/images/image-1.png"&gt;&lt;/p&gt;
&lt;p&gt;仕組みはシンプルです．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;① ユーザにセクション名と作成予定の記事のタイトルを聞きます．&lt;/li&gt;
&lt;li&gt;② LLMに適切なシステムプロンプトとユーザが入力した記事のタイトルを与え，Slugの候補を生成してもらいます．&lt;/li&gt;
&lt;li&gt;③ Slugの候補は必要に応じて再生成し，決まり次第hugoのコマンドを呼び出して記事のひな形を作成します．&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;
&lt;p&gt;前提として，Ollama&lt;sup id="fnref:5"&gt;&lt;a href="#fn:5" class="footnote-ref" role="doc-noteref"&gt;5&lt;/a&gt;&lt;/sup&gt;とHugo&lt;sup id="fnref1:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;の&lt;a href="https://github.com/gohugoio/hugo#standard-edition"&gt;Standard edition&lt;/a&gt;をインストールしておく必要があります．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hugo-llslug&lt;/code&gt;自体のインストール方法は&lt;a href="https://github.com/yoshiyuki-140/hugo-llslug/blob/main/docs/README.ja.md#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB"&gt;こちら&lt;/a&gt;にまとめました．
プラットフォームに合わせてインストールしてください．&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;このツールによりhugoで記事を書き始める手間が減り，かつローカルLLMなのでネットがない場所でも楽しく記事を書き始めることができます．&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://gohugo.io/"&gt;Hugo Top Page&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href="#fnref1:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://developer.mozilla.org/ja/docs/Glossary/Slug"&gt;Slug(スラッグ)&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:3"&gt;
&lt;p&gt;&lt;a href="https://man7.org/linux/man-pages/man1/uuidgen.1.html"&gt;uuidgenコマンド&lt;/a&gt;&amp;#160;&lt;a href="#fnref:3" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:4"&gt;
&lt;p&gt;&lt;a href="https://github.com/yoshiyuki-140/hugo-llslug"&gt;hugo-llslug GitHub&lt;/a&gt;&amp;#160;&lt;a href="#fnref:4" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:5"&gt;
&lt;p&gt;&lt;a href="https://ollama.com/"&gt;Ollama Top Page&lt;/a&gt;&amp;#160;&lt;a href="#fnref:5" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>ラズパイサーバーからGitHub Pagesへ移行</title><link>http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/</link><pubDate>Wed, 10 Jun 2026 23:26:11 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/</guid><description>&lt;h2 id="概要"&gt;概要&lt;/h2&gt;
&lt;p&gt;ラズベリーパイからサーバー運用を始め，その後はデスクトップPCでKubernetesを動かすところまで経験しました．
この過程でネットワークの仕組みを学ぶことができました．&lt;/p&gt;
&lt;p&gt;こうした経験は，残しておかなければ忘れてしまうため，本稿にまとめます．&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="サーバー運用の変遷"&gt;サーバー運用の変遷&lt;/h2&gt;
&lt;p&gt;以下の画像は，直近でGitHubのプロフィールに掲載していたサーバーの運用記録です．&lt;/p&gt;
&lt;p&gt;&lt;img alt="自宅サーバーの運用記録" loading="lazy" src="http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/images/image.png"&gt;&lt;/p&gt;
&lt;h3 id="1-初期ラズベリーパイ"&gt;1. 初期：ラズベリーパイ&lt;/h3&gt;
&lt;p&gt;初期のサーバー構成は以下の通りです．&lt;/p&gt;
&lt;p&gt;&lt;img alt="自宅ラズベリーパイサーバー構成図" loading="lazy" src="http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/images/image-2.png"&gt;&lt;/p&gt;
&lt;p&gt;このラズパイサーバーは，空冷ファンとSSDを増設したものです．
可用性を向上させるために増設したのですが，周辺機器を増やした影響で電源供給が不安定になってしまっていました．
突発的にSSDの読み取りに失敗することがあり，頻繁にサーバーが落ちるエラーを抱えていました．&lt;/p&gt;
&lt;h3 id="2-中期デスクトップpc"&gt;2. 中期：デスクトップPC&lt;/h3&gt;
&lt;p&gt;ラズパイの電源課題を解決するため，余っていたデータ分析用のゲーミングデスクトップPCをUbuntu Server化し，運用を始めることにしました．&lt;/p&gt;
&lt;p&gt;マシンスペックが向上し，懸念だった電源回りも大幅に改善しました．この時期はコンテナオーケストレーションの学習を兼ねて，MicroK8sを導入．GitHubでビルドしたWebサイトのコンテナイメージを自動でPullし，K8sランタイム上で動作させていました．&lt;/p&gt;
&lt;p&gt;以前，環境構築の勉強のために一からKubernetesを構築した経験があったのですが，それに比べるとMicroK8sは簡単に導入でき，個人運用のコンテナランタイムとしては管理コストを抑えられる点が素晴らしいと感じました．&lt;/p&gt;
&lt;p&gt;加えて，Prometheusも導入し，Grafanaを利用してサーバーの状態を可視化していました．
MicroK8sでは，こうした周辺ツールの導入もアドオンとして用意されており，導入が手軽でした．&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img alt="Grafanaの管理画面" loading="lazy" src="http://yoshiyuki-140.github.io/posts/migrating-from-homeserver-to-github-pages/images/image-1.png"&gt;
Grafanaを導入したときのスクショです．きれいすぎてビビりました．&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;しかし，スペックや運用環境は大幅に向上したものの，物理的な単一ノードであることには変わりなく，可用性の低さが依然として課題となりました．&lt;/p&gt;
&lt;h3 id="3-現在github-pagesへの移行"&gt;3. 現在：GitHub Pagesへの移行&lt;/h3&gt;
&lt;p&gt;運用コストを抑えつつ，高い可用性を維持したいと考えた結果，最終的にWebサイトのホスティング先を GitHub Pages へ移行することにしました．
これにより，安価かつ高い可用性を実現できました．&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="学んだ技術"&gt;学んだ技術&lt;/h2&gt;
&lt;p&gt;今回のインフラ刷新と運用の変遷を経て，以下の技術への理解が深まりました．&lt;/p&gt;
&lt;h3 id="静的サイト生成とcicd"&gt;静的サイト生成とCI/CD&lt;/h3&gt;
&lt;p&gt;現在のWebサイトは，静的サイト生成ツールである Hugoを使って構築しています．記事の内容はMarkdownで執筆し，HugoでHTML/CSSにビルドしたものをGitHub Pagesで公開する仕組みです．&lt;/p&gt;
&lt;p&gt;デプロイの自動化（CI/CD）を整えるにあたっては，Hugo公式が提供しているGitHub Actions用のテンプレートを利用しました&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;．&lt;/p&gt;
&lt;p&gt;MarkdownをGitHubにPushするだけで自動的にサイトが更新される環境が整い，運用の手間が大幅に削減されました．&lt;/p&gt;
&lt;h3 id="cloudflare-zero-trustによる公開"&gt;Cloudflare Zero Trustによる公開&lt;/h3&gt;
&lt;p&gt;勉強のために始めた自宅サーバーですが，外部公開のステップでも大きな学びがありました．
通常ならポート開放が必要なところですが，Cloudflare Tunnel&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;を利用することで，ポートを閉じたまま安全に外部公開する仕組みを構築できました．&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ラズパイの故障対応から始まり，MicroK8sでの本格的なコンテナ運用，そしてGitHub Pagesへの移行と，目的や課題に応じてインフラを変化させていくプロセスが面白かったです．&lt;/p&gt;
&lt;p&gt;物理マシンを触りながらインフラ領域について学んだことを，今後の開発に活かしていきたいです．&lt;/p&gt;
&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;&lt;a href="https://gohugo.io/host-and-deploy/host-on-github-pages/"&gt;Host on GitHub Pages | Hugo&lt;/a&gt;&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;&lt;a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/"&gt;Cloudflare Tunnel&lt;/a&gt;&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><item><title>Leetcode 120をGoで解く</title><link>http://yoshiyuki-140.github.io/posts/leetcode-120/</link><pubDate>Wed, 10 Jun 2026 08:16:10 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/leetcode-120/</guid><description>&lt;p&gt;以下の記事で，leetcode精選120問が公開されていたので，解いていきます．
&lt;a href="https://blog.pco2699.net/entry/2024/01/30/070011#%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%93%E3%83%A5%E3%83%BC%E5%AF%BE%E7%AD%96"&gt;アメリカでソフトウェアエンジニアの職を探した&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;進捗は&lt;a href="https://github.com/yoshiyuki-140/leetcode"&gt;こちら&lt;/a&gt;のリポジトリに記録しております．&lt;/p&gt;
&lt;h1 id="2026年4月24日6月10日"&gt;2026年4月24日~6月10日&lt;/h1&gt;
&lt;p&gt;Go言語を使って，いったんEasyの問題は全て解きました．(&lt;code&gt;meeting-rooms&lt;/code&gt;は課金しないと閲覧できなかったので省きました)
Go言語はシンプルで解きやすいですが，優先度付きキューを実現するための二分ヒープのデータ構造を自前で定義しなければならず，競技プログラミングには使えそうにないなと感じました．
逆に途中Rustに浮気していたのですが，RustはCPUバウンドの処理が得意な言語らしくそういったデータ構造は事前に定義してあるものが使えて便利でした．(&lt;a href="https://leetcode.com/problems/kth-largest-element-in-a-stream/"&gt;kth-largest-element-in-a-stream&lt;/a&gt;にて)
ドリル形式でわからない問題は解法を頭に入れてからその後理解するようにしました．&lt;/p&gt;
&lt;p&gt;&lt;img alt="leetcodeで解くべき120問のEasy問題" loading="lazy" src="http://yoshiyuki-140.github.io/posts/leetcode-120/images/image.png"&gt;&lt;/p&gt;
&lt;p&gt;メンタル面で変化がありました．
解いているうちに，より美しいコードを書きたいと思うようになってきました．
また，実務でコードを読むスピードが速くなり，生成AIに書かせるときもより適切な指示ができるようになったと思います．
コードを見る目が養われてきて，効率的なコードを書けるときがありました．&lt;/p&gt;
&lt;p&gt;例えば，ステータスを扱う時，プログラムで扱っている値をユーザが画面上で見る値に変換するコードが書きたい場面を考えてみます．
&lt;img alt="ステータスマッピングの例" loading="lazy" src="http://yoshiyuki-140.github.io/posts/leetcode-120/images/image-1.png"&gt;
この程度の例であればswitch文で書いてもいいかもしれませんが，Statusが多くなるとコードが冗長になるかと思います．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// statusにはプログラム側で管理されている文字列(&amp;#34;Active&amp;#34;,&amp;#34;Deleted&amp;#34;等)が入っている想定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;convertVisibleStatus&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Active&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;有効&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Deleted&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;削除済み&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Freeze&amp;#34;&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;凍結済み&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;convertVisibleStatus&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Active&amp;#34;&lt;/span&gt;)) &lt;span style="color:#75715e"&gt;// 出力 : 有効&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし，ハッシュマップを使えば，きれいに書くことが可能です．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;statusMap&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Active&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;有効&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Deleted&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;削除済み&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Freeze&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;凍結済み&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Println&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;statusMap&lt;/span&gt;[&lt;span style="color:#e6db74"&gt;&amp;#34;Active&amp;#34;&lt;/span&gt;]) &lt;span style="color:#75715e"&gt;// 出力 : 有効&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>自宅サーバーにMicroK8s導入</title><link>http://yoshiyuki-140.github.io/posts/microk8s-home-server/</link><pubDate>Sun, 17 May 2026 00:31:02 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/microk8s-home-server/</guid><description>&lt;h1 id="概要"&gt;概要&lt;/h1&gt;
&lt;p&gt;自宅サーバーのリプレイスに伴い，マシンスペックに余裕ができたため，コンテナオーケストレーション環境の構築を検討しました．
運用の手間を減らしつつ，実務で使うことの多いK8s環境を構築し，学びにつなげるため，軽量版パッケージであるMicroK8sを導入しました．&lt;/p&gt;
&lt;p&gt;後学のため，導入方法とメトリクス可視化のための設定をまとめておきます．
本質的な難しい部分はMicroK8sが肩代わりしてくれているので，各ステップはとても簡単かなと思います．&lt;/p&gt;
&lt;h2 id="前提"&gt;前提&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;OS : Ubuntu Server 24.04&lt;/li&gt;
&lt;li&gt;ネットワーク : 外部への公開およびルーティングにはCloudflare Tunnelを利用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MicroK8sはUbuntuの開発元であるCanonicalが開発しており，導入時の障害が少ないかと思います．&lt;/p&gt;
&lt;h2 id="microk8s"&gt;MicroK8s&lt;/h2&gt;
&lt;p&gt;MicroK8sは，ローカル環境で実行することを想定されたらしいです&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;．&lt;/p&gt;
&lt;p&gt;複雑な設定なしに単一ノードで動くため，今回のケースでは導入が非常に簡単でした．
何はともあれ自宅サーバーは管理しやすい方がいいので，MicroK8sを選んでよかったなと思っています．&lt;/p&gt;
&lt;h1 id="アプローチ"&gt;アプローチ&lt;/h1&gt;
&lt;p&gt;ここからは，MicroK8sを導入する手順を述べます&lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;．
以下のコマンドを実行すると，MicroK8sがインストールできます．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo snap install microk8s --classic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;ndash;classicはsnapのサンドボックス機能を無効化するオプションです．詳細は後述する用語集を参照してください．&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;以上です．
これだけでMicroK8sがインストールできてしまいます．&lt;/p&gt;
&lt;h2 id="dnsとstorageの有効化"&gt;DNSとstorageの有効化&lt;/h2&gt;
&lt;p&gt;次にDNSとstorageというアドオンを入れます．
DNSはコンテナ間での名前解決のため，storageはDBを使うときに使います．
もしstorageを利用しない場合，PostgreSQLなどのDBコンテナにおいてコンテナが再起動した瞬間にデータが全消去されます．
また，データを保持するための設定を書いてもエラーになってアプリが起動しません．
これらを入れていないと，サーバー用途としてはまともに使えません．
K8sでは，K8s内部で動的にIPアドレスが変化します．
そのため，DNSでコンテナの名前解決をしないと，外部公開する際にコンテナを指定できません．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo microk8s enable dns storage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これだけでセットアップ完了です．&lt;/p&gt;
&lt;h2 id="メトリクス収集ツール"&gt;メトリクス収集ツール&lt;/h2&gt;
&lt;p&gt;サーバーの稼働状況を可視化してくれるツールを導入します．&lt;/p&gt;
&lt;p&gt;これもMicroK8sであれば簡単に導入できます．&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo microk8s enable observability
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;observability&lt;/code&gt;アドオンを有効化すると，内部では，&lt;code&gt;kube-prom-stack-grafana&lt;/code&gt;という名称のServiceが作成されるため，それを参照します．&lt;/p&gt;
&lt;p&gt;&lt;code&gt;service.yaml&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;apiVersion&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;v1&lt;/span&gt; &lt;span style="color:#75715e"&gt;# api version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;kind&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;metadata&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;external-grafana&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;namespace&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;default&lt;/span&gt; &lt;span style="color:#75715e"&gt;# cloudflaredのPodが動いているNamespaceと同じにしてください&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spec&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ExternalName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;externalName&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;kube-prom-stack-grafana.observability.svc.cluster.local&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;port&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Grafanaが起動するポート番号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;targetPort&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これをcloudflareのトンネル経由で公開すると，可視化されます．&lt;/p&gt;</description></item><item><title>坂本研究室Rust勉強会導入</title><link>http://yoshiyuki-140.github.io/posts/sklab-rust-workshop-2026-1/</link><pubDate>Mon, 11 May 2026 15:54:14 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/sklab-rust-workshop-2026-1/</guid><description>&lt;h1 id="概要"&gt;概要&lt;/h1&gt;
&lt;p&gt;「ゼロから作るDeep Learning」をRustで実装する前に，Rustに慣れるため，leetcodeの問題を解きましょう．&lt;/p&gt;
&lt;p&gt;本稿では最も基本的なデータ構造である，配列操作を扱います．
問題はコーディングテストで出題されやすい問題がまとめられている教育用サイトであるleetcodeから最も基本的なデータ構造である配列操作を行う問題のうち難易度Easyの問題を4問選びました．&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;leetcodeの問題は全部で2000問以上あるので，面接で聞かれやすい問題を集めた&lt;a href="https://leetcode.com/problem-list/rab78cw1/"&gt;Grind 75&lt;/a&gt;等を解いて対策するのがいいと思います．&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="ルール"&gt;ルール&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;問題を解いているとき，AIには問題にそのものについて質問してはいけません．&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;例えば、問題文をAIに投げて解答コードを得るなど．&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AIに質問していいこと&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rustの文法事項(データ構造や文法の解説等)&lt;/li&gt;
&lt;li&gt;概念に関する質問&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解答を理解するフェーズでは，Ask AI First(まずAIに聞け)．の姿勢でお願いします．(何も見ずに，解答コードを書けるようになれば，いったん，その問題を解けたといってもいいと思います．)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ここに記載してある解が最も優れているわけではありません．&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="問題"&gt;問題&lt;/h1&gt;
&lt;h2 id="問題1"&gt;問題1&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/two-sum/description/"&gt;1. Two Sum&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;これより下には解答があります．まずは，15分考えてみましょう．&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="解答解説"&gt;解答・解説&lt;/h3&gt;
&lt;details&gt;
&lt;summary&gt;クリックで展開 (問題に15分向き合っていない場合は展開しないでください)&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;impl&lt;/span&gt; Solution {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;pub&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;two_sum&lt;/span&gt;(nums: Vec&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;, target: &lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;) -&amp;gt; Vec&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. ハッシュマップを用意する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;mut&lt;/span&gt; map: &lt;span style="color:#a6e22e"&gt;std&lt;/span&gt;::collections::HashMap&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;usize&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std::collections::HashMap::with_capacity(nums.len()); &lt;span style="color:#75715e"&gt;// capacityを読み込むとプログラムが安定する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. hashMapの中にあるかどうかを判定する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;n) &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; nums.iter().enumerate() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// hashMapの中にあるかどうかを判定して、存在すればそれを返却する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; Some(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;prev_index) &lt;span style="color:#f92672"&gt;=&lt;/span&gt; map.get(&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;n) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vec!&lt;/span&gt;[prev_index &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;, i &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 現在の値の相方が必要な値として、今のインデックスを保存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; map.insert(target &lt;span style="color:#f92672"&gt;-&lt;/span&gt; n, i);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ここには到達しないけど返却
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;vec!&lt;/span&gt;[]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;hr&gt;
&lt;h2 id="問題2"&gt;問題2&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/"&gt;121. Best Time to Buy and Sell Stock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;これより下には解答があります．まずは，15分考えてみましょう．&lt;/p&gt;</description></item><item><title>Rustにおける構造体のデータ格納場所分析</title><link>http://yoshiyuki-140.github.io/posts/analysis-of-data-storage-locations-for-structs-in-rust/</link><pubDate>Sat, 02 May 2026 16:07:30 +0900</pubDate><guid>http://yoshiyuki-140.github.io/posts/analysis-of-data-storage-locations-for-structs-in-rust/</guid><description>&lt;h1 id="概要"&gt;概要&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://tourofrust.com/26_ja.html"&gt;このページ&lt;/a&gt;で「String構造体もスタックに入りますが、ヒープに入るデータの参照アドレスが一つ入ります。」とあった。
分析することで確認する。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://ja.wikipedia.org/wiki/GNU%E3%83%87%E3%83%90%E3%83%83%E3%82%AC"&gt;GDB&lt;/a&gt;を用いて分析する。
筆者はWindows11においてWSLを用いてUbuntu24.04を使用している。
2025年11月1日現在、筆者の環境ではGDBは以下のコマンドでインストールできる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install gdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="分析"&gt;分析&lt;/h1&gt;
&lt;p&gt;本稿では、前述のページにあるサンプルコードに対して分析を行う。リンク切れをしたときに備えて、対象にするソースコードを示しておく。
以下の文章では、ソースコードといったら、以下のRustコードのことを指すものとする。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SeaCreature&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animal_type: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arms: &lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; legs: &lt;span style="color:#66d9ef"&gt;i32&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; weapon: String,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// SeaCreatureのデータはスタックに入ります。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; ferris &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SeaCreature {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// String構造体もスタックに入りますが、
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ヒープに入るデータの参照アドレスが一つ入ります。
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animal_type: String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;crab&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;Ferris&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arms: &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; legs: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; weapon: String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;claw&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; sarah &lt;span style="color:#f92672"&gt;=&lt;/span&gt; SeaCreature {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; animal_type: String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;octopus&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name: String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;Sarah&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arms: &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; legs: &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; weapon: String::from(&lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;println!&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; is a &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;. They have &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; arms, &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; legs, and a &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; weapon&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ferris.name, ferris.animal_type, ferris.arms, ferris.legs, ferris.weapon
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;println!&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; is a &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;. They have &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; arms, and &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{}&lt;/span&gt;&lt;span style="color:#e6db74"&gt; legs. They have no weapon..&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sarah.name, sarah.animal_type, sarah.arms, sarah.legs
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="構造体のインスタンスとなる変数の場所"&gt;構造体のインスタンスとなる変数の場所&lt;/h2&gt;
&lt;p&gt;ソースコードにおける、main関数の中で定義されている&lt;code&gt;ferris&lt;/code&gt;と&lt;code&gt;sarah&lt;/code&gt;は&lt;code&gt;SeaCreature&lt;/code&gt;構造体のインスタンスである。
これはメモリ上どこにあるのだろうか？&lt;/p&gt;</description></item></channel></rss>