OmniAICreator/Qiita-1.07M huggingface dataset:
【kintone】特定組織だけが利用できるスペースについて   ～「組織間のアクセス権」を併用して情報漏洩リスクを防ぐ～



## はじめに
こんにちは！
早くも日焼けしたノベルワークスの[つつみん](https://x.com/tsutsumin_38)です:sun_with_face:。
今回は、「組織間のアクセス権」についてまとめたいと思います。

kintoneでは、「スペース」機能を使って、部署ごとに専用の情報共有エリアを作成することができます。  
特定の組織メンバーだけでスペースを利用したい場合は、**非公開スペース**を設定するのが基本です。

しかし、スペースを非公開にしても、**ユーザーのプロフィール情報**や **組織情報（組織構成・所属部署名など）** は、kintoneドメインにアクセスできる全ユーザーが閲覧できてしまうため、情報漏洩リスクが残ります。

この記事では、この課題を解決するために、**「組織間のアクセス権」設定を活用する方法**を紹介します。

---

## 非公開スペースでできること・できないこと


### 【非公開スペース設定でできること】
- 指定したメンバーだけがスペースにアクセスできる
- スレッド、アプリ、掲示板などのコンテンツも限定公開できる

### 【非公開スペースだけではできないこと】
- ユーザーのプロフィール（氏名、部署名など）を非公開にする
- 組織ツリーや組織構成の閲覧を制限する

**つまり、スペース内部の情報は守れるが、プロフィール・組織情報までは完全に隠せない**ということです。

例）ユーザー選択フィールドでは、全ユーザーが閲覧できてしまう。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/96ef9578-e276-40c2-8994-02b81138d833.png">

ピープル機能やコメントでメンションする際にも登録ユーザーがすべて表示される仕組みです

取引先や業務委託先とkintoneを利用したいが、取引先各々には利用ユーザーの存在を知られたくないといった場合は、困ってしまいます。

---

## 組織間のアクセス権で解決する

この問題を根本的に解決するために、kintoneには「**組織間のアクセス権**」設定機能があります。

「組織間のアクセス禁止」を有効にすることで、
- 所属していない組織の情報は一切見えない
- ユーザーのプロフィール画面も、組織外ユーザーには非表示にできる
ようになります。

### 【組織間アクセス権設定後のイメージ】

| 項目 | 設定前 | 設定後 |
|:---|:---|:---|
| スペースの中身 | 非公開設定で限定できる | 非公開設定で限定できる |
| プロフィール情報（氏名・部署） | 全ユーザーが閲覧可能 | 所属組織内だけ閲覧可能 |
| 組織構成情報（組織ツリー） | 全ユーザーが閲覧可能 | 所属組織内だけ閲覧可能 |

これにより、**特定組織だけがスペースも組織情報も利用できる安全な環境**を作ることができます。

---

## 設定手順まとめ

### 組織間のアクセス権を有効にする
- 【組織とユーザー】の設定で組織ごとにユーザーを管理しておく
この設定は異なる最上位組織に所属するユーザー同士のアクセスを制限するものなので、先にユーザーを組織に所属させておく必要がある
- 【組織間アクセス権設定】を開き、「組織間のアクセス禁止を有効にする」にチェック
 ![2025-04-29_10h43_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/2103888e-9f0b-4e2f-ba0f-fc61c48aac2c.png)
- 保存して反映


## ✅ 設定の反映をチェック
最上位組織が「会社A」「会社B」の場合
![2025-04-29_22h42_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/378942ec-a67d-417c-bd68-28160211be96.png)


【ユーザー選択フィールド】
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/f6b7c35d-0e75-4b2c-b1b7-cee79ad7899c.png)

最上位組織「会社A」に所属する鈴木さんでログインした場合
【設定前】
・「組織タブ」→　会社A、会社Bが表示
・「グループタブ」「Everyone」→全ユーザー表示

【設定後】
・「組織タブ」→　会社A　のみ表示
・「グループタブ」「Everyone」→同じ最上位組織「会社A」のユーザー情報しか閲覧出来ないよう制限されたので、ユーザー選択画面でも「会社B」のユーザー（この場合の田中さん）は表示されません。

:::note info
確認
それぞれの組織の情報をチェックするユーザーは「会社A」にも「会社B」にも所属する必要があるので忘れないように設定しよう。
![2025-04-29_23h22_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957410/4eed1ee9-20f0-4f7d-9cb3-2b6a55c707c2.png)
:::

---

## 注意点

- cybozu.com共通管理者は、cybozu.com共通管理で、各ユーザーのプロフィールと組織情報を閲覧できる
- 組織間のアクセス制限を有効化すると、既存のアプリや情報共有に影響する場合があるため、事前に影響範囲を洗い出しておく。
- グループ単位の権限設定と組み合わせる場合、どちらが優先されるかにも注意が必要。

---

## まとめ

- 非公開スペースだけでは、ユーザープロフィールや組織情報までの遮断はできない  
- 「組織間のアクセス権」を使うことで、**プロフィール・組織情報も含めた完全な情報遮断が可能**
- セキュリティレベルの高い組織運用には、**非公開スペース × 組織間アクセス権**の併用が最適

安全で効率的なkintone運用を実現するために、ぜひこれらの設定を活用していきたいと思います！
俺用、0からの範囲を判定するマクロ


いろいろ、注意
----

- Arduino UNOでの　予定は、未定
- いろいろ　簡単だけど　いろいろあって　プログラムを短くしたい
- RE　は、　レンジ　の　事
- 朝、ギリギリ10分前から初めて、間に合った

プログラム
----

オンラインコンパイラ paiza

```c++



#define RE(A,X) ( (X >= 0) && (X <= A)  )

#include <iostream>
using namespace std;
int main(void){
    // Your code here!
    
    for(int i=-1;i<=7;i++){
        if( RE(5,i) ) {
            printf("RE(5,%d) YES\n",i);
        } else {
            printf("RE(5,%d) NO\n",i);
        }
    }
    
}


```

```

RE(5,-1) NO
RE(5,0) YES
RE(5,1) YES
RE(5,2) YES
RE(5,3) YES
RE(5,4) YES
RE(5,5) YES
RE(5,6) NO
RE(5,7) NO


```
Access Governance Superbadge Unit



https://trailhead.salesforce.com/content/learn/superbadges/superbadge_governing_access_sbu?trail_id=secure-your-environment

+ 特権ユーザーを監査し、権限を適切に調整します。
+ 重要なデータの変更を監視し、機密データの漏洩を軽減します。
+ 接続されたアプリのアクセスを監視する際のベスト プラクティスについて説明します。


# 特権ユーザーの監査

組織内で特権権限を持つユーザーを監視してください。権限調整が必要な2人のユーザーを特定し、要件に基づいて必要な更新を行ってください

:::note alert
We can't find the expected permission set group modifications.


予期された権限セットグループの変更が見つかりません。
:::



# データの変更を監視する

必須フィールドのフィールド履歴追跡を有効にし、各商談レコードとレポートで変更を監視できるように組織を構成します。

次に、誤って機密アカウントデータが含まれているアカウント履歴レコードを削除します。重要：削除権限のあるレコードのみを削除してください。


:::note alert
We can't find field history tracking enabled for the expected fields on the Opportunity object. Make sure you've only enabled it for the specified fields.


商談オブジェクトの必要なフィールドでフィールド履歴管理が有効になっていません。指定されたフィールドのみ有効になっていることを確認してください。
:::

:::note alert
We can't find the Opportunity Field History related list on the Opportunity object.


商談オブジェクトに商談フィールド履歴関連リストが見つかりません。
:::

:::note alert
We can't find an opportunity field history report with the name 'Opp Field History - Last 7 Days'. Make sure there is only one 'Opp Field History - Last 7 Days' report, it's in the right folder, and has a description.

「商談フィールド履歴 - 過去7日間」という名前の商談フィールド履歴レポートが見つかりません。「商談フィールド履歴 - 過去7日間」レポートが1つだけ存在し、適切なフォルダに保存され、説明が記載されていることを確認してください。
:::


:::note alert
We can't find the expected org setting that allows for the deletion of field history data.


フィールド履歴データの削除を許可する必要な組織設定が見つかりません。
:::

:::note alert
We can't find the permission set with the API Name 'Delete_Field_History'.
:::

:::note alert
We can't find that the expected Account History records were deleted.


予期されたアカウント履歴レコードが削除されたことが確認できません。
:::


```
select Id,oldvalue from AccountHistory where AccountId='001aj000013xXc5AAE'
```


```
 AccountHistory ac = new AccountHistory();
 ac.Id ='017aj00000PSOocAAH';

delete ac;
```

# 接続されたアプリのアクセスを監視する

様々なシナリオにおける接続アプリの監視に関する質問に回答します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e8c5568f-4420-4a23-937e-ecf2d395e65d.png)

これが分からなかった...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8e8a3419-b61e-4dae-82f2-5cacf659c620.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c1bf55d6-e6e2-4655-a5c4-abffdb89985b.png)
業務効率化課題と解決方法

# 【まとめ】業務効率化課題と解決方法

業務をプログラミングで効率化するための課題とその解決方法を整理してみました。  
毎日発生する定型作業を自動化することで、**ミスの防止**と**時間の短縮**を実現できます
私は、pythonとVBAを使用し以下のことを行なっています。

## どうしてプログラミングで業務効率化が必要？

日々同じ作業を繰り返すと、どうしても**ミス**が起こりやすくなります。  
また、**作業にかかる時間**も無駄に感じることがありますよね。  
そこで、プログラミングを使って自動化することで、同じ作業を手動でやる時間を大幅に短縮できます。

:::note info
「もしその作業が繰り返し（3回以上）行うのであれば、プログラムを書いたほうがいい」と考えています。
時間をかけずに効率よく作業を終わらせ、他の重要な仕事に集中するためには、**自動化**が効果的です！
:::

## 📌 解決方法

### 1. 定型業務を自動化する
毎日必ず行う作業、たとえば**レポート作成**や**データ入力**などは、**プログラムで自動化**することができます。  
これにより、手作業でのミスを減らすと共に、何度も繰り返す作業を数行のコードで終わらせることが可能です。

### 2. 定期的な通知や確認作業を自動化
毎週、毎月確認しなければいけない**報告書の送信**や、**重要なメールの検知**なども自動化できます。  
例えば、「バックアップ完了通知」が来ているかを確認し、届いていなければアラートを出すといった作業です。

### 3. 作業内容をシンプルにする
手動で行う作業は複雑になることがありますが、**プログラムで自動化**することで作業がシンプルになります。  
休暇報告や日々の**勤怠管理**なども、入力したデータを基に自動でメール送信できる仕組みを作れば、手間が省けます。



## 🛠️ どんな課題があるの？

- **PPTファイルの特定ページを抽出して保存したい**  
- **特定のメールが届いているかを自動で確認してそれをレポート化したい**  
- **Excelから週報を自動送信したい**  
- **休暇報告を日時だけ入力すれば自動で送信できるようにしたい**

これらの課題は、どれも繰り返し作業が多いため、プログラムで解決できます。  
自動化することで、効率的に業務を進められるだけでなく、作業の**品質向上**にもつながります。

## 💡 まとめ

業務をプログラミングで効率化することで、**作業時間の短縮**や**ミスの防止**が可能になります。  
何度も繰り返す作業や、定期的に行う作業は、プログラムを使って自動化することを強くお勧めします！　

時間を減らし、定時であがりましょう！
---
メール関連のおすすめ記事↓

https://qiita.com/riicon72/items/215ebfe2a415c0fcfe0d
個人的備忘録：Git stashを使った未コミット変更エラーの解決手順をまとめてみた

## はじめに

Gitを使ってブランチを切り替える際に発生しがちな「未コミット変更があってcheckoutできない」問題。

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

これを解決しつつ、正しい手順で「mainブランチへの切り替え」「最新の取り込み」まで完了した過程をまとめます。

## 書こうと思ったきっかけ

Gitでブランチを切り替えようとしたとき、「未コミット変更があってcheckoutできない」というエラーに遭遇。

その後、git stashで変更を一時的に保存し、checkoutし、最新のコミットをpullして正常状態へ戻しました。例えのスムーズな手順を残しておくために記事化することにしました。

## 実際に起きたエラーと使ったコマンドまとめ

### 起きたエラー

```bash
 ~/Desktop/.../frontend (git)-[feature/add-login-pin-dialog]- git checkout main
error: Your local changes to the following files would be overwritten by checkout:
	src/app/page.tsx
Please commit your changes or stash them before you switch branches.
Aborting
```

### 実行したコマンド

1. **作業中の変更を一時退避する**

```bash
git stash
```

出力：
```
Saved working directory and index state WIP on feature/add-login-pin-dialog: 92541d5 管理ユーザー選択時にPINコードダイアログを表示する機能を追加およびポエム認証削除
```

2. **mainブランチへ切り替える**

```bash
git checkout main
```

出力：
```
Switched to branch 'main'
Your branch is behind 'origin/main' by 13 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
```

3. **最新の変更を取り込む**

```bash
git pull origin main
```

出力（抜粋）：
```
Updating dc87b1d..1856b92
Fast-forward
.github/workflows/cd.yml |  43 +++++++++++++
.github/workflows/ci.yml |  60 +++++++++++++++++++
...
```

## まとめ

- **git stash** を使い、未コミットの変更を一時送り、checkoutを完了
- **git checkout main** でmainブランチへ切り替え
- **git pull origin main** でリモートの最新状態を取り込み
- この流れで「未コミットデータがあるままブランチ切り替え失敗」を解決できた

次は、新しいブランチを切るか、stashした作業をpopして続きの作業をするかという流れになります...！
Amazon Q translate

# はじめに
CLIでAmazon Qを利用する際に、日本語が使用可能になりました。(2025/4)

https://aws.amazon.com/jp/blogs/news/amazon-q-developer-global-capabilities/

それをきっかけとして、Amazon Qがどこまでできるのかを確認するために、AutoCompleteにあるtranslate機能を試しました。

# Command Line: Autocomplete Translating natural language to bash
https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-autocomplete.html

- AWS CLIのほか、Dockerコマンドなどもsupportされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/36ee3c18-efd2-40cb-94ef-36a0f04958f0.png)


# 事前準備
## Install the Amazon Q command line (WSL環境、zip利用)
```bash
%~ $ curl --proto '=https' --tlsv1.2 -sSf "https://desktop-release.q.us-east-1.amazonaws.com/latest/q-x86_64-linux.zip" -o "q.zip"
%~ $ unzip q.zip
%~ $ ./q/install.sh
%~ $ PATH=$PATH:~/.local/bin
```
https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/command-line-installing-ssh-setup-autocomplete.html

### version 確認(v1.9 As of 2025/04/29)
```shell
%~ $ q --version
q 1.9.0
```

## Create Builder ID
認証はAWS Builderを利用するため、Builder IDを作成
https://profile.aws.amazon.com/

https://docs.aws.amazon.com/signin/latest/userguide/create-aws_builder_id.html

### q login
```shell
%~ $ q login
? Select login method ›
❯ Use for Free with Builder ID
  Use with Pro license
```

# q translate
## AWS CLI
### q translate s3一覧を表示

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/c3f7c37e-d877-4810-ab23-d857534fca96.png)

defaultでExecute commandが選択されているので、Enter keyを押下すると、生成されたaws s3 lsコマンドが実行されます。AWS認証情報が設定済みの場合、bucket 一覧が表示されます。

### 少し複雑な指示
### q translate 各s3の名前、bucketサイズを表示

```shell
%~ $ q translate 各s3の名前、bucketサイズを表示

  Shell · aws s3 ls --summarize --human-readable | grep -v Total | awk '{print $3,$4}' | sort -n
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/6fd3437d-6bd1-49f2-8881-d288650c9f7e.png)

:::note alert
sizeが出力されず、bucket名のみが出力される
:::
### q translate show name and total size of each s3 bucket
- 英語でやってみたが、今回はbucket名が出力されなかった
```shell

%~ $ q translate show name and total size of each s3 bucket

  Shell · aws s3 ls | awk '{print $3}' | while read bucket; do aws s3 ls s3://$bucket --recursive --human-readable --summarize | awk '{print $3, $4}' | awk '{s+=$1} END {print bucket, s/1024/1024/1024 " GB"}'; done
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/26b15728-4174-41cc-a217-55b055281d73.png)

:::note alert
言語と関係なく、CLIコマンドが正しく生成できない場合ある
:::

## Dockerコマンド
```bash
%~ $ q translate 停止中のcontainer名称を表示

  Shell · docker ps --format "{{.Names}}"

%~ $ q translate 停止中のcontainer一覧を表示

  Shell · docker ps -a

%~ $ q translate show stopped containers

  Shell · docker ps -a | grep Exited
```

:::note alert
「停止中」の単語が理解されない
:::

# 感想
- q translateを活用すれば、CLIやDockerコマンドを覚えなくても済むと考えましたが、言語と関わらず、理想的な形になるまではもう少し待つべき
- 一般的なChatbotと同様に、Prompt Engineeringも重要
windows11で、sketchup6 その88

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

# 練習問題
線を引く、ツールを書け。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/8b42096a-42ee-4430-84e1-26a55e922fca.png)


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

```


require 'sketchup.rb'



class LineTool
	CURSOR_PENCIL = 632
	def activate
		@mouse_ip = Sketchup::InputPoint.new
		@picked_first_ip = Sketchup::InputPoint.new
		update_ui
	end

	def deactivate(view)
		view.invalidate
	end

	def resume(view)
		update_ui
		view.invalidate
	end

	def suspend(view)
		view.invalidate
	end

	def onCancel(reason, view)
		reset_tool
		view.invalidate
	end

	def onMouseMove(flags, x, y, view)
		if picked_first_point?
			@mouse_ip.pick(view, x, y, @picked_first_ip)
		else
			@mouse_ip.pick(view, x, y)
		end
		view.tooltip = @mouse_ip.tooltip if @mouse_ip.valid?
		view.invalidate
	end

	def onLButtonDown(flags, x, y, view)
		if picked_first_point? && create_edge > 0
			reset_tool
		else
			@picked_first_ip.copy!(@mouse_ip)
		end
		update_ui
		view.invalidate
	end

	def onSetCursor
		UI.set_cursor(CURSOR_PENCIL)
	end

	def draw(view)
		draw_preview(view)
		@mouse_ip.draw(view) if @mouse_ip.display?
	end

	def getExtents
		bounds = Geom::BoundingBox.new
		bounds.add(picked_points)
		bounds
	end

	private

	def update_ui
		if picked_first_point?
			Sketchup.status_text = 'Select end point.'
		else
			Sketchup.status_text = 'Select start point.'
		end
	end

	def reset_tool
		@picked_first_ip.clear
		update_ui
	end

	def picked_first_point?
		@picked_first_ip.valid?
	end

	def picked_points
		points = []
		points << @picked_first_ip.position if picked_first_point?
		points << @mouse_ip.position if @mouse_ip.valid?
		points
	end

	def draw_preview(view)
		points = picked_points
		return unless points.size == 2
		view.set_color_from_line(*points)
		view.line_width = 1
		view.line_stipple = ''
		view.draw(GL_LINES, points)
	end

	def create_edge
		model = Sketchup.active_model
		#model.start_operation('Edge', true)
		edge = model.active_entities.add_line(picked_points)
		num_faces = edge.find_faces || 0
		#model.commit_operation
		num_faces
	end
end





```

以上。
AWS Polly に意味に応じたピンインを喋らせる

### TL;DR

SSML で指定するとできる。（それはそう）

## 背景

中国語では、同じ漢字でも意味が異なると発音が変わることがある。

例えば『論語 学而第一』では "不亦説乎" というフレーズがあり、ここで使われている "説" には意味に応じた発音がある。基本的には「話す」のなどの意味で ["shuo1"](https://en.wiktionary.org/wiki/%E8%AA%AA#:~:text=to%20say%3B%20to,%C2%A0%20%E2%80%95%C2%A0%20speak%20Chinese) だが、"不亦説乎" は「なんと説（よろこ）ばしいことであろうか」なので、この意味で使うときには ["yue4"](https://en.wiktionary.org/wiki/%E8%AA%AA#:~:text=Alternative%20form%20of%20%E6%82%85%C2%A0/%20%E6%82%A6%20(yu%C3%A8%2C%20%E2%80%9Chappy%3B%20delighted%E2%80%9D)) と発音される。

[Polly](https://aws.amazon.com/jp/polly/) は文脈を理解しているわけではないので、ふつうに読ませたときに別の意味の発音で読まれてしまったときには、ピンインを指定する必要がある。

:::note
本記事は声調変化をコントロールする話ではない。Polly は声調変化には対応しており、"不亦" を正しく "bu2 yi4" に対応する抑揚で読んでくれた（"不" は本来 "bu4"）。
:::

## 方法

SSML（Speech Synthesis Markup Langueage）を使うとできた。Polly における中国語の SSML ドキュメントは[こちら](https://docs.aws.amazon.com/polly/latest/dg/ph-table-mandarin.html)。

"不亦説乎" は下記のように設定する。

```xml
<speak>
    不亦 <phoneme alphabet="x-amazon-pinyin" ph="yue4">説</phoneme>乎。 
</speak> 
```

もっとも、SSML は発音をハードコードで指定しているだけなので当たり前で、いってみれば "説" を "ma1" と読ませることもできてしまう。

#### 取り得た別の手段

もっとスマートな方法として、発音辞書を外に持つ方法（[lexicon](https://docs.aws.amazon.com/polly/latest/dg/managing-lexicons.html)）もあるようだが、そちらは時間内にうまくできなかった。スピーチを SSML で指定する現在の方法で問題が生じたら再検討することにする。[このあたり](https://aws.amazon.com/jp/blogs/machine-learning/customize-pronunciation-using-lexicons-in-amazon-polly/)が参考になるかも

### その他のスピーチ制御

SSML はいろいろな制御ができるので、たとえば[読む速度](https://docs.aws.amazon.com/polly/latest/dg/voice-speed-change-vip.html)も制御できる。
論語を読ませるなら `x-slow` くらいがちょうどよかった。
```xml
<speak>
    <prosody rate="x-slow">
        不亦 <phoneme alphabet="x-amazon-pinyin" ph="yue4">説</phoneme>乎。 
    </prosody>
</speak> 
```
Geminiでマイクを使う魔法少女を描いてみた。

# 概要

Geminiでマイクを使う魔法少女を描いてみました。

# 実装

プロンプトと実行結果は以下の通りでした。

```
光のマイクを使う魔法少女を描いてください。
```

![光のマイクを使う魔法少女_20250430.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/1a91f1d5-3deb-4d48-b6c4-a31f7f5817ac.png)


```
闇のマイクを使う魔法少女を描いてください。
```

![闇のマイクを使う魔法少女_20250430.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/f51d4a0a-f846-4e95-979a-7749e36588ec.png)


```
聖なるマイクを使う魔法少女を描いてください。
```

![聖なるマイクを使う魔法少女_20250430.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/dc2854c6-0a70-4ec4-856f-4108a76bd48c.png)

# まとめ

闇の子と聖の子は可愛い。
何かの役に立てばと。
windows11で、sketchup6 その87

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

# 練習問題
時計を動かせ。


# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/adb8146d-bb30-496a-8095-2a5485b0a5cb.png)

# サンプルコード
起動　Tokei2.new
```
class Tokei2
	def initialize
		model = Sketchup.active_model
		entities = model.active_entities
		@view = model.active_view
		@id = 0
		group_circle = entities.add_group
		circle = group_circle.entities.add_circle [0, 1, 22], [0, 1, 0], 22
		circle_face = group_circle.entities.add_face circle
		circle_face.pushpull -0.1
		depth = 10
		width = 1
		pts = []
		pts[0] = [0, 0, 0]
		pts[1] = [width, 0, 0]
		pts[2] = [width, 0, depth]
		pts[3] = [0, 0, depth]
		group_hour = entities.add_group
		face_hour = group_hour.entities.add_face pts
		face_hour.material = "black"
		face_hour.pushpull 0.015
		trans = Geom::Transformation.translation [-0.5, 0, 21]
		group_hour.transform! trans
		rot = Geom::Transformation.new [0, 0, 22], [0, 1, 0], Time.now.hour * 30.degrees
		group_hour.transform! rot
		depth = 16
		width = 1
		pts = []
		pts[0] = [0, 0, 0]
		pts[1] = [width, 0, 0]
		pts[2] = [width, 0, depth]
		pts[3] = [0, 0, depth]
		group_minute = entities.add_group
		face_minute = group_minute.entities.add_face pts
		face_minute.material = "black"
		face_minute.pushpull 0.015
		trans = Geom::Transformation.translation [-0.5, 0, 21]
		group_minute.transform! trans
		rot = Geom::Transformation.new [0, 0, 22], [0, 1, 0], Time.now.min * 6.degrees
		group_minute.transform! rot
		depth = 20
		width = 1
		pts = []
		pts[0] = [0, 0, 0]
		pts[1] = [width, 0, 0]
		pts[2] = [width, 0, depth]
		pts[3] = [0, 0, depth]
		@group_second = entities.add_group
		face_second = @group_second.entities.add_face pts
		face_second.material = "red"
		face_second.pushpull 0.01
		trans = Geom::Transformation.translation [-0.5, 0, 21]
		@group_second.transform! trans
		rot = Geom::Transformation.new [0, 0, 22], [0, 1, 0], Time.now.sec * 6.degrees
		@group_second.transform! rot
		@id = UI.start_timer(1.0, true) {
			tick
		}
	end
	def tick
		rot = Geom::Transformation.new [0, 0, 22], [0, 1, 0], 6.degrees
		@group_second.transform! rot
		@view.invalidate
	end
end




```

以上。
[最強動画生成AI] FramePackをWindowsに導入しよう

# FramePackとは
低VRAMローカルで動画生成AIを動かせる神

https://arxiv.org/abs/2504.12626

https://lllyasviel.github.io/frame_pack_gitpage/

# 筆者環境
筆者環境: 
ダウンロード: 23.0Mbps
アップロード: 70.7Mbps
レイテンシ: 7 ミリ秒
OS: Windows11
GPU: RTX4090

## 手順
### 1.パッケージをダウンロード
https://github.com/lllyasviel/FramePack?tab=readme-ov-file

Windows用に簡単なインストールスクリプトが準備されていた。
「Click Here to Download One-Click Package (CUDA 12.6 + Pytorch 2.6) 」
筆者環境で50分ほど

### 2.ダウンロードしたパッケージを解凍
任意の階層でパッケージを解凍

### 3.update.batを実行
update.batの実行は重要です。これを行わないと、潜在的なバグが修正されていない以前のバージョンを使用することになります。

### 4.run.batを実行
これで起動します。初回は諸々インストールがあるので時間がかかります。

## 実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/8c214433-d4cb-489e-8d05-00b7f38279f7.png)
「Image」エリアに画像をドロップし、
「Prompt」を入力したら
「StartGeneration」ボタンで生成を実行できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3908981/5f36833d-cf7e-4a56-97e5-d2980d8fdcc0.png)

#### Use TeaCache:
これにチェックを入れると生成が高速化する。

#### Seed:シード値
これを固定すると似たような動画が生成できる。

#### Total Video length(Seconds)
何秒の動画を生成するかここで決定する。
1-120秒の間で設定できる。

#### Distilled CFG Scale: 
高いほどプロンプトに忠実となる。

#### MP4 Compression
低いほど品質が良くなる。0は非圧縮。
出力がうまくいかない場合は16に変更推奨。


# このあと
FramePack拡張版のEichiは超使えるのでおすすめ
本家を導入済みならEichiのREADMEに沿ってファイルを追加するだけ

https://github.com/git-ai-code/FramePack-eichi
[VRChat] TexTransTool でアバターのテクスチャの色を変える

## ⭐️目的

アバターのテクスチャの色を変える

## ⭐️参考

https://ttt.rs64.net/


### ☂️マニュアル

https://ttt.rs64.net/



## ⭐️インストール

https://ttt.rs64.net/

![スクリーンショット 2025-04-30 1.03.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/dd838301-b16c-49a0-a239-8041f2710028.png)


## ⭐️使い方

### ☂️初期設定

![スクリーンショット 2025-04-30 1.08.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/11c28ed5-53b3-4ef9-8dc4-27a5646c9573.png)

- 本体を選択してここをクリック

![スクリーンショット 2025-04-30 1.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/511fdba0-f844-45ab-a321-f1ab6f368e79.png)

- これが生成される

![スクリーンショット 2025-04-30 4.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/cf915c00-696a-4a30-8693-0a9354f4e08e.png)

- opne selectorをクリック!
 
![スクリーンショット 2025-04-30 4.39.01-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/a0b952de-eca0-4db2-b7f8-83b9a7a0e3c0.png)


- ここのところに入ってる色の左のテクスチャーと同じものを選択する必要がある

![スクリーンショット 2025-04-30 4.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/4245d15a-846b-4a9f-a113-d41a1b257563.png)

- 大体アセット関連のところにあると思う

![スクリーンショット 2025-04-30 4.41.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/daaa6086-b5cf-4eb6-a476-edbb350373a9.png)

- アセットにEyeTextureなどの名称のフォルダを作成して購入した反映させたいテクスチャーをここに入れる

![スクリーンショット 2025-04-30 4.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/6f421be6-e7c2-4d22-85db-05de71d26d69.png)

- BlendTextureに使用したいファイルを読み込ませる

![スクリーンショット 2025-04-30 4.46.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/f7fc40c4-b8c7-4fa1-9075-4a209203bbae.png)

- 目のテクスチャーを反映

## ⭐️その他

Bodyのliltoonのメインカラー2からやる方法もある! ただ管理の兼ね合いどちらでもよいと思う
【Rails初学者】ArticlesController の各アクション備忘録など

# 【Rails】ArticlesController の各アクションをきちんと理解したい。

こんにちは。
rails初学者です。覚えては忘れ、覚えては忘れの繰り返しです。
再度、振り返れるように備忘録を残します。
今回は、ArticlesController を作成した後の、 「各アクションがどんな役割をしているのか？」 「よく見る `render :new, status: :unprocessable_entity`って何？」 「`private`と`article_params`について」となります。

## 完成したコントローラー
以下、全体像
```ruby
class ArticlesController < ApplicationController
  def index
    @articles = Article.all
  end

  def show
    @article = Article.find(params[:id])
  end

  def new
    @article = Article.new
  end

  def create
    @article = Article.new(article_params)
    if @article.save
      redirect_to article_path(@article)
    else
      render :new, status: :unprocessable_entity
    end
  end

  private

  def article_params
    params.require(:article).permit(:title, :content)
  end
end
```
上記のコードの意味をまとめる

## `index`アクション
```ruby
def index
  @articles = Article.all
end
```
- 記事一覧を全部取り出すアクション
- `Article.all`でDBにある全レコードを取る
- なぜ`@articles`は「複数形」なのかと思いましたが、全部まとめて取得するから複数形です

## `show`アクション
```ruby
def show
  @article = Article.find(params[:id])
end
```
- 1つの記事だけを取り出すアクション
- `params[:id]`に入っているIDを使って、特定のレコードを探す
- `find`は、該当データがなかったらエラー
- `params`は、URLに埋め込まれてるデータ (ex: /articles/1 なら id=1) を拾うもの

## `new`アクション
```ruby
def new
  @article = Article.new
end
```
- 空っぽの Article オブジェクトを作るだけ
- 「新規作成フォーム」に渡すために使う
- なんで保存しないのにnewをするのは、あくまで「フォーム表示用」で、保存はしてないから

## `create`アクション
```ruby
def create
  @article = Article.new(article_params)
  if @article.save
    redirect_to article_path(@article)
  else
    render :new, status: :unprocessable_entity
  end
end
```
- フォームから送られてきたデータを使って、新しい記事を保存する
- `@article.save`が成功したら、その記事の詳細ページに飛ぶ

## `render :new, status: :unprocessable_entity`について
`render :new`
→ フォームのページ (new.html.erb) をもう一回表示

`status: :unprocessable_entity`
→ HTTPステータスコード422を返す
（「入力ミスで保存できなかったよ」 っていう意味をサーバー側で伝えるため）

## `redirect_to`と何が違うのか
-  `redirect_to`はブラウザに「URL変えて！」と命令をする
- しかし、`render`は「今のURLのまま」ページを表示
- 失敗したら元の「新規投稿フォーム」の画面を出して、エラーを見せたい

## `private`と`article_params`について
```ruby
private

def article_params
  params.require(:article).permit(:title, :content)
end
```
- `private`から以下は「外部から呼び出さないメソッド」
- `article_params`は、フォームから送られてきたデータの中から 必要なもの (titleとcontent) だけを抜き出す
- セキュリティ対策で、勝手に変なパラメータ送られるのを防ぐため

## まとめ
- `index`→ 全部取ってくる
- `show`→ 1個取ってくる
- `new`→ 空っぽオブジェクト作る
- `create`→ 保存を試みる。失敗したら`render :new, status: :unprocessable_entity`
- `article_params`→ セキュリティのため、取り出すデータを制限する

--------

わからないときは、「何をしたいか」に着目していきます。
間違えていたら、すいません。
[VRChat] Light Limit Changerでアバターの明るさを変更

## ⭐️目的

アバターの明るさを変更

## ⭐️参考

https://vrnavi.jp/light-limit-changer-vrc/

### ☂️公式

https://azukimochi.github.io/LLC-Docs/


## ⭐️インストール
https://azukimochi.github.io/LLC-Docs/

![スクリーンショット 2025-04-30 0.39.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/d10bcd6e-6c46-4c20-8b4c-48b99d02d425.png)


## ⭐️使い方

### ☂️セットアップ

![スクリーンショット 2025-04-30 0.41.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/8f0a690f-44d8-48cb-8cf2-f618f83182fa.png)

- 本体を右クリックしてセットアップを選択


### ☂️動作確認

![スクリーンショット 2025-04-30 0.43.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/f78703a9-a519-412b-96da-31ec3d43a0bd.png)


- LLCが追加された

![スクリーンショット 2025-04-30 0.43.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/575d1bc2-65b5-48c9-89fe-cb6877bae3fc.png)

100%

![スクリーンショット 2025-04-30 0.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/8b6e9872-42c5-4556-8670-15bebcccd255.png)

0%

### ☂️エディターでの設定

![スクリーンショット 2025-04-30 0.46.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/52c24c73-df83-4798-8a6b-204243b04bf8.png)

![スクリーンショット 2025-04-30 0.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/c8465256-f165-495b-bc5e-469285d1b492.png)


### ☂️初期状態で有効化

![スクリーンショット 2025-04-30 0.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610706/6905e14c-c1cc-4464-b72b-e44135b25516.png)

- ここをクリック

## ⭐️有料版

https://booth.pm/ja/items/4864776

- こっちのほうが機能がいっぱい
GitやGitHubの使い方メモ

# 最初に
　開発超初心者がGitやGitHubを使いこなせるようになるためのメモ。チーム開発をした際にGitやGitHubの使い方が分からなかったので最初から勉強してみる。

# :wrench:Git/GitHub/リポジトリってなに？:wrench:
超ざっくり一言で言うと

**Git** はファイルの変更履歴を管理する道具

**GitHub**はそのGitの履歴付きファイルをインターネット上で共有できる場所

**リポジトリ**は「ファイル」+「誰が、いつ、どこのプログラムを直したのかを管理」したものをかっこつけて言っただけ

こんな感じです。

Gitを使うと「あー、プログラムを少し前の状態にもどしたいな」と思った時にそれができる。まさにドキュメントのタイムマシン。

GitHubはGitで管理しているプロジェクトをインターネット上で保管・共有できるサービスなのでチーム開発でよく使います。

リポジトリは過去の変更履歴がばっちり残ったすごいフォルダです。

# ローカルリポジトリ / リモートリポジトリとは？

GitやGitHubを使うにあたって、「ローカルリポジトリ」や「リモートリポジトリ」という言葉が出てきます。

これも超ざっくり一言で言うと

**ローカルリポジトリ**は自分のパソコンの中にあるプロジェクトの保存場所
**リモートリポジトリ**はインターネット上にあるプロジェクトの保存場所

です。

 
# GitHubでリモートリポジトリを作る
　GitHubのアカウントにログイン後
 
　1. 右上の「+」→「New repository」に移動。
　2. Repository nameの所に任意のリポジトリ名を付ける。
　3.「Public」or「Private」にする。(公開する、もしくはしないか決める)
　4. Create repositoryで作成

　今回は文法ゲームを作る予定なのでリポジトリ名は「Grammar-Game」としました。高校生の時に皆でやっていた、くだらないゲーム作るぞ('ω')

 この時点でリモートリポジトリのURLが発行される。
 「https://github.com/自分のユーザ名/リポジトリ名.git」
 こんな感じ。これは後からGit Bashで使う。

# 自分のパソコンにローカルリポジトリを作る

Git Bashを開いて、

```bash
cd ~/Desktop/開発  # 作業したい場所に移動
mkdir Grammar-Game  # フォルダ作成
cd Grammar-Game  # フォルダに入る
git init  # ローカルリポジトリを初期化
```
この「git init」というのは、ローカルリポジトリを新しく作るためのものです。今いるフォルダがGitで管理できるようになります。

# ファイルをGitに登録してコミット
```bash
git add .
git commit -m "初めてのコミットだよ"
```
「git add .」というのは、全ての変更をステージに登録すること。
「git commit -m "メッセージ"」は、ステージにある変更を「履歴」として保存すること。
-mの""の中に何をしたのか作業内容を簡単に書く。

# リモートリポジトリとつなぐ
```bash
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
```
これでGitHubのリモートリポジトリと接続することができます。

# リモートリポジトリに初回pushする
```bash
git branch -M main     # （必要ならブランチ名をmainに統一）
git push --set-upstream origin main
```
これでOK!
「git branch -M main」は現在のブランチをmainに変更するためのものです。
「git push --set-upstream origin main」はリモートリポジトリに初めてpushする＆紐づけるときに使うコマンドです。

# 2回目以降の作業はこれだけやる！
```bash
git add .
git commit -m "変更内容を簡単に書く"
git push
```
ファイルを追加・編集したらこんな感じで変更内容を書いた後にpushする。

# よく使う関連コマンド
```bash
git status
git log
git clone https://github.com/他のユーザ名/リポジトリ名.git
git pull
git diff
```
**git status**
今の状態を確認するコマンド
**git log**
コミットの履歴を見るコマンド
**git clone https://github.com/他のユーザ名/リポジトリ名.git**
リモートリポジトリを丸ごとコピーしてくる(他の人のプロジェクトをダウンロードする感じ)チーム開発を開始する時にも使える！
**git pull**
リモートリポジトリから最新の変更を自分のローカルに取り込む
**git diff**
どこが変更されたか具体的に比較する

# 最後に
メモなので見にくいかもしれませんがお許しください。
それと間違っている箇所があれば教えてくださると助かります🐱
これから開発頑張るぞ🌞
HTC VIVE XR ELITEのSeeThoughをunityで最低限動かすだけ

1.unity2021.3.22f1（androidビルドも一緒に）インストール
2.androidにスイッチ
3.VIVEレジストリを追加
4.VIVE Wave XR Plugin系インストール
5.XR Plug-in ManagementをWaveXRに
6.シースルーサンプルはないので適当なシーンでInterop.WVR_ShowPassthroughUnderlay(true);
7.MainCameraをsolidcolorでbackgroundを黒(0,0,0,0)
8.ビルドしてapkインストール
9.カメラパススルー確認（視界の中央にコントローラや手があるともやもやするのは仕様です。）

https://hub.vive.com/storage/docs/en-us/TutorialMR/TutorialForMRContents.html
Next.jsのプロジェクトをCloudflareにデプロイしようとしたら躓いた

バージョンはNext.js 15
# api\open-graph\route.tsで躓いた
JSDOMを使うのやめて、DOMParserを使う事にしたらエラーが解消しデプロイが通った。

しかしDOMParserでは一部機能が動かなかったため、Edge 環境向けに HTMLRewriter を使うことにした。
HTMLRewriterの場合Cloudflareのランタイム環境で動かす必要ある点に注意。

https://zenn.dev/maretol/articles/ad576aff797513

https://zenn.dev/uyas/articles/0b7dcbb46d8031

https://developers.cloudflare.com/workers/runtime-apis/html-rewriter/

https://developers.cloudflare.com/pages/functions/

https://developers.cloudflare.com/pages/how-to/refactor-a-worker-to-pages-functions/

https://scrapbox.io/razokulover-tech-memo/Cloudflare_Pages_+_Functions_+_Workers_KV%E3%81%A7%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E3%81%97%E3%81%9FWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8B


# Node.js Compatibility Errorの解消
Cloudflareのプロジェクト→設定→ランタイム→互換性フラグに
```
nodejs_compat
```
を指定して保存

これでエラーが解消された。

# 参考
https://zenn.dev/maretol/articles/3c24c6f40628e0

https://github.com/cloudflare/next-on-pages/issues/952

https://www.reddit.com/r/nextjs/comments/1gs8hoc/has_anyone_tried_deploying_nextjs_15_to/

https://zenn.dev/tacchan5424/articles/7a85aa6172e566

https://www.gaji.jp/blog/2025/03/28/22690/

https://zenn.dev/maretol/scraps/ff76439f968fab
達人に学ぶDB設計徹底指南書まとめ１


# 論理設計・物理設計・正規化・パフォーマンス・インデックス設計まとめ

達人に学ぶDB設計徹底指南書を読んだので、アウトプットとしてまとめます！


---

#  論理設計と物理設計とは？

###  論理設計
> **データを整理し、「テーブル設計図」に落とし込むこと**

**目的：**  
- データの無駄をなくす（正規化）
- 矛盾や更新ミスを防ぐ
- どんな情報をどのテーブルで管理するか明確にする

**例：**  
| テーブル名 | カラム一覧 | 備考 |
|:---|:---|:---|
| 顧客(Customer) | 顧客ID、名前、メールアドレス |  |
| 注文(Order) | 注文ID、顧客ID、注文日、合計金額 | 顧客IDは外部キー |

ここではまだ「int型？varchar型？」とか**考えません。**

---

###  物理設計
> **論理設計を、実際に動くDB（MySQL、PostgreSQLなど）に落とし込むこと**

**目的：**
- 型選定（int, varchar, text, datetime など）
- インデックス設計
- パーティション、シャーディングなどの性能設計

**例（PostgreSQL向け実装案）：**
```sql
CREATE TABLE customer (
  customer_id UUID PRIMARY KEY,
  name VARCHAR(255),
  email VARCHAR(255) UNIQUE
);

CREATE TABLE "order" (
  order_id UUID PRIMARY KEY,
  customer_id UUID REFERENCES customer(customer_id),
  order_date TIMESTAMP,
  total_amount INTEGER
);
```

ここで**初めて、型やインデックスを考える**！

---

## ✅ 論理設計→物理設計への流れイメージ

```
要求・業務分析
    ↓
概念設計（ER図作成）
    ↓
論理設計（正規化、テーブル設計）
    ↓
物理設計（型・インデックス・性能考慮）
```

---

# 📚 正規化とは？

簡単に言うと
> **「データの重複・矛盾をなくすための整理法」**

もし正規化しないと、例えば：

| 顧客ID | 顧客名 | 注文ID | 商品名A, 商品名B, 商品名C |  
|:---|:---|:---|:---|  
| 1 | 田中太郎 | 123 | リンゴ,バナナ,オレンジ |

こんな感じで**「カンマ区切りで複数商品」**とかやっちゃいます。  
これ、商品を1個削除したり更新したりすると大事故が起きる

---

### 正規化の段階と例

| ステップ | やること | 具体例 |
|:---|:---|:---|
| 第1正規形（1NF） | 繰り返し・複数を排除する | カンマ区切り→別行にする |
| 第2正規形（2NF） | 部分従属を排除する | 複合主キーを整理する |
| 第3正規形（3NF） | 推移従属を排除する | 他のカラムに依存するデータを別テーブルへ |

---

**具体例（簡易版）**

もともと

| 顧客ID | 顧客名 | 注文ID | 商品名 | 商品価格 |
|:---|:---|:---|:---|:---|
| 1 | 田中太郎 | 100 | リンゴ | 100円 |
| 1 | 田中太郎 | 100 | バナナ | 80円 |

→ 正規化後：

- 顧客テーブル
- 注文テーブル
- 注文明細テーブル
- 商品テーブル

に分割する！

---

#  パフォーマンスを意識したDB設計

**正規化は正義だけど、やりすぎるとパフォーマンスが落ちる。**

理由は単純
- SELECT時にJOINが増える
- INSERT/UPDATE時に複数テーブル操作になる

**だから現場ではこうする：**

| 状況 | 対策 |
|:---|:---|
| ほぼ読み取り専用 | 非正規化して一発でSELECTできるようにする |
| 書き込みが多い | 正規化をきちんと維持して更新ミスを防ぐ |
| ビッグデータ | 読み書き分離（Replica DB）＋キャッシュ導入（Redisなど） |

---

#  インデックス設計（特にB-Tree）

インデックスとは一言で言うと、
> **「検索を速くするためのデータの目次」**  

**ないと：**  
- 全件スキャン（フルテーブルスキャン）
- データ量が増えると超激遅

---

### インデックスの種類（代表）

| 種類 | 説明 |
|:---|:---|
| B-Treeインデックス | 最も基本。範囲検索に強い |
| Hashインデックス | 完全一致検索に特化（MySQL Memoryエンジンのみ） |
| GIN/GiSTインデックス | PostgreSQLで全文検索とか特殊用途 |

---

##  B-Treeインデックスとは？

「バランスの取れた木構造（Binary Treeではない）」  
- 木の高さが低く保たれる
- 左右のノードに規則性がある
- **範囲検索が超速い**

**B-Treeインデックスが活躍する場面例**
```sql
SELECT * FROM users WHERE age BETWEEN 20 AND 29;
```
この「範囲検索」が爆速になります！

---

##  インデックス設計の基本ルール

| ポイント | 解説 |
|:---|:---|
| よく検索されるカラムに貼る | 例：ログイン時の「email」など |
| 絞り込み条件(WHERE句)に使うカラムに貼る |  |
| ソート(ORDER BY)に使うカラムも検討する | |
| 更新が頻繁すぎるテーブルは貼りすぎない | INSERT/UPDATEが重くなる |

---

#  まとめ

| 項目 | 重要ポイント |
|:---|:---|
| 論理設計 | 正規化して矛盾のないテーブル構造にする |
| 物理設計 | 型・インデックス・パフォーマンス最適化 |
| 正規化 | 無駄を排除、でもやりすぎ注意 |
| パフォーマンス設計 | 読み取り/書き込み負荷に応じて非正規化も検討 |
| インデックス設計 | 必要な箇所にだけ、範囲検索を意識して貼る |
【Fish】StarshipでTransientPromptを設定する方法


`~/.config/fish/config.fish`に以下を追記するとTransientPromptが設定できます。

```config.fish
function starship_transient_prompt_func
  starship module character
end
starship init fish | source
enable_transience

```

上記の場合には実行後のプロンプトは`>`のみになります。

![画面収録 2025-01-14 0.04.17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/486592c5-6d5b-cebb-47d7-1557da4c30af.gif)
【Blender】モノとの距離に対応して光るランプをつくる

Blenderのジオメトリノード / Geometry Node を使って、モノとの距離に応じて光の強さを変えるランプ群を作る方法のメモです。
(実行環境：Blender4.4.1/Windows11)

# 完成像
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/35405751-5020-4a32-8e1b-ec0d7482a94e.gif)
こんなふうに、ターゲットオブジェクトとの距離の変化に応じて、複製配置したランプの光の強さが変化します。
![node.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/0730dc5a-0f49-47f6-96e6-d2fa735ce6fe.png)
ノードの全体像はこのような感じです(後で詳しく解説)。
(左:シェーディングエディタ、右：ジオメトリノードエディタ)

# 用意するもの
3Dビューポート上に以下の設定をしたオブジェクトを用意します。
(名前は自由ですが後の説明の便宜上以下のように設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/87edbea6-b86c-452a-b2a0-6b303c4b75c5.png)
- `Lamp` ： ランプ(発光体) として使いたいオブジェクト
    - 適当なマテリアルを設定しておき、名前は `Light` としておく
- `Target` ： 光の強さを調整する距離計測の対象とするオブジェクト

残りは全てジオメトリノード上で作成します。

# 完成形
ジオメトリノードとマテリアルノードでできています。
- ジオメトリノード↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/2d9eebac-c195-4568-8c14-dcaebf211896.png)
- マテリアルノード↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/7292d7d5-080b-43aa-a115-aaafa0de8c9b.png)

# 作り方
大まかに3つの部分で構成されます。
### 1️⃣LampをGrid上のポイントに複製配置
まずジオメトリノードから。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/421625f5-8e32-4f6d-a3c0-21bbe3f40f5b.png)


手順
1. Lampを選択した状態で、ジオメトリノードエディタで➕️ボタンを押すと、1-1 (`Group Input`) と1-2 (`Group Output`)が作成されるはず  (Group Inputには Lampオブジェクトが入る)
2. `Grid`ノードで、Lampを配置するための基準となる頂点ポイントを作成
3. `Instance on Points`ノードで、LampをGridの頂点ポイント上に配置

結果：Lampが、Gridの格子ポイント上に配置されるはず。
### 2️⃣複製配置したインスタンスたちに渡す明るさ属性をつくる
引き続きジオメトリノードを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/b05287f8-975f-4ff0-a42c-c088e7068989.png)

手順
1. `Store Named Attribute`ノードで、Gridから流れてくる各ポイント(複製配置先)にマッピング対応する値を保存できる属性を用意
2. `Set Material`ノードで、複製配置したLampのインスタンスたちに対してマテリアル Light を設定
3. `Position`ノードを用意 (のちのちこれはGridノードがつくる頂点ポイントたちを読み込む)
4. `Object Info`ノードで、オブジェクト Target の Location を読み込む
5. `Vector Math`ノードで、3と4の距離を計算・出力
6. `Map Range`ノードで、5から流れ込んだ距離を、適切な値にスケールして、1に流し込む
7. `Store Named Attribute`ノード上で、属性に名前を付ける (ここでは PowerbyDistance という名前)

結果：Gridの各頂点に紐づく、ターゲットオブジェクトとの距離に対応する明るさ属性がつくられ、複製配列したLamp インスタンスたちにおのおの引き渡せるようになる
### 3️⃣明るさ属性を、Light マテリアルの情報に紐づけさせる
シェーディングエディタへうつります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/965ed64b-55df-4057-8ae5-853aa17e076a.png)
- `Attribute`ノードを追加し、EmissionのStrengthに、さきほどつくった属性を流し込む

結果：Lampのインスタンスたちの明るさが、Targetとの距離に反応するようになる。

→完成です。
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/35405751-5020-4a32-8e1b-ec0d7482a94e.gif)

# 補足：属性の確認のしかた
Girdがつくる各頂点に対して付与した属性の値をリアルタイムで確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/974b9abd-389b-41da-bb76-16f2ef0303be.png)
- `Store Named Attibute`ノードに、 `Viewer`ノードを付け、目を開けさせる
- SpreadSheetを開いて確認 (右上のピンをとめておく)
![Attribute.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4029866/7bb664b9-8146-4616-b05e-9a7a11c03560.gif)
Store Named Attributeでつくった、Gridがつくる、0から8までの9つのVertex(頂点)に付与した属性 (ここでは "PowerbyDistance")が、ターゲットとの距離に応じて変化している様子が確認できます。


以上
最近のプラットフォームアップデート

 2025年4月24日のリリースでは、オンボーディングプロトコルが改善されました。今後は、すべての新規アカウントに同じデフォルトのマテリアル（FCC Silicon）やワークフロー（Total Energy, QE）を追加するのではなく、オンボーディングプロセスが開始されます

  注目のポイントは次の3つです：(1) マテリアルバンクまたはプロジェクト、あるいはローカルファイルから材料を選択し、新規アカウントの初期化に使用、その後それらの1つをデフォルトとして設定できる機能、(2) アカウント初期化時にワークフローバンクからワークフローを選択・インポートし、1つをデフォルトに設定できる機能、(3) 選択内容をまとめたオンボーディングサマリータブにより、ホームページへのナビゲーションやシミュレーションジョブなどのエンティティ作成への導線を提供。

   新機能：
新規アカウント向けの新しいオンボーディングプロトコル

 改善点：
プロジェクトおよびアカウントページの読み込み速度を改善

バグ修正：
複数の軽微なバグ修正

開発者向け：
[ESSE] primitive、abstract、structuralスキーマの整理
[Code] 基本クラス：ArrayWithIds、RoundedVector3D を実装
[Made] JS を TypeScript に変換し、テストを追加

 無料でお試しください：https://www.mat3ra.com/?utm_source=qiita&utm_medium=newsletter

#materialsscience
#mat3ra

![Post-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4022238/7481d5b3-ba0a-4249-9652-ef7a95dfffa1.png)
AWS認定試験合格に向けて、まずは試験勉強用サイトを作ってみた

##  TL;DR

自身のAWS学習のために以下のサイトを作ってみました。
全AWS認定資格の問題をトータルで3000問ほど公開しています。
クイズ形式で解くことができます。

https://www.shikaku-gokaku-neko.jp/


## 経緯

### 転職を機にAWSの勉強が必要になる
　2024年春、新卒から数年働いてきた会社から転職をしました。
  前職も現職もポジションとしては事業会社の社内SEなのですが、オンプレのアプリばかりだった前職に比べ、現職の担当アプリはほとんどがAWSで稼働しており、AWSを理解しないことには仕事にならない状況でした。

### SAAを取得するものの…
　そんな状況でしたので、まずは基本的な知識をつけるためにソリューションアーキテクト - アソシエイト(SAA)の勉強に着手し、昨年末ごろにようやく資格を取得することができました。一方で、当然ながらSAAを取ったからと言って実務で活躍できる場面はまだまだ少なく、やはり実際に触る機会をもっと増やさないと…ということで、今年の4月頭くらいからタイトルに記載のサイト開発を始めました。

## 実際に作ったサイトの内容
「資格合格ネコ」というAWS認定試験の問題を解くことができるサイトを作りました。サイト名の命名含め、アプリの開発自体は生成AI君に大活躍してもらい、私としてはアプリを稼働させるために必要なAWSリソースの設計や実装をメインに行いました。

| 主な機能 | AWS サービス | 備考 |
|------------|--------------|-------------------|
| ホスティング | **Amplify** | 試験勉強中はあまり印象が薄かったんだけど、使ってみたら便利だった |
| 問題の格納 | **DynamoDB** | Auroraも使ってみたかったけど、今回は手っ取り早かったこっちで|
| 問題生成 | **EventBrigde + Lambda + Bedrock** | 生成 AI 呼び出し＋テーブル格納の自動化 |

上記の問題生成の自動化により、大量の問題を生成することができました。CLFやSAAについては500問以上、その他の資格についても各200問以上は生成ができたので、すでにデータとしては3000問ほど公開しています。（なお、とにかく自動で大量生成しただけで中身の精査は行っていないため、問題の品質はさっぱりわかりません！)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2842586/728d3dbe-fe7b-4f0c-b8b6-59bacb7f0b1c.png)


## うまくいった点

上記の通りですが、EventBridge+Lambda+Bedrockの部分はしっかり連携を作りこむことができ、ほんの2日で3000問以上の問題生成を実現できたのは満足感があります。


## 反省点など
* コストが馬鹿にならないです。。うまくいった点として記載したBedrockの連携に関しては、2日で$40ほどのコストが発生しており、本当はもっと大量に問題を作りたかったのですが一旦スケジュールは無効化しています

* CloudFormationは結構苦戦しました。ミスってスタックを作り直したり、ゴミみたいなリソースが複数できちゃったり、結構ここで時間を取られた印象があります。

* セキュリティとかコストの観点での設計/実装はまだまだ改善できるポイントが多いかなと思ってます。このあたりは一番実務につながるところだと思ってるので、もう少し意識したいなと。

## 今後やりたいこと

### Cognitoでのユーザー管理  
せっかく問題を大量に作ったので、問題の回答の履歴であったりをユーザー毎に記録して閲覧できるようにしたいなと。

### 対象とする資格の拡充
現状はAWSの資格だけですが、ほかにもIT関係の資格の問題は増やしていきたいと思ってます。基本的には自分が今後受験したいものとかが優先度高いかなと思ってます。

### その他
当初の目的であるAWSの勉強から逸れますが、シンプルにサイトの開発が楽しくて没頭してしまったので、便利そうな機能とかはどんどん追加してみたいなと思ってます。
ソフトウェアアーキテクチャパターンを解説


現代のソフトウェア開発では、次のような複数のアーキテクチャパターンがあります！

- レイヤードアーキテクチャ
- パイプラインアーキテクチャ
- サービスベースアーキテクチャ
- イベント駆動アーキテクチャ
- スペースベースアーキテクチャ
- マイクロサービスアーキテクチャ

本記事では、これらの概要と特徴、メリット・デメリットを全部まとめて解説！

---

# 1. レイヤードアーキテクチャ

【概要】
機能を「層(Layer)」に分け、上から下へ順第に出入力する構成。

【代表例】
- Webアプリ(表示層、ロジック層、データアクセス層)

【メリット】
- 分識がわかりやすい
- 各層で他層に影響させず変更可

【デメリット】
- 層を越える速度が遅い(インピーダンス)
- スパゲッティ化しやすい

---

# 2. パイプラインアーキテクチャ

【概要】
変換・加工をならべて続けていく「パイプ」の系列。次々にデータを滑らせて出力する。

【代表例】
- ビデオプロセシング
- ストリーミングAPI

【メリット】
- 課題を次々に分割できる
- リトライム性が高い

【デメリット】
- この流れから外れる変更に弱い
- データ互換性テストが必要

---

# 3. サービスベースアーキテクチャ

【概要】
機能単位(サービス)ごとに分離してシステムを組み立てる構成。

【代表例】
- SOA(Service Oriented Architecture)

【メリット】
- 内部構造の自由度が高い
- 内部をすり替えやすい

【デメリット】
- サービス管理は複雑
- 接続経路の偵索が困難

---

# 4. イベント駆動アーキテクチャ

【概要】
「イベント(Event)」に対してシステムが反応し、非同期に動く。

【代表例】
- Kafka、SQS + Lambda連携

【メリット】
- ルーズ性が高い
- 非同期処理でスケーラブに強い

【デメリット】
- デバッグが難しい
- 独特の設計思考が必要

---

# 5. スペースベースアーキテクチャ

【概要】
複数のインスタンスが一緒に悪い方向に働かないよう、キャッシュを中心にスケーラブにする構成。

【代表例】
- In-Memory Data Grid(IMDG)
- Hazelcast

【メリット】
- スケール性高
- 隔離障害に強い

【デメリット】
- キャッシュ管理が複雑
- 実装コストが高い

---

# 6. マイクロサービスアーキテクチャ

【概要】
最小単位のサービスを自立させ、各自独で開発、配置、スケールできる。

【代表例】
- Amazon、Netflix

【メリット】
- 自立性高い
- スケール性が最高レベル

【デメリット】
- 管理コストが最大
- ネットワークオーバーヘッドが必要

---

# 【まとめ】

同じ「ソフトウェアの構築」でも、

- プロジェクトのスケール
- 開発チームの性質
- ユースケースの要件

によって適切なパターンは違います。
今週の学習記録（2025/04/20～2025/04/26）

## 🔍 学習内容
- **学習テーマ**: Rails, Scss
- **使用した教材**: Udemy
- **学習時間**: 12h

## ✏️ 学んだこと
- RailsとScssを使用したアプリ開発

## 💡 学び・反省点
### 学び
- Rubocopでコード整形ができる。
- Deviseを使用することでログイン関連機能を迅速に実装することができる。
- Rspecで自動テストを実行することができる。
- Capybaraでユーザー操作を再現したテストを行うことができる。
- FactoryBotを使用することでテストデータ生成を簡単に行うことができる。

### 反省点
- 学習時間が短すぎること。


## 📆 次週の予定
### 目標
- Railsアプリ開発を進められるところまで進める。
- 休日の学習時間を増やす。

### 行動計画
- その日にいつにどれくらい学習するのかを前日に決めておく。
- 起床時間を早める。

## 🏄‍♂️所感
　しばらく投稿しておらず久々の投稿になってしまったことにまずは猛省。そもそも投稿することすら忘れることもあったので、今週から喝いれて継続していきます。  
　ReactからRailsにシフトチェンジし、アプリ開発を行っておりようやくアウトプットに入ることができました。MVCフレームワークはSpringを使用したことがあるのですぐ習得できると思っていましたが、Rails独自の記法が思ったより多く手こずっているのでアプリ開発を通じて知識定着を図りたいと思います。
JavaScript勉強ログ　配列関係のメソッド2

## ◾️配列の結合や分離

### .concat()

配列の結合。元の配列は上書きされない。

```jsx
const arrayCats = ['tama','mike'];
const arrayDogs = ['pochi','hachi'];
console.log(arrayCats.concat(arrayDogs));
//(4) ['tama', 'mike', 'pochi', 'hachi']
console.log(arrayCats);
//(2) ['tama', 'mike']
//→もとの配列は変化しない

console.log(arrayCats.concat(arrayDogs,'kuro'));
//(5) ['tama', 'mike', 'pochi', 'hachi', 'kuro']
```

### .slice()

元の配列を壊さずに、取り出す。追加、置き換えはできない。

```jsx
const foods = ['蕎麦','ピザ','ラーメン','ハンバーガー','寿司','うどん'];
console.log(foods.slice());
//(6) ['蕎麦', 'ピザ', 'ラーメン', 'ハンバーガー', '寿司', 'うどん']
console.log(foods.slice(2));
//(4) ['ラーメン', 'ハンバーガー', '寿司', 'うどん']
//配列の2番目以降が切り取られる
console.log(foods.slice(2,4));
//(2) ['ラーメン', 'ハンバーガー']
//配列の2番目以降3番目まで（4番目は含まれない）
console.log(foods);
//(6) ['蕎麦', 'ピザ', 'ラーメン', 'ハンバーガー', '寿司', 'うどん']
//元の配列は書き換えられない
```

### .splice()

配列の削除・追加・置き換えの3つの操作ができる。元の配列は上書きされる。

第一引数に開始値、第二引数に何個消すか、第三引数に何を追加するか。

`splice()` は1回につき1か所しか操作できないので複数の場所に反映したいときは順番に処理を書く。

```jsx
const week = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday',];
console.log(week.splice(1,2));
//(2) ['Tuesday', 'Wednesday']
//切り取った配列
console.log(week);
//(4) ['Monday', 'Thursday', 'Friday', 'Saturday']
//元の配列は上書きされる

console.log(week.splice(1,0,'Tuesday', 'Wednesday'));
//[]
// 消したものはないのでから配列が表示される

console.log(week);
//(6) ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

week.splice(0,0,'Sunday');
console.log(week);
//(7) ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
```

## ◾️特定の要素が含まれているか判定

### .include()

特定の値が含まれているか、真偽値を返す。

```jsx
const color = ['red','blue','pink','yellow','orange'];
console.log(color.includes('red'));
//true

```

### .indexOf()

指定した値と同じ要素の位置を返す。先頭から探す。ないときは-1を返す。

```jsx
console.log(color.indexOf('orange'));
//4
console.log(color.indexOf('green'));
//-1
```

### .lastIndexOf()

指定した値と同じ要素の位置を返す。末尾から探す。ないときは-1を返す。

```jsx
console.log(color.lastIndexOf('orange'));
//4
console.log(color.lastIndexOf('green'));
//-1
```

テスト関数で判定するメソッドについては、筆者が関数についての学習がまだのため、学習後にまとめたいと思います。

- .find()
- .findIndex()
- .every()
- .some()
- Object.groupBy()
- Map.groupBy()
MacBook Air(M2, 2022)でBurp Suiteをインストールしてみた

# 今回の内容
MacBook Air(M2, 2022)でBurp Suite(Community Edition)をインストールしていきたいと思います。
とても簡単な手順ですが、環境構築でつまずいてしまうと面白くないので記事にしておきます。

インストール手順のみになるので、「Burp Suiteとは？」「Burp Suiteの使い方は？」などを知りたい方は、どうぞお戻りください。
（使い方に関しては、公式のチュートリアルをやってみましたが、短くてわかりやすい素晴らしい内容でした。練習として用意されたWebサイトを使用するには、メールアドレスでの登録が必要でしたが、テキストを読むだけでも十分に学べると思います。）


# 手順１
![BurpSuite_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/bad61c75-7b27-402f-9425-23575a84dd32.png)
[ここ](https://portswigger.net/burp)をクリックして、インストールするためのWebサイトに移動します。
その後、画面を一番下までスクロールします。
画像と同じように左側に「Burp Suite Community Edition」が出てくるのでクリックしてください。

 # 手順２
![BurpSuite_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/5d66fb54-c7cb-490e-a0a3-93cab00e9c53.png)
メールアドレスを入力して、右側の「DOWNLOAD」をクリック。

 # 手順３
![BurpSuite_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/b8c2aced-7b18-4344-a7f6-29c156234c3b.png)
ここ、注意してください。

1. Burp Suiteで"Community"を選択する
1. macOSの"Apple Silicon"を選択する

選択後、右の「DOWNLOAD」をクリック。

補足
・"Professional"は有料ですが、"Community"は無料です。十分な機能が使用できるので、"Community"を選べば大丈夫でしょう
・今回は、MacBook Air(M2, 2022)を使用しているので、"macOS Apple Silicon"を選択しました。お手元のPCに合わせて、正しいものを選択してください

 # 手順４
![BurpSuite_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/1ddd4015-14eb-496d-bf7d-0ed85da3ac33.png)
ダウンロードしたファイルを開きます。
その後、表示されたBurp Suiteのアイコンを、ドラッグ＆ドロップしてApplicationsに移動します。

 # 手順５
![BurpSuite_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/cd25dc9c-f1b1-490e-b292-aa58066c8edb.png)
右下の「I Accept」をクリックするだけ。

 # 手順６
![BurpSuite_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/cc307246-4187-47bf-9aa5-c156760cb9dd.png)
右下の「Start Burp」クリックするだけ。

 # 手順７
![BurpSuite_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/086001d6-d1b3-4fe5-a38d-f95bb1d0a921.png)
右下の「Start Burp」をクリックするだけ。

 # 手順８
![BurpSuite_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945501/1b1e3182-b89a-41bc-bbec-06f7d06039bc.png)
この画面が出てきたらインストール完了です！お疲れ様でした。

# まとめ
今回は、MacBook Air(M2, 2022)で、Burp Suite(Community Edition)をインストールしました。
僕は環境構築をするたびに、「面倒だな〜」と思ってしまうタイプの人間です。
同じような人のために、少しでも役に立てればと願います。
Turborepoとは？



# Turborepoとは？

**Turborepo**（ターボレポ）は、  
簡単に言うと **「たくさんのプロジェクトをまとめて管理・高速ビルドできるツール」** です。
JavaScriptおよびTypeScriptコードベース向けの高性能ビルドシステムこと。


たとえば、

- フロントエンド（Next.js）
- バックエンド（NestJS）
- 共通ライブラリ（UIコンポーネント集）
- 管理ツール（管理画面）

これ、バラバラで管理してたらめちゃくちゃ大変！ 
**Turborepo**を使えば、これらを「1つのリポジトリ」にきれいにまとめて、  
しかも「速く開発」「速くビルド」できるようになります！

---

# 🏗️ モノレポとマルチレポの違い（Turborepoと関係あり）

| 項目 | モノレポ | マルチレポ |
|:---|:---|:---|
| 管理方法 | 1つのリポジトリに全部まとめる | プロジェクトごとに別リポジトリ |
| 例 | `apps/web`, `apps/api`, `packages/ui` などをまとめて管理 | `webリポジトリ`, `apiリポジトリ`, `uiライブラリリポジトリ` みたいにバラバラ |
| メリット | 依存関係管理が楽 / バージョン同期しやすい | 各プロジェクト独立、影響範囲が小さい |
| デメリット | リポジトリが大きくなる / 複雑になりやすい | プロジェクトを横断する作業が面倒 |

**Turborepoはモノレポを最高に快適にするためのツール**です。

---

# 🚀 Turborepoを使うと？

1. **ビルドがめちゃくちゃ速くなる**  
　→ 「キャッシュ」と「並列処理」を自動でやってくれるから！

2. **プロジェクト間の依存関係を自動で管理できる**  
　→ どのプロジェクトがどれに依存してるか、Turborepoが理解してくれる。

3. **無駄なビルドが減る**  
　→ 変更がないものはスキップしてくれる。

4. **CI/CD（GitHub Actionsとか）も速くなる**  
　→ キャッシュがクラウドにも保存できる（VercelのRemote Caching機能）。

---

# 🛠️ 実際にTurborepoを使うとどうなる？（実例）

たとえばこんなディレクトリ構成になります。

```
my-monorepo/
├── apps/
│   ├── web/       ← Next.js（フロント）
│   └── api/       ← NestJS（バックエンド）
├── packages/
│   └── ui/        ← 共通UIコンポーネント
├── turbo.json     ← Turborepoの設定ファイル
├── package.json   ← 全体管理
└── pnpm-workspace.yaml ← 複数プロジェクト管理用
```

ここで、
- `web`は`ui`パッケージを使っている
- `api`も`ui`を使っている

といった依存関係を自動で把握して、  
**「uiだけ変えたら、webとapiだけビルドする」** みたいなことができます。

つまり、  
✅ 何も変わってないプロジェクトをいちいちビルドしない！  
✅ 依存しているプロジェクトだけビルドする！

これが**爆速開発**につながります。

---

# Turborepoをサクッと試す流れ

1. Turborepoをインストール
   ```bash
   npm install -g turbo
   ```

2. プロジェクト作成
   ```bash
   npx create-turbo@latest
   ```

3. ガイドに沿って、`apps`と`packages`を作るだけ！

4. 開発・ビルドコマンドは `turbo run build` とか  
   必要に応じてカスタムもできます。

---

# バックとフロントが別れてる場合でもTurborepoは使える？

➡️ **めちゃくちゃ使えます。むしろおすすめ。**

- **フロントエンド**（Next.js）
- **バックエンド**（NestJSやExpress）
- **共通コード**（API型定義や共通ライブラリ）

これを**Turborepoで一元管理**すれば、
- バックエンドの型をフロントでそのまま使ったり
- API更新に応じて自動で依存先もビルドできたり

めちゃくちゃ開発体験がよくなります。

---

# 📝 まとめ

|  | 内容 |
|:--|:--|
| Turborepoとは | モノレポ開発をめちゃ快適にする高速ビルドツール |
| 使うとどうなる？ | ビルドが速くなる、依存関係が管理できる、開発効率アップ |
| モノレポ？マルチレポ？ | Turborepoはモノレポ向け、マルチレポでは不要 |
| バック・フロント分かれてても？ | むしろ一緒にTurborepoで管理すると最高 |

---