OmniAICreator/Qiita-1.07M huggingface dataset:
🚀 【初心者向け】Travis CIで環境変数を設定＆docker-composeに渡す方法

## はじめに 
こんにちは！  
今回は **Travis CI** での環境変数の設定方法と、 **docker-compose** に渡す方法を解説します！  

「APIキーを安全に扱いたい！」「docker-compose で CI/CD を回したい！」  
そんなあなたにピッタリの記事です✨  
これを読めば **Travis CIの環境変数設定＆手動実行がサクッとできる** ようになります！  

それでは、レッツゴー！💨  

## 🎯 この記事でわかること
- **Travis CIで環境変数を設定する方法**
- **.travis.yml で環境変数を docker-compose に渡す方法**
- **手動でビルドを実行する方法**

## 🛠 Travis CIで環境変数を設定する

まずは、Travis CI の **管理画面で環境変数を設定** します！  
これを使えば、**APIキーやデプロイトークンを安全に管理** できます💡  

### 📌 手順
1. [Travis CI](https://travis-ci.com/) にログイン  
2. **対象リポジトリ** を開く  
3. **「More Options」 → 「Settings」** をクリック  
4. **「Environment Variables」** のセクションを探す  
5. 「Name」に **環境変数名**、「Value」に **値** を入力  
6. **「Add」ボタンを押して登録**  
7. **「Display value in build log」 は無効化（デフォルトのままでOK！）**  

🔹 **注意！**  
`Display value in build log` を有効にすると、**ビルドログに環境変数の値が丸見え** になってしまうので、基本的に **無効のままにしておきましょう** ⚠️  

## 🐳 `.travis.yml` で環境変数を docker-compose に渡す

Travis CI で設定した環境変数を、 `.travis.yml` を通じて **docker-compose に渡す方法** を解説します！  
ここがちょっとしたポイントですが、 `-e` オプションを使えば簡単に解決できます✨  

### 🚀 方法①: `docker-compose run` に `-e` をつける
```yaml
script:
  - docker-compose up -d --build
  - docker-compose run --rm app ./deploy.sh -e DEPLOY_TOKEN=$DEPLOY_TOKEN
```
👆 こうすることで、 `DEPLOY_TOKEN` の値が **コンテナ内に渡されます** 🎉
✨ 個人的にはこれが一番好き✨

### 📝 方法②: `docker-compose.override.yml` で環境変数を設定
```yaml
version: '3'
services:
  app:
    environment:
      - DEPLOY_TOKEN=${DEPLOY_TOKEN}
```
これなら、 `.travis.yml` 側で `docker-compose.override.yml` を適用すればOKです👌  

### 💡 方法③: `.env` ファイルを使う
「`.env` に書いてコンテナで読み込ませたい！」という場合は、 `.travis.yml` の `before_script` で `.env` を作成すればOK！  
```yaml
before_script:
  - echo "DEPLOY_TOKEN=$DEPLOY_TOKEN" > .env
```
こうしておけば、コンテナが `.env` を読み込んでくれるので便利ですね🙌  

## 🔄 Travis CIで手動実行する方法

Travis CI は **GitHubにプッシュしたタイミング** で自動的にビルドを開始しますが、  
「**手動で実行したい！**」 というときは **管理画面からポチッと再実行** できます💡  

### 🎯 方法
1. [Travis CI](https://travis-ci.com/) にログイン  
2. **対象のリポジトリ** を開く  
3. **「Restart Build」ボタンを押す**  
4. ビルド開始！🎉   

とっても簡単ですね✨  

## 🌟 まとめ

| 機能 | 方法 | おすすめ度 |
|------|------|------|
| 環境変数の設定（GUI） | Travis CI管理画面で設定 | ✅ 超おすすめ |
| 環境変数の渡し方（docker-compose） | `-e DEPLOY_TOKEN=$DEPLOY_TOKEN` を使う | ✅ おすすめ |
| `.env` の設定 | `before_script` で `.env` を作成 | ✅ 便利！ |
| 手動実行（GUI） | 「Restart Build」ボタンを押す | ✅ かんたん |

**Travis CIの環境変数設定は、管理画面で設定＆`.travis.yml` で受け取るのが王道！**  
docker-compose を使う場合も、 `-e` オプションをつけるだけなので超簡単ですね✨  

## 🎉 最後に

これで **Travis CI の環境変数設定＆手動実行の基本** はバッチリです！  
CI/CD をうまく活用すれば、開発がグッと楽になるのでぜひ試してみてください🙌  

**この記事が役に立ったら、ぜひ「LGTM」してくれると嬉しいです！** 💖  
では、また次回の記事でお会いしましょう👋
クロック信号の遅延シミュレーション

# クロック信号の遅延シミュレーション

## 1. はじめに
電子回路設計において、クロック信号の遅延は重要な要素の一つです。本記事では、Pythonを用いてクロック信号の遅延をシミュレーションする方法を紹介します。特に、指定した遅延時間後にクロック信号が発生するような状況をシミュレーションし、結果をグラフで可視化します。

## 2. シミュレーションの設定
本シミュレーションでは、以下のパラメータを設定しています。

- **サンプリング周波数**: 10 MHz (fs = 10e6)
- **クロック周波数**: 1 MHz (f_clk = 1e6)
- **遅延時間**: 100 μs (delay_time = 100e-6)
- **シミュレーション時間**: 500 μs (duration = 500e-6)

遅延時間が指定されたシミュレーション時間を超えないように制御しながら、クロック信号を生成します。

## 3. Pythonコードの解説
以下に示すコードでは、NumPyとMatplotlibを使用してクロック信号の遅延をシミュレーションし、結果をプロットします。

```python
import numpy as np
import matplotlib.pyplot as plt

# ダミーデータを設定
fs = 10e6  # サンプリング周波数 (10 MHz)
f_clk = 1e6  # クロック周波数 (1 MHz)
delay_time = 100e-6  # 遅れ時間 (100 μs)
duration = 500e-6  # シミュレーション時間 (500 μs)

# 時間軸の作成
t = np.arange(0, duration, 1/fs)  # 指定されたサンプリング周波数

# クロック信号の生成
clock_signal = np.zeros_like(t)  # 初期状態は0

# 遅れ時間が duration を超えないようチェック
if delay_time < duration:
    start_index = np.where(t >= delay_time)[0][0]  # 遅れ時間後の開始インデックス
    clock_signal[start_index:] = 0.5 * (1 + np.sign(np.sin(2 * np.pi * f_clk * t[start_index:])))
else:
    print("Error: delay_time is greater than or equal to duration. No clock signal generated.")

# グラフのプロット
plt.figure(figsize=(12, 6))  # 拡大表示
plt.plot(t * 1e6, clock_signal, label="Clock Signal ({:.1f} MHz after {:.1f} μs delay)".format(f_clk/1e6, delay_time*1e6))
plt.axvline(x=delay_time * 1e6, color='r', linestyle='--', label="Delay End ({:.1f} μs)".format(delay_time*1e6))
plt.xlabel("Time [μs]")
plt.ylabel("Clock Signal")
plt.title("Clock Signal Simulation ({:.1f} MHz Sampling Rate)".format(fs/1e6))
plt.legend()
plt.grid()
plt.xlim(delay_time * 1e6 - 10, delay_time * 1e6 + 50)  # 遅れ時間周辺を拡大
plt.show()
```

## 4. 実行結果と考察
このコードを実行すると、クロック信号が指定した遅延時間後に開始し、周期的に変化する様子が確認できます。赤い破線は、クロック信号が開始する遅延時間を示しています。

### **主なポイント:**
- `np.arange(0, duration, 1/fs)` により時間軸を生成。
- `np.sign(np.sin(2 * np.pi * f_clk * t[start_index:]))` を用いてクロック信号を生成。
- 遅延時間 `delay_time` を考慮し、クロック信号の開始タイミングを制御。
- `matplotlib` を使用してグラフを描画し、遅延時間の影響を視覚的に確認。

## 5. まとめ
本記事では、Pythonを用いたクロック信号の遅延シミュレーションの方法を紹介しました。クロック信号の遅延は、デジタル回路の動作に大きな影響を与えるため、設計時に適切な評価が必要です。本シミュレーションを活用することで、遅延の影響を事前に確認し、設計に反映することが可能となります。

今後は、より複雑な波形のシミュレーションや、異なる周波数での影響を調査することも考えられます。

```
def print_delay_info(frequency, delay_time):
    """
    周波数と遅れ要素時間を入力とし、周期および計算結果を出力する関数
    :param frequency: 周波数 (Hz)
    :param delay_time: 遅れ要素時間 (秒)
    """
    # 周期の計算 (T = 1 / f)
    period = 1 / frequency
    
    # 遅れ要素時間 + 1 ÷ 周波数 の計算
    calculated_value = delay_time + period

    # 結果の表示
    print(f"周波数 (Hz): {frequency}")
    print(f"周期 (秒): {period:.6f}")
    print(f"遅れ要素時間 (秒): {delay_time:.6f}")
    print(f"遅れ要素時間 + 1 ÷ 周波数 (秒): {calculated_value:.6f}")

# パラメータ設定 (例: 440Hz の信号, 遅れ要素時間 10ms)
frequency = 440  # Hz
delay_time = 0.01  # 秒 (10ms)

# 計算と出力
print_delay_info(frequency, delay_time)


```
assert_selectメソッド

assert_selectメソッドは、コントローラのアクション実行後のレスポンスHTML内の特定の要素を検証するためのアサーションメソッドです。

以下はその中でも、HTML内のボタンを押した時に、指定したURLページに飛ぶかを試すコードである。
```ruby
require "test_helper"

class SiteLayoutTest < ActionDispatch::IntegrationTest

  test "layout links" do
    get root_path
    assert_template 'static_pages/home'
    assert_select "a[href=?]", root_path, count: 2
    assert_select "a[href=?]", help_path
    assert_select "a[href=?]", about_path
    assert_select "a[href=?]", contact_path
  end
end

```

以下は、対応するHTMLを探すメソッド。

```ruby
assert_select "div"	             <div>foobar</div>
assert_select "div", "foobar"    <div>foobar</div>
assert_select "div.nav"	         <div class="nav">foobar</div>
assert_select "div#profile"	      <div id="profile">foobar</div>
assert_select "div[name=yo]"	    <div name="yo">hey</div>
assert_select "a[href=?]", '/', 　<a href="/">foo</a>
```

左のコードを書くことで、右のHTMLコードが存在するかを探すことができる。

```ruby
assert_select "a[href=?]", root_path, count: 2
```

上記のコードは「？」にroot_pathが入ることで、

```html
<a href="/"> </a>
```

が存在するかどうかを確かめてくれる。

ちなみに、「count: 2」というのは、「そのコードが２回存在することをテストする」コードである。
Power Queryで西暦から和暦を計算する(カスタム関数)

[Power Query：西暦から和暦を計算する - なんでもエクセル（Nandemo Excel）](https://nandemo-xl.hatenablog.com/entry/2022/12/01/165728)を参考にカスタム関数で和暦変換。


:::note warn
令和元年と出るようにしています。
:::

``` M
(inputDate as date) as text =>
let
    // 元号の開始日と名称のリスト
    eras = {
        [Name = "令和", StartDate = #date(2019, 5, 1)],
        [Name = "平成", StartDate = #date(1989, 1, 8)],
        [Name = "昭和", StartDate = #date(1926, 12, 25)],
        [Name = "大正", StartDate = #date(1912, 7, 30)],
        [Name = "明治", StartDate = #date(1868, 1, 25)]
    },
    // 入力日付に対応する元号を特定
    currentEra = List.First(List.Select(eras, each inputDate >= _[StartDate])),
    // 和暦年の計算
    eraYear = Date.Year(inputDate) - Date.Year(currentEra[StartDate]) + 1,
    // "元年"の処理
    eraYearText = if eraYear = 1 then "元年" else Text.From(eraYear) & "年",
    // 和暦日付の組み立て
    warekiDate = currentEra[Name] & eraYearText & Date.ToText(inputDate, "M月d日")
in
    warekiDate
```


# 使い方
1. 空のクエリ→詳細エディタにして上記コードを入力
1. 列の追加→カスタム関数の呼び出し
fullPage.jsでスクロールを遅延させ、アニメーションが完了するまで待機する方法

## はじめに

fullPage.jsのアニメーションを遅らせ、アニメーションが完了した後にスクロールを実行したい場合は、[`beforeLeave` コールバック](https://alvarotrigo.com/fullPage/docs/ja/#beforeleave-origin-destination-direction-trigger)を使用できます。

このコールバックで `false` を返すと、スクロールは実行されません。

この機能を利用して、コールバック内に独自のロジックを追加し、スクロールをトリガーするタイミングを制御できます。

## JavaScript コード

次のコード例では、4回スクロールしないと次のセクションへスクロールできないように設定しています。

```js
var cont = 0;
new fullpage('#fullpage', {
    beforeLeave: function(origin, destination, direction, trigger){

        // 4回スクロールするまではスクロールを防ぐ
        cont++;
        return cont === 4;
    }
});
```
## CodePen の例
では、アニメーションが完了した後にスクロールできるようにするにはどうすればよいでしょうか？

デモをご覧ください：

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="dydeVWY" data-pen-title="fullPage.js delay scroll until animation finishes GSAP" data-user="alvarotrigo" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;"> <span>ペンを見る  <a href="https://codepen.io/alvarotrigo/pen/dydeVWY"> fullPage.js アニメーション完了後にスクロールを遅延 GSAP</a> by Álvaro (<a href="https://codepen.io/alvarotrigo">@alvarotrigo</a>) on <a href="https://codepen.io">CodePen</a>.</span> </p> <script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
中堅バックエンドエンジニアが考える、技術特化型キャリアパスの4つの選択肢


## はじめに
こんにちは！  

みなさんは、**エンジニアとしてどんなキャリアを目指せばいいんだろう？** って悩んだことはありませんか？  
「マネジメントには興味ないけど、スキルアップしたい…」「技術を極めるって具体的にどういうこと？」みたいな感じで。  

今回は、そんな疑問を持っていた私が、**技術特化型の中堅バックエンドエンジニアとして、どんな道を進めばいいのか**を整理した話をシェアします！  

## 1. ざっくり経歴
まずは、これまでのキャリアをざっくり振り返ってみます。

- **工業高校（情報技術科）卒業後、SIer（A社）に入社**
  - 流通業向け業務システムの開発に従事
  - 1年目：プログラミング中心
  - 2年目：概要設計〜結合テストまで担当
- **知識不足を痛感し、専門学校へ進学**
- **在学中、B社（携帯ショップ）で営業販売**
  - 退社前には**エリアの売上トップ**を獲得！（エンジニアと全然関係ないけどw）
- **C社に入社し、バックエンド開発を担当**
  - **マイクロサービス化**のリファクタリング
  - **ローカル開発環境の自動構築ツール開発**
  - **要件定義〜運用・障害対応**まで幅広く担当

バックエンドエンジニアとして、いろいろな業務を経験してきたものの、  
「この先どう成長していけばいいんだろう？」とふと立ち止まることがあった。

## 2. キャリアの方向性を考えてみる
キャリアパスを考えるにあたり、まずは自分の適性や興味を整理してみました。

### **Q1. 極めたい分野は？**
→ **バックエンド開発！**  
やっぱりコードを書くのが好き。  
特に**システムのアーキテクチャ設計やパフォーマンス最適化**に興味がある。

### **Q2. どんな業務にやりがいを感じる？**
→ **PCを使って持ちうる知識を総動員しながら、課題を解決するのが楽しい！**  
加えて、それが誰かの役に立ったり、褒められたりするとモチベ爆上がり。

### **Q3. これから伸ばしたいスキルは？**
→ **設計スキル、技術リーダーシップ、AWSや認証系、AIの活用**  
最近、認証周りに関心が出てきたのと、AIを業務改善に活かせたら面白そうだなと感じている。

### **Q4. マネジメントに興味はある？**
→ **興味なし！**  
ADHDの傾向もあり、スケジュール管理やヒューマンマネジメントは苦手。  
技術を極める方向でキャリアを考えたい！

### **Q5. 現職で挑戦したいことは？**
→ **パフォーマンス最適化、業務改善ツール開発、リファクタリング、リプレイス**  
現場の課題を技術で解決するのが好きなので、この方向でスキルを伸ばしたい。

### **Q6. フリーランスや副業は？**
→ **何度かトライしたけど、営業が無理だった…**  
組織に属するほうが楽だと感じるので、会社員エンジニアとして成長する方向が良さそう。

## 3. 技術特化型バックエンドエンジニアに適したキャリアパスの選択肢
エンジニアとして技術を極める道は色々あるけど、自分に合ったキャリアを選ぶことが大事！  
というわけで、**技術特化型のバックエンドエンジニア向けのキャリアパス**をまとめてみました。

### **👨‍💻 コードを書くのが大好き！実装を極めたい人**
➡️ **シニアバックエンドエンジニア**
- 設計スキルを磨きつつ、実装も続けたい
- **アーキテクチャ改善やリファクタリング**を主導したい
- AWSや認証系の知識を活かしたい

### **🛠️ システム全体の設計や技術選定をやりたい人**
➡️ **アーキテクト**
- コードを書くよりも、技術的な意思決定をしたい
- マイクロサービスやシステム設計に携わりたい
- **技術選定・設計レビュー**をリードしたい

### **🚀 信頼性や運用の最適化が好きな人**
➡️ **SRE（Site Reliability Engineer）**
- パフォーマンス最適化や障害対応を極めたい
- AWSやKubernetesなどのインフラ知識を活かしたい
- モニタリングや運用自動化を推進したい

### **🔬 特定の技術領域を究めて企業内のエキスパートになりたい人**
➡️ **テックスペシャリスト**
- 設計・パフォーマンス最適化・リファクタリングに専念したい
- 技術カンファレンス登壇や技術記事執筆で影響力を持ちたい
- **技術に特化し、企業の技術的意思決定に関与**したい

## 4. 私の場合は…？
私の場合、「**コードを書くのが好きで、設計やパフォーマンス最適化も興味がある**」ので、  
**シニアバックエンドエンジニア → アーキテクト or SRE → 技術スペシャリスト** の流れが良さそう！  

特に、AWSや認証系の知識を深めながら、設計スキルを磨いていくのが今後の方向性になりそうです。  
実際に現職でも、パフォーマンス最適化や業務改善ツールの開発に力を入れているので、このままスキルを積んでいきたいので、頑張ってみます！

## **おわりに**
今回、キャリアについてじっくり考えてみた結果、  
「**マネジメントじゃなくても技術を極める道はたくさんある！**」と再確認できました。  

同じように悩んでいる方の参考になれば嬉しいです！  
みなさんはどんなキャリアを目指していますか？ コメントで教えてください！
それでもGoogleアカウントを作りたい「この電話番号はすでに何度も使用されています」

# この記事では
Googleアカウントを新規作成する際に電話番号が弾かれる場合の回避法を記しました。  
※2025/04/30修正：iPhoneでも有効との報告を受けて記述を修正しました。

# 状況
新しいGoogleアカウントが必要になったため、PCでブラウザを立ち上げて作成作業を進めていたところ、電話番号を認証するステップで次のような文章が表示されてエラーになりました：
『この電話番号はすでに何度も使用されています』

電話番号を使わない方法も提案されず、時間をおいてトライしても変わりません。すっかり困ってしまいました。

# 原因
Googleのポリシーが変更されたようです。新しいアカウントを作成する際の認証において、すでにいくつかのアカウントと連携されている電話番号が使えなくなりました。

# 回避方法
スマートフォンのGmailアプリからアカウントを作成することで電話番号認証を回避できます。
※<del>Androidで確認。iPhoneでも可能かどうかは不明です。</del>  
　→@masa0902devさんよりiPhoneでも可能との報告がありました(コメントを参照ください)

トリックは以下の通りです：
・アカウント作成ではモバイル端末での認証が必要になる。PCで作成する場合は「SMS認証」を使わざるを得ない→電話番号が要求される
・スマホの場合は端末で認証が可能→電話番号は不要

なお、作成したアカウントに「再設定用の電話番号」として件の電話番号を登録することは可能でした。
Linuxコマンド入門：フォアグラウンドとバックグラウンドの違いをまとめ、実際にコマンドを実行してみた

## はじめに
LinuxやMacのターミナルを使う際、コマンドを実行する方法には「フォアグラウンド」と「バックグラウンド」の2種類があります。

この記事では、それぞれの実行方法や操作方法をシンプルに解説します。

## 書こうと思ったきっかけ
普段ターミナルを使っていて、「**この処理が終わるまで待つのが面倒**」「**実行したコマンドを一時的に止めたい**」と思うことがありました。

フォアグラウンドとバックグラウンドの使い分けを理解すると、より快適にターミナルを操作できるので、まとめてみました。

## フォアグラウンドで実行
```bash
sleep 30
```
この場合、コマンドが完了するまでターミナルの操作はできません。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 23.45.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/db03ffe2-5158-4b43-abe0-fde3b112163c.png)

## バックグラウンドで実行
```bash
sleep 30 &
```
`&` を付けるとバックグラウンドで実行でき、すぐに次の操作ができます。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 23.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/8b08fd28-e50f-4b91-a2a3-4b9e6f59bf2a.png)

## フォアグラウンドに戻す
```bash
fg
```
`fg` コマンドでバックグラウンドのプロセスをフォアグラウンドに戻せます。

## 一時停止 → バックグラウンドで再開
1. `Ctrl + Z` で一時停止
2. `bg` でバックグラウンドで実行再開

## 実行中のジョブを確認
```bash
jobs
```
バックグラウンドで実行中のジョブを一覧表示できます。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 23.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9fe64b7a-516b-4374-be2e-7c25209db4b5.png)

## バックグラウンドのプロセスを終了
```bash
kill %1  # ジョブ番号1を終了
```
`jobs` で確認したジョブ番号を指定して終了できます。

## まとめ
フォアグラウンドとバックグラウンドの使い分けを知ると、ターミナルでの作業がより効率的になります。

特に、長時間実行するコマンドはバックグラウンドに回すと便利です。**ぜひ活用してみてください！**
Kubernetes でのコンテナビルド＆デプロイを Makefile で簡単に実行する

Kubernetes の環境構築時に、Docker イメージのビルドや kind へのロード、リソースの適用を手動で行うのは面倒ですよね？
そこで、`Makefile` を活用して、シンプルに `make k8s-build-start` で一括実行できるようにしました！🚀

---

## 🎯 目標
- Kubernetes クラスター (`kind`) の作成
- Docker イメージのビルド＆kind へのロード
- Kubernetes リソース（PVC、ConfigMap、Deployment）の適用
- `make k8s-build-start` で簡単にデプロイできるようにする

---

## 1️⃣ シンプルな構成のシェルスクリプト

### `kubernetes-build-start.sh`

```bash:title=kubernetes-build-start.sh
#!/bin/bash
set -e  # エラーが発生したら停止

# 使用するサービス一覧
SERVICES=("backend" "frontend" "database")

# kind クラスターの作成
kind create cluster --name my-cluster || echo "✅ kind クラスターは既に作成済み"

# Docker イメージのビルド＆kind へのロード
echo "🚀 Docker イメージをビルド＆ロード中..."
for service in "${SERVICES[@]}"; do
  docker build -t "$service:latest" "./$service"
  kind load docker-image "$service:latest" --name my-cluster
  echo "✅ $service のビルド＆ロード完了"
done

# Kubernetes リソース適用
echo "🚀 Kubernetes リソースを適用..."
kubectl apply -f k8s/

echo "🎉 全てのデプロイが完了しました！"
```

---

## 2️⃣ Kubernetes の構成ファイル

### `k8s/deployment.yaml`

```yaml:title=k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: backend
spec:
  replicas: 1
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: backend
        image: backend:latest
        ports:
        - containerPort: 8080
```

### `k8s/service.yaml`

```yaml:title=k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
```

---

## 3️⃣ `Makefile` で簡単実行

### `Makefile`

```makefile:title=Makefile
k8s-build-start:
	bash kubernetes-build-start.sh
```

---

## 4️⃣ 使い方

1. `make k8s-build-start` を実行

```sh
make k8s-build-start
```

2. デプロイが完了！

```sh
kubectl get pods
```

---

## 🎉 まとめ

これで、
✅ `make k8s-build-start` で Kubernetes の環境構築が一瞬で完了！
✅ シンプルな `Makefile` とシェルスクリプトで管理がラク！
✅ Docker ビルド、kind へのロード、Kubernetes の適用がワンコマンド！

ぜひ試してみてください！🚀
AWS SAA備忘録記事⑨〜セキュリティ関連サービスとサーバーレスアーキテクチャ2〜

# はじめに
本記事では、セキュリティ関連サービスとサーバーレスアーキテクチャについて解説します。


# セキュリティ系サービス

### IAM（Identity and Access Management）

#### IAMロールとクロスアカウントアクセス
外部WEBアプリケーションなど、第三者がAWSリソースにアクセスする必要がある場合の安全な方法は下記である。

1. 必要最小限のアクセス権限を付与したIAMポリシーを設定
2. クロスアカウントアクセスが可能なIAMロールを作成
3. 第三者のWEBアプリケーションにそのロールを設定

クロスアカウントアクセスが可能となるIAMロールの作成手順は下記である。
1. AWSマネジメントコンソールで「IAMロールの作成」を選択
2. 最初のステップで「信頼ポリシー」を設定
3. 「このロールを誰が使えるか」を定義（外部アプリケーションのAWSアカウントIDを入力）
4. 「アクセス許可ポリシー」を作成・アタッチ

#### ウェブIDフェデレーション
ユーザーがGoogleなどの外部のIDプロバイダーを使用してアプリケーションにサインインできるようにする機能。
認証トークンを受け取ったら、そのトークンをAWSリソースを使用するためのアクセス許可を持つIAMロールにマッピングして、AWSの一時的セキュリティ認証情報に変換する。

アプリケーション内部に長期的なセキュリティ認証情報を保持する必要がなくなり、セキュリティが向上する。

### 2. AWS Secrets Manager / Systems Manager パラメータストア

#### AWS Secrets Manager
データベースの認証情報やAPIキーなどのシークレット情報を安全に管理するためのサービス。
ユーザー認証情報を自動的にローテーションする機能がある。

#### AWS Systems Manager パラメータストア
設定データやシークレット情報を階層的に保存・管理するためのサービス。

### AWS WAF
CloudFrontに転送されるHTTPおよびHTTPSリクエストをモニタリングして、WEBアクセスの拒否ルールなどを設定できるウェブアプリケーションファイアウォール。

#### Referer制限
HTTPリクエストに含まれているページURLに基づいて、そのURLリンクへのリクエストを制限する機能。外部リンクから自分のサイトに置いてあるファイルをダウンロードされたくない場合などに利用する。

### AWSプライベートリンク

VPCとAWSのサービスエンドポイント間のプライベート接続を提供し、パブリックインターネットを通過せずにAWSサービスにアクセスできるようにする。

#### VPCエンドポイント
インターネットを経由することなくAmazon EC2インスタンスからAmazon S3 APIなどを呼び出すためには、VPCエンドポイントを介して接続するように構成する。

- ゲートウェイエンドポイント
  S3やDynamoDBなどのサービスに接続する場合に使用

- インターフェースエンドポイント
  その他のAWSサービスに接続する場合に使用

# コンテンツ配信系サービス

### CloudFront

#### 署名付きURLと署名付きCookie
CloudFrontにおいて署名付きURLおよび署名付きCookiesを利用することで、Amazon S3の事前署名付きURLと同じような効果を達成できる。ただし、これらはアクセス期間を制限することはできるが、その期間中はリンク自体を外部で利用することは可能。

#### OAIとOAC
S3バケットのコンテンツをCloudFrontディストリビューションを介してグローバルに配信する際に、S3オブジェクトURLに直接アクセスできないようにする方法は下記である。

1. オリジンアクセスアイデンティティ（OAI）
   CloudFront側でOAIを割り当て、そのOAIにのみS3バケット内への読み取り権限があるようにS3バケットポリシーを設定

2. オリジンアクセスコントロール（OAC）
   OAIと同様の機能を提供する新しい方式

# サーバーレス系サービス

### AWS Lambda

#### Lambda関数の権限設定
他のAWSリソースと連携するLambda関数を作成する際は、IAMによる実行ロールをLambda関数に設定してアクセス権限を付与することが必要。このIAMロールに付与されたアクセス権限によって、Lambda関数が操作できるAWSリソースの範囲が決まる。

#### サーバレスアプリケーションの例
`API Gateway + Lambda + DynamoDB`

`クライアント → API Gateway → Lambda → DynamoDB`

このアーキテクチャでは、API Gatewayがリクエストを受け取り、Lambda関数を呼び出す。Lambda関数はDynamoDBと連携してデータの取得や保存を行う。

#### Amazon Aurora MySQLとの連携
サーバレスアプリケーションでAurora MySQLを使用する場合、DBアップグレード中の接続中断に対応するには下記を行う。

1. Lambda関数が取得した顧客データをAmazon SQSキューに保存
2. 別のLambda関数がこのキューにポーリングして、顧客データをAuroraデータベースに保存

# ワークフロー系サービス
### AWS Step Functions

複数のAWSサービスを組み合わせてワークフローを構築するサービス。

#### 主な特徴
- サーバーレスアプリケーションやマイクロサービスをワークフロー化
  視覚的なワークフロー設計が可能
- 状態遷移を管理し、エラーハンドリングも可能
- 長時間実行されるプロセスやタスクの調整が可能

#### 分散アーキテクチャでの活用
AWSとオンプレミスの両方の環境にあるリソースによって構成される分散アーキテクチャでは、Step Functionsが有用。コンポーネントが相互に接続しながら独立して実行できるようにするコンピューティングアーキテクチャを実現できる。

# インフラストラクチャ管理系サービス

### AWS CloudFormation

AWSリソースを利用したアーキテクチャ構成をコード化してテンプレートとして利用できるサービス。

#### 主な特徴
- Infrastructure as Code(IaC)
  インフラ環境のデプロイを自動化

- テンプレート
  JSONまたはYAML形式でリソースを定義

- スタック
  テンプレートから作成されるリソースの集合

- 変更セット
  リソースへの変更を事前に確認可能

#### AWS CodePipeline との違い
AWS CodePipelineはCodeDeployやAmazon ECSなどのサービスをパイプラインとして設定することで、コードの開発からデプロイまでのステップを自動的に実行できるようにする継続的デリバリーサービス。
インフラ環境のデプロイにはCloudFormationを利用する。
【Mac】jqコマンドの使い方

`jq`はJSONデータを処理するためのコマンドラインツールです。

## インストール

以下のコマンドでHomebrewを使用してインストールできます。

```terminal
brew install jq
```

https://jqlang.org/download/

## 使い方

特定のJSONファイルを色付きかつフォーマットされた状態で表示します。

```terminal
jq '.' /path/to/file.json
```

特定のスクリプトを使用してJSONデータを処理するには、次のようにします。

```terminal
cat path/to/file.json | jq --from-file path/to/script.jq
```

特定の引数を渡してJSONデータを操作するには、以下のコマンドを使用します。

```terminal
cat path/to/file.json | jq --arg "name1" "value1" --arg "name2" "value2" ... '. + $ARGS.named'
```

複数のJSONファイルから新しいJSONオブジェクトを作成するには、次のようにします。

```terminal
cat path/to/multiple_json_file_*.json | jq '{newKey1: .key1, newKey2: .key2.nestedKey, ...}'
```

特定のインデックスの配列アイテムを表示するには、以下のコマンドを使用します。

```terminal
cat path/to/file.json | jq '.[index1], .[index2], ...'
```

JSONファイル内のすべての配列またはオブジェクトの値を表示するには、次のようにします。

```terminal
cat path/to/file.json | jq '.[]'
```

特定の条件を満たすオブジェクトをフィルタリングして表示するには、以下のコマンドを使用します。

```terminal
cat path/to/file.json | jq '.[] | select((.key1=="value1") and .key2=="value2")'
```

特定のキーをJSONオブジェクトに追加または削除するには、次のようにします。

```terminal
cat path/to/file.json | jq '. + {"key1": "value1", "key2": "value2", ...}'  # 追加
cat path/to/file.json | jq '. - {"key1": "value1", "key2": "value2", ...}'  # 削除
```

https://jqlang.org/manual/
AWS SAA備忘録記事⑧〜サーバーレスアーキテクチャとストリーミングサービス〜

# はじめに
本記事では、メッセージングサービスとストリーミングデータ処理サービスについて解説します。

# Amazon SQS (Simple Queue Service)

メッセージを一時的に保存し、コンピュータ間でやり取りするためのマネージド型のメッセージキューイングサービス。

### SQSキューの種類
- 標準キュー
  高いスループットを提供するが、メッセージの順序と一意性は保証されない
- FIFOキュー
  メッセージの順序を保証し、少なくとも1回のメッセージ配信をサポート

### SQS可視性タイムアウト
あるEC2がメッセージを取得してから処理している間、他のEC2がそのメッセージを見えなくする時間
設定方法としては、ChangeMessageVisibility APIを使用

`SQS -> EC2 -> RDS -> EC2（別のインスタンス）`

### SQSと他サービスの連携
- EC2との連携
  SQSキューにリクエストメッセージを保持して、EC2インスタンスにポーリング処理させることで、トランザクションを破棄せずに処理を継続できる
- Auto Scalingとの連携
  CloudWatchでSQSキューサイズを監視し、EC2インスタンスのAuto Scalingグループを設定することでスケーリングが可能
- Lambdaとの連携
  Lambda関数がSQSキューメッセージを取得して処理する。デッドレターキューを追加することで、Lambda関数の実行に失敗したメッセージを別のSQSキューに蓄積できる

### 書き込み操作の信頼性向上
1. 「保留中のデータベースへの書き込みリクエスト」をAmazon SQSキューに格納
2. Lambda関数がSQSキューメッセージを取得して、書き込み処理を実行
3. Lambda関数にデッドレターキューを追加して、失敗したメッセージを蓄積

# Amazon SNS (Simple Notification Service)

プッシュ型のメッセージングサービスで、アプリケーション間やユーザーへの通知に使用される。

### SNSトピックとフィルタリング
発注アプリケーション開発の例
  1. SNSトピックを1つ作成
  2. SQSキューをこのSNSトピックにサブスクライブ
  3. SNSトピックへのフィルター設定で、注文内容に応じて適切なSQSキューにメッセージを分割
  4. 各バックエンドサーバーは、対応するSQSキューからメッセージを受信

`[注文メッセージ] → SNSトピック → フィルター → 適切なSQSキュー → バックエンドサーバー`

### SNS FIFO トピック
- 複数のサブスクライバーに厳密なメッセージの順序付けと重複を排除したメッセージ配信を提供する
- アプリケーションにおいて、メッセージの順序が保持され、重複するメッセージが送信されない仕組みが必要な場合に適している

### CloudWatchとの連携
アプリケーション処理の異常を監視するためにCloudWatchと連携し、SNSを通じてSMS送信などの通知が可能

# Amazon Kinesis Data Streams

ストリーミングデータをリアルタイムで収集、処理、分析するためのサービス。1秒以下のデータロードが達成できる性能があり、リアルタイム処理に適している。

### ストリーミングデータとは
連続的に生成される大量のデータをリアルタイムで処理する方式
クリックストリームデータを取得してリアルタイムに処理するアプリケーションなどが該当する

### シャード管理
- シャード
  データ処理単位。適切なシャード数の設定が重要
- パフォーマンス調整
  割り当てられたシャードが十分に活用されていない場合はコストが高くなるため、最適なシャード数の設定が必要

# Amazon Kinesis Data Firehose

ストリーミングデータを変換したり、ストレージやDBに配信するサービス。データロードまで60秒必要なため、ミリ秒単位の処理には向かないが、データ変換・配信に適している。

### 配信先
- Amazon S3
- Amazon Redshift
- Amazon OpenSearch Service
- Splunk
- HTTPエンドポイント

ただし、DynamoDBには直接配信できないことに注意が必要。

### Kinesisを使ったデータパイプラインの例

`Amazon Kinesis Data Streams → Amazon Kinesis Data Firehose → Amazon S3データレイク → Amazon Redshift Spectrum`

# Amazon Managed Service for Apache Flink

以前はAmazon Kinesis Data Analyticsと呼ばれていたリアルタイムデータ分析用のサービス。Apache Flinkを利用してデータ処理をリアルタイムに実施し、ストリーミングデータをクエリ処理によって分割してから、S3バケットなどに保存できる。

### 工場データの処理例
工場のデバイスから送信されるストリームデータを取得して保存する場合
  1. リアルタイム性が不要（数分の遅延が許容される）なら、Kinesis Data Firehoseを使用
  2. 10日以内のデータは標準ストレージに、10日経過したデータはアーカイブに自動移行するライフサイクルポリシーを設定

### 複雑なクエリ処理が必要な場合
Kinesis Data Stream → Firehose → S3の構成だけでは、リアルタイムでの複雑なクエリ処理や時系列での柔軟な分割が難しい
そのため、Apache Flinkを使って高度な処理を行い、結果をS3に保存する構成が選択される

# AWS Lambda (サーバーレス)と連携

### Lambdaとストリーミングサービスの連携
- S3イベント処理
  S3バケットに新しいファイルがアップロードされたときに処理を実行
- DynamoDBストリーム処理
  DynamoDBテーブルのデータが変更されたときに処理を実行
- Kinesis Streamsとの連携
  ストリーミングデータをリアルタイムで処理

### Lambda関数へのアクセス方法
HTTP経由でLambda関数を呼び出す方法は主に下記の2つgある。
  1. API GatewayをLambda関数に統合 - 一般的な方法
  2. Lambda関数URL - APIゲートウェイを使わずに、直接Lambda関数にアクセスできる新機能
【ターミナル】ターミナルについて

# 記事概要
ターミナルの基本について、まとめる。

# 前提
- PCはMacを使用している
- ターミナル.appを起動している

# 表示内容
ターミナル.appは下記のように表示される

```
likapantrip@macsan ~ %

likapantrip → ユーザー名
macsan → コンピューター名
~ →カレントディクトリ
likapantrip@macsan ~ % → プロンプト
%以降 → コマンド入力部分
```

# ディレクトリ
コンピュータ上で複数のファイルを整理するための入れ物のこと

## ルートディレクトリ
階層構造の一番上にあるディレクトリのこと

## カレントディレクトリ
ターミナルで、現在作業中となるディレクトリのこと

## ホームディレクトリ
新規にターミナルを立ち上げた場合に作業中となるディレクトリのこと
※Macでのデフォルトのホームディレクトリは、`/Users/ユーザ名`

# パス
## 絶対パス
- ルートディレクトリから指定するパス
- パスの一番最初に`/`を指定

```
% /Users/ユーザ名/Desktop
```
ホームディレクトリ`/Users/ユーザ名`は、`~`と表現することも可能

```
% ~/Desktop
```

## 相対パス
- カレントディレクトリから指定するパス
- パスの一番最初に`/`を指定しない

```
# カレントディレクトリがホームディレクトリ
% Desktop
```

# コマンドの種類
Linuxコマンド
フロントエンドとバックエンドの違い

# はじめに

Webアプリケーション開発において、フロントエンドとバックエンドは重要な2つの領域です。この記事では、両者の違いを詳しく解説し、それぞれの役割や特徴を明確にします。

# フロントエンド開発

フロントエンド開発は、ユーザーが直接目にし、操作する部分を担当します。

### 主な特徴:
- ユーザーインターフェース(UI)の実装
- ビジュアルデザインの実現
- ユーザー体験(UX)の最適化

### 使用技術:
- HTML: ウェブページの構造を定義
- CSS: スタイリングとレイアウトを担当
- JavaScript: インタラクティブな機能を実装

### 責任範囲:
- レスポンシブデザインの実装
- クロスブラウザ互換性の確保
- パフォーマンス最適化（ページロード速度の向上など）

# バックエンド開発

バックエンド開発は、ユーザーには直接見えない、サーバーサイドの処理を担当します。

### 主な特徴:
- サーバーサイドロジックの実装
- データベース管理
- APIの開発と管理

### 使用技術:
- サーバーサイド言語: Python, Ruby, PHP, Java など
- データベース: MySQL, PostgreSQL, MongoDB など
- サーバー: Apache, Nginx など

### 責任範囲:
- データの保存と取得
- ユーザー認証とセキュリティ
- サーバーのスケーラビリティ確保

# フロントエンドとバックエンドの比較

| 特徴 | フロントエンド | バックエンド |
|------|----------------|--------------|
| 焦点 | ユーザーインターフェース | サーバーサイドロジック |
| 可視性 | ユーザーに直接見える | ユーザーには見えない |
| 主要言語 | HTML, CSS, JavaScript | Python, Ruby, PHP, Java など |
| データ処理 | APIからのデータ表示 | データベース操作、ビジネスロジック |
| セキュリティ | XSS対策など | データ保護、認証、暗号化 |

## まとめ

フロントエンド開発とバックエンド開発は、それぞれ異なる役割を持ちながら、ウェブアプリケーション全体の機能を支えています。フロントエンドはユーザーとの直接的なインタラクションを担当し、バックエンドはデータ処理や複雑なロジックを担当します。両者が協調することで、効率的で使いやすいウェブアプリケーションが実現されます。最後まで読んでくださり、ありがとうございました。もし改善点や質問があれば、ぜひコメントしてください！
Clineで「コマンドの実行結果が表示されていないようです」対策（PowerShell用）

## 目的
Windows環境でVSCode+Clineを試していると、Clineがコマンドを実行してその結果を取得しようとし、「コマンドの実行結果が表示されていないようです」というエラーが出ることがある。

解決にそれなりの手間を取ったのでメモとして残す。
といっても、英語がすらすら読める人はここを直接読んだ方が速い。

https://github.com/cline/cline/wiki/Troubleshooting-%E2%80%90-Shell-Integration-Unavailable#still-having-trouble

## 環境
- Windows 11
- VSCode + Cline
- PowerShellをターミナルとして利用

## 手順
### PowerShellをデフォルトのシェルとして設定する
- `Ctrl + Shift + P`を押して、「Terminal: Select Default Profile」を選択する
- PowerShellを選択する

### PowerShellのバージョンが7以上であることを確認する
- `$PSVersionTable.PSVersion`コマンドを実行してバージョンを確認する
- 必要に応じて、最新バージョンのPowerShellをインストールする

### PowerShellの実行ポリシーの調整
実行ポリシーを確認し、`AllSigned`か`Restricted`になっている場合はポリシーを緩和する。
```powershell
Get-ExecutionPolicy
```

以下のコマンドでPowerShellの実行ポリシーを`RemoteSigned`に設定する。
```powershell
Set-ExecutionPolicy RemoteSigned
```

尚、`RemoteSigned`は、ローカルに保存されているスクリプトの実行に署名が不要になる設定。但し、インターネットから保存したファイルには署名が必要なので、それなりに安全性が保たれつつ、便利になる。

### VSCodeの再起動
VSCodeを完全に終了し、再度開く。

## まだ問題が解決しない場合は、手動でシェル統合をインストールする

### 1. PowerShellのプロファイルスクリプトを開く
```powershell
code $PROFILE
```
 上記のコマンドは、ユーザーのドキュメントフォルダに`Microsoft.PowerShell_profile.ps1`というファイルを作成し、編集の為に開いてくれる。

   
### 2. 以下のスクリプトを上記のプロファイルに追加する
```powershell
if ($env:TERM_PROGRAM -eq "vscode") { . "$(code --locate-shell-integration-path pwsh)" }
```
このスクリプトは、vscodeからPowerShellが実行されている場合に、vscodeのシェル統合機能を使ってコマンドを実行するように設定している。

## その他
bashを使いたい場合は記事の先頭で示したリンク先にやり方が書かれているのでご参考までに。
AWS SAA備忘録記事⑦〜データベースとデータ分析サービス〜

# はじめに
本記事では、NoSQLデータベースサービスのDynamoDBとデータウェアハウスサービスのRedshift等について解説します。

# Amazon DynamoDB

DynamoDBは、フルマネージドのNoSQLデータベースサービスで、高速かつ予測可能なパフォーマンスを提供する。

### キャパシティモード
- オンデマンドモード
 実際のトラフィックに応じて自動的にスケーリング、使用した分だけ料金が発生

- プロビジョニングモード
 事前に必要な処理能力（RCU/WCU）を設定、その範囲内で利用

### DynamoDBストリーム
DynamoDBテーブル内のデータ更新イベントをキャプチャする機能。
データ項目の追加・変更・削除の発生時に、その履歴を保持し、それをトリガーにしてLambda関数などを実行できる。

### ユースケース

`[トランザクションデータ] → DynamoDBテーブル → DynamoDBストリーム → Lambda関数 → 他のアプリケーションと共有`
- トランザクションデータを直接DynamoDBテーブルに保存して、DynamoDBトランザクション機能を利用
- DynamoDBストリームを有効化して、他のアプリケーションとトランザクションデータを共有

### DynamoDBトランザクション機能
DynamoDBテーブルへの書き込みなどのトランザクション発生時に特定の処理を実行させることができる機能。
1つのオペレーションとして複数の項目の追加、更新、または削除が必要となる複雑なビジネスワークフローを管理できる。

### DynamoDB Accelerator (DAX)
DynamoDB専用のインメモリ型のキャッシュクラスタを追加して、レスポンスをミリ秒単位からマイクロ秒単位まで高速化する機能。

### DynamoDBグローバルセカンダリインデックス
クエリ処理の柔軟性を高めるための機能。
特定の属性に基づいて効率的に検索を行いたい場合に使用する。

# Amazon Redshift

大規模なデータウェアハウス向けに設計された、ペタバイト規模のデータを高速に分析できるマネージドサービス。

### 構成と料金
- ノード構成
 複数のノードをまとめたクラスター構成で起動

- 料金
 ノードの種類や性能に応じて料金が増加

- コスト最適化
 リザーブドノードを利用することで、1年間または3年間の利用を契約することでオンデマンド料金に比べて最大75%のコストを節約可能

### Redshift Spectrum
S3バケット上に保存されたファイルに対して直接、高度なクエリ処理を実行可能。S3バケットをRedShiftの解析用のデータレイクとして構成することができる。ビッグデータ解析などの高負荷な大量データ解析を実現する。

# データ移行・連携ツール

### AWS DataSync
オンプレミスとAWSストレージサービス間のデータ移動を自動化するサービス。
ユースケースとしては、オンプレミスのNFSファイルシステムなどをAmazon EFSに移行する際に使用。

### AWS Data Pipeline
AWSサービス間のデータ転送や変換処理に利用されるサービス。
AWSサービス間のデータ転送や変換処理を自動化するマネージドサービス。
#### 主な機能

- 指定したデータベースやストレージに定期的にアクセス
- 必要な変換と処理を実行
- 処理結果をAmazon S3、RDS、DynamoDB、EMRなどに転送
- 定期的なスケジュール実行が可能

#### 制限事項
ストリームデータを取得・変換する際には利用できない。
（代わりにAmazon Kinesisを使用）

#### 主なユースケース
- データベース間のデータ転送パイプラインの構成
- データウェアハウスへの定期的なデータロード

# ビッグデータ解析

### Amazon EMR
大量のデータを処理することができるサービス。Hadoop、Spark、HiveなどのビッグデータフレームワークをAWS上で簡単に実行できる。
ユースケースとしては、トランザクションデータを処理して、データをDynamoDBテーブルに保存する

### Amazon Kinesis Data Streams との連携
リアルタイムデータ解析を実施する場合はAmazon KinesisシリーズまたはAmazon EMRを利用することが最適。
Amazon EMRによりApache Spark Streamingを構成することで、Kinesis Data Streamsからのデータを処理できる。

# データウェアハウスのベストプラクティス

### データレイクアーキテクチャ
1. クリックストリームデータなどをAmazon Kinesis Data Streamsで収集
2. Amazon Kinesis Data Firehoseを介してデータをAmazon S3データレイクに送信
3. Amazon Redshift Spectrumでデータレイク内のデータを分析

毎日1TB以上のデータを処理するような大規模なデータ分析プラットフォームに適している。
SSLを学んで触ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/8023b6f1-7ed8-4ddf-8f63-3e17317f5d6f.png)

こんにちは！
SSLについて学んだり、Linux環境で触ったりしたのでここでアウトプットしていきます！

# SSLとは
インターネットが発展する前、コンピュータ同士は暗号化されていない通信でデータをやり取りしていました。しかし、情報がそのまま送信されるため、盗聴や改ざんのリスクがありました。そこで、「通信を暗号化する仕組み」としてSSL（現在はTLS）が誕生しました。<br>
例えば、オンラインショッピングでクレジットカード情報を入力するとき、SSLがないとその情報がそのまま送信されてしまい、第三者に盗み見られる可能性があります。しかし、SSLを使うことでデータが暗号化され、安全に送信されるため、悪意のある攻撃者が途中で盗み見ても解読できません。

# SSL証明書を取得するまでの流れ
#### 1. 秘密鍵（Private Key）の作成
まず、公開鍵暗号方式 に基づいて秘密鍵を作成します。
秘密鍵はサーバー内に厳重に保管し、外部に漏らしてはいけません。

#### 2. CSR（証明書署名要求）の作成
次に、SSL証明書を取得するためのCSR（Certificate Signing Request） を作成します。
CSRには、公開鍵・ドメイン名・組織情報 などが含まれます。

#### 3. CSRを認証局（CA）に提出し、証明書を発行
作成したCSRを認証局（CA: Certificate Authority） に送信し、SSL証明書を発行してもらいます。

#### 4. サーバーにSSL証明書をインストール
CAから発行されたSSL証明書（.crtファイル）をサーバーに配置し、秘密鍵と組み合わせます。
設定後にアクセスし、鍵マーク（🔒）が表示されれば成功！

# 実際にLinuxに試してみる
では、SSLを実際にローカル環境で試していきたいと思います。
今回はお金をかけたくないので、認証局（CA）を通さずに、自分で作成したSSL証明書（オレオレ証明書）で試していきます。
### 前提条件
- Ubuntuサーバーが動作している
- Apache（Webサーバー）がインストールされている
- サーバーのIPアドレスは `192.168.～.～`
- DNSが稼働しており、`keita.server` という名前で解決できる
(参考：https://qiita.com/keitakei777/items/54aaf042bb69fe492fd3)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/7e464068-eab0-42dc-a856-47befc7d7211.png)
---
### 1. 証明書と鍵ファイルを作成
まず、自己証明書（オレオレ証明書）と鍵の作成を行います。
以下のコマンドを実行します。

```bash
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/keita.server.key \
    -out /etc/ssl/certs/keita.server.crt
```

実行時に以下の情報を入力します。

```
Country Name (2 letter code) [AU]: JP
State or Province Name (full name) [Some-State]: Tokyo
Locality Name (eg, city) []: Adachi
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Keita Corp
Organizational Unit Name (eg, section) []: IT Department
Common Name (e.g. server FQDN or YOUR name) []: keita.server
Email Address []: webmaster@keita.server
```

これにより、以下のファイルが作成されます。

```
/etc/ssl/certs/keita.server.crt
/etc/ssl/private/keita.server.key
```
---
### 2. Apacheに設定を適用

Apacheの仮想ホスト設定ファイルを作成します。

```bash
sudo nano /etc/apache2/sites-available/keita.server.conf
```

以下の内容を記述します。

```apache
<VirtualHost *:443>
    ServerName keita.server
    ServerAlias www.keita.server
    DocumentRoot /var/www/html

    <Directory /var/www/keita>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/keita_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/keita_ssl_access.log combined

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/keita.server.crt
    SSLCertificateKeyFile /etc/ssl/private/keita.server.key
</VirtualHost>
```

次に、設定を有効化します。

```bash
sudo a2ensite keita.server.conf
sudo systemctl reload apache2
```
---
### 3. ブラウザで確認
HTTPSでのアクセスをPCの `hosts` ファイルに以下のエントリを追加して行います。

```bash
192.168.～.～ keita.server
```

その後、ブラウザで以下のURLにアクセスします。

```
https://keita.server/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812041/0547a886-5600-4645-82d5-dfb0292aa835.png)

セキュリティ警告が表示されるかもしれませんが、証明書情報を確認し、HTTPSでアクセスできていれば成功です。

### まとめ
こんな感じでSSLの証明書について調べたり触ってみたりしました！
今回詳細した方法は ローカル環境限定 で有効な設定です。セキュリティ的対策はしていないので、ローカル開発環境のテストとして活用してください！
AWS SAA備忘録記事⑥〜RDSとAuroraの基礎と活用法〜

# はじめに
本記事では、主にAmazon RDSとAmazon Auroraの特徴、設定方法、活用法について解説します。

# Amazon RDS基礎

Amazon RDS（Relational Database Service）は、クラウドでリレーショナルデータベースを簡単に設定、運用、スケーリングできるマネージドサービス。

### マルチAZ構成
デフォルトの構成では、マルチAZに分散化されるDBクラスターを構成できる。マルチAZ配置にするとコストが高くなるが、可用性が向上する。

### マイグレーション方法
オンプレミスからのマイグレーションには様々な方法がある。
- Mysqldumpユーティリティ
 バックアップ/復旧プロセスを実装する方法

# Amazon Aurora

Amazon AuroraはAWSが開発したリレーショナルデータベースで、MySQL/PostgreSQLと互換性がありながら、パフォーマンスと可用性が向上している。

### Auroraの特徴
- データがプライマリDBインスタンスに書き込まれると、複数AZに展開されている6つのノードにデータが同期的に複製される
- リードレプリカ
 読み取り処理の負荷分散に活用できる

### Aurora グローバルデータベース
複数地域に跨ったデータベースのプライマリ/セカンダリ構成の運用を自動化する。
- エクスポート/インポートを利用したマニュアルでのスタンバイ構成を廃止可能
- リージョン障害時のフェイルオーバーを自動化

`フェイルオーバー = プライマリーのサーバ/システム/ネットワークにおいて異常事態が発生したとき、自動的に待機系のセカンダリー構成に切り換える機能`

### Aurora Serverless
DBインスタンスクラスのサイズを指定せずにデータベースエンドポイントを作成できる柔軟性の高いAuroraデータベースである。
サーバーを常時起動しない構成が可能で、不規則なピークが発生するワークロードに適している。

# RDS Proxy

アプリケーションとRDSデータベース間の仲介役としてコネクションを管理するプロキシ機能である。

### Lambda関数とRDS Proxyの連携
Lambda関数からRDS Proxyに接続してデータ処理を実施することで、Lambda関数による効率的な非同期並列実行を可能にするデータ処理アプリケーションを構築できる。

### コネクションプーリング
RDS Proxyは、Lambda関数の同時実行によって大量の同時接続をスケーリングするために必要なコネクションをプーリングする。
データベースへの接続を効率的に管理し、大量のLambda関数からのリクエストを少ない接続数で処理できるようにする。

# サーバレスアプリケーションとRDSの連携

### Lambda + API Gateway + RDSの構成
サーバレスアプリケーションでは、API Gateway経由でLambda関数を呼び出し、RDSデータベースとやり取りするアーキテクチャが一般的である。

### データベース接続の中断対策
Amazon Aurora MySQLデータベースのアップグレード時など、Lambdaがデータベースと接続できなくなる期間がある。この問題には以下の対処を行う。
- Lambda関数が取得した顧客データをAmazon SQSキューに保存
 後続処理のために一時的にデータを退避させる
- 別のLambda関数がこのキューにポーリングして、顧客データをAuroraデータベースに保存
 接続が復旧した後にデータを永続化する

# コスト最適化

### リザーブドインスタンス
長期間の利用が見込まれる場合は、RDSリザーブドインスタンスを購入することで、オンデマンド料金に比べて大幅なコスト削減が可能である。
1年間または3年間の契約で、最大75%の割引が適用される。
Linuxコマンド入門：psコマンドの基本をまとめ、現在実行中のプロセスを表示してみた

## はじめに

`ps` コマンドは、LinuxやUnix系OSにおいて、現在実行中のプロセスを表示するためのコマンドです。

:::note info
**システムの状態を確認したり、不要なプロセスを見つけたりする際に使用されます。**
:::

内容は個人の備忘録レベルの走り書きですが、ご容赦ください。

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

システム管理やプログラム開発を行っていると、プロセスの監視や管理が必要になる場面が多くあります。

:::note warn
***特に、特定のプロセスが正常に動作しているかの確認や、リソース使用状況を把握することは重要です。***
:::

そのため、`ps` コマンドの基本的な使い方やオプションについて整理し、まとめることにしました。

## 基本的な使い方

以下に、`ps` コマンドの基本的な使い方を紹介します。

### 1. 実行中のプロセスを表示

```sh
ps
```
このコマンドを実行すると、現在のシェルで実行中のプロセスのみが表示されます。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 22.48.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/26ca1559-f20f-4e2d-9ecb-fd002ba510fd.png)

### 2. すべてのプロセスを表示

```sh
ps -e
```
`-e` オプションを付けると、すべてのプロセスが一覧表示されます。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 22.50.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/aed860f4-e5ae-4b6c-9ccc-975c12cd993c.png)

または、

```sh
ps aux
```
とすると、ユーザーごとのプロセス情報やCPU・メモリ使用率を含めた詳細情報を取得できます。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 22.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/78696745-0277-4c51-add5-fb4b9fb16f62.png)

## よく使われるオプション

| オプション | 説明 |
|------------|--------------------------------|
| `-e` | すべてのプロセスを表示 |
| `-f` | フルフォーマットでプロセス情報を表示 |
| `-u [ユーザー名]` | 指定したユーザーのプロセスを表示 |
| `-a` | 端末に関連するすべてのプロセスを表示 |
| `-x` | 端末に依存しないプロセスも含めて表示 |
| `aux` | BSDスタイルの出力形式で詳細情報を表示 |
| `-o` | 指定したフォーマットで出力 |

## プロセスをフィルタリング

特定のプロセスを検索するには、`grep` を組み合わせるのが一般的です。

```sh
ps aux | grep nginx
```
このコマンドは、`nginx` に関連するプロセスを検索します。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 22.53.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/885d8f53-ae08-426b-87ae-54e30fecad2e.png)

## プロセスのソート

CPU使用率順にソートする場合：

```sh
ps aux | sort -nk 2,2  # CPU使用率順にソート
```

メモリ使用率順にソートする場合：

```sh
ps aux | sort -nk 3,3  # メモリ使用率順にソート
```

## プロセスID（PID）を取得

特定のコマンドのプロセスID（PID）を取得するには、次のようにします。

```sh
ps aux | grep nginx | awk '{print $2}'
```
このコマンドは `nginx` のPIDのみを取得できます。

## まとめ

`ps` コマンドは、プロセスの管理や監視において重要なツールです。`ps` を活用することで、システムの負荷状況を確認したり、異常なプロセスを特定したりすることができます。

よく使うコマンドなので、気になったときに試してみてください！
DNSを徹底解説！

## はじめに

DNS（Domain Name System）は、インターネット通信において欠かせない仕組みです。本記事では、DNSの仕組みを詳しく解説します。

## 1. DNSとは？
DNSは、ドメイン名（例: example.com）をIPアドレス（例: 192.0.2.1）に変換するシステムです。ユーザーが使いやすいドメイン名を入力するだけで、実際のサーバーと通信できるようになります。

## 2. DNSの階層構造
DNSは分散型の階層構造になっており、以下のように管理されています。

1.ルートDNSサーバ（.）
・全てのDNSの頂点に位置し、TLD（トップレベルドメイン）のDNSサーバを管理。

2.TLD（トップレベルドメイン）DNSサーバ
・.com, .jp, .org などのTLDごとのDNSサーバ。

3.権威DNSサーバ
・特定のドメイン（例: example.com）の情報を保持し、正しいIPアドレスを応答。

4.キャッシュDNSサーバ（リゾルバ）
・クライアントの問い合わせを代行し、キャッシュを用いて応答を高速化。

## 3. DNSの名前解決の流れ
DNSの名前解決には、以下の2つの方式があります。

① フルリゾルバ（再帰的問い合わせ）
キャッシュDNSサーバが問い合わせを代行し、ルートDNS → TLD DNS → 権威DNSの順に問い合わせを行います。

② スタブリゾルバ（逐次的問い合わせ）
クライアント自身がルートDNS → TLD DNS → 権威DNSに問い合わせを行います。

## 4.DNSの主要なレコード
| レコードタイプ | 説明 |
|:-:|:-:|
| Aレコード  | ドメイン名をIPv4アドレスに変換  |
| AAAAレコード  | IPv6アドレスを返す  |
| CNAMEレコード  | 別のドメイン名にマッピング  |
| MXレコード  | メールサーバの情報  |
| NSレコード  | そのゾーンを管理するDNSサーバを示す|
| TXTレコード  | SPF（メール送信認証）などの情報を記述  |

## 5. キャッシュとTTL
DNSのキャッシュは、問い合わせ結果を一定期間保存することで通信を高速化します。
・TTL（Time To Live）: キャッシュの有効期限（数分〜数時間）。
・TTLが長いと変更が反映されにくいが、短すぎるとサーバー負荷が増加。

## 6. DNSのセキュリティと攻撃対策
DNSは攻撃の標的になりやすいため、適切な対策が必要です。
主な攻撃手法
| 攻撃名 | 説明 |
|:-:|:-:|
| DNSキャッシュポイズニング  | 偽のIPアドレスをキャッシュDNSサーバに記録させる|
  | DNSリフレクション攻撃  | 偽装IPに大量のDNS応答を送りつける  |
| DDoS（分散型サービス妨害）  |大量の問い合わせを送り、DNSサーバをダウンさせる   |

対策
・DNSSEC（DNS Security Extensions）: デジタル署名を利用し、正当な応答を保証。
・Rate Limiting: 同じIPからの大量の問い合わせを制限。
・キャッシュ保護: 問い合わせ時にランダムなポートを使用し、DNSキャッシュポイズニングを防止。

## 7. 実践！DNSの調査方法
nslookupコマンド（Windows, Linux, macOS）
nslookup www.example.com

## まとめ
・DNSはドメイン名をIPアドレスに変換する役割を持つ。
・ルートDNS → TLD DNS → 権威DNS という階層構造を理解する。
・再帰的問い合わせ（フルリゾルバ）と逐次的問い合わせ（スタブリゾルバ）がある。
・TTLを適切に設定することでパフォーマンスと更新性のバランスを取る。
・DNSのセキュリティ対策（DNSSEC, Rate Limiting）を把握する。
Thonny　日本語入力化

Thonnyで日本語入力出来るようにする方法。

Thonnyでは標準では日本語入力出来ませんが、xserverscreenをインストールすると日本語入力ができるようになります

インストールはLxterminal等で下記を入力すればOKです。

```xscreensaver
sudo apt install xscreensaver
```

何故日本語が使えるようになるかは解りませんが現状上手くいっています。

![スクリーンショット 2025-03-13 224318.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827298/159eab27-25ee-48a3-8f12-afa513eaf081.jpeg)


現在確認しているのはbookwormだけですが、bullseyeなんかでも同じだと思います。
bookwormではxscreensaverが上手く設定出来ないのですが、Thonnyの日本語化の為だけにインストールしています、

日本語入力出来ると、コメントを日本語で入れられて便利です。
【Mac】VSCodeの導入

# 記事概要
MacにVSCodeを導入する方法について、まとめる。

# VSCodeとは
- 正式名称は、Visual Studio Code
- 無料で利用できるテキストエディタ

# 前提
- PCはMacを使用している

# 手順1(インストール)
1. [公式サイト](https://code.visualstudio.com)にアクセスする
1. `Download for macOS`をクリックし、zipファイルをダウンロードする
1. zipファイルをダブルクリックする
1. `Visual Studio Code.app`を`アプリケーション`に移動させる
    [![Image from Gyazo](https://i.gyazo.com/0d46e3f5012e8c94e3640f6d4c8de61f.png)](https://gyazo.com/0d46e3f5012e8c94e3640f6d4c8de61f)
    - 必要に応じて、Dockに配置
    - 下記ポップアップが表示された場合、`開く`をクリック
        [![Image from Gyazo](https://i.gyazo.com/18c0fd1b3fc7db9954c1a736032460dc.png)](https://gyazo.com/18c0fd1b3fc7db9954c1a736032460dc)

# 手順2(拡張機能の導入)
1. 左側のアイコンメニューある、拡張機能アイコンをクリックする
1. 検索窓に拡張機能名を入力し、検索する
1. 拡張機能を選択し、`インストール`をクリックする
    - `アンインストール`と表示されれば、OK

## Japanese Language Pack for Visual Studio Code
VSCodeを日本語表記にする
### インストール後作業
1. アプリを再起動する

## Ruby LSP
Rubyのコードのエラーチェックや自動補完などを行う
### インストール後作業
なし

## zenkaku
全角スペースを入力すると、グレー表示される
### インストール後作業
1. `command + shift + p`の3つのキーを同時入力し、コマンドパレットという設定ファイルの検索画面を開く
1. `> Enable zenkaku`と入力して選択する
1. VSCodeを終了する
1. finderでホームディレクトリを開く
1. `command + shift + .`で隠しディレクトリを表示する
1. .vscode＞extensions＞mosapride.zenkaku-0.0.3＞extension.jsを右クリックし、メニューを表示する
1. 「このアプリケーションを開く」から「テキストエディット」を選択する
1. 5行目の「var enabled = false;」を「var enabled = true;」に変更し、ファイルを保存する
1. `command + shift + .`で隠しディレクトリを非表示にする
1. VSCodeを起動し、全角スペースを入力するとグレーになることを確認する

## Code Spell Checker
コードのスペルをチェックする
### インストール後作業
なし

## Draw.io Integration
ER図を作成できる
### インストール後作業
[こちら](https://qiita.com/likapantrip/items/93bdf449e57a311d40e2)を参照

# 手順3(カスタマイズの実施)
## Tab Size
tabキーを押した際に入力される半角スペースの数を指定する

1. 左側のアイコンメニューある、管理アイコンをクリックする
1. 設定をクリックする
1. Editor: Tab Size項目に`2`と入力する
    [![Image from Gyazo](https://i.gyazo.com/7aeed4a35f61d4f093a8f28e56a68c6a.png)](https://gyazo.com/7aeed4a35f61d4f093a8f28e56a68c6a)

## Render Whitespace
半角スペースは「・」のように表示される

1. 左側のアイコンメニューある、管理アイコンをクリックする
1. 設定をクリックする
1. Editor: Render Whitespaceに`all`と入力する
    [![Image from Gyazo](https://i.gyazo.com/7405439ca00d072cea2bcf7956927cf5.png)](https://gyazo.com/7405439ca00d072cea2bcf7956927cf5)

## オートセーブ
自動保存される

1. 左側のアイコンメニューある、管理アイコンをクリックする
1. 設定をクリックする
1. Files: Auto Saveで`onFocusChange`を選択する
    [![Image from Gyazo](https://i.gyazo.com/722fe136e7ae0d059c6aa871f0c3924b.png)](https://gyazo.com/722fe136e7ae0d059c6aa871f0c3924b)
Arduino IDEでサブディレクトリの資源がコンパイルされない問題

# Arduino IDEでサブディレクトリの資源がコンパイルされない問題の解決方法

## 背景
Arduino IDEで開発を進める際、`MyProject.ino` という1つのファイルに全てのコードを記述すると、コードの管理がしにくくなりました。そこで、Wi-Fi制御やNTP時刻取得、UI表示といった機能ごとにファイルを分割し、それぞれ `WiFiManager.cpp` や `NTPClient.cpp` などに整理することにしました。

しかし、`.ino` ファイルと同じフォルダにない `.cpp` ファイルがコンパイルされず、`undefined reference` エラーが発生する問題に直面しました。

## 困ったこと
Arduino IDEを使って以下の構成で開発をしていたところ、`WiFiManager.cpp` など `core` や `ui` 内のサブディレクトリにある `.cpp` ファイルがコンパイルされないという問題に直面しました。

```
/Arduino
  ├── /Project                // プロジェクトフォルダ（スケッチフォルダ）
  │     ├── MyProject.ino       // メインのスケッチファイル
  │     ├── core              // 基盤部品フォルダ
  │     │     ├── wifi        // Wi-Fi制御
  │     │     │     ├── WiFiManager.h
  │     │     │     ├── WiFiManager.cpp
  │     │     ├── ntp         // NTP時刻取得
  │     │     │     ├── NTPClient.h
  │     │     │     ├── NTPClient.cpp
  │     ├── ui                // 表示系フォルダ
  │     │     ├── clock       // 時計表示
  │     │     │     ├── ClockDisplay.h
  │     │     │     ├── ClockDisplay.cpp
```

このようなディレクトリ構成では、Arduino IDE は `MyProject.ino` と同じフォルダにある `.cpp` ファイルのみを自動的にコンパイル対象にします。そのため、`core` や `ui` の中にある `.cpp` ファイルはコンパイル対象外となり、`undefined reference` エラーが発生しました。

## 解決方法
`src` ディレクトリを作成し、その中に `core` や `ui` のようなサブディレクトリを配置することで、この問題を解決できます。

### なぜ `src` 以下に入れると解決するのか？
Arduino IDEは、スケッチフォルダ直下にある `.cpp` ファイルのみを自動的にコンパイル対象とします。しかし、`src` というディレクトリを作成してその中に `.cpp` ファイルを配置すると、Arduino IDEは `src` 以下の全ての `.cpp` ファイルをコンパイル対象として認識します。

これは、Arduinoのコンパイルシステムが `src` ディレクトリを特別扱いし、そこにあるファイルをすべてビルド対象とする仕様によるものです。そのため、ファイルを整理しつつ、正しくコンパイルされる環境を構築できます。

### 修正後のディレクトリ構成
```
/Arduino
  ├── /Project                // プロジェクトフォルダ（スケッチフォルダ）
  │     ├── MyProject.ino       // メインのスケッチファイル
  │     ├── src                // ソースコード格納用ディレクトリ
  │     │     ├── core        // 基盤部品フォルダ
  │     │     │     ├── wifi        // Wi-Fi制御
  │     │     │     │     ├── WiFiManager.h
  │     │     │     │     ├── WiFiManager.cpp
  │     │     │     ├── ntp         // NTP時刻取得
  │     │     │     │     ├── NTPClient.h
  │     │     │     │     ├── NTPClient.cpp
  │     │     ├── ui          // 表示系フォルダ
  │     │     │     ├── clock       // 時計表示
  │     │     │     │     ├── ClockDisplay.h
  │     │     │     │     ├── ClockDisplay.cpp
```

### `.ino` ファイルでの `#include` の修正
この変更後、`MyProject.ino` 内でヘッダーファイルを正しく参照するには、`src` ディレクトリを考慮して `#include` を修正します。

#### 修正前:
```cpp
#include "core/wifi/WiFiManager.h"
#include "core/ntp/NTPClient.h"
#include "ui/clock/ClockDisplay.h"
```

#### 修正後:
```cpp
#include "src/core/wifi/WiFiManager.h"
#include "src/core/ntp/NTPClient.h"
#include "src/ui/clock/ClockDisplay.h"
```

このように変更することで、Arduino IDE は `src` 以下の `.cpp` ファイルもコンパイル対象として認識し、正しくビルドされるようになります。

## まとめ
Arduino IDEでは、`.ino` ファイルと同じディレクトリにない `.cpp` ファイルは自動ではコンパイル対象になりません。この問題を解決するために、`src` ディレクトリを作成し、その中に `.cpp` や `.h` ファイルを配置することで、正常にコンパイルされるようになりました。

`src` ディレクトリを使用することで、ファイルの整理がしやすくなり、Arduino IDEが正しく認識してコンパイルできるようになるため、推奨される方法です。
Linuxコマンド入門：file コマンドの基本とファイルの種類の調べ方、オプションについてまとめてみた

## はじめに
Linuxではさまざまなファイルタイプが存在し、それを適切に扱うためには種類を把握することが重要です。

:::note info
**そこで役立つのが `file` コマンドです。**
:::

本記事では、`file` コマンドの基本的な使い方や主なオプションについて簡潔に解説します。

## 書こうと思ったきっかけ
ファイルの種類を知る際、拡張子だけでは判断できないことがありました。

また、バイナリファイルとテキストファイルを見分ける方法を知りたい場面が多かったため、`file` コマンドの活用方法をまとめることにしました。

## `file` コマンドとは？
`file` コマンドは、拡張子に依存せずファイルの中身を解析し、種類を特定するコマンドです。

### 基本的な使い方
#### ファイルの種類を調べる
```bash
file filename
```
例：
```bash
file example.txt
example.txt: ASCII text
```
このように、ファイルの種類が判定されます。

**実際のターミナル画面**

![Screenshot 2025-03-13 at 21.24.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/36f92955-25e0-44b6-8fb6-8ac2fceb9ab3.png)

## `file` コマンドの主なオプション

### `-i` オプション（MIMEタイプを表示）
```bash
file -i filename
```
例：
```bash
file -i example.txt
example.txt: text/plain; charset=us-ascii
```

**実際のターミナル画面**

![Screenshot 2025-03-13 at 21.36.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/605264d8-0d04-455d-95a9-fb895d2b3127.png)

### `-b` オプション（ファイル名を表示しない）
```bash
file -b filename
```
例：
```bash
file -b example.txt
ASCII text
```

### `-L` オプション（シンボリックリンクを追跡）
```bash
file -L symlink
```

### `-z` オプション（圧縮ファイルの中身を判定）
```bash
file -z archive.gz
```

## `file` コマンドの応用例

### ディレクトリ内のすべてのファイルの種類を確認
```bash
file *
```

**実際のターミナル画面**

![Screenshot 2025-03-13 at 21.37.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b7eb6ba1-fbf9-480c-b75b-225f6bfbb8fe.png)

### バイナリファイルかテキストファイルかを判別
```bash
file -i filename | grep -q 'charset=binary' && echo "バイナリファイル" || echo "テキストファイル"
```

## まとめ
`file` コマンドは、拡張子に頼らずファイルの種類を特定する便利なコマンドです。

:::note info
**MIMEタイプの確認や圧縮ファイルの解析、シンボリックリンクの追跡など、多くの場面で役立ちます。**
:::

適切なオプションを活用し、効率よくファイルを管理してみてください！
【ポエム】「結局何が言いたいの？」私が時間泥棒を卒業した方法

※この記事は[KANGEN](https://kangen-holdings.co.jp/)の梅ぼしとにらめっこがお送りします。
※この記事は、5分程度で読めます。

## :hatching_chick: **はじめに**
今回は、自身が長年悩んだこと。 **「伝える技術」** にフォーカスしたポエムです。
できるだけ明日から実施できそうな内容にできればいいな。。
こんな方法もおススメだよってコメントもお待ちしております！



:::note info
この記事は、以下のような方を想定して書いております。
- なかなか聞きたいことが相手に伝わらない
- 伝えたつもりなのにそんなこと言っていないと言われた
- 報告に苦手意識がある
:::

ある日現場の上長に言われた一言
---
皆さん、こんなことを言われたご経験はありますでしょうか？

わからない箇所を質問した際
「結局何が言いたいの？」
「申し訳ないけど、私の工数の単価は高いから時間をかけないでほしい」

納品ぎりぎりでの
「そこの仕様はこう変えよう。え？前決めた？そんなこと言っていないよ」

 
 **はい。すべて私の経験です。**
---

そんな梅干しでしたが、その際の悔しさや絶望を糧に、色々なコミュニケーション本を読んでは実践の繰り返し。。。etc

あれから7年！まだまだ未熟な面は多いものの
**「梅干しさんの説明は分かりやすい！」** と言って頂いたり、

大事なエンドユーザー(IT業界でいうお客様のこと)会議でも
**「○○については、梅干しさんに説明してもらいます。」** と話を振って頂けるようになりました。

**なので、少しでも過去の私に似ている方々へ方法を共有するべく（ためになれたら嬉しい）この記事を書いていきます。** なるべく簡潔に！

（目次）伝える際に気を付けていること
---
**1. 忙しい人を捕まえる方法（乱用注意）**
**2. 結論よりも先に伝えていること**
**3. 自分を守るための証拠を作ろう**
**4. 相手に合わせた言葉を使おう**
**5. 人によって印象に残る方法は違う。色々試してみよう！**
**6. 話す前の準備／練習方法**


## 1. 忙しい人を捕まえる方法（乱用注意）
**「1分だけよろしいですか？」** と言ってみましょう。
1分だけで、嫌がる人はあまりいません。
※簡潔に話せるレベルが上がってきたら、実際にかかりそうな時間を予測して提案すると◎

**ただし、この方法で毎回長話を繰り出すと信用が落ちてしまう可能性ございます。**


## 2. **結論よりも先**に伝えていること
色んな記事で見かける結論ファースト。
実際、本当に大事なことだと思います。

ただその前に、この会話が
「相談」なのか
「報告」なのか
「雑談」なのか
相手に伝えてから話を始めると、色々スムーズです。

相手も
・「報告」とわかっていれば、脳のリソースもそんなに割かなくて済む。
・「相談」とわかっていれば、一緒に解決する方法を考えながら話を聴いてくれる。
・「雑談」とわかっていれば、時間がない時は断ってもらえる。

## 3. 自分を守るための証拠を作ろう
相手と話したことは、必ずメモを取りましょう。
そして、とったメモは相手に送りましょう。これがあなたを守る証拠になります。

例えば、
納品ぎりぎりでの
「そこの仕様はこう変えよう。え？前決めた？そんなこと言っていないよ」と言われた際

自：「先日お話しした際に議事録として○○/○○にメールをお送りしております。そちらに記載ございます。」
等証拠があれば自分自身を守れます。

また、メモを相手に送ることで認識のずれも起こりにくくなりますので、おススメです。
（認識ずれていれば、相手からご指摘がもらえ、なければ指摘されなかったことを理由にできる）

## 4. 相手に合わせた言葉を使おう
IT業界に長くいると、カタカナを多く使用する機会が増えてきます。
また、仲間内でその用語を多く使用するためすぐ口から出てくるようになりますが、、

エンドユーザーや新人の方にそのまま伝えると、相手の負担が大きくなります。伝わらないこともしばしば。。

例えば、
お店を「問屋」でおぼえているおばあ様に、「Amazonでセールがあってさ～」と言っているようなもの。
（:older_woman_tone1:「海外まで買い物に行くのかい？」）

相手に伝わるように、補足説明を加えて話したり相手に合わせた言葉を使うようにすると、喜ばれます。

## 5. 人によって印象に残る方法は違う。色々試してみよう！
人によって、
・視覚の情報が優位な人
・聴覚の情報が優位な人
・体感覚の情報が優位なひと

がいるようです（詳しく知りたい方は、ＮＬＰ心理学を勉強してみてください）。

例えば、こんな経験はありませんか？
・参考の本をいくら読んでも覚えられないＡさん。
　→本を朗読してくれるサービスを利用するとどんどん内容が入ってくる。
・先輩にいくら教えてもらってもなかなか覚えられないＢさん。
　→実際に作業を体験したら、すぐ理解できた。

 それも、優位な情報の受け取り方があるからだそうです。

 もし、話してもなかなか伝わらない方には実際に図を作成したり
 図で伝わらない人には電話で会話したり
 それでも伝わらない人には実際に体験してもらったりと伝える方法を工夫してみることをおすすめします。

## 6. 話す前の準備／練習方法
今までにやってきた練習方法
・話す内容を一度箇条書き→伝えたい優先順位で並び替え
・箇条書きしたメモを見せながら話す
・自分の話し方を録音や録画で確認する。
・「あー」「えっと」と頻発する前に出そうなら沈黙する。
・話し始めて「まず結論ですが」といい、自分を追い詰める(この話の結論が何かも考えておく)。
等

 ## 最後に:hatching_chick:
最後まで読んで頂き、ありがとうございました！
冒頭でも記載しましたが、おススメの伝え方がありましたらご教示頂けると喜びます:flushed:

皆さん毎日お疲れ様です！生きてるだけで偉い！ということで、梅干しとにらめっこがお送りしました！
Hello Qiita

## Hello Qiita
### Qiitaを始めた目的

#### 自己成長のため
常駐先の現場が変わり、やる仕事内容もガラリと変わりました。
webアプリケーションの現場に配属され、これから覚えることも多く
自分の理解を深めるため、アウトプットの場を設けたくアカウントを開設しました。


#### 記録に残すため
社会人3年目。
転職をし、ようやく目指していたソフトウェア開発の現場に行くことができました。
今までも資格勉強や現場の勉強はしてきたつもりですが、記録に残るものがなく
何か自分の成果を残したいという思いから始めました。
また、学んだ知識を引っ張りしてくるための場として
活用していこうと思っています。

かっこいいエンジニアになるため日々精進します。
よろしくお願いいたします。