<?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>Posts on Ingenboy.inc</title>
    <link>https://blog.ingenboy.com/post/</link>
    <description>Recent content in Posts on Ingenboy.inc</description>
    <image>
      <title>Ingenboy.inc</title>
      <url>https://blog.ingenboy.com/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://blog.ingenboy.com/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.152.2</generator>
    <language>en</language>
    <lastBuildDate>Wed, 18 Mar 2026 18:29:06 +0900</lastBuildDate>
    <atom:link href="https://blog.ingenboy.com/post/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Openclaw</title>
      <link>https://blog.ingenboy.com/post/openclaw/</link>
      <pubDate>Wed, 18 Mar 2026 18:29:06 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/openclaw/</guid>
      <description>&lt;h1 id=&#34;openclawで業務を全てを自動化する&#34;&gt;openclawで業務を全てを自動化する。&lt;/h1&gt;
&lt;p&gt;最終的にやりたいこと。
人間がやっていることをopenclawにやらせる。
予約管理システムがある。
gmailもある。
そして、運用ポリシーもある。（マニュアルはまだない）
つまり、人間に仕事をやらせる準備はできているのです。&lt;/p&gt;
&lt;p&gt;その辺をslackからopenclawに指示するだけで全部やってくれるようにしたい。
正直、これはかなり未来を感じています。
事務職が淘汰されると言われて久しいが、それを実感してしまった。&lt;/p&gt;
&lt;h1 id=&#34;codexやclaudeではダメなのか&#34;&gt;codexやclaudeではダメなのか？&lt;/h1&gt;
&lt;p&gt;これら二つのAIエージェントは、デーモンプロセスでない。
一方で、openclawはデーモンプロセス。常駐しており、マジで自律的に動くAIエージェント。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;OpenClaw
→ 常駐してタスク実行・監視・通知までやる“運用AI”
→ SlackやLINE感覚で指示できる

Claude Code
→ 大規模コードを理解して設計・改善してくれる“頭脳担当”

Codex
→ コード生成・実行・CIまでサクサクやる“作業担当”
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;一言で言うと&#34;&gt;一言で言うと&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;OpenClaw：「動くAI秘書（常駐エージェント）」
Claude Code：「考えてくれるシニアエンジニア」
Codex：「手を動かす高速コーダー」
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;と言うことなので、マジで自律的に動くAIエージェントです。
slack経由で質問して、なんでも答えてくれるようになったら、これほど便利なものはないと思っている。
定期実行もしてくれるし、何かをトリガーにして実行もしてくれる。
なんでも相談できる。どんなシステムでも、しっかりAPIを設計して、openclawと繋げることで、slack経由で非常に便利なものができると思っている。
これは、もう本当にすごいことだと思います。&lt;/p&gt;
&lt;h1 id=&#34;アーキテクチャ&#34;&gt;アーキテクチャ&lt;/h1&gt;
&lt;p&gt;slack -&amp;gt; openclaw(local net) -&amp;gt; LLM(ollama) -&amp;gt; (openclaw) -&amp;gt; gmail, system API
みたいな流れでデータと処理が走る。&lt;/p&gt;
&lt;h1 id=&#34;ollama用のopenclawをインストール&#34;&gt;ollama用のopenclawをインストール&lt;/h1&gt;
&lt;h2 id=&#34;最初にnodeをインストール&#34;&gt;最初にnodeをインストール&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install --lts
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;openclawをインストール&#34;&gt;openclawをインストール&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ray@kami:~$ ollama launch openclaw

Installing OpenClaw...
npm warn deprecated node-domexception@1.0.0: Use your platform&amp;#39;s native DOMException instead

added 540 packages in 14s

89 packages are looking for funding
  run `npm fund` for details
npm notice
npm notice New minor version of npm available! 11.9.0 -&amp;gt; 11.11.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v11.11.1
npm notice To update run: npm install -g npm@11.11.1
npm notice
OpenClaw installed successfully

Select models for OpenClaw: Type to filter...                                   
                                                                                
  Recommended                                                                   
  ▸ glm-4.7-flash                                                               
      Reasoning and code generation locally, ~25GB, (not downloaded)            
    qwen3.5                                                                     
      Reasoning, coding, and visual understanding locally, ~11GB, (not downloade
    kimi-k2.5:cloud                                                             
      Multimodal reasoning with subagents                                       
    qwen3.5:cloud                                                               
      Reasoning, coding, and agentic tool use with vision                       
    glm-5:cloud                                                                 
      Reasoning and code generation                                             
    minimax-m2.5:cloud                                                          
      Fast, efficient coding and real-world productivity                        
                                                                                
  More                                                                          
    deepseek-r1:32b                                                             
    gemma3:27b                                                                  
    gpt-oss:20b                                                                 
    mixtral:8x7b                                                                
      ... and 3 more                                                            

              
Download glm-4.7-flash?                  
                                         
   Yes    No                             
                                         
←/→ navigate • enter confirm • esc cancel

           
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;glm-4.7-flashがおすすめのようなので、これを使うことにした。ちなみになんだこれ。&lt;/p&gt;</description>
    </item>
    <item>
      <title>MCPサーバ作る</title>
      <link>https://blog.ingenboy.com/post/create_mcp_server/</link>
      <pubDate>Sat, 14 Mar 2026 11:28:01 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/create_mcp_server/</guid>
      <description>&lt;h1 id=&#34;もう避けては通れない&#34;&gt;もう避けては通れない&lt;/h1&gt;
&lt;p&gt;MCPサーバを作って既存のシステムと連携させようって流れが顕著すぎるよね。
まあ、簡単に言うと、MCPサーバは既存のAPIの前に立ち、AIとのAPIを繋ぐ架け橋になるってわけだよね。
これ、って概念は簡単にわかるんだけど、やっぱり実物を作ってみないとわからんと言うことでね。
作ってみようと思います！&lt;/p&gt;
&lt;h1&gt;&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Vaultwardenを導入したので、安全性について評価する</title>
      <link>https://blog.ingenboy.com/post/vaultwarden/</link>
      <pubDate>Mon, 24 Nov 2025 19:00:30 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vaultwarden/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;いや、ちょっとこれも恥ずかしい話なんですがね。
僕は長いこと、「自作パスワード管理システム」的なものを運用していました。&lt;/p&gt;
&lt;p&gt;どうやっていたかというと、
自前ホストしているRocket.Chat に、自分専用のチャンネルをひっそり立てて、
誰も入れないように鍵をかけて、
そのスレッドに “ログイン情報をラベル付きで投稿する” という、
ある意味 究極のアナログ DX をやっていたわけです。&lt;/p&gt;
&lt;p&gt;もちろん一応、安全面は全く考えてなかったわけではなくて、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rocket.Chat のデータは gocryptfs で暗号化されたストレージに保存&lt;/li&gt;
&lt;li&gt;通信経路は https で暗号化&lt;/li&gt;
&lt;li&gt;サーバは自分の管理下&lt;/li&gt;
&lt;li&gt;チャンネルは自分しかアクセスできない&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;と、一応「最低限の安全性」は確保しているつもりでした。
だけど、世の中ではみんな LastPass だの 1Password だの Bitwarden だのと言っているじゃないですか。
僕はこういう “流行り物” に疎いところがちょっとあって、
「パスワード管理ツールって本当に必要？」 と長年スルーしていたんですよね。
そんなとき、エンジニアの先輩から
「Bitwarden の OSS クローンで Vaultwarden っていうのがあって、自前ホストも簡単で、めっちゃ良いよ」
とすすめられました。&lt;/p&gt;
&lt;p&gt;で、触ってみたら、UI も綺麗だし、ストレージ管理もラクだし、
正直「これはかなりイケてるな」と感じたわけです。&lt;/p&gt;
&lt;p&gt;しかし、ここから僕の悪い癖が発動します。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“仕組みが分かっていないものに重要な情報を預けるのが嫌”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;これは性格なんですが、
ブラックボックスは信用できない。
暗号化の仕組みがわからないと不安になる。&lt;/p&gt;
&lt;p&gt;果たして、
自前のサーバ（しかもレンタル）に Vaultwarden を置いて、
そこに人生の全パスワードをぶち込んで大丈夫なのか？
という疑念がどうしても消えない。&lt;/p&gt;
&lt;p&gt;結論から言うと：
&lt;strong&gt;Vaultwarden（Bitwarden）は、むしろ「Rocket.Chatにパスワードを書いてた頃の比じゃないほど安全」だった。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;調べれば調べるほど「これは信頼できる暗号設計だな」と感じたので、
今回はその 安全性の仕組み をブログとしてまとめたいと思う。&lt;/p&gt;
&lt;h1 id=&#34;安全性の評価&#34;&gt;安全性の評価&lt;/h1&gt;
&lt;p&gt;Bitwarden / Vaultwarden が扱う暗号モデルは、
いわゆる ゼロ知識暗号（Zero-Knowledge Encryption） である。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Return_path_memo</title>
      <link>https://blog.ingenboy.com/post/return_path_memo/</link>
      <pubDate>Mon, 10 Nov 2025 09:28:05 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/return_path_memo/</guid>
      <description>&lt;p&gt;いつもnatの設定を忘れてしまうのでここに残しておきたい&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ss@kong:~$ sudo sysctl -w net.ipv4.ip_forward=1 &amp;amp;&amp;amp; \
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.10.0/24 -o enp9s0 -j MASQUERADE &amp;amp;&amp;amp; \
sudo iptables -A FORWARD -i tun0 -o enp9s0 -s 10.8.0.0/24 -d 192.168.10.0/24 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT &amp;amp;&amp;amp; \
sudo iptables -A FORWARD -i enp9s0 -o tun0 -s 192.168.10.0/24 -d 10.8.0.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;backupのトンネルの方はこっち&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rr@kong:~$ sudo sysctl -w net.ipv4.ip_forward=1 &amp;amp;&amp;amp; sudo iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -d 192.168.10.0/24 -o enp9s0 -j MASQUERADE &amp;amp;&amp;amp; sudo iptables -A FORWARD -i tun1 -o enp9s0 -s 10.10.0.0/24 -d 192.168.10.0/24 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT &amp;amp;&amp;amp; sudo iptables -A FORWARD -i enp9s0 -o tun1 -s 192.168.10.0/24 -d 10.10.0.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT
net.ipv4.ip_forward = 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これ、一応意味書いておくか。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sre_google</title>
      <link>https://blog.ingenboy.com/post/sre_google/</link>
      <pubDate>Sun, 09 Nov 2025 10:43:14 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/sre_google/</guid>
      <description>&lt;h1 id=&#34;sre本を読んでいく&#34;&gt;SRE本を読んでいく&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://sre.google/sre-book/table-of-contents/&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>OpenVPNとFRR(OSPF)を組み合わせた多拠点VPNルーティングの限界と学び</title>
      <link>https://blog.ingenboy.com/post/frr_x_openvpn/</link>
      <pubDate>Thu, 09 Oct 2025 20:14:06 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/frr_x_openvpn/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;複数拠点（A, B, Cなど）を OpenVPN 経由で接続し、
**2系統のVPNトンネル（10.8.0.0/24 と 10.10.0.0/24）**を経由して経路冗長化したい。（openvpnサーバは独立した2マシン）
そんなニーズから検証を始めました。&lt;/p&gt;
&lt;p&gt;各拠点はそれぞれローカルLAN（例: 192.168.1.0/24, 192.168.2.0/24, 192.168.3.0/24）を持ち、
それらを OSPF (FRRouting) で自動経路学習させて、
VPNトンネル越しに相互通信できるようにしたい、という構成です。&lt;/p&gt;
&lt;h1 id=&#34;やりたかったこと&#34;&gt;やりたかったこと&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;OpenVPNで各拠点を接続（多拠点site-to-site VPN）&lt;/li&gt;
&lt;li&gt;FRR (OSPF) を使って動的ルーティング&lt;/li&gt;
&lt;li&gt;トンネルごとにコストを設定して経路選択&lt;/li&gt;
&lt;li&gt;できれば route-nopull で手動ルーティングを制御
目標は「OpenVPNトンネルを2本走らせて、FRRで経路選択を任せる」ことでした。
これを実現するにあたり、色々とハマったので知見をまとめておこうと思います。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;openvpnのルーティングの構造&#34;&gt;OpenVPNのルーティングの構造&lt;/h1&gt;
&lt;p&gt;OpenVPNはユーザランドで動作し、/dev/net/tun デバイスを通じて通信します。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Linuxカーネルはtunデバイスにパケットを出す&lt;/li&gt;
&lt;li&gt;そこから先は**OpenVPNプロセス（ユーザランド）**が受け取り、独自の内部ルーティングテーブルで転送を行う
つまり、Linuxのルーティングテーブル（ip route）とは別世界で動いています。（&lt;strong&gt;ここが非常に大事です。openvpnサーバないのルーティングテーブルがちゃんと設定されていないと、クライアントから届いたパケットをどのクライアントに転送すればいいかがわかりません。ちなみに、openvpnのルーティングテーブルは/var/log/openvpn-status.logから確認可能です&lt;/strong&gt;）&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;push-と-route-nopull-の関係&#34;&gt;push と route-nopull の関係&lt;/h1&gt;
&lt;p&gt;OpenVPNサーバはクライアントに対して push &amp;ldquo;route &amp;hellip;&amp;rdquo; を送ることで、
クライアントのOSにもユーザランドにもルート情報を注入します。&lt;/p&gt;
&lt;p&gt;一方、クライアント設定で route-nopull を有効にすると、
その push 情報をすべて拒否します。
frrでルーティングをさせたい場合には、route-nopullにしておかないと、0.0.0.0/1と128.0.0.1/1がOSのルーティングテーブルに登録され、すべてのパケットが特定のnicから出るように設定されてしまうので注意が必要（server側で**push &amp;ldquo;redirect-gateway def1 bypass-dhcp&amp;rdquo;**が入っている場合）&lt;/p&gt;
&lt;h1 id=&#34;frrospfを組み合わせても解決しない理由&#34;&gt;FRR(OSPF)を組み合わせても解決しない理由&lt;/h1&gt;
&lt;p&gt;FRRでOSPFを走らせると、
VPNトンネル越しに相手拠点のLAN情報（例: 192.168.x.x/24）が学習されます。
これにより、OSレベルのルーティングテーブルは更新されます。&lt;/p&gt;
&lt;p&gt;しかし！&lt;/p&gt;
&lt;p&gt;OpenVPNサーバはそのOSルートを全く参照しません。
OpenVPNプロセスは独自に「このLANはどのクライアントの背後にあるか」を
iroute で知っていなければ、パケットをどこに転送すべきか判断できません。&lt;/p&gt;
&lt;p&gt;自分の場合は、openvpnサーバの/etc/openvpn/ccd以下に書くルーティングファイルの情報が間違っており、クライアント1 -&amp;gt; サーバはパケットが届いていたが、サーバがクライアント2宛のパケットをうまく転送できずdropしてしまっていたのが原因ですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Return_path_problem</title>
      <link>https://blog.ingenboy.com/post/return_path_problem/</link>
      <pubDate>Sat, 27 Sep 2025 10:17:58 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/return_path_problem/</guid>
      <description>&lt;h1 id=&#34;以前の記事&#34;&gt;以前の記事&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/problem_site2site/&#34;&gt;https://blog.ingenboy.com/post/problem_site2site/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;こちらの記事でVPNクライアントを介して、別々のNWセグメントに所属するサーバ間で通信をする方法を軽く説目しました。
この問題は、リターンパス問題だったのですが、今回、改めてリターンパス問題について書きたい。&lt;/p&gt;
&lt;p&gt;まず、&lt;/p&gt;
&lt;h1 id=&#34;1-ip層での基本ルール&#34;&gt;1. IP層での基本ルール&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;送信元IP と 宛先IP はパケットに埋め込まれていて、転送中は変わらない（※NATしない限り）。&lt;/li&gt;
&lt;li&gt;各ホストやルータは「自分のルーティングテーブル」を参照して、この宛先IPはどこに渡すべきか？ を決める。&lt;/li&gt;
&lt;li&gt;宛先が自分の直接つながっているネットワークじゃなければ、**次のホップ（ゲートウェイ）**に渡す。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;今回問題が起こった構成&#34;&gt;今回問題が起こった構成&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[jhonny] 192.168.1.4   tun0:10.8.0.14
    │  (LAN:192.168.1.0/24)
    │  デフォルトほぼVPN (0.0.0.0/1,128.0.0.0/1 → 10.8.0.13)
    ▼
[家庭ルータ(1系)] 192.168.1.1
    │            （インターネット側へ）
    ▼
[VPN Server] tun0:10.8.0.1  gw:162.x.xxx.xxx
  ルート: 192.168.2.0/24 → 10.8.0.2(tun0)
    ▼
[kami] 192.168.2.10   tun0:10.8.0.30
  ルート: 192.168.2.0/24 → enp6s0(直結)
    ▼
[Mac] 192.168.2.3   (LAN:192.168.2.0/24)
デフォルトGW: 192.168.2.1（※ここがキモ）
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;2-今回の例で流れを追うリターンパスがなくてpingが返ってこないパターン&#34;&gt;2. 今回の例で流れを追う（リターンパスがなくてpingが返ってこないパターン）&lt;/h1&gt;
&lt;h2 id=&#34;サーバからjhonnymac-に-ping&#34;&gt;サーバから(jhonny)Mac に ping&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;サーバ(10.8.0.1) が「192.168.2.3にICMPを送りたい」と思う&lt;/li&gt;
&lt;li&gt;VPNトンネルを経由して kaminogou(192.168.2.10) に届く&lt;/li&gt;
&lt;li&gt;kaminogou の Linux がルーティングを見て「192.168.2.3は自分のLAN直結だからそのまま出す」&lt;/li&gt;
&lt;li&gt;Mac の en0 で「送信元=10.8.0.1 宛先=192.168.2.3」の ICMP が見える（ここまではOK）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;mac-が返信するとき&#34;&gt;Mac が返信するとき&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Mac が「宛先=10.8.0.1に返したい」と思う&lt;/li&gt;
&lt;li&gt;Mac のルーティングテーブルを見る&lt;/li&gt;
&lt;li&gt;10.8.0.0/24 の経路が無い&lt;/li&gt;
&lt;li&gt;なのでデフォルトゲートウェイ(192.168.2.1)に投げる&lt;/li&gt;
&lt;li&gt;192.168.2.1（家庭用ルータなど）が「10.8.0.0/24 なんて知らん」と捨てる
これがリターンパス問題&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;問い&#34;&gt;問い&lt;/h1&gt;
&lt;p&gt;なぜ送信元が10.8.0.1になるのか？
-&amp;gt; サーバから送ったからだな。完全理解。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu 24.04 で RTX 5060 Ti を動かすまでの奮闘記</title>
      <link>https://blog.ingenboy.com/post/gpu_installation_fight/</link>
      <pubDate>Tue, 23 Sep 2025 21:54:58 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/gpu_installation_fight/</guid>
      <description>&lt;h1 id=&#34;概要&#34;&gt;概要&lt;/h1&gt;
&lt;p&gt;2025年9月、RTX 5060 Ti を新マシンに差して Ubuntu 24.04 を入れたら…案の定ドライバ認識でドハマりしました。
この記事では、最初に遭遇したエラーから、最終的に nvidia-smi で 5060 Ti が認識されるまでの流れをまとめます。&lt;/p&gt;
&lt;h1 id=&#34;1-最初に出た症状&#34;&gt;1. 最初に出た症状&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;lspci では GPU が見えている（NVIDIA Corporation Device 2d04）。&lt;/li&gt;
&lt;li&gt;しかし nvidia-smi を叩くとエラー：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NVIDIA-SMI has failed because it couldn&amp;#39;t communicate with the NVIDIA driver.
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;dmesg には probe failed with error -1 が連発。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;この時点では「ドライバが GPU を見つけてるけど、初期化に失敗してる」状態でした。&lt;/p&gt;
&lt;h1 id=&#34;2-csm-と-uefi-の壁&#34;&gt;2. CSM と UEFI の壁&lt;/h1&gt;
&lt;p&gt;調べてみると、自分の Ubuntu は Legacy (CSM有効) モードでインストールされていたことが発覚。
最新の GPU は UEFIブート前提 なので、CSM 有効だと GPU 初期化に失敗しがちです。&lt;/p&gt;
&lt;h2 id=&#34;対応したこと&#34;&gt;対応したこと&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;BIOS で CSM を OFF&lt;/li&gt;
&lt;li&gt;Above 4G Decoding = Enabled&lt;/li&gt;
&lt;li&gt;Resizable BAR = Enabled&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;そして Ubuntu を UEFIモードで再インストール
これで「Bootable device not found」問題も解決し、環境が最新GPUに対応できるようになりました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>MyMap</title>
      <link>https://blog.ingenboy.com/post/mymap/</link>
      <pubDate>Sat, 23 Aug 2025 11:12:29 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/mymap/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;地理、楽しいっすよね。めっちゃ好きです。&lt;br&gt;
でも &lt;strong&gt;Google Maps&lt;/strong&gt; って使うと、結局は Google って会社にお世話になってるわけですよ。&lt;/p&gt;
&lt;p&gt;僕はこの「どっかの会社のお世話になっている状態」があまり好きではない。&lt;br&gt;
だからサーバやデータセンターも自前運用するし、&lt;br&gt;
Slack の代わりに &lt;strong&gt;Rocket.Chat&lt;/strong&gt; を使うし、&lt;br&gt;
JIRA ではなく &lt;strong&gt;Redmine&lt;/strong&gt; を使うんです。&lt;/p&gt;
&lt;p&gt;じゃあ &lt;strong&gt;Google Maps を自前で運用するにはどうするか？&lt;/strong&gt;&lt;br&gt;
これが今回のテーマです。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;地図アプリがどうやって動いているか&#34;&gt;地図アプリがどうやって動いているか&lt;/h1&gt;
&lt;p&gt;必要なものは大きく分けて二つ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;レンダリングエンジン&lt;/strong&gt;（地図を描画するライブラリ）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;マップデータ&lt;/strong&gt;（地図そのもののソース）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;ossのレンダリングエンジンライブラリ&#34;&gt;OSSのレンダリングエンジン（ライブラリ）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://leafletjs.com/&#34;&gt;Leaflet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://openlayers.org/&#34;&gt;OpenLayers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://maplibre.org/&#34;&gt;MapLibre GL JS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;それぞれでベースマップを比較できるデモも作りました。&lt;br&gt;
👉 &lt;a href=&#34;https://maps.ingenboy.com/&#34;&gt;比較サイト&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;ossのマップデータ&#34;&gt;OSSのマップデータ&lt;/h2&gt;
&lt;p&gt;選択肢は色々あります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenStreetMap (OSM)&lt;/strong&gt;&lt;br&gt;
世界中のボランティアが作る地図データ。ラスタ（画像タイル）も配布されているが、見た目は少し古臭い。&lt;br&gt;
実際の中身はベクタだが、配信されている地図はあらかじめ描画されているラスタタイル。（元がベクタならそれを出せばいいじゃん、、とは思った）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;OpenMapTiles&lt;/strong&gt;&lt;br&gt;
OSMデータをベクトルタイル化するOSS。&lt;br&gt;
これを使えば、&lt;strong&gt;Google Maps 並みにきれいなベクトル地図&lt;/strong&gt;を完全自前で運用できる。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;ラスタはやっぱり綺麗に映らないですね。なのでベクトルマップが欲しいのですが、
ベクトルマップは自分で作るしかないっぽいです。（Maptilerって会社がOSMを所有しようとしているので気をつけて）&lt;/p&gt;
&lt;h1 id=&#34;実際に-osm--vector-map-を自前ホストする流れ&#34;&gt;実際に OSM → Vector Map を自前ホストする流れ&lt;/h1&gt;
&lt;h2 id=&#34;1-osmデータのダウンロード&#34;&gt;1. OSMデータのダウンロード&lt;/h2&gt;
&lt;p&gt;Geofabrik から地域ごとの &lt;code&gt;.osm.pbf&lt;/code&gt; を落とす。&lt;/p&gt;
&lt;p&gt;例: 日本全体&lt;br&gt;
&lt;a href=&#34;https://download.geofabrik.de/asia/japan.html&#34;&gt;https://download.geofabrik.de/asia/japan.html&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;2-openmaptiles-でベクトルタイル生成&#34;&gt;2. OpenMapTiles でベクトルタイル生成&lt;/h2&gt;
&lt;p&gt;まずは GitHub から OpenMapTiles を取得します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Create_RAG</title>
      <link>https://blog.ingenboy.com/post/create_rag/</link>
      <pubDate>Fri, 06 Jun 2025 17:50:17 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/create_rag/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;gmailの返答を自動化するプロジェクトを推進しています。
そこで、RAGですね。もうだいぶ時間が経っていますが、しっかりやっていきたいと思う。
RAG = 「Retrieval-Augmented Generation」
これを理解できればもう仕組みを理解したも同然です。
が一応説明しておきます。&lt;/p&gt;
&lt;h1 id=&#34;ragの仕組み&#34;&gt;RAGの仕組み&lt;/h1&gt;
&lt;p&gt;めっちゃ簡単にいうと、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ベクトルデータベースに保存されたナレッジから&lt;/li&gt;
&lt;li&gt;問い合わせと類似するナレッジを検索し引っ張り出し&lt;/li&gt;
&lt;li&gt;それを元にGEN AIに回答を作らせる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という流れになります。&lt;/p&gt;
&lt;p&gt;1でベクトルデータベースにナレッジを保存する時には、元の自然言語をベクトル表現に変換した物を格納する必要があります。
このベクトル変換器のことを「Embedding model」と言います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;x: 自然言語
f: Embedding model
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とすると&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;y = f(x)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で得られたy（とそれに対応するx）をベクトルDBに格納しておくわけですね。&lt;/p&gt;
&lt;p&gt;x_q: 問い合わせが来た時&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;y_q = f(x_q)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;から得られるy_qと類似しているy_1, y_2, y_3, ,,, y_nを検索し、
それに対応するx_1, x_2, x_3, ,,, x_n
を出力し、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ans = LLM(x_1, x_2, x_3, ,,, x_n)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とう感じで回答を作らせるという流れです。&lt;/p&gt;
&lt;h1 id=&#34;embedding-modelsの選定&#34;&gt;Embedding modelsの選定&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/ke-suke-Soft/items/f904a442d8ce0e6b7522&#34;&gt;こちらの記事&lt;/a&gt;に書いてある通り、Embedding modelの選定がRAG全体の回答生成性能に大きく影響する。
まあ、chatGPTに聞いた結果これが一番いいのかな。
&lt;a href=&#34;https://huggingface.co/BAAI/bge-base-en&#34;&gt;BAAI/bge-base-en&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;今回ragを構築するにあたり使うソフト&#34;&gt;今回RAGを構築するにあたり使うソフト&lt;/h1&gt;
&lt;p&gt;vector DB: &lt;a href=&#34;https://github.com/qdrant/qdrant&#34;&gt;qdrant&lt;/a&gt;
embedding model: &lt;a href=&#34;https://huggingface.co/BAAI/bge-base-en&#34;&gt;BAAI/bge-base-en&lt;/a&gt;
LLM: &lt;a href=&#34;https://ollama.com/library/phi4&#34;&gt;phi4 14b&lt;/a&gt; on ollama (@ rtx 3060 12g)&lt;/p&gt;
&lt;p&gt;Langchainなどの統合的なライブラリは使わない。なぜなら自由度が低いから。
vector DBでの検索も普通にREST APIでできるので問題なさそう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Googleapi Gmail Autoreply</title>
      <link>https://blog.ingenboy.com/post/googleapi-gmail-autoreply/</link>
      <pubDate>Sat, 10 May 2025 10:37:14 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/googleapi-gmail-autoreply/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;受託開発先の方からLLMを使って問い合わせや予約業務の自動化ができないかと聞かれた。
もちろんできますよ、と僕は答えたわけです。
しかし、一回gmailの内容をローカルに持って来ないと始まりませんよね？？
なので、gmailのメールをサーバに持ってくるためにgoogle apiを叩きます。&lt;/p&gt;
&lt;h1 id=&#34;構成&#34;&gt;構成&lt;/h1&gt;
&lt;p&gt;webフロントエンド -&amp;gt; サーバ（アプリ） -&amp;gt; google api&lt;/p&gt;
&lt;h1 id=&#34;google-apiの設定方法&#34;&gt;google apiの設定方法&lt;/h1&gt;
&lt;h2 id=&#34;1-プロジェクト作成&#34;&gt;1. プロジェクト作成&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://console.cloud.google.com/&#34;&gt;https://console.cloud.google.com/&lt;/a&gt; にアクセス&lt;/li&gt;
&lt;li&gt;以下の写真のgoogle cloudロゴの隣にあるボタンをクリック。この画像で言うと、gmail api access（ここから新しいプロジェクトを作る）
&lt;img alt=&#34;google cloudロゴ&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto.png&#34;&gt;&lt;/li&gt;
&lt;li&gt;プロジェクト名（例：gmail-auto-reply）を入力し、「作成」&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;2-gmail-api-を有効にする&#34;&gt;2. Gmail API を有効にする&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;google cloudロゴの隣にあるボタンから、先ほど作ったプロジェクトにプロジェクトを変更する&lt;/li&gt;
&lt;li&gt;左側メニュー「APIとサービス」 → 「ライブラリ」を押す&lt;/li&gt;
&lt;li&gt;検索ボックスに Gmail API と入力し、クリック。
&lt;img alt=&#34;これ&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto2.png&#34;&gt;&lt;/li&gt;
&lt;li&gt;enableボタンを押す
&lt;img alt=&#34;enable button&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto3.png&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;3-oauth-同意画面を設定する&#34;&gt;3. OAuth 同意画面を設定する&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;左側メニュー「APIとサービス」→「OAuth同意画面」
&lt;img alt=&#34;これ&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto4.png&#34;&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;次のような画面が出てくる。get startedを押す
&lt;img alt=&#34;get started&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto5.png&#34;&gt;&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;以下の情報を入力する&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ユーザータイプ	外部（基本はこれでOK）
アプリ名	任意（例：Auto Mailer）
サポートメール	自分のGmailでOK
開発者連絡先情報	自分のメールアドレス
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;4-認証情報を作成oauth-20-クライアントid&#34;&gt;4. 認証情報を作成（OAuth 2.0 クライアントID）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;左メニュー「認証情報」→「＋認証情報を作成」→「OAuth クライアントID」
&lt;img alt=&#34;get started&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto6.png&#34;&gt;
&lt;img alt=&#34;get started&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ingenboy.com/images/google-api-tuto/google-api-tuto7.png&#34;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以下を入力する&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;アプリケーションの種類 → 「Web アプリ」&lt;/li&gt;
&lt;li&gt;名前は何でもOK（例：auto-mail-backend）&lt;/li&gt;
&lt;li&gt;「承認済みのリダイレクトURI」に以下を追加：
&lt;ul&gt;
&lt;li&gt;http://localhost:3000/auth/google/callback&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://yourdomain.com/auth/google/callback&#34;&gt;https://yourdomain.com/auth/google/callback&lt;/a&gt; (実際に使うサーバ)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;作成ボタンを押す。クライアントシークレットが表示されるのでめももしくはダウンロード&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;5-スコープを追加必要なら&#34;&gt;5 スコープを追加（必要なら）&lt;/h2&gt;
&lt;p&gt;ここまでで設定が完了。次にやることは以下。&lt;/p&gt;</description>
    </item>
    <item>
      <title>自宅GenAIを公開するけど、誰でも触れるのはちょっと怖いのでBasic認証をかけた話</title>
      <link>https://blog.ingenboy.com/post/basic_auth/</link>
      <pubDate>Tue, 06 May 2025 14:27:49 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/basic_auth/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;自宅で動かしている &lt;a href=&#34;https://ollama.com&#34;&gt;Ollama&lt;/a&gt; + GenAI モデル（例えば &lt;code&gt;phi4:14b&lt;/code&gt;）を、インターネット越しに使いたくなった。OpenVPN で穴を開けた上で、Nginx を使って自宅マシンへのプロキシを構成。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[ インターネット ]
       ↓
  VPSのnginx (443)
       ↓
OpenVPN経由のプライベートIP (100.64.x.x)
       ↓
 自宅のGenAIサーバ (Ollama)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;確かに便利ではあるが、「誰でも使える状態」にしてしまうのは少し怖くなった。
なので、Basic認証 を導入して、ユーザーとパスワードを知らないとアクセスできないようにした。&lt;/p&gt;
&lt;h1 id=&#34;nginx-に-basic認証を追加する手順&#34;&gt;Nginx に Basic認証を追加する手順&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;認証用パスワードファイルを作成する
まず、htpasswd コマンドを使って .htpasswd を作成。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install apache2-utils  # 初回のみ

sudo htpasswd -c /etc/nginx/.ollama_htpasswd user1
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;2-nginx-の設定に認証を追加&#34;&gt;2. Nginx の設定に認証を追加&lt;/h1&gt;
&lt;p&gt;/etc/nginx/nginx.conf&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {
    listen 443 ssl;
    server_name hoge.ingenboy.com;

    ssl_certificate /etc/letsencrypt/live/ollama.ingenboy.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ollama.ingenboy.com/privkey.pem;

    add_header &amp;#39;Access-Control-Allow-Origin&amp;#39; &amp;#39;*&amp;#39;;
    add_header &amp;#39;Access-Control-Allow-Methods&amp;#39; &amp;#39;GET, POST, OPTIONS&amp;#39;;
    add_header &amp;#39;Access-Control-Allow-Headers&amp;#39; &amp;#39;Origin, Content-Type, Accept&amp;#39;;

    location / {
        # Basic 認証を有効にする
        auth_basic &amp;#34;Restricted Area&amp;#34;;
        auth_basic_user_file /etc/nginx/.ollama_htpasswd;

        proxy_pass http://100.64.1.41:11434;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &amp;#34;upgrade&amp;#34;;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;3-反映&#34;&gt;3. 反映&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;4-確認&#34;&gt;4. 確認&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;curl -v https://ollama.ingenboy.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;→ 401 Unauthorized&lt;/p&gt;</description>
    </item>
    <item>
      <title>.envファイルは自動で読み込まれる？Composeでの勘違いと正しい理解</title>
      <link>https://blog.ingenboy.com/post/docker_compose_env/</link>
      <pubDate>Sun, 04 May 2025 03:43:03 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/docker_compose_env/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;最近、Docker Compose で .env を使っていて「あれ？なんで変数が読み込まれないんだ？」という問題に直面しました。結論から言うと、Docker Compose は .env を自動で読み込むが、コンテナの環境変数としては勝手に渡さないという、なかなか紛らわしい仕様によるものでした。&lt;/p&gt;
&lt;p&gt;この記事では、自分がハマったポイントと、それによって得られた正しい理解を共有します。&lt;/p&gt;
&lt;h1 id=&#34;結論だけ知りたい人向け&#34;&gt;結論だけ知りたい人向け&lt;/h1&gt;
&lt;p&gt;.env ファイルは Compose ファイルで ${VAR} の形で参照されたときのみ自動で読み込まれる。&lt;/p&gt;
&lt;p&gt;ただし、.env の内容は自動的にコンテナの環境変数として渡されない。&lt;/p&gt;
&lt;p&gt;コンテナに渡したいなら、env_file: または environment: を明示的に使う必要がある。&lt;/p&gt;
&lt;h1 id=&#34;-勘違いしていたこと&#34;&gt;❌ 勘違いしていたこと&lt;/h1&gt;
&lt;p&gt;「.env は docker-compose.yaml と同じディレクトリに置けば、何もせずともコンテナに環境変数として渡される」&lt;/p&gt;
&lt;p&gt;実際に .env に以下のような内容を記述していました：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hogehoge=hoge
hoge=foo
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ところが、Compose を起動してもコンテナ内にこれらの変数は存在しませんでした。&lt;/p&gt;
&lt;h1 id=&#34;原因env-はあくまで-compose-ファイル用のテンプレート変数&#34;&gt;原因：.env はあくまで Compose ファイル用のテンプレート変数&lt;/h1&gt;
&lt;p&gt;例えば以下のように docker-compose.yaml 内で ${VAR} を使えば、それは .env から自動で補完されます：&lt;/p&gt;
&lt;h1 id=&#34;-コンテナに環境変数を渡すには&#34;&gt;✅ コンテナに環境変数を渡すには？&lt;/h1&gt;
&lt;p&gt;方法は2つ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;env_file: を使う（.envファイルをそのまま指定）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  web:
    image: myapp
    env_file:
      - .env
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この場合、.env の中身がまるっとコンテナに渡されます。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;environment: を使う（必要な変数だけ）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  web:
    image: myapp
    environment:
      - P_ARS=${P_ARS}
      - INET_ID=${INET_ID}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このように書けば、Compose 内で .env の変数を参照して環境変数として渡せます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Encrypt_storage</title>
      <link>https://blog.ingenboy.com/post/encrypt_storage/</link>
      <pubDate>Sat, 03 May 2025 18:41:35 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/encrypt_storage/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;サービスを利用するとき、提供者に悪意があることを前提にもの事を考えるべきである。
何かがあってからでは遅いからである。
クラウドサービスのストレージが暗号化されていないのが気に食わない。
万が一ストレージのデータが流出することに備え、ストレージを暗号化したい。
アプリケーションレイヤーではなく、fsレイヤーで暗号化したい。
さて、どうやるのかね。&lt;/p&gt;
&lt;h1 id=&#34;透過的暗号--復号&#34;&gt;透過的暗号 &amp;amp; 復号&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/rfjakob/gocryptfs&#34;&gt;gocryptfs&lt;/a&gt;という、透過的暗号化をディレクトリ単位でしてくれるツールがあります。
これが素晴らしい。ユーザランドで動く。すぐ動かせる。&lt;/p&gt;
&lt;h2 id=&#34;インストール方法&#34;&gt;インストール方法&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install gocryptfs  # または公式のバイナリをダウンロード
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;暗号化されるディレクトリの作成方法&#34;&gt;暗号化されるディレクトリの作成方法&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir ~/secure_data.encrypted
gocryptfs -init ~/secure_data.encrypted
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;復号されるディレクトリを暗号化されたディレクトリにマウント&#34;&gt;復号されるディレクトリを暗号化されたディレクトリにマウント&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir ~/decrypted_data
gocryptfs ~/secure_data.encrypted ~/decrypted_data
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;gocryptfs はシンプルで信頼性が高く、後付けでも運用しやすいです。&lt;/p&gt;
&lt;h1 id=&#34;実際にmongodbのデータを移植した方法がこちら&#34;&gt;実際に、mongodbのデータを移植した方法がこちら&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# install 
sudo apt update
sudo apt install gocryptfs

# make directories
mkdir -p /secure/mongodb.encrypted
gocryptfs -init /secure/mongodb.encrypted  # パスワードを設定
mkdir /secure/mongodb

# mongodbのデータ領域の確認
docker volume inspect rocketchat_mongodb_data

# コピーを/secure/mongodbに移動 (allow_otherでしないとmongodb（非rootユーザが読めなくなる）)
gocryptfs -o allow_other /secure/mongodb.encrypted /secure/mongodb
cp -a /var/lib/docker/volumes/rocketchat_mongodb_data/_data/* /secure/mongodb/

# バインドマウントからボリュームマウントに切り替える
vim compose.yml

volumes:
  - /secure/mongodb:/bitnami/mongodb

# docker composeで再起動
docker compose up -d
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;つまりポイント&#34;&gt;つまりポイント&lt;/h1&gt;
&lt;p&gt;権限回り。mongodbが実行するのですが、所有者と権限にはくれぐれもご注意。
1001をownerにしないとうまくいかないです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>VPNがdefaultルートを書き換えずに全トラフィックを奪う方法とは？OpenVPNの0.0.0.0/1マジックを読み解く</title>
      <link>https://blog.ingenboy.com/post/vpn_routing/</link>
      <pubDate>Fri, 02 May 2025 22:29:53 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vpn_routing/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;VPNを使ってトラフィックを中継する際、すべての通信をVPN経由にしたい──そんなときに現れるのが謎のルート 0.0.0.0/1 と 128.0.0.0/1。&lt;/p&gt;
&lt;p&gt;一見すると「なんだこの中途半端なルートは？」と思われがちですが、これはOpenVPNが採用する非常に巧妙なテクニックです。本記事では、その目的、動作、実際のルーティングテーブルを紐解きながら、この仕組みの裏側を解説します。&lt;/p&gt;
&lt;h1 id=&#34;ルーティングとはip-route-の基本&#34;&gt;ルーティングとは？ip route の基本&lt;/h1&gt;
&lt;p&gt;Linuxのルーティングテーブルは ip route で確認できます。このテーブルは、「どのIPアドレス宛の通信を、どのネットワークインターフェースから、どのゲートウェイ経由で送るか」という配送ルール一覧です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ip route
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
default via 192.168.1.1 dev eth0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この場合、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;192.168.1.0/24 に属する通信は eth0 から直接送られる&lt;/li&gt;
&lt;li&gt;それ以外（つまりインターネットなど）は 192.168.1.1（ゲートウェイ）を経由して送られる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;パケットを受信すると、カーネルはルートテーブルの上から順に一致するエントリを探し、一番一致度が高い（= プレフィックスが長い）ルートに従って出力先を決定します。&lt;/p&gt;
&lt;p&gt;つまり、
&lt;em&gt;&lt;strong&gt;どの通信もまずは「最も具体的な（最長一致の）ルート」を優先する&lt;/strong&gt;&lt;/em&gt;
これがVPNのルーティング操作にも大きく関わってきます。&lt;/p&gt;
&lt;h1 id=&#34;defaultルートとは&#34;&gt;defaultルートとは？&lt;/h1&gt;
&lt;p&gt;default ルート（または 0.0.0.0/0）とは、どのルーティングエントリにも一致しない宛先のパケットをどこに送るかを決めるルールです。いわば「最後の砦」。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 例: よくある default ルート
default via 192.168.1.1 dev eth0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この例では、「どのルートにもマッチしなければ 192.168.1.1 に送れ」となっています。&lt;/p&gt;
&lt;p&gt;通常、インターネットへの出口（ISPや上位ルータ）に向かうために使われます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A (100.64.1.61)
   ↓
B (100.64.1.27) — VPN Client
   ↓
C (162.x.x.x) — VPN Server
   ↓
D (192.168.40.10)
   ↓
E (192.168.40.130)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;AからD・Eに通信を通したい。しかし同時に、Aのインターネット通信もVPN（サーバC）経由で出したい。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Problem_site2site</title>
      <link>https://blog.ingenboy.com/post/problem_site2site/</link>
      <pubDate>Fri, 02 May 2025 20:11:44 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/problem_site2site/</guid>
      <description>&lt;p&gt;#背景&lt;/p&gt;
&lt;p&gt;VPNを使って拠点間通信（Site-to-Site Routing）を構成していると、
思ったようにパケットが届かないケースがあります。今回は以下の構成で発生した通信不通トラブルと、その解決方法を共有します。&lt;/p&gt;
&lt;h2 id=&#34;-ネットワーク構成&#34;&gt;🔧 ネットワーク構成&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[A] 100.64.1.61 (100.64.1.0/22)
↓
[B] 100.64.1.27 (OpenVPNクライアント) → VPN → [C] OpenVPNサーバー → [D] 192.168.1.4 (192.168.1.0/24)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;目標：AからD（192.168.1.4）への通信を通すこと。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-問題の症状&#34;&gt;❗ 問題の症状&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;BからDには通信可能（VPN経由で192.168.1.4が見える）&lt;/li&gt;
&lt;li&gt;AからDへの通信は届かない&lt;/li&gt;
&lt;li&gt;しかしDからAへの通信（返信）は可能&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-原因&#34;&gt;🧠 原因&lt;/h2&gt;
&lt;p&gt;Aは &lt;code&gt;192.168.1.0/24&lt;/code&gt; サブネットに属していないため、この宛先へのパケットをデフォルトゲートウェイに送ってしまっていた。&lt;/p&gt;
&lt;p&gt;つまり、&lt;strong&gt;「行きのルート」が不在&lt;/strong&gt;だったわけです。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-解決策aに静的ルートを追加&#34;&gt;✅ 解決策：Aに静的ルートを追加&lt;/h2&gt;
&lt;p&gt;一時的にルートを追加する場合は以下のコマンドを実行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ip route add 192.168.1.0/24 via 100.64.1.27
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで、Aは目的地 192.168.1.4 へのパケットをVPN中継ノードBに送るようになります。&lt;/p&gt;
&lt;p&gt;UbuntuでNetplanを使用している場合、/etc/netplan/xxx.yaml を以下のように修正します：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: false
      dhcp6: false
      addresses: [100.64.1.61/22]
      routes:
        - to: default
          via: 100.64.1.1
        - to: 192.168.1.0/24
          via: 100.64.1.27
      nameservers:
        addresses: [100.64.1.1, 8.8.8.8, 8.8.4.4]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、netplan applyをやって疎通できなくなると困ることってありますよね。
そんな時のためにこれがあります&lt;/p&gt;</description>
    </item>
    <item>
      <title>Make back-up mechanism of self-hosted drive using Rsync and nginx</title>
      <link>https://blog.ingenboy.com/post/rsync_for_drive/</link>
      <pubDate>Fri, 02 May 2025 17:25:03 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/rsync_for_drive/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;自宅でfilebrowserというOSSを使ってwebからアクセス可能なドライブを作ったのですよ。
ただね、なんとこの間、5年間動かし続けた自作PCが壊れてしまい、直すまでドライブが使えないという問題が発生した。
Mean Time Between Failureをなるべく短くするために以下の二つの手段でドライブを冗長化する。
（しかも、リージョンが分かれているという。自宅で停電が発生しても、実家のドライブにアクセスするようになります。）&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;filebrowserの下準備&lt;/li&gt;
&lt;li&gt;メインのノードとは別にバックアップノードを用意しておき、rsyncで定期的にファイルを同期する&lt;/li&gt;
&lt;li&gt;filebrowserの前にnginxが動いているが、ここでHCを導入。メインがぶっ壊れた時にはバックアップにLBする。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;0-filebrowserの下準備&#34;&gt;0. filebrowserの下準備&lt;/h1&gt;

&lt;details&gt;
  &lt;summary&gt;Details&lt;/summary&gt;
  &lt;p&gt;filebrowserの立て方を簡単に教えますね。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;バイナリをビルドするかダウンロードする（https://github.com/filebrowser/filebrowser）
/usr/local/binに移動する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;パスワードとかゴニョゴニョする。パスワードのハッシュを生成。そして、&amp;ndash;passwordの引数で渡す&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;filebrowser hash mypassword
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;ユニットファイルを作る。
例：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]
Description=FileBrowser Web UI
After=network.target

[Service]
ExecStart=/usr/local/bin/filebrowser -a 0.0.0.0 -p 10001 -r /home/ray/hdd/filebrowser -d /etc/filebrowser/filebrowser.db --username hogehoge --password hogehoge --log /var/log/filebrowser.log 
WorkingDirectory=/etc/filebrowser
Restart=always
User=root
Group=root

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;sudo systemctl daemon-reload する
sudo systemctl&lt;/p&gt;
&lt;p&gt;hogehogeが出力されたら、それを&amp;ndash;passwordで渡す。
以上&lt;/p&gt;
&lt;/details&gt;

&lt;h1 id=&#34;1-rsyncで定期的にファイルを同期する&#34;&gt;1. rsyncで定期的にファイルを同期する&lt;/h1&gt;
&lt;p&gt;以下のコマンドを実行するcronジョブを作っておきましょう。毎時間ファイルを同期してくれます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;rsync -avz  -e ssh ray@evn:~/hdd/filebrowser/ /opt/filebrowser_drive/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;cronジョブの作り方は簡単&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo crontab -e
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで開いて、以下のジョブを登録する&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;*/1 * * * * rsync -avz -e &amp;#34;ssh -i /home/ray/.ssh/id_ed25519&amp;#34; ray@100.64.1.61:~/hdd/filebrowser/ /opt/filebrowser_drive/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;cronはrootで実行されるので、鍵を指定しないと/home/root/.ssh　の鍵を使いますが、めんどいので自分のを使うようにする。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Grafana_variables</title>
      <link>https://blog.ingenboy.com/post/grafana_variables/</link>
      <pubDate>Thu, 27 Mar 2025 18:06:06 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/grafana_variables/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;いやね、だんだんと管理するインスタンス数が増えてくるわけですよ。そうすると一辺に全部のメトリクスが出てきてわかりずらいわけです。
それを解消するためにラベルを張って、どれがどれくらいか見たいよね、というお話です。&lt;/p&gt;
&lt;h1 id=&#34;grafanaでラベルを変数化する方法&#34;&gt;grafanaでラベルを変数化する方法&lt;/h1&gt;
&lt;p&gt;dashboard &amp;gt; setting &amp;gt; variablesから変数を用意できます。
変数にも種類があり、customやtextがあります。
おすすめはcustomですね。自分が好きな名前で候補を登録できます。
例えば以下のように&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;evn : 100.64.1.61:9100, jhonny : localhost:9100, 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これ、カンマ区切りでkey:valueになってる。そして最後もカンマが必要ってのが大事。
そして、promqlでは以下のように書くことで変数を自分で選べるようになります。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-promql&#34; data-lang=&#34;promql&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;rate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;node_disk_written_bytes_total&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;nl&#34;&gt;instance&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=~&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;#34;}[&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;1m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;)/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1024&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Introduce_ups</title>
      <link>https://blog.ingenboy.com/post/introduce_ups/</link>
      <pubDate>Sun, 09 Mar 2025 19:06:07 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/introduce_ups/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;実家は太陽光発電を備えている。
ただ、商用電源と太陽光発電の切り替えの際に一瞬電気が落ちる。この時にコンピュータの電源も落ちる。これがいやなのでUPSを買った。
しかし、UPSをリモートモニタリングできないことが判明した。
USBでUPSに接続して、専用のソフトをインストールしないとモニタリングできないことがわかった。
なので、UPSモニタリングをするためのサーバを導入する。
ラズパイで監視する。&lt;/p&gt;
&lt;h1 id=&#34;1-nutをインストール&#34;&gt;1. NUTをインストール&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update
sudo apt install nut -y
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;2-upsのusb接続を確認&#34;&gt;2. UPSのUSB接続を確認&lt;/h1&gt;
&lt;p&gt;UPSがUSBで認識されているか確認します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pi@alpha:/etc/nut $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS
Bus 001 Device 003: ID 0c45:1202 Microdia
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cyber Powerが接続されていることがわかる。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Systemctl_ope</title>
      <link>https://blog.ingenboy.com/post/systemctl_ope/</link>
      <pubDate>Thu, 27 Feb 2025 23:00:11 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/systemctl_ope/</guid>
      <description>&lt;h1&gt;&lt;/h1&gt;</description>
    </item>
    <item>
      <title>O11y</title>
      <link>https://blog.ingenboy.com/post/o11y/</link>
      <pubDate>Sun, 23 Feb 2025 00:38:12 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/o11y/</guid>
      <description>&lt;h1 id=&#34;oss-o11y-最強セット&#34;&gt;oss o11y 最強セット&lt;/h1&gt;
&lt;p&gt;題名の通り。
o11yを実施するためのoss最強セットです。
構築していきたいと思います。&lt;/p&gt;
&lt;h1 id=&#34;環境&#34;&gt;環境&lt;/h1&gt;
&lt;p&gt;hugo_server : Grafana, Gateway&lt;/p&gt;
&lt;p&gt;hugo_server -&amp;gt; jhonny : Openvpn tunneling&lt;/p&gt;
&lt;p&gt;jhonny : Prometheus, Opensearch, (maybe kafka?)&lt;/p&gt;
&lt;h1 id=&#34;集めたいデータ&#34;&gt;集めたいデータ&lt;/h1&gt;
&lt;h2 id=&#34;gslb周り&#34;&gt;GSLB周り&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;GSLBのHCデータ&lt;/li&gt;
&lt;li&gt;GSLBのアクセスログ&lt;/li&gt;
&lt;li&gt;GSLB clusterの各ノードの状態&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;openvpn周り&#34;&gt;openvpn周り&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;vpnserverのログ&lt;/li&gt;
&lt;li&gt;vpnserverのステータス&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;構築&#34;&gt;構築&lt;/h1&gt;
&lt;h2 id=&#34;grafana&#34;&gt;Grafana&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;apt install grafana-serverでインストール&lt;/li&gt;
&lt;li&gt;sudo systemctl enable grafana-serverでデーモン化&lt;/li&gt;
&lt;li&gt;sudo vim /etc/grafana/grafana.ini でホストヘッダーを設定&lt;/li&gt;
&lt;li&gt;sudo vim /etc/nginx/nginx.confでプロキシの設定&lt;/li&gt;
&lt;li&gt;grafanaにアクセス。初期ユーザ、パスワード：admin,admin&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;prometheus&#34;&gt;prometheus&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;公式からprometheusのbinary + 設定ファイルのtarをダウンロード
&lt;a href=&#34;https://prometheus.io/docs/prometheus/latest/getting_started/&#34;&gt;ref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;設定ファイルやbinaryを移動する
/etc/prometheus/prometheus.yml、/var/lib/prometheus/data/、&lt;/li&gt;
&lt;li&gt;ユニットファイルを作る（/lib/systemd/system/prometheus.service）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/data \
  --web.listen-address=0.0.0.0:9090

Restart=always
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;sudo systemctl daemon-reload&lt;/li&gt;
&lt;li&gt;sudo systemctl start prometheus&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;という感じですね。完璧ですー。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Site2site_vpn2</title>
      <link>https://blog.ingenboy.com/post/site2site_vpn2/</link>
      <pubDate>Sat, 22 Feb 2025 15:54:43 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/site2site_vpn2/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;site2site routingができるようになり、vpn_clientのネットワーク内のサーバとvpn_server間で通信ができるようになったわけだが。
今回、新たにもう一つvpn_clientをつなぎ、新しいローカルネットワークをこのVPNネットワークに参加させようとしたわけだ。
しかしこれがうまくいかない。&lt;/p&gt;
&lt;h1 id=&#34;環境の整理&#34;&gt;環境の整理&lt;/h1&gt;
&lt;p&gt;ネットワークA : 100.64.0.0/22&lt;/p&gt;
&lt;p&gt;ネットワークB : 192.168.1.0/24&lt;/p&gt;
&lt;p&gt;で、以下のような設定をvpn_serverに書き込むわけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;port   1194
proto  udp
dev    tun

ca          ca.crt
cert        server.crt
key         server.key
dh          dh.pem
crl-verify  crl.pem

ifconfig-pool-persist ipp.txt

server 10.8.0.0 255.255.255.0

# client側から通信させたい、server側のLanセグメントを指定
push &amp;#34;redirect-gateway def1 bypass-dhcp&amp;#34;
push &amp;#34;route 10.8.0.0 255.255.255.0&amp;#34;
push &amp;#34;dhcp-option DNS 8.8.8.8&amp;#34;

# server側から通信させたい、client側のlanセグメントを指定
client-config-dir /etc/openvpn/ccd
route 100.64.0.0 255.255.252.0
route 192.168.3.0 255.255.255.0

#fragment 1400
#mssfix
tun-mtu 1400


client-to-client
keepalive 10 120
comp-lzo

user  nobody
group nogroup

persist-key
persist-tun

status      /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log

verb 3
duplicate-cn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これをやればA -&amp;gt; vpn_server
B -&amp;gt; vpn_serverにつながると思っていた。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Port_forwarding_using_iptables</title>
      <link>https://blog.ingenboy.com/post/port_forwarding_using_iptables/</link>
      <pubDate>Wed, 19 Feb 2025 21:09:13 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/port_forwarding_using_iptables/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;openVPN + nginxを使うことでhttpリクエストをリバースプロキシして自宅ネットワークから配信することはできるようになった。
しかしこれあくまでもL7レイヤーの話であり、http以外は無理だという話だ。
例えば、kafkaのトピックにデータを登録するにはhttpではなく独自のプロトコルを使う必要がある。つまり、nginxではだめだということ。
どうするかというと、L3レイヤーでトラフィックの宛先を変えてあげる必要がある。&lt;/p&gt;
&lt;h1 id=&#34;関連&#34;&gt;関連&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/site2site_vpn/&#34;&gt;ovpnを使ってsite2site routing&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;iptalbesを使ってポートフォワーディングする方法&#34;&gt;iptalbesを使ってポートフォワーディングする方法&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 10001番ポートのトラフィックを 100.64.1.61:10001 に転送
iptables -t nat -A PREROUTING -p tcp --dport 10001 -j DNAT --to-destination 100.64.1.61:10001

# フォワードを許可
iptables -A FORWARD -p tcp -d 100.64.1.61 --dport 10001 -j ACCEPT

# 外部に返すためのMASQUERADE（オプション）
iptables -t nat -A POSTROUTING -d 100.64.1.61 -p tcp --dport 10001 -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;という感じですね。&lt;/p&gt;
&lt;p&gt;今更だけどopenvpnがフリーソフトなのって普通にやばい
&lt;a href=&#34;https://github.com/OpenVPN/openvpn&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>インターネット上でGSLBを展開する方法</title>
      <link>https://blog.ingenboy.com/post/how_to_setup_my_own_gslb_on_the_internet/</link>
      <pubDate>Wed, 29 Jan 2025 12:50:49 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/how_to_setup_my_own_gslb_on_the_internet/</guid>
      <description>&lt;h1 id=&#34;gslbを自前で持つ方法&#34;&gt;GSLBを自前で持つ方法&lt;/h1&gt;
&lt;p&gt;はい、まずインターネット上でドメインを持つ必要がありますよね。
ドメインの取得は、&lt;a href=&#34;https://www.icann.org/en/blogs/details/ssac-in-2025-open-engaged-and-accessible-16-01-2025-en&#34;&gt;icann&lt;/a&gt;に登録された事業者しかできないんですよね。
だから、完全に自前は厳しいです。
ってことでいつも通りムームドメインとかでドメインを取得する必要がありますね。&lt;/p&gt;
&lt;p&gt;で、このムームードメイン上でnsレコードを張って、その実態を自分のサーバにすればいいって話なんですよ。そうです。そこです。
そうすれば最終的にAレコードを張るのは自分で管理しているサーバになります。レコードを返すのも自分のサーバになるわけですね。
素晴らしいです。&lt;/p&gt;
&lt;p&gt;nsレコードを張る方法として、二つあるんです。（おそらく）
サブドメインとしてnsレコードを張る方法と、
そのドメインすべてにnsレコードを張る方法。
後者は、「取得したドメインで使用する ※上級者向け」ってところでやる必要がありそう。&lt;/p&gt;
&lt;p&gt;ちなみに、完全に理解してしまったことが一つある。
dnsを登録すると、おそらく必ずnsレコードも登録される。
digではデフォルトでaレコードしか返さないようになっているが、例えばnsをつけるとnsレコードを返すようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;root@x162-43-53-234:~/MyFreshWebsite# dig ns ingenboy.com

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu &amp;lt;&amp;lt;&amp;gt;&amp;gt; ns ingenboy.com
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 15003
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;ingenboy.com.                  IN      NS

;; ANSWER SECTION:
ingenboy.com.           3600    IN      NS      dns01.muumuu-domain.com.
ingenboy.com.           3600    IN      NS      dns02.muumuu-domain.com.

;; Query time: 20 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Wed Jan 29 16:04:35 JST 2025
;; MSG SIZE  rcvd: 95
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じです。これがムームードメインになっていますね？？はい、そうですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>プロジェクト管理の３種の神器</title>
      <link>https://blog.ingenboy.com/post/how_to_run_a_company/</link>
      <pubDate>Sun, 19 Jan 2025 11:00:07 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/how_to_run_a_company/</guid>
      <description>&lt;h1 id=&#34;プロジェクトマネジメントに不可欠なもの&#34;&gt;プロジェクトマネジメントに不可欠なもの&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;タスク管理ツール&lt;/li&gt;
&lt;li&gt;コミュニケーションツール&lt;/li&gt;
&lt;li&gt;wiki
&lt;em&gt;会社運営になると、以上に会計ソフトが加わる&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;オープンソースソフトで代替したい&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;タスク管理ツール：Redmine&lt;/li&gt;
&lt;li&gt;コミュニケーションツール：rocket.chat&lt;/li&gt;
&lt;li&gt;wiki : xwiki&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;how-to-introduce-redmine&#34;&gt;How to introduce Redmine&lt;/h1&gt;
&lt;p&gt;いかのdocker composeを走らせるだけ&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3.7&amp;#39;

services:
  redmine:
    image: redmine:6.0.1
    ports:
      - &amp;#34;8008:3000&amp;#34;
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine_password
    volumes:
      - redmine_data:/usr/src/redmine/files

  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci #--default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: redmine
      MYSQL_USER: redmine
      MYSQL_PASSWORD: redmine_password
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  redmine_data:
    driver: local
  mysql_data:
    driver: local
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;詳しくは、こちらを読んでみてください、といった感じです。
&lt;a href=&#34;https://blog.ingenboy.com/post/introduce_redmine/&#34;&gt;https://blog.ingenboy.com/post/introduce_redmine/&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;how-to-introduce-rocketchat&#34;&gt;How to introduce rocket.chat&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;volumes:
  mongodb_data: { driver: local }

services:
  rocketchat:
    image: ${IMAGE:-registry.rocket.chat/rocketchat/rocket.chat}:${RELEASE:-latest}
    restart: always
    labels:
      traefik.enable: &amp;#34;true&amp;#34;
      traefik.http.routers.rocketchat.rule: Host(`${DOMAIN:-}`)
      traefik.http.routers.rocketchat.tls: &amp;#34;true&amp;#34;
      traefik.http.routers.rocketchat.entrypoints: https
      traefik.http.routers.rocketchat.tls.certresolver: le
    environment:
      MONGO_URL: &amp;#34;${MONGO_URL:-\
        mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}/\
        ${MONGODB_DATABASE:-rocketchat}?replicaSet=${MONGODB_REPLICA_SET_NAME:-rs0}}&amp;#34;
      MONGO_OPLOG_URL: &amp;#34;${MONGO_OPLOG_URL:\
        -mongodb://${MONGODB_ADVERTISED_HOSTNAME:-mongodb}:${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}/\
        local?replicaSet=${MONGODB_REPLICA_SET_NAME:-rs0}}&amp;#34;
      ROOT_URL: ${ROOT_URL:-http://localhost:${HOST_PORT:-3000}}
      PORT: ${PORT:-3000}
      DEPLOY_METHOD: docker
      DEPLOY_PLATFORM: ${DEPLOY_PLATFORM:-}
      REG_TOKEN: ${REG_TOKEN:-}
    depends_on:
      - mongodb
    expose:
      - ${PORT:-3000}
    ports:
      - &amp;#34;${BIND_IP:-0.0.0.0}:${HOST_PORT:-3000}:${PORT:-3000}&amp;#34;

  mongodb:
    image: docker.io/bitnami/mongodb:${MONGODB_VERSION:-6.0}
    restart: always
    volumes:
      - mongodb_data:/bitnami/mongodb
    environment:
      MONGODB_REPLICA_SET_MODE: primary
      MONGODB_REPLICA_SET_NAME: ${MONGODB_REPLICA_SET_NAME:-rs0}
      MONGODB_PORT_NUMBER: ${MONGODB_PORT_NUMBER:-27017}
      MONGODB_INITIAL_PRIMARY_HOST: ${MONGODB_INITIAL_PRIMARY_HOST:-mongodb}
      MONGODB_INITIAL_PRIMARY_PORT_NUMBER: ${MONGODB_INITIAL_PRIMARY_PORT_NUMBER:-27017}
      MONGODB_ADVERTISED_HOSTNAME: ${MONGODB_ADVERTISED_HOSTNAME:-mongodb}
      MONGODB_ENABLE_JOURNAL: ${MONGODB_ENABLE_JOURNAL:-true}
      ALLOW_EMPTY_PASSWORD: ${ALLOW_EMPTY_PASSWORD:-yes}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、
以下のようなnginxファイルをおいて、プロキシしてください。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduce_redmine</title>
      <link>https://blog.ingenboy.com/post/introduce_redmine/</link>
      <pubDate>Tue, 31 Dec 2024 20:38:12 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/introduce_redmine/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;今までタスク管理はREADME.mdを使ってしていたよね。
これは一人でタスクを管理する分には確かに問題ない。
しかし、来年以降、自分がPMをしてプロジェクトを進めることがかなり増えてくると思う。
そこでプロジェクト管理システムを導入することにした。&lt;/p&gt;
&lt;h1 id=&#34;redmine&#34;&gt;REDMINE&lt;/h1&gt;
&lt;p&gt;OSSのプロジェクトマネジメントシステムです。
無料で使えるのでこれを入れたという感じです。&lt;/p&gt;
&lt;h1 id=&#34;docker-composeで一発起動&#34;&gt;docker composeで一発起動&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3.7&amp;#39;

services:
  redmine:
    image: redmine:6.0.1
    ports:
      - &amp;#34;8008:3000&amp;#34;
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine_password
    volumes:
      - redmine_data:/usr/src/redmine/files

  db:
    image: mysql:5.7
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci #--default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: redmine
      MYSQL_USER: redmine
      MYSQL_PASSWORD: redmine_password
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  redmine_data:
    driver: local
  mysql_data:
    driver: local
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;大事なのは、db.commanのところ。日本語も使えるようにこういう感じにしています。
文字コードこれにしないと日本語を入力した時にエラーが出るようになってしまいます。&lt;/p&gt;
&lt;h1 id=&#34;フロントエンドプロキシでプロキシ&#34;&gt;フロントエンドプロキシでプロキシ&lt;/h1&gt;
&lt;p&gt;例のごとく、nginxでフロントを担当していただき、オリジンを自宅のサーバに担当していただきます。
この時、プロキシ時のホストヘッダを引き継がないとバグりますからね。気を付けて。&lt;/p&gt;
&lt;h1 id=&#34;その他tips&#34;&gt;その他tips&lt;/h1&gt;
&lt;p&gt;実はiphoneのアプリにredminePMというのがあるのですが、これでredmineにアクセスするには、
管理ー＞設定ー＞apiから、
RESTによるWebサービスを有効にする
JSONPを有効にする
にチェックを入れてください。&lt;/p&gt;</description>
    </item>
    <item>
      <title>How_to_have_multiple_services_with_multiple_origin_on_a_single_frontend_proxy</title>
      <link>https://blog.ingenboy.com/post/how_to_have_multiple_services_with_multiple_origin_on_a_single_frontend_prox/</link>
      <pubDate>Tue, 31 Dec 2024 10:21:01 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/how_to_have_multiple_services_with_multiple_origin_on_a_single_frontend_prox/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;会社ではL7プロキシの運用・開発をしている。
複数のEP（ドメイン）を持っている。
複数のドメインをひとつのL7プロキシ（単一のIP）でさばいている。
さて、これはいったいどの様に実現しているのか？というのが今回の議題。
IPアドレスはDNSによって単一のドメインと紐づけられる。と自分は認識していたが、これが誤りだった。
そして、自分は、会社に入るまでホストヘッダーという概念を全く分かっていなかった。
HTTPにはホストヘッダーというものがあり、これによって単一IP上に複数のドメインを保持することができるようになる。
そして、ポイントはやはり、HTTPはL7レイヤーであり、IPはL3レイヤーであるというところに落ち着くと思う。&lt;/p&gt;
&lt;h1 id=&#34;前提&#34;&gt;前提&lt;/h1&gt;
&lt;p&gt;DNSでのIPアドレスとドメインの紐づけは一対一ではなく、一対多であった。ここがすごく大事なところでした。
そして、自分はホストヘッダーについて理解していなかった。&lt;/p&gt;
&lt;h1 id=&#34;nginxを使ってバーチャルサーバを立てる&#34;&gt;nginxを使ってバーチャルサーバを立てる&lt;/h1&gt;
&lt;p&gt;chatgptから&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;単一の物理サーバー上で複数のウェブサイトやアプリケーションをホストするために使用される機能です。それぞれのバーチャルサーバーは、異なるドメイン名やサブドメインに対応して、個別に設定されたリソース（例えばウェブページやアプリケーションのファイル、SSL証明書、ログファイルなど）にアクセスを提供します。
Nginxでは、これらのバーチャルサーバーを「サーバーブロック」として設定ファイルに記述します。以下は、Nginxでのバーチャルサーバー設定の基本的な例です：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        root /var/www/example.com/html;
        index index.html index.htm;
    }

    error_page 404 /404.html;
    location = /404.html {
        root /var/www/example.com/html;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /var/www/example.com/html;
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;ホストヘッダーの役割&#34;&gt;ホストヘッダーの役割&lt;/h1&gt;
&lt;p&gt;chatgptより&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;HTTPのホストヘッダーは、HTTPリクエストを送信する際に非常に重要な役割を果たします。このヘッダーは、クライアントがリクエストを送信する際に、どのホスト（ドメイン名またはIPアドレス）とポートに対してリクエストが意図されているかを指定するために使用されます。特に、一つのサーバーが複数のドメインをホスティングしている場合（仮想ホスティング）、ホストヘッダーがないとサーバーはリクエストがどのウェブサイトに対してなのか判断できません。
HTTP/1.1ではホストヘッダーは必須とされています。これは、HTTP/1.0と異なり、サーバーが複数のドメインをホストしている状況が一般的になったためです。リクエストにホストヘッダーが含まれていない場合、サーバーは400 Bad Requestのエラーを返すことが多いです。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;dnsのaレコード&#34;&gt;DNSのAレコード&lt;/h1&gt;
&lt;p&gt;複数のサブドメインが同じサーバーのリソースを指す場合、それら全てに同じIPアドレスを割り当てることが一般的です。&lt;/p&gt;
&lt;p&gt;例えば、次のように設定することができます：&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.example.com&#34;&gt;www.example.com&lt;/a&gt; → 192.0.2.1
mail.example.com → 192.0.2.1
ftp.example.com → 192.0.2.1
これらのサブドメイン全てに同じAレコードのIPアドレス（192.0.2.1）を指定することで、一つのサーバーが異なるサービス（ウェブ、メール、FTPなど）を提供することができます。これは特に、ホスティングサービスが複数のウェブサイトを単一の物理サーバーで管理する場合などに便利です。また、メンテナンスやアップグレードが必要な場合にも、一箇所で変更を行うだけで済むため効率的です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Oh_my_zsh</title>
      <link>https://blog.ingenboy.com/post/oh_my_zsh/</link>
      <pubDate>Sat, 28 Dec 2024 02:26:38 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/oh_my_zsh/</guid>
      <description>&lt;h1 id=&#34;プロが使いがちなシェルです&#34;&gt;プロが使いがちなシェルです&lt;/h1&gt;
&lt;p&gt;まあ自分はこだわりとかなかったので、bashを使っていたのですが、先輩たちのターミナル裁きを見ていると、なんかすごいんですよね。
queryとか出して過去のコマンドを一発で実行したり、tmuxとかで複数立ち上げたり、まあとにかくすごい。
でね、まあzshというのを使っているっポイのですわ。
ということで、zshのについていろいろ書いていこうと思います。&lt;/p&gt;
&lt;h1 id=&#34;how-to-install&#34;&gt;How to install&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install zsh

chsh -s $(which zsh)

sh -c &amp;#34;$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&amp;#34; (oh my zshのインストール)
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;色々調べていい感じにカスタマイズしてください&#34;&gt;色々調べていい感じにカスタマイズしてください&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Docker4nerdctl</title>
      <link>https://blog.ingenboy.com/post/docker4nerdctl/</link>
      <pubDate>Fri, 22 Nov 2024 22:37:14 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/docker4nerdctl/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;k8sを使うにはcontainerdを使わないといけなくて、containerdのクライアントがnerdctlなんですよ。しかし、コンテナ関係と言えばdockerな訳で。githubとかで公開されているシェルスクリプトはdockerコマンドが使われている。全部書き直すのめんどくさすぎる。
そんな時にどうするか？エイリアスも上手くいかな。じゃあどうするか？そんな時のちょい技。&lt;/p&gt;
&lt;h1 id=&#34;ちょい技&#34;&gt;ちょい技&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo vim /usr/local/bin/docker
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash
# Redirect docker calls to nerdctl
exec nerdctl &amp;#34;$@&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo chmod +x /usr/local/bin/docker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで全てのdockerコマンドがnerdctlにリダイレクトされます！！素晴らしい。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Master_of_athenz</title>
      <link>https://blog.ingenboy.com/post/master_of_athenz/</link>
      <pubDate>Fri, 22 Nov 2024 08:04:05 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/master_of_athenz/</guid>
      <description>&lt;h1 id=&#34;athenzを完全理解したい願望&#34;&gt;Athenzを完全理解したい願望&lt;/h1&gt;
&lt;p&gt;はい、書いてある通りです。athenz、理解したいです。
正直、個人開発レベルでは全然理解しなくていいやつです。しかし、大きな企業で、多くのサービスが動いていてサービス間でAPIを使い合いたいとかってなると必須の技術になると思います。いくら内部ネットワークとはいえね、認証された人だったりサービスのみにサービスの利用を限定しないと、もし仮に内部ネットワークに攻撃者が入ってしまった時に好き放題やられてしまうからね。
ということで、athenz完全理解を目指してやっていきたいと思う。&lt;/p&gt;
&lt;h1 id=&#34;流れ&#34;&gt;流れ&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;athenzの各コンポーネントを紹介します。&lt;/li&gt;
&lt;li&gt;athenzで使われているRBACについて説明します&lt;/li&gt;
&lt;li&gt;athenzを自宅のクラスターにインストールします&lt;/li&gt;
&lt;li&gt;インストールしたathenzを使って色々と試してみたいと思います。（プロバイダとテナントの通信、擬似攻撃者になってみるなど）&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;そもそもathenzとは&#34;&gt;そもそもathenzとは&lt;/h1&gt;
&lt;p&gt;アプリケーション間のアクセスを制御するためのプラットフォーム、ですね。
アクセス制御ってのは、REST APIなどのリソースに対して、権限を与えることだよね。
アクセス制御を実現するための構成要素としては、３つあって、識別、認証、認可、の３つだね。
で、athenzの認証だけど、RBACってのが使われているんだよね。&lt;/p&gt;
&lt;h1 id=&#34;rbacとは&#34;&gt;rbacとは&lt;/h1&gt;
&lt;p&gt;アクセス対象を役割ごとにグループ化する。んで、グループに対して権限を与える感じ。このグループのことをroleっていうんだよね。
大事なのは、人ではなく、roleに権限を与えるってこと。で、人をroleに追加する。
ちなみに、roleには色々あって、例えばcrudが全部できるroleも作れるし、閲覧しかできないroleを作ることもできる。
ちなみに、各roleに与える権限のことをポリシーという。これも大事。
roleにpolicyを付与する、という感じ。
リソースの提供者をプロバイダ、リソースの利用者をテナントという。そして、中央にathenzがいる。
で、識別情報のことをAthenz serviceとかっていう。ここがちょっと難しいね。あとでドメインって名前も出てくるけどさ。&lt;/p&gt;
&lt;h1 id=&#34;athenzのアクセス制御の流れ&#34;&gt;athenzのアクセス制御の流れ&lt;/h1&gt;
&lt;p&gt;テナントがプロバイダにアクセスするとき、まずテナントは中央のathenzにトークンを（ロールトークン）発行してももらう。このとき、テナント自身の存在を証明するためにx509証明書を提示する。（ここで一つ目の疑問。誰がx509証明書を発行してくれるのか？）で、発行してもらったトークンをhttpヘッダーにつけて、プロバイダにアクセスする。
プロバイダではathenz-proxyがapiの前で動いている。んで、中央にいるathenzから取得しておいた情報とアクセスを照らし合わせて、apiにプロキシするかしないかを決定する感じです。&lt;/p&gt;
&lt;h1 id=&#34;アーキテクチャとコンポーネント&#34;&gt;アーキテクチャとコンポーネント&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. Management Server (ZMS)
The ZMS is the central authority for managing and provisioning domain-based roles, policies, and resource permissions. It acts as the control plane where administrators define access control rules and service configurations.

Key Features:
Domain Management: Organizes services and resources into &amp;#34;domains&amp;#34; (like a namespace) with associated roles and policies.
Role and Policy Definitions: Allows creation of roles (e.g., admin, reader) and policies specifying which roles can access specific resources.
Audit Trails: Keeps a record of all configuration changes for security and compliance purposes.
REST API: Provides APIs for managing domains, roles, and policies programmatically.
Storage: Persistently stores configuration data in databases like MySQL.


Athenz is a robust system for managing service-to-service authentication and fine-grained access control through its primary components: ZMS (Management Server), ZTS (Token Server), and its User Interface.

1. Management Server (ZMS)
The ZMS is the central authority for managing and provisioning domain-based roles, policies, and resource permissions. It acts as the control plane where administrators define access control rules and service configurations.

Key Features:
Domain Management: Organizes services and resources into &amp;#34;domains&amp;#34; (like a namespace) with associated roles and policies.
Role and Policy Definitions: Allows creation of roles (e.g., admin, reader) and policies specifying which roles can access specific resources.
Audit Trails: Keeps a record of all configuration changes for security and compliance purposes.
REST API: Provides APIs for managing domains, roles, and policies programmatically.
Storage: Persistently stores configuration data in databases like MySQL.


2. Token Server (ZTS)
The ZTS is the runtime component responsible for generating and validating short-lived tokens and certificates that services use to authenticate with one another.

Key Features:
Token Issuance:
Issues Access Tokens (JWTs) and Role Tokens for authorization.
Tokens are short-lived, improving security by reducing exposure to stolen credentials.
Certificate Issuance:
Provides short-lived X.509 certificates for mutual TLS authentication between services.
Decentralized Authorization:
Services can independently validate tokens or certificates using the ZTS public keys, reducing reliance on the ZTS during runtime.
Dynamic Trust:
Works seamlessly in dynamic environments like Kubernetes, issuing tokens based on pod identities.
Integration:
Compatible with OAuth 2.0 and OIDC for standardized authentication.


3. User Interface
Athenz includes a user-friendly web-based UI that enables administrators and users to interact with the system without directly accessing APIs or configuration files.

Key Features:
Role and Policy Management:
Intuitive interfaces for creating and managing roles, policies, and resource permissions.
Domain Browsing:
Easily navigate through domains and view their configurations.
Audit and Reporting:
Visualize audit logs and track changes to roles, policies, and resource access.
Ease of Use:
Simplifies complex RBAC configurations into a graphical and interactive platform, making it easier to onboard new administrators.
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;コンポーネントのまとめ&#34;&gt;コンポーネントのまとめ&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Summary of Workflow:
Setup Phase:
Use the ZMS or UI to define domains, roles, and policies.
Runtime Phase:
Services request tokens or certificates from ZTS to authenticate with other services.
Decentralized Validation:
Tokens are validated locally by consuming services using ZTS-provided public keys.
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;一旦用語説明&#34;&gt;一旦用語説明&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;atehnz service ；アクセス元を識別するためのInfo&lt;/li&gt;
&lt;li&gt;role : 同じ権限を持つAthenz serviceをグループとしてまとめたもの。Athenz serviceを追加する感じ。&lt;/li&gt;
&lt;li&gt;Policy : Roleでどのようなことが行えるのかを記したもの&lt;/li&gt;
&lt;li&gt;Domain : Athenz Service, Role, Policyを管理する名前空間&lt;/li&gt;
&lt;li&gt;x509証明書：athenz serviceであることを証明するもの。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;トークンの種類&#34;&gt;トークンの種類&lt;/h1&gt;
&lt;h1 id=&#34;設定&#34;&gt;設定&lt;/h1&gt;
&lt;p&gt;テナント側：
まず、アクセス元を識別するためのathenz serviceを作成する必要がある。
そして、x509証明書を取得する必要がある。（これは秘密鍵を生成して、どこかにcsrを送って、証明書を配布してもらう、という流れだった気がするのだが）
ちな、環境によってはこれらが自動化されていることもある。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nginx2vector2kafka2opensearch</title>
      <link>https://blog.ingenboy.com/post/nginx2kafka2opensearch/</link>
      <pubDate>Tue, 12 Nov 2024 19:25:04 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/nginx2kafka2opensearch/</guid>
      <description>&lt;h1 id=&#34;nginxのメトリクスとログをモニタリングをする&#34;&gt;nginxのメトリクスとログをモニタリングをする&lt;/h1&gt;
&lt;p&gt;メトリクスデータは以下のように流す
nginx -&amp;gt; vector -&amp;gt; kafka -&amp;gt; opensearch/influxDB
という感じで、nginxから出た生ログをvectorでとり、kafkaに送信、kafkaから、opensearchとinfluxDBがそれぞれとってくる、という流れにするのが良さそう
で、nginxがログを吐き出し/var/log/nginx/access.logとvectorを同じネームスペースで扱いたいので、この二つは物理マシン上にインストールするという流れにしたいと思う。&lt;/p&gt;
&lt;h1 id=&#34;環境構成&#34;&gt;環境構成&lt;/h1&gt;
&lt;p&gt;以下の3つのマシンを使う&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;delta (100.64.1.48,192.168.3.1) : 192.168.3.1/24のルータ,kafka, kafka-ui, opensearch&lt;/li&gt;
&lt;li&gt;master (192.168.3.8) : プロキシサーバ（nginx）、vector&lt;/li&gt;
&lt;li&gt;gamma/zeta/　: オリジン&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;kafkaを導入するdocker-composeの設定&#34;&gt;kafkaを導入するdocker composeの設定&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;services:
  kafka-broker:
    image: apache/kafka:3.7.0
    container_name: kafka-broker
    ports:
      - &amp;#34;${KAFKA_BROKER_LOCAL_PORT}:9092&amp;#34;
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: &amp;#34;CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT&amp;#34;
      KAFKA_ADVERTISED_LISTENERS: &amp;#34;PLAINTEXT_HOST://localhost:${KAFKA_BROKER_LOCAL_PORT},PLAINTEXT://kafka-broker:${KAFKA_BROKER_PUBLIC_PORT}&amp;#34;
      KAFKA_PROCESS_ROLES: &amp;#34;broker,controller&amp;#34;
      KAFKA_CONTROLLER_QUORUM_VOTERS: &amp;#34;1@kafka-broker:${KAFKA_BROKER_CONTROLLER_PORT}&amp;#34;
      KAFKA_LISTENERS: &amp;#34;CONTROLLER://:${KAFKA_BROKER_CONTROLLER_PORT},PLAINTEXT_HOST://:${KAFKA_BROKER_LOCAL_PORT},PLAINTEXT://:${KAFKA_BROKER_PUBLIC_PORT}&amp;#34;
      KAFKA_INTER_BROKER_LISTENER_NAME: &amp;#34;PLAINTEXT&amp;#34;
      KAFKA_CONTROLLER_LISTENER_NAMES: &amp;#34;CONTROLLER&amp;#34;
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_LOG_DIRS: &amp;#34;/tmp/kraft-combined-logs&amp;#34;

  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:v0.7.2
    ports:
      - &amp;#34;${KAFKA_UI_PORT}:8080&amp;#34;
    depends_on:
      - kafka-broker
    restart: always
    environment:
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka-broker:${KAFKA_BROKER_PUBLIC_PORT}

  init-kafka:
    # kafka-topics コマンドを使いたいので confluenticsのコンテナを利用
    image: confluentinc/cp-kafka:7.6.1
    container_name: init-kafka
    depends_on:
      - kafka-broker
    entrypoint: [&amp;#34;/bin/sh&amp;#34;, &amp;#34;-c&amp;#34;]
    command: |
      &amp;#34;
      # blocks until kafka is reachable
      kafka-topics --bootstrap-server kafka-broker:${KAFKA_BROKER_PUBLIC_PORT} --list

      echo -e &amp;#39;Creating topics&amp;#39;
      kafka-topics --bootstrap-server kafka-broker:${KAFKA_BROKER_PUBLIC_PORT} --create --if-not-exists --topic nginx-log --replication-factor 1 --partitions 1
      
      echo -e &amp;#39;Successfully created :&amp;#39;
      kafka-topics --bootstrap-server kafka-broker:${KAFKA_BROKER_PUBLIC_PORT} --list
      &amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;opensearchを導入する設定&#34;&gt;opensearchを導入する設定&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3&amp;#39;
services:
  opensearch-node1: # This is also the hostname of the container within the Docker network (i.e. https://opensearch-node1/)
    image: opensearchproject/opensearch:latest # Specifying the latest available image - modify if you want a specific version
    container_name: opensearch-node1
    environment:
      - cluster.name=opensearch-cluster # Name the cluster
      - node.name=opensearch-node1 # Name the node that will run in this container
      - discovery.seed_hosts=opensearch-node1,opensearch-node2 # Nodes to look for when discovering the cluster
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2 # Nodes eligible to serve as cluster manager
      - bootstrap.memory_lock=true # Disable JVM heap memory swapping
      - &amp;#34;OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m&amp;#34; # Set min and max JVM heap sizes to at least 50% of system RAM
      - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD}    # Sets the demo admin user password when using demo configuration, required for OpenSearch 2.12 and later
    ulimits:
      memlock:
        soft: -1 # Set memlock to unlimited (no soft or hard limit)
        hard: -1
      nofile:
        soft: 65536 # Maximum number of open files for the opensearch user - set to at least 65536
        hard: 65536
    volumes:
      - opensearch-data1:/usr/share/opensearch/data # Creates volume called opensearch-data1 and mounts it to the container
    ports:
      - 9200:9200 # REST API
      - 9600:9600 # Performance Analyzer
    networks:
      - opensearch-net # All of the containers will join the same Docker bridge network
  opensearch-node2:
    image: opensearchproject/opensearch:latest # This should be the same image used for opensearch-node1 to avoid issues
    container_name: opensearch-node2
    environment:
      - cluster.name=opensearch-cluster
      - node.name=opensearch-node2
      - discovery.seed_hosts=opensearch-node1,opensearch-node2
      - cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
      - bootstrap.memory_lock=true
      - &amp;#34;OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m&amp;#34;
      - OPENSEARCH_INITIAL_ADMIN_PASSWORD=${OPENSEARCH_INITIAL_ADMIN_PASSWORD}
    ulimits:
      memlock:
        soft: -1
        hard: -1
      nofile:
        soft: 65536
        hard: 65536
    volumes:
      - opensearch-data2:/usr/share/opensearch/data
    networks:
      - opensearch-net
  opensearch-dashboards:
    image: opensearchproject/opensearch-dashboards:latest # Make sure the version of opensearch-dashboards matches the version of opensearch installed on other nodes
    container_name: opensearch-dashboards
    ports:
      - 5601:5601 # Map host port 5601 to container port 5601
    expose:
      - &amp;#34;5601&amp;#34; # Expose port 5601 for web access to OpenSearch Dashboards
    environment:
      OPENSEARCH_HOSTS: &amp;#39;[&amp;#34;https://opensearch-node1:9200&amp;#34;,&amp;#34;https://opensearch-node2:9200&amp;#34;]&amp;#39; # Define the OpenSearch nodes that OpenSearch Dashboards will query
    networks:
      - opensearch-net

volumes:
  opensearch-data1:
  opensearch-data2:

networks:
  opensearch-net:
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;nginxを導入する設定&#34;&gt;nginxを導入する設定&lt;/h1&gt;
&lt;p&gt;これは普通に&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_real_world_http</title>
      <link>https://blog.ingenboy.com/post/comments_on_real_world_http/</link>
      <pubDate>Mon, 11 Nov 2024 17:19:45 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_real_world_http/</guid>
      <description>&lt;h1 id=&#34;real-world-httpに書いてあることを殴り書きしていきます&#34;&gt;Real world httpに書いてあることを殴り書きしていきます&lt;/h1&gt;
&lt;h1 id=&#34;開発環境&#34;&gt;開発環境&lt;/h1&gt;
&lt;p&gt;の前に、lanのipアドレスを書いておきたいです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;100.64.1.27 : alpha
100.64.1.61 : evn
100.64.1.48 : delta (K8SクラスタへのGWです)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;deltaの役割&#34;&gt;deltaの役割&lt;/h2&gt;
&lt;p&gt;前に、DHCPサーバとルータを作成する記事を書いた。
&lt;a href=&#34;https://blog.ingenboy.com/post/router_dhcp_dsn_and_k8s/&#34;&gt;こちらの記事だね。&lt;/a&gt;
で、deltaはDHCPサーバ兼ルータという立ち位置です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>202411月TODO</title>
      <link>https://blog.ingenboy.com/post/2024nov_todo/</link>
      <pubDate>Mon, 11 Nov 2024 11:57:39 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/2024nov_todo/</guid>
      <description>&lt;h1 id=&#34;2024111時点でのタスクリスト&#34;&gt;2024/11/1時点でのタスクリスト&lt;/h1&gt;
&lt;h4 id=&#34;開発関係&#34;&gt;開発関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 自宅のK8S上にecho-serverを立てて、proxyを複数立てて、さらにvipを立てて、vegetaで負荷試験ができるようにしたい。そして、様々なメトリクスが取れるようにしたい。どうやるんだろうか。流れ的には、だいぶ遠回りになることは承知だが、
まず、real-world-httpを読みたい。これは、だいぶ長いのよね。メモを取りながら進めていく。最終目的はプロキシ2台とecho-server1台の構成で、vegetaで負荷をかけられるようにすること。
うちのも参考にするといいかも。そして、壊して学ぶk8s的な本を買ったので、それを読んで、goで書いたecho-serverをラズパイにデプロイするる感じでやりたい。これをいつまでにやるかだけど、&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ISUCONの過去問を解きましょう。今年のISUCONにおそらく白木さんと出ることになります。足を引っ張りたくないので頑張ります。
ーー＞isucon14の申し込みが始まったという話です。頑張りましょう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 会計ソフトを導入する。この辺が良さそう&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://ledger-cli.org/&#34;&gt;https://ledger-cli.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 合同会社の設立を進める&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; I and shiraki-san decided to develop GSLB using go lang. It is going to be funny&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn DNS （こっちはかなりいい感じで進んでいる。） &amp;ndash;&amp;gt; Done&lt;/li&gt;
&lt;li&gt;Learn How to write packer parser using Go on TCP Layer. It is also going to be funny.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 例の競馬システムを動かす時が来た。自宅のk8sで動かせるようにmanifestファイルを書いてください。よろぴくお願いしますです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Go言語でdistributed file systemを作ってくれ！&lt;a href=&#34;https://www.youtube.com/watch?v=IoY6bE--A54&#34;&gt;このyoutubeを見て&lt;/a&gt;でもいいし、goで分散システムを作ろうって入ってきたあの本でもいい。どっちでもいい。ただ、後者だとk8s上に作った分散システムを展開するので、上のやつとも親和性が高い気がしています。はい。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎朝早く起きてくれ。23時に寝て0630に起きる生活ができると最高だ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早く業務委託で何かしらの案件を取ってきて売れ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早くyoutubeチャンネル開設して、経費生活を始めてくれ！&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;長期目線&#34;&gt;長期目線&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 簿記2級とってくれ！&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 土地をどこに買うかかんがえてくれ！！そして貯金しろ！！マジな話、生活費8万と、共通貯金口座5万以外は全部あっちに回してくれ。
&lt;ul&gt;
&lt;li&gt;つまり、月のクレカ支払いに使えるお金は17万ということになる。保険で10マン落とされるので、残り7万か。まあそんなものやろう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>ECDH ECDSA EdDSAを理解するまでは死ねない</title>
      <link>https://blog.ingenboy.com/post/signature_algorithm/</link>
      <pubDate>Mon, 11 Nov 2024 11:13:57 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/signature_algorithm/</guid>
      <description>&lt;h1 id=&#34;ecdh完全理解した&#34;&gt;ECDH完全理解した。&lt;/h1&gt;
&lt;h1 id=&#34;参考&#34;&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?app=desktop&amp;amp;v=jxmN8LqyTR4&#34;&gt;ECDHを紹介するyoutube&lt;/a&gt;
&lt;a href=&#34;https://blog.cloudflare.com/ja-jp/a-relatively-easy-to-understand-primer-on-elliptic-curve-cryptography/&#34;&gt;楕円曲線暗号をビリヤードに例えている例&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;ecdhの説明&#34;&gt;ECDHの説明&lt;/h1&gt;
&lt;p&gt;かなり面白いね。ECDH。
まず、楕円曲線上で足し算というものを定義する。
これは、ビリヤードである。二点を決めて、その直線を引くと新たに楕円曲線と交わる点が生じる。それをx軸に対象に折り曲げた点、これを足し算の結果とする。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;a + b = c
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここで、p + p = 2pというものを定義可能である。pというのは、接線となる。
で、ここで不思議なのが、以下の結合法則が成り立つこと。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;p + 2p = 3p
3p + p = 4p

2p + 2p = 4p
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;先に&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;p + 2p = 3p
3p + p = 4p
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;を計算して出した4pも&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2p + 2p = 4p
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で出した４pも同じ点になる。これは面白い。&lt;/p&gt;
&lt;p&gt;でだ、
こんな感じで最初の点Gを決めて、k倍した点Q&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Q = kP
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;を求めることは簡単である。（例えば、k = 128の時は、2p+2p, 4P+4p,,,, 64p+64pで計算関数は少なく済む。）
しかし、QとPからkを求めることは困難である。前から順番にやっていくしかないのである。
ということで、Qという値をサーバとクライアントで生成するんだよね。それぞれ、Q1,Q2.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Q1 = K1P
Q2 = k2P
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そして、Q1とQ2を交換します。opensslではRSAなどで署名が施されて交換されるので、真正性も担保される。
で、プリマスターシークレットを、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Q = K1K2P
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;として、鍵交換が完了。これを元に共通鍵を生成して暗号通信がスタートする、という感じだ。
素晴らしい。&lt;/p&gt;
&lt;p&gt;楕円曲線暗号のイメージは、以下のように説明されています。&lt;/p&gt;</description>
    </item>
    <item>
      <title>MTLS_on_OVPN</title>
      <link>https://blog.ingenboy.com/post/mtls_on_ovpn/</link>
      <pubDate>Tue, 22 Oct 2024 11:57:44 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/mtls_on_ovpn/</guid>
      <description>&lt;h1 id=&#34;公開鍵暗号の体系を完全に理解した&#34;&gt;公開鍵暗号の体系を完全に理解した&lt;/h1&gt;
&lt;p&gt;はい、鍵交換アルゴリズム、署名アルゴリズム、暗号アルゴリズム、暗号モード、ハッシュ
の５つのセット（暗号スイート）を指定して通信を暗号化する。それが、俺が知っている暗号体系の全てです。&lt;/p&gt;
&lt;p&gt;でですね、openVPNでクライアントとサーバの通信を暗号化しますよね。
その時に色々と証明書を発行すると思うんですよ。ただ、俺はどの証明書がどのように用いられるのかが全くわかっていなかった。
だから、今回、改めてopenVPNでクライアントとサーバを構築する際の証明書の役割などを確認したいと思う。&lt;/p&gt;
&lt;h1 id=&#34;過去の僕の記事&#34;&gt;過去の僕の記事&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/openvpn_setting/&#34;&gt;basic&lt;/a&gt;
&lt;a href=&#34;https://blog.ingenboy.com/post/openvpn_client_from_ubuntu/&#34;&gt;client&lt;/a&gt;
&lt;a href=&#34;https://blog.ingenboy.com/post/site2site_vpn/&#34;&gt;site to site routeing&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;いつも参考にしている記事&#34;&gt;いつも参考にしている記事&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/noraworld/items/2fe6be489e1d93c748b8&#34;&gt;qiita&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;では追っていきましょう&#34;&gt;では追っていきましょう&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;認証局 (CA) の設立
ここから始まっているっぽいんだよね。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./easyrsa init-pki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: path/to/easy-rsa/easyrsa3/pki
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;CA証明書の生成&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./easyrsa build-ca
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;パスフレーズが聞かれる。&lt;/p&gt;
&lt;p&gt;ここで、秘密鍵と公開鍵がすでに生成されている。認証局のね&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;サーバ証明書の生成&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./easyrsa build-server-full server nopass
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここで、CA証明書を生成したときのパスフレーズを再び入力する。
これでおそらく、サーバの公開鍵に署名がされる。(CSRも済んでいる)&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;DH鍵の生成
ここでDH鍵が生成されるのか。なぜだ？？TLSでのDH鍵は毎回違うものが使われるのではないのか！？
なるほど、chatGPTに聞いたのであっているかはわからんが、この段階で生成されるものは、DHパラメータ（素数と生成元）だね。
これは納得だね。
つまり、&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;y = g ^ (x) mod p 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;の、pとgが生成される。で、サーバとクライアントはお互い適当にxを選ぶわけですわ。はい完全理解。
ちなみに、ecdhを使って鍵交換をすることもできます。&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;証明書失効リストの生成（こちら、参照しているページでは間違っているので注意が必要）&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ ./easyrsa gen-crl
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こちらも、CAの秘密鍵で署名するわけですね。&lt;/p&gt;
&lt;ol start=&#34;6&#34;&gt;
&lt;li&gt;クライアント用秘密鍵の生成&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ cd easy-rsa/easyrsa3
$ ./easyrsa build-client-full username
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;はい、ここでクライアントの証明書と秘密鍵を生成するわけですね。
で、証明書はCAが認証する必要があるので、再びパスフレーズを入れる感じになります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>僕も、TLS Cipherマスターになりたい！</title>
      <link>https://blog.ingenboy.com/post/tls_crt_master/</link>
      <pubDate>Mon, 21 Oct 2024 10:10:44 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/tls_crt_master/</guid>
      <description>&lt;h1 id=&#34;前提知識&#34;&gt;前提知識&lt;/h1&gt;
&lt;p&gt;TLSでは、
鍵交換アルゴリズムを使って共通鍵の材料となる値を交換し、共通鍵を生成し、その鍵を用いて通信が暗号化されるわけですね。
鍵共有に使われる暗号を、公開鍵暗号と言いますね。共通鍵は、共通鍵暗号です。&lt;/p&gt;
&lt;h2 id=&#34;公開鍵暗号&#34;&gt;公開鍵暗号&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;RSA&lt;/li&gt;
&lt;li&gt;DH&lt;/li&gt;
&lt;li&gt;ECDH&lt;/li&gt;
&lt;li&gt;DEH = DH ephemeral&lt;/li&gt;
&lt;li&gt;ECDHE = ECDH epemeral&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DHとECDHは離散対数問題を使っています
g^x mod p = y
で、y,p,gが与えられたとき、xが求められないってことね&lt;/p&gt;
&lt;h2 id=&#34;共通鍵暗号&#34;&gt;共通鍵暗号&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;RC4 (危殆化)&lt;/li&gt;
&lt;li&gt;DES = (危殆化)&lt;/li&gt;
&lt;li&gt;3DES きたいか&lt;/li&gt;
&lt;li&gt;ChaCha20&lt;/li&gt;
&lt;li&gt;AES = 最も使われていて安全&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;RC4 = ストリーム暗号
AES = ブロック暗号&lt;/p&gt;
&lt;h2 id=&#34;ハッシュ関数&#34;&gt;ハッシュ関数&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;MD5&lt;/li&gt;
&lt;li&gt;SHA-1&lt;/li&gt;
&lt;li&gt;SHA-2&lt;/li&gt;
&lt;li&gt;SHA-3&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;tlsの暗号スイートについて&#34;&gt;TLSの暗号スイートについて&lt;/h1&gt;
&lt;p&gt;はい、これすごく大事なこと言います。TLSを使って通信が暗号化されるまでの流れですね。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TLSハンドシェイク&lt;/li&gt;
&lt;li&gt;実際にTLSの通信が始まる&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;でですよ。TLSハンドシェイクで何を決めているか？なんですが、以下を決めているわけですね。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;鍵交換アルゴリズム&lt;/li&gt;
&lt;li&gt;署名アルゴリズム&lt;/li&gt;
&lt;li&gt;暗号アルゴリズム&lt;/li&gt;
&lt;li&gt;暗号利用モード&lt;/li&gt;
&lt;li&gt;ハッシュ関数&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;鍵交換アルゴリズムは上に書いた、RSA,ECDHE,DHEです。
署名アルゴリズムは、RSA/ECDHEを指定できますが、ここは、発行したサーバ証明書の鍵の種類に依存します。ここすごく大事。&lt;/p&gt;
&lt;p&gt;実は、鍵交換アルゴリズムで生成されたあたいは、さらにサーバ証明書の秘密鍵で暗号化され、公開鍵で復号されるんですね。で、真正性を確かめるんですよね。
ここ、知らんかった。すごく大事。&lt;/p&gt;
&lt;p&gt;ただ覚えておきたいのが、RSAを用いた鍵交換では、署名がなされないということ。証明書の公開鍵は、クライアントが生成したプリマスターシークレットを暗号化するために使われる。そして、秘密鍵で復号するんだよね。
ECDHEでは、毎回公開鍵が生成されるんだよね。で、その公開鍵の正当性を証明するために秘密鍵で署名し、公開鍵で検証するんだよね。
RSAを用いた鍵交換では毎回同じ公開鍵と秘密鍵のペアで通信がなされるんだよね。プリマスターシクレットも含めてね。
だから、スノーデン事件の時みたいに、暗号化されたものをずっと溜めておいて、後でどうにか秘密鍵を入手して、プリマスターシクレットを特定、
からの通信内容を特定、といったことができてしまうんだよね。これ、前方特秘性がないって言いますね。&lt;/p&gt;
&lt;p&gt;これに対して、ECDHE、DHEは、一回一回秘密鍵と公開鍵を生成するんだよね。はいそうだね。
でも、公開鍵から秘密鍵は、頑張れば何年かかければ、推測可能だよね？だから前方特秘性は、ないと思うんだけど。&lt;/p&gt;
&lt;p&gt;これをchatGPTに聞いてみたらこう帰ってきました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Q. 離散対数問題は時間をかければ解読可能です。各セッションで使われる公開鍵から秘密鍵を割り出すことも、原理上は可能です。
そこで、各セッションの公開鍵と、暗号化された通信全てを保存している人がいたとしましょう。そうすると、時間さえかければ、暗号文を解読できると思うのですがいかがでしょう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Mtailなどを使い、nginxを完璧に監視する</title>
      <link>https://blog.ingenboy.com/post/master_monitoring/</link>
      <pubDate>Fri, 18 Oct 2024 12:14:25 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/master_monitoring/</guid>
      <description>&lt;h1 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;k8s上にechoサーバを分散させる&lt;/li&gt;
&lt;li&gt;プロキシサーバ (nginx) を立てて、そいつらに負荷分散できるようにする&lt;/li&gt;
&lt;li&gt;Mtailを使って、nginxのログを収集して、prometheus形式に変換、telegrafで取得しinflux Dbに送信　（このときにタグもつけたいかも）&lt;/li&gt;
&lt;li&gt;Cloudproberでnginxを監視したい。cloudprober -&amp;gt; prometheusに変換 -&amp;gt; telegrafで取得しinflux DBに送信（タグもつけたいかもしれない）&lt;/li&gt;
&lt;li&gt;以上を全てansibleを使って実現したいという話だよね。厳しいかな。どうかな？？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正直k8sは必須ではない。時間がかかりそうであれば、先にgoとかで簡単なecho-serverを作って1を完了させてしまうのも全然あり。
今回の目的はあくまでnginxのモニタリングをガチガチにするってことだからね。でも、k8sの監視はちょっとしてみたいかもしれないね。
最初からprometheus形式でexportしてくれるみたいだからね。気になるところではあります。
ただ、k8sはその性質上、コンテナをデプロイするから、どこからコンテナを取ってくるかを決める必要がありますね。外部に漏らしたくない情報が入っているのであればprivateリポジトリを立てるしかない。そうでなければdocker hubでいいかな。&lt;/p&gt;</description>
    </item>
    <item>
      <title>cronで定期的にmysqldumpし、定期的にバックアップサーバに送る方法（バックアップ鯖が取りに来る）</title>
      <link>https://blog.ingenboy.com/post/mysql_dump_cron/</link>
      <pubDate>Sat, 28 Sep 2024 18:45:09 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/mysql_dump_cron/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;Mysqlをデータベースにしてサービスを運営している。
しかし現在、Mysqlのバックアップは取っておらず、元データが消えたら全データが消える状況である。
そこで、元サーバで毎日指定された時刻にmysql_dumpをし、バックアップサーバが元サーバからデータを持ってく量なcronジョブ
を作りたいと思っている。&lt;/p&gt;
&lt;p&gt;注意点としては、本番サーバはグローバルに、バックアップ鯖はローカルネットワークにいるので、グローバルからローカルには送れないってこと。（vpnとか貼ったらいけるけどめんどい）ので、バックアップサーバもcronでscpを動かして定期的に鶏肉という感じ。&lt;/p&gt;
&lt;h1 id=&#34;ac&#34;&gt;AC&lt;/h1&gt;
&lt;p&gt;毎日元サーバから吐かれたmysqldumpファイルがバックアップサーバに置かれた状態になっている&lt;/p&gt;
&lt;h1 id=&#34;関連技術&#34;&gt;関連技術&lt;/h1&gt;
&lt;h2 id=&#34;cron&#34;&gt;cron&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/waokitsune/items/1a9d2a6a481df378f478&#34;&gt;参考&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;設定ファイル&#34;&gt;設定ファイル&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/var/spool/cron/crontabs/&amp;lt;user name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;が設定ファイルです。
rootユーザ用のcronを設定する方法は、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo vim /var/spool/cron/crontabs/root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;って感じで開けます。
このファイルに実行したいジョブと実行日時（実行間隔も指定可能）を指定します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0 * * * * /home/backup.sh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;五つの*が何を表すかですが、
「分 時 日 月 曜日」&lt;/p&gt;
&lt;p&gt;結構忘れがちなのが、シェルスクリプトのパーミッションでexecuteが入ってなくてエラーになることが多いので気をつけて。（上の/home/backup.sh）&lt;/p&gt;
&lt;h1 id=&#34;ログについてubuntu&#34;&gt;ログについて（ubuntu）&lt;/h1&gt;
&lt;p&gt;デフォルトではログが出力されないようになっている。
&lt;a href=&#34;https://qiita.com/pyon_kiti_jp/items/31ab0840e8e67ffb2c3c&#34;&gt;こちらを参考にログを出力するように設定を変える&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vi /etc/rsyslog.d/50-default.conf


# コメントアウト
cron.*                         /var/log/cron.log

# リスタート
service rsyslog restart
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;mysqldump&#34;&gt;mysqldump&lt;/h1&gt;
&lt;h2 id=&#34;参考文献&#34;&gt;参考文献&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c&#34;&gt;こちら&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上のによると、特定のユーザが持っているデータベースをダンプする方法は以下のようになるかな。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysqldump -u hoge -p -B some_database &amp;gt; database.sql
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、パスワードの入力まで自動でやるとするとこんな感じです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0 21 * * * mysqldump -u -hogehoge --password=&amp;#34;hogehoge&amp;#34;  --no-tablespaces DB_NAME &amp;gt; /hoge/database.sql
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;毎日2101にscpでとってくるcron-jobをしくむさらにdbへの流し込みもやってくれると最高だよね&#34;&gt;毎日21:01にSCPでとってくるcron jobをしくむ。さらにdbへの流し込みもやってくれると最高だよね〜。&lt;/h1&gt;
&lt;h2 id=&#34;まずscpでpasswordを打たなくていいように鍵をリモートサーバに登録&#34;&gt;まず、scpでpasswordを打たなくていいように鍵をリモートサーバに登録&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo vim /etc/ssh/sshd_config

# 以下をコメントアウト
PubkeyAuthentication yes
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ssh-keygenで秘密鍵と公開鍵を生成&#34;&gt;ssh-keygenで秘密鍵と公開鍵を生成&lt;/h2&gt;
&lt;p&gt;パスフレーズを入れないのがポイント&lt;/p&gt;</description>
    </item>
    <item>
      <title>RSA暗号、Opensslを使ったSSl証明書の発行、san証明書の発行方法、nginxでの設定方法</title>
      <link>https://blog.ingenboy.com/post/nginx_san/</link>
      <pubDate>Tue, 17 Sep 2024 16:50:27 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/nginx_san/</guid>
      <description>&lt;h1 id=&#34;この記事の流れ&#34;&gt;この記事の流れ&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;opensslで秘密鍵を発行してみる&lt;/li&gt;
&lt;li&gt;秘密鍵の中身を見る&lt;/li&gt;
&lt;li&gt;RSA暗号の解説。証明。&lt;/li&gt;
&lt;li&gt;rsa暗号でサーバ証明書を発行するまで&lt;/li&gt;
&lt;li&gt;SAN付きのサーバ証明書の作り方&lt;/li&gt;
&lt;li&gt;lets encryptでsan付きのサーバ証明書が作れるか&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;そもそもsslサーバ証明書とは&#34;&gt;そもそもsslサーバ証明書とは？&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;「サーバー証明書」とは、「通信の暗号化」「Webサイトの運営者・運営組織の実在証明」の2つの役割をもつ電子証明書です。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;です。つまり、証明書には、暗号化用の鍵＋証明書が入っている、ということになる。いいですね。&lt;/p&gt;
&lt;h1 id=&#34;秘密鍵の中身をのぞいてみる&#34;&gt;秘密鍵の中身をのぞいてみる。&lt;/h1&gt;
&lt;h3 id=&#34;秘密鍵の作成&#34;&gt;秘密鍵の作成&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo mkdir /etc/nginx/ssl
$ sudo openssl genrsa -out /etc/nginx/ssl/server.key 512
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;秘密鍵を作っているけど、公開鍵はどこにあるのか？？というのが非常に気になります。ていうか秘密鍵が因数分解されたものなんだっけ？
だからいいのか。掛け算したら一瞬でわかるって話か。おけ。ってことでさ、適当に鍵を一つ作ってみたんだよ。
ちなみに、512bitより短い鍵は作れません。これすごいよね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;-----BEGIN PRIVATE KEY-----
MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA4dNuxX/SzX3wEhde
FmNFXLWlNkbGq4xaU6CfKy2nI9K+SWSKueJWSjoanmEG1eb6cXozmAk4eiuKm7zv
+FdQowIDAQABAkB+1CdnRoXXIT7eej8+ZZyEGARkulVD7XyhcRlTv70aMWjC29cG
1LIeSScmy5ChqoGwH9Ow/BRzZXax3yeqMQFJAiEA9m+ardfTOK/xVoSn3I5pkzoR
prW2xLQi0IDsv5lEu3UCIQDqlxAo6aDT0KpBBe5HbxBgw7uf34G+m7LJs/JnoMYQ
twIgALXvr0KpFEfFnWdCiKtMeKU5Oc7aWRTf6NQGWsMZZKUCIFxk6wRyH9nNEYFS
qKqR3818yeUJzrwX7q7qpMqT0+65AiEAqWRxDU6t8ZjPmJd6B7w481FuwrFmF9cq
mq+QXX8gjRw=
-----END PRIVATE KEY-----
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo &amp;#34;MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA4dNuxX/SzX3wEhde
FmNFXLWlNkbGq4xaU6CfKy2nI9K+SWSKueJWSjoanmEG1eb6cXozmAk4eiuKm7zv
+FdQowIDAQABAkB+1CdnRoXXIT7eej8+ZZyEGARkulVD7XyhcRlTv70aMWjC29cG
1LIeSScmy5ChqoGwH9Ow/BRzZXax3yeqMQFJAiEA9m+ardfTOK/xVoSn3I5pkzoR
prW2xLQi0IDsv5lEu3UCIQDqlxAo6aDT0KpBBe5HbxBgw7uf34G+m7LJs/JnoMYQ
twIgALXvr0KpFEfFnWdCiKtMeKU5Oc7aWRTf6NQGWsMZZKUCIFxk6wRyH9nNEYFS
qKqR3818yeUJzrwX7q7qpMqT0+65AiEAqWRxDU6t8ZjPmJd6B7w481FuwrFmF9cq
mq+QXX8gjRw=&amp;#34; | base64 --decode
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これでデコードしてもバイナリだからなんもわからんわ。&lt;/p&gt;
&lt;p&gt;いかのスクリプトでデコードできるみたい。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;from Crypto.PublicKey import RSA

# Load the private key
with open(&amp;#34;private_key.pem&amp;#34;, &amp;#34;r&amp;#34;) as file:
    private_key = file.read()

# Parse the private key
key = RSA.import_key(private_key)

# Extract the components
n = key.n  # Modulus
e = key.e  # Public exponent
d = key.d  # Private exponent
p = key.p  # Prime 1
q = key.q  # Prime 2

print(f&amp;#34;Modulus (n): {n}&amp;#34;)
print(f&amp;#34;Public exponent (e): {e}&amp;#34;)
print(f&amp;#34;Private exponent (d): {d}&amp;#34;)
print(f&amp;#34;Prime 1 (p): {p}&amp;#34;)
print(f&amp;#34;Prime 2 (q): {q}&amp;#34;)
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Modulus (n): 11827462552050103756019456673259686146276364164688350469602565108471900615793415256864500417710852720839063036792768824435280979352135219586691204539437219
Public exponent (e): 65537
Private exponent (d): 6642559381010851411383007183311248119169234719466623674178885422700539328402280041863549141435055457596044186231508711647457747564061370576607226853654857
Prime 1 (p): 111466148331411145531384799415569793304697439187343498431136600736302912289653
Prime 2 (q): 106108112006209210762976910352826494821357000184205525073929931397132009738423
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということですね。はい。
はい、でさ、RSA暗号の仕組みも今勉強してしまいましょうか。&lt;/p&gt;</description>
    </item>
    <item>
      <title>About_LB</title>
      <link>https://blog.ingenboy.com/post/about_lb/</link>
      <pubDate>Sun, 08 Sep 2024 17:13:36 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/about_lb/</guid>
      <description>&lt;h1 id=&#34;lbのあれこれ&#34;&gt;LBのあれこれ&lt;/h1&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/masaozi3/items/838060d7339aef01bc2e&#34;&gt;https://qiita.com/masaozi3/items/838060d7339aef01bc2e&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>インターネットの中心</title>
      <link>https://blog.ingenboy.com/post/the_center_of_internet/</link>
      <pubDate>Thu, 05 Sep 2024 21:14:08 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/the_center_of_internet/</guid>
      <description>&lt;h1 id=&#34;ネットワークの中心は一体どこなのか&#34;&gt;ネットワークの中心は一体どこなのか？&lt;/h1&gt;
&lt;p&gt;これの答え、ついに具体的にわかったわ。
インターネットの発祥地はアメリカと言うのは有名な話だよね。
あとは、ネットワークのネットワークがインターネット、と言う話も有名な話だよね
じゃあ、そのネットワークの中心はどこなのか？と言う話だが。答えは、「Tier 1 Network」に所属するISPだとおもう。詳しく述べよう。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.cloudflare.com/ja-jp/learning/security/glossary/what-is-bgp/&#34;&gt;cloud flairのBGPの説明&lt;/a&gt;
&lt;a href=&#34;https://www.softbank.jp/sbnews/entry/20240220_01#:~:text=%E3%81%AA%E3%81%8A%E3%80%81%E6%97%A5%E6%9C%AC%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8BTier1%E3%81%AE,%E3%82%BD%E3%83%95%E3%83%88%E3%83%90%E3%83%B3%E3%82%AF%E3%81%AE2%E7%A4%BE%E3%81%A7%E3%81%99%E3%80%82&#34;&gt;Tier 1にはsoftbankも入っているのか？&lt;/a&gt;
&lt;a href=&#34;https://chiba-it-literacy.jimdofree.com/it%E7%94%A8%E8%AA%9E%E8%A7%A3%E8%AA%AC/it%E7%94%A8%E8%AA%9E%E5%9F%BA%E6%9C%AC%E7%B7%A8/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%97%E3%83%AD%E3%83%90%E3%82%A4%E3%83%80/&#34;&gt;インターネットのすごくわかりやすい説明&lt;/a&gt;
&lt;a href=&#34;https://www.soumu.go.jp/main_sosiki/joho_tsusin/denki_ichiba/pdf/h15_ichiba_s1_01-1.pdf&#34;&gt;昔の資料。平成１５年とかなので2003年とか。まだソフバンが来る前の話&lt;/a&gt;
&lt;a href=&#34;https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10155470925&#34;&gt;日本のISPの話&lt;/a&gt;
&lt;a href=&#34;https://www.jaipa.or.jp/isp/aa/&#34;&gt;日本のISP一覧&lt;/a&gt;
&lt;a href=&#34;https://www.slideshare.net/slideshow/asnipapnic/236609684&#34;&gt;asn/ipの取得方法&lt;/a&gt;
&lt;a href=&#34;https://blog.cybozu.io/entry/bgp-basics&#34;&gt;トランジットとピアリングの話&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/ren510dev/items/a4efe9c7fb8c254f72c3&#34;&gt;closネットワークの話もここでしています&lt;/a&gt;
&lt;a href=&#34;https://access-network.jp/backbone-network/&#34;&gt;回線事業者とISPの関係&lt;/a&gt;
&lt;a href=&#34;https://www.sinet.ad.jp/aboutsinet&#34;&gt;学術ネットワークの話&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;tier1-isp&#34;&gt;Tier1 ISP&lt;/h1&gt;
&lt;p&gt;はい、Tier1に所属するISPは世界で16個しかないんだよね。
こいつらは、インターネットバックボーンを形成しているISP。
で、インターネットバックボーンの役割は、海底ケーブルなどを介して、大陸間、国家間にまたがって各国の基幹ISPを相互接続して、大容量データの経路を確保することです。つまり、国家間の通信を可能にするためのケーブルを弾いてくれている。
日本の企業でTier1のISPに入っているのは、NTTとソフバンが買収したSprintっていうアメリカの会社。
で次。&lt;/p&gt;
&lt;h1 id=&#34;日本の一次プロバイダ&#34;&gt;日本の一次プロバイダ&lt;/h1&gt;
&lt;h1 id=&#34;宮城さんの話&#34;&gt;宮城さんの話&lt;/h1&gt;
&lt;p&gt;janogでは、ISPの人たちがピアリングをしましょうとか、そういう交渉の場としても使われる。これはだいぶ面白いね。
また、個人がISPになることもできるって話。これは、AS番号をもらうって話になるのかな？&lt;/p&gt;</description>
    </item>
    <item>
      <title>2024Sep_TODO</title>
      <link>https://blog.ingenboy.com/post/2024sep_todo/</link>
      <pubDate>Wed, 04 Sep 2024 11:57:39 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/2024sep_todo/</guid>
      <description>&lt;h1 id=&#34;92829でやりたいこと&#34;&gt;9/28,29でやりたいこと&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; isuconの申し込みをやる。これは明日白木さんに確認を取って確実にやらないといけないこと。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; JCで変更履歴を保持するようにしたいんだよね。これ結構データ食うと思うんだけど、実現したいです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; nginxでsanを持った証明書を登録する方法を学ぶ。これね、証明書の発行方法とssl関係を学ぶって話なんだけど、結構難しいぜこれ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ssl入門みたいな本を読む&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;nginxの監視を完璧にする。mtailを使ってlogも監視するし、その他業務の監視項目全部。そして、通知もやる。ちな、urlは、https://blog.ingenboy.com:8080/。仕事の監視を完全にコピーするって話だ。これできたらもうだいぶ昇給していいレベルだと思うけどね。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;echoサーバを建てたいよね。まずはね。クラスタ上にね。ってことでgoで書いたエコー鯖を立てる。k8sにね。これはreal world httpを読めばいいと思うよ。vimを使ってあえてmっけ出していくのもあり。ここでは壊して学ぶk8sを読むのがいいですね。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;外からvegetaで負荷をかけ続けられるようにする。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;k8sも監視したい。よろピクミンだね。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gslbで二つ作った入口で振り分けられるといいよね。って感じで。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;時間が余ったら宅建のお勉強もした方がいいですね。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;2024091時点でのタスクリスト&#34;&gt;2024/09/1時点でのタスクリスト&lt;/h1&gt;
&lt;h4 id=&#34;開発関係&#34;&gt;開発関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 会計ソフトを導入する。この辺が良さそう
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://ledger-cli.org/&#34;&gt;https://ledger-cli.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 自宅のK8S上にecho-serverを立てて、proxyを複数立てて、さらにvipを立てて、vegetaで負荷試験ができるようにしたい。そして、様々なメトリクスが取れるようにしたい。どうやるんだろうか。この辺は、壊して学ぶk8s的な本を買ったので、それで勉強しよう。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; I and shiraki-san decided to develop GSLB using go lang. It is going to be funny
&lt;ul&gt;
&lt;li&gt;Learn DNS （こっちはかなりいい感じで進んでいる。） &amp;ndash;&amp;gt; Done&lt;/li&gt;
&lt;li&gt;Learn How to write packer parser using Go on TCP Layer. It is also going to be funny.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 例の競馬システムを動かす時が来た。自宅のk8sで動かせるようにmanifestファイルを書いてください。よろぴくお願いしますです。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Go言語でdistributed file systemを作ってくれ！&lt;a href=&#34;https://www.youtube.com/watch?v=IoY6bE--A54&#34;&gt;このyoutubeを見て&lt;/a&gt;でもいいし、goで分散システムを作ろうって入ってきたあの本でもいい。どっちでもいい。ただ、後者だとk8s上に作った分散システムを展開するので、上のやつとも親和性が高い気がしています。はい。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ISUCONの過去問を解きましょう。今年のISUCONにおそらく白木さんと出ることになります。足を引っ張りたくないので頑張ります。
ーー＞isucon14の申し込みが始まったという話です。頑張りましょう。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; redmineを入れてタスク管理したらおもしろう。いいかもしれない！&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 宅建の勉強をしよう&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎日筋トレしてくれ。ジムに行ってくれ。朝がいい。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎朝早く起きてくれ。23時に寝て0630に起きる生活ができると最高だ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早く業務委託で何かしらの案件を取ってきて売れ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早くyoutubeチャンネル開設して、経費生活を始めてくれ！&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;長期目線&#34;&gt;長期目線&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 簿記2級とってくれ！&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 土地をどこに買うかかんがえてくれ！！そして貯金しろ！！マジな話、生活費8万と、共通貯金口座5万以外は全部あっちに回してくれ。
&lt;ul&gt;
&lt;li&gt;つまり、月のクレカ支払いに使えるお金は17万ということになる。保険で10マン落とされるので、残り7万か。まあそんなものやろう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Booking_scheduling_system</title>
      <link>https://blog.ingenboy.com/post/booking_scheduling_system/</link>
      <pubDate>Tue, 27 Aug 2024 13:45:03 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/booking_scheduling_system/</guid>
      <description>&lt;h1&gt;&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Vegeta</title>
      <link>https://blog.ingenboy.com/post/vegeta/</link>
      <pubDate>Tue, 27 Aug 2024 13:43:37 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vegeta/</guid>
      <description>&lt;h1 id=&#34;vegeta使いになろう&#34;&gt;vegeta使いになろう&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Shell_master</title>
      <link>https://blog.ingenboy.com/post/shell_master/</link>
      <pubDate>Thu, 22 Aug 2024 11:25:15 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/shell_master/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;インフラエンジニアは、プロセスのメモリ上で何が起こっているかは実はあまりわからないくていい。それよりも、どうやってプロセスをうまく連携させるか、そういう大局的な視点がどうしても必要になる。
結局プログラムは何かを実現するための道具でしかない。道具を作るのはいいけど、インフラエンジニア版
何がいいたいかというと、道具と道具を組み合わせて何かをするという技を学ぶためには、shellを使えるようにならないとダメだという話だ。
shell芸人になれ。
なんか、すごい人はshellでワンライナーで全部解決していく。マジですごい。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;&#34;&gt;1日１問、半年以内に習得シェルワンライナー１６０本ノック&lt;/a&gt;
&lt;a href=&#34;https://github.com/shellgei/shellgei160&#34;&gt;問題データリポジトリ&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;jqコマンド&#34;&gt;jqコマンド&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af&#34;&gt;jqこマンdのについて&lt;/a&gt;
だいぶ使えるのではないか？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ echo &amp;#39;{&amp;#34;items&amp;#34;:[{&amp;#34;item_id&amp;#34;:1,&amp;#34;name&amp;#34;:&amp;#34;すてきな雑貨&amp;#34;,&amp;#34;price&amp;#34;:2500},{&amp;#34;item_id&amp;#34;:2,&amp;#34;name&amp;#34;:&amp;#34;格好いい置物&amp;#34;,&amp;#34;price&amp;#34;:4500}]}&amp;#39; \
| jq .
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo &amp;#39;{&amp;#34;items&amp;#34;:[{&amp;#34;item_id&amp;#34;:1,&amp;#34;name&amp;#34;:&amp;#34;すてきな雑貨&amp;#34;,&amp;#34;price&amp;#34;:2500},{&amp;#34;item_id&amp;#34;:2,&amp;#34;name&amp;#34;:&amp;#34;格好いい置物&amp;#34;,&amp;#34;price&amp;#34;:4500}]}&amp;#39; \
| jq .items
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こちらの結果はこうなります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[
  {
    &amp;#34;item_id&amp;#34;: 1,
    &amp;#34;name&amp;#34;: &amp;#34;すてきな雑貨&amp;#34;,
    &amp;#34;price&amp;#34;: 2500
  },
  {
    &amp;#34;item_id&amp;#34;: 2,
    &amp;#34;name&amp;#34;: &amp;#34;格好いい置物&amp;#34;,
    &amp;#34;price&amp;#34;: 4500
  }
]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次の例&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo &amp;#39;{&amp;#34;items&amp;#34;:[{&amp;#34;item_id&amp;#34;:1,&amp;#34;name&amp;#34;:&amp;#34;すてきな雑貨&amp;#34;,&amp;#34;price&amp;#34;:2500},{&amp;#34;item_id&amp;#34;:2,&amp;#34;name&amp;#34;:&amp;#34;格好いい置物&amp;#34;,&amp;#34;price&amp;#34;:4500}]}&amp;#39; \
| jq &amp;#39;.items[].name&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こんな感じで出力されます&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;#34;すてきな雑貨&amp;#34;
&amp;#34;格好いい置物&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;という感じで、ほうほう、jqなかなか便利ではないか？？ということですね。頭に入れておきましょう。&lt;/p&gt;
&lt;h1 id=&#34;sedコマンド&#34;&gt;sedコマンド&lt;/h1&gt;
&lt;h1 id=&#34;selectコマンド&#34;&gt;selectコマンド&lt;/h1&gt;
&lt;h1 id=&#34;trコマンド&#34;&gt;trコマンド&lt;/h1&gt;
&lt;p&gt;文字を置換したり、削除したりできるコマンド
&lt;a href=&#34;https://qiita.com/nagisa_O/items/1180abb9acc06aa115f0&#34;&gt;こちらをみてみよう&lt;/a&gt;
使用例&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo lion | tr lion bear
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;結果&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bear
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重複しているとダメらしい、、クソか。
しかしこういう使い方はするって話だ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hostname | tr -d &amp;#34;\n&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;date関数のすごい使い方&#34;&gt;date関数のすごい使い方&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ date &amp;#34;+%F&amp;#34;                      #年月日を出力
2022-02-28

$ date &amp;#34;+%T&amp;#34;                      #時分秒を出力
22:37:49

$ date &amp;#39;+%Y/%m/%d %H:%M:%S&amp;#39;       #年月日と時分秒を出力
2022/02/28 22:40:13
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;今回はこうやって使われていた。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_tcp_ip_network_commands</title>
      <link>https://blog.ingenboy.com/post/comments_on_tcp_ip_network_commands/</link>
      <pubDate>Sun, 18 Aug 2024 14:48:27 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_tcp_ip_network_commands/</guid>
      <description>&lt;h1 id=&#34;tcpip--ネットワークコマンド入門の大事なところをメモっていく&#34;&gt;TCP/IP &amp;amp; ネットワークコマンド入門の大事なところをメモっていく&lt;/h1&gt;
&lt;h2 id=&#34;ncコマンドについて&#34;&gt;ncコマンドについて&lt;/h2&gt;
&lt;p&gt;個人的に、最近ncコマンド使う機会が増えてきて、この本でも結構語られているので、使い方くらいはメモっておきたい&lt;/p&gt;
&lt;p&gt;ncコマンドはTCPもしくはUDPのコネクションを貼ってくれるコマンド。送信するビット列は完全に自分で選ぶことができる。
以下のコマンドでサーバをTCPで起動できる。　-l はlistenの略で、リッスンしている、つまりサーバです&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nc -l 55555
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以下のコマンドで、ncサーバとコネクションを貼ることができる&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nc &amp;lt;ip addr&amp;gt; &amp;lt;port&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;よくあるncコマンドの使用例&#34;&gt;よくあるncコマンドの使用例&lt;/h2&gt;
&lt;p&gt;使用例としては、あるサービスのクライアントがどんな感じでbit列を送ってくるのかをサーバ側から可視化するときに使うイメージが強いな。
例えばUDP通信の代表例であるDNS resolutionね。こんな感じです。&lt;/p&gt;
&lt;p&gt;ローカルホストで以下のncサーバを立てる&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# nc -u -l 1053 &amp;gt; query_packet.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;こいつは、1053万ポートでUDP通信を待ち受けている。で、受け取ったパケットをquery_packet.txtにリダイレクトしている。&lt;/p&gt;
&lt;p&gt;このサーバに対して、以下のdigコマンドを送ることで、DNSクライアントがどのようなパケットを送信しているかがわかる。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dig +retry=0 -p 1053 @127.0.0.1 +noedns google.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここからは、追加での遊びですが、こんな感じで、ncサーバで受け取ったパケットを今度はncクライアントに流し込んで読み込ませることもできると。おもろいっすね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nc -u 8.8.8.8 53 &amp;lt; query_packet.txt &amp;gt; response_packet.txt
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、以下のコマンドでhexでパケットの中身が見られるようになります。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hexdump -C query_packet.txt
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;sshクライアントの動きをncサーバをたててみてみる&#34;&gt;sshクライアントの動きをncサーバをたててみてみる&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;nc -l 10022 &amp;gt; clien_packet.txt
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh localhost -p 10022
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ray@delta:~$ hexdump -C clien_packet.txt 
00000000  53 53 48 2d 32 2e 30 2d  4f 70 65 6e 53 53 48 5f  |SSH-2.0-OpenSSH_|
00000010  38 2e 39 70 31 20 55 62  75 6e 74 75 2d 33 75 62  |8.9p1 Ubuntu-3ub|
00000020  75 6e 74 75 30 2e 31 30  0d 0a                    |untu0.10..|
0000002a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいな感じで見られてりして、マジで面白いわけですね。はい。ってことで、ncコマンドはガチで便利だし、知っておいた方がいいって話です。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn_k8s_4</title>
      <link>https://blog.ingenboy.com/post/learn_k8s_4/</link>
      <pubDate>Sun, 18 Aug 2024 14:37:23 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s_4/</guid>
      <description>&lt;p&gt;大人気K8Sシリーズ。
今回でなんと第４回目
まずは、過去の振り返りをやっていきましょう。&lt;/p&gt;
&lt;h1 id=&#34;振り返り&#34;&gt;振り返り&lt;/h1&gt;
&lt;p&gt;過去の奮闘記録。
&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s/&#34;&gt;構築日記その１&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s_2/&#34;&gt;構築日記その２&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s_3/&#34;&gt;構築日記その3&lt;/a&gt;
第１回目と第二回目はインフラ構築を頑張っていた感じです。引っ越しとかあって、K8Sの勉強は飛び飛びになっている感じでね。
そして、第３回にして、やっと色々とインフラ構築をスムーズにできて、さまざまな概念についても理解できてきた、という感じです。
はい、サービスね。これが大事な概念だった。POD間で通信をするためには、Serviceが必要だったのではないか？とね。ServiceでPODをcoreDNSに登録することができる。
そして、基本的に一つのサービス内での通信はしない。サービス間の通信はあるが。なので、docker composeのようにはいかないという話だな。&lt;/p&gt;
&lt;p&gt;そして、今回の第４回目では、K8Sの使い方をもっと詳しく理解していきましょう、という回になっています。
具体的には、「つくって、こわして、直して学ぶkubernetes入門」という本に従って色々と進めていきたいと思っています。はい。
そして、第５回目に、私が開発した競馬システムをついにデプロイする、という感じに持っていきたいと思っています。よろしくお願いします。&lt;/p&gt;
&lt;h1 id=&#34;まずはharborにログインしておく&#34;&gt;まずは、harborにログインしておく&lt;/h1&gt;
&lt;p&gt;の前にロボットアカウントを作らないといけない感じ？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker login 100.64.1.61:20080 -u username -p password server
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;nerdctlを使っているのでbuildを使うためにbuildkitをインストールする必要がある&#34;&gt;nerdctlを使っているので、buildを使うためにbuildkitをインストールする必要がある。&lt;/h1&gt;
&lt;p&gt;しかも、buildkitdというのを走らせておく必要がある。&lt;/p&gt;
&lt;h1 id=&#34;テストでgoで簡易サーバを作って走らせる&#34;&gt;テストでgoで簡易サーバを作って走らせる&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package main

import (
        &amp;#34;fmt&amp;#34;
        &amp;#34;log&amp;#34;
        &amp;#34;net/http&amp;#34;
)

func main() {
        http.HandleFunc(&amp;#34;/&amp;#34;,func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w,&amp;#34;Hellow, wordl!&amp;#34;)
        })

        log.Println(&amp;#34;starting server on port 8880&amp;#34;)
        err := http.ListenAndServe(&amp;#34;:8880&amp;#34;, nil)
        if err != nil {
                log.Fatal(err)
        }

}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;dockerfile&#34;&gt;dockerfile&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;FROM golang:1.23 AS builder
WORKDIR /app
COPY . .
ENV CGO_ENABLED=0
RUN go mod tidy
RUN go build -o hello .

FROM scratch
COPY --from=builder /app/hello /hello
ENTRYPOINT [&amp;#34;/hello&amp;#34;]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;go.modを入れるのを忘れずに。
go mod init github.com/hogehoge とかで問題ない。&lt;/p&gt;</description>
    </item>
    <item>
      <title>House_keeping</title>
      <link>https://blog.ingenboy.com/post/house_keeping/</link>
      <pubDate>Tue, 13 Aug 2024 21:13:14 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/house_keeping/</guid>
      <description>&lt;h1 id=&#34;家事&#34;&gt;家事&lt;/h1&gt;
&lt;h2 id=&#34;813&#34;&gt;8/13&lt;/h2&gt;
&lt;h3 id=&#34;r&#34;&gt;R&lt;/h3&gt;
&lt;p&gt;風呂掃除
皿洗い&lt;/p&gt;
&lt;h3 id=&#34;t&#34;&gt;T&lt;/h3&gt;
&lt;p&gt;昼ごはん
洗濯
コンロ掃除&lt;/p&gt;
&lt;h2 id=&#34;814&#34;&gt;8/14&lt;/h2&gt;
&lt;h3 id=&#34;r-1&#34;&gt;R&lt;/h3&gt;
&lt;h3 id=&#34;t-1&#34;&gt;T&lt;/h3&gt;
&lt;p&gt;朝ごはん
昼ごはん&lt;/p&gt;</description>
    </item>
    <item>
      <title>Wordpressを導入し、独自テーマを作り、docker化する</title>
      <link>https://blog.ingenboy.com/post/wordpress/</link>
      <pubDate>Thu, 08 Aug 2024 22:16:21 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/wordpress/</guid>
      <description>&lt;h1 id=&#34;最終目標&#34;&gt;最終目標&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;dockerコマンドで一発でワードプレスを展開可能&lt;/li&gt;
&lt;li&gt;独自テーマを導入している。&lt;/li&gt;
&lt;li&gt;可能であれば、フォーム送信などもしたい。つまり、独自のapiとのやり取りを可能にしたい。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;まず知りたいのが、独自テーマを使うと、フロントエンドも自分の好きなように改変できるのか？という話。これは気になる。&lt;/p&gt;
&lt;h1 id=&#34;dockerでワードプレスを使えるようにする&#34;&gt;dockerでワードプレスを使えるようにする。&lt;/h1&gt;
&lt;p&gt;まずは、&lt;a href=&#34;https://hub.docker.com/_/wordpress&#34;&gt;公式docker hub&lt;/a&gt;こちらになります。
ふむふむ。簡単だな。こちらののdocker composeコマンドで一発で行けるか？？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;version: &amp;#39;3.1&amp;#39;

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: &amp;#39;1&amp;#39;
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;docker composeが使えないdockerもあるのよね。これが一番だるい。dockerの公式サイトからインストールするのが一番いい。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Add Docker&amp;#39;s official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  &amp;#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;#34;$VERSION_CODENAME&amp;#34;) stable&amp;#34; | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt-get update
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で、あとは、適当に、&lt;/p&gt;</description>
    </item>
    <item>
      <title>サイトの切り替え</title>
      <link>https://blog.ingenboy.com/post/transfer_site/</link>
      <pubDate>Thu, 08 Aug 2024 21:25:17 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/transfer_site/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;10年前に作ったサイトをまだ使っているということで、かなりPVが落ちてきているんだよね。
そこで、ワードプレスなどで作った新しいサイトに移行をしたいと思っている。
端的にいうと、名前解決先を新しいIPと紐づければ良さそうに感じるが、本当にそれでいいのだろうか？
ここではサイトの引越しの際に気をつけるべきポイントを徹底的に考察する&lt;/p&gt;
&lt;h1 id=&#34;サイト引越しの際に気をつけるべきポイント&#34;&gt;サイト引越しの際に気をつけるべきポイント&lt;/h1&gt;
&lt;h1 id=&#34;引っ越す方法&#34;&gt;引っ越す方法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;とりあえず、ワードプレスで同じサイトを作る&lt;/li&gt;
&lt;li&gt;301でリダイレクトってなんだ？&lt;/li&gt;
&lt;li&gt;Lets ecryptで暗号化する場合、cronで自動的に更新できるようにしないとな。&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Master_ansible</title>
      <link>https://blog.ingenboy.com/post/master_ansible/</link>
      <pubDate>Sun, 04 Aug 2024 20:06:01 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/master_ansible/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;業務で必要なansibleをマスターしたい。&lt;/p&gt;
&lt;h1 id=&#34;ansibleとは&#34;&gt;ansibleとは&lt;/h1&gt;
&lt;p&gt;ansibleとは、Infrastructure as Codeを実現するための構成管理ツールである。
例えば、middlewareをデプロイする際に、ある程度の複雑さでのデプロイを可能にするツールである。&lt;/p&gt;
&lt;h1 id=&#34;ansibleの特徴&#34;&gt;ansibleの特徴&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;可読性を意識した設定ファイル
&lt;ul&gt;
&lt;li&gt;柔軟性がないとも言える&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;豊富なモジュール群
&lt;ul&gt;
&lt;li&gt;これは柔軟性の高い（＝可読性が低い）ことの裏返しだと思う&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;冪等性の担保
&lt;ul&gt;
&lt;li&gt;何度ファイルを実行しても、対象の結果は変わらない&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;agentlessなツール
&lt;ul&gt;
&lt;li&gt;ローカルホストで実行し、sshで各サーバにログインして設定をする。構成管理をしたいサーバに別途ソフトを導入する必要などはない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;用途が似たツールにterraformがある。それとの違いに関してはまた今度としよう。&lt;/p&gt;
&lt;h1 id=&#34;ansibleのアーキテクチャ&#34;&gt;ansibleのアーキテクチャ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;ansiblでは、コマンドを実行する「コントロールノード」と処理の対象となる「ターゲットノード」に分かれる。設定ファイルに書かれたモジュールをコントロールノード側でPythonのコードに変換し、sftpでターゲットノードに転送し、そこでPythonコードを実行する流れになっている。そのため、コントロールノード、ターゲットノードのどちらにもPythonがインストールされている必要がある。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;ansibleの用語&#34;&gt;ansibleの用語&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;インベントリ：ターゲットノードの一覧が書かれた設定ファイルである。ターゲットノードをグループ化することも可能である。&lt;/li&gt;
&lt;li&gt;プレイブック：実行するモジュールが書かれた設定ファイルである。&lt;/li&gt;
&lt;li&gt;モジュール：「ファイルの転送」や「サービスの起動、停止」などの処理の単位。Ansible側で用意されたモジュールを使って構成管理をする。（では、逆にansibleのモジュールにない設定を反映させたい場合にはどうするのか？ーー＞自分でモジュールを開発することもできる）&lt;/li&gt;
&lt;li&gt;プラグイン：Ansibleの基本機能を拡張してくれる。モジュールはタスクとして実行されるが、プラグインは、Ansible コアを拡張してくれる感じです。&lt;/li&gt;
&lt;li&gt;コレクション：&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;ansibleのインストール方法&#34;&gt;ansibleのインストール方法&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;apt install ansible-core
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;インストールを確認&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ray@delta:~$ ansible-playbook --version
ansible-playbook [core 2.12.0]
  config file = None
  configured module search path = [&amp;#39;/home/ray/.ansible/plugins/modules&amp;#39;, &amp;#39;/usr/share/ansible/plugins/modules&amp;#39;]
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  ansible collection location = /home/ray/.ansible/collections:/usr/share/ansible/collections
  executable location = /usr/bin/ansible-playbook
  python version = 3.10.12 (main, Jul 29 2024, 16:56:48) [GCC 11.4.0]
  jinja version = 3.0.3
  libyaml = True
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;設定ファイル&#34;&gt;設定ファイル&lt;/h1&gt;
&lt;p&gt;~/.ansible/ansible.cfg配下におくといいです。このファイルに以下の設定を書き込みましょう&lt;/p&gt;</description>
    </item>
    <item>
      <title>Master_DNS</title>
      <link>https://blog.ingenboy.com/post/master_dns/</link>
      <pubDate>Sun, 04 Aug 2024 19:47:34 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/master_dns/</guid>
      <description>&lt;p&gt;DNSはrequestとresponseが同じ系形式のUDPパケットでやり取りされるプロトコルである。
で、実はdigがdnsプロトコルのパケット内容を忠実に再現しているのです。だから、これマスターするDNSがほぼ分かったということになります。&lt;/p&gt;
&lt;h1 id=&#34;関連ドキュメント&#34;&gt;関連ドキュメント&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/EmilHernvall/dnsguide/blob/master/chapter1.md&#34;&gt;ハンズオンの&lt;/a&gt;
&lt;a href=&#34;https://zenn.dev/gorogoroumaru/articles/00ca59c178535e&#34;&gt;ハンズオンを紹介しているやつ&lt;/a&gt;
&lt;a href=&#34;https://www.dnsops.jp/event/20120831/DNS-RFC-PRIMER-2.pdf&#34;&gt;rfsの読み方を説明している資料&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/h_tyokinuhata/items/16f388cf48387cdcc9d3&#34;&gt;ルートDNSの場所&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/s_szk/items/9f29f6751deb2acf3055&#34;&gt;digコマンドでの遊び方&lt;/a&gt;
&lt;a href=&#34;https://zenn.dev/fuuukeee3/articles/5ea3c909ef0eff&#34;&gt;digでの遊び方&lt;/a&gt;
&lt;a href=&#34;https://jprs.jp/glossary/index.php?ID=0197#:~:text=%E8%87%AA%E8%BA%AB%E3%81%A7%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%81%8C,%E3%81%AE%E6%A9%8B%E6%B8%A1%E3%81%97%E3%82%92%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82&#34;&gt;dnsの全体像&lt;/a&gt;
&lt;a href=&#34;https://ryo-ux-it-agile.com/dig/&#34;&gt;dig関連&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;digの基本的なオプション
+noedns : tcpで問い合わせ
+norec : 非再起問い合わせを強制する。&lt;/p&gt;
&lt;p&gt;qr : queryレスポンス
rd : recursion desired : 再起問い合わせ要求。（Set by the sender of the request if the server should attempt to resolve the query recursively if it does not have an answer readily available.）
ra : recursion available : 再起問い合わせ対応が可能か？（Set by the server to indicate whether or not recursive queries are allowed.）
基本的に、名前解決と言ったら8.8.8.8などのDNSキャッシュサーバが再起問い合わが実行して返してくれる。
しかし、権威DNSは再起問い合わせができないからね。
rdがついてもraがなかったら非再起問い合わせができないということになります。いくつかみてみましょうか？&lt;/p&gt;
&lt;p&gt;いくつかDNSレコードを送ってみましょうか？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dig @1.1.1.1 +norec blog.ingenboy.com

; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.18.28-0ubuntu0.24.04.1-Ubuntu &amp;lt;&amp;lt;&amp;gt;&amp;gt; @1.1.1.1 +norec blog.ingenboy.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: SERVFAIL, id: 21079
;; flags: qr ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;blog.ingenboy.com.             IN      A

;; Query time: 1 msec
;; SERVER: 1.1.1.1#53(1.1.1.1) (UDP)
;; WHEN: Thu Aug 22 09:05:47 JST 2024
;; MSG SIZE  rcvd: 46
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;+norecをつけたのでDNSサーバは非再起問い合わせで名前解決ができません。そのため、answer sectionがないわけですね。
つまり、名前解決できなかったわけです。それにもかかわらずGot answerって書いているのはタチが悪いよね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Telegraf &#43; InfluxDBでシステムモニタリング</title>
      <link>https://blog.ingenboy.com/post/telegraf/</link>
      <pubDate>Thu, 01 Aug 2024 19:00:11 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/telegraf/</guid>
      <description>&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf&#34;&gt;Telegraf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/grafana/grafana&#34;&gt;grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/prometheus/prometheus&#34;&gt;prometheus&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;最終成果物&#34;&gt;最終成果物&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com:8080/&#34;&gt;influx_dbのダッシュボード&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;業務でnginxの運用に携わっているのだが、nginxのrpsやレスポンスステータスごとの返却数など、どうやってモニタリングしているのか気になっていた。telegrafを使っていたのはわかったんだけど、実際にどうやってデータを取って、それをどうやってデータサーバで保存して、可視化をしていたのか、非常に気になっていたのです。それが今日解決しました。Telegraf、grafana、そして、prometheus,結構使えそうです。この記事では、メトリクスを可視化するためのツールを揃えていこうと思います。&lt;/p&gt;
&lt;h1 id=&#34;telegrafの概要&#34;&gt;Telegrafの概要&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Telegraf is an agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;他にもTelegrafこういう感じのTelegrafの説明もあります。僕はこっちの方が好きだった&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Telegraf, a server-based agent, collects and sends metrics and events from databases, systems, and IoT sensors. Written in Go, Telegraf compiles into a single binary with no external dependencies–requiring very minimal memory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;らしいですね。
collecting and writingなので、データをどこからか取ってきて、どこかに送るというわけです。そうです、inputとoutputを決められるわけですね。それも膨大な数のInputとoutputがあります。正直これは驚きました。こんなにあるんかとね。すごいです。ちょっと使えそうなinputとoutputを何個かpickupしておきたいと思います。&lt;/p&gt;
&lt;h2 id=&#34;input&#34;&gt;input&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/apache&#34;&gt;Apache Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/bind&#34;&gt;BIND 9 Nameserver Statistics Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/ceph&#34;&gt;Ceph Storage Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cgroup&#34;&gt;CGroup Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/conntrack&#34;&gt;Conntrack Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/couchdb&#34;&gt;CouchDB Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/cpu&#34;&gt;CPU Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/disk&#34;&gt;Disk Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/dns_query&#34;&gt;DNS Query Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/docker&#34;&gt;Docker Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/kernel&#34;&gt;Kernel Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/kubernetes&#34;&gt;Kubernetes Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/lustre2&#34;&gt;Lustre Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/mysql&#34;&gt;MySQL Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/influxdata/telegraf/tree/master/plugins/inputs/nginx&#34;&gt;Nginx Input Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;って感じで本当になんでもある。これはえぐい。
16. nvidia-smi
17. postgres
18. proxmox
19. prometheus&lt;/p&gt;</description>
    </item>
    <item>
      <title>2024Aug_TODO</title>
      <link>https://blog.ingenboy.com/post/2024aug_todo/</link>
      <pubDate>Thu, 01 Aug 2024 18:22:08 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/2024aug_todo/</guid>
      <description>&lt;h1 id=&#34;2024081時点でのタスクリスト&#34;&gt;2024/08/1時点でのタスクリスト&lt;/h1&gt;
&lt;h4 id=&#34;開発関係&#34;&gt;開発関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; nginx + telegraf + grafana + prometheusで、外部から可視化したい！！ここにはめちゃめちゃ技術が詰め込まれていますからね。いいですねーーー！
&amp;ndash;&amp;gt;結局influxDBとtelegrafを使ってシステムモニタリングすることにした。これは楽しいですね。しかし、血胸知識なんですよね。知恵は使ってない。知恵を振り絞ってこそ楽しいのではないか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早めにインターネット回線を契約しよう&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 自宅のraspiでK8Sクラスタを展開してくれ。でtelegrafでk8sのシステムをモニタリングして、可視化しよう。可視化は多分そこまで難しくないと思う。頑張ってくれ！！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; NISA口座を開設&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; JC_booking_centerを早く稼働させてくれ、同時にjc_licence_translationを早く作ってくれ。とりあえずは、予約を承って、承った旨をメールで送信し、こちらからもみられるようなシステムが作れるといいかな。はい、そんな感じ。
&amp;ndash;&amp;gt; 作らずに解決することにした。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 自宅のK8S上にecho-serverを立てて、proxyを複数立てて、さらにvipを立てて、vegetaで負荷試験ができるようにしたい。そして、様々なメトリクスが取れるようにしたい。どうやるんだろうか。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; I and shiraki-san decided to develop GSLB using go lang. It is going to be funny&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Learn DNS （こっちはかなりいい感じで進んでいる。）&lt;/li&gt;
&lt;li&gt;Learn How to write packer parser using Go on TCP Layer. It is also going to be funny.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 例の競馬システムを動かす時が来た。自宅のk8sで動かせるようにmanifestファイルを書いてください。よろぴくお願いしますです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Go言語でdistributed file systemを作ってくれ！&lt;a href=&#34;https://www.youtube.com/watch?v=IoY6bE--A54&#34;&gt;このyoutubeを見て&lt;/a&gt;でもいいし、goで分散システムを作ろうって入ってきたあの本でもいい。どっちでもいい。ただ、後者だとk8s上に作った分散システムを展開するので、上のやつとも親和性が高い気がしています。はい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ISUCONの過去問を解きましょう。今年のISUCONにおそらく白木さんと出ることになります。足を引っ張りたくないので頑張ります。
ーー＞isucon14の申し込みが始まったという話です。頑張りましょう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>リンクレイヤーで使われるネットワークコマンドをまとめる</title>
      <link>https://blog.ingenboy.com/post/about_link_layer_and_arpspoof/</link>
      <pubDate>Mon, 29 Jul 2024 22:40:29 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/about_link_layer_and_arpspoof/</guid>
      <description>&lt;h1 id=&#34;リンクレイヤー&#34;&gt;リンクレイヤー&lt;/h1&gt;
&lt;p&gt;MACアドレスですねー。実際に通信をする相手を指定するときはMACアドレスを指定しますね。
Network deviceがMACアドレスを持っていて、OSはIPとMACの対応表をARPテーブルに持っているんですね。
IPからMACを知ることをARP (address resolution protocol) って言いますね。&lt;/p&gt;
&lt;h1 id=&#34;脆弱性&#34;&gt;脆弱性&lt;/h1&gt;
&lt;p&gt;正直、ARPは脆弱性まみれに見える。
というのも完全に性善説に基づいているから。
「xxのIPアドレスを持っている機器はどこにありますかーー？？」に対して、「おれですー」ってやってくるやつが、本当にそうだと信じてしまう。
だからARP spoofingが簡単にできてしまうということだ。ちょっと実験してみたいよね。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;kickthemout
&lt;a href=&#34;https://github.com/k4m4/kickthemout&#34;&gt;LAN内のほかのノードを締め出すツール&lt;/a&gt;
実験していましょうか。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install git
git clone https://github.com/k4m4/kickthemout.git
sudo apt install nmap
cd kickthemout
sudo apt install pip
sudo -H pip3 install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;arpspoof
こっちの方が簡単だね。
&lt;a href=&#34;https://github.com/smikims/arpspoof&#34;&gt;arpspoof&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Learn_k8s_3</title>
      <link>https://blog.ingenboy.com/post/learn_k8s_3/</link>
      <pubDate>Sat, 27 Jul 2024 22:21:28 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s_3/</guid>
      <description>&lt;h1 id=&#34;k8s構築日記その３&#34;&gt;k8s構築日記その３。&lt;/h1&gt;
&lt;p&gt;過去の奮闘記録。
&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s/&#34;&gt;構築日記その１&lt;/a&gt;
&lt;a href=&#34;https://blog.ingenboy.com/post/learn_k8s_2/&#34;&gt;構築日記その２&lt;/a&gt;
実は今まで一回もK8S上でアプリを動かしたことがないという。
これは正直恥ずかしいですね。構築はしたが、動かせはしていないという話だな。勿体無い！！
ってことで、今回は、K8S構築日記その３ということで、構築日記その１と構築日記その２を振り返りつつ、
ちゃんとアプリをクラスタ上で動かせるようにしたいと思います。はい。動かすアプリは、そうです、例の競馬アプリです。
そして、外部に公開して、しかも、インターネットから見えるようにしたいと思う。これができるとまじで最高だぜへへ。&lt;/p&gt;
&lt;h1 id=&#34;まずは構築から昔の俺が残してくれた手順に従って構築をやります&#34;&gt;まずは構築から昔の俺が残してくれた手順に従って構築をやります。&lt;/h1&gt;
&lt;h2 id=&#34;クラスター情報&#34;&gt;クラスター情報&lt;/h2&gt;
&lt;p&gt;master : controle plane
gamma : worker
zeta : worker&lt;/p&gt;
&lt;p&gt;でやりたいと思います。ちなみにマスターのosはraspbianです。&lt;/p&gt;
&lt;h2 id=&#34;バージョン情報&#34;&gt;バージョン情報&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://containerd.io/releases/&#34;&gt;このサイト&lt;/a&gt;
を参考にバージョンを決めた。
k8s (kubelet : kubeadm) : 1.27
containerd : 1.7.0 + なので、1.7.2でインストールする。
&lt;a href=&#34;https://github.com/containerd/containerd/releases/download/v1.7.20/cri-containerd-cni-1.7.20-linux-arm64.tar.gz&#34;&gt;containerdのarmバイナリ&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;k8sを導入するまとめ&#34;&gt;k8sを導入するまとめ&lt;/h1&gt;
&lt;h2 id=&#34;1-containerdを導入&#34;&gt;1. containerdを導入。&lt;/h2&gt;
&lt;p&gt;k8sのv1.25以降は、コンテナエンジンにdockerエンジンを使えません。(理由は、dockerがcriを満たしていないから)。criを満たしてるcontainerdをインストールする必要があります。
containerdのインストールは、githubのリポジトリからできます。同時に、runcとcniもインストールしてださい。
ちなみに、cniは、container network interfaceで、まあ、コンテナのネットワークを操るためのapiですね。
で、そのapiを操るのが、cniプラグイン。で、cniプラグインには、calicoだったり、flannelだったりがあるわけですね。で、プラグインには、3種類のモードがあって、オーバーレイと、ルーティングと、アンダーレイですね。オーバレイを使うことで、別のホスト上にいるコンテナ同士が同じセグメントにいるようになります。&lt;/p&gt;
&lt;p&gt;で、だけど、/etc/cni/net.dにはデフォルトのやつ、おかなくて結構です。まったく問題ありませんので、お気になさらず。ということで。
ちなみに、これにはruncも入っているので安心してインストール/ダウンロードしてください。全く問題ないです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;wget https://github.com/containerd/containerd/releases/download/v1.7.20/cri-containerd-cni-1.7.20-linux-arm64.tar.gz
mkdir containerd_dir
mv cri-containerd-cni containerd_dir
tar xvfz cri
sudo mkdir /etc/containerd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;必要なものを必要なディレクトリに置いてくれるように以下のスクリプトを実行&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash

# Define the paths to your installation directories
CONTAINERD_BIN_DIR=&amp;#34;/usr/local/bin&amp;#34;
CONTAINERD_SBIN_DIR=&amp;#34;/usr/local/sbin&amp;#34;
CONTAINERD_ETC_DIR=&amp;#34;/etc/containerd&amp;#34;
CONTAINERD_SYSTEMD_DIR=&amp;#34;/etc/systemd/system&amp;#34;
CONTAINERD_OPT_DIR=&amp;#34;/opt/&amp;#34;

# Define the source directory where you extracted the Containerd files
SOURCE_DIR=&amp;#34;/home/ray/containerd_dir&amp;#34;

# Move binary files to /usr/local/bin
cp -r &amp;#34;$SOURCE_DIR/usr/local/bin/&amp;#34;* &amp;#34;$CONTAINERD_BIN_DIR/&amp;#34;

# Move sbin files to /usr/local/sbin
cp -r &amp;#34;$SOURCE_DIR/usr/local/sbin/&amp;#34;* &amp;#34;$CONTAINERD_SBIN_DIR/&amp;#34;

# Move etc files to /etc/containerd
cp -r &amp;#34;$SOURCE_DIR/etc/&amp;#34;* &amp;#34;$CONTAINERD_ETC_DIR/&amp;#34;

# Move systemd service file to /etc/systemd/system
cp &amp;#34;$SOURCE_DIR/etc/systemd/system/containerd.service&amp;#34; &amp;#34;$CONTAINERD_SYSTEMD_DIR/&amp;#34;

# move cni and other utils to opt
cp -r &amp;#34;$SOURCE_DIR/opt/containerd&amp;#34; &amp;#34;CONTAINERD_OPT_DIR&amp;#34; 
cp -r &amp;#34;$SOURCE_DIR/opt/cni&amp;#34; &amp;#34;CONTAINERD_OPT_DIR&amp;#34; 

# Reload systemd to recognize the new service
systemctl daemon-reload
echo &amp;#34;Containerd installed successfully.&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;nerdctlも一緒にいんすとる&lt;/p&gt;</description>
    </item>
    <item>
      <title>ルータ＋DHCPサーバ＋DNSサーバ＋K8Sコントロールプレーン on Raspi 5 with 8GB RAM（下書き）</title>
      <link>https://blog.ingenboy.com/post/router_dhcp_dsn_and_k8s/</link>
      <pubDate>Sat, 27 Jul 2024 00:24:36 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/router_dhcp_dsn_and_k8s/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;ついにインフラエンジニアになった。インフラエンジニアになったのであれば、インフラ関係を一通りこなせないと話にならないだろう！
というお話です。ということで、クラスタ作って、クラスタがいい感じに運用できるようにいろいろとインフラを構築していこうと思う。&lt;/p&gt;
&lt;p&gt;さらに言うと、業務でansibleを使っているので、IaC（インフラストラクチャasコード）を実現したいと思っている。これができればいつでもそのインフラが再現可能になるからね。練習も込みで。&lt;/p&gt;
&lt;h1 id=&#34;要件&#34;&gt;要件&lt;/h1&gt;
&lt;p&gt;完全に独立したネットワークを構築したいと思っている。そのため、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;ルータ
が必要。この時、内部ネットワークから外部にアクセスする必要がないよね。だから、natでいいわけだね。
次に、サブネット内でDHCPをしつつ、アドレスの固定を一括で管理したい。
それの実現方法がDHCPを使って、macアドレスとipを対応付けるという方法。
さらに、ネットワーク内で、ipアドレスではなく、ドメイン名でアクセスができるようにしたいので、DNSサーバも立てたい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最後、K8Sのコントロールプレーンだね。これは作りたい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;K8Sサーバに何を立てるかだけど、とりあえずechoサーバを立てて負荷試験をやってみたい。そうだね。将来的には配信サーバなどを立てられるといいのだけれど&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;後は、prometheus + graphanaで、負荷を可視化できるとなおいいよね。時系列でどれくらい負荷がかかっているのかが見れると最高だと思います。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;各サーバにいちいち入るのは面倒くさいので一括でsshしたいと思っています。これを可能にする方法を岡田さんが考えてくれました。
msshですね。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;各物理サーバラズパイのハードウェアスペック&#34;&gt;各物理サーバ（ラズパイ）のハードウェアスペック&lt;/h1&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;router : raspi 5. RAM 8G. Storage 128G&lt;/li&gt;
&lt;li&gt;beta : raspi 4. RAM 1G. Storage 32G&lt;/li&gt;
&lt;li&gt;delta: raspi4. RAM 4G Storage 64G&lt;/li&gt;
&lt;li&gt;phi (f): raspi4. RAM 8G. Storage 32G&lt;/li&gt;
&lt;li&gt;gamma: raspi4. RAM 8G Storage 128G&lt;/li&gt;
&lt;li&gt;omega: raspi4. RAM 1G storage 32G&lt;/li&gt;
&lt;li&gt;zeta: raspi4. RAM 8G&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここから使える奴だけ選抜する。
router, delta, phi, gamma, zeta
の5台。一台は、router + dhcp + dnsの役割を持たせる。
容量的にdeltaがよさそう。そのほかは、k8sクラスタになる。頑張ってくれ。
k8sちゃんと動いてくれ！!
ちなみに、&lt;/p&gt;</description>
    </item>
    <item>
      <title>Great_ssh</title>
      <link>https://blog.ingenboy.com/post/great_ssh/</link>
      <pubDate>Tue, 23 Jul 2024 09:10:07 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/great_ssh/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;openVPNを使うことでsite2siteルーティングができるようになった。
しかし、そのネットワークに参加するためにはopenVPNで発行されるクライアント証明書が不可欠である。
それが面倒くさいという話だ。
実際のアプリではL7でのやり取りが多いから、L4まで権限は必要ない。
そこで、sshを使ってhttpレイヤーでトンネルを構築しようという話だ。&lt;/p&gt;
&lt;h1 id=&#34;もうチャットgpuにききますね&#34;&gt;もうチャットGPUにききますね&lt;/h1&gt;
&lt;p&gt;My Question&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;手元のラップトップー＞踏み台サーバー＞webサーバ

があったとします。

この時、webサーバの80番ポートでhttp通信を待ち受けているサーバがいます。

手元のラップトップー＞webサーバ

にアクセスしたいです。

やり方を教えてください。
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;chatgptの回答&#34;&gt;chatGPTの回答&lt;/h1&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ssh -L 8080:192.168.1.2:80 user@bastion.example.com
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;8080はローカルマシンのポート番号
192.168.1.2はWebサーバのIPアドレス
80はWebサーバのポート番号
userは踏み台サーバのユーザー名
bastion.example.comは踏み台サーバのホスト名またはIPアドレスです。
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;ssh--lオプションとはなんなのか&#34;&gt;ssh -Lオプションとはなんなのか？&lt;/h1&gt;
&lt;p&gt;これは後で調べます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Global_Private_CGN_ip</title>
      <link>https://blog.ingenboy.com/post/global_private_cgn_ip/</link>
      <pubDate>Thu, 18 Jul 2024 18:08:55 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/global_private_cgn_ip/</guid>
      <description>&lt;h1 id=&#34;プライベートipアドレス&#34;&gt;プライベートIPアドレス&lt;/h1&gt;
&lt;p&gt;Class A: 10.0.0.0 to 10.255.255.255
This range supports a large number of hosts and is often used in very large networks.&lt;/p&gt;
&lt;p&gt;Class B: 172.16.0.0 to 172.31.255.255
This range is commonly used in medium-sized networks.&lt;/p&gt;
&lt;p&gt;Class C: 192.168.0.0 to 192.168.255.255
This range is typically used for smaller networks, like home or small business networks.&lt;/p&gt;
&lt;p&gt;合計いくつあるのでしょうか？
class Aは2^24くらいいけね？つまり？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; 2**24
16777216
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;はい、classBは？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; 16*2**16
1048576
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;classCは？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; 2**16
65536
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;グローバルipアドレス&#34;&gt;グローバルIPアドレス&lt;/h1&gt;
&lt;p&gt;はい、グローバルIPね。JPNICとか、そのへんによって管理されているやつね。
2^32個ありますね、はい。そこから上のクラスのを抜いていきます&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2**32 - 2**24 - 16*2**16 - 2**16
=4277075968
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;それでも40億箱しているって話ね。しかしだよ。これすごく重要なこと言います。実はまだグローバルに割り当てられていないIPが存在するんです。知ってましたか？？（初耳）&lt;/p&gt;</description>
    </item>
    <item>
      <title>Raft</title>
      <link>https://blog.ingenboy.com/post/raft/</link>
      <pubDate>Wed, 17 Jul 2024 16:01:42 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/raft/</guid>
      <description>&lt;h1 id=&#34;raftについて&#34;&gt;Raftについて&lt;/h1&gt;
&lt;p&gt;分散システムを勉強するのであれば、必ず必要となる。これだけ覚えておこう。
Replicate And Fault Tolerant&lt;/p&gt;
&lt;h1 id=&#34;raftの目的&#34;&gt;Raftの目的&lt;/h1&gt;
&lt;p&gt;Raftアルゴリズムの目的は、分散システムにおける信頼性の高いリーダー選出とログレプリケーションを通じて、一貫性のある状態を維持することです。具体的には、複数のノードが協調して動作し、一つのノードが故障してもシステム全体としての一貫性と可用性を保つことを目指します。&lt;/p&gt;
&lt;h1 id=&#34;raft-demo-site&#34;&gt;raft demo site&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://raft.github.io/&#34;&gt;このサイト&lt;/a&gt;を見ると、ラフトの動作が詳細までわかることでしょう。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=vYp4LYbnnW8&#34;&gt;youtube&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;目的を達成する手段&#34;&gt;目的を達成する手段&lt;/h1&gt;
&lt;p&gt;Raftアルゴリズムは、以下の手段を用いて目的を達成します：(これはそのまま、ラフトを開発した研究者のプレゼン（youtubeで見られる）で発表されていたものと同じ)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;リーダー選出：
クラスタ内の一つのノードがリーダーとして選ばれ、他のフォロワーノードに対して命令を発行します。リーダーはクライアントからのリクエストを受け取り、ログにエントリを追加します。
リーダが死んだ際には新たにリーダを選出するようにプロトコルが組まれています&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ログレプリケーション：
リーダーがクライアントからのリクエストを受け取ると、そのリクエストをログに記録し、そのログエントリをフォロワーノードに複製します。フォロワーはリーダーからの指示に従い、同じログを持つことで一貫性を保ちます。
ここは結構大事だけど、クライアントからデータを受け取るのはリーダだけです&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安全性の確保：
特定の条件下でのみリーダーが選出されるようにし、ログのコミットが保証されることで、システムの安全性と一貫性を確保します。
例えば、フォロワーの過半数がログエントリを受け取った場合にのみ、そのエントリをコミットと見なします。
また、最新のログ状態を持っているサーバしかリーダになれないようになっています。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リーダーの失敗処理：リーダーが失敗した場合、残りのノードのうち一つが新しいリーダーとして選出されます。この選出プロセスは、タイムアウトと投票を用いて実現されます。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;まとめるとこうです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Leader election&lt;/li&gt;
&lt;li&gt;Log replication&lt;/li&gt;
&lt;li&gt;safety&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;では、ここから詳細に写っていこうと思います。&lt;/p&gt;
&lt;h1 id=&#34;前提知識&#34;&gt;前提知識&lt;/h1&gt;
&lt;h2 id=&#34;エージェント各サーバの役割&#34;&gt;エージェント（各サーバの役割）&lt;/h2&gt;
&lt;p&gt;サーバは３つの状態のうちのどれか&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;follower : completely passive. Does no action. But if he doesn&amp;rsquo;t get heart beat from leader he gets anxious and try to become a leader. He tries to . They expect to get heart beat from leader.&lt;/li&gt;
&lt;li&gt;candidate: Sends RequestVotes RPCs to get elected as leader.&lt;/li&gt;
&lt;li&gt;leader: Replicate its log to the followers. Heart beats to maintain its leadershop&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If candidate or leader discovers higher terms RPC it gets back to follower.&lt;/p&gt;</description>
    </item>
    <item>
      <title>分散システム学習再始動</title>
      <link>https://blog.ingenboy.com/post/distributed_system/</link>
      <pubDate>Tue, 16 Jul 2024 23:32:39 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/distributed_system/</guid>
      <description>&lt;h1 id=&#34;出会いに感謝&#34;&gt;出会いに感謝&lt;/h1&gt;
&lt;p&gt;類は友を呼ぶとは言ったものだが、やはり部署が同じ人というのは興味も似てくる。
とはいっても、まさかTiDBやcockroachDBのコントリビュータとお友達になれるとは思わないわけで。&lt;/p&gt;
&lt;p&gt;尊敬しかない。自分はあきらめてしまった道を一人で突き進んでいったのだろう。
自分の弱さがふがいない。せっかく先陣を切ってくれた先人がいるのだから、これは後に続こうと思える。
ロールモデルがあると自分も頑張ろうと思えるわけで。こんなところで師匠に出会えるとは、、、最高すぎる。
ということで、もう一度、分散システムに挑んでみようと思う。&lt;/p&gt;
&lt;h1 id=&#34;とりあえず今日話したことをメモ&#34;&gt;とりあえず今日話したことをメモ&lt;/h1&gt;
&lt;p&gt;今のデータベース、MySQLとかはレプリケーションという技術を使って、一つのデータベースのテーブルを複数のノードにレプリケーションしている。レプリケーションされたデータが存在するノードが読み取り専用になる。マスターと呼ばれるノードは一台で、書き込みはここにだけ行われる。
しかし、これでは書き込み速度がスケールしないという問題点が生じる。そこで、noSQLというやつが出てきたんだよね。しかし、noSQLは整合性を保つのが難しいという課題があったんだよね。
そこで出てきたのがnewSQLというやつだね。tidb等。これを使うとwriteを容易にスケールすることができる。という話だ。
ほほう。なるほど。
ちなみに、俺が大好きなandrew pavloがこんな論文を出している
&lt;a href=&#34;https://db.cs.cmu.edu/papers/2016/pavlo-newsql-sigmodrec2016.pdf&#34;&gt;andrew pavlo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これによるとnewSQLの必要十分条件は、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NewSQL system’s implementation has to use (1) a
lock-free concurrency control scheme and (2) a shared-nothing
distributed architecture&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;まじか、これだけでいいのか。
&lt;a href=&#34;https://qiita.com/dulao5/items/cffdcba0669507a26e8b&#34;&gt;この記事&lt;/a&gt;がすごくいい感じに論文をまとめてくれている。&lt;/p&gt;
&lt;h1 id=&#34;データベースの種類&#34;&gt;データベースの種類&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;RDBMS: mysql, postgresqlなど&lt;/li&gt;
&lt;li&gt;noSQL: cassandra, dynamodb&lt;/li&gt;
&lt;li&gt;newSQL: TiDB, cochroachDB&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;自分が過去に書いたデータベース関係の記事を見返したい&#34;&gt;自分が過去に書いたデータベース関係の記事を見返したい&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.ingenboy.com/post/tidb/&#34;&gt;TiDBについて調べていた時期もありましたねー&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;流れ&#34;&gt;流れ&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; まずはraftについてちゃんと理解するのが大事だと思う。実は完全に理解したとはいいがたい。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 分散データベースを作るならまずは分散してないデータベースを作れないといけない。ということで、CMUのbustubの講義は受けなおした方がいい。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 分散システムを理化するためにデータ志向アプリケーションを読もう。頼んだ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; いきなりだが、TiDBを読み込もう。cochroachDBでもいいと思う。この時にdesign Docsを読むのがいいらしい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;その他の疑問&#34;&gt;その他の疑問&lt;/h1&gt;
&lt;p&gt;シャーティングという技術がある。
これは、データを複数のノードに分散して格納することで、検索速度を上げる方法。
RAID0（ストライピング）とはまた別なのね？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;シャーディング（Sharding）
目的：データを分割して、複数のデータベースサーバに分散させ、スケーラビリティを向上させることです。

特徴：

データベース全体を論理的に分割し、それぞれの部分を「シャード」と呼ばれる個別のデータベースに保存します。
各シャードは独立したデータベースとして動作し、特定のデータサブセットを保持します。
シャードは水平分割とも呼ばれ、特定のキー（例：ユーザーID、地域、日時など）に基づいてデータを分割します。
データの分割によって、単一のデータベースサーバにかかる負荷を分散させ、スケーラビリティとパフォーマンスを向上させます。
例：

ユーザーIDに基づいて、ユーザーデータをシャードA、シャードB、シャードCに分割する。
ストライピング（Striping）
目的：データを分散してストレージパフォーマンスを向上させることです。主にデータの読み書き速度を向上させるために使用されます。

特徴：

単一のファイルやデータセットを複数のストレージデバイスに均等に分割して保存します。
各ストライプは連続したデータブロックを含み、ストライプ単位で並行して読み書きが行われます。
RAID（Redundant Array of Independent Disks）のコンセプトの一つであり、特にRAID 0が代表的です。
ストライピングは、ディスクI/O性能を向上させるために使用されますが、冗長性やフェールオーバーの機能はありません（特にRAID 0では）。
例：

1GBのファイルを4つのディスクに分割し、各ディスクに256MBずつ書き込む。
まとめ
シャーディングは、データベース全体を複数のシャードに分割し、各シャードを異なるサーバに分散させることで、スケーラビリティとパフォーマンスを向上させる手法です。
ストライピングは、データを複数のストレージデバイスに均等に分割して並行して読み書きすることで、ストレージのパフォーマンスを向上させる手法です。
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;ストライピングとシャーティングの両方を使うことはできますか&#34;&gt;ストライピングとシャーティングの両方を使うことはできますか？&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Mac_cheat_sheet</title>
      <link>https://blog.ingenboy.com/post/mac_cheat_sheet/</link>
      <pubDate>Fri, 12 Jul 2024 14:49:22 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/mac_cheat_sheet/</guid>
      <description>&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;いや、会社入るまでずっとwindowsユーザだったんですよ。だから最初マック渡されたときはだいぶ戸惑いましたね。
しかし、慣れてくると今度は逆にウィンドウズが気持ち悪くなってくるんですよね。画面の切り替えができないのがマジでつらいということに築きました。
しかし、Macにはまだまだたくさんの裏技があると俺は知っています。ここで全部洗いだしてしまおうと思います。&lt;/p&gt;
&lt;h1 id=&#34;マックのチートシート&#34;&gt;マックのチートシート&lt;/h1&gt;
&lt;p&gt;まずはよく使うショートカットキー4つを覚えておきたいと思います&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;commandキー
optioinキー
shiftキー
controlキー
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;アプリケーションの切り替え&#34;&gt;アプリケーションの切り替え&lt;/h1&gt;
&lt;p&gt;command + tab&lt;/p&gt;
&lt;h1 id=&#34;ページ先頭末尾に移動する&#34;&gt;ページ先頭/末尾に移動する&lt;/h1&gt;
&lt;p&gt;comamnd + 上矢印/下矢印&lt;/p&gt;
&lt;p&gt;windowdではctrl + fn + &amp;lt;-/-&amp;gt;&lt;/p&gt;
&lt;h1 id=&#34;クロームでタブを切り替え&#34;&gt;クロームでタブを切り替え&lt;/h1&gt;
&lt;p&gt;Command + option&lt;/p&gt;
&lt;h2 id=&#34;全画面スクショ&#34;&gt;全画面スクショ&lt;/h2&gt;
&lt;p&gt;shift + command + 3&lt;/p&gt;
&lt;h2 id=&#34;範囲指定スクショ&#34;&gt;範囲指定スクショ&lt;/h2&gt;
&lt;p&gt;shift + command + 4&lt;/p&gt;
&lt;h2 id=&#34;chromeタブの切り替え&#34;&gt;chromeタブの切り替え&lt;/h2&gt;</description>
    </item>
    <item>
      <title>GSLB_and_DNS</title>
      <link>https://blog.ingenboy.com/post/gslb_and_dns/</link>
      <pubDate>Tue, 09 Jul 2024 00:34:03 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/gslb_and_dns/</guid>
      <description>&lt;h1 id=&#34;gslbとは&#34;&gt;GSLBとは&lt;/h1&gt;
&lt;p&gt;はい、GSLB（Global Server Load Balancing）について知っています。GSLBは、複数の地理的に分散したサーバー間でネットワークトラフィックを効果的に分散するための技術です。これにより、以下のような利点が得られます。&lt;/p&gt;
&lt;p&gt;高可用性: サーバーの障害が発生した場合でも、トラフィックを他の健全なサーバーにリダイレクトすることでサービスの継続性を確保します。
負荷分散: トラフィックを複数のサーバーに分散することで、特定のサーバーに過負荷がかかるのを防ぎます。
低遅延: ユーザーに最も近いサーバーにトラフィックをルーティングすることで、応答時間を短縮します。
災害復旧: 地理的に分散したサーバーを利用することで、特定地域での災害や障害に対する耐性を向上させます。
GSLBは、DNSベースの方法や、アプリケーション層でのルーティングを使用して実現されることが一般的です。具体的な実装方法や製品には、以下のようなものがあります。&lt;/p&gt;
&lt;p&gt;DNSラウンドロビン: 最も基本的なGSLBの方法で、DNSサーバーが複数のIPアドレスを順番に返すことで負荷を分散します。
Anycast: 同じIPアドレスを複数の地理的に分散したサーバーに割り当て、最も近いサーバーにトラフィックをルーティングします。
商用製品: F5 NetworksのBIG-IP、CitrixのNetScaler、Amazon Web ServicesのRoute 53など、さまざまな商用ソリューションがあります。
GSLBは、大規模なWebサービスやクラウドサービスでよく利用される技術です。&lt;/p&gt;
&lt;h2 id=&#34;僕の質問&#34;&gt;僕の質問&lt;/h2&gt;
&lt;p&gt;一般ユーザはDNSを介してどのサーバにアクセスするかがきいまると思います。また、DNSは裏でGSLBと繋がっていて、一般ユーザー＞DNS -&amp;gt; GSLBという流れでリクエストが流れると思います。この認識は合っていますか？&lt;/p&gt;
&lt;h2 id=&#34;chatgptの回答&#34;&gt;chatGPTの回答&lt;/h2&gt;
&lt;p&gt;基本的な認識は合っていますが、もう少し詳細に説明すると、DNSとGSLBの関係は次のようになります。&lt;/p&gt;
&lt;p&gt;一般ユーザーのリクエスト: 一般ユーザーがウェブサイトにアクセスしようとすると、まずDNSリクエストが発生します。このリクエストは、ユーザーが入力したドメイン名をIPアドレスに変換するためのものです。&lt;/p&gt;
&lt;p&gt;DNSサーバーの役割: DNSサーバーは、このドメイン名に対応するIPアドレスを返します。ここで、GSLBがDNSサーバーに組み込まれているか、もしくはGSLBがDNSサーバーと連携しています。&lt;/p&gt;
&lt;p&gt;GSLBの動作: GSLBは、複数の地理的に分散したサーバーの中から最適なサーバーを選択し、そのサーバーのIPアドレスをDNSサーバーに返します。選択基準には、サーバーの負荷、地理的な距離、ネットワークの遅延などが含まれます。&lt;/p&gt;
&lt;p&gt;DNSの応答: DNSサーバーは、GSLBから受け取った最適なサーバーのIPアドレスをユーザーに返します。&lt;/p&gt;
&lt;p&gt;ユーザーのアクセス: 最終的に、ユーザーのブラウザは返されたIPアドレスを使って直接サーバーにアクセスします。&lt;/p&gt;
&lt;p&gt;この流れを図にすると以下のようになります：&lt;/p&gt;
&lt;p&gt;mermaid&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sequenceDiagram
    participant User as 一般ユーザー
    participant DNS as DNSサーバー
    participant GSLB as GSLBシステム
    participant Server as 最適なサーバー
    
    User-&amp;gt;&amp;gt;DNS: ドメイン名の解決リクエスト
    DNS-&amp;gt;&amp;gt;GSLB: 最適なサーバーのIPアドレスを要求
    GSLB-&amp;gt;&amp;gt;DNS: 最適なサーバーのIPアドレスを返す
    DNS-&amp;gt;&amp;gt;User: IPアドレスを返す
    User-&amp;gt;&amp;gt;Server: サーバーにアクセス
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このように、一般ユーザーのリクエストは最終的にはDNSを介してGSLBによって選ばれた最適なサーバーに到達します。DNSはGSLBと連携して動作し、ユーザーに最適なサーバーのIPアドレスを提供します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vim_cheat_sheet</title>
      <link>https://blog.ingenboy.com/post/vim_cheat_sheet/</link>
      <pubDate>Mon, 08 Jul 2024 18:06:37 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vim_cheat_sheet/</guid>
      <description>&lt;h1 id=&#34;vimのチートシート&#34;&gt;vimのチートシート&lt;/h1&gt;
&lt;h1 id=&#34;基本&#34;&gt;基本&lt;/h1&gt;
&lt;p&gt;行番号の表示：カーソルモード（esc）を押した状態で、 :set nonumber&lt;/p&gt;
&lt;h1 id=&#34;中堅&#34;&gt;中堅&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;I : カーする業の行頭から挿入モードに遷移する&lt;/li&gt;
&lt;li&gt;gI: カーソル行の行頭から挿入モードに遷移&lt;/li&gt;
&lt;li&gt;dd : カーソルがいる行を削除&lt;/li&gt;
&lt;li&gt;ndd : カーソルがいる行からn行削除
e.g., 10dd : カーソルがいる行から10行削除&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;j : to down
k : to up
h : to the left
l : to the right&lt;/p&gt;
&lt;p&gt;複数選択
v : visual modeに入ってから、カーソルキーで複数選択。
さらにyをすることでやんく（こぴー）が可能。これは&lt;/p&gt;
&lt;h1 id=&#34;応用&#34;&gt;応用&lt;/h1&gt;</description>
    </item>
    <item>
      <title>screwdriverでci/cdパイプラインを作る</title>
      <link>https://blog.ingenboy.com/post/cicd_screwdriver/</link>
      <pubDate>Mon, 08 Jul 2024 12:02:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/cicd_screwdriver/</guid>
      <description>&lt;h1 id=&#34;screwdrivercdでcicdパイプラインを作成&#34;&gt;screwdriver.cdでci/cdパイプラインを作成&lt;/h1&gt;
&lt;p&gt;自動デプロイをしたい。
github actionsを使うとself-hosted runnerを使って自動デプロイができるようになる。
がself-hosted runnerはどうやらプライベートリポジトリにしか使えないみたいなんだよね。
ってことでプライベートリポジトリをscrewdriver.cdと連携して、自分のプロジェクトで使えるようにしたい。&lt;/p&gt;
&lt;h1 id=&#34;導入方法&#34;&gt;導入方法&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://screwdriver.cd/&#34;&gt;公式ホームページ&lt;/a&gt;に書いてある通りに、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python &amp;lt;(curl -L https://tinyurl.com/sd-in-a-box)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;を実行する。これをやると&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This command will run a script that will create a Docker Compose file for you locally, complete with Oauth credentials using a generated JWT and a user-provided Oauth Client ID and secret. If you choose to do so, it will then Docker pull the Screwdriver API, UI, and log store images to bring up an entire Screwdriver instance locally for you to play with. All data written to a database will be stored in a data/ directory. For more configuration details, see our SD-in-a-box documentation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>LocalLLM</title>
      <link>https://blog.ingenboy.com/post/localllm/</link>
      <pubDate>Sun, 07 Jul 2024 23:08:04 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/localllm/</guid>
      <description>&lt;h1 id=&#34;何の記事&#34;&gt;何の記事&lt;/h1&gt;
&lt;p&gt;ローカルホストにLLMをインストールし、性能を検証。
またapiを介して利用可能にする方法を検証。
最後に、社内のことを学ばせて、こういう質問が来たらこう答えてねってのを教え込ませる。&lt;/p&gt;
&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;p&gt;自宅には計算資源がたくさんある。
それをネットワーク越しに使えるということがわかったので、LLM等の重い処理も自宅で動かして、軽量なフロントエンドと連携させる、
みたいなことが非常に簡単にできるということがわかった。
LLMで何をしたいか？？お客さんからの問い合わせに自動で答えるチャットボットを作りたいのよね。
うん、社内の情報とかを学ばせないといけない。その辺のファインチューニングの仕方も知りたい。&lt;/p&gt;
&lt;h1 id=&#34;参考記事&#34;&gt;参考記事&lt;/h1&gt;
&lt;p&gt;[ollamaについて] (&lt;a href=&#34;https://bhrtaym-blog.com/?p=407&#34;&gt;https://bhrtaym-blog.com/?p=407&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;[ローカルLLMをGPUで動かす] (&lt;a href=&#34;https://zenn.dev/giana12th/articles/7fc22c8cbdbb5e&#34;&gt;https://zenn.dev/giana12th/articles/7fc22c8cbdbb5e&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ollama.com/library&#34;&gt;ollama公式サイト&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/ollama/ollama&#34;&gt;ollamaのgithub&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;proxmoxで動かすための下準備&#34;&gt;proxmoxで動かすための下準備&lt;/h1&gt;
&lt;p&gt;GPUをパススルー必要がある。
あと、一番大きいモデルでは何倍とメモリが必要なんだっけ？
64GB以上あれば問題ないらしい。のでとりあえずそれをインストールしようと思う。&lt;/p&gt;
&lt;p&gt;あとは、ProxmoxでGPUをパススルーする方法。
あー、「ホストマシンのBIOSにて、VT-x, VT-d を有効にする。(VT-d は PCI Passthrough で必須)」
する必要があるらしい。
しかし、実はCPUの仮想化をした時点でGPUの仮想化もできるようになってたっぽい。&lt;/p&gt;
&lt;p&gt;でした準備は完了した。がメモっておくか&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;proxmoxのコンソールから、add hardware PCIeを選択し、GPUを入れる。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nvidia-driverをインストール&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nvidia-smiが使えるか確認。認識されているかも確認
ちなみに、ここでcudaのバージョンが出てくるけど、これは対応しているcudaのバージョンを示しているだけで実際にcudaがインストールされたわけではありません。そこを気を付けてください。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;cuda（ランタイム）をインストール
しかし、これはdocker等で、cudaが入ったコンテナを配ってもらえれば終わる話なので、無視でいいのかな？？ちょっと調べてみよう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;proxmoxのCPUのtypeをhostに変える。これをやらないとavx命令が使えない。これゆえGPUが使われなくなってしまう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ollamaのインストール&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;dockerもある。
&lt;a href=&#34;https://hub.docker.com/r/ollama/ollama&#34;&gt;ollama on docker&lt;/a&gt;
これを参考にnvidia-container-toolkitをインストールする感じか。&lt;/p&gt;
&lt;h1 id=&#34;docker-install後の苦戦&#34;&gt;docker install後の苦戦&lt;/h1&gt;
&lt;p&gt;docker上のollama上で、llama3を動かすことには成功したんですよ。しかし、どうやらGPUでは動かせていいない。これはなんでかわかりました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;time=2024-07-19T00:29:37.242Z level=WARN source=gpu.go:225 msg=&amp;#34;CPU does not have minimum vector extensions, GPU inference disabled&amp;#34; required=avx detected=&amp;#34;no vector extensions&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;CPUがavx命令をサポートしていないとGPUにオフロードされないみたいですね。
ほかのところでも同じことが言われていました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; GPU support requires the AVX instruction set, check your CPU model.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;つまり、ProxmoxでどうにかしてavxをOnにする必要があるということです。
これのやり方ですが、cpuのtypeをホストにしたら解決するようです。ってことで変えて再起動します。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxmoxサーバ爆誕</title>
      <link>https://blog.ingenboy.com/post/proxmox/</link>
      <pubDate>Sat, 06 Jul 2024 13:11:18 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/proxmox/</guid>
      <description>&lt;h1 id=&#34;何の記事か&#34;&gt;何の記事か&lt;/h1&gt;
&lt;p&gt;Proxmoxという仮想マシン専用のマシンを立てる方法。そして遊んでみる。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;[proxmoxのインストール方法] (&lt;a href=&#34;https://qiita.com/C_Kenta/items/70ecb32495fce9e1de52&#34;&gt;https://qiita.com/C_Kenta/items/70ecb32495fce9e1de52&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/stLuciano/items/49652543192f2402e7c8&#34;&gt;proxmoxを使ってできること&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;proxmoxとは何か&#34;&gt;Proxmoxとは何か&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;ProxmoxはDebianベースの仮想化プラットフォームです。操作はすべてWeb インターフェースで行うことができ、仮想マシンやLinuxコンテナを簡単に作成することができます。バックアップを簡単に作成でき、修復も非常に容易です。ハードウェアパススルーも可能で、USBカメラ、マウス、キーボードなどのデバイスをVMに渡すことができます。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;ひところ&#34;&gt;ひところ&lt;/h2&gt;
&lt;p&gt;えぐい&lt;/p&gt;
&lt;h1 id=&#34;立てる&#34;&gt;立てる&lt;/h1&gt;
&lt;p&gt;手順&lt;/p&gt;
&lt;h2 id=&#34;公式から&#34;&gt;公式から&lt;/h2&gt;
&lt;p&gt;proxmoxのisoを持ってくる。以上。&lt;/p&gt;
&lt;h2 id=&#34;インストール時の注意点&#34;&gt;インストール時の注意点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;最新のをインストールしようとしたら、waitinig for /dev fully populated
的なのが出てきたけど、それは一個前のどの手段でインストールするかのところでeを押して、カーネルのブートパラメータにnomodesetをつけると解消された。よろぴく&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実はVMてハードウェアの動きをソフトウェアでエミュレートする方法と、
もう一つKVMってのがあってね、KVMの方が圧倒的に速いわけですよ。んでね、
KVM hardware virtualizationってのをOFFにすると、ソフトウェアでエミュレートになる。しかし、これは遅いからKVM hardware virtualizationはONにした方がいい。しかし、ONにするにはBIOSでKVMをonにする設定を施さないといけない。それはリモートからではできないって話だな。乙。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;BIOSのKVM VirtualizationをOFFにしたままUbuntuを走らせようとしたらこう怒られました。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;KVM virtualisation configured, but not available. Either disable in VM configuration or enable in BIOS.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;advanced setting -&amp;gt; CPU Configuration -&amp;gt; SVM Mode -Enable &amp;gt; Save &amp;amp; reset
これをやらないと勝ちで遅すぎて話にならなかった。すべてが遅すぎる。
マジで、CPUの動きをエミュレートする仮想化は、KVMと比べて10倍遅かった。えぐい。&lt;/p&gt;
&lt;h1 id=&#34;gpuのパススルー&#34;&gt;GPUのパススルー&lt;/h1&gt;
&lt;p&gt;これが結構面倒くさい。
VM上でOllama立ててllmを動かそうとしているんだけど、なかなかうまくいかない。
これはchatgptから得た回答だから、確証はないんだけど、参考にしてほしい。
chatgpt曰く、やらないといけないことは二つ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enabling IOMMU&lt;/li&gt;
&lt;li&gt;Enabling VFIO&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;enabling-iommu&#34;&gt;Enabling IOMMU&lt;/h2&gt;
&lt;p&gt;これは何をやっているかだけど、&lt;/p&gt;</description>
    </item>
    <item>
      <title>KVM_server_and_ansible</title>
      <link>https://blog.ingenboy.com/post/kvm_server_and_ansible/</link>
      <pubDate>Sat, 06 Jul 2024 12:11:18 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/kvm_server_and_ansible/</guid>
      <description>&lt;h1 id=&#34;何の記事か&#34;&gt;何の記事か&lt;/h1&gt;
&lt;p&gt;LinuxサーバでKVMを使った仮想マシン (VM)を立てられるようにし、
&lt;a href=&#34;https://github.com/kimchi-project/kimchi&#34;&gt;KIMCH&lt;/a&gt; を使い、webコンソールからVMを立てられるようにし、さらにansibleでVMにインフラのデプロイ、そしてネットワークなどをいじる記事&lt;/p&gt;
&lt;h1 id=&#34;雑談&#34;&gt;雑談&lt;/h1&gt;
&lt;p&gt;はい、完全に分離された自宅ネットワークでしたが、openVPNを使ったsite2site接続により、外からアクセスできるようになってしまった。これがマジで恐ろしい話や。
再びコンピュータを勉強する気力がわいてきたって話だ。頑張るぞい。&lt;/p&gt;
&lt;p&gt;dkong上で動かそうと思う。自宅ネットワークでのdkongのipアドレスは
100.64.1.70や。VPNを使えばいつでもアクセスが可能になる。さらにインターネット上のhugo_serverのnginxでvpnをとおしてプロキシすることもできるので、実質インターネットに接しているdkongってわけだ。ネットワークえぐい。&lt;/p&gt;
&lt;h1 id=&#34;インストール手順&#34;&gt;インストール手順&lt;/h1&gt;
&lt;p&gt;基本的には&lt;a href=&#34;https://github.com/kimchi-project/kimchi&#34;&gt;KIMCH&lt;/a&gt;ここに書いてある通りに進めれば問題ない。&lt;/p&gt;
&lt;h2 id=&#34;1-wokのインストール&#34;&gt;1. Wokのインストール&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/kimchi-project/wok/#getting-started&#34;&gt;Wokとは&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;wokのリポジトリをクローン&#34;&gt;Wokのリポジトリをクローン&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/kimchi-project/wok.git
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wok依存ライブラリやランタイムなどをインストール&#34;&gt;wok依存ライブラリやランタイムなどをインストール&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install -y python3-pip

sudo -H pip3 install -r requirements-dev.txt

sudo apt install -y gcc make autoconf automake git python3-pip python3-requests python3-mock gettext pkgconf xsltproc python3-dev pep8 pyflakes3 python3-yaml

sudo apt install -y systemd logrotate python3-psutil python3-ldap python3-lxml python3-websockify python3-jsonschema openssl nginx python3-cherrypy3 python3-cheetah python3-pam python3-m2crypto gettext python3-openssl
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wokをビルド-and-install&#34;&gt;Wokをビルド and install&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo ./autogen.sh --system
make
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wokを起動&#34;&gt;wokを起動&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo python3 src/wokd
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;wokにブラウザでアクセス&#34;&gt;wokにブラウザでアクセス&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://100.64.1.70:8001/login.html
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;初期パスワードを入力してログイン&#34;&gt;初期パスワードを入力してログイン&lt;/h3&gt;
&lt;p&gt;これ、ログインクレデンシャル、システムのとおんなじなのがすごい。びっくり！&lt;/p&gt;</description>
    </item>
    <item>
      <title>2024July_TODO</title>
      <link>https://blog.ingenboy.com/post/2024july_todo/</link>
      <pubDate>Fri, 05 Jul 2024 19:58:40 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/2024july_todo/</guid>
      <description>&lt;h1 id=&#34;2024075時点でのタスクリスト&#34;&gt;2024/07/5時点でのタスクリスト&lt;/h1&gt;
&lt;h4 id=&#34;開発関係&#34;&gt;開発関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 研修で作ったフリマアプリ、まるまる自分のものにしよう。じっさいしてええやろ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; JC_booking_centerを早く稼働させてくれ、同時にjc_licence_translationを早く作ってくれ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; La_keibaのTODO LISTをすべて解消してくれ。TODOの解消はもういいから、ラズパイでk8sクラスタを完成させてくれ。んで、そのうえでこのサービスを展開して。さらに、blog.ingenboy.comの8080をsite to siteのトンネルを通してうちのk8sクラスタにつなげる感じにしたらめっちゃおもろないか？？えぐいよね。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Go言語でdistributed file systemを作ってくれ！&lt;a href=&#34;https://www.youtube.com/watch?v=IoY6bE--A54&#34;&gt;このyoutubeを見て&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Grafanaを使っていろいろと可視化してみたい。DBは自分で用意する必要があるのかな？？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 分散システムの勉強を続けてくれ。頼む。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; buy raspberry pi 5 and run k8s on it using ansible.&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Monitory the above k8s system using grafana and prometheus and make it possible to access the server from outside.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; APDCMのJournal書いてくれ！！たしか、July 30が締め切り。やらないとなーーー。せっかくだからjournal一本出したいよね。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎日筋トレしてくれ。ジムに行ってくれ。朝がいい。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎朝早く起きてくれ。23時に寝て0630に起きる生活ができると最高だ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早く業務委託で何かしらの案件を取ってきて売れ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; なんかいい研究ネタがないか、せんせいにきいてくれ！配属されたら意外と退屈しないかもしれないけど。。。やっぱり分散ストレージとか、分散システムとか、なんか知らんけどその辺にすごいひかれる。そもそも分散しているのに強調して動くシステムはすごく惹かれる。k8sとかね。しかしk8sはあまりにもインフラすぎる。できればもう一つ上のレイヤーで動く何かが作りたいって話だ。&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早くyoutubeチャンネル開設して、経費生活を始めてくれ！&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;今の部署との付き合い方&#34;&gt;今の部署との付き合い方&lt;/h4&gt;
&lt;p&gt;ほとんどコードを書くことはない。
なので、コードを書かないとコーディング力はみるみる落ちていくと思われる。
しかし、そのようなことが起こってはいけない。マジでだめ。
つまり、自分でどうにかしてコーディングをしないといけない。一日、7.5hは仕事をする必要がある。
このうち、仕事自体は6hで、んで、自分のタスクに2h-2.5hかけられるといいね。
自分のタスクを何にするか？それがすごく大事。まあやらないといけないタスクは実際たくさんある。上のやつね。
それを一つ一つやっていくしかないかな。インプットもちゃんとやっていこうな。
これだけど、分散システムを勉強する時間にする。よろしく頼む。もう一回、本気で分散システムを勉強しようって思った。&lt;/p&gt;</description>
    </item>
    <item>
      <title>site to site routing (VPN)</title>
      <link>https://blog.ingenboy.com/post/site2site_vpn/</link>
      <pubDate>Fri, 05 Jul 2024 16:32:56 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/site2site_vpn/</guid>
      <description>&lt;h1 id=&#34;何の記事&#34;&gt;何の記事&lt;/h1&gt;
&lt;p&gt;vpnサーバに接続してきたvpnクライアントがいるネットワークに、vpnサーバからアクセスできるようにする方法の手順を解説
ちなみに、これはCloudflaairとかいう会社が提供しているzero trustっていうサービスと同等のことを可能にしてくれる。&lt;/p&gt;
&lt;h1 id=&#34;初めに&#34;&gt;初めに&lt;/h1&gt;
&lt;p&gt;VPNサーバを立てて、VPNクライアントのパケット通信をVPNサーバを通すようにすることはできていた。
これによって、クライアントはサーバと同じネットワーク上にいるかのようにふるまうことができていたわけだね。
しかしこの逆ができなかったのですよ。
つまり、
サーバがクライアントのネットワークにいるかの如くふるまうように設定することがずっとできなかったんですよね。
その必要性も当時はあまりなかったからね。&lt;/p&gt;
&lt;p&gt;だが、この度新しいおうちに引っ越して、「単一のグローバルipが与えられておりポート開放できるルータがある」環境を失ってしまった。
外からアクセスできないんですよね、今のうちのネットワーク環境だと。
家の外に借りたVPSは結構あって、そこにVPNサーバを立てることはできる。
そこで今まで試したけど挫折してきた、「隔絶されたネットワークに、そのネットワークにいるvpnクライアントを介してアクセスする方法」。
今回はそれを可能にする方法を教えます。
ちなみに、二つの異なるネットワークセグメントをvpnサーバとvpnクライアントを使って完全につなげることを、
「site to site routing」といいます。マジでかっこいいですね。あこがれちゃいます。そんな憧れを、今回、達成してしまうんです。&lt;/p&gt;
&lt;p&gt;これによって、「remote.it」のように、ポート開放をしていない、隔絶されているネットワーク環境に、外からアクセスできるようになるんです。えぐいですねーーー。えぐい。とにかくえぐい。&lt;/p&gt;
&lt;h1 id=&#34;参考記事&#34;&gt;参考記事&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/noraworld/items/2fe6be489e1d93c748b8&#34;&gt;記事1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/sugimount/items/aa434d74cb241b58651d&#34;&gt;記事2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://openvpn.net/as-docs/site-to-site-routing.html#site-to-site-benefits&#34;&gt;openVPN公式&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;site2siteに関しては二つ目がかなりいい感じにまとめてくれています。&lt;/p&gt;
&lt;h1 id=&#34;まずはいつも通り普通にopenvpnサーバを立てる&#34;&gt;まずはいつも通り普通にopenvpnサーバを立てる&lt;/h1&gt;
&lt;h2 id=&#34;openvpnとeasy-rsaのインストール&#34;&gt;OpenVPNとeasy-rsaのインストール&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo yum install openvpn easy-rsa -y
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;easy-rsaを使って証明書関係を作る&#34;&gt;easy-rsaを使って証明書関係を作る&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa init-pki
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ca証明書を作成&#34;&gt;ca証明書を作成&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-ca
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;*ca証明書＝認証局(ca)証明書。
認証局(CA)とは、ウェブサイトやその他の独立した存在などに、デジタル証明書を発行する信頼できる組織。&lt;/p&gt;
&lt;p&gt;できたら移動しておく&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cp pki/ca.crt /etc/openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;diffie-helman-parameterを生成&#34;&gt;diffie-helman parameterを生成&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa gen-dh
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;移動しておく&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo cp pki/dh.pem /etc/openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;certificate-revocation-list-crl-を生成&#34;&gt;Certificate Revocation List (CRL) を生成&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa gen-crl
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;openvpn-serverように証明書と秘密鍵を生成サーバ証明書の生成&#34;&gt;OpenVPN Serverように証明書と秘密鍵を生成　（サーバ証明書の生成）&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-server-full server nopass
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;移動しておく&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo cp pki/issued/server.crt /etc/openvpn
sudo cp pki/private/server.key /etc/openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;クライアント証明書と秘密鍵を生成&#34;&gt;クライアント証明書と秘密鍵を生成&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-client-full username
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;各コマンドの詳しい説明&#34;&gt;各コマンドの詳しい説明&lt;/h1&gt;
&lt;h2 id=&#34;easyrsa-build-ca&#34;&gt;./easyrsa build-ca&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-ca コマンドは、
Easy-RSAツールを使用して
新しい認証局（CA）のルート証明書と秘密鍵を生成するためのものです。
認証局は、VPN証明書を発行および署名するために使用されます。
このプロセスは通常、VPNサーバーをセットアップする最初のステップの一つです。

具体的には、このコマンドは以下の操作を行います：

CAの秘密鍵の生成：認証局（CA）の秘密鍵を生成します。
この鍵は、CAによって発行される証明書に署名するために使用されます。

CAの自己署名証明書の生成：CAの自己署名証明書を生成します。
この証明書は、CA自身が正当な認証局であることを証明します。

このコマンドを実行すると、以下のファイルが生成されます：

ca.crt: CAの自己署名証明書
ca.key: CAの秘密鍵
これらのファイルは、VPNサーバーの証明書発行および署名プロセスで使用されます。
具体的には、CAの秘密鍵 (ca.key) は秘密に保管されるべきであり、
CAの証明書 (ca.crt) はクライアントと共有され、
クライアントはこれを使用してサーバー証明書の有効性を検証します。

証明書には公開鍵も含まれていると考えていいです。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;easyrsa-build-server-full-server-nopass&#34;&gt;./easyrsa build-server-full server nopass&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-server-full server nopass コマンドは、Easy-RSAツールを使用してOpenVPNサーバーの証明書と秘密鍵を生成するためのものです。このコマンドは、サーバー証明書を生成し、その秘密鍵にパスフレーズを設定せずに保存します。

具体的には、このコマンドは以下の操作を行います：

サーバー証明書の生成：指定された名前（この場合は server）でサーバー証明書を生成します。この証明書はサーバーがVPNクライアントに自身を証明するために使用されます。

サーバーの秘密鍵の生成：サーバー証明書と一緒に使用される秘密鍵を生成します。この秘密鍵は、VPN接続を暗号化するために使用されます。

証明書署名要求（CSR）の作成および署名：証明書署名要求（CSR）を作成し、それを認証局（CA）で署名することで有効な証明書を生成します。

パスフレーズの省略：nopassオプションにより、生成される秘密鍵にはパスフレーズが設定されません。これにより、サーバーが起動するたびにパスフレーズを入力する必要がなくなります。

このコマンドを実行すると、通常、以下のファイルが生成されます：

server.crt: サーバー証明書
server.key: サーバーの秘密鍵
server.req: 証明書署名要求（CSR）
これらのファイルは、OpenVPNサーバー設定に必要なものであり、適切に保管されるべきです。特に、server.key は秘密に保つ必要があります。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;easy-gen-dh&#34;&gt;./easy gen-dh&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa gen-dh コマンドは、Easy-RSAツールを使用してDiffie-Hellman（DH）パラメータを生成するためのものです。DHパラメータは、VPNサーバーとクライアント間で安全にキー交換を行うために使用されます。これにより、セッションごとに異なる鍵が生成され、通信のセキュリティが強化されます。

具体的には、このコマンドは以下の操作を行います：

Diffie-Hellmanパラメータの生成：DH鍵交換プロトコルに使用されるパラメータを生成します。これらのパラメータは、安全な通信チャネルを確立するために必要です。

生成されたファイルの保存：生成されたDHパラメータは、VPNサーバーの設定で使用されます。

このコマンドを実行すると、以下のファイルが生成されます：

dh.pem: Diffie-Hellmanパラメータ
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;easyrsa-gen-crl&#34;&gt;./easyrsa gen-crl&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa gen-crl コマンドは、Certificate Revocation List (CRL) を生成するためのものです。CRLは、無効または失効された証明書のリストを保持し、認証局（CA）が管理します。

具体的には、このコマンドは以下の操作を行います：

CRLの生成：現在の認証局の設定に基づいて、新しいCRLファイルを生成します。このファイルには、CAによって失効された証明書のリストが含まれています。

既存の失効証明書の確認：CRLを生成する際に、すでに失効されている証明書が正しくリストに含まれていることを確認します。

CRLは、VPNサーバーやその他のサービスがクライアント証明書の有効性を確認するために使用されます。具体的には、クライアントがVPNに接続しようとする際、サーバーはそのクライアントの証明書がCRLに含まれていないことを確認することで、失効された証明書による不正アクセスを防ぎます。

生成されたCRLファイルは通常、crl.pem という名前で保存されます。このファイルは、VPNサーバーの設定に組み込まれる必要があります。例えば、OpenVPNサーバーでは、crl-verify オプションを使用してこのCRLファイルを指定します。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;easyrsa-build-client-full-username&#34;&gt;./easyrsa build-client-full username&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
このコマンドは、Easy-RSAツールを使用してOpenVPNクライアント証明書と鍵を生成するためのものです。具体的には、build-client-fullコマンドは以下の操作を行います：

クライアント証明書の生成：指定されたユーザー名（この場合はusername）に対して、クライアント証明書を生成します。証明書はクライアントがVPNに接続するために必要なものであり、認証局（CA）によって署名されます。

クライアントの秘密鍵の生成：クライアント証明書と一緒に使用される秘密鍵を生成します。この鍵は、クライアント証明書とともにVPN接続を確立するために必要です。

証明書署名要求（CSR）の作成および署名：証明書署名要求（CSR）を作成し、それを認証局（CA）で署名することで有効な証明書を生成します。

このコマンドを実行すると、通常、以下のファイルが生成されます：

username.crt: クライアント証明書
username.key: クライアントの秘密鍵
username.req: 証明書署名要求（CSR）
これらのファイルは、VPNクライアント設定に必要なものであり、適切に保管されるべきです。クライアントはこれらの証明書と鍵を使用してOpenVPNサーバーに接続し、暗号化された通信を確立します。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;以上の鍵が生成される順番とこれらのカギを使って実際にクライアントがサーバとコネクションを張り暗号化された通信をするまでの流れ&#34;&gt;以上の鍵が生成される順番と、これらのカギを使って実際にクライアントがサーバとコネクションを張り暗号化された通信をするまでの流れ&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. 接続の確立
クライアントがVPNサーバーに接続を試みます

クライアントはVPNサーバーに接続リクエストを送信します。


2. サーバーの証明書を検証
クライアントはサーバーから送られてきた証明書 (server.crt) を検証します。
クライアントは自身のCA証明書 (ca.crt) を使用して、
サーバー証明書がCAによって署名されていることを確認します。
この検証により、
クライアントは接続しようとしているサーバーが信頼できるものであることを確信します。

3. クライアントの証明書を検証
サーバーもクライアントから送られてきた証明書 (username.crt) を検証します。
サーバーは自身のCA証明書 (ca.crt) を使用して、
クライアント証明書がCAによって署名されていることを確認します。
サーバーはさらに、クライアント証明書が失効していないことをCRL (crl.pem) を用いて確認します。

4. 秘密鍵の使用
クライアントとサーバーのそれぞれの秘密鍵（username.key と server.key）は、相手の証明書と合わせて使用され、相互認証を実施します。
サーバーの秘密鍵（server.key）は、サーバーが送信するデータのデジタル署名と暗号化に使用されます。
クライアントの秘密鍵（username.key）は、クライアントが送信するデータのデジタル署名と暗号化に使用されます。

5. 鍵交換とセッションの確立
Diffie-Hellman鍵交換プロトコルの使用

クライアントとサーバーは、Diffie-Hellman鍵交換プロトコルを使用して、セッション鍵を安全に交換します。
このプロセスでは、サーバーの dh.pem ファイルが使用されます。
セッション鍵の生成

Diffie-Hellman鍵交換によって生成されたセッション鍵を使用して、クライアントとサーバー間で安全な通信チャネルを確立します。
これにより、以降の通信が暗号化されます。
暗号化された通信の開始
暗号化された通信の開始
セッション鍵が確立された後、クライアントとサーバー間の通信は暗号化されます。
以降のデータは、このセッション鍵を使用して暗号化・復号化されます。
各通信データは、相手側の公開鍵で暗号化され、自身の秘密鍵で復号化されます。
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;vpnサーバの起動&#34;&gt;VPNサーバの起動&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo systemctl stop openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;サーバがうまく起動できないとき&#34;&gt;サーバがうまく起動できないとき&lt;/h2&gt;
&lt;p&gt;こっちで試してみるのもありかもしれない。&lt;/p&gt;</description>
    </item>
    <item>
      <title>About_JOIN_of_SQL</title>
      <link>https://blog.ingenboy.com/post/about_join_of_sql/</link>
      <pubDate>Thu, 20 Jun 2024 10:01:50 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/about_join_of_sql/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;チーム開発演習で、SpringBootのMapperファイルを書いていたんですよね。Mapper.xmlってやつ。
んで、ここがおかしくてバグが生じていたんだけど、JOINについてちゃんと理解していなかったからだった。
JOINには色々あってさ、inner joinとかouter joinとか。
たくさんのテーブルを繋げまっくる時って、どのJOINにするかが大事って話だ。&lt;/p&gt;
&lt;h1 id=&#34;まずはすごくわかりやすい図があるのでそれで学んでくれ&#34;&gt;まずはすごくわかりやすい図があるのでそれで学んでくれ&lt;/h1&gt;
&lt;p&gt;&lt;img alt=&#34;Alt text&#34; loading=&#34;lazy&#34; src=&#34;https://www.codeproject.com/KB/database/Visual_SQL_Joins/Visual_SQL_JOINS_V2.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;left-joinとinner-joinをミスっていた&#34;&gt;Left JoinとInner Joinをミスっていた。&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  SELECT
  I.ITEM_ID,
  I.ITEM_NAME,
  I.DESCRIPTION,
  I.PRICE,
  I.IMAGE AS ITEM_IMAGE,
  I.UPDATED_AT AS ITEM_UPDATE_AT,
  I.CREATED_AT AS ITEM_CREATED_AT,
  I.DELETE_FLAG AS ITEM_DELETE_FLAG,
  COUNT(I.ITEM_ID = L.ITEM_ID) AS LIKE_COUNT,
  U.USER_ID,
  U.EMAIL,
  U.PASSWORD,
  U.PROFILE,
  U.IMAGE AS USER_IMAGE,
  U.DELETE_FLAG AS USER_DELETE_FLAG,
  U.UPDATED_AT AS USER_UPDATED_AT,
  U.CREATED_AT AS USER_CREATED_AT,
  U.USER_NAME,
  C.CATEGORY_ID,
  C.CATEGORY_NAME,
  C.UPDATED_AT AS CATEGORY_UPDATED_AT,
  C.CREATED_AT AS CATEGORY_CREATED_AT
  FROM
  ITEMS I
  LEFT OUTER JOIN USERS U
  ON I.USER_ID = U.USER_ID
  LEFT OUTER JOIN CATEGORIES C
  ON I.CATEGORY_ID = C.CATEGORY_ID
  LEFT OUTER JOIN LIKES L
  ON I.ITEM_ID = L.ITEM_ID
  WHERE I.ITEM_ID = #{itemId}
  GROUP BY I.ITEM_ID
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これ長いけど非常にいいSQLだよね。学ぶことがいっぱいある。それは置いておいて、ここのLEFT OUTER JOINのところ、普通のJOINにすると共通部分しか出て来なくなってしまうんだよね。
で、どこに問題が潜んでいるかというと、&lt;/p&gt;</description>
    </item>
    <item>
      <title>新卒研修で学んだことのまとめ</title>
      <link>https://blog.ingenboy.com/post/lessons_i_learned_through_seminar/</link>
      <pubDate>Wed, 19 Jun 2024 17:52:30 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/lessons_i_learned_through_seminar/</guid>
      <description>&lt;h2 id=&#34;事始め&#34;&gt;事始め&lt;/h2&gt;
&lt;p&gt;新卒研修も終わりに近づき、配属が近くなってきた。
研修を受けて学んだことも多くあったので、忘れないように記事を書こう。
全職種共通研修についてはここではハブらせてもらう。&lt;/p&gt;
&lt;h2 id=&#34;研修のスケジュール&#34;&gt;研修のスケジュール&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Spring boot&lt;/li&gt;
&lt;li&gt;Server + linux&lt;/li&gt;
&lt;li&gt;個人での開発&lt;/li&gt;
&lt;li&gt;チームでの開発&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;java&#34;&gt;Java&lt;/h2&gt;
&lt;p&gt;Javaで学んだことは、
そうだなー、すべてがクラスだってことかな。慣れてくるとそんなに悪いものでもない気がする。
ただ、マルチスレッド処理の記述方法がほかの言語とは違うからちょっと気を付けた方がいいかもしれない。
ああ、あとすごく勉強になったのはインターフェースだね。インターフェースを使うことでクラスのインターフェースを定義できる。
どういうことかというと、
インターフェースによって、ポリモフィズムを実現できる、という話だ。
ポリモフィズムとは「メッセージが同じでも、それを受け取るオブジェクトによっ て動作が異なること」だからね。
インターフェースを作っておいて、それを実装するクラスを作る、んで、インターフェース名で変数を作っておいて、そこに紐づけるオブジェクトは、
インターフェースを実装したクラス。これによって、例えば、インターフェースを配列で保持して、各要素ごとに同じメソッドで違う処理をさせることができる、っていう話だね。ハイハイ。&lt;/p&gt;
&lt;h2 id=&#34;spring-boot&#34;&gt;Spring boot&lt;/h2&gt;
&lt;p&gt;ここはいろんなことを学んだね。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DIという概念&lt;/li&gt;
&lt;li&gt;単体テストという概念&lt;/li&gt;
&lt;li&gt;WEB開発でのレイヤードアーキテクチャの話。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;DIをすることでコンポーネント間の依存関係を疎結合にできる、って話だな。インターフェースを定義しておいて、その実装を注入する。
注入されたコンポーネントを使う側のクラスは、何を注入するかだけを考えればいい。中の実装はどうでもいい。だからテストと本番で切り替えることもできる。&lt;/p&gt;
&lt;p&gt;あとは単体テストだね。今までは全く意識してこなかったが、確かに、各メソッドについて簡単な単体テストを書いた方がいいに決まっている、という話だな。&lt;/p&gt;
&lt;p&gt;WEB開発でのレイヤードアーキテクチャ。これもだいぶいい学びになった。そうね、UIとAPIに分けて開発するっていうのもめっちゃ勉強になったし、その中でも特にAPIでController + Service + repository + Mapperに分けてやるってのだいぶ勉強になった。これからもこのレイヤーは守って進めていきたいなって感じだな。&lt;/p&gt;
&lt;h2 id=&#34;server--linux&#34;&gt;server + linux&lt;/h2&gt;
&lt;p&gt;ここは特に学んだことはないかなーー。でも、SQLのjoinについてはかなり学んだのでjoinとかそのあたりかな、だから改めてページを作ってまとめていきたいよね。あーー、あとはCI/CDについても学んだな。これはだいぶいい学びだった。Jenkinsを学んだね。しかし、Github Actionsの方がよさそうっていう感想。これも改めてまとめたいね。&lt;/p&gt;
&lt;h2 id=&#34;個人開発&#34;&gt;個人開発&lt;/h2&gt;
&lt;p&gt;Spring bootの演習でやったことを個人でもう一回やるって感じだった。ただ、Javaを使ってWebシステムを構築する方法がわかったね。&lt;/p&gt;
&lt;h2 id=&#34;チーム開発演習&#34;&gt;チーム開発演習&lt;/h2&gt;
&lt;p&gt;これはマジで勉強になった。特にチームでの開発方法、めっちゃ勉強になった。作業分担の仕方だね、
うちのチームではコンポーネントの依存関係を意識してタスクを振ったけど、これが完全にはまったね。横軸を機能、縦軸をそのサービスを実現するためのコンポーネント（Controller, Service, Repository）で見た時、バックエンドは縦の依存関係が圧倒的に強かった。そもそも縦の依存関係は必ず生じるのだけれどもね。一方で、フロントはほかの機能との横断的な依存関係が多かった（それもそうだよね、APIっていう道具を使ってフロントの人は処理するからね）。こういうときはいっそレイヤーごとに担当を分けてしまった方がすっきり行く。特に最上位層はユーザがみるデザインなわけで、そこを一人の人が開発したのはデザインに統一感が出せてむしろ良かったって話だよね、マジで。&lt;/p&gt;
&lt;p&gt;あとは、設計と見えるかの重要性かな。とくにMiroを使って、ワイヤー、そしてそれを実現するための機能、その機能を実現するためのコンポーネント、とか、レイヤードアーキテクチャを設計するときの方法、めっちゃ勉強になった。&lt;/p&gt;
&lt;p&gt;あとは、タスク管理ツールだね。GithubのProjectを立ててIssue化することができるって話よ。んで、Git + Githubについてもマジでいろんなことを学んだね。チームメンバーでgitに詳しい人がいてね。それもまとめておきたいね。&lt;/p&gt;
&lt;p&gt;うちのチームはかなりスピーディーに開発が進んだけど、これはひとえに設計をちゃんとやって、みんなで共有できたから。この開発方法は一生の宝になると思う。しかし、実現方法がわからないものに出会ってしまったらどうやるのかな。空中分解型アジャイルとかやるのかな。&lt;/p&gt;
&lt;h2 id=&#34;まとめ&#34;&gt;まとめ&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Java : インターフェース、ポリモフィズム&lt;/li&gt;
&lt;li&gt;Spring Boot : DI, 単体テスト、レイヤードアーキテクチャ&lt;/li&gt;
&lt;li&gt;server + linux : CI/CDツール（Jenkins, Github Actions）, SQLのjoinやgroup by　（個別の記事として出す）&lt;/li&gt;
&lt;li&gt;個人開発演習：なし&lt;/li&gt;
&lt;li&gt;チーム開発演習：タスクの振り分け方、Miroを使って設計を見えるかすること、タスク管理をgithubですること。 (Gitの使い方として新しい記事を出す)&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>20240614_taskList</title>
      <link>https://blog.ingenboy.com/post/20240614_tasklist/</link>
      <pubDate>Fri, 14 Jun 2024 17:29:55 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/20240614_tasklist/</guid>
      <description>&lt;h1 id=&#34;20240614時点でのタスクリスト&#34;&gt;2024/06/14時点でのタスクリスト&lt;/h1&gt;
&lt;h4 id=&#34;開発関係&#34;&gt;開発関係&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Jc_Data_checkerがうまく動いてないらしいから、原因を究明してすぐに直してくれ。一体なんでなんだ！！ったく！！&amp;ndash;&amp;gt; 修正しました。原因は、HTMLの表示形式が変わって、正規表現で抜き取れなかったことでした。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 配信サーバを作ってくれ！！これ、mediasoupeっての使えば行ける &amp;ndash;&amp;gt; なんか、ffmpegを使って配信サーバにpublishして、chromeからHLSで動画を見ることができた。ーー＞次は本格的なyoutubeを作ってみよう！って感じやな。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; レジュメを作ろう。業務委託を取るために。簡単には作りましたって感じですね。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; JC_booking_centerを早く稼働させてくれ &amp;ndash;&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; jc_licence_translationを早く作ってくれ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; La_keibaのTODO LISTをすべて解消してくれ&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Go言語でdistributed file systemを作ってくれ！&lt;a href=&#34;https://www.youtube.com/watch?v=IoY6bE--A54&#34;&gt;このyoutubeを見て&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 研修で作ったフリマアプリ、まるまる自分のものにしよう。じっさいしてええやろ。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;その他&#34;&gt;その他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 確定拠出年金どうするか早く考えてくれ！6/19までだぞ？！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 企業型確定拠出年金で、マッチング拠出（個人で拠出すること）をする方法を調べてくれ。ちなみに、マッチング拠出とideco(個人型確定拠出年金)の併用は不可能だ。&amp;ndash;&amp;gt; 新卒だからまだ無理っぽい？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ニトリでソファーを頼んでくれ &amp;ndash;&amp;gt; ネットで頼まないとダメっぽい&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 研修で学んだことをブログにまとめてくれ！！高解像度で！特に個人的に学びが多かったSQL周り！よろしく！&amp;ndash;&amp;gt; とりあえず全体を通しての反省みたいなのは書きました。あとは個別のトピック別に。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 実家に健康診断のチケットを取りに行け！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; APDCMのJournal書いてくれ！！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎日筋トレしてくれ。ジムに行ってくれ。朝がいい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 毎朝早く起きてくれ。23時に寝て0630に起きる生活ができると最高だ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早く業務委託で何かしらの案件を取ってきて売れ。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; なんかいい研究ネタがないか、せんせいにきいてくれ！配属されたら意外と退屈しないかもしれないけど。。。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早くyoutubeチャンネル開設して、経費生活を始めてくれ！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;長期目線&#34;&gt;長期目線&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 宅建を取ってくれ！！(令和6年7月1日（月）9時30分から7月31日（水）23時59分まで)&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 簿記2級とってくれ！&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 土地をどこに買うかかんがえてくれ！！そして貯金しろ！！マジな話、生活費8万と、共通貯金口座2万以外は全部あっちに回してくれ。&lt;/li&gt;
&lt;/ul&gt;</description>
    </item>
    <item>
      <title>サーバのお引越し &amp;&amp; hugoのアップデート</title>
      <link>https://blog.ingenboy.com/post/move_site_to_public_server/</link>
      <pubDate>Fri, 14 Jun 2024 13:48:12 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/move_site_to_public_server/</guid>
      <description>&lt;h1 id=&#34;ブログの引っ越し&#34;&gt;ブログの引っ越し&lt;/h1&gt;
&lt;p&gt;ブログ引っ越した。
家の引っ越しをして自宅サーバからブログを公開できなくなった。
そこで、VPSをレンタルしてそこから配信するように変更。そこからの一発目の投稿。
昔の記事はgithubに保存したので、そこから引っ張ってきて普通に見られるようにした。&lt;/p&gt;
&lt;h1 id=&#34;hugoのアップデート&#34;&gt;hugoのアップデート&lt;/h1&gt;
&lt;p&gt;hugoのアップデートに伴い、昔のraspiで動かしていたhugoのバージョン (v0.54.0)
から、v0.127.0にアップグレード？？いやなんか、ダウングレードされてね？どゆことや。。。まあそれはさておき、何が言いたいかというと、
バージョンが変わったから使用方法も少し変わってしまったということや。新しいポストの作り方だけ覚えておけば問題ないかな？&lt;/p&gt;
&lt;h2 id=&#34;ポストの新規作成方法&#34;&gt;ポストの新規作成方法&lt;/h2&gt;
&lt;p&gt;~/hugo_site、つまり、contentとかがあるディレクトリ上で&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hugo new post/new_post_name.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;って感じね。まえはpostディレクトリがある場所でこれをやる必要があったけど、変わってしまった、という話だ。&lt;/p&gt;
&lt;h2 id=&#34;その他注意点&#34;&gt;その他注意点&lt;/h2&gt;
&lt;p&gt;brタグは使ってはいけません。バグる。改行したい時は普通にエンター二つで開けてください。よろしく。&lt;/p&gt;
&lt;p&gt;テストで改行。うまくいってるみたいね。しかも、ライブ変更してくれる？フロント側も少し担当してくれているって感じなのかな？websockでつながってる？ちょっと検証。あーやっぱりそうだね。ライブリロードって機能でws使ってるみたいや。ええやん。プッシュ通知できて。&lt;/p&gt;
&lt;h1 id=&#34;その他知っておいた方がいいtips&#34;&gt;その他知っておいた方がいいTIPS&lt;/h1&gt;
&lt;h2 id=&#34;hugoの設定関係&#34;&gt;hugoの設定関係&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;archtypes/default.mdを変更するとデフォルトで生成されるmdファイルを変更することが可能。yamlに変更。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Categoriesを各記事ごとに作ることができる。しかし、ホットリロードはされない模様（カテゴリ一覧から検索することは不可能である）。だから、カテゴリーを反映させたかったら、サーバを再起動する必要がある。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;sslの設定方法&#34;&gt;sslの設定方法&lt;/h2&gt;</description>
    </item>
    <item>
      <title>How_to_drop_commits_in_git</title>
      <link>https://blog.ingenboy.com/post/how_to_drop_commits_in_git/</link>
      <pubDate>Mon, 06 May 2024 21:51:28 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/how_to_drop_commits_in_git/</guid>
      <description>&lt;h1 id=&#34;です&#34;&gt;です&lt;/h1&gt;
&lt;p&gt;恥ずかしながら、この年になりまして、初めてgitのコミットを取り消したので、やり方を記録しておきたいと思います。&lt;/p&gt;
&lt;h1 id=&#34;1-コミットを何個さかのぼりたいかを決める&#34;&gt;1. コミットを何個さかのぼりたいかを決める&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git rebase -i HEAD~n
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;nに何コミット分さかのぼりたいかを書きます。例えば、3コミットさかのぼりたかったら&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git rebase -i HEAD~3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;って書きます。次です。&lt;/p&gt;
&lt;h1 id=&#34;2-実際にどのコミットを取り消すかを決める&#34;&gt;2. 実際にどのコミットを取り消すかを決める&lt;/h1&gt;
&lt;p&gt;以下のようにテキストエディタが出てきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pick 1234567 Commit message for commit to keep
drop 9004867 Commit message for commit to remove
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ただ、pick -&amp;gt; dropに変更するとそのコミットが取り消されます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn_java</title>
      <link>https://blog.ingenboy.com/post/learn_java/</link>
      <pubDate>Sun, 04 Feb 2024 12:40:45 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_java/</guid>
      <description>&lt;h1 id=&#34;共通言語を学ぶ&#34;&gt;共通言語を学ぶ&lt;/h1&gt;
&lt;p&gt;なんでか知らんけど、javaが共通言語になっているみたいなんだよね。
理解不能なんだけども。
ということで、軽くやりますかね。&lt;/p&gt;
&lt;h1 id=&#34;環境構築から&#34;&gt;環境構築から&lt;/h1&gt;
&lt;p&gt;Javaの精神は、「ビルドワンス、らん絵にウェア」だった気がする。
つまり、OSごとに新たにコンパイルしなおしたりしなくていいってことなんだけど、
まあ、そういうのを実現するためには、新しいレイヤーを一枚かませないとだめなんだよね。
それが、JVMだね。
JVM (Java Virtual Machine) は、1 つの命令セットを持ち、メモリーを使用する抽象的な演算マシン。&lt;/p&gt;
&lt;p&gt;で、JvMは、JVM専用のファイルじゃないと走らないって思っているんだけど、そうだよね？
javacで、コンパイルして、JVMが読める形式に変換して、javaコマンドで実際に動かすって感じかな？
で、JVMが読める形式っていうのが、classファイルだったと思うんだけど、どうなんかな。
そうですね。
で、.classはどのjvmでも動くようになっているんですね。つまり、一度コンパイルされたソースコードは、
jvmがあるおかげでどこでも動くって話だ。&lt;/p&gt;
&lt;p&gt;で、よく見るjarファイルってのが、.classがいっぱい入っているzipファイルなんだよね。
あれ、java -jarとかですぐ実行できるやん？そういうことや。&lt;/p&gt;
&lt;p&gt;JDK = java development kit
これには何が入っているんだ。はい、わかりやすいね。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/keomo/items/a814a36be95033c14207&#34;&gt;このきーた&lt;/a&gt;
が。
JDKはJREを内包している。そして、JREはJVMを内包している。
JDKはコンパイラとデバッガを内包している。
つまり、JDKはjavacとを含んでいる。
んで、JREはjava runtime environmentだから、jvmとc/c++でいう標準ライブラリを含んでいる。
javaコマンドは、JVM上で.classファイルを動かすためにあるんだと思う。そんな気がする。そうです。&lt;/p&gt;
&lt;p&gt;つまり、結局はJDKをインストールすればコンパイルと実行はできるようになるってことです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install openjdk-17-jdk-headless
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで、jreを入る。
環境構築完了。&lt;/p&gt;
&lt;h1 id=&#34;補足知識&#34;&gt;補足知識&lt;/h1&gt;
&lt;p&gt;「具体的には、jarファイルはコンパイル済みのclassファイルや画像などのファイルを、zip形式に圧縮してまとめたファイルです。」&lt;/p&gt;
&lt;h1 id=&#34;コンパイルから実行までのながれ&#34;&gt;コンパイルから実行までのながれ&lt;/h1&gt;
&lt;p&gt;まず、ソースコードを書きます。拡張子は、.java&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;class Hello {
    public static void main(String[] args) {
        System.out.println(&amp;#34;初めてのJava program&amp;#34;);
        System.out.println(&amp;#34;画面に表示&amp;#34;);
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で、ファイル名は、クラス名と一致させるのがいいみたいですね。つまり、ファイル名は、Hello.javaになります。
で、javacで中間コードにコンパイルします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;javac Hello.java
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;出てくるのは、Hello.classってファイルです。
んで、実行するときは、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;java Hello
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;だけでいいっす。&lt;/p&gt;
&lt;p&gt;でも、じつは、&lt;/p&gt;</description>
    </item>
    <item>
      <title> ロングファットパイプ、TCPダンプ</title>
      <link>https://blog.ingenboy.com/post/mtu_and_window_size/</link>
      <pubDate>Fri, 19 Jan 2024 19:52:32 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/mtu_and_window_size/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;例のシステムで、tcコマンドでネットワークレイテンシーを増加させたんですけどね。
そしたら、たったの100msの遅延だったんですけど、64MiBのデータを送信するときに、
アプリから見た時の遅延の時間がなんと1sくらいまで伸びてしまったんですよね。これ、めちゃめちゃ面白い話で、深堀りする価値があるんです。
もしかしたら、ロングファットパイプ問題についても、わかるかもしれないね。&lt;/p&gt;
&lt;p&gt;まず、TCPの基礎、どうやって動いているのかを理解する必要がある。
が、せっかくなので、もう一回上からやろうか。
アプリケーションレイヤーから、どうやってデータが通信相手まで伝わるのか、ってのをもう一回確認して、
本題のTCPレイヤーのMTU,MSS,windowサイズについて話した後、tcpダンプの使い方を調べ、最後に実際にTCPダンプをして、
例のシステムにおいて、サーバ・クライアント間で100msの遅延が生じているときのデータのやり取りについてみてみましょう。&lt;/p&gt;
&lt;h1 id=&#34;osiモデルプロトコルスタックについて確認&#34;&gt;OSIモデル、プロトコルスタックについて確認&lt;/h1&gt;
&lt;p&gt;まず、プロトコルスタックとは「コンピュータネットワーク用のプロトコルの階層」のことです。
OSIモデル(7層) で見ていくのが大事そうですね。上から、アプリケーション層、プレゼンテーション層、セッション層、トランスポート層、ネットワーク層、データリンク層、物理層。&lt;/p&gt;
&lt;p&gt;アプリケーション層では、具体的なサービスを提供。HTTPとか、websocketとか、FTPとか、SSHとか、その他いろいろ。&lt;/p&gt;
&lt;p&gt;プレゼンテーション層は、データのフォーマットを定義する？そうですね。エンコードの方法とか。これはおそらくまだOSレイヤーの話ではない。&lt;/p&gt;
&lt;p&gt;ここからがOSの世界の話。
セッション層は、connect(sockdrp,IP)で、コネクションを確立したときに、コネクションの相手を覚えておく層、だと思っていい。
つまり、ソケットのことです。ソケットが通信相手の情報を覚えておきます。
ソケットは、OSによってプログラムのされ方が違うらしいです。それでも異なるOS同士ど通信ができるのは、トランスポート層で規定されているプロトコルにすべてのOSが準拠しているからです。&lt;/p&gt;
&lt;p&gt;トランスポート層 (L4) が、TCP / UDP です。TCPでは、アプリケーションからもらったデータを小分けにして、通し番号を付けて、
小分けにしたデータをちょっとづつ送ります。小分けにされたデータが、いわゆる「パケット」です。
再送とかもする。信頼性が高いのです。その代わりスループットは悪くなります。
一方、UDPはデータを投げっぱなしにします。信頼性は低いですが、スループットは高くなります。VoIPなどに使われますね。
L4ではまだ、IPは指定しません。&lt;/p&gt;
&lt;p&gt;その下、ネットワーク層が、IPです。ルーティングを決めてくれます。&lt;/p&gt;
&lt;p&gt;その下、データリンク層が、イーサネットですね。L2TPとかをするVPN、ありますよね。あれはね、このレイヤーで動いているんですよね。&lt;/p&gt;
&lt;p&gt;その下、もう物理層です。L1です。&lt;/p&gt;
&lt;h1 id=&#34;l4トランスポート層のtcpについてもう少し詳しく見ていく&#34;&gt;L4、トランスポート層のTCPについてもう少し詳しく見ていく&lt;/h1&gt;
&lt;p&gt;まずは、TCPヘッダーのフォーマットを見てみましょう。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;送信元ポート番号：16bit
送信先ポート番号：16bit
シーケンス番号：32bit
ACK番号：32bit
データオフセット：4bit
未使用：6bit
コントロールビット：6bit
ウインドウ：16bit
チェックサム：16bit
緊急ポインタ：16bit
オプション：可変長
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;いろいろありますが、ここでまず注目したいのは、通信相手のIPアドレスがないってことですね。
なぜなら、それはL3が担当するからです。
その他、自分的にまだ理解が完ぺきではないけど大事そうなのは、シーケンス番号、ACK番号、コントロールビット、
ウィンドウの、４つですね。それぞれについて説明していきます。&lt;/p&gt;
&lt;h2 id=&#34;シーケンス番号&#34;&gt;シーケンス番号&lt;/h2&gt;
&lt;p&gt;「このパケットの先頭のデータが送信データの何バイト目にあたるのか送信側から受信側に伝えるためのもの」
TCPではデータを小分けにして送りますね。パケットです。で、何バイト目か？って話ですね。32bitしかないってことは、
2^32/1024/1024/1024 = 4GiBしか一回で送れないってこと？まじ？？まあいいや。そんなことはないと思うけどね。&lt;/p&gt;
&lt;h2 id=&#34;ack番号&#34;&gt;ACK番号&lt;/h2&gt;
&lt;p&gt;「データが何バイト目まで受信側に届いたのか、受信側から送信側に伝えるためのもの。」だそうです。&lt;/p&gt;
&lt;h2 id=&#34;コントロールビット&#34;&gt;コントロールビット&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;URG:緊急ポインタ
ACK:データが正しく受信側に届いたことを意味する
PSH:FLUSH動作によって送信されたデータである
RST:接続を強制的に終了：異常終了
SYN:送信側と受信側で連番を確認しあう。これで接続どうさを表す
FIN:切断
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ウィンドウ&#34;&gt;ウィンドウ&lt;/h2&gt;
&lt;p&gt;「受信側から、送信側にウィンドウサイズ (受信確認を待たずにまとめて送信可能なデータ量) を通知するために使う。」
これが16bitであるのが、もんだいなんですよ！！&lt;/p&gt;
&lt;p&gt;以上を念頭に次に進みます。&lt;/p&gt;
&lt;h2 id=&#34;tcpが接続を開始してデータを送信し切断するまで&#34;&gt;TCPが接続を開始して、データを送信し、切断するまで&lt;/h2&gt;
&lt;p&gt;はい。一言でいうと、
「TCPはスループットを犠牲に、信頼性を高めた通信プロトコル」です。
信頼性を高めるために、されている工夫が２つあるんですね。それが、
3ウェイハンドシェイクと、パケット送信時の受け取り確認です。
（UDPはスリーウェイハンドシェイクも、受け取り確認もしない）&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lessons_i_learned_from_softwareDev_through_research (メモ) </title>
      <link>https://blog.ingenboy.com/post/lessons_i_learned_from_softwaredev_through_research/</link>
      <pubDate>Fri, 19 Jan 2024 13:05:30 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/lessons_i_learned_from_softwaredev_through_research/</guid>
      <description>&lt;p&gt;めも&lt;/p&gt;
&lt;h1 id=&#34;研究を通してやったソフトウェア開発で学んだこと&#34;&gt;研究を通してやったソフトウェア開発で学んだこと&lt;/h1&gt;
&lt;p&gt;まあ、やっぱりアジャイルっぽくはなるので、試作を作って、それを改良していく感じにはなります。
ただ、これだけは忘れないでほしい。試作を作る段階で今後の可能性を狭めない方がいい。
いや、具体例を一言でいうと、ハードコーディングするな。マジで。そのときはいいかもしれないけど、あとで見つけるの、マジでだるい。頼む。&lt;/p&gt;
&lt;h2 id=&#34;具体例&#34;&gt;具体例&lt;/h2&gt;
&lt;p&gt;いやね、tolを変えて評価したいんですわ。でもね、L3prefetcherのところ、tolがハードコーディングされてるのよね。0.1で。これを変えるのがめんどくさすぎるーーーー。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gdb</title>
      <link>https://blog.ingenboy.com/post/gdb/</link>
      <pubDate>Wed, 17 Jan 2024 16:28:00 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/gdb/</guid>
      <description>&lt;h1 id=&#34;gdbを使えるようになりたい&#34;&gt;gdbを使えるようになりたい&lt;/h1&gt;
&lt;p&gt;デバッガは使えた方がいいですよ。ステップ実行とかね。まあ、ちゃんとしたソフトウェア開発っやったことないんで、いまいちピンとこないんですよね。でも、大事なことには変わりないです。頑張りましょう。&lt;/p&gt;
&lt;h1 id=&#34;python3からcの共有ライブラリを呼び出すときにおこったバグの見つけ方&#34;&gt;python3から、c++の共有ライブラリを呼び出すときにおこったバグの見つけ方&lt;/h1&gt;
&lt;p&gt;chatgptさんに聞きました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The error message &amp;#34;munmap_chunk(): invalid pointer&amp;#34; typically indicates a memory corruption issue or a double-free error. It means that at some point during the program&amp;#39;s execution, it is trying to deallocate memory that has already been freed or that was never allocated in the first place.

To identify the exact point where the issue occurs, you can follow these steps

1:Enable address sanitizer (ASAN) in your C++ code to help detect memory issues. You need to recompile your C++ library with ASAN flags (-fsanitize=address) and then rerun your Python script under GDB. ASAN will provide more detailed information about memory errors.

Modify your CMakeLists.txt to include ASAN flags:

set(CMAKE_CXX_FLAGS &amp;#34;${CMAKE_CXX_FLAGS} -g -fsanitize=address&amp;#34;)

Then rebuild your C++ library.

2:
Run your Python script again under GDB with ASAN enabled:

gdb -ex r --args python3 crash.py
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Make_tips</title>
      <link>https://blog.ingenboy.com/post/make_tips/</link>
      <pubDate>Wed, 17 Jan 2024 15:44:02 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/make_tips/</guid>
      <description>&lt;h1 id=&#34;makeの高速化&#34;&gt;makeの高速化&lt;/h1&gt;
&lt;p&gt;cmake ..でmakeファイルを生成して、最後にmakeすると思うんだけど、これ、高速化する技があるんですね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;make -j &amp;lt;number of cores&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で、めっちゃ高速化されます。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ROS</title>
      <link>https://blog.ingenboy.com/post/ros/</link>
      <pubDate>Wed, 17 Jan 2024 11:38:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/ros/</guid>
      <description>&lt;h1 id=&#34;いつかrosを触ってみたいので忘れないようにメモ&#34;&gt;いつかROSを触ってみたいので、忘れないようにメモ&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Pybinding</title>
      <link>https://blog.ingenboy.com/post/pybinding/</link>
      <pubDate>Wed, 17 Jan 2024 10:27:28 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/pybinding/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;HPCの分野はやはりc/c++で開発されることが多いよね。しかしね、やはりc/c++はビルドとか、マジで面倒くさいんですわ。コンパイル型言語はよ。
だからインタープリタ型言語から、c/c++のライブラリを呼び出せたらいいよね、っていうので作られたのがpybind11とかっていうやつなんだよね。&lt;/p&gt;
&lt;p&gt;今回は、c/c++で書かれた科学技術データ向けの非可逆圧縮アルゴリズムの一つである &lt;a href=&#34;https://github.com/szcompressor/cuSZp&#34;&gt;cuSZp&lt;/a&gt; をpythonから呼び出す方法を
記録します。&lt;/p&gt;
&lt;h2 id=&#34;前例&#34;&gt;前例&lt;/h2&gt;
&lt;p&gt;けいち先生がすでに&lt;a href=&#34;https://github.com/keichi/MGARD/commit/c6d8c60b3b572daa956bd98097ab8244a93242b3&#34;&gt;MGARD&lt;/a&gt;をpythonから呼び出せるようにpybindをやってくれています。
これを参考にしたいと思います。ということで、先生が何をやったのか、の解析から始めたいと思います。&lt;/p&gt;
&lt;h3 id=&#34;pymgardのcmake&#34;&gt;pymgardのcmake&lt;/h3&gt;
&lt;p&gt;解説しながら進めていきたいと思います。大事なところだけ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;

project(
  MGARD
  HOMEPAGE_URL &amp;#34;https://github.com/CODARcode/MGARD&amp;#34;
  VERSION &amp;#34;${MGARD_VERSION_MAJOR}.${MGARD_VERSION_MINOR}.${MGARD_VERSION_PATCH}&amp;#34;
  #CUDA will be enabled below if `MGARD_ENABLE_CUDA` is `ON`.
  LANGUAGES CXX
)


include(MgardXGenerateSource)
find_package(PkgConfig REQUIRED)

add_executable(mgard-x ${CMAKE_CURRENT_SOURCE_DIR}/src/mgard-x/Executables/mgard-x.cpp)
target_link_libraries(mgard-x mgard-library  ${CMAKE_DL_LIBS})

target_include_directories(mgard-x PUBLIC $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include&amp;gt;
                                        $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include&amp;gt;)
install(TARGETS mgard-x)

add_executable(mgard-x-autotuner ${CMAKE_CURRENT_SOURCE_DIR}/src/mgard-x/Executables/mgard-x-autotuner.cpp)
target_link_libraries(mgard-x-autotuner mgard-library  ${CMAKE_DL_LIBS})
target_include_directories(mgard-x-autotuner PUBLIC $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include&amp;gt;
                                                    $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include&amp;gt;)
install(TARGETS mgard-x-autotuner)

#Adding library here so we can set compile definitions for it.
add_library(mgard-library)

if(MGARD_ENABLE_CUDA)
  enable_language(CUDA)
  set(CMAKE_CUDA_STANDARD_REQUIRED TRUE)
  if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
      set(CMAKE_CUDA_ARCHITECTURES 70)
  endif()

  find_package(nvcomp REQUIRED)
  find_package(CUDAToolkit REQUIRED)

  target_compile_definitions(mgard-library PUBLIC MGARD_ENABLE_CUDA)
  set (CMAKE_CUDA_FLAGS &amp;#34;${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr -w --generate-line-info&amp;#34;)
  
  set (MGARD_X_SEPARATE_COMPILE_COMPILATION_OPTION 
       CUDA_SEPARABLE_COMPILATION ON)

  set_source_files_properties(${MGARD_X_CUDA_SRC} PROPERTIES LANGUAGE CUDA)
endif()

find_package(ZLIB REQUIRED)

find_package(PkgConfig REQUIRED)

set(
  MGARD_LIBRARY_CPP
        src/compress.cpp
        src/compress_internal.cpp
  src/compressors.cpp
  src/format.cpp
)

set(MGARD_GENERATE_DIMENSION_SWITCH &amp;#34;${CMAKE_CURRENT_SOURCE_DIR}/scripts/generate_dimension_switch.py&amp;#34;)
set(MGARD_COMPRESS_INTERNAL_CPP &amp;#34;${MGARD_FILE_FORMAT_SRCDIR}/compress_internal_generated.cpp&amp;#34;)
add_custom_command(
  OUTPUT
  &amp;#34;${MGARD_COMPRESS_INTERNAL_CPP}&amp;#34;
  COMMAND &amp;#34;${PYTHON3}&amp;#34;
  ARGS
  &amp;#34;${MGARD_GENERATE_DIMENSION_SWITCH}&amp;#34;
  &amp;#34;--decompress&amp;#34;
  &amp;#34;${MAXIMUM_DIMENSION}&amp;#34;
  &amp;#34;${MGARD_COMPRESS_INTERNAL_CPP}&amp;#34;
)
list(APPEND MGARD_LIBRARY_CPP &amp;#34;${MGARD_COMPRESS_INTERNAL_CPP}&amp;#34;)


target_sources(
  mgard-library
  PRIVATE
  ${MGARD_LIBRARY_CPP}
  ${MGARD_CUDA_SRC}
  ${MGARD_X_SRC}
  ${MGARD_X_SERIAL_SRC}
  ${MGARD_X_OPENMP_SRC}
  ${MGARD_X_CUDA_SRC}
  ${MGARD_X_HIP_SRC}
  ${MGARD_X_SYCL_SRC}
)

set_target_properties(mgard-library PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)

set_target_properties(mgard-library PROPERTIES OUTPUT_NAME mgard)

target_link_libraries(mgard-library PUBLIC PkgConfig::protobuf)


install(TARGETS mgard-library EXPORT mgard-targets)

install(FILES &amp;#34;${PROJECT_BINARY_DIR}/include/MGARDConfig.hpp&amp;#34; DESTINATION &amp;#34;${CMAKE_INSTALL_INCLUDEDIR}/mgard&amp;#34;)

install(FILES &amp;#34;${PROJECT_BINARY_DIR}/include/MGARDXConfig.h&amp;#34; DESTINATION &amp;#34;${CMAKE_INSTALL_INCLUDEDIR}/mgard/mgard-x/RuntimeX&amp;#34;)

install(DIRECTORY &amp;#34;include/&amp;#34; DESTINATION &amp;#34;${CMAKE_INSTALL_INCLUDEDIR}/mgard&amp;#34;)

install(FILES &amp;#34;${MGARD_FILE_FORMAT_HPP}&amp;#34; DESTINATION &amp;#34;${CMAKE_INSTALL_INCLUDEDIR}/mgard/${MGARD_FILE_FORMAT_INCLUDESUBDIR_COMPONENT}&amp;#34;)


if(MGARD_ENABLE_PYTHON)
  find_package(Python COMPONENTS Interpreter Development.Module REQUIRED)

  include(FetchContent)
  FetchContent_Declare(
      pybind11
      GIT_REPOSITORY https://github.com/pybind/pybind11.git
      GIT_TAG        stable
  )
  FetchContent_MakeAvailable(pybind11)

  pybind11_add_module(_mgard src/python/bindings.cpp)
  target_link_libraries(_mgard PRIVATE mgard-library)
  install(TARGETS _mgard LIBRARY DESTINATION python/mgard)
endif()

# Add all targets to the build-tree export set
export(
  TARGETS mgard-library
  NAMESPACE mgard::
  FILE &amp;#34;${PROJECT_BINARY_DIR}/mgard-targets.cmake&amp;#34;
)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;bindingscpp&#34;&gt;bindings.cpp&lt;/h3&gt;
&lt;h1 id=&#34;今回のcuszpで確認してみよう&#34;&gt;今回のcuSZpで、確認してみよう&lt;/h1&gt;
&lt;h2 id=&#34;cmakelisttxtの中身&#34;&gt;CMakelist.txtの中身&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Specify the minimum version of CMake required to build the project
cmake_minimum_required(VERSION 3.21)

project(cuSZp
        VERSION 0.0.2
        DESCRIPTION &amp;#34;Error-bounded GPU lossy compression library&amp;#34;
        )
set(namespace &amp;#34;cuSZp&amp;#34;)
enable_language(CXX)
enable_language(CUDA)

find_package(CUDAToolkit REQUIRED)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

option(CUSZP_ENABLE_PYTHON &amp;#34;Enable Python bindings.&amp;#34; OFF)

set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
set(CMAKE_CUDA_STANDARD &amp;#34;17&amp;#34;)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_ARCHITECTURES 60 61 62 70 75)
set(CUDA_PROPAGATE_HOST_FLAGS ON)
set(CUDA_LIBRARY CUDA::cudart)

if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY VALUE Release)
endif()

# add_library(${PROJECT_NAME} STATIC)
add_library(${PROJECT_NAME} SHARED)

target_sources(${PROJECT_NAME}
        PRIVATE
        src/cuSZp_f32.cu
        src/cuSZp_f64.cu
        src/cuSZp_utility.cu
        src/cuSZp_timer.cu
        src/cuSZp_entry_f32.cu
        src/cuSZp_entry_f64.cu
        )

target_include_directories(${PROJECT_NAME}
        PRIVATE
        # where the library itself will look for its internal headers
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        PUBLIC
        # where top-level project will look for the library&amp;#39;s public headers
        $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include&amp;gt;
        # where external projects will look for the library&amp;#39;s public headers
        $&amp;lt;INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}&amp;gt;
        )

#target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})

target_link_libraries(${PROJECT_NAME} PRIVATE CUDA::cudart)

set(public_headers
        include/cuSZp_f32.h
        include/cuSZp_f64.h
        include/cuSZp_utility.h
        include/cuSZp_timer.h
        include/cuSZp_entry_f32.h
        include/cuSZp_entry_f64.h
        )

set(CMAKE_MODULE_PATH &amp;#34;${CMAKE_CURRENT_SOURCE_DIR}/cmake&amp;#34;)
include(Installing)

if(CUSZP_ENABLE_PYTHON)
  find_package(Python COMPONENTS Interpreter Development.Module  REQUIRED) # よく出てくる。ライブラリがあるかを確認。cmakeがいい感じにいろいろやってくれる
  find_package(CUDAToolkit REQUIRED)
  enable_language(CUDA)
  set(CUDA_LIBRARY CUDA::cudart)
  
  include(FetchContent) # 便利
  FetchContent_Declare(
      pybind11
      GIT_REPOSITORY https://github.com/pybind/pybind11.git
      GIT_TAG        stable
  )
  FetchContent_MakeAvailable(pybind11)

  pybind11_add_module(_cuSZp src/python/bindings.cpp) # ここで作成するライブラリを指定。add_libraryてきなののpybind版
  target_include_directories(_cuSZp PRIVATE &amp;#34;/usr/local/cuda/include/&amp;#34; &amp;#34;/usr/local/cuSZp/&amp;#34;)
  target_include_directories(${PROJECT_NAME}
        PRIVATE
        # where the library itself will look for its internal headers
        ${CMAKE_CURRENT_SOURCE_DIR}/src
        PUBLIC
        # where top-level project will look for the library&amp;#39;s public headers
        $&amp;lt;BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include&amp;gt;
        # where external projects will look for the library&amp;#39;s public headers
        $&amp;lt;INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}&amp;gt;
        )
  target_link_libraries(_cuSZp PRIVATE cuSZp CUDA::cudart)
  install(TARGETS _cuSZp LIBRARY DESTINATION python/cuSZp)
endif()

option(CUSZP_BUILD_EXAMPLES &amp;#34;Option to enable building example programs&amp;#34; ON)
if (CUSZP_BUILD_EXAMPLES)
    add_subdirectory(examples)
endif ()
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;pybindingcppの中身&#34;&gt;pybinding.cppの中身&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;cuSZp_utility.h&amp;gt;
#include &amp;lt;cuSZp_entry_f32.h&amp;gt;
#include &amp;lt;pybind11/numpy.h&amp;gt;
#include &amp;lt;pybind11/pybind11.h&amp;gt;

namespace py = pybind11;


py::buffer compress(py::array_t&amp;lt;float&amp;gt; original, float tol) {
    unsigned char *compressed_data = nullptr;
    size_t compressed_size = 0;

    compressed_data = new unsigned char[original.size()];
    
    // pointer_to_original_data(float*), pointer_to_compressed_data(unsigned char*), size_of_original_data(int/size_t), pointer_to_compressed_size, tolerance
    SZp_compress_hostptr_f32(const_cast&amp;lt;float*&amp;gt;(original.data()), compressed_data, original.size(), &amp;amp;compressed_size, tol);

    return py::array_t&amp;lt;unsigned char&amp;gt;({compressed_size}, 
                                    {1}, // stride of the array
                                      static_cast&amp;lt;unsigned char *&amp;gt;(compressed_data),
                                      py::capsule(compressed_data, [](void *ptr) { delete ptr; }));
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちょっと、&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cmake_cheat_sheat</title>
      <link>https://blog.ingenboy.com/post/cmake_cheat_sheat/</link>
      <pubDate>Wed, 17 Jan 2024 10:27:13 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/cmake_cheat_sheat/</guid>
      <description>&lt;h1 id=&#34;ccを使うならcmake&#34;&gt;c/c++を使うならcmake!&lt;/h1&gt;
&lt;p&gt;を使えるようになろう&lt;/p&gt;
&lt;h1 id=&#34;前提知識&#34;&gt;前提知識&lt;/h1&gt;
&lt;h2 id=&#34;ccをライブラリとして提供するときに必要な奴ら&#34;&gt;c/c++をライブラリとして提供するときに必要な奴ら&lt;/h2&gt;
&lt;p&gt;/include, /lib, だよね。
/includeにはヘッダーが入っていて、/libには、コンパイルによって生成されたライブラリが入ります。hogehoge.soとか、hogehoge.aとか。
で、こいつらは基本的に、/usr/local/いかに格納されます。
&lt;!-- raw HTML omitted --&gt;
ヘッダーについても説明しておく。ヘッダーは簡単にいうと、関数の入出力を規定したファイルです。
プログラムをビルドする流れは、コンパイルー＞リンク　だけど、コンパイルの時点では、ライブラリとして読み込まれたファイルがどんな&lt;/p&gt;
&lt;h2 id=&#34;ヘッダーファイルの種類&#34;&gt;ヘッダーファイルの種類&lt;/h2&gt;
&lt;p&gt;ヘッダーファイルには２種類ある。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include &amp;#34;my_library.h&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいな感じで、&amp;lt;&amp;gt;で囲まれているやつと、&amp;ldquo;&amp;ldquo;で囲まれているやつ。&amp;lt;&amp;gt;は、システムのライブラリを読み込むときに使われます。システムライブラリのヘッダーは、/usr/local/includeとか、
/usr/include/に置かれます。ライブラリ (オブジェクトファイル) 本体は、/usr/libとか、/usr/lib64とかにおかれます。
一方、&amp;ldquo;&amp;ldquo;はユーザが作ったライブラリを読み込むために使われます。&amp;ldquo;&amp;ldquo;を使うと、コンパイラはカレントディレクトリの中で該当するヘッダーファイルを探します。
ライブラリとヘッダーは、一対一対応します。つまり、
プログラムからライブラリを読み出すときは必ず、ヘッダーでインクルードして、最後リンクする必要があります。
ユーザが定義したヘッダーでも同じです。まず、hogehoge.hppとhogehoge.cppを作って、コンパイルするときに&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;g++ main.cpp hogehoge.cpp
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいな感じで、hogehoge.cppもコンパイルします。オブジェクトができて、最後にリンクしています。
コンパイルー＞リンクって流れを覚えておけば問題ないです。
&lt;!-- raw HTML omitted --&gt;
サーチパスを追加したいときは、-Iで、ヘッダーのディレクトリ、-Lでライブラリのディレクトリをつけます。&lt;/p&gt;
&lt;h2 id=&#34;ld-リンカー-がデフォルトで見に行くディレクトリパス&#34;&gt;ld (リンカー) がデフォルトで見に行くディレクトリパス&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;という環境変数で定義されています。これは変えられます。次のようにサーチパスを追加します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、ldっていうのは、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Origins of the name &amp;#34;ld&amp;#34; are &amp;#34;LoaDer&amp;#34; and &amp;#34;Link eDitor&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;らしいです。知らんけど。&lt;/p&gt;
&lt;h2 id=&#34;共有ライブラリと静的ライブラリ&#34;&gt;共有ライブラリと静的ライブラリ&lt;/h2&gt;
&lt;p&gt;共有ライブラリは、実行時に動的に読まれるのに対して、静的ライブラリは、コンパイル時に実行ファイルに組み込まれる。
どちらがいいかはわからないけど、共有ライブラリは、実行ファイル (実行バイナリ) の大きさが小さくなるよね。
ちなみに、共有ライブラリはShared Objectだから、.soっていう拡張子が付きます。一方、静的ライブラリは、
a collection of object files bundled together into a single archive fileなので、arichveの.aが付きます。
つまり、hogehoge.soとhogehoge.aですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Singularity_and_docker</title>
      <link>https://blog.ingenboy.com/post/singularity_and_docker/</link>
      <pubDate>Mon, 15 Jan 2024 16:08:40 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/singularity_and_docker/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;再び、singularity環境でコンテナをビルドする必要が生じた。cuSZで圧縮を実現するために&lt;/p&gt;
&lt;h1 id=&#34;去年の10月にsingularityを使ってpymgardを作った時に殴り書きしたメモ&#34;&gt;去年の10月にsingularityを使ってpymgardを作った時に殴り書きしたメモ&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. まずは、ちゃんとネットワーク越しに動くようにしたいです。そのために、singularityのコンテナを作ろうと思います。頑張ってください。
いま、eclairでSingularityのSandboxを作っています。Dockerfile的なのが、singularityにもあるらしくね、Singularity.defってのが、それから今作っています。Sandboxを。
singularity build --fakeroot --sandbox pymgard.sandbox Singularity.def
WARNING: The underlying filesystem on which resides &amp;#34;/home/gp.sc.cc.tohoku.ac.jp/aoyagir/new_research/The_Middleware/src/python/pymgard.sandbox&amp;#34; won&amp;#39;t allow to set ownership, as a consequence the sandbox could not preserve image&amp;#39;s files/directories ownerships

&amp;gt;&amp;gt;&amp;gt; compressed = mgard.compress(original, 0.1, 0, mgard.ErrorBoundType.REL, config)
GPUassert: CUDA driver version is insufficient for CUDA runtime version /MGARD/include/mgard-x/Hierarchy/../RuntimeX/DeviceAdapters/DeviceAdapterCuda.h 628
cuda (ランタイム) はドライバーより古くても大丈夫。つまり、
なので、もしかしてまたエラーが起こるかもしれないです。つまり、/tmpで作ってくださいって話です。
で、ドライバーが最新のmuffin2で実行したら、普通に行けました。ナイスです。めっちゃナイスです。


--&amp;gt; ナイスですねー。あとは、そうですね、monakaで今後実験していくことになるので、monakaのipでハードコーディングしちゃってください！
ここに来るまでに売ったコマンド、ちょっとまとめておきますか。


sudo singularity build --fakeroot --sandbox pymgard.sif Singularity.def # SingularityのDockerfile的なの -&amp;gt; sandboxの. ここ、pymgard.sifじゃなくて、pymgard.sanxboxのが正しいのではないかな？まあいいや。
sudo singularity config fakeroot -add aoyagir
singularity shell --fakeroot -writable pymgard.sandbox
singularity build --fakeroot pymgard.sif pymgard.sandbox # sandbox -&amp;gt; sif
singularity shell --nv pymgard.sif


ポイントとしては、
1. singualrityはホームディレクトリを共有するからファイルを移動させる必要がないこと
2. fakerootを使うには、上のコマンドでfakerootが使えるように設定する必要があること
3. sandoboxじゃないと新しいモジュールはダウンロードできないこと
4. sifじゃないとなんか知らんけど、cudaがうまく使えないってこと。だから、sandboxからsifに変換する必要があるってこと。
--&amp;gt; sharkでも同じことをしました。sharkのGPUを使って評価したいと思いますー－－。
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;singularityにおけるdockerfile的なの&#34;&gt;singularityにおけるDockerfile的なの&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Bootstrap: docker
From: nvidia/cuda:12.1.1-devel-ubuntu22.04

%post
    apt-get update &amp;amp;&amp;amp; \
    apt-get install -y curl cmake git g++ pkg-config protobuf-compiler libprotobuf-dev libzstd-dev python3 python3-dev python3-pip

    curl -sL https://developer.download.nvidia.com/compute/nvcomp/2.6.1/local_installers/nvcomp_2.6.1_x86_64_12.x.tgz | tar xzvf - --directory=/usr/local



    pip3 install numpy
    pip3 install tiledb
    pip3 install h5py

    git clone https://github.com/szcompressor/cuSZ.git cusz-latest
    cd cusz-latest &amp;amp;&amp;amp; mkdir build &amp;amp;&amp;amp; cd build

    cmake .. \
        -DPSZ_BACKEND=cuda \
        -DPSZ_BUILD_EXAMPLES=on \
        -DCMAKE_CUDA_ARCHITECTURES=&amp;#34;75;80;86&amp;#34; \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_COLOR_DIAGNOSTICS=on \
        -DCMAKE_INSTALL_PREFIX=[/path/to/install/dir]
    make -j
    make install

%environment
    export PYTHONPATH=/MGARD/build/lib
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;拡張子は、.defです。この名前じゃないとだめなのかはわかりませんが。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_linux_plus_command_newbies</title>
      <link>https://blog.ingenboy.com/post/comments_on_linux_plus_command_newbies/</link>
      <pubDate>Sat, 13 Jan 2024 22:47:02 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_linux_plus_command_newbies/</guid>
      <description>&lt;h1 id=&#34;これはなにか&#34;&gt;これはなにか&lt;/h1&gt;
&lt;p&gt;西村めぐみさんが書いた「Linux + コマンド入門」
のまとめです。学んだことを箇条書きで書いていきます。&lt;/p&gt;
&lt;h1 id=&#34;画面のクリア方法&#34;&gt;画面のクリア方法&lt;/h1&gt;
&lt;p&gt;clearってやるとクリアされるのはわかりますね。まあ、俺はあまりクリアすることはないんですけどね。。。。
これ以外に、ctrl + lでクリアできるってのを覚えておくといいかもね。lって、割とホームポジションの近くだし、覚えやすいのでは。&lt;/p&gt;
&lt;h1 id=&#34;画面がフリーズした時の対処法&#34;&gt;画面がフリーズした時の対処法&lt;/h1&gt;
&lt;p&gt;ctrl + sでターミナルへの出力が停止されます。
これは、ctrl + qで解除することができます。&lt;/p&gt;
&lt;h1 id=&#34;uname周りについて&#34;&gt;uname周りについて&lt;/h1&gt;
&lt;p&gt;unameはシステムの基本情報を出すコマンドだよね。&lt;/p&gt;
&lt;h2 id=&#34;uname--a&#34;&gt;uname -a&lt;/h2&gt;
&lt;p&gt;すべての情報。これだけ覚えておけばいいかな。あ、でもしたのも覚えておくといいかも&lt;/p&gt;
&lt;h2 id=&#34;uname--r&#34;&gt;uname -r&lt;/h2&gt;
&lt;p&gt;これは、カーネルのリリース情報を出力するコマンドです。
よく、特定のカーネルパッケージをインストールしたいときとか、$(uname -r)って、シェル変数にしてコマンドを実行することがあるよね。&lt;/p&gt;
&lt;h1 id=&#34;manコマンドを使いこなそうって話だ&#34;&gt;manコマンドを使いこなそうって話だ&lt;/h1&gt;
&lt;p&gt;もうね、そろそろインターネットの情報ではなく、公式な情報から知識を得る方向にシフトしていった方がいい。情報の発信源ってのはすごく大事だからね。ってことで、
man &amp;lt;コマンド&amp;gt; で、そのコマンドの詳細を見られます。&lt;/p&gt;
&lt;h1 id=&#34;chmodとパーミッションについて&#34;&gt;chmodとパーミッションについて&lt;/h1&gt;
&lt;p&gt;ls -laで、そのディレクトリのすべてのファイルの属性の詳細がみられますよね。
chmodでパーミッションを変更できます。
僕はいつも、数字で変更していますが、
chmod &amp;lt;対象&amp;gt; &amp;lt;操作&amp;gt; でも変更できます。
&amp;lt;対象&amp;gt; : u,g,o
&lt;!-- raw HTML omitted --&gt;
&amp;lt;操作&amp;gt; : + &amp;lt;r,w,x&amp;gt;, - &amp;lt;r,w,x&amp;gt;, = &amp;lt;r,w,x&amp;gt;
って感じですね。&lt;/p&gt;
&lt;h1 id=&#34;chownとchgrp&#34;&gt;chownとchgrp&lt;/h1&gt;
&lt;p&gt;chownで、ファイルの所有者とグループを変更できますよね。
実は、chgrpで、ファイルのグループだけを変更することができます。
ちなみに、自分が所属しているグループであれば、sudoが必要ありませんが、
それ以外のグループである場合は、sudoが必要であるということです。
また、自分が所属しているグループは、idとか、groupsで確認できるということです。
さらに、ちなみになんだけど、ユーザはデフォルトでプライマリグループっていう、自分一人のグループに強制的に加入させられているらしいです。
で、それ以外のグループをセカンダリグループっていいます。&lt;/p&gt;
&lt;h1 id=&#34;findを使いこなせ&#34;&gt;findを使いこなせ&lt;/h1&gt;
&lt;p&gt;まだ使いこなせていない。&lt;/p&gt;
&lt;p&gt;find &amp;lt;場所&amp;gt;　-name &amp;lt;名前&amp;gt;　
find / -name .bash*
は、ルートディレクトリ以下で、.bashって名前が付くファイルを探せって意味だね。
いや、これ以外と使えるかもしれない。あのね、なんかね、findを使うといっつもめっちゃバーッて出てくるじゃない。あれって実は権限がないために出てくるエラーだったっていう、衝撃の事実。
&lt;!-- raw HTML omitted --&gt;
findを使うときは、エラー出力を抑制する2&amp;gt;/dev/nullとセットで使おうって話です。
こんな感じです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Virtual_box</title>
      <link>https://blog.ingenboy.com/post/virtual_box/</link>
      <pubDate>Sat, 13 Jan 2024 21:53:49 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/virtual_box/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;Linux + コマンド入門って本を買いました。
今更入門！？って感じですが、やっぱりどんな本も学ぶべきものはあります。この本では、「いきなりLinuxの物理コンピュータを準備するのは初心者には難しいから、最初はVMでLinuxをいじってみよう！」って書いてあるんですね。で、vmは大学2年の時に触ったのですが、ちゃんと理解したことがなかったので、これを機にまとめてみようって感じですね。&lt;/p&gt;
&lt;h1 id=&#34;前提知識&#34;&gt;前提知識&lt;/h1&gt;
&lt;p&gt;OSが起動されるまでの流れを改めておさらいしておきたいと思います。コンピュータが付きます。ROMに保存されているBIOSが起動されます。UEFIとも言いますね。BIOSがブートローダを起動します。GRUBっていうやつです。こいつは、カーネルをメインメモリにロードする役割を担います。ブートローダがカーネルをメインメモリにロードします。カーネルは、systemdを起動して、systemdがそれぞれのプロセスを順番に起動していきます。&lt;/p&gt;
&lt;p&gt;さらに、仮想マシンが何かについて、改めておさらいしておきたいですね
仮想マシンですね。ハードウェアで実行される命令セットレベルでマシンの動きを再現しているので、Dockerとかのコンテナ仮想化に比べてかなり動きが遅いですね。&lt;/p&gt;
&lt;h1 id=&#34;virtualboxのインストール方法&#34;&gt;virtualboxのインストール方法&lt;/h1&gt;
&lt;p&gt;公式ホームページに富んで、インストーラからインストールしてください。&lt;/p&gt;
&lt;h1 id=&#34;osのインストール方法&#34;&gt;osのインストール方法&lt;/h1&gt;
&lt;p&gt;まずは物理サーバにインストールするときと同じように、ホストOSのストレージにインストールをしないといけません。
ちなみに、ホストOS (windows) 上で、ゲストosがインストールされるのは、C:/Users/hoge/VirtualBox Vmsってところです。ここに各vmごとにディレクトリが作られる感じです。&lt;/p&gt;
&lt;p&gt;で、インストールの仕方ですが、まずはISOファイルってのを、各ディストリビューションプロバイダー？からダウンロードします。これがOSの元です。
余談ですが、「ISOイメージは、国際標準化機構 の定義した形式の光ディスク用アーカイブファイル」。ってかんじで、別にOSのために作られた専用のファイル形式とかではないって感じですね。わかりました。&lt;/p&gt;
&lt;p&gt;で、virtualBox開いて、割り当てる資源量とかを設定して、起動するって感じですね。自動インストール設定がONになっていると、自動でインストールしようとしますが、大体失敗します。ですが、ここであきらめずにどのISOをマウントするか聞かれるので、マウントするISOを選択して再起動するとうまくマウントされます。&lt;/p&gt;
&lt;h1 id=&#34;ネットワーク周りの設定&#34;&gt;ネットワーク周りの設定&lt;/h1&gt;
&lt;p&gt;仮想化ソフトウェア (virtualBox) は、vm用に新しいネットワークを作ります。10.x.x.xとかだった気がしますが。
で、このネットワークのデフォルトゲートウェイが仮想化ソフトウェアってことです。ルータでもありますね。外界とインタラクションするには、NATをする必要があるってことです。
設定で変更が可能です。しかし、NATの設定は、基本的に内部ネットワークから外部への通信を可能にするだけで、外部から内部への通信はできませんよね。
それを可能にするためには、ネットワーク設定を「ブリッジモード」にする必要があります。これにすると、ipアドレスが割り振られますね。そのipアドレスにホストosからsshすると、ちゃんとつながるんですね。こりゃすごいことです。まあ、当たり前っちゃ当たり前なのかもしれませんが。僕は結構すごいと思っちゃいます。&lt;/p&gt;
&lt;p&gt;ただね、ブリッジモードにした時の疑問なんですが、なんか知らんけど、ゲストOSと同じネットワークのIPをもらっちゃってるんですね。これ、どういうこっちゃと。&lt;/p&gt;
&lt;p&gt;また、NATだけでは、vm同士の通信はできません。
vm同士を通信させたいときは、NATネットワークモードで動かしましょう。&lt;/p&gt;
&lt;h1 id=&#34;centos上で特定のuserにsudo権限を与える方法&#34;&gt;centos上で、特定のuserにsudo権限を与える方法&lt;/h1&gt;
&lt;p&gt;centosではデフォルトでroot以外のユーザのsudo権限が与えられていません。いかにsudo権限の与え方を載せておきます。
rootでログインして、visudoをしてください。以下の方ナ行があると思うんで、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この下に、username ALL=(ALL)    ALL
を追記しましょう。&lt;/p&gt;
&lt;h1 id=&#34;疑問&#34;&gt;疑問&lt;/h1&gt;
&lt;p&gt;仮想マシンは命令セットレベルでコンピュータの動きを再現しているってのは理解しました。だから、ISOファイルをインストールするときは、armなのか、x86-64なのかを選んでインストールしないとだめなんですよね。ただですね、わからないのが、vmがいつどの段階で命令セットを理解しているのかって話。どの段階で命令セットアーキテクチャを理解するのだ？わからない。
x86_64上で動かしているから、x86_64じゃないと動かないのか、もしかして！そんな気がしてきた&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kernel_module_and_driver</title>
      <link>https://blog.ingenboy.com/post/kernel_module_and_driver/</link>
      <pubDate>Fri, 12 Jan 2024 12:03:32 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/kernel_module_and_driver/</guid>
      <description>&lt;h1 id=&#34;カーネルモジュールとドライバーについて&#34;&gt;カーネルモジュールとドライバーについて&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Driver: A driver is a software component that allows an operating system to communicate with and control a specific piece of hardware, such as a graphics card, network adapter, or printer. Drivers are typically provided by the hardware manufacturer and are loaded into the operating system to enable it to interact with and manage the hardware device properly. Drivers can be part of the kernel (built-in) or loadable as kernel modules.


Kernel Module: A kernel module, also known as a loadable kernel module or LKM, is a piece of code that can be dynamically loaded into the running kernel of an operating system to add or extend its functionality. Kernel modules are often used to support new hardware devices or add additional features to the kernel without having to rebuild the entire kernel. While drivers are one type of kernel module (specifically, those that handle hardware), kernel modules can serve other purposes beyond hardware support, such as adding file systems, networking protocols, or other kernel-level services.

In summary, a driver is a specific type of kernel module responsible for hardware device interaction, but not all kernel modules are drivers. Kernel modules can serve various purposes within the operating system, extending its functionality in different ways.
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Python_multithread</title>
      <link>https://blog.ingenboy.com/post/python_multithread/</link>
      <pubDate>Mon, 08 Jan 2024 10:04:34 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/python_multithread/</guid>
      <description>&lt;h1 id=&#34;pythonのマルツスレッドに関するメモ&#34;&gt;pythonのマルツスレッドに関するメモ&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;In Python, when you create threads within a class, the scope of the class itself does not affect the lifetime of tthoe threads. threads will continue to run until they complete their tasks or are expicitly terminated. The scope of the code block where the class is defined or instantiated does not affect the threads in side the class.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ということなので、スレッドをどうにかして停止する必要があるということです。どうやって停止するか？
なるほど、スレッドを停止されるには、joinメソッドを使えばいいんだな。なるほどなるほど。
joinに到達した瞬間、そのスレッドは停止される。理解した。&lt;/p&gt;</description>
    </item>
    <item>
      <title>File_cache</title>
      <link>https://blog.ingenboy.com/post/file_cache/</link>
      <pubDate>Sun, 07 Jan 2024 15:21:31 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/file_cache/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;タイトルの通りです。
OSはね、頻繁にアクセスされるファイルをメモリ上に載せておくんですね。ディスクアクセスは基本的に遅くなってしまうからね。その辺をいい感じにまとめておきたいのよね。&lt;/p&gt;
&lt;h2 id=&#34;参考文献&#34;&gt;参考文献&lt;/h2&gt;
&lt;p&gt;[この方の記事] (&lt;a href=&#34;https://qiita.com/ryuichi1208/items/bbf221ab66562e1426ca&#34;&gt;https://qiita.com/ryuichi1208/items/bbf221ab66562e1426ca&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;[Linuxとメモリの基礎＆vmstatの詳しい使い方] (&lt;a href=&#34;https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d&#34;&gt;https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d&lt;/a&gt;)&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;カーネルは、ディスク上のデータへのアクセスを高速に行うため、 read/writeの際にメモリ上にデータをキャッシュします。
キャッシュするメモリ上の領域を「ディスクキャッシュ」と 呼びます。

ディスクキャッシュには種類が2種類があります。それが「バッファキャッシュ」と「ページキャッシュ」です。
それぞれの概要は下記へ記します。
ちなみに、空きメモリがある限り、基本的にキャッシュはどんどん増加します。


ページというのは Linux の仮想メモリの最小単位。
ページキャッシュは、ディスク上のデータをページ単位で一時的に 保存するために使用されるメモリでファイルの読み書きの高速化に 使用されます。

バッファキャッシュは、プロセスがディスク上のデータに アクセスする際、アクセスすべきデータのブロックを高速に見つけるために使用されるメモリ
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;メモリの状態を確認する方法&#34;&gt;メモリの状態を確認する方法&lt;/h1&gt;
&lt;p&gt;メモリの使用状況はfrreeコマンド、もしくはvmstatコマンドで確認することができる。
それを使う前に
まず、基礎として覚えておきたいのが、osのメモリ構造だよね。
実メモリがあって、メモリには3つの領域がある。
1つ目が、使用中のメモリ。
2つめが、キャッシュ。
3つ目が、空きメモリ。」&lt;/p&gt;
&lt;p&gt;さらに、HDD等に、スワップ領域があるんだよね。&lt;/p&gt;
&lt;p&gt;使用中のメモリは、カーネルとアプリケーションなどのプロセスによって使用されているメモリのこと。
キャッシュとは、HDDやSSDアクセスなど、I/Oの高速化を行うためのキャッシュとして利用されるメモリのこと。空きメモリは、使用中のメモリとキャッシュに使われなかったメモリ。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用中のメモリが増えると、空きメモリが減る。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;空きメモリがある限り、基本的にキャッシュはどんどん増加する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;空きメモリがなくなれば、使用中のメモリの増加に応じて、キャッシュが減る。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キャッシュに割り当てられるメモリがなくなると、I/Oのパフォーマンスは低下する&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用中のメモリが実メモリより多くくなりそうになると、あふれる部分をスワップへ書き出す。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;vmstatの結果&#34;&gt;vmstatの結果&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0   1560 157622480 336252 333521088    0    0     0     3    0    0  9  0 91  0  0
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;freeの結果&#34;&gt;freeの結果&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;               total        used        free      shared  buff/cache   available
Mem:       494649720     3144036   157647192       53880   333858492   488291996
Swap:        4194300        1560     4192740
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;freeの方がわかりやすいよね。だから、freeを使うことにしよう。
total：合計メモリ量
used:メモリ使用量
free:全く使われていない未割当のメモリ量
shared:共有メモリで使用しているメモリ量
buff/cacheファイルバッファ＋キャッシュメモリに使われているメモリ量
available:プロセスが利用できるメモリ量&lt;/p&gt;</description>
    </item>
    <item>
      <title>Posix_and_filesystem</title>
      <link>https://blog.ingenboy.com/post/posix_and_filesystem/</link>
      <pubDate>Fri, 05 Jan 2024 13:25:55 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/posix_and_filesystem/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;いやー、研究でね、1プロセスからマルチスレッドで、ストレージから多次元配列データのサブセットを並列読み出しをする必要があってね。
HDF5っていうライブラリは、全配列データを一つのファイルで管理する一方で、
TileDBは配列データを複数のファイルに分けて管理しているんですね。
で、ですよ。前にも説明した通り、HDF5を使ってPararell readをしようとすると、
なんと性能がスケールしないんですよね。で、HDF5の公式サイトを見ると、HDF5はマルチスレッドをサポートしていないって書いてあったんですよ。
ただね、「マルチスレッドをサポートしていない」っていうのは、OSとのやり取り、具体的には、ファイルシステムとか、スレッドとか、その辺でインタラクションが生じて、
「マルチスレッドをサポートできない」んだと思うんですよね。&lt;/p&gt;
&lt;p&gt;というのもね、chatGPTに聞いた話によると、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POSIX I/O operations,
 by default, do not provide built-in support for parallel reading of a single file from multiple threads. 
 When multiple threads attempt to read from a single file concurrently using POSIX I/O functions, 
 there is a potential for race conditions and data corruption because POSIX I/O operations do not provide automatic synchronization between threads for file access.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ってことなんですよね。でね、システムがどのファイルシステムを使っていたかっていうとね、ext4なんですよね。でね、ext4はPOSIX互換なんですよね。
つまり、どうやら、HDF5がマルチスレッドをサポートしていないのではなく、
ext4が単一ファイルの並列読み書きをサポートしていない可能性が高くなってきた。
まだ確証は得られていないのですが。ということで、今からファクトチェックをしていきたいと思っています。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Postgres_newbies</title>
      <link>https://blog.ingenboy.com/post/postgres_newbies/</link>
      <pubDate>Thu, 28 Dec 2023 16:21:41 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/postgres_newbies/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;事情があってね、Mysqlではなく、Postgresを使わないといけないのですよ。
でね、PostgreSQL徹底入門手本を買ったので、それのまとめとか、読んでて気づいたこととか思ったこととか、そういうのまとめておきましょう。&lt;/p&gt;
&lt;h1 id=&#34;全体を読んでの感想&#34;&gt;全体を読んでの感想&lt;/h1&gt;
&lt;p&gt;やはり、Mysqlを使ってきたのでmysqlとの違いに目が行くわけですね。そうね、postgresは並列処理をスレッド並列ではなく、プロセス並列でやっているのが特徴的。Mysqlがスレッド並列だけどね。あと、プロセス単位でのコマンドが多い。つまり、プロセス内のコマンドではなく、プロセスとしてのコマンドね。これも結構違和感あるというか、一般的には、○○ーctlとかで一つのフロントエンドコマンドと、バックエンドで動いているデーモンプロセスの二つでエコシステムが構成されているが、postgresはなんかめっちゃ多い。
全体的にモダンな感じがしない。どちらかというと無骨だな。個人的にははやりMysqlがいいのではないかと思う。Mysqlであればストレージエンジンもプラがブルなのでinnodbとかほかのに変えることもできるし。しかし、俺にはPostgresを使わないといけない理由があるのだ！！ということで、使っていきたいと思う。しかし、何度も言うように、パフォーマンスはmysqlの方が断然上だし、
ほかのソフトとの親和性もmysqlの方が上だってことは伝えておきたい。apache igniteもmysqlとは接続性があるけど、postgresは聞いたことがないし。
あと、現在のpostgresの最新版は12だけど、これは11についてです。まあ、比較的新しいので気にする必要はないでしょう。&lt;/p&gt;
&lt;p&gt;余談だが、この本を読んで知識が体系的にまとめられた気がする。
postgresはバークレイで作られた。結構歴史についても詳しくなったし、知識の精緻化が進んだよ。
ACIDとCRUDもネットワークに組み込まれたので、忘れることはないだろうし、ジムグレイ (1998念チューリング賞受賞者) がACIDを提唱して、実装した人だってのももうわかった。あと、Michael stonebreaker (2014念チューリング賞受賞者) ね。この人がpostgresを作った人で、まさに巨人だ。ありがたい。
めっちゃ余談だが、2016年は、www,ブラウザ、webのプロトコルの発明者、ティムバーナーずりー。2017年のチューリング賞受賞者はあのへねぱた本で有名なジョンヘネシーとデイビットパターそん。
2018年のチューリング賞受賞者の一人はヤンルカンだし、2020年のチューリング賞受賞者はジャックどんがら先生です。&lt;/p&gt;
&lt;h1 id=&#34;ubuntuへのインストール手順&#34;&gt;Ubuntuへのインストール手順&lt;/h1&gt;
&lt;h2 id=&#34;パッケージをインストール&#34;&gt;パッケージをインストール&lt;/h2&gt;
&lt;p&gt;もうパッケージが何かはわかるよね。あるソフトってのは様々なライブラリに依存して作られているんだ。我々は巨人の方に乗っからせていただいているんだ。で、依存ライブラリも含めて提供してくれるのがパッケージな。いいか？&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo sh -c &amp;#39;echo &amp;#34;deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main&amp;#34; &amp;gt; /etc/apt/sources.list.d/pgdg.list&amp;#39;
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;サーバ起動手順&#34;&gt;サーバ起動手順&lt;/h1&gt;
&lt;p&gt;んー、本にはinitdbでデータベースクラスタ (データの保存先のディレクトリ) を作ってから起動する必要があるって書いてあったけど、今回はもう自動的に/var/lib/postgresql/12/mainに作られていたね。これはパッケージでインストールしたからかな。まあ、やってくれているなら問題ない。がinitdbちょっと使ってみたいんだよね。
あー、pg_ctlも使えないね。ちょっとこれはどうなのかな。&lt;/p&gt;
&lt;p&gt;これがインストールの際の出力結果だね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Creating new PostgreSQL cluster 12/main ...
/usr/lib/postgresql/12/bin/initdb -D /var/lib/postgresql/12/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user &amp;#34;postgres&amp;#34;.
This user must also own the server process.

The database cluster will be initialized with locale &amp;#34;en_US.UTF-8&amp;#34;.
The default database encoding has accordingly been set to &amp;#34;UTF8&amp;#34;.
The default text search configuration will be set to &amp;#34;english&amp;#34;.

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/12/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Tokyo
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 12 main start
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;initdbもあるけど、パスが通っていないんだね。
でね、もうすでに起動しちゃってるんだわ。だから、気にせずに行ってくれ。マジで。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn_react</title>
      <link>https://blog.ingenboy.com/post/learn_react/</link>
      <pubDate>Sat, 09 Dec 2023 18:25:46 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_react/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;いやね、何回もreactを勉強しなきゃな！と思いつつも、実際に始めると、結局はhtml + css + vanila jsでやってることの管理を容易にするだけのもの、っていう感が否めなくてね。しかもフレームワークだからブラックボックス化されてい持ち悪いしね。
始めるはいいものの、途中で投げ出してしまうことがもう3回くらいあった。
正直、vanilaでもよくね？と思っている節はある。
htmlでid属性を使って名前を付けて、class名をつけることで、bootstrapを使えば一瞬できれいになる。しかしだ。やはりreactが使われているにはそれなりの理由があるのだろう。
ということで、まじめにやってみることにした。&lt;/p&gt;
&lt;h1 id=&#34;ホワイトボックス化&#34;&gt;ホワイトボックス化&lt;/h1&gt;
&lt;p&gt;ってことでね、結局中で何が実行されているかがわかればええやんってことなんだよね。
最終的にブラウザに届くのはhtml + css + jsであることには変わりない。
これはブラウザ側でhtmlを見ればわかる。
index.htmlが呼ばれているんだよね。
で、index.htmlからは、/static/bundle.jsが読み出されている。この/static/bundle.js
が唯一のjavascriptファイルになっている。
reactプロジェクトの方では/src/いかにいろいろなコンポーネントを入れることになると思うんだけど、ビルド時にbundle.jsにまとめ上げられるってことなんだよね。それをまずは理解しよう。&lt;/p&gt;
&lt;p&gt;開発　ー＞　ビルド　ー＞　一つのスタティックファイルができるって話。そうだそうだ。&lt;/p&gt;
&lt;h1 id=&#34;src以下の話&#34;&gt;/src以下の話&lt;/h1&gt;
&lt;p&gt;/srcいかにはいろいろなコンポーネントが入っているって話をしたけど、親玉がいるって話なんよ。それが、index.jsな。こいつがすべてのコンポーネントの生みの親ってこと。
親玉の中身を見てみよう。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import React from &amp;#39;react&amp;#39;;
import ReactDOM from &amp;#39;react-dom/client&amp;#39;;
import &amp;#39;./index.css&amp;#39;;
import App from &amp;#39;./App&amp;#39;;
import reportWebVitals from &amp;#39;./reportWebVitals&amp;#39;;

const root = ReactDOM.createRoot(document.getElementById(&amp;#39;root&amp;#39;));
root.render(
  &amp;lt;React.StrictMode&amp;gt;
    &amp;lt;App /&amp;gt;
  &amp;lt;/React.StrictMode&amp;gt;
);
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;うん。document.getElementByIdでidがrootのやつを召喚している。index.htmlには確かにrootというidを持つタグがいる。
で、ReactDOMってやつにコピーしているのか？わからんが。で、root.renderで何かを作っているな。&lt;!-- raw HTML omitted --&gt;で呼び出しているぞ。。なるほど。ここに次々にコンポーネントを追加していく感じだな。なるほど。ちなみに、root.render()に渡すのが&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;import React from &amp;lsquo;react&amp;rsquo;;
import ReactDOM from &amp;lsquo;react-dom/client&amp;rsquo;;
import &amp;lsquo;./index.css&amp;rsquo;;
import App from &amp;lsquo;./App&amp;rsquo;;
import reportWebVitals from &amp;lsquo;./reportWebVitals&amp;rsquo;;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Things_wanna_do_after_graduation</title>
      <link>https://blog.ingenboy.com/post/things_wanna_do_after_graduation/</link>
      <pubDate>Thu, 07 Dec 2023 17:29:33 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/things_wanna_do_after_graduation/</guid>
      <description>&lt;h1 id=&#34;卒業した後にやりたいこと&#34;&gt;卒業した後にやりたいこと&lt;/h1&gt;
&lt;p&gt;いや、こういうのを書くのがかなり研究のモチベにつながると思っている&lt;/p&gt;
&lt;h1 id=&#34;春休み中にやりたいこと&#34;&gt;春休み中にやりたいこと&lt;/h1&gt;
&lt;h1 id=&#34;1-例のシステムをk8s上に展開いろいろと仕上げないといけないところもあるけどそして卒業したい競馬からあとは井上に任せて&#34;&gt;1. 例のシステムをk8s上に展開。いろいろと仕上げないといけないところもあるけど。そして卒業したい。競馬から。あとは井上に任せて。&lt;/h1&gt;
&lt;p&gt;しかし、機械学習モデルがまだ完成していないのだよ。
ここができない限りは完成しない。。。。くそ!!どうする！！！わからないぜ。。。どうすればいいんだ。
どうやって機械学習モデルを完成させるか。&lt;/p&gt;
&lt;h1 id=&#34;2-30日でできるos自作を読む&#34;&gt;2. 30日でできるOS自作を読む&lt;/h1&gt;
&lt;h1 id=&#34;3-cmuのデータベースの授業を全部見てbustubを完成させる&#34;&gt;3. CMUのデータベースの授業を全部見て、bustubを完成させる&lt;/h1&gt;
&lt;h1 id=&#34;35-linux-kernelを自分でビルドしたいlinux-kernel-newbiesを見て&#34;&gt;3.5. Linux kernelを自分でビルドしたい！！Linux kernel newbiesを見て！！&lt;/h1&gt;
&lt;h1 id=&#34;36-くそげーセンターを作りたい-しんいちろうにサーバ借りさせてそのうえでくそげーを展開させてあげればだいぶ喜ぶんじゃないか-しんいちろうにhtml--css--jsも教えようまあjsだけでいいかなcanvas&#34;&gt;3.6. くそげーセンターを作りたい！！ (しんいちろうにサーバ借りさせて、そのうえでくそげーを展開させてあげれば、だいぶ喜ぶんじゃないか？ しんいちろうにhtml + css + jsも教えよう。まあ、jsだけでいいかな。canvas)&lt;/h1&gt;
&lt;h1 id=&#34;4-reactをパーフェクトにする&#34;&gt;4. Reactをパーフェクトにする！&lt;/h1&gt;
&lt;h1 id=&#34;5-卒業前に研究室にlustreを構築したいけいちせんせいと&#34;&gt;5. 卒業前に研究室にLustreを構築したい！けいちせんせいと！&lt;/h1&gt;
&lt;p&gt;ーー＞Lustreの構築方法は頭に入れておきたいですね。というのも、僕のデータセンターにLustreファイルシステムを立てたいからですね。&lt;/p&gt;
&lt;h1 id=&#34;入社後にぼちぼちとやりたいこと&#34;&gt;入社後にぼちぼちとやりたいこと&lt;/h1&gt;
&lt;h1 id=&#34;6-gpuの神髄を学びたいみんながこんなに熱くなるのには必ず理由があるのだその理由が知りたい&#34;&gt;6. GPUの神髄を学びたい。みんながこんなに熱くなるのには必ず理由があるのだ。その理由が知りたい。&lt;/h1&gt;
&lt;h1 id=&#34;7-競馬の次に考えているプロジェクトが旅行だねhistorycal_figure_databaseを作りたいって話だこれも大がかりなプロジェクトになるなcanvasとデータベースが肝になってくると思っているあとはwikipediaからのデータのクローリングだな&#34;&gt;7. 競馬の次に考えているプロジェクトが旅行だね。historycal_figure_databaseを作りたいって話だ。これも大がかりなプロジェクトになるな。canvasとデータベースが肝になってくると思っている。あとはwikipediaからのデータのクローリングだな。&lt;/h1&gt;
&lt;h1 id=&#34;8-myサーバセンターを作るかdiyで&#34;&gt;8. Myサーバセンターを作るか、DIYで。&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Filesystem_performance_bench</title>
      <link>https://blog.ingenboy.com/post/filesystem_performance_bench/</link>
      <pubDate>Thu, 07 Dec 2023 11:12:04 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/filesystem_performance_bench/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;研究で開発しているミドルウェアがストレージからの読み出しをするんだよね。しかもparalellに。でもね、なんか知らないけど、paralellの数が3になるとめちゃめちゃ遅延が発生するようになってしまったんだよね。これなんでやと。気になったわけですよね。で、いろいろ調べようと思ったんです。&lt;/p&gt;
&lt;h2 id=&#34;復習だけどファイルシステムとは&#34;&gt;復習だけど、ファイルシステムとは&lt;/h2&gt;
&lt;p&gt;物理ストレージにビットを書き込むわけです、保存するためには。ただね、これ、どこにどういう風に書き込むか、というのはすごく面倒くさいんですよね、プログラムから管理するのは。だから、保存操作を抽象化してくれるソフトを作ったわけです。
ファイルシステムというね。ファイルシステムはOSにもともと組み込まれているもので、Linux-kernelを見ると確かにfsっていうディレクトリがある。
で、ファイルシステムはLinux-kernel越しに使うので、I/Oはシステムコールになるって話ですね。はい。&lt;/p&gt;
&lt;h2 id=&#34;ストレージのパーティションに構築されたファイルシステムの種類を確認&#34;&gt;ストレージのパーティションに構築されたファイルシステムの種類を確認&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;df -Th
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;このコマンドで確認できます。&lt;/p&gt;
&lt;h2 id=&#34;ストレージへの読み書き速度ベンチマーク&#34;&gt;ストレージへの読み書き速度ベンチマーク&lt;/h2&gt;
&lt;h3 id=&#34;ddコマンド&#34;&gt;ddコマンド&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The dd command is a simple way to test sequential read performance. You can use it to read a large file in parallel from multiple processes. Here&amp;#39;s an example:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ってのでもらったexample scriptがこちら&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Create a large test file (if it doesn&amp;#39;t already exist)
dd if=/dev/zero of=testfile bs=1M count=1000

# Use multiple dd processes to read the file in parallel
for i in {1..4}; do
    dd if=testfile of=/dev/null bs=1M iflag=direct status=none &amp;amp;
done

# Wait for all dd processes to finish
wait
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;fioコマンド&#34;&gt;fioコマンド&lt;/h2&gt;
&lt;p&gt;こっちの方が使いやすいと思う、のでこっちを使うことに使用&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_frontend_roadmap</title>
      <link>https://blog.ingenboy.com/post/comments_on_frontend_roadmap/</link>
      <pubDate>Mon, 04 Dec 2023 22:31:27 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_frontend_roadmap/</guid>
      <description>&lt;h1 id=&#34;事始め&#34;&gt;事始め&lt;/h1&gt;
&lt;p&gt;フロントエンドを極めたい。
いや、極めたいわけではない。しかし、不自由なく自分のシステムをユーザが使いやすい形に落とし込めるようにはなりたい。それも、そこそこきれいな感じに、バックエンドがどん何すごいことをしていてもユーザが結局使うのはフロントエンドなわけで。。。見せ方がへたくそだから評価が下がるのだけはまっぴらごめんだ。
ってことで買ったのがこの「フロントエンドの知識地図」ってほんなわけですね。はい。まあ、html,css,javascriptの基本的なところはそこそこわかっているんだけれども、一度体系的に学びたいなとね。&lt;/p&gt;
&lt;h1 id=&#34;とりあえず一回読んだ後の感想&#34;&gt;とりあえず一回読んだ後の感想&lt;/h1&gt;
&lt;p&gt;前半はhtmlとcssのグリッドレイアウト以外はためにならない話ばかりだった。
しかし、後半から面白くなっていった。付箋を貼った個所をとりあえず殴り書きさせてくれ。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;まずはグリッドレイアウトの話のところだよね。htmlとcssを使って、どの要素をどこに配置するかっていうのが決められるという話だ。これは大事だと思う。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;あー、vscodeがwebブラウザ技術を多分に含んでいる、それすなわちwebブラウザが多分にvscodeに技術を含んでいるってことで、githubでvscodeそっくりなテキストエディタが使えるよって話。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;はいはい、webのフロントエンドはフレームワークが多すぎてね、何が何かわからないじゃない。で、純粋なjsのことをvanila jsっていうみたいです。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MDNっていうのがhtml + css + jsを用いた開発の辞書みたいなもんやと
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;vanilaで開発しても結局モジュールごとにファイルを分けないと可読性が下がる。だったら、もうReactを使っていいんじゃねーのか、とも思ってきたわけです。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;といっても、Jsのフレームワークはあくまでも処理部分をやってくれるフレームワーク。装飾はやってくれない。だから、cssの知識は必要。だけど、タグ内にクラス名を指定するだけで統一感を持たせてくれるのがBootstrapってわけですね。BootStrapは使い方だけは知っておこうよ
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フロントエンドの知識地図だけど、やっぱりapiのことは説明してたよね。REST,Graphql,RPC全般。まあ、しばらくはRESTでいいよ。簡単だし、なれたし。イケてるIT系のバックエンドではRPCが使われているらしいけどね。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フロントエンドからRESTを使ってバックエンドと通信するときの関数として、fetch APIと、axiosが紹介されています。fetchはブラウザに標準でついている。が、通信機能しか備えていなくて使いづらいのでaxiosの方がいいんじゃね？って言ってます。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CORSについてもちゃんと説明していますね。原則としてwebサイトやwebアプリケーションから、ほかのサーバにあるAPIは読み出せないようになっています。なぜか？これができると、例えば悪意のあるjsスクリプトを入れてamazonの個人情報をゲットしちゃおー！とかができるからですね。でも、corsができないと不便なこともあるよね。その時は、WEBサイトではなく、APIサーバ側 (上の例でいうとamazon側) でcors okをする。
でも思ったんだけど、originがどこかってブラウザが知ってるわけじゃん？つまり、ブラウザをハックすればcorsもできるようになるって話や。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>DomainSock_vs_ipSock</title>
      <link>https://blog.ingenboy.com/post/domainsock_vs_ipsock/</link>
      <pubDate>Thu, 30 Nov 2023 12:50:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/domainsock_vs_ipsock/</guid>
      <description>&lt;h1 id=&#34;なぜunixドメインソケットはipソケットよりも高速なのか&#34;&gt;なぜunixドメインソケットはipソケットよりも高速なのか？&lt;/h1&gt;
&lt;p&gt;っていう話や。まあ、ちょっと事情があってプロセス間通信をしたいんですわ。
でね、わざわざtcp/ipのレイヤーまでもっていかなくてもいいやない、ローカルホスト内の通信だったらね。だからunixドメインソケットを使おうと思っているんだけど。
じゃあ、なんでunixドメインソケットのほうが高速なのかって話だけど、その理由はもう単純で、tcp/ipまでいかないからやな。もう少し具体的に書こうか。&lt;/p&gt;
&lt;h2 id=&#34;コンテキストスイッチが発生しない&#34;&gt;コンテキストスイッチが発生しない&lt;/h2&gt;
&lt;p&gt;まあ、ネットワーク通信ってシステムコールだからコンテキストスイッチが発生するんだよね。
でもドメインソケットはネットワーク通信ではないから、コンテキストスイッチが発生しないって話や&lt;/p&gt;
&lt;h2 id=&#34;networkstackを通る必要がない&#34;&gt;networkStackを通る必要がない&lt;/h2&gt;
&lt;p&gt;コンテキストスイッチが発生する以外にネットワーク通信はいろいろとオーバヘッドが大きいです&lt;/p&gt;
&lt;h2 id=&#34;buffer間でのコピーが発生する&#34;&gt;buffer間でのコピーが発生する&lt;/h2&gt;
&lt;p&gt;UnixドメインソケットはsharedMemoryを使って通信する。&lt;/p&gt;
&lt;p&gt;って感じや。&lt;/p&gt;
&lt;h1 id=&#34;でもソケットって扱いめっちゃ面倒じゃないですかどうやってやるんですか&#34;&gt;でもソケットって扱いめっちゃ面倒じゃないですか。どうやってやるんですか？&lt;/h1&gt;
&lt;p&gt;わかるー。マジでわかる。httpはsocketの上で作られているからね。扱いが簡単なんだよね。
あー、でも、ドメインソケットを使ってhttp通信をすればいいってことじゃね？いやそうやん！
そうしましょう。そのやり方を教えましょう。
kwi&lt;/p&gt;</description>
    </item>
    <item>
      <title>Library and build</title>
      <link>https://blog.ingenboy.com/post/library/</link>
      <pubDate>Thu, 02 Nov 2023 15:30:18 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/library/</guid>
      <description>&lt;h1 id=&#34;ccのライブラリーとビルドについて&#34;&gt;c/c++のライブラリーとビルドについて&lt;/h1&gt;
&lt;p&gt;ということで、c++でのヘッダーライブラリ関係を全部まとめます。&lt;/p&gt;
&lt;h1 id=&#34;ソースコードをビルドするまでの流れ&#34;&gt;ソースコードをビルドするまでの流れ&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;プリプロセス(preprocess)
#include は、&amp;lt;&amp;gt; 内に指定したヘッダーファイルの中身をソースコード内に組み込むプリプロセッサ指令です。
つまり、定義が書かれていない入出力関係だけが書かれたヘッダーを読み込むことは、プロトタイプ宣言にだいぶ近いものがあると思います。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンパイル (compile)
入出力関係を保ったまま、ソースコードを&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;アセンブル (assemble)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リンク (link)
制御のジャンプ先をここで決めるわけです。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;ヘッダーとライブラリはセット&#34;&gt;ヘッダーとライブラリはセット&lt;/h1&gt;
&lt;p&gt;関数をオブジェクトファイルにして、ほかのソースコードから呼び出せるようにしたものをライブラリといいます。
ソースコードはライブラリの入出力を知るために、ヘッダーファイルを使います。だから絶対にセットなんです。&lt;/p&gt;
&lt;h1 id=&#34;3rd-partyのライブラリをどうやって使うか&#34;&gt;3rd partyのライブラリをどうやって使うか？&lt;/h1&gt;
&lt;p&gt;ライブラリの配布のされ方はいろいろあると思うが、大きく分けて二つに分けられると思う。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;パッケージマネージャーを通してライブラリを配布&lt;/li&gt;
&lt;li&gt;githubでソースが公開されているライブラリを配布
どちらも最終的に使うときには、ヘッダーをインクルードして、ライブラリをリンクするんですが、使えるようになるまでが違います。ってことです。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;1-パッケージマネージャーを通してライブラリーを入手する方法&#34;&gt;1. パッケージマネージャーを通してライブラリーを入手する方法&lt;/h2&gt;
&lt;p&gt;これは、aptとかでライブラリを入手するあれです。
例えば、boost libraryとかは、aptで次のようにインストールできるわけですね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install libboost-all-dev
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で、ソースコード上でプログラムを使いたいときは、例えば、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#include&amp;lt;boost/asio.hpp&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;でインクルードして、
さらに、ビルド時にライブラリーをリンクするのを忘れないでください。はい。
ただ、boostはどうやらheader-only-libraryということで、リンクする必要はなさそうですね。はい。大丈夫です。&lt;/p&gt;
&lt;h2 id=&#34;2-githubでソースが公開されているライブラリ&#34;&gt;2. githubでソースが公開されているライブラリ&lt;/h2&gt;
&lt;p&gt;githubからソースコードを持ってきてください。
で、最近は大体cmakeがついていますね。cmakeでMakefileを作って、makeでビルドしてください。
最後に、make installでライブラリとヘッダーのデフォルトのサーチパスにヘッダーとライブラリをおいてくれます。ハイよろしく。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Intermediate_level_linux_command</title>
      <link>https://blog.ingenboy.com/post/intermediate_linux_command/</link>
      <pubDate>Thu, 02 Nov 2023 12:09:57 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/intermediate_linux_command/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;Linuxに関するいろいろなことをまとめてあるサイトを見つけたので、自分に有益な部分だけをまとめて行きたいと思う。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://hogetech.info/linux/base/command&#34;&gt;これです&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;俺が思うlinux中級者向けのコマンド達&#34;&gt;俺が思うLinux中級者向けのコマンド達&lt;/h1&gt;
&lt;p&gt;中級者というか、今の時点で俺が知らない、もしくは使いこなせていないコマンドって感じかな。&lt;/p&gt;
&lt;h2 id=&#34;find&#34;&gt;find&lt;/h2&gt;
&lt;p&gt;ファイルを検索する。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;find &amp;lt;検索パス&amp;gt;　-name &amp;lt;ファイル名&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;ファイル名の一部&lt;/em&gt; 的にやるのもだいぶいいと思うけど。&lt;/p&gt;
&lt;h2 id=&#34;useradd&#34;&gt;useradd&lt;/h2&gt;
&lt;p&gt;新規ユーザの作成&lt;/p&gt;
&lt;h2 id=&#34;id&#34;&gt;id&lt;/h2&gt;
&lt;p&gt;ユーザの確認&lt;/p&gt;
&lt;h2 id=&#34;stress&#34;&gt;stress&lt;/h2&gt;
&lt;h2 id=&#34;dmesg&#34;&gt;dmesg&lt;/h2&gt;
&lt;h2 id=&#34;lsmod&#34;&gt;lsmod&lt;/h2&gt;
&lt;p&gt;ロード済みのカーネルモジュール一覧を表示する&lt;/p&gt;
&lt;p&gt;ちなみに、カーネルモジュールとは「カーネルの機能を拡張するためのバイナリファイルです。
例としては、ディスク・ネットワークカード等をLinuxカーネルで使用可能にするためのデバイスドライバなどがあります。
デバイスドライバは各ハードウェアベンダーから提供されることが多いです。&lt;/p&gt;
&lt;p&gt;初期のUNIX系OSでは新しいハードウェアを使うにはカーネルの再構築が必要でしたが、
現在のLinuxカーネルは、必要ありません。
起動時に常駐カーネルがメモリにロードされ、必要に応じてロード・アンロードが出来るようになっています。
です。いつか自分でも自作してみたいきはだいぶしていますねー。&lt;/p&gt;
&lt;h2 id=&#34;modprobe&#34;&gt;modprobe&lt;/h2&gt;
&lt;p&gt;カーネルモジュールのロード、アンロードを行うコマンド
「カーネルモジュールとは、Linuxカーネルの機能の一部を、カーネル本体とは別にロード、アンロードできるように分離したサイズの小さいバイナリファイルです。多くの場合、ハードウェアにアクセスし、操作するためのドライバ部分がカーネルモジュールとなっています。&lt;/p&gt;
&lt;p&gt;　ドライバ自体をカーネルに組み込む古い方式では、ハードウェア構成を変更した場合に、カーネルの再構築が必要になります。現在では、ほとんどのドライバがモジュールとして提供されているため、ハードウェア構成変更後は、必要なカーネルモジュールをロードしてカーネルに組み込むだけで対応できるようになっています。&lt;/p&gt;
&lt;p&gt;　modprobeは、モジュールの依存関係を確認し、必要なモジュールがあれば同時に組み込むといった処理も行います。モジュールの組み込みには内部的に「insmod」コマンドを用いており、取り外しでは「rmmod」コマンドを使っています。
」
ってことですね。&lt;/p&gt;
&lt;h1 id=&#34;fhs-filesystem-hierarchy-standardについて&#34;&gt;FHS (Filesystem Hierarchy Standard)について&lt;/h1&gt;
&lt;h2 id=&#34;bin&#34;&gt;/bin&lt;/h2&gt;
&lt;p&gt;コマンドファイルが入っている。すべてのユーザが利用するコマンドが保存されているディレクトリ。lsとか、echoとか。
ここに入っているコマンド全部覚えておいて損はないと思いますけどね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;bash           fusermount      netcat         su
bunzip2        grep            netstat        sync
busybox        gunzip          networkctl     systemctl
bzcat          gzexe           nisdomainname  systemd
bzcmp          gzip            ntfs-3g        systemd-ask-password
bzdiff         hciconfig       ntfs-3g.probe  systemd-escape
bzegrep        hostname        ntfscat        systemd-hwdb
bzexe          ip              ntfscluster    systemd-inhibit
bzfgrep        journalctl      ntfscmp        systemd-machine-id-setup
bzgrep         kbd_mode        ntfsfallocate  systemd-notify
bzip2          keyctl          ntfsfix        systemd-sysusers
bzip2recover   kill            ntfsinfo       systemd-tmpfiles
bzless         kmod            ntfsls         systemd-tty-ask-password-agent
bzmore         less            ntfsmove       tar
cat            lessecho        ntfsrecover    tempfile
chgrp          lessfile        ntfssecaudit   touch
chmod          lesskey         ntfstruncate   true
chown          lesspipe        ntfsusermap    udevadm
chvt           ln              ntfswipe       ulockmgr_server
con2fbmap      loadkeys        openvt         umount
cp             login           pidof          uname
cpio           loginctl        ping           uncompress
dash           lowntfs-3g      ping4          unicode_start
date           ls              ping6          vdir
dd             lsblk           ps             wdctl
df             lsmod           pwd            which
dir            mkdir           rbash          ypdomainname
dmesg          mknod           readlink       zcat
dnsdomainname  mktemp          red            zcmp
domainname     modeline2fb     rm             zdiff
dumpkeys       more            rmdir          zegrep
echo           mount           rnano          zfgrep
ed             mountpoint      run-parts      zforce
egrep          mt              sed            zgrep
false          mt-gnu          setfont        zless
fbset          mv              setupcon       zmore
fgconsole      nano            sh             znew
fgrep          nc              sleep
findmnt        nc.openbsd      ss
fuser          nc.traditional  stty
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;lib&#34;&gt;/lib&lt;/h1&gt;
&lt;p&gt;共有ライブラリを保存するディレクトリです。
共有ライブラリが何なのかわかる？&lt;/p&gt;</description>
    </item>
    <item>
      <title>TileDbonS3</title>
      <link>https://blog.ingenboy.com/post/tiledbons3/</link>
      <pubDate>Fri, 27 Oct 2023 15:16:17 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/tiledbons3/</guid>
      <description>&lt;h1 id=&#34;オブジェクトストレージとは&#34;&gt;オブジェクトストレージとは？&lt;/h1&gt;
&lt;h1 id=&#34;tiledbの使い方の基本&#34;&gt;tiledbの使い方の基本&lt;/h1&gt;
&lt;p&gt;まず、知っておきたいのは、TileDBはmariadbやmysqlののようにサーバクライアント方式のデータベースではないということ。どちらかというと、sqliteやhdf5のように、ライブラリとして提供されているものだと思ってほしい。しかし、なんとデータの実態はリモートに置いておいて、httpでそのデータを取ってくるってこともできる。この時に、オブジェクトストレージってのが使われます。&lt;/p&gt;
&lt;p&gt;で、c++とpythonの二つがあるけど、使いやすいし、今回はpythonでやろうと思う。環境構築はいたって簡単。condaとかで新しい環境を作って、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pip install tiledb
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;をするだけです。
非常に簡単！で、ここからは使い方ですね。&lt;/p&gt;
&lt;h2 id=&#34;import&#34;&gt;import&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import tiledb
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;空間とスキーマを定義し&#34;&gt;空間とスキーマを定義し、&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# Don&amp;#39;t forget to &amp;#39;import numpy as np&amp;#39;
dom = tiledb.Domain(tiledb.Dim(name=&amp;#34;rows&amp;#34;, domain=(1, 4), tile=4, dtype=np.int32),
                    tiledb.Dim(name=&amp;#34;cols&amp;#34;, domain=(1, 4), tile=4, dtype=np.int32))

schema = tiledb.ArraySchema(domain=dom, sparse=False,
                            attrs=[tiledb.Attr(name=&amp;#34;a&amp;#34;, dtype=np.int32)])
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;データベースの名前を定義&#34;&gt;データベースの名前を定義&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;array_name = &amp;#34;quickstart_dense&amp;#34;
tiledb.DenseArray.create(array_name, schema)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;重要事項&#34;&gt;重要事項&lt;/h3&gt;
&lt;p&gt;上のarray_nameっていうので、データのディレクトリが指定されます。ただ、ここには、次のような形式でパスを指定することもできるし、
リモートにあるオブジェクトストレージにアクセスすることだって可能です。こんな感じです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;array_name = &amp;#39;file:///home/usrname/my_array
array_name = &amp;#39;s3://bucket-name/array-name&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいな感じですね。ここで出てきたs3っていうのが、僕にとっては初耳の知識でした。結構web業界では使われてるみたいですね。
amason simple storege service (amazon s3)とは、オブジェクトストレージサービスです。
ブロックストレージというのがいつも使っているハードディスクとかssdとか、あの辺のやつね。
じゃあオブジェクトストレージとは何か？って話なんだけど、
まあ簡単に言うと、ファイルシステムが入っていななくて、データ単体をオブジェクトとして保存している、というかんじ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Object storage systems typically do not have a traditional file system hierarchy within them. Instead, they store data as objects, each with its own unique identifier (often called a key) and associated metadata. These objects are typically organized in a flat namespace rather than a hierarchical directory structure.

In a traditional file system, you have directories (folders) that contain files, and you navigate through the hierarchy to access your data. In contrast, object storage relies on a flat namespace where each object is stored independently and accessed by its unique key. This approach simplifies data management and makes it well-suited for storing large volumes of unstructured data, such as images, videos, documents, and backups.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;オブジェクトストレージはファイルシステムを持っていなくて、フラットなデータストレージ上にキーとそのデータを保管しているんだね。key-valueストアだね。その構造についてだけど、実際にハードディスクへの書き込みをするコンポーネントが合って、メタデータを管理するコンポーネントがあって、httpでのアクセスに対して処理をするコンポーネントがある。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn_oauth</title>
      <link>https://blog.ingenboy.com/post/learn_oauth/</link>
      <pubDate>Thu, 12 Oct 2023 10:44:25 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_oauth/</guid>
      <description>&lt;h1 id=&#34;oauthの大枠についていい感じに理解したので覚えているうちにアウトプットしておく&#34;&gt;oauthの大枠について、いい感じに理解したので、覚えているうちにアウトプットしておく&lt;/h1&gt;
&lt;p&gt;まあ、経験的にもわかると思うけど、新しくemailを登録してそこに確認メールを送って、認証する、っていうやつ、あれやっぱり面倒くさくて、CVR下げるのよね。ってことで、やっぱりgoogleとかLINEとかを使った認証のほうが圧倒的に楽なわけですわ。ポチってしまうわけですわ。これ、自分のアプリに組み込むことで圧倒的にユーザを確保できると思うんですよね。ってことで、&lt;/p&gt;
&lt;h1 id=&#34;仕組み&#34;&gt;仕組み&lt;/h1&gt;
&lt;p&gt;大事なのは、どのフェーズにおいても、URLそのものに重要な情報を乗っけてやり取りしてるってこと。
まず、ユーザがログインページでgoogleによる認証をクリックしたとするよね。これはゲットリクエストなわけですわ。このgetリクエストに対して、サーバはユーザをgoogleの認証サーバにリダイレクトするわけです。
で、リダイレクトのurlの中にこのサイトの情報が乗ってるんですよね、サイトのIDってやつです。
このIDは事前にgoogleのdeveloperサイトでもらえます。google側はこのIDでどのサイトかを判別しているんですね。更にこのサイトでコールバックのURL (ユーザがgoogle側にこのアプリに情報を送ることを承認するボタンを押したあとにリダイレクトされるURL) も登録しておきます。
で、ユーザが承認すると、コールバックのURLにユーザの情報にアクセスするためのトークンを乗っけてこっちにリダイレクトされるわけですわ。
で、そのトークンを使って、ユーザの情報にアクセスできるようになるわけです。&lt;/p&gt;
&lt;h1 id=&#34;ただ自分でメール認証の仕組みを作るのも重要だとは思っている&#34;&gt;ただ、自分でメール認証の仕組みを作るのも重要だとは思っている。&lt;/h1&gt;
&lt;p&gt;これの作り方、そんなにむずくないよね。
まず、ユーザにメールアドレスを入力してください。ってお願いするわけです。
で、入力されたメールアドレスに、このサイトのurlと/auth/mail/{random}
みたいなのを入れておくわけですわ。randomっていうのが、そのメールアドレスと一時的に紐付けられているランダムな値です。で、ユーザが/auth/mail/{random}にアクセスしてきたら、まあ、実際にそのメールアドレスがあったんやなってわかるわけですわ。まあなんでもいいよ、mail2uuid := map[string]stringとかで管理しているやつと&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;for k,v := range m {
    if v == uuid {
        // そのイーメールアドレスを認証する、って感じです。
        // このときにcookieを入れておくといいですね。ええ。
        // cookieとemailを紐付けるのを忘れないように。
        // useridとパスワードを入力するページにリダイレクトします。
        // って感じです。はい。
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これ、有効期間決めておいたほうがいいですね。数分とかそんな感じで。&lt;/p&gt;
&lt;h1 id=&#34;ちなみにgolangからemailを送信する一番いい方法なんだけど&#34;&gt;ちなみに、golangからemailを送信する一番いい方法なんだけど、&lt;/h1&gt;
&lt;p&gt;やっぱり、リレーするのがいいみたいです。ええ。
chatGPTに出してもらったコードがこちらですね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package main

import (
    &amp;#34;net/smtp&amp;#34;
    &amp;#34;log&amp;#34;
)

func main() {
    // Sender and recipient email addresses.
    from := &amp;#34;your_email@gmail.com&amp;#34;
    to := &amp;#34;recipient@example.com&amp;#34;

    // SMTP server configuration.
    smtpServer := &amp;#34;smtp.gmail.com&amp;#34;
    smtpPort := &amp;#34;587&amp;#34;
    smtpUsername := &amp;#34;your_email@gmail.com&amp;#34;
    smtpPassword := &amp;#34;your_email_password&amp;#34;

    // Compose the email message.
    subject := &amp;#34;Hello, Golang Email!&amp;#34;
    body := &amp;#34;This is a test email sent from a Golang application.&amp;#34;

    // Define the SMTP server&amp;#39;s authentication information.
    auth := smtp.PlainAuth(&amp;#34;&amp;#34;, smtpUsername, smtpPassword, smtpServer)

    // Create the email message.
    msg := &amp;#34;Subject: &amp;#34; + subject + &amp;#34;\r\n&amp;#34; +
        &amp;#34;To: &amp;#34; + to + &amp;#34;\r\n&amp;#34; +
        &amp;#34;From: &amp;#34; + from + &amp;#34;\r\n\r\n&amp;#34; +
        body

    // Send the email.
    err := smtp.SendMail(smtpServer+&amp;#34;:&amp;#34;+smtpPort, auth, from, []string{to}, []byte(msg))
    if err != nil {
        log.Fatal(err)
    }

    log.Println(&amp;#34;Email sent successfully!&amp;#34;)
}
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;決済の方法についてもいくつかあると思うのでまとめておきたい&#34;&gt;決済の方法についてもいくつかあると思うので、まとめておきたい。&lt;/h1&gt;
&lt;p&gt;まずは、どの決済を組み込むかなんだけど、まあ普通に
paypayとpaypalとまああとはクレジットカードでいいかね。
そうね、ユーザにポイントを付与する感じにするか。
1シミュレーション100ポイントとかにしてとかにして、って感じかね。
実際に購入画面に進むためには500ポイントとかにして。1000ポイント買うと、200ポイントおまけでついてくる、とかにしてね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>The_strength_of_being_misunderstood</title>
      <link>https://blog.ingenboy.com/post/the_strength_of_being_misunderstood/</link>
      <pubDate>Wed, 27 Sep 2023 17:02:50 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/the_strength_of_being_misunderstood/</guid>
      <description>&lt;h1 id=&#34;サムアルトマンのブログでかなり好きだったポスト&#34;&gt;サムアルトマンのブログでかなり好きだったポスト&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The Strength of Being Misunderstood
A founder recently asked me how to stop caring what other people think. I didn’t have an answer, and after reflecting on it more, I think it&amp;#39;s the wrong question.


Almost everyone cares what someone thinks (though caring what everyone thinks is definitely a mistake), and it&amp;#39;s probably important. Caring too much makes you a sheep. But you need to be at least a little in tune with others to do something useful for them.


It seems like there are two degrees of freedom: you can choose the people whose opinions you care about (and on what subjects), and you can choose the timescale you care about them on. Most people figure out the former [1] but the latter doesn’t seem to get much attention.


The most impressive people I know care a lot about what people think, even people whose opinions they really shouldn’t value (a surprising numbers of them do something like keeping a folder of screenshots of tweets from haters). But what makes them unusual is that they generally care about other people’s opinions on a very long time horizon—as long as the history books get it right, they take some pride in letting the newspapers get it wrong. 


You should trade being short-term low-status for being long-term high-status, which most people seem unwilling to do. A common way this happens is by eventually being right about an important but deeply non-consensus bet. But there are lots of other ways–the key observation is that as long as you are right, being misunderstood by most people is a strength not a weakness. You and a small group of rebels get the space to solve an important problem that might otherwise not get solved.
&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Learn_k8s_2</title>
      <link>https://blog.ingenboy.com/post/learn_k8s_2/</link>
      <pubDate>Wed, 27 Sep 2023 12:31:09 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s_2/</guid>
      <description>&lt;h1 id=&#34;learn_k8s_2&#34;&gt;learn_k8s_2!&lt;/h1&gt;
&lt;p&gt;はい、前回がk8sクラスタの構築部分でした。ここからは実際に運用をどうするか？ってところに焦点を当てていきたいと思います。&lt;/p&gt;
&lt;p&gt;前回の冒頭の記事はいい感じだったので、ここにも書いておきたいと思います。&lt;/p&gt;
&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;k8sという技術が注目を浴びている。web業界での近年の大きな変化としてはアプリケーションアーキテクチャの変化が挙げられる。従来は、アプリケーションを構成するソフトはモノリシック(一枚板)であった。つまり、アプリケーションは、一つのソースコードで1プロセスで動いているような感じだった。しかし、このモノリシックなアーキテクチャではソースコードが複雑で、変更が加えにくい等の問題があった。チームで開発する際も、メンバーみんなが同じソースコードをつかってビルドをする必要がある等、いろいろと面倒なことが多かったと思う。そこで、近年はアプリ開発にはマイクロサービスアーキテクチャが採用されている。マイクロサービスアーキテクチャは、小さなコンポーネントの集合が全体として一つのアプリケーションを構成しているようなアーキテクチャである。&lt;/p&gt;
&lt;p&gt;自分も意図せずして、開発してきたアプリはマイクロアーキテクチャにしていたが、こちらの方が各コンポーネントの役割をきちんと明確化して進められるので、開発を分担できるのと、変更を加えるとき、役割がコンポーネントに分かれているので、各コンポーネントの中身だけを変えればよく、管理が簡単になると思われる。つまり、APIだけそろえておけば、後は中身はなんだっていいということだ。
これによって、アジャイル開発が非常に簡単になると思われる。
そして、このコンポーネントをひとつひとつをコンテナ化するってのも近年の大きな流れだ。コンテナ化することで、そのコンテナはCPUのアーキテクチャさえそろっていればどんなマシン上でも動くようになるからだ。そして、コンテナ化されたコンポーネント（マイクロサービス）をうまく協調させるのが
コンテナオーケストレーションツールってはなしだ。
コンポーネントを協調させる、と書いたが、具体的には(k8sの機能は非常に多いので、俺が理解できる、かつ、大事そうなものだけをピックアップする)、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コンテナのスケジューリング&lt;/li&gt;
&lt;li&gt;スケーリング/オートスケーリング&lt;/li&gt;
&lt;li&gt;障害時のセルフヒーリング&lt;/li&gt;
&lt;li&gt;ロードバランシング&lt;/li&gt;
&lt;li&gt;ワークロードの管理
とかがある。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;k8sの基本的なコンポーネント&#34;&gt;k8sの基本的なコンポーネント&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=X48VuDVv0do&#34;&gt;参考動画&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/ryu-yama/items/2e23342fd0f37e43a925&#34;&gt;基本用語説明&lt;/a&gt;
dbと連携させたjsアプリを題材に、k8sのコンポーネントを説明していくよ！&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;
&lt;p&gt;cluster
k8sのリソースを管理する集合体のこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;node
物理マシン、もしくは仮想マシンのこと。つまり、ホストのこと。
ノードには、master nodeと普通のnodeがある。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;master nodeはkubernetesを管理するため、次の管理コンポーネントを持つ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;kube apiserver:kubernetesのAPIを公開する。kubectlからの操作を受け付ける役割。kubeletからもアクセスを受けるし、他にもいろいろなクライアントがある。これがclusterへのgatewayになる。ユーザは必ずkube apiserverを通してクラスターとやり取りをするということだね。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;etcd:分散kvs。クラスタのバッキングストアとして使用される。ログとかが記録されている。etcdは分散kvs、ということはetcdを何個か立てることが可能、ということでして、そうするとetcd間で内容の一貫性を保たないといけないわけですね。ということは？お？層です。分散合意アルゴリズムのraftが使われているわけですね。最高です。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kube scheduler:コンテナを配置する最適なnodeを選択する。ここも研究の対象になりえるところではある。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kube controller manager: リソースを制御する&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;k8sでソフトで実現される概念的なコンポーネント-下で紹介するがこれをリソースと呼ぶ&#34;&gt;k8sでソフトで実現される概念的なコンポーネント (下で紹介するが、これをリソースと呼ぶ。)&lt;/h1&gt;
&lt;p&gt;Nodeはコンテナ化されたアプリケーションを実際に実行するホスト&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;pod
コンテナの集合体。PodはNodeの中で動作し、一つ以上のコンテナを持つ。
K8sにデプロイするときは、Pod単位で行う。(実際はdeployという単位でコンテナをデプロイするんです)
pod一つでなにか機能を果たす、とかそういう感じでpodにまとめるのだと思われる。
そうだね、1 application per Podというのが基本らしい。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;k8sはvirtual networkを提供。各Podはこの仮想ネットワーク上でIPアドレスを持っている。
そして、これが結構大事な概念だんだが、Podは結構簡単に死ぬ。そして、Podが死んだら、新しいPodがデプロイされるのだが、その時にIPアドレスが変わってしまうというのが不便らしい。その時に使うのがServiceらしい。&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Container
Dockerコンテナのこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ReplicaSet
同一仕様のPodを複数生成する仕組み。
ReplicaSetを複数持っておくことで、一つのReplicaSetが死んでも他のReplicaSetに
処理を移すことでシステムが死んでいる時間をなくす。
後は、ロードバランスもできる。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;データベースは基本的にk8sクラスタの外で管理する。というのも、ステートを考えるのが面倒くさいかららしいです。&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;Service
Serviceは、Podにアクセスするための経路を定義。
PodのIPアドレスを固定できる。
外部への公開ポイントもここで設定する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deployment
ReplicaSetの上位リソースで、ReplicaSetを管理する。
つまり、
DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ingress
クラスタ外部からのエンドポイント？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ConfigMap
Podsの設定ファイル&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_how_the_internet_works</title>
      <link>https://blog.ingenboy.com/post/comments_on_how_the_internet_works/</link>
      <pubDate>Thu, 21 Sep 2023 16:48:43 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_how_the_internet_works/</guid>
      <description>&lt;h1 id=&#34;いい本である&#34;&gt;いい本である&lt;/h1&gt;
&lt;p&gt;あのね、アプリとか、ネットワークとか、サーバとか、そのへんがある程度詳しくなってから改めて読むと、めちゃめちゃ整理されていて、めっちゃためになる。
&lt;!-- raw HTML omitted --&gt;
最初にかんたんに全体像を説明しておくか。ネットワークの。
&lt;!-- raw HTML omitted --&gt;
アプリがある。アプリは、システムコールを使ってデータの送信をosに依頼する。例えば、HTTPもアプリだよね。アプリケーションプロトコル。
&lt;!-- raw HTML omitted --&gt;
で、アプリから依頼されたosの中で一番最初にデータを受け取るのがTCP(UDP)。こいつは、一番最初の通信経路の確立、データの分割、再送信、などを担う。TCPヘッダーには色々入っています。で、分割されたデータをパケットっていうんですね。
&lt;!-- raw HTML omitted --&gt;
HTTPのヘッダーとか、ボディーとかも、TCPから見るとバイトの羅列でしかないってことはめっちゃ大事なポイント。
で、TCPは更にIPに送信を依頼する、というわけですね。
&lt;!-- raw HTML omitted --&gt;
IPで意外なのは、IPはIPヘッダーをつけるだけでなく、MACヘッダーもつける、ということです。ここは大事。マックもつくんです。送信相手の見つけ方なんだけど、まずは送信先のIPを見つけるんだよね。そのときにはルーティングテーブルを見るんですね。linuxだと、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;route
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コマンドで見られます。で、どこに送信すればいいかがわかると。
&lt;!-- raw HTML omitted --&gt;
でね、イーサネットの中では、IPは通用しないんだよね。(IPとイーサを一緒にしないのはなぜか？というのは考えラバわかります。考えてください。)それは、IPという概念がないから。だから、IPと一対一に紐付いたMACを調べないと行けないんだよね。そのときに使うのがARPプロトコルだね。address resolution protocolだね。これは、ブロードキャストアドレスに対して出されるプロトコル。だから、みんな受け取るんだよね。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h1 id=&#34;アプリケーション層&#34;&gt;アプリケーション層&lt;/h1&gt;
&lt;h1 id=&#34;tcpip層&#34;&gt;TCP/IP層&lt;/h1&gt;
&lt;h2 id=&#34;tcpの仕事&#34;&gt;TCPの仕事&lt;/h2&gt;
&lt;h2 id=&#34;ipの仕事&#34;&gt;ipの仕事&lt;/h2&gt;
&lt;h2 id=&#34;イーサネット層&#34;&gt;イーサネット層&lt;/h2&gt;
&lt;p&gt;おもろかったのが、イーサネットの間は全部同じデータが流れている、というところ。これかなりおもろかった。イーサネットケーブルでつながっているノード同士は、大きな部屋に入っている人のようなもので、誰かが大声で叫んだら、それをみんなが聞けるのとおんなじだ。って話。これはおもろいね。だからイーサネットケーブルっていつもあんなにピカピカ光ってるんだよね。りかい？？
んで、そこで宛先を判別するためにMACアドレスが使われている、ってはなし。
&lt;!-- raw HTML omitted --&gt;
ただね、スイッチングハブは、MACアドレスを見てその相手に向かっているイーサネットケーブルにしか流さないから、章電力なわけ。りかい？&lt;/p&gt;
&lt;h1 id=&#34;ハブスイッチルータ&#34;&gt;ハブ、スイッチ、ルータ&lt;/h1&gt;
&lt;h1 id=&#34;アクセス回線プロバイダ&#34;&gt;アクセス回線、プロバイダ&lt;/h1&gt;
&lt;h1 id=&#34;サーバ側&#34;&gt;サーバ側&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Comments_on_first_go_lang</title>
      <link>https://blog.ingenboy.com/post/comments_on_first_go_lang/</link>
      <pubDate>Wed, 06 Sep 2023 14:32:59 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_first_go_lang/</guid>
      <description>&lt;h2 id=&#34;まえがき&#34;&gt;まえがき&lt;/h2&gt;
&lt;p&gt;Go言語はhttpサーバに使われることがおおいー＞これは、現代のシステムがマイクロアーキテクチャに依存していることを示している。一つ一つのコンポーネントは単純な入出力に対応しているだけである。そのため、シンプルなgo言語が好まれるのだろう。&lt;/p&gt;
&lt;p&gt;さらに、goの人気を上げているのが、並行処理の扱いやすさにある。
一般的な言語では、スレッドを立てて、スレッド間でなにか、スレッドセーフなコンテナを準備してやり取りをしないといけなかった。
しかし、goでは、goroutineとchannelを使って、スレッド間通信のようなものがかんたんにできるのがかなりいい。&lt;/p&gt;
&lt;p&gt;以上の２つの要因によって、goではデータの流れがだいぶ見やすくなっていると思う。川上から川下へ流れていくがごとく、データの流れがとにかくつかみやすい。&lt;/p&gt;
&lt;p&gt;goで特徴的なもう一つの機能は、インターフェースだろう。
これについては、後ほど説明する。&lt;/p&gt;
&lt;h1 id=&#34;第一章-環境構築&#34;&gt;第一章 環境構築&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;%E3%81%93%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%88&#34;&gt;https://go.dev/dl/&lt;/a&gt;から最新版をダウロード。tarで解凍。/usr/local/いかにgo/をおいて、そこにパスを通す。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;echo &amp;#39;export PATH=$PATH:/usr/local/go/bin&amp;#39; &amp;gt;&amp;gt; $HOME/.profile
source .profile
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ここで疑問なのだが、どうやら、go/はホームディレクトリいかにもおいておかないとだめみたいなんだ。
というのも、ダウンロードしたモジュールやパッケージはホームディレクトリ以下のgo/に置かれるかららしい。
まあ、よくわからんよね。じゃあ、/usr/local/いかにおいたgoは何だったんだとね。&lt;/p&gt;
&lt;h2 id=&#34;実行&#34;&gt;実行&lt;/h2&gt;
&lt;p&gt;go run hello.goでも実行できるし、
go buildで、コンパイルもできる。go自体はコンパイル言語。go runは直接実行しているように見えるが、内部的にはgo buildで一回ビルドしている。
ちなみに、go buildで出力される実行ファイルは.go前の部分。だから、hello.goをコンパイルすると、helloという実行ファイルが生成される。これを変えたい場合は、-oで実行ファイル名を変更することもできる。&lt;/p&gt;
&lt;h2 id=&#34;モジュール&#34;&gt;モジュール&lt;/h2&gt;
&lt;p&gt;まあ、c++やcの分割コンパイルみたいなことができるって話で、モジュールを作ってみましょう、ということ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mkdir hello-world
cd hello-world
go mod init hello-world
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで新たにgo.modというファイルが出来上がる。&lt;/p&gt;
&lt;h2 id=&#34;go-install&#34;&gt;go install&lt;/h2&gt;
&lt;p&gt;goはgo installコマンドでgoのバイナリをインストールできる便利なコマンドである。&lt;/p&gt;
&lt;p&gt;ためしに、heyという、httpサーバのロードテストを行えるツールをインストールしてみましょう。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go install github.com/rakyll/hey@latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;デフォルトではホームの下の~/go/binにインストールされます。なので、ここにもパスを通す必要がありますね。
が、変えたかったら、$GOPATHを変えましょうって話ですね。まあ、変えることはあまりおすすめしませんが。
で、goで作ったファイルはこんな感じでかんたんに公開できるわけですね。&lt;/p&gt;
&lt;h2 id=&#34;goのコードのフォーマット&#34;&gt;goのコードのフォーマット&lt;/h2&gt;
&lt;p&gt;無意味な宗教戦争を産まないために、かなりフォーマットに制限があるという話。こういうのは結構好き。例えば、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;main(){

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;と&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;main ()
{

}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいな。goでは後者はコンパイルエラーになる。&lt;/p&gt;
&lt;p&gt;開発ツールにgo fmtやgoimportsというものがあり、これはプログラマーが書いたソースをきれいにしてくれるフォーマッターである。
他にもstaticcheckという名のりんたーがある。
これは、まあ、コードを解析してくれるツールです。きれいなコードを生み出してくれるということで、ありがたい。&lt;/p&gt;
&lt;h1 id=&#34;第二章&#34;&gt;第二章&lt;/h1&gt;
&lt;p&gt;変数の定義について色々教えてくれています。これは実際に書いていくなかで勉強していくほうがいいのではないかと思っているのです。
ただ、変数の命名規則は結構勉強になった。
go言語ではスネークケースはあまり使わないと。これは俺が好んで使うやつだね。
comp_calcみたいな感じ。でもこれはあまり使われないらしい。で、キャメルケースのほうがいいって話。うん。たしかにそっちのほうが主流な気もしてきたな。
あと、goでいいなって思ったのは、定義した変数を全部使わないとコンパイルエラーが出るところ。これでいらない変数を全部排除できるって話です。&lt;/p&gt;
&lt;h1 id=&#34;三章&#34;&gt;三章&lt;/h1&gt;
&lt;h2 id=&#34;配列スライス&#34;&gt;配列、スライス&lt;/h2&gt;
&lt;p&gt;配列は、&lt;/p&gt;</description>
    </item>
    <item>
      <title>Disable_bt_keyboard_autosuspend</title>
      <link>https://blog.ingenboy.com/post/disable_bt_keyboard_autosuspend/</link>
      <pubDate>Wed, 30 Aug 2023 22:59:26 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/disable_bt_keyboard_autosuspend/</guid>
      <description>&lt;h1 id=&#34;問題&#34;&gt;問題&lt;/h1&gt;
&lt;p&gt;bluetoothのキーボード、やっぱ留守ごく便利なんです。紐がないとそれだけで机がきれいになるし、やっぱり机がきれいだとやる気もでる。ただね、ubuntuがどうやらbluetoothキーボードと相性が悪い。一度ペアリングして接続したあと、アイドル状態が長く続くと接続が切れて、その後またコネクトしようとしても一生disconnectとconnectを行ったり来たりする。これを解消する方法があるって話だ。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://zenn.dev/pinto0309/articles/6991f94ea1128e&#34;&gt;このサイト&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;解決方法&#34;&gt;解決方法&lt;/h1&gt;
&lt;p&gt;まず、usbドングルがアイドル時に自動的に切れるのを防ぐ必要がある。で、まずはどのusbドングルが対処のusbドングルなのかを調べる必要がある。で調べるためにpowertopというアプリをインストールしますね。
で、ドングルを特定して、そのあと&lt;/p&gt;
&lt;p&gt;autosuspendをoffにします！それだけです！！
ただ、起動時のスクリプトでそれをやるとなんでかわからんけどうまく行かないんです。だから、下を見てください。&lt;/p&gt;
&lt;h1 id=&#34;まとめ&#34;&gt;まとめ&lt;/h1&gt;
&lt;p&gt;起動時に一度ワイヤードキーボードでバッシュに入って設定を変更したあと、無限にワイヤレスが使えるようにすればいいです。ということで一回目の起動のときはどうしてもワイヤーが必要になります。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Git_cheat_sheet</title>
      <link>https://blog.ingenboy.com/post/git_cheat_sheet/</link>
      <pubDate>Tue, 29 Aug 2023 10:25:16 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/git_cheat_sheet/</guid>
      <description>&lt;h1 id=&#34;個人的基本&#34;&gt;個人的基本&lt;/h1&gt;
&lt;h2 id=&#34;ローカルで新しいブランチ作成&#34;&gt;ローカルで新しいブランチ作成&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git branch &amp;lt;new branch&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ブランチ一覧を見る&#34;&gt;ブランチ一覧を見る&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git branch 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ブランチ移動&#34;&gt;ブランチ移動&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git checkout &amp;lt;branch name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ローカルのブランチ削除&#34;&gt;ローカルのブランチ削除&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git branch -d &amp;lt;branch name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;ローカルのブランチをリモートブランチにpush&#34;&gt;ローカルのブランチをリモートブランチにpush&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git push origin &amp;lt;branch name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;originは省略できませんねー。お願いします。これでgithubに新しくブランチができます。
ちなみに、originはブランチ名ではなく、リポジトリ名です。つまり、githubのリポジトリをoriginで指定しています。&lt;/p&gt;
&lt;h2 id=&#34;ファイルの差分を確認&#34;&gt;ファイルの差分を確認&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git diff &amp;lt;filename&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;作業していると、どのような変更を加えたか忘れてしまうこと多いと思うんですけど、これがあると、最後のコミットからどのような変更が加えられたのかが
一瞬でわかります。&lt;/p&gt;
&lt;h1 id=&#34;個人的中級&#34;&gt;個人的中級&lt;/h1&gt;
&lt;p&gt;##　リポジトリの特定のブランチをクローン&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone -b &amp;lt;branch_name&amp;gt; &amp;lt;repository_url&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;issue-branchをmainにマージ&#34;&gt;issue branchをmainにマージ&lt;/h2&gt;
&lt;p&gt;まずmain branchに移動。その後、merge&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git checkout main
git merge issue
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;コンフリクトが起こったらその個所を直してコミット&#34;&gt;コンフリクトが起こったらその個所を直してコミット！！&lt;/h2&gt;
&lt;h1 id=&#34;個人的上級&#34;&gt;個人的上級&lt;/h1&gt;
&lt;h2 id=&#34;プルリクの送り方&#34;&gt;プルリクの送り方&lt;/h2&gt;
&lt;p&gt;前提として、何かしらのossを開発しているものとしましょう。まず、プルリクエストっていう概念は、gitではなく、github上のものなので、ローカルではできませんね。じゃあどうやるか？それを今から説明していくぜ。
まず、github上でforkします。forkしたものをローカルにcloneします。cloneしたものに変更を加えます。そして、githubにプッシュします。で、github上でフォークされたリポジトリから、コピー元となったリポジトリ (これをベースブランチと呼ぶらしいです)にプルリクエストを送るわけですね。
変更メッセージを指定して、レビュアーを指定して、Create pull requestをクリックすればプルリクエストの作成が完了するんですね。そうすると、プル陸タブにプル陸が表示されるようになるんだよね。
れびゅあーに指定できるのは、リポジトリのコラボれーた　（共同編集者）　となっているアカウント。&lt;/p&gt;
&lt;p&gt;ちなみに、企業でいわれているコードレビューっていうのはこのプルリクエストを送る作業のことなんだと思います。
だから、去年のインターンの面接で「コードレビューをしてもらったことはありますか？」って聞かれたときにはい、あります、先生に見てもらってここをこうした方がいいとか、そういうアドバイスをもらいました、って言った俺は、意味が分かっていなかったわけですね。&lt;/p&gt;
&lt;h2 id=&#34;mergeには3種類ある&#34;&gt;mergeには3種類ある&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;create a merge commit ：もっとも一般的&lt;/li&gt;
&lt;li&gt;squash and merge&lt;/li&gt;
&lt;li&gt;rebase and merge : ブランチを一直線にする&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;特定のブランチorタグをcloneする&#34;&gt;特定のブランチorタグをcloneする&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone リポジトリ名 -b ブランチorタグ名
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;いちばんやさしいgitgithubの教本を読んで新しく学んだこと&#34;&gt;いちばんやさしいgit&amp;amp;Githubの教本を読んで新しく学んだこと&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;forkはgithub上でリポジトリをコピーすること。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Credit</title>
      <link>https://blog.ingenboy.com/post/credit/</link>
      <pubDate>Thu, 24 Aug 2023 13:29:32 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/credit/</guid>
      <description>&lt;h1 id=&#34;修了要件について&#34;&gt;修了要件について&lt;/h1&gt;
&lt;p&gt;共通基礎科目4単位以上、専門科目16単位以上、習得した単位数が合計で30以上、が修了の要件。
&lt;!-- raw HTML omitted --&gt;
共通基盤科目は4単位取りました。情報法律制度論、人文情報科学概論の二つで。
専門科目は
計算機構論、知能集積システム学、アルゴリズム論、高信頼システム、離散数学、IFT,情報基礎科学ゼミナール、ビッグデータスキルアップ演習、データ化学トレーニングキャンプ1,2、以上、18単位をここまで取っています。この時点で専門16単位もクリアしています。
&lt;!-- raw HTML omitted --&gt;
修論も専門科目に含まれていて残り9単位が降ってくるので、
共通基礎科目4 + 専門科目18 + 修論9(専門科目) = 31単位で修論。&lt;/p&gt;
&lt;p&gt;保険で「サイバー攻撃とその対策実践入門」を最後に取りたいとおもいます。こちらは夏休みに実施される集中講義で1単位を取得可能です。履修登録を忘れないようにお願いします。&lt;/p&gt;</description>
    </item>
    <item>
      <title>How_to_proxy</title>
      <link>https://blog.ingenboy.com/post/how_to_proxy/</link>
      <pubDate>Sun, 13 Aug 2023 09:54:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/how_to_proxy/</guid>
      <description>&lt;h1 id=&#34;squidについて&#34;&gt;Squidについて&lt;/h1&gt;
&lt;p&gt;Squidはプロキシやリバースプロキシの機能を提供するソフトウェアです。&lt;/p&gt;
&lt;h2 id=&#34;プロキシを置く理由&#34;&gt;プロキシを置く理由&lt;/h2&gt;
&lt;p&gt;主に、サービスの利用者向けのソフトウェアですね。&lt;/p&gt;
&lt;h2 id=&#34;リバースプロキシを置く理由&#34;&gt;リバースプロキシを置く理由&lt;/h2&gt;
&lt;p&gt;リバースプロキシサーバーをバックエンドサーバーの前段に置く理由は、主に以下の５つです。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;キャッシュサーバーとして利用
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;レスポンスを圧縮 (レスポンスの転送を高速化)
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SSL ターミネーション (暗号化や復号化の処理をリバースプロキシにオフロード)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;セキュリティの向上 (リバースプロキシでフィルタリング、バックエンドサーバーを隠蔽)&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;拡張性 (クライアントはリバースプロキシと通信するので、バックエンドサーバーを変更可能)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;こっちは主に、サービスの提供者側向けのソフトですね。&lt;/p&gt;
&lt;h2 id=&#34;僕がやりたいこと&#34;&gt;僕がやりたいこと&lt;/h2&gt;
&lt;p&gt;全部の通信が、Torみたいに、複数のサーバを介して行われる感じにしたいんですよね。んで、最終目的地はデータベースです。ユーてこれって、openvpnとかでじっそうできるのかな？いやできないか。
ネットワークの通信、頑張って自分で作れたりするのかな。いけそうな気もするな。&lt;/p&gt;</description>
    </item>
    <item>
      <title>openvpn client in a docker container</title>
      <link>https://blog.ingenboy.com/post/vpn_client/</link>
      <pubDate>Sun, 13 Aug 2023 00:01:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vpn_client/</guid>
      <description>&lt;h1 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h1&gt;
&lt;p&gt;webアプリケーションを家のサーバで動かすとなるとセキュリティーの観点からして怖いじゃないですか。やっぱり自宅のipさらしたくないじゃないですか。
だからAWSなどのVPSを借りてそのうえでアプリを動かすんだと思います。&lt;/p&gt;
&lt;p&gt;ただね、VPSでは二次記憶で使えるデータ量が決まっているんですね。しかもそのデータ量が結構限られています。例えば僕が契約しているサーバは二次記憶の容量が30GBです。つまり、大規模なデータベースを展開するには、大幅な課金が必要になるわけです。しかもさ、データベースを移植するのって結構面倒だからさ、一回構築したやつを長く使いたいんです。だからね、データベースだけは自宅においておき、アプリケーションが自宅のDBにデータをとりにきたり、おきに来たりすればいいのでは？と今思っているわけです。DBクライアントがデータを取ってくる時の通信量も考えるとどっちが安いかはまだわからないんですけどね。&lt;/p&gt;
&lt;p&gt;じゃあ、自宅のルータをポート開放して、ポートフォワードすればいいんじゃねーの？って思うよね。でもね、データベース用のポートを開放しておくのもなんか怖いんですよ。ブルートフォースとか受けて、破られることもあるわけじゃないですか。ということで、vpnを介して自宅のネットワークにアクセスできるようにしておけばいいのではないか？というのが僕の考えです。&lt;/p&gt;
&lt;h2 id=&#34;vpnクライアントのインストール&#34;&gt;vpnクライアントのインストール&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update

sudo apt install openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;vpnクライアント設定ファイルのインポート&#34;&gt;vpnクライアント、設定ファイルのインポート&lt;/h2&gt;
&lt;p&gt;config.ovpnをサーバに配置&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo openvpn --config /path/to/my/ovpn/file
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;パスワードを入力してトンネル完了&#34;&gt;パスワードを入力してトンネル完了&lt;/h2&gt;
&lt;h2 id=&#34;openvpnを介して自宅のmysqlサーバに接続&#34;&gt;openvpnを介して自宅のmysqlサーバに接続&lt;/h2&gt;
&lt;p&gt;mysql -u ray -h 192.168.3.10 -p&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 473
Server version: 8.0.33-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type &amp;#39;help;&amp;#39; or &amp;#39;\h&amp;#39; for help. Type &amp;#39;\c&amp;#39; to clear the current input statement.

mysql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;いけてしまっている…これはマジで感動！！ネットワークはやはり面白い。仕組みとかはもっと勉強しないといけませんが。
いやー－－、実際これはすごいです。マジですごいですわ！！感動ですわ。&lt;/p&gt;</description>
    </item>
    <item>
      <title>openvpn client in a docker container</title>
      <link>https://blog.ingenboy.com/post/vpn_client_in_docker/</link>
      <pubDate>Sun, 13 Aug 2023 00:01:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vpn_client_in_docker/</guid>
      <description>&lt;h1 id=&#34;やりたいこと&#34;&gt;やりたいこと&lt;/h1&gt;
&lt;p&gt;webアプリケーションを家のサーバで動かすとなるとセキュリティーの観点からして怖いじゃないですか。やっぱり自宅のipさらしたくないじゃないですか。
だからAWSなどのVPSを借りてそのうえでアプリを動かすんだと思います。&lt;/p&gt;
&lt;p&gt;ただね、VPSでは二次記憶で使えるデータ量が決まっているんですね。しかもそのデータ量が結構限られています。例えば僕が契約しているサーバは二次記憶の容量が30GBです。つまり、大規模なデータベースを展開するには、大幅な課金が必要になるわけです。しかもさ、データベースを移植するのって結構面倒だからさ、一回構築したやつを長く使いたいんです。だからね、データベースだけは自宅においておき、アプリケーションが自宅のDBにデータをとりにきたり、おきに来たりすればいいのでは？と今思っているわけです。DBクライアントがデータを取ってくる時の通信量も考えるとどっちが安いかはまだわからないんですけどね。&lt;/p&gt;
&lt;p&gt;じゃあ、自宅のルータをポート開放して、ポートフォワードすればいいんじゃねーの？って思うよね。でもね、データベース用のポートを開放しておくのもなんか怖いんですよ。ブルートフォースとか受けて、破られることもあるわけじゃないですか。ということで、vpnを介して自宅のネットワークにアクセスできるようにしておけばいいのではないか？というのが僕の考えです。&lt;/p&gt;
&lt;h2 id=&#34;vpnクライアントのインストール&#34;&gt;vpnクライアントのインストール&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt update

sudo apt install openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;vpnクライアント設定ファイルのインポート&#34;&gt;vpnクライアント、設定ファイルのインポート&lt;/h2&gt;
&lt;p&gt;config.ovpnをサーバに配置&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo openvpn --config /path/to/my/ovpn/file
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;パスワードを入力してトンネル完了&#34;&gt;パスワードを入力してトンネル完了&lt;/h2&gt;
&lt;h2 id=&#34;openvpnを介して自宅のmysqlサーバに接続&#34;&gt;openvpnを介して自宅のmysqlサーバに接続&lt;/h2&gt;
&lt;p&gt;mysql -u ray -h 192.168.3.10 -p&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 473
Server version: 8.0.33-0ubuntu0.20.04.2 (Ubuntu)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type &amp;#39;help;&amp;#39; or &amp;#39;\h&amp;#39; for help. Type &amp;#39;\c&amp;#39; to clear the current input statement.

mysql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;いけてしまっている…これはマジで感動！！ネットワークはやはり面白い。仕組みとかはもっと勉強しないといけませんが。
いやー－－、実際これはすごいです。マジですごいですわ！！感動ですわ。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Disown_nohup_screen_tmux</title>
      <link>https://blog.ingenboy.com/post/disown_nohup_screen/</link>
      <pubDate>Mon, 24 Jul 2023 20:30:50 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/disown_nohup_screen/</guid>
      <description>&lt;h1 id=&#34;バックグラウンド実行のあれこれについて&#34;&gt;バックグラウンド実行のあれこれについて&lt;/h1&gt;
&lt;p&gt;ジョブをバックグラウンドで実行する方法は、実行したいジョブ、もしくはコマンドの最後に&amp;amp;をつける。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./job.sh&amp;amp;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;みたいな感じで。しかしこれだとsshセッションが切れるとバックグラウンドで走っていたジョブも死んでしまう。
なぜか？
&lt;!-- raw HTML omitted --&gt;
まずは親子関係について説明しよう。bashの親はsshdで、ジョブはbashの子供として生成される。そして、通常は、「親が死んだらinit (systemd)が親になってくれる」しかし、sshの場合はsshのセッションが切れるとkernelからbashにSIGHUPが送られる。さらに、bashが各プロセスにSIGHUPを送る。
&lt;!-- raw HTML omitted --&gt;
バックグラウンドで走っているジョブを殺すSIGHUPシグナルを無視するためのコマンドがnohupである。これを使うことでプロセスはSIGHUPを無視するようになる。これは、disown -hでも同じである。先に実行するか後で実行するかの違い。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h1 id=&#34;tmuxscreen&#34;&gt;tmux/screen&lt;/h1&gt;
&lt;p&gt;tmuxとかscreenを使おうという話です。screenの話をします。&lt;/p&gt;
&lt;h1 id=&#34;screenコマンドについて&#34;&gt;screenコマンドについて&lt;/h1&gt;
&lt;h2 id=&#34;セッションの保存方法&#34;&gt;セッションの保存方法&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# creationg new session
screen

# detach the session
&amp;lt;ctrl&amp;gt; + &amp;lt;a&amp;gt; 
d

# creating new session with a name
screen -S &amp;lt;name&amp;gt;

# list the sessions and check the status
screen -ls
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;実験&#34;&gt;実験&lt;/h2&gt;
&lt;p&gt;screenで新しいセッションを作ってその中でsingularityを動かす。
&lt;!-- raw HTML omitted --&gt;
ps axfの結果は以下の通り。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;  28987 ?        S      0:00 sshd: foo@pts/1
  28988 pts/1    Ss     0:00  \_ -bash
  29057 pts/1    S+     0:00      \_ screen -S singularity
  29058 ?        Ss     0:00          \_ SCREEN -S singularity
  29059 pts/2    Ss     0:00              \_ /bin/bash
  29104 pts/2    Sl     0:00                  \_ Singularity runtime parent
  29125 pts/2    S+     0:00                      \_ /bin/bash --norc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;意図的にbashを切る。
ps xfでログインユーザに関係するプロセスを一覧表示すると一見死んだかに思える。しかし、&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win5_20230709</title>
      <link>https://blog.ingenboy.com/post/win5_20230709/</link>
      <pubDate>Sun, 09 Jul 2023 10:30:12 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/win5_20230709/</guid>
      <description>&lt;h1 id=&#34;win5予想&#34;&gt;win5予想&lt;/h1&gt;
&lt;h1 id=&#34;中京10r-ダート1800m-2勝クラス&#34;&gt;中京10R ダート1800m 2勝クラス&lt;/h1&gt;
&lt;p&gt;牝馬限定戦であることに注意してください。&lt;/p&gt;
&lt;h1 id=&#34;初ダート&#34;&gt;初ダート&lt;/h1&gt;
&lt;h1 id=&#34;昇級戦&#34;&gt;昇級戦&lt;/h1&gt;
&lt;h1 id=&#34;コース特徴&#34;&gt;コース特徴&lt;/h1&gt;
&lt;p&gt;ダートは直線は410と結構ながく、最後に結構きつい上り坂があります。2メートルくらい登ります。
ちなみに、東京競馬場が直線510です。&lt;/p&gt;
&lt;h1 id=&#34;天気&#34;&gt;天気&lt;/h1&gt;
&lt;p&gt;ちまみに昨日も全く雨降ってません。つまり、
良馬場で開催できそうですね。これは前が残ります。&lt;/p&gt;
&lt;p&gt;ジャルジェ
坂井が乗るので先行はしそうですね。ただ、今回は、リースタイルってやつもどうやら先行馬なんですよ。そいつが先に行きそう。わからんね。ワンちゃんあるってくらい。
最初出ていって、自分のペースにできれば全然ある。これあるな。&lt;/p&gt;
&lt;p&gt;&amp;ndash;
ハンベルジャイト
頭はない。1800m出し、ちょっと長い気もする。しかも、めちゃめちゃ体重を下げてきているのもなんか、気がかり。でも53キロは強いね。まだまだ成長の余地はあるし。ただ、馬体重を下げてきているのが気がかりなんですよん！！そして勝ち上がりの相手は、1勝クラスを頑張っているやつと。うーん、やっぱりデビューのときより馬体重を下げているのはちょっとないかなー。&lt;/p&gt;
&lt;p&gt;サウザンドスマイル:
問答無用で切り。申し訳ない。&lt;/p&gt;
&lt;p&gt;&amp;ndash;
トレデマンド：
けんちゃんだから、まあ鞍上はいいのですが、馬がそんなにつよくないとおもう。確かに、1勝クラスでは中京でいい成績を出して入るんですが、透過買ったレースって全部中京なんですけど、いかんせん相手が弱い。申し訳ないが、相手がマジで弱い。話にならんくらい。てことで、中京得意だから、っていう理由には、その時の相手がただ雑魚かったからっていう話にしたいと思う。&lt;/p&gt;
&lt;p&gt;アレマーナ：
ローテーションが勝ちパターンだね。前回はたたきで、今回狙ってきている。調教も騎手が騎乗。馬体重も順調に上げてきている。今回馬体重が下がっていればワンちゃんあるので、入れておいてほしいかもです。馬体重下げてきてますねー。あります。入れておくの、ありです。いや、普通に考えたらないのよ。やっぱ入れねーわ。&lt;/p&gt;
&lt;p&gt;&amp;ndash;
マヤローザ：
問答無用で切り。さいなら。&lt;/p&gt;
&lt;p&gt;ノボリクレバー：
勝ち上がったときの相手、スカンジナビアは1勝クラスで馬券内を恒常的に撮っている。つまり、たまたま勝ち上がってきたやるではない。強さは保証できるのではないか。しかし、タイム指数がね。。。いや、強いんだけどね。
前回は3ヶ月ぶりでたたきでも&lt;/p&gt;
&lt;p&gt;アコークロー：
距離短縮でどうかってところだね。
わからない。1800の適正がわからない。
勝ち上がりの相手は万年1勝クラスって感じだけれども。
でも調教がだめですね。未勝利相手に一杯で追って先着許しているようではだめです。今回はきりです。特に目立った点もないです。&lt;/p&gt;
&lt;p&gt;&amp;ndash;
グレナデンシロップ：
ここで馬体重めっちゃ下げてきたらワンちゃんあるかもってくらい。基本的には大喜利でいい。&lt;/p&gt;
&lt;p&gt;ファジェス：
きりでお願いします。&lt;/p&gt;
&lt;p&gt;リースタル：
きりでお願いします。&lt;/p&gt;
&lt;h2 id=&#34;これはあるなって感じです追い込みですがワンちゃんです&#34;&gt;フォレストキャット
調教がいいですねー。3勝クラスの相手にいい感じでせっています。
これはあるなって感じです。追い込みですが、ワンちゃんです。&lt;/h2&gt;
&lt;p&gt;タイセイヴィーナス
5ヶ月の休養明けです。馬体重がしっかり戻ってきたみたいです。
ちょっと、体調が戻ってきているみたいで、少し怖いですね。が、調教がだめですね。きりでいいでしょう。&lt;/p&gt;
&lt;h2 id=&#34;決定馬&#34;&gt;決定馬&lt;/h2&gt;
&lt;p&gt;1,7,12&lt;/p&gt;
&lt;h2 id=&#34;結果&#34;&gt;結果&lt;/h2&gt;
&lt;p&gt;12 &amp;gt; 7 &amp;gt; 3&lt;/p&gt;
&lt;h1 id=&#34;福島10r-ダート1700m-2勝クラス&#34;&gt;福島10R ダート1700m 2勝クラス&lt;/h1&gt;
&lt;h2 id=&#34;初ダート-1&#34;&gt;初ダート&lt;/h2&gt;
&lt;h2 id=&#34;昇級戦-1&#34;&gt;昇級戦&lt;/h2&gt;
&lt;p&gt;ハッスルダンク&lt;/p&gt;
&lt;h2 id=&#34;コース特徴-1&#34;&gt;コース特徴&lt;/h2&gt;
&lt;p&gt;直線は295m。どうだろう、&lt;/p&gt;
&lt;h2 id=&#34;休養明け&#34;&gt;休養明け&lt;/h2&gt;
&lt;p&gt;コンソレーション：2年ぶり&lt;/p&gt;
&lt;p&gt;サンキューレター：1年半ぶり&lt;/p&gt;
&lt;p&gt;オブで湯モンド：4ヶ月&lt;/p&gt;
&lt;p&gt;イサ散るプリンス：3ヶ月&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux_thing</title>
      <link>https://blog.ingenboy.com/post/linux_thing/</link>
      <pubDate>Sat, 08 Jul 2023 14:13:10 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/linux_thing/</guid>
      <description>&lt;p&gt;個人的、Linuxを触ってて面白かったとか、納得の行ったことをここにメモっておきたい。&lt;/p&gt;
&lt;h1 id=&#34;disown--hについて&#34;&gt;disown -hについて&lt;/h1&gt;
&lt;p&gt;sshでつないで、bashでプログラムを実行するとき、そのプログラムはbashの子プロセスとして実行されるのよね。
そもそもbashはsshdの子プロセスとして実行されるのだけれども。
でね、bashの子プロセスとして実行されるわけだから、bashを閉じるとその子プロセスであるプログラムも死ぬんだよね。&lt;/p&gt;
&lt;p&gt;でも、bashを抜けても死なないでほしいプログラムってあるわけじゃないですか。それを実現する方法が
プロセスを ctrl + zで一旦停止、bgでバックグラウンド実行。そして、disown -h
なわけですね。
で、そうするとそのプロセスの親は誰になるか？って不思議に思いますよね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; 1058 ?        Ss     0:00      1  1080 13483  1836  0.0 /lib/systemd/systemd --user
 1059 ?        S      0:00      0     0 35244  1184  0.0  \_ (sd-pam)
 2345 ?        S      0:00     18     0  7408  2860  0.0 sudo hugo server -p 443 --bind=0.0.0.0 --baseURL=https://ingenboy.com/alpha/
 2346 ?        Sl     0:18     38     0 2141188 1696712 43.7  \_ hugo server -p 443 --bind=0.0.0.0 --baseURL=https://ingenboy.com/alpha/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そうなんです。systemdなるんですねー。これが結構面白いところ。覚えておいていいです。
ちなみに、親子関係を含めて全プロセスを表示するのが、&lt;/p&gt;</description>
    </item>
    <item>
      <title>SQL_practice</title>
      <link>https://blog.ingenboy.com/post/sql_practice/</link>
      <pubDate>Sat, 08 Jul 2023 12:58:42 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/sql_practice/</guid>
      <description>&lt;p&gt;sqlの問題集ってなかなかないんだよね。ってことで自分で作ることにした！！出典とそのデータベースのダウンロード先、と解答も準備する予定です。&lt;/p&gt;
&lt;h1 id=&#34;contet&#34;&gt;contet&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;CMUの講義で使われていたSQLの問題&lt;/li&gt;
&lt;li&gt;僕の大学のITFっていう講義で使われていた問題&lt;/li&gt;
&lt;li&gt;オライリー本「初めてのSQL」から持ってきた問題&lt;/li&gt;
&lt;li&gt;データベースが入手可能なサイトの紹介&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;cmuの講義&#34;&gt;CMUの講義&lt;/h1&gt;
&lt;h2 id=&#34;データベースの出典&#34;&gt;データベースの出典&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://datasets.imdbws.com/&#34;&gt;IMDb non-commercial dataset&lt;/a&gt;
ここからダウンロードできます。
データベースの説明については、&lt;a href=&#34;https://developer.imdb.com/non-commercial-datasets/&#34;&gt;こちらの&lt;/a&gt;データセットを見てください、と。ですが、こちら、扱いがちょっと面倒くさいので、もっとかんたんにしてくれているやつでいきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://ingenboy.com/alpha/imdb-cmudb2022.db.gz&#34;&gt;cmuが用意してくれてたやつ&lt;/a&gt;で、ダウンロード可能。
映画関係のデータベースになっています。で、データはsqlite3で実行することを前提に作られています。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ wget https://ingenboy.com/alpha/data/imdb-cmudb2022.db.gz
$ gunzip imdb-cmudb2022.db.gz
$ sqlite3 imdb-cmudb2022.db

# create indices using hte following commands in SQLite

CREATE INDEX ix_people_name ON people (name);
CREATE INDEX ix_titles_type ON titles (type);
CREATE INDEX ix_titles_primary_title ON titles (primary_title);
CREATE INDEX ix_titles_original_title ON titles (original_title);
CREATE INDEX ix_akas_title_id ON akas (title_id);
CREATE INDEX ix_akas_title ON akas (title);
CREATE INDEX ix_crew_title_id ON crew (title_id);
CREATE INDEX ix_crew_person_id ON crew (person_id);

# check the schema 
.schema
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;問題&#34;&gt;問題&lt;/h2&gt;
&lt;h2 id=&#34;question25-points&#34;&gt;question2[5 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Find the 10 `Sci-Fi` works with the longest runtimes.
Details: Print the title of the work, the premiere date, and the runtime. The column listing the runtime should be suffixed with the string &amp;#34; (mins)&amp;#34;, for example, if the runtime_mins value is `12`, you should output 12 (mins). Note a work is Sci-Fi even if it is categorized in multiple genres, as long as Sci-Fi is one of the genres.
Your first row should look like this: Cicak-Man 2: Planet Hitam|2008|999 (mins)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question3-5-points&#34;&gt;question3 [5 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Determine the oldest people in the dataset who were born in or after 1900. You should assume that a person without a known death year is still alive.
Details: Print the name and age of each person. People should be ordered by a compound value of their age and secondly their name in alphabetical order. Return the first 20 results.
Your output should have the format: NAME|AGE
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question410-points&#34;&gt;question4[10 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Find the people who appear most frequently as crew members.
Details: Print the names and number of appearances of the 20 people with the most crew appearances ordered by their number of appearances in a descending fashion.
Your output should look like this: NAME|NUM_APPEARANCES
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question510-points&#34;&gt;question5[10 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Compute intersting statistics on the ratings of content on a per-decade basis.
Details: Get the average rating (rounded to two decimal places), top rating, min rating, and the number of releases in each decade. Exclude titles which have not been premiered (i.e. where premiered is NULL). Print the relevant decade in a fancier format by constructing a string that looks like this: 1990s. Order the decades first by their average rating in a descending fashion and secondly by the decade, ascending, to break ties.
Your output should have the format: DECADE|AVG_RATING|TOP_RATING|MIN_RATING|NUM_RELEASES
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question610-points&#34;&gt;question6[10 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Determine the most popular works with a person who has &amp;#34;Cruise&amp;#34; in their name and is born in 1962.
Details: Get the works with the most votes that have a person in the crew with &amp;#34;Cruise&amp;#34; in their name who was born in 1962. Return both the name of the work and the number of votes and only list the top 10 results in order from most to least votes. Make sure your output is formatted as follows: Top Gun|408389
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question7-15-points&#34;&gt;question7 [15 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;List the number of works that premiered in the same year that &amp;#34;Army of Thieves&amp;#34; premiered.
Details: Print only the total number of works. The answer should include &amp;#34;Army of Thieves&amp;#34; itself. For this question, determine distinct works by their title_id, not their names.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question815-points&#34;&gt;question8[15 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;List the all the different actors and actresses who have starred in a work with Nicole Kidman (born in 1967).
Details: Print only the names of the actors and actresses in alphabetical order. The answer should include Nicole Kidman herself. Each name should only appear once in the output.
Note: As mentioned in the schema, when considering the role of an individual on the crew, refer to the field category. The roles &amp;#34;actor&amp;#34; and &amp;#34;actress&amp;#34; are different and should be accounted for as such.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question915-points&#34;&gt;question9[15 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;For all people born in 1955, get their name and average rating on all movies they have been part of through their careers. Output the 9th decile of individuals as measured by their average career movie rating.
Details: Calculate average ratings for each individual born in 1955 across only the movies they have been part of. Compute the quantiles for each individual&amp;#39;s average rating using NTILE(10).
Make sure your output is formatted as follows (round average rating to the nearest hundredth, results should be ordered by a compound value of their ratings descending and secondly their name in alphabetical order): Stanley Nelson|7.13
Note: You should take quantiles after processing the average career movie rating of individuals. In other words, find the individuals who have an average career movie rating in the 9th decile of all individuals.
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;question1015-points&#34;&gt;question10[15 points]&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Concatenate all the unique titles for the TV Series &amp;#34;House of the Dragon&amp;#34; as a string of comma-separated values in alphabetical order of the titles.
Details: Find all the unique dubbed titles for the new TV show &amp;#34;House of the Dragon&amp;#34; and order them alphabetically. Print a single string containing all these titles separated by commas.
Hint: You might find Recursive CTEs useful.
Note: Two titles are different even if they differ only in capitalization. Elements in the comma-separated value result should be separated with both a comma and a space, e.g. &amp;#34;foo, bar&amp;#34;.
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;itfの問題&#34;&gt;ITFの問題&lt;/h1&gt;
&lt;h2 id=&#34;データベースの出典-1&#34;&gt;データベースの出典&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://ingenboy.com/alpha/employees.db&#34;&gt;なんかわからんけど、配られてたやつ&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Commnets_on_learning_sql</title>
      <link>https://blog.ingenboy.com/post/commnets_on_learning_sql/</link>
      <pubDate>Sat, 08 Jul 2023 11:10:53 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/commnets_on_learning_sql/</guid>
      <description>&lt;h1 id=&#34;chapter1&#34;&gt;chapter1&lt;/h1&gt;
&lt;p&gt;リレーショナルデータベースって便利だよねーって話。
E.F.coddが最初の論文を出したってことだけ覚えておくとかっこいいかもしれないね。&lt;/p&gt;
&lt;h1 id=&#34;chapter2&#34;&gt;chapter2&lt;/h1&gt;
&lt;h2 id=&#34;データのインポートエクスポート&#34;&gt;データのインポート、エクスポート&lt;/h2&gt;
&lt;p&gt;外部データのインポート方法をここで説明している。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://dev.mysql.com/doc/index-other.html&#34;&gt;Mysql公式のチュートリアル用データ&lt;/a&gt;
ここからほしいデータをダウンロードしてきて、mysql内部から次のコマンドでロードできる&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysql -u ray -p 
mysql&amp;gt; source &amp;lt;path/to/schame/sakila-schedma.sql&amp;gt;
mysql&amp;gt; source &amp;lt;path/to/data/sakila-data.sql&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;って感じやな。ちなみに、自分が作ったデータを外部にエクスポートする方法もあって、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# データベース
$ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME &amp;gt; OUTPUT_FILE_NAME

# テーブル
$ mysqldump -u USER_NAME -p -h HOST_NAME DB_NAME TABLE_NAME &amp;gt; OUTPUT_FILE_NAME

# テーブルの定義とデータのダンプ
$ mysqldump -u USER_NAME -p -h HOST_NAME -A -n &amp;gt; OUTPUT_FILE_NAME 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;まあ調べたらあるから調べてみてくれ。データベースの移行はそんなに難しいことではないことだけ頭に入れておいてほしい。&lt;/p&gt;
&lt;p&gt;ちなみに、mysqlでのschemaの見方は、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;describe customer;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;忘れがちだから覚えておいてください！！まじで！！describeを短縮してdescでもオッケーです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SELECT
  TABLE_NAME
, COLUMN_NAME
, COLUMN_TYPE
, COLUMN_KEY
FROM
  INFORMATION_SCHEMA.COLUMNS
WHERE
  TABLE_SCHEMA = &amp;#39;sakila&amp;#39;
;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;データ型について&#34;&gt;データ型について&lt;/h2&gt;
&lt;p&gt;日付に関するデータ型だけ。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker_and_k8s_explained</title>
      <link>https://blog.ingenboy.com/post/docker_and_k8s_explained/</link>
      <pubDate>Fri, 07 Jul 2023 15:43:28 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/docker_and_k8s_explained/</guid>
      <description>&lt;h1 id=&#34;docker-kubernetesの基本の基本&#34;&gt;docker kubernetesの基本の基本&lt;/h1&gt;
&lt;h2 id=&#34;chapter-12&#34;&gt;chapter 1,2&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;dockerはLinuxマシンを想定して作られている。cgroupがLinuxの概念だからね。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンテナはイメージから作る&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;コンテナはカーネルを持たない。が、カーネル以外のosの機能を持っている (本書ではそこを周辺部分と言っている)。カーネルはホストOSと共有する。だから軽い。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンテナはdocker Engineがあればどこでも動く&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;コンテナはイメージとして書き出すこともできる！ここがsingularityのsifとは違うところだね。おそらくDockerはデフォルトでsingularityのsandboxと同じように、中身の改変が可能なのではないか？と思っている。まだ確信には至っていない。
&amp;ndash;&amp;gt; そのとおりです。dockerはどの時点においても動いているコンテナをイメージとして書き出すことができます。
そのときに使うコマンドが、commitです。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;dockerでは物理的なマシンのディスクをマウントすることが可能。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;コンテナの外部のディスクに書き込むことで、ほかのコンテナとデータを共有することができる。&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;8&#34;&gt;
&lt;li&gt;
&lt;p&gt;dockerイメージはdocker hubからダウンロード可能
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;chapter3-dockerを使う&#34;&gt;chapter3 dockerを使う&lt;/h2&gt;
&lt;p&gt;dockerの環境構築方法が書いてあるだけでした。お疲れ様です。&lt;/p&gt;
&lt;h2 id=&#34;chapter4&#34;&gt;chapter4&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;systemctl enable dockerでデーモンを自動起動させてください&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;dockerコマンドの基本構文を抑えましょう&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;docker &amp;lt;上位コマンド&amp;gt; &amp;lt;副コマンド&amp;gt; &amp;lt;オプション&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;lt;上位コマンド&amp;gt;　== 何を
&amp;lt;副コマンド&amp;gt; == どうする
っていうのが結構しっくりきました。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Error_controlled_progressive_and_adaptable_retrieval_of_scientific_data_with_multilevel_decomposition</title>
      <link>https://blog.ingenboy.com/post/error_controlled_progressive_and_adaptable_retrieval_of_scientific_data_with_multilevel_decomposition/</link>
      <pubDate>Fri, 30 Jun 2023 16:09:15 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/error_controlled_progressive_and_adaptable_retrieval_of_scientific_data_with_multilevel_decomposition/</guid>
      <description>&lt;h2 id=&#34;abstruction&#34;&gt;Abstruction&lt;/h2&gt;
&lt;p&gt;近年の大規模な数値シミュレーションは、シミュレーション時のデータ書き込みのみならず、何度も読み出しが実行されるポスト処理においてもストレージがボトルネックになることが多い。
ポスト処理の内容は多岐にわたるが、様々なポスト処理に対応するための条件として、不必要なデータのi/oを極力減らすことがあげられる。本論文では、シミュレーションデータのrefactoring, compressing, retrievalのフレームワークを紹介する。refactoringにより粒度の細かい精度でデータを分解でき、要求した精度でデータを取得することが可能になる。本研究で紹介するフレームワークを使うことで、state-of-the-artの手法を使った時と比べ、複数の精度でデータを要求したときに大幅に取得するデータを減らすことができた。さらに粗い精度でのデータ要求があったときに、分析時間の短縮につながった。
具体的には、本フレームワークを使うことでほかのフレームワークを使った時と比べ、ある精度でのデータ要求があったときに64％のデータ削減を達成した。さらに、1024コアを使って600GBのデータの書き込みと読み込みを実行した際、従来の手法と比較した際、それぞれ1.36倍、2.52倍の性能向上を示せた。&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;introduction&lt;/h2&gt;
&lt;p&gt;大規模な数値シミュレーションから生み出されるデータ量は、ストレージのI/O性能を超えている。
並列ファイルシステムは高価なため、増設することが難しい。
一方、並列ファイルシステムに書き込まれたデータは、PFSの容量が圧迫する目的と、長期保存をする目的ですぐに二次記憶に退避される。
PFSのバンド幅は2-2.5Tb/sであるのに対し、二次記憶のバンド幅は1-2GB/sである。そして、このI/Oバンド幅が低いことが、科学的な発見を遅らせる原因となっている。
これらの問題があるため、多くの科学者は可逆圧縮や非可逆圧縮を使い、データの書き込み量や読み込み量を減らす。しかし、可逆圧縮は圧縮率が低いため、先の問題解決には不十分である。このことから近年、より大幅に圧縮が可能な非可逆圧縮が注目を浴びている。非可逆圧縮は、ユーザが指定した許容誤差を保証する範囲でデータの圧縮をする。
&lt;!-- raw HTML omitted --&gt;
しかし、この手法にも欠点がある。
それは、QoIがわからない、つまり、現象の発見に必要な最低限の許容誤差がわからない点である。
非可逆圧縮によるI/Oの恩恵と、QoIを両立させるためには、あるステップで許容誤差を緩めていき、様々な許容誤差で圧縮されたデータをためておけばいいが、それは本末転倒で、結果的に多くのデータをためることになってしまう。さらに、ある誤差で取得したデータの精度が十分でない場合は、再び誤差が小さいデータを1から取得する必要があり、結果的にI/Oを圧迫してしまう。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;p&gt;この問題に対処するのがProgressive compressionである。Progressive compressonとtransmitonは、まずデータを複数の精度に階層的に分解する。そして、ユーザがより高精度のデータを要求するときには、階層構造になったデータのより精度が高い一部分のみをユーザは新たに取得し、それを今までに取得したデータに重ね合わせる。これによりより高精度のデータを得られる。
本研究では、I/Oにボトルネックが生じるという課題を、このProgressive retrievalを用いて解決する。
&lt;!-- raw HTML omitted --&gt;
MGARDというフレームワークを用いることではこれを実現することが可能である。しかし、MGARDはresolution incremental re-compositionをサポートしているのみで、各階層ごとに隣接している精度が粗いという課題がある (これが多分bit-plainを考慮していないっていう話につながるんだと思う) 。本論文ではこれを解決するフレームワークをMGARDを用いて新たに作る。
&lt;!-- raw HTML omitted --&gt;
本研究のcontributionは下記のとおりである。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;データリファクタリングアルゴリズムと理論の紹介。本アルゴリズムは、MGARDとbit-plane encodingを組み合わせである。このアルゴリズムは、データを複数の階層の解像度と精度に分解することを可能にする。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データを段階的に取得および再構成できるフレームワークの実装。この段階的な取得により、以下の2つの利点がある：1）データの取得/ストリーミング、再構成、および解析を非同期で実行でき、いつでも既知のエラー範囲内で行えます。2）次の精度レベルに至るデータの部分だけをストリーミングして解析結果が収束するまで、I/Oの負荷を減少。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;私たちは貪欲アルゴリズムを一般化して、複数のエラーメトリクスに対してデータの取得効率を改善します。このアルゴリズムは多様な事後解析に適応でき、解析に基づいて再構成されたデータの取得順序を変更することで取得サイズをさらに削減したり、粗い粒度の表現を提供することで解析のパフォーマンスを向上させることができます。また、私たちはフレームワークを最適化します。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;chapter2-問題と関連研究&#34;&gt;chapter2 問題と関連研究&lt;/h2&gt;
&lt;p&gt;イントロのようやく&lt;/p&gt;
&lt;p&gt;・過去10年間におけるデータとストレージ容量の不均衡な成長は深刻な問題である。
・exascaleコンピューティング時代ではさらに深刻化し、科学的な発見を妨げる要因となっている。
・ストレージとI/Oの制約に対処する有望な候補として、非可逆圧縮があげられている
・しかし、文献には広範な圧縮技術が存在するにもかかわらず、科学アプリケーションのコミュニティにおけるこれらの受け入れは低い
その理由は
1）データの削減プロセスがデータを生成した本来の現象に影響を及ぼす可能性があること。
2）単一のエラー制約の下で削減されたデータが、異なる解析のさまざまなニーズに適合しない可能性があること&lt;/p&gt;
&lt;p&gt;また、シミュレーションデータはPFSから二次記憶に移される、が二次記憶はバンド幅が小さいためデータの取得が遅くなる。データの生成（例：大規模な実験、シミュレーション）は時折行われるのに対し、生成されたデータはさまざまな研究によって取得される。よって、セカンダリストレージ層の低い帯域幅が不適切な/過剰なデータの取得コストを高める。私たちは、解析に必要な精度にちょうど適合する量のデータをユーザーに提供したいと考えています。&lt;/p&gt;
&lt;h1 id=&#34;背景&#34;&gt;背景&lt;/h1&gt;
&lt;h2 id=&#34;bit-plane-encoding-ビットプレーン符号化&#34;&gt;bit-plane encoding (ビットプレーン符号化)　&lt;/h2&gt;
&lt;p&gt;整数をビットで表したときに、桁が上位なビットほど、精度に与える影響が大きい。これは浮動小数点でも同じで、各桁ごとにデータを保存することで、精度に与える影響を優先度付けすることが可能となる。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Win5_20230702</title>
      <link>https://blog.ingenboy.com/post/win5_20230702/</link>
      <pubDate>Fri, 30 Jun 2023 11:25:50 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/win5_20230702/</guid>
      <description>&lt;h1 id=&#34;1r-日進特別-2勝クラス-中京ダート1800m-16頭&#34;&gt;1R 日進特別 2勝クラス 中京ダート1800m 16頭&lt;/h1&gt;
&lt;h2 id=&#34;中京競馬場の特徴&#34;&gt;中京競馬場の特徴&lt;/h2&gt;
&lt;p&gt;スタートしてすぐにめっちゃ急な上り坂があります。つまり、スローペースになりやすいと。で、スローペースになると？？そうなんですね。前残りになります。&lt;/p&gt;
&lt;h2 id=&#34;目標頭数-4頭&#34;&gt;目標頭数 4頭&lt;/h2&gt;
&lt;h2 id=&#34;初ダート&#34;&gt;初ダート&lt;/h2&gt;
&lt;p&gt;アルバーシャ&lt;/p&gt;
&lt;h2 id=&#34;初2勝クラス&#34;&gt;初2勝クラス&lt;/h2&gt;
&lt;h2 id=&#34;全頭診断&#34;&gt;全頭診断&lt;/h2&gt;
&lt;p&gt;セグレドスペリオル:
お話になりません。もう数年2勝クラスにいて、ここでいきなり勝ち上がるわけがなかろう。&lt;/p&gt;
&lt;p&gt;サンライズジャスト:
前回調子を落としたのはなぜでしょう？その前まではかなりいい競馬をしていたと思う。
でも、今回もあんまり調教よくなさそう。どうした？？&lt;/p&gt;
&lt;p&gt;アルバーシャ:
あー、万ねん2勝クラスタイプのやつです。ダートに変えて心機一転、といったところでしょうが、まあ、厳しいのではないでしょうか？が、どうやらパワータイプのようで、ダートだと一変する可能性があるらしいです。が、まあキリでいいでしょう。&lt;/p&gt;
&lt;p&gt;シェットランド:
ワンちゃんといった感じ。脚質は先行。中山ではなかなかいい足を使っていた。
あー、中京のダートも最後上り坂。中山ほどではないけれども、中山に近いものはある。ということで、こいつ、前からいってワンチャンあると感じている。いや全然あるで。&lt;/p&gt;
&lt;p&gt;マルカアトラス:
まあ、前回、3着だったんだけど、その時の勝ち馬がいかんせん雑魚なんですわ。つまり、雑魚相手に3着と。1章クラスを勝ち上がった時、0.1秒差なんですけど、その時の2着はまだ1勝クラスをうろうろしています。ということでキリです。&lt;/p&gt;
&lt;p&gt;ジョーコモド:
この辺で一発あってもおかしくないやつです。が、やっとの思いで1勝クラスを勝ち上がってきた感が強く、まー、厳しそうだね。思い切って切っていいです。調教は見ますが。&lt;/p&gt;
&lt;p&gt;ロードジャスティス:
んーーー、なんか、調子を落としている気がする。特に最後末脚があるわけでもないし。
凡走する気配が漂っています。キリです。&lt;/p&gt;
&lt;p&gt;ショウサンキズ:
なるほど、2走前でじょーこもどに負けていますね。これは厳しいのではないですか？&lt;/p&gt;
&lt;p&gt;スナークレジスト:
後ろからですねー。後ろから来すぎて届かないですねー。4走前、3着はいってますが、その時の相手は雑魚ですねー。キリですね。&lt;/p&gt;
&lt;p&gt;サンデーミラージュ:
はい、きり。&lt;/p&gt;
&lt;p&gt;タガノカンデラ:
勝ち上がりの時の相手はまだ１しょうくらすをうろうろ。つまりまぐれで2章に上がってきた雑魚です。キリ。&lt;/p&gt;
&lt;p&gt;ブラビオ:
上に同じく。2着の相手は、そのまま地方競馬に行きました。おつ。&lt;/p&gt;
&lt;p&gt;キングダムウイナー:
あー、二着の相手は一回地方に行って2勝目を挙げて2クラスに来たけど、まあ全然だめですね。これはキリです。際なら。&lt;/p&gt;
&lt;p&gt;ニホンピロオーセン:
あー、園田で1勝稼いだ雑魚ですねー。まあないと思いますよ。&lt;/p&gt;
&lt;p&gt;ブルレスカ:
はい、きり！！&lt;/p&gt;
&lt;p&gt;ラニカイ:
こいつは、連帯率えぐいぞ。未勝利と一生倉s。今回来ても全然おかしくなさそうだけどなー。中京もめっちゃ走ってきてるし。まあ、前回は輸送失敗やな。
でもね、分かったこいつのからくり。小倉だったからだな。小倉ってまあ、中央競馬でも末端だし、あんまり強い馬が集まってこないのよ。で、こいつの脚質、差しなんだけど、小倉って差しにピッタリの競馬場なんですよね。それで最速出しまくってただけですね。ってことで、こいつもキリです。お疲れ様でした。&lt;/p&gt;
&lt;h2 id=&#34;決定馬&#34;&gt;決定馬&lt;/h2&gt;
&lt;p&gt;２，３，４，５&lt;/p&gt;
&lt;h1 id=&#34;2r-いわき特別-2勝クラス-福島ダート1700m-12頭&#34;&gt;2R いわき特別 2勝クラス 福島ダート1700m 12頭&lt;/h1&gt;
&lt;h2 id=&#34;目標頭数-2頭&#34;&gt;目標頭数 2頭&lt;/h2&gt;
&lt;h2 id=&#34;初ダート-1&#34;&gt;初ダート&lt;/h2&gt;
&lt;h2 id=&#34;初2勝クラス-1&#34;&gt;初2勝クラス&lt;/h2&gt;
&lt;p&gt;ワールドハート (地方勝ち)&lt;/p&gt;
&lt;h2 id=&#34;全頭診断-1&#34;&gt;全頭診断&lt;/h2&gt;
&lt;p&gt;トリプルスリル：
あー、勝ち上がったときの2着がまさかまさかうざんまい。このレースにも出てるね。で、2勝クラスには一回出て大負けと。壁にぶち当たったね。今回もないね。キリで。
脚質的には、先行。福島は合いそうだけどね。勝ち上がったのも福島だしね。ただ、ポテンシャルがない。&lt;/p&gt;
&lt;p&gt;ヴィンテージボンド
強いね。こいつだと思う。栗東からの長距離輸送は初めてだけど、新潟とかも経験しているから大丈夫やろ。タイム指数も問題ない。4ヶ月の休養明け一発目、さあって感じ。入れておくのはいい。脚質的には逃げ、先行。福島にも合いそう。&lt;/p&gt;
&lt;p&gt;ナンヨーヴィヨレ：
あー、二章クラスで足踏みしている系。&lt;/p&gt;</description>
    </item>
    <item>
      <title>20230625_win5</title>
      <link>https://blog.ingenboy.com/post/win5_20230625/</link>
      <pubDate>Thu, 22 Jun 2023 18:42:52 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/win5_20230625/</guid>
      <description>&lt;h1 id=&#34;東京10r-ダート1600m&#34;&gt;東京10R ダート1600m&lt;/h1&gt;
&lt;p&gt;このレース、初めてダートに出てくるやつらが多すぎて怖い。何が起こるかわからない。ということで、5頭くらいに絞って、残りは単勝の保険を買っておこうという算段。&lt;/p&gt;
&lt;h2 id=&#34;初ダートの馬たち&#34;&gt;初ダートの馬たち&lt;/h2&gt;
&lt;p&gt;スリートップ絆
リトルくれば0
シャチ&lt;/p&gt;
&lt;h2 id=&#34;初3勝クラスの馬たち&#34;&gt;初3勝クラスの馬たち&lt;/h2&gt;
&lt;p&gt;サクセスローレル
里のるふぃあん (ほぼキリ判定)
ヴぁーんフリート
ワールドタキオン&lt;/p&gt;
&lt;p&gt;正直、上がってきて一気に行ける奴は、ほぼゼロなんよ。この中に雑魚が3頭混ざっていると思ってほしい。まず、下にも書いてるけど、サクセスローレルはザコ。理由は書いてある通り。&lt;/p&gt;
&lt;p&gt;次、里のるふぇぃあん
まず、場体重が上がってきているのはいいこと。ただね、前回がかなり走りやすい馬場だったから買った説を提唱したい。つまり、こいつもザコやな。ただ、明日の場体重次第だな。あと、調教。
調教も、特に目立ったことはない。そして、上がってきたときの相手、実は雑魚節、というのもサクセスローレルに負けている、そいつ。上がって一気に勝ち上がれる馬ではない。どっからどう見ても。ということで、思い切って切っていいと思う。ただ、場体重は見て。で、切ったら保険で入れて。2000円くらいでいいから。&lt;/p&gt;
&lt;p&gt;ヴぁーんフリート。
こいつもね、ただ走りやすい馬場でかっただけかん強い。前回-6切ろ来てるし、ぶっちゃけ陣営は勝負かけていた感が強いね。その前も-4切ろ。かなり酷使してる感が強い。しかも中1週やで。どうなんやろう、こいつもびみょうやなー。きっていいとおもうでー。そんなに強くないやろ。4,5,6と中一か月で使ってきて、今回は中一周やで。マジで。負荷かけすぎちゃいます？
はい、馬の体重を見て判断したいと思います。うん。&lt;/p&gt;
&lt;p&gt;ワールドタキオン：
わからん、こいつはわからん（笑）&lt;/p&gt;
&lt;h2 id=&#34;全島診断&#34;&gt;全島診断&lt;/h2&gt;
&lt;p&gt;サクセスローレル：
初3章クラス。で、前回-10kgで、5/27ね、勝負に来ている感じだった。しかも、相手はそんなに強くないね、前回2着以外は全部着以下。つまり、こいつもザコってことやな。&lt;/p&gt;
&lt;p&gt;スぺロディア：
全盛期杉田。＆勝ち上がったと胃の相手が雑魚パターン&lt;/p&gt;
&lt;p&gt;里のルフィ案：
ワンチャンだな。こいつも勝ち上がりだけど、ダートにしてから、開花したタイプで、しかも勝ち上がりの時の相手もけっこうつよい。いや、本当か？？そいつ、ピー藍オラクルってやつなんだけおⅮ、サクセスローレルに負けてるわ。しかし、この里のルフィ案ってやつ、4戦続けて場体重上げてきてるのよね。ここで、一気に下げてきたらワンチャンある。先行だし、
最後流してるしね、こいつ結構強いかもしれなに。&lt;/p&gt;
&lt;p&gt;シャチ：
初ダート。新聞を参考にしてみます。
ないな。&lt;/p&gt;
&lt;p&gt;鈴鹿まくふぃ：
ないなー、勝ち上がった時の相手が雑魚すぎる。&lt;/p&gt;
&lt;p&gt;スリートップ絆：
初ダート。
ないと予想。&lt;/p&gt;
&lt;p&gt;鈴鹿でreや：
ない、以上。前回-10KGダシ。なか2ヶ月だしね。マー猛全盛期は過ぎたってこちゃな。6歳だしな。&lt;/p&gt;
&lt;p&gt;ぐりゅーすごっと：
内。キリ。上がってきたときの相手がマジで雑魚。話にならん。&lt;/p&gt;
&lt;p&gt;ふるヴぉーと：
いや、強いで。3章クラスの猛者たちにもまれてちゃんと強くなってると思う。ダート1400で、安定して1:24台が出せている。1:23も出せている。いろんなペースにも対応できると思う。なかなか強い。&lt;/p&gt;
&lt;p&gt;エーティーまくふぃー：
先行。末もまあある。まあ、懸念は発東京ってところかな。
間一か月開けてる。こくらとか、新潟とか言ってもまあ、普通に走ってるし、今回も大丈夫なんじゃないか？&lt;/p&gt;
&lt;p&gt;リトルくれば―：
初ダート：
なんか、最近体重めっちゃ挙げてきてるのよね。こんかいの相手雑魚だから、ここで一気に体重下げてきたらワンチャンあるで。初ダートし。いやまじで。まあでも、オッズ的にwin5に入れるよりは、探勝で2000位かっておくのがいいと思う。&lt;/p&gt;
&lt;p&gt;シャンブル：
初ダートなのよねー。ベジャールには4馬身差で負けている。そのベジャールが初ダートで勝ち上がった。しかし、シャンブルはなんか弱そうなのよね。どうなのやろうか。てか、あのダート戦、めちゃめちゃレベル低かったのよ。ベジャールがかって、アメリカンファクトが二着で、三着がライラボンドだっけか？
まあ、今回は勝てないと思います。キリでいいと思います。&lt;/p&gt;
&lt;p&gt;ヴぁーんフリート：
そんなに杖久根木がするのは俺だけ？上にも書いたけど、まあ見てみよう。
うん、続けて馬体重下げてきているし、勝ち上がりだし、ここ最近よく見えているのは、馬場指数が-20とかだからだし、
ここで、場体重が上がったらキリでいいと思う。中一周だしね。どうなんだろう。いやーざこだとおもうんですけどー。&lt;/p&gt;
&lt;p&gt;くらーべどらど：
勝ち上がった時の相手が雑魚杉。内。先行。あしない。キリ。問題ない。&lt;/p&gt;
&lt;p&gt;ライラボンド：
調教がめっちゃいいのよね。どうしよう。切りたいけど切れない。
馬体重も適性がわからん。意外と上がってきているときの調子がいいのか？こいつは、かなり仕上がってきているっぽいです。&lt;/p&gt;
&lt;p&gt;ワールドタキオン:
は、強いのかはっきり言ってわからん。雑魚集もする。前回に2章クラスを勝ち上がってきているんだけど、この時の相手が猛ジャックなんだよね。まあ、ジャックはザコだからさ。そいつに勝って3勝にきて、いきなり3勝で勝ち上がれるかって言ったら、かなり怪しいと思うぞ。&lt;/p&gt;
&lt;h2 id=&#34;買い目-5頭に絞りたい&#34;&gt;買い目 (5頭に絞りたい)&lt;/h2&gt;
&lt;p&gt;ふるぼーと
ヴァンフリート
エーティーまくふぃ0
ライラボンド
ワールドタキオン&lt;/p&gt;</description>
    </item>
    <item>
      <title>It_fundamentals</title>
      <link>https://blog.ingenboy.com/post/it_fundamentals/</link>
      <pubDate>Fri, 16 Jun 2023 13:19:10 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/it_fundamentals/</guid>
      <description>&lt;h1 id=&#34;第一回&#34;&gt;第一回&lt;/h1&gt;
&lt;p&gt;IT is for storing, retreaving and&lt;/p&gt;
&lt;h2 id=&#34;what-you-need-to-know-when-developing-web-software&#34;&gt;what you need to know when developing web software.&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;hardware&lt;/li&gt;
&lt;li&gt;operating system&lt;/li&gt;
&lt;li&gt;software applications and development&lt;/li&gt;
&lt;li&gt;database&lt;/li&gt;
&lt;li&gt;networking&lt;/li&gt;
&lt;li&gt;internet &amp;amp; web technologies&lt;/li&gt;
&lt;li&gt;security&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;data-vs-information&#34;&gt;data vs information&lt;/h2&gt;
&lt;p&gt;data is just a objective, raw type of bit which is just objectively observed.&lt;/p&gt;
&lt;p&gt;Information is knowledge gaind by analizing data.&lt;/p&gt;
&lt;h2 id=&#34;ビジネスで使われるitの一連のサイクルをこの授業でやろうって話だな&#34;&gt;ビジネスで使われるITの一連のサイクルをこの授業でやろうって話だな。&lt;/h2&gt;
&lt;p&gt;データ収集　→　モデル構築　→　モデルのデプロイ　
っていう、まあよくやるやつや。
まあ、これを達成するために、上の3,4,6をやります。データベース、ソフトウェア開発、インターネット。&lt;/p&gt;
&lt;h2 id=&#34;成績評価&#34;&gt;成績評価&lt;/h2&gt;
&lt;p&gt;10% attendance
45% homework,assignments
45% final exam.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Lossy_compression</title>
      <link>https://blog.ingenboy.com/post/lossy_compression/</link>
      <pubDate>Sat, 10 Jun 2023 17:48:42 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/lossy_compression/</guid>
      <description>&lt;h1 id=&#34;非可逆圧縮アルゴリズム&#34;&gt;非可逆圧縮アルゴリズム&lt;/h1&gt;
&lt;h2 id=&#34;mgard&#34;&gt;Mgard&lt;/h2&gt;
&lt;p&gt;Mgardとは&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;MGARD (MultiGrid Adaptive Reduction of Data) is a technique for multilevel lossy compression and refactoring of scientific data based on the theory of multigrid methods
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;何だけどね、ここのrefactoringってところが重要なんだよね。
multilevel refactoringってところがね。そもそもin the context of HPC data manipulation , refactoringとは何ぞやって話なんだけど、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Refactoring: Refactoring refers to the process of restructuring or reorganizing the data to improve its efficiency or facilitate specific operations. In the context of scientific data, refactoring often involves rearranging the data in a way that aligns with the multilevel structure or grid hierarchy used in the compression algorithm. This can enhance the compression efficiency and enable faster access to different levels of resolution.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とね。すごくないか？？？enable faster access to different levels of resolutionだってよ？？？すごくないか？？？&lt;/p&gt;</description>
    </item>
    <item>
      <title>Dissecting_self_describing_data_formats_to_enable_advanced_querying_of_file_metadata</title>
      <link>https://blog.ingenboy.com/post/dissecting_self_describing_data_formats_to_enable_advanced_querying_of_file_metadata/</link>
      <pubDate>Mon, 29 May 2023 18:43:01 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/dissecting_self_describing_data_formats_to_enable_advanced_querying_of_file_metadata/</guid>
      <description>&lt;h1 id=&#34;前日になって論文紹介の準備を始めるやつーはい俺です&#34;&gt;前日になって論文紹介の準備を始めるやつー、はい俺です。&lt;/h1&gt;
&lt;h2 id=&#34;abstraction&#34;&gt;abstraction&lt;/h2&gt;
&lt;p&gt;self-describingなファイルフォーマットのメタデータをうまく抽出して、クエリスピードを爆上げしようって話。
self-describingであるファイルフォーマット、例えば、HDF5ファイルフォーマットとか、adios2のBP5フォーマットとかは、データとそのデータに関するメタデータを含むファイルフォーマットになっている。これだと、そのファイルを読み込んでから出ないとクエリが発行できないため、利便性にかける。
&lt;!-- raw HTML omitted --&gt;
ファイルシステムをjuleaっていうのに置き換えることで、we can use dedicated backends for key-value and object stores, as well as databases.
これの意味が分からないのんだけど。どういうことなんだろう。
というか、SDDFsからメタデータを抽出して何かいいことあるのだろうか？ファイル操作がもっと簡単になるのだろうか？？そういうことなのだろうか？？&lt;/p&gt;
&lt;h2 id=&#34;introduction&#34;&gt;introduction&lt;/h2&gt;
&lt;p&gt;まあデータがますます増えていると。コンピュータの計算速度よりもI/Oがボトルネックになっている。というのは有名な話。まあ、POSIXのI/Oを使ってたらそれは遅くなるよね、、、という話もあり。
&lt;!-- raw HTML omitted --&gt;
で、データを効率よく管理するためにHDF5やAdios2といったライブラリや、特殊なフォーマットを持つファイルが登場してきた。これらのファイルは、データとそのデータに関するメタデータを含む、self-describing data formatsというもの。だから、ファイルを交換するだけですぐに使うことが可能。つまり、ポータビリティにめちゃめちゃ優れる。が、メタデータとデータが一つになっているためにデータにアクセスするにはファイルを全部読み込まないといけない、という問題が生じる。そこで、メタデータとデータを分けて保存することで、データ中の任意の部分へのアクセスが高速化される、ということだね。俺もそうだと思う。&lt;/p&gt;
&lt;h2 id=&#34;この論文の貢献-contirbution&#34;&gt;この論文の貢献 (Contirbution)&lt;/h2&gt;
&lt;p&gt;prior workでは、HDF5のメタデータとデータそのものを分けて保存することがどれくらい有益だったのかを示したわけですね。
本論文では、Adios2においてもこのようなデータの分離が有効であることを示す。ということですね。
&lt;!-- raw HTML omitted --&gt;
summary of contribution&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;BP3/BP4を分ける方法&lt;/li&gt;
&lt;li&gt;ADIOS2を改造する感じで実現した。&lt;/li&gt;
&lt;li&gt;ただのBP3/BP4の読み書きをparallel and distributedな環境で実施した時の評価を持ってきた。 って話だね。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;backgroundかな&#34;&gt;backgroundかな&lt;/h2&gt;
&lt;p&gt;ADIOS2が何なのか。
BP3/BP4でデータを保存するのね。
で、actual writing and reading behavior of adios2 is determinded by the used engine.ってことで、ファイルへの読み書きをする実体？？は、ADIOS側で決められるよーって話だったよね。
これいまだに信じられないんだけど、本当なのか？これはADIOSを実際に使ってみるのがいいと思う。XMLファイルで設定ができるって話だったからね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Derby</title>
      <link>https://blog.ingenboy.com/post/derby/</link>
      <pubDate>Fri, 26 May 2023 18:07:03 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/derby/</guid>
      <description>&lt;p&gt;まあ、またwin5を解体って話よ。今回は1万円に抑えたい。で、最後の一頭はソールオリエンス、お前に決めた。頼んだぞ。まじで。&lt;/p&gt;
&lt;h1 id=&#34;東京9r&#34;&gt;東京9R&lt;/h1&gt;
&lt;p&gt;マリオは来ない。２章で勝ち上がったときのやつも雑魚だし。&lt;/p&gt;
&lt;p&gt;エコロファルコン。こいつはちょっと怖いけど、先行だし。まあ叩きだと信じたい。あー、調教の南wで93.8秒か。流石におそすぎるね。やる気なさすぎ。ということできりだね。
結果：絵ころファルコンはブービーと。&lt;/p&gt;
&lt;p&gt;そこからもきりのやつが続く。&lt;/p&gt;
&lt;p&gt;で、カラフルキューブはちょっと気になるね。気にはなる。&lt;/p&gt;
&lt;p&gt;グランツアーテム。こいつも気にはなる。馬体重次第ではあるのだが、そうだね、&lt;/p&gt;
&lt;p&gt;ベジャールがないのは、初ダートだからだね。３章クラスでいきなりダート来て勝てるほど甘くはないだろ。&lt;/p&gt;
&lt;p&gt;プラチナトレジャーも同じ。急に勝てるわけがなかろう。
結果：プラチナとれじゃーは11着&lt;/p&gt;
&lt;p&gt;ミッキーが来ないで3万人域のメン・アット・ワークが来るわけがない。なぜなら、タイム勝ちがすぎる。どう考えてもミッキーのほうが強い。まじでそう思う。ここはミッキー一頭で切りに受けたい。&lt;/p&gt;
&lt;p&gt;ミッキー貫花いったく。
結果：ミッキーは4着と。だめだね。終了。&lt;/p&gt;
&lt;p&gt;15番ミッキー (1頭)&lt;/p&gt;
&lt;p&gt;結果：ベジャールが来て終了。ミスりました。だめだね、初ダートだからって来ないって決めつけちゃ。くるやつは来る。
にちゃく、首差でグランつあーてむ。マー惜しかったね。&lt;/p&gt;
&lt;h1 id=&#34;京都9r&#34;&gt;京都9R&lt;/h1&gt;
&lt;p&gt;ここが一番わからないまじで。6頭くらい行っていいかもマジでわからんから。
2章クラスだからね。まだわからんのよね。上がっていくやつは一発で上がっていくし。だめなやつはずっとここにいる。&lt;/p&gt;
&lt;p&gt;1−3は問答無用で消しなんだよね&lt;/p&gt;
&lt;p&gt;ヴォル語はじつは強い。最近調子出ていないけど本当は強い。&lt;/p&gt;
&lt;p&gt;例クリエータは消し。1章で買ったときの相手が雑魚すぎる。たまたま上がれてきた説が濃厚である。&lt;/p&gt;
&lt;p&gt;ここは5頭出いける気がしてきた。
インテンスフレイムは切りだ。そもそも1色ラスで勝ち上がれなかったやつが2章に来て急に勝てるとは考えづらい。
変わりに早稲田くんを入れる&lt;/p&gt;
&lt;p&gt;4,5,7,11,15&lt;/p&gt;
&lt;p&gt;早稲田はーつくんんが来やがった。まあ入れておいてよかった。&lt;/p&gt;
&lt;h1 id=&#34;東京10r&#34;&gt;東京10R&lt;/h1&gt;
&lt;p&gt;ローシャムパークは抜いていく。なんだかだめらしい。
デコラシオンが来ない理由は、中山専用機だから。東京みたいに長くいい足を使うところでは来ない通れは思っている。&lt;/p&gt;
&lt;p&gt;デービットバローズ
カーペン足りた
新保
カーペンタリア
トー染料
ルージュリナージュ
ローシャムも入れておくか
6,7,14,16,17,5&lt;/p&gt;
&lt;p&gt;森野環奈ちゃんも保険買っておいてくれ。
5頭&lt;/p&gt;
&lt;p&gt;結果：入れておいて政界や。ローシャムがちゃんと来た。で、デービットバローズはなんか知らんがぼろ負けや（笑）&lt;/p&gt;
&lt;h1 id=&#34;京都10r&#34;&gt;京都10R&lt;/h1&gt;
&lt;p&gt;ルプ流フォール
継子茶
びーあすとにっしど&lt;/p&gt;
&lt;p&gt;この三頭だな。&lt;/p&gt;
&lt;p&gt;里のラムセスは普通にタイムがそんなに良くないです。&lt;/p&gt;
&lt;p&gt;17番のルージュは切った。その代わりに
保険馬券を買っておくこと。
あと、レッドベルオーブ
お願いします。馬連とかでいいと思います。
保険、
レッドベルオーブ
ルージュ&lt;/p&gt;
&lt;p&gt;結果：これは継子茶が圧勝でした。&lt;/p&gt;
&lt;h1 id=&#34;東京11r&#34;&gt;東京11R&lt;/h1&gt;
&lt;p&gt;ソールオリエンス一択&lt;/p&gt;
&lt;p&gt;で、ここまで残っていた場合だが、ファントムシーフを軸に３連ぷくを買おう。3万円分ほどね。それがいいのではないか？？それがいいね。
二列目、
ソールオリエンス、
足すティえーら
トップナイフ
シャザーン
(4とう)&lt;/p&gt;
&lt;p&gt;３列め
、鳳凰ビスケッツ、ハーツコンチェルト、
メタルスピード
ドゥラエレーで
里のグランツ&lt;/p&gt;</description>
    </item>
    <item>
      <title>Web_vulnerbility_checker</title>
      <link>https://blog.ingenboy.com/post/web_vulnerbility_checker/</link>
      <pubDate>Fri, 26 May 2023 10:13:40 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/web_vulnerbility_checker/</guid>
      <description>&lt;p&gt;注意：
この記事はハッカーが主人公の物語から抜粋した一部である。&lt;/p&gt;
&lt;h1 id=&#34;これだからwebは最高だ&#34;&gt;これだからWebは最高だ&lt;/h1&gt;
&lt;p&gt;はい、なんていうんでしょうかね、Webアプリケーションのペネトレーションテストができるめっちゃ便利なツールを見つけてしまったんです。まあ、これを見つけたきっかけは、あるサイトのAPIフォーマットを特定したかったっていうことなんですけど、いかんせん最近のサイトはSSLで暗号化されているからWireshark等のNICでパケットをキャプチャするツールじゃあ中身は解析できないんですよね。そこで見つけたのが、ZAP、通称man-in-the-middle-proxyってい神ツールです。クライアントとサーバの間に立って動作するこのツールは、まあプロキシとして働いてくれて、SSLの内容を見放題。その他にも便利な機能がたくさんついている。まじで神！！&lt;/p&gt;
&lt;h1 id=&#34;zapのインストール&#34;&gt;zapのインストール&lt;/h1&gt;
&lt;p&gt;zapはjava上で動く。Ghidraといい、すごいツールはなんかJavaで書かれているんだけど、その理由は何だろう。まあいいや。まずはJavaをインストールする。11+がいい。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install default-jre
sudo apt install default-jdk
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;その次、
&lt;a href=&#34;&#34;&gt;ZAPの公式&lt;/a&gt;からinstallerを持ってきてあとは、シェルスクリプトを走らせるだけ。&lt;/p&gt;
&lt;h1 id=&#34;zapの使い方&#34;&gt;ZAPの使い方&lt;/h1&gt;
&lt;p&gt;基本的にはWebブラウザでアクセス可能なページの診断だったり脆弱性のチェックに使う。で、完全に自動化された脆弱性診断のAutomated scanっていうのと、ブラウザを普通にいじっているみたいに自分で脆弱性を見つけるManual scanっていうのがある。
気をつけてほしいのが、scanをするともう攻撃とみなされても仕方がない、ということ。
しかし、モードを選べて、safe modeっていうのを選択すると、攻撃とみなされないかも。わからん。&lt;/p&gt;
&lt;h2 id=&#34;automated-scan&#34;&gt;Automated Scan&lt;/h2&gt;
&lt;p&gt;これは、ターゲットとなるサイトのディレクトリ構造をクローリングして各ページに対して、脆弱性チェックのリポートを出してくれるツールになっている。うん、結構便利だと思う。&lt;/p&gt;
&lt;h2 id=&#34;manual-scan&#34;&gt;manual scan&lt;/h2&gt;
&lt;p&gt;これがこのツールの真骨頂だと思う。HUDっていう、新しい機能なんだけど。HUDの説明簡単に下に書いておくか。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The HUD is a completely new way to interact with ZAP.
It overlays security information on top of the application you are testing and allows you to access key ZAP features.
It is easier for people new to security to understand but it also allows experienced penetration testers to focus on the application they are testing.
By default, the HUD is injected into all of the HTML pages proxied through the ZAP desktop. You can turn it on and off easily using the [green radar] button on the ZAP toolbar. It is not injected by default into pages proxied through ZAP when it is running in headless/daemon mode as that could break unit tests. This behaviour can be changed via the HUD options.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;まずは、各ページ、さらに今まで訪れたページ (そのサイトの)に対して、脆弱性のレポートを出してくれるってところは前と同じ。だが、ここからがすごい。まじで。httpとwebsocketのリクエストの内容が全部見られるってところ。これはやばくないか？？？やばいね。
さらに、変更が許されていないフォームを変更したり、リクエストを送るときにリクエストの内容を書き換えたり、リクエストをpendingしたりできる。これはやばい。見放題だね。ちょっと怖いね。今日の夜が楽しみすぎるって話なんだわ。ちょっとできることまとめるわ。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Development_guide</title>
      <link>https://blog.ingenboy.com/post/development_guide/</link>
      <pubDate>Thu, 25 May 2023 13:57:21 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/development_guide/</guid>
      <description>&lt;h1 id=&#34;開発をするときの流れ&#34;&gt;開発をするときの流れ&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;何を作るかを考える
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;紙とペンでシステムの構成を考える。このときにコンポーネントを洗い出す。更に、コンポーネント同士のやり取りについても考える。APIを作ることを考えて、入出力関係も簡単に考えておくのがいいでしょう。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;データベース設計をする。このときにどんなデータが必要かをすべて洗い出しておく必要がある。テーブルの設計もここでやります。.sqlファイルにどんどん書いていくのがいいでしょう。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenAPI Specification formatでAPIの仕様書をかく。
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;コンポーネントに分ける。コンポーネントのAPIを設計する
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;実装
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;テスト&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Let_us_encrypt</title>
      <link>https://blog.ingenboy.com/post/let_us_encrypt/</link>
      <pubDate>Wed, 24 May 2023 17:18:14 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/let_us_encrypt/</guid>
      <description>&lt;h1 id=&#34;まあ便利なこと無料でssl証明書が発行できるなんて&#34;&gt;まあ便利なこと。無料でSSL証明書が発行できるなんて！！&lt;/h1&gt;
&lt;p&gt;ということでね、Let&amp;rsquo;s encryptを使って期限が切れたSSL証明書を再発行していきたいと思います。
参考サイトは以下のとおりです。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/shojimotio/items/4fa82b21390e8a6d8446&#34;&gt;ref&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;step1-クライアントソフトのインストール&#34;&gt;step1 クライアントソフトのインストール&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install certbot python3-certbot-nginx
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;step2-443のポート開放--ファイアウォールの設定&#34;&gt;step2 443のポート開放 &amp;amp; ファイアウォールの設定&lt;/h1&gt;
&lt;h1 id=&#34;step3-ssl証明書の発行&#34;&gt;step3 SSL証明書の発行&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo certbot certonly
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これでインタラクティブに設定できる。聞かれたことを書けばいいだけです。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press &amp;#39;c&amp;#39; to cancel): 2
Plugins selected: Authenticator webroot, Installer None
Please enter in your domain name(s) (comma and/or space separated)  (Enter &amp;#39;c&amp;#39;
to cancel): ingenboy.com
Obtaining a new certificate

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/ingenboy.com-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/ingenboy.com-0001/privkey.pem
   Your cert will expire on 2023-08-22. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   &amp;#34;certbot renew&amp;#34;
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let&amp;#39;s Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;step4-nginx-or-apacheの設定を変更する&#34;&gt;step4 nginx or apacheの設定を変更する。&lt;/h1&gt;
&lt;p&gt;nginxが証明書にアクセスできるようにパスをnginx.confに書き込むわけですね。はい、以上。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Machine_learning_using_sklearn</title>
      <link>https://blog.ingenboy.com/post/machine_learning_using_sklearn/</link>
      <pubDate>Wed, 24 May 2023 14:28:23 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/machine_learning_using_sklearn/</guid>
      <description>&lt;h1 id=&#34;まえがき&#34;&gt;まえがき&lt;/h1&gt;
&lt;p&gt;前の記事で、pandasをつかってデータフレームを扱う基礎を学んだね。
めちゃめちゃ便利だということがわかったと思うが、pandasを使ってデータを整形して、最終的に何がしたいかというと、データの分析がしたいんだよね。なぜ分析したいかというと、データから何かしらの情報を得てそれを今後に役立てたいから。
今後への役立て方の一つに予測があるわけだね。そう、回帰だ。深層学習も回帰だよね。深層学習をやるにはTensorFlowっていうライブラリがめっちゃ便利だが、統計的機械学習をやるには、sklearnがある。ということでsklearnを使って統計的機械学習をやっていこう！&lt;/p&gt;
&lt;p&gt;の前に、pandas + sklernをGPUでバク速でやってくれるのがrapidsっていうフレームワークだったよね！実際に大量のデータを使って運用するときは予測にも時間をかけていられないと思うので、GPUを使った運用を考えたほうがいいですね。というか、一回現場で働いてみて、そのあと博士課程で戻ってくるのは全然ありだな。楽しそう。そっちのほうが実際の問題がわかるので有用だと思います。&lt;/p&gt;
&lt;p&gt;はい、そのまま載せます。ちなみに、standard deviationは標準偏差です。&lt;/p&gt;
&lt;h1 id=&#34;1-preperocessing&#34;&gt;1. preperocessing&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 5.1.1
game_sales = pd.read_csv(&amp;#39;sales.csv&amp;#39;, encoding=&amp;#39;CP932&amp;#39;).dropna()
na_sales_0_to_3 = game_sales[&amp;#34;NA_Sales&amp;#34;].between(0.01,3)
game_sales = game_sales[na_sales_0_to_3]
na_sales_reshape = game_sales[&amp;#34;NA_Sales&amp;#34;].values.reshape(-1,1)

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(na_sales_reshape)
na_sales_scaled = scaler.transform(na_sales_reshape)
game_sales[&amp;#34;NA_Sales_Std&amp;#34;] = pd.Series(na_sales_scaled.flatten())

print(game_sales[&amp;#34;NA_Sales_Std&amp;#34;].head(10), end=&amp;#39;\n\n&amp;#39;)

# 5.1.2
old_mean_std = game_sales[&amp;#39;NA_Sales&amp;#39;].agg([&amp;#34;mean&amp;#34;,&amp;#34;std&amp;#34;]).round(2)
new_mean_std = game_sales[&amp;#39;NA_Sales_Std&amp;#39;].agg([&amp;#34;mean&amp;#34;,&amp;#34;std&amp;#34;]).round(2)

print(old_mean_std, end=&amp;#39;\n\n&amp;#39;)
print(new_mean_std, end=&amp;#39;\n\n&amp;#39;)

# 5.1.3
fig, axes = plt.subplots(2,1,figsize=(8,6))
sns.boxplot(data=game_sales, x=&amp;#39;NA_Sales&amp;#39;, ax=axes[0])
sns.boxplot(data=game_sales, x=&amp;#39;NA_Sales_Std&amp;#39;,  ax=axes[1])

plt.show()
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;linear-regression&#34;&gt;linear regression&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# 5.2.1
game_sales = pd.read_csv(&amp;#39;sales.csv&amp;#39;, encoding=&amp;#39;CP932&amp;#39;).dropna()
col_list = [&amp;#39;NA_Sales&amp;#39;, &amp;#39;EU_Sales&amp;#39;, &amp;#39;JP_Sales&amp;#39;, &amp;#39;Other_Sales&amp;#39;, &amp;#39;Global_Sales&amp;#39;,
            &amp;#39;Critic_Count&amp;#39;, &amp;#39;User_Score&amp;#39;, &amp;#39;Critic_Score&amp;#39;]

from sklearn.preprocessing import scale
X = scale(game_sales[col_list].values)
y = scale(game_sales[&amp;#39;User_Count&amp;#39;].values)

from sklearn.linear_model import LinearRegression
reg_model = LinearRegression()
reg_model.fit(X,y)

# 5.2.2
reg_coef = reg_model.coef_
report = [f&amp;#39;{a}\t: {b}&amp;#39; for a, b in zip(col_list, reg_coef)]

for info in report:  print(info)
print(f&amp;#39;Regression Score :{reg_model.score(X,y)}&amp;#39;)

# 5.2.3
fig = sns.regplot(x=&amp;#39;User_Count&amp;#39;, y=&amp;#39;Global_Sales&amp;#39;, data=game_sales)
fig.set(xlim=(100, 4000), ylim=(2, 20))

plt.show()
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;logistic-regression&#34;&gt;Logistic Regression&lt;/h1&gt;
&lt;p&gt;ロジスティック回帰分析は、いくつかの要因（説明変数）から「2値の結果（目的変数）」が起こる確率を説明・予測することができる統計手法です。
らしいです。はい、2値しか予測できない、というところがめちゃめちゃポイントですね。しっかりと頭に入れておきましょう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Learn_pd_and_dataframe</title>
      <link>https://blog.ingenboy.com/post/learn_pd_and_dataframe/</link>
      <pubDate>Wed, 24 May 2023 12:53:58 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_pd_and_dataframe/</guid>
      <description>&lt;h2 id=&#34;学校のデータ分析の授業でやっとpandasやdataframeの基礎を学んだのでまとめてきたいと思うこれでkaggleもできるようになると思うよ&#34;&gt;学校のデータ分析の授業でやっとpandasやdataframeの基礎を学んだのでまとめてきたいと思う。これでkaggleもできるようになると思うよ！！&lt;/h2&gt;
&lt;h1 id=&#34;chapter-1&#34;&gt;chapter 1&lt;/h1&gt;
&lt;h2 id=&#34;importing&#34;&gt;importing&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import sklearn as sl
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;reading-csv&#34;&gt;reading csv&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;salary = pd.read_csv(&amp;#39;salary.csv&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;dataframe-meta-operation&#34;&gt;dataframe meta operation&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# print first 5 rows
df.head()

# print first n rows
df.head(n)

# print shape
print(df.shape)

# print columns
print(df.columns)

# print info
print(df.info())
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;converting-dataframe-to-list-or-numpy&#34;&gt;converting dataframe to list or numpy&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# convert dataframe&amp;#39;s columns to string list
string_list = df.columns.values
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;getting-specific-column&#34;&gt;getting specific column&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;game_name = df[&amp;#39;game_name&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;getting-dummiy-of-specific-column-prefix-is-optional&#34;&gt;getting dummiy of specific column (prefix is optional)&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;dummy_column = pd.get_dummies(df[&amp;#39;specific_row&amp;#39;],prefix=&amp;#39;pref&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;slice-specific-row-and-column&#34;&gt;slice specific row and column&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# get slice of rows from 100 to 199
slieced = df.iloc[100:200,:]

# get specific columns
all_scores = [&amp;#39;Critic_Score&amp;#39;, &amp;#39;User_Score&amp;#39;]
reg_sales_df = game_sales[all_scores]

# get specific clumns like specified
all_sales = game_sales.filter(like=&amp;#39;Sales&amp;#39;)

# get specific rows and columns
sample_info = eng_salary.loc[:11244,[&amp;#39;Degree&amp;#39;, &amp;#39;Specialization&amp;#39;, &amp;#39;Salary&amp;#39;]]
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;chapter-2-filtering&#34;&gt;chapter 2 (Filtering)&lt;/h1&gt;
&lt;h2 id=&#34;filter-by-condition&#34;&gt;filter by condition&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# get rows where Year_of_Release is 2016
filter = game_sales[&amp;#39;Year_of_Release&amp;#39;] ==  2016
year_of_2016 = game_sales[filter]

# get rows which satisifes the multiple condition and print specific columns
pub_is_Nintendo = game_sales[&amp;#39;Publisher&amp;#39;] == &amp;#39;Nintendo&amp;#39;
year_is_85_to_95 = (game_sales[&amp;#39;Year_of_Release&amp;#39;] &amp;gt;= 1985) &amp;amp;\
                   (game_sales[&amp;#39;Year_of_Release&amp;#39;] &amp;lt;= 1995)
Nintendo_85_to_95 = game_sales[year_is_85_to_95 &amp;amp; pub_is_Nintendo] 
print(Nintendo_85_to_95[[&amp;#39;Name&amp;#39;, &amp;#39;Publisher&amp;#39;, &amp;#39;Year_of_Release&amp;#39;]], end=&amp;#39;\n\n&amp;#39;)


# same as above but in one line.
sp_omit = &amp;#39;information technology&amp;#39;
cond1 = eng_salary[&amp;#39;Specialization&amp;#39;] != sp_omit
cond2 = eng_salary[&amp;#39;English&amp;#39;] &amp;lt;= 400
cond = cond1 &amp;amp; cond2
output = eng_salary.loc[cond,[&amp;#39;Specialization&amp;#39;,&amp;#39;English&amp;#39;]]
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;grouping-important&#34;&gt;grouping (IMPORTANT)&lt;/h2&gt;
&lt;p&gt;まずはgroupingがどんなことをするのかだけど、ある列について、同じものをまとめるって感じだな。そして、その列についてまあ、色々と操作をするわけです。例えば各出版社ごとの売上とかもかんたんに計算できるようになるってことです。これはクッソ便利ですよね？？はい、マジで便利なんです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Openvpn_client_from_ubuntu</title>
      <link>https://blog.ingenboy.com/post/openvpn_client_from_ubuntu/</link>
      <pubDate>Wed, 24 May 2023 08:46:41 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/openvpn_client_from_ubuntu/</guid>
      <description>&lt;h1 id=&#34;ubuntuからopenvpnサーバにつなぐときの設定方法&#34;&gt;ubuntuからopenvpnサーバにつなぐときの設定方法&lt;/h1&gt;
&lt;p&gt;いや、
settings -&amp;gt; network -&amp;gt; openvpn
で一発や！笑
デフォルトでopenVPNのサーバに接続はできるようになっているみたいだ。&lt;/p&gt;
&lt;p&gt;ここでメモしておきたいのは、ubuntuでLayer 2 Tunnel Protocolを使ったVPNの設定方法だね。これはデフォルトの設定ではできなくなっていて、ソフトをインストールする必要があるんです。以下のコマンドで一発です。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install network-manager-l2tp
sudo apt-get install network-manager-l2tp-gnome
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あとは、書かれているとおりに設定すれば問題なしです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_the_design_of_web_api</title>
      <link>https://blog.ingenboy.com/post/comments_on_the_design_of_web_api/</link>
      <pubDate>Thu, 18 May 2023 13:45:30 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_the_design_of_web_api/</guid>
      <description>&lt;h1 id=&#34;web-apiの設計という本をまとめる&#34;&gt;web apiの設計という本をまとめる&lt;/h1&gt;
&lt;h1 id=&#34;なぜ読もうと思ったか&#34;&gt;なぜ読もうと思ったか？&lt;/h1&gt;
&lt;p&gt;自分がIT企業にエンジニアとして就職するから。また、研究でデータベースを作っているが、そのAPIの設計に役立てられると思ったから。大学の図書館で借りた本だけど、一周してみて良本だったら自分で買おう。ということでさっさと読みましょう。&lt;/p&gt;
&lt;h1 id=&#34;1章&#34;&gt;1章&lt;/h1&gt;
&lt;p&gt;APIとは何か？APIの設計はなぜ重要か？APIの設計は何を意味するのか？うーん、わかりきっていることですね。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;No, a function is not an API (Application Programming Interface) in itself.

A function is a self-contained block of code that performs a specific task or operation. It encapsulates a set of instructions that can be called and executed when needed. Functions can take input parameters and return values or perform actions without returning a value.

On the other hand, an API refers to a collection of functions, protocols, and tools that allow software components to interact with each other. APIs define the interfaces and rules for communication between different software systems, enabling them to exchange data and execute specific operations.

In essence, an API encompasses a set of functions or methods, along with the associated rules and protocols, that define how different software components can communicate and interact with each other. Functions themselves are building blocks within an API that provide specific functionality or perform specific tasks.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;と思って、じゃあライブラリはAPIだよね？って聞いたら、&lt;/p&gt;</description>
    </item>
    <item>
      <title>20230514win5</title>
      <link>https://blog.ingenboy.com/post/win5_20230514/</link>
      <pubDate>Wed, 10 May 2023 12:12:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/win5_20230514/</guid>
      <description>&lt;h1 id=&#34;1レース目&#34;&gt;1レース目&lt;/h1&gt;
&lt;p&gt;4頭 (3頭)
ヴェルとハイム：休養明け、確かに京都は得意そうな感じはする。しかし、休養明けっていうのがでかすぎる。過去、休養明けには全然買っていないイメージ。そうね、本当に休養明けはだめなイメージ？だったんだけど、そんなこともないか？場体重次第だな。明日、+-5に収まっていたら考える必要が出てくるかもしれない。&lt;/p&gt;
&lt;p&gt;露ワンディシティー：まあ、ぶっちゃけ2章クラスから上がってきたばかりなんですわ。上がってきたときの2着は里のヘリオス。ぶっちゃけ里のヘリオスはザコ。そいつに0.1秒差で買っただけの露ワンディシティー、実は雑魚かもしれん。うん、シーザリオ母だしね。4歳だし、もう全盛期終わってるよ。うん、3諸クラスの一発目は3位だったんだけど、2位との差が2馬身差以上。これはぶっちゃけ雑魚ですわ。こいつは来ない。悪い。2諸クラスで2着になったと胃の1着が3諸クラスで活躍できていないのをいても、まあないのではないか？と思ってしまうのだが、どうだろう。
調教を見ても、最後の1ハロンで落としてしまっているイメージだな。正直。これはないかな、うん、キリでオッケーです！！&lt;/p&gt;
&lt;p&gt;鈴鹿とおっぷばご：なるほｄ、切除したんだな。だからワンちゃんあると思っていらっしゃる。確かに、そう考えるとワンチャンあるんだわ、鈴鹿とっぷばご。
いや、調教を見たら、やっぱりしぇいリーンやグランディアにはかなわなそうです。ということで、ここはキリです。&lt;/p&gt;
&lt;p&gt;しぇいリーン：逃げ。絶対に入れておきたい。こいつは最後まで逃げ粘って勝利って可能性、全然ある。&lt;/p&gt;
&lt;p&gt;パーソナルはい：しぇいリーンと同じです。&lt;/p&gt;
&lt;p&gt;ヴィあるーくす：こいつは時計がかかる馬場で力を発揮するタイプだと思う。1600はめちゃめちゃ走ってきているけど、1:33.5がベスト。正直これは微妙な数字だと思ってしまうね。いや、東京で1:32.4を出しているけど、まあ、場体重次第かな。あまり伸びるタイプでもないし、別に輸送が苦手だったわけでもないし。うん、京都には向かないと思うけど。どうだろう？？あと、前走の旗手が1400がベストなイメージといっているが、本当にそんな感じがする。最後追い抜かれているしね。チョット挑戦する場所が違うのではないか？と思ってしまいます。キリだね。&lt;/p&gt;
&lt;p&gt;トオヤリト生徒：こいつ、ちん子切ってから安定しやがった。それが前回の中山だったわけね。後は単純に主馬場巧者だわ、こいつ。うん、こいつの馬連とか、買ってもいいかもしれないね。うん、こいつの馬単を買うことにした。
4 &amp;gt; (1,3,6,8,10,11,12)
で、行きたいと思います！！200円ずつかな。まあ遊びとしてもいいでしょう。&lt;/p&gt;
&lt;p&gt;で、最後に確認するのは、ヴィあるーくすを入れるか。まあ今のところ入れる気はないです。はい。&lt;/p&gt;
&lt;p&gt;入れません。結果、3当
(10,11,12)&lt;/p&gt;
&lt;h1 id=&#34;2レース目-2頭&#34;&gt;2レース目 (2頭)&lt;/h1&gt;
&lt;p&gt;クールミラボーが来ない理由は、初の関東遠征だから。以上。
リバートゥルーが来ない理由は、タイムが雑魚すぎるから。話にならん。めちゃめちゃスローなレースで買っているだけよ。
どんでん返しが来ない理由は、ダート代わりだから。おそらくダートもそんなに得意ではない。見た感じね。
ラップスターが来ない理由は、確かに上がり速いけど、不良馬場だったから。あと、輸送もそんなに得意そうじゃない。しかし、先行馬であるところはめちゃめちゃ魅力的。こいつは買ってもいいかもしかし、ゆてぃたむもウェイいくも選考なんだよなー。後勝ち上がった時の対戦相手が雑魚すぎる。キリ。
ということで、
うん、ここはウェイくざぼーどとゆてぃたむの二党で決定だな。&lt;/p&gt;
&lt;p&gt;はい、この二党でまったく問題ない。
(2,6)&lt;/p&gt;
&lt;h1 id=&#34;3レース目-新潟芝1800m&#34;&gt;3レース目 新潟芝、1800m&lt;/h1&gt;
&lt;p&gt;6頭 (5頭)
まずは、アンダープロット、はーランズハーツ、ソウルトレイン、の三党はちょっと話にならないので除外します。&lt;/p&gt;
&lt;p&gt;グランスラムアスク：削除です。前回2章クラス買って、3章クラスに上がってkチアわけですが、マジで座濃い、話にならないレースでした。今回も無理でしょう。キリ。
いや、馬体重をみて、というのはありますが、こいつ、逃げ馬なんですよ。で、ワンチャンありそうなので、入れておきます。逃げ馬で痛い目に合っているので。はい。入れます。&lt;/p&gt;
&lt;p&gt;差じぇす：京都や小倉など、最後にスピードに乗っていく感じのところはかなり得意なイメージしかし、新潟はだめだな。しかも3章クラスに上がっていきなり勝てるわけがなかろうとね。そんなに甘くはないのですよ。&lt;/p&gt;
&lt;p&gt;襟おとろーぴお：こいつ、未勝利から3章クラスまで一気に来たね。前回の福島でいい感じの成績を残しているが、今回はどうだろうね。と思ったが、前回の福島ではトップハンデとなんと7キろも差があっての2着だからね。（笑）。今回はまた元に戻って56キロです。まあ、ないでしょうね。キリです。&lt;/p&gt;
&lt;p&gt;うん、
2,6,8,9,11,12&lt;/p&gt;
&lt;p&gt;6頭です。&lt;/p&gt;
&lt;p&gt;この中から一番人気が低くなりそうなやつを一頭選んで削除。そいつの馬連を買いましょう。いいでしょうか？
後はもちろん場大樹。&lt;/p&gt;
&lt;p&gt;ここまでで40通り。&lt;/p&gt;
&lt;h1 id=&#34;4レース目&#34;&gt;4レース目&lt;/h1&gt;
&lt;p&gt;6頭 (2頭)
京都のダート1400。最後の、残り800mから600mまで2メートル下って、そのままスピードに乗ってゴールする感じ。雨予報だし、これはマジで差しが決まる。っていうのと、意外とパワーがないやつでも残る可能性がかなり高い。この2つを頭に入れておこう。ダートはパワー型が勝つイメージがあるが、今回はそうならない可能性があるということだ。つまりサンデーサイレンス系が勝つ可能性があるということだ。&lt;/p&gt;
&lt;p&gt;ちゅうことで、まずは絶対にないと思われる、1,2,6,7,8,11,13を消しました。はい。
つぎ、&lt;/p&gt;
&lt;p&gt;多賀野クリステル。こいつ、上がってきたね、3諸クラスから。で、こいつ、阪神とか中京で買ってるんだけど、こういうのは最後、パワーで押し粘る感じ。
京都は東京、新潟に近い。ということで、前回阪神で勝ち上がったこいつは、完全にキリなんですわ。&lt;/p&gt;
&lt;p&gt;セキふうは、ダート良で走るイメージだな。逆に、多賀野クリステルは不良ダートの表が走るイメージがある。サンデーサイレンス系だしね。うん、積風波入れたほうがいいかも。&lt;/p&gt;
&lt;p&gt;いまのところ、
(3,4,9,10,12,15,16)の7等を選んだけど、
ここから、馬体重を見て1頭を減らし、さらに、最もにんきがひくいやつをはずし、&lt;/p&gt;
&lt;h1 id=&#34;5-race&#34;&gt;5 race&lt;/h1&gt;
&lt;p&gt;1頭 (1でもいいかも)&lt;/p&gt;
&lt;h1 id=&#34;反省&#34;&gt;反省&lt;/h1&gt;
&lt;h1 id=&#34;1レース目-1&#34;&gt;1レース目&lt;/h1&gt;
&lt;h1 id=&#34;2レース目&#34;&gt;2レース目&lt;/h1&gt;
&lt;h1 id=&#34;3レース目&#34;&gt;3レース目&lt;/h1&gt;
&lt;h1 id=&#34;4レース目-1&#34;&gt;4レース目&lt;/h1&gt;
&lt;h1 id=&#34;5レース目&#34;&gt;5レース目&lt;/h1&gt;</description>
    </item>
    <item>
      <title>Raspi_lustre</title>
      <link>https://blog.ingenboy.com/post/raspi_lustre/</link>
      <pubDate>Tue, 09 May 2023 14:23:12 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/raspi_lustre/</guid>
      <description>&lt;h1 id=&#34;ラズパイでlustre分散ファイルシステムを構築してioのバンド幅を爆上げしたいって話&#34;&gt;ラズパイでLustre、分散ファイルシステムを構築して、I/Oのバンド幅を爆上げしたいって話&lt;/h1&gt;
&lt;p&gt;まずはいきなり参考文献ですね。
&lt;a href=&#34;https://nkhnd.hatenablog.jp/entry/2021/03/24/001012&#34;&gt;GlusterFS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;んで、早速壁にぶち当たるわけですね。Lustreはbinaryが配布されているらしいんですが、x86用らしいんですよね。ということで、raspiで動かすためにはソースコードをビルドしないといけないんですね。&lt;/p&gt;
&lt;p&gt;まあ、これだけ書いて終わりっていうの残念なので、分散ファイルシステムについて知っていることを書いていきたいと思います。&lt;/p&gt;
&lt;p&gt;まず、ファイルシステムっていうのは、OSの機能で、ブロックデバイスの操作をするためのデバイスドライバをラッピングしてくれているOSの機能。デバイスドライバへのAPIを提供してくれているOSの機能。で、ファイルシステムがあるから、我々はOSにお願いするだけでいい感じにファイルを作れるし、どこにどのファイルがあるか、とかそういう管理もしなくていいのよね。ただね、ファイルシステムもただのプログラムに過ぎないんですわ。何が言いたいかというと、内部ではカチカチとデバイスドライバーを動かしているわけで。いや、何が言いたいかっていうと、1ファイルにつき1プロセスしか操作を許されないってことね。つまり、複数のプロセスが一気に一つのファイルに書き込むとか、そういうのは無理なわけよ。これまず大事なポイントね。だからね、書き込みたいデータがたくさんあってもsingule writingをするしかないんだよね。
はい、GPT先生に聞いてみた。&lt;/p&gt;
&lt;p&gt;Is it impossible for multiple processes to write data to a same file simultaniously?&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;In traditional file systems, it is generally not possible for multiple processes to write data simultaneously to the same file without coordination or synchronization mechanisms. Concurrent writes to the same file can lead to data corruption, inconsistencies, or conflicts.

When multiple processes attempt to write to the same file simultaneously, several issues can arise:

    Data Corruption: Simultaneous writes from multiple processes can result in data corruption, where the written data becomes mixed or garbled. This can happen if the file system interleaves or merges the write operations from different processes in an uncontrolled manner.

    Inconsistent Data: If processes are writing to different parts of the same file simultaneously, it can lead to inconsistent data. For example, if two processes write different values to the same location within the file at the same time, the final content of that location becomes unpredictable.

    File Locking and Concurrency Control: File systems often employ locking mechanisms to control access to files and ensure data integrity. These locks allow processes to acquire exclusive or shared access to a file, preventing simultaneous writes by multiple processes. Without proper coordination, conflicts may arise, and processes may contend for file locks, leading to delays and reduced performance.

To enable multiple processes to write data to the same file simultaneously, coordination mechanisms such as file locking, semaphores, or other synchronization techniques need to be employed. These mechanisms ensure that processes take turns or serialize their write operations to maintain data integrity and consistency.

However, it&amp;#39;s worth noting that some distributed file systems or specialized I/O middleware, like ADIOS, may provide mechanisms to support parallel or concurrent writes to a file. These systems typically implement internal coordination and synchronization mechanisms to manage concurrent access safely. In such cases, the middleware handles the coordination and ensures data integrity, allowing multiple processes to write to the same file efficiently.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;しかし一つのファイルに同時書き込みを許可しているふぃあるシステムもある。XFSは一つのファイルに同時書き込みを許可しているらしいのだが。そんなことできるのか？？？&lt;/p&gt;</description>
    </item>
    <item>
      <title>Openvpn_multiple_client</title>
      <link>https://blog.ingenboy.com/post/openvpn_multiple_client/</link>
      <pubDate>Thu, 27 Apr 2023 12:47:21 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/openvpn_multiple_client/</guid>
      <description>&lt;h2 id=&#34;一つの証明書を複数のクライアントで使い同時接続を可能にする方法&#34;&gt;一つの証明書を複数のクライアントで使い、同時接続を可能にする方法&lt;/h2&gt;
&lt;p&gt;基本的にクライアント証明書は一つのクライアントにつき一つ作るのがいいとされている。しかし、新しく作るのがめんどいときもある。iphoneとsurfaceに同じクライアント証明書が入っているのだが、この二つを同時接続しようとすると、先に接続されていた方が追い出される形になる。
openvpnのログを見てみるとこんな感じである。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Thu Apr 27 12:37:15 2023 MULTI: new connection by client &amp;#39;hogehoge&amp;#39; will cause previous active sessions by this client to be dropped.
 Remember to use the --duplicate-cn option if you want multiple clients using the same certificate or username to concurrently connect.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;chatGPTさんに解決方法を聞きました。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Yes, you can add the &amp;#39;--duplicate-cn&amp;#39; option to your OpenVPN server configuration file.

To do this, follow these steps:

    Open your OpenVPN server configuration file (usually named &amp;#39;server.conf&amp;#39;) using a text editor.

    Add the line &amp;#39;duplicate-cn&amp;#39; to the file, without the quotes.

    Save the file and restart the OpenVPN server for the changes to take effect.

Here&amp;#39;s an example of what the relevant section of the configuration file might look like:

# Allow multiple sessions per client username or certificate

duplicate-cn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;解決です。chatGPT先生すごすぎ！！ググレカス！！はいずれ死語になるのでしょうか？？？&lt;/p&gt;</description>
    </item>
    <item>
      <title>Haruten</title>
      <link>https://blog.ingenboy.com/post/haruten/</link>
      <pubDate>Tue, 25 Apr 2023 10:16:38 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/haruten/</guid>
      <description>&lt;h2 id=&#34;タイトルホルダーが来ない理由を言語化してみた&#34;&gt;タイトルホルダーが来ない理由を言語化してみた。&lt;/h2&gt;
&lt;p&gt;今週末は春の天皇賞です。今年もいい馬がそろいましたが、確実に過剰人気になる馬が一頭いる。タイトルホルダーですね。
はい、まずはタイトルホルダーがどういう馬なのか、を軽く説明したいと思います。ズバリ、スタミナがめちゃめちゃある先行逃げ切りです。長くいい足を使うとかっていうのはできない。まじで。ピッチがめっちゃ早いのよね。で、最後の急な坂とかも頑張って粘れる感じ。
で、先行逃げ切りに合う競馬場は、最後の直線が短く、急な坂が待っている中山とか阪神の内とかなんだよね。
&lt;!-- raw HTML omitted --&gt;
今までタイホが買ってきた舞台とかを見ると全部それ。まず、菊花賞。阪神3000mの内。そして、宝図記念。阪神2200mの内。そして去年の天皇賞春。阪神3200の外からの最後内回り。日経賞も中山。全部タイトルホルダーのための舞台だったんだよね。逆に負けたやつを考えてみよう。ダービー。うん、よーいどんだね。
ちなみに、前回の日経賞、道悪のやつね、あれ、どう考えてもタイホ有利な展開だから、勝って当たり前なのよね。2着以下の泥のかぶり方見たやろ。それはそうやわ、ってかんじなの。
さらに、多くの素人は思うんだよ。去年の天皇賞春タイトルホルダー買ってるし、今年も余裕じゃね？？？ってね。阪神競馬場から京都競馬場に変わったってことも知らずにね。
&lt;!-- raw HTML omitted --&gt;
マジな話、アスクには負けるね。ディープ産駒って足長いもん。スラっとしててかっこいいよね。で、京都最後下りだもん。その長い足を使ってビューンといってほしい。そう、イメージ的には小倉競馬場に近いね。最後、ビューンってめちゃめちゃ伸びてくる感じ。そうなると、ジャスティンパレスとアスクビクターモアに軍配が上がるね。後はボルドぐふーしゅだね。まじで。ただ、ぼるディーもどちらかというとタフなのがあっている気がするのよね。中山とかそっち系。あとね、ジャスティンは輸送が苦手なのよね。これ大事。ジャスティンは栗東だからね。いや、もうジャスティンしかない気がする。ジャスティン、アスク、ぼるディー、だね。ただね、アスクは美穂ってのは気になるね。
まあ、これはうまいレースになる。
&lt;!-- raw HTML omitted --&gt;
京都でやってた時の菊花賞馬にはコントレイルとかがいる。タイトルホルダーが菊花用とれたのは間違いなく、阪神内だったから。時も味方したって感じよ。宝塚では買いたいが、京都の春はきり！！！お疲れ！！&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;</description>
    </item>
    <item>
      <title>Ngrock and remote.it explained</title>
      <link>https://blog.ingenboy.com/post/ngrockexplained/</link>
      <pubDate>Wed, 19 Apr 2023 23:09:18 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/ngrockexplained/</guid>
      <description>&lt;h1 id=&#34;ngrock&#34;&gt;ngrock&lt;/h1&gt;
&lt;p&gt;とはなにか？もう調べるの面倒くさいんでchatgp先生の回答をそのまま持ててこようと思います。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Ngrok is a popular tool that allows developers to expose a web server running on their local machine to the internet. It creates a secure tunnel from a public endpoint to a locally running web service. This can be useful for testing webhooks, APIs, and other web services that require a publicly accessible endpoint. Ngrok provides a public URL that can be used to access the local web server, which eliminates the need for a dedicated server or a domain name to test the web service. Ngrok can be downloaded for free and is available for Windows, Mac, and Linux.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;基本的にローカル環境で開発しているアプリをインターネットに公開することはできないんだよね。たとえ、グローバルipが割り当てられているマシンでも、localhost:3000とかで動いています、ってなると外部の3000にアクセスしてもだめなわけだ。
このローカルの3000をngrockっていうアプリを使って、ngrockのサーバを経由して外に見せる方法がこれなわけだね。
おそらくこれもグローバルipを外部にさらさなくても見られるようにするツールだと思うんだよね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>NodeJs最新版エンジンのインストール方法(tsはじめました)</title>
      <link>https://blog.ingenboy.com/post/ts_beginner/</link>
      <pubDate>Mon, 27 Feb 2023 15:02:16 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/ts_beginner/</guid>
      <description>&lt;h1 id=&#34;そうだtypescriptはじめよう&#34;&gt;そうだ、typescriptはじめよう&lt;/h1&gt;
&lt;p&gt;可読性、保守性を高めるためにはやっぱりnode.jsではなく、typescriptです！！どうやら、tsはa part of node.jsらしい？ (そんなことないかもです。ただ単にnpmで入れられるだけ？)です。インストールの手順、使い方、その他、重要な点をまとめます。&lt;/p&gt;
&lt;h1 id=&#34;nodejsのインストール方法&#34;&gt;node.jsのインストール方法&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/nanbuwks/items/ed8adb2d4324c939a349&#34;&gt;ref1&lt;/a&gt; を参考に最新のnode.jsをインストール出来ます。まあ、ここでもまとめておきたいと思いますが。&lt;/p&gt;
&lt;h2 id=&#34;aptでnodejsとnpmを入れる&#34;&gt;aptでnodejsとnpmを入れる&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ sudo apt update
$ sudo apt install nodejs npm
$ sudo node -v 
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;npm-install-で最新のnodejsを入れる&#34;&gt;npm install で最新のnode.jsを入れる&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;
$ sudo npm install n -g
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;古いnodejsを削除する&#34;&gt;古いnode.jsを削除する&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ sudo n stable
$ sudo apt purge -y nodejs npm
$ exec $SHELL -l
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;typescriptのインストール方法&#34;&gt;typescriptのインストール方法&lt;/h1&gt;
&lt;p&gt;上のを参考にnode.jsがインストール可能ですね。んで、typescriptはなんとnpmで入れるんですよね。これ驚き。しかし、コンパイラはちゃんとbinaryなんですよね。packageとかではなく。これ面白い。
はい、&lt;a href=&#34;https://www.tohoho-web.com/ex/typescript.html&#34;&gt;ref&lt;/a&gt;を参考にnpmからtypescriptをインストールして、コンパイラへのパスを通します。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ mkdir sample
$ cd sample
$ npm init
$ npm install typescript
$ echo export PATH=\$PATH:`pwd`/node_modules/.bin &amp;gt;&amp;gt; ~/.bashrc
$ source ~/.bashrc
$ tsc --version
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;とりあえずチュートリアルをやろう&#34;&gt;とりあえずチュートリアルをやろう&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://typescriptbook.jp/tutorials&#34;&gt;チュートリアル&lt;/a&gt;がかなり充実している。ビビるね。Reactがなぜいいのか、っていう部分も軽く書かれているから、参考にした方がいいですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments_on_how_linux_works</title>
      <link>https://blog.ingenboy.com/post/comments_on_how_linux_works/</link>
      <pubDate>Thu, 09 Feb 2023 15:31:53 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_how_linux_works/</guid>
      <description>&lt;h1 id=&#34;linuxを制すものはitを制す&#34;&gt;linuxを制すものはITを制す&lt;/h1&gt;
&lt;p&gt;とはよく言ったものだ。
&lt;!-- raw HTML omitted --&gt;
将来の夢はlinuxカーネルを理解することである自分ですが、まあ、そこへのかけ橋が必要ということで、「linuxの仕組み」を読むわけですね。裏表紙を見るだけで良本感が出ているこの本、さっそく読んでいきましょう&lt;/p&gt;
&lt;p&gt;ちなみに、筑波大学のこの人の授業もめっちゃためになります。
&lt;a href=&#34;https://www.coins.tsukuba.ac.jp/~yas/coins/os2-2011/&#34;&gt;ref&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;1章linuxの概要&#34;&gt;1章：Linuxの概要&lt;/h1&gt;
&lt;p&gt;プログラムとは何か、プロセスとは何かを簡単に説明した後、カーネルの必要性について話しています。
これはかなり重要だけど、カーネルモードとユーザモードはcpuによって提供されている機能なんですね。カーネルモードで動いているプログラムは何の制限もないのに対して、ユーザモードで動いているプログラムには特定の命令を実行できなくする等、様々な制限がかかるんですね。
で、linuxの場合は、カーネルだけがカーネルモードで動作しています。つまり、プロセスはユーザモードで動いている、ということですね。だから、プロセスはカーネルを通じてデバイスにアクセスするのですが、この時にカーネルに操作をお願いする命令のことを「システムコール」というんですね。そうなんです、システムコールです。
カーネルの助けがないと実行できない処理をカーネルにお願いするんです。具体的には、nicを介した通信とかはそうですね。あとは、デバイスへのアクセス。プロセスの生成、削除。ファイルシステム操作。メモリ確保、解法。など。
システムコールが発行されると、cpuにおいて例外というイベントが発生するんですね。で、これをきっかけにcpuのモードがユーザモードからカーネルモードに遷移します。で、システムコールが終了すると再びユーザモードに戻ってプロセスが動くって感じですね。
&lt;!-- raw HTML omitted --&gt;
で、straceコマンドってのがプログラムの中で発行されるシステムコール一覧を出してくれるんだよね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;strace python
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;だけでもシステムコールがたくさん呼び出されることからも、pythonがインタープリタ言語であることがわかると思う。
前に研究室のサーバでwコマンドがハングしてしまう問題が起こったよね。そういう時は&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;strace w
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とかってやると、wコマンド実行中のシステムコールがみられて、どこでハングしているのかとかがわかるわけですね。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;こないだ調べた時は、特定のプロセスのプロセス情報 (/proc/&amp;lt;pid&amp;gt;/cmdlineとか) を閲覧しようとするとハングしてしまっていました。strace wとかするとreadシステムコールがハングするのがわかるはず。

ただ、なぜそうなってしまうのかはわかっていません…調べるとcgroupsによるメモリ制限と関係がありそうな情報が出てきましたが、まだ調査していません。
&lt;/code&gt;&lt;/pre&gt;&lt;!-- raw HTML omitted --&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo yum install -y sysstat
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;つぎのコマンドでsysstatを起動しましょう&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo systemctl start sysstat.service 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;sarコマンドで遊びましょう。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sar -P 0 1 1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに、このコマンドの意味は、論理CPU0の(-P 0)のデータを1秒ごとに1回だけ収集しましょう。てこと。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sar -P 0 1 4
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;をやると次のような結果が出てくるよ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Linux 5.15.32-v8+ (zeta)        09/02/23        _aarch64_       (4 CPU)

16:08:49        CPU     %user     %nice   %system   %iowait    %steal     %idle
16:08:50          0      0.00      0.00      0.00      0.00      0.00    100.00
16:08:51          0      0.00      0.00      0.00      0.00      0.00    100.00
16:08:52          0      0.00      0.00      0.00      0.00      0.00    100.00
16:08:53          0      0.00      0.00      0.00      0.00      0.00    100.00
Average:          0      0.00      0.00      0.00      0.00      0.00    100.00
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この表の見方は、CPU 0がユーザモードで動作した時間の割合(%userと%nicdの和)、カーネルモードで動作した時間の割合(%system)、何もしていない時間の割合(%idle)って感じだね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>アメリカのハッカーを返り討ちにしたい</title>
      <link>https://blog.ingenboy.com/post/beat_a_hacker/</link>
      <pubDate>Wed, 25 Jan 2023 23:26:47 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/beat_a_hacker/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;世界中に自分が入れるサーバがあったほうがいろいろと便利かなと思い、ブルガリアのサーバを借りた。はいいのだが、早速ハッカーがお出ましなさった。ってことでやっつけたいと思う。&lt;/p&gt;
&lt;h1 id=&#34;ハッカーのipの特定&#34;&gt;ハッカーのIPの特定&lt;/h1&gt;
&lt;p&gt;sudo lastbでログインを試みて失敗したIPアドレスの一覧が表示可能である。
ハッカーに人権はないのでsudo lastbで侵入を試みようとしたIPの一覧をアップしておく。このサイトをご覧の皆さんにもぜひ攻撃していただきたい。正当防衛である。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;45.136.15.210
157.245.49.188
196.179.231.103
175.126.176.21
118.98.121.241
213.202.223.97
192.241.169.184
187.235.65.53
195.133.40.249
194.110.134.13
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;まずは守りを固める&#34;&gt;まずは守りを固める&lt;/h1&gt;
&lt;p&gt;sshポートを変更
/etc/ssh/sshd_config
で&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Port xxxxx
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;に変更。ufwでxxxxをallowにしてreload。これを忘れると入れなくなる。で、22をdenyしておくとさらにいいかもね。&lt;/p&gt;
&lt;p&gt;もちろん、奴らは素人なので、sshdが待ちうけるポート番号が22以外になるなんて知っている奴はいないわけで、不正アクセスが一気に減ったという話だ。ははは。ざこめ！いや、普通にポートを変えてもやってくるわ。しぶとい奴ら。&lt;/p&gt;
&lt;h1 id=&#34;nmapでポートの状況を調べる&#34;&gt;nmapでポートの状況を調べる&lt;/h1&gt;
&lt;p&gt;実際に調べたわけではありませんが。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Starting Nmap 7.80 ( https://nmap.org ) at 2023-01-25 14:48 UTC
Nmap scan report for 45.136.15.210
Host is up (0.24s latency).
Not shown: 995 closed ports
PORT     STATE    SERVICE
21/tcp   open     ftp
22/tcp   open     ssh
111/tcp  open     rpcbind
646/tcp  filtered ldp
3306/tcp open     mysql
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;ftpコマンドで以下のテキストを送る&#34;&gt;ftpコマンドで以下のテキストを送る&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Dear My friend!!

Hello! my name is kim jong un!

We&amp;#39;ve detected  cyber attacks from your computers. 

Because of that, we are considering to take legal action!!

Oyoyoyoyyoooooi!!!!!!!!!!!!!!

Unfortunately we know all about you including your name, age and address.

If you don&amp;#39;t wanna that to happen please pay 0.1 btc to the address below, within a week! HaHaHa!!!

bc1q9xezwy9z6xde3960p8fs3uxmhd3tqs6hdcc4mx


Thanks you mate!!

⠀⠀⠀⠀⠀⣀⣠⠤⠶⠶⣖⡛⠛⠿⠿⠯⠭⠍⠉⣉⠛⠚⠛⠲⣄⠀⠀⠀⠀⠀
⠀⠀⢀⡴⠋⠁⠀⡉⠁⢐⣒⠒⠈⠁⠀⠀⠀⠈⠁⢂⢅⡂⠀⠀⠘⣧⠀⠀⠀⠀
⠀⠀⣼⠀⠀⠀⠁⠀⠀⠀⠂⠀⠀⠀⠀⢀⣀⣤⣤⣄⡈⠈⠀⠀⠀⠘⣇⠀⠀⠀
⢠⡾⠡⠄⠀⠀⠾⠿⠿⣷⣦⣤⠀⠀⣾⣋⡤⠿⠿⠿⠿⠆⠠⢀⣀⡒⠼⢷⣄⠀
⣿⠊⠊⠶⠶⢦⣄⡄⠀⢀⣿⠀⠀⠀⠈⠁⠀⠀⠙⠳⠦⠶⠞⢋⣍⠉⢳⡄⠈⣧
⢹⣆⡂⢀⣿⠀⠀⡀⢴⣟⠁⠀⢀⣠⣘⢳⡖⠀⠀⣀⣠⡴⠞⠋⣽⠷⢠⠇⠀⣼
⠀⢻⡀⢸⣿⣷⢦⣄⣀⣈⣳⣆⣀⣀⣤⣭⣴⠚⠛⠉⣹⣧⡴⣾⠋⠀⠀⣘⡼⠃
⠀⢸⡇⢸⣷⣿⣤⣏⣉⣙⣏⣉⣹⣁⣀⣠⣼⣶⡾⠟⢻⣇⡼⠁⠀⠀⣰⠋⠀⠀
⠀⢸⡇⠸⣿⡿⣿⢿⡿⢿⣿⠿⠿⣿⠛⠉⠉⢧⠀⣠⡴⠋⠀⠀⠀⣠⠇⠀⠀⠀
⠀⢸⠀⠀⠹⢯⣽⣆⣷⣀⣻⣀⣀⣿⣄⣤⣴⠾⢛⡉⢄⡢⢔⣠⠞⠁⠀⠀⠀⠀
⠀⢸⠀⠀⠀⠢⣀⠀⠈⠉⠉⠉⠉⣉⣀⠠⣐⠦⠑⣊⡥⠞⠋⠀⠀⠀⠀⠀⠀⠀
⠀⢸⡀⠀⠁⠂⠀⠀⠀⠀⠀⠀⠒⠈⠁⣀⡤⠞⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠙⠶⢤⣤⣤⣤⣤⡤⠴⠖⠚⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;あらららら。FTPコマンドはどうやらログインパスワードが必要みたいだね。これじゃあハックするのは難しいな。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tor</title>
      <link>https://blog.ingenboy.com/post/tor/</link>
      <pubDate>Thu, 19 Jan 2023 09:28:53 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/tor/</guid>
      <description>&lt;h1 id=&#34;インターネット上での匿名性について&#34;&gt;インターネット上での匿名性について&lt;/h1&gt;
&lt;p&gt;確かフツーのtcp/ip通信はsource/destination
がパケットのヘッダーになっているから、サーバはクライアントが誰だか知ることができるんだよね。ヘッダーのsourceを変える方法はいくつかある。例えば、vpn。しかし、vpnはサービス提供者がパケットを全部見ることができるんだよね。んで、不正アクセスがあった時には警察側にログを提供しかねないんですよね。んで、ログから接続先が割れて逮捕されてしまうと。これを防ぐのがtorだね。
警察からの追跡は完全に逃れることができる。ただ、torノードの提供者にヤバいやつがいてパケットダンプをしているってこととかはあると思う。まあ、パケットダンプしていても暗号化されていれば大丈夫なんだけど。&lt;/p&gt;
&lt;h1 id=&#34;the-onion-router&#34;&gt;The onion router&lt;/h1&gt;
&lt;p&gt;匿名性を守るための通信手段がtor。んで、torを使ったインターネットブラウジングを可能にするのが、torブラウザ。&lt;/p&gt;
&lt;p&gt;言ってしまえばtorはvpnの上位互換だな。torネットワークに所属するtorノードの中から3つのノードをランダムに選んで、それぞれが暗号化して通信する。通信経路の各ノードは通信元ノードと通信先ノードしかわからないため、完全に秘匿性が守られる。通信元（ブラウザ）と通信先（ウェブサイト）のセットを得ることが不可能である。&lt;/p&gt;
&lt;p&gt;例えば、
browser -&amp;gt; tor1 -&amp;gt; tor2 -&amp;gt; tor3 -&amp;gt; website
でwebsiteと通信するとき、tor1はbrowserから送られていることがわかるけど、browserがどのサイトを見に行っているかはわからないようになっている。これによって完全に秘匿性が守られるわけだね。素晴らしい。まあ、通信速度はあほみたいに遅いけど。
ただ、気を付けたいのが、tor3 -&amp;gt; websiteの段階では平文が流れるわけだから、ここがhttpだと普通に見れてしまうわけですね。例えば攻撃者がtorネットワークにノードを配置するとき、そのノードがtor3になると通信が全部見られてしまうわけですね。
ちなみにtor3のことを出口ノードって言います。&lt;/p&gt;
&lt;h1 id=&#34;torを利用するときに使えるツール&#34;&gt;torを利用するときに使えるツール&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://check.torproject.org&#34;&gt;tor networkから接続いるか&lt;/a&gt;
&lt;a href=&#34;https://ipleak.net&#34;&gt;どのipから接続しているかがわかるサイト&lt;/a&gt;
&lt;a href=&#34;https://www.cman.jp/network/support/go_access.cgi&#34;&gt;上のやつの日本版(cman)&lt;/a&gt;
&lt;a href=&#34;https://fast.com&#34;&gt;torの速度をfast.comで&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;ログが取られていない秘匿性の高いvpnサービス&#34;&gt;ログが取られていない、秘匿性の高いVPNサービス&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://protonvpn.com/&#34;&gt;protonVPN&lt;/a&gt;
&lt;a href=&#34;https://www.privateinternetaccess.com/&#34;&gt;PrivateInternetAccess&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;すべての通信にtorを使うtailsというos&#34;&gt;すべての通信にtorを使うtailsというos&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://tails.boum.org/&#34;&gt;tails&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;vpn-over-tor-とtor-over-vpn&#34;&gt;vpn over tor と　tor over vpn&lt;/h1&gt;
&lt;p&gt;vpnのの先にtorがあるか、torの先にvpnがあるかのちがいで安全性は変わるのだろうか？いや変わらないな。いずれにしろvpnで秘匿化されるphaseが入るから。いやでもtor3が攻撃者である可能性も否めないので、vpn over torが一番安全なのか。これも平文が流れる場合など限定されるけど。
んで、tor over vpnは、普通にvpnを起動してからtorブラウザを使えばいいね。
vpn over torが厄介でね、まずプロトコルはopenvpnじゃないとだめっぽいですね。んで、openvpnの設定ファイルに次の行を書き込むっぽい。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;socks-proxy localhost 9050
socks-proxy-retry
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;vpn over torを使うと、マジで完全にuntracableになる(実はならない。その理由を後で書きます)。
そして、torのさきにvpnを置くことで、torからの接続をブロックしているサイトにもアクセスできるようになるんですね。すばらしい！！vpnの代わりにプロキシ―を使うこともできます。
ただ、ブラウザの通信以外もtorを通すためにはtorそのものをインストールする必要があります。
＊vpn over torでも完全匿名にならない理由。
はい、それはtorの入口ノードがどこから接続が来ているかを監視している場合がるからですね。torの入口に攻撃者がいるっていうのが一番面倒くさいです。まあ、あくまでipが割れるってだけですけど。
なんで、一番安全なのはvpn over tor over vpnって感じかな。
これは確実にuntracableになる。&lt;/p&gt;
&lt;h1 id=&#34;torと仮想通過&#34;&gt;torと仮想通過&lt;/h1&gt;
&lt;p&gt;tor、という匿名ネットワークを利用するのだから、支払いも匿名でやりたいよね？となると、暗号通過しかないわけですね。暗号通過。
&lt;a href=&#34;https://coinatmradar.com/country/107/bitcoin-atm-japan/&#34;&gt;bitcon AtM&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;torノード一覧&#34;&gt;torノード一覧&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://www.dan.me.uk/torlist/&#34;&gt;ノードリスト&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comments on super linux programing</title>
      <link>https://blog.ingenboy.com/post/comments_on_super_linux_programing/</link>
      <pubDate>Tue, 17 Jan 2023 21:49:46 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/comments_on_super_linux_programing/</guid>
      <description>&lt;h1 id=&#34;はじめに&#34;&gt;はじめに&lt;/h1&gt;
&lt;p&gt;図書館で借りた、「c言語によるスーパーlinuxプログラミング」という本の返却期限が近づいているのでさっさとまとめておきたいと思う&lt;/p&gt;
&lt;h1 id=&#34;1章c言語の位置づけ&#34;&gt;1章：c言語の位置づけ&lt;/h1&gt;
&lt;p&gt;cを勉強することでプログラムの動きをマシンレベルでイメージすることができるからいいよねと。ただし、記述は非常に具体的になる。それでは面倒なことが多いと。そういう理由から「高級言語」が開発されたと。スクリプト言語ともいう。どの言語を使うかは何を開発したいか？に依存するわけですね。システムだったらc/c++,webだったら、jsとかね。適材適所が大事ってこと。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;strace python
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;だけでもシステムコールがたくさん呼び出されることからも、pythonがインタープリタ言語であることがわかる。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;この辺の続きを詳しく知りたければ、「linuxの仕組み」という本を読むことをお勧めします。&lt;/p&gt;
&lt;h1 id=&#34;2章ubuntuの導入&#34;&gt;2章：ubuntuの導入&lt;/h1&gt;
&lt;p&gt;ubuntuはまだ一般的になっていません。と。いえ、もう一般的になっています。既知の事実がつらつらと書かれているだけですね。&lt;/p&gt;
&lt;h1 id=&#34;3章大規模プログラミングとライブラリの利用&#34;&gt;3章：大規模プログラミングとライブラリの利用&lt;/h1&gt;
&lt;p&gt;複数の開発者による並行開発を実現するには、アプリケーションの分割は必須の技術。ライブラリの利用は分割プログラミングのゴール。&lt;/p&gt;
&lt;h2 id=&#34;改めてccプログラムのビルド工程&#34;&gt;改めてc/c++プログラムのビルド工程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;プリプロセッサによるファイルのインクルードやマクロの展開(プログラム中で#でかかれている所)&lt;/li&gt;
&lt;li&gt;アセンブラへの展開とアセンブル作業によるオブジェクトコードへの変換&lt;/li&gt;
&lt;li&gt;オブジェクトファイルの結合やライブラリとのリンクを実施&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;で、コンパイルってのは「実行ファイルを作る」って意味で使われるけど、どっちかっていうと、「オブジェクトファイルを作る」って意味だな。で、ビルドが「実行ファイルを作る」だな。うん、
だから、「分割コンパイル」ってのは、どっちかというと、分割ビルド　≒　分割したファイルをコンパイルしてリンクするってかんじ。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;ライブラリの種類についてもここで説明されているので、チョットやります。&lt;/p&gt;
&lt;h2 id=&#34;ライブラリの種類とリンク&#34;&gt;ライブラリの種類とリンク&lt;/h2&gt;
&lt;p&gt;ビルド　≒　コードをコンパイルしてオブジェクトファイルの生成 + ライブラリのリンク
&lt;!-- raw HTML omitted --&gt;
なわけだけれど、ライブラリにはスタティックリンクとシェアードリンクの2種類があると。で、共有ライブラリのリンクはさらに、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;実行形式のメモリへのロード時にリンクされる、動的リンクライブラリ
&lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;必要に応じてメモリへロード、リンクされる、動的ローディング
の二つがある。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ldd ./binary
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で調べられるんですね。便利ですね。
んで、ライブラリをリンクする時ってのは、ライブラリが提供する関数を使いたいときだと思うんですけど、この、関数の仕様（インターフェース）がどうなっているか？を知る方法が、ヘッダーファイルなんですよねー。そうなんですよ、まさに。
だからヘッダーファイルには定義はかかないんですよね。引数と返り値だけなんです。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;自分で共有ライブラリを作る方法&#34;&gt;自分で共有ライブラリを作る方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;まずは、mainがない、関数だけの.cppと.hppを作る。&lt;/li&gt;
&lt;li&gt;-fPICオプションをつけてコンパイルする。この時、.oファイルができる。 e.g., mylib.o&lt;/li&gt;
&lt;li&gt;g++ -shared -o libmylib.so mylib.o でshared-libraryができる。&lt;/li&gt;
&lt;li&gt;ヘッダーファイルと作ったshared-libraryを/libにおいて完了。あとは、コンパイル時に-lmylibってつけることを忘れずに。ライブラリのリンクでよく忘れるやつね。大事だから。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;g++ -o myapp myapp.cpp -L/path/to/library -lmylib
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;でコンパイルできるよーって話ね。あと大事なの。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Slurmクラスタ構築日記</title>
      <link>https://blog.ingenboy.com/post/learn_slurm/</link>
      <pubDate>Mon, 16 Jan 2023 23:59:40 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_slurm/</guid>
      <description>&lt;h1 id=&#34;hpcといえばslurmだよね&#34;&gt;HPCといえばSlurmだよね&lt;/h1&gt;
&lt;p&gt;ラズパイが腐るほどあるので、Slurmクラスタを作る。流れとしては、Slurmの全体像を理解してから、実際にSlurmをインストールして、クラスタを構築。んで、MPIジョブを投入できたら最高ですね。&lt;/p&gt;
&lt;h1 id=&#34;参考文献&#34;&gt;参考文献&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://slurm.schedmd.com/&#34;&gt;slurm公式&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;slurmの全体像&#34;&gt;Slurmの全体像&lt;/h1&gt;
&lt;p&gt;クラスタを使って並列分散処理をしたいとき、どうするか？例えばMPIを使ってなにかを計算したいとき、どうするか?直接mpirunをすればいいよね？簡単だ。うん。ユーザがおれ一人で他の人がクラスタを使わない前提であれば直接実行していいよね。しかし、HPCシステムってのは基本的にはいろんな人に使われるんですよ。そんな時にいろんな人が同時にMPIのジョブを実行すると何が起こるか？
まあ、これは予想だけど、基本的に1つのMPIプロセスに対して1つのコアが割り当てられるので、コア数を超えるプロセスが割り当てられそうなときは、mpirunの実行が失敗すると思うんですよ。&lt;/p&gt;
&lt;p&gt;このようなリソース競合によるジョブの実行失敗などを防いだり、その他、リソースのマネジメントをするのがリソースマネジメントシステム(RMS)だよね。SlurmもRMSなわけだ。いろいろなRMSがあるわけで、その中でもSlurmの特徴が三つある。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ある一定期間、ユーザが計算資源（ノード）を占有することを許す&lt;/li&gt;
&lt;li&gt;各ノードに対して、ジョブのスタート、実行、監視を可能にする&lt;/li&gt;
&lt;li&gt;待ち行列内のpending jobに対して、恣意的な実行を可能にする&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;slurmのアーキテクチャ&#34;&gt;slurmのアーキテクチャ&lt;/h2&gt;
&lt;p&gt;各ノードでslurmdデーモンが動いている。そして、マネジメントノード（マスターノード）ではslurmctldデーモンが動いている。ユーザはクライアントアプリを使って、slurmctldにアクセスし、ジョブのサブミットや、状態の確認ができる。&lt;/p&gt;
&lt;h1 id=&#34;slurmのインストール&#34;&gt;Slurmのインストール&lt;/h1&gt;
&lt;h2 id=&#34;参考文献-1&#34;&gt;参考文献&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/evakichi/items/265c218362b200c3bc3d&#34;&gt;文献1&lt;/a&gt;
&lt;a href=&#34;https://glmdev.medium.com/building-a-raspberry-pi-cluster-784f0df9afbd&#34;&gt;文献２(一番参考になった資料)&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;前提&#34;&gt;前提&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;ノード間でuidが同じユーザが作られていること
これは、最初にラズパイの設定をするときにユーザ名を一律に決めておくことで解決できる。&lt;/li&gt;
&lt;li&gt;ノード間でシステムの時刻が一致している事
これは、raspi-configのロケール設定でAsia/Tokyoを選ぶことで解決できる&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;マスターノードのあるディレクトリをnfsとして外部にエクスポートしておくといろいろとらく&#34;&gt;マスターノードのあるディレクトリをnfsとして外部にエクスポートしておくといろいろとらく&lt;/h2&gt;
&lt;h2 id=&#34;マスターノードスレーブノードのホスト名を決めておく&#34;&gt;マスターノード、スレーブノードのホスト名を決めておく&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;マスターノードの設定&#34;&gt;マスターノードの設定&lt;/h1&gt;
&lt;h1 id=&#34;リポジトリからのインストール&#34;&gt;リポジトリからのインストール&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install slurm-wlm -y
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;slurmの設定&#34;&gt;Slurmの設定&lt;/h2&gt;
&lt;p&gt;設定ファイルの場所は&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/etc/slurm/slurm.conf
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;この場所に、デフォルトの設定ファイルを持ってくる&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cp /usr/share/doc/slurm-client/examples/slurm.conf.simple.gz .
gzip -d slurm.conf.simple.gz
mv slurm.conf.simple slurm.conf
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;設定ファイルslurmconfの内容は厳密にかかないとだめ&#34;&gt;設定ファイル(slurm.conf)の内容は厳密にかかないとだめ&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SlurmctldHost=node01(&amp;lt;ip addr of node01&amp;gt;)
# e.g.: node01(192.168.1.14)
# actual : zeta(172.20.2.1)
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SelectType=select/cons_res
SelectTypeParameters=CR_Core
...
...
ClusterName=glmdev
...
...
NodeName=zeta NodeAddr=172.20.2.1 CPUs=4 Sockets=1 CoresPerSocket=4 State=UNKNOWN
NodeName=slave1 NodeAddr=172.20.2.3 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
NodeName=slave2 NodeAddr=172.20.2.4 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
NodeName=slave3 NodeAddr=172.20.2.5 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
NodeName=slave4 NodeAddr=172.20.2.6 CPUs=4 Sockets=1 CoresPerSocket=4
State=UNKNOWN
PartitionName=mycluster Nodes=slave[1-4] Default=YES MaxTime=INFINITE
State=UP
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;cgroup関係の設定ファイルをつくる&#34;&gt;cgroup関係の設定ファイルをつくる&lt;/h2&gt;
&lt;p&gt;/etc/slurm/cgroup.confに&lt;/p&gt;</description>
    </item>
    <item>
      <title>goを学んだ</title>
      <link>https://blog.ingenboy.com/post/learn_go/</link>
      <pubDate>Sun, 01 Jan 2023 10:01:45 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_go/</guid>
      <description>&lt;h1 id=&#34;cと比較した時のgo印象を箇条書きで&#34;&gt;c++と比較した時のgo。印象を箇条書きで&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;クラスという概念がない？関数と構造体だけで頑張る感じなのか？かなりcに近い言語っていうイメージだな。構造体があれば言うてもクラス作れるからな。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;しかしソースコードを見てみると、メソッドみたいにアクセスしてるんやが？どういうことや？&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;package datastruct

import &amp;#34;fmt&amp;#34;

// Queue implementation
type Queue struct {
    data []int
    size int
}

// NewQueue instantiates a new queue
func NewQueue(cap int) *Queue {
    return &amp;amp;Queue{data: make([]int, 0, cap), size: 0}
}

// Push adds a new element at the end of the queue
func (q *Queue) Push(n int) {
    q.data = append(q.data, n)
    q.size++
}

// Pop removes the first element from queue
func (q *Queue) Pop() bool {
    if q.IsEmpty() {
        return false
    }
    q.size--
    q.data = q.data[1:]
    return true
}

// Front returns the first element of queue
func (q *Queue) Front() int {
    return q.data[0]
}

// IsEmpty checks if the queue is empty
func (q *Queue) IsEmpty() bool {
    return q.size == 0
}

// String implements Stringer interface
func (q *Queue) String() string {
    return fmt.Sprint(q.data)
}
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;import (
    &amp;#34;fmt&amp;#34;
    &amp;#34;testing&amp;#34;
)

func TestQueue(t *testing.T) {
    queue := NewQueue(10)
    fmt.Println(queue)

    if !queue.IsEmpty() {
        t.Fatalf(&amp;#34;True is expected, but %v\n&amp;#34;, queue.IsEmpty())
    }

    queue.Push(10)
    fmt.Println(queue)
    queue.Push(1)
    fmt.Println(queue)
    queue.Push(-5)
    fmt.Println(queue)

    if queue.IsEmpty() {
        t.Fatalf(&amp;#34;False is expected, but %v\n&amp;#34;, queue.IsEmpty())
    }

    if queue.Front() != 10 {
        t.Fatalf(&amp;#34;10 is expected, but %v\n&amp;#34;, queue.Front())
    }

    queue.Pop()
    fmt.Println(queue)
    if queue.Front() != 1 {
        t.Fatalf(&amp;#34;1 is expected, but %v\n&amp;#34;, queue.Front())
    }

    queue.Pop()
    fmt.Println(queue)
    if queue.Front() != -5 {
        t.Fatalf(&amp;#34;-5 is expected, but %v\n&amp;#34;, queue.Front())
    }

    queue.Pop()
    fmt.Println(queue)
    if !queue.IsEmpty() {
        t.Fatalf(&amp;#34;True is expected, but %v\n&amp;#34;, queue.IsEmpty())
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;なるほど、cっぽい感じで、構造体とそれを操作する関数に分かれているけど、関数はメソッドのように構造体に紐づく。
cでは、関数に構造体のポインタを渡さないと構造体に変更を加えることができなかったけど、goでは構造体か関数を呼び出せるやんか。んで、この構造体に紐づけられているメソッドのような関数の定義方法はgo特有の定義方法になっているって話ですよね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>k8sクラスタの環境構築</title>
      <link>https://blog.ingenboy.com/post/learn_k8s/</link>
      <pubDate>Tue, 27 Dec 2022 21:11:31 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/learn_k8s/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;k8sという技術が注目を浴びている。web業界での近年の大きな変化としてはアプリケーションアーキテクチャの変化が挙げられる。従来は、アプリケーションを構成するソフトはモノリシック(一枚板)であった。つまり、アプリケーションは、一つのソースコードで1プロセスで動いているような感じだった。しかし、このモノリシックなアーキテクチャではソースコードが複雑で、変更が加えにくい等の問題があった。チームで開発する際も、メンバーみんなが同じソースコードをつかってビルドをする必要がある等、いろいろと面倒なことが多かったと思う。そこで、近年はアプリ開発にはマイクロサービスアーキテクチャが採用されている。マイクロサービスアーキテクチャは、小さなコンポーネントの集合が全体として一つのアプリケーションを構成しているようなアーキテクチャである。&lt;/p&gt;
&lt;p&gt;自分も意図せずして、開発してきたアプリはマイクロアーキテクチャにしていたが、こちらの方が各コンポーネントの役割をきちんと明確化して進められるので、開発を分担できるのと、変更を加えるとき、役割がコンポーネントに分かれているので、各コンポーネントの中身だけを変えればよく、管理が簡単になると思われる。つまり、APIだけそろえておけば、後は中身はなんだっていいということだ。
これによって、アジャイル開発が非常に簡単になると思われる。
そして、このコンポーネントをひとつひとつをコンテナ化するってのも近年の大きな流れっぽい。そして、コンテナ化されたコンポーネント（マイクロサービス）をうまく協調させるのが
コンテナオーケストレーションツールってはなしだ。
コンポーネントを協調させる、と書いたが、具体的には(k8sの機能は非常に多いので、俺が理解できる、かつ、大事そうなものだけをピックアップする)、&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;コンテナのスケジューリング&lt;/li&gt;
&lt;li&gt;スケーリング/オートスケーリング&lt;/li&gt;
&lt;li&gt;障害時のセルフヒーリング&lt;/li&gt;
&lt;li&gt;ロードバランシング&lt;/li&gt;
&lt;li&gt;ワークロードの管理
とかがある。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一方、HPC分野でもK8Sを活用しようという試みがある。これはどういうことか？実は僕もよくわかっていません。k8sをスケジューラに使おうっていう話ぽい。そして、slurmと比較して、k8sが何なのかってのを調べてるみたいですね。
参考資料を少し上げておきます。&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.slideshare.net/pfi/kubecon-cloudnativecon-europe-2022-recap-batchhpcscheduler-kubernetes-meetup-tokyo-51-k8sjp&#34;&gt;ref1&lt;/a&gt;
&lt;a href=&#34;https://www.slideshare.net/pfi/pfnmldlkubernetes-devopsdays-tokyo-2021&#34;&gt;ref2&lt;/a&gt;
&lt;a href=&#34;https://www.slideshare.net/pfi/pfn-ml-ml-on-kubernetes-pfn-2&#34;&gt;ref3&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;これは研究室の仲間と一緒に調べていくことにして、僕は僕で、web業界で使われているk8sがどんなものなのかに焦点を合わせて勉強していきたいと思う。
そして、実際にk8s上で去年開発したアプリを動かしてみる、というのを最終目標にしたいです。せっかくあのアプリはマイクロサービスアーキテクチャになっているからね。インターフェースは全部rest化されているし。&lt;/p&gt;
&lt;h2 id=&#34;物理クラスタの構築&#34;&gt;物理クラスタの構築&lt;/h2&gt;
&lt;p&gt;実験環境はラズパイクラスタです。
まあ、自宅lan内にマスターノードを1台置いて、その下にあらたなネットワークを作って、マスターノードでnatした。
あと、サブネットワークでipを固定した。
詳しくは、別の記事に書いてあるのでそっちを見てくれるとありがたい。&lt;/p&gt;
&lt;h2 id=&#34;k8sの基本的なコンポーネント&#34;&gt;k8sの基本的なコンポーネント&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=X48VuDVv0do&#34;&gt;参考動画&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/ryu-yama/items/2e23342fd0f37e43a925&#34;&gt;基本用語説明&lt;/a&gt;
dbと連携させたjsアプリを題材に、k8sのコンポーネントを説明していくよ！&lt;/p&gt;
&lt;ol start=&#34;0&#34;&gt;
&lt;li&gt;cluster
k8sのリソースを管理する集合体のこと&lt;/li&gt;
&lt;li&gt;node
物理マシン、もしくは仮想マシンのこと。つまり、ホストのこと。
ノードには、master nodeと普通のnodeがある。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;master nodeはkubernetesを管理するため、次の管理コンポーネントを持つ&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;kube apiserver:kubernetesのAPIを公開する。kubectlからの操作を受け付ける役割。kubeletからもアクセスを受けるし、他にもいろいろなクライアントがある。これがclusterへのgatewayになる。&lt;/li&gt;
&lt;li&gt;etcd:分散kvs。クラスタのバッキングストアとして使用される。ログとかが記録されている。etcdは分散kvs、ということはetcdを何個か立てることが可能、ということでして、そうするとetcd間で内容の一貫性を保たないといけないわけですね。ということは？お？層です。分散合意アルゴリズムのraftが使われているわけですね。最高です。&lt;/li&gt;
&lt;li&gt;kube scheduler:コンテナを配置する最適なnodeを選択する。ここも研究の対象になりえるところではある。&lt;/li&gt;
&lt;li&gt;kube controller manager: リソースを制御する&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;普通のNodeはコンテナ化されたアプリケーションを実際に実行するホスト&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;pod
コンテナの集合体。PodはNodeの中で動作し、一つ以上のコンテナを持つ。
K8sにデプロイするときは、Pod単位で行う。
pod一つでなにか機能を果たす、とかそういう感じでpodにまとめるのだと思われる。
そうだね、1 application per Podというのが基本らしい。
しかし、そのアプリケーションは2つのコンテナから構成されていても問題ない。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;k8sはvirtual networkを提供。各Podはこの仮想ネットワーク上でIPアドレスを持っている。
そして、これが結構大事な概念だんだが、Podは結構簡単に死ぬ。そして、Podが死んだら、新しいPodがデプロイされるのだが、その時にIPアドレスが変わってしまうというのが不便らしい。その時に使うのがServiceらしい。&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;Container
Dockerコンテナのこと&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ReplicaSet
同一仕様のPodを複数生成する仕組み。
ReplicaSetを複数持っておくことで、一つのReplicaSetが死んでも他のReplicaSetに
処理を移すことでシステムが死んでいる時間をなくす。
後は、ロードバランスもできる。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;データベースは基本的にk8sクラスタの外で管理する。というのも、ステートを考えるのが面倒くさいかららしいです。&lt;/p&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;Service
Serviceは、Podにアクセスするための経路を定義。
PodのIPアドレスを固定できる。
外部への公開ポイントもここで設定する。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Deployment
ReplicaSetの上位リソースで、ReplicaSetを管理する。
つまり、
DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理する。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Look back 2022</title>
      <link>https://blog.ingenboy.com/post/look_back_2022/</link>
      <pubDate>Sun, 25 Dec 2022 18:30:43 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/look_back_2022/</guid>
      <description>&lt;h1 id=&#34;2022年を振り返る&#34;&gt;2022年を振り返る&lt;/h1&gt;
&lt;p&gt;競馬は結構やったね。今年は全体でプラス収支でした。天皇賞の日にwin5をあてたのがかなりでかかったですね。＋5マンくらいでしょうか？結構いい感じだと思いますけど。
本日、2022/12/25。&lt;/p&gt;
&lt;p&gt;クリスマスなんかじゃないのですよ。有馬記念なんですよ。4角でエフが3番手あたりからラストスパートをかける瞬間、鳥肌が立ちましたわ。去年のデジャブかと。結果は5着にだったけど、57キロ、半年ぶりの出走、さらに体調も万全とは言えない中でよく頑張ったと思う。来年に期待。来年こそは復活してほしい。&lt;/p&gt;
&lt;p&gt;大きな出来事としては、まあ、大学院に進学したよね。
あとは、そうね、学会で発表したりしたな。論文も書いて出したな。そして、一番行きたかった企業に内定をもらえた年でもあるな。インターンの時期からひよらずに挑戦し続けたことが功を奏したと思う。これは称賛に値する。&lt;/p&gt;
&lt;p&gt;開発関係。初めてちゃんとしたソフトを作った気がするな。フロントからバック、インフラまで全部やったのは初めてだったからね。これは嬉しかった。もちろんデータベースもいじってね。
自分が主導で開発できたのは称賛に価するね。まあ、このおかげで内定もらえたっていうのはある。開発に協力してくれた友人にも感謝。
来年はもう少しレベルの高いソフトを作りたい。なんならサービスでもいいんだよ。
サービス指向でいこう。別に、既存のサービスでもいいのだよ。大事なのはサービスの作り方を学ぶってことなのだよ。頑張ろう。&lt;/p&gt;
&lt;p&gt;研究。これに関しては完全に失速してしまっている。いや、なんというか、まあやりがいを感じないってのがあるよね。といってもあと一年だからうかうかしていられない。後ほどちゃんと目標を立てて頑張る。&lt;/p&gt;
&lt;p&gt;キョウプロ
。まあ、これは就活のために頑張ってたってのもあるけど、もう決まってしまったし、今後は趣味でやることになるけどね。でもやはりレッドコーダにはあこがれるところがあるからね。来年も頑張っていきたいと思う。&lt;/p&gt;
&lt;p&gt;ピアノ。
忙しくてってのは言い訳何だが、今年は4月にちょっと手を付けたけど、その後は全く手を付けられなかったね。これはもったいないです。頑張らないと。これも来年に持ち越し。&lt;/p&gt;
&lt;p&gt;筋トレ。
うん、体のつくりは変わってきた。自分でもいい体になってきているって実感がある。しかし、さぼってしまうことも多かった。もっと行けるだろってのが正直な感想。これも今後に期待。&lt;/p&gt;
&lt;p&gt;生活習慣。
いい時期もあったね。4月とかはマジで良かった。何でよかったのか？と今考えてみると、あの頃はネットフリックスを見ていなかったね。確かに、ネットフリックスを見ると寝るのが遅くなる。んで朝起きられないわ。これ、改善しよう。んで10月からは寒くなってやはり起きられませんね。これはどうにかしないとね。頑張って起きるしかないよ。&lt;/p&gt;
&lt;p&gt;食生活。
コンビニ飯とかは食べていない。
が、栄養のバランスが良かったかといわれると、微妙ではある。正直ね。
なにか一品ちゃんと作れるとかなりいいですね。&lt;/p&gt;
&lt;p&gt;総評。
やらないといけない最低ラインはちゃんと守れたと思う。しかし、最低限という感じだな。
自分の若さからしてもっと活動的にならないといけないとは思っている。今後に期待だな。&lt;/p&gt;
&lt;h1 id=&#34;2023年の目標&#34;&gt;2023年の目標&lt;/h1&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;水色コーダーになる。毎日ときましょうかね,また。頑張る。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;23時寝、6時起きの生活を確立する。土日に遊べるように、平日にしっかり頑張る。
ーー＞早朝バイトを始めたこと、この2頭立てがかなり聞いている。頑張りましたね。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;
&lt;p&gt;日本史データベースを完成させる。この辺はk8sクラスタとしてデプロイできるとかなりかっこいいですね！そして、それだけさらにAWSでデプロイできると完璧です。
会社のシステムも作る。データベースも、bustubを完成させた後に、MITライセンスで出せるなにかが作りたい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;国際会議で登壇したい。scかhipcがいいな。来年。頑張る。ipdpsでもいい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ピアノ。ブルグミュラーを終わらせる。結局これが現実的な目標な気がする。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;リスクとリターンを考えて、アグレッシブに行動する。
ーー＞かなりできていると思うけど、どうだろう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ソフトウェアエンジニアとしての基礎を勉強する。つまり、インターンシップに参加する。メルカリがいいです。
ーー＞infinite loopに応募しました。まあ、俺のことをとらないのはさすがにセンスがなさすぎるので大丈夫だと思いますが。
&amp;ndash;&amp;gt; 落ちました。ちょっと天狗になっていました。謙虚になろう。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;キャッシュフローマネジメント。つまり、会計も学びたいという話。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;フロントエンドとして、reactをマスターしないといけない！！まじで！！いや、これマジで。チューかここができるようになったらだいぶ強いと思う。
ーー＞reactのコンポーネントを作りまくるのがいいと思う。というのもコンポーネントって一回作ると再利用が可能になるんですよ！！再利用できるといいこといっぱいあるよね！！ってことで、はい、githubでreactのコンポーネント用のrepoを作ることをお勧めします。はい。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;kaggleも強くなりたいって話&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;株も始めようという話&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;動画編集技術も磨かないとねという話。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;正規表現を使った何かしらのソフトを作る&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&#34;目標のデッドライン&#34;&gt;目標のデッドライン&lt;/h1&gt;
&lt;h2 id=&#34;冬休み中110&#34;&gt;冬休み中(~1/10)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; セキュリティーの授業の単位をとるために行けるところまで行く。openssl。&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; Go言語を一通り(メルカリのバックエンドはGOが必須らしいので)
-&amp;gt; &lt;a href=&#34;https://www.youtube.com/watch?v=yyUHQIec83I&#34;&gt;これ&lt;/a&gt;やりました。&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; k8sの基礎を学びましょう
&lt;a href=&#34;https://www.youtube.com/watch?v=X48VuDVv0do&#34;&gt;勉強になりそうなyoutube&lt;/a&gt;
&lt;a href=&#34;https://qiita.com/reireias/items/6a78d6b8df781a76f94f&#34;&gt;実際にmicroserviceeを作る&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 早朝バイトに申し込む
&lt;a href=&#34;https://jp.indeed.com/viewjob?jk=557645f702d42d2d&amp;amp;tk=1gl4f5o0kk3ul801&amp;amp;from=serp&amp;amp;vjs=3&#34;&gt;警備のバイト&lt;/a&gt;
&lt;a href=&#34;https://jp.indeed.com/viewjob?jk=256bce92dfecc995&amp;amp;tk=1gl4g21jgk123800&amp;amp;from=serp&amp;amp;vjs=3&#34;&gt;清掃のバイト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ワークフローマネジメントについて、論文を読んでください
&lt;a href=&#34;https://eflows4hpc.eu/enabling-dynamic-and-intelligent-workflows-for-hpc-data-analytics-and-ai-convergence/&#34;&gt;eFlows4HPC&lt;/a&gt;
&lt;a href=&#34;https://works-workshop.org/&#34;&gt;works 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; windowsをバックアップする&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;達成報酬&#34;&gt;達成報酬&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; SSD(セキュリティーまで)
ー＞いらないので、電源だけにします。&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 電源(データベースまで)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;学期中&#34;&gt;学期中&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ジムの申し込みをやる
&lt;a href=&#34;https://works-workshop.org/&#34;&gt;gold&amp;rsquo;s gym&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;達成報酬-1&#34;&gt;達成報酬&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; ryzen9 16core 32threadを買う権利を得る
&amp;ndash;&amp;gt; 12core 24threadsを買いました。ryzen9 5900x.4マン弱で買えたのはでかい。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;春休み中&#34;&gt;春休み中&lt;/h2&gt;
&lt;h3 id=&#34;学期中に達成できなくて持ち越しでやらないといけないこと&#34;&gt;学期中に達成できなくて、持ち越しでやらないといけないこと&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 頑張ってセキュリティーの授業は単位を撮ろう
ーー＞無理でした。おつかれした。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CMU_db_intro_1-3</title>
      <link>https://blog.ingenboy.com/post/cmu_db_1_3/</link>
      <pubDate>Thu, 15 Dec 2022 16:59:09 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/cmu_db_1_3/</guid>
      <description>&lt;h1 id=&#34;シラバス&#34;&gt;シラバス&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://15445.courses.cs.cmu.edu/fall2022/&#34;&gt;授業ページ&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;第一回&#34;&gt;第一回&lt;/h1&gt;
&lt;p&gt;もっとも簡単なデータベースとして、pythonを使って
CSVファイルでデータを保存する方法が紹介されていた。
しかし、もちろんこれではだめである。&lt;/p&gt;
&lt;p&gt;問題点&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;データ整合の問題（data integrity)&lt;/li&gt;
&lt;li&gt;実装の問題(implementation)&lt;/li&gt;
&lt;li&gt;耐久性の問題(durability)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;-&amp;gt; これらの問題を解決するためにDBMSを使う&lt;/p&gt;
&lt;p&gt;その他、データベースの歴史などつまらない話。edgar coddさんの名前は覚えておいた方がいいかも。IBMの研究者で1970年にRDBの理論を書いた論文を発表した。これは覚えておく価値がある。&lt;/p&gt;
&lt;p&gt;結論としては、データを使う側としては、データがどうやって管理されるかは興味がない。きれいなインターフェースだけ提供してほしいと。なのでデータベースを作ろうという話。&lt;/p&gt;
&lt;h1 id=&#34;第二回&#34;&gt;第二回&lt;/h1&gt;
&lt;p&gt;relationlan languagesには、&lt;/p&gt;
&lt;p&gt;DML
DDL
DCL
があるってはなし。
全体的に、SQLの文法を学んだって感じ。
結構難しいものまで扱っているんですよね。&lt;/p&gt;
&lt;h2 id=&#34;aggregates&#34;&gt;aggregates&lt;/h2&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;avg(col)
min(col)
max(col)
count(col)
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;string-operation&#34;&gt;String operation&lt;/h2&gt;
&lt;h3 id=&#34;pattern-matcing&#34;&gt;Pattern Matcing&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;% : matchies any substrings&lt;/li&gt;
&lt;li&gt;_ : matchies any one character&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;string-functions&#34;&gt;String functions&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;SUBSTRING(S,B,E)&lt;/li&gt;
&lt;li&gt;UPPER(S)
とかね。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;concatination&#34;&gt;Concatination&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;||でつなげることができるらしいです。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;date-and-time&#34;&gt;Date and Time&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;DATE,TIME型がああるよって話ですね。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;output-redirection&#34;&gt;Output Redirection&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;クエリが返す結果を別のテーブルに保存することができる。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SELECT cid INTO CoutseIds FROM enrolled;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;て感じで&lt;/p&gt;
&lt;h3 id=&#34;output-control&#34;&gt;Output Control&lt;/h3&gt;
&lt;p&gt;結果を整形することができるって話。昇順に並べたり、降順に並べたり、どのカラムで並べるかを決定したり、何個出力させるかを決定したり、って感じや。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;SELECT sid,grade FROM enrolled WHERE cid = &amp;#39;15-721&amp;#39;
ORDER BY grade LIMIT 10;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;的な感じですね。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tidbによる同一データベース内におけるトランザクションクエリと解析クエリの共存</title>
      <link>https://blog.ingenboy.com/post/tidb/</link>
      <pubDate>Mon, 12 Dec 2022 14:18:37 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/tidb/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;HTAPワークロード向けのデータベースとしてcockroach dbが有名。最近新たにtidbというのが台頭してきた。
個人的にOLAPとOLTPの両方のワークロードを効率よく捌くことに興味があるのでいろいろと調べてみる。&lt;/p&gt;
&lt;h1 id=&#34;データベースの基本をまとめる&#34;&gt;データベースの基本をまとめる&lt;/h1&gt;
&lt;h2 id=&#34;データベースの基本用語説明&#34;&gt;データベースの基本用語説明&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;トランザクション
一連の処理をまとめたもの。一連の処理単位でコミット（確定）もしくはロールバック（破棄）する。この、一連の処理単位でコミットするかしないかを決めるのが大事。例えば、次のような処理を考える。
トランザクション開始ー＞在庫テーブルで保持している商品の在庫を減らす　ー＞　注文テーブルに購入者情報を登録　ー＞　トランザクション終了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ここで、ステップ2で在庫テーブルで保持している商品の在庫を減らした後、ステップ3でエラーが発生したとする。
この時、この一連の処理がトランザクション処理として扱われている場合は、エラー発生後、処理開始前までロールバックすることが可能である。
しかし、トランザクション処理がない場合は、ステップ2だけが実行され、一貫性のないデータになってしまう。こういったことを防ぐために「トランザクション処理」が必要となる。&lt;/p&gt;
&lt;p&gt;Mysqlで実際にトランザクションを実行するためのSQLを下に示す。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysql&amp;gt; BEGIN;
Query OK, 0 rows affected (0.01 sec)

mysql&amp;gt; UPDATE `users` SET `name` = &amp;#34;xxx&amp;#34; WHERE `id` = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql&amp;gt; ROLLBACK;
Query OK, 0 rows affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Beginでトランザクションが始まる。最後にROLLBACKしているからこれは破棄される。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;mysql&amp;gt; BEGIN;
Query OK, 0 rows affected (0.00 sec)

mysql&amp;gt; UPDATE `users` SET `name` = &amp;#34;xxx&amp;#34; WHERE `id` = 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql&amp;gt; COMMIT;
Query OK, 0 rows affected (0.00 sec)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは最後にCOMMITされているので変更が永続化されるわけですね。
ちなみに、BEGINの代わりにSTART TRANSACTIONで初めてもいいです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>カーネギーメロン大学のデータベースの授業、を受けるきっかけとなった出来事</title>
      <link>https://blog.ingenboy.com/post/cmu_db_lecture/</link>
      <pubDate>Sun, 11 Dec 2022 21:27:38 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/cmu_db_lecture/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;先日参加したPDCATのポスターセッションでデータベースについて研究している学生がいた。自分とおなじM1の学生。研究内容は、マルチスレッドを使ったトランザクション処理の高速化について。最近はsiloっていう実装がよく使われているらしい。&lt;a href=&#34;https://qiita.com/kumagi/items/af6bed1424367927fb4a&#34;&gt;ここ&lt;/a&gt;にかなり詳しく書かれている。どっかで聞いたことある話だと思って記憶を探っていたところ、夏に応募して落ちたある企業のインターンの内容とすごく似ていると思い出した。彼に、そのインターンで作っているデータベースエンジンについて知っているか尋ねてみたら、なんとそのチームでインターンをしているとのこと。
私の代わりに合格したのは君だったか。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;その学生にどうやってデータベースを勉強したのかを尋ねてみた。そして有益な情報をたくさん得ることができた。データベースには「ヨット本」という聖書があるらしい。さらに、カーネギーメロン大学のデータベースの授業はすべてyoutubeで見ることができるらしい。(カーネギーメロン大学はデータベースの研究で有名らしい)よくあるような、データベースを使う側からみた授業（うちの大学でもあったタイプの授業）ではなく、完全にデータベースのシステム側、実装側の授業。最終課題では自分でデータベースエンジンを実装するらしい。ちなみにその学生は実際に自分でデータベースエンジンを実装して、それをポートフォリオにインターンに受かったらしい。まずはオーソドックスな2-phase-lockのデータベースを実装するのがいい、というアドバイスをもらったのだけど、そもそもtwo-phase-lockがなにかもわからないわけでね…ということでカーネギーメロン大学の授業を受けようって話だ。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/%E8%A9%B3%E8%AA%AC-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9-%E2%80%95%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3%E3%81%A8%E5%88%86%E6%95%A3%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-Alex-Petrov/dp/4873119545&#34;&gt;詳細データベース。ストレージエンジンと分散データシステムの仕組み&lt;/a&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;a href=&#34;https://www.amazon.co.jp/Cassandra-Definitive-Guide-Distributed-Scale/dp/1098115163/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&amp;amp;crid=3962J7JAIOJWB&amp;amp;keywords=cassandra+guide&amp;amp;qid=1678434028&amp;amp;s=books&amp;amp;sprefix=cassandra+guid%2Cstripbooks%2C177&amp;amp;sr=1-1&#34;&gt;cassandra defenitive guide&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=uikbtpVZS2s&amp;amp;list=PLSE8ODhjZXjaKScG3l0nuOiDTTqpfnWFf&#34;&gt;CMU Intro to Database systems&lt;/a&gt;&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;&lt;a href=&#34;https://www.youtube.com/watch?v=LWS8LEQAUVc&amp;amp;list=PLSE8ODhjZXjYzlLMbX3cR0sxWnRM7CLFn&#34;&gt;CMU Advanced Databases&lt;/a&gt;
By Andy Pavlo。上のIntroductionが終わったらこっちをやってもついていけるだろう。&lt;/p&gt;</description>
    </item>
    <item>
      <title>ラズパイでルータを作る (ラズパイでhadoopクラスタを構築するための準備)</title>
      <link>https://blog.ingenboy.com/post/make_hadoop_cluster/</link>
      <pubDate>Sat, 10 Dec 2022 18:20:21 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/make_hadoop_cluster/</guid>
      <description>&lt;h1 id=&#34;ことはじめ&#34;&gt;ことはじめ&lt;/h1&gt;
&lt;p&gt;HPCの研究室に所属している割にはHPCっぽいことができていなくて不満なので、自分でHPCぽいことをやることにした。自分のいう「HPCぽさ」ってのは、大規模なデータ分析とか難しい処理を複数ノードを使って効率よくやることとか、まあとりあえずクラスタが好きなんすよ。&lt;/p&gt;
&lt;p&gt;ってことでとりあえず手始めにラズパイでHadoopクラスタを構築する。その後kubernetesクラスタや、slurmクラスタも試してみる。
やることは全部で5つある。3つめと4つ目ははHadoopクラスタの構築のためではなく、MPIを使った実行も可能にするためである。勉強にはなる。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1. ラズパイのルータ化
2. クラスタネットワークに属しているノードのIPアドレスを固定
3. ノード間をシームレスで移動できるようにkeychain loginを追加
4. nfsを使ってノード間で共有ディレクトリを作る
5. hadoopの導入
&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&#34;ラズパイのルータ化やることその１&#34;&gt;ラズパイのルータ化（やることその１）&lt;/h1&gt;
&lt;p&gt;大元のLanにはsoftbankのルータを使っているが、このネットワークにラズパイクラスタを置きたくない。なので、ラズパイ一台をルータ兼マスターノードにして新しいネットワーク(172.20.2.0/24)を構築する。&lt;/p&gt;
&lt;h1 id=&#34;ネットワークの構成&#34;&gt;ネットワークの構成&lt;/h1&gt;
&lt;p&gt;192.168.3.0/24がメインのネットワークで、この中にルータ兼マスターノードをつくる。マスターノードは２つのnicを持つが、
192.168.3.0/24側は、192.168.3.4
新しいネットワーク側(172.20.2.0/24)は172.20.2.1。
そして172.20.2.0/24の中にラズパイクラスタをいっぱい配置する。&lt;/p&gt;
&lt;h1 id=&#34;必要な道具&#34;&gt;必要な道具&lt;/h1&gt;
&lt;p&gt;ラズパイはether net ポートが１つしかない。そのためラズパイで外部からアクセス可能なLanを作るためにはもう一つ物理的なLanポートが必要になる。これには usb -&amp;gt; ether net変換アダプタを使う。
ifconfigの結果は次のような感じになる。
eth0がもとからついているポートでeth1が追加されたやつ。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;eth0: flags=4163&amp;lt;UP,BROADCAST,RUNNING,MULTICAST&amp;gt;  mtu 1500
        inet 192.168.3.4  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 fe80::dea6:32ff:fefa:54df  prefixlen 64  scopeid 0x20&amp;lt;link&amp;gt;
        inet6 2400:2413:121:fd00:dea6:32ff:fefa:54df  prefixlen 64  scopeid 0x0&amp;lt;global&amp;gt;
        ether dc:a6:32:fa:54:df  txqueuelen 1000  (Ethernet)
        RX packets 841  bytes 96345 (96.3 KB)
        RX errors 0  dropped 281  overruns 0  frame 0
        TX packets 472  bytes 90115 (90.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4098&amp;lt;BROADCAST,MULTICAST&amp;gt;  mtu 1500
        ether 18:c2:bf:e9:3b:8d  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;eth0がメインネットワーク側。eth1がクラスタネットワーク側。以下、新しいネットワークを作るための設定&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vnc</title>
      <link>https://blog.ingenboy.com/post/vnc/</link>
      <pubDate>Fri, 04 Nov 2022 17:24:42 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/vnc/</guid>
      <description>自宅のデスクトップにVNCを入れたのでそのメモ</description>
    </item>
    <item>
      <title>singualrityとかcudaとかnvidia-driverとかその辺で問題が起こったのでまとめておく</title>
      <link>https://blog.ingenboy.com/post/cuda_singularity/</link>
      <pubDate>Sat, 15 Oct 2022 21:58:55 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/cuda_singularity/</guid>
      <description>&lt;h1 id=&#34;cuda&#34;&gt;cuda&lt;/h1&gt;
&lt;p&gt;nvidia社のGPUを使ってプログラムを書きたいときはCUDAというソフトウェア実行環境を使わないといけない。
cudaの中には、cudaプログラム用のコンパイラー(nvcc)とか、その他ライブラリ、APIも入っている。pythonのtensorflowやpytorchも内部的にはcudaの
ライブラリを使っている。そのため、pythonでtensorflowを使う時、cudaのインストールが必要となる。&lt;/p&gt;
&lt;h1 id=&#34;cudnn&#34;&gt;cuDNN&lt;/h1&gt;
&lt;p&gt;実はcuda以外にもtensorflowを実行するときに必要なライブラリがあって、それがcuDNN.
cudaはgpuを使ったプログラミング全般に関する実行環境である。そのため、デフォルトでDL用のライブラリは入っていない。cuDNNはcudaで書かれたDL用のライブラリである。cuDNNを入れることでGPUで簡単にDLが可能となる。その辺分けるのめんどいから統合してほしいだけども。&lt;/p&gt;
&lt;h1 id=&#34;nvidia-driver&#34;&gt;nvidia-driver&lt;/h1&gt;
&lt;p&gt;GPUのドライバ。ドライバはハードウェアとのやり取りをするソフト。&lt;/p&gt;
&lt;h1 id=&#34;singularity&#34;&gt;singularity&lt;/h1&gt;
&lt;p&gt;コンテナ型仮想環境。
仮想化してくれる範囲だけど、カーネル以外は全部仮想化してくれる。
つまり、ハードに直接干渉しないソフトであれば、全部singularity内で管理してOKってこと。&lt;/p&gt;
&lt;h1 id=&#34;singularity上でtensorflowを使ってdlをする方法&#34;&gt;singularity上でtensorflowを使ってDLをする方法&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;互換性の確認
上で説明したcuda,cuDNN,nvidia-driverは全部互換性がある。その確認を最初にやるべき。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nvidia-driverのインストール
ubuntuだったら、&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install nvidia-driver-450
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とかでインストールできる。&lt;/p&gt;
&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;singularityコマンドでdocker hubからtensorflowの最新イメージを持ってくる。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo singularity build tensorflow.sif docker://tensorflow/tensorflow:latest-gpu-jupyter
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;コマンドでdockerからコンテナイメージを持ってきてsifファイルをビルドしてくれる。docker-&amp;gt;singualrityへの変換は勝手にやってくれる。
ちなみに、jupyterも入っている。singularityには二つのコンテナ型仮想環境が用意されている。sifとsandbox. sifはあとから、apt-get install 等で
新しくファイルをインストールすることが不可能なので、一番最初のビルドの時に必要なソフトすべてをインストールしておく必要がある。
&lt;!-- raw HTML omitted --&gt;
一方,sandboxは環境の変更が可能だが、gpuが使えない。基本的にgpu目的で使っているのでsandboxを使うことなはいかな。
持ってきたコンテナイメージにはcudaが入っている。cuDNNは見つけられないけど、入っているのかな？
ドライバーは物理環境のドライバーを共有する。&lt;/p&gt;
&lt;h1 id=&#34;今回起こっている問題&#34;&gt;今回起こっている問題&lt;/h1&gt;
&lt;p&gt;singularity上でtensorflowを使って学習しているのだが、以下のエラーがでてGPUを使った学習がされない。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;2022-10-15 18:03:49.665516: E tensorflow/stream_executor/cuda/cuda_driver.cc:265] failed call to cuInit: UNKNOWN ERROR (34)
2022-10-15 18:03:49.665581: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: hoge
2022-10-15 18:03:49.665602: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: hoge
2022-10-15 18:03:49.665709: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:200] libcuda reported version is: NOT_FOUND: was unable to find libcuda.so DSO loaded into this program
2022-10-15 18:03:49.665746: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:204] kernel reported version is: 520.61.5
2022-10-15 18:03:49.665954: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これについて、物理環境のnvidia-driverはバージョン520。一方、dockerハブから持ってきた最新のイメージに入っているcudaのバージョンが11-2。
&lt;del&gt;nvidia-driver-520はcuda11-8しかサポートしていないとのこと。つまり、not compatibleだね。&lt;/del&gt;
これは間違いです。nvidia-driverは後方互換性があり、基本的に古いcudaのversionは全部サポートしています。&lt;/p&gt;</description>
    </item>
    <item>
      <title>暗号理論(授業)とOpenssl</title>
      <link>https://blog.ingenboy.com/post/openssl/</link>
      <pubDate>Thu, 06 Oct 2022 17:49:42 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/openssl/</guid>
      <description>授業で暗号をやっているのでそのまとめ。あと、関連する実用的なトピック</description>
    </item>
    <item>
      <title>Open VPNがつながらなくなった話。</title>
      <link>https://blog.ingenboy.com/post/openvpn_setting/</link>
      <pubDate>Tue, 27 Sep 2022 15:39:11 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/openvpn_setting/</guid>
      <description>&lt;h1 id=&#34;openvpnが急につながらなくなった話&#34;&gt;openVPNが急につながらなくなった話。&lt;/h1&gt;
&lt;p&gt;自宅外から自宅内のサーバにアクセスする際の手段としてsshとvpnがあるが、最近はvpnで自宅ネットワークに入ることがおおい。というのも自宅にあるサーバで構築されたシステムの開発をする際、同じネットワーク内にいたほうがいろいろと作業がしやすいためである。&lt;/p&gt;
&lt;p&gt;vpnサーバの構築にはopenVPNを使っているが、そんなopenVPNが今朝からつながらなくなった。&lt;/p&gt;
&lt;p&gt;/etc/var/openvpn.logを見てみると以下のエラーが。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Tue Sep 27 15:36:24 2022 130.xx.xxx.xxx:61548 VERIFY ERROR: depth=0, error=CRL has expired: CN=hogehoge.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;error=CRL has expiredとのこと。&lt;/p&gt;
&lt;p&gt;実はこれでつながらなくなるのが3回目である。まあ、証明書の有効期限が切れたということなので、証明書を再発行することになる。
その手順を改めてまとめる。&lt;/p&gt;
&lt;h1 id=&#34;そもそもどうやってopenvpnサーバを立てるか&#34;&gt;そもそもどうやってopenVPNサーバを立てるか&lt;/h1&gt;
&lt;p&gt;&lt;a href=&#34;https://qiita.com/noraworld/items/2fe6be489e1d93c748b8&#34;&gt;このサイト&lt;/a&gt;を参考にVPNサーバを構築する。
一応、流れを説明する。&lt;/p&gt;
&lt;h2 id=&#34;必要なソフトのインストール&#34;&gt;必要なソフトのインストール&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;OpenVPNのインストール&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo apt install openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;Easy RSAのダウンロード&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;git clone https://github.com/OpenVPN/easy-rsa.git
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;認証鍵の生成&#34;&gt;認証鍵の生成&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Easy RSAディレクトリへ移動&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;cd ./easy-rsa/easyrsa3
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;初期設定&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt; ./easyrsa init-pki
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以下のように表示されればOK&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: path/to/easy-rsa/easyrsa3/pki
&lt;/code&gt;&lt;/pre&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;CA証明書の生成&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-ca
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;パスフレーズを聞かれるので、パスフレーズを入力。再入力を要求されるので入力する。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo cp pki/ca.crt /etc/openvpn
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;で生成された鍵を/etc/openvpnにコピー。&lt;/p&gt;
&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;サーバ証明書の生成&lt;/li&gt;
&lt;/ol&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./easyrsa build-server-full server nopass
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;パスフレーズは3で入力したものと同じものを入力。
生成された鍵を/etc/openvpnにコピー&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo server起動コマンドのメモ</title>
      <link>https://blog.ingenboy.com/post/how_to_start_hugo/</link>
      <pubDate>Thu, 25 Aug 2022 15:57:03 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/how_to_start_hugo/</guid>
      <description>&lt;h1 id=&#34;hugoを使って本ブログを起動する方法を忘れるのでメモ&#34;&gt;hugoを使って本ブログを起動する方法を忘れるのでメモ&lt;/h1&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;go to /hugo_site/msdos_like
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo hugo server -p 443 --bind=&amp;#34;0.0.0.0&amp;#34; --baseURL=https://ingenboy.com/alpha/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;フロントではnginxがプロキシサーバの役割を果たしてくれていて、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;https://ingenboy.com/alpha
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;に届いたリクエストを、LANの&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;http//192.168.3.20/alpha
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;に転送する。&lt;/p&gt;
&lt;h1 id=&#34;注意点&#34;&gt;注意点&lt;/h1&gt;
&lt;p&gt;content/data
には、
YAML、JSON、TOML、CSV
をおく。ダウンロード用のファイルは別の場所に置く。&lt;/p&gt;
&lt;p&gt;どこにおくか？というと、staticですね。ここに入れておくようにしてください。よろしくおねがいします！！&lt;/p&gt;</description>
    </item>
    <item>
      <title>ルーム型オンラインマルチプレイヤーゲームの作り方</title>
      <link>https://blog.ingenboy.com/post/room_based_multiplayer_game/</link>
      <pubDate>Wed, 17 Aug 2022 17:46:25 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/room_based_multiplayer_game/</guid>
      <description>&lt;h2 id=&#34;ルーム型オンラインゲームの作り方&#34;&gt;ルーム型オンラインゲームの作り方&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/martin-ray/La-Keiba&#34;&gt;La-keiba&lt;/a&gt;のAgentとバックエンドの通信には&lt;strong&gt;python&lt;/strong&gt;の&lt;strong&gt;websocket&lt;/strong&gt;を使うことになっている。なぜ&lt;strong&gt;python&lt;/strong&gt;かというと、AgentはpythonのLightGBMを使ってトレーニングされた勝ち馬予測モデルを使っているから。となると、python以外に使える物はなく、仕方なくpythonを使うことにした。あと、プロセス間の通信にはhttp通信を使ってもいいんだけど、httpは一回きりの通信だし、モジュール間で双方向通信が必要なことが後々生じることもあるだろうと思いWebsocketを使うことにした。大(websocket)は小(htt)を兼ねるともいうし。(しかし、websocketの方がhttpよりオーバヘッドが大きいのも確か）
websocketでも普通にJSONが扱える。&lt;/p&gt;
&lt;p&gt;pythonを使ったwebsocket通信をするために、&lt;a href=&#34;https://websockets.readthedocs.io/en/stable/index.html&#34;&gt;このサイト&lt;/a&gt;で勉強したのだが、これがかなり優秀だった。今まで手探りでやっていた、websocketを使ったルームベースのアプリ（ルーム型チャット等）のフレームに対する最適解を提示してくれるものとなった。このルームベースアプリケーションのフレームは様々なアプリに適応できる。ぱっと思いつくものでいうと、将棋とか、一対一で行われるゲームはそうだし、一対一ではなくとも、ルームという概念が存在するゲーム（ないしはアプリ）にはこれが適応可能である。BFだって通信に使っているプロトコルはおそらく独自の高速プロトコルだけど、全体で見た時のフレームはこれと同じだと思う。まあ、ルームを一つの物理サーバに複数立てるのではなく、1サーバに対し1ルームという感じではあると思うが。&lt;/p&gt;
&lt;p&gt;チュートリアルでは、まるばつゲームの拡張版である&lt;strong&gt;connect4&lt;/strong&gt;というゲームを扱った。ポイントだと思う点を以下にまとめる。&lt;/p&gt;
&lt;h4 id=&#34;ゲームそのものを管理するゲームエンジンの存在&#34;&gt;ゲームそのものを管理するゲームエンジンの存在&lt;/h4&gt;
&lt;p&gt;オブジェクト指向の真骨頂がここで使えるわけです。「ゲーム」をオブジェクトとみなして、ゲームとインタラクションする手段として、ゲームオブジェクトがメソッドを提供する。メソッドはコントローラみたいなものだね。内部の状態もゲームオブジェクトは保持する。&lt;/p&gt;
&lt;h4 id=&#34;ルームオブジェクト&#34;&gt;ルームオブジェクト&lt;/h4&gt;
&lt;p&gt;そして、特定のゲームオブジェクトと、そのゲームをコントロールする権利を持つwebsocketをまとめて保持するオブジェクト（以下、ルームオブジェクト）を作り、このルームオブジェクトにidをつける。c++でもそうだったけど、websocketオブジェクトは、sendメソッドを介していつでもフロントエンドにメッセージを送れる仕様になっている。つまり、フロントエンド間（2ユーザ間）でメッセージをやり取りするには、ルームオブジェクトでそのルームに所属するwebsocketを論理的に管理し、到着したメッセージをルームに所属するwebsocketオブジェクトに返せればよい、ということになる。&lt;/p&gt;
&lt;h4 id=&#34;jsonでメッセージのやり取り&#34;&gt;JSONでメッセージのやり取り&lt;/h4&gt;
&lt;p&gt;jsonメッセージの一番最初には、メッセージの種類を表す、typeを
持ってきます。そのあとは、typeに即したメッセージのやり取りをするわけですね。これがアプリケーション層でのメッセージプロトコルですね。
前に実装した独自の通信プロトコルでもそうだったけど、やはり、やり取りするメッセージの一番最初にはメッセージのタイプを持ってくるのが普通みたいですね。&lt;/p&gt;
&lt;p&gt;タイプには例えば、initや、join、watch,playがある。initは最初にやりとりするメッセージのことでしょう。joinは、そのルームへのjoin。watchは、そのルームの観戦。playはプレイヤーの動きが入っています。typeでplayが来たら、内容に合わせてゲームオブジェクトにメッセージを送ります。
pythonのwebsocketには、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;websocket.wait_closed()
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;という、そのフロントエンドから送られてくる通信はreceiveしないけど、サーバ側からは送れる、っていう便利なメソッドがあります。これを使うことで、そのwebsocketセッションを傍観者にすることが可能です。観戦だけできるようにするってことですね。
c++にはおそらくこれがないんだけど、websocketを継承して、新しいmywebsocketクラスを作り、その中でis_player変数とかを作ることで、傍観者かそうでないか、を見分けることもできますね。これはなかなかに便利だと思います。&lt;/p&gt;
&lt;h4 id=&#34;フロントエンドjavascriptの処理&#34;&gt;フロントエンド（javascript）の処理&lt;/h4&gt;
&lt;p&gt;javascriptはすでにイベントドリブンな仕様になっている。よって、イベントを登録するだけでよい。メッセージを受信した時の動作を規定する関数と、メッセージを送信した時の動作を規定する関数を作る。関数の引数にはwebsocketオブジェクトを渡しておく。その中で、websocket.addEventlistner()をする。&lt;/p&gt;
&lt;h4 id=&#34;便利だと思った機能&#34;&gt;便利だと思った機能&lt;/h4&gt;
&lt;p&gt;便利だと思ったメソッドは、replayメソッドだね。gameオブジェクトでは、過去のムーブをすべてレコードしてある。そのレコードをひとつづつ送れば、すべて再現できるようになっている。
これは、例えば途中から入ってきた観客にこれを使って得られるメッセージを送る、といった用途で使える。&lt;/p&gt;
&lt;h2 id=&#34;websocketとhttpの使い分けについて&#34;&gt;websocketとhttpの使い分けについて&lt;/h2&gt;
&lt;p&gt;Websocketとhttpどっちがいいとかはなくて、それぞれ適切な用途があります。
httpは一回きりのステートレスな通信をするためのプロトコル。しかし、webアプリではhttpで通信をするけど、誰が通信してきているかを管理したいことがある。そこで、Cookieを使って&lt;strong&gt;セッション&lt;/strong&gt;を管理する。
http+Cookie = ステートフルになる。なのでhttpのセッション管理が必要なのは、フロントエンドからアプリを使いたいユーザだけ。
そして、httpはバックエンドのモジュール間の通信にも普通に使える。リクエストにJSONをのっけてpostしたり、url自体にpostする内容をのっけたりすることもできる。(RESTful)。モジュール間での通信がセッションを必要としない一度きりのもであればhttpを使えばいいし、そうでない場合はwebsocketを使えばいい。ブラウザでのゲームはステートを保持しないといけない、かつサーバからブラウザに通信が来ることがあるからhttpでは対応できなくて、Websockeを使わないといけない。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Db_lecture</title>
      <link>https://blog.ingenboy.com/post/db_lecture/</link>
      <pubDate>Wed, 17 Aug 2022 11:41:01 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/db_lecture/</guid>
      <description>&lt;h2 id=&#34;日常的にdb触ってないとすぐ忘れてしまう件&#34;&gt;日常的にDB触ってないとすぐ忘れてしまう件&lt;/h2&gt;
&lt;p&gt;去年の暮れか今年の初めに、DBについて一通り勉強はした。が、もう忘れてしまった。ので、もう一度勉強するか―って感じでございます。
勉強するのに使う教材は以下のyoutubeである。前回もこれを使って学んだが、今回もこれを使いたいと思う。注意点としては、このlectureは
データベース理論の説明に終始していて、具体的なSQLコマンドについてはまったく触れていない点。しかし、理論についてはめちゃめちゃわかりやすく説明してくれていたと記憶している。今回は講義の内容を、この記事にまとめていきたいと思う。&lt;/p&gt;
&lt;div style=&#34;position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;&#34;&gt;
      &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/ztHopE5Wnpc?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;
    &lt;/div&gt;

&lt;h2 id=&#34;データベースの基本&#34;&gt;データベースの基本&lt;/h2&gt;
&lt;h4 id=&#34;データベースとは&#34;&gt;データベースとは&lt;/h4&gt;
&lt;p&gt;データの集合&lt;/p&gt;
&lt;h4 id=&#34;relational-database-とは&#34;&gt;relational database とは&lt;/h4&gt;
&lt;p&gt;データを2次元の表で管理するデータベースのこと。
エンティティとは、データを保持する実体。属性(attirbute) とは、エンティティが持つ実際のデータ。
例えば、「田中」というエンティティがあるとする。この田中は、年齢：24歳、名前：田中、性別：男、である。この時、「田中」というエンティティは24歳、田中、男、という属性を持つ。Relational Databaseでは、「属性」を列にして、各行を一つのエンティティにしてデータを保存する。また、エンティティは具体的な実体だが、それを抽象化した型のことをエンティティタイプという。同じく、属性もあるエンティティに対する具体的なデータだったが、これを抽象化した肩を属性タイプという。つまり、「田中」というエンティティは「人間」というエンティティタイプに属し、「人間」というエンティティタイプには「年齢」、「名前」、「性別」の属性タイプがある。
そして、relatinal databaseでは、「エンティティタイプ」をテーブルの名前に、「属性タイプ」をカラムにして管理する。
が、実際は、Entityのことをテーブルと呼ぶ。Entity Relation図も同じだよね。&lt;/p&gt;
&lt;h4 id=&#34;dbmsとは&#34;&gt;DBMSとは&lt;/h4&gt;
&lt;p&gt;データベースを管理するソフトウェアのこと(e.g., Mysql, Mariadb)。
データベースの操作には、queryというものを発行して、データベースに仕事を依頼する。
DBMSによってデータの扱いが非常にらくになる。例えば、ユーザテーブルで、2年以上ログインがないユーザを削除する場合、DBMSを使えば、queryによって簡単に変更を加えることが可能となる。
まあ、実際にはデータベースとDBMSの違いを意識する人は専門家くらいで、使う側はほぼ同じものだと思ってもいいよ。&lt;/p&gt;
&lt;h4 id=&#34;sqlとは&#34;&gt;SQLとは&lt;/h4&gt;
&lt;p&gt;SQLとはデータベースとやり取りをするときに使われる言語のこと。特定のDBMSに使われる言語の事ではなく、もっと一般的な概念である。SQLでやることは大きく分けて二つである。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;データベースの定義 database definition language (ddl)&lt;/li&gt;
&lt;li&gt;データベースの操作 datatabase manipulation language (dml)
JOINがすごく大事なSQLである。なぜなら、DBMSではデータを様々なテーブルに分けて管理し、分散されたデータを一つにまとめるときにJOINを使うからである。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;naming-convention名前の付け方&#34;&gt;naming convention(名前の付け方)&lt;/h4&gt;
&lt;p&gt;SQLは大文字で書く。e.g,SELECT, JOIN, INSERT,
データ自体は、小文字で書く。　user_id&lt;/p&gt;</description>
    </item>
    <item>
      <title>パーティションとファイルシステムについて簡単にまとめた</title>
      <link>https://blog.ingenboy.com/post/partition/</link>
      <pubDate>Fri, 12 Aug 2022 01:41:26 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/partition/</guid>
      <description>&lt;h2 id=&#34;パーティションとは&#34;&gt;パーティションとは&lt;/h2&gt;
&lt;p&gt;ディスクに作られた論理的な仕切りのこと。OSはディスク単位、およびパーティション単位でディスクを認識する。まず気をつけたいのがパーティション＝ファイルシステムではないということ。パーティションは、文字通り物理的なディスク上に作られた論理的な仕切り。そして、ファイルシステムはパーティションごとに作られ、OSに認識される。さらに、ファイルシステムっていうのは、データの置き場所だけではなく、そこからデータを取り出すソフトの部分も指すということは肝に銘じておきたい。&lt;/p&gt;
&lt;h2 id=&#34;パーティションテーブルmbrとgpt&#34;&gt;パーティションテーブル（MBRとGPT）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.goo.ne.jp/takuminews/e/89f05bcb8ace86fdf7a96415334dd14f&#34;&gt;mbr,gptのはなし&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;ディスクの先頭にかかれたセクター(512bit)は特別な領域である。ここにはディスク上のパーティションの構成情報を格納しているパーティションテーブルが存在する。パーティションテーブルには様々なフォーマットが存在するが、現代、最も使われているのは&lt;strong&gt;MBR&lt;/strong&gt;と&lt;strong&gt;GPT&lt;/strong&gt;である。だが、MBRには2つの大きな制限がある。作成可能なパーティションの最大容量の制限と、ブートモードの制限である。&lt;/p&gt;
&lt;p&gt;パーティションの最大容量の制限は、パーティションのセクタ管理に使われるbit数が原因である。MBRはセクタ管理に32bitを使っている。1セクタ=512バイトであるため、2^(9+32) = 2048.0Gbyteということになる。一方、GPTは2^64byteまでパーティションを作ることが可能である。&lt;/p&gt;
&lt;p&gt;また、ブートモードの違いに関しては、近年のUEFIはMBRに対応していないため、MBR形式のディスクにインストールされたOSはUEFIのマザーボードではブートが不可能となる。&lt;/p&gt;
&lt;h2 id=&#34;fdiskを使ってハードディスクにパーティションを作るgptを作る場合はgdiskを使う&#34;&gt;fdiskを使ってハードディスクにパーティションを作る(GPTを作る場合はgdiskを使う)&lt;/h2&gt;
&lt;p&gt;Linux上でMBRにフォーマットされたパーティションをファイルシステムの一部に組み込むまでの流れを説明する。なお、例ではfdiskを使っているが、GPTでフォーマットされたパーティションを利用する場合はgdiskコマンドを利用すること。&lt;/p&gt;
&lt;h4 id=&#34;デバイス一覧表示&#34;&gt;デバイス一覧表示&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fdisk -l
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;特定デバイスの詳細表示&#34;&gt;特定デバイスの詳細表示&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fdisk -l /dev/sda
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;特定デバイスのパーティション作成&#34;&gt;特定デバイスのパーティション作成&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;fdisk /dev/sda
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;パーティション作成後にカーネルにパーティションテーブルを認識させる&#34;&gt;パーティション作成後にカーネルにパーティションテーブルを認識させる&lt;/h4&gt;
&lt;p&gt;リブートするか、&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo partprobe /dev/sdc
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これをしないと、次のファイルシステムを作れない。&lt;/p&gt;
&lt;h4 id=&#34;ファイルシステム作成&#34;&gt;ファイルシステム作成&lt;/h4&gt;
&lt;p&gt;パーティションを作ってもファイルシステムを作らないとOSはディスクにファイルを保存できない。
よって、ファイルシステムを作る。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo mkfs.ext4 /dev/sdc1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは結構大事なポイントです。
ちなみに、ここでext4ではなく、xfsを作りたい場合は次のようにします。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo mkfs.xfs /dev/sdc1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;って感じですね。&lt;/p&gt;
&lt;p&gt;ちなみにこのmkfsで作れるのは、linuxにデフォルトでインストールされているファイルシステムのみです。
例えば、vfatとか、minixとか、ext4とかですね。分散ファイルシステムであるlustreとか、
広域分散ファイルシステムのchfsとか (つくばの建部先生が作ったやつですね) をインストールしたい場合は、まったく別のアプローチをとる必要があることを承知してください。よろしくお願いします。&lt;/p&gt;
&lt;p&gt;ちなみにちなみに、上のでxfsを作ったときの出力結果をこちらに置いておきます。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;meta-data=/dev/sdb2              isize=512    agcount=4, agsize=54985734 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=219942934, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=107394, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&#34;osのファイルシステムへのマウント&#34;&gt;osのファイルシステムへのマウント&lt;/h4&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo mount /dev/sdc1 /mnt/disk1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;とかでマウントされる。&lt;/p&gt;</description>
    </item>
    <item>
      <title>データベース実体の保存先の変更</title>
      <link>https://blog.ingenboy.com/post/db_on_hdd/</link>
      <pubDate>Fri, 12 Aug 2022 00:11:32 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/db_on_hdd/</guid>
      <description>データベースの実体の保存先の変更方法について。また、データベースを使い始めるときのログイン方法等</description>
    </item>
    <item>
      <title>技術の棚卸</title>
      <link>https://blog.ingenboy.com/post/tech_stack_review/</link>
      <pubDate>Tue, 09 Aug 2022 22:59:42 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/tech_stack_review/</guid>
      <description>自分が持っている技術について、今後の方針も定めるために一度振り返る</description>
    </item>
    <item>
      <title>新・サイト</title>
      <link>https://blog.ingenboy.com/post/new_start/</link>
      <pubDate>Fri, 05 Aug 2022 23:44:01 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/new_start/</guid>
      <description>ブログを自作静的サイトからhugoに移植した</description>
    </item>
    <item>
      <title>Cool_stuffs_related_to_hugo</title>
      <link>https://blog.ingenboy.com/post/cool_stuffs_related_to_hugo/</link>
      <pubDate>Fri, 05 Aug 2022 23:26:21 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/cool_stuffs_related_to_hugo/</guid>
      <description>Additinal knowledge about hugo</description>
    </item>
    <item>
      <title>マインカンプ</title>
      <link>https://blog.ingenboy.com/post/autobiograpy/</link>
      <pubDate>Fri, 27 May 2022 18:06:51 +0900</pubDate>
      <guid>https://blog.ingenboy.com/post/autobiograpy/</guid>
      <description>&lt;h1 id=&#34;コンピュータを学ぶに当たり自分がたどってきた過程&#34;&gt;「コンピュータ」を学ぶに当たり、自分がたどってきた過程&lt;/h1&gt;
&lt;p&gt;コンピュータに強くひかれてから6年弱(2018/10 - 2024/04)が経過したわけだが。
自分は、ほぼ手探り状態でコンピュータの知識を身に着けていった。
今となっては知らなくてもよかったと思う知識もおおい。しかし、「ランダムサーチ」的な勉強によって「点」で身に着けていった知識が、少しづつ「線」でつながっていき、結果的にコンピュータ分野における自分の視野を広げてくれているとも思う。&lt;/p&gt;
&lt;p&gt;自分がコンピュータを学ぶ時にどんな過程を辿ってきたか、まあ、簡単に書いていきたいと思う。
ただの日記になってるとこもある。&lt;/p&gt;
&lt;h5 id=&#34;201804&#34;&gt;2018/04&lt;/h5&gt;
&lt;p&gt;サーバーって何？ブラウザって目の前にあるコンピュータのなかに入ってる辞書みたいなものじゃないの？インターネットって、インターネットエクスプローラのことじゃないの？って思ってたところからの成長過程&lt;/p&gt;
&lt;h5 id=&#34;20185&#34;&gt;2018/5&lt;/h5&gt;
&lt;p&gt;授業でcをやる。正直何が楽しいのかわからなかった。printf()でもじが出力できます。。うんたらかんたら、、、で？
でも、レポートとか早くまとめられるようにタイピングは速くなりたかった。適当にwordで日記をつけたりしてた。&lt;/p&gt;
&lt;h5 id=&#34;201808&#34;&gt;2018/08&lt;/h5&gt;
&lt;p&gt;たけしに勧められ、タイピングバラエティーを始める。&lt;/p&gt;
&lt;h5 id=&#34;201810&#34;&gt;2018/10&lt;/h5&gt;
&lt;p&gt;なんか、大学って俺が思ってたところと違うな、と思い始める。
機械系に入ったのは、バリバリ機械をいじれるからだと思ってたのに、なんか学校でやるのは線形代数とか、微分とか、は？って感じだった。僕は実用的なことが好きだった。
んで、その時とってた授業で唯一実用的だなって思ったのが、前期はなかったcプログラミングの授業。最近の機械は制御でもcが使われてるらしいし、ちゃんと聞いて損はないなって思った。&lt;/p&gt;
&lt;p&gt;#####　2018/11
cの授業が楽しくてはまっていった(そのC言語の授業を担当していた先生が好きで、せっかくなので授業も頑張ろとおもい、それに付随してコンピュータも好きになったと思う。自分にしては珍しく、教室の一番前で授業を受けていた。3年生の時この先生の研究室に入ることになるが、入った年に別の大学に移ってしまったのは本当に残念なことである。)。最終的には7並べのゲームを作るらしい、ということでやる気が出た。
自分のノートpcにMingwとか入れた。windows用のcコンパイラだね。
この時はパスって概念もわからなかったし、コマンドプロンプト上でコンパイルできた時はかなりうれしかった。&lt;/p&gt;
&lt;p&gt;#####　2019/01
とりあえずpc極めたいならデスクトップ買うしかなくね？と思って、ドスパラでで現在も愛用しているbtoのpcを買う。ちなみに、一代目にBTOを購入することにしたのは非常にいい選択だったと思う。すぐ動くけど、拡張性にも優れているからね。&lt;/p&gt;
&lt;h5 id=&#34;201902&#34;&gt;2019/02&lt;/h5&gt;
&lt;p&gt;春休み。なんか、せっかくデスクトップ買ったのにどうやって活用するのかわからない（笑）
うーん、デスクトップ買う意味なかったか？（笑）って思ってるうちに、まあとりあえずネットワークについて学ぼう、と思い図書館へ足を運ぶようになる。
このころからマジで図書館にめっちゃ行くようになる。
パソコンに触れ始めた人って結構ハッカーとかにあこがれること多いと思うんだよね（笑）俺もそうだった。んで、最初に借りた本が『ハッカーの教科書』
これ、ネットワークについて何も知らない人が読むものではありませんでした（笑）ARP?ポート？SSH。。。なにそれまったくわからんわ。。。
とか思ってるうちに春休みが終わった。この年は厳冬期の聖岳に行って凍傷になりました。でもマジで楽しかったー。&lt;/p&gt;
&lt;h5 id=&#34;20194&#34;&gt;2019/4&lt;/h5&gt;
&lt;p&gt;しんがっき。とりあえず、プロコン始めるか！って言ってプロコン始めた。こっから2020/2くらいまで、ほぼ毎週出た。
C言語で出続け、アルゴリズムとデータ構造とかもほとんどわからなかったから、ぶっちゃけレートは全然上がらなかった。が、c言語の基礎は学べたし、後々c++を習得することにつながったと思っている。今思うと、キューもマップも使わずにcで出続けるってかなり無謀だったな…&lt;/p&gt;
&lt;h5 id=&#34;20195&#34;&gt;2019/5&lt;/h5&gt;
&lt;p&gt;プロコンに興じていたが、なんか、これって結局誰かの掌の上で踊らされてね？って思って、再びハッカーの教科書を読み始めた。しかし、やっぱり何もわからん。。。
唯一わかったのが、kali linuxというosにはハッキングツールがたくさん入っていて、なんかかっこいいといういこと。で、このころ、せっかく買ったデスクトップがマジでただ置いてあっただけになりつつあったので、
こいつ、windows入ってるけど、kali linux新しくいれね？って思って、どうやって入れるのかいろいろ調べていたら、なんとデュアルブートというものがあるじゃない。
dual bootは一つのpcに二つのosが入ってる状態のこと。その当時、結構パソコンに詳しくなってきて、「完全に理化した」状態になっていたけど、まー今の俺から見るとその当時の俺なんてぺーぺーで、kali linuxをdual bootできるようにするまでも結構時間かかったねー。
しかし、ミスったらwindowsが消える可能性もあったが、結構頑張ってとりあえずkali linuxを入れることに成功した。よくあきらめなかったぞ！&lt;/p&gt;
&lt;h5 id=&#34;20197&#34;&gt;2019/7&lt;/h5&gt;
&lt;p&gt;頑張ってハッカーの学校を読み進めた。理解できた概念は、ポート、ipアドレス、ドメイン、など。
そして、nmapというポートスキャンツールの存在を知った。
こいつにはまった。マジで。ネットでnmapと検索すると、絶対にwanでポートスキャンしちゃいけないとか書いてあるし、中二ごころをくすぐられたね。あーおれハッカーになったんだと錯覚した。実際は全然大したことなく「script kiddy」にも達していなかっただろう。しかし非常に楽しかった。kaliを使って、lan内で、wifiでつながってるノートpcに何回もポートスキャンかけて遊んだ。起きて一番最初にすることは、nmapだった。
でもだんだん出てくるドーパミンの量も減っていくんですよね。。。そして、だんだんと飽きてくるんですねー。ノートpcにnmapをかけるのも。で、やってしまったんですよ。出来心で。 あのg社のdnsサーバにnmapをかけた。
普通のnmapは5秒くらいでスキャンが終わるんですけど、その時は20秒くらいたっても終わらず、なんかだんだん焦ってきて、
とりあえず、ctrl+cでnmapプロセスを停止。んで、ブラウザでnmap についてしらべようとしたら、いつまでたっても検索できなくなったんだよね。
????ってなって、だんだん焦ってきて、しばらくたったら回復して検索できるようになった。で、どのサイトで見ても、他人のサーバーにnmapしたら犯罪って書いてあったんだよね。
あ、大学退学になるわ、俺の人生終わったわ、っておもって2日くらいびくびくしてた。眠れなかったね。でも結局あれから5年以上たってるけど、G社からやばい手紙とかは来ていないので大丈夫そう。被害妄想が激しかった。&lt;/p&gt;
&lt;h5 id=&#34;20198&#34;&gt;2019/8&lt;/h5&gt;
&lt;p&gt;10月実施の基本情報技術者試験のための勉強をした。それと、ハッカーの学校のレベルが高すぎるかなと思い、代わりにTcp/ipの絵本を読んだ。こっちはかなり基本から書いてあって読みやすかった。
このころ、資格の勉強って実用的じゃなくて、ほんと資格のための勉強って感じだな、学校の勉強みたいだなて思ったね。でも今思うと、そこで基礎を鍛えられて気もする。まあ、理論と実践はバランスが大事ですよね。&lt;/p&gt;
&lt;h5 id=&#34;20199&#34;&gt;2019/9&lt;/h5&gt;
&lt;p&gt;ラズパイというものがあると知った。格安コンピュータ6000円？！。しかもosはlinuxだと。即買いしましたね。
パソコン技術を爆上げしてくれるきっかけになったのはやっぱりラズパイ購入だと今でも思ってる。
まずCLIの基礎についてかなり勉強できた。そして、LINUXについて勉強した。
そして、sshを学んだ。生まれて初めて、ネットワークでパソコンがつながっていることを実感した。firelilyから、ラズパイにssh成功した時は震えた。これが「通信」なのか、とね。
朝起きてから最初にやることはsshになった。しかし、これにも飽きて次に進むわけです。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Markdown Syntax Guide</title>
      <link>https://blog.ingenboy.com/post/markdown-syntax/</link>
      <pubDate>Mon, 11 Mar 2019 00:00:00 +0000</pubDate>
      <guid>https://blog.ingenboy.com/post/markdown-syntax/</guid>
      <description>Sample article showcasing basic Markdown syntax and formatting for HTML elements.</description>
    </item>
    <item>
      <title></title>
      <link>https://blog.ingenboy.com/post/rich-content/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://blog.ingenboy.com/post/rich-content/</guid>
      <description></description>
    </item>
  </channel>
</rss>
