OmniAICreator/Qiita-1.07M huggingface dataset:
AWS初めて備忘録　wordpressをデプロイするまで


AWS を使って **独自ドメインで WordPress を運用したい！** という人向けに、
**VPC の構築 → EC2 への WordPress インストール → RDS との接続 → Route 53 でのドメイン設定 → SSL 化** までの手順をまとめました。

AWS 初心者でも分かりやすいように丁寧に解説していくので、ぜひこの手順に沿って WordPress のデプロイに挑戦してみてください！

---

## **この記事でやること**

- **VPC を構築**（AWS 上でのネットワーク環境を作成）
- **EC2 に WordPress をインストール**（Web サーバーを構築）
- **RDS（MySQL）を作成し、EC2 から接続**
- **Route 53 で独自ドメインを設定**（独自ドメインでアクセスできるようにする）
- **Sentry を導入してエラー監視を実施**
- **SSL 化（HTTPS 化）する**（ACM + ALB を使用）

---

## **1. VPC の構築**

まずは AWS 上に **VPC（仮想ネットワーク）** を作成します。

### **手順**

1. VPC を作成（CIDR: 10.0.0.0/16）
2. パブリックサブネット & プライベートサブネットを 2 つずつ作成
3. インターネットゲートウェイ（IGW）をアタッチ
4. ルートテーブルを設定（パブリックサブネット → IGW 経由で外部通信）

---

## **2. EC2 に WordPress をインストール**

次に **EC2（仮想サーバー）** を立ち上げて、WordPress を動作させます。

### **手順**

1. EC2 インスタンス（Amazon Linux 2023）を起動
2. Apache + PHP をインストール
3. WordPress をダウンロードして設置
4. EC2 のセキュリティグループを設定（SSH, HTTP 許可）

---

## **3. RDS（MySQL）を作成 & 接続**

データを EC2 ではなく **RDS（マネージド DB）** に保存するように設定します。

### **手順**

1. RDS（MySQL）インスタンスを作成
2. EC2 から RDS に接続（MySQL クライアントで確認）
3. WordPress の `wp-config.php` を編集

---

## **4. Route 53 で独自ドメインを設定**

EC2 の **パブリック IP ではなく、独自ドメインでアクセス** できるように設定します。

### **手順**

1. Route 53 でドメインを登録
2. A レコードを作成（EC2 のパブリック IP に向ける）
3. 設定が反映されているか確認（`dig ドメイン名`）

---

## **5. Sentry を導入してエラー監視**

サーバーでエラーが発生したときに通知を受け取れるように、Sentry を導入します。

### **手順**

1. Composer で Sentry をインストール
2. `wp-config.php` に Sentry の初期化コードを追加
3. 意図的にエラーを発生させ、Sentry に通知が届くか確認

---

## **6. SSL 化（HTTPS 化）する**

最後に、サイトを **HTTPS で安全にアクセスできるようにします。**

### **手順**

1. ACM で **SSL 証明書を取得**
2. ALB（Application Load Balancer）を作成
3. HTTPS リスナーを設定（ポート 443）
4. HTTP → HTTPS リダイレクトを設定
5. Route 53 の A レコードを ALB に変更
6. `https://ドメイン名` にアクセスし、SSL 化が反映されているか確認

---

## **まとめ**

これで、

✅ AWS で WordPress サーバーを構築し、
✅ 独自ドメインを設定し、
✅ エラー監視を導入し、
✅ HTTPS で安全にアクセスできるようになりました。

今後は **デザインや機能をカスタマイズ** して、理想のサイトに仕上げていきましょう！

---

次のステップとして、 **CI/CD を導入して、WordPress のデプロイを自動化** するのもおすすめです！
【React, Jest】 map関数で回転させる時のルート要素の記述方法 


# 問題
React側で、map関数で回転させる時のルート要素の記述方法に誤りがあり、Jestでテストを実施する時、WarningやErrorが出ました。

# テストケース
想定通り、画面に「テスト太郎」が表示されることを確認したい。
```CardPage.test.tsx
  test("名前が表示されている", async () => {
    render(
      <ChakraProvider value={defaultSystem}>
        <MemoryRouter initialEntries={["/cards/sample_id"]}>
          <Routes>
            <Route path="/cards/:id" element={<Card />} />
          </Routes>
        </MemoryRouter>
      </ChakraProvider>
    );

    await waitFor(() => {
      const nameText = screen.getByText(/テスト太郎/i);
      expect(nameText).toBeInTheDocument();
    });
  });
```


# React側の正しいコード(テストを受ける側)
```Card.tsx
import React, { Fragment } from "react";

const Card = ({ data }) => {
  return (
    <>
      {data.length > 0 ? (
        data.map((item, index) => (
          // map関数の中のルート要素で、エラーが出ない書き方
          <Fragment key={index}>
            {/* ここに各アイテムの内容を記述 */}
          </Fragment>
        ))
      ) : (
        <p>No data available</p>
      )}
    </>
  );
};

export default Card;
```

# Reactの、map関数の中のルート要素パターン
(1)Warningが出る
```
<>
  {/* ここに各アイテムの内容を記述 */}
</>
→Warning: Each child in a list should have a unique "key" prop.
```

(2)Errorになる
```
<React.Fragment key={index}>
  {/* ここに各アイテムの内容を記述 */}
</React.Fragment>
→Error: Uncaught [TypeError: Cannot read properties of undefined (reading 'Fragment')]
```

(3)通る
```
import React, { Fragment } from "react"; // Fragmentをimport

<Fragment key={index}>
  {/* ここに各アイテムの内容を記述 */}
</Fragment>
→OK
```


# おわりに
解決まで2時間くらいかかってしまいました。
GitHub CopilotやClaudeで質問しましたが、今回はClaudeの回答が良かったです。
LaravelのMySQLデータベース作成手順

## ① MySQLにログイン
ターミナルまたはコマンドプロンプトで以下のコマンドを実行：

```sh
mysql -u root -p
```

パスワードを入力し、MySQLのコマンドラインに入る。

---

## ② データベースを作成
以下のSQLコマンドを実行：

```sql
CREATE DATABASE laravel_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```

※ `laravel_db` は任意のデータベース名に変更可能。

---

## ③ ユーザーを作成し、権限を付与（任意）
以下のコマンドで専用のユーザーを作成し、権限を付与する。

```sql
CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON laravel_db.* TO 'laravel_user'@'localhost';
FLUSH PRIVILEGES;
```

変更可能な部分：
- `laravel_user` → ユーザー名
- `password` → パスワード
- `laravel_db` → さきほど作成したデータベース名

---

## ④ Laravelの `.env` 設定
`.env` ファイルを編集し、以下のように設定を反映：

```env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=password
```

MAMPを使用している場合、`DB_HOST=127.0.0.1` の指定を推奨。

---

## ⑤ マイグレーションを実行
Laravelの初期テーブルを作成するために以下のコマンドを実行。

```sh
php artisan migrate
```

---

## ⑥ 設定のキャッシュをクリア（必要に応じて）
`.env` を変更したら、設定を反映させるために以下を実行。

```sh
php artisan config:clear
```

これでLaravelのMySQLデータベースの準備は完了！🎉
Ollama Python Library で Custom Client でストリーミング出力を使う

## 背景
家のゲーミング PC で Ollama を動かし、別の Mac からアクセスして使う構成です。公式ライブラリのページでも、Custom Client + Streaming の例が無く、少し探しても見つからなかったので記事として残すことにしました。

https://github.com/ollama/ollama-python

## コード
公式ページの Streaming responses の例と Custom client の例の合わせ技とすることで動きます。

```Python
from ollama import Client
client = Client(
  host='http://接続先の IP アドレス:11434',
  headers={'x-some-header': 'some-value'}
)

stream = client.chat(
  model='使いたいモデル',
  messages=[
    {
      'role': 'user',
      'content': 'AIによって私たちの暮らしはどのように変わりますか？',
    },
  ],
  stream=True
)

for chunk in stream:
  print(chunk['message']['content'], end='', flush=True)
```

:::note warn
上記はあくまで動作確認用のサンプルです。実運用で使うには適切なエラー処理などを実装して使用してください。
:::
家のゲーミング PC は 2 年ほど前に組み立てたので、GPU も GeForce RTX 3060 と少し世代が前ではあるものの、12GB VRAM のおかげで話題のあのモデルの 14B とかも悪くない速度で動きました。
Debian⇔Windows間のファイル移動について

# はじめにDebianとは?

## 目次
1. [特徴と長所](#特徴と長所)
2. [使い道](#使い道)
3. [実際にファイルを移動してみる](#実際にファイルを移動してみる)
    - [Windows(実環境)からDebian(仮想環境)へのファイル移動の仕方](#windows実環境からdebian仮想環境へのファイル移動の仕方)
    - [Debian(仮想環境)からWindows(実環境)へのファイル移動の仕方](#debian仮想環境からwindows実環境へのファイル移動の仕方)

## 特徴と長所

### 安定性と信頼性
Debianはその安定性で知られており、特にサーバー環境での使用に適しています。ソフトウェアの更新は慎重に行われ、テストを重ねてからリリースされる。

### パッケージ管理システム
DebianはAPT (Advanced Package Tool) を使用したパッケージ管理システムを持ち、豊富なソフトウェアリポジトリを提供しています。これにより、必要なソフトウェアやツールを簡単にインストール・管理することができる。

### コミュニティとサポート
Debianは広範なコミュニティに支えられており、多くのボランティア開発者や利用者が積極的に参加しています。そのため、問題が発生した際にも迅速なサポートを期待できる。

### 自由なライセンスと哲学
Debianはフリーソフトウェアのみを扱うことを基本としており、自由なライセンスのもとで配布されています。これにより、自由度の高いカスタマイズや改変が可能。

## 使い道

### サーバー
特に安定性が求められるウェブサーバーやデータベースサーバーとして利用されている。

### 開発環境
開発者やプログラマーにとって、豊富な開発ツールとパッケージが提供されるため、開発環境として広く利用されている。

### デスクトップ
デスクトップ環境としても利用可能であり、特にLinuxの初心者から上級者まで幅広いユーザーに支持されている。

## 実際にファイルを移動してみる

※ファイルといいつつ今回はこのカワイイくまさんの写真を使って実践してみます!(ファイルやフォルダもいけます)

![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/e06031ac-d933-0974-dfd8-436f08f6a3fe.png)

---

### Windows(実環境)からDebian(仮想環境)へのファイル移動の仕方

![カレントディレクトリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/9158e9d4-6213-f739-34e2-1d316a47a523.png)

#### 方法1: PowerShell上からPowerShell内のファイルをDebian内へ移動する

以下のコマンドを入力(コピーしたいならMove-ItemをCopy-Itemに書き換えるだけでよい)

```powershell
Move-Item "C:\Users\student\Pictures\Camera Roll\kuma.png" "\\wsl$\Debian\home\yoshida\"
```

![移動完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/32104ca0-22b4-8356-ed5b-f516d20fa13b.png)

---

#### 方法2: Debian上からWindows内のファイルをDebian内に移動する

以下のコマンドをDebian上のコマンドプロンプトに入力

```bash
mv /mnt/c/Users/student/Pictures/Camera\ Roll/cat.jpg /home/yoshida/
```

![移動完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/78d592da-824a-ab62-cf08-322b31a4948b.png)

**補足情報**: `/mnt/c` とは?
WSLの中から、Windowsの Cドライブ にアクセスするためのマウントポイントである。

---

### Debian(仮想環境)からWindows(実環境)へのファイル移動の仕方

#### 方法1: PowerShell上からDebian内にあるファイルをWindows内に移動する

以下のコマンドを実行する(同じくコピーならCopy-Itemに書き換えるだけ)

```powershell
Move-Item "\\wsl$\Debian\home\yoshida\kuma.png" "C:\Users\student\Pictures\Camera Roll\"
```

![移動完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/1c77cc94-49ad-8556-d28b-80c8fdd83ec5.png)

---

#### 方法2: Debian上からDebian内のファイルをWindowsに移動する

以下のコマンドを実行する

```bash
mv /home/yoshida/cat.jpg /mnt/c/Users/student/Pictures/Camera\ Roll/
```

![移動完了](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/e941b8ac-bd7c-55ff-da0a-65c50b3ad4c8.png)

![猫の写真](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553242/c3f8f57e-7f40-cd27-bba9-94f15149b330.png)
XMRSigner備忘録

# Monero専用のハードウェア・ウォレットの作り方
ここにやり方書いてあります。
わからなければこのURLをGPT先生に貼り付けて質問すれば解決するはずです。

https://github.com/DiosDelRayo/MoneroSigner/releases

# 実践

必要なライブラリをダウンロードします。
```
brew install make
brew install signify-osx
```

XMRSignerのデータを署名ごとダウンロードします。
```
curl -L -o Makefile https://github.com/DiosDelRayo/MoneroSigner/releases/download/v0.9/Makefile
```

ビルド（実行ファイルの作成）します。
```
make image
```

署名が正しいか確認します。
```
signify -C -p xmrsigner.pub -x SHA256.sig xmrsigner-dev-buster-16gb.img.xz
cat SHA256.sig
```

ファイルを解凍します。
```
xz -d xmrsigner-dev-buster-16gb.img.xz
```

あとはBalena Etcherでフラッシュ！
記事投稿のメリットとコツについて語る

## めちゃくちゃ端的に早速本題（３０秒で読み終わります）

## メリット

### 自己学習が深まる
人に理解してもらおうとすることで、できるだけ間違えないように調べるようになりますし、自分でいろいろ検証するキッカケにもなります。そのため、個人的には非常に効果的な学習方法だと言えます。

### ポートフォリオになる
SNSや記事はその人のアイデンティティとなり、判断材料の一つになります。  
履歴書だけでは伝わらない人間味が記事から感じ取れますし、どのような勉強をしているのか、定期的に学習しているのかも分かるので、アウトプットすることは大きな強みになります。

## コツ

### 間違いを恐れない
個人的には、これが最も重要だと考えています。  
極力間違えないように正しい情報を発信することを心がけるべきですが、どうしても曖昧な記述や間違いが発生することもあります。  
しかし、その際はコメントをいただけることも多く、むしろフィードバックを得る機会と捉えることで気負いが軽減されました。

### メリットを意識する
先ほど述べたメリットをしっかりと意識することが大切です。  
そうすることで、「面倒くさい」「なんか恥ずかしい」といった無意味な感情を排除し、記事投稿に前向きになれます。

### 最低限のラインから始める
最初から「週に2,3本書く」などと目標を設定しないことが大切です。  
数をこなすことが目的になり、未達成による挫折につながると本末転倒です。  
記事投稿の意義をしっかり意識しながら、自分のできる範囲で始めるのが良いでしょう。（私も慣れないうちは月に1本程度のペースでした。）

## まとめ
確かに記事投稿には心理的なハードルがあり、面倒な部分もあります。  
しかし、得られるメリットは非常に大きいです。  
一度慣れてしまえば、それほど負担には感じなくなりますし、いいね！やストックされると純粋に嬉しいものです。  
ぜひ、皆さんも記事を書いてアウトプットライフを楽しみましょう！
AWS SDK for PHPにMFA認証・AssumeRoleを使用する

## やりたいこと
・ AWS SDK for PHPを使用してローカル環境からS3等を使用したい
・ IAMユーザの権限はAssumeRoleのみ
・ IAMユーザを使用するにはMFA認証を必須としたい
・ IAMユーザのアクセスキーは「~/.aws/credentials」にのみ保存したい

## 事前準備（詳細は割愛）
・IAMユーザの作成
・IAMユーザにMFA認証を追加
・IAMユーザのアクセスキー発行
・IAMユーザの権限はAssumeRoleのみ（MFAを必須とする）
・ロールの作成
・ロールの権限は必要な権限（S3とか）を付与
・ロールの信頼関係に作成したIAMユーザを追加
・~/.aws/credentialsに発行したアクセスキー等を登録

## 困っていたこと
AWS SDK for PHPの[開発ガイド](https://docs.aws.amazon.com/ja_jp/sdk-for-php/v3/developer-guide/welcome.html)にはロールの引き受け（AssumeRole）や一時的な認証情報に関することが記載されているがMFA認証に関する記述がなかった


[こっち](https://docs.aws.amazon.com/ja_jp/code-library/latest/ug/sts_example_sts_Scenario_AssumeRoleMfa_section.html)にはPythonではあるがMFA認証＆AssumeRoleを使用したS3へのアクセス方法が記載されているが、MFAの認証コード（30秒のワンタイムパスワード）を使用しており、現実的ではない
※自分がやりたいのはDockerコンテナ内で起動するWEBアプリケーションである
特定のページへアクセスした際にS3等を使用するので事前にワンタイムパスワードを設定することは困難である


## 解決策（とりあえず感があるけど）
まずはコード
```
    {
        $this->s3 = new S3Client([
            'version' => 'latest',
            'region' => 'ap-northeast-1',
            'credentials' => [
                'key' => env('AWS_ACCESS_KEY_ID'),
                'secret' => env('AWS_SECRET_ACCESS_KEY'),
                'token' => env('AWS_SESSION_TOKEN'),
            ],
        ]);
    }
```

環境変数に下記３つを登録（設定する値は後述）
・AWS_ACCESS_KEY_ID
・AWS_SECRET_ACCESS_KEY
・AWS_SESSION_TOKEN


CLIコマンドを使用して一時的な認証情報を取得
```
aws sts assume-role --role-arn "AssumeRoleのロールarn" --role-session-name "temp-session(任意のセッション名)" --serial-number "登録したMFAのarn" --token-code "123456（MFAの認証コード）" --profile credentialsに登録した名前（デフォルトの場合は不要かな？）
```

このコマンドの結果は以下
```
{
    "Credentials": {
        "AccessKeyId": "一時的なアクセスキー",
        "SecretAccessKey": "一時的なシークレットキー",
        "SessionToken": "一時的なセッショントークン",
        "Expiration": "有効期限(UTC)"
    },
略
```

ここで取得したAccessKeyId、SecretAccessKey、SessionTokenを環境変数(.envファイル等)に設定して、コンテナを起動することでコンテナ内で起動するWEBアプリケーションがAWSサービスを使用することができる
四足歩行ロボットのUnitree Go2をシミュレーション環境（Mujoco)で動かしてみる

# 1. はじめに
前回の記事（[四足歩行ロボットをシミュレーション環境（Gazebo）で自律走行させてみる（CHAMP Quadruped Controllerの試行）](https://qiita.com/bebebefu/items/29a38d76a3dac88bc728)）では、githubで公開されているリポジトリを利用し、CHAMP Quadruped ControllerによるGazebo上での四足歩行の自律走行シミュレーションを試行することができました。そして、その記事の中でunitree_mujocoというシミュレーション環境が、以下で公開されていることを述べました。それについて試してみたのが、この記事の内容になります。

https://github.com/unitreerobotics/unitree_mujoco

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
- ROS2: Humble

# 3. 構築手順
構築手順としては、 unitree_mujocoのリポジトリ[[1]](#参考記事やサイト)のreadmeにおけるpython向けの手順を実行しました。ほとんどreadmeの手順に従いましたが、少しアレンジしたところもありましたので、そこについても記載してきたいと思います。

## 3.1 Unitree Mujocoのクローン
以下のコマンドでUnitree Mujocoをクローンしてきます。いつもなら、ここでcolcon buildをしてビルドするのですが、今回は不要です。
```:terminal(1)
git clone https://github.com/unitreerobotics/unitree_mujoco.git
```

## 3.2 関連パッケージのインストール
unitree_sdk2_pythonのインストールは[[1]](#参考記事やサイト)のreadmeにあるように、以下のコマンドでインストールしました。
```:terminal(2)
cd ~
sudo apt install python3-pip
git clone https://github.com/unitreerobotics/unitree_sdk2_python.git
cd unitree_sdk2_python
pip3 install -e .
```
mujoco-pythonとjoystickのインストールについても[[1]](#参考記事やサイト)のreadmeにあるように、以下のコマンドでインストールしました。
```:terminal(3)
pip3 install mujoco
```

```:terminal(4)
pip3 install pygame
```

## 3.3　Joystickを使わないシミュレーションを行う場合の設定（USE_JOYSTICK = 0 に変更）
本記事ではJoystickを使わないでシミュレーションを行うことにしました。そのためunitree_mujoco/simulate_python/config.pyの中の**USE_JOYSTICK = 1** を **USE_JOYSTICK = 0**とする設定をしないと、Unitree Go2は立ったままで全く動きません。

## 3.4　lo インターフェースでマルチキャストを有効化
後述するstand_go2.pyを起動しようとしたときに以下のエラーが出ました。
```
python3: selected interface "lo" is not multicast-capable: disabling multicast
```
このエラーを回避するため、以下のコマンドを実行することで、lo インターフェースでのマルチキャストを有効化しました。
```:terminal
sudo ip link set lo multicast on
```

# 4. シミュレーション結果
以下のコマンドでシミュレーション環境(Mujoco)を起動しました。なお、起動するプログラムはクローンしてきたリポジトリにサンプルとして用意されているものです。
```:terminal(1)
cd ~/unitree_mujoco/simulate_python
python3 unitree_mujoco.py
```
これを起動すると、Unitree Go2は最初に足を突っ張った状態で立っていますが、すぐに伏せの状態になります（以下の図の状態）。

![Screenshot from 2025-02-08 10-21-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/412e2a6c-6286-9198-01c4-53c543eb7320.png)


そして以下のコマンドを実行することでUnitree Go2が立ち上がります。
```:terminal(2)
cd unitree_mujoco/
python3 ./example/python/stand_go2.py
```

その様子が以下の動画になります。

<iframe width="560" height="315" src="https://www.youtube.com/embed/c18rLHxwERA?si=FcI0fsrhNP4MBFfe" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

# 5. まとめ
unitree_mujocoというシミュレーション環境を利用して、サンプルプログラムではありますが、Unitree go2が立ちあがるところをシミュレーションできました。次回はUnitree_ROS2を使ってのキーボードからの遠隔操作(teleop)などができないか取り組んでみたいと思います。


# 参考記事やサイト
[1][unitree_mujoco](https://github.com/unitreerobotics/unitree_mujoco)
個人的備忘録：効率的なプログラムを書くために知っておきたいアルゴリズムの基本についてアウトプットしてみた

## はじめに

アルゴリズムは、プログラミングにおいて欠かせない重要な概念です。

:::note info
***日常のさまざまな場面でも、私たちは無意識のうちにアルゴリズムを活用しています。***
:::

本記事では、**アルゴリズムの基本や具体例を交えながら、その重要性** について解説します。

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

プログラミングを学び始めたとき、コードを書くこと自体に夢中になり、  
**「どのような手順で問題を解決するのか」** という **アルゴリズムの視点** を意識できていませんでした。  

:::note warn
しかし、プログラムが複雑になるにつれ、**「もっと効率的に処理できないか？」「最適な解決方法は？」** と考える機会が増え、アルゴリズムの重要性を再認識しました。
:::

また、アルゴリズムを学ぶことで、**プログラムの処理速度の向上や保守性の向上** につながることが分かり、改めて整理したいと思いました。

## アルゴリズムとは？

アルゴリズムとは、**ある問題を解決するための手順やルールの集まり** のことです。  
簡単に言うと、「こうすれば目的を達成できる」という **手順の設計図** のようなものです。  

**具体例**

たとえば、「目玉焼きを作る」アルゴリズムを例えてみます。

1. フライパンを用意する  
2. フライパンを温める  
3. 油をひく  
4. 卵を割ってフライパンに入れる  
5. 火が通るまで待つ  
6. 目玉焼きを皿に移す  

このように、**目的（目玉焼きを作る）を達成するための一連の手順** がアルゴリズムです。  

## アルゴリズムの特徴

- **明確な手順**（ステップが具体的である）  
- **入力と出力がある**（例: 生卵を入れる → 目玉焼きができる）  
- **有限回の手順で終わる**（無限に続かない）  
- **誰が実行しても同じ結果になる**（手順が決まっている）  

## プログラミングとアルゴリズム

プログラムを書くときも、**アルゴリズムが重要** です。  
たとえば、数字を小さい順に並べる「ソート（並び替え）」のアルゴリズムには、**バブルソート** や **クイックソート** などがあります。  

### 例えば、バブルソートの簡単な手順:

1. 隣り合う 2 つの数字を比較する  
2. 大きい方が前にあれば入れ替える  
3. これをリストの最後まで繰り返す  
4. 一番大きい数字が最後に移動する  
5. 必要な回数だけ繰り返す  

## アルゴリズムを学ぶメリット

- **効率的なプログラムが書ける**  
- **問題を論理的に解決できる**  
- **プログラミングの基礎力がつく**  

:::note info
たとえば、**検索アルゴリズム** を知っていると、100万件のデータから素早く特定のデータを見つけられます。
:::

## まとめ

- **アルゴリズムは、問題を解決するための「手順の設計図」** です。  
- プログラミングにおいて、アルゴリズムの理解は **コードの効率化や最適化** に直結します。  
- **基本的なアルゴリズム（ソート、検索など）を学ぶことで、より良いプログラムを作成できる**  
- **日常の問題解決にも役立つ思考力が身につく**  

***アルゴリズムの学習を通じて、基礎的な部分の良い復習となりました！***
初心者のGCS設定ガイド

# GoogleCloud 

## 用語：

### 1. データを保存する「箱」：バケット（Bucket）
#### バケットとは？
GCSでデータ（ファイルや画像など）を保存するための「箱」のようなものです。
例: あなたが写真をたくさん保存する場合、「my-photo-bucket」という名前のバケットを作り、その中に写真ファイル（オブジェクト）を入れます。
ポイント: バケット名は全世界で一意でなければならないので、ユニークな名前にします（例：小文字と数字、ハイフンのみで構成）。
### 2. 個々のファイル：オブジェクト（Object）
#### オブジェクトとは？
バケットに入れる個々のファイルのことを「オブジェクト」と呼びます。
例: バケット内に保存する「summer_vacation.jpg」や「report.pdf」などがオブジェクトです。
特徴: オブジェクトには、実際のデータに加えて、サイズや作成日時、ファイルタイプなどの情報（メタデータ）が自動的につきます。
### 3. どのくらいの頻度で使うかで変わる保存方法：ストレージクラス（Storage Class）
#### ストレージクラスとは？
保存するデータの利用頻度に合わせて料金やアクセス速度が変わる設定です。
■Standard:
用途: Webサイトの画像や頻繁にアクセスするデータに最適。
例: 毎日何度も表示されるホームページの画像ファイル。
■Nearline:
用途: 月に1回程度のアクセスが想定されるバックアップデータに。
例: 定期的なシステムバックアップのファイル。
■Coldline:
用途: 数か月に1回程度、ほとんどアクセスしないデータ向け。
例: 長期保存するログや古いアーカイブデータ。
■Archive:
用途: 1年に1回未満しか使わない、ほぼ保管専用のデータ。
例: 法律で保管が義務付けられている、長期保存の記録データ。
### 4. データがどこにあるか：ロケーション（Location）・リージョン（Region）
#### ロケーションとは？
データが物理的に保存される場所のことです。
リージョン: 例として「asia-northeast1（東京）」など、1つの地域内に保存します。
マルチリージョン: 複数の地域（例えばアジア全体）に分散して保存し、可用性を高める設定。
デュアルリージョン: 2つの特定の地域に保存し、障害時のリスクを低減します。
### 5. 誰がデータにアクセスできるか：アクセス制御
#### 5-1. IAM（Identity and Access Management）
IAMとは？
「誰が」「どのデータに」「どんな操作をできるか」を、ユーザー単位で一括管理する仕組みです。
例: 自分のプロジェクト内で、開発者は読み書きできるが、一般ユーザーは閲覧だけできるように設定できます。
#### 5-2. ACL（Access Control List）
ACLとは？
バケットやオブジェクトごとに、細かくアクセス権（読み取り、書き込みなど）を設定できる仕組みです。
例: 特定のファイルに対して「このユーザーは読み取りだけできる」などを設定します。
注意: 最近は設定を簡単にするため、IAMだけで管理する「Uniform Bucket-Level Access」という方法を選ぶこともあります。
#### 5-3. 公開アクセス防止（Public Access Prevention）
公開アクセス防止とは？
誤ってインターネット上に誰でも見られるようにしないための設定です。
例: 機密の文書が入ったバケットは「公開アクセス禁止」をオンにして、外部からのアクセスをブロックします。
### 6. データの管理ルール：バージョニング・ライフサイクル管理
#### 6-1. バージョニング（Object Versioning）
バージョニングとは？
同じファイルを更新したとき、古いバージョンを残しておく機能です。
例: 重要なレポートを誤って上書きしても、前のバージョンを復元できるようにします。
#### 6-2. ライフサイクルルール（Lifecycle Management）
ライフサイクルルールとは？
ファイルの経過時間に応じて、自動的に保存方法を変更（例：StandardからColdlineへ移行）したり、削除したりする設定です。
例: 1年間アクセスがなかったファイルを自動でアーカイブクラスに変更し、保存料金を抑えます。
### 7. その他の便利な設定
#### CORS（クロスオリジンリソースシェアリング）
他のWebサイトからGCS内のファイルにアクセスできるように許可する設定です。

例: 自分のWebアプリが、別ドメインにある画像ファイルを利用できるようにします。
デフォルト暗号化 / KMS（Key Management Service）
GCSでは、アップロード時に自動でデータを暗号化します。

例: 追加費用なしで、保存する全てのファイルが安全に保護されます。さらに、顧客管理の暗号鍵を使ってセキュリティを強化することも可能です。
#### Requester Pays
通常はデータをダウンロードする側が無料ですが、特定の設定ではダウンロードにかかる料金をリクエスト側に負担させるオプションです。

例: 大量のデータを配信する場合、アクセスするユーザーが料金を支払う設定にできます。
#### Autoclass
データの利用状況に応じて、自動的に最適なストレージクラスに移行する機能です。

例: アクセス頻度が減ってきたファイルを、自動的に低料金のクラスへ切り替え、コストを削減します。
#### オブジェクトメタデータ
各ファイルに付加情報（例：Content-Type、Cache-Controlなど）を設定でき、Webサイトの表示やキャッシュの制御に利用できます。

### まとめ
初心者向けにまとめると、GCSの設定で大事なポイントは以下の通りです。

#### バケット＝データを入れる「箱」
→ ユニークな名前とロケーションを選んで作成します。

#### オブジェクト＝バケット内の個々のファイル
→ ファイルに自動でメタデータが付与されます。

#### ストレージクラス＝保存方法の種類
→ 利用頻度に応じて「Standard」「Nearline」「Coldline」「Archive」を使い分け、コストを最適化します。

#### アクセス制御＝誰がどのデータにアクセスできるかの管理
→ IAMやACL、公開アクセス防止でセキュリティを確保します。

#### ライフサイクル管理＝ファイルの更新・削除ルール
→ バージョニングやライフサイクルルールで、誤操作や不要データの自動管理ができます。

#### その他の設定＝CORS、暗号化、Autoclassなど
→ Webサイトでの利用やセキュリティ、コスト削減に役立ちます。

このマニュアルを参考に、GCSの各設定項目が何を意味するのか、どのような用途で使うのかを具体的にイメージしてみてください。設定を実際に操作する際は、公式ドキュメントや実際のコンソール画面を見ながら進めると、さらに理解が深まります。
コンプライアンスに配慮するテクニカルライティング

# ◆この記事の目的
テクニカルライティングに関する法律について理解する

# 目次
▼[コンプライアンスとは？](#コンプライアンスとは)
▼[安全情報に関わる法律](#安全情報に関わる法律)
▼[利益保護に関わる法律](#利益保護に関わる法律)
▼[知的財産権に関わる法律](#知的財産権に関わる法律)

# ▼コンプライアンスとは？
企業や個人が法律や規則、倫理的基準を守ることを指す。
特に企業においては、法令遵守だけでなく、社内規則や社会的なモラルに従った行動を求められる概念として広く使われている。

# ▼安全情報に関わる法律
## 製造物責任法
> 製造物責任法（PL法）とは、製造物の欠陥によって消費者が被害を受けた場合、製造業者などが損害賠償責任を負うことを定めた法律である。

製造物の欠陥には３つの種類がある
- 設計上の欠陥（例：ブレーキの構造に問題があり正常に作動しない）
- 製造上の欠陥（例：不良品が混入し、正常に機能しない）
- 指示・警告の欠陥（例：使用上の注意が不十分で危険性が伝わっていない）

テクニカルライティングにおいては、特に「指示・警告の欠陥」を理解しやすく書くことが重要である。

## 消費生活用製品安全法
> 消費生活用製品安全法とは、消費者が使用する製品の安全性を確保し、事故や危害を防ぐために制定された法律である。

以下「リスク管理体制の整備」において、テクニカルライティングは事故予防や適切な対応のために欠かせない要素
- 取扱説明書や警告表示で事故を未然に防ぐ
- 品質管理やリスクアセスメントの文書で安全基準を確保する
- 事故報告やリコール通知で迅速な対応を行う

## その他法律
- 電気用品安全法
- 医薬品、医療機器等の品質、有効性及び安全性確保等に関する法律
- 労働安全衛生法

# ▼利益保護に関わる法律
## 家庭用品品質表示法
> 家庭用品品質表示法は、衣類やプラスチック製品などの品質や使用方法を消費者に正しく伝えるための法律である。

「使用上の注意について、本体又は取扱説明書に表示すること。」と規定されている。

## 不当景品類及び不当表示防止法
>不当景品類及び不当表示防止法（景品表示法）は、消費者が正しい情報をもとに商品を選べるようにするための法律である。

虚偽・誇大広告をすることを防ぎ、過剰な景品提供を制限することで、公正な市場競争を守る

# ▼知的財産権に関わる法律
## 著作権法
> 著作権法は、著作物の創作者（著作権者）がその著作物を独占的に利用できる権利を保護するための法律である。

取扱説明書やカタログの文書は、事実の伝達であるため、著作権法の保護対象外。
著作権法の保護対象には、以下のようなものがある。
- 文学作品（小説、詩、論文など）
- 音楽作品（楽曲、歌詞など）
- 美術作品（絵画、彫刻など）
- 映画、ビデオ作品
- コンピュータプログラム

著作権法において、引用と認められるためにはいくつかの条件がある。
以下は主な条件。
- 引用の必然性: 引用が自身の著作物を作成する上で不可欠であること
- 引用部分と自作品との区別: 引用部分が明確に区別され、引用であることがわかるようになっていること
- 引用の量と質: 引用の範囲は、自作品の主張や説明の補助的なものであり、自作品の本質的な部分を構成しない程度に留める
- 引用元の明示: 引用元を明示することが求められる
- 公正な扱い: 引用が公正な目的のために行われることが求められる

## 商標法
> 商標法は、事業者が自己の商品やサービスを他社のものと区別するために使用する「商標」を保護するための法律である

例えばロゴやブランド名、スローガンなどが該当する。

## 意匠法
> 意匠法は、物品のデザイン（意匠）を保護するための法律である

意匠とは、形状、模様、色彩などにより、製品の外観を美しくするための工夫を指す。企業が自社のデザインを守り、消費者に魅力的な商品を提供するために重要な法律。

## 不正競争防止法
> 不正競争防止法は、企業間の公正な競争を保護し、不正な取引慣行を防止するための法律である。

不正競争防止法の主なポイントは以下の通り。
- 虚偽広告の禁止: 商品やサービスに関して誤解を招く広告や虚偽の表示を行うことを禁止
- 商品形態模倣の禁止: 他社の商品形態（デザイン、パッケージなど）を模倣することを禁止
- 営業秘密の保護: 他社の営業秘密を不正に取得、使用、開示することを禁止
- 不正な信用毀損の禁止: 他社の信用を毀損するような行為、例えば偽りの情報を流布することを禁止

## 計量法
> 計量法は、物品の計量（測定）を正確かつ公正に行うための法律である

計量に使用される単位は、国際単位系（SI単位系）に基づいて統一されている。
例）長さ：メートル
　　質量：キログラム、グラム、トン

# ▼参考文献
[日本語スタイルガイド（第3版）](https://jtca.org/learn-tc/publication/guide_jsg/)
DELLマシンにUbuntu 24.04.1をインストールしてみた。

# 概要

DELLマシン（XPS-8920）のWindows 11のサポートが切れていたので、
Ubuntu 24.04.1をインストールすることにしました。備忘録です。
Windowsは消しました。

# 詳細

Ubuntu 24.04.1のインストーラをUbuntuの公式ページからダウンロードしました。

次にUbuntu 24.04.1のインストーラをUSBメモリに書き込みました。
すでにUbuntu化されているASUSマシン（D320SF）にUSBメモリを挿して、
ブータブルUSBメモリを作成しました。

Windowsマシン（DELLマシン）にブータブルUSBメモリを挿して、
インストーラの起動を試みたが、RST（Rapid Storage Technology）が有効になっており、
インストールが進められない旨のメッセージが出ました。
ライブ環境ではSSDが見えない状態でした。
RSTは、Linuxでは現在未対応とのこと。

仕方ないので、手順に従って、RSTを無効化しました。
BIOSで「Advanced SATA Operation」の「RAID on」を、
「AHCI」に変更しました。

再度Ubuntuのインストーラを起動しました。
SSDとHDDのフォルダが参照できるようになりました。

ライブ環境で特に問題なさそうなので、インストール作業を進めました。
SSDにUbuntuをインストールする作戦で、ディスク（nvme0n1）を削除するとのことなので、
OKとみなし、インストールを実行しました。

インストールは無事完了し、どこにインストールされたかを確認してみると、
SSDの未使用領域にインストールされたようで、Windowsの本体のフォルダは残存していました。

Windowsを使うつもりはないので、再度インストーラを起動して、
gpartedで、Windowsのデバイス（nvme0n1p3）を解放し、
Ubuntuのデバイス（nvme0n1p2）に統合しました。

再度Ubuntu起動して無事統合できていることを確認しました（df）。

その他設定は色々必要なので行いました。今の所目立った不具合はありません。

# まとめ

何かの役に立てばと。
【AWS】EKSクラスターのLB用サブネットのタグ付け要件

## EKSクラスターのLB用サブネットに特定のタグが必要
はじめに業務でEKSクラスターを構築する上で、後になって気づいたことがあるため備忘としてまとめます。
EKSクラスターを構築するにはAWS公式にも以下のようにネットワーク要件が存在します。

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/network-reqs.html

代表的なものでいうと以下があります (公式情報にはその他にもあります)
1. サブネットは異なる2つのAZに必要
2. プライベートサブネットはアウトバウンドインターネットアクセスが必要 -> つまりNAT Gatewayが必要
3. <font color="DeepPink">ロードバランサーをサブネットにデプロイする場合には、特定のタグが必要</font>

今回はその中でも3. の[ロードバランサーをサブネットにデプロイする場合には特定のタグが必要]であるという点が気づいた点になります。

## プライベートサブネットにLBをデプロイする場合
プライベートサブネットにロードバランサーをデプロイする場合、以下のタグが必要です。
| キー                                | 値  |
|-------------------------------------|-----|
| kubernetes.io/role/internal-elb     | 1   |


### CloudFormationでの記載の例
```yaml
Tags:
	- Key: Name
	  Value: kubernetes.io/role/internal-elb
```

## パブリックサブネットにLBをデプロイする場合
パブリックサブネットにロードバランサーをデプロイする場合、以下のタグが必要です。
| キー                        | 値  |
|----------------------------|-----|
| kubernetes.io/role/elb     | 1   |

### CloudFormationでの記載の例
```yaml
Tags:
	- Key: Name
	  Value: kubernetes.io/role/elb
```

違いはプライベートとパブリックで`internal`が付いているかどうかですね。
`internal`つまり、内部向けか外部向けかどうかを判断させるためについているわけですね。

## なぜこのタグが必要になるのか？
`AWS Load Balancer Controller`がEKSクラスターにマニフェストファイルの情報からALBを作成する際に、どこのサブネットに作成するのか？が判断できなくなるために、このタグ付けが必要となります。

例えば以下のようなマニフェストファイルで`Ingress`を定義してALBを作成しようとした場合、`metadata.annotations`に記述されている`alb.ingress.kubernetes.io/scheme: internal`と関連付けされ、`AWS Load Balancer Controller`は`kubernetes.io/role/internal-elb`のタグがついたサブネットを検索しに行き、その対象サブネットにALBを作成します。

```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/scheme: internal  # 内部 ALB を作成
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/subnets: subnet-xxxxxxx,subnet-yyyyyyy  # サブネットId (サブネットの名称でも可能)
spec:
  ingressClassName: alb
  rules:
    - host: example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80

```

以下サブネットにつけたタグを探しに行く
```yaml
Tags:
  - Key: kubernetes.io/role/internal-elb
    Value: "1"
```

パブリックも考え方は同様で、マニフェストファイルで以下のように記述している場合、インターネット向けのALBを作成する`Ingeress`を定義しているため、

```yaml
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
```
以下タグを`AWS Load Balancer Controller`が探しに行き、パブリックサブネットにALBを作成するというわけです。
```yaml
Tags:
  - Key: kubernetes.io/role/elb
    Value: "1"
```

## まとめ
タグはただの名前だと思っていたのであまり影響範囲はないかと思っていましたが、EKSでIngressのマニフェストをデプロイする際にかなり重要な役割を担っていることに気づきました。

EKSを使用する場合にはパブリックサブネット、プライベートサブネットにはこのタグ付け要件が存在するため設計に組み込まなければなりませんよ、ということを知らなかった人への参考になればと思います。
めんどくさがり屋さんのalias設定

## はじめに
- 自分はかなり面倒くさがりです。結構文字数が多いコマンドも毎回打つのが面倒くさいのでシェルのエイリアスとして少ない文字数で実行出来るようにしています
- 同じようにコマンドを打つのに面倒くささを感じている方へ自分が登録しているエイリアスを以下で紹介します(利用しているシェルはzshなので`.zshrc`に記述しています)
***
### Docker系 
```shell
alias dc='docker compose'
alias dce='(){docker compose exec $1 bash}'
alias dcr='docker compose restart'
alias dl='docker logs'
alias dps='docker ps'
alias dcp='docker container prune'
alias dip='docker image prune'
```
- エイリアスに関しての感想や解説
  - `docker compose`コマンドは利用する頻度が高い割に結構打つの面倒くさかったので`dc`で済むようになったのはかなり楽になりました
  - エイリアスとして登録した場合もオプションは有効なので`dps -a`のように実行することで停止済みのコンテナも出力されます
***
### Git
- 以下はGitで設定しているエイリアスです(以下はgitのconfigファイルに記述しているものです)
```shell
alias.st status
alias.b branch
alias.ss stash
alias.f fetch
alias.graph log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
alias.recommit commit --amend --no-edit
alias.unstage restore --staged
alias.rollback revert -m 1
alias.lol log --oneline
alias.ss-p stash push --
alias.sl stash list
alias.untracked rm --cached
alias.pl pull
alias.push-d push --delete origin
```
- エイリアスに関しての感想や解説
  - `branch`,`fetch`に関してはよく使うので`git b`のように1文字で実行出来るのは想像以上に楽で気に入っています
  - `recommit`に関して
    - 『やべ、コミットに含めるの忘れてた』みたいな場面でかなり使っています
    - `git add {コミットし忘れたファイル} && git recommit`のように実行すると直前のコミットにコミットし忘れたファイルを含める事が出来ます
  - `rollback`に関して
    - リリース調整などでdevelopブランチにマージした内容をdevelopブランチから取り除きたい時などに使っています
      - `-m`オプションで指定する数値がいつも`1`と`2`どっちだっけ...となるのでエイリアスとして登録しました
      - ロールバックという名前が分かりやすくお気に入りです
***
### その他
```shell
# lsコマンド
alias ls='ls -G'
alias la='ls -a'
alias ll='ls -l -h'
# その他
alias ds='open /Applications/Docker.app'
alias report='vim ~/Documents/日報.md'
alias refresh='exec $SHELL -l'
alias gbd='(){git b | grep $1 | xargs git b -D}'
alias {プロダクト名}='cd {ローカルリポジトリのパス}'
```
- エイリアスに関しての感想や解説
  - `ls`コマンドのエイリアスについて
    - `ls(色付き)`,`la`,`ll`の3つが個人的三種の神器
  - `refresh`について
    - 新しくエイリアスを追加した時などによく使っています、地味に便利
  - `gbd`について
    - ローカルブランチをまとめて消すためのエイリアスです
      - `feature`で始まるブランチをまとめて消したい時などに使います
  - `{プロダクト名}`について
    - 仕事で複数のリポジトリを扱うのですが対象ディレクトリまで毎回`cd`で移動するのがあまりにも面倒くさかったのでエイリアスとして登録しました
    - プロダクト毎に登録するとどこで実行してもすぐに対象プロダクトのリポジトリまで移動できるので楽です

## さいごに
- エイリアスは自分で名前を決めて設定出来るので自分にとって「覚えやすい・分かりやすい」名前を登録することで地味に作業効率が上がると思います
- 利用頻度が高いけど打つの面倒くさいと感じているコマンドなどがあれば是非エイリアスを活用してみてください!
【Linux】よく使うコマンドと使用タイミングをまとめてみた

### はじめに

この記事ではLinuxでよく使うコマンドとその使用例を簡単に載せています。
利用法を忘れた際にご覧いただければと思います。

---

### **📝 Linuxコマンド解説**  

#### **📂 移動・ディレクトリ操作**  

- **`cd` (Change Directory)**  
  - **ディレクトリを移動**するためのコマンド。  
  - 例: `cd /home/user/Documents` → `/home/user/Documents` に移動  
  <br>

- **`pwd` (Print Working Directory)**  
  - **現在のディレクトリのパスを表示**する。（カレントディレクトリともいう）  
  - 例: `pwd` → `/home/user`  
  <br>

- **`ls` (List)**  
  - **ディレクトリの中のファイルやフォルダを一覧表示**する。  
  - 例: `ls -l` → 詳細な情報付きで表示  
  <br>

- **`mkdir` (Make Directory)**  
  - **新しいディレクトリを作成**する。  
  - 例: `mkdir new_folder` → `new_folder` を作成  
  <br>

- **`rmdir` (Remove Directory)**  
  - **空のディレクトリを削除**する。  
  - 例: `rmdir old_folder` → `old_folder` を削除  
  <br>

#### **📄 ファイル操作**  

- **`cat` (Concatenate)**  
  - **ファイルの内容を表示**する。(本来の文字の意味的には複数のファイルを連結するコマンドだが、ファイル1つ指定でその内容を表示するコマンドとして使用されることが多い)  
  - 例: `cat file.txt` → `file.txt` の内容を表示  
  <br>

- **`less`**  
  - **ファイルの内容をスクロールしながら表示**する。  
  - 例: `less file.txt` → `file.txt` の表示を制御できる。（`cat`で表示しようとすると、行数が多い場合は表示が流れて行ってしまうため）  
  <br>

- **`tail`**  
  - **ファイルの末尾を表示**する。  
  - 例: `tail -n 10 file.txt` → `file.txt` の最後の10行を表示  
  <br>

- **`touch`**  
  - **空のファイルを作成**する、または**既存のファイルの更新日時を変更**する。  
  - 例: `touch newfile.txt` → `newfile.txt` を作成  
  <br>

- **`rm` (Remove)**  
  - **ファイルを削除**する。  
  - 例: `rm file.txt` → `file.txt` を削除  
  <br>

- **`mv` (Move)**  
  - **ファイルやディレクトリを移動・名前変更**する。  
  - 例(移動): `mv sample.txt  dir` → `sample.txt` を `dirディレクトリ` に移動
  - 例(名前変更): `mv oldname.txt newname.txt` → `oldname.txt` を `newname.txt` に変更  
  <br>

- **`cp` (Copy)**  
  - **ファイルやディレクトリをコピー**する。  
  - 例: `cp file.txt copy.txt` → `file.txt` を `copy.txt` にコピー  
  <br>

- **`ln` (Link)**  
  - **ファイルのハードリンクやシンボリックリンクを作成**する。  
  - 例: `ln -s target_file link_name` → `target_file` のシンボリックリンクを `link_name` で作成  
  - ▼より詳細を知りたい方は以下記事を参考にしてみてください

  
https://qiita.com/mitsumizo/items/3c266699d9ca7a712108

  <br>

#### **🔎 検索・アクセス権限操作**  

- **`find`**  
  - **ファイルやディレクトリを検索**する。  
  - 例: `find /home -name "*.txt"` → `/home` 内の `.txt` ファイルを検索  
  - ▼より詳細を知りたい方は以下の記事を参考にしてみてください

https://qiita.com/ko1nksm/items/7fec71f78a394a80ed2b

  <br>

- **`chmod` (Change Mode)**  
  - **ファイルやディレクトリのアクセス権を変更**する。  
  - 例: `chmod 755 script.sh` → `script.sh` に実行権限を付与  
  <br>

- **`chown` (Change Owner)**  
  - **ファイルやディレクトリの所有者を変更**する。  
  - 例: `chown user:user file.txt` → `file.txt` の所有者を `user` に変更  
  <br>

#### **🖥 プロセス管理**  

- **`ps` (Process Status)**  
  - **現在動作しているプロセスを表示**する。  
  - 例: `ps aux` → 実行中のプロセス一覧を詳細表示  
  <br>

- **`kill`**  
  - **プロセスを終了させる**。  
  - 例: `kill 1234` → プロセスID 1234 を終了  
  <br>
「エンジニアのためのマネジメント入門」はマネジメントの理論が書かれた経営入門書だった

「エンジニアのためのマネジメント入門」。タイトルそのままの本。読書感想文です。

![](https://m.media-amazon.com/images/I/414hcONxw1L._SY445_SX342_.jpg)

簡単に感想を述べてしまうとこの本は苦手過ぎた...。経営は難しい。しかしそれでも用語は有用なのでメモ。

## メモ

- 管理的活動とは以下のことであるという。
    - 計画
    - 組織
    - 命令
    - 調整
    - 統制
        - この「調整」はもう少し私も学びたいものである。
- 管理原則とは以下のことであるという。
    - 分業
    - 権限と責任
    - 命令の一元性
    - 指揮の一元性
    - 階層組織
- 教える ことの設計とは、クライアント (部下) に以下のようにする。
    - 観察する。
    - 適した知識を提供する。
    - 実践の機会を与える。
    - フィードバックする。
        - 以前読んだ本: [「フィードバック入門 耳の痛いことを伝えて部下と職場を立て直す技術」を読んだので、その感想 #チームビルディング - Qiita](https://qiita.com/e99h2121/items/cd7b3d74c79cafdfc8d1)
- 教えるにはいくつかある。
    - ティーチングとコーチングとメンタリングとカウンセリング
    - [コーチング・メンタリング・ティーチング・コンサルティング・カウンセリングの違いと、自分のメンタリングへの心がけ 2022春 #新人プログラマ応援 - Qiita](https://qiita.com/e99h2121/items/10cdc7d17fbcfa3cb0b3)
- GROW モデル
    - G：	Goal（目標・欲しい結果）
    - R：	Reality Check（現実の確認）
    - O：	Options（選択肢）
    - W：	Will（意志）
- ジョハリの窓
    - 自己理解を深めるツール。
    - [ジョハリの窓とは？【わかりやすく解説】具体例、ワーク、4つの窓 - カオナビ人事用語集](https://www.kaonavi.jp/dictionary/johari/)
- コマンド アンドコントロール
    - つまり指揮命令。
- 権限レベルには以下がある。
    - 告げる
    - 売り込む
    - 相談する
    - 合意する
    - 助言する
    - 尋ねる
    - 委譲する
- サーバント リーダーは以下を施す。
    - 傾聴
    - 共感
    - 癒し
    - 気づき
    - 説得
    - 概念化
    - 先見力、予見力
    - 執事役
    - 人々の成長に関わる
    - コミュニティづくり


 ## 参考

https://zenn.dev/babyjob/articles/ad5fdf6573f575

https://bookmeter.com/books/20676990

https://steam.place/entry/2022/12/24/084715

https://qiita.com/koji-yamauchi/items/3c41b835c7b23295aa65

> マネジメントについても、成果を感じにくく、ときに不毛な時間のように感じてしまう。何が正しいかわからなくなる。こちらも逃げ出したくなるものです。

> しかし、マネージメントは誰かがその役割を担う必要があります。
その立場に立つ必要があるかぎり、これも同様に向き合う必要があるのでしょう。

誰かがその役割を担う必要があるという事実があり、そのためのマネジメントを理論から解説した本でした。その必要が仮に起こった時、読み直すことにして、そっと本を閉じました...。

以上です～
個人的備忘録：Python で SHA-256 を使ったハッシュ化を実装しながら、仕組みを紐解いてみた

## はじめに

ハッシュ化は、元のデータを**固定長のハッシュ値に変換する技術**で、セキュリティの分野で広く利用されています。  

:::note warn
***特に、**パスワードの保存やデータの整合性チェック** などに欠かせない技術です。***
:::

本記事では、**ハッシュ化の特徴や代表的なアルゴリズム、Python を用いた実装方法** について解説します。  

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

Webアプリケーションの認証機能を実装する際、**パスワードの保存方法として「ハッシュ化」が重要** だと感じました。  

:::note info
しかし、単にハッシュ化するだけでは不十分で、**適切なアルゴリズムを選ばなければセキュリティが脆弱** になることもあります。
:::

そこで、**ハッシュ化の基本と実装方法を整理し、理解を深めるためにこの記事を書きました。** 

## ハッシュ化とは？

ハッシュ化とは、元のデータ（文字列やパスワードなど）を、**不可逆な固定長のデータ（ハッシュ値）** に変換する技術です。  

![Screenshot 2025-02-09 at 5.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/00e30fa0-5eb4-74a1-6979-eb2c497005ff.png)
引用画像：https://www.agent-grow.com/self20percent/2018/11/19/what-is-hash/

主に **パスワードの保存** や **データの整合性チェック** に利用されます。  

## 1. ハッシュ化の特徴

- **一方向性**  
  ハッシュ化されたデータから元のデータを復元できない（不可逆変換）。  

- **固定長の出力**  
  入力データの長さに関係なく、常に一定の長さのハッシュ値を生成。  

- **同じ入力 → 同じハッシュ値**  
  同じ入力データなら、常に同じハッシュ値が得られる。  

- **衝突耐性**  
  異なるデータが同じハッシュ値になりにくい（強いアルゴリズムほど衝突耐性が高い）。  
## 2. 代表的なハッシュアルゴリズム

| アルゴリズム | ハッシュ長 | 特徴 |
|-------------|-----------|------|
| **MD5** | 128bit（16バイト） | 速いが脆弱（推奨されない） |
| **SHA-1** | 160bit（20バイト） | MD5より安全だが、現在は非推奨 |
| **SHA-256** | 256bit（32バイト） | 一般的な用途に推奨される |
| **SHA-512** | 512bit（64バイト） | より強力なセキュリティが必要な場合に推奨 |
| **bcrypt** | 可変長 | パスワードハッシュ化に推奨（ソルト付き） |

## 3. Pythonでのハッシュ化の実装
### SHA-256 を使ったハッシュ化

このコードがやっていることを簡単に説明すると、入力された文字列を SHA-256 でハッシュ化し、そのハッシュ値を出力する という処理です。

```py
import hashlib

def hash_sha256(text):
    return hashlib.sha256(text.encode()).hexdigest()

# 実行例
password = "securepassword"
hashed_password = hash_sha256(password)
print(f"ハッシュ値（SHA-256）: {hashed_password}")
```

**実行結果（例）**

![Screenshot 2025-02-09 at 5.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2b54f1e5-25b6-1457-461a-00df888d6144.png)

- 「securepassword」 を **SHA-256 でハッシュ化** すると、このような固定長のハッシュ値が得られる。  
- **同じ入力なら、常に同じハッシュ値になる**（ハッシュの一貫性）。  
- **逆算（復元）は不可能**（一方向性がある）。  

## まとめ

ハッシュ化は、**データの一方向変換を行い、セキュリティを強化する重要な技術** です。  

:::note info
特に、**SHA-256 や bcrypt などの適切なアルゴリズムを選ぶこと** が、安全な認証システムの構築につながります。
:::

Python を使えば簡単にハッシュ化を実装できるので、**実際にコードを試しながら理解を深めていきましょう！**
個人的備忘録：認証の仕組みを実装する中で、Cookie とセッションの違いの言語化があいまいだったため、アウトプットしてみた

## はじめに

Webアプリケーションでは、ユーザーのログイン状態を維持するために **Cookie** や **セッション** が利用されます。  

:::note note
**特に、認証の仕組みを設計する際には、それぞれの特性を理解することが重要です。**
:::

本記事では **Cookie とセッションの違い、Cookie を利用したセッション管理、JWT との比較** について解説します。  

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

Webサービスを開発する中で、**「ログイン状態をどのように管理するのか？」** という疑問がよく出てきます。  

:::note warn
***特に、**Cookie・セッション・JWT の違いを理解しないまま実装すると、セキュリティリスクやスケーラビリティの問題が発生** することがあります。***
:::

そのため、それぞれの仕組みを整理し、**どのような場面でどれを選ぶべきかを考えるために**、この記事を書きました。

## 1. Cookie と セッションの違い

| 項目 | Cookie | セッション |
|------|--------|-----------|
| **データの保存場所** | クライアント側（ブラウザ） | サーバー側 |
| **データの管理方法** | キーと値のペアを保存し、クライアントに保持させる | サーバー側でユーザー情報を管理し、クライアントにはセッションIDのみ渡す |
| **セキュリティ** | クライアントで保存されるため盗まれやすい（改ざん・盗聴のリスクあり） | サーバー管理のため比較的安全（ただし、セッションIDの盗難には注意） |
| **有効期限** | 開発者が設定可能（数分～永続保存も可能） | 通常は短期間（ブラウザを閉じると無効化されるのが一般的） |
| **データのサイズ** | 4KBまで（サイズ制限あり） | 制限なし（ただし、メモリやストレージの使用量に注意） |
| **主な用途** | ユーザーの設定やトラッキング（例：サイトのテーマ、カート情報、ログイン状態の保持など） | ユーザーの認証情報やアクティブなログイン状態の管理 |

## 2. Cookie を利用したセッション管理

セッション管理の流れを簡単に表すと、以下のようになります。

```markdown
① ユーザーがログイン → サーバーで認証 → サーバーがセッション ID を発行  
　　　　　　　　　　　↘ サーバー上でユーザー情報を保持  
　　　　　　　　　　　↘ セッション ID を Cookie に保存 → クライアント（ブラウザ）

② 以降のアクセス時 → Cookie のセッション ID を送信 → サーバーでセッション ID を参照  
　　　　　　　　→ ユーザー情報を取得 → **ログイン状態を維持**
```

セッションは **Cookie を使って管理される** ことが多いですが、セッション自体は **サーバー側で管理** されます。

**① ユーザーがログイン**  
- ログインフォームで **メールアドレス・パスワード** を入力し、サーバーに送信。  
- サーバー側で **データベースの情報と照合し、認証を実施**。  

**② サーバーがセッション ID を発行**  
- 認証成功後、サーバーは **セッション ID を生成** し、サーバー上に一時的にユーザー情報を保持。  
- **セッション ID を Cookie に保存** し、クライアント（ブラウザ）に送信。  

:::note info
💡 **ここで Cookie が使われる！**  

- クライアントは **セッション ID を Cookie に保存** し、次回アクセス時にサーバーに送ることで、ログイン状態を維持する。
:::

**③ 以降のアクセス時**  
- ユーザーが次回アクセスすると、ブラウザの **Cookie に保存されたセッション ID を自動的に送信**。  
- サーバーは **セッション ID からユーザー情報を取得し、ログイン状態を確認**。  

## 3. Cookie を使わないセッション管理（JWT 方式）

通常のセッション管理は **「サーバー側で情報を保持する」** ため、  
スケーラビリティ（負荷分散）の課題があります。  

この問題を解決するために、最近では **JWT（JSON Web Token）** を使った認証方式が増えています。  

### JWT を使ったセッション管理の流れ

- **ユーザーがログイン → サーバーが JWT（トークン）を発行**  
- **JWT を Cookie ではなく、ブラウザの `localStorage` や `sessionStorage` に保存**  
- **リクエストごとに JWT を送信（セッション ID の代わりに）**  
- **サーバーは JWT の署名を検証し、ユーザーを特定**  

💡 **JWT は一度発行されると、サーバー側で情報を保持する必要がないため、スケーラブルな認証が可能。**  

## 4. Cookie・セッション・JWT の使い分け

| 方式 | メリット | デメリット | 用途 |
|------|---------|-----------|------|
| **Cookie** | 簡単に実装可能 | セキュリティリスクあり（盗聴・改ざん） | 軽い情報の保存（テーマ設定、言語設定） |
| **セッション（サーバー管理）** | 安全性が高い | サーバー負荷が増える | ログイン管理 |
| **JWT（トークン認証）** | スケーラブル、サーバーレス向き | 一度発行したトークンを無効化できない | API 認証、マイクロサービス |

## まとめ
Cookie は クライアント側で情報を保持 し、セッションは サーバー側で管理 されるため、用途によって使い分ける必要があります。

:::note info
***また、最近では JWT を利用した認証方式 も一般的になり、サーバーレスアーキテクチャとの相性が良いのが特徴です。***
:::

それぞれの特性を理解し、開発するアプリケーションに適した方法を選ぶことが重要です。
M5NanoC6、8x8の数字フォントを作って遊ぶ


参考


https://qiita.com/caa45040/items/574231109a31cb6c55eb


https://javl.github.io/image2cpp/


目的
8x8のLED用のフォントを作って、
予定は、未定としては、8x8 LEDのSNTP時計を
作って遊ぶ。
フォントを新しくつくるのは、フォントにも著作権があってうるさいから

仕様
Edge2を使用する
画像のサイズは、8x64 x2個　(特に意味なし)
0,1,2,3,4,5,6,7,8,9
全体を使った丸文字
1は、ハネなし
6,7,9は、ポチあり
2,9以外、下丸が大きい

Edge2でフォントを各

![o_coq804.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/db1a24cb-67fc-3921-dc3e-2c793de0fe80.jpeg)

![o_coq805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e531ff85-532d-9a4f-bd86-58e81e2c5977.jpeg)


image2cppで変換(後で手作業で少し編集)


```c++



// 'font8x8_0_9', 8x64px
unsigned char font8x8_0_9 [] = 
{

0x81, 0x7c, 0x7a, 0x76, 0x6e, 0x5e, 0x3e, 0x81, //0
0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, //1
0x81, 0x7e, 0xfe, 0xfe, 0xc1, 0xbf, 0x7f, 0x00, //2
0x81, 0x7e, 0xfe, 0xc0, 0xfe, 0xfe, 0x7e, 0x81, //3
0xe3, 0xdb, 0xbb, 0x7b, 0x00, 0xfb, 0xfb, 0xfb, //4
0x00, 0x7f, 0x7f, 0x01, 0xfe, 0xfe, 0x7e, 0x81, //5
0x81, 0x7e, 0x7f, 0x01, 0x7e, 0x7e, 0x7e, 0x81, //6
0x00, 0x7e, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, //7
0x81, 0x7e, 0x7e, 0x81, 0x7e, 0x7e, 0x7e, 0x81, //8
0x81, 0x7e, 0x7e, 0x7e, 0x80, 0xfe, 0xfe, 0xfe, //9

};


```
個人的備忘録：ユーザー認証とセッション管理の基本を3時間語れなかったので、記事にまとめてみた

## はじめに

Webアプリを作るとき、避けて通れないのが「**ログイン機能**」です。

:::note info
**ユーザー認証の仕組みは最初はややこしく感じますが、分解して考えると意外とシンプルです。**
:::

今回は、自分の理解を整理しつつ、ログインの流れやセッション管理についてまとめてみました。

## 書こうと思ったきっかけ
最近、ログイン機能を実装する機会があり、「**結局どんな仕組みで動いているのか？**」と疑問に思ったのがきっかけです。

:::note warn
**特に、セッション管理やJWTの違いについて調べる中で、整理しておきたいと感じました。**
:::

***同じように悩んでいる方にも参考になれば嬉しいです。***

## ユーザー認証の流れ

**ユーザーがログインフォームに情報を入力**  
- ユーザー名（またはメールアドレス）とパスワードを入力し、「ログイン」ボタンを押す。  

**サーバーが入力情報を検証**  
- フォームから送信された情報をサーバーが受け取り、データベース内のユーザー情報と照合する。  
- パスワードは通常、ハッシュ化（暗号化）されて保存されているため、ユーザーが入力したパスワードも同じ方法でハッシュ化し、一致するか確認する。  

**認証成功 or 失敗**  
- **成功**：セッションやトークンを発行し、ログイン成功を通知。  
- **失敗**：エラーメッセージを表示し、再試行を促す。  

## セッション管理の方法

ログイン後、ユーザーの状態を維持するために、以下のいずれかの方法でセッション管理を行う。

**セッションID（クッキー方式）**  

**仕組み：**  
- 認証成功後、サーバーは一意の「セッションID」を発行。  
- クライアントのブラウザに「クッキー」として保存。  
- 次回リクエスト時にセッションIDを送信し、サーバー側でユーザー情報を参照する。  

**特徴：**  
- 一般的なログイン方法  
- セッション情報はサーバー側で管理  

**JSON Web Token（JWT）**  

**仕組み：**  
- 認証成功後、サーバーは「JWTトークン」を発行。  
- トークンをブラウザの `localStorage` または `sessionStorage` に保存。  
- 以降のリクエスト時にトークンをヘッダーに含める。  

**特徴：**  
- サーバーがセッションを管理しなくてよい（スケールしやすい）  
- トークンが改ざんされにくい（秘密鍵で署名）  

## ログイン時のセキュリティ対策

**パスワードのハッシュ化**  
- パスワードは平文で保存せず、`bcrypt` や `argon2` などでハッシュ化する。  

**ブルートフォース攻撃対策**  
- 短時間で何度もログイン失敗するとアカウントをロックする。  

**CSRF対策（クロスサイトリクエストフォージェリ対策）**  
- CSRFトークンを使い、他サイトから不正リクエストが送られないようにする。  

**XSS対策（クロスサイトスクリプティング対策）**  
- JavaScript の `document.cookie` を使えないように、`HttpOnly` 属性をつける。  

## ログアウトの仕組み

**セッション方式の場合**  
- サーバー側のセッション情報を削除し、クライアント側のクッキーも無効化する。  

**JWT方式の場合**  
- クライアント側の `localStorage` や `sessionStorage` からトークンを削除する。  
- トークンの有効期限 (`exp`) を短めに設定しておく。  

## 実装の簡単な例（Flask）

```py
from flask import Flask, request, jsonify, session
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.secret_key = "secret"

# 仮のデータベース
users = {
    "honda": generate_password_hash("password123")
}

@app.route("/login", methods=["POST"])
def login():
    data = request.json
    username = data.get("username")
    password = data.get("password")

    if username in users and check_password_hash(users[username], password):
        session["user"] = username  # セッションにユーザーを保存
        return jsonify({"message": "ログイン成功"}), 200
    else:
        return jsonify({"message": "ログイン失敗"}), 401

@app.route("/logout", methods=["POST"])
def logout():
    session.pop("user", None)  # セッションを削除
    return jsonify({"message": "ログアウトしました"}), 200

if __name__ == "__main__":
    app.run(debug=True)
```

- ユーザー認証（パスワードのハッシュ化・照合）  
- セッション管理（ログイン・ログアウト）  
- API エンドポイント（`/login`・`/logout`）  

簡単なログイン機能としては十分ですが、実運用では **データベース管理・セキュリティ対策（JWT、CSRF 対策など）** を追加するのが一般的です！  

## まとめ
ログイン機能は、「ユーザーを確認し、その状態を維持する」仕組みです。

:::note warn
**セッションID（クッキー）方式やJWT方式、それぞれにメリット・デメリットがあり、状況に応じた選択が必要です。**
:::

また、セキュリティ対策も重要で、パスワードのハッシュ化やCSRF対策などを意識することが求められます。

***自分もまだ勉強中ですが、こうして整理することで理解が深まったように思います。***
AIが勝敗を判断してくれるWebカードゲームを作りたい!! 〜宣言だけ〜

# なぜ作るのか
仕事で得た知識を仮想プロダクトを作ってアウトプットしたいから

# どんなゲーム?
自分で考えた効果を持つカードを作って、AIが公平に判定してくれるWebサイト上で動く対戦ゲーム

※ベンチマーク
https://note.com/tararikurari/n/n74505e96717d

## 基本的な機能
### カード作成
攻撃力や体力などの基本能力値を自由に設定
カードの特殊能力を自然言語で自由に記述できる
例：「相手の攻撃力が50以上なら、自分の防御力を2倍にする」
例：「スピードが相手より高ければ、相手の体力を25%減らす」
### 対戦
作ったカードを1枚選んで対戦
対戦は非同期式
AIが両者のカードの能力や効果を理解して、勝敗を判定
### 特徴的な点
カードの効果は自由に書けるが、極端すぎる効果（「必ず勝利する」など）は禁止
スマートフォンでの操作を重視した設計
将来的にはレーティングシステムの導入も予定


詳しい基本設計は下記Notionに記載しました
https://fascinated-cyclamen-c2b.notion.site/AI-19447b4e5dfb8042b1ffe67894400f56


これからやること↓
## Phase 1: 開発基盤の構築

### ゴール

- 開発を効率的に進めるための基盤を整備する
- 本番稼働に向けた環境構築を完了する

### 主要マイルストーン

1. バックエンド技術選定
    - 言語・フレームワークの決定
    - ORMの選定
    - APIアーキテクチャの設計
    - データベースの選定
2. フロントエンド技術選定
    - フレームワークの決定
    - UIライブラリの選定
    - 状態管理手法の決定
    - ビルド環境の設定
3. 環境ごとのインフラ方針決定
    - 開発環境の構成
    - ステージング環境の構成
    - 本番環境の構成
    - CI/CD戦略の策定
4. プロジェクトセットアップ
    - リポジトリ構築
    - 開発環境構築
    - CI/CD パイプライン構築
    - 初期デプロイフロー確立

## Phase 2: コア機能の実装

### ゴール

- サービスの基本機能を実装し、最小限のプレイ体験を実現する

### 主要マイルストーン

1. 認証機能
    - ユーザー登録
    - ログイン/ログアウト
    - パスワードリセット
    - セッション管理
2. ユーザー管理
    - プロフィール情報管理
    - ユーザー設定
    - 権限管理
    - アカウント管理
3. カード作成
    - カードデータモデル実装
    - パラメータ設定UI
    - 効果入力システム
    - カードCRUD機能
4. バトル
    - 非同期バトルロジック
    - 対戦相手選択
    - AI判定システム連携
    - 結果表示

## Phase 3: ゲーム性・安定性の向上

### ゴール

- ユーザーエンゲージメントを高める機能を追加し、長期的な利用を促進する

### 主要マイルストーン

1. レーティング
    - レーティングシステム実装
    - マッチメイキング
    - ランキング表示
    - シーズン管理
2. バトル履歴
    - 詳細な戦績記録
    - バトルリプレイ
    - 統計情報表示
    - 検索・フィルター機能
3. サマリー
    - ダッシュボード実装
    - 統計グラフ表示
    - アチーブメント
    - 進捗管理
4. プロフィール拡充
    - カスタマイズ要素追加
    - 実績表示
    - プレイスタイル分析
    - ソーシャル機能
5. お気に入りカード
    - お気に入り管理
    - カード評価システム
    - デッキ構築
    - カード共有機能
Calendarクラスの機能

KotlinのCalendarクラスのよく使う機能をまとめる。

```kotlin
val days = Calendar.getInstance()
days.set(
    /* year = */ 2023,
    /* month = */ 3,
    /* date = */ 1,
    /* hourOfDay = */ 12,
    /* minute = */ 20,
    /* second = */ 40
)
println(days.time) // Sat Apr 01 12:20:40 GMT+09:00 2023
println(days.timeInMillis) // 1680319240903
```
`time`で現在時刻を返す。`timeInMillis`は1970年1月1日からの経過時刻をms単位で返す。`timeInMillis`を使用すれば`if`文で日数の比較を行うことができる。


```kotlin
val days = Calendar.getInstance()
val todayYear = days.get(Calendar.YEAR)
println(todayYear) // 2025
```
`Calendar.<取得したい時間>`をget()の引数に入れることで対象の時間を取得できる。`Calendar.MONTH`は`＋1`することに気を付ける。

```kotlin
val days = Calendar.getInstance()
println(days.get(Calendar.DATE)) // 1
days.add(Calendar.DATE, 4)
println(days.get(Calendar.DATE)) // 5
```
計算したい場合は`add`を使用することで可能。

#### 参考
https://android.techblog.jp/archives/8116670.html
Ubuntu24.04でcapslockで日本語入力と直接入力を切り替える

# なんかめっちゃ時間無駄にした。
これ、誰が、無変換とか変換とかカタカナひらがなキーで変換すんねん。だれもやらんやろ。知らんけど。

とちょっとキレそうになりながら色々弄くっていたので共有します。たぶん多くの人がこれで困ってる。なお、動作は保証しません。GNOME tweakとかでCapslockの動きを色々いじったのですが、できませんでした。



原因は、Capslockをオフにすると、`Eisu`もオフになること。これがややこしい。なので、Eisuは生きてて、CapsLockを殺すシェルを書いてみました。たぶん動きます。知らんけど。



# Mozcをインストールする。
```terminal
oruser@ubuntu12-04:~$ sudo apt-get install ibus-mozc  
[sudo] password for oruser: 
```
これをしたら再起動する。

まぁ、ここまでは皆さんやっているでしょう。

# mozcの設定を変える
### ①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/32c0d2ab-73aa-54fb-f9a6-0649e36a2d0e.png)
右上の「あ」とか[A]とかの入力設定をクリックして、ツールからプロパティを選択します。

### ②
すると以下のような画面が出てくるので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/b3334ef6-b97b-49d6-b97a-58161a5ab0fc.png)
キー設定→キー設定の選択→編集を選択します。

### ③
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3337685/d83053ed-f5bd-84dd-6ef1-8240b549f7b3.png)

入力キーでソートして、`Eisu`の行のもののコマンドをそれぞれ上記のものに変更します。

### ④
するとおそらく、ある程度はできるようになりますが、未だにcapslockの本来の機能が生きていると思います。これを消します。

https://github.com/BB-KING777/anti-Ubuntu-capslock-for-Japanese

このリポジトリの.shを実行すると消えます。
```shell
$ chmod +x anti-Ubuntu-casplock-for-Japanese
$ ./anti-Ubuntu-casplock-for-Japanese
```
これやったあとに、ibus restartか再起動すると適応されます。
```
$ reboot
```

もし使えなかったら中身を一行一行ターミナルで実行してみてください。

これで、windowsのように使えるようになります。たぶん。
Railsの実装まで①立ち上げ~画像処理編

備忘録

### アプリケーション作成からサーバー立ち上げ
まずはターミナルで以下コマンドを実行してアプリケーションを作成。
（XXXは任意のアプリケーション名）
```ターミナル
$ rails new XXX
```

cdコマンドでアプリケーションのファイルに移動する。
```ターミナル
$ cd XXX
```


これだけだとサーバーは立ち上がらない（省略）ので、おまじないのプラグインを実行。
```ターミナル
$ yarn add @babel/plugin-proposal-private-methods @babel/plugin-proposal-private-property-in-object
```

これでサーバーを立ち上げることができる。
```ターミナル
$ Rails s -p 8080
```
### Topページ作成
Rails sをした際に表示されるページを定義して、表示されるようにする。

```config/routes.rb
Rails.application.routes.draw do
root to: "homes#top"
end
```
### ActiveStorageのインストール
画像を扱う場合ActiveStorageをインストールしておく。
```ターミナル
$ rails active_storage:install
```
実行すると、db/migrate内にActiveStorageのマイグレーションファイルが作成されるので、マイグレート。
```ターミナル
$ rails db:migrate
```
### Rails側で画像サイズの変更を行う場合
CSS側とRailsで画像サイズを変更する２通りがありますが、ここではRails側でリサイズする場合の設定を行う。

まずはGemfileの記述をいじる。
```Gemfile　
# gem 'image_processing', '~>1.2'
```
から
```Gemfile
gem 'image_processing', '~>1.2'
```
Gemfileをいじったらbundle installを実行。
```
$ bundle install
```
また、以下記述を加えます。
```config/environments/development.rb
 config.active_job.queue_adapter = :inline
```

これで、Railsで画像のサイズ変更をする準備が完了。
画像は任意のものをVS code上のapp/assets/imagesに入れる。
※ActiveStorageは大き過ぎるファイルはエラーを吐く可能性があるので注意。
メモ 攻撃者をだます(?) ネイティブ関数だと誤解させる

通常のネイティブ関数を開発者ツールのコンソールでたたくと(`[].map`)
```
map() { [native code] }
```
これ！通常のJavaScriptでも再現できそう
```js
let nativecode;
function map() { [nativecode] } 
```
これをコンソールでたたく
```
map() { [nativecode] }
```
まあまあ見分けつかない。
間のスペースはどうしても再現できない。
Next.js - `npx tailwindcss init` fails with `npm error could not determine executable to run`

# Problem
I tried to initialize Tailwind CSS in my Next.js project but encountered the following error:
```bash
> npm install tailwindcss @tailwindcss/postcss postcss autoprefixer

> npx tailwindcss init -p  
npm error could not determine executable to run
npm error A complete log of this run can be found in: ###
```
### Environments
- Node.js: v22.13.1
- npm: 11.1.0
- Windows 11 Home

# Solution
I tried the following command instead, and it worked for me:
```bash
> npx tailwindcss-cli@latest init
Created Tailwind CSS config file: tailwind.config.js
```

:::note warn
Although `npx tailwindcss init -p` also generates `postcss.config.js`, the solution one doesn't. You should create it manually.

```js:postcss.config.js
const config = {
  plugins: {
    "@tailwindcss/postcss": {},
  },
};
export default config;
```
:::
Reference:

https://tailwindcss.com/docs/installation/framework-guides/nextjs

You might also find this GitHub issue helpful:

https://github.com/tailwindlabs/tailwindcss/issues/2831#issuecomment-731038281

> I had trouble generating the configuration file while using the compatibility package. I updated my tailwindcss, postcss, and autoprefixer packages to the latest versions and this allowed me to generate a configuration successfully. I then downgraded my packages back to the compatibility versions.
> ```bash
> npm uninstall tailwindcss postcss autoprefixer
> npm install tailwindcss@latest postcss@latest autoprefixer@latest
> 
> npx tailwindcss init -p
> 
> npm uninstall tailwindcss postcss autoprefixer
> npm install tailwindcss@npm:@tailwindcss/postcss7-compat postcss@^7 autoprefixer@^9
> ```

Also, don't forget to add these lines in `globals.css` for later steps.
```css
@import "tailwindcss";
@tailwind base;
@tailwind components;
@tailwind utilities;
```
☆2^0、　2^ -1の解説


２．　☆2^0、　2^ -1の解説

まず2^3，2^2，2^1 のように，指数が正の整数で，指数が１ずつ減っていくときを考えます。
これは，２で割っていく，つまり　
1/2倍しているのと同じと考えられます。


￼

次に，2^0，→2^-1 ･･･のときも同様に1/2倍していると定義することにします。

そこで，指数が0や負の整数である2＾0 ，2^-1， 2^-2 ， 2^-3をそれぞれ計算してみましょう。
2^0＝2^1×1/2＝1、
2^-1＝1×1/2＝1/2、
2^-2＝1/2×1/2＝1/4、
2^-3＝1/4×1/2＝1/8

このように，2^0 ， 2^-1の値を考えることができますね。

さらに，表記のしかたを少し変えてみましょう。
￼2^-1＝1/2＝1/2^1
2^-2＝1/4＝1/2^2
2^-3＝1/8＝1/2^3

と書きかえることができます。つまり，n を正の整数とすると，
￼2^-n＝1/2^n＝（1/2）^n

と表せます。そこで，  　　「マイナス○乗」のときは，「分数の○乗」にする！  と覚えておきましょう。