OmniAICreator/Qiita-1.07M huggingface dataset:
特定区間の総和を求める問題についての差分配列と累積和による解法

理解が追い付かなかったので記録メモです :angel_tone3:

## 問題
ある期間におけるイベントの出席者数の総和を計算する

## 入力例
期間D、人数N、それぞれの出席期間が入力として与えられる
```bash
8    # 8日間
5    # 5人
2 3  # 1人目 (例：2~3日目まで参加)
3 6  # 2人目
5 7  # 3人目
3 7  # 4人目
1 5  # 5人目
```
## 出力例
1～8日間のそれぞれの出席人数を出力する
```bash
1  # 1日目
2  # 2日目
4  # 3日目
3  # 4日目
4  # 5日目
3  # 6日目
2  # 7日目
0  # 8日目
```

## 分かりやすく視覚化する
各イベント実施日について、スプレッドシートで総和を求めると以下のようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/259fdd69-910f-8b53-0065-c15e3a1027a1.png)

## 駄目だった解法
各実施日ごとに加算していくと、計算量が増えて制約条件を満たせない :no_good_tone1:
```cs                
    int D = int.Parse(Console.ReadLine());
    int N = int.Parse(Console.ReadLine());
    int[] L = new int[D];
    int[] R = new int[D];

    for (int i = 0; i < N; i++)
    {
        int[] list = Console.ReadLine().Split().Select(int.Parse).ToArray();
        L[i] = list[0];
        R[i] = list[1];
    }

    // 各実施日の出席者数を配列にする
    int[] s = new int[D];

    for (int i = 0; i < N; i++)
    {
        var nums = Enumerable.Range(L[i], (R[i] - L[i] + 1));

        foreach (var num in nums)
        {
            s[num - 1] += 1;
        }
    }

    foreach (var item in s)
    {
        Console.WriteLine(item);
    }
```

## 差分配列を利用する解法
1. 長さD+2の配列`diff`を用意し、両端に番兵(ダミー要素)を設ける
2. 各参加者について、出席開始日に+1、出席終了日の翌日に-1を`diff`配列に加算
3. `diff`配列の前から順に累積和を取ることで、各日の出席者数が求まる
```cs
    int D = int.Parse(Console.ReadLine());
    int N = int.Parse(Console.ReadLine());
    
    int[] diff = new int[D + 2]; // 差分配列 (両端に番兵を設ける)
    
    for (int i = 0; i < N; i++)
    {
        string[] input = Console.ReadLine().Split();
        int Li = int.Parse(input[0]);
        int Ri = int.Parse(input[1]);
        diff[Li]++;     // 出席開始日に+1
        diff[Ri + 1]--; // 出席終了日の翌日に-1
    }
    
    int[] attendance = new int[D + 1]; // 各日の出席者数を格納する配列
    int sum = 0;
    for (int i = 1; i <= D; i++)
    {
        sum += diff[i]; // 差分配列の累積和を計算
        attendance[i] = sum; // 出席者数を格納
        Console.WriteLine(attendance[i]);
    }
```

実行時間が全然違った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/9c445cfd-7981-cd65-703b-f89c6c931acb.png)

下に差分配列を追加。
参加開始日に +1、参加終了日の翌日に -1 とし、差分配列の累積和を取ることで元の配列が求まる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/e11107af-f7a4-f4c5-78a8-993fd8e74a99.png)

考え方としては、各実施日ごとに計算するのではなく増減（差分）に注目している :pencil:

## Reference
- [A07 - Event Attendance](https://atcoder.jp/contests/tessoku-book/tasks/tessoku_book_g)
- [解法 Python](https://github.com/E869120/kyopro-tessoku/blob/main/codes/python/chap02/answer_A07.py)
- [解法 Java](https://github.com/E869120/kyopro-tessoku/blob/main/codes/java/chap02/answer_A07.java)
【AWS×Webアプリ】S3静的Webサイトホスティング（SAM）

## 目的
・AWS上にS3バケットを作成し、静的Webサイトホスティング設定を行う。

## 前提条件
・SAMを使用してAWS上にリソースを作成する。

## 完成イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637963/134555c8-3df4-e9c1-0ac2-377cd7e4da7e.png)

## SAMテンプレート
```yaml:template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31

Resources:
  WebBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::StackName}-webbucket-${AWS::AccountId}
      VersioningConfiguration:
        Status: Enabled
      WebsiteConfiguration:
        IndexDocument: index.html
      PublicAccessBlockConfiguration:
        IgnorePublicAcls: false
  WebBucketBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref WebBucket
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action:
              - s3:GetObject
            Effect: Allow
            Resource:
              - !Sub ${WebBucket.Arn}/*
            Principal: '*'
Outputs:
  WebsiteURL:
    Description: URL for website hosted on S3
    Value: !GetAtt WebBucket.WebsiteURL
```

①WebBucket（S3バケット）
・VersioningConfiguration：バージョニング有効化（Status: Enabled）
・WebsiteConfiguration：静的Webサイトホスティング有効化（IndexDocument: ～）
・PublicAccessBlockConfiguration：パブリックアクセス有効化（IgnorePublicAcls: false）

②WebBucketBucketPolicy（バケットポリシー）

## 動作確認
①作成されたS3バケットへ「index.html」をアップロードする
```index.html
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>My Website Home Page</title>
</head>
<body>
  <h1>Welcome to my website</h1>
  <p>Now hosted on Amazon S3!</p>
</body>
</html>
```
②Webサイトへアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637963/2585d324-c65f-db00-8c3d-a25af6691e09.png)
自作PCチェックリスト

久しぶりにPCを新調することにした。久しぶりすぎて、価格.com以外のサイトもあっちこっち見まわすことになった。
パーツを選ぶときに確認事項はいろいろあるけれど、すべてを1ページで把握できるような便利サイトはなさそうなので、次回の作業メモとして残しておこうと思う。

## 全般
ベンチマークの確認
* CPU https://pcfreebook.com/article/450856544.html
* GPU https://pcfreebook.com/article/459993300.html

生成AIも使いたいので、GPUベンチマークはこのページも参考にした。
* https://chimolog.co/bto-gpu-stable-diffusion-specs/

有名なゲームやソフトウェアの推奨スペックも軽く確認した。
* ゲームの推奨スペックはフルHD基準なので、4Kなど高解像度では推奨以上のGPUも視野に入る
* IllustratorやフォトショップはオンボードGPUでも最低限動く[^1]。ペイント代わりに使う程度なら気にしない

[^1]: フォトショップは[FAQに「PassMark の GPU コンピューターベンチマークチャートで、平均 Ops/Sec が 2,000 以上の GPU を使用することを検討してください。」](”https://helpx.adobe.com/jp/photoshop/kb/photoshop-cc-gpu-card-faq.html”)と書いているが、大半のものが2000以上となっている。ただし、FAQを見るとGPUがあったほうが良い機能(アクセラレーション)、GPUが無いと実行できない機能がある。ペイント代わりに使う程度なら気にしない。

## CPU
上記ベンチマークと値段を見ながら決める。

* GPUを買わない場合には、オンボードGPUのあるものにする
  * Intelだと末尾に「F」がついているのはオンボードGPUが使えないタイプので、絶 対 避ける 
* コア数・スレッド数
* クロック数
* 値段
* TDP

## PCケース
候補を2、3個選んでおく。

* ATXかMicroATXか、その他か
  * 最近のマザボはMicroATXが主流なので、これに対応してればだいたい良しとする
* 対応GPUのサイズ(GPU買う場合)
  * 大雑把に「GPUにファン2個なら300㎜未満、3個ならそれ以上」と考える。
  * GPUは後で決めるので、大まかな目安だけ確認しておく
* 価格.comクチコミ情報やAmazonレビューも見ておく。「サイズがギリギリ」等の情報が書いてあることもある

# マザボ
一番多い。
* チップセット。型番でIntelやAMDの公式サイトが出てくるのでメモしておく
  * チップセットでSATAの最大数やPCIeが決まる
  * 速度にも影響するのでボトルネックにならないように考える
* ソケット。AMDは緩いけどIntelは細かく分かれている。買い間違えると悲惨
* メモリ(DDR)の規格
* 価格.comクチコミ情報やAmazonレビューも見ておく。「スロットのカードが干渉する」等の情報が書いてあることもある
* SATA、USB、SSD(よくわかってない)ポートの本数を確認。チップセットの最大数と異なる(減らされてる)場合がある
* モニタ接続端子。D-subとDVIとHDMIはほとんどいつもあるが、念のため確認する

# GPU
配信、エンコード、ゲームなど、特定用途では必須だけれど、該当しない場合は無くてもよい。今回は「ゲームやるかもしれない」「生成AIさわりたい」と考えて選択。
基本的にはベンチマークと値段で決める。

* 生成AIをやりたい場合は、生成AI向けのベンチマークを確認する。一般ベンチマークとはランキング順が異なる
* 実寸法
* VRAMサイズ。生成AIだと12GB以上が推奨されているらしい。詳細はベンチマーク参照
  * StableDiffusion登場初期は「RTX 3060 12GBだと良い」と言われていた。アップデートも考えると、それより少し上を狙ったほうが良さそう 
* 対応スロット(バスインターフェイス)
  * 筆者もまだよくわかっていない

# メモリ
マザボに対応している規格のものを買う。いちおうノーブランドは避ける。
デュアルチャネルのため、2枚セットを購入する。32GBなら16GB×2枚のを購入する。
容量のほうが重要で、速度のほうは体感できるほど差が無い。コスパを優先するなら安いもので。

# 電源
ドスパラの計算サイトでまずPC全体の消費電力を計算し、1.5～2倍のWを目安に選択する。消費電力で選ぶと数種類しか残らないので、好みで選ぶ。
https://www.dospara.co.jp/5info/cts_str_power_calculation_main.html?utm_source=google&utm_medium=pmax&utm_campaign=assemble&gad_source=1&gclid=Cj0KCQjwir2xBhC_ARIsAMTXk85rrhCkVr_0_UhJ9GlKZ1mSYTQWGt9G2g9N4ECw-CpAmycngWEluVYaApqbEALw_wcB

※サイトでは2倍を推奨しているが、価格.comの解説は1.2～1.5倍以上を目安にしていて、ばらつきがある。1日中、大きな画像や映像の作業をしたり、生成AIや重いプログラムを24時間回したりするなら(＝CPUやGPUをTDPでフル稼働させる予定があるのなら)、範囲のうちの多めに見積もる。1日1時間ゲームするくらいなら、範囲内で少なめに見積もっても大丈夫だと思う(主観)。

# 再確認
おもに実寸法の確認(個人的)

* マザボのソケットはCPUに合っているか
* マザボとメモリ規格は合っているか
* GPUのPCIe規格にマザボが対応しているか(互換規格含む)
* HDDやSSDの数に対してマザボのポート数は足りているか
* PCケースがフォームファクタ(ATXとか)にあっているか
* PCケースのベイの数は足りているか
* PCケースとマザボのサイズが合うか
* PCケースとGPUのサイズ(縦×横×奥)が合うか
* クチコミやレビューに不安要素が書いてないか
2024/4/30主にITとかセキュリティの記事

再び全Win版Chromeユーザーに「重要」なセキュリティアップデートが公開(4/28)
https://forbesjapan.com/articles/detail/70645

iPhoneは監視されている――なぜGoogleが警鐘を鳴らすのか(4/28)
https://atmarkit.itmedia.co.jp/ait/articles/2404/28/news039.html

Amazonのジェフ・ベゾス元CEOらがメッセージアプリ「Signal」でやりとりを自動消去していたとして連邦取引委員会が非難(4/27)
https://gigazine.net/news/20240427-amazon-executives-use-signal-to-destroy-text-message/

【書評】メール技術の基礎を抑えたい方必見「実務で使える メール技術の教科書」(4/28)
https://dev.classmethod.jp/articles/book-review-email-technology-textbook/

NASA、ボイジャー1号をハッキングして復活させる。通信に片道22時間半かかる(4/28)
https://www.drone.jp/news/2024042820291187127.html

SNSなどフェイクニュースにだまされない「自信がない」が半数以上【紀尾井町戦略研究所】(4/28)
https://otona-life.com/2024/04/28/230112/

仮想通貨のステーキングとはどんな運用方法？やり方やおすすめの銘柄を紹介(4/28)
https://xrcloud.jp/blog/articles/business/3349/

日本とＥＵが経済安保強化へ共同構想…中国を念頭、半導体など調達を特定国に依存しない方針(4/28)
https://www.yomiuri.co.jp/economy/20240427-OYT1T50181/
ソースコードを読めるようになるためのコツ(これできないと開発現場でヤバイ‼️)

# はじめに
自分は駆け出しエンジニアで、現場に入って仕様理解がうまくできず、タスクを遅延をしてしまいました。原因は技術力のせいにしていましたが、ただ技術力不足なだけでないことがわかってきました。
実際にどうやってコードを読めるようにしていけばいいのかを説明していきます。

# 参考動画

[【エンジニアの仕事術】コードをスラスラ読めるようになるためのコツ](https://www.youtube.com/watch?v=QSGZPALZOqA)

# そもそもコードが読めるとは？
そもそもコードが読めるとは何でしょうか。
***コードを読んだらどんな処理をしているかがわかり、システムの仕様がわかる状態***です。

# コードを読めるようにするには？
***コードを理解して、処理の流れを理解し、システムの仕様を理解すること***です。
ただこれが駆け出しエンジニアには難しい😭
これは***ベテランエンジニアでも仕様の理解には、時間がかかって***しまいます。
実際に自分がいた現場の経験10年のCTOやメガベンチャー出身のエンジニアも
仕様は全部把握していないと話していました。
参考資料は、ソースコードを全部読むのに、3年かかると言われています。

### 仕様理解するためにどうする？
上でお伝えしたように、***強エンジニアでも完全に理解は難しい***です。
ただ***仕様理解には、コツがある***みたいです。

# 結論(ただコードを読まないこと)
自分が始めて現場に入った時に、ただ闇雲にコードを読んでいたら、
一日で疲れ果ててしまって、仕様が全く理解できずに終わってしまいました。
普通に撃沈でした😭

***参考資料を引用***するとこんな感じです。

なぜなら、***長年動いているシステム系は一千万行とかの単位でソースコードがあるので、１日千行読んだとしても千日かかります。単純計算で全部読むのに３年かかる計算***です

普通に無理ゲーです。😅

```ソースコードを読んで理解するには、コードを読み始める前に８割程は勝負が決まる```とみたいです。
この勝負を決めるには、コードを読むコツを理解しておく必要があります。

# コードの読み方のコツ
### 1.入口と出口を意識(読む目的を明確にし、読まない部分を決める)
***入口と出口を理解(読む目的)を理解できれば、処理は理解***できたりします。
動画を参考に書いていきます。

***プログラムの処理(メソッド)は主に以下の3つの構成***です。

1.```データを入れる(入口)```
2.```中でデータを処理(中身)```
3.```データを出す(出口)```

ここで***抑えるべきは***、```1と3```です。
- ```1の入口はメソッドの引数```
- ```3の出口は、returnで返しているもの```

この2つを見て大まかに理解します。こんな感じです。

この処理は何するんだろう?🤔
ex)
ログインしているか確認する処理
クーポンを発行する処理
ユーザーのデータを表示する処理

この処理はもらったデータをこんな感じで返すんだなー

って予測できたりします。

これを繰り返していきましょう。

そして***膨大な量のコードがある場合は、読まないことを決める***ことも大事です。
***努力しても成果が出ない人は、不要な努力をしているケースが多い***です。(完全に僕です。😅)

### 2.紙に書いて状況整理
***頭の中だけだと100％忘れます***。
なので、***自分は理解したことをメモで書いたり***しました。
後はNotionなどで、***自分が理解していったことをドキュメント化して仕様書を現場で作成***しました。

ex)
1.```メソッドごとにどんな処理をしているかまとめる```
2.```紙で処理の流れを図に書いて整理```


### 3.詰まったら問題の切り分け
仕様が理解できない原因は以下の2つみたいです。
以下の2つの切り分けができないと、仕様理解の対策が立てられません。
***仕様が理解できないのはどっちかを理解していく***必要があります。


#### ①```技術がわからない(Rails、Reactの使い方など)```
自分の場合は、Railsでクラスの使い方がわかってなくて苦戦したことがありました。
あとReactだとuseStateの使い方がわかってませんでした。

***具体的に、Railsの何がわかっていないのかを理解する必要***があります。

ex)
Railsが理解できていないならServiceクラスがわかっていないのか？
クラスがわかっていないということは、Rubyのクラスの部分をわかっていないのか？

***わかっていない部分がわかったらそこをピンポイントで調べればいい***です。
他は、一旦は調べる必要ないです。
それすらわからないなら、先輩に相談するといいです。

#### ②```システムの仕様がわからない```
ex)
自分の場合、予約機能の流れがどのファイルでどのコードが呼び出されているかわかっていなかったです。

コツは、***時間を決めて処理を追って制限時間が来たら人に聞く***といいです。
あとテクニックとして、***実際に自分でサービスを使ってみる***といいです。(ローカルでOK)
あと***ユースケースも確認***しておきましょう。
そして***コードを少しいじったりしながら、挙動を確認***するといいです。
もう一つテクニックとして、***メイン機能を理解して、その後に、自分のタスクに関係する機能を理解すること***です。
なぜならWebサービスは、***メイン機能を軸にそこから派生させて作って***います。
まずはメイン機能を理解しましょう。

### 4.デバックする
```Railsならbinding.pry```、```Laravelならdd```を使ったりして処理を理解していくといいです。
デバックをすると処理の流れや変数に何が入っているかなどを理解できます。

- ***Laravel(dd)***

https://qiita.com/Hashimoto-Noriaki/items/e7546bff8a3e2e42aa9b

- ***Rails(binding.pry)***

https://qiita.com/Hashimoto-Noriaki/items/d4ec952005465e39f618

- ***Rails(Raise 〇〇.inspect)***

https://zenn.dev/norihashimo/articles/ecec4d159f2561

### 5.推測しながら読む
全体像や処理をある程度推測しながらソースコードを読むと内容が理解しやすくなります。

ex)
Coupon.rbのモデルがあればこれがCouponに関するモデルかな？とか(ざっくりですみません😅)
Let's Encryptの証明書をMyDNS.jpとGoogle Cloud DNSで更新する方法（Macユーザー向け）

#### はじめに

この記事では、Let's Encryptの無料SSL/TLS証明書をMyDNS.jpで手動更新する方法と、Google Cloud DNSを使用して自動更新する方法をMacユーザー向けに紹介します。

#### MyDNS.jpを使用した手動での証明書更新

##### ステップ 1: Certbotのインストール

CertbotをHomebrewを使用してMacにインストールします。

```bash
brew install certbot
```

##### ステップ 2: 証明書の取得

DNS-01チャレンジを使用して証明書を手動で取得します。

```bash
sudo certbot certonly --manual --preferred-challenges dns -d "XXX.mydns.jp" -d "*.XXX.mydns.jp"
```

##### ステップ 3: DNS TXTレコードの設定

Certbotが生成するTXTレコードをMyDNS.jpに設定します。Certbotはフルネーム`_acme-challenge.XXX.mydns.jp.`を表示しますが、MyDNS.jpではレコード名として`_acme-challenge`のみを入力します。

##### ステップ 4: DNS設定の確認

設定したTXTレコードが正しくDNSに反映されているかを確認するために、[Google Admin Toolbox - DIG](https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.searchserver.mydns.jp)を使用します。

#### Google Cloud DNSを使用した自動更新

##### ステップ 1: Google Cloudプロジェクトのセットアップ

Google Cloud Consoleにアクセスし、新しいプロジェクトを作成してDNS APIを有効にします。

##### ステップ 2: サービスアカウントの作成

サービスアカウントを作成し、DNS管理者権限を付与し、JSON形式のキーをダウンロードします。

##### ステップ 3: DNSゾーンの作成

Google Cloud DNSで新しいDNSゾーンを作成し、ドメイン名を設定します。

##### ステップ 4: 自動更新スクリプトの設定

`manual-auth-hook.sh`と`manual-cleanup-hook.sh`を作成します。以下は`manual-auth-hook.sh`の例です。

```bash
#!/bin/bash
gcloud auth activate-service-account --key-file=/path/to/your-service-account-key.json
gcloud dns record-sets transaction start --zone="your-zone-name" --project="your-gcp-project-id"
gcloud dns record-sets transaction add --name="_acme-challenge.${CERTBOT_DOMAIN}." --type=TXT --ttl=300 --zone="your-zone-name" --project="your-gcp-project-id" "${CERTBOT_VALIDATION}"
gcloud dns record-sets transaction execute --zone="your-zone-name" --project="your-gcp-project-id"
```

##### ステップ 5: Certbotの自動更新の実行

```bash
certbot renew --manual-auth-hook "/path/to/manual-auth-hook.sh" --manual-cleanup-hook "/path/to/manual-cleanup-hook.sh"
```

#### まとめ

この記事では、MyDNS.jpとGoogle Cloud DNSを使用して、Let's Encryptの証明書の手動更新と自動更新の方法を紹介しました。MacユーザーはHomebrewを利用してCertbotを簡単にインストールできます。自動更新の設定にはGoogle Cloudの設定とスクリプトが必要であり、一度設定すれば以後の更新が楽になります。
Slack匿名チャットボットで返信する方法【ワークフロー】

# はじめに
初めまして皆さん。icep1anetと申します。
普段Qiitaは読む専なのですが記事を書いて備忘録として(僕というよりこれからのエンジニアたちのために)残しておきたいと思い今年から投稿を始めることにしました。
文章を書くのは得意ではないので温かい目で見守っていただけると幸いです。

# 動機
さて、早速ですが本題に入っていきます。
最近Qiitaの記事を読んでいるとこんな記事を見つけました。
[【ワークフロー】Slackで匿名掲示板を作る](https://qiita.com/eiji-noguchi/items/75b7d1b06ed46318f350)
面白そうだと思い研究室内で実装したところ
> 誰が送ったかわかんないし、スレッド使えないから会話するのむずいなこれ

という意見がでました。
確かに、と思い自分なりに方法を考えてみました。

# 方法
基本的な流れは参考にした記事と同じなので、肝心のワークフロー部分について説明します。
### ワークフローの全体像
結論から言うと以下のようなワークフローになります。
![anonymousThreadWorkflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/df21acd2-7161-efda-c3e3-9d5a5aff27a1.png)
### 作成方法
ワークフローを作成する画面に入った後、ワークフローの開始方法として絵文字リアクションが使用されたときを選択します。
![workflow1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/d5fd94fe-e07b-c7ac-7267-d494098ea45f.png)
次に絵文字(好きなもの)とチャンネルを指定します。
![workflow2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/d5f8f7e9-5ac3-7531-73f3-6f36ba626493.png)
左上にある名前や説明、画像などを変更した後(任意)
サイドバーからメッセージ→誰かにメッセージを送信するを選び、**メンバーを選択する**から`メッセージにリアクションしたユーザー`を選択します。また**メッセージを追加する**の部分には右下の変数を挿入するボタンから`リアクションされたメッセージへのリンク`を入れておくと返信先が確認できるため便利です。
また**ボタンを含める**にチェックを入れておきましょう。これをチェックしておかないと返信できません。メッセージには適当に返信するなどを入れておきます。
![workflow3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/48b88731-5815-9346-50a7-da8a6a53e9b1.png)
次に、サイドバーから**フォーム**を選択して**タイトル**、**回答形式**、**質問内容**等を入力してワークフローに追加します。
![workflow4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/f5f18771-b0dd-b30b-392d-2ec70c52dfbf.png)
次に、サイドバーから**スレッドでメッセージに返信する**を選択して**返信先のメッセージを選択する**で`リアクションされたメッセージへの参照`を設定。
また、**返信を追加する**の内容に先ほどフォームで収集した`返信するメッセージを入力してくださいへの回答`を設定しておきます。
![workflow5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/2393b149-9062-5e66-726f-be6e5f34c916.png)
最後に右上の設定から権限を変更して公開したらワークフローの構築は完了です。

### 使用方法
使用方法は使用したいメッセージに対して設定したリアクションを付けます。(付けた後消すのを忘れずに、付けるのは一瞬で大丈夫です)
![reactionStamp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/eb295173-93a5-85a2-1c39-5c63f27b5803.png)
すると以下のようにBotからDMが届くので返信するボタンを押して返信メッセージを入力します。
![anonymousThreadBotDM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/f241fe5a-4e66-aec9-1e3e-e1292e26270a.png)
匿名で返信することができました！！
![anonymousThreadBotReply.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296286/e781bcb1-205e-bf85-d3db-9c2c6a8db700.png)

# 問題点
勘の良い人はお気づきのようにこの方法には問題点がいくつかあります。
1. リアクションをつけて消さないといけない(消さないと誰が返信してるかわかってしまう)
2. DMに返信ボタンが届くためチャンネルを離れる必要がある
3. 返信されたことに気づけない(自分に対する返信ではないため通知が来ない)
これらの問題点は、自分でSlackBotを自作することで解決できますがBotをつくってしまうと維持管理を行わなければならないため、今回はワークフローのみで行えることとして今回の方法を紹介しました。
現状これらの問題点を解決できる方法は見つかっていません。解決策を知っている方はコメントまでお願いします。

# おわりに
はじめての投稿ということで簡単な内容から始めてみました。
これからも不定期にですが投稿を続けていきたいと思っていますのでいいね、コメント等よろしくお願いします！
Pythonで四則演算

# はじめに
Python初心者なので、基礎からということで四則演算をしてみます。
数式→Pythonの順で書いています。
また、動作はGoogleColabpratoryで確認しています。

# 加算
$1 + 1$

```python
1 + 1
```

# 減算
$100 - 1$

```python
100 - 1
```

# 乗算
$2 * 3$

```python
2 * 3
```

# べき乗
$16^2$

```python
16 ** 2
```

# 除算
除算は求めるものによって異なるので、下の数式でパターン毎に書いておきます。
$7\div2$

### 商を求める
```python
7 / 2
```

### 剰余を求める
```python
7 % 2
```

### 商と剰余を求める
```python
パターン1
7 // 2, 7 % 2
パターン2
divmod(7, 2)
```

# 参考サイト
べき乗と除算の書き方について、下記サイトを参考にさせていただきました。
[［解決！Python］割り算の商と余りを求めるには](https://atmarkit.itmedia.co.jp/ait/articles/2208/09/news036.html)
[Pythonの算術演算子（四則演算、べき乗、リスト・文字列の結合など）](https://note.nkmk.me/python-arithmetic-operator/)
スクラムでの役割〜スクラムマスターとプロダクトオーナーは兼任できるのか？〜

アジャイルコーチをしている中で、スクラムにおける役割を

## スクラムでの役割

[スクラムガイド](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)では3つの役割が明文化されています。

* スクラムマスター
* プロダクトオーナー
* 開発者 

## プロジェクトマネージャーいないんだけど・・？

スクラムガイドにはプロジェクトマネージャーと言う役割は出てきません。
しかし、**誰もがプロジェクトをマネジメントに責務を持つ**という意味合いなので、**プロジェクトマネジメントが不要**と言う解釈は間違いです。

## スクラムマスターの責務は？

スクラムマスターは **"プロセス"** に責任を持つ。

 * 開発者、プロダクトオーナー、組織にスクラムを浸透させるよう**ファシリテート**を行う
 * スクラムの推進を阻害する要因から**スクラムチームを守り**、障害を取り除くため**プロセスを改善**する
 * ステークホルダーへ**作業の見える化**し、**パフォーマンスの改善を定期的**に行う

## プロダクトオーナーの責務は？

プロダクトオーナーは **"何を"(What)** 作るか責任を持つ。

 * プロダクトのミッション・ビジョンを策定する
 * プロダクトのバックログを作成・整理、リリース計画の策定、プロダクトのゴールを設定する
 * 顧客へ価値を届けることに責任を持つ

## 開発者の責務は？

開発者は **"どのように"(How)** 作るか責任を持つ。

 * プロダクトオーナーは決めた"何を"、**どのように顧客へ届けるインクリメントを作成するか**の手法に責任を持つ
 * スプリントバックログの作成
 * スプリントのゴールを達成するために、毎日の作業計画を状況に応じて適応させる
 * 各分野のプロフェッショナルとして責任を果たす

## 兼任しても良いの・・・？

スクラムガイドでは、下記のような記載があります。

> プロダクトオーナーまたはスクラムマスターがスプリントバックログのアイテムに積極的に取り組んでいる場合は、開発者として参加する。

それ以外の兼任や兼務に関する記載はないので、プロダクトオーナーとスクラムマスターの兼任に言及されているわけではありません。
しかし、プロダクトオーナーとスクラムマスターの**兼務**はやらない方が良いと考えおります。
なぜなら、スクラムマスターとプロダクトオーナーそれぞれの責任を持つことが難しく、時として互いに相反することがあるためです。

プロダクトオーナーは各ステークホルダーとの調整・意思決定などを行うため、日々業務に追われるケースが多いです。
そのため、兼務してしまうと自身が単一障害点となってしまいます。

また、社長などの所属長から「これ早くしてよ〜」と指摘を受けた場合など、価値提供を優先すると言う選択肢が出てきます。
兼務してしまうと、プロダクトオーナーは価値提供を優先してしまい、スクラムプロセスからチームを守ることができず崩壊する場合もあります。

## でも現実問題...

スクラムマスター専任で行うのはリソース的に厳しいケースがしばしば...
とわ言え、**専任**でやった方が良いけど、**必須**ではなく、開発者との兼務であれば大きな問題はないと考えております。

役割云々ではなく、**スクラムマスターが責務を果たしているか**ということが一番大切です。
CloudWatch カスタムディメンション追加


## はじめに
CloudWatchメトリクスのカスタムディメンション追加に関する備忘録
今回はEC2上でテストスクリプトを実行してメトリクスを受け取る。

## 1.　EC2インスタンスにSSH接続

```ruby:bash
ssh -i 'キーペアのパス' ec2-user@'EC2のパブリック IPv4 DNS'
```
## 2.　CloudWatch エージェントのインストール

```ruby:bash
sudo yum install amazon-cloudwatch-agent
```

## 3.　CloudWatchエージェントの構成ファイル編集
以下のコマンドでvimを開く
```ruby:bash
sudo vim /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

```
以下をコピペして保存
今回はインスタンスIDとインスタンスタイプを追加取得する
```ruby:json
"metrics": {
    "append_dimensions": {
        "InstanceId": "${aws:InstanceId}",
        "InstanceType": "${aws:InstanceType}"
    }
}
```
以下のコマンドでエージェントを再起動する
```ruby:bash
sudo systemctl restart amazon-cloudwatch-agent
```


## 4.　CloudWatchダッシュボードの作成
1.マネジメントコンソールでCloudWacthを開く

2.カスタムダッシュボードからダッシュボードの作成

3.適当な名前を入力して作成を押す

## 5.　SDKインストール
```ruby:bash
pip install boto3
```

## 6.　テストスクリプトをローカルに配置
```ruby:python
import boto3
import psutil

cloudwatch = boto3.client('cloudwatch',region_name='ap-northeast-1')　#　　リージョンを入力

def send_cpu_utilization(instance_id, cpu_utilization):
    response = cloudwatch.put_metric_data(
        Namespace='EC2/CPUUtilization',
        MetricData=[
            {
                'MetricName': 'CPUUtilization',
                'Dimensions': [
                    {
                        'Name': 'InstanceId',
                        'Value': instance_id
                    },
                ],
                'Value': cpu_utilization,
                'Unit': 'Percent'
            },
        ]
    )
    print(response)

if __name__ == '__main__':
    instance_id = 'your-instance-id'  # インスタンスの ID を指定します
    cpu_utilization = psutil.cpu_percent(interval=1)  # CPU 使用率を取得します
    send_cpu_utilization(instance_id, cpu_utilization)

```

### 7.　クレデンシャルの設定
下記コマンドを実行してアクセスキーID、シークレットアクセスキーを入力
```ruby:bash
aws configure
```
### 8.　テストスクリプトの転送
```ruby:bash
scp -i 'キーペアのパス' 'スクリプトのパス' ec2-user@'EC2のパブリック IPv4 DNS':~/
```
### 9.　テストスクリプトの実行
以下が問題なく実行できればコンソールのダッシュボードからメトリクスを確認できる
```ruby:bash
python 'スクリプトのパス'
```
学習日記#6: Kaggle startbook ch2.2

## ゴール
TitanicのコンペにSubmit

## 教材
Kaggleスタートブック ch2.2

## やったこと
- Kaggle上でNotebook作成
- Inputをコンペから直接追加
- Kaggle startbookのサンプルコード(.ipynb)をKaggle NotebookにImport

## 学び、気づき
- サンプルコードをそのまま実行したらFuture Warningsでる件 #1
`data['Sex'].replace(['male', 'female'], [0, 1], inplace=True) `
    - replaceメソッドでinplace引数=Trueを使うと以下メッセージが出る（ただし処理は正常に実行される）どうやら「記法は新しいやつにしてくれよな！」と言ってるらしい。
```
FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.


  data['Sex'].replace(['male', 'female'], [0, 1], inplace=True)
/tmp/ipykernel_34/3697913337.py:1: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  data['Sex'].replace(['male', 'female'], [0, 1], inplace=True)
```
- サンプルコードをそのまま実行したらFuture Warningsでる件 #2
    - 

- メソッドやら引数やら
    - concatメソッドのsort=Falseで並べ替えしない
    - concatメソッドのignore_index=Trueで縦結合の連番振り直し
    - 置換処理はreplaceメソッド（リスト型の多次元配列）よりmapメソッド（ディクショナリ型）のほうが後々分かりやすい気もするが...棲み分けかたは今のところ謎
    - 欠損値を補完するときの`data['Age'].fillna(np.random.randint(age_avg - age_std, age_avg + age_std), inplace=True)`は便利そう
        - 平均と標準偏差の差と和の間の整数値をランダムで補完するやり方
    - 不要な列を削除する際に削除対象の列を格納する変数を定義しておくと読みやすい
        ~~~ 
        delete_columns = ['Name', 'PassengerId', 'SibSp', 'Parch', 'Ticket', 'Cabin']
        data.drop(delete_columns, axis=1, inplace=True) 
        ~~~

    - 冒頭でconcatメソッド使って結合した学習データとテストデータについてとき超量エンジニアリング実行後に分割する際に以下のlenメソッドを使った方法で簡単に分割できる
        ~~~
        train = data[:len(train)]
        test = data[len(train):]
        ~~~
        - 前提として学習データとテストデータが縦結合していること。

## 詰まった...
~~~
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression(penalty='l2', solver='sag', random_state=0)
clf.fit(X_train, y_train)
~~~

↑を実行すると↓のエラーを吐いてしまうが解決方法が不明

~~~
/opt/conda/lib/python3.10/site-packages/sklearn/linear_model/_sag.py:350: ConvergenceWarning: The max_iter was reached which means the coef_ did not converge
  warnings.warn(
~~~
異常値や欠損値の処理が不十分なのか...???
とはいえサンプルコードそのまま実行すすめてSubmitまで一応完了できた。
UnityのGraphicsのDraw系Render系関数を解説

# はじめに
UnityのGPUインスタンシング初心者の皆さんこんにちは。完全理解シタモノです。

だんだん暖かくなってきましたね。そろそろ「Mesh生成しまくるのめんどくね？ Graphicsの関数勉強すんべ」みたいな気持ちになってきたのではないかと思います。

しかしGraphicsの関数は似た名前の物が多く「どれ使えばええねん！！」となってしまうと思います。そこで関数を見分けるキーワードを解説しましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286137/81acc946-688a-5aed-c581-f8f2757e2efa.png)

# Render vs Draw
一緒だけどDrawは古くていずれ消えます。
ただNow系は生き残るかもしれません。

# Mesh vs Procedural vs Primitive
Meshは入力されたメッシュを描写します。
残り二つは入力されたトロポジ(三角形とか点とか)を描写します。

# Indexed
頂点座標情報(mesh.vertices)は1つもいらないけど、SV_Indexの情報は指定したい、そのためにMeshを作るのはいやだ、そんなあなたにこの関数。Index情報を指定するバッファを用意しています。

# Indirect
日本語で間接的、という意味です。
投稿した瞬間にご覧になった皆さんすみません。間違ってました。
描写shaderの関数呼び出し入力を詳細に制御できる関数らしいです。

# Now
これらにはmaterialを指定するものがありません。では使われるシェーダーはどうやって指定されるの！？ 今のでしょ！ というわけで今使われてるシェーダー情報をそのまま使うみたいです。別々の関数で呼び出したいけどSetPassCallは増やしたくないみたいな感じで使うのでしょう。きっと。

# 終わりに
### 今ならDrawProceduralIndirectとRenderPrimitivesIndexedの違いを説明できますね！？
metaとは

# metaタグとは

`meta` タグですが、なんとなくで使っていたので、調べる事にしました。

## metaタグ

`meta` タグとは、***Webページに関する情報を記載するタグ***です。
`meta` タグに情報を記載することで***ブラウザや検索エンジンにWebページの情報を伝える***ことができます。例えば、文字コードや検索結果に出てくるWebページの説明文です。詳しくは、下記で説明します。

`meta` タグの情報は、`内部SEO` に強く影響を与えます。`meta` タグに正しくWebページの情報を記載することで、`内部SEO` の質が上がります。質が上がると、検索結果で上位表示することができ、アクセスの増加などにつながります。

### よく使われるmetaタグ

`mata` タグは、`head` タグ内に記述します。`head` タグ内にあるため、Webページ上に表示されません。
`Google` でよく使われる `meta` タグを `CodePen` で実際に記載してみました。

参照: [公式 Google検索セントラル metaタグ](https://developers.google.com/search/docs/crawling-indexing/special-tags?hl=ja#meta-tags)

~~~html
<html>

<head>
  <title>Learn meta tag</title>
  <meta charset="utf-8">
  <meta name="description" content="learn meta tag in html of head.">
  <meta name="robots" content="noindex">
</head>

<body>
  <h1>Learn meta tag</h1>
</body>

</html>
~~~

<dl>
 <dt>charset</dt>
 <dd>
 文字コードを指定します。<br />
 EX) 多くは `utf-8` を指定します。（HTML5推奨）
 </dd>
 <dt>description</dt>
 <dd>
 メタディスクリプションといい、Webページの説明を100文字程度（PC: 100文字、SP: 70文字程度）で記述します。検索結果のスぺニットに使用されます。<br />
   → 短すぎず長すぎずWebページのコンテンツに沿った文章をわかり易く記述することで、ユーザーに伝わりやすく、アクセスの向上や `SEO` の質が高まります。<br />
  参照: <a href="https://developers.google.com/search/docs/appearance/snippet?hl=ja">公式 - Google 検索結果のスぺニット</a>
 </dd>
 <dt>robots</dt>
 <dd>
 検索エンジンがクロールとインデックス登録を行う際の動作を制御するものです。<br />
 参照: <a href="https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag?hl=ja#directives">公式 - Google Robotsルール</a>

 デフォルトは `index` と `follow` で、記載は必要ありません。<br />下記は、よく指定するスぺニットのインデクス表示の登録と表示を制御するルールです。
 <ul>
    <li>
    noindex: 指定したページを検索結果に表示しない<br />
      EX) 運営しか使ってほしくない管理画面、購入完了など完了画面
    </li>
    <li>
    noflow: リンクをたどらない<br />
      EX) 関係ないリンクがWebページ内にある時（※ head内だけでなく、個別でリンクに指定できます。）
    </li>
 </ul>
 </dd>
 <dt>viewport</dt>
 <dd>指定することで、モバイル端末でのテキストなどの表示を最適化することができます。</dd>
</dl> 

## まとめ

`meta` タグは、ブラウザや検索エンジンにそのWebページの情報を伝え、`SEO` に影響を与えることが分かりました。
`SEO` についても、今後理解を深め、勉強していきたいと思います。

---

**ご覧いただきありがとうございました:bow:**

今後もフロントエンド開発で気になったことや分からないことを調べて、共有していきたいと思います。
間違いなどございましたら、教えていただきたいです。
PVEでSPICEを使ったコンソールアクセス

:::note info
作成日：2024/4/29
PVE 8.2.2
:::


## TL;DL

- PVE上のゲストOSにSPICEでアクセスしてみた。
- NoNVCとの比較。
- 手順など。


## 概要
PVEでSPICE(Simple Protocol for Independent Computing Environments)を使ってみました。
※Qiitaのタグもなんですが、AWS Quicksight のSPICEではないです。

## NoNVCとの比較

### Positive
- クリップボードの共有
- ファイルの転送
- USBデバイスの共有（パススルー）
- 高解像度

### Negative
- クライアントのインストールが必要
- VMの設定が必要
- 経路上NWの設定が必要


## 手順

- 接続元
  - Windows 10
- 接続先
  - （PVE上の）Debian 12


### Virt-viewerのインストール
接続元にクライアントのインストールが必要です。

https://virt-manager.org/download


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/b6ba454d-d4d3-66b6-c8ec-a18251ce993b.png)


### PVEの設定変更

#### ディスプレイ
`対象VMのハードウェア`-`ディスプレイ`-`グラフィックカード`-`SPCIE`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/d5b551d1-0112-df45-1692-63397efe892f.png)

#### USB（オプション）
`対象VMのハードウェア`-`追加`-`USBデバイス`-`SPCIEポート`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/94190734-fded-6916-749f-3f01ca608799.png)


### 接続
`コンソール`-`SPICE`が選択できるようになっているので選択すると、.vvファイルがダウンロードされます。
これを実行することで接続可能です。


- 接続すると.vvファイルは消去
  - テキストエディタで`delete-this-file`の値を変更することで残すことができるが、.vvファイルだけあれば制限なく接続できるわけではない。
- PVEのセッションを切断利用すると利用不可
  - .vvファイル内に認証情報が含まれているため。
- PVEへの管理コンソールアクセスとは別の通信要件が発生
  - `proxy=http://（PVEのIP）:3128 `と設定ファイル内にあるため、こちらを許可する必要がありそう


### 接続後

#### クリップボード共有
テキストエディタやコンソールなどに対して、テキストの共有はできました。
ただしファイルは共有できず、以下の方法で転送できました。
※この辺りはUSB同様にOSの互換性によるかもしれない。


#### ファイル転送
SPICEのウィンドウにファイルをドロップすると転送できます。
ログインユーザーのダウンロードフォルダに格納されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/8df9e3d0-5cf3-ea07-0487-1dd5531efe28.png)



#### USBの共有
今回の環境では以下エラーによりNGでした。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2459468/2a6db6ad-7cdc-1504-e689-227928693f2c.png)


SPICEとしてはUSB共有しようとしているのでよしとします。
ゲストOSもWindowsなら可能、などといった互換性はありそうです。


## その他
NoNVCと違って.vvファイルがDLできるので、それを使って恒久的にアクセス可能な設定ファイルとしてユーザーに配布することができるかも？と思って.vvファイルの中身を見たりしましたが、前述の通りPVEの認証に依存しているのでダメそうです。
※都度PVEでVMへのコンソールアクセスが必要。

PVEを使ってVDI環境を作るならPVEで権限を管理し、通信を終端できるので、VM・ファイル単位のバックアップやのリストアを提供（ファイル単位のリストアはPBSが必要）したりを考えると、仮想OSにRDPを通したりするよりは便利かも？
一方で、ゲストのWindowsOSがあるならPVEもAD連携しそうでゲストOSとPVEへの認証情報が同じになりそうとか、PVEやSPICEの操作をユーザーに教える運用負荷があったり、PVE上の権限設定もちゃんとやらなきゃいけない（PBSからVMのリストアしようとしたときに対象VMだけじゃなくて、経路上NW・PBSの権限付与も必要だった）とかを考えると、痛し痒しかなぁ。

総合的に判断的な奴ですね…


## 参考

https://pve.proxmox.com/pve-docs/chapter-qm.html#qm_display

https://en.wikipedia.org/wiki/Simple_Protocol_for_Independent_Computing_Environments

https://virt-manager.org/download
FlutterでのGetterとSetterの使い方

Flutterにおいて、オブジェクトのプロパティにアクセスするためのGetterとSetterは、効果的なデータの取得と設定を可能にします。この記事では、FlutterでのGetterとSetterの基本的な使い方と、それらを活用してコードをより効率的に記述する方法について解説します。
# Getterとは？
Getterは、オブジェクトのプロパティを取得するためのメソッドです。特定のプロパティに対してGetterを定義することで、そのプロパティの値を取得するためのカスタムロジックを適用することができます。

以下は、Getterの基本的な構文です。
```dart
// Getterの基本的な構文
returnType get propertyName {
  // カスタムロジック
}
```
例えば、次のコードは、名前を保持するPersonクラスのGetterを示しています。
```dart
class Person {
  String _name;

  // 名前のGetter
  String get name {
    return _name ?? "No Name";
  }
}
```
このGetterを使用すると、次のようにしてPersonオブジェクトの名前を取得できます。
```dart
Person person = Person();
print(person.name); // 出力: No Name
```
# Setterとは？
Setterは、オブジェクトのプロパティに値を設定するためのメソッドです。特定のプロパティに対してSetterを定義することで、そのプロパティの値を設定する際にカスタムロジックを適用することができます。

以下は、Setterの基本的な構文です。
```dart
// Setterの基本的な構文
set propertyName(value) {
  // カスタムロジック
}
```
例えば、次のコードは、Personクラスに名前を設定するSetterを示しています。
```dart
class Person {
  String _name;

  // 名前のSetter
  set name(String value) {
    _name = value.trim();
  }
}
```
このSetterを使用すると、次のようにしてPersonオブジェクトの名前を設定できます。
```dart
Person person = Person();
person.name = " John "; // 名前を設定
print(person.name); // 出力: John
```
# GetterとSetterの利点
GetterとSetterを使用すると、以下のような利点があります。

1\. カプセル化: クラスの内部実装を隠蔽し、外部からのアクセスを制御するための効果的な方法です。
2\. データの検証と変換: Setterを使用して入力データを検証または変換することができます。Getterを使用してデータを取得する前に、カスタムロジックを適用することも可能です。
3\. コードの拡張性と保守性: GetterとSetterを使用することで、コードの拡張性と保守性を向上させることができます。後の段階で挙動を変更する必要がある場合、GetterやSetter内のロジックを変更するだけで済みます。

Flutterにおいて、GetterとSetterは、効率的なデータの取得と設定を可能にする重要なツールです。これらを適切に活用することで、より柔軟でメンテナブルなコードを書くことができます。
JavaScriptで `fetch` を使う時のエラーハンドリングの方法



## はじめに

JavaScriptでAPIをFetchするときのエラーハンドリングの方法をまとめます
。この記事では、`fetch` を使った非同期処理で起こり得る異なるエラータイプと、それらを効果的にハンドルする方法について解説します。

## エラータイプ

非同期処理では主に次の三種類のエラーが考えられます：

1. **ネットワークエラー**:
   - これは `fetch` がネットワーク接続がない、またはリクエストが何らかの理由で送信できない場合に発生します。
   
2. **HTTPエラーステータス**:
   - リクエストが送信され、サーバーがエラーステータスコード（例: 404 Not Found, 500 Internal Server Error）と共にレスポンスを返した場合です。
   
3. **データ処理エラー**:
   - レスポンスが正常に受信されたが、例えばJSONとして無効であるなど、データの処理中に問題が発生した場合です。

## エラーハンドリングの実装

以下は、これらのエラーを適切に処理するための一般的な実装例です：

```javascript
// 非同期関数の定義
async function fetchData(url) {
  try {
    // fetchリクエストを送信
    const response = await fetch(url);

    // HTTPレスポンスステータスをチェック
    if (!response.ok) {
      throw new Error(`サーバーからの応答が異常です: ${response.status}`);
    }

    // JSONとしてレスポンスをパース
    const data = await response.json();
    console.log('取得したデータ:', data);

  } catch (error) {
    // ネットワークエラーまたはデータ処理エラーの捕捉
    console.error('エラーが発生しました:', error);
  }
}

// 実際にAPIからデータを取得するための関数呼び出し
fetchData('https://api.example.com/data');

```
## エラーハンドリングのポイント

- **ネットワークエラー**は `fetch` 関数が例外を投げることで検出されます。これにより接続の問題やリクエストの失敗を捕捉します。
- **HTTPエラーステータス**のチェックは、`response.ok` プロパティを評価することで行います。これにより、サーバーが返すHTTPステータスコードが成功を示しているかどうかを判断できます。
- **データ処理エラー**は、通常JSONの解析など、レスポンスの内容を処理する際に発生します。これも `try...catch` ブロック内で捕捉されるため、一元的なエラーハンドリングが可能です。
BizRobo!【DS】画面要素が掴めない場合の対処法

就業先では、RPAツールのBizRobo!を使用しています。BizRobo!開発で悩み、BizRobo!ナレッジベースで日々検索しています。

RPAは、さまざまなWebシステムの画面要素を取得することで、画面操作をすることができます。しかし、Webシステムはバージョンアップが行われるため、画面要素が変更になることは多々あります。画面要素を再度取得し直せれば問題ないのですが、BizRobo!の古いバージョンだと画面要素を取得できなくなることがあります。
今の就業先では、別RPAツールによる再開発を検討することがほとんどですが、その前にBizRobo!の環境を変更することで、対応できないか試します。

今回は、BizRobo!のDSで画面要素が掴めない場合の対処法について共有いたします。

※BizRobo!バージョンは、10.3.0.2です。
※時間が経過して変わってしまった箇所や間違っている箇所、不適切な表現があるかもしれませんが、その時は都度修正いたしますので、ご指摘いただけると幸いです。


## DSの画面要素が掴めなかった場合のエラー
私が就業先で出くわした、DSの画面要素が掴めなかった場合のエラーは、「タグが見つからないエラー(Tag not found)」がほとんどです。

エラーの詳細と解決策は以下をご参考ください。
[【解決策】[DS]画面遷移アクション（Load Page、Clickアクションなど）の後続ステップでタグが見つからないエラーが発生するときの対処方法](https://knowledge.bizrobo.com/hc/ja/articles/360027601891)
[DSのWEBページ操作で「タイムアウトエラー(TimeOut)」や「タグが見つからないエラー(Tag not found)」が発生する場合の対処方法](https://knowledge.bizrobo.com/hc/ja/articles/360055493211)


## DSの画面要素が掴めなかった場合の対処法
DSの画面要素が掴めなかった場合は、別RPAツールを試す前に、BizRobo!の設定をいくつか変更することを試します。試す方法をいくつかご紹介します。

#### SSL/TLS、HTTPユーザーエージェントを変更する
ロボットの設定＞デフォルトオプション＞すべてのローディングにある「SSL/TLS」、「HTTPユーザーエージェント」を変更することを試します。
<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955689/5392ee39-33fe-2e3f-7c07-4d04b81338dc.png">

参考になるURLは、以下の通りです。
[指定したURLのページがDesign Studio上で表示されない場合の対応](https://knowledge.bizrobo.com/hc/ja/articles/360028161231)

#### JavaScriptの実行をオフにする
ロボットの設定＞デフォルトオプション＞JavaScript実行にある「JavaScriptの実行」のチェックを外すことを試します。
JavaScriptの実行を止めてしまうため、あまり成功したケースがないと主観的には感じています。
<img width="75%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955689/9376c736-3fc1-c47a-b882-7509706e52b0.png">

参考になるURLは以下の通りです。
[内蔵ブラウザエンジン（Webkit/Classic）でサポートしていないJavaScript](https://knowledge.bizrobo.com/hc/ja/articles/360031148771)

#### ロボットをClassicに変更する
Classicとは、BizRobo!Basicが独自に作り上げたブラウザレンダリングエンジンで、IE8にもっとも近い動きをするように作られています。WebKitエンジンとは、エンジンの仕様が違うため、試す価値があります。ただし、内部ブラウザエンジンの採用されている技術が古いため、最新のブラウザにはたいできないケースが多いです。

参考になるURLは以下の通りです。
[Classicエンジン と WebKit エンジンとの違い](https://knowledge.bizrobo.com/hc/ja/articles/360028162811)
[【解決策】Webサイトを操作する際のWebブラウザエンジンの使い分けについて](https://knowledge.bizrobo.com/hc/ja/articles/360027988232)

#### WebサイトをChromiumで開く
Chromiumは、DSとDAの両方の特徴をもったブラウザエンジンです。Chromium は、既存のロボットと同様に DS/RS 上でバックグラウンド実行されます。また、DA のインターフェースを使用して、ロボットの作成を行います。
Chromiumで該当のWebサイトを開くことを試します。ただし、内部ブラウザエンジンの採用されている技術が古いため、最新のブラウザには対応できないケースが多いです。

参考になるURLは以下の通りです。
[Chromium の概要](https://knowledge.bizrobo.com/hc/ja/articles/360027504311)
[ChromiumでWebページを開く方法](https://knowledge.bizrobo.com/hc/ja/articles/360041996191)


## 最後に
BizRobo!【DS】画面要素が掴めない場合の対処法について解説いたしました。

BizRobo!のDSで画面要素が掴めない場合の対処法を整理しました。DSでの開発は1年強になりますが、DSで画面要素が取得できないケースにまだ慣れていないため、今回整理した方法を用いて、問題を解決していきたいと思います。

今回紹介した方法は内部ブラウザの技術が古いため、最新のWebシステムには対応していないケースが多いです。そのため、DSで画面要素が掴めない場合は、DAでの開発や別RPAツールでの開発を検討したほうがいいと思います。しかし、DA環境構築や別RPAツールでの開発は、金額の問題もあり、ハードルが高いため、その前に今回紹介した方法を試し、できるだけDSで開発できないか検討したいなと思います。

個人的には、いつかDAでの開発経験もできたらと考えています。

今回の記事が、RPA開発で悩んでいる人の為になれば幸いです。
完全未経験（元消防士）からWEB系エンジニアへの道　

私は、今年の3月で消防を退職しWeb系エンジニアを目指す２６歳男　すず。
こういった、ブログは初めて書く。続くかは、分からないけどなるべく長く続いたらいいなくらいの気持ちで記録として残していこうと思う。

一番最初のきっかけは、WEBデザイナーになりたいと思ったことからIT業界に興味もった。
そこから、WEBスクールやYouTubeでデザインの勉強をしたが、表向きはフルスタックに活躍できる人材を目指して、プログラミング学習を始めた。（まだ半月くらい笑）

正直、未経験からどうやってITの世界に飛び込んでいけばいいか道筋が曖昧で、それに悩んでいる未経験の人間も多いのではないだろうか。
そんな中、本日『Web系エンジニアになろう』という本を、たまたま図書館で見つけた。
そこには、私が求めていた内容が分かりやすく、且つ、見やすくシンプルな白と青を基調としたデザインで眠くならずにスラスラと読めた。
『Web系エンジニアとはなにか』から『Web系エンジニアになる方法』、『WEBスクールの選び方』、『Web系エンジニアのキャリア形成』など基礎から必須知識まで載っているため未経験な人間からすると非常にありがたい本であった。その中でも、特に、『Web系エンジニアになる方法』に、今欲しかった情報が書いてあった。
内容については、ここでは割愛するが、そこの一部に『Qiitaアカウントを作成する』と書いてあり、今に至る笑
とりあえず、いいと思ったこと、必要そうなことは、やってみて自分で判断することがモットーであるため
今後は、こちらに学習内容のアウトプットから他愛もないことをここに書いていきたいと思う

今日の学習
インフラエンジニアの教科書　読書　一部のみ　３０分
Web系エンジニアになろう　読書　1時間くらいかな
VS CodeでCSSをコーディング　２時間くらい　つまづいてる笑
合計　３時間から４時間弱くらい

なにがなんでもやりきれ！俺！
ただ、程よく頑張れ
AWS Amplifyの新世代Gen2で生成AIアプリをサクッとデプロイ！

これをやっていきます。

https://aws.amazon.com/jp/blogs/news/use-generative-ai-and-next-js-with-aws-amplify-to-build-a-fullstack-recipe-generator/

なお、エラー等で詰まったときはClaude 3 Opus（有料版）を頼りました。おっぷすおっぷす〜〜！！✌️✌️ [^1]

https://claude.ai/

[^1]:https://x.com/syobochim/status/1780267677782880498


# ハンズオン

### ローカル環境の準備

前提条件を確認：

- Node.js v18.17 以降
- npm v9 以降
- git v2.14.1 以降

なお、Nodeはv20系だとうまく動かないため注意。**（ハマりポイント）**


### Bedrockのモデルを有効化

バージニア北部のClaude 3 Sonnet（中堅モデル）を有効化しておく。

![スクリーン ショット 2024-04-29 に 17.58.28 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/5813d296-c8e3-8c6f-6ab8-3b19b4ae3ce4.png)


### ソースコードを取得

リポジトリのクローン

```bash:Cloud9 ターミナル
$ git clone https://github.com/aws-samples/recipe-ai.git
$ cd recipe-ai 
```

バッケージのインストール

```bash:Cloud9 ターミナル
$ npm ci
```


### アプリケーションを実行

新しいターミナルを開き、以下を実行。

```bash:Cloud9 ターミナル
$ npx amplify sandbox
```

すると、CloudFormationが実行されてAWSアカウント上に一時的なバックエンド環境がデプロイされます。これは凄い！
（Sandbox環境の実行を停止すると、CFnスタックが自動で削除される）

元のターミナルで以下を実行。


```bash:Cloud9 ターミナル
$ npm run dev
```

すると、ブラウザーでローカルのフロントエンドにアクセスできるようになります。


### ブラウザーで動作確認

以下のURLにアクセス

http://localhost:3000

無事にアプリが利用できました🎉

![スクリーン ショット 2024-04-29 に 21.05.15 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/d4cf05dc-aa51-af89-c65d-a766ac234069.png)

試しに食材名をカンマ区切りで入力して、料理をGenerateしてみましょう。


### ソースコードを改造

タイトルや、LLMへ投げるプロンプトを日本語にしてみましょう。

- src/app/page.tsx：ページ本文の変更が可能
- amplify/data/bedrock.js：プロンプトの変更が可能

![スクリーン ショット 2024-04-29 に 21.41.53 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/26a4b3e5-bddc-fcf1-7a7d-4bf21e4b5579.png)

さらに、もはやレシピ関係ないジェネレーターに改造するのも簡単です。

プロンプトをいじるだけ！

![スクリーン ショット 2024-04-29 に 23.08.45 午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/f43f8a1d-2811-a538-b87e-aa38dd4837c9.png)

ローカルで開発完了したらクラウドへ本格デプロイも可能なのですが、今日はいったんここまで。


# おまけ：Claude 3 Opus化も可能！

リージョンをオレゴンに変更して、Claude 3 Opusに対応させることも可能です。

以下ファイルのリージョンとモデル名を変更します。
- amplify/backend.ts
- amplify/data/bedrock.js

👇 Opusで生成したレシピ。ちょっと賢くなってます

![スクリーン ショット 2024-04-30 に 11.37.57 午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633856/4d81e222-b233-9bac-7531-25eecdbbf509.png)

※ちなみに、プロンプトを日本語に変更すると、なぜかOpusではレスポンスがうまく取得できなくなってしまいました。モデルの呼び出しログは成功していることを確認済み。謎です 🤔
Quiztime-Writeup(Apr 23, 2024): What is the name of this town? 

## 前置き
OSINTトレーニングの一環で、X(旧Twitter)で開催されているVerif!cation Quiz Botに取り組んでいます。備忘録も兼ね、調査の過程をWriteupという形で整理してみました。

https://twitter.com/quiztime

## 課題

Q1. この街の名前は？
Q2. (Bonus) 次の駅は？

https://twitter.com/bayer_julia/status/1782515353433567292

## Q1: 調査

まずは基本に沿って逆画像検索を行ってみます。
私の場合、初手は大体GoogleかYandexを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/3ad4078a-dbe7-a698-e5b4-10083cf9ce90.png)

これだと何もわからないので、特徴ある建物にフォーカスしてみます。それらしい画像が引っかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/202da400-fb81-8730-6982-b5ffadcf3ba7.png)

このあたりがよさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/1bce26e4-171c-0aa1-8a6b-9e646fc08d9b.png)

Wikipediaのデータベース版みたいなもんですかね。
https://www.wikidata.org/wiki/Q1776820

建物の名前？が記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/bda32cc3-3194-8a01-4d68-f649aa5c1f7f.png)

Google Mapで「Sankt Pantaleon Unkel」を検索してみます。

https://www.google.co.jp/maps/place/St.+Pantaleon+Unkel/@50.5977784,7.2109049,17z/data=!4m10!1m2!2m1!1sSankt+Pantaleon+Unkel!3m6!1s0x47befa99ee96dbdf:0x3b42dcefa7596266!8m2!3d50.59737!4d7.2132542!15sChVTYW5rdCBQYW50YWxlb24gVW5rZWySARZyZWxpZ2lvdXNfb3JnYW5pemF0aW9u4AEA!16s%2Fg%2F11c2nkdw3v?hl=ja&entry=ttu

課題は川を挟んでいるようなので、候補建物からみて川の向かいからストリートビューで確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/8ccec17e-f158-b6ce-edfd-2c1935156b23.png)


地形や周囲の建物から、この位置で間違いなさそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/266ac5dc-3a58-e351-fc4b-1d73699d08f1.png)

(課題)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/fc701fce-e2fb-a269-5108-2f1bf437a8d2.png)

撮影されている場所、という意味では、住所は"Corneliaweg 5, 53572 Unkel, ドイツ"となっているので、正解は **Unkel** と思われます。

## Q2: 調査

課題から、撮影者は電車に乗っているようです。
建物から見て川向こうの路線を特定したいですが、路線の名前をどう特定するのが効率的なのかわからず。何気なしにググってみたところ、それっぽいのが出てきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/e48f58bd-32b6-13fa-dae9-c80ab4ead912.png)

この鉄道はKolnからMainzまで走っているようで、Unkel付近の駅名を目視で確認することにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/c0ab75ab-e37a-0ec0-9fd3-ac72907589b7.png)

Unkelは、OBERWINTER駅とRemagen駅の間っぽいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/420da6e3-160a-4592-98c8-3fb60108c6a1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3781214/6e7bb0ce-a462-2530-90da-8edda65968ac.png)

よって、課題画像の位置における次の駅は、**OBERWINTER** または **Remagen** と思われます。

しかし残念ながら、私の今の知見では列車の進行方向を判断できず、正確に特定するには至りませんでした。(残像の雰囲気からは、Remagenに向かっているような気はするのですが・・・。)

## 終わりに

私が辿り着けなかった列車の進行方向の判断方法や、他のアプローチ、または回答に誤りなどがあれば、コメント欄でご指摘いただけますと幸いです。
ModuleNotFoundError: No module named '_tkinter'とModuleNotFoundError: No module named '_lzma'を解決する

# はじめに
先日UbuntuにてPython3.12.2の環境を構築しようとしたところタイトルのようなWarningが出て解決に苦戦したので一応記事として残しておこうと思います。

# 環境
筆者の環境は以下の通りです
- Ubuntu22.04
- pyenv 2.3.36
- Poetry (version 1.8.2)

# やったこと
とりあえず解決法が知りたい人のためにやったことだけ残しておきます。どうやらライブラリが導入されていなかったのが原因らしいです
```sh:terminal
pyenv uninstall {使うpythonのversion}   #入れたpythonのアンインストール
```
```sh:terminal
sudo apt install liblzma-dev           # ModuleNotFoundError: No module named '_lzma'の解決
```
```sh:terminal
sudo apt install python-tk        #ModuleNotFoundError: No module named '_tkinter'の解決
sudo apt install python3-tk
sudo apt install tk-dev
```
```sh:terminal
pyenv install {使うpythonのversion}     #使うpythonバージョンの再インストール
```
# 最後に
_lzmaライブラリはlzma圧縮に関するライブラリらしい。lzma圧縮はUnix系のOSで使われる圧縮形式とのこと
_tkinterライブラリはもともと別の言語に付属であったGUIモジュールをPythonで使えるようにしたライブラリ。WSLで使うのかは疑問だけどUbuntu直入れ環境では使うかもしれないので念の為に。
DXRuby 講義資料　ピンポンゲーム


## 学べる知識
- **キーボード制御**
- **画像の表示および移動**
- **フォント利用**
- **シーン制御**

## ゲーム内容
卓球
動いてる図形と静止してる図形が合わさるようにタイミングよくキーを押して
ラリーする(ように見える)

ラリーが続く動く図形の速度がどんどん早くなる
## 主な学習目的
ゲーム内でマウスを使用する方法を学ぶ。

```rb:ping_pong.rb
# coding: utf-8
require 'dxruby'
Window.width =  1000
Window.height = 800
Window.bgcolor=[255,200,200,200]
x = 300
y = 100

image1 = Image.load("./image/pingpong1.png")
table_tennis = Sprite.new(0, 0, image1)
image2 = Image.load("./image/pingpong2.png")
image3 = Image.load("./image/out_range.png")
image4 = Image.load("./image/out_range.png")
background = Sprite.new(500, 200, image3)
out_range = Sprite.new(401, 200, image4)

speed = 1
level = 0

font = Font.new(52)

score = 1
miss = 0 

Window.loop do
  Sprite.draw(table_tennis) 
  Sprite.draw(background)
  Sprite.draw(out_range)

  if score >= 10
    Window.draw_font(400, 100, "乗ってきたZE ドリームタイム突入ーーー", font)
    Window.bgcolor=[255,out_range.x-400, out_range.x-300, out_range.x-320]
elsif score >= 4     
    Window.draw_font(400, 100, "スピードげていくぜEEEE", font)
    Window.bgcolor=[255,(out_range.x-400)/2, (out_range.x-300)/2, (out_range.x-320)/2]
end

    if miss >= 1
        Window.draw_font(100, 100, "ラリー頑張って続けようぜ", font)
        Window.draw_font(100, 150, "連続ラリー数：【#{score}回】", font)
         if Input.keyDown?(K_RETURN)
           miss = 0
         end
    else
            out_range.x += speed
            if out_range === background
                if Input.keyPush?(K_SPACE)
                p "hit"
                    if score % 2 == 0
                        table_tennis = Sprite.new(0, 0, image1)
                        score += 1
                    elsif score % 2 == 1
                        table_tennis = Sprite.new(0, 0, image2)
                        score += 1
                        if score >= 4
                            speed *= 1.2
                        elsif score >= 2
                            speed *= 2
                        end
                    end
                end
            else
                if Input.keyPush?(K_SPACE)
                    p "dame!!!!!"
                    p miss
                    # ミスした場合に　加算
                    miss += 1
                    table_tennis = Sprite.new(0, 0, image1)
                end
            end

        if out_range.x > 600
            speed *= -1
            # -1を掛けることで　向きを反転することができる
        elsif out_range.x < 400
            speed *= -1
        end
        Window.draw_font(400, 50, "#{out_range.x}", font)
    end

end
Vim 9.1 patchダイジェスト (2024/03)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([9.1.0146](https://github.com/vim/vim/commit/c27fcf4857228bc650943246ffbba444a085b3e7) ～ [9.1.0228](https://github.com/vim/vim/commit/ad493ef3ea9ef7f2b0badcd2298883b5ab6e4ef4))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**
runtimeファイルも直接commitされるようになりました。ただ、数が多いので基本的にはここでは取り扱わないことにします。

* [9.1.0219](https://github.com/vim/vim/commit/3164cf8f12f14b725b918e3170bb0a9085af8298): :four_leaf_clover:Vim9: 列挙型(enum)を実装しました。(関連patch: [9.1.0226](https://github.com/vim/vim/commit/abedca96efa76db2bba74a5264df632da862203d))
* [9.1.0215](https://github.com/vim/vim/commit/5a2e3ec9ac72b6e644fea4ebba7e632498296e2f): :four_leaf_clover:半ページ単位スクロール`Ctrl-D`, `Ctrl-U`を`'smoothscroll'`に対応しました。
* [9.1.0211](https://github.com/vim/vim/commit/b9f5b95b7bec2414a5a96010514702d99afea18e): :four_leaf_clover:ページ単位スクロール`Ctrl-F`, `Ctrl-B`を`'smoothscroll'`に対応しました。
* [9.1.0207](https://github.com/vim/vim/commit/e5f2280381250801a28dcff9823e6f94e7b163fc): :four_leaf_clover:`SessionWritePost`イベントを追加しました。`:mksession` コマンドを呼び出してセッションファイルを書き込んだ後にトリガーされます。
* [9.1.0160](https://github.com/vim/vim/commit/35b867b685cedbcbba9d44695077ecc9a6995f4c): :four_leaf_clover:Vim9: オブジェクトメソッド内で自身のクラス型を使用できるようにしました。
* [9.1.0148](https://github.com/vim/vim/commit/d3eae7bc116297f70220f21ded436ed0a88066d8): :four_leaf_clover:Vim9: 組み込みオブジェクトメソッド `empty()`, `len()` および `string()` のサポートを追加しました。
* [9.1.0147](https://github.com/vim/vim/commit/215703563757a4464907ead6fb9edaeb7f430bea): :four_leaf_clover:`'winfixbuf'`を追加しました(ウィンドウについてローカル)。オンにするとウィンドウで表示しているバッファを固定します。Ex コマンドに `!` 修飾子が付いている場合は、バッファを強制的に切り替えます。(関連patch: [9.1.0150](https://github.com/vim/vim/commit/4bb505e28cac0389561fff78d8bbe0319c2bcf2f), [9.1.0208](https://github.com/vim/vim/commit/65e580bd5610465bb6b9c1a546b7a8d00c76aa47))

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
IAM を触るに当たって気を付けること

# はじめに
最近、AWS の IAM 触り始めて色々気を付けないといけないことがでてきたので共有する

# IAM なんやいね
AWS IAM はユーザーのアクセス制限を管理したり、リソースからリソースへのアクセス制御を管理したりと主に AWS のアクセス関連全般を制御するサービス

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction.html

なので、IAM の操作をやらかすと重大なインシデントが起きる代物になったりする

# 気を付けること1：ロールはポリシーまでチェック
当たり前のことですが、ロールには複数のポリシーがアタッチされています。ロール名で「あー××のロールなんだなー」と名前だけで判断せず、何のポリシーがアタッチされているのか？そのポリシーは何を許可、不許可、どんな条件かを確実に確認するべきです。その確認によってインシデントを回避できるなら儲けもんです

# 気を付けること2：むやみにグループにユーザーをアタッチしない
特に本番環境を更新できてしまうようなポリシーがグループに含まれているなら基本アタッチしないこと。このようなグループにユーザーを追加してしまうといつでも本番環境を更新し放題になってしまう。組織には、それらを考慮した何かしらの仕組みがおそらく作られていると思われるのでちゃんと確認すること

# 気を付けること3：ポリシーは必要最低限の権限で
むやみに多くのリソースを許可をするようなポリシーにしない。特にアスタリスクはあまり使わないようにする。最低限の権限でリソースを触るのが賢明

# おわりに
また気を付けることがあったら更新していく
Nuxt3＋MockServiceWorker(msw)でMock

# Nuxt3でAPI部をMockする方法

Nuxt2+axiosの頃はaxiosMockServerを利用していたが、
Nuxt3からはAPIアクセスはNuxt腹持ちのuseFetch、$fetchを利用することが推奨になってしまったため、Mockの方法を模索する必要があった。

- API単位でMockファイルを分けたい
- developmentの場合だけ有効にしたい

などのもともとの使い勝手に近くなるようなイメージで配置したのでメモ。
ただし、この方法が使えるのはSPAモードだけ。。。
(SSRの場合Node18以上だとfetchがnodejs側の仕様とぶつかってmswが動かないとのこと)

サンプルはテスト用ダミーデータを返してくれる無料APIサイトを利用。
https://jsonplaceholder.typicode.com/
試したVersionは
"nuxt": "^3.11.2"
"msw": "^2.2.14"

## 手順とか配置とか
* mswインストール
```
npm install msw@latest --save-dev
```

* service-wokerファイルをpublicディレクトリ配下に作成(おまじない)
```
npx msw init public
```

* Mockファイル作成
mocksディレクトリを掘ってapi単位でMock応答ファイルを作成(以下だとtodos.js、users.js)
MockファイルをまとめてWokerをExportするmockWokers.jsを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139625/045abfb0-a717-f2f9-6cef-f3b9aec66cbd.png)

```users.js
import { http, HttpResponse } from 'msw'
 
export const users = [
  // InterceptするURL、ここはBASEURLとかを考慮して隠蔽する実装にしたほうがよさそう
  http.get('https://jsonplaceholder.typicode.com/users', () => {
    // Mock応答
    return HttpResponse.json({
      id: 'mockUserID',
      firstName: 'John',
      lastName: 'Maverick',
    })
  }),
]
```

```mockWokers.js
import { setupWorker } from 'msw/browser'
import { users } from '~/mocks/api/users'
import { todos } from '~/mocks/api/todos'

// woker作成
const worker = setupWorker()
// Mockデータ設定
worker.use(...users)
worker.use(...todos)

export {worker}
```

* Mock有効化
pluginsにMock有効化処理を追加し、Nuxtインスタンス生成時にMockの有効無効制御をおこなう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139625/fffdef9f-2357-af5e-aa55-2405d561b1d3.png)
```01_mock.js
import { worker } from '~/mocks/mockWorker'

export default defineNuxtPlugin((NuxtApp) => {
// MOCKモードだったら。developmentだったら。とかで設定し分ける
worker.start({onUnhandledRequest: 'bypass'}) 
})
```

* 利用イメージ
```.vue
<template>
    <div>
        <button @click="getUser">getUser</button>
        <hr>
        {{ users }}
    </div>
</template>
<script setup>
const users = ref({})
const getUser = async () => {
    users.value = await $fetch('https://jsonplaceholder.typicode.com/users')
}
</script>
```
Mockで設定したデータが応答することを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139625/ce413ad5-b1b0-c23a-4fdf-e0272185b901.png)