OmniAICreator/Qiita-1.07M huggingface dataset:
SQL完全入門(SQL初心者向け)

# 用語解説
●SQLとは
データベースを操作するときに使う言語のこと.

●データベースとは
データを保管する場所のこと.

●テーブルとは
データベースのデータの保管先であり、カラムの集まりのことである.

●カラムとは
データの種類のことである.




# ①まずデータベースからデータを取ってくる
```
SELECT カラム名
FROM テーブル名;
```
でデータを取得することができる.すべてのカラムを取ってきたいときは'```カラム名'```に```*```を入れるとできる.

例
```
SELECT *
FROM users;
```



# ②特定の条件にあうデータだけを取得したい
```
SELECT カラム名
FROM テーブル名
WHERE 条件式;
```

例　idが1のデータだけを取ってきたい
```
SELECT *
FROM users
WHERE id=1;
```




# ③ある値を含むデータを取り出したい

```
SELECT カラム名
FROM テーブル名
WHERE カラム名 LIKE '%ある値%';
```
# 前方一致
例　パンツというデータが前方一致する値を取り出したい

```
SELECT *
FROM clothes
WHERE under LIKE 'パンツ%';
```
これにより```パンツXL```というデータを取得できる

# 後方一致
例　パンツというデータが後方一致する値を取り出したい
```
SELECT *
FROM clothes
WHERE under LIKE '%パンツ';
```
これにより```赤いパンツ```というデータを取得できる




# ④NULLのデータを取ってきたい
```
SELECT カラム名
FROM テーブル名
WHERE カラム名 IS NULL;
```
例
NULLでないデータを取得するには
```
SELECT カラム名
FROM テーブル名
WHERE カラム名 IS NOT NULL;
```


# ⑤条件式でかつ(AND)とまたは(OR)を使いたい
```
SELECT カラム名
FROM テーブル名
WHERE 条件式
AND(OR) 条件式;
```



# ⑥データを昇順や降順に並べたい
ORDER BYと書いて、次に降順か昇順かを書く.
```
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 DESC(ASC);
```
DESC＝降順(3,2,1)
ASC＝昇順(1,2,3)




# ⑦上から何件取得するか決める
LIMITと書いて次に上から何件取得するかを書く.
```
SELECT カラム名
FROM テーブル名
ORDER BY カラム名 DESC
LIMIT 3;
```
これは降順に並んだデータの上から3つを取得する



# ⑧データの重複をなくすには
カラム名にDISTINCTをつけることでデータが重複をなくすことができる
```
SELECT DISTINCT(カラム名)
FROM テーブル名;
```




# ⑨関数

# 合計
```
SELECT SUM(カラム名)
FROM テーブル名;
```

# 平均
```
SELECT AVG(カラム名)
FROM テーブル名;
```

# カウント(カラムの数を数える)
```
SELECT COUNT(カラム名)
FROM テーブル名;
```

# 最大値
```
SELECT MAX(カラム名)
FROM テーブル名;
```

# 最小値
```
SELECT MIN(カラム名)
FROM テーブル名;
```




# ⑩データをカラムでグループ化したい
グループ化するにはGROUP BYと書いて、次にグループ化したいカラム名を書く.
```
SELECT カラム名
FROM テーブル名
GROUP BY カラム名;
```




# ⑪グループ化した後に条件を付けたい(WHEREはグループ化した後は使えない!)
グループ化した後に条件を付けたいときはHAVINGを使う.(あとはWHEREと同じ)
```
SELECT カラム名
FROM テーブル名
GROUP BY カラム名
HAVING 条件式;
```




# ⑫カラム名に別名を定義したい
ASを書いてその次に別名を書くことでカラム名を変えることができる.
```
SELECT カラム名 AS "名前"
FROM テーブル名
```
例
```
SELECT users.name AS "ユーザーの名前"
FROM users
```




# ⑬テーブルを連結したい
JOINで連結したいテーブル名を書いてONで連結できるカラム名で連結する
```
SELECT カラム名
FROM 1テーブル名
JOIN 2テーブル名
ON 1テーブル名.1カラム名=2テーブル名.2カラム名;
```
例
```
SELECT *
FROM users
JOIN posts
ON users.id=posts.user_id;
```


# ⑭データの挿入

```
INSERT INTO テーブル名 (カラム名1, カラム名2, カラム名3, ...)
VALUES (値1, 値2, 値3, ...);
```



# ⑮データの編集
```
UPDATE テーブル名
SET カラムA = 値1, カラムB = 値2, カラムC = 値3
WHERE 条件式;
```



# ⑯データの削除
```
DELETE FROM テーブル名
WHERE 条件式;
```



















# まとめ
SQLは実践あるのみ!!!
progateで勉強してから,sqlabで練習するのがおすすめ

https://prog-8.com/users/sign_in


https://sqlab.net/
【SwiftUI】吹き出しを簡単につくる


吹き出しを作ります。

```swift
struct SpeechBubble: View {
  var count: Int

  var body: some View {
    HStack(spacing: 0) {
      Rectangle()
        .fill(.red)
        .rotationEffect(.degrees(45))
        .frame(width: 20, height: 20)
        .offset(x: 14)
        .clipShape(.rect) // *
      HStack {
        Image(systemName: "heart.fill")
        Text("\(count)")
      }
      .foregroundStyle(.background)
      .padding()
      .background(.red, in: .rect(cornerRadius: 8))
    }
  }
}

#Preview("bubble") {
  SpeechBubble(count: 999)
}
```
![sc 2024-08-27 at 22.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/4fa5fcb7-33ce-b62f-4c3e-5a59a76d5f0b.png)

良い感じです。

トランジションを付けるとそれなりになりました。

![sc 2024-08-27 at 22.49.25-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/03ae21d6-9d8e-5f02-0756-570f1a51aaf5.gif)

意外と簡単につくれるものなんですね。

SwiftUI てすごい。

# 🧑🏻‍💻 参考

https://android.benigumo.com/20240827/speech-bubble/

https://qiita.com/chanzmao/items/6501995a87af01768c0e
【2024年08月版】VyOS で スピードテスト 【speedtest, pip】

# はじめに

VyOS 1.3で構築しているLinuxルーターからスピードテストをしたい。。。

speedtest-cli を使お。。。

のメモ

# 環境

```terminal
$ uanme -a
Linux r1 5.4.243-amd64-vyos #1 SMP Sat Jun 24 14:28:40 UTC 2023 x86_64 GNU/Linux
$ python3 --version
Python 3.7.3
```

# インストール

speedtest-cli は pip でインストールするんだけど、vyos 1.3 には pip 入ってなさげ

```terminal
$ pip --version
  Invalid command: [pip]
$ pip3 --version
  Invalid command: [pip3]
```

## `pip` のインストール

通常は、`https://bootstrap.pypa.io/get-pip.py` から取得するが、`3.7` ではエラーになるので、`3.7`のインストールスクリプトを利用する

```terminal
$ curl https://bootstrap.pypa.io/pip/3.7/get-pip.py -o get-pip.py
$ sudo python3 get-pip.py
```

## `speedtest-cli` のインストール

```terminal
$ sudo pip3 install speedtest-cli
```

# 実行

```terminal
$ speedtest-cli
```

# 最後に

かんたんでしたね
macでmysqlをはじめのはじめ

## 記事でわかること
mysqlでハローワールドが作れる

## 前提
brewが入っている


## やり方　Mysqlを起動
ターミナルからbrewでmysqlをインストール
```
brew install mysql
```
インストールできたかのバージョンで確認
```
mysql --version

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/9d1b7ffc-2c52-7927-6ec8-60ee6bff51f7.png)

サーバーを起動
```
mysql.server start
```
ログインする

```
mysql -uroot
```

mysql>
となっていたら成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/b5f51db8-1912-8d77-e663-87f0c0044f00.png)

## Mysqlを使う

現在、存在しているデータベースを確認
```
show databases;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/3de0cc16-36b9-0056-969d-fda6b7118476.png)

新規でデータベースを作る
```
create database test_db;
```
もう一度show で追加されたか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/36a462f1-c9f0-3c8f-9000-1d61292c317d.png)

### テーブル作成
作ったdatabaseを選択
```
use test_db;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/c1f41492-47b8-35e2-171a-9a6d5e672e1e.png)

テーブルを作成

```
create table test_table (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));
```
細かい説明は下記の補足を参照

テーブルを確認
```
show tables;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/275ba0c4-7ecb-cb07-550a-1a4c5370a7e1.png)

### データを追加

```
insert into test_table(name) values('ハローワールド');
```
データを確認
```
select * from test_table;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294598/36b655d0-55d9-2672-a9c8-5414a8d048d9.png)

やったね

## テーブル作成時の補足

```
create table test_table (id INT AUTO_INCREMENT, name TEXT, PRIMARY KEY (id));
```
create table :　テーブル作成命令
test_table : テーブル名
id INT AUTO_INCREMENT : idというカラム名でデータはint（整数）、自動でインクリメントされる
name TEXT : nameというカラム名でデータは文字列
PRIMARY KEY(id) : id　を重複なしのデータに設定

## 参考サイト
https://prog-8.com/docs/mysql-database-setup

https://qiita.com/fuwamaki/items/194c2a82bd6865f26045
Asciidoctor PDF Ver2への対応方法

# はじめに
　Asciidoctor PDFをVer1からVer2へ移行しようとしたところ、いくつか変更しなければならない箇所があったため主な変更点を紹介する。
　AsciidoctorのPDF化についての詳細は下記の記事を参照(ただし、記事はVer1前提)。

https://qiita.com/kuboaki/items/67774c5ebd41467b83e2

# 動作確認環境
* OS
  * Windows 10
  * Ubuntu 22.04
* Asciidoctor v2.3.18
 
# 方法
## PDFスタイル（テーマ）の指定方法を変更する

　Ver2では、Ver1で指定していた```pdf-style```と```pdf-stylesdir```が利用不可能となった。それぞれ、```pdf-theme```と```pdf-themedir```に置き換える必要がある。

| Ver1 | Ver2 |
| :-: | :-: |
| pdf-style | pdf-theme |
| pdf-stylesdir |  pdf-themesdir|

　詳細は公式ドキュメントを参照。

https://docs.asciidoctor.org/pdf-converter/latest/upgrade-to-2/#theming-system-and-built-in-fonts


## 章ラベルアトリビュートを変更する

　```chapter-label```を```chapter-signifier```に変更する。

| Ver1 | Ver2 |
| :-: | :-: |
| chapter-label  | chapter-signifier |

　詳細は公式ドキュメントを参照。
 
https://docs.asciidoctor.org/pdf-converter/latest/upgrade-to-2/#document-attributes-and-options

## PDFテーマファイル(xxx-theme.yml)内のタグを変更する

　以下のタグが非推奨となった。
 * literal
 * key
 * blockquote
 * outline_list

変更せずに、PDF化すると以下のような警告メッセージが出る。
```
asciidoctor: WARNING: the literal theme category is deprecated; use the codespan category instead
asciidoctor: WARNING: the blockquote theme category is deprecated; use the quote category instead
asciidoctor: WARNING: the outline-list theme category is deprecated; use the list category instead
```

以下に示すように、非推奨となったタグ名を変更する。

| Ver1| Ver2 |
|:-:|:-:|
| literal | codespan |
| key           | kbd|
| blockquote   | quote |
| outline_list | list     |

　詳細は公式ドキュメントを参照。
 
https://docs.asciidoctor.org/pdf-converter/latest/upgrade-to-2/#deprecations

## 上記以外の対応

　上記以外の対応は、以下の公式ドキュメントを参照。

https://docs.asciidoctor.org/pdf-converter/latest/upgrade-to-2/#deprecations

# まとめ
　AsciidoctorのVer2への対応方法を紹介した。Ver1での設定で無効化されているのがいくつかあることが分かった。Ver1からVer2へ移行する場合は注意する。[公式ドキュメント](https://docs.asciidoctor.org/pdf-converter/latest/upgrade-to-2/)が良くまとまっているので参照すると良い。

# 参考

https://docs.asciidoctor.org/pdf-converter/latest/upgrade-to-2/

https://qiita.com/kuboaki/items/67774c5ebd41467b83e2

https://qiita.com/hoshimin108/items/e8ebc7abe7a2473aab03
【VSCode】おすすめのテーマ5選

# はじめに
私は、プログラミングの学習で難しいのは勉強がなかなか続かないことだと思っています。何時間もコードと睨めっこしたりすることもあると思います。たくさん見る画面であるからこそ、テーマを定期的に変更することで私は勉強のモチベーションを保っています。

***画面の色変わるとなんかやる気出ません？***（新しいノートを買った時に頑張ろと思うのと同じやつです）

ということで超個人的におすすめなVSCodeのテーマを5つご紹介します。

:::note info
見やすさというよりは、デザイン的に好きなテーマになります。
:::

# おすすめテーマ5選
## 2077 theme
ゲーム『サイバーパンク2077』から影響受けているのでしょうか？ネオン街のような色合いになっております。人によっては目がチカチカするかもしれません。色の光具合が個人的にすごく好きです。

https://marketplace.visualstudio.com/items?itemName=Endormi.2077-theme

![スクリーンショット 2024-08-27 22.41.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/eb4cfeb3-f162-219c-59ba-e44750baf540.png)

## Naruto Shippuden Themes
テーマ名の通りアニメ『NARUTO -ナルト-』をイメージしたテーマとなっています。好きな人にはたまらない色合いになっています。（個人的に2023年一番使ったテーマでした。）

https://marketplace.visualstudio.com/items?itemName=PangzLab.naruto-shippuden-themes

![スクリーンショット 2024-08-27 22.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/62aaeb18-5b51-cf49-ba14-fd287c3068a9.png)

![スクリーンショット 2024-08-27 22.46.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/4759f031-961a-3172-c05d-bc62b7bacfb7.png)

## EVA Unit-01 Theme
アニメ『新世紀エヴァンゲリオン』をイメージしたテーマになっています。エヴァンゲリオン独特の紫と緑の色合いが特徴のテーマです。設定をいじるとキャラクターの画像なども設定することが可能のようです。

![スクリーンショット 2024-08-27 22.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/bfcbe787-3d9d-5169-8901-7baf3fe2c21b.png)


## Bear Theme
シンプルで親しみやすい色合いになっております。画面がチカチカしない、目に優しいテーマです。

https://marketplace.visualstudio.com/items?itemName=dahong.theme-bear

![スクリーンショット 2024-08-27 22.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/baa9a17c-4b85-a88e-e499-6ff57a32da3a.png)

## Pink-Cat-Boo Theme
ピンクを基調とした可愛いテーマです。私は一時期PC環境をピンクで統一していた時期があり、その時はずっと使っていました。

https://marketplace.visualstudio.com/items?itemName=ftsamoyed.theme-pink-cat-boo

![スクリーンショット 2024-08-27 22.55.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/1ebc8a05-3fd3-4ab3-4394-41c56f0f8c10.png)

# 終わりに
いかがでしたでしょうか？
個人的な趣味が全開となってしまった、おすすめなVSCodeのテーマでしたが、皆さんもぜひ使ってみてください。

そして少しでもプログラミング勉強のモチベーションアップに繋がればと思います。
MacBook Air でVS Codeを使用していると異常にバッテリーを消費する問題

# 背景
- VSCodeを起動しているとCPUが異常に稼働し、充電していても負ける勢いでバッテリーが消費される問題
- MacBook Air (M2, 2022, Ventura 13.6.3)

# 原因と解決策
- 主に拡張機能が原因という記事をインターネットで散見した。
- 日本語化拡張機能しか導入していなかったが、それをアンインストールした途端問題が解消した。
- 一日作業を続けたが、問題は再発していない。
テンプレートが存在しないか、構成されたテンプレートリゾルバのいずれからもアクセスできない可能性があります。

## エラー内容：template might not exist or might not be accessible by any of the configured Template Resolvers
和訳：テンプレートが存在しないか、構成されたテンプレートリゾルバのいずれからもアクセスできない可能性があります。

## エラー原因
controllerクラスのreturn文字列が「hello」ではなく「hello.html」になっていたためかと思われる
（再起動など別の解決方法を試しても変わらない場合、時間を置くかこの記事の方法を試してみる）

## 修正前
src/main/java/com.example.demo/HelloController.java
```java
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

	@RequestMapping(value="/hello")
	private String hello(){
	return "hello.html";
	}
}
```
src/main/resources/templates/hello.html
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
hello
</body>
</html>
```
## 修正後
1,controllerクラスのreturn文字列を修正（hello.html→hello）
src/main/java/com.example.demo/HelloController.java
```java
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

	@RequestMapping(value="/hello")
	private String hello(){
	return "hello";
	}
}
```
2,springbootを停止して再起動
3,chromeをキャッシュクリーン（shift + f5）
powershell、htmlタグライクな色変更

```powershell:Convert-ColorTextFromTags.ps1
function Convert-ColorTextFromTags {
    param(
        [Parameter(Mandatory=$true)]
        [string]$text  # インプット
    )
    # 正規表現パターンの定義
    $pattern = "<(?<color>red|blue|green|yellow|white|black|cyan|magenta)>(?<content>.*?)</\k<color>>"
    # デフォルト色の設定
    $defaultColor = "White"
    # 現在の位置を保持する変数
    $currentIndex = 0
    $raw_message = ""
    # テキストの中で色付きタグを検索
    foreach ($match in [regex]::Matches($text, $pattern)) {
        # マッチ開始位置までのデフォルト文字を出力
        if ($match.Index -gt $currentIndex) {
            $message = ($text.Substring($currentIndex, $match.Index - $currentIndex))
            $raw_message += $message;
            Write-Host $message -NoNewline -ForegroundColor $defaultColor
        }

        # タグの中の文字を指定された色で出力
        $color = $match.Groups["color"].Value
        $content = $match.Groups["content"].Value
        $raw_message += $content
        Write-Host $content -NoNewline -ForegroundColor $color

        # 現在の位置を更新
        $currentIndex = $match.Index + $match.Length
    }

    # 最後の部分のデフォルト文字を出力
    if ($currentIndex -lt $text.Length) {
        $message = ($text.Substring($currentIndex))
        $raw_message += $message;
        Write-Host $message -NoNewline -ForegroundColor $defaultColor
    }

    # 改行を追加
    Write-Host

    return $raw_message
}

# 関数の使用例
Convert-ColorTextFromTags "あまい<red>果実</red>貪る獣<blue>たち</blue>"
```
tokioがいらなくなるrust 2024

非同期といえば、jsでもasync awaitだが、rust 2024では、それを意識しなくトランスペアレントな言語仕様になるかもしれない。
もっと具体的には、tokioが一体化される破壊的なバージョンになるかもしれないとだけ言っておこう。
psqlコマンド SQLファイルの実行結果をCSVに出力方法

psqlコマンドでSQL抽出結果をCSVファイルに出力する方法のまとめです。
色々制限があって、詰まったところが多々あったので、
備忘録ついでに投稿します。

# 実施環境
OS: Windows 11
DBMS: PostgreSQL16
エミュレータ: TeraTerm 5.2

# 実現したいこと
SQL実行結果をCSVファイルに出力する

#### 条件
➀実行するクエリはSQLファイルに保存したものを呼び出す
②実行はデータベースに接続後、実施する
③セル内改行やセル内カンマに対応　※ダブルクォーテーションで囲む

# 問題点（試したこと）
#### \copyコマンドで実行（条件➀が達成できない）
CSV出力といえば、\copyコマンドがまず検索で該当します。
例えば、
```
\copy (SELECT * FROM table) to 'export.csv' DELIMITER ',' WITH CSV FORCE QUOTE *
```
これでクエリ結果をCSVに出力できて、
CSV形式の区切り文字[,]
ダブルクォーテーションで囲まれます。
ただし、残念ながら保存したSQLファイルでクエリを実行できない。


#### COPY文で実行（実行できない）
じゃあということでSQL文にCOPY文を記載しておいて、
実行してみます。
SQL文はこんな感じ
```
COPY (SELECT * FROM table) TO 'export.csv' DELIMITER ',' WITH CSV FORCE QUOTE *;
```
こいつを\iコマンドで実行すればいける！
と思いきや、postgreがリモートだとCOPY文は実行できないらしいです。
ローカルでしか使えないとは.......

#### psqlコマンドで出力方法を変更する（条件③が達成できない）
ならばならばということで、
psqlコマンドで出力条件と出力先を設定して、
SQLファイルで実行してみました。
```
\a             - 文字揃えをオフ
\f ','         - 区切り文字をカンマに
\o export.csv  - 出力先を変更
\i export.sql  - SQLファイルを実行
```
確かにCSVにカンマ区切りで出力できる！
のですが、セル内改行があってもダブルクォーテーションで囲めない
おしい


# 実現方法
色々試してたどり着いたのが、
\psetコマンドで出力形式をCSVフォーマットに変更してから、
実行する方法です。
```
\pset format CSV  - CSV出力形式に変更
\o export.csv     - 出力先を変更
\i export.sql     - SQLファイルを実行
```
なんとこれだけで、カンマ区切りにもなって、
セル内改行やセル内カンマがあるとダブルクォーテーションで囲ってくれて、
\iコマンドも併用できる。やったー！
注意点としてはPostgreSQL 12以降じゃないとサポートされてないようです。


# まとめ
今回は、psqlコマンドを使ってのクエリ結果のCSV出力方法でした。
色々と制限があること前提なので、
\copyコマンドで問題ない場合がほとんどな気はしますが、
色々こねくりまわした結果お手軽な方法にたどり着いたので、
これはこれで良し
bvi linux用バイナリファイルエディタの設定ファイル


linux用バイナリファイルエディタの設定ファイル

バイナリファイルをいじるとき、bviを持ち出すのだが、デフォルトの設定ではファイルに書き込み禁止になっていて、書き込みスィッチをよく忘れてweb検索してしてしまうので、覚書＆設定ファイルに設定。

~/.bvircというファイルに、書いておけばいい。
```.bvirc
set memmove # 書き込み可にする
```

以上
Mojoru Tools（週間計画アプリケーション）：ブラウザのアクセスアドレスはmojoru.oneです。

アクセスアドレス😊: https://mojoru.one/

Mojoru Tools は、無料のミニマリスト ウィークリー プランナーです。
ここで定義および管理できます
生産性の向上を始めるための 1 週間とタスク
カレンダーとタスク リストの概念を 1 つのインターフェイスに組み合わせます。
アラーム、色、繰り返しのタスクなどを設定できます。
サブタスクなど。さらに、私たちはあなたのプライバシーを重視しており、
したがって、すべてのデータはデバイスに保存されます。



![welcome-white-logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273212/ed125512-9018-bd4a-769e-215a9d6218b4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1273212/fa1dfac6-43a9-a6a9-fd3a-d63af62a9f45.png)
【AWS初心者】知ったことをまとめる【VPC、サブネット、ルートテーブルなど】

# 初めに
インフラ及びAWS初心者です。
PHPの環境をAWS上に作成するために一から学んでいるので、得た知識をまとめていきます。

# 参考文献

Amazon Web Services基礎からのネットワーク＆サーバー構築改訂

https://www.amazon.co.jp/dp/4296202049/

# キーワード
* リージョン
* アベイラビリティーゾーン（AZ）
* VPC
* インターネットゲートウェイ
* サブネット
* ルートテーブル

# リージョンとAZ
リージョンとは、AWSの世界各地に分散されたデータセンターのこと。日本だと「東京リージョン」と「大阪リージョン」の二つがある。
アベイラビリティーゾーン（AZ）は、データセンターの最小単位。一つのリージョンは複数のAZで構成されている。

## ポイント
* AZ同士は距離が離れており、一つのAZで障害が起きても他のAZに影響がないような作りになっている
  * システム複数AZに冗長化させることで耐障害性を高めることができる

# VPCとは
「Virtual Public Cloud」の略。リージョン上に作成する仮想ネットワークのこと。
クラウド上にLANを作成するイメージ。

## ポイント

* 作成時にVPC内で使用するLANの範囲を指定する必要がある
  * 例）「10.0.0.0/16」と指定した場合、「10.0.0.0 ～ 10.0.255.255」の範囲のIPアドレスを利用することができる。
  * このLANの範囲をCIDRブロックと呼ぶこともある

* 複数AZにまたがるVPCを作成することは可能だが、複数リージョンにまたがるVPCを作成することはできない
  * 例）耐障害性を高めるために、
    * 東京リージョンと大阪リージョンを跨がせよう！　⇒　:no_good_tone1:
    * 東京リージョン内で複数のAZを跨がせよう！　⇒　:ok_woman_tone1:


# インターネットゲートウェイとは
VPCをインターネットにつなげるために利用する。
VPCは初期状態だとLANのようなプライベートなネットワークのため、インターネットにつなげるには回線を引いてくる必要がある。その役割はインターネットゲートウェイ。

# サブネットとは
VPCをさらにCIDRブロックで分割した領域のことをサブネットと呼ぶ。
* 例）CIDRブロックが「10.0.0.0/16」VPC上に、「10.0.1.0/24」のサブネットを作成する場合を考える
  * VPC全体の「10.0.0.0 ～ 10.0.255.255」の範囲から、「10.0.1.0 ～ 10.0.1.255」の領域を扱うサブネットを作成するという意味になる


## ポイント
* サブネットを作成する目的は、「外側からアクセス可能な領域とアクセス不可能な領域を分ける」ため
  * サブネットごとに異なるネットワーク制限を書けることができるため、パブリックな領域とプライベートな領域を分けることができる
  * 例）Webサーバはアクセスできていいけど、DBサーバはアクセスさせたくないので、別のサブネットに分ける

# ルートテーブルとは
通信の宛先をどこに接続させるかを決めたための設定。
ルートテーブルは自由に作成でき、作成したルートテーブルをサブネットに紐づけることでサブネット内の通信の行方を決める。

## ポイント
* VPC作成時に以下の内容のデフォルトのルートテーブルが作成される
  * 宛先IPがVPCのCIDRブロックに含まれている場合、接続先はVPC内部に飛ばす
    * CIDRブロックが「10.0.0.0/16」VPCの場合、宛先が「10.0.0.0/16」の通信はVPC内部に飛ぶ
  * デフォルトルートテーブルのみVPCに紐づき、全てのサブネットで参照される
* インターネットへ通信を行うためには、新しくルートテーブルを作成してサブネットに紐づける必要がある
  * 例）宛先が「0.0.0.0」の場合、インターネットゲートウェイへ飛ばす
    * 「0.0.0.0」はデフォルトルートと呼ばれる全てのIPアドレスが宛先の通信のこと
* ルートテーブルとサブネットは1対多の関係
  * 一つのルートテーブルは複数のサブネットで使いまわすことができる
  * 一つのサブネットに紐づけることのできるルートテーブルは一つのみ 

# 終わりに

前に一回読んだのですが、もう一度読み直して理解を深めようと思います。
Unity6000.0.xでURPを使っているとビルド時に画面が暗転する問題の備忘録(2024年8月)

# はじめに
2024年7月にUnityを6、[Universal Render Pipeline](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@17.0/manual/index.html)(URP)を17.0.3にアップデートした所、ビルド時に画面が暗転する問題が発生しました。
具体的には以下の通りです。

- 特定のプラットフォームでビルドした時、画面が真っ暗になる
   - WebGL、Android、Linuxではこの現象が発生しました
   - WindowsとMacでは特にエラーは発生していません
- 画面が真っ暗になるがゲームがフリーズしている訳では無い
   - 各種操作は受け付けてくれます
   - 音も問題無く鳴ります
   - 画面に関してはシーンの遷移などを挟んでも真っ暗のままです
- URPを使っていないプロジェクトではこの現象は発生しない
- 少なくともUnity6000.0.9～Unity6000.0.15でこの現象が生じる

今回は何とかこの現象を解決したので記事にしました。

# 解決方法
**`Project Settings > Graphics > Pipeline Specific Settings > URP > Render Graph`にある[Compatibility Mode](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@17.0/manual/compatibility-mode.html)をtrueにしてください。**

![設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318712/e1841f91-6ea6-0ee6-35da-ba4508c10b34.png)

こうする事でビルドをしても画面が暗転しなくなりました。
ただ、上記の画像を見て頂ければ分かる通り、警告が出ます。

## その他にやったこと
[Localization](https://docs.unity3d.com/Packages/com.unity.localization@1.5/manual/index.html)で使っている[Addressables](https://docs.unity3d.com/Packages/com.unity.addressables@2.2/manual/index.html)の設定が滅茶苦茶になっていたので、使わない設定を消すなどして整理しました。
これを行っても画面の暗転は直りませんでしたが、ビルド時に出ていた警告が消えたのでこちらも問題に関係していたかもしれません。

# おわりに
調べても解決策が出なかったので備忘録に残しました。
ただ、解決策どころか同じようなバグの報告すら無かったのが謎ですね。
Unityエディターのアップデートは今回のように謎のバグが出やすい気がするので恐ろしいです。
Android Gradle Plugin アップデート後の Manifest 競合エラーを回避する方法

# 背景
約7ヶ月振りに Android アプリのアップデートを行うことになり、ついでに Android Gradle Plugin (8.2.1 → 8.5.2) とライブラリのアップデートを行ったところ、アプリの起動時に以下のエラーが発生しました。

```
Manifest merger failed : Attribute property#android.adservices.AD_SERVICES_CONFIG@resource value=(@xml/gma_ad_services_config) from [com.google.android.gms:play-services-ads-lite:23.3.0] AndroidManifest.xml:92:13-59
	is also present at [com.google.android.gms:play-services-measurement-api:22.0.2] AndroidManifest.xml:32:13-58 value=(@xml/ga_ad_services_config).
	Suggestion: add 'tools:replace="android:resource"' to <property> element at AndroidManifest.xml to override.
```

どうやら Google Services と AdMob のライブラリ間で設定が競合しているために発生しており、AGP 8.3 以降で顕在化したようです。

この問題は既にGoogleの開発チームに報告されていますが、2024年8月現在、まだ解決には至っていません。

https://issuetracker.google.com/issues/327696048?pli=1

# 対応
この競合を回避するには、AndroidManifest.xml の `<application>` 内に以下のプロパティを追加することで対応できます。

```diff_xml
<property
    android:name="android.adservices.AD_SERVICES_CONFIG"
    android:resource="@xml/gma_ad_services_config"
    tools:replace="android:resource" />
```

複数のライブラリが同じプロパティ (`android.adservices.AD_SERVICES_CONFIG`) を定義しているとき、それぞれが異なるリソースを参照している場合があります。この状況では、ビルド時にどのリソースを使用すべきかが決まらないため、競合が発生します。

この場合、`tools:replace="android:resource"` を指定することで、そのプロパティが定義される際に他の競合するリソースを無視し、指定されたリソース (`@xml/gma_ad_services_config`) を優先して使用するように指示します。これにより、複数の定義のうちどれを使うかが明確になるため、競合が解消されます。

しかしこれは優先するリソースを指定しているだけであり、一時的な解決策に過ぎません。根本的な解決は、Google による修正を待つ必要があります。

# 参考
https://stackoverflow.com/questions/78085458/manifest-merger-failed-with-agp-8-3-0

https://issuetracker.google.com/issues/327696048?pli=1
Windowsで画面左上に文字が出る理由

## 初めに
こんにちは、大野です。
今回はWindowsで文字を打っていると、なぜか入力でいなくなり、気が付くと左上に入力されている現象について紹介します。

この現象についは多くの人が経験してイライラしたことと思います。

## 左上に入力される条件
自分のPCといろいろな人の検証の結果を見て出した結論は「入力欄からカーソルが外れてしまった」ことによって出現する。です。

もう少し詳しく書くと、自分自身がなんらかの操作ミスで、意図する入力欄にあるカーソルを本来文字入力ができないデスクトップに移動させてしまったことで、行き場をなくした文字が左上に集合するみたいです。

## 解決策
解決策については個人でかなり違いがあるようです。無難な解決策としてはカーソル位置をデスクトップにしないように気を受けることだと思います。人によってはIMEのプロパティを開いて閉じるとこの現象が直るという人もいました。

## 活用方法
活用方法としては、小窓に任意の文字を入力した後でエンターキーを押すと、PC内に保存されているファイルのうち、入力内容と一致するファイルにジャンプして、選択状態にしてくれるというとても限定的な物のようです。

## 最後に
この現象については個人で解決策が違うことも多いようです。

無難にカーソルをデスクトップに持ってこないように気を付けるとよいのではないかと考えました。

以上、大野でした。
Windowsのショートカットキー

## 初めに
こんにちは、大野です。
今回は、Windowsのショートカットキーについて紹介しようと思います。

全部紹介すると量がとても多くなってしまうので、今回はあまり使っていないけれど、使ってみると便利なWinキーを使ったショートカットを紹介します。

## Win+A～Z
Win + A	クイック設定を開く/閉じる。
Win + B	通知領域（タスクバーの右側）をフォーカスする。
Win + C	チャットを開く。
Win + D	デスクトップを表示する。
Win + E	エクスプローラーを起動する。
Win + F	フィードバックHubを起動する。
Win + G	Xboxゲームバーを表示する。
Win + H	音声入力を起動する。
Win + I	Windowsの設定を起動する。
Win + K	デバイスの接続画面を開く。
Win + L	パソコンの画面をロックする。
Win + M	すべてのウィンドウを最小化する。
Win + O	画面の向きを固定する。
Win + P	外部ディスプレイへ出力する。
Win + Q	検索ボックスを使用する。
Win + R	「ファイル名を指定して実行」を起動する。
Win + S	検索ボックスを使用する。
Win + T	タスクバーでアプリを切り替える。
Win + U	設定の [アクセシビリティ] を開く。
Win + V	クリップボードの履歴を表示する。
Win + W	ウィジェットを開く。
Win + X	クイックアクセスメニューを表示する。
Win + Z	アクティブなウィンドウのスナップレイアウトを表示する。

## Win+Ctrl
Win + Ctrl + C	カラーフィルターをオン/オフにする。
Win + Ctrl + D	新しい仮想デスクトップを作成する。
Win + Ctrl + F4	使用中の仮想デスクトップを閉じる。
Win + Ctrl + Enter	ナレーターをオンにする。
Win + Ctrl + →	仮想デスクトップの切り替える（複数ある場合）。
Win + Ctrl + ←	仮想デスクトップの切り替える（複数ある場合）。
Win + Ctrl + Shift + B	ディスプレイドライバーを再起動する。

## Win+Shift
Win + Shift + M	最小化したウィンドウを表示する
Win + Shift + Q	クイックアシストを起動する。
Win + Shift + S	スクリーンショットの撮影する
Win + Shift + V	通知を選択する
Win + Shift + <	サブディスプレイにウィンドウを移動する
Win + Shift + >	サブディスプレイにウィンドウを移動する
Win + Shift + ↑	アクティブなウィンドウの高さを上下いっぱいに表示する。
Win + Shift + ↓	アクティブなウィンドウの高さを元に戻す。最小化する。
Win + Shift + ←	マルチモニターの場合：アクティブなウィンドウを左のモニターへ移動する。
Win + Shift + →	マルチモニターの場合：アクティブなウィンドウを右のモニターへ移動する。

## Win+その他
Win + F1	「Windowsでヘルプを表示する方法」をブラウザーで開く
Win + Pause	システム画面を開く
Win + PrintScreen	スクリーンショットを撮影して保存
Win + Tab	タスクビューを表示する。
Win + Home	アクティブなウィンドウ以外を最小化する。
Win + .	絵文字・顔文字を使用する
Win + ,	デスクトップを一時的に表示する。
Win + +	拡大鏡をオンにする。拡大鏡を拡大する。
Win + -	拡大鏡を縮小する。
Win + Esc	拡大鏡をオフにする
Win + 数字キー	タスクバーのアプリを起動する。
Win + Shift + 数字キー	タスクバーのアプリを新しく起動する。
Win + Alt + 数字キー	タスクバーのアプリの右クリックメニューを表示する。
Win + ↑	アクティブなウィンドウを最大化する。
Win + ↓	アクティブなウィンドウを元に戻す。アクティブなウィンドウを最小化する。
Win + ←	アクティブなウィンドウを左半分に配置する。
Win + →	アクティブなウィンドウを右半分に配置する。
Win + Alt + D	日付と時刻を表示する/非表示にする。

## 最後に
調べてみてそれぞれの機能も面白かったのですが、何よりA～Zまですべてのアルファベットに役割が与えられていることでした。
以上大野でした。
Ubuntu デスクトップ環境のフォルダ名

最近、Windows11のPCを、Ubuntu22.04 とデュアルブート化して、初めてUbuntuデスクトップ環境に触れる機会を得ました。

そこで、最初に驚いたのは、ユーザフォルダ内の子フォルダ名が日本語になっていること。

```terminal
$ cd ~
$ ls -l
drwx------  6 me   me   4096  7月 26 08:37  snap
drwxr-xr-x  2 me   me   4096  7月 25 22:42  ダウンロード
drwxr-xr-x  2 me   me   4096  7月 25 20:44  テンプレート
drwxr-xr-x  2 me   me   4096  7月 25 20:44  デスクトップ
drwxr-xr-x  2 me   me   4096  7月 25 21:45  ドキュメント
drwxr-xr-x  2 me   me   4096  7月 25 20:44  ビデオ
drwxr-xr-x  3 me   me   4096  7月 25 21:02  ピクチャ
drwxr-xr-x  2 me   me   4096  7月 25 20:44  ミュージック
drwxr-xr-x  2 me   me   4096  7月 25 20:44  公開
```

WindowsやMacだと、エクスプローラやファインダ上では日本語になっていても、実態のファイル名は英字です。しかし、Ubuntuは実態のファイル名が日本語になっている・・・・。
これだと、ターミナルで（`cd`コマンドで）ディレクトリを切り替える際に、いちいち日本語を打つかコピペする必要があり、ホント煩わしい。

そこで、次のコマンドにて シンボリックリンクを張って、使い慣れた英字ディレクトリ名も使えるようにした。

```terminal
cd ~
ln -s ./ダウンロード Downloads
ln -s ./テンプレート Templates
ln -s ./デスクトップ Desktop
ln -s ./ドキュメント Documents
ln -s ./ビデオ Videos
ln -s ./ピクチャ Pictures
ln -s ./ミュージック Music
ln -s ./公開 Public
```

```
$ ls -l
lrwxrwxrwx  1 me   me     20  7月 26 08:56  Desktop -> ./デスクトップ
lrwxrwxrwx  1 me   me     20  7月 26 08:56  Documents -> ./ドキュメント
lrwxrwxrwx  1 me   me     20  7月 26 08:56  Downloads -> ./ダウンロード
lrwxrwxrwx  1 me   me     20  7月 26 08:56  Music -> ./ミュージック
lrwxrwxrwx  1 me   me     14  7月 26 08:56  Pictures -> ./ピクチャ
lrwxrwxrwx  1 me   me      8  7月 26 08:56  Public -> ./公開
lrwxrwxrwx  1 me   me     20  7月 26 08:56  Templates -> ./テンプレート
lrwxrwxrwx  1 me   me     11  7月 26 08:56  Videos -> ./ビデオ
drwx------  6 me   me   4096  7月 26 08:37  snap
drwxr-xr-x  2 me   me   4096  7月 25 22:42  ダウンロード
drwxr-xr-x  2 me   me   4096  7月 25 20:44  テンプレート
drwxr-xr-x  2 me   me   4096  7月 25 20:44  デスクトップ
drwxr-xr-x  2 me   me   4096  7月 25 21:45  ドキュメント
drwxr-xr-x  2 me   me   4096  7月 25 20:44  ビデオ
drwxr-xr-x  3 me   me   4096  7月 25 21:02  ピクチャ
drwxr-xr-x  2 me   me   4096  7月 25 20:44  ミュージック
drwxr-xr-x  2 me   me   4096  7月 25 20:44  公開
```

1、2文字打ってタブキーを押せばファイル名補完が働くようになり、これで普段の操作性に戻りました。

~~ただし、『ファイルを開くダイアログ』でシンボリックリンクを指定してもリンク先のフォルダを見てくれないのが残念で、いっそ、mv（rename）したいと思うほどです。~~

<br>　
---
2024.8.30追加

```terminal:アップデート方法
sudo apt update -y
sudo apt upgrade -y

sudo apt list --upgradable
sudo apt install --only-upgrade <libraries>

sudo apt autoremove
sudo apt clean

sudo killall snap-store
sudo snap refresh snap-store
```

```terminal:開発環境
sudo apt install -y build-essential git
sudo snap install --classic code #VSCode
```

**以上**
paizaキャンペーン問題Bランク 長テーブルのうなぎ屋

# 概要
https://qiita.com/official-events/9ab96aa95d62fe3cbdd7

https://paiza.jp/works/mondai/b_rank_skillcheck_sample/long-table

こちらの問題をJavaScriptで解きました。

# 方針
最後に座る人が席数をオーバーするとき・しないときの場合分けをなるべくすっきり書きたい
* 空席確認と座席の更新は配列のループではなく`slice`と`fill`メソッドを使って一度に処理する
* オーバーする場合は ①座り始め～席数 ②最初の席～座り終わり の2つの処理が必要
* オーバーしない場合は座り終わりの席番号`end`を0にして（`slice(0,0)`）、毎回①②両方の処理を通すことにする

# 回答
```javascript
// 標準入力からの値取得省略

const [n, m] = lines[0].split(' ').map((num) => Number(num));
let cnt = 0;

// 座席を生成
const seats = new Array(n);
seats.fill(0);

for (let i=1; i<=m; i++){
    const [people, no] = lines[i].split(' ').map((num) => Number(num));
    let start = no - 1;
    let max = no + people - 1 <= n ?  no + people - 1 : n;        // 最大の席番号
    let end = no + people - 1 <= n ?  0 : no + people - 1 - n;    // 座り終わりの席番号

    // 空席確認
    if (seats.slice(start, max).includes(1)) continue;   // 座り始めから最大の席番号まで
    if (seats.slice(0, end).includes(1)) continue;       // 最初の席番号から座り終わりまで

    // 全て通過した場合座席を更新
    seats.fill(1, start, max);
    seats.fill(1, 0, end);

}

for (let i=0; i<n; i++){
    if (seats[i] == 1) cnt += 1;
}
console.log(cnt);
```
Laravel10 sailプロジェクト作成時のエラー解決方法【composer updateをする】

## はじめに

Laravel 10プロジェクトの作成時にエラーがでたので備忘録です。

コンテナを起動し、現在のディレクトリをコンテナの/optにマウント。

`docker run -it -v $(pwd):/opt -w /opt laravelsail/php81-composer:latest /bin/bash`


## 問題

以下でsail-exampleを作成しようとします。

`root@376b596f8ae0:/opt# composer create-project 'laravel/laravel:10.*' sail-examplei`

すると、以下のエラーとなりました。

```sh
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/framework[v10.10.0, ..., v10.48.20] require composer-runtime-api ^2.2 -> found composer-runtime-api[2.1.0] but it does not match the constraint.
    - Root composer.json requires laravel/framework ^10.10 -> satisfiable by laravel/framework[v10.10.0, ..., v10.48.20].
```

原因は、ComposerがLaravelフレームワークの要求するcomposer-runtime-apiのバージョン2.2以上を見つけられず、代わりにバージョン2.1.0を見つけたことです。
互換性の問題。

## 解決法

`composer self-update --2`

結果
```sh
root@376b596f8ae0:/opt# composer -v

# アップデート前
Composer version 2.1.12 2021-11-09 16:02:04
# アップデート後
Composer version 2.7.8 2024-08-22 15:28:36

```

再度、プロジェクト作成でエラーが出ずに通りました。
`root@376b596f8ae0:/opt# composer create-project 'laravel/laravel:10.*' sail-examplei`

## おわりに

以上です。
データを使いやすく整理する方法をChatGPTに相談してみた

私の業務はデータ処理が中心です。
ただデジタルに対してあまり前向でなかった私は、
新しいことにあまりチャレンジをしてきませんでした。

今のままではうまくいかないなと思ったときは、
持っている知識の範囲内で組み合わせてみて、
できたよかった！うまくいかなかったらやっぱりー、を繰り返していました。
**ChatGPT** について知り、今迄であきらめていたことができるようになるかもしれない、と挑戦してみることにしました。

## 商品管理に使うデータを整理して使える状態にしたい

普段、商品を注文する時、準備としていろいろなデータを確認していますが
主に下記３つのデータを中心に使っています。
1\. 今お店にある在庫
2\. 今まで売れた数量
3\.これからお店に入れる数量

4\.注文してまだお店についていない在庫

１～３については今のシステムのフォーマットがあるので、データをそ出力してすぐ使えます。
ここに**４．注文しているけどまだ商品が届いていない在庫** のデータを組みこんで使いたい。
このデータを業務に使える状態にするのに非常に手間がかかるのです。
これを整理にする方法をChatGPTに相談して**なんとかできるようになりました**。


## 2つに分けて作業をする

### エクセルシートの統合
まずは④のデータ元は　システムから１発で取り出せないデータなので、
システムの入り口をかえて複数回取り出し作業をして得たデータを一つにまとめる必要があります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/6786ea9c-8798-93fb-8023-b66bb7ed6904.png)

方法を複数提案してくれました。
方法1: コピーペーストで手動でまとめる
　⇒いつも使っている方法です。難しくはないけれどちまちまやるのが結構面倒です。
 間違えて重ねちゃったりするとデータが狂います。これ以外の方法が知りたい。

方法2：Power Queryを使ってまとめる

３ステップでできました
①まとめたいデータを一つのフォルダに入れる
②エクセルの左上　データ⇒データの取得⇒フォルダからでデータ集約したいフォルダを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/8723bbe8-a320-f9d6-d96d-9dd03b89a43a.png)
③これを最後にデータの結合および読み込み　を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/0d838f9a-0ced-c857-8b1d-1fa9087cf912.png)

出来上がったシートはテーブルというらしいです。
色分けされてて見やすい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/4afa7394-e2ce-d6b7-f1ee-e5cf4b1d9d69.png)

### 完成したシートを作業シートに合体する
このデータをまとめて商品管理用シートに統合、計算できるようにしたい。

店舗は3ケタ　商品は　4ケタの数がありデータ件数がとても多いのです。
商品を照合するにはいつもVLOOKUPを使用していますが、この値はキーになる行が複数あり、
VLOOKUPをしたくても1回でできそうにない。
何とかならないかとそのまま聞いてみたところ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/c9582c8a-c2ec-85af-023e-5bc76839205d.png)

答えの意味がよくわからないと思って見返してみたら、自分のプロンプト意味がよくわからないなと気づきました。仕切り直して聞き方を変えてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/321128cd-abd1-da05-aec9-6db62ffbf564.png)


なんと、関数ってくみあわせることができるんだ！



１は範囲指定がしづらくて使いづらいと判断して2で挑戦してみました。


### できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/7b3d9f5f-8d63-d248-1765-a07ace4382c3.png)

3に無事値が入り、ない場合は＃N/Aが出るので正しい数値が入りました。
これで業務に入る準備ができました。

## 一応できたけれど
理想にはこれを自動的にやってもらうこと。
VBAのことも教えてもらいぜひやってみたいと思いました。
コードも書いてもらって、解説もしてもらってこれならできると思ったのですが
データが重すぎたの何度もパソコンが固まり動いてくれませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835981/769cd257-ee41-4583-8c59-de02b5ca9eb4.png)




あきらめて今の形に落ち着きました。

:::note alert
うまくいかなかったポイント
1\. やりたいことをChatGPTにうまく伝えられず返答がよくわからない
2\. いつも使っているエクセルを使用したらデータ量が多すぎてパソコンが固まる
3\. 取得したデータをまとめ・別シートに特定のデータを呼び出すことを一度にやろうとした
:::


１が特に頭を悩ませました。
思えば友人や家族との会話でも
「主語がないから話がよくわからない」と言われることの多い私。
ChatGPTも同じなんですね。
自分の発信について今一度気を付けなければの思いを新たにしました。
2は何度もフリーズされて、お試しデータとして軽いものを用意する必要があると気づきました。
３**統合**と**照合**を分けて聞いたらすぐに答えが返ってきました。

理想の形にはなりませんでしたが今回ChatGPTのおかげで
**Power Query**や**関数を組み合わせる**という、新しい知識は得られました。
これからさらにレベルアップできるようChatGPTに相談してみようと思います。
ウィンドウの文字がにじむときの解決方法

ウィンドウを開いたとき、画像のように文字やアイコンがにじんでしまうことがありました。
全画面にしていたり、ウィンドウ表示の状態にしていてもこのようににじんでしまう状態でした。
いくら調べても出てこなかったので、この解決方法をまとめておきます。
同じ現象になって原因がわからなくなっている人の助けになればうれしいです。
![スクリーンショット 2024-08-21 193452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871717/ad43ad73-99b5-e1be-ca7b-620a7e9c0a0a.png)

## NVIDIA コントロールパネルの「アンチエイリアシング -FXAA」をオフにする
アンチエイリアシング -FXAA をオンにしていたことが原因でした。
これをオフにすることで文字やアイコンがにじむ現象が解消されました。

高DPIスケールの動作周りが原因かと思っていましたが、これを設定しても解消されなかったため、同じような方はこちらの設定を見直してみてください。
Vue.js と Spring Boot を連携基本

# 1. Spring Boot で REST API を構築する
まずはバックエンド側の Spring Boot で、簡単な REST API を作成します。このAPIは、ユーザーのリストを返すエンドポイントを提供します。


![napkin-selection (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690843/b54b8e2f-8b96-6d13-a7f2-9612b8391228.png)


### Spring Boot の準備
Spring Initializr を使って、新しい Spring Boot プロジェクトを作成します。Web依存関係を追加しておきましょう。

コントローラーの作成
次に、UserController というコントローラーを作成し、ユーザー情報を返すエンドポイントを定義します。

```java
@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/users")
    public List<User> getUsers() {
        // ユーザーリストを返す
        return List.of(new User(1, "Alice"), new User(2, "Bob"));
    }
}
```
/api/users にGETリクエストを送ると、以下のようなJSON形式のデータが返されます。

```json
[
  { "id": 1, "name": "Alice" },
  { "id": 2, "name": "Bob" }
]
```
## 2. Vue.js プロジェクトを作成する
次に、Vue.js を使ってフロントエンドのプロジェクトを作成し、Spring Boot のAPIと通信します。

Vue CLI を使ったプロジェクト作成
まず、Vue CLI を使って新しいプロジェクトを作成します。

```bash
vue create my-project
```
```
cd my-project
```
```
npm install axios
```
### Axios を使った API 呼び出し
App.vue や任意のコンポーネントで、Axios を使って Spring Boot のAPIを呼び出します。

```javascript
<template>
  <div>
    <h1>User List</h1>
    <ul>
      <li v-for="user in users" :key="user.id">{{ user.name }}</li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      users: []
    };
  },
  mounted() {
    this.fetchUsers();
  },
  methods: {
    async fetchUsers() {
      try {
        const response = await axios.get('http://localhost:8080/api/users');
        this.users = response.data;
      } catch (error) {
        console.error("There was an error fetching the users!", error);
      }
    }
  }
};
</script>
```
### CORS（クロスオリジン）の設定
開発中に、Vue.js と Spring Boot が異なるポートで動作している場合、CORSの問題が発生することがあります。この問題を解決するために、Spring Boot 側で CORS を設定します。

```java
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://localhost:8080") // Vue.jsの開発サーバーのURL
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .allowCredentials(true);
    }
}
```
開発効率爆上がり！Go言語×Airでホットリロードを超簡単設定

# `Air` を使ったGo言語のホットリロード設定ガイド

こんにちは！今回はGo言語での開発をもっと効率よくするために、[`Air`](https://github.com/air-verse/air)というツールを使ってホットリロードの環境を整える方法を紹介します。開発中にコードを編集するたびに、毎回手動でアプリケーションを再起動するのは手間ですよね。そんなときに便利なのが、この`Air`なんです！`Air`を使えば、コードの変更を自動で検知してアプリケーションを再起動してくれるので、開発がかなりスムーズになります。

DMMさんのインターンでこのツールを教えていただき、早速自分のプロジェクトにも導入してみましたが、設定がとても簡単だったので投稿いたします！（初心者🔰の記事ですので温かい目で見ていただけると嬉しいです:bow:）

## ホットリロードとは？

ホットリロードとは、コードを変更したときに自動でアプリケーションを再コンパイルして再起動する機能のことです。これによって、変更が即座に反映されるので、毎回手動で再起動する手間が省けて、作業効率がグッと上がります！

### 1. `Air` のインストール

まずは、`Air`をインストールしましょう！インストールの前に、使用しているGoのバージョンが1.17以上であることを確認してください。

```bash
go version
```

次に、以下のコマンドをターミナルで実行して`Air`をインストールします。

```bash
go install github.com/air-verse/air@latest
```

インストールが終わったら、`air`コマンドが正しく使えるか確認してみましょう。

```bash
which air
# 出力例: /Users/username/go/bin/air
```

もし`go/bin`ディレクトリが`PATH`に入っていなかったら、次のコマンドを使って設定を追加してください。

```bash
export PATH=$PATH:$(go env GOPATH)/bin
```

### 2. 設定ファイルを作成

`Air`のインストールが完了したら、次は設定ファイルを作成します。プロジェクトのルートディレクトリで以下のコマンドを実行して、`.air.toml`という設定ファイルを生成しましょう。

```bash
air init
```

これでプロジェクトのルートに`.air.toml`ファイルが作成されます。

### 3. 設定ファイルの内容を確認

生成された`.air.toml`ファイルの内容をチェックしましょう。この設定ファイルは、`Air`の動作を細かくカスタマイズするためのものです。
以下は、デフォルトで生成される`.air.toml`の一部です：

```toml
# .air.toml
root = "."  # プロジェクトのルートディレクトリ
testdata_dir = "testdata"  # テストデータ用ディレクトリの指定
tmp_dir = "tmp"  # 一時的なファイルを保存するディレクトリ

[build]
  bin = "./tmp/main"  # ビルドされたバイナリの出力先
  cmd = "go build -o ./tmp/main ."  # 実行するビルドコマンド
  exclude_dir = ["assets", "tmp", "vendor", "testdata"]  # 監視から除外するディレクトリ
  include_ext = ["go", "tpl", "tmpl", "html"]  # 監視するファイルの拡張子
  log = "build-errors.log"  # ビルドエラーログの出力ファイル
  stop_on_error = false  # エラー発生時にビルドを停止するかどうか

[log]
  time = false  # ログにタイムスタンプを追加するかどうか

[misc]
  clean_on_exit = false  # 終了時に一時ファイルを削除するかどうか
```

この設定ファイルでは、`Air`がどのファイルを監視するか、どのファイルを無視するかなどを指定しています。デフォルトの設定で十分にホットリロードの機能を活用できますが、要件に応じてカスタマイズすることも可能です。
たとえば、もし、`Makefile`でビルドを管理している場合、以下の様に設定できます。
（Makefile に build ターゲットが正しく定義されていることが前提です。）

```toml
[build]
cmd = "make build"
```
この設定では、`Makefile`を使ってビルドコマンドを実行します。`Air`がソースコードの変更を検知すると、自動的に`make build`コマンドを実行し、指定されたバイナリを生成します。これにより、ビルドプロセスが自動化され、より効率的な開発環境を整えることができます。

公式の設定ファイルは、[こちら](https://github.com/air-verse/air/blob/master/air_example.toml)で確認できます。

### 4. 動作確認

`Air`を使ってアプリケーションを起動してみましょう。ターミナルで以下のコマンドを実行します。

```bash
air
```

ターミナルに以下のようなメッセージが表示されれば成功です！

```
__    _   ___  
/ /\  | | | |_) 
/_/--\ |_| |_| \_ v1.52.3, built with Go go1.22.6

watching .
building...
running...
```

この状態でコードに変更を加えると、`Air`が自動でホットリロードしてくれます。

---

これで、Go言語の開発がきっと快適になるはずです :star2:。ぜひ、試してみてください。

※`Air`は開発環境でのみ使用し、本番環境では使用しないようにします。
[VScode] PRのファイル差分の中から cmd+P 出来る拡張機能作って見た。

# VS Code拡張機能 PR File Search 作って見た。
今回は、最近開発したVisual Studio Code拡張機能「PR File Search」についてご紹介します。
この拡張機能は、プルリクエスト（PR）関連のファイル検索を劇的に簡単にするものです。

https://marketplace.visualstudio.com/items?itemName=KeisukeTerada.pr-file-search

PRと書いてますが、実際は master とのファイル差分を見ているので
もちろんPRを出す前でも利用できます。

`Command P`で新しいファイルを開き
それ以降はこの拡張機能の `Command Control P` で作業中ファイルから探せます。

## なぜこの拡張機能を作ったのか？
大規模なプロジェクトで作業していると、PRで変更したファイルを素早く見つけて確認したいことがよくあります。しかし、既存の方法では時間がかかったり、面倒だったりしました。そこで、この問題を解決するための拡張機能を作ることにしました。

具体的には React Redux など作業ファイルが膨大になりがちな作業環境で欲しかったので作ってます。

## PR File Searchの主な特徴

1. **高速検索**: ローカルのGit操作を使用しているため、非常に高速です。
2. **簡単操作**: カスタムキーバインディング（MacではCmd+Ctrl+P、WindowsとLinuxではCtrl+Alt+P）で簡単に起動できます。
3. **包括的な検索**: ステージされたファイル、未ステージのファイル、新規ファイルを含む全ての変更ファイルを検索対象とします。
4. **削除ファイルの除外**: 検索結果から削除されたファイルを自動的に除外します。

## 使い方

1. VS CodeでGitリポジトリを開きます。
2. 変更を含むブランチにチェックアウトします。
3. キーボードショートカットを使用して検索機能を起動します。
4. 表示されたリストから目的のファイルを選択して開きます。

## 技術的な詳細

この拡張機能は、`git diff`コマンドを利用して現在のブランチとメインブランチ（`main`または`master`）の差分を取得しています。パフォーマンスを向上させるため、結果のキャッシュは行わず、毎回新鮮な結果を提供します。

## インストール方法

https://marketplace.visualstudio.com/items?itemName=KeisukeTerada.pr-file-search

[Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=KeisukeTerada.pr-file-search)からインストールできます。

## 今後の展望

現在、以下の機能を検討しています：

- メインブランチ名のカスタマイズオプション
- ファイルタイプによるフィルタリング
- 差分の表示機能

## おわりに

PR File Searchは、日々のコーディング作業を少しでも効率化したいという思いから生まれました。皆さんのワークフローの改善に役立てば幸いです。

ぜひ試してみてください！フィードバックやプルリクエストも大歓迎です。[GitHubリポジトリ](https://github.com/keisuke2236/pr-file-search)でお待ちしています。

Happy coding!
【Power Automate】Share Pointに格納したDocxファイルをHTTPコネクタを利用して送信する

# はじめに
以下のページを参考に、

https://mofumofupower.hatenablog.com/entry/specify_filename_response

Power Automateを用いて、事前にShare Pointに格納しておいたDocxファイルを
Automate標準のHTTPコネクタを利用してHTTPリクエストを送信する方法を実現しました。

# 使用したツール
* Share Point (ライセンス：M365 E5 アカウント)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130247/67122be1-b7ad-fd2d-3d4d-d069ee489f79.png)

* Power Automate (ライセンス：Power Automate Per User Plan)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130247/57c20e21-32bb-4db8-425b-b3105a52a817.png)

# 参考サイト
* https://mofumofupower.hatenablog.com/entry/specify_filename_response
* [apidog](https://app.apidog.com/project/640470)

# PowerAutomateのワークフロー
sharepoint上に格納した.docxファイルを2つ取得します。
(2つの意味は今回特にないです。のちにファイルを結合したいため、このようなワークフローを作成しました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130247/4ba1bcc8-5966-3f15-48bb-f0732c954ffc.png)

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130247/bd5811a5-8fc9-2ef2-3bdc-c571acb5ea40.png)


「データ操作コネクタ」の「作成アクション」を使用しましたが、
意味のない操作なので無視して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130247/d880fcea-69a7-5dce-46b3-5e04fdb362b4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1130247/942c76bf-3d0d-5abe-ca1e-df226c68f632.png)

以下コードの中身です。
Header
```js
{
  "Content-Type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}
```

Body
```js
{
  "$content-type": "multipart/form-data",
  "$multipart": [
    {
      "body": @{outputs('作成')},
      "headers": {
        "Content-Disposition": "form-data; name=\"file\"; filename=\"doc01.docx\"",
        "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
      }
    },
    {
      "body": @{outputs('作成-copy')},
      "headers": {
        "Content-Disposition": "form-data; name=\"file\"; filename=\"doc02.docx\"",
        "Content-Type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
      }
    }
  ]
}
```

以上で
Share Pointに格納したDocxファイルをHTTPコネクタを利用して送信することができました。
[備忘録] Ubuntuで動画のclippingや結合を簡単にTerminalから行う方法

学会発表の際に動画を撮影する必要があり，その編集時の備忘録.

簡単な話，ffmpegでできます．

```shell
# 10秒から2分30秒までを切り抜いて複製．
$ ffmpeg -ss 00:00:10.0 -i sample-before.mp4 -to 00:02:30.0 -c copy sample-after.mp4

# 複数の動画を結合．
$ ffmpeg -i "concat:sample1.mp4|sample2.mp4|sample3.mp4" -c copy sample-after.mpg
```
【豆知識】.gitignoreとconfigとの関係性について

# はじめに
課題着手当時は「こうしないといけないものだから、こうするんだ」で終わっていたものもおおく、改めて課題を振り返ってみることでなぜこのコードが必要なのか、少しずつ理解。ちゃんと読めていない部分もあり。恥ずかしい限りです。
では早速今回の内容を見ていきましょう。

## 環境
- Windows, WSL
- Docker
- Ruby 3.2.3
- Rails 7.1.3



## gem 'config'を導入したあと.gitignoreについて
パスワードリセット機能を実装するために最後の段階で`gem 'config'`を導入したあと`.gitignore`を以下のように編集する過程がありました。なぜでしょうか？
```ruby
config/settings.local.yml
config/settings/*.local.yml
config/environments/*.local.yml
```

## 解答
`.gitignore` ファイルに次のような設定を追加する理由は、開発環境や特定のローカル設定をバージョン管理システム（Git）に含めないようにするためです。

### 1. **`config/settings.local.yml`**

- **目的**: このファイルは、特定のローカル環境でのみ有効な設定を記述するために使用されます。たとえば、開発者がそれぞれ異なるAPIキーやデータベース設定を持っている場合、その設定をこのファイルに記述します。
- **理由**: 開発者ごとの設定を共有する必要はなく、他の開発者の環境に影響を与えないため、このファイルはGitにコミットしません。

### 2. **`config/settings/*.local.yml`**

- **目的**: `.local.yml` という形式で、環境ごとのローカル設定ファイルを追加できます。例えば、`development.local.yml` や `production.local.yml` といったファイルを作成し、それぞれの環境で特定の設定を行います。
- **理由**: 環境に依存したローカル設定は個々の開発者やサーバーの環境に合わせて異なることが多く、これらのファイルも共有する必要はありません。設定を共有すると、他の環境で動作しない可能性があります。

### 3. **`config/environments/*.local.yml`**

- **目的**: 環境ごとの設定ファイルに加えて、特定のローカル環境でのオーバーライドを行いたい場合に使用します。これにより、環境ごとの設定をさらにローカルレベルで細かく制御できます。
- **理由**: 他の開発者や本番環境に影響を与えないようにするため、ローカルの環境設定はGitに含めません。

### **つまりはこういうこと**

`gem 'config'` を使用する場合、ローカル設定や特定の環境に依存する設定はGitで共有しない方が安全です。これにより、他の開発者やデプロイ先での動作に悪影響を与えることなく、自分の開発環境で必要な設定を自由にカスタマイズできます。そのため、**これらの `.local.yml` ファイルを `.gitignore` に追加して、バージョン管理から除外します。**

### ついでにgem 'config'について
gem 'config'とは、Railsアプリケーションで設定管理を簡単に行うためのgemです。

環境ごとに異なる設定を一元管理することができ、開発環境、テスト環境、本番環境で異なる設定値を使いたい場合に非常に便利です。config/settings.ymlファイル に共通の設定を書き、config/settings/development.yml、config/settings/production.yml、config/settings/test.yml に環境ごとの設定を書き分けます。

# さいごに
外部から丸見え状態にしない為、悪用されないようにするために`.gitignore`が必要。うっかり設定を忘れないようにしないと悲惨なことになると容易に想像ができてしまう。怖いですね。:scream:
今回の記事が何か参考になれば幸いです。
APIキーを直書きから環境変数へ移行する時の簡単なやり方

# 趣旨
APIキーを直書きしていたんですがファイル自体は残したまま環境変数を使いたいと後になって思い直したのでその対策を備忘録として残しておきます。

# もともと直書きしていたファイル
セキュリティ的に終わっていますね。こんなの最悪です。テストコードを書いてる時に面倒だったのでこんなことをしてしまいました。テストでもよくないですね。
```python keys.py
API_KEY = "xxx"
API_SECRET_KEY = "xxx"
```

# 修正後のファイル
環境変数から読み込んだ値をkeys.pyにセットしてkeys.pyを別のプログラムから読み込めるようにしてます。こうすることで別のプログラムを一切書き換えることなくそのまま利用できるようにしています。

```python keys.py
import os

API_KEY = os.getenv('API_KEY')
API_SECRET_KEY = os.getenv('API_SECRET_KEY')

if not all([API_KEY, API_SECRET_KEY]):
    raise EnvironmentError("API credentials not found in environment variables.")
```

## 環境変数
環境変数って便利ですね。Githubなんかに間違えてアップロードしてしまうことってよくあるんですけど、それも回避できますし。
```
export API_KEY=api_key
export API_SECRET_KEY=api_secret_key
```
【JavaScript】配列から重複する値自体を削除する方法

JavaScriptで、配列から重複する値を削除する方法として、`new Set()`を用いた方法がありますが、そうではなく、配列から重複する値自体を削除する方法をご紹介します。

日本語がややこしいため、例を出します。

```shell
appleとlemonがそれぞれ重複するため、値を削除する
['apple', 'orange', 'apple', 'grape', 'peach', 'lemon', 'lemon']
↓
['orange', 'grape', 'peach']
```

## コード

２つ方法をご紹介します。どちらの方法でも、配列から重複する値自体を削除できます。

### パターン1

重複する値を抽出した後、ユニークな値を抽出する

```javascript
const fruits = ['apple', 'orange', 'apple', 'grape', 'peach', 'lemon', 'lemon'];

// 重複する値を抽出
const duplicatedFruits = fruits.filter(
  (fruit, index) => fruits.indexOf(fruit) !== index,
);
// ['apple', 'lemon']

// ユニークな値を抽出
const result = fruits.filter((fruit) => !duplicatedFruits.includes(fruit));
// ['orange', 'grape', 'peach']
```

### パターン2

重複する値を抽出した後、ユニークな値を抽出する

```javascript
const fruits = ['apple', 'orange', 'apple', 'grape', 'peach', 'lemon', 'lemon'];

// 対象の値が出てくる最初のindexと最後のindexを調べて、同じものを抽出
const result = fruits.filter((fruit) => {
  const firstFruitIndex = fruits.findIndex((f) => f === fruit);
  const lastFruitIndex = fruits.findLastIndex((f) => f === fruit);
  return firstFruitIndex === lastFruitIndex;
});
// ['orange', 'grape', 'peach']
```

## まとめ

配列から重複する値自体を削除する方法をご紹介しました。

どちらの方法もコード量に大きな差はないため、ご自身のコーディングスタイルや、その後の処理との組み合わせやすさなどを考慮して選択してください。

ただし、今回はパフォーマンスを考慮してないため、配列の数が多い場合などは、事前にベンチマークテストを実施することをおすすめします。

## 最後に

### GoQSystemでは一緒に働いてくれる仲間を募集中です！

ご興味がある方は以下リンクよりご確認ください。

https://goqsystem.recruit.site?qiita=583c395a2572bc8c4c10
PHPでテストコードを書いてみる！単体・結合テスト、AAAについても解説！


# テストコードとは？

プログラムの動作を検証するために書かれるコードのことです！

# テストコードのメリット

- バグ検知
    - コードに潜むバグの検知を早期に発見できます
- 関数の動作を表現できる
    - テストコード自体が関数の使用方法を示すドキュメントになります
- リファクタリングの安全性確保
    - 他メンバーがコードを修正する際にもテストが通ることで品質が保証されます
    - テストコードが無いとどこまで影響範囲があるのか確認しなければなりません


# テストの種類

- 単体（ユニット）テスト
    - 関数単位で正しく動作するか確認します
    - 例: MVCフレームワークのモデルの関数のテスト
- 結合（インテグレーション）テスト
    - 単体テストで確認した関数を組み合わせて連携してテストを行います
    - 例: MVCフレームワークのコントローラーのアクションのテスト
- システムテスト
    - システム全体が要件通りに動作するかを確認します
    - アプリケーションがほぼ完成した段階で実施されます


# AAAパターン（Arrange, Act, Assert）とは？？

テストコードを書くうえで効率的な手法のひとつにAAAがあります。このパターンは、テストコードを整理し、読みやすく、理解しやすくするための手法のひとつとして使われています。

- Arrange (準備)
    - テストの前提条件を設定します。必要なオブジェクトを作成し、初期状態を設定します。
- Act (実行)
    - テスト対象のメソッドや関数を実行します。
- Assert (検証)
    - 実行結果が期待通りであることを検証します。


ここからは実際にPHPのテストコードを見ていきましょう！

# PHPでテストコードを書いてみる⚡

PHPのテストではPHPUnitというテストフレームワークを使用します。
PHPUnitを使用するために必要なComposerのインストールからPHPUnitを使った簡単なテストの実行までの手順を紹介します。

作成していくテスト用のファイル構成はこのような形です。

```
project/
├── phpUnit/
│   ├── vendor/
│   │   └── bin/
│   │       └── phpunit
│   └── tests/
│       └── CalculatorTest.php
└── Calculator.php
```


早速必要ライブラリとファイルを作成していきましょう！！

### 1. Composerのインストール


1. [Composerの公式サイト](https://getcomposer.org/download/)からインストーラーをダウンロードします。
2. ダウンロードしたインストーラーを実行し、指示に従ってインストールします。

#### インストール確認
インストールが完了したら、コマンドを実行して、Composerが正しくインストールされているか確認します。

```bash
composer --version
```

### 2. PHPUnitのインストール

Composerを使ってPHPUnitをインストールします。

```bash
composer require --dev phpunit/phpunit
```

vendorフォルダが作成されてなかにPHPUnitが格納されています！

### 3.　テスト対象となるクラスを作る

projectフォルダにCalculator.phpを作成します。

```php
class Calculator {
    public function add($a, $b) {
        return $a + $b;
    }
}
```

### 4. テストクラスの作成

testsフォルダのなかにCalculatorTest.phpを作成します。
`testAdd()`のなかにテストコードをAAAにならって書いてみます。

```php

use PHPUnit\Framework\TestCase;
require_once DIR . '/../Calculator.php';

class CalculatorTest extends TestCase {

    public function testAdd() {
        // Arrange: テストの準備
        $calculator = new Calculator();
        // Act: 実際の操作
        $result = $calculator->add(2, 3);
        // Assert: 結果の検証
        $this->assertEquals(5, $result);
    }

}
```

### 5. テストの実行
コマンドでテストを実行します！

```bash
vendor/bin/phpunit tests/CalculatorTest.php
```
このようなテスト結果が表示されます。

```bash
# PHPUnitのバージョン
PHPUnit 10.5.30 by Sebastian Bergmann and contributors.

# テストが実行されたPHPのバージョン
Runtime:       PHP 8.1.24

# テストが1つ実行され成功しています
1 / 1 (100%)

# テストの実行時間とメモリ使用量
Time: 00:00.006, Memory: 6.00 MB

# １つのテスト、１つのアサーション（検証）が行われたことを示しています。
OK (1 test, 1 assertion)

```

# まとめ🖊️

ご覧いただきありがとうございました！
業務でテストコードを書く文化が無いため（涙

テストプロジェクトを作ってアウトプットしてみました。
次は実際にDBの値なんかもテストしてみたいと思います。

何か気になる点や、おかしな点ありましたらお気軽にコメントください！
3分でざっくりわかる、仕事でVPNを使う理由

# こんな人に読んでほしい
「とりあえず、会社のルールとして利用している」
「VPN?とりあえずセキュリティが向上するんでしょ」
「オフィスのリソースにアクセスするために仕方なく」
みたいな感覚でVPNを利用している人。
# 結論
データの盗聴を防ぐため。

# 仕組み
VPNを利用してWEBサイトにアクセスするケースを考えてみます。
まずはクライアントPCがVPNサーバーにリクエストを送ります。
この通信は暗号化されています。
その後、VPNサーバーはWEBサイトにリクエストを送ります。
この通信は暗号化されていません。
WEBサイトがVPNサーバーにレスポンスを送ります。
この通信は暗号化されません。
その後、VPNサーバーはWEBサイトにレスポンスを送ります。
この通信は暗号化されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1045272/88980167-28ff-9693-a976-228633603b6b.png)
つまり、VPNを利用することで、間違えて悪意のあるWi-Fiを利用し、盗聴されても暗号化されているため、それなりに安心というわけです。

# 気をつけること
データを盗聴された時の情報漏洩のセキュリティを向上させるだけで、ウィルスはダウロードできるできてしまいます。盗聴によるセキュリティが向上しただけなので、気を大きくして変なサイトにアクセスするのはやめましょう。
また、そもそも暗号化をしていないVPNもあります。VPNを運営している会社が信用できるかどうか見極めてから利用しましょう。

# 参考
https://www.nttpc.co.jp/column/network/whats_vpn.html