OmniAICreator/Qiita-1.07M huggingface dataset:
自然言語処理を用いた災害ツイートの分析: 総合ガイド (Natural Language Processing with Disaster Tweets: A Comprehensive Guide)


# はじめに
 Twitterは、緊急時において非常に重要なコミュニケーションツールとして活用されています。特に災害が発生した際、多くの人々がリアルタイムでその状況をツイートすることにより、情報が瞬時に広がります。しかし、すべてのツイートが実際の災害について言及しているわけではなく、時には比喩的な表現やジョークとして災害に関する言葉が使われることもあります。このような状況下で、どのツイートが本当に災害に関連しているかを自動的に識別するモデルを構築することは非常に重要です。

本記事では、Kaggleの「**Natural Language Processing with Disaster Tweets**」コンペティションに基づき、自然言語処理（NLP）を用いた災害関連ツイートの分類手法について概要を説明しているものです。このコンペティションは、初心者データサイエンティスト向けの「Getting Started」シリーズであり、比較的小規模なデータセットを用いるため、NLPの入門として最適です。
具体的な解析Notebookも、ご紹介予定です。下記でStarterノートブックをご紹介しています。

https://qiita.com/Life-tech/items/2fe9e79e9e4e0fa6bad6


## 概要
　このコンペティションでは、災害に関連するツイートを自動で識別する機械学習モデルを構築することが目的です。約10,000件のツイートデータが提供されており、これらのツイートが実際の災害に関するものかどうかを判別する必要があります。データセットには、手動で分類されたツイートが含まれており、参加者はこれを利用してモデルを訓練します。

また、このコンペティションでは、提出された予測結果をF1スコアで評価します。F1スコアは、精度（Precision）と再現率（Recall）を考慮したバランスの良い指標であり、災害ツイートの分類性能を総合的に評価するための指標として最適です。

## データセットの詳細
データセットは、10,000件のツイートから構成されており、それぞれのツイートに対して「災害に関連しているかどうか」というラベルが付けられています。参加者は、訓練データを使用してモデルを構築し、テストデータに対する予測を行います。

    id: ツイートの一意の識別子
    text: ツイートの本文
    target: 1（災害に関連）または0（災害に関連していない）

## モデル構築の流れ
### 1. データの前処理

データの前処理は、NLPプロジェクトにおいて重要なステップです。ツイートにはノイズ（絵文字、URL、特殊文字など）が含まれているため、これを除去する必要があります。
具体的な前処理のステップ

小文字化: テキストをすべて小文字に変換します。
URLの除去: ツイート中に含まれるURLはノイズとして扱い、除去します
特殊文字の削除: 感嘆符やハッシュタグなどの特殊文字を取り除きます
ストップワードの除去: 「the」「and」などの意味を持たない単語を削除します。

箇条書きの手順

    テキストをすべて小文字に変換することで、同じ単語の異なる形を統一します。
    URLや特殊文字は、機械学習モデルにとって重要ではないノイズのため、これを削除します。
    ストップワードの削除は、文脈理解において重要でない単語を省くことで、モデルの効率を高めます。

### 2. 特徴量エンジニアリング

次に、テキストデータを機械学習モデルに適用できる形式に変換します。このステップでは、ツイートの本文から数値的な特徴量を抽出します。一般的には、Bag of Words（BoW）やTF-IDF（Term Frequency-Inverse Document Frequency）などの手法が用いられます。

**Bag of Words**
　テキスト内の単語の出現頻度をカウントする手法。シンプルで効果的ですが、文脈を無視するという欠点があります。
**TF-IDF**
　単語の出現頻度に加え、他のドキュメントにおけるその単語の頻度も考慮する手法。頻繁に使われる単語の重要性を下げ、より特徴的な単語に重みを置きます。

箇条書きの手順

- Bag of Wordsは、各ツイートの単語の出現頻度を数値化する方法で、シンプルなアプローチとしてよく使われます。
- TF-IDFは、頻出単語に重みを持たせないようにすることで、重要な単語に焦点を当てることができます。

### 3. モデル選択とトレーニング

データの前処理と特徴量エンジニアリングが終わったら、次にモデルを選択し、トレーニングを行います。NLPのタスクでは、以下のようなモデルがよく使用されます。

- ロジスティック回帰: シンプルで計算コストが低いため、最初に試すモデルとして適しています。
- サポートベクターマシン（SVM）: 高次元データに強いモデルで、テキスト分類にもよく使用されます。
- ランダムフォレスト: 複数の決定木を用いて、分類性能を高めるアンサンブル学習の一種です。
- ディープラーニング: 特にLSTM（Long Short-Term Memory）やTransformerベースのモデル（BERTなど）は、文脈を理解する能力に優れており、NLPタスクで高い精度を発揮します。

4. モデルの評価

このコンペティションでは、モデルの性能をF1スコアで評価します。F1スコアは、精度（Precision）と再現率（Recall）の調和平均であり、バランスの取れた評価指標です。

    精度（Precision）: 予測が正しいと判断されたうち、実際に正解だった割合を示します。
    再現率（Recall）: 実際に正しいとされるもののうち、予測で正解できた割合を示します。

- 精度は、予測が正解だった割合を計算する指標で、誤った予測を減らすことに焦点を当てます。
- 再現率は、正しく予測する能力を測定するため、モデルが実際の正しい事象をどれだけ捕捉できるかを評価します。
- F1スコアは、精度と再現率のバランスを取るため、どちらかに偏りがないモデルを作成するのに役立ちます。

## 最後に
NLPを用いた災害ツイートの分類は、実社会において非常に有益なタスクです。特に、災害時における情報の迅速な収集や判断が求められる現代において、Twitterのようなリアルタイム情報源を活用することで、より効果的な災害対応が可能となります。このコンペティションを通じて、自然言語処理の基本的な技術を習得し、実際の問題に応用するスキルを身につけましょう。
[AWS #27] Amazon Rekognition

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちは
今回はAI/ML分野である **<font color="c00000">「Amazon Rekognition」</font>** について紹介したいと思います。
:robot: AWSには非常に多くの<font color="c00000">**AI**</font>(Artificial Intelligence → **人工知能**)、<font color="c00000">**ML**</font>(Machine Learning、**機械学習**)サービスがあります。

## Amazon Rekognition
:upside_down: <font color="c00000">**Amazon Rekognition**</font>とは、AWSが提供する<font color="c00000">**画像分析**</font>についてのマネージドな**機械学習サービス**となっています。

多くのサービスは用意されたAPIにリクエストするだけで使用できるので、「学習をさせたり」「モデルを作ったり」というような作業をせずに直ぐに使用できます（動画も可）。比較させたい画像（人物像や顔など）や映像を比較して、<font color="c00000">**「同一人物であるか？」**</font>どうかを判定することができます。

:robot:＜ AIナドノパワーヲ使イ、**同ジ人物カヲ数値デ返シマス！** ピピピ！…（計測中）

:upside_down: このような機能を使って大勢いる写真から特定の人物だけを素早く集めたりする、**「アルバムアプリケーション」** などが考えられたりします。

### Amazon Rekognition Image
**「Amazon Rekognition Image」** は **静止画**を対象とした画像分析を行うサービスとなっています。

:upside_down: 例としては、「顔画像のマッチング」「顔画像の検索」「ラベル検出」...などができます。下記のイメージ図は **「顔画像のマッチング」** を例にしております。:rabbit:
![AWS27_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3806875/d66375fd-6177-3d77-5a7e-277d10b4524e.png)

## おわりに
今回のちょっとしたまとめになります。

:::note info
Amazon Rekognitionは、<font color="c00000">**画像や動画を分析できる**</font>サービス
:::
:::note info
従来のサービスよりも**安価に利用できる**ため、Rekognitionに乗り換えることで<font color="c00000">**コストカット**</font>を図れるかもしれない
:::

最後までお読みいただきありがとうございました！
>>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版（ACMは237ページ）](https://x.gd/19i6N)
>
> **「AWS公式サイト」**
[Amazon Rekognition](https://aws.amazon.com/jp/rekognition/)
>
> **「参考元」**
[Amazon Rekognitionをアルティメット完全理解する](https://dev.classmethod.jp/articles/reintro-managed-ml-rekognition/)
>
Serverless Frameworkの簡単なキャッチアップ


# Serverless Frameworkをさっくりまとめると

- AWSリソースをコードベースで管理、開発・デプロイするためのもの
- デプロイコマンド実行 → CloudFormationにテンプレート作成 → 必要リソースの作成
- Terraformと比べて、**FaaS(Function as a Service)** レベルのリソースの管理に適している
    - API Gateway
    - Lambda
    - DynamoDB

# サーバレスとは

**サーバーのリソースを意識しない（サーバーの管理・運用が不要）という意味でサーバーレス**

- 最も大きな意味合いとしては物理的なサーバーを用意する必要がないという意味
    - 実態としてはサーバーの運用・管理がないというところまで含まれる

## メリット

- 物理的なサーバーを用意するための諸コストの削減
- 提供されているリソースそのものの管理責任はベンダーにあること
    - あくまでリソースのセキュリティ・ソフトウェアバージョン...…etcというところに限る
- 負荷に対して柔軟に対応できる
    - オートスケーリングと負荷分散
- 可用性を確保することも容易
    - AWSの例で言えば、単純に実行コンテナ自体を複数展開するだけでなくマルチAZ・マルチリージョンまで含めた設計が容易
    - ただし、相応にコストはかかる

## デメリット

- リソースがベンダーに依存するところ
    - 急な仕様変更やアップデートに対応しないといけないことがある
    - AWS → GCといったベンダー間の移行が困難であること
- 監視が困難であること
    - 複数のリソースで1つのサービスが作られるのでどのリソースで何をモニタリングするべきなのかを理解していないといけない
    - AWSであればCloudWatch、CloudTrail、X-Ray辺りがどういう役割を持っているのか、そして適切にログを吐かせる必要がある
- コールドスタート問題
    - リソースを起動するためのリソースが必要というジレンマ
        - つまり、どうあっても起動までに些か待ちの時間が発生する
        - 低レイテンシーとは相反してしまう

# Terraformとの使い分け

TerraformはIaC(Infrastructure as Code)、つまりインフラをコードで管理する。

前段で書いた通りServerless FrameworkはTerraformと比べて、**FaaS(Function as a Service)** レベルのリソースの管理に適しているという特徴があるのでそこを意識したい。

### 調べていて意識するべきと思った点

- Serverless Frameworkは「Lambdaアプリケーションの開発」を起点としたフレームワークであること
    - Lambda・API Gatewayを軸としなければ向かない可能性がある
    - VPC・ECSなどのインフラ部分の管理はTerraformのが良さそう
- インフラとマイクロサービスを依存させないという設計思想もアリ
    - Terraformから独立して開発、デプロイ、スケーリングが可能
    - アプリケーションエンジニアはインフラを考慮した設計で時間を取られず、インフラエンジニアその逆というメリットもある
- Serverless FrameworkはIaCではあるが、アプリケーション内に置かれるのでインフラとアプリケーションの分離という点では疎結合にならないこと
    - インフラ領域と分離ができていないためアプリケーション内で管理するので、別ベンダーへの移行の際にネックになるデメリットが生じる
    - コードの流用性はTerraformに比べてない
- **そのアプリケーションに密接するか**を意識してServerless Frameworkで管理するものを決めるべきであること
    - 例えばKinesis・IAMロール・EventBridgeはアプリケーションごとに紐付くのでServerless Frameworkで一緒に管理するほうが良いケースかもしれない
    - 他方、データストアは他のアプリケーションでも使用するのでまとめてしまうと開発・保守・運用に支障がでる可能性が高い
    - API Gatewayは接続先のリソース及びAPI Gateway自体がアプリケーションで決定すべき事項が設定内容に依存してくるのでServerless Frameworkで管理するほうが良いケースかもしれない

## 参考

    - [サーバレスフレームワーク](https://zenn.dev/shlia/articles/5bec35d77ef471)
    - [**Serverless Framework の使い方を初心者にも分かりやすく説明する**](https://qiita.com/mkin/items/0a82c84df084496544c6)
    - [Serverless FrameworkとTerraformの使い分けについて](https://www.ariseanalytics.com/activities/report/20230922-2/)
    - [**Serverless FrameworkとTerraformの責任分界点**](https://qiita.com/naomichi-y/items/10bc4874cc1a6ec35663)
picoCTF 2019 writeup strings it

## strings it (Genenal Skills)

Can you find the flag in file without running it?

添付ファイル
・strings

タイトルからも分かる通り、stringsコマンドで可読文字列を出力させる。と大量の文字列が流れていった。
おそらく、stringsコマンドでフラグが出力されるようになっていて、探せということだろう。
grepを使う。
```
$ strings strings | grep pico
picoCTF{5tRIng5_1T_d66c7bb7}
```

フラグが得られた。

`picoCTF{5tRIng5_1T_d66c7bb7}`
2024/10/16主にITとかセキュリティの記事

斑鳩町図書館ランサムウェア感染事件に学ぶ地方自治体のセキュリティ強化策
https://cybersecurity-park.com/3156/

カシオ、情報漏えいか＝サイバー攻撃で(10/11)
https://www.risktaisaku.com/articles/-/96245

セキュリティ対策の肝はマネジメント – リスクマネジメントの専門家が教える4つのポイント(10/14)
https://news.mynavi.jp/techplus/article/20241014-3037527/

国連機関、東南アジアにおける無認可の暗号資産サービスプロバイダー（VASP）を犯罪とするよう勧告(10/14)
https://www.coindeskjapan.com/256163/

フィデリティ・インベストメンツ、77,099人の顧客に影響1年で4度目のするデータ侵害を公表(10/14)
https://nextmoney.jp/?p=68809

当社グループ会社への不正アクセスについて JTEKT(10/14)
https://www.jtekt.co.jp/news/2024/004132.html

「中国」 のテレビ露出情報(10/13)
https://datazoo.jp/w/%E4%B8%AD%E5%9B%BD/66368195

中国のサイバーセキュリティ当局　米国による中国中傷行動計画「ボルト・タイフーン」の真の意図を暴く(10/14)
https://japanese.cri.cn/2024/10/14/ARTITMMvp7gT7rgCQ4LIoV6K241014.shtml

「詐欺防止の本人確認」と言い張って個人情報を盗む詐欺メール【お前が言うな】(10/14)
https://news.nicovideo.jp/watch/nw16618815

米国は全世界範囲でのサイバー攻撃を直ちにやめよ＝外交部(10/14)
https://japanese.cri.cn/2024/10/14/ARTIn5fko4WREEYVua0IOReb241014.shtml

生成AI時代に躍進する「セキュリティエンジニア職種」4選(10/14)
https://techtarget.itmedia.co.jp/tt/news/2410/14/news01.html

東北大、NECと共同で安全性を担保したまま性能と利便性を飛躍的に向上させたメモリ暗号化機構の新方式を開発(10/14)
https://www.nikkei.com/article/DGXZRSP680010_R11C24A0000000/

ホンダ、熟練運転手を「AIの師匠」に！”初めての道”でも自動運転実現へ(10/14)
https://jidounten-lab.com/u_50275#google_vignette

Adobe Lightroomなどに脆弱性、確認とアップデートを(10/14)
https://news.mynavi.jp/techplus/article/20241014-3042449/

欧州 EDPB データ処理者および再処理者への依存に伴う一定の義務に関する意見(10/14)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/10/post-3f89a6.html

「私はロボットではありません」—AIがGoogle reCAPTCHAを100%突破(10/14)
https://ledge.ai/articles/ai_breaks_google_recaptcha

Windows 10のサポートがまもなく終了！Windows 11にアップデートしないとどうなる？(10/14)
https://dime.jp/genre/1849970/

設計・開発・運用まで　生成AI武器に囲い込み［Part 1］(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/100800450/100800001/

5万行コードも丸ごと　Gemini推しのグーグル［Part 2］(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/100800450/100800002/

AWS連係で活用深化　開発機能の内製も［Part 3］(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/100800450/100800003/

MSはGitHubを拡張　インフラ構築にも活用［Part 4］(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/100800450/100800004/

416万件の個人情報に不正アクセス　業務委託元の51事業者に飛び火　東京ガス子会社（TGES）(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/100900165/

「DX推進委員会」に社長も参画　IT子会社を再びグループに戻す　マルハニチロ(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/080900438/100900003/

扱いやすいデータ基盤の開発を続ける　企業間のデータ共有で価値を生み出す
スリダール・ラマスワミ 氏　米スノーフレイク CEO(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600001/100900169/

奈良県斑鳩町の図書館システムで本格稼働前に個人情報流出か、ランサムウエアに感染(10/15)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/050700287/

国内外81拠点の基幹システム統合　業務プロセスも展開方法も標準化
アルプスアルパイン(10/15)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600004/100900167/
SaaS間連携失敗の原因はUserAgentだった、、

この前SaaSのWebプロキシとWeb分離を連携させる検証をした時にWeb分離が機能してくれなかったので、その原因と代替策を忘れないように記録しておこうと思います。
※　今回の主役はUserAgentがトラブル原因になり得て、それを解決手段があるよという事なので具体的なSaaSのWebプロキシの名前は伏せておきます。

# やりたかったこと
以下のようにSaaSのWebプロキシからWeb分離に多段プロキシ構成で転送させて、よりセキュアな通信を確立させたいと思って検証しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/253fbf46-28af-ccd0-44e8-e0b6950ca99a.png)

上記の構成でPCからブラウザを開いて、テストサイトを叩くというシンプルな内容

# 検証結果
しかし結果Error、、、、
Web分離が機能してくれません、、

# 切り分け
宛先サーバのパケットキャプチャを取得してWiresharkで見てみると、web分離が機能する時と今回の検証時で差分があることに気づきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/cb156444-9ffd-890d-a51e-de4067ee1cbb.png)
UserAgentが「Linux」となっていました。
クライアント端末でブラウザからサイトにアクセスした場合の通信のUserAgentは、chromeやFirefox等ブラウザのものになるはずですが、なぜかLinuxになっていました。
このWebプロキシからCONNECTメソッドでくるパケットはUserAgentがLinuxに置き換わってしまうようです。
Web分離のメーカーに問い合わせたところ、Web分離が機能する条件の一つとして、UserAgentがブラウザ固有である必要があるとのことでした。

# 代替案
UserAgentを変更する方法を探していると以下のSquidのドキュメントを発見しました。
https://www.squid-cache.org/Doc/config/request_header_replace/
そこで強引ではありますが以下の構成で検証してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/91e438eb-e918-55f4-c4dc-ee1bed219273.png)


そしてsquidのsquid.confに以下の設定をします。

```
request_header_replace User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36
```

# 結果
今度は成功しました。
パケットキャプチャを見てみるとFirefoxのUserAgentに変更されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/edfc6c07-d914-8587-4d3f-12c679461253.png)

今後別のSaaS製品でトラブルが発生した場合はUserAgentも意識しようと思います。

# 最後に
強引にリーチアビリティは取りましたが、コンポーネントを増やしたくないのが正直なところです。
トラブル発生時の調査ポイントが増えてしまうこと、そして折角SaaSを利用しているのにライフサイクルを意識した運用をしないといけないことはデメリットだと思います。
一旦はこの内容なら疎通出来るという検証結果を纏めつつ、もっとシンプルにする方法は無いか？は確認しようと思います。
オブジェクト指向Cコンパイラcomelangでテンプレートで型推論が完全となりました

version 3.0.0で実装しています。

```C
#include <comelang.h>

template<R> fun(R a, R b)
{
    return a + b;
}

int main(int argc, char** argv)
{
    fun(1, 2).printf("%d¥n");

    return 0;
}
```

3を返します。list::mapも型引数は必要ありません。
バグはちょっとテストした感じではありませんでしたが、あるかもしれません。

実装方法は単に引数を一度コンパイルしてRとの対応をとっているだけです。
ただgenericsやtemplateとgenericsとメソッドブロックが組み合わさるとかなり複雑でした。
まあ、個人的にはエレガントに実装できたと思います。
list::mapは

```C
#include <comelang.h>

int main(int argc, char** argv)
{
    [1,2,3].map { it.to_string() }.each { puts(it); }
}
```

のようなコードも通ります。ヒープを生成してもメモリーリークはありません。
あとメソッドブロックのreturnの省略も入れています。ブロックの最後にセミコロンがなければ
reutrnされます。

割と現代的なコンパイラとなったと思います。
もうcomelangには思い残すところはありません。
あとはwebサーバーとデータベースサーバーを勉強のために実装していきます。
comelangはC言語でもあるためポインタが使えるので正確な文字列処理が得意です。
その上正規表現もあるのでRubyのような文字列処理もできます。
正規表現の例は

```C
#include <comelang.h>
#include <comelang-str.h>

int main(int argc, char** argv)
{
    "ABC".scan(/./).join("+").puts();

    return 0;
}
```
A+B+Cが出力される。

などです。

よかったら試してみてください。

https://github.com/ab25cq/comelang
テストカバレッジとE2Eテスト

# テストカバレッジとは
***プログラムをどこまでちゃんと調べたかの点検率***が```テストカバレッジ```です。

コードを書いたとき、そのコードが正しく動くかどうかをテストします。
テストしていない部分があればバグの原因になる可能性がありますよね。
「テストカバレッジ」が高ければ高いほど、コード全体をしっかりテストしたということになります。ただ全部テストをしていると口数がかかりすぎてしまうので、ここをどうするかが大事です。

# カバレッジの種類
カバレッジには、以下の4種類があります。

|カバレッジ|どんなテストか|どこをテストしたか|
|----------|-----------|-----|
|C0|命令網羅（***ステートメントカバレッジ/行カバレッジ***）|***コードの行が実行されたかどうか***|
|C1|分岐網羅（***ブランチ・カバレッジ/条件カバレッジ***）|***条件分岐のすべてのパスが実行されたかどうか***|
|C2|条件網羅（コンディション・カバレッジ/）|***条件内のすべての論理的なパスがテストされたかどうかを評価***|
|MCC|複合条件網羅（マルチコンディション・カバレッジ）|***個々の条件式の真偽を、全ての組み合わせ通りテスト***|

# 関数カバレッジ
関数ごとにテストが実行されたかを測定します。これはC0やC1のように定義されるカバレッジではありませんが、関数が呼び出されたかどうかを確認するために使われるみたいです。

# C2にしてもバグが出る
C2までやってもバグが出たりしますし、工数がかかってしまうリスクはあるので、
ただ単にC2までやればいい訳ではなさそうです。

# E2Eテスト
***ソフトウェアの全体的な動作を確認するためのテスト***です。
E2Eのテストは動作が重くなるデメリットはありますね。

https://qiita.com/mt0m/items/7e18d8802843d9f60d28


# テストカバレッジ資料


https://tech.nri-net.com/entry/coverage_c0_c1_c2_mcc

https://qiita.com/odekekepeanuts/items/8b6542467d2a0066e5af
【第１回 大和総研 本橋美幸さん】2024 Japan AWS Jr. Champions インタビュー企画

初めまして！2024 Japan AWS Jr. Championsのtekutaと申します！
AWS Japanが6月に開催したAWS Summit Japanにて、2024 Japan AWS Jr. Championsが発表されました。Jr.Championsは、AWSを積極的に学び、アクションを起こし、周囲に影響を与えている若手エンジニア向けの表彰プログラムとなっております。Jr.Championsについて多くの方に知ってもらいたいため、表彰された方々にインタビューをしていきます。
栄えある第1回目は、大和総研の本橋美幸さんです！
![IMG_1130.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310014/a6b0118e-6500-ba47-c78a-2ae7c7f57816.jpeg)

https://aws.amazon.com/jp/blogs/psa/2024-japan-aws-jr-champions/

# 質問１：これまでの経歴、現在の業務、AWSを知った経緯を教えてください。
2021年入社の社会人4年目です。インフラ部署に配属され、オンプレミス→AWSへの移行やオンプレミスで再構築するのプロジェクトを経験してきました。そのため、アサインされたプロジェクトの業務がAWSを知るきっかけになりました。

# 質問２：Jr.Championsを目指した理由、選出につながったと考える活動があれば教えてください。
前年表彰された先輩が活躍している姿を見て、自分も目指そうと思いました。案件活動に加えて、社内でAWSに関するイベントを運営していたので、評価につながったと考えています。

# 質問３：Jr.Championsとして現在どのような活動をしていますか。
社内では、若手社員で運営しているコミュニティの推進を行っております。
社外では、外部公開の登壇イベントの運営や勉強会の企画に携わっております。今後は自身の登壇機会も増やしていこうと思っています！

# 質問４：Jr.Championsに選出されてよかったことはありますか。
社内での知名度が向上したことです。加えて、Jr.Championsに選出されことで、自信がつき案件の会議などでも今まで以上に積極的に発言できるようになりました。

# 質問５：Jr.Championsの活動で大変だったことはありますか。
選出期間の1年という短い時間でたくさんアウトプットを行うことが、自身のキャリアロードマップにつながると考えています。そのため、業務後のアウトプット活動やイベント・勉強会等で休日に活動をすることもあり大変だと感じています。

# 質問６：Jr.Championsと併せてAll Certifications Engineersも受賞おめでとうございます！目指そうと思ったきっかけや勉強方法を教えてください。
社内でAll Certifications Engineersを目指すコミュニティがあり、入ると受験料等の補助が出るため目指そうと思いました。
一番勉強の役に立った研修でAWSがパートナー企業向けに提供している実践提案道場があります。機会があれば参加してみるといいと思います。

# 質問７：All Certifications Engineersに選出されてよかったことはありますか。
Jr.ChampionsとAll Certifications Engineersの両方に選出されていたことで、同時受賞者としての登壇機会をいただくことができたのでよかったと感じています。

# 質問８：今後の夢や目標はありますか。
来年度のAWS Top Engineersの選出を目指しています！
また、自身のキャリアについては、現状はインフラの設計がメインですが、今後はアプリケーション設計・構築を経験して、幅広い分野で活躍できるエンジニアになりたいです。

# 質問９：Jr.Championsを目指す若手に向けてメッセージをお願いします。
Jr.Championsのメンバーと交流するとレベルの高さでモチベーションが上がりますので、ぜひ目指していくべきだと思います！ただし、年々レベルが高くなっていくと考えるので、前年のJr.Championsと同様の活動をしていると選出されない可能性があります。早い段階から社内だけにとどまらず、社外へのアウトプットも積極的に取り組んで行くのがいいと思います。

# 質問１０：全体を通しての質問
## Jr.Championsの選出に向けて最も力を入れた活動があれば教えてください。
週刊AWSの最新情報発信やAWSの勉強会等の社内コミュニティの活動に力を入れてきました。勉強会は認定取得やサンドボックスを用いた構築実践などを実施してきました。

## 好きなAWSサービスはなんですか。
Lambdaです！
最初に触ったサービスなので、思い入れがあります！また、サーバを構築せずに、アプリケーションが動作することに感動しました！

# 最後に
社内コミュニティ運営やイベントの企画など、本橋さんを見習っていきたいと感じました。年次的にはまだ若手ではありますが、社内でAWSについてとても信頼されているので、今後の活躍が非常に楽しみです。

このような形でJr.Championsの方々にインタビューをしていきますので、次回もぜひご覧ください。

![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310014/29c6e31d-8054-3423-962e-348eb384bd6a.png)
ブレゼンハムのアルゴリズムをn次元に拡張する

ブレゼンハムのアルゴリズムは2次元ピクセル、3次元ボクセル上で直線を近似する手段としてよく知られていますが、n次元に拡張することができます。ただ、日本語の記事にn次元拡張に関するものが見つからなかったので、備忘録も兼ねて簡単にまとめることにします。

# ブレゼンハムのアルゴリズムとは
ブレゼンハムのアルゴリズムは、二点間を結ぶ線分を整数格子上に近似するためのアルゴリズムです。浮動小数点を使わず、かなり低コストでピクセル上に直線を描画できます。
アルゴリズムについてざっと説明すると、（線分の傾きが0以上1未満の場合）
1. (x,y)に線分の始点の座標を代入し、誤差を初期化する
1. xを1増やし、誤差を更新して、誤差が閾値を超えていたらyを1増加させる
1. 座標のピクセルを描画する
1. xが終点の座標を超えるまでこれを2~3を繰り返す

というものです。誤差の初期化や更新で具体的に何を行うのかについては、詳しくはwikipediaをご参照ください。

https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%8F%E3%83%A0%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0

また、これでどうして直線が描けるのかということについては、過去に記事を書いたのでそちらをご参照ください。
https://qiita.com/JetPenguin1224/items/29e36296b49da626ba24
# n次元に拡張する
二次元でのブレゼンハムのアルゴリズムの擬似コードは以下です。
```　
// 傾きが0以上1未満のとき用
void drawLine(int x0, int y0, int x1, int y1){
	int x = x0;
	int y = y0;
	int e = -(x1-x0);　// 誤差の初期化
	while(x<=x1){
		drawPoint(x,y);//(x,y)のピクセルを塗りつぶす関数
		x++;
		e += 2*(y1-y0);
		if(e >= 0){
			y++;
			e -= 2*(x1-x0);
		}
	}
}
```
これをn次元に拡張することを考えます。この時に注意しなけばいけないのは以下の3つです。
1. 主軸の決定
1. 各次元をインクリメントするかデクリメントするかを決定
1. 各次元の誤差の管理

まず、1についてですが、上記の擬似コードでは、線分の傾きが0以上1未満で固定されています。つまり、始点と終点のy座標の距離よりも、x座標の距離の方が大きいということです。そして、x座標をループのたびに増やすメインの方向とし、y座標は誤差が閾値を超えたときのみ増やすという処理を行っているわけですが、本来、このメインの方向（主軸）には、最も距離が離れている方向を選択する必要があります。
そこで、n次元に拡張する際には、各次元の中で最も距離が離れている軸を主軸として選択するようにします。

次に、2についてですが、上記の擬似コードでは始点の座標より終点の座標が大きいことを前提としていました。そのため、xもyも常に増加させるだけで良かったわけですが、終点の座標の方が小さかった場合は減少させる必要があります。そこで、n次元の場合は各次元の座標差を計算して、増加させるか減少させるかを決定します。

最後に、3についてですが、二次元の時には管理する誤差はy座標の誤差だけでしたが、n次元に拡張した際には主軸以外の誤差を全て管理する必要があります。具体的には誤差の初期化と更新ですね。
上記の擬似コードのx座標の距離は主軸の距離に、y座標の距離は各次元の距離に読み替える必要があります。例えば、上記の擬似コードでは誤差はx座標の距離の-1倍で初期化していますが、主軸の距離の-1倍に変更します。ループのたびに誤差に加える値も、各次元の距離の二倍に変更します。そして、誤差が閾値を超えていたら、その次元の座標をインクリメント（デクリメント）し、誤差から主軸の距離の二倍を引きます。



さて、これに従って書いたn次元版のブレゼンハムのアルゴリズムは以下になります。

# 擬似コード
```　
void drawLineND(int* p0, int* p1, int n) {
    int d[n], s[n], err[n], max_d;
    
    // 各次元における距離と符号を計算
    for (int i = 0; i < n; i++) {
        d[i] = abs(p1[i] - p0[i]);
        s[i] = (p0[i] < p1[i]) ? 1 : -1;
    }
    
    // 最大の距離を持つ軸を決定
    max_d = 0;
    for (int i = 1; i < n; i++) {
        if (d[i] > d[max_d]) {
            max_d = i;
        }
    }
    
    // 主軸以外の誤差を初期化
    for (int i = 0; i < n; i++) {
        if (i != max_d) {
            err[i] = - d[max_d];
        }
    }
    
    // 線分の描画
    while (p0[max_d] != p1[max_d]) {
        drawPoint(p0); // 点を描画
        
        p0[max_d] += s[max_d];
        
        for (int i = 0; i < n; i++) {
            if (i != max_d) {
                err[i] += 2 * d[i];
                if (err[i] >= 0) {
                    p0[i] += s[i];
                    err[i] -= 2 * d[max_d];
                }
            }
        }
    }
}


```

# 余談
使い道はよくわからないです。三次元まではわかりますが、四次元以上で直線を整数座標に近似する機会ってあるんですかね？　ご存知の方がいたら教えていただきたいです。

# 参考
https://github.com/thejonwithnoh/bresenham-js/blob/master/bresenham-js.js
UbuntuでGitをインストールする

Gitをインストールするために"sudo apt insatall -y git"と入力した際にエラーが出たので対処法を記載します。
```
sudo apt-get update
sudo apt-get install aptitude
sudo aptitude install git
```
まず、パッケージを更新します。
次に[aptitude]コマンドを使用していきたいのですが、これはUbuntuのデフォルトでインストールされていないので、自分でインストールしていきます。
[aptitude]コマンドを使用すると、必要なパッケージが自動で取捨選択され、Gitのインストールは完了です。
Python の json.dumps() で TypeError になる場合の対処方法


## 課題

Python の `json.dumps()` を使うと TypeError になる。

```text
Traceback (most recent call last):
  File "/home/takuya/json_test/main.py", line 32, in <module>
    json.dumps(message)
  File "/usr/lib/python3.8/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python3.8/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.8/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.8/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type datetime is not JSON serializable
```

## 対策

`json.dumps()` の引数 `default` に、変換できない型が来た場合の処理を書いた関数を渡せばよい。これはネストされたオブジェクトに対しても機能する。

### プログラム例

```python
import json
import datetime

message = {
    "log_level": "ERROR",
    "time_stamp": datetime.datetime.now(),
    "message": "Unexpected Error: Check detail.",
    "detail": {
        "exec_mode": "strict",
        "state": {
            "start": b"some state",
            "end": b"another state",
        },
    },
}


def custom_encode(obj):
    if isinstance(obj, datetime.date):
        return obj.isoformat()

    if isinstance(obj, bytes):
        return obj.decode()

    raise TypeError(f"Cannot serialize object of {type(obj)}")


def json_dumps(obj):
    return json.dumps(obj, indent=2, default=custom_encode)


print(json_dumps(message))

```

### 実行結果

```text
{
  "log_level": "ERROR",
  "time_stamp": "2024-10-16T00:58:49.209903",
  "message": "Unexpected Error: Check detail.",
  "detail": {
    "exec_mode": "strict",
    "state": {
      "start": "some state",
      "end": "another state"
    }
  }
}
```
Reactの案件に入るための学習を通して自走力を高めていきます

## 現在の自分について
* Laravelのフリーランスエンジニアとして4ヶ月目
* プログラマーになってから約1年
* フロントエンドにも守備範囲を広げるために、毎日学習は毎日続けているものの実力がついている実感がなく不安
* Udemyなどの教材をひたすらこなすインプット重視の学習ではなくアウトプット重視の学習にシフトすると決意
## 将来について
* インプット重視だった学習をアウトプット重視にシフトする
* Qiitaの投稿を100本作る
* 次の案件では月収60万円以上を達成する
* エンジニアの仕事が趣味と感じるぐらい楽しむ（お金は気づいたら稼げている状態）
* 自分の会社を作る（まだ具体的な内容は決めていないですが）

元々工場勤務で仕事に対してやりがいが感じられなかった私ですが、エンジニアの学習を通して自分の人生を切り開いていけると感じています。

次の案件探しまで半年を切っていますが、大きく成長して目標を達成できるよう頑張ります！
p5.js のフィルター用シェーダー「createFilterShader()」で Webカメラ画像をそのまま出力（テンプレート的なもの、WebGL 2.0／GLSL ES 3.0）

自分がよく使っている、p5.js のフィルター用シェーダー「createFilterShader()」の話です。

シェーダーで Webカメラ画像を加工する、というのをよくやるのですが、今回は何も加工しないそのまま出力する処理の話です。

何らか、シェーダーによる加工を試す際に、そのベースとして利用するテンプレート的なものを自分用に用意したくなり、今回の内容を書きました。

## メインの内容
以下が今回の内容です。
フラグメントシェーダーは、[公式サンプル](https://p5js.org/reference/p5/createFilterShader/)と違って「WebGL 2.0（GLSL ES 3.0）」を使う形にしています。

```javascript
let s;
let video;

function setup() {
  createCanvas(640, 480);

  pg = createGraphics(width, height, WEBGL);
  pg.noStroke();

  s = pg.createFilterShader(fragSrc);

  video = createCapture(VIDEO);
  video.size(640, 480);
  video.hide();
}

function draw() {
  // background(220);
  pg.clear();

  pg.image(video, -pg.width / 2, -pg.height / 2);
  pg.filter(s);

  image(pg, 0, 0);
}

const fragSrc = `#version 300 es
precision mediump float;

in vec2 vTexCoord;
out vec4 outColor;

uniform sampler2D tex0;

void main() {
  outColor = texture(tex0, vTexCoord);
}
`;
```

今回はシェーダー上では何も加工しないので、シェーダーの中の処理は「入力内容をそのまま出力する」というものになっています。

## 【追記】余談
この後に、この記事で扱ったテンプレートを発展させる形で、シェーダーを使った Webカメラ画像へのフィルター適用をやりました（過去にも、何らかフィルター処理をするものは作ったことがありましたが、今回は上記テンプレートを起点にシンプルな構成で作れました）。

https://x.com/youtoy/status/1841844560546386040
SpotifyAPIとNext.jsを使ったプレイリスト作成アプリの開発


# はじめに

Spotify API と Next.js を使用して、プレイリストを作成するアプリを作成しました。
作成したアプリはこちらになります

https://playlister-x.vercel.app/

# アプリの概要

アプリの一連の流れは以下の図のようになります。（下手な UML 図ですみません...）

```plantuml
@startuml
actor User as ユーザー
ユーザー -> (ログイン)
(ログイン) -> (アーティスト名入力)
(アーティスト名入力) -> (TOP10曲追加)
(TOP10曲追加) -> (プレイリスト作成)
(TOP10曲追加) -> (アーティスト名入力)
@enduml

```

お気に入りのアーティストを検索し、そのアーティストの人気曲をプレイリストに追加していきます。この操作を繰り返すことで、複数のアーティストの人気曲をまとめたプレイリストを作成可能です。音楽フェスの予習用プレイリストなどに便利です。

## ログイン

ログイン画面が最初に表示されます。「MAKE YOUR PLAYLIST」ボタンを押すと、Spotify のログイン画面に遷移して、権限の承認を求められます。承認後、メイン画面に遷移します。
Spotify 無料プランのユーザーでも利用可能です。
![playlistAPP_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/683c035d-2629-9322-537f-c3ea3d2d8ba7.png)

Spotify API の[Client Credentials Flow](https://developer.spotify.com/documentation/web-api/tutorials/client-credentials-flow)を利用してます。

## アーテイスト名入力

アーテイスト名を入力する際、入力した内容に応じて候補のアーティストが 5 組表示されます。
![playlistAPP_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/eaf16ec2-be45-2a0f-f60c-386b942b830c.png)

[Search for Item](https://developer.spotify.com/documentation/web-api/reference/search)API を利用して、入力したアーティスト名に応じた候補を取得します。

## TOP10 曲追加

「人気曲追加」ボタンを押すと、入力したアーティストの人気 TOP10 曲が一覧で表示されます
![playlistAPP_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/3cf048e7-d965-c76a-8e79-a083caf6da20.png)

再び、[Search for Item](https://developer.spotify.com/documentation/web-api/reference/search)API により、アーティスト名に紐づくアーティスト ID を取得します。
そのアーティスト ID を引数にして、[Get Artist's Top Tracks](https://developer.spotify.com/documentation/web-api/reference/get-an-artists-top-tracks)API を利用して人気曲を取得します。

## プレイリスト作成

曲を追加後、プレイリスト名を入力して、「プレイリスト作成」ボタンを押すと、確認ダイアログが表示されます。
このダイアログに対して、「はい」ボタンを押すと、プレイリスト作成処理が走ります。
![playlistAPP_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2603981/4f6e580e-36bd-efb4-88d8-de5ac39e203d.png)

最後に、[Create Playlist](https://developer.spotify.com/documentation/web-api/reference/create-playlist)API を利用してプレイリスト作成を行います。

:::note alert
Spotify API の都合上、
アプリ作成者本人にしかプレイリスト作成処理を行うことはできないです。
:::

# デプロイ

デプロイは[Vercel](https://vercel.com/)を利用しました。商用目的でなければ、無料プランでもデプロイすることができます。

# さいごに

Spotify API を利用したアプリを作成してみました。今後、さらに機能を追加していく予定です。バグを発見したり、改善案がありましたらこちらの記事でコメントしていただけると助かります。
フロントエンジニアになるために～2日目～

# 2日目の学習
引き続きフロントエンジニアの用語学習

**Node.js**
>JavaScriptはブラウザ上で動作するプログラミング言語
>Python、Rubyは「パソコン上」で動作する
>上記の違いは「OSの機能にアクセスできるかどうか」
>Node.jsはPythonなどのように「パソコン上」で動かせるようにする「JavaScriptの実行環境」

**React**
>UIを作ることに特化したJavaScriptライブラリ

**Next.js**
>Reactをベースに開発されたJavaScriptフレームワーク
>フレームワーク（プロジェクトやプロダクトを構成する骨組み）を提供してくれる

**クライアントサイドレンダリング**
>ブラウザ側でHTML/CSSを生成する際にJavaScriptが実行される
>初回にページ全体を処理する
>　1.ブラウザが指定URLへリクエストし、＜body＞がかっらぽのHTMLを取得
>　2.ブラウザはJSを実行しHTMLやCSS等を<body>へレンダリング
>　3.ブラウザはHTMLの＜body＞に展開されたHTML情報を表示

**サーバーサイドレンダリング（SSR）**
>サーバー側でレンダリング（描画）を行う
>
Outlookアドレスコピペから各種情報抽出するPower Automateフロー

## 緒言
社内限定ですが、Outlookメールのアドレスからその人の漢字氏名や部署名、上司の連絡先等の情報を抽出するフローが欲しくて作りました。結構使ってます。

## 作り方
### 【前半】下準備
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/2d0f8109-bb55-110b-2c54-0e221ae85993.png)

1. トリガーでOutlookメールの宛先やcc等からコピペ
1. 抽出結果を格納する配列変数を定義
1. `Compose`でトリガー入力の複数アドレスコピペを`split`で分解
    ```
    split(replace(replace(triggerBody()?['text'],'<',';'),'>',''),';')
    ```
    
1. 分解結果の中の自社ドメインを含む文字列のみフィルター

### 【中盤】情報抽出と格納
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/cf7df86b-c25b-0376-2fee-84a65f4e1c2f.png)
1. 前半の`Filter array`の結果で`Apply to each`
1. `Get user profile(V2)`で情報抽出
    UPNには`trim(items('Apply_to_each'))`を設定
1. `Get manager(V2)`で上司の情報抽出
1. `Get manager(V2)`が失敗した場合の結果格納
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/20e9a07b-552e-ab74-8b61-cebfb9a49ac3.png)

1. `Append to array variable`がスキップされた場合の結果格納
    ※ すなわち`Get manager(V2)`が成功した場合
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/01b702ca-50fd-38a8-57d2-3dbb8c0fbe31.png)

### 【後半】データまとめ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670355/a03d67c2-5640-f58a-c6a4-b9d2b0c68d51.png)
1. `Create CSV table`で配列をCSVへ
1. `Compose`で文字化け対策 (詳細は[こちらの記事](https://zenn.dev/karamem0/articles/2020_09_30_120000)参照)
    ```
    concat(decodeUriComponent('%EF%BB%BF'),body('Create_CSV_table'))
    ```
1. メール等で結果を通知

## 結言
全社員の全情報をサッと確認できる公式ツールあれば良いのに・・・
iOSでサービスを見た時にinputタグでのズーム対策

## 原因

- iOSデバイスでサービスを閲覧して16px以下で指定している`input`タグのフォーカス時にズームされてしまうみたいです。

## 対策

- 今回の行った対策として、`meta`タグの`viewport`の中身に`maxmum-scale=1.0`を指定しました。しかし、参考記事にもよるとこの対策ではアクセシビリティ違反になるみたいです。今回、私が行っていた実装の中身を見ると`meta`タグの`content`属性の中身を見ると`width=375`が指定されていました。その副作用なのか、`initial-scale=1.0`がなかったのでそちらを指定したら改善されました。

## 参考記事

https://zenn.dev/rhirayamaaan/articles/f0209ad6574ed4

https://qiita.com/skwbr/items/b285cc312587c73a4812
viでファイルを編集する

viでファイルを編集するために、コンソールに以下の内容を入力してください。
ファイル名の部分には、自分が編集したいファイルを入力してください。
```
vi ファイル名
```
すると、ファイルの中身を開くことができますが、このままでは編集できません。
コンソールモードに切り替える必要があります。
まず、[shift]と[o]を入力してください。
これでファイルが編集できるようになります。
編集が終わったら、[Esc]キーを入力してください。
[:wq]と入力し、[enter]キーを押せば、編集した内容が保存されます。
Amplify ラジオ レポート 2024/10/15

## はじめに
2024年10月15日に[Amplify Japan User Group](https://aws-amplify-jp.github.io)の[Discord](https://discord.gg/jh6ey5Vz)にてAmplify ラジオを開催しました。

今回は[Amplify AI](https://github.com/aws-amplify/amplify-ui/issues/5773)など機能キャッチアップと[@fossamagna](https://x.com/fossamagna)さんが開発した[amplify-data-migration](https://github.com/purpom-media-lab/amplify-data-migration/blob/main/README.ja.md)をDeepDiveする**深〜い回**でした。

本記事はレポートという形で、簡単ですが内容をまとめています。

:::note warn  
お詫び
エラーで画面共有もできず、グダッてしまい申し訳なかったです。
:::

## Amplify Japan User Groupの紹介
Amplify 日本ユーザーグループ (Amplify Japan User Group) は、 AWS Amplify の利用者・開発者が主体となり、 相互に AWS Amplify の利用・開発をサポートするために、主に日本国内で活動するグループです。
#### 公式サイト
https://aws-amplify-jp.github.io

#### Discord
https://discord.gg/AC43MAPfYJ

## 内容

今回は運営から[@adt0705](https://x.com/adt0705)、[@fossamagna](https://x.com/fossamagna)、[@mkdev_10](https://x.com/mkdev_10)の3名が参加。

### 話したこと一覧
1. Amplify AIについて
1. Amplifyのホスティングのバージョンアップについて
1. amplify-data-migrationについて


### 1. Amplify AIについて
Amplify AIは現在RFCのAmplifyと生成AI（Bedrock）を繋げる機能。爆速でChat UIが作成でき生成AIと対話する機能を実装できます。

https://github.com/aws-amplify/amplify-ui/issues/5773

参加した運営メンバーもまだ触っていない状況のようでした。私のブログで簡単に紹介しいています。

https://qiita.com/MK_Tech/items/00a7ef73d36a6fe62689

力を入れてる機能のようで、もしかするとre:Invent 2024でなにか発表があるかもしれませんね。

### 2. Amplifyのホスティングのバージョンアップについて
Amplify Gen2ではSSGへの対応などホスティング周りが強化されており、日々アップデートされています。

https://zenn.dev/ototrip/articles/tech-nextjs-amplify-4

また、カスタムホスティングも強化されていて、あらゆるフレームワークをホスティングできる仕様があるようです。

https://docs.aws.amazon.com/amplify/latest/userguide/advanced-open-source-adapters.html

ただ、新機能にはバグもあるようで、バクのフィードバックはGithubのissueではなくAWSサポートにケースを上げるなどルールがあるようで気をつける必要があります。

https://github.com/aws-amplify/amplify-hosting/issues/new/choose

開発時には要注意ですね。

### 3. amplify-data-migrationについて
本日一番もりあがったのが、このマイグレーションツールです。

https://github.com/purpom-media-lab/amplify-data-migration/blob/main/README.ja.md

DynamoDBにはRDBSによくあるマイグレーションツールがなく、Amplify Gen2に最適化した形で開発されたのがこのマイグレーションツールです。TypeScriptで実装されており、マイグレーション時にデータが削除されないように、DynamoDB Point-In-Time Recovery を利用したデータの引き継ぎが可能になっています。

AWS Amplifyのモデルのキーを変更した場合にReplaceされデータ削除されます。このようなクリティカルな挙動にも対応できる素晴らしいツールです。

ツールを開発した背景や、実装の際の考察や工夫など、開発者である[@fossamagna](https://x.com/fossamagna)さんに直接を聞けるまたとない機会でした。

### まとめ
最新機能のキャッチアップができただけでなく、ツール作成秘話などを聞けるゆる〜く、ふか〜い回でした☺️

マニアックですが良い体験ができる**Amplify Japan User Groupならではのラジオ**でした📻

Amplify Gen2はどんどんアップデートされています。次回の配信も近いかも🚀
スケールアップとスケールアウトの違いと使い分け

## はじめに

スケールアップとスケールアウトはどちらもサーバーの処理能力を増強させる方法です。
<br>

大規模サービスに関わる上では両者を正しく理解する必要があります。
<br>

そこでこの記事では、スケールアップとスケールアウトの違いと使い分けについてまとめます。

## スケールアップとは

スケールアップは**サーバーのスペック（CPUのコア数、メモリ容量など）を増強する**ことで処理能力を向上させる方法です。
<br>

「垂直スケーリング」とも呼ばれます。

### メリット

- 既存のサーバーの設定を変更するだけなので、比較的カンタンに対応可能
- アーキテクチャ全体の変更なども必要ない
- 1台のサーバーを管理すればよいため、運用もカンタン

### デメリット

- ハードウェア上の制約もあるため、サーバーのスペック増強は無限にはできない
- サーバーがダウンするとサービス全体の稼働が止まってしまう
- サーバーのスペック増強のために再起動が必要な場合、サービスの一時停止（ダウンタイム）が発生する可能性
- 高性能な機器が求められるため、コストも増大

## スケールアウトとは

スケールアウトはサーバーのスペックではなく**台数を増やすことで処理能力を向上させる方法**です。
<br>

「水平スケーリング」とも呼ばれます。

### メリット

- サーバーの数に上限はないため、理論上は無限に処理能力を向上させられる
- 1台のサーバーがダウンしても他のサーバーを使って稼働し続けられるため、可用性にも優れている
- 各サーバーは普通の性能で良いため、コスト面でもスケールアップより優れているケースが多い

### デメリット

- サーバー間のデータ整合性の確保や負荷分散のための複雑な設定や対応が必要
    - ロードバランサーによるトラフィック分散
    - セッション管理
    - データベースレプリケーション
- 多数のサーバーを管理しなくてはならないため運用も複雑

## スケールアップとスケールアウトの使い分け

前述のようにスケールアウトの方が拡張性は高い分、変更や運用は複雑です。
<br>

ただしAWSを使えばこうした運用の手間はかなり軽減できます。
<br>

- EC2,ECS: 「Auto Scaling」機能を利用可能
- RDS: 読み取り専用のレプリカの作成、Auroraの自動スケーリングなど
- Lambda: リクエストが増えると勝手にスケールアウトしてくれる
<br>

このように現代ではクラウドが複雑な運用を一手に引き受けてくれるため、大規模アプリケーションにおいてはスケールアウトが主流と言えます。

### スケールアウトが適切な場面

一方でデータベースへの書き込みや大量データのバッチ処理などはスケールアップが適しています。
<br>

複数のサーバーに書き込み処理を分散させてしまうと、以下の問題があるからです。
<br>

- データの同期や整合性の確保
- トランザクションの管理が煩雑になる
- ネットワーク通信の増加によるパフォーマンスの低下
<br>

このように、一概にスケールアップとスケールアウトのどちらが良いということではなく、状況や用途に応じた使い分けが必要です。

## まとめ

- スケールアップ：サーバーのスペックを増強
- スケールアウト：サーバーの台数を増やす
- スケールアップはシンプルだけど限界あり
- スケールアウトは複雑だけど拡張性・可用性に優れている
<br>

スケールアウトが優れているとばかり思っていましたが、用途による使い分けが重要であることを再認識しました。

### 参考資料

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

https://www.amazon.co.jp/dp/4873118700
Node-RED UDP

前回 Node-REDで三角波形を作成して、
TCPかUDPを試したいと書いたのでとりあえずUDPを試してみた。

https://qiita.com/1994koki/items/0a8c98bec806149caf0b


# 環境
Node-RED v4.0.3
Node.js v20.17.0
Linux 6.6.31+rpt-rpi-v8 arm LE（ラズパイ）
Windows_NT 10.0.22631 x64 LE（Windows）

# 送信側 UDP OUT追加
前回作成した信号をUDP OUTに繋ぐ
そしてUDPメッセージを選んでポートを9898にした
アドレスを192.168.3.45(PCのIPアドレス)にして
ラズパイ側の送信設定は完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/992df184-b66f-c68e-4583-455b0068fe98.png)


# 受信側 UDP IN追加
UDPメッセージを選んでポートを9898にした
PC側の受信設定は完了
ラズパイ同様、ゲージとチャートを作成しておいた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/96a50ca3-c139-44a6-cf06-afaea5af5c09.png)

# 完成
かなり見にくいけどラズパイからPCにUDPで通信することができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3852763/c4ddbf43-99c3-e337-f8dd-d5ad5ae17bf9.png)

送受信を反対にしてもできるはずだけど眠たいのでまた今度
Excelで小数点を含むセルがないかをチェックするマクロ

Excelで小数点を含む数値が入力されるべきではないブック（シート）があっても、何らかの理由で小数点以下の数値が含まれている場合があります。
原因は、入力者がROUND関数等での端数処理を失念していたり、単にチェック漏れしている等の様々です。

そのExcelブックを管理する側としては、小数点が入力されてしまった以上、対象のセルを特定して、小数点を排除するしかありません。

しかし、具体的にどのセルで小数点が含まれているか探すのは、骨が折れます。

小数点が入力されていることに気づいたきっかけになったセル＝小数点を含むセルならよいのですが、SUM関数等の総合計が小数点を含むことに気づいた場合には、定数として小数点を含むセルを、何千個のセルの中から特定しなければいけないことも…。

そういうときには、下記のコードでアクティブシートのセルに、計算式ではなく定数で小数点を含むセル番地をチェックしています。

<details open><summary>コード</summary>

```vb:ExcelVBA
Sub sb小数点未満を含むセルチェック()
'用途: 小数点未満の端数を含む定数セルがないかチェックし、該当セルを蛍光緑に色付けし表示
'注意: アクティブシートの全セルを対象。セルの値が数式の場合、そのセルはチェック対象外
       
    '------- 変数の宣言 -------
    Dim ws              As Worksheet 'アクティブなワークシートを格納する変数
    Dim rowIdx          As Long      '行番号をループ用に格納する変数
    Dim colIdx          As Long      '列番号をループ用に格納する変数
    Dim cellValue       As Variant   'セルの値を格納する変数
    Dim cellAddress     As String    'セルのアドレスを格納する変数
    Dim fractionalCells As String    '端数があるセルのアドレスを格納する変数
    Dim myMsg As String              'メッセージボックス用変数
    
    '------- 初期設定 -------
    ' アクティブシートを設定
    Set ws = ActiveSheet
 
    ' メッセージボックスおよびイミディエイトウィンドウに表示するセルアドレスを格納する変数
    fractionalCells = "端数があるセル:" & vbCrLf
 
 
    '------- シートの各セルをループしてチェック -------
    For rowIdx = 1 To ws.usedRange.Rows.count
        For colIdx = 1 To ws.usedRange.Columns.count
 
            ' セルが数式を含むか確認し、数式を含む場合はスキップ
            If Not ws.Cells(rowIdx, colIdx).HasFormula Then
                cellValue = ws.Cells(rowIdx, colIdx).Value 'セルの値を取得
 
                ' 数値であり、小数点以下の端数がある場合
                If IsNumeric(cellValue) Then
                    If cellValue <> Int(cellValue) Then
                        cellAddress = ws.Cells(rowIdx, colIdx).Address(False, False)    'アドレスを取得
                        ws.Cells(rowIdx, colIdx).Interior.Color = RGB(102, 255, 51)     '蛍光緑で色付け
                        fractionalCells = fractionalCells & cellAddress & vbCrLf        'アドレスを文字列に追加
                    End If
                End If
                
            End If
 
        Next colIdx
    Next rowIdx

    '------- 結果を表示 -------
    Debug.Print fractionalCells
    ' 最後にまとめてメッセージボックスとイミディエイトウィンドウを表示
    If Len(fractionalCells) > Len("端数があるセル:" & vbCrLf) Then
        myMsg = "端数があるセルをイミディエイトウィンドウへ出力しました。"
        MsgBox myMsg, , "処理結果通知"
    Else
        myMsg = "端数があるセルは見つかりませんでした。"
        MsgBox myMsg, , "処理結果通知"
    End If
End Sub

```
</details>

定数（値）として小数点を含むセルを目立つようにセル色を蛍光緑にするのと、イミディエイトウィンドウに該当のセル番地をDebug.Printする仕組みです。

なお、簡易的なチェックツールなので、「’1.1」（先頭にアポストロフィーをつけている）みたいに文字列として入力されている小数点を含むセルも、抽出対象になります。

:::note warn
イミディエイトウィンドウに出力する仕組みなので、出力前にイミディエイトウィンドウにDebug.Printしている情報等を事前にクリアする仕組みを組み込もうとしました。
しかし、元々VBE画面にフォーカスしていない場合は、イミディエイトウィンドウをクリアする動作が上手くいかないことが多いです。
このマクロはリボンに登録してプロシージャを呼び出すことを想定し、イミディエイトウィンドウを事前にクリアする仕様の実装は諦めました。
:::
【Git】サブモジュールの変更を反映する方法


以下のコマンドを実行することでサブモジュールの変更を取り込むことができます。

```shell
git submodule update --remote
```

上記の場合にはすべてのサブモジュールの変更を取り込みますが、特定のサブモジュールのみの変更を取り込みたい場合には以下のように実行します。

```shell
git submodule update --remote <submodule_path>
```

https://arc.net/l/quote/lssbbcvw
Dev Containerでコンテナ作成が失敗し続ける訳

# はじめに
VScodeの拡張機能`Dev Container`本当に便利
だが、新しく環境を作ろうとすると、な・ぜ・かコンテナ作成に失敗し続ける事象が発生していた。
調査をした結果、ホストマシンのフォルダ名が原因だと発覚したため共有する

# 事象
`Dev Container`に必要なファイルを揃え、いざ「リモートで再度開く」を実行すると、docker composeが失敗する
```shell
[1938 ms] Start: Run: docker compose --project-name _study_devcontainer -f c:\Users\name\Documents\VScode_dir\適当な名前_study\.devcontainer\docker-compose.yml -f c:\Users\name\AppData\Roaming\Code\User\globalStorage\ms-vscode-remote.remote-containers\data\docker-compose\docker-compose.devcontainer.build-1729002727405.yml build
invalid project name "_study_devcontainer": must consist only of lowercase alpha
numeric characters, hyphens, and underscores as well as start with a letter or n
umber
[2349 ms] Error: Command failed: docker compose --project-name _study_devcontainer -f c:\Users\name\Documents\VScode_dir\適当な名前_study\.devcontainer\docker-compose.yml -f c:\Users\name\AppData\Roaming\Code\User\globalStorage\ms-vscode-remote.remote-containers\data\docker-compose\docker-compose.devcontainer.build-1729002727405.yml build
```

# エラーの原因について
dockerのプロジェクト名の先頭文字は英数字でなければならないが、今回実行されたコマンドのプロジェクト名はアンダーバー`_`から開始している。プロジェクト名のルールに反しているためエラーが出力されている

# プロジェクト名を変更したいが…
`Dev Container`が参照しているファイルは.devcontainer/devcontainer.jsonのため、このファイルにプロジェクト名を入力すればいいはず…！
と思い調べてみたが、そのような設定はなさそう

# 真因調査
今回のように失敗し続けるパターンと一回で成功するパターンがある。失敗パターンのフォルダに成功パターンのファイルを全てコピーして実施してもコンテナ作成は失敗した
すなわち、別の何かを参照してプロジェクト名を決めていると考え、もう一度失敗したコマンドの`--project-name`を確認した
```shell
[2349 ms] Error: Command failed: docker compose --project-name _study_devcontainer
```

プロジェクト名の`_study`はどこから来ているのか。。。
どこ、から。。。

```shell
c:\Users\name\Documents\VScode_dir\適当な名前_study\.devcontainer\docker-compose.yml
```
親ディレクトリの名前か！！！！

# 今回の真因
親ディレクトリの名前が「日本語のみ」または「日本語_英語」の場合にプロジェクト名がアンダーバーから始まってしまうようです
名前を`hoge_study`にしたらコンテナ作成できました
```shell
c:\Users\name\Documents\VScode_dir\hoge_study
```
```shell
[1989 ms] Start: Run: docker compose --project-name hoge_study_devcontainer -f c:\Users\name\Documents\VScode_dir\hoge_study\.devcontainer\docker-compose.yml -f c:\Users\name\AppData\Roaming\Code\User\globalStorage\ms-vscode-remote.remote-containers\data\docker-compose\docker-compose.devcontainer.build-1729003206538.yml build

[+] Building 0.2s (6/6) FINISHED                           docker:desktop-linux
```
【令和6年秋最新版】応用情報&高度情報午前問題に初登場した用語とその解説

# はじめに
令和6年秋季の応用情報技術者試験、高度情報技術者試験で初登場した単語の解説です。

# 交差検証（Cross Validation）
登場した問題:point_down:

>**問2 AIにおける教師あり学習での交差検証に関する記述はどれか。**
>
>**・ア**　過学習を防ぐために、回帰モデルに複雑さを表すペナルティ項
を加え、訓練データへ過剰に適合しないようにモデルを調整する。
**・イ**　学習の精度を高めるために、複数の異なるアルゴリズムのモデルで学習し、学習の結果は組み合わせて評価する。
**・ウ**　学習モデルの汎化性能を高めるために、単一のモデルで関連する複数の課題を学習することによって、課題間に共通する要因を獲得する。
**・エ**　学習モデルの汎化性能を評価するために、データを複数のグループに分割し、一部を学習に残りを評価に使い、順にグループを入れ替えて学習と評価を繰り返す。
>
>（出典：令和6年度秋季 応用情報技術者試験 午前問題 問2）

**交差検証**とは、教師あり学習を行う際に**汎化性能を評価するためにデータを複数のグループに分割し、一部を学習に残りを評価に使い、順にグループを入れ替えて学習と評価を繰り返すこと**です。
ということで、問題の正解は<font color="red">「エ」</font>です。

**汎化性能**とは、学習を終えたモデルが学習に使った入力データのみだけでなく未知の入力に対しても高い精度で判定を行えるかという性能のことです。
学習データとテストデータが全く同じだと、未知の入力に対しての性能である**汎化性能を検証することができない**為、学習を終えたモデルの**検証には学習データとは別の検証データを用いる**のが通常です。

学習データと検証データのセットを順番に入れ替えて学習と検証を繰り返す**交差検証**を行うことで、**データの一部に過度に依存することを防ぐ**メリットがあります。

<font color="blue">「ア」</font>は、**正則化**の説明です。
<font color="blue">「イ」</font>は、**アンサンブル学習**の説明です。
<font color="blue">「ウ」</font>は、**マルチタスク学習**の説明です。

:::note
他の選択肢も**今後の試験には登場する可能性が高い**と思います。4つ一緒に覚えておきましょう。
:::


# 量子超越性（Quantum Supremacy）
登場した問題:point_down:
>**問9 量子超越性(Quantum Supremacy)の説明として、適切なものはどれか**
>
>**・ア**　重ね合わせという現象を用いた量子暗号が、現在の暗号化方式よりもはるかに安全であること
**・イ**　従来のコンピュータが古典物理学に依拠する段階に留まっているのに比べて、量子コンピュータが量子力学に依拠して作られていること
**・ウ**　従来のコンピュータでは実用的な時間で処理することができない計算を、量子コンピュータでは高速に実行できること
**・エ**　同一の性能を実現した従来のコンピュータに比べて、量子コンピュータの物理的な大きさを圧倒的に小さくできること
>
>（出典：令和6年度秋季 応用情報技術者試験 午前問題 問9）

**量子超越性**とは、**従来のコンピュータでは実用的な時間で処理することができない計算を、量子コンピュータでは高速に実行できること**です。正解は<font color="red">「ウ」</font>です。

<font color="blue">「ア」</font>は**量子暗号**についての説明です。
<font color="blue">「イ」</font>は**量子コンピュータ**と**古典コンピュータ**の違いついての説明です。
<font color="blue">「エ」</font>は、量子超越性が**コンピュータの大きさには関係ない**ことが分かっていれば除外できます。

# ダーウィンの海
登場した問題:point_down:
>**問70 企業における研究、開発、事業化、そして産業化へとステージが移行する過程の中で、事業化から産業化に移行するときの、競合製品との競争過程にある障壁を何と呼ぶか。**
>
>**・ア**　キャズム
**・イ**　死の谷
**・ウ**　ダーウィンの海
**・エ**　魔の川
>
>（出典：令和6年度秋季 応用情報技術者試験 午前問題 問70）

企業が**新たな技術を産業化**する際には、
1. 研究
1. 開発
1. 事業化
1. 産業化

の**四つのステップ**があり、それぞれのステップの間には~~無駄にカッコいい名前の~~**3つの障壁**があります。

1. 研究に次々投資しても本格的な開発を行うところまでいかず、投資したコストが泡のように消えてしまう **<font color="purple">「魔の川」</font>**
2. 開発に成功しても、事業化されないと研究よりさらに多くのコストを投入しているため失敗が企業にとって命取りになる **<font color="green">「死の谷」</font>**
3. 事業化に成功して継続的な産業となるには、既存製品や競合製品との生存競争に淘汰されずに市場で生き残っていくことが求められる **<font color="blue">「ダーウィンの海」</font>**

**「キャズム」** とは、新製品が市場に浸透するまでの間にある大きな障害のことです。これは、必ずしも研究・開発を経て事業化された新製品でなくても当てはまる用語なので、この問題の回答としては不適切です。

# 参考文献

https://qiita.com/LicaOka/items/c6725aa8961df9332cc7

https://ja.wikipedia.org/wiki/量子超越性

https://www.murc.jp/library/terms/ma/devil-river-valley-of-death-darwinian-sea/
[tips][cpp][Problemsolver] 配列をsortした上でsort前のインデックスを保持

これはもうただの問題解く時のtipsです。

pythonの`enumerate()`みたいに、配列の値で昇順sortした上で、originalの配列のインデックスを記録して使いたい。

```python
A = [4, 6, 7, 10, 2]
A = sorted(enumerate(A), key = lambda x: x[1])
print(A)
```

```python
[(4, 2), (0, 4), (1, 6), (2, 7), (3, 10)]
```

cppで`sorted(enumerate(A), key = lambda x: x[1])`と同じ処理を実装しておく。

```cpp
#include <iostream>
#include <map>
#include <vector>
using namespace std;

int main(){
    vector<int> A = {4, 6, 7, 10, 2};
    vector<int> B(A.size());
    copy(A.begin(), A.end(), B.begin());
    
    sort(all(B));
    map<int, int> mp;
    for (int i = 0; i < A.size(); i++) {
      mp[A[i]] = i;
    }
    cout << "sort前" << endl;
    for (int a : A) {
      cout << "index: " << mp[a] << " " << "value:" << a << endl;
    }
    cout << "sort後" << endl;
    for (int b : B) {
      cout << "index: " << mp[b] << " " << "value:" << b << endl;
    }
    
}
```

output
```cpp
sort前
index: 0 value:4
index: 1 value:6
index: 2 value:7
index: 3 value:10
index: 4 value:2
sort後
index: 4 value:2
index: 0 value:4
index: 1 value:6
index: 2 value:7
index: 3 value:10
```
openSUSE Leap でャなこと

「openSUSE Tumbleweed First Impression」
https://qiita.com/nanbuwks/items/352d3661f67afb04b9b9
では、openSUSE Tumbleweed / openSUSE Leap を試しましたが、WiFi 設定のところで問題があり、カジュアルユーザに使ってもらうのはキビシイ！ ということになりました。


その後も触ってみて、ちょっとアレかなあ、という感じのところがいくつか出てきたのでまとめておきます。
あまり使い慣れてないので、慣れればかんたんに解決することなのかも。


# 環境

openSUSE Leap 15.6 (KDE)

# KDE ウォレット

起動時に以下の表示が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c87caf6d-9ac0-9a28-e7ca-00c51db6f32f.png)

「キャンセル」すると前途の記事のように WiFi の Passphase を覚えてくれない。
この KDE ウォレットサービスのパスワード入力ダイアログは、オートログインを有効にしていると出現するとのこと。

# ディスプレイ輝度の設定

設定はどこ? KDE システム設定では見つけられなかった・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/482f1e27-89b3-27e4-ed10-49345a3aa4c3.png)
 google-chrome


 # マルチディスプレイのミラーリング

異なる解像度のディスプレイを接続した時に、両方同じ表示にできない・・・何故?


# Google Chrome が起動しない

はてなーと思ったら、以下のような状態だった。
```
 
[5266:5266:1014/100319.571945:ERROR:process_singleton_lock_posix.cc(20)] readlink(/home/user/.config/google-chrome/SingletonLock) failed: 無効な引数です (22)
[5266:5266:1014/100319.572146:ERROR:process_singleton_posix.cc(311)] readlink(/home/user/.config/google-chrome/SingletonLock) failed: 無効な引数です (22)
[5266:5266:1014/100319.572156:ERROR:process_singleton_posix.cc(335)] Failed to create /home/user/.config/google-chrome/SingletonLock: ファイルが存在します (17)
[5266:5266:1014/100319.572190:ERROR:process_singleton_lock_posix.cc(20)] readlink(/home/user/.config/google-chrome/SingletonLock) failed: 無効な引数です (22)
[5266:5266:1014/100319.572232:ERROR:chrome_main_delegate.cc(594)] Failed to create a ProcessSingleton for your profile directory. This means that running multiple instances would start multiple browser processes rather than opening a new window in the existing process. Aborting now to avoid profile corruption.
```
以下で対処


```
> rm .config/google-chrome/SingletonLock
```
【Linux】sourceコマンドの仕組みを理解する

# はじめに
こんにちは、「ゼロからわかる Linuxコマンド200本ノック」という教材を用いてLinuxの勉強をしています
こちらの教材、なぜ？ということを先読みして書いてくれている書籍でLinux自体が難しくてわからないということはありましたが、仕組みがわかればそれについての詳細を説明してくれている書籍です
書籍の紹介はこれくらいにして、本日は本書で触れられていた`source`コマンドについて理解を深めていこうと思います

環境：
ホストOS:Winows 11
仮想化ソフトウェア:Oracle Virtualbox
ゲストOS:ubuntu 24.04.1

# `source`の概要
`source`コマンドは、スクリプトや設定ファイルを現在のシェルで実行するためのコマンドです。
`source`を使うと、新しいシェル（サブシェルではないよ）を生成せずに、現在のシェル環境でコマンドが実行されます。
そのため、変数の定義や設定変更が即座に現在のシェルに反映される特徴があります。

本書ではシェルスクリプトを実行する手段の1つとして挙げられていました。
ですが、`source`をシェルスクリプトで実行するのは実際にはあまり使用されておらず、`~/.bashrc`の変更を反映させるために使用するようです。
※`source`は親シェル上で操作を行うため、環境変数のことを考慮すると`exec $SHELL -l`を実行して再起動するのを現場では使用されるようです。

では、なぜシェルスクリプトを実行する際に`source`を使用しないのか、`source`を`~/.bashrc`の変更を反映させるためになぜ使用するのかについて説明していきます

### シェルスクリプトを実行する際に`source`を使用しない理由
シェルスクリプトを実行する際、通常は子プロセスのシェル(サブシェルではない)が生成されて、その中でスクリプトが実行されます。

本書でも紹介いましたが、上記の子プロセスのシェル(サブシェルではない)が生成されるパターンを1つ紹介します
* ファイル名を指定して実行
ファイル名が`~/bin/lslink.sh`だとするとこのまま実行するケースです。通常は実行権がないので`chmod`で実行権を付与します
```
$ ~/bin/lslink.sh
bash: /home/ユーザ名/bin/lslink.sh :許可がありません

$ chmod a+x ~/bin/lslink.sh
# すべてのユーザに実行権を与える
```
話を戻しますが、このような新しい子プロセスのシェル(サブシェルではない)を生成する方法では、親シェルには直接影響を与えないため、親シェル内の環境変数や設定を守りつつスクリプトを安全に実行できます。
`source`を使用すると、スクリプトが現在のシェルで実行されるため、変数や設定が親シェルに反映されてしまい、他のコマンドやプロセスに影響を与える可能性があるため、通常は避けられます。


### `source`を`~/.bashrc`の変更を反映させるために使用する理由
`~/.bashrc`は、シェルの環境設定ファイルで、エイリアスやシェル変数の定義が含まれています。`~/.bashrc`は起動時に読み込まれるファイルと思っておいてください。
通常、シェルが起動したときに自動的にこのファイルが読み込まれますが、ファイルを編集した後は再度シェルを開かない限り、変更は親シェルに反映されません。

ここで`source`が役立ちます。
`source`は通常とは違い、<strong>スクリプトが現在のシェルで実行されます。</strong>
`source ~/.bashrc`を実行することで、シェルの再起動（ログアウト・ログインや新しいターミナルの起動）をせずに、編集内容を即座に親シェルに反映させることができます。
再起動せずに、即時に新しい設定を反映できる点が`source`を使う最大の理由です。
※`source`は親シェル上で操作を行うため、環境変数のことを考慮すると`exec $SHELL -l`を実行して再起動するのを現場では使用されるようです。


シェルを再起動する場合、例えばターミナルを閉じて再度開く必要がありますが、作業中にこれを行うのは不便です。また、子プロセスのシェル(サブシェルではない)では親シェルの変更が反映されないため、`source`を使うことで、既存のセッションを維持しながらも新しい設定を利用することができるのでとても便利です

# サブシェルについて(追記)
かっこ書きで(サブシェルではない)と記載をさせていただいたのですが、サブシェルと`bash`や`~/bin/lslink.sh`を実行した際に生成されるシェルは子プロセスのシェルであるということです。
この記事を載せた際には、上記の2つは同じものであるととらえていたのでサブシェルと書きましたが、コメントで別物であると教えていただいたので修正しました。
子プロセスはシェルの環境には直接影響しないという点ではサブシェルと似ていますが、OSのプロセス管理に依存するため、Bashの内部で管理されるサブシェルよりも独立性が強いという特徴があるようです。
また、サブシェルのほうがBash の中で軽量なプロセスとして生成されるため、生成によって他プロセスへのパフォーマンス影響が少ないようですが、子プロセスのシェルはOSレベルでのプロセス管理が行われいるため、数が膨大になるとパフォーマンスに影響を及ぼす可能性があるようです。

これらの詳しい内容について、もう少し深堀するためにはシステムコールについて理解する必要がありまだ未学習のため私の説明では限界があるので
詳しく知りたいという方は以下にリンクを載せておきます。ぜひ読んでみてください

https://qiita.com/ko1nksm/items/19d300c4cb812b0fde1e



# まとめ
少し長くなりましたが、簡単にまとめてみました。
* sourceコマンドの役割
sourceはスクリプトや設定ファイルを新しいシェルを作らずに、現在のシェルで実行し、即座に反映させるために使います。
* シェルスクリプト実行時にsourceを使用しない理由
通常のシェルスクリプトは新しい子プロセスのシェル(サブシェルではない)で実行され、親シェルに影響を与えないため、sourceは必要ありません。
* sourceを使用して~/.bashrcの変更を反映する理由
source ~/.bashrcを使うと、シェルの再起動をせずに設定変更が即座に反映されるため効率的ですが、環境変数のことを考慮すると`exec $SHELL -l`を実行して再起動するのを現場では使用されるようです。