OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロから始めるMuleSoft学習旅行

# MuleSoftの世界へようこそ
## MuleSoft = 「Mule」+ 「Soft」

Mule英語では「騾」の意味であり。**騾のように働くソフトウェア**という意味もあります。
つまり、大量の情報とデータを処理し、転送するという機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/60d30875-fe2d-b172-787f-4477338593c4.png)
また、「Mule」では「Messaging Universal Listener Endpoint」の略で、
ユニバーサルなメッセージングリスナーエンドポイントを指し、**郵便局のような、様々な情報源からメッセージを集め、それを適切な目的地に送り届けるソフトウェア**という意味もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/8c55bb82-901b-3ff5-f3a4-56be3fcf4913.png)
つまり、Mulesoftは主に以下の機能を提供するソフトです。
- 大量データを処理・転送機能。
- 様々な情報源を便利につなげる機能。

# MuleSoftの機能：ビジネスを変える力

## Anypoint Platform
### MuleSoft Anypoint Platformは、連携系基盤（ETL）とAPI管理を兼ね備えたプラットフォーム。
従来「EAI/ETL」、「インテグレーションPaaS」、「APIゲートウェイ製品」が提供していた領域を一括でカバーすることができます。
### APIライフサイクル全般を通じて効果的な機能を提供することが可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/bc2884a3-b226-d524-a518-237cae246a9f.png)
### MuleSoftのアーキテクチャは一般的に三層構造に基づいています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343120/8924cb3d-17bb-2b3b-ea45-307e3e03a7a3.png)
- **経験層（Experience Layer）**：この層は、最終ユーザーが直接接触する部分です。これにはモバイルアプリ、ウェブサイト、その他のエンドユーザー向けインターフェイスが含まれます。この層の目的は、ユーザーにとって使いやすく、理解しやすいエクスペリエンスを提供することです。

- **プロセス層（Process Layer）**：この層はビジネスロジックを定義するためのものです。それはデータの取得、変換、組み立てなど、データがどのように処理されるかを定義します。プロセス層はアプリケーションとサービス間での情報の流れを調整し、データの複雑な変換や集成を管理します。

- **システム層（System Layer）**：この最下層は、企業のデータソースやアプリケーションに直接接続します。それらはCRMシステム、データベース、ERPシステムなど、さまざまな形式の内部と外部のシステムを含むことができます。この層の目的は、情報へのアクセスを提供し、それを他の層に渡すことです。

この3層構造は、MuleSoftが如何にしてさまざまなアプリケーション、データソース、およびサービスを効果的に接続し、それらを最終ユーザーにとって使いやすい形で提供するかを示しています。

# 終わりに
最後までお読みいただき、本当にありがとうございました。
Mulesoftに関する、すこし理解できましたら幸いです。気になる点があったらお知らせください。
【2023年05月版】Ubuntuでファイルシステムのチェック

# はじめに

なんか調子がおかしいなぁ、ファイルシステム壊れてるのかなぁ
そうだ、ファイルシステムのチェックをしよう

# パーティションのリスト

- `fdisk -l`

```terminal
$ sudo fdisk -l
Disk /dev/loop0: 61.96 MiB, 64970752 bytes, 126896 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
 :
 :
 :
Disk /dev/sda: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 9BBC7C4D-3D8A-4DC2-9D99-7FDD9037771A

Device       Start      End  Sectors  Size Type
/dev/sda1     2048     4095     2048    1M BIOS boot
/dev/sda2     4096  3719167  3715072  1.8G Linux filesystem
/dev/sda3  3719168 41940991 38221824 18.2G Linux filesystem
 :
 :
 :
Disk /dev/sdb: 20 GiB, 21474836480 bytes, 41943040 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/drbd0: 20 GiB, 21474144256 bytes, 41941688 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
```
# ファイルシステムのチェック

- `fsck`

```export
$ sudo umount /dev/drbd0
$ sudo fsck /dev/drbd0
fsck from util-linux 2.37.2
e2fsck 1.46.5 (30-Dec-2021)
/dev/drbd0: clean, 11/1310720 files, 126322/5242711 blocks
```

# ファイルシステムの修復

- `fsck`
- `-y` フラグで自動的に y 応答
 
```terminal
$ sudo fsck /dev/drbd0
fsck from util-linux 2.37.2
e2fsck 1.46.5 (30-Dec-2021)
ext2fs_open2: Bad magic number in super-block
fsck.ext2: Superblock invalid, trying backup blocks...
/dev/drbd0 was not cleanly unmounted, check forced.
Resize inode not valid.  Recreate<y>? yes
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Block bitmap differences:
 :
 :
 :
Padding at end of inode bitmap is not set. Fix<y>? yes

/dev/drbd0: ***** FILE SYSTEM WAS MODIFIED *****
/dev/drbd0: 11/1310720 files (0.0% non-contiguous), 126322/5242711 blocks
```

# ファイルシステムを壊す

- `dd`

```terminal
sudo dd if=/dev/zero of=/dev/drbd0 bs=512 count=512
```

# リンク

[Ubuntu 22.04 man page fsck](https://manpages.ubuntu.com/manpages/jammy/ja/man8/fsck.8.html)
[Ubuntu 22.04 man page fdisk](https://manpages.ubuntu.com/manpages/jammy/ja/man8/fdisk.8.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/5ea4fde0-b8d0-fc49-c364-00342d2c7e3f.png)
[Unixバックアップ ＆ リカバリ](https://www.oreilly.co.jp/books/4873110491/)

# さいごに

かんたんでしたね
VRChatでロボを作るためのメモ

・疑似全天周モニタ
https://catlikecoding.com/unity/tutorials/octahedron-sphere/
で配布されているようなICO球を用意
前後にカメラを用意して、レンダーテクスチャに貼り付けることで疑似的に全天周モニタにする。
他人にも見えるようにする方法はカメラコンポーネントを一度アニメーションでオンにする必要がある。

・コクピットの揺れ防止
移動モーションによっては胸にカメラを配置した場合、オブジェクトで見えなくなったり、揺れがあるのでRotationConstraintとPositionConstraintで胸に固定した後に、RotationConstraintのFreezeRotationAxesのXだけチェックを外し、他はチェックを入れた状態にすることである程度マシにできる。
↑この方法はVR装着時にカメラがずれてしまうので、アバターの高さをコクピットの高さに変更して、ロボット自体はコクピット部分が動かないアニメーションを使うことでVRでもコクピット視点ができる？
↑実際に試した結果上手くいったが、デスクトップの時の挙動は悪くなる

・レバーの動作
PhysBoneにより他人が動かせるようにできる。ある程度角度制限したほうがいい。

・視点について
VRC AvatarDescriptorの玉をコクピットの位置に持っていっても上手くいかない。
なのでコクピットを配置しているボーン直下にカメラを配置、そのカメラにRotationConstraintをつけることでコクピット内部に入り込んだ視点にできる。

・ビット系の操作
コンセントレイトで機体や機体の周りをぐるぐる回る点に張り付けるとそれっぽい
実質7行でLlamaindex を用いた社内文書の ChatGPT QA ツールを作る

ChatGPTは有用ですが、知っている情報が古いという問題があります。また、社内の独自データは当然ですが学習されておらず、回答に含めることができません。この解決策として、外部データをChatGPTに追加する方法に、以下があります。

1️⃣ Fine-tuning（ファインチューニング）
モデル自体にデータを与えて再学習させる方法です。高い回答精度を持ちますが、現在はGPT3を使用し、API利用料も高めです。

2️⃣ In-Context Learning（インコンテキストラーニング）
チャット文脈に情報を付与して回答を生成する手法です。gpt-3.5-turboを使えば簡単に実装できます。

今回は、社内文書を活用したChatGPTベースのQAツールです。Llamaindexを活用し、Python数行で動かしてみましょう。

SDKをインストール💻🔌
```python
pip install llama-index
```

Open AIのAPIキーを設定🔑🔐
```python
import os
os.environ["OPENAI_API_KEY"] = 'key'
```

LlamaIndexをインポート📚💡
LlamaIndexのバージョン0.5.12から0.6.0へのアップデートに伴い、GPTSimpleVectorIndexからGPTVectorStoreIndexへの変更が行われました。
```python
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
```

インデックスファイルを生成しましょう🗃️✨以下の例では指定ディレクトリ内の文書全部を読み込みインデックスファイルを生成します。LlamaindexはBeautifulsoupのモジュールもあるみたいでスクレイピングも試してみたいですね。
```python
documents = SimpleDirectoryReader('/path/').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
```

クエリを作成しましょう🔍🚀
```python
query_engine = index.as_query_engine()
print(query_engine.query("社長は誰？"))
```

バージョンアップによる変更により、クエリの実行方法にも変化がありました。
以前のバージョンでは、以下のようにクエリを実行していました。
```old.py
print(index.query("社長は誰？"))
```

会社のホームページでも食わせればきちんと社長の名前が出力されると思います。LlamaindexとChatGPTの組み合わせにより、よりスマートで効率的な情報検索が実現できます！ぜひお試しください！🚀✨

フルコードです。
```full.py
# SDK
pip install llama-index

# Open AIのAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = 'key'

# LlamaIndexのインポート
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader

# インデックスファイルを生成
documents = SimpleDirectoryReader('/path/').load_data()
index = GPTVectorStoreIndex.from_documents(documents)

query_engine = index.as_query_engine()
print(query_engine.query("社長は誰？"))
```
Lambda+EventBridgeでEC2再起動

# ■概要
単純な内容ですが、Lambda+EventBridgeを使ったEC2インスタンスの自動再起動を設定します。

停止起動ではなく再起動ですが、停止起動でもほとんど工程は変わらないかと思います。
どなたかのお役に立てば。

# ■今からやる事

EC2インスタンスを毎週朝8時に再起動（reboot）する設定を行います。
以下の4つです。

1.Lambda関数を作成
2.関数用のポリシーを作成
3.EventBridgeのルール作成
4.実行確認

# ■lambda関数を作成

まず初めに関数の作成ですが、名称は「EC2_Reboot」としました。
ランタイムは「python3.9」です。

この時、実行ロールを「基本的な Lambda アクセス権限で新しいロールを作成」で設定すると、下記のようなロールが自動生成されます。
「EC2_Reboot-role-xxxxxx」

ちなみに上記ロールに紐づくポリシーは「AWSLambdaBasicExecutionRole-xxxxxxxxxxxxxxxxxxxxxx」というポリシーで中身はCloudWatch Logsに関わるものでした。
（恐らくこれがないと実行メトリクスが見れない為、注意）

![関数作成_20230528184048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/79a0f149-8549-bc9e-1728-7654a8499ed9.png)

# ■関数の中身

関数の中身ですが、以下のようなシンプルなものにしました。
実行後のログのPUT等も行いません。
インスタンスIDは任意のものを指定してください。

```
import boto3

client = boto3.client('ec2')

def lambda_handler(event, context):
    client.reboot_instances(
        InstanceIds=[
            'i-xxxxxxxxxxxxxx',
        ],
    )
```



ログストリームへの送信を行う場合は下記が参考になります！

Lambda を使用して、Amazon EC2 インスタンスを一定の間隔で停止および起動するにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge


# ■関数用IAMポリシー

関数作成時にロールが自動生成されましたが、インスタンスを再起動する為には別途ポリシーが必要になります。
適したポリシーをロールへアタッチしましょう。

今回はポリシー作成にて、以下のような特定のインスタンスのみの再起動を行う最小限のポリシーを作成し、アタッチしました。
（000000000000の部分はAWSアカウントID、i-xxxxxxxxxxxxxxxはインスタンスIDを指定）

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:RebootInstances",
            "Resource": "arn:aws:ec2:*:000000000000:instance/i-xxxxxxxxxxxxxxx"
        }
    ]
}
```

# ■Event bridge ルール

最後に関数実行のトリガーとなるEvent bridge ルールです。
以下の例では、毎週朝8時となるように設定しています。

![lambda_Event20230528171401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/1c849abe-4738-d36d-7148-8466c678a69c.png)

ターゲット選択画面ではlambda関数を選択し、先ほど作成した関数を指定します。

![ルール作成_20230528190225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954355/b659aea4-19e0-872b-7290-427602d78f48.png)

これで完了です！

# ■再起動されるか確認

関数の実行自体は関数内にあるメトリクスより確認が可能です。

その他、インスタンスの再起動についてはコンソール上では分かりずらい？かと思います。
再起動実行後のインスタンスへ接続し、下記のコマンドを実行する事で確認可能です。

```
$ last reboot
```


【 last 】コマンド――システムのログイン履歴を一覧表示する
https://atmarkit.itmedia.co.jp/ait/articles/1903/22/news031.html

# ■最後に
個人的にはSSMを使用した自動再起動を試したかったんですが、既存ドキュメントにはないのでやるなら少し工夫が必要そうです。
停止、起動であればあるみたいなので是非参考に！

参考：
Lambda を使用して、Amazon EC2 インスタンスを一定の間隔で停止および起動するにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/start-stop-lambda-eventbridge

Systems Manger のメンテナンスウィンドウの使用を開始および停止するように Amazon EC2 インスタンスをスケジュールするにはどうすればよいですか?
https://repost.aws/ja/knowledge-center/ssm-ec2-stop-start-maintenance-window

AWS Boto3 with Python
https://awstip.com/aws-boto3-with-python-57a5e767d4ae
Smart相談室のfont-familyを見てみよう

## font-familyを見たくて仕方がない
Webであろうが、紙媒体であろうが、映像であろうが「これはなんのフォントだろう？」と気になる人間なので、Smart相談室に入社した直後もすぐCSSをガサゴソと漁ります（勉強のためですからね！！）

### ...あった！！！

```css: 一部抜粋だよ
font-family: "Noto Sans Japanese", -apple-system, BlinkMacSystemFont, "ヒラギノ角ゴ Pro", "Hiragino Kaku Gothic Pro", "メイリオ", Meiryo, sans-serif;
```

先頭に燦然と輝く**Noto Sans Japanese** ...嬉しい。一番好きなWebフォントだから。

https://fonts.google.com/noto/specimen/Noto+Sans+JP

### Noto Sansとは？
そもそも「Noto」は「No Tofu（豆腐無し）」という意味で付けられています。
ここで言う豆腐とは食べる豆腐ではなく、コンピュータで表示できない文字を□で表現することを通称”**豆腐**”と読んでいます。
つまり、この”豆腐”で表示される文字を無くそう！という強い意志で開発されたすごいフォントなのです。

https://fonts.google.com/noto

### -apple-system / BlinkMacSystemFont ってどんなフォント？
Noto Sansの次に読み込まれている、 **-apple-system** / **BlinkMacSystemFont** というフォントは実際には存在せず、Appleのシステムフォント（San Francisco）を指します。

https://developer.apple.com/fonts/

**BlinkMacSystemFont** はBlink系のブラウザ向け（Chrome等）にAppleのシステムフォントを有効にするための記述です。

ちなみにAndroid用のフォント指定はしていません。OSバージョンやメーカーによって標準の日本語フォントが異なるためです。

### 後半のフォント指定はどういう意味？

**ヒラギノ角ゴ Pro** はMacOSの標準的な日本語フォント
**メイリオ** はWindowsの標準的な日本語フォント
として設定されています。

最後の**sans-serif** は何も該当するフォントが見当たらなかった場合にデフォルトの書体（ゴシック体）が適用されます。

## 【おまけ】いろんなサイトのfont-familyを気にしてみよう

特にターゲットとなる年代やジャンルがあるようなサイトの場合、違いが顕著に出ます。
例えばこちらのお寺のサイト

https://nakameguro-shogakuji.or.jp/

:flag_jp:日本語では**UD黎ミンL**が採用されています。

https://www.morisawa.co.jp/fonts/specimen/1155

:flag_us:英語では**Cormorant Garamond**が採用されています。

https://fonts.google.com/specimen/Cormorant+Garamond

お寺の持つイメージ（しずかで、厳かな）を大事にしてフォントが選ばれています。

また、近年ではWebフォントでもUD（ユニバーサルデザイン）フォントが扱えるようになったため、よりユーザに配慮したフォント選びができるようになりました:tada::tada::tada:

https://www.morisawa.co.jp/fonts/udfont/

みなさんも是非ポスターやチラシ、雑誌だけでなくWebページのフォントも気にして見てみてください:v:
型の安定化に向けたパラメトリックタイプの活用


juliaで型を安定化するためのテクニックをまとめる。

## 型が不安定になる場合

```julia

function relu(x::Float64)
	if x > 0
		# Float64
		return x
	else 
		# Int64 typeof(0)
		return 0
	end
end
```

```julia
typeof(relu(2rand() - 1))
```


上記を実行すると、 Int64 or Float64　になったりして、型が不安定になる。これだと高速化の妨げになってしまうので、型を安定化するためのテクニックが必要になってくる。

実際に、`@code_warntype relu(2rand() - 1)`を実行すると、以下の表示が出てきて、赤色の箇所が型が不安定であることを示している。
```
MethodInstance for Main.var"workspace#227".relu(::Float64)
  from relu(x::Float64) in Main.var"workspace#227" at /Users/sakurairihito/.julia/pluto_notebooks/Cute experiment.jl#==#82d6ec5e-ea9a-4817-b973-3d76fc787557:1
Arguments
  #self#::Core.Const(Main.var"workspace#227".relu)
  x::Float64
Body::Union{Float64, Int64}
1 ─ %1 = (x > 0)::Bool
└──      goto #3 if not %1
2 ─      return x
3 ─      return 0
```

## 型の安定化


```julia
function relu2(x)
	if x > 0
		# Float64
		return x
	else 
		# Int64 typeof(0)
		T = typeof(x)
		return zero(T)
		#return 0.0
		#return T
	end
end
```

上記の関数は以下と等価である。


```julia
function relu3(x)
	if x > 0
		# Float64
		return x
	else 
		# xを要素とする代数的な演算が入っている集合の加法の単位元を返す。いい感じの0を返す。
		return zero(x) #koredemoyoi
	end
end
```
このままでは、stringのような意図していない型を持つ変数まで許してしまう。
引数を制限すると

```julia
function relu4(x::Float64) 
	if x > 0
		# Float64
		return x
	else 
		return zero(x) 
	end
end
```

となるが、relu4(1.0f0)を実行すると、FLoat32に定義されていないため、エラーが起こってしまう。
このまま不便だから、汎用的な型にしたい。そこで、パラメトリックタイプを活用する気が起こる。

```julia
function relu8(x::T) where T 
	if x > 0
		# Float64
		return x
	else 
		return zero(T) #入力の変数の型を変数だと思ってプログラムの中で使うこともできる。
	end
end
```

常識的なものだけを引数にくるように制限したい、例えば、ストリングは来ないようにしたいので、

```julia
# "where T" は、 "where T <: Any"の略

function relu9(x::T) where T <: Real
	if x > 0
		# Float64
		return x
	else 
		return zero(T) #入力の変数の型を変数だと思ってプログラムの中で使うこともできる。
	end
end
```















## おまけ
`@code_lowered`を使うと、以下の二つの関数は全く同じであることを知ることができる。
```julia
relu(x) = x > 0 ? x : 0
```

```julia
@code_lowered relu(1.0)
```

```julia
function relu2(x)
	if x > 0
		# Float64
		return x
	else 
		# Int64 typeof(0)
		return 0
	end
end
```

```julia
@code_lowered relu2(1.0) 
```

relu1とrelu2は全く同じコードであることが@code_loweredを使えば知ることができる。
ただ、型の情報を知ることができないので、@code_typedを使って知ることが可能になる。

juliaでは、この順番でプログラムの解析が行われている
@code_lowered
@code_typed
@code_llvm
@code_native
Quarkus TestでFailed to create test instanceエラーが出る

# はじめに

Quarkusでテストを書いた際にテスト内容は正しそうなのになかなか通らなかったのでその原因を簡単にまとめます

# 問題

以下のテストを実行したところエラーが出ました

```kotlin:DiaryGatewayTest.kt
package com.sample.gateway

import com.sample.domain.*
import com.sample.driver.DiaryDriver
import com.sample.driver.DiaryJson
import io.mockk.every
import io.quarkus.test.junit.QuarkusTest
import io.quarkus.test.junit.mockito.InjectMock
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions
import java.time.LocalDateTime
import javax.inject.Inject

@QuarkusTest
class GetDiaryGatewayTest {

    @Inject
    private lateinit var target: GetDiaryGateway

    @InjectMock
    private lateinit var driver: DiaryDriver

    @Test
    fun DiaryAPiから取得したJsonをDiaryに変換して返す() {
        var diaryId = DiaryId("1")
        val diaryJson = DiaryJson("1", "test", "body", "author", "2020-02-15T21:30:50")
        val diary = Diary(DiaryTitle("test"), DiaryBody("body"), DiaryAuthor("author"), DiaryReleaseDate(LocalDateTime.parse("2020-02-15T21:30:50")))

        every { driver.findById(diaryId.value) } returns diaryJson
        Assertions.assertEquals(target.findById(diaryId), diary)

    }

}
```

```
 [Error Occurred After Shutdown]: org.junit.jupiter.api.extension.TestInstantiationException: Failed to create test instance
```

Injectあたりがうまく行っていないようでした

# 解決方法

以下のライブラリが間違っていたことでインジェクトができていなかったです

```kotlin
import io.quarkus.test.junit.mockito.InjectMock
↓
import io.quarkiverse.test.junit.mockk.InjectMock
```

# おわりに

同じ名前のライブラリがいろいろあって依存もしているのがいままでにない難しさを感じています
cscの作法 その319

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
スクレイピングを、実装せよ。

# サンプルコード

```
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;

namespace App 
{
	class test {
		static void Scraping(string url) {
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
			Encoding enc = Encoding.GetEncoding("UTF-8");
			WebRequest req = WebRequest.Create(url);
			WebResponse res = req.GetResponse();
			Stream st = res.GetResponseStream();
			StreamReader sr = new StreamReader(st, enc);
			string txt = sr.ReadToEnd();
			sr.Close();
			st.Close();
			Regex re0 = new Regex("<script[^>]*>[^<]+");
			string str0 = re0.Replace(txt, "<***>");
			Regex re1 = new Regex("<(\"[^\"]*\"|'[^']*'|[^'\">])*>");
			string str1 = re1.Replace(str0, "");
			Console.WriteLine(str1);
		}
		static void Main() {
			Scraping("https://blog.qiita.com/");
		}
	}
}



```


以上。
CRC32 ハッシュを理解する： 包括的なガイド


## はじめに

ハッシュ関数は、任意のサイズのデータを固定サイズにマッピングするために使用される、コンピューティングにおける重要なツールである。最も広く使われているのは巡回冗長検査（CRC）アルゴリズムで、データの完全性の確保、エラーコードの検出、データベースの重複の識別などに使用されます。この記事では、CRCアルゴリズムの多くのバリエーションの1つであるCRC32 Hashに特に焦点を当てます。

## CRC32 ハッシュとは？

CRC32ハッシュは32ビットハッシュ関数で、任意のサイズのデータブロックに対して巡回冗長検査を行い、固定長のチェックサムを返します。チェックサムは入力データに対して一意であるため、送信時や保存時にデータが変更されたか、破損したか、意図せず破損したかを検証するのに適しています。

CRC32アルゴリズムは、チェックサムを表す次数32の多項式を生成する数式をベースにしています。この関数は、入力データを反復処理し、チャンクに分割して、各チャンクに対して多項式を用いた計算を実行します。

## 仕組み

CRC32ハッシュでは、入力データを多項式で表現し、それを原始多項式で割り、その余りをハッシュ値として使用します。使用する原始多項式は、あらかじめ定義されているものでも、開発者が定義したカスタムでもかまいません。

CRC32アルゴリズムで得られたハッシュ値は、期待されるハッシュ値と比較することで、データが正しく送信または保存されたかどうかを確認するために使用することができます。

## シナリオ

CRC32 ハッシュは、以下のような様々なシーンで使用されます：

- エラー検出が必要なデータ送信
- ダウンロードしたファイルが破損していないことを確認するためのファイル検証
- データベースやメッセージダイジェストにおける整合性チェック
- データベース内の重複の識別
- システム間のデータ同期

開発者は、CRC32 Hashをアプリケーションで使用することで、データの整合性の検証、データの重複の検出、ファイル全体のチェックサムを迅速かつ容易に行うことができます。

## サンプルコード

ここでは、文字列のCRC32ハッシュを計算する例を紹介します：

```python
import zlib

message = 'Hello, world!'
crc32_hash = hex(zlib.crc32(message.encode('utf-8')))
print(crc32_hash)
```

## 主な特長

CRC32 Hashの主な特徴として、以下のようなものがあります：

- 計算が簡単で速い
- 広く利用されている
- ハッシュの衝突が発生する確率が低い。
- ハードウェアでの実装が容易である

## 誤解とFAQ

CRC32ハッシュは、データの安全性を完全に保証するものであると思われがちです。しかし、CRC32ハッシュはデータの完全性が損なわれているかどうかを検出するだけで、どのように損なわれているかは検出しないことに注意する必要があります。以下は、CRC32 Hashに関するよくある質問です：

**Q: CRC32 Hashを使用して機密データを暗号化できますか？
A: いいえ。CRC32 Hashは暗号化アルゴリズムではないので、機密データの暗号化または難読化に使用すべきではありません。

**Q: 大規模なデータセットに最適なハッシュ関数は何ですか?**?
A: ハッシュ関数の選択は、アプリケーションの特定のニーズによって決まります。大規模なデータセットに適したハッシュアルゴリズムには、SHA256やMD5もあります。

## 結論

CRC32ハッシュはシンプルで高速なハッシュ関数で、データの整合性チェック、エラー検出、データベース内の重複の識別などに広く使用されています。実装が簡単で、ハッシュの衝突が発生する可能性も低い。開発者は、CRC32 Hashを使用して、データの完全性を検証し、意図しない破損、悪意のある改ざん、データの保存エラーなどによる変更を検出することができます。

また、He3 Toolbox ([https://t.he3app.com?n235](https://t.he3app.com?n235)) のCRC32 Hashツールを簡単に使用することができます。

![CRC32 Hash](https://he3.app/images/blog/screenshots/CRC32%20Hash.png)
Products, Quotes, & Contracts > Configure Quotes for Your Customers and Track Contracts


+ [Products, Quotes, & Contracts >Configure Quotes for Your Customers and Track Contracts](https://trailhead.salesforce.com/content/learn/modules/sales_admin_products_quotes_contracts/sales_admin_products_quotes_contracts_unit_2)

# Could not find an Opportunity Line Item for the 'Edge Installation' opportunity with the 'GenWatt Diesel 1000kW' product, quantity of 1 and price of 98,000.

+ [Configure Quotes for Your Customers and Track Contracts](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000QMITd)
+ [Please help... Products, Quotes, & Contracts Configure Quotes for Your Customers and Track Contracts](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000LIsv4)

:::note
2 things i found

1- you need to go to quote and press the sync action 
2- The quantity was right. It's a thing with how comma's and dots are use in Europe vs. US.

1,00 in Europe is 1.00 in US.  (dots and comma's are used other way around).

So that brings the answer that Sales Price $ 98.00 is not right, because it means 98 in US and not 98,000. It's sometimes difficult to see when you don't know the settings of the application you're using: EUR or US.

Could you check this link https://trailblazers.salesforce.com/answers?id=9063A000000t2M2QAI. 
:::

+ [通貨を変更できないみたい](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V000078REuV)

:::note
Got this issue resolved now, by working it on new playground and changing Locale to US and currency to USD$. 
:::

# なぜか問題文がでない

+ [Module: Configure Quotes for Your Customers and Track Contracts - I don't see the challenge instruction](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007A1uWa)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/9047aac3-92e9-7849-2f81-5b861a448516.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/1e0df24b-b44b-2b52-68ba-0593be0d8bb3.png)
クラウド技術の最新動向とエンジニアへの影響

# TL; DR
近年、クラウド技術はエンジニアリング分野で急速に進化しており、その影響はますます大きくなっています。クラウド技術は、インターネットを通じてリソースを提供し、データを保存・処理する仕組みであり、従来のオンプレミス型のシステムとは異なるアプローチを持っています。この記事では、最新のクラウド技術の動向を紹介し、エンジニアに与える影響について解説します。

# 1.クラウドを活用した開発・運用の効率化

クラウド技術を活用することで、エンジニアは開発や運用の効率化を図ることができます。クラウドプロバイダが提供するインフラストラクチャやプラットフォームを利用することで、エンジニアは独自にインフラを構築する必要がなくなります。また、クラウド上での開発や運用には、多くの自動化ツールやサービスが用意されており、これにより、エンジニアは開発のスピードを向上させることができます。

# 2.セキュリティの強化

クラウド技術の進化に伴い、セキュリティの強化も進んでいます。クラウドプロバイダは、高度なセキュリティ対策を実施しており、エンジニアはそれに依存することができます。また、クラウド上では、データのバックアップやレプリケーションなどのセキュリティ機能が簡単に利用できるため、エンジニアはデータの保護を容易に行うことができます。

# 3.スケーラビリティの向上

クラウド技術を活用することで、システムのスケーラビリティが向上します。クラウド上では、リソースを必要に応じて柔軟に追加・削除することができるため、エンジニアはシステムの需要変化に迅速に対応することができます。また、クラウドプロバイダが提供するグローバルなインフラストラクチャを利用することで、地理的な制約を受けずにシステムを展開することができます。

# エンジニアがクラウド技術を活用する上でのメリットや注意点

エンジニアにとって、クラウド技術を活用することには多くのメリットがあります。例えば、開発や運用の効率化により、スピードを向上させることができるほか、セキュリティ対策やスケーラビリティの向上により、安全かつ柔軟なシステムを構築することができます。

しかしながら、クラウド技術を活用する際には注意点も存在します。まず、依存度の高さが挙げられます。クラウドプロバイダに依存することで、システム全体がクラウド上に依存するため、プロバイダの障害やサービス停止などが影響を及ぼす可能性があります。また、クラウド上でのデータ保護やコンプライアンスの確保も重要な課題です。適切なアクセス制御やデータの暗号化を行うことが求められます。

また、クラウド技術は急速に進化しているため、新しいサービスや機能が追加されることもあります。これに伴い、エンジニアは常に最新の知識を持ち続ける必要があります。クラウド技術の変化に対応し、適切に活用するためには、学習やスキルの向上が求められます。

# まとめ

クラウド技術はエンジニアリング分野において急速に進化しており、開発や運用の効率化、セキュリティの強化、スケーラビリティの向上などの面でエンジニアに大きな影響を与えています。一方で、依存度の高さやデータ保護などの注意点も存在します。エンジニアがクラウド技術を活用する際には、メリットや注意点を理解し、最新の知識を持ち続けることが重要です。クラウド技術を活用することで、エンジニアはより効率的かつ柔軟なシステムを構築し、ビジネスの競争力を向上させることができるでしょう。

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
cscの作法 その318

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
wgetを、実装せよ。

# サンプルコード

```

using System;
using System.IO;
using System.Net;
using System.Text;

namespace App 
{
	class test {
		static void Wget(string url) {
			ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
			Encoding enc = Encoding.GetEncoding("Shift_JIS");
			WebRequest req = WebRequest.Create(url);
			WebResponse res = req.GetResponse();
			Stream st = res.GetResponseStream();
			StreamReader sr = new StreamReader(st, enc);
			string txt = sr.ReadToEnd();
			sr.Close();
			st.Close();
			string name = url;
			while (name.Contains("/"))
			{
				int index = name.IndexOf('/');
				name = name.Remove(0, index + 1);
			}
			Console.WriteLine(name);
			StreamWriter sw = new StreamWriter(name, false);
			sw.Write(txt);
			sw.Close();
		}
		static void Main() {
			Wget("https://resolvenet.org/modules/contrib/webform/tests/files/sample.json");
		}
	}
}




```


以上。
Windows 7でSPP

[HC-05がつながったCP/M 8266](https://qiita.com/yamori813/items/6865736b9152a96e925e)をWindows 7のRLoginでアクセスしてみました。

「Bluetooth デバイスの表示」の「デバイスの追加」でごにょごにょしたらデバイスのHC-05が使えるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/06cc86a1-fc58-b099-146b-ac08adec180d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/fbb2fdeb-ffed-e919-cc32-3c8fbab07ce0.png)

RLoginでプロトコルがcomで追加されたCOMを選んで接続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/6642e368-61c6-df2f-3dce-ea3457686e32.png)

Aドライブに入っているXRコマンドはRLoginのXMODEMアップロードで使えるようです。
【解決方法】No route matches {:action=> "show", controller=> "articles", id=>nil}, missing required keys: [id] とは？

Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
アプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
今回のエラーでは`No route matches {:action=> "show", controller=> "articles", id=>nil}, missing required keys: [id]`というエラーの解決方法をお話しします。

![スクリーンショット 2023-05-29 6.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/47b1f253-69fd-7c48-d9b2-55089fb1928a.png)
上記のエラーを解決していきます。

## エラーまでの流れ
アプリケーション内の記事を削除した後、今までトップページに画面遷移してしまっていたので、記事一覧画面にページ遷移するようにコードを変えました。
以下の画像のように`redirect_to root_path,`と書くとTOPページに戻るようにルーティングがされています。
![スクリーンショット 2023-05-29 6.44.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/f6008f6e-72b9-4c11-3629-f1ed4d17b385.png)
このルーティングを変えたらエラーが出てしまいました。
▼変更したコードは以下の画像です。
![スクリーンショット 2023-05-29 6.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/01be2900-8c23-316f-d207-58a4bd384454.png)
上記のように`redirect_to article_path(@article)`としましたが、
![スクリーンショット 2023-05-29 6.28.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/a82445d8-8af5-fc28-5a11-0f8bfb7589ec.png)
上記のようなエラーが出ました。

## エラーの解決方法
▼エラーを詳しく見るためにChatGPTに質問します
![スクリーンショット 2023-05-29 6.37.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/8817c57b-5ad3-734c-d08e-2d8d427b6395.png)



色々試しましたが、解決方法はシンプルでした。
**要はルーティングが正しくないということです**

![スクリーンショット 2023-05-29 6.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/0e607b26-6001-c4a2-d2fd-434e590d6b2a.png)

`http://localhost:3000/rails/info/routes`で、routesを確認します。


今変更した`redirect_to article_path(@article)`というのは**削除した記事に画面遷移させているということになってしまうのでエラーが出ていました。**

なので`redirect_to articles_path(@article)`というようにsを足してarticlesのindexに遷移するようにパスを変更しました。

▼変更したのち、削除ボタンを押してみる
![スクリーンショット 2023-05-29 6.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/34ee386d-d0e9-e5b3-7711-759602a3fbb7.png)

▼記事一覧画面に遷移しました
![スクリーンショット 2023-05-29 6.38.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/d2361b6e-0a2f-7b41-ac22-6ca94c19c0ce.png)

## 最後に
ということで、今回は投稿した記事を削除した後の画面遷移で出たエラーを解決しました。
ルーティングを確認すると解決できることもあるので見直しが必要ですね。
そして、ChatGPTに聞くとエラーのアタリをつけてくれるので、エラー解決までの時間が短縮されたように感じます。

いかがでしたでしょうか？
他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎します。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
それでは。
【AWS CDK】インフラ変更内容をGitHub ActionsでPRに自動コメントする

# 前提
aws cdk v2
typescript

# やりたいこと

aws cdkで構成したインフラ環境の変更点をprで確認したい

# やりかた
github actionsのymlを作成して、起動条件をpull_requestにして
以下の処理を好きなステップに記載


```yaml
# ~省略~
      - name: diff
        run: npm run cdk diff > diff.txt
        env:
          AWS_DEFAULT_REGION: 'ap-northeast-1'
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: Comment PR with CDK Diff
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const fs = require('fs');
            const diff = fs.readFileSync('./diff.txt', 'utf8');
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `CDK Diff:\n\`\`\`shell\n${diff}\n\`\`\``
            });
```

んでprを作成すると動いてるのと比較してくれる。


![スクリーンショット 2023-05-29 6.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/985f21f9-4c83-d390-d8a8-5a6e28fdb62e.png)


作成したものは以下から確認できます

https://github.com/natsumeaurlia/genshin-impact-bonus/blob/master/.github/workflows/cdk_ci.yml
【解決方法】We're sorry, but something went wrong.  If you are the application owner check the logs for more information. とは？

Ruby on rails を学習中の方の参考にしてもらえたら嬉しいです。
アプリケーションを作成している時に出てくるエラーとその解決方法について掲載します。少しでも参考にしていただけると幸いです。
今回はWe're sorry, but something went wrong.  If you are the application owner check the logs for more information. というエラーの解決方法をお話しします。

![スクリーンショット 2023-05-29 5.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/01a747bf-5db0-43cc-d04f-7525bef6890d.png)


## エラーが起きるまで
このエラーが出現したのは本番環境で記事作成を行なった時です

![スクリーンショット 2023-05-29 6.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/1be96767-9ff3-fac7-8e41-8cd412c961cc.png)
このように記事を作って保存ボタンを押したところ最初の画像のような
 `We're sorry, but something went wrong.  If you are the application owner check the logs for more information. `
というエラーがブラウザに現れました。

今回はこのエラーを解決していきます。


## エラーの原因を探る
本番環境でのエラーメッセージなので少し焦りましが、落ち着いていきましょう。
まずはこのエラーがなんなのか？これを確認します。

▼まずは例によりChatGPTに聞きます
![スクリーンショット 2023-05-29 6.07.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/07ed807d-d24f-d390-4fb7-8d64ba7cab9f.png)

上記の画像の中から私が探ったのはコードのエラーです。
なぜなら、このエラーが出た後、記事一覧画面には保存した記事がちゃんと保存されていたのです。
ということはデータベースに保存はできている。
そして、テキストの保存に関係ない、ところのコードミスがあったと考えました。

## エラーを解決していきます
▼開発環境にて**保存**まで進めていくと以下のようなエラーが出ました。
![スクリーンショット 2023-05-29 5.44.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/ab643a0e-5a5f-5c97-a2cc-9ef380babce1.png)
どうやら`image`がおかしいようです。

そして、いろいろ試した結果`@article.images.attach(params[:article][:images])`の中の`@article.images.attach`が`@article.image.attach`になっていたのでsを足しました。

![スクリーンショット 2023-05-29 5.55.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356902/58eccbd3-cc41-e8d2-15b4-9b5c3dd61422.png)


その結果、記事はちゃんと保存ができて、下のページに画面遷移が行われ、アプリが正しく動くようになりました。

## 最後に
いかがでしたでしょうか？
今回は本番環境で発生したエラーを解決しました。
もしかしたらherokuやAmazon AWSのエラーという可能性もありましたが、今回はコードのミスということで解決できました。
最後までお読みいただきありがとうございました。


他にも記事を発信していきますので、私の QiitaやTwitterをフォローしていただけると嬉しいです。
個別の質問もぜひ歓迎します。
私自身、初学者ではありますが、1歩先を行くものとして回答できたらと思います。
それでは。
Yolov8をCoreMLに変換してiPhoneで使う

# 物体検出AIをスマホで使う
Yolov8はポピュラーな物体検出モデルです。
この記事ではYolov８をiOSで使えるようにします。
![May-29-2023 05-56-19.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3d24e9df-9254-bbdd-1cd4-acbfe997e105.gif)

https://github.com/ultralytics/ultralytics

# 方法

Yolov8のインストールとモデルチェックポイントのダウンロード。
（モデルのチェックポイント一覧は上記のultralyticsのリポジトリにあります。）

```shell
pip install ultralytics
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.pt
```        

変換

```python
from ultralytics import YOLO

model = YOLO('yolov8s.pt')  # load an official model
model.export(format='coreml', nms=True)
```

もし以下のエラーが出た場合は、ultralyticsライブラリのyolo/engine/exporter.pyの以下の行を変更します（390行目）。

```python
# f = self.file.with_suffix('.mlmodel')
# ↓↓↓
f = self.file.with_suffix('.mlpackage')
``` 

ptファイルと同じディレクトリに.mlpackageファイル（CoreML）が保存されます。

iOSのカメラで動かすサンプルは以下。

https://github.com/john-rocky/Yolov8-RealTime-iOS/tree/main

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Jestでテストを書く時に注意した小数点の計算について

現在Jestを勉強していますが、テストを記載する際に気をつけないといけないことがあると学んだので備忘録として残します。

## 小数点の計算には気をつける
```typescript:sum.ts
export const sum = (a: number, b: number) => a + b;
```

```typescript:sum.test.ts
test('0.1 + 0.2 returns 3', () => {
  expect(0.1 + 0.2).toBe(3)
})

// 結果
Expected: 3
Received: 0.30000000000000004

　　　　　　6 |
　　　　　　7 | test('0.1 + 0.2 returns 3', () => {
>  8 |   expect(0.1+0.2).toBe(3)
　　　　　　　　　　|                   ^
   9 | })
  10 |
```

理由は、Numberが「IEEE 754 倍精度浮動小数点数」のためです。
とかいたもののピンと自身もピンときていません…笑

:::note info
「IEEE 754 倍精度浮動小数点数」とは1の位より下も2進数で表します。
10進数の0.2は有限小数、2進数では0.0011で循環小数になります。
BigIntは整数のみを扱うことができるためこの問題は発生しない。
Numberを利用する場合は整数のみを利用するか[ライブラリ](https://mikemcl.github.io/big.js/)を使う必要がある。
:::

## 【まとめ】Jestでの小数点の計算について
小数点を計算する際の注意点はJestというよりは、Numberの仕様の話を知っているかだと思います。
これまで気にしなかったことが多いですが、テストを書くことによってJavaScriptの仕様や関数の振る舞いの詳細な部分にまで知識が及ばないと正しいテストコードが書けないのだと知りました。

JavaScriptの仕様を把握していきたいです。
メッセージ キューイング で使われるプロトコル

なんとなくのメモです。

[メッセージキュー - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%AD%E3%83%A5%E3%83%BC)

### MQTT
[MQTT - Wikipedia](https://ja.wikipedia.org/wiki/MQTT)
[MQTTを調べている - Qiita](https://qiita.com/narutaro/items/1837e392ef3255c9d6b2)


### AMQP
[AMQPとは - 意味をわかりやすく - IT用語辞典 e-Words](https://e-words.jp/w/AMQP.html)
[Azure Service Bus での AMQP 1.0 の概要 - Azure Service Bus | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-amqp-overview)
[【仕様を読み解く】第1回 Advanced Message Queuing Protocol (1) ~Types~ - Sansan Tech Blog](https://buildersbox.corp-sansan.com/entry/2020/11/06/110000)

### SBMP
[Azure Service Bus を使用したパフォーマンス向上のためのベスト プラクティス - Azure Service Bus | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-performance-improvements?tabs=net-standard-sdk-2#protocols)


### HTTP
割愛
2023/5/29主にITとかセキュリティの記事

ウィズセキュア、サイバー犯罪の調査レポートを発表(5/26)
https://enterprisezine.jp/news/detail/17814

「辞書に載っている単語を含めてはいけない」「120日ごとに新しくパスワードを設定すること」などバカげたパスワードのルールを持つサイトを集めた「Dumb Password Rules」(5/27)
https://gigazine.net/news/20230527-dumb-password-rules/

保安点検すら拒否していた韓国選管に昨年だけで4万件のサイバー攻撃(5/26)
https://www.chosunonline.com/site/data/html_dir/2023/05/26/2023052680119.html

厚生労働省を名乗るフィッシングサイトへの注意喚起について(5/25)
https://www.city.oshu.iwate.jp/soshiki/49/62281.html

米警告、中国ハッカー組織が重要インフラを攻撃/米軍司令官 習氏に台湾侵攻の再考を呼びかけ など｜NTD ワールドウォッチ（2023年5月27日）
https://www.epochtimes.jp/2023/05/153505.html

「トロイの木馬スパイウェアに感染している」　ニセ電話詐欺、伊万里市の60代女性が被害　伊万里署発表(5/27)
https://news.yahoo.co.jp/articles/808d2f284fd69f9af3819f8061df21701efbec7e?source=rss

「パスワードは長めにして」小学生がすごろくのゲーム形式でサイバーセキュリティを学ぶ　愛知・豊山町(5/26)
https://newsdig.tbs.co.jp/articles/cbc/508035

中国のネットでしばしば見かける「momo」って一体誰？(5/26)
https://www.recordchina.co.jp/b914644-s6-c30-d0189.html
【UE5】Sequencerの親クラスを作成し、テンプレート化を行う方法

## はじめに
UEのシーケンサーではBPで作成したイベントを指定フレームで実行することが可能で
イベントは以下の二つの方法で作成することができ、それぞれ利点と欠点があります。

## 方法①イベント実行のアクターを配置し、アクター側からイベントを実行させる

**利点：**
**アクターを編集することで他シーケンサーでも使いまわすことが可能**

**欠点：**
**アクターにイベントが紐づくため、イベントの量が増えるほど視認性が悪くなってしまう**
**新規シーケンサーを作成の際に再度BPの再配置が必要**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/161f34e7-2284-5e52-19ec-6408d938943c.png)

## 方法②シーケンサーの親クラスを変更し、親クラスのイベントを使用する

**利点：**
**親クラスにイベントを追加するので、シーケンサー複製で同一のイベントをそのまま使いまわせる**
**イベントがシーケンサーに紐づくのでイベントのチャンネルの配置が自由になる**

**欠点：**
**プロジェクトが肥大化すると親クラスがどんどん大きくなってしまう**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/bdc55626-6b60-18ef-eabe-28ce1443d094.png)

本記事ではこちらの作成方法を記載します。

### 1. クラスを作成する

プログラム側にULevelSequenceDirectorを継承したクラスを作成する

```MyLevelSequenceDirector.h
#include "LevelSequenceDirector.h"

UCLASS()
class MYPROJECT_API UMyLevelSequenceDirector : public ULevelSequenceDirector
{
	GENERATED_BODY()

public:
	UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
	void CharacterMove();
	virtual void CharacterMove_Implementation() {}
};
```

BP側の作成でも可能ですが、プログラム側でしか触ることができない関数も多いためプログラムで作成を推奨します。

### 2. 継承するアクターを作成する

ブループリントクラスを作成し、先ほど作成したクラスを指定して生成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/5c7836e2-040e-663a-2810-a9c69138e523.png)

関数を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/98595fb7-27f6-5125-28d9-cb531bbc9820.png)

### 3. Sequencerに親クラスを設定する

シーケンサーを作成し、BPを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/1964928f-17b1-a94c-eb7f-bbaf2c69d28a.png)

クラス設定から先ほど作成したアクターを親クラスにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/2f546363-91dd-3651-eb29-9ce705f41a3e.png)

### 4. シーケンサーで親クラスで作成したイベントを追加する

親クラスに作成した関数を更新することで、すべてのシーケンサーに対して更新を反映させることが可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/c3d1fa5f-c787-1398-54d7-772d1b8084fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/5fe36d31-5002-43e6-6475-ae9e9d230a8b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275167/c6e04ec3-112c-b337-8619-4a5648554ff2.png)

この方法であれば、シーケンサー内で使用する関数の管理の手間が楽になるかと思います。

大量のシーケンサーを作成する場合は事前に空のシーケンサーを作成してテンプレート化することも有効です。
BaseDB ライセンスタイプの変更

# 説明
Base DBのライセンスタイプの変更とは、Base DBの課金をライセンスインクルードであったものをBYOLにする、もしくはその逆のことになります。
こちらは、コンソール上からオンラインで簡単に実施することができます。本記事ではこちらの手順を紹介します。
一方、補足ですが、エディションの変更、例えばSEからEEやEEからEE-HPなどの変更は、バックアップからのDB作成によって実施する形となります。

# ライセンスタイプの変更

「DBシステムの詳細」画面から、「他のアクション▼」を選択し、その中から「ライセンス・タイプの更新」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/117f93e9-fcb7-dc98-1e25-39a9ab0c3c35.png)

現在選択されてライセンスタイプが薄い青で選択されている状態になっているので、切り替えたい方のライセンスタイプを選択して、「変更の保存」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/d8f20ec6-5684-52f6-41d0-6bf5d3203801.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/faa755cc-d4ba-d348-c43b-fd91638bdb69.png)

短時間で更新されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85051/d5476ad1-89dd-340e-80a4-ee15709a384c.png)
AnacondaでTkinterのローカルフォントを利用する


# 環境情報
|OS |Linux Mint 21.1 Cinnamon|
|---|---|
|Anaconda|conda 23.3.1|
|Python|Python 3.10.11|

# 読者層

Anacondaを使用してPythonのTkinterを利用する方。

# 手順

シンボリックリンクを作成して解決を図ります。
以下のコードを実行します。Linuxのシェルコマンドを使用する。事前に自分のanacondaや諸々のパスを確認して下さい。

``` shell
$ mv ~/anaconda3/lib/libtk8.6.so ~/anaconda3/lib/libtk8.6.sav
$ ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so ~/anaconda3/lib/libtk8.6.so
```
解説：Anacondaのlibtk8.6.soをlibtk8.6.savにしてバックアップを取り、次にシステムのlibtk8.6.soファイルへのシンボリックリンクをAnacondaのディレクトリ内に作成しています。

また、Anacondaで複数の環境を作成している場合、作成した各環境に対して同様の事を行う必要があるので、`hogehoge`という環境を作成している場合、以下のようなコマンドを実行します。(適宜`hogehoge`を書き換えて下さい。)

``` shell
$ mv ~/anaconda3/envs/hogehoge/lib/libtk8.6.so ~/anaconda3/envs/hogehoge/lib/libtk8.6.sav
$ ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so ~/anaconda3/envs/hogehoge/lib/libtk8.6.so
```
これで使えるようになるはず。

※**注意点**
Anacondaやその他の関連パッケージを更新すると、この設定が上書きされる可能性があるので、更新後は再度この手順を実行するなどの処置が必要。

# 原因

When building our software we need python built very early, well before anything graphical gets built. Adding Freetype as a dep for tkinter causes a cycle in the build graph and we can no longer build the distro.
(引用元:https://github.com/ContinuumIO/anaconda-issues/issues/6833)

ということらしいです。

日本語にすると

ソフトウェアをビルドする際、グラフィック系のものがビルドされるよりもかなり早い段階でpythonがビルドされる必要があります。FreetypeをtkinterのDEPとして追加すると、buildgraphにループが生じ、そのdistroをビルドできなくなります。
(deepL使用)

# 参考

下のページ非常に参考になります。

https://github.com/ContinuumIO/anaconda-issues/issues/6833

ご意見・ご指摘、感想などがありましたら、コメントお願いします。
FBX SDK を利用してボーン名だけをひたすら抽出するプログラム

https://note.com/hibit_at/n/n543f7445386b

　これの調査で使用したプログラムです。FBX SDK の環境構築についてはこちらを参照。

https://qiita.com/hibit/items/0602c507f02d2f6037f7

```python
import os
import csv
import FbxCommon

root_directory = "your working directory"  # input your working directory
output_file = "bone_data.csv"


def process_fbx_file(file_path, csv_writer):
    manager, scene = FbxCommon.InitializeSdkObjects()
    result = FbxCommon.LoadScene(manager, scene, file_path)
    if not result:
        print("Error loading file: {}".format(file_path))
        return
    root_node = scene.GetRootNode()
    process_node(root_node, file_path, csv_writer)


def process_node(node, fbx_name, csv_writer):
    attribute = node.GetNodeAttribute()

    if attribute and attribute.GetAttributeType() == FbxCommon.FbxNodeAttribute.eSkeleton:
        print("Found armature: {}".format(node.GetName()))
        for child_index in range(node.GetChildCount()):
            child_node = node.GetChild(child_index)
            print("Bone: {}".format(child_node.GetName()))
            # Write the FBX file name and bone name to the CSV file
            csv_writer.writerow(
                [os.path.basename(fbx_name), child_node.GetName()])
    for child_index in range(node.GetChildCount()):
        process_node(node.GetChild(child_index), fbx_name, csv_writer)


if __name__ == "__main__":
    with open(output_file, "w") as f:
        writer = csv.writer(f)
        writer.writerow(["fbx_name", "bone_name"])
        for dirpath, dirnames, filenames in os.walk(root_directory):
            for filename in filenames:
                if filename.endswith(".fbx"):
                    file_path = os.path.join(dirpath, filename)
                    try:
                        print("Processing file: {}".format(file_path))
                        process_fbx_file(file_path, writer)
                    except:
                        print('file name error!')
```
[AWS Q&A 365][SNS]AWSのよくある問題の毎日5選 #69

# 1. Amazon SNSのメッセージバッチングとは何ですか？
答え：メッセージバッチングは、Amazon SNSにおいて、複数のメッセージを一つのメッセージにグループ化して効率的に配信する機能です。メッセージのパブリッシュに必要なリクエスト数を減らし、全体のスループットを向上させることができます。

# 2. Amazon SNSで配信ステータスのロギングをどのように設定できますか？
答え：配信ステータスのロギングは、AWS管理コンソールを使用して設定することができます。これにより、トピックにパブリッシュされ、購読者に配信されたメッセージのステータスを追跡することができます。Amazon SNSのエンドポイントに購読されたトピックの配信ステータス属性をAWS SDKを使用して表示することができます。

# 3. Amazon SNSでメッセージの重複排除はどのように機能しますか？
答え：メッセージの重複排除は、Amazon SNSの機能で、一意のメッセージのみが購読者に配信されることを保証します。これはメッセージIDを使用して重複メッセージを識別し、配信前にそれらを破棄します。メッセージの重複排除は、FIFOトピックに対してデフォルトで有効化されています。

# 4. Amazon SNSのデッドレターキュー(DLQs)とは何ですか？
答え：デッドレターキュー（DLQs）は、Amazon SNSで、意図した受信者に配信できないメッセージを取り扱うために使用されます。これらは失敗したメッセージを保存し、レビューする方法を提供し、メッセージ配信の問題の特定と解決に役立ちます。DLQsは、サブスクリプションとトピックのために設定することができます。

# 5. Amazon SNSで生のメッセージ配信をどのように有効にできますか？
答え：生のメッセージ配信は、AWS管理コンソールを使用して有効にすることができます。これにより、追加の処理や整形なしで、その原形のままメッセージを送信することができます。生のメッセージ配信は、特別な処理が必要なメッセージやバイナリデータを含むメッセージに有用です。
[AWS Q&A 365][SNS]Daily Five Common Questions #69

# 1. What is message batching in Amazon SNS? 
Answer: Message batching is a feature in Amazon SNS that enables grouping of multiple messages into a single message for efficient delivery. It reduces the number of requests needed to publish messages and can improve overall throughput. 

# 2. How can you configure delivery status logging in Amazon SNS? 
Answer: Delivery status logging can be configured using the AWS Management Console. It allows you to track the status of messages that have been published to a topic and delivered to subscribers. You can view delivery status attributes for topics subscribed to Amazon SNS endpoints using the AWS SDKs. 

# 3. How does message deduplication work in Amazon SNS? 
Answer: Message deduplication is a feature in Amazon SNS that ensures that only unique messages are delivered to subscribers. It uses a message ID to identify duplicate messages and discards them before they are delivered. Message deduplication is enabled by default for FIFO topics. 

# 4. What are dead-letter queues (DLQs) in Amazon SNS? 
Answer: Dead-letter queues (DLQs) are used in Amazon SNS to handle messages that cannot be delivered to their intended recipients. They provide a way to store and review failed messages, and can help identify and resolve issues with message delivery. DLQs can be configured for subscriptions and topics. 

# 5. How can you enable raw message delivery in Amazon SNS? 
Answer: Raw message delivery can be enabled using the AWS Management Console. It allows you to send messages in their original format without any additional processing or formatting. Raw message delivery is useful for messages that require specialized handling or that contain binary data.
【情報セキュリティ】RSA暗号アルゴリズム

# ０．はじめに											
大学で情報セキュリティの講義を受講している者です。
"広く浅く"情報整理したいため投稿。
内容のレベルは超入門編、個人的な感情も少し入り混じった備忘録。

# １．RSA暗号アルゴリズム
「暗号解読が難しい」だったり何かと数式がごちゃごちゃしていたので調べてみた
解読時に素因数分解が必要とされる理由を理解
簡単な数字を用いて例を記述

# ２．手順

##	①.受信者が公開鍵・秘密鍵を生成する
初動は**受信者**から発信する
流れを理解するため以下を扱う
<font color="#1e90ff">**青文字は計算例**</font>


変数|数値|意味
|---|---|---|
a|7|秘密鍵
b|5|秘密鍵
c|5|秘密鍵
x|35|公開鍵
y|5|公開鍵

- ``互いに素とは``
最大公約数が1のこと

##### 1.素数a,bを任意に取る
異なる2つの大きな素数``a b``

##### 2.計算をする
``x = ab``
<font color="#1e90ff">7 × 5 = 35</font>

##### 3.自然数yを任意に取る
``(a-1)(b-1)``と最大公約数が共に1の自然数``y``
<font color="#1e90ff">(a-1)(b-1) = 24
ｙを5とする</font>

##### 4.自然数cを任意に取る
``yc ÷ (a-1) (b-1)``の結果が余り1の自然数``c``
<font color="#1e90ff">25 ÷ (7-1) (5-1) = 25 ÷ 24 = 1余り1</font>

##	②.送信者のメッセージ暗号化	
受信側から受け取った公開鍵である``x``と``y``を使う
流れを理解するため以下を扱う

変数|数値|意味
|---|---|---|
z|12|送りたいメッセージ
d|17|**★暗号文**

##### 1.自然数``z``を任意に取る、ただし``z < x``を満たす
<font color="#1e90ff">35より大きい必要があるためz = 12とする</font>

##### 2.計算をする
``zのy乗 ÷ x``をした余りを``d``とする
<font color="#1e90ff">12を5乗し35で割ると余りが17になる</font>

##	③.受信者がメッセージを復号
暗号文``y``を復号し平文を入手する

##### 1.計算をする
``dのc乗 ÷ x``の余りが**平文**
<font color="#1e90ff">17の5乗 ÷ 35 = 余りが12（平文）</font>

## ３．ポイント
復号するためには``cが``必要
``c``を取得するためには``a,b``が必要
``a,b``を知るためには``x``を素因数分解が必要
よって``x``を素因数分解しなければならない
<font color="red">**この「素因数分解」に膨大な時間を必要とするため解読は不可能とされている**</font>


## ４．解読する方法は本当に無いか
（編集中）
【Git】submoduleの使い方


## 追加

リポジトリにサブモジュールを追加するには次のコマンドを実行します。

```terminal
git submodule add サブモジュールのリポジトリURL サブモジュールのディレクトリ
```

```
git submodule add https://github.com/user/sample-submodule.git sample/sample-submdules
```

上記を実行した後に`.gitmodules`ファイルが作成され`sample/sample-submodules`の中に`https://github.com/user/sample-submodule.git`の内容がcloneされます。

## 削除

削除する際には次の手順を実行します。

```terminal
$ git submodule                           
 4a3a41a70aeeb503f56cf7ba486235b6fao28af2 sample/sample-submodules (4a3a41a)
$ git submodule deinit sample/sample-submodules
$ git rm -f sample/sample-submodules
```
CoreDNS docker

CoreDNS を dockerで動かす

```yaml
services:
  coredns:
    image: coredns/coredns:1.10.1
    container_name: coredns
    configs:
      - source: coredns
        target: /Corefile
    networks:
      core-dns:
        ipv4_address: 172.16.238.10

  alpine:
    image: alpine:3.18
    tty: true
    networks:
      core-dns:
    dns:
      - 172.16.238.10

configs:
  coredns:
    file: ./Corefile

networks:
  core-dns:
    ipam:
      driver: default
      config:
        - subnet: "172.16.238.0/28"
```

### Corefile

```Corefile:Corefile
. {
    whoami
    errors
    log . "{proto} {remote} Request: {name} {type} {>id}"

    template IN A app.example.com {
        match "^([^\.]+)\.app\.example\.com\.$"
        answer "{{ index .Match 1 }}.app.example.com. IN A 192.168.10.10"
        fallthrough
    }

    hosts {
        192.168.10.11 a.example.com
        192.168.10.12 b.example.com
        fallthrough
    }

    forward . 1.1.1.1 8.8.8.8
    reload
}
```
CML2.5 on VMware ESXi(ダウンロードから検証に必要な準備まで）

- 下記に関連記事を全てまとめております。適宜追加していきます。

https://liberation-of-se-like-slaves.net/%e3%80%90nw%e3%80%91cml2-5%e3%81%ae%e3%83%80%e3%82%a6%e3%83%b3%e3%83%ad%e3%83%bc%e3%83%89%e3%81%8b%e3%82%89%e8%b5%b7%e5%8b%95%e3%81%be%e3%81%a7vmware-esxi%e7%b7%a8/

https://liberation-of-se-like-slaves.net/cml2-5_license_activate/


https://liberation-of-se-like-slaves.net/esxi_cml2-5_security/

https://liberation-of-se-like-slaves.net/%e3%80%90%e3%82%b9%e3%82%af%e3%82%b7%e3%83%a7%e4%bb%98%e3%81%8d%e3%80%91cml2-5%e3%81%a7breakout-tool%e3%82%92%e4%bd%bf%e3%81%86%e6%96%b9%e6%b3%95%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e8%a7%a3%e8%aa%ac/

https://liberation-of-se-like-slaves.net/cml2-5%e3%81%aealpine-linux%e5%88%9d%e6%9c%9f%e8%a8%ad%e5%ae%9a%e7%94%a8%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e4%b8%80%e8%a6%a7/
AWS FastAPI+Lmabda+APIgateway+DynamoDBで簡単にTODOアプリのBackendを構築した話②

### 前回の内容
https://qiita.com/Kazu758/items/f3e8589380b5f6ab37b5

### database.py

```
import boto3
from botocore.exceptions import ClientError

# Get the service resource.
dynamodb = boto3.resource('dynamodb')

# Instantiate a table resource object
table = dynamodb.Table('todos')

def get_items():
    try:
        response = table.scan()
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        return response['Items']

def create_item(item):
    try:
        response = table.put_item(Item=item)
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        return response
```

### main.py

```
from fastapi import FastAPI
from mangum import Mangum
from starlette.middleware.cors import CORSMiddleware
from .models import Item
from .database import get_items, create_item

app = FastAPI(root_path="/dev")

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # or ["*"] for all origins
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.get("/todo/")
async def read_items():
    items = get_items()
    return items

@app.post("/todo/")
async def add_item(item: Item):
    response = create_item(item.dict())
    return response

handler = Mangum(app)
```

### models.py
```
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str = None
    completed: bool = False
```

### deployしてみる
- AWSの設定は、割愛
```
- デプロイコマンド
serverless deploy

- リソースの削除
serverless remove
```

### 結果の確認
  - APIgatewayのエンドポイント/dev/docs　にアクセスすると下記のようにSwaggerが表示されればOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2919838/4dad9fb7-7a54-ec45-a0b5-591b5ff34070.png)

### 詰まった点
- DynamoDBへの書き込み権限（デプロイ後に手動で付け足した。。。）
- 困ったらCloudWatchでログを確認（ローカルで動作確認していないため、、）、
- おそらく、環境構築が一番つらい。。
- Dockerを起動しておく必要がある
- CORSの設定 serverless.ymlとFastAPI側にCORSの設定を追加する必要がある
- FastAPIのCORSの設定

### 最後に
- Pythonは、簡潔にかけて、すごい楽しい。
- 最近は、業務でソースを書いていないから、書けて満足した
- AWSは、もっと学習して活用していきたいと改めて思った
- 業務では、サーバレスアーキテクチャをあまり、取り入れてはいないが、ネットワークを構築しないで良いのは非常に楽
- Docker等を用いて、ローカルでもテストできるような環境をつくるべきだったと、ちょっと後悔した。。
- serverless frameworkをfrontendでも作成したが、frontendとbackendでそれぞれ別のバージョンで動かす必要がある（バグなのか、環境のせいなのか不明）

何かあれば、Twitter @Kazu_e_aws にDMいただけますと、幸いです。