OmniAICreator/Qiita-1.07M huggingface dataset:
MIDI



### ✅ MIDI Text形式（Header: format=1 nTracks=2 division=480）

```
Header: format=1 nTracks=2 division=480

Start Track
Tempo 500000
Time_signature 4/4 24 8
End Track

Start Track
Program_c 0 1

Note_on_c 0 0 60 64     ; C4 - かえ（ド）
Lyric 0 "かえ"
Text 0 "(ド)"
Note_off_c 0 480 60 0

Note_on_c 0 0 62 64     ; D4 - るの（レ）
Lyric 0 "るの"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 64 64     ; E4 - う（ミ）
Lyric 0 "う"
Text 0 "(ミ)"
Note_off_c 0 480 64 0

Note_on_c 0 0 65 64     ; F4 - た（ファ）
Lyric 0 "た"
Text 0 "(ファ)"
Note_off_c 0 480 65 0

Note_on_c 0 0 64 64     ; E4 - が（ミ）
Lyric 0 "が"
Text 0 "(ミ)"
Note_off_c 0 480 64 0

Note_on_c 0 0 62 64     ; D4 - き（レ）
Lyric 0 "き"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 60 64     ; C4 - こ（ド）
Lyric 0 "こ"
Text 0 "(ド)"
Note_off_c 0 480 60 0

Note_on_c 0 0 60 64     ; C4 - え（ド）
Lyric 0 "え"
Text 0 "(ド)"
Note_off_c 0 480 60 0

Note_on_c 0 0 62 64     ; D4 - かえ（レ）
Lyric 0 "かえ"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 64 64     ; E4 - るの（ミ）
Lyric 0 "るの"
Text 0 "(ミ)"
Note_off_c 0 480 64 0

Note_on_c 0 0 62 64     ; D4 - う（レ）
Lyric 0 "う"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 60 64     ; C4 - た（ド）
Lyric 0 "た"
Text 0 "(ド)"
Note_off_c 0 480 60 0

Note_on_c 0 0 62 64     ; D4 - が（レ）
Lyric 0 "が"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 64 64     ; E4 - き（ミ）
Lyric 0 "き"
Text 0 "(ミ)"
Note_off_c 0 480 64 0

Note_on_c 0 0 65 64     ; F4 - こ（ファ）
Lyric 0 "こ"
Text 0 "(ファ)"
Note_off_c 0 480 65 0

Note_on_c 0 0 67 64     ; G4 - え（ソ）
Lyric 0 "え"
Text 0 "(ソ)"
Note_off_c 0 480 67 0

Note_on_c 0 0 65 64     ; F4 - わ（ファ）
Lyric 0 "わ"
Text 0 "(ファ)"
Note_off_c 0 480 65 0

Note_on_c 0 0 64 64     ; E4 - な（ミ）
Lyric 0 "な"
Text 0 "(ミ)"
Note_off_c 0 480 64 0

Note_on_c 0 0 62 64     ; D4 - け（レ）
Lyric 0 "け"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 60 64     ; C4 - げ（ド）
Lyric 0 "げ"
Text 0 "(ド)"
Note_off_c 0 480 60 0

Note_on_c 0 0 60 64     ; C4 - け（ド）
Lyric 0 "け"
Text 0 "(ド)"
Note_off_c 0 480 60 0

Note_on_c 0 0 62 64     ; D4 - け（レ）
Lyric 0 "け"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 64 64     ; E4 - け（ミ）
Lyric 0 "け"
Text 0 "(ミ)"
Note_off_c 0 480 64 0

Note_on_c 0 0 62 64     ; D4 - け（レ）
Lyric 0 "け"
Text 0 "(レ)"
Note_off_c 0 480 62 0

Note_on_c 0 0 60 64     ; C4 - け（ド）
Lyric 0 "け"
Text 0 "(ド)"
Note_off_c 0 480 60 0

End Track
End_of_file
```
【初心者向け】プログラミング学習中のコメントの書き方のコツ【Laravel/PHP】

プログラミング学習中にありがちなのが、「コメントがごちゃごちゃして読みにくくなる問題」。

特にLaravelのようなフレームワークを学んでいると、処理の意味をコメントに残しておきたくなりますよね。でも、コメントが長くなりすぎると逆に読みにくくなってしまいます。

この記事では、学習中でも読みやすく、後で見返しても理解しやすいコメントの書き方を紹介します。



# ✅ 基本の考え方
・コメントは「処理の目的」を短く書く

・どうしても長くなるときは「上にまとめて」書く

・コード1行に対して、コメントも1行が基本



# 🟩 おすすめコメントスタイル
## 1. ステップ形式で処理の流れを見せる
```php
// 1. 入力値を取得（ブランド名）
$brandName = $this->input("bento_brands.$index");

// 2. 既存ブランドを検索
$brand = BentoBrand::where('name', $brandName)->first();

// 3. なければ新規作成
if (!$brand) {
    $brand = BentoBrand::create(['name' => $brandName]);
}
```
👉 コメントで処理の流れを整理するだけで理解がスムーズに。


## 2. セクションで分ける
```php
// ------------------------------
// ブランド名の取得と保存処理
// ------------------------------
```
👉 長くなる処理のまとまりにはセクションで区切るとスッキリ。


## 3. 詳しい解説は「コメントブロック」で上にまとめる
悪い例（ありがち）：
```php
// $this->input()はFormRequestクラスの中で使えるメソッドで
// LaravelのRequestから値を取得するメソッドの1つで、
// "bento_brands.$index"という指定の方法で、配列形式の入力値の中から
// 特定の値を取得する。ちなみに、$indexはループなどで回すときの添字。
$brandName = $this->input("bento_brands.$index");
```
これは読みづらい！
👇

良い書き方：
```php
/*
  フォーム入力（配列形式）からブランド名を取得する。
  - `$this->input()` は FormRequest クラスで使える Laravel のメソッド
  - `"bento_brands.$index"` で配列内の特定位置を指定
  - `$index` はループの添字などで使う
*/
$brandName = $this->input("bento_brands.$index");
```



# ❌ コメントがごちゃごちゃする原因
| 原因           | 解決策                    |
| ------------ | ---------------------- |
| 説明を1行ずつ書きすぎる | → ブロックコメントで上にまとめる      |
| コードの後に長文を並べる | → コードの**前**に説明する       |
| 情報が多すぎる      | → 箇条書きで分ける or ステップに分ける |



# ✍️ まとめ
・処理がシンプルなら // 〇〇を取得 程度でOK

・長くなるなら /* ... */ でまとめて前に

・見やすさが最優先、将来の自分が読めるかが大事
リソースモニター(sysstat, sar)

sarを使ってリソース状況を確認する。
参考にさせていただいたページ

https://qiita.com/yasushi-jp/items/d2afe3f0be58297d2221

# レポートを作成する

## sar
collectorが作成したファイルからレポート
```sh:
$ sar [ -f ファイル ] OPT 
```

いまから、インターバル×回数 測定して、ファイルへ出力
```sh:
$ sar [ -o ファイル ] OPT インターバル 回数
$ sar [ -f ファイル ] OPT 
```



## sarのオプション、表示項目
| オプション | 用法 |
| :---- | :---- |
| == CPU ==| |
| -u | CPU %user %nice %system %iowait %steal %idle |
| -u ALL | + %irq %soft %guest %gnice %idle |
| -q LOAD | runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked |
| -w | Task creation and Context switching |
| | proc/s cswch/s |
| -I ALL | INTR intr/s |
| == IO == | |
| -b | IOと転送レート | 
| | tps rtps wtps dtps bread/s bwrtn/s bdscd/s | 
| -d | BLOCKデバイス毎の情報 |
| | DEV tps rkB/s wkB/s dkB/s areq-sz aqu-sz await %util |
| == NW == | |
| -n ALL | |
| -n DEV<BR>NW Statistics | IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil |
| -n NFS <BR> NFS client |  call/s retrans/s read/s write/s access/s getatt/s |
| -n NFSD <BR> NFS server | scall/s badcall/s  packet/s     udp/s     tcp/s     hit/s    miss/s   sread/s  swrite/s saccess/s sgetatt/s |
| == Memory == | |
| -r | kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty |
| -r ALL | + kbdirty  kbanonpg    kbslab  kbkstack   kbpgtbl  kbvmused |
| -S | Swap Statistics |
| | kbswpfree kbswpused %swpused kbswpcad %swpcad |
| -W | Swapping Statistics |
| | pswpin/s pswpout/s |
| -B | Paging Statistics |
| | pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff |

## sarのオプション、時刻ほか
| 用途 | オプション | 併用オプション |
| :--- | :--- | :--- | 
| 時刻範囲 | ```-s 18:00:00 -e 18:10:00``` | | 
| Interface | ```--iface=eth0,br-a91c3bb56c36``` | -n DEV | 
| Device | ```--dev=sda``` | -b, -d | 
| CPU | ```-P 0,1```<BR>```-P ALL``` | -u |

# 準備(debianの場合)

## インストール
```# apt install sysstat ```


## sysstatの有効化
  
  systemd-timerで動かす場合は不要かもしれないが、修正した
```conf:/etc/default/sysstat
# Default settings for /etc/init.d/sysstat, /etc/cron.d/sysstat
# and /etc/cron.daily/sysstat files

# 有効化
# ENABLED="false"
ENABLED="true"
```
## ログの保存日数、collectorのオプション、ログの出力先ディレクトリ
  
```conf:/etc/sysstat/sysstat
# ログの保存日数
# HISTORY=7
HISTORY=35

# 取得情報の設定
# SADC_OPTIONS="-S DISK"
SADC_OPTIONS="-S DISK -S INT"

# ログ出力先
# SA_DIR=/var/log/sysstat
SA_DIR=/mnt/usbhdd/sysstat-log
```

## systemd,systemd-timerの設定
 - /usr/lib/systemd/system/sysstat.service : デフォルトのまま
 - /usr/lib/systemd/system/sysstat-collect.service : デフォルトのまま
 - /usr/lib/systemd/system/sysstat-summary.service : デフォルトのまま
 - /usr/lib/systemd/system/sysstat-collect.timer : 測定間隔の設定
 １０分間隔（デフォ）を２分間隔に変更する例
 
 ```conf:sysstat-collect.timer
 [Timer]
# OnCalendar=*:00/10
OnCalendar=*:00/2
```

- /usr/lib/systemd/system/sysstat-summary.timer : レポート作成の時刻設定
```conf:sysstat-summary.timer
[Timer]
OnCalendar=00:07:00
```
## systemdの再起動
```
# systemctl daemon-reload
# systemctl enable sysstat
# systemctl start sysstat
```

## 起動時間の確認
```
# systemctl list-timers
```
SweetAlert2

### 利用目的 : 履歴一括削除 / ユーザー情報のアカ消したい時の警告表示

```js:
Swal.fire({
  title: '本当に削除しますか？',
  text: "一度削除すると元に戻せません！",
  icon: 'warning',
  showCancelButton: true,
  confirmButtonText: 'はい、削除します',
  cancelButtonText: 'キャンセル'
}).then((result) => {
  if (result.isConfirmed) {
    // 削除処理をここに書く
  }
});
```
椎名林檎進行



### 🔁 コード進行（Key=C）

**||: FMaj7 | E7 | Am7 | Gm7 | C7 :||**
拍子：4/4（1小節＝6ストローク）

---

### ■ FMaj7（F・A・C・E）

| 拍 | 1 & 2 & 3 & 4 & |
| - | --------------- |
|   | ↓　↓　↑　↑　↓　↑     |

```
e|--0-- 0-- --0-- --0--  0--  0--| ← E（ミ）
B|--1-- 1-- --1-- --1--  1--  1--| ← C（ド）
G|--2-- 2-- --2-- --2--  2--  2--| ← A（ラ）
D|--3-- 3-- --3-- --3--  3--  3--| ← F（ファ）
A|--x-- x-- --x-- --x--  x--  x--| ← × ミュート（親指や指腹）
E|--x-- x-- --x-- --x--  x--  x--| ← × ミュート
```

---

### ■ E7（E・G#・B・D）

```
e|--0-- 0-- --0-- --0--  0--  0--| ← E（ミ）
B|--0-- 0-- --0-- --0--  0--  0--| ← B（シ）
G|--1-- 1-- --1-- --1--  1--  1--| ← G#（ソ♯）
D|--0-- 0-- --0-- --0--  0--  0--| ← D（レ）
A|--2-- 2-- --2-- --2--  2--  2--| ← B（シ）
E|--0-- 0-- --0-- --0--  0--  0--| ← E（ミ）
```

---

### ■ Am7（A・C・E・G）

```
e|--0-- 0-- --0-- --0--  0--  0--| ← E（ミ）
B|--1-- 1-- --1-- --1--  1--  1--| ← C（ド）
G|--0-- 0-- --0-- --0--  0--  0--| ← G（ソ）
D|--2-- 2-- --2-- --2--  2--  2--| ← A（ラ）
A|--0-- 0-- --0-- --0--  0--  0--| ← A（ラ）
E|--x-- x-- --x-- --x--  x--  x--| ← × ミュート
```

---

### ■ Gm7（G・Bb・D・F）

```
e|--1-- 1-- --1-- --1--  1--  1--| ← F（ファ）
B|--3-- 3-- --3-- --3--  3--  3--| ← D（レ）
G|--3-- 3-- --3-- --3--  3--  3--| ← Bb（シ♭）
D|--3-- 3-- --3-- --3--  3--  3--| ← G（ソ）
A|--x-- x-- --x-- --x--  x--  x--| ← × ミュート
E|--3-- 3-- --3-- --3--  3--  3--| ← G（ソ）
```

---

### ■ C7（C・E・G・Bb）

```
e|--0-- 0-- --0-- --0--  0--  0--| ← E（ミ）
B|--1-- 1-- --1-- --1--  1--  1--| ← C（ド）
G|--3-- 3-- --3-- --3--  3--  3--| ← Bb（シ♭）
D|--2-- 2-- --2-- --2--  2--  2--| ← E（ミ）
A|--3-- 3-- --3-- --3--  3--  3--| ← C（ド）
E|--x-- x-- --x-- --x--  x--  x--| ← × ミュート
```
Express Tips

# 親ルータのパラメータ引継ぎ

/commands/:commandId/subcommands/:subcommandId
としたとき
```javascript:index.js
import express from "express";
import commandsRouter from "./commands.js"
import subcommandsRouter from "./subcommands.js"

const app = express();
app.use("/commands",commandsRouter);
commandsRouter.use("/:commandId/subcommands",subcommandsRouter);
```
```javascript:commands.js
import {Router} from "express";
const router = Router();
router.get("/:commandId",(req,res) => {
    ...
});
export default router;
```
```javascript:subcommand.js
import {Router} from "express";
const router = Router({mergeParams:true}); // ★このオプションをつけないと
router.get("/:subcommandId",(req,res) => {
    console.log(req.params.commandId); // ★commandIdが取得できない
    console.log(req.params.subcommandId);
});
export default router;
```
GoogleAdmob導入時にEXC_BAD_ACCESS (code=EXC_I386_GPFLT)でクラッシュした

#### 経緯
iOSアプリにGoogleAdmobを導入するためにpod installを行った。
その後アプリのエントリーポイントを修正し、ビルドを行うとEXC_BAD_ACCESS (code=EXC_I386_GPFLT)が発生。

#### 原因
info.plistにGADApplicationIdentifierの値を設定していなかったことが原因でした。

開発段階では以下を設定することでテスト広告を表示することができる。
`ca-app-pub-3940256099942544~1458002511`

本番にリリースするときには、GoogleAdmobからリリース対象のアプリIDに置き換えましょう！
Mozcが使いにくい！Fcitxで日本語入力を簡単に

:::note warn
表示されているのは筆者が一時的に成功した設定方法です。
確実に不具合無しに動作させるには、他の方の記事か、この記事最後尾の折りたたみを参照してください。
:::

# なにこれ？
ターミナルとかで英語入力を早くするために違う配列を練習したけど、日本語入力は使い慣れたQwerty配列を使いたいなぁ...
でも、Mozcだと配列が切り替わらないんだよなぁ...
しかもsuper+spaceで切り替えられないし...
もう全部英語で入力するしか...

待ってください。
オタクのラテン語とも言われる日本語を捨てるのですか？
ネイティブなのに？
誉れはどこですか？
浜ですかそうですか。

ということで、**第二言語に異なる配列を使うユーザー向け**に、入力を簡単に素早く切り替える方法を発見したので共有します。

# Mozc? Fcitx?
Mozcとは、<ins>Google日本語入力(日本語IME)</ins>のオープンソース版のことを指します。これは、**インプットメソッド**と呼ばれるソフトウェアで、コンピューターに文字を入力するために使用します。

対するFcitxは、**インプットメソッドフレームワーク**というもので、ソフトウェア開発者が似通った目的のプログラムを構築する際の手間を省くための枠組みの集合、所謂テンプレートのことです。

詳しく知りたい方は、以下のURLからリンクを辿って行けばいいことがあるかもしれません。

https://ja.wikipedia.org/wiki/Google_%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B

# 設定
今回私が試した環境は以下のノートの通りです。
念の為、apt updateをしておくといいかもしれません。
準備ができたら始めましょう！

:::note info
Ubuntu 24.04.2 LTS
クリーンインストール直後
:::

1.Fcitx-5をインストール
```bash:
sudo apt install fcitx5-mozc
```

2.設定->システム->地域と言語->Manage Installed Languages->キーボードに使うIMシステム->Fcitx5

3.再起動
```bash:
reboot
```

4.デスクトップ右上のアイコンをクリックして設定に入る

5.Defaultグループに、**普段のログイン時にpasswordを入力している**配列を入れる

6.入力メソッドタブのグループの横にある+を押して、日本語用のグループを作成

7.作成したグループにMozcのみを入れる

8.Mozcを選択して、ウィンドウ中央のキーボードのアイコンをクリック

9.レイアウトをjapaneseに変更する

10.設定を保存

11.Mozcの設定を開き、キー設定の選択->編集->エントリーを追加。以下のテーブルの内容を追加する。
|モード|入力キー|コマンド|
|:-:|:-:|:-:|
|入力文字なし|Ctrl Space|IMEを無効化|
|直接入力|Ctrl Space|IMEを有効化|

12.再起動

<details><summary>Option</summary>

グローバルオプションタブで明らかに不要な項目を削除する
8のアイコンの上にある歯車からInitial modeを変更すると、Mozcに切り替えた直後の入力モードを変更可能

</details>

---
設定は以上になります。

super+spaceで配列の切り替え、Mozc使用時にはctl+spaceで仮名入力の切り替えが可能になっているはずです。

失敗した場合は、もう一度4から手順を確認してください。
無事完了した方は、おめでとうございます！
お疲れ様でした！

# 終わりに
個人的に日本語が使いにくいことはUbuntu利用における最大の弊害でしたが、これで悩みが一つ減りました。
UbuntuなどのLinux系OSは、Windowsと比較した場合、それだけで選択する理由になるほどの大きなメリットが多数存在します。例えば、OSのシステムリソース使用率が低いことは無視できないメリットの一つです。自分好みにシステムの殆どをカスタマイズできる自由度の高さも好まれる要素です。そして忘れてはいけないのが、OSが無料で手に入るということです！凄くないですか？開発者の方々には頭が上がりません...！
Windows11と殆ど同じ入力操作が可能になるため、眠っている低スペックPCをSNSやブログ執筆などの軽作業専用機として運用することも実用圏内に入るのではないでしょうか？
~~さぁ、今すぐTwitterへ繰り出して、日本の誇る美しい「***文化***」を綴り、世界に見せつけよう！~~
それでは、良いUbuntuライフを！

### 参考
https://widedeepspace.net/2024/05/12/1529/

-----

<details><summary>重要　上記設定の不具合について</summary>

6/22追記 再ログイン後にグループの切り替えが不可に。何故かsuperがfcitx5に認識されない。OS側のショートカットをsuper以外に変更しても変わらない。
fcitx5側でグループ変更キーを変更すると正常に動作。x11でも同様に動作。

```bash:
xev | grep key
```
を実行してsuperが入力されるか試したが、全く無反応。（使用しているキーボードの右側にあるsuperはkeycode 134として認識した。fcitx5内の設定で組み合わせることはできなかった）
しかし、super単体ではアクティビティの表示をするので、おそらくGNOMEによってfcitx5へ入力が渡されない？ようになっている。
原因はfcitx5より深いレイヤーのソフトウェアがsuperキーを認識しないように制限しているからだった。

以下、一時的な二通りの代替案。

:::note info
1.Default一つにグループをまとめる。ctrl+spaceで配列の切り替えが可能。
(11.で設定したmozcの追加エントリーを戻さないと稀に全角入力が直接入力になる？)
2.グループ切り替えを別のキーに変更。右shiftなど。
:::

今回の記事はwindows11のような入力をubuntuで簡単に実現できることを目的としていた。
gnome以外の環境であれば実現可能なのかもしれない。

以上です。
</details>
【Python】Pythonの関数とメソッド

splitは文字列を分割するメソッドです。

stripは左右の空白文字を削除するメソッドです。

rstripは文字列の右側の空白を削除するメソッドです。左側の空白を削除するメソッドはlstripです。

lenは文字数をカウントする関数です。

なお、「関数」と「メソッド」の呼称は次のように使い分けます。

■ 関数
単独で呼び出せるもの。
例えばlen()は、「len('Python')」のようにlen()の前に何も付けずに呼び出すことができるため関数です。

■ メソッド
変数や値の後に付けて呼び出すもの。
例えばstrip()は、「' Python '.strip()」のようにオブジェクトの後にドットを付けて呼び出すためメソッドです。
ただし、「os.chdir()」のように、ドットの前が変数や値ではなくモジュール名の場合は関数です。
【Python】PythonとIPythonに関する説明


Pythonの文のグルーピングはインデントで行う。

Pythonのコーディング規約はPEP8にまとめられており、 pycodestyleや、Flake8などのツールでチェックできる。

IPythonは標準インタープリタの強化版として開発され、InとOutによる対話的な制御ができる。

IPythonは、TABキーによる補完と、「?」によるオブジェクトの説明表示に対応しています。

例えば、「L」というリストが定義されている状態で、「L.」に続けてTABキーを押すと、「append, copy, extend, insert, remove...」のように使用可能なメソッドを選択肢として表示してくれます。

また、「len?」とすると、「Return the number of items in a container」のように、関数やオブジェクトの説明が表示されます。これはPythonの標準インタープリタには無い機能です。
【Python】Pythonの仮想環境について

仮想環境を作成することで、異なるバージョンのライブラリを使い分けることができる。

「python -m venv sample」で仮想環境を作成する際、「sample」はディレクトリ名である。

仮想環境を抜けるコマンドは「deactivate」で、どのOSでも同じコマンドを使います。

不要になった仮想環境を削除する場合は、作成したディレクトリを削除する。
Builder.ai 事態の分析：AIウォッシング、売上操作、そして投資家欺瞞

Builder.aiは、人工知能（AI）技術に基づいてアプリを簡単に開発できると宣伝していたスタートアップ企業でした。しかし、実際にはAIではなく、数百人のインド人エンジニアを通じて手動でコーディングを行っており、売上を操作して水増しし、投資家を欺いたという疑惑が浮上し、最終的に破産手続きに追い込まれました。この事態は、AIスタートアップの誇大広告と、投資誘致のための非倫理的な慣行に対する警告と見なされています。

# 主な問題点
 * AIウォッシング (AI Washing): Builder.aiは、「Natasha」というAIアシスタントを通じて、ピザを注文するように簡単にアプリを作成できると主張していましたが、実際には700人以上のインド人エンジニアが顧客の要求に応じてコードを作成していました。これは、AIの能力を誇張したり虚偽を主張したりする「AIウォッシング」の代表的な事例とされています。
 * 売上操作および過大評価:
   * 2024年の予想売上を2億2千万ドルに水増ししていましたが、実際の監査結果はわずか5千万～5千5百万ドルに過ぎませんでした。
   * インドのソーシャルメディア企業であるVerSe Innovationと「ラウンドトリッピング (round-tripping)」という方法で売上を人為的に水増ししたという疑惑があります。これは、2つの企業が実際のサービスなしに互いに類似の金額を請求し、売上を水増しする手口です。
 * 財務上の問題と破産: 過剰な負債（Amazon Web Servicesに8,500万ドル、Microsoftに3,000万ドルなど）と売上操作の事実が明らかになり、主要債権者の一つが会社の現金3,700万ドルを差し押さえ、最終的にBuilder.aiは2025年5月に破産を宣言しました。
 * 内部告発者および監査の問題: 元役員たちは会社の欺瞞的な慣行に懸念を表明したことで解雇されたケースもあり、内部監査では適切な統制が行われていなかったという指摘も出ました。

# 投資家を欺くことができた理由
Builder.aiが投資家を欺くことができた究極的な理由は以下の通りです。
 * AIウォッシング: Builder.aiは「Natasha」というAIアシスタントを通じて、アプリ開発を革新的に簡素化できると誇大宣伝しましたが、実際には数百人のインド人エンジニアが手動でコードを作成していました。このようなAIウォッシングは、投資家に会社の技術力を誤解させました。
 * 売上水増し: 2024年の予想売上を2億2千万ドルに水増ししていましたが、実際の監査結果はわずか5千万～5千5百万ドルに過ぎませんでした。また、インドのソーシャルメディア企業であるVerSe Innovationと「ラウンドトリッピング」という方法で売上を人為的に水増ししたという疑惑があります。このような売上操作は、投資家が会社の財務状況を誤って評価することにつながりました。
 * 誤った情報: ウォールストリートジャーナルは、AIの約束がより平凡な現実を隠していたことを明らかにしました。それは、インドを拠点とする人間の開発者に大量の作業を手動で委託することです。このハイブリッドモデルは、主張された自動化と隠蔽された外部委託との間の境界線に疑問を投げかけましたが、業務の中断には至りませんでした。巧みに練られたコミュニケーションのおかげで、このスタートアップはカタール投資庁（QIA）、Insight Partners、Microsoftのような著名な投資家を魅了し、2023年には戦略的パートナーシップの一環としてAzureエコシステムにプラットフォームを統合しました。これらの名だたる投資家による暗黙の検証は、会社の信頼性を強化しました。しかし、この認識は部分的には予測値と巧妙に管理されたイメージに基づいており、常に運営上の現実に対する徹底的な検討を伴っていたわけではありません。
 * 有名投資家による検証: Microsoftやカタール政府系ファンドといった有名投資家がBuilder.aiに投資したという事実が、会社の信頼性を高めるのに貢献しました。投資家は、これらの有名投資家の決定を信頼し、Builder.aiの技術力や財務状況を適切に検証しなかった可能性があります。
# 結論
Builder.aiの破綻は、投資家にとってはデューデリジェンス（適正評価）の重要性を、スタートアップ企業にとっては透明性と倫理的な事業運営の必要性を強調する事例となりました。AIスタートアップの誇大広告と投資誘致のための非倫理的な慣行に対する警告と見なされており、投資家と消費者双方に、企業の倫理的側面を考慮することがいかに重要であるかを示しています。
[Swift] staticの基本と実務での使い所まとめ

# staticについて
staticはインスタンスを作成しなくてもアクセスできる「静的プロパティ」と呼ばれます。

## 実務で使われる場面
よく利用されるのは、アプリ全体で使う設定値や定数の管理です。
例えば長文の文字列を管理したい場合や、変更しないAPIのURLなどがあります。

### APIのURL
```swift:
struct APIConfig {
    static let baseURL = "https://api.example.com/v1"
    static let apiKey = "API_KEY"
}
```
**使い方**
```swift:
let url = URL(string: "\(APIConfig.baseURL)/user/profile?api_key=\(APIConfig.apiKey)")
```
「設定値を複数箇所で使い回す」「変更時に全体へ反映したい」
→ static letで管理するのが定石です。

### 長文の定型文・エラーメッセージの管理
```swift:
struct ErrorMessages {
    static let networkError = """
    通信エラーが発生しました。インターネット接続を確認して、もう一度お試しください。
    """
    
    static let serverMaintenance = """
    現在サーバーメンテナンス中です。ご迷惑をおかけしますが、しばらくしてから再度アクセスしてください。
    """
}
```

**使い方**
※仮のアラート表示関数です
```swift:
showAlert(title: "エラー", message: ErrorMessages.networkError)
```

現場では「画面Aと画面Bで同じ文言を使いたい」なんてことがよくあります
→ 重複を避けるためにもstaticが便利です。


## 実際に使ってみた
以下に`static`プロパティと通常のプロパティを並べて、その違いを確かめてみます。

```swift:

class SoccerTeam {

    var soccerTeamName: String

    static let teamColor: String = "Red"

    init(soccerTeamName: String) {
        self.soccerTeamName = soccerTeamName
    }

    func redTeamColor() -> String {
        return "\(soccerTeamName)のチームカラーは\(SoccerTeam.teamColor)です"
    }
}

print(SoccerTeam.teamColor)
let team = SoccerTeam(soccerTeamName: "Arsenal FC")
print(team.redTeamColor())


```


## static関連のエラー⚠️

### その1️⃣
:::note alert
Static properties may only be declared on a type
:::


これはstaticを使う場所が間違っている場合に表示されます。
つまり、staticは **「クラス・構造体・列挙型」などの型（Type）** の中でしか宣言できません。

例えば、以下のようにクラスの外側で宣言してしまうと発生します。
```swift:

static let teamColor: String = "Red"

class SoccerTeam {

    var soccerTeamName: String

}

```

### その2️⃣
:::note alert
Static property ' ' is not concurrency-safe because it is nonisolated global shared mutable state
:::

**グローバルに共有される可変の状態だから、複数スレッドから同時にアクセスされると危険だよ！** と警告をされてしまっています。
staticをグローバル変数としてvarで宣言していた場合、他からアクセスされて書換えられてしまうリスクがあると警告されます。

その場合は`@MainActor`や`actor`を付与します。これらを付与することで以下のようなメリットが得られます。
- 複数人が同時に同じものをいじって混乱するのを防ぐ
（同時アクセスによるデータの矛盾や壊れを防止）
- アクセスは「順番に1人ずつ」または「単独で」行う仕組みを作ることで安全にする

### MainActorのパターン

```swift:
import UIKit

@MainActor
class SoccerTeam {

    let name: String
    let position: String
    var goals: Int = 0

    static let soccerTeamName: String = "FC Bayern München"
    static var totalGoals: Int = 0

    init(name: String, position: String) {
        self.name = name
        self.position = position
    }

    func scoreAGoal() {
        goals += 1
        SoccerTeam.totalGoals += 1
    }

}
```

### actorのパターン

```swift:
import UIKit

actor SoccerTeam {

    let name: String
    let position: String
    var goals: Int = 0

    static let soccerTeamName: String = "FC Bayern München"
    static var totalGoals: Int = 0

    init(name: String, position: String) {
        self.name = name
        self.position = position
    }

    func scoreAGoal() {
        goals += 1
        SoccerTeam.totalGoals += 1
    }

}
```

## まとめ
staticは共通言語の設定など汎用性が高く大変便利なプロパティです。
使い勝手がいいので実務でもよく利用するため、しっかり理解し活用しようと思います
USB Over Current Detected(過電流検出) → 15 秒で電源が落ちる PC を復旧したメモ

# USB Over Current Detected → 15 秒で電源が落ちる PC を復旧した記録

### 症状

BIOS 起動中に「USB Over Current Detected」が表示され、15秒で強制シャットダウン。
![Gt8_tKmXUAAlWLL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301191/c85543af-9c95-424b-a38c-b51b9c78b7ed.jpeg)

### 試したこと

- USB 機器をすべて外す → ❌
- ケース前面 USB ケーブル抜く → ❌
- CMOS クリア（マザーボードのボタン電池抜き） → ❌
- 背面 USB ポートを確認 → ✅ **USB3.0 ポートのピンが曲がってショート状態**
![Gt8_tKwWYAAluQz.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3301191/5f3c5f14-4fce-47dd-9515-3e2f71e52abe.jpeg)

### 対処手順

1. 電源ケーブルを抜き、10秒放電  
2. 曲がったピンをピンセットで慎重に戻す  
3. テープで内部のピン同士が接触しないように軽く絶縁し、入口も封印  
4. 再起動して正常起動を確認 ✅

### メモ

だいぶ焦りました。PC触れないの泣いちゃう。

マザボ側のUSB接続やら、ボタン電池を抜いて放電させて治るパターンもあるようですが、
自分は物理的にUSBピンが曲がっていて今回の状態に陥っていました。

本来であればUSBのピンの部分は青いカバーがあるのですが、
過去に裸になっていたのを無視していた副作用がここで発動したようです。

今はChatGPTが非常に賢いので、
マザボの写真などを渡し画像を見て色々指示してもらっていました。

結局、Webブラウザを使い自力で調べた結果、物理的なピンの問題でした。

### 参考記事

https://note.com/shobo_jp/n/n35a2e78757af
連結リストの仕組みについて データ構造とアルゴリズム

## 経緯

こんにちは。時間が空いてしまいましたが、こちらで初めて技術記事を投稿します。
前回は所信表明のような投稿でしたが、今回が新たな一歩になれば嬉しいです。
CI/CD、クラウド、フロントエンド、アルゴリズムとデータ構造のあたりを今年は頑張っていきます。その辺りも今後投稿していく予定です。

今回はLeetCodeの以下の問題で少し詰まってしまった連結リストの仕組みについて、分かったことを共有していきます。該当の問題のURLを記載します。
[🔗URL: 2. Add Two Numbers](https://leetcode.com/problems/add-two-numbers/)


## 処理の説明


問題のソースコードには手を加えて簡略化しています。Pythonでコーディングしています。


### 開始



ノードのクラス

```diff_python
# サンプルコード

# 連結リストのノード
class Node:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next
```
 

dummyとtempは両方とも同一のNodeオブジェクトを参照しています
```python
# メモリ上にノードオブジェクトを作成
dummy = Node()
# tempはdummyと同じノードオブジェクトを指す
temp = dummy
```
temp.nextのデータを変更します
```python
# ノードオブジェクトの'next'フィールドを変更
temp.next = ListNode(1)
# tempを次のノードオブジェクトに移動
temp = temp.next         
```

これはdummy自体ではなく、**dummyが指しているオブジェクトを変更**しています。

以下が図にしたときの流れです。

```
dummy ──┐
        ├──► [Node: value=0, next=●] ──► [Node: value=1, next=●] ──►　...
temp  ──┘
````

### 全処理の概略

```
dummy = ListNode() → dummyはval=0のノードを指す
temp = dummy → tempも同じノードを指す

temp.next = ListNode(1) → dummyのnextに値1のノードをセット
temp = temp.next → tempが値1のノードに移動

temp.next = ListNode(2) → 値1のノードのnextに値2のノードをセット
temp = temp.next → tempが値2のノードに移動

temp.next = ListNode(3) → 値2のノードのnextに値3のノードをセット
temp = temp.next → tempが値3のノードに移動
```

以下が全体のサンプルコードです。
　
以下：


```diff_python
# サンプルコード

# 連結リストのノード
class Node:
    def __init__(self, value=0, next=None):
        self.value = value
        self.next = next


# 連結リスト
class LinkedList:

    def generate_linked_list(self): 
    
        dummy = Node()
        temp = dummy
    
        # 連結リストにノードを追加

        temp.next = ListNode(1)
        temp = temp.next
    
        temp.next = ListNode(2)
        temp = temp.next
    
        temp.next = ListNode(3)
        temp = temp.next    
    
        return dummy.next

    # 出力結果
    # dummy.val: 0
    # dummy.next: Node(value=1, next=Node(value=2, next=Node(value=3, next=None)))
    # dummy: Node(value=0, next=Node(value=1, next=Node(value=2, next=Node(value=3, next=None))))

```
## 結果：

dummyは最初のプレースホルダーのノード（value=0）を指したままになっています。

ただあくまでもdummy自体はプレースホルダーのノードを指したままのため、実際に追加したデータに関しては、dummy.nextが実際のデータの始まりであり、かつvalue=1のノードを指しています。

そのため、実際の結果としてはdummy.nextから始まる [1,2,3] になります。

## まとめ

- dummyは**常に固定** - 常に最初のプレースホルダーノードを指したまま
- dummyが指しているオブジェクトの.next項目を、**tempを通じて設定**することでオブジェクトを変更することが可能
- tempによって指し示す値が更新されても、ノードはdummyが指している元のオブジェクトを通じて繋がったまま
- dummy.nextを返す時は、プレースホルダーノードの.nextフィールドにアクセスしていて、それが全体の結果を保持している


## 引用
[GeeksforGeeks - Singly Linked List Tutorial
](https://www.geeksforgeeks.org/singly-linked-list-tutorial/)
[LeetCode - 2. Add Two Numbers](https://leetcode.com/problems/add-two-numbers/description/)
AWS完全初心者がプレーリーカードでデジタル名刺を作ってみた話

## はじめに
こんにちは。Tsukasaです！
皆さんデジタル名刺はご存知ですか？
もしかしたら初めて聞いたなんて方もいらっしゃるかもしれません。
そんな自分もつい最近までデジタル名刺って何？ってなっていた1人です。
今日はそんなつい最近までデジタル名刺が何なのかも知らなかった自分がデジタル名刺を作ってみた話について記事にしていきたいと思います。
それでは早速見て行きましょう！

## デジタル名刺とは
そもそもデジタル名刺とは何でしょうか？
デジタル名刺とは字の如くデジタルの名刺です。(これは説明になっているのだろうか？ww)
従来の名刺とは紙の名刺であることが多いですよね。
仕事で相手の人と名刺交換する際に自分の名刺を相手に渡し、相手の名刺を貰い名刺入れに入れて保管するといったことが多かったと思います。
現に私も元々は営業職出身だったので、上記のような名刺交換はよくやってきました。
ところが最近はこの名刺も紙媒体のものではなくデジタル上でやり取りする名刺が増えてきたのです。
私も最近知ったので初めて見た時は驚きました。

## デジタル名刺を作るに至った経緯
デジタル名刺を作るに至った経緯は私が参加しているJAWS-UGでの懇親会でした。
懇親会で色々な人と話し、その流れで名刺交換することが多々あったのですが、このデジタル名刺を持っている方が結構いらっしゃたのです。
デジタル名刺とは言いながらも、媒体そのものはカードのようなものです。イメージとしてはSuicaやPasmoのようなICカードといった方が伝わるかもしれませんね。
それをスマホで読み取ると、その人の情報が読み取れます。簡単な自己紹介やXやFacebook、LinkedinといったSNS情報も見ることができます。
そういった席ですとXなどのSNSを交換することが多いので、自分も持っていた方がいいなと思いデジタル名刺を作るに至りました。

## デジタル名刺の作り方
デジタル名刺を作るには色々な方法があります。
AmazonでNFCカードを購入して作成する方法や業者に受注して作成する方法など幅広いです。
私はせっかくなので、デジタル名刺で有名なプレーリーカードで作成することにしました。
値段も色々ありますが、私はシンプルで名刺っぽいデザインにしたかったので自分で文言や色などを変更しました。

https://prairie.cards/?srsltid=AfmBOoo6AlANe-CptB_QZd4uldp2lTLxRLOBmdq4wHuT40GfacOXJ-pz

注文が完了すると1週間くらいで、カードが届きます。
因みに完成品はこのようなものになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/4ed1fa3f-f697-4555-85dd-db8164847c26.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/98e10b1b-7fd3-4452-9d4b-51bfde38da20.png)

いかがでしょうか？
色も鮮やかでシンプルで良いですよね！
見た目は名刺っぽく表に日本語、裏に英語で自分の名前を入れました。
この名刺が届いたら、自分のスマホをカードにかざします。
このカードもNFC機能が入っているので、かざすことで情報を読み取ります。
ここで、自分の情報を作成して、各種SNSなど載せたいものをリンク付けします。
そして完成したものがこちらになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2478024/d94fd7e8-1bf0-4267-a2ba-dea4ce02578f.png)
私はX、Facebook、Linkedin、Qiitaをデジタル名刺に載せました。
自分でも中々良いものができたなと思います！

## 終わりに
いかがでしたでしょうか？
実はこのデジタル名刺、まだ他の人から読み込んでもらったことがないんです。
というのも作ってからオフラインのイベントに参加していないんです。笑
ですが、来週はオフラインの勉強会とAWS Summitもあるので、沢山の人との繋がりが予想されます！
どれだけの方に読み込んでもらえるのか今から楽しみです！
興味のある方は是非作ってみてください！
Jetson Orin Nano SuperとJetPack 6.2で YOLO11(v8.3.157)を動かす（2025年6月確認版）

* Jetson Orin Nano Super 8GB
* logicool C270N
* SanDisk 64GB microSD Extreme micro SDXC A2
* JetPack 6.2

## パッケージ一覧の更新、ブラウザのインストール等
sudo apt update
sudo apt install -y chromium-browser
sudo apt install python3-pip

## torchのインストール
```
pip3 install --no-deps torch-2.3.0-cp310-cp310-linux_aarch64.whl
pip3 install --no-deps torchaudio-2.3.0+952ea74-cp310-cp310-linux_aarch64.whl
pip3 install --no-deps torchvision-0.18.0a0+6043bc2-cp310-cp310-linux_aarch64.whl
```

参考：https://forums.developer.nvidia.com/t/pytorch-for-jetson/72048

## その他ライブラリのインストール
```
pip3 install psutil==7.0.0
pip3 install typing_extensions==4.14.0
pip3 install tqdm==4.67.1
```

### YOLO11をダウンロードします

* 「pypi.org」から「ultralytics-8.3.157-py3-none-any.whl」をHome直下にダウンロードします。

https://pypi.org/project/ultralytics/#files

### YOLO11をインストールします。
```
pip3 install --no-deps ultralytics-8.3.157-py3-none-any.whl
reboot
```

## YOLO11の動作確認
```
yolo predict model=yolo11n.pt source="https://ultralytics.com/images/zidane.jpg"
```
:::note info
検出結果は「Home/runs/detect/predict」内に保存されます（zidane.jpg）。
:::

```
yolo task=detect mode=predict model=yolo11n.pt source=0 show=True imgsz=256
```

:::note info
Jetson Orin Nano Super：1 frame：24.5ms
:::
Path通しましょうや...[user変数]

## はじめに
恐らく読者さんは設定アプリからuser variablesの登録をしたのにterminal (=powershell)に反映されてないのを不思議に思い(=憤りを感じ)ここに来られたのでしょう。
あなたは救われました。

## 原因
なぞです。Microsoft社を責めましょう。

## 解決策
powershellにてコードを直接実行することで僕は何とかなりました。

~~~powershell:指定path(exeではなくディレクトリを入力 
$target = "C:\Users\???"
~~~

~~~poewrshell:以下コピペ
$currentPath = [Environment]::GetEnvironmentVariable("Path", "User")

if ([string]::IsNullOrEmpty($currentPath)) {
    # ユーザー Path が存在しない場合は新規作成
    [Environment]::SetEnvironmentVariable("Path", $target, "User")
    Write-Output "ユーザー Path が存在しなかったため、新規に追加しました: $target"
} elseif (-not $currentPath.Split(";") -contains $target) {
    $newPath = "$currentPath;$target"
    [Environment]::SetEnvironmentVariable("Path", $newPath, "User")
    Write-Output "Path に追加しました: $target"
} else {
    Write-Output "すでに Path に含まれています。"
}
~~~

## 動作確認方法
まずterminalを開けなおします。
~~~powershell:次にこれを実行します。登録したpathが見つかれば、成功です。
[Environment]::GetEnvironmentVariable("Path", "User") -split ";"
~~~

## まとめ
以上Homebrewに頼ってきたmacユーザーでした。
この世はくそです。こんなくだらないことに数時間も格闘してたのがばからしい。
Next.js と Nuxt どっちを選ぶ？モダンフレームワーク徹底比較

## 🎯 この記事の目的

Reactベースの **Next.js** と、Vueベースの **Nuxt**。どちらもモダンなSSR/SSGフレームワークとして人気です。この記事では、機能・開発体験・パフォーマンス・学習コスト・用途別の選び方を徹底比較します。

---

## 🛠 比較対象

| 項目           | Next.js                                               | Nuxt                                   |
| ------------ | ----------------------------------------------------- | -------------------------------------- |
| ベース技術        | React                                                 | Vue                                    |
| デフォルトのルーティング | ファイルベース(App Router / Pages Router)                    | ファイルベース                                |
| データフェッチ      | `getServerSideProps`, `getStaticProps`, API Routes など | `asyncData`, `fetch`, サーバーミドルウェア       |
| 型サポート        | TypeScript 強力対応                                       | TypeScript 標準サポート（Nextより設定が楽）          |
| デプロイ先        | Vercel、任意                                             | 任意（Vercel、Netlify、Cloudflare Pages など） |
| ドキュメント       | 豊富で最新                                                 | 豊富で分かりやすい                              |

---

## ⚡ パフォーマンス比較

どちらも静的生成(SSG)・サーバーサイドレンダリング(SSR)に優れています。

* **Next.js**: ISR（Incremental Static Regeneration）で大規模サイト向けに最適化。
* **Nuxt**: Nitroサーバーで軽量なSSR、Viteビルドも標準化。

両者とも高速ですが、大規模向けなら Next.js のISR の柔軟さが光ります。

---

## 👨‍💻 開発体験

| 項目      | Next.js      | Nuxt                         |
| ------- | ------------ | ---------------------------- |
| 学習コスト   | React の知識必須  | Vue の知識必須（Vue は初心者に人気）       |
| デフォルト機能 | 必要に応じて選ぶスタイル | 標準で多機能（PWA、i18nなど公式モジュールが豊富） |
| 開発スピード  | 柔軟で自由度高い     | 設定済みが多く速く組める                 |

---

## 🎨 デザイン・エコシステム

* **Next.js**: TailwindCSS / ChakraUI / shadcn などのReact系UIライブラリが豊富。
* **Nuxt**: Vuetify / Quasar / Naive UI などVue系ライブラリが親和性高。

どちらもデザインに困ることはないですが、既存デザイン資産があるならそれに合わせるのが吉。

---

## 📝 用途別おすすめ

| 用途         | Next.js                        | Nuxt                 |
| ---------- | ------------------------------ | -------------------- |
| 大規模サービス    | ◎ ISR, API Routes, Vercelとの親和性 | ◯ Nitro SSR で高速化可能   |
| 小規模〜中規模サイト | ◯ 必要な機能を組み合わせて作れる              | ◎ モジュールが揃っていて素早く構築可能 |
| PWA / 多言語  | ◯ i18n ライブラリを追加                | ◎ Nuxt公式モジュールで簡単構築   |
| 学習用        | ◯ Reactを学ぶなら最適                 | ◎ Vue初心者に向く          |

---

## 🌟 結論

どちらも優れたフレームワークですが、選定の基準は次です：

👉 **Reactが得意 or 大規模ISR対応が必要 → Next.js**
👉 **Vueが好き or 標準機能でサクッと作りたい → Nuxt**

あなたのプロジェクトに合ったモダンフレームワーク選びの参考になれば幸いです！

---

## 🔗 公式リンク

* [Next.js 公式](https://nextjs.org/)
* [Nuxt 公式](https://nuxt.com/)
テスト時に「このモジュールはクライアントコンポーネントモジュールからインポートすることはできません。」というエラーが発生する

## 環境

- Next.js: "^15.3.2"
- React: "19.1.0"
- Bun: v1.2.16

### エラーメッセージ

```text
This module cannot be imported from a Client Component module. It should only be used from a Server Component.
```

## 対処法

テスト時に、`import "server-only"`をモックに置き換える

```ts
// happydom.ts
import { mock } from "bun:test";
mock.module("server-only", () => ({}));
```

## 原因

Next.jsで動的データフェッチを行う際、Server Actionsを使用してデータを取得していた。

その際、Server Actions内でサーバー専用の関数を呼び出しており、テストランナーがクライアントからサーバー関数を呼び出していると誤って判断してしまった。（実際はServer Actionsから呼び出されているため、サーバーで実行されている）
Windows11 ProのHyper-V上にUbuntu24.04LTSを入れる

# 背景・目的

Claude Codeを使ってみたいが普段使いしているWSL2では使いたくない。

# Install手順

## Hyper-Vの有効化

`Windwsの機能の有効化または無効化`から`Hyper-V`をクリックしてOKを押し数分待つ

https://qiita.com/masatonasou/items/035fd8b51a6fbc36b9f2

## Hyper-VマネージャーによるVMの追加

- 左のペインにある自機を右クリックし、`新規`→`仮想マシン`をクリック
- `開始する前に`画面は`次へ`をクリック
- `名前と場所の指定`画面の`名前`に適当な名前（今回は`Ubunt24.04`とする）を入力し`次へ`をクリック
- `世代の指定`画面は`次へ`をクリック
- `メモリの割り当て`画面は`起動メモリ`に適当な値（今回は`32768` MB）を入力し、`次へ`をクリック
- `ネットワーク構成`画面は`接続`に`Default Switch`を指定し`次へ`をクリック
- `仮想ハードディスクの接続`画面は`名前`に適当な値（今回は`Ubunt24.04`）を入力し、`次へ`をクリック
- `インストールオプション`ブートCD/DVD-ROMからオペレーティングシステムをインストールする`の`イメージファイル(.iso)`にダウンロードしてきたISOイメージ（今回は`ubuntu-24.04.2-desktop-amd64.iso`）を選択し、`次へ`をクリック
- `完了`をクリック

https://zenn.dev/junkor/articles/cb486c14a2db18

## セキュアブートの有効化

上記手順にてVMが立ち上がったら、一度シャットダウンする。

- 中央のペインにある`Ubunt24.04`を右クリックし、`設定`をクリック
- `ハードウェア`内の`セキュリティ`を選択
- `セキュアブート`内の`テンプレート`から、`Microsoft UEFI 証明機関`を選択し、`OK`をクリック
- ついでに、`ハードウェア`内の`プロセッサ`を選択し、`仮想プロセッサの数`を適当な値（今回は`12`）に変更
- VMを起動し、Ubuntuをインストールする

https://qiita.com/___monta___/items/7c180e56282e3f1c87d0

## デフォルトのフォルダを英語に変更する

```bash
LANG=C xdg-user-dirs-update --force
cd
rm -rf ダウンロード テンプレート デスクトップ ドキュメント ビデオ ピクチャ ミュージック 公開
```

https://qiita.com/peachft/items/fde3bebd356c17c1cef6

## 解像度の調整

### Ubuntu(ゲスト)側の設定

```bash
sudo vi /etc/default/grub # 下表の値を書き換える
sduo update-grub
sudo /sbin/shutdown -h now
```

| 項目 | 値                                                                  |
| ---- | ------------------------------------------------------------------- |
| 旧   | GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”                           |
| 新   | GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash video=hyperv_fb:3840x1600” |

1980x1080以上にする場合は次のWindows側の設定も必要

https://qiita.com/Ebokeb/items/5005f7b344acc3e198fa

### Windows(ホスト)側の設定

パワーシェルを管理者権限で立ち上げる

```powershell
Set-VMVideo -VMName Ubuntu24.04 -HorizontalResolution 3840 -VerticalResolution 1600 -ResolutionType Single
```

https://learn.microsoft.com/en-us/answers/questions/703701/cannot-get-beyond-1920x1080-resolution-using-hyper


# ハードウェアのスペックなど

| 項目         | 内容            |
| ------------ | --------------- |
| CPU          | AMD Ryzen 9950X |
| Core数       | 16              |
| メモリ       | 96 GB           |
| SSD          | 1 TB            |
| ディスプレイ | Eizo EV3895     |
| 解像度       | 3840 x 1600     |
同期と非同期の違いって？（同期処理 vs 非同期処理）

#### 🔹 同期（Synchronous）とは？

* 一つの処理が完了するまで、次に進まない方式
* 順番どおりにコードが実行される
* 💡 例：レストランで1人ずつ料理が提供される

##### ✅ メリット

* コードが直線的でわかりやすい

##### ⚠️ デメリット

* 時間がかかる処理があると、全体が止まる可能性がある

---

#### 🔸 非同期（Asynchronous）とは？

* 処理を待たずに次の作業を開始できる方式
* 複数のタスクを同時に実行できる
* 💡 例：複数のシェフが同時に別の料理を作る

##### ✅ メリット

* UIのレスポンスが速く、ユーザー体験が向上

##### ⚠️ デメリット

* コードの構造が複雑になりがち

---

### 🛠 defer・async とは？

#### `async`

* スクリプトを**非同期で読み込む**
* HTMLのパースと同時に読み込み → 読み込み完了後すぐ実行
* 実行順序は保証されない

#### `defer`

* スクリプトを**非同期で読み込む**が、**HTMLのパース後に実行**
* 実行順序が保証される（記述順）

```slim
= javascript_include_tag "application", defer: true
```

---
〜XAMPPで私が初めてデータベースに触れた日〜



## 🎯 はじめに

この記事は、私が **Windows 環境で XAMPP を使って初めて MySQL と向き合ったときの体験談** をベースに書いています。
「ローカルでDBを動かしたいけど、XAMPPって何？MySQLって難しそう…」そんな風に感じていた過去の自分のような初心者さんに届けば嬉しいです！

---

## ✅ ゴール

* XAMPP のインストールと初期設定
* MySQL サーバーの起動・停止方法
* phpMyAdmin でデータベースとユーザーを作成
* 実際につまずいたポイントとその乗り越え方

---

## 🖥 環境

* OS: Windows 10 / 11
* XAMPP: 最新安定版（例：XAMPP 8.2.x）
* MySQL: XAMPP付属のバージョン
* ブラウザ: Chrome / Edge

---

## 🚀 私の XAMPP 初体験：インストール編

### ダウンロード

最初に [XAMPP公式サイト](https://www.apachefriends.org/index.html) からファイルをダウンロードしたとき、「いよいよだ！」とドキドキしました。

![Screenshot 2025-06-21 170319.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3926613/319fee26-88ec-4bb3-847b-8d6441651a92.png)

### インストールで迷ったこと

* 全モジュールにチェックが入ってて「これ全部必要？」と一瞬戸惑いました（そのままでOKでした）
* フォルダはデフォルトの `C:\xampp` にしました（後でパスで迷わないためにもおすすめです）

### 初起動のときの気持ち

XAMPP コントロールパネルを開いて Apache と MySQL を起動…
ちゃんと緑色の「Running」が表示された瞬間、めちゃくちゃ安心したのを覚えています。

⚠ **ポート競合で詰んだ体験談**
初回、Apache がポート80でエラーを出して起動せず…。IISが裏で動いていたのが原因でした。

---

## 🌱 MySQL + phpMyAdmin を使ってみた！

### MySQL 起動とphpMyAdmin

ブラウザで `http://localhost/phpmyadmin` にアクセスできたとき、「データベース画面ってこんな感じなんだ！」と感動。

### データベース作成に挑戦

データベースを作るとき、名前を決めるのに地味に時間がかかりました（笑）
最初はこんな感じで作りました：

```
sample_db (照合順序: utf8mb4_general_ci)
```

### ユーザー作成で気をつけたこと

* ユーザー名は `sample_user`
* ホストは `localhost`
* 強いパスワードを設定
* 権限は必要なものだけ付与（最初はよくわからず全権限付けちゃいました）

---

## 🛠 ハマりどころとそのときの私の対処法

| 問題                | 私がやったこと                              |
| ----------------- | ------------------------------------ |
| MySQL が起動しない      | 他のアプリが3306ポート使用 → MySQL のポートを3307に変更 |
| phpMyAdmin ログイン失敗 | rootのパスワード初期化を確認、config.inc.php を修正  |
| Apache が起動しない     | IIS のサービスを止めて解決                      |

---

## 💡 ポート変更したときのメモ

XAMPP → MySQL の「Config」→ `my.ini` を開いて

```
port=3307
```

に変更。XAMPP の設定も合わせました。

---

## 🌟 おわりに

私にとって、XAMPP と MySQL の初体験は「思ったよりできるかも！」という小さな自信につながりました。
同じように挑戦する方の参考になれば嬉しいです。コメントや質問、お待ちしています！

---

## 🔗 関連リンク

* [XAMPP 公式サイト](https://www.apachefriends.org/index.html)
* [MySQL 公式ドキュメント](https://dev.mysql.com/doc/)
* [phpMyAdmin 公式](https://www.phpmyadmin.net/)
なぜパーシャル（部分テンプレート）に切り出すの？

パーシャルとは、共通パーツを切り出したテンプレート部分のこと。
Railsでは`render "devise/shared/links"`のように呼び出します。

#### ✅ パーシャルのメリット

| 理由       | 内容                                      |
| -------- | --------------------------------------- |
| 📦 DRY原則 | 同じリンクやパーツを再利用できる（Don’t Repeat Yourself） |
| 🔧 保守性UP | 1箇所修正するだけで、すべての画面に反映✨                   |
| 🎨 UI統一  | Bootstrap等のスタイルも一括調整しやすい                |
| 🚀 読みやすさ | mainファイルがスッキリ！ロジックとUIの分離にもつながる          |

#### 📝 使用方法例

```slim
= render "devise/shared/links"
```

#### 📁 ファイルの作成例

```bash
touch app/views/devise/shared/_links.html.slim
```

#### 📄 中身の例（I18n対応済み）

```slim
= link_to t("devise.shared.links.sign_in"), new_session_path(resource_name)
= " / "
= link_to t("devise.shared.links.sign_up"), new_registration_path(resource_name)
```

---
Railsで使える日本語翻訳ファイル `ja.yml` の例

Railsアプリで Devise やビューに日本語を表示させるには、
`config/locales/ja.yml` を作成し、以下のように記述します：

```yaml
ja:
  hello: "こんにちは"

  devise:
    shared:
      links:
        sign_in: "ログイン"
        sign_up: "サインアップ"
        forgot_password: "パスワードを忘れた方はこちら"

    sessions:
      new:
        sign_in: "ログイン"

    registrations:
      new:
        sign_up: "新規登録"
```

これを用意しておくと、ビュー側では次のように使えます：

```slim
= link_to t("devise.shared.links.sign_in"), new_session_path(resource_name)
```

これで、日本語対応もばっちり！🌸

---
Railsでの `javascript_include_tag` における `defer: true` と `async` の違いまとめ＆Turbo対応Tips

## ✅ 結論

| 属性      | 説明                               | 実行タイミング     | スクリプト順序 | HTMLパースブロック |
| ------- | -------------------------------- | ----------- | ------- | ----------- |
| なし      | 読み込み完了後すぐ実行                      | 即実行         | 保証あり    | ❌ ブロックする    |
| `async` | 読み込みが終わったものから順次即実行（順序保証なし）       | 読み込み完了時点で実行 | ❌ バラバラ  | ❌ ブロックしない   |
| `defer` | HTMLのパースが完了した後に全スクリプトを**順番通り**実行 | HTMLパース後    | ✅ 保証あり  | ✅ 非ブロック     |

---

## 💡 Railsにおける `javascript_include_tag` の使い方

RailsでJavaScriptを読み込むときに使うのが `javascript_include_tag`。

```erb
<%= javascript_include_tag "application" %>
```

ですが、これだけだと**すぐ実行されてHTML描画がブロックされる**ので、モダンな構成では `defer: true` を付けるのが定番です。

```erb
<%= javascript_include_tag "application", defer: true %>
```

また、TurboやStimulusを使う環境でも `defer` は相性バツグン！

---

## 🚀 Turboとの関係（Turbo Streams / Frames）

`turbo-rails` ではJavaScript実行タイミングが重要です。

* `defer: true` にすると Turbo が DOM 構築後に正常に初期化される
* `async` にしてしまうと、**DOM構築前にJSが実行されてTurboの初期化が失敗**するリスクがある

### ✅ Turbo使用時は `defer: true` 一択！

```erb
<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
```

---

## ✍️ Slimで書くなら？（application.html.slim）

```slim
doctype html
html lang="ja"
  head
    meta charset="UTF-8"
    title TwitterClone
    meta name="viewport" content="width=device-width,initial-scale=1"
    = csrf_meta_tags
    = csp_meta_tag
    = stylesheet_link_tag "application", "data-turbo-track": "reload"
    = javascript_include_tag "application", "data-turbo-track": "reload", defer: true

  body
    - flash.each do |key, message|
      .alert.alert-#{key}= message

    = yield
```

---

## ⚠️ よくある間違い

### 🔸 `async` を使ってTurboが動かない

→ 原因：**DOM構築前にJSが動いてしまう**

### 🔸 `defer` を `true` にしてないことでDOMブロック

→ 結果：ページ描画が重くなる、FCP（First Contentful Paint）が遅れる

---

## ✅ まとめ：`defer: true` のメリット

* ✅ ページのHTMLパースが先に進む（表示が速くなる）
* ✅ 複数JSファイルでも**順番が保証される**
* ✅ Turbo/Stimulusとの相性が良い
* ✅ Rails標準構成と整合性が取れる

---

## 🎁 おすすめ構成（Slim + Turbo環境）

```slim
= javascript_include_tag "application", "data-turbo-track": "reload", defer: true
```

この1行だけでパフォーマンス＆互換性が大幅アップ！

---

どなたかのお役に立てば幸いです☺️
POSIXと改行の関係：なぜファイル末尾の空行が重要なのか？

## ✅ はじめに

RailsやRubyで開発をしていると、RuboCopなどの静的解析ツールから `Final newline missing` といった警告を受けることがあります。

その背景には、**UNIXやPOSIX**で定められている「テキストファイルは末尾に改行を含むべき」というルールがあるんです。

---

## 🔍 POSIXの定義

POSIX（Portable Operating System Interface）では、**テキストファイルは0個以上の行で構成され、それぞれの行は改行文字で終わるべき**と定義されています。

つまり：

> ✅ ファイルの**最後の行にも改行文字（LF）を含めなければならない**。

これが「末尾に空行を入れるべき」とされる由来です。

---

## 🤔 なぜそんなルールがあるの？

### 1. UNIXコマンドとの互換性

* `cat`, `diff`, `tail`, `grep` など多くのUNIXコマンドは

  * 「改行で終わらない行」は**最終行と見なさないことがある**

### 2. `diff` が行末改行の差を「差分」として扱う

```diff
-puts 'Hello world!'
+puts 'Hello world!'
\ No newline at end of file
```

### 3. CIやコードレビューでの混乱を防ぐ

* チーム内でのコードレビューやPull Request時に、**「意図しない差分」が発生するリスク**が減る

### 4. RuboCopやEditorConfigの整合性

* `.editorconfig` では `insert_final_newline = true` がよく使われており、
* `RuboCop` でも `Layout/TrailingEmptyLines` でチェックされる

---

## 🧠 どんな環境でも守るべき？

はい、**すべての開発環境で一貫して守るべき基本ルール**です。

特に以下のケースでは遵守推奨：

* 複数人でのチーム開発
* Git/GitHubによるPR管理
* RuboCopなどのCI導入済みプロジェクト
* OSSなど標準準拠が求められる場面

---

## 🔧 対応方法

### ✅ VSCode（settings.json）

```json
"files.insertFinalNewline": true
```

### ✅ EditorConfig

```
insert_final_newline = true
```

### ✅ RuboCop（.rubocop.yml）

```yaml
Layout/TrailingEmptyLines:
  EnforcedStyle: final_newline
```

---

## ✅ まとめ

| 理由       | 説明                         |
| -------- | -------------------------- |
| POSIX準拠  | テキストファイルは末尾に改行が必要          |
| Git差分の防止 | 意図しない変更を減らすため              |
| ツール互換性   | UNIXコマンドやRubocopでの整合性保ちやすい |

最後の1行、されど1行。
それが **世界中のエンジニアが安心して協力するための合図** なんです💡

どなたかのお役に立てば幸いです☺️
RASPBOT-V2キットで始めるラズベリーパイロボット開発 - SSH/VNC環境構築編

# YahboomのRASPBOT-V2でラズベリーパイロボットをセットアップする

本記事では、YahboomのRASPBOT-V2キットを使用してラズベリーパイロボットのセットアップ手順を解説します。公式サイトの「11. 開発環境コース」を参考に進めていきます。

> 参考サイト：http://www.yahboom.net/study/RASPBOT-V2  
> ※画像は全て公式サイトから引用しています

## 事前準備と省略する項目

以下の項目については、今回のセットアップでは省略します：

**1. RaspberryPi5の紹介**  
基本的な説明のため省略します。

**2. イメージの書き込みとバックアップ**  
Yahboomのキットには、あらかじめイメージが書き込まれたSDカードが同梱されているため、この手順は不要です。

独自にイメージファイルが必要な場合は、[Raspberry Pi公式サイト](https://www.raspberrypi.com/software/)からダウンロードしてください。

## ラズベリーパイの起動

まず、ラズベリーパイ本体に以下の周辺機器を接続します：

- キーボード
- マウス
- 電源アダプタ
- HDMIケーブル（ディスプレイ接続用）

すべての接続が完了したら、電源をオンにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/4f3cca0e-f804-4142-b843-cdc8fb1438d1.png)

起動が完了すると、デスクトップ画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/5cf5ff3b-f7c5-4ac2-824d-17def45b4c48.png)

## リモートアクセスの設定

次に、リモートアクセスを可能にするための設定を行います。

### SSHとVNCの有効化

リモートアクセスには、SSHとVNCの2つの方式を使用します。

**各技術の概要**
- **SSH（Secure Shell）**：ネットワーク経由で他のコンピュータに安全にログインし、コマンドラインから操作を行う技術
- **VNC（Virtual Network Computing）**：リモートコンピュータのデスクトップ画面を手元のPCに表示し、GUI操作を可能にする技術

以下の手順で設定を進めます：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/959cf992-3936-4072-813d-d08d0e4c2d80.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/52aa590d-f1c3-4e8b-b531-db7a9174c7da.png)

## SSH接続の実行

設定完了後、SSH接続を確認します。

### 手順

1. PCから「Rasbot」というWi-Fiネットワークに接続します  
   （Yahboomキットのデフォルトパスワード：`12345678`）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/db824591-0be4-4179-a7c4-2300330b9273.png)

2. ターミナルから以下のコマンドでSSH接続を実行します：

```bash
ssh pi@192.168.1.11
```

パスワードの入力を求められたら、`yahboom`（Yahboomキットのデフォルト設定）を入力します。

## VNCリモートデスクトップの設定

最後に、VNCを使用してグラフィカルなリモート接続を設定します。

### 必要なソフトウェア

PCに[RealVNC Viewer](https://www.realvnc.com/en/connect/download/viewer/)をインストールします。

### 接続手順

1. ラズベリーパイのWi-Fiに接続した状態で、RealVNC Viewerを起動
2. 接続先のIPアドレス（`192.168.1.11`）を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/9e16aa9c-338f-42ea-8612-05fe638b95d4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/e2b9abca-a4ff-4134-b5b3-d25d2cb05585.png)

接続に成功すると、ラズベリーパイのデスクトップが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654759/b1002de7-74aa-48ea-b42b-a6734bdb1728.png)

## まとめ

以上で、YahboomのRASPBOT-V2キットの基本的なセットアップが完了しました。SSHによるコマンドライン操作とVNCによるGUI操作の両方が可能になり、ロボット開発の環境が整いました。

この環境を基盤として、今後はロボットの制御プログラムの開発を進めることができます。
VSCodeやRails開発で行末に空行を入れるべき理由まとめ

## ✅ 行末に空行は必要？

### ▶ 結論：**基本的には“あったほうがよい”です！**

特にチーム開発・Railsアプリ・CI導入プロジェクトでは必須級です💡

---

## 🔍 理由一覧

### 1. ✅ Gitやdiffでの見やすさUP

ファイルの末尾に空行がないと、diffが以下のように不自然に表示されることがあります。

```diff
-class ApplicationController < ActionController::Base
+class ApplicationController < ActionController::Base⏎
```

末尾の改行がないだけで、"変更あり"と認識されてしまうことも…！

---

### 2. ✅ POSIX規約の観点

POSIXでは「**テキストファイルの最終行は改行で終えるべし**」という暗黙ルールが存在します。

多くのUNIX系ツール（cat, diff, grepなど）もこれを前提に動作しているため、改行がないと警告や誤動作の原因になることも。

---

### 3. ✅ RuboCopで警告が出る

Railsプロジェクトでおなじみの **RuboCop** は、次のような警告を出すことがあります：

```sh
Layout/TrailingEmptyLines: Final newline missing.
```

🔧 対応：ファイル末尾に1行だけ改行を入れる（空白スペースやタブは不要）

---

### 4. ✅ Slim/ERB/HTMLでも改行は意味がある

特にテンプレート系では**見通しのよさ**や**部分テンプレート挿入後のトラブル回避**にもつながります。

---

## 🎯 実践ルールまとめ

| ファイル種別           | 改行必要？ | 補足                    |
| ---------------- | ----- | --------------------- |
| `.rb`            | ✅ 必要  | RuboCop対応用にも入れる       |
| `.slim` / `.erb` | ✅ 推奨  | UI崩れ・インデントミス予防にも便利    |
| `.js`, `.css`    | ✅ 推奨  | LinterやCIでも指摘されるケースあり |

---

## 💡 自動化するには？

### ✅ VSCodeの場合

`.editorconfig` を使って以下を追加：

```
# 末尾に改行を入れる
insert_final_newline = true
```

または VSCode の設定に：

```json
"files.insertFinalNewline": true,
"emmet.includeLanguages": {
  "slim": "html"
}
```

---

## まとめ

* ファイル末尾の1行改行は **世界標準の安心マナー**
* GitもCIもRubocopもにっこり😊
* VSCodeやEditorConfigで自動化してミスゼロにしよう！

どなたかのお役に立てば幸いです☺️
🔍 Zeitwerkとは？Railsのオートローダーを「分かりやすく」解説

## 🌟 ZeitwerkはRailsの振る舞いを支えるローダー

**Zeitwerk (ツァイトヴェルク)** は Rails 6 以降のデフォルトローダで、
**名前空間とファイル構成をベースにclass/moduleをオートロードする機構** です🚀

これがあるからRailsは

* `require` しなくても class/module を自動読み込む
* MVCの分離がきれい
* ファイル名やパスの要求が明確

などの魅力を持っています。

---

## 🔎 Zeitwerkがどんなことをしているの？

一言で言うと、**Zeitwerkはファイル名からクラス名を判断してrequireしてくれるローダー**です。

```rb
# app/models/user.rb
class User < ApplicationRecord
end
```

なら `User` を見たとき Rails は:

```rb
require "/path/to/app/models/user.rb"
```

を自動で行ってくれます📊

---

## 🏢 Zeitwerkに合わせたファイル名 / 配置ルール

Zeitwerk は「ファイル名ベースでclass/moduleを読む」という他のRubyフレームにはないルールを持ちます。

### 例：Userクラス

| クラス名                      | ファイルパス                                      |
| ------------------------- | ------------------------------------------- |
| `User`                    | `app/models/user.rb`                        |
| `Admin::User`             | `app/models/admin/user.rb`                  |
| `Api::V1::BaseController` | `app/controllers/api/v1/base_controller.rb` |

**名前空間はパスで表現する必要があります！**

---

## 🚨 関連トラブル：Zeitwerkの誤判「使われてる名前だよ！」

Rails の generator (例: `rails g controller home index`) で

```bash
The name 'HomeController' is either already used in your application or reserved by Ruby on Rails.
```

などと言われたら、それは Zeitwerk がクラス名の重複を**誤判**している可能性が高いです。

例：

* 過去に同名のクラスを作って削除した
* `root "home#index"` などが\uroutes.rb に書かれている
* `app/controllers/home/` みたいな名前空間がある

このような場合に、Zeitwerkは誤判して警告を出します。

---

## 🚀 Zeitwerkを上手に使うTips

* 名前は **CamelCase にする**
* ファイル名は **snake\_case にする**
* 配置は **class/module の名前に合わせる**
* 名前空間を使うときは **パス構成に注意**

---

## 🤖 まとめ

| テーマ                       | 解説           |
| ------------------------- | ------------ |
| Zeitwerk は名前空間ベースのオートローダー | Rails6以降の機構  |
| require が不要               | 自動読み込みスマート   |
| 名前による誤判もある                | routesや分割に注意 |

Railsのコードベースは思ってるより「名前」に依存しています。
Zeitwerkを理解すればRailsが「なぜここにこのファイルを組み込んでるのか」が理解できます💡

少しでもどなたかのお役に立てば幸いです☺️
mkdir -p オプション完全ガイド：Railsプロジェクトで役立つディレクトリ作成術 💡

Rails開発で「ファイルを作ろうとしたけどディレクトリが無くてエラーになった！」なんて経験、ありませんか？

例えば：

touch app/views/devise/shared/_links.html.slim

このようにファイルを作ろうとして、次のようなエラーに遭遇することがあります：

touch: app/views/devise/shared/_links.html.slim: No such file or directory


⸻

✅ 解決策：mkdir -p を使おう！

ディレクトリが存在しない場合は、次のように mkdir -p を使うことで一発解決できます：

mkdir -p app/views/devise/shared

その後でファイルを作成：

touch app/views/devise/shared/_links.html.slim


⸻

💡 -p オプションとは？

mkdir コマンドの -p オプションは：

機能	説明
中間ディレクトリ作成	指定されたパスの途中のディレクトリが無くても、自動で作成してくれる
再実行しても安全	すでに存在するディレクトリに対してもエラーを出さずにスルーしてくれる

例：

mkdir -p foo/bar/baz

このコマンドは foo, foo/bar, foo/bar/baz がなければすべて一気に作成してくれます。

⸻

🔧 よくある組み合わせ

コマンド	用途
mkdir -p	必要なディレクトリ構造をまとめて作成
touch	空ファイルを作成
rails g	Railsのジェネレータを使うと自動で作ってくれることも多い


⸻

🚀 まとめ
	•	mkdir -p は 中間ディレクトリの自動作成 に超便利！
	•	Rails開発でも touch やテンプレート作成時に活躍します。
	•	失敗の防止や効率アップのために、覚えておいて損なし✨

ぜひあなたの開発環境に取り入れて、スムーズなRailsライフを送りましょう！

少しでもどなたかのお役に立てば幸いです☺️
【Python】ロギングを構成する部品

ロギングを構成する部品の説明は以下となります。


【ロガー】 ログ出力のインターフェースを提供する
【ハンドラー】 ログの送信先を決定する
【フィルター】 ログのフィルタリング機能を提供する
【フォーマッター】 ログの出力フォーマットを決定する