OmniAICreator/Qiita-1.07M huggingface dataset:
Beginner picoMini 2022 writeup PW Crack 4

## PW Crack 4 (General Skills)

Can you crack the password to get the flag? Download the password checker here and you'll need the encrypted flag and the hash in the same directory too. There are 100 potential passwords with only 1 being correct. You can find these by examining the password checker script.

添付ファイル
・level4.py
・level4.flag.txt.enc
・level4.hash.bin

PW Crack 3とほぼ同じで、パスワード候補の数が多いだけ。
level4.pyの中身を少しいじって実行する。
以下、実行コード。
```python
import hashlib

### THIS FUNCTION WILL NOT HELP YOU FIND THE FLAG --LT ########################
def str_xor(secret, key):
    #extend key to secret length
    new_key = key
    i = 0
    while len(new_key) < len(secret):
        new_key = new_key + key[i]
        i = (i + 1) % len(key)        
    return "".join([chr(ord(secret_c) ^ ord(new_key_c)) for (secret_c,new_key_c) in zip(secret,new_key)])
###############################################################################

flag_enc = open('level4.flag.txt.enc', 'rb').read()
correct_pw_hash = open('level4.hash.bin', 'rb').read()


def hash_pw(pw_str):
    pw_bytes = bytearray()
    pw_bytes.extend(pw_str.encode())
    m = hashlib.md5()
    m.update(pw_bytes)
    return m.digest()


def level_4_pw_check(user_pw):
#    user_pw = input("Please enter correct password for flag: ")
#    user_pw_hash = hash_pw(user_pw)
    
#    if( user_pw_hash == correct_pw_hash ):
        print("Welcome back... your flag, user:")
        decryption = str_xor(flag_enc.decode(), user_pw)
        print(decryption)
        return
        print("That password is incorrect")


# The strings below are 100 possibilities for the correct password. 
#   (Only 1 is correct)
pos_pw_list = ["8c86", "7692", "a519", "3e61", "7dd6", "8919", "aaea", "f34b", "d9a2", "39f7", "626b", "dc78", "2a98", "7a85", "cd15", "80fa", "8571", "2f8a", "2ca6", "7e6b", "9c52", "7423", "a42c", "7da0", "95ab", "7de8", "6537", "ba1e", "4fd4", "20a0", "8a28", "2801", "2c9a", "4eb1", "22a5", "c07b", "1f39", "72bd", "97e9", "affc", "4e41", "d039", "5d30", "d13f", "c264", "c8be", "2221", "37ea", "ca5f", "fa6b", "5ada", "607a", "e469", "5681", "e0a4", "60aa", "d8f8", "8f35", "9474", "be73", "ef80", "ea43", "9f9e", "77d7", "d766", "55a0", "dc2d", "a970", "df5d", "e747", "dc69", "cc89", "e59a", "4f68", "14ff", "7928", "36b9", "eac6", "5c87", "da48", "5c1d", "9f63", "8b30", "5534", "2434", "4a82", "d72c", "9b6b", "73c5", "1bcf", "c739", "6c31", "e138", "9e77", "ace1", "2ede", "32e0", "3694", "fc92", "a7e2"]


for i in pos_pw_list:
    if hash_pw(i) == correct_pw_hash:
        a = i

level_4_pw_check(a)

```

`picoCTF{fl45h_5pr1ng1ng_d770d48c}`
Raspberry Pi ZeroW2(64BitOS)でフリーズした場合

# 概要

Raspberry Pi Zero2にRaspberryPi OS(64Bit/Bookworm)
をインストール直後、アップデートを実施すると、”apt-listchanges: Reading changelogs...”と表示されて以降、フリーズしてウンともスンとも言わなくなりました。

```
$ sudo apt update
$ sudo apt full-upgrade -y
apt-listchanges: Reading changelogs...
```

# 原因
Raspberry Pi Zero W 2は、物理メモリが512MBなのですが、
RaspberryPi OS(64Bit/Bookworm)はスワップ領域を100MBに設定しており、64Bit　RaspberryPi OSでは、OSインストール直後のアップデートではメモリ不足が発生します。

# 対策
Raspberry Pi OSでスワップ領域（swap space）のサイズを変更します。スワップはシステムの物理メモリ（RAM）が不足した際に、ディスク上の仮想メモリ領域として利用されます。

### 1.スワップファイルの現在のサイズを確認する
現在のスワップファイルのサイズを確認するには、次のコマンドを使います。

```bash
sudo swapon --show
```
  

### 2.スワップファイルのサイズを変更する

2-1.**`/etc/dphys-swapfile` ファイルを編集し、スワップファイルのサイズを設定します。**

```bash
sudo vim /etc/dphys-swapfile
```

   このファイル内にある `CONF_SWAPSIZE` パラメータを編集し、希望のメガバイト単位でサイズを設定します。例えば、スワップサイズを1GBに設定する場合は、`CONF_SWAPSIZE=1024` とします。

2-2. **スワップファイルを再生成します。**
   ```bash
   sudo dphys-swapfile setup
   ```

2-3. **スワップを再有効にします。**
   ```bash
   sudo dphys-swapfile swapon
   ```

### 3. スワップファイルの設定を確認する

 最後に、変更が適用されたかを確認するために、再びスワップ情報を表示させます。
  ```bash
  sudo swapon --show
  ```

これで、Raspberry Pi OS上でスワップサイズを変更する手順が完了しました。安心して、アップデートを実施します。
スワップが発生するため、時間がとてもかかりますが、アップデートが終わるまでしばらく待ちます。
```
$ sudo apt update
$ sudo apt full-upgrade -y
apt-listchanges: Reading changelogs...
```
error: failed to push some refs to の解決

## git merge origin/master --allow-unrelated-historiesを使おう！
初心者エンジニア志望のメモです。
error: failed to push some refs to でpullなどしても解決しないときは
```ruby:console
git merge origin/master --allow-unrelated-historie
```
を使うことで解決する場合があります。
このコマンドはgitで祖先が違うもの同士をmergeできるコマンドのようです。
とりあえずの解決策なのでより良い方法があったら教えていただけると幸いです。

参考
https://dev.classmethod.jp/articles/git-merge-option-allow-unrelated-histories/
Snowflakeの権限周りについて

# 背景
自分用メモとして公開します。
Snowflakeを触り始めてずっとロール：ACCOUNTADMINで操作していました。
「自分は管理者だし～」とか思って。

そろそろACCOUNTADMINを使うのはやめて、デフォルトロールをSYSADMINにしたり、
タスク実行用のカスタムロール（以降、タスク用ロールと記載）を作成したりしてみました。


# やったことメモ
タスク用ロールを作成。ここはGUIで設定

タスク用ウェアハウスを作成。ここはGUIで設定。X-Smallの1分停止設定

ウェアハウスのOWNERSHIPをタスク用ロールに設定
```
GRANT OWNERSHIP ON WAREHOUSE IDENTIFIER($タスク用WH) TO ROLE IDENTIFIER($タスク用ロール);
```


該当タスクのOWNERSHIPをタスク用ロールに設定
```
GRANT OWNERSHIP ON TASK IDENTIFIER($タスク名) TO ROLE IDENTIFIER($タスク用ロール);
```


該当タスクから呼ばれるプロシージャーのOWNERSHIPをタスク用ロールに設定
```
GRANT OWNERSHIP ON PROCEDURE IDENTIFIER($プロシージャー名) TO ROLE IDENTIFIER($タスク用ロール);
```


DBに該当タスクのUSAGE権限付与
```
GRANT USAGE ON TASK DATABASE IDENTIFIER($DB名) TO ROLE IDENTIFIER($タスク用ロール);
```


スキーマに該当タスクのUSAGE権限付与
```
GRANT USAGE ON SCHEMA IDENTIFIER($スキーマ名) TO ROLE IDENTIFIER($タスク用ロール);
```


S3接続用のインテグレーションに該当タスクのUSAGE権限付与
```
GRANT USAGE ON INTEGRATION $インテグレーション名 TO ROLE $タスク用ロール;
```


外部ステージに該当タスクのUSAGE権限付与
```
GRANT USAGE ON STAGE $外部ステージ名 TO ROLE $タスク用ロール;
```


今後追加されるかもしれない外部ステージにも権限付与されるように
```
GRANT USAGE ON FUTURE STAGES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
```


既存テーブルに該当タスクのSELECT／INSERT／UPDATE／DELETE権限付与
```
GRANT SELECT ON ALL TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
GRANT INSERT ON ALL TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
GRANT UPDATE ON ALL TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
GRANT DELETE ON ALL TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
```


今後追加されるかもしれないテーブルにも権限付与されるように
```
GRANT SELECT ON FUTURE TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
GRANT INSERT ON FUTURE TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
GRANT UPDATE ON FUTURE TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
GRANT DELETE ON FUTURE TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
```


既存ダイナミックテーブルに該当タスクのSELECT権限付与
```
GRANT SELECT ON ALL DYNAMIC TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
```


今後追加されるかもしれないテーブルにも権限付与されるように
```
GRANT SELECT ON FUTURE DYNAMIC TABLES IN SCHEMA $スキーマ名 TO ROLE $タスク用ロール;
```


ファイルフォーマットに該当タスクのUSAGE権限付与
```
GRANT USAGE ON FILE FORMAT IDENTIFIER($ファイルフォーマット名) TO ROLE IDENTIFIER($タスク用ロール);
```


# 感想
意外とやらなきゃいけないことが多い。
ちょっと設定してはタスク実行してみて、不足事項を見つけて追加していった。

書いたコードがIDENTITIER～っていうのがあるやつとないやつ混在してしまった。
ITパスポート 主記憶と補助記憶

・記憶装置（メモリ）
プログラムやデータを保存する装置
・揮発性
電源が消えると記憶していた内容が消えてしまう
・不揮発性
電源が消えても記憶していた内容が消えない

・主記憶装置（メインメモリ）
CPUで処理するプログラムやデータを一時的に記憶する装置
・キャッシュメモリ
CPUと主記憶の速度差を吸収するメモリ

・補助記憶装置
プログラムやデータを長期的に記憶する装置
・ハードディスク
磁気を利用してデータを読み書きする記憶装置
・RAID
複数のHDDを連結させ、あたかも一つのHDDのように使用する技術
RAID0
ストライピング（データを複数のHDDに分散）
RAID1
ミラーリング（同一データを同時に複数のHDDに記録）
RAID5
データとパリティを複数のHDDに分散

・光ディスク
レーザ光を使ってデータを読み書きする記憶媒体
CD、DVD、BDなどがある
・フラッシュメモリ
電気的に読み書きを行う装置
USBメモリ、SDカード、SSDなどがある

・アクセス速度と容量
高速、小容量の順に、レジスタ、１次キャッシュ、２次キャッシュ、主記憶、SSD、HDD（レキシスゴクハヤイ）
・レジスタ
CPUに内蔵されている演算処理用の記憶回路
Beginner picoMini 2022 writeup PW Crack 3

## PW Crack 3 (General Skills)

Can you crack the password to get the flag? Download the password checker here and you'll need the encrypted flag and the hash in the same directory too. There are 7 potential passwords with 1 being correct. You can find these by examining the password checker script.

添付ファイル
・level3.py
・level3.flag.txt.enc
・level3.hash.bin

level3.pyの中身を見ると、入力したパスワードをMD5ハッシュ値に直して比較してることが分かる。
```python
def hash_pw(pw_str):
    pw_bytes = bytearray()
    pw_bytes.extend(pw_str.encode())
    m = hashlib.md5()
    m.update(pw_bytes)
    return m.digest()
```
パスワードの候補は７個しかないので、順番に試しても時間はかからない。パスワードは`87ab`であった。
level3.pyを実行して、パスワード87abを入力するとパスワードが得られた。

`picoCTF{m45h_fl1ng1ng_cd6ed2eb}`

level3.pyの中身を少しいじってフラグを取得する方法もある。(パスワード候補が多い場合はこうりつてき)
以下、実行コード。
```python
import hashlib

### THIS FUNCTION WILL NOT HELP YOU FIND THE FLAG --LT ########################
def str_xor(secret, key):
    #extend key to secret length
    new_key = key
    i = 0
    while len(new_key) < len(secret):
        new_key = new_key + key[i]
        i = (i + 1) % len(key)        
    return "".join([chr(ord(secret_c) ^ ord(new_key_c)) for (secret_c,new_key_c) in zip(secret,new_key)])
###############################################################################

flag_enc = open('level3.flag.txt.enc', 'rb').read()
correct_pw_hash = open('level3.hash.bin', 'rb').read()


def hash_pw(pw_str):
    pw_bytes = bytearray()
    pw_bytes.extend(pw_str.encode())
    m = hashlib.md5()
    m.update(pw_bytes)
    return m.digest()


def level_3_pw_check(user_pw):
#    user_pw = input("Please enter correct password for flag: ")
#    user_pw_hash = hash_pw(user_pw)
    
#    if( user_pw_hash == correct_pw_hash ):
        print("Welcome back... your flag, user:")
        decryption = str_xor(flag_enc.decode(), user_pw)
        print(decryption)
        return
        print("That password is incorrect")

# The strings below are 7 possibilities for the correct password. 
#   (Only 1 is correct)
pos_pw_list = ["f09e", "4dcf", "87ab", "dba8", "752e", "3961", "f159"]

for i  in  pos_pw_list:
    if hash_pw(i) == correct_pw_hash:
        a = i

level_3_pw_check(a)
```
VirtualBoxのお引越し

## 環境

Windows10
Oracle VM VirtualBox7.0

## はじめに

仮想マシンをCドライブに作成していたため、容量不足に陥ってしまいました。容量を上げるために、仮想マシンの保存場所をDドライブに移動することにしました。

## 内容

VirualBoxを起動して「ファイル－環境設定」を選択します。一般の「デフォルトの仮想マシンフォルダー」のパスを確認します。このフォルダ一式を、Dドライブの引っ越し先のフォルダにコピーします。

![無題-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/13486ced-810d-4441-a957-ab09ab22762f.png)

仮想マシン－除去を選択します。

![無題1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/19b4c165-6d2c-90ef-21a0-6875d18a0ca8.png)

メッセージが表示されるので「除去」を選択します。除去はVirutalBoxマネージャーの画面から非表示になるだけで、実際にファイルは削除されません。

「すべてのファイルを削除」は選択しないでください。こちらを選択すると本当に削除されます。

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/2940d52b-066f-5289-cd94-c83870176dca.png)

除去を行った後、「仮想マシン－追加」でDドライブ（引っ越し先）のvboxファイルを選択します。すると、VirutalBoxマネージャーの画面に引っ越し先の環境が表示されます。

![無題3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94029/f449cb4f-bf4f-2db9-431f-e025e20dd01e.png)

後は、ゲストOSがちゃんと起動されるか確認を行います。Vagrant環境でもちゃんと起動されます。

Cドライブ（引っ越し元）のファイルはエクスプローラーから削除してOKです。

## 参考

https://macbootcamp.net/virtualbox/virtualbox-hozonsaki-henkou.html
WindowsにおけるC言語の環境構築

# はじめに
本記事では、Windows11においてC言語のプログラムをコンパイルできる環境を構築する。



# 準備: 7zipのインストール
次のサイトから7zipをダウンロードする。

https://www.7-zip.org/

# コンパイラのインストール
次のサイトからgccをダウンロードする。

https://sourceforge.net/projects/mingw-w64/files/

```x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z``` を展開し、```x86_64-8.1.0-release-posix-seh-rt_v6-rev0\mingw64``` フォルダを ```C:\Program Files``` ディレクトリへ移動する。

# 環境変数の設定
Windowsの[環境変数を編集]から次のパスを追加する。
```C:\Program Files\mingw64\bin```

次のコマンドを実行して、パスが登録されているかを確認する。バージョンが出力されると成功である。

```sh
gcc --version
```

C言語のプログラムを実行できるか、確認するために簡単なサンプルコードを次に示す。このプログラムを実行すると、端末に「Hello World」と出力される。

```c: test.c
#include <stdio.h>

void main()
{
    printf("Hello World\n");
}
```

上記のプログラムを実行するコマンドは次の通りである。

```sh
gcc test.c -o test
./test
```

# 参考
https://programsuki.com/devenv-c/#toc2
https://qiita.com/ochx/items/01449d09777187790ee4
ChatGPTでプログラミングコード自体を生成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94360/96282e72-be53-4a97-5196-310613c9e261.png)

今回は薄めの記事です。具体的なことを書くと長文になるので悩みましたが、スクショだけでも見てもらいたいなと思って記事を書くことにしました。上記スクショを見てのとおりで、画面デザインも含めて全てChatGPTで生成してます。

## 経緯

地元の業界仲間が集まるSlackスペース。というか[アジャイル開発が強みの開発会社さん](https://www.google.com/search?q=%E3%82%BC%E3%83%AD%E3%82%A4%E3%83%81%E3%83%8F%E3%83%83%E3%82%AB%E3%83%BC)の社内Slackです。自社Slackを社外の関係者にも開放する形。取引先とかじゃなくて、ITイベントなどで仲良くなった人とかが雑談ベースで集まってる感じです。

> お疲れ様です。WordPressについて少しお聞きしたいのですが、どなたか詳しかったりしますか？
やりたいこととしては、WordPressで構築されたサイトの複数ページの文字情報をcsvでダウンロードしたいです。

generalチャンネルに上記のような投稿がありまして。簡単なスクリプトだったら寝ぼけても書ける自信があったので、相談に乗りましょうか？って軽く返事しました。

すぐにハドルで連絡があって、具体的に確認。

WordPress記事のCSV出力って記事1件につきCSVのレコード1行ってのが普通で、それだったら自分が相談に乗るまでもなく[既存の無料プラグイン](https://www.google.com/search?q=wordpress+csv)で対応できる。最初に試すのはそれかな～と思って、相談主さんに提案。

さっそくCSV変換プラグインを試していただいたところ、データが大きすぎてエクセルで開くことができないらしい。口頭で話を聞いた感じだと、レコード数がかなり多いんだろうなと思いました。だったら分割してあげるといいかな？

外出先から戻ってきました。実際のデータを見てみよう。

まず、CSV変換対象としたいページを見てみました。

```
タイトル：xxxxx
担当者：xxxxx
日時：xxxxx
内容：xxxxx
```

こんな感じで、ページによって違うけど、数百件～何千件くらい、セクションが繰り返される。スクロールバーが縦に長い。

カテゴリー内の記事を件数無制限で表示してるんだろうな～。

・・・と思ったら違いました。DBのレコードを見て分かりましたが、なんとテキスト全てベタ書きです。たぶん問い合わせメールの内容を自動的にアペンドするような仕組みになっている。

どうしよう笑

## どうしたか

これはまあまあ面倒なテキスト整形案件になります。ChatGPTに聞きました。

**「CSVに変換してほしいデータがある。５件ぶん貼りつけるので見てほしい」**

具体的にどう変換するとか全く指示してないのに、あっという間にCSVが生成されました。分かってはいたけど、こういうのはChatGPTが得意とする作業です。

- 意図どおりになってないところは当然あるので、何度か修正指示を繰り返す
- 意図どおりの変換ができていると感じられた時点で、このような変換処理を行うPHPスクリプトの生成を指示
- サーバにスクリプトを転送し、問題なく動作することを確認。ここまで数分しかかかってない
- まだまだ余力があるので、生成したCSVをダウンロードするページの生成も指示
- できたページを確認したところ、デザインがショボい
- スタイリッシュな画面にしてほしいと指示
- 完成

こんな感じ。自分ではプログラミングを全くせずに、10分くらいで完成しました。普通だったらやりとり含めて最短でも一週間くらいかなみたいな案件です。

ChatGPTが生成したコードをプロの目線で見てみましたが、プログラミングの教科書に載ってそうなくらい、バランスよく書かれたコードです。システマチック過ぎず、ベタ書き過ぎず。「最終的には自分で修正したいからリーダブルなコードを生成して」と要望すれば、さらに分かりやすいコードを生成することもできる。

今回は変換スクリプトを生成したけど、わりと近いうちに、テキストデータをまるごと渡して直接変換することもできるようになるかも？ 元請会社がこれくらいのことを自社でやっちゃうようになると、単発のお助け案件の依頼は減りそうです。
IBM i のジョブの状態　活動状態・待機状態・不適格待機状態

[レスポンスタイム：IBM i 内部の処理内訳（待機アカウンティング）](https://qiita.com/gomAnomalocaris/items/31ec130c117cd9b4452e)の続きです。

***サーバー内部のレスポンスタイムは大別して、活動状態の処理時間と待機状態の処理時間の二種類があります。***
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313031313339342f30636635303531642d333964392d643032322d346662302d3639646436383034346264312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5f5f0660-604c-cfb6-c2da-5fef8e27e2fe.png)

***活動状態は実際にプログラムの実行、処理が進んでいる状態ですね。
対して待機状態はプログラム実行、処理は進んでいない状態となります。
待機状態はさらに待機状態と不適格待機状態の二つの形態があります。***

図示すると下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/06500460-67ea-f836-33c5-72fce1f8fa2a.png)

あるトランザクション処理要求がシステムに到達した後、実際に処理されるまでの時間が、待機状態の待ち時間です。活動状態になるとプロセッサーやメモリー、ディスク装置といった資源が使用されます。
活動状態下での処理時間は、以下の2つに分類できます。
＜活動状態の内訳＞
CPU処理時間　　 （キュー内での待ち時間も含む）
ディスク入出力時間（キュー内での待ち時間も含む）

ジョブが待機状態である、とは以下のようなステータスで処理中断された状態を指します。
＜待機状態の内訳＞
不適格状態 　　　（活動レベルを放棄）
短時間待機　　　 （活動レベル内）
拡張短時間待機 （活動レベルを放棄）
オブジェクトの占有の競合（活動レベル内）
オブジェクトやレコードのロックの競合（活動レベルを放棄）


## 3つの状態の説明や遷移についての解説記事はこちら

活動状態・待機状態・不適格待機状態の推移などは、[IBM i アーキテクチャー：実行管理 ジョブ状態の遷移](https://qiita.com/gomAnomalocaris/items/25a97cc81226d3f3d411)　に記載しています。
Raspberry Pi OSでGUIを起動しない

概要：
RaspberryPi OS(Bookworm)では、自動的にGUIが起動設定になっています。
RaspberryPi Zero W 2は、GUIを起動するにはスペックが厳しいため、CLIで起動するように設定します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/eff46b1c-70eb-c899-5814-8d741e391e55.png)


1. **ターミナルを開きます。**

2. **`raspi-config` ツールを開きます。**
   ```bash
   sudo raspi-config
   ```

3. **「System Options」を選択し、その中の「Boot / Auto Login」を選びます。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/4c237cad-5f0f-bdd0-f6fa-6f5edf14b832.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/24b940df-0e23-6db7-f74c-e77d7fc7eaee.png)

4. **ここで「Console」または「Console Autologin」を選択します。設定後、ツールを終了し、変更を保存します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73020/7bbb80fe-b2eb-bbaa-82af-da4b8a146537.png)

5. **システムを再起動して、設定の変更を適用します。**
   ```bash
   sudo reboot
   ```

これで、システムがコンソールモードで起動し、GUIが自動的に起動しないように設定されます。
【Figma Plugins】ユーザー間で同期したくないデータを保存する

## はじめに
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/14779a08-05f0-4d85-07fe-3b9a98b5dcad.png)

FigmaのPluginを開発する際、ユーザー間で同期さたくないデータを保存したいなと思ったことはありますか？
そんな時に使うのが、「**figma.clientStorage API**」です。

この記事では、「**figma.clientStorage API**」について解説しようと思います。

## figma.clientStorage API とは？
**figma.clientStorage API** は、データをユーザーのローカルマシンに保存できます。
ドキュメントに保存されるデータ（[`setPluginData`](https://www.figma.com/plugin-docs/api/properties/nodes-setplugindata/)）とは異なり、ユーザー間で同期されないのが特徴です。

`Window.localStorage API` と似ていますが、`figma.clientStorage API` は、非同期であり、オブジェクト、配列、文字列、数値、ブール値、null、undefined、Uint8Arrayを保存でき、1つのプラグインに1MBのストレージが割り当てられます。

また、ブラウザのキャッシュをクリアするなどのユーザーアクションによって、保存されたデータがクリアされます。

:::note warn
データは、セキュリティのためではなく、安定性のために非公開で保存されています。他のPluginからデータにアクセスすることは防ぎますが、ユーザーが自分のクライアントに保存されているデータを見ることは防げません。
:::

:::note warn
プラグインIDが変更されると、データはアクセスできなくなります。
:::

## figma.clientStorage APIの使い方

### ⚪︎ クライアントストレージに保存したデータを取得する
指定されたkeyの値をクライアント・ストレージから取得します。
そのkeyに対応する値が格納されていない場合、 `undefined` を返します。

```typescript
// getAsync(key: string): Promise<any | undefined>
const value = await figma.clientStorage.getAsync(key)
```

### ⚪︎ クライアントストレージにデータを保存する
指定されたkeyの値をクライアントのストレージに保存します。
保存が失敗した場合は、エラーメッセージを返し、保存は拒否されます。

```typescript
// setAsync(key: string, value: any): Promise<void>
figma.clientStorage.setAsync(key, value)

// エラー処理
figma.clientStorage.setAsync(key, value).chatch((error: string) => { /* エラー処理 */ })
```

### ⚪︎ クライアントストレージに保存したデータを削除する
指定されたkeyに一致する、keyと値両方をクライアントのストレージから削除します。
指定されたkeyに一致するものがなかった場合は、なにも起こりません。

```typescript
// deleteAsync(key: string): Promise<void>
figma.clientStorage.deleteAsync(key)
```

### ⚪︎ クライアントストレージに保存しているすべてのKeyを取得する
クライアント・ストレージに保存されているすべてのキーのリストを取得します。

```typescript
// keysAsync(): Promise<string[]>
const keyList = await figma.clientStorage.keysAsync(key)
```

## まとめ
この記事では、「**figma.clientStorage API**」について解説しました。
**figma.clientStorage API** は、ユーザー間で同期させたくないデータを保存することができる機能です。

特定のアカウントに紐付けたい、データを保存するのに便利です。

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
SQL自分用メモ①

データベースの経験が少ない(もしくはゼロ)の方が入門するためにおすすめの本として紹介されていた
「おうちで学べるデータベースの基本」を読み、そのほかDBに関しての記事を調べて個人的にまとめたもので、自分用のメモとして、アウトプットとして残したいと思います。

この本は実際に自分のPCで確認しながらDBについて学ぶことができるため理解深まりやすいかと思いました。

## データベースとは
情報の集合や表の集まりと捉えるとわかりやすいかと思われます。
歴史的背景として始まりはアドレス帳です。
膨大な量のデータ、情報の中から条件を指定して構造化したり抽出する。
データの「追加、読込、更新、削除、検索、分析」などの処理を目的として蓄積された情報のことです。

また、後述するDBMSとはデータベース管理システムでデータベースを構築するなど扱うことのできるソフトウェアのことだが同一視されることがある。

## データベースの種類5つ
階層型データベース
リレーショナルデータベース
オブジェクト指向データベース
XMLデータベース
NoSQLデータベース

## RDB（リレーショナルデータベース）とNoSQLデータベース
RDBは、テーブル形式でデータを整理し、SQL（Structured Query Language）を使用してデータを操作します。最も一般的な例はMySQLやPostgreSQLなどです。
MySQLやPostgreSQLなどデータベースソフトごとにSQLの文法は多少違っていたりします（「方言」と表現されます）。柔軟で複雑なデータの検索、処理などが行えるが負荷がかかると速度が遅くなるというメリットデメリットがあります。

一方、NoSQLデータベースは、スキーマレスであり、柔軟なデータモデルを提供します。これにはドキュメント指向（MongoDBなど）、キーバリューストア（Redisなど）、カラムファミリー（Cassandraなど）などが含まれます。NoSQLは大量のデータや非構造化データの処理に適しており、スケーラビリティと高速処理が求められる場合によく使用されます。データの独立性・一貫性が保証されないことがデメリットです。

## DBMS（Data Base Management System）とは
データベース管理システムの意で、データベースを管理、運用するためのソフトウェア

代表的なDBSMは
1.Oracle Database.
2.MySQL.
3.Microsoft SQL Server.
4.PostgreSQL.
5.MongoDB.
6.IBM Db2.

## SQL（エスキューエル：Structured Query Language）について
直訳すると「問い合わせのための構造化言語」となるかと思います。
SQLとは膨大なデータ（表）を効率よく管理できるツールです。

データベースに対する基本操作は、主に下記4つです。

- データの抽出（Create）
- データの追加（Read）
- データの更新（Update）
- データの削除（Delete）

それぞれの操作の頭文字をとって「CRUD（クラッド）」と呼ばれてます。
どの操作をする場合も、SQLで命令を記述する必要があります。

また管理コマンド（SQL以外のDBMSに対して実行するコマンド：造語）というものがあり

①DBMSはSQL文以外にも「管理コマンド」を用意している
②「管理コマンド」の種類や文法は、DBMSによって異なる

SQL文は必ずSELECT INSERT DELETE UPDATE のいずれかの単語から始まる。
それ以外の単語から始まったら管理コマンドである。

## 階層について
最上位がインスタンス（サーバなど）
階層は上から順にインスタンス→データベース→スキーマ→オブジェクトである。
階層構造になっているが3層派（Oracle / MySQL）と
4層派（SQL Server / PostgreSQL）と2派になっている。

3層はデータベースとスキーマの階層を実質的に省略している。
こういった違いにより慣れているDBでそうではないDBを操作した場合に
どこの階層にいるのかわからなくなることもある。

## 「*」「;」「’」などの記号の意味

* 「* （アスタリスク）」は、「すべて」という意味。
SELECT文のカラムに「*」を指定すると、すべての行を取得するという意味になります。
さまざまなOSやソフトウェアでも同様の使われ方をすることがあります。*

* 「;（セミコロン）」は、SQL一文の終わりを意味。
必ずSQL文の最後につけるようにする。
単一のSQL文では無くても動くことがあるが、
「 ; (セミコロン)」が無いとエラーになる場合があります。

* 「’（シングルコーテーション）」は、SQLのINSERT文やUPDATE文に指定する値、またはWHERE句の条件に指定する値は、型を意識する必要があります。
文字列や日付型を指定する場合は、対象の値を「’」で指定する必要があります。
「’」を文字列の中で扱いたい場合は「’’」と「’」を2回続けて囲う。

例「I'm」や「彼は’〇〇’と言った」などは「I’’m」、「彼は’’〇〇’’と言った」

## 参考文献

https://amzn.asia/d/1lJX50B

https://zenn.dev/umi_mori/books/331c0c9ef9e5f0/viewer/992632

https://www.sejuku.net/blog/140805

https://zenn.dev/ttskch/articles/4c1612a99b1459

## 今後読みたい本
下記2冊を購入したので読みます。
達人に学ぶDB設計 徹底指南書
達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ

データベースに関しては下記に記載されている本を読みたいです。
データベースを勉強したいあなたに送る技術書17冊(+11冊1講義7link)
https://zenn.dev/levtech/articles/9ab9eea13a826d
Qiita記法　マークダウン法　活用術①

今朝偶然にも、


<img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/4e35b63a-be50-a7f4-b010-8333bd3a1534.jpeg">

[/]のキーを押したら


![スクリーンショット 2024-06-11 090019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/7e985f69-de18-9220-de82-63d8f9e23db7.png)

上記メニューがでてきた。
これは前からあったんでしょうか？

知らなかった！！！


@shiracamus
(しらかみゅ)
ありがとうございます！

>https://qiita.com/Qiita/items/c686397e4a0f4f11683d

参考にします
地味に嬉しいMakefile

# はじめに
こんにちは、H×Hのセンリツ大好きエンジニアです。（同担OKです😉）
今回は、個人的に開発していて楽になるMakefileの紹介です！
開発効率を少しでも上げたい方にはオススメです！

# Makefileとは？
簡単に言うと、コマンドを自由に作れる設定ファイルです。
コマンドを実行したい場所にMakefileを作成することで、使えるようになります。
（自分の場合はプロジェクトの直下に置いてます、フロントエンドとバックエンドのコマンドもまとめているので）

細かいルールは省略しますが、例えばDocker Composeを使っていて全てのコンテナをビルド、起動したいときは以下のように書けます。

``` makefile
.PHONY: build
build:
	docker compose build --no-cache

.PHONY: up
up:
	docker compose up
```

任意のコマンド名と一緒に、どのようなコマンドを実行させるか記述するだけで簡単に動くんですねえ。。。楽ちんですね🤩

また、Makefileで設定したコマンドは、以下のように`make`を付けると実行できます。
``` zsh
$ make build
$ make up
```

これを設定するだけで、色々なコマンドが簡単に実行できちゃうんですね！
個人的には、DBコンテナに直接入りたい時に以下のコマンドを設定して楽したりしております🫣

``` makefile
include .env

mysql-container: up-mysql
	docker compose exec ${MYSQL_CONTAINER} mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} ${MYSQL_DATABASE}

postgresql-container: up-postgresql
	docker compose exec ${POSTGRESQL_CONTAINER} sh -c "PGPASSWORD=${POSTGRES_PASSWORD} psql -U ${POSTGRES_USER} -d ${POSTGRES_DATABASE}"
```
このように、先頭に`include .env`を付けることで、同階層の.envファイルから環境変数を勝手に読み取ってくれるんです！
なのでここで新たに再定義する手間も掛かりません！

# おわりに
少しでも開発効率を上げたい方にとって、コマンド一発で求める挙動が実現できるって素晴らしいと思いませんか？😉
今回ご紹介したコマンド以上に複雑なコマンドでも使用できるので、この機会に是非触っていただければと思います！

最後までご覧いただきありがとうございました！
センリツでした🤓
Storybook学んでみた②

# はじめに
初めまして！
エンジニアになって数年、今まで本を読むだけでしたが、もっとプライベートで楽しみながら成長したい！自分が学んだ足跡を残していきたい！と思い記事を書きました！
最終的には自在に開発できるようになりたいと思っています。:triumph:
いろいろな記事を参考にさせてもらっています。:bow_tone2:

**「いいね」か「ブックマーク」**
を頂けると僕のモチベーションアップになります！:thumbsup:
少しでも気に入っていただけたらよろしくお願いいたします！:thumbsup:


# 今回の目的
自分の作ったコンポーネントを確認したり検証するための技術を身に付けたい！
公式のクイックスタートを参考に進めていきます。
項目ごとに補足のみ書いて進めています。わかりづらいところの理解の手助けになれば幸いです！


# 主に参考にさせていただいた記事
https://storybook.js.org/tutorials/intro-to-storybook/react/en/get-started/

# バージョン
React-18.2
Storybook-8.1.4

# 前回
https://qiita.com/mr_noppo/items/35648847aa5f1e01e09c

# Composite component
## Tasklist
黙々と作成・・・

# Wire in data
Reduxなど、データストアを確認するといった連携は単純にはできないので、storiesファイルでReduxを用意し作成する。
```jsx
const Mockstore = ({ taskboxState, children }) => (
  <Provider
    store=...
  >
    {children}
  </Provider>
);
};
```
テストケースにラップするdecoratorsを記述する。
```jsx
export const Default = {
  decorators: [
    (story) => <Mockstore taskboxState={MockedState}>{story()}</Mockstore>,
  ],
};
```

export defaultにMockedStateコンポーネントを除外することを記述すると、StoryBookに表示されなくなる。
ちなみにdecoratorsは、すべてのStoryにスタイルをラップする
```jsx
export default {
  decorators: [(story) => <div style={{ margin: '3rem' }}>{story()}</div>],
  excludeStories: /.*MockedState$/,
};
```

# Construct a screen
msw(Mock Service Worker)を使用して、モックデータを返してくれるAPIを作成する。

```bash
npm install msw --save-dev
npx msw init public/ --save
```

storyのpreviewファイルでimport
```jsx
import { initialize, mswLoader } from 'msw-storybook-addon';
```

mswの初期化
```jsx
initialize();
```

storybookでモックしたAPIリクエストを利用できるようにする記述
```jsx
loaders: [mswLoader],
```

モックデータで正常画面とエラー画面の動作を確認しましょう。

# 次
Interaction tests
【Oracle】SQLの単体テスト観点

## 【Oracle】SQLの単体テスト観点

### この記事でわかる・できること

- SQLの単体テスト観点

### この記事の対象者

- OracleでSQLを書く人全般

### 動作環境・使用するツールや言語

- Windows 10 Pro 22H2
- Oracle 12cR2 Enterprise Edition

### はじめに

SQLは一般的なプログラム言語と比べて何をテストすればいいのか迷いがちです。
一般的なプログラム言語はフローを確認して条件分岐をテストしたり関数やメソッドの入出力をテストするわけですが、例えば巨大な一つのSELECT文が出てきた時、何をどうテストすればいいのか？というのは確立された方法論があるわけではありません。
しかし実際にバグの原因がSQLであることは非常に多いので、テストが重要であることは言わずもがなです。
これが正解というわけでもないし全て実施しなければならないわけでもありませんが、テスト観点を考える上で一助となれば幸いです。

### 前提
一般的に単体テストでは、モジュール単位で、ある入力に対して期待される出力がされることをテストします。
モジュールというのはここでは１つのSQL文でもいいし複数のSQL文をひとまとめにしたファイル単位・機能単位でもいいです。
ある入力とは多くの場合はDBに保管されている既存のレコードであり、その他ユーザの入力や前段のSQLやAPの出力結果などを含みます。
出力とはSELECT文の結果でありUPDATE,DELETE,INSERTなどによりDBに格納されるレコードです。広い意味では実行時間、ロック、容量の増加、メモリへの影響なども一種の出力だと言えるでしょう。
「期待される出力」が何であるかは要するに正しい挙動が何であるか、ということです。一般的なプログラム言語と同様です。設計や要件なのでここが間違っていると前提がひっくり返ってしまいますが、テストの過程で考慮漏れを発見することもあるので必要に応じてひっくり返してください。

### テスト観点
#### 出力結果の行に対して過不足がないこと
最も基本的な観点です。
SELECT文であれば取得したいデータが過不足なく取得できていること、UPDATE,DELETE,INSERT文であれば修正したいデータが過不足なく修正できていることを確認します。
連動して他のテーブルを修正する必要があることもあります。必ずしも親子関係があるとは限りません。（どのテーブルをどのように修正するかは本来設計段階で決めるべき内容です）
取得・修正したデータが正しいこと、および取得・修正しなかったデータが正しいことを確認する必要があります。
後者は観点から漏れやすいので注意してください。

#### 出力結果の列の値が正しいこと
上記は行に対しての確認ですが、DELETE以外では列の値が正しく取得・修正できていることを確認する必要があります。
前後比較しましょう。

##### WHERE・HAVING句、CASE式／文、COALESCE・DECODE関数による分岐
CASEやCOALESCEはそのままですが、WHEREやHAVINGは条件に入るか入らないかの分岐という考え方です。
特に日付関連は月の日数、うるう年、時刻データの有無、書式設定、暗黙の型変換、現在日付など複雑になりやすいので注意が必要です。

##### NULL値
NULLは特殊な値なのでSQLでは注意する必要があります。
テーブルをLEFT JOINした時に発生するNULLも場合によってはテストケースに入れた方がいいかもしれません。
例えばテーブルAとテーブルBをLEFT JOINしてBの列の値がX以外のものを抽出する時、列<>'X'とするとNULLの行は出ないので列<>'X' OR 列 IS NULLのようにしなければなりません。
画面上でNULLが入らないように制御しているとしても、想定外のバグで入ってくるということはよくあるので過信は禁物です。
いわゆる異常系のテストとして必要です。

##### 業務上のデータパターン（論理削除や更新中など状態遷移を考慮する）
最も注意すべきパターンです。
パターン数が多い場合はどのケースではどう処理するのか整理しましょう。
これらのパターンは既存のデータに存在するならそれをテストケースにし、存在しなければテストデータとして登録します。
可能であれば既存のデータは全件テストすることが望ましいです。
昔の仕様で作成された、現在の仕様では発生し得ないようなデータが残っていて想定外の挙動をするというケースもあります。

#### パフォーマンス
実行速度については別途負荷試験を実施した方がよいですが、単体レベルでも遅くならないようにすべきです。
レコード、統計情報、インスタンスの設定、ハードウェアなど出来る限り本番環境に近い状況にした上で実行速度を測定しましょう。
キャッシュに乗るかどうかで大きく速度が変動する可能性があるので、キャッシュはクリアして測定した方がいいです。
```SQL:
ALTER SYSTEM FLUSH BUFFER_CACHE;
ALTER SYSTEM FLUSH SHARED_POOL;
```
インスタンス全体に影響するので実行時はご注意ください。
また、Oracleでは同じSQLを何度か実行すると実行計画を改善させようとする機能がありますが、場合によっては極端に遅くなることがあります。
念のため何度か続けて実行してみましょう。

#### 過去の不具合パターン
過去に発生した不具合のうち、「これを単体テストの観点に盛り込んでいれば防げた」というものがあります。
ある程度分析してみると頻発するパターンが見えてくることもあります。
このようなパターンは観点として盛り込んでおくといいでしょう。
（実際このページで記載したパターンも経験上頻発しているパターンです）
ただしチェックリストやマニュアルにして全て盛り込むと肥大化・形骸化を招くので、必要に応じて参照できるようにナレッジ化しておくといいでしょう。横展開してチーム間でも共有できます。これは単体テストに限ったことではありません。
最近気になったトピック

前回から大分時間が空いてしまいましたが、ブックマークの供養を久しぶりにやります。

## マネジメントに必要なのは胆力や
https://note.com/usakurai/n/ncabae56df7b6

これは本当にそう思うという内容だった
特に下記の部分：

> あなたがなりたい姿のマネージャーと一緒に働くか、経験豊富なマネージャから学ぶ機会を持って、セルフフィードバックサイクルを続ければできるようになります

これは裏を返せば優秀なマネージャーと働いたり、ベストプラクティスを色んなところから仕入れて適用していくようなことをしないと優秀なマネージャーにはなれないんじゃないかなーとも思う

## 高いインパクトを起こすマネージャーの25の小さな習慣
https://x.com/iwashi86/status/1799586020247347583

元記事
https://review.firstround.com/the-25-micro-habits-of-high-impact-managers/

この辺を全て実践できたらレバレッジが効くしそりゃインパクト大きいよなぁという感じがする
（今はマネージャーではないけど、少し実践できているものもあるな...）

## PHPのループ処理を強化するKoriym.Loop
https://qiita.com/koriym/items/69f884e23b60c9c72aed

Bladeで使える便利メソッドを生やすライブラリっぽい
とても便利そうだけどオーバーヘッドとか大丈夫なんだろうか？とちょっと気になった

## Feature Flag Deep Dive
https://speakerdeck.com/biwashi/feature-flag-deep-dive

ここ最近何かと話題な感があるデプロイとリリースの分離に関わる話。
今の会社だとリリーストグルに近いことはやっているなーと思いつつ、マイグレーションがあると切り戻し大変なのはどう制御するんだろうというのは気になっている（けどそれはこの話題の主要なトピックではないとも思う）

## DoingよりDoneに注目する
https://at-blog.vercel.app/blog/20240606-focus-on-done-over-doing/

とてもいい視点だと思った。
逆に完了したことだけにフォーカスすることで、「やってます」が「終わってません」と同義であることが明確化される
そうすることでタスクの分解の粒度を気にしたり、確実にDoneするために完了の定義をするという意識が強まるのではないかなーとも思う

## 正体不明なものと対峙する恐怖から逃れるための唯一の方法は、“学ぶ”こと
https://storyweb.jp/lifestyle/410318/

なぜ学習が大事なのかが言語化されていてとてもよかった
Azure マスターへの道 ~Azure Virtual Machines~

# はじめに

こんにちは、エンジニアのkeitaMaxです。

Azure初心者がAzureマスターを目指してAzureのLearnなどを進めていくための備忘録として書いています。

今回はLearnの「**Azure コンピューティングおよびネットワーク サービスについて説明する**」をやっていきます。

https://learn.microsoft.com/ja-jp/training/modules/describe-azure-compute-networking-services/

# **Azure Virtual Machines について**

**Azure Virtual Machines を使用すると、クラウド上でVMを作成して使用することができます。**

# **仮想マシン スケール セット**

同一の負荷分散された VM のグループを作成することができます。

メリットとして、複数の VM の作成と管理が容易であったり、自動スケーリングができることと書かれていました。

# **仮想マシン可用性セット**

回復性と可用性の高い環境を構築するのに役立つツールのことです。

一回の障害ですべてのVMが失われないために、VMの更新が重ならないようにしたり、様々な電源やねんとワーク接続を備えています。

可用性セットは、VM を更新ドメインと障害ドメインの 2 つのグループ化で行ているらしいです。

 更新ドメイン : 同時に再起動できるVMをグループ化します。

 障害ドメイン : 共通の電源とネットワークスイッチによって VM をグループ化します。

# VMを使用する例

VMを使用する例として以下の4つが記載されていました。

- テストと開発
- クラウドでのアプリケーション実行
- データセンタをクラウドに拡張
- ディザスターリカバリー


# 実践課題

## Linux 仮想マシンを作成し、Nginx をインストールする

Learnにある通り、以下のコマンドをCloud Shellで実行し、VMを作成しました。
```
az vm create 
    --resource-group "learn-e23a2bf3-8b3b-49f2-8bb4-d35fed7b72f2"
    --name my-vm 
    --public-ip-sku Standard 
    --image Ubuntu2204
    --admin-username azureuser
    --generate-ssh-keys
```
このコマンドの意味としては調べたところ以下のような意味らしいです。
#### `--resource-group "learn-e23a2bf3-8b3b-49f2-8bb4-d35fed7b72f2"`
リソースグループを`learn-e23a2bf3-8b3b-49f2-8bb4-d35fed7b72f2`
（リソースグループは、複数のリソースを管理するための仕組みのことのようです。）
#### `--name my-vm`
VMの名前を`my-vm`
#### `-public-ip-sku Standard`
パブリックIPのSKUはスタンダードに設定する
(SKUは契約プランのことのようです。)
####  `--image Ubuntu2204`
OSイメージを`Ubuntu2204`に設定する
#### `--admin-username azureuser`
管理者ユーザの名前を`azureuser`
#### `--generate-ssh-keys`
vSSHキーを生成する

## VM 上に Nginx をインストールする

Learnにある通り、以下のコマンドをCloud Shellで実行し、VM上にNginxをインストールしました。

```
az vm extension set
    --resource-group "learn-e23a2bf3-8b3b-49f2-8bb4-d35fed7b72f2"
    --vm-name my-vm
    --name customScript
    --publisher Microsoft.Azure.Extensions
    --version 2.1
    --settings '{"fileUris":["https://raw.githubusercontent.com/MicrosoftDocs/mslearn-welcome-to-azure/master/configure-nginx.sh"]}'
    --protected-settings '{"commandToExecute": "./configure-nginx.sh"}'
```

これで用意されているAzureのLearnは完了しました。

# おわりに

いままでVMはなんとなく使用していたのですが、全然知らなかったなと感じました。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！

# まとめ
Beginner picoMini 2022 writeup Serpentine

## Serpentine (General Skills)

Find the flag in the Python script!

添付ファイル
・serpentine.py

問題文から察するにコードを見れば良い。おそらく以下のコード部分を実行すればフラグが出てくるはず。
```python
def str_xor(secret, key):
    #extend key to secret length
    new_key = key
    i = 0
    while len(new_key) < len(secret):
        new_key = new_key + key[i]
        i = (i + 1) % len(key)        
    return "".join([chr(ord(secret_c) ^ ord(new_key_c)) for (secret_c,new_key_c) in zip(secret,new_key)])


flag_enc = chr(0x15) + chr(0x07) + chr(0x08) + chr(0x06) + chr(0x27) + chr(0x21) + chr(0x23) + chr(0x15) + chr(0x5c) + chr(0x01) + chr(0x57) + chr(0x2a) + chr(0x17) + chr(0x5e) + chr(0x5f) + chr(0x0d) + chr(0x3b) + chr(0x19) + chr(0x56) + chr(0x5b) + chr(0x5e) + chr(0x36) + chr(0x53) + chr(0x07) + chr(0x51) + chr(0x18) + chr(0x58) + chr(0x05) + chr(0x57) + chr(0x11) + chr(0x3a) + chr(0x56) + chr(0x0e) + chr(0x5d) + chr(0x53) + chr(0x11) + chr(0x54) + chr(0x5c) + chr(0x53) + chr(0x14)


def print_flag():
  flag = str_xor(flag_enc, 'enkidu')
  print(flag)
```
以下、実行コード。
```python
def str_xor(secret, key):
    #extend key to secret length
    new_key = key
    i = 0
    while len(new_key) < len(secret):
        new_key = new_key + key[i]
        i = (i + 1) % len(key)        
    return "".join([chr(ord(secret_c) ^ ord(new_key_c)) for (secret_c,new_key_c) in zip(secret,new_key)])

flag_enc = chr(0x15) + chr(0x07) + chr(0x08) + chr(0x06) + chr(0x27) + chr(0x21) + chr(0x23) + chr(0x15) + chr(0x5c) + chr(0x01) + chr(0x57) + chr(0x2a) + chr(0x17) + chr(0x5e) + chr(0x5f) + chr(0x0d) + chr(0x3b) + chr(0x19) + chr(0x56) + chr(0x5b) + chr(0x5e) + chr(0x36) + chr(0x53) + chr(0x07) + chr(0x51) + chr(0x18) + chr(0x58) + chr(0x05) + chr(0x57) + chr(0x11) + chr(0x3a) + chr(0x56) + chr(0x0e) + chr(0x5d) + chr(0x53) + chr(0x11) + chr(0x54) + chr(0x5c) + chr(0x53) + chr(0x14)

flag = str_xor(flag_enc, 'enkidu')
print(flag)
```
実行するとフラグが得られた。

`picoCTF{7h3_r04d_l355_7r4v3l3d_8e47d128}`
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（3/100）

【3日目】 
トピック1：SAPS/4HANAサプライチェーン計画の概要（3/6）

≪問題3≫
生産計画を達成するために、計画手配から作業を差立てる際に使用するのは何ですか。
▢能力所要量計画（CRP）
▢需要計画（DP）
▢資材所要量計画（MRP）
▢需給連鎖計画（SNP）

≪解答≫
█能力所要量計画（CRP）
▢需要計画（DP）
▢資材所要量計画（MRP）
▢需給連鎖計画（SNP）

≪解説≫
◆能力所要量計画（CRP）および拡張生産計画/詳細計画（PP/DS）のツールと方法を使用することで、能力評価と負荷平準化を行うことができます。
◆能力所要量計画では、作業区における指図作業の所要量がどれくらいの時間を要するかを指定します。以下の活動を通じて、能力計画のプロセスが決定されます。
（1）作業区の利用可能能力の定義（マスタデータ更新）
（2）指図内の作業の能力所要量の計算
（3）能力評価：利用可能能力と能力所要量の比較
（4）負荷平準化：特定の時間に対する利用可能能力を保証した作業区への作業の差立
pre-commitが終わらないのでcommitができなかった

# 起こったこと

```bash
git commit -m "hogehoge"
> No tests found related to files changed since last commit.
```

git commitを実行すると上記のメッセージが出たまま動かなくなってしまいました。

# ファイル

```./husky/pre-commit
CI=true yarn test -o
```

```package.json: package.json一部抜粋
"scripts": {
  "test": "jest --watch"
}
```

# 原因

pre-commitでのテストにウォッチモードを使ったことが原因でした。
`--watch`を削除することでpre-commitはちゃんと終わってくれました。

ウォッチモードはファイルの変更を監視し続けるので、いつまで経ってもフックが終わらない状況に陥っていたようです。

# 修正

```./husky/pre-commit
CI=true yarn test:pre-commit -o
```

```package.json: package.json一部抜粋
"scripts": {
  "test": "jest --watch",
  "test:pre-commit": "jest"
}
```

package.jsonに`test:pre-commit`を追加しました。
開発途中にテストを実行する際は、watchモードを使いたいので、`--watch`を削除するのではなくpre-commit用のコマンドを用意することにしました。

これで、pre-commitが終わるようになりました。
テストが成功すればちゃんとcommitできます。

# 最後に

pre-commitのせいでcommitができなくなるところでした。
便利な道具でも使い手が悪いと真価を発揮できないですね。
AWS SAPを更新、3年前初心者で取得した時と今の感想と勉強方法

# 内容
3年ほど前にAWS SAPを取得。更新期限が迫っていたため、更新を行いました。その時の記事は下記になります。

https://qiita.com/infra365/items/b9f005ed86475524c88f

# 勉強時間とスコア
* 勉強時間：8時間位
* スコア：790(合格点は750)

# 勉強方法
下記参考書を1周する。試験の要点として下記が重要だと感じた。
[AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト – プロフェッショナル　改訂第2版](https://www.sbcr.jp/product/4815617929/)


* 要件を理解する
問題によって何を求められているか考える。コストを優先するか、可用性を優先するか、リードタイムを優先するかなど。実現可能な構成は複数存在するが、要件によって最適な答えが異なるため。

* ベストの方法を考える
EC2やスクリプトでやるのではなくマネージドサービスを使用する、手動ではなく自動化をするなど。

* そのサービスで実現可能か考える
例えば連携出来ないサービス同士が連携されていないか、リージョンリソースなのにグローバルリソースのような使用方法となっていないかなど。

# 感想
3年前はAWSを勉強し始めたころで、結構な時間をかけてBlackBelt、問題集をやって挑みましたが、正直理解出来ていない部分も多かったです。現在は業務で日々AWSを触っているため、問題文を見ても、実際に構築したことがある構成であったりと理解がしやすかったです。問題文も回答文も文字だけのため、そこからどういった手順でどういったものが作られるかをイメージするのは実機操作が一番だと思いました。
Java memo

~~~Java
public class MainServiceTest {
    private SubService subService;
    private MainService mainService;

    @BeforeEach
    public void setUp() {
        subService = Mockito.mock(SubService.class);
        mainService = new MainService(subService);
    }

    @Test
    public void testExecuteCallsPerformActionTwiceWithDifferentReturnValues() {
        // 1回目の呼び出しは0を返し、2回目の呼び出しは1を返すように設定
        when(subService.performAction()).thenReturn(0).thenReturn(1);

        int[] results = mainService.execute();

        assertEquals(0, results[0]);
        assertEquals(1, results[1]);

        verify(subService, times(2)).performAction();
    }
}
~~~
Bash で Welcome to AtCoder を解いてみた

[Qiita Engineer Festa 2024（キータ・エンジニア・フェスタ 2024） - Qiita](https://qiita.com/official-campaigns/engineer-festa/2024)
において、約1ヶ月で38記事という大量の記事の投稿を要求されることがわかった。
そこで、あまりコストをかけずに記事数を稼ぐ方法を考えた結果、「Welcome to AtCoder を様々な言語で解く」ことを思いついた。
単に解くだけでなく、使用する言語仕様の解説を入れれば、記事として一応成立するだろう。

# Welcome to AtCoder

[PracticeA - Welcome to AtCoder](https://atcoder.jp/contests/abs/tasks/practice_1)

Welcome to AtCoder では、以下の形式で整数 $a$, $b$, $c$ および文字列 $s$ が入力として与えられる。

```text
a
b c
s
```

この入力をもとに、与えられた整数の和 $sum = a + b + c$ および文字列 $s$ を、以下の形式で出力することが求められる。

```text
sum s
```

# 今回使用する Bash のコマンド

## 入力

[read コマンド – 標準入力から変数に代入する | Linuxコマンド.NET](https://linuxcommand.net/read/)

`read` コマンドを用いると、標準入力から1行読んで指定した変数に代入できる。

```bash
read a
```

複数の変数を指定すると、入力の行をフィールドに分割し、それぞれの変数に代入できる。

```bash
read b c
```

変数を指定しない場合、変数 `REPLY` に代入する。

```bash
read
```

## 演算

[Linux: bashシェルにおいて数値計算を行ういくつかの方法 #Bash - Qiita](https://qiita.com/frozencatpisces/items/c2872781ef9cbfb1b8fb)

`let` コマンドを用いると、式の計算を行い、結果を変数に代入できる。

```bash
let sum=a+b+c
```

## 出力

[echoコマンドの詳細まとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-echo)

`echo` コマンドを用いると、文字列を出力できる。
`"` で囲んだ文字列の中に `$` に続いて変数名を書くと、その変数の内容をその位置に展開できる。

```bash
echo "$sum $REPLY"
```

# 提出コード

```bash
read a
read b c
read
let sum=a+b+c
echo "$sum $REPLY"
```

[提出 #54440799 - AtCoder Beginners Selection](https://atcoder.jp/contests/abs/submissions/54440799)
Azure AI Fundamentals(AI-900)の学習

# 画像分類
画像内の物体などを特定のカテゴリに割り当てること

## 画像分類のプロセス
1. データ収集
1. 前処理
1. 特徴抽出
1. モデルの訓練
1. 評価とチューニング
1. 予測

## 適用例
- MRI画像から腫瘍を見つける
- 農地の画像から病害虫を見つける

# 物体検出
画像または動画内の特定の物体を識別子、その位置をバウンディングボックスで囲むプロセス

## 物体検出の手順
1. データ収集と前処理
1. ラベリング
1. モデルの選択と訓練
1. ハイパーパラメータのチューニング
1. 評価と最適化

## 具体例
- 店舗のカメラを利用し、棚からの商品の取り出しや在庫の変動を検出する
- 自動運転において周囲の車両や信号機などを検出する
- スポーツにおいて選手やボールの位置や動きを追跡し、パフォーマンス分析に役立てる

# OCR(光学文字認識)
画像や文書内の文字をテキストデータに変換する技術
機械学習の考え方をAI OCRと呼ぶこともある

## 具体例
- 文書のデジタル化

# 自然言語処理
人間が日常的に使っている自然言語をコンピューターに処理させる一連の技術

## 流れ
1. 前処理
1. 形態素解析
1. 単語の統一、正規化
1. ストップワードの除去
1. 特徴量への変換
1. ベクトルでの表現

## キーフレーズ抽出
テキストから重要なフレーズやキーワードを自動的に特定し、抽出するプロセス

## 固有表現抽出
テキストから特定のカテゴリに属する名前や用語を識別子、抽出するプロセス

## 感情分析
テキストデータから感情や意見を識別し、分類する

## 具体例
- ソーシャルメディア分析
- 市場調査
- 政治分析
- 顧客サービス

## 言語モデル
言語の構造を数学的にモデリングする処方であり、単語、フレーズ、分などの言語単位が連続する確率を推定し、言語のパターンを学習する

## 音声認識
音声を認識してテキストに変換する技術

## 音声合成
書かれたテキストを人間の音声に変換する技術

### 具体例
- スマホでの音声アシスタント
- オーディオブック
- カーナビゲーション
- 視覚障碍者向けの読み上げ

## 翻訳
ある言語の言葉を違う言語にする

# 責任あるAIの基本原則
- 公平性
- 包括性
- 信頼性と安全性
- プライバシーとセキュリティ
- 透明性
- アカウンタビリティ

## 公平性・包括性
### 公平性
利用者や顧客に対して偏りや差別を引き起こさないように配慮してAIシステムの開発・運用を行う

多様な人種や年齢層の顔データを使用することで特定のグループに対するご認識のリスクを減らす

### 包括性
様々な背景を持つユーザー（障害を持つユーザーや多様な文化的、言語的背景を持つユーザー）が利用できるAIシステムを設計、開発する
反対の意味の言葉：個別性

#### 公平性と包括性の対比
公平性は開発・運用にフォーカス
包括性は設計・開発にフォーカス

## プライバシーとセキュリティ
### プライバシー
他人の干渉を許さない、各個人の私生活上の自由

ユーザーデータを収集、処理、保存する際の透明性と同意

### セキュリティ
情報の機密性、完全性、可用性

AIシステムは利用者や顧客のプライバシーを尊重し、個人情報は適切に管理される必要がある

## 信頼性と安全性
### 信頼性
システムが予期される条件下で正確かつ一貫して機能する

#### 具体例
- オンライン決済
- データベース
- ヘルスケアモニタリング
- 自動運転

### 安全性
システムが潜在的なリスクや危険からユーザーを保護する

#### 具体例
- ブラウザのセキュリティ
- 自動車の安全システム
- サーバーセキュリティソフト
- 電子商取引の不正検出
- スマートホームの安全性

## 透明性
AIシステムの意思決定プロセスをユーザーや関係者が理解しやすく、AIシステムの採用や適用に信頼を持てる

### 具体例
- 金融サービスでのクレジットスコア
- 医療診断でのAI活用

## アカウンタビリティ
AIシステムがどのように動作するかを説明し、結果や影響に対して責任を持つ

### 具体例
- 自動運転における事故発生時の責任の所在

#### 透明性とアカウンタビリティの対比
透明性はアカウンタビリティを支える要素
透明性はAIシステムの動作の理解と信頼の構築に重点を置いている
アカウンタビリティは責任の所在を明確にすることに重点を置いている
JSONとajaxについてざっくりまとめてみた【初心者向け】

## はじめに

バックエンドエンジニア2年生なのですが、最近JSONとAjaxについて深く知らないことに気付きました。

そこで、この記事では自分なりに調べて、JSONとAjaxについて簡単にまとめてみました。それぞれの基本的な概念から実際の使用例までを紹介します。

## JSONとは？

JSONは、**データを表現するための軽量で人間が読み書きしやすいフォーマット**です。JavaScriptのオブジェクト記法に基づいており、キーと値のペアからなるデータ構造を持ちます。これにより、異なるプログラム間でデータを簡単に交換することができます。

例えば、以下のようなJSONデータがあります：

```javascript:json
{
  "name": "John Doe",
  "age": 30,
  "city": "Tokyo"
}
```

JSONはWebアプリケーション間でデータを交換する際に広く使われています。

## Ajaxとは？

Ajaxは、**Webページを再読み込みすることなく非同期でサーバーとデータをやり取りするための技術**です。

主にJavaScriptとXMLHttpRequestオブジェクト（またはfetch API）を使用して実現されます。

Ajaxを使うことで、ユーザーがページの操作をする際に、バックグラウンドでデータを取得・送信することが可能です。

## JSONとAjaxの関係

JSONとAjaxは密接に関連しています。Ajaxを使用することで、サーバーから返されたデータをJSON形式で取得することが一般的です。

JSONは、その軽量さと扱いやすさから、Ajaxを介してデータを受け渡す際の標準的なデータフォーマットとして広く利用されています。

具体的には、Ajaxを使ってリクエストを送信し、サーバーからJSON形式でデータを受け取り、それをJavaScriptで処理してWebページの動的な更新を実現します。

## Ajaxの動作フロー

1. **ユーザーの操作:** ユーザーがWebページ上で操作を行います（例: ボタンクリック）
2. **Ajaxリクエストの送信:** JavaScriptがAjaxを使用してサーバーに非同期リクエストを送信します。リクエストには、URLやメソッド（GET、POSTなど）、必要に応じてデータ（JSON形式で）を含めることができます
    ```javascript:javascript
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => {
        console.log(data); // サーバーから取得したデータをコンソールに出力する
        // 取得したデータを使ってページを更新するなどの処理を行う
      })
      .catch(error => {
        console.error('Fetch error:', error);
      });
    ```
3. **サーバーの処理とレスポンス:** サーバーは受け取ったリクエストを処理し、JSONなどの形式でレスポンスを返します
4. **レスポンスの処理:** JavaScriptがサーバーから返されたデータを受け取り、ページの内容を更新したり、他の処理を行ったりします

## おわりに

JSONとAjaxは、モダンなWeb開発において欠かせない技術です。

JSONはデータの表現に優れたフォーマットであり、Ajaxを介して非同期でデータを取得・送信する際に重要な役割を果たします。

この組み合わせにより、ユーザー体験を向上させる動的なWebアプリケーションを開発することが可能となります。

これらの基本的な概念を理解し、実際の開発に活かしてみてください。

## 参考記事

[JavaScript Object Notation - wiki](https://ja.wikipedia.org/wiki/JavaScript_Object_Notation)
[Ajax - wiki](https://ja.wikipedia.org/wiki/Ajax)
[JSONとは？今更聞けない入門編！使い方やデータフォーマットについて解説](https://datamix.co.jp/media/datascience/introduction-to-json/#:~:text=%EF%BC%881%EF%BC%89JSON%E3%81%A8%E3%81%AF,%E3%81%A6%E9%96%8B%E7%99%BA%E3%81%95%E3%82%8C%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82)
[初心者目線でAjaxの説明](https://qiita.com/hisamura333/items/e3ea6ae549eb09b7efb9)
Spring Bootでのエラーハンドリング--@RestControllerAdviceの使い方--

## はじめに

Spring Bootを使用してREST APIを開発する際、エラーハンドリングの方法として`@RestControllerAdvice`を使用したエラーハンドリングの方法を紹介します

## `@RestControllerAdvice`とは？

`@RestControllerAdvice`は、Spring BootにおいてRESTコントローラー専用の例外処理を行うためのアノテーションです。このアノテーションを使用することで、アプリケーション全体で発生する例外を一元管理し、カスタマイズされたエラーレスポンスを返すことができます。

## 基本的な使い方
まずはハンドリングさせたいカスタム例外クラスを作成します。

```kotlin
class ResourceNotFoundException(message: String　=　"Resource not found") : RuntimeException(message)
```
デフォルト引数として "Resource not found"の文字列を入れていますが
呼び出し時に適切な文言へ変更します。

次に`@RestControllerAdvice`アノテーションを使用して、グローバルな例外ハンドラを作成します。

```kotlin
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.RestControllerAdvice


@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(ResourceNotFoundException::class)
    fun handleResourceNotFoundException(ex: ResourceNotFoundException): ResponseEntity<String> {
       return ResponseEntity(ex.message, HttpStatus.NOT_FOUND)
    }

}

```
あとはアプリケーションの任意の場所から
自分で定義したカスタム例外クラスをスローすると`@RestControllerAdvice`がインターセプトして
定義されたresponseを返してくれます。
controllerで呼び出すと以下のようになります。
```kotlin
@RestController
class SampleController {

    @GetMapping("/resource/{id}")
    fun getResource(@PathVariable id: String): Resource {
        if (id == "not_found") {
            throw ResourceNotFoundException("Resource with ID $id not found")
        }
        return Resource(id, "Sample Resource")
    }
}
```
controllerだけではなくてその先のservice、repositoryなどでエラーをスローしても
インターセプトしてエラーレスポンスを返してくれるので安心してください。

以下ChatGPTが教えてくれたメリデメです。


## `@RestControllerAdvice`のメリット
- 一元管理
例外処理を一箇所に集約することで、コードの可読性とメンテナンス性が向上します。
各コントローラーで個別に例外処理を記述する必要がなくなります。
- 一貫性
全ての例外に対して一貫したレスポンスを返すことができます。これにより、クライアント側のエラーハンドリングが容易になります。
- 再利用性
一度設定したグローバル例外ハンドラーは、全てのコントローラーで再利用できます。新しいコントローラーを追加する際に特別な設定をする必要がありません。
- コードの簡潔さ
コントローラーのコードが簡潔になり、本来のビジネスロジックに集中することができます。



## `@RestControllerAdvice`のデメリット
- 特定のコントローラーに対するカスタマイズが難しい
全体的なエラーハンドリングが一元化されるため、特定のコントローラーやメソッドに対するカスタムエラーハンドリングが難しくなる場合があります。
- 複雑なエラーハンドリングロジック
非常に複雑なエラーハンドリングロジックを必要とする場合、グローバルな例外ハンドラーが肥大化し、管理が難しくなる可能性があります。
- 予期しない影響
新しい例外ハンドラーを追加した際に、他のコントローラーや機能に予期しない影響を与える可能性があります。特に大規模なアプリケーションでは注意が必要です。
- デバッグが難しい
エラーがグローバルハンドラーでキャッチされるため、特定のコントローラーやメソッドで発生したエラーの原因を特定するのが難しくなることがあります。
- まとめ
serviceでスローしたエラーをcontrollerでcatchしてエラーレスポンスを返すっていう煩わしい処理を記述しなくていいのが便利ですね
積極的に使っていきたいと思います
【python】配列の削除に関する考察

# はじめに
配列の削除について考察してみた

## 配列を分割して削除

```python
n,m = map(int,input().split())
array1 = input().split()
array2 = array1.pop(m-1)
for i in array1:
    print(i)

```

配列を2つに分割して元の削除の特定の要素を削除したかのようにする
削除した要素は別の配列に格納される。

## 配列の要素を削除

```python
values = input().split()
N = int(values[0])
M = int(values[1])

A = [0] * N
values = input().split()
for i in range(N):
    A[i] = int(values[i])

del A[M - 1]

for a in A:
    print(a)
```

特定の要素を削除している。

# まとめ
後者の方がメモリ量は低い
GitHub Copilot も 1 人のエンジニア

## GitHub Copilot とは

<https://github.com/features/copilot>

生成 AI によるコーディング支援ツールであり、今世界中で注目されています。

## この記事は誰向け

- 自分のコードを GitHub Copilot に任せきりな人
- 「GitHub Copilot がいればわたしたち安泰」と思っている人
- エンジニアを採用してる人

## 書かないこと

- GitHub Copilot の詳しい仕様

## 背景

私、今年 (2024 年) に入ってから Python の資格を取得しました。

PCAP™ – Certified Associate Python Programmer  
<https://pythoninstitute.org/pcap>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486784/19b8c3fa-75c7-186f-a1f9-7863e0d2a82e.png)

[OpenEDG 社](https://openedg.org/) が提供する Python 国際資格で、紹介されている記事も多いことから、世界的にもかなり認知されている資格と思われます。  

中身ですが、変数のスコープ・制御構造・標準ライブラリ・オブジェクト指向プログラミングなど、Python の基本的な事項について根掘り葉掘り聞かれます。

上位のプロフェッショナルレベルの資格があと 2 つあるようなので、それも頑張って取得したいと思っています。

**ですが**

資格を取得した直後に、私はこんなことを思ってしまいました。

> GitHub Copilot に頼めばすぐコード書いてくれるし、人間がプログラミング言語の資格を取るほど勉強をする意味は無いのでは？😥

実際、AI がコードを書くうえで非常に便利であることは言うまでもありません。  
資格って本当に必要なのかな、と思ってしまい、そこから夜しか眠れない日々が続きました。

---

そこから 5 か月の月日が流れました。

## GitHub Copilot についてざっくり

### 主な使い方

GitHub Copilot は主に以下のような使い方をされています：

- 質問して答えてもらう
- コメントで処理の説明を書いてコードを提案してもらう

結構すごい（語彙力）ので、みんなスーパーマンみたいに扱っています（感想）。

一方、私たち人間はどのように使われているでしょうか。  
私の会社ではこんな使い方です：

- 質問をしたら答えてくれる
- 何か指示を出したらコードを書いてくれる

**GitHub Copilot って、ほぼ人間じゃないですか？ 🤔（感想）**

### 学習ソース

https://github.com/features/copilot#faq

GitHub Copilot のページによれば、以下のように説明されています（Google 翻訳を使用）。

> GitHub Copilot はどのようなデータでトレーニングされていますか?
>
> GitHub Copilot は、GitHub、OpenAI、Microsoft が開発した生成 AI モデルを搭載しています。GitHub のパブリック リポジトリのコードなど、公開されているソースからの自然言語テキストとソース コードでトレーニングされています。

これを踏まえると、私たちが自由に書いて公開しているようなコードからも学習していると思われます。  
**GitHub Copilot が学習したコードはすべて正しいとは限りません。**

仮に、フォーク数やスター数の多い、有名なリポジトリばかりを学習していたとしても、 **それは先人たちが正しいと思って書いてきたコードであり、これからも正しいとは限りません。**

つまり、

**人間のコードをレビューしているように、GitHub Copilot のコードもレビューする必要がある**

と思います。  
言い換えれば、鵜呑みにすることはよくないと考えます。

## 私が思う GitHub Copilot の本当のメリット

GitHub Copilot は人間とさほど変わりないということなのでしょうか。そんなことはないと私は思います。  
以下、私が注目すべきと考えるメリットを挙げていきます。

### レスが早い

GitHub Copilot に何かをお願いして、「あーすいません、ちょっと調べるので 30 分ほど待ってください」と言われた話は聞いたことがありません。基本的にどんな質問に対しても数秒とかで即レスしてくれます。

### 学習量が半端ない

前述のように、「公開されているソースによってトレーニングされている」わけですから、人間ではできないほどの学習を GitHub Copilot はしているものと思われます。  
それゆえ、自分がわからないところを GitHub Copilot に聞くという使い方も非常に有効です。

### 労働力が非常に安価

現在、<https://github.com/pricing> で利用料金を見てみると、Enterprise プランで 1 か月・1 人あたり 21 USD となっています。
つまり、 50 人のチームで利用した場合は月額 1,050 ドル、つまり 163,800 円（1 USD = 156 円）となるため、新卒エンジニアよりも安価に導入することが可能な上、時間帯を問わずキャパオーバーで働いてくれます。

（私が調べる限り非課税のようですが、もし間違っていたらすみません）

### 人事評価による昇給が不要

極めつけは「人事評価による昇給が不要」ということです。  
私たちがどれだけ GitHub Copilot をうまく活用して生産性を向上させようと、どれだけ会社の利益を爆上がりさせようと、定額で好きなだけ活用できるのです。  
給料を据え置きにしても落ち込んだり、どこかに転職したりしません。GitHub Copilot はありがたすぎる人材なのです。

:::note alert
これは GitHub Copilot だからできる話であって、人間に同じような仕打ちをすることは断固として許されません :rage: :rage: :rage:
:::

注意点ですが、「人事評価による昇給が不要」と言っても、以下の場合は素直に昇給する必要があります。

- 円安になった場合（日本円での支払いを想定）
- GitHub Copilot をこき使う人数が増えた場合
- 派遣元（GitHub 社）から単価アップを要求された場合

---

これらのメリットに気づくことができ、学習ソースなどの背景に十分留意できるなら、もはや GitHub Copilot を利用しないという選択肢はないわけです。  
GitHub Copilot をすでに導入しているところも、まだ導入していないところも、どんどん利用しましょう。

## まとめ

**GitHub Copilot を 1 人のエンジニアとして採用するという視点があってもいいと思います😎**

GitHub Copilot の費用が人件費に計上される未来を願って…🙏🎋
Javaで「配列の宣言と配列の作成」の動作を確認してみた

# 概要

Javaで「配列の宣言と配列の作成」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/array/index2.html

# 実装

以下のファイルを作成しました。
```JSample2_1.java
class JSample2_1{
  public static void main(String[] args){
    int[] result = new int[3];

    result[0] = 75;
    result[1] = 88;
    result[2] = 82;

    for (int i = 0 ; i < 3 ; i++){
      System.out.println(result[i]);
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample2_1.java 
$ java JSample2_1 
75
88
82
```

# まとめ

何かの役に立てばと。