OmniAICreator/Qiita-1.07M huggingface dataset:
サーバーレスの第一歩：AWS サービスを少しだけ紹介

### **AWS の主なサーバーレスサービス**

サーバーレスアーキテクチャでは、サーバーの管理やスケーリングを意識せず、アプリケーション開発に集中できます。AWS はさまざまなサーバーレスサービスを提供しており、アプリケーションの構築や運用を効率化します。

---

### **1. コンピュート**
#### **AWS Lambda**
- **概要**: イベント駆動型のサーバーレスコンピューティングサービス。
- **特徴**:
  - コードを実行するだけでサーバー管理が不要。
  - トリガー例: S3 へのファイルアップロード、API Gateway リクエスト、DynamoDB テーブル変更。
  - 言語: Python、Node.js、Java、Go など。
- **ユースケース**: リアルタイムデータ処理、バックエンドサービスの構築。

#### **AWS Fargate**
- **概要**: コンテナをサーバーレスで実行するサービス。
- **特徴**:
  - Amazon ECS または EKS 上でコンテナを管理。
  - サーバー管理不要でスケーラブル。
- **ユースケース**: コンテナベースのアプリケーション運用。

---

### **2. データストレージ**
#### **Amazon S3 (Simple Storage Service)**
- **概要**: サーバーレスなオブジェクトストレージサービス。
- **特徴**:
  - 高い耐久性と可用性。
  - イベント通知（S3 にファイルがアップロードされたとき Lambda をトリガー可能）。
- **ユースケース**: 静的ウェブサイトホスティング、バックアップとリストア、データレイク。

#### **Amazon DynamoDB**
- **概要**: サーバーレスな NoSQL データベースサービス。
- **特徴**:
  - 自動スケーリング。
  - シームレスな高スループットと低レイテンシ。
  - **DynamoDB Streams** でリアルタイムデータ処理。
- **ユースケース**: モバイルアプリや IoT のデータストア。

---

### **3. アプリケーション統合**
#### **Amazon API Gateway**
- **概要**: サーバーレスな API 作成および管理サービス。
- **特徴**:
  - HTTP または WebSocket API の構築。
  - AWS Lambda や他のバックエンドサービスを統合可能。
  - 認証機能の統合 (Cognito や IAM)。
- **ユースケース**: REST API、リアルタイムチャットアプリ。

#### **Amazon EventBridge**
- **概要**: イベントルーティングサービス。
- **特徴**:
  - AWS サービスやカスタムアプリケーション間のイベントをルーティング。
  - スケジューリングやワークフローの自動化が可能。
- **ユースケース**: イベント駆動型アーキテクチャ。

#### **Amazon SQS (Simple Queue Service)**
- **概要**: サーバーレスなメッセージキューイングサービス。
- **特徴**:
  - アプリケーション間の非同期通信を実現。
  - 高い耐障害性。
- **ユースケース**: タスクキュー、バッチ処理のトリガー。

#### **Amazon SNS (Simple Notification Service)**
- **概要**: サーバーレスなメッセージングサービス。
- **特徴**:
  - メッセージのプッシュ型通知。
  - SQS や Lambda と連携可能。
- **ユースケース**: モバイル通知、リアルタイム警告システム。

---

### **4. データ処理と分析**
#### **Amazon Athena**
- **概要**: サーバーレスな SQL クエリサービス。
- **特徴**:
  - S3 上のデータを直接クエリ可能。
  - インフラ管理不要で即座に利用可能。
- **ユースケース**: データレイク分析、ログ分析。

#### **AWS Glue**
- **概要**: サーバーレスなデータ統合サービス。
- **特徴**:
  - データの準備と変換を自動化。
  - ETL（Extract, Transform, Load）ジョブの実行。
- **ユースケース**: データパイプラインの構築。

#### **Amazon Kinesis**
- **概要**: サーバーレスなリアルタイムデータストリーミングサービス。
- **特徴**:
  - 高スループットで大規模なデータストリームを処理。
  - Lambda と統合してリアルタイムデータ処理可能。
- **ユースケース**: IoT デバイスデータ、リアルタイム分析。

---

### **5. 開発ツール**
#### **AWS Amplify**
- **概要**: サーバーレスアプリケーションの構築プラットフォーム。
- **特徴**:
  - フロントエンドとバックエンドの統合開発。
  - 認証、ストレージ、API の簡単な設定。
- **ユースケース**: モバイルアプリ、ウェブアプリ。

---

### **6. 機械学習**
#### **Amazon SageMaker**
- **概要**: サーバーレスな機械学習プラットフォーム。
- **特徴**:
  - モデルの構築、トレーニング、デプロイを簡略化。
  - インフラ管理不要でスケーラブル。
- **ユースケース**: 予測分析、画像認識、自然言語処理。

---

### **7. モニタリングとログ管理**
#### **Amazon CloudWatch**
- **概要**: サーバーレスアーキテクチャのモニタリングサービス。
- **特徴**:
  - サービス全体のメトリクスとログを監視。
  - アラームを設定して異常を検知。
- **ユースケース**: パフォーマンス監視、運用改善。

---

### **サーバーレスアーキテクチャのメリット**
1. **スケーラビリティ**: 自動でスケールイン/スケールアウト。
2. **コスト効率**: 実行時間やリクエスト数に基づく課金。
3. **迅速な開発**: サーバー管理不要で開発速度が向上。
4. **高い可用性**: AWS の基盤によりサービス停止リスクを軽減。

AWS のサーバーレスサービスを活用することで、アプリケーションの運用効率が大幅に向上します！
【Python】infに0をかけるとnan

お疲れ様です。秋並です。

pythonでは、以下のように記述すると無限大の値をしめすinfが定義されます。

```python
num = float("inf")
```

<br>

infは「すごく大きな値」を扱いたい時に便利ですが、以下のようにinfに0.0を掛けた場合、nanになるため注意しましょう。

```python
gain = 0.0
num = float("inf")
gain_num = gain * num # infや0.0ではなく、nanになる
```
Angular アプリのカラーテーマを動的に変えるようにできるまで

## 前置き
Angular Material の公式サイトを見たところ、動的にテーマを切り替えていた。  

https://material.angular.io/

これに習って自分のAngular アプリでもテーマを動的に変えられるようにしたので、その時のメモがこちら。

## 本編
### Angular Material の公式サイトではどうやって動的にテーマを変えているのか？
結論としては、`document`経由でスタイルシートのリンクを書き換えていた。  
↓のコンポーネントがそれ  

https://github.com/angular/material.angular.io/blob/main/src/app/shared/theme-picker/theme-picker.ts

内部で↓を呼び出してリンクを書き換えている。  

https://github.com/angular/material.angular.io/blob/main/src/app/shared/style-manager/style-manager.ts

なお、PrimeNG にはテーマの切り替え方の動画があった。  
やり方としては↑と同じ。  

https://primeng.org/theming#switchthemes

### Angular のCSS バンドル設定
↑で切り替え方は分かったが、どうやってそのCSS を準備するのか？  
個別準備するのは大変だしと思ってAngular Material のソースを見たら↓のようにしていた。  

```
{
    "inject": false,
    "input": "src/styles/custom-themes/magenta-violet.scss",
    "bundleName": "magenta-violet"
},
```

https://github.com/angular/material.angular.io/blob/main/angular.json#L52

angular.json の設定をしてやれば、一緒にバンドルしてくれるようだ。  

## おまけ
↑を踏まえて自分のサイトに手を入れた内容が↓。  
自分のAngular アプリでは、PrimeNG を使用している。  
PrimeNG にはいくつものテーマが用意されているのでそれを使う。  

https://primeng.org/theming#builtinthemes

まず、使うテーマを@import しただけCSS を用意し、バンドルするようにした。

https://github.com/magurouhiru/mysite/commit/4687ca6a99931dd62cb2e4b6c8ba13f598d66dec#diff-a3d8115be55c595971cf347e527f99282e2f6dc741a92a1fdbdf0983174da9a4R1

https://github.com/magurouhiru/mysite/commit/4687ca6a99931dd62cb2e4b6c8ba13f598d66dec#diff-2d2675bb4687601a5c7ccf707455132f90f3516a33716185687e5c41df59ac7dR46

次に、全部見たわけではないけど、ぱっと見`--primary-color`というカスタムプロパティに主な色が設定されているのを確認した。  
なので、これを使ってPrimeNG 以外の色を書き換える。  
今回は`--main-color`というカスタムプロパティに一旦入れ、`color-mix()`関数を使いバリエーションを作り、それを使いまわした。  

https://github.com/magurouhiru/mysite/commit/4687ca6a99931dd62cb2e4b6c8ba13f598d66dec#diff-08e08eec8959c2c5be58b0d3de42ae80053e19447645b388f390e03c3acda243R3

テーマ切り替えに↓のコンポーネントを作成した。  
やってることは大分簡略したけど、Angular Material の公式サイトとほぼ同じ。  

https://github.com/magurouhiru/mysite/commit/4687ca6a99931dd62cb2e4b6c8ba13f598d66dec#diff-c939cb63f19933fbf35154e56119cfeaa9106116f0ca5fff11b4b3f6c2a135c9

## 感想
楽しかった。  
特に色が大きく変わるので触っていて面白かった。  

今回の記事は以上です。  

前回記事はこちら  

https://qiita.com/magurouhiru/items/363a276615e43a167a23

詳細見たい人はこちら  

https://github.com/magurouhiru/mysite/pull/65

https://magurouhiru.github.io/mysite/#/
グロタンディークの論文選

アレクサンダー・グロタンディークは代数幾何学や関連領域に多大な影響を与え、彼の多くの論文は現代数学概念の礎となった。

数学学会に多大な影響を与えた彼の重要な論文・出版物を紹介する。

1. ["Sur quelques points d'algèbre homologique"](https://projecteuclid.org/journalArticle/Download?urlId=10.2748%2Ftmj%2F1178244839) ：この基礎的な論文は、1957年の東北数学雑誌に掲載され、現代数学の基礎となるアーベル圏やそこから派生した関手などのホモロジー代数学におけるカギとなるコンセプトを導入した。
[Some aspects of homological algebra 英語訳](https://people.math.rochester.edu/faculty/lubkin/grothendieck-barr_tohoku.pdf)

2. ["Éléments de géométrie algébrique" (EGA)](http://www.numdam.org/item/PMIHES_1960__4__5_0.pdf)：この数巻からなるジャン・デュドネとの共著論文は、代数幾何学に厳格なフレームワークをもたらし、スキーム概念を導入し、この分野の未開拓研究領域を切り開いた。

出典: AIs and Humans

AIFI - Artificial Intelligence Finance Institute
C#のLeft、Right、Mid

# はじめに
C#にはLeft、Right、Mid関数が無い。
なので、作りました。

基本的にはVB.netの仕様と同じにしています。
※切り出し対象の文字列がnullの場合、VB.netだと空文字を返しますがnullにしています。

# サンプル
```c#:Left、Right、Mid
/// <summary>
/// 文字列の指定した位置から指定した文字数の文字列を返します
/// </summary>
/// <param name="str">文字列</param>
/// <param name="start">開始位置</param>
/// <param name="length">文字数</param>
/// <returns>取得した文字列</returns>
/// <exception cref="ArgumentException">startが0未満の場合、lengthが0未満の場合</exception>
public static string Mid(string str, int start, int length)
{
    if (start <= 0) throw new ArgumentException("引数'start'は0以上でなければなりません。");
    if (length < 0) throw new ArgumentException("引数'length'は0以上でなければなりません。");
    if (str == null) return null;
    if (length == 0) return string.Empty;
    if (str.Length < start) return string.Empty;
    if (str.Length < start + length) return str.Substring(start - 1);

    return str.Substring(start - 1, length);
}

/// <summary>
/// 文字列の指定した位置から末尾までの文字列を返します
/// </summary>
/// <param name="str">文字列</param>
/// <param name="start">開始位置</param>
/// <returns>取得した文字列</returns>
/// <exception cref="ArgumentException">startが0未満の場合、lengthが0未満の場合</exception>
public static string Mid(string str, int start)
{
    try
    {
        if (str == null) return null;
        return Mid(str, start, str.Length);
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

/// <summary>
/// 文字列の先頭から指定した文字数の文字列を返します。
/// </summary>
/// <param name="str">文字列</param>
/// <param name="length">文字数</param>
/// <returns>取得した文字列</returns>
/// <exception cref="ArgumentException">lengthが0未満の場合</exception>
public static string Left(string str, int length)
{
    if (length < 0) throw new ArgumentException("引数'length'は0以上でなければなりません。");
    if (str == null) return null;
    if (length == 0) return string.Empty;
    if (str.Length <= length) return str;

    return str.Substring(0, length);
}

/// <summary>
/// 文字列の末尾から指定した文字数の文字列を返します。
/// </summary>
/// <param name="str">文字列</param>
/// <param name="length">文字数</param>
/// <returns>取得した文字列</returns>
/// <exception cref="ArgumentException">lengthが0未満の場合</exception>
public static string Right(string str, int length)
{
    if (length < 0) throw new ArgumentException("引数'length'は0以上でなければなりません。");
    if (str == null) return null;
    if (length == 0) return string.Empty;
    if (str.Length <= length) return str;

    return str.Substring(str.Length - length, length);
}
```
【AWS】CloudWatchイベントでprefixを利用して最新のjob-definitionバージョンを取得する方法

# 概要

CloudwatchEventsで、AWS Batchのイベントパターンを使用する場合、少し書き方で工夫が必要と思ったので、紹介します。

# `job-definition`の最新バージョンを取得できる？

AWS Batchのジョブステータスの変更をCloudwatchEventsをイベントパターンで指定する場合、以下のようにすると思います。`jobDefinition`に特定のジョブ定義を指定することで、そのジョブのステータス変更のみを検知するようにできます。

```JSON
{
  "detail-type": ["Batch Job State Change"],
  "source": ["aws.batch"],
  "detail": {
    "jobDefinition": ["arn:aws:batch:ap-northeast-1:012345678901:job-definition/sample-batch-job-definition"],
    "status": ["FAILED"]
  }
}
```

ただし、この場合、最新バージョンが作成されていても取得されませんでした。

例えば最新バージョンが5の場合、以下のように`:5`と指定すれば、取得されます。

```JSON
    "jobDefinition": ["arn:aws:batch:ap-northeast-1:012345678901:job-definition/sample-batch-job-definition:5"],
```

ただし、これだとジョブ定義側に変更があるたびに、CloudWatchEvents側も変更しなければならないので、面倒だなと思いました。

# Prefixを利用して最新バージョンを取得

CloudWatchイベントパターンでジョブ定義の特定のバージョンを指定せずに、最新バージョンを取得できる方法として、`prefix`を利用した方法があります。

以下のように、`jobDefinition`フィールドに`prefix`を使用してジョブ定義名のみを指定。

```json
{
  "detail-type": ["Batch Job State Change"],
  "source": ["aws.batch"],
  "detail": {
    "jobDefinition": [{
      "prefix": "arn:aws:batch:ap-northeast-1:012345678901:job-definition/sample-batch-job-definition"
    }],
    "status": ["FAILED"]
  }
}
```

上記のようにすることで、指定のジョブ定義の最新バージョンを取得することができました。こちらの方がメンテナンスを簡素化できて良いですね。ご参考ください。
Linux初心者向け：AlmaLinuxとは？長期サポートが求められる環境でのCentOS後継としての新たな選択肢

## はじめに
自宅でLinux環境を検証する際、長らくCentOSを愛用していましたが、CentOS 8のサポート終了が発表されたことで、**長期的に利用可能なOSへの移行を検討する必要がありました。**

:::note warn
**そして最終的に、CentOSの後継として「AlmaLinux」を選ぶに至りました。**
:::

この記事では、備忘録として、AlmaLinuxの概要や特長、私が後継種として選択した理由について記録していきます。

## AlmaLinuxとは？
AlmaLinuxは、RHEL（Red Hat Enterprise Linux）と完全互換を目指して開発された、オープンソースのLinuxディストリビューションです。

https://www.designet.co.jp/faq/term/?id=QWxtYUxpbnV4

非営利団体「AlmaLinux OS Foundation」によって管理・開発されており、CentOSの代替として注目を集めています。

### 開発の背景
2020年12月、Red HatがCentOS 8のサポート終了を発表。これに伴い、CentOS Streamへの移行が提案されましたが、「安定したOSが必要」という声が多く上がりました。

https://www.kagoya.jp/howto/cloud/webserver/almalinux/

これを受け、安定性を重視した新たなディストリビューションとしてAlmaLinuxが誕生しました。

### 名前の由来
「Alma」はラテン語で「魂」を意味します。この名前には「**Linuxの魂を受け継ぐ**」という強い意志が込められています。

## 私がAlmaLinuxを選んだ理由

私がAlmaLinuxを選んだ理由は以下の通りです。

:::note info
- **長期サポートの提供**
CentOS 8のサポート終了後、長期的にサポートされるOSが必要でした。AlmaLinuxは通常10年間のサポートを提供しており、安心して利用できます。

- **完全なRHEL互換**
RHELとバイナリ互換があるため、これまで使用してきたアプリケーションや設定がそのまま利用可能です。

- **コミュニティ主導の運営**
AlmaLinuxは非営利団体によって運営されており、企業の意向に左右されることなく安定した環境を提供しています。

- **無料で利用可能**
高機能かつ無料で利用できるため、コストパフォーマンスが非常に高いのも魅力です。
:::

## AlmaLinuxの特徴
### 安定性と信頼性
AlmaLinuxはRHELと同じ基盤を共有しており、商用環境でも利用できる高い安定性を持っています。

https://www.cybertrust.co.jp/blog/linux-learning/almalinux-introduction/02-use.html

これにより、CentOSユーザーが移行しやすい環境を提供しています。

### 幅広い利用シーン

:::note warn
- **Webサーバー:** 
ApacheやNginxを利用したウェブホスティング。

- **データベースサーバー:** 
MySQLやPostgreSQLを用いた運用。

- **仮想化環境:** 
DockerやKVMを使用した仮想化。

- **開発環境:** 
PythonやRubyなどのプログラミング環境の構築。
:::

また、長期サポートとして通常10年間のサポートを受けられるため、長期的な運用に適しています。

## CentOSからAlmaLinuxへの移行

CentOSからの移行は非常にスムーズです。公式が提供する変換スクリプトを使うことで、既存環境をそのままAlmaLinuxに移行できます。

:::note alert
**事前にデータや設定をバックアップしてから、ご自身の責任で移行作業は実施してください。**
:::

変換後、動作確認を行い問題がなければ再起動して完了となります。

```bash
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/main/almalinux-deploy.sh
sudo bash almalinux-deploy.sh
```

## まとめ
AlmaLinuxは、CentOSの代替として安定した環境を提供するLinuxディストリビューションです。自宅での検証環境や企業の本番環境まで、幅広く活用できます。

:::note 
**CentOSからの移行を検討している方や、長期サポートが必要な方にとって、非常に魅力的な選択肢です。**
:::

今後、AlmaLinuxを使ったさらなる検証を進めていきたいと考えています。

このブログ記事が、皆さんのAlmaLinux導入の参考になれば幸いです。

## 関連記事

https://www.cybertrust.co.jp/blog/linux-learning/almalinux-introduction/02-use.html

https://www.winserver.ne.jp/column/centos-8-support-period/

https://www.kagoya.jp/howto/cloud/webserver/almalinux/
乱数生成コードの比較（C言語 vs. C# vs. Python vs. JavaScript）

頭が混乱してきたので、まとめることに。
※コードは、ChatGPTで生成。

## C言語

``` c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand((unsigned int)time(NULL)); // 乱数の種を現在時刻で初期化
    int randomNumber = rand() % 100; // 0～99の乱数を生成
    printf("Random Number: %d\n", randomNumber);
    return 0;
}
```

## C#

``` csharp
using System;

class Program {
    static void Main() {
        Random random = new Random();
        int randomNumber = random.Next(0, 100); // 0～99の乱数を生成
        Console.WriteLine($"Random Number: {randomNumber}");
    }
}
```

## Python

``` python
import random

random_number = random.randint(0, 99) # 0～99の乱数を生成
print(f"Random Number: {random_number}")
```

## JavaScript

1. `Math.random()`は、0.0以上～1.0未満の値を生成
1. これを100倍して、0.0以上～100.0未満の値に
1. `Math.floor()`で、端数を切り捨てて整数に

``` javascript
const randomNumber = Math.floor(Math.random() * 100); // 0～99の乱数を生成
console.log(`Random Number: ${randomNumber}`);
```
Javaの基本

# Javaとは
Java（ジャバ）は、プログラミング言語の一つであり、またその開発環境や実行環境を指すこともあります。以下にその主な特徴や概要を説明します。

・**プラットフォーム非依存**
Javaで書かれたプログラムは「一度書けば、どこでも動く（Write Once, Run Anywhere）」という特徴を持っています。これは、Javaプログラムが中間コード（バイトコード）にコンパイルされ、このコードがJava仮想マシン（JVM）上で実行される仕組みによるものです。JVMがインストールされていれば、OSやハードウェアに依存せず動作します。

・**オブジェクト指向プログラミング（OOP）**
Javaはオブジェクト指向を採用しており、クラスやオブジェクトを使った設計が可能です。これにより、コードの再利用性や保守性が向上します。

・**豊富なライブラリとフレームワーク**
Javaには、標準ライブラリに加えて多数のサードパーティー製ライブラリやフレームワーク（Spring、Hibernate、JUnitなど）が存在し、多様な用途で活用できます。

・**安全性**
メモリ管理は自動（ガベージコレクション）で行われ、不正なメモリ操作が発生しにくいため、C言語などに比べて安全性が高いとされています。

# Javaを動かしてみる
Main.javaというファイルのSystem.out.println()の()の中に文字を書くと、出力結果にその文字が表示されます。
```java: Main.java
class Main {
  public static void main(String[] args) {
    System.out.println("Javaの基本");
  }
}
```
出力結果
```java:出力結果
Javaの基本
```
# 文字列
文字列はダブルクォーテーション（"）で囲んであげる必要があります。" "で囲んでいないと、エラーになります。
```java: Main.java
class Main {
  public static void main(String[] args) {
    System.out.println("こんにちは");
  }
}
```
出力結果
```java:出力結果
こんにちは
```
# 数値
数値を扱うこともできます。数値は文字列と違い、ダブルクォーテーションで囲みません。
また数学と同じ記号を用いて、足し算と引き算が可能です。記号はすべて半角で記述します
```java: Main.java
class Main {
  public static void main(String[] args) {
    // 数値の10を出力してください
    System.out.println(10);
    
    // 3に6を足した値を出力してください
    System.out.println(3+6);

    // 10から９を引いた値を出力してください
    System.out.println(10-9);
    
    // 「4 + 7」を文字列として出力してください
    System.out.println("4+7");
    
  }
}
```
出力結果
```java:出力結果
10
9
1
4+7
```
# その他の計算
数値は足し算・引き算以外にも計算ができます。掛け算は「*」(アスタリスク)、割り算は「/」(スラッシュ)を用います。また「%」（パーセント）で、割り算の余りを計算することができます。
```java: Main.java
class Main {
  public static void main(String[] args) {
    // 18を3で割った値を出力してください
    System.out.println(18/3);
    
    // 5に6を掛けた値を出力してください
    System.out.println(5*6);
    
    // 10を3で割った時の余りを出力してください
    System.out.println(8%3);
    
  }
}
```
出力結果
```java: 出力結果
6
30
1
```

# 文字列の連結
数値の足し算と違い、文字列を「足し算」すると、下記のように文字列を連結することができます。よって、下図にもあるように、"19" + "07"は2つの文字列を連結し、"1907"となります。
```java: Main.java
class Main {
  public static void main(String[] args) {
    // "こんばんわ"と"プログラミング"を連結して出力してください
    System.out.println("こんばんわ"+"プログラミング");
    
    // "19"と"07"を連結して出力してください
    System.out.println("19"+"07");
    
    // 19と7を足して出力してください
    System.out.println(19+7);
    
  }
}
```
出力結果
```java: 出力結果
こんばんわプログラミング
1907
26
```


# 参考文献

https://www.sejuku.net/blog/3686
はじめまして

# 初めまして
 私は，AI-OCRプログラムを作りたい学生です。
 私がプログラムに興味を持ったきっかけは大学の実験です。実験結果の解析の作業を毎度行うことに苦痛を感じ，プログラムでそれらを処理していこうと考えました。そこから，pythonで色々なことができると知ってOCRの作成に取り掛かることにしました。まだ，はじめたてで分からないことも多いですが，備忘録として更新していこうと思います。
 ご意見等あればぜひコメントをお願いします。
Module-LLMとデバック基板のつなぎ方

## 目的
 LLM Moduleとデバック基板のつなぎ方について。
2024/11/1に発売された、 LLM Moduleの初期ロットにはデバック基板がGIFTとして同封されています。
デバック基板は、rootへログインできるシリアルポートとネットワークへ接続できるLANの接続コネクタ端子を使えるようにするものです。
 

<img src="https://github.com/user-attachments/assets/92a2667d-ed4e-4194-955a-eb18aa583dbc" width="300">


##  LLM Moduleとデバック基板のつなぎ方

1  LLM Moduleの基板と外枠についている4か所の六角ネジを外します。

2 スピーカーを取り外します。スピーカは両面テープでとまっているのでゆっくり剥がします。スピーカーの下にFFCコネクタがあることを確認します。
<img src="https://github.com/user-attachments/assets/2fdaa79b-241d-4e46-b5c5-eaffe938967d" width="300">

3 FFCとFFCコネクタを接続します。FFCコネクタを上に開けると、FFCを挿抜することができます。FFCを差し込み、FFCコネクタを横に倒して、固定します。


4 スピーカーと外枠を元に戻して組み立ては完了です。

<img src="https://github.com/user-attachments/assets/e5ae0bd0-fb4d-4603-b28a-8ca44e5deded" width="300">

5 デバック基板のType-CポートとWindows-PCとをUSBケーブルでつなぎます。PCからはUSBシリアルデバイスとして認識をされます。Teratermなどのターミナルソフトウェアを使って、デバック基板のUSBシリアルデバイスと接続を行い、rootとしてログインすることができます。そのときに、シリアル通信のボーレートは115200bpsを選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/019da9a3-7d72-90e1-ea4c-184c38c700b5.png" width="300">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/a47575b1-ddda-a895-eebc-6f2aa5d478bd.png" width="300">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/feeb710e-a273-ca6d-0529-ddfdaf187219.png" width="300">

 

6 PCのLANとLLM-ModuleのLANとを、ネットワークを介して接続した場合には、SSHでの接続を行うことができます。ifconfigでネットワークのIPアドレスを確認します。

```
root@m5stack-LLM:~# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.20.6  netmask 255.255.255.0  broadcast 192.168.20.255

```

Teratermのファイル→新しい接続のメニューを選び、
TCP/IPのホストにModule-LLMのIPアドレスを入力します。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/f4e59674-731f-1e9e-9a22-52c201644a28.png" width="300">


ユーザ名に"root"、パスワードには"123456"(初期パスワード、ログイン後に変更しましょう。)を入力します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/7f5f11ad-058f-d877-befa-cb3b88da4149.png" width="300">

SSHでもログインすることができました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/6ad45a6a-de05-ec8f-54f4-63b515245ba7.png" width="300">
Module-LLMのCVサンプルのビルド手順

### 目的
LLM_ModuleでCVサンプル(mobilenetv2でのクラス分類やyoloでのオブジェクト認識)を行うC++のプログラムをビルドする手順について説明する。


### ax-samplesの最新版のダウンロードと解凍

UbuntuをインストールしたPCにて、
axera-techのax-samplesのリポジトリのファイルをダウンロードして解凍する。

```bash
$ git clone https://github.com/AXERA-TECH/ax-samples
```

### ax620q_bsp_sdkのダウンロードとパスの設定
次に、ビルドに必要な「ax620q_bsp_sdk」をダウンロードします。このSDKのパスを環境変数ax_bspに設定しておきます。


```bash
$ git clone https://github.com/AXERA-TECH/ax620q_bsp_sdk.git
$ export ax_bsp=$PWD/ax620q_bsp_sdk/msp/out/arm64_glibc/
$ echo $ax_bsp
```


### OpenCVのダウンロードと解凍
サンプルプログラムで使用するOpenCVも必要です。以下の手順でダウンロードし、サードパーティフォルダ（3rdparty）に展開します。

```bash
$ cd ax-samples
$ mkdir -p ./3rdparty
$ wget https://github.com/AXERA-TECH/ax-samples/releases/download/v0.1/opencv-aarch64-linux-gnu-gcc-7.5.0.zip
$ unzip opencv-aarch64-linux-gnu-gcc-7.5.0.zip -d ./3rdparty
```


### aarch64のパッケージの導入とaarch64-linux-gnu.toolchain.cmakeファイルの作成

ARMプロセッサ向けにビルドするために、aarch64用のコンパイラをインストールします。

オフィシャルの手順ではgcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnuをインストールしますが、
Ubuntu22.04のaptでインストールできるaarch64-linux-gnuでもビルドできるため、aarch64-linux-gnuを使用しました。
問題があれば、gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnuをインストールして置き換えることが必要です。

```
$ sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
```

以下の内容で../toolchains/aarch64-linux-gnu.toolchain.cmakeというファイルを作成します。このファイルは、CMakeでクロスコンパイルをする際の設定を記述したものです。

```cpp
SET (CMAKE_SYSTEM_NAME Linux)
SET (CMAKE_SYSTEM_PROCESSOR aarch64)

SET (CMAKE_C_COMPILER   "aarch64-linux-gnu-gcc")
SET (CMAKE_CXX_COMPILER "aarch64-linux-gnu-g++")

SET (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
```



### ax-samplesのビルド

ビルド用のフォルダを作成し、ビルドの準備をします。
次に、実行ファイルをビルドします。並列処理でビルドを高速化するため、make -j8と指定します。

```bash
$ mkdir build
$ cd build
$ cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake -DBSP_MSP_DIR=${ax_bsp}/ -DAXERA_TARGET_CHIP=ax630c ..
$ make -j8
$ make install
```


./ax-samples/build/install/ax630c/のフォルダに実行ファイルが生成されました。

```
./ax-samples/build/install/ax630c/
├── ax_classification
├── ax_crowdcount
├── ax_depth_anything
├── ax_imgproc
├── ax_model_info
├── ax_rtdetr
├── ax_scrfd
├── ax_simcc_pose
├── ax_yolo11
├── ax_yolo11_pose
├── ax_yolo11_seg
├── ax_yolo_world
├── ax_yolo_world_open_vocabulary
├── ax_yolov10
├── ax_yolov10_u
├── ax_yolov5_face
├── ax_yolov5s
├── ax_yolov5s_seg
├── ax_yolov6
├── ax_yolov7
├── ax_yolov7_tiny_face
├── ax_yolov8
├── ax_yolov8_pose
├── ax_yolov8_seg
├── ax_yolov9
├── ax_yolov9_u
└── ax_yolox

```


参考

https://github.com/AXERA-TECH/ax-samples/blob/main/.github/workflows/build_630c_glibc.yaml
Pythonでリトライ処理を実装したい【Tenacity】

# はじめに
エラーを吐く可能性のある処理を含むスクリプトで，何度か繰り返してから，それでもダメなら終了したいという場面にでくわしました．
どうやら「リトライ処理」というらしいですね．（初めて知りました）


# リトライ処理
今回使用する言語はPythonで，良い方法は無いかと調べたところ，以下の候補がありました．

- `for-else`文
- `Tenacity`ライブラリ
- `Retrying`ライブラリ
- `retry`ライブラリ

今回，選択したのは`Tenacity`ライブラリを用いる方法です．
言語ネイティブで実装できるならそれに越したことはないという派閥の方が居ることは承知の上で，個人的には（研究レベルで使うなら）車輪の再発明は避けるべきであるという派閥のため，ライブラリを用いることにしました．
また，`Retrying`と`retry`は更新が停止しているため，今回の候補から除外しました．


# `Tenacity`ライブラリ
ライブラリの公式ドキュメントを以下に貼っておきます．

https://tenacity.readthedocs.io/en/latest/

詳細はこちらを参照してもらえればと思いますが，以下の簡単なサンプルコードから派生させる形で示してみたいと思います．

```python
def raise_error_randomly():
    '''
    ランダムにエラーを発生する関数
    '''
    pass

raise_error_randomly()
```

## エラー発生時に繰り返す
エラー発生時に成功するまで繰り返す処理を追加します．

```python: retry.py
from tenacity import retry


@retry
def raise_error_randomly():
    '''
    ランダムにエラーを発生する関数
    '''
    pass

raise_error_randomly()
```

デコレータをつけるだけで，既にある関数にリトライ処理を追加することができました．簡単で良いですね．


## 繰り返し回数を指定する
上記のままであれば，ひたすら繰り返し処理が走ります．しかし，ある一定回数処理をおこない，それでも正常終了しなければエラーを出したいということもあると思います．

```python: retry_stop_after_attempt.py
from tenacity import retry, stop_after_attempt


@retry(stop=stop_after_attempt(3))
def raise_error_randomly():
    '''
    ランダムにエラーを発生する関数
    '''
    pass

raise_error_randomly()
```

`stop_after_attempt`の引数に繰り返し回数を指定します．上記の例であれば3回処理をおこない，それでも失敗するとエラーを出力します．


## 繰り返すまでの待ち時間を設定する
繰り返し処理をおこなう際に，少し待ってから再度実行するようにしたいことも多いかなと思います．そうした需要にも対応してくれています．

```python: retry_wait_fixed.py
from tenacity import retry, stop_after_attempt, wait_fixed


@retry(stop=stop_after_attempt(3), wait=wait_fixed(10))
def raise_error_randomly():
    '''
    ランダムにエラーを発生する関数
    '''
    pass

raise_error_randomly()
```

`wait_fixed`の引数に，繰り返しまでの秒数を指定します．上記の例であれば10秒おきに実行されます．


# 最後に
いかがでしたでしょうか？
今回はリトライ処理の実装について，メモがてら記事にしてみました．

`Tenacity`ライブラリには挙げたもの以外にも「〇〇秒以内に完了しなければリトライする」や「リトライ処理の条件を指定する」といった使い方もできるようです．
MDNのWeb APIドキュメンの歩き方（更新中）

エンジニアなりたての頃、MDNのWeb APIドキュメントを読むのが苦手でした。
似たようなタイトルのページが多かったりパニック状態です。そしてそっと閉じてました。

そこで、MDNのWebドキュメントがすんなり理解できるようにどのようなページ構成になっていて、どのページをもればどのような情報が取得できるのか、体系的にまとめてみたいと思います。


## 想定読者
* Webアプリケーションエンジニア
* MDNのWeb APIドキュメントどこに何があんだ?って人

## スコープ
* MDNドキュメントのページ構成と各ページから得られる情報

扱わない内容
* 各APIに関する詳細の説明

## MDN Web APIドキュメント早見表

|ページ|階層|概要|
|---|---|---|
|[Topページ](https://developer.mozilla.org/en-US/docs/Web/API)|docs/Web/API|Web APIの一覧ページで各APIの詳細ページに飛べます|
|[仕様解説ページ](https://developer.mozilla.org/en-US/docs/Web/API#specifications)|docs/Web/API/[API名]|対象のWeb APIの仕様概要ページです。〇〇APIというタイトルになってるページが多い。APIを使用する際にまずは一読して全体像を掴むために必読のページです。|
|[Interfaceページ](https://developer.mozilla.org/en-US/docs/Web/API#interfaces)|docs/Web/API/[インターフェース名]|対象のWeb APIで利用できるプロパティやメソッドの情報が確認できます|
|インスタンスメソッドページ|docs/Web/API/[インターフェース名]/[メソッド名]|APIで利用可能なメソッド名の使用方法が記載されています。引数や戻り値の型などが参照できます。使用例も記載されていることが多いので、実装時はこのページにお世話になることが多い|
【コラム】現場で使うインフラ用語たち

## 1.はじめに
新卒で入社して以来、早3年目になりましたが未だによく分からない用語が沢山飛び交っています。ただ、新人時代と比べる幾分か理解できる話が増えてきました。そんなよくわからない用語達の中から個人的に理解できているもの（納得感があったもの）を改めてまとめておこうと思い、この記事を書きました。新人インフラエンジニアさんたちはぜひ予習しておきましょう。

## 2.インフラ用語集
### その1「そのVMって足2本出すことは可能ですか？」
まずはこの「足を出す」という用語。最初聞いたときはもちろん意味不明でした。
「VMに足が生えている？は？」ってなってました。当時の私の中の頭の中はこんなイメージですね。👇
（ChatGPTに画像生成させたら、物理サーバになっちゃいました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/6ca3a008-6b70-192d-0965-35e4b6194bfe.png)

もちろん、本当の意味は全く違います。
インフラエンジニアの業界で使われる「足を出す」という表現は、ネットワーク構成や仮想マシン（VM）のネットワークインターフェースに関連する比喩的な言い方です。
ずばり、
<font color="Red">「ネットワークに接続するインターフェースを追加すること」</font>です！
具体的には以下の通りです。
* VMにおいて、ネットワークに接続するための「足」として、ネットワークインターフェースカード（NIC）が考えられます。1本の足＝1つのネットワークインターフェース、つまり1つのネットワークセグメントやVLANに接続するものと捉えられます。（VMを具体例としてますが、NW機器やストレージでもなんでも一緒です）
* たとえば、「VMが2本足を出す」と言われた場合、それは1台のVMが2つの異なるネットワークに接続できるように、2つのNIC（または仮想NIC）を設定することを指します。

こう聞くと、足を出すという表現は割と的を得てますよね。

### その2 「こことここはツーツーですよね？」
「ツーツー」という表現も、ネットワークやシステムの状態をわかりやすく伝えるために使われる比喩的な言い回しです。ずばり、
<font color="Red">「2つのネットワーク間で通信ができる状態」</font>を指します！
具体的には以下の通りです。

* **通信が双方向に問題なく行えること**
2つのネットワークやシステムが、双方向に正常に接続され、データがやり取りできる状態を指します。
たとえば、「AネットワークとBネットワークはツーツーですよね？」というのは、AとB間でファイアウォールやルーティング設定が問題なく構成されており、通信ができる状態かどうかを確認しているわけです。
* **ネットワークの透過性が高いこと**
何らかの制約やフィルタリングがなく、2つのネットワーク間で自由に通信ができる状態を強調する場合もあります。（セキュリティーグループやACLでの制御がないこと）

### その3 「拠点間でIPsecはりましょう」
遠隔にある拠点間を繋げたい、企業のオンプレミスデータセンターとクラウド（AWS, Azure, GCPなど）を接続したい。といった顧客要望がある場合などに、このワードはでてきがちです。これはIPsecとはどういうプロトコルか分かってたらなんとなく想像がつくかもしれません。
IPsecは、インターネットや他のIPベースのネットワーク上でデータを暗号化し、安全にやり取りするためのプロトコルスイートです。（特徴としては、簡単にまとめると以下）
* 暗号化（Encryption）：通信内容を暗号化して、盗聴を防ぐ。
* 認証（Authentication）：通信の相手が正当であることを確認。
* データ完全性（Integrity）：データが改ざんされていないことを保証。

通常、IPsecはVPN（Virtual Private Network）の一部として使用され、特に拠点間VPNを構築するために利用されます。
ずばり、「IPsecをはる」というのは、<font color="Red">2つのデータセンター間に暗号化されたVPNトンネルを構築することで、安全な通信経路を確保する</font>という意味です！
もっと簡単に言うと、セキュアな通信経路の確立し、拠点間をインターネット越しに安全に接続することさします。
（👇ChatGPTで生成した画像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/650dd0a7-ffcb-9557-f190-c9f25cd0d924.png)

他にもあると思いますが、印象に残ってるのはこの３つですね。
また思い出せたら更新します。
[Rails] i18nによる多言語化対応の方法

# はじめに
現在プログラミングを学習中の初学者です🔰
もし間違いや改善点があれば、教えていただけると幸いです。

# i18nとは
i18nは「internationalization」の略で、ソフトウェアのさまざまな言語や地域設定に柔軟に対応できるよう設定することです。小ネタですが、18は「internationalization」の「i」から「n」までの間にある文字数でi18nと読むそうです。

# なぜ多言語化対応する必要があるのか
i18nを使うことで、以下のメリットが得られます。
1. ユーザーの利便性向上
多くのユーザーが使いやすいと思うアプリを作るには、母国語で情報を表示することが重要。
1. コードの保守性の向上
直接テキストを入れるより、言語ごとにまとめて保管することで修正やメンテナンスも容易になります。
1. グローバルなアプリケーション対応
世界中のユーザーをターゲットにする場合、複数の言語対応は必須。

# 今回の目標
### エラーメッセージの多言語化をしたい
ユーザーが自分の言語でエラー内容を理解できるようにするため。

# 作業の流れ
Railsでi18nを使うのは意外とシンプルです。以下のステップで設定が可能です。
- `config/locales` ディレクトリに `en.yml` と `ja.yml` ファイルを作成して、それぞれ英語と日本語のテキストを定義します
```# config/locales/en.yml
en:
  hello: "Hello, World!"

# config/locales/ja.yml
ja:
  hello: "こんにちは、世界！"

```
- ビューでテキストを呼び出すには、`t` メソッドを使います
```# app/views/home/index.html.erb
<%= t('hello') %>
```
- デフォルトの言語を設定する
アプリケーションのデフォルト言語は、`config/application.rb` で設定できます。
```# config/application.rb
module YourAppName
  class Application < Rails::Application
    config.i18n.default_locale = :ja # 日本語をデフォルトにする場合
  end
end
```

# まとめ
グローバルなユーザーをターゲットにした場合、railsでi18nを導入することによってアプリの価値を高めることができます。初心者でも基本的な設定を理解すれば簡単に実現できるので、まずは小さなプロジェクトで試してみましょう！
Railsの公式ガイド(https://railsguides.jp/i18n.html)も参考になりますので、興味があればチェックしてみてください。
デザインもやってと言われたエンジニアを救う技術

デザイナーがいなくて、エンジニアの自分がデザインを担当することになりました。

参考になる技術をまとめます。

## 考え方

https://qiita.com/mskmiki/items/544149987475719e417b


## 参考にするデザインを見つける

https://mobbin.com/browse/web/apps?via=home

https://partsdesign.net

## モック作成

https://www.figma.com/community/plugin/944200797696370948/handy-components

## アイコン・素材

https://www.isocons.app

https://blog.streamlinehq.com/tag/icons/

## スライド作成
デザインアイデア

https://www.slideland.tech


## コーディング

https://htmlrev.com/

https://cssnippets.shefali.dev/
Pythonアプリケーションの実行と終了（自分のPCの開発環境）

Copilotにpythonアプリケーションの起動と終了を聞いたので、メモ。
（一部加筆）

前提：Windows、Pythonアプリケーションはプロジェクトディレクトリ（フォルダ）に格納済。

## Pythonアプリケーションの実行
プロンプト「上記の「アプリケーションを実行して」というのは、具体的にどのような手順か初心者にもわかるように教えてください。」

Copilotの回答：

アプリケーションを実行する手順は以下の通りです。初心者でもわかるように、ステップバイステップで説明します。

### 1. 仮想環境の作成と有効化
まず、コマンドプロンプトでプロジェクトディレクトリに移動し（cd ほにゃらら）、仮想環境を作成して有効化します。

#### 仮想環境の作成
初回のみ
```bash
python -m venv venv
```

#### 仮想環境の有効化
Windowsの場合:
```bash
venv\Scripts\activate
```

### 2. 必要なパッケージのインストール
仮想環境が有効になった状態で、FlaskとFlask-SQLAlchemyをインストールします。
※必要なものを適宜インストール。

初回のみ

```bash
pip install Flask Flask-SQLAlchemy
```

### 3. アプリケーションの実行
`app.py`ファイルがあるディレクトリに移動し、以下のコマンドを実行してアプリケーションを起動します。

```bash
python app.py
```

### 4. ブラウザでアプリケーションにアクセス
アプリケーションが起動すると、以下のようなメッセージが表示されます。

```
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

ブラウザを開き、アドレスバーに`http://127.0.0.1:5000/`と入力してアクセスします。これで、タスク管理ツールのWEBサイトが表示されます。

### まとめ
1. プロジェクトディレクトリに移動
2. 仮想環境を作成し、有効化
3. 必要なパッケージをインストール
4. アプリケーションを実行
5. ブラウザで`http://127.0.0.1:5000/`にアクセス

これで、Flaskアプリケーションが正しく動作するはずです。

## Pythonアプリケーションの終了
プロンプト「ブラウザでアプリケーションにアクセスできました。終了するときはどうすればよいでしょうか。」

Copilotの回答：
アプリケーションを終了するには、以下の手順に従ってください。

### 1. ターミナルでアプリケーションを停止
アプリケーションが実行されているターミナルウィンドウ（コマンドプロンプト）に戻り、`Ctrl + C`キーを押します。これにより、Flaskサーバーが停止します。

### 2. 仮想環境の無効化
仮想環境を無効化するには、以下のコマンドを実行します。

```bash
deactivate
```

これで、仮想環境が無効化され、通常のシェル環境に戻ります。

### まとめ
1. ターミナルで`Ctrl + C`キーを押してアプリケーションを停止
2. `deactivate`コマンドを実行して仮想環境を無効化

これで、アプリケーションの実行を終了することができます。
ilasmでstack machine その55

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
ilasmでファイルの読み書きせよ。

# サンプルコード

```

.assembly extern mscorlib {}
.assembly 'file0' {}
.method public static void main() cil managed {
	.entrypoint
	.maxstack 3
	.locals init ([0] string path, [1] class [mscorlib]System.Collections.Generic.List`1<string> text)
	ldstr "hello.txt"
	stloc.0
	newobj instance void class [mscorlib]System.Collections.Generic.List`1<string>::.ctor()
	dup
	ldstr "Hello world!"
	callvirt instance void class [mscorlib]System.Collections.Generic.List`1<string>::Add(!0)
	stloc.1
	ldloc.0
	ldloc.1
	call void [mscorlib]System.IO.File::WriteAllLines(string, class [System.Runtime]System.Collections.Generic.IEnumerable`1<string>)
	ldloc.0
	call string [mscorlib]System.IO.File::ReadAllText(string)
	call void [mscorlib]System.Console::WriteLine(string)
	ret
}


```

# 実行結果

```
>file1
Hello world!
```





以上
Tableauで最頻値を計算

# はじめに
顧客データを使用して一番人数の多い年齢を表示する等、Tableauで最頻値を計算したい場合があると思います。
合計・平均・最大値等はTableauのデフォルトの集計機能で計算ができますが、最頻値の計算はできませんのでTableauで実装する方法をご紹介いたします。
今回紹介する方法では表計算・FIXEDを使用しないため、フィルター・ビューの形式等への配慮があまり必要ない点で有用です。

# 使用するデータソース
![画像①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/ef1375fa-01c1-1edf-5379-300c8b7df651.png)

# 目的
人数が最も多い年齢を表示する計算フィールドを作成
![画像②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/84bc8ef8-e8dd-d8eb-8fc0-775972f7d853.png)
ディメンションを配置すると、その値ごとに最も人数の多い年齢を表示
![画像④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3932433/95dabf85-5f09-78fc-cd7a-e143f403d876.png)


# 実装
「最多年齢」フィールドを作成
```
{ INCLUDE [年齢]:
    IF COUNTD([顧客No]) = MAX(
        { EXCLUDE [年齢]: MAX(
            { INCLUDE [年齢]: COUNTD([顧客No]) }
        )}
    )THEN MAX([年齢]) END
}
```
### 3~5行目
INCLUDEを用いて年齢ごとの人数をカウントした後、その中で最大値を計算しています。
※3行目のEXLCUDEは1行目のINCLUDEを打ち消すために使用しています。
```
3         { EXCLUDE [年齢]: MAX(
4             { INCLUDE [年齢]: COUNTD([顧客No]) }
5         )}
```
### 1~7行目
年齢ごとに人数をカウントし、その値と3~5行目で計算した値を比較しています。
値が一致すればその年齢が最も人数の多い年齢であるとわかるため、[年齢]を返します。
```
1 { INCLUDE [年齢]:
2     IF COUNTD([顧客No]) = MAX(
3~5      年齢ごとの人数の最大値   
6     )THEN MAX([年齢]) END
7 }
```

# 終わりに
[年齢]を他のフィールドと入れ替えれば年齢以外でも活用できます。
ご活用いただければ幸いです。
LLMアプリケーション開発ナレッジ集

エンタープライズ向けでLLMアプリケーションを構築する時に非常に参考になった記事や書籍をまとめています。
（順次追記）
一応、初めてLLMに触れるよという方向けにおすすめ度（5段階評価）も書いておきます。

## 雑年表
2024年11月時点までで観測した流れです（肌感）
Microsoftに関連した技術を扱うことが多いので、Microsoft社が発表した流れにこの年表も影響されてると思います。

| 日付 | 概要 |
|:-----------|:------------|
| 2022年11月 | ChatGPTリリース |
| 2023年初頭 | ChatGPTを利用した生産性向上手法が流行る |
| 2023年1月 | OpenAIがAPIをリリース、エンタープライズビジネスとして応用できるか模索され始める |
| 2023年3月 | GPT4がリリースされる |
| 2023年中旬？ | RAGの構築が流行り始める |
| 2024年5月 | GPT4oがリリース、AOAIでもリリースされエンタープライズも盛り上がる |
| 2024年中旬？ | マルチモーダル、SLMがLLMのトレンドに |
| 2024年中旬 | AOAIのGPT3.5のサポート終了が告知。当時は4oがJapanリージョンになかったので乗り換え先問題になってた気がする |
| 2024年中旬？ | RAGの現実的な課題（精度）が広く認識され始めAdvancedRAGへ |
| 2024年9月 | GPTo1リリース |
| 2024年10月 | LLMアプリケーション開発でマルチエージェント盛り上がり始める |
| 2024年11月 | Microsoft社がMicrosoft Ignite 2024でエージェンティックな世界を提唱 |

## 全般
### ChatGPT - LLMシステム開発大全
LLMシステム構築のための全般的な内容がまとまっています。
2024年11月時点だと少し内容が古いですが、これ一つ読めば
Microsoft社の方が作成されているため、内容はAzureに寄っています。
SierやBtoB向けアプリケーションを構築されてる方には特におすすめです

おすすめ度：★★★★★

https://speakerdeck.com/hirosatogamo/chatgpt-azure-openai-da-quan

### Azure OpenAI Serviceではじめる ChatGPT/LLMシステム構築入門
AOAIを使用してアプリケーションを構築する方に非常におすすめです。
AOAIをAPIで使用する方法など基本的な内容が網羅されています。
しかしながら2024年11月時点では古い情報も多いのでこの本一冊では難しいところ

おすすめ度：★★★★☆

https://gihyo.jp/book/2024/978-4-297-13929-2

### LangChainとLangGraphによるRAG・AIエージェント［実践］入門
LangChainの記述方法が細かく解説されてあり、RAGやマルチエージェントで実践にはどうするかが詳細にまとまっています。
エージェントのデザインパターンなど、これから普遍的に使用できそうな情報も解説されているため、
必携と言っても過言ではないと思います。
AOAIについてはほぼ記載されていないので注意。

おすすめ度：★★★★★

https://gihyo.jp/book/2024/978-4-297-14530-9

## プロダクトマネジメント
### 生成AI時代のプロダクトマネジメント 勝てる事業の原則から戦略、デザイン、成功事例まで
AIを使用したサービスのプロダクトマネジメントについて
LLM問わずMLを組み込むサービスも含めた内容が記載されています。
アプリケーション開発者としては、生成AIアプリのUIUXに言及している章が非常に参考になりました。
LLMアプリケーションのUIUX関しては、いまだチャットでの対話形式が主流なのでどのような手段が最適なのか日々格闘中です。UIUX関連の書籍も出てほしいですね。

おすすめ度：★★☆☆☆

https://www.shoeisha.co.jp/book/detail/9784798186818

## 評価
### LLMプロダクト開発における独自評価基準とデータセットの作り方の考察
LLMの生成は一定ではなく、揺らぎが存在するため評価は重要です。
ここまでリンクした情報では全体的なプロセスの一部としての記載やRAGに限った方法などが多く、
汎用的な考え方はいまいちピンときていませんでした。
こちらの記事では言語化されたうえでしっかり落とし込まれていてとても参考になりました。

おすすめ度：★★★☆☆（初学者向けではないため）

https://zenn.dev/gaudiy_blog/articles/ba06e37d226182

## 責任あるAI
### AIの倫理 - Responsible AI
AIが生成するコンテンツは時に不適切な内容も出力されるので、責任もって防ぐ必要があります。
また、テクニック的なことよりも組織的にガバナンスを強化するのが一番重要という話

おすすめ度：★★★★☆

https://speakerdeck.com/dahatake/ainolun-li-responsible-ai

## AzureOpenAI

### リファレンスアーキテクチャー
https://www.microsoft.com/ja-jp/events/azurebase/contents/

### Prompt Flow
いいのが見つかれば・・・

## Semantic Kernel
いいのが見つかれば・・・

## おまけ
継続してウォッチしている開発者の方のリンクをまとめています。

###  seya 様
LLMアプリケーションの評価関連

https://zenn.dev/seya

### PharmaX（旧YOJO Technologies）開発チーム 様
全般的な内容

https://speakerdeck.com/pharma_x_tech

### SIOS Tech.Lab 様
全般的な内容

https://tech-lab.sios.jp/

### Kazuki Ota 様
AOAIやMicrosoft社のOSS中心

https://zenn.dev/okazuki
Rを学びたい Step12 標準偏差

## はじめに
Rを学びたいStep12です。今回は標準偏差を学んでいきます！

## 標準偏差とは？
標準偏差（ひょうじゅんへんさ、Standard Deviation）は、データのばらつきを示す統計量の一つです。データが平均からどれだけ散らばっているかを表します。標準偏差が小さいほどデータは平均値の近くに集まっており、大きいほどデータは広く散らばっています。

### 標準偏差の求め方
1. データの平均値を計算する。
2. 各データ点から平均値を引き、その差を二乗する。
3. その二乗した値の平均を求める（分散）。
4. 分散の平方根を取る。

:::note info
標準偏差は（各データ-平均値)の合計をそのまますると0になります。
負の数を考慮するため、2乗してその後平方根で戻すようです。
:::

## 標準偏差の実用例
標準偏差を利用する例で身近なものは偏差値です。サンプルを例に標準偏差、偏差値を出していこうと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/8946d0bb-931e-7022-11a7-21cc54b98517.png)

### 1. 平均を算出
国語の平均点を出します。
(90+80+60+70+40)/5=68(点)

### 2. 分散を算出します。

```math
\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2
```

```
((90-68)^2+(80-68)^2+(60-68)^2+(70-68)^2)+(40-68)^2)/5
=(22^2+12^2+(-8)^2+2^2+(-28)^2)/5
=(484 + 144 + 64 + 4 + 784)/5
=1480/5
=296
```

### 3. 標準偏差
先ほど算出した分散をルートをつけます。

```math:
 \sqrt{\frac{1}{N} \sum_{i=1}^N (x_i - \mu)^2}
```

```
=√296
=17.204
```

### 4. 偏差値を表示する
では、最後に偏差値を出していきます。

```math
{偏差値} = 50 + 10 \times \frac{x - \mu}{\sigma}
```

```
Aの偏差値：
　50 + 10 * (90-68)/17.204
= 50 + 10 * 1.2788 
= 50 + 12.788
=62.78
```

## ソースコード
```r:
# データ
data <- c(90, 80, 60, 70, 40)

# 平均値
mean_value <- mean(data)  # 平均値

# 偏差の2乗の合計
squared_deviation <- sum((data - mean_value)^2)

# 母分散
variance_population <- squared_deviation / length(data)

# 母標準偏差（分散の平方根）
sd_population <- sqrt(variance_population)

# 結果の出力
cat("母分散:", variance_population, "\n")
cat("母標準偏差:", sd_population, "\n")

# 偏差値の計算
deviation_scores <- 50 + 10 * (data - mean_value) / sd_population

# 偏差値の出力
cat("偏差値:\n")
for (i in 1:length(data)) {
  cat(sprintf("得点: %d -> 偏差値: %.2f\n", data[i], deviation_scores[i]))
}
```



```shell:
~/develop/R/r_study/standard_deviation  (main)$ Rscript standard_deviation.r                                            (base) 
母分散: 296 
母標準偏差: 17.20465 
偏差値:
得点: 90 -> 偏差値: 62.79
得点: 80 -> 偏差値: 56.97
得点: 60 -> 偏差値: 45.35
得点: 70 -> 偏差値: 51.16
得点: 40 -> 偏差値: 33.73
```
Dockerのボリュームとバインドマウントの違い

# ボリュームとは
　ボリュームは、ログやMySQLサーバーのデータなどをコンテナ終了後も消したくないときに利用します。コンテナの任意のディレクトリにマウントすることで、コンテナのファイルをコンテナ外に保存できます。マウントの具体的な処理はDockerがやってくれるので、マウント先を決めるだけですぐに利用できます。
　コンテナ削除後にも利用したいデータはボリュームに保存し、別のコンテナを起動したときに同じボリュームをマウントすれば、新しいコンテナでデータを継続して利用できます。

# バインドマウントとは
ホストマシンの任意のディレクトリをコンテナにマウントします。バインドマウントでマウントしたディレクトリは、ホストマシン側とコンテナ側どちらからでも参照できます。

# ボリュームとバインドマウントの違い
　ボリュームはコンテナのデータをコンテナ外に保存するための仕組みでしたが、ボリュームの管理はDocker Engineに任せます。
　一方で、バインドマウントはホストマシンのディレクトリをコンテナにマウントしています。コンテナ内でマウント先のディレクトリを破損させてしまった場合、ボリュームはDocker Engine内で済みますが、バインドマウントはホストマシンにまで影響を及ぼします。

# ボリュームをマウントする
## ボリュームの作成
試しにmy-volumeを作成してみます。
```zsh
docker volume create --name my-volume
```
lsで確認するとmy-volumeを確認できます。
```zsh
% docker volume ls
DRIVER    VOLUME NAME
~ 省略 ~
local     my-volume
```
## 作成したボリュームをマウントする
作成したボリュームをUbuntuコンテナにマウントしてみます。
```zsh
% docker container run --name ubuntu1 --rm --interactive --tty --mount type=volume,source=my-volume,destin
ation=/my-work ubuntu:22.04
```
そして、以下のようにmy-workディレクトリが作られていることを確認できました。
```
root@f19ae1b369e2:/# ls
bin  boot  dev  etc  home  lib  media  mnt  my-work  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```
ここで、my-workディレクトリ内に新たにファイルを作成してみます。
```zsh
root@f19ae1b369e2:/# echo 'This is test' > /my-work/test.txt
root@f19ae1b369e2:/# ls my-work/
test.txt
```
ubuntu1を削除し、新たにubuntu2コンテナを起動します。ubuntu1でマウントしたmy-volumeを同じようにマウントしてみます。
```zsh
% docker container run --name ubuntu2 --rm --interactive --tty --mount type=volume,source=my-volume,destin
ation=/my-work ubuntu:22.04
```
すると、以下のようにubuntu2でもubuntu1で作成したtest.txtを確認できます。
```zsh
root@211c6f447ab1:/# ls my-work/
test.txt
```

# コンテナにバインドマウントする
Pythonコンテナにホストマシンで作成したファイルをバインドマウントして起動し、実行してみます。まずは、コンテナを起動する前に任意の場所でディレクトリを作成し、月のhello.pyファイルを作成してみます。
```python
print('Hello World')
```
次にこのファイルをバインドマウントしてPythonコンテナを実行します。
```zsh
% docker container run --name python --rm --interactive --tty --mount type=bind,source="$(pwd)",target=/my-work python:3.13.0 bash
```

すると、以下のようにmy-work内にhello.pyがあるので実行してみます。
```zsh
root@e35e3d0ad205:/# ls my-work/
hello.py
```
```zsh
root@e35e3d0ad205:/# python my-work/hello.py
Hello World
```
文字列を出力することができましたね。
ここでコンテナ内でhello.pyを削除するとどうなるでしょうか。
```zsh
root@e35e3d0ad205:/# rm my-work/hello.py
root@e35e3d0ad205:/# exit
exit
% ls
%
```
コンテナでhello.pyを削除すると、自分の環境内からも消えました。
このようにバインドマウントはコンテナの操作がホストマシンに影響するので、利用には注意が必要です。

# ボリュームとバインドマウントの使い分け
以上のことから、ボリュームは
- コンテナのデータを永続的に残したい
- 運用の環境を残したい（DBなど）

などの場合に向いています。

対してバインドマウントは
- 開発でホストマシンにあるファイルが必要な場合

に使えると思います。
ただ、先程見たようにバインドマウントはホストマシンに影響を与えるので、**基本的にはボリュームを使う**ようにしましょう。
Module-LLMでLチカ


## 目的

Module-LLMの側面部に設けられているLEDでLチカを行います。

## 補足
Module-LLMのLEDは、LLMモジュール動作状態とLLMモジュールがアップグレード動作をしているときの状態を簡単に確認するために設けられているものです。

- LLMモジュール動作状態：
-- LED赤：デバイス初期化中
-- LED緑：デバイス初期化完了

- LLMモジュールアップグレード状態：
-- LED青点滅：アプリケーションパッケージ更新中
-- LED赤：アプリケーションパッケージ更新失敗
-- LED緑：アプリケーションパッケージ更新完了


## Lチカの仕方

LEDのデバイスファイルは、Module-LLMのUbuntuOS上で "/sys/class/leds/" にあります。
brightness の値は、通常0から255の範囲で指定します。値が 0 だと消灯、最大の 255 で最も明るく点灯します。

<img src="https://github.com/user-attachments/assets/03ad22df-3e69-4205-bc25-951f82b6a979" width="50%">

```
root@m5stack-LLM:~# echo 100 > /sys/class/leds/R/brightness
root@m5stack-LLM:~# echo 100 > /sys/class/leds/G/brightness
root@m5stack-LLM:~# echo 100 > /sys/class/leds/B/brightness
```

## Pythonから制御

次に、PythonからModule-LLMのLチカを行います。

```
root@m5stack-LLM:~# python3 m5_llm_led.py
```

```m5_llm_led.py
import os

# 各LEDの明るさを設定
def set_led(r=0, g=0, b=0):
    os.system(f"echo {r} > /sys/class/leds/R/brightness")
    os.system(f"echo {g} > /sys/class/leds/G/brightness")
    os.system(f"echo {b} > /sys/class/leds/B/brightness")

# 使用例
set_led(100, 100, 100)  # RGB全て100の明るさに設定
```
Module-LLMの 起動音の消し方

## 目的
Module-LLMの 起動音がやや気になる方向けに、起動音の消し方を説明する。

## 起動音の消し方

デバック基板などからrootへログインを行い、起動音を鳴らしているstartup-scriptのtinyplayの行をコメントアウトします。

```
root@m5stack-LLM:~# vi /usr/local/m5stack/startup-script.sh

#!/bin/sh
. /etc/profile
insmod /lib/modules/4.19.125/led-class.ko
insmod /lib/modules/4.19.125/leds-lp55xx-common.ko
insmod /lib/modules/4.19.125/leds-lp5562.ko
sleep 0.1

echo 0  > /sys/class/leds/R/brightness
echo 50 > /sys/class/leds/G/brightness
echo 0  > /sys/class/leds/B/brightness
#tinyplay -D0 -d1 /usr/local/m5stack/logo.wav > /dev/null 2>&1 &
```
リポジトリとかの作成をcodebergでするようになった。

どうも、こんにちは。
算盤で4級を持つカラオケ館に行く予定の中学生です。
## あらの筋
githubで、組織account作れないいいいいいい(認証がバグってできない。)
↓
よし、[codeberg](https://codeberg.org/)を使おう。
うん、何やってんだろ。

## ということで、
ということで、codebergを使い始めました。
codebergは、おーぷんそーす(?)で自由かつオープンソースな開発を提供しています。
資金は、寄付で成り立ってるそう。

## 使った感想
githubより、使いやすい。
これを見ると、頭がおかしいのか？と思う方もいるでしょう。
もしかしたら、そうなのかもしれません。
### 使いやすい理由
1.日本語対応(githubは未対応です。ちなみにドキュメントはされてないっぽい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837901/5f0e562a-137d-7d43-6858-b4df9f3a8c58.png)

2.gitlab githubと連携できる。(ログインに使える　ログインできなくてもならAPIできる)
3.エクスプローラーが簡単に使える(自分からするとgithubは使いにクーイ)
4.dashbowardから一目で最後のpushやcommit/リポジトリ/組織が確認できる。
5.ユーザ名とは、別に名前を設定できる.(githubは、知らね)
![Screenshot 2024-11-23 19.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3837901/a06f4e89-4799-6d8d-6593-1f4303fb1538.png)

## 結局どうなの？
もうれつに、いい感じ
みんなも使ってね! 使ったら感想おしえてね!
それと、ぜひ　連携アプリでも作ってね!
PIC32MX370F512＋OV7670カメラ　カラートラッキング

# 数回に渡って開発してきたOV７６７０カメラの制御。カラートラッキング。
外付けオシレータにしたら、カメラに供給していたクロックが正確に動作するようになって、きびきび動くようになりました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/zQdthMjMJGc?si=ikoo5fVTqZt4a38k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

:::note warn
動画内でフレームレートを30FPSとしていましたが、誤りで、ただしくは、15fpsでした。
カメラからの出力は、30FPSですが、PIC32MXの処理は、その1/2でした。
動画を削除しようかと思ったのですが、オシレータ設定は正しいので残したいとおもいます。
:::

![241122132127001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/d5fd0ddc-05a3-cba1-e9df-7b165ce980f9.jpeg)

# メインマイコンPIC32MX　I2Cホスト　ピン配
![ピン配.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/bdb0e326-50f5-f328-2422-3f6a78cf7be2.png)

# サブマイコンPIC16F1827 I2Cクライアント(Slave)ピン配
![ピン配1827改.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/325b8a79-0741-2047-39c9-0acff2df3f19.png)

# 全体構成図
![全体構成図改.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/c6f1192b-7d63-ca1d-a3b3-07b20f7a8def.jpeg)


![全体構成図.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/c89d02ea-ca47-94dc-8039-838fe94d82e8.jpeg)

# PIC32MXオシレータ設定
システムクロック120Mhz（PIC32MX最速設定)
<font color="deepPink">外付けのセラロック１０Mhzを付けたことで、REFCLKO端子からカメラに供給するクロックが安定した結果、計算通りのフレームレートで動作させることができるようになりました。</font>

![オシレータ設定図改.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/98eb6033-fda0-afb2-6644-27cccc8cf4d5.jpeg)


# カメラの動き方
矢印は、画面上の動きで、ステッピングモータは180度逆の動きになります。
![ステッピングモータの動き.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/36a11053-1548-fb4a-e5fe-a002a2b15fd7.jpeg)

# フレームレート
![オシロ画像１.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693934/83a44a6a-9ab1-c166-2eef-24bcd0b95772.jpeg)
カメラから送られてくるフレームレートは、30FPS。PIC32MX側は、TFT液晶の転送などで、50msかかります。
なので、実質のレートインターバルは、64msとなり、約15FPSで画像を更新しています。
youtube動画のなかでは、30FPSとなっていますが、間違えていました。

内蔵RCオシレータからセラロックに変えたら、動作が見違えるように改善しました。あらためて、クリスタルオシレータの精度の良さを再認識しました。
redirectとrenderの違い

<h1>redirect_toとrenderの使い方の違い</h1>
この記事は私自身の整理のため記入します。
<h3>1.redirect_toの種類</h3>
<h5>1-1.redirect_to "URL"<h5>
redirect_toの次にURLを使用する。

```erb
redirect_to("/sample/#{@data.id}/sample")
```

URLで直接指定する。
相対パス(..[1っ個上の階層]など)でも可。
#{@data.id}はdataテーブルのidカラムを次の処理などに渡す。(idの内容を引き継ぐ)

```routes.rb
post "sample/:id/sample" => "controller名#action名"
```

こうすることでdata.idを引き継げる。

::: note info
_postとgetの違い_
postは指定したページに飛びつつデータも送る。:idを使用する際に使用。(使用イメージ)
メッセージボディにデータを格納するためデータが保護される。
文字数制限：2048文字
getは指定したページに飛ぶ。(使用イメージ)
データは後ろに記述し送る。データは裸で送る。
文字数制限：なし
**データを送る際はpostを使用する**
:::

<h5>1-2.redirect_to action: :アクション名</h5>
action名で指定
コントローラーを指定せず、アクション名のみを指定した場合、現在のコントローラーの該当するアクションにリダイレクトされる。

<h5>1-3.redirect_to controller: :コントローラー名, action: :アクション名</h5>
コントローラーとアクションを指定する。

<h5>1-4.redirect_to controller: :コントローラー名</h5>
コントローラー名で指定 アクションを指定せず、コントローラー名のみ指定した場合は、<br>
指定したコントローラーのindexアクションに飛ぶ。

<h3>2.render</h3>
使い方はredirect_toと同じ。<br>
アクションを実行せずに飛ぶ。<br>
再実行するときや失敗時などに使用する。

<h3>3.まとめ</h3>
redirectはアクションを実行しページに飛ぶ。<br>
renderは実行せずにページを飛ぶ。

参考元
https://qiita.com/shizen-shin/items/9c470b78430c649d9c7b
https://qiita.com/ryokky59/items/bba97cbfaa899b03e071
Rを学びたい Step11 Excelデータを読み込む

## はじめに
Rを学びたいStep11です。今回はExcelデータを読み込みます。

## 読み込む対象
![スクリーンショット 2024-11-23 19.07.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/5d1545d5-2efc-f054-528f-2fe9d2c97865.png)

## ソースコード

```R:excel_read.r
# パッケージをインストール
install.packages("readxl", repos = "https://cran.rstudio.com/")
library(readxl)  # パッケージの読み込み

# Excelファイルのパスを指定
file_path <- "./user_list.xlsx"

# シートを読み込む（適切なシート名を指定）
data <- read_excel(file_path, sheet = 1)

# データの確認
head(data)
```

```shell:実行結果
    `#` ユーザ名  年齢
  <dbl> <chr>    <dbl>
1     1 user_1      21
2     2 user_2      22
3     3 user_3      23
4     4 user_4      24
5     5 user_5      25
6     6 user_6      26
```
【Qiita Bash】ハイブリットイベントを開催するための配信環境

## はじめに
Qiita では、2024年 11月から**Qiita Bash** というリアルトークイベントをスタートしました。

Qiita Bash は、エンジニアたちが集まり、開催回ごとのテーマについて熱く語り合うリアルトークイベントです！ このイベントをきっかけに、エンジニア同士が交流し、学びを深め、新しいつながりを作る場として、活気に満ちたイベントを目指しています。


2024年現在、Qiita Bashは、オフラインイベントとして開催していますが、のちのちハイブリットイベントにして、オフラインの方々にも、コンテンツをお楽しみいただけるようにしたいと思っています。

そのため、この記事では、Qiita Bashでハイブリットイベントを開催するために、どのような配信環境にしたいと思っているかを紹介します。

## 前提
この記事は、登壇者を公募して行うLTイベント・勉強会を想定しています。
そのため、リアルの会場で投影しているスライド・映像・音声を配信することでハイブリットイベントを開催しようと思っています。

ただ、最小のコストで運用しているので、

## 機材

### 最低限必要なもの
+ スライド投影用PC x 1
+ 配信用PC x 1
+ 投影用ディスプレイ / プロジェクター  x 1
+ キャプチャボード x 1
+ マイク x 1
+ オーディオインターフェース x 1
+ スピーカー x 1
+ 機材同士を繋げるためのケーブル

### あるといいもの

+ カメラ
    + リアルの会場を移すなら


## 配信環境
Qiita Bashでは、配信ソフトはOBSを使おうと思っています。

配信環境のイメージはこんな感じです。

![スクリーンショット 2024-11-23 18.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9b702793-35e9-7e81-de17-e362cebb2d56.png)

- **映像周り**
    1. 登壇者用PCをキャプチャボードを挟んで、投影用ディスプレイ/プロジェクターに接続する
    1. キャプチャボードで投影している映像を配信用PCに送る
    1. 配信用PCでOBSを使い、Youtube等に配信する
- **音声周り**
    1. 登壇者の声をマイクで拾い、オーディオインターフェースを挟んで、スピーカーに繋げる
    1. オーディオインターフェースから、登壇者の声を配信用PCに送る
    1. 配信用PCでOBSを使い、Youtube等に配信する

## まとめ

イベントの参加者数を増やすためにも、ハイブリットイベントを開催するのは不可欠ですが、ネット等で調べても配信をどうやるのかわかりにくいかと思います。

この記事を参考にイベントのハイブリット化を目指してみてください。

また、2024年12月26日に Qiita Bash「アドベントカレンダーお疲れ様会」を開催します!
ぜひアドベントカレンダーに参加している皆さんのご参加をお待ちしております。

https://increments.connpass.com/event/338077

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
祝 .NET 9 リリース

## 2024年11月12日 .NET 9 リリース🎉

C#強々の人たちもSNSで祝福しておられます

https://x.com/okazuki/status/1856652099292889145

<iframe width="560" height="315" src="https://www.youtube.com/embed/4uQUB-98RaU?si=rNotHt6atG_a4fPC" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

### 過去のリリース

私が C# を使わなくなった頃にリリースされたのは .NET 5
.NET 5 は 2020 年にリリースされた。

https://dotnet.microsoft.com/ja-jp/platform/support/policy/dotnet-core

### .NET 6 ～ .NET 9

- [.NET 6 の新機能](https://learn.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-6)
    - .NET MAUI は知っているが、どのくらいの人たちがMAUIを使っているのだろうか
- [.NET 7 の新機能](https://learn.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-7)
- [.NET 8 の新機能](https://learn.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-8/overview)
    - .NET Aspire って何ですか？
- [.NET 9 の新機能](https://learn.microsoft.com/ja-jp/dotnet/core/whats-new/dotnet-9/overview)

## Visual Studio を最新化してみる

だいたい30分くらい待たされる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/e25155c0-45d2-f2da-1fa4-ec33de21ae0a.png)

.NET Core 3.1 から .NET 9 まで勢ぞろい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/8e6766f6-0040-67ed-6219-cb8eb8ac5491.png)

### MAUIが無いではないか！

ワークロードでチェックしてみる・・・12 GB って、容量食いすぎ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/41cb0ef9-8d9e-0cfc-0db5-c1807e24d730.png)

## はじめまして .NET Aspire

対象のプラットフォームを Web にすると、見たことないテンプレートがたくさん出てきた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272511/b17b189d-92b0-4c52-ac0d-61a6269bd82c.png)

https://qiita.com/takashiuesaka/items/f45e930ef296c5710acc

### @okazuki 老師のデモ動画

<iframe width="560" height="315" src="https://www.youtube.com/embed/Cm7mqHZJIgc?si=phnxY4Sy-pUfxN4m" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## おわりに

来年も忘れてなければ Qiita アドベントカレンダー C# をつくります

## 糸冬了！！