OmniAICreator/Qiita-1.07M huggingface dataset:
テスト自動化エンジニアシラバス：導入と目的

# はじめに

テスト自動化エンジニアのシラバスを再度読み直し、各章をDailyで読めるようにしてみた

https://www.istqb.org/certifications/test-automation-engineer

1.1 Purpose of Test Automation を今回は翻訳・解説する



# テスト自動化の効果

- 効率化　
 手動テストで時間がかかる反復的なテストを自動化し、人的資源をより付加価値の高い作業に振り向けることができる。
- 品質向上
 人間のミスを減らし、より多くのテストケースを網羅的に実行することで、ソフトウェアの品質を向上する。
- スピード
 テスト実行時間を短縮し、開発サイクルを加速化することで、市場の変化に迅速に対応できる。
- 信頼性向上
 同じテストを何度でも同じ条件で実行できるため、テスト結果の信頼性を高め、バグの再現性を確実にすることができる。


# テスト自動化の目的

- コスト削減
 人件費や時間的なコストを削減し、ROI（投資対効果）を向上させます。
- カバレッジ向上
 手動テストでは到達が難しい複雑なシナリオや大量のデータを用いたテストを自動化することで、テストカバレッジを最大化し、ソフトウェアの信頼性が高まる。
- 再現性向上 
 同じテストを何度でも同じ条件で実行できるため、テスト結果の信頼性を高め、バグの再現性を確実にすることができる。
- スピード
 テスト実行時間を短縮し、開発チームに迅速なフィードバックを提供することで、開発プロセス全体を効率化。



# テスト自動化のメリット

効果、目的と重複する部分がありますが、改めて


- 時間短縮
 人手によるテストに比べて、大幅にテスト時間を短縮できる。
- 夜間や休日も実行可能
 人間の作業時間に関わらず、24時間365日テストを実行できる。
- 並行実行
 複数のテストケースを並行して実行することで、さらに時間を短縮できる。
- 迅速なフィードバック
 開発の早い段階からバグを発見し、修正することで、開発サイクルを高速化。

- テストカバレッジの向上
 手動テストでは網羅できなかったテストを自動化することで、毎回のテストで広範囲のテストができます。
- エラーの早期発見
 開発の早い段階でバグを発見し、修正することで、後工程でのコスト増を防ぐ。
- 再現性の向上
 同じ条件で何度もテストを実行できるため、バグの再現性が高くなる。
- ヒューマンエラーの削減
 人の手によるミスを減らし、テスト結果の信頼性が高まる。
- 客観的な評価
 主観的な判断が入らず、客観的な評価が可能。
- 人件費・リソース最適化
 テストに費やす人件費を削減でき、テストエンジニアは、より高度なテスト設計や分析に集中できる。
- バグ修正コストの削減
 開発の早い段階でバグを発見し、修正することで、後工程での修正コストを削減できる。
- 継続的な統合（CI）連携
 CIパイプラインに組み込むことで、開発とテストを密結合し、迅速なフィードバックを得られる。
- リグレッションテストの効率化
 新機能追加や変更に伴う回帰テストを自動化することで、既存機能の品質を維持できる。
- ドキュメント化
 テストスクリプトは、テストケースのドキュメントとしても活用でき、属人化を防ぐ。

# テスト自動化のデメリット

- 初期コスト
 テスト自動化ツール導入や環境構築に初期費用と時間。
- メンテナンスコスト
 テストスクリプトのメンテナンス（仕様変更による修正や、リファクタ）やツールのアップデートに継続的なコストが発生。
- ハイスキル要求
 テスト自動化ツールを効果的に活用するためには、一定のプログラミングスキルが必要。
- 全てを自動化できない
 全てのテストケースを自動化できるわけではなく、手動テストが必要なケースも存在。
- 複雑なシステムへの適用が困難
 大規模かつ複雑なシステムでは、テスト自動化の導入が困難な場合がある。
- ツール依存
 特定のツールに依存してしまうため、ツール変更に伴うコストが発生する可能性がある。
- 偽陽性/偽陰性
 テスト結果が誤っている可能性があり、その原因究明に時間がかかる場合がある。
- テストスクリプトの不具合
 テストスクリプト自体にバグが含まれている可能性があり、テスト結果の信頼性に影響を与える場合がある。
自然言語　学習メモ

# 学習内容まとめ
## 使用した教材
- Udemy : 【初心者向け】自然言語処理をPythonで学ぼう！
- ChatGPT
## 学習期間
3時間ほど、計2日
## 学習内容メモ
### 形態素解析
- 文章を形態素に分解し、各形態素に品詞などの属性を付与する。
  - 形態素 : 意味を持つ最小の単位
- 例）「私は学校へ行きます。」を形態素解析する
  - 私（名詞）
  - は（助詞）
  - 学校（名詞）
  - へ（助詞）
  - 行き（動詞）
  - ます（助動詞）
- 形態素解析ツールが複数存在する
  - MeCab　←今回使用」
  - JUMAN
  
### 文章の類似度
#### TF-IDF
- TF
  - 単語の出現頻度
  - 特定の文書内での単語の出現回数を示す値
- IDF
  - 逆文書頻度
  - 特定の単語がどれだけ多くの文書に出現するかを示す値
  - 出現率が低い単語はIDFが高くなる（レアな単語を検出する）

#### コサイン類似度
2つのベクトルの向きで類似度を測る

#### コサイン類似度の関数
$$
Cos類似度 = \frac{a_1b_1 + a_2b_2}{\sqrt{a_1^2+a_2^2}\sqrt{b_1^2+b_2^2}}
$$
#### Pythonで実装①（要Numpy）
~~~python
import numpy as np

def cos_sim(vec_a, vec_b):
    dot = np.dot(vec_a, vec_b)
    norm_a = np.linalg.norm(vec_a)
    norm_b = np.linalg.norm(vec_b)
    return dot / (norm_a * norm_b)
~~~
#### Pythonで実装②（要sklearn）
~~~python
# TFIDF行列をそのまま渡すだけで1行で計算できる
from sklearn.metrics.pairwise import cosine_similarity

cos_sim_matrix = cosine_similarity(tfidf_matrix)
~~~

### Word2Vec
- 単語をベクトルに変換する
- 単語の意味や文脈的な関係性を反映している
- ベクトル間の演算によって単語間の関係性を表現できる
$$
king - man = woman \approx queen
$$
- 文書分類、機械翻訳、感情分析などに利用
- 主に**CBOW**と**Skip-gram**という2つのモデルがある
#### CBOW
- 周辺単語から中心となる単語を予測するモデル。
- 例）私　は　xx　が　好き　➡　xxに入る単語を予測する
  - 猫　70%
  - 犬　20％
  - 魚　5％

#### Skip-gram
- 中心となる単語から周辺の単語を予測するモデル
- 例）xx xx 猫 xx xx ➡　xxに入る単語を予測する


### Doc2Vec
- 文章や段落単位でベクトルに変換する
- W2Vの拡張版で、文書全体の意味や内容を捉えるのに使う
- 文書分類、情報検索、レコメンデーションなどに利用

W2V、D2VどちらもPythonでライブラリを用いて簡単に実装することができる
[tips] OpensearchのAPIの叩き方

Openserachのドキュメントを読むと、APIに関連する大概の場面で以下のような表記が用いられています。
```
GET /_nodes/_cluster_manager/stats
```
https://opensearch.org/docs/latest/api-reference/nodes-apis/index/

初めて見た時はよくあるAPIのメソッドとパスの表記だろうと思ったんですが、なかなか混乱したのはこのパスを直接叩いて結果を取得しているような記載が、さまざまなブログなどで見受けられたことです。
例としては以下のような書き方です。
```
GET _cluster/health
{
  "cluster_name": "opensearch-cluster",
  "status": "green",
  "timed_out": false,
  "number_of_nodes": 2,
  "number_of_data_nodes": 2,
  "discovered_master": true,
  "discovered_cluster_manager": true,
  "active_primary_shards": 10,
  "active_shards": 20,
  "relocating_shards": 0,
  "initializing_shards": 0,
  "unassigned_shards": 0,
  "delayed_unassigned_shards": 0,
  "number_of_pending_tasks": 0,
  "number_of_in_flight_fetch": 0,
  "task_max_waiting_in_queue_millis": 0,
  "active_shards_percent_as_number": 100
}
```
Opensearch界隈にはホスト名を略す文化があるのか、あるいは他の理由か悩みましたが、少し勉強してみたらすぐ氷解したので、備忘録を兼ねて残しておこうと思います。

# 外部からAPIを叩く場合
Opensearch以外の一般的なケース同様、このAPIを外部から叩こうとした場合、パスの前にそのOpensearchクラスタのURLを補ってやる必要があります。例えば`localhost:9200`上で動作しているクラスタに対しては以下のようになります。
```
curl http://localhost:9200/_nodes/_cluster_manager/stats
```
実際のURLはhttpsや認証が有効になっているかどうかで多少変化します。例えばOpensearchのquickstartに載っている例だと、httpsが有効かつ認証が必要ということで、以下のようになっています。
```
curl https://localhost:9200 -ku admin:<custom-admin-password>
```
https://opensearch.org/docs/latest/getting-started/quickstart/#starting-your-cluster

`<custom-admin-password>`は起動時に設定したadminユーザのパスワードです。

このケースは他のREST APIと変わらないので、理解しやすいのではないでしょうか。

# dev toolを使用する場合
Opensearchのweb consoleにはdev toolというツールが用意されており、こちらを経由してOpensearchのAPIにリクエストを送ることもできます。
https://opensearch.org/docs/latest/getting-started/communicate/#sending-requests-in-dev-tools
この場合、使用するHTTPメソッド名とAPIのパスを記載するだけでそのAPIを叩くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144563/b686e878-8139-2453-098f-3aecc2470987.png)
冒頭で述べた、パスを直接叩いて結果を取得しているような記載というのは、このdev toolを使用したケースのことで、スクリーンショットを貼り付けるのではなく左画面の入力と右画面の出力を貼り付けていたようです。
bodyが必要なAPIをcurlなどのツールで叩く場合、引数の設定などがやや面倒になりますが、dev toolを使う場合はパスを指定したあと、直接bodyを記述することができるのが便利な点だと思います。以下はindexを追加する例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144563/3b4fca16-cd9d-be5d-c961-89178aa6ceff.png)
PUTメソッドを使用しているので、bodyを指定する必要がありますが、dev toolの場合パスの後に直接記述することができます。

# まとめ
OpensearchのAPIを利用する場合、外部からURLにアクセスする方法と、web consoleからdev toolを使用する方法があります。
外部からURLにアクセスする方法に比べ、dev toolを使用した場合、パスの指定を短くしたり、bodyの記述がやりやすくなったりします。

# 参考
* https://opensearch.org/docs/latest/getting-started/communicate/#sending-requests-in-dev-tools
* https://baubaubau.hatenablog.com/entry/2022/02/09/131555
【Mac】HEICファイルをJPEG変換するスクリプト

# はじめに
自分のスマートフォンはiphoneなのですが、写真の画像はHEICとかいうファイルで保存されてます。
このファイル形式自体はJPEGよりも圧縮効率が高く画質も良いという優れものです。

私事ですが少し前に車を購入し、ここ最近「みんから」という車用のSNSに投稿を始めました。
その際にHEICファイルが直接アップロードできないためにJPEGへ変換する必要が生じました。

ということで、今回はHEICをJPEGに変換するスクリプトを作成しました。

# ソースコード

```bash
#!/bin/bash

#画像変換スクリプト
echo "HEICファイルの一覧を表示します"
ls *.HEIC

echo "HEICファイルの変換を行いますか？"
read answer

if [ "$answer" != "${answer#[Yy]}" ] ;then
	echo "スクリプトを実行します"
else
	echo "スクリプトの実行をキャンセルしました。"
	exit
fi

for file in *.HEIC
do
	sips --setProperty formatOptions 50 -s format jpeg "$file" --out "${file%.*}.jpg"
	
	if [ $? -eq 0 ]; then
		rm "$file"
	else
		echo "変換に失敗しました: $file"
	fi
done
```

## 解説
フローとしては以下となります。
1. 対象ファイルの確認を目的にカレントディレクトリの拡張性"HEIC"のファイルを一覧表示させます
1. ファイル変換の実行判断を尋ねられるので、readコマンドで回答をインプットさせます
1. answer変数(回答結果)を元に実施の有無を判定します
1. for文でカレントディレクトリ内のHEICファイルの変換を逐次処理します

### 判定処理
readコマンドで判定用のパラーメタを入力することになるのですが、
この際に[yes]だったり、[y]だったり、大文字か小文字かなど様々な入力パターンがあるかと思います。
これらを論理和で記述していくのは中々辛いです。

ということで、少し工夫しbashの変数展開の前方一致除去を用いて手間を省きます。
ユーザが入力した文字列の先頭が Y もしくは y で始まる場合、その先頭一致した文字を削除します。
結果ユーザが入力したオリジナルのデータ(answer)との不一致が起こりますので、
これをTrue条件としてスクリプトを実行させます。

No や n などキャンセルを意図するような入力が行われた場合は、先頭文字が前方一致除去の条件に合致しないため何も除去されず結果if文はFalseで処理されるという訳です。

ここの一つ厄介な点としては、先頭がyから始まる適当な文字列でもTrueとして通過してしまう点ですね。
まぁこれは私的なスクリプトなため、このくらいの作り込みで手を引きます。

### 変換処理
sips は Mac でデフォルトで入っている画像編集用のコマンドです。
以下のようなコマンドのフォーマットとなります。
```bash:sips
sips <オプション> <入力パス>
```
このコマンドは画像フォーマットの変換も行えるため、これを用いてJPEGへ変換をかけていきます。

JPEGは圧縮率(画質)を指定可能なので、formatOptionsで任意の値に変更します。
尚、値は0~100の範囲をとります。

ファイル出力時も変数展開を工夫して手間を省きます。
``${file%.*}.jpg``このように書くことで、ファイル名から拡張子を除去し、新たにjpgの拡張子を追加した形で出力させます。


# 終わりに
個人的な目的のスクリプトだったので、今回そこまで作り込みをしませんでしたが、
さらに手間を加えれば汎用的な変換スクリプトとして使えるかも...
プログラマブル・ハードウェアとは

>次項では、最終的にスイッチ自体をよりプログラマブルにしたハードウェアの開発について説明する

# OpenFlowに限界を感じハードウェア自体に対してプログラマブルにすることになった。
>OpenFlowチップセットの限界を感じ他での、その後のSDNの開発はハードウェア自体をプログラマブルにすることとなった。ネットワーク・インタフェース・カード（NIC)とスイッチの両方で、プログマラブル・ハードウェアが数多く開発され、`パケット・フォーマットからフォワード動作までカスタマイズ可能`になった。
* パケット・フォーマットとは

https://zenn.dev/masahiro_toba/articles/4af9bdc9302b82#:~:text=IPv4%E3%81%AE%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%A7%E3%81%99%E3%80%82

### プログマラブル・ハードウェアの一般的なアーキテクチャ
>プロトコル非依存型スイッチ・アーキテクチャ(protocol-independent swich architecture)と呼ばれることもある。このアーキテクチャでは、固定した処理パイプライン群のそれぞれがマッチ・アクション・テーブル用のメモリとレジスタ・メモリ、および加算などの単純な演算機能を備えている。
p413

### RMT(Reconfigurable Match Tables: 再構成可能なマッチ・テーブル)
>RISCアーキテクチャに触発されたパイプライン・アーキテクチャである。`処理パイプラインの各ステージは、パケット・ヘッダーから情報を読み取り、単純な算術演算に基づいてヘッダーの値に変更を加え、その値をパケットに書き戻す`ことができる

* RISCアーキテクチャとは

https://qiita.com/masatom86650860/items/854b15d894b0d8c0497e

### アーキテクチャの構成
>このチップのアーキテクチャには、（パケットを解析する）`プログラマブル・パーサー`、`マッチ・ステージの集合`、および`「デパーサー」`が含まれる。

### マッチ・ステージは一つ一つの段階の処理
>`マッチ・ステージは、状態を保持し、入力パケットに対して算術演算や、単純なフォワード、廃棄などパケットの修正`を行うことができる。

### デパーサーは結果の値をパケットとして送出
>`デパーサーは結果の値をパケットとして送出`する。`読み出し/変更の各ステージは各ステージで維持されている状態`と、`パケットのメタデータ`（例えば、ここのパケットが見るキューの深さに関する情報)の`両方を変更することが可能`である。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

* プログラマブル・パーサーとは？
* マッチ・ステージとは？

# 感想
全般的に理解していないが今後理解したい。
システム開発時の詳細設計書系ついて④（OpenAPIを使用してのSwagger EditorのIF設計書について）

## 1.前回記事
　前回記事はこちらです。
　
　システム開発時の詳細設計書系ついて①（画面設計書について）
　<https://qiita.com/yu-F/items/1b7510d6f43707b09535>

　システム開発時の詳細設計書系ついて②（ ビジネスルールについて）
　<https://qiita.com/yu-F/items/7c9323d1f6c8121f8bf0>

　システム開発時の詳細設計書系ついて③（ API設計書について）
　<https://qiita.com/yu-F/items/6fda33fdb4cd328aeeb9>
　
　詳細設計書としての必要な資料一式について
　① 画面設計書（画面のレイアウト＋部品の説明＋DBの付き合わせ）
　② 画面に対してのビジネスルール
　③ API設計書
　④ OpenAPIを使用してのSwagger EditorのIF設計書

   今回は「④ OpenAPIを使用してのSwagger EditorのIF設計書」について書きます。
   
## 2.　Swagger EditorのIF設計書について
   
当設計書については、RestAPI用のOpenAPIを事前に作成する必要があります。
OpenAPIの書き方については標準のもののため、ここでは割愛します。

作成物として、API一覧で用意したものをOpenAPIとしてそれぞれ作成する必要があります。
（BFF,BEともに）
   
下記は例として準備した内容となります。

```openapi:shukanKokyakuJohoSearch.yaml
   openapi: 3.0.0
   info:
   title: 顧客検索API
   description: １週間においての顧客ごとの情報を検索するBFF
   version: 1.0.0
   servers:
     - url: https://localhost:8080
       description: 顧客検索API
   paths:
    /shukanKyokyakuJohoSearch:
    get:
      operationId: getShukanTalentJohoSearch
      summary: １週間においての顧客ごとの情報を返す
      description: １週間においての顧客ごとの情報を返す
      parameters:
        - in: query
          name: userId
          required: false
          schema:
            type: string
      responses:
        '200':
          description: 正常終了
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/kokyakuJoho'
   components:
     schemas:
      kokyakuJoho:
       description: １週間においての顧客情報
       type: object
       properties:
        kokyakuId:
          type: string
          description: 顧客ID
        kokyakuName:
          type: string
          description: 顧客名
```

## ３. 実例
２で用意したOpenAPIをIFの設計書に見立てて、Swagger EditorのIF設計書を表示します。

① VsCodeでプラグインとして、「Swagger Viewer」をインストールします。
![スクリーンショット 2023-05-04 12.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/303d033f-fa9d-69a8-fa07-af4c7761e8dc.png)

②　２で用意したOpenAPIを開きます。
![スクリーンショット 2023-05-04 12.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/228cfaf7-3527-d01d-899e-0a60ec709aca.png)

③ Ctrl + Shift + Pで、「Preview Swagger」をクリックします。
![スクリーンショット 2023-05-04 12.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/46d139ec-4f9c-5eae-73ea-710ab6120df4.png)


④ 右側にIFの設計書が表示されるようになります。
![スクリーンショット 2023-05-04 12.41.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/0a6009de-fc41-562d-a2f7-3cd5a86c74af.png)
![スクリーンショット 2023-05-04 12.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/cc850106-1a3a-2f43-dd2c-c4f237fc278a.png)

※各項目の解説についてはSwaggerEditorで標準のもののため、割愛します。

## ４. 終わりに
４回に渡る記事にて詳細設計書の書き方について説明しましたが、現場により本当にバラバラのため、ベストというものはないと思っております。
しかし統一して、言えることはPGがこれを見るとシステム開発ができるということは絶対となります。
私はこれから作成するシステムの課題をこれらのフォーマットに落としたのでそれを元に9月まで開発を進めていく予定です。
長きにわたり、詳細設計書シリーズを書いてきましたがこれにて終了します。
ありがとうございました。
システム開発時の詳細設計書系ついて②（ビジネスルールについて）

## 1.前回記事
　前回記事はこちらです。
　
　システム開発時の詳細設計書系ついて①（画面設計書について）
　<https://qiita.com/yu-F/items/1b7510d6f43707b09535>

　詳細設計書としての必要な資料一式について
　① 画面設計書（画面のレイアウト＋部品の説明＋DBの付き合わせ）
　② 画面に対してのビジネスルール
　③ API設計書
　④ OpenAPIを使用してのSwagger EditorのIF設計書

   前回は、「　システム開発時の詳細設計書系ついて①（画面設計書について）について記事を書きました。今回は「② 画面に対してのビジネスルール」について書きます。
   
## 2.各資料の役割について（画面に対してのビジネスルール）
   
#### 1. 処理一覧
　「No」、「イベント名」、「処理概要」を連動させて書く。

→Noは、当イベントの項番を記載する。（上から１、２、３、・・・）

→イベント名は、基本的には①の画面設計書の（3.【イベント情報】イベント名）の内容を記載し、画面設計書のイベント名と連動させる。

→処理概要は、基本的には①の画面設計書の（3.【イベント情報】処理概要）の内容を記載し、画面設計書の処理概要と連動させる。気持ち的には①の画面設計書の処理概要よりは少し肉付けした内容で記載する。

例）「No」、「イベント名」、「処理概要」
→ No：２、
→ イベント名：検索ボタン押下時
→ 処理概要：検索条件の各値を取得し、パラメータとして、API「顧客情報検索」を呼出。
APIからの戻り件数0件の場合は、ヘッダーのみ表示する。
1件以上の場合は、ヘッダーとデータを表示する。

#### 2. 処理詳細

　　(1. 処理一覧)のイベント名ごとに大分類の項番を分ける。

・上記の項番をさらに細分化していき、処理の概要を細分化していく。
       
・細分化時に、さすがにプログラムのステップごとに細分化はできないが、ある程度の最小の処理単位で分けていくことを意識する。ここで細分化していき、最終的には処理概要に記載した内容が実現できるようにすること。
※細分化していく際に、前半と後半で流れに矛盾がでないように気を付ける。　
　　
例）
2.2 検索ボタン押下時

　2-2-1. バリデーションチェックとして、以下のチェックを行う。	
	　①対象年月、対象週が必須で入力されていること。
	　②対象年月がYYYY/MM形式であること。
	　③対象週が数値かつ、1～5の数値のいずれかであること。
	　④顧客名が30桁以内であること。
	　※上記のチェック結果を画面上部に表示する。
	
　2-2-2. API「顧客情報検索」を呼び出す（API情報は別ブック_API情報を参照）	
	
　2-2-3.【2-2-2】で取得した結果が存在する場合は、レスポンスの内容を対象週(FROM)～対象週(TO)とデータ部へ設定する。	
	
　2-2-4.【2-2-3】で取得した結果がない場合は、対象週(FROM)～対象週(TO)とヘッダーのみを表示させる。	
	
　2-2-5.【2-2-4】で取得した結果のうち、データが10件を超える場合は、最初の10件を表示させ、残りは10件ずつ別の領域に保管してページングリンクを表示させる。

## ３. 実例
　以下、２を踏まえのフォーマットとなります。
![IMG_0299.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/25a86ef4-2471-dce0-e8b4-48c9275578fc.jpeg)


次回、③ API設計書へ続く。。
システム開発時の詳細設計書系ついて①（画面設計書について）

## 1.　はじめに
１年半前に記載しましたが消えてしまったので、再度投稿します。
２年前に現場で詳細設計書のようなものを書いていたので、その際のフォーマットに沿って、
自作の課題として作ったのでそれを元に載せていきます。

## 2.各資料の役割について（画面部品情報）

この後の、1. 【画面イメージ】〜 5.【DB情報】を見出しにして、
画面設計書（画面のレイアウト＋部品の説明＋DBの付き合わせ）の観点で、
各項目を書いていきます。
   
#### 1. 【画面イメージ】

以下のようにエクセルベースのイメージを作ったものを載せます。
機能をなんとなく配置してこういうふうになればいいなというレベルで問題ないと思います。

![スクリーンショット 2024-11-24 13.59.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/2296824c-3fd6-f708-f9c9-182e31f8d434.png)

実際に後日に、画面を作成後は以下のように貼り付けなおします。
![スクリーンショット 2024-11-24 14.22.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/c187e63b-5fb2-158c-8df3-5200bfbb00b9.png)
![スクリーンショット 2024-11-24 14.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/2c7a3fed-e1c2-4133-d9bb-00a8ba7a0f46.png)
![スクリーンショット 2024-11-24 14.22.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/9b0bc27f-4086-1cb3-fd7e-1b96ac963cac.png)


#### 2.【機能概要】
この画面を使って何ができるのか、何を実現したいのかの仕様を書きます。
ボタンやリンクごとに書いていきます。
詳細はビジネスルール側に書くのでイメージレベルを書いていきます。

![スクリーンショット 2024-11-24 14.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/4e39e16e-dc1f-d6dd-7a6c-b49448de613d.png)

#### 3.【イベント情報】
初期表示時やボタン押下時、リンククリックの挙動を、「イベント名」、「処理概要」に分けて記載していきます。処理概要時よりは詳細に、ビジネスロジックほどは詳細に書かなくてもいいレベルです（裁量は難しいですが）

![スクリーンショット 2024-11-24 14.02.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/bbdf1274-ffb3-f5c8-26ea-b67dab3cddc2.png)

#### 4.【フォーム情報】
画面に配置している項目の内容と、その部品（label,textなど）、説明を「項目名」、「部品」、「備考」に分けて記載していきます。

![スクリーンショット 2024-11-24 14.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/ad54b5b2-3346-b313-8631-1baa680544a7.png)

#### 5.【DB情報】
4.【フォーム情報】の行に並べて、取得元のテーブル、取得列、データ型、桁数、備考に分けて
情報を羅列してきます。

![スクリーンショット 2024-11-24 14.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/63ac0c8b-72d3-b9c5-037d-ec9a3674d17a.png)

行に並べた場合
![スクリーンショット 2024-11-24 14.06.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/2f93ef80-7ae4-b9cd-2db7-2940f553eadb.png)

#### 6.終わりに
以下のような流れで書きました。

![スクリーンショット 2024-11-24 14.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583781/2e1d210e-e001-c901-fbea-bad98d9fb3c2.png)


以降は、１年半前に記載しました
② 画面に対してのビジネスルール　へ続きます。
dockerをsudoなしで（mac）

## エラー

sudoつけないとパーミッションがアレなんでってエラーが。

```bash
$ docker compose build
WARN[0000] The "HOST_UID" variable is not set. Defaulting to a blank string.
WARN[0000] The "HOST_GID" variable is not set. Defaulting to a blank string.
open /Users/iuchi/.docker/buildx/current: permission denied
```

## 対策

該当ファイルのオーナーを自分に。

```bash
$ sudo chown -R `whoami` ~/.docker/buildx/current
```

### 補足

whoamiはログインユーザー名（自分）の名前を返してくれるよ！

```
$ whoami
iuchi
```


## 確認環境

```bash
$ sw_vers
ProductName:            macOS
ProductVersion:         15.0.1
BuildVersion:           24A348
```

```bash
$ docker --version
Docker version 27.3.1, build ce12230
```
firebaseを利用してAuth認証をデプロイ先でも利用したい。エラー解決

## はじめに
ローカルでgoogleの認証が使えたのにデプロイ先で以下のエラーが出る際の解決記事です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/c447259b-4de5-1d4b-404a-91473187964c.png)

## 解決方法
画像の最後にdomainという文字があるのでだいたい見当つきそうですが
ドメインの認証ができていないために起こっているエラー。

ローカルでできたのはローカルのドメイン＝localhostは認証されているから。

Authenticationのページに遷移して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/ce9a9380-9b8d-019d-fc38-89ef6ba3346b.png)

設定タブの認証ドメインを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832683/17473b56-6fbe-02bd-5b73-500d46525e72.png)
デフォルトでlocalhostがいることが確認できると思います。

個々の認証ドメインの追加を押下してデプロイ先のドメインを追加してあげましょう。
これでデプロイ先からでもAuth認証が使えるようになるはずです。
フリーランスエンジニアがエージェントに伝えるべき参画条件

# はじめに

フリーランスエンジニアとして、エージェントに案件を探してもらう際に伝えるべき内容をまとめてみました。これらの条件を明確に伝え忘れると、参画後のミスマッチにつながり、後悔してしまう可能性があるため、事前の確認が重要です。

# 契約面での希望

## 単価
- 希望する単価（税込・税抜・エージェントの手数料が引かれた後の金額であるかの確認）
- 請求時期
- 交通費の精算有無

## 契約条件
- 契約期間の希望
- 稼働日数の確認
- 更新時期・条件の確認

# 技術面での希望

## 現在のスキル
- 得意とする技術領域
- フレームワークやライブラリの経験
- 担当したことのある開発フェーズ
- 特に強みとする技術分野

## 技術的な希望
- 携わりたい技術領域
- チャレンジしてみたい新しい技術
- 希望する役割や担当範囲

# 実務面での希望

## 勤務形態
- リモートワークの希望有無
- 最寄りから出社する駅までの時間
- 希望する就業時間帯
- 準備する開発機材の範囲
- テレワーク時のネットワーク要件

## プロジェクト
- 希望するプロジェクトフェーズ
- 経験したい業務内容
- チーム規模の希望
- 開発プロセスの希望
- 参画時期の希望
- 期待される成果物

# さいごに

案件を探してもらう際は、できるだけ具体的に希望を伝えることで、条件に合った案件を紹介してもらいやすくなります。
また、これらの条件は優先順位をつけて伝えることで、より柔軟な案件検討が可能になります。
RISCとは

# プロセッサの命令セットアーキテクチャ
>`プロセッサ(CPU)の命令セットアーキテクチャには、CISCとRISC`があります。

# RISC
>`RISCはCISCが持つ処理効率の悪さを改善するために提案`された方式です。
RISCでは、極力単純で短い機械語命令だけを実装し、専用の論理回路で高速に実行できるようにしています。こうすることによって、`各命令の処理時間を均一化`し、パイプライン処理などの`処理速度向上技術を実装しやすく`しています。
しかし、用意される命令が単純で少ないため、プログラミングの手間はCISCに比べて増大します。また、`単純な命令を実行する専用の論理回路`によって構成されているため、拡張性に乏しい点もデメリットにあります。プログラムを追加すれば機能を追加できるCISCに比べると、自由に拡張性は困難です。
P133

>実装方式:ワイヤードロジック
命令語長: 固定、短い
メリット: １命令の処理が単純で高速化しやすい。パイプライン向き
デメリット: １命令では単純な処理しかできない

https://gihyo.jp/book/2023/978-4-297-13865-3

### 命令セットアーキテクチャとは？
>命令セットアーキテクチャとは、`CPUの回路を直接動作させるために2進数で書かれた機械語の命令や内部構造などの仕様を規格化`することで、プログラミング言語から抽象的に扱いやすくしたもの。
>
>命令セットアーキテクチャが同じであれば、集積化が進んでCPU内部の構造が変わってしまっても同じソフトウェアを実行できる。

>命令セットアーキテクチャは、`CPUの動作について「こうすればこう動く」ということを定めた`ものです。`ソフトウェア側から見たCPUの動かし方とその結果について仕様を定めた`もので、実際のCPU`内部をどのように実装するかには触れていません`。入力と出力が規定通りならば中身の処理は何でもOKというわけです。このように`仕様と切り離された内部実装のことをマイクロアーキテクチャ`と呼びます。

https://ipsj-catalog.jp/glossary/parlance/18.html#:~:text=%E5%91%BD%E4%BB%A4%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A8,%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82
「送信者IDコンプライアンスを有効にする」という設定について

**使っているクラウドなどの小ネタ Advent Calendar 2024 10日目**


+ [Identity for mobile-centric customers - email won't send DKIM/SPF issue](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000J5zgF)

:::note alert
550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM.
:::


このエラーの回避策としては「送信者IDコンプライアンスを有効にする」をオフにするとのことですが...

https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007Ywafr

プレイグランドには何故かこの設定がない？？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/af2cd94e-7337-daaf-ee8f-cc39e8cac6b1.png)


開発者環境にはあるのですが...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/735d88f7-df01-59e7-f437-0a76e7662dbd.png)


+ [メタデータ:EmailAdministrationSettings](https://developer.salesforce.com/docs/atlas.en-us.api_meta.meta/api_meta/meta_emailadministrationsettings.htm)

このオブジェクトはSOQLではアクセスできないですね。

+ [組織内で SOQL または API 経由で電子メールが有効になっているかどうかを確認するにはどうすればよいですか?](https://salesforce.stackexchange.com/questions/306964/how-do-i-know-if-emails-are-enabled-in-my-organization-via-soql-or-api)

# うまくいってない例

+ [私のプレイグラウンドがメールを一貫して送信しないのはなぜですか。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007UOyC6SAL)
+ [【解説】Learn How to Prevent Your Emails from Being Marked As Spam and Achieve High Email Deliverability Rates](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000OqgBaSAJ)
ExpressRoute における Basic SKU IP の廃止に伴う対応について

この記事は [Microsoft Azure Advent Calendar 2024](https://qiita.com/advent-calendar/2024/azure) の 2 日目の記事です。


先日、[#ExpressRouteExplorers](https://x.com/hashtag/ExpressRouteExplorers?src=hashtag_click&f=live) で ExpressRoute の検証環境を触らせていただくことができました！
そういえばごく一部の ExpressRoute ユーザーが困るかもしれないことがあったなと思い出したので、検証させていただき記事にしました。

# Basic SKU IP が廃止される

新しく ExpressRoute を使用する方は関係ないのですが、以前から ExpressRoute を使用している方は ExpressRoute Gateway の IP が Basic SKU の可能性があります。
[Basic IP は 2025 年 9 月 30 日に廃止されます。](https://learn.microsoft.com/ja-jp/azure/virtual-network/ip-services/public-ip-basic-upgrade-guidance?WT.mc_id=MVP_380462)多くのリソースの IP はアップグレードスクリプトで Standard にアップグレードできますが、ExpressRoute Gateway の IP は 2024 年 12 月現在でアップグレードスクリプトに対応しておらず、ExpressRoute Gateway を作り直す必要があります。え、もう 1 年切っているんですか。
何が怖いって、ExpressRoute の性質上、Gateway 作り直してみた！みたいな記事が見つけられないんですよね。皆さんどうしているんでしょうか？

今回、ExpressRoute の検証環境を使うことができたので、実際にこの ExpressRoute Gateway の作り直しの作業をやってみました。
手順とおおよその作業時間を以下に記載します。

**この記事は個人の検証の範囲で実施したもののため、実態に即さない可能性があります。あくまで参考程度とお考え下さい。**


# 事前準備

・GW 削除して良さそうな時間を考える
サーバーのバッチの開始終了時間など考慮

・ユーザーへの周知等


# 実作業

・仮想ネットワークゲートウェイと ExpressRoute の [接続] の削除
接続削除後でないと ER GW 削除できない
→実績8分程度

・ExpressRoute Gateway（仮想ネットワークゲートウェイ）の削除
→実績8分程度

・ExpressRoute Gateway の Basic SKU IP の削除
→すぐ

・ExpressRoute Gateway の再作成
→実績21分程度

・仮想ネットワークゲートウェイと ExpressRoute の [接続] の作成
→実績4分程度

・疎通確認等

# 所感

検証環境でさくさくやっていても 1 時間近くかかるので、本番環境ならパラメータ確認等でもう少し時間がかかると思います。
作業時間＝ NW 断の時間は長めにとっておいた方がよいです。
ちなみに、ExpressRoute Gateway とその IP を同時に削除するみたいなやんちゃをすると削除失敗してもっと時間かかるのでやめましょう。

作業終わった方、お疲れ様でした。
もう Basic IP のことは考えなくていいですね！

# 宣伝

Azure の勉強会に参加したい方、今がチャンスです。
なんと Japan Azure User Group のイベントがまだ年内に 2 回残っています！

[12/6 金 19:00- JAZUG for Women #5](https://jazug.connpass.com/event/331400/)
→ 現地は女性のみ オンライン参加はすべてのジェンダー
　現地ではお菓子を持ち寄ってパーティーしましょう:cookie::candy:

[12/18 水 19:00- Tokyo Jazug Night #50](https://jazug.connpass.com/event/335527/)
→ 恒例年末 LT 大会！
　10 分 LT が 9 本と盛りだくさんです
会計分野が苦手なので仕分の基本的なメモしとく

エンジニアだけど経理関係（主に仕分け）の知識を問われる場面が時々ありその都度「あれ、なんだっけ？、何が収益でどっちに仕分け切るんだっけ？」と調べ直すことが多いのでほんとに初級レベルのことだけどメモっておく。
会計システムの担当でなくても販売や購買システムでも仕分けデータを会計システムにIF連携することなどがあるのでまぁエンジニア視点でも最低限の業務知識として必要だと思われるので忘れないようにしたい。（すぐ忘れちゃうんですよね。。。）

## 1.貸借対対照表（B/S）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/13819830-324e-f158-c7b0-6e57bd342e90.png)


## 2.損益計算書（P/L）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/e6ff0b02-2fe8-31a9-fb47-de7811af481a.png)


## 3.それぞれ借方・貸方どっちに書くか
一覧にまとめて置く基本的には増加するほうだけ覚えておけばいい、具体的なパターンも併せてまとめて置く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3785085/920627bb-955c-45e2-d075-d32157f76c91.png)

それぞれの勘定科目がどんな場合に借方・貸方どっちに乗るかは一旦売掛のパターンだけ覚えておけばいいかな買掛はその逆になるわけだし。

後々追記するかもしれません。
nginx で 謎redirect 発生して悩んだ

# /etc/hosts は鬼門
明日使えないクソ知識ですが、nginxでreverse proxyの設定をやってて、どうしても wordpressのリダイレクトでハマったとき、観ておいたほうがいいものは、 /etc/hosts の記述です。

* redirect 対象が /etc/hosts に書かれているとエライことになる。

なんでそんなもん書いてあったか忘れたんですが、なんかのテストで書いたんでしょう。
忘れてて放置し,当該サイトを分離して別に移そうなんてときにこの罠が発動します。
意味不明なループをしてログがろくろく出ませんので悩みますが、なんてことはない。
名前解決でループしちゃっているという落ちです。

まあ、そんなこと、賢いみんなはすぐ見つけてくださいね。ではまた。
Blender　同一変更のやり方と一括モディファイアのかけ方

オブジェクトを複製した際に変更箇所を一緒に行いたい場合に有効
alt+Dを選択して複製を行う
この複製方法でモデルの変更が同時に反映される
なおサイズや造形のみでモディファイアは一緒にならないのでモディファイアに関しては以下の方法を利用する

反映させたいモディファイアのオブジェクトを最後に選択
反映させたいモディファイアのチェックボックスからCopy to Selectedを選択すると一括で反映させれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/330568/a718f8b1-df20-1fdb-c4d0-6b2c23712290.png)

参考動画

https://www.youtube.com/watch?v=iq_0n9iiTBM&list=WL&index=77
ソースマップとは

# はじめに

業務でソースマップの設定をすることがあり、何ですかそれ状態だったので調べました。

# ソースマップって何？

コンパイル前のコードとコンパイル後のコードの対応関係を表したファイル。

フロントエンド開発においては、Vue.jsなどのフレームワーク特有のファイルがJSにコンパイルされたり、コードがminify（圧縮）されたりしていて、ビルドされたコードは開発時に記述したコードとは似ても似つかないものになります。
そのため、コンパイル後のコードを見ても、どこでエラーが起きているかといったことが特定しづらくなっているのです。

ソースマップを使うことで、コンパイル前の、開発時に記述したコードがコンソールなどに表示されるようになり、コードを追いやすくなります。
開発用のツールの一種ということですね。

# 試してみる

[`create-vue`](https://ja.vuejs.org/guide/quick-start)で作成できる基本的なVueプロジェクトでソースマップの働きを確認しみてみます。
ビルドツールはViteです！

↓こんなサイトです。
![スクリーンショット 2024-11-23 21.47.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892166/62c2c049-a6f8-6034-6718-50c28780634d.png)

## デフォルトの設定

まずは普通にビルドしてみます。

以下のファイルが生成されました。
- `index.html`
- `assets/index-CUkVw1a.js`
- `assets/index-TXLObeWa.css`

これを`vite preview`（ローカルでビルドをプレビューできるViteの機能）してみます。

ビルドされたファイルがそのままデバッグツールのソースタブに表示されました。

![スクリーンショット 2024-11-23 21.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892166/c1922a35-cc81-f409-9505-5c12829c3049.png)

minifyされていてとても読みづらい（読めない）ことがわかると思います。

## ソースマップを生成してみる

`vite.config.ts`に以下の内容を追記して、ビルド時にソースマップが生成されるようにします。

```javascript:vite.config.ts
...
export default defineConfig({
    ...
    // 追記
    build:{
        sourcemap: true
    }
})
```

ビルドしたら、前回のビルド成果物に加えて、`assets/index-CUkVw1a.js.map`が生成されています。

![スクリーンショット 2024-11-23 23.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892166/1f0d1483-d6b5-3b4b-5af6-47c28fea0e7c.png)

previewしてみましょう。

![スクリーンショット 2024-11-24 0.01.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892166/e8233ec7-0272-28e1-d715-4e17f247ad07.png)

srcディレクトリ（とnode_modulesディレクトリ）が追加され、コンパイル前のコードがみれるようになっていました！

![スクリーンショット 2024-11-24 0.38.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3892166/8bfb4ff8-44e3-0195-235e-cb9f5f05e857.png)

「ソースマップを読み込みました」というメッセージも表示されます。

mapファイルの中身はjson形式になっています。`file`, `sources`, `sourcesContent`, `names`といったプロパティがあり、これらのデータをもとに元のソースコードを復元しているようです。

またコンパイルされたJSファイルの末尾に
```javascript
//# sourceMappingURL=index-CUkVfw1a.js.map
```
という行が挿入されていて、この行を編集するとコンパイル前のソースコードが見られなくなったので、このコメントでJSファイルとソースマップファイルの対応づけをしているのだと思います。

# おわりに

ソースマップを有効にしているとデプロイ先でもコンパイル前のソースコードが見られるようになってしまうので、あまり設定する機会はないかもしれません。（自分はSentryでソースコードを表示させるために使いました）
必要な場合のみ適切に使っていきましょう！
【ChatGPT】論文などの書類をもとに、内容を理解する手順です。


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

　今回は、論文などの書類をもとに、内容を理解する手順です。

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

***
　ニュースはありませんので、
　　さっそく、本題です。

　今回は、
　　論文などの書類をもとに、
　　　内容を理解する手順です。

　超デッカイ資料なんか
　　いちいち読んでいられませんよね。
　　　内容が専門的だとか他言語だとか
　　　　だと、余計に、ですよね。

　そこで
　　ChatGPTを経由して、
　　　自分の読める状態にした方が
　　　　理解もできるし、
　　　　　時短にもなります。

　では、手順です。

　手順
　❶URLの指定、
　　　あるいはファイルをアップロード
　❷送信
　　　（結果、概要が出力される）

　あとは、
　　自分の読みやすい
　　　言葉遣いを指定して、
　　　　質問を繰り返してください。

　例えば、
　　中学生レベルで
　　　説明が欲しい場合は
```Text:言葉遣いの指定Prompt
今後は、ユーザーの質問への回答は、中学生にわかりやすくお願いします。
```

　を入力・送信すれば
　　あとは中学生レベルに
　　　わかりやすい説明に
　　　　なります。

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

　今回は、ここまで。
ドラッグ&ドロップでRESULT_CODE_KILLED_BAD_MESSAGE エラーが出てしまう。

## 前提

フロントエンド: React
バックエンド: FastAPI
Webサーバー: nginx
インフラ: AWS EC2でホスティング

機能概要:
ユーザーがCSVファイルをアップロードし、バックエンドで必要な処理を実行します。

## 結論

- SSL化していないとサイトへのファイルのアップロードがRESULT_CODE_KILLED_BAD_MESSAGE エラーでできない(できるブラウザもあるが、メインどころはできない)
- WEBサイト・サービスはSSL化しましょう

## 発生した事象

数日前までドラッグ&ドロップが普通にできていましたが、2024年11月13日頃からドラッグ&ドロップをした際にエラーが発生するようになりました。

エラー内容は、```RESULT_CODE_KILLED_BAD_MESSAGE```と表示されていました。
これはブラウザで発生しているエラーでバックエンドにリクエスト自体が飛んでいませんでした。

## 原因を調べる

何が起きているのかよく分からず、試行錯誤しました。
Chrome, Edge, safariで同様の事象が確認されましたが、Braveブラウザではこの問題は出ませんでした。
ローカルでサーバーを起動して、ローカルサーバーを起動した際はChrome, Edge, safariでドラッグ&ドロップでのアップロードができました。

こちらの設定などを何も変えず、ブラウザで挙動が変わることを確認できたのでブラウザの設定の何かだろうと思いました。特に、ローカルで動かした時には動いたのでよく分かりません。
そんな時に、ブラウザで「保護されていない通信」という文字が目に止まり、SSL化してないことが原因なんじゃね？と思いました。

## SSL化してみた

今回はホスティングをEC2でやっているので、Route53でドメインの取得と証明書の発行をしました。
そしてALBでSSL化をしてみました。

**問題解決!!**

SSLを2日くらいかけてやってみたら、解決しました。
おそらくSSL化されていないサイトの場合、ブラウザがセキュリティでファイルのアップロードをブロックしていたのだと思います。

## 結論

やっぱり今の時代SSL化してないと、ローカルでは動いても
本番環境ではブラウザがブロックしてしまうことがあるようです。

今回SSL化の手順もある程度勉強できたので、これからはWEBに公開するときはSSL化しようと思いました。
がんばらない競プロ千里行 〜AtCoder入緑を目指して〜【〜14日目：ちゃんと続けていたよ】

コイツ、もう挫折したのかと思われた方。実はちゃんとやっていました。
👇 前の記事

https://qiita.com/KyongminS/items/aeba57ba1b46e5d01e5e

# 14日目までにやったこと
とりあえず毎日
1. AOJのAtCoder Beginners Selection
2. AtCoderのIntroduction To Programming I

はコツコツやっていました。それ以外やっていません。

コンテストは「AtCoder Beginner Contest 381」だけ参加しました。

## 改めて「がんばらない」ルール
- 使う教材は以下の記事とその記事内で紹介されている記事のみ

https://qiita.com/e869120/items/f1c6f98364d1443148b3

- 1日3問以上練習問題を解かない
- 1時間以上競プロに時間を割かない（コンテストは除く）
- JavaScriptのみを使う
- 他人と比較しない

# 目標
中期目標：2025/1/15 までにAtCoderで入茶する
最終目標：2025/3/31までにAtCoderで入緑する

# このルールで2週間やった結果
**結論：A,B問題くらいなら時間をかけたら正解できそう。**

「AtCoder Beginner Contest 381」に参加した結果です。

![atcoder.jp_users_tenkawa_k.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374872/20d046e7-3fb2-7f43-d3e7-43f4c5c9caa7.png)

40分くらいかけて2完でしたところで完全に集中力が切れて、C,D問題にそれぞれ1回アタックしてTLEが出たところで飽きたので終わりました。集中力が一番の敵まであります。
A, B問題は毎日練習問題やっていたから正解した気がします。C,D問題は「あ、これなんかコツいりそうだけど多分知らねぇわ」って思いながらやって案の定TLEが出ました。
レート15って。

# 次のコンテストまでにやること
- アルゴリズムの引き出しが壊滅的に無いので、一個くらい引き出しを作ろうと思います
    - 全文探索？みたいなやつに手を出しみようかな
- AtCoderの Introduction To Programming I は全部解き終えたので適当な過去コンテストを毎日1問だけ解くようにします
- AOJのAtCoder Beginners Selection は引き続き行います

---
ここまでが第1章で、第2章はこの2週間で「あ、これ結構使いそう」と思ったJavaScriptのコードテクをメモしたいと思います。

# 14日間やってみて競プロでよく使いそうだと思ったJavaScriptのコード
## 標準入力の処理
これ書けないと間違いなく死ぬ。
```js:標準入力
const a = require("fs").readFileSync("/dev/stdin", "utf8")
```

ここから派生して色々やります。

```js:標準入力派生
// 標準入力で受け付けた文字を分割して数値にする
const [a,b] 
= require("fs").readFileSync("/dev/stdin", "utf8").trim().split(" ").map(Number);

// 1行目が要素数で2行目以降に処理する対象系の問題
const [N, ...An] 
= require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");
for (const Ai of An.slice(0,N)) {
    // ...
}
```

## 数値操作
### ソート
JSのソートの仕様、結構ややこしいけど「return値が1以上なら右（👉👉👉👉）に追いやる」で覚える。
```js
const nums = [10, 4, 9];
const sorted = nums.sort((a,b) => a - b); // [4, 9, 10]
```
### 配列内の数値の合計
```js: reduceを使う
const num = [1,2,3];
const sum = num.reduce((a,b)=> a + b)); // 6
```

### 最大値を取り出す
```js:スプレッド演算子で展開するのがポイント
const nums = [1, 10, 5];
console.log(Math.max(...nums)); // 10
```

### 各桁の合計
一旦数字を文字に変換して一文字ずつ分割後、各項を合計する。最初に思いついた人すげーと思った。
```js: 一旦文字列にする
const num = 1235;
const sum = [...num.toString()].map(Number).reduce((a,b) => a + b); // 11
```

### 割り算の整数値を取り出す
```js
Math.floor(a/b); // 2.34566 の 2が取得できる
```

### 小数点の桁数を指定
罠だけど「文字列」が返ってくる。
```js:toFixedを使う
(a/b).toFixed(6); // <- 指定したい桁数を引数に入れる
```

## 文字列操作
### 反転
これから使いそう。
```js
const str = "abcdef";
const revstr = str.split("").reverse().join(""); // fedcba
```

## 配列操作
### 指定回数繰り返す
```js
[...Array(5)].map((v,i) => console.log('i'))
```
回数が超大きい数字だとメモリエラー起こしそうなので、その場合はジェネレータを使う。100万以上の要素を取り扱いそうなら選択肢に入れる。
```js
function* gen(n) {
    for (let i = 0; i < n; i++) {
        yield i;
    }
}

for (const g of gen(1000000)) {
    console.log(g);
}
```
👇 参考

https://techblog.gmo-ap.jp/2024/11/19/js-generator-yield/#generator_delay

### 中身が全部同じか判定
文字列に変換する。文字列変換は超便利っぽい。
```js:
array1.toString() === array2.toString()
```

### 要素の種類の数を取得
`new Set()` を使う。
```js: Setはチート
const array = [1,1,2,2,3,3];
const s = new Set(array);
console.log(s.size); // 3
```
atcoder練習(2024.11.24)

# キーワード

# 問題
https://atcoder.jp/contests/abc381/tasks/abc381_c

文字列 T が以下の条件を全て満たすとき、T を 11/22 文字列と呼びます。

|T| は奇数である。ここで、|T| は T の長さを表す。

1 文字目から (|T|+1)/2 - 1 文字目までが "1" である。

(|T|+1)/2 文字目が "/" である。

(|T|+1)/2 + 1 文字目から |T| 文字目までが "2" である。

例えば "11/22", "111/222", "/" は 11/22 文字列ですが、"1122", "1/22", "11/2222", "22/11", "//2/2/211" はそうではありません。

1, 2, / からなる長さ N の文字列 S が与えられます。S は / を 1 個以上含みます。11/22 文字列であるような S の(連続な)部分文字列の長さの最大値を求めてください。

制約

1 ≤ N ≤ 2 × 10^5

S は "1", "2", "/" からなる長さ N の文字列

S は / を 1 個以上含む

入力

入力は以下の形式で標準入力から与えられます。

N
S

出力

11/22 文字列であるような S の(連続な)部分文字列の長さの最大値を出力せよ。

入力例 1

8
211/2212

出力例 1

5

S の 2 文字目から 6 文字目からなる部分文字列は 11/22 で、これは 11/22 文字列です。S の部分文字列のうち 11/22 文字列であるものはこれが最長です。よって 5 が答えです。

入力例 2

5
22/11

出力例 2

1

入力例 3

22
/1211/2///2111/2222/11

出力例 3
# 回答
```Python
n = int(input())
s = input()
ans=0

for i in range(n):
  if s[i] == "/":
    key = 1
    for j in range(1, n//2+1):
      if i-j>=0 and i+j<=n-1 and s[i-j]=="1" and s[i+j]=="2":
        key += 2
      else:
        break
    ans = max(key,ans)
    
print(ans)
```

# 参考
https://atcoder.jp/contests/abc381/submissions/60137336
# 備考
- すみません、答えみました。マジで分かりませんでした。elel6021様ありがとうございます。
- 全体的な挙動は理解しているもののの、正確な挙動は理解できていません。
- 自分の発想としては"1"を探す方法だったけど、この方法の方が綺麗そう。
- 全てのS[i]をfor文で探すこともできそうだけど、それだと実行時間が超過しそうな気がする。
Docker-MySQL起動時にプロジェクト内に配置したDDLファイルを読み込ませる方法

## 記事内容
DockerでMySQLを起動する際に、プロジェクト内に配置したDDLファイル（テーブル作成用SQLスクリプト）を読み込ませて自動でテーブルを作成する方法を以下に示します。


## **手順**

### 1. **DDLファイルの準備**  
   プロジェクト内にDDLファイル（例: `schema.sql`）を作成します。このファイルには、必要なテーブル作成SQLを記述します。

   #### **例: `schema.sql`**
   ```sql
   CREATE TABLE IF NOT EXISTS users (
       id INT AUTO_INCREMENT PRIMARY KEY,
       username VARCHAR(50) NOT NULL UNIQUE,
       password VARCHAR(255) NOT NULL,
       role VARCHAR(20) NOT NULL
   );

   CREATE TABLE IF NOT EXISTS timetables (
       id INT AUTO_INCREMENT PRIMARY KEY,
       user_id INT NOT NULL,
       day_of_week VARCHAR(10) NOT NULL,
       start_time TIME NOT NULL,
       end_time TIME NOT NULL,
       subject VARCHAR(100) NOT NULL,
       FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
   );
   ```

### 2. **DDLファイルの配置**  
   DDLファイルをプロジェクトディレクトリ内に配置し、Dockerコンテナにマウントするように設定します。

   配置例:
   ```
   project-root/
   ├── docker-compose.yml
   ├── sql/
   │   └── schema.sql
   ```


### 3. **`docker-compose.yml`を修正**  
   MySQLの`volumes`設定を追加し、DDLファイルをコンテナ内の`/docker-entrypoint-initdb.d/`にマウントします。

   #### 修正後の`docker-compose.yml`
   ```yaml
   version: '3.8'
   services:
     mysql:
       image: mysql:8.0
       container_name: app-mysql
       environment:
         MYSQL_ROOT_PASSWORD: yourpassword
         MYSQL_DATABASE: app_db
       ports:
         - "3306:3306"
       volumes:
         # コンテナ内のディレクトリとボリュームを関連づける
         - mysql-data:/var/lib/mysql
         - ./sql/:/docker-entrypoint-initdb.d/
   volumes:
     # ボリュームの名前
     mysql-data:
   ```

#### ``/var/lib/mysql``: 
   MySQL サーバーがデータを保存するデフォルトのディレクトリ。データベースの実際の内容（テーブルやインデックスなど）はこの中に保存されます。これをボリュームと関連づけることで、コンテナを削除した場合でも、データベースの内容が失われず、また、再起動や新しい MySQL コンテナの立ち上げ時に、以前のデータを再利用できます

### 4. **MySQLの初期化動作**  
   MySQL公式Dockerイメージでは、コンテナ起動時に`/docker-entrypoint-initdb.d/`ディレクトリ内にあるすべての`.sql`や`.sh`スクリプトを自動的に実行します。これにより、DDLファイルが適用されます。

5. **Dockerコンテナの起動**  
   ```bash
   cd docker
   docker-compose up -d
   ```

6. **テーブル作成の確認**  
   コンテナ内でMySQLに接続し、テーブルが作成されていることを確認します。

   ```bash
   docker exec -it timetable-mysql mysql -u root -p
   ```

   MySQLプロンプトで以下を実行:
   ```sql
   USE timetable_db;
   SHOW TABLES;
   ```

---

### **注意点**
#### 1. **初回起動時のみ実行される**  
   - `/docker-entrypoint-initdb.d/`内のスクリプトは、MySQLデータベースが初期化される際（つまり、データボリュームが空の状態でコンテナを起動したとき）にのみ実行されます。
再度SQLを流し直したい場合は、以下コマンドでデータボリュームを一旦空にしてから、コンテナを再起動してください。
      ```bash
      docker-compose down --volume
      docker-compose up --build
      ```

#### 2. **ファイル名の注意**  
   - `.sql`ファイルは順番に実行されるため、複数ファイルを使用する場合は名前に番号を付けるとよいです（例: `001_schema.sql`, `002_data.sql`）。

#### 3. **DDLファイルの更新**  
   - テーブル構造を更新したい場合は、コンテナを削除し、ボリュームをクリアした上で再度起動する必要があります。

---

以上
ルーターの２つのプロセス

>`どのルーターを介するかを決めるルーティング`と`パケットが到着した時に実行するフォワーディング`を区別することが有用である。ルーターの内部では`二つのプロセス`がある。一つは、`パケットが到着した際にルーティング・テーブルを見て利用できる出力回線を探すプロセス`である。このプロセスは`フォワーディング`と呼ばれる。もう一つのプロセスは、`ルーティング・テーブルに書き込み、その内容を更新するプロセス`である。こちらがルーティング・アルゴリズムの果たすべきところになる。
p342

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
フォワードとフォワーディングの違いがあるかもしれないがルーティングテーブルを見て主力回線を探すプロセスだと考える
【ArticleHub Project ノート】03.Publishページの開発

https://github.com/KyleAndKelly/ArticleHub
## pubishページ

### リッチテキストエディター

**リッチテキスト**：スタイルや多様なフォーマットを含むテキストで、フロントエンドではタグとインラインスタイルを組み合わせて実現される。

**リッチテキストエディター**：リッチテキストコンテンツを作成するためのコンテナ。

**目標**：記事投稿ページにリッチテキストエディターを統合する。

**使用**：`wangEditor` プラグイン。

**手順**：

1. CSS を導入してスタイルを定義。
2. HTML 構造を定義。
3. JS を導入してエディターを作成。
4. 内容変更を監視し、隠しテキストエリアに保存（後でデータ収集しやすいように）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/ce20b5cc-aa63-cab1-7bf3-1f72d587a0f2.png)


---

### チャンネルリスト

**目標**：チャンネルリストを表示し、ユーザーが選択できるようにする。

**手順**：

1. チャンネルリストのデータを取得する。
2. ドロップダウンメニューに表示する。

![image-20241124112044365](C:\Users\Kyle\AppData\Roaming\Typora\typora-user-images\image-20241124112044365.png)

---

### カバー設定

**目標**：記事のカバーを設定する。

**手順**：

1. タグ構造とスタイルを準備。
2. ファイルを選択して `FormData` に保存。
3. 画像を個別にアップロードし、画像の URL アドレスを取得。
4. プレビューし、`img` タグで表示（「+」アイコンのアップロードタグを非表示にする）。

**注意**：画像の URL アドレスは一時的に `img` タグに保存され、記事との関連付けはまだ行われていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/4c20ed36-855b-1757-823a-41095255f3a6.png)
---

### データ収集と保存

**目標**：記事内容を収集し、保存する。

**手順**：

1. `form-serialize` プラグインを使用してフォームデータを収集する。
2. `axios` を使用してサーバーに送信し、保存する。
3. `Alert` 警告フレームを呼び出して結果をユーザーにフィードバック。
4. フォームをリセットし、リストページにリダイレクトする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/5505199f-5b31-0527-446c-f6aa767acdf0.png)
LILYGO T-Deck Plus タッチパネルを試す

次はT-Deck Plus タッチパネルを試してみようと思う。

# サンプル優秀じゃね？
中華系のキットってドキュメントが微妙だったりして結構悩むんだけど
LYLYGOのサンプル優秀だな。GitHubのサンプル書込んだらそれで動きます
とはいかなかったのでハマったところは事項に。

# 5点マルチタッチ対応なのね
特製品情報に書いてないのですが、本品５点マルチタッチ対応です。

```cpp
int16_t x[5], y[5];
uint8_t touched =  touch.getPoint(x, y, touch.getSupportTouchPoint());
```
がタッチパネルの関数です。
最初なんでX座標とY座標の変数が配列なんね？と悩みましたが
単純に５点マルチタッチのそれぞれのポイントが代入されます。

そのため getPoint の戻り値 touched には検出したtouchポイント数が返されます。

実際のアプリケーションでは touched の数だけポイントの処理をしてください。
SwiftUIプロダクトにリンク機能を実装~UIViewRepresentable~

# はじめに
下記の画像のように個人開発のアプリで、ユーザーの投稿内容にURLが含まれていた場合、それを検知し、リンク先に飛ぶことができるようにするリンク機能を実装しました。その機能を実装する中でSwiftUIの足りないところをUIViewRepresentableを使用し、UIKitで補う必要があったのでそこで学んだ内容を紹介したいと思います。
|アップデート前|アップデート後|
|---|---|
|![IMG_5057.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/1e11d459-f2f9-f97e-bfb1-ffb0e717a81b.png)|![IMG_5055.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/e370cbcf-cbd6-e9ed-a203-5072fdf0a409.png)|

# UIViewRepresentableとは
SWiftUIのViewでUIKitを使用することができるようにするWrapper

https://developer.apple.com/documentation/swiftui/uiviewrepresentable

```Swift
// Protocol
public protocol UIViewRepresentable : View where Self.Body == Never {
    // どの型のUIViewをラップするか
    associatedtype UIViewType: UIView
    // ラップするUIViewのインスタンスを作って返す
    func makeUIView(context: Self.Context) -> Self.UIViewType
    // データの更新に応じてラップしているUIViewを更新
    func updateUIView(_ uiView: Self.UIViewType, context: Self.Context)
}
```

# UIViewRepresentableを使用してSwiftUIでは足りないところをUIKitで補う
リンク機能を実装するためにUIKitの下記の`UITextView`クラスを使用しました。

https://developer.apple.com/documentation/uikit/uitextview

上記のメソッドを使用し、`TextViewWrapper`構造体を作成する
```Swift: TextViewWrapper.swift
import SwiftUI

struct TextViewWrapper: UIViewRepresentable {
    // 受け取りたいデータをプロパティとして定義
    let text: String
    // UIViewType のインスタンスを生成して返す
    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        // 読み取り専用
        textView.isEditable = false
        // Linkを指定
        textView.dataDetectorTypes = .link
        // リンクの色を指定する
        textView.linkTextAttributes = [.foregroundColor: UIColor.systemBlue]
        textView.font = UIFont.systemFont(ofSize: 16)
        return textView
    }
    // UIViewを更新
    func updateUIView(_ textView: UITextView, context: Context) {
        textView.text = text
    }
}

```
`isEditable`はデフォルトでtrueであるが、今回は読み取り専用なのでfalseにする。
`dataDetectorTypes `URLに自動的に変換するデータのタイプを指定する。
`linkTextAttributes`でリンクの色を青色に指定します。
`font`で本当の大きさを指定。

上記で作成した`TextViewWrapper`をView側で使用例
```Swift: PostView.swift
          HStack {
                Button {
                    isPostImageViewShowing = true
                } label: {
                    Image(uiImage: postImage)
                        .resizable()
                        .scaledToFill()
                        .frame(width: 100, height: 100, alignment: .center)
                        .clipShape(RoundedRectangle(cornerRadius: 20))
                        .padding(.horizontal, 10)
                }
                TextViewWrapper(text: post.caption)
            }
```
上記の手順で実装することで、アップデートでリンク機能の実装、文字選択機能の実装ができました。

|リンク機能|文字選択|
|---|---|
|![IMG_5055.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/6a3618fa-f60c-67bb-8b16-2687a10d4971.png)|![IMG_5056.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3090887/87dd6378-81af-c08e-071c-1ad3ebab0cf7.png)|

# 参考文献

https://qiita.com/maiyama18/items/e36608af7e39f81af01c

https://developer.apple.com/documentation/swiftui/uiviewrepresentable

https://developer.apple.com/documentation/uikit/uitextview
バックボーン・ネットワークとは

# バックボーン・ネットワーク＝トランジット・ネットワーク
>トランジット・ネットワークは、２つのエンドポイントの間のトラフィックを結ぶ役割を担っているので、伝統的にはバックボーン・ネットワークと呼ばれていた。

# トランジット・ネットワークはエンド・ツー・エンドの接続の働きをする
> `コンテンツ・プロバイダとあなたのISPが直接接続されていない場合、それらの間のトラフィックを結ぶのに、しばしばトランジット・ネットワークを頼り`にする。トランジットネットワークは、`エンド・ツー・エンドのトラフィックを結ぶ`のに、多くの場合、ISPとコンテンツ・プロバイダの両方に課金する。もしコンテンツをホストするネットワークとアクセスネット・ワークが十分なトラフィックを交換していれば、彼らは直接接続することを決めるかもしれない。

## トランジット・ネットワークを検索してみた
>トランジットとは、`インターネットにネットワークを接続する形態の1つ`です。企業や個人向けにインターネット接続サービスを提供するISP（Internet Service Provider）などでは、自律したネットワークを構築しています。こうしたネットワークをAS（Autonomous System：自律システム）と呼びます。この`ASをインターネットに参加させるためには、ほかのASに接続し、さらにパケットを送信するための経路情報を取得する`必要があります。そのための方法の1つがトランジットです。
>
>トランジットはASが別のASに対して提供するサービスです。サービス利用者となるASは、自身のネットワークをサービス提供元のASに接続し、さらに経路情報の提供を受けます。これにより、広範囲のネットワークの端末と直接通信することが可能になります。なお、`一般的にトランジットは有償`で提供されます。

https://www.ntt.com/bizon/glossary/j-t/transit.html#:~:text=%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B8%E3%83%83%E3%83%88%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88,%E6%8F%90%E4%BE%9B%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82


# 感想
バックボーン・ネットワークとはエンド・ツー・エンドの接続を行うもの。有償であることがわかった
二分法により方程式の解を求める

Juliaでは，二分法（bisection method）を用いて方程式 $f(x)=0$ の解を求める際，以下のような方法がある。

1. 標準ライブラリの Roots パッケージを使用する方法
1. 手動で二分法を実装する方法

## 1. Roots.jl パッケージを使用する方法

### 1.1. Roots.jl パッケージのインストール

Roots.jl がインストールされていない場合は，まず，Roots.jl をインストールする。

```julia
using Pkg
Pkg.add("Roots")
```

### 1.2. 使用例：多項式の解を二分法で求める

例として，関数 $f(x)=x^3-x-2$ の解を区間 $[1, 2]$ で求める。

```julia
using Roots
```

#### 関数定義

```julia
f(x) = x^3 - x - 2
```

#### 二分法で解を求める

```julia
root = find_zero(f, (1.0, 2.0), Bisection())

println("解: ", root)
```

#### 実行結果

このコードを実行すると，次のような結果が得られる。

```
解: 1.5213797068045676
```

#### コードの解説

1. 関数の定義
    -  `f(x) = x^3 - x - 2` は，$f(x)=0$ の解を探索する対象の関数である。
1.	find_zero 関数
    - `find_zero` は，関数の零点（root）を見つけるための関数である。
    - `(1.0, 2.0)` は探索範囲を指定する。この範囲内で解があることを保証するため，$f(1.0)\cdot f(2.0)\lt0$ を確認すること（$f(1.0)$ と$f(2.0)$ の符号が異なっていなければならない）。
    - `Bisection()` は，二分法を明示的に選択するための指定である。
他にも以下のような指定ができる。
        - Newton法を使用
`root = find_zero(f, 1.5, Roots.Newton(); autodiff=true)`
        - Secant法を使用
`root = find_zero(f, (1.0, 2.0), Roots.Secant())`
1. 注意点
    - 二分法は収束が保証されているが，収束速度が遅いため，必要に応じてNewton法など高速なアルゴリズムを選択するほうがよいこともある。
    - 初期範囲は，解がその中に存在することを保証するため，区間の両端で $f(x)$ の符号が異なることを確認する必要がある。以下のようなエラーメッセージが出るので，適切に対応すればよい。
ERROR: ArgumentError: The interval [a,b] is not a bracketing interval.
You need f(a) and f(b) to have different signs (f(a) * f(b) < 0).
Consider a different bracket or **try fzero(f, c)** with an initial guess c.
二分法にこだわらないならば **fzero(f, c)** は採用すべき提案であろう。

## 2. 手動で二分法を実装する方法

もしライブラリを使わずに手動で実装したい場合，以下のように記述できる。

```julia
function bisection(f, a, b; tol=1e-6, max_iter=1000)
    fa = f(a)
    fb = f(b)
    if fa * fb > 0
        error("The function must have opposite signs at a and b.")
    end
    
    iter = 0
    while (b - a) > tol && iter < max_iter
        c = (a + b) / 2
        fc = f(c)
        
        if fc == 0 || (b - a) < tol
            return c
        elseif fa * fc < 0
            b, fb = c, fc
        else
            a, fa = c, fc
        end
        iter += 1
    end
    
    return (a + b) / 2
end
```
使用例

```julia
julia> f(x) = x^3 - x - 2
f (generic function with 1 method)

julia> root = bisection(f, 1.0, 2.0)
1.5213799476623535

julia> println("解: ", root)
解: 1.5213799476623535
```
ChatGPTが控える注目の新機能まとめ

# はじめに
AI界隈の中でも利用者数が多いchatGPTですが、予定しているアップデートは非常に魅力的なものが多い印象です。
そこで今回は期待も込めて、控えている新機能のアップデートに関してまとめてみようと思います。

# 1. GPT-5
OpenAIはGPT-4に続く、次世代モデル「GPT-5」の開発を進めています。
このモデルは、GPT-4で指摘された推論エラーや不適切な応答を改善し、より高度な対話能力を提供することが期待されています。

リリース時期は当初2024年の中頃を予定していたようですが、OpenAIのCEOであるサム・アルトマン氏は2024年11月1日に行われたRedditのAMAセッションで、「GPT-5は2024年中には登場しない」と明言しました。
一方で、OpenAIのCTOであるミラ・ムラティ氏は、2024年6月19日に公開されたダートマス大学での対談で、今後1年半以内にリリースされる次世代モデルが、特定の作業において「博士課程レベル」の知能に達すると述べています。 
この発言を基にすると、大体GPT-5のリリースは2025年末頃になりそうなのかなと予想しています。

GPT-5とても楽しみにしているのですが、現行のバージョンでは図を解釈して問題解決を支援するなどの使い方を想定した場合まだ一歩足りないので、次のバージョンでこの辺りの精度が上がることを期待したいですね。

# 2. Siriとの統合
Appleは、iOS 18.2のリリースに伴い、SiriにChatGPTを統合する計画を進めています。
このアップデートは2024年12月2日にリリースされると予測されています。 
これにより、iPhoneユーザーはAI機能「Apple Intelligence」を活用し、Siriの機能性が大幅に向上することが期待されています。

ちなみにiOS 18.2のベータ版では、既にSiriとChatGPTの統合がテスト配信されている状況になります。

最近リリースしたIpadMiniもAppleIntelligenceに対応したりと、確実にAIの運用を視野に入れていますよね。
ただ開発という観点では、Appleは少し出遅れている感がありますね。
Swift Assistなど開発に利用できるAIも発表されていますが、GoogleではすでにGeminiが浸透していてかなり利用できる状況が確立されているので、ここからどう巻き返していくのか期待したいところです。

# 3. CriticGPT
CriticGPTは、OpenAIが2024年6月27日に発表したAIモデルで、ChatGPTが生成するコードの誤りを検出・修正することを目的としています。 
このモデルはGPT-4をベースに構築されており、ChatGPTの出力に含まれる不正確な点を指摘することで、AIトレーナーのトレーニング精度向上を支援します。

AIモデルは日々高度化していますが、同時に人間がAIの出力を評価・修正することが難しくなっています。
特に、ChatGPTのような大規模言語モデルが生成するコードの誤りを見つけるのは非常に困難だと言えますね。
そこでこの課題を解決するため、CriticGPTはAI自身がAIの出力を評価・修正する役割を担うことを目指しています。

このCriticGPTが今後一般公開や商用利用が可能になるかは未定ですが、このCriticGPTがこの先控えているGPT-5などのAI精度をより向上させていくものになることは間違いありません。
GPT-5などと合わせてCriticGPTの動向に関しても今後に期待ですね。

# さいごに
親知らず抜いた際のアザが消えません・・・
【ArticleHub Project ノート】02.Loginページの開発

https://github.com/KyleAndKelly/ArticleHub
### baseURL設定 

**目標**：認証コードでのログインを実現し、バックエンドで認証コードをデフォルトで「246810」に設定する。

**理由**：SMSインターフェースは無料ではないため、攻撃者による悪意ある利用を防ぐ。

**手順**：

1. `utils/request.js` にて `axios` のリクエスト基準アドレス（baseURL）を設定する。

   **目的**：共通のプレフィックスアドレスを抽出し、設定後は `axios` リクエスト時に常に `baseURL + url` となる。

2. 電話番号と認証コードのデータを収集する。

3. `axios` を使用して認証コードログインAPIを呼び出す。

4. Bootstrap の Alert 警告フレームを使用して結果をユーザーにフィードバックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/1ec31e56-31a5-953e-ee0c-c461a8d77822.png)

---

### token設定 

**概念**：アクセス権限のトークンで、本質的には一連の文字列。

**作成**：ログインが正しく行われた後、バックエンドがトークンを発行して返す。

**目的**：ログイン状態などを判断し、アクセス権限を制御する。

**注意点**：フロントエンドではトークンの有無しか判断できず、有効性はバックエンドが判断する。

**使用方法**：

1. `utils/auth.js` でトークン文字列がない場合、強制的にログインページにリダイレクトする（アドレスバーを手動で変更してテスト）。

2. ログイン成功後、トークン文字列をローカルに保存し、ホームページにリダイレクトする（アドレスバーを手動で変更してテスト）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/c8a26f43-3394-46f3-a04c-f5b8587258b3.png)

---

### axios インターセプター

**要件**：ユーザー名を設定する。

**構文**：`axios` の `headers` オプションでリクエストヘッダーのパラメーターを渡せる。

**問題**：多くのAPIでトークン文字列を持たせる必要がある。

**解決**：リクエストインターセプターで共通の `headers` オプションを一括設定する。

**axios リクエストインターセプター**：リクエストを送信する前に発動する設定関数で、リクエストパラメーターを追加で設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/57afe70c-8d95-7dc8-4b40-740545775b28.png)

---

**axios レスポンスインターセプター**：レスポンスが `then`/`catch` に到達する前に発動するインターセプション関数で、レスポンス結果を一括で処理する。

例えば：認証失敗の場合、一括判断して処理を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3916068/1396bbb4-ef48-af95-9ffe-e29b75ffb62c.png)
JavaのStream APIを使ってコレクションの要素をランダムな順序に並べ替える

JavaのStream APIを使ってコレクションの要素をランダムな順序に並べ替えるには、Collections.shuffleメソッドを使用するのが一般的です。以下にその方法を示します。

まず、Streamをリストに変換し、そのリストをシャッフルしてから再びStreamに変換します。
```java
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + '}';
    }
}

public class Main {
    public static void main(String[] args) {
        // サンプルデータ
        List<Person> people = Arrays.asList(
            new Person("Alice", 30),
            new Person("Bob", 25),
            new Person("xiaoming", 35),
            new Person("Diana", 28)
        );

        // リストをシャッフル
        Collections.shuffle(people);

        // シャッフルされたリストを再びStreamに変換
        Stream<Person> shuffledStream = people.stream();

        // 結果を表示
        shuffledStream.forEach(System.out::println);
    }
}
```
この方法では、以下の手順を踏んでいます：

1.元のStreamをリストに変換します。
2.Collections.shuffleメソッドを使ってリストをシャッフルします。
3.シャッフルされたリストを再びStreamに変換します。
これにより、元のStreamの要素がランダムな順序で処理されるようになります。