OmniAICreator/Qiita-1.07M huggingface dataset:
AI-native Memory 2.0『Second Me』とは？

論文を要約した

https://arxiv.org/abs/2503.08102

## AI-native Memory 2.0『Second Me』とは？
『Second Me』とは、人間の個人的な記憶をAIが管理・活用する新しい仕組みです。従来、私たちはウェブサイトやアプリなどで何度も同じ情報を入力する必要がありましたが、『Second Me』を使えば、自分に関する情報をAIが記憶し、状況に応じて自動的に思い出し、利用してくれます。

## 背景：なぜ必要？
私たちは日常的に、多くのサイトやサービスに繰り返し同じ情報を入力しています。これは面倒で、疲れる作業です。現在も、ブラウザの自動入力機能などはありますが、単純な情報保存にとどまり、状況に応じた柔軟な対応はできませんでした。

『Second Me』は、この問題を解決するために、最新のAI技術である大規模言語モデル（LLM）を使って、より賢く、人間に近い記憶管理を実現します。

## 特徴：従来の技術との違い
『Second Me』はただのデータベースではありません。LLMを利用して、

情報を整理し、重要な内容を自動的に理解して保存

状況に応じて、適切な情報を取り出して利用

ユーザーが求めていることを理解し、必要な内容を自動的に入力

ということが可能です。つまり、AIが人間の記憶のように働き、自分自身の「分身」として機能する仕組みです。

## 具体的な使い方
『Second Me』は、主に以下の場面で活躍します。

### 記憶ベースの質問応答
自分自身に関する情報を、自動で整理して答えてくれます（例えば、過去の会話や好みを考慮した回答）。

### 文脈の補完

「初心者向けのAIトレーニング方法について教えて」などの質問に対して、その人が過去に調べたり学んだ内容を踏まえて、より役立つ回答を自動的に生成します。

### 文脈を踏まえたフィードバック

AIが別の専門家やサービスからの回答に対して、その人の好みや背景を理解した上で、適切なアドバイスや改善点を提案します。

## 技術的な仕組み
『Second Me』は3つのレイヤー（階層）を使って情報を整理しています。

1. **生データ層（L0）**：そのままの情報を保存。
2. **自然言語記憶層（L1）**：情報を要約して、人が理解しやすい言葉で整理。
3. **AIネイティブ記憶層（L2）**：AI自身が理解しやすいように、情報をさらに整理して保存。

さらに、このシステムは自動的に学習と評価を繰り返す仕組みがあり、ユーザーの記憶や好みに最適化されています。

## どれぐらい効果があるのか？
実際のテストでは、『Second Me』はユーザーのニーズに対して高い精度で対応できることが確認されました。特に、詳しい理由や根拠を添えた回答（Chain-of-Thought形式）を生成することで、ユーザーの満足度が高まりました。

## 将来的な可能性
この技術が普及すると、自分の分身としてAIが私たちの記憶を管理し、日常の細かな手間やストレスを軽減してくれます。また、複数のAI同士が連携して、さらに高度で効果的な作業をする可能性もあります。
Microservice識別プロセスにおけるsystem command 定義

#### **1. Microservice識別プロセスにおけるシステムコマンドの役割**  
- MSAでは、**各サービスが実行すべき主要な機能（タスク）を明確に定義することが重要！**
- そのために、**システムコマンドを定義してサービスの境界を設定**し、**ビジネスおよびエンジニアリングの特性を反映した設計を進めます**。  

#### **2. Microservice識別のためのシステムコマンドの例**  
- 特定の役割（顧客、従業員など）が実行する主要な操作（コマンド）を基にサービスを識別  
- **同じカテゴリのコマンドをグループ化すると、独立したサービスとして定義される可能性が高い**  

| **ドメイン** | **システムコマンド（Microservice候補の識別基準）** |
|-------------|--------------------------------------|
| **会員サービス** | `createMembership`（会員登録） |
| **決済サービス** | `rechargeYJMoney`（ポイントチャージ）、`payWithYJMoney`（ポイント決済） |
| **送金サービス** | `remittanceMoney`（送金） |
| **精算サービス** | `settlement`（精算処理） |
| **手数料管理サービス** | `modifyCommission`（手数料変更） |

#### **3. Microservice識別のための考慮事項**  
##### **(1) サービスの独立性と境界の設定**  
- `会員サービス`、`決済サービス`、`送金サービス` など、それぞれを独立したドメインとして分離  
- 各ドメインは**独立してデプロイ可能**であり、データとビジネスロジックを分離する必要がある  

##### **(2) ビジネスおよびエンジニアリングの特性を考慮**  
- **精算サービス:**  
  - 大量の決済データを安定的に処理する必要がある → **リトライ（再試行）、キューイング、精算サイクル/金額制限の考慮すべき**  
- **外部システムの呼び出しが多いサービス（例：決済、送金）**  
  - 呼び出し失敗の可能性が高い → **成功/失敗の記録およびリトライの実装が必要**  
  - 呼び出しごとに手数料が発生 → **最適化が必要（例：呼び出し回数の制限、バッチ処理など）**  

#### **4. 結論：Microservice識別のためのシステムコマンド定義の意義**  
・**各サービスの役割と境界を明確に設定するために、システムコマンドの定義が不可欠**  
・**ビジネスおよびエンジニアリング要件を反映し、MSAアーキテクチャを最適化**  
・**Microservice間の結合度を下げ、独立した運用が可能な設計を実現**  

**このようなシステムコマンドベースのサービス識別を通じて、効果的なMSAアーキテクチャを構築できる！**
応用情報技術者試験合格記録

2024年10月実施の応用情報技術者試験に無事合格したので、やったことを記録しておきます。

# 筆者の経歴
24卒未経験エンジニア。大学は非情報系(Pythonをちょっと書いたことがあるくらい)。就職にあたり基本情報技術者試験は合格済。

# 応用情報受験履歴
2024年04月　午前70点、午後56点で不合格
2024年10月　午前80点、午後72点で合格

![IMG_6746.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821962/d3f34865-e3bf-f06f-9bbb-5fae7a9d659a.jpeg)

# 受験理由
1年目で応用情報を取るといい感じと先輩社員から聞いたり𝕏で見たりしたため。

# 午前
『応用情報技術者 合格教本』を購入し、一通り読む。その後は、過去問道場を周回。

https://www.amazon.co.jp/令和07年-【春期】【秋期】-応用情報技術者-合格教本-みや子/dp/4297146207/ref=asc_df_4297146207?mcid=c0b89298d5933ce699526c8991e771b3&th=1&psc=1&tag=jpgo-22&linkCode=df0&hvadid=707442440790&hvpos=&hvnetw=g&hvrand=14686634467290300862&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9198914&hvtargid=pla-2566287674792&psc=1&gad_source=1

https://www.ap-siken.com/apkakomon.php

過去出題されたものからの流用も多いため、ここで7割を安定させられれば問題ないと思われる。ただし、午前で6割未満だと午後は採点すらされないので、なめすぎもダメ。

# 午後

### どれを解くか

まず選択問題を選ぶ必要がある。

あまり業界経験がないと、いわゆる「文系ハッピーセット」(2(経営戦略)・9(プロジェクトマネジメント)・10(サービスマネジメント)・11(システム監査))にしたくなる。が、これらの問題は回ごとの難易度の差が激しく、運要素が強まってしまう。とはいえ、技術ゴリゴリの問題のために勉強するのもつらい。という悩みを抱えがち。

そこで折衷案として、上記4つをメインにしつつ、他の数題を足を引っ張らない程度に勉強することを提案したい。特にこれといった経験がないのであれば、3(プログラミング)・4(システムアーキテクチャ)・7(組込みシステム開発)あたりが視野に入ると思う。

何を選べばいいのか系の記事で7(組込みシステム開発)を推す人は多いが、自分はさっぱりダメだった。実際に解いてみてどれができそうか、確認するとよい。

ピッタリ4題だけ対策すると難しかった問題が来たときに爆死してしまうので、5~6題は準備するべき。まあ実際に本番で解いたのは全部文系ハッピーセットなのだが。。

### 対策

午前同様、過去問を周回するほかない。

応用情報技術者試験は平成21年春から令和6年秋まで、過去31回実施されている。平成27年秋から現行と同じ形式になった。ここまではすべて解いておくくらいのノリでいいと考える。

というのも、過去の得点分布を見ると合格ラインの60点付近に集中していて、少しの差で合否が変わってしまうからだ。

この試験は半年に1回しか開催されない。しかも、合否がわかるのは受験から2ヶ月以上経過した後。そこからモチベーションを保って勉強するのは大変。十分な準備をして、ぜひ一発合格を目指してほしい。

個人的にはITECの緑の表紙の午後対策の本は買う必要がないと思う。過去問道場だけで十分(過去のログで問題別の正答率が見られるので非常に便利)。

# おわりに

高度情報の午前Iが2年間免除になるので、何か取りたいなぁと思い、唯一年2回実施の情報処理安全確保支援士に向けて勉強中です。なかなか難しく、苦労しています。

これから受験する人の参考になれば幸いです。
[Rails] データを削除する際の確認アラートが表示されない

# 原因と解決法
Railsで個人開発しているサービスで登録情報を削除する際のアラート機能を実装しようとしたところアラートが表示されなかったので解決方法を共有しようと思います。
最初は以下のように記述することでアラートが表示されると思っていましたが、実際には表示されませんでした。

```erb:アラートが表示されない
<%= button_to "削除", admin_shop_path(shop), method: :delete, data: { confirm: "本当に削除しますか？" }, class: "btn btn-outline-danger" %>
```

アラートが表示されない理由としては、Rails7ではTurbo（Hotwire）が導入されたことにより、「confirm」ではなく「turbo_confirm」を使用して記述しなくてはならなくなっていたことが原因で、以下のように記述することでアラートが表示されるようになりました。


```erb:アラートが表示される
<%= button_to "削除", admin_shop_path(shop), method: :delete, form: { data: { turbo_confirm: "本当に削除しますか？" } }, class: "btn btn-outline-danger" %>
```

# 変更点まとめ
上記2つのコードの変更点は以下になります。

```erb:変更点
# 変更前
data: { confirm: "本当に削除しますか？" }

# 変更後
form: { data: { turbo_confirm: "本当に削除しますか？" } }
```

今回は以上となります。
ご覧いただきありがとうございました。

## 参考記事
https://www.y-i.jp/entry/rails7-form-data-confirm
【Rails】assert_select


# はじめに
こんにちは。アメリカに住みながら独学でエンジニアを目指している taira です。
本日は、Railsのテストで使用される`assert_select`の使い方を詳しく解説します。

## assert_selectとは？

`assert_select`はRailsの統合テスト（Integration Test）やビューのテストにおいて、生成されたHTMLの要素や内容を検証するために使用されるメソッドです。特定のHTMLタグ、クラス、ID、テキストが期待通りに存在するかをテストできます。

## 基本的な使用方法

### HTMLタグの存在をテストする

以下は、ページに特定のタグが存在するか確認する例です。

```ruby
assert_select "h1"
```
これは、ページに`<h1>`タグが存在することを確認します。

### クラスやIDを指定してテストする

クラス名やIDを指定してテストする場合は次のように書きます。

```ruby
# 特定のクラスを持つdivタグが存在するかを確認
assert_select "div.alert"

# 特定のIDを持つ要素が存在するかを確認
assert_select "#main_content"
```

### 要素の数を指定してテストする

特定の要素が何個存在するかをテストできます。

```ruby
# liタグがちょうど3つ存在することを確認
assert_select "li", 3
```

## テキスト内容のテスト

タグの内容に特定のテキストが含まれているかを検証する場合は以下のように記述します。

```ruby
# h1タグに「Welcome」が含まれているか確認
assert_select "h1", "Welcome"

# 正規表現を使って部分一致を確認
assert_select "p", /Hello, .*!/
```

## ネストされた要素のテスト

ネストされた要素の中身を確認したい場合、ブロックを使って以下のように書けます。

```ruby
assert_select "div#navigation" do
  assert_select "ul" do
    assert_select "li", 5
  end
end
```

これは、`div#navigation`内に`ul`タグがあり、その中にちょうど5つの`li`タグが存在することを確認します。

## 応用例

実践的なテストの例です。

```ruby
test "should display product details" do
  get product_url(@product)
  assert_response :success
  assert_select "h1", @product.title
  assert_select "div.price", text: number_to_currency(@product.price)
  assert_select "a[href=?]", edit_product_path(@product), text: 'Edit'
end
```

このテストでは、商品ページが正常に表示されること、商品名や価格が適切に表示されていること、編集リンクが正しいパスを持つことを確認しています。
Arch Linux + Hyprlandで壁紙を変えるPythonアプリ

Arch Linux+Hyprland環境で壁紙を変えるアプリをPythonで作った。
無駄にアプリの背景設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4042331/e7326e0c-cfe2-49e7-81bf-19f283177372.png)

素材はこちらからお借りしています。
https://seiga.nicovideo.jp/seiga/im10929103

そもそものArch Linux + Hyprlandでの壁紙変更についてはnoteの方で書いてます。
https://note.com/sue93/n/n3cf2a31037df

```python:ChangeWallPaper.py
#!/usr/bin/python
"""
 機能：壁紙変更
"""
import tkinter as tk
import tkinter.filedialog
import subprocess

"""
 main関数
"""
class ChangeWallPaper:
	"""
	初期化
	"""
	def __init__(self, root):
		
		# ウィンドウ作成
		self.root = root
		self.root.title("WallPaperChanger")
		self.root.geometry("400x200")  # ウィンドウのサイズ
		self.root.configure(bg = "white")  # ウィンドウ背景色
		
		# 画像の取得
		# 好きな画像を設定する
		# 画像サイズが大きすぎると表示されないので注意
		# selfをつけやんとうまくいかんかった
		self.img = tk.PhotoImage(file="/home/shu/picture/himari/normal_s.png")

		# 画像ウィジェットの配置
		# この上にラベルを表示するので最初に表示しておく。レイヤー的な感じ。
		self.label1 = tk.Label(root, image=self.img)
		self.label1.configure(bg = "white")
		self.label1.place(x = 0, y = 0)

		# ラベル
		# オブジェクト名がボタンなのは、最初にボタンで作成した残骸
		self.playbutton1 = tk.Label(root, text = "画像選択")
		self.playbutton1.configure(bg = "white", foreground = "#000000", font=("",14))
		self.playbutton1.bind("<Button-1>", self.on_button_click1)
		self.playbutton1.place(x = 10, y = 10)

	"""
	 ラベルクリック時の動作
	"""
	def on_button_click1(self, e):
		# ファイル拡張子はpng,jpg限定
		# フォルダダイアログ表示時の初期フォルダは、ユーザのホームフォルダ
		file_name = tkinter.filedialog.askopenfilename(filetypes=[("Image file", ".png"),("Image file", ".jpg")], initialdir="~/")

		# キャンセルボタン対策
		# 画像が選択されたら変更する
		if file_name:
			subprocess.run(["hyprctl", "hyprpaper", "preload", file_name])
			subprocess.run(["hyprctl", "hyprpaper", "wallpaper", "," + file_name])

"""
 main関数呼び出し
"""
if __name__ == "__main__":
	root = tk.Tk()
	app = ChangeWallPaper(root)
	root.mainloop()

```
JavaScript（ES6〜）変数宣言と命名規則

## 変数宣言
### const
再代入不可、再宣言不可な変数
- 再代入は不具合の原因になり得るため、基本的に`const`で定義することを推奨されています

### let
再代入可能、再宣言不可な変数
- `const`で動かなかった場合に`let`を使います

### var
再代入可能、再宣言可能な変数
- 同じ変数の名前のものを再定義できてしまったり、変数の巻き上げという意図しない動作がある問題などの不具合の温床であるため、新規では使わないこと

## 命名規則
### ローワーキャメル
最初の単語の最初の文字を小文字にし、次の単語の最初の文字を大文字にして繋げる命名規則
- 変数名、関数名に使われることが多いです
```
lowerCamel
```

### アッパーキャメル
各単語の最初の文字を大文字にし、単語を連結して書く命名規則
- クラス名、ファイル名(モジュール名)に使われることが多いです
```
UpperCamel
```

### スネークケース
単語を小文字で区切り、アンダースコア（`_`）で繋げる命名規則
- 定数名に使われることが多いです
```
snake_case
```

## まとめ
JavaScriptの変数宣言では、基本的にconstを使用し、必要に応じてletを使い、varは避けるのが一般的です。命名規則として、変数や関数にはローワーキャメル、クラスやファイル名にはアッパーキャメル、定数名にはスネークケースがよく使われます
Cursor 再インストールで設定が初期化されない？ → 完全アンインストール方法

## はじめに

Cursor を再インストールしても設定が引き継がれてしまい、初期化されないことがあります。  
（最初の初期設定とかが始まりません　↓これ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369683/6e602d81-157b-4dce-b87a-00173b1d848a.png)


ここでは、**設定ファイルも含めて Cursor を完全にアンインストールする方法**をまとめています。

※内容に誤りがある可能性もあるため、**実行は自己責任でお願いします！**

## 背景

設定をいじりすぎて壊れてしまったため、クリーンな状態で再インストールしたくなりました。  
まだ使い始めたばかりだったので、とりあえず「再インストールでリセットすればいいや！」という **脳筋プレイ** に出ました…。

## 環境

- OS：Windows 11
- Cursor バージョン：0.47

## 1. Cursor のアンインストール

まず、**コントロールパネル**から通常通りアンインストールを行います。

## 2. 設定ファイルの削除

これだけでは設定ファイルが残ってしまい、再インストール時に設定が引き継がれてしまいます。  
以下のフォルダを手動で削除することで、完全にクリーンな状態にリセットできます。

```plaintext
C:\Users\<ユーザー名>\AppData\Local\Programs\cursor
C:\Users\<ユーザー名>\AppData\Roaming\Cursor
C:\Users\<ユーザー名>\.cursor
```

実際にこれらのフォルダを削除することで、再インストール時に設定が初期化され、1 からセットアップすることができました。

### メモ

-  `AppData` フォルダはデフォルトでは隠しフォルダになっているため、設定で隠しフォルダを表示するようにするか、ファイルパスを直接エクスプローラーのアドレスバーに貼り付けてもアクセスできます。  
-  削除が不安な方は、フォルダを削除する前にバックアップを取っておくと安心です。  
- ユーザー名部分はご自身の環境に合わせてください。
Rocky Linux 9にSnapをインストールする

# What's？

通常、Snap経由でインストールするソフトウェアをRocky Linux 9で使いたいなと思ったのですが、どうすればいいのかなと見てみたらSnap自体をRocky Linuxにインストールできそうだったのでちょっと試してみたというメモです。

# Snap

Snapというのは、Ubuntu Linuxの開発元であるCanonicalが開発しているパッケージ管理システムです。かつては「Snappy」と呼ばれていました。

https://snapcraft.io/

Ubuntu Linuxといえばaptがあるのでは？と思うのですが、Snapは自己完結型のパッケージで様々なディストリビューションで動作するのが特徴のようです。

というわけで、様々なLinuxディストリビューション向けにインストール手順が用意されていました。

https://snapcraft.io/docs/installing-snapd

今回はこちらを試してみます。

# 環境

今回の環境はこちら。

```shell
$ cat /etc/redhat-release
Rocky Linux release 9.5 (Blue Onyx)


$ uname -srvmpio
Linux 5.14.0-503.33.1.el9_5.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Mar 19 16:23:31 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux
```

# Rocky Linux 9にSnapをインストールしてみる

それでは、こちら手順に沿ってRocky Linux 9にSnapをインストールしてみます。

https://snapcraft.io/docs/installing-snap-on-rocky

SnapはEPELに含まれているので、まずはEPELを有効化。

```shell
$ sudo dnf install epel-release
```

…有効化されていることが多いと思いますが。

パッケージの情報を確認。パッケージ名は`snapd`です。

```shell
$ dnf info snapd
メタデータの期限切れの最終確認: 0:00:11 前の 2025年03月22日 11時15分04秒 に実施しました。
利用可能なパッケージ
名前         : snapd
バージョン   : 2.67
リリース     : 0.el9
Arch         : x86_64
サイズ       : 18 M
ソース       : snapd-2.67-0.el9.src.rpm
リポジトリー : epel
概要         : A transactional software package manager
URL          : https://github.com/snapcore/snapd
ライセンス   : GPL-3.0-only
説明         : Snappy is a modern, cross-distribution, transactional package manager
             : designed for working with self-contained, immutable packages.

```

インストール。

```shell
$ sudo dnf install snapd
```

snapがソケットを使って通信するための、systemdのユニットを有効化します。

```shell
$ sudo systemctl enable --now snapd.socket
```

最後にclassic snapをサポートする場合は、以下のシンボリックリンクを作成します。

```shell
$ sudo ln -s /var/lib/snapd/snap /snap
```

シェルに再ログインして確認します。hello-world snapをインストール。

```shell
$ sudo snap install hello-world
```

実行。

```shell
$ hello-world
Hello World!
```

snapでインストールできたことを確認。

```shell
$ snap list
Name         Version             Rev    Tracking       Publisher   Notes
core         16-2.61.4-20240607  17200  latest/stable  canonical✓  core
hello-world  6.4                 29     latest/stable  canonical✓  -
snapd        2.67.1              23771  latest/stable  canonical✓  snapd


$ which hello-world
/var/lib/snapd/snap/bin/hello-world
```

OKですね。
【解決】AirPodsの片耳だけ充電できない問題の原因と簡単な対処法

![スクリーンショット 2025-03-22 11.01.50.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591019/fc175201-5828-4843-b87c-d69e6c44cab6.jpeg)

こんにちは。プログラミングやデバッグ作業中の集中力維持に欠かせないAirPods。
エンジニアの作業効率を支える重要なデバイスですが、
突然トラブルが発生すると作業の中断を余儀なくされますよね。

先日、私のAirPods(Pro)で片方（左耳）だけが突然充電されなくなるという問題が発生しました。
ネットで調べたり試行錯誤した結果、とても簡単な方法で解決できたのでシェアします。
あと自分の備忘のためにも。
在宅勤務やオフィスでの作業中に同じ問題に直面した方のお役に立てれば幸いです。

:::note warn
紹介している方法はあくまで私個人でうまくいったものです。
試される際は自己責任でお願いいたします:bow_tone1:
:::

## 発生した問題

- AirPodsの片方（左耳）だけがケースに入れても充電されない
- ケースのバッテリー残量は十分あるのに、片方だけが充電されない状態が続く
- iPhoneで確認すると、片方だけ電池残量が表示されない
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591019/8766ba93-46c2-4e04-af8c-9e2c1e376950.jpeg">

## 原因

調査の結果、**充電ケース内部の端子部分の汚れ**が原因でした。

AirPodsを日常的に使用していると、
耳垢やホコリなどがケース内部の充電端子に徐々に蓄積します。
この汚れが接触不良を起こし、片方のAirPodsが正常に充電できなくなってしまいます。

## 解決方法：綿棒で端子をクリーニング

### 用意するもの
- 綿棒（できれば先の細いタイプ）

### 手順

1. AirPodsをケースから取り出す
2. ケースを逆さまにして、軽く叩いてホコリを落とす
3. ケース内部の充電端子部分（金属部分）を綿棒で優しく「くりくり」と掃除する
   - 力を入れすぎないように注意
   - 特に問題が発生している側を重点的に
5. AirPodsをケースに戻して充電されるか確認

![スクリーンショット 2025-03-22 11.11.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591019/075a10f5-91de-4910-b36b-d6a5f4e9ab1b.jpeg)

## 結果

この簡単なクリーニングで、充電できるようになりました！

## 予防策

- 定期的に充電ケースの端子部分を綿棒で軽く掃除する
- AirPodsを使用した後、耳の周りをきれいにしてからケースに戻す
- ケースを定期的に空にして、ホコリを払う

## まとめ

AirPodsの片耳が充電されないという一般的な問題は、多くの場合、端子の汚れが原因です。
綿棒で端子をクリーニングするという簡単な方法で解決できることが多いので、
修理に出す前にぜひお試しください。

みなさんのお役に立てば幸いです！

---

※注意: クリーニングは自己責任で行なってください。
強い力を加えると端子が破損する可能性があります。
PythonでFlaskを使って温度センサー表示

新しいプロジェクトディレクトリを作成し、必要なファイルを作成していきましょう。まず、temperature_serverというディレクトリを作成し、その中に必要なファイルを作成します。
以下のファイルを作成します：
app.py - メインのFlaskアプリケーション
requirements.txt - 必要なパッケージの依存関係
README.md - プロジェクトの説明
まず、app.pyを作成します：
~~~Python:app.py

from flask import Flask, render_template
import random  # 実際のセンサーがない場合のダミーデータ用

app = Flask(__name__)

def get_temperature():
    # ここに実際のセンサーからの読み取りコードを実装
    # この例ではダミーデータを返します
    return round(random.uniform(20, 30), 1)

@app.route('/')
def index():
    temperature = get_temperature()
    return render_template('index.html', temperature=temperature)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

~~~


次に、テンプレートディレクトリ(templates)とindex.htmlを作成します：


~~~html:index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>温度センサーモニター</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
            background-color: #f0f0f0;
        }
        .container {
            text-align: center;
            padding: 2rem;
            background-color: white;
            border-radius: 10px;
            box-shadow: 0 0 10px rgba(0,0,0,0.1);
        }
        .temperature {
            font-size: 3rem;
            color: #333;
        }
        .unit {
            font-size: 1.5rem;
            color: #666;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>現在の温度</h1>
        <div class="temperature">{{ temperature }}<span class="unit">°C</span></div>
    </div>
</body>
</html>

~~~

最後に、requirements.txtを作成します：


~~~text:requirements.txt
Flask==3.0.2
~~~

これで基本的なWebサーバーの準備が整いました。以下の手順で実行できます：

１．まず、必要なパッケージをインストールします：

pip install -r requirements.txt


２．サーバーを起動します：

python app.py


３．ブラウザで http://localhost:5000 にアクセスすると、温度が表示されます。

![temp28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087280/026c8fd5-903f-45f1-a275-3badc0dde20e.jpeg)
wslでelixir その171

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
練習問題やってみた。

# 練習問題
Livebookの、kino.jsで、D3.jsでSVGを動作させよ。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7b07f277-dedc-4a4f-a650-a5b71480a502.png)

# 

```
defmodule KinoSVG.D3js do
	use Kino.JS
	def new(html) do
		Kino.JS.new(__MODULE__, html)
	end
	asset "main.js" do
		"""
		import "https://d3js.org/d3.v5.js"
		export function init(ctx, html) {
			ctx.root.innerHTML = '<svg id="svg1" style="margin: 0 auto; display: block;"></svg>';
			let svg = d3.select('#svg1')
				.attr('width', 400)
				.attr('height', 400)
				.style('background-color', 'black');
			svg.append('line')
				.style("stroke", "lightgreen")
				.style("stroke-width", 10)
				.attr("x1", 0)
				.attr("y1", 0)
				.attr("x2", 200)
				.attr("y2", 200); 
      svg.append('line')
				.style("stroke", "red")
				.style("stroke-width", 10)
				.attr("x1", 200)
				.attr("y1", 400)
				.attr("x2", 200)
				.attr("y2", 200); 
		}
		"""
	end
end

KinoSVG.D3js.new(0)

```

以上。
竹内関数（たらい回し関数）の停止性証明

### 竹内関数の停止性を示します。
AI が得意な方は、AIに証明させてみるのもおもしろいかも知れません。
タイポや論理ミスがあるかも知れません。お気づきの点や疑問点があればコメントお待ちしています。
## 竹内関数
f(x,y,z)= y: x≦yのとき
= f(f(x-1,y,z),f(y-1,z,x),f(z-1,x,y)):x＞yのとき
    x,y,z は整数
## 竹内関数と等価な関数
g(x,y,z)= y: x≦yのとき
        = z: x＞yかつy≦zのとき
        = x: x＞yかつy＞zのとき
### 任意の整数x,y,zについて　f(x,y,z) は停止し,f(x,y,z)＝g(x,y,z)である。
　少し書き換えると、任意の実数x,y,zで成り立つことが示せます。次回はそれを載せます。
## 証明
### d(x,y,z)=x-y+|y-z| とおいて、d(x,y,z)に関する数学的帰納法で証明する。
### （Base Step) 
　d(x,y,z)≦0のとき,x≦y
　よってf,gの定義より　f(x,y,z)=y=g(x,y,z)
### （Inductive Step)
（仮定A)ある0以上の整数kについて　d(x,y,z)≦kならばf(x,y,z)=y=g(x,y,z)と仮定する。

　d(x,y,z)=k+1なる任意のx,y,zをとる。　
　x≦yのとき　定義より　f(x,y,z)=y=g(x,y,z)　
　x＞yのとき
　 定義より　f(x,y,z)=f(f(x-1,y,z),f(y-1,z,x),f(z-1,x,y))　 
　    右辺の各項を順に評価する。
　(1)d(x-1,y,z)=k,よって(仮定A)よりf(x-1,y,z)=g(x-1,y,z)
 
　(2)-a y-1≦zのとき f(y-1,z,x)=z=g(y-1,z,x)
　(2)-b y-1＞zのとき
　 d(x,y,z)=x-z=k+1である。
   　また、このとき、任意の自然数nについて　f(z+n,z,x)=x…(ア）を示す。
　(証明）nに関する数学的帰納法
　(Base Step) n=1のとき
　f(z+1,z,x)=f(f(z,z,x),f(z-1,x,z+1),f(x-1,z+1,z))
　・f(z,z,x)=z
　・z-1≦xなのでf(z-1,x,z+1)=x
　・d(x-1,z+1,z)=x-z-1=kなので(仮定A)よりf(x-1,z+1,z)=g(x-1,z+1,z)
　∴f(z+1,z,x)=f(z,x,g(x-1,z+1,z))=x
 
　(Inductive Step) （仮定B)f(z+n,z,x)=xと仮定する。
　  f(z+n+1,z,x)=f(f(z+n,z,x),f(z-1,x,z+n+1),f(x-1,z+n+1,z))
　 ・(仮定B)より,f(z+n,z,x)=x
　  ・z-1≦xなので、f(z-1,x,z+n+1)=x
　  ・d(x-1,z+n+1,z)=x-z-1=kなので(仮定A)よりf(x-1,z+n+1,z)=g(x-1,z+n+1,z)
　∴ f(z+n+1,z,x)=f(x,x,g(x-1,z+n+1,z))=x
　数学的帰納法により、任意の自然数nについて　f(z+n,z,x)=x //
　y-1=z+n(nは自然数）とおけるので
　   f(y-1,z,x)=f(z+n,z,x)
　   (ア）より=x=g(y-1,z,x)
    
　(3)d(z-1,x,y)=z-1-x+|x-y|=z-1-x+x-y (∵x＞y)
　             =z-y-1=|z-y|-1≦k
　 よって(仮定A)より f(z-1,x,y)=g(z-1,x,y)　 
  
(1)(2)(3)より　
　f(x,y,z)=f(g(x-1,y,z),g(y-1,z,x),g(z-1,x,y))
 
　(a)y≦zのとき
　 g(x-1,y,z)=y or z (≦z)
　 g(y-1,z,x)=z      
　 ∴f(x,y,z)=f( y or z,z,g(z-1,x,y))=z=g(x,y,z)
  
　(b)y=z+1のとき
　g(x-1,y,z)=x-1
　g(y-1,z,x)=z
　g(z-1,x,y)=x
　      
　∴f(x,y,z)=f(x-1,z,x)
　   x-1≧y＞zであるからx-1=z+n(nは自然数)とおけて
　=f(z+n,z,x)
　  (ア）より=x=g(x,y,z)
   
　(c)y＞z+1のとき
　g(x-1,y,z)=x-1
　g(y-1,z,x)=x　 　    
　 ∴f(x,y,z)=f(x-1,x,g(z-1,x,y))=x=g(x,y,z)　  
　 (a)(b)(c)いずれの場合も,f(x,y,z)=g(x,y,z)がいえた。
　  
　以上から、数学的帰納法によりd(x,y,z)が任意の整数のときについて
　f(x,y,z)=g(x,y,z)である。
### 　(注）途中f(x,y,z)=g(x,y,z)などとした場合は、fの停止性も主張している。
## 関連記事
[日本語プログラミング言語Mindの小技 「リカーシブコール」たらい回し関数](https://qiita.com/ITvision/items/c0bf3789a59df83d2d70)

[あまり回さない「たらい回し関数」](https://qiita.com/ITvision/items/f51dbd9828fa884db93a)

[日本語プログラミング言語Mindで「たらい回し関数（竹内関数）」と等価な関数](
https://qiita.com/ITvision/items/2112139d3e303d1308e3)
シンプルな例で学ぶ正規表現の「否定先読み」「肯定先読み」「否定後読み」「肯定後読み」

@shotets 氏による[記事](https://qiita.com/shotets/items/98f3828b6e5f08d42498)を図的に整理して直感的に正規表現の先読み・後読みを把握する

# 実例を眺めながら覚える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/748b054c-61b6-461e-a468-4ba04e29a607.png)

- 先読み/後読みを行う部分、すなわち`(?`と`)`で囲まれた部分は、考慮されるが、選択されない
- `!` がつくと否定 (よくある)
-  `<` がつくと文字列の左側
    -  矢印のように覚えよう

# 名前と動作を対応付ける
先読みと後読みの「先」と「後」の対応がゴチャゴチャになるので、図的に整理しておきたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2676125/e4051edf-3dac-476f-b55d-c090d0a1666d.png)

どっちが先でどっちが後かをはっきりさせるために、歩く人をつけておいた。
ollama で hugginfaceで公開されているggufの実行

# ollamaでhugginfaceで公開されているggufの実行

背景: lmstudioがguiを起動した後じゃないとlmsがfailするので、、、またollamaに戻ってきた・・・

```ollama run hf.co/username/model-name```でよいらしい

のように

```ollama run hf.co/unsloth/gemma-3-4b-it-GGUF```

## tips-1 : alias

```
ollama cp hf.co/unsloth/gemma-3-4b-it-GGUF default
```

みたいにすれば、aliasを作れる

## tips-2 : set parameter

```
ollama run default
/set parameter
/set parameter num_ctx 32768
/save default
```

のようにパラメーターを変更し、保存できる。

## tips-3 : allow from external IPs

See https://github.com/ollama/ollama/blob/main/envconfig/config.go#L239

```/etc/systemd/system/ollama.service
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_ORIGINS=192.168.*,172.*"
```

```
sudo systemctl daemon-reload
sudo systemctl restart ollama
sudo ufw allow 11434
```
ufw忘れずに


# なお初回installは以下

https://ollama.com/download/linux

```
curl -fsSL https://ollama.com/install.sh | sh
```

```sudo snap install ollama``` で入れたollamaは古いので、上がよい。

```sudo snap remove ollama```で削除を...
【OCI】リソースマネージャでロールバックを実行【Terraform】

## 適当なリソースを作成

1. 適用ジョブを実行し、リソースを作成
今回はコンピュートインスタンスを一つ作成しました。

2. TFファイルを更新し、再度適用ジョブでリソースを追加
ロードバランサを追加しました。

## ロールバックの計画ジョブを実行
上記の2でロードバランサ作成はうまくいきましたが、失敗した場合や成功したけどやっぱり元に戻したい場合などは、まずはロールバックの計画ジョブを実行します。今回は1の状態に戻したいので、1の適用ジョブからロールバックを選択します。

![スクリーンショット 2025-03-20 16.07.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136326/904b4187-1aa5-49c4-926c-a7507e240293.png)

![スクリーンショット 2025-03-20 16.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136326/c2bb5f01-671e-4629-8a43-a604f1f141cc.png)

計画ジョブのログを確認すると、2で作成したロードバランサが破棄される予定になっていますので、1の状態に戻ることがわかります。

## ロールバックの適用ジョブを実行

![スクリーンショット 2025-03-20 16.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136326/8b29dc50-9fe5-4902-b6e4-102984971d25.png)

ログを確認するとロードバランサが破棄されて、1の状態に戻りました。

## おわりに

この方法でリソースマネージャでも簡単にロールバックすることができますね。
JavaScriptで「数値リテラルの記述方法」の動作を確認してみた。

# 概要

JavaScriptで「数値リテラルの記述方法」の動作を確認してみた。
以下のページを参考にしました。

https://www.javadrive.jp/javascript/number/index1.html

# 実装

以下の通り実行しました。

![Screenshot from 2025-03-22 10-49-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/0128cc87-70e1-4ad6-95b1-06e983d362ee.png)

# まとめ

何かの役に立てばと。
文章から動画生成

# やりかた

LTX Videoというやつを使う。

https://github.com/Lightricks/LTX-Video

#### インストール

```shell
pip install -U git+https://github.com/huggingface/diffusers
pip install acceralate
pip install transformers[sentencepiece]
pip install sentencepiece
```

#### 実行

```python
import torch
from diffusers import LTXPipeline
from diffusers.utils import export_to_video

pipe = LTXPipeline.from_pretrained("Lightricks/LTX-Video", torch_dtype=torch.bfloat16)
pipe.to("cuda")

prompt = "A woman with long brown hair and light skin smiles at another woman with long blonde hair. The woman with brown hair wears a black jacket and has a small, barely noticeable mole on her right cheek. The camera angle is a close-up, focused on the woman with brown hair's face. The lighting is warm and natural, likely from the setting sun, casting a soft glow on the scene. The scene appears to be real-life footage"
negative_prompt = "worst quality, inconsistent motion, blurry, jittery, distorted"

video = pipe(
    prompt=prompt,
    negative_prompt=negative_prompt,
    width=704,
    height=480,
    num_frames=161,
    num_inference_steps=50,
).frames[0]
export_to_video(video, "output.mp4", fps=24)
```


🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
atCoder beginner contest まとめ

自分が苦手な処理をする問題まとめです。

# 再帰関数
### 340 - C
再帰 + メモ化。解説を見たのちはあまり難しくない

https://atcoder.jp/contests/abc340/tasks/abc340_c

### 367 - C
配列 + 再帰 だとなぜか想像しにくくなる。練習したい。

https://atcoder.jp/contests/abc367/tasks/abc367_c


# bit演算

### 356 - C
問題文の理解が少し難しい。「矛盾しない」というところがポイント。

https://atcoder.jp/contests/abc356/tasks/abc356_c

### 358 - C
総当たりだが、どのようにループを回すかが鍵

https://atcoder.jp/contests/abc358/tasks/abc358_c

### 374 - C
割と直感的に全探索となる。
条件は 2 ≤ N ≤ 20 だが、対称性があるため2^20とはならず、最大でも2^10でOK

https://atcoder.jp/contests/abc374/tasks/abc374_c

## 数学的思考
### 362 - C
色々なパターンを考えるのは厳しいし、なんとなくこうじゃないよな感もわかってくる。
尺取り方ではないが、少し近い気がする

https://atcoder.jp/contests/abc362/tasks/abc362_c

### 400 - C
純粋な全探索は無理、a,bを絞っても10^9で難しい。重複もある。
じゃあどうするか？が出てこなかった。

https://atcoder.jp/contests/abc400/tasks/abc400_c

## BFS
### 383 - C
BFSの練習問題です。と解説にある問題。
Cの中における正当率はだいぶ低いが、解説を見ると実際のBFSがどのような形かわかり、割と難しくなかったりしそう

https://atcoder.jp/contests/abc383/tasks/abc383_c

### 405 - D
BFSの典型問題。
全てのマスを埋める必要はあるが、383 - C をやった後であれば怖くなさそう。
多分D問題にしては難易度低め。

https://atcoder.jp/contests/abc405/tasks/abc405_d

## 区間問題
### 408 - C
l, rが与えられる系の問題。
解説読むと簡単だが、自分で発見するのは難しい気がする

https://atcoder.jp/contests/abc408/tasks/abc408_c
github.comにusername, password聞かれ、authentification failed

# 現象

```
git push origin main
Username for 'https://github.com': xxxx@gmail.com
Password for 'https://xxx%40gmail.com@github.com': 
remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls for information on currently recommended modes of authentication.
fatal: Authentication failed for 'https://github.com/xxxxx/xxxx.git/'
```

```
ssh -T git@github.com
The authenticity of host 'github.com (20.27.177.113)' can't be established.
ED25519 key fingerprint is SHA256:+Dxxxxxxxxx.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
```

id_rsa, id_rsa_pubも登録しているが、上のようになっていて、別のマシンでは、httpsで普通にアクセスできているのに、、、という場合は、そのアクセスできているマシンから

# 対策

```
scp .gitconfig ubuntu:
scp .gitcookie ubuntu:
scp .netrc ubuntu:
```
してみる。

.netrc忘れていた。
sshで入れないのは不明だが、とりあえず、httpsでアクセスできていればok
Google Project Management Certificate & CompTIA Project+ dual credential を取得した

前回、遊戯王の融合モンスターのような資格、dual credentialを取得した事を書いた。

- Google Advanced Data Analytics Certificate & CompTIA Data+ dual credential を取得した #資格 - Qiita https://qiita.com/tatsu_sekine/items/06c0cfc6b5a54428135e

他にどのような融合資格を取得できるのかが気になったので、CredlyのCourseraの発行バッジ欄を見てみた。

https://www.credly.com/organizations/coursera/badges

するとGoogle Advanced Data Analytics Certificate & CompTIA Data+ dual credentialと並んでGoogle Project Management Certificate & CompTIA Project+ dual credentialがある事に気づく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/b0e4a27a-aa31-494f-92b9-c30d37c72cf6.png)

文面を確認すると「Google プロジェクトマネジメント プロフェッショナル認定証を取得し、CompTIA Project+ の試験に合格」とある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/65069522-a302-4490-9c27-eaecf4e99eca.png)

奇しくも昔に私はGoogle プロジェクトマネジメント プロフェッショナル認定証を取得し、CompTIA Project+ 試験に合格していた。

- CompTIA Project+を取得した #資格 - Qiita https://qiita.com/tatsu_sekine/items/b8a374096af7ea651cf7

- CourseraでGoogle プロジェクト管理 プロフェッショナル認定証を取得した #資格 - Qiita https://qiita.com/tatsu_sekine/items/d2ed2c12eaa3ff8b2844

しかし、私は未だに受け取っていない。黙っていたら来るのか、それとも何か申請が必要なのか、と思って問い合わせフォームより問い合わせることにした。

https://www.coursera.support/s/learner-help-center-contact-us?language=en_US

問い合わせた英語の文面はこちら。

ーーー　ココカラ　ーーー
To whom it may concern:

I'm already certified as Google Project Management Certificate (Dec 1, 2021) and CompTIA Project+ (Jan 4, 2019).
see: https://www.credly.com/users/tatsu-sekine

From this page (Google Project Management Certificate & CompTIA Project+ dual credential - Credly https://www.credly.com/org/coursera/badge/google-project-management-certificate-comptia-proje ), it state as:

"Those who earn the Google Project Management Certificate & CompTIA Project+ dual credential completed the Google Project Management Certificate and passed the CompTIA Project+ exam."

My question is, how to request Google Project Management Certificate & CompTIA Project+ dual credential?

Do I need to submit any supporting documents to earn the badge? Or the Credly will add the badge automatically in my badges collection?

best regard.
ーーー　ココマデ　ーーー

すると、「バッジ発行に問題があったので手動で発行したよ！」と連絡が来た。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/44bb4f6e-5ae7-4be6-a5fa-04d4e257172a.png)

それと同時にCredlyからバッジが届いた。
疑問に思ったら何事も問い合わせてみるもんですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2953203/f3cf69a0-1f92-4fc6-a087-aa4c1323bb4e.png)

めでたしめでたし。
（覚書）カスタム投稿タイプで、パーマリンク欄を非表示にする

カスタム投稿の投稿ページにて、タイトル下のパーマリンクがいらないという要望があり、調べた内容の覚書です。

```php3

<?php
/**
 * カスタム投稿ページからパーマリンク欄を非表示にする
 */
function remove_permalink_meta_box() {
    // カスタム投稿タイプの名前を指定（例：'your_custom_post_type'を実際のカスタム投稿タイプ名に変更してください）
    remove_meta_box('slugdiv', 'your_custom_post_type', 'normal');
}
add_action('admin_menu', 'remove_permalink_meta_box');


/**
 * カスタム投稿タイプの登録時にpermalinkを非表示にする
 * 詳細画面も表示しないように設定
 */
function register_custom_post_type() {
    $args = array(
        'public'             => true,
        'publicly_queryable' => false, // 詳細ページを無効化
        'show_ui'            => true,
        'show_in_menu'       => true,
        'query_var'          => false, // クエリ変数を無効化
        'rewrite'            => false, // リライトルールを無効化
        'capability_type'    => 'post',
        'has_archive'        => false, // アーカイブページを無効化
        'hierarchical'       => false,
        'menu_position'      => 5,
        'supports'           => array('title', 'editor', 'thumbnail') // パーマリンクのサポートを外す
        // 'supports' に 'page-attributes' を含めないことで、スラッグ（パーマリンク）の入力欄が表示されなくなります
    );
    
    // カスタム投稿タイプを登録
    register_post_type('your_custom_post_type', $args);
}
add_action('init', 'register_custom_post_type');


/**
 * すでに登録済みのカスタム投稿タイプの場合は、以下のコードでサポート項目を変更できます
 */
function modify_post_type_supports() {
    // パーマリンクのサポートを削除
    remove_post_type_support('your_custom_post_type', 'page-attributes');
}
add_action('init', 'modify_post_type_supports', 11);

/**
 * 編集画面でパーマリンク編集部分を非表示にするCSS
 */
function hide_permalink_css() {
    global $post_type;
    
    // 特定のカスタム投稿タイプの場合のみ適用
    if ($post_type == 'your_custom_post_type') {
        echo '<style type="text/css">
            #edit-slug-box,
            #titlediv .inside {
                display: none !important;
            }
        </style>';
    }
}
add_action('admin_head-post.php', 'hide_permalink_css');
add_action('admin_head-post-new.php', 'hide_permalink_css');


/**
 * 一覧画面から「表示」ボタンを非表示にする
 */
function remove_view_button($actions, $post) {
    // 特定のカスタム投稿タイプの場合のみ適用
    if ($post->post_type === 'your_custom_post_type') {
        // 「表示」リンクを削除
        unset($actions['view']);
    }
    return $actions;
}
add_filter('post_row_actions', 'remove_view_button', 10, 2);
?>
```
Docker入門

## Dockerとは
コンテナ型の仮想化技術を提供するプラットフォーム

## コンテナ型仮想化とは
ホストOSのカーネルを共有しつつ、各アプリケーションをコンテナとして独立した環境で実行する仮想化技術

### ハイパーバイザー型仮想化との違い
コンテナ型仮想化は、ホストOSのカーネルを共有してコンテナを実行するため、軽量で起動が速く、リソース消費が少ないです。
一方、ハイパーバイザー型仮想化は、各仮想マシン（VM）が独立したOSを持つため、異なるOSを並行して動かせるが、リソース消費が大きく起動が遅いです。

### メリット
- 軽量で高速
- 環境の再現性が高い
- スケーラブルで柔軟なデプロイ
- 開発・運用の効率化（CI/CDとの相性◎）

### デメリット
- 異なるOSを同一基盤上で動かせない

## Docker Engineとは
Dockerのコンテナ管理を行うソフトウェアの総称

## Dockerの主要要素
### Dockerデーモン
dockerd(Dockerのバックグラウンドプロセス)をリッスンし、イメージ、コンテナ、ボリュームなどのDockerオブジェクトを管理します

### Dockerクライアント
ユーザーがDockerを操作するためのインターフェースで、通常 コマンドライン（CLI）から利用します

### Dockerレジストリ
Dockerイメージを格納ためのリポジトリサービス
#### Dockerイメージを保存しているDockerオブジェクトがあるのにDockerレジストリがある理由
Dockerオブジェクトの保存場所がローカルマシンなのに対して、Dockerレジストリの保存場所はリモートサーバーだからです。よって、Dockerオブジェクトはローカル開発、テスト用には向いていますが、Dockerレジストリは本番環境、チーム開発、CI/CDに向いています

### Dockerオブジェクト
Dockerが管理するリソースの総称で、主に以下が含まれます
#### Dockerイメージ
アプリケーションと環境をひとまとめにしたテンプレート

#### Dockerコンテナ
イメージを実行したもので、アプリが動作する単位

#### Dockerfile
Dockerイメージを作成するための設計図

#### Dockerボリューム
データを永続化するためのストレージ
- bindマウント
  - ホストのフォルダをコンテナに直接マウント（リアルタイム同期）
- volume
  - Docker管理のストレージ（複数コンテナ間で共有可能・高速）
- tmpfsマウント
  - メモリ上に保存（コンテナ停止時にデータ消失・高速・セキュア）

## Dockerのネットワーク
コンテナ間の通信を管理する仕組み
### none
外部と接続しません

### host(本番環境向け)
ホストのIPアドレスをそのまま使用します

### Bridge(デフォルト、開発環境向け)
同じbridgeネットワーク内のみでコンテナ同士は通信可能で、外部との通信はNATを経由します

## まとめ
Dockerは、コンテナ型の仮想化技術を提供するプラットフォームで、軽量かつ高速な環境構築を可能にします。Dockerは、イメージ・コンテナ・ボリューム・ネットワークなどのオブジェクトを管理し、開発や運用の効率化に貢献します。
Linux Mint に MATLAB R2024b 環境構築

### ダウンロード & インストール

R2024b をダウンロードする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369713/b56a6658-b0f3-4454-ad08-87dffd206ee3.png)

```
/home/pojiro/Downloads/matlab_R2024b_Linux.zip 
```

展開して install スクリプトを実行する

```bash
/home/pojiro/Downloads/matlab_R2024b_Linux/install
```

インストール先は好みで変える

```
/home/pojiro/Matlab/R2024b
```

### デスクトップにショートカット作成

```bash
vim /home/pojiro/Desktop/MATLAB\ R2024b.desktop 
```

```
[Desktop Entry]
Name=MATLAB R2024b
Exec=/home/pojiro/Matlab/R2024b/bin/matlab -desktop
Comment=
Terminal=false
PrefersNonDefaultGPU=true
Icon=/home/pojiro/Matlab/R2024b/bin/glnxa64/cef_resources/matlab_icon.png
Type=Application
```

### 起動時エラーとその解消

起動するとコマンドウィンドウに以下のログがでる

```
com.jogamp.opengl.GLException: X11GLXDrawableFactory - Could not initialize shared resources for X11GraphicsDevice
```

`New Desktop for MATLAB (Beta)` のインストールで解消される。（ MATLAB を再起動する）

ref. https://jp.mathworks.com/matlabcentral/answers/2168203-matlab-2024b-on-linux-with-intel-meteor-lake-and-iris-graphics-jogamp-opengl-x11-glx-x11glxdrawable#answer_1553208

### デフォルトブラウザの変更

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369713/b8925eea-56e8-4d94-8b15-41bb62cf8ce7.png)

### おわり

Linux で使えるようになってたなんて知らなかったよ
【試験対策】ゼロデイ攻撃とは？手口・被害・対策を徹底解説！

✅ はじめに
ゼロデイ攻撃（Zero-Day Attack） は、修正プログラム（パッチ）の公開前 にソフトウェアやOSの脆弱性を狙う攻撃です。
システムの防御が追いつかない 「無防備な期間（ゼロデイ）」 に行われるため、被害を受ける可能性が高い のが特徴です。

応用情報技術者試験でも、ゼロデイ攻撃の仕組みや対策が問われることがある ため、しっかり理解しておきましょう！

本記事では、
✅ ゼロデイ攻撃とは？
✅ どのような手口で攻撃されるのか？
✅ 攻撃による被害の実例
✅ 具体的な対策方法
✅ 試験での出題ポイント
を解説します。

⸻
📌 ゼロデイ攻撃とは？
🔹 攻撃の概要
ゼロデイ攻撃（Zero-Day Attack） とは、ソフトウェアの脆弱性が発見され、修正プログラム（パッチ）が提供される前に悪用する攻撃 です。

「ゼロデイ」とは？
	•	脆弱性が発見されてから修正されるまでの期間（0日＝ゼロデイ） に攻撃が行われることが由来。
	•	攻撃が発生しても対策パッチがないため、企業や個人が無防備な状態で攻撃を受ける。

🔹 ゼロデイ攻撃の特徴
| 項目 | ゼロデイ攻撃 | 通常のサイバー攻撃 |
|:-:|:-:|:-:|
| 攻撃タイミング  | 修正パッチ公開前  | 既知の脆弱性を利用  |
| 防御の難しさ  | 高い（対策が間に合わない）  | 低い（既存の対策が有効）  |
| 攻撃の影響  | 甚大（広範囲に影響）  | 限定的（特定のソフトのみ）  |

📌 ゼロデイ攻撃の手口
ゼロデイ攻撃は、次のような手口で行われます。
🔹 攻撃の流れ

1️⃣ 脆弱性の発見
　攻撃者が、OSやソフトウェアの新たな脆弱性を発見。

2️⃣ エクスプロイト（攻撃コード）の開発
　発見した脆弱性を悪用するマルウェアや攻撃スクリプト を作成。

3️⃣ 攻撃の実行
　標的に対して、ゼロデイマルウェアを送り込む（メール・Webサイト経由など）。

4️⃣ 情報の窃取やシステム破壊
　侵入に成功すると、機密情報を盗んだり、システムにダメージを与える。

5️⃣ 修正パッチの公開（攻撃の終息）
　ベンダーが脆弱性を修正し、パッチを配布。

🔹 主な攻撃手法
| 手法 | 詳細 |
|:-:|:-:|
| ゼロデイマルウェア  | ゼロデイ脆弱性を悪用した未知のウイルスを拡散  |
| 標的型攻撃  | 特定の企業や政府機関に対し、ゼロデイ攻撃を仕掛ける  |
| ドライブバイダウンロード  | 改ざんされたWebサイトにアクセスしただけで感染  |
| フィッシングメール  | 偽のメールを送り、マルウェアをダウンロードさせる |

📌 ゼロデイ攻撃の被害事例

🔹 実際の攻撃事例
✅ 1. 2020年：有名ブラウザのゼロデイ攻撃
	•	手口:
ブラウザの未修正の脆弱性を悪用し、特定のサイトを閲覧しただけでウイルス感染。
	•	結果:
企業の内部ネットワークが乗っ取られ、機密情報が流出。

✅ 2. 2017年：WannaCry（ワナクライ）ランサムウェア
	•	手口:
Windowsのゼロデイ脆弱性を利用し、ネットワーク経由でマルウェアを拡散。
	•	結果:
世界150カ国以上の企業・病院・政府機関が被害を受けた。

⸻

📌 具体的な対策方法
ゼロデイ攻撃は「未知の脆弱性」を狙うため、通常のウイルス対策だけでは防げません。

🔹 1. OS・ソフトウェアの最新化
✅ 修正パッチが公開されたら即適用
	•	Windows Update、アプリの更新を常に最新にする

✅ 自動アップデートを有効にする
	•	更新を忘れずに適用できるようにする

🔹 2. ゼロデイ攻撃に対応できるセキュリティ対策
✅ 次世代型ウイルス対策ソフト（NGAV）の導入
	•	「未知の脅威」に対応できるAIベースのセキュリティを活用

✅ EDR（Endpoint Detection and Response）の導入
	•	リアルタイムで攻撃の兆候を検知・対処 するセキュリティツール

🔹 3. 被害を最小限に抑える対策
✅ 最小権限の原則を徹底
	•	管理者権限を持つユーザーを限定し、攻撃の被害を抑える

✅ バックアップを定期的に取得
	•	ゼロデイ攻撃によるデータ破壊に備え、オフラインバックアップを確保

⸻

📌 試験での出題ポイント
✅ 記述問題の対策
試験では、「ゼロデイ攻撃の手口・影響・対策」を説明できるかが問われます。
以下のような問題が出る可能性が高い ので、事前に練習しておきましょう。

Q1. ゼロデイ攻撃の特徴と攻撃手法を説明せよ。

解答例:
ゼロデイ攻撃とは、修正プログラムが提供される前の脆弱性を狙った攻撃である。
攻撃者は、ゼロデイマルウェアを開発し、標的型メールやWebサイト経由で感染させる。

Q2. ゼロデイ攻撃を防ぐための対策を2つ挙げ、それぞれの理由を説明せよ。

解答例:
	1.	OSやソフトウェアを最新状態に保つ
	•	修正パッチ適用が遅れると、ゼロデイ攻撃の被害を受けるリスクが高まるため。
	2.	EDRの導入
	•	通常のウイルス対策では防げないため、リアルタイム監視が必要になる。

⸻

✅ まとめ
	•	ゼロデイ攻撃は「修正パッチの公開前」に脆弱性を悪用する攻撃
	•	「ゼロデイマルウェア」「標的型攻撃」「フィッシングメール」が主な手口
	•	対策は「OSの更新」「次世代型ウイルス対策」「EDRの導入」「最小権限の徹底」
	•	試験では「攻撃手法・影響・対策」をセットで理解し、記述問題に備える！
herokuがいつの間にか無料で使えなくなってしまったので代替を考える

# はじめに
qiitaの連続更新記録を更新し続けたいという思いで毎週いろいろなものを作っているが、どれもローカル環境開発の枠を出ておらず、何かしらの方法で外部に公開＋自分だけが使用できるようなものを作ってみたいと思い始めました
そこで、「そういえば、はるか昔にherokuというものを使って何か作った記憶があるな」と思い、情報を探し回っていると何と無料枠が終わっているということが発覚しました

困ったこれでは、やりたいこともできなくなってしまったか、、
と思いましたが、諦めずに探してみると「**Render**」というサービスに辿り着くのでした

# サーバーサービスの選定
現在だと簡単にサーバーを持ちたいなどがあれば、AWSやGoogle Cloudを使用するのが一般的になっていると思います

よく使用しているAWSではEC2の無料枠があるみたいですが、アカウント作成から12ヶ月経過すると無料枠がなくなってしまうようです、、

Google CloudではE2-micro（F1-micro）インスタンスが無料という情報もありましたが、詳細に利用したことがないので、勉強も兼ねて使ってみるのはまた今度

そしてこれらのクラウドインフラ利用する際に、高額な請求になるといった嫌なことを見かけてしまうのでそういうリスクはあまりまだ持ちたくないなという個人的な理由で使わないことにしました

段々と手段が狭まってしまいましたが、chatgptに縋ってみると「Render」というサービスがherokuの代替として人気ですという情報を教えてくれました

調べてみると確かに無料枠が使えそうなので試してみることにしました

# Renderを試してみる
早速サービスに登録します
いろいろなところで紹介されているので詳細は省きますが、githubやgitlabがあるとサービス登録は簡単でした

いろんなサービスを作成できるダッシュボードが表示されます

今回はFast APIで簡単に「Hello, Render!」が表示されるようなAPIをデプロイしてみたいと思います

github内でFast APIのコードを書きます

```py:main.py
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"message": "Hello, Render!"}
```

```plaintext:requirements.txt
fastapi
uvicorn
```

上記の内容でコミット&プッシュします

githubリポジトリにコードが反映されていることを確認後、再びRenderに戻ります
今回は「new Web Service」を使用します

そうするとgithubやその他のサービスと連携しますかという画面になるのでgithubを選択
そして利用したいリポジトリを選択

次に詳細な設定値を決めていきます

Name：任意の名前
Language：Pythonを選択
Region：一番近そうなSingaporeを選択
Branch：デプロイしたいコードが存在しているGitのBranch
Build Command：「pip install -r requirements.txt」
Start Command：「uvicorn main:app --host 0.0.0.0 --port 10000」
Plans：Free を選択

他の任意の項目は特に利用しないので、空欄で進めます
設定ページ最下部まで進めて行くと最終的にデプロイが始まります
デプロイ完了後、画面上部に表示されたWebページを確認すると「{"message":"Hello, Render!"}」が表示されました

![スクリーンショット 2025-03-22 9.46.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701238/5b75d37a-e6bc-48c1-9568-ec1e89c36098.png)

# 注意点
一応、月に750時間は使用できるので1つのアプリであれば稼働し続けられますが、利用がない時は都度停止するのがベストかと思われます

また、Freeプランは15分で自動停止される模様です(リクエストが来ると再度立ち上がるようですが)

# おわりに
ということで今回はHerokuに代わるサービスを探してみましたが、Renderという非常に個人利用にはもってこいのサービスが見つけられたかなと思います

これからの個人利用ツールの開発もまだまだ始まったばかりです
いろいろ試していければと思います
289. Game of Life 解答例・ポイント補足

# 問題内容
有名なライフゲームの挙動を実行するプログラムを記述するもの

# 解答例
```python:sample
class Solution:
    def gameOfLife(self, board: List[List[int]]) -> None:
        

        directions = [(1,0), (1,-1), (0,-1), (-1,-1), (-1,0), (-1,1), (0,1), (1,1)]
        
        for i in range(len(board)):
            for j in range(len(board[0])):
                live = 0                
                for x, y in directions: 
                    if ( i + x < len(board) and i + x >= 0 ) and ( j + y < len(board[0]) and j + y >=0 ) and abs(board[i + x][j + y]) == 1:
                        live += 1
                if board[i][j] == 1 and (live < 2 or live > 3):    
                    board[i][j] = -1
                if board[i][j] == 0 and live == 3:                  
                    board[i][j] = 2
        for i in range(len(board)):
            for j in range(len(board[0])):
                board[i][j] = 1 if(board[i][j] > 0) else 0
        return board
```

# この問題のポイント
この問題で難しいのは、あるマスについて次の状態を判定し上書きする際、他のマスの判定に影響を与えないようにするところ。その点で解答例内の注目すべきところは以下の部分。
```python:sample
abs(board[i + x][j + y]) == 1:
```
これによって絶対値が１になればカウントすることになる。これによって、判定の際にカウントされるべきものは１か‐１であれば良くなる。つまり、今回カウントされる中で次も生存するものと死亡するものでラベルを分けることができる。

同じような仕組みで
```python:sample
if board[i][j] == 0 and live == 3:                  
    board[i][j] = 2
```
もある。これは、今回カウントされない中で次回は生存するものと死亡するものというラベル分けに役立っている。
BitnamiのApacheのタイムスタンプをJSTに変更

初心者にも使いやすいWordPressの環境を探していて、Amazon Lightsailにたどり着きました。通常のVPCやEC2などで構成するインフラと異なり、マシンのブループリントを選んで、インスタンスサイズを選択し、インスタンス名を入力して起動すれば、それだけで仮想サーバが上がり、WordPressなんかもすぐに使えてしまう優れモノです。自由度は低いけど、ある種のニーズにはぴったりマッチしていると思います。

ブループリントにWordPressを選択すると、中身はOSがDebian（意外にも?Amazon Linuxでない）、そこに**BITNAMI**が乗って、Apache + PHP-FPM + MariaDB という構成でした。

普段BITNAMIを使わない人間からすると、通常のDebianとパスの構成が全く違うBITNAMIは地味にイライラします。また、サービスの起動・終了なども `systemctl` を介してはいますが`bitnami.service`という特殊なサービスにラップされてApache、PHP-FPM、MariaDBが動いています。Apache再起動するだけで最初は「？？？」となります。

しかし、ノリがわかってくると、とりあえず何か探したかったら`/opt/bitnami`の下を探せばいいし（シンボリックリンクになってることも多いですが）、上記3つのサービスは`/opt/bitnami/ctlscript.sh`というスクリプトで管理すればいいので、なんとなく仕事ができるようになります。

今回はそんなBITNAMIの環境で、Apacheのログに出力されるタイムスタンプをUTCからJSTに変えたいと思って調べた結果です。

## システム全体のタイムゾーン設定
これはBITNAMI関係なしに通常の `timedatectl` コマンドを使用します。

```sh
$ sudo timedatectl set-timezone Asia/Tokyo
```
これだけで`date`コマンドの出力などがUTCからJSTに変更されます。`timedatectl`コマンドを引数無しで実行すると現在のステータスが確認できます。
```
$ sudo timedatectl
```

## Apacheの環境変数設定
こちらはBITNAMI特有の設定で探すのに苦労するところです。結論から言えば、`/opt/bitnami/apache/scripts/apache-env.sh`といういかにもな名前のスクリプトがあり、そこに設定を書き込めばOKです。ファイルの最後に

> \# Custom environment variables may be defined below

というコメントがありますので、その下に以下を追記するのが良いと思います。

```
export TZ=Asia/Tokyo
```

追記したら、Apacheを再起動しますが、これもBITNAMI特有の`/opt/bitnami/ctlscript.sh`で実行します。

```sh
$ sudo /opt/bitnami/ctlscript.sh restart apache
```

以上で、次からのログはタイムスタンプがJSTで出力されます。
[備忘録] vscodeのターミナル部分の文字サイズの変更方法

## はじめに

この度、Github Copilot Agent modeを使うにあたり、

insiders verのvscodeをインストールすることになったのですが、

ターミナル部分の文字サイズがデフォルトの設定のままだったので、

この変更方法について書いてみたいと思います。

## 変更方法

vecode（または vecode insiders）の「**settings**」に進み、

検索欄に「**terminal font**」と入力します。

すると、「**Terminal**」という部分に

「**Integrated:Font Family**」という項目がありますので、

この数字を修正してターミナル部分の文字サイズを修正できます☺️

![スクリーンショット 2025-03-22 9.39.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634309/47d7849a-b63e-486a-846d-bb4eb4c80ce0.png)


## 参照

https://www.javadrive.jp/vscode/setting/index6.html
[備忘録] vscodeでファイルが一つしか開けない問題の解消法

## はじめに

この度、Github Copilot Agent modeを使うにあたり、

insiders verのvscodeを使うことになったのですが、

「ファイルを複数個開くことが出来ない...😣」

といったことがありましたので、

その解消法を書いてみたいと思います。

## 解消法

vscode（またはvscode insiders）の「**settings**」に進み、

検索欄で「**workbench.editor.enablePreview**」と入力します。

すると、「**Workbench**」という部分に

「**Editor: Enable Preview**」というチェック項目がありますので、

このチェックを外します。

![スクリーンショット 2025-03-22 9.29.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634309/318f45a1-79b6-457c-b2c5-c0e2cf0b3370.png)

これでファイルを複数個開くことが出来ますよ☺️

## 参照
https://note.com/t_ak66/n/n9846815853ce
iSCSI と multipathd メモ

# はじめに

iSCSIは使ったことがあるが、multipathdについては初めてなのでメモ

## **iSCSI（アイスカジー）**
「Internet Small Computer Systems Interface」の略で、**IPネットワークを介してSCSIプロトコルを転送する技術**。

### **何をするもの？**
- **サーバーとストレージ（ディスク装置）をLAN経由でつなぐためのプロトコル**。
- 通常、専用のFC（ファイバーチャネル）ではなく、**イーサネット（TCP/IP）でストレージにアクセス**できるようにする。

### **基本構成**
- **イニシエーター（Initiator）**：ストレージにアクセスするクライアント（通常はサーバー側）。
- **ターゲット（Target）**：ストレージを提供する側（iSCSI対応のストレージ装置やターゲットソフト）。

### **何が便利？**
- ファイバーチャネルのような**高価な専用ハードが不要**。
- 一般的な**イーサネットを使って手軽にSAN環境**が作れる。

## **multipathd（マルチパスデーモン）**
- `multipathd` は、**デバイスマルチパス（Multipath I/O）を管理するデーモン**。
- iSCSIに限らず、ストレージデバイスへの**複数経路を管理・制御するため**に使う。

### **何をするもの？**
- **複数の経路（パス）で同じストレージにアクセス**する環境で、冗長性やロードバランスを提供する。
- どこかの経路が故障しても、**別の生きている経路に自動で切り替え**てくれる。
- 性能を上げるために、**複数のパスで負荷分散**することもできる。

### **動作のイメージ**
- 例えば、iSCSIストレージに**2つのネットワーク経路**を用意してあるとする。
- 片方のネットワークに障害が発生しても、`multipathd` が**自動的に健全な経路に切り替え**てくれる。
- 利用者側は**何も気付かずにディスクを使い続けられる**。

## **iSCSIとmultipathdの組み合わせ**
- iSCSIで接続したストレージに対して、**複数のIPアドレス/ネットワークパスを用意**。
- それを `multipathd` で制御・監視し、**障害時に切り替えや負荷分散を行う**。
- SAN環境を**冗長化・高可用化**するのに必須の組み合わせ。

## **関連するコマンド/ファイル**
### iSCSI
- `iscsiadm` ：iSCSIの接続設定・管理コマンド。
- 設定ファイル → `/etc/iscsi/initiatorname.iscsi` や `/etc/iscsi/iscsid.conf`

### multipathd
- `multipath -ll` ：現在のマルチパスデバイスとパス状態の確認。
- 設定ファイル → `/etc/multipath.conf`
- デーモン制御 → `systemctl start/stop multipathd`

# さいごに

かんたんでしたね
【AWS Organizations】SCP（サービスコントロールポリシー）の適用範囲について



### はじめに
AWS Organizationsを使えば、複数のAWSアカウントを一元管理できます。その中でも「サービスコントロールポリシー（SCP）」は、**組織内のアカウントに対するアクセス制御の要**となる機能です。

本記事では、**SCPの適用範囲**について分かりやすく解説します。

---

### サービスコントロールポリシー（SCP）とは？
SCPは、**組織内のAWSアカウントで許可されるアクションの最大許可範囲（Permissions guardrail）を定義**するポリシーです。

SCPはIAMポリシーとは異なり、**そのアカウントでIAMポリシーが許可していても、SCPで拒否されていれば実行不可**になります。

---

### 適用範囲の基本ルール

#### 1. **SCPはOU（組織単位）またはアカウントに直接アタッチできる**
- SCPは以下のいずれかにアタッチできます：
  - 組織（Root）
  - OU（Organizational Unit）
  - 個別のAWSアカウント

#### 2. **SCPは「継承」される**
- OUやRootに設定したSCPは、**配下のOUやアカウントにも自動的に適用**されます。
- 例えば、Rootに設定したSCPは、すべてのOU・アカウントに影響します。

#### 3. **IAMユーザー・ロールではなく「アカウント」に対して適用される**
- SCPの対象は**IAMユーザーやロールではなく、アカウント単位**です。
- そのアカウント内のすべてのエンティティ（ルートユーザー、IAMユーザー、ロール）に適用されます。

---

### 適用対象となるユーザー

| ユーザー種別 | SCPの適用有無 |
|--------------|----------------|
| IAMユーザー   | ✅ 適用される     |
| IAMロール     | ✅ 適用される     |
| ルートユーザー | ✅ 適用される     |
| 管理アカウント | ✅ 適用される（SCP有効時）|

> 🔍 **ポイント**：SCPは**ルートユーザーにも適用**される点が、IAMポリシーとの大きな違いです。

---

### 「有効なポリシーセット」として評価される仕組み

アクションが許可されるには、以下の両方を満たす必要があります：

```
SCPで許可されている × IAMポリシーで許可されている
```

つまり、SCPとIAMポリシーの**両方で明示的に許可されている必要**があり、**どちらかで拒否されていれば実行不可**になります。

---

### 適用される階層と継承のイメージ図（文章）

```
[ Root ]
   └── [ OU A ] ← SCPがアタッチされていれば、配下のアカウントにも適用
         ├── [ Account 1 ]
         └── [ Account 2 ]
```

たとえば、「OU A」にSCPを設定すれば、**Account 1 と Account 2**にもそのポリシーが継承されます。

---

### よくある誤解と注意点

- ❌ **IAMポリシーで制限すれば十分？**
  → ルートユーザーにはIAMポリシーを適用できません。**SCPが必要**です。

- ❌ **SCPを設定すれば自動で制御される？**
  → **デフォルトでは「FullAWSAccess」というSCPがアタッチ**されています。不要なサービスを制限するには、これを無効化して独自ポリシーを作成する必要があります。

---

### まとめ

| 項目 | ポイント |
|------|----------|
| 適用単位 | OUまたはアカウント |
| 適用範囲 | 配下のすべてのIAMエンティティ（ユーザー、ロール、ルートユーザー）|
| 継承 | 上位のOUやRootから自動で継承される |
| IAMとの違い | IAMポリシーはユーザー単位、SCPはアカウント単位で制御 |
| 設定場所のおすすめ | なるべくRootにまとめて設定することで効率的に管理可能 |

---
pyenvの環境構築

# What pyenv?
公式の解説によりますと

>pyenv lets you easily switch between multiple versions of Python. It's simple, unobtrusive, and follows the UNIX tradition of single-purpose tools that do one thing well.

pyenvを使えば、複数のバージョンのPythonを簡単に切り替えることができる。pyenvはシンプルで邪魔にならず、UNIXの伝統である1つのことをうまくこなす単一目的のツールに従っています。

https://github.com/pyenv/pyenv

私、MacユーザーなのでMacでの環境構築と使い方をご説明します。`homebrew`を使用して環境構築を行なっていきます。英語が読める方はGitHubのREADMEを読んでやってみてください。

1. install
```shell
brew install pyenv
```

2 インストール後に実行
```shell
pyenv -v
```

3. PATHを通す方法: zshの場合
```shell
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc
```

4. 設定を適用させるためにshellを再起動
```shell
exec "$SHELL"
```

5.　使用した当時はPython3.12.0が必要だったので以下の手順でインストール
```shell
# 自分のPCのpythonバージョンを確認
python --version

# なんのバージョンがインストールできるかを確認する
pyenv install --list

# 指定したバージョンのインストール。今回は3.8.3 をインストール
pyenv install 3.12.0

# 指定バージョンがインストールされたか確認 (インストール済みバージョン一覧を表示)
pyenv versions

# グローバルのバージョン設定を変更
pyenv global 3.12.0

# 自分の環境内のpythonバージョンが変わったかを確認
python --version
```

## 最後に
Pythonのバージョン管理ツールは複数あるので自分が使いやすいものを選ばれると良いと思います。仕事だとねあらかじめ指定はあると思われますが😅

https://gihyo.jp/article/2024/03/monthly-python-2403
ワンライナーで牛がしゃべる時計を作る

# 牛がしゃべるコマンドがある

cowsay というコマンドがあります。sl などと同じジョークコマンドで引数で渡した文字列をアスキーアートの牛の吹き出しに出力するというコマンドです。

## インストールしてみる
```bash
### Debian系の場合
sudo apt install cowsay

### Redhat系の場合
sudo yum install cowsay
```

## 使ってみる
```
~$ cowsay hello
 _______
< hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```
ただこれだけです。

## 時計にする
cowsay の引数に時刻を渡せば当然時刻をしゃべってくれます
```bash
cowsay $(date +%H:%M:%S)
```
これを１秒に1回実行するようにします
```
while [ 1=1 ]; do cowsay $(date +%H:%M:%S); sleep 1 ;clear; done
```

結果が以下です
![Screencast-from-2025-03-22-08-22-41.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294409/35e3ea16-58b7-4281-828c-ef93c1e98f3b.gif)

# 最後に
昔から思っていたんですが、 cowsay で出力される動物って馬っぽくないですか？牛にはどうしても見えないです。