OmniAICreator/Qiita-1.07M huggingface dataset:
laravelのコマンドまとめ

主にphp artisan _______
の_______の部分にコマンドを書いていき、laravelに指示を出します。

php artisanの部分はほぼ固定です。


### php 
PHPのインタープリターを呼び出すためのコマンドです。

### artisan 
Laravelのコマンドラインインターフェース（CLI）ツールです。artisan コマンドを使うことで、Laravelに組み込まれた多くの便利な機能を利用できます。

以下は主に_______の部分に使うコマンドになります。


## データベース操作

### migrate

```
php artisan migrate
```

 - 機能: migrationsディレクトリ内のマイグレーションファイルを実行し、データベースのスキーマを更新します。
 - 用途: テーブルの作成、カラムの追加・削除・変更、インデックスの作成など、データベース構造の変更を行います。

### seed
```
php artisan seed
```
 - 機能: データベースに初期データを挿入します。
 - 用途: 開発環境やテスト環境にサンプルデータを入力する場合に便利です。

### db:seed
```
php artisan db:seed
```
 - 機能: seedコマンドのエイリアスです。

## プロジェクトの初期化とセットアップ

### laravel new　プロジェクト名
```
php artisan laravel new [プロジェクト名]
```
- 機能: 新しいLaravelプロジェクトを作成します。
- 用途: プロジェクトの初期化時に使用します。

### composer require [パッケージ名]
```
php artisan composer require [パッケージ名]
```
 - 機能: Laravelプロジェクトにパッケージを追加します。
 - 用途: 新しい機能を追加したい場合や、既存の機能を拡張したい場合に利用します。


## モデル、コントローラ、ビューなどの生成

### make:model　[モデル名]

```
php artisan make:model [モデル名]
```
- 機能: Eloquentモデルを作成します。
- 用途: データベースのテーブルに対応するモデルを作成します。

### make:controller [コントローラー名]
```
php artisan make:controller [コントローラー名]
```
- 機能: コントローラを作成します。
- 用途: HTTPリクエストを処理するロジックを記述します。

### make:migration [マイグレーションファイル名]
```
php artisan make:migration [マイグレーションファイル名]
```
- 機能: マイグレーションファイルを作成します。
- 用途: データベースのスキーマを変更するためのファイルを作成します。


## ルーティング: 
### route:list
```
php artisan route:list
```
- 機能: 登録されている全てのルートの一覧を表示します。
- 用途: ルーティングの設定を確認する場合に利用します。

## キャッシュクリア: 
### cache:clear
```
php artisan cache:clear
```
- 機能: アプリケーションのキャッシュをクリアします。
- 用途: 設定変更後や、キャッシュが原因でエラーが発生した場合に実行します。

## サーバー起動
### serve
```
php artisan serve
```
- 機能: ローカル環境で開発用のサーバーを起動します。
- 用途: ローカルで開発しているアプリケーションにアクセスする場合に利用します。

## テスト実行
### test
```
php artisan test
```
- 機能: テストケースを実行します。
- 用途: アプリケーションの機能が正しく動作しているかを確認します。

## その他
### hlep
```
php artisan list
```
- 機能: 特定のコマンドのヘルプを表示します。
- 用途: コマンドの使い方を確認したい場合に利用します。

### list
```
php artisan list
```
- 機能: 利用可能な全てのArtisanコマンドの一覧を表示します。
- 用途: 利用可能なコマンドを確認したい場合に利用します。
【JavaScript】配列の応用まとめ③（条件式に合う最初の要素を返却）

JS基礎学習、今回は`配列`の応用編③！

## ▼配列の応用
### 1. 条件式に合う最初の要素を返却する方法

- ` find ` メソッド

``` js
// 例
const numbers = [1,2,3,4,5,10,20,30]

// 偶数があれば最初の要素を返却
const findEven = numbers.find(num => num % 2 === 0);

// アロー関数を使わない場合
const findEven = numbers.find(function(num) {
  return num % 2 === 0;
});

console.log(findEven); // 2が返却される
 ```

:::note info
findメソッドはオブジェクトも取得可能です。
:::

＜応用例＞
- ユーザー管理システム
    - ユーザーIDや名前、メールアドレスなどで検索する
- 在庫管理システム
    - 商品IDや名前で検索して在庫状況を確認する
- コンテンツ管理システム（CMS）
    - 投稿IDやタイトルで記事を検索する
```js
const users = [
  { id: 1, name: "Alice", email: "alice@examplexxxx.com" },
  { id: 2, name: "Bob", email: "bob@examplexxxx.com" },
  { id: 3, name: "Charlie", email: "charlie@examplexxxx.com" },
];

const userByEmail = users.find(user => user.email === "bob@examplexxxx.com");
console.log(userByEmail);

//「user.email === "bob@examplexxxx.com"」の条件と一致しているオブジェクトを持ってきてくれる

// 結果: { id: 2, name: "Bob", email: "bob@examplexxxx.com" }
```

## ▼参考

https://takayamato.com/array_find/
【C++】C++のstd::pairの使い方

# 目的
AtCoderでpairを使うので、使い方を自分用備忘録として残す。  

# 使用ケース
- [pairをそのまま使用](#pairをそのまま使用)
- [vectorと組み合わせて使用](#vectorと組み合わせて使用)

# pairをそのまま使用
基本的な使い方を示す。

```c++
using namespace std;

// 宣言と初期化
pair<string, int> employee("Kimura", 0000);
cout << employee.first << endl; // Kimura
cout << employee.second << endl; // 0000

// 各要素に値をセット
employee.first = "----";
employee.second = 1111;
cout << employee.first << endl; // ----
cout << employee.second << endl; // 1111
```

# vectorと組み合わせて使用
```c++
using namespace std;

// pairの配列を宣言
vector<pair<string, int>> employees;

// 2人の社員を標準入力から追加
for (int i = 0; i < 2; ++i) {
    string name;
    int employeeNumber;
    cin >> name >> employeeNumber;
    employees.puhs_back(make_pair(name, employeeNumber));
}

// {"Yamada", 1234}と{"Tanaka", 5678}を追加したと仮定
cout << employees[0].first << " " << emploeyees[0].second << endl; // Yamada 1234
cout << employees[1].first << " " << emploeyees[1].second << endl; // Tanaka 5678
```
sparkの計算結果に再現性が無く嵌った話(dropDuplicates)

# 結論
[dropDuplicates](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrame.dropDuplicates.html)を使うと結果に対して再現性がなくなるので注意が必要。
# 詳細
Dropduplicatesは重複を無くす列をした際に、どの行を残すかはランダムになります。
また、pandasのdrop_duplicatesと異なり、「先頭を残す」等のオプションはありません。
（理由の記述はなかったのですが、各nodeに散った各情報を集計するのは spark上は大変なのでしょうか？）
# サンプルコード
```python
from pyspark.sql import functions as F

data = [
    (1, "value_1a"),
    (1, "value_1b"),
    (1, "value_1c"),
    (2, "value_2a"),
    (2, "value_2b"),
    (2, "value_2c"),
    (3, "value_3a"),
    (3, "value_3b"),
    (3, "value_3c")
]

df = spark.createDataFrame(data, ["key", "value"])

print("==== Original DataFrame ====")
display(df)

for i in range(1, 6):
    df_shuffled = df.withColumn("rnd", F.rand())\
                    .orderBy("rnd")\
                    .drop("rnd")
    deduped = df_shuffled.dropDuplicates(["key"])
    
    print(f"\n==== Run {i} ====")
    display(deduped)
```
上記を実行すると以下のようになります。
```

==== Run 1 ====
   key     value
0    1  value_1b
1    2  value_2b
2    3  value_3a

==== Run 2 ====
   key     value
0    1  value_1c
1    2  value_2c
2    3  value_3c

==== Run 3 ====
   key     value
0    1  value_1a
1    2  value_2b
2    3  value_3c

==== Run 4 ====
   key     value
0    1  value_1a
1    2  value_2c
2    3  value_3c

==== Run 5 ====
   key     value
0    1  value_1a
1    2  value_2c
2    3  value_3c
```
# 対策
求めたい結果にもよりますが、sortして先頭行だけを持ってくるなど、丁寧な処理が必要です。
```python
from pyspark.sql.window import Window
from pyspark.sql.functions import row_number

w = Window.partitionBy("key").orderBy("value")
df_deterministic = (
    df
    .withColumn("rn", row_number().over(w))
    .filter("rn = 1")
    .drop("rn")
)
df_deterministic.show()
```
上記のコードはsortした上で row_numberで連番をはり、１行目だけ抜き取るコードです。
# 結論
[dropDuplicates](https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrame.dropDuplicates.html)は再現性がなくなるので巨大なETL処理等行う時は注意しましょう。
【リーダブルコード】初心者エンジニアが読み解く「無関係の下位問題の抽出」について - 第10章

こんばんは。マル太です。

前回は、リーダブルコードの第9章「変数と読みやすさ」についてまとめました。
今回は、第10章「無関係の下位問題を抽出する」について、Qiitaにアウトプットしていきます。


# 無関係の下位問題って、何・・・・？
プログラムを書いていると、1つの関数の中に、たくさんの処理を詰め込んでしまうこと、ありますよね？
でも、複雑な処理が1つにまとまっていると、コードが読みにくくなってしまいます。

そこで役に立つのが、「無関係の下位問題を抽出する」というテクニックです。
これは、メインの処理とは直接関係ない部分を、別の関数として切り出すことによって、コードを整理する方法です。
<br>

例：ユーザー登録
ユーザー登録の処理を例に考えてみましょう。

ユーザー登録では、以下のような処理を行う必要があります。

1.ユーザー名、パスワードなどの入力値をチェックする。
2.ユーザー情報をデータベースに登録する。
3.登録完了メールを送信する。

これらの処理をすべて1つの関数にまとめてしまうと、コードが長くなって読みにくくなってしまいます。

そこで、入力値のチェック、データベースへの登録、メール送信といった「下位問題」を、それぞれ別の関数として切り出すことで、コードを整理することができます。

```ruby:Java

// 入力値をチェックする関数
boolean validateUserData(UserData userData) {
  // ユーザー名、パスワードなどの入力値をチェックする処理
}

// ユーザー情報をデータベースに登録する関数
void registerUser(UserData userData) {
  // データベースにユーザー情報を登録する処理
}

// 登録完了メールを送信する関数
void sendRegistrationEmail(UserData userData) {
  // ユーザーに登録完了メールを送信する処理
}

// ユーザー登録を行う関数
void registerUser(UserData userData) {
  if (validateUserData(userData)) { // 入力値をチェック
    registerUser(userData);  // データベースに登録
    sendRegistrationEmail(userData);  // メール送信
  }
}
```

このように、無関係の下位問題を抽出することで、各関数の役割が明確になり、コード全体が読みやすくなります。
<br>

**無関係の下位問題を抽出するメリット**
・コードの可読性が向上する
・関数の再利用性が高まる
・テストがしやすくなる
・バグを減らしやすくなる


# まとめ
無関係の下位問題を抽出することで、コードを整理し、読みやすくすることができます。
複雑な処理を分割することで、コードの可読性、再利用性、テスト容易性、保守性が向上します。

ぜひ、このテクニックを実務にも活用していきたいですね！

次回は、第11章「一度にひとつのことを」についてまとめます。
インド言語対応AIの可能性を探る：LLMsの性能評価と未来への提言

# Analysis of Indic Language Capabilities in LLMs

今回は、最新の研究成果である「Analysis of Indic Language Capabilities in LLMs」という論文をご紹介します。本研究は、インドの多様な言語環境における大規模言語モデル（LLMs）の性能を評価し、低リソース言語の課題を明らかにすることで、AI開発の将来に重要な指針を提供しています。本記事では、研究の背景、目的、方法論、結果、そしてその社会的意義を詳細に解説します。

---

## 論文情報

- **タイトル**: Analysis of Indic Language Capabilities in LLMs  
- **リンク**: [arXiv:2501.13912v1](https://arxiv.org/abs/2501.13912v1)  
- **発表日**: 2025年1月23日  
- **著者**: Aatman Vaidya, Tarunima Prabhakar, Denny George, Swair Shah  

---

## 背景と目的

### インド言語の多様性とデジタル格差
インドは22の憲法認定言語、122の主要言語、そして1500以上の方言を有する言語的多様性の豊かな国です。この言語的遺産は、文化的・社会的な豊かさを生み出す一方で、技術的発展、とりわけデジタル化やAI対応において大きな課題を伴います。

**統計データ例:**
- **ヒンディー語**: 約5億人の母語話者がいるが、Wikipediaの記事数は全言語中62位。
- **サンタリ語**: 約750万人の話者を持つが、デジタルコンテンツはほとんど存在しない。

### AIと低リソース言語の課題
近年、大規模言語モデル（LLMs）は、多言語対応能力の向上が期待されていますが、特に低リソース言語では以下のような問題が顕著です：
- **データ不足**: トレーニングデータが不十分であるため、モデルが言語特有の文法や意味を正確に学習できない。
- **モデル設計の偏り**: 高リソース言語に特化しているため、他言語への汎用性が限定的。

---

## 研究の焦点

本研究は、以下の3つの主要なテーマに焦点を当てています：

### 1. LLMsのインド言語対応能力の評価
Meta社のLlamaファミリー、GoogleのMuRIL、OpenAIのGPTシリーズを含む28のモデルを分析し、各モデルがインド言語でどのように機能するかを評価しました。

### 2. 評価データセットの課題分析
IndicGLUEやIndicXTREMEなどのデータセットを使用し、自然言語理解や生成タスクの性能を測定しました。

### 3. 将来のベンチマークの提案
現実の言語使用頻度とモデル性能を比較し、次世代のAI開発における重点言語を提案しています。

---

## 実験の概要と結果

### モデルとデータセット
- **対象モデル**: 28のLLMs（GPT-4、Llama 2、MuRIL、IndicBERTなど）。
- **データセット**: IndicGLUE（11言語対応）、IndicXTREME（18言語対応）。

### 実験結果
1. **高リソース言語**:
   - ヒンディー語、ベンガル語、タミル語では、BLEUスコアが平均30を超える高い性能を示しました。
2. **低リソース言語**:
   - サンタリ語やシンディ語ではBLEUスコアが10未満に留まり、翻訳や質問応答タスクで著しい性能低下が見られました。
3. **データセットの課題**:
   - 多くのデータセットが英語翻訳を基にしており、インド固有の文化的ニュアンスや言語構造を十分に反映できていません。

---

## 詳細な議論

### パフォーマンス差の原因
低リソース言語のパフォーマンスが低下する主な要因として、以下が挙げられます：
1. **データ不足**: トレーニングデータの絶対量が不足している。
2. **不均一なデータ品質**: 特に地方言語においては、翻訳ミスや不正確なデータが多い。
3. **モデル設計の偏り**: 高リソース言語向けに最適化されたモデル構造が原因である可能性。

### ベンチマークの妥当性
現行の評価基準は、多くの場合英語翻訳を基にしているため、文化的背景やニュアンスを評価する能力が不足しています。本研究では、地域言語固有のデータセットの作成が求められると結論づけています。

---

## 今後の展望と応用可能性

1. **データ収集の拡充**:
   地域コミュニティと連携し、低リソース言語のデータ収集を強化。
   
2. **AI開発の多言語対応強化**:
   地域社会で利用可能な教育アプリやチャットボットの開発。
   
3. **政策形成への寄与**:
   言語多様性を考慮したAI開発戦略の策定。

---

## 賛否両論

### 賛成意見
- 本研究は、インド言語におけるLLMsの課題を包括的に分析し、具体的な解決策を提案しています。
- ベンチマークの提案は、次世代AI開発の指針となる可能性があります。

### 反対意見
- 評価データセットが英語翻訳に依存しているため、完全な多言語評価には課題が残ります。
- 分析対象のモデルが限定的であり、結論の汎用性には限界がある可能性があります。

---

この記事が、読者の研究や実務に役立つことを願っています。ご質問やフィードバックがございましたら、ぜひコメント欄でお知らせください。
デモ

$ N=1 → 2$
$ N=2 → 4$
$ N=3 → 8$
...
...
$ N=30 → 1073741824$

<h2>問題文</h2>
$N$個の品物があります。 品物には 
$1,2,…,N$ と番号が振られています。 各 $i (1≤i≤N)$ について、品物 
$i$ の重さは 
$A_i$  で、価値は 
$B_i$です。

太郎君は、$N$ 個の品物のうちいくつかを選び、ナップサックに入れて持ち帰ることにしました。 ナップサックの容量は $M$ であり、持ち帰る品物の重さの総和は 
$M$ 以下でなければなりません。
太郎君が持ち帰る品物の価値の総和の最大値を求めてください。

<h2>制約</h2>
$1≤N≤100$<br>
$1≤M≤10^5$<br>
$1≤A_i≤M$<br>
$1≤B_i≤10^9$<br>


<h2> 入力</h2>
$ N $<br>
$ A_1,B_1 $ <br>
$ A_2,B_2 $ <br>
...<br>
$ A_N,B_N $

<h2>問題文</h2>
$N$が渡されます。$N$が素数か判定してください。

<h2>制約</h2>
$ 1 \leq N \leq 10^6 $<br>


<h2> 入力</h2>
$ N $<br>

<h2>問題文</h2>
長さ$N$の数列$A$が渡されます。$Q$個のクエリがあり、$i$番目のクエリは、$b_i,c_i$が渡されます。このとき、$max(A_b,A_{b+1},A_{b+2},...,A_c)$を出力してください。

<h2>制約</h2>
$ 1 \leq N \leq 10^6 $<br>
$ 1 \leq Q \leq 10^6 $<br>
$ 1 \leq A_i \leq 10^6$<br>
$ 1 \leq b_i \leq c_i \leq N$<br>


<h2> 入力</h2>
$ N,Q $<br>
$ A_1,A_2,...,A_N $<br>
$ b_1,c_1$<br>
$ b_2,c_2$<br>
...<br>
$ b_Q,c_Q$<br>

##

あなたは  $N  が奇数か偶数かを判定してください。$

$N \leq 50$

$M \leq 10^{8}, K_i \leq 10^{8}$

$\frac{a}{b}$

`Yes`
[Flutter]Visibilityで非表示にしつつWidgetはビルドする方法

maintainStateを活用することで状態を保持する=Widgetのビルド自体は実行する。
Widgetのビルドに時間がかかり、あらかじめビルドしておきたい場合に有効。

```dart:main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: Scaffold(
        body: Visibility(
          // 状態は保持する
          maintainState: true,
          // 見た目は非表示
          visible: false,
          child: MyWidget(),
        ),
      ),
    );
  }
}

class MyWidget extends StatelessWidget {
  const MyWidget({super.key});

  @override
  Widget build(BuildContext context) {
    // ビルドされたらprintする
    print("build.start");
    return const Placeholder();
  }
}

```
関数の引数を辞書型で渡す

## はじめに
TypeScriptについて調べる中で、Options Objectパターンについての知見を得た。  
これをPythonのコーディングでも使えないかと思い、利用法について調べてみました。

## 環境
- Windows 11 Pro
- Python 3.12.8

## それぞれの記法
### TypeScript
``` TypeScript
const myFunction = (params: {name: string; age: number;}) => {
    console.log(`名前は${params.name}、年齢は${params.age}歳です。`)
}

myFunction({name: "Taro", age: 20})
//名前はTaro、年齢は20歳です。
```
### Python
```py
from typing import TypedDict

MyFunctionParams = TypedDict("MyFunctionParams", {"name": str, "age": int})

def my_function(params: MyFunctionParams):
    print(f"名前は{params['name']}、年齢は{params['age']}歳です。")

my_function({"name":"Taro", "age":20})
# 名前はTaro、年齢は20歳です。
```
## 使いどころ
Pythonはキーワード引数を利用できるので  
「引数名=引数値」を強制するという使い方だとあまり効果的ではないようにも感じる。  
  
しかし、メイン引数と辞書型でのサブ引数という形にして分けて記載すると  
可読性を向上させることが出来る部分がある筈なので、コーディング時に取り入れていきたい。

## 参考
- キーワード引数とOptions Objectパターン
  - https://typescriptbook.jp/reference/functions/keyword-arguments-and-options-object-pattern
- TypeScriptで関数を書くときに気をつけている事
  - https://zenn.dev/chot/articles/05413b79cc0398
- params options args parameters の使い分け
  - https://zenn.dev/misuken/articles/427c60c1a352f6
- Pythonで引数にキーワードを強制する方法
  - https://zenn.dev/nakurei/articles/forcing-keywords-as-arguments-in-python
JANOG55に参加しました。（初参加した人編）






## TL;DR

- 2025/1/22-24に京都で開催されたJANOG55に参加してきました。
- JANOG自体が初参加です。
- オフレコプログラムにばかり参加してしまったので、プログラムの感想は書いていません。



## イベント概要

2025年1月22日（水）～1月24日（金）に京都で開催されたJANOG55に参加してきました。
私はJANOG自体に初めて参加したので、初心者目線で書いていきます。


https://www.janog.gr.jp/meeting/janog55/


JANOGとはなんぞやは以下。

https://www.janog.gr.jp/information/


## 会場到着まで

2日目に用事があったため、3日目からの参加でした。3日目朝に新幹線で京都入りします。
ですが、普段から旅に慣れていないので以下のようなインシデント発生しました。

https://x.com/oishid20240325/status/1882564637859922040


仕事扱いで会社経費での参加なので、経理に怒られたらどうしようかと思っています。
バタバタしましたが、会場まで30分ぐらい余裕をもって到着しました。

https://x.com/oishid20240325/status/1882583763370254369


開場までの時間は向かいのスタバ＋蔦屋書店で過ごしました。
私同様に仕事しながら会場を待っているっぽい人が多くいました。

## 開場

QRコードが必要になるので、用意を忘れないようにしましょう。
※私は直前でPCにダウンロードしたけどスマホにダウンロードしていないことに気が付き、前述のスタバで用意しました。

初日の人は首からかけるネームプレートの用意をします。
ゆとりをもって参加申込をするとネームプレートを用意してもらえるのですが、私は遅かったので名刺を利用します。
また自身の属性を表すステッカー（I love xxx等）があります。私は「I am 初心者」をつけてました。

その後は各展示場で開場諸注意の説明がされますので、その後本格的にプログラムが始まります。

## 各プログラム

ストリーミングとアーカイブ配信があるものと、オフレコのものがあります。

https://www.janog.gr.jp/meeting/janog55/program-ja-timetable/


現地参加したからにはオフレコのプログラムに参加したくなってしまうわけで、結果、何も語れなくなってしまいました。
オフレコプログラムの内容は、展示場から出たら忘れてしまう仕様のため、質問などしないように注意してください。

## お昼休み

お昼休みがなく、適宜休憩とるタイプのイベントもありますが、このイベントはお昼休みがあります。
なので、周辺の飲食店は大変混雑します。お昼前のプログラムが盛り上がったこともあり出遅れてしまい、どのお店も長蛇の列となっていました。
私はせっかく京都にきたので唐揚げがついてくるラーメンを食べたくてラーメン屋に並んだのですが、唐揚げはライスとセット以外の提供がなくラーメン単品を注文し、ご当地感を感じることなく終わりました…


## 展示会場

150以上のブースがあります。
なお、**展示会場は3日目15:30で撤収されました。**
私はこのことを知らずに14:15までのプログラムに参加したため、ほとんど回れずに終了してしまいました…

### 休憩コーナー

展示会場の中には休憩コーナーがあります。
名前からすると展示会場の皆さんが休憩するためのコーナーのように思えますが、電源もありみんな仕事しており、休憩コーナーというかワーキングコーナーでは…
自分も新幹線・午前中のプログラムの合間などにPCをいじっていたためバッテリーがなくなり諦めていたのですが、こんな素敵なコーナーがあるのであれば、「合間塗って仕事出来ます！」で参加のハードルが下がらないかな？と思いました。



## 閉会

次回、JANOG56は2025/7/30-8/1に鳥取県松江市とのこと。
今回の京都と比較した際に、関東の人間からするとちょっとハードルが上がっている（交通費等）気もしますが、次回もぜひ参加したいです！


## その後

参加者の皆さん、帰路につくのか、慰労会に行くのか、後泊のためホテルに向かうのか、散って行きます。
なお私は翌日開催される[OSC 2025 Osaka](https://event.ospn.jp/osc2025-osaka) に向かうため、京阪線にのり大阪に向かうのであった…

以下に続きます。
https://qiita.com/oishi-d/items/95ae125c3489a55772d7









## 参考


https://www.janog.gr.jp/meeting/janog55/nl-017/
Discord大型共同コミュニティサーバー

Discord大型共同コミュニティサーバーおとは荒らしに最近行っていますが、通常いろんな界隈の方々が集まり雑談するサーバーでもあります。
![1000008215.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995630/04193b87-d75f-4d93-3674-3cc3dbc99e8a.jpeg)
↓サーバー参加はコチラから！↓
https://discord.gg/eDAqCVnYUw
いい加減 `~` がうるさいので Windows でもドットファイルを隠すスクリプトを書いた

Linux なんかではファイル名の最初がピリオドのファイル、いわゆるドットファイルは隠しファイル扱いとなり、通常の設定ではファイルエクスプローラに表示されなかったりします。

これに対し Windows の隠しファイルはファイル・ディレクトリのメタデータである「属性」として表現されており、ファイル名の先頭がピリオドだとしてもそれ自体が隠しファイルを作ってはくれません。

結果なにが起こるかというと、クロスプラットフォームなアプリケーションがドットファイルだけど隠しファイル属性を持っていないファイルをホームディレクトリ(`C:\Users\<username>`)に作りまくって大変なことになります。

![ドットファイルでいっぱいのホームディレクトリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/80b95e41-a0e4-3e55-684e-7c24a52492c7.png)

これにうんざりしていたのでちゃちゃっと Python でスクリプトを組みました。

https://gitlab.com/BlueRayi/dothider/

## 使い方

標準ライブラリしか使っていないので Python が導入されていればおおむね使えるはずです。ドットファイルを隠しにしたいフォルダのパスを `hoge` として、

```batch
python -m dothider hoge
```

とすることで `hoge` に存在しているドットファイルすべてが隠しファイルになります。

![ドットファイルだったファイルやフォルダが見えなくなっている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/b6976cb3-5307-603d-5b99-8eae095c64be.png)

隠しファイルを表示する設定にするとこのようになり、ちゃんと存在していることがわかります。

![隠しファイルが半透明で表示されている。元から隠しファイルだったものに加えドットファイルが半透明になっている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/116158e5-4c42-942d-fb57-4941f8e357c3.png)

もし戻したいと思ったときも簡単で、

```batch
python -m dothider -d hoge
```

で OK です。ちなみにもとから隠しファイルだったファイルやフォルダには影響ありません。

## 仕組み

と大層にセクションを設けていますが大したことはしていません。

隠しファイル属性の取得・設定は `attrib` コマンドをサブプロセス実行するという力技で解決。しかしこんなこと生で処理中に書きたくなかったので `pathlib.WindowsPath` クラスを継承したクラスを作成してこれらをメソッドとして持たせて隠蔽しています。

`-d` オプションでの復帰については、隠しファイル属性の設定の際にそのフルパスをテキストファイルに書き出し、あとで利用しているだけです。このテキストファイル自体もドットファイルかつ隠しファイルとして作成され、復帰時に自動で削除されます。複数回隠し処理を実行するとそのときに隠されたファイルだけ追記されるので、あとからドットファイルが増えたときにも安心です。

![ドットファイルのフルパスが改行区切りで記載されたテキストファイル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241027/6bfc50ed-8caf-0512-4d75-02fce3057f18.png)

## とここまで書いたけど

最近使いはじめたサードパーティ製のファイルエクスプローラである Files にはドットファイルを隠しファイルと同じように非表示にする設定があるのでこのスクリプト作った意味あんまりなくなっちゃったっていう。

https://files-community.github.io/ja-jp/
【Zed】データベースを簡単に扱えるようにする方法

## dblabをインストール

以下のコマンドを実行してdblabをインストールします。

```terminal
brew install danvergara/tools/dblab
```

カレントディレクトリに設定ファイルを作成します。

```.dblab.yaml
database:
  - name: "sample"
    host: "localhost"
    port: 5432
    db: "users"
    password: "password"
    user: "postgres"
    driver: "postgres"
    schema: "myschema"
limit: 50

```

https://github.com/danvergara/dblab

## Zedのタスクを作成する

dblabを起動するタスクを作成するために`tasks.json`に以下を追記します。

```jsonc

 {
    "label": "DBLab",
    "command": "dblab --config",
    "hide": "always",
    "allow_concurrent_runs": false,
    "use_new_terminal": true
  },

```

## タスクにホットキーを設定する

ホットキーでタスクを実行できるように`keymaps.json`に以下を追記します。

```jsonc
  {
    "bindings": {
      "alt-d": [
        "task::Spawn",
        {
          "task_name": "DBLab",
          "reveal_target": "center"
        }
      ]
    }
  },

```

上記のように記述した場合、`alt + d`を入力すると画像のようにdblabを起動できます。

![スクリーンショット 2025-01-26 23.54.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/36f12c94-2545-d09e-b4e6-5a88a69a8dba.png)
Breeze 2：繁体字中国語対応の次世代マルチモーダルAIモデルの詳細解説

# Breeze 2: 繁体字中国語に特化した次世代マルチモーダルAIモデル

今回は、MediaTek Researchが開発した最先端の研究成果「Breeze 2」をご紹介します。このモデルは、繁体字中国語における表現力を向上させるだけでなく、視覚情報を統合したマルチモーダル処理や関数呼び出し機能を備えています。台湾や香港、マカオといった繁体字文化圏での商業的・社会的応用に革新をもたらすこの研究を深く掘り下げます。

---

## 論文情報
- **タイトル**: The Breeze 2 Herd of Models: Traditional Chinese LLMs Based on Llama with Vision-Aware and Function-Calling Capabilities
- **リンク**: [arXiv:2501.13921v1](https://arxiv.org/abs/2501.13921v1)
- **発表日**: 2025年1月23日
- **著者**: Chan-Jan Hsu, Chia-Sheng Liu, Meng-Hsi Chen, Muxi Chen, Po-Chun Hsu, Yi-Chang Chen, Da-Shan Shiu

---

## 背景と目的

### 繁体字中国語の課題
繁体字中国語は台湾、香港、マカオなどで広く使用される言語であり、その文字体系は文化的な深みを持っています。しかし、現行のLLM（例: GPT-4v, Claude 3, Llama 3）では以下の課題が存在します：
1. **コーパスの不足**: 繁体字中国語の高品質データが他言語に比べて少なく、モデルの訓練に十分な多様性を持たせるのが困難。
2. **ニュアンスの欠如**: 繁体字独特の文法構造や文化的ニュアンスを捉えきれない。
3. **視覚的要素の非対応**: 繁体字を含む画像や図表など、マルチモーダルタスクへの適応が限定的。

### Breeze 2の開発意義
Breeze 2は、繁体字中国語をより正確に処理するために設計されたモデルであり、以下の目標を掲げています：
- 繁体字独自の文法と語彙を理解し、文化的背景を反映したテキスト生成。
- 視覚情報とテキスト情報を統合し、OCRや図表理解を伴う高度なタスクに対応。
- 商業アプリケーション（例: 自動カスタマーサポート）で必要な関数呼び出し能力を実装。

---

## モデルアーキテクチャと技術的特徴

### アーキテクチャ概要
Breeze 2は、以下の3つのコンポーネントで構成される「ViT-MLP-LLM」アーキテクチャを採用しています：
1. **Llama 3**:
   - 言語モデルの中核として、繁体字中国語の高度な言語処理を実現。
2. **InternViT-300M-448px**:
   - 視覚的特徴を捉えるためのエンコーダ。中国語文字や画像内の文脈を高精度で解析。
3. **MLPプロジェクタ**:
   - 視覚特徴と言語特徴を効果的に統合し、マルチモーダル処理を実現。

### 訓練プロセスの詳細
Breeze 2の訓練プロセスは以下の3段階に分かれています：
1. **テキスト前学習**:
   - Llama 3を基盤とし、繁体字中国語コーパス（898GB）で再学習。
   - 最大シーケンス長8,192トークン、学習率$1 \times 10^{-5}$。
2. **視覚アライメント学習**:
   - MLP層を先行学習し、続いて全体の視覚言語統合を行う2段階プロセス。
   - 視覚データセット（10.89Mデータポイント）を使用。
3. **ポストトレーニング**:
   - 指示追従、視覚指示追従、関数呼び出しの3つのタスクに特化。

---

## データセットとリソース

### テキストデータセット
- **Web Crawl**: CommonCrawlやFineWeb-ZHTWなど（421GB）。
- **学術データ**: 論文や研究計画書（94GB）。
- **コードデータ**: The Stack（110GB）。
- **ニュース・対話・法的文書**: 各ジャンルに特化。

### 視覚データセット
- **キャプションデータ**: LAIONやCOYOの繁体字版。
- **OCRデータ**: ArTやSynthDoGの繁体字版。

---

## 実験結果と比較

### ベンチマーク
1. **TMMLU+**（台湾知識）:
   - Breeze 2 8Bは46.4スコアで他モデルを凌駕。
2. **長文文脈処理**:
   - 最大128kトークン範囲で、Breeze 2 8Bは100%の精度を達成。
3. **視覚認識（TMMBench）**:
   - 台湾固有の視覚タスクでBreeze 2 8Bが45.9スコア。

### 比較
GPT-4vやClaude 3と比較して、台湾文化に特化したタスクで顕著な優位性を示しました。

---

## ケーススタディ

### 1. 台湾夜市に関する知識生成
Breeze 2 3Bは台湾各地の12の夜市を正確に列挙。Shilin（士林）やFengjia（逢甲）など具体的な地名を含め、文化的詳細を的確に反映。

### 2. フォーマルなメール生成
敬語やフォーマル表現を適切に使用し、自然なビジネス文章を生成。

---

## 課題と今後の展望

### 現在の課題
1. リソース消費が多く、モバイルデバイスへの展開には制約。
2. 視覚タスクでは、さらに大規模なモデルに及ばない部分も。

### 今後の方向性
1. モバイル向け最適化（量子化技術の導入）。
2. モデル規模の拡大（16Bや30B）。
3. 商業・教育アプリケーションへの応用。

---

この記事が、研究や実務における参考になれば幸いです。ご質問やフィードバックをお待ちしております。
Figmaで横スクロールが効かなかった話

自分用の備忘録

# 起こったこと
タイトルの通り。figma(Mac版)でshiftを押しながらスクロールしても横スクロールにならなかった。

# 原因
MOSの`Smooth Scroll`がオンだと横スクロールが効かないみたい。理由は不明。

# 対処法
`Smooth Scroll`をOFFにした。MOS側で除外アプリを設定できるので影響はfigma使用時のみ。


![スクリーンショット 2025-01-26 23.32.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832631/eafc2606-4089-e88c-ad8c-0ff7f47e593a.png)
【Unity】簡潔に書けるシングルトンな ScriptableObject の実装方法の紹介

# 概要

ScriptableObject は設定やデータ管理に利用できるため、シングルトンで取り扱いたい場面もあるかと思います。
そこで今回は、私がよく使うシングルトン？な ScriptableObject の実装を紹介します。

# コード

``` SingletonScriptableObject.cs
using UnityEngine;

[CreateAssetMenu(fileName = nameof(SingletonScriptableObject), menuName = "ScriptableObjects/Create " + nameof(SingletonScriptableObject))]
public class SingletonScriptableObject : ScriptableObject
{
    private static SingletonScriptableObject instance = null;
    public static SingletonScriptableObject Instance => instance ??= Resources.Load<SingletonScriptableObject>(nameof(SingletonScriptableObject));
}

```

### 補足

ScriptableObject は Resources 直下に生成してください。
nameof() で名前の変更に対応しやすくしています。
スマホアプリの個人開発を始めるのにかかる費用まとめ(年額)

## 固定費
| 名目          | 金額           | 月額か年額か | 合計     |
| ----------- | ------------ | ------ | ------ |
| AppStore(登録料)   | 99ドル＝約15500円 | ×1     | 15500  |
| Google Play(登録料) | 25ドル＝約3900円 | ×1     | 3900   |
| 電気代         | 6000ぐらい      | x12    | 72000  |
| ネット代        | 5000ぐらい      | x12    | 60000  |
| 携帯代         | 2000ぐらい      | x12    | 24000  |
| エディタ代       | 1000ぐらい      | x12    | 12000  |
| 総額          |              |        | 187400 |

注意:筆者は有料IDEのwebstormを使っている。
注意:携帯キャリアは格安モバイルの楽天
## 変動費
| 名目           | コメント                                                   |
| ------------ | ------------------------------------------------------ |
| ios検証機       | iPhoneやiPad 高いが普段使いしている人なら費用を抑えられる。                    |
| Android検証機   | 安い奴なら中古で１万円以下で買える。検証用なら十分な気がする                         |
| Mac(開発用)     | Xcodeでswiftやobject-cなどで開発したい場合は必要になる。中古や整備済みなどの選択肢もある。 |
| 外注費          | ココナラやクラウドワークスなどがある。デザインの一部や丸ごと外注するなどの選択肢がある。           |
| 好きなパソコン(開発用) | 好みの問題                                                  |

個人開発が想定なので当たり前ですが、人件費は計算に入れません。
仕事で使ってる生成AI関連の知識をまとめてみた（Part1）

システムエンジニアの大沼です。

仕事で生成AIを使った案件に携わることがあるのですが、その時どのようにお客様に生成AIを使ってもらうのかのイメージを連載形式でまとめていきます。

この記事は以下のような人におすすめです。

:::note info
- 生成AI関連の案件に入ったけど、生成AIのことはよくわかってない
- 動き出している生成AI案件に入るけど、追加で提案できる機能やできることを知りたい
:::

:::note warn
💡これはあくまで個人の見解のため誤った情報の可能性があります。
:::

## 目次

- そもそも生成AIとは
- 生成AIでできること
- まとめ

## そもそも生成AIとは

ざっくり言うと、**学習した情報をもとに新たなものを生み出してくれるAIです。**

- テキストデータを学習し、まるで人間が入力したかのような文章を生成する

**ChatGPT**

- 画像データを学習し、イラストを生成する

DALL-E

その他にも動画や音声などに対応した生成AIがあります。

### **ChatGPT**とは

このあとの説明を理解するたChatGPTが何なのかを理解している必要があります。

### **GPT**とは

**Generative Pre-trained Transformer**（事前訓練された生成変換器）

OpenAI社が作ったLLMです。

### **LLM**とは

**large language model**（大規模言語モデル）

要するに膨大なデータを元に学習したものということです。

つまり

**ChatGPT=事前に訓練された大規模言語モデルの生成変換器であるGPTを使ってChatをする生成AI**

こんな理解で良いのかなと思っています。

今回はOpenAI社のChatGPTにターゲットを絞っているため細かい説明は割愛しますが、

他社の持つLLMについて興味があれば調べてみてください。

上記の説明を簡単な図に落とし込んでみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/8db334a1-64cb-575f-4f69-ae6f29df04f8.png)

こんなイメージです。

## 生成AIでできること

ChatGPTは**事前に訓練された大規模言語モデルの生成変換器であるGPTを使ってChatをする生成AI**ということは伝わったかなと思うのですが、今度はこれを使って何ができるのかを知る必要があります。

生成AIでできることを知り、更にお客様がどのようなことに利用したいのかがわかれば提案にも使えますよね。

生成AIの活用によって業績を伸ばした会社について調べ、その会社がどのように利用していたかも参考になるかもしれません。

今回は２つ、生成AIができること紹介したいと思います。

### 文章生成

メールの文章を考えてもらったり、案出しなど

以下はメールの要約の実例です。

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/0d01a8f1-b488-2f95-dcb6-de3ad164a3a4.png)


管理画面の機能の案出しもしてもらいました。

![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/4bd56d8e-370f-aa16-0bac-55eaaa1bab8e.png)


### 文章要約

元となる文章を与え内容をまとめてもらうことができます。

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/ac6beaa8-875e-721b-4a5f-daa424786723.png)


まだ同じブロックが５つほど続きます。
要約した結果は以下となります。

![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/c1b76412-31dc-32a7-3119-afdf06666176.png)

いい感じにまとめてくれました！

## まとめ

今回は生成AIとはというところから何ができるのかを実例も交えて説明していきました。
まだまだ触りの部分なのでお客様へどう生成AIを使ってもらうのかというところまでは踏み込めませんでしたが、次回は「AzureChat」というMicrosoft社製AIチャットの説明をしていこうと思います。こちらの内容でもう少し踏み込んだ内容もお伝えできると思うのでお楽しみに。

以上、大沼でした。
CRPO: 次世代機械翻訳を実現するデータ選択アルゴリズムの全貌

# CRPO: 信頼度と報酬に基づくデータ選択アルゴリズムで機械翻訳を進化させる

今回は、機械翻訳（MT）分野での新たな進展を示す「CRPO: Confidence-Reward Driven Preference Optimization for Machine Translation」という論文を紹介します。本研究は、機械翻訳タスクにおける大規模言語モデル（LLMs）の性能向上を目指し、新たなデータ選択手法を提案しています。この手法は、報酬スコアとモデル信頼度を組み合わせることで、学習効率を高め、翻訳精度を向上させるという点で画期的です。

---

## 論文情報
- **タイトル**: CRPO: Confidence-Reward Driven Preference Optimization for Machine Translation  
- **リンク**: [arXiv:2501.13927v1](https://arxiv.org/abs/2501.13927)  
- **発表日**: 2025年1月23日  
- **著者**: Guofeng Cui, Pichao Wang, Yang Liu, Zemian Ke, Zhe Liu, Vimal Bhat  

---

## 背景と目的

### 機械翻訳の進化と課題
機械翻訳は、過去数十年にわたり、統計的手法（SMT: Statistical Machine Translation）からニューラルネットワークベースの手法（NMT: Neural Machine Translation）へと進化してきました。近年、Transformerアーキテクチャを基盤とした大規模言語モデル（LLMs）の導入により、さらに大きな進展が見られています。

しかし、これらのモデルが直面する課題も明確になっています：
1. **言語バイアス**  
   - LLMsは英語中心のデータで事前学習されており、多言語翻訳タスクでは不十分な性能を示します。
   
2. **高コストのフィードバック学習**  
   - RLHF（Reinforcement Learning from Human Feedback）は、人間のフィードバックを用いてモデル性能を改善する有力な方法ですが、その計算コストやリソース要求は非常に高いです。

3. **データ選択の最適化不足**  
   - 従来のデータ選択手法（例: RSO, RS-DPO）は、報酬スコアに偏重しており、モデルの学習に最適なデータを十分に考慮できていません。

### 本研究の目的
CRPO（Confidence-Reward driven Preference Optimization）は、報酬スコアと信頼度を統合することで、モデル学習に効果的なデータ選択を可能にします。これにより、トレーニング効率を高め、翻訳精度を向上させることを目指しています。

---

## 提案手法: CRPO

### アルゴリズム概要
CRPOは、以下の2つの主要なスコアリング手法を提案しています：

1. **CR+（Confidence-Reward Plus）**  
   CR+は、モデルの損失変化量に基づき、学習効果が高いデータを選択します。数式で表すと次のようになります：
   $$
   CR+ := K \cdot [R(x, y_w) - R(x, y_l)] + [\log \pi_{\text{ref}}(y_l|x) - \log \pi_{\text{ref}}(y_w|x)]
   $$
   ここで、$R(x, y)$は報酬スコア、$\pi_{\text{ref}}(y|x)$はモデルの信頼度を表します。

2. **CR×（Confidence-Reward Multiplication）**  
   CR×は、報酬スコアと信頼度を乗算することで、難易度が高く、学習価値の高いデータを強調します：
   $$
   CR× := [R(x, y_w) - R(x, y_l)] \cdot [\log \pi_{\text{ref}}(y_l|x) - \log \pi_{\text{ref}}(y_w|x)]
   $$

### 特徴
- 報酬スコアと信頼度スコアの組み合わせにより、モデルが苦手とするデータに優先順位を付ける。
- 計算効率が高く、大規模データセットにも適用可能。

---

## 実験設定と結果

### データセット
- **FLORES-200**: 24,314文ペアからなる多言語データセット。
- **WMT21/22**: 高品質な翻訳ペアを含む評価用データセット。

### モデルと設定
- **ALMA-7B**: 7Bパラメータを持つ大規模モデル。
- **NLLB-1.3B**: 多言語対応のエンコーダ-デコーダモデル。

### 結果
CRPO（特にCR+）は、COMETスコアやBLEURTスコアにおいて他手法を上回る結果を示しました：

| 手法         | COMETスコア | BLEURTスコア |
|--------------|-------------|--------------|
| RSO          | 0.8197      | 0.7403       |
| RS-DPO       | 0.8140      | 0.7311       |
| CRPO+        | **0.8218**  | **0.7462**   |
| CRPO×        | 0.8217      | 0.7451       |

---

## 応用可能性と未来の展望

### 応用例
- **商業翻訳システム**: 翻訳APIやWeb翻訳サービスへの統合。
- **多言語処理**: リソースの少ない言語ペアにおける翻訳性能の向上。

### 今後の課題
- CRPOスコアのハイパーパラメータ最適化。
- 実世界データへの拡張と適用性の検証。

---

この記事が皆さんの研究活動や実務に役立つことを願っています。コメントやフィードバックがありましたら、ぜひお寄せください！
Laravelでの不具合解消ガイド: 初学者向け

Laravelを使って開発していると、「あれ？なんかおかしいぞ」って場面、必ずと言っていいほどありますよね。「どこが悪いのかわからん！」って何度も叫びました（笑）。

そんな僕が試行錯誤してきた経験を元に、初心者の方でも安心して不具合に立ち向かえる解消法をお伝えします！

---

## 目次
1. **問題を細かく分けて考える**
2. **エラーメッセージをじっくり読む**
3. **ログを徹底的にチェックする**
4. **公式ドキュメントは味方だ！**
5. **便利なデバッグツールを導入しよう**
6. **ネットの力を借りる**
7. **解決したら必ず記録する**

---

### 1. 問題を細かく分けて考える
- **まずは冷静に、何が起きてるか確認**
  - 「白い画面しか出ない！」とか「データが保存されない！」とか、ざっくり把握。
- **問題の範囲を絞るために、試行錯誤**
  - 怪しいコードをコメントアウトしてみたり、一部分だけ実行してみたり。
  - 最初は地道な作業に感じるけど、これが一番の近道なんです。

### 2. エラーメッセージをじっくり読む
- **Laravelのエラー画面はヒントの宝庫！**
  - 例えば「Call to undefined method」って出たら、「あ、メソッドの名前が間違ってるな」ってすぐわかる。
- **エラーメッセージをそのまま検索**
  - 「SQLSTATE」とかエラーワードをGoogleに放り込むと、大体答えが見つかる。僕はこれで何度も助けられました！

### 3. ログを徹底的にチェックする
- **Laravelのログは困ったときの必需品**
  - パス: `storage/logs/laravel.log`
  - 実行中のエラーをリアルタイムで見るなら、ターミナルで `tail -f` コマンドが便利。
- **自分でログを追加するのもアリ**
  - 例: `Log::info('ここで変数の中身は？');`
  - エラーがどこで発生しているかを可視化できる。

### 4. 公式ドキュメントは味方だ！
- **Laravel公式ドキュメントをフル活用**
  - URL: [https://laravel.com/docs](https://laravel.com/docs)
  - わからないメソッドや設定があれば、まずここをチェック。
- **関連リソースも積極的に活用**
  - LaracastsやYouTubeの動画は初心者にもわかりやすい。

### 5. 便利なデバッグツールを導入しよう
- **Laravel Debugbarが超便利！**
  - エラー箇所や実行クエリを確認するのに必須。
  - コマンド: `composer require barryvdh/laravel-debugbar --dev`
- **Tinkerでコードを実験**
  - Tinkerを使えば、簡単にモデルや関数の挙動をテストできる。
  - 実行: `php artisan tinker`

### 6. ネットの力を借りる
- **質問サイトやフォーラムを活用**
  - Stack OverflowやQiitaで同じようなエラーがないか検索。
  - 自分で質問するなら、エラー内容と試したことを具体的に書こう。
- **SNSも侮れない**
  - Twitterで「#Laravel」とかで検索すると、意外と有益な情報が見つかる。

### 7. 解決したら必ず記録する
- **後で見返せるようにメモを取る**
  - Markdown形式でまとめておくと、再発したときにすぐ解決できる。
- **ブログやノートで共有する**
  - 他の人にも役立つし、自分の理解も深まる。一石二鳥！

---

## まとめ
僕もLaravelで開発を始めた頃は、エラー画面にびっくりして手が止まったことが何度もありました。でも、一つずつ解決していくうちに、自分のスキルが上がっていくのを実感できました。

不具合に出会うのは成長のチャンス、だそうです。たしかに、エラーが全く起きずにすんなり行くときのほうがゾッとすることは増えてきた気が・・・。

少しでも助けになれば幸いです。それでは。
AndroidとSwiftの似てるけど意外と違うもの

# はじめに
今回はAndroidとSwiftで似てはいるけど実際には大きく違うものを紹介していきます
### 本文
flatMap
---
まず紹介するのは`flatMap`です
Androidでは２種類のCollectionを１つのCollectionにしつつ加工をするものですが、SwiftではAndroid同様Collectionを並列にしてくれた上で加工することもできるのですが、なんとOptionalのものに対しても使うことができます。
Androidでいう?.letのように呼び出すことができ、nullだった場合はそのままnilを値が入っていれば記述通り加工して代入をしてくれます

DataClassとStruct
---
次はDataClassとStructです。
各々は聞き馴染みがあるかもしれませんが、要は都合のいい入れ物です
プリミティブな型の集合クラスみたいな認識でいいです。
さて、何が違うかというと一番違うのはインスタンスかなと思います
Androidでは箱の中身を一部分だけ変えて代入したいときは`.copy`を使うと思いますが、Structはそのまま箱の中身を引き継いでくれます。
ただし、しっかりと理解して使わないと意図せず不要なものまで中身を引き継いでしまうので注意が必要でs
### 最後に
最近Swiftに触る機会が多く、触っていておぉこれは似て非なるものだなぁと思ったものを紹介しました
自己満足感が強いですが、どなたかのお役に立てれば幸いです
VRCワールド作成で座標変換で沼った話

VRCワールド作成をしようとUdonsharpでコードを書いたところ沼ったのでメモ

## やりたいこと
ピックアップオブジェクトをピックアップしたあと、Useすると手元から一定座標オフセット下箇所に別のオブジェクトをスポーンさせる。
最終的に出来上がったのが下の画像。
Magic: the Gathering のカードパックを見立てたオブジェクトをUseすると、
排出されたカードがパックの上に表示される用になっている。
![Qiita91.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3995577/acabd4e5-5ef4-2546-1667-26144cf7b4a8.gif)

## 座標変換
Unityには便利な機能があって（たどり着くまでだいぶかかったが）
ワールド座標とローカル座標を交互に変換できる関数が用意されている。
参考にしたサイト: [【Unity】ワールド座標とローカル座標の相互変換](https://nekojara.city/unity-transform-point#%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E7%A9%BA%E9%96%93%E3%81%8B%E3%82%89%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E7%A9%BA%E9%96%93%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B)
公式ドキュメント: [Transform.TransformPoint](https://docs.unity3d.com/ja/current/ScriptReference/Transform.TransformPoint.html)

### ワールド座標 → ローカル座標への変換
`transform.InverseTransformPoint(座標)`

### ローカル座標 → ワールド座標への変換
`ransform.TransformPoint(座標)`


## 実装
上の内容を踏まえて、最終的にできた処理順。
Useしたら手元のオブジェクトからy軸に0.3移動させた箇所にオブジェクトをスポーンさせたい場合

1. Vector3で座標を宣言＆手元のオブジェクトの座標を代入
2. ワールド座標→ローカル座標に変換
3. y軸方向に座標をずらす
4. ワールド座標に戻す
5. オブジェクトを宣言した座標に移動

の処理が必要だった。最終的に書いたコードは下記の通り。

### 実際のコード
（コピペなので余計な処理も書かれていることはご勘弁を）

```c#
// オブジェクトを複製
GameObject duplicatedObject = Instantiate(objectToDuplicate.gameObject);

// 複製したオブジェクトをシーンに追加 (非表示オブジェクトの複製時に必要)
duplicatedObject.transform.SetParent(transform);

// 複製後の位置を計算 (5x3のグリッド状に配置)
int row = i / 5; // 行
int col = i % 5; // 列


Vector3 currentSpawnPosition = transform.InverseTransformPoint(this.gameObject.transform.position);
currentSpawnPosition = SpawnPosition + new Vector3(col * xOffset, row * yOffset, 0f);

// 親オブジェクトの回転を取得
Quaternion currentSpawnRotation = this.gameObject.transform.rotation;

// ローカル座標でY軸180度回転させるQuaternionを作成
Quaternion localRotation = Quaternion.Euler(0, 180, 0);

// 現在の回転にローカル回転を適用
transform.rotation = currentSpawnRotation * localRotation;

// 複製したオブジェクトの座標を移動
duplicatedObject.transform.position = transform.TransformPoint(currentSpawnPosition);
duplicatedObject.transform.rotation = currentSpawnRotation;
```

## 沼ったこととか

まず上のワールド⇔ローカルの変換方法を見つけるのにしばらくかかったのはおいて、
次に沼ったのを4.のワールド座標へ戻す処理が必要なことに気が付かなかったこと。
ローカル座標のまま、オブジェクトをオフセット分ずらして最終的な座標に適用した結果、
オブジェクトが原点に移動する事になった。
（よくよく考えればそれはそうとしか言えない内容だったが）

ローカル計算したあと、移動させるときはワールド座標に変換し直すことをお忘れなく。
皆も気をつけましょう。
"オブジェクト指向プログラミング"を『人間社会』に例える

<h4>1. はじめに</h4>
こんにちは！

私は現在"Ruby"を中心にプログラミング学習をしています。

"Ruby"に限らずその手の言語を学ぶにあたって"オブジェクト指向"という言葉を避けては通れないのではないでしょうか。

今回は"オブジェクト指向"に付随する言葉をいくつかピックアップし『人間社会』に例えてみようと思います。

<h4>2. オブジェクト指向とは</h4>
まず最初に"オブジェクト指向プログラミング"とは何かということから始めていきたいと思います。

"オブジェクト指向プログラミング"とは『各要素をパーツとして見立ててこれらを組み合わせることによって1つのソフトウェアシステムを構築する』というものです。

例えば『人間社会』を『ソフトウェアシステム』とした場合、エンジニアやサポートスタッフといった様々な職業に就く人々が『パーツ』に当たります。そしてそうした人々が個々に自身の役割に取り組むことによって『人間社会(=ソフトウェアシステム)』が成り立っています。このように各機能をもった部品を組み合わせることによって1つの完成品を体現することができます。

<h4>3. クラスとは</h4>
クラスとは一般的に『オブジェクトの設計図』と言われています。言い換えるならば『フレームワーク』や『枠組み』ともなるのではないでしょうか。

例えば"オブジェクト"を"エンジニア"と仮定した場合、その職業人を形作るために必要な基礎知識を養成する職業訓練や人材育成カリキュラムだと思っていただければわかりやすいかと思います。

<h4>4. インスタンスとは</h4>

インスタンスとはクラスに組み込むための『属性(データ)』というのが一般的です。

先ほどの基礎だけを身に着けられる職業訓練(=クラス)だけだと、エンジニアとして存在できる意義が危ういですよね。なので先ほどの基礎という一連の枠組みに実践演習といった、実際に機能するようになるための応用的なアウトプットが必要になります。これをインスタンスだと思っていただけると幸いです。

<h4>5. 最後に</h4>
上記のものを規模順に表すと以下のようになります。

> インスタンス ≦ クラス < オブジェクト < ソフトウェアシステム

1つ1つの『個』が社会『全体』を形作っているということと通ずるところがあるのではないかと思います

手短ではございますが、今回はこれにて失礼いたします。
センサ出力の負の電圧をArduinoで扱う方法

## 1. はじめに
Arduinoのアナログピンでセンサ値を扱えるように0-5[V]の範囲に変換する方法をまとめました．

想定しているのはロードセルのアナログ値を扱う場合とかです．
ロードセル値をアンプを通すと引張圧縮で正負の電圧が出力されると思います．
例えば，アイコー社のフォースゲージだと±2 Vのアナログ出力に対応します．
2~3 V足してあげればいい感じになるのになぁという方向けです．

XH711のようなアンプモジュールでGPIO通信したり，その他のセンサでI2C通信したりして回避する方法もあります．

今回は，オペアンプLM358を用いた非反転の加算回路を説明します．
具体的なシチュエーションとしては，±200 Nレンジでアナログ出力±2 VのフォースゲージRZ-20をArduinoのアナログピンに接続できるようにします．

N倍する増幅回路や論理値変換(3.3V->5V)については後ほど．
一般的なアンプだと±5とか±10[V]出力の場合が多いので1/N倍に増幅してから＋M [V]シフトを自在に扱えたら便利ですね．

## 2. オペアンプについて
オペアンプの概念については色々なサイトで解説されているのでパス．
端的に言うと以下の通り
- 電圧をN倍の掛算や±N加減算して増幅．
- オペアンプの電源電圧に接続した電圧まで増幅可能．
- 安価品や高精度/高速度品がある．

## 3. 電子回路
実際の基板実装の写真やらネットに出回っていないんですよね...
こんな風に組めばOKです。
抵抗値は，電圧の倍率を変えないのであれば全部10 kΩにしておけば問題ないでしょう．

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/be6349b4-1fa5-ec06-a09c-5e01bc28235f.png)


ちなみに，増幅する電圧2.5 Vは直流安定化電源，スイッチング電源，3端子レギュレータを使う手があります．
これ便利そう↓

https://akizukidenshi.com/catalog/g/g110085/

## 4. 結果
MicroLabBox(dSPACE)で計測しました。増幅前後の電圧は以下の通り．
無事2.5 V基準に増幅できています．（微妙にずれているのは直流安定化電源の表示が小数点以下1桁までなのが原因）
![スクリーンショット 2025-01-26 224945.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654082/17c74562-35f0-f5d8-ecc5-b3cc85eba9db.png)


## 5. おわりに
高精度品のオペアンプや高精度抵抗を使った場合の誤差についてまとめてみたいところ．
直流安定化電源をセンサ出力回路に対して直列に挟んでシフトする方法を見かけ...なんだかなぁと思った今日この頃。

## 参考文献
[1] NOBのArduino日記！, "オペアンプを使った演算回路(加算回路)", 

https://nobita-rx7.hatenablog.com/entry/28066220

[2] Analogista, "オペアンプを使った加算回路の使用例と動作原理",

https://analogista.jp/adder/

[3] Electrical Information, "『加算回路』を分かりやすく解説！【オペアンプ】",

https://detail-infomation.com/adder-circuit-op-amp/

[4] きむ茶工房ガレージハウス, "マイコン回路での入力信号増幅をオペアンプで行う方法",

http://zattouka.net/GarageHouse/micon/circuit/OP.htm

[5] Maicommon.ciao.jp, "演算回路の応用",

https://maicommon.ciao.jp/ss/Hardware/ANcircuit/opAmp2/index.htm
【UGUI】レティクル(Image)の明度を画面の明度に応じて調整する

レティクル(Image)の明るさを、ゲーム画面の明るさに応じて調整します。
画面が暗いなら明るく、画面が明るいなら暗くしたい。

https://x.com/sn___________10/status/1883510931529122101

## 前提 `UI/Default`シェーダを利用
`UI/Default`シェーダーをベースに作成します。

**参考(ちょっと古い)**

https://github.com/TwoTailsGames/Unity-Built-in-Shaders/blob/master/DefaultResourcesExtra/UI/UI-Default.shader

## 1. GrabPassでレンダリング結果を書き出す
画面のレンダリング結果が欲しいので、GrabPassで`_GrabPassTex`に書き出します。

+ 参考: [【Unity】【シェーダ】GrabPassの説明とシェーダの実装例 - LIGHT11](https://light11.hatenadiary.com/entry/2018/12/12/000345)
```hlsl
SubShader
{
	Tags
	{
		"Queue"="Transparent"
		"IgnoreProjector"="True"
		"RenderType"="Transparent"
		"PreviewType"="Plane"
		"CanUseSpriteAtlas"="True"
	}
	GrabPass { "_GrabPassTex" }

	Pass
	{
		Name "Default"
	CGPROGRAM
//以下省略(後述)
```

## 2. オブジェクト座標からGrabPassのテクスチャ座標に変換する
クリップスペース座標を経由してGrabPassのテクスチャ座標に変換します。
+ 参考: [ビルトインシェーダーヘルパー機能](https://docs.unity3d.com/ja/2019.4/Manual/SL-BuiltinFunctions.html)

```hlsl
v2f vert(appdata_t v)
{
	v2f OUT;
	OUT.vertex = UnityObjectToClipPos(v.vertex);
	OUT.texcoord = ComputeGrabScreenPos(OUT.vertex); 
	return OUT;
}
```


## 3. 画面の明度を反転させてRampテクスチャから明るさを取得する
画面が明るいなら暗い色を、暗いなら明るい色を取得します。明度で計算していますが、輝度の方が良かったかもしれません。

```hlsl
sampler2D _RampTex;
fixed4 frag(v2f IN) : SV_Target
{
	half4 bgColor = tex2D(_GrabPassTex, IN.texcoord);
	float brightness = max(bgColor.r, max(bgColor.g, bgColor.b));

	fixed3 ramp = tex2D(_RampTex, fixed2(1-brightness, 0)).rgb;
	brightness = max(ramp.r, max(ramp.g, ramp.b));

	return fixed4(brightness * _Color.rgb,1);
}
```

Rampテクスチャ(Canvaで適当に作った)
![ReticleRamp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515818/509b67ed-4643-6336-7b06-5aa6d8f63581.png)


## コード全体
https://gist.github.com/s-n-1-0/6cc31acd3f255f8af62b8f1184c2e242
RSpec FactoryBotについて

## はじめに
Railsでテストをする際に使用するRSpec FactoryBotの基本的な使い方を備忘を含め書きたいと思います。
間違いなどありましたらコメントお願いいたします。

## RSpecとは
RSpecは、Rubyや Railsの代表的なテストフレームワークの一つです。

## 特徴
describeやcontextでテスト構造を定義
itを使ってテストケースを定義
expectを使って期待する結果を検証

こちらの記事がとてもわかりやすかったです。

https://qiita.com/uchiko/items/d34c5d1298934252f58f

## FactoryBotとは
FactoryBotは、テストデータを簡単に作成するためのライブラリです。データベースに手動でレコードを作成する手間を省くことができます。

## FactoryBotの使い方

### テストデータの作成
spec/factories/の階層にUserモデルならusers.rbという形でファイルを作成します
```ruby
FactoryBot.define do
  factory :user do
    name { "テストユーザ" }
    email { "test@example.com" }
  end
end
```
### テストデータの使用
RSpecのテストで作成したデータを使用します。
このRSpecのコードは、Userモデルのインスタンスがバリデーションを通過するかをテストしています。

```ruby
RSpec.describe User, type: :model do
  it "ユーザーが有効であること" do
    user = FactoryBot.build(:user)
    expect(user).to be_valid
  end
end
```

### letを使用する場合
createとbuildの違い
```ruby
let(:user) { FactoryBot.create(:user) } # データベースに保存
let(:user) { FactoryBot.build(:user) } # メモリ上のオブジェクト
```

RSpecとFactoryBotを活用すると、テストデータの作成が簡単になり、テストの可読性や保守性が向上します。
WSLにGoをインストール

WSLにGoをインストールする手順を説明します。

ただ手順を説明するだけではなく、コマンドの意味や Linux 周辺の知識も補足して説明していきます。

### その前に
以前にGoをインストールしており、古いバージョンを上書きせずに新しいバージョンをインストールしたい場合は、以下のコマンドでGoのインストールディレクトリを削除してください。

```bash
(sudo) rm -rf /usr/local/go
```

ここで削除している`go`ディレクトリの親ディレクトリについて軽く説明します。
#### /usr
`/usr`ディレクトリは主に一般ユーザーが利用する実行可能ファイルや、それらに関するドキュメントが含まれています。一般ユーザーが利用するコマンドの多くは`/usr/bin`に保存されています。

#### /usr/local
`/usr/local`は手動でソースコードからコンパイルしてインストールしたプログラムや、サードパーティ製ソフトウェアを格納する場所になっています。なので、Linuxシステムでは、手動でインストールするソフトウェアを`/usr/local`配下で管理するのが推奨されています。
Goのパッケージはこの`/usr/local`配下に置きます。


### パッケージのダウンロード
[公式サイト](https://go.dev/dl/)から「go1.23.5.linux-amd64.tar.gz」のリンクアドレスをコピーし、こちらのコマンドでパッケージをダウンロードします。

```bash
curl -LO https://go.dev/dl/go1.23.5.linux-amd64.tar.gz
```

または

```bash
wget https://go.dev/dl/go1.23.5.linux-amd64.tar.gz
```

**コマンドの意味**
Goのバイナリパッケージをダウンロードしているのですが、もう少し言うとどちらのコマンドもURL「[https://go.dev/dl/go1.23.5.linux-amd64.tar.gz](https://go.dev/dl/go1.23.5.linux-amd64.tar.gz)」に対してGETリクエストを行ってパッケージをダウンロードしています。

##### curl コマンドのオプションについて
- **-L** : URLがリダイレクトされる場合に、そのリダイレクト先を追跡してリクエストを続けるオプション
- **-O** : レスポンスで得られたファイルを URL に基づく名前（この場合、`go1.23.5.linux-amd64.tar.gz`）で保存する

#### go1.23.5.linux-amd64.tar.gz について
また、ダウンロードした「go1.23.5.linux-amd64.tar.gz」についても解説しておきます。
go1.23.5.linux-amd64.tar.gz は（アーカイブ形式の）バイナリパッケージと呼ばれるものに該当します。「バイナリパッケージ」と「アーカイブ形式」の言葉の意味を確認しておきましょう。

**バイナリパッケージ**
ソースコードをコンパイル済み（実行可能形式）にしたソフトウェアの配布物のことで、実際はソフトウェア（今回はGo）の実行ファイルや関連するデータ（ライブラリ、設定ファイルなど）をまとめたものです。パッケージをダウンロードすることですぐに利用できるようになっています。

**アーカイブ形式**
複数のファイルやディレクトリを 1 つにまとめた後、圧縮した形式のことです。

なので今回ダウンロードしたgo1.23.5.linux-amd64.tar.gzは**Goのパッケージを圧縮したもの**と言えます。

#### データの完全性検証
可能性は低いですが、[公式サイト](https://go.dev/dl/)のSHA256 Checksumを参照してダウンロードしたファイルが改ざんされていないか、ファイルのダウンロード中や保存の際に破損していないかをこちらのコマンドで確認できます。

```bash
sha256sum go1.23.5.linux-amd64.tar.gz
cbcad4a6482107c7c7926df1608106c189417163428200ce357695cc7e01d091  go1.23.5.linux-amd64.tar.gz
```

**コマンドの意味**
sha256sumコマンドで、ファイルの SHA-256 ハッシュ値（チェックサム）を計算して出力しています。これで公式の結果と同じになっていることを確認できました。

ダウンロードしたパッケージは圧縮してあるので解凍・展開して利用できるようにします。


### パッケージの展開
こちらのコマンドで展開します。
```bash
(sudo) tar -C /usr/local -xzf go1.23.5.linux-amd64.tar.gz
```

**コマンドの意味**
tar コマンドはアーカイブファイルの操作を行うコマンドでアーカイブの作成や解凍、展開に使用されます。

オプションについて
- -x: 解凍オプション
- -z: gzip 圧縮の場合に指定
- -f: ファイル名（go1.23.5.linux-amd64.tar.gz）を指定
- -C: 指定したディレクトリ（/usr/local）に移動して実行


これで /usr/local配下にGoのパッケージが展開されました。 

こちらのコマンドで/usr/local/goを親ディレクトリとしてGoのパッケージが展開されていることがわかると思います。

```bash
ls -l /usr/local/go
```

### パスを通す
環境変数PATHにパスを通してgoコマンドを利用できるようにします。
環境変数`PATH`の設定を永続化するため、`.bashrc`に書き込んでおきます。

```bash
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
```

**コマンドの意味**
このコマンドは`go`コマンドを実行できるようにするための`PATH`設定「export PATH=$PATH:/usr/local/go/bin」を「.bashrc」ファイルに書き込んでいます。

.bashrc はBash セッションが起動する際に読み込まれるので、一度ターミナルを閉じた場合でもgoコマンドが利用できるようになります。

最後にgoコマンドが利用できるようになったのか確認します。

```bash
go version
go version go1.23.5 linux/amd64
```

これでGoのインストール完了です！
お疲れ様でした！
IPv4の次はIPv5ではなくIPv6?ではIPv5は何を?

# はじめに
先日、X(旧Twitter)にてこのような投稿をしたところ、少し反響がありました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">あるんですよ…IPv5<a href="https://t.co/uF0KC8dFYF">https://t.co/uF0KC8dFYF</a> <a href="https://t.co/xRyyKjRfUy">https://t.co/xRyyKjRfUy</a></p>&mdash; ホワイトバード先輩 (@whitebird_sp) <a href="https://twitter.com/whitebird_sp/status/1881546311725637796?ref_src=twsrc%5Etfw">January 21, 2025</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ということで、IPv5とは何か?どんなプロトコルか?といったものを簡単に解説していきます。

# IPv5とは？
### RFC上の規定
IPv5は、RFC1190(1990年)ならびに、RFC1819(1995年)に定められたものとなっており、IPv4やIPv6のようにアドレッシングに関する規定ではなく、ST-2と呼ばれるOSI参照モデルのネットワーク層で規定された、ストリーミングに関するプロトコルとなります。

https://datatracker.ietf.org/doc/html/rfc1190

https://datatracker.ietf.org/doc/html/rfc1819

また、RFC1190に記載の通り、"Experimental（実験的）"となっており、限定的な使用として一般普及を目的とはしていません。
そのため、利用者側にはほとんど知られておらず、ごく一部の研究者が使っていたものとなります。
ご存じの通り今日ではストリーミングにRTPやHTTPなどにおいてUDPやQUICといったトランスポート層をベースとしたプロトコルが使用されています。

### IPv5(ST-2)の仕組みの概説
ST-2は
ST-2はアプリケーションデータを通すData PathとControl Pathの二つからなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308706/5c5ef655-b944-d1e3-a1dc-a2cb655c85f5.png)
Data Pathはデータそのもの、Control PathはStream Control Message Protocol(SCMP)と呼ばれ、ヘッダに含まれるD-bitが0以外の場合、Data Path、0の場合Control Pathとなります。
Control Pathでは以下のような制御を行います。
+ 送信元と、送信先（一つまたは複数）のPeeringの確立とストリーミングの開始
+ Peeringの追加・削除
+ ストリーミングの終了

制御メッセージには、次のようなものが含まれます。

|メッセージ|用途|
|---|---|
|ACCEPT|新規のストリーミングの開始|
|ACK|メッセージへの応答|
|CHANGE|サービス品質の変更|
|CONNECT|コネクションの確立と、新規の送信先の追加|
|DISCONNECT|送信先の削除(一つまたはすべて)|
|ERROR|エラーメッセージの送付|
|HELLO|隣接するSTエージェント(ルータなど)同士の同期メッセージ|
|JOIN|既存のストリームへの参加|
|JOIN REJECT|既存のストリームへの参加拒否|
|NOTIFY|STエージェントへの通知メッセージ|
|REFUSE|新規のストリーミングの開始拒否|
|STATUS|STエージェントへのステータスクエリ|
|STATUS-RESPONSE|STATUSメッセージへの応答|

ストリーミングは異なるネットワークやルータを超えて行うことができ、音声・動画といった異なるタイプのストリーミングを行うことができます。
また、帯域の確保もこの中で行うことができ、SCMPは再送処理や、通信が途切れた際の再接続を試みます。

### では、なぜこれはIPv5なのか?
RFC1190によると、ST-2のパケットのヘッダをIPv4と分ける意図がありました。最初のIPバージョンヘッダを除き、IPv4とは互換性の内容に作られています。バージョンヘッダは5を使用しており、これは今でもIPv4のプロトコル番号および、IPv6のNext-Headerでは5が使われています。

もともとIP(Internet Protocol)は、IPアドレスを規定するためだけではなく、インターネット上のホストへデータを送信するためのプロトコル（決まりごと）を規定したものになります。
1974年にTCPのデータグラム（送受信単位）として提唱され、
TCPv2として1977年にIPv0、1978年にIPv1～IPv3、そして1979年にRFC755として発表され、IPv4としては最終的に1981年のRFC791でIPv4の最終型となります。

# まとめ
IPv5を紐解くと、その前のInternet Protocolの歴史や、TCP/IPがなぜTCP/IPと呼ばれるのか、という話。インターネットそのもののの歴史を探る壮大な物語になります。
RFC791のタイトルはそのもの「INTERNET PROTOCOL」となるので、これが集大成という意気込みを感じます。
また、ST-2そのものも現在の分散アーキテクチャの考え方と通ずるものがあり、「The Network is the Computer.」であり、AWSをはじめとするクラウドサービスがインターネットのOS（たびたびAWS/Amazonの幹部が基調講演でそう言っていますが、もともと誰が言い出したのかは失念してしまいました…）になっているというところにつながっているとするあれば、このIPv5もどこかにつながっているのだと思います。

# 参考文献

https://datatracker.ietf.org/doc/html/rfc1190

https://datatracker.ietf.org/doc/html/rfc1819

https://datatracker.ietf.org/doc/html/rfc755

https://datatracker.ietf.org/doc/html/rfc791

https://www.oresamalabo.net/entry/2021/09/19/004604
今週の学習記録（2025/1/19～2025/1/25）

## 🔍 学習内容
- **学習テーマ**: JavaScript
- **使用した教材**: CodeLesson, Qiita, YouTubeなど

## ✏️ 学んだこと
### 主なポイント
- 文字列操作メソッド
- 非同期処理
- JSON形式
- DOM操作

## 💡 学び・反省点
### 学び
- resolveは.then、rejectは.catchが呼び出される。
- indexOf()は該当する文字列の最初のインデックスを返す。なければ-1を返す。
- matchメソッドは最初に合致した文字列を配列で返す。gフラグがあればすべての文字列を配列で返す。
- JSON.parse()はJSON形式の文字列をJSのオブジェクトの変換する関数。JSON.stringify()はJSオブジェクトをJSON形式に変換する関数。

### 反省点
- 体調が悪かったとはいえ、2日も学習しない日を作ってしまった。
- 前回同様、1日の学習時間を増やしたい。


## 📆 次週の予定
### 目標
- TypeScriptやReactの学習を進める。

### 行動計画
- 通退勤時間も積極的に学習する。
- 帰宅時にダラダラせずさっさと学習を始める。
- 休日だからといって昼近くまで寝ない。

## 🏄‍♂️所感
　今週でJavaScriptの学習を終了させることができました。来週からずっと学んでみたかったTypeScriptの学習に入るためたくさん学習したいと思います。
　反省点としては1週間で2日も学習しない日を作ってしまいました。体調がすぐれなかったとはいえ、学習が順調がゆえに流石に怠けすぎてしまいました。来週から自分に喝を入れて心機一転頑張りたいと思います。
Nuxt3のレンダリング形式について調査

nuxt3のハイブリッドレンダリングについて、詳しく知りたいと思い、調査した。

### 2種類のレンダリング
Nuxt3の公式ドキュメントの「Rendering Modes」のページでは詳しく記載しています。
そのページによるとNuxt3は、大きく分けて、「Universal Rendering」、「Client-Side Rendering」の２つに対応しています。


- Universal Rendering
PHPやRubyアプリケーションによって実行される従来のサーバー側レンダリングに似ており、Nuxtはサーバー環境で JavaScript (Vue.js) コードを実行し、完全にレンダリングされたHTMLページをブラウザに返します。
つまり静的に生成してくれるようです。
これだと、表示するまでの速度も速くなり、検索エンジン最適化もされます。


- Client-Side Rendering
従来の Vue.js アプリケーションは、そのままではブラウザ (またはクライアント) でレンダリングされ、ブラウザが現在のインターフェイスを作成するための指示を含むすべてのJavaScriptコードをダウンロードして解析した後、Vue.jsはHTML要素を生成します。
コードのサーバー互換性について心配する必要がなく、インターネットが利用できないときでも問題なく動作できます。


### Hybrid Rendering
ハイブリッドレンダリングでは、ルールを使用してルートごとに異なるキャッシュルールを許可し、特定のURLに対する新しい要求にサーバーがどのように応答するかを決定できます。
nuxt.config.tsで設定できます。
以下がサンプルです。

```JavaScript
export default defineNuxtConfig({
  routeRules: {
    // Homepage pre-rendered at build time
    '/': { prerender: true },
    // Products page generated on demand, revalidates in background, cached until API response changes
    '/products': { swr: true },
    // Product pages generated on demand, revalidates in background, cached for 1 hour (3600 seconds)
    '/products/**': { swr: 3600 },
    // Blog posts page generated on demand, revalidates in background, cached on CDN for 1 hour (3600 seconds)
    '/blog': { isr: 3600 },
    // Blog post page generated on demand once until next deployment, cached on CDN
    '/blog/**': { isr: true },
    // Admin dashboard renders only on client-side
    '/admin/**': { ssr: false },
    // Add cors headers on API routes
    '/api/**': { cors: true },
    // Redirects legacy urls
    '/old-page': { redirect: '/new-page' }
  }
})

```

### 設定できる種類

- SSR

サーバーサイドレンダリングで、冒頭説明したUniversal Renderingに該当します。

```JavaScript
'/products': { ssr: true  }
```
動的に生成され、バックグラウンドで再検証されます。キャッシュされたページが更新されるまで一時的に利用されます。

- prerender

```JavaScript
'/admin/**': { prerender: true }
```
prerenderをするとページを事前レンダリングします。sitemap.xmlを生成する際にも利用できます。

- ISR

```JavaScript
 '/blog/**': { isr: true },
```

ISRは、ビルド時に生成される静的ページの一部を動的に更新できます。
ISRは対応可能ですが、これをサポートするプラットフォーム (現在はNetlifyまたはVercel)しかないため、限られているようです。


- 注意点

詳しく見ていると、nuxt generate時には、ハイブリッドレンダリングができないようです。
また、ハイブリッドレンダリング自体もNetlify と Vercel のみ対応しているようです。
ハイブリッドレンダリングをする場合は、nuxt buildで生成できるようにシステムを構成する必要があります。

```
Note that Hybrid Rendering is not available when using nuxt generate.
```


- その他の設定

corsの設定

```JavaScript
'/api/**': { cors: true }
```

リダイレクトの設定

```JavaScript
'/old-page': { redirect: '/new-page' }
```


- ESR

エッジサイドレンダリング (ESR) は、Nuxt3に導入された強力な機能で、コンテンツ配信ネットワーク (CDN) のエッジサーバーを介して、ユーザーに近い場所で Nuxt3アプリケーションをレンダリングできます。
ESRを活用することで、パフォーマンスが向上し、レイテンシが短縮され、ユーザーエクスペリエンスが向上します。
ESRの場合は、Cloudflare、Vercel、Netlifyで利用できます。

### まとめ

もしISRやハイブリッドレンダリングなどを利用したい場合は、NetlifyかVercelにデプロイし、nuxt buildでビルドしましょう。


参考
https://nuxt.com/docs/guide/concepts/rendering