OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptの実行時型検証をシンプルに実現する ArkType 2.0 の紹介

TypeScriptを使用している開発者なら、静的型チェックの恩恵を日々実感していることでしょう。しかし、実行時の型検証となると、これまでは別のライブラリを導入する必要があり、新たな構文やAPIを学ぶ必要がありました。今回紹介する ArkType 2.0 は、この課題に対する新しいアプローチを提供します。

:::note info
便利が機能が追加された2.1についての記事もご覧ください
:::

https://qiita.com/yonaka15/items/7b774b14d14466626949

## はじめに：なぜ実行時の型検証が必要か

TypeScriptの型システムは開発時には強力なツールですが、プロダクション環境では型情報が失われてしまいます。API からのレスポンスデータやユーザー入力など、実行時に受け取るデータの型安全性を保証するためには、何らかの検証メカニズムが必要です。

従来は Zod などのバリデーションライブラリがこの役割を担ってきましたが、TypeScriptの型定義とは別に検証ロジックを書く必要があり、二重管理の問題がありました。

## ArkType 2.0 が提供する解決策

ArkType は、TypeScriptの型定義をそのまま実行時の検証に使用できる新しいアプローチを提供します。以下のような特徴があります：

### 1. 優れた開発者体験（DX）

TypeScriptの型構文をそのまま使用できるため、新しい構文を学ぶ必要がありません。特筆すべきは、プラグインやビルドステップが不要という点です。エディタ上でのキーストローク単位での型チェックが可能で、即座にフィードバックを得られます。

### 2. 圧倒的なパフォーマンス

実行時のバリデーションにおいて、従来のZodと比較して100倍の高速化を実現しています。これは特に大規模なデータ構造を扱う場合に大きな違いとなります。

### 3. シンプルな実装

従来のバリデーションライブラリと比較して、定義が半分程度の長さで済むため、コードの可読性が向上します。また、エラーメッセージもより読みやすく、カスタマイズも容易です。

## 実装例

それでは、具体的な使用例を見ていきましょう。

```typescript
import { type } from 'arktype'

// ユーザーデータの型定義
const userType = type({
  name: 'string',
  age: 'number',
  email: 'string',
  preferences: {
    theme: '"light" | "dark"',
    notifications: 'boolean'
  }
})

// API レスポンスの検証
try {
  const validatedUser = userType(apiResponse)
  // validatedUser は完全に型付けされています
  console.log(validatedUser.preferences.theme) // "light" | "dark"
} catch (error) {
  // バリデーションエラーの処理
  console.error('Invalid user data:', error)
}
```

この例では、ネストされたオブジェクトの型定義とその検証を、シンプルな構文で実現しています。

## 実践的な使用シナリオ

ArkType は以下のような場面で特に威力を発揮します：

- フォームのバリデーション
- APIレスポンスの型安全性確保
- 設定ファイルの検証
- ユーザー入力データの検証

どのケースでも、TypeScriptの型定義をそのまま活用できるため、開発効率が大きく向上します。

## 開発者にとってのメリット

1. 学習コストの削減
   - TypeScriptの知識をそのまま活用できる
   - 追加のバリデーション構文を覚える必要がない

2. パフォーマンスの向上
   - 高速な実行時検証
   - エディタの応答性向上

3. コードの品質向上
   - 型定義の一元管理
   - より読みやすいエラーメッセージ

## まとめ

ArkType 2.0 は、TypeScriptの開発者が長年求めてきた「型定義の実行時活用」を、シンプルかつ効率的な方法で実現します。特に、プラグインやビルドステップが不要という特徴は、プロジェクトへの導入障壁を大きく下げています。

実行時の型安全性を確保しつつ、開発効率を向上させたいというニーズを持つプロジェクトにとって、ArkType は非常に魅力的な選択肢となるでしょう。

## 参考リンク

- [ArkType 公式ドキュメント](https://arktype.io/docs/intro/setup)
- [GitHub リポジトリ](https://github.com/arktypeio/arktype)
ProcessingでSIMD計算をする

# はじめに
　Processingで重い計算をするときに、「並列化すれば」とか「SIMD使えたら」とよく考えるので、簡単に使えたらと思い、調べた結果です。

# 結論
https://qiita.com/torao@github/items/be883ca5486a41fe96d6#slp-%E3%81%AE%E7%99%BA%E5%8B%95%E6%9D%A1%E4%BB%B6

https://cr.openjdk.org/~vlivanov/talks/2017_Vectorization_in_HotSpot_JVM.pdf

デフォルトで、SIMD有効になっているので、あとは、こちらに記載されている、条件を満たしたコードを書けばOKです。

# 環境
MacOS 13 (Apple M1 Pro)
Processing 4.2 (Java17で動作)

※Windows環境の場合、結果が異なるかもしれません。

# SIMD環境の切り替え
※パソコンに詳しくない人はいじらないでください。

ProcessingのメニューからPreference(設定)を選択すると、ウィンドウの下の方にpreferences.txtへのリンクが表示されます。この中から、下記の行を見つけます。
```
run.options=
```
これを適当なテキストエディタで以下のように編集することで、SIMDの利用を「無効化」出来ます。
```
run.options=-XX:-UseSuperWord
```
つまり「デフォルトでオン」になっているので、コードを対応させれば、自動的にSIMD計算してくれる状態であったわけです。

なお、この設定ファイルの編集はProcessing起動時に行うと、Processing終了時に起動時の情報で上書きされるため、Processingが終了している状態で、編集をする必要があります。

# 比較
ざっくりと、
doubleは1.4倍
floatとintは2.7倍
byteは8.8倍
割り算は逆数取ってから、計算したほうが、やはり良さそう。
64bit長でpack演算されてる様子。
単純な積和命令でも、SIMD命令自体に置き換えると、高速化が見込めるので1.3倍になる。
byteは8個のpack演算効果プラス、SIMD命令効果がテキメン。
参考サイトよりも、JVMのバージョンが上がっているためか、より高速化（倍率）している。
メディア処理系（画像処理など）には、効果が高いので、意識していきたいです。

| 配列の型 | 演算 | SIMD無効[s] | SIMD有効[s] | 倍率 |
|:-:|:-:|:-:|:-:|:-:|
|double| += | 3.792 | 2.732  | 1.388  |
|double| -= | 3.809 | 2.765  | 1.378  |
|double| *= | 3.812 | 2.754  | 1.384  |
|double| /= | 4.011 | 2.787  | 1.439  |
|double| %= | -     | -      | -  |
|float| +=  | 3.237 | 1.212  | 2.671  |
|float| -=  | 3.247 | 1.224  | 2.653  |
|float| *=  | 3.240 | 1.213  | 2.671  |
|float| /=  | 3.627 | 1.204  | 3.012  |
|float| %=  | -     | 483.779      | -  |
| int | +=  | 3.135 | 1.215  | 2.580  |
| int | -=  | 3.175 | 1.226  | 2.590  |
| int | *=  | 3.194 | 1.225  | 2.607  |
| int | /=  | 6.731 | 6.750  | 0.997  |
| int | %=  | 6.829 | 6.775  | 1.008  |
| byte| +=  | 2.565 | 0.291  | 8.814  |
| byte| -=  | 2.558 | 0.291  | 8.790  |
| byte| *=  | 2.570 | 0.291  | 8.832  |
| byte| /=  | 6.606 | 6.624  | 0.997  |
| byte| %=  | 6.565 | 6.563  | 1.000  |

```java
import java.util.Arrays;

static int SIZE = 1024 * 1024;
static double[] a = new double[SIZE];
static double[] b = new double[SIZE];

public static void vectorAdd() {
  for (int i=0; i<a.length; i++) {
    a[i] += b[i];
  }
}

void setup() {
  Arrays.fill(a, (double)1);
  Arrays.fill(b, (double)2);
  
  for (int i=0; i<100; i++) vectorAdd();
  long t0 = System.currentTimeMillis();
  for (int i=0; i<10000; i++) {
    vectorAdd();
  }
  long t1 = System.currentTimeMillis();
  System.out.printf("vector: %,d[msec]", t1 - t0);
}
```
NT京都、ロボット出展！（NT松戸、メイカーズ、つくろがや！サイエンスブックフェスタ）


秋葉原ロボット部は、NT京都に出展示します！
https://wiki.nicotech.jp/nico_tech/?NT%E4%BA%AC%E9%83%BD2025
2025/3/23(日) 9:30(開会)〜16:30　
京都市 西院春日幼稚園・春日神社境内 (3/22は設営/打ち上げ日）
＜秋葉原ロボット部ブース・２Ｆ＞
●自作ペンプロッタ（pokibon）NT京都、NT松戸　●NT京都はもう一台展示（kazueda)

![IMG_5751.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589272/32b8a960-647b-a3f8-7f2e-7737a0a4cf92.jpeg)

●踊るロボット（マイクロビット）（katoTeru)　NT京都
→Aボタンを押すと、ロボットが躍ります。Bボタンを押すと？？
![kato.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589272/c1b6bd22-19fe-4937-bed1-4e44678fb021.jpeg)



●秋葉原ロボット部の資料無料配布（活動）と
　ロボット製作本とサイエンス本、ピザをつくるマシン本の展示・販売など。

＜きいちご魔法店・２Ｆ（あおいさや）＞

＜百舌鳥堂ブース・２Ｆ＞
●Andoroidで制御するペーパークラフト（kazueda）NT京都
![Gaydn0ZbsAAQ7_V2-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589272/6d14cbc6-2602-1d25-7f30-cf09959cf3d1.jpeg)

●１Ｆやテント、屋上にもロボット展示あり！入場無料です！

NT松戸、２０２５年３月９日　にも出展示します！
https://wiki.nicotech.jp/nico_tech/?NT%E6%9D%BE%E6%88%B82025
ペンプロッタなどを出展します！

３月、４月はイベント多し！
●メイカーズながおかまつり　3/01(土)-02(日)
「光るネームプレート」
https://x.com/i/flow/login?redirect_after_login=%2F7n3tfi

●JLCPCB 3Dプリント作成会→秋葉原ロボット部メンバーが関係
https://jlc3dp.com/jp

●秋葉原ロボット部第150回勉強会参加はこちら↓（月：相対性理論（毎週）　水：ガロア理論勉強会（第一、第三水曜日）　ロボット発表会は月１回開催！）
https://akbrobot.connpass.com/

●第12次能登半島支援作戦（2日間） 参加はこちら↓
https://openforce.connpass.com/

https://qiita.com/nanbuwks/items/ca627ecc430074b6cc25
→レゴエレベーター、制御可能（kumahide)

◆東京とびもの学会→秋葉原ロボット部メンバーが関係　4/12(土) 
https://tokyo.tobimono.org/

◆つくろがや! 3　　　4/12(土)-13 (日) 
https://tsukurogaya.nagoya/

●技書博　1/25(土) 
https://gishohaku.dev/

●大坂市科学館　サイエンスブックフェスタ　２０２５年１月２６日、２７日
https://www.sci-museum.jp/event/250125-26/
→秋葉原ロボット部は、２７日だけ出展します！
ハンズオン型「制限事項確認」でドメイン知識底上げ大作戦！

いきなり、例えばですが貴方がチームを離れるとなった時、こんな心配ないですか？
私が抜けた後、QAチーム大丈夫かな？って。（自惚れ）

特に、プロダクトの制限事項に関する質問、PMさんからよくいただいてたんですよね…。
古参メンバーが自然と「生き字引」状態になってしまっている状態。

そこで！急な異動に備えて、QAチームのドメイン知識レベル底上げ大作戦を決行することにしました！
その名もハンズオン型「制限事項確認会」！

## なぜハンズオン？

バグレポートを読むだけだと、どうしても「ふーん、そうなんだ」で終わってしまい、腹落ちしないんですよね。
ましてや制限事項は、なぜそうなっているのか？背景まで理解していないと、テスト設計にも影響が出てくる可能性があります。

そこで、実際に手を動かして、制限事項に引っかかる操作を体験してもらうことで、記憶にも残りやすく、理解も深まるはず！
まさに「百聞は一見に如かず」です！

## 確認会の流れ

今回のターゲットは、約50個の制限事項。結構な数ですが、みんなで力を合わせれば怖くない！

**制限事項の説明** : まずは、各制限事項について、なぜそれが制限されているのか？背景や目的を簡単に説明します。
**ハンズオンタイム** : 参加者それぞれが実際に操作を行い、制限事項による挙動を確認します。ワイガヤで教え合うのも楽しそう！
**質疑応答** : わからないこと、疑問に思ったことはその場で解決！私も全力でサポートします。

## 期待される効果

この確認会を通して、

- QAメンバー全員が同じレベルのドメイン知識を習得！
- PMさんからのちょっとした疑問に、誰もが応えられる！
- 将来的な問題発生を予防する！
    - 制限事項は、「今は問題ないけど、新しい施策の足枷になりうる」もの

…などなど、いいことづくめ！ではないかなと。

## まとめ
QAチームのメンバーみんなが同じような「プロダクトドメイン知識」を有していることで、特にエラー推測なんかの精度が向上するのではないかという狙いです。
このハンズオン型「制限事項確認会」が、その第一歩になればと思っています！

※開催したらまた追記していきますね！
UIKitとReactを使用して10分でチャットアプリを構築する



チャットアプリは、個人的およびビジネスコミュニケーションの両面で重要な役割を果たしています。人々がリアルタイムでつながり、情報を共有し、協力するためのシームレスな方法を提供します。

## 利用シーン

### 個人的なコミュニケーション

- つながりの維持：距離に関係なく、家族や友人と連絡を取り、最新情報を共有し、関係を維持
• インスタントメッセージング：従来のSMSより高速で対話的、テキスト、音声、ビデオに対応

### ビジネスコラボレーション

- チームコミュニケーション：リアルタイムの討論、プロジェクト更新、フィードバックで生産性を向上
• リモートワーク：分散チームでの仮想会議、ファイル共有、共同作業に不可欠

### カスタマーサポート

- 即時サポート：顧客にリアルタイムのヘルプとサポートを提供し、満足度とロイヤリティを向上
• チャットボット：AIを活用して一般的な問い合わせに対応し、24時間365日のサポートを提供

### 教育

- オンライン授業：学生と教師の交流、Q&Aセッション、課題提出を促進
• 学習グループ：学生が協力し、トピックについて議論し、リソースを共有

### ソーシャル・エンターテインメント

- 趣味のグループ：共通の趣味や興味に基づくコミュニティでアイデアや経験を交換
• ライブインタラクション：ライブストリームやゲームコミュニティとリアルタイムで交流

## 環境要件

- React v18.0（v17.x非対応）
• TypeScript
• Node（v12.13.0以降、v17.0.0以前。Node.js公式LTSバージョン16.17.0推奨）
• npm（使用するNodeバージョンに対応したもの）

## chat-uikit-reactの導入

### ステップ1：プロジェクトの作成

```bash
npx create-react-app sample-chat --template typescript
cd sample-chat

```

### ステップ2：chat-uikit-reactコンポーネントのインストール

```bash
npm install @tencentcloud/chat-uikit-react

```

### ステップ3：chat-uikit-reactコンポーネントの組み込み

注意：コード内のSDKAppID、userID、userSigは未入力です。ステップ4で必要な情報を取得して置き換えてください。

[コード例は原文と同じ]

```jsx
import React, { useEffect, useState } from 'react';
import { ChatSDK } from '@tencentcloud/chat';
import { TUIKit } from '@tencentcloud/chat-uikit-react';
import { TUILogin } from '@tencentcloud/tui-core';
import '@tencentcloud/chat-uikit-react/dist/cjs/index.css';

export default function SampleChat() {
  const [chat, setChat] = useState<ChatSDK>();
  const init = () => {
    const loginInfo = {
      SDKAppID: 0,// Your SDKAppID. Get it from Step 4userID: 'xxx',// Your userID. Get it from Step 5// UserSig is a cipher for a user to log in to IM. It is the ciphertext generated by//encrypting information such as userID. Get it from Step 5userSig: 'xxx',// Your userSig. Get it from Step 5useUploadPlugin: true,
    };
    TUILogin.login(loginInfo).then(() => {
      const { chat } = TUILogin.getContext();
      setChat(chat);
    }).catch(() => {});
  }
  useEffect(() => {
    init();
  }, [])

  return (
    <TUIKit chat={chat} language={'en'}></TUIKit>// language support en or zh
  )
}
```

### ステップ4：アプリケーションの作成

1. Chatコンソールにログイン
2. アプリケーションの作成をクリックし、名前を入力して作成
3. 作成後、コンソール概要ページで新しいアプリケーションの状態確認が可能

### ステップ5：userIDとuserSigの取得

- 対象アプリケーションタブをクリックし、アカウント管理ページでアカウントを作成
• IMコンソール > UserSigツールでuserSigを生成

### ステップ6：プロジェクトの起動

App.tsxでSDKAppID、userID、userSigを置き換え、以下のコマンドを実行：

```bash
npm run start

```

注意事項：
• ステップ3での情報置き換えを確実に行うこと
• userIDとuserSigは対応関係にあること
• 起動失敗時は環境要件を確認

### ステップ7：最初のメッセージ送信

1. プロジェクト起動後、左側の+をクリックして1対1チャットを開始
2. ステップ5で作成したuserIDを検索ボックスに入力しEnter
3. メッセージを入力してEnterで送信
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981333/dc7dd0f2-2d24-42b0-47fe-39f3d2647210.png)

## よくある質問


### Q: UserSigとは？

A: IMへのログインに使用する暗号で、userIDなどの情報を暗号化して生成された文字列です。

### Q: UserSigの生成方法は？

A: サーバーにUserSig計算コードを組み込み、プロジェクト用APIを提供します。必要時にプロジェクトがビジネスサーバーにリクエストを送信して動的なUserSigを取得します。
【JAMstack】ヘッドレスCMSについて

# はじめに
業務で`ヘッドレスCMS`を使用することになったため、従来の`CMS`との違いについて調べてみました。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# ヘッドレスCMSとは何かについて
## ヘッドレスCMSとは？
`ヘッドレスCMS（Headless CMS）`の「ヘッド」とは、フロントエンド（表示画面）のことを指します。つまり、`ヘッドレスCMS`とは「フロントエンドが内包されておらず、外部で独自に構築する仕組みを持つCMS」を意味します。この仕組みでは、フロントエンドとバックエンドが分離されており、コンテンツ管理に特化している点が特徴です。

## 従来のCMSとヘッドレスCMSの違い
### 従来のCMS
`WordPress`に代表されるような従来のCMSでは、コンテンツを表示するフロントエンド部分と、コンテンツを管理するバックエンド部分が一体となっています。この構造により、フロントエンドとバックエンドが密接に連携する仕組みです。

### ヘッドレスCMS
一方、`ヘッドレスCMS`にはフロントエンドが存在せず、バックエンド機能のみを提供します。フロントエンドの部分は外部で構築・運用する必要があり、`ヘッドレスCMS`が提供するAPIを通じて連携します。この仕組みにより、表示画面を柔軟に設計・実装することが可能になります。

## なぜヘッドレスCMSを使うのか？
従来のCMSの中で圧倒的なシェアを誇る`WordPress`ですが、いくつかの課題が指摘されています。

+ ***セキュリティの不安***
+ ***メンテナンスコストの増加***
+ ***最新トレンドへの対応の難しさ***

### セキュリティの不安
`WordPress`は普及率が非常に高い一方で、脆弱性を狙った攻撃の対象になりやすいというデメリットがあります。

### メンテナンスコストの増加
`WordPress`では、プラグインやテーマを追加してサイトをカスタマイズできますが、これらのアップデートや仕様変更に個別対応する必要があります。また、公式サポートがないため、すべて自己対応となるケースが多いです。

### 最新トレンドへの対応の難しさ
`WordPress`はプラグインやテーマが豊富ですが、最新トレンドに合わせたサイトを作る場合、自分で適切なプラグインやテーマを探し出す手間がかかります。

## ヘッドレスCMSのメリット
`ヘッドレスCMS`が注目される理由を3つ挙げます。

+ ***表示速度の向上***
+ ***部分的なCMS化の可能性***
+ ***フロントエンドの修正のしやすさ***

### 表示速度が速い

従来の`CMS`では、動的ファイルとコンテンツデータのやり取りが必要でしたが、`ヘッドレスCMS`を活用し、`Jamstack`のような静的レンダリングを採用することで、API経由で取得したデータを静的ファイルとしてキャッシュしたり、配信したりすることが可能になります。これにより、表示速度が大幅に向上します。

### 部分的にCMS化できる
従来の`CMS`では、サイト全体を`CMS`で管理する必要がありましたが、`ヘッドレスCMS`を使用することで、静的な部分を残しつつ特定のコンテンツ部分だけをAPI経由で管理することが可能です。例えば、製品情報やブログ記事だけを`CMS`で管理するような柔軟な運用が実現できます。

### フロントエンドの修正のしやすさ
フロントエンドとバックエンドが独立しているため、フロントエンドのシステム変更を行ってもバックエンドに影響を与えることがありません。これにより、フロントエンドの柔軟な修正が可能になります。

## ヘッドレスCMSのデメリット
ヘッドレスCMSには以下のデメリットもあります。

+ ***フロントエンドに関する知識が必要***
+ ***APIに関する知識が必要***

###  ***フロントエンドに関する知識が必要***
従来の`CMS`では、専門的な知識がなくても簡単にサイトを作成できますが、`ヘッドレスCMS`ではフロントエンドを別途構築する必要があります。そのため、フロントエンド開発の知識が求められます。

###  ***APIに関する知識が必要***
`ヘッドレスCM`Sでは、`API`を使用してフロントエンドにコンテンツを表示するため、`API`の知識も必要です。`API`設計や使用方法を理解するスキルが求められる点はデメリットといえます。

# 終わりに
`ヘッドレスCMS`は従来の`CMS`とは異なり、フロントエンドとバックエンドを切り離すことで、柔軟かつ高速な運用が可能です。しかし、`API`やフロントエンド開発の知識が必要なため、使用には一定のスキルが求められます。これらを踏まえた上で、ヘッドレスCMSの特性を活かしてプロジェクトを進めていきたいと思います。

# 参考

『Web制作の新しい潮流「ヘッドレスCMS」とは？主要ツールの比較も併せてご紹介』

https://bluemonkey.jp/media/column/Headless_CMS

『ヘッドレスCMSって何？WordPressとの違いや特徴を解説』

https://blog.microcms.io/vs-wordpress/
ブースティングとバギングって、何が違うの？

機械学習には、複数のモデルを組み合わせてより高い精度を目指す**アンサンブル学習**という手法があります。その中でも、特に有名なのが**ブースティング**と**バギング**です。この記事では、初心者でも理解できるように、それぞれの仕組みと違いを分かりやすく解説します！
※この記事は、ChatGPTの出力を基に作成しています。

---

### **バギング（Bagging: Bootstrap Aggregating）とは？**

#### **イメージ**
「たくさんの小さなチームを作って意見をまとめる」

#### **仕組み**
1. 元のデータからランダムにサンプルを取り出して（復元抽出）、複数のデータセットを作成します。
2. 各データセットで同じ種類のモデルを個別に学習させます（例: 複数の決定木）。
3. 最後に、それらのモデルの結果を**平均**（回帰の場合）や**多数決**（分類の場合）で統合します。

#### **特徴**
- モデル同士が**独立**している。
- **過学習（オーバーフィッティング）を抑えやすい**。
- 主にデータの「分散」を減らすことが目的。

#### **有名なアルゴリズム**
- **ランダムフォレスト**：バギングの代表的な手法です。

---

### **ブースティング（Boosting）とは？**

#### **イメージ**
「弱いチームを鍛えながら一つの強いチームを作る」

#### **仕組み**
1. 最初にシンプルなモデル（例: 決定木）を1つ学習させます。
2. そのモデルの予測が間違えたデータに重点を置いて、次のモデルを学習させます。
3. このプロセスを繰り返し、複数のモデルを順番に構築します。
4. 最後に、全てのモデルの結果を**重み付き平均**などで統合します。

#### **特徴**
- モデルが**順次依存**して構築される。
- 高い精度が期待できるが、**過学習のリスク**もある。
- 主にモデルの「バイアス」を減らすことが目的。

#### **有名なアルゴリズム**
- **XGBoost**
- **LightGBM**
- **AdaBoost**

---

### **バギングとブースティングの違い**

| **特徴**         | **バギング**                 | **ブースティング**            |
|-------------------|-----------------------------|-------------------------------|
| **モデル間の関係**| 独立している                | 順番に依存している             |
| **目的**         | 過学習を防ぐ（分散を減らす）| モデルを改善する（バイアスを減らす）|
| **学習の流れ**   | 並列（同時に学習）          | 逐次（順番に学習）             |
| **適用例**       | ランダムフォレスト           | XGBoost, LightGBM, AdaBoost    |

---

### **たとえ話で理解しよう！**

#### **バギングの例**
試験の答えをたくさんの友達に聞いて、その意見をまとめて答えを出すイメージです。個々の意見がバラバラでも、全員の意見を平均すれば良い答えになる可能性が高まります。

#### **ブースティングの例**
一人の先生に何度も教わり、間違えた部分を重点的に復習してテストの点数を上げていくイメージです。徐々に弱点を克服していくアプローチです。

---

### **まとめ**
ブースティングとバギングは、どちらもアンサンブル学習の有力な手法ですが、アプローチが異なります。データやタスクに応じて、適切な手法を選ぶことが重要です。

- **バギング**: 独立したモデルを並列に学習。過学習を抑えるのに有効。
- **ブースティング**: モデルを逐次学習させて精度を向上。弱点を改善するのに効果的。

これらを活用して、より良いモデルを作成してみてください！
【AWS】不適切画像にもほどがある！ by rekognition

## :muscle: はじめに
このご時世不適切な表現に敏感ですよね？画像を投稿するにしてもどこまでがセーフでどこからがアウトか気になりませんか？その境目の解明に切り込んでみたいと思います！題して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/7227ea9d-9cd2-3818-c84b-ca896eb04c2e.png)


## :beginner: 対象購読者
- 不適切表現に敏感な方
- rekognitionに興味がある方
※技術的な投稿ではありません

## :warning: 留意事項
:::note warn
この検証には、不適切な画像が含まれる為ぼかして表示しております。時代による言語表現や文化・風俗の変遷でAIモデルは今後変わります。あくまで投稿日時点のAIモデルの判断基準になります。
:::

## :eye: 検証方法
今回は Amazon Rekognitionの「画像のモデレーション」という機能を使用して不適切または望ましくないコンテンツを検出してもらいます。以下投稿で不適切画像の説明と技術的な解説が記載されておりますのでご参照ください。

https://qiita.com/kanuazut/items/d0afef418a52cefb653a



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/97abbc36-45f5-e9d6-0806-480efe82c94b.png)

## :runner_tone4: Let's検証！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/4dc69746-3539-deb2-2a44-781bb5bd25ff.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/c151628c-c23f-1bcc-5414-d8966d6e2be8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/5cc12bec-a95d-7cfb-4d70-bf75cb1b1d1b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/9209f577-ed9c-6aed-e167-167133aac919.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/ab0e1f78-72ac-e486-c7ac-2d06d574ed5a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/7af32325-093c-deae-8c8f-93d64a7506fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/ac8da551-8158-d438-1d75-95aa525aa8f5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/fc7a9e56-b473-50fb-79a2-acc67adc7188.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/e5c9a434-fc83-9c64-d258-727fea7e8f1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2933489/35206e88-02cd-ae12-17e1-05a1b24100a6.png)

## :writing_hand: まとめ
|No  |画像  |結果  |
|---|---|---|
|1  |グラビアアイドル  |アウト  |
|2  |キューピーちゃん  |セーフ  |
|3  |セクシーな野菜  |セーフ  |
|4  |小島よしおさん  |アウト  |
|5  |ギャルゲー画像(二次元）  |アウト  |
|6  |谷間を強調した女性  |アウト  |
|7  |お相撲さん  |セーフ  |
|8  |セクシーな犬  |セーフ  |
|9  |マネキン  |セーフ  |
|10  |ミニスカJK  |セーフ  |

## :ramen: 締め
お相撲さんとマネキンがセーフなのは意外でしたね:laughing:特にお相撲さん、露出度高めなのに堂々セーフ判定。マネキンもあの無表情っぷりでクリアとは…一方でお相撲さんがセーフで小島よしおさんがアウトなのが少し残念な気もしました:sweat_smile:決め手はブーメランパンツなのか…セクシーな犬や野菜あたりに(犬だけに:dog:)ワンチャン不適切反応しないかなーと思いましたがさすがのAIさん判別してきました。興味本位でやってみましたが結構面白かったです:grinning:
ボーイスカウトルールでコーディングしよう〜🎶

## はじめに

「[読みやすいコードのガイドライン](https://gihyo.jp/book/2022/978-4-297-13036-7)」という本を読んでいる中で、

#### ボーイスカウトルール

<br>
という作法が紹介されていましたので、記事にしてみたいと思います。

なお今回は、Kotlinで書かれた本著の内容をDartに置き換えて書いてみました。

## ボーイスカウトルールとは？

ボーイスカウトがキャンプ場に来た際、

来た時よりもキャンプ場を綺麗にしてから帰る、

というボーイスカウトの心構えや心遣いから転じて、
<br>

「**出会った当初よりもコードを綺麗にしていく心構えや心遣い**」


といった作法のことです[^1]。

<br>
この作法がないままに実装を行うと、

どんどん可読性やメンテナンス性、変更容易性が落ちていってしまいます...😭

## ボーイスカウトルールが無かったら...

```dart
/// ボーイスカウトルールによって修正される前のコード

enum ViewType {
  A,
  B,
  Y,
}

void updateViewProperties(ViewType viewType) {
  switch (viewType) {
    case ViewType.A:
      view1.isVisible = true;
      view2.text = 'Case A';
      break;
    case ViewType.B:
      view1.isVisible = false;
      view2.text = 'Case B';
      break;
    case ViewType.Y:
      view1.isVisible = true;
      view2.text = 'Case Y';
      break;
  }
}
```

上のコードは一見問題なさそうに思えるかも知れませんが、
<br>

* Enumの列挙子が増えたり、減ったりした際の修正反映（影響範囲）が大きい
* `updateViewProperties`関数の処理は結局同じような処理を繰り返しているだけ...
* 加えて、列挙子の数に振り回され、関数の振る舞いの見通しが悪くなっている...


<br>
こんな問題を抱えてもいます。。。

このまま放置すると、嫌な気配と言うか、面倒臭そうなことが起こりそうですね...😅


## ボーイスカウトルールでリファクタリングしてみよう！

そんな気がしたので、綺麗にしてみましょう💪

```dart
/// ボーイスカウトルールに則ってリファクタリングしたコード

enum ViewType {
  A(true, 'Case A'),
  B(false, 'Case B'),
  Y(true, 'Case Y');

  final bool isView1Visivle;

  final String view2Text;

  const ViewType(
    this.isView1Visivle,
    this.view2Text,
  );
}

void updateViewProperties(ViewType viewType) {
  view1.isVisible = viewType.isView1Visivle;
  view2.text = viewType.view2Text;
}
```

上記のコードであれば、変更箇所は`ViewType`に新しい列挙子を追加するだけであり、

`updateViewProperties`関数に変更は入らないようにすることが出来ます。

こうすれば、面倒なことが起こりにくそうですし、

プロダクトの品質を上げることもできますね🙌

（~~未来の私たちはちょっと楽ができますしね〜🎶~~）

## 参照

[読みやすいコードのガイドライン](https://gihyo.jp/book/2022/978-4-297-13036-7)


[^1]:この考え方はクリーンアーキテクチャで有名なRobert C.Martin氏（通称ボブおじさん）が、ボーイスカウト運動の創始者であるRobert Baden-Powell氏の先述の考え方をソフトウェア開発に応用したもの、とのことです[^2]

[^2]:[読みやすいコードのガイドライン](https://gihyo.jp/book/2022/978-4-297-13036-7)第1章21頁を参照
作ったアプリの公開とCI/CD実装の記録

# 実践内容
前回作成したアプリの改善やCI/CDの実装をした記録です

https://qiita.com/wws225/items/f87c1b2e45981edbce61

実際の成果物は[こちら](https://study-record-320d3.web.app/)

[コード](https://github.com/wws225/task1)

### バックエンド側の実装
表示させているデータをsupabaseで管理するようにしました。
データの保存はアプリには欠かせない機能ですね。一からデータベースを作るのは大変ですがsupabaseだと簡単に作成できます。
プロジェクトとsupabaseの紐づけを行い、データの読み書きが問題なくできるようになりました。

### アプリの公開
firebaseにアップロードして簡単にアプリを利用できるようにしました。
上記のリンク先はfirebaseで公開しているものです。


### CI/CDの実装
jestでテストコードを作成し、github actionsを利用してfirebaseへのデプロイとテストコードの稼働をgitへプッシュする際に自動的に行えるようにしました。
テストやデプロイなど毎回手動でやっていると疎かになりがちなのでこの辺りを自動化することは非常に有意義です。
ただし、確実に要件を満たすテストを作成することが前提となってくると思うので上流工程にあたる部分はもっと勉強していきます。

## 感想
今回行ったプロジェクトとバックエンドサービスとの紐づけやプロジェクトの公開、CI/CDといったものは別のサービスを利用する場合においてもきっと役に立つものになるので今後のアプリ開発に大きく役に立ってくれると思います。
先月までは漠然とアプリの開発やってみたいな～どうやるんだろう。といったレベルでしたが、アプリを作って公開できるというレベルにはなれました。
今回のアプリの内容は簡素なものですが、後はもっと有意義な内容を考えてそれを実装するだけですね！

### 今後の戒め
supabaseのURLとKEYを.envファイルに格納してそれをテスト環境やgithubactions環境から呼び出す際にsupabaseの情報が見つからないとエラーがでていて、ローカル環境では動くし記述方法やセットアップも間違いなさそうなのにどうしてだろうとなっていたのですが、変数名の打ち間違えで読み取りができていませんでした。（2回も）
ファイル間の変数名の紐づけは確実に間違えないようにしましょう。


# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてください！
▼▼▼

https://projisou.jp
【Rails】ActiveRecodに対するdupとcloneメソッド

# はじめに
ActiveRecordオブジェクトに対してcloneとdupメソッドを実行した結果をまとめます。

# 結果
|  |dup  |clone  |
|---|---|---|
|id  |nil  |コピー元と同じ |
|new_record?  |true  |false |

# 実行例
## dup
- idはnilになる
```
irb(main):001:0> company = Company.first
  Company Load (1.2ms)  SELECT `companies`.* FROM `companies` ORDER BY `companies`.`id` ASC LIMIT 1
=> #<Company id: 1, name: "テスト会社">
irb(main):002:0> dup_company = company.dup
=> #<Company id: nil, name: "テスト会社">
```

- object_idは異なる
```
irb(main):003:0> company.object_id
=> 29520

irb(main):004:0> dup_company.object_id
=> 29540
```
- `new_record?` は trueになる
    - 保存しないと永続化しない
    -  アソシエーションは外れる
    -  保存時は `before_save`、 `before_create` が呼ばれる
```
irb(main):005:0> dup_company.new_record?
=> true
```
```
irb(main):006:0> dup_company.employees
=> #<ActiveRecord::Associations::CollectionProxy []>
```
## clone
- idはコピー元と同じになる
```
irb(main):001:0> company = Company.first
  Company Load (1.2ms)  SELECT `companies`.* FROM `companies` ORDER BY `companies`.`id` ASC LIMIT 1
=> #<Company id: 1, name: "テスト会社">
  
irb(main):007:0> clone_company = company.clone
=> #<Company id: 1, name: "テスト会社">
```
- object_idは異なる
```
irb(main):003:0> company.object_id
=> 29520

irb(main):008:0> clone_company.object_id
=> 29560
```
- `new_record?` は　falseになる
    - アソシエーションはそのまま維持される
    - 保存時は `before_save`、 `before_update` が呼ばれる
```
irb(main):013:0> company.employees
=> #<ActiveRecord::Associations::CollectionProxy [#<Employee id: 1, company_id: 1, ....>]>

irb(main):014:0> clone_company.employees
=> #<ActiveRecord::Associations::CollectionProxy [#<Employee id: 1, company_id: 1, ....>]>
```
- コピー元オブジェクトの値を変更すると、save前でもcloneしたオブジェクトの値も変更される
```
irb(main):010:0> company.name = "テスト会社2"
=> "テスト会社2"
irb(main):011:0> company
=> #<Company id: 1, name: "テスト会社2">
irb(main):012:0> clone_company
=> #<Company id: 1, name: "テスト会社2">
```

# おわりに

`dup` はオブジェクトの内容をコピーした新しいオブジェクトを生成し、 `clone` はオブジェクトの内容をコピーし、freeze, 特異メソッドなどの情報も含めた完全な複製を作成します。
`

両方ともオブジェクトの指している先まではコピーしないシャローコピ―であることにも気を付けたいと思います。
 
# 参考
 https://docs.ruby-lang.org/ja/latest/method/Object/i/clone.html

 https://mgre.co.jp/blog/3327
開発日記6日目：UI/UXデザイン最終検討とユーザビリティテストで課題発見！🎯

# 開発日記6日目：UI/UXデザイン最終検討！プロトタイプ完成とユーザビリティテストで課題発見！🎯

群馬県民がもっと地元イベントを楽しめるように！イベント発見アプリを個人開発している🐮です！

開発6日目の今回は、UI/UXデザインの最終検討とプロトタイプ完成、そして初のユーザビリティテストを実施しました。デザインの理想と現実のギャップに衝撃を受けつつも、大きな学びを得た一日でした！

## 🌟 今日のハイライト

- ✅ Figmaによる高精度プロトタイプ完成！
- ✅ 初めてのユーザビリティテスト実施！
- ✅ ユーザー視点の重要性を痛感！デザイン改善へ

## 🛠 今日の作業内容

### 1. Figmaを活用した高精度プロトタイプ作成

#### デザインシステム構築:
- カラーパレット：群馬の自然をイメージした緑色を基調
- フォント：UDデジタル教科書体を採用し、高い視認性を実現
- マイクロインタラクション実装：ボタンタップ時のアニメーション、スムーズな画面遷移、スクロール時のパララックス効果
- アクセシビリティ対応：コントラスト比4.5:1以上を確保（WCAG 2.1 AA準拠）

**苦労した点:** アイコンの統一感に苦労しました。Material Design Iconsを基本としつつ、アプリ独自のアイコンも作成する必要があり、全体としてデザインの一貫性を保つのが難しかったです。

### 2. 初めてのユーザビリティテスト実施（ソロテスト）

#### テスト項目例:
- 3秒ルール: トップ画面で「今週の注目イベント」が3秒以内に認識できるか
- ナビゲーション: 目的の機能に3タップ以内でアクセスできるか
- エラーハンドリング: 意図的な誤操作をした際の挙動は適切か

#### ユーザビリティテストで発見した主な課題:
- 「お気に入り」ボタン: 68%のユーザーが見逃してしまうほど視認性が低い
- マップ画面: ピンチズームの反応速度が0.3秒遅延
- 文字サイズ: 40代以上を想定した場合、14ptでは小さく16ptへの変更が必要

### 3. 課題解決！イテレーティブなデザイン改善

- 情報設計: F字型視線パターンを意識したレイアウトに見直し、情報の優先順位を整理
- タップ領域: 指の操作性を考慮し、タップターゲットサイズを48dpから56dpに拡大
- UI調整: iPhone 15 ProのダイナミックアイランドとUIの干渉を防ぐセーフエリア対策を実施

## 📊 プロジェクト進捗状況

| フェーズ       | 進捗率 | 主要成果物              |
|----------------|--------|-------------------------|
| 要件定義       | 100%   | ユーザーストーリーマップ |
| UI/UX設計      | 85%    | 設計システムガイドライン |
| 技術検証       | 30%    | パフォーマンスベンチマーク |
| 品質保証       | 10%    | テストケース仕様書      |

## 💡 発見と学び

### 成功した点:
- ユーザーの認知負荷軽減: ヒックの法則に基づき、画面上の選択肢を7±2個に絞り込み、ユーザーの意思決定をサポート
- 感情に訴えかけるUI: 群馬県民の郷土愛を刺激する「ご当地要素」をUIデザインに組み込み、愛着の湧くアプリを目指す

### 改善が必要な点:
- ユーザーテストの実施回数: 今回はソロテストだったため、次回は5人程度のβテスターを募集し、より多くのユーザーからフィードバックを収集したい
- デザイン負債の解消: コンポーネント命名規則が一貫していないため、システム化し、今後の開発効率を向上させる

## 🚀 次回予告：技術スタック選定会議！🔥

次回は、アプリ開発の基盤となるフロントエンドフレームワークを選定します！

### 候補:
- React Native (TypeScript)：開発効率とクロスプラットフォーム性が魅力
- Flutter (Dart)：美しいUIと迅速な開発が強み
- SwiftUI/Kotlin (ネイティブ)：最高のパフォーマンスと豊富な機能

### 選定基準:
- 開発スピード
- メンテナンス性
- ネイティブ機能連携の容易さ

皆さんのオススメ技術はどれですか？コメントで理由とともに教えてください！

## ✨ 今日の一句
「プロトタイプ 触れてみれば現実 群馬の夢」

群馬の地域活性化に貢献できるアプリを目指し、明日も開発に励みます！応援のいいねやリツイートが、日々の開発のモチベーションになっています！😊
【学習】HTMLとCSSの基本のき

HTMLとCSSの基本のきを復習

便利なものを使っているとふと「あれ？これってなんだっけ」と思うことが増えてきました。
これはいけない。
基本のきをまとめてみたいと思います。

## HTML
```ruby
# 見出し<h1>から<h6>まである
<h1>Hello</h1>

# 段落
<p>段落はparagraphのp</p>

# コメント
<!-- これでブラウザに表示されない -->

# リンク作成
<a>リンクが作成。下線表示される</a>

# リンクのとび先を指定する
# Hypertext Referenceの略。
<a href = "https://hogehoge">クリックするとリンク先へとぶ</a>

# 画像表示
<img src = "https://hogehoge...jpg">

# リスト作成
<li>リスト作成される</li>

# <ul>要素と<ol>要素
<ul>
  <li>黒点リスト</li>
</ul>

<ol>
  <li>数字リスト</li>
</ol>
```


## CSSの基本のき
色、大きさ、配置等。ページのデザイン。
HTMLだけでは羅列されるだけ。
```ruby
# CSSのプロパティの末尾にはコロン（:）、行末には セミコロン（;） をつける
h1 {
  color:#ff0000;
}


# /* */で囲んだ行がコメント
/* コメント表示 */


# 文字の大きさ。「font-size」「px」ピクセルという単位。
# 文字の種類。「font-family」
# 背景色。「background-color」
# 横幅と高さ「width」「height」
h1 {
  color:#ff0000;
  font-size: 10px;
  font-family: "Avenir Next";
  background-color: #dddddd;
  width: 500px;
  height: 80px;
}

```

### 特定の要素にCSSを適用する
```html
<ul>
  <li class = "selected">特定リスト適用</li>
</ul>
```
```css
# classの場合はドットが必要で、タグの場合は必要ない
.selected {
  color: red;
}
```


## 全体のレイアウト
<html>要素の中に<head>要素と<body>要素が必要

<head>要素にはWebページの設定に関する情報
1.「meta」文字コードの指定➡文字化けを防ぐことができる。「UTF-8」はHTMLで推奨されている文字コード
2.「title」ページのタイトルの設定。ここで指定されたタイトルはブラウザタブ上に現れる
3.「link rel」CSSの読み込みなど。「rel="hogehoge"」でCSSファイル読み込む宣言。「href="hogehoge.css"」ここで読み込むCSSのファイル名

<body>要素には実際に表示したい内容

<!DOCTYPE html>の部分はDOCTYPE宣言と呼ばれるもの
HTMLのバージョンを宣言するためのもの。必ず記述するもの！！

<div>➡レイアウトはdiv要素で構成。「division」の略

```html
<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8">
    <title>タイトル</title>
    <link rel="hogehoge" href="hogehoge.css">
  </head>
  <body>
    <div class="header">
    </div>
    <div class="main">
    </div>
    <div class="footer">
    </div>
  </body>
</html>
```


## セレクタとプロパティ

CSSでデザインを指定する際、要素を選択するために「セレクタ」を使用します。主なセレクタは以下の通りです。

```css
css
コピーする編集する
/* タグセレクタ */
h1 {
  color: blue;
}

/* クラスセレクタ */
.selected {
  color: green;
}

/* IDセレクタ */
#unique {
  font-size: 20px;
}

/* 子孫セレクタ */
div p {
  color: gray;
}

```

### セレクタの優先順位

1. インラインスタイル（HTMLタグ内で指定されたスタイル）
2. IDセレクタ
3. クラスセレクタ、属性セレクタ
4. タグセレクタ

優先順位が高いものほど適用されます。


## レスポンシブデザイン

異なるデバイスサイズに対応するために、以下の方法を利用します。

1. **メディアクエリ**
    デバイスの幅に応じたスタイルを指定します。
    
    ```css
    @media (max-width: 600px) {
      body {
        font-size: 12px;
      }
    }
    ```
    
2. **フレックスボックス**
    アイテムを並べたり配置したりするのに便利です。
    ```css
    .container {
      display: flex;
      justify-content: center;
      align-items: center;
    }
    ```
    
3. **グリッドレイアウト**
    レイアウト全体をデザインする際に便利です。
    ```css
    .grid-container {
      display: grid;
      grid-template-columns: 1fr 1fr 1fr;
      gap: 10px;
    }
    ```


## まとめ

HTMLとCSSはWebページを作る基本のツールです。それぞれの役割を理解し、組み合わせることでより魅力的なデザインを作成できます。
「爆速AIチップGroqとLLaMA 3がもたらす未来」

# LLaMA 3 × Groq: 驚異のスピードでAI推論を変える「爆速AIチップ」とは？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/df459a6f-4f1d-2724-e45b-79d3a4d7caef.png)

こんにちは、技術好きな皆さん！今日はAI業界の激震ニュースをお届けします。このブログでは、Metaの新しい大規模言語モデル（LLM）「LLaMA 3」と、それを支えるスタートアップ「Groq」の驚異的なAIチップについて掘り下げていきます。これらがどのようにしてAI推論の未来を変えつつあるのか、一緒に探ってみましょう。

---

## 目次
1. **Groq: 爆速AIチップ「LPU」誕生秘話**
2. **LPUの仕組み：なぜこれほど速いのか？**
3. **LLaMA 3とGroqの相性抜群な理由**
4. **AI推論の進化：リアルタイム性能の新時代**
5. **AIがAIを使う未来？エージェント時代の幕開け**
6. **まとめ: AI推論の未来を拓くGroqの挑戦**

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/ab68e4b5-3c96-f192-33f6-b1c060680db0.png)

### 1. Groq: 爆速AIチップ「LPU」誕生秘話

GroqのCEO、ジョナサン・ロス氏は、元Google Brainのエンジニアで、「Tensor Processing Unit (TPU)」の開発を牽引したレジェンドです。そんな彼が手がけた「**Language Processing Unit（LPU）**」は、AI専用チップの新たなフロンティアを切り開く存在です。

このチップ、ただの速さではありません。言語処理（特にLLM）専用にカスタマイズされており、GPUが苦手とする部分を巧みに補います。応答速度はなんと1秒未満！これがもたらす影響を考えると、ワクワクが止まりません。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/d77242a1-46be-46c5-a7f7-8f50a3a7754d.png)

### 2. LPUの仕組み：なぜこれほど速いのか？

通常のGPUは画像処理には優れていますが、言語処理の効率は高くありません。そこで登場したのがLPUです。以下のポイントがLPUの速さの秘密です：

- **専用設計**：言語モデル用に最適化。無駄なプロセスを省き、高速化を実現。
- **低消費電力**：GPUがアルゼンチン一国分の電力を消費すると仮定するなら、LPUはグアテマラ程度の消費で済むという省エネ設計。
- **リアルタイム性**：チャットボットが質問を受けてから答えを生成するまでが1秒以内。これにより、会話体験が劇的に向上。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/71e4e8eb-107a-d92c-0441-68a8945f3e8d.png)

### 3. LLaMA 3とGroqの相性抜群な理由

Metaがリリースした大規模言語モデル「LLaMA 3」とLPUの組み合わせは、AI業界に新たな地平を切り開く可能性を秘めています。

- **驚異の速度**：LLaMA 3がGroqのLPU上で動作した際、1秒間に最大800トークン以上を生成。この速度は、GPUベースのクラウドサービスを大幅に凌駕します。
- **効率的な推論**：Groqのプロセッサは、行列乗算などのAIの中核処理に特化しているため、余計なオーバーヘッドを排除。

この組み合わせにより、AIモデルのトレーニングや推論が手頃なコストで可能になり、より多くの企業や開発者が高度なAIを活用できるようになるでしょう。

---

### 4. AI推論の進化：リアルタイム性能の新時代
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/693e7c25-0283-e700-e94c-8cce6bb47bf5.png)

Groqの技術を活用すれば、応答速度が遅いという課題が解消されます。以下のような分野で革命が起きる可能性があります：

- **Eコマース**：リアルタイムにカスタマー対応をするAI。
- **教育**：個別学習体験を提供するAIチューター。
- **エンターテイメント**：即興音楽演奏やAIゲームキャラクター。

例えば、1秒で800トークン生成できるスピードを活用すれば、AIとの会話や創作体験が「待たされない」ものになります。これにより、AIが私たちの日常に溶け込むスピードも加速するでしょう。

---

### 5. AIがAIを使う未来？エージェント時代の幕開け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/841128e5-4c68-fd82-dc0c-b5bbd017fd79.png)

興味深いことに、GroqのCEOは「AIの主なユーザーが人間ではなくAIエージェントになる」と予測しています。AIエージェントは次のように動作します：

- 自律的にタスクを実行。
- LLMを活用して複数ステップの推論を繰り返し行う。
- 人間の介入なしで高速に決定を下す。

この未来像は、AIエージェントが人間のパートナーとして活躍するだけでなく、新しいビジネスモデルを生む可能性も秘めています。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917980/90b8af90-5f8f-33d0-d712-9885100d5e49.png)

### 6. まとめ: AI推論の未来を拓くGroqの挑戦

Groqの「爆速AIチップ」LPUとMetaのLLaMA 3がもたらす未来は、AIの応答速度だけでなく、私たちの生活や仕事、エンターテイメントにまで影響を与えるでしょう。そのスピードと効率性が新たなスタンダードとなり、AIがより身近で便利な存在へと進化していくことは間違いありません。

次回は、AI活用に欠かせない「生成AIプロンプト」の基礎についてお話しします。それではまた！
22歳新卒でSES会社に入ってから、現在25歳でデータサイエンティスト年収500万の経緯

初めまして、kirikoです。
OW2が好きなので、そこに登場するキャラクター名を使っています。一緒に遊んでくれる方を募集しています✨

さて、タイトルについてですが、私は24歳の時に転職に成功して、今ではその仕事を始めて約半年が経ちました。都内で企業様のデータを分析したり、AIの作成や改修などを行っています。

データサイエンティストと聞くと、「興味がある」「面白そう」「なんだか今っぽい」というような声が聞こえてくる一方で、「難しそう」「たくさん勉強が必要なんでしょ？」といったマイナスなイメージを持つ人もいるかもしれません。

そこで、このブログでは、私がデータサイエンティストとしてどのような仕事をしているのか、SES（システムエンジニアリングサービス）からどうやってこの職業に転職したのかなどをゆるっと書いていこうと思います。

:::note warn
警告
私の作業や見てきたことを記載するので、これが全てではないです
:::

# データサイエンティストとは
ChatGPTの回答
```
データサイエンティストとは、データの収集・分析・可視化を通じて有用な知見を引き出し、ビジネスや社会の課題解決に貢献する専門家です。統計学、プログラミング、機械学習の知識を活用し、大量のデータから価値を創出します。また、意思決定の支援や戦略立案にも関わることが多く、技術力とコミュニケーション力を兼ね備えた職種とされています。
```

確かにこんな感じです。
私の作業としては、まだ年齢的にも経験的にも若いため「運用」と「分析」、その他の細かい改修を中心に行っています。

### 運用
運用では、お客様に弊社で作成したモデルの予測結果を納品しています。このモデルは毎日稼働しているのですが、時々処理が失敗することがあります。そういった場合にはエラーの対処を行います。また、出力するデータのカラムを増やしたり、欠損値や異常値を別の値で置き換える作業も運用の一部に含まれます。

### 分析
分析では、納品している予測値と本来の実績値がどのくらい乖離しているか、またどれくらい正確なのかを評価指標を用いて分析しています。この作業を通じて、お客様に価値のあるデータを提供することを目指しています。
その他には、企業様のデータを活用してプロモーション対象となるユーザーを発見したり、店舗間の特徴を分析することで、どのような商品を展開すれば購買履歴が向上するかといった結果を提供することも行っています。

### その他
その他の業務としては、新しい特徴量を追加してモデルの精度向上を図ったり、出力データにおける異常値フラグの条件を改修したりしています。

すべての業務においてお客様とのコミュニケーションが非常に重要です。ただ黙々と作業するのではなく、出力結果に対してお客様と議論を重ね、より良い成果物を提供することを目標としています。

# SESからデータサイエンティストになるまでの経緯

## 新卒入社
正直に言うと、私はプログラミングの「プ」の字も知らない状態からスタートしました。それでも、「タイピングだけは異常に速いし、エンジニアに向いているかも？」なんていう軽い気持ちでエンジニア職を探し始めたのです。結果はご想像の通り、"Hello World"すら出力できない自分を雇ってくれる企業は見つかりませんでした。

そんな中で唯一私を受け入れてくれたのがSES会社。実はその会社ではインターンシップ制度があり、入社半年前から毎日プログラミングを学ぶことができました。そこで必死に勉強した結果、4月の入社時点ではJavaやSQLをある程度書けるようになっていました。この努力が、私のエンジニア人生のスタート地点となりました。

## 転機
プログラミングが少しずつ身についてきた頃、運命的な出会いがありました。それが「競馬AI」です！昔から競馬が大好きで、いつも予想しては外れる日々。でも、AIなら過去のデータを元に未来を予測できると知ったとき、心の中で火がついたのを感じました。

空いた時間はほぼすべてYouTubeで見つけた参考チャンネルの模写に捧げ、競馬AIの仕組みを学びました。「どうしてもっと早くこれに出会わなかったんだろう？」と思うくらい、夢中になったのを覚えています。

そんな頃、会社で「AI部を副業として立ち上げる」というプロジェクトが始まりました。競馬AIで得た知識が評価され、なんとそのメンバーに抜擢されたのです！普段はJavaの案件で忙しい日々を送りながらも、帰宅後や休日はAIの開発に没頭。まさに“好き”が力になった瞬間でした。

## 挑戦
こうした日々の中で、AIやデータ分析に関するスキルがどんどん磨かれ、SES2年目にはデータ分析の案件に参画するチャンスを得ました。車のデータ分析やデータ抽出、加工といった業務に携わり、貴重な経験を積むことができました。

その後、この経験とスキルを武器に新しい会社への転職を果たし、今ではデータサイエンティストとして働いています。自分が大好きな分野でキャリアを築けることに感謝しながら、日々成長を続けています。

# まとめ
転職の際、いくつかのAI企業を受けた結果、ありがたいことに4つの内定をいただきました。その中から、自分の力を一番発揮できそうな会社を選びました。条件だけを見れば、年収570万円を提示してくれる会社もありましたが、まだAI部署の体制が整っておらず、学びたいと思える先輩や仲間がいなさそうだったため辞退しました。

現在もまだまだ学ぶことは山積みですが、これからも成長を続けていきたいと思います。

最後まで読んでくださり、ありがとうございました！
ファクトリの名前と属性を設定する

各ファクトリは名前と属性のセットを持ちます。名前がデフォルトによってオブジェクトのクラスを推測するために名前は使われます。
>Each factory has a name and a set of attributes. The name is used to guess the class of the object by default:

# ファクトリを生成する
```rb
# This will guess the User class
FactoryBot.define do # 名前と属性のセット　オブジェクトのクラスを推測できる名前にする
  factory :user do　# 名前
    first_name { "John" } # 属性
    last_name  { "Doe" }
    admin { false }
  end
end
```
https://thoughtbot.github.io/factory_bot/defining/name-attributes.html

クラスを明白に明示することが可能です
>It is also possible to explicitly specify the class:
これはUserクラスを使うだろう(さもなければAdminが推測されるだろう)
```rb
# This will use the User class (otherwise Admin would have been guessed)
factory :admin, class: "User"
```
定数が使用可能な場合、さらに定数に渡すことができる(これは定数を参照はしきりに読み込間れるために大きなrailsアプリケーション内でテストパフォーマンス問題が引き起こされることに注意して下さい。)
>You can pass a constant as well, if the constant is available (note that this can cause test performance problems in large Rails applications, since referring to the constant will cause it to be eagerly loaded).
```rb
factory :access_token, class: User
```
https://thoughtbot.github.io/factory_bot/defining/explicit-class.html

# 属性をハッシュとして設定する
rubyのブロック構文により、属性をハッシュとして定義する場合(例えばシリアライズ化されたもの/JSON属性） 中括弧のセットを二つ必要とする。
>Because of the block syntax in Ruby, defining attributes as Hashes (for serialized/JSON columns, for example) requires two sets of curly brackets:
```rb
factory :program do
  configuration { { auto_resolve: false, auto_define: true } } # auto_resolve: false, auto_define: trueが二つのセット
end
```
代わりに do/end構文をより好無かもしれない:
>Alternatively you may prefer do/end syntax:
```rb
factory :program do
  configuration do
    { auto_resolve: false, auto_define: true }
  end
end
```
### ハッシュだと設定が複雑にある
しかし、ハッシュとして値の定義は　オブジェクトを構築するときハッシュ内の値を設定することが複雑にする。それよりも`factory_bot`自身を使うことを好む
>However, defining a value as a hash makes it complicated to set values within the hash when constructing an object. Instead, prefer to use factory_bot itself:
```rb
factory :program do
  configuration { attributes_for(:configuration) }　# 二つに分かれるから複雑に見える
end

factory :configuration do
  auto_resolve { false }
  auto_define { true }
end
```
### 簡単に属性値を設定できる
作るときにこの方法はより簡単に値を設定できます。
>This way you can more easily set value when building:
```rb
create(
  :program, # 名前
  configuration: attributes_for(　# 一つ見えることでシンプルになる
    :configuration,
    auto_resolve: true,
  )
)
```
https://thoughtbot.github.io/factory_bot/defining/hash-attributes.html
Python基礎学習②数をカウントする際に配列を使う実装は相応しくないという学び

Pythonで次の問題を解いた時の学びをシェアします。
# 1000未満の「3と7の倍数」の5番目に大きい数を出力
最初の自分の回答
```
multiples_of_3_and_7_number = []
for n in range(1, 1000):
    if n % 3 == 0 and n % 7 == 0:
       multiples_of_3_and_7_number.append(num)
print(sorted(multiples_of_3_and_7_number)[-5])

出力結果
903 

```

リストを使って出力しました。
一見、これでいいように思えたのですが、リストに値を入れていくとメモリを消費します。
もし何千万もループするような処理ですと、メモリオーバーでエラーになるかもしれません。
なので、数をカウントする際にリストを使う実装は相応しくありません。

修正したコードが以下です。
```
count = 0
for n in range(1000, 1, -1):
    if n % 3 == 0 and n % 7 == 0:
       count += 1
       if count == 5:
          print(n)

出力結果
903 
```

1000から順にnに代入していき、条件を通過したらcountに+1する。もし、countが5なら、その時のnを出力する。
この方法であれば、メモリを消費せずに実装できました。

1000未満と聞くと1から1000と考えがちですが、1000から数えていく方法もあるんですね。

とても勉強になりましたので、シェアさせていただきます。
WordPressを構築するならLightsail?EC2?

# Lightsail vs EC2 結局どっちが良い？

[公式ドキュメントはこちら](https://docs.aws.amazon.com/ja_jp/whitepapers/latest/best-practices-wordpress/introduction.html)を読むのが良いですが、これだけでは味気ないので、、

友人に頼まれてAWS上にWordPressを構築する依頼を受け、**Lightsail** と **EC2** の両方のパターンを試してみました。


## 要件
1. **運用が容易であること**  
   - 私は手伝いのため常に監視できない上、友人も詳しくないため、なるべく簡単に運用できること。
2. **閲覧数が増えても落ちないこと**  
   - 今後様々な施策を打ち、閲覧数増加を前提にしても安定すること。



## Lightsailでの構築
非常に簡単で、**約15分**ほどで公開できました。  
参考：[Amazon LightsailでのWordPress構築手順](https://www.supinf.co.jp/tech-blog/details/amazon-lightsail-wordpress/)

## EC2での構築
こちらは**約1時間**かかりました。  
Auroraと接続する際に苦労し、DB接続エラーが発生。WordPressを再ダウンロードして解決しました。  
参考：
- [Qiita記事](https://qiita.com/3y9Mz/items/dc3b598243ae9ce04a7c)
- [Classmethodの記事](https://dev.classmethod.jp/articles/devio-aurora-serverless-v2/)

## どちらを選んだか
結局、**Lightsail** を選択しました。  
理由は運用の簡便さにあります。また、サイト内に静的ページが多かったため、閲覧数が増加しても **CloudFront** を活用すれば耐えられると判断しました。

スケールを考えると一番にAutoScaleが思い浮かびますが、キャッシュの導入も重要だと感じました。

今回はパフォーマンステストを実施できなかったので、今後実施しようと思います。
専門用語

1.オフライン送信
オフライン送信 とは、インターネットにつながっていない状態でデータや情報を送ることです。
例如，利用 USB、光盘、或其他存储介质，将数据手动传递到另一台设备上。

2.IF経由ない
数据或流程不通过接口进行处理或传递。换句话说，可能是直接手动输入、通过其他方式传输数据，或者系统之间没有通过接口进行连接。
Eclipseのちょっとした小技

## はじめに
Eclipseに限らずこいつをベースにした開発環境にも使える便利な小技をひとつ

Eclipseでは起動時にワークスペースの場所を入力してこれから作業するスペースを決めますが、これではいくつものプロジェクトを並行していじる場合に不便です。

Exlipseの起動オプションにワークスペースの場所を決め打ちする -data オプションがありますんで、それなら、と、-data オプションを設定してやったショートカットをたくさん用意し、デスクトップにでも並べておく、と、それぞれ起動してやるだけで、それぞれのワークスペースのプロジェクトが開いてくれて便利！かというと、それでもショートカットを作る手間がちとうざい、プロジェクトを開くショートカットの区別がつけづらい、とかいろいろ不満が出てきます。
## ここからが本題
ってことで、それなら、その決め打ちするワークスペースディレクトリをカレントディレクトリにしてしまおう！というのがこの記事の主題となります。

そうすれば、
ショートカットを一度修正すればそれを使いまわせる、
作業ディレクトリを作り、そこにショートカットをコピーすればそんで作業環境の作成はOK、
実行時は、作業ディレクトリを開いてそこにあるショートカットを開くだけ、となり、いいことづくめとなります。

![1737525747828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181945/2243a799-b7e3-23b5-e396-a1511dbb8ba5.jpeg)
ショートカットのプロパティ画面です。
1. 作業フォルダを空白にする
1. リンク先の実行ファイル名の後ろに、-data ./ を挿入（ドットスラッシュ、スペースで区切るのを忘れずに）

これだけを修正して、OKボタンで終了させます
さて、あとはこのショートカットを任意のフォルダにコピーしておいて、実行させるだけです
そのフォルダが自動的にワークスペースとなり、プロジェクト環境が構築できます

## Eclipseが動いてくれない場合
で、たいていの環境ではこれでうまく動いてくれるのですが、作業フォルダを空白にすると動いてくれない環境もあったりします
＃起動時にエラーが出てくれるならいいんですが、何ごともなく起動がキャンセルされるだけってのがややこしい。。

カレントディレクトリを変えるとダメってことで、設定に相対ディレクトリの項目が残ってるため、と推察できます。

ってことで、例として、Pleiades2024-12_C/C++ を動くようにしてみます。
eclipse.exe と同じディレクトリに eclipse.ini (実行ファイルと同名の.ini)がありますんで、それをいじります
＃戻せるように元のファイルはバックアップしておきましょう

``` eclipse.ini
....
-XX:InitialRAMPercentage=5
-XX:MaxRAMPercentage=25
-XX:TieredStopAtLevel=1
-Xverify:none
-javaagent:dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```
こいつの最終行がパスっぽい記述になっています
こいつかな？ってことで、これを
```eclipse.ini
-XX:InitialRAMPercentage=5
-XX:MaxRAMPercentage=25
-XX:TieredStopAtLevel=1
-Xverify:none
-javaagent:D:/pleiades/2024-12/eclipse/dropins/MergeDoc/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```
と、フルパスの記述にしてやります。
と、みごと！動くようになってくれます

## 追記
某所で、これで何が実現できるのか？という質問をいただいたのでちょっと追記します。
たとえば、e2StudioをあなたのPCにインストールし、いざ起動したとする、と、
![1741437686582.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181945/d34be4d9-23f6-41d6-acbb-6f84ba72303b.jpeg)
こういうダイアログが出てワークスペースの場所を要求されることになります。
### 問題
毎日作業をしようとするたびに、フォルダを入力する作業。
入力をちょっと間違えてしまうと問答無用でそのフォルダにワークスペース用のファイル・フォルダを作ってくれます。それを探し出して削除する、という作業も追加されたりします。
ウザい。これはウザい。
私の黄金の右手はこんな無駄な作業をするために存在するもんではないのです。
### ってことで解決編
ここで登場するのが今回の小技です。
ワークスペースとするために、デスクトップにUNIUNIフォルダを作ってみましょう。
そしてそのフォルダに、今回の小技を施したショートカットを置いてやります。
![1741437801970.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181945/82710d71-fffd-4d0a-9c8a-cf753174b514.jpeg)
そして、このショートカットをダブルクリックするだけ、です。
これでこのフォルダがワークスペースとなってくれます。そのままプロジェクトを作り、コードを書き、ビルドします。
あとは、このフォルダを開き、このショートカットを実行するだけ、でプロジェクトが開いてくれます。
PythonでWordの表を作成しカスタマイズする

表はWordの強力なツールであり、情報の整理、提示、分析に役立ちます。この記事では、**Pythonを使ってWordで表を作成し**、そこにデータを入れる方法と、表のスタイルを設定する方法を説明します。

## Python Wordライブラリ
Pythonを使用してWordでテーブルを作成または操作するには、まずサードパーティ製のライブラリ[**Spire.Doc for Python**](https://www.e-iceblue.com/Introduce/doc-for-python.html)をプロジェクトにインストールする必要があります。
***pipコマンド：***

> pip install Spire.Doc

## PythonでWordの表を作成する
Spire.Doc for Pythonを使用すると、**`Section.AddTable()`** メソッドを使用してWord文書に表を追加し、セルにデータを入力することができます。さらに、Python Wordライブラリは、表やセルのスタイルを設定するインターフェースも提供します。

**Pythonコード:**
```python
import math
from spire.doc import *
from spire.doc.common import *
 
# Documentオブジェクトの作成
doc = Document()
 
# セクションの追加
section = doc.AddSection()
 
# 表を追加する
table = section.AddTable()
 
# テーブルデータの定義
header_data = ["製品名", "数量", "単価"]
row_data = [ ["A-01製品","20946","2.9"], 
                ["B-02製品","38931","1.5"], 
                ["B-11製品","32478","1.1"], 
                ["C-04製品","21162","0.6"], 
                ["D-05製品","66517","1.2"]]
                
# テーブルの行数と列数の設定
table.ResetCells(len(row_data) + 1, len(header_data))
 
# テーブルのオートフィットをウィンドウに設定する
table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)
 
# ヘッダー行を設定する
headerRow = table.Rows[0]
headerRow.IsHeader = True
headerRow.Height = 23
headerRow.RowFormat.BackColor = Color.get_LightGreen()
 
# ヘッダー行にデータを入力し、そのテキスト形式を設定する 
i = 0
while i < len(header_data):
    headerRow.Cells[i].CellFormat.VerticalAlignment = VerticalAlignment.Middle
    paragraph = headerRow.Cells[i].AddParagraph()
    paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
    txtRange = paragraph.AppendText(header_data[i])
    txtRange.CharacterFormat.Bold = True
    txtRange.CharacterFormat.FontSize = 12
    i += 1
 
# 残りの行をデータで埋め、テキスト形式を設定する
r = 0
while r < len(row_data):
    dataRow = table.Rows[r + 1]
    dataRow.Height = 20
    dataRow.HeightType = TableRowHeightType.Exactly
    c = 0
    while c < len(row_data[r]):
        dataRow.Cells[c].CellFormat.VerticalAlignment = VerticalAlignment.Middle
        paragraph = dataRow.Cells[c].AddParagraph()
        paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
        txtRange =  paragraph.AppendText(row_data[r][c])
        txtRange.CharacterFormat.FontSize = 11
        c += 1
    r += 1
 
# 行の色を交互に設定する
for j in range(1, table.Rows.Count):
    if math.fmod(j, 2) == 0:
        row2 = table.Rows[j]
        for f in range(row2.Cells.Count):
            row2.Cells[f].CellFormat.BackColor = Color.get_LightYellow()
 
# ファイルの保存
doc.SaveToFile("WordTable.docx", FileFormat.Docx2016)
```


***出力結果：***
![AddTableToWord.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/307f6415-791a-63f5-b9a1-99864ae47197.png)



***
* Spire.Doc for Pythonライブラリは、Wordの表に対するその他の操作（行や列の追加、削除、コピー、セルの結合や分割など）もサポートしています。より多くのサンプルデモが利用可能です：

https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html

* 赤い透かしを消すための一時的なライセンスをリクエストする：

https://www.e-iceblue.com/TemLicense.html
創世記1章:ポンコツの神様、データに複数の責務を与えて大混乱

#### 第一幕: 創造の混乱  
ある日、全知全能を名乗る神様が「世界を創ろう！」と思い立ちました。しかし、神様はデータベース設計初心者のポンコツエンジニアでした。まず最初に「光」を作ろうとしましたが、次のような設計をしてしまいます。

- **Table: creations**  
  - id: 1  
  - type: "light"  
  - light_id: "sunlight-001"  
  - light_name: "太陽の光"  
  - description: "ただの光"

神様は自慢げに言いました。  
「ほら！光を作ったぞ！完璧じゃろ？」  

しかし翌日、「光が明るすぎる」というクレームが入ります。神様が調査しようとすると、`light_id`がデータベースのあちこちで使われていることに気づきます。さらに、`light_id`が「太陽の光」以外の月光や星光にも使われていることが発覚。ここで神様は混乱し始めます。

「この`light_id`って、一体何の責務を持っているんだ？光の種類？それとも物理的な出力？」  

#### 第二幕: データの堆積地獄  
神様は次に「地と海」を作りますが、ここでも意味を含んだID設計をしてしまいます。  

- **Table: lands**  
  - id: "earth-001"  
  - region_id: "land-sea-456"  
  - region_name: "地と海"  
  - description: "見た目はいい感じ"  

ポンコツ神様は、後から「海」を追加したくなりましたが、`region_id`が陸地と海の両方を含む形になっており、明確な境界を持たない設計のせいでエラーが続出しました。  

その上、`region_id`を参照していた別のテーブル（例えば動物や植物を管理するテーブル）では、一部の動物が「海」と「陸地」の両方に存在していることが矛盾する結果に。「魚」がなぜか「山」に配置される事件も発生。  

神様は頭を抱えながらこう呟きます。  
「データが一貫してない…おかしいな…全部IDで管理してるのに…」  

---

#### 第三幕: データベースの崩壊  
最終的に神様は人間を作ります。  

- **Table: humans**  
  - id: "human-adam-001"  
  - type: "male"  
  - dna_code: "12345-abcde"  
  - related_land_id: "earth-001"  

この設計もまた混乱を生みました。`id`に「人間の名前」「性別」「属性情報」が全部詰め込まれており、後から「イブ」を追加した際に`related_land_id`が地と海の混乱したデータ構造に影響され、人間同士の関連付けができなくなる事態に。最終的にシステム全体がパンクし、神様は世界のリセットボタンを押してしまいます。

---

### 解説: 意味を含んだIDデータの問題点  
物語の神様が直面した最大の問題は「意味を含んだIDデータ」による混乱です。この設計では以下の課題が発生しました。  

1. **属性や責務の分散**  
   - 一つのIDに複数の意味（例: 光の種類、物理的な特性）を持たせたことで、データの一貫性が保てなくなりました。  

2. **変更に弱い設計**  
   - 意味を含むIDは、要件変更時に影響範囲が広がりやすく、修正が困難になります。  

3. **参照の混乱**  
   - 他のテーブルで意味を含むIDを参照すると、誤解や矛盾が生じる可能性が高くなります。  

**理想の設計**は、IDを単なる一意性を保証する識別子として扱い、属性情報は別のカラムやテーブルで管理することです。例えば、`light_id`ではなく、`id`を単純な連番にし、光の種類や特性は別カラムとして保持すべきでした。

このように、意味を含んだID設計は、ポンコツ神様のような混乱を招きます。設計をシンプルに保つことが、世界（とデータベース）を平和に保つ秘訣です。
【Rails】ロガー

# はじめに
ログの出力や設定などについて調べた内容をまとめます。

# ログレベル

||ログレベル  |内容  |
|---|---|---|
|0  |:debug |デバッグ用の情報など |
|1  |:info  | 通知 |
|2  |:warn 　|　警告　 |
|3  |:error |制御可能なエラー |
|4  |:fatal |制御不可能なエラー |
|5  |:unknown |不明なエラー  |

## 出力するログレベルを設定
- 環境ごとに個別に設定する
- デフォルトでは、development環境とtest環境が `:debug`、production環境は `:info` に設定されている　
- production環境は不要なログを出力しないように注意する

```config/environments/development.rb
config.log_level = :debug
# もしくは　Rails.logger.level = 0
```

```config/environments/production.rb
config.log_level = :info
# もしくは　Rails.logger.level = 1
```

## ログを書き込む
-  設定方法 
```rb
logger.debug "hoge"
# logger.(debug|info|warn|error|fatal) "[書き込むメッセージ]"
```
- 設定例
```rb
  class ArticlesController < ApplicationController
  # ...

  def create
    @article = Article.new(article_params)
    logger.debug "新しい記事: #{@article.attributes.inspect}"
    logger.debug "記事が正しいかどうか: #{@article.valid?}"

    if @article.save
      logger.debug "記事は正常に保存され、ユーザーをリダイレクト中..."
      redirect_to @article, notice: '記事は正常に作成されました。'
    else
      render :new
    end
  end

  # ...

  private
    def article_params
      params.expect(article: [:title, :body, :published])
    end
end
```

## パフォーマンスに与える影響に注意する
- `:debug` は多くの文字列を評価するため、パフォーマンスへの影響が大きい
- ロガーメソッドに渡すものはブロック形式にする
    - ブロックの評価は遅延評価される  
```rb
logger.debug { "Person attributes hash: #{@person.attributes.inspect}" }
```

# おわりに
ログのクリア（`rake:log clear`）も定期的に行うようにしたいと思います。Railsガイドに記載のあるdebug gemも使いやすそうなので、今度試してみたいと思います。

# 参考

https://railsguides.jp/v8.0/debugging_rails_applications.html#%E3%83%AD%E3%82%AC%E3%83%BC

https://railsdoc.com/page/config_log_level