<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Golang on terassyi blog</title>
    <link>https://blog.terassyi.net/tags/golang/</link>
    <description>Recent content in Golang on terassyi blog</description>
    <generator>Hugo</generator>
    <language>ja</language>
    <managingEditor>iscale821@gmail.com (terassyi)</managingEditor>
    <webMaster>iscale821@gmail.com (terassyi)</webMaster>
    <lastBuildDate>Mon, 18 Oct 2021 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://blog.terassyi.net/tags/golang/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XDP入門</title>
      <link>https://blog.terassyi.net/posts/intro-xdp/</link>
      <pubDate>Mon, 18 Oct 2021 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/intro-xdp/</guid>
      <description>&lt;p&gt;こんにちは．閃光のハサウェイが配信開始されたので早速視聴しました．メッサーがいいですね．&lt;/p&gt;&#xA;&lt;p&gt;前回もXDP関連の話題でしたが，今回はXDPに入門します．&#xA;XDPを学習する際のロードマップやつまりどころの解消になればと思います．&lt;/p&gt;&#xA;&lt;h3 id=&#34;2023-12-30-加筆&#34;&gt;2023-12-30 加筆&lt;/h3&gt;&#xA;&lt;p&gt;本記事を公開して約 2 年が経過しました.&#xA;この加筆で古くなってしまった情報を修正しています.&#xA;差分は このブログの Github の &lt;a href=&#34;https://github.com/terassyi/blog/pull/57/files&#34;&gt;PR&lt;/a&gt; を見てください.&lt;/p&gt;&#xA;&lt;p&gt;この 2 年間で eBPF 及び XDP への注目はさらに高まったように感じます.&#xA;取得できる情報も充実してきました.&#xA;特に O&amp;rsquo;reilly より発売された &lt;a href=&#34;https://www.oreilly.co.jp/books/9784814400560/&#34;&gt;入門 eBPF&lt;/a&gt;(原書: &lt;a href=&#34;https://www.oreilly.com/library/view/learning-ebpf/9781098135119/&#34;&gt;Learning eBPF&lt;/a&gt;) は非常に充実した内容になっています.&#xA;日本語でこれらの情報に触れられるようになったことは大変ありがたいです.&lt;/p&gt;&#xA;&lt;p&gt;2023 年は個人的にも XDP に関して新たに発展的なコンテンツを作成しました.&lt;/p&gt;&#xA;&lt;p&gt;そちらも触っていただければと思います.&lt;/p&gt;&#xA;&lt;div class=&#34;github-card&#34; data-repo=&#34;terassyi/seccamp-xdp&#34;&gt;&#xA;    &lt;a href=&#34;https://github.com/terassyi/seccamp-xdp&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&#xA;      &lt;div class=&#34;github-icon&#34;&gt;&#xA;        &lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;          &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.03 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z&#34;/&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;div class=&#34;github-info&#34;&gt;&#xA;        &lt;div class=&#34;github-title&#34;&gt;terassyi/seccamp-xdp&lt;/div&gt;&#xA;        &#xA;        &lt;div class=&#34;github-description github-auto-description&#34;&gt;Loading...&lt;/div&gt;&#xA;        &#xA;        &lt;div class=&#34;github-meta&#34;&gt;&#xA;          &lt;span class=&#34;github-language&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;span class=&#34;language-dot&#34;&gt;&lt;/span&gt;&#xA;            &lt;span class=&#34;language-name&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;github-stat github-stars&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;svg width=&#34;14&#34; height=&#34;14&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;              &lt;path d=&#34;M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z&#34;/&gt;&#xA;            &lt;/svg&gt;&#xA;            &lt;span class=&#34;stars-count&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;github-stat github-forks&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;svg width=&#34;14&#34; height=&#34;14&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;              &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.25 2.25 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878z&#34;/&gt;&#xA;            &lt;/svg&gt;&#xA;            &lt;span class=&#34;forks-count&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;div class=&#34;github-arrow&#34;&gt;&#xA;        &lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;          &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M6.22 3.22a.75.75 0 011.06 0l4.25 4.25a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06-1.06L9.94 8 6.22 4.28a.75.75 0 010-1.06z&#34;/&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/a&gt;&#xA;  &lt;/div&gt;&#xA;&#xA;  &lt;style&gt;&#xA;  .github-card {&#xA;    margin: 1.5rem 0;&#xA;    border: 1px solid #e5e7eb;&#xA;    border-radius: 8px;&#xA;    overflow: hidden;&#xA;    background: #fff;&#xA;    transition: all 0.2s ease;&#xA;    font-family: -apple-system, BlinkMacSystemFont, &#34;Segoe UI&#34;, &#34;Noto Sans&#34;, Helvetica, Arial;&#xA;  }&#xA;&#xA;  .github-card:hover {&#xA;    border-color: #3b82f6;&#xA;    box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);&#xA;  }&#xA;&#xA;  .github-link {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    padding: 16px;&#xA;    text-decoration: none;&#xA;    color: inherit;&#xA;    gap: 12px;&#xA;  }&#xA;&#xA;  .github-icon {&#xA;    flex-shrink: 0;&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-info {&#xA;    flex: 1;&#xA;    min-width: 0;&#xA;  }&#xA;&#xA;  .github-title {&#xA;    font-weight: 600;&#xA;    font-size: 14px;&#xA;    color: #111827;&#xA;    margin-bottom: 4px;&#xA;    word-break: break-all;&#xA;  }&#xA;&#xA;  .github-description {&#xA;    font-size: 13px;&#xA;    color: #6b7280;&#xA;    line-height: 1.4;&#xA;    margin-bottom: 8px;&#xA;    display: -webkit-box;&#xA;    -webkit-line-clamp: 2;&#xA;    -webkit-box-orient: vertical;&#xA;    overflow: hidden;&#xA;  }&#xA;&#xA;  .github-meta {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 12px;&#xA;    font-size: 12px;&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-language {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 4px;&#xA;  }&#xA;&#xA;  .language-dot {&#xA;    width: 12px;&#xA;    height: 12px;&#xA;    border-radius: 50%;&#xA;    display: inline-block;&#xA;  }&#xA;&#xA;  .github-stat {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 3px;&#xA;  }&#xA;&#xA;  .github-stat svg {&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-arrow {&#xA;    flex-shrink: 0;&#xA;    color: #9ca3af;&#xA;    transition: transform 0.2s ease;&#xA;  }&#xA;&#xA;  .github-link:hover .github-arrow {&#xA;    transform: translateX(2px);&#xA;  }&#xA;&#xA;  @media (prefers-color-scheme: dark) {&#xA;    .github-card {&#xA;      background: #1f2937;&#xA;      border-color: #374151;&#xA;    }&#xA;&#xA;    .github-title {&#xA;      color: #f9fafb;&#xA;    }&#xA;&#xA;    .github-description,&#xA;    .github-meta {&#xA;      color: #d1d5db;&#xA;    }&#xA;&#xA;    .github-icon {&#xA;      color: #9ca3af;&#xA;    }&#xA;&#xA;    .github-stat svg {&#xA;      color: #9ca3af;&#xA;    }&#xA;  }&#xA;  &lt;/style&gt;&#xA;&#xA;  &lt;script&gt;&#xA;  (function() {&#xA;    const languageColors = {&#xA;      &#39;Go&#39;: &#39;#00ADD8&#39;,&#xA;      &#39;JavaScript&#39;: &#39;#f1e05a&#39;,&#xA;      &#39;TypeScript&#39;: &#39;#2b7489&#39;,&#xA;      &#39;Python&#39;: &#39;#3572a5&#39;,&#xA;      &#39;Java&#39;: &#39;#b07219&#39;,&#xA;      &#39;C&#39;: &#39;#555555&#39;,&#xA;      &#39;C++&#39;: &#39;#f34b7d&#39;,&#xA;      &#39;Rust&#39;: &#39;#dea584&#39;,&#xA;      &#39;Ruby&#39;: &#39;#701516&#39;,&#xA;      &#39;PHP&#39;: &#39;#4f5d95&#39;,&#xA;      &#39;Swift&#39;: &#39;#ffac45&#39;,&#xA;      &#39;Kotlin&#39;: &#39;#F18E33&#39;,&#xA;      &#39;Shell&#39;: &#39;#89e051&#39;,&#xA;      &#39;HTML&#39;: &#39;#e34c26&#39;,&#xA;      &#39;CSS&#39;: &#39;#1572B6&#39;&#xA;    };&#xA;&#xA;    const cards = document.querySelectorAll(&#39;.github-card&#39;);&#xA;&#xA;    cards.forEach(async (card) =&gt; {&#xA;      const repo = card.dataset.repo;&#xA;      if (!repo) return;&#xA;&#xA;      try {&#xA;        const response = await fetch(`https://api.github.com/repos/${repo}`);&#xA;        if (!response.ok) throw new Error(&#39;API request failed&#39;);&#xA;&#xA;        const data = await response.json();&#xA;&#xA;        &#xA;        const autoDescription = card.querySelector(&#39;.github-auto-description&#39;);&#xA;        if (autoDescription) {&#xA;          if (data.description) {&#xA;            autoDescription.textContent = data.description;&#xA;          } else {&#xA;            autoDescription.style.display = &#39;none&#39;;&#xA;          }&#xA;        }&#xA;&#xA;        &#xA;        const languageElement = card.querySelector(&#39;.github-language&#39;);&#xA;        const languageDot = card.querySelector(&#39;.language-dot&#39;);&#xA;        const languageName = card.querySelector(&#39;.language-name&#39;);&#xA;&#xA;        if (data.language) {&#xA;          languageName.textContent = data.language;&#xA;          languageDot.style.backgroundColor = languageColors[data.language] || &#39;#586069&#39;;&#xA;          languageElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;        &#xA;        const starsElement = card.querySelector(&#39;.github-stars&#39;);&#xA;        const starsCount = card.querySelector(&#39;.stars-count&#39;);&#xA;        if (data.stargazers_count !== undefined) {&#xA;          starsCount.textContent = data.stargazers_count.toLocaleString();&#xA;          starsElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;        &#xA;        const forksElement = card.querySelector(&#39;.github-forks&#39;);&#xA;        const forksCount = card.querySelector(&#39;.forks-count&#39;);&#xA;        if (data.forks_count !== undefined) {&#xA;          forksCount.textContent = data.forks_count.toLocaleString();&#xA;          forksElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;      } catch (error) {&#xA;        console.error(&#39;Error fetching GitHub data:&#39;, error);&#xA;        &#xA;        const autoDescription = card.querySelector(&#39;.github-auto-description&#39;);&#xA;        if (autoDescription) {&#xA;          autoDescription.style.display = &#39;none&#39;;&#xA;        }&#xA;      }&#xA;    });&#xA;  })();&#xA;  &lt;/script&gt;</description>
    </item>
    <item>
      <title>Goのcilium/ebpfでXdpcapを使う</title>
      <link>https://blog.terassyi.net/posts/use-xdpcap/</link>
      <pubDate>Thu, 07 Oct 2021 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/use-xdpcap/</guid>
      <description>&lt;p&gt;こんにちは．学生生活も後少しとなってしまいました．悲しいです．&#xA;今回はxdpcapというツールについてです．xdpcapの使用に関する資料が日本語では非常に少なかったので使い方を紹介します．&lt;/p&gt;</description>
    </item>
    <item>
      <title>KLab Expert Camp TCP/IPプロトコルスタック自作開発キャンプに参加してきました．</title>
      <link>https://blog.terassyi.net/posts/klab-expert-camp/</link>
      <pubDate>Sat, 13 Mar 2021 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/klab-expert-camp/</guid>
      <description>&lt;p&gt;こんにちは．趣味の将棋がなかなか強くならなくて困ってます．勉強せずにすぐ対局してしまうのがダメなのはわかってますがつい対局してしまいます．&#xA;今回はKLab Expert Campに参加してTCP/IPプロトコルスタック自作に挑戦しました．&lt;/p&gt;</description>
    </item>
    <item>
      <title>SoftEther VPN Server APIのGo版を作った</title>
      <link>https://blog.terassyi.net/posts/softether-api/</link>
      <pubDate>Wed, 15 Jul 2020 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/softether-api/</guid>
      <description>&lt;p&gt;こんにちは．最近は学校の課題や事務手続きやらインターンどうしようかやらで非常に忙しいです．それに加えてSecHack365に参加することとなりこれはうれしい悲鳴ですがさらに忙しいです．(嬉しい)&#xA;さて今回はSoftEtherについてです．学生などにはあまり馴染みがなさげなソフトですが，僕は研究でこのソフトに非常にお世話になっております．このソフトウェアはとてもすごいんですが，マネージャーソフトがwindows用しかなくてCUIベースの操作が大変なのでWebベースのマネージャーを作ろうと思い立ちました．そこでまずGo言語でAPIのラッパーを作成しました．&lt;/p&gt;</description>
    </item>
    <item>
      <title>自作コンテナランタイムでつまずいてる話</title>
      <link>https://blog.terassyi.net/posts/container/</link>
      <pubDate>Fri, 08 May 2020 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/container/</guid>
      <description>&lt;p&gt;こんにちは．緊急事態宣言がのびたので相変わらずの外出自粛中です．最近は外出自粛にも少し慣れましたがやはり退屈です．僕は作業中のBGMとして何度か見たことのあるアニメなどを流しているんですがそれらのストックも無くなってきています．ループしようかな．ちなみにおすすめはガンダムUCですね．音楽が素晴らしいですし，SFアニメはモチベが上がっていいです．&#xA;さて，今回は自作コンテナランタイムに挑戦したという話です．&lt;a href=&#34;https://terassyi.net/posts/2020/04/29/runc.html&#34;&gt;前回のポスト&lt;/a&gt;では&lt;code&gt;runc&lt;/code&gt;を使ってみましたが，今回は&lt;code&gt;runc&lt;/code&gt;を参考に挑戦してみました．&lt;/p&gt;&#xA;&lt;p&gt;ちなみにコード書いて試してたときに&lt;code&gt;rm -rf&lt;/code&gt;で書いてたコード全消去して萎えました．&#xA;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;間違えてrm -rf /[project]やって書いてたソース全部消失したくっそ萎えた&lt;/p&gt;&amp;mdash; terassyi (@terassyi_) &lt;a href=&#34;https://twitter.com/terassyi_/status/1256486345381261313?ref_src=twsrc%5Etfw&#34;&gt;May 2, 2020&lt;/a&gt;&lt;/blockquote&gt;&#xA;&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&#xA;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;gitで管理するのって大事ですね．&#xA;リポジトリはこちら&lt;/p&gt;&#xA;&lt;div class=&#34;github-card&#34; data-repo=&#34;terassyi/mycon&#34;&gt;&#xA;    &lt;a href=&#34;https://github.com/terassyi/mycon&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&#xA;      &lt;div class=&#34;github-icon&#34;&gt;&#xA;        &lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;          &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.03 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z&#34;/&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;div class=&#34;github-info&#34;&gt;&#xA;        &lt;div class=&#34;github-title&#34;&gt;terassyi/mycon&lt;/div&gt;&#xA;        &#xA;        &lt;div class=&#34;github-description github-auto-description&#34;&gt;Loading...&lt;/div&gt;&#xA;        &#xA;        &lt;div class=&#34;github-meta&#34;&gt;&#xA;          &lt;span class=&#34;github-language&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;span class=&#34;language-dot&#34;&gt;&lt;/span&gt;&#xA;            &lt;span class=&#34;language-name&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;github-stat github-stars&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;svg width=&#34;14&#34; height=&#34;14&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;              &lt;path d=&#34;M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z&#34;/&gt;&#xA;            &lt;/svg&gt;&#xA;            &lt;span class=&#34;stars-count&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;github-stat github-forks&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;svg width=&#34;14&#34; height=&#34;14&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;              &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.25 2.25 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878z&#34;/&gt;&#xA;            &lt;/svg&gt;&#xA;            &lt;span class=&#34;forks-count&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;div class=&#34;github-arrow&#34;&gt;&#xA;        &lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;          &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M6.22 3.22a.75.75 0 011.06 0l4.25 4.25a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06-1.06L9.94 8 6.22 4.28a.75.75 0 010-1.06z&#34;/&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/a&gt;&#xA;  &lt;/div&gt;&#xA;&#xA;  &lt;style&gt;&#xA;  .github-card {&#xA;    margin: 1.5rem 0;&#xA;    border: 1px solid #e5e7eb;&#xA;    border-radius: 8px;&#xA;    overflow: hidden;&#xA;    background: #fff;&#xA;    transition: all 0.2s ease;&#xA;    font-family: -apple-system, BlinkMacSystemFont, &#34;Segoe UI&#34;, &#34;Noto Sans&#34;, Helvetica, Arial;&#xA;  }&#xA;&#xA;  .github-card:hover {&#xA;    border-color: #3b82f6;&#xA;    box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);&#xA;  }&#xA;&#xA;  .github-link {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    padding: 16px;&#xA;    text-decoration: none;&#xA;    color: inherit;&#xA;    gap: 12px;&#xA;  }&#xA;&#xA;  .github-icon {&#xA;    flex-shrink: 0;&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-info {&#xA;    flex: 1;&#xA;    min-width: 0;&#xA;  }&#xA;&#xA;  .github-title {&#xA;    font-weight: 600;&#xA;    font-size: 14px;&#xA;    color: #111827;&#xA;    margin-bottom: 4px;&#xA;    word-break: break-all;&#xA;  }&#xA;&#xA;  .github-description {&#xA;    font-size: 13px;&#xA;    color: #6b7280;&#xA;    line-height: 1.4;&#xA;    margin-bottom: 8px;&#xA;    display: -webkit-box;&#xA;    -webkit-line-clamp: 2;&#xA;    -webkit-box-orient: vertical;&#xA;    overflow: hidden;&#xA;  }&#xA;&#xA;  .github-meta {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 12px;&#xA;    font-size: 12px;&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-language {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 4px;&#xA;  }&#xA;&#xA;  .language-dot {&#xA;    width: 12px;&#xA;    height: 12px;&#xA;    border-radius: 50%;&#xA;    display: inline-block;&#xA;  }&#xA;&#xA;  .github-stat {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 3px;&#xA;  }&#xA;&#xA;  .github-stat svg {&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-arrow {&#xA;    flex-shrink: 0;&#xA;    color: #9ca3af;&#xA;    transition: transform 0.2s ease;&#xA;  }&#xA;&#xA;  .github-link:hover .github-arrow {&#xA;    transform: translateX(2px);&#xA;  }&#xA;&#xA;  @media (prefers-color-scheme: dark) {&#xA;    .github-card {&#xA;      background: #1f2937;&#xA;      border-color: #374151;&#xA;    }&#xA;&#xA;    .github-title {&#xA;      color: #f9fafb;&#xA;    }&#xA;&#xA;    .github-description,&#xA;    .github-meta {&#xA;      color: #d1d5db;&#xA;    }&#xA;&#xA;    .github-icon {&#xA;      color: #9ca3af;&#xA;    }&#xA;&#xA;    .github-stat svg {&#xA;      color: #9ca3af;&#xA;    }&#xA;  }&#xA;  &lt;/style&gt;&#xA;&#xA;  &lt;script&gt;&#xA;  (function() {&#xA;    const languageColors = {&#xA;      &#39;Go&#39;: &#39;#00ADD8&#39;,&#xA;      &#39;JavaScript&#39;: &#39;#f1e05a&#39;,&#xA;      &#39;TypeScript&#39;: &#39;#2b7489&#39;,&#xA;      &#39;Python&#39;: &#39;#3572a5&#39;,&#xA;      &#39;Java&#39;: &#39;#b07219&#39;,&#xA;      &#39;C&#39;: &#39;#555555&#39;,&#xA;      &#39;C++&#39;: &#39;#f34b7d&#39;,&#xA;      &#39;Rust&#39;: &#39;#dea584&#39;,&#xA;      &#39;Ruby&#39;: &#39;#701516&#39;,&#xA;      &#39;PHP&#39;: &#39;#4f5d95&#39;,&#xA;      &#39;Swift&#39;: &#39;#ffac45&#39;,&#xA;      &#39;Kotlin&#39;: &#39;#F18E33&#39;,&#xA;      &#39;Shell&#39;: &#39;#89e051&#39;,&#xA;      &#39;HTML&#39;: &#39;#e34c26&#39;,&#xA;      &#39;CSS&#39;: &#39;#1572B6&#39;&#xA;    };&#xA;&#xA;    const cards = document.querySelectorAll(&#39;.github-card&#39;);&#xA;&#xA;    cards.forEach(async (card) =&gt; {&#xA;      const repo = card.dataset.repo;&#xA;      if (!repo) return;&#xA;&#xA;      try {&#xA;        const response = await fetch(`https://api.github.com/repos/${repo}`);&#xA;        if (!response.ok) throw new Error(&#39;API request failed&#39;);&#xA;&#xA;        const data = await response.json();&#xA;&#xA;        &#xA;        const autoDescription = card.querySelector(&#39;.github-auto-description&#39;);&#xA;        if (autoDescription) {&#xA;          if (data.description) {&#xA;            autoDescription.textContent = data.description;&#xA;          } else {&#xA;            autoDescription.style.display = &#39;none&#39;;&#xA;          }&#xA;        }&#xA;&#xA;        &#xA;        const languageElement = card.querySelector(&#39;.github-language&#39;);&#xA;        const languageDot = card.querySelector(&#39;.language-dot&#39;);&#xA;        const languageName = card.querySelector(&#39;.language-name&#39;);&#xA;&#xA;        if (data.language) {&#xA;          languageName.textContent = data.language;&#xA;          languageDot.style.backgroundColor = languageColors[data.language] || &#39;#586069&#39;;&#xA;          languageElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;        &#xA;        const starsElement = card.querySelector(&#39;.github-stars&#39;);&#xA;        const starsCount = card.querySelector(&#39;.stars-count&#39;);&#xA;        if (data.stargazers_count !== undefined) {&#xA;          starsCount.textContent = data.stargazers_count.toLocaleString();&#xA;          starsElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;        &#xA;        const forksElement = card.querySelector(&#39;.github-forks&#39;);&#xA;        const forksCount = card.querySelector(&#39;.forks-count&#39;);&#xA;        if (data.forks_count !== undefined) {&#xA;          forksCount.textContent = data.forks_count.toLocaleString();&#xA;          forksElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;      } catch (error) {&#xA;        console.error(&#39;Error fetching GitHub data:&#39;, error);&#xA;        &#xA;        const autoDescription = card.querySelector(&#39;.github-auto-description&#39;);&#xA;        if (autoDescription) {&#xA;          autoDescription.style.display = &#39;none&#39;;&#xA;        }&#xA;      }&#xA;    });&#xA;  })();&#xA;  &lt;/script&gt;&#xA;&#xA;&lt;h2 id=&#34;タイトルについて&#34;&gt;タイトルについて&lt;/h2&gt;&#xA;&lt;p&gt;タイトルにつまずいているとつけましたが，つまずいてます．長い間同じ箇所でエラーがでて前に進めていません．&#xA;僕の魂の叫びがこちら．&lt;/p&gt;</description>
    </item>
    <item>
      <title>runcを使ってみる</title>
      <link>https://blog.terassyi.net/posts/runc/</link>
      <pubDate>Wed, 29 Apr 2020 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/runc/</guid>
      <description>&lt;p&gt;こんにちは．前回のポストからだいぶ時間が空きましたが，相変わらず緊急事態宣言中で自宅待機なので時間を持て余しています．&#xA;ONE PIECEを読み返していたんですが，無料で読める分を読み終わってしまったので暇です．&#xA;今回はdockerに使用されているコンテナランタイムである&lt;code&gt;runc&lt;/code&gt;を使ってみました．&#xA;では，いきます．&lt;/p&gt;</description>
    </item>
    <item>
      <title>セキュアなコンテナgVisor</title>
      <link>https://blog.terassyi.net/posts/gvisor/</link>
      <pubDate>Tue, 14 Apr 2020 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/gvisor/</guid>
      <description>&lt;p&gt;こんにちは．緊急事態宣言が出ているため相変わらず外出ができません．早く収束して欲しいものです．&#xA;今回はdocker関連の話題についてです．Googleが開発したgVisorというコンテナランタイムについて調べてみました．&lt;/p&gt;&#xA;&lt;h1 id=&#34;gvisor&#34;&gt;gVisor&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://gvisor.dev/&#34;&gt;gvisor.dev&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;github-card&#34; data-repo=&#34;google/gvisor&#34;&gt;&#xA;    &lt;a href=&#34;https://github.com/google/gvisor&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34; class=&#34;github-link&#34;&gt;&#xA;      &lt;div class=&#34;github-icon&#34;&gt;&#xA;        &lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;          &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.03 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z&#34;/&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;div class=&#34;github-info&#34;&gt;&#xA;        &lt;div class=&#34;github-title&#34;&gt;google/gvisor&lt;/div&gt;&#xA;        &#xA;        &lt;div class=&#34;github-description github-auto-description&#34;&gt;Loading...&lt;/div&gt;&#xA;        &#xA;        &lt;div class=&#34;github-meta&#34;&gt;&#xA;          &lt;span class=&#34;github-language&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;span class=&#34;language-dot&#34;&gt;&lt;/span&gt;&#xA;            &lt;span class=&#34;language-name&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;github-stat github-stars&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;svg width=&#34;14&#34; height=&#34;14&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;              &lt;path d=&#34;M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25z&#34;/&gt;&#xA;            &lt;/svg&gt;&#xA;            &lt;span class=&#34;stars-count&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;          &lt;span class=&#34;github-stat github-forks&#34; style=&#34;display: none;&#34;&gt;&#xA;            &lt;svg width=&#34;14&#34; height=&#34;14&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;              &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M5 3.25a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm0 2.122a2.25 2.25 0 10-1.5 0v.878A2.25 2.25 0 005.75 8.5h1.5v2.128a2.25 2.25 0 101.5 0V8.5h1.5a2.25 2.25 0 002.25-2.25v-.878a2.25 2.25 0 10-1.5 0v.878a.75.75 0 01-.75.75h-4.5A.75.75 0 015 6.25v-.878z&#34;/&gt;&#xA;            &lt;/svg&gt;&#xA;            &lt;span class=&#34;forks-count&#34;&gt;&lt;/span&gt;&#xA;          &lt;/span&gt;&#xA;        &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA;      &lt;div class=&#34;github-arrow&#34;&gt;&#xA;        &lt;svg width=&#34;16&#34; height=&#34;16&#34; viewBox=&#34;0 0 16 16&#34; fill=&#34;currentColor&#34;&gt;&#xA;          &lt;path fill-rule=&#34;evenodd&#34; d=&#34;M6.22 3.22a.75.75 0 011.06 0l4.25 4.25a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06-1.06L9.94 8 6.22 4.28a.75.75 0 010-1.06z&#34;/&gt;&#xA;        &lt;/svg&gt;&#xA;      &lt;/div&gt;&#xA;    &lt;/a&gt;&#xA;  &lt;/div&gt;&#xA;&#xA;  &lt;style&gt;&#xA;  .github-card {&#xA;    margin: 1.5rem 0;&#xA;    border: 1px solid #e5e7eb;&#xA;    border-radius: 8px;&#xA;    overflow: hidden;&#xA;    background: #fff;&#xA;    transition: all 0.2s ease;&#xA;    font-family: -apple-system, BlinkMacSystemFont, &#34;Segoe UI&#34;, &#34;Noto Sans&#34;, Helvetica, Arial;&#xA;  }&#xA;&#xA;  .github-card:hover {&#xA;    border-color: #3b82f6;&#xA;    box-shadow: 0 4px 12px rgba(59, 130, 246, 0.15);&#xA;  }&#xA;&#xA;  .github-link {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    padding: 16px;&#xA;    text-decoration: none;&#xA;    color: inherit;&#xA;    gap: 12px;&#xA;  }&#xA;&#xA;  .github-icon {&#xA;    flex-shrink: 0;&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-info {&#xA;    flex: 1;&#xA;    min-width: 0;&#xA;  }&#xA;&#xA;  .github-title {&#xA;    font-weight: 600;&#xA;    font-size: 14px;&#xA;    color: #111827;&#xA;    margin-bottom: 4px;&#xA;    word-break: break-all;&#xA;  }&#xA;&#xA;  .github-description {&#xA;    font-size: 13px;&#xA;    color: #6b7280;&#xA;    line-height: 1.4;&#xA;    margin-bottom: 8px;&#xA;    display: -webkit-box;&#xA;    -webkit-line-clamp: 2;&#xA;    -webkit-box-orient: vertical;&#xA;    overflow: hidden;&#xA;  }&#xA;&#xA;  .github-meta {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 12px;&#xA;    font-size: 12px;&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-language {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 4px;&#xA;  }&#xA;&#xA;  .language-dot {&#xA;    width: 12px;&#xA;    height: 12px;&#xA;    border-radius: 50%;&#xA;    display: inline-block;&#xA;  }&#xA;&#xA;  .github-stat {&#xA;    display: flex;&#xA;    align-items: center;&#xA;    gap: 3px;&#xA;  }&#xA;&#xA;  .github-stat svg {&#xA;    color: #6b7280;&#xA;  }&#xA;&#xA;  .github-arrow {&#xA;    flex-shrink: 0;&#xA;    color: #9ca3af;&#xA;    transition: transform 0.2s ease;&#xA;  }&#xA;&#xA;  .github-link:hover .github-arrow {&#xA;    transform: translateX(2px);&#xA;  }&#xA;&#xA;  @media (prefers-color-scheme: dark) {&#xA;    .github-card {&#xA;      background: #1f2937;&#xA;      border-color: #374151;&#xA;    }&#xA;&#xA;    .github-title {&#xA;      color: #f9fafb;&#xA;    }&#xA;&#xA;    .github-description,&#xA;    .github-meta {&#xA;      color: #d1d5db;&#xA;    }&#xA;&#xA;    .github-icon {&#xA;      color: #9ca3af;&#xA;    }&#xA;&#xA;    .github-stat svg {&#xA;      color: #9ca3af;&#xA;    }&#xA;  }&#xA;  &lt;/style&gt;&#xA;&#xA;  &lt;script&gt;&#xA;  (function() {&#xA;    const languageColors = {&#xA;      &#39;Go&#39;: &#39;#00ADD8&#39;,&#xA;      &#39;JavaScript&#39;: &#39;#f1e05a&#39;,&#xA;      &#39;TypeScript&#39;: &#39;#2b7489&#39;,&#xA;      &#39;Python&#39;: &#39;#3572a5&#39;,&#xA;      &#39;Java&#39;: &#39;#b07219&#39;,&#xA;      &#39;C&#39;: &#39;#555555&#39;,&#xA;      &#39;C++&#39;: &#39;#f34b7d&#39;,&#xA;      &#39;Rust&#39;: &#39;#dea584&#39;,&#xA;      &#39;Ruby&#39;: &#39;#701516&#39;,&#xA;      &#39;PHP&#39;: &#39;#4f5d95&#39;,&#xA;      &#39;Swift&#39;: &#39;#ffac45&#39;,&#xA;      &#39;Kotlin&#39;: &#39;#F18E33&#39;,&#xA;      &#39;Shell&#39;: &#39;#89e051&#39;,&#xA;      &#39;HTML&#39;: &#39;#e34c26&#39;,&#xA;      &#39;CSS&#39;: &#39;#1572B6&#39;&#xA;    };&#xA;&#xA;    const cards = document.querySelectorAll(&#39;.github-card&#39;);&#xA;&#xA;    cards.forEach(async (card) =&gt; {&#xA;      const repo = card.dataset.repo;&#xA;      if (!repo) return;&#xA;&#xA;      try {&#xA;        const response = await fetch(`https://api.github.com/repos/${repo}`);&#xA;        if (!response.ok) throw new Error(&#39;API request failed&#39;);&#xA;&#xA;        const data = await response.json();&#xA;&#xA;        &#xA;        const autoDescription = card.querySelector(&#39;.github-auto-description&#39;);&#xA;        if (autoDescription) {&#xA;          if (data.description) {&#xA;            autoDescription.textContent = data.description;&#xA;          } else {&#xA;            autoDescription.style.display = &#39;none&#39;;&#xA;          }&#xA;        }&#xA;&#xA;        &#xA;        const languageElement = card.querySelector(&#39;.github-language&#39;);&#xA;        const languageDot = card.querySelector(&#39;.language-dot&#39;);&#xA;        const languageName = card.querySelector(&#39;.language-name&#39;);&#xA;&#xA;        if (data.language) {&#xA;          languageName.textContent = data.language;&#xA;          languageDot.style.backgroundColor = languageColors[data.language] || &#39;#586069&#39;;&#xA;          languageElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;        &#xA;        const starsElement = card.querySelector(&#39;.github-stars&#39;);&#xA;        const starsCount = card.querySelector(&#39;.stars-count&#39;);&#xA;        if (data.stargazers_count !== undefined) {&#xA;          starsCount.textContent = data.stargazers_count.toLocaleString();&#xA;          starsElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;        &#xA;        const forksElement = card.querySelector(&#39;.github-forks&#39;);&#xA;        const forksCount = card.querySelector(&#39;.forks-count&#39;);&#xA;        if (data.forks_count !== undefined) {&#xA;          forksCount.textContent = data.forks_count.toLocaleString();&#xA;          forksElement.style.display = &#39;flex&#39;;&#xA;        }&#xA;&#xA;      } catch (error) {&#xA;        console.error(&#39;Error fetching GitHub data:&#39;, error);&#xA;        &#xA;        const autoDescription = card.querySelector(&#39;.github-auto-description&#39;);&#xA;        if (autoDescription) {&#xA;          autoDescription.style.display = &#39;none&#39;;&#xA;        }&#xA;      }&#xA;    });&#xA;  })();&#xA;  &lt;/script&gt;&#xA;&#xA;&lt;h2 id=&#34;documentを意訳&#34;&gt;Documentを意訳&lt;/h2&gt;&#xA;&lt;p&gt;gVisorとはGo言語で実装されたユーザー空間カーネルです．ほとんどのLinuxシステムコールインターフェースを実装しており，ホストOSと起動しているアプリケーションとの間に隔離層を設けることで安全性を実現しています．&#xA;gVisorには&lt;code&gt;runsc&lt;/code&gt;というOCI仕様に準拠したコンテナランタイムを含んでいます．&lt;code&gt;runsc&lt;/code&gt;はDockerやKubernetesで使用でき，簡単にサンドボックス化されたコンテナを実行できます．&#xA;gVisorは既存のサンドボックス化ツールと異なるアプローチを用いています．&lt;/p&gt;</description>
    </item>
    <item>
      <title>ネットワークを作って理解しようとする(ARP編)</title>
      <link>https://blog.terassyi.net/posts/arp/</link>
      <pubDate>Wed, 01 Apr 2020 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/arp/</guid>
      <description>&lt;p&gt;こんにちは．&#xA;新型コロナの影響で外出を控えているのですが，ずっと自宅にいるのも結構しんどいですね．&#xA;この前見始めた鬼滅の刃ももう見終わってしまいました．続きが気になります．&#xA;さて，今回もネットワークシリーズです．&lt;/p&gt;&#xA;&lt;h2 id=&#34;ネットワークを作って理解する&#34;&gt;ネットワークを作って理解する&lt;/h2&gt;&#xA;&lt;p&gt;ネットワークの仕組みを理解するためには作ってみるのが一番ということでプロトコルスタックを自作してみます．&#xA;前回はEthernetを実装してみました．&lt;a href=&#34;https://terassyi.net/posts/2020/03/29/ethernet.html&#34;&gt;前回のポストはこちら&lt;/a&gt;&#xA;今回はデータリンク層のアドレスとネットワーク層のアドレスを解決するARPを実装してみたいと思います．使用言語はgolangです．&lt;/p&gt;</description>
    </item>
    <item>
      <title>ネットワークを作って理解しようとする(Ethernet編)</title>
      <link>https://blog.terassyi.net/posts/ethernet/</link>
      <pubDate>Sun, 29 Mar 2020 00:00:00 +0000</pubDate><author>iscale821@gmail.com (terassyi)</author>
      <guid>https://blog.terassyi.net/posts/ethernet/</guid>
      <description>&lt;p&gt;こんにちは．&#xA;今週末は新型コロナの影響で外出自粛なので暇を持て余しております．&#xA;暇なのでNetflixで鬼滅の刃を見始めました．面白いですね〜．&lt;/p&gt;&#xA;&lt;h2 id=&#34;ネットワークを作って理解する&#34;&gt;ネットワークを作って理解する&lt;/h2&gt;&#xA;&lt;p&gt;最近の興味としてネットワークの仕組みを理解したいというのがあり，プロトコルスタック自作なるものを知りました．とはいえ僕はC言語が得意でないのでGo言語で作ってみようと思い作成を始めました．というわけて何回かに分けて紹介したいと思います．&lt;/p&gt;&#xA;&lt;h2 id=&#34;osi参照モデル&#34;&gt;OSI参照モデル&lt;/h2&gt;&#xA;&lt;p&gt;OSI参照モデルとはコンピュータの通信機能を階層構造に分割したモデルです．&#xA;各階層にはそれぞれが担うべき機能が定義されています．&#xA;データリンク層では隣接するノード間のデータの通信をサポートします．&#xA;&lt;img src=&#34;https://blog.terassyi.net/img/osi-model.png&#34; alt=&#34;osi-model&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;開発環境&#34;&gt;開発環境&lt;/h2&gt;&#xA;&lt;p&gt;開発環境は以下の通りです．&lt;code&gt;ioctl&lt;/code&gt;などのシステムコールを扱うためprivilegeオプションを有効にしたLinuxコンテナを作成してプログラムをビルドします．&#xA;また，実行はコンテナの中でネットワーク名前空間を分離して行います．&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mac OS Catalina&lt;/li&gt;&#xA;&lt;li&gt;VSCode&lt;/li&gt;&#xA;&lt;li&gt;Docker version 19.03.5, build 633a0ea&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;実装&#34;&gt;実装&lt;/h2&gt;&#xA;&lt;p&gt;リポジトリは&lt;a href=&#34;https://github.com/terassyi/proto&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;物理層からデータを受け取る&#34;&gt;物理層からデータを受け取る&lt;/h3&gt;&#xA;&lt;p&gt;今回のプログラムでは生のパケットを受け取る必要があります．golangの標準パッケージでは生のパケットを扱うことができないため別の方法で生のパケットを取得しなければいけません．そこで今回のプログラムでは以下の二つの方法で生のパケットを取得します．&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;PF_PACKET&lt;/li&gt;&#xA;&lt;li&gt;Tun/Tapデバイス&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h4 id=&#34;pf_packet&#34;&gt;PF_PACKET&lt;/h4&gt;&#xA;&lt;p&gt;PF_PACKETはLinuxのsocketシステムコールで生のパケットを扱うためのドメインです．syscallパッケージのSocket関数を用いて以下のようにソケットを開きます．&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;protocol&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;hton16&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;syscall&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ETH_P_ALL&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:#a6e22e&#34;&gt;fd&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;syscall&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Socket&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;syscall&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;AF_PACKET&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;syscall&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;SOCK_RAW&lt;/span&gt;, int(&lt;span style=&#34;color:#a6e22e&#34;&gt;protocol&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:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&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:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&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;開いたソケットを用いてPFPacket構造体を定義します．&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;PFPacket&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;fd&lt;/span&gt;                 &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;               &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;address&lt;/span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;ethernet&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;HardwareAddress&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;netInfo&lt;/span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;ip&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;IPSubnetMask&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;registeredProtocol&lt;/span&gt; []&lt;span style=&#34;color:#a6e22e&#34;&gt;LinkNetProtocol&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;MTU&lt;/span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer&lt;/span&gt;             &lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ethernet&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;EthernetFrame&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;h4 id=&#34;tuntap&#34;&gt;Tun/Tap&lt;/h4&gt;&#xA;&lt;p&gt;Tun/TapはUnixで使用できる仮想ネットワークデバイスです．Tun/Tapデバイスに届いたパケットは直接ユーザープログラムに送られます．&#xA;Tun/Tapデバイスは以下のように開きます．&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;const&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;device&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/dev/net/tun&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:#a6e22e&#34;&gt;file&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;OpenFile&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;device&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;os&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;O_RDWR&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;0600&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&#x9;&lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#66d9ef&#34;&gt;nil&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;err&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;開いたファイルを用いてTun構造体を定義します．&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Tun&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;struct&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;file&lt;/span&gt;               &lt;span style=&#34;color:#a6e22e&#34;&gt;io&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;ReadWriteCloser&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;name&lt;/span&gt;               &lt;span style=&#34;color:#66d9ef&#34;&gt;string&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;address&lt;/span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;ethernet&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;HardwareAddress&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;netInfo&lt;/span&gt;            &lt;span style=&#34;color:#a6e22e&#34;&gt;ip&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;IPSubnetMask&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;registeredProtocol&lt;/span&gt; []&lt;span style=&#34;color:#a6e22e&#34;&gt;LinkNetProtocol&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;MTU&lt;/span&gt;                &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#x9;&lt;span style=&#34;color:#a6e22e&#34;&gt;buffer&lt;/span&gt;             &lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;ethernet&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;EthernetFrame&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;h4 id=&#34;deviceインターフェース&#34;&gt;Deviceインターフェース&lt;/h4&gt;&#xA;&lt;p&gt;DeviceインターフェースでPF_PACKETとTunデバイスの差を吸収します．&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
