OmniAICreator/Qiita-1.07M huggingface dataset:
AI-102 学習方法

## はじめに
2024年1月にAI-102を受験し、合格した者の体験記とまとめです。
Azureの中でも特にAIの分野については、更新が早いと思うので受験時期にはどうかお気をつけください。

## 私の考えるこの資格の勉強のコツ
**1\. 勉強を始める前に、絶対公式の学習ガイドを参照すること！**

[学習ガイド](
https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-102)

時期によって試験範囲が変わります。試験勉強中もこまめに確認するといいと思います。次は2024年2月7日に更新があるみたいですね。

**2\. Microsoft Learnにある演習（Lab）はやる**
Microsoftが無料で試験勉強者のために仮想環境を用意してくれているので、これは試験前に触ってみることを強くおススメします！

例えば、[このようなページ](https://learn.microsoft.com/ja-jp/training/modules/investigate-container-for-use-with-ai-services/4-exercise-use-container)の演習です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346923/37531078-ddae-4082-6557-ed8bae83e41e.png)

**3\. ChatGPTを活用する**
よくわからない単語や、似たようなサービス名称だけどなんとなく違いがわからなくて腑に落ちない時などに使ってました。
質問例：
「Azure AI Custom Vision サービスの画像分類" モデルのトレーニングと "物体検出" モデルのトレーニングの違いを表にまとめて、分かりやすく教えて。」

**4\. 英語でもサービス名称を覚えておく**
過去問や他のブログ、また案外Microsoft公式の方でも翻訳が若干異なる場合もあるので、英語でもサービス名称を覚えていたほうが無難だなと感じました。
※本番の試験では、日本語での受験を指定していたとしても、各問題で英語バージョンを確認することもができます。
先輩に教えてもらったおススメの拡張機能もここに貼っておきます。

https://chromewebstore.google.com/detail/jaen-url-toggler/cojobaphcadfijmiiopiklfpompmljgm?pli=1

私の場合は、Edgeでこの拡張機能を活用させていただいております。

## 試験勉強と同時進行でおススメしたいこと
**1\. オブジェクト指向の理解**
試験ガイドの[視聴者プロフィール](https://learn.microsoft.com/ja-jp/credentials/certifications/resources/study-guides/ai-102)の中に、下記引用のような指定がありますが、特にオブジェクト指向の理解が大切だなと感じました。
>Azure AI エンジニアとして、次のような言語を使用するソリューションを開発した経験があること。

演習（Lab）でもSDKでAIサービス構築の練習ができるので、詳しくはそこでご確認いただければと思いますが、パッケージをinstall → 名前空間（namespace）の設定 → メソッド の流れを理解していたほうが、試験でコード穴埋め問題が出た時も安心です。

**2\. AI-900の学習**
AI-102については、AI-900の上位互換の試験のため、わざわざ資格を取得する必要はないのですが、[**責任ある AI の原則**](https://learn.microsoft.com/ja-jp/training/modules/get-started-ai-fundamentals/8a-understand-responsible-ai)は、たまに出るボーナス問題！みたいなものなので、絶対に失点できない問題だと思います。

**3\. コンテナー（特にDocker）の理解**
MS Learnでも[コンテナーに Azure AI サービスをデプロイする](https://learn.microsoft.com/ja-jp/training/modules/investigate-container-for-use-with-ai-services/)方法を学ぶことができますが、初心者にとってこのページはハードルが高いので、Youtubeなどで「コンテナ技術 入門」などと検索してという知識があると安心です。
（筆者はよく理解していなく、当日の試験でDockerのデプロイの手順の問題が出て焦りました…。）

## さいごに
試験のための勉強としておすすめのサイトをまとめておきます。

**Microsoft公式演習問題（プラクティス評価）**

https://learn.microsoft.com/ja-jp/credentials/certifications/exams/ai-102/practice/assessment?assessmentId=61&assessment-type=practice

私の場合は。この練習問題だけでは、不十分だと感じたので、他のものも併せて学習することをお勧めします。

**MeasureUp**

https://www.measureup.com/microsoft-practice-test-ai-102-designing-and-implementing-an-azure-ai-solution.html

かなり本番に近い形で勉強ができるため、強くおススメします！全部英語なので、Edgeの翻訳機能をかなり使って学習しました。

**ExamTopic**

https://www.examtopics.com/exams/microsoft/ai-102/view/

ロボットではないことが確認できれば、無料で閲覧できるページがかなりあり、試験と同じ問題も結構あるような印象です。ただ、このサイトの答えが間違っていることも多々あるので、Discussionを確認しながら勉強することがおススメです。

**Udemyの問題集**

https://www.udemy.com/course/ai-102-designing-implementing-azure-ai-solution/

私の場合は、こちらを購入しましたが、古い問題も少しあるので、最新のもの（更新された日が新しいもの）を、ご購入されるのがいいかなと思います。

Youtube

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

こちらは教えていただいたサイトになります。字幕で"日本語"に設定して、流し見しました。内容も濃くておススメです。



学習内容もいつかかけたら書こうと思います。。。おわり。
Vue3 vscode 開発環境構築

## Vue
Vue (発音は /vjuː/、view と同様) は、ユーザーインターフェースの構築のための JavaScript フレームワークです。標準的な HTML、CSS、JavaScript を土台とする、コンポーネントベースの宣言的なプログラミングモデルを提供します。
## Vue アプリケーションの作成
Node.js の最新バージョンをインストールして、コマンドラインで次のコマンドを実行します
```typescript
> npm create vue@latest
```
```typescript
Vue.js - The Progressive JavaScript Framework

√ Project name: ... vue-project
√ Add TypeScript? ... No / Yes
√ Add JSX Support? ... No / Yes
√ Add Vue Router for Single Page Application development? ... No / Yes
√ Add Pinia for state management? ... No / Yes
√ Add Vitest for Unit Testing? ... No / Yes
√ Add an End-to-End Testing Solution? » No
√ Add ESLint for code quality? ... No / Yes

Scaffolding project in C:\sctree\vue-demo\vue-project...

Done. Now run:

  cd vue-project
  npm install
  npm run dev
```
## 依存関係をインストール
```typescript
vue-project> npm install
```
```typescript
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@vitejs/plugin-vue@5.0.3',
npm WARN EBADENGINE   required: { node: '^18.0.0 || >=20.0.0' },
npm WARN EBADENGINE   current: { node: 'v16.14.2', npm: '8.5.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'vite@5.0.12',
npm WARN EBADENGINE   required: { node: '^18.0.0 || >=20.0.0' },
npm WARN EBADENGINE   current: { node: 'v16.14.2', npm: '8.5.0' }
npm WARN EBADENGINE }
npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: 'rollup@4.9.6',
npm WARN EBADENGINE   required: { node: '>=18.0.0', npm: '>=8.0.0' },
npm WARN EBADENGINE   current: { node: 'v16.14.2', npm: '8.5.0' }
npm WARN EBADENGINE }

added 27 packages, and audited 28 packages in 20s

4 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
```
## vscodeを起動
```t
vue-project> code .
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/ef9981bd-0de1-1dd9-c4ba-37b3fd5b1670.png)
## 開発サーバーを起動
```
vue-project> npm run dev
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/6a505d09-2afb-22ac-efad-18b2b9bd212d.png)
## vscodeの実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/f9459a3f-5eb7-bed6-09ea-1ed9d3ea1317.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/586d8cac-8658-5d44-4541-1daa33495308.png)
## プロダクション環境への出荷
```
vue-project> npm run build
```
```
> vue-project@0.0.0 build
> vite build

vite v5.0.12 building for production...
✓ 23 modules transformed.
dist/index.html                  0.43 kB │ gzip:  0.29 kB
dist/assets/index-WjEyzLJD.css   3.71 kB │ gzip:  1.19 kB
dist/assets/index-avtuWnnn.js   63.15 kB │ gzip: 25.07 kB
✓ built in 1.31s
```
## vscode拡張機能
vscode自動提示より下記の拡張機能をインストールしたら、より自分が使いやすいコードエディタにすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/acf69217-9f80-a8a6-298e-bf8a9781ab89.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184769/6da1ee44-b9f6-0d98-079f-d496970394a2.png)
【書評】システム設計の面接試験

## 読んだ本

https://www.socym.co.jp/book/1406

## 概要

面接試験でシステムの設計を依頼されたら、という視点から、TwitterやYoutubeなど有名なサービスを作るとしたらどう設計するかを解説してくれる本です。
タイトルからは面接試験対策の本に見えるのですが、転職を予定していなくても主にWebサービスに関わるエンジニアであれば得られることが多いと思います。

目次は下記になっています。

1章　ユーザ数ゼロから数百万人へのスケールアップ
2章　おおまかな見積もり
3章　システム設計の面接試験のフレームワーク
4章　レートリミッターの設計
5章　コンシステントハッシュの設計
6章　キーバリューストアの設計
7章　分散システムにおけるユニークIDジェネレータの設計
8章　URL短縮サービスの設計
9章　Webクローラの設計
10章 通知システムの設計
11章 ニュースフィードシステムの設計
12章 チャットシステムの設計
13章 検索オートコンプリートシステムの設計
14章 YouTubeの設計
15章 Googleドライブの設計
16章 学習は続く

## おすすめの人

- Webサービスに携わっているが、どういうシステム構成で動いているかイメージできていない人（2章以降は難易度が高くなるので、1章だけ読むことをおすすめします。）
- Youtubeなど他のサービスの作り方に興味がある人

## 次に読むなら

- 思いつかず。初心者であれば、AWSなどを実際に触れてみるのが良いかもしれません。

## 感想

章のはじめに、これから設計するシステムの要件を面接官とすり合わせる話が必ずあり、実際に設計するときもこの工程が一番大事だと考えているため、いい本だなと思った。
中盤の分散システム周りの設計について、よく使うことがあるけど、中身がどうなっているか気にしたことがなかったので、色々なアルゴリズムなどの知らない用語が飛び交い、調べていくうちに知識が深まった。下記知らなかったこと一例。

- コンシステントハッシュ...シャーディングの採番
- ベクタークロック...分散システムの一貫性
- ゴシッププロトコル...分散システムのノード間通信
- ヒンテッドハンドオフ...分散システムのノード故障時の復旧
- アンチエントロピー...分散システムのノード故障時の復旧
- マークルツリー...データ構造
- sloppy quorum...分散システムの可用性
- ブルームフィルター...データ構造（キャッシュ）
- トライ木...データ構造
bash ( curl  + jq ) だけで Azure Blob Storage を扱う 

# bash ( curl  + jq ) だけで Azure Blob Storage を扱う 

## 概要
 - コンテナイメージのサイズを減らす目的だった
 - SAS の HMAC-SHA256　が至難の業だった
 - やっと動いた後で気がついたが、rclone をインストールしてもサイズはさほど変わらない

## コード
```bash
#!/bin/bash

set -eu

# Azure Storage Account の情報
account_name="your_storage_account_name"
account_key="your_storage_account_key"
container_name="your_container_name"
blob_name="your_blob_name"
file_path="local_file_path_to_upload.txt"
destination_path="local_destination_path_to_download.txt"

# 有効期限を計算
expiry=$(date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ')

# リソースの情報
canonicalizedResource="/blob/${account_name}/${container_name}/${blob_name}"

permission=rcd
version=2018-11-09
resource=b

# 署名文字列を構築
string_to_sign="${permission}\n\n${expiry}\n${canonicalizedResource}\n\n\n\n${version}\n${resource}\n\n\n\n\n\n"

# HMAC-SHA256を計算
signature=$(printf "$string_to_sign" | iconv -t utf8 | openssl dgst -sha256 -hmac $(echo ${account_key} | base64 -d) -binary | base64 -w 0)

# SAS トークンを構築
signature=$(echo -n $signature | jq -Rr '@uri')
sas_token="sv=${version}&se=${expiry}&sr=${resource}&sp=${permission}&sig=${signature}"

# REST API URLを構築
url="https://${account_name}.blob.core.windows.net/${container_name}/${blob_name}?${sas_token}"


# curl を使用してファイルをアップロード
curl -X PUT \
  -H "x-ms-blob-type: BlockBlob" \
  -H "Content-Type: application/octet-stream" \
  -T "${file_path}" "${url}"

# curl を使用してファイルをダウンロード
curl -o "${destination_path}" "${url}"
```
AndroidStudioで通信の内容を簡単に確認する方法

Network Inspectorご存知でしょうか？

AndroidStudioの機能でネットワーク通信の中身の確認が出来ることを最近知りました。

今まではログなどで確認していて、ログが流れてしまったりとちょっと不便でした。

こちらはの方法では簡単に確認する事ができます。

AndroidStudioにある機能でNetwork Inspectorを使用すると簡単です。

公式サイトはこちら

https://developer.android.com/studio/debug/network-profiler?hl=ja

AndroidStudioの下にあるApp Inspection　に　Network Inspectorがあります。

リクエストやレスポンスのJsonを確認できたり、ステータスなども確認できます。

ログで流されてしまう可能性とかも無いので、是非確認してみてください！

まだまだ、便利な機能がありそうなので、もう少し調査して見ようと思います。
EC2 AutoScalingのヘルスチェック猶予期間の算出方法

# はじめに
AutoScalingのヘルスチェック猶予期間のパラメータの算出方法を備忘として書いておきます。

# そもそもAutoScalingのヘルスチェック猶予期間とは？
AutoScalingのヘルスチェックには以下２つのタイプがあります。
・EC2
・ELB
EC2の場合、EC2のステータスチェック（コンソール上2/2OKと出るもの）が評価され、正常な状態であれば、AutoScalingは対象のEC2を正常とみなします。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/monitoring-system-instance-status-check.html

ELB側を選択すると、ELBのヘルスチェック（HTTPやTCP）結果を元に正常か判断されるため、EC2だけでなく、アプリケーションとしての正常性も評価可能であることから、通常ELBタイプを選択しておくことが望ましいです。
ただし、AutoScalingが発動し、ELBのヘルスチェックに合格する前にAutoScalingがヘルスチェックをしてしまうと、AutoScalingが正常とみなさず、インスタンスを削除してしまいます。これを猶予する期間がヘルスチェック猶予期間です。

https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/health-check-grace-period.html

# 適切な設定でない場合の問題
よくある事象が以下の例です。OSなどの起動が間に合わず、ヘルスチェック猶予期間中にALBのヘルスチェックがOKにならず、AutoScalingがインスタンスの削除と追加を繰り返してしまうパターンです。
![スクリーンショット 2024-01-28 22.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/b235561d-68fb-9dc9-f97e-5c6f4f452e73.png)

# 適切な設定値
動きを見ていきましょう。※すべでデフォルト値前提です。
EC2が作成された時点で、ALBはヘルスチェックを開始します。
この時点ではOS、アプリが起動していない場合、30s間隔かつタイムアウト５秒で２連続失敗でNG判定されます。
以後３０秒間隔で５連続成功でOK判定されます。
つまり、OS、アプリが起動する時間とヘルスチェックの連続成功するまでの時間をカウントに入れる必要があるということです。

実際の例を見てみましょう。
まずはOKの場合です。
デフォルトのヘルスチェック猶予期間３００秒までの間に５連続成功する時間１５０秒より前にアプリの起動が成功していれば、大抵の場合ヘルスチェックに問題はありません。

![スクリーンショット 2024-01-28 22.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/048fda46-67f5-c345-8733-92d05ece323d.png)

しかし、３００秒より後にヘルスチェックが成功するパターンになると、AutoScalingは削除と作成を繰り返す動作になります。
![スクリーンショット 2024-01-28 22.48.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584167/b062ec68-1f8f-79c2-1377-c03852c677fe.png)

# 結論
ヘルスチェックの猶予期間は以下の時間を合計した値の最大を目安にするといいです。
・OSの起動時間
・APの起動時間
・ヘルスチェック待機時間（デフォルト３０ｓ）
・ヘルスチェック連続成功判定の時間（３０ｓ＊５回＋α）※APのレスポンスタイムを考慮にいれる

# まとめ
APのリリースにより起動時間に差分が発生したりすることもあります。リリース後はAutoScalingが頻繁に発動していないかチェックを行い、猶予期間が問題ないかモニタリングしましょう。
【KMP】KMPチュートリアル「5. Share more logic」で発生する Unresolved reference: lifecycle エラー

## はじめに

Kotlin Multiplatform 公式チュートリアルの 「[5. Share more logic](https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-upgrade-app.html)」 を実施する場合に発生する Unresolved reference: lifecycle エラーの解決方法について記載する。
本エラーは、 Kotlin Multiplatform 公式[チュートリアル](https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-create-first-app.html)の指示通りに [Kotlin Multiplatform wizard](https://kmp.jetbrains.com/?_gl=1*1910pwx*_ga*MTg4MzY4NzgyNC4xNjgzOTY0MzAx*_ga_9J976DJZ68*MTcwNzAyNzE0Ny4zOC4xLjE3MDcwMjg5NzkuNTUuMC4w&_ga=2.108931201.2060786661.1706942764-1883687824.1683964301) で KMP プロジェクトを作成した場合に発生する。(2024/01/28 時点)
Android エンジニアにとっては何でもないエラーであるが、 iOS エンジニアにとって、Gradle 関連のエラーは解決に時間を要するだろうという予測のもと本記事を書いた。


## 事象

 「[5. Share more logic](https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-upgrade-app.html)」 の以下を実施すると、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494458/dcf6c15d-686a-d90b-0edb-54e8acf0d89d.png" alt="" width="500">

```shell
e: file:///Users/xxxx/プロジェクト名/composeApp/build.gradle.kts:27:42: Unresolved reference: lifecycle
```

というエラーが発生する。 

## 解決方法

`libs.androidx.lifecycle.viewmodel.compose` は "libs."で始まるのでバージョンカタログにライブララリが定義されていないのだろうと予測できる。
gradle/libs.versions.toml を覗くと案の定 "androidx-lifecycle-viewmodel-compose" という定義はない。

> `libs.androidx.lifecycle.viewmodel.compose` がなぜ `androidx-lifecycle-viewmodel-compose` という定義でバージョンカタログファイルに定義されるのかということは[ここ](https://developer.android.com/studio/build/migrate-to-catalogs?hl=ja)を参照されたい。

gradle/libs.versions.toml に `androidx-lifecycle-viewmodel-compose` を以下のように追加する。バージョンについて [ここ](https://mvnrepository.com/artifact/androidx.lifecycle/lifecycle-viewmodel-compose) を参照してはなるべく新しいものを設定すると良いと思われる。

```
[versions]
...
lificycle-viewmodel-compose = "2.7.0"

[libraries]
...
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lificycle-viewmodel-compose" }
```

これでエラーが解消され、ビルドに成功するはずである。
AWS Batch 備忘録

# はじめに
エンジニアとなり約半年。
最近、業務でAWS Batch を使用することがあり、「なんじゃこれ？」となったので、調査したことを備忘録として載せます。まだまだビギナーエンジニアなので、不足点とかあればすみません。

# AWS Batchとは？
簡単にいうと、大規模計算におけるバッチ処理を効率的に行なってくれるサービスです。
バッチ処理を行う際、AWS Batch が自動でインスタンスをプロビジョニングしてくれます。
[AWS Batch 公式ドキュメント](https://aws.amazon.com/jp/batch/)

# AWS Batch の設定
AWS Batch では、「ジョブ」「ジョブ定義」「ジョブキュー」「コンピューティング環境」を設定する必要があります。それぞれ見ていきましょう。
- ジョブ
- ジョブ定義
- ジョブキュー
- コンピューティング環境



### ジョブ
AWSによって実行される作業単位のことです。ジョブ定義に基づき作成されます。
パラメータには以下のようなものを設定します。
- 元となるジョブ定義
- 投入先ジョブキュー 等

### ジョブ定義
その名の通り、ジョブを定義するものです。パラメータには以下のようなものを設定します。
- ジョブが必要とするvCPU数やCPU、メモリ
- コンテナイメージ
- コンテナ内での実行コマンド 等

### ジョブキュー
ジョブが待機する場所です。ジョブは一旦ここで待機し、そこからコンピューティング環境へと渡されます。
パラメータには以下のようなものを設定します。
- 実行先のコンピューティング環境（3つまで指定可能)
- ジョブキューの優先度

### コンピューティング環境
ジョブを実際に実行する場所です。ECSクラスターで構成されます。
パラメータには以下のようなものを設定します。
- 最小vCPU数、最大vCPU数（最小vCPUを0にすることでジョブのない時はインスタンスを起動しない設定にできる)
- インスタンスタイプ
- ユーザー独自のAMIや起動テンプレート 等

# ストレージ
永続化する必要のあるデータについては、他のストレージに移す必要があります。
S３やEFS、FSxが使えます。
EFSとFSxはマウント作業が必要になるので、その方法を以下に記載します。
### EFS
ユーザーデータに、EFSのマウントを行うコマンドを記述した起動テンプレートを作成します。
コンピューティング環境作成の際に、その起動テンプレートを指定し、作成します。

### FSx
FSxのマウントにはLustreクライアントのインストールが必要になります。
[(Lustreクライアントのインストール方法)](https://docs.aws.amazon.com/ja_jp/fsx/latest/LustreGuide/getting-started-step2.html)
LustreクライアントがインストールされたAMIを、AWSのイメージビルダーで作成し、
そのAMIを使用して、ユーザーデータに、FSxのマウントを行うコマンドを記述した起動テンプレートを作成します。
コンピューティング環境作成の際に、その起動テンプレートを指定し、作成します。

# 終わりに
ゲノム解析や機械学習基盤の作成にAWS Batch が利用されるようです。
AWS Batch を触るとき、この記事が少しでも参考になると幸いです。
WSL + VSCode + Dockerでの開発環境構築

読んだ本に書いてた内容。
絶対覚えきれないのでメモがてら。
ちなみに本は[これ](https://www.amazon.co.jp/dp/4798179337)です

## 開発環境として利用するディレクトリを作成

```

cd /usr/local/src
sudo mkdir projectName
sudo chmod 777 projectName

```

chmod: change modeコマンド。
ファイルのオーナーに1+2+4=7の権限、グループメンバーとかに同じく1+2+4=7、そのほかにも7の権限を渡す感じ。

項目|説明
:--:|:--:
u|ファイルのオーナー。
g|グループと、ファイルのグループに関連する拡張 ACL エントリー。
o|他のすべてのユーザー。

項目|数値|説明
:--:|:--:|:--:
r|1|読み取り許可。
w|2|書き込み許可。
x|4|ファイルの実行許可 (ディレクトリーの場合は検索許可)。

コピペ元↓
https://www.ibm.com/docs/ja/aix/7.2?topic=c-chmod-command

わかりやすく見たいなら↓
https://qiita.com/shisama/items/5f4c4fa768642aad9e06

## dockerコンテナを作成

VSCodeの拡張機能からDev Containersを利用してコンテナを立ち上げる方法をとる。
あらかじめWSL側にDockerをインストールしておき、起動していることを確認する。

手順↓
https://docs.docker.jp/desktop/windows/wsl.html

下記を実行して、作成して権限を変更した環境からVSCodeを立ち上げる。

```

cd ./projectName
code .

```

Open Folder in Container...を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/22c864c9-7f68-07ec-7240-2c51fddc24a9.png)
現在のフォルダを選択し、利用したい言語とかフレームワークとか選んで確定する。
privateメソッドだらけのクラス（「良いコード悪いコードで学ぶ設計入門」復習）

# 背景
「良いコード悪いコードで学ぶ設計入門」の復習の為です。
今回は「privateメソッドだらけのクラス」についてです。

# privateメソッドだらけのクラス
privateメソッドが多いクラスは単一責任の原則を守れていない可能性があります。
異なる責務は別のクラスに分離しましょう。

# 最後に
privateメソッドだらけのクラスは業務でも書いてしまっているので、単一責任の原則を守れているか疑いたいなと思います。
【Linux】Linucレベル1 102試験受験振り返り

# Linucレベル1 102試験に合格しました！！
長いこと勉強してきて，ついにLinucレベル1を取得しました。結果はこんな感じ

スコア　**653点**
|  セクション名  |  正解率  |
| ---- | ---- |
|  シェルとスクリプト  |  70%  |
|  ネットワークの基礎  |  85%  |
|  システム管理  |  91%  |
|  重要なシステムサービス  |  77%  |
|  セキュリティ  |  83%  |
|  オープンソースの文化  |  66%  |

Linucの合格点は65~75%と言われているので，合計で見れば何とか合格。
セクションごとで見るとギリギリだったり余裕だったり差が激しい。

# 勉強方法
私の場合は(言い訳にはなるが)，途中体調を崩したりプライベートがかなり忙しかったこともあり，勉強時間としては半年以上かかっている(もちろんこんなにかける必要はない)

勉強はメインとして以下を使用した。
* Linux教科書 LinuCレベル1 Version 10.0対応⇒インプットメイン
* ping-t⇒演習メイン
* 自分のPCのLinux環境⇒演習メイン
* Youtube⇒インプットや不明点のおさらいメイン

順番としてはLinux教科書をさらっと読む⇒ping-t・実機操作⇒解説や書籍を読んでも不明な部分を，Youtubで確認。
実機で操作する場合は諸々のインストールが必要になるので，ハードルを感じる場合はブラウザで試すのもあり。最近はこういった学習サイトもある。

https://envader.plus/

## 教科書の使い方
以前どこかの記事で見かけたが，インプット多めにやってから演習を行うよりも，演習をやってから解説などを読む方が頭に残りやすいらしい。
なので，初めに読むときはさらりとコマンドやシステムの説明を読むくらい。実際Linuxを勉強すると分かるが，コマンドのオプションは丸暗記しなくても大体想像つくので，一回問題を解いて後から復習する形が定着しやすい(英訳の頭文字を取っていることが多い)

## ping-tの使い方
使える期間によって料金が変動する。

内容としては，選択式の最強問題集と，記述式のコマ問がある。

まずは最強問題集をやって，ある程度点数を取れるようになってからコマ問を行うと知識が定着しやすいかも。合格体験記を読むとコマ問を使わない人もいたが，実際の問題では数問記述が出たので，時間があればやっておきたいところ。
どちらも最低3周くらいはやって，最強問題集は間違えた問題を記録してくれているので，間違えた問題はとにかく解説を読みこんだ。

最強問題集は解説もついていて，かなりの問題数なのでものすごく重宝している。

https://ping-t.com/


# なぜLinucを取得しようと思ったのか
エンジニアになって初めての案件でLinuxを使ったのと，今後はソースを書くだけではなくインフラの知識も必要なのではと考えたから。

# 次の目標はAWS!
アドベントカレンダーでAWSのサービスについて一通りまとめた。今後の可能性を広げるために，AWSの知見を深めていきたい。まずはクラウドプラクティショナーから取得できるよう勉強していく。
content_script が実行されているページでのみ action (popup) を有効にする

# はじめに
Chrome拡張は `action` 、`background`、`content_script`の異なるコンテキストで実行されます。このうち `content_script` は `matches` で指定したURLパターンのページで実行されます。ページのDOM操作ができる `content_script` が実行されている場合のみ、`action` を有効にしたかったので調査しました。

# 動作原理
* `background` → `content_script` の通信は `chrome.tabs.sendMessage` で行います
* `chrome.tabs.sendMessage` は聴取するリスナが存在しない場合にエラーを発生させます（下図）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/578163/fbd8d6c3-cd0f-742d-72a8-122c8675bd4b.png)
* `content_script` で聴取している場合はもちろんエラーが発生しません
* つまり、エラー発生の有無で `content_script` 有無により `action` の有効・無効を切り替えることができます


https://developer.chrome.com/docs/extensions/reference/api/tabs?hl=ja#method-sendMessage

# コード
サンプルでは `https://www.google.co.jp/*` で `content_script` を実行させています。
アイコンファイルは用意してください。

```json:manifest.json
{
  "name": "特定のURLで有効",
  "description": "content_scriptsが有効なURLでのみactionを有効にする",
  "version": "1.0",
  "manifest_version": 3,
  "icons": {
    "16": "icon_16x16.png",
    "48": "icon_48x48.png"
  },
  "action": {},
  "background": {
    "service_worker": "service-worker.js"
  },
  "content_scripts": [
    {
      "matches": ["https://www.google.co.jp/*"],
      "js": ["content-script.js"]
    }
  ]
}
```

```javascript:service-worker.js
// タブにメッセージを送り、リッスンされたときに有効化します
function update(tabId) {
  chrome.tabs.sendMessage(tabId, { message: "echo" }).then((response) => {
    chrome.action.enable();
    chrome.action.setIcon({ path: "icon_16x16.png" });
  }).catch((error) => {
    chrome.action.disable();
    chrome.action.setIcon({ path: "icon-gray_16x16.png" });
  });
}

// タブがアクティブになったとき
chrome.tabs.onActivated.addListener((activeInfo) => {
  update(activeInfo.tabId);
});

// タブか更新された（ページ遷移した）とき
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
  if (changeInfo.status === "complete") {
    update(tabId);
  }
});

// ウィンドウがアクティブになったとき
chrome.windows.onFocusChanged.addListener((windowId) => {
  if (windowId === chrome.windows.WINDOW_ID_NONE) {
    return;
  }
  chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
    update(tabs[0].id);
  });
});
```

```javascript:content-script.js
// リッスンするイベントを登録、聴くだけ
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) { });
```
Amazon Q network troubleshootingを使ってネットワークトラブル対応してみた

# 1.Amazon Q network troubleshootingとは
Amazon Q network troubleshootingは、Amazon VPC Reachability Analyzer と連携する Amazon Q の機能です。AWS アカウント内のネットワーク層リソース間の通信におけるトラブルシューティングを行ってくれます。
2024年2月現在プレビューリリース中で、バージニア北部リージョンで利用可能です。対応言語は英語のみとなります。
また、1日に20回まで質問可能という制約があり、24時間ごとにリセットされます。

以下のリソース間のネットワークトラフィック制御を分析できます。
&emsp;・EC2
&emsp;・RDS
&emsp;・Auto scaling group
&emsp;・Elastic network interface
&emsp;・Internet gateway
&emsp;・NAT gateway
&emsp;・Transit gateway
&emsp;・Virtual private gateway
&emsp;・VPC
&emsp;・VPC endpoint
&emsp;・VPC peering 

# 2.実際にトラブルシューティングしてみた
今回は以下のネットワーク構成でパブリックサブネットに作成したEC2へ外部端末からRDP接続を行います。

　　　　<img src ="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/ce547e28-d447-5f81-d13e-a613af0476ad.png" width=70%>

以下の3つの接続不可パターンに対してAmazon Q network troubleshootingがどのような返答をするか検証してみます。

①パブリックIPアドレス(EIP)をEC2にアタッチしていない
②ルートテーブルにインターネットゲートウェイ向きのルートなし
③セキュリティグループのインバウンドルールで外部端末GIP許可設定なし


### ①パブリックIPアドレス(EIP)をEC2にアタッチしていない
まずAWSコンソールログイン後右上にある正六角形アイコンを押し、AmazonQを開きます。昨年のAWS re:InventでAmazon Qが発表されて以降このアイコンが追加されました。

![amazonq開くためのキャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/769fc955-8559-a8c6-175f-5c83c88ce9a1.png)

こちらを押すとAmazon Qへ質問を入力する画面が出るので、EC2に対してインターネット経由でアクセス不可の旨を入力します。ネットワーク問題のためプレビュー中のAWS Q for Reachability Analyzerへ誘導されます。

　　　　　　![amazon q public IP外した版の書道キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/e568ec55-09c9-62f1-654a-f1ac699f1c8e.png)


以下がAmazon Qの回答の日本語訳と実際の画面キャプチャとなります。翻訳精度の都合のため不自然な日本語ではありますが、パブリックIP付与に触れており直接的な原因を示唆してくれています。

Amazon Q 回答 | 
|:------------------|
|送信先アドレスが機能状態のアタッチメントを持つ VPC vpc-×× 内のネットワークインターフェイスのパブリック IP でない場合、インターネットゲートウェイ igw-××はパブリックインターネットからのインバウンドトラフィックを受け入れることができません。IPv4 パブリック IP アドレスを送信先に追加し、または編集するには、Elastic IP address。|

![amazon q public IP外した版の分析キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/c0e12ff2-4933-bc36-8adb-cc484e892463.png)

### ②ルートテーブルにインターネットゲートウェイ向きのルートなし

EC2配置サブネットに紐づくルートテーブルに接続元端末GIPネクストホップ:インターネットゲートウェイのルートがない場合です。
IGWへのルートが該当ルートテーブルにないことをAmazon Qが回答しています。

Amazon Q 回答 | 
|:------------------|
|ルートテーブル rtb-××には igw-×× への適切なルートがありません。rtb-××。|

![IGWへのルートをはずした版の分析キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/a86d9bfe-9931-7d01-46e5-d6393fa291d2.png)

### ③セキュリティグループのインバウンドルールで外部端末GIP許可設定なし
EC2にアタッチされているセキュリティグループのインバウンドルールで接続元端末GIP RDPを許可設定しないパターンです。
セキュリティグループのイングレスルールに問題がある旨を回答してくれています。

Amazon Q 回答 | 
|:------------------|
|次のセキュリティグループの ingress ルールはいずれも適用されません： sg-××を参照してください。|

![SGのインバウンド設定しなかったときの分析キャプチャ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3683522/3779dacd-22a1-1b00-cc8b-90253b617259.png)

3パターンの結果をみると問題となりうるリソースを的確に回答してくれました。

# 3.まとめ
Amazon Q network troubleshootingの登場でネットワーク層のトラブルシューティングがより効率的にできるようになりました。日本のリージョンでも使えるようになる、トラブルシューティングだけでなくアーキテクチャー設計から提案してくれるなど今後の更なるアップデートに期待です。
右算術シフトとかいう謎計算について

# 疑問

以下は応用情報の離散数学を勉強していたときの私の心中です

- 左論理シフトは空いたスペースに0を入れます→わかる
- 右論理シフトは空いたスペースに0を入れます→わかる
- 左算術シフトは空いたスペースに0を入れます→まあわかる
- 右算術シフトは空いたスペースを符号ビットで埋めます→いやなんで？？？？？

この疑問に答えてくれる記事が思ったより少なかったので、自分なりにたどり着いた結論と、それに納得できない人のための数式的な説明を書いた記事です。

論理シフト・算術シフトのやり方自体については記事がたくさんあるので、1つわかりやすそうなリンクを貼っておきます。
https://itmanabi.com/shift-operation/

# たどり着いた結論
結論としては、算術シフトとは「2の補数表現の数を2倍したり1/2倍したときの挙動に名前をつけた」だけのものです。

なんともつまらない結論ですが、算術シフトが理解できなかったのは、ただ単に2の補数についての理解が足りていないだけ、というお話でした。

以下、2の補数についての具体的な計算をしてみた後、ではなんで2の補数はそのような挙動をするのか？という部分について数式的に掘り下げてみます。

# 2の補数の計算具体例

具体的に、8ビットの中で-28÷2=-14という演算を考えてみます。以下、2進数を$(n)_2$で表します。

まず、$28 = (00011100)_2$と表せます。この2の補数は、以下の2通りの方法で計算できます。

## 1. 定義どおりの方法

2の補数の定義は「足してちょうど位が1繰り上がった数になる数」でした。

今回の場合は8桁で考えているので、足してちょうど9桁の$(100000000)_2$になる数を考えたら良いわけです。

つまり逆に引き算をすればよく、答えは以下の通りになります。
```math
(100000000)_2 - (00011100)_2 = (11100100)_2
```

## 2. 便利な計算方法

よく紹介されている計算が楽な方法です。$(00011100)_2$のビットをすべて反転させて1を足します。
反転させると$(11100011)_2$になるので、答えは以下のようになります。

```math
(11100011)_2 + 1 = (11100100)_2
```

こっちの方法の方が圧倒的に楽ですね！普段の計算ではこちらを使用するのが良さそうですが、実は1番の方法も後で必要になってくるのでここで2通りの方法を紹介しました。

## -28÷2=-14に戻る

以上の計算より、-28を2の補数表現で表すと$(11100100)_2$となります。
同様に、-14を2の補数表現で表すと$(11110010)_2$となります(計算略)

両者を見比べてみると、確かに「-28を右に1つシフトして、空いたスペースを符号ビット(今回は1)で埋めたもの」が-14になっていることが確認できます。

右算術シフトを理解できない場合は、まずはこの計算を手計算で追ってみて、実際に感覚をつかんでみるのが手っ取り早いというのが結論になります。

「え、ここまで長々書いておいて結論それだけ？」と思う方もいると思うので最後に数式的な説明をします。
全く厳密なものではないのでその点だけご了承ください。

# 右算術シフトの計算の数式的説明

以下、-28を右に1つシフトして、空いたスペースを符号ビット(今回は1)で埋めたものが-14になる理由を数式的に説明します。

まず、28の補数を$x$, 14の補数を$y$とします。$x, y$は28, 14を用いて次のように表せます。
ここで、先ほどの「1. 定義どおりの方法」を用いています。

```math
x = (100000000)_2 - (00011100)_2 = 256 - 28
```
```math
y = (100000000)_2 - (00001110)_2 = 256 - 14
```

ここで、28=14×2という関係を用いて28, 14を消去すると以下の関係式を得ます。
```math
y = \dfrac{1}{2}x + 128 = \dfrac{1}{2}x + (10000000)_2
```

この数式の解釈は以下の通りです。

- 第一項$\dfrac{1}{2}x$は「右に1つシフトする操作」を表しています
- 第二項$(10000000)_2$は「空いたスペースを符号ビット(今回は1)で埋める操作」を表しています

この結果は、28と14でなくとも、8ビットでなく$n$ビットで考えたとしても一般に成り立ちます。

## 左算術シフトについてもやってみよう

「左算術シフトは空いたスペースに0を入れます」→これに関しても同様に説明できます。
8ビットの中での28×2=56という演算を例に説明してみます。

28の補数を$x$, 56の補数を$z$とします。$x, z$は28, 56を用いて次のように表せます。

```math
x = (100000000)_2 - (00011100)_2 = 256 - 28
```
```math
z = (100000000)_2 - (00011100)_2 = 256 - 56
```

56=28×2という関係を用いて28, 56を消去すると以下の関係式を得ます。
```math
z = 2x - 256 = 2x - (100000000)_2
```

この式の解釈は以下の通りです。

- 第一項$2x$は、「左に1つシフトする操作」を表しています
- 第二項$-(100000000)_2$は、「左シフトによってはみ出た部分を捨てる操作」に対応します

上記の2操作のみしか行わないので、空いたスペースには0を入れる必要があります(+0をするとも言い換えられるかもしれません)。

この結果ももちろん一般に成り立ちます。

# 最後に

算術シフトなんてなかった。2の補数の計算をしっかりしよう。
あと数式はやっぱり偉大だった。
wslでelixir その132

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
ハッカソンなので、windows11にubuntu22.04入れてみた。

# 手順

# Microsoft Storeでubuntuを検索して、「ubuntu 22.04.3 lts」をインストール。

# 早速エラー

```
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80370102
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
For information please visit https://aka.ms/enablevirtualization
Press any key to continue...


```

# 対策

- Windowsの機能の有効化
スタートメニュー、「Windows tools」から「コントロールパネル」を起動して
「プログラム」をクリックして、「Windowsの機能の有効化または無効化」をクリックし
「仮想マシンプラットフォーム」にチェックを入れて、OKをクリック。
- Windows再起動する。

# asdfをインストールする。

```
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
```

# asdfを起動する。

```
$ . "$HOME/.asdf/asdf.sh"
```
# erlangとelixirをインストールする。

- Plug-inを追加する。

```
asdf plugin add erlang
asdf plugin add elixir
```

- インストールできるバージョン。

```
asdf list-all erlang
asdf list-all elixir
```
- 最新版を指定してインストール。

```
asdf install erlang latest
asdf install elixir latest
```
- global設定。

```
asdf global elixir 1.16.1-otp-26
asdf global erlang 26.2.1
```

- バージョン確認。

```
$ asdf current
elixir          1.16.1-otp-26   /home/ore/.tool-versions
erlang          26.2.1          /home/ore/.tool-versions

$ elixir --version
Erlang/OTP 26 [erts-14.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Elixir 1.16.1 (compiled with Erlang/OTP 26)

$ iex --version
IEx 1.16.1 (compiled with Erlang/OTP 26)

$ mix --version
Erlang/OTP 26 [erts-14.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Mix 1.16.1 (compiled with Erlang/OTP 26)

```

以上。
【実装メモ】宣言の共通化（Interface活用）

# はじめに
仕事でどうやって実装すればいい？と相談いただいたので、概要と解決策を紹介します。
紹介コードはC#を用いていますが、説明自体は言語に依存しないようにしました。

# 問題
下記をどう実装するのがよい？？
- 実装対象が複数、共通部分とそれぞれ個別部分が存在
- 将来的に、対象が増える可能性あり
- 実装対象をいくつか同時に操作したい

## 問題例
- 実装対象 エクレア、シュークリーム、今後カスタードロールも作る
- それぞれ作って食べる
- 作り方、食べ方は個別に実装
- まとめて食べたい


# 解決策
共通部分：interface
``` C#
// foodでもいいが、ここではあえてお菓子とした。
// お菓子以外を実装する時に改名するか、別のinterfaceを作るか検討する方針。
interface ISweets
{
  void create();
  void eat();
}
```
個別部分：interfaceを継承したクラス
``` C#
class ecrea : ISweets
{
  void create()
  {
     // エクレアの作成工程
  }

  void eat()
  {
     // エクレアの食べ方
  }
}

class creamPuff : ISweets
{
  void create()
  {
     // シュークリームの作成工程
  }

  void eat()
  {
     // シュークリームの食べ方
  }
}
```

まとめて食べる
``` C#
void eatAll(ISweets[] sweets)
{
  foreach (var sweet in sweets)
  {
    sweet.eat();
  }
}
```


## 備考
- interfaceじゃなくて基底クラスじゃダメか？カスタードの共通化も楽になるのでは？

今後カスタードのお菓子のみなら、それでも良い
カスタード以外を使う場合などは、宣言と実装を分離した方が汎用性が高い

実装を含んだ継承は、意図しない継承、名前と乖離した継承Liskovの置換原則違反の時に解決が難しくなりやすい
そもそも違反するな、ですが

- 「カスタードを作る部分をまとめたい」のような、実装をまとめる話はまた別記事で紹介。
    キーワード：strategyパターン


interface、どんどん使っていきましょう！
「現代数理統計学の基礎」演習問題解法メモ　第5章問6～11

問9(2)は計算が大変です。問10は正規分布ではないことに注意です。
問11は各確率変数が独立ではないことに注意です。
![第5章問6　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d14197d3-5a5a-07c8-fca5-85810f8d3073.jpeg)
![第5章問6　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/645d6c1a-4af7-a534-ff2e-5d7d9970e865.jpeg)
![第5章問7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/368f7c4c-fa3b-f56a-7968-5474895ba62a.jpeg)
![第5章問8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/b71706d7-970c-61a4-9a17-08f4c3ec9491.jpeg)
![第5章問9　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/c6351581-ad7d-baa7-20f1-729df1809014.jpeg)
![第5章問9　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/467237ea-2071-74d1-0842-6427cfc6d338.jpeg)
![第5章問10  P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/651b644f-1d34-6013-3ac2-c27303c396e6.jpeg)
![第5章問10　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/485e7912-ef6c-6b32-9400-083d596cebf5.jpeg)
![第5章問10 P3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/fd8ec288-c8dd-e47c-663a-9af8e7875f27.jpeg)
![第5章問11　P1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/0e13e047-030d-451a-e721-6ba5ac02c27d.jpeg)
![第5章問11　P2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3576811/d7738171-c4fa-3b81-45cc-0d025bfe8e10.jpeg)
WSL2:Raspberry Pi Pico向けTOPPERS/FMP3のビルド

## WSL2での構築
ホストOS:Windows10 22H2(19045.3930)
```
wsl.exe --install Ubuntu-20.04
```
※configure.rbにおいてruby2.7が必要だが、Ubuntu 22は、3.0なので不適。
rubyの入れ替えは手順が煩雑なので回避した。

・Ubuntuのパッケージを最新にアップデート。以下のパッケージを追加
```
sudo apt-get update
sudo apt-get install g++ openssh-server ruby unzip make gcc-multilib
```
## ビルド
以下のページで「手順」の記述に従う。
VirtualBox:Raspberry Pi Pico向けTOPPERS/FMP3のビルド
https://qiita.com/2hobata/items/a7fee42304f1555fbca6

## ビルド後の作業
Raspberry Pi Pico上でTOPPERS/FMP3をデバッグ
https://qiita.com/2hobata/items/351e8a8a75f544ba0807

## 「ドライバ欲しい」という俗人的なwant
下記の pdic/rp2040に流用できそうなコードがあるので、さくっとパクる。
TOPPERS BASE PLAFORM(ST/RV/RP)
https://www.toppers.jp/download.cgi/asp_baseplatformv1.4.5_012024.tar.gz
How to delete multiple metadatas By destructiveChanges.xml in Vscode

**Merit of deleting metadata using destructiveChanges.xml：**
①Multiple metadata can be deleted at once。
**The way of deleting metadata using destructiveChanges.xml：**
①Create a folder on vscode and name it
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/b05f0f0a-4339-2691-f3c9-dee15cd77367.png)

②Create the following two files in the folder
a.package.xml
```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<version>58.0</version>
</Package>
```
b.destructiveChanges.xml
```
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
<types>
<members>「Metadata name to delete」</members>
<name>「Type of metadata to delete、ex：Layout」</name>
</types>
<version>58.0</version>
</Package>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/21153e1c-b76d-9406-20dd-2217cf949175.png)


③Run the below command in terminal
sfdx force:mdapi:deploy --deploydir=「⓵'s name」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330192/a27a433e-7f27-8314-9d2b-e543b5688fc0.png)
[CAIレシピ] プロセスIDの取得と、アプリケーション統合コンソールとの突き合わせ

## はじめに
CAIプロセスの実行結果は、アプリケーション統合コンソールの画面から確認できます。CAIプロセスは同時に実行される場合も想定されるため、実行結果の特定方法を理解しておくと問題発生時のトラブルシューティングが円滑になります。

この記事では次のポイントを説明しています。

- __実行した CAIプロセス__ と __アプリケーション統合コンソール__ との突き合わせ方法

なお、この記事は次の記事の内容を理解していることを前提としています。

- [はじめてCAIを使う際に](https://qiita.com/shunsuzu/private/12b8dbd08a30efa0003a)
- [プロセスの作成と実行(匿名認証と基本認証)](https://qiita.com/shunsuzu/private/01d91caedb92bd7781ea)
- [割り当てステップと、各種変数フィールドの利用](https://qiita.com/shunsuzu/private/fae696539cd245828848)




## 実行したCAIプロセスと、アプリケーション統合コンソールとの突き合わせ方法

__実行した CAIプロセス__ と __アプリケーション統合コンソール__ の突き合わせはCAIプロセスの __プロセスID__(`RunIDやInstanceIDと記載されることもあります`)を利用します。

### CAIプロセス呼び出し元でプロセスIDを確認する

__実行した CAIプロセス__ からプロセスIDを確認するには次の2つの方法があります。

- レスポンスヘッダーを利用する
- レスポンスボディにプロセスIDを含める


##### レスポンスヘッダーから確認する

CAIプロセスを実行するとレスポンスヘッダーとして __x-instanceid__ を取得できます。このヘッダー値がプロセスIDに該当します。例として、curlコマンドにてレスポンスヘッダーを確認するには __--head__ オプションを指定します(この例ではプロセスIDは`938671131123617792`)。

```:curlコマンドによるレスポンスヘッダーの確認
$ curl --head -u username:password https://<IICS・CAIサーバー>/active-bpel/rt/recipe-pcb-HelloWorld

HTTP/2 200
date: Sun, 04 Feb 2024 05:43:57 GMT
content-type: application/json;charset=utf-8
cache-control: private
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
strict-transport-security: max-age=31536000; includeSubDomains; preload
x-frame-options: SAMEORIGIN
x-instanceid: 938671131123617792 <--- ★★★プロセスID★★★
vary: accept-encoding
x-envoy-upstream-service-time: 414
server: istio-envoy
```



##### レスポンスボディにCAIプロセスのIDを含める

次のような場合、レスポンスボディからCAIプロセスのIDを取得する方針も有効でしょう。
- CAIプロセス呼び出し元の制約によりレスポンスヘッダーを参照できない
- レスポンスボディにCAIのプロセスIDを含める方が実装を容易に進められる

次の手順では、レスポンスボディにCAIプロセスのIDを含めるCAIプロセスを作成しています。

1. 出力フィールド __output__ を __タイプ=テキスト__ として定義します。
1. 割り当てステップを追加して、出力フィールド __output__ に __計算式__ として `util:getProcessId()` を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/7d117afa-c133-7447-a0fe-5aba7334cd7d.png)



### アプリケーション統合コンソールの画面からプロセスIDを確認する
アプリケーション統合コンソールの画面からプロセスIDを確認するには、次の手順で操作します。

1. IICSにログインします。
1. __アプリケーション統合コンソール__ ページを開いて、 __プロセス__ タブに切り替えます。
1. ドロップダウンリストからデプロイ先の環境を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074553/6da066e7-f13f-c6c6-0108-04541e8a69a7.png)

この例で確認したプロセスIDは __938671131123617792__ です。[CAIプロセス呼び出し元でプロセスIDを確認する](#caiプロセス呼び出し元でプロセスidを確認する)で確認していたプロセスIDの値と一致していることが確認できます。

アプリケーション統合コンソールの画面を利用したCAIプロセスのデバッグ方法については[デバッグのためのログレベル](https://qiita.com/shunsuzu/private/539f687049ab67444209)に詳細を記載しています。




## 参照

- [Qiita - IICS CAIの実装レシピ - マスターページ](https://qiita.com/shunsuzu/private/3d1971ef6e3b993516aa)
基盤エンジニアがペアプログラミングを実践してみた

# ペアプログラミングをやってみたい！！！
暇な時にQiitaを眺めるようになって1年ほど。眺めていると、世のエンジニアはみんな**流行最先端の技術**と**流行最先端のプラクティス**をバリバリのバリに使って日々の業務を遂行しているような錯覚に襲われます。
##### 俺もそれ、やりたーーーーーーーい！！！

# shellを教える機会が訪れた！
> 上司「この業務、shell使って効率化したいよね」
私「そっすね（はいわかりました作ればいいんでしょ）」
上司「後輩くんにshell教えられない？作ってもらおう」
私「それは名案ですね！教えられます！」

かくして、私はペアプログラミングを実践する機会を手に入れたのでした。

# 登場人物
私：Linux歴2年、日々Linuxに触れてるのでちょっといじれる。shell芸は出来ない。3年間Javaを書いていたのでコーディングは好き。
後輩：多少Linuxにコマンド打ったりはする。shell初めて書きます。

# 計画
ざっくり見積もったところ、まあ4時間もあれば終わるだろうと感じられました。
1時間枠を週2回目、2週間で計4時間を業務の隙間時間で確保して進めることに。私作のプロトタイプのshellもあるしいけるでしょう、という予測でした。

以下の資料によると今回は「相手が初心者の場合」に該当するため、基本的には私がナビゲータとして付きっきりで行いました。

https://qiita.com/kanatatsu64/items/3f04d0116e22392efaca

# 1時間目
まずは設計内容の紹介。
30分ほどでざっくりと話した後、とりあえず書いてもらおうということで早速ペアプログラミングを始めました。

…これshellの基本から教えてたらペアプログラミングにならないな！ということに気がつき、LinuC1の参考書を渡し、shellの章だけでも一読してくるように指示。


# 2時間目
前回の反省を踏まえ、どうしたら進めやすいかを考え、以下のような準備をしました。
- 設計書をちゃんと書く
    - 個人用のツールだし、と、ざっくりおおまかな処理しか書いていなかった設計書を清書しました。
    →設計書通りに書けばいい、余計なことを考えなくて良いという心理的な安心感の確保
    - プロトタイプのshellを見返し、当時の自分が何を思って書いたコードなのかを思い出しておく。
    →指導するときにコードの意図を正しく伝えられるように

前回指示した参考書を読んでいなかったので、主に使用する処理（if,whileくらいです）を簡単に説明。

> 私「ソースは日本語にしたらわかりやすいよ、if [条件] ;then なら、もし(if)条件が真ならその時(then)～みたいな。じゃあwhile文はどう？」

改めてペアプログラミングを開始。
設計書の内容を基に、1メソッドずつ進めていきます。
設計書の記載を詳細化しておいたおかげで、指導される側としても、「今書いている処理は全体のどこの処理なのか」を把握しやすくなっていたようです。全体の6割ほどを完了。

# 3時間目
引き続きペアプログラミング。
2時間目の翌日だったこともあり、だいぶ前回話したことを覚えていてくれていました。すでに教えたコマンドや処理がほとんどだったので、これまでよりスムーズに進んだ印象。予想より早く、３時間で完成しました。
変数名の命名で引っかかっていたので私の考えを説明。
> 私「命名規約とかないから意味がわかればほんとになんでもいいよ。自分ならこう付ける、っていう名前にしてみよう。ただローマ字でtaisyouserverみたいなのはやめてね。」

後輩のほうから、「じゃあここの処理ってこう書いたらいいんですかね？」と自分で進めてくれたときが一番嬉しかったです。


# よかったこと・うれしかったこと
**1.自分の書いたソースの汚さに気が付いた**
設計書もまともに書かずに作り始めたツールなので、要らない変数が残っていたり、無駄な処理が入っていたり…。ソースを見返したことで簡単なリファクタリングが出来ました。
大したツールではないので処理が早くなったとかもないのですが、やはりソースは綺麗なほうが気持ちいい。

**2.褒めて→指摘して→考えさせる　の流れは自然に出来た**
大学生の時に個別指導の講師をしていた時から意識していたこと。
まず褒める：どこまでは合っていたのか
指摘する：どこで間違ったから正解できなかったのか
類題を考えさせる：指摘したことを踏まえて、似た処理を書かせる

**3.基本的なコマンドや処理は覚えてもらえた~~様子~~**
コマンドのオプションなど細かい部分が覚えられていなかったのですが、ペアプログラミングを通して多少身につけてもらえたみたい。

# 気が付いたこと・反省点
**1. 教えられるほどの知識が備わっていない部分がある**
出来ると指導出来るには大きな差があると痛感しました。

**2. 思ってたより教える力が落ちていた**
   大学生のときは個別指導の講師をしていたのでペアプログラミング的な形式の指導には自信があったが、当時の感覚がすっかり抜けていました。
様子を見ていた上司から **「なにを教えたかじゃなく、なにを理解してもらえたかだぞ」** とお言葉。

**3.プロトタイプが丁寧すぎた**
プロトタイプとしたshellは別環境で動作実績のあるものだったため、極論切り貼りで完成してしまうのでした。最初から書いてもらうという経験をあまりさせてあげられなかったのは反省点。


# 余談
先日、個別指導の講師バイト仲間と飲んだ時のこと。
> 私「後輩指導の時とか完全にバイトモードになってる、小学生相手してる話し方になるんだけど」
バイト仲間A「すごいわかる」
バイト仲間B「『あ！いいね正解！じゃあ次同じ風に考えたらどうなるかな』とか言うわ」
バイト仲間A「とりあえず褒めから入るよね」
私「病気だ…」
Reactでポケモン図鑑を作成する(Step1:API通信)

## はじめに
Reactでポケモン図鑑を作成します。
まずは、基本的なコンポーネントを作るところから入ろうと思います。

### 成果物
![スクリーンショット 2024-02-04 14.36.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/8d4ac1a8-0df1-00ad-6692-80915abb79bb.png)

https://github.com/kouji0705/react_pokemon/tree/feat/initial

## ソースコード
```shell:ディレクトリ一覧
~/develop/react/react_pokemon (feat/initial)$ tree -I node_modules 
.
├── README.md
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   ├── manifest.json
│   └── robots.txt
├── src
│   ├── App.tsx
│   ├── api
│   │   └── pokemon
│   │       └── api.ts
│   ├── common
│   │   └── common.ts
│   ├── components
│   │   └── PokemonComponent.tsx
│   ├── index.tsx
│   └── logo.svg
├── tsconfig.json
└── yarn.lock

7 directories, 16 files
```

```tsx:src/index.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

// QueryClient インスタンスの作成
const queryClient = new QueryClient();

const root = ReactDOM.createRoot(
  document.getElementById('root') as HTMLElement
);
root.render(
  <React.StrictMode>
    <QueryClientProvider client={queryClient}>
      <App />
    </QueryClientProvider>
  </React.StrictMode>
);
```
:::note info
ここではTanstackQueryのProviderを定義します。
:::

```tsx:src/App.tsx
import React from 'react';
import PokemonComponent from './components/PokemonComponent';

function App() {
  return (
    <div>
      <h1>ポケモン表示</h1>
      <PokemonComponent />
    </div>
  );
}

export default App;

```

```tsx:src/components/PokemonComponent.tsx
import React from 'react';
import { usePokemon } from '../api/pokemon/api';
import { isNullish } from '../common/common';

const PokemonComponent: React.FC = () => {
  const { data, error, isLoading } = usePokemon('pikachu');

  if (isLoading || isNullish(data)) return <div>Loading...</div>;
  if (error) return <div>Error: {error.message}</div>;

  return (
    <div>
      <h2>{data.name}</h2>
      <p>身長: {data.height}</p>
      <p>体重: {data.weight}</p>
      {data.sprites.front_default ? (
        <img src={data.sprites.front_default} alt={data.name} />
      ) : (
        <div>画像がありません</div>
      )}
    </div>
  );
};

export default PokemonComponent;
```

```tsx:src/api/pokemon/api.ts
import { Pokemon } from '@bgoff1/pokeapi-types';
import { UseQueryResult, useQuery } from '@tanstack/react-query';
import axios from 'axios';

export const getPokemon = async (name: string): Promise<Pokemon> => {
  const response = await axios.get<Pokemon>(
    `https://pokeapi.co/api/v2/pokemon/${name}`
  );
  return response.data;
};

// ポケモンデータを取得するカスタムフック
export const usePokemon = (name: string): UseQueryResult<Pokemon, Error> => {
  return useQuery<Pokemon, Error>({
    queryKey: ['pokemon', name],
    queryFn: () => getPokemon(name),
  });
};

```

```ts:src/common/common.ts
export const isNullish = <T>(
  value: T | null | undefined
): value is null | undefined => {
  return value === null || value === undefined;
};
```

## 最後に
今回は基盤を整理する事が目的だったので、基本的な事しかやっていません。
次は、検索等を追加していこうと思います。
【PowerShell】Invoke-WebRequest の使い方

## はじめに

`Invoke-WebRequest` を使った API 呼び出しの利用方法を備忘録として記載。

## 実行環境

- macOS Sonoma 14.3
- PowerShell 7.3.1

## 使い方

```powershell
Invoke-WebRequest [-Uri] <Uri> [-Method <WebRequestMethod>]
```

オプションは色々とあるみたいですが、今回も `-Uri` と `-Method` のみ指定して実行します。
（仕事で利用したときは、認証トークンを渡すために -Headers も利用してました。

https://learn.microsoft.com/ja-jp/powershell/module/microsoft.powershell.utility/invoke-webrequest?view=powershell-7.4


## 実行に使ってみる

今回も PokeAPI から 推しポケモンのエーフィの情報を取得してみます。

#### 実行コマンド

```powershell
Invoke-WebRequest -Method GET -Uri https://pokeapi.co/api/v2/pokemon/espeon
```

#### 実行結果

```
StatusCode        : 200
StatusDescription : OK
Content           : {"abilities":[{"ability":{"name":"synchronize","url":"https
                    ://pokeapi.co/api/v2/ability/28/"},"is_hidden":false,"slot"
                    :1},{"ability":{"name":"magic-bounce","url":"https://pokeap
                    i.co/api/v2/ability/156…
RawContent        : HTTP/1.1 200 OK
                    Date: Sun, 04 Feb 2024 05:14:22 GMT
                    Transfer-Encoding: chunked
                    Connection: keep-alive
                    Access-Control-Allow-Origin: *
                    Cache-Control: public, max-age=86400, s-maxage=86400
                    ETag: W/"373b1…
Headers           : {[Date, System.String[]], [Transfer-Encoding, System.String
                    []], [Connection, System.String[]], [Access-Control-Allow-O
                    rigin, System.String[]]…}
Images            : {}
InputFields       : {}
Links             : {}
RawContentLength  : 226225
RelationLink      : {}
```

## Invoke-RestMethod と Invoke-WebRequest の違い

前回書いた `Invoke-RestMethod` との違いについてですが、下記記事に記載がありました。

（ありがとうございます。）

結論としては、

Content の中身だけを使いたい場合 = `Invoke-RestMethod` 
StatusCoke  など、Content  以外の情報も使いたい場合 = `Invoke-WebRequest` 

https://qiita.com/startPG/items/7b37c527667fa43ab173#:~:text=結論：出力方法が違うため、向き不向きがある,-参考にした&text=Invoke-RestMethodはXMLと,のが優れています%E3%80%82


## さいごに

今回は、PowerShellで `Invoke-WebRequest` を使った API 呼びだしを記事にしてみました。
誰かの役に立てば幸いです。
【SwiftUI】iPhoneでSectionの折りたたみ(.sidebar)を使ってみたら

## 環境

 - Xcode Version 15.2
 - iOS 17.2
 - SwiftUI 

## 問題

従来、Sectionの折りたたみを実装したい場合は以下のように、
```OldListExample.swift
import SwiftUI

struct ContentView: View {

    let monbetsuGun = ["湧別町", "遠軽町", "滝上町", "興部町", "西興部村", "雄武町"]
    
    var body: some View {
        List {
            Section {
                ForEach(monbetsuGun, id: \.self) { name in
                    Text(name)
                }
            } header: {
                 Text("紋別郡")
                    .font(.largeTitle)
                    .padding(.top)
            } footer: {
                Text("遠軽町にはでっかい岩がある")
            }
        }
        .listStyle(.sidebar)
    }
}

#Preview {
    ContentView()
}
```
とSectionに対して`.listStyle(.sidebar)`をつけるだけで簡単に実装できました。**しかし今はこの方法が使えないようになってます。**
![Simulator Screenshot - iPhone 15 Pro - 2024-02-04 at 14.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688344/002fae01-dece-b397-4547-d06536f40d3d.png)


## 解決策

代わりに、Appleによって`init(isExpanded:content:header:)`が新しく提案されています。これに対して`.listStyle(.sidebar)`を適応することで折りたたみと展開が実装可能です。

```diff_swift:NewListExample.swift
import SwiftUI

struct ContentView: View {

    let monbetsuGun = ["湧別町", "遠軽町", "滝上町", "興部町", "西興部村", "雄武町"]
+ 
+   @State var isExpanded: Bool = false

    var body: some View {
        List {
-           Section {
+           Section(isExpanded: $isExpanded) {
                ForEach(monbetsuGun, id: \.self) { name in
                    Text(name)
                }
            } header: {
                 Text("紋別郡")
                    .font(.largeTitle)
                    .padding(.top)
-           } footer: {
-               Text("遠軽町にはでっかい岩がある")
-           }
        }
        .listStyle(.sidebar)
    }
}

#Preview {
    ContentView()
}
```
![Simulator Screenshot - iPhone 15 Pro - 2024-02-04 at 14.27.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688344/bc04e307-89c5-c8c7-7080-7274e97410b6.png)
![Simulator Screenshot - iPhone 15 Pro - 2024-02-04 at 14.27.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688344/f9cccd69-e739-9c3b-111f-eb36c0c9d298.png)

## 問題点

ワイ「え？！Footerは？！Footerはどこ？！」
Apple「ないで」
![スクリーンショット 2024-02-04 14.08.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3688344/4638c80c-d5fc-96a3-f0cb-2cfebed3f9be.png)

Footer、お前何やらかしたんや。

どうやったらFooterって実装できるんですかね。わかる方教えてください。

## 参考

https://developer.apple.com/documentation/swiftui/section/init(isexpanded:content:header:)-561d7?changes=_3

https://developer.apple.com/documentation/swiftui/section#controlling-collapsibility
Reactでのイベント，スタイルの扱い方

# はじめに
Reactでのイベント，スタイルの扱い方を学んだので，アウトプットしていきます．

# イベント
* Reactで，HTMLタグ内にイベントやCSSを書くときは，キャメルケース（小文字始まり，つなぎ文字のはじめを大文字）を使用する．例えば`onClick`．
* イベントには，JavaScriptの関数を指定できる．
* HTMLタグの中でJavaScriptを書くときは，`{}`で囲って，JavaScriptということを明示する必要がある．
```react:例
export const App = () => {
  return <button onClick={alert()}>ボタン</button>;
};
```

# スタイル
* ReactでHTMLにスタイルを当てる場合，タグ内に`style={}`のように書く．`{}`部分に，JavaScriptのオブジェクトとしてCSSを記述する．
* JavaScriptのオブジェクトであるため，`font-size`のような`-`付きのプロパティは許容されていない．`fontSize`のように，キャメルケースを使用する．
* オブジェクトの値であるため，`color : red`のように，そのまま文字列を割り当てることはできない．`color : 'red'`と記述する．
```react:例
export const App = () => {
  return <h1 style={{ fontSize: "18px" }}>こんにちは</h1>;
};
```
古いNEC UNIVERGE IXシリーズのルーターの電池交換をケチる

NECのIXシリーズは高機能で性能もよく、ヤフオクなどで中古品を買われる方も多いかと思います。
しかし、中古で購入した場合にALMランプが点灯していて、起動時に`NVRAM TEST: Fail`が表示されている機種がまれによくあります。

このようになる原因の多くが、(多分)内部のICのデータを保持するための電池が少なくなっている場合に発生するようです。

しかし、その電池はAmazonなどで入手できるとはいえ、1000円〜と地味にいい値段がします。(M4T28-BR12SH1とかSNAPHATで検索すると見つかります)
私の場合もヤフオクで500円で買ったIX2005で電池が切れていたのですが本体より高い電池を買うことに抵抗があったため、どうにかならないかと試した結果うまく行ったので、備忘録として残します。

# 結論

先に結論から書くと、3Vのコイン形リチウム電池を繋げば`NVRAM TEST: Pass`になりました。

![IMG_0628.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206013/73833f7d-b816-9c12-8e3e-d6499b52734b.jpeg)


# 使われている電池について
新しいIXシリーズはまた違うらしいですが、IX2005やIX2105など古い機種には`M4T28-BR12SH1`が使われています。

黄色い部分
![IMG_0620.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206013/ef9290b8-bc38-f0da-f940-ac1fdd478612.jpeg)


これについて検索すると、データシートが手に入るのですが、内部的には片側の2本には水晶発信子でもう片側には電池が接続されて2.8Vが供給されているような図や表が書かれています。
また、下の方の表を見ると「BR1225, 3 V, 48 mAh」の記述もあり、BR1225について調べるとただのコイン型リチウム電池であることがわかります。
https://www.st.com/ja/clocks-and-timers/m4t28-br12sh.html

つまり、片側の端子にコイン型リチウム電池をつなぎさえすれば、使えそうな感じがしてきます。

# 電池をつなぐ
本当はM4T28-BR12SH1を分解して電池だけ交換すればいいのでしょうけれど、これを分解するのはちょっと無理そうでした。
そこで、端子部分にリード線をつなぎ、外側から電源を供給する作戦にします。

データシート通りにBR1225を使えばいいのですが、電子工作でよく使われるCR2032のほうが入手性もよく、電池BOXもAmazonでたくさんあって選べるので今回はCR2032を使うことにします。容量も多いですしね(※ 多分BR1225でも10年近く持つと思うので過剰な容量にはなると思います)


接続は`M4T28-BR12SH1`のpinをペンチで折り、ソケットにリード線を差し込んでカプトンテープで絶縁し、`M4T28-BR12SH1`で上から押し込む感じでうまく行きました。

![IMG_0624.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206013/2c8d4ade-2112-a69e-9f6a-01347822595b.jpeg)
![IMG_0626.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206013/4f789aea-4fef-d0be-f480-dc9f78612883.jpeg)
![IMG_0627.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206013/158d05b6-8ec3-90fb-262b-f9c7ba1fecdc.jpeg)



# 備考
電池交換してすぐはALMランプが消えず`NVRAM TEST: Fail`のままでした。
失敗したのかと思い、ntpの設定を試すなどしていたらそのうちALMランプが消え`NVRAM TEST: Pass`するようになりました。少し時間がかかるのかもしれません。

また、ネットで電池交換のやり方などを検索すると、電源をいれっぱなしにしてやらないとデータが消えることがあるなどの記述がありました。
が、私は感電のほうが怖いので電源を抜いて作業しましたが、データは消えませんでした。(自己責任)
コネクション型通信とコネクションレス型通信について

## コネクション通信とは？
電話などのように二者間で使用する通信回線を設定し、回線を確保したまま通信を行う方式で、回線交換方式が代表例。

## コネクションレス通信とは？
通信前に受信相手の状態を確認せずにデータを一方的に送り付ける方式で、パケット交換方式が代表例。


## 出題された過去問
(平成17年秋期　問53)
コネクションレス型通信の特徴として，適切なものはどれか。

ア\. 順序エラー検出やフロー制御を行うので信頼性が高い。
イ\. 送信するすべてのパケットに，あて先を示す情報を付加する 
ウ\. 常にPVCと呼ばれる接続形態が採られ，あらかじめ通信相手との通信パスを設定しておき，接続動作なしで通信を行う
エ\. 伝送される各データ単位は，すべて同じ経路を通る。

【正解と解説】
・イ
1つの物理的回線上で複数の通信が行われるため全てのパケットにあて先情報が必要です。
グリーン購入とは？

グリーン購入とは、製品やサービスを購入する際に、環境を考慮して、必要性をよく考え、環境への負荷ができるだけ少ないものを選んで購入することです。

我が国においては、2001年(平成13年)にグリーン購入法（国等による環境物品等の調達の推進等に関する法律）が施行されました。この法律は、国等の機関にグリーン購入を義務づけるとともに、地方公共団体や事業者・国民にもグリーン購入に努めることを求めています。（環境省HPより引用）