OmniAICreator/Qiita-1.07M huggingface dataset:
SQLインジェクションとは？基本から対策まで総合解説


## 1. SQLインジェクションとは

SQLインジェクションは、ウェブアプリケーションやサーバーがデータベースにアクセスするSQLクエリを、悪意のある入力値によって乱用される攻撃手法です。

例えば、ログインフォームで正常なユーザーに見せかけて、SQLクエリに不正な文訳を追加し、データベースの情報を見ることや削除するといった事例があります。


![SQLインジェクション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75802/1704b68a-a373-07b7-0c06-0eab9d6f6ac3.png)
引用元：https://www.shadan-kun.com/waf_websecurity/sql_injection/


## 2. 攻撃の実例

### 例: ユーザー入力によるクエリの乱用

下記は、SQLインジェクションの基本的な例です。

```sql
SELECT * FROM users WHERE username = 'たろう' AND password = 'password';
```

正常に動作する場合は、ユーザー名とパスワードが一致するレコードが検索されます。これに、悪意のあるユーザーが下記を入力した場合はどうなるでしょう？

```sql
' OR '1'='1
```

このインプットがSQLクエリに変換されると、以下のようなクエリが実行され、全てのデータを取得される可能性があります。

```sql
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';
```

### 攻撃の影響

- **データ漏洩**
- **サービス停止**
- **管理者権限の乗っ取り**

## 3. 対策方法

### 基本的なセキュリティ対策

1. **入力値の検証とエスケープ処理**
   - 正規表現を使用したフィルタリング
   - HTMLコードのサニタイズ化
2. **プレースホルダーの利用**
   - すべての値をプレースホルダーにして使用
3. **データベースユーザーの権限設定**
   - 必要最小限の権限のみを付与。
4. **ログ監視**
   - 不正なアクセスやクエリをログに記録し、異常を検知する仕組みを導入。

### 実装例

- **PHPでのパラメータ化クエリの使用例**

```php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password");
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
$stmt->execute();
```

- **PythonでのORMの利用例 (SQLAlchemy)**

```python
user = session.query(User).filter_by(username=username, password=password).first()
```

- **JavaでのPreparedStatementの使用例**

```java
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ? AND password = ?");
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
```

## 4. 実践的な防御策の実装例

- **システム設計レベルでの考慮**
  - ロールベースの制限
  - データの暗号化とハッシュ化（例: bcryptを使用）
  - トランザクション管理を適切に行う
  - レートリミットを導入し、多数のリクエストによる攻撃を防ぐ

- **WAFやセキュリティツールの利用**
  - OWASPのModSecurityを用いたWebアプリケーションファイアウォール
  - SQLMapなどのツールを使用した脆弱性スキャン
  - セキュリティ診断ツールで定期的にチェック

- **セキュリティガイドラインの遵守**
  - OWASP Top 10に基づいたセキュリティ対策の実装
  - 開発チーム全体でセキュリティ教育を実施

## 5. まとめと注意点

- **セキュリティの基本を忘れないこと**
  - アプリケーションの開発過程では、SQLインジェクション以外の脅威も考慮する。
  - 入力値の確認やエスケープの実装は、開発チームで対話して確実に実行する。
- **経験値を共有し、次の以上を見すえること**
  - 他の開発者とケーススタディの実例や実行するプロジェクトの事例を共有する。

## 総括的なまとめ

SQLインジェクションは、ウェブアプリにおける重要なセキュリティ問題の一つです。しかし、基本的な対策を確実に実行することで、それによる脅威を大きく減らすことができます。エスケープ処理やパラメータ化クエリの利用といった基本を実践しつつ、最新のセキュリティツールも有効に使用することで、利用者やシステムを保護するための力になります。

対策を徹底し、開発チーム全体でセキュリティ意識を高めることで、SQLインジェクションのリスクを最小限に抑えましょう。
Githubが何かよくわかっていなかったわたしへ

こんにちは、ふるすです。
この記事で書いた通り、異動をきっかけに開発のオンボーディング課題に取り組んだわけですが…

非エンジニアが開発オンボーディングに参加してみた -追加機能開発・カタログ編-

https://qiita.com/furusu_y/items/831ff2706b89d202cf3a

**えらいこっちゃになったのでその失敗談共有と、あの時の私へメッセージを送りたいと思います。**

### よくわからないGitの概念

追加機能開発課題ですが、動画を見ながらハンズオン形式でベースとなるアプリケーションを作る(並行してJavaに関する自己学習)→カタログ作成→実装というステップとなっていました。
この動画が大変に素晴らしく、非エンジニアの私でも「なんかよくわかんないけどすごいものができあがってしまった…」みたいになることはなく、しっかりと理解してアプリケーションを作ることができました。
(すごいのはこのカリキュラムを作った上司や先輩方なのですが、私すごいじゃん！と錯覚してしまった)

しかし一点だけうまく自分の中に落とし込めなかったものがあり…それが「Git」の概念でした。

### なんだかすごく大げさなものだと捉えていた

当然ながら前述の動画の中にもGitの説明はあったのですが、「すごくうまくいったタイミングでコマンドを打つものなのだろう…」と捉えていました。
実装中は無我夢中で、あっちがうまくいけばこっちがうまくいかなくなり、みたいなことを繰り返していたせいで、いまいち「今だ！」というタイミングが掴めず…むしろcommitしてしまったせいでおかしくなったらどうしようという不安があり実行できませんでした。
**今思えば完全にごり押しでしたね…**

### 発表会直前に全く動かなくなる

なんやかんやで実装がほぼ終わり、課題の発表会当日朝。
カタログ説明とデモの準備をしていると、
「**あれ？なんか全然動かない機能があるな…**」
デバッグをしてみても原因の見当がつかず、切り戻そうにもどのタイミングから動かなくなってしまっていたのか全くわからなかったのです。
　　
![images.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3827898/7c90950a-6fd3-91dc-f3db-4c51fdb8cf85.jpeg)
　　 終わったか？

…と思ったのですが、チームの先輩たちに助けていただき、どうにか発表会自体は乗り切ることができました。
しかしこまめにcommitをしておけば、こんなに焦ることもなかったのでしょう。
先輩からは「あまり深く考えずにゲームのセーブだと思えばいいんだよ」と教えてもらいました。
**なるほど。。**
あのときのわたしへ。
**なんかうまくいったらとりあえずcommitしといて！！！**

最後に発表会後、あらためてGitについて調べている中ですごくわかりやすい記事がありましたのシェアして終わりにしようかなと思います。

https://qiita.com/piromo/items/a45b44d85ad28bf05c02

https://qiita.com/novl/items/5491b4bb87170aa58a2e
【VBA】君はAccessのdecompileを知っているか？

Accessでなんかおかしいなと思ったときによく行うのが、最適化の実行だと思います。ネットで検索してもそういった情報がたくさんありますね。
ただ、最適化を行っても、状況が変わらない、良くならない時、あきらめる前にもう１つできることがあります。

そこで、decompileです。
コマンドプロンプトを起動し、対象のmdb,accdbファイルの後ろに 
 /decompile
を付けて実行するだけです。
最適化もしたい場合は、その後
 /compact
もすると良いかもしれません。

## 実行例
![スクリーンショット 2024-12-19 162721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14934/eed64178-f636-e957-1e38-4db728efeb44.png)

## 参考ページ
・[MS-Accessのツボ](https://access-db.info/%E3%83%87%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB/)
・[Decompile and Compact Your Microsoft Access Database to Improve Performance and Fix Corruption](https://www.fmsinc.com/microsoftaccess/performance/decompile.asp)
・[vba - How does one decompile and recompile a database application? - Stack Overflow](https://stackoverflow.com/questions/3266542/how-does-one-decompile-and-recompile-a-database-application)

そのほかのオプションについては次の記事に詳しく書かれています。
https://qiita.com/Q11Q/items/535dedab84fb5732e88b

## どんな時に使ったのか
あくまで自分の経験ですが、20年もののaccdbファイル（恐らく元はmdbファイル）の変更が必要になり、そのときに他のaccdbファイルからフォームをインポートしました。
その後、インポートしたフォームを開こうとすると、スンッっとAccessが終了する（何のメッセージも出ない）という現象が発生。
この時に、前述のdecompileを使用して、フォームが開けるようになりました。
恐らく根本的な解決はしていないと思います。（内部構造自体が新しいファイルを受け付けないのではないか）長期に触れる場合は、別途新しいaccdbファイルなりに移行した方が良いのかもしれません。
【ABC解説】 ABC379 解説 (B~D)【Python】

トヨタ自動車プログラミングコンテスト2024#11(AtCoder Beginner Contest 379) のB問題〜D問題をPythonで解説します。

https://atcoder.jp/contests/abc379

# 提出コード

https://github.com/Syogo-Suganoya/AlgoArena/tree/main/atcoder/ABC/ABC379

# B問題
https://atcoder.jp/contests/abc379/tasks/abc379_b

## 問題
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/b8fb8b98-d90b-6983-8e0b-c8f003435965.jpeg)

<details><summary>画像の文字起こし</summary>

食べるとX 本の歯が虫歯になるイチゴがあります。
イチゴは正常な歯でしか食べられません。
現在の虫歯の状況を示すので、イチゴを最大で何度食べられるか求めなさい。

</details>

## アプローチ
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/23e26f42-4aed-4e30-acb7-bdfe4300e7b7.jpeg)

<details><summary>画像の文字起こし</summary>

歯を左から順番に見ていきます。
イチゴを食べるのに必要な歯までをスライスして、虫歯がないことを確認します。
虫歯がなければ、食べられるイチゴの個数を＋1します。
次に確認する歯は、必要本数分の後ろから見ていきます。

</details>

# C問題
https://atcoder.jp/contests/abc379/tasks/abc379_c

## 問題
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/112c01a0-cfd4-3e25-5abf-81c7e0cb0a8b.jpeg)

<details><summary>画像の文字起こし</summary>

石が置かれたマスがあります。
石は1つ右へ1つずつ移動させることができます。
1つのマスに1つずつ石が置かれるようにするには、
石を最低何回移動させればいいか求めなさい。
ただし、不可能な場合もあります。

</details>

## アプローチ
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/f4221110-028a-f6dc-0d93-4d15e266c57e.jpeg)
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/3b677979-7c44-eb4d-70a0-0660d795d799.jpeg)
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/73915946-20d6-f0c3-c821-f51842597e84.jpeg)

<details><summary>画像の文字起こし</summary>

移動回数を求める前に前処理をします。
まずinputをマス目順にソートします。

次に不可能な場合の検証をします。
不可能な場合とは「そのマスまでの石の数が足りない時」
と「石の合計数がマス数に合わない時」の2つです。

移動回数は石の配置の重み付けの総和の現在と理想の差で求められます。
重み付けの総和とはマス番号と石の数の積です。

理想の石の配置の重み付けの総和は 1 * 1 + 2 * 1 ＋ … * N + 1 = N *（N + 1）// 2です。

Nまでの総和の式の導き方
100までの総和の時、1+100、2＋99…のような101のセットが50（100/2）個のため、
N*（N+1）//2になります。

石を1つ移動すると重み付けも＋1されます。

つまり、石を移動することで、理想の石の配置との総和の差が1ずつ減少します。
移動回数＝理想の石の配置との総和の差となります。

</details>

# D問題
https://atcoder.jp/contests/abc379/tasks/abc379_d

## 問題
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/8507076d-2c3d-b818-1b4c-e24e157de256.jpeg)

<details><summary>画像の文字起こし</summary>

植える・待つ・収穫するという3種類の植物に関する指示が与えられます。
収穫は一定期間が経過した植物が対象です。
収穫の指示があった時に収穫できた植物の数を求めなさい。

</details>

## アプローチ
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/bcba9523-72be-cf00-8343-8403c5179c1b.jpeg)

<details><summary>画像の文字起こし</summary>

配列とキューで植物の高さを管理します。
配列に植えた時の累積日数を、キューにその配列のインデックスを記録します。

収穫の際には現在までの累積日数と各植物を植えたタイミングでの累積日数の差を
チェックします。
それがボーダー以上なら収穫、キューからもポップします。

</details>
PowerDNSとPowerDNS Adminで内部DNSを整備した話〜フルリゾルバ編〜


:::note info
この記事ではまずフルリゾルバの構築をしています。
権威DNSの構築は17日目、PowerDNS Adminの設定は19日目をご覧ください。

権威DNS: <https://qiita.com/yuito_it_/items/3e74cf14ca0b2bc1e434>
PowerDNS Admin: <https://qiita.com/yuito_it_/items/d868a64c20035359a6df>
:::

## はじめに

今回は内部DNSを立ててローカルIPに対してドメイン名でアクセスできるようにしていきます。
フルリゾルバは全てのドメインのデータを返すことのできるDNSサーバーです。

これを構築すると、内部の権威DNSも使えますし、名前解決が早くなるかもしれません。

### PowerDNSとは

PowerDNSはGPLライセンスの下で公開されているDNSサーバーです。
そしてこれは、権威DNSサーバーもフルリゾルバも構築できます。
今回はこれを用いて、今回フルリゾルバを作成していきます。

https://www.powerdns.com/

## 環境

PowerDNSはDBでレコードを管理しています。
MySQLやPostgresSQLなどさまざま対応していますが、今回はPostgresSQLを使用していきます。

```sh
cat /etc/os-release

PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
```

## PowerDNSをインストール

普通にaptでインストールします。

```sh
sudo apt install pdns-recursor
```

しかし、最近のOSは53番ポートを`systemd-resolved`が使用しているため、今は起動に失敗した皆のエラーが発生します。
無視して構いません。

`systemd-resolved`を止めればいいってものでもなくて、これを止めるとaptコマンドが通らなくなるので、最後に調整します。

## 設定ファイルを編集する

設定ファイルは`/etc/powerdns/recursor.conf`にあります。

それぞれ以下の行を探して編集してください。

```
allow-from=172.16.0.0/16 # どこからのリクエストを受け入れるか(例ではプライベートIPのみ)
forward-zones= example.com=127.0.0.1:5300 # 特定のドメインに関するリクエストを指定のDNSサーバーに転送する。詳しくは前の記事を参照
forward-zones-recurse=.=1.1.1.1 # 再起リクエスト先。キャッシュになかったり、forward-zonesに指定されていないドメインについての問い合わせ先
local-address=172.16.100.180,127.0.0.1 # 自分のIP。v6がある場合にはそれも。
```

### 権威DNSの設定を変更

同じサーバーで[前の記事](https://qiita.com/yuito_it_/items/3e74cf14ca0b2bc1e434)のように権威DNSを構築している場合、ポートを変更する必要があります。
今回は5300に変更しました。

### DNSSEC

内部の権威DNSを使用する場合、DNSSECの関係でエラーが発生することがあります。
これを解決する方法は二つあります。

1. 全てのDNSSECを無効化する
2. 特定のドメインのみDNSSECを無効化する
3. 権威DNS鯖をDNSSECに対応させる

あんまり数が多いのであれば、1を選んでもいいかと思います。
今回はそこまで数はないことと、DNSSECに権威DNS側で対応させる方法がいまいちわからなかったので、2番をやっていこうと思います。

ネガティブトラストアンカー([RFC7646](https://tex2e.github.io/rfc-translater/html/rfc7646.html))を設定していきます。[^1]
`/etc/powerdns/recursor.lua`をいじればいいらしいので、以下の通り追記。

```diff_lua:recursor.lua
+ addNTA('example.com.', "The LABO Use Only(ここに理由)")
```

[^1]:https://doc.powerdns.com/recursor/dnssec.html#negative-trust-anchors

さて、これで完了です。

## 起動してテスト

さて、起動してみましょう。
53番ポートで競合している`systemd-resolved`も停止します。

```sh
sudo systemctl disable --now systemd-resolved
sudo systemctl restart pdns # 権威サーバーもある場合
sudo systemctl enable --now pdns-recursor
```

それでは、テストしてみましょう。

```
$ dig google.com @127.0.0.1

# 前略
;; ANSWER SECTION:
google.com.  71 IN A <IP>
# 後略

# 権威サーバーもある場合はこっちも
$ dig exsample.com @127.0.0.1

# 前略
;; ANSWER SECTION:
exsample.com.  71 IN A <権威サーバーで設定したIP>
# 後略
```

こうなればOKです。

次回はPowerDNS Adminという管理のWebアプリをデプロイしていきます。
DNS名前空間と階層

>トップ・レベル・ドメイン(top-level domain)は、ICANN(Internet Corporation for Assigned Names and Numbers:割当名前・番号インターネット協会)と呼ばれる組織によって管理されている。ICANNは、インターネットの世界的普及目的と経済的な理由から1998年に設立された。概念には、インターネットは250のトップ・レベル・ドメイン(top-level domain)に分割される。各ドメインはたくさんのホストを含む。トップ・レベル・ドメインはサブドメインに分割され、サブドメインがさらに分割されていく。

>一つのだけを含むホストかもしれないし、企業のドメインで何千ものホストを収容しているかもしれない。

### トップレベルドメインの種類
>トップレベル・ドメインには、ジェネリック・トップ・レベル・ドメイン(gTLD: generic Top Level Domain)や国コード・トップ・レベル・ドメイン(ccTLD: country code Top Level Domain)などがある。
...
国コード・トップ・レベル・ドメインは、各国に一つのエントリが割り当てられており、ISO3166で定義されている。

### レジストリ>レジストラ　レジストラがドメインを販売する
>name-of-company.comのような第２レベルのドメインを取得するのは簡単である。トップ・レベル・ドメインはICANNが承認した複数のレジストリ(registry)と呼ばれる会社によって運用されている。例えば、comのレジストリはベリサイン社である。comの一つしたのレベルは、レジストラ(registrar)がドメイン名をユーザーに直接販売する。多くのレジストラが価格とサービスの競争をしている。

### FQDNで最下層のマシンまでわかる
>`www.cs.uchicago.eduやcisco.comなどのようにマシンを探索する時に用いられるドメイン名は、通常FQDN(Fully Qualified Domain Name:完全就職ドメイン名)と呼ばれる。FQDNはん、もっとも最下位の具体的なマシン名から始まり、最上位のTLDで終わる。

### ドメイン名は大文字、小文字関係ない
>ドメイン名は大文字、小文字どちらでもよく、eduとEdu,EDUは同じ意味である。名前の各構成要素は63文字までの長さが許されるが、経路名の全長が255文字を超えてはいけない。大文字と小文字を区別しないというDNSの性質が、さまざまなDNS攻撃に対する対攻撃性を高めるために使われてきた。

### トップレベルドメインは基本またがない
>原理的には、ドメインはジェネリック・ドメインか国ドメインのいずれかでツリー構造に入れることができる。例えば、cc.getech.eduはcc.gt.atl.ga.usのように米国ドメインとしても登録できるであろう。しかし、実際には米国のほとんどすべての組織がジェネリック・ドメインの下に位置し、米国以外のほとんど全てのドメインが各国のドメインの下に位置する。二つのトップ・レベル・ドメインの下で登録することに対して特に規則はないが、多国籍の大きな組織を除いて、そうする組織はほとんどない。

### DNSの構造によって近くで許可が済む　サブドメインの作成は許可なくできる
>新しいドメインを取得するには、そのドメインの上位ドメインの許可が必要となる。例えば、シカゴ大学でセキュリティ研究グループが発足し、security.cs.uchicago.eduというドメイン名を取得したい場合、cs.uchicago.eduの管理者の許可が必要である。（幸いなことに管理者は近くにいることが多い。これもDNSアーキテクチャのおかげである。)同様に、「ノーザン・サウスダコタ大学」が新しく認可されたとしたら、eduドメインの管理者にunsd.eduを割り当てるように依頼する（もしもそれがまだ使われていなければ)。このようにして名前の衝突が避けられ、各ドメインは自分のサブドメインの情報を維持することができる。新しく作成、登録されたドメインは、上位ドメインの許可なく受ける必要なくcs.unsd.eduのようなサブドメインを作成できる。

* サブドメインとは？

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
bashスクリプト内で使われているツールのstatus codeが間違っていた場合の対応

LIFULLには[社内の広告データ管理システム](https://www.lifull.blog/entry/2020/09/09/080000)があり、そこで多くのバッチ処理が動いています。

そのシステムでembulkのかなり古いバージョンを使ってしまっていて、[こちらのIssues](https://github.com/embulk/embulk/issues/771)にあるように、一部のエラーの場合でもexit codeが0になるような問題があります。例えば「10日間遡って広告データを取得する」バッチ処理で、一部の日付で取得エラーが発生しても正常終了として扱われるため、これらのミスを検知できないことがありました。

でも他の作業のため、なかなか必要なバージョンまでたどり着けない…という悩みがずっとあったのですが、ひとまず標準出力にあるエラーメッセージを使って対症療法で対応することにしました。

```bash:embulk_wrapper.sh
#!/bin/bash -eu

search_string="org.jruby.exceptions.RaiseException" #  エラーメッセージにある文言
embulk_error_detected=0

# 一時ファイルを用意する
temp_output=$(mktemp)

embulk "$@" | tee "$temp_output"

if grep -iq "$search_string" "$temp_output"; then
  embulk_error_detected=1
fi

rm -f "$temp_output"

if [ $embulk_error_detected -eq 1 ]; then
  echo "embulk error detected"
  exit 1
else
  exit 0
fi
```

これで、embulkの呼び出し側をこのスクリプトの呼び出しに変更します。

```bash:バッチ処理.sh
- embulk run <オプション>
+ ./embulk_wrapper.sh run <オプション>
```

私はbashの実装に苦手意識があったのですが、ChatGPTやCopilotなどの生成AIですぐ対応できるようになったので改善が進みますね！

## 余談

元々は一時ファイルを用意しない方法を探していて、生成AIからこういうコードを提案されたのですが、実は `embulk_error_detected` の変数が書き換わらなかったり（[サブシェルでの実行扱い](https://qiita.com/kkdd/items/64caa6288393e7327793)で変数更新できないらしいです）、

```bash:embulk_wrapper.sh
#!/bin/bash -eu

search_string="org.jruby.exceptions.RaiseException"
embulk_error_detected=0

embulk "$@" | while IFS= read -r line; do
  echo -e "$line"

  # if echo "$line" | grep -iq "org.jruby.exceptions.RaiseException"; then
  if echo "$line" | grep -iq "$search_string"; then
    embulk_error_detected=1
  fi
done

if [ $embulk_error_detected -eq 1 ]; then
  echo "embulk error detected"
  exit 1
else
  exit 0
fi
```

次はこういうコードになったのですが、本番環境では必要な権限 `tee: /dev/fd/3: Permission denied` が無かったりと苦戦しました。AIがあっても（しばらくは）試行錯誤は人間の仕事みたいです。

```bash:embulk_wrapper.sh
#!/bin/bash -eu

search_string="org.jruby.exceptions.RaiseException"
embulk_error_detected=0

exec 3>&1

embulk_output=$(embulk "$@" | tee >(grep -iq "$search_string" && embulk_error_detected=1) | tee /dev/fd/3)

if [ $embulk_error_detected -eq 1 ]; then
  echo "embulk error detected"
  exit 1
else
  exit 0
fi
```
API Best Practices ~ステータスコードの伝播は慎重に

## ステータスコードの伝播は慎重に

https://protobuf.dev/programming-guides/api/#propagate-status-codes

RPCサービスはエラーを調査し、呼び出し元に意味のあるステータスコードを返すことに注意する必要があります。

例として、引数を取らないProductService.GetProductsを呼び出すクライアントを考えてみましょう。

```protobuf
digraph toy_example {
  node [style=filled]
  client [label="Client"];
  product [label="ProductService"];
  locale [label="LocaleService"];
  client -> product [label="GetProducts"]
  product -> locale [label="LocaliseNutritionFacts"]
}
```

GetProductsの一部として、ProductServiceはすべての製品を取得し、各製品に対してLocaleService.LocaliseNutritionFactsを呼び出すかもしれません。
ProductServiceが誤って実装されている場合、LocaleServiceに間違った引数を渡して、INVALID_ARGUMENTが発生する可能性。
ProductServiceがエラーを呼び出し元に不注意に返すと、クライアントはINVALID_ARGUMENTを受け取ります。
なぜなら、ステータスコードはRPC境界を越えて伝播するからです。
しかし、クライアントはProductService.GetProductsに引数を渡していません。
そのためエラーは無意味なものよりも悪いものです。非常に混乱を招くでしょう。

代わりに、ProductServiceはRPC境界で受信したエラーを調査する必要があります。
つまり、実装するProductService RPCハンドラです。
呼び出し元から無効な引数を取得した場合、INVALID_ARGUMENTを返す必要があります。
下流の何かが無効な引数を受け取った場合、INVALID_ARGUMENTをINTERNALに変換してから呼び出し元にエラーを返す必要があります。

ステータスエラーを不注意に伝播すると、混乱につながります。
さらに悪いことに、すべてのサービスがクライアントエラーを転送しアラートが発生しないため、見えない障害につながる可能性があります。

一般的なルールは、RPC境界ではエラーを調査し、適切なステータスコードで呼び出し元に意味のあるステータスエラーを返すことです。
意味を伝えるために各RPCメソッドは、どのような状況でどのようなエラーコードを返すかを文書化する必要があります。
各メソッドの実装は、文書化されたAPI契約に準拠する必要があります。

---

ステータスコードの一覧はこちら
https://grpc.io/docs/guides/status-codes/

よく遭遇するケースとしては、複数のサブRPCをコールするもので UNAVAILABLE エラーが返ってくるなど。
サブRPCの UNAVAILABLE なのか、自身のサービスが UNAVAILABLE なのかを区別するためには、ステータスコードを適切に変換する必要があります。
【ABC解説】 ABC376 解説 (B~D)【Python】

AtCoder Beginner Contest 376（Promotion of AtCoder Career Design DAY） のB問題〜D問題をPythonで解説します。

https://atcoder.jp/contests/abc376

# 提出コード

https://github.com/Syogo-Suganoya/AlgoArena/tree/main/atcoder/ABC/ABC376

# B問題
https://atcoder.jp/contests/abc376/tasks/abc376_b
## 問題
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/7548d663-8dc9-247c-7a3b-ac2634100ab3.jpeg)
<details><summary>画像の文字起こし</summary>

円形にN個のパーツが繋がったリングあります。
最初はL（左手）に1番目、R（右手）に2番目のパーツを持っています。
Rは右回りに、Lは右回りに1つずつ移動します。
ただし、同じパーツを両手で持つことはできません。

移動先にもう一方の手がある場合は、逆回りで移動します。

与えられた指示に従うために必要な操作回数の合計の最小値を求めてください。

</details>

## アプローチ

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/29061de6-5d78-a8ee-7414-07c313b07d2a.jpeg)

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/e71dcd6e-422c-df89-9591-6108cebe4dc7.jpeg)

<details><summary>画像の文字起こし</summary>

移動元をfrom、移動先をto、もう一方の手をngとおきます。
右回り、左回りの場合分けは無視できます。ngを通らない回り方が常に選択経路になります。

from,to は入れ替えてしまっても問題ないです。操作回数に影響しないため。
常にfrom≤toを満たすようにすることができます。

from＜ng<toの場合、N+from-to
それ以外の場合、to-fromで計算できます

計算量はO（N）です。

</details>

# C問題
https://atcoder.jp/contests/abc376/tasks/abc376_c

## 問題
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/bb6ecc4d-0e37-5447-4c5a-6d33682ae8c7.jpeg)

<details><summary>画像の文字起こし</summary>
N個のおもちゃとN-1個の箱があります。それぞれ大きさが決まっています。
箱を1つ購入して全てのおもちゃが入りきるか判定してください。
新しく購入するは可能な限り小さくしてください。

大きさ3の箱を購入することで
全てのおもちゃを箱に入れられます。

どんな大きさの箱を購入しても
箱に入りきらないおもちゃが出てきます。
</details>

## アプローチ
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/4eaf5e50-f4cf-5d01-28ee-53319301a20e.jpeg)
![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/baefa460-7e85-bc6a-5fac-2cfaef3f15c6.jpeg)
![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/3a31fe8e-b633-2e0d-9169-c2bdf916d69e.jpeg)

<details><summary>画像の文字起こし</summary>

まず、ソートします。
次に全てのおもちゃが入りきるかを判定します。
おもちゃと箱を昇順に比較して、おもちゃの方が大きいケースが存在したら、
入りきらないと判定できます。

おもちゃと箱の差ができるだけ出ないように
昇順ソート順で比較します。

最大おもちゃは購入する箱で
調整可能なので、最も効率的に
箱に入れた時、最大おもちゃ以外が
入り切るかをチェックします

おもちゃがは入りきることがわかったので、次は購入する最小の箱を見つけます。
おもちゃと箱を降順に見ていき、おもちゃと1つ小さい箱を比較します。
おもちゃの方が小さければ、そのおもちゃの箱は既存の箱で十分ということです。
逆に、おもちゃの方が大きければ、そのおもちゃの大きさが購入する箱に
なります。

7のおもちゃは8の箱
5のおもちゃは6の箱

3のおもちゃは2の箱に入らないので、
購入する箱は3です。

最後までおもちゃの方が小さいままだったら、
一番小さいおもちゃの大きさの箱を購入します。

大きさ1のおもちゃが入ればいいので、
購入する箱は1です

計算量はO（NIogN））です。

</details>

# D問題
https://atcoder.jp/contests/abc376/tasks/abc376_c

## 問題
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/ea3579ca-2938-2cc6-5169-1b42da3c59dd.jpeg)

<details><summary>画像の文字起こし</summary>

単純有向グラフに頂点1を含む閉路が存在するか判定してください。
存在する場合、当てはまる閉路のうち、最短の平路の長さを求めてください。

</details>

## アプローチ
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/37b58379-ae46-ead5-5dce-65b2ecb0fc24.jpeg)

<details><summary>画像の文字起こし</summary>

BFS（幅優先探索）で解くことができます。
特に最短経路の発見や、特定の条件を満たすノードの探索に
向いているグラフ探索アルゴリズムの一種です。
BFSを用いて各頂点への距離を距離の昇順に計算します。
頂点1へ帰る辺の時、距離に1を加えたものが解になります。

計算量はO（N+M）です。

</details>
Voicy Studioで行ったハッシュタグ改善の話

こちらは[Voicy Advent Calendar 2024](qiita.com/advent-calendar/2024/voicy)の15日目の記事になります。

こんにちは。VoicyでiOSエンジニアをしているピカソです。
私のチームは、アプリを快適に使っていただくためにユーザー（パーソナリティーとリスナー）の体験改善に日々取り組んでいます。
今回は、その中でもパーソナリティー用収録アプリ「Voicy Studio」で実施した「ハッシュタグ」に関する改善の話をご紹介します。

## 改善前の問題

Voicy Studioでは、パーソナリティーが放送を録音する際、掲載期間に合わせて放送につけて公開すると、 アプリ上の指定の場所に掲載されるハッシュタグ「デイリートークテーマ」や通常の「ハッシュタグ」を選択できる機能が付属しています。しかし、下記のような要望が目立つ状況でした。

1. トークテーマが見にくく、掲載期間の把握も簡単では無い
2. トークテーマのハッシュタグが選択式ではなく、手書き入力しないといけない。そのため「#」を書いた時に候補を表示し、選択できる機能が存在しなかった

これにより、パーソナリティーはトークテーマやハッシュタグを「探して、覚えて、手書き入力する」という大きなペインを抱えていました。

## 実施した改善内容

これらの問題を解決するため、私たちは以下の改善を実施しました。

### 1. デイリートークテーマの見やすさの改善
デイリートークテーマをリスト化し掲載開始日時と終了日時をそれぞれに表示することで期間の把握を容易にしました。

### 2. ハッシュタグの候補機能の実装
「#」を入れて入力すると候補のリストが表示され、それを選択するだけで入力できるまた選択中の物も分かりやすくする実装をしました。これにより、視覚的なインターフェースと操作性が大きく向上しました。

## 改善の結果

この改善を実施した結果、さまざまな測定値で大きな変化が確認できました。

### パーソナリティーアンケートの結果
- 「ハッシュタグの入力改善が滿足度にポジティブな影響を与えた」と答えたパーソナリティーの方が半数以上に達しました

### トークテーマ参加チャンネル数と放送数
- 改善実施前の平均と比較して、トークテーマ企画参加チャンネル数が40%増加し、放送数も同様に40%増加しました

## 実施を通じて学んだこと

この改善を通じて、パーソナリティーに共感される改善は、数値を大きく動かしやすいということを再認識しました。

リスナーの行動はコンテンツがあることで初めて変化されるため、パーソナリティーの放送に対するハードルやペインを取り除くことが重要です。

その結果、コンテンツ数の増加や質の向上が期待でき、それに伴いリスナー数値も自然に上がるというプロセスを確認しました。

## 終わりに

最後に、この改善を通じてパーソナリティーのペインを解消し、高い満足度を実現する事の重要性を再認識しました。

これからも、小さなことでもパーソナリティーの体験改善に努め、より良いUXを提供するアプリを作っていきたいと思います。
Alacritty、Oh My Posh、そしてZellij！今年見直したターミナル環境

今年はnvimに移行しましたが、その他にもいくつかターミナル関連のアプリを試してみたので、ここでまとめてみたいと思います。


## セッションマネージャー
### Zellij

https://zellij.dev/

Tmuxを愛用していましたが、Zellijを試してみました。  
Rust製で、`Ctrl + `を使ってメニューを切り替えて操作します。画面下にメニューのヒントが表示されるため、初心者にも分かりやすい設計になっています。


## ターミナルプロンプト
### Oh My Posh

https://ohmyposh.dev/

テーマファイル（JSON形式）を読み込んで利用するターミナルプロンプトです。テーマが充実([テーマ一覧](https://ohmyposh.dev/docs/themes))しており、シンプルで使いやすいのが特徴です。以前はfishのテーマを使用していましたが、現在はOh My Poshをメインに使用しています。

### Starship

https://starship.rs/

TOML形式([設定ガイド](https://starship.rs/config/))で細かくカスタマイズ可能なターミナルプロンプトです。初めは楽しく設定していましたが、細かく設定しすぎてしまい、プロジェクトによって表示が崩れることもあったため、最終的に使用をやめました。


## ターミナルエミュレータ
### Alacritty

https://alacritty.org/

Rust製のターミナルエミュレータで、機能を最低限に抑えることで非常に高速に動作します。
去年はiTerm2からTabbyに乗り換えましたが、現在はAlacrittyをメインに使用しています。「早いは正義！」を体現するツールです。

### Kitty

https://sw.kovidgoyal.net/kitty/

Tabbyと同様に高機能なターミナルエミュレータです。ただし、私には必要以上の機能が多かったため使用をやめました。

### Warp

https://www.warp.dev/

AI機能を搭載したターミナルエミュレータです。初期設定の見た目が完成されており、自分好みにカスタマイズできなかったため、使用をやめた記憶があります。


## ファイルマネージャー
### yazi

https://yazi-rs.github.io/

Finderのようにターミナル上で操作可能なファイルマネージャーです。画像のプレビュー機能もあり、非常に興味深いツールです。
ただし、Alacrittyでは画像プレビューが動作しないため、あまり使用していません。


## まとめ

今年試したターミナル系アプリは多くありませんが、最終的に以下の環境で快適な開発ライフを送っています。

- **ターミナルエミュレータ**: Alacritty  
- **ターミナルプロンプト**: Oh My Posh  
- **セッションマネージャー**: Tmux  

開発ツールは人それぞれ好みが分かれると思いますが、この記事がどなたかの参考になれば幸いです。最後までお読みいただきありがとうございました。

また、nvimに移行した感想も別記事で書いていますので、ぜひそちらもご覧ください！  

https://qiita.com/hanlio/items/b41eda69d6ebf170c0a1
【基礎確認】pythonのtypingモジュール

# はじめに
[LangChainとLangGraphによるRAG・AIエージェント［実践］入門](https://www.amazon.co.jp/dp/B0DK4YGYBL?tag=xpg-22&linkCode=ogi&th=1&psc=1)
を読んでいて、10章で躓いたので、初心に戻って、一つずつ紐解いて学習することにしました。
今回のテーマは「typing」モジュール

# 前回までの投稿
[【基礎確認】pythonのoperatorモジュール](https://qiita.com/o_chan_t/items/4ad3cd5fc832f9be9d86)

# サンプルコード

```sample.py
from typing import Annotated, Any, Optional

# Annotatedの使用例
def greet(name: Annotated[str, "ユーザーの名前"]) -> str:
    return f"こんにちは、{name}さん！"

# Anyの使用例
def print_anything(item: Any) -> None:
    print(f"入力された値: {item}")

# Optionalの使用例
def divide(a: float, b: Optional[float] = None) -> float:
    if b is None:
        return a
    return a / b

# 関数の使用
print(greet("太郎"))
print_anything(42)
print_anything("Hello")
print(divide(10, 2))
print(divide(5))
```

## 解説
typingモジュールからAnnotated, Any, Optionalをインポート。

1. Annotated
   型ヒントに追加の情報を付加するために使用する。
   例では、greet関数の引数nameに"ユーザーの名前"という注釈を追加している。

2. Any
   どのような型でも受け入れることを示す。
   print_anything関数は、任意の型の引数を受け取り、その値を出力する。

3. Optional
   引数が省略可能であることを示す。
   divide関数では、第二引数bがOptional[float]型で、デフォルト値がNoneに設定されている。

これらの型ヒントを使用することで、コードの可読性が向上し、静的型チェッカーやIDEがより正確な型情報を提供できるようになる。

## 独り言
正直、個人開発が多かったので、Annotatedとか使う機会がなかったんですよね。
多分、pythonの文法書とかで読んだ記憶はあると思うけど、使用する機会がないから記憶に残っていなかったと。
これを機会に使ってみて、便利さを実感できたら積極的に使うようにしよ。
｢ログライン｣で鍛錬を積み｢要件定義｣に磨きをかけよう

## ★0.はじめに〜ご挨拶と狙い
こちらは｢グレンジ Advent Calendar 2024｣の23日目の記事となります。

前提として本記事は、｢映画好き｣かつ｢ゲーム制作の仕事に携わっている｣ニッチな方を対象としています。

いわゆる｢面白い映画」における美しい｢シナリオ｣とは、たくさんの文章が一定の構造に従いロジカルな構成で作成されていますが、その｢シナリオ｣を作成するにあたって｢ログライン｣という簡潔に表現された一文から進行を始めることがセオリーです。

**｢ログライン｣には必ず｢目的｣と｢条件｣が的確に存在し、｢シナリオ｣もそれに沿って最適なバランスで文章を構築する必要があります。**

**一方プロジェクト開発において、その入り口で作成すべき｢要件定義｣についても、明確な｢目的｣と｢条件｣が必須となります。**

**すなわち本記事の狙いは、｢ログライン｣作成の鍛錬を積むことで、｢要件定義｣作成の能力に磨きをかけることが可能ではないか、というところにあります。**

本記事を通して、｢シナリオ｣の入り口である｢ログライン｣と、プロジェクト開発に必要な｢要件定義｣についての概要に触れ、そこに少しでも興味を持ち、さらにはその作成スキルを身につけていただけましたら幸いです。

## ◆1.本記事の要件定義
### 1-1.本記事の目的
**・シナリオ作成に欠かせない｢ログライン｣の構造を学び研鑽を積むことで、プロジェクト開発に欠かせない｢要件定義｣作成の能力を磨く一助となること。**

### 1-2.本記事の条件
・｢ログライン｣と｢要件定義｣について理解すること。
・｢目的｣と｢条件｣について理解すること。
・｢ログライン｣作成の鍛錬により得た経験を｢要件定義｣作成に活かすこと。

## ◆2.｢ログライン｣と｢要件定義｣
## 2-1.｢ログライン｣とは
｢一言で言うと、どんな物語？｣です。
**物語における｢誰が、何をして、どうなるか｣が、一言で簡潔に表現されたものを指します。**

特にハリウッドでは、脚本家や監督がプロデューサーに企画を持ち込む際に必須のもので、これの出来如何によって次の段階に進めるかどうかが決まります。

まともな｢ログライン｣を作成できないようでは、素敵な映画は作れません。

### 2-1-1.｢ログライン｣の構成要素
**｢誰が、何をして、どうなるか｣は｢目的｣と｢条件｣に分解できます。**

**①目的：｢誰が、どうなるか｣が｢目的｣です。**　｢主人公の変化｣を表現します。
**②条件：｢何をして｣が｢条件｣です。**　主人公が｢何をきっかけに変化したか｣を表現します。

以下具定例をもとに｢ログライン｣の理解を深めてみましょう。
### 2-1-2.｢ログライン｣の具体例

例えば｢平凡で気弱な少女が、神々の世界で働くことで、たくましく成長する物語｣というログラインがあります。

この場合、
**①目的：｢平凡で気弱な少女が、たくましく成長する｣**
**②条件：｢神々の世界で働くことで｣**
となります。

｢平凡で気弱な少女｣が、｢神々の世界で働くこと｣をきっかけとして、｢たくましく成長（変化）｣することを一言で表現しています。
なお、こちらは映画｢千と千尋の神隠し｣のログラインとなります。

## 2-2.｢要件定義｣とは
**該当プロジェクトの目的を明確にし、必要な機能や性能、条件などを明確に定めるプロセスを指します。**

目的をはっきりさせることで、プロジェクトの方向性が定まり、関係者が共通のゴールを理解し、ミッションを遂行できるようになります。
目的を明確化させないと、プロジェクトの進行が阻害されたり、必要としていた成果物と異なるものが完成するといったトラブルにつながります。

### 2-2-1.｢要件定義｣の構成要素
以下の通りになります。
**①目的：シンプルに何のためにやるのか**
**②条件：予算/仕様/絶対制約/要望制約/スケジュール/ステークホルダー等々**

### 2-2-2.｢要件定義｣の具体例

例えば｢お客様の満足度を上げたいから、Aの機能をアプリに入れてみよう｣というプロジェクトが始動したとします。

この場合、
①目的：｢A機能をリリースして、お客様の満足度を上げる｣
②条件：｢予算/マーケティングリサーチ/仕様策定/決裁者/スケジュール/開発/テスト等々｣
となり、これを要件定義書に落とし込みます。

目的を不明瞭にせず明確化し、丁寧に条件項目を設定することで、プロジェクト開発を円滑に進めることができます。

## ★3.おわりに〜何を伝えたいのか
**｢ログライン｣と｢要件定義｣の構成要素は同じです。**

｢ログライン｣は映画鑑賞後に研鑽のために作成することも可能です。
ですので、映画鑑賞後にその映画の｢ログライン｣を作成してみることで、｢目的｣と｢条件｣の構成要素を理解する鍛錬となり、自然と｢要件定義｣作成の能力が身につくはずです。

また｢要件定義｣の作成を習慣づけると、プロジェクト開発の入り口だけでなく、さまざまな部分で活用することができます。
例えば仕様書作成やプレゼンはもちろんのこと、細かなミーティングの名称でさえも、｢ログライン｣同様に一言で簡潔に表現されたものを作り出すことができます。

**映画好きな方は、ぜひお手隙の際に｢ログライン｣作成にチャレンジいただき、｢要件定義｣作成の能力を磨いていただけましたら幸いです。**

簡単ではございますが、以上にて今回の記事は終了です。
最後までご一読いただき、ありがとうございました。
Logstashを利用して S3に保管されたログを別システムへ転送する

# 概要
S3はログファイルを格納するストレージとして利用されることが多いです。
本記事では、S3に格納されたログファイルの内容を別システムへ転送するための手順を記載します。

# 環境
本手順で取り扱う内容は、次の環境にて確認しています。
* Logstash
マシン：Amazon EC2
マシンサイズ：2vCPU 2GB
OS：Ubuntu 24.04
Logstash：8.17.0

構成図は次のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510470/d3678c6b-2a0f-8a1f-02f1-c486a9df3d5c.png)

S3バケットに随時格納されていくログファイルの内容をLogstashによって読み取り、別システムへ転送する仕組みです。

# 前提条件
* S3バケットは作成済みであること
* Logstashをインストールするマシンは作成済みであること

# 手順
## Logstashインストール
[Logstashのガイド](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)に従ってください。
次のコマンドでは、Ubuntu24.04にLogstashをインストールします。
```
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg
$ sudo apt-get install apt-transport-https
$ echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-8.x.list
$ sudo apt-get update && sudo apt-get install logstash
```



## Logstash セットアップ
`/etc/logstash/conf.d/logstash.conf`ファイルを作成して下さい。
```
$ sudo vi /etc/logstash/conf.d/logstash.conf
```

ファイルの中身を書き換えて下さい。
次のlogstash.confはサンプルになります。
各パラメータの詳細が知りたい場合は、ドキュメントを参照して下さい。
[S3 input plugin](https://www.elastic.co/guide/en/logstash/current/plugins-inputs-s3.html)
[Http output plugin](https://www.elastic.co/guide/en/logstash/current/plugins-outputs-http.html)
```
input {
  s3 {
    access_key_id => "<YOUR-AWS-ACCESSKEY>"
    secret_access_key => "<YOUR-AWS-SECRETACCESSKEY>"
    region => "<YOUR-REGION>"
    bucket => "<YOUR-S3BUCKET>"
    interval => "10"
    delete => false
    watch_for_new_files => true
    include_object_properties => false
    codec => multiline {
      pattern => "^\s|^}"
      what => "previous"
    }
  }
}

output {
  http {
    http_method => "post"
    url => "<YOUR-ENDPOINT>"
    headers => { "Authorization" => "Bearer <YOUR-ACCESSTOKEN>" }
    content_type => "application/json"
  }
}
```

Logstashを起動して下さい。
```
$ sudo systemctl start logstash
```

# 動作確認
S3バケットにログファイルをアップロードし、
転送先システムにて、ログが受信できていることを確認して下さい。
もし、受信できていない場合、Logstashログ(/var/log/logstash/logstash-plain.log)を確認することが有効です。

# 補足
* Logstashのバージョン確認コマンド
```
$ /usr/share/logstash/bin/logstash --version
```

* Logstash自動起動 有効化設定
※デフォルトでは無効となっています。
```
$ sudo systemctl enable logstash
```

# 参考
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-s3.html
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-http.html
【基礎確認】pythonのoperatorモジュール

# はじめに
[LangChainとLangGraphによるRAG・AIエージェント［実践］入門](https://www.amazon.co.jp/dp/B0DK4YGYBL?tag=xpg-22&linkCode=ogi&th=1&psc=1)
を読んでいて、10章で躓いたので、初心に戻って、一つずつ紐解いて学習することにしました。

## 独り言
2024年12月19日時点で約半額ポイント還元セールしていますね。
購買予約していて販売日(2日遅れ)で配信されたものの、1ヶ月待ってれば良かった。
・・・と思う反面、技術本って鮮度が大事だし、特にlangchainはバージョンアップの速度が激しいから、必要な本は、いつあるか分からないセール期間を待ってもいられないのですよね。
まぁ、この本を読んだお陰で、ネット上の知識も有意義に出来るし、多少のバージョン変更に対して読み替えも出来るようになったから、発売日に購入した後悔はないですが。
ネットで最新情報は手に入るけれど、体系的に説明してもらわないと理解できない身としては、技術書は非常に重宝しています。

# サンプルコード

```sample.py
import operator

# operatorモジュールの基本的な使用例
numbers = [1, 2, 3, 4, 5]
result = operator.add(10, 5)
print(f"10 + 5 = {result}")

total = sum(numbers)
print(f"合計: {total}")

product = operator.mul(3, 4)
print(f"3 * 4 = {product}")

is_greater = operator.gt(10, 5)
print(f"10 > 5: {is_greater}")```
```

## 解説
operatorモジュールは、Python の標準ライブラリの一部で、効率的な算術演算や比較演算を行うための関数を提供する。

1. `operator.add(a, b)`: 2つの引数の和を返す。
   例では10と5を加算している。

2. `sum(iterable)`: イテラブル（リストなど）の要素の合計を計算する。
   これは直接operatorモジュールの関数ではないが、内部的にoperator.addを使用している。
```sum_function.py
# reduce 関数は、イテラブル（リストやタプルなど）の要素に対して、指定された関数を累積的に適用し、単一の値に集約するために使用される。
# 
# reduce(function, iterable, initializer=None)

# function は2つの引数を取る関数で、イテラブルの要素に繰り返し適用される。
# iterable は処理対象のシーケンス（リスト、タプルなど）。

import operator
from functools import reduce

numbers = [1, 2, 3, 4, 5]
total = reduce(operator.add, numbers)
print(total)
```
3. `operator.mul(a, b)`: 2つの引数の積を返す。
   例では3と4を乗算している。

4. `operator.gt(a, b)`: aがbより大きい場合にTrueを返す。
   例では10が5より大きいかを確認している。

operatorモジュールは、特に関数型プログラミングやリスト操作において便利である。
また、lambda関数の代わりに使用することで、コードの可読性と効率を向上させることができる。
HDDやSSDの消去にはDBANじゃなくてShredOSを使おう

古いPCを捨てるときなどに、ストレージの消去が必要になります。今までは[DBAN (Darik's Boot and Nuke)](https://dban.org/)で消去していましたが、DBANはUEFIに対応していないため新しいPCでは動作しません。代わりになるツールを探したところ、[ShredOS](https://github.com/PartialVolume/shredos.x86_64)が良さそうです。

ShardOSは、BIOSやUEFIでUSBブート可能な小さなLinuxディストリビューションで、[nwipe](https://github.com/martijnvanbrummelen/nwipe)を使用してストレージを安全に消去します。[Rufus](https://rufus.ie/ja/) (Windows)や[etcher](https://etcher.balena.io/) (Windows/Mac/Linux)等を使用して、ShredOSのイメージ・ファイルをUSBメモリーに書き込んで使います。UIはDBANそっくりなので、使い方に迷うことはないはず。

![ShredOS](https://user-images.githubusercontent.com/22084881/216849326-e9a5c3a0-4485-432a-a3c7-a72858faeab1.png)

ShredOS x86_64 - Disk Eraser https://github.com/PartialVolume/shredos.x86_64
キャリアブレイク中のお金① 家計簿

# お金は大事
キャリアブレイクにあたって一番悩んだ事。今日はお金について書きます。当たり前ですが、お金は大事です。世の中にはお金よりも大事なことはありますが、現実問題としてキャリアブレイクすると収入がなくなります。収入がないと生活が出来ません。そうなるとそもそもキャリアブレイク出来なくなります。

# いまいくら持っているか
キャリアブレイクをするにはお金が必要です。無収入期間をどう生き延びるか。これをするにあたって大事なことは、今1ヶ月いくら使っているのか？これを把握することが最初のステップとなります。もっとも僕は、今まで一度も家計簿を付けたことはありませんでした。そこで、今回、家計簿をつけることにしました。

# 家計簿ルール
家計簿をつけるのに、ルールを作りました。自由期間の１ヶ月は節約を意識しなくて良い。無駄使いを推奨するわけではなく、今までと同じようにお金を使うことにしました。その上で、次の月からは節約を考えることにしました。つまり、先ずは基準となる記録を意識しました。

# 表計算に支出を記載
記録は表計算ソフトを使いました。日付、品物、金額を使った分だけ書いていく、本当にメモとして残していきました。1週間ぐらい書いたところで、カテゴリみたいなものが欲しくなって、食費、生活費、交際費、交通費、服飾費、みたいなのを足していきました。この時点では例えばイオンで食料品と生活用品買った時、それを何費にするかは、特にルールではなく気分で選んでいました。

# 固定費
あと固定費も出来る限り書き出していきました。家賃みたいな毎月変わらないものは良いのですが、電気代のように毎月変わるものは、去年の1年の金額を12割する形をとりました。わりとザックリで細かい金額は誤差として気にしません。これで1ヶ月の固定費と使ったお金は残せるので合計したものを今後１ヶ月の最大消費目標金額にしました。

# 思ったよりは減らせない
同じように勉強期間の11月も１ヶ月記録してみました。結論から言うと、いくらかは節約出来ましたが、正直思ったほど減らすことは出来ませんでした。もう少し続けてみない分からないですが、無駄なものを減らしていくにしても、もう少し家計簿のテクニック的な記載も必要になるかなとは思っています。

# 交通費
一方で支出を眺めていて思ったのは、自分が想定していたよりも大きな支出として交通費がありました。働いている間は、定期で移動出来た範囲もあるのでこれは結構無頓着になっていましたが、やはり移動は結構かかります。移動手段が如何に安くなるかは常に気を付けるようになりました。

# 家計簿
家計簿を書いてログを残すことは大事です。それで気づくこともありますが、想定していたよりは支出が減らせない印象です。ここはもう少しログを増やしていき、かつExcelの機能を活用していくか、何か専用のアプリを入れるかして分析が必要かと思います。
sapで品目数量単位の確認

ステップ：
1.MM02で品目変更画面に入る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/220feb64-82da-1237-330d-0f4bcc3cceba.png)

2.「追加データ」をクリックして、「数量単位」のViewで数量単位の箱などを確認できます。
※SNP（「Standard Number of Pieces」，即标准包装数量或每单位的包装数量。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/ec5de2c4-61e7-5195-d236-2cfe4e099d34.png)
SE11 查找add on的表格

主要用于查看表结构，字段，索引，外键，数据类型。
（se16n用于查看某张表的数据内容）
1.使用「SE11」进入下面的画面。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/95b30f38-a2ce-33aa-80c3-dfcf07ecb5e6.png)

2.输入表名前几个字母＋*，点击右侧的检索键，可以弹出table一览。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/4b10d4f7-66fb-e3f5-6ba6-b05b768b1896.png)

3.选择想要查看的表名，下图中点击照会
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/ad4c4ee3-5519-4634-c26d-ac23f3959205.png)
4.出来表的详细画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795764/7b09d7d5-a9b0-6788-04c6-9f7d21a74672.png)
PDE（professional data engineer）試験直前ポイント

# はじめに
試験直前5分前に、少しでも点数を上げて資格に合格するためのポイントまとめ
時間ないと思うので早速内容へどうぞ！

# ポイント
**データサービスの主要キーワード**
BigQuery：データの分析、クエリ、最適化技術
Cloud Dataflow：データの処理（バッチおよびストリーミング）
Cloud Dataproc：Hadoop/Sparkの管理と処理
Cloud Pub/Sub：リアルタイムメッセージング
Cloud Storage：ストレージの管理と最適化
Cloud Composer：ワークフローのオーケストレーション
Looker：BIツールとダッシュボード作成

**Spanner, CloudSQL, AlloyDBの使い分け**
CloudSQL：基本、他と比べコスト低
Spanner：グローバル、スケーラビリティ、コスト高
AlloyDB：高パフォーマンス、コスト高

**Dataflowのウィンドウ**
タンブリングウィンドウ：基本のウィンドウ、重ならず時間ごとに切る
ホッピングウィンドウ：移動平均、重なりながらウィンドウをずらす
セッションウィンドウ：セッションがある限り延長、指定の時間セッションが切れたら終了

**AEADとDLP**
AEAD：データの暗号化と改竄防止
DLP：データの流出防止

**データ共有**
AnalyticsHub：組織外
Dataplex：組織内

# おわりに
試験頑張ってください！

内容によっては当たり前のこと、少し覚え方が気持ち悪い箇所などあるかとは思いますが、実際に試験を受けた上でのポイント・すぐに知識として取り入れられそうな箇所をまとめました。
もし解釈が違う等あればコメントいただければ修正します。


# チェック
時間余ってれば下のサービスが何か把握できているかチェックし、もしわからないサービスあればリンクから概要を確認してください。

・dataflow

https://cloud.google.com/dataflow/docs/concepts/streaming-pipelines?hl=ja

https://cloud.google.com/dataflow/docs/pipeline-lifecycle?hl=ja

・cloud composer

https://cloud.google.com/composer/docs/concepts/overview?hl=ja

・dataplex

https://cloud.google.com/dataplex/docs?hl=ja

・analytics hub

https://cloud.google.com/bigquery/docs/analytics-hub-introduction?hl=ja

・data catalog

https://cloud.google.com/data-catalog/docs?hl=ja

・biglake

https://cloud.google.com/bigquery/docs/biglake-intro?hl=ja
Azure VMにpingできない話



# はじめに

私はネットワーク関係の仕事をしているのですが、NW機器のテストなんかではまずpingをすることがよくあります。
その癖でといいますか、AzureでVMを構築した際にまずpingしてからRDPしようとしたのです。
でも、pingできないのです。

ということで、理由を調べてみました

# Azureの仕様

下記を見る限り、Azure Load Balancerを通るとICMPプロトコル（ping)は許可されないみたいです。

> クラウド サービスに ping を実行することはできますか。
いいえ、通常の "ping"/ICMP プロトコルは使用できません。 インターネット制御メッセージ プロトコル (ICMP) は、Azure Load Balancer では許可されていません。

https://learn.microsoft.com/ja-jp/azure/cloud-services/cloud-services-connectivity-and-networking-faq

じゃあいつLoad Balancer通るねんって話なんですが・・・
探しても見当たらないので簡単にテストしてみます。

# パブリックIPの有無

AzureのVMにパブリックIPを付与した場合：ping可能
AzureのVMにプライベートIPしかない場合：ping不可

前提として下記の確認は必要
・NSGでICMPを許可している
・コンピュータ上でICMPが許可されている（ローカルのFirewall)

# その他

Load Balancerを通る場合はpingが通らないと考えるので
例えばAzure Firewallなどを経由してVMへpingさせるのはできないと思われます。

# 最後に

パブリックIPを付与すればひとまずpingができました。
公式では下記のPsPingを使うことを推奨しているようです。

https://learn.microsoft.com/ja-jp/sysinternals/downloads/psping

# 参考

https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-troubleshoot-connectivity-problem-between-vms

NetworkWatchrのIPフロー検証などportalから利用できるネットワーク診断ツールみたいなものもあります。

https://learn.microsoft.com/ja-jp/azure/network-watcher/network-watcher-overview
App Service や Azure Functions Linux 環境におけるの 言語 ランタイムスタックを Resource Graph で一括確認

# はじめに

App Service や Azure Functions では、PaaS 製品として提供している言語ランタイム廃止に伴い通知が行われます。
ただし、この通知はサブスクリプション単位に行われていることが多く、サブスクリプションの管理者としては、対象のリソースがどれなのかといったことが通知からは読み取れないことが多くあります。

そんなときに Resource Graph 機能を使って一括で確認する方法を紹介します。


https://learn.microsoft.com/ja-jp/azure/governance/resource-graph/first-query-portal

# アプローチ

ここで紹介する方法は Linux 環境に特化した話となります。
App Service や Azure Functions の Linux 環境において実行するイメージは linuxFxVersion というプロパティで管理されるものとなります。
ランタイムはコンテナイメージに梱包されているため、この値を調べることでランタイムの特定を行うことができます。

https://learn.microsoft.com/en-us/cli/azure/webapp/config?view=azure-cli-latest#az-webapp-config-set-optional-parameters

https://learn.microsoft.com/ja-jp/azure/azure-functions/set-runtime-version?tabs=azure-portal&pivots=platform-linux#manual-version-updates-on-linux

https://qiita.com/georgeOsdDev@github/items/abdadd35248b98c4ef88

なお、Windows 環境のリソースについてはここで紹介する方法は利用できません。

# 実践

App Service リソース、Azure Functions リソースはいずれも `type` が `microsoft.web/sites`となります。
また、Linux 環境の場合 `kind` に `linux` というキーワードが含まれます。

そのため以下のようなクエリで一覧取得可能となります。

```sql
resources
| where type == "microsoft.web/sites"
| where kind has "linux"
| project kind,resourceGroup,name,location,properties.siteConfig.linuxFxVersion
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4914/7a3c31e4-c0f7-ebf1-0562-226a037dc158.png)
GitHub Copilot Free -月ごとの回数制限付き無料枠を提供開始！

公式情報の詳細を全てこの記事に盛り込みましたので、是非、最後までお読みください。

# GitHub Copilotが月ごとに回数制限のある無料版「GitHub Copilot Freeプラン」を提供開始！

日本時間の2024年12月19日、GitHubのユーザー数が1億5,000万人を突破したことと、「GitHub Copilot Freeプラン」の提供開始を全世界へアナウンスしました。個人用のGitHubアカウントを持つユーザーは、2000回/月までのコード補完、50回/月までのチャットメッセージという制限付きでの無料利用が可能になりました。
 
「GitHub Copilot Freeプラン」について
https://docs.github.com/en/copilot/managing-copilot/managing-copilot-as-an-individual-subscriber/about-github-copilot-free

## GitHub Copilot Freeの利用が可能に

GitHubアカウントを持つユーザーは、GitHubやVisual Studio Code、その他のIDE上でGitHub Copilotの無料利用が可能になりました。AnthropicのClaude 3.5 SonnetまたはOpenAIのGPT-4oを選択することが可能で、よりパーソナライズされたコーディング体験が実現します。この機能は、個人のGitHubアカウントに組み込まれており、簡単にアクセスできます。

## GitHub Copilot Freeの概要

GitHub Copilot Freeは、サブスクリプションなしでAIによるコーディング支援を体験できる、限定的な機能へのアクセスを提供します。ただし、以下の条件に該当する場合、Copilot Freeは利用できません。

- 管理されたユーザーアカウントを持っている場合
- 組織を通じてCopilotのライセンスが割り当てられている場合
- 既存のCopilot Proサブスクリプションまたはトライアルがある場合
- 学生、教師、オープンソースメンテナーとしてCopilot Proへの無料アクセスがある場合

## 無料プランの詳細

GitHub Copilot Freeプランでは、以下の機能が提供されます：

- **月ごとに2000回のコード提案**: VS CodeのワークスペースやGitHubプロジェクトに合わせたコンテキストに基づく提案を受け取れます。
- **月ごとに50回のCopilot Chatメッセージ**: VS CodeやGitHubでCopilot Chatを使用して、質問をしたり、コードのリファクタリング、デバッグ、ドキュメント作成、説明を行ったりできます。
- **AIモデルの選択**: AnthropicのClaude 3.5 SonnetまたはOpenAIのGPT-4oのいずれかを選択できます。
- **マルチファイルの編集**: Copilot Editsを使用して、複数のファイルに対して変更を加えることができます。
- **Copilot Extensionsエコシステムへのアクセス**: サードパーティ製エージェントを使用して、Perplexityを介したウェブ検索やStack Overflowからの情報取得などが可能です。

### Copilot Freeの制限

Copilot Freeには以下の制限があります：

- コード補完は月ごとに2000回まで。
- Copilot Chatは月ごとに50回のメッセージまで。この制限には、VS CodeやVisual Studioでの標準チャットとマルチファイル編集チャットが含まれます。

これらの制限に達した場合は、Copilot Proにアップグレードすることで引き続き利用できます。

### 機能制限

Copilot Freeには、以下の機能は含まれていません。

- アクセスマネジメント
- 監査ログ
- ポリシー管理
- ファイル除外
- 使用データ
- 補償カバレッジ

## Copilot Freeへのアクセス方法

Copilot Freeにアクセスする方法はいくつかあります。

### VS Code

VS Codeでは、エディタから直接Copilot Freeにアクセスできます。

1. VS Codeのサイドバーで「Copilot Freeにサインアップ」をクリックします。
2. GitHubアカウントを持っている場合はサインインを求められます。アカウントがない場合は、新規作成を促されます。

### GitHub.com

Copilot Freeを使用すると、GitHub上のチャットインターフェース（https://github.com/copilot ）を通じて質問ができます。

1. サインイン後、GitHubの任意のページの左上隅にあるアイコンをクリックして個人ダッシュボードにアクセスします。
2. ダッシュボードの上部にある「質問をする」ボックスを使用して、Copilotとのチャットを開始します。

### その他のIDE

他のIDEでCopilot Freeを使用するには、まずGitHubアカウント設定でCopilot Freeを有効にする必要があります。

1. GitHubの任意のページの右上隅にあるプロフィール写真をクリックし、「Your Copilot」を選択します。
2. 「Copilot Freeを使用開始」をクリックしてCopilot Freeを有効にし、会話スレッドを開きます。
3. 「他のIDEでCopilotを使用」をクリックし、使用しているIDEの指示に従います。

## GitHubの成長と影響

今回のGitHub Copilot Freeプランの導入により、さらに多くの開発者がAIを活用したコーディング支援を受けられるようになります。これにより、開発者の生産性が向上し、より良いソフトウェア開発が促進されることが期待されます。新たなツールを手に入れ、より効率的な開発環境を実現しましょう！
初心者でも分かる Git の基本操作を 10 分でマスターする方法！


## はじめに

Git はプログラミングやプロジェクト管理において、コードやファイルのバージョン管理を行うための強力なツールです  
本記事では、初心者でも理解しやすいように、基本的な Git 操作をわかりやすく解説します

**この記事は 10 分程度で読める内容にまとめており、Git を使い始めるための最小限の知識を身につけることができます**  
**忙しい方やとりあえず Git を触ってみたい方にぴったりです！**

## 1. Git とは？

Git は、ファイルの変更履歴を管理するための「分散型バージョン管理システム」です  
これにより、過去のバージョンに戻したり、複数人で同じプロジェクトを効率的に進めることができます

## 2. Git を始める準備

まずは、Git をインストールしてセットアップを行います

1. **Git のインストール**

   - [Git 公式サイト](https://git-scm.com/downloads)からインストーラーをダウンロードしてインストールします

詳しくは次の記事が参考になります

https://kinsta.com/jp/knowledgebase/install-git/

2. **ユーザー情報の設定**
   Git を使う前に、名前とメールアドレスを設定します

   ```bash
   git config --global user.name "Your Name"
   git config --global user.email "your.email@example.com"
   ```

## 3. Git の基本操作

以下に、よく使う基本的な Git コマンドを紹介します

### 3.1 リポジトリの作成

Git で管理するプロジェクトを開始するには、リポジトリを作成します

```bash
mkdir my-project
cd my-project
git init
```

- `mkdir` はディレクトリを作成するコマンドです
- `git init` で Git リポジトリを初期化します

### 3.2 ファイルを追加してコミットする

Git では、ファイルをリポジトリに追加して「コミット」することで履歴を残します

1. 新しいファイルを作成する
   ```bash
   echo "Hello, Git!" > README.md
   ```
2. ファイルをステージングエリアに追加する
   ```bash
   git add README.md
   ```
3. ファイルをコミットする
   ```bash
   git commit -m "first commit"
   ```

### 3.3 状態を確認する

現在のリポジトリの状態を確認するには、以下のコマンドを使用します

```bash
git status
```

### 3.4 履歴を確認する

コミット履歴を確認するには以下のコマンドを使います

```bash
git log
```

## 4. GitHub との連携

GitHub は、Git リポジトリをオンラインで管理するためのサービスです  
以下は、ローカルリポジトリを GitHub にプッシュする方法です

1. **リモートリポジトリを追加する**

   ```bash
   git remote add origin https://github.com/your-username/my-project.git
   ```

2. **変更をプッシュする**

   ```bash
   git push -u origin main
   ```

## 5. よくある質問

### Q: 間違えて GitHub に Push してしまいました、どうすれば取り消せますか？

A: 以下の手順で、間違えた Push を取り消すことができます

1. リモートリポジトリの最新状態を確認する

   ```bash
   git fetch origin
   ```

2. 直前の Push を取り消す（履歴を残す場合）

   ```bash
   git reset --soft HEAD~1
   git push --force
   ```

   注意: この操作は他のコラボレーターに影響を与える可能性があるため、慎重に行ってください

3. または、新しい修正を追加して Push する

   ```bash
   git commit --amend
   git push --force
   ```

### Q: ファイルを間違えて削除してしまいました、どうすれば元に戻せますか？

A: Git は変更履歴を管理しているため、`git checkout` や `git restore` コマンドを使って以前の状態に戻せます

### Q: ステージングエリアに追加した変更を取り消すには？

A: 以下のコマンドを使います

```bash
git reset HEAD <file>
```

## まとめ

この記事では、Git の基本操作を 10 分で理解するために必要な知識を紹介しました  
ここで学んだ内容をもとに、実際に Git を使ってプロジェクトを管理してみましょう！

もっと詳しく学びたい方は、公式ドキュメントやオンラインチュートリアルもぜひチェックしてみてください
ライブラリの活用：RailsのGemとLaravelのパッケージ管理

### はじめに
プログラミング初心者にとって、ライブラリを活用することは、効率的にアプリケーションを開発するための重要なステップです。この記事では、RailsのGemとLaravelのパッケージ管理について、それぞれの特徴や使い方を比較しながら解説します。

### 1. ライブラリとは？

ライブラリとは、特定の機能を提供するコードの集まりで、開発者がその機能を自分のアプリケーションに組み込むために使用します。RailsではGem、LaravelではComposerパッケージという形でライブラリを利用します。

### 2. RailsのGemの特徴と使い方

#### 特徴

Railsにおけるライブラリ管理は、**RubyGems**という仕組みを通じて行われます。Gemは簡単にインストールやアップデートができ、Railsの拡張機能として活用されます。

#### 使用方法

**Gemfileに記述**
GemfileはRailsプロジェクトの根幹となる依存管理ファイルです。例えば、`devise`という認証用Gemを使う場合、Gemfileに以下のように記述します。

```ruby
# Gemfile
gem 'devise'
```

**インストール**
`bundle install`コマンドを実行すると、指定したGemがインストールされます。

```
$ bundle install
```

**セットアップ**
Gemによっては追加のセットアップが必要です。`devise`の場合、以下のコマンドで初期設定を行います。

```
$ rails generate devise:install
```

#### 実装例

`devise`を利用して簡単な認証システムを構築する手順を以下に示します。

ユーザーモデルを作成します。

```
$ rails generate devise User
$ rails db:migrate
```

ルートに認証付きページを設定します。

```ruby
# config/routes.rb
Rails.application.routes.draw do
  devise_for :users
  root to: 'home#index'
end
```

認証システムが機能するページを作成します。

```
$ rails generate controller Home index
```

ログイン状態に応じてビューを切り替えます。

```erb
<!-- app/views/home/index.html.erb -->
<h1>Welcome, <%= current_user.email if user_signed_in? %></h1>
<% if user_signed_in? %>
  <%= link_to 'Logout', destroy_user_session_path, method: :delete %>
<% else %>
  <%= link_to 'Login', new_user_session_path %>
<% end %>
```

### 3. Laravelのパッケージ管理

#### 特徴

Laravelでは、ComposerというPHPの依存管理ツールを使います。Composerはパッケージのインストールやバージョン管理を容易にし、Laravelエコシステムのさまざまなツールを活用できます。

#### 使用方法

**インストール**
Composerを使ってパッケージをインストールします。例えば、認証システムを提供するlaravel/uiをインストールする場合、以下のコマンドを使用します。

```
$ composer require laravel/ui
```

**セットアップ**
laravel/uiの例では、以下のコマンドでUIスキャフォールドを生成します。

```
$ php artisan ui vue --auth
```

#### 実装例

`Laravel UI`を使って基本的な認証システムを構築する手順を以下に示します。

認証用のビューとコントローラーを生成します。

```
$ php artisan ui bootstrap --auth
$ npm install && npm run dev
```

データベースをマイグレーションします。

```
$ php artisan migrate
```

認証付きルートを設定します。
`Laravel UI`はデフォルトで認証付きのルートを用意しています。
`routes/web.php`を確認してください。

アプリケーションを起動して動作を確認します。

```
$ php artisan serve
```

ブラウザで`http://localhost:8000`を開き、ログイン画面が表示されることを確認します。


### 4. RailsとLaravelのライブラリ管理の比較

|項目|Rails (Gem)|Laravel (Composer)
|:-----|--------|--------
|管理ツール|Bundler|Composer
|インストール方法|`bundle install`|`composer require`
|設定ファイル|`Gemfile`|`composer.json`
|セットアップの容易さ|Gemごとに少し手順が異なる|Artisanコマンドで統一感がある
|ドキュメントの重要性|各GemのGitHubページや公式サイト|Laravel公式ドキュメントが充実



### 5. 注意点

#### 公式ドキュメントを読む
公式ドキュメントは、正確な使い方や注意点が記載されています。RailsもLaravelも、ライブラリの使用方法が詳細に記載されているため、必ず目を通しましょう。

#### 不要なライブラリは追加しない
使用していないライブラリはアプリケーションのパフォーマンスを低下させる可能性があります。本当に必要なものだけを追加してください。


### 6. まとめ

RailsのGemとLaravelのComposerパッケージは、それぞれのフレームワークの特徴を生かした便利なライブラリ管理ツールです。これらを適切に活用することで、開発効率が向上し、より高品質なアプリケーションを作ることができます。公式ドキュメントをしっかり参照しながら、積極的にライブラリを活用してみてください。

### 参考資料

https://github.com/heartcombo/devise

https://laravel.com/docs/11.x/frontend
Professional Cloud Architectまで1ヶ月で合格する（Google Cloud）

# 自己紹介
大手SIerのインフラ部署に所属する3年目
1年目はwebアプリの開発（typescript, react）※インフラとは
2年目は認証系のインフラ基盤の設計と開発
3年目は絶賛仕事探し中
資格は1年目に応用情報とaws saaを取ったのみ

# 資格を取ろうと思った背景
丁度案件のはざまで規則正しい生活を送れており、終業後や土日に勉強時間を確保できそうなこと。※趣味もタイミング的に暇だった
役職が上がり、同期と一緒に資格の勉強をしようやと盛り上がったこと。
たまたま社内で資格取得応援キャンペーン的なものが開催していて、バウチャーをもらえたこと。

# 目標と結果
12月20日までに、CDL（Cloud Digital Leader）、ACE（Associate Cloud Engineer）、PCA（Professional Cloud Engineer）を取る ※現在11月15日
→12月18日、CDL、ACE、PCA、PDE（Professional Data Engineer）取得
スケジュールがタイトすぎるので、それぞれの資格に対してどの程度時間を割くか事前に決めた
　- CDL：3日（11/17予定,11/17実施,合格）
　- ACE：2週間（11/29予定,11/29実施,合格）
　- PCA：3週間（12/20予定,12/5実施,合格）
　- PDE：受ける気なかったのになぜか受験（12/18実施,合格）
計画段階ではCDL→ACE→PCAまでを予定していたため、順当に準備期間を増やす想定だった。
実際はACEをしっかり勉強することでPCAの問題の理解が容易になり、期間を大幅に短縮できた（ついでにもう一つ受験できた）
CDL→ACE→PCAの順番は、google触ったことないエンジニアには推奨
基本的なサービスの理解から順当に知識を深くできた。

# やったこと
<INS>勉強内容の確定</INS>
時間ないので数回分の模擬試験を回し、わからないところだけを掘り下げる方針で。
やる模擬試験の選定については、基本Udemyでレビューが高いものを選択するのがオススメ。
試験内容が変わっている場合があるので、公式ドキュメントの試験ガイドを確認したほうが良い
（もし変わっているのであれば最新版に更新されているUdemyを探すことを推奨）
最後にgoogle公式の模擬試験を実施する。

<INS>過去問ひたすらやる</INS>
わからなかった問題をチェックしつつ、どのような問題が出やすいのか、どのような問題が間違えがちなのかを整理
udemyの回答が細かく書いていない場合、公式ドキュメント・chatGPTを活用。
chatGPTはパッとそれっぽい解説を出してくれるが、全然検討違いなことを言ってる場合があるので注意。
（簡単な質問を組み合わせて回答に自分で辿り着くのが一番良かった。）
最低2周した

<INS>google公式の模擬試験</INS>
模擬試験の問題は類似した問題が出る可能性が高い（気がする。）
Udemyだと教材の選定でハズレを引く可能性があるが、公式模擬試験なら間違いないので絶対実施するべき。
自身のつけた知識で問題が解けるかのチェックとともに、1問ずつなぜ正解・不正解なのかを覚えることが大事

<INS>（やってない）slills boostを試してみる</INS>
google公式の資格取得用ドキュメント
今回は実施していないが、模擬試験だけでは資格用の知識になりがちなので、公式ドキュメントをうまく活用するのが推奨。

# 参考書リンク
CDL：[最短合格】Google-Cloud-Leader-模擬問題集（２００問）](https://www.amazon.co.jp/最短合格】Google-Cloud-Leader-模擬問題集（２００問）-University-ebook/dp/B0CSX5VH2F/ref=sr_1_2?__mk_ja_JP=カタカナ&crid=1XX399GQB8JNK&dib=eyJ2IjoiMSJ9.2TNMM5m1i-KpkYCOVkxMBuc6svIFI8QyaKOyxkjL86ZulZrudCvO23eA0SkEjojc_yH-oeGgpxhMmtKmhHmbzOmSefKLbgG87q2BK5ggwtd_Z7zTKeLofU5tgZhRUPGojEZh0D5OZfjS4CbOp7-ZaH4suqPf4cHObFbzI-HRH1g7Zn0GhsA3gd07L_2mLIMP9iC2dzOauyJOKn19v7UKmod8QmkXrsvXmwm_KjVnG-4.CYkSX3CNzEOM38UdTVFhbnZ9mr0OeZXaOX7ROLxii8w&dib_tag=se&keywords=cloud+leader&qid=1734586366&s=digital-text&sprefix=cloud+leade%2Cdigital-text%2C169&sr=1-2)
正直無料の中で適当に選んだので、Udemyを探せばもっといいのがあるかも
（CDLはあまり課金せずに合格して、その後の上位資格への弾みをつけたかった。）
体感5割ほどのカバー
ACE：[これだけで合格！Google Cloud Associate Cloud Engineer模擬試験問題集（4回200問）](https://www.udemy.com/course/google-cloud-associate-cloud-engineer4200/?couponCode=ST21MT121624)
安いし評価が高かった
体感7割カバー
PCA：[【最短攻略】Google Cloud認定Professional Cloud Architect模擬問題集](https://www.udemy.com/course/google-cloud-professional-cloud-architect-i/?couponCode=ST21MT121624)
安いし評価が高かった
似ている問題集もあったが、こちらの方が範囲をカバーされてそうだった
体感7割カバー
PDE：[2024年正式版 Google Cloud Professional Data Engineer 模擬試験完全版 PDE](https://www.udemy.com/course/2024-google-cloud-professional-data-engineer-a/)
高いが範囲のカバーは抜群
体感8~9割カバー

# まとめ
今回短期間で資格取得を目指すにあたって、勉強時間の配分と模擬試験選定が最も大切と感じた。
時間に余裕がある場合、演習を通して知識をつけるのが推奨ではあるが、
短期間で資格を取得する場合の一つの選択肢としてはアリ。
データベース・SQL ＃2

# はじめに
この記事は皆さまのお役には立てません。
記事を書いている目的は学んだ事をアウトプットする為だけに書いています。
知識のない私が書いている記事ですので、間違い等あればご指摘いただければ幸いです。

# RDBMSの基本用語

## データ型とは
データベースでは、テーブルを作成するときにそれぞれの列に指定した形式の
データしか入力できないようにする。
この時指定するデータ形式をデータ型という。

## データ型の種類
### 【数値型】
+ int型
整数　　　-2,147,483,648 ～ 2,147,483,647
UNSIGNED　 0 ～ 4,294,967,295
+ tinyint型
整数　　　-128 ～ 127
UNSIGNED　0 ～ 255
+ tinyint(1)
真偽値true/falseを扱うことができる
内部的にはtrueが1、falseは0として管理される
+ float型
浮動小数点数　±1.175494351E-38 ～ ±3.402823466E+38
+ double型
浮動小数点数　±2.2250738585072014E-308 ～ ±1.7976931348623157E+308

### 【文字列型】
+ char型
固定長の文字列255文字
文字列を格納する時に指定した長さのスペースを確保する
例えばchar(10)とした時10文字分のスペースを確保する。文字列が短い場合は不足分は空白で埋められる
+ varchar型
可変長の文字列255文字まで。
varchar(10)とした時は10文字を格納でき、余分なスペースは保持しない
+ text型
可変長の文字列65,535文字

### 【日付・時刻型】
+ date型
日付-年-月-日を格納できる。
フォーマットは YYYY-MM-DD で、年-月-日の形式
+ time型
時間のみ（時、分、秒）を格納できる
フォーマットは HH:MM:SS で、時:分:秒 の形式
+ datetime型
日付と時刻を格納できる
フォーマットは YYYY-MM-DD HH:MM:SS で、年-月-日 時:分:秒 の形式