OmniAICreator/Qiita-1.07M huggingface dataset:
jq コマンドで json の特定のフィールドを削る・抽出する

## json例
```json
	             {
                     "response": {
                       "num": 2,
                       "object": [
                         {"id": "a1", "name": "名前1", "price": 1000, "updated_at": "2024-06-26"},
                         {"id": "b2", "name": "名前2", "price": 2000, "updated_at": "2024-06-30"}
                       ]
                     }
                  }
```

## 抽出　
```dart
// object内の配列を抽出
echo '{"response": {"num": 2,"object": [{"id": "a1", "name": "名前1", "price": 1000, "updated_at": "2024-06-26"},{"id": "b2", "name": "名前2", "price": 2000, "updated_at": "2024-06-30"}]}}' | jq '.response.object[].id'

"a1"
"b2"

// numとobjectを抽出
echo '{"response": {"num": 2,"object": [{"id": "a1", "name": "名前1", "price": 1000, "updated_at": "2024-06-26"},{"id": "b2", "name": "名前2", "price": 2000, "updated_at": "2024-06-30"}]}}' | jq '.response.object[],.response.num'

{
  "id": "a1",
  "name": "名前1",
  "price": 1000,
  "updated_at": "2024-06-26"
}
{
  "id": "b2",
  "name": "名前2",
  "price": 2000,
  "updated_at": "2024-06-30"
}
2
```

## 削除 del
使い所：新旧のレスポンスの差分を見るときにいらないところを削除する
　　　　update_atだけ異なるので削除したい場合
```dart
//update_atだけ削除
echo '{"response": {"num": 2,"object": [{"id": "a1", "name": "名前1", "price": 1000, "updated_at": "2024-06-26"},{"id": "b2", "name": "名前2", "price": 2000, "updated_at": "2024-06-30"}]}}' | jq 'del(.response.object[].updated_at)'

{
  "response": {
    "num": 2,
    "object": [
      {
        "id": "a1",
        "name": "名前1",
        "price": 1000
      },
      {
        "id": "b2",
        "name": "名前2",
        "price": 2000
      }
    ]
  }
}
```
JISOUコミュニティのイベントを通して

## 初めに
今期、僕が所属しているJISOUというコミュニティにて、HARD DAYというイベントがありました。
簡単にいうとみんなで一緒に作業するだけではなく、コミュニケーションを取りながら作業をして、時には筋トレも挟むというまあまあハードなイベントです！
ハードですが、イベントを通して得られた学びが膨大にあるので、その内容を以下に共有させていただきます。

## 他の人と作業をするメリット
結構React学習している人には多いんじゃないと思うのですが、自己学習って基本1人で作業することが多いです。
僕自身も1人で学習することが多いです。
これが今回のイベントで一番参加して良かったと思うことなんですが、**みんなと作業することで自分のレベルの低さを知ることができました！**

まさに「井の中の蛙」状態になっていたので、他の人のレベルの高さを実感することで、まだまだやれるなと感じました

## コードのリファクタリングについて
以下の記事を参考にしています。

https://qiita.com/KNR109/items/3b14e2e8f89a33c0f959

リファクタリングというと、長いコードをコンポーネント化して見やすくすること。
このように考えていました。
ですが本質は**コードを読みやすくすること**です。

例えば以下の2つのコードどちらがみやすいですか？
```javascript
 if(line.split(":")[0].trim() === "admin"){
     // 処理
  }
```
```javascript
  // 説明変数を定義する
  const user_authority = line.split(":")[0].trim()
    if(user_authority === "admin"){
      処理
    }
```
最初の方がコードの記述量が少なくスマートに見えますが、いざ読むとなると2つ目のコードの方が読みやすくないですか？
このようにただ短くするだけが、リファクタリングではないことを学びました。

それ以外にも
・**関数名をわかりやすくする**
```javascript
const getRecord = ....
```
こちらは学習記録アプリのコードの一部です。
こちらの変数だと、何か記録を取得する関数だとわかりますがなんの記録かわかりません。
以下のように修正することで、わかりやすくなります。
```javascript
const getStudyRecord = ...
```
・**処理の内容をコメントアウトで記述する**
```javascript
 useEffect(() => {
    const getAllRecords = async () => {
      const StudyRecordsData = await GetAllStudyRecords();
      setTodos(StudyRecordsData);
      setIsLoading(false);
      console.log(StudyRecordsData);
    };
    getAllRecords();
  }, []);
  ```
```javascript
 useEffect(() => {
    const getAllRecords = async () => {
      //supabaseから取得したすべての学習記録をStudyRecordsDataに格納
      const StudyRecordsData = await GetAllStudyRecords();
      
      //recordsの内容を取得したデータに書き換える
      setRecords(StudyRecordsData);
      
      //Loading状態をfalseにする　（これは関数名から処理が予測できるので無しでもいいです）
      setIsLoading(false);
    };
    getAllRecords();
  }, []);
```

最初と後の記述だと、後の記述の方が断然見やすいと思います。

このようにコンポーネント化することだけが、リファクタリングではないことを学べました！

## ポモドーロテクニックについて
あまり詳しくはないのですが、今回のイベント内での作業はポモドーロテクニックを使用して作業しました。
ポモドーロテクニックとは25分作業して、5分休憩。
これを１セットとして、最大４セット行います。
その後の休憩は5分ではなく長めの休憩を取る方法です。

これを実践することで、**わからなくて嫌になりそうな気持ちも一度リセットできる**ので、集中力が長続きした気がします！

https://asana.com/ja/resources/pomodoro-technique

## 作業の合間の筋トレ
これは僕も以前から実践していたのですが、筋トレの後の作業ってめっちゃ捗るんですよね。
あと自己学習って自分との勝負する場面が本当に多いのです。
辛い筋トレを行なって体の脂肪だけではなく**心の脂肪を落とせる**メリットもあります。
**もうこれは言葉ではなく体感してみてください！！**
（僕のおすすめはバーピージャンプ 30秒 × 5セットです！）

## まとめ
今回のイベントに参加して、Reactの知識を学習する上で自分1人では学べないことが本当に多くな学べました。
僕自身1人で作業することが嫌いではないのですが、自分のスキルアップのためにも、他の人と作業することは本当に重要だなと感じました！

## 最後に
プログラミングコーチングJISOUではメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？

気になる方はぜひHPからお願いします👇

https://projisou.jp/
【Nerves】WindowsのUSB Ethernet/RNDIS Gadget driver 問題

# 課題

Raspi zero W等、USBのGadgetモードに対応している機器は、ホストのPCとUSBケーブルで接続すると、Raspi側が、Ethernetデバイスの様に動作して、TCP/IPでの通信ができるようになります。

しかし、最近のWindowsには、このドライバーが用意されておらず、機能しません。

# 解決策１

Nerves Livebookのドキュメントでは、次のように説明されています。

https://github.com/nerves-livebook/nerves_livebook?tab=readme-ov-file#special-windows-setup

Windows11で試してみました。cabファイルをダウンロードする事は出来たのですが、infファイルが無いためか、このドライバーを読み込ませる事はできませんでした。

# 解決策２

https://forums.raspberrypi.com/viewtopic.php?t=347973

この質問にある、[mod-duo-rndis.zip](https://modclouddownloadprod.blob.core.windows.net/shared/mod-duo-rndis.zip)を使用してみました

Raspi zero Wを接続して、comポートとして認識されている状態にして、comポートに対して、mod-duo-rndis.zipのドライバーを適用したところ、認識されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/fcfc770a-b43d-8c07-41fe-6b97d4e117e4.png)

Windowsのブラウザーからnerves.localに接続してLivebookに接続する事もできました。

# 改善したいこと

WSL側からssh nerves.localしても接続ができません。mDNSを見に行ってないらしい。
Windows側は、ブラウザーでも、コンソールでもssh nerves.localで接続できます。
Raspberry PI OS (bookworm) で dhcp の ntp-servers オプションを拾う

Raspberry PI OS (bookworm) は dhcp の ntp-serves を既定(NetworkManager)では拾ってくれないので拾うようにしてみた。

Arch Linux のウェブドキュメントにある

[systemd-timesyncd で DHCP 経由で受信した NTP サーバを動的に設定する](https://wiki.archlinux.jp/index.php/NetworkManager#systemd-timesyncd_.E3.81.A7_DHCP_.E7.B5.8C.E7.94.B1.E3.81.A7.E5.8F.97.E4.BF.A1.E3.81.97.E3.81.9F_NTP_.E3.82.B5.E3.83.BC.E3.83.90.E3.82.92.E5.8B.95.E7.9A.84.E3.81.AB.E8.A8.AD.E5.AE.9A.E3.81.99.E3.82.8B)

をそのまま使用してもいいのですが、少し弄って

- ディレクトリを
  - /etc/systemd/timesyncd.conf.d から
  - /run/systemd/timesyncd.conf.d に変更
- ディレクトリや .conf ファイル名をシェル変数化
- ファイル名を簡略化(後の OS アップデートで衝突するかもしれませんが…)

としてみた。

```shell:/etc/NetworkManager/dispatcher.d/02-timesyncd
#!/bin/sh

[ -z "$CONNECTION_UUID" ] && exit 0

INTERFACE="$1"
ACTION="$2"

CONF_DIR=/run/systemd/timesyncd.conf.d
CONF_FILE="$CONF_DIR/${CONNECTION_UUID}.conf"

case $ACTION in
up | dhcp4-change | dhcp6-change)
  [ -n "$DHCP4_NTP_SERVERS" ] || exit 0
  mkdir -p "$CONF_DIR"
  echo "[Time]" > "$CONF_FILE"
  echo "NTP=$DHCP4_NTP_SERVERS" >> "$CONF_FILE"
  systemctl restart systemd-timesyncd.service
  ;;
down)
  rm -f "$CONF_FILE"
  systemctl restart systemd-timesyncd.service
  ;;
esac
```
簡単なLispインタープリタを作ってみた

## 対象読者

(1) インタープリタの作成方法に興味がある方
(2) Java言語経験がある方。初心者程度で大丈夫
(3) Lisp系言語を多少知っている方
(4) Clojureに興味がある方

対象読者は、  ( 1 AND 2 AND 3) OR 4  となります。

本LispインタープリタはJavaで書かれています。

## Lispインタープリタを作った訳

以下のISLispの記事を読んでいたところ、無性にLispインタープリタを実装したくなりました。

https://qiita.com/sym_num/items/950a8f3c48f047d1087a

Common Lispの仕様は巨大だからといって、サブセットじゃなくて、独自のLispを作って良いものなのか？？？ これが私が一番疑問に思った事でした。


私は、ここ数年 Clojureを学んではいたのですが、マスター出来ずにいました。
かなり昔の事ですが、Common Lispは、何年も学んでいました。
私にとってはCommon Lispの方がわかりやすく感じてしまいます。
でも折角Clojureのソースを読んでいた途中なので、ClojureとCommon Lispを混ぜたようなインタープリタを作ってみる事にしました。

## 教育用のLisp

インタープリタを作った事がない方も多いと思います。
そんな方が、ちょっと修正して遊んでみようかなーと思うくらいの、コンパクトで
わかりやすいソースにしたいと思いました。

## Common Lispのコード例

```
(defun foo (x)
   (cond ((zerop x) "zero")
         (t (+ x 10))))
```

ご覧のとおり、全て丸括弧です。括弧が多くて読みにくいと言われますが、私はこのシンプルな構文が好きです。
プログラムとデータが同じ構造をしているのを「同図像性」と言いますが、私はこれに惚れ込んでいます。

## Jsonの例


```
{
	"name": "sample",
	"data": [
		1,	2,	3,	4,	5
	]
}
```

Jsonは、中括弧(波括弧)と大括弧(角括弧)が出てきます。
これはデータを表現ための記法（文法）です。プログラムが書ける訳ではありません。

## Clojureの例

```
(defn json-response [ str, array ]      
    { :name  str , :data  array } )    

(json-response "sample" '[ 1 2 3 4 5] )  
```

Clojureはまるで Lisp + Jsonの様です。括弧も、中括弧も、大括弧も登場します。
そして、中括弧と、大括弧の使い方が、Jsonのそれと大変似ているのです。


中括弧と大括弧を組み込んだにも関わらず、「同図像性」は保たれています。大変素晴らしい。

設計者の Rich Hickey さんは、天才だと思います。

## ソース公開場所
ソースはgithubに公開しました。
https://github.com/masa-oss/iris

自分でコンパイルしてみたり、ちょっと改造して遊んでいただけると嬉しい。

## 感想

簡単と言っておきながら、そこそこのJavaのソース量になってしまった。
簡単と言っているのは、Common Lisp や Clojureと比べてなのでご容赦ください。

Javaで書いていて、NetBeansのデバッガーが使えるのは、とても嬉しい。
これだけでも、教育用※と言って良いだろう。
※インタープリタを作った事がない人が、自習する教材としても使えるだろう。


また、このインタープリタを作ってみて、Clojureへの理解が、少し深まった。
varやnamespaceへの理解も深まった。
nsマクロやら、ライブラリのロード周りは、結構ややこしい。
react-native-vector-icons を ios で利用する

react native icon　などで検索すると出てくる react-native-vector-icon というプラグインがありますが、通常利用するには結構面倒な手順が必要です。（xcode側に登録するとか、、）
ただ、expoを利用していればとても簡単に利用できます。ありがたいです。

今回はその方法を忘備録として残します。

## 方法
npx create-expo-app で開発をスタートしている場合は特に何かインストールの必要はありません。
※もし --template blank などオプションを設定してスタートした場合は別かもしれません。@expo/vector-iconsが必要なので、インストールしてください。

### 利用したいアイコンを探す

https://oblador.github.io/react-native-vector-icons/

上記サイトにvector-iconsで利用できるiconの一覧があります。
利用したいものを選びます。今回は MaterialIcons の insights を利用するとします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/cff2052d-cfa8-29c1-6e12-b29cd272cabf.png)

### 利用したいファイルに記載
あとは、利用箇所で上記アイコンを記載すれば完了です。
まず、ファイルにimportを記載します。

```tsx
// 利用するiconがMaterialIconsにある場合
// 違う場合はそちらを記載。（@expo/vector-icons/AntDesignなど）
import MaterialIcons from '@expo/vector-icons/MaterialIcons';
```

そして、コンポーネントに記載すれば利用できます。

```tsx
<MaterialIcons
  name={'insights'}
  color={color}
  size={24}
/>
```

※tabメニュー内で利用した例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2704095/7b74291c-2cb1-aebd-013c-53385546835d.png)

vector-iconsを利用する方法を検索すると非常に面倒な作業が必要そうで割と萎え気味でしたが、expoを利用していると色々用意していてくれるので本当に助かります。

参考になれば幸いです。

### 参考

https://docs.expo.dev/guides/icons/
ABC367回答メモ

# 0.はじめに
　とりあえずDまで目標で挑みましたが、Cが精一杯でした。
　D、Eも解説を見ながらなんとなくわかりましたが
　解答例をなぞっただけで理解度は60%といったところ・・・。
　D以降の難易度が高かったためか、レートは-1と微減でした。


# 1.A - Shout Everyday
　Aにしてはややこしい問題。
　叫ぶ時刻が就寝時刻より遅い場合、起床時刻が叫ぶ時刻より早ければYes、遅ければNo
　　0寝起叫24→Yes
　　0寝叫起24→No
　叫ぶ時刻が就寝時刻より早い場合、起床時刻が叫ぶ時刻より遅ければYes、早ければNo
　　0叫寝起24→Yes
　　0叫起寝24→No
　と、0時をまたぐケースが今一場合分けが甘いと思つつ提出したところ、WAを食らいました。
　
　さらに場合分けをして
　叫ぶ時刻が就寝時刻より早い場合、起床時刻が叫ぶ時刻より早ければYes
　　0起叫寝24→Yes
　叫ぶ時刻が就寝時刻より早い場合、起床時刻が就寝時刻より遅ければYes
　　0叫寝起24→Yes
　上記以外の場合No
　　0叫起寝24→No
　としたところACとなりました。
　ちょっと甘く見たため5分ロスしました。　

　https://atcoder.jp/contests/abc367/submissions/56780356


# 2.B - Cut .0
　いろいろやり方がありそうでしたが、インプットをひとまずリストに入れて操作しました。
　【実装】
　　・入力をを1文字ずつリストXに入れる
　　・変数NにXの長さをインプット
　　・変数フラグを0で初期化
　　～末尾の0を省く処理
　　・以下を変数ｉを0～N-1まで繰り返す
　　　・X[N-i-1]が"0"かつflgが0の時（リストの後ろから見ていき0が続く場合）
　　　　-X[N-i-1]を""に変換
　　　・上記以外の場合（0の連続が途切れた場合）
　　　　-flgに1をセット
　　・変数ANSにXの要素を結合した値を格納
　　～末尾が.だった場合省きつつ出力
　　・ANSの末尾が”.”だったら、末尾を除去して出力
　　　違ったらそのまま出力
　素直に実装して早めの解答を心掛けました。

　https://atcoder.jp/contests/abc367/submissions/56792840


# 3.C - Enumerate Sequences
　制約から、単純に条件に当てはまるリストを全列挙し
　その後リスト毎に集約した値がKで割り切れるリストのみを
　回答用リストに格納して順に出力して終了でACでした。
　
　こう書くと楽勝だった感じですが、条件に当てはまるリストを全列挙する方法が
　全く思い浮かばず、Nが１～8までを場合分けして
　それぞれの場合でループを作ると言う力技で解決しました。

　https://atcoder.jp/contests/abc367/submissions/56808135


以上
暗号資産UltronAI(UTO)のフルノードを構築する方法

## 要　旨
暗号資産UltronAI(UTO)のフルノードを構築する方法(CLI)について記述します。
## 実行環境等
VPS:KAGOYA VPS
OS:Ubuntu22.04LTS
CPU/メモリ:2コア/2GB
ストレージ:200GB SSD
料金　32円/日、880円/月(2024.8.18時点)
同期開始:2024.8.18(日)06:00
同期完了:2024.8.18(日)07:00
同期に要した時間:1時間00分
使用ストレージ容量:10GB
## 実施要領
アップデート
```linux
apt update
```
ウォレットのインストール
```linux
wget https://github.com/aidevpin/core/releases/download/v1.0/wallet-linux-gnu-v1.0.zip
```
unzipのインストール
```linux
apt install unzip
```
展開する。
```linux
unzip wallet-linux-gnu-v1.0.zip
```
不要になったファイルの削除
```linux
rm wallet-linux-gnu-v1.0.zip
```
実行権限の付与
```linux
chmod +x *
```
コマンドをインストールする
```linux
install -m 0755 -o root -g root -t /usr/local/bin *
```
ultronaidの起動
```linux
ultronaid
```
起動を確認したら(1分経過したら)、一旦停止させる。
ctr + C
~/.ultronaicore/ultronai.confを編集する。
```linux
vi ~/.ultronaicore/ultronai.conf
```
以下を記述して、保存する。
```linux
mainnet=1
daemon=1
server=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcport=19521
gen=1
genproclimit=-1
```
再度ultronaidを起動させて、同期させる。
```linux
ultronaid
```
同期状態の確認。
```linux
tail -f ~/.ultronaicore/debug.log
```
## 結　言
今回は、暗号資産UltronAI(UTO)のフルノードを構築する方法(CLI)について記述しました。
php artisan serveしたときにsessionsテーブルがないエラーの対処

初心者のため、間違いや何かご存じの方がいましたら、教えていただけると助かります。

# 概要
php artisan serveしたときに、アクセスするとsessionsテーブルがないエラーの対処

### 環境
windows11
docker-desktop
php: 8.2.7
laravel: v11

## エラーメッセージ
```
Undefined table: 7 ERROR: relation "sessions" does not exist LINE 1: select * from "sessions" where "id" = $1 limit 1 ^
```


## 解決策
php artisan migrateを実行（デフォルトテーブルを作成する。）
<br/>
※以下サイトを参考

https://zenn.dev/aki_artisan/articles/sail-error-sessions
LLMの効率化: Llama 3.1 8BからLlama-3.1-Minitron 4Bへのプルーニングと蒸留

## はじめに：LLMの課題と小型化の重要性

大規模言語モデル（LLM）は自然言語処理の分野で革命を起こしていますが、その巨大なサイズゆえに課題も抱えています。Llama 3.1 405BやNVIDIA Nemotron-4 340Bのような大規模モデルは優れた性能を示す一方で、デプロイに多大なリソースを必要とします。

この課題に対応するため、業界では小規模言語モデル（SLM）の開発が進んでいます。SLMは多くの言語タスクで十分な性能を発揮しつつ、より少ないリソースで大規模展開が可能です。

本記事では、NVIDIAの研究者たちが開発した、構造化重みプルーニングと知識蒸留を組み合わせた効果的な手法を紹介します。この手法を用いて、Llama 3.1 8Bモデルから新たにLlama-3.1-Minitron 4Bモデルを作成する過程を詳しく解説していきます。


## プルーニングと蒸留：効率的なモデル圧縮手法

### プルーニングとは

プルーニングは、モデルをより小さく効率的にする手法です。具体的には以下の2つの方法があります：

1. 深さプルーニング：レイヤーを削減
2. 幅プルーニング：ニューロン、アテンションヘッド、埋め込みチャンネルを削減

プルーニング後は通常、精度回復のための再トレーニングが行われます。

### 知識蒸留とは

知識蒸留は、大規模な教師モデルから小規模な生徒モデルへ知識を転移する技術です。目的は、元のモデルの予測能力を維持しつつ、より効率的で軽量なモデルを作成することです。

知識蒸留には主に2つのアプローチがあります：

1. SDGファインチューニング：大規模教師モデルが生成した合成データを用いて、小規模な事前学習済み生徒モデルをさらにファインチューニングする方法。
2. 古典的知識蒸留：トレーニングデータセットにおいて、生徒モデルが教師モデルのロジットや中間状態を模倣する方法。

本記事では主に古典的知識蒸留アプローチに焦点を当てています。


## Llama-3.1-Minitronの開発プロセス

Llama-3.1-Minitron 4Bの開発は、以下のステップで行われました：

1. 教師モデルのファインチューニング
2. 深さのみのプルーニング
3. 幅のみのプルーニング
4. 精度ベンチマーク
5. パフォーマンスベンチマーク

### 教師モデルのファインチューニング
まず、元のLlama 3.1 8Bモデルを94Bトークンのデータセットでファインチューニングしました。これにより、元のトレーニングデータとの分布の違いを補正し、蒸留時により適切な指導を行えるようにしました。

### 深さのみのプルーニング
8Bから4Bへの圧縮では、16レイヤー（50%）を削減しました。各レイヤーの重要度を評価し、最終的に16〜31番目のレイヤーを削除することで最適な結果が得られました。

### 幅のみのプルーニング
幅方向では以下の圧縮を行いました：

- MLPの中間次元を14336から9216に削減
- 隠れ層のサイズを4096から3072に削減
- アテンションヘッド数とレイヤー数は維持

興味深いことに、プルーニング直後は幅プルーニングの方が言語モデル損失が高くなりましたが、短期間の再トレーニング後にはこの傾向が逆転しました。


## ベンチマーク結果：性能と効率性の比較

### 精度ベンチマーク
Llama-3.1-Minitron 4Bの性能を、元のLlama 3.1 8Bや同サイズの他のモデル（Phi-2 2.7B、Gemma2 2.6B、Qwen2-1.5Bなど）と比較しました。

結果として、幅プルーニング戦略の有効性が再確認されました。Llama-3.1-Minitron 4B（幅プルーニング版）は、多くのベンチマークで元の8Bモデルに迫る性能を示し、同サイズの他のモデルと比較しても競争力のある結果を残しました。

### パフォーマンスベンチマーク
NVIDIA TensorRT-LLMを用いて最適化したモデルのパフォーマンスを測定しました。

- Llama-3.1-Minitron-4B-Depth-Base：Llama 3.1 8Bの約2.7倍のスループット
- Llama-3.1-Minitron-4B-Width-Base：Llama 3.1 8Bの約1.8倍のスループット

FP8精度での展開により、BF16と比較して全モデルで約1.3倍のパフォーマンス向上が見られました。


## まとめと今後の展望

プルーニングと古典的知識蒸留を組み合わせた手法は、大規模言語モデルを段階的に小型化する上で非常に効果的であることが示されました。この方法は、ゼロからのトレーニングと比較して、より高い精度と効率性を実現します。

Llama-3.1-Minitron 4Bの開発は、最先端のオープンソースモデルであるLlama 3.1ファミリーを基にした初めての取り組みです。今後、この技術がさらに発展し、より効率的で高性能な小規模言語モデルの開発につながることが期待されます。

NVIDIAは、この研究成果を広く共有し、コミュニティの発展に貢献していく方針です。詳細な情報やモデルは、NVIDIAのGitHubリポジトリやHugging Faceで公開されています。

大規模言語モデルの効率化は、AI技術の民主化と持続可能な発展に向けた重要な一歩です。今後も、モデルの小型化と性能向上の両立に注目が集まるでしょう。

## 参考サイト

https://developer.nvidia.com/blog/how-to-prune-and-distill-llama-3-1-8b-to-an-nvidia-llama-3-1-minitron-4b-model/
pythonでgnuradio その22

# 概要
pythonでgnuradioやってみた。
練習問題やってみた。

# 練習問題
FM変調を録音した、wavファイルを読んで、FM復調して聞く。
信号は、440Hzのサイン波、搬送波は、16KHz。

# 方針
- hilbert使う。
- fm demod使う。

# サンプルコード

```
from gnuradio import gr, blocks, analog
from gnuradio import audio
from gnuradio import filter
from gnuradio.fft import window

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		self.samp_rate = samp_rate = 32000
		self.hilbert_fc_0 = filter.hilbert_fc(65, window.WIN_HAMMING, 6.76)
		self.blocks_wavfile_source_0 = blocks.wavfile_source('f5.wav', True)
		self.audio_sink_0 = audio.sink(samp_rate, '', True)
		self.analog_fm_demod_cf_0 = analog.fm_demod_cf(channel_rate = 48000, audio_decim = 1, deviation = 75000, audio_pass = 15000, audio_stop = 16000, gain = 1.0, tau = (75e-6),)
		self.connect((self.analog_fm_demod_cf_0, 0), (self.audio_sink_0, 0))
		self.connect((self.blocks_wavfile_source_0, 0), (self.hilbert_fc_0, 0))
		self.connect((self.hilbert_fc_0, 0), (self.analog_fm_demod_cf_0, 0))

if __name__ == '__main__':
	try:
		my_top_block().run()
	except KeyboardInterrupt:
		pass



```
S3のバケットの種類フローチャート

SAA-03勉強中メモ

# S3のバケットの種類を決定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950120/6fdc6d45-8fca-b021-e090-a116fa1a7565.png)

IA = Infrequent Access (低頻度アクセス)

- 基本３AZ
- 耐久性は全て99.999999999% (11 ナイン)
- オブジェクトは１ファイルにつき５TB

参考

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html

https://aws.amazon.com/jp/s3/storage-classes/
Ori Serverless Kubernetes: AI・ML開発を加速させる革新的なインフラストラクチャサービス

Ori Serverless Kubernetesは、Kubernetesの拡張性と柔軟性をサーバーレスプラットフォームのシンプルさと組み合わせた、画期的なAIインフラストラクチャサービスです。このサービスにより、開発者は基盤となるインフラストラクチャを管理することなく、AI・MLモデルをデプロイし、スケーリングすることが可能になりました。

## 主な特徴と利点

1. **強力なGPUとMLフレームワークのオンデマンド提供**
   - NVIDIA H100、L4、L40S GPUを全体または部分的に構成可能
   - 事前設定されたMLフレームワークの利用、または独自のHelmチャートの使用が可能

2. **サーバーレスの簡便さと完全な分離**
   - Oriがクラスタの管理とロードバランシングを担当
   - 別個のコントロールプレーンによる完全な分離でデータセキュリティを確保

3. **Kubectlを介したコントロールプレーンへのフルアクセス**
   - 開発者に高い柔軟性を提供
   - 完全なアプリケーションカタログへのアクセス
   - クラスター内で複数の名前空間を活用可能

4. **オートスケーリング**
   - ユーザーの需要に応じてAIインフラストラクチャを適応
   - コストを最適化

5. **バニラKubernetesの親和性**
   - Kubernetesユーザーにとって再学習や再構築が不要

6. **従量課金制の料金体系**
   - 使用したリソースに対してのみ支払い
   - GPU費用の最適化

## Ori Serverless Kubernetesの利点

1. **Kubernetesのパワーと簡便さの両立**
   - フルスケールのコントロールプレーンの利点
   - 完全な分離による強化されたセキュリティ
   - 強力なアプリケーションカタログ
   - MLOpsを簡素化するサーバーレス実装

2. **AI・MLモデルの市場投入を加速**
   - GPUの待ち時間や承認プロセスが不要
   - 高性能GPUモデルの中から選択可能
   - 1分以内にフラクショナルまたはフルGPUノードでクラスターを作成
   - プラットフォームに適応させる必要なく、選択したHelmチャートやツールを活用可能

3. **インフラストラクチャのスケーリングとコスト最適化**
   - GPUクラスターのオートスケーリングにより使用分のみ支払い
   - 需要に応じてスケールアップ/ダウン
   - GPU予算の最大活用

Ori Serverless Kubernetesは、AI・ML開発者にとって、Kubernetesの力を活用しながら、簡単で手頃な方法でワークロードを管理できる革新的なソリューションです。この先進的なプラットフォームにより、開発者はインフラストラクチャの管理よりも、革新的なAI・MLモデルの開発に集中できるようになります。

## 参考サイト

https://www.ori.co/serverless-kubernetes
pythonでgnuradio その21

# 概要
pythonでgnuradioやってみた。
練習問題やってみた。

# 練習問題
FM変調を録音せよ。
信号は、440Hzのサイン波、搬送波は、16KHz。

# サンプルコード

```
from gnuradio import gr, blocks, analog
from gnuradio import audio

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		self.samp_rate = samp_rate = 32000
		self.blocks_wavfile_sink_0 = blocks.wavfile_sink('f5.wav', 1, samp_rate, blocks.FORMAT_WAV, blocks.FORMAT_PCM_16)
		self.blocks_vco_f_0 = blocks.vco_f(32000, 16000, 1)
		self.blocks_head_0 = blocks.head(gr.sizeof_float * 1, 64000)
		self.blocks_add_const_vxx_0 = blocks.add_const_vff((1, ))
		self.analog_sig_source_x_1 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 440, 0.3, 0)
		self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_const_vxx_0, 0))
		self.connect((self.blocks_add_const_vxx_0, 0), (self.blocks_vco_f_0, 0))
		self.connect((self.blocks_head_0, 0), (self.blocks_wavfile_sink_0, 0))
		self.connect((self.blocks_vco_f_0, 0), (self.blocks_head_0, 0))

if __name__ == '__main__':
	try:
		my_top_block().run()
	except KeyboardInterrupt:
		pass


```

以上。
pythonでgnuradio その20

# 概要
pythonでgnuradioやってみた。
練習問題やってみた。

# 練習問題
FM変調を聞く、見る。
信号は、440Hzのサイン波、搬送波は、16KHz。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1ceff02d-0930-9971-7474-5610f50dafea.png)

# サンプルコード

```

from gnuradio import gr, filter
from gnuradio.fft import window
from gnuradio import blocks
import sys
try:
	from gnuradio import qtgui
	from PyQt5 import QtWidgets, Qt
	import sip
except ImportError:
	sys.stderr.write("Error: Program requires PyQt5 and gr-qtgui.\n")
	sys.exit(1)
try:
	from gnuradio import audio
	from gnuradio import analog
except ImportError:
	sys.stderr.write("Error: Program requires gr-analog.\n")
	sys.exit(1)
try:
	from gnuradio import channels
except ImportError:
	sys.stderr.write("Error: Program requires gr-channels.\n")
	sys.exit(1)

class my_top_block(gr.top_block):
	def __init__(self):
		gr.top_block.__init__(self)
		samp_rate = 32000
		self.snk1 = qtgui.sink_f(1024, window.WIN_BLACKMAN_hARRIS, 0, samp_rate, "", True, True, True, True, )
		self.blocks_vco_f_0 = blocks.vco_f(32000, 16000, 1)
		self.blocks_add_const_vxx_0 = blocks.add_const_vff((1, ))
		self.audio_sink_0 = audio.sink(samp_rate, '', True)
		self.analog_sig_source_x_1 = analog.sig_source_f(samp_rate, analog.GR_COS_WAVE, 440, 0.3, 0)
		self.connect((self.analog_sig_source_x_1, 0), (self.blocks_add_const_vxx_0, 0))
		self.connect((self.blocks_add_const_vxx_0, 0), (self.blocks_vco_f_0, 0))
		self.connect((self.blocks_vco_f_0, 0), (self.audio_sink_0, 0))
		self.connect((self.blocks_vco_f_0, 0), (self.snk1, 0))
		self.qapp = QtWidgets.QApplication(sys.argv)
		pyQt = self.snk1.qwidget()
		pyWin = sip.wrapinstance(pyQt, QtWidgets.QWidget)
		pyWin.show()

if __name__ == "__main__":
	tb = my_top_block()
	tb.start()
	tb.qapp.exec_()
	tb.stop()





```

以上。
Amazon EC2 で高価なインスタンスが自動終了するようにする

## モチベーション
* Amazon EC2 (AWS) で高価なインスタンスを実験などのために一時的に使いたい場合がある
* 終了 (termination，インスタンスを破棄すること) し忘れると高額な利用料金が発生してしまう

## 解決法
* あらかじめ，利用したいインスタンスタイプなどを指定したテンプレートを作成する
* テンプレートで，cloud-init の設定を利用して一定時間でシステム終了するように設定しておく
* テンプレートの shutdown behavior を Terminate にしておくとシステム終了すると自動で Terminate される

## 手順
![Screenshot 2024-08-18 at 4.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653437/a58b1e23-5b26-399c-65b4-1447bdd110ce.png)


1. EC2 Launch Template を作成する画面を開く
1. インスタンスタイプやネットワークなど必要な設定をする
1. "Advanced details" 以下で次の設定をする
    * "Shutdown behavior" → "Terminate"
    * "Termination protection" → "Disable"
    * "Stop protection" → "Disable"
1. 以下の内容を User data に指定する (24時間で終了する場合)：

```yaml
#cloud-config
repo_update: true
repo_upgrade: all

runcmd:
  - [sh, -c, "( sleep 86400 ; systemctl poweroff ; ) </dev/null >/dev/null 2>&1 & disown -a ; exit 0"]
```

これでこのテンプレートを利用して作成されたインスタンスは 24 時間で自動終了します。

異なる時間を指定するには， `sleep 86400` 部分を対応する秒数に直します。

* 1時間： `sleep 3600`
* 15分： `sleep 900`
PowerShell 面白いコマンドたち

PowerShellは，Windowsのタスク自動化と構造管理に使用される強力なコマンドラインシェルです．以下に，これらのPowershellの基本的なコマンドをいくつかあるこれを紹介する．

## 1．Get-Help
- コマンドの使い方や詳細情報を表示します．Powershellのヘルプシステムは非常に強力です．
```powershell
Get-Help <コマンド名>
```
例：
```powershell
Get-Help Get-Process
```

## 2.Get-Command
- 利用可能なコマンドのリストを表示します．特定のモジュールやコマンドレットのリストを取得することも可能です．
```powershell
Get-Command
```

## 3.Get-Process
- 現在実行中のプロセスを一覧を表示します．
```powershell
Get-Process
```

## 4.Stop-Process
- 指定したプロセスを停止します．
```powershell
Stop-Process -Name <プロセス名>
```
例：
```powershell
Stop-Process -Name notepad
```

## 5.Get-Service
- システム上のサービスのステータスを表示します．
```powershell
Get-Service
```

## 6.Start-Service /Stop-Service
- サービスを開始または停止します．
```powershell
Start-Service -Name <サービス名>
Stop-Service -Name <サービス名>
```

## 7.Set-ExecuttionPoliy
- Powershellスクリプトの実行ポリシーを設定します．デフォルトでは，スクリプトの実行が制限されている場合があります．
```powershell
Set-ExecutionPolicy RemoteSigned
```

## 8. Get-ChildItem
- 指定されたディレクトリ内のファイルとフォルダの一覧を表示します．ディレクトリ内の再帰的に検索することを可能です．
```powershell
Get-ChildItem
```
例:
```powershell
Get-ChildItem -Path C:\ -Recurse
```
## 9. Copy-Item
- ファイルやディレクトリをコピーします。
```
Copy-Item -Path <コピー元> -Destination <コピー先>
```
例:
```
Copy-Item -Path "C:\source\file.txt" -Destination "C:\destination\file.txt"
```

## 10. Remove-Item
- ファイルやディレクトリを削除します。
```
Remove-Item -Path <削除対象>
```
例:
```
Remove-Item -Path "C:\temp\file.txt"
```

## 11. Test-Connection
- 指定したリモートコンピュータへの接続（ping）をテストします。
```
Test-Connection -ComputerName <コンピュータ名またはIPアドレス>
```

## 12. Invoke-WebRequest
- URLからWebページのデータを取得します。APIの呼び出しやWebスクレイピングに使用できます。
```
Invoke-WebRequest -Uri <URL>
```

PowerShellにはこれ以外にも多数のコマンドが存在し、それらを組み合わせることで強力なスクリプトを作成できます。上記のコマンドを使って、まずは基本的な操作に慣れていくとよいでしょう。
VSCodeのマルチカーソルを「Ctrl+クリック」に変更する

# はじめに

自分はマルチカーソルのコマンドに「Ctrl+クリック」を以前から利用していたが、
VScodeを初期化したらマルチカーソルを使うときのコマンドがリセットされてしまった。


あんまり需要ないと思うが、自分用の備忘録として残しておく。
（Altって押しづらくない？慣れの問題かな）

# 変更方法

超簡単

VSCodeのメニューバーから「選択」→「マルチカーソルをCtrl＋Clickに切り替える」を押すだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617647/1f672c1e-0d64-ec36-84b6-752ff714276f.png)



戻したいときは、
VSCodeのメニューバーから「選択」→「マルチカーソルをAlt＋Clickに切り替える」を押すだけ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617647/591f5d40-238a-50b5-c529-a7d48a11eb14.png)


おわり
YOLOv8で検出時のコンソール出力を消す

# 目的
ultrayticsのライブラリででYOLOv8を使っている時、コンソールへ出力される検出結果が邪魔...  
（特にリアルタイムでの検出とか）

具体的には、下の画像のような出力を消したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617647/c143d6f5-0f3d-016e-6f9a-e1e3fbdc2663.png)
・・・

調べてみた感じそれらしい記事がなかったので備忘録として残しとく

# 方法
推論実行前に以下のコードを記載しておく

```python
from logging import getLogger
logger = getLogger('ultralytics')
logger.disabled = True
```
たったこれだけ

# おわりに

てっきり console_output=False みたいな引数があるものかと思ってた...
そりゃlogger使ってやってるよな（今更）
暗号資産ビットコインゴールド(BTG)のフルノードを構築する方法

## 要　旨
暗号資産ビットコインゴールド(BTG)のフルノードを構築する方法(CLI)について記述します。
## 実行環境等
VPS:KAGOYA VPS
OS:Ubuntu22.04LTS
CPU/メモリ:3コア/3GB
ストレージ:400GB SSD
料金　63円/日、1,760円/月(2024.8.17時点)
同期開始:2024.8.17(土)17:30
同期完了:2024.8.18(日)03:00
同期に要した時間:9時間30分
使用ストレージ容量:212GB
## 実施要領
アップデート
```linux
apt update
```
ウォレットのインストール
```linux
wget https://github.com/BTCGPU/BTCGPU/releases/download/v0.17.3/bitcoin-gold-0.17.3-x86_64-linux-gnu.tar.gz
```
展開する。
```linux
tar -xzvf bitcoin-gold-0.17.3-x86_64-linux-gnu.tar.gz
```
不要になったファイルの削除
```linux
rm bitcoin-gold-0.17.3-x86_64-linux-gnu.tar.gz
```
ディレクトリの移動
```linux
cd bitcoin-gold-0.17.3/bin
```
コマンドをインストールする
```linux
install -m 0755 -o root -g root -t /usr/local/bin *
```
bgolddの起動
```linux
bgoldd
```
起動を確認したら(1分経過したら)、一旦停止させる。
ctr + C
~/.bitcoingold/bitcoingold.confを新規作成する。
```linux
vi ~/.bitcoingold/bitcoingold.conf
```
以下を記述して、保存する。
```linux
mainnet=1
daemon=1
server=1
rpcuser=rpcuser
rpcpassword=rpcpassword
rpcport=8339
gen=1
genproclimit=-1
```
再度bgolddを起動させて、同期させる。
```linux
bgoldd
```
同期状態の確認。
```linux
tail -f ~/.bitcoingold/debug.log
```
## 結　言
今回は、暗号資産ビットコインゴールド(BTG)のフルノードを構築する方法(CLI)について記述しました。
[AWS]Lightsailで安くて簡単にクラウド環境を構築

# はじめに
以前、EC2を１個作成し月４千円程度の課金をされたことがあり、EC2を利用してポートフォリオ用のwebサイトを作成することはしばらく断念していた。安くて簡単に、固定価格で利用できるクラウドサービスを探していた結果、AWSで提供するLightsailを見つけた。
会社の業務などで利用することはないと思うが、個人で利用する分にはちょうど良いと判断。実際にさわってみる。

## Lightsailメリット
- 固定価格で利用ができる
- 設定が簡単・楽
- ポートフォリオ向け

## Lightsailデメリット
- 高度な設定ができない
- 業務での利用機会はない
- 停止中でも課金が発生する(削除で課金がされない)

## Lightsailホームページに行く

https://lightsail.aws.amazon.com/
すでに２つのインスタンスが存在する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/505d04aa-d124-9772-5cfb-c942b2753669.png)

## インスタンス作成ボタンをクリック
LinuxとWindows Serverが選択できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/403e898c-8eab-daef-30fc-532d36add33a.png)

料金が選択できる。後で変更ができるので最初は低いスペックで問題ない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/ed026fe6-087f-ef03-b732-21e21b6cc3dd.png)


## クラウド環境に接続する
生成されたインスタンス(ほとんどEC2)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/ffbdfc63-f750-3292-f4e8-7eb7cacfa074.png)

接続のために、詳細な情報を確認
web上から接続、リモートデスクトップからの接続ができる。
IPアドレスとユーザー名を確認し、リモートデスクトップから接続をした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/0ee04cf9-a9ce-28ce-38e9-611fd4179b6d.png)


リモートデスクトップでIPアドレス、アカウント名を入力して接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/908cadaa-abd3-ee1b-19b1-dfd0aaf943ed.png)


## 80 Portを開ける
検索 → Firewall → インバウンドルール → 新規ルール 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/605a5d06-ebab-b7eb-6d47-09cb768610a0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/b5424f47-a29f-f94d-0d54-d3f7ce093cff.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/265b6d8a-32c0-d98b-32cb-62902a57c587.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/4eb84959-987f-a432-e708-0b84b147a98f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/eb36a159-33ca-d997-ee19-70675554969c.png)

追加されたルール(Nginx)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/177d885a-ce7a-9177-0dbb-2df047c93bf4.png)


## IPv4 ファイアウォール設定
インスタンス → ネットワーキング
80ポートで接続できることを確認する。なければ追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821152/bdfc563a-3c9e-274a-51b9-e77006cb41e1.png)


後はNginxなどでデプロイすると、IPアドレスから接続ができるようになる。

https://qiita.com/junzai/items/4b737a4fafbe888bc709


# 終わりに
個人で利用する分にはちょうど良い。Linuxなら５ドルで利用できるし、windows serverでも14ドルあれば物足りる。しかし、会社で業務として利用することはなさそうなので、あまり深入りしない方が良さそう。中身はEC2とほとんど同様なので、自分のようにソフトウェア開発側のエンジニアであれば、ちょうどよいと思った。
docker-compose の力を借りて爆速で開発マシン上にFTPサーバーを立てた話

# はじめに
FTP サーバーと通信するようなアプリを書かなければいけなくなったけど、都合よく使える FTP サーバーが自分の管理下になかったので、どうにかモノグサして FTP サーバーを開発環境に用意しようとした結果です。

# 前提条件
## 開発マシンに入っているソフトウェアについて
- Windows 11
- Visual Studio 2022
- Docker Desktop

今回は docker-Compose を使うので、Docker が使える環境は必須です。
docker-compose さえ使えればいいはずなので、Windows 環境以外でもいけるはず。

## FTP サーバーについて
Pure FTPd をコンテナ化したものを提供している方がいらっしゃったので、ありがたく拝借します。

https://hub.docker.com/r/stilliard/pure-ftpd/

## （オマケ）クライアントアプリに組み込んだライブラリ
[FluentFTP](https://github.com/robinrodricks/FluentFTP) を今回は使いました。
.NET Core 8 で書いたアプリに Nuget で組み込んでサクッと FTP クライアントとして使えるので結構良かった。

https://github.com/robinrodricks/FluentFTP

# 作業手順
## docker-compose.yml 作成
普通に Docker コマンドを叩いても立ち上げられるのですが、パスワードとかを yml ファイルで保持したかったので docker-compose.yml をサクッと書きます。

```docker-compose.yml
version: '3'

services:
  ftpd_server:
    #イメージの指定とコンテナ名指定
    image: stilliard/pure-ftpd
    container_name: pure-ftpd
    
    #PASV用に30000-30009を開く必要があるらしい
    ports:
      - "21:21"
      - "30000-30009:30000-30009"
    
    #docker-compose.yml の下に出来る data フォルダが
    #FTP サーバーのログインユーザーのホームディレクトリとしてマウントされる設定
    #あとパスワードの保存先もローカルフォルダにマッピング
    volumes: 
      - "./data:/home/${FTPUSER}/"
      - "./passwd:/etc/pure-ftpd/passwd"

    #ホスト名、ユーザー名、パスワード、ホームディレクトリの設定
    #ユーザー名とパスワードは環境設定ファイルに持つようにする。
    environment:
      PUBLICHOST: "localhost"
      FTP_USER_NAME: ${FTPUSER}
      FTP_USER_PASS: ${FTPPASS}
      FTP_USER_HOME: /home/${FTPUSER}

    restart: always
```

## 環境変数の設定
docker-Compose では .env という名前のファイルに入っている値を環境変数のデフォルト値として自動で読み込む設定になっているようなのでこれを使います。→ [参考ドキュメント](https://docs.docker.jp/compose/environment-variables.html)

.env に書いた内容は以下のような感じ
```.env
FTPUSER=ここにFTPユーザー名を指定
FTPPASS=ここにFTPパスワードを指定
```

## FTP サーバーを立ち上げる
あとは docker-compose にお任せ。

```powershell
docker-compose up
```

もしくはバックグラウンドで起動させたかったら `-d` オプションをつけると良い感じ。

## 成果物
ここまでの手順を完了させると、以下の設定でアクセス可能な FTP サーバーが立ち上がります。

- ホスト名 : localhost
- ポート : 21
- ユーザー名 : .env で指定したユーザー名
- パスワード : .env で指定したパスワード

あとは煮るなり焼くなりご自由に。

## 注意点
今回の設定だけだと、FTP over TLS ではなく平文でやり取りされるフツーの FTP サーバーになります。

Pure FTPd の設定で FTP over TLS も設定できるっぽいのですけど、構成したらなぜかクライアントからコネクションを張れなくなり、そこのデバッグに時間を割くのがもったいなかったので、開発環境として localhost からアクセスするだけならこれでいいかなと思いつつ、FTP over TLS の採用は一旦断念しました。

Public Internet に面した環境に置く際には、そこらへん気を付けないと危なそうなので、ご注意ください。（そして、FTP over TLS うまくいった人がいたら、うまくいった手順教えてほしい…）

# まとめ
docker-compose 一発で開発環境としての FTP サーバーを作れるのは割と便利かも？

なお、今回動けばいいやの最低限でモノグサしましたので、細かいデバッグ的なことはやってません。何か間違ってるとことかあったらこっそり教えていただけたら有難いです。
ROS2 Humbleで詰まったことまとめ

## Git cloneでearly EOFエラー
### 症状
```
$ git clone https://github.com/moveit/moveit2
Cloning into 'moveit2'...
remote: Counting objects: 4846, done.
remote: Compressing objects: 100% (3256/3256), done.
fatal: read error: Invalid argument, 255.05 MiB | 1.35 MiB/s
fatal: early EOF
fatal: index-pack failed
```
### 原因
gitのリポジトリの歴史が深くてcloneする容量が大きく、かつインターネット接続が遅い。
私が使っているノートPCの内部のWifiモジュールとubuntuの相性が悪く、通信速度が遅かった。

### 対処法
Wifi子機、TPLink Archer tx20u nanoを購入して以下のサイトに従ってドライバをインストールした。

https://samiux.github.io/tplink_tx20u_nano.html
foobar2000でどの曲が再生中か分かりやすくするカラムを追加

# 前提

下記記事のColumns UIコンポーネント導入は済んでいる前提です。

https://qiita.com/waokitsune/items/df0a4158fe418b6e39c7

# やり方

『Library』の『Configure』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/abc2a26c-9ec9-cc0e-4a19-5516fff97cc7.png)

『Display』
『Columns UI』
『Playlist view』
の
『Columns』タブ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/370225bb-5fed-f92d-ad40-944643f54274.png)

『New』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/42c32147-25c6-8f8a-fe6a-db1b22af125c.png)

例えばこんな設定をすると…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/89f55aa9-f1e6-5eaf-e0eb-e78be8672410.png)

```:コピペ用
$if(%_isplaying%,▶, )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/7f264360-048b-12bf-8257-b6c26c7c9a3c.png)

こんなふうに再生中の曲がどれかわかるマークのカラムが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/a8faa648-aa17-d509-0665-6be9797e4f31.png)

『▶』は自分の好きな文字列にもできます。

# 参考サイトさん

https://ameblo.jp/winter-bear667/entry-12602797619.html

# バージョン

Microsoft Windows [Version 10.0.22631.4037]
foobar2000 v2.1.5 [×64]
MixnetとTorはどう違うのか

そんなstackexchangeがありました。

https://crypto.stackexchange.com/questions/43348/difference-between-mix-networks-and-onion-routing

## ミックスネットとオニオン・ルーティングの違い

> using a mix-net someone could see your traffic but it might be impossible to determine where did it go due to the fact mix-net collects all the messages (http requests) and bounce them all.
>
> another fact is that the mixing will just work if there's more than one message in the proxy server otherwise it will behave like onion-routing with a delay time.
>
> mix-nets don't use encryption on layers as onion routing does.
>
> Onion routing was developed to enable privacy not security thus someone could use a man in the middle between the first node and the last node of your circuit and using a traffic analysis it could find out. your location plus he'll know what you're looking for due to the last node will send the request to the destination without any encryption at all


> ミックスネットを使うと、誰かがあなたのトラフィックを見ることができるが、ミックスネットがすべてのメッセージ（httpリクエスト）を収集し、それらをすべてバウンスするため、それがどこに行ったかを特定することは不可能かもしれない。
>
> もう一つの事実は、ミキシングが機能するのはプロキシサーバに複数のメッセージがある場合だけで、そうでない場合は遅延時間を伴うオニオンルーティングのように振る舞うということです。
>
> ミックスネットはオニオンルーティングのようにレイヤーの暗号化を使わない。
>
> オニオンルーティングはプライバシーを守るために開発されたもので、セキュリティのためではない。そのため、誰かがあなたの回線の最初のノードと最後のノードの間に侵入し、トラフィック解析を使って、あなたの居場所と、最後のノードが暗号化することなく宛先にリクエストを送信するため、あなたが何を探しているのかを知ることができる。

## まとめ

> if it wasn't because of all the messages,the bouncing and redirection a mix net would work as same as onion routing but without encryption.

> もしすべてのメッセージ、バウンス、リダイレクトがなければ、ミックスネットは暗号化なしでオニオンルーティングと同じように機能するだろう。

## ２つの違い

* オニオンルーティングには暗号化がある。
* Mixnetは遅延を入れる。オニオンルーティングは遅延を入れない。
* Mixnetはバウンスをする。
XserverにComposer 2をインストール

<p class="codepen" data-height="445" data-default-tab="result" data-slug-hash="bGPLbjj" data-pen-title="Untitled" data-user="04" style="height: 445px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/bGPLbjj">
  Untitled</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# なぜエックスサーバーはComposer 2が使えないのだ😠

## Composer 2をインストール
```bash
alias php=php8.3
curl -s https://getcomposer.org/installer | php
alias composer='php composer.phar'
```

### aliasを使わない場合
```bash
# ~/.bash_profileにあるPATH=$PATH:$HOME/binでは優先順位の関係でphp8.3が反映されない
echo -e '\nPATH=$HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
mkdir -p ~/bin
ln -s /usr/bin/php8.3 ~/bin/php
curl -s https://getcomposer.org/installer | php
mv composer.phar ~/bin/composer
hash -r
```

https://reasonable-code.com/linux-path-priority/

https://qiita.com/kawamurakeigo/items/bdf460d1cbe73769f615

https://analyzegear.co.jp/blog/1694

https://note.com/iyken/n/ne42926da5724

https://qiita.com/solabito331/items/ba45d574dd741842bd7d
foobar2000でColumns UIを導入して細かいUIのカスタマイズ

# 概要

foobar2000には最初から『Default User Interface』という設定項目があり、フォントや背景色など **ある程度は** カスタマイズできます。
ですが『Columns UI』というコンポーネントをインストールした方がより細かくカスタマイズできます。

この記事ではそのコンポーネントの導入について書いています。

# Columns UIのダウンロードとインストール

https://yuo.be/columns-ui

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/5a6d47df-7602-5024-5078-ecabbee50e81.png)

ダウンロードされたファイルをダブルクリックでOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c89e25b7-95b8-267f-8911-684cd3c9cd56.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c3245da0-79f2-b87b-d077-2194d0ef80df.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c4ad76f0-61db-5ec0-b74e-6aa58f86655c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0345138c-c53d-2aba-c4e3-7442acadf626.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c8b026d3-4e18-b2f4-2316-3ab4ecfcf5ff.png)

# UI設定

『Library』の『Configure』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ed83556b-ae85-c924-0831-26e50045097a.png)

『Columns UI』配下の項目でいろいろ設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/65fff8c9-d98b-12aa-73dd-3ebcea2382dd.png)

こんなふうにアルバムをくくってくれるのが結構見やすいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/69bd395e-a8fc-b9d0-f6a5-f2d6783cfb68.png)

# 参考サイトさん

https://www.gigafree.org/music-player/columns-ui/

https://note.com/pedigree_lab/n/ne4422318aee1

https://foobar2000.xrea.jp/?User+interface#j0e989fc

# バージョン

Microsoft Windows [Version 10.0.22631.4037]
foobar2000 v2.1.5 [×64]
XGBoostを使用したPython機械学習チュートリアル（データ可視化付き）


## 第1章: XGBoostの概要

XGBoostは高性能な勾配ブースティングライブラリです。決定木アルゴリズムを使用し、高速で正確な予測モデルを構築できます。

```python
import xgboost as xgb
print(xgb.__version__)
```

## 第2章: データの準備

必要なライブラリをインポートし、データを読み込みます。

```python
import pandas as pd
from sklearn.model_selection import train_test_split

data = pd.read_csv('data.csv')
X = data.drop('target', axis=1)
y = data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
```

## 第3章: XGBoostモデルの作成

XGBoostモデルを初期化し、パラメータを設定します。

```python
model = xgb.XGBClassifier(
    max_depth=3,
    learning_rate=0.1,
    n_estimators=100,
    objective='binary:logistic'
)
```

## 第4章: モデルの学習

作成したモデルをトレーニングデータで学習させます。

```python
model.fit(X_train, y_train)
```

## 第5章: 予測と評価

学習したモデルを使用して予測を行い、精度を評価します。

```python
from sklearn.metrics import accuracy_score

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'精度: {accuracy:.2f}')
```

## 第6章: 特徴量の重要度の可視化

XGBoostモデルの特徴量の重要度を可視化します[3]。

```python
import matplotlib.pyplot as plt

xgb.plot_importance(model)
plt.show()
```

## 第7章: 決定木の可視化

XGBoostモデルの個々の決定木を可視化します[5]。

```python
xgb.plot_tree(model, num_trees=0)
plt.show()
```

## 第8章: 学習曲線の可視化

モデルの学習過程を可視化します。

```python
results = model.evals_result()
epochs = len(results['validation_0']['error'])
x_axis = range(0, epochs)

fig, ax = plt.subplots()
ax.plot(x_axis, results['validation_0']['error'], label='Train')
ax.plot(x_axis, results['validation_1']['error'], label='Test')
ax.legend()
plt.ylabel('Error')
plt.title('XGBoost Error')
plt.show()
```

## 第9章: クロスバリデーション

モデルの汎化性能を評価するためにクロスバリデーションを実行します[4]。

```python
from sklearn.model_selection import cross_val_score

cv_scores = cross_val_score(model, X, y, cv=5)
print(f'クロスバリデーションスコア: {cv_scores.mean():.2f} (+/- {cv_scores.std() * 2:.2f})')
```

## 第10章: ハイパーパラメータチューニング

グリッドサーチを使用してハイパーパラメータを最適化します。

```python
from sklearn.model_selection import GridSearchCV

param_grid = {
    'max_depth': [3, 4, 5],
    'learning_rate': [0.1, 0.01, 0.001],
    'n_estimators': [100, 200, 300]
}
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X, y)
print(f'最適パラメータ: {grid_search.best_params_}')
```

## 第11章: 予測結果の可視化

予測結果を散布図で可視化します。

```python
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_pred, cmap='viridis')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('XGBoost Predictions')
plt.colorbar(label='Predicted Class')
plt.show()
```

## 第12章: モデルの保存と読み込み

学習したモデルを保存し、後で読み込むことができます。

```python
model.save_model('xgboost_model.json')
loaded_model = xgb.XGBClassifier()
loaded_model.load_model('xgboost_model.json')
```

このチュートリアルでは、XGBoostの基本的な使用方法と、データ可視化ライブラリを活用した結果の表示方法を紹介しました。各章で実践的なコード例を提供し、モデルの学習から評価、可視化まで一連のプロセスを解説しました。
Vue.jsとReactの違い

## Reactの特徴

Reactは、Meta社（旧Facebook社）が開発したJavaScriptのライブラリで、Webアプリケーションにおけるユーザーインターフェース（UI）の構築に特化している。

- UIをコンポーネントと呼ばれる部品単位に分割して開発する
- 仮想DOMという技術を使って、UIの変更箇所のみを効率的に再描画する
- 「JSX」と呼ばれるHTMLに似た独自の構文を使用する
- サードパーティ製ツールやライブラリに恵まれている
- 単方向データバインディング
- TypeScriptとの親和性の良さ



## Vueの特徴

Vue.jsはGoogleのエンジニアだったEvan You氏によって開発されたJavaScriptのフレームワークで、軽量でシンプルな設計思想が特徴的で、比較的小規模なWebアプリケーション開発に適している。

- HTMLに似たテンプレート構文を採用している為、学習コストが低い
- 仮想DOMの差分適用回数がReactより多い傾向があるため、パフォーマンスではやや劣る

- 日本語ドキュメントが充実している
- 軽量さとシンプルさが強み　小規模開発に向いている
- 双方向データバインディング


## ReactとVueの違い

- ReactはUIに特化した「ライブラリ」であるのに対し、Vue.jsはフレームワークの体裁を持っている
- Reactは仮想DOMの差分適用をできるだけ最小限に抑える工夫がされているが、Vue.jsは、仮想DOMの更新回数がどうしても多くなる傾向にある
- 大規模なアプリケーション開発にはReactが、中小規模の開発にはVue.jsが向いている
Dynmapでリバプロ(apacheもあるよ)

## Minecraftserverのdynmap_proxy_apache
初記事なのでお見苦しいところもあるかと思いますが温かい目でご覧ください

環境説明？
proxmoxの環境下でUbuntuserverを動かしてるのが私の環境です

んでapacheのこれで動かすと
```ruby:/etc/apache2/mods-enabled/proxy.conf
ProxyRequests off
ProxyPass "/map" "http://192.168.2.113:8123/"
ProxyPassReverse "/map" "http://192.168.2.113:8123/
```
白画面で台パンしたくなりますよね
色々日本語でネットサーフィンしても対して解決しない
んでDuckDuckGoで英語だったら出てくるんじゃね？
ってことで調べたら
https://serverfault.com/questions/799012/dynmap-through-mod-proxy-on-a-external-webserver
こんなサイトがこれでもなぜかマップレンダリングはされず
ChatGPTに質問攻めして
```ruby:/etc/apache2/mods-enabled/proxy.conf
ProxyRequests off

ProxyPass "/map"                "http://192.168.2.113:8123/"
ProxyPass "/js"                 "http://192.168.2.113:8123/js/"
ProxyPass "/js/minecraft"       "http://192.168.2.113:8123/js/minecraft/"
ProxyPass "/js/map"             "http://192.168.2.113:8123/js/map/"
ProxyPass "/css"                "http://192.168.2.113:8123/css/"
ProxyPass "/standalone"         "http://192.168.2.113:8123/standalone"
ProxyPass "/up/configuration"   "http://192.168.2.113:8123/up/configuration"
ProxyPass "/map/js/config.js"   "http://192.168.2.113:8123/js/config.js"
ProxyPass "/images" "http://192.168.2.113:8123/images"
ProxyPass "/images/map/tiles" "http://192.168.2.113:8123/images/map/tiles"
ProxyPass "/tiles" "http://192.168.2.113:8123/tiles"
ProxyPass "/version.js" "http://192.168.2.113:8123/version.js"
ProxyPass "/update" "http://192.168.2.113:8123/update"
ProxyPass "/up/configuration"   "http://192.168.2.113:8123/up/configuration"

ProxyPassReverse "/map"         "http://192.168.2.113:8123/"
ProxyPassReverse "/js"          "http://192.168.2.113:8123/js/"
ProxyPassReverse "/js/minecraft" "http://192.168.2.113:8123/js/minecraft/"
ProxyPassReverse "/js/map"      "http://192.168.2.113:8123/js/map/"
ProxyPassReverse "/css"         "http://192.168.2.113:8123/css/"
ProxyPassReverse "/standalone"  "http://192.168.2.113:8123/standalone"
ProxyPassReverse "/up/configuration" "http://192.168.2.113:8123/up/configuration"
ProxyPassReverse "/map/js/config.js" "http://192.168.2.113:8123/js/config.js"
ProxyPassReverse "/images" "http://192.168.2.113:8123/images"
ProxyPassReverse "/images/map/tiles" "http://192.168.2.113:8123/images/map/tiles"
ProxyPassReverse "/tiles" "http://192.168.2.113:8123/tiles"
ProxyPassReverse "/version.js" "http://192.168.2.113:8123/version.js"
ProxyPassReverse "/update" "http://192.168.2.113:8123/update"
ProxyPassReverse "/up/configuration"   "http://192.168.2.113:8123/up/configuration"
```
ここに辿り着いたけどこれでもなぜか自動更新されなくプレイヤーも表示されない
これじゃ使い勝手が悪いななんて思いながこれ以上が見つからず諦めてたところ
試しにnginxってリバプロ性能高いよなんて書いてあった
だけどずっとapacheを使ってたせいで抵抗感がすごくあったんだけど試しに使ったら動いた
https://qiita.com/yoidea/items/b514406e77b984e5d5c1
この方のを参考に(まるパクり)
でもapacheで組んでるから移行めんどっちいななんて思ってたら
試しにリバプロをリバプロすればっと思いつきためにやってみたらなんか動いちゃったので
```ruby:/etc/apache2/mods-enabled/proxy.conf
ProxyRequests off

ProxyPass /map http://192.168.2.148/dynmap
ProxyPassReverse /map http://192.168.2.148/dynmap
```
こんなので動いっちゃった

メモ兼困ってる人用に残しておきます
それでは
【ROS2】ノードの作成~実行の手順

# 概要

ROS2でノードを作成、実行する際のノウハウを記載する。

# ノード作成~実行 手順

## 手順1: パッケージの作成

下記のコマンドを実行して、パッケージを作成することができる。

```bash
ros2 pkg create [パッケージ名]
```

追加できる主要なオプションには以下のものがある。

### build-type

`--build-type [ビルドタイプ]` を追加することで、ビルドタイプを指定することができる。

`--build-type ament_python` でPython, `--build-type ament_cmake` でcmakeを指定できる。

### dependencies

`--dependencies [パッケージ名]` を追加することで、依存するパッケージを指定することができる。

### node-name

`--node-name [ノード名]` を追加することで、ノードも作成することができる。

## 手順2: ビルド

下記のコマンドを実行して、パッケージをビルドすることができる。

```bash
colcon build --symlink-install
```

`--symlink-install` オプションを追加することで、パッケージ内のPythonのソースコードを変更した場合に再ビルドが不要になる。
パッケージを指定してビルドしたい場合は `--package-select [パッケージ名]` を追加する。
また、再ビルドする際は、ビルド実行前に下記コマンドを実行してキャッシュを削除しておくことが好ましい。

```bash
rm -rf build install
```

## 手順3: 設定ファイルの反映

下記のコマンドを実行して、ROS2システムの設定を反映することができる。

```bash
source /opt/ros/humble/setup.bash
```

なおARCで使用しているDocker環境では、コンテナ起動時に上記コマンドが実行されるようになっているため、手動での実行は不要である。

次に、下記のコマンドを実行して、オーバーレイの設定を反映することができる。

```bash
source install/setup.bash
```

## 手順4: ノードの実行

下記のコマンドを実行して、ノードを実行することができる。

```bash
ros2 run [パッケージ名] [ノード名]
```

# ハンズオン

```bash
ros2 pkg create --build-type ament_python --node-name sample_node sample_package
```

上記コマンドを実行し、sample_packageパッケージを作成する。
オプションで設定した項目は以下の通りである：

- ビルドタイプをPythonに設定
- sample_nodeノードを作成

パッケージ内のファイル構成は次のようになる：

sample_package
│　package.xml
│　setup.cfg
│　setup.py
│
├─resource
│　　　sample_package
│
├─sample_package
│　　　sample_node.py
│　　　\_\_init\_\_.py
│
└─test
　　　　 test_copyright.py
　　　　 test_flake8.py
　　　　 test_pep257.py

sample_node.pyの中身は次のようになっている：

```python
def main():
    print('Hi from sample_package.')

if __name__ == '__main__':
    main()
```

本来はここにノードを実装していくが、今回はこのままとする。

以下のコマンドを実行し、ビルド~ノードの起動を行う。

```bash
colcon build --symlink-install
source install/setup.bash
ros2 run sample_package sample_node
```

以下の標準出力が行われていることから、正常にノードが起動できていることがわかる。

```bash
Hi from sample_package.
```
AtCoder 勉強記録[C++] その52

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
## B - Longest Uncommon Prefix
[B - Longest Uncommon Prefix](https://atcoder.jp/contests/abc285/tasks/abc285_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  string s;
  cin >> s;
  for(int i = 1; i < n; i++){
    ll res = 0;
    for(int j = 0; j < n-i; j++){
      if(s[j]!=s[j+i]) res = j+1;
      else break;
    }
    cout << res << endl;
  }
}
```
### 解法
0から`N-1`までの`j`の間で、0から`N`までの`i`において`S[j] = S[j+i]`である場合の`j`の最大値を求める。
## B - Cat
[B - Cat](https://atcoder.jp/contests/abc286/tasks/abc286_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<int>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n;
  cin >> n;
  string s;
  cin >> s;
  while(1){
    bool jud = true;
    for(int i = 0; i < s.size(); i++){
      string na = s.substr(i, 2);
      if(na == "na") {
        s.insert(i+1, "y");
        jud = false;
        break;
      }
    }
    if(jud) break;
  }
  cout << s << endl;
}
```
### 解法
文字列`S`においてある2文字が`na`であった場合、間にyを挿入することで結果が求まる。