OmniAICreator/Qiita-1.07M huggingface dataset:
Tableau Bridge for Linuxを使ってみたのでメモする

# 参考
https://help.tableau.com/current/online/ja-jp/to_bridge_linux_install.htm
https://tableaujpn.blogspot.com/2024/02/

# やりたいこと
プライベートネットワークにあるDBのデータを使いたい。
EC2(踏み台)などDBにアクセスできる場所でTableau Bridgeを設定する。


# Dockerfile
公式のドキュメントではDockerを使った例のみだったけど、
とりあえずEC2に直接インストールして動くか確認。
動いたのでその内容をまとめてDockerfileにしてみた。
これを使ってECSとかで起動して使ったら良さそう？

```dockerfile:Dockerfile
FROM amazonlinux:2023

# Tableau Bridgeのダウンロードインストール
RUN curl -OL https://downloads.tableau.com/tssoftware/TableauBridge-20243.25.0114.1153.x86_64.rpm\
    && ACCEPT_EULA=y yum install -y TableauBridge-20243.25.0114.1153.x86_64.rpm

#必要なライブラリをインストール
RUN yum install -y unixODBC tar gzip findutils dbus-libs glibc-langpack-ja

# mysql-connectorのダウンロードインストール
RUN curl -OL https://ftp.iij.ad.jp/pub/db/mysql/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.20-linux-glibc2.12-x86-64bit.tar.gz\
    && tar -zxvf mysql-connector-odbc-8.0.20-linux-glibc2.12-x86-64bit.tar.gz\
    && cp /mysql-connector-odbc-8.0.20-linux-glibc2.12-x86-64bit/bin/* /usr/local/bin\
    && cp /mysql-connector-odbc-8.0.20-linux-glibc2.12-x86-64bit/lib/* /usr/local/lib\
    && myodbc-installer -a -d -n "MySQL ODBC 8.0 Unicode Driver" -t "Driver=/usr/local/lib/libmyodbc8w.so"\
    && myodbc-installer -a -d -n "MySQL ODBC 8.0 ANSI Driver" -t "Driver=/usr/local/lib/libmyodbc8a.so"\
    && rm TableauBridge-20243.25.0114.1153.x86_64.rpm\
    && rm mysql-connector-odbc-8.0.20-linux-glibc2.12-x86-64bit.tar.gz\
    && rm -rf mysql-connector-odbc-8.0.20-linux-glibc2.12-x86-64bit.tar.gz

# 環境変数 
ENV LANG="ja_JP.utf8"
ENV LANGUAGE="ja_JP.utf8"
ENV LC_ALL="ja_JP.utf8"

# PATをコンテナにコピー
COPY MyTokenFile.txt /

# Tableau Bridge for Linux 起動
SHELL ["/bin/bash", "-c"]
ENTRYPOINT /opt/tableau/tableau_bridge/bin/run-bridge.sh\
    -e\
    --patTokenId="ec2_bridge"\
    --userEmail="メール"\
    --client="myBridgeAgent"\
    --site="ユーアールアイ"\
    --patTokenFile="/MyTokenFile.txt"\
    --poolId="プールID"
```

プールIDはTableau Cloudで作成し設定する。
Tableau Cloud PATも作成してトークンを以下のようにファイルに保存する。

```:MyTokenFile.txt
{"ec2_bridge" : "とーくん"}
```

起動方法

```
$ docker image build -f Dockerfile -t tableau_bridge .
$ docker container run -d --name tableau_bridge tableau_bridge:latest 
```

## メモ

データソース自体はプライベートネットワークにあるDBに接続できるTableau Desktopで作成しパブリッシュする必要がある。

プライベートネットワークにあるため、そのままだと接続できないので、ローカルでsshを使用してポートフォワードを設定しlocalhostで接続した。

```bash:例
# pemがあるフォルダで以下を実行する（例：C:\Users\user\.ssh）
ssh -i dev.pem -L 3306:dev-mysql.cluster-XXXXXXX.ap-northeast-1.rds.amazonaws.com:3306 ec2-user@<ipアドレス>
```

パブリッシュしたデータソースはlocalhostになっているのでTableauCloudで編集してホスト名を実際のDBのホスト名に変更する必要がある。


結構大変だった。

以上。
Java Silver SE 11と17の違い

初めての投稿になります。
Java Silver SE 11と17の違いについて簡単にまとめてみました。
受験の際に迷っている方の参考になれば幸いです。

## **１．試験概要**

|   |SE 11  |SE 17  |
|:-:|:-:|:-:|
|**試験名**  |Java SE 11 Programmer Ⅰ  |Java SE 17 Programmer Ⅰ  |
|**試験番号**  |1Z0-815-JPN  |1Z0-825-JPN  |
|**試験時間**  |180分  |90分  |
|**問題数**  |80問  |60問  |
|**合格ライン**  |63%  |65%  |
|**試験料**  |37,730円 (税込)<br>※時期によって変動あり  |41,773円 (税込)<br>※時期によって変動あり  |
|**試験日程**  |随時  |随時  |
|**試験方法**  |CBTによる選択式  |CBTによる選択式  |
|**前提資格**  |特になし  |特になし  |

## **２．出題範囲**
Oracle Universityの公式サイトに記載されているチェックリスト([SE 11][SE 11URL]/[SE 17][SE 17URL])を元にした出題範囲の主な違いは下記のようになります。

[SE 11URL]: https://www.oracle.com/jp/education/certification/javase-11-programmer-1/
[SE 17URL]: https://www.oracle.com/jp/education/certification/javase-17-programmer-1/

#### **SE 11にのみある主なチェックリスト**

- モジュール型JDK
- モジュールの宣言とモジュール間のアクセス
- モジュール型プロジェクトのコンパイルと実行
- ラムダ式

#### SE 17にのみある主なチェックリスト
- switch式
- instance ofのパターン・マッチング
- レコード・クラスの作成と使用
- シール・クラスの作成と使用
- try-with-resources文による例外処理
- カスタム例外の作成
- multi-catch句の使用

## **３．実務においての比較**
SE 11は現在多くのシステムにおいて使用されていますが、徐々に移行傾向にあります。
一方、SE 17はSE 11程多くないものの、開発現場での採用が増加しており将来性は見込めます。

## **４．最後に**
主に試験時間、問題数、出題範囲、将来性において違いが見られます。
何に重点を置くかでどちらかを選ぶべきか見えてくるかと思います。
あくまで個人的な意見ですが、どちらでもいい場合はSE 17を受験し、出題範囲におけるSE 11との差分を別途補完するのが無難だと思いました。

### **参考**
- 志賀 澄人,「徹底攻略Java SE 11 Silver問題集[1Z0-825]対応」, インプレス, 2024年8月
- 志賀 澄人,「徹底攻略Java SE 17 Silver問題集[1Z0-825]対応」, インプレス, 2024年10月


https://www.oracle.com/jp/education/certification/javase-11-programmer-1/

https://www.oracle.com/jp/education/certification/javase-17-programmer-1/
【Mac】Difyのローカル環境構築

## Difyの環境構築
こちらの記事を参考に環境構築実施しました。
https://zenn.dev/shown_it/articles/1dcce1071cc1b7

## Dockerのインストール
https://docs.docker.com/get-started/get-docker/

dockerとdocker-composeをbrew install
```
brew install --cask docker
brew install --cask docker-compose
```

## Difyリポジトリのclone
- GithubリポジトリからのDifyのClone
    - https://github.com/langgenius/dify

```
cd Dify #任意のディレクトリに移動
git clone https://github.com/langgenius/dify.git
```

## Dockerの起動
- 初回起動の場合はSign up / Sign in が必要
```
open -a Docker
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/461fa595-d7db-47ed-9a92-bebcfa83ce77.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/fa69b775-4ac0-40a5-ab07-fe7a16b65a55.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/5d0e8eb8-2b23-4c22-9f4a-636014b0066d.png)

Dockerがrunningになっていることを確認。
（なっていない状態でupしようとするとエラーになった）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/3c8d090e-4361-4dfc-ab0b-86468352f848.png)


```
cd dify/docker
cp .env.example .env
docker-compose up -d
```

## 初期設定
- http://localhost/ にアクセスし、管理者アカウントを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/6ccb8763-e468-42f7-a28b-bdb9fbed0804.png)

無事にDifyの画面に来れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323946/edab7039-ea4a-4114-845b-85720cc024fd.png)
ドライブ（パーティションボリューム）作成

# 概要
Windows Server 2022のインストール、初期設定直後に、新規ドライブ(F:\)を
作成しようとしたところ、ディスクに空き領域がありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/77e4b0f4-dab9-444f-b5aa-983c136740e6.png)

今回は、Cドライブへの割り当てを縮小し、捻出した空き領域をFドライブに割り当てようと思います。

## 目的
ボリューム（F:）を作成する
※ドライブレターは任意で決定可

## 手順
1. スタートを右クリックし、[ディスクの管理]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/65773e8b-fb57-4647-9f3e-c7685415cc89.png)

2. ウィンドウ下部の(C:)を右クリックし、[ボリュームの縮小]をクリック
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/b435ca69-6770-47aa-8f28-58f421321f82.png)
 
3. [縮小する領域のサイズ]に任意の値を入力し、[縮小]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/90baf492-444c-42e5-98d3-d802e18f677f.png)

4. 捻出された[未割り当て]領域を右クリックし、[新しいシンプル ボリューム]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/f077865b-ac25-4501-be1b-a1749515334e.png)

5. [次へ]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/2ccde943-f04e-4400-8781-fc0b650ba044.png)

6. [シンプル ボリュームサイズ]に任意の値を入力し、[次へ]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/982bef0f-1f2a-4a48-b5dc-2f7761d1efc2.png)

7. [次のドライブ文字を割り当てる]に任意の値を入力し、[次へ]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/f924508b-5d32-415a-84ce-4a9ae4cd57e8.png)

8. 値を変更せず[次へ]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/9bcf825b-2a43-4ea8-bf88-fea2f7433719.png)

9. 設定内容を確認し、[完了]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/5129e3a9-2515-4fb5-a54c-26557276c804.png)

## 結果
Fボリュームが作成できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/08306351-61d1-436f-ae9c-3b2d5c452400.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519424/399f1ac6-e75c-4611-abff-ca521c08275f.png)

## 参考
https://www.dell.com/support/kbdoc/ja-jp/000139103/windows-server-%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E9%A0%98%E5%9F%9F%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
【Docker】MySQLコンテナ起動時にポートが競合する場合の対応

# はじめに
MySQLコンテナ起動時に発生するポートの競合の原因と対応について調べた内容をまとめます。

# 「ポート」とは
- データの送受信の窓口となる仕組み
- ポートを識別する番号を「ポート番号」という

### 「3306番ポート」の用途
- MySQLやMariaDBなどが外部からの接続を待ち受けるポートの番号（デフォルトの設定）

# MySQLコンテナ起動時のポートの競合
- docker_compose.yml
  -  ホストの3306番ポートをコンテナの3306番ポートにマッピングしている
```docker_compose.yml
services:
  db:
    image: mysql:8.0.42
    ports:
      - "3306:3306"
(省略)
```
- ホストの3306番ポートが他のプロセスで使用されている状況でMySQLコンテナを起動すると競合が発生して起動が失敗する
```
$ docker compose up -d
[+] Running 1/1
 ✔ Container app-db-1  Created                                          0.0s 
Error response from daemon: driver failed programming external connectivity on endpoint app-db-1 (XXXXX): Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use
```


## 対応策①
#### 3306番ポートを使用しているプロセスを特定し、終了させる
- 3306番ポートを使用しているプロセスを特定する
  - `lsof`コマンド： 「list open files」の意味で、オープン中のファイルやそのファイルをオープンしているプロセスのリストを出力するコマンド

```
$ sudo lsof -i:3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  2011 mysql   48u  IPv6  41956      0t0  TCP *:mysql (LISTEN)
```
- 3306番ポートを使用しているプロセスを終了させる
```
$ sudo kill [PID] # 上記の場合のPIDは2011
```
- MySQLコンテナを起動できるようになる
```
$ docker compose up -d
[+] Running 1/1
 ✔ Container app-db-1  Started 
```
- 起動後の状態で3306番ポートを使用しているポートを確認すると下記のように変更されていることが確認できる
```
$ sudo lsof -i:3306
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 10731 root    4u  IPv4 142710      0t0  TCP *:mysql (LISTEN)
docker-pr 10737 root    4u  IPv6 144160      0t0  TCP *:mysql (LISTEN)
```
- ホストの3306番ポートをMySQLコンテナの3306番ポートにマッピングできていることが確認できる
```
$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS         PORTS                                                  NAMES
dd4813c10f35   mysql:8.0.42   "docker-entrypoint.s…"   13 seconds ago   Up 2 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   app-db-1
```
## 対応策②
#### ホストのポート番号を3306番以外に変更する
- docker_compose.yml
  -  ホストのポート番号を3306以外（例では3307）に変更する
```diff
services:
  db:
    image: mysql:8.0.42
    ports:
-     - "3306:3306"
+     - "3307:3306"   
(省略)
```
- 競合は発生せず起動できるようになる
```
$ docker compose up -d
[+] Running 1/1
 ✔ Container app-db-1  Started 
```
- ホストの3307番ポートをMySQLコンテナの3306番ポートにマッピングできていることが確認できる
```
$ sudo lsof -i:3307
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 11423 root    4u  IPv4 145784      0t0  TCP *:opsession-prxy (LISTEN)
docker-pr 11429 root    4u  IPv6 148040      0t0  TCP *:opsession-prxy (LISTEN)
```
```
$ docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
XXXXXXXXXXXX   mysql:8.0.42   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   app-db-1
```
統計学メモ




⸻

1. t検定（t-test）

EN: “We conducted a t-test to determine whether Legendary Pokémon have a significantly higher Speed stat compared to non-Legendary Pokémon.”
JP: 「伝説ポケモンと通常ポケモンの間で、すばやさの平均に有意な差があるかどうかを確認するため、t検定を行いました。」

⸻

2. 一元配置分散分析（One-way ANOVA）

EN: “A one-way ANOVA was performed to compare the average Attack stats across different Pokémon types such as Fire, Water, and Electric.”
JP: 「ほのお・みず・でんきなどの異なるポケモンタイプ間で攻撃の平均値を比較するため、一元配置分散分析を行いました。」

⸻

3. 単回帰分析（Simple Linear Regression）

EN: “We used simple linear regression to examine the relationship between a Pokémon’s Base Stat Total and its Speed stat.”
JP: 「ポケモンの種族値合計とすばやさの関係を調べるため、単回帰分析を使用しました。」

⸻

4. 重回帰分析（Multiple Linear Regression）

EN: “A multiple regression model was used to predict a Pokémon’s HP based on its Attack, Special Attack, and Speed stats.”
JP: 「こうげき、とくこう、すばやさの各種族値に基づいてポケモンのHPを予測するため、重回帰モデルを使用しました。」

⸻

5. カイ二乗検定（2群）（Chi-square Test - 2 groups）

EN: “We used a chi-square test to investigate whether Legendary Pokémon are more likely to have the ability ‘Pressure’ compared to non-Legendary Pokémon.”
JP: 「伝説ポケモンが非伝説ポケモンよりも『プレッシャー』という特性を持っている割合が高いかどうかを検証するため、カイ二乗検定を行いました。」

⸻

6. カイ二乗検定（多群）（Chi-square Test – multiple groups）

EN:
“A chi-square test was conducted to examine the relationship between a person’s occupation category (e.g. healthcare, education, IT, manufacturing) and their preferred mode of transportation (e.g. car, bicycle, train, walking).”

JP:
「職業カテゴリ（医療、教育、IT、製造など）と、好んで利用する交通手段（自動車、自転車、電車、徒歩）との関連を調べるため、カイ二乗検定を実施しました。」
⸻

7. ロジスティック回帰（Logistic Regression）

EN: “We applied logistic regression to predict whether a Pokémon is Legendary based on its Base Stat Total and Speed.”
JP: 「種族値合計とすばやさをもとに、そのポケモンが伝説かどうかを予測するために、ロジスティック回帰を適用しました。」

⸻

8. 多変量ロジスティック回帰（Multiple Logistic Regression）

EN: “Multiple logistic regression was used to predict battle outcomes based on type, gender, and various base stats.”
JP: 「タイプ、性別、複数の種族値をもとにバトルの勝敗を予測するため、多変量ロジスティック回帰を用いました。」

⸻
MacでCOBOLを始める

[GnuCOBOL](https://gnucobol.sourceforge.io/)というフリーのコンパイラが使えます。
# インストール
Homebrewを使います。
```bash
$ brew install gnucobol
```
インストール後バージョンを確認します。
```bash
$ cobc --version
cobc (GnuCOBOL) 3.2.0
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Keisuke Nishida, Roger While, Ron Norman, Simon Sobisch, Edward Hart
Built     Jul 28 2023 18:42:18
Packaged  Jul 28 2023 17:02:56 UTC
C version "Apple LLVM 15.0.0 (clang-1500.0.40.1)"
```

# Hello World
カラム位置に気をつけて以下のような`hello.cbl`を作成します。
```cobol
       IDENTIFICATION DIVISION.
       PROGRAM-ID. HELLO.
       PROCEDURE DIVISION.
           DISPLAY "Hello World!"
           STOP RUN.
       END PROGRAM HELLO.
```
コンパイル&リンクは以下です。
```bash
$ cobc -x ./hello.cbl
```
実行可能ファイル`hello`ができます。
```bash
$ ./hello
Hello World!
```
【ServiceNow】ACL設計の考え方メモ

:::note
バージョンはXanaduです。
:::
ServiceNowのACL改修を初めて経験したのでメモ。
### お客さんからの要望
今までA社だけで利用していたシステムに、B社、C社のユーザーを追加したい。ただし、B社はB社だけのレコードを、C社はC社だけのレコードを閲覧可とする。A社は全レコードを無条件で閲覧可とする。
### 最初にやってしまった誤った改修
お客さんからの要望を受け、以下のように改修しました。
①OOTBのテーブルread ACLを **すべて非アクティブ化** 
②要望通りのテーブルread ACLを新規作成
### 何が問題だったのか？
改修後に動作確認してみて気になったことがありました。
自分で起票したレコードが、起票した瞬間に閲覧不可となる場合があったのです。
例：会社Bのユーザーが会社Cのレコードを起票するパターン
この時点の改修では閲覧制御は以下のようになっていました。
|ユーザー|ユーザーの所属会社|レコードの会社|閲覧可否|
|:-----------|:-----------|:-----------|:-----------:|
|会社Aのユーザー|会社A|会社A|〇|
|会社Aのユーザー|会社A|会社B|〇|
|会社Aのユーザー|会社A|会社C|〇|
|会社Bのユーザー|会社B|会社A|✕|
|会社Bのユーザー|会社B|会社B|〇|
|会社Bのユーザー|会社B|会社C|✕|
|会社Cのユーザー|会社C|会社A|✕|
|会社Cのユーザー|会社C|会社B|✕|
|会社Cのユーザー|会社C|会社C|〇|

一見お客さんがやりたいことを実現できているようですが、 **会社名を間違って起票してしまった場合、自分でレコードの修正 or 削除ができない** という致命的な問題がありました。
あくまでユーザーの会社とレコードの会社が一致しているかのみを基準に設計したからです。
### そもそもの考え方
今回のように複数社でシステムを利用したいという場合、特権をもたないB社ユーザーやC社ユーザーが他社のレコードを起票することはまずないということと、もしそのようなレコードが存在するならそれは誤起票である、ということにもっと早く気付くべきでした。
改修にあたって私が早々に非アクティブ化したOOTBのread ACLに答えがありました。
「自身が起票したレコードは無条件で閲覧可とする」read ACLが標準で用意されていたのです。
### OOTBを尊重するということ
ServiceNowではOOTBをなるべく活かして開発しましょうという考え方があり、現在のプロジェクトでもOOTBを壊しすぎずそのまま使えるように、既存の業務フローとすり合わせながら開発してきました。OOTBの尊重はフローだけでなく、ACLにおいても大事な考え方でした。まずOOTBがどうなっているか、なぜOOTBではこのACLが用意されているのか、非アクティブ化する前によく検討する必要があったと思います。
### 最終的な改修
上記の問題を解消するため、最終的には以下のように改修しました。
①基準： **作成者が自身か**
OOTBのテーブルread ACLの 「自身が起票したレコードは無条件で閲覧可とする」read ACLを除きすべて非アクティブ化
②基準： **レコードの会社と自身の会社が一致するか**
要望通りのテーブルread ACLを新規作成
### 余談
最初に問題に気付いたとき、「他の会社のレコードを起票すると起票した瞬間レコードを閲覧できなくなってしまいますが問題ありませんか」とお客さんに投げてしまい、無駄に悩ませてしまいました。
お客さんの要望の通りに改修するのではなく、システムとしてあるべき姿をまず考えて提案できるようになりたいですね...
【Rails】手動でサービスクラスを定義する方法について

# 記事概要
Ruby on Railsで、サービスクラスを定義する方法についてまとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# 手順
1. `app`フォルダに、`services`フォルダを作成する
1. `app/services`フォルダに、`[サービスクラス名]_service.rb`を作成する
    ```search_tweets_service.rb
    class SearchTweetsService
    end
    ```
1. コントローラーまたはモデルに記述している処理を切り出し、サービスクラスの処理として記述する
    ```tweet.rb
    class Tweet < ApplicationRecord
      validates :text, presence: true
    
      def self.search(search)
        if search != ""
          Tweet.where('text LIKE(?)', "%#{search}%")
        else
          Tweet.all
        end
      end
    end
    ```
    ```search_tweets_service.rb
    class SearchTweetsService
      def self.search(search)
        if search != ""
          Tweet.where('text LIKE(?)', "%#{search}%")
        else
          Tweet.all
        end
      end
    end
    ```
1. コントローラーで、定義したサービスクラスを呼び出す
    ```tweets_controller.rb
    class TweetsController < ApplicationController
      # 省略
      def search
        # 削除 
        # @tweets = Tweet.search(params[:keyword])
        
        # search_tweets_service.rbのsearchメソッドを呼び出す
        @tweets = SearchTweetsService.search(params[:keyword])
      end
    end
    ```
1. コントローラーまたはモデルに記述している処理を削除する
    ```tweet.rb
    class Tweet < ApplicationRecord
      validates :text, presence: true
    end
    ```

# コントローラー
https://qiita.com/likapantrip/items/66a30e887ffe20ad08a4
アップグレードと、少しだけ風変わりなブログのはじまり

## はじめに — 挨拶とウォーミングアップ

はじめまして。あるいは、どこかで僕の名前を見かけたことがある人がいたなら、「お久しぶりです」と言うべきかもしれません。だけど、たいていの人にとっては、たぶん「はじめまして」でしょう。

僕はふだん、技術ブログを書く人というわけではないのだけれど、そろそろちゃんと書いてみようかと思って、ウォーミングアップがてら軽い話を一つ書いてみました。ちょっとした挨拶みたいなものです。駅前の喫茶店で注文したコーヒーに、シュガーをひとつ落とすような、そんな始まり方です。

## Windows11との1日半の格闘

さて本題です。  
Windows11にアップグレードしたら、大変な目に遭いました。みなさんはどうでしたか？  
僕は、見事に足を取られて、気づけば1日半というかけがえのない時間を、ひたすらアップグレード作業に吸い込まれてしまいました。風も吹かず、音楽もかからず、ただひたすらに沈黙だけが時間を支配する──そんな1日半でした。

でも、僕はどんなときでも何かを拾わないと気が済まない性分です。転んでも、そのへんの石ころをポケットに入れて帰るような性格なんです。だから、失敗をネタにブログを書いてみました。自虐の香りをほのかに漂わせて。

## 五つの街でブログを配信してみた

今回は、Zenn、Qiita、note、アメブロ、はてなブログの5か所に投稿してみました。言ってみれば、小さな実験のようなものです。それぞれの街角に、同じ看板を掲げてみたら、どんな人が足を止めるだろうか、という好奇心。

### ZennとQiita：優しい街角

ZennとQiitaはやさしかった。Markdownという言語が通じたからです。まるで共通の母語で会話できる友達のようなもので、原稿をコピペするだけで、すっと話が伝わる感じがしました。

### note・アメブロ・はてな：手探りの旅

でも、note、アメブロ、はてなブログは、そう簡単にはいきませんでした。異国の地に来た旅行者のように、身振り手振りで何とか意思疎通を図るような時間でした。

特にはてなブログ。初めてブログを投稿し僕が一番慣れているはずの場所だったのに、今回はなぜか一番、言うことを聞いてくれなかった。まるで長年の恋人が、ふいに見知らぬ人のように感じられる、そんな瞬間。

## 応援という名のコーヒーブレイク

ともあれ、記事は無事に投稿されました。  
もしも、どこかのブログで読んでいただけたら、そしてほんの少しでも面白いと思ってもらえたら、「いいね」やコメントで知らせてくれると嬉しいです。

そういう小さなやり取りが、僕にとっては、次のブログを書く背中をちょっと押してくれる存在になります。  
無理にとは言いません。カフェで隣の席に座った人に「よかったら一口どうぞ」とケーキを差し出すようなものです。嫌なら遠慮してもらって構いません。ケーキはまだ僕の皿に残っている。

## 次は本気の技術ブログを

そして、いよいよ明日あたり、本腰を入れて技術ブログを書こうと思っています。たぶん。

---

## 【Windows11アップグレードの罠】Windows11アップグレードで消失した壁紙を復元する方法【Windows.old活用術】の投稿先一覧

以下が今回投稿した記事の一覧です。内容はほぼ同じですが、メディアごとに表情が少しずつ違うような気もします。

- [Zenn](https://zenn.dev/soulgemanalyst/articles/3038ceddae2415)  
- [Qiita](https://qiita.com/soulgemanalyst/items/16ca695eaaa7194a367c)  
- [note](https://note.com/soulgemanalyst/n/n51f3f64a4017)  
- [Ameblo](https://ameblo.jp/soulgemanalyst/entry-12907351318.html)  
- [はてなブログ](https://soulgemanalyst.hatenablog.com/entry/2025/05/31/151951)

---

## おわりに

ここまで読んでくれた人がいたら、心からありがとうと言いたいです。  
次に書く記事は、もう少し技術的な中身が詰まっている予定です。  
でも、どんなに技術的な話であっても、やっぱり僕は僕の書き方で書くと思います。

では、またどこかで。  
あるいは明日のここで。
PowerShellの$profileと.ps1ファイルの始め方

# PowerShell の $profile を読み込む方法と ゲストログインで .ps1 ファイルを読み込む方法

PowerShell の勉強を始めて、

ファンクションの作成だったり、Oh-My-Posh などで PowerShell をいい感じにしたいなって時、

profile 作成がまず初めの一歩ですよね。
###
便利なファンクションを記述したprofileを github や USBメモリなどに入れておけば、

どの Computer でも、 "強くてニューゲーム" のように、CLIでの作業がかなり楽になります。
###
もちろん筆者もvimrc などと一緒に保管してありますが、

時間をかけて少しずつ育てているので、ペットみたいに可愛く思えてきました。
###
以前から PowerShell のファンクション作成日記を数件書いているのですが、そもそものプロファイル作成方法については触れておらず、

記事を見て？？？となった人がいるかも知れないので投稿しておきます。


## profile の作成

### 1. 通常の方法
まずここからですが、プロファイルがあるかどうかを検索します。
```ruby:PowerShell
$profile

# 結果（ある場合はPATHが表示されます）
C:\Users\ユーザー名\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
```

ここでプロファイルが無かった場合は、

一旦PowerShellを閉じて管理者として実行でPowerShellを開き、次のコマンドを実行します。（念のため存在するか確認しています）

```ruby:PowerShell
if (!(Test-Path -Path $PROFILE)) {
  New-Item -ItemType File -Path $PROFILE -Force
}
```

プロファイルが作成されました。

これを開くには、
```ruby:PowerShell
ii $profile

# VScode や vim などで開く場合
code $profile
vim $profile
```

これで profile が開くので、

プロファイル上に好きな設定やファンクションを作って保存しておくと、

PowerShellを開いた時、ファイルに記述した内容を読み込む事が出来る様になります。
###
追加で必要な設定は、以下です。

①　実行ポリシーの変更

```ruby:PowerShell
# 実行ポリシー RemoteSigned（ローカル作成されたスクリプトは実行可能）に変更
Set-ExecutionPolicy RemoteSigned -Force

# 現在の実行ポリシーを確認
Get-ExecutionPolicy

# 結果
RemoteSigned
```

②　PowerShell 起動時の設定

設定 → スタートアップ → ターミナルの起動時 → 既定のプロファイルでタブを開く に変更 → 保存 でOKです。

![スタートアップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957376/205e4aa0-9ae9-4a20-9679-75579c6993d9.png)

では、試しに超簡単な（でも使う） function を作ってみます。
```ruby:Microsoft.PowerShell_profile.ps1
function desk{
	Set-Location C:\Users\ユーザー名\Desktop\
    # ユーザー名 は個々のユーザー名
}
```

保存して再読み込みします。
```ruby:PowerShell
. $profile
```

<code>desk</code> と入力すると、どのフォルダからでもデスクトップに移動出来る様になりました。
###
便利だ！と感じた人は、下の記事みたいなファンクションが作りたくなってくると思います。

https://qiita.com/Mintnode/items/850294e4b9be596e03f9

##
### 2. 管理者権限の無いユーザーの場合
この様な場合は PowerShell 起動時にプロファイルの読み込む事は出来ませんが、

起動後にコマンドで読み込む事は出来ます。
###
ログインユーザーのみの一時設定なので、

PowerShell を起動する度に毎回コマンドの入力が必要になるのですが、

ファンクションを使用すると作業効率が上がるのでやる価値は大いにあります。
###
では方法、

プロファイルは通常のものではなく、別の ps1 ファイルを作成します。

（拡張子が <code>.ps1</code> であればファイル名は何でもいいです）

```ruby:PowerShell
# 例えばユーザーフォルダ（C:\Users\ユーザー名\）に作成
cd C:\Users\ユーザー名\
notepad func.ps1
```

開いたファイルを、<code>エンコード:UTF-8(BOM付き)</code>で保存します。

これで、PowerShellで読み込めるスクリプトファイルが作成出来ました。

あとはファイルにファンクションなどを記述して読み込みなのですが、

PowerShell 起動時に読み込めないので、コマンドで読み込みます。
###
:::note info
ここが毎回必要なターンです。
面倒とは言いましたが、実はたったの２行です。
:::

```ruby:PowerShell
# 実行ポリシーを一時的に RemoteSigned へ変更する
Set-ExecutionPolicy RemoteSigned -Scope Process

# ps1 ファイルを読み込む
# . + スペース + ファイルパス
. C:\Users\ユーザー名\func.ps1
```

これで、プロファイルが使用出来る様になりましたね。

良いPowerShellライフを。

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3957376/8f84a3c8-c5db-4971-a50d-75bde927247a.png">
Claude Code に mastra ドキュメント MCPサーバを設定する

## 結論

```sh
claude mcp add mastra -- npx -y @mastra/mcp-docs-server@latest
```

## はじめに

Claude Code（Anthropicが提供するコマンドラインツール）では、MCP（Model Context Protocol）サーバーを追加することで、外部のツールやドキュメントにアクセスできます。今回は、MastraのドキュメントにアクセスできるMCPサーバーを設定して、実際に使ってみました。

## MCPサーバーの設定

### 1. Mastra MCPサーバーの追加

```sh
claude mcp add mastra -- npx -y @mastra/mcp-docs-server@latest
```

### 2. 設定の確認

```sh
$ claude mcp list
mastra: npx -y @mastra/mcp-docs-server@latest
```

## 実際の使用例

`claude` コマンドで起動して、確認してみます。

### 具体的な機能について質問

```sh
> agentの使い方
● Mastraのエージェントの使い方について、ドキュメントを確認します。
● mastra:mastraDocs (MCP)(paths: ["agents/","reference/agents/"])…
  ⎿  ## agents/
     … +2872 lines (ctrl+r to expand)
     ---
● Mastraのエージェントの使い方について説明します：

<省略>

  これが基本的な使い方です。他に知りたいことはありますか？
```

MCP 経由でドキュメントを参照してくれました。これで mastra でのエージェント開発効率化できるかもしれません。

## 参考

- https://mastra.ai/ja/docs/getting-started/mcp-docs-server
- https://docs.anthropic.com/en/docs/claude-code/tutorials
【Rails】手動でヘルパーメソッドを作成する方法について

# 記事概要
Ruby on Railsで、ヘルパーメソッドを作成する方法についてまとめる

# 前提
- Ruby on Railsでアプリケーションを作成している

# 手順
1. `app/helpers`フォルダに、`[ヘルパーメソッド名]_helper.rb`を手動作成する
    ```tweets_helper.rb
    module TweetsHelper
    end
    ```
1. `app/helpers/[ヘルパーメソッド名]_helper.rb`に、メソッドを定義する
    ```tweets_helper.rb
    module TweetsHelper
      def tweet_lists(tweets)
      end
    end
    ```
1. ビューファイルに記述している処理を切り出し、ヘルパーメソッドの処理として記述する
    ```erb
    <!-- ビューファイルの記述 -->
    <div>
      <% @tweets.each do |tweet| %>
        <%= render partial: "tweet", locals: { tweet: tweet } %>
      <% end %>
    </div>
    ```
    ```tweets_helper.rb
    module TweetsHelper
      def tweet_lists(tweets)
        html = ''
        tweets.each do |tweet|
          html += render(partial: 'tweet',locals: { tweet: tweet })
        end
        return raw(html)
      end
    end
    ```
1. ビューファイルで、定義したヘルパーメソッドを呼び出す
    ```erb
    <div>
      <!-- tweets_helper.rbのtweet_listsメソッドを呼び出す -->
      <%= tweet_lists(@tweets) %>
    </div>
    ```

# まとめ
## raw
HTMLを正常に表示するために、「<」「>」「&」などの、特殊文字と呼ばれる文字を意図するように扱うためのメソッド

```ruby
raw(文字列)
```

# ビュー
https://qiita.com/likapantrip/items/7773987cdd641ea3aad9
SageMakerメモ

# はじめに
re:Invent 2024 以降、AWS SageMakerが2種類に分かれました。多少紛らわしいですので、メモを残しておきます。

# 元々のSageMaker
元々のSageMakerは１種類のみ存在し、機械学習モデル開発者向けのサービスでした。

:::note info
AWS SageMakerと言えば：機械学習サービス（As of 2024/11）
:::

# re:Invent 2024 以降
- re:Invent 2024 

https://aws.amazon.com/jp/about-aws/whats-new/2024/12/preview-amazon-sagemaker-unified-studio/

- SageMakerが2種類に分かれている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470230/146b63ac-a3c3-4526-9ede-f8b27df8c257.png)

### SageMaker
re:Invent 2024 で発表された新サービス。
SageMaker NextGenとも呼ばれたが、従来のSageMakerと区別するためにも、別の名称を利用してもよいかと考えられます(個人的な観点)。

### SageMaker AI
従来の「SageMaker」に該当するサービスであり、名称が変更されました。


## 現在のSageMaker
データ取り込み、データ処理、モデル開発、deploymentなどのサービスやツールを統合した環境です。

:::note info
AWS SageMakerと言えば：データ分析とAIの統合開発環境（As of 2025）
:::
Dax Studioを使用したデータエクスポートについて

やっぱり、大量データの処理はExcelよりもPower BI Desktopのほうが速い。
ExcelだとPower Queryを使ってシートに展開するとフリーズするデータ量でも、Power BI Desktopであれば安定するように思えました。

Power BI Desktopはレポートを作成するものというのが、自分の中にありましたが
今回はPower BI DesktopのデータをDAX Studioを使用してエクスポートする方法を記事にします。

### 視覚化のビジュアルからダウンロードすると!?
Power BI DesktopではMAX30,000件しかダウンロードできません。

ついこの間まで、以下のようにレポートビューから視覚化のテーブルを選択して、データのエクスポートを考えておりましたが、30,000件を超えるデータはダウンロードできません。
正確には30,000件を超えるデータの場合でも30,000件でダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/16281e6e-ba27-42c0-8f1a-cc0f15bcac47.png)

### DAX Studioを使う!
他に方法ないか、調べたところDAX Studioを使用すればデータをエクスポートできることが分かりました。

英語なので、面を食らってしまったのですが、分かったことを記載します。

#### Connect（Connectionグループ）
ここで、Power BI Desktopに接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/e7c48784-45a7-4f63-9ca7-b647ef0f351f.png)

#### Run（Queryグループ）
中央にDAX式を書いて、Runをクリックすると、下部のResultsにデータが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/4e1892de-7a96-49f9-bca9-51546191d2f9.png)

#### Results（Outputsグループ）
たくさん種類があります。分かったものだけ記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/b58d5c53-8932-4fd7-8269-c073edc9e77d.png)


#### Results Table
Resutls Tableを選択してRunをクリックすると、Dax Studio上のResultsにテーブル形式で出力できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/618d6200-9b17-4c0d-bf0a-670dbf2ea026.png)

#### File
Fileを選択してRunをクリックすると、csv、json、txtの3つの形式（どれかを選ぶ）でファイルにエクスポートできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/cd2213bf-4cbb-4271-a8a8-d50e856ff983.png)

#### Static
Staticを選択してRunをクリックすると、Excelファイルに保存できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3532455/86d0fb13-2262-40c7-a834-d91e2fe1f4d7.png)

ひとまず、これでPower BI Desktopのデータをエクスポートすることができます。
今後、ほかにも分かったことを書いていきたいと思います。
Microsoft EntraID PowerShellでのユーザー作成方法

今回はMicrosoft EntraIDの画面上で新規ユーザーを作成する際に
メインドメインを利用できなくなった事象が発生したので、当時の対象方法を記録します。


**目次**
1. [原因](#1-原因)
2. [事前準備](#1-事前準備)
3. [PowerShellにて実行](#2-PowerShellにて実行)

## 1. 原因
原因は外部IdpとMicrosoftテナントの連携です。
Microsoftで利用しているメインドメインが外部Idpと連携した事により
<font color="DarkOrange">**フェデレーションドメイン**</font>となったため、EntraIDの画面上では
新規ユーザーを作成するドメインとして選択できなくなりました。

調べた結果、GUI上でユーザーが作成できなくなっても、
PowerShellを利用すれば、引き続きメインドメインで
ユーザーを作成できる事が判明しました。


## 2. 事前準備
<font color="DarkOrange">**管理者権限が付与されたユーザー**</font>で実行する事が必須です。
ユーザーを作成するにあたり、以下の項目について決めておきます。

| 項目 | 値 |
|:-:|:-:|
|ユーザープリンシパル名|yamada-t@example.com|
|表示名|山田　太郎|
|ImmutableId（任意）|yamada-t|
|mailNickname（任意）|yamada-t|

:::note info 
確認
・ImmutableIdは外部IdpとMicrosoftのアカウントを識別する時に必要な値です。
・mailNicknameはoutlook受信トレイより上に表示されている名前の事を指します。
:::


## 3. PowerShellにて実行
PowerShellを管理者で実行し、以下コマンドでMicrosoftと接続します。

```php
Connect-MgGraph -Scopes "Domain.ReadWrite.All","Directory.AccessAsUser.All"
```

:::note warn 
注意
このコマンド実行後、初回はMicrosoft管理者でのログインを求められます。
:::

<br>
接続後、以下コマンドでユーザーを作成します。

```php
New-MgUser -UserPrincipalName yamada-t@example.com  -DisplayName "山田　太郎"  -OnPremisesImmutableId yamada-t  -mailNickname "yamada-t"  -AccountEnabled
```


Microsoft EnrtaIDの画面上で作成したユーザーが一覧に表示されているかを確認します。
これで、EntraIDの画面上でユーザーを作成できない場合でも、対処できるようになりました。
M5Stamp S3でSerial.print()

M5Stamp S3では、
```
Serial.begin(115200); 
 :
Serial.println("hoge");
```
ではなく
```
USBSerial.begin(115200); 
 :
USBSerial.println("hoge");
```
のようにする必要があります。

追記：開発環境や使用ライブラリによってはSerialのままでも大丈夫のようです

PlatformIOで行う場合は、
```platform.ini
[platformio]
default_envs = m5stack-stamps3

[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduino
build_flags = -D INI_STAMPS3
monitor_speed = 115200
 :
```
で```INI_STAMPS3```を定義した後、
```main.ino
#ifdef INI_STAMPS3
  #define Serial USBSerial
#endif

 :
  Serial.begin(115200); 
 :
  Serial.println("hoge");
 :
```
のようにしておくと他のボードと共通のソースを使用できるので便利です。


[関連](https://qiita.com/ELIXIR/items/6ca7cee9accceba37216)
textareaでユーザーが可変できるようにする【Laravel / Tailwind CSS】

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



# 方法
以下を追記する
```
# Tailwind CSS
resize-y
```

例
```
<div class="p-2 w-full">
    <div class="relative">
    <label for="memo" class="leading-7 text-sm text-gray-600">メモ欄</label>
    # ↓ ここ
    <textarea id="memo" name="memo" class="w-full bg-gray-100 bg-opacity-50 rounded border border-gray-300 focus:border-indigo-500 focus:bg-white focus:ring-2 focus:ring-indigo-200 h-32 text-base outline-none text-gray-700 py-1 px-3 resize-y leading-6 transition-colors duration-200 ease-in-out"></textarea>
    </div>
</div>
```
【Vue.js】Vue.jsって何だろう（基本的な書き方編）

# 1.はじめに
今回はライトな形で仕上げています。
今回は、Vue.jsの基本的な書き方の概要をまとめていきます。

# 2.Vueコンポーネントとは？
Vueに関してはコンポーネントの考えが重要になります。

Vueでは、Webページを小さな「部品（コンポーネント）」に分けて作っていきます。
たとえば：

- ボタンやフォーム
- リスト表示
- ナビゲーションバー
などなど、<b>画面を作る「パーツ」 </b>を1つずつファイルに分けて作ります。

Vueでは .vue というファイルの中に「HTML・CSS・JavaScriptの3つ」を1つにまとめて書きます。
これを「Vueコンポーネント」と呼びます。

**🧑‍🏫 イメージで説明すると…**
たとえばあなたが「部品付きの家具」を組み立てるとします。
Vueはその家具の各部品（ドア・棚・引き出しなど）を1個ずつ管理して、
あとで「全体を組み立てる」ことができるような仕組みです。

その1つ1つの部品が Vueコンポーネントだと思ってください。

# 3.基本的な書き方
### 概要
``` javascript
<template>
  <!-- HTMLを書く場所：画面に表示する内容 -->
</template>

<script>
export default {
  // JavaScriptを書く場所：動きやデータの処理を書く
};
</script>

<style>
/* CSSを書く場所：見た目のデザインを設定 */
</style>
```

### テストコード
``` javascript
<template>
    // htmlのタグも使えます。
    <h1 :class="titleClass">{{ value }}</h1>
    <button @click="pushButton">ボタンを押してください！</button>
</template>


<script setup>
     import { ref } from 'vue'

     const value = ref('')
     const titleClass = ref('title')
　
　// ボタンを押すとvalueにボタンが押されました！という文字列が入ります。
     function pushButton () {
         value.value = "ボタンが押されました！" 
      }
</script>

<style>
   // cssの書き方がそのまま使えます。
    .title {
          color: red;
    }
</style>
```

ボタンを押すと・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762100/cf32e651-5ac7-4193-9814-2278046b0e95.png)

赤い文字が出てきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762100/f4c72d6f-58df-42c4-9fd2-bd1ccdb68456.png)

## 4.さいごに
次回からはtemplateタグ・scrptタグ内に記述できることをまとめていきます。
ご興味ある方は次回以降も見ていただけると嬉しいです。
mBot2の色センサチェックツール

# はじめに
mBot2/mBlockのプログラミング環境で色センサがうまく動かないので検証処理をつくってみた。

### プログラミング環境編
https://qiita.com/Tama79/items/e7fbda5305603a6a9553

## やりたいこと
mBlockで色チェック結果を表示する。

## プログラムの概要

プログラムは、３つのブロックで構成されている。
・色検出モードの切り替え（２つ）
![mblock_block_切り替え.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017908/d1ed7233-710a-4eb8-b9fb-e74b32026bbc.png)

・色のチェック
![mblock_block_色表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017908/ed5b7e6a-2c70-45ad-9418-abb539a1da41.png)

license: CC BY-SA 4.0

### 色検出モードの切り替えブロック
1.イベント：ジョイスティック左、または右、でこのブロックを開始
2.色検出モードを設定
3.画面に表示
して終わり

### 色のチェックブロック
中央ボタンを押すと色のチェックを開始する。
クワッドrgbセンサーを使って、色紙の色を識別、値を表示していく。

1.イベント：中央ボタンが押されたとき、でこのブロックを開始
2.クワッドRGBセンサーのキャリブレーション
　<b>※キャリブレーションは白いところで行うこと</b>
3.RGB値をそれぞれ表示
4.値を検証し、それぞれ表示
して終わり

## ちょっとしたポイント
色の識別がなかなかうまくいかないとき用のデバッグコード。


## 最後に
CC BY-SA 4.0（著作者の情報とCCライセンス継承はお願いします。商用利用・改変・再配布は問題なし）です。
【初心者向け🔰】SwiftUIのFrameとAlignmentの使い方まとめ

SwiftUIでアプリを作っていると、「文字や画像を指定のサイズにしたい」「端に寄せたい」といった場面がたくさん出てきます。
そんな時に使うのが frame と alignment！

この記事では、この2つの使い方を、初心者にも分かりやすく解説します! 🙌

frameとは？
---
ビューの幅や高さを指定するための修飾子です。

```swift
Text("Hello, SwiftUI!")
    .frame(width: 200, height: 400) //幅：200ポイント、高さ：400ポイントの枠を作る
    .background(.yellow)
```
例：
![Screenshot 2025-05-31 at 15.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/8beaed94-ab8c-426b-a31b-997590888182.png)

背景色をつけると、サイズ感が分かりやすい！

alignmentとは？
---

使い方の例（VStack, HStack, ZStackなどで使用）：

```swift
VStack(alignment: .leading) {
    Text("左寄せのテキスト")
}
.frame(width: 200)
.background(.blue)
```

主なalignmentの種類：
---
| 使い方                | 意味                        |
| ------------------ | ------------------------- |
| `.leading`         | 左寄せ（横）                    |
| `.trailing`        | 右寄せ（横）                    |
| `.center`（デフォルト）   | 中央寄せ                      |
| `.top` / `.bottom` | 上下の寄せ（主にZStackやVStackで使用） |

frame + alignment の組み合わせ
---

```swift
Text("右下に表示")
    .frame(width: 200, height: 100, alignment: .bottomTrailing)
    .background(Color.gray.opacity(0.3))
```
例：
![Screenshot 2025-05-31 at 16.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/52f8bc41-f2dd-4f78-b3d0-0b64af8c7141.png)


まとめ
---
| 機能          | 目的               | 例                                 |
| ----------- | ---------------- | --------------------------------- |
| `frame`     | 幅・高さの枠を決める       | `.frame(width: 200, height: 100)` |
| `alignment` | 枠内やスタック内での位置を決める | `.frame(alignment: .topLeading)`  |

おわりに
--
SwiftUIの**frame**と**alignment**を理解すると、レイアウトの自由度が一気に広がります！
**frame**と**Alignment**はよく使うのでぜひマスターしてください！✌️
Dockerをさわってみた

## 環境
- M1 Mac
- macOS Sequoia
- Docker 28.0.4

## 概要
業務でDockerを使ったことはあれど、  
個人的に色々と試したことはなかったので  
基本的な部分についてさわった際の記録となります。

## dockerコマンドとdocker composeコマンドの違い
- dockerコマンド
  - 単一のコンテナやイメージを管理・操作するためのコマンド
- docker composeコマンド
  - 複数のコンテナから構築されるアプリケーションを管理・操作するためのコマンド
  - YAMLファイルを使って、コードにて環境の構築を行うことができる利点もある

## dockerコマンド

### イメージから新規でコンテナを作成して起動する

```bash
# イメージの取得(node.js)
# バージョンとOSの指定が推奨される
docker pull node:22.16.0-bookworm

# 取得したイメージを用いてコンテナを起動する
# コンテナ名として「node-app」をつける
docker container run -it -d --name node-app node

# 稼働中のコンテナへアクセス
docker container exec -it node-app bash

# コンテナのOS確認
cat /etc/os-release

# コンテナ(debian)からぬける
exit

# 稼働中のコンテナを停止する
docker container stop node-app

# 稼働中のコンテナ確認(コンテナが停止したかの確認)
docker container ls
```

### 作成済みである、既存のコンテナを起動する

```bash
# 作成済みのコンテナを確認
docker container ls -a

# 名前を利用して指定のコンテナを起動する
docker container start node-app

# 稼働中のコンテナへアクセス
docker container exec -it node-app bash

# コンテナ(debian)からぬける
exit

# 稼働中のコンテナを停止する
docker container stop node-app

# 稼働中のコンテナ確認(コンテナが停止したかの確認)
docker container ls
```

## docker composeコマンド

### ディレクトリ構造
コマンドを利用するにあたり、  
下記のディレクトリ構造にて各種ファイルを配置した。

```plaintext
.
└── pjt_dir_name
    ├── docker
    │   ├── Dockerfile
    │   └── compose.yaml
    └── .dockerignore
```

### docker composeコマンドでの起動

```bash
# プロジェクトディレクトリへの移動
cd /Users/UserName/Git/pjt_dir

# compose.yamlをもとにコンテナを作成する
docker compose -p pjt_dir_name -f ./docker/compose.yaml up

# 稼働中コンテナのサービス名を確認
# サービス名はcompose.ymlで定義したものが反映される
docker compose ps

# 稼働中のコンテナにアクセスする
docker compose exec ServiceName bash

# 稼働中コンテナの停止と削除を行う
docker compose down

# 再度使いたい場合(既存イメージを再利用して構築される)
docker compose -p pjt_dir_name -f ./docker/compose.yaml up

# 全ての稼働中コンテナの停止
docker compose stop

# 全ての停止中コンテナの再開
docker compose start
```

## あとがき
使いたい環境を作って、要らなくなったらさっと消せるのは便利だなーと。  
あとMacでやると、WSLの設定しなくて良いから楽に感じました。

## 参考
- 開発系エンジニアのためのDocker絵とき入門 - 秀和システム あなたの学びをサポート！
	- https://www.shuwasystem.co.jp/book/9784798071503.html
- [Linux, docker]macでubuntuで動かしてみる | アウトプット雑記
	- https://output-zakki.com/linux-docker/
- "Dockerって何？　簡単な言葉で解説するDockerの基本" #初心者 - Qiita
	- https://qiita.com/riku_ogawa/items/4ffc6aaf7a3df053a4ad
[Python]VSCにおけるWSL2での仮想環境上での.ipynbファイル実行環境作成

## はじめに
　JupyterNoteBookなどで開けばそのまま実行できるが、学習動画上.ipynbをVSCで開いて解説しているものがあった。VSCにおけるWSL2上の仮想環境上での環境構築まで説明がなかったので、今後すぐ構築できるようにメモを残していく。

## 想定環境
・OS：Windows 11
・Linux：Ubuntu 24.04
・Docker環境：参考資料[1]をもとに構築済み

## 拡張機能
　拡張機能について、参考資料[2]記載のPythonおよびJupyterの拡張機能がインストールされていること。

## 手順
### 1.仮想環境構築
 Condaコマンドで仮想環境を構築し、仮想環境にアクセスする。
 ```
 conda create -n 仮想環境名 python==Pythonバージョン
 conda activate 仮想環境名
 ```

### 2.Jupyterサーバーを入れる
```
pip install jupyter
```

### 3.カーネル登録
```
pip install ipykernel
python -m ipykernel install --user --name 仮想環境名 --display-name "Python (仮想環境名)"
```

### 4.VSC再起動
　VSCを再起動する。

### 5.カーネル設定
 VSC上から登録したJupyterカーネルを選択する。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/4cb3b8f1-84c8-4bb0-8021-fa71c852adf5.png)

### 6.動作確認
　コード左側の▷を押下し、実行結果が表示されることを確認する。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391358/0ffdbe7c-5099-4b15-86cc-3f2132e75ced.png)


## 参考資料
[1]haveAbook(Wakana Arimoto), 『WSL2でDocker環境構築(Docker Desktop有料化対策)』,https://qiita.com/haveAbook/items/0d0ae20a19214f65e7cd
[2]torakm, 『VSCode で Jupyter Notebook の開発環境を構築する手順』, https://zenn.dev/torakm/articles/55b16afb0a3941
【Windows11アップグレードの罠】Windows11アップグレードで消失した壁紙を復元する方法【Windows.old活用術】

# 【Windows11アップグレードの罠】Windows11アップグレードで消失した壁紙を復元する方法【Windows.old活用術】

## はじめに

Windows10からWindows11へのアップグレードを実行したところ、設定していた大切な壁紙が消失してしまいました。しかし、**Windows.old**フォルダを活用することで、無事に壁紙を復旧することができました。

同じような問題で困っている方の参考になればと思い、解決方法をまとめます。

## 背景：なぜWindows11にアップグレードしたのか

私は普段MacユーザーでWindowsには必要最小限しか関わっていませんが、会社からWindows11へのアップグレード指示があり、渋々対応することになりました。

システム運用エンジニアとしての経験から、アップデートには常にリスクが伴うことを理解していたため、慎重に進める必要がありました。

## アップグレード方法の選択

Windows11へのアップグレードには以下の2つの選択肢がありました：

1. **Windows Update機能で23H2にする（正規推奨手段）**
2. **インストールアシスタントで24H2に一気にアップグレード**

私は **2番目の方法（24H2への直接アップグレード）** を選択しました。

### 選択理由

- 23H2だと来年再度アップグレードが必要になり、メンテナンス回数を減らしたかった（Windowsには極力関わりたくない）
- Windows Updateで表示されないケースがあることが確認されていた
- 23H2→24H2の段階的アップグレードで失敗事例があった

## 発生した問題

### 1. ライセンス認証エラー
アップグレード後、ライセンス認証に失敗しました。これは、環境依存の話で私が引き寄せ体質だったからかも知れません。MAKキーの再発行で解決しましたが、冷や汗ものでした。

### 2. 壁紙の消失（重大インシデント）
**設定していた大切な壁紙がWindows11の標準壁紙に置き換えられてしまいました。**

これは場合によっては切り戻し判断となる重大なインシデントでした。

## 解決方法：シュンペーターのイノベーション理論を応用

シュンペーターのイノベーション理論によると、イノベーションは「既存の要素を組み合わせた新結合」です。この考え方を壁紙復旧に応用しました。

### 既存の要素1：Windows10の壁紙保存場所
```
C:\Users\{ユーザ名}\AppData\Local\Microsoft\Windows\Themes\
```

### 既存の要素2：Windows11アップグレード後のバックアップ場所
```
C:\Windows.old
```
**※重要：10日間のみ保持され、その後自動削除される**

### 新結合によるイノベーション

上記2つの情報を組み合わせることで、消失した壁紙の復旧場所を特定できました：

```
C:\Windows.old\Users\{ユーザ名}\AppData\Local\Microsoft\Windows\Themes\
```

## 実際の復旧手順

1. **ファイルエクスプローラーを開く**
2. **以下のパスにアクセス**
   ```
   C:\Windows.old\Users\{ユーザ名}\AppData\Local\Microsoft\Windows\Themes\
   ```
3. **目的の壁紙ファイルを見つける**
4. **新しい場所にコピーまたは移動**

## タイミングが重要

- Windows11アップグレード：今週初め
- 壁紙サルベージ：今週末
- **Windows.oldの保持期間：10日間**

**ギリギリ間に合いました！** あと数日遅れていたら完全に消失していたところでした。

## まとめ

Windows11へのアップグレードで壁紙が消失した場合でも、**Windows.oldフォルダ内に元のファイルが保存されています**。ただし、**10日以内**に復旧作業を行う必要があります。

同じような問題で困っている方は、ぜひこの方法を試してみてください。

大切な思い出の画像や推しの画像も、これで安心して取り戻せます！

---

## 参考情報

- Windows.oldフォルダは通常、アップグレード後10日間保持される
- AppDataフォルダは隠しフォルダのため、表示設定の変更が必要な場合がある
- 複数の壁紙を使用していた場合、Themesフォルダ内に複数のファイルが保存されている可能性がある

再び推しの壁紙をデスクトップに設定することで、ソウルジェムの濁りが浄化されました。
BastilleBSDで古いリリース

何時のころからかFreeBSDは古いリリースをftpサーバにおかなくなりました。

これによりBastilleBSDのbootstrapは古いリリースが取得できなくなっています。

後日追記

正式な方法がありました。

https://bastille.readthedocs.io/en/latest/chapters/subcommands/bootstrap.html#eol-releases

以下は読み流してください。

これは大変困るので、調べてみました。

リリースのurlは/usr/local/etc/bastille/bastille.confにあります。

古いリリースを読み込みたい場合は以下のようにします。

```
#bastille_url_freebsd="http://ftp.freebsd.org/pub/FreeBSD/releases/"          ## default: "http://ftp.freebsd.org/pub/FreeBSD/releases/"
bastille_url_freebsd="http://ftp-archive.freebsd.org/pub/FreeBSD-Archive/old-releases/"
```

なぜこれが必要だったというとNetBSDのクロスビルドが、現在インストールできる13.4,5では通らなかったためです。13.3でもだめでした。

```
===> Tools built to /home/hiroki/obj/tooldir.FreeBSD-13.2-RELEASE-amd64
===> build.sh ended:      Sat May 31 17:17:12 JST 2025
===> Summary of results:
         build.sh command:    ./build.sh -U -O /home/hiroki/obj -j2 -m evbarm -a earmv5 tools
         build.sh started:    Sat May 31 17:04:37 JST 2025
         NetBSD version:      10.99.6
         MACHINE:             evbarm
         MACHINE_ARCH:        earmv5
         Build platform:      FreeBSD 13.2-RELEASE amd64
         HOST_SH:             /bin/sh
         No $TOOLDIR/bin/nbmake, needs building.
         Bootstrapping nbmake
         share/mk MAKECONF:   /etc/mk.conf
         MAKECONF file:       /etc/mk.conf (File not found)
         TOOLDIR path:        /home/hiroki/obj/tooldir.FreeBSD-13.2-RELEASE-amd64
         DESTDIR path:        /home/hiroki/obj/destdir.evbarm
         RELEASEDIR path:     /home/hiroki/obj/releasedir
         Created /home/hiroki/obj/tooldir.FreeBSD-13.2-RELEASE-amd64/bin/nbmake
         Updated makewrapper: /home/hiroki/obj/tooldir.FreeBSD-13.2-RELEASE-amd64/bin/nbmake-evbarm
         Tools built to /home/hiroki/obj/tooldir.FreeBSD-13.2-RELEASE-amd64
         build.sh ended:      Sat May 31 17:17:12 JST 2025
===> .
```

新規インストールで古いリリースをネットワークでインストールする場合も同じ問題があり、urlを設定しなおす必要があります。

嫌がらせにもほどがあります。
各種サーバ構築の事前準備（IPアドレス・ホスト名）

# 使用環境
サーバー：Red Hat Enterprise Linux 9 (RHEL9)
仮想化：VMware Workstation 17 Pro

# 設定値
アドレス：192.168.0.100/24
ホスト名：dns
ドメイン名：example.com

# IPアドレスの設定
IPアドレスの設定
```:bash
$ nmcli connection modify ens160 ipv4.method manual ipv4.address 192.168.0.100/24
$ nmcli connection up ens160　　＃設定の反映
接続が正常にアクティベートされました　←これが出ればOK
```
デフォルトゲートウェイの設定
```:bash
$ nmcli connection modify ens160 ipv4.method manual ipv4.gateway 192.168.0.100/24
$ nmcli connection up ens160　　＃設定の反映
接続が正常にアクティベートされました　←これが出ればOK
```


# ループバックアドレスの設定
**【なぜこの設定を行うのか？】**
・サーバー自身が自分のホスト名をループバックアドレス（127.0.0.1）で名前解決できるようにするため。
・これができないと、一部のサービスで名前解決エラーが起こる。

**変更前**
```:/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
```
**変更後**
```:/etc/hosts
127.0.0.1   dns dns.example.com localhost loghost
::1         dns localhost
```

:::note info
loghostとは？
昔は複数のマシンのログをsyslogを利用して１つの専用サーバ（loghost）に集約する構成がありました。
なぜ、今回追加したかというと、「ログは loghost に送る」という設定をしても、実際には自分自身（localhost）に送られるようになります。
つまり、「ログ転送の設定をしなくても、loghost = 自分」になるようにするためです。
:::


#### 事前準備終わり
ここから、各種サービス（dns,web,proxy,ftp...）の設定をしていきます。
Oracle Java Silver SE17 を１か月で取ったメモ

# 概要 
| やったこと | やってよかった度 | メリット | デメリット |
|:-|:-|:-|:-|
| 黒本を買う | ☆☆☆☆☆ | １冊で完結する | 分厚い、重い |
| Excel 上で解く | ☆☆☆☆☆ | ２周目以降楽。進捗の可視化しやすい | 自宅以外で学習しにくい。式のメンテが手間 |
| 進捗を可視化する | ☆☆☆☆☆ | 管理しやすい | 式のメンテが手間 |
| VS code で動作確認する | ☆☆☆☆☆ | 理解が深まる | 本のコードを入力するのが手間
| 得た知識を別途軽くまとめる | ☆☆☆ | 整理することで理解が深まる | 奥が深く部分的にしかまとめられない
| 黒本著者の Udemy 視聴 | ☆☆☆☆ | 隙間時間で取り組みやすい | Udemy は基本有料 |

# やったこと
### 黒本を買う
https://www.amazon.co.jp/dp/429502032X?ref=ppx_yo2ov_dt_b_fed_asin_title

この１冊だけで合格できると思います。
出来の悪い私でも合計７８４問分解いたら７６％で合格できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672456/f2d5e70b-2673-41dc-a47e-7aa3687e0d09.png)

間違えた問題は解説を読みましたが、じっくり読むというよりは流し読みみたいな感じでした

### Excel 上で解く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672456/1ae286b3-a000-4439-9a32-4de2fdb18e57.png)

分厚い本を使って採点するのは大変そうだったので、Excel で解きました。
１周目は地道に枠とか解答とか数式をポチポチと入力しましたが
２周目以降は解くと同時に採点が終わるので、後述のとおりかなり楽でした。
また、黒本に書き込み等しなくて済みました

Excel が使える環境でないと学習できないのは不便でした。
また、機能を拡張しようとすると単純なコピーだけでは無理なので、保守が若干手間でした。
例）まだ解いていない部分の解答は表示しないようにする　等

### 進捗を可視化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672456/5a1b56b6-9c25-4866-9ff9-e9aafebea632.png)

同じExcel上で取り組み具合が分かるので良かったです

１周目は約２週間、正解率約６５％
２周目は５日、正解率約８０％
３周目以降は間違えた問題のみで、正解率約８４％

模試は２回分収録されており、２周ずつ解きました。
正解率は下記の通りでした
５７％　→　８２％
６４％　→　８４％

### VS code で動作確認する
環境はなんでもよいと思いますが、実際にどのような結果になるかを確認すると腹落ちしやすいです。
納得いかない問題や何回も間違えた問題、調べてもどうしようもなく実行しないと分からないような問題について、手打ちでコードを入力して動作確認しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672456/cd1d532e-d27f-4686-90fd-598bd2797a0a.png)

### 得た知識を別途軽くまとめる
要点を絞ってまとめていかないと無限にまとめる内容が発生するので
最終的にExcelで空行含む１５０行程度しかまとめませんでした。
また、自分で入力するので、真偽が不安になる瞬間もありました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672456/936c2f35-b906-49a7-9cda-2a88858b6ac2.png)

### 黒本著者の Udemy 視聴
著者のUdemy番組があり、黒本の内容と対応しているので良かったです。
最初の２週間は問題を解くのと並行して追いつけ追い越せで視聴していましたが
私個人のUdemyライセンスの都合で半分くらいまでしか見れていません

# その他
### 予約
ネットで調べながら予約したのですが、Oracle のシステム（CirtView?）にログインしようとしても
スマホ・PC共にログインページまで辿り着けないというバグ？に繰り返し遭遇し、少し困りました。
問い合わせ等したものの、２日後くらいにアクセスしたらログインできました

受験料約５万円
落ちても１～２か月程度なら再受験無料のキャンペーンを実施している場合があるようです

### 当日の雰囲気
試験会場の予約ができれば年中いつでも受験できるようです。
試験会場は民営で、どの会場もGoogleマップのレビューが低め（☆３程度）なので震えていましたが
私が行ったところはまともなスタッフしかいませんでした

受付でいきなり写真撮影があり、写真は合格証書に刻まれるので
気持ちおしゃれ＋寝ぐせは直して行くと良いです

１時間前には会場の最寄り駅に到着し、トイレは着いてすぐ＋試験開始直前に行きました

私物持ち込み不可なので、ティッシュは入室時に要求すると貰えます。
検尿みたいな紙のゴミ箱と、ティッシュをドロー３だけさせてもらえました。
花粉症シーズンの受験は難しいかもしれません。
また、ラミネートで作成されたメモ用のホワイトボードと、ボードマーカーを貸してくれます

受験机には古き良きな雰囲気のPCと、スタッフを呼ぶボタンがついており
ボタンを押すと恐らくティッシュおかわり等できる気がします

受験は、ＰＣの指示に従って何回か画面遷移するとすぐ始まります。
回答終了できるボタンが始終ＵＩ上にあるので、滑って押してしまいそうで怖かったです。
９０分あっという間で、模試の時はできなかった見直し時間も数分ありました

回答終了するとすぐに合否の画面が表示されます。
受付に戻ると、同じ画面を印刷したＡ４のペラ紙をもらえます。
５万円のペラ紙なので、クリアファイルを買って入れて帰りましたが
Ｗｅｂから印刷すれば何度でも同じ紙を印刷できます。
スタッフの方は合否を見てはいけないルールになっているようで
神妙な顔つきで裏向きのまま紙をくれるので、合格できたらガッツポーズ等で教えてあげるといいかもしれません

勉強しはじめてからちょうど１ヶ月で合格できました

### Oracle Java Silver SE17 について
試験時間：90 分
出題数：60 問
合格ライン：65 %

Javaについて体系的に学習できるのが一番のメリットだと思います。
独学だとどうしても動けばOKな感じになってしまったり、使わない（存在を知らない）機能の学習ができなかったりしますが
高校、大学受験勉強のような形で取り組みやすいです

ちなみにSE11は１８０分、３時間だそうです。膀胱的にちょっと無理です

おわり
【初心者向け🔰】SwiftUIのpaddingの使い方を説明してみた！

SwiftUIでアプリのレイアウトを作るとき、「文字やボタンのまわりに余白をつけたい」と思うことがあると思います。そんなときに使うのが、**padding**です！

この記事では、**padding**の基本から応用まで、初心者でもすぐに使える形でご紹介します！


paddingとは？
---
**padding**は、ビューの内側と外側の間に余白（スペース）を追加する修飾子です。よく使うのは文字やボタン、画像などの周りにスペースを作るときです。

基本的なpaddingの使い方
---
```swift
Text("こんにちは")
    .padding()
```
このように書くと、四方（上下左右）すべてにデフォルトの青い余白が追加されます。

![Screenshot 2025-05-31 at 15.35.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/f1858204-30cb-421c-9d93-5eef5fa2ed78.png)

 特定の方向にだけpaddingをつける
 ---
 必要な方向にだけ余白をつけることもできます。

 ```swift
 Text("上だけ余白")
    .padding(.top)

Text("左右に余白")
    .padding([.leading, .trailing])
 ```
例:
 ![Screenshot 2025-05-31 at 15.37.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/9e80627a-5d7a-4366-8013-782b995a7656.png)

よく使う方向指定
| 指定          | 意味          |
| ----------- | ----------- |
| `.top`      | 上           |
| `.bottom`   | 下           |
| `.leading`  | 左（言語によって変化） |
| `.trailing` | 右（言語によって変化） |


余白のサイズを指定する
---
デフォルトの余白ではなく、数値でピクセル指定もできます

```swift
Text("20ポイントの余白")
    .padding(20) // 四方向すべてに20ptの余白

Text("下にだけ30ptの余白")
    .padding(.bottom, 30)
```

例:

![Screenshot 2025-05-31 at 15.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/a44ed1ed-1574-4864-891c-b75824f2f926.png)



**padding** と **Spacer**の違い
---
padding → ビューの周りに余白を追加する

Spacer → ビュー同士の間を押し広げる


例えば...
padding の例：ビューの周囲に余白を追加
--

```swift
 Text("こんにちは")
                .padding() // 全方向にデフォルト余白
                .background(.blue)
            
            Text("これはpadding付き")
                .padding(.horizontal, 40) // 左右だけに40ptの余白
                .background(.blue)
```
例
![Screenshot 2025-05-31 at 15.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/1075fbd9-eee4-4a5b-9014-3551e44622ab.png)

Spacer の例：ビューの間を押し広げる
---

```swift
   Text("上のテキスト")

            Spacer() // ここが空間を押し広げる

            Text("下のテキスト")
```
例
![Screenshot 2025-05-31 at 15.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3977742/9a645723-5ded-4efe-b0d3-2b19f4682e05.png)

まとめ
---
| やりたいこと  | コード例                              |
| ------- | --------------------------------- |
| 全方向に余白  | `.padding()`                      |
| 特定方向に余白 | `.padding(.top)`                  |
| 複数方向に余白 | `.padding([.leading, .trailing])` |
| サイズを指定  | `.padding(.bottom, 30)`           |



paddingは基本中の基本なので、ぜひいろんな場面で試してみてください！
以上SwiftUIのpaddingの使い方を説明でした！ぜひ参考にしてみてください👍