<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>calmi</title>
    <link>https://calmi.net/</link>
    <description>Recent content on calmi</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <lastBuildDate>Thu, 26 Feb 2026 21:50:18 +0900</lastBuildDate>
    <atom:link href="https://calmi.net/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ワールドに置ける対戦型ゲーム機を作った</title>
      <link>https://calmi.net/posts/2026/02/26/portable-game-machine/</link>
      <pubDate>Thu, 26 Feb 2026 21:50:18 +0900</pubDate>
      <guid>https://calmi.net/posts/2026/02/26/portable-game-machine/</guid>
      <description>&lt;p&gt;思いついたので、ワールドに設置できる、実際に遊べるゲーム機を作ってみました。&#xA;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://debrisfield.booth.pm/items/8015378&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-image&#34;&gt;&#xA;        &lt;img src=&#34;https://booth.pximg.net/c/620x620/f89a9a38-5ad3-426e-a66c-f2d1aa6b5512/i/8015378/49dfd5c2-7d9d-4030-b38b-45ada2eace9d_base_resized.jpg&#34; alt=&#34;【Udon用ゲーム】PortableGameMachine【VRChat】 - Debris Field - BOOTH&#34; loading=&#34;lazy&#34; /&gt;&#xA;        &lt;div class=&#34;link-card-image-overlay&#34;&gt;&lt;/div&gt;&#xA;      &lt;/div&gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;【Udon用ゲーム】PortableGameMachine【VRChat】 - Debris Field - BOOTH&lt;/div&gt;&lt;div class=&#34;link-card-description&#34;&gt;&#xA;          1vs1 の対戦型シューティングゲームを搭載した、携帯ゲーム機型ワールド向けギミックのアセットです。 あなたの作成する VRChat ワールドへ設置できます。 こちらのワールドに実物が設置してあります。購入前のゲーム内容確認などにどうぞ。 …&#xA;        &lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;debrisfield.booth.pm&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;概要&#34;&gt;概要&lt;/h2&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-figure&#34;&gt;&#xA;  &lt;img&#xA;    src=&#34;1772110536623.png&#34;&#xA;    alt=&#34;&#34;&#xA;    &#xA;    loading=&#34;lazy&#34;&#xA;  /&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-figure&#34;&gt;&#xA;  &lt;img&#xA;    src=&#34;1772110546817.png&#34;&#xA;    alt=&#34;&#34;&#xA;    &#xA;    loading=&#34;lazy&#34;&#xA;  /&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;２人対戦の、シューティングゲームにしてみました。&#xA;お互いに弾を撃ちあって、先にあたった方が負けというシンプルなゲーム。&#xA;VRChat のワールドの中で、2人でゲーム機を握って対戦をするという体験が今までなかったと思うので、これだけでも面白いかなぁ、と。&#xA;これだけでも良かったんですが、テストプレイしたら決着が全然つかないし、なんか地味だったので強化アイテムの要素を入れました。&#xA;とおもったら実際に試すと今度は通常弾だけで決着がつく人もいたり。調整って難しいですね。&lt;/p&gt;&#xA;&lt;h2 id=&#34;コーディング&#34;&gt;コーディング&lt;/h2&gt;&#xA;&lt;p&gt;全部 Opus 4.6 がやりました。&#xA;もちろん仕組みは自分で考えましたが、もう手でコーディングする時代じゃないんだなぁ。&#xA;Claude Pro だとレートリミットがきつすぎて、がっつり何か作ろうとするとまるで足りませんね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Minecraft プレイ記録 #1</title>
      <link>https://calmi.net/posts/2026/02/09/minecraft-play-1/</link>
      <pubDate>Mon, 09 Feb 2026 20:25:20 +0900</pubDate>
      <guid>https://calmi.net/posts/2026/02/09/minecraft-play-1/</guid>
      <description>&lt;p&gt;前回の記事 &lt;a href=&#34;../08/techguns-sound-fix/&#34;&gt;Techguns の銃の音がおかしいのを直した&lt;/a&gt; で気になっていた問題が解消されたので、久々に Minecraft をプレイしていきます。&lt;/p&gt;&#xA;&lt;h2 id=&#34;環境&#34;&gt;環境&lt;/h2&gt;&#xA;&lt;p&gt;MOD 入りの Minecraft 1.7.10 です。古き良き時代。&lt;/p&gt;&#xA;&lt;h3 id=&#34;主要な-mod&#34;&gt;主要な MOD&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gregtech.overminddl1.com/&#34;&gt;Gregtech6&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://legacy.curseforge.com/minecraft/mc-mods/techguns&#34;&gt;Techguns&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;あと味付けで Spice of Life とか Enviromine とか。 Pam&amp;rsquo;s も入ってる。&#xA;最近の 1.7.10 MOD 事情は面白くて、それだけでもめちゃめちゃ話せることがあるんですが、今回はおいておきます。&#xA;気になる人は以下の MOD を見てみるといいです。なんか Java 21 とかで動きます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://github.com/GTNewHorizons/Angelica&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-image&#34;&gt;&#xA;        &lt;img src=&#34;https://opengraph.githubassets.com/8067a7d06761f579ac17ffbb6a02286560cc0e8a0bc7a73014b47e1786416f84/GTNewHorizons/Angelica&#34; alt=&#34;GitHub - GTNewHorizons/Angelica: OptiFine replacement for 1.7.10&#34; loading=&#34;lazy&#34; /&gt;&#xA;        &lt;div class=&#34;link-card-image-overlay&#34;&gt;&lt;/div&gt;&#xA;      &lt;/div&gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;GitHub - GTNewHorizons/Angelica: OptiFine replacement for 1.7.10&lt;/div&gt;&lt;div class=&#34;link-card-description&#34;&gt;&#xA;          OptiFine replacement for 1.7.10. Contribute to GTNewHorizons/Angelica development by creating an account on GitHub.&#xA;        &lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-site&#34;&gt;GitHub&lt;/span&gt;&#xA;          &lt;span class=&#34;link-card-separator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;github.com&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://github.com/GTNewHorizons/lwjgl3ify&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-image&#34;&gt;&#xA;        &lt;img src=&#34;https://opengraph.githubassets.com/a481a2481f9b5d7b78a575cd72b95082ffc15a0e14e7eb2143827df8739869ef/GTNewHorizons/lwjgl3ify&#34; alt=&#34;GitHub - GTNewHorizons/lwjgl3ify: A mod to run Minecraft 1.7.10 using LWJGL3 and Java 17&amp;#43;&#34; loading=&#34;lazy&#34; /&gt;&#xA;        &lt;div class=&#34;link-card-image-overlay&#34;&gt;&lt;/div&gt;&#xA;      &lt;/div&gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;GitHub - GTNewHorizons/lwjgl3ify: A mod to run Minecraft 1.7.10 using LWJGL3 and Java 17&amp;#43;&lt;/div&gt;&lt;div class=&#34;link-card-description&#34;&gt;&#xA;          A mod to run Minecraft 1.7.10 using LWJGL3 and Java 17+ - GTNewHorizons/lwjgl3ify&#xA;        &lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-site&#34;&gt;GitHub&lt;/span&gt;&#xA;          &lt;span class=&#34;link-card-separator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;github.com&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Techguns の銃の音がおかしいのを直した</title>
      <link>https://calmi.net/posts/2026/02/08/techguns-sound-fix/</link>
      <pubDate>Sun, 08 Feb 2026 20:09:49 +0900</pubDate>
      <guid>https://calmi.net/posts/2026/02/08/techguns-sound-fix/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://legacy.curseforge.com/minecraft/mc-mods/techguns/files/all?filter-game-version=2020709689%3A4449&#34;&gt;Techguns&lt;/a&gt; という Minecraft の MOD があります。&#xA;銃や敵 mob を追加する MOD で、 1.7.10 の名作 MOD の一つです。&#xA;この MOD、プレイヤーが銃を撃つときの音が左ばかりから聞こえてきてしまう、という問題があります。&#xA;これを何とかしようとしました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;調査&#34;&gt;調査&lt;/h2&gt;&#xA;&lt;p&gt;まず、どうなっているのかを確認してみました。&#xA;jar を展開して、音声ファイルを聞いてみましたが、特に問題はありませんでした。&#xA;で、音を鳴らすロジックのほうに問題があるのではないか？と思い、 AI に class ファイルを解析させました。&#xA;すると、 Techguns の TGSound クラスに問題があることがわかりました。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;MathUtil.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;Vec2&lt;/span&gt; pos &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; MathUtil.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;polarOffsetXZ&lt;/span&gt;(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#fabd2f&#34;&gt;double&lt;/span&gt;)&lt;span style=&#34;color:#fe8019&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;field_147660_d&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#fabd2f&#34;&gt;double&lt;/span&gt;)&lt;span style=&#34;color:#fe8019&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;field_147658_f&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    1.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;0&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    (&lt;span style=&#34;color:#fabd2f&#34;&gt;double&lt;/span&gt;)((EntityLivingBase)entity).&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;field_70759_as&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;*&lt;/span&gt; Math.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;PI&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;/&lt;/span&gt; 180.&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;座標系の取り扱いを間違えていたようです。&lt;/p&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;座標系&lt;/th&gt;&#xA;          &lt;th&gt;0°の方向&lt;/th&gt;&#xA;          &lt;th&gt;90°の方向&lt;/th&gt;&#xA;          &lt;th&gt;回転方向&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Minecraft&lt;/td&gt;&#xA;          &lt;td&gt;南(+Z)&lt;/td&gt;&#xA;          &lt;td&gt;西(-X)&lt;/td&gt;&#xA;          &lt;td&gt;時計回り（負）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;極座標&lt;/td&gt;&#xA;          &lt;td&gt;東(+X)&lt;/td&gt;&#xA;          &lt;td&gt;北(+Z)&lt;/td&gt;&#xA;          &lt;td&gt;反時計回り（正）&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;こういうことらしい。&lt;/p&gt;&#xA;&lt;h2 id=&#34;修正&#34;&gt;修正&lt;/h2&gt;&#xA;&lt;p&gt;別に裏とかとってないんですが、まあ別に直せればなんだっていいので、そのまま Mixins とかいうやつでコードを差し替える MOD を作らせました。&lt;/p&gt;&#xA;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://github.com/pluslatte/techguns-sound-fix&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-image&#34;&gt;&#xA;        &lt;img src=&#34;https://opengraph.githubassets.com/ea2fe3cbf87e67a57c341fa04ef4ae04a27c88410246d4bbb27ce1297d78986f/pluslatte/techguns-sound-fix&#34; alt=&#34;GitHub - pluslatte/techguns-sound-fix&#34; loading=&#34;lazy&#34; /&gt;&#xA;        &lt;div class=&#34;link-card-image-overlay&#34;&gt;&lt;/div&gt;&#xA;      &lt;/div&gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;GitHub - pluslatte/techguns-sound-fix&lt;/div&gt;&lt;div class=&#34;link-card-description&#34;&gt;&#xA;          Contribute to pluslatte/techguns-sound-fix development by creating an account on GitHub.&#xA;        &lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-site&#34;&gt;GitHub&lt;/span&gt;&#xA;          &lt;span class=&#34;link-card-separator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;github.com&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;で、これを入れてみたら直りました。すごいね。&#xA;Actions のビルドがこけてるのは、ビルド時に Techguns の jar が必要なのにリポジトリには入っていないからです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ブログを作ってみました</title>
      <link>https://calmi.net/posts/2026/02/07/02/</link>
      <pubDate>Sat, 07 Feb 2026 19:55:42 +0900</pubDate>
      <guid>https://calmi.net/posts/2026/02/07/02/</guid>
      <description>&lt;p&gt;ブログを作ってみました。その辺にあるサービスを使ってもよかったんですが、「自分の場所」というものが好きなので、自前で用意することにしました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;どうなってるの&#34;&gt;どうなってるの&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; とかいうやつを使っています。&lt;/p&gt;&#xA;&lt;p&gt;GitHub Actions でビルドして、 Cloudflare Pages にぶん投げて公開している。こういうの触ったことないので、完全に手探りです。&lt;/p&gt;&#xA;&lt;h2 id=&#34;テーマについて&#34;&gt;テーマについて&lt;/h2&gt;&#xA;&lt;p&gt;テーマは Claude くんに相談しながら気合で作りました。ちょっと懐かしい感じにしてみたかったので、わざと古い見た目にしました。&lt;/p&gt;&#xA;&lt;p&gt;結構気合を入れて作ったので、様々なものに対応しています。&lt;/p&gt;&#xA;&lt;p&gt;コードブロックとか&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;const&lt;/span&gt; hello &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; (name: &lt;span style=&#34;color:#fabd2f&#34;&gt;string&lt;/span&gt;)&lt;span style=&#34;color:#fe8019&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;string&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;=&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#fe8019&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#b8bb26&#34;&gt;`Hello, &lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;${&lt;/span&gt;name&lt;span style=&#34;color:#b8bb26&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;!`&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;リンク先のカード表示とか&lt;/p&gt;&#xA;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://virtualkemomimi.net/notes/aifcoxjbeh&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-image&#34;&gt;&#xA;        &lt;img src=&#34;https://virtualkemomimi.net/proxy/avatar.webp?url=https%3A%2F%2Fmedia.virtualkemomimi.net%2Ffiles%2Fd55bc44c-46b5-4f92-80fd-c8a66ab0b4b5.png&amp;amp;avatar=1&#34; alt=&#34;pluslatte (@pluslatte)&#34; loading=&#34;lazy&#34; /&gt;&#xA;        &lt;div class=&#34;link-card-image-overlay&#34;&gt;&lt;/div&gt;&#xA;      &lt;/div&gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;pluslatte (@pluslatte)&lt;/div&gt;&lt;div class=&#34;link-card-description&#34;&gt;&#xA;          なんか雪降ってね？&#xA;        &lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-site&#34;&gt;バーチャルケモミミ！&lt;/span&gt;&#xA;          &lt;span class=&#34;link-card-separator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;virtualkemomimi.net&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;何かいろいろ書いていけたらいいな。&lt;/p&gt;</description>
    </item>
    <item>
      <title>テスト記事 Test Article</title>
      <link>https://calmi.net/posts/2026/02/07/01/</link>
      <pubDate>Sat, 07 Feb 2026 15:06:50 +0900</pubDate>
      <guid>https://calmi.net/posts/2026/02/07/01/</guid>
      <description>&lt;p&gt;このページではブログの各種機能をテストします。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ogp-リンクカード機能のテスト&#34;&gt;OGP リンクカード機能のテスト&lt;/h2&gt;&#xA;&lt;p&gt;記事内で外部リンクをOGP付きのカードとして表示できます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;使い方&#34;&gt;使い方&lt;/h3&gt;&#xA;&lt;p&gt;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://pluslatte.com&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;こんにちは&lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;pluslatte.com&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;div class=&#34;link-card&#34;&gt;&#xA;  &lt;a&#xA;    href=&#34;https://virtualkemomimi.net&#34;&#xA;    target=&#34;_blank&#34;&#xA;    rel=&#34;noopener noreferrer&#34;&#xA;    class=&#34;link-card-inner&#34;&#xA;  &gt;&lt;div class=&#34;link-card-image&#34;&gt;&#xA;        &lt;img src=&#34;https://media.virtualkemomimi.net/files/thumbnail-1c12a88f-480a-44d9-aa90-88285b9221bb.webp&#34; alt=&#34;バーチャルケモミミ！&#34; loading=&#34;lazy&#34; /&gt;&#xA;        &lt;div class=&#34;link-card-image-overlay&#34;&gt;&lt;/div&gt;&#xA;      &lt;/div&gt;&lt;div class=&#34;link-card-content&#34;&gt;&lt;div class=&#34;link-card-title&#34;&gt;バーチャルケモミミ！&lt;/div&gt;&lt;div class=&#34;link-card-description&#34;&gt;&#xA;          バーチャルとけもみみとそれ以外に関するMisskeyインスタンス&#xA;けもみみーっ！！！！！！！！！&#xA;        &lt;/div&gt;&lt;div class=&#34;link-card-url&#34;&gt;&lt;span class=&#34;link-card-site&#34;&gt;バーチャルケモミミ！&lt;/span&gt;&#xA;          &lt;span class=&#34;link-card-separator&#34;&gt;|&lt;/span&gt;&lt;span class=&#34;link-card-domain&#34;&#xA;          &gt;virtualkemomimi.net&lt;/span&#xA;        &gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/div&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;通常のリンクとの比較：&lt;a href=&#34;https://gohugo.io&#34;&gt;Hugo公式サイト&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;画像表示のテスト&#34;&gt;画像表示のテスト&lt;/h2&gt;&#xA;&lt;p&gt;Markdownで画像を表示できます。&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;![&lt;span style=&#34;color:#fb4934&#34;&gt;代替テキスト&lt;/span&gt;](&lt;span style=&#34;color:#b8bb26;font-weight:bold&#34;&gt;image.jpg&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;相対パスや外部URLで画像を表示：&lt;/p&gt;&#xA;&lt;p&gt;&lt;figure class=&#34;image-figure&#34;&gt;&#xA;  &lt;img&#xA;    src=&#34;1770445957654.png&#34;&#xA;    alt=&#34;&#34;&#xA;    &#xA;    loading=&#34;lazy&#34;&#xA;  /&gt;&lt;/figure&gt;&#xA;&lt;/p&gt;&#xA;&lt;h2 id=&#34;youtube動画の埋め込みテスト&#34;&gt;Youtube動画の埋め込みテスト&lt;/h2&gt;&#xA;&lt;p&gt;Hugoの組み込みショートコードでYoutube動画を埋め込めます。&lt;/p&gt;&#xA;&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;&#xA;      &lt;iframe allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen&#34; loading=&#34;eager&#34; referrerpolicy=&#34;strict-origin-when-cross-origin&#34; src=&#34;https://www.youtube.com/embed/r7JoIi2ja_s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0&#34; style=&#34;position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;&#34; title=&#34;YouTube video&#34;&gt;&lt;/iframe&gt;&#xA;    &lt;/div&gt;&#xA;&#xA;&lt;h2 id=&#34;コードブロックのテスト&#34;&gt;コードブロックのテスト&lt;/h2&gt;&#xA;&lt;p&gt;シンタックスハイライト付きで様々な言語のコードを表示できます。&lt;/p&gt;&#xA;&lt;h3 id=&#34;typescript&#34;&gt;TypeScript&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-typescript&#34; data-lang=&#34;typescript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;interface&lt;/span&gt; User {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  id: &lt;span style=&#34;color:#fabd2f&#34;&gt;number&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  name: &lt;span style=&#34;color:#fabd2f&#34;&gt;string&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  email: &lt;span style=&#34;color:#fabd2f&#34;&gt;string&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;async&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;function&lt;/span&gt; fetchUser(id: &lt;span style=&#34;color:#fabd2f&#34;&gt;number&lt;/span&gt;)&lt;span style=&#34;color:#fe8019&#34;&gt;:&lt;/span&gt; Promise&amp;lt;&lt;span style=&#34;color:#fb4934&#34;&gt;User&lt;/span&gt;&amp;gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#fe8019&#34;&gt;const&lt;/span&gt; response &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;await&lt;/span&gt; fetch(&lt;span style=&#34;color:#b8bb26&#34;&gt;`/api/users/&lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;${&lt;/span&gt;id&lt;span style=&#34;color:#b8bb26&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;`&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#fe8019&#34;&gt;if&lt;/span&gt; (&lt;span style=&#34;color:#fe8019&#34;&gt;!&lt;/span&gt;response.ok) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;throw&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;Error&lt;/span&gt;(&lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;Failed to fetch user&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#fe8019&#34;&gt;return&lt;/span&gt; response.json();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;const&lt;/span&gt; user &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;await&lt;/span&gt; fetchUser(&lt;span style=&#34;color:#d3869b&#34;&gt;1&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;console.log(&lt;span style=&#34;color:#b8bb26&#34;&gt;`Hello, &lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;${&lt;/span&gt;user.name&lt;span style=&#34;color:#b8bb26&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;!`&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;c&#34;&gt;C#&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;using&lt;/span&gt; System;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;using&lt;/span&gt; System.Collections.Generic;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;using&lt;/span&gt; System.Linq;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;class&lt;/span&gt; User&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;int&lt;/span&gt; Id { &lt;span style=&#34;color:#fe8019&#34;&gt;get&lt;/span&gt;; &lt;span style=&#34;color:#fe8019&#34;&gt;set&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;string&lt;/span&gt; Name { &lt;span style=&#34;color:#fe8019&#34;&gt;get&lt;/span&gt;; &lt;span style=&#34;color:#fe8019&#34;&gt;set&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;string&lt;/span&gt; Email { &lt;span style=&#34;color:#fe8019&#34;&gt;get&lt;/span&gt;; &lt;span style=&#34;color:#fe8019&#34;&gt;set&lt;/span&gt;; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;class&lt;/span&gt; UserService&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;readonly&lt;/span&gt; List&amp;lt;User&amp;gt; _users = &lt;span style=&#34;color:#fe8019&#34;&gt;new&lt;/span&gt;();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;async&lt;/span&gt; Task&amp;lt;User?&amp;gt; GetUserAsync(&lt;span style=&#34;color:#fabd2f&#34;&gt;int&lt;/span&gt; id)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#fe8019&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;await&lt;/span&gt; Task.FromResult(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            _users.FirstOrDefault(u =&amp;gt; u.Id == id)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        );&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;void&lt;/span&gt; AddUser(User user)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        _users.Add(user);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        Console.WriteLine(&lt;span style=&#34;color:#b8bb26&#34;&gt;$&amp;#34;Added user: {user.Name}&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;rust&#34;&gt;Rust&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#ebdbb2;background-color:#282828;-moz-tab-size:2;-o-tab-size:2;tab-size:2;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;use&lt;/span&gt; std::collections::HashMap;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8ec07c&#34;&gt;#[derive(Debug, Clone)]&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;struct&lt;/span&gt; User {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    id: &lt;span style=&#34;color:#fabd2f&#34;&gt;u32&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name: &lt;span style=&#34;color:#fabd2f&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    email: &lt;span style=&#34;color:#fabd2f&#34;&gt;String&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;impl&lt;/span&gt; User {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;new&lt;/span&gt;(id: &lt;span style=&#34;color:#fabd2f&#34;&gt;u32&lt;/span&gt;, name: &lt;span style=&#34;color:#fe8019&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#fabd2f&#34;&gt;str&lt;/span&gt;, email: &lt;span style=&#34;color:#fe8019&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#fabd2f&#34;&gt;str&lt;/span&gt;) -&amp;gt; Self {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        User {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            id,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            name: name.to_string(),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            email: email.to_string(),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;struct&lt;/span&gt; UserRepository {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    users: HashMap&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#fabd2f&#34;&gt;u32&lt;/span&gt;, User&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;gt;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;impl&lt;/span&gt; UserRepository {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;new&lt;/span&gt;() -&amp;gt; Self {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        UserRepository {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            users: HashMap::new(),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;add_user&lt;/span&gt;(&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;mut&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;self&lt;/span&gt;, user: User) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#fabd2f&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;Adding user: &lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;{:?}&lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;&lt;/span&gt;, user.name);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#fabd2f&#34;&gt;self&lt;/span&gt;.users.insert(user.id, user);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;get_user&lt;/span&gt;(&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&#34;color:#fabd2f&#34;&gt;self&lt;/span&gt;, id: &lt;span style=&#34;color:#fabd2f&#34;&gt;u32&lt;/span&gt;) -&amp;gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;Option&lt;/span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;lt;&amp;amp;&lt;/span&gt;User&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;gt;&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#fabd2f&#34;&gt;self&lt;/span&gt;.users.get(&lt;span style=&#34;color:#fe8019&#34;&gt;&amp;amp;&lt;/span&gt;id)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#fe8019&#34;&gt;fn&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;mut&lt;/span&gt; repo &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; UserRepository::new();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;let&lt;/span&gt; user &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; User::new(&lt;span style=&#34;color:#d3869b&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;Alice&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;alice@example.com&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    repo.add_user(user);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#fe8019&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#fe8019&#34;&gt;let&lt;/span&gt; &lt;span style=&#34;color:#fabd2f&#34;&gt;Some&lt;/span&gt;(u) &lt;span style=&#34;color:#fe8019&#34;&gt;=&lt;/span&gt; repo.get_user(&lt;span style=&#34;color:#d3869b&#34;&gt;1&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#fabd2f&#34;&gt;println!&lt;/span&gt;(&lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;Found user: &lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;{}&lt;/span&gt;&lt;span style=&#34;color:#b8bb26&#34;&gt;&amp;#34;&lt;/span&gt;, u.name);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
