OmniAICreator/Qiita-1.07M huggingface dataset:
Slack API連携を通じて実感した「ChatGPTと情報の信頼性」の話


## SlackとAltaryの連携を進めるにあたって
自社サービス「Altary」のSlack連携を本格的に実装するタイミングで、アクセストークンの管理や自動更新の仕組みが必要となり、OAuth 2.0フローの見直しを行いました。

特に今回は、Slack上で「Bot としてではなく、ユーザー本人として」投稿する機能が必要だったため、User Tokenの活用を前提に設計を進める方針でした。

## 調査段階で直面した疑問：User Tokenでもトークン更新は可能か？
OAuthの運用において避けて通れないのが、トークンの有効期限とリフレッシュ処理です。

当初、ChatGPTに以下のような質問を投げかけました：

>「SlackのUser Tokenでrefresh_tokenを使ったトークン更新はできますか？」

その回答は明確で、以下のように「使えない」とのことでした。

> User として投稿したい場合は xoxp-（User Token）を使う必要がありますが、refresh_token は使えないため、トークンは自前で再取得管理する必要があります。



## 実際にはどうだったか：公式ドキュメントと検証結果
疑問に感じたため、Slackの公式ドキュメント（Token Rotation）を改めて確認したところ、以下の記述が明確に存在していました。

>Either a granular bot token or user token may be exchanged for a refresh token and expiring access token.

つまり、User Token であっても refresh_token による更新がサポートされているということです。

実際にUser Tokenでの認証とトークン交換を試みたところ、下記のようなレスポンスが返ってきました。

```
{
  "access_token": "xxxx-xxxx",
  "refresh_token": "xxxx-xxxx",
  ...
}
```
結果として、User Token においても Token Rotation が正常に機能することが確認できました。

## 気づき：生成AIの情報は必ず一次情報で裏付けを取る
ChatGPTをはじめとした生成AIは、構文や処理の例示など、日常的な開発支援には非常に有用です。

しかし今回のような「仕様の可否や運用ポリシー」に関わる部分に関しては、信頼性の高い一次情報（公式ドキュメント）による裏付けが不可欠であると改めて感じました。

生成AIのトレーニングデータは更新にタイムラグがあることも多く、情報が古い場合もあります。
また、かつての制限や非推奨事項がそのまま残っているケースもあり、注意が必要です。

## 結論：ChatGPTは便利だが「前提の確認」と「裏取り」を怠らないことが重要
Slack APIに限らず、外部サービスとのOAuth認証やセキュリティ仕様に関しては、実装前に公式ドキュメントを確認することを前提とすべきです。

今回のケースでは、ChatGPTの回答を鵜呑みにしていたら、設計をBot Token中心に切り替えてしまい、不要な実装変更やユーザー体験の低下につながるところでした。

生成AIはあくまで「補助ツール」として活用し、判断の根拠となる情報は常に一次ソースで確認することの重要性を、実体験として再認識できた良い機会だったと思います。

## おまけ：AltaryにSlack連携機能がつきました！
開発中のバグレポートアプリ「Altary」から、バグレポートを簡単にSlackに送信できるようになりましたので、ぜひ使ってみてください！

https://altary.io/
【あまりに初心者】ubuntu linuxと格闘してみた

この記事では初心者がLinuxでサーバをたてる練習をしたのでつまづいたところなど説明を交えながら振り返るものです．

# 1.Dockerでubuntu linuxを立ち上げる
参考にした記事:https://qiita.com/yuta_931214/items/9b7859dcd837d692dcef
Dockerのインストールはこちらら:https://docs.docker.com/desktop/

まずはLinuxをpullします．
```
docker pull ubuntu:18.04
```
ubuntuのversionは好きに指定してください．ちなみにいくつかのubuntu以外のlinuxOS（RHELなど）はサブスクがいるっぽいです．

つぎにDockerコンテナを作成しシェルに入ります．
```
docker run -it --name [コンテナ名] ubuntu:18.04 /bin/bash

```
/bin/bashをつけることによってそのままシェルに入れています．

# 2.サーバを立ち上げる
参考にした記事:https://qiita.com/pyon_kiti_jp/items/7000b9a04aa2899bf9a8
今回はapacheでサーバを立ち上げます．
まずはapacheをインストールします．
```
apt install -y apache2
```
dockerでコンテナを作成してシェルに入った場合はrootユーザ扱いとなりsudoコマンドは不要みたいです．
あと，-yオプションは実行中に[y/n]を聞かれた時に自動的にyes回答をしてくれるオプションです．
そしてapacheを起動します．
```
systemctl start apache2
```
dockerのubuntuは軽量版らしくて初期状態ではsystemctl: command not foundとなってしまいました．そういう時は必要なパッケージを下記でインストールします．
```
apt install -y systemd
```
apacheが起動しているかは次で確認できます．
```
ps aux | grep apache2
```
これの意味としてはps auxで実行中のプロセスを表示して| grepでapache2を検索するみたいなことです．
apacheを自動起動の設定にするために以下を実行します．
```
systemctl enable apache2
```
# 3.練習，IPアドレスにアクセスした時に文字を出してみる
目標として
```
curl -i [IPアドレス]
```
を実行した際にServer Working!と表示されるようにしたいと思います．
curlコマンドによって/var/www/html/index.html
### 表示用のファイルの作成
まずは該当の場所にindex.htmlファイルを作成します．
```
cd /var/www/html
touch index.html
```
表示したい内容を書き込んでいきます．
```
vim index.html
```
これで編集モードになります．i + retuenで文字が入力できるようになり，入力後はescでノーマルモードに，:wq + returnで保存できます．
書き込んだ内容を確認します．
```
cat index.html
```
これで書き込んだ内容がターミナルに表示されていれば成功です．
### 実行してみる
自分のIPアドレスを知る必要があります．以下のコマンドで確認できます．
```
ip address show
```
ipコマンドは自分の場合は初期で使用できなかったためiproute2というパッケージのインストールが必要です．
コマンドを実行するといっぱい出力されますが，inetで始まる行でscope globalとなっているものが正解らしいです．
最後に動作を確認します.curlコマンドを実行してみてターミナルに設定した文字列が表示されていれば成功です．お疲れ様でした．
```
systemctl disable apache2
systemctl stop apache2
exit
```
で自動起動の停止，サーバの停止，シェルからの脱出が完了します．
カメラモジュール一般構造説明

1.カメラの紹介
カメラ・モジュールの構造はおおよそ以下の通りです：

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4065231/1ecfdefc-2ee2-4273-bd84-30e5dedfb620.png)

カメラモジュールの動作原理：イメージセンサのイメージセンサ面に投影された光学画像信号を生成するためにレンズレンズを通したシーンは、イメージセンサのA / Dデジタルデジタルにアナログ変換した後、電気信号に変換されたセンサーの感光画素によって、デジタル画像信号に変換した後、ディスプレイのイメージングで処理した後。

推奨カメラモジュール・メーカー：[Muchvision](https://www.muchvision.com)

上からレンズ、ボイスコイルモーターVCM、フィルターIR/ブルーガラスBG、ブラケットブラケット、センサーチップセンサー、プリント基板PCB、コネクター、SMT実装部品で構成されています。

レンズの主な機能は光を集めることで、レンズを通過するファイバー量を受光チップに集めることができる；

VCMはAFモジュールに使用され、フォーカスを合わせます；

IR/BGは主に光のフィルタリングに使用され、IRはコーティングを通して光をフィルタリングし、BGは光エネルギーを吸収する原理を通して光をフィルタリングします；

ブラケットは、VCMとレンズの負荷をサポートするために使用され、上面の溝はIRをマウントし、内側の空洞は、センサー+コンデンサ+ドライバICなどのコンポーネントを収容する；

センサーは光を集め、電気信号に変換して出力する；

PCBは、光電信号をセンサーに伝送し、信号のノイズを低減するために使用されます；


オートフォーカスの有無によってAF（オートフォーカス）モジュールとFF（固定焦点）モジュールに分けられ、パッケージによってCSPモジュールとCOBモジュール（さらにACF、フリップチップなどがある）に分けられ、接続方法によってBTB（基板対基板）、GF（ゴールデンフィンガー）に分けられる、 その他、PDAFモジュール、OISモジュール、デュアルカメラ、トリプルカメラ、TOFなどがある。

カメラモジュールとは何かについて詳しく知りたい方は、[こちらの記事を参照してください](https://www.muchvision.com/info/what-is-camera-module-a-comprehensive-guide-102823123.html)。
インフラエンジニアがS3の静的ホスティングで動的な動きが出来る事について理解に苦しんだ話

## 前提
私は生粋のインフラエンジニアでして開発側の知識が皆無です。（フロント、バックエンドが全く分かりません）

## じゃあなんでそんなこと調べてるの？
AWSのSAPの勉強してると出てくるんですよね。

例文：大手オンライン教育プラットフォームが、受講者向けのコース登録フォームを含む公開の静的ウェブサイト（www.test.edu）を運営しています。このウェブサイトは Amazon S3 でホスティングされ、Amazon CloudFront をコンテンツ配信ネットワークとして使用し、AWS WAF で保護されています。

コース登録フォームって動的だよね？静的ウェブサイト？どゆこと？

開発側の知識がある前提でたくさんの問題が出てくるので、せめてバックエンド側の基礎知識は欲しいなとよく思うわけです。
**知っていた方がよりよいインフラ構成を提示出来ますしね。**

## 理解が難しかったところ
まず、静的ウェブサイトと呼ばれるものは、ペラサイトのようなただ開いて見るだけのウェブサイトという認識です。
つまり、ボタン押せば表示が変わるとか入力できる場所とかそういうのがないものだと思ってます。
そういうサイトに適しているのがS3の静的ホスティングだと。
でも問題文には登録フォームと書いてあるので明らかに動的なんですよね。
じゃあどうやって動的にしてるの？っていうのが全然イメージが付かないわけです。

## 整理した
まず調べて分かったのは、動的な処理をするにはAPI GatewayやLambdaを使用するということ。
確かに動的なことをするわけだからLambdaを使うのは分かる。
でも自分の頭の中のイメージは現時点だとこうです。

![スクリーンショット 2025-04-18 163305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/cc3d3f9b-821c-49c3-89a0-17b85aff68b0.png)

**これじゃあS3に入ってるファイル動的じゃん！訳分からん！**
ChatGPTさんに聞きました。
こういうことですと。

![スクリーンショット 2025-04-18 163705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/75e7e167-57fe-4756-a45a-b419c5a48618.png)


は～ん。あくまでS3内のファイルは表示させるデータをブラウザに渡しているだけで、LambdaがS3に何か返しているわけではないと。
分かったような分かってないような感じです。
S3内ファイルが表示させてるわけだから、動的に変わる命令もLambdaからS3が受け取ってS3内のファイルがなんやかんやしないといけないんじゃないの？と思いますが、それは違うと。
この図からするに、S3から受け取ったものをブラウザが表示して、Lambdaから来る動的処理もブラウザが受け取ってS3から来るファイルといい感じに混ぜて動かしてくれてるってことなのか？

完全に腑には落ちてませんが、S3の静的ホスティングを使っても動的なサイトが作れるといこと自体にはなんとなく納得することが出来ました。

きちんと理解するにはやっぱり1から作ってみないとという所なんでしょうね。

プログラム内の事は全然わかってないままでの理解の仕方のため、誤りも多々あるかもしれません。
知見のある方間違っていればどうぞコメントでご指摘下さい。

以上！！
【初心者向け】Gitの基本的なコマンド

# はじめに
**Git**はソフトウェア開発の**分散型バージョン管理システム**のひとつです。
どこを変更したか、差分を表示することが出来たり、「いつ」「誰が」「どこを変更したか」という情報が記録され一目でわかります。
更新履歴はGitに保存されるので、バックアップ用のファイルコピーは不要であり編集記録があるため、過去のある状態に復元することができます。
今回は、Gitの基本的なコマンドを備忘録として書き綴ります。

# 基本的なコマンド
### `git init`
gitの初期化、現在のディレクトリがバージョン管理下になります。
```python
git init
```

:::note alert
**決してホームディレクトリで`git init`をしてはいけません！**
:::

https://qiita.com/kimagure_cat/items/2aeba620b20e1cc35625

### `git clone`
リモートリポジトリを複製(コピー)してローカルリポジトリとして作成できます。変更履歴もコピーされるので元のリポジトリと同じように履歴を確認することが出来ます。
```python
git clone https://github.com/XXXX/XXXXXX.git #https以降はリポジトリのURL
```
### `git commit`
ディレクトリやファイルの変更や追加をリポジトリに記録してくれます。
そして前段階として、変更したファイルを**インデックス**に反映する操作を行います。
```python
git add ファイル名
```
`git add`をするとローカルリポジトリの変更を一度でインデックスに反映してくれるので、一つずつ`commit`する必要ないので便利です。
そして、`git add`したファイルを`commit`していきます。
```python
git commit #コミットメッセージ
```
`commit`を実行する事で前回`commit`した状態から現在までの差分を記録が作成されます。
また、`commit`実行する際に、メッセージの入力を求められます。これは他の人が変更内容を確認したり、自分が後で内容を見直す場合に必要となる情報ですので、変更内容の分かりやすいメッセージを書く事を心がけましょう。
### git push
自分のローカルリポジトリの変更をリモートリポジトリにアップして共有するために行うのが`push`という操作です。
```python
git push origin master
```
`push`を実行すると、リモートリポジトリに自分の変更履歴がアップされて、リモートリポジトリ内の変更履歴がローカルリポジトリの変更履歴と同じ状態になります。
### git pull
リモートリポジトリを共有して複数人で作業していると、みんながリモートリポジトリにプッシュしていくので、自分のローカルリポジトリに、他の人がプッシュした変更内容を取り込んで更新していく必要があります。その際にする操作がプルです。
```python
git pull origin develop
```
プルを実行すると、リモートリポジトリから最新の変更履歴をダウンロードしてきて、自分のローカルリポジトリにその内容が取り込まれ、ソースが最新の状態になります。
### git branch
`branch`とは、プロジェクトの変更の履歴を枝分かれさせて記録する機能のことを言います。
大元のブランチから分岐させることで、チームの他のメンバーがファイルを変更しても、その影響を受けることなく開発を進めることができます。
つまり、複数人が並行して別の機能を開発することができるというメリットがあります。
```python
git branch ブランチ名
```
また、マージ（`merge`）を行うことで、分岐したブランチを統合することができます。
```python
git merge ブランチ名
```
# まとめ
今回はGitの基本的なコマンドについて解説しました。
特にチーム開発やハッカソンにおいては**ほぼ必須**の技術だと思いますので、個人プロジェクトなどで扱いに慣れると良いと思います。
**最後まで読んでいただき、ありがとうございました。**
ロリポップ！でbaserCMS4系の簡単インストールをしてみた

もふもふが大好きなもふもふです。
今回は[ロリポップ！レンタルサーバー](https://lolipop.jp/ "ロリポップTOP")でbaserCMS4系の簡単インストールをしてみたいと思います！

私の個人事業用にロリポップを契約することにしたので、今までローカル環境でしか使用したことのないbaserCMSを入れてみるか…！と思いつきました。

とりあえずインストール完了までを記事にしたいと思います:･ﾟ✧*

# いざインストール！
ロリポップのユーザー専用ページ ＞ サイト作成ツール へ遷移すると「簡単インストール可能なアプリケーション」が出るので、「利用する」を押下。

![スクリーンショット 2025-04-18 152005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/7793ddef-230a-4c7b-9d06-d492a2a9fc89.png)

「利用する」ボタンを押下すると、下記のページに遷移します。

1. インストール先のURL（ドメイン）を選択
2. 利用データベースを選択
3. baserCMSの管理画面ログインに必要な情報を記入

終わったら、入力内容確認ボタンを押下！
![スクリーンショット 2025-04-18 152227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/99d3cb99-06f0-4a0a-9b12-29c6d63223b0.png)

## エラーが出た！！
「PHPのバージョンが簡単インストールに対応してないから変更してね」と怒られちゃいましたので、PHPの設定を変更したいと思います。
![スクリーンショット 2025-04-18 152549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/5ce82cc0-a31a-4770-aefb-54abace8aa03.png)

メニューの サーバーの管理・設定 ＞ PHP設定 に遷移すると、PHPのバージョンが変更できます！
対象のドメインのバージョンを「7.3」か「7.4」に変更します。（私が見た時は7.4のみでした）
![スクリーンショット 2025-04-18 152728.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/78c14e8d-9335-43f8-b741-e53b08d38cf8.png)

## もう一度トライ！！
設定し直したのでもう一度トライします。
そして入力内容確認ボタンを押下すると……

![スクリーンショット 2025-04-18 153334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/72f093ae-080a-4251-93ed-bc9bd030a631.png)

やった〜！！確認画面に来ました！！
PHPの設定が変更されているようです( ◜ᴗ◝ )

あとはインストールボタンを押下すれば……！

![スクリーンショット 2025-04-18 153409.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/7419c3ff-0ee3-4554-98fd-cb3008909fce.png)

**じゃじゃ〜〜〜〜ん！！！！！**

インストールが完了し管理者ページのURLが記載されているので、ログインしてみます。

## いざログイン！

![スクリーンショット 2025-04-18 153544.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3938071/b0a1ec61-6136-4bf5-a9ed-f5fd79fe5bde.png)

わ〜〜！！管理画面に来た！！お疲れさまでした( ദ്ദി ˙ᗜ˙ )！！ﾊﾟﾁﾊﾟﾁﾊﾟﾁﾊﾟﾁ

## おわりに
今回、基本的にロリポップの簡単インストールの利用方法のページは見ずにインストールしてみました。

PHPの設定のエラーで検索はしたものの、あとは画面の通りに進めるだけでインストールができ名前の通り「簡単」でした( ◡̀⩊◡́)

ただ、現在は4系のみの対応なので、baserCMS5系は対応していません……
ぜひ、5系のインストールも対応してください〜〜〜！！！（5系の方が私使っているんです〜！）

とりあえずこれから、この管理画面を使って『Web知識があまりない初心者テスターはサイトを作れるか！？』を試したいと思いますので、お付き合いいただければと思います！

見てくださり、ありがとうございました！！
Linuxにユーザを追加する手順

# はじめに
- 基本的な作業だけなら非常に簡単
- だが毎回忘れるので、流れを書いておこうと思った

# ユーザアカウントの追加
流れは以下の通り：
1. ユーザ作成：`sudo useradd -m [ユーザ名]`[^1]
   [^1]:オプション`-m`をつけることでホームディレクトリも作る。これが無いとユーザが初回ログインするまでホームディレクトリが作られないので、ユーザを追加したかどうかの確認を`ls /home`だけで済ませられない
2. ユーザが作られているか確認：`ls /home`
2. パスワード初期設定：`sudo passwd [ユーザ名]`
2. 必要に応じてグループを追加（次章）
3. 新規アカウント発行者に連絡
    - アカウント発行者に、接続先サーバホスト名（サーバIP）, ユーザ名, 初期パスワードを伝える
    - アカウント発行者に、接続時に`passwd`コマンドで初期パスワードを変更するように伝える

# グループの追加
sudoとかdockerとかのグループを追加することが多い。
流れは以下の通り：
1. グループが追加されていないことを確認：`id [ユーザ名]`
1. グループを追加：`usermod -aG [グループ名] [ユーザ名]`
1. グループが追加されたことを確認：`id [ユーザ名]`

# おわりに
- サーバ管理の初歩でした
- そのうち追記するかも
CI-03T 動作状態インジケータ

#### はじめに
Ｍ５Stack Unit ASR よりCI-03T 基板を取り出して色々と試してみました。

![R1102918.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/50576fd4-9abe-4389-a0aa-48b267c40088.jpeg)
![CI1302.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/d1706210-5dde-492f-a0de-46db13bd9dd2.jpeg)


#### ウエイクアップを示すインジケータを設置。
ウエイクアップすると点灯しウエイクアップを終了すると消灯。
視認しやすいよう点滅（0.5秒ON/0.5秒OFF）するようにします。

１.使用するポートを設定。　点滅の為、ＰＷＭ １Ｈｚ を設定。
![wakeup_1A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/09219adc-f8a6-433e-ae13-33de50ea7aab.jpeg)
参数４を 开启电平反向 としていますが 关闭电平反向 が正しいです。

２．ウエイクアップでＰＡ１をＯＮ（ＰＷＭ duty 50%）
![wakeup_6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/2885dbfe-1d15-4431-8be3-5cc8a743a54c.jpeg)

3. ウエイクアップ終了でトリガー設定
![wakeup_2A.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/90c4ebef-d1b3-45de-ac42-4b6436701df8.jpeg)


4. ウエイクアップ終了でＰＡ１をＯＦＦ（ＰＷＭ duty 0%）
![wakeup_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/88698fa4-08d0-4f56-8d5e-a9ba62af731e.jpeg)

#### 音楽再生中を示すインジケータを設置。
”音楽を再生”と言った後、１０秒間 曲番号を受け付けます。
容量の関係で２曲としていますが、容量４Ｍ品を使用すれば曲数は増やせます。

１. 曲の選択　"音楽を再生”を受け付けるとＰＡ０を１０秒間ＯＮにします
　  曲選択の"１番目”又は"２番目"では まずＰＡ０がＯＮであることを確認します。
![music_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/2b121628-1403-4b72-9cd5-ef8634ea0a7b.png)

![music_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/1c5fd146-53d0-4281-a461-768f19278328.png)

2. 再生終了でトリガーを設定します。
![wakeup_2B.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/952e55c9-07c8-4be9-b348-1ef969385c0d.jpeg)

![music_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/1ab6a4d8-6118-46b9-a8d9-620fcb3e14dc.png)

  "１番目"、"２番目"で点灯したインジケータをＯＦＦにします。
![music_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/7137c6d5-76ee-4d12-b6f0-e7883dec9ce0.png)

３．ＳＷ（ＰＡ４）でも再生を終了することができます。
![wakeup_2C.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/cafe1088-f43e-42a0-a9c5-10b69fa71c1b.jpeg)

![music_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4045440/6b724162-187b-4e7b-b213-44a2690b7646.png)

#### 結果
ランプの点滅や明るさ調整等もうまく動作します。
長い音声出力（音楽）の途中停止も問題なく機能します。
ＭＩＣ２端子も引き出されているので２マイクでの音源定位等も確認してみたいと思っています。

#### 動作している動画 (音声をVOICE VOX 春日部つむぎ に差換え版)
https://www.youtube.com/watch?v=4BWeAo5jmQo&t=14s

#### CI-03T 入手先　（2㎜ → 2.54㎜ピッチ変換基板もあり）
https://www.aitendo.com/product-list/1259
Power Apps のチェックボックスに勝手にチェックが入る理由

# はじめに

ごきげんよう、百合宮桜です。
今回は、以下の動画のような事象の解消方法をお伝えします。

<iframe width="1280" height="720" src="https://www.youtube.com/embed/752eQ4IFDy0" title="チェックボックスが勝手にオンになる！" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

Power Apps のアプリでチェックボックスにチェックを入れたり、チェックを外したりという作業をする際に特に何もしていないチェックボックスにも勝手にチェックが入ってしまうという事象が発生しました。

# 原因

今回の原因は Default プロパティが True になっていることでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/2fd29795-d7ea-9c62-38bb-e15bb86bd917.png)

これによってチェックボックスからチェックを外した時に Default の True（チェックボックスON）に戻そうとする動きをするようです。
それで勝手に全部チェックボックスがオンになってしまうんですね、ぴえん

# 対処法
Default プロパティを ThisItem.列名 にすれば解決！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3032705/6b284adc-42a7-96aa-cf60-77d3ea40e6a4.png)

強制的に True にする動きを排除するために、Default プロパティを ThisItem.列名 にして、現在の値が Default ですよーということにすると動作が安定します♪

# 終わりに
いかがでしたか？
チェックボックスの Default プロパティはめっちゃ真面目に仕事をしてくれるので気をつけてください！ 役に立ったと思った人はぜひ 💛 を、見返したいと思った人は 📁 をおしてくださいな！
それではごきげんよう✨
無料講座で簡単に学ぼうPythonおすすめ講座２弾

こんにちは、韓国在住のsanaです！
先週の金曜日に続いて週末に勉強できるPython無料講座を紹介します。


:one:Python無料講座 ６時間でPythonの基本を学ぼう！

YouTube430万再生、Inflearnで2万7千人受講生を記録した韓国で人気の高いPython講座が無料で視聴できます！


![5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4032401/cba45b90-685b-4eb4-93a1-3532cabf650a.gif)

クラフトゲームの一部を作るパートまで:open_hands:
さらに各チャプターごとにクイズがあるので学んだことを直接学習をすることができ、コーディングを通して実践力まで身につけれます！

https://u.inf.run/44ySsw3





:two:　Python無料講義（活用編7）- 機械学習
世界一簡単に学べる機械学習講座:sparkles:


機械学習は人が学習して物事を覚えるように、コンピューターに「経験から学ぶ力」を与え、人と同じような働きをコンピューターにもさせようという技術です！

そんな機械学習も簡単に！無料で！！学べます:point_up:

https://u.inf.run/3Eq2vJc


一番目の基本講座でPython基本を学んだあと活用編として機械学習を学んでいてはどうでしょうか？？

また先週投稿したPython無料講座もPython入門者におすすめなのでそっちの記事もぜひチェックしてみて下さい！！

https://qiita.com/sana89/items/9398c4873676d1a5a9a6

ファイティン:runner:
自分が実際にgitでよく使うコマンド

# はじめに
### 概要
- gitのコマンドはたくさんあるが、**よく使う部分は限定される**
- 使うコマンドだけメモして置こうと思った

### 以下の説明について
- 細かい用語の説明は省略します。例えば「コミットが何か？」とか
- 一方で極力専門用語を使わないように書いてます。例えば「ステージング」とか

# 初級
**初期設定系**
- ユーザ名を登録：`git config --global user.name "[ユーザ名]"`
- ユーザのメアドを登録：`git config --global user.email "[ユーザのメールアドレス]"`

**リポジトリ準備系**
- 今いるフォルダをリポジトリとして設定：`git init`
- アップロード先のURLを設定：`git remote add origin [アップロード先URL]`
- 既存リポジトリをダウンロード：`git clone [アップロード先URL]`

**ファイル更新系**
- 更新したファイルを確認する：`git status`
- 更新したファイルを登録する：`git add [ファイル名]`
- コミットする：`git commit -m "[修正に関するコメント]"` 
- アップロード（初回のみ）：`git push -u origin [ブランチ名]`
- アップロード（初回以降）：`git push`
- アップロード先から更新情報をダウンロード：`git pull`
- 他のブランチの情報を取り込む：`git merge [ブランチ名]`

**ブランチ変更系**
- ブランチを切り替える：`git checkout [ブランチ名]`
- ブランチを新しく作る：`git checkout -b [新規ブランチ名]` 

# 中級
**ファイル更新テクニック**
- 更新ファイルのどこが更新されたか確認：`git diff [ファイル名]`
- 更新ファイルの中身の一部だけをaddする：`git add -p [ファイル名]`
- 他のブランチから必要な変更だけ取ってくる：`git cherry-pick [コミットID]`

**何か間違っちゃったとき**
- addしたファイルをaddから外す：`git restore --staged [ファイル名]`
- 直前のcommitのコメントを修正する：`git commit --amend`
- ブランチ名の変更： `git branch -m [ブランチ名]`

**今行った編集を一時的に退避しておきたいな...とき**
- commitしていない変更を一旦退避：`git stash`
- stashで一旦退避した変更を復元：`git stash pop`

**ちょっと前のコミットまで戻したいな…のとき**
- 状態をある時点までリセット：`git reset --hard [コミットID]`
- 状態を直前のコミットまでリセット：`git reset --hard HEAD`

**ブランチをきれいに保つ**
- ブランチの起点を変更する：`git rebase [ブランチ名]` 
- 強制push（rebaseの後とか使う）: `git push -f`

**不要なブランチを削除**
- リモートで削除されたローカルにあるブランチを削除：`git fetch --prune`
- ブランチをしてい強制削除：`git branch -D [ブランチ名]`

**リポジトリを管理するあなたへ**
- メインブランチの変更：`git branch -M [ブランチ名]` 
- 現在のcommitにタグを打つ：`git tag [タグ名]`
- タグをアップロード：`git push origin [タグ名]`

# おわりに
- gitを使いこなすのはなかなか難しい。。。
- まだたくさんあると思うので、適宜追加します
OCIでNVIDIAのドライバインストール済のインスタンスを構築

## はじめに
クラウド環境でNVIDIAのGPUインスタンスを利用する際、最初にNVIDIAドライバとCUDAをダウンロードすることも多いかと思います。
この時（GB単位のダウンロードになるため）ダウンロードに思ったより時間がかかり、GPUインスタンスの立ち上げにかかっているコストも気になってくるところです。
Oracle Cloud（OCI）でGPUインスタンスを作成する場合、OSがOracle LinuxであればNVIDIAドライバとCUDAが最初からインストールされたイメージを利用することが可能なため、今回はそのイメージについて紹介できればと思います。
※Oracle Linux以外のLinuxインスタンスでは、NVIDIA社のサイトより適切なドライバおよびCUDA Toolkitをダウンロード下さい。

## OCIのGPUインスタンス
OCIではNVIDIA社のGPUインスタンスとして、BMインスタンスとVMインスタンスが用意されております。よく使われることの多いBMインスタンスではA100、H100、H200等の主要なNVIDIA社GPUをご利用可能です。
それぞれ構築可能なシェイプの詳細は以下のサイトを参照下さい。

BMインスタンス
https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-gpu

VMインスタンス
https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#vm-gpu

## GPUインスタンス向けのプラットフォームイメージ
インスタンスを構築する際にイメージを選択しますが、以下の様に選択することでGPUインスタンス向けのイメージを選択することが可能です。
※画像は全て2025年4月時点のUIになります。

### ①シェイプの変更
メニューから「コンピュート」→「インスタンス」→「インスタンスの作成」を押下し、コンピュート・インスタンスの作成画面を表示します。
その画面上で、「シェイプの変更」メニューを押下し、利用したいGPUのシェイプを選択します。
![shape.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4049586/a4f76383-a964-44b3-a06f-fa6f2909e97e.jpeg)
※GPUインスタンスのシェイプを選択するには、事前にサービスリミットの引き上げが必要となります。

### ②イメージの変更
「シェイプの変更」が終われば、次は「イメージの変更」でGPUインスタンス向けのプラットフォームイメージを選択します。
![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4049586/b65c54b4-2d76-484b-956c-86d869402a76.jpeg)

「イメージの選択」は「Oracle Linux」（デフォルト）を選択し、利用したいOracle Linuxのバージョンに対して、以下の様にイメージビルドから「Gen2-GPU-xxxx」となっているイメージを選択します。
![イメージビルド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4049586/40592a17-3cd7-425a-80cb-3fd002aca0ae.jpeg)

これでGPUインスタンス向けのプラットフォームイメージを利用したインスタンスを選択することが出来ました。あとは通常と同じようにインスタンスの各種設定をして「作成」を押すことでGPUインスタンスが構築されます。
![image_and_shape.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4049586/369fc67b-5a63-4c7c-b268-0c95aed2cf4d.jpeg)

具体的にNVIDIAのドライバ、CUDAのどのバージョンがインストールされているかは、以下のイメージリストから選択したGPUプラットフォームイメージのページでご確認下さい。
・Oracle Linux 9.x Images
https://docs.oracle.com/en-us/iaas/images/oracle-linux-9x/index.htm
・Oracle Linux 8.x Images
https://docs.oracle.com/en-us/iaas/images/oracle-linux-8x/index.htm

## おわりに
事前にNVIDIAドライバ、CUDAがインストールされていることで、インスタンス立上げ時からすぐ作業に取り掛かることができます。OSがOracle Linuxで問題ない場合は、ぜひGPUインスタンス向けのプラットフォームイメージをご利用ください。
【初心者向け】Pythonモジュールやスクリプトについて

# はじめに
今回は、Pythonの「**モジュール**」と「**スクリプト**」を改めて学び直し
###### ・スクリプトとモジュールってどう違うの？
###### ・`import`って何をしてるの？
###### ・ファイルを分けるメリットってあるの？
という疑問を備忘録も兼ねて解説します。

---

## スクリプトとは？

### 簡単に言えば…

> **スクリプト = Pythonのプログラムファイル（`.py`ファイル）**

スクリプトは、Pythonのコードが書かれたファイルで、**直接実行**できるのが特徴です。

例：

```python
# hello.py
print("こんにちは、Python！")
```
ターミナルやコマンドプロンプトで実行できます。
```python
python hello.py
```
# モジュールとは？

簡単に言えば…

モジュール = 他のスクリプトから「`import`」して使えるPythonファイルです。

モジュールも`.pyファイル`ですが、主に再利用を目的として使われます。
```python
utils.py
def greet(name):
    print(f"こんにちは、{name}さん！")
```
この`utils.py`を、別のスクリプトから使ってみます。
```python
# main.py
import utils

utils.greet("たろう")

:実行結果
こんにちは、たろうさん！
```
# どうしてモジュールを使うの？

###### 1. コードを分けて整理できる

1つのファイルに全部書くと、読みづらく・修正しにくく・再利用もしづらい。
モジュールに分ければ、関数やクラスを他のファイルから簡単に使い回せます。


###### 2. 必要な処理だけ読み込める

モジュールを作ることで、必要な処理だけを `import` して使えるようになります。
```python
from utils import greet
greet("さくら")
```
3. 自作モジュールも標準モジュールも同じ方法で使える

Pythonには最初から用意された便利な「標準モジュール」もあります。
```python
import math

print(math.sqrt(16))  # 4.0
```
自作モジュールもこの`math`のように`import`で使える、というのがポイントです！


# モジュールの中でも実行できるコードを書くには？

よく使われるテクニックがこちら：
```python
# utils.py
def greet(name):
    print(f"こんにちは、{name}さん！")

if __name__ == "__main__":
    greet("直接実行されました")
```
 なにこれ？と思ったら…
	•	このコードは、`utils.py` を直接実行したときだけ動きます
	•	`main.py` など他のファイルから `import` されたときは**動きません**。

これは「モジュールとしてもスクリプトとしても使える」ようにするPythonの定番スタイルです。

|用語|ざっくり言うと…|
|:-:|:-:|
|スクリプト|そのまま実行するPythonプログラム|
|モジュール|他のファイルからimportして使う部品集|

`.pyファイル`はどちらにもなれる（`__name__ == "__main__"` を使うと便利）
	•	自作の関数や処理をモジュール化すると、再利用しやすく、コードもきれいになる


# おまけ：モジュールの管理Tips
•	モジュールは同じディレクトリにあるファイルを`import`するときに使える
•	Pythonのバージョンが3.3以降なら、サブフォルダに`__init__.py`がなくてもOK
•	複数ファイルを使った開発を始める第一歩として、モジュール化に慣れておくと◎！
# まとめ
私自身、モジュールやスクリプトの概念を理解できていなかったので今回の記事を通してより深く理解していきたいと思います。
**ここまで読んでいただき、ありがとうございました。**
【Rails】database.ymlについて

# 記事概要
Ruby on RailsのDB環境について、まとめる

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

# 基本情報
## ファイルパス
config/database.yml

## 記載方法
修正箇所のみ、更新する

## 運用環境
システムをどこで使用するか定められている環境のこと
※運用環境を使い分けることで効率的に作業を行うことが可能

|運用環境|通称|概要|
|---|---|---|
|development|開発環境|主にアプリケーションを開発をする際に使用する環境|
|test|テスト環境|アプリケーションの動作をテストする際に使用する環境|
|production|本番環境|アプリケーションを実際にリリースする際に使用する環境|

# まとめ
## データの保存形式を変更
`encoding: utf8mb4`を`encoding: utf8`に変更する

```ruby
default: &default
  adapter: mysql2
  # encoding: utf8mb4
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock
```

# Ruby on Railsまとめ
https://qiita.com/likapantrip/items/46b43c9d1309b6633f0a

# DB
https://qiita.com/likapantrip/items/9323f4abbec7f58b123a
WSL2 + VScode + MCP のコマンドがうまく通らないときの対処

# WSLでMCPを動かす際の設定

## なにが起きているか

MCPの設定項目は大体下記のように `node` のパッケージを `npx` 越しに起動する形になります。

```json
{
  "mcp": {
    "servers": {
      "playwright": {
        "command": "npx",
        "args": [
          "@playwright/mcp@latest"
        ]
      }
    }
  }
}
```

ただ、現在の設定では、Windows側のnpxが実行されます。（WSL内でvscodeを開いていてもこれは発生します）なので、基本的に `WSL` コマンド越しに `npx` をたたくことになるんですが、パスが `Windows` 環境のものが使用されるため、おそらくうまく動作しないと思います。WSLを使っている方は Windows環境にほとんどなにも入っていないと思いますので、、、


## 改善された設定案

ということで、改善案としてはとりあえずフルパスを指定しておけば問題ありません。
ただ、これ以外にも解決策はあると思うのでだれかいい方法があれば教えてください。


```json
{
  "mcp": {
    "servers": {
      "filesystem": {
        "command": "wsl",
        "args": [
          "bash",
          "-c",
          "/usr/bin/npx -y @modelcontextprotocol/server-filesystem /src/projects/test"
        ]
      }
    }
  }
}
```
個人的備忘録：macのデフォルトシェルを調べたいときに使うコマンドについて

## はじめに

はじめに、シェルの基本的な仕組みや、自分の作業環境を知ることの大切さについて触れておきます。シェルとは、私たちがコンピュータと対話するためのインターフェースであり、さまざまなコマンドを入力してOSを操作するための重要なツールです。

:::note warn
***特に複数のシェル（例：Bash、Zsh、Fish など）が存在する環境では、設定ファイルや動作に微妙な違いがあり、それによってコマンドの挙動が変わることもあります。***
:::

そのため、まずは自分のデフォルトシェルを確認し、必要に応じてカスタマイズしていくことが重要です！

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

この記事では、「デフォルトシェルの確認方法」について説明します。

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

Linux や macOS のターミナルでの作業を行う際に、自分がどのシェルを使っているかを把握することはとても重要です。

---

## デフォルトシェルを確認する方法

デフォルトシェルとは、ログイン時に自動的に起動されるシェルのことを指します。
現在のデフォルトシェルを確認するには、以下のコマンドを使います。

```bash
echo $SHELL
```

### 出力例
```
/bin/bash
```
この場合、デフォルトシェルは Bash であることがわかります。

---

## まとめ

- `echo $SHELL` を使えば、自分が使っているデフォルトシェルを簡単に確認できます。

シェルの種類によって使えるコマンドや設定ファイルが異なるため、確認しておくと役立ちます。
🧑‍💻 少し遅めの自己紹介

はじめまして、インフラエンジニアをやっている24歳です！
普段はVMwareを使った仮想基盤の運用保守をメインにしていますが、最近はクラウド（特にAWS）やPythonにも興味が広がっていて、業務外では個人開発や資格勉強にもガッツリ取り組んでいます💪🔥

## 🎯 趣味＆ライフワーク
**筋トレ歴3年**：週5でジム通ってます。ショルダープレスが好きです🏋️‍♂️

**資格勉強**：将来のキャリアにつながることをコツコツ学ぶのが好きです📘

**取得資格一覧**
　・LPIC Level1
　・ITパスポート
　・基本情報技術者
　・CCNA
　・AWS-CLF(クラウドプラクティショナー)
　・AWS-SAA(ソリューションアーキテクト)
　・AWS-SAP(ソリューションプロフェッショナル)
 
 **現在取組中**
　・応用情報技術者試験
　・AWS-SOA(シスオプスアソシエイト)
　今年度中にAWS全冠を目指しています📖

**サッカー観戦**：バイエルン・ミュンヘンを応援しています(ミュラーの退団悲しい😢)

**個人開発**：興味のある技術を手を動かして学ぶのが好きで、趣味がてらWebサービスを作ったりもしてます。最近はReact＋Python＋AWS構成がマイブームです🌐✨

## 📌 Qiitaではこんなことを書いていきます！
Qiitaでは、主に以下のような内容を発信していく予定です：

・インフラ初学者向けの記事（VMware/AWS/Linuxなど）

・資格取得の勉強記録やレビュー（LPIC, CCNA, AWSなど）

・個人開発で触れた技術のハンズオンメモ（React, Supabase, EC2構成など）

・Pythonを使ったWebスクレイピングや自動化のTips

・実際に読んでよかった技術書の紹介や活用法

「自分が1年前に読みたかったもの」をテーマに、初心者にもわかりやすい記事を心がけています📝
同じようなフェーズの方と交流できたら嬉しいです🙌
pandasで表示が省略されてしまって困った

# pandasで表示が省略されてしまって、データが把握できない。
kaggleコンペに取り組んでいるのですが、読み込んだCSVデータを表示させようと`train.head()`と入力してみたところ、以下のように列が省略されて表示されてしまいます。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4064049/ab322deb-9169-4169-b7ff-3f18d57ae544.png)

この「...」というところが省略されている列で、この「...」という列を表示させないと、データが分からないじゃないかと思っておりました。

# 以下のコードで解決
色々検索してみたところ、以下のコードで列が省略されずに表示させることができることがわかりました。

```
pd.set_option('display.max_columns', 81)
```
どうやらcolumnsが列のことで、数字は表示させることができる列数のようです。このコードを最初に入力し、それからcsvファイルを読み込み`train.head()`と入力すると列が省略されずに表示できるようになりました。


![pandas.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4064049/6b68f999-f0db-4f5a-9485-b99978a72b6b.png)

このデータの列数は81ですので、全ての列が省略されずに表示されるようになりました。良かった。良かった。

# 行が省略される場合は以下のコード
ちなみに行が省略される場合は以下のコードで行が表示されるようです。

```
pd.set_option('display.max_rows', 900)`
```

rowsが行で、数字は表示させることができる行数のようです。pandasは結構めんどくさい仕様ですね...。
個人的備忘録：毎日のターミナル操作が劇的に楽になるalias活用術についてまとめてみた

## はじめに

Linuxなどのシェル環境（特bash）を使用していると、毎回同じような長いコマンドを入力するのが面倒に感じることがあります。

:::note info
**たとえば `ls -alh` や `kubectl get pods -A` のようなコマンドです。**
:::

そんなときに便利なのが **エイリアス（alias）** です。

この記事では、エイリアスの基本的な使い方や設定方法について解説します。

---

## エイリアス（alias）とは？

エイリアスとは、長いコマンドやよく使うオプションを短い別名（ショートカット）に置き換える機能のことです。

:::note warn
***これにより、ターミナル操作の効率が飛躍的に向上します。***
:::

たとえば以下のように設定することで、`ll` という短いコマンドで `ls -alh` を実行できます：

```bash
alias ll='ls -alh'
```


## 一時的なエイリアスの設定

ターミナル上で以下のようにコマンドを入力すると、そのセッション中だけ有効な一時的なエイリアスを作成できます。

```bash
alias gs='git status'
```

これで `gs` と入力すれば `git status` が実行されるようになります。

## 永続的なエイリアスの設定

エイリアスを毎回設定するのは面倒なので、シェルの設定ファイルに記述しておくと便利です。

- bashの場合：`~/.bashrc` または `~/.bash_profile`
- zshの場合：`~/.zshrc`

```bash
# ~/.bashrc
alias ll='ls -alh'
alias gs='git status'
alias c='cat'
```

設定を保存した後は、以下のコマンドで再読み込みします：

```bash
source ~/.bashrc
```

## 注意点

- エイリアス名が既存のコマンドと重複しないよう注意する
- 複雑な処理や引数の展開が必要な場合は、シェル関数の方が適している

---

## おわりに

エイリアスは非常にシンプルながら、使いこなすことで作業の効率が大幅に向上します。自分のよく使うコマンドを整理して、便利なエイリアスを設定してみましょう。

特に学習中の人や、日常的にコマンドライン操作を行う人にとって、作業のストレスを減らす一つのライフハックになります！
【Azure】Visual Studio Code のAzure拡張機能にて権限があるはずのサブスクリプションが表示されない場合の対処方法

こんにちは！
Azureってテナントやらサブスクリプションやらリソースグループやらややこしいですよね。
今回は、VSCで自分のアカウントの権限のあるはずのサブスクリプションが表示されない場合で詰まったので、解決方法です。

# まず自分の場合は以下のような状態
Azure拡張機能の**RESOUCES** 欄には、自分のサブスクリプションが一つのみ表示。
少し下に表示される **ACCOUNT & TENANTS** には一つのアカウント内に3つのテナントの権限がある状態です。
本来なら、**RESOUCES** 欄には、もっとたくさんのサブスクリプションの権限があって新規に追加したはずのサブスクリプションを表示されていません。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846056/ca780532-2d4b-4f70-999a-9a283feaca23.png)

# 非表示になる設定になっていた。 

コマンドパレット(Ctrl + Shift + P)を開いて、
 ```Azure: Select Subscriptions…```
 を実行し、クリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846056/073d1ad1-3076-4d36-b093-02deb17b5a8c.png)

すると、以下の画面になっているので、(自分の場合は、4つアクセスすることができます)
表示させたいテナント配下の サブスクリプションに✔を入れる
ここが一つしかチェックがついていないから、一つしか表示されなかったんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846056/a189dace-3223-443f-a559-d0efdf1e134b.png)

# 無事表示完了
表示されない場合は上部の 🔄（Refresh） を押したり VS Code を再起動してみてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3846056/56fc0aef-8889-455b-85a9-b3717a91d95b.png)
Ufw: /.env にアクセスするサイトをブロックする

Nginx サーバーのエラーログ　/var/log/nginx/error.log に、/.env にアクセスして、エラーというログが出ていました。
それをブロックする方法です。

## error.log から、コマンドの作成

```bash
#
grep "/.env" error.log > tmp01
wc tmp01
awk -Fclient: '{print $2}' tmp01 > tmp02
awk '{print $1}' tmp02 | sort -u > tmp03
#
awk -F. '{print $1,$2}' tmp03 | sort -u > tmp04
wc tmp04
awk '!/:/{print $0}' tmp04 > tmp05
wc tmp05
awk '{print "sudo ufw deny from ",$1"."$2".0.0/16"}' tmp05 > go_deny.sh
```

## 作成されたコマンド

```bash:go_deny.sh
sudo ufw deny from  103.145.0.0/16
sudo ufw deny from  108.60.0.0/16
sudo ufw deny from  137.184.0.0/16
sudo ufw deny from  138.197.0.0/16
sudo ufw deny from  138.68.0.0/16
sudo ufw deny from  143.244.0.0/16
sudo ufw deny from  154.83.0.0/16
sudo ufw deny from  157.245.0.0/16
sudo ufw deny from  159.203.0.0/16
sudo ufw deny from  159.65.0.0/16
sudo ufw deny from  165.22.0.0/16
sudo ufw deny from  165.227.0.0/16
sudo ufw deny from  170.39.0.0/16
sudo ufw deny from  176.65.0.0/16
sudo ufw deny from  178.128.0.0/16
sudo ufw deny from  191.96.0.0/16
sudo ufw deny from  195.178.0.0/16
sudo ufw deny from  195.211.0.0/16
sudo ufw deny from  196.251.0.0/16
sudo ufw deny from  206.189.0.0/16
sudo ufw deny from  206.81.0.0/16
sudo ufw deny from  207.154.0.0/16
sudo ufw deny from  209.38.0.0/16
sudo ufw deny from  213.232.0.0/16
sudo ufw deny from  216.225.0.0/16
sudo ufw deny from  35.216.0.0/16
sudo ufw deny from  4.251.0.0/16
sudo ufw deny from  45.135.0.0/16
sudo ufw deny from  45.148.0.0/16
sudo ufw deny from  46.101.0.0/16
sudo ufw deny from  51.89.0.0/16
sudo ufw deny from  62.4.0.0/16
sudo ufw deny from  70.39.0.0/16
sudo ufw deny from  82.197.0.0/16
sudo ufw deny from  93.123.0.0/16
```

作成したコマンドを実行する

## 状態の確認


```text
$ sudo ufw status numbered
(省略）
[18] Anywhere                   DENY IN     103.145.0.0/16            
[19] Anywhere                   DENY IN     108.60.0.0/16             
[20] Anywhere                   DENY IN     137.184.0.0/16            
[21] Anywhere                   DENY IN     138.197.0.0/16            
[22] Anywhere                   DENY IN     138.68.0.0/16             
[23] Anywhere                   DENY IN     143.244.0.0/16            
[24] Anywhere                   DENY IN     154.83.0.0/16             
[25] Anywhere                   DENY IN     157.245.0.0/16            
[26] Anywhere                   DENY IN     159.203.0.0/16            
[27] Anywhere                   DENY IN     159.65.0.0/16             
[28] Anywhere                   DENY IN     165.22.0.0/16             
[29] Anywhere                   DENY IN     165.227.0.0/16
(省略）
```

## 参考

http と https の接続を許可する方法

```bash
sudo ufw allow 80/tcp
```

```bash
sudo ufw allow 443/tcp
```
IAMユーザーの権限にとりあえずFullAccessを付けていた人へ

## IAMユーザーの権限にとりあえずFullAccessを付けていた人へ
IAMを最小権限の原則に従って付けるというのは周知の事実ですが、
権限が細かすぎて何つければいいか分からないですよね。
私もまったく分かっていなくてとりあえずAdministratorAccess権限で構築してました。
個人的に開発環境でやるのであればそれでもいいかもしれませんが、業務でとなるとやはりセキュリティ面でなるべく権限は抑えたいですよね。
調べてみるとどうやら「**IAM Access Analyzer**」というものを使用して必要な権限のみを洗い出してポリシー作成が出来るらしいです。

というわけで早速やってみます！！

## やってみた
とりあえず検索で「IAM」見てみるか。

![スクリーンショット 2025-04-18 112056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/be9eb411-3e80-4079-97d5-1984599a41ed.png)


これか？


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/3f044241-6481-4176-aca2-937e5877634c.png)

なんか監査的な感じでポリシーを作ってくれるわけじゃなさそう...

調べてみると、どうやら**ユーザーやロールの証跡を元にポリシーを作成してくれる**みたいで、
対象のユーザーやロールの画面から作成するみたいです。

![スクリーンショット 2025-04-18 112535.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/b96088a7-7bef-40e7-be5f-ac601f8327e2.png)

自分が使っているユーザー画面に推移したらありました！

:::note warn
※注意
CloudTrailの証跡を元にポリシーを作成するため、証跡を作成しておく必要があります。
デフォルトで３ヶ月間操作履歴を取ってくれますが、それとは別に証跡作成の必要があります。
（証跡作成に料金は掛かりませんが、証跡をS3に保存するため保存料金が掛かります。）
:::

というわけで証跡を作成して、証跡を出力させるために一通り必要そうな行動をします！
（証跡作成の方法は割愛）

今回はCloudformationを使って、IAMやネットワーク周り、EC2、ALBを作成しました。

CloudTrailの証跡を見ると色々と記録されていますね！
このデータから適切なポリシーを作成してくれるっぽい。

![スクリーンショット 2025-04-18 113142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/6100a540-0dbf-4016-a6b9-8eb6932009bb.png)

では一通り構築作業など行ったので、AWSにIAMポリシーを作成してもらいましょう。

![スクリーンショット 2025-04-18 113348.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/597cce4c-af3d-4bd7-970a-e62dc8683264.png)

１日で作業したので、直近１日で取ります。（ここが長いほど作成に時間が掛かります）

作成した証跡を選んで、構築に使用したリージョンを選んで生成してみます。

![スクリーンショット 2025-04-18 114517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/4023be0c-3fd7-4ce1-8719-3f045deb234f.png)

数分待ったら作成されましたね。

![スクリーンショット 2025-04-18 114619.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/0fedb455-c1c5-44cb-b973-bb153ebcb9c6.png)

いい感じに必要そうなポリシーが含まれてそうです！

![スクリーンショット 2025-04-18 114745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/c35a317e-df7d-460a-a45a-cc2179997c1a.png)

そしてそのまま他に必要なポリシーを追加していけるみたいです。

次の画面に推移するとJSONでの設定画面となりますが、結構構文エラーとなってます。

![スクリーンショット 2025-04-18 115123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/a644a26c-f700-4a80-9114-43442822bfdd.png)

どうやらResource部分が"${Variable}"となっててIAMでは対応していないみたいです。
ここは一旦全てアスタリスクに変えて反映します。

![スクリーンショット 2025-04-18 115705.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3860847/7e64d864-62ae-4006-a7ad-ada778e4e50f.png)

これでユーザーに対して適切なポリシーが付与出来ました！
あとはAdministratorAccessを削除して、足りない権限は随時増やしていくという運用になるのかなと思います。
リソース部分をどこまで絞るかは要件とかにもよるかと思いますが、個人的には操作権限の上にどれを触れるかまで絞るのはかなり手間がかかりそうでなるべくやりたくないですね(;^_^A
そこはそこでまた何か効率のいい方法があるかもしれません。

## まとめ

作業した流れをここでまとめておきます。

１．CloudTrailで証跡作成を行う
２．ユーザーやロールなどで行いたい作業を事前に一度通して行う
３．対象ユーザーやロールの画面からCloudTrailを用いたポリシー作成を行う
４．構文エラーが出た場合は修正（今回はリソースをアスタリスクで許可）

あとは元々使用していたFullAccess系の権限を外して運用し、都度足りない権限を追加していくことで、１からポリシーを作成するよりだいぶ手間は減ると思います。

**以上！！**
ZTM (Zero to Mastary)が無料期間！

https://academy.zerotomastery.io/

    Udemyでもかなり使用させてもらっている、ZTMさん。
    現在無料で受講できるお知らせが来たのでさっそく登録
現在、Three.jsのコースを覗いてみたらクリエイティブ魂に火がついてしまった。

とはいえ、現在、大学の３学期で２コース同時に受講。加えて、Hack the Box とHTBアカデミーも毎日やりつつ仕事もしている。

なんだけど！！
やっぱり、今開発したいものにもマッチするし、以前ちょっと触っただけでかなり３Dの動きは楽しい！

https://threejs.org/

この公式サイトにはいくつも作品があって、本当に面白い。
地道にやっていこうと思います。

ZTMはもちろん英語だけれど、教えることに特化しているので質も高い。
Udemyでもかなりおせわになりました。

自分のスキルが上がれば本当に楽しいよね。
というかもっと楽しい仕事たくさんしたい！

2025年4月21日までらしいので、興味のある方はぜひおすすめです！
技術進歩の功罪 ~技術が爆発的に加速する時代に、技術者はどう在るべきか~

:::note info
**サマリ**
- **技術の進化により、かつて専門家だけが扱っていた領域に誰もが簡単にアクセスできるようになった。** コーディングやデザイン、動画編集や音楽制作も、数クリックで“それらしい成果”が得られる時代になっている。
- **技術の進歩は確かに創造の裾野を広げたが、一方で人間の営みに静かに影響を与えている。**
- たとえば作業スピードの向上は、単純作業の“余白”を奪い、常に判断や創造を求められる働き方を生み出した。本来、技術は余裕を与える存在だったはずが、結果として心のゆとりを減らしている場面もある。
- また誰でも一定レベルの成果物を出せるようになったことで、未熟な表現が大量に流通し、質の高いものが埋もれやすくなった。量が質をかき消すことで、文化の深まりや洗練が妨げられていく懸念がある。
- **技術を扱う私たちは、その技術がどんな価値を生み、誰のためにあるのかを問い続けなければならない。**それが、技術を本当の意味で“価値”に変えるための出発点である。
:::
　

# 技術の進歩が加速しすぎている現代
かつては専門的な訓練や長年の経験を必要とした領域に、誰もが容易にアクセスできる時代が到来している。
これは疑いようのない技術革新の成果である。たとえば、大規模言語モデル（LLM）を用いれば複雑なコードを自然言語で書くことができ、写真や動画の編集もわずかな操作で洗練された仕上がりになる。
音楽制作やグラフィックデザイン、さらにはデータ分析や論文の要約に至るまで、かつては専門家の世界だったものが今では誰の手にも届くところにある。

技術は明らかに創造の可能性を広げてきた。
しかしその一方で、私たちはこの加速の流れのなかで何か大切な感覚を置き去りにしてはいないだろうか。
「便利になった」「誰でもできるようになった」という言葉の裏で、どこか微かな違和感が広がっているようにも思えるのだ。

 

# スピード向上の罠──人間の余白が失われていく

自動化と最適化は、かつて人間が担っていた多くの作業を軽やかに肩代わりするようになった。
作業の速度は格段に上がり、結果が出るまでの時間も短縮された。それは一見好ましい変化のように思えるが、果たしてそうだろうか。

私たちの仕事や暮らしには、あえて時間をかけることによって得られる「余白」や「呼吸」があった。
ルーティンワークや単純作業は、必ずしも非生産的なものではなかった。思考を落ち着かせ、次の集中に向けてリズムを整える、いわば“間”のような存在だったのではないか。

そうした“間”は徐々に削られ、代わりに現れたのは次々に押し寄せる高度な判断や創造的思考への絶え間ない要求である。
本来、技術によって得られるはずだった「余裕のある時間」は、より高い期待とスピードへの順応という名の圧力に変わり、人間の認知リソースをすり減らしているようにも映る。

 

# 難易度の低下──低品質の量産と文化の摩耗

もうひとつ見過ごしてはならないのが、創作の“敷居の低さ”がもたらす文化的な変化である。
今や、誰もが何かを「つくる」ことができる。ワンクリックで楽曲ができ、数秒で文章が整い、数分で動画が完成する。

このことは表現の機会を広げ、才能が開花するきっかけを多くの人に与えるという意味では確かに素晴らしい。
一方で、かつては「作品」として世に出る前に自然と淘汰されていたような、未熟で粗雑なアウトプットが大量に流通するようになった。

誰でも「50点」を出せる社会になれば、相対的に「100点」が埋もれやすくなる。
大量の50点が並ぶ中でそれを見分けるための審美眼や評価の構造が追いつかなければ、やがて「質」が見えにくい社会が生まれる。
それは文化の深まりが鈍化する兆しでもあり、私たちが選び、味わい、育ててきた価値の多層性が、ノイズに埋もれていく未来の影でもある。

ただし、これは決して技術そのものを否定する話ではない。
問題は、どのような基準で、どのように評価し、何を良しとするかという、人間側の構え方にある。
情報の洪水のなかで必要なのは、制限でも排除でもなく、「見る目」と「選ぶ軸」を育むことなのだろう。

 

# 技術の目的──問い直しの入り口として

技術が日々進化し、できることが増えていくなかで、私たちは「どう使うか」ばかりに意識を向けがちだ。しかし本来、問うべきは「その技術は何のために存在するのか？」という目的そのものではないだろうか。

私たちは、データやアルゴリズムを通じて現実に影響を与える立場にある。だからこそ、その技術が人の選択を支援しているのか、行動を最適化しているのか、あるいは意図せず管理や誘導に近づいていないか──設計や活用の前提にある“意味”を見失わないことが重要だ。

私たちが関与している案件において、技術が主役ではなく、背景として人間の営みに寄り添うかたちで機能するにはどうあるべきか。その見極めは私たちのスタンスにかかっている。

最終的に私たち技術を扱う者が考えなければならないのは、その技術が「どうあるべきか」、そして「お客さまにとってどんな価値を届けられているのか」という問いである。
その問いに向き合い続けることこそが、技術を単なる手段ではなく、本当の意味での価値に変えていく力になるのだ。

 

 
　
 　
　
※一部パートでGPTの肉付け・校正が含まれます。
Colabのデスクトップ通知が来ないときの対処法（Win11・Chrome）

# 手順
**1. Colabの設定を確認する**
Colab画面右上の「ツール」>「設定」>「サイト」タブ

「実行が完了したときにデスクトップ通知を表示する」に✔を入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/7e784b43-7ec9-436e-9fae-10ef778d0376.png)

**2. Chromeの通知設定を確認する**
Chrome右上の「︙（設定）」>「プライバシーとセキュリティ」>「サイトの設定」>「通知」

「通知を送信するかどうかの確認をサイトに許可する」をONにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/59e22dbc-1b0f-4c85-ac49-221eb5cbe209.png)

必要に応じて、https://colab.research.google.com の通知を「許可」に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/f4a71333-1492-460b-b703-3300c6688a62.png)


## 応答不可モードの設定

通知には表示されているがリアルタイムに来ない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/7aaa3696-26fc-4762-bf43-013689c9dd53.png)

Win11ではゲームや作業で自動で応答不可モードとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/2a19834b-837a-42c6-8ffe-724eddff942c.png)

これらを通知を受け取りたいとき実行時オフとなるように変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3113003/c2fdccf7-6e39-4b1c-bb67-b2489aa424b8.png)

リアルタイムに右下に表示され受け取ることができた。
【Arch小ネタ】依存パッケージをすべて表示

# 結論
```
$ pactree -l （パッケージ名） | sort | uniq
```

# 例
```
$ pactree -l sh | sort | uniq
filesystem
gcc-libs
glibc
glibc>=2.27
iana-etc
libncursesw.so=6-64
libreadline.so=8-64
linux-api-headers>=4.10
ncurses
readline
sh
tzdata
```

# 解説
pactreeはpacman-contribパッケージをインストールすると使用できるようになるコマンドで、ツリー状に依存関係を表示することができる。
```
$ pactree sh
bash provides sh
├─readline
│ ├─glibc
│ │ ├─linux-api-headers>=4.10
│ │ ├─tzdata
│ │ └─filesystem
│ │   └─iana-etc
│ ├─ncurses
│ │ ├─glibc
│ │ └─gcc-libs
│ │   └─glibc>=2.27
│ └─ncurses provides libncursesw.so=6-64
├─readline provides libreadline.so=8-64
├─glibc
└─ncurses
```


`-l` オプションをつけることで、ツリー状の表示から、依存パッケージを列挙する形式の表示に変更できる。

```
$ pactree -l sh
sh
readline
glibc
linux-api-headers>=4.10
tzdata
filesystem
iana-etc
ncurses
glibc
gcc-libs
glibc>=2.27
libncursesw.so=6-64
libreadline.so=8-64
glibc
ncurses
```

この出力結果を、sortコマンドで並べ替え、uniqコマンドで重複した行を削除すれば、目的の依存パッケージのリストが得られる。

# おまけ
これとcommを組み合わせれば、依存関係の差異も表示できる。
試しに、shとbashの依存関係の差異を表示してみる。
```
$ comm <(pactree -l sh | sort | uniq) <(pactree -l bash | sort | uniq)
	bash
		filesystem
		gcc-libs
		glibc
		glibc>=2.27
		iana-etc
		libncursesw.so=6-64
		libreadline.so=8-64
		linux-api-headers>=4.10
		ncurses
		readline
sh
		tzdata
```
1列目がshのみ必要とするもの、2列目がbashのみ必要とするもの、3列目が共通で必要となるものである。
たとえば、bashのみ必要なもののみ表示したい場合は次のようにする：
```
$ comm -13 <(pactree -l sh | sort | uniq) <(pactree -l bash | sort | uniq)
bash
```
`-13`オプションで、1列目と3列目を非表示にした。
同様の方法で、左側のパッケージのみ必要とする依存関係や、共通して必要とする依存関係なども、それに限った出力ができる。
今AIで話題のMCPサーバーとは？？  

## はじめに
### AIに「手と目」を与えるプロトコル？

ChatGPTやClaude、Cursorのような AIツールが広まる昨今、以下のような疑問を抱いたことはありませんか？

> 「AIって、ネット上の情報にどうやってアクセスしているの？」
> 「PCのファイルを勝手に読めるの？」
> 「コードも書いてるけど、実行してるのはどこ？」

こうした **AIと「現実世界」のやりとりを可能にする仕組み** が、今回紹介する **MCP（Model Context Protocol）サーバー** です。


##  MCPサーバーとは？

簡単に言うと、

**AIが外部のツールやデータにアクセスするための「通訳＋接続ハブ」**

です。

本来ChatGPTやClaudeなどのチャット型AI は、入力された文章を解析し、文章を返す「テキストベースの存在」ですが、実用的な利用を考えると、次のような機能が求められます。

- Google検索をする
- ファイルを読み込む
- データベースから情報を取る
- メールや通知を送る

こうした外部アクセスを **「安全に」「標準的に」「柔軟に」** 実現するのが MCP の役割です。


## MCPサーバーの仕組み

以下の図は、MCPの構造を簡単に表したものです。

![mcp_figure.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843712/f5faf6f4-12bc-4559-bfcf-5b92c374c394.jpeg)


- **AI（クライアント）**：ChatGPT、Claude など
- **MCPサーバー**：外部API・ファイル・DBなどとの仲介役
- **データソース**：ファイルシステム、API、クラウドストレージなど

AIが「これを調べて」と指示すると、MCPサーバーがその処理を代行し、結果をAIに返します。


## 技術的な仕組み

MCP は次のステップで動作します。

### 1. クライアントからの指示（意図）の受信
たとえば、
-   「ファイルを読み込んで内容を要約して」
-   「このURLから最新の天気情報を取得して」
    
この指示は、AI 内部で **MCP 形式の JSON-RPC リクエスト** に変換され、サーバーに送信されます。

```json
{
    "jsonrpc": "2.0",
    "method": "exampleMethod",
    "params": { "key": "value" },
    "id": 1
}
```


### 2. MCPサーバーによるリクエスト処理
- ファイルを開く  
- APIにアクセスする  
- DBをクエリする  

などの処理を行い、結果をクライアント（AI）に返します。

### 3. AIがその結果をもとに回答を生成  
「ファイルを要約しました」「APIから取得したデータです」など、自然な文章でユーザーに結果が返ってきます。


## MCPのメリット

| 項目 | 内容 |
|------|------|
| 標準化 | どんなAIでも統一された手順で外部連携できる |
| 安全性 | 認証・許可の仕組みを組み込める |
| 拡張性 | 自作プラグインで機能を拡張可能 |


## 具体的な活用事例

| ツール | 活用例 |
|--------|--------|
| GitHub MCP | PR作成、Issue編集、コメント投稿など |
| Notion MCP | メモやドキュメントの読み書き |
| Web MCP | 最新情報の検索や要約 |
| Files MCP | ファイルの読み込み・保存・更新 |


## セキュリティは超重要！

MCPは便利な反面、「AIが外部にアクセスする＝場合によっては予期しない危険な操作もできてしまう」ため、以下の対策が必須です。

- アクセス権限の設定（どの機能を許可するか明確にする）
- 操作ログの記録
- サンドボックス実行（隔離された環境で動作させる）

**AIに対して、必要以上の高い権限を付与すると、予期しない処理を自動的に実行してしまうリスクがあるため、アクセス制御や権限管理には細心の注意が求められます。**


## Web開発者にとってのMCPの魅力

ウェブ開発をしているエンジニアにも以下のような活用が期待できます。

- ユーザーがアップロードしたファイルをAIが即時に解析する
- チャットUIを通じて業務を自動化（例：「請求書を要約して」）
- データベースやAPIとの中継としてAIが機能する

**「AI + MCP」は、Webアプリに「AIの手と足」を加えるイメージです。**


## まとめ

MCPサーバーは、AI の機能を拡張し、外部ツールやデータへのアクセスを実現するために必要不可欠なインフラです。

- AIに「操作力」を与える次世代プロトコル
- セキュアかつ標準的な外部接続を実現
- Web開発との親和性が高く、次の時代のスタンダードに？


## 参考
MCP公式ドキュメント
[https://modelcontextprotocol.io/introduction](https://modelcontextprotocol.io/introduction)


## **採用拡大中！**

アシストエンジニアリングでは一緒に働くフロントエンド、バックエンドのエンジニアを募集しています！  
少しでも興味ある方は、カジュアル面談からでもぜひお気軽にお話ししましょう！

お問い合わせはこちらから↓  
[https://official.assisteng.co.jp/contact/](https://official.assisteng.co.jp/contact/)
Oracle Cloud  メモ（レシピ）

アクティビティ・ディテクタ（Activity Detector）**は、Cloud Guard の中で、ユーザーやサービスがOCI内で実行した操作（アクティビティ）を監視するセキュリティ機能です。

この機能は、OCIで発生するログ（特に Auditログ）を分析して、セキュリティ上疑わしい行動やリスクのある操作を検出します。
活用例

利用ケース	具体例
セキュリティ監視	深夜に重要リソースへアクセス → 管理者へ即時通知
不正アクセスの検知	初めて使用するリージョンからログイン → アカウントをロック
内部統制	非管理者がIAM変更を試行 → 自動で無効化し記録
✅ まとめ：アクティビティ・ディテクタのポイント

項目	内容
役割	OCI上のすべての操作を監視し、異常を検出
データ元	Audit Logs（監査ログ）をもとに解析
主な検出	不審ログイン、ポリシー改ざん、大量アクセスなど
カスタマイズ性	ルール編集、重大度設定、ターゲット指定可能
自動対応	Responderと連携し、検出後に自動でアクション実行

💡 アクティビティ・ディテクタの用途例
内部統制（内部不正の監視）
SOC対応（Security Operation Center）
ゼロトラスト戦略の一環としての異常検出
重要な操作（IAM変更や監査ログの無効化）の即時検知と自動対応


Oracle Cloud Guard の「構成ディテクタ（Configuration Detector）」は、OCI（Oracle Cloud Infrastructure）上のリソース構成に対する設定ミスやセキュリティポリシー違反を自動で検出する重要な機能です。

構成ディテクタの活用例
自社のセキュリティルールに合った監視ポリシーを構成

セキュリティゾーンと連携して、危険な構成を事前にブロック

コンプライアンス対応（例：CISベンチマーク、NIST）

Responderと連携し、自動で「非公開化」や「NSG適用」などを実行

✅ まとめ：構成ディテクタとは？

項目	内容
機能	OCIのリソース構成の継続的監視とリスク検出
対象	Object Storage、Compute、Network、IAMなど
検出例	公開設定、暗号化不足、過剰権限、NSG未適用など
カスタマイズ	ルールの有効化／無効化、重大度設定、ユーザーレシピ作成
利点	セキュリティリスクの可視化、監査対応、自動修復との連携
🥚KubernetesのCloud Controller Manager（CCM）の"卵鶏問題"を解説🐔

*Kubernetes 1.31で外部クラウドプロバイダ移行が完了した今こそ知っておきたい、クラスタブートストラップの落とし穴と対処法*

## 背景 ― in‑tree 依存の完全排除と新たな4コンポーネント

Kubernetes 1.31 では歴史上最大のマイグレーションとして **in‑tree cloud provider のコードが完全に削除** され、代わりに Cloud Controller Manager（CCM）や CSI など **4 つのサブシステム** が誕生しました。この結果、既存インストーラ（kOps, Cluster API など）は **CCM を独立デプロイ** する追加ステップが必須となり、クラスタ初期化時の依存関係がより複雑になっています。

![](https://kubernetes.io/images/docs/components-of-kubernetes.svg)

## CCMとは何者か

CCM はかつて kube‑controller‑manager や kubelet 内にあったクラウド固有ロジックを肩代わりし、**Node 初期化や LoadBalancer Service 生成などを担当** する制御プレーンコンポーネントです。特に **Node Controller** が重要で、kubelet が登録した Node オブジェクトへ IP アドレスやリージョン等のメタデータを付与し、初期 taint を除去してノードを Ready にします。

## "卵鶏問題"とは

1. kubelet は `--cloud-provider=external` 付きで起動すると、Node に `node.cloudprovider.kubernetes.io/uninitialized` **(NoSchedule)** を自動付与
2. **CCM がスケジュールされて taint を外さない限り** ほかの Pod は配置不可
3. ところが CCM 自身が Deployment/DaemonSet として **Kubernetes のスケジューラに依存** すると、taint のせいで CCM も動けず **相互待ち** に陥る——これが "鶏🐔が先か卵🥚が先か" 問題です。

さらに CNI がクラウド IP を待つ場合は `node.kubernetes.io/not-ready` **(NoExecute)** も加わり、ノードが永遠に NotReady のまま停滞する例も報告されています。

## 具体的な発生パターン

| パターン | 典型的症状 | 原因となる taint |
|----------|------------|-----------------|
| **未初期化 taint 依存** | CCM Pod がそもそもスケジュールされず、すべてのノードが Unschedulable | `node.cloudprovider.kubernetes.io/uninitialized` |
| **NotReady 依存** | CNI が IP 不在で初期化できず、ノードが永久に NotReady | `node.kubernetes.io/not-ready` |

*どちらも CCM が動けないことで連鎖的に CNI や他システムが起動不能に陥ります*。

## ベストプラクティス ― "CCM をまず動かす"ための4か条

1. `hostNetwork: true` を設定
   クラウド API へ直にアクセスでき、CNI 依存を解消します。

2. **Deployment / DaemonSet ＋リーダーエレクション**
   高可用性を保ちつつ競合を防止しましょう。

3. **制御プレーンノードにピン留め**
   `nodeSelector` または PodAffinity でコントロールプレーン上にだけ配置し、 必要なら PodAntiAffinity でホスト分散を図ります。

4. **適切な Tolerations を付与**
   * `node.cloudprovider.kubernetes.io/uninitialized`
   * `node.kubernetes.io/not-ready`
   * `node-role.kubernetes.io/control-plane` / `master` 
   
   ……を **NoSchedule/NoExecute で許容** して、ブートストラップ段階でも必ず実行できるようにします。

### 参考マニフェスト（抜粋）

```yaml
spec:
  hostNetwork: true
  nodeSelector:
    node-role.kubernetes.io/control-plane: ""
  tolerations:
  - key: node.cloudprovider.kubernetes.io/uninitialized
    effect: NoSchedule
    operator: Exists
  - key: node.kubernetes.io/not-ready
    effect: NoExecute
    operator: Exists
  replicas: 2            # Leader election 有効を忘れずに
```

**Tip:** PodAutoscaler 連動でレプリカ数を増減しても性能は向上しません。 一度にアクティブなのはリーダー1台だけなので、冗長化目的の固定レプリカで十分です。

## ホステッド・コントロールプレーンの場合

CCM を **別クラスタ** に置く Hosted Control Plane パターンでは、ネットワーク経路や認証方式が異なるため、上記の self‑managed 向けガイダンスがそのまま通用しない点に注意してください。インフラ要件に合わせて接続トポロジと権限設計を再検討しましょう。

## まとめ

* **CCM は Node 初期化の鍵**。動き出せないとクラスタ全体が停止する
* **taint とネットワーク依存を断ち切る** 設計が"卵鶏問題"の根絶策
* Kubernetes 1.31 以降を導入するすべての運用者は、自身の **ブートストラップ手順と Manifest** を点検し、CCM が確実に稼働できる配置になっているか今すぐ確認しよう

これらを押さえておけば、今後のクラウドプロバイダ移行や制御プレーンモダナイズも安心して進められます🐔🥚

## 参考

この記事は、 本家ブログ、 https://kubernetes.io/blog/2025/02/14/cloud-controller-manager-chicken-egg-problem/?utm_source=chatgpt.com の紹介です。
初めてのローコード開発で、PHPの取得制限に詰んだ件

## 背景

スパイラルに中途入社して一年目です！！
とある社内案件で、スパイラルというローコードプラットフォームを使ってチーム開発に参加しました。

今までほとんどPHPを触ったことがなかったワイが、まさかの一部PHP担当に……！
ボロ雑巾のようになりながらも、チームメンバーに助けられつつ

今までPHPをろくに触ってなかったワイが、一部PHP開発となり、ボロボロ雑巾になっていく日々の中、チームメンバーに助けられながらデータ取得に詰みまくった日々の記録を書いていきます(￣^￣)ゞ

※ 社内案件とはいえ、コードは全部お見せできないので、サンプルコードで紹介していきます！
## こんな方に向けて書いてます

初めてPHPを触って、いろいろ詰んだ経験を元に
同じように「うわああ」ってなってる人のヒントになればと思って書いてます。

つまり！

:::note info
・スパイラルで開発される方
・PHPの書き方
・多量レコードの抽出に気になる方
:::


## 何をして、どうなったのか？

### やりたかったこと

:::note warn
トランザクションDBからレコードを抽出して、条件分岐させて、その結果をJSで表示したかった！
:::
しかし!!!!!!!

本番環境でテストしてみたら、気づいてしまった…

<b>アレ？データ一部しか抽出できないじゃないかよ!!!! (･･;)
あばばばばば (￣◇￣;)<b>



## さて、検証して、解決に向かおう

### なぜコードは正しいのに、データが取れない!?

サポートサイトのサンプルを参考に、こんな感じで書いてました。

```
$db = $SPIRAL->getDataBase("member");
$db->addSelectFields("email", "name");
$db->addLikeCondition("email", "@example.com");
$response_select = $db->doSelect();
print_r($response_select);
```

`print_r`の部分を`var_dump`に変えても特に問題なし。
JS側も問題なさそうなのに、なぜかデータが足りない……。

**参考リンク**

https://support.smp.ne.jp/programs/api-programs/select1/

### レコード数に注目

今回使ったDB、レコード数が**10万件以上**。

でも、スパイラルの仕様では、**1回のAPIで取れるのは最大1000件**までなんです！
（ここでようやく詰みの正体に気づく）

どうやって大量レコードを取得するか分からず、またもサンプルとにらめっこ…

https://support.smp.ne.jp/programs/api-programs/lines_per_page1/

そんなとき！
チームメンバーが救世主のごとく**スパイラルのPHPライブラリ** を教えてくれました。

![スクリーンショット 2025-03-05 14.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2959760/d6c7ad08-8635-412f-88a9-83e654a5c9d3.png)


まさにドラえもんが登場する勢。

### PHPライブラリって？

スパイラルが提供してるPHP用の便利な関数集です。

まだ全然理解は浅いけど、目的の動作に近い関数を見つけて使えば、かなり楽できる印象。

今回使ったのは `doSelectLoop` って関数。

その名の通り、1000件以上あっても、ループして全部取ってきてくれる神機能！

```
 <?php
     $SPIRAL->setApiTokenTitle($api_token_title);
     $db = $SPIRAL->getDataBase("db_title");
     $db->addEqualCondition("field_title", "value");
     $db->addSortField("prime_key", true);
     $result = $db->doSelectLoop();
 ?>
 ```
 
`doSelect`から`doSelectLoop`に変えて、ループ処理をちょっと工夫したら

無事、大量レコード取得に成功しました！


**参考リンク**

https://www.pi-pe.co.jp/help/phpdoc/spiral/SpiralDataBase.html#methoddoSelectLoop


## 今回学んだこと

### 前提を疑うこと！

実は2〜3時間ぐらい、`foreach` の処理を見直したり、JSばっか見てて…
「バックエンドは合ってるはず」と思い込んでたんです。

でも実際は、**PHP側の仕様が原因**だった。
フロントが見やすくても、**バックエンドの前提もちゃんと疑うべし！**

### 困ったらメンバーに頼る!

今回は、朝会で「ここの処理がうまくいかなくて…」と相談したら、PM＆メンバーから仮説とサンプルコードがいくつも出てきて、

ひとつずつ潰していったら解決できました！

**チーム開発、仲間って大事！ほんとにありがとう… (；ω；)***

### プラットフォームの仕様はちゃんと理解しよう！

**「1000件まで」** って仕様、知ってたはずなのに、応用のときに思い出せなかった…。
プラットフォームの基本仕様、大事です。

今後もっと活用していくためにも、しっかり理解していきたいと思います！


### ライブラリは、まず試してみる
ライブラリの関数、たくさんあって一見よくわからんけど、まずはサンプル通りに動かしてみるのが近道！

一発で何とかしようとしないで、ひとつずつ検証してくのが結局早かったです。

https://www.pi-pe.co.jp/help/phpdoc/

https://knowledge.spirers.jp/


## 最後に...

入社して、元々開発側に人じゃないですが、社内案件に携わられて、
メンバーに助けられながらひとつのウェブアプリを完成できたのがいい経験でした。

以前、誰かに教えてもらったが、
**詰む＝積む** 、詰んだ分、ちゃんと経験値として積まれてるなって感じた(；ω；)

そして、そんなスパイラルver.1にはトライアルできますので、
ご興味あればぜひこちらからご登録お願いします!  (はい、宣伝です!!)

https://www.pi-pe.co.jp/regist/is?SMPFORM=man-lanerf-2473a633d82734eb22aa64cad426ae23&utm_source=pup-qiita&utm_medium=contentlink&utm_campaign=/guolam/items/489a5af46b954c31a65f&f000099824=https://qiita.com/guolam/items/489a5af46b954c31a65f

ではまた〜！