OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10でRedisを使ってみる

### 開発環境
- Windows 10 Pro(64bit)

Windows 10でRedisを使用するには、WSL経由で、Redisをインストールするか、MicrosoftのOpen Tech GroupがWindows用のRedisを開発しているので、そちらを使うかの2種類がありますが、今回は後者を実行したいと思います。

### インストールするまで
1. [配布サイト](https://github.com/MicrosoftArchive/redis/releases)へアクセスします

2. 現時点で最新版が3.0.504があるので、そちらの**Redis-x64-3.0.504.msi**をダウンロード(更新日時を見ると、2016年なので、かなり古いです・・・)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/16427109-be0e-4fe6-a3a9-4d26dd086ce0.png)

3. ダウンロードしたインストーラを実行

4. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/75fab27f-d066-b8eb-332d-8042391465b7.png)

5. **I accept～**にチェックを入れて、Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/d3a0c123-1cd1-48d6-303c-099596bae346.png)

6. **Add the Redis～**にチェックを入れて、Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/4eba4e18-4bd0-e017-1936-4477a2ebdb83.png)

7. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/b309a4bd-7823-d75e-3186-62bf95929405.png)

8. Nextをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/6967d187-094f-0d11-2e8f-db0ecdf4342d.png)

9. Installをクリックして、インストール開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/4add2730-8409-3c8b-edec-842bfb726533.png)

10. インストールが終わったら、Finishをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/5b1287d2-404d-d804-40bf-b06d9af7abc9.png)

11. 正しくインストールされているか以下のコマンドをPowershellなどでチェック
```powershell
cd "c:\Program Files\Redis"
redis-server --version
```
以下の結果が出たので、正しくインストールされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/02586056-8eb9-5795-173a-a15ecea4ca90.png)

msi経由でインストールしたら、その時点で、自動で、redis-serverが起動しています。

### Redisサーバーへアクセスする
1. c:\Program Files\Redisディレクトリ内にあるredis-cli.exeを起動して、Redisサーバーにアクセスします。
2. 以下のコマンドを入力し、サーバーにデータを入力し、表示をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/240d67fd-6ac4-bd3e-f2ff-138ea4a1c935.png)


### 参考リンク
- [Redis を Windows にインストールする手順](https://weblabo.oscasierra.net/redis-windows-install/)
できないの！？　wsl2 上のUbuntuでsystemctlコマンド！？ 

# サマリ
WSL2上のUbuntuでsystemdはデフォルトでは使用不可。
WSLの最新バージョンへのアップデートと`/etc/wsl.conf`の設定が必要

# 環境
* Windows11
* WSL 1.3.17
* Ubuntu 22.04 LTS

# 今回困ったこと
最近、ちいかわのアニメでハチワレ役の子役が回を重ねるごとに演技力が成長していって、なんだか微笑ましくなりますね。
さて自分はWSL2上のUbuntuでdockerを使おうとしたら、起動しないという状況に陥りました。全然微笑ましくないですね。
エラー文はこんな具合でした。

```
 $ sudo systemctl start docker
 System has not been booted with systemd as init system (PID 1). Can't operate.
 Failed to connect to bus: Host is down
```
なんか「systemdが動いてねえんだよ」と怒られてますね。
Ubuntuいじってたら、systemctlというのは何気なく日頃使っているものなので、いつもならできることが急にできなくなって「ウワーッ」ってなりました。
だって普通、UbuntuのsystemdってPIDの一番上に来るものじゃないんですかね。
いつも傍にいてくれた存在はいつだっていなくなってしまってから、その大切さに気づくものです。

# なんでや
泣き言を言っても始まりませんので原因調査です。
原因調査といっても、WSL上のLinuxディストリビューションがsystemdに対応していなかった過去があることがしっかり報道されていました。

https://forest.watch.impress.co.jp/docs/news/1441775.html

WSLにおいて、過去にはsystemdに対応してなかったとのことですが、2022年に対応するようになりました、とのことです。

https://learn.microsoft.com/ja-jp/windows/wsl/systemd

が、systemdをPID1に持ってくるためにはひと手間必要ということには変わりありません。
というわけで、以下がそのひと手間の手順となります。

# してみよう……「対応」！
さくさくやっていきましょう。
`/etc/wsl.conf`というファイルを作成しまして、下記のように記述し、オプトイン設定を行います。
```
 $ sudo vim /etc/wsl.conf
 
 [boot]
 systemd=true
 ```
次にWSLを再起動させます。
PowerShellからwslをシャットダウンさせます。

```
 wsl.exe --shutdown
```
その後、通常通りWSL2上のUbuntuを起動。

# が、駄目……！
これでもう一度`systemctl`でDockerを起動しようとしましたが、先ほどと同じエラー文が出力されて、立ち上がらず。
もしやと思ってWSLのバージョンを確認。
```
 wsl --version
 WSL バージョン: 1.3.17
```
2024年2月時点で最新バージョンは2.1.3ですので、
WSL自体のバージョンが古かったことに原因がありましたね

# WSL2を最新バージョンにアップデート
というわけで、WSLそのものを最新バージョンにアップデートします。
職場のセキュリティポリシーでMSstoreをブロックされているので、回避してPowerShellからアップデートを実行します。

というわけでPowerShellを<b>管理者権限</b>で起動して、下記のコマンドを実行。
PowerShellを管理者権限で起動するの、結構忘れがちになりますよね。
```
 wsl --update --web-download
```

確認してみましょう。
```
 # top
 <中略> 
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
       1 root      20   0  165832  11352   8376 S   0.0   0.1   0:01.20 systemd
```
これで、systemdがPIDになっていることを確認、dockerの起動もできました。

# 参照
https://e-seventh.com/wsl-unable-to-use-systemctl/

https://moguno.hatenablog.jp/entry/2021/03/31/032110
【RotorHazard】/boot/firmware/config.txt 各種パラメータ(デバイス、オンボードLED、Shutdownボタン)定義

# 18. RotorHazard向けにラズパイチューニング

この記事はFPVドローン ラップ計測システム【RotorHazard】をRaspberry Piで作成するにあたってのTipsをまとめたものです。ですが一般的なラズパイ構築方法としても参考になるかと思いますので、ぜひご活用ください。

### 18-1. RotorHazardのREADME.mdで記載のある初期設定を反映
最初に/boot/firmware/config.txtを最適化＆チューニングをしていきます。チューニングと言っても、クロックアップするとか？そういうことではないです。(そもそもRotorHazardはCPUのクロックアップしてもそこまで性能にこだわるような仕掛けではないのでｗ) RotorHazardに向けた最適な定義を一旦最初に仕込んでおくというイメージで捉えてもらえればと思います。

デバイスの利用有無に関しては既に前段の **Raspberry Piの設定 → インターフェイス** タブでON/OFF設定を実施しました。今回はそれ以外の設定になります。

https://github.com/RotorHazard/RotorHazard/blob/main/doc/Software%20Setup.md#3-apply-changes-to-the-boot-configtxt-file

今回は下記パラメータを手動で記載しました。最後の方に記載してください。
```
sudo vi /boot/firmware/config.txt
```
```/boot/firmware/config.txt の編集
[all]
dtparam=i2c_baudrate=75000
dtoverlay=miniuart-bt
core_freq=250
```
さーせん。記載の内容に関してはもっと詳しいサイトをご参照くださいｗ まあ上からボーレートをラズパイ3Bの推奨値に、Bluetoothを別のデバイスの見せ方へ切り替え、CPUのコア周波数も固定決め打ちという意味…かな？ｗ
また、コンソールでの編集は **nano派** or **vi派** で分かれるとは思いますが、どちらでもお好きなものを。私は結構なオールドタイプなので **vi派** です。emacsも使いませんわよーｗ

### 18-2. オンボードLEDの光り方が気に入らないぞ！直しちゃうぞ！
こちらに関しても、完全にお好みの話です。自分のしっくりくる設定に修正してくださいませ。記載場所は最後行でOKです。
```
sudo vi /boot/firmware/config.txt
```
```/boot/firmware/config.txt の編集
[all]
dtparam=act_led_trigger=heartbeat    # heartbeat for green
#dtparam=act_led_trigger=timer       # slow blink for green
dtparam=pwr_led_trigger=mmc0         # microSD for red
#dtparam=pwr_led_trigger=mmc1        # SSD for red
```
参考サイトはこちら

https://qiita.com/naohiro2g/items/d5385a4e660fd72711b2

選択できるように別定義は【 # 】のコメントをつけて無効な状態にしています。(メモってことでご認識ください)
ちなみに一番下の行の **mmc1** は後ほどどこかで記載しますが、USB接続したSSDから起動した際にディスクシークを赤く光らせる定義になります。なんとなく覚えておいてください。
(正直、処理速度を向上させるには **microSD → SSD** へ変更して利用する方が絶対的に速度アップが図れます。ワイが手元でゴニョゴニョした結果でも3.5倍程度の速度向上が見られました。この違いは圧倒的なので、もしお手元にSSDが余っていたり、接続の状態やケース問題とかを気にしなくて良い場合は絶対に有利なのでご検討いただければと思います。※mSATAだと小さく利用可能なのでチャレンジしても良いかもです。

### 18-3. Shutdownボタンの設定
はっきり言って…必要ないとは思いますが、RotorHazardのケースを見ていて電源プラグ用を少し拡張するとボタンスイッチが入るなーと思って設定をしてみました。(電源ONを示すLEDと組み合わせたボタンを仕込んだ方が良かったかもしれません)
今回ワイが選んだ場所は **GPIO21** です。ラズパイ的には GPIO02 に接続すると、ここはプルアップ抵抗が仕込まれているピンなので、シャットダウンと共にボタンを押すことで **起動** もできるという機能を持ちます。ですが、RotorHazardはGPIO02をI2C(SDA)の通信として用いているので単純なShutdownボタンとして割り切りで使います。接続先はPin #39、Pin #40を想定します。プラマイ極性は特にないのですが、一応黄色をプラス、白をマイナスって感じで接続予定です。
```
sudo vi /boot/firmware/config.txt
```
```/boot/firmware/config.txt の編集
[all]
dtoverlay=gpio-shutdown,gpio_pin=21,debounce=2000
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/d036cac6-d1fe-094e-924a-6a8b5b4fc93d.png)

ピン配列は下記を参考としてください。一番下にShutdownボタンとして装着しようと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/0e6b9cde-eaa4-cb57-6898-4a19f6303778.png)

### 18-4. スーパーユーザ (root) のパスワード設定
これも完全にお好みです。ですがセキュリティとしては運用に十分ご注意ください。sudoコマンドを毎回打たずにrootのままで作業をしたいような場合に、今回のような設定を行いますが…まあ昨今のオペレーションはsudoコマンドを意識してマニュアルとかは書かれているため、ワイも今回のQiitaの記事はsudoありで書いていきますよん。

```
sudo passwd root
```
パスワード文字列を2回要求されるので、難しい組み合わせを意識してぶち込んでください。

ラズパイ構築編のつづきはこちら

https://qiita.com/tmac116/items/77946c467a2c71f7d6ca?1
Elixirで言語処理100本ノックやってみた！vol.4

こんにちは！
3ヶ月で、Elixir言語で開発できるようになるため、奮闘中のこーへーです！

今回のvol.4はめちゃくちゃ時間がかかりました。おそらくトータルで、20時間くらい。笑
たった１問に20時間もかかるのか！？って思うけど、実際にかかったんで、なんとも言えませんね。笑

とはいえ、この1問にはめちゃくちゃ成長させられました。
正直、かなり書き方調べたし、Elixirでif文って使っていいの？（ソース内で使ってるんですが）みたいな葛藤とかもあったりして、とにかく色々試してなんとか正解に辿りつきました。

当たり前のことだけど、やり切ることは重要だなって実感しました。
やり切るってなかなか精神的にハードルの高いことだと思います。最後までやり切れる人たちばっかの世の中なら、成功者だらけになるでしょ？そういうイメージですよ。

はい、ということで、100本ノックvol.4をやっていきたいと思います。
[100本ノックの記事はこちら](https://nlp100.github.io/ja/ch01.html)

***
### 04.元素記号Permalink
>“Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.”という文を単語に分解し，1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字，それ以外の単語は先頭の2文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．

### 1.ゴール(結果)を知る
僕は問題文を読んで、頭の中は、「？」でした。
理解に苦しんだのは、*「取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．」*
」のあたり。
これは、専門用語を知っているか、読解力があるかで、人それぞれ違うので仕方ないんですが、僕はこの文章からだと、どんな結果を作れば良いのかイメージがつきづらかったです。
なので、『100本ノック解答』などと検索して調べ、ゴールを知るところから始めました。

まず、どんな結果を生み出したいのかイメージができなければ、方向性を間違う可能性があるということです。

### 2. 初めの一歩
次に、結果にたどり着くための一つ目のプログラムは何をしなければならないのか手順をノートなどに書き出し、道のりをより具体的にしました。
今回の場合、「文を単語に分解する」ことが、最初に行うべきプログラムです。そのプログラムが以下になります。
```
# String.splitで各単語を分解しリストに格納
String.split("Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.")
```

### 3. おおよそ15時間悩んだ部分
ある程度は、順当にプログラムを組むことができたんですが、あるところまでくると僕の知識では、超えられない壁がありました。
それは、「それ以外の単語は先頭の2文字を取り出し」の部分。

その手前の「1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字」を取り出すというのは、なんだかんだできたんですが、同時に一つのプログラムの中でこれを実現するのは無理なんじゃないか？と、色んな関数を試してみたり、裏技的な関数が用意されているんじゃないかと探したりしました。笑

### 4. 条件で分るという初歩的な結論に
なんだかんだ、たった１問に、悩みに悩み抜くと少しずつ正解に近づいていくもので、これって条件で分けたらええやん！と、ふと当たり前のことが閃きました。

ここからは、結構早く、一旦シンプルにif文で回して見ようといくつかのパターンを試しました。その中でつまづいたのは、要素ごとに取得したい文字数は違うのに、elseで分岐できなかった部分です。以下にソースを記載します。
```
if [1, 5, 6, 7, 8, 9, 15, 16, 19] do
...(28)> {String.slice(x, 0..0), y}
...(28)> else
...(28)> {String.slice(x, 0..1), y}
...(28)> end
...(28)> end)
[
  {"H", 1},
  {"H", 2},
  {"L", 3},
  {"B", 4},
  {"B", 5},
  {"C", 6},
  {"N", 7},
  {"O", 8},
  {"F", 9},
  {"N", 10},
  {"N", 11},
  {"M", 12},
  {"A", 13},
  {"S", 14},
  {"P", 15},
  {"S", 16},
  {"C", 17},
  {"A", 18},
  {"K", 19},
  {"C", 20}
]
```
ここで、if文の条件で関数を埋め込んで良いという事実を知り、`Enum.member?`を使うことにしました。
これでようやくうまくいったわけです。

### 解答
```
String.split("Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.") |> Enum.with_index(1) |> Enum.map(fn {x, y} -> if Enum.member?(base_list, y) do
...(33)> {String.slice(x, 0..0), y}
...(33)> else
...(33)> {String.slice(x, 0..1), y}
...(33)> end
...(33)> end)
[
  {"H", 1},
  {"He", 2},
  {"Li", 3},
  {"Be", 4},
  {"B", 5},
  {"C", 6},
  {"N", 7},
  {"O", 8},
  {"F", 9},
  {"Ne", 10},
  {"Na", 11},
  {"Mi", 12},
  {"Al", 13},
  {"Si", 14},
  {"P", 15},
  {"S", 16},
  {"Cl", 17},
  {"Ar", 18},
  {"K", 19},
  {"Ca", 20}
]
```

### まとめ
この問題には、成長させられた実感があります。特に、ひとつひとつのプロセスを考えることの重要性がわかりました。飛び越えて実現するこはできないということですね。
まだ、100本ノック4つ目の問題なのにむちゃくちゃ時間かけてしまいましたが、実りある時間でした。

プログラミングを頑張っているみなさんもぜひ、意識してもらえたら嬉しいです。
うつ病から復帰して気を付けていること

# はじめに
社会人生活15年以上の経験で、初めてうつ病にかかり、半年近く休職をしました。
会社や家族の助けもあり、今は通常の生活を取り戻しつつあります。
あんな経験は二度としたくないですし、これ以上家族にも心配をかけたくない。
そんな思いで過ごしつつ、でもまた悪化してしまうかもしれないと気を付けるために、仕事で気を付けていることを書き出そうと思います。

# どんな症状だったか？
食欲が無い、不眠症、とにかく体が動かない。休職前は「もう生きていけない」とすら考えていたほどでした。
またストレスが引き金となり、身体中に湿疹が出ていました。

# どうしてこうなった？
あまり詳しくは書き出せませんが、環境の変化だったり、苦手なこと・不満をかなり溜め込んでいたのかなと思います。モチベーションは高かったのですが、やはりネガティブな部分の方が勝っていました。

# 休職から復帰直前まで
1週間はとにかく朝も起きられず大変でした。2週間目は比較的穏やかな日を過ごせましたが、そこから約1か月間は「会社を辞めよう」「もう働きたくない」など、悩み続ける毎日でした。
ただ会社の看護師さんや心療内科のお医者さんとコミュニケーションを取るうちに、復帰に少しずつポジティブになてきました。ここで気を付けたことは、**復帰を焦らない**ということでした。
また、休職中に家族とも一度衝突してしまい、「うつ病が再発したら離婚してほしい」とまで言われました。一緒に過ごす家族にとっても非常につらい時間だったと思います。

# 復帰前、カウンセリングを受けてみた
先述したとおり、家族から衝撃的な宣言をされましたが、「カウンセリングを受けてみて、それでも再発したら仕方がない。一度受けてみたら？」とアドバイスされました。
はじめは気が進まなかったです。地域の無料相談なんかも考えてみましたが、抵抗感がありました。通院している心療内科もカウンセリングはしておらず。
そこで会社の看護師さんに相談をしてみると、会社が提携しているカウンセリングサービスがあるとのこと。まずはこれに乗っかってみました。

# カウンセラーからのアドバイス
カウンセラーには、自分が特にストレスを感じるシチュエーションへの対処法についてお聞きし、そのアドバイスをしていただけました。特に下表の４つは個人的にはとても効果がありました。引き続き気を付けていきたいと思いました。

| シチュエーション | これまで | 対処法 |
|:-:|:-:|:-:|
| 否定をされたとき | ダメな人間だと落ち込む  | その場で自分を評価しない  |
| 出来ないことが多い | 非常に申し訳ないと落ち込む | 出来たことを３つ挙げる |
| 相手と仲良くできない | 仲良くしようと媚びへつらう | 仕事の関係だと割り切る |
| 悩む時間が多い | 答えのない悩みを考え続ける | 小声で「ストップ」と唱える |

特に１つ目の「否定されたとき」ですが、これについては**思い込み**がほとんどだと思います。家族と衝突した原因もおそらくこれでした。「めんどくさい人間だね」とまで言われました。ここでハッと気付きました。この衝突を元に、プライドを捨てて、抵抗感のあったカウンセリングを受けてみた感じです。

# 復帰してから
まずは時短勤務からはじめ、今は通常勤務であまり残業をしないというルールで会社と取り決めました。心療内科へは1か月から１か月半に一度通院、カウンセリングは１か月半から２か月に一度受けています。
もちろんすべてが上手くいっているわけではなく、ストレスのかかるシチュエーションでは少し体調が悪くなる時間帯もあります。そんな時は先に挙げた対処法で和らげています。

# 変わったこと
復帰後戦力になりたいと焦る気持ちが強かったのですが、そこにフォーカスを当てず、とにかく心身健康でいようと過ごしています。頑張り過ぎず、6割程度で動くとカウンセラーからアドバイスももらいました。

「出来たことを３つ挙げる」ということを少しずつ繰り返した結果、色々なモチベーションが上がってきました。こうやって気持ちを投稿してアウトプットをするというのもそういった結果の表れかもしれません。

人との関わり方も変わりました。自分を評価したり、また無理に仲良くなろうと腰を低くし過ぎず、あまり相手にどう思われるかを気にし過ぎないようになりました。おかげで困りごとなど相談がしやすくなったかもしれません。今のところはですが。。。

# これからの展望
休職前までのパフォーマンスが出たらいいな～と思います。
フロントエンドの勉強も進めたいな～と思います。
せっかくなので資格や試験の合格も目指したいな～と思います。

今は「やりたい！」と強い気持ちではなく、「やりたいな～」くらいのテンションで過ごそうと思います
LambdaでGoのHelloWorldをやってみた

GoはシングルバイナリでLambdaと相性が良いらしい・・・といったレベルの初心者なので、まずは公式のドキュメントのとおりにやってみる。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html

```go mod init main```して、```go.mod```を作成し、```main.go```に例示されたコードを張り付ける

```go
package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-lambda-go/lambda"
)

type MyEvent struct {
	Name string `json:"name"`
}

func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) {
	if event == nil {
		return nil, fmt.Errorf("received nil event")
	}
	message := fmt.Sprintf("Hello %s!", event.Name)
	return &message, nil
}

func main() {
	lambda.Start(HandleRequest)
}
```

次はこちらのドキュメントに従って、Lambdaに実行ファイルをデプロイする。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-package.html

LambdaのCPUはarm64とするため下記でビルドし、実行ファイルを生成する。
```
GOOS=linux GOARCH=arm64 go build -tags lambda.norpc -o bootstrap main.go
```

実行ファイルのbootstrapが生成された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/1de2ff48-3579-7582-941c-262423d40623.png)


Lambdaにアップロードするため、```zip myFunction.zip bootstrap```でzipに圧縮する。

次はLambdaのコンソールから、関数を作成する。Goで実行するため、Amazon Linux2023ランタイムを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/07e7e5a0-5e2b-a0a2-1bfd-dbd9674c578a.png)

コードタブのアップロード元→.zipファイルから```muFunction.zip```をアップロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/3bb8a4a4-9c04-c2bb-58d6-c8a6bd254732.png)

次はテストタブからイベントJSONを変更し、テストを実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/5a2b6409-8bae-0bff-b961-d7bb33e3a1d6.png)

```"Hello from Test!"```が返ってきており無事に実行できた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3770153/e355bd29-50c0-b28e-3f7d-6a65b83c03b7.png)
サイズの大きいcsv等をvimで処理したい時の小ネタ

Vim bootstrapを活用したりして良い感じにvimをカスタマイズしていると普段のプログラミング等は快適になるものの、
数百万行あるようなデータ量の多いcsvなんかを開こうとすると重くて使い物にならない、そんな時。

こうしてvimを起動しましょう。
```
vim -u NONE -N
```
- `-u NONE`
    - 　.vimrcを無視。プラグイン等を一切読み込まない。
    - 　なお vi互換モードになってしまう
- `-N`
    - nocompatible. ↑で有効になったvi互換モードを無効にする。

素のvimになるので非常に軽快。
400万行程度のcsvならさっと開くし、検索も軽い。

いちいちオプション書くのも面倒なんで、alias登録しておくのが便利。

なおcsvファイル内のデータを集計したり複雑な検索したりしたい場合は、おとなしくDuckDB等に投入した方が良い。
【RotorHazard】Raspberry Pi OS 日本語入力環境の設定、不要ソフトのアンインストール、タスクバー設定

# 17. ラズパイの作りこみTips

この記事はFPVドローン ラップ計測システム【RotorHazard】をRaspberry Piで作成するにあたってのTipsをまとめたものです。ですが一般的なラズパイ構築方法としても参考になるかと思いますので、ぜひご活用ください。

### 17-1. ソフトウェアインストールのおまじない
ここの章は…Linux系サーバの作りこみとほぼ一緒かとｗ
ワイがわざわざTipsとして書くのもオコガマシイところではありますが、自分メモも含めて書き残していければと思っています。下記はDebian系ディストリビューションのお約束の呪文ということで覚えておいてもらえればと思います。ソフトウェア更新をするようなことがある場合には必ず叩きましょう。

```
sudo apt update
sudo apt upgrade

sudo apt autoremove
```
**【 autoremove 】** は、ソフトのバージョンアップ等で必要がなくなった関連ソフトウェアやライブラリが出てきた際に消し込むコマンドで、**apt update** もしくは **apt upgrade** をした場合に削除指示として autoremove を別途するように指示が出ますので、そのタイミングで叩くぐらいの気持ちで問題ありません。これらの呪文の意味や詳しい内容に関しては、Ubuntu等の設定Tipsのブログや関連サイトにも細かく書いてあるかと思いますので、こんな説明で今回は割愛するっすー。

### 17-2. 日本語環境のチェック
現在の **Raspberry Pi OS** ではかなり日本語化がしっかりしているため、そこまで意識しなくても良いかもしれませんが、64ビット版に関してちょっと気になったので一応書き残しておきます。
```
echo $LANG
locale
```
ここで **jp_JP.UTF-8** と出力されているならば問題ないものと思います。ちょっとハマったこととしては、ワイ自身Ubuntuを作業用として普通に使っているのですが、最後のUTF-8のハイフンなしが当然と思っていました。ですがラズパイ先生は **【 ハイフンあり 】** ですと！今後、ハイフンあり！であることを意識して生きていこうと決心しましたｗｗｗ
そして、せっかくなのでマニュアル関連も日本語をインストールしておきます。
```
sudo apt install manpages-ja manpages-ja-dev
```

### 17-3. あれれ？日本語入力は入っていないんでしたっけ？
もしかしたら、Fullには日本語入力関連はちゃんと入っているかもしれませんが、標準版(デスクトップ版)は **Fcitx & Mozc** が入っていないのに気付きました。そういうもんなんですかね？っということでメモ等で日本語は使うシチュエーションあるかと思いますので、これはインストールしておきます。
```
sudo apt update

sudo apt install fcitx-mozc -y
```
テキストエディタ(Mosepad)を開いて、正常に日本語が入力・変換できるかをご確認ください。下記サイトが非常に丁寧なナレッジ記載がありました。

https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-input-japanese/

### 17-4. 要らないソフトウェアをアンインストール
こちらに関してはわざわざ実施しなくても良いのですが、Debian系ディストリビューションでのソフトウェアのアンインストールはどうやるの？という参考程度に書いておきますー。
今回は標準で入っているプログラム言語開発アプリである **Thonny**、**Geany** は、ワイはまったく利用しないつもりなので削除してしまおうと思います。
```
sudo apt update

sudo apt remove thonny
sudo apt remove geany
```

### 17-5. タスクバーのカスタマイズ (CPU温度、CPU＆メモリ使用率の表示)
良く、Windowsではタスクバーの常駐トレイにCPUやメモリの負荷表示や温度表示をさせるカスタムとかが昔からありますよね？ワイも当たり前のように仕込んでいます。これをラズパイで同じように実施する方法です。
かと言って、他ソフトウェアをわざわざインストールする必要はなく、設定のみで実施ができますので、せっかくなので仕込んでおきたいと思います。

実施している内容は、マルっとここに書いてある方法になります。
やりたいことは必要なパネルの中に項目を追加して、表示順番を入れ替える…というだけの簡単なものです。

https://www.fabshop.jp/%E6%94%B9%E8%A8%82%E3%80%90step-19%E3%80%91raspbian%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%90%E3%83%BC%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-4/

こんな感じでCPU温度、CPUとメモリの使用率を表示させます。まあマジでお好みっすｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500291/a2fb0414-34e7-7b10-09d5-1c04c08f43aa.png)

ラズパイ構築編のつづきはこちら

https://qiita.com/tmac116/items/fa101aef331bd822987d?2
Hyper-VでEVE-NGをインストールしてみた

# 概要
　SR-MPLSを実装してみたいと思っていたが、シミュレータだとプロトコルに対応していなかったり、エミュレータだとIOSイメージの取得が難しかったりとなかなか実現できていなかった。
　今回、EVE-NGとfreeRouterを利用することで上記が可能という記事を見つけたのでHypter-Vで環境を構築してみる。
　今回はEVE-NGのインストールまでをやる。

# EVE-NGとは？
　EVE-NGのホームページによると、CiscoやJuniperをはじめたくさんのベンダ機器を仮想的に構成できるネットワークエミュレータらしいです。

# freeRouterとは？
　まだ使ってないので必要に応じで追記するが、OSSのネットワークOSみたい。
 OSSなので誰でもダウンロードできる上に、結構新しいプロトコルも実装してる。

# 参考サイト
- 本記事のきっかけになったサイト
    > [SR-MPLS+EVPNのL2VPNをfreeRouterでやってみた](https://qiita.com/k-maki/items/5b3e705cb3948e2b5664)
- Hyper-Vの有効化はこれを参考
    > [Windows 11 に Hyper-V 機能をインストールする方法](https://qiita.com/mmake/items/cd96a0c59226e8460af6)
- EVE-NGのインストールはこれを参考。一部我流でやったのでそこは後述。
    > [How to install EVE-NG on Microsoft Hyper-V](https://aboutnetworks.net/eve-ng-on-hyper-v/)

# ①EVE-NGのダウンロード
ここからはこのサイトに倣って進める。
[How to install EVE-NG on Microsoft Hyper-V](https://aboutnetworks.net/eve-ng-on-hyper-v/)
といいつつだが、1.1の手順ではUbuntuではなくEVE-NGを公式サイトからダウンロードしてくる。

- EVE-NG公式
https://www.eve-ng.net/index.php/download/

- PRO版はライセンス購入が必要。Community版は無料っぽいのでCommunity版をダウンロードします。
- 「EVE-NG Live ISO – MEGA Mirror」をクリックしてダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249946/43bc9ad5-3106-9da4-e5d5-ee3e0327f049.png)

# ②Hyper-Vで新しいVMを作成する
 参考サイトの手順1.2の通りVMを作成する。
 
 **ポイント**
- セキュリティの設定からセキュアブートのチェックを外すこと
外さないとISOイメージの起動ができない。
- ここでインストールするOSはUbuntuではなく、手順1.でダウンロードしたEVE-NGのISOファイルを使うこと。


# ③EVE-NGのセットアップ
　参考サイト上だとLanguageなどの設定を行うが、EVE-NGを直接インストールした場合はなぜか不要だった。
 （よく手順を読まずにEVE-NGを最初からインストールしたらなぜかうまい具合に行ったので、あとあと問題が出たらごめんなさい！）

# ④EVE-NG プリインストール
参考サイトの手順の2.1と2.2はサイトの通り実施しましょう。

**ポイント**
- 初期のログインパスワードは下記です
login:root
pass:eve 
- 手順の4.3~4.5はEVE-NGをVM作成時にインストールした場合はすでに設定済みになっているので不要

# ⑤EVE-NG コミュニティのインストール
手順の4.は参考サイト通りに実施します。
最後にブラウザからEVE-NGにログイン出来たら準備は完了です。
お疲れ様でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249946/281e6e8f-c96c-312c-1976-eb1918710289.png)


# まとめ
　今回はWindows11に標準で具備されているHyper-Vを有効化して、VM上にEVE-NGをインストールしてみました。
 ちょっと我流でやったところがあるので、備忘録として残しつつ、問題が起こったらまた戻ってきたいと思います。
 次回はfreeRouterを入れていきます。
Fedora39でminikube - pod確認(1)

[Fedora39でminikube - nodeにssh接続(1)](https://qiita.com/intrajp/items/9dab0d53cded70ac3fd0)からの続きです。

ホストマシン(Fedora39)上で、podを確認します。
minikube のノードは1台なので、いっぺんに色々確認できます。

```BASH
fedora:~@$ kubectl_m get po -A
NAMESPACE              NAME                                         READY   STATUS    RESTARTS       AGE
fuse                   workload-identity-test                       0/1     Pending   0              6d17h
kube-system            coredns-5dd5756b68-6qrg5                     1/1     Running   1 (14m ago)    7d15h
kube-system            coredns-5dd5756b68-q96ww                     1/1     Running   1 (14m ago)    7d15h
kube-system            etcd-minikube                                1/1     Running   1 (14m ago)    7d15h
kube-system            kube-apiserver-minikube                      1/1     Running   1 (14m ago)    7d15h
kube-system            kube-controller-manager-minikube             1/1     Running   1 (14m ago)    7d15h
kube-system            kube-proxy-49nh9                             1/1     Running   1 (14m ago)    7d15h
kube-system            kube-scheduler-minikube                      1/1     Running   1 (14m ago)    7d15h
kube-system            storage-provisioner                          1/1     Running   12 (14m ago)   7d15h
kubernetes-dashboard   dashboard-metrics-scraper-7fd5cb4ddc-t45jm   1/1     Running   1 (14m ago)    7d14h
kubernetes-dashboard   kubernetes-dashboard-8694d4445c-wjw2w        1/1     Running   1 (14m ago)    7d14h
```

(参考)[minikube start](https://minikube.sigs.k8s.io/docs/start/)

[Fedora39でminikube - ServiceをDeployする(1)](https://qiita.com/intrajp/items/a284f4fb87fb990e520c)につづく。
仲間内でオンラインミーティングをしようとしたときに、いろいろ探って最終的にSkypeを使うことにした話

## オンラインミーティング
ソフトウェアメトリクスの仲間内で、オンラインミーティングをやろうぜ！と声をかけて募集した後、別で使っていたZoom環境が使えなくなることに気づき、いろいろオンライン会議のシステムを探っていた。結果としてSkypeに落ち着いたのだが、調べた時のメモをここに残しておく。
ちなみに「無償」であることが前提になる。お金がないのである。

## いろいろある
|システム名|会議時間|最大人数|その他|
|---|---|---|---|
|Zoom|最大40分|100人|めっちゃ安定するらしい|
|Microsoft Teams|最大60分|100人？|ビジネスのアカウント使えれば無敵|
|LINEミーティング|制限なし|500人|LINE登録済であることが条件|
|LINE WORKS|最大60分|？|一人でLINEチーム組める、登録不要|
|Skype|最大24時間|100人|品質がいまいちという噂|

## 決め手
日本国内とはいえ、LINEを使っていない人もいる。私も、結構ギリギリまで登録しないように粘っていた。SNSと連絡手段との境界が曖昧なツールは苦手なのである。
また、会議時間は重視したかった。60分の制限は、面倒な会議を切り上げる際には有利に働くが、喋りたい人からすると不完全燃焼になる時間である。しっかり時間を取れるシステムがよい。

というわけで、Skypeを採用した。

## Skype
https://www.skype.com/ja/free-conference-call/
なんと、登録すら不要だということ。逆に不安である。
プロキシを介したhttps接続について調べてみた

## はじめに

先日、wgetを実行しているとプロキシエラーが発生したので、いつも通りプロキシ設定をしていました。
その時、ふと2つの疑問が湧いてきました。

2つ設定しているのはなぜ？
どちらも`http://`と設定しているのはなぜ？

今まではこの辺りの話に疎かったので全く気にしてなかったのですが、最近色々と勉強中だったのでついでに調べてみようと思ったのがことの発端です。

## 前提知識の理解

今回の疑問を解決するためにはhttps、http、SSL証明書、プロキシサーバについて知っておく必要があります。詳しく書き出すとキリがないので本題に必要な部分を簡単に説明することにします。

## http

httpはインターネット上で情報をやり取りするためのプロトコルで、通信内容は暗号化されず平文で送信されます。細かいところは良いので、通信方式のひとつだけど安全じゃなさそう、と思っていただければおっけーです。

## https

名前の通りほぼhttpですが、大きな違いが１つあります。https通信はデータが暗号化される、という点です。暗号化にはSSL証明書というものが必要になります。

## SSL証明書

下記の2つの役割を担っています。
- 信頼できるサイトであることを示す
- 既出だが、https通信の際に、通信内容を暗号化するために使う

## プロキシサーバ

サーバとクライアントの間にある中間サーバ。悪意のあるサイトにアクセスすることを防いだり、キャッシュを利用したレスポンスの高速化などの役割を担っている。
プロキシを介した通信は、クライアント→プロキシ→ウェブサーバ、となることは理解しておいてください。

## プロキシを介したhttps接続について

さて、これで前提となる用語の説明を終えたのでようやく本題に入ります。

プロキシを介したhttps接続ですが、この時プロキシが何をするかというと何もしません。厳密には、CONNECTというメソッドを使ってクライアントとサーバ間をそのまま繋ぎますが、それだけです。そのため、クライアント側でサーバの証明書が正しいか確認できればhttps通信ができます。wgetのプロキシ設定でいえば
```
https_proxy=http://user:pass@proxy.com:port/
```
`https_proxy`の部分がhttps接続用の設定であることを示しており、右側の`http://user～`が利用するプロキシサーバのURLを示しています。

ここまでくると予想できるかと思いますが、`http_proxy`はhttp接続用の、`https_proxy`はhttps接続用の設定になります。このように通信プロトコルごとの設定が必要なので、プロキシ設定には`http_proxy`と`https_proxy`の2つが必要となりわけです。また、基本的にプロキシサーバはhttpでもhttpsでも変わらないので、右側の`http://～`は同じとなるのです。

## プロキシ設定のプロトコルがhttpの理由

なんとなくhttps接続するなら、プロキシのurlも`https://`ではないのか？と思うことがあるかも知れません。(下記設定)

```text
https_proxy=https://user:pass@proxy.com:port/
```

この設定の場合、プロキシに対してもhttps接続をおこなうことになりますので、プロキシサーバのSSL証明書を検証する必要があります。しかし、一般的にプロキシは社内でのみの利用を想定されているため自己証明書を使っていることが多いです。これによって検証に失敗し、接続に失敗してしまいます。

以上の理由から、クライアント-プロキシ間の通信はhttpを使うことが多くなっており、いつものプロキシ設定ができあがるわけです。

```text
http_proxy=http://user:pass@proxy.com:port/   これはhttp接続用
https_proxy=http://user:pass@proxy.com:port/   これはhttps接続用
プロキシに対しては、httpで接続したいのでhttp://user〜となっている
```

## さいごに

今回はプロキシを介したhttps接続について説明しました。
今まで特に意識していなかったという人はこれを機にどんどん調べていってください！

[webサイト](https://mochinochikimchi.com/)公開してますので、良かったら見ていってください！
[ハンドメイド](https://jp.mercari.com/user/profile/218655300?utm_source=ios&utm_medium=share)、[LINEスタンプ](https://store.line.me/stickershop/product/25451213/ja?utm_source=gnsh_stickerDetail)、[アプリ](https://play.google.com/store/apps/details?id=com.teamdelta.mealmotion)もあります！
AWS Lambda関数作成入門してみます。

# FaaS(Function as a Service)：Lambdaとは
![Arch_AWS-Lambda_64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/1557e3c9-6f10-7eda-a726-f4dbc0d15978.png)

Lambda（ラムダ）とは、AWSのサービスの1つです。
小さな計算をサーバーなしで実行するためのサービスで、サーバレスなコンピューティングサービスなどと言う紹介のされ方が一般的です。関数の種類としては所謂イベントドリブン型と言われるやつで、特定のイベントでトリガーされ、関数が動くという仕組みです。ざっくり過ぎてすみません。


## Lamdaの料金体系
無料枠について。
アカウント作成時はLambdaの場合「1,000,000リクエスト/月」無料で使用可能です。個人開発の範囲であれば越えることはまずないと思います。

## 関数の作成

![スクリーンショット 2024-04-12 19.26.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/a181ad89-8792-041c-3a40-e239a8a475f4.png)


```json
{
"file_name":"a.json"
"author":"keitootiek"
"age":"28"
}
~
~

~
"a.json" 5L, 53B
```

↑jsonファイルのサンプル。
①関数名　・・・何をするための関数か。自他共に分かりやすい関数名をつけましょう。
②ランタイム ・・・デフォルトだとNode.jsですが、RubyやPython、Goなども選択できますよ。ビジネスロジックを記述する言語の種類を指定します。

大まかな流れは②で指定したビジネスロジックを関数としてアップロード⇨S3やdynamo　DBなど別のAWSサービスをトリガーとしてセットしておいたLamda関数を実行するというものです。
上述のようにサーバレスなのでサーバ管理が不要であること、ミリ秒単位での課金なので実行しない関数に関しては0円というメリットがあります。

![スクリーンショット 2024-04-14 21.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/a8199651-8072-1c14-05ea-12b50e2e6281.png)

TestとDeployという2つのボタンがありますが、
コードに変更を加えた際にデプロイを行い（Lamdaに変更をアップロード）、テストボタンを推してテストを行う（動作確認）というのが主な使い方です。

![スクリーンショット 2024-04-14 21.32.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/9b65cc9c-fccd-a38d-b93f-90a145a10f49.png)
![スクリーンショット 2024-04-14 21.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/8d02a38b-7a29-1db8-59b7-185a1f007c07.png)

少し下にスクロールすると上の画像のような表示があります。
今回ランタイム設定は特に触りません。
ハンドラというのは、実行する関数です。この場合は「lamda_function」の「lamda_handler」を実行しますよという意味ですね。
必要に応じてハンドラのファイル名を変更して実行する対象の関数を切り替えたい場合などに編集します。

### 作成時の権限
設定⇨アクセス権限⇨リソースの概要でサービスの連携情報（アクセス権限）も確認できます。
Lamda関数の新規作成時にCloudwatch logsに対してのアクセス許可を選択していたので、ここで確認できるというわけですね。
![スクリーンショット 2024-04-14 21.58.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/8a187b13-3028-6df6-4091-77abd7c24e87.png)

## いざTEST
![スクリーンショット 2024-04-14 22.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511203/a8419b79-b9ca-f8b4-59aa-5580fc591421.png)

デフォルトのままなので当然っちゃ当然ですが、
問題なくHTTPコード200のレスポンスがレスポンスが返ってきましたね。

これはあくまで雛形なので、Pythonやその他の言語も用いて本格的に関数を作っていくことにも挑戦してみたいと思います。
最後までご覧いただきありがとうございました。
Azure 上 の OpenVPN の NAT を無効化して クライアントと相互通信させる

# はじめに
この記事は、既に 公開済み の 以下の記事に関連する内容です。

下記の記事で NAT を使った VPN 構成が完了している事を前提に、そこから NAT を無効化して 相互通信を構成するまでの手順を説明しています。

https://qiita.com/carol0226/items/7a9160b298b736aa187e

上記の記事の内容で Azure 上 に OpenVPN を展開して VPN 接続で利用ができますが、NAT を使っているので外部から Azure への **片方向** の通信です。

:::note info
**相互ルーティング** まで実現したい人は、上記の構築を済ませたあとに、本記事を参考に、Azure 側の構成変更と、OpenVPN の NAT の無効化を実施してください。
:::

# 構成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/74d05661-27a8-383d-4352-6172f89ef699.png)

- NAT が構成されている場合は、VPN クライアントから、VM への通信は可能だが、VM から VPN クライアントへのルーティングはできません
- 本記事の構成を採用すると、VM から VPN クライアントへのルーティングが可能になります

つまり、上記の図の VM 上から VPN クライアント（192.168.240.10）に向かって、Ping や RDP などのアクセスをすることが出来るようになります。

# 手順１：Azure 側の構成を変更する
OpenVPN の設定で VPN クライアントに割り当てられるネットワークアドレスを把握しておく必要があります。その情報を踏まえて、Azure 側の構成を変更する必要があります。

0. OpenVPN へ 管理者アカウントでサインインします。
　<br>
0. 左ペインで **VPN Settings** を選択して、緑下線の **Dynamic IP Address Network**　を読み取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/fa951278-69f6-dfaf-c5e3-e4724be03c3c.png)
　<br>
0. 以下の記事を参照して、NIC の IP 転送 や ルートテーブルを構成します。
その際に、アドレス空間やルーティングの宛先に、上記で読み取ったネットワークアドレスに読み替えて設定するようにしてください。

https://qiita.com/carol0226/items/8d89da5aeba8a3ddb9bd

# 手順２：NAT の無効化
0. OpenVPN へ 管理者アカウントでサインインします。
　<br>
0. 左ペインで **VPN Settings** を選択して、**Routing** 設定 で、赤枠部分の **Yes, using Routing** を選択します。
**Specify the private subnets to which all clients should be given access** の欄には、Azure 仮想ネットワーク のネットワークアドレス を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/b4baf9ff-1e23-d492-b84b-8b2ca6956df0.png)
　<br>
1. 画面を一番したまでスクロールして、**Save Settings** ボタンを押して、設定を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d3ac9761-5d1b-cad5-aa53-3029968a167a.png)
　<br>
0. これだけでは、まだ設定が反映されていません。
以下の画面で **Update Running Server** を押して反映させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/dd33dc2e-0f51-e21f-d081-e6d01ebdde57.png)
　<br>
0. 以下の表示がでれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9a5a8f6b-6551-47d5-eb57-4bee7cee9b32.png)

以上の手順で OpenVPN の NAT が無効化され 相互に通信ができるようになったはずです。

# Next Step
この時点で OpenVPN で接続したクライアントと Azure 側のホストが 相互にルーティングできていると思います。

しかし、OpenVPN に VPN 接続を行った クライアント とだけしか通信ができません。(**P2S** : Point to Site)

さらに、以下の記事で説明している構成を行うことで、物理拠点や他社クラウドなどの OpenVPN クライアントをルーター化して、各物理ホストが Azure 上のホストと相互に通信ができるようになります。(**S2S** : Site to Site)

https://qiita.com/carol0226/items/aa42320c011976da33fc
SourceTreeとGitLabの連携がうまくいかない時の対処

# はじめに
何度やってもなかなか慣れない環境構築のうちの一つで、 SourceTreeの接続で躓いたので毎度忘れてそれぞれ調べ忘れになることのないように行ったことのメモとして記事にしておきます。


# 発生時の状況
 push時に出たエラー
>git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags --set-upstream origin 
Pushing to https://gitlab.~~~~~
remote: HTTP Basic: Access denied
fatal: Authentication failed for 'https://gitlab.~~~~~'
Completed with errors, see above



# やったこと
1. **SourceTreeの設定の確認**
SourceTree内の設定 ＞ 一般　から
デフォルトのユーザーユーザー情報が間違っていないこと（GitLabアカウントと一致している事？）を確認。


２. **GitLab側の設定の確認**
GitLab右上の自分のアイコンにカーソルを当てた時に表示されるユーザー名や、　settings ＞　profile内の　Emailなどが間違っていないかの確認や、settings ＞　Passwardからパスワードの再設定。

３. pushしたいGitLabリポジトリ内に自分のユーザーが承認されているかの確認
４. SourceTree内のアカウント設定
SourceTreeの設定　＞　アカウント　＞　追加で　アカウントを追加
  * GitLabはホスト項目３種類あるので、確認する
  * ホストの横に入力するURLはリポジトリのURL
  * ユーザー名をGitLabで設定しているユーザー名に揃える
  * Private Tokenには　GitLabの自分のアイコンにカーソルを合わせ settings ＞　Access Tokens　で、トークンを作成する。
作成する際、入力する日付は特に指定がなければ未入力でも構わない。
Scopesの項目は一番上の「api」だけで基本的に問題ないが、必要であればチェックをいれる。
Your new personal access tokenを　SourceTreeのPrivate Tokenに記入。
  * 今回はHTTPSでの接続だったのでプロトコルはHTTPSに設定　


５. Mac内のキーチェーンを再設定
MacのLaunchLaunchPadからキーチェーンアクセスを選択
GitLabアカウント名などで検索をかけてPC内で以前設定したパスワードなどを削除する
次回プッシュ時やアカウント接続時に「Passward Required」で再度設定し直す。

６. ↑の「Passward Required」設定時にユーザー名があっているか確認
「Passward Required」のダイアログ内のメッセージにユーザー名やホストが表示されるのでそれに間違いがないか確認する
間違っている場合は SourceTree右上の設定　＞　高度な設定内の
グローバルユーザー設定を使うのチェックをはずし、名前・メールアドレスをGithabと同じものにする
また、高度な設定の左下のConfigファイルの編集で

```
[remote "origin"]
	url = <ホスト先のURL>
	fetch = +refs/heads/*:refs/remotes/origin/*
    pushurl = https://<ユーザー名>:<パスワード>@<urlのhttps://より下>

```
これを入力して閉じる


これでpushに成功しました！
最後のものが決め手になったのは間違いないのですが、それ以外のものは実際どれが必要になるかはわかりません。

参考にする際は、順番に確認しながらやっていくことをお勧めします。



参考

https://qiita.com/ryunosuke0922/items/15fa3ed9d5f35f497511

https://community.atlassian.com/t5/Sourcetree-questions/SourceTreeでクローンができない/qaq-p/2105611

https://note.com/tamagooo/n/n71e8df2a96c0
Figma APIを叩いてみる

# 背景
figmaからstylesを取得したい
design-tokenの管理方法を模索中

# やること
1. figmaのaccess tokenの作成
1. figmaでstylesを定義
1. stylesをteamに公開
1. apiを試す

# figmaのaccess tokenの作成
ホーム > アカウント名 > Settings > Personal access tokens > Generate new token
- Token nameを入力
- Expiration（有効期限を決める）
- Scopes（権限を決める）
- 「Generate token」をクリック
- 生成されたtokenをコピーして保存

![スクリーンショット 2024-04-14 21.14.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/55aa276c-fee5-9764-b2ba-fae693ba3ebc.png)

# figmaでstylesを定義
- local stylesの「＋」ボタンをクリック
- 追加するスタイルを選択
- 色とスタイル名を追加する

![スクリーンショット 2024-04-14 21.20.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/a8e9b10f-d207-4413-9e00-fd3cd66de3b5.png)

![スクリーンショット 2024-04-14 21.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/98a4e2e5-caa8-0291-a26f-bc9341c07c88.png)

# stylesをteamに公開
Assets > ブックマークのボタン
- teamに公開するlibraryを選択
- 「publish」ボタンをクリック
- 変更内容を確認して「publish」ボタンをクリック

![スクリーンショット 2024-04-14 21.26.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/2a7686ab-faa8-9527-1a44-d5ece29762be.png)

![スクリーンショット 2024-04-14 21.28.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/12f43d4c-0cfa-fd1c-6763-c34a5a07fc81.png)

![スクリーンショット 2024-04-14 21.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/bd00d17b-f903-25d7-077d-2bc4c0775c29.png)


# apiを試す
postmanを使ってresponseの確認
必要な値
- personal access token（先ほど生成したもの）
- key（該当のページのURLから取得）
#### 該当のページのURL
```
https://www.figma.com/file/{key}/{title}?...
```
fileの次にある値がkey

#### postmanのGetの設定
- Header（key: X-FIGMA-TOKEN ,value :personal access token）
- v1/files/key/stylesがエンドポイント
- 「send」をクリックしてデータを取得できたら成功

![スクリーンショット 2024-04-14 21.40.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/c37ef6d6-c87e-13f4-148a-44cf7afdfdc2.png)

# 最後に
### 残念なこと
variables/localというエンドポイントもあるが、エンタープライズプランじゃないと使えない。variablesでtoken設定しようとしてたけど断念。
figma tokensに課金するのやめてfigmaのproに課金したのにvariablesが取得できないので気づかなかった。プラン内容ちゃんとみるべきだった。
variablesを気に入ってたのに。。

![スクリーンショット 2024-04-14 21.43.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/10054885-17c7-2ac8-175f-0e20b723e8bf.png)

![スクリーンショット 2024-04-13 23.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689380/482eb260-1d6a-b3a3-4cdf-44a85bb93c47.png)



# 参考
[【必見】Figma APIの使い方 | デザインツールのFigmaがもっと便利に！活用アイデアも紹介](https://enlyt.co.jp/blog/figma-api/)
配列の基本

###
配列の定義について
##
**宣言**
配列の変数名は複数形にしておくと分かりやすい。

```java
//要素5個の配列
int[] scores = new int[5]; 
```
##
**配列へ値の代入**
添え字（インデックス）は0から始まる。
```java
//例：5人の点数を代入する
int[] scores = new int[5];
scores[0] = 10;
scores[1] = 30;
scores[2] = 50;
scores[3] = 25;
scores[4] = 100;
```
##
**配列の初期化**
宣言と代入を同時に行う。
要素数を指定せずとも、勝手に箱を用意してくれる。
```java
int[] scores = {10, 30, 50, 25, 100};

```
##
**要素へのアクセス**
配列名[取り出したいインデックス数]　のように指定する。
インデックス数用の変数を指定すると、for文など動きがある場合に便利。
```java
int[] scores = new int[2];
scores[0] = 10;
scores[1] = 30;
//取り出し
int score1 = scores[0];

// 応用
int index = 1;
System.out.println(scores[index]); // 30と出力
```
##
**配列と拡張for文**
score が実際に出力される変数。
scores配列に格納されたデータを、インデックス順にscoreという入れ物に入れる。
表示が終わったら次のデータを入れ直す。このscoreは一時的な入れ物のイメージ。
```java
//順に10, 30, 50, 25, 100と出力
public class Lesson {
    public static void main(String[] args) {
        int[] scores = {10, 30, 50, 25, 100};
        for (int score : scores) {
            System.out.println(score);
        }
    }
}
```
Python-came3

What is BIF
BIF is BUilt-in function
dir(__builtins__) can show all BIF but can not run it in Vscode.
It can only be functional in IDLE.

practice
""" 用Python设计第一个游戏 """

temp = input("请输入1-100之间的数字：")

number = int(temp)

if 1<= number <=100:
    print("你妹好漂亮") 
else:
    print("你大爷好丑")
Firebaseを使ってクラッシュを集計するログを仕込む

# はじめに
今回はFirebaseCrashlitycsを使ったクラッシュの集計方法を紹介していきます
### 本文
仕込む場所は`runCatching`や`try catch`の中で大丈夫です
下記のようにThrowableを引数として渡すことでエラーの内容を集計してくれます
```kotlin
runCatching {
// hoge
}.onFailer {
Firebase.crashlytics.recordException(it)
}
```
### 最後に
今回はFirebaseCrashlitycsを使ったクラッシュの集計方法を紹介しました
どなたかのお役に立てれば幸いです
New Operating System patch is available

## A system update is available for your DB instance.

ある環境のAurora MySQLのDBインスタンスで、「ログとイベント」タブの「最近のイベント」に以下のような表示がされた。

```
April 12, 2024, 03:03 (UTC+09:00)	A system update is available for your DB instance. For information about applying updates, see 'Maintaining a DB instance' in the RDS User Guide.

April 12, 2024, 15:34 (UTC+09:00)	Applying off-line patches to DB instance
April 12, 2024, 15:38 (UTC+09:00)	DB instance restarted
April 12, 2024, 15:38 (UTC+09:00)	Finished applying off-line patches to DB instance
April 12, 2024, 15:40 (UTC+09:00)	Replication for the Read Replica resumed
```

深夜3時3分に「A system update is available for your DB instance.」という表示がされたようだ。
その下の行はそのアップデートを適用したときのもので、6分ほど時間がかかったように見える。

**別の環境でも当然同じアップデートが来ているのではないかと思い**、同じ「最近のイベント」を2週間の範囲で表示してみたが、特に表示はされなかった。「？」
どういうことだろうか。ローリングアップデート的なもので、まだ来ていないだけなのか？

実際には、「メンテナンスとバックアップ」タブの「保留中のメンテナンス」に表示があった。

|項目 | 値 |
|---|---|
| 説明|New Operating System patch is available|
|タイプ|system-update |
|ステータス | 利用可能 |
| 日付の適用 | - |

同じ種類のアップデートなのか分からない。いつこの保留中のメンテナンスが現れたかも分からない。

[ドキュメント - DB インスタンスのメンテナンス](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Maintenance.html) によれば、
`aws rds describe-db-instances --db-instance-identifier {db_instance_name}` の `PendingModifiedValues` で内容が見られるらしい。
`"PendingModifiedValues": {},` と表示された。殺意しか湧かない。

まぁ、いずれにしてもアップデートしておいた方が良いということでアップデートした。

```
April 14, 2024, 21:23 (UTC+09:00)	Applying off-line patches to DB instance
April 14, 2024, 21:23 (UTC+09:00)	DB instance shutdown
April 14, 2024, 21:27 (UTC+09:00)	DB instance restarted
April 14, 2024, 21:28 (UTC+09:00)	Finished applying off-line patches to DB instance
```
公開モジュールが非公開モジュールに依存していないか確認する

ライブラリプロジェクトではマルチモジュール構成を作っておき、サンプルアプリがあって、それが公開するライブラリモジュールを参照していて〜という構成を取る場合が多いと思います。

例えば、ライブラリの開発中・デバッグやテストにのみ使うものを集めたモジュールもあったとしましょう。あくまでライブラリの開発のためのものなので公開していないとします。
その場合、公開モジュールが意図せずこのモジュールに依存してしまい、このプロジェクト上ではビルドが通りますが、非公開モジュールは当然mavenリポジトリにないのでpublishした後にビルドが通らないことに気づく、なんてことになりかねません。

とまあ、チョット特殊な事情ですが、CIとかでチェックしたいなーと思ってたんですが、
最近自分で投稿した記事を眺めてみると。

https://qiita.com/ryo_mm2d/items/19a751e7471f195e4215

dependency-guardで依存関係チェックできますよね。

https://qiita.com/ryo_mm2d/items/500cdf25289627cf8be2

publishプラグインを使っているモジュールを抽出することもできますね。

……💡
かんたんにできそうじゃね？

# 試行錯誤

ライブラリプロジェクトのサンプルアプリでチェックしてみましょう。
allowFilterで通知されるものってどんなものか見てみましょう。

```build.gradle.kts
dependencyGuard {
    configuration("releaseRuntimeClasspath") {
        allowedFilter = { name ->
            println(name)
            true
        }
    }
}
```
結果
```
...
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0
org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0
org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0
org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.0
:lib
androidx.appcompat:appcompat:1.6.1
androidx.activity:activity:1.8.0
...
```

ライブラリはそのまま「グループID：アーティファクトID：バージョン」
モジュールについては「:モジュール名」
と、implementationで指定するIDになってます。

ということで、モジュール名の場合に判定を入れましょう。雑に「:」から始まってるでいいかな？
projectは名前から取得して、pluginsにhasPluginってのがあるからこれで判定できそうですね。

```build.gradle.kts
dependencyGuard {
    configuration("releaseRuntimeClasspath") {
        allowedFilter = { name ->
            if (name.startsWith(":")) {
                println(name)
                println(project(name).plugins.hasPlugin("org.gradle.maven-publish"))
            }
            true
        }
    }
}
```
結果
```
:lib
true
```
判定できていそうですね。

# 依存モジュールが非公開の場合にエラーとする

というわけで以下のような条件を書いておけば、非公開のモジュールが依存関係にある場合、エラーになります。

```build.gradle.kts
dependencyGuard {
    configuration("releaseRuntimeClasspath") {
        allowedFilter = { name ->
            if (name.startsWith(":")) {
                project(name).plugins.hasPlugin("org.gradle.maven-publish")
            } else {
                true
            }
        }
    }
}
```

以上です。
おうちk8sをやってみて


# はじめに

[こちらの記事](https://qiita.com/takumi3488/items/2eb4692a5672ee475998)に感化され、元々興味があった k8s を自宅で構築してみました。
今回はおうち k8s をやってみてよかったこと等をつらつら書いています。

ちなみに、我が家の k8s は [Raspberry Pi 4](https://www.amazon.co.jp/-/en/gp/product/B089GSG8Y1/ref=ppx_yo_dt_b_asin_title_o00_s02?ie=UTF8&psc=1) で構築しており、kubeadm によるセットアップを行いました。minikube でもおうち k8s はできると思いますが、ラズパイなどでクラスターを組めば、富豪的に k8s を利用してスペック不足になっても、ハードの追加による解決が簡単なことが推しポイントです。[^1]

今では、メモリ 8GB が 3 台、メモリ 4GB が 2 台の計 5 台の Raspberry Pi 4 で構成し、マルチコントロールプレーン構成をしています。初期は 8GB が 1 台、 4GB が 2 台のシングルコントロールプレーン構成でしたが、エコシステムなどをたくさん追加した結果、スペック的に辛くなり、せっかくなのでということで+2 台追加し、さらにマルチコントロールプレーン構成にしました。[^2]
必要な諸々を Amazon で購入し、合計で 10 万円程度は使ったと思います...(大人っていいですね)

## とにかく学びが多い

前提として私は k8s に関する有名どころの書籍を結構読んだりしていたのですが、やはり実際に触ってみると改めて学べたことが多かったです。例えば以下のような学びがありました。[^3]

- k8s の Node 前提条件
- k8s のアーキテクチャ全体像や各コンポーネントの役割
- 通信や認証で利用される各種証明書の存在
- taints/tolerations によるノードへの Pod (非)スケジューリング
  - 私の環境では節約のためにコントロールプレーンにも Pod をスケジューリングするように設定しています。
- CNI プラグインの設定による Pod 間通信
  - CNI プラグインなしでは Pod 間通信ができないことを知りました。
- マネージドサービスのありがたさ
  - コントロールプレーンの設定から運用まで、LoadBalancer や PV 等のいい感じのデプロイから、マネージドサービスのありがたさを痛感しました。
- k8s や Linux のトラブルシューティングについて
- 各種エコシステムについて
- などなど...

上記はおうち k8s を行わずとも学べることも多いですが、実際に動かすことで理解が深まったり、そもそも理解しないと前に進めないことも多く、強制的に学べたことが良かったと思っています。
また私は Linux や Linux の関連技術に対する知識も十分にはなかったので、セットアップやネットワーク設定、ツール、コマンドなど、改めて学べることが多かったです。

まだまだわからないことは多いですが、知らないことを知れたのでこれからどんどん学んでいければと思います。

## 一度組めば[^4]電気代だけで様々なエコシステムを試せる

k8s の魅力の一つに「様々なエコシステム」があると私は思っています。各エコシステムの Why や How を知るためには多くの時間を割いて実際に試してみる必要があると思います。
パブリッククラウドを利用してエコシステムを試すことはできますが、個人利用であれば金額面がネックになってきます。試してすぐにクラスター毎削除することで節約できますが、このやり方だと、

- 長期的に試すことが難しく、エコシステムの良さがわかりにくい可能性がある
- そもそも試すのに腰が重い

というデメリットがあるかと思います。特に２つ目のデメリットは、学習という観点では一番厄介かなと個人的には感じます。

おうち k8s であれば、電気代だけで k8s を動かせるので、エコシステムを気軽に試すことができます。また、長期的に試すことも、ほったらかしにしておくことに対しても心の余裕があります。そのため、私は気になったエコシステムはとりあえずインストールしてみることにしています。

余談ですが、k8s のエコシステムは helm や少ないコマンドでインストールできるものが多いので、気軽にインストールできるのも魅力だと感じました。

ちなみに私が試してみたエコシステムは以下の通りです。

- cilium
- tekton
- argocd
- argo rollouts
- prometheus
- metallb
- grafana
- istio
- loki
- jaeger
- などなど

今後は fluentd、fluentbit、eBPF を利用しているサービスメッシュなどを試してみたいと思っています。また、これらエコシステムは導入しただけのものも多いので、良さがわかるまで使い倒していきたいと思います。(これが電気代だけでできるのはありがたいです。)

## プラスな評価をされることが多かった

こちらは私がまだ経験が浅い人材という背景もあるかと思いますが、おうち k8s に関してはプラス評価されることが多かったです。例えば以下のようなことがありました。

- 職場で k8s 関連の話題が出た際に、適宜意見を求められることが多くなった。
- 転職活動にて評価されることが多く、実務経験が足りていない場合でも、おうち k8s での経験が評価された。

私自身実務での経験は浅いのですが、おうち k8s での経験が評価され、面接の際に話題にされることが多かったです。技術力だけではなく、意欲という面でも評価していただけたことが何度かあり、ありがたかったです。

## 終わりに

おうち k8s は楽しいですし、メリットしかないと思っています。学びが多いし、エコシステムを試すことができるし、人から褒められることも多い(多分)です。これからもおうち k8s で学び続けていきたいと思います。

ただ、実務としての k8s 利用ではないので

- どのようにクラスターや namespace を切るのが良いか
- GitOps するならどういうリポジトリやディレクトリ構造が良いか
- エコシステムの選定はどうするか
- エコシステムのバージョンアップはどうするか

などの課題を学ぶのは難しいなーと感じています。ここら辺は、いつか実際に実務で経験、議論してみたいと思いました。

また、今後もおうち k8s で k8s や各種エコシステムについて学び続けていきたいと思います。

[^1]: これが札束で殴るってやつですかね？
[^2]: ラズパイなどのハードウェアを家に設置する場合は、家族や同居人に許可を取ってからにしましょう！(私の同棲相手は「光っててカッケー」と言ってくれました。ありがとうございます。)
[^3]: 以下の設定は kubeadm 特有のものである可能性があります。ご了承ください。
[^4]: と言いつつ、冒頭話した通り、一度組むのに 10 万円ぐらいかけたんですよね...
Rails modelに項目追加でエラーにあったので、情報を共有します

# Rails：既存のテーブルに対しての項目追加とattributeについて

Railsで、TODOを管理するアプリを開発中の際に、
既存のテーブル(Todoテーブル)に対して、項目を追加する際の手順について解説します。

項目を追加する際に「attribute」の考え方やモデルとテーブルに対する認識が誤っていたため、
うまく項目を追加できずにエラー解決のために時間を要したため情報を共有します。

## まず、attributeメソッドとは

例えば、todoテーブル、todoモデルを作成済みだと仮定してTodoモデルに「attribute :test, :string」を追記します。

```todo.rb
class Todo < ApplicationRecord
  attribute :test, :string 
end
```
すると、コンソール画面でTodoモデルがtest項目を所持しているように見えるのですが、test項目に対してデータを保存することはできません。
これはあくまで、Todo**モデル**にtestというメソッドがあるだけで、
Todoテーブルにはtestという項目は作成されていないため.saveメソッドを実行しても
Todoモデルのtestメソッドの内容がTodoテーブルに保存されることはないです。

## 認識が間違っていた部分
Railsにおけるmodelとmigrateファイルについての理解が甘かったです。
modelはあくまでDBにあるテーブルを扱いやすくしたclassであり、model＝tableではないということを学びました。
Railsでテーブルに項目追加や、indexを付与する際は、
SQLを直接実行するか、migrateファイルを作成して、「rails db:migrate」しないとテーブルに対する変更はできないと学習できました。

## 補足：migrateファイルを作成してテーブルに項目追加する方法
項目追加するためには、以下のコードを実行する

```
rails generate migration AddTitleToTodo title:string
```
すると、新たにmigrateファイルが作成され、以下の内容のmigrateファイルが作成される

```20240414104912_add_title_to_todo.rb
class AddTitleToTodo < ActiveRecord::Migration[7.1]
  def change
    add_column :todos, :title, :string
  end
end
```

その後に、
コンソールで「rails db:migrate」を実行し先ほど作成したmigrateファイルを実行する

以上の操作で**テーブル**に対しての項目追加が完了しているはずです。
WSL2で3D Gaussian Splatting (splatfacto) を試してみた

# 0. 動作環境

- WSL2（Windows11内でUbuntu22.04環境を作成）
- GPU: RTX 4070 (12GB)

https://qiita.com/astaka/items/c3fb5ba4b4572d540960

# 1. 準備

3D Gaussian Splatting (3D-GS) のソースコードは[公式実装](https://github.com/graphdeco-inria/gaussian-splatting)含めていくつかあるが、今回は[nerfstudio](https://github.com/nerfstudio-project/nerfstudio)内に実装されている[splatfactoモデル](https://docs.nerf.studio/nerfology/methods/splat.html)を利用する。

https://docs.nerf.studio/nerfology/methods/splat.html

CondaやPipで環境を作ることもできるが、今回はDockerを利用する。以下の手順に従ってインストールする。

:::note
Splatfactoは**バージョン1.0.0**から利用可能（**この記事では最新の1.0.3を使用**）
:::

https://docs.nerf.studio/quickstart/installation.html#use-docker-image

公式のDocker ImageをPullすれば、ソースコードをCloneしなくても学習コマンドを叩けるが、ソースコードを直接改変できるほうが便利なので、githubリポジトリ内のDockerFileを使ってコンテナを作ることにした。

:::note warn
配布されているDocker ImageのPull `docker pull dromni/nerfstudio:1:0:3` も試したが、筆者の環境ではコンテナを立ち上げられなかった（0.3.4までは問題なく立ち上がったが...）。
:::

## 1.1 インストール

```
git clone https://github.com/nerfstudio-project/nerfstudio.git -b v1.0.3
cd nerfstudio
```

## 1.2 Docker起動
:::note
OSやCUDAのバージョンがデフォルトと異なる場合は、ソースコード内のDockerFileの中身を書き換える。デフォルトは、`ARG CUDA_VERSION=11.8.0` `ARG OS_VERSION=22.04`となっている。
:::
```
docker build --tag nerfstudio -f Dockerfile .

docker run --gpus all \
    -v /home/${USER}/nerfstudio_103:/workspace \
    -p 7007:7007 \
    -it \
    --shm-size=12gb \
    --name nerfstudio_103 \
    nerfstudio
```

# 2. データセット準備

`ns-download-data`コマンドで配布されているデータセットをダウンロードすることができる。

https://docs.nerf.studio/reference/cli/ns_download_data.html#nerfstudio

カメラやスマートフォンを使って自前でデータセットを用意し、学習に利用することもできる。筆者はミラーレスカメラで撮影した画像を利用することにした。

https://tech.dentsusoken.com/entry/nerf_tips

以下が学習に利用する画像。単一のオブジェクトが被写体の時は30枚程度でも十分か。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882064/17b51901-4a93-d907-7bd1-441725beb381.png)


撮影したデータは、`nerfstudio/data/${MODEL}/input` に配置し、前処理
```
ns-process-data images --data data/${MODEL}/input --output-dir data/${MODEL}
```
を行う。

Nerfactoとsplatfactoのどちらも**学習に利用するデータフォーマットは同じ模様**。

# 3. 学習・レンダリング
```
ns-train splatfacto --data data/${MODEL}
```
学習の様子はGUIで確認できる。学習時間はデフォルトの30000 stepsで10分程度。
疎点群 `sparse_pc.ply` が `data/${MODEL}/` に書きだされるところがnerfactoとの違いか。

|  | Nerfacto  | Splatfacto  |
|---|---|---|
|学習 (30000 steps)  |約20分  |**約10分**  |
|レンダリング (450 frames)  |6分48秒 (1.10fps)  | **4秒 (123.21fps)**  |
|レンダリング結果 (640 x 480)|![nerfacto.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882064/5455b3fc-69fc-52b0-ec82-1b54fb4af74a.gif)|![display.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882064/4b0b32dc-542c-dd8f-d7ed-230967e52a07.gif)|

# 4. 所感と注意点

- 前評判通り、3D-GSベースのsplatfactoではNeRFベースのnerfactoよりもフローターが少なくてきれいな印象。**レンダリング速度はnerfactoよりもsplatfactoが圧倒的に早い**。
- ソースコード内の**DockerFileからしか起動できなかった**のがハマりポイント
- 6000×4000の画像でも学習は余裕で回り（4GBもいかない）、ビューア (GUI) も問題なく操作できたが、**レンダリング `ns-render` ではメモリオーバー**になった
- **3000×2000**ではGPUメモリ12GBでもレンダリング可能

# 5. 参考

https://zenn.dev/big_tanukiudon/articles/622d07bb20f0bc

https://snowsystem.net/other/windows/wsl2-fixed-memory-allocation/