OmniAICreator/Qiita-1.07M huggingface dataset:
四足歩行ロボットのUnitree Go2をシミュレーション環境（Gazebo）でROS2で動かしてみる

# 1. はじめに
[IsaacSimで四足歩行ロボットを動かしてみる](https://qiita.com/bebebefu/items/cb45d0102069413b8300)という記事で四足歩行ロボットを動かしてみましたが、他にもシミュレーションできる四足歩行ロボットがないか調査していました。そこでUnitree Go2というロボットがROS2に対応しシミュレーションもできるということが分かりました。この記事では、そのシミュレーション環境の構築と操作方法について紹介していきたいと思います。

# 2. 実行環境
- CPU: CORE i7 7th Gen
- メモリ: 32GB
- GPU: GeForce RTX 2070
- OS: Ubuntu22.04(WSL2ではなくPCに直接インストール)
- ROS2: Humble
- Nvidia Driver: 535 

# 3. 対象としたロボット
Unitree社が出しているUnitree Go2という四足歩行ロボットはIsaac Simでもロボットモデルが提供されていたり、展示会でもよく見かけるので、今回のシミュレーションの対象としました。
そしてUnitree Go2については以下のリンクでROS2のシミュレーション環境が公開されています。今回はこれを使ってシミュレーション環境を構築しました。

https://github.com/anujjain-dev/unitree-go2-ros2?tab=readme-ov-file


# 4. 構築手順

## 4.1 リポジトリのクローン
[https://github.com/anujjain-dev/unitree-go2-ros2?tab=readme-ov-file](https://github.com/anujjain-dev/unitree-go2-ros2?tab=readme-ov-file)で紹介されている手順をそのまま実行すれば構築できましたが、一応手順を記載します。
```:terminal
mkdir -p ~/unitree-go2-ros2/src
cd ~/unitree-go2-ros2/src
git clone https://github.com/anujjain-dev/unitree-go2-ros2.git
```
**注：ファイル名はunitree-go2-ros2としていますが、ここは適当で大丈夫です。**

## 4.2 依存関係のインストールとビルド
```:terminal
sudo apt install ros-humble-gazebo-ros2-control
sudo apt install ros-humble-xacro
sudo apt install ros-humble-robot-localization
sudo apt install ros-humble-ros2-controllers
sudo apt install ros-humble-ros2-control
sudo apt install ros-humble-velodyne
sudo apt install ros-humble-velodyne-gazebo-plugins
sudo apt-get install ros-humble-velodyne-description
```
```:terminal
sudo apt install -y python3-rosdep
rosdep update
cd ~/unitree-go2-ros2
rosdep install --from-paths src --ignore-src -r -y

```
そして以下のコマンドでビルドします。
```:terminal
cd ~/unitree-go2-ros2
colcon build
```

# 5. シミュレーション結果（遠隔操作）
ビルド完了後、以下のコマンドでシミュレーション環境(Gazebo)を起動しました。
```:terminal(1)
source ~/unitree-go2-ros2/install/setup.bash
ros2 launch go2_config gazebo.launch.py rviz:=true
```

起動したときの画像が以下です。左の画面がGazeboで、右の画面がrviz2の画像です。どちらにもUnitree Go2が読み込まれている様子が確認できます。

![Screenshot from 2024-10-27 10-46-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581920/8d5f021d-320e-f954-9d2b-00305a40c411.png)

そして以下のコマンドで遠隔操作(teleop)を起動します。
```:terminal(2)
source ~/unitree-go2-ros2/install/setup.bash
ros2 run teleop_twist_keyboard teleop_twist_keyboard
```

以下が上記のコマンドで、Unitree Go2を遠隔操作した時の動画です。

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

# 6. まとめ
公開されているリポジトリを利用し、Gazebo上でUnitree Go2のシミュレーションを試行することができました。しかし、現時点では周辺環境を反映できていないことや、自律走行には対応できていないため次回以降はそれに対応していきたいと思います。
Python：Reflex：VSCodeのDevContainer内でリモートデバッグを設定

# Refexについて

Reflexは、Pythonだけでフロントエンドも作れるWebアプリ作成ライブラリです。
フロントエンドやバックエンドの実行環境がオールインワンなので開発準備がとても簡単です。

https://github.com/reflex-dev/reflex

アメリカの大手企業でも使われているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/b5896987-5d6b-009c-28af-f47d1fad1802.png)


# １．前提条件

- Poetryを利用してReflexなどのライブラリはインストール済み
- VSCodeのDevContainerは設定済み
- Reflexのプロジェクトは作成済み


# ２．デバッガの起動設定ファイルlaunch.jsonを作成

VSCodeでコンテナを起動し、コンテナ内で以下の操作を行う。

①左のデバッグメニューをクリックし、launch.jsonを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/38c20f6a-a32f-0552-c2ad-0b6307db2cde.png)

②Python Debuggerを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/576f3cf8-a97b-cd46-24e7-b059db9a7148.png)

③Moduleを選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/10e60f01-f7bf-5f4d-44ff-55822e6fec42.png)

④モジュール名に「reflex」を入力し、Enterキーを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/4b55228e-0fa2-b690-ecec-aea3832c5b6c.png)

# ３．launch.jsonファイルを編集

以下のように記載する。（一例です）



```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Reflex Debug",
            "type": "debugpy",
            "request": "launch",
            "module": "reflex",
            "cwd": "${workspaceFolder}/app",
            "args": [
                "run",
            ],
            "justMyCode": true,
            "env": {
                "PYTHONPATH":"${PYTHONPATH}:${workspaceFolder}", 
            }
        }
    ]
}

```
ポイントは以下です。

- moduleにはreflexを設定
- cwdにreflexのプロジェクトフォルダを設定
- argsにはreflexの実行コマンドを設定

上記の設定は、以下のプロジェクトフォルダ内の構成を前提としています。

appがreflexのプロジェクトフォルダです。
screenはアプリフォルダであり、screen.pyがアプリの起動ファイルです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/d8bc2f1c-f214-0f6e-ad06-511e84690fbe.png)


# ３．デバッガ実行

①左のデバッグメニューをクリックし、「Reflex Debug」を実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/765160c8-69c0-485b-b1fb-6a7dd2156807.png)

reflexアプリが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/aa630b1c-517e-8042-26fe-9474ce18433a.png)

②ブレークポイントを設定して、ブラウザからアクセスする。ブレークボイントで止まり、変数の値がダンプされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15972/6ac5fb3c-ca58-509c-6c0d-04479480935f.png)
Formを使わずSharePointユーザー列に登録・変更

PowerAppsでアプリを作っていると
Formコントロールを使わずSharePointユーザー列にユーザー情報を登録したくなりますよね。
そんな時はこうします。

とりあえず下記の様に`ComboBoxコントロール`と`Buttonコントロール`を３つを配置する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/71712f61-695c-d3d5-0335-306ef0ebfef7.png)


ここでユーザーを検索する為に`Office365ユーザーのコネクタ`を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3737462/9683cb05-d7ec-d133-a9b6-e5205cf2f78f.png)

組織のユーザーデータがインプットできたので
`ComboBoxコントロールのItemプロパティ`に下記の様に記述する。

```
ShowColumns(
        Office365ユーザー.SearchUserV2({searchTerm: Self.SearchText}).value,
        Department,
        DisplayName,
        JobTitle,
        Mail,
        UserPrincipalName
    )
```
O365のユーザー情報を検索できるようにして
ShowColumnsを使い見やすくしている。

`Display Fieldプロパティ`は
```
["Display Name"]
```
とすると良い。

また、複数登録しないと仮定して`複数選択の許可に関してはオフ`とする。


次に、`登録ボタンコントロールのOnSelectプロパティ`に

:::note alert
Patch(ソース,Defaults(ソース),
　　{
　　ユーザー列:ComboBox.SelectedItems
　　}
)
:::
と記述したくなるのですがエラーとなる。

理由としては登録に必要な列（情報）が
ComboBox.SelectedItemsにはないからである。
なので必要な列を作る必要があります。

:::note alert
Patch(ソース,Defaults(ソース),
　　{
　　ユーザー列:
　　　　AddColumns(ComboBox.SelectedItems,
　　　　　　　　　　　　　Claims,UserPrincipalName,
　　　　　　　　　　　　　Email,Mail,
　　　　　　　　　　　　　Picture,Office365ユーザー.UserPhoto(Mail)
　　　　　　　　　　)
　　}
)
:::

はい、これでもエラーとなります。

上記形式が`テーブル`であり、登録は複数選択無効としているので
`レコード`が必要となるからです。

正解はこちら

::: note info
Patch(ソース,Defaults(ソース),
　　{
　　ユーザー列:
　　　First(AddColumns(ComboBox.SelectedItems,
　　　　　　　　　　　Claims,UserPrincipalName,
　　　　　　　　　　　Email,Mail,
　　　　　　　　　　　Picture,Office365ユーザー.UserPhoto(Mail)
　　　　　　　　　　　)
　　　　　)
　　}
)…①
:::

次に、SharePointに登録された情報を変更する場合を考えてみる。
`Galleryコントロールで選択しているItem`のユーザーを変更しようとする場合
先ほどとは別の操作が必要となる。

先ほどの`ComboBoxコントロールのDefaultSelectedItemsプロパティ`を下記の様に記述する。
```
AddColumns(Gallery.Selected.ユーザー列,
            UserPrincipalName,Claims,
            Mail,Email
        )
…②
```
そうする事でユーザー列の変更が無い場合そのまま登録ボタンを押しても現在と同じ情報が
登録される。（ユーザー列だけの登録ではない事を想定している）

変更に関してのコードは下記の様になる。
```
Patch(ソース,Gallery.Selected,
	{
	 ユーザー列:
		First(AddColumns(ComboBox.SelectedItems,
	                    Claims,UserPrincipalName,
	                    Email,Mail,
	                    Picture,Office365ユーザー.UserPhoto(Mail)
	                    )
		)
	}
)
…③
```

あとは新規と変更を区別する為に例えば
`新規ボタン、変更ボタンコントロールそれぞれのOnSelectプロパティ`を下記の様に記述して
```
UpdateContext({locRegisterUser:1})
UpdateContext({locRegisterUser:2})
```

`ComboBoxコントロール DefaultSelectedItemsプロパティ`に
```
Switch(locRegisterUser,
	1,Blank(),
	2,②のコード
	)
```

`登録ボタンのコントロール`も同様に
```
Switch(locRegisterUser,
	1,①のコード,
	2,③のコード
	)
```
とすることで良い感じに登録変更ができる様になる。
複数の日や月をまたがる場合にそれぞれの日や月で集計したい



+ [二つの日付項目から期間を認識し、その期間内のレコード件数を積み上げ集計したい](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000lqRa)

>カスタムオブジェクトA(業務社員と呼称します。)には「開始日」と「終了日」という2つの日付項目があります。9月から12月の間に開始日と終了日がある業務社員レコードをレポートで集計したいのですが、開始日が9月は〇件、という風には集計できても、9~11月の間、業務社員レコードはそれぞれ何件か？というのが集計がとれません。


:::note
弊社でも開始日と終了日で複数の月をまたがるレコードの管理を行っています。

実際には主従関係で子のオブジェクトに開始日と終了日を判断してレコードを作成、削除するようなApexトリガを作って対応しました。

削除の時のことも考慮する必要があったのと弊社が20日締めだったのでApexに頼ってしまいました。レポートを簡単に作成するには、やはり子のレコードを月ごとにつくることが必要だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a158c963-9cb6-932a-dc7e-ae903bf7e801.png)
:::
Agentforce for Developers



+ [Agentforce for Developers](https://developer.salesforce.com/docs/platform/einstein-for-devs/guide/einstein-overview.html)

# ブラウザの問題がある？

+ [New Agentforce Developer Edition: unable to sign up](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000PWlOW)

:::note
I tried multiple times in chrome browser and got an error. When I tried in Edge browser it worked for me. Please try a different browser to see if it works.
:::


# Einstein for DevelopersがSandboxで利用できない

+ [Agentforce for Developers をSandboxで使いたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000lvEF)

+ [Code Builder ユーザーは、Code Builder 環境から実行すると Einstein for Developers 機能が失敗することがわかります。これは、組織の認証の変更により約 2 週間前に導入された回帰です。](https://github.com/forcedotcom/Einstein-GPT-for-Developers/issues/93)

#  ERR_TOO_MANY_REDIRECTS 

+ [Chrome Browser blocking the Service Agent Messaging bubble](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000nZtr)

:::note
私も同じ問題を抱えていました...デプロイメントを公開するときに作成されたデジタル エクスペリエンスでパートナーのプロファイルに権限を与える必要があります。

I had the same issue... Need to give permission to my partner's profile on the Digital Experience created when you publish the Deployment:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/209c1734-f24c-6fd0-9b54-bae5071b7719.png)
:::
SELECT vs COUNT

＜経緯＞
任意のテーブルから条件に合うレコードの有無を調べる処理のコードレビューを行っていた。
そこの処理でCOUNT関数を使ったSQLを発行していて、個人的にはSELECT文の方がシンプルなのにな～と思ったが、一般的にはどうなのか気なった。

皆さんは、どう思いますか？
（例文）
SELECT 〇〇 FROM △△ WHERE XX = □□
vs
SELECT COUNT(*) FROM △△ WHERE XX = □□
[AWS #29] Amazon Polly / Amazon Transcribe

<!--
 <font color="c00000"></font> 赤
-->
## はじめに
こんにちはこの記事を投稿した一昨日から咳、くしゃみ、鼻、喉に違和感を覚えている者です。:frowning2:

今回もAI/MLサービスである **<font color="c00000">「Amazon Polly」と「Amazon Transcribe」</font>** について紹介したいと思います。

## Amazon Polly
:upside_down: <font color="c00000">**Amazon Polly**</font>とは、**文章を音声に変換する**ことができます。AWSのブログには、「Polly」によるブログの読み上げ機能があります。Pollyによって生成された音声を体験することができます。

### メリット
Amazon Pollyにはいくつか利用するメリットがあり、その高品質な音声には、日本国内のラジオやクラウド型コールセンターサービス **「Amazon Connect」** で利用されています。

**多言語　男女音声の対応**
世界29の言語に対応しており、それぞれ男性、女性の音声が用意されています

**多くのオーディオ形式への対応**
「MP3」「Vorbis」などの様々なオーディオ形式で音声を保存することが可能です

**追加料金無しで再利用可能**
一度音声化してしまえば、料金を気にせずそれぞれの目的で再利用できます。（定型文の音声データを使うサービスとかが当てはまりますね）

[Amazon Polly 料金はこちら](https://aws.amazon.com/jp/polly/pricing/)

## Amazon Transcribe
Amazon Transcribeは「Polly」とは反対に、**音声をテキストに変換する**ことができます。カスタマーセンターにて顧客の音声をテキストに変換して **「Comprehend」** で自動分析をしたり、自動議事録アプリケーションを開発したりできます。後は、「文字起こし」「字幕作成」「議事録作成」なんかも...

### メリット
**高度な文字起こしができること**
**文字起こしのコストが削減できること**
**句読点の追加や整形が自動的に行われること**
などのメリットが挙げられると思います。

[Amazon Transcribeの料金はこちら](https://aws.amazon.com/jp/transcribe/pricing/)
## おわりに
今回のちょっとしたまとめになります。

:::note info
Amazon Pollyは、**文章を音声に変換するサービス**
:::

:::note info
Amazon Transcribeは、Pollyとは逆に、**音声をテキストに変換するサービス**
:::


最後までお読みいただきありがとうございました！
>>日頃より活用している参考書です。
>> **「参考書」**
[AWS認定クラウドプラクティショナー改定第3版（ACMは237ページ）](https://x.gd/19i6N)
>
> **「AWS公式サイト」**
[Amazon Polly](https://aws.amazon.com/jp/polly/)
>
OSPF - Configuration of Inter-Area Summarization

## Operating Environment
OS: Windows 11
VM: VMware® Workstation
Software：CML 2.7.2
Hardware：N/A

## Network Topology
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/8cacd2aa-6d25-0267-dbc2-38688a302688.png)

## Basic Settings
### R1
#### IP Address, Router ID, OSPF process
![Screenshot 2024-10-31 042732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/477ae70c-02b8-6ca4-8f66-aa49b9ca61d1.png)

### R2
#### IP Address, Router ID, OSPF process
![Screenshot 2024-10-31 043007.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/47997ad8-5ed6-d86f-2130-4142c3ae5c22.png)

:::note warn
Confirmation and change of router ID is described later.
:::

### R3
#### IP Address, Router ID, OSPF process
![Screenshot 2024-10-31 043750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/38cfb68b-425e-f66b-9c75-2c52705b5fb2.png)

## Inter-Area Summarization Configuration
### R2
![Screenshot 2024-10-31 044725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/3b6a0228-291f-7994-f63f-112ff7a16acf.png)

## Inter-Area Summarization Confirmnation
### R3
![Screenshot 2024-10-31 045539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/3deb0b5e-8c0b-3762-4d05-fd520f036466.png)

## Router ID confirmation and change
### R2
![Screenshot 2024-10-31 043438.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/83541a29-333a-dc5c-d074-d995173f8e49.png)
![Screenshot 2024-10-31 050346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923257/fca2bd1a-4f71-4fce-c70b-a74bc01100e8.png)
開発標準やガイドラインを作るときは外部ドキュメントを参照しつつ柔軟性をもたせよう

過去に作成した開発標準を軽くいじったり、社内のセキュリティガイドラインを作る機会がありました。

その時に心がけていて良かったと思うことをまとめました。

## 心がけ

### すでに世の中に出ているものを参照する

Python で言えば PEP8 のような世に広く知られたガイドラインが存在します。
このようなドキュメントがあれば「開発標準はそれに準ずる」と明記します。

また Effective Python のような定番の書籍も開発標準として活用します。
ガイドラインや書籍の中でどうしても組織に合わないお作法がある場合は例外として明記します。
まとまったドキュメントとして存在しない場合は細かくなりすぎない範囲で追記します。

### 全社的な開発標準は詳細を決めずにプロジェクトごとの柔軟性を持たせる

全社的な開発標準はゆるく設けつつ、細かい部分はプロジェクトごとに定めることを明記します。


## メリット

上記2点を実践することで次のメリットがあります。

### ドキュメントを作成するコストが小さくなる

すでに外部のドキュメントに記載されているため自分で書く必要がありません。
もちろん開発標準として参照するにふさわしいドキュメントを知っておく必要があるので作成する人は大変ですが、書かなくていいというだけでも楽です。

### ドキュメントのメンテナンスのコストが小さくなる

作成コストが小さくなるのと一部重複しますが、メンテナンスのコストも小さくできます。
開発標準は一度定めて終わりということはなく、時代の流れに合わせてメンテナンスし続ける必要があります。
その際に毎回細かく書いたり消したりをするとメンテナンスのコストがかさんでいきます。
基本的に外部ドキュメントを参照しつつ、ゆるく全社的な開発標準を設けることでメンテナンスコストを抑える事ができます。

### 開発標準を読むメンバーの知識水準が上がる

開発標準に PEP8 や Effective Python に準ずると記載することでそれらのドキュメントを隅々まで読むことを強制できます。
これは同時に知識をインプットするコストがかかるというデメリットにもなり得ますが、最低限担保したいものに留めることでコスパのよいインプットになります。

例えば Effective Python を開発標準に取り入れている場合、レビューしているときに「 Effective Python にこういう事が書いてあるので読み直してください」といった具合に知識を身につけることを要求できます。
必ずしも開発標準的なことばかりが書いてあるわけではなく、開発標準以外の知識面が充足できます。

また知識の前提が揃うため、相手の知識レベルに遠慮せずに会話できるようになる点もメリットです（一回読んだくらいだとたいてい知識が十分に身についていないため、実際のところ根気強く伝え続ける必要はありますが）。

### 新規メンバーが入ったときに開発標準をインプットする手間が省ける

Python をまともに書く人なら PEP8 くらい知っていますし、Effective Python も読んだことがあると思います。
そのようなメンバーであれば、開発標準は PEP8 と Effective Python （+α）ですと伝えたらすぐに開発標準に馴染むことができます。

会社独自の開発標準を作っている場合はすべて目を通して貰う必要があるため、新規メンバーの負担が大きくなってしまいます。

### 開発標準として信頼されやすくなる

小さい組織だと開発標準を個人が考える場面もあるかと思います。
そのような場面で参照するドキュメントもないただルールだけが示された「オレオレ開発標準」だと反感を買いやすくなります。
つまり「それってあなたの宗教ですよね？」みたいな反応が出る可能性が高くなります。

開発標準のような派閥が存在するものにおいてはこういう主張はわりと普通に見かけますし、別に主張の内容自体は悪いわけでもないのですが、あまりにこういった反応が多いと開発標準を作り直すのも手間ですしメンタルにもきます。要するにめんどくさいです。

世に広く知れ渡ったドキュメントであれば信頼してもらいやすいく、反感を買いにくくなります。

### 開発メンバーのスキルやプロジェクト固有の事情に最適化した開発標準を作れる

全社的な開発標準をゆるく作っていれば、プロジェクトのメンバーからさきほどのような反発を受けてもある程度寄り添うことも可能です。
またスキル面で大半のメンバーが使ったことのないライブラリが開発標準に含まれていたりすると辛いケースもあるので、どうしても強制したいものでなければ柔軟性をもたせたほうが良いように思います。

## 感想

自分が実践して良かったと思うことを言語化してみました。

しかし SQL のフォーマットなんかは世に絶対的な標準が無いために詳細に決める必要があって結構つらいです。SQL は変化があまりなく、（今まで観測した範囲では）一度定めておけばメンテナンスがほぼ不要なのはせめてもの救いです。

Terraform は [Terraform を使用するためのベスト プラクティス](https://cloud.google.com/docs/terraform/best-practices-for-terraform?hl=ja) と [公式ドキュメントのスタイルガイド](https://developer.hashicorp.com/terraform/language/style)に従ってね、と言うだけでかなりカバーできて楽なんですけどね。

新しいものと古いもので開発標準の書き方やメンテナンスの頻度は結構変わってくるのかと思いました。

今回はエンジニア目線で書いていますが、非エンジニア向けの全社的なツールの使い方などのガイドラインを作る際やちょっとした仕事のルールづくりにも役立ちます。
特に日本の伝統的な企業は「世界標準」のような響きに弱く、独自のやり方を提案されて困りそうなときに外部ドキュメントを使って説得するとすんなり通ったりします。実際そのような標準に従うことが最善のことも多いので、相手のためにも日頃から標準を活用すると良いと思います。

この記事がお役に立ちますと幸いです。
Windowsの回復パーティションの削除方法

## この記事の目的
Proxmoxに立てたWindows10のVMのCドライブの容量がいっぱいになってきて拡張したかったが、Cドライブの直後に回復パーティションがあり、拡張できなかった。

そこで、回復パーティションを一度消して、Cドライブを拡張した。

以降、Windows10における回復パーティションの削除手順を説明する。

## 削除手順
### 1. DISKPARTの起動
コマンドプロンプトに以下のコマンドを入力してDISKPARTを起動する。
```
diskpart
```

### 2. 該当するディスクの選択
ポップアップしてきたDISKPARTにコードを入力して、出力されたディスク一覧から回復パーティションを削除したいディスクのディスク番号を探す。
```
list disk
```
取得したディスク番号(ここでは０とする)を使って以下のコマンドを実行して、削除したい回復パーティションがあるディスクを選択する。
```
select disk 0
```

### 4. 回復パーティションの選択
以下のコマンドで回復パーティションの番号を取得する。
```
list partition
```
取得したパーティション番号(ここでは3とする)を使って以下のコマンドを実行して、削除する回復パーティションを選択する。
```
select partition 3
```

### 回復パーティションの削除
以下のコマンドを実行して回復パーティションを削除する。
```
delete partition override
```

これで回復パーティションは削除される。
Cドライブを拡張したのちに再度、回復パーティションを作成すればよい。
原則原理としてのAWS認定試験

## はじめに

少し多忙のため、今回はAWS認定資格をオススメする記事を書いてみます。

ご紹介程度に私の取得履歴も記載しておきます。

SAP以降、少し別の勉強をしていたので、期間が空いていますが、おおよそ1年半くらいで10個の資格を取得することができています！

|No  |取得日  |資格名  |
|---|---|---|
|1  |2022-10-14  | AWS Certified Cloud Practitioner|
|2  |2022-12-27  | AWS Certified Solutions Architect - Associate|
|3  |2023-01-31 | AWS Certified Developer - Associate|
|4  |2023-03-28  | AWS Certified SysOps Administrator - Associat|
|5  |2023-06-03  | AWS Certified DevOps Engineer - Professional|
|6  |2023-08-06  | AWS Certified Solutions Architect - Professional|
|7  |2024-06-02  | AWS Certified Security - Specialty|
|8  |2024-07-07  | AWS Certified Advanced Networking - Specialty|
|9  |2024-07-27 | AWS Certified Data Engineer - Associate|
|10  |2024-09-23  | AWS Certified Machine Learning - Specialty|

## 間違い探しに挑戦！

唐突ですが、間違い探しに挑戦してみてください！

例のサイゼリアさんのやつです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/a5daf55b-8086-1b65-17b3-e65f7916c5d0.png)

引用元：https://www.saizeriya.co.jp/entertainment/2402.html


## わからない。

当たり前だけど、わかるはずありません。

正解（比較対象）が分からないからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/de3b85e1-53bb-d651-6120-97fa7d847170.png)

引用元：https://www.saizeriya.co.jp/entertainment/2402.html

## AWSの環境でもう一度。

では、次にAWS環境で間違い探しです！

![スクリーンショット 2024-10-31 3.42.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/ece1ec06-229e-261e-a23b-561e913dfbb1.png)

## わかる人もいたかも。

「間違い」ではなく、「改善」に近いとは思いますが、「ファンアウト構成」を知っていれば、このような構成を思い浮かぶこともできるはずです。

![スクリーンショット 2024-10-31 3.35.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/513c5e31-1db8-38ec-beda-2436420d6a62.png)

引用元：https://www.slideshare.net/slideshow/20190717-aws-black-belt-online-seminar-amazon-simple-queue-service/156346120

## 原則原理を理解しておくことが必要。

当たり前だけど、「間違い」に気付くためには「正しい形」を知り、それと比較していく必要があります。

私はこの「正しい形」を「原則原理」と呼び、私のポリシーとして大切にしています。
（日本語としては間違いかもしれません。）

仕事の中で、仕事のことを理解することも大切。
だけど狭い世界だけをみていると、何が正しいかは分からなくなります。

参考書等で勉強をする、外部の勉強会等に参加してみるなど、視野を広げることで原則原理を知ることができるはずです！

特に常に進化していく技術においては、その当時は正しかったことでも、時間が経過するとアンチパターンになったりすることもあるはずです。

## 原則原理としてのAWS認定試験

AWSの原則原理はもちろん、AWS Well-Architectedフレームワーク。

https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/framework/welcome.html

これを読んで、理解するだけだとインプットのみになってしまうので、何かアウトプットを行うことでより理解が深まるはずです！

そのアウトプットの一つとして、AWS認定試験を今回おすすめさせていただきます！

https://aws.amazon.com/jp/certification/

AWS認定試験はAWS Well-Architectedフレームワークに従って、システム構築等ができるかを問われる資格ですので、資格取得が、AWSの原則原理を理解する方法の一つかなと考えています。

## 試験駆動型で良い！・・・と思ってる。

現在私は10個の資格をもっていはいますが、正直にいうと、資格取得で覚えたことの多くがまだ自分の技術として吸収できていません。

データエンジニアや、機械学習、高度なネットワーキング等はほぼ触ったこともない状態。

でも、きっと大丈夫！

すぐには使わないかもしれないけど、その資格取得で覚えた知識の点達は、いつか自身の経験の中で線として繋がり、自身の技術となっていくはずです。

実際に私は直近1年くらいで、AWSサービスを実施に業務で利用することになりましたが、資格取得で覚えた知識がとても役に立っています。

資格取得はゴールではなく、あくまでスタート地点。
資格で覚えたことを業務等で確実にアウトプットできるようになればゴールかなと思っています。

## 最後に。

2024 Japan AWS All Certifications Engineersのクライテリアの発表がまだですが、最近増えた２つの試験が対象になるのかどうかが、少しドキドキ。

できれば、表彰されたいなぁ。
【Java】【TIPS】クラス名をもとにオブジェクトを生成する

# 例
```java:クラス名を元にオブジェクトを生成する例
Example example = (Example) (Class.forName(className).newInstance();
```
# ポイント
1. `Class`クラスの`forName()`メソッドを用いて**クラスオブジェクト**を生成する
1. `String`型の変数`className`では、完全修飾クラス名を指定する
1. 生成したクラスオブジェクトの`newInstance()`メソッドを実行して、指定したクラス名のオブジェクトを得る
1. 戻り値は`Object`型なので、キャストする
1. `InstantiationException`、`IllegalAccessException`又は`ClassNotFoundException`の例外を発生する可能性があるので、例外処理をすること
rpm

/bin/xxxを提供しているパッケージを調べる
rpm -q --whatprovide /bin/xxx
rpm -qf /bin/xxx
前者は未インストール、後者はインストール済みの場合

vlcがインストールされているか確認
rpm -q vlc
rpm -qi vlc 詳細

依存関係確認
rpm -qRp vlc
rpm -qp --requires vlc

インストール
rpm --install vlc
rpm --install --nodeps vlc

vlcに含まれるファイル確認
rpm -ql vlc
rpm -q --list vlc

更新
rpm -U vlc
rpm --upgrade vlc
rpm -F vlc
rpm --freshen vlc 

削除
rpm --erase vlc
Macbook mid 2010 にubuntu 22.04 をインストールしてnormanキーボードレイアウトを使う

## まとめ

### 1

キーボードはApple Alminium (JIS)にする。

### 2
次のスクリプトを `bin/ibus_start.sh` などに保存します。

```bash
#!/bin/bash
# Check if ibus-daemon process is running
if ! pgrep -x "ibus-daemon" > /dev/null
then
    #echo "ibus is not running. Starting ibus-daemon..."
    ibus-daemon -drx
    #echo "ibus-daemon started."
fi

# set default layout to norman
ibus engine xkb:us:norman:eng
# start mozc-jp
ibus engine mozc-jp

# change keycode 132 to backtick/tilde key.
# use echo instead of reading file
# xmodmap $HOME/.Xmodmap
echo "keycode 132 = grave asciitilde" | xmodmap -

```

### 3
これを`.bashrc`から呼び出すように次の行を追加します。

```bash
. $HOME/bin/ibus_start.sh
```

### 4
ubuntu デスu クトップの「自動起動するアプリケーションの設定」で、
`gnome-terminal`を指定します。

![Screenshot from 2024-10-31 02-01-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294073/5ba3881c-1238-7a08-f48f-fb82be8708fe.png)

`ibus_start.sh`そのものを起動する指定ではうまく行かなかったので、`.bashrc`に書き込んでターミナルを起動することで、ibusの自動設定がかかるようにしました。

## 詳細説明

参考: https://namileriblog.com/linux/ubuntu22-04_keyboard_setting/

Ubuntu インストール後、まずキーボードを Apple Alminium (JIS)にします。

このようにするとかな、英数のキーを認識するようになりますが、そのままではqwertyなので、ibus engine でnormanレイアウトを設定します。

`ibus engine xkb:us:norman:eng`

その次にmozc-jpにするとnormanレイアウトで日本語入力ができるようになります。

`ibus engine mozc-jp`

但しこのままでは、かな・英数キーで切り替えができないので、mozcのキー設定でIME有効・無効を切り替えられるようにします。

設定ウィンドウが出るように、

`sudo apt install mozc-utils-gui`

をやっておきます。

ここまでで日本語入力も含めてnormanレイアウトが使えるようになる。

normanレイアウトだと、半角/全角 キーに`` `~ `` が割り当てられますが、macキーボードには半角/全角 キーがないので、代わりにnormanでは空きになっている`\|`キーにそれらを割り当てます。

xevで調べるとkeycodeが132なので、
`echo "keycode 132 = grave asciitilde" | xmodmap -` を呼ぶことでマッピングを修正します。

## 追記

ibusよりもfcitx5の方が良いという記事をいくつか見かけたので、結局fcitx5-mozcに変えました。

normanレイアウトにする方法は[16.04の時](https://qiita.com/Yoshinobu-Ishizaki/items/26e393add3c43f4a5b01)と同じ。

Ctrl-Spaceで一旦mozcに切り替えてしまえば、後は英数・かなキーで直接入力と切替え可能。

やはりibusより簡単だなと思いました。

## 余談

古いMacで遅いため、一旦起動してしまえばまぁまぁ実用には耐えますが、電源ボタンを押してからデスクトップ画面が表示されるまで何分もかかります。

起動していることを見えるようにするのに、`/etc/default/grub`を編集して、
`GRUB_CMDLINE_LINUX_DEFAULT="splash"`
にしておくと、起動メッセージが画面に流れて動いていることが確認できます。

Googleアカウントの紐付けをしようとしたらフリーズします。

https://askubuntu.com/questions/1382602/online-account-settings-freeze-when-clicked

に書いてあるとおり、

`WEBKIT_DISABLE_COMPOSITING_MODE=1`にして`gnome-control-center`を起動してアカウント作成すると良い。
apt

aptのパッケージのインストール方法を時系列に整理する

vlを含むパッケージを検索。
ここでvlcパッケージが検索される
apt search vl

vlcのパッケージ情報を事前に調べる。
apt show vlc 
apt showpkg vlc
apt depends vlc vlcが依存するモジュール

公開されているパッケージすべてを確認
apt list 

インストール済みのパッケージを確認
apt list --installed

vlcのみ確認
apt list vlc

vlcをインストール
apt install vlc

インストール済みのパッケージを確認
apt list --installed


ここから更新。
更新可能なパッケージ一覧を取得する
apt list --upgradable

パッケージ情報をダウンロード、最新化
apt update

パッケージをアップグレードする
apt upgrade

パッケージの削除
apt remove vlc
apt purge vlc
request.post(json=)で沼った話

## はじめに

どうも。@Kai-Rosyです。


日頃、pythonでRestfulAPIの開発なんかをやってるんですが、今回、業務で単純なAPIリクエストに詰まったので記事にしました。

## 問題
requests.post()で json= を使用すると、デフォルトで空白を含む形式のJSONが生成されます。
しかし、API仕様によっては 空白なしのコンパクトなJSONを要求されることがあります。

この場合、json= をそのまま使うと200レスポンスを得られない可能性があります。というか200レスポンスになりません。
(今回、対向システムへのAPIリクエストで401が返却されて詰まりました。。。)


```python
import requests

payload = {"request_id": "0001", "amount": 1000}
response = requests.post(
    url="https://example.com/api",
    json=payload
)
print(response.request.body)


```

出力を見ると、:の間と,の後にスペースが入っていることが確認できます。

```python
# response.request.bodyの出力結果

b'{"request_id": "0001", "amount": 1000}'
```


## 解決方法
json= の代わりに data= を使用する。


```python
import requests
import json

payload = {"request_id": "0001", "amount": 1000}

# 空白を含まない形式のjsonをdump
compact_payload = json.dumps(payload, separators=(",", ":"))

# POSTリクエストの実行
response = requests.post(
    url="https://example.com/api",
    headers={"Content-Type": "application/json"},
    data=compact_payload
)

print(response.request.body)
```

separators=(",", ":") を使用することで、空白文字を含まないjsonを生成できます。

```python
# response.request.bodyの出力結果
b'{"request_id":"0001","amount":1000}'
```


json= を使用する場合は、requests が自動的に Content-Type: application/jsonヘッダーを追加してくれるようですが、data=を使用する際は、手動で以下のヘッダー設定が必要です。
(手動追加も忘れていてさらに詰まりました。。。)



```python
"Content-Type": "application/json"
```


## おわりに
- API仕様書はよく読もうな:hugging:
x-windows-iso2022jpの文字は、windows-31jに含まれている？

## 質問

`x-windows-iso2022jp`の文字は、`windows-31j`に含まれている？

## 回答

`x-windows-iso2022jp`と`windows-31j`（`Shift_JIS`または`CP932`とも呼ばれる）はどちらも日本語の文字エンコーディングですが、対応する文字セットや仕様が異なります。

#### 主な違い
`x-windows-iso2022jp`: 主にメールなどのテキストベースのデータで利用されてきた日本語エンコーディングで、`ISO-2022-JP`と似た構造ですが、Windows環境に特化した拡張を含むバージョンです。特にWindows環境で動作するソフトウェアやレガシーなデータとの互換性が求められる際に用いられることがあります。

`windows-31j (CP932)`: Shift_JISをベースにしたエンコーディングで、Microsoft独自の拡張が加わったものです。`JIS X 0208`の文字セットに基づき、`Shift_JIS`よりも多くの文字（特殊記号やMicrosoft独自の機能）を含んでいます。日本語文字処理においては広く使われているエンコーディングです。

#### 文字の包含関係
`x-windows-iso2022jp`に含まれる一部の文字は、`windows-31j`に含まれている場合がありますが、完全に一致しているわけではありません。特に制御文字やエスケープシーケンスの処理に違いがあるため、直接の互換性がありません。つまり、`x-windows-iso2022jp`のデータを`windows-31j`に変換すると、文字化けが生じる可能性があります。

#### 使用のポイント
どちらかを使用する際には、データの用途や互換性が必要な環境に応じてエンコーディングを選択し、できればUTF-8を使用するのが望ましいです。レガシーなデータやWindows特有のシステムとの連携が求められる場合には、各エンコーディングの仕様に従って処理する必要があります。
x-windows-iso2022jpの文字は、制御文字やエスケープシーケンスは含まれません。その場合、windows-31jでエンコーディングしても文字化けしない？

## 質問

x-windows-iso2022jpありますが、制御文字やエスケープシーケンスは含まれません。その場合、windows-31jでエンコーディングしても文字化けしないという理解であってますか

## 回答

はい、その理解でほぼ正しいです。

`x-windows-iso2022jp`と`windows-31j`にはエンコード方式に違いがあるものの、制御文字やエスケープシーケンスが含まれない場合、`x-windows-iso2022jp`でエンコードされたテキストを`windows-31j`でデコードしても文字化けする可能性はかなり低いです。これは、両者が共通の日本語文字セットである`JIS X 0208`に基づいており、多くの文字が共通しているためです。

ただし、次の点に注意してください：

#### 1. Microsoft独自の拡張文字: 

`windows-31j`には、`Shift_JIS`に基づきつつMicrosoftによる独自の拡張文字が含まれています。もしデータに`x-windows-iso2022jp`では表現できない特殊な記号や独自文字が含まれている場合、それが原因で文字化けが生じる可能性があります。

#### 2. 例外的な文字: 

`x-windows-iso2022jp`と`windows-31j`の間で、微妙に異なるエンコードで表現される一部の記号や文字が存在するため、まれに文字化けが起こることがあります。特に、カタカナの一部や半角の記号類が該当します。

#### まとめ
制御文字やエスケープシーケンスがない場合、ほとんどのケースで`windows-31j`でのデコードに問題はありませんが、特殊文字が含まれる場合には注意が必要です。
セキュリティ学習＃２

# セキュリティの基礎
## HTTP
### HTTPとは
クライアントとサーバーを繋ぐためのプロトコル
リクエストメッセージとレスポンスメッセージでやり取りする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891260/25a9ab18-6932-0cd8-8510-c25300e46982.png)

#### リクエストメッセージ
一行目が重要で、リクエストラインと呼ぶ 以下3点で構成される
1. メソッド  (POST)  
2. URL（/login) 
3. プロトコルバージョン (HTTP/1.1）

リクエストラインの下に必要な情報が含まれている

#### レスポンスメッセージ
大きく3部構成（ステータスライン、ヘッダ、ボディ）

##### ステータスライン
以下3点で構成される
+ プロトコルバージョン (HTTP/1.1)
+ ステータスコード（200）
+ テキストフレーズ　（OK）
##### ヘッダ
レスポンスの情報が入る
##### ボディ
HTMLタグなどの実際に出力されるコードが入る



##
##
Amazon Connectのフローで呼び出したLambdaのレスポンスを使用する方法

# はじめに
Amazon Connectのフローには、`Invoke Lambda Functionブロック` があります。
このブロックからLambdaを呼び出し、そのレスポンスをConnectのフロー内の属性に保存する事で、フロー内でLambdaのレスポンス値を使用することができます。
本記事では、Lambda関数からのレスポンスを `Play Promptブロック` に設定してテストチャットからフロー内で表示されるところまで実装していきます。


# 対象の方
- ConnectのフローからLambdaを呼び出す方法を知りたい方
- Connectのフローから呼び出したLambdaのレスポンスをフロー内で使用したい方

# ゴール
`Invoke Lambda Functionブロック` で呼び出したLambdaから下記のレスポンスを返します。Connectのフローを使用してテストチャットした際に、`おはよう`、`こんにちは`、`こんばんは` が順番に表示されることを確認します。

```:Lambdaの返り値
{
    'test1': 'おはよう',
    'test2': 'こんにちは',
    'test3': 'こんばんは'
}
```

# 作るもの
- Connectのフロー：１つ
- Lambda：１つ

:::note warn
Amazon Connectのインスタンスは作成済みであることを想定しています。
:::

# 1. Lambda関数の作成

Connectの `Invoke Lambda Functionブロック` から呼び出す用の簡単なLambdaを作成します。
3つの値をもつJSON形式のレスポンスをLambdaのレスポンスとして返します。

```python:lambda_function.py
def lambda_handler(event, context):
    return {
        'test1': 'おはよう',
        'test2': 'こんにちは',
        'test3': 'こんばんは'
    }
```


# 2. Amazon Connectフローの作成

次の図のような簡単なフローを作成します。
正常に進めば 開始①⇒②⇒③・・・⇒⑥⇒切断 のように進んでいきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/ffb2a2a3-c27f-2833-e486-689ba69c1133.png)

流れとしては、下記のようになる想定です。

```:フローの流れ
①：チャットスタートの文言表示
②：Lambdaをコール
③：おはようの文言表示
④：こんにちはの文言表示
⑤：こんばんはの文言表示
⑥：チャットを終了しますの文言表示
```

## 各ブロックの設定値

フローの各ブロックにはそれぞれ下記の値を設定します。

```:ブロックの設定値
① Play Promptブロック：チャットスタート
② Invoke Lambda functionブロック：sample_connect_lambda
③ Play Promptブロック：$.External.test1
④ Play Promptブロック：$.External.test2
⑤ Play Promptブロック：$.External.test3
⑥ Play Promptブロック：チャットを終了します
```

### 2.1 Play Promptブロックの設定

#### ・ 開始時と終了時の文言の

開始時と終了時の文言をそれぞれ`① Play Promptブロック` 、`⑥ Play Promptブロック` にセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/46445765-62de-9abd-c9c7-ef582c091c85.png)


#### ・ Lambdaのレスポンスに含まれる文言

Lambdaのレスポンスに含まれる値を `Play Promptブロック` にセットします。レスポンス形式として「JSON」を選択します。

```
1つ目：$.External.test1
2つ目：$.External.test2
3つ目：$.External.test3
```

:::note info

`$.External.レスポンスキー名` の形式で、Lambdaレスポンスの値にアクセスできます。

 > $.External.attributeName

参考：https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#attribs-lambda-table

:::


次の図は `③ Play Promptブロック` の例になります。④、⑤も同様です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/8259dc25-fa24-7d7b-46c5-d37c3adfe96b.png)

### 2.2 Invoke Lambda Functionブロックの設定

下記のように値を設定しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/8f639745-d106-e304-d8c6-3460f348c005.png)


# テストチャットしてみる

ここまでできたらフローを保存、公開しConnectのホーム > チャットをテスト からフローを動かしてみます。

テスト設定 > フローを選択し適用を押下します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/ac18d4f5-dcb2-422e-8c18-832e93031177.png)


LambdaのレスポンスとしてConnectのフローに返ってくる想定の`おはよう`、`こんにちは`、`こんばんは`の文字が表示されることを確認できました。

![sample_connect_chat_p.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1247619/a323d22f-5bd9-c3e3-4610-06a1be836af8.gif)



# 参考

https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/connect-attrib-list.html#attribs-lambda-table
dpkg

dpkgの使い方を時系列に整理する

/bin/xxx がどのパッケージからインストールされたか調べる。結果vlcであることがわかる。
dpkg --search /bin/xxx

まずは、インストールvlcがインストールされているか調べる
dpkg --status vlc
dpkg --list vlc

vlcをインストール
dpkg -install vlc-2.4.1.1.amd64.deb

vlcがインストールされているか調べる
dpkg --status vlc
dpkg --list vlc

vlcにインストールされたファイル一覧を確認
dpkg --listfiles vlc

vlcのアンインストール
dpkg --remove vlc
dpkg --purge vlc
セキュリティ学習＃１

# 脆弱性とは
　悪用できるバグのこと。ハッカーなどはこのバグを利用して個人情報や秘密情報などを盗もうとする。
 
## なぜセキュリティが必要なのか
+ 損害賠償など経済的損失を被る可能性があるため
+ 個人情報保護法などにより情報を守る義務があるため
+ 利用者に嘘の情報を与えないため
セキュリティ学習スタート

## 初めまして！
### 現在、パソコンの世界について一生懸命勉強している大学生です。

##### 簡単な自己紹介から
##### フロントエンド
+ React
+ Next.js
+ Html
+ tailwind css
+ JavaScript


##### バックエンド
経験なし(FastAPIに興味あり！)

　以上の言語を勉強しています。

 ##### なぜいきなりセキュリティなのか
　インターン先でフロントエンドを担当し、webアプリケーションを開発しているのですが、セキュリティ人材がいない！

...というわけです！

参考書は「体系的に学ぶ安全なWebアプリケーションの作り方」です！この本を読めば間違い無いでしょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3891260/9644f53e-f254-9e56-373f-13956ac5da9c.png)



あ、一応応用情報技術者試験の勉強はしました。受かったとはいっていません。

### スピード感を持ってセキュリティを勉強していきたいです！有識者の方々ご指導ご鞭撻のほどよろしくお願いします!
[Workaround] FreeBSD 14.1 で AR8171 が通信してくれない問題

# Issue
- マザボ Asrock H81M-ITX の Onboard LAN (AR8171)が動かない
    - インストール時にDHCPとれず
    - Root console で試すも Ping とか 100% Lost
- NetBSD10 と UbuntuServer24.04 では普通に通信している
のでHWは正常。故障してない。

# Result/Solution
- kernel に TUNABLE_INT ```hw.alc.msix_disable=1``` を渡せばとりあえず動く
    - 性能は落ちていそうな気がするが未測定
    - /boot/device.hint に ```hw.alc.msix_disable=1``` の行を追記で OK
- この TUNABLE_INT ```hw.alc.msix_disable=1``` は、release/14.1.0 でも使える
    - が、再Install面倒なのでしばらく 14-STABLE のまま運用

# 解析Memo
## Patch 発見まで
- Googleで検索すると Atheros の別Chipで同様の報告が見受けられる
- で、これに行き着く
    - https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230807
- CURRENT と 14-STABLE には投入済みに見える

## 14-STABLE を試す
- CURRENTは猛者すぐるので、14-STABLE を Try することにする
- NW死んでるので、Kernel image 差し替えが困難・・・・・
- 潔く FreeBSD14-STABLE の Installer USB stick を作成して再Install
- が、まだ Installer の設定中に DHCP とれない・・・・
    - Reboot後に固定IP仮設定するもPingが100% Lost も相変わらず

## Source 解析
- https://github.com/freebsd/freebsd-src/blame/9e3e111d749ac83f213a36254fd0717265534e05/sys/dev/alc/if_alc.c#L1425
    - このへんの処理で E2200 系列の場合 Disable にしている
- https://github.com/freebsd/freebsd-src/blame/9e3e111d749ac83f213a36254fd0717265534e05/sys/dev/alc/if_alc.c#L1438
    - AR8171 は msix_disable=2 のまま進行
- https://github.com/freebsd/freebsd-src/blame/9e3e111d749ac83f213a36254fd0717265534e05/sys/dev/alc/if_alc.c#L103
    - msix_disable は TUNABLE_INT として定義されているので、Re-compile せずとも Loader の設定いじれば行けそう

## Kernel 起動パラメータを渡す
- FreeBSD Loader で止めて
    - ```set hw.alc.msix_disable=1```
    - ```boot```
- してみる ==> DHCP とれた！
- 永続化のためには /boot/device.hint を書き換えればよい
    - https://man.freebsd.org/cgi/man.cgi?device.hints
[宇宙最速？若手エンジニア応援LT会感想]オフラインイベントは良いぞぉ〜！オンラインの世の中だからこそのオフラインの価値とは

お疲れ様です。アスカです。
今日は久しぶりにJAWSのオフラインイベントに参加したので、その感想とオフラインだからこそ感じた熱量をなんとか伝えたいと思い、帰りの半蔵門線の中で書いています。
登壇内容にもメモベースで触れますが、伝えたいのはオフラインイベントに参加する価値についてです。
詳細な登壇内容についてイベントのページに動画と資料がアップされると思うのでそちらをご参照ください。
https://jawsug.connpass.com/event/330025/
# オフラインの価値について
これがこの記事で伝えたい事です。
1.  講話一つ一つが身に入る
1.  登壇者の熱が直接伝わり刺激になる
1.  登壇者や参加者との交流により視野が広がる

皆、貴重なオフラインイベントに参加しましょう。

## 1. 講話一つ一つが身に入る
個人の姿勢にもよるかも知れませんが...
オンラインで聴講する時、仕事しながら流し見とか、料理しながら動画を流していませんか？？
私がそうです。実際にこのイベントの前日にあったJAWS AI/ML支部のイベント(https://jawsug-ai.connpass.com/event/333598/ )は仕事が長引いてしまい、資料の作成をしながらYoutube Liveを見ていました。
オンラインだとこれが出来る事が柔軟で良い所でもありますが、悪い所でもあると思います。
突然ですが、禅の言葉に喫茶喫飯という言葉があります。
### 喫茶喫飯
ざっくり言うと飯を食う時は飯を食う事に集中する、茶を飲む時は茶を飲む事に集中するという意味です。当たり前の事に思う人がいるかも知れませんが、意外と難しい世の中だと思います。ですが、この姿勢が出来て初めて聞いた事、経験した事が身に入ると思います。
正直昨日の自分は本業をしなが動画を流していたので、あまり深い理解まで登壇者の話を落とし込めませんでした。
しかし、オフラインでは違います。料理を作る事は出来ません、本業をする事は許されません。
※ネットは繋がるので本業をする事は可能でありますが...それが適切な環境ではないです。

色々書きましたが、とどのつまり、オフラインだからこそ聴く側としての体制が整いやすい環境になるという事です。

## 2.  登壇者の熱が直接伝わりやすい
聴く側の準備が整うのと同様に話す側も準備を深くするのではないでしょうか。オンラインと異なり、オフラインでは話す姿がリスナーの目に映ります。投映する資料を準備する以上にどんな身振りをするか、どんな声音にするか、自分の想いをどう表現するのかをオフライン以上に練る方が多いのではないのかと勝手に思っています。

オフラインの場合、聴く側の準備と伝える側の準備の質が重なり合う事で皆にとって実りのある時間になりやすいのではないかと思います。

## 3  登壇者や参加者との交流により視野が広がる
オフラインだからこその対面の飲み会も価値が高いです。登壇者はもちろんの事、参加者との交流も行えます。
IT業界の技術スタックの幅は広いです、どんどん広がっていきます。
その分だけAWS、ひいてはクラウド技術者が関わる領域も広がっていきます。一方で、業務において触れる技術には限りがあります、
目の前の仕事で手一杯になっていませんか？他の仕事や技術スタック、ドメインを見る時間はとれていますか？
変化の早い業界だからこそ、視野を広く持って、変化に対応する準備をする事が大事だと思います。ネットにも最新技術の記事は挙がりますが、オフラインのイベントに参加して実際に業務で扱っている人と交流する事でより現場に即した知見を得られると思います。

## 結論：貴重なオフラインイベントに参加しましょう。
コロナウイルスの流行を機にオンライン化が進んだIT業界だからこそ、オフライン交流の価値が高まっていると感じます。
皆さん忙しいので、オンラインのメリットも大きいですが、時には足を伸ばしてオフラインで交流をするのも良いのではないでしょうか。きっと良い出会い、良い知見が身に入るはずです。

# 余談
余談にして申し訳ないですが、今日のメモを投げます、
拙くてすみません...
※念の為？登壇者の個人名は伏せています。
## AWSをもっと使いたい
現実世界を複製しカスタマイズできる
完全没入型仮想現実にもAWSは参入するはず

クラウドは最新の技術トレンドを取り入れてプラットフォームとしての立場を確立しようとする傾向にある
そのため、クラウドの技術トレンドにキャッチアップする事が時代のトレンドに付いていく事になる

## アプリケーションからクラウドエンジニアを目指した理由

サーバワークス（クラウドインテグレータ）
カスタマーサクセス部エンジニア

### AWSエンジニアになったきっかけ
ソフトウェアがメイン
インターンシップでAWSと出会う
サーバーワークス1年目は全て研修

## ブログレビューの効率化

社内でブログレビューが大変
AWSのWhat's New Notifierを使ってブログの自動レビューをやってみた
トリガとwebhookURLを変えればブログの自動レビューにも使えるのでは？
やってみたら、かなり人のためになる。

## Code PipeLine V1とV2の違い
島村一歩さん

パイプラインタイプ意識してる？
・パイブラインレベル変数
・実行モード
・ステージ条件
料金体系が変わる

## AWS Securituy Hubnの活用に苦労した話
### Security Hubのスコアが悪い
これの原因を愚直に調べていくこと自体が大きな勉強になり。
検証環境だからという観点も入るとより複雑になる

### これから
オートメーション活用
自動チューニング
も出来るようにしていきたい

## 使いそうで使わないCloudHSM
便利だが
お値段がKMSと比較して高いから使われない

...
### その他はイベント中にXで思った事を投稿しています
https://x.com/achan_engineer
こちらの方がオンタイムで感じた事を投げているのでリアルかと思います、
適当なブログ記事ですみませんが、こういった感想投稿のハードルを下げる事に貢献できたら幸いです。

その他、技術に触った内容も挙げているのでよかったらフォローしていってください。
エンジニアで初めて転職しようと考えている人へ

# あいさつ
初めまして現在進行形(2024年11月前)で転職活動中の者です。
独立系SIerの子会社にてシステムエンジニアを担当しており、主に開発業務を行っています。
年齢は28歳、業界経験は5年目、今回が初めての転職活動になります。

今回この記事を書こうと思ったのは2点理由がございます。
①転職活動中の生の声を聞いて欲しいから
②私の転職活動の言語化の目的

転職しようかな？でも初めてでよく分からない…という方も多いと思います。
その人達の救いになっていだければ幸いです。

最初に結論なります
* 心が壊れる前に動け
* 転職の理由の考え方
* 活動はポジティブ思考にて行うこと
* 若い人ほど動ける

少しでも心当たりがある方は、ぜひ一読してみてください。


# 心が壊れる前に動け
心を病む前に行動をしましょう。
転職活動の一歩を踏み出したのは2024年の3月からでした。
ですがこの時私は長期機関の残業時間や労働環境が悪かった為、うつ病認定されました。
うつ病の怖いところは、何も行動ができなくなることです。
これで私は回復するために6ヵ月という期間を無駄にしました。
うつ病になると、せっかく「転職しよう」と考えられたとしても、動けなくなります。

少しでも「転職しようかな」と考えた方は、行動を起こしてみてください。
「転職したい」と少しでも考えた時、あなたは在籍している会社に不満を持っているということを忘れないでください。


# 転職理由の考え方
私が本格的に活動を始めたのは9月の半ば頃でした。
しかしここで問題が発生しました。
転職理由が他責の理由ばかりであったことです。
察している方はいると思いますが、私の転職活動の原点は「残業を減らし、ワークライフバランスを整えたい」でした。
もちろんこれも立派な転職理由です。ですがこのような他責の理由やネガティブな理由で転職活動を行うと確実に沼にハマります。私はこれで1ヵ月程無駄にし、なぜ上手くいかないのか落ち込みました。

転職理由はできるだけポジティブな方向に持っていくようにしましょう。
ポジティブであればあるほど、行動に移せる為です。

まず、あなたは現状の仕事内容で満足しているかを考えてみてください。
現在の仕事内容で満足していますか？
例えば「仕事は楽だが、将来性が気になる」「残業が多い割に自身のキャリアアップが見込めない」と感じているあなたは転職チャンスです。
転職エージェントに申し込んで相談をすることにより、解決すると思います。

次に、私のように「残業がの多い環境が嫌」「人間関係がキツイ」「昇給が見込めない」と感じているが、これをポジティブ方向に持っていけないあなた。
これも転職エージェントに相談しましょう。そして思っていることを洗いざらい話してみましょう。
転職エージェントの方はあなたよりも転職のプロです。あなたが悩みを吐き出している内容を良い方向に持って行ってくれます。
また話すことで自身の考えを言語化することができます。これは面接や転職の考え方として、超重要になります。
そのため、積極的にエージェントに悩みを相談しましょう。

ただしここで気を付けていただきたいことが1つあります。
1つのエージェントにこだわらず、複数のエージェントを活用しましょう。
またこのエージェントが合わないと感じたらすぐに交代してもらうようにしましょう。


# 活動はポジティブ思考にて行うこと
転職が上手くいかないと落ち込みますし、焦りも出てくるかと思います。
そもそも書類選考が通らない、面接でお見送りになる等が出てくると思います。
ですが、それは貴方の経験値になります。成功は自信になり、失敗は経験値となると私は考えています。

ネガティブになり、そもそも応募するのが怖くなってしまうことや、面接で固くなってしまうことは貴方に良い影響を与えませんし、時間の無駄です。
何故失敗したかのPDCAサイクルを回す必要はありますが、ご縁が無かった企業のことは忘れましょう。
というか忘れないとやっていけません。


# 若い人ほど動ける
タイトルの通りです。
若い方はポテンシャル採用というものがあります。
そのため、未経験の業種、業界でもモチベーションがあれば飛び込めます。
若いうちから転職するのはちょっと…というのはIT業界では古い考えになります。
積極的に自身のキャリアアップを目指しましょう。
でないと人生詰みます。私は詰みの2歩手前ぐらいです。


# まとめ
ここまで長くなりましたが、要約すると「少しでも悩んだら動け」になります。
エージェントに話すことで気が楽になることや、転職の考え方について勉強になります。
ITエンジニアの開発は多忙だと思います。
ですが隙間時間を見つけて積極的に動くようにしましょう。

最後になりますが、初めてのことは勇気が必要ですし、時間もかかります。
それでも諦めずに挑戦することは、貴方の経験値として決して無駄になることはありません。
恐れず挑戦してみてください。


#### アップデート情報
ver 1.00 2024/10/31 記事公開
ISUCON過去問関連の計装に関するメモ書き

# はじめに

いったんメモとして書きなぐる内容、あんまり人に見せることを想定していない

## 計装(instrumenting) とは

>システムやアプリケーションに計測機構を実装し観測を実現すること

https://x-tech5.co.jp/2023/08/28/490/


o11yを実現するうえで、ログ・メトリクス・トレースといった情報をアプリ等からとれるようにすることだと理解した。


## 自動計装と手動計装

こういったテレメトリーを取得できるような状態にするには、手動でアプリのソースコードに変更を加え、テレメトリーを送信できる状態にする（＝手動計装）か、アプリ側には修正を与えない形で送信できる状態にする（自動計装）がある。

https://speakerdeck.com/k6s4i53rx/getting-started-auto-instrumentation-with-opentelemetry?slide=17


もちろん、自動でやってくれるのがうれしいのは間違いない。
ただ、ISUCON上での問題は、人気のあるGo言語に対しては自動計装のツールはまだ実験的な形でしか存在しないらしい。

https://github.com/open-telemetry/opentelemetry-go-instrumentation?tab=readme-ov-file

かつ、webアプリフレームワークとしてはjinには対応しているものの、ISUCON13の参考実装で使われているechoは対応してなさそう？（下記スライドで言われているオリジナルソースが見当たらない…）

https://speakerdeck.com/ryuichi1208/5fen-dewakarugonozi-dong-ji-zhuang?slide=6


従い、基本的にはGoの場合には手動計装を行うことになりそう。

なお、Pythonの場合は自動計装できて、
```
opentelemetry-instument python app.py
```
で起動するだけでいいらしい、すげー。ただ、どこまで拾ってくれるかは動かさないと何とも言えないなと思った。

## 個人的スコープ

ログ・メトリクス・トレースの３つのうち、ログについてはalp,slpといったISUCONと相性のいいログ解析ツールの存在や、メトリクスについては個人的にnode-exporter,process-exporter＋prometheusである程度何とかなるので、残りのトレースに絞る。

## トレース

トレースの利点としては、あるHTTPリクエストの中で、ある処理が行われている時間を測定することができ、一つのリクエストにおいてどこに時間がかかったのかを詳細に閲覧できる。この点は、pprofなどの統計情報としてつぶれてしまった場合に見ることができない、特定のリクエストのみ遅いなどの分析には有用なはず。（ただし、マクロに高速化できなければスコアは上がらない気がするので、まずはpprofの方がいいとは思う）

この中で、どこからどこまでどれだけ時間がかかったを示すのがスパンであり、どれだけ多くのスパンを仕込めるかでわかりやすさが変わる。


## Go言語の手動計装について

自分で手を動かした感じおおよそ2つの手段があり、出入り口たるウェブエンドポイントやSQLへのアクセスを対象にに仕込む方法と、完全に手動で仕込む方法がある。

トレースに関しては、ISUCON13の4位の方々がjaeger＋opentelemetryを使って実現していてこれに倣うことにする。リポジトリも公開してくださっているのでそのあたりから勉強させていただく。

https://blog.p1ass.com/posts/isucon13/

このあたり眺めつつ、自分でもprivate-isuで同様のことができるかトライした。(コードの公開はそのうち…)


### ウェブフレームワークへの導入

フレームワークに仕込む方法としては、各種フレームワークのミドルウェアとして仕込む形になる。まず難易度が低いのはウェブフレームワークに仕込むのがよさそう。確認した感じ、echo(isucon13)、chi(private-isu, isucon本の題材）あたりにはありそうだった。変更もすべてのエンドポイントに仕込む必要はなく、（トレースプロバイダーの実装を除けば）修正は少なかった。

ただこれだと各エンドポイントへのリクエスト全体のスパンを見ることしかできず、ちょっと情報に乏しい。

### SQLアクセスへの導入

こちらについても、基本的にはDBの初期化時にテレメトリーを送信するようにすればよい。ただし、各クエリの実行時には、「どのHTTPリクエストで発生したスパンなのか？」を判断するために、http contextの情報が必要になる。元の実装でこのcontextをとりまわすようになっていればほとんど修正は不要になる。一方でそういう実装になっていなければ自分で行う必要がある。

ISUCON13のgo言語の参考実装には仕込まれており、必要な修正は少なかった。一方、private-isuのデフォルト実装ではhttp contextをとりまわす実装になっておらず、endpoint冒頭でのcontextの取得から、各関数へのcontextの引き回しのための実装変更はそれなりに修正が求められた。（とは言ってもほぼ機械的なので大したことはないが）

### 関数への導入

これについては各関数の冒頭にコピペで数行追加する。一応、スパンである以上、開始と終了をするタイミングでコードを記述必要があるが、deferでまとめて書けるので楽だった。

## 手動計装導入例

いったんできることの確認だけなので中途半端だが下記の感じ。DBの方はどんなクエリだったかも確認できる。makePostsの方は先の関数の導入を行う感じで実装している。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2522928/6f7d3c41-45f1-9f0f-cb5e-1a66fd0820db.png)

## おわりに

コンテスト中にこれをやるかどうかは、特にコンテキストの取り回しがされているかどうかで大変さ・優先順位が変わるので実装みて判断かなあと思った。分析ツールとしては有用だと思うのでうまく使いこなしたい。
【学習記録　2024-10-31】

## 使用した教材など
Udemy：【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー 模擬試験問題集（6回分390問）
## 学習内容
- 模擬問題演習

## 所感
　残す模擬問題もあと一つとなりました。今月中に合格はできませんでしたが、なるはやで受験できるように駆け抜けます！
【体験談】どうしても転職ドラフトが良かった

※こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています

https://job-draft.jp/articles/251

# 転職ドラフトを利用した結果
おかげさまで人生初の転職が決まりました！

結果ですが、数字インパクトのある年収面でいうと100万以上アップしました。
そのほか個人的に重要視していた要素も含め、満足しています。


# 転職ドラフトの第一印象
企業からオファーをいただく仕組みが新鮮でした。
また、年収掲示と指名理由ありという点も転職活動の経験が無かった私にとっては興味津々でした。
これからの印象からとりあえず市場価値を把握したいという目的で利用を決めました。
ドラフトに参加するにはレジュメを書いて審査を通らないといけないですが、オファーをいただける可能性があるかも...と考えると苦ではありませんでした。レジュメは一点いただいた修正箇所を対応した後、通過しました。

# 転職ドラフトを利用してみて

### （どうしても）良かった点
- **初めから年収掲示されるので年収交渉の必要がない**

よく聞くパターンで、選考がある程度進んでからのオファー面談で希望が通らずお見送りというのを回避できます。
また、他サービスで希望額を聞かれた際は転職ドラフトの平均オファー額を提示していました。

<br>

- **面談や選考に進むにあたっての判断材料が豊富&簡単に手に入る**

年収掲示額、抱えている課題、指名理由、期待するポジションなど、企業からの期待値情報を面談や選考前に得られるため、期待値のギャップ埋めがしやすくて大変有り難かったです。「入社したけど思ってたのと違う」ということだけは避けたかったので、このギャップ埋めに力を入れていたのですが、私が利用していた他サービスだとこれらの期待値情報を面談時に質問するところからスタートでした。これが結構大変で...

<br>

- **内定承諾後のプレゼントが豪華**（記事執筆時点）
>正社員採用の場合
Amazonギフト券5万円分（Eメールタイプ）

>業務委託として契約成立した場合
Amazonギフト券1万円分（Eメールタイプ）

嬉しい！

### 注意が必要な点
- **基本オファー待ちになるので、企業選びの選択肢を増やしたい場合は「ラブコール」を送るしかない**

<br>

- **他サービスと比べて職務経歴書（転職ドラフトでいうレジュメ）の内容が濃いため、思っている以上に期待いただくことが多かった**

嬉しいことに一位指名を何度かいただけたのですが、企業側が求めている水準に達していなくてお見送りになりました...

# 最後に
かんたんではありますが私の体験談でした。
みなさまの転職活動に少しでもお役立てできればと思います。

そして！転職ドラフトには「友達成功プレゼント」というキャンペーンがあります！
招待コード```ZHYS```を入力いただき、指定の条件を満たした方は以下のプレゼントがもらえます:sunny:

プレゼント（最新情報は転職ドラフトのサイトでご確認ください）

>あなたにも友達にも、以下からお好きなものを1点ずつプレゼントします。
お好きなO’REILLY JAPANの本1冊（税込5500円以内）
ACTUSギフトカタログ Straw（ストロー）
Amazonギフト券 3000円分（Eメールタイプ）

条件（最新情報は転職ドラフトのサイトでご確認ください）

>アカウント登録後28日以内に入力する必要があります
>レジュメを作成し、審査を通る必要があります


ご利用いただけると嬉しいです:pray:
【JavaScript】setIntervalの使い方

## `setInterval`とは
`setInterval`は、指定した間隔で関数を繰り返し実行するための関数です。

## 基本構文

```javascript
setInterval(function, milliseconds);
```

- `function`: 繰り返し実行したい関数または関数の参照
- `milliseconds`: 関数を実行する間隔（ミリ秒単位）

## 使い方

以下に、`setInterval`を使用して1秒ごとにメッセージをコンソールに表示する例を示します。

```javascript
function greet() {
    console.log("こんにちは！1秒ごとにこのメッセージが表示されます。");
}

// 1000ミリ秒（1秒）ごとにgreet関数を実行
const intervalId = setInterval(greet, 1000);
```

### 実行の停止

`setInterval`は、指定した間隔で関数を永遠に実行し続けます。これを停止するには、`clearInterval`関数を使用します。`clearInterval`には、`setInterval`が返すIDを渡します。

```javascript
// 5秒後にsetIntervalを停止
const intervalId = setTimeout(() => {
    // ...
    clearInterval(intervalId);
    console.log("メッセージの表示を停止しました。");
}, 5000);
```

## 参考

https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval
Pythonではじめる自然言語処理勉強メモ

自分用勉強メモです。自分なりにかみ砕いた内容になります。

## 形態素分析
文章を単語(形態素)単位で区切り、それぞれの品詞などを解析する分析。**MeCab**というエンジンが有名で、PythonやR、Rubyなどで使用することが可能。

## tf-idf
文章において、その単語がいかに重要であるかを数値化したもの。対象の文章内で、対象の単語が出現する頻度を表すtfと、その単語が他の文章を参照したときにどれだけ希少であるかの程度を表すidfを用いて数値化を行う。tfとidfが小さいほど、if-idfの値は大きくなる。

## 単語ベクトル
単語分散表現という手法で、単語をベクトルとして表したもの。Pythonが単語ベクトルを扱うためのライブラリである**gensim**は、文章の穴埋め問題を学習させ、空欄の前後関係からベクトルを定義する手法が用いられている(CBOW)。

## cos類似度
単語間の類似度を測るための、単語ベクトルの内積から算出されるcosの値。cosは0~1の値をとり、1に近いほど類似度が大きいといえる。

## n-gram
nには自然数が入る。文章をn文字で分割し、分割したものを文章にラベルとして付与することで、検索などでヒットしやすくなるなどの用途で使用される。例えば、2-gramでは「面白い動画」とう名前の動画が「面白動画」でヒットするようになるイメージ。

# Pythonによる自然言語処理
https://www.youtube.com/watch?v=gPV7SuZiVu4

上の動画を参考に、ハンズオンで学んだ内容をGitHubにまとめました。Windows用に内容を改変しています。

↓GitHub

https://github.com/Fukushima1115/study/blob/main/nlp/notebooks/nlp.ipynb
回転する矩形と点の衝突判定【備忘録】

## シンプルな実装

### 変数
``` c++
float box_x; // 矩形のX座標
float box_y; // 矩形のY座標
float box_width; // 矩形の幅
float box_height; // 矩形の高さ
float box_angle; // 矩形の回転角度(180° = π)
float point_x; // 点のX座標
float point_y; // 点のY座標
```

### 判定計算
``` c++
float s = -sinf(box_angle);
float c = cosf(box_angle);
float dx = point_x - box_x;
float dy = point_y - box_y;
float xx = dx * c - dy * s;
float yy = dx * s + dy * c;
bool result = (0 <= xx && xx < box_width && 0 <= yy && yy < box_height);
```

## アンカーやサイズを含む実装

### 変数
``` c++
float box_x; // 矩形のX座標
float box_y; // 矩形のY座標
float box_width; // 矩形の幅
float box_height; // 矩形の高さ
float box_angle; // 矩形の回転角度(180° = π)
float box_anchor_x; // 矩形のアンカー(回転の基点)X座標
float box_anchor_y; // 矩形のアンカー(回転の基点)Y座標
float box_size; // 矩形のサイズ(100% = 1.0)
float point_x; // 点のX座標
float point_y; // 点のY座標
```

### 判定計算
``` c++
float s = -sinf(box_angle);
float c = cosf(box_angle);
float dx = point_x - box_x;
float dy = point_y - box_y;
float xx = dx * c - dy * s + box_anchor_x * box_size;
float yy = dx * s + dy * c + box_anchor_y * box_size;
bool result = (0 <= xx && xx < (box_width * box_size) && 0 <= yy && yy < (box_height * box_size));
```
Haskellでラムダ計算：ゼロ判定

Haskellでラムダ計算の続きです。

[A Tutorial Introduction to the Lambda Calculus](https://personal.utdallas.edu/~gupta/courses/apl/lambda.pdf)

数がゼロの時に真、それ以外の時に僞を出力する関数$\textbf{Z}$を定義します。
$$\textbf{Z}\equiv \lambda x.x\textbf{F}\neg\textbf{F}$$

ところで、変数$a$に関数$f$をゼロ回適用したものは$a$となります。
$$\textbf{0}f a\equiv(\lambda s z.z)f a\rightarrow a$$

一方、どんな変数$a$に$\textbf{F}$に適用しても、同値関数$\textbf{I}$になってしまいます。

$$\textbf{F}a\equiv(\lambda x y.y)a\rightarrow \\lambda y.y\equiv\textbf{I}$$

$\textbf{0}$に$\textbf{F}$に適用すると、$\textbf{0}\textbf{F}\neg\rightarrow\neg$を考慮して、

$$\textbf{Z0}\equiv(\lambda x.x\textbf{F}\neg\textbf{F})\textbf{0}
\rightarrow\textbf{0}\textbf{F}\neg\textbf{F}
\rightarrow\neg\textbf{F}
\rightarrow\textbf{T}$$

となります。自然数$\textbf{N}$を$\textbf{Z}$に適用すると、

$$\textbf{ZN}\equiv(\lambda x.x\textbf{F}\neg\textbf{F})\textbf{N}
\rightarrow\textbf{N}\textbf{F}\neg\textbf{F}
\rightarrow\textbf{IF}
\rightarrow\textbf{F}$$

となります。なぜなら、
$\textbf{NF}\neg
\rightarrow(\lambda fx.f^nx)\textbf{F}\neg
\rightarrow\textbf{F}^n\neg$
$\rightarrow\textbf{F}(\textbf{F}(\ldots(\textbf{F}(\textbf{F}\neg))))$
$\rightarrow\textbf{F}(\textbf{F}(\ldots(\textbf{F}(\textbf{I}))))
\rightarrow\textbf{I}$
なので。
### Haskellでの実装 ###
`logicalToBin x = x True False`は真か偽かを判定する関数。Haskellで定義済みの`True`（真）と`False`（偽）を返す。
```
-- Haskell iszero.hs
true x y = x
false x y = y
logicalToBin x = x True False   -- Check whether true or false
not' x = x false true

zero s z    = z
one s z     = s(z)
two s z     = s(s(z))
three s z   = s(s(s(z)))

iszero x = x false not' false
add1 n = (n + 1)

main = do
    print "(iszero zero) ->"
    print $ logicalToBin (iszero zero)
    print "(iszero one) ->"
    print $ logicalToBin (iszero one)
    --print "(iszero two) ->"
    --print $ logicalToBin (iszero two)

*Main> main
"(iszero zero) ->"
True
"(iszero one) ->"
False
```
なぜか`logicalToBin (iszero two)`の場合はエラーが出てしまった。
```
*Main> :t one
one :: (t1 -> t2) -> t1 -> t2
*Main> :t two
two :: (t -> t) -> t -> t
```
型の違いで結果が違うのでしょうか。
Advent of code 2015 Day 4 Part 1 & Part 2 を Livebook で楽しむ

## はじめに

Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます

本記事では Day 4 の Part 1 と Part 2 を解きます

:::note info
Day 3 までは Part 1 と Part 2 を分けていましたが、 Day 4 はあまりにも Part 1 と Part 2 に違いがないので一つの記事にしました
:::

問題文はこちら

https://adventofcode.com/2015/day/4

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day4_part1.livemd

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/aoc/2015/2015_day4_part2.livemd

## セットアップ

Kino AOC をインストールします

```elixir
Mix.install([
  {:kino_aoc, "~> 0.1"}
])
```

Kino AOC の使い方はこちらを参照

https://qiita.com/RyoWakabayashi/items/3d3abcf9134cee4dff05

## 入力の取得

"Advent of Code Helper" スマートセルを追加し、 Day 4 の入力を取得します

![スクリーンショット 2024-11-19 23.19.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/8f0aec2c-4418-d308-2392-84c2f11987c9.png)

## 私の答え

私の答えです。
折りたたんでおきます。
▶を押して開いてください。

### Part 1

<details><summary>回答</summary>

`:crypto.hash(:md5, input)` で `input` の MD5 ハッシュがバイナリで取得されます

"Hexadecimal" と指定されているように、 `Base.encode16` で文字列にエンコードします

`"#{puzzle_input}#{index}"` として `index` を 0 から 10000000 の範囲で探索します

`Enum.find` を使うことで、最初に該当した数字 = 最小値が取得できます

```elixir
Enum.find(0..10000000, fn index ->
  hash_head =
    :crypto.hash(:md5, "#{puzzle_input}#{index}")
    |> Base.encode16()
    |> String.slice(0..4)

  hash_head == "00000"
end)
```

</details>

### Part 2

<details><summary>回答</summary>

Part 1 の桁数を変えただけです

```elixir
Enum.find(0..10000000, fn index ->
  hash_head =
    :crypto.hash(:md5, "#{puzzle_input}#{index}")
    |> Base.encode16()
    |> String.slice(0..5)

  hash_head == "000000"
end)
```

</details>

## まとめ

問題文から ChatGPT に画像を生成してもらいました

![md5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/cdac08fc-8171-f320-7079-aace0717a9c7.jpeg)

0 から順に探索するだけなので工夫も何もないですね

Part 2 も単なる桁数違いだったので、かなり拍子抜けしました