OmniAICreator/Qiita-1.07M huggingface dataset:
AWS Bedrock入門：簡潔に理解するクラウドコンピューティングの基礎

## AWS Bedrockとは :beginner:
AWS Bedrockは、Amazon Web Services（AWS）が提供するAI/MLサービスの一部で、機械学習モデルのデプロイ、管理、および運用を簡素化するための機能を提供します。これにより、開発者は複雑なインフラの管理をせずに、迅速にAI/MLモデルを活用したアプリケーションを開発・展開できます。

<img width="25%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3690843/e5346773-7831-201d-27df-f4c268298013.png">

### 【AWS Bedrockの特徴】
簡単なセットアップ
AWS Management Console、AWS CLI、またはAWS SDKを使用して数分でモデルをデプロイ可能。

高可用性と耐障害性
マルチAZ配置により、モデルの可用性と耐障害性を確保。障害時には自動的にフェイルオーバーが実行されます。

スケーラビリティ
モデルのスケーリングが容易。需要に応じてインスタンス数を自動で増減させることができます。

自動モニタリングとアラート
モデルのパフォーマンスや利用状況を自動的にモニタリングし、異常が発生した場合にはアラートを送信。

セキュリティ
VPC、IAM、KMSなどのAWSサービスを使用して、データとモデルを保護。強力な暗号化とアクセス制御が可能。

### 【利点と制約】
メリット
AI/MLモデルの迅速なデプロイメント、高可用性、スケーラビリティ、強化されたセキュリティを提供し、運用管理の負担を軽減します。

デメリット
特定のカスタマイズや設定には制約があり、オンプレミスの環境と比較して一部の機能に制限がある場合があります。

### 【開発者へのメリット】
AWS Bedrockを使用することで、開発者はモデルのインフラ管理をAWSに委託し、アプリケーション開発に専念できます。また、自動モニタリングやアラート機能により、モデルのパフォーマンス管理が容易になります。

### 【モデルのデプロイ方法】
AWS Bedrockモデルは、AWS Management Console、AWS CLI、またはAWS SDKを使用してデプロイできます。デプロイ時にはモデルのバージョン、インスタンスタイプ、スケーリングオプションを選択し、セキュリティグループを設定します。

### 【スケーリングとバックアップ】
スケーリングオプション
需要に応じてインスタンス数を自動で増減させることができます。アプリケーションの要件に応じて適切なスケーリングポリシーを設定します。

バックアップ
モデルと関連データのバックアップとリストア機能を提供。データの安全性と可用性を確保します。

### 【まとめ】
AWS Bedrockは、その簡便さ、高可用性、スケーラビリティにより、クラウドベースのAI/MLモデル管理において重要な役割を果たしています。開発者はAWS Bedrockを活用することで、モデル管理の負担を減らし、アプリケーション開発により多くの時間を割くことができます。

最後に
何か間違いがございましたらご指摘お願いいたします。閲覧いただきありがとうございました。
# 【参考】
https://aws.amazon.com/jp/bedrock/
AlmaLinux9でスワップ容量を変更する方法

![sw001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668800/88b09c8b-bfe9-bbb2-0e3e-b7d999075d3f.png)


今回はAlmaLinux9でスワップ容量を変更する方法についてご紹介致します。

## 現在のSWAP容量を確認する

初めに現在のSWAP容量を確認します。

下記コマンドを使用する事でスワップ容量を確認できます。

```
free -m
 ```

上記テスト環境で実行すると以下の様になりました。

```
               total        used        free      shared  buff/cache   available
Swap:           4095         157        3938
 ```

 現在設定されている値は「4G」となっております。

 また下記コマンドを使用する事でも確認する事が出来ます。

```
lsblk
```

## SWAPをオフにする

次に現在有効となっているSWAPをオフにします。

下記コマンドを使用する事でオフにする事が出来ます。

```
swapoff -a
```

上記実行後、再度SWAP容量を確認すると下記の様に0になっている事が確認できます。

```
#コマンド
free -m

#結果
               total        used        free      shared  buff/cache   available
Swap:              0           0           0
```

## スワップ署名を削除

次にスワップ署名を削除を行います。

下記コマンドを使用する事で削除可能となっております。

パスについては環境に合わせてご変更お願い致します。

```
#コマンド
wipefs -a /dev/main/swap

#結果
/dev/main/swap: 10 bytes were erased at offset 0x00000ff6 (swap): 53 57 41 50 53 50 41 43 45 32
```

## SWAP容量を変更する

次にスワップの容量を変更を行います。

容量を増やす場合は「lvextend」を使用します。容量の縮小を行う場合は「lvreduce」コマンドを使用します。

今回は「1G」縮小した「3G」に変更したいと思います。

下記コマンドとなります。

```
#コマンド
lvreduce -L -1G /dev/main/swap
```

## スワップ領域の再設定

次にスワップ領域の再設定を行います。

下記コマンドを使用し領域の設定を行います。

```
mkswap /dev/main/swap
```

次にスワップ領域の有効化設定を行います。

下記コマンドを使用し有効化を行います。

```
swapon -v /dev/main/swap
```

上記で容量の変更は完了となります。

## スワップ領域の確認

再度、freeコマンドにて確認するとSwap容量が減っている事が確認できます。

```
#コマンド
free -m

#結果
               total        used        free      shared  buff/cache   available
Swap:           3071           0        3071
```
AWSの障害情報をSlackにリアルタイム通知するCloudFormationテンプレートの実装

# はじめに

AWSを利用していると、サービスの障害情報を迅速に把握することが非常に重要です。本記事では、AWSの障害情報をSlackに通知する仕組みを、CloudFormationを使って構築する方法を紹介します。この仕組みを導入することで、障害発生時に対応することが可能となり、システムの信頼性を向上させることができます。

以下が今回紹介するCloudFormationテンプレートのコードです。このテンプレートを使用することで、AWS HealthDashboardからの障害情報をSNSトピックを通じてSlackに通知する設定を自動で行うことができます。

```template.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: AWS-health-check

Resources:
  # Chatbot
  HealthCheckChatbot:
    Type: AWS::Chatbot::SlackChannelConfiguration
    Properties:
      ConfigurationName: health_notification
      SlackChannelId: "**********"
      SlackWorkspaceId: "**********"
      IamRoleArn: !Sub arn:aws:iam::${AWS::AccountId}:role/chatbot-role
      GuardrailPolicies:
            - !Sub arn:aws:iam::${AWS::AccountId}:policy/guardrail-role
      SnsTopicArns:
        - !Ref HealthCheckTopic

  # SNS Topic
  HealthCheckTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: health_notification
      KmsMasterKeyId: "alias/key-sns"

  HealthCheckTopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties:
      Topics:
        - !Ref HealthCheckTopic
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: "Allow"
            Principal:
              Service: "events.amazonaws.com"
            Action: "sns:Publish"
            Resource: !Ref HealthCheckTopic
            Condition:
              ArnEquals:
                aws:SourceArn: !Sub arn:aws:events:ap-northeast-1:${AWS::AccountId}:rule/eventbridge_cloudformation

  HealthCheckTopicSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Endpoint: https://global.sns-api.chatbot.amazonaws.com
      Protocol: HTTPS
      TopicArn: !Ref HealthCheckTopic

  # EventBridge
  HealthCheckEventRule:
    Type: AWS::Events::Rule
    Properties:
      Name: health_notification
      EventPattern:
        source:
          - "aws.health"
        detail-type:
          - "AWS Health Event"
      State: ENABLED
      Targets:
        - Arn: !Ref HealthCheckTopic
          Id: "HealthCheckTarget"

```

# 各リソースの説明

### HealthCheckChatbot
このリソースはAWS Chatbotを設定し、Slackのチャンネルに通知を送るための設定を行います。SlackChannelIdとSlackWorkspaceIdはご自身のSlackワークスペースの情報を入力してください。
また、IamRoleArnにはAWS Chatbotが使用するIAMロールを指定します。

### HealthCheckTopic
SNSトピックを作成します。このトピックがAWS HealthDashboardからの通知を受け取り、Slackに転送する役割を担います。

### HealthCheckTopicPolicy
このリソースはSNSトピックに対するポリシーを設定し、Amazon EventBridgeがSNSトピックにメッセージを発行できるようにします。

### HealthCheckTopicSubscription
SNSトピックに対するサブスクリプションを作成します。エンドポイントとしてAWS ChatbotのAPIを指定し、通知をSlackに送信します。

### HealthCheckEventRule
EventBridgeのルールを設定し、AWS HealthからのイベントをキャッチしてSNSトピックに送信します。

### KMSの設定
SNS Topic内で設定するKMSキーは、デフォルトのAWS マネージド型キーだと権限が足りないためEventBridgeからメッセージを受信することができません。
そのため、カスタマー管理型のキーを作成する必要があります。
```
KmsMasterKeyId: "alias/key-sns"
```
具体的にどんな権限が必要かというと
```
{
    "Sid": "Allow Eventbirdge",
    "Effect": "Allow",
    "Principal": {
        "Service": "events.amazonaws.com"
    },
    "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
    ],
    "Resource": "*"
}
```

# さいごに
無料のAWSアカウントだと障害情報の通知が届かないので気をつけてください。
MSペイントだけでセガの暗号を解読する方法


## MSペイント使ってますか？

私は**PhotoShopよりMSペイント**だと思っている世界でたった1人の人間です。

MSペイントを使えばかくかくとした味のある絵をかくことができます。**Doomer**という世界的なキャラクターも生み出しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/be05310a-f20c-ccc8-78a1-f6929113d64d.png)

そんなMSペイントを使って**セガからの暗号を解読することに成功**しました。

## こちらがセガの暗号です

X上で共有されたセガからの暗号はこちらになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/56d93e15-ef20-e8ff-4334-12a943583765.png)


こちらを`MSペイント`を使えば秒で解決できます！

## やり方は縦横比を維持せずサイズ変更するだけ！

### 1. まずMSペイントの「サイズ変更」を選択します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/768ebfa6-902d-e733-5994-32b8f506beea.png)

### 2. 縦横比を維持するチェックボックスを外します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/08eba93d-7efc-e9a4-2aef-ee72657eafb9.png)


### 3. 水平方向に10,垂直方向に100を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280363/dc569566-2779-47e2-3314-ea5052415f7f.png)


### すると。。。なんと。。。

この謎の答えは読者のあなたの手でやってみて導き出してみてください。
ISO/IEC 27000 情報セキュリティマネジメントシステム（SCP財団パロ）


機密、完全、可用。

:::note info
資格の勉強のために、ややこしい概念を復習している。
ある程度ストーリーがないと俺は数字が全然頭に入ってこないのでSCP風にしてみた。
:::

**アイテム番号:** ISO/IEC 27000
**オブジェクトクラス:** Safe

**特別収容プロトコル:** ISO 27000シリーズに定められる事項に留意し、情報資産の管理を行ってください。情報の機密性、完全性、可用性は適切に維持される必要があります。

## 説明
ISO/IEC 27000は、国際標準化機構（ISO）および国際電気標準会議（IEC）が定めた情報セキュリティマネジメントシステムに関する一連の規格です。

>エージェント・布川：ISO9000とかISO14000は概要が問われたりしているようなのだが、27000に関しては、細かいものではなく用語の定義について問われた実績があるので、先に用語を確認しておくことにする。

## 情報セキュリティの三要素（機密性・完全性・可用性）

- 機密性（Confidentiality）
機密性は、情報が許可された個人、プロセス、またはシステムにのみアクセスできることを保証します。情報の不正なアクセスや漏洩を防ぐことが目的です。

損なわれている例：うわ、この管理文書、セキュリティ・クリアランスにかかわらず見ることができるぞ。

- 完全性（Integrity）
完全性は、情報が正確であり、認可された方法のみで修正されることを保証します。情報の改ざんや破壊を防ぐことが目的です。

損なわれている例：SCP-488-JPが管理方法を書き換えやがった！

- 可用性（Availability）
可用性は、必要なときに情報や情報システムにアクセスできることを保証します。情報やシステムが必要なときに利用可能であることを確保することが目的です。

損なわれている例：サーバーがダウンしてて文書が読めないんだが！？

## +α（機密性・完全性・可用性に加えて、責任追及性・真正性・否認防止・信頼性）

- 責任追及性（Accountability）
責任追及性は、システムの利用者の行動を追跡し、その責任を明確にすることを指します。ログ管理や監査機能により、誰が何を行ったかを記録し、後で確認できるようにします。

損なわれている例：おい、このロックを解除しやがったバカは誰だ！？
（誰がやったのか発覚しない場合、責任追及性が損なわれている。）

- 真正性（Authenticity）
真正性は、情報の送信者や受信者、あるいは情報そのものが本物であることを保証します。これにより、情報やシステムが信頼できることを確認できます。

損なわれている例：「あっ、このメール。よくログを追跡すると日本生類創研から送られてきてやがる！」
（メールの送信元が偽装されている場合、真正性が損なわれている。）

- 否認防止（Non-repudiation）
否認防止は、情報の送信者がその送信を否認できないようにすることを指します。これにより、送信者が後でその行為を否認することを防ぎます。

損なわれている例: 「いや、俺はそんな指示を出してない！」
（システムにログが残っていない場合、否認防止が損なわれている。）

- 信頼性（Reliability）
信頼性は、システムや情報が常に正確かつ一貫して機能することを保証します。これにより、システムが期待どおりに動作し、情報が正確であることが確保されます。

損なわれている例: 「このシステム、二回に一度は違うエラーログが出るんだが」
（システムが安定して稼働しない場合、信頼性が損なわれている。）

# 定義群

以下の定義については細かいことを問われたりはあまりしないようだが、ざっと一読しておくくらいは有用だろう。

## ISO/IEC 27000(JIS Q 27000)
**目的:** 定義。
**内容:** 規格群の概要と用語集。

布川博士：ゼロ番目が定義であるのはほかの規格と同様である。

## ISO/IEC 27001(JIS Q 27001)
**目的:** 情報セキュリティ管理策の要求事項を定める。
**内容:** 要求事項を定めている。

「情報セキュリティ方針」「アクセス制御」「暗号化」など、具体的な要求事項が定められており、要求事項を満たすとISMS認定を取得することができます。

## ISO/IEC 27002(JIS Q 27002)
**目的:** 情報セキュリティ管理策の実践のための規範を定める。
**内容:** 情報セキュリティ管理策の実践のための規範。

## ISO/IEC 27014(JIS Q 27014)
**目的:** 情報セキュリティガバナンスを定める。
**内容:** 情報セキュリティガバナンス。

## ISO/IEC 27017(JIS Q 27017)
**目的:** クラウドサービスにおける情報セキュリティ管理策の実践の規範を定める。
**内容:** ISO/IEC 27002 に基づくクラウドサービスのための情報セキュリティ管理策の実践の規範。

# 参考
[【試験対策】JIS Q 27000シリーズの覚え方](https://qiita.com/mkt_hanada/items/c3ec1c4fafa772ff135e)
[ITパスポート試験ドットコム　ISO/IEC27000](https://www.itpassportsiken.com/word/ISO_IEC_27000.html)
[ISOプロ ISO27000シリーズとは？各規格の概要をご紹介！](https://activation-service.jp/iso/column/2216)
【OutSystems】同じ環境内で同じコンポーネント（Forge）を複数バージョン使用する方法

# 同じ環境内で同じコンポーネントを複数バージョン使用したいシチュエーション
* 現在環境にインストールされているコンポーネントバージョンと別バージョンで検証したいとき
* バージョンアップ前にバージョンアップして問題ないかを検証したいとき
* 現在環境にインストールされているコンポーネントのコンシューマモジュールが様々な事情で更新できないけれども、別バージョンのものを使用したいとき
# 留意事項
以下で実際の手順を紹介するが、同じ環境内で同じコンポーネントを複数バージョン使用することは**サポート対象外**であり、予期しない動作につながる可能性があります。
実際にサポートとやりとりしていた際にご教授いただきました。
# 手順
#### 1.ブラウザでForgeにアクセスする
#### 2.使用したいForgeを見つけて詳細ページに移動する
#### 3.Versionsタブより使用したいバージョンの「Download」ボタンを押してローカルPCに.oapファイルをダウンロードする
　Service StudioのForgeタブではできないので、必ずブラウザで行う
#### 4.ダウンロードした.oapファイルの拡張子を「.zip」に変更する
#### 5.zipファイルを解凍して.omlファイル（モジュール）を取り出す
#### 6.取り出した.omlファイルを開く
#### 7.モジュール名を既にインストールされているバージョンと重複しないように変更する
* **既にインストールされているバージョンと同名でパブリッシュすると上書いてしまう**ので、確実に行う
* どのバージョンなのかわかるように末尾に「_{バージョン}」を付与するのを推奨する
#### 8.パブリッシュする
* この時点ではパブリッシュしたモジュールはIndependent Modulesに配置される
* 取り出した.omlファイル分6から8の手順を繰り返す
#### 9.適切なアプリケーションタイプのアプリケーションを作成する
* モジュールの内容やアプリケーションタイプ次第でモジュールを配置できない場合がある
* どのバージョンなのかわかるようにアプリケーション名の末尾に「 {バージョン}」を付与するのを推奨する
#### 10.Independent Modulesに配置されたモジュールを作成したアプリケーションに移動する
【個人メモ】Supabase と Firebase の比較

## ■ Supabase や Firebase とは？
アプリケーションを開発する上で、バックエンドの機能（認証、DB、ストレージなど）を簡単に構築出来るサービスです。
これらを mBaaS（Mobile Backend as a Service）と言います。
又、Supabase は 2024年4月15日に一般提供（GA）を開始しました。（画像は Supabase の中の方、タイラーさんのツイート）

https://x.com/dshukertjrjp/status/1779823230079123622

私は Firebase を少し触ってましたが、これを機に Supabase を触ってみようと思いざっくり比較してみました。

## ■ Supabase と Firebase の比較

### データ構造の違い

- Firebase：NoSQL を使用しているため、柔軟なデータ構造が特徴
- Supebase：PostgreSQL を使用しているため、複雑なデータ処理（クエリ）でも対応可能

### 料金体系の違い （Freeプランを除く）
- Firebase：従量課金制
- Supebase：定額制

![20240621_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/d714b89a-446f-7629-2cd6-099b2931ef31.png)

![20240621_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3282990/03a46307-68b4-e7cc-3ccd-229e021ce570.png)


### 機能の違い （PUSH通知）

Firebase：提供している
Supebase：提供していない（但し、iOS に送るには APNs、Android に送るには FCM を経由すれば出来るみたい（未検証））

### 開発元の違い
- Supebase：OSS
- Firebase：Google

### 分析に関して
Firebase：Google Analytics があるから優勝では？
Supebase：独自の分析機能は提供していない

### 検索
- Firebase：苦手
- Supebase：得意（PostgreSQL（RDSベース）なため、複雑な検索も問題なし）

## ■ まとめ
個人的には、データ構造と料金体系の違いが特に大きいかな。と思いました。
ミニマムな個人開発なら Firebase、中規模あるいは商用アプリなら Supebase という立ち位置が良いのかな。
規模（プロダクト）が大きくなればなるほどコストも気になりますし、複雑なデータ検索もするとなった場合 Supebase の方が優勢な気がします。
まだ実際に Supabase をゴリゴリ触っている訳ではないので、これから色々触ってみようと思います。

終わり。
M1 Mac上のVSCodeでDev Containerを立ち上げたらBuildエラーが出た

# はじめに
M1 Mac上のVS Codeのコンテナ開発環境構築ツールであるDev Containerを立ち上げようとしたらエラーが出るようになり対応したので、その解決策を備忘録として残します。

# 発生したエラーと対応したこと

まずはじめに下記のエラーが発生しました。

```bash
open /Users/{user_name}/.docker/buildx/current: permission denied
```

調べてみたところ、ファイルの所有者がrootになっているため発生していたことがわかったので、コマンドで所有者の変更をして解決しました。

```bash
sudo chown -R $(id -u) ~/.docker/buildx/current
```

https://qiita.com/take8/items/941ab5af54b6a832b100

2回目のビルドでも同様のエラーが発生しました。

```bash
open /Users/{user_name}/.docker/buildx/activity/default: permission denied
```

2回目のエラーも1回目と同じ要領でファイルの所有者の変更を行うことで解決しました。

```bash
sudo chown -R $(id -u) ~/.docker/buildx/activity/default
```

3回目のビルドでは下記のエラーが発生しました。

```bash
mkdir /Users/{user_name}/.docker/buildx/refs/default/default: permission denied
```

権限変更の対象が多くなるのでやり方は若干変わりますが、1~2回目と同じく所有者を変更することで解決しました。

```bash
sudo chown -R $(id -u):$(id -g) ~/.docker/buildx/refs
```
このコマンドを簡単に説明すると、ディレクトリ内のサブディレクトリやファイルの所有者を一括で変更しています。


https://forums.docker.com/t/permission-denied-error-when-building-docker-image-in-mac-os/138215

以上の対応で、M1 Mac上のVSCodeでDev Containerを立ち上げることが出来るようになりました。

# さいごに
誰かのお役に立てれば幸いです。
Rails：パーシャルでインスタンス変数を使用してはいけない理由

### 読んで欲しい人
- パーシャルにインスタンス変数を書いてエラーになった人
- 過去の自分

### 動作環境
- MacOS 14.5
- ruby 3.3.0
- Rails 7.1.3.3
- psql (PostgreSQL) 14.11

### 課題
- 下記のコードにレビューをいただいた

```ruby:_post.html.haml
# パーシャルファイル
.p-4.d-flex.flex-column.justify-content-center.mt-6
  .post-container.p-3
    .mb-3
      = @user.name
```

レビュー内容：　パーシャルでインスタンス変数をつかわないように

### なぜダメか

**理由1**

そもそもパーシャルの利用目的は、

**viewの一部を切り出して、再利用するためのもの**

なので、
インスタンス変数をパーシャルの中で使用してしまうと、他の部分で再利用ができない。

**理由2**

キャッシュの効率が悪い

Railsではパーシャルを呼び出すタイミング(render)で、キャッシュを生成してくれています。

:::note info
- キャッシュとは(ざっくり)
よく使用するデータを保存して、すぐに使用できるようにしたもの。
今回の場合は、パーシャルの内容をキャッシュとして保存してくれる。
:::

キャッシュを作成するにはキャッシュキーが必要になるが、
インスタンス変数だと毎度その値が違うため、キャッシュとして保存しても実際は違うビューが表示されたりする。
効率が悪い


### 解決方法

1. このパーシャルを利用するファイルで、ローカル変数を定義する
2. ローカル変数に対して、インスタンス変数を渡してあげる

```ruby
= render 'post', post: @post
```

### 学び・感想

- ダメなのは知っていたが、なぜか？までは知らなかったので理解できて良かった
- 何度も注意されているので気をつけたい

### 参考記事
https://techracho.bpsinc.jp/hachi8833/2023_03_20/128403
【Shopify】別テーマをブラウザで開く

## はじめに
Shopifyは管理画面からプレビューを利用しないと、下書き中のテーマを見られません。
また、プレビューリンクもある程度の期間が過ぎると見られなくなってしまいます。
そこで、今回は下書き中のテーマを表示する方法を紹介します。

### ブラウザで表示したいテーマを選ぶ
表示したいテーマのカスタマイズ画面を開いたら、URLを確認してください。
https://admin.shopify.com/store/ドメイン/themes/1234567890/editor
のようなURLが表示されます。

現在のストアを表示していただき、ドメインの後ろに
?preview_theme_id=
のパラメータを追加し、
/themes/の後ろにある数字を入れてください。

なので以下のようになります。

:::note warn
キャッシュが強いので、シークレットウィンドウで表示するようにしてください。
:::

ドメイン?preview_theme_id=1234567890
こちらのURLで下書き中のテーマをブラウザで表示できます。
Windows 11 24H2 on ARM での環境構築・動作検証

Snapdragon X Eliteを搭載したLenovo Yoga Slim 7x Gen 9で開発環境を構築してみました。他のSnapdragon X Eliteを搭載したCopilot+ PCでも大きな違いはないかと思います。

実際のインストールに関する説明は、各ソフトウェアの名称からリンクを張ってあります。

下記のアーキテクチャはタスクマネージャで確認したもの＋カッコ内はMicrosoft Storeのシステム要件中のアーキテクチャを記載
- x64(Arm)と書かれているのは、Microsoft Storeのシステム要件中のアーキテクチャではArmと記述されているのに対し、タスクマネージャーのアーキテクチャではx64であることを示しています
- x64(x86)と書かれているのは、Microsoft Storeのシステム要件中のアーキテクチャではx86と記述されているのに対し、タスクマネージャーのアーキテクチャではx64であることを示しています
- ARM64アーキテクチャと記述されていても、x86/x64で動作している別アプリと連携している場合もあります

# 動作が確認できたもの
|名称|バージョン|アーキテクチャ|コメント|
|----|----------|--------------|--------|
|[1Password](https://qiita.com/mfunaki/items/8eb8a0a713f619360258)|8.10.35|x64(x64,Arm)|[Microsoft Store](https://apps.microsoft.com/store/detail/XP99C9G0KRDZ27?ocid=pdpshare)からインストール|
|Discord|308381|x64(x86)|[Microsoft Store](https://apps.microsoft.com/store/detail/XPDC2RH70K22MN?ocid=pdpshare)からインストール|
|[Docker Desktop](https://qiita.com/mfunaki/items/adbd171ff59b16e893eb)|4.31.1|ARM64|ダウンロードエラーに注意。REGDB_E_CLASSNOTREGに関してはWSLを参照。|
|Galaxy Buds|5.9.2.0|ARM64(x86,x64,Arm,Arm64)|[Microsoft Store](https://www.microsoft.com/store/productId/9NHTLWTKFZNB?ocid=pdpshare)からインストール。SamsungがARM版Windowsに対応したGalaxy Bookを出していることもあり、対応は良好|
|Kindle|2.4.70904|x86|Amazonの[ダウンロードサイト](https://www.amazon.co.jp/kindle-dbs/fd/kcp)からダウンロードしてインストール|
|LINE Desktop|9.1.0.3377|x86(x86)|[Microsoft Store](https://apps.microsoft.com/store/detail/XPFCC4CD725961?ocid=pdpshare)からインストール|
|Samsung Account|1.23.12130.0|ARM64(x64,Arm64)|[Microsoft Store](https://www.microsoft.com/store/productId/9P98T77876KZ?ocid=pdpshare)からインストール。SamsungがARM版Windowsに対応したGalaxy Bookを出していることもあり、対応は良好。WiFiやBluetoothの接続情報をGalaxyスマートフォンと共有可能。|
|Slack|4.39.89.0|ARM64(Arm64)|[Microsoft Store](https://www.microsoft.com/store/productId/9WZDNCRDK3WP?ocid=pdpshare)からインストール|
|Spotify Music|1.241.434.0|ARM64(Arm64)|[Microsoft Store](https://www.microsoft.com/store/productId/9NCBCSZSJRSB?ocid=pdpshare)にあるArm64版がプリインストール済み|
|Visual Studio Code|1.90.2|ARM64(x64,Arm64)|[Microsoft Store](https://apps.microsoft.com/store/detail/XP9KHM4BK9FZ7Q?ocid=pdpshare)からインストール|
|Visual Studio Enterprise 2022|17.10.3|ARM64|特に問題なし|
|[WSL](https://qiita.com/mfunaki/items/615e4bd5b356230164c1)|2.2.4.0|Arm|REGDB_E_CLASSNOTREGに注意|
|Zoom Workplace|6.1.1|ARM64(x86,x64,Arm64)|[Microsoft Store](https://apps.microsoft.com/store/detail/XP99J3KP4XZ4VV?ocid=pdpshare)からインストール|
|楽天Koboデスクトップ|4.37.19051|x86|楽天Koboの[ダウンロードサイト](https://cdn.kobo.com/downloads/desktop/Rakutenbooks/kobosetup.exe)からダウンロードしてインストール|

# 動作しなかった、インストールできなかったもの
|名称|バージョン|アーキテクチャ|コメント|
|----|----------|--------------|--------|
|Google Drive|||Googleドライブの[ダウンロードサイト](https://dl.google.com/drive-file-stream/GoogleDriveSetup.exe)からダウンロード。インストールしようとすると、インストーラーが「このWindowsアーキテクチャはサポートされていません」と出力。|

# リンク
- [「Snapdragon X」搭載PCでゲームは動くか？ ひたすら試した](https://forest.watch.impress.co.jp/docs/serial/sspcgame/1605138.html)
Windows 11 on ARMに1Passwordをインストール

Snapdragon X Eliteを搭載したLenovo Yoga Slim 7x Gen 9に1Passwordをインストールしてみました。他のSnapdragon X Eliteを搭載したCopilot+ PCでも大きな違いはないかと思います。

# インストール
1. Microsoft Storeから[1Password - Password Manager](https://apps.microsoft.com/store/detail/XP99C9G0KRDZ27?ocid=pdpshare)を検索する。
1. システム要件のアーキテクチャにArmが入っていることを確認する。
![スクリーンショット 2024-06-21 183006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/85cb29b1-126a-a393-dc02-c7f28033d0f8.png)

1. インストールボタンをクリックする。

# 起動確認
1. スタートメニューから1Passwordを起動する。
タスクマネージャー上ではアーキテクチャはx64ということで、ARM64ネイティブではないようですが、問題なく動作しているようです。
![スクリーンショット 2024-06-21 185632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/9bfcc1dc-a97b-8c69-b6d4-eecb4b49bbf6.png)

# その他
アカウントの初期設定時に(長いシークレットキーを入力するのは大変なので)、スマホ上にインストールされている1Password上で「別のデバイスをセットアップ」機能を使い、QRコードを表示させ、PC上の1Passwordで読み取らせたい場合には、カメラ設定の背景の効果などをオフにしておく必要があります(QRコードがぼやけてしまう)。
![スクリーンショット 2024-06-22 074615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/19248/8fb56389-b7bf-cf74-80f2-8c5bbfb29269.png)

# リンク
- [Windows 11 24H2 on ARM での環境構築・動作検証](https://qiita.com/mfunaki/items/6ee512eaefafec562754)
【PowerBI】オリジナルスライサー de かんたん昨対比

# はじめに

こんにちは！株式会社コズムでデータアナリストをしています。岸本です。
今回はBIツールであるPowerBIで昨対比をする際の注意点と解決策をご紹介いたします。

データ分析の際、前年のデータと当年のデータを比較することがあると思います。しかしその対比、果たして本当に同条件でしょうか？

![](https://storage.googleapis.com/zenn-user-upload/757d7f53aeaf-20240621.png)

2024年の6月は数値が17日までしか存在しないため圧倒的に数値が減っています...

## 例えばこんな課題ありませんか

例えばこの記事作成時点（2024/6/18）では同条件で前年対比をするには期間を

- 当年
    - 2024/4/1~2024/6/18
- 前年
    - 2023/4/1~2023/6/18

と設定する必要があります。

この設定をすることで現段階の前年と比べたKPIなどが正確に評価できます。

![](https://storage.googleapis.com/zenn-user-upload/adac380a7074-20240621.png)

**このような操作を弊社では「オンハンド」と呼んでいます。**

しかし、こんなことありませんか…?

## 前年ってどんな数値をとっていったの？

先ほどの「オンハンド」の欠点は前年がこの先にとる数値を見ることができないことです。

7月の予算を建てたい！

といった要望に応えられません。

昨対比もしつつ、前年同日以降の数値も見たいとなると…

## どちらも見られるようにすれば！？

「オンハンド」の表・グラフも、3月末までの着地の表・グラフどちらも見ることができれば無問題ですね！

2ページに分ける。複数のマトリックスを作る。などやり方は様々ですが弊社で採用しているものは…

## スライサーで切り替える！

ずばり！スライサーで切り替えることです！

名付けて **「オンハンドスライサー」！！**

スイッチ一つで切り替えることができる**優れもの**です。

<img width="600" src="https://storage.googleapis.com/zenn-user-upload/0b3969fde823-20240621.png">


いやー我ながら良い機能ですね（笑）

# 作り方

それではこのスライサーの作り方を説明します！

リレーションなど色々なアプローチがありますが今回はテーブルとDAX関数を用いたものをご紹介します。

### 1. スライサー用のテーブルを作成

Power Queryにて新しいテーブルを作ります。

列名、テーブル名はお任せします。

<img width="250" src="https://storage.googleapis.com/zenn-user-upload/c98a3548d501-20240621.png">

これでスライサーに用いるテーブルができます

### 2. スライサーを作成

a. スライサーのフィールドに先ほど作った列を入れます
    
ビジュアルの問題で「スライサー（新規）」を使っていますが、通常のスライサーでも構いません。
    

<img width="150" src="https://storage.googleapis.com/zenn-user-upload/654967a61411-20240621.png">

b. フィルターを用いて項目「OFF」を省きます

<img width="150" src="https://storage.googleapis.com/zenn-user-upload/faaee22af478-20240621.png">

※スライサーの「設定の選択を必須にする」や「すべて選択」の表示などはオフにしてください

### 3. DAX関数を変更する

作成したスライサーで値が動くように設定をします

```jsx
2022_金沢_降水量 = 
VAR onhand = IF(ISBLANK(SELECTEDVALUE('onhandSlicer'[onhand])),DATE(2023,4,1)-1,DATE(2022,MONTH(TODAY()),DAY(TODAY())))
RETURN
CALCULATE(
    SUM('金沢'[降水量の合計(mm)]),
    '金沢'[年月日] >= DATE(2022,4,1),
    '金沢'[年月日] <= DATE(2023,4,1)-1,
    '金沢'[年月日] <= onhand
)
```

これでオンハンドスライサーが選択されてないときはオフに、選択されたときは同月日までの数値がでるようになりました！

# まとめ

以上がPowerBIで前年データとの昨対比を簡単に行う方法です。もちろんPowerBIのみではなく他のBIツールやExcelでの分析においても役立つのではないでしょうか？この機能を使えば利便性の高いビューになること間違いなしです！ぜひお試しください！

## 参考資料

使用したデータセットや参考にした資料、公式ドキュメントなどを紹介します。

[用いたCSVファイルサイト](https://www.data.jma.go.jp/risk/obsdl/)
Vue.js の Computed プロパティ: Composition API での効率的なデータ処理

Vue.js の Computed プロパティは、**他のプロパティやメソッドの値に基づいて計算された値を返す**ための機能です。

### 1. Computed プロパティの基本

```vue
<script setup>
import { ref, computed } from 'vue';

const firstName = ref('名無し');
const lastName = ref('太郎');

const fullName = computed(() => {
  return `${firstName.value} ${lastName.value}`;
});
</script>

<template>
  <div>
    <h1>フルネーム: {{ fullName }}</h1>
  </div>
</template>
```

- `computed` 関数を使用して、Computed プロパティ `fullName` を定義します
- `fullName` は、`firstName` と `lastName` の値を結合してフルネームを計算します
- テンプレート内で `fullName` を直接参照できます

![スクリーンショット 2024-06-21 18.34.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2544275/25ebe4c1-1d48-d2da-03ce-8e435a294305.png)

上記画像のように**名無し 太郎**と出力されます。


### 2. `get` と `set` メソッド

```vue
<script setup>
import { ref, computed } from 'vue'

const count = ref(0)

const doubleCount = computed({
  get() {
    return count.value * 2
  },
  set(newValue) {
    count.value = newValue / 2
  }
})
</script>

<template>
  <div>
    <p>ダブルカウント: {{ doubleCount }}</p>
    <p>カウント: {{ count }}</p>
    <input type="number" v-model.number="doubleCount" />
  </div>
</template>
```

- `get` メソッドは、Computed プロパティの値を取得します
- `set` メソッドは、Computed プロパティの値を設定します
- この例では、`doubleCount` を設定すると、`count` の値も適切に更新されます



### 3. 依存性の追跡

```vue
<script setup>
import { ref, computed } from 'vue';

const price = ref(1000);
const discount = ref(10);

const discountedPrice = computed(() => {
  return price.value - (price.value * discount.value / 100);
});
</script>

<template>
  <div>
    <p>割引価格: {{ discountedPrice }}</p>
    <input type="number" v-model.number="price" />
    <input type="number" v-model.number="discount" />
  </div>
</template>
```

- `discountedPrice` は、`price` と `discount` に依存しています
- どちらかの値が変更されると、`discountedPrice` が自動的に再計算されます

### まとめ

複雑な計算やデータ処理を行う必要がある場合は、computedを使用することでコードの可読性が上がるため積極的に使いたいと感じました。
JavaScriptでfetch()メソッドが使えない

# はじめに
VSCodeでfetch()メソッドを使おうとしたところうまく実行できなかったため、原因と対策をまとめます。

# エラー内容
以下のようなソースコードでjsonファイルを読み込もうとしたらエラーが発生しました
```javascript:main.js
async function foo() { 
  const jsonData = await fetch('./foo.json');
  return await jsonData.json();
} 
```
```:エラー内容
Access to fetch at 'xxxxxx from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted.
prefectures.json:1 
Failed to load resource: net::ERR_FAILED
main.js:2 
```

# 原因
fetch()メソッドがローカルファイルシステムから直接ファイルを読み込むことを許可していないため。

# 対策
以下の通りVSCodeの拡張機能でローカルサーバを立ち上げて実行する。

VSCodeの拡張機能でLive Serverをインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/04521a23-f208-12d3-036e-bd566f9085fd.png)

開きたいhtmlファイルを右クリック→Open with Live Serverをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/316ff897-a0f4-e448-9a77-4948eac1580b.png)

これによりHTTP(S)プロトコルを介したリソースの取得が可能になり、fetch()メソッドが使えるようになります。
Hexabase TypeScript SDKの使い方（全文検索）

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

この記事ではHexabase TypeScript SDKのインストールと、全文検索機能の使い方を解説します。全文検索はフィールド関係なく検索でき、添付ファイルも含めて検索できます。

## インストール

インストールはnpmやyarnを使って行います。

```bash
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```jsx
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```jsx
const client = new HexabaseClient();
```

## 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。emailとパスワード、またはトークンが必須です。

```jsx
await client.login({email, password, token});
```

後はこの `client` に対して処理を行います。

## データストアについて

データストアは、データベース機能になります。Hexabaseでは最上位にワークスペースがあり、その下にプロジェクト、そしてプロジェクトの下にデータストアがあります。

```jsx
// ワークスペースを設定
await client.setWorkspace('demo');
// プロジェクトを取得
const project = await client.currentWorkspace.project('demoProject');
// データストアを取得
const datastore = await project.datastore('demoTable');
```

## 全文検索

全文検索はデータストアに対して行います。プロジェクトに対して（データストア全体）もできますが、現時点ではSDK側が対応していません。また、フィールドを指定した検索にも対応していないので注意してください。

```jsx
const { totalCount, items, hightlights } = await datastore.globalSearch('検索ワード');
```

2つ目の引数を使って、細かく絞り込み条件を設定できます。指定できるパラメーターは下記を参照してください。

```
category            : "items", "files", "histories" のいずれかを指定する。指定しない場合は、すべてが検索対象となる。
                      "items"         : Item内のデータを検索
                      "files"         : 添付ファイル内の文字を検索
                      "histories"     : Itemの履歴コメントを検索
return_item_list    : trueを指定すると、該当したItemに対して、[ItemList](/docs/v0/items/ItemList) で検索した結果を返却する
item_search_params  : ItemListの絞込条件や、ソート、ページネーションパラメータを指定可能（下記参照）
```

`item_search_params` では、 [ItemList | Hexabase API ガイド](https://apidoc.hexabase.com/docs/v0/items-search/ItemList#payload)に記載されているパラメーターを指定できます。

### レスポンス

`globalSearch` のレスポンスは次のようになります。

- totalCount: 検索結果の総数
- items: 検索結果のアイテムデータ
- hightlights: 検索結果にマッチした部分の配列

hightlightsの構造は以下のようになっています。

```ts
interface GlobalSearchHighlightResponse {
  category: string;
  fieldName?: {
	en: string;
	ja: string;
  };
  fileName?: string;
  highlightValue: {
    [key: string]: string[];
  };
  item: Item;
}
```

## 注意点

全文検索対象のフィールドについて、設定で「全文検索に含める」を有効にしてください。これはフィールド毎に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/8d506009-79b0-971b-f801-485c86f9ef08.png)


## まとめ

全文検索は業務システムで良くあるニーズですが、実装は意外と面倒です。Hexabaseを使えば、添付ファイルやデータストア全体の全文検索が簡単に実装できます。

Hexabaseには他にもFaaSや、ステータス管理などの機能があります。それらの機能も利用してください。

[Hexabase \| 新規事業向け開発・競争領域でのDX実現をサポート](https://www.hexabase.com/)
Rubyのクラス

Rubyのデータ（値）は、オブジェクトであり
オブジェクトは何かしらのクラスに属しています。
オブジェクトがどのクラスに属しているのかは
```.例
"Hello World".class
```
例のようにclassメソッドを使うことによって知ることができます。
ruby文字列

Rubyで文字列を作るには
基本的にシングルクォート（'）、もしくはダブルクォート（”）で囲む
```.例
"ダブルクォートで囲う。"
'シングルクォートで囲う。'
```
コンソールで囲わずに入力するとエラーになる
PythonでCSVファイルをPDFドキュメントに変換する方法

CSVは構造化データをシンプルなテキスト形式で保存および交換するのに優れていますが、プレゼンテーションやフォーマット機能が不足しています。一方、PDFは異なるデバイスやプラットフォーム間で一貫した視覚表現を保証し、画像やハイパーリンクの埋め込みが可能で、簡単に共有、印刷、アーカイブできます。さらに、PDFは暗号化オプションを通じてより高いレベルのセキュリティを提供し、機密データの配布に適しています。Pythonを使用することで、この変換プロセスを自動化し、ワークフローの生産性とドキュメント管理の柔軟性を向上させることができます。本記事では、**Pythonコードを使用してCSVファイルをPDFドキュメントに変換する方法**について説明します。

- **[PythonでCSVをPDFに変換する](#pythonでcsvをpdfに変換する)**

この記事で使用する方法には、[Spire.XLS for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)が必要です。PyPIからインストールできます：`pip install Spire.XLS`。

[無料ライセンスを申請する](https://www.e-iceblue.com/TemLicense.html)

## PythonでCSVをPDFに変換する
このライブラリを使用すると、`Workbook.LoadFromFile()`メソッドを使ってCSVファイルを読み込み、`Workbook.SaveToFile()`メソッドを使ってPDFドキュメントとして保存できます。
CSVファイルにはフォーマット設定が含まれていないため、適切にフォーマットされた変換結果を得るために、行や列の自動調整などの基本的なフォーマットを行ってからPDFドキュメントとして保存することをお勧めします。
Pythonを使用してCSVファイルをPDFドキュメントに変換する具体的な手順は以下の通りです：
1. 必要なモジュールをインポートします。
2. `Workbook`クラスのオブジェクトを作成し、`Workbook.LoadFromFile()`メソッドを使用してExcelファイルを読み込みます。
3. `Workbook.Worksheets.get_Item()`メソッドを使用して最初のシートを取得します。
4. CSVファイルを1ページのPDFに変換するために、変換モードを`SheetFitToPage`に設定します。
5. 変換結果を改善するために基本的なフォーマット設定を行います。
6. `Workbook.SaveToFile()`メソッドを使用してCSVファイルをPDFドキュメントとして保存します。
7. リソースを解放します。

コード例
```python
from spire.xls import *
from spire.xls.common import *

# Workbookオブジェクトを作成
workbook = Workbook()

# CSVファイルを読み込む
workbook.LoadFromFile("Sample.csv", ",")

# 最初のシートを取得
sheet = workbook.Worksheets.get_Item(0)

# CSVファイルを1ページのPDFに変換するためにページフィッティングを設定
workbook.ConverterSetting.SheetFitToPage = True

# フォント形式を設定
sheet.AllocatedRange.Style.Font.FontName = "HarmonyOS Sans SC"
sheet.AllocatedRange.Style.Font.Size = 12

# 行と列の自動調整
sheet.AllocatedRange.AutoFitRows()
sheet.AllocatedRange.AutoFitColumns()

# CSVファイルをPDFファイルとして保存
workbook.SaveToFile("output/CSVtoPDF.pdf", FileFormat.PDF)
workbook.Dispose()
```

結果
![PythonでCSVをPDFに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/6f72c1b1-7934-e92d-9dcc-9a6bfefa0899.png)

この記事では、Pythonを使用してCSVファイルをPDFドキュメントに変換する方法を示しています。

その他のスプレッドシート処理スキルについては、[Spire.XLS for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html)をご覧ください。
bleakを使ってデバイスからNotifyを“簡単に”受信する

[`bleak`](https://pypi.org/project/bleak/)を使って、デバイスからNotifyを受信するPythonコード

```python
import asyncio
from bleak import BleakClient

def notification_handler(sender, data: bytearray):
    print(data)

async def run(address, char_uuid, loop):
    async with BleakClient(address, loop=loop) as client:
        if client.is_connected:
            print(f"Connected to {address}")
            await client.start_notify(char_uuid, notification_handler)

            while True:
                await asyncio.sleep(1)
        else:
            print(f"Failed to connect to {address}")


if __name__ == "__main__":
    #address = "BB012A00-ADD9-6D16-AF1A-5D292BE864A0"  # BLE address for Mac
    address = "D8:DE:61:CF:0B:B4"  # BLE address for Windows
    char_uuid = "6e400003-b5a3-f393-e0a9-e50e24dcca9e"  #  UUID of Nordic UART TX
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run(address, char_uuid, loop))
```

- address：BLEデバイスのアドレス
　Windowsで使用するときは、MACアドレスを、
　Macで使用するときは、UUID を指定する。
- char_uuid：NotifyキャラクタリスティックのUUID


デバイスのアドレスは、次のBLEスキャナーで確認できます。

# BLEスキャナー

```python
import asyncio
from bleak import BleakScanner

async def run():
    devices = await BleakScanner.discover(return_adv=True)
    for device, adv_data in devices.values():
        print(f"address: {device.address}, name: {device.name}, uuid: {adv_data.service_uuids}")

asyncio.run(run())
```
Railsヘルパー

```.rb
  # ページごとの完全なタイトルを返す
  def full_title(page_title = '')
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      "#{page_title} | #{base_title}"
    end
  end
```
のようなヘルパーを作成することで

```.application.html.erb
<%= full_title(yield(:title)) %>
```
で呼び出すことができる
AWSの課金体系についてまとめました

# AWSの課金体系について
AWS（Amazon Web Services）は、多くの企業や開発者に利用されているクラウドサービスです。その課金体系は、非常に柔軟で多様なニーズに対応できるようになっています。本記事では、AWSの主要な課金体系について簡単に解説します。

## 1. 基本的な課金モデル
**従量課金制**
AWSは基本的に「使った分だけ支払う」従量課金制を採用しています。使用したリソースの量に応じて料金が発生するため、無駄なコストを削減できます。

**無料利用枠**
新規ユーザー向けに、一定の無料利用枠が提供されます。例えば、Amazon EC2の750時間/月、Amazon S3の5GBなどが1年間無料で利用可能です。

## 2. サービス別の課金体系
**Amazon EC2（Elastic Compute Cloud）**
EC2は仮想サーバーを提供するサービスで、以下のような課金オプションがあります。

* オンデマンドインスタンス: 長期契約なしで、必要な時に必要な分だけ利用する。
* リザーブドインスタンス: 1年または3年単位でインスタンスを予約することで、割引が受けられる。
* スポットインスタンス: 入札制で空きリソースを利用する。大幅な割引が期待できるが、インスタンスが終了される可能性もある。

**Amazon S3（Simple Storage Service）**
S3はオブジェクトストレージサービスで、以下の要素で課金が行われます。

* ストレージ使用量: 保存データの量に応じて課金。
* リクエストとデータ転送: データのアップロードやダウンロードのリクエスト数および転送量に応じて課金。

**Amazon RDS（Relational Database Service）**
RDSはデータベース管理サービスで、以下のように課金されます。

* インスタンス時間: データベースインスタンスが稼働している時間に基づく課金。
* ストレージ使用量: データベースストレージの利用量に応じて課金。
* I/Oリクエスト: データベースへの読み書き操作の回数に基づく課金。

## 3. その他の料金
**データ転送料金**
同じAWSリージョン内でのデータ転送は無料ですが、異なるリージョン間やインターネットへのデータ転送には料金が発生します。

**サポートプラン**
AWSは異なるレベルのサポートプランを提供しており、利用するプランに応じて追加料金が発生します。基本的なサポートは無料ですが、より高度なサポートを希望する場合は有料プランを選択できます。

## 4. コスト管理と最適化
**AWS Cost Explorer**
AWS Cost Explorerを使用すると、利用状況と費用を詳細に分析できます。これにより、どのサービスがどの程度コストをかけているのかを把握し、最適化のための計画を立てることができます。

**AWS Budgets**
AWS Budgetsを使用すると、予算を設定し、コストがその予算に近づいた場合にアラートを受け取ることができます。これにより、予算オーバーを防ぐことができます。

**AWS Trusted Advisor**
AWS Trusted Advisorは、コスト削減の推奨事項やセキュリティの強化、パフォーマンスの向上に役立つアドバイスを提供します。

# まとめ
AWSの課金体系は、非常に柔軟で多様なニーズに対応できるようになっています。利用するサービスやプランによって異なるため、自分の利用状況に最適なプランを選ぶことが重要です。また、定期的にコスト管理ツールを活用し、コストの最適化を図ることが求められます。

AWSを効率的に利用するためには、まずは無料利用枠を活用し、必要に応じてリザーブドインスタンスやスポットインスタンスを検討するなど、賢い選択を心がけましょう。

以上がAWSの課金体系の基本的な解説です。あなたのAWS利用がより効果的でコスト効率の良いものになることを願っています。
SourceTreeの使い方

皆さんこんにちはKoenigWolfです。プロジェクトのバックアップ管理、大変ではないですか？ファイルを別名で保存していると、どこに変化があったのか、何をしようとしていたのかの管理が難しくなってきます。そんな時に便利なのが、Gitとそれを簡単に扱うためのソフトウェア「SourceTree」です。

## Gitの基本
### Gitとは？
Gitは、プロジェクトのバージョンをツリー状に保存・管理するツールです。各バージョンにコメントを付けることで、いつ誰がどのように更新したかがわかります。Gitはコマンドラインインターフェース（CUI）で操作するため、視覚的にわかりづらく、コマンドを調べる手間があります。


## SourceTreeの紹介
そこでおすすめしたいのが「SourceTree」です。SourceTreeは、グラフィカルユーザーインターフェース（GUI）を提供し、視覚的にわかりやすく操作できます。プロジェクトの構成や変更箇所の確認、コメントの追加などが簡単に行えます。SourceTreeを使うには、製作会社であるアトラシアンのアカウントが必要ですが、無料で利用できます。


## SourceTreeの基本操作
### ローカルリポジトリの作成
1. **フォルダの作成**
   - リポジトリを作成したい場所にフォルダを作ります。例えば、「my_project」というフォルダを作成します。

    ```sh
    mkdir my_project
    cd my_project
    ```

2. **SourceTreeでリポジトリを作成**
   - SourceTreeを開き、右上の「+」ボタンをクリックして新しいウィンドウを作成し、「Create」を選択します。
   - 作成したフォルダを選択し、適当な名前を付けてリポジトリを作成します。

    ```sh
    git init
    ```

### GitHubのユーザー認証
1. **ユーザー認証の設定**
   - SourceTreeの左上にある「ツール」から「オプション」をクリックし、認証タブを選択します。
   - 右上の「アカウント追加」をクリックし、GitHubを選択して認証を行います。

    SourceTreeのGUI上でアカウント情報を入力し、GitHubと連携します。


### リモートリポジトリの登録
1. **GitHubでリポジトリを作成**
   - GitHubにログインし、新しいリポジトリを作成します。作成後、リポジトリのURLをコピーしておきます。

    ```sh
    # GitHub上で新規リポジトリを作成
    ```


2. **SourceTreeでリモートリポジトリを設定**
   - SourceTreeの右上にある「リモート」を選択し、設定ボタンをクリックします。
   - リポジトリの追加ウィンドウで、コピーしたURLを入力し、リモート名を設定します。

    ```sh
    git remote add origin <repository_url>
    ```


### ファイルのコミットとプッシュ
1. **ファイルの変更とコミット**
   - リポジトリのフォルダにファイルを追加や変更を行います。例えば、テキストファイルを追加します。

    ```sh
    echo "Hello World" > hello.txt
    git add hello.txt
    git commit -m "Add hello.txt"
    ```


2. **変更内容をプッシュ**
   - 左上のプッシュボタンを押して、変更内容をリモートリポジトリにプッシュします。

    ```sh
    git push origin main
    ```


### ブランチの作成と管理
1. **ブランチの作成**
   - 分岐したいコミットを選択し、左上のブランチボタンをクリックします。新しいブランチ名を入力し、作成します。

    ```sh
    git branch new-branch
    git checkout new-branch
    ```


2. **ブランチの切り替え**
   - 作成したブランチに切り替えて、ファイルの変更を行い、コミットします。

    ```sh
    echo "New changes" > changes.txt
    git add changes.txt
    git commit -m "Add changes.txt in new-branch"
    ```


### ブランチのプッシュとクローン
1. **ブランチのプッシュ**
   - 変更内容をコミットしたブランチをリモートリポジトリにプッシュします。

    ```sh
    git push origin new-branch
    ```


2. **リポジトリのクローン**
   - 別のパソコンやフォルダにリポジトリをクローンすることで、同じプロジェクトをコピーして作業できます。

    ```sh
    git clone <repository_url>
    ```


### プルの操作
1. **プルの実行**
   - リモートリポジトリから最新の変更を取り込みたい場合、プルボタンを押して変更内容をローカルリポジトリに反映させます。

    ```sh
    git pull origin main
    ```


## まとめ
SourceTreeは、Gitの操作を視覚的にわかりやすくし、プロジェクトのバージョン管理を簡単に行えるツールです。GitとSourceTreeを使いこなすことで、プロジェクト管理がよりスムーズになります。ぜひ、実際に手を動かして操作してみてください。

この記事が役に立ったと感じたら、いいねとフォローをよろしくお願いします。

---

### 参考リンク
- [SourceTree公式サイト](https://www.sourcetreeapp.com)
YDLIDAR GS2 付きロボットケース


インテリジェントロボットコンテストの YDLIDAR GS2 を応用した革新的なロボットケース
ショーを見るには、YouTube チャンネルをクリックしてください!
1:44:00 と 1:47:34 から、この 2 つの小さなかわいいロボットを見ることができます~
https://youtu.be/aSYGPxeNosI?t=6032
共有していただきありがとうございます!
----------------------------------------------------------------------
An innovating robot case applying the YDLIDAR GS2 from Intelligent Robot Contest！
Click to check on Youtube Channel for seeing its show! 
From 1:44:00 and 1:47:34 you can see these two little cute robotics~
https://youtu.be/aSYGPxeNosI?t=6032

Thanks for sharing!

![image(06-21-09-2(06-21-09-28-44)(1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491551/95eb5a46-67c8-50a1-5dac-a205ed51ed0b.png)
![image(06-21-09-2(06-21-09-28-44).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3491551/c3cdc167-f23d-9582-a2b1-1c2badd1097f.png)
【小ネタ】Vim 上からよく開くファイル（init.vimなど）をさっと開けるコマンドを設定する

## きっかけ

私はメモを特定のテキストファイルに書いて管理しています。もちろん編集は Vim（正確には Neovim）で行っています。

業務でコードを修正しているとき、メモを書きたいなーと思うことがあります。
そんなとき、コマンド一発でメモ用のテキストファイルが表示できると嬉しいということに気づきました。

## 方法

`init.vim` に以下のような設定を行いました。`path` の部分は自環境に合わせて修正が必要です。
ついでに `init.vim` 自体もぱっと開けるようにしておきました。

```init.vim
" :Memo コマンドでメモファイルをひらく
command Memo edit path
" :EditInitVim コマンドで init.vim をひらく
command EditInitVim edit path
```

## 効果

こりゃあ便利。なぜ今まで気づかなかったんだろうと思いました。
【Git入門】GitとGitHubの基礎

## Gitの基本
### Gitでできること
1. **ファイルのバージョン管理**
   - 変更履歴を記録し、いつ誰がどんな変更をしたかを管理できます。
   - ファイルの数を増やさずに、好きなタイミングでファイルの状態を記録できます。

2. **以前の状態に戻せる**
   - 変更を取り消して、以前の状態に戻すことができます。
   - コマンド一発で簡単に戻せるため、バグが発生しても安心です。

3. **チームでスムーズに開発できる**
   - 複数人での共同編集に適しています。
   - 誰がどの部分を修正したかを確認でき、上書きによる事故を防ぐことができます。

4. **ブランチを使った開発**
   - ブランチを作成して独立した開発を行い、後でマージすることでメインのコードに影響を与えずに開発が可能です。
   - ブランチを活用することで、機能ごとの開発やバグ修正を効率的に管理できます。

## GitHubの基本
### GitHubでできること
1. **コードの共有**
   - オンライン上で複数人とコードを共有できます。
   - GitHubを使うことで、チーム全体でのコードの管理が楽になります。

2. **コードレビュー**
   - チームメンバーが修正したコードを他のメンバーがレビューし、問題がないか確認できます。
   - レビューが完了したコードのみを本番環境に取り込むことで、品質を保ちます。

3. **OSS開発への参加**
   - GitHubには多くのオープンソースプロジェクトが公開されています。
   - 自分が使っているツールやライブラリの改善に貢献することができます。

4. **プロジェクト管理**
   - IssuesやProjectsを使ってタスク管理やプロジェクトの進捗管理が行えます。
   - チーム全体の作業の見える化ができ、効率的なプロジェクト運営が可能です。

## Gitの基本操作
### 初期設定とリポジトリの作成
- `git init`コマンドでローカルリポジトリを作成。
  ```sh
  git init
  ```
- `git add`と`git commit`で変更内容を記録。
  ```sh
  git add .
  git commit -m "初回コミット"
  ```

### コマンドの使い方
1. **初期化**
   - `git init`でリポジトリを初期化。
   ```sh
   git init
   ```

2. **記録**
   - `git add`でステージング、`git commit`でコミット。
   ```sh
   git add .
   git commit -m "コミットメッセージ"
   ```

3. **状況確認**
   - `git status`で変更状況を確認。
   ```sh
   git status
   ```
   - `git diff`で変更内容を確認。
   ```sh
   git diff
   ```

4. **履歴確認**
   - `git log`でコミット履歴を確認。
   ```sh
   git log
   ```

5. **元に戻す**
   - `git restore`でワークツリーの変更を取り消し。
   ```sh
   git restore <ファイル名>
   ```

### ブランチ操作
1. **ブランチの作成と切り替え**
   - `git branch`でブランチを作成、`git checkout`でブランチを切り替え。
   ```sh
   git branch <ブランチ名>
   git checkout <ブランチ名>
   ```
   - `git switch`コマンドも使用可能。
   ```sh
   git switch <ブランチ名>
   ```

2. **ブランチの統合**
   - `git merge`で他のブランチを統合。
   ```sh
   git merge <ブランチ名>
   ```

3. **リモートブランチの操作**
   - `git fetch`でリモートリポジトリの変更を取得、`git pull`でリモートブランチをローカルにマージ。
   ```sh
   git fetch
   git pull origin <ブランチ名>
   ```

## GitHubとの連携
### 初期設定
- GitHubに登録し、ユーザー名とメールアドレスをGitに設定。
  ```sh
  git config --global user.name "Your Name"
  git config --global user.email "your.email@example.com"
  ```

### リモートリポジトリの追加
- GitHub上にリポジトリを作成し、URLをローカルリポジトリに追加。
  ```sh
  git remote add origin https://github.com/yourusername/yourrepository.git
  ```

### プッシュとプル
- `git push`でローカルの変更をGitHubにアップロード。
  ```sh
  git push origin <ブランチ名>
  ```
- `git pull`でGitHub上の変更をローカルに反映。
  ```sh
  git pull origin <ブランチ名>
  ```

### プルリクエスト
- 修正内容をGitHubにプッシュし、プルリクエストを作成。
  - GitHubのリポジトリページで「New pull request」ボタンをクリック。
  - 変更内容を確認し、「Create pull request」ボタンをクリック。
  - タイトルと詳細を記入し、「Create pull request」を再度クリック。

### プルリクエストの利点
- コードレビューを通じてコードの品質を向上。
- 複数の開発者が同時に作業する際の競合を減らす。
- 変更履歴が明確になり、将来的な変更のトレースが容易。

## まとめ
GitとGitHubはチーム開発において必須のツールです。実際に手を動かして操作することで、理解が深まります。この記事を通じて、GitとGitHubの基本をマスターし、チーム開発でのスムーズなコラボレーションを実現しましょう。また、ブランチやプルリクエストを活用することで、さらに効率的で質の高い開発が可能になります。
[備忘録]　読んだネットの記事 (FA業界) ver.6

# 備忘録
"速高精度に複数台数を制御、ABBが次世代ロボティクス制御プラットフォーム"
https://monoist.itmedia.co.jp/mn/articles/2406/21/news056.html

[備忘録]
- 複数のロボットを制御することが可能
- 拡張可能なモジュール式制御アーキテクチャをベースとした幅広い機能を搭載
    - 必要なアプリはほぼ作成することができる
    - 設計から保守まで対応
- アーク溶接や携帯電話ディスプレイの組み立てなど自動化の促進に寄与
- AI（人工知能）やエッジコンピューティングシステムなどを完全に統合したロボットアプリケーションの実用化を目指す

"実機とともに知能ロボットによる自動化を提案、Mujinが岡崎事業所を開設へ"
https://monoist.itmedia.co.jp/mn/articles/2406/19/news119.html

[備忘録]
- Mujinコントローラーを産業用ロボットに接続することで自律的にリアルタイム動作生成が可能な知能ロボットへ変換する
- 汎用的な知能ロボットと非固定設備であるAGVを組み合わせた事業所を開設

"ヤマハ発動機がSMTラインの新自動化コンセプト、AMRがフィーダーを搬送して補給"
https://monoist.itmedia.co.jp/mn/articles/2406/18/news100.html

[備忘録]
- SMTの需要が伸びている
- 自動部品補給に対応した「自動化マウンター」
- フィーダー搬送および交換作業を行うAMRが準備されている
- AMRにはLidarを搭載
- 自動部品供給には位置合わせ用のマーカーが付いている
    - AMRはマーカーを検出して位置合わせを行う．この際，自動部品供給側の高さもセンサーで検出
【初心者向け】VSCodeでhtmlを実行しようとしたらabout:blankと表示されるようになった

# はじめに
VSCodeを使ってhtmlの勉強をしている際に急にabout:blankと表示されて実行ができなくたったので、対応方法をまとめておきます。

# エラー内容
以下の画像の通り、htmlファイルを実行しようとするとabout:blankと表示されるようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3287818/cfddbad3-4b14-5594-b27e-86bbe0a48b59.png)

# 結論と対応方法
### 原因
cssまたはJavaScriptのファイルをf5キーで実行してしまい、launch.jsonというファイルが作成されていしまったことが原因でした。launch.jsonはファイルを実行する際の実行方法を記述するファイルです。

### 対策
対策方法１：launch.jsonを削除する
対策方法２：launch.jsonを以下の通り編集する
```json:launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "chrome",
            "request": "launch",
            "name": "Launch Chrome with active file",
            "file": "${file}",
            "webRoot": "${workspaceFolder}"
        }
    ]
}
```

現在開いているファイルをGoogle Chromeで開くという設定をしています。これまではf5キーを押してファイルを実行するたびにブラウザの選択をする必要がありましたが、launch.jsonで使用するブラウザを指定することにより手間が省けるようになりました。
PowerAutomateDesktop Excel/Outlookの起動ができない場合の対処法

# 概要
PowerAutomateDesktopで、ExcelやOutlookを使用している方は多いと思います。
開発段階で、起動の部分で止まってしまう原因と解決方法を解説します。

# 原因
既にプロセスが存在している場合に起こります。
ExcelとOutlookでは原因が異なるので、分けて解説します。
## Excel
既に**書き込み**で起動させている場合に、**同じファイル**を**書き込み**で起動しようとすると止まります。
画像は極端な例ですが、Excelを閉じる前にフローがエラーや例外で終了してしまうと次に起動したときにプロセスが残ったままになってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/1b8bb0f5-5483-a61b-2c25-214dd7550f8b.png)
## Outlook
Outlookが下記2つの場合起動ができません。
* 既に起動していた場合
* 新しいOutlookを試す がONになっている場合
# 解決方法
手動で行う場合は、タスクマネージャーからExcelを終了させてください。
PowerAutomateDesktopで処理する場合、以下に記述します。

**プロセスが次の場合** アクションでOutlookとExcelのプロセスがあるか検出します。その後の処理はフローに合わせて作成してください。

:::note warn
Outlookは新旧でプロセス名が異なるので注意してください。
:::

<details><summary><strong>フロー全体</strong></summary>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3809382/81946618-0436-4f92-f577-340e58c893c5.png)
</details>


<details><summary><strong>フローのソースコード</strong></summary>


```Robin
IF (System.IfProcess.ProcessIsRunning ProcessName: $'''olk''') THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''outlook''' Message: $'''新しいOutlookを試す をオフにしてください。''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
    EXIT Code: 0
END
IF (System.IfProcess.ProcessIsRunning ProcessName: $'''OUTLOOK''') THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''outlook''' Message: $'''outlookを終了させてから起動してください。''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
    EXIT Code: 0
END
IF (System.IfProcess.ProcessIsRunning ProcessName: $'''EXCEL''') THEN
    Display.ShowMessageDialog.ShowMessage Title: $'''excel''' Message: $'''excelを終了させてから起動してください。''' Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: True
    EXIT Code: 0
END
```

</details>
【TypeScript】inferを使えるようになりたい

## はじめに
TypeScriptを使って開発を進めていく中で分からないことを調べていると時折「infer」見かけます。  気になりでサバイバルTypeScriptを覗いてみると「便利なんだな～」とは思うものの、中身についてはほとんど理解していませんでした。
加えてTypeScriptでの開発もある程度経験を積み理解してきたので、これを機に向き合っていこうと思います。

## inferとは？
まずサバイバルTypeScriptでinferについての記載をみると  
**「inferはConditional Typesの中で使われる型演算子です。inferは「推論する」という意味でextendsの右辺にのみ書くことができます。」**  
と記載されています。  
```typescript
T extends string ? true : false;
```
そもそも"Conditional Types"とは何か？についてですが、👆extends以降の部分のことです。  

初見では記載されている文からinferはConditional Typesの応用という認識だけして実践はしていませんでした。

ちなみにjsの経験があった私は"Conditional Types"を見た時に  
「extends？継承の話じゃないの？」  
という考えが中々拭いきれずコードを読んでいる時"extends"を見るたびに「何を継承しているんだろう」と思い全くどういう処理をしているか読めず沼にハマることを繰り返していました。:joy:

## とりあえず例を見て理解してみる
サバイバルTypeScriptでは**ユーティリティ型ReturnType<T>の例から知る**とあり、下記のコードが記載されています。
```typescript
type ReturnType<T extends (...args: any) => any> = T extends (
  ...args: any
) => infer R
  ? R
  : any;
```

お試しの使用例
```typescript
const request = (url: string): Promise<string> => {
  return fetch(url).then((res) => res.text());
};

type X = ReturnType<typeof request>;
```
「んーよくわからん！」というのが最初の感想です。  

## 冷静になって紐解いてみた
```typescript
type ReturnType<T extends (...args:any) => any> 
/*
(...args: any)　任意の引数を渡せる（残余引数）ことができ、anyなので任意の型で引数を渡すことができる

*/
```

ReturnTypeに対して任意の関数を渡し、その渡されたものに対して何かしら判定している？というのはパッと見で理解できました。
次に肝心な判定箇所を見ていきます。
```typescript
= T extends (
  ...args: any
) => infer R
  ? R
  : any;
```
色々調べた結果inferは判定文てきなイメージかなと理解したのでその考えで見ていきます。
今回でいう判定箇所とは
```typescript
T extends (...args:any) => infer R
```
の部分です。
型に対する**extends**とは**制約**のような意味なのでこの判定は **「Tは関数か？」** という意味になり、関数であれば渡された関数の戻り値の型を返し、そうでなければanyを返すとなります。
ここで使用例を見直します。
```typescript
const request = (url: string): Promise<string> => {
  return fetch(url).then((res) => res.text());
};

type X = ReturnType<typeof request>;
```
このrequestという関数はurlというstirngの引数を受け取り、Promise<string>の値を返す関数です。
つまり、先ほどの例に当てはめると

```typescript
type ReturnType<T extends (...args: any) => any> 
= T extends (...args: any) => infer R  /*T は関数ですか？*/
  ? R  /* requestは関数なのでrequestの返却値の型 Promise<string> を返す*/
  : any;
```
となります。

## 例を読んでみた結果
inferについて6割ぐらいは理解できたのではないかと思う。
もっと複雑なものなのかと思っていたが、冷静になると以外にも理解できた。
今回の内容は基本の範疇だとは思うが、とりあえずちょっとした汎用的な型は作れそうな気がしてきたのでinferが頭になじんだらより深い知識を追い求めようと思います。
[T-DASH] テスト自動化の中で、POP3を利用してメールの本文を取得する

# Outline

メールを受信して、そのメールのコンテンツからログインなどを行う、多要素認証MFAを使ったサイトがある。
このMFAを用いたサイトのテスト自動化では、メールの取得方法が重要になる。


前回、IMAPを用いてメールを取得する方法を記載した

https://qiita.com/emurin/items/4be3f4ce7b1d31308c64

今回、T-DASHテスト自動化でPOP3を用いてメールを取得する方法になる

https://service.valtes.co.jp/t-dash/

# POP3のテストサイト

POP3が使えるサイトとして5x2.deを用いた。
こちら、ドイツのサイトになりますが、IMAPを利用でき、無料です。

https://5x2.de/

このメールサーバーではIMAPの情報は以下の通りです

| パラメータ | 値 | 
|:-----------|:------------|
| POP3_SERVER       | mail.5x2.de        | 
| POP3_PORT       | 110, 995        | 
| MAIL_USER       | メールアドレス     (ex. xxxx@5x2.me)  | 

# 技術情報

MailClientLibrary を用いた
POP3のサーバー情報を設定し、いくつかの手段でメールを取得することができる。
今回、senderを指定して、最初に見つかったメールを取得するものとする。

https://noubar.github.io/RobotFramework-MailClientLibrary/


# T-DASH

## カスタム動作

以下設定なようをメール処理POP3.yamlのファイルで保存する


```
ACT-CAT-CUSTOM-ad35bd43-0bc3-443e-ba74-3421ca00fa5e:
  action_category_name: MailPOP3
  icon: ''
  color: '#f96779'
  custom_data:
    file_name: MailPOP3
    pip_list:
    - robotframework-mailclient
    library_list:
    - MailClientLibrary
  actions:
    ACT-CUSTOM-6b11da19-93d6-4422-88ef-d079b0721824:
      action_name: POP3で最新のメールを取得する
      action_type: operation
      action_format: sender=「設定値1」のメールを取得
      action_note: ''
      action_args:
      - value1
      action_def:
      - - Set Test Variable
        - ${POP3_SERVER}
        - mail.5x2.de
      - - Set Test Variable
        - ${POP3_PORT_SSL}
        - '995'
      - - Set Test Variable
        - ${POP3_PORT}
        - '110'
      - - Set Test Variable
        - ${MAIL_USER}
        - xxx@example.com
      - - Set Test Variable
        - ${MAIL_PASSWORD}
        - xxxxx
      - - Set Pop3 Server Address
        - ${POP3_SERVER}
      - - Set Pop3 Ssl Port
        - ${POP3_PORT_SSL}
      - - Set Pop3 Port
        - '${POP3_PORT} '
      - - Set Pop3 Username And Password
        - ${MAIL_USER}
        - ${MAIL_PASSWORD}
      - - ${mail_count} =
        - Get Pop3 Mail Count
      - - Log
        - mail_count = ${mail_count}
      - - ${mail_content} =
        - Open Pop3 Mail By Sender
        - ${value1}
      - - Log
        - mail_content = ${mail_content}
      - - Set Suite Variable
        - ${share_value}
        - ${mail_content}

```

次に、作成された POP3.yamlをT-DASHの動作定義 -> カスタム動作 -> カスタム動作をインポート にてインポートする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/250aa30f-36c9-8eea-162b-a7aca11dd810.png)

引数として、senderを指定することで、指定したsenderで最初に見つかったメールの、本文を変数${share_value}に格納します

## スクリプト

### TEXTメールを取得する
スクリプト

設定値１にsenderを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/f9353928-16f3-b713-08a7-90f9afb33870.png)


実行結果

件数と、みつかったメールの本文がログに出力され、かつ${share_value}に格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267085/af09d164-0a8d-b9da-7884-26f709e399e6.png)