OmniAICreator/Qiita-1.07M huggingface dataset:
AWS SAAの資格持ってる人がAzure Fundamentalsを受けてみた話(特に申し込み方法と受験日付変更の方法について)

# はじめに
こんにちは
クラウドやってますか？
これまで業務ではAWSを使う機会が多かったのですが、最近Azureを使うようになってきました。
なのでAzureの資格(Azure Fundamentals)を取ってみようかと思って取った話です。

ネタバレ：申し込みが最難関

# 試験勉強の前に
資格を取るにはまず受験の申請が必要です。
Azure Fundamentalsであれば[Microsoft LarnのAzure Fundamentals](https://learn.microsoft.com/ja-jp/credentials/certifications/azure-fundamentals/?practice-assessment-type=certification)のページから申し込みできますが・・・  
**まず一回Google検索して申し込み方法を確認してください**
...
...
...
参考:[【解説】Azure試験の申し込み方法
](https://nokonokonetwork.com/certificate/azure/how-to-apply-for-azure-exam.html)

ググりましたか？
重要なのは**氏名と住所はローマ字で入力してください**という部分です。
もちろんページの文書は日本語ですし、試験自体も日本語で受けられるのですが、申込みページで氏名とか住所を日本語で入力するとエラーになります。

これに気づかず1時間ぐらい悩みました。
あとは上記参考ページをみて各種入力をすませてください。

# 受験日付・テストセンターの変更方法
**申込みもして受験日が近づいてきたけど、勉強ができてない！どうしよう！** ってなりますよね。
なるんですよ。
Azure認定試験も他の認定試験と同様に申込後に受験日を変更することができます(受験時刻の24時間前なら)。

その時まごついたのでメモです。(2024年11月現在の情報です。ご注意を)
 1. [Microsoft Learn](https://learn.microsoft.com/)にアクセスし、自身のプロファイルページから資格証明 > 認定資格のタブを表示し、再スケジュールを押下
 　![スクリーンショット 2024-11-14 142518.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865945/978cfce2-c27c-a302-9080-8f43e6f9b209.png)


 2. ピアソンＶＵＥへの転送ページに行くので**ローマ字で**住所等を入力  
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865945/0bcf7d3c-e635-91f7-06c3-8e2712d04795.png)


 3. 送信後、中央の試験の検索を無視して左のナビバーの木構造みたいになってるアイコンを押下
     ![スクリーンショット 2024-11-14 142557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865945/e2475348-eefb-b960-3647-3cc406b6029e.png)

 4. 予約が表示されるので中央の試験のリンクを押下
    ![スクリーンショット 2024-11-14 142229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865945/c77b6ad9-1527-c191-11ad-ab7d3508accb.png)

 5. おめでとうございます。予約変更から受験日時・テストセンターの変更が行えます。
     ![スクリーンショット 2024-11-14 143422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865945/7580d5e1-6718-58e7-6b08-3b105cc4ea0f.png)

# 勉強方法について
Azure Fundamentalsはクラウドの基礎的知識を問う認定資格です。
AWS SAAを取っているのでそこまで悩みませんでした。
AWSと違う部分は以下かなと思ってます。(もちろんサービス名も違いますが、ベストプラクティスは似たような感じです。)
- Azureのアカウントの構造(管理グループ、サブスクリプション)
- リソースにリソースグループが*必ず結びつく*点
- Azure以外のMicrosoft製品との結びつき

具体的な勉強法は他の型もおすすめしているように以下udemy講座が役に立ちました
- [【AZ-900合格講座】Azureを基礎からしっかりと学びたい方へ（講義・演習・問題の3部構成で理解を深めよう！）](https://www.udemy.com/share/108xOa/)
- [最短で合格！Azure Fundamentals AZ-900 試験対策問題集](https://www.udemy.com/share/106ezY/)

基本的には試験対策問題集をして、わからないところがあれば講座を見る、ような形で勉強を進めました。
問題集は8割ぐらい解ける、ぐらいの状態で受験日を迎えましたがなんとか合格できました。

# 未来へ
申込みから試験まで一回できてしまえばこっちのものです。
どんどんAzureの資格とっていきましょう。
rex0220 計算式プラグイン レコードへのリンク

計算式プラグインで、レコードへのリンクを作成してみます。

# 概要

文字列・リンク・スペース項目で、レコードへのリンクを作成する。
計算式に「レコード番号」、「$id」を指定すると、新規レコード保存完了時に計算処理を実行しレコードを更新します。

スペース項目には、タイトルとレコード番号を表示するリンクを作成します。

![2024-11-16_14h23_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/7fa1a144-ee7d-ff48-bb95-e1e83155d4fe.png)

# 計算式プラグイン設定

ドメインは、xxxxxx の部分を kintone のドメインに変更してください。
"https://" は、// 以降がコメントになるので、"https:/"&"/" と記述します。

3233 は、対象のアプリ番号に変更してください。

スペース項目で、ラベルを表示する場合は、配列で指定します。
※ARRAY(ラベル,ラベルの書式,値,値の書式)

![2024-11-16_14h24_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b1d8b630-81c9-919f-d540-b1525c119a29.png)

```.js
// レコード番号1 SINGLE_LINE_TEXT
レコード番号

// レコードリンク SINGLE_LINE_TEXT
"https:/"&"/xxxxxx.cybozu.com/k/3233/show#record="&レコード番号

// リンク LINK
"https:/"&"/xxxxxx.cybozu.com/k/3233/show#record="&レコード番号

// sp1:(sp1) SPACER
"<a href='/k/3233/show#record=" & レコード番号 & "' target='_blank'>" & タイトル & " (" & レコード番号 & ")" & "</a>"

// sp2:(sp2) SPACER
ARRAY(
"リンク","",
"<a href='/k/3233/show#record=" & レコード番号 & "' target='_blank'>" & タイトル & " (" & レコード番号 & ")" & "</a>",""
)
```
ffufのwordlist.txtを用意する方法


TryHackMeでParrotを使用しています。
使用したいwordlist.txtがプリインストールされていませんでした。
取得する方法をメモ書きします。

1. SecList
こちらのリポジトリからzipをダウンロード＆解凍（コピペコマンド有）
https://github.com/danielmiessler/SecLists

2. ffuf公式のwordlist
こちらの公式ページよりダウンロード（コピペコマンド有）
http://ffuf.me/wordlists
相関行列を表示し、ヒートマップを描画する方法

:::note info
**本記事で学べる事**
- 相関行列を表示
- ヒートマップを描画
:::

最終的に↓のようなヒートマップを描画できるようになりましょう！！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/8313a701-ac03-29a9-113d-6507a643b0cd.png" alt="heatmap" width="400">


## 事前準備
```python
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
```

## 任意のデータフレームを作成
今回は、５種類の株を想定し、それぞれの株価が１か月間完全にランダムに変化する場合を考えます。そして、それぞれの株の値動きの相関を調べてみます。

まずは、適当にデータを用意します。
```python:データフレームを作成
dates = pd.date_range("2022-01-01", periods=30, freq='D')
stocks = ['A', 'B', 'C', 'D', 'E']
data = pd.DataFrame({
    'date': np.tile(dates, len(stocks)), 
    'stock': np.repeat(stocks, len(dates)),  
    'value': np.random.uniform(0, 1, len(dates) * len(stocks))
    })
```
それぞれのコードについての説明です。
- `pd.date_range`
    - pandasの関数で、開始日から終了日、または特定の期間にわたる日付のリストを作成。
    - 引数
        - `"2022-01-01"`: 範囲の開始日。ここでは2022年1月1日から始まる。
        - `periods=30`: 日付の数を指定。。ここでは30日間の日付を生成する。
        - `freq='D'`: 日付の増加間隔を指定。**'D'**は「1日単位」の頻度を意味する。
- `np.tile(dates, len(stocks))`
    - NumPyの関数で、指定した配列（dates）を`stocks`の種類分複製する。

## データフレームをピボットテーブル形式に再構成する
```python:相関行列の表示
data_pivot = data.pivot(index='date', columns='stock', values='value')
corr_matrix = data_pivot.corr()
corr_matrix 
```
※コードについての説明です。
- `data.pivot`
    - `date`を行インデックス`stock` を列名として、各セルに `value` を配置したデータフレームを作成する。
## 相関行列の表示
実行すると、↓のように相関行列を表示できます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/bc53f1ab-8992-b02a-d479-59d9e1a48b8d.png" width="400">

## ヒートマップの作製
ヒートマップの描画には、`serborn`というライブラリを用います。
```python:ヒートマップの描画
plt.figure(figsize=(12, 8))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", center=0)
plt.title("Stock Close Price Correlation Heatmap")
plt.show()
```
すると、ヒートマップを描画できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/8313a701-ac03-29a9-113d-6507a643b0cd.png)
最も相関係数が高いペアは、A-Bの0.089となることがわかります。

※それぞれのコードについての説明です。
- `sns.heatmap`
    - seaborn ライブラリの関数で、2次元データ（ここでは相関行列）をカラーマップで可視化する。
    - 引数の説明:
        - `corr_matrix`: 描画するデータ（相関行列）。行と列に株式名が対応し、各セルには相関係数が格納されている。
        - `annot=True`:各セルに数値（相関係数）を表示。
        - `cmap="coolwarm"`:カラーマップを指定。青（負の相関）から赤（正の相関）へのグラデーション。
        - center=0:カラースケールの中央値を0に設定。負の相関が青、正の相関が赤で明確に分かれる。



## 発展～最も相関係数が高いペアのみを抜き出す～
1. まずは、上三角行列のみを取得し、対角成分を含まないようにします。
```python
upper_triangle = corr_matrix.where(~np.tril(np.ones(corr_matrix.shape)).astype(bool))
upper_triangle
```
すると、上三角行列のみの値を返し、それ以外は`NaN`で返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/49d87d02-73a3-5df8-1474-bf4b18ed329c.png)

2. 最大の相関を持つペアを取得します。 
```python
max_corr_pair = upper_triangle.stack().idxmax()
print("最も相関が高いペア:", max_corr_pair)
```
とすると、無事、最も相関係数が高い`A-B`のペアを抜き出せました！！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/89a0dfbb-a4ea-b320-acb8-83e0ae3d950a.png" width="200">
UVを使った環境構築とDockerコンテナのセットアップ

以前はPoetry派でしたが

https://qiita.com/phlin0424/items/88e1391b2d8e24991048


最近`UV`を使うことになったので`Dockerfile`を更新したいと思います。



```dockerfile
# Pythonをインストール
FROM python:3.12-slim

# ワークディレクトリパスを指定
WORKDIR /app

# UVをインストールに必要なライブラリをインストール
RUN apt-get update -y \
    && apt-get install -y curl ca-certificates \
    && apt-get -y clean all

# UVのインストール
ADD https://astral.sh/uv/install.sh /uv-installer.sh
RUN sh /uv-installer.sh && rm /uv-installer.sh

# UVを使用するに必要なパスを通す
ENV PATH="/root/.cargo/bin/:$PATH"

# プロジェクトの主要ファイルをコンテナにコピー
COPY README.md uv.lock pyproject.toml /app/

# UV用環境変数の設定
ENV UV_SYSTEM_PYTHON=true \ 
    UV_COMPILE_BYTCODE=1 \
    UV_CAHE_DIR=/root/.cache/uv \
    UV_LINK_MODE=copy

# アプリソースコードをコピー
COPY ./src/app /app

# アプリが使うパッケージをインストール
RUN uv export --frozen --no-dev --format requirements-txt > requirements.txt \ 
    && uv pip install -r requirements.txt

# 外部からアクセスのためポートを開く
EXPOSE 80

```

また、下記のような`docker-compose.yml`にてコンテナーを作成します。

今回は`FastAPI`を使用したアプリを作っているので`uvicorn`を使用しサーバーを立ち上げます。

```yaml
version: "3"

services:
  app: 
    build: .
    ports: 
      - "4000:80"
    env_file: ./.env
    command: uv run uvicorn app:app --host 0.0.0.0 --port 80 --reload
    tty: true
```

`docker-compose up --build`を実行すると`http://0.0.0.0:4000`からアプリへアクセスできるようになります。


以上！
Reditor.jsを作った話

### はじめに
どうもこんにちはれししぐです。
このアカウントに変える前にあるアカウントで活動してました。
公式サイト：https://resisigu.42web.io/resisigu
Scratch：https://scratch.mit.edu/users/resisigu
Discord：@resisigu
プログラミングが好きな中学生です！
## 本題
まあ今回ReditorJSっていうのを作ったんですけど、
きっかけはEditorJSとかTinyMCEっていうやつなんですよね。
EditorJS : https://editorjs.io
TinyMCE : https://tiny.cloud
こう言うの作ってみたいなってことで、
僕の名前 resisigu + editor でReditorと言う名前にしました。
初めて作ったのでネットでコード調べたりでしたが、まあまあ良くなったと思います。
フリーソースではありませんが、
https://resisigu.42web.io/reditor/
で他のところでの埋め込み方を説明しているので使ってくれると嬉しいです。（ファイルをコピーするのは**絶対**にやめてください。）
また、実際に使ってみて欲しい機能とか、改善点等あればコメントで教えてくれるととても助かります。
とりあえず今回はここまで。また更新したら投稿します。
何かあればコメントでお願いします。
フォローもよろしくお願いします！
NISAで貰えるポイント

:::note alert
投資にはリスクがあります。
この記事は投資を勧めるものではありません。
:::

# NISAの仕様
- 一人につき一口座のみ
- 投資商品の売却益、配当金、分配金が非課税
- 非課税保有限度枠は買い付け額で計算
- 売却すると、その元本まで翌年から枠が復活
- 復活した枠によって年間買い付け額は増えない


# 条件
- s&P500を毎月10万購入(ファンドは還元率が最も高いもの)
- 利回り5%
- 5年(600万円)と、15年(1800万円)を調べる
- 会費は差し引く
- 入会特典、ポイントサイト特典などは除く

### 各ネット証券の還元率など
還元率などが同じカードは割愛
| 証券会社 | クレジットカード | クレジット還元率(%) | 保有還元率(%) | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| SBI  | 三井住友カード     | 0.5   |0.0326   | 毎年10万円以上利用
| SBI  | 三井住友カード(金) | 1     |0.0326| 初年度会費5500円、毎年100万円以上利用  |
| 楽天  | 楽天カード        | 0.5     |0.026   |
| 楽天  | 楽天カード(金)    | 0.75    |0.026| 年会費2200円 |
| マネックス  | dカード(～5万)     | 1.1|0.03|5万円以下積み立て
| マネックス  | dカード(5～7万)     | 6.7/7|0.03|7万円以下積み立て
| マネックス  | dカード(7万～)     | 0.75|0.03|
| 松井 | (JCBカード)        | 0.5   |0.0326
| 松井 | (JCBカード(金))    | 1.0   |0.0326 |2年目から年会費11000円
| auカブコム  | au Payカード       | 1       |0.005    |

※JCBカードによる積み立ては2025年5月から

``` main.c
#include <math.h>
#include <stdio.h>

int main() {
  // 積み立て額
  int investment = 100000;
  // 年間利回り(%)
  double yield = 5;
  yield = pow(yield / 100.0 + 1, 1.0 / 12.0);
  // 還元率(%)
  double creditPoint = 0.5;
  // 年間信託保有還元率(%)
  double keepPoint = 0.0326;
  keepPoint = keepPoint / 12.0 / 100.0;
  // 年会費
  int fee = 0;
  // その他金額
  int other = 0;
  // 投資年数
  int years = 5;

  int totalCash = 0;
  int totalPoint = (int)(investment * creditPoint * years * 12 / 100.0);
  for (int i = 0; i < years * 12; i++) {
    totalCash = (int)(totalCash * yield);
    totalPoint += (int)(totalCash * keepPoint);
    totalCash += investment;
  }
  totalPoint -= fee * years;
  totalPoint -= other;
  printf("Total Cash: %d\n", totalCash);
  printf("Total Point: %d\n", totalPoint);
  return 0;
}
```


# 結果
| クレジットカード | 5年ポイント | 15年ポイント
|:-:|:-:|:-:|
| 三井住友カード     |35199|146694
| 三井住友カード(金) |59699|231194
| 楽天カード        |34143|135203
| 楽天カード(金)    |38143|147203
| dカード(5万)     |35377|125036
| dカード(7万)     |43540|157095
| dカード(10万)     |49783| 187167
| (JCBカード)        |35199|146694
| (JCBカード(金))    |21199| 82694
| au Payカード       |60774| 188620
SnowflakeでRAGを構築してみたいそんな方へ　その２ CREATE FUNCTION編

# 1.CREATE FUNCTIONを活用しよう！

RAGを構築する上で、PythonフレームワークのLangchainを活用したいところです。
Snowflakeでは２年ほど前に SnowPark For PythonがGAされています

ここではSnowflakeでPythonを扱いたいそんな人への第一歩になれたらと思います。

# 2.実際に扱ってみよう　その１

まずはfunctionを保管するdatabaseやschemaを作成していきます。

```SQL
create or replace database yusaku_test;
USE database yusaku_test;
create or replace schema function_test;

USE schema function_test;
```

## 2.1 次に実際にUDFを作成していく
```create or replace function```
で関数名を定義して、引数名とそのデータ型の制約の記載をしていきます。
```return```で返す変数の型を設定します。
LANGUAGEを指定することで、UDFをどの言語で作成するかを設定できます。

```sql
create or replace function get_circum_len(diameter FLOAT)
RETURNS FLOAT
LANGUAGE SQL

AS
$$

diameter * pi()

$$
;

--取得テスト
SELECT get_circum_len(3.0);

```


# 3.実際に扱ってみよう　その２ langchain編

次は、LANGUAGEをPythonにしてみます。
```runtime_version```
でどのバージョンのエンジンで実行するかを選択します。
```handler```
は複数の関数がPythonスクリプト内に定義されていることが一般的なため、その場合、handler を指定しないと、どの関数を実行すべきかSnowflake側で判断できません。そのために関数を宣言してあげるのが良いです。

```packages```
でどのフレームワークを使うのかを選択します
今回、Pandasを使いたいところですが、```snowflake-snowpark-python```で内部的に使用されていることから、選択が不要です。

langachainの細かな設定は省きます。また別記事で話すかもです。

関数内で```yield from```を使う理由としては以下の記事を参考にしてください。

https://xkenxkenx.com/efficient-coding-in-python-the-basics-of-yield/


```sql

create or replace function pdf_text_chunker(file_url string)
returns table(chunk varchar)
language python
runtime_version = '3.9'
handler = 'pdf_text_chunker'
packages = ('snowflake-snowpark-python','PyPDF2', 'langchain')
as
$$
import pandas as pd
from langchain.text_splitter import RecursiveCharacterTextSplitter

class pdf_text_chunker:

    def process(self,file_url: str):
        text = file_url
        text_splitter = RecursiveCharacterTextSplitter(
        chunk_size = 50,
        chunk_overlap = 50,
        length_function = len
        )

        chunks = text_splitter.split_text(text)
        df = pd.DataFrame(chunks,columns=['chunks'])

        yield from df.itertuples(index=False, name=None)
$$;

```

## 3.1　実際にDMLを実行してみる

実際に作成した関数を使ってDMLを記載してみます。
今回はドナルドトランプの一つのツイートを拝借しました。意味はありません。w

https://x.com/realDonaldTrump/status/1855404088734945765


```sql

SET text_ = '2020年大統領選挙で記録的な資金を集めた民主党は激戦の結果、ほとんどすっからかんと聞いて驚いている今あっちは納入業者やらから追い込まれてるらしい';

SELECT *
FROM TABLE(pdf_text_chunker($text_));

```

うまく実行されていることがわかります。
これをベクトルに埋め込みする関数を使用すれば、なんかベクトルストアが作れそうなイメージが湧きますかね。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/83af15d1-a5bd-ceeb-e2eb-5aa1dabab33c.png)


## 3.2 実際に埋め込みベクトルを作成してみる（一例）
今回はイメージだけ抑えてもらえればと思います。
関数の詳細は別の記事でまた解説したいとは思います。


```sql
SELECT *,SNOWFLAKE.CORTEX.EMBED_TEXT_768('e5-base-v2',chunk) as chunk_vec
FROM TABLE(pdf_text_chunker($text_));
```

以下のように分割されたツイートが一次元ベクトルになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/5a78726c-bfb3-e406-8933-9de5a0c4b448.png)


# 4.次のイメージ

今は既に整形された文字列に対して、langchainを使ってチャンクに分けました。

本来の活用術的には、PDFをステージに保管して、それをトリガーとしてUDFを実行して
ベクトルストアに保管するような感じかなと思います。

次は実際のアーキテクチャ部分についても触れていければいいかなーと思いつつ、
上記の部分で詳細に解説できなかった部分もお話しできればいいかなと思ってます。
【ChatGPT】「第一原理思考」と「要素分解」を組み合わせたPromptをご紹介。


　どうも、カーブミラーです。

　今回は、「第一原理思考」と「要素分解」を組み合わせたPromptをご紹介。


:::note info
本記事は、ChatGPT（有料版）
で行なっております。画像は
ありません。　あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)

***
　まずは、ニュース。

　昨日（2024/11/15）書きました
　　Mac版のChatGPTアプリですが、
　　　どうやらサードパーティアプリの
　　　　コードを読み取れる機能の
　　　　　ようです。

　エディタとの
　　やり取りを補助するものらしい。

　[Windows版「ChatGPT」アプリ一般公開　Mac版はコード読み取りに対応](https://www.google.com/url?rct=j&sa=t&url=https://www.itmedia.co.jp/news/articles/2411/15/news112.html&ct=ga&cd=CAEYACoSNjQzMDM0ODE0MTk5NzU4MjY2Mh4zMWQ0NTIzYTQ0NTgzY2Y4OmNvLmpwOmphOkpQOlI&usg=AOvVaw2482gFVoCdIN7ChPsqW1V3)
***
　開発元のOpenAIでさえ
　　「使うな」と警告するほど！？

　[開発元も「使うな」　OpenAIの文字起こしツールがヤバイ？](https://kn.itmedia.co.jp/kn/spv/2411/15/news075.html)

　すみません。
　　冒頭しか読んでいません。
　　　ですが、内容は次のとおり。

[OpenAIの文字起こしAI「Whisper」が幻覚を起こし文章を捏造すると研究者が指摘](https://gigazine.net/news/20241027-openai-whisper-hallucination/)

　Whisperが、
　　八割方、ハルシネーションを
　　　起こすそうです。

　まぁ、こちらは、ひと月ほど前の
　　ニュースなので、
　　　さすがに対策は取られている、
　　　　と思います。
***
　OpenAIのパリ支局が
　　オープンしました。

　[Guillaume Gralletさんポスト](https://x.com/guillaumgrallet/status/1857300149472579885?t=uQGqXzXPwbUMBpDkC9msEA&s=19)
***
　さて、本題です。

　今回は、
　　「第一原理思考」と
　　　「要素分解」を組み合わせた
　　　　　Promptをご紹介します。

　木内翔大さんが
　　ポストしてくださいました。
　　　[木内翔大さんポスト](https://x.com/shota7180/status/1857566772507124205?t=4NLIHwCDqpWj8ePGy7BCyg&s=19)

　どちらも
　　初めて目にした気がします。

　そこで
　　Perplexityに尋ねました。

　「第一原理思考」とは
>物事を考える際に、既存の知識や経験を一旦脇に置き、その物事の根本的な原理に焦点を当てる思考法です。このアプローチは、ギリシャの哲学者アリストテレスによって提唱され、物事の本質を理解するための方法として用いられます。イーロン・マスクはこの思考法を活用し、ロケット開発において従来のコスト構造を打破し、新たな可能性を見出しました。

　「要素分解」とは
>全体を構成する要素に分解し、その要素の総和が全体となるように切り分ける作業です。この思考法により、物事の構造や原因、問題点が明確になり、効率的に解決策を見つけることができます。要素分解は「足し算型」や「積み上げ型」とも呼ばれ、計画立案や問題解決に役立ちます。

　さらに
　　ふたつを組み合わせると
　　　何がわかるのか尋ねました。

>問題解決の効率と革新性が向上します。まず、要素分解により問題を小さな構成要素に分けることで、全体像を明確にします。次に、第一原理思考を用いて各要素の根本的な性質や法則を特定し、従来の前提にとらわれない新しい視点でアプローチします。これにより、革新的な解決策を生み出すことが可能になります。

　なるほどなるほど、
　　つまり、こんな感じですね。

　❶既存の慣例や形式にとらわれず、
　　　問題の本質的な役割と構造を
　　　　考え直す。

　❷構成要素を分解します。

　❸要素を組み合わせる。

　これにより、
　　与えた問題をどうすべきか
　　　という答えが得られる、と。

　Promptは、こちらになります。
```Text:第一原理思考と要素分解Prompt
第一原理思考と要素分解を用いて「（ここに問題を書きます）」について考えて
```

　何度か問題を
　　当てはめて実行しましたが、
　　　それらしい回答を得られました。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
***
　PS.
　　今日から、
　　　ブラウザを
　　　　KiwiからChromeに
　　　　　切り替えました。

　実は、
　　これまでKiwiを
　　　使ってきたのですが、
　　　　突然ChatGPTに
　　　　　アクセスできなくなり、
　　　　　　仕方なく切り替えました。

　以前書いた記事
　　[【ChatGPT（Web版）】が動かなくなった方へ。試してみて。](https://qiita.com/kabumira/items/c77d0ca2f22029faf15a)
　　　で、Cookieを削除しても
　　　　ダメでした。
　　　　　原因不明です。

　Chromeならば
　　ChatGPT無料版でも
　　　使っています。

　　でも何か不具合があって
　　　Kiwiに替えたんですよねぇ。
　　　　なんだっけ？😅
TypeScriptのkeyof typeof周りを整理した

型定義でkeyof, typeof、またkeyofとtypeofが混ざって使われるケースを整理してみました。


### keyof
オブジェクトの型からプロパティ名(key名)を型として返す型演算子です。
2つ以上のプロパティがあるオブジェクトの型にkeyofを使った場合は、すべてのプロパティ名がユニオン型で返されます。

以下のサンプルで、オブジェクトのキーが文字列リテラルのユニオン型を生成できる。
自分で定義しても同じですが、この方法を使うのが一般的です。
```typescript
type Hoge = {
  name: string;
  age: number;
  gender: string;
}

// Hogeのキーである'name' | 'age' | 'gender'の文字列リテラルのユニオン型が生成される
type SampleType = keyof Hoge

const data1: SampleType = "age" // OK
const data2: SampleType = "job" // NG (name, age, gender以外はエラーになる)

// 生成したユニオン型に別の文字列を追加して汎用的に使い回す
type SampleTypeWithJob = keyof Hoge | "job"
const data3: SampleTypeWithJob = "job" // OK

// 生成したユニオン型から不要な値を除去して使う
type SampleTypeWithoutAge = Exclude<SampleType, 'age'>
const data4: SampleTypeWithJob = "age" // NG
```

### typeof
typeof 演算子は対象の値のデータ型を表す文字列を返す演算子。
データ型を調べることができます。

```typescript
const hogeStr = "hogehoge"
// typeof hogeStr を実行すると、'string' が返される

const hogeNum = 1234
// typeof hogeNum を実行すると、'number'が返される
```

以下は型定義でよくあるユースケース
```typescript
// 配列データ
const size = ['small', 'medium', 'large'] as const

// 'small' | 'medium' | 'large'の文字列リテラルのユニオン型が生成される
type Size = typeof size[number]

const a = 'small' // OK
const b = 'extraLarge' // NG!!

// オブジェクトの配列
const RANK_NAME_POINTS = [
  { rank: 'bronze', point: 0 },
  { rank: 'silver', point: 1500 },
  { rank: 'gold', point: 3200 },
] as const

// "bronze" | "silver" | "gold" の文字列リテラルのユニオン型が生成される
type RankNameType = typeof MEMBERS_RANK_NAME_POINTS[number]['rank']

// これに別の文字列を足すことも勿論可能
type MembersRankNameType2 = typeof MEMBERS_RANK_NAME_POINTS[number]['rank'] | 'free'

```

### keyofとtypeofを混合で使うケース
これもよく見かけますが、紐解いてみると仕組みは簡単です。

```typescript
const hoge = {
  name: "Taro Yamada",
  age: 30,
  gender: "male"
}
// typeofでobjの型が取れる
type SampleType1 = typeof hoge
// これと同じ
type SampleType1 = {
  name: string;
  age: number;
  gender: string;
}

// そのobjの型のkeyを取り出してユニオン型を生成 "name" | "age" | "gender"
type SampleType2 = keyof typeof hoge
```

```typescript
// objのvalueをユニオン型にする場合 as constが必要
const objData = {
  groupName: 'グループ名',
  storeName: '店舗名',
  address: '住所',
} as const

// "グループ名" | "店舗名" | "住所" のユニオン型ができる
type ObjDataValues = typeof objData[keyof typeof objData]
```
【備忘録】plt.show() は何のためにあるのか

# 疑問点
ふと思いました。
以下の`plt.show()`を含む`sample1`, 含まない`sample2`どちらを実行しても、、、
```python:比較
# sample1_plt.show()を含む
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
plt.plot(x, y, 'o')
plt.show()

# sample2_plt.show()を含まない
x = [1, 3, 5, 7, 9]
y = [2, 4, 6, 8, 10]
plt.plot(x, y, 'o')
```
↓のグラフが表示される。では`plt.show()`は何のためにあるのか、と。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/db8dc3aa-eb61-28d0-6333-276b975cc2b3.png" width="400">

# 事前準備
**実行環境: Google Colab**
```python
import numpy as np
import matplotlib.pyplot as plt
```

# 解決
**結論：cmd上で実行するとグラフが表示されない！！！**

さっきはGoogle Colab上で実行しましたが、今度はそれぞれ`sample1.py`,`sample2.py`で保存して、cmd上で実行してみました。

まずは、`plt.show()`を含むコード`sample1.py`をcmd上で実行してみます。
```bash
G:\マイドライブ\qiita>sample1.py
```
すると、しっかり↓が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/eaaa229a-ea15-4378-b68f-bb443be65bd9.png" width="300">

一方で、`plt.show()`を含まないコード`sample2.py`をcmd上で実行してみると、、
```bash
G:\マイドライブ\qiita>sample2.py
```
↓のように何も起きませんでした。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/60312212-2551-d979-21ec-ef3bedd9d0f2.png" width="300">

# まとめ
**対話的環境では不要:**
Jupyter Notebook や Google Colab のような対話的な環境では、自動的に最後に生成されたグラフを表示する。そのため、plt.show() を明示的に書かなくてもグラフが表示される

**スクリプト実行時には必要:** 
Python スクリプトをコマンドラインや統合開発環境（IDE）で実行する場合、plt.show() を書かないとグラフが表示されないことがある。
【備忘録】Excelで管理してるテーブル定義からBigQuery用のDDLを作成したい

## はじめに
初投稿なので簡単なものだけどただ欲しかったので作ってみたものの備忘録

あんまり色んなとこで仕事したことないから一般的な管理はわからないが
テーブル定義の仕様書をExcelで管理しているところも多いはず:expressionless:

正直生成AIに丸投げしてDDL吐かせた方が早い気もするが仕様書をそもそも外部に読み込ますの自体が許されないことも多いのでこの記事では以下を実現します：
1. Excelセルからテーブル名を取得
2. 各シートのカラム情報をもとにDDLを生成

## 使用するライブラリ
以下のライブラリを使用します：
- pandas：Excelファイルの読み取り
- openpyxl：Excelファイルの操作（pandasに依存）

インストールされていない場合、以下のコマンドでインストールしてください。

```bash
pip install pandas openpyxl
```

## Excelデータの例
サンプルのExcelファイルは以下のような構造です。(1.1のシートもおんなじ構造)

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936780/a3fc711a-51df-2c5b-1ff2-36ed8a77be52.png">

## 実装方法
### 1.Excelの読み込み
大体複数テーブルの定義があると思うのでsheet_nameをNoneにして全シート読み込み
・sheet_name=None：すべてのシートを辞書形式で取得。
・header=None：ヘッダー行を自動認識せずすべてのセルを取得。
```python
import pandas as pd

# Excelファイルを読み込む
file_path = 'input.xlsx'
# sheet_name=Noneで全シート読み込み
sheets = pd.read_excel(file_path, sheet_name=None, header=None)
```

### 2.テーブル名を取得
サンプルだとB1セルにテーブル定義があるのでそこの値を取ってDDLに使用(1行目の２列目(0始まり))
```python
table_names = {}

for sheet_name, df in sheets.items():
    # B1セルの値を取得
    table_name = df.iloc[0, 1]  # 1行目、2列目

print(table_names)
```

### 3.DDLの生成
サンプルだとB1セルにテーブル定義があるのでそこの値を取ってDDLに使用(1行目の２列目(0始まり))
```python
for sheet_name, df in sheets.items():
    # B1セルの値を取得
    table_name = df.iloc[0, 1]  # 1行目、2列目
    df.columns = ["カラム名", "型", "モード", "備考"]
    print(table_name)

    df = df.iloc[3:]  # データ定義までスキップ

    ddl = f"CREATE OR REPLACE TABLE `{table_name}` (\n"
    columns = []
    for _, row in df.iterrows():
        # df.columnsで指定した列の値をそれぞれDDLに活用
        column_name = row["カラム名"].strip()
        data_type = row["型"].strip()
        mode = row["モード"].strip()
        description = row["備考"].strip()
        column_ddl = f"  `{column_name}` {data_type} {mode}"
        if description:
            column_ddl += f" OPTIONS(description='{description}')"
        columns.append(column_ddl)
    ddl += ",\n".join(columns) + "\n);"
    print(ddl)
```
### 出力結果
こんなのが出てくる
```sql
CREATE OR REPLACE TABLE `test.test1` (
  `column1` INTEGER NOT NULL OPTIONS(description='column1'),
  `column2` INTEGER REQUIRED OPTIONS(description='column2'),
  `column3` INTEGER NOT NULL OPTIONS(description='column3'),
  `column4` INTEGER NOT NULL OPTIONS(description='column4'),
  `column5` INTEGER NOT NULL OPTIONS(description='column5'),
  `column6` STRING NOT NULL OPTIONS(description='column6'),
  `column7` INTEGER NOT NULL OPTIONS(description='column7')
);
```


## まとめ
これだけだとそこまで便利にはならないかもだけど、CREATE部分を仕様書ベースにしとけば変な間違いも減るかな？？
ロジックに少しは注力できそうだし、ある程度Excelの構成変わっても多分調整は少しでいいはず！！！！！！
iphoneでUTM SEを使用してArchLinuxを使用してみた(その1)

ついに、iphoneでエミュレーターソフトが使用できるようになった。
そこで、ArchLinuxで日本語入力ができるようになるまで挑戦してみようと思います。

# UTM SEのインストール
App StoreからUTM SEを検索して、簡単にインストールが可能です。
青いアイコンの方なので間違えないように。

# Arch Linuxの準備
UTM SEは制限がかかっており処理速度が遅いみたいです。
そのため、UTMギャラリーからビルド済のイメージをダウンロードします。
簡単な手順。
* UTM SEを起動
* 左上にある➕のアイコンをタップ
* UTMギャラリーからビルド済パッケージをダウンロードをタップ
* Arch Linux ARMをタップしてダウンロードを開始
* 完了するとiphoneのストレージのダウンロードに保存される
* archlinux-arm64-utm4.zipをタップして解凍する
* ArchLinux.utmを好きなディレクトリに移動
　なるべくなら日本語以外の名前のディレクトリへ
* ArchLinux.utmをタップ
* UTM SEが起動して、メニューにArchLinuxが追加されている
* ArchLinuxを長押しして、編集を開く
* システムのメモリーを、iphoneのメモリーのにわり程度に設定し、保存して閉じる
* →をタップしてバーチャルマシンを起動
* ログインが表示されるまで結構な時間が掛かるため我慢して待ちましょう

# 初回起動時にやること
ログインの文字が出てきたら、ルートでログインします。
パスワードは、rootになってます。
後で変更した方が良さそうです。

まずはお決まりのシステムのアップデートから、ここでいきなりpacman -Syuを実行すると失敗する確率が高いです。
そのため、下記の手順で実行します。
~~~
pacman -Sy
pacman -S archlinux-keyring
pacman-key --init
pacman-key --populate archlinux
pacman -Syu
~~~

これで成功する確率が高くなります。
システム更新には2時間近く掛かるため気長に待ちましょう。
iphoneはロック画面に自動的に切り替わらないように設定しておいた方が良いです。

# 次回
今日はここまで
次はタイムゾーンや日本語の設定など
TCP_NODELAYの効果を確かめる (KLabTechBook Vol.13)

この記事は2024年5月25日から開催された技術書典16にて頒布した「KLabTechBook Vol.13」に掲載したものです。
...
https://makiuchi-d.github.io/2024/11/16/klabtechbook13-tcp-nodelay.ja.html
グラフを２つ上下に表示させる方法


**グラフを上下に分けて表示させたい場合、subplotを使うと、きれいに可視化できる！！**

# 事前準備
```python
import numpy as np
import matplotlib.pyplot as plt
```

# `subplot`を利用
`plt.subplot(2, 1, 1)`は上下に２つグラフを作ったうちの１つ目のグラフ
`plt.subplot(2, 1, 2)`は上下に２つグラフを作ったうちの２つ目のグラフ
を指します。

今回は、`y=sin(x)`, と`y=cos(x)`を上下に並べるようなグラフを表示してみましょう。
```python:sample1_simple_version
# グラフの大きさを指定
plt.figure(figsize=(20, 6))

# グラフの1つ目
plt.subplot(2,1,1)
x_1 = np.linspace(-10, 10,100)
plt.plot(x_1, np.sin(x_1))

# グラフの2つ目
plt.subplot(2,1,2)
x_2 = np.linspace(-10, 10, 1000)
plt.plot(x_2, np.cos(x_2))

plt.show()
```
とすると、↓のようなグラフが表示されます！しっかり、グラフが上下に表示されていますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/57ce9ecd-8307-1a55-7d00-60ca41352679.png)

ただこの表示だと少し見にくいです。
・グリッド線を表示
・凡例ラベルを追加
してもう一度表示してみましょう！！

```python:sample1_difficult_version
# グラフの大きさを指定
plt.figure(figsize=(20, 6))

# グラフの1つ目
plt.subplot(2,1,1)
x_1 = np.linspace(-10, 10,100)
plt.plot(x_1, np.sin(x_1), label='y=sin(x)')
# グリッド線を追加
plt.grid(True)
# 凡例を左側に配置
plt.legend(loc='upper left')  

# グラフの2つ目
plt.subplot(2,1,2)
x_2 = np.linspace(-10, 10, 1000)
plt.plot(x_2, np.cos(x_2), label='y=cos(x)')
# グリッド線を追加
plt.grid(True)
# 凡例を左側に追加
plt.legend(loc='upper left')
```
とすると、↓のようなグラフが表示されます！とても見やすくなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/75d7a2b2-fa34-2d69-96e7-3ca6ab06c3ed.png)



# 発展～左右にグラフを並べてみる～
さっきの応用で、subplot()の引数を以下のように変えてみます。
`plt.subplot(1, 2, 1)`は左右に２つグラフを作ったうちの１つ目のグラフ
`plt.subplot(1, 2, 2)`は左右に２つグラフを作ったうちの２つ目のグラフ
を指します。

```python
# グラフの大きさを指定
plt.figure(figsize=(5, 5))

# グラフの1つ目
plt.subplot(1,2,1)
x_1 = np.linspace(-np.pi/2, np.pi/2,100)
plt.plot(x_1, np.sin(x_1), label='y=sin(x)')
# グリッド線を追加
plt.grid(True)
# 凡例を左側に配置
plt.legend(loc='upper left')  

# グラフの2つ目
plt.subplot(1,2,2)
x_2 = np.linspace(-np.pi/2, np.pi/2, 1000)
plt.plot(x_2, np.cos(x_2), label='y=cos(x)')
# グリッド線を追加
plt.grid(True)
# 凡例を左側に追加
plt.legend(loc='upper left')
```
とすると、↓のようなグラフが表示されます！
今回は`x`の範囲を`-π/2 ~ π/2`で表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871898/3937c27b-0480-823f-e5ec-97045482a473.png)
【準1級】統計学実践ワークブック　例題2.2　確率母関数の期待値と分散

統計検定準1級の勉強のための解説記事となります。下記にご了承いただける方のみ、お読みください。

:::note warn
##### 注意
* 著作権の都合により問題文は掲載せず解説のみの記述となります。
* 独自の解釈により、不適切な表現がある可能性があります。
:::

以下、動画でも解説しています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/5iCeOim1p6I?si=LAxuBFCBaG732ZJk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 問題のポイント
確率母関数は、確率分布を解析するための強力なツールです。

:::note
確率母関数を用いることによって、離散型確率変数の確率分布の期待値と分散を容易に求めることができます。
:::

```math
確率母関数の定義:G_X(s) = E(s^X)　・・・①
```

```math
期待値:E[X] = G'_X(1)　・・・②
```

```math
分散:V[X] = G''_X(1) + G'_X(1) - (G'_X(1))^2　・・・③
```

# 解法ノート

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618291/01056e73-06b9-14dd-2177-5569ed034433.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618291/7fed82b5-d626-b74c-348a-241c797fb9b1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618291/9d94e33a-ecda-9811-ce59-d4148dc135dd.png)


# 解答
## 幾何分布に従うXの確率母関数
①の式に期待値の定義を当てはめると、以下のような式が導かれます。
```math
G_X(s) = E(s^X) =\sum_{x}^{} s^x p(x)
```
問題文の条件にある、幾何分布の確率関数
```math
p(x) = (1-p)^x p, \quad x = 0, 1, 2, \ldots
```
を代入すると、
```math
G_X(s)  = E(s^X) = \sum_{x=0}^{\infty} s^x (1-p)^x p 
```

となります。

ここで、$x$乗の部分をまとめると、
```math
G_X(s)         =  \sum_{x=0}^{\infty} p \left(s(1-p)\right)^x
```

と式変形ができます。

これは、初項が$p$、公比が$s(1-p)$の無限等比級数の和です。

ここで、$|s(1-p)| < 1$のとき、この級数は収束するため、無限等比級数の和の公式を用いると、

```math
G_X(s) = \frac{p}{1 - s(1-p)} \quad (|s(1-p)| < 1)
```

が導かれます。



## 幾何分布に従うXの期待値

まず、確率母関数$G_X(s)$を$s$で1回微分した値を求めます。商の微分の公式を用いて、計算すると、

```math
G'_X(s) = \frac{p(1-p)}{(1 - s(1-p))^2}
```

が導かれます。

よって、式②、および上記の式の$s$に1を代入した式を用いると以下のように変形できます。
```math
E[X] = G'_X(1) = \frac{p(1-p)}{(1-(1-p))^2} 
```
この式を計算して整理すると、
```math
E[X] =  \frac{1-p}{p}
```
が導かれます。

## 幾何分布に従うXの分散
まず、確率母関数$G_X(s)$を2回微分した値を求めます。商の微分の公式を用いると、


```math
G''_X(s) = \frac{2p(1-p)^2(1 - s(1-p))}{(1 - s(1-p))^4} 
```
と表されます。これを計算して、式変形すると、
```math
G''_X(s) =  \frac{2p(1-p)^2}{(1 - s(1-p))^3}
```

が導かれます。さらに上記の式の$s$に1を代入して計算すると、
```math
G''_X(1) = \frac{2p(1-p)^2}{(1-(1-p))^3} = \frac{2(1-p)^2}{p^2}
```
となります。

よって、分散は、式③を用いて、
```math
V[X] = G''_X(1) + G'_X(1) - (G'_X(1))^2 = \frac{2(1-p)^2}{p^2} + \frac{1-p}{p}- \left(\frac{1-p}{p}\right)^2
```
と表されます。

この式を計算して整理すると、

```math
V[X] = \frac{1-p}{p^2}
```

が導かれます。

# コラム

幾何分布のグラフは$p$によって、以下のように変化します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3618291/cd13369c-c86f-611d-ae65-04ef28e1b1fb.png)

$E[X] =  \frac{1-p}{p}$は、$p$の単調減少関数です。
よって、成功確率$p$が大きくなると成功までの試行回数の期待値は小さくなります。グラフを確認しても、$p=0.2$よりも$p=0.8$のほうがグラフが左にシフトし、Xの期待値が小さくなっていることがわかります。


$V[X] = \frac{1-p}{p^2}$は、$p$の単調減少関数です。
よって、成功確率$p$が大きくなると、結果に大きなばらつきが出にくいことを示しています。グラフを確認しても、$p=0.8$よりも$p=0.2$のほうが、Xがばらついています。

# 参考）高校数学の知識
### 無限等比級数の和
初項 $a$, 公比 $r$ の無限等比級数の和 $S$ は、$|r| < 1$ のとき、
```math
S = \sum_{n=0}^{\infty} ar^n = \frac{a}{1-r} \quad (|r| < 1)
```
### 商の微分
```math
\left(\frac{f(x)}{g(x)}\right)' = \frac{f'(x)g(x) - f(x)g'(x)}{g(x)^2}
```
【Eclipse】良く使うショートカット　part1

## はじめに
こんにちは。エンジニアの長谷川と申します。
私は普段Java開発においてEclipseを使用しています。
よく使っているショートカットいくつかあるので記事があまり長くならない程度に
難解かに分けて紹介します。

今回は不具合調査で良く使う2つです。

### 型を開く（Shift+Ctrl+T）
不具合調査でログからエラー発生個所のクラスがわかっているとき、
このショートカットを使用して簡単に開くことができます。

「Shift+Ctrl+T」を押すと下記のようにダイアログが表示されます。
検索するためのキーワード入れると下に候補が出てきます。
ログなどからクラス名がわかっていれば一発で開けます。

:::note info
自身が作成したクラスだけでなく、依存しているライブラリのクラスも探せます！
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/00ee64a6-6faa-005f-d2b1-be71bcc5bdf7.png)

### 指定した行へジャンプ（Ctrl+L）
スタックトレースの場合にはクラス名だけでなく、どの行で問題が起きたかもわかります。
場合によっては1,000行を超えるクラスの場合もあるでしょう。
そんな時、スクロールするのではなくこのショートカットでログが示している行にジャンプできます。

「+Ctrl+L」を押すと下記のようにダイアログが表示されます。
ログに出ている行を入力すれば一発でそこまでジャンプできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780649/8491096f-f010-7183-d5d7-ff58ef7b0102.png)

## 終わりに
今回は不具合調査で良く使用しているEclipseのショートカットを紹介しました。
次回はまた別の観点で良く使っているショートカットをご紹介します。
以上、長谷川でした。
iPhoneアプリ開発をはじめよう

iPhoneアプリ開発は、適切な準備と手順を踏めば初心者でも取り組むことができます。以下に、iPhoneアプリ開発の主要なポイントと手順をまとめます。

## 開発に必要なもの

- Mac コンピューター
- Xcode (Apple提供の無料統合開発環境)
- Apple ID
- Appleディベロッパプログラムへの登録 (App Storeで公開する場合)
- Swift プログラミング言語の知識

## 開発の基本的な流れ

1. 企画・設計
   - アプリのアイデアを具体化
   - 機能やデザインを詳細に計画

2. 開発環境の準備
   - Xcodeのインストール
   - 必要に応じてAppleディベロッパプログラムに登録

3. プログラミング
   - SwiftUIまたはUIKitを使用してUIを構築
   - アプリの機能をSwiftで実装

4. テスト
   - シミュレーターや実機でアプリの動作確認
   - バグの修正と改善

5. App Storeへの申請・公開
   - 必要な情報やスクリーンショットを準備
   - Appleの審査を通過後、公開

## 開発のポイント

- **SwiftUIの活用**: 最新のUIフレームワークであるSwiftUIを使用すると、効率的にマルチプラットフォーム対応のUIを構築できます[1]。

- **標準的なUI要素の使用**: iOSに組み込まれている標準的なビューやコントロールを活用することで、開発期間を短縮できます[1]。

- **複数プラットフォームへの対応**: iOSアプリの開発を始める際は、iPadOSへの対応も検討しましょう。共通するテクノロジーが多いため、比較的容易に対応できます[1]。

- **ユーザー体験の重視**: タッチ入力を中心としつつ、他の入力方法（ドラッグ&ドロップ、スクリブル入力など）にも対応することで、より使いやすいアプリを作成できます[1]。

- **継続的な学習**: Swift言語やiOSの最新機能について、常に学習を続けることが重要です[2]。

iPhoneアプリ開発は、適切な手順を踏み、根気強く取り組むことで、初心者でも実現可能です。開発を始める前に十分な準備と学習を行い、段階的に進めていくことをおすすめします。

Citations:
[1] https://developer.apple.com/jp/ios/planning/
[2] https://www.sejuku.net/blog/1396
[3] https://udemy.benesse.co.jp/development/app/iphone-apps.html
[4] https://note.com/jiitak_note/n/na0c9f4a395a0
[5] https://hnavi.co.jp/knowledge/blog/iphone-app-development/
[6] https://www.ibm.com/jp-ja/topics/ios-app-development
[7] https://corp.tech.hipro-job.jp/column/197
[8] https://jitera.com/ja/insights/2384
2024年11月15日Salesforce不具合について時系列で記載

Salesforceで2024年11月15日（金） 15時15分頃Salesforceにログインできない事象が発生
（2024年11月16日（土） 00時22分まで）

その時の経緯や影響範囲などを記載します

# 経緯（Salesforce公式アナウンス）

## 11月15日(金)15時15分ごろ
事象発生。しかしこの時点では公式アナウンスが無いので多くのSalesforceユーザーが「自分のSalesforce固有の事象か？Salesforceそのものの事象か」の判断ができない状況だったと思います。
15時55分までは公式的なアナウンスが無かったですが、
有志によるXでのつぶやきからSalesforceで何かしらの問題が発生していることが確認できる状況でした

https://x.com/takaaki_mo/status/1857314400987922642


## 11月15日(金)15時55分
Salesforce　Trustサイトに今回の事象が公開される
https://status.salesforce.com/generalmessages/1476
同タイミングでSalesforce公式のXアカウント「【公式】Salesforceカスタマーサクセスグループ」でSalesforceにログインできない事象が発表される

https://x.com/SalesforceCSGJP/status/1857316471585857565


## 11月15日(金)16時23分
Xの「Salesforce Japan」公式アカウントでもSalesforceにログインできない事象が発表される

https://twitter.com/SalesforceJapan/status/1857323517936840745

## 11月16日(土)05時46分
サービス中断が解決されたことがXの「Salesforce Japan」公式アカウントで報告される

https://twitter.com/SalesforceJapan/status/1857525696530157713




# 各社対応

## 株式会社チームスピリット

TeamSpiritの基盤であるSalesforceの障害対応を公開し対応

https://tsi-incident-info.atlassian.net/wiki/spaces/INCIDENT/overview


# 影響範囲

献血ルーム・天文館ではラブラッドにログインできない状況であることが「#Salesforce」「#セールスフォース」のハッシュタグがつけられ発表されました

https://x.com/Room_tenmonkan/status/1857356767430320638


東京都 インフラ・まちづくり　では
「2024年11月15日16:00現在、Salesforceのシステム障害により、東京都屋外広告物管理システムにログインできない状況」ということが発表されました

https://twitter.com/tocho_kouwan/status/1857332646797361395

横浜市総務局危機管理室では
「19:00現在、「Salesforce」のシステム障害による影響で、本市防災情報ポータルが閲覧できない状況が継続しています。」と発表されました

https://x.com/yokohama_saigai/status/1857366707683409989

他にもSalesoforceが使われている「おおいた防災情報ポータル」がシステム障害で閲覧できなくなる状態が大分県のホームページで発表されています

https://www.pref.oita.jp/site/bosaiportal/r6-bosai-syogai.html

https://oita-bosai.my.salesforce-sites.com/


# ニュースサイト

今回の事象についてニュースになっています

https://www.itmedia.co.jp/news/articles/2411/15/news188.html

Xのトレンドが一時「Saelsforce」が上位になったことが記載されています

https://xtech.nikkei.com/atcl/nxt/news/24/01819/?n_cid=nbpnxt_twbn


https://www.nikkei.com/article/DGXZQOUC158TN0V11C24A1000000/

システム障害の状況が分かります


# 原因について

Salesforceでは過去にも障害が発生した原因分析や報告を行っています。
報告が出次第、こちら追記します

※参考
2022 年 5 月 12 日に Lightning Platform で発生したサービス中断に関するご報告
https://help.salesforce.com/s/articleView?id=000392094&type=1



# 対策
今後もSalesforceで問題が発生した際、Trustを見て確認することが大事だと思います

https://status.salesforce.com/current
event.targetプロパティを使用したプログラム例

## 1. 概要
コメントでのご指摘，ありがとうございました．こちらを参考にプログラム例を修正したものになります．

`event.target` は，イベントが発生した元の要素を指します．
これは複数の要素の中の，いずれかがイベントを起こした時に有用です．

（初心者の勉強記録です．）

## 2. 実装例
複数のチェックボックスにイベントを設定し，それぞれの状態をコンソールに出力してみます．

### 2.1. チェックボックスの設置

```html
<!-- HTML -->
<div>
  <input type="checkbox" class="toggle-btn" id="btn1"> チェックボックス 1
  <input type="checkbox" class="toggle-btn" id="btn2"> チェックボックス 2
  <input type="checkbox" class="toggle-btn" id="btn3"> チェックボックス 3
</div>
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797088/64aefa5b-1b6b-d043-7961-64c1cad3cb9d.png" width="500">

### 2.2. 全てのチェックボックスを取得し，イベントリスナーを設定

```script
//script
document.querySelectorAll('.toggle-btn').forEach(btn => {
  btn.addEventListener('change', event => {
    console.log(`ID: ${event.target.id} の状態: ${event.target.checked ? 'ON' : 'OFF'}`);
  });
});
```

1. `document.querySelectorAll('.toggle-btn')`：クラス toggle-btn を持つすべての要素を取得．
1. `.forEach(btn => {  })`： NodeList の各要素（ここではチェックボックス）に対して順番に処理を行う．
1. `btn.addEventListener('change', event => {  })`：各チェックボックスに対して change イベントリスナーを追加．（チェックされたり外されたときに発生する）
1. `event => {  }`：イベントが発生した際の処理を定義．（イベントオブジェクトで，発生したイベント情報を持っている）

### 2.3. event.target の役割
- `event.target`：イベントが発生した要素を指します．（この例ではチェックボックスそのも）
- `event.target.id`：イベントが発生したチェックボックスの id 属性を取得．
- `event.target.checked`：チェックボックスの現状を示す．（チェックしている→true，チェックしてない→false）

### 2.4. 結果

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3797088/c51e7237-6abc-8ddb-bb3d-9e172b415bee.png" width="450">

## 3. まとめ

`event.target` は「そのイベント（今回はチェックする）が発生した要素」を指します．


CodePenなどで上記のコードを貼り付けてみてください．
Consoleに，エラーに応じたメッセージが表示されていると思います．

最後まで読んでいただきありがとうございまいた．
pythonの文字列型の型変換

### 文字列型の日付を型変換
```python
str_datetime = "26/10/2024 05:58:26 PM"
```


# その１： datetimeを使用
#### str ⇒ datetime
```python
import datetime

converted_datetime = datetime.datetime.strptime(str_datetime, "%d/%m/%Y %I:%M:%S %p")
print(converted_datetime)
print(type(converted_datetime))

# 2024-10-26 17:58:26
# <class 'datetime.datetime'>

```

https://docs.python.org/ja/3/library/datetime.html#strftime-and-strptime-format-codes


# その２：to_datetime()を使用
#### str ⇒ timestamps
```Python
# pip install pandas
import pandas as pd

converted_timestamp = pd.to_datetime(str_datetime, format="mixed", dayfirst=True)
print(converted_timestamp)
print(type(converted_timestamp))

# 2024-10-26 17:58:26
# <class 'pandas._libs.tslibs.timestamps.Timestamp'>

```

https://pandas.pydata.org/docs/reference/api/pandas.to_datetime.html

# 最後に
どこかミスがあれば教えてください。
vagrant実行時のfatal error: runtime: bsdthread_register error

## 本記事について
今回、vagrant実行時とパッケージインストール時に発生した
エラーをまとめています。

本事象が起きるのはあまりないかもしれませんが、
自身の備忘録的な意味も踏まえ、簡単にまとめてみました。

参考URL：https://chusotsu-program.com/monterey-vagrant-not-working/
        

実行環境：MacOS Monterey 12.7.5（21H1222）


## vagrant実行時のfatal error: runtime: bsdthread_register error
久しぶりにvagrantでvirtualBoxを操作しようとしたら、
表題エラーがでてきて、vagrant upができなくなってしまった。

    # vagrant up 
      fatal error: runtime: bsdthread_register error
       
      runtime stack:
      runtime.throw(0x110617a, 0x21)
	      /usr/local/go/src/runtime/panic.go:596 +0x95 fp=0x7ff7bfeff8f0       sp=0x7ff7bfeff8d0
      runtime.goenvs()
	      /usr/local/go/src/runtime/os_darwin.go:108 +0xa0 fp=0x7ff7bfeff920 sp=0x7ff7bfeff8f0
      runtime.schedinit()
	      /usr/local/go/src/runtime/proc.go:486 +0xa1 fp=0x7ff7bfeff960 sp=0x7ff7bfeff920
      runtime.rt0_go(0x7ff7bfeff990, 0x2, 0x7ff7bfeff990, 0x1000000, 0x2, 0x7ff7bfeffb10, 0x7ff7bfeffb18, 0x0, 0x7ff7bfeffb1b, 0x7ff7bfeffb43, ...)
	      /usr/local/go/src/runtime/asm_amd64.s:158 +0x183 fp=0x7ff7bfeff968 sp=0x7ff7bfeff960

冒頭記載の参考URL先も参照に確認してみると、
**OSのバージョンアップ時にvagrant自体が破損してしまったようです。。**
その為、再度vagrantを入れ直すことに。

    sudo rm -rf /opt/vagrant
    sudo rm -f /usr/local/bin/vagrant
    sudo pkgutil --forget com.vagrant.vagrant

## Error: formulae require at least a URL
いざ、brew install vagrantを実行し、再度インストールを行おうと下が、今度は以下エラーが発生。

     Error: formulae require at least a URL
     Please report this issue:
       https://docs.brew.sh/Troubleshooting
     /usr/local/Homebrew/Library/Homebrew/formula.rb:306:in `determine_active_spec'
     /usr/local/Homebrew/Library/Homebrew/formula.rb:237:in `initialize'
     /usr/local/Homebrew/Library/Homebrew/formulary.rb:485:in `new'
     /usr/local/Homebrew/Library/Homebrew/formulary.rb:485:in `get_formula'
     /usr/local/Homebrew/Library/Homebrew/formulary.rb:762:in `factory'
     /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:655:in `block in formulae'
     /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:651:in `map'
     /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:651:in `formulae'
     /usr/local/Homebrew/Library/Homebrew/cli/parser.rb:323:in `parse'
     /usr/local/Homebrew/Library/Homebrew/cmd/install.rb:167:in `install'
     /usr/local/Homebrew/Library/Homebrew/brew.rb:86:in `<main>'



結論、原因は**パッケージ管理ツール「brew」のリポジトリ先tapが競合**となってしまうようです。



参考：https://kawarimidoll.com/2021/04/01/brew-error-formulae-require-at-least-a-url/

そのためこのリポジトリを消せればいけそうなので、
     
     # brew tap
      hashicorp/tap
     # brew untap hashicorp/tap

その後vagrantが無事、インストールできました！
このタップについてchatGPTに質問してみると、

>`hashicorp/tap`は、HashiCorpが提供するHomebrewのタップで、HashiCorpのツール（例えば、Vagrantや>Terraformなど）を簡単にインストールするためのリポジトリです。このタップに含まれるソフトウェアは、HashiCorpが管理しており、公式にサポートされています。


上記のような役割があるよう。
こちらをもとに考えると、これまで使用してたvagrantはtapを経由で利用していませんでした。
ただ以前に別途、Terraform利用時にtapを利用したので、その際に今回のように重複してしまい、またOSのアップデートも重なり、意図せずtapを参照するようになったかなと。（ざっくりな考察ですが、）


今回は以上です。
MAC OSややこしい、、
ポケモンのタイプ相性クイズをCodePenで（Python→CodePen）

以前、ポケモンの対応相性クイズのPythonのコードを投稿しました。
[ポケモンのタイプ相性クイズ（Python）](https://qiita.com/8787kazuye/items/c10fa41da1eefe34e641)
これをCodePenなどでつくったら、もっと気軽にできるなと思ったのでChatGPTにお願いしました。

まず、できた実物はこれです。Start Quizボタンを押すと始まります。
<p class="codepen" data-height="450" data-default-tab="result" data-slug-hash="NWQEYXX" data-pen-title="ぽけもん、途中" data-user="8787kazuye" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/8787kazuye/pen/NWQEYXX">
  ぽけもん、途中</a> by 8787kazuye (<a href="https://codepen.io/8787kazuye">@8787kazuye</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

## どうやって作ったか
前回の記事にかいたPythonのコードをそのままコピペしてChatGPTに貼り付けました。
数回の会話で先ほどのCodePenの完成です。私の指示は以下のような感じです。

１「これと同じようなことをjavascriptで行いたい」
２「HTMLとあわせて実装したい。文字を画面にだしたい」
３「codepenを使っているんだけれど、それぞれどこにいれたらいい？」
４「回答が0,0.5,1,2,4の5パターンしかないので、回答をそのボタンから選ぶようにしたい」

ChatGPT、なんでもやってくれますね。すごい！
ChromebookのLinuxにFlatpakをインストール

1. Linuxターミナルを起動する<br><br>
1. [Flatpak](https://flatpak.org/) をインストールする
   ```bash
   sudo apt install flatpak
   ```
   <br>
1. 公式のリポジトリ [Flathub](https://flathub.org/ja) を追加する
   ```bash
   flatpak --user remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
   ```
   スーパーユーザー権限を必要とせずに、現在のユーザーにリポジトリを追加するために、オプション`--user`を追加している。<br><br>
1. Linux サブシステムをシャットダウンして再起動する
   1. シェルフのターミナルのアイコンを右クリック（２本指でタップ）
   1. 「Linuxをシャットダウン」をクリック
   1. 「penguin」をクリック
   <br>
1. Flatpak でアプリのインストール
   1. [Flathub](https://flathub.org/ja) でアプリを検索
   1. そのアプリのページのインストールコマンドをコピー
   1. Linuxターミナルに貼り付け
   1. コマンドを実行
   :::note info
   権限が無いと怒られてインストールできないときは、コマンドにオプション `--user` を追加して実行する。
   ```bash
   $ flatpak install --user flathub アプリ名
   ```
   :::
セキュリティ的に問題のあるゲーミングケーブルを作ってみよう ( IoT の I  )

# IoT の I

Internet にアクセスするデバイスは、無線や有線で TCP/IP にアクセスすることができることが必要。
IoT としては小さなデバイスとして、 ESP32 とか nRF53 とかで WiFi とか BLE とか。あるいは IoT でも有線アクセスもやろうとしたらできる。

cf.,

https://qiita.com/nanbuwks/items/6e54b193dce1853ad708


# Internet Access から遮断されている状態

実はセキュリティの世界では TCP/IP や WiFi や BLE やそういったものがなくても、制約を飛び越えて感染したり、漏洩したりする手法がある。

サイドチャネル攻撃だとか、あるいは USBメモリを介したものだとか。
有名なのは Stuxnet が インターネットから隔絶されたイランの核濃縮施設を撹乱させたりだとか。

今回は、IoT デバイスのようなライトウェイトなマイコンを使い、電波を使わなくてもデータを外部に送る手法を考えてみる。





# 考えてみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d13889ce-3379-f8b8-a8ac-47c0e12aa0fc.png)

ただ単なるイルミネーションUSBケーブルに見せかけて、発光パターンでキーロギングを外部に送信ができるもの。
ゲーミングケーブルを単に見せびらかすことができるけれども実はスマホで情報読み取りが可能、というようにしたら楽しいのではないかと!!

この手法を使えば、データの漏洩として悪いことをするだけではなく、データをインターネットにプッシュする方法として使えるかも。

# チャレンジ!

CH32V203 の USB ホスト・デバイス機能を使い、光るゲーミング USB ケーブルのように見えて実は光るパターンで情報漏えいするというおもしろデバイスを作ってみます。



既存の光るケーブルをこのくらいでカット。
![IMG_20241115_192021.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/aadd66c9-aa9a-7f60-4d70-7b8f7e85b7ca.jpeg)

結束バンドでこのように基板に固定します。
![IMG_20241115_201840.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/98f71557-5954-c037-d100-5d7f47b68d00.jpeg)

ケーブルは、中央の光ロッド、電線4本、補強線数本からなります。補強線をカット、このようにまとめます。
![IMG_20241115_205216.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/21d2cd0f-2ead-dec9-a1e6-fc3fbe8f7268.jpeg)

はんだづけ。
|5V | D- | D+ | GND |
|:---:|:---:|:---:|:---:|
|太銅 | 細銅 | 細銀 | 太銅銀 |
 
![IMG_20241115_205209.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3a87bedf-4e66-5ec5-27e9-406f051559e4.jpeg)

このくらいのアルミ箔を折りたたみ、光ロッドに巻き付けます。

![IMG_20241115_201133.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/89519f6f-d6b5-d6aa-22fd-9689a9b578d6.jpeg)

LED をチューブに固定
![IMG_20241115_201011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4db1c47c-9045-19ed-81b8-87f6a4f5d209.jpeg)

このように固定して
![IMG_20241115_210226.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6da00448-e583-3465-223b-60277706099b.jpeg)

LEDを配線。
![IMG_20241115_211725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/37830bc1-a67c-1ec2-2444-75ed2fac73ea.jpeg)

BluePill+ と白基板両方にピンヘッダとピンソケットをはんだづけ。
![IMG_20241115_214610.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ed60ee43-b0ab-863c-3c54-59ef8dfe373a.jpeg)

120Ωぐらいの表面実装抵抗をはんだづけします。
![IMG_20241115_220202.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d83068a3-5763-d1f8-ec5b-f0dbe59afbe7.jpeg)

完成。ちょっと「ケーブル」というには苦しいけれども。
![IMG_20241115_220914.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/26543dbb-0b04-b07a-de0a-d0bcdfdeb64d.jpeg)

専用の基板にすれば、ケーブルっぽくなって悪質度が高まるでしょう。



ファームウェアを工夫して、キーボードの入力情報を光で漏洩するようにします。
(ファームは別途公開)

専用のデバイスでデコードすれば高速通信もできますが、スマホカメラなどで読み取るためには数bps 〜数十bps ぐらいが上限となるでしょう。

# IO割当
USB HOST
|GPIO|SINGAL|USB TYPE A FELALE|
|:---:|:---:|:---:|
||5V|1 VBUS|
|PB6(USB2_DN)|D-|2|
|PB7(USB2_DP)|D+|3|
||GND|4|

LED
|GPIO|SINGAL|ENCODER|
|:---:|:---:|:---:|
|PA3||LED1|
|PA1||LED2|
|PA2||LED3|

# ソフトウェア

今回はここまでで力尽きました。俺達の戦いはこれからだ！
[Ruby / Rails]個人的によく混乱するmax, max_by, maximum の違いをまとめた。

# 概要
タイトルの通りです。
利用機会は多いものの、混乱してしまうことが多いのでまとめることにしました。

## `maximum`

- 概要: ActiveRecordの集計メソッド
- 機能: データベースレベルで最大値を取得
- 内部動作: SQLの`MAX`関数を利用
- メリット: データベース側で計算するため、パフォーマンスが高い

## `max`

- 概要: Rubyの`Enumerable`モジュールのメソッド
- 機能: コレクション内の最大値をRuby側（メモリ）で計算
- 使用時の注意:
  - ActiveRecordのリレーションに対して使用すると、全てのレコードを一度に取得
  - データ量が多いとメモリ消費や処理時間が増大

## `max_by`

- 概要: Rubyの`Enumerable`モジュールのメソッド
- 機能: ブロック内で指定した基準に基づき、最大の要素を取得
- 特徴:
  - 評価基準を直接指定でき、コードが明確
  - `max`同様、全レコードを取得してから処理（データ量が多いとメモリ消費や処理時間が増大）

# まとめ
以上です。
基本的には `maximum`を利用するのが良いでしょう。
ITエンジニア - いつも何を考えてコードレビューをしているのか？ コードレビューの観点を書き出してみる

### 仕様/実装

- バグがないか？仕様通りに動くか？ ( 「コードだけ」の視野の狭いレビューに陥るべからず。これがいちばん大事な観点である )
- コードレビューだけではなく、動作確認をするのがベスト。
- 要件は満たせているか。「明文化された要件」すなわち「決まったこと」以外の部分において「本来の要求」を満たせているか。 ( クライアントも気づいていない問題・課題が見つかった場合は、それを共有・解決すべきだ )

## 可読性

- コードの保守性、命名、可読性、分かりやすさ
- 冗長な処理はないか、もしくは、逆に共通化しすぎている処理はないか
- マジックナンバーなどの基本的なアンチパターンがないか。
- コードだけでは処理が分かりにくい部分では、必要なコードコメントがあるかどうか。もしくはコードコメントがなくても分かりやすい命名・構成になっているか。
- コードコメントがある場合、そのコードコメントの適切さ。
- 分割・統合のバランス感は適切かどうか ( ファイル分割、関数の粒度など各所において )
- ファイル名はがエディタで探しやすいものになっているか
- 「どちらでも同じように動くが、より良い書き方」がないか

### セキュリティ

- セキュリティ的に脆弱性がないか。セキュリティ的な危険に対してのテストが書けているか。 ( 例: 「 任意のIDを指定すると、他のユーザのデータも見られてしまう」みたいなケースを防ぐテストができているか )

### 負荷


- 負荷の高い処理が発生していないか ( N+1クエリなど )
- データ量が増えた時に高付加になる処理をしていないか、また、その考慮・確認はできているか

### テスト

- 実装に対応した適切なテストが書かれているか
- テストの管理コスト、テストの可読性、品質保証のレベル
- テストが仕様書的に読めるかどうか

### データベース

- データベース設計、正規化・非正規化の度合い

## 流儀

- 言語、フレームワークの流儀に則った書き方をしているか
- 既存のコードとの統一感。「見慣れない書き方」「浮いてる書き方」をしていないかどうか。

## エラー / バリデーション

- エラーハンドリングは適切にできているか、エラーメッセージは分かりやすく適切かどうか
- アプリケーションのロジックによるバリデーションだけではなく、データベース層での制約をつけているか
- フロントエンドだけのバリデーションだけではなく、バックエンドのバリデーションができているか

### Pull Request  / レビュワーに対して

- 「レビュワーに優しいか」どうか
- 動作確認の例、スクリーンショットなどがDescriptionに載っているか
- PRの単位は適切かどうか ( 差し戻し = Revert をした時に、意図しない変更まで巻き戻ってしまわないかどうか )


### コミュニケーション

- レビューのコストパフォーマンスを考える
- レビューコメントが往復する場合や、話が複雑になる場合はZoomなどで話す


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura