OmniAICreator/Qiita-1.07M huggingface dataset:
markdown AI は初学者向け学習ツールとして活用できる

本記事は[Qiita Engineer Festa 2024](https://qiita.com/official-campaigns/engineer-festa/2024)のキャンペーンテーマ[「markdown AIを使った記事を投稿しよう！」](https://qiita.com/official-events/142fdd0d69ff6bb2d547)の記事です。

`markdown AI` を実際に触ってみて、僕なりに具体的な活用方法について考えをまとめてみました。

https://mdown.ai/

`markdown AI` の使い方については他の方が分かりやすく紹介していますので、参考にしてぜひ触ってみてください。

https://qiita.com/coke_kouichi/items/8f869dcbddf9fccf4cde

## markdown AIの特徴
![markdownAI-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812157/6cfd961b-7f85-f444-4633-752ef4aef7f0.png)

まず、僕が触ってみて感じた現状の `markdown AI` の特徴は、

- 書いて公開というシンプルな機能
- 学習コストの低さ

の2点かなと思いました。

### 「書いて公開」というシンプルな機能
`markdown AI` の「マークダウン形式で文章を書いて公開する」という機能面だけでいうと、Qiita や Zenn など他にもWebサービスはたくさんあります。

ですが、

1. 文章を書く
1. 公開する

という **潔いほどのシンプルさ** は他のWebサービスにないかもしれません。

機能がありすぎると装飾にこだわったり、使い方が分からなくて調べたり、本来の「書く」という目的から脱線してしまうことが多々あるかと。

現在の `markdown AI` はβ版なので、今後はAI機能も含めて充実していくとのことなのですが、書くことに集中できるという特徴は維持してもらえたらいいなと思っています。

### 学習コストの低さ
僕も仕事でHTML・CSSを教えることがあるのですが、初めてWebサイトを作る方にHTML・CSSは覚えることが多すぎてハードルが高すぎます。

僕の経験上になりますが、ここで挫折する方が多い印象です。

その点、`markdown AI` は簡単なマークダウン形式を覚えるだけでWebサイトを実際に作れるため、学習コストがかなり抑えられます。

実際に使う人は当然のことですが、教える側の立場においても学習コストが低いのはメリットでしかないですね。

| 立場 | 人物像 |
|:-----|:----|
| 使う側 | 初心者、新入社員、学生、子ども |
| 教える側 | 経験者、先輩、先生、親 |

## 具体的な活用方法の考察
`markdown AI` の特徴から現状での具体的な活用方法としては、

:::note
**「初学者向けの学習ツール」**
:::

かなと思いました。

![markdownAI-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812157/628befcb-048c-2067-7ce2-c28305d7aa26.jpeg)
出典：[pixabay](https://pixabay.com/photos/children-win-success-video-game-593313/)

内容としては以下を学習する目的で使用するツールとして、活用できるのではないかと考えてみました。

- 書くというアウトプットの習慣を付ける
- Webサイトを自分で作ったという体験ができる
- 実際にインターネット上へ公開することでネットリテラシーを学ぶ

### アウトプットの習慣化
書くというアウトプットって大切ですよね。
自分の考えや知識、インプットしたことを文章に書き出すだけで自分の中で整理することができます。

`markdown AI` は文章を書くことだけに集中できるため、アウトプット以外に時間がとられにくいです。

アウトプットまでに時間がかかってしまうと、どうしても続かなかったりするので習慣化として使えるのではないかなと思いました。

### 自分で作ったという体験
僕も初めてWebサイトを作っていたときのワクワク感を覚えてます。

自分の手で作って、
完成させて、
周りに見てもらう。

初学者にとっては何にも代えがたい体験だと思います。

ただ、HTML・CSSのように覚えることは少ないので、達成感としてはちょっと物足りないかもしれないですが、学習の導入としてはいいかなと思いました。

### ネットリテラシーを学ぶ
実際にインターネット上へ公開することで、ネットリテラシーの学習に使えるのではないかなと思います。

- インターネットに公開するリスク
- 表現によっては被害者にも加害者になりうる
- 著作権などの権利や個人情報について

などなど。

SNSが広まってインターネットへの公開ハードルが低くなっていますが、リスクは変わらずにあることをきちんと学ぶべきです。

`markdown AI` は公開・非公開がすぐできる（限定公開の機能が欲しいところですが）ので、リテラシーを学ぶためのツールとして使えるのかなと思いました。

## まとめ
今回は僕なりに `markdown AI` の活用方法を考えてみました。

結論、 `markdown AI` はシンプルな特徴を生かした

:::note
**「初学者向けの学習ツール」**
:::

に広く活用できるのではないかと思いました。

いろんなWebサービスはありますが、多機能すぎると初学者は混乱してしまいます。
なので、何も知らない初学者に向けた学習ツールとして　`markdown AI` はシンプルかつ学習ハードルが低いため、オススメだと思いました。

※本当は「`markdown AI` で図鑑を作ってみた！」みたいな内容を書こうと思っていたのに、全然違う記事になってしまった…
JP1/SNMP System Observerについて

# はじめに
私が案件先で、JP1/SNMP System Observerを使用しているので、JP1/SNMP System Observerがどういうものなのか、どんなことができるのかまとめてみました。

# JP1/SNMP System Observerとは
ネットワーク上のサーバのシステムリソースやプロセスおよびサービスを監視するソフトウェアです。しきい値を設定したり，プロセスが停止したりした場合，またはサービスの動作状態の変更を検知した場合に，イベントを発行して管理者に知らせることができます。主にリソース監視、プロセス監視ができます。


# どんなことができるのか
実際どのような場面で使用するかというと、リソース監視であれば対象サーバのCPU利用率，メモリ使用率，ファイルシステム使用率などの情報を確認したいときに使用されます。しきい値設定も行えるので、例えば対象ドライブのファイルシステム使用率が80％以上になったとき警戒域または危険域を設定していればイベントを発行し通知してくれる機能があるためドライブの容量が枯渇するまえに気づくことができます。

プロセス監視に関しては監視したいプロセスを設定し、対象のプロセスのステータスに変化があった場合イベントを発行して通知してくれますので、例えばプロセスが意図せず停止しても即座に気づくことができます。


# おわりに
最後まで読んでいただきありがとうございました！！
JP1/SNMP System Observerがあるとリソース、プロセス監視している物に関しては何かあった場合すぐに気づけるのでシステム保守をしている身からすると便利なシステムだと思います。
プログラムの安全性を保つための assert と validation

今週の社内輪読会でやった、assert と validation についてまとめておく。
Rubyを使うことが多かったのでassert = テストコード というイメージが合ったのですが、PythonやPHPなどでは違うようです。

## assertとvalidationの違い

プログラミングにおいて、**assert**と**validation**はどちらも条件をチェックするための機能ですが、それぞれの目的と使用方法は異なります。

## assertとは

assertは、プログラムの実行中に特定の条件が真であることを確認するためのデバッグツールです。
主に開発時に使用され、条件が偽であればプログラムを停止させてエラーメッセージを表示します。

### 使用例
以下のPythonコードは、assertを使用して変数valueが正の整数であることを確認します。

```python
value = -1
assert value > 0, "Value must be a positive integer"
print("success")
```
これを実行すると以下のように出力されます
```
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    assert value > 0, "Value must be a positive integer"
AssertionError: Value must be a positive integer
```

### 特徴
- **デバッグ目的**: 主に開発中に利用される。
- **パフォーマンス**: 実行時のパフォーマンスに影響を与える可能性があるため、通常は本番環境では無効化される。
- **エラーメッセージ**: 条件が偽の場合、エラーメッセージとともにプログラムが停止する。

## validationとは

validationは、ユーザー入力やデータの正当性を確認するためのプロセスです。プログラムの実行時に常に有効であり、不正なデータが入力された場合に適切なエラーメッセージを返します。

### 使用例
以下のPythonコードは、validationを使用してユーザー入力が正の整数であることを確認します。

```python
def validate_positive_integer(value):
    if not isinstance(value, int) or value <= 0:
        raise ValueError("Value must be a positive integer")

validate_positive_integer(10)
validate_positive_integer(-1)
```
これを実行すると以下のように出力されます
```
Traceback (most recent call last):
  File "main.py", line 6, in <module>
    validate_positive_integer(-1)
  File "main.py", line 3, in validate_positive_integer
    raise ValueError("Value must be a positive integer")
ValueError: Value must be a positive integer
```

### 特徴
- **実行時に常に有効**: 開発環境でも本番環境でも使用される。
- **ユーザー入力のチェック**: 不正な入力を防ぎ、プログラムの安定性を保つ。
- **エラーハンドリング**: 不正なデータが入力された場合、適切なエラーメッセージを提供し、プログラムの実行を継続する。

## assertとvalidationの比較

| 特徴                | assert                                    | validation                                   |
|---------------------|-------------------------------------------|----------------------------------------------|
| 主な目的            | デバッグ                                  | データの正当性確認                            |
| 使用タイミング      | 開発時                                     | 開発時および本番時                            |
| エラーハンドリング  | プログラムを停止してエラーメッセージ表示   | エラーメッセージを返して処理を継続            |
| パフォーマンス影響  | 本番環境では無効化されることが多い（Pythonなら `-O` オプションなど）         | 常に有効であり、適切に使用すればパフォーマンスへの影響は最小限    |

## まとめ

assertとvalidationは、いずれも条件をチェックするための重要なツールですが、その目的と使用方法は異なります。
assertは主にデバッグ目的で使用され、条件が偽の場合にプログラムを停止させます。
一方、validationはユーザー入力やデータの正当性を確認するために使用され、常に有効で不正なデータが入力された場合に適切なエラーメッセージを提供します。
これらの違いを理解し、適切に使い分けることが重要です。
例えば、assertは開発中の内部ロジックの検証に、validationはWebフォームからの入力データの検証など、ユーザーインターフェースに関連するデータの検証に使用するのが適切です。
【備忘録】gdbとGhidraの併用

Ghidraで表示されるアドレスとgdbで表示されるアドレスは異なるので、アドレスの対応を調べる必要がある。例えば、GhidraではCMPは001011f6にある。![unknown_016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658047/a348ba03-0606-81e1-403e-a9fcca5af178.png)
また、00100000から始まっているので、![unknown_017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658047/e7373624-7fee-4aeb-b8c3-8bfa59bfb7e0.png)
gdbでも開始位置から11f6進んだところにCMPがあるはず。このコマンドを使うと
```
pwndbg> info proc mappings
```
![unknown_018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658047/40fc8759-a9d7-b5d0-db45-d732158dd547.png)
0x555555554000から始まっていることがわかるので、0x5555555551f6にCMPがあるはず。![unknown_019.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3658047/6e4a74f0-b560-cafb-2d4a-daa5d1769e4b.png)
あった
一度のconnection.queryで、複数のクエリを処理する

## 一度に複数のMySQLクエリを投げたい

入力されたユーザーID(`user_id`)、グループID(`group_id`)の値を使って、

* `users`テーブルから`id=user_id`を条件に`name`を検索　             
* `groups`テーブルから`groupId=group_id`を条件に`groupName`を検索　 

これらの検索を一度のconnection.queryで処理して、得られた`results`の内容を`res.render('test.ejs')`に反映させる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825151/214f8531-8ac7-dab6-9082-f110c59c2efe.png)

２つの検索処理を行う順番に特に制限はないが、webページの描画時（アクション終了時）にはどちらの結果も代入できる状態でなければならない。
つまり、**２つの検索結果を１つのアクションの中で手に入れる**必要がある。
MySQLにクエリを投げるタイミングは**１アクションにつき１回**（たぶん）のようなので、この１回のタイミングで２つのクエリを同時に投げたい。

## 【解決策】mutipleStatementsで複数のクエリを一気に送信

### 【ポイント①】mutipleStatementsを有効化

JSファイルのはじめの方に書いてあるMySQLへの接続設定情報の`multipleStatements`を`true`に設定。↓こういう内容の部分↓
```javascript
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'user',
  password: 'password',
  database: 'database',
  multipleStatements: true
});
```

### 【ポイント②】代入する値は`?`ではなく`${変数}`でクエリ文に組み込む

 先にそれぞれのクエリ文を定数に定義しておく（`mysql1, mysql2`など）
 このとき、入力値を代入したい部分は`?`ではなく`${}`を使って、文字列に変数を埋め込む形にする

```javascript
////入力された変数の値
var userId = req.query.user_id;
var groupId = req.query.group_id;
////それぞれのクエリ文を定数に定義
const mysql1 = `SELECT name FROM users WHERE id=${userId};`;
const mysql2 = `SELECT groupName FROM groups WHERE id=${groupId};`;
```
### 【ポイント③】クエリを処理した結果はresultsにまとまっている
クエリを投げるとき、複数のクエリは『＋』で連結させる
`results`にはそれぞれのクエリを処理した結果が、連結順と同じ順番で配列要素として入っている

```javascript
connection.query(mysql1 + mysql2, (error, results) => {
    res.render('test.ejs', {user: results[0], group: results[1]});
}); 
```
## 完成したコード

```javascript
app.get('/test', (req, res) => {
////入力された変数
var userId = req.query.user_id;
var groupId = req.query.group_id;
////それぞれのクエリ文を定数に代入
const mysql1 = `SELECT name FROM users WHERE id=${userId};`;
const mysql2 = `SELECT groupName FROM groups WHERE id=${groupId};`;

connection.query(mysql1 + mysql2, (error, results) => {
    res.render('test.ejs', {user: results[0], group: results[1]});
}); 
```
dockerを用いた開発環境構築のメモ書き (Ubuntu 24.04)

## dockerを用いた計算環境構築のメモ書き   
以下はdocker compose を用いず，使うもののみをインストールしていく方法です．   
( コマンド，各種ライブラリは必要に応じてインストールする）   

#### 1. docker pullを用いてdocker hubからimageを持ってくる   

```bash
$ docker pull ubuntu:latest
```
【書式】docker pull イメージ名[:タグ名] 　を使う   

イメージ名は   

```bash
$ docker search 'ubuntu'
```
を用いて検索できる． また，[docker hub](https://hub.docker.com/_/ubuntu)も参考にしてubuntu環境を持ってくる．   

```bash
$ docker images
```
でイメージを持ってこれたか確認   


#### 2. docker imageの作成と起動   

以下のコマンド(以下ではイメージ名:タグ名を ubuntu:latest ,コンテナ名をpaleboxと名付けるとする．)   

```bash
$ docker run --name palebox -it -d ubuntu:latest
```
--name　を使ってコンテナ名を付け，-itでコンソールによる操作を可能に，   
-dでバックグラウンドで起動の設定(一例)     


#### 3. コンテナにアタッチ

vscodeを使用している場合は左下の部分からアタッチ，もしくは拡張機能のdockerからアタッチ   

↓コマンドで

```bash
$ docker exec -it <コンテナ名またはコンテナID> /bin/bash
```

コンテナ内に入ったら以下を実行していく   
（ubuntuのみの更地なので環境を構築していく必要あり)


Install essential packages   

```bash
$ apt update && apt upgrade -y
$ apt install -y build-essential nano gdb ca-certificates wget sudo less curl gnupg lsb-release
```   

以下で apt のhttpsを通じたリポジトリの利用を可能にする. 

```bash
$ sudo apt update
$ sudo apt -y install apt-transport-https
```   

lspci , ifconfigなど運用保守に関するコマンドを使えるようにするため以下インストール   

```bash
$ sudo apt -y update
$ sudo apt -y install net-tools pciutils
```


[Ubuntu build-essentialの基本とインストール](https://programming-archive.com/posts/ubuntu-build-essential-installation-guide/)   
[Ubuntu 22.04 のインストール直後の設定](https://www.kkaneko.jp/tools/ubuntu/ubuntu_setup.html#S9)   
→ 大変参考になりました．   

初期の開発ツール上記以外についても検討中   
↓は postfix , git 関連について   

```
Please select the mail server configuration type that best meets your needs.   

 No configuration:   
  Should be chosen to leave the current configuration unchanged.   
 Internet site:   
  Mail is sent and received directly using SMTP.   
 Internet with smarthost:   
  Mail is received directly using SMTP or by running a utility such   
  as fetchmail. Outgoing mail is sent using a smarthost.   
 Satellite system:   
  All mail is sent to another machine, called a 'smarthost', for   
  delivery.   
 Local only:   
  The only delivered mail is the mail for local users. There is no   
  network.   

  1. No configuration  2. Internet Site  3. Internet with smarthost  4. Satellite system  5. Local only   
General mail configuration type: 1   
```

とでてきたら1番を選択で良し   

```
Please select the geographic area in which you live. Subsequent configuration questions will narrow this down by presenting a list of cities, representing the time zones in which they are located.

  1. Africa  2. America  3. Antarctica  4. Arctic  5. Asia  6. Atlantic  7. Australia  8. Europe  9. Indian  10. Pacific  11. Etc   
Geographic area: 5   
```

と出てきたらアジアを選択,time zoneはtokyoで   

あとは使用するコンパイラのインストール (Intel Compiler , gfortran ,,,,)   

c++の環境構築には上記の作業に加えて各ライブラリのインストールが必要   
→eigen,boost,spdlogなど,,,?   


各種コマンドが入っていないことが多いので, バージョンによる差異の少ないコマンドに関して以下でインストール   

```bash
$ sudo apt install [installしたいコマンド]
```

古いバージョンをインストールしてしまって痛い目を合うこともあるので，なんでもかんでもaptで入れるのは危険というのを心得て,,,
Jetson NanoにMediapipeをインストールする方法

### はじめに
Jetson NanoにGPU版のMediapipeをインストールする方法です。
OpenCVがインストールされているのが前提となるため、OpenCVをまだインストールしていない場合は[Jetson NanoにOpenCVをインストール方法](https://qiita.com/TooMe/items/a4cc9cf4398ee8a5929f)を確認し、OpenCVをインストールしてください。

### 環境
Module: NVIDIA Jetson Nano 4GB ram
Jetpack 4.6.1
Ubuntu 18.04 Bionic Beaver
Python 3.6.9
OpenCV 4.8.0

### インストール手順
```shell
sudo apt-get update && sudo apt-get upgrade
```
依存関係をダウンロードする
```shell
sudo apt-get install -y \
    git \
    curl \
    unzip \
    libhdf5-serial-dev  \
    hdf5-tools  \
    libhdf5-dev  \
    zlib1g-dev  \
    zip \
    libjpeg8-dev  \
    liblapack-dev  \
    libblas-dev  \
    gfortran \
    libopencv-core-dev  \
    libopencv-highgui-dev  \
    libopencv-calib3d-dev  \
    libopencv-features2d-dev  \
    libopencv-imgproc-dev  \
    libopencv-video-dev
```
```shell
pip3 install -U pip testresources setuptools==49.6.0
```
```shell
pip3 install -U --no-deps numpy==1.19.4 future==0.18.2 mock==3.0.5 keras_preprocessing==1.1.2 keras_applications==1.0.8 gast==0.4.0 protobuf pybind11 cython pkgconfig
```
シェルスクリプトファイルのあるリポジトリをクローンし、実行
```shell
git clone https://github.com/PINTO0309/mediapipe-bin
cd mediapipe-bin
./v0.8.5/download.sh
```
パッケージの解凍
```shell
unzip v0.8.5.zip -d v0.8.5
```
Mediapipeのインストール
```shell
sudo pip3 install v0.8.5/v0.8.5/numpy119x/py36/mediapipe-0.8.5_cuda102-cp36-cp36m-linux_aarch64.whl
pip3 install dataclasses
```

これでMediapipeをインストールすることができます。
カメラを接続し、以下のテストコードを実行してみてください。

```python
import time

import cv2
import mediapipe as mp

video_source = "/dev/video0"  # Use a webcam
# video_source = "test_video.mp4"  # Path to video file

# Initialize MediaPipe Pose and Drawing utilities
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils
pose = mp_pose.Pose()

# Open the video file
cap = cv2.VideoCapture(video_source)
time.sleep(2)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # Convert the frame to RGB
    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # Process the frame with MediaPipe Pose
    result = pose.process(frame_rgb)

    # Draw the pose landmarks on the frame
    if result.pose_landmarks:
        mp_drawing.draw_landmarks(frame, result.pose_landmarks, mp_pose.POSE_CONNECTIONS)

    # Display the frame
    cv2.imshow('MediaPipe Pose', frame)

    # Exit if 'q' keypyt
    cv2.waitKey(1)
```
NVIDIA HPC SDK のインストールとパスの設定

# NVIDIA HPC SDK のインストールとパスの設定
NVIDIA HPC コンパイラは並列プログラミングモデルに対応し，NVIDIA GPU用の最適化・並列化コードを生成できるマルチプラットフォーム対応のプログラム開発ができるコンパイラ．    

[NVIDIA HPC コンパイラとは](https://gdep-sol.co.jp/try-nvidia-hpc-sdk/nvidia-hpc-compilers/)   

   

## NVIDIA HPC SDK のインストールおよび PATH通し
#### 1. [The NVIDIA HPC SDK](https://developer.nvidia.com/hpc-sdk-downloads)よりインストール
以下は一例（公式サイト参照）   

```bash
$ curl https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg
$ echo 'deb [signed-by=/usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | sudo tee /etc/apt/sources.list.d/nvhpc.list
$ sudo apt-get update -y
$ sudo apt-get install -y nvhpc-24-5-cuda-multi
```

既に以前一度インストールがある場合以下で削除してから上記を実行   
```bash
$ sudo apt-get remove nvhpc-24-5-cuda-multi
```

.bashrc や .bash_profile などにパスの追記 , [HPC SDK DOCUMENTATION](https://docs.nvidia.com/hpc-sdk/hpc-sdk-install-guide/index.html)を参照する．   

```bash
# NVIDIA HPC SDK
export NVARCH=`uname -s`_`uname -m`
export NVCOMPILERS=/opt/nvidia/hpc_sdk
export MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/24.5/compilers/man
export PATH=$NVCOMPILERS/$NVARCH/24.5/compilers/bin:$PATH
export PATH=$NVCOMPILERS/$NVARCH/24.5/comm_libs/mpi/bin:$PATH
export MANPATH=$MANPATH:$NVCOMPILERS/$NVARCH/24.5/comm_libs/mpi/man
```

確認   

```bash
$ nvfortran --version
nvfortran 24.5-1 64-bit target on x86-64 Linux -tp cascadelake 
NVIDIA Compilers and Tools
Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES.  All rights reserved.
```
amplify publishしたのにサイトの内容が更新されないときの対処方法

## はじめに
Webサイトに変更を加え、```amplify publish```がエラーもなく完了したのに、その変更が反映されない場合の対処方法です。

## 原因
cloudfrontにキャッシュが残っていた。

## 対処方法
cloud frontでキャッシュ削除を行います。

1. AWS Manegement Consoleにログインし、CouldFrontページに移動
1. 対応するディストリビューションを選択
1. 「キャッシュ削除」を選択
![スクリーンショット 2024-07-03 16.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3820079/ba5846a3-741e-30bc-5766-5ea258d84baf.png)
1. 「キャッシュ削除を作成」を選択
1. オブジェクトパスを指定する
残しておきたいキャッシュが場合は```/*```で全選択しても大丈夫。
1. 「キャッシュ削除を作成」を選択

これでしばらく待つとキャッシュが削除されるため、再び```amplify publish```すればOK。
みなさんはAIツールを使っていますか？

# はじめに

みなさんはAIツールを使っていますか？

昨今、様々なAIツールが世の中に存在しており、私たちの生活や仕事の効率を飛躍的に向上させ、クリエイティブなアイデアを実現する手助けをしてくれます。

今回は、実際に私が使用した事のあるAIツールについて紹介させていただきます。

# 1. Notion

Notionとは、タスク管理、プロジェクト管理、データベース、知識管理などを一元化する事ができるツールです。
企業のプロジェクトの進捗管理や社内の情報共有、個人的なタスクリストや目標設定など様々なシーンで利用されます。

### Notion AI にできること

・文章作成支援：
　　　メモ、ブログ記事、レポートなどの文章を自動生成。
・要約：
　　　長文のテキストを短くまとめる要約機能。
・デッドライン提案：
　　　タスクの締め切りを自動提案。
・テンプレート生成：
　　　ユーザーが指定したフォーマットに基づいてテンプレートを生成。

などなど、、、

続いて下記はNotion AI を使用した例です。
![Notion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163879/942f50c2-e3e7-8652-4a71-5e1516b09968.png)

今回は、引っ越しのためのToDoリストをAIに作成してもらいました。
このリストを見てみると、引っ越しの準備から近隣への挨拶までの必要なタスクが作成されています。

# 2. Canva
Canvaは、誰でも簡単にプロフェッショナルなデザインを作成できるグラフィックデザインツールです。
SNSのプロフィール画像や投稿を作成できたり、マーケティング資料、プレゼンテーション、ロゴ、名刺、広告デザインの作成などにも使用されます。

### Canva AI にできること
・デザイン提案：
ユーザーが選択したテンプレートやデザイン要素に基づいて、自動的にレイアウトやデザインの提案を行います。これにより、ユーザーは簡単にプロフェッショナルな見た目のデザインを作成できます。

・画像の自動補正：
アップロードされた画像の自動補正やフィルタリングを行う事で、写真の品質を向上させ、見栄えの良い画像を簡単に作成できます。

などなど、、、

続いて下記はCanva AI を使用した例です。
![canva.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163879/4845da4c-ed8c-eaa9-9965-d404e18f8961.png)

今回は、ゴミ拾いボランティア募集資料の下書きをAIに作成してもらいました。
上記画像の状態は、文章のみなのでデザイン性を加えていく必要はありますが、一般的に何を書くべきかについての下書きはAIが作成してくれたので、作業時間の短縮に繋がるのではと思います。



# 3. Create
Createは、プログラミングの知識がなくても、簡単にWebサイトやアプリを作成できるツールです。

### Create AI にできること
・ノーコード開発：
作成したいWebサイトやアプリの要件を伝えるだけで、自動生成してくれるため、プログラミングスキルがなくても、自分の言葉だけで実装することができます。

・コードの表示：
Createの画面上に「View code」というボタンがあり、ボタンを押すと実装したコードが表示されます。
画面上でコードを書き換えることはできませんが、ダウンロードは可能なので、生成されたコードを基にローカル等で追加実装することももちろんできます。

などなど、、、

続いて下記はCreate AI を使用した例です。
![create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163879/f2cbafa5-990f-fed8-596e-52a2287b0d5b.png)

今回は、リサイクルショップのサイトをAIに作成してもらいました。
生成された画像はリサイクルショップの店内の雰囲気とは異なるかもしれませんが、要件を伝えた実装はだいたいできているようです。
Create AI の使い方の一例として、頭の中にあるイメージをすぐに形にできるため、プロトタイプの作成に適しているのではないかと思いました。

# おわりに
今回は、私が実際に使用したことのあるAIツールについて紹介させていただきましたが、その進化に驚かされました。
これらのツールが私たちの日常や仕事にどのような変化をもたらすのか、今後の展開が楽しみであり、AIの持つ可能性に期待を寄せつつ、その発展を追い続けたいと思います。
スキルアップにも色々あるというお話

# はじめに

こんにちは！みなさん、スキルアップしてますか？

エンジニアに限らず、どんな職種でも「スキルアップ」という言葉が重視されています。
しかし、スキルアップとは具体的に何を指しているのでしょうか。

今回は、エンジニアのスキルアップについて、様々な視点から考えてみましょう。

# スキルアップとは

まず、辞書的な定義を確認してみましょう。

デジタル大辞泉によると：

:::note info
腕前を上げること。技術力を高めること。「—を図る」
:::

実用日本語表現辞典では：

:::note info
仕事などで必要な知識やスキルや資格や技術などを習得すること。
:::

実用日本語表現辞典の定義がより具体的で、イメージしやすいですね。では、エンジニアにとって、仕事で必要な知識やスキル、資格、技術とは、どのようなものでしょうか。

# 仕事で必要な知識やスキルとは

開発エンジニアの視点で考えると、工程別に以下のようなスキルが挙げられます：

### 要件定義
- ビジネス要件の理解と技術要件への変換能力
- クライアントとの効果的なコミュニケーション能力

### 技術調査、技術選定
- 最新技術トレンドの把握
- プロジェクトに適した技術の選定能力

### 画面設計
- UI/UXデザインの基本理解
- ユーザビリティを考慮した設計能力

### 機能設計
- システムアーキテクチャの設計能力
- スケーラビリティとパフォーマンスの考慮

### DB設計
- 効率的なデータモデリング能力
- クエリパフォーマンスの最適化スキル

### ネットワーク設計
- セキュリティを考慮したネットワーク構築能力
- クラウドインフラストラクチャの理解

### 監視設計
- システム監視ツールの活用能力
- 問題の早期発見と対応策の立案能力

### 詳細設計
- クリーンで保守性の高いコード設計能力
- デザインパターンの適切な活用

### テスト設計
- 効果的なテストケースの作成能力
- 自動化テストの導入と運用スキル

### 実装
- 効率的なコーディング能力
- バージョン管理システムの活用スキル
- コードの読解力
- 仕様の理解能力
- 品質管理の視点
- 影響範囲の把握能力

### テスト
- デバッグ能力
- テスト結果の分析と改善提案能力

### リリース
- CI/CDパイプラインの構築と運用能力
- リリース管理とバージョニングの理解

### 運用
- システム運用の効率化能力
- ユーザーサポートとトラブルシューティング能力

### 障害対応
- 問題の迅速な特定と解決能力
- 再発防止策の立案と実装能力

# スキルアップ、色々ある
上記のように、仕事に必要な能力は多岐に渡ります。
また、技術面だけではないこともお分かりいただけるのではないでしょうか。

技術面に目が行きがちですが、社会人としてのビジネススキルも合わせて考えた方が、総合能力は高くなると思います。

# やりたいことは、自分でどんどんやろう
自分が伸ばしたいスキルは、人によってさまざま。
それらを全て組織で対応するには、非常に多くの時間とコストがかかります。

もし、自分がやりたいことに関する環境が無ければ、自分でやった方が早いです。
自分でどんどん進める人はたくさんいるので、環境を待つ時間がもったいないです。

# 業務では一部しか担当できないことも多い

少数精鋭の小規模なプロジェクトでは、幅広く担当できることもあるかもしれません。
しかし、大規模なプロジェクトでは、各エンジニアが特定の領域に特化することが一般的です。
これにより、専門性は高まりますが、全体を見渡す機会が減少する可能性があります。

# 同じ業務でも、意識によって変わる

同じ作業の繰り返しでも、アプローチ次第で大きな違いが生まれます。

例えば、テスト業務一つとっても

- 単なるテスター：与えられたテストケースを淡々とこなす
- QAエンジニア：品質管理を意識し、テスト設計から関わり、継続的な改善を提案する

後者のアプローチを取ることで、同じ業務でもスキルアップの機会を見出せます。

# 個人開発で不足している部分をカバーしよう

個人開発は、業務では経験できない領域にチャレンジする絶好の機会です。以下のような点に注目してみましょう。

1. ユーザーニーズの分析と要件定義
2. プロダクト全体のアーキテクチャ設計
3. フロントエンドからバックエンド、インフラまでの一貫した開発
4. マーケティングとユーザー獲得戦略
5. 継続的な改善とユーザーフィードバックの反映

バックエンドについても触れましたが、フロント完結でも大丈夫です。

実際に使われる前提でサービスを作ることで、よりユーザー視点やコスト、リスクに対する意識を高めることができます。

# まとめ

スキルアップとは単に技術力を高めることだけではありません。
付加価値の創出、効果的なコミュニケーション、問題解決能力など、総合的な成長が求められます。

エンジニアとしてのスキルアップは、以下の点を意識して進めていくことが重要です：

1. 技術の深掘り：担当領域の専門性を高める
2. 視野の拡大：プロジェクト全体を俯瞰する力を養う
3. ユーザー思考：エンドユーザーの立場に立って考える
4. ビジネス理解：技術がもたらす価値を常に意識する
5. 継続的学習：新しい技術やベストプラクティスをキャッチアップし続ける

みなさんも、日々の業務や個人開発を通じて、多角的な視点でスキルアップに取り組んでいきましょう！
ラジオボタンの由来、ウェブ関係あるの？

## はじめに
今回はラジオボタンについて少し学習したので、ラジオボタンの実装の流れ、を紹介しようと思いましたが、少しずれて、由来の話。
「なぜにラジオボタン？ラジオ要素はどこ？ウェブと関係あるの？」と疑問に思ったので、紹介したいと思います。

## ラジオボタンとは
![ラジオボタン.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777936/b2ffa09b-475a-2bef-37bc-6f5a30a5e26e.jpeg)

スマートフォン主流の昨今、ラジオ放送がどこでも手軽に聴けるようになり、**ボタンを押す**という動作がなくなりましたね。
アーカイブも無料で1週間残っているのは大変うれしく思う世代です。

昔は今ではもしかしたら考えられない方もいると思いますが、放送局ごとに割り振られたボタンがいくつも並んでいて、あるボタンを押して選曲すると、押されていた他のボタンが元に戻るという仕組みになっていたそうです。
で、このような仕様のボタンを**ラジオボタン**と呼ぶようになったそうです。

ちなみに、上の画像はAIに適当になげてかえってきたラジオになります。AI様様です

確かに、言われてみれば「ラジオボタン」という名前が付くのも不思議ではないのですが…。

## ラジオボタンと似たような機能
- チェックボックス
言わずと知れたチェックボックス。複数の選択ができる万能な機能といってもいいかと思っています。
- ドロップダウンメニュー
選択肢がリストとして表示され、その一つを選択できるもの。
選択肢がリストに格納され、少スペースで配置できるのがいい点。
- トグルスイッチ
正式名称初めて知りました。
相反する2つの選択肢から、いずれかを選択できるようになっているもの。スマートフォンの設定でよく見かけますよね。


ラジオボタンの実装は下記などを参考にして、学習を進めていましたので載せておきます。

https://magazine.techacademy.jp/magazine/22208

## さいごに
普段生活の中のあるものがあるメソッドや用語に採用しているのが面白いと感じるこの業界。「いやいや、それは違うでしょ」みたいなものはまだ出会っていませんが、これから学習を進めていくうちに出会うかもしれない…。
楽しみながらエンジニア人生を歩むきっかけになれば幸いです。
[備忘録]　読んだネットの記事 (テクノロジーver.4)

# はじめに
こんにちは，Umamusume22です．今回も引き続き読んだネットの記事をアウトプットして行きます．

# 備忘録
[1] "タイでの空飛ぶクルマ導入を検討、東急系とSkyDrive"
https://monoist.itmedia.co.jp/mn/articles/2407/01/news145.html

- 空飛ぶクルマの事業を検討
    - サハ東急は日本人向け賃貸住宅事業を推進
    - 周辺には製造業を中心とした日系企業が集積
    - 新産業誘致に伴う企業の集積や就労
    - 居住人口の増加により不動産サービスの需要拡大を見込んでいる
    - 消費財事業や食品などへの投資を行う
    - 空飛ぶ車を活用するユースケースを検討

[2] "半導体工場などの画像処理向け産業用コントローラー、AI活用の人流空間解析も可能"
https://monoist.itmedia.co.jp/mn/articles/2407/03/news079.html

- 複数のカメラから収集した画像データを高速で処理
- 半導体工場やクリーンルーム内で活用
- AI推論による人物検知や装置の監視制御ができる
    - 危険エリアへの侵入検知やロボットアームの位置決めも可能
- 冷却構造を採用
- 消費電力65Wの高性能デスクトップモデルCPU「Corei7-13700E」を搭載
    - 小型化を実現
    - プロセッサ搭載拡張ボードを、オプションのAIアクセラレーターとして実装
    - GPUよりも少ない消費電力で高速のAI推論を実行することが可能

[3] "モノづくりの知識を身に付けた生成AI、パナソニックHDが技術承継などで活用へ"
https://monoist.itmedia.co.jp/mn/articles/2407/03/news072.html

- パナソニックグループ専用の大規模言語モデル(LLM)を開発
    - 日本語をベースに開発
    - 独自のビジネスデータを学習

- データから実装まで一貫したAI開発プロセスを高度化
    - 現在の汎用型モデルの生成AIを業務で使用するとハルシネーションが発生
        - コストがかかる
- 設計や製造で後継者へのノウハウ継承で活用


# 最後に
今回もまた備忘録の内容が短くて申し訳ありません．
記事を読んでいただきありがとうございました！

※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
プロジェクトで経験したびっくりパターン

エンジニアとして勉強していると「設計はこうするべき」「命名はこうするべき」「コーディングスタイルはこうするべき」など様々なパターンを学習するが、プロジェクトによっては守られていないことがある。

今回はほんとにあった気になったものたちを記憶ベースでまとめて、さらにどのようにするのが良いかまで書きます。

## 命名

### テーブル名の統一性

テーブル名やカラム名についてそもそも統一がされていなかった。

テーブル名については単数形と複数形が混在していた。

どちらが正しいかは考え方によるが同一プロジェクト内では片方に統一をして、新しいテーブルを作る場合はそのルールに従うようにすると良い。

### カラム名

突然の質問になってしまいますが、`start_date`というカラム名はどのようなデータ型を持っていると思いますか？

[MySQLのドキュメント](https://dev.mysql.com/doc/refman/8.0/ja/datetime.html)では`DATE 型は、日付部分を含むが時間部分は含まない値に使用されます。 MySQL は、DATE 値を'YYYY-MM-DD'形式で取得して表示します。 ` という記載があります。

つまりサンプルの値としては'2024-07-01'という値が入ることを私は期待していました。

が実際には`datetime`で実装されていて、'2024-07-01 00:00:00'という値が入っていました。

カラム名や変数名に関しては「名は体を表す」ということを意識して、その変数がどのような値を持つ**読む人の気持ちになって**命名すると良い。

## コーディング

### ifのネスト

ifのネストが深いことが多かった。


基本的にはネストしていない方が読みやすいとされている。

一方でGoのエラーハンドリングは以下のよう関数やメソッドから返り値としてエラーを返し、それをハンドリングすることが多い。

```go
a := someFunc()
if a {
    err := anotherFunc()
    if err != nil {
        return err
    }
}
```

これがあるif文の中で行われるとネストが深くなってしまう。

この場合はearly returnを使うと良い。

```go
a := someFunc()
if !a {
    return nil // もしくは別の処理
}
err := anotherFunc()
if err != nil {
    return err
}
```

## 設計

### N+1問題

[この記事](https://qiita.com/tsukasaI/items/8ff1a50315297725f49c)でも解説しているがDBに負荷をかける問題がある。

解決方法は上記記事を参照してほしい。

### REST APIに反した設計

REST APIではあるリソースの一覧を取得する場合はGETでリクエストを送ることが一般的である。

が一覧取得APIがPOSTでコールされていた。

お作法には従いましょう。

### DIされているところとされていないところがある

Dependency Injection（DI）は依存性の注入という意味で、依存性を注入することでテストしやすくするための手法である。

クリーンアーキテクチャなどでよく使われ、usecase層やrepository層においてDIを行うことが多い。

例としては以下のようなコードがある。

```go
type SomeService struct {
    db *sql.DB
}

func NewSomeService(dsn string) *SomeService {
    return &SomeService{
        db: sql.Open("mysql", dsn),
    }
}
```

このSomeServiceはdsnを本番稼働する時には商用のDB、テスト時にはテスト用環境に接続することができる。

これをテスト対象のメソッドや関数内に書いてしっていてとテストが難しくなっていた。

とにかく外部注入可能なものは外部から注入しましょう。

## テスト

とにかくテストがされていない。テストコードが存在しない。

テストコードが存在していてもケースが不十分でバグを検知するタイミングが遅れることがあった。

テストは書こう。

最初にテストを書くとあとの開発が楽になる。

## ドキュメント

ドキュメントは存在しない

ドキュメントは書こう。

どれだけ急いでいてもおおよその動きやインターフェースの責務をまとめておくと後の人が助かる。

ドキュメントは書こう。
Excel VBA 時間が表示されるだけのデスクトップアプリを作る【2】

## 時間をリアルタイム表示

前回に引き続き、Excel時計を作ります。
このページを参考に（というかほぼコピペ）して、表示されている時間を自動更新するようにしました。

https://www.moug.net/tech/exvba/0130009.html

UserForm_Initializeのプロシージャだとエラーが出たので、標準モジュールに更新のプロシージャを書きました。

```vb
Sub Tokei()

  Dim T As Date

  T = CDate(Format(Now() + TimeValue("00:01:00"), "hh:mm:00"))

  UserForm1.L_Time.Caption = Format(Now(), "hh:mm")
  Application.OnTime T, "Tokei"

End Sub
```
---------------------------

イベントプロシージャで、ブックを開いたときに最小化してユーザーフォームを表示させます。
```vb
Private Sub Workbook_Open() 'ブックを開いたら
  
  Tokei '時間をリアルタイム表示
  
  Application.WindowState = xlMinimized 'ウインドウを最小化
  UserForm1.Show vbModeless 'ユーザーフォームを立ち上げる
  
End Sub
```

```vb
Private Sub Label1_Click() 'Closeラベルをクリックしたら

  Application.DisplayAlerts = False '警告メッセージを無効化
  UserForm1.Hide  'ユーザーフォームを閉じる
  ThisWorkbook.Save 'ブックを上書き保存
  Application.DisplayAlerts = True '警告メッセージを有効化
  Application.Quit 'これがないとガワが残る
                  ' Closeメソッドは余計だった
  
End Sub
```
デスクトップに保存して、開くとデスクトップ上には時間が表示されているユーザーフォームのみがある状態になります。

![デスクトップ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/74d0e184-11fc-7939-a62f-8567bbf90fee.png)

時間の真下のCloseをクリックしてアプリケーション終了

![デスクトップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812230/16ef01f7-4089-434c-c056-ebc269e3efd0.png)
障害が起きたときに読む、障害の心得

## まずはユーザーが使える状態に復旧しましょう

- 回避策があれば周知しましょう
- フィーチャーフラグを切り替える、バージョンを戻すなどで動いていた状況に戻しましょう

**<font color="Red">エラーの原因を探して恒久対応に取り組まないでください</font>**

すぐに復旧できない場合は次に進んでください

## 影響範囲と深刻度を確認しましょう

- 誰に影響がありましたか?
- 今後誰に影響が及ぶと考えられますか?
- ユーザーのどの操作が不可能になりましたか?

影響範囲全てに対して対策、現状を周知しましょう

**<font color="Red">エラーの原因を探して恒久対応に取り組まないでください</font>**

被害状況が深刻であった場合、次に進んでください

## 全力で対処してください

ここまで到達している時点で緊急事態です。関係するエンジニアを集め、現状の把握と現場の対応、及び暫定対応に全力を注いでください。

---

## 障害の暫定対応お疲れ様でした

まずは現状を整理して、障害報の作成に取り組んでください。確認事項は前述にもあるとおりですが、まずは被害の深刻度、影響範囲を明らかにしてください。そして現状を周知して、現場の混乱を防げているかを再度確認してください。

混乱が収まってから、ゆっくりと原因調査及び恒久対応に取り組みましょう。再発防止策も作成することをお忘れなく。
『はじめてのQiita』KADOKAWAの事件を受けてIT初心者がやったこと

はじめての投稿です。

本題の前に軽く自己紹介をしますね。
私、新卒で入社した会社を1年ちょっとで離脱してIT業界に飛び込み、現在SESで化石金融システムの運用オペレータを1年半程やっているというお察しの経歴です。長時間労働3交代勤務に加え、長くオペレータをやる人達を見ていると（具体的にどうとは言いませんが……）出社するたびに、ここに長く居てはいけないという気持ちが強くなる一方なので、何か行動しようと決意しました。
いくつか資格を取得したのですが（CCNA,LinuC Level1等）典型的な「資格だけ持ってる何も分かっていない奴」なため、記事を書いてアウトプットしようと思いQiitaにやってきました。

Qiitaの記事を眺めていると、意外と初心者の体験談的なものが少ないと気付き、勉強内容のまとめのような知識ベースではなく、経験したことの記事を書いていこうと思いました。
何事もはじめては信じられない位腰が重いので内容選びに困っていたのですが、ちょうど世間ではセキュリティ関連のニュースが闊歩しているため、これに乗っかっていきましょう


KADOKAWAがランサムウェア被害に遭い、情報漏洩してしまった事件は改めて言うまでもなく有名ですね。
そのニコニコ公式から、
「ニコニコアカウントと同じパスワードを他サービスでもお使いの場合は、パスワードを変更することを推奨いたします。」
という声明が発表され、自分を省みると「パスワード色々使いまわしてる気がするけど、そもそもニコニコのパスワード覚えてないな」という悲惨な有様のため、気が遠くなりそうです。IT業界（末端）に居るくせに、こんなにセキュリティ意識が低い人間が居るとは……

超初級セキュリティの見直し、ということで以下を実施していきたいと思います。
1　パスワードの変更・管理の見直し
2　ランサムウェア対策


1　パスワードの変更・管理の見直し
まず、パスワード自体を見直す前に、パスワード管理ソフトを入れた方が良いのでは?
ということで、lastpass、1Password等比較していたらふと気づく。Googleパスワードマネージャーにパスワードは片っ端から保存しているではないですか。（Android民）
あ～、パスワードマネージャー使ってたくせに、2段階認証の設定すら行っていない。googleのパスワード漏れたら即アウト案件ですよ。
ということで、以下の記事を参考にgoogleアカウント2段階認証の設定を行いました。

https://excesssecurity.com/google-2-step-verification/


こちらのサイトで丁寧に解説してくださっているので詳細は省きますが、やたらと電話番号を入力させようとしてきますね。入れませんけど。
ここでバックアップコードの取得しました。このコード管理、結局パスワード管理ソフトを入れた方が良いですよね。でも、寄り道してたら終わる気がしないので、それはまた今度。
2段階認証は認証アプリを使用します。google Authenticatorでも良かったのですが、icloudにも対応しているMicrosoft Authenticatorにしました。
以下の記事参照して設定を行いました。


https://pc-karuma.net/google-account-turn-on-2-step-verification-iphone-app-authenticator/

QRコード読み取りと手動でコードを入力する方法があるので、まずは手動入力してみました。（端末1つで設定を終えたかったため）
ん〜、何回やっても6桁のコードで弾かれますね。

![無題41_20240705225339.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815393/d272b21c-ea86-3360-0bfc-acf3f00dca7b.png)



結局QRコードで設定しました。端末1つしかない人はどうしたら良いんでしょうね。

グダグダでしたが、2段階認証設定ができました。自分の中では素晴らしい進歩です。

しかしここからが大変ですね……パスワード1つ1つ見直してきます（結局パスワード管理アプリ入れました……）


2　ランサムウェア対策

ランサムウェアとは
ランサムウェアとは、マルウェア（悪意のあるプログラム）の一種で、ファイルを暗号化し、その解除と引き換えに金銭を要求する手口のことです。
特徴として、二重恐喝と呼ばれるものが多く、データを暗号化し、復号に金銭を要求することに加え、対価を支払わなければデータを公開するといった二重で金銭を要求する手口が多いとのことです。今回の事件もまさにこれですね。


ランサムウェアの感染予防策
Webサイトのフィルタリングや定期的なバックアップ等様々な手法がありますが、ここでは、ウィルス対策ソフトの見直しに注目してみました。
ウィルスセキュリティソフトの第三検証機関 av-comparativesを参照しました。

https://www.av-comparatives.org/tests/business-security-test-march-april-2024-factsheet/

なんと、標準で導入されているMicrosoft Defenderがかなり優秀ではありませんか。新たにウィルスセキュリティソフトを購入する必要ないですね。（既に入れていたセキュリティソフトがMicrosoft Defender以下の性能であることが分かり削除しました。ショックでした。）
こちらでもランサムウェア対策の設定ができるため、行っていきましょう。

設定＞プライバシーとセキュリティ＞Windowsセキュリティ＞ウィルスの脅威の防止＞ランサムウェア防止の管理
内の「コントロールされたフォルダーアクセス」をオンにします。

![スクリーンショット 2024-07-06 220805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815393/7b7299f4-fbf9-de47-6087-0e794e8c1f15.png)

ランサムウェア対策が思っていたよりずっと簡素になってしまいました。（そもそも、パスワード変更や2段階認証がランサムウェア対策じゃないですか・・・）

KADOKAWAランサムウェア事件を受けた、超初級セキュリティ対策は以上です。
KCNA向け勉強メモ #3

#1, #2に続いてKCNA(Kubernetes Cloud Native Associate)受験前の最後の見直しに使う資料として作成

https://qiita.com/y-vectorfield/items/e2a5d35b24e5d9871085

https://qiita.com/y-vectorfield/items/70692b43a7f73a74e5ec

# Harbor
* CNCF(Cloud Native Computing Foundation)の一部であり、オープンソースのコンテナレジストリを提供している

# DaemonSet
* クラスターのすべてのノードでポッドのコピーを実行する機能を提供

# Jaeger
* 可観測性の分野で主要なプロジェクト
* 分散トレーシングシステムであり、マイクロサービスアーキテクチャでのデバッグやパフォーマンスの分析に役立つ

# 特定のラベルを持つPodを表示するコマンド

```bash
kubectl get pods --selector=<label>
```

# CoreDNS
* CNCF landscapeで主要なDNSプロジェクト

# kubeadm
* クラスターを構築する

# Datadog
* クラスターを監視する

# kubelet
* ノード上で実行され、そのノード上のポッドの生存状態を監視し、必要に応じて再起動や再作成を行う

# スケール数を変更するコマンド

```bash
kubectl scale deployment nginx-deployment --replicas=N
```

# 任意のラベルが付いたPodを削除するコマンド

```bash
kubectl delete pods --selector=<label>
```

# Yaml形式で表示するコマンド

```bash
kubectl get pod nginx-pod -o yaml
```

# Cloud Native Trail Map
* クラウドネイティブ化までのステップを示したもの

# Cloud Native Landscape
* Cloud Nativeなサービス一覧

# etcd
* プライマリクラスターデータソース
* Kubernetesクラスター内の全体的な状態を格納し、維持するための分散キーバリューストア

# API Server
* オブジェクトのデプロイと管理に対するすべてのリクエストは「API Server」にポストされる

# ストレージ
* TiKV
* Vitess
* Rook

# 以前終了したコンテナのログを出力するコマンド

```bash
kubectl logs -p -c nginx web
```

# Natray
* コンテナイメージに暗号化署名を付与するプロジェクトで、配布されているコンテナイメージが、途中で改ざんされていないことを署名によって確認できる(Notaryは"公証人"という意味)
Raspberry Pi Zero GPIO周辺メモ

Raspberry Pi Zero W
```
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.103+ #1529 Tue Mar 8 12:19:18 GMT 2022 armv6l GNU/Linux
```

### GPIO状態確認

Physical -> 物理番号
BCM -> BCM対応
Mode -> IN=入力/OUT=出力
V -> 1=high/0=low

```
$ gpio readall
 +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 0 | IN   | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | IN   | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+-Pi ZeroW-+---+------+---------+-----+-----+
```

### PIOコマンド

GPIOモード設定
```
$ gpio -g mode [BCM番号] out
$ gpio -g mode [BCM番号] in
```

GPIOの出力
```
$ gpio -g write [BCM番号] 1
$ gpio -g write [BCM番号] 0
```

GPIOの入力
```
$ gpio -g read [BCM番号]
```

### for example

GPIOコマンドでBCM20番（物理番号38）の設定を変更
```
$ gpio readall
$ gpio -g mode 20 out
$ gpio readall
$ gpio -g write 20 1
$ gpio readall
$ gpio -g read 20
1
```
AWS S3「私とデータベース、どっちが大事なの！」（CDKでS3のバージョニングとオブジェクトロックを実装）

## はじめに
__データベースは慎重に設計するのに、S3はデフォルトの設定に任せていませんか。__

ただのログファイルだったり、ドキュメント管理程度に使用しているなら全く問題ないですが、システムに組み込まれた重要なバケットであるにも関わらず何も意識せず実装していたということが私自身ありました。
今回はS3を守るために設定したい二つの機能と、それをCDKで実装する方法について調査した内容をまとめました。

## バックアップの機能を果たす「バージョニング」
S3のバージョニング機能を用いると、オブジェクトに自動的にバージョンを付与してくれます。
これによって万が一オブジェクトを削除してしまってもバージョンを指定して復元することができるようです。

詳しくはこちら
[【図解あり】Amazon S3バージョニング機能を用いる理由](https://envader.plus/article/62)

### CDKで実装

[→公式ドキュメントから参照](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.Bucket.html#example)
~~~typescript
import { RemovalPolicy } from 'aws-cdk-lib';

new s3.Bucket(scope, 'Bucket', {
  // ...省略
  versioned: true, // バージョニングを有効化
});
~~~

## S3オブジェクトを守る「オブジェクトロック」
S3オブジェクトロックを用いると、バケット内のオブジェクトを上書きしたり削除したりする操作を不可能にすることができます。このロックを突破する条件は設定するモードによって選ぶことができます。

#### リテンションモード
ロックする期限を設けて、期限が来ると解除されます。
リテンションモードはさらに「ガバナンスモード」と「コンプライアンスモード」という二つのモードに分けられます。
ガバナンスモードでは特別な権限を持つロールを使用すればロックを突破できます。
コンプライアンスモードではいかなる権限を持っていてもロックを解除できず、期限が来るのを待つしかありません。

#### リーガルホールド
無期限でロックされます。
ロックを突破するには特別な権限が必要です。

こちらを参考
[AWS S3のオブジェクトロックの機能](https://qiita.com/suzuki-navi/items/d29ca26be7aca93c9045)

### CDKで実装
複数のモードがあるということでしたが、リーガルホールドは公式のCDKドキュメントで見つからなかったのでガバナンスモードのやり方のみ掲載します。（リーガルホールドもし見つけたら教えてください。）

[→公式ドキュメントから参照](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3.ObjectLockRetention.html#example)
~~~typescript
// ガバナンスモード
new s3.Bucket(this, 'Bucket1', {
  objectLockDefaultRetention: s3.ObjectLockRetention.governance(Duration.days(7 * 365)),
  // 有効期限は7年
});

// コンプライアンスモード
new s3.Bucket(this, 'Bucket2', {
  objectLockDefaultRetention: s3.ObjectLockRetention.compliance(Duration.days(365)),
  // 有効期限は1年
});
~~~

## 結論
「そんなこと言わせてごめんね」
スクラムチームから退職者が出た場合の対処法


## はじめに

スクラム開発を行っていると、チームメンバーの退職という事態に直面することがあります。これはどのチームにも起こり得ることで、特に小規模なチームでは大きな影響を及ぼすことがあります。この記事では、スクラムチームから退職者が出た場合の対処法について、具体的なステップとともに解説します。

## 1. 退職の影響を最小限に抑えるための準備

### 1.1 ドキュメントの整備

退職者が出る前に、常にドキュメントを整備しておくことが重要です。コードのコメントや設計書、テストケースなど、誰が見ても理解できるようにしておくことで、退職者が出た際の影響を最小限に抑えることができます。

### 1.2 知識の共有

定期的に知識共有のセッションを行い、チーム全体でスキルや知識を共有することも大切です。これにより、特定のメンバーに依存しない体制を作ることができます。

## 2. 退職が決まったら

### 2.1 早期の情報共有

退職が決まったら、できるだけ早くチーム全体に情報を共有しましょう。これにより、他のメンバーが心の準備をする時間を持つことができます。

### 2.2 引き継ぎの計画

退職者と一緒に引き継ぎの計画を立てましょう。具体的には、どのタスクを誰に引き継ぐか、どのように進めるかを明確にします。引き継ぎの際には、ドキュメントやコードの説明だけでなく、実際に手を動かしてもらうことが効果的です。

## 3. 退職後の対応

### 3.1 チームの再編成

退職者が出た後は、チームの再編成が必要になることがあります。新しいメンバーを迎える場合は、オンボーディングプロセスをしっかりと設け、スムーズにチームに溶け込めるようにサポートしましょう。

### 3.2 振り返りと改善

退職者が出た後は、チーム全体で振り返りを行い、何がうまくいったか、何が改善できるかを話し合いましょう。これにより、今後同じような事態が発生した際に、よりスムーズに対応できるようになります。

## まとめ

スクラムチームから退職者が出た場合、影響を最小限に抑えるためには、事前の準備と迅速な対応が鍵となります。ドキュメントの整備や知識の共有、早期の情報共有と引き継ぎ計画、そして退職後の振り返りと改善を通じて、チーム全体で乗り越えていきましょう。
スクラムチームに新規参加者がいる場合の成功体験とベストプラクティス


## はじめに
スクラム開発において、新しいメンバーがチームに加わることはよくあることです。しかし、新規参加者がスムーズにチームに溶け込むためには、いくつかの工夫が必要です。この記事では、私の経験をもとに、新規参加者がいる場合のスクラムチームの成功体験とベストプラクティスについて紹介します。

## 新規参加者のオンボーディング
### 1. ウェルカムミーティングの実施
新規参加者がチームに加わった初日には、ウェルカムミーティングを開催しましょう。このミーティングでは、チームメンバー全員が自己紹介を行い、プロジェクトの概要や現在の進捗状況を共有します。これにより、新規参加者はチームの一員としての意識を持ちやすくなります。

### 2. メンター制度の導入
新規参加者には、経験豊富なメンバーをメンターとして割り当てることをお勧めします。メンターは、新規参加者がプロジェクトやツールに慣れるまでの間、サポートを行います。これにより、新規参加者は疑問や不安を解消しやすくなります。

## コミュニケーションの強化
### 1. デイリースクラムの活用
デイリースクラムは、チーム全員が毎日顔を合わせる貴重な機会です。新規参加者がいる場合は、特にこのミーティングを大切にしましょう。新規参加者が発言しやすい雰囲気を作り、進捗や課題を共有することで、チーム全体のコミュニケーションが円滑になります。

### 2. オープンな質問環境の提供
新規参加者が質問しやすい環境を整えることも重要です。チーム内で「質問は歓迎される」という文化を醸成し、どんな小さな疑問でも気軽に質問できるようにしましょう。これにより、新規参加者は早期にプロジェクトに貢献できるようになります。

## 技術的なサポート
### 1. ドキュメントの整備
プロジェクトのドキュメントを整備し、新規参加者が必要な情報にすぐアクセスできるようにしましょう。特に、開発環境のセットアップ手順やコードベースの概要、使用しているツールの使い方などを明確に記載しておくことが重要です。

### 2. ペアプログラミングの実施
ペアプログラミングは、新規参加者がチームの開発スタイルやコードベースに早く慣れるための効果的な方法です。経験豊富なメンバーと一緒に作業することで、新規参加者は実践的なスキルを身につけることができます。

## まとめ
新規参加者がスクラムチームにスムーズに溶け込むためには、オンボーディングの工夫やコミュニケーションの強化、技術的なサポートが欠かせません。これらのベストプラクティスを実践することで、新規参加者は早期にチームに貢献できるようになり、プロジェクト全体の成功につながります。皆さんもぜひ、これらの方法を試してみてください。
OpsRamp Logs - Azureログ転送のサンプル設定

本記事では、OpsRamp LogsのAzure ログ転送のサンプル設定について説明します。

# 概要
OpsRamp Logsでは、Event HubsおよびFunction Appを使用し、Activity logやLog Analyticsのログを取り込むことができます。

# 設定方法
Infrastructure > Logs 画面左上のハンバーガーマークのLog Configuration > Azureをご参照ください。
Event HubsおよびFunction App、Activity logまたはLog Analyticsの設定が必要になります。

- Event Hubsの設定
Event HubsからEvent Hub NamespaceおよびEvent Hubを作成します。
![Create_EventHubsNamespaces.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/4df4ca85-810f-83fd-9161-268f62399a08.png)
![Create_EventHub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/a548d404-1f32-54a7-a628-862b040cc37d.png)

- Function Appの設定
Function AppからOpsRampにログを送信するための関数を設定します。
Runtime stackにPowerShell Core、Operating SystemにWindowsを選択します。
![Create_FunctionApp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/58a2d4c2-db41-cf3b-5b19-39a3208edf94.png)
作成したFunction Appから関数を作成します。
テンプレートにAZURE Event Hub Triggerを選択します。
![Create_FunctionApp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/effda313-d5d2-bc7d-a9ec-37259bd29973.png)
テンプレート詳細設定では、Event Hub connectionおよびEvent Hub nameに作成したEvent Hubを選択します。
![Create_FunctionApp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/5da0d9d7-67a0-dfc9-446c-1a1db42fbe6d.png)
コードボックスにOpsRampのAzure設定の5. CREATE A FUNCTION IN THE FUNCTION APP
からコピーしたコードをペーストし、保存します。
![Create_FunctionApp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/be823558-8af0-e50f-64cd-ff758a6fed74.png)

- ログ転送設定 (Activity logまたはLog Analytics)
    - Activity log
    Activity logのExport Activity logsからログの転送設定を行います。
    ![Activitylog_Export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/d039d811-d15f-cf00-6fc2-7834a76065c5.png)
    転送するログカテゴリを選択し、Stream to an event hubから作成したEvent Hubを選択します。
    ![Activitylog_ExportRule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/2de4d2c0-ed53-903e-1d64-dc08d8c3fb6c.png)
    - Log Analytics
    Log AnalyticsのData exportからログ転送設定を行います。
    ![LogAnalytics_DataExport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/cba2855f-ef27-fcf1-c4a5-ff3965733c75.png)
    任意のルール名を入力します。
    ![LogAnalytics_DataExportRule1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/c431286f-e7b4-37a2-6c9d-d836a1a06d47.png)
    転送するログテーブルを選択します。
    ![LogAnalytics_DataExportRule2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/d33217db-2b3d-e4d8-e7ae-97f9339a9ea0.png)
    作成したEvent Hubを選択します。
    ![LogAnalytics_DataExportRule3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/c56c87e9-bbc1-d9b5-4470-8597a369304e.png)

---------------------------------------
[<img width = 250 height = 200 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344939/111de30a-4d33-aa33-5c7d-83d9015093e6.png">](https://www.vistanet.jp/knowledge-base/)
【Reactアプリ100本ノック】13 Chat

![react-chat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/e1777b7e-1fae-9558-87e0-f50ea52c8927.png)

# はじめに

<h3>こんにちは！！ Watanabe Jin (@Sicut_study)です！</h3>

https://qiita.com/Sicut_study/items/78910cd8d103b8d45a73

こちらの記事が嬉しいことに多くの方に見ていただきました。
そこで**React**が多くの初心者の方に注目されているんだなということを実感させられました。

私の記事では何度も言っている通り

<font color="red"><h4>最速で学ぶならとにかく何か作る</h4></font>

というのが大事になってきます。そこで **「Reactアプリ100本ノック」** というのに挑戦していこうかと思います。徐々に難易度を挙げていってどこまでお題を作りきれるかの腕試しでやっていただければと思います。

今回はReactというよりは、サーバーよりのことが多くなるかと思いますが選択肢が増えるであろうソケット通信について学びます

# Reactアプリ100本ノックルール

- 主要なライブラリやフレームワークはReactである必要がありますが、その他のツールやライブラリ（例: Redux, Next.js, Styled Componentsなど）を組み合わせて使用することは自由
- TypeScriptを利用する
- 要件をみたせばデザインなどは自由

# 前回のお題

# 13. Chat

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/9751da0c-2881-d1de-0a9c-41ab3f9b47fd.png)

## 問題

簡単なリアルタイムのチャットツールを作ります

## 目的

LINEなどで利用されるソケット通信を使ったツールを作り、仕組みについて学びます
socket.ioの使い方を学ぶことで、選択肢が広がります

## 達成条件

- リアルタイムでチャットができること
- 入力フォームとボタンがある
- 送信を押すと、別のウィンドウで開いたアプリに送信内容が表示される
- ソケット通信には[Socket.io](https://socket.io/)を用いる

## 実際に解いてみた

![chat-sample.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/234df7e4-d60d-2aab-780e-2fd8dafb12f5.gif)

### 利用技術

フロントエンド
- React
- TypeScript
- Vite
- tailwind
- socket.io-client

バックエンド
- express
- nodemon
- socket.io

解答時間 : 0.5時間

サーバーに関しては以下の動画をみて実装しました

https://www.youtube.com/watch?v=dSllP4TRJls

ここまでのお題を解いてきた方ならフロント側は難しくないかと思います。
もう少し難易度をあげるならLINE風のUIにしてみるのもよいかもしれません

ソケット技術は色々幅が広がるので今回はサーバー側の実装が必要なお題にしてみました！

# 次のお題

Comig Soon...

# おわりに

React100本ノックの記事を地道に上げていこうと思いますので、一緒に挑戦したい方は @Sicut_study をフォローいただけるととてもうれしく思います。

ここまで読んでいただけた方は**いいね**と**ストック**よろしくお願いします。
@Sicut_study を**フォロー**いただけるととてもうれしく思います。

今週もプログラミング頑張りましょう！

![jisou-banner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/217ea52d-8130-3266-0619-990fa968408a.png)

# おすすめ記事

# About Me

Webエンジニア転身して1年間本気で勉強
転職ドラフトで高額オファーを複数獲得
そこでの経験からアウトプットやマインドセットの発信に強みがある
エンジニアをやりながら、起業に挑戦中
アイデア作りやパブリックスピーキングを得意としてる

■ Twitter
https://twitter.com/Sicut_study
■ Instagram
https://www.instagram.com/himariajin
■ Youtube
https://www.youtube.com/channel/UCBFrGAJhPuuaoLwUIHBILsA
■ TikTok
https://www.tiktok.com/@sicut_study
■ プログラミングコーチングJISOU
https://projisou.jp
■ 登壇依頼などご依頼はこちらから
himaria.jin.watanabe@gmail.com

# 参考

https://www.youtube.com/watch?v=dSllP4TRJls
IBM i Services Directory : QSYS2.SysDiskStat ビュー　HDD, SSD,NVMeストレージの情報を返す

[NVMe_Info ビュー](https://qiita.com/gomAnomalocaris/items/ae0e95f1bbc1c1597a67)はNVMeに特化した情報取得でした。こちらはNVMe, HDD, SSDストレージについて情報を返すビューです。

## 概要
■表名：QSYS2.SYSDISKSTAT
■カテゴリ：ストレージサービス
■サポート：IBM i 7.2 base
■参照URL（IBM i 7.5）：https://www.ibm.com/docs/ja/i/7.5?topic=services-sysdiskstat-view

## 使用例

***すべてのHDD, SSD, NVMe の情報を返します。***
```
SELECT * FROM QSYS2.SYSDISKSTAT
```

***ソリッドステートディスク（NVMeとSSD）を返したい場合は、、UNIT_TYPE=1を指定します。***
```
SELECT * FROM QSYS2.SYSDISKSTAT WHERE UNIT_TYPE = 1
```

***HDDだけ返したい場合は、UNIT_TYPE=0です。***

```
SELECT * FROM QSYS2.SYSDISKSTAT WHERE UNIT_TYPE = 0
```

以下、実行例です。

***UNIT_TYPEを指定せず全てのストレージ装置を返します。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/a9841641-8508-abe9-9123-de2941cfda06.png)

***上記のシステムはPOWER10でNVMeしか搭載されていません。結果、UNIT_TYPE,UNIT_NVMeどちらも1が返されています。***

***UNIT_TYPE=0を指定し、HDDの情報を返します。***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/301cacf6-3a3d-f302-834a-21c89ba3e59a.png)

***このシステムはUNIT_TYPE=0, UNIT_NMVEはどちらもすべて0のオールHDDです。***
***下から4行目を見ると、ASP NO = 0, UNIT_STORAGE_CAPACITY = 0です。これは4行目のストレージがIBM i OSからみて非構成状態（ASPとしてOSに組み込んでいないがハードウェアとしては見えている状態）だからです。***

SSDの構成は見つかりませんでした・・

### 各カラムを見ていくと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/9c70fd5c-d0c4-97be-90cc-f06e2596a9fa.png)

***PERCENT_USEDはストレージ使用率%ですね。***
***容量GBも表示されます***

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/09cd5f7f-e3b4-0cba-e768-025739d6a682.png)

***ディスク保護（ミラーリング）がアクティブな事も分かります***
***MIRRORED_SUBUNITにA, B がありどちらの系統のストレージかは分かります。どれがペア同士かは・・？***

***HYPERSWAPまでありました！ハイパースワップはIBMストレージ機能で複製し、かつ、障害時の切替もやってくれる優れものです。海外では結構事例が多いようです。***

※近々日本のお客様で構築予定ありと聞いていますのでそのシステムで試してもらおうと思います♪

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/7f454780-7489-6eb8-d031-d960484b4a0d.png)

ディスク入出力回数も細かくデータが取れていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/60105924-1bb5-723b-9dfe-006f1b06b533.png)

***ELAPSED_XXXのIO回数は最初にこのSQLセッションからこのSQLを実行した点を起点に統計がとられるようです。統計リセットするには別セッションに入りなおすしかないようです。。。***

この不便さを補うのが、SYSDISKSTAT()表関数です。つづく・・・
プロキシのある環境でDockerを動かす方法


記入すべきは
/etc/systemd/system/docker.service.d/http-proxy.conf
※ override.conf じゃダメみたいです。

内容

```
[Service]
Environment="HTTP_PROXY=http://proxy.hogehoge.co.jp:8080"
Environment="HTTPS_PROXY=http://proxy.hogehoge.co.jp:8080"
Environment="NO_PROXY=localhost,127.0.0.1,<自分のipとか、内部で立ち上げてるサーバーとか>"
```

参考→ https://docs.docker.jp/config/daemon/systemd.html
PostgreSQL: プライマリーキーの取得

## プログラム

```py:get_primary_key.py
#! /usr/bin/python
#
#	get_primary_key.py
#
#				Jun/03/2024
#
# --------------------------------------------------------
import os
import sys
import psycopg2
from dotenv import load_dotenv
#
# --------------------------------------------------------
# [8]:
def get_primary_key_proc(cursor_aa,schema,table_target):
#	sql_str = "SELECT tc.table_name, kcu.column_name "
	sql_str = "SELECT kcu.column_name "
	sql_str += "FROM information_schema.table_constraints AS tc "
	sql_str += "JOIN information_schema.key_column_usage AS kcu "
	sql_str += "ON tc.constraint_name = kcu.constraint_name "
	sql_str += "AND tc.table_schema = kcu.table_schema "
	sql_str += "WHERE tc.constraint_type = 'PRIMARY KEY' "
	sql_str += "AND tc.table_name = '" + table_target + "' "
	sql_str += "AND tc.table_schema = '" + schema + "' "
	sql_str += ""
	print(sql_str)
	array_primary = []
	try:
		cursor_aa.execute(sql_str)
		rows = cursor_aa.fetchall()
		print(len(rows))
		for row in rows:
			array_primary.append(row[0])
	except Exception as ee:
		sys.stderr.write("*** error *** in get_primary_key_proc ***\n")
		sys.stderr.write("*** error *** in cursor_aa.execute ***\n")
		sys.stderr.write(str(ee) + "\n")
	return array_primary
# --------------------------------------------------------
sys.stderr.write ("*** 開始 ***\n")
schema = "sch001"
table_target = sys.argv[1]
sys.stderr.write ("%s\n" % table_target)
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
USER=os.environ.get("user")
PASSWORD=os.environ.get("password")
DATA_BASE=os.environ.get("data_base")
#
dsn="dbname=" + DATA_BASE + " user=" + USER + " password=" + PASSWORD
conn = psycopg2.connect(dsn)
cursor_aa = conn.cursor()
#
array_primary_keys = get_primary_key_proc(cursor_aa,schema,table_target)
print(array_primary_keys)
#
conn.commit ()
cursor_aa.close ()
conn.close ()
#
sys.stderr.write ("*** 終了 ***\n")
#
# --------------------------------------------------------
```

```text:.env
user='****'
password='*****'
data_base='*****'
```

実行方法

```bash
./get_primary_key.py grp001001
```

## 参考にした SQL

```sql
SELECT tc.table_name, kcu.column_name
FROM information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
  ON tc.constraint_name = kcu.constraint_name
  AND tc.table_schema = kcu.table_schema
WHERE tc.constraint_type = 'PRIMARY KEY'
  AND tc.table_name = 'grp001001'
AND tc.table_schema = 'sch001';
```