OmniAICreator/Qiita-1.07M huggingface dataset:
windows11で、sketchup6 その40

# 概要
windows11に、sketchup6を入れてみた。
rubyで、3Dを書く。
練習問題、やってみた。

# 練習問題
sketchupで、ツールのテストを実行する、rubyスクリプトは

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/73e1802c-7c0d-43d6-a1bb-4c0d7aa6114e.png)


# サンプルコード
起動　Sketchup.active_model.select_tool ViewToolTests.new

```

require 'sketchup.rb'

class ViewToolTests
	def activate
		puts "activate called"
		@counter = 0
		@ip1 = Sketchup::InputPoint.new
	end
	def deactivate(view)
		puts "deactivate called"
	end
	def onLButtonDown(flags, x, y, view)
		view.invalidate
	end
	def draw(view)
		puts "draw called"
		case @counter
		when 0
			point1 = Geom::Point3d.new 0, 0, 0
			point2 = Geom::Point3d.new 10, 10, 10
			status = view.draw_lines point1, point2
			@counter += 1
		when 1
			point3 = Geom::Point3d.new 0, 0, 0
			status = view.draw_points point3, 10, 1, "red"
			@counter += 1
		when 2
			point4 = Geom::Point3d.new 0, 0, 0
			point5 = Geom::Point3d.new 10, 10, 10
			status = view.drawing_color = "red"
			status = view.draw_lines point4, point5
			@counter += 1
		when 3
			point6 = Geom::Point3d.new 0, 0, 0
			point7 = Geom::Point3d.new 10, 0, 0
			view.line_width = 10
			status = view.draw GL_LINES, [point6, point7]
			@counter += 1
		when 4
			point8 = Geom::Point3d.new 0, 0, 0
			point9 = Geom::Point3d.new 10, 10, 10
			view.line_stipple = "-.-"
			status = view.draw_lines point8, point9
			@counter += 1
		when 5
			point10 = Geom::Point3d.new 0, 0, 0
			point11 = Geom::Point3d.new 10, 10, 10
			view.line_width = 10
			status = view.draw_lines point10, point11
			@counter += 1
		when 6
			point16 = Geom::Point3d.new 0, 0, 0
			status = view.draw_text point16, "This is a test"
			@counter += 1
		when 7
			point17 = Geom::Point3d.new 0, 0, 0
			point18 = Geom::Point3d.new 10, 0, 0
			view.line_width = 10
			status = view.set_color_from_line point17, point18
			status = view.draw_lines point17, point18
			@counter += 1
		when 8
			point12 = Geom::Point3d.new 0, 0, 0
			point13 = Geom::Point3d.new 10, 10, 10
			point14 = Geom::Point3d.new 20, 20, 20
			point15 = Geom::Point3d.new 30, 30, 30
			status = view.draw_polyline point12, point13, point14, point15
			UI.messagebox status
			@counter += 1
		when 9
			UI.messagebox "ok"
			@counter += 1
		end
	end
end





```

以上。
JavaScriptの ||・?? の違い、Rubyの ||を解説

##  truthy / falsy とは？
JavaScript（や Ruby などの動的型付け言語）では、**値を論理的に評価（Boolean評価）したときに true になるか false になるか**によって、以下のように分類されます。
- **truthy（トゥルーシー）**：Booleanで評価すると true になる値
- **falsy（フォールシー）**：Booleanで評価すると false になる値

これは if (...) {} や ||, ??, ! などの評価でよく使われます。

## JSの || と ?? の違いまとめ（全 falsy 値パターン付き）
```js
console.log("false || 'default' =>", false || "default");     // "default"
console.log("false ?? 'default' =>", false ?? "default");     // false

// 0
console.log("0 || 'default' =>", 0 || "default");             // "default"
console.log("0 ?? 'default' =>", 0 ?? "default");             // 0

// 空文字 ""
console.log('"" || "default" =>', "" || "default");           // "default"
console.log('"" ?? "default" =>', "" ?? "default");           // ""

// null
console.log("null || 'default' =>", null || "default");       // "default"
console.log("null ?? 'default' =>", null ?? "default");       // "default"

// undefined
console.log("undefined || 'default' =>", undefined || "default"); // "default"
console.log("undefined ?? 'default' =>", undefined ?? "default"); // "default"

// NaN
console.log("NaN || 'default' =>", NaN || "default");         // "default"
console.log("NaN ?? 'default' =>", NaN ?? "default");         // NaN
```

JavaScript の falsy 値一覧:
- false
- 0
- ""（空文字）
- null
- undefined
- NaN


JSの `??` は、左辺が null または undefined のときに右側を返す という演算子。
false や 0 を「ちゃんと値として扱いたい」ときに使えるのが `??`


## Rubyの `||` の基本挙動

Ruby では `||` は **左側が「偽（false または nil）」なら右側を使う** という挙動です。

```ruby
puts nil || "default"    # => "default"
puts false || "default"  # => "default"
puts "" || "default"     # => "" （空文字は truthy）
puts 0 || "default"      # => 0 （0 も truthy）
```
Ruby では false と nil 以外は truthy（真） とみなされるらしいです。

### Rubyで || を複数並べた場合
Ruby では a || b || c のように複数書いたとき、**最初に truthy な値が返される。**

```ruby
puts nil || false || "value"     # => "value"
puts false || nil || 0           # => 0
puts nil || "first" || "second"  # => "first"
```


### Rubyで ?? 的なことをやるには？
Ruby には ?? はありませんが、nil? を使えば似たことができます。

```ruby
def null_coalesce(val, default)
  val.nil? ? default : val
end

puts null_coalesce(nil, "default")   # => "default"
puts null_coalesce(false, "default") # => false
puts null_coalesce(0, "default")     # => 0
```

### 終わりに
株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら

https://www.wantedly.com/companies/xincere-inc/stories

弊社には年間100人程度の実務未経験の方に応募いただき、技術面接を実施しております。
この記事が少しでも学びになったという方は、ぜひ wantedly のストーリーもご覧いただけるととても嬉しいです！
個人的備忘録：MySQLのユーザー権限設定で ERROR 1410 に遭遇した件を自分なりに調べてみた

## はじめに
MySQLでアプリケーションからデータベース接続を行おうとした際に、`GRANT` 文を使ってユーザーに権限を与えようとしてエラーが発生することがあります。

本記事では、「ERROR 1410: You are not allowed to create a user with GRANT」というエラーが出たときの原因とその対処方法について、具体的なステップを交えて解説します。

## 書こうと思ったきっかけ
DockerコンテナからMySQLに接続するFlaskアプリケーションを構築中、MySQLユーザーに権限を与えようとして「ERROR 1410」が発生しました。

:::note warn
**一見、正しいユーザーでログインしているにもかかわらず権限付与が失敗する原因を調査し、MySQL 8.x の仕様変更が関係していることがわかりました（自分調べ）。**
:::

そこで、同じような環境で困っている方の参考になればと思い、この記事を書くことにしました。

## MySQLで「ERROR 1410: You are not allowed to create a user with GRANT」が出たときの対処法

### ■ 発生したエラー
```sql
ERROR 1410 (42000): You are not allowed to create a user with GRANT
```
このエラーは以下のSQLを実行した際に発生：
```sql
GRANT ALL PRIVILEGES ON flask_db.* TO 'root'@'%';
```

### ■ 調査と前提条件
- `SELECT CURRENT_USER();` の結果： `root@localhost`
- `SHOW GRANTS FOR 'root'@'localhost';` の結果： `WITH GRANT OPTION` が付与されている

上記より、**root@localhost は完全な権限を持っている**ことが確認できた。

### ■ 原因
MySQL 8.x 以降のセキュリティ強化により:
- `GRANT ... IDENTIFIED BY` の構文が実行できない
- `'user'@'%'` というホスト指定での`GRANT` も制限される場合がある

### ■ 解決策 (OpenCanvas)

#### Step 1: ユーザーの新規作成
```sql
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
```

#### Step 2: 権限の付与
```sql
GRANT ALL PRIVILEGES ON flask_db.* TO 'flaskuser'@'%';
FLUSH PRIVILEGES;
```

#### Step 3: Flaskアプリ側の修正
`app.py`
```python
def get_db_connection():
    return mysql.connector.connect(
        host='192.168.1.11',
        user='flaskuser',
        password='flaskpass',
        database='flask_db'
    )
```

### ■ ポイント
- `root` ユーザーをアプリに使わない
- `%` ホストはDockerなどの外部接続用に適している
- ホストの範囲や権限は本番環境では精密に設定する

## まとめ
MySQLでユーザー権限を設定する際は、バージョンによる構文の違いやセキュリティ仕様の変更に注意が必要です。

:::note warn
***MySQL 8.x以降では、`GRANT`と`IDENTIFIED BY`を組み合わせることができないなどの制限があり、従来通りの方法ではエラーになることがあります（自分調べ）。***
:::

アプリケーション用には専用のユーザーを作成し、必要な権限だけを与えることで、より安全で柔軟な設計が可能になります。

今後も同様のエラーが発生した場合に備えて、手順や原因を明確にしておくことが大切です。この記事が、開発中にMySQLと格闘している方の助けになれば幸いです！
個人的備忘録：MySQLでユーザー作成に失敗！？パスワードポリシーによるERROR 1819の対処法

## はじめに
MySQLで新しいユーザーを作成しようとした際、思わぬエラーが発生することがあります。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

特に開発環境構築時に `CREATE USER` コマンドでエラー1819が出た経験があり、毎回調べ直すのを避けるために、ここに対応方法を備忘録としてまとめておきます。

## 書こうと思ったきっかけ
Docker上のMySQLにFlaskアプリ用ユーザーを作成しようとしたところ、パスワードが簡単すぎると判定され、ユーザー作成に失敗しました。これは `validate_password` プラグインの影響によるもので、初見だと戸惑うポイントでした。

## エラーの内容
```sql
mysql> CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```
このエラーは、指定したパスワードがMySQLのセキュリティポリシーに違反していることを意味します。

## 解決方法

### 方法1：強いパスワードを使う（推奨）
MySQLが求めるパスワード要件の一例：
- 8文字以上
- 英大文字・小文字・数字・記号をすべて含む

```sql
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'Flask@123!';
```

### 方法2：パスワードポリシーを一時的に緩める（開発環境用）
```sql
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 6;
```
その後、以下を再実行：
```sql
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
```
※ 上記の設定はセッションごとの一時設定です。

### 方法3：ポリシーを永続的に変更する（非推奨／開発専用）
`/etc/my.cnf` や `/etc/mysql/mysql.conf.d/mysqld.cnf` に以下を追記：

```ini
[mysqld]
validate-password-policy=LOW
validate-password-length=6
```

設定変更後は MySQL を再起動してください。

## まとめ
`ERROR 1819` は、MySQLのセキュリティ機能が有効に働いている証拠です。

:::note warn
***運用環境では強いパスワードを使用することが推奨されますが、開発用環境では一時的にポリシーを緩めて作業効率を上げることも選択肢の一つです。***
:::

ポリシー緩和は計画的に使いこなしていきましょう！
個人的備忘録：MySQLで「You must reset your password」エラーが出たので、自分の環境で解決してみた

## はじめに
MySQLの初期セットアップ時、rootユーザーのパスワードが期限切れ状態で設定されていることがあり、操作が制限されるケースがあります。この記事では、そのエラーの内容と対処法を簡潔にまとめます。

## 書こうと思ったきっかけ
新しいMySQL環境で `show databases;` を実行した際、パスワードの変更を促すエラーに遭遇しました。初めて見ると戸惑うエラーなので、今後のために対応手順を残しておこうと思いました。

## エラーの内容
MySQL初期設定後、以下のようなエラーが表示される場合があります：

```sql
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
```

## 解決方法：ALTER USERでパスワードを変更
```sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass123!';
```

その後、ログアウトして再度ログインすることで、通常どおりMySQLを利用できるようになります。

## まとめ
このエラーは、MySQLのセキュリティ機能により初期パスワード変更が強制される仕様です。慌てず `ALTER USER` を使ってパスワードを再設定すれば解決できます。開発や検証環境であっても、パスワードの管理はしっかり行うよう心がけましょう。
個人的備忘録：FlaskアプリでMySQL接続に失敗したときのログと解決記録をまとめてみた

## はじめに

FlaskアプリケーションからMySQLに接続しようとした際、「Host is not allowed to connect to this MySQL server」というエラーに直面することがあります。

:::note info
**このエラーは、MySQLのホスト制限によりアクセスがブロックされていることが原因です。**
:::

この備忘録では、実際に発生したエラーメッセージとその解決方法、そしてアプリケーション専用ユーザーの作成手順について記録しています。今後同様のエラーに遭遇した際、素早く対処できるようにまとめました。

---

## 接続エラーの原因と解決

```plaintext
mysql.connector.errors.DatabaseError: 1130: Host '192.168.1.5' is not allowed to connect to this MySQL server
```

### このエラーメッセージのポイント：
MySQLサーバーがクライアント（この場合は `192.168.1.5`）からの接続を拒否しています。
これは **MySQLユーザーのホスト制限** により、指定のIPアドレスから接続する許可がされていないためです。

### 解決方法：
以下のようにして **特定のホストまたは全ホスト（`'%'`）からの接続を許可** する必要があります。

```sql
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
GRANT ALL PRIVILEGES ON flask_db.* TO 'flaskuser'@'%';
FLUSH PRIVILEGES;
```

必要に応じて、`@'192.168.1.5'` のように、特定のIPからの接続だけを許可する設定も可能です。

---

## アプリケーション専用ユーザー作成のベストプラクティス

MySQLのセキュリティを強化するには、rootユーザーを直接使わず、アプリケーション専用のユーザーを作成して接続するのが安全です。

### ユーザー作成と権限付与
```sql
CREATE USER 'flaskuser'@'%' IDENTIFIED BY 'flaskpass';
GRANT ALL PRIVILEGES ON flask_db.* TO 'flaskuser'@'%';
FLUSH PRIVILEGES;
```

### Flaskアプリ側の接続設定（app.py）
```python
def get_db_connection():
    return mysql.connector.connect(
        host='192.168.1.11',
        user='flaskuser',
        password='flaskpass',
        database='flask_db'
    )
```

---

## まとめ
このセットアッププロセスは、MySQLサーバーを本番運用に耐えうる状態へと近づける重要な手順です。特に匿名ユーザーの削除やテストDBの削除、パスワードの設定はセキュリティ強化に不可欠です。

:::note warn
***また、アプリ専用ユーザーを作成して接続させることで、root権限の濫用を避けることができ、より安全な運用が実現できます。***
:::

今後は、これに加えてファイアウォールの設定やMySQLユーザー管理、外部アクセス制御なども含めて、より堅牢な構成を目指していきたいと思います！
個人的備忘録：mysql_secure_installation 実行ログと設定内容を簡単に整理してみた

## はじめに
MySQLをインストールした直後に実施される `mysql_secure_installation` は、セキュリティ強化のために必要な初期設定を対話形式で行う便利なツールです。

この記事では、自分用のログ記録と理解のために、実行時の流れを整理して記録しておきます。

---

## 実行ログとその内容
以下は、MySQLインストール直後に `mysql_secure_installation` を実行した際のログです。

```
[root@vbox ~]# sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password:
Re-enter new password:
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
... skipping.

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : n
... skipping.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!
```

---

## 簡単な説明とポイント
- **パスワード設定**：初期 root ユーザーのパスワードが期限切れのため、新たに設定。
- **匿名ユーザー削除**：匿名ログイン可能なユーザーを削除。
- **リモート root ログインの可否**：今回は許可（セキュリティの観点では非推奨）。
- **テストデータベース削除**：testデータベースとそのアクセス権限を削除。
- **権限テーブルの再読み込み**：設定を即時有効化。

---

## まとめ
このセットアッププロセスは、MySQLサーバーを本番運用に耐えうる状態へと近づける重要な手順です。特に匿名ユーザーの削除やテストDBの削除、パスワードの設定はセキュリティ強化に不可欠です。

:::note info
***ログの記録を残しておくことで、次回以降の実行時にも迷わず対応できます。***
:::

今後は、これに加えてファイアウォールの設定やMySQLユーザー管理、外部アクセス制御なども含めて、より堅牢な構成を目指していきたいと思います。
OIDC

外部ユーザーのAWSリソースへのアクセス
--
・外部のIDプロバイダー（IdP）で認証されたユーザーは、取得したIDトークンを使用して、AWSのSecurity Token Service（STS）のAssumeRoleWithWebIdentity APIを呼び出す

・このAPI呼び出しにより、一時的なセキュリティ認証情報（アクセスキー、シークレットキー、セッショントークン）が発行され、ユーザーはこれを用いてAWSリソースにアクセスが可能となる

サムプリントの目的
--
・サムプリントは、外部IdPのサーバー証明書のSHA-1ハッシュ値であり、AWSがそのIdPの真正性を検証するために使用される

・具体的には、AWS IAMでOIDC IDプロバイダーを設定する際に、このサムプリントを登録し、AWSとIdP間の通信時に、提供されたサーバー証明書が事前に登録されたサムプリントと一致するかを検証します。 

サムプリントの使用タイミング
--
・サムプリントは、AWSがIdPのサーバー証明書の真正性を確認する際に使用されますが、これは主にAWSとIdP間の信頼関係を確立するためのもの

・ユーザーが実際にAWSリソースにアクセスする際には、サムプリントは直接使用されません。代わりに、前述の一時的なセキュリティ認証情報が使用される

以下が一番わかりやすかった
https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe

https://openid.net/developers/how-connect-works/
個人的備忘録：.dmgファイルとは何か？macOSの仮想ディスクがよく分からなかったのでアウトプットしてみた

## はじめに
macOSを使っていると頻繁に目にする拡張子 `.dmg`。アプリをインストールする際によく使われる形式ですが、Windowsユーザーには馴染みが薄く、macOS初心者にとっても扱い方が曖昧なことがあります。

:::note info
**個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。**
:::

この記事では `.dmg` の基本と取り扱い方について、自分用に整理しておきます。

---

## 書こうと思ったきっかけ
新しいMacをセットアップしていた際に、アプリの配布ファイルとして `.dmg` をいくつも扱うことがありました。そのたびに「これって何のためにあるの？」と思ったため、基礎から整理しておくことにしました。

---

## .dmgとは？
`.dmg` は「Disk Image」の略で、macOS向けの仮想ディスクイメージファイルです。Windowsでいうところの `.iso` に近い役割を持ちます。以下のような特徴があります。

- 仮想的な「マウント可能なディスク」として扱われる
- アプリのインストーラーやソフト配布によく使われる
- マウントすると Finder 上に「新しいドライブ」として表示される

**参考文献**

https://note.com/4ddig_japan/n/n996cb778fc03

https://4ddig.tenorshare.com/jp/mac-recovery-solutions/how-to-open-dmg-file.html?utm_source=4ddig-note.com&utm_medium=social&utm_campaign=4DDIG%20Mac&utm_term=note-zwy-20240912&utm_content=dmg%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%20%E9%96%8B%E3%81%8D%20%E6%96%B9

---

## よくある使い方
1. `.dmg` ファイルをダブルクリックするとマウント（開く）される
2. 中に `.app` ファイル（アプリ本体）や、Applications フォルダへのショートカットが入っている
3. ユーザーは `.app` を Applications フォルダにドラッグしてインストール
4. マウントを解除（右クリック → 取り出す）し、`.dmg` は削除しても問題なし

---

## 注意点
- `.dmg` のままではアプリは使用できず、インストールが必要
- マウント中は仮想ディスクとして扱われるため、不要になったら必ず「取り出す」
- ウイルスが仕込まれているケースもあるので、信頼できる配布元からのみダウンロードすること

---

## まとめ
`.dmg` ファイルはmacOS特有の仮想ディスク形式であり、アプリケーションの配布やインストールに欠かせない存在です。**単なる圧縮ファイルではなく「仮想ディスク」である点がポイントで、操作に少しクセがあるため初心者は戸惑うこともありますが、基本的な流れを押さえておけば問題なく使いこなせます。**
フィードURLを取得してくれるツールを作成してみた。


自分専用のアプリが欲しかったので作ってみました。

動けばいいと思って作ったので、手抜きです。

↓このような感じです。Dockerで動かせるようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3304752/7b789c23-6db2-4e90-be29-52795313b0cf.png)

https://github.com/naomina121/rssfeed_search
【第１３回 JTP 贄川佳大さん】2024 Japan AWS Jr. Champions インタビュー企画

こんにちは！2024 Japan AWS Jr. Championsのtekutaです！
AWS Japanが6月に開催したAWS Summit Japanにて、2024 Japan AWS Jr. Championsが発表されました。Jr.Championsは、AWSを積極的に学び、アクションを起こし、周囲に影響を与えている若手エンジニア向けの表彰プログラムとなっております。Jr.Championsについて多くの方に知ってもらいたいため、表彰された方々にインタビューをしていきます。
第13回目は、JTPの贄川佳大さんです！！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310014/2e2b7840-8304-48b7-a9f6-4af16254f827.jpeg" width=70%>

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions/

# 質問１：これまでの経歴、現在の業務、AWSを知った経緯を教えてください。
1年目はオンプレミスのシステムの運用保守業務に従事しておりました。2年目はAWS Jr.Championsに表彰されたことがきっかけで、AWSシステムのインフラ設計構築業務を従事しております。
AWSを知ったきっかけは、入社前の勉強項目として会社から紹介があったことです。

# 質問２：Jr.Championsを目指した理由、選出につながったと考える活動があれば教えてください。
クラウドに関する仕事で課題解決をしたいと考えておりました。自身の仕事内容を変えるためには、AWSでの取り組みがきっかけにつながると考えたため、Jr.Championsを目指しました。
選出につながった理由は主にAWS認定取得とAWS認定の社内勉強会を開催したことと考えます。

# 質問３：Jr.Championsとして現在どのような活動をしていますか。
Jr.Championsのイベント登壇やコミュニティ活動を行っています。コミュニティはAWS Well-Architectedの関するイベントのリードをしています。

# 質問４：Jr.Championsに選出されてよかったことはありますか。
社外のAWSエンジニアと会話する機会が増えたことです！仕事はリモートワークがメインであまり交流がなかったため、表彰されたことで交流の幅が広がり、普段は得られない発想や経験が多くありました。

# 質問５：Jr.Championsに選出されて大変だったことはありますか。
活動外になりますが、次期Jr.Championsの選出に向けた宣伝活動をしており、モチベーションを伝えることに苦戦しています。Jr.Championsは素晴らしい経験が得られる表彰プログラムなので、多くの方に目指してもらいたいと考えております！

# 質問６：Jr.Championsと併せてAll Certifications Engineersも受賞おめでとうございます！目指そうと思ったきっかけを教えてください。また、勉強法もあれば教えてください。
Jr.Championsと同様で、自身の仕事内容を変えるためには、AWSでの取り組みがきっかけにつながると考えたためです。
市販の資格対策本や外部の問題集を活用して勉強しました。また、サービスの理解を深めるために、Blackbeltの動画を見ることも有効でした。加えて、AWS認定全冠を何人かで目指して切磋琢磨することもモチベーションにつながります！

# 質問７：All Certifications Engineersに選出されてよかったことはありますか。
結果として、当初の目標としていたAWSの業務に携わることができたことです！また、表彰で自身の名前が載ったページを両親に見せたら、とても褒めてもらえました（笑）

# 質問８：今後の夢や目標はありますか。
AWS未経験者へのトレーニング等登壇を依頼される機会が増えているので、人前でプレゼンテーションをする仕事に取り組んでいきたいと考えております。また、AWSの取り組みも継続して、ゆくゆくはTop Engineersも目指していきたいです。

# 質問９：Jr.Championsを目指す若手に向けてメッセージをお願いします。
どんなことでもいいのでまずは社外でチャレンジすることです！社外から刺激を受けましょう！

# 質問１０：全体を通しての質問
## 好きなAWSサービスはなんですか。
Amazon S3です。
イレブンナインの耐久性はシンプルにかっこよく、重要な機能だと思います！また、これほど高機能なサービスを当たり前のように利用できていることが、AWSの素晴らしいポイントと再認識しますね（笑）

# 最後に
社会人2年目でJr.Championsに表彰されているため、入社時からAWSについて積極的に発信しているというレベルの高さに驚きました。（投稿主は1年目なにもしていませんでした笑）今後は人前で話すことに取り組んでいきたいと意気込んでいたので、いろいろな場所で見かけることができることをとても楽しみにしています！

次回もぜひご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310014/55587067-d8e8-4b6f-a8b0-5a3a82caf680.png)
Go ランタイムのメモリ管理：mmap と sbrk

C 言語の `malloc()` を実装するのに古典的な `sbrk()` は使われなくなりました。Go 言語では C 言語のライブラリ (libc) は使わずに独自にメモリを管理しているので、その状況を調べました。

:::note info
Claude 3.7 Sonnet による調査結果をベースに編集した記事です。
:::

本記事と関連して、メモリ割り当ての詳細や GC についても調査した記事があります。

https://qiita.com/7shi/items/510653e0c0e28411cc9d

# 概要

Go ランタイムは現在、主要なプラットフォームではメモリ割り当てに `mmap` システムコールを使用しています。古典的な `sbrk` システムコールの実装が含まれていますが、その具体的な経緯についての詳細なドキュメントは限られています。

本記事では、利用可能な情報を基に Go のメモリ管理についての調査結果をまとめます。

# 古典的な UNIX のメモリ管理

かつて UNIX のプロセスメモリモデルはシンプルで、text（コード）、data（初期化されたデータ）、bss（ゼロ初期化されたデータ）、スタックから構成されていました。ブレークアドレスは bss の末端、つまりプロセスのデータセグメントと未使用領域の境界アドレスに位置していました。

16 ビットの PDP-11 でのメモリ状況を示します。

アドレス|セグメント
|---:|----|
|0000|text|
||data|
||bss|
|break (初期)|(未使用)|
|～FFFF|スタック|

プログラムが追加のメモリを必要とする場合、`brk()` または `sbrk()` システムコールを使ってこのブレークアドレスを変更するよう、OS に要求していました。この仕組みにより、C 言語の `malloc()` などの動的メモリ割り当て関数が実装されていました。

アドレス|セグメント
|---:|----|
|0000|text|
||data|
||bss|
||ヒープ|
|break (変更後)|(未使用)|
|～FFFF|スタック|

:::note info
FFFF 付近には `main()` 関数に渡すコマンドライン引数などの情報が入っています。詳細は以下の記事を参照してください。
:::

https://qiita.com/7shi/items/71532036c53d321a2b17

## `mmap` の導入

4.2BSD で `mmap()` が導入され、プロセスのメモリ空間内の未使用の場所にページ単位で仮想メモリを追加（および削除）できるようになりました。これにより、メモリ割り当てライブラリは様々な方法でこの新機能を活用できるようになりました。

メモリ割り当てに `mmap()` を使用することには、いくつかの利点があります。

1. **柔軟性**: アドレスを指定してメモリを割り当てることができる
2. **独立性**: 各 `mmap()` 割り当ては他のコードと競合せず、個別に操作できる
3. **効率性**: 大きなメモリブロックの割り当てや解放が簡単
4. **アドレス空間の制約**: 64 ビットシステムでは、アドレス空間を使い果たす心配が少ない

# Go ランタイムのメモリ管理

Chris Siebenmann 氏の[ブログ記事](https://utcc.utoronto.ca/~cks/space/blog/unix/SbrkVersusMmap)より

> For example, the Go runtime allocates all of its memory through `mmap()`.

（訳：例えば、Go ランタイムはすべてのメモリを `mmap` を通じて割り当てています。）

この記述から、少なくとも主要なプラットフォームでは、Go ランタイムは現在メモリ割り当てに `mmap()` を採用していることがわかります。

関連するソースコードは以下で確認できます。

- [mmap.go](https://go.dev/src/runtime/mmap.go)

## プラットフォーム依存の実装

Go のソースコードを調査すると、[mem_sbrk.go](https://go.dev/src/runtime/mem_sbrk.go) というファイルが存在し、次のビルドタグを持っています。

```go
//go:build plan9 || wasm
```

これは、Plan 9 と WebAssembly (wasm) では、`sbrk` ベースのメモリ管理が使われていることを示しています。この実装は、これらの特定のプラットフォームの要件または制約に対応するためと考えられます。

## デバッグオプション

現在の Go ランタイムには、`GODEBUG=sbrk=1` というデバッグオプションがあります。[公式ドキュメント](https://pkg.go.dev/runtime)より

> `sbrk`: setting `sbrk=1` replaces the memory allocator and garbage collector with a trivial allocator that obtains memory from the operating system and never reclaims any memory.

（訳：`sbrk`: `sbrk=1` を設定すると、メモリアロケータとガベージコレクタが、OS からメモリを取得して決して回収しない単純なアロケータに置き換えられます。）

このオプションは主にデバッグ目的で、バグのあるコードを診断するための一時的な回避策として使用されます。

## 移行の経緯

Go ランタイムが `brk` から `mmap` に移行した具体的なコミット履歴や、いつ、どのバージョンでこの移行が行われたかについての明確な記録は見つかりませんでした。

いくつかのGitHub Issueでは、`GODEBUG=sbrk=1` 使用時の問題が報告されています。

- [Issue #33159](https://github.com/golang/go/issues/33159): `GODEBUG=sbrk=1` 使用時の Linux/ARM でのセグメンテーションフォールト
- [Issue #53887](https://github.com/golang/go/issues/53887): `sbrk` モードでのクラッシュ

これらの問題は、`sbrk` ベースのメモリ管理がもはやメインラインの実装ではなく、完全にサポートされていないことを示唆しています。

# まとめ

現在、Go ランタイムは主要プラットフォームではメモリ割り当てに `mmap` を使用しており、古典的な `sbrk` は主にデバッグ目的または一部の特殊なプラットフォーム（Plan 9 や WebAssembly）でのみ使用されています。

この移行は Go の初期の開発段階で行われたと思われますが、具体的なコミット履歴やバージョン情報は公開された資料からは確認できませんでした。
Geminiで犬を描いてみた。

# 概要

Geminiで犬を描いてもらいました。

# 実装

```
虹色の犬を描いてみてください。
```

![虹色の犬_20250403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6e04b87f-a47b-4b61-9bb5-2da139f76633.png)

```
赤色の犬を描いてみてください。 
```

![赤色の犬_20250403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/b39b74c8-4c85-49c2-be46-aacb2e5feeda.png)

```
青色の犬を描いてみてください。
```

![青色の犬_20250403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/6a1438e8-9eb9-400f-8c2d-9956cf6eccd3.png)

```
銀色の犬を描いてみてください。
```

![銀色の犬_20250403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/c716c0a9-300b-450f-b176-53959affa875.png)

```
金色の犬を描いてみてください。
```

![金色の犬_20250403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/06c9c98c-5242-4acb-b4f0-caf110643599.png)

赤とか青はちょっと違うかなとも思いますが、基本的にいい感じです。
詳細な指定が必要かも。

# まとめ

何かの役に立てばと。
a要素について

## a要素について
・a要素は錨（いかり）を表す英単語のanchorの頭文字
・ハイパーリンクを表す要素
※ハイパーリンク：クリックすると別のページや同一ページの特定の個所などに表示が移動するテキストや画像のこと。
・使用する場合はhref属性を記述する
リンク先のパス（ファイルなどの所在やURL）を指定する属性。a要素にtarget属性を設定すると、リンクしたページを表示させる方法を指定することができる
（target属性を_blankと指定すると新規タブで開く）

## 絶対パスと相対パスについて
### 絶対パス
ドライブやシステムの最上位ディレクトリから目的のディレクトリ（フォルダ）やファイルまでの道筋を省略なくすべて記述する方法。操作しているファイル自体の階層を移動しても指定したパスを変更する必要がない。
（URLも絶対パスのひとつ）

### 相対パス
現在操作しているファイルが格納されているカレントディレクトリを起点に相対的に目的のディレクトリやファイルまでの道筋を記述する方法。
現在のディレクトリと同じ階層の場合はそのままディレクトリ名やファイル名を記述するか <strong> ./ </strong>で同じ階層であることを表す。一つ上のディレクトリの場合は<strong> ../ </strong>であらわす。

```html
<!--絶対パス(URL)でリンク先を指定-->
<p><a href="https://hogehoge.jp/">hogehogeはこちら</a>をクリック</p>
<!--target属性を使用して新規タブでリンク先を表示-->
<p><a href="https://hogehoge.jp/" target="_blank">hogehogeはこちら</a>をクリック</p>
<!--相対パスでリンクを指定-->
<p><a href="../../hoge.html">hogehogeはこちら</a>をクリック</p>
```

## ページ内リンク
同じページ内の特定の部分に遷移するリンクのこと

・ジャンプの到着地点になるタグに任意の値のid属性を設定する
・ジャンプの出発地点となるa要素のhref属性には <strong>#id名</strong>を指定する（#というのはidを表す記号。）
```html
<p id="top"> HTMLを学ぼう</p>
（省略）
<a href="#top">トップへ戻る</a>
```

#### 参照
・SLスタジオよりhttps://sls.ideal-growth.jp/
memory-bankを一括で読み込むMCP serverを作った

これです
https://www.npmjs.com/package/memory-bank-loader-mcp

![screenshot.png](https://github.com/abeyuya/memory-bank-loader-mcp/blob/main/docs/screenshot.png?raw=true)

```json
{
  "mcpServers": {
    "memory-bank-loader": {
      "command": "npx",
      "args": [
        "-y",
        "memory-bank-loader-mcp@latest",
      ],
    }
  }
}
```

## 作った経緯

- この記事を拝見して「天才じゃん」となった
  - [[Cline] Memory Bank を一括読み込みする MCP を作ってみた](https://zenn.dev/heavenosk/articles/memory-bank-mcp-loader)
- 是非使いたいと思ったが、そのまま使える状態では公開されていなさそうだった
- MCPサーバー作成の初挑戦にちょうど良さそうな題材だと思い自作した

## 工夫したところ

https://github.com/abeyuya/memory-bank-loader-mcp/blob/8aad22f/src/index.ts#L117

このdescriptionのテキストを工夫した。
AI agentはこのdescriptionを読んでtoolを使用するかどうかを判断している。

最初用意していたdescriptionだとAI agentは自動ではこのtoolを使ってくれず、従来のやり方でmemory-bankを読んでしまっていた。
「このtool使って」と指示すれば使ってくれるのだが、毎回それだとめんどくさい...
Instructionsとかrulesにそこまで書いておけば毎回指示しなくて済むのだろうが、そんなこと書きたくないし...

これについては直接AI agentに「どうしてタスク開始時にmemory-bankを読むときにこのtoolを使わなかったんですか？」みたいなことを聞いて試行錯誤した。

![スクリーンショット 2025-04-03 1.52.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7694/623469aa-1f01-4448-b555-6694babcc0eb.png)
(AI agentはこちらの記事を参考にギャル化されている [ギャルとのペアプロが想像以上に楽しかった（VSCodeのカスタム指示）](https://qiita.com/bonanza-olaf/items/5453fc0e3ad1c8f9f971))

このdescriptionは例えばclineでは直接システムプロンプトに組み込まれるので、contextを抑えるためにあまり文面が長くない方が良いなとは思いながら作った。
https://github.com/cline/cline/blob/8cd50e7/src/core/prompts/system.ts#L410

(cursorでMCPサーバーをいくつか入れているとtoolが合計で40個までしか登録できないというメッセージが出てくるが、context節約のための制限なのかなと思った。)

## 課題

- MCPには[resources](https://spec.modelcontextprotocol.io/specification/2025-03-26/server/resources/)という仕様があるのでtoolじゃなくてこれでも表現できそうな気もしたんだけど、上手く動かなかったので諦めた
  - https://github.com/modelcontextprotocol/typescript-sdk?tab=readme-ov-file#resources
- 手元のCline, Roo Codeでgemini 2.5とかで使う分にはほぼこのtool使ってくれているのだが、cursorだとどうも発動率が悪い感じはしている

## 感想

AI agentにやってほしいことを事前に見越して、あらかじめそれ用のtoolを用意しておいて使ってもらうという挙動は結構面白いなと思った。
今回はmemory-bankの読み込みがそれだったが、他にも活用の道がいろいろあるように感じた。

> 実質 MCP を作業フローの Custom Instructions として活用したような気がしてます。こういう手法もアリかも

開発のきっかけとなったヘブンさんの記事にこのような言及があったが、同じことを感じた。
例えばgit commit時の文面のフォーマットを指定したい場合、今だとInstructionsとかrulesに記述すると思う。代わりにリポジトリ専用のローカルなMCPサーバー等を作成して、そのフォーマットを実現するためだけの `git-commit` toolを作るのもナシではないなと思った。
そうするとフォーマットの詳細はtoolの実装の中に隠蔽することができ、AI agentに対しては「git commit時にはこのtool使ってね」という指示だけしておけば良くなる。
具体的なメリットとして、Instructionsとかrulesにフォーマットの詳細を書かなくてよくなりcontext windowを節約できる。

他の案だと開発環境のセットアップとかもできそう。AI agentに動作確認させるために開発サーバーの起動方法とかをrulesに書いたりしていた場合、そういった指示もtoolに移行して隠蔽することができる。

もっと抽象的な話だとMCPサーバーである必要もあんまりなくて、上記のようなことを実現するscriptを書いておいて、「git commitする場合は`./scripts/git-commit.sh`を使ってください。引数はxxxです。」みたいな指示を書いておけば良い。
今回作ったMCPサーバーもこの方式に置き換えできそう。

なのでこういう用途ならMCPサーバーじゃなくてscript書く方式で全然いいじゃんという気はしつつ、どれくらい安定してscript呼び出ししてくれるのかはちょっと気になるところ。

clineのシステムプロンプトを眺めているとMCPサーバーにはそれなりに手厚い説明が用意されており、script方式に比べると特権的な扱いを受ける可能性はある。
MCPサーバーのtoolとして提供していると安定して呼び出ししてくれるけど、script書いて指示するだけだとあんまり指示守ってくれないみたいなことは起きるのかもしれない。
【React X Rails開発】cors.rb設定

Railsを使ってフロントエンドとバックエンドを分けて開発する時に必ずぶち当たるのがこのcors問題。今回はここについて解説していきます。

まずはgemfileの以下の記述をコメントから外す。

```ruby
gem "rack-cors”
```

そしてこの記述を反映させるために、以下のコマンドを流す。

```bash
$ bundle install
```

そして目玉となるcors.rbファイルを書き換える。

```ruby
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins "http://localhost:3001"

    resource "*",
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
      credentials: true
  end
end
```

| 項目 | 説明 |
| --- | --- |
| `origins` | 許可するフロントエンドのURL（React/Next.jsなど） |
| `resource '*'` | 全てのリソースに対して許可（APIなら `*` でOK） |
| `headers: :any` | 全てのヘッダーを許可 |
| `methods: [...]` | 許可するHTTPメソッド |
| `credentials: true` | Cookieや認証情報の送信を許可（必要に応じて） |
PHPerKaigi 2025に当日スタッフとして参加してきました！

## はじめに
3/21(金)~3/23(日)に中野セントラルパークカンファレンスで開催されました**PHPerKaigi 2025**へ当日スタッフとして参加してきました。

https://phperkaigi.jp/2025/

![PXL_20250322_233826514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891278/1c005ab9-f3cf-4ebc-ac9d-0ab293e3c91d.jpeg)

本記事では、当日スタッフとして参加してみての感想を書いていこうと思います。

## 当日スタッフとして参加してみて
スタッフをしてみて思った感想は、この一言に尽きます...

**スタッフ楽しいぃぃぃぃぃぃ!!**

![MAX98_yattazeyossya20140531_TP_V.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891278/107802ec-5cd6-4d6b-bca0-1bae416bb1af.jpeg)

いやもちろん、初めてのスタッフだったので色々と慣れないことも多くて苦しかった瞬間もあったのですが、最終日のクロージングにて集合写真を撮ったとき、本当に心からメチャたのしぃ〜⤴⤴と思いました！！

みんなで一丸となってカンファレンスを作り上げていく経験は、スタッフとして参加しなければ得られない貴重な体験だと思います。(もちろん、一般参加の皆様も一緒に作り上げていく仲間だと思っていますが、スタッフのそれの濃度は段違いだと感じました)

加えて、カンファレンススタッフの中には数々のテックカンファレンスでトークされている優秀なエンジニアの方々もいらっしゃるので、そういう方と話すきっかけにもなるので非常にオススメです。あと懇親会で参加者と話すときもスタッフの方が何かと便利です。

## トークの感想
ここからはPHPerKaigiにて特に印象に残ったトークの感想を書いていきます。

### The PHPer’s Guide to Daemon Crafting, Taming and Summoning by [uzulla](https://x.com/uzulla)

https://fortee.jp/phperkaigi-2025/proposal/d137c514-8ab2-45fc-9123-f9cd2733706d

今回のカンファレンスで話題となった最悪にして、最高のトークです。機材トラブルによりスライドを正常に投影できないという状況の中で進んだ本セッション。uzullaさんのトーク力と機転によって歴史に残すべき素晴らしい内容となりました。

### DIってなんだか難しい？ 依存という概念を「使う・使われる」という言葉で整理しよう by [あかつか](https://x.com/aki_artisan)

https://fortee.jp/phperkaigi-2025/proposal/1ab1563d-944f-466d-bb5e-7ddcce93a91a

DIコンテナという概念を知りつつも、学ぶ機会が無かったので非常に良い機会になりました。DIを使えばモックやスタブに置き換えられるというのはなるほどと思いました。

### ドメインイベントを活用したPHPコードのリファクタリング by [梶川 琢馬](https://x.com/kajitack)

https://fortee.jp/phperkaigi-2025/proposal/5615c479-cc86-42db-b6b8-d3879e557a3e

こちらドメイン駆動設計のドメインイベントに注目したトーク。いわゆるPub/Sub周りの話なのですが、正直めちゃくちゃ難しくて理解できない部分が多かったです。DDDを改めて勉強したい欲を掻き立てられる内容でした。

### 安全に倒し切るリリースをするために：15年来レガシーシステムのフルリプレイス挑戦記 by [さくらい](https://x.com/saku_rye)

https://fortee.jp/phperkaigi-2025/proposal/ec424260-60aa-40d3-bcc3-d7b4562b4b47

ペンギンテストという名前のオリジナルテスト手法のお話、非常に面白かったです。特に本番環境で出力に影響しない処理を走らせて、その結果を調べるという発想は目からウロコでした。

### 「うわっ…うちのテスト、遅すぎ…？」 PHPUnit高速化テクニック by [ぴんくもひかん](https://x.com/pinkumohikan)

https://fortee.jp/phperkaigi-2025/proposal/5e50648e-3041-4f1b-ac64-320a3fdc5d45

どこの現場でも問題になるPHPUnit遅い問題。テストケースが増えてくると避けられない問題かと思います。PHPUnitを並列で実行する方法や、XDebugの無効化など知らなかった高速化のTIPSを知ることができました。

### 非エンジニアにも伝えるメールセキュリティ by [加納悠史](https://x.com/YKanoh65)

https://fortee.jp/phperkaigi-2025/proposal/dcdeaadb-5731-49c9-b9f0-a2bd7fc96cf9

メールセキュリティに関して自分は全くの門外漢だったのですが、非エンジニアでもわかることを目的とした噛み砕いた説明で面白く聞くことができました。メールプロトコルという昔からあるシンプルなプロトコルをどう保護するのかというのが、とても興味深く感じました。

### 再演: The PHPer’s Guide to Daemon Crafting, Taming and Summoning by [uzulla](https://x.com/uzulla)

https://fortee.jp/phperkaigi-2025/proposal/1e9f91ed-a873-43b1-af12-7d101765f02b

再演にてついに降臨したデーモン(Daemon)。PHPでDaemonが作れるわけ無いだろ！！　という思い込みを破壊する笑撃の内容でした。いつか自分もデーモンの召喚をしてみたいですね...

### 技術的負債を正しく理解し、正しく付き合う by [河瀨 翔吾](https://x.com/shogogg)

https://fortee.jp/phperkaigi-2025/proposal/b00332b5-8965-4438-bcce-932c3b8f8f15

リファクタリングの重要性を改めて感じる良いトークでした。負債コードというリスクをいかにして管理していくのか、特に長寿システムが多いPHPでは重要な視点だと感じました。

## 最後に
テックカンファレンスというと初めての方にはハードルが高いかもしれません。しかし、飛び込んで見れば間違いなく楽しいものなので一般参加からでも始めてもらえるとめちゃめちゃ嬉しいです！！
イベントリポート 【LinuC Open Network地方創生プロジェクト】Linuxサーバー構築勉強会 in 大阪


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2951855/b110094d-5b4f-42b8-b624-9bbd70bc437d.png)

## 🟡 はじめに 🟡
私は、LiON（LinuC Open Network）運営メンバーとして活動しています。
3月28日(土)にLiONの地方創生プロジェクトとして開催した「Linuxサーバー構築勉強会」にサブ講師として参加させていただきました。
そのときの内容をご報告したいと思います。

## 🔵 イベント概要 🔵
仙台、福岡と開催してきた「Linuxサーバー構築勉強会」ですが、ついに念願の大阪開催となりました。
どうして念願かというと、私は東京在住ですが、関西出身で、大阪にも長く住んでいたため、大阪に恩返しをしていきたい気持ちがあったからです。
このセミナーでは、Linuxサーバー構築標準教科書（https://linuc.org/textbooks/server/ ）を参考にしながら、実際に手を動かして、自身のPCにAlma Linuxをインストールし、Webサーバー、DNSサーバー構築の体験をする内容となっています。

## 🌸 イベント報告 🌸
天気も良く、お花見日和の日でしたが、朝から13名の方々にご参加いただきました。
LPI-JapanとLiONの紹介をした後に、講師の藤岡さんからのアイスブレイク的な自己紹介からセミナーが始まりました。
みなさん、最初は緊張気味でしたが、最初の難関であるVirtual boxとAlma Linuxのインストールを無事に終えて、少し時間の余裕もある状態で次のステップへ進みました。

標準教科書の座学を少しやってから、このセミナーの目玉である、Webサーバー、DNSサーバー構築に入りました。
viで設定ファイルを編集することが初めてな方も一所懸命取り組んでいただき、トライ＆エラーを繰り返しながら無事に設定を完了することができました。２台目、３台目の設定をされる方もいました。

設定ファイルって、一文字違うだけでも、タブやスペースが違うだけでも動かないことがあります。そして、それを見つけることがすごく難しいのです。そんな難しさやエラーを解決する楽しさも肌で実感いただけたのではないかと思っています。
エラーを経験し、解決することは、対処方法やつまずくポイントを知ることにもなりますし、動く原理を理解することにもつながります。
この設定ファイルのここが＊＊＊だからXXXのように動くのね！ってカラダで覚えられるんです。
これがこのセミナーの最大の魅力だと思います。

## 🟢 Special　Thanks 🟢
今回参加のみなさんは、会社勤めの方ばかりで仕事でLinuxに触れている方もいらっしゃいました。
また、10年ほど前に構築セミナーを受けて、また復習したいとのことで参加されている方もいました。
背景はそれぞれ異なりますが、最後まで取り組んでいただいた参加者の皆様、ありがとうございました。
講師を担当してくださいました藤岡様は、ユーモアを交えて楽しく解説をしてくださっていました。参加者の皆さんが話に聞き入っていらっしゃる姿も印象的でした。最後まで一所懸命に参加者側に立って進められる姿に多くのことを学びました。ありがとうございました。
ハービス大阪にある、とてもきれいで快適な場所を提供いただいたパーソルクロステクノロジー様にも感謝申し上げたいと思います。
快適な時間を過ごすことができました。
さいごに、LPI-Japan事務局のバックアップがあってこそのLiONです。エンジニアの存在価値を高めるべく、これからも一緒に活動させていただきたいと思います。

## 🔴 LiONメンバー募集 🔴
LiONでは、地方創生プロジェクトとして、このようなイベント・セミナーを東京以外で開催しています。あなたの地域で開催するときは、ご興味ありましたら参加していただけると嬉しいです。
また、大阪で、京都や兵庫でも開催できるようにがんばっていきます。

試験開発やAI分科会なども盛り上がっていますので、是非、アウトプット共創型エンジニアコミュニティ LinuC Open Networkにご参加ください！

LinuC Open Network
https://linuc.community
N+1問題を解決してRDS障害を防ぐ：Laravel Eloquentの効率的な活用

# N+1問題を解決してRDS障害を防ぐ：Laravel Eloquentの効率的な活用

## はじめに

ある大規模なLaravelアプリケーションで突然RDSが落ちるという重大な障害が発生しました。調査の結果、多数のユーザーが同時に記事一覧APIを叩いたことで、N+1クエリ問題が原因でデータベースに過負荷が発生していたことが判明しました。この記事では、問題の特定から解決までのプロセスを解説します。

## 問題の特定

RDSのログから以下のようなSQLクエリが大量に実行されていることが確認されました：

```sql
SELECT * FROM categories WHERE article_id = ?
```

このクエリは記事一覧を取得する際に、各記事に関連するカテゴリー情報を個別に取得するために実行されていました。

## N+1クエリ問題とは

N+1クエリ問題とは、データベースから主となるレコード(N件)を取得した後、それぞれのレコードに関連するデータを個別に取得するクエリが追加で実行される問題です。

**例：記事一覧の場合**
1. メインクエリで記事20件を取得
2. 各記事に対して、関連するカテゴリー情報を取得するクエリが20回実行
3. 合計：21回のクエリが実行される

多数のユーザーが同時アクセスすると、数千のクエリが短時間に実行され、RDSに過負荷がかかります。

## 解決策：Eager Loading（事前読み込み）

Laravelでは、`with()`メソッドを使用してEager Loadingを実装することで、N+1問題を解決できます。

### 修正前のコード

```php
// ArticleController.php
public function index(Request $request)
{
    $articles = Article::getBlogList(
        $request->input('blog_id'),
        $request->input('page', 1),
        $request->input('per_page', 20)
    );

    return response()->json([
        'status' => 'success',
        'data' => ArticleResource::collection($articles),
    ]);
}
```

このとき、`ArticleResource`内で各記事に対して`Category::getForArticle($this->id)`が呼び出され、N+1問題が発生していました。

### 修正後のコード

```php
public function index(Request $request)
{
    $articles = Article::getBlogList(
        $request->input('blog_id'),
        $request->input('page', 1),
        $request->input('per_page', 20)
    );
    
    // Eager Loading追加
    $articles->load('categories');

    return response()->json([
        'status' => 'success',
        'data' => ArticleResource::collection($articles),
    ]);
}
```

## 解決後のSQL実行パターン

修正後は以下の2つのクエリのみが実行されます：

1. メインクエリ：記事一覧を取得
2. 関連データ一括取得：`SELECT * FROM categories WHERE article_id IN (1, 2, 3, ...)`

20件の記事がある場合、クエリ実行回数は21回から2回に削減されます。多数のユーザーが同時アクセスしても、クエリ数は大幅に減少し、RDSへの負荷が劇的に軽減されます。

## Eager Loadingの実装ポイント

1. **リレーションの定義**：Articleモデルに正しくリレーションが定義されていることを確認
   ```php
   public function categories()
   {
       return $this->hasMany(Category::class);
   }
   ```

2. **コントローラーでの実装**：取得したコレクションに対して`load()`メソッドを使用
   ```php
   $articles->load('categories');
   ```

3. **リソースクラスの最適化**：事前に読み込んだデータを使用するよう修正（オプション）
   ```php
   'categories' => $this->whenLoaded('categories', function() {
       return $this->categories;
   }, function() {
       return Category::getForArticle($this->id);
   }),
   ```

## 結論

N+1クエリ問題は、Laravelアプリケーションでよく見られるパフォーマンス問題です。特に大規模なアプリケーションや高トラフィック環境では致命的な障害につながる可能性があります。Eager Loadingを適切に実装することで、データベースへのクエリ数を大幅に削減し、アプリケーションのパフォーマンスと安定性を向上させることができます。

今回のケースでは、コントローラーの一部を修正するだけで、クエリ数を95%以上削減することができました。これにより、多数のユーザーが同時アクセスしても安定してAPIが動作するようになりました。

## 参考資料

- [Laravel Eloquent: リレーションシップ](https://laravel.com/docs/8.x/eloquent-relationships)
- [Laravel Eloquent: Eager Loading](https://laravel.com/docs/8.x/eloquent-relationships#eager-loading)
- [データベースN+1問題とその対策](https://ja.stackoverflow.com/questions/2953/)
Azure AI Foundryを利用して英語の練習を15分10円くらいで実現する

# 概要
まずはこちらの動画を私の拙い英語力を無視していただきながらご覧ください。
https://youtu.be/t9VaCTZ0iKg
今英語学習においてAIを使うアプリが流行っていますが、サブスク形式で毎日は忙しくサボってしまったり、結構自由にもっと話したいのに制限があったりでちょっと悩んでいました。
これらを解決するためには、Azure AI Foundryを利用してみました。
# Azure AI Foundryの立ち上げ
Azure の resource 作成リストから、Azure AI Foundryを選択しデプロイしていきます。
![](https://storage.googleapis.com/zenn-user-upload/a7f012af64eb-20250403.png)
デプロイが完了すると以下の様なコンソールが別で立ち上がります。
また、こちらのコンソールはAzure OpenAI等を立ち上げても繋がります。
![](https://storage.googleapis.com/zenn-user-upload/750fbdb71acc-20250403.png)
公式ドキュメントには以下の様に書かれています。
> Azure AI Foundry provides a unified platform for enterprise AI operations, model builders, and application development. This foundation combines production-grade infrastructure with friendly interfaces, ensuring organizations can build and operate AI applications with confidence.

つまりはAI関連の統合プラットフォームであり、こちらのinterfaceで色々管理できますよーということです。以前書いた[記事](https://zenn.dev/hirayuki/articles/ca4af7511279ff)もこちらのプラットフォームを利用しています。
https://learn.microsoft.com/ja-jp/azure/ai-foundry/what-is-ai-foundry
# リアルタイム オーディオ
利用するのはリアルタイムオーディオです。
左側の「新しいデプロイの作成」から数クリックでモデルを立ち上げることができます。
![](https://storage.googleapis.com/zenn-user-upload/3787984d48ad-20250403.png)
ちょっと再現性かつ記録が無いのですが、クオータの問題やリージョンの問題で最初の方が立ち上げがうまくいかないタイミングがあり、何度か修正しました。
しかし確かなこととしては、実際に会話を始めないことには従量課金がスタートしないことはわかったので、その点は少し安心して作業できそうです。
あとは真ん中の「聞き取りを開始」をクリックすると会話が可能です。

比較としてChatGPTの会話も無料枠である程度実現できる上、そちらは文字起こしも兼ねていたので、自分の発音のチェックも可能です。その点ではまずChatGPTを毎日利用して、足りない点はAzureの Real Time Audioでもいいかもしれません。
# 気になる金額は
今回はgpt-4o-mini-realtime-preview (version:2024-12-17)を利用しました。
価格はこちらに記載があるので、価格の安いモデルから使ってみると良いかもしれません。
https://azure.microsoft.com/ja-jp/pricing/details/cognitive-services/openai-service/
大体15分〜20分くらい会話した結果がこちらです。
![](https://storage.googleapis.com/zenn-user-upload/4bc6e11911ba-20250403.png)
大体8円弱くらいになりました。
これなら毎日1時間だと大体700円前後くらいですね。
文字起こしができないのが個人的に一番の残念ポイントなのですが、もし何かご存知の方がいたらぜひ教えてください。

お読みいただきありがとうございました。
論文紹介：DuQuant: Distributing Outliers via Dual Transformation Makes Stronger Quantized LLMs

# 紹介する論文

https://arxiv.org/abs/2406.01721

タイトル: DuQuant: Distributing Outliers via Dual Transformation Makes Stronger Quantized LLMs
学会: NeurIPS 2024 (Oral)

DuQuantはLLMのPTQです。外れ値対策をして4bit量子化でSOTAを達成しています。

LLMではアクティベーションに外れ値が発生し量子化で劣化する課題を、Smooth変換、回転変換、ジグザグ順列による変換でMassiveな外れ値を散らすことによって解決しています。


# SmoothQuantによる重み行列の変換

LLMにおけるLinear層 $\mathbf{Y}=\mathbf{X}\cdot\mathbf{W}$を考えます。この入力$\mathbf{X}$の外れ値を抑制したいです。

まず、[SmoothQuant](https://arxiv.org/abs/2211.10438)と同様の考えにより、入力のアクティベーションと重みをスケーリングします。

```math
\mathbf{Y}=\mathbf{X}\cdot\mathbf{W}=(\mathbf{X}\cdot\mathbf{\Lambda}^{-1})(\mathbf{\Lambda}\cdot\mathbf{W})
```

ここで、前のLinear層の重みを$\mathbf{W}'\to\mathbf{W}'\mathbf{\Lambda}^{-1}$に置き換えておけば、入力は$\mathbf{X}\to\mathbf{X}\mathbf{\Lambda}^{-1}$になります。さらに今考えているLinear層の重みを$\mathbf{W}\to\mathbf{\Lambda}\mathbf{W}$に置き換えれば、今考えているLinear層のアクティベーションは従来通り$\mathbf{Y}$のままとなり、変換前後で整合性が取れることになります。
また、$\Lambda$はSmoothQuantに記載されている方法で選びます。

これによって外れ値がある程度抑制されますが、低bit量子化では外れ値課題が残ります。DuQuantではさらに外れ値対策を行っています。


# 回転行列による対策

入力のアクティベーションに回転行列$\mathbf{R}$ ($\mathbf{R}\mathbf{R}^T=\mathbf{I}, |\mathbf{R}|=\pm 1$)を適用することを考えます。うまく回転させれば、アクティベーションの値の分布を小さくすることができます。

例えば、2次元平面で$(0, 1)$のベクトルを45度回転させると$(1/ \sqrt{2}, 1/ \sqrt{2})$になりますが、値の分布は小さくなっています。つまり、うまく座標系を回転させれば、値の分布を小さくして外れ値を他の次元に散らすことができていると見ることもできます。回転行列を使っているのは、このようなアイデアだと解釈しました。

回転行列の構築方法は論文中の(2)式で記載されています。外れ値のチャンネルを1列目に移動させて($\mathbf{E}_{d^{(1)}}$)、回転行列$\tilde{\mathbf{R}}$を右からかけることによって1列目の外れ値を軽減させます。その後1列目を保持しながら2列目以降も同様に回転行列を適用していきます($\mathbf{Q}$)。

実用上には、計算コストを小さくするために、行列全体をブロック分割し、各ブロック内で回転行列を構築します((3)式)。


# ジグザグ順列変換による対策

ジグザグ順列変換では、分割されたブロックをまたぐ入れ替えによって外れ値対策します。

論文Figure 2の2の変換のように、各列の要素の最大値をジグザグ順に並び変えます。これによりブロック内の値の分布が均一になっていきます。

論文では、ジグザグ変換の後、再度回転行列を適用することによって、さらに外れ値を抑制しています((5)式における$\hat{\mathbf{R}_{(2)}}$のこと)。

以上の対策をまとめると(5)式になります。SmoothQuantの考え方同様、前のLinear層の重みを$\mathbf{W}'\to\mathbf{W}'\mathbf{G}$に置き換え、今考えているLinear層の重みを$\mathbf{W}\to\mathbf{G}^{-1}\mathbf{W}$に置き換えれば、今考えているLinear層のアクティベーションは従来通り$\mathbf{Y}$のままとなり、変換前後で整合性が取れることになります。


# 参考にしたURL

[【DL輪読会】DuQuant: Distributing Outliers via Dual Transformation Makes Stronger Quantized LLMs](https://www.docswell.com/s/DeepLearning2023/ZG1LN4-2024-10-03-141317)
SIerに入る新卒向け 開発プロジェクトにおける契約形態徹底比較

## 自分のプロジェクトの契約形態はなんだろう

4月からSIerとしてシステム作りを仕事にした新人の皆様へ。
自分が入社する(した)会社は、発注元とどのような契約を結んでいるかを知っていますか？
一作業者としては、あまり自分のプロジェクトの契約形態を意識しなくても仕事をすることは可能です。
契約を結ぶ作業をするのは、営業担当者や営業事務であり、エンジニアはほとんど関与しないですから。
しかし、契約を遂行していくのは、私達エンジニアです。
契約形態によって、何を対価にお金をいただくのか、責任範囲はどこまでか、変わってきます。
当然、プロジェクトのゴールも少しずつ違います。

正直、新人のうちは契約を意識しなくてもよいかもしれません。
しかし、私自身1年目のときに、先輩に各契約の特徴を教えていただいたことが、
のちのちプロジェクトに参加する際の作業の考え方に影響しました。

必要ではないですが、知っていて決して無駄になるものではないと考えています。
よかったら、最後まで読んでいってください。

:::note warn
タイトルからも分かる通り、この記事は技術の話は一切でてきません。
ご注意ください。
:::

## 主な契約形態

### 1. 製造請負契約

*   **特徴:** 特定の成果物の完成を目的とする契約
*   **責任範囲:**
    *   受託者は、契約で定められた仕様を満たす成果物を完成させる責任を負う
    *   成果物に瑕疵があった場合、受託者は瑕疵担保責任を負う
    *   納期遅延や品質不良が発生した場合、受託者は損害賠償責任を負うことがある
*   **代金の対象:** 完成した成果物
*   **支払い方法:** 検収完了後の支払い

製造請負契約は、成果物の仕様が明確に定まっており、完成物が重視されるプロジェクトに適しています。

### 2. 準委任契約

*   **特徴:** 特定の業務の遂行を目的とする契約
*   **責任範囲:**
    *   受託者は、善良な管理者の注意義務（善管注意義務）をもって業務を遂行する義務を負う
    *   成果物の完成責任は負わないが、業務遂行における過失や注意義務違反については責任を負う
*   **代金の対象:** 業務の遂行自体
*   **支払い方法:** 業務時間や作業工数、月単位など

準委任契約は、業務内容が流動的で、成果物の完成よりも技術力やノウハウの提供が重視されるプロジェクトに適しています。

### 3. 成果物完成形準委任契約

*   **特徴:** 準委任契約と請負契約の中間的な契約形態
*   **責任範囲:**
    *   成果物の完成責任を負う
    *   準委任契約の性質も持つため、業務遂行における善管注意義務も負う
*   **代金の対象:** 業務の遂行と、その結果としての成果物
*   **支払い方法:** 成果物の完成度と業務遂行時間で変動

成果物完成形準委任契約は、成果物の完成責任を負いつつも、ある程度の柔軟性を確保したいプロジェクトに適しています。

### 4. 派遣契約

*   **特徴:** 派遣元（SIer）が雇用する労働者を、派遣先（顧客）に派遣し、派遣先の指揮命令の下で労働させる契約
*   **責任範囲:**
    *   派遣元は、労働者の雇用管理や安全配慮義務を負う
    *   派遣先は、労働者の指揮命令や労働環境の安全配慮義務を負う
    *   成果物に対する責任は、指揮命令を行う派遣先にある
*   **代金の対象:** 派遣した労働者の労働時間や労働日数
*   **支払い方法:** 時間単位、日単位、月単位など

派遣契約は、顧客のプロジェクトに人員を補充したい場合に用いられます。

### その他の契約形態

上記以外にも、以下のような契約形態があります。

*   **ライセンス契約:** ソフトウェア製品や技術などのライセンス提供を目的とする契約
*   **SaaS型（Software as a Service）契約:** クラウド上で提供されるソフトウェアサービスを利用するための契約
*   **保守・運用契約:** 開発したシステムの保守・運用を目的とする契約
*   **ラボ型開発契約:** 一定期間、特定の開発チームを顧客専用に提供する契約形態

## まとめ

| 契約形態 | 目的 | 成果物の完成責任 | 指揮命令権 | 主な責任 | 代金の対象 | 支払い方法 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| 製造請負契約 | 成果物の完成 | あり | 受託者 | 成果物の完成、瑕疵担保 | 成果物の完成 | 検収完了後の支払い |
| 準委任契約 | 業務の遂行 | なし | 受託者 | 善良な管理者の注意義務 | 業務の遂行 | 業務時間や作業工数、月単位など |
| 成果物完成形準委任契約 | 業務の遂行と成果物の完成 | あり | 受託者 | 成果物の完成、善良な管理者の注意義務 | 業務の遂行と成果物 | 成果物の完成度と業務遂行時間で変動 |
| 派遣契約 | 労働力の提供 | なし | 派遣先 | 派遣元：雇用管理、派遣先：指揮命令 | 労働者の労働時間・日数 | 時間単位、日単位、月単位など |

新人であっても、その後エンジニアとしてポジションが上がっていっても、契約を選択する場面は無いかもしれません。
ただ、自分が参画しているプロジェクトの契約形態がわかっていると、自分の仕事の責任範囲を把握することができます。
成果物に対しての考え方も変わってきます。
是非、なんとなくでも頭に入れて、今後のエンジニア人生に活かしていただければ幸いです。
【Mac】GifskiでMOVをGIFに変換する

## Gifskiをインストール

以下のコマンドでGifskiをインストールできます。

```terminal
brew install gifski
```

## MOVをGIFに変換

以下のコマンドでGifskiを使用してMOVをGIFに変換できます。


```terminal
gifski --fps 10 --width 320 -o output.gif input.mov
```

## ffmpegを併用する

ffmpegをインストールします。

```terminal
brew install ffmpeg
```

ffmpegを併用する場合には以下のように実行します。

```terminal
ffmpeg -i input.mov -progress pipe:2 -nostats -hide_banner -stats_period 0.1 -fpsmax 20 -f yuv4mpegpipe - | gifski -o output.gif --width 800 --fps 20 --quality 90 -
```

## 参考

https://gif.ski/
Gitのデータフローを理解しよう


Gitはバージョン管理システムとして、多くの開発現場で利用されています。

しかし、Gitの内部的なデータフローを理解していないと、正しく操作できなかったり、トラブルが起きた際に適切な対応ができなかったりします。

本記事では、Gitのデータフローを図解に基づいて解説し、基本的な仕組みを理解できるようにします。

![sc 2025-04-02 at 23.13.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/1522c1b3-ae38-4446-8770-898d75b5d220.png)


## Gitの主要な構成要素

Gitのデータフローを理解するためには、まずその主要な構成要素を把握することが重要です。

- ```Workspace```（作業ディレクトリ）: 実際に編集を行うファイルがある場所。

- ```Index```（ステージングエリア）: 変更をコミットする前に一時的に保存する領域。

-  ```Local Repository```（ローカルリポジトリ）: コミットされた変更が保存される場所。

- ```Upstream Repository```（リモートリポジトリ）: 共有のリポジトリ（GitHubやGitLabなど）。

これらの要素がどのように相互作用するのかを理解すると、Gitの操作がより明確になります。

## Gitの操作とデータの流れ

Gitのデータフローは、以下のように進みます。

1. 作業ディレクトリの状態確認
    - ```git status``` コマンドで、変更があるかを確認。
    - ```git diff``` で変更内容の詳細を確認。
2. 変更をステージングエリアへ追加
    - ```git add``` でインデックスに追加。
    - ```git diff --cached``` でステージングされた変更を確認。
3. ローカルリポジトリへコミット
    - ```git commit -m "メッセージ"``` で変更を確定。
    - ```git log``` でコミット履歴を確認。
4. リモートリポジトリとの同期
    - ```git push``` で変更をリモートに送信。
    - ```git fetch``` でリモートの最新情報を取得。
    - ```git pull``` でリモートの変更をローカルに適用。
5. ブランチの統合
    - ```git merge``` で異なるブランチを統合。
    - ```git diff <commit or branch>``` で差分を確認。

この一連の流れを理解すると、Gitの動作がより直感的に分かるようになります。

## Gitの典型的なワークフロー

実際の開発現場では、次のようなワークフローがよく使われます。

1. クローン（clone）
    - 新しいプロジェクトを開始するとき、```git clone``` でリモートリポジトリのコピーを作成。
2. 変更の作業（edit）
    - コードを修正し、```git status``` で変更を確認。
    - ```git diff``` で詳細を確認し、問題がないかをチェック。
3. コミット（commit）
    - ```git add``` で変更をステージングし、```git commit``` で確定。
4. プッシュ（push）とプルリクエスト
    - ```git push``` で変更をリモートリポジトリへ送信。
    - GitHubなどでプルリクエストを作成し、レビューを依頼。
5. マージ（merge）
    - 承認後、```git merge``` でブランチを統合。
    - ```git pull``` で最新の変更をローカルに適用。

このプロセスを繰り返すことで、効率的なバージョン管理が可能になります。

## まとめ

Gitのデータフローを理解することで、よりスムーズに開発を進められます。

- Gitの構成要素（```Workspace```、```Index```、```Local Repository```、```Upstream Repository```）を理解する。

- 各操作の流れ（```status``` → ```diff``` → ```add``` → ```commit``` → ```push```）を把握する。

- 一般的なワークフローを習得し、実践で活かす。

Gitを適切に活用することで、チーム開発の効率が向上し、トラブルシューティングも容易になります。これを機に、Gitの理解を深めていきましょう！

## 参考

https://android.benigumo.com/20250331/git-status/

https://android.benigumo.com/20250401/git-cheatsheet/
Mastraの公式サイトを読んでいく

https://mastra.ai/

Mastraは、AIエージェントや関連機能を構築するためのオープンソースのTypeScriptフレームワークです。
これにより、メモリを持ち、関数を実行できるAIエージェントの作成や、決定論的なワークフローでのLLM（大規模言語モデル）呼び出しの連鎖が可能になります。

**主な特徴:**

- **モデルルーティング:** Vercel AI SDKを利用して、OpenAI、Anthropic、Google Geminiなど、さまざまなLLMプロバイダーとの統一的なインターフェースを提供します

- **エージェントのメモリとツール呼び出し:** エージェントにツール（関数）を持たせることができ、メモリを永続化し、最新性、セマンティック類似性、または会話スレッドに基づいて取得できます

- **ワークフローグラフ:** LLM呼び出しを決定論的に実行するためのグラフベースのワークフローエンジンを提供し、各ステップの入出力をログに記録し、オブザーバビリティツールに送信できます

- **エージェント開発環境:** ローカル開発環境でエージェントと対話し、その状態やメモリを確認できます

- **RAG（Retrieval-Augmented Generation）:** ドキュメントをチャンクに分割し、埋め込みを作成、ベクターデータベースに保存し、クエリ時に関連するチャンクを取得してLLMの応答をデータに基づかせることができます

- **デプロイメント:** エージェントやワークフローをReact、Next.js、Node.jsアプリケーションに組み込んだり、スタンドアロンのエンドポイントとしてデプロイできます

- **評価（Evals）:** 自動評価指標を提供し、毒性、バイアス、関連性、事実性などの評価が可能です

公式サイトの「Examples」セクションでは、Mastraを使用した具体的なプロジェクト例が紹介されています。 citeturn0search0これには、テキスト生成、構造化出力、ストリーミング応答、RAG、音声機能などが含まれます。

**主な例:**

- **エージェント:** システムプロンプトを持つエージェント、ツールを使用するエージェント、階層型マルチエージェントシステムなど

- **ワークフロー:** ワークフローの作成、順次ステップ、並列ステップ、条件分岐、エージェントの呼び出しなど

- **RAG:** テキストのチャンク化と埋め込み、ベクターデータベースへの保存、結果の再ランキングなど

「Docs」セクションでは、Mastraの詳細なドキュメントが提供されています。 citeturn0search1インストール方法、プロジェクト構造、エージェントの作成、ツールの追加、ワークフローの構築、RAGの実装、デプロイメント、評価、音声統合など、多岐にわたるトピックが網羅されています。

さらに、MastraはMCP（Model Context Protocol）の採用を進めており、AIツールの統合を標準化し、エコシステム全体の互換性と効率性を向上させることを目指しています。 

公式サイトの各セクションを参照しながら、具体的なコード例や詳細な解説を確認することで、Mastraの機能や使い方を深く理解できるでしょう。
SQL #1 【SQLとは】

## はじめに
SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS) でデータを操作するための標準的なプログラミング言語。

## リレーショナルデータベースとは
データを表形式で扱っていて、表同士をくっつけたりできるデータベース。

## 主要なRDBMS
- MySQL
- PostgreSQL
- Oracle Database
- SQL Server
- SQLite

それぞれ特徴・利点がある。
【kintone】プロセス管理で作業者以外がアクションしてみる！

# はじめに
こんにちわ、明日からバンコクに１ヶ月滞在する、ノベルワークスのまとっち（[@matoi_thai](https://x.com/matoi_thai)）です。

今日、「プロセス管理の設定で、作業者以外でも実行できるアクションを設定できる機能」を触ってみたので、自分用の覚え書きとして記事に残しておきます。

## 作業者以外でも実行できるアクション設定
<b>"開発中の新機能"</b>ということで、「kintoneシステム管理」内の【アップデートオプション】で設定することで、お試し利用ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/ea0c6966-6b5e-4a50-aaec-98f468f58b0c.png)

👇詳細はこちら

https://kintone.cybozu.co.jp/update/main/2025-02.html

# どんな時に使えるか
この機能で新たにできるようになったことを３パターンやってみました。
- ① 代理承認 by 副部長
- ② 申請取り消し by 作成者
- ③ スキップ承認 by 社長

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/67ba937d-6350-47a0-aac3-1a0ceb353c0f.png)

:::note info
プロセスの動きが分かるように[Customineで承認ステップ図](https://docs-customine.gusuku.io/ja/actions/other_ui/show_process_at_menu/
)を入れてます
:::

## ① 代理承認 by 副部長
承認する部長が不在の時、「副部長」が”代理承認”できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/8b89e3ff-528e-459c-ba20-ab8ff4f22629.png)


## ② 申請取り消し by 作成者
申請した後に間違いに気づいた時、「作成者」が”申請取戻し”できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/418d7c4c-4d02-4701-9265-17e8e9310f1b.png)

## ③ スキップ承認 by 社長
承認する部長が不在の時、「社長」が”スキップ最終承認”できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3713212/7d8307a6-b807-4d81-9c99-ba90236fb472.png)

# おわり！
早くリリースしてほしいです！
それではバンコクに行ってきます👋