OmniAICreator/Qiita-1.07M huggingface dataset:
Python最適化モデルでコスパの良いクリスマスデートをシミュレートしてみよう

---
title: Python最適化モデルでコスパの良いクリスマスデートをシミュレートする
tags: Python 最適化 pulp binning 数理モデル
author: UrataSoft
slide: false
---
---
####Pythonで最適化モデルを作成して安近短なデートプランをシミュレートしてみよう。
---
#####目的  
あまりお金と時間をかけずに楽しいデートにしたい。
#####条件 
予算：月末で給料前なので５０００円まで。
所要時間：平日で翌日も朝早いので７時待合わせなら１２時まで。
コース：出来れば自宅マンションでクッキングデートが安近短で良い。
#####参考データ
#####[政府統計e-Stat](https://www.e-stat.go.jp/stat-search/file-download?statInfId=000031654490&fileKind=0) 曜日,男女,ライフステージ,一緒にいた人,時刻区分別行動者率
この統計データから人気のコースを集約し、さらに経験則から時間当たりのコストや所要時間を加えて以下の表をCSV形式で作ってみた。
ninki 月２～３回はするという女性の人数（単位千）
jikan、cost　普通にかかる所要時間と予算（￥/ｈ）を経験則で付加
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/ea4108d7-9f4d-ee09-ef85-c648e23a48a2.png)
これをpandasでDataFrameとして取得し最適化モデルに組込む。
尚、ninkiについては数値として多少を計るよりも特徴量としてbinningしてカテゴリ変数として扱った。

```python
import pandas as pd
from pulp import LpVariable,LpStatus,value
from ortoolpy import model_min

syuko = pd.read_csv('C:\StaticData\syuko.csv',index_col='estat')
ninki = []
syumi = []
for i in syuko.columns:
    ninki.append(syuko.iloc[0][i])
# binning
bin=pd.cut(ninki,3,labels=False,precision=0,duplicates='drop')+1
syumi=list(syuko.columns)
dic = dict(zip(syumi,bin))
```
さて最適化モデルの作成に入ろう。
変数x,y,zをそれぞれ映画、カラオケ、クッキングをした場合の予定時間とする。
クッキングをメインにしたいので変数Zを多めにしてみよう。

```python
# 最小化モデル定義
mod = model_min()

# 変数設定
x=LpVariable('x',lowBound=0)
y=LpVariable('y',lowBound=0)
z=LpVariable('z',lowBound=0)

# 目的関数設定
mod += syuko.iloc[2][0]*x + syuko.iloc[2][1]*y + syuko.iloc[2][2]*z

# 制約条件
mod += x + y <= 3
mod += y + z >= 3.5
mod += z + x >= 4
mod += x + y + z <= 5

# ソルバー実行
mod.solve()
mst = mod.status
st = LpStatus[mst]
```
制約条件を色々変えてみてLpStatusからOptimalが返されたら最適解が得られたという事だ。なのでシミュレータとして使ってみても面白い。
因みに
Infensible　が返されれば実行不可能
Unbounded　なら非有界（無制限で最適解を良く出来る）
Optimal　なら最適解のコストと所要時間の組合せを出力する。

```python
# 最適解出力
if st=='Optimal' and value(mod.objective) < 5000:
    print("最適予算 " + str(value(mod.objective))+" 円")
    plist=[]
    con=0
    for k,v in dic.items():
        print(k,"お薦め度",v," 効率的所要時間",value(mod.variables()[con]),"h")
        con += 1
```
出力結果
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348536/de4812be-ad6e-b9a1-0cd7-e2dfc5d5cec1.png)
やった、クッキングなら自宅マンションで４時間、３,３２０円で済みそうだ！
（そんな上手くいくか。。）
El CapitanのPlatformIO

MacOS XのEl CapitanのPlatformIOをupgradeしたところver5になってpythonが3以上となり動かなくなってしまいした。

```
Error: Python 3.6 or later is required for this operation. 
Please check a migration guide:
https://docs.platformio.org/en/latest/core/migration.html#drop-support-for-python-2-and-3-5
```

Python 2で使えたPlatformIOはver4までだったようです。

仕方がないのでdowngradeしました。

```
% sudo pip install -U "platformio<5"
```

元どうりにビルドできるようになりました。pioはFreeBSDでも使えるようになったけど、やっぱMacでも使えたほうが便利なので、やれやれです。

pioはそれぞれの環境でビルドできないプラットフォームが存在するので、アップデートは慎重にしたほうがよさそうです。

4系のパッケージはダウンロードできない様なので、すでにビルドできていたものは大丈夫ですが、新規のダウンロードが必要なターゲットでは使えません。結構厳しいです。

古いplatformioでは、新規のアーキテクチャの開発は不可能に近いです。

雪豹のPlatformIOはver 3が入っています。

pic32のビルドはしていたのですが、実機にuploadしていなかったので、tools-pic32progがインストールされていない状態でした。パッケージではインストールできないので、ファイルを探してsorceforgeにあったので、.platformio/packages/tool-pic32progに展開して使える様になりました。

2024/09/02 結局python-3.9.13をインストールしてPlatformIO Core 6.1.15にしました。
Sharepointのリスト×PowerAutomate×Excelで申請業務を自動化できそう・・・

この記事は[マイナビ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mynavi) 16日目の記事です。

## はじめに
これから書くことは、
今まで昼休みの時間を使って、同僚と楽しみながら検証してきたことのまとめです。
そのため「なんとなくできそうだと思っていることを検証した」のまとめということで読んでいただけると幸いです。

検証にあたり、目標にしていたのはSaasのアカウント管理を自動化して改善することです。
申請→対応→通知→台帳作成といった一連の工程です。
それらをPower Automateでできるんじゃないか？？、ということで少しづつ検証を重ねました。
その記録と所感をまとめていきます。

## 目次

- PowerAutomateで最終的に達成したいこと
    - イメージ
- Sharepointのリスト×PowerAutomate×Excelで申請台帳が自動作成できそう
    - よかったこと
    - つまったこと
- これから行いたいこと・妄想

## PowerAutomateで最終的に達成したいこと

一言で言うと、Saasの管理業務をスマートにしたい。

もっと具体的に言うと

- 定型業務は自動化したい
- 自動化しているフローを可視化したい
- PowerAutomateを保守しやすい様にしたい
- ユーザーにかかる手間をよりスムーズにしたい

しかし、、、、
アカウント発行の一連の工程「申請→対応→通知→台帳作成」を、
より細分化するとたくさんの作業があります。

- 申請
    - 内容確認（差し戻し）
    - 上長承認
- 対応
    - 特権IDでの操作
    - タスク振り分け
- 通知
    - 通知文章作成
- 台帳作成
    - その後の随時更新

### イメージ
それらを以下のイラストみたいなことをすべて自動化できればいいなと考えていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560096/71707dbb-c0bd-d17f-11fc-c470464c0247.png)






## Sharepointのリスト×PowerAutomate×Excelで申請フォーム＋申請台帳＋申請通知が自動作成できそう


https://tech-blog.cloud-config.jp/2021-06-28-powerautomatesharepoint/

このブログを参考に、
申請フォームをSharepointのリスト、台帳をExcel、通知をSlackに飛ばそう！という検証をしました。

※申請フォームにMicrosoftのFormsを採用しなかった理由は、ユーザー情報を入力させる項目がなかったためです。

### 検証結果
申請フォームをSharepointのリスト⇒△
申請台帳をExcel⇒◎
申請通知をSlack⇒◯

### できたこと・良かったこと
全体的に言うとノーコードで作ることができるため、スクリプトを書けなくても問題なかった。
UIがわかりにくいが、操作に慣れれば、システム職以外も触る事ができそう

それぞれで言うと

- Sharepointのリスト
    - ユーザー情報の取得が簡単で幅広い（AzureADとの連携が魅力的）
        - ADに役職、部署などの情報を登録していれば、自動的にその情報をPowerAutomateで扱うことができる
    - フォームの作成画面のUIが直感的で使いやすい
- Excel
    - 台帳として扱う分には言うことなし
- Slack
    - メンションをつけてメッセージを飛ばすことができる
        - 文字列作成のフロー作成も複雑でなかった

### つまったことなど
全体的に言うと、M365のアプリは権限周りが複雑であった。

運用を複数人で行うため、Teamsのチーム内のM365アプリを使用するとなると、更に複雑になりそう。

それぞれで言うと

- Sharepointのリスト
    - 公開権限・編集権限を設定する範囲・項目が複数あり、複雑
        - Teamsのチームのチャンネル、Sharepointのアクセス、Sharepointのサイトのアクセス、Sharepointのサイトのリストの・・
    - Sharepointのリストの新規作成のみをいい感じに与える権限設定がわかりにくい
        - Googleフォームの様に、フォーム画面だけをユーザーに表示・入力させる場合の設定がわからなかった
- Excel
    - 個人フォルダのExcelにするか、Teamsのチーム内のExcelにするかでどのような違いがあるのかが未知
        - Teamsのチーム内で運用を行う場合、権限設定が複数になりそう
- Slack
    - Slackに向けてメッセージは簡単に飛ばせるが、受けれるようにするなるとスクリプトを作り込む必要がある

### イメージ図

PowerAutomateのフローイメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560096/853f1b42-6cb5-45cf-3457-dfada0ca09c0.png)


Sharepointのリストのイメージ①
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560096/e08948d3-1af6-808e-bdaf-dbabd4e95f61.png)


Sharepointのリストのイメージ②フォームの入力画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560096/3a2a246d-6e81-684e-fc2b-fe2df2bd5e81.png)


## これから行いたいこと

上記のイラストを達成するために以下のことを検証したいなと考えています

- 承認×PowerAutomateで②承認フローが自動化＋スピーディにできそう
- Planner×PowerAutomateで④タスク管理が自動化できそう
- PowerAutomateで⑤定型業務⑥管理台帳作成が自動連携できそう
- PowerAutomate × Teamsで⑥対応完了通知がチャット形式で自動化できそう

一方で同時進行で権限周りを検証してドキュメントとしてまとめていきたいなとも考えています。

現状、趣味くらいのレベルでしかPowerAutomateを理解できていないので、
もっと触って、実際に業務に活かせるようにできたらいいなと考えています。
G検定2021#3合格までの道のりとTIPS

# はじめに
G検定2021#3（2021/11）に合格しました。
今後チャレンジする方のために試験準備から勉強コンテンツ、学習のポイントなどをアウトプットしておこうと思います。

# まずは試験を知る

## G検定って？

https://www.jdla.org/

日本ディープラーニング協会（JDLA）が主催
東大の松尾豊教授が理事長

https://www.jdla.org/certificate/general/#

ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているかを検定する。

試験時間：120分
知識問題（多肢選択式・220問程度）
オンライン実施（自宅受験）
一般：13,200円（税込）

１問あたり約30秒で解くべしってことですね。
あとで知ったのですが、試験はWeb検索や書籍を見ながら答えてもいいみたいです。

## 問題の傾向は？

G検定対策で有名なカオカオさんブログ見て、過去2年（4回）のテーマを整理してみました。

https://www.kaookaoo.com/gtest_gm/


出題回数の多いテーマ順に並べるとこんな感じです。
4回以上出題されたテーマのみに絞ってます。

|テーマ|出題回数|
|:----|:----|
|AIの歴史|10|
|LSTMの説明|6|
|個人情報保護法の説明|6|
|個人情報保護法|6|
|GANの説明|5|
|自然言語処理のフロー|5|
|単純パーセプトロン|4|
|ドロップアウトの説明|4|
|混同行列|4|
|イテレーション|4|
|GoogLeNetの説明|4|
|誤差逆伝播法の説明|4|
|シンボルグラウンディング問題|4|
|構文解析の説明|4|
|WaveNet|4|
|ResNet|4|
|XAIの説明|4|
|アンサンブル学習|4|
|自然言語処理・セマンティックウェブ|4|
|ゲームで人間に勝てるAIを作る研究|4|


なお、出題回数で集計したところ、こんな結果でした。
一部表記ゆれとかあるかもしれませんが、1-2回出た問題で約90%程度！

|主題回数|テーマ数|割合|
|:----|:----|:----|
|4回以上|20|3%|
|3回|32|5%|
|2回|70|12%|
|1回|466|79%|

あらためて出題範囲が広くて、対策の取りにくい試験やなーという感想。
頻出のテーマは確実に押さえておくのは必須ですが、
幅広くAI系の話題に触れておく必要があるかと思います。

# 試験準備

私が取り組んだ学習コンテンツを挙げます。
勉強期間は約１か月間で、50H程度かなと思います。
1日1時間で最初はコツコツ進め、最後の1週間は1日2時間程度だったと思います。

## まずはベースナレッジを作る

+ **【資格試験対策】ディープラーニングG検定【キーワード・ポイントまとめ】**

キーワードとポイントが整理されており、まずは全体観をざっと押さえに行きました。
正直最初は何の話だかよく分からなかったです。
こういう内容が頭に入っていないといけないのかとまずは雰囲気を把握しましょう。

大丈夫です。
徐々に準備を進めていくと分かるようになってきますので、楽しくなってきます。

https://sik-bug.hatenablog.com/entry/2020/05/30/103038

## 問題を解きまくる

分かっているつもりでも問われ方が違うと間違ってしまうので、いっぱい問題に触れて、問題慣れをしていきましょう。

+ **徹底攻略 ディープラーニングG検定 ジェネラリスト 問題集（黒本）**

こちらで全体的にどんな問題が出るのかを押さえにいきました。
分からない用語が結構出てきたので、解説を熟読＋ググって知識補完をしながらだったので、コンプリートまで結構時間をかけました。
これで一通り雰囲気は掴めるかと思います。

https://www.amazon.co.jp/dp/B07NDVCN99/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

+ **G検定（ディープラーニングと機械学習の検定）模擬テストと公式例題解説**

無料の模擬テストと公式例題です。
１問１問考えて回答して、理解が浅かったところは調べつつ、一つ一つ肉付けしていきます。

G検定模擬テスト　２２３問
G検定公式例題解説　３６問
G検定模擬テスト（新シラバス対応）９８問　→こいつはかなり深め
ーーー
合計３５７問

http://study-ai.com/generalist/

## 知識補完

+ **【G検定チートシート】AI関連法律や動向含む試験当日のカンペ**

法律・時事系は結構多く出題されますし、最新の状況を押さえておく必要があるので、別途対策しておいた方がよさそうです。
私はこちらのサイトでポイントを押さえておきました。

https://watlab-blog.com/2020/02/11/gexam-cheat-sheet/#20523297021253927861244591253919990300282120521521


+ **YoutubeのAI系動画を見る**

YoutubeにもAI系のいろんなコンテンツがありますので、自身の弱い分野について、見てみます。
これまで問題演習を中心に文字情報で理解していましたが、人の説明を聞くと少し違った角度で理解が深まっていくと思います。
問題ばっかりやってると飽きてくるので、別のやり方で常に触れ続けようとしていました。

機械学習入門動画であらためて解説を聞いてみる

https://www.youtube.com/playlist?list=PLWlPLLc6IHrh5qQETYnICfD4Nh5z56kjB

イーロンマスクのOpenAIが作った最強AIであるGPT-3の解説

https://youtu.be/NeXra6AKDq8

## 最後の仕上げ

１週間前ぐらいからは最後の追い込み時期です。
これまで学んだナレッジの復習と試験慣れをしておきましょう。

+ **DIVE INTO EXAM（G検定模擬試験）**

最後は実践模擬試験です。
無料で2時間200問の本番形式の模擬試験が出来て、合否判定もしてくれます。
私は最初は不合格でしたが、何度もチャレンジできるので、自信を持てるまでチャレンジします。

https://diver.diveintocode.jp/dive_into_exam/3

+ **G検定 2020年 第3回 振り返り**

過去問のポイントを参考に押さえておくといいと思います。

https://freedomofselection.com/ai-gen/g-2020-3-1/

# さいごに
普段業務でやっていない領域で、いろいろな新しい知識が得られて、非常に面白かったです。
新しい知識ってのはシナプスにきますね。笑
もちろんこれで終わりではなく、AI領域のシステムを作っていきたいので、学習は続けていきたいと思います。
Buffalo NAS TeraStation逆引きメモ

必要に迫られたBuffalo NAS TeraStationの逆引きメモです

## NAS Navigator2を使用しないで初期セットアップとMACアドレスの確認を行う方法

工場出荷時のBuffaloのTeraStationは固定IPではなくDHCPが前提になっているのでNAS Navigator2を使用しないでMACアドレスを確認する場合はひと手間必要になります。

クライアントはWindows10、NASはBuffalo LS520DNBに作業を行いました。

1. LANケーブルにてNASとPCを直結、PC側のNICが固定IPの場合はDHCPに変更
1. IPアドレスを検索できるソフトウェアでNSAのIPアドレスを探す
1. IPアドレスをブラウザで直接開いて管理画面を表示
1. adminユーザのパスワード、RAID構成等の設定すると再起動するのでLEDの点滅が終わるまで待つ
1. 再起動するとIPアドレスが変わるので再検索を行う
1. 管理画面にadminユーザでログインできるようになるので環境に合わせてネットワーク構成を設定する
<備忘録>integration_ test ファイル削除方法。

# 総合テストのファイル名を間違えた。
rails g integration_test sighup　で総合テストを作成しましたが、
よく見るとsghupの綴りが間違っていました。
幸い、テストはまだ記述していなかったので、削除して新しい総合テストのファイルを作成します。

## 総合テストのファイル削除
```text:ターミナル
 $rails destroy integration_test users_sighup
 Running via Spring preloader in process 51389
      invoke  test_unit
      remove  test/integration/users_sighup_test.rb
```
 以上でファイルの削除が終わりました。
大体1億レコードのシリアルナンバーを、大体15分で作成する方法

## 注意

* この記事にあるスクリプトのご利用は自己責任でお願いします。
* ユニークビジョンでは、この方法でのシリアルナンバーの生成を行なっていません。ですので、ユニークビジョンが運営しているキャンペーンでは、この方法で発行したシリアルナンバーは使用しておりません。
* 動作環境は、Ubuntu 20.04.3 LTS、 Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz、です。
* あくまでも思いつきなので、この方法で発行されたシリアルナンバーが、推測可能なものであるかもしれません。その可能性がある場合は、教えて下さい!


## スクリプト

16桁、数値のみ、1億行、重複無しの場合。

```shell
time cat /dev/random | od -tu8 -An -w8 | head -100000000 | grep '................' | sed 's/..*\(................\)$/\1/' | tee full | sort | uniq -c  | awk '$1 > 1 {print $2}' > dup

time for i in `cat dup`
do
  ed full <<END
1
g/$i/d
w
q
END
done
```

## 結果

### 1つめのスクリプト

```
real    11m50.310s
user    13m59.769s
sys     0m56.764s
```

### 2つめのスクリプト

```
real    0m36.378s
user    0m30.046s
sys     0m4.580s
```

### 取得できたシリアルナンバーの数

```
cat full | sort | uniq | wc
99999998 99999998 1699999966
```


無事、15分以内で、99999998レコードのシリアルナンバーができました。

良いお年を!
AWS資格(SAP,SOA,SAA,DVA)をUdemyとNotionだけを使って勉強してみた

# はじめに
本勉強方法は、資格を獲得することが目的で、すべての内容を100%理解している訳ではないのでご了承ください。。
ただし、知見を得ることで、実務において選択肢の幅が広がったことは間違いないですし、やはり実践ではないと本当の意味でマスターしたとは言えないので、自分的には良い割り切りかなと。。

私はもともとAWSを業務で触る機会はそれなりにありましたので、AWS経験が1年以上ある方には参考になるかと思います。

# 資格取得履歴
当初は全ての資格を制覇しようという意気込みでしたが、SAPを取得したところ（すべて1回で合格）で達成感に襲われ、それ以上の資格は目指しませんでした:sweat:。　

- 勉強期間: 1-2ヶ月程度/資格
- 勉強時間：平日の仕事が終わった後、ちょっとした待ち時間
- 勉強場所：ベトナムで有名なハイランズコーヒー☕

![スクリーンショット 2021-12-14 12.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/19b1fa0a-d2e0-8b81-2d78-c8f3ba7b1ca5.png)

# 勉強方法
勉強に利用したものは、基本２つだけです。

1. ***Udemyで模擬試験***
1. ***Notionアプリ***

次のようなステップで勉強しました。

![Masami.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/20d124a5-5079-a1bc-4d7c-ebf153ab56e9.jpeg)

# Step1.Udemyで模擬試験(1回目）

いきなり、Udemyで模擬試験を始めます。
結果は400-500点あたり。。
まぁ、こんなもんでしょう・・・

[AWS認定 DevOpsエンジニア – プロフェッショナル (DOP-C01) 模擬試験 (2021年試験対応版)](https://www.udemy.com/course/aws-devops-dop-c01-2020/)
[AWS 認定ソリューションアーキテクト プロフェッショナル模擬試験問題集](https://www.udemy.com/course/aws-53225/)
[AWS 認定デベロッパー アソシエイト模擬試験問題集](https://www.udemy.com/course/aws-31955/)
[AWS 認定SysOpsアドミニストレーター アソシエイト模擬試験問題集](https://www.udemy.com/course/aws-sysops-53195-q/)

# Step2.Notionアプリで自分ノート作成
Notionを使って、理解できなかった（正解含む）Udemy模擬試験の回答と解説をすべてコピー＆ペーストしました。

Notionは、私にとっては、神アプリ👼でした。ちなみに、これでベトナム語の勉強をメモして、ベトナム内での旅行中にもiphoneですぐに引き出せるｗ

https://www.notion.so/product

気をつけたこと：

- 最初の段階では、回答と解説を絞り込みすぎないこと
- 模擬試験はジャンルがバラバラに出題されるので、Notionはカテゴリ毎にページを分ける

![スクリーンショット 2021-12-16 10.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/34b9b020-0571-e32b-40c4-18a61f81241c.png)

# Step3.暇があったらNotionアプリを見る

Notionアプリの書き込みはMacBookで、見るときはiPadとiPhone。
勉強時間を確保して一気に理解しようとしても頭がパンクするので、待ち時間などの短い時間で利用して、少しずつ理解するようにしました。無理しないで自然に勉強できるので、習慣化しやすかったです。

- ランチをしながら
- エレベータで待ちながら
- レジで待ちながら
- ジムでのインターバルに

# Step4.Udemyで模擬試験(2回目）

自信がついたところで、2回目の模擬試験。ここで毎回ショッキング・・・。　
結果は600-700点あたり。
やはり手を動かしていないので、本当の意味でまだまだ理解できていない。。

# Step5.Notionアプリの編集

2回目の試験でまだ理解できていなかったものを集中的にNotionを使って、勉強します。

- 理解できたものは、情報量を減らすためにNotionから削除
- 理解できなかったものは、キーワードを色付けしたり、別途ググって参考になる図を貼り付けたり、など工夫して対策

![スクリーンショット 2021-12-16 10.19.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/a2d86c22-1e44-1f5c-ffda-5442d584f998.png)

# Step6.暇があったらNotionアプリを見る

編集が一通り完了したら、Notionを空き時間を中心にひたすら見ます。

# Step7.Udemyで模擬試験(３回目）

もう大丈夫でしょう、というところで3回目の模擬試験。
結果は800-900点あたり！
もはやキーワードが出てきただけで、質問と回答が予測できている（この状態が大事）。

# さいごに
実際のAWSの試験では、もちろん模擬試験の内容がそのまま出題されることはありませんが、4択なので消去法を上手く活用し、落ち着いて望めば何とかなりました。

最初のSAAからこの勉強方法で上手くいき、最後のSAPまで大丈夫でしたー。
100Mを超えるファイルをgitリポジトリから消す

https://qiita.com/Arthas1987/items/13438d007ea1e3a5376f

を受けて

https://qiita.com/m-seikou/items/bef13a3b9f09d86d0044

を行った際にも100M超えの問題が起こっていたことを思い出し、巨大なファイルを消すことだけ考える。

# 前提条件

- 大きなファイルは現在分割する等の対応がされており、現状では必要としていない
- 問題のファイルを含む過去の履歴は消えても問題がない旨を確認済み

# 目的

リポジトリの中にあった巨大なファイルを履歴を含めて削除する

# 結論：新しい履歴として再出発

履歴の消去に合意が取れているので削除路線で進めました。削除したい履歴はリリース前のものだったので容易に合意取れた点は幸運だった

# 実施手順

例によって、多くの環境、多くのスタッフがいる状態なのですべての作業を止められる時間は多くは取れない。

## 1. 再出発の起点を作る

```bash
git checkout --orphan 再出発の起点
```
ポイントは起点をどこにするか。直近のリリースを起点にするのが無難。デフォルトのブランチもこのタイミングで変えています。

## 2. 再出発点の周知

新しく作ったブランチを全体に周知し、checkoutしなおしてもらう。マージされていないブランチについては、各自手作業で移してもらった。

## 3. デプロイ手順の修正

本番/ステージングのデプロイジョブを変更。移管と異なりブランチを変えるだけなので簡単。また開発用の環境はブランチを指定できるように作られていたので作業無し。楽ちん

## 4. 経過観察

1週間ほど様子見します。古いブランチから生えた作業ブランチを新ブランチへ移す作業のサポートなどもこの期間に。

## 5. 古い履歴を持つブランチを一掃

ココまで来ていれば後は消すだけ。

# 感想

手間はかかったが大過なく切り替えできたので手順としては悪くないのかとは思う。
VBAのファイル操作

### 約20年ぶりにVBAのファイル操作のマクロを組んだので忘備録として投稿

* 当時は[Openステートメント](https://honey-bears-net.com/vba_text_file01/) を使っていたが、今回は[FileSystemObject](https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/filesystemobject-object)を使用。

## 実装

参照設定で「Microsoft Scripting Runtime」を追加
![スクリーンショット 2021-12-16 091745.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184967/a3aee917-7123-61bd-ee39-b7951f8089dd.png)

### サンプルコード
```vb:Modlue1.bas
Public Function FSOInputOutput(inputFilePath As String, outputFilePath) As Boolean
    On Error GoTo ErrHandler

    Dim resultFlg As Boolean: resultFlg = False

    Dim FSO As FileSystemObject
    Dim inputReader As TextStream
    Dim outputWriter As TextStream
    
    Dim strLine As String
    Dim strArray_I As Variant

    Dim tempStr As String
    
    Set FSO = New FileSystemObject
    
    '出力ファイルが存在しない場合はエラー
    If FSO.FileExists(inputFilePath) = False Then
        GoTo ErrHandler
    End If
    
    '入出力ファイルのオブジェクト取得
    Set inputReader = FSO.OpenTextFile(inputFilePath, ForReading, False, TristateFalse)
    Set outputWriter = FSO.OpenTextFile(outputFilePath, ForWriting, True, TristateFalse)
    
    Do Until inputReader.AtEndOfStream
    
        strLine = inputReader.ReadLine
        
        strArray_I = Split(strLine, ",")
        
        '=== 編集 ===
        tempStr = strArray_I(0) & Int(100 * Rnd + 1) & "," & strArray_I(1) & Int(100 * Rnd + 1)
        
        outputWriter.WriteLine tempStr
    Loop
    
    outputWriter.Close
    inputReader.Close
    
    resultFlg = True
    
ErrHandler:
    Set outputWriter = Nothing
    Set inputReader = Nothing

    Set FSO = Nothing
    
    FSOInputOutput = resultFlg
End Function
```

```vb:ThisWorkbook
Private Sub Workbook_Open()
    Const INPUT_FILE_PATH = "C:\temp\sample.csv"
    Const OUTPUT_FILE_PATH = "C:\temp\sample_result.csv"

    Dim resultFlg As Boolean
    
    resultFlg = Module1.FSOInputOutput(INPUT_FILE_PATH, OUTPUT_FILE_PATH)
    
    If resultFlg = True Then
        MsgBox "成功", vbInformation + vbOKOnly
    Else
        MsgBox "失敗", vbCritical + vbOKOnly
    End If
End Sub

```
[Android]MavenCentralの概要

#この記事は
build.gradleにて、mavenCentralがなんなのか分からなかったので調べた。

```groovy
repository {
    mavenCentral()
}
```

#MavenCenrtalとは
Javaのライブラリを保管してるリポジトリ

#参考
https://www.infoq.com/jp/news/2015/11/maven-central-at-google/

#寂しいので
廃止になったJcenterとの違いにも触れます。

```groovy
repository {
    jcenter() // deprecated (コードの打ち消し線ってマークダウンだとどうやるんだろう？)
    mavenCentral() // instead
}
```

jcenterは、mavenCentralと同様にライブラリの配布する機能を果たしています。

しかし、jcenterは読み取り専用になり、新しくライブラリを更新することができないです。
そのため、mavenCentralに切り替えることが推奨されています。

#参考
https://developer.android.com/studio/build/jcenter-migration

https://blog.gradle.org/jcenter-shutdown
ぷよiPhone作った

[N・S高等学校 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/n-s-highschool-1)17日目の記事です。


## プレイ画面

![screenshot 2021-12-16 10.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375045/cca8a10e-109f-e13d-cc7d-51484e019810.png)
URL https://iphone-puyopuyo.vercel.app
# なんで作ったの?
Twitterを見ていたら、虚構新聞のこの記事を見て作りたくなったので作りました。

https://kyoko-np.net/2021120301.html

# 作り方

https://puyo.sega.jp/program_2020/

からソースコードをダウンロードして。
動かしたのを
FigmaでiPhoneのイラストを作成して

![screenshot 2021-12-15 15.59.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/375045/1f3d7a90-f08f-3e5f-4383-66242a75e05b.png)

この作ったiPhoneのイラストをもともとあったぷよぷよの画像を差し替えています。

# 感想
久しぶりにクソアプリを作ったので供養として公開します。
セガが公開しているぷよぷよプログラミングを使って作ったので数時間程度で公開できました。
~~ちなみにメンテナンス性を全く考えずに作ったのでどのiPhoneがどのモデルなのか自分でもわかりません。~~

# 参考
https://puyo.sega.jp/program_2020/
OSSコンプライアンスに関連するプロジェクトやツールの紹介

こんにちは。OpenChain JWGで活動している安倍です。

コンプライアンスやセキュリティなどに対応するために、OSS管理の重要性が増しています。
それに伴い、OSS管理の手助けになるプロジェクトやツールがたくさん登場しています。

なので今回はOSSコンプライアンスに関連するプロジェクトやツールの概要を紹介したいと思います。

- CHAOSS
- Clearly Defined
- fosslight
- OpenHub
- OSS Review Toolkit (ORT)
- Software Heritage

# CHAOSS

https://chaoss.community/

Community Health Analytics Open Source Softwareの略称
Linux Foundationが2017年9月「CHAOSS Project」を立ち上げ

CHAOSS Projectの目標は

- オープンソースコミュニティの健全性を測定する指標を確立する
- ソフトウェアコミュニティ開発を分析するための統合オープンソースソフトウェアを作成する
- オンライントレースデータでは達成できない指標を確定するためのプログラムを開発する
- プロジェクトが活性かのヘルスレポートを作成する

以下の資料に概要をまとめています。

https://github.com/ubinux/docs/blob/main/CHAOSS.pdf



# Clearly Defined

https://clearlydefined.io/

https://docs.clearlydefined.io/

ライセンス情報の収集と蓄積を行う。Open Source Initiativeのワーキング グループの一つ。
2018年ごろに立ち上がった。

目的はOSSパッケージ情報の収集と蓄積

- ライセンス
- 著作権者の情報
- ソースコードの場所 (リビジョン等を含む)

以下の資料に概要をまとめています。

https://github.com/ubinux/docs/blob/main/ClearlyDefined.pdf

# fosslight

https://github.com/fosslight/fosslight

LG Electronicsが2014年から社内で開発・運用しているソフトウェア管理ツール
2021年6月にOSSとして公開

ライセンス：AGPL-3.0-only
対応言語：韓国語、英語

以下の資料に概要をまとめています。

https://github.com/ubinux/docs/blob/main/fosslight.pdf

# OpenHub

https://www.openhub.net/

synopsys Black Duck Open Hub
synopsysが公開しているOSSの統計情報・脆弱性情報・コミュニティの活性度などを検索できるサービス

以下の資料に概要をまとめています。

https://github.com/ubinux/docs/blob/main/OpenHub.pdf

# OSS Review Toolkit (ORT)

https://github.com/oss-review-toolkit/ort

OSS Review Toolkitの略称
Linux Foundation傘下のプロジェクト

オープンソースコードのライセンス分析を行うOSSツール

- ライセンス分析の際、ソースコードのみならずソースコードの依存関係も確認する．
- 依存するOSSのソースコードを自動でダウンロードしてきたり，OSSの依存関係などを分析したレポートの作成機能やそれらを評価ツールも併せ持つ．

以下の資料に概要をまとめています。

https://github.com/ubinux/docs/blob/main/OSSRT.pdf

# Software Heritage

https://www.softwareheritage.org/

ユネスコ（UNESCO）とフランス国立情報学自動制御研究所(INRIA)が立ち上げたプロジェクト
全てのソフトウェアに対するソースコードの収集・保存・アクセスのための基盤構築が目的

2021/11/10時点で収集された情報
Source files : 11,522,325,744
Projects : 167,702,974

以下の資料に概要をまとめています。

https://github.com/ubinux/docs/blob/main/Software%20Heritage.pdf


# おわりに

今回は各プロジェクトやツールの概要を紹介しました。
具体的な使用方法や活用例などは別の機会に紹介できればと考えています。

またこれ以外にもたくさんのプロジェクトやツールなどあります。
明日は、今回ご紹介出来なかったmeta-spdxscannerというツールの記事です。
どのようなツールなのか、明日の記事がとても楽しみです。
Intel MacBook Pro のサーマルスロットリングの状況を Mackerel で見てみる

これは [Mackerel Advent Calendar 2021](https://qiita.com/advent-calendar/2021/mackerel) の16日目の記事です。

Mackerel チームでアプリケーションエンジニアをやっている inommm です。

この記事では Intel MacBook Pro がサーマルスロットリングしている状況を Mackerel へ投稿し可視化した様子を紹介します。

# サーマルスロットリングとは
昨今の CPU は動作周波数を動的に調整できるようになっています。
過度な発熱を防ぎ、システムを守るために動作周波数を落とすことを、サーマルスロットリング (Thermal Throttling) と呼ぶようです。

先日の @tatsuru さんの [記事](https://wtatsuru.hatenadiary.com/entry/2021/12/05/191709) によると M1 チップはあまり発熱しないとのことですが、手元の Intel な MacBook Pro ではどの程度サーマルスロットリングが発生しているのかふと気になったので確認してみることにしました。

# サーマルスロットリングの確認方法
確認するためのツールがいろいろとありそうです。

## 1. Intel Power Gadget を使う
https://www.intel.com/content/www/us/en/developer/articles/tool/power-gadget.html

動作周波数や消費電力、温度をグラフで細かく確認することができます。ログに出力したりもできるようです。

![IPG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342459/def5916c-d09b-0648-d66c-cde71a2d355f.png)

## 2. Hot を使う
https://github.com/macmade/Hot

「Hot」はメニューバーに常時スロットリングの状況を表示するので、作業中すぐに把握できるようになっています。

![Hot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342459/27f74d1c-d369-aa22-18f7-aa791214a807.png)

## 3. pmset コマンドを使う
pmset コマンドを使用して、CLI でスロットリングの状況を確認することもできます。

```
$ pmset -g therm
Note: No thermal warning level has been recorded
Note: No performance warning level has been recorded
2021-12-15 19:57:37 +0900 CPU Power notify
        CPU_Scheduler_Limit     = 100
        CPU_Available_CPUs      = 8
        CPU_Speed_Limit         = 100
```

# pmset の結果を Mackerel へ投稿し可視化する
今回はより長期間のスロットリングの状態を保存し、時系列で振り返って確認できるように、pmset コマンドの結果を Mackerel へサービスメトリックとして投稿する簡単な Ruby スクリプトを組んでみました。

```ruby
#!/usr/bin/env ruby

require 'mackerel/client'

API_KEY       = "MACKEREL_API_KEY"
service_name  = "thermal_throttling"
mackerel      = Mackerel::Client.new(mackerel_api_key: API_KEY)
pmset_command = "/usr/bin/pmset -g therm"
sleep_sec     = 60

loop do
  now           = Time.now
  pmset_results = `#{pmset_command}`.split("\n")
    .select { |line| line.match(/\A\s+.+=.+/) }
    .map { |line| line.split("=").map(&:strip) }
    .to_h

  metrics = pmset_results.map do |key, value|
    {
      "name"  => "mbp.pmset.therm.#{key.downcase}",
      "time"  => now.to_i,
      "value" => value.to_i
    }
  end

  pp metrics
  mackerel.post_service_metrics(service_name, metrics)

  sleep sleep_sec
end
```

毎分 pmset コマンドを実行して結果をパースし、各値を POST しています。
このスクリプトをしばらく動かしてみました。

# 見てみる
これが実際に Mackerel へ投稿され、可視化されたスロットリングの様子です。

![スクリーンショット 2021-12-16 0.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342459/f9b9a9d0-6f35-e92e-3319-1531a515207b.png)

午前中から昼過ぎにかけて一人で作業をしていたり、ビデオ会議に参加している間は特に大きなスロットリングは起きていないようです。しかし15時頃からビデオ会議で画面共有をしつつ、VS Code の Live Share でホストとして共同編集作業を始めたあたりから様子が激変しています。

実際にこの時間に作業相手と動作が遅いねというやりとりをしていました。17時前に休憩をいれたタイミングで一旦収まり、作業を再開したタイミングから19時過ぎまで再びスロットリングが続いている様子も確認できます。

一番スロットリングされている部分では40％近くまで下がってしまっていますね...
まさかここまでとは...

# 最後に
MacBook Pro が高負荷時に発熱を抑えるため、スロットリングしている様子を Mackerel で確認できるようにしてみました。自分の MacBook Pro でここまでスロットリングが起きていたことに驚いています。ひとまずは USB ファンなどで冷やしつつ状況が改善されるか様子をみてみたいと思います。「いずれは M1」ですね。
Herokuのフリー版で常時起動をGASを用いて行う方法

##はじめに
Herokuは無料でアプリをデプロイすることができる環境ですが、30分アクセスがない場合、スリープモードに入り、次回アクセスを行う際に復帰の時間がかかります。
Larvelを用いてデプロイした際に、約１５秒程度の復帰時間が平均してかかります。
今回はGASを使用し、15分ごとにアクセスを行うプログラムを作成します。
##注意点
無料版ではクレジットカードの登録なしで550時間、クレジットカードの登録ありで1000時間の時間制限があります。
また、これはアカウント全体で共有されることから、24時間×31日で、744時間の時間がかかるため、アカウント１つで常時起動できるアプリは１つのみとなります。
時間を経過すれば、アプリケーションが停止するため、課金されることは基本的はありません。
##15分ごとにアクセスのみを行う方法
###1. Google Driveにアクセスを行い、新規作成からGoogle App Scriptを作成。
![スクリーンショット 2021-12-16 9.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1826491/91a289ab-a917-8431-bcb4-c077ebd2f15b.png)
###2. コードを記述
GASはJava Scriptベースで記載することができます。

```javascript
function main() {
  var url ='ここにアクセスしたいURLを入力';
  var data = UrlFetchApp.fetch(url).getContentText();
}
```
###3. トリガーをセット
トリガー（起動するタイミング）を分ベースでの15分単位に設定する。
![スクリーンショット 2021-12-16 9.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1826491/daf50b10-9699-812d-8174-ab2c1bdb6c72.png)
![スクリーンショット 2021-12-16 9.55.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1826491/2d55be68-9745-6aee-6329-db4925d83fbe.png)
![スクリーンショット 2021-12-16 9.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1826491/08ee8128-2089-8a72-6a17-567c3177c685.png)
###完成
これで15分ごとに自動でアクセスを行うことができるようになります。

##やっていること

```javascript
var data = UrlFetchApp.fetch(url).getContentText();
```
ここの部分でアクセスを行なっています。
実際にアクセスを行なって取得している内容は、該当のURLのHTMLを取得しているだけです。

```javascript
console.log(data);
```
これを追加することで、取得している内容を確認することができます。
##次回
[Herokuのフリー版で常時起動をGASを用いて行う方法【エラーメールあり】](https://qiita.com/ymbyuki0104/items/97534b0db0165d9e2649)
【AWS Shield】Error occured when configuring application layer DDoS mitigation for resource（Unknown error. ID: ）の対処法

# はじめに

本件はあくまで一例です。
正しく解決できている保証はございませんが、私は解決できたのでご紹介します。

# 結論から
リソースに紐づけられているWAFのWCU数を確認してみてください。
「[アプリケーションレイヤー DDoS の自動緩和](https://aws.amazon.com/jp/blogs/news/aws-shield-advanced-update-automatic-application-layer-ddos-mitigation/)」機能を有効化する場合、追加でWCU150のキャパシティがあるかどうかを確認してみてください。

# 解説
以下ドキュメントにて、解説します。
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/ddos-advanced-automatic-app-layer-response.html

# DeepLで翻訳
自動ミティゲーションを有効にすると、Shield Advanced は次のことを行います。

- 必要に応じて Web ACL に Shield Advanced ルール グループを追加する - リソースに関連付けた Web ACL にまだ **Shield Advanced ルール グループの参照ステートメントがない場合、Shield Advanced はルール グループを追加**します。
- リソースに対する DDoS 攻撃への対応を開始 - Shield Advanced は、この後のセクションで説明するように、DDoS 攻撃に自動的に対応します。

Shield Advanced は、自動ミティゲーションに使用するすべての Web ACL で、1 つのルール グループ参照ステートメントを使用します。Web ACL を自動ミティゲーションに既に使用している場合、Shield Advanced はそこに別のルール グループを追加しません。

# ルールグループの詳細
Name（名前） - ShieldMitigationRuleGroup_account-id_web-acl-id_unique-identifier

Web ACL capacity units (WCU) – **150**. **These WCUs count against the WCU usage in your web ACL.**

Priority – 10,000,000. This high priority setting allows you to run your other rules and rule groups in the web ACL before the Shield Advanced rule group. AWS WAF runs the rules in a web ACL from the lowest numeric priority setting on up.
<Appium> find_element_by_* commands are deprecated. Please use find_element() instead


find_element_by_idっていう書き方が非推奨？
これからはelement = driver.find_element(By.ID, "element_id")

## インポートする

```
from selenium.webdriver.common.by import By
```
##ID

```
element = driver.find_element_by_id("element_id")
```
↓

```
element = driver.find_element(By.ID, "element_id")
```

## class
```
element = driver.find_element_by_class_name("element_class")
```
↓

```
element = driver.find_element(By.CLASS_NAME, "element_class")
```

## name
```
element = driver.find_element_by_name("element_name")
```
↓

```
element = driver.find_element(By.NAME, "element_name")
```

## link_text
```
element = driver.find_element_by_link_text("element_link_text")
```
↓

```
element = driver.find_element(By.LINK_TEXT, "element_link_text")
```

## tag_name
```
element = driver.find_element_by_tag_name("element_tag_name")
```
↓

```
element = driver.find_element(By.TAG_NAME, "element_tag_name")
```

## css_selector
```
element = driver.find_element_by_css_selector("element_css_selector")
```
↓

```
element = driver.find_element(By.CSS_SELECTOR, "element_css_selector")
```

## xpath
```
element = driver.find_element_by_xpath("element_xpath")
```
↓

```
element = driver.find_element(By.XPATH, "element_xpath")
```
LambdaでSNSからメール送信できないときの確認事項３選

最近、仕事でLambdaからSNSを使用して、Eメール送信する機能を開発する機会がありました。

Nodeを使って開発し、コード自体はググればコピペして使えるコードが盛りだくさんだったので、直ぐに終わるかと思ったのですが・・・

とにかくSNSへのメッセージ発行ができず、苦労しました。
調査した結果、メッセージ発行ができない原因が３つあったので、メモとしてまとめようと思います！

# その１、権限がない
こちらは、どのサイトでも大体書かれていました。
Lambadaの実行ロールにSNS実行権限を付ける必要があります。
設定タブのアクセス権限から実行ロールを編集可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/4a0383ab-0804-f2c9-defb-7fb615c604e6.png)

# その2、エンドポイントが無い
サイトで紹介されるサンプルだと、ネットワークの利用を特にしないので、忘れがちです。
実際はプライベートなVPCネットワーク内にLambdaを配置していると思うので、SNSに繋ぐためのエンドポイントが必要になります。
現場だと、ここにVPCの設定があるはず。(無ければエンドポイントは必要ない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/558865/5b5ac021-573d-8533-c0ff-8c108629fab4.png)

# その3、実行ロールよりIAMユーザーが優先される
ここで、大分ハマりました。
その１で実行ロールにはSNSの権限を付けたのに権限が無いというエラーが消えませんでした。
調査した結果、以下のようにコード上でIAMユーザーのアクセス設定をしていると、こちらが優先されます。

~~~javascript
var sns = new AWS.SNS({
    accessKeyId: '<access_key>',
    secretAccessKey: '<secret_key>'
});
~~~

Lambdaの実行ロールを使いたい場合は、上記のようにアクセスキーの設定は不要です！

# 終わりに
職場でなかなか解決できず焦りました^^;
しかし、そのお陰で曖昧だったVPC・IAMの知識が深まったので、得られたものも多かったです！
やっぱり実際に触って何かを作ることでしか、IT知識って身にならないんだな〜と感じました。

# 参考
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/sns-examples-publishing-messages.html
https://blog.fire-sign.info/1157/
https://hacknote.jp/archives/13102/
https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-vpc-tutorial.html
https://blog.serverworks.co.jp/tech/2018/04/12/vpc-endpoint-sns/
EditTextを使うときは必ずimeOptionsを指定しよう

EditText内でエンターキーを入力すると、通常はIME_ACTION_DONEというactionIdがlistenerに流れます。
が、EditTextの下に編集可能なUIが存在していた場合は、IME_ACTION_DONEではなくIME_ACTION_NEXTが呼ばれます。

なので、EditTextの配下に別のEditTextがない場合、以下コードのように「IME_ACTION_DONE」が来ることを前提として条件分岐をすることもあるかと思います。

```kotlin:
      commentEditor.setOnEditorActionListener { _, actionId, _ ->
        if (actionId == EditorInfo.IME_ACTION_DONE) {
          /** コメント投稿処理 */
        }
        /** IME_ACTION_DONE以外の時は何もしない */
        true
      }
```

しかしながら、実は場合によっては、配下にEditTextや編集可能なUIが存在しなくても、IME_ACTION_NEXTが呼ばれてしまう場合もあるため、xmlで明確にエンター入力時のアクションを定義しておいた方が良いでしょう。　

```xml:
            <EditText
                android:id="@+id/commentEditor"
                android:imeOptions="actionDone" ⇦これ
                android:layout_width="0dp"
                android:layout_height="wrap_content" />
```

これを指定しておかないと、例えばですが、「EditText上でエンターを押すとコメントを投稿する」という機能を実装していた場合、
EditTextの配下に何らかのUIを新規で配置しただけで、IME_ACTION_DONEが呼ばれず、
何度エンターを押してもコメントが投稿されないという不具合が発生してしまうリスクが発生してしまいます。
突発的なPrj.でやってみたこと


本記事は、[ソフトウェアテストの小ネタ Advent Calendar 2021の17日目](https://qiita.com/advent-calendar/2021/software-testing-koneta)　の記事です。


###はじめに
第三者の立場でテストを行うお仕事をしていますが、
お客様のアジャイルなプロジェクトに合ったテストを第三者の立場で行うにはどういう動き方がいいのか、悩んだ1年でした。

そんな中JaSST東京の基調講演者、Jonathan Rasmusson氏著の「アジャイルサムライ－達人開発者への道」を改めて読み、いくつか考え方のヒントをもらえました。

※10年前の本なんですね‥。びっくりです。

https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E2%88%92%E9%81%94%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%B8%E3%81%AE%E9%81%93%E2%88%92-Jonathan-Rasmusson/dp/4274068560


###いきなりですが‥
皆さん健康診断に行きましたか？

「要経過観察」だったらセーフ、なんてことはなく、早期に対策を打ち治療をすることが大事です。

最近我が家では、パパの健康診断結果により、早急にダイエットを成功させる必要が出ました。

そんな緊急Prj.を成功させるにあたり、私はアジャイルチームとして計画から初めて見ることにしました。

※実案件のお話ではなくすいません。

###①計画を立てる
いきなり阿部寛をゴールにしてしまうと、恐らくゴールにたどり着く前に計画が100％頓挫することが予想されました。

そこで、まず１週間でイテレーションを切って、イテレーション毎にストーリーを設定してみることにしました。

Sprint1:　まずはダイエットする生活に慣れる
Sprint2:　食事制限を行う
Sprint3:　食事制限に運動を取り入れる
Sprint4:　食事制限と運動の強度をあげる

###②分析して設計をする
イテレーション毎に設定したストーリーをタスクに分解します
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252368/60903078-dbdb-6f1b-00e7-f456d7a11976.png)


その次に、ストーリーの満足条件を書いてみます。
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252368/97c31027-8fad-7ee9-cc1c-1a71dafd05ad.png)


※分析と設計の際に、フローチャートで業務フローをわかりやすくしたり、ペルソナを設定する手順もありますが、シンプルなストーリーのため割愛します。


###③作業をする
分析と設計通りに作業を進めてみます。

また、チームとしてPrjを遂行するにあたり、
作業状況は、毎日コミュニケーションをとることで情報共有することを心掛け、
コミュニケーションをとる中で、モチベーションの低下を察知した場合にはフォローに回るようにしました。
(褒める。そんな気しなくても、「最近顔がシュッとしてきたんじゃない？」と言ってみる。)


###④振り返る
各イテレーション毎に、フィードバックと改善を検討しました。

例えば「脂肪燃焼スープが飽きた」というフィードバックが出た際には、
コンソメ味オンリーから時々トマト味を含めるよう修正を行いました。

数値的なアウトプットとなる「体重」については、Sprint2で設定した満足条件を達成できませんでした。
そのため、Sprint3のタスクを見直し、作業内容を変更するということをしました。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252368/98861248-b84d-e138-7178-b7abe1cfc714.png)


###現在
まだイテレーションを回し中です。

アジャイルなチーム運営について、まだかなり理解が浅く、踏み込みもできておらず、実際のチームで活用すると、技術的な問題が沢山出てくるのだと思いますが
自分自身の学習の動機付けとなるキッカケを作るべく、プライベートな案件に置き換えてみました。

実際の案件でやってみた結果を分析するような技術的なことは、いずれか書けたらいいなあと思います。
箱とボール Python3編

https://paiza.jp/works/mondai/stack_queue/stack_queue__practice_step6



```py
tower = [] #解答用のリスト
que = []　#初期のリスト
a = 0　#towerからpop()した変数
b = 0　#queからpop(0)した変数

N = int(input())
que = list(map(int,input().split()))

b = que.pop(0)
tower.append(b)

while que != []:
    b = que.pop(0)
    a = tower.pop()
    
    while a == b:
        b += a
        a = 0
  
        if tower != []:
            a = tower.pop()
            
            
        else:
            
            flg = 1
            break
    
    
    if flg == 1:
        tower.append(b)
    else:    
        tower.append(a)
        tower.append(b)
    
    flg = 0
    

for i in tower[::-1]:
    print(i)

```
Relayの仕組みを図解してみた

Relayを触り始めた当初、`useQuery`と`useFragment`って何してるの？何が違うの?ってレベルでよくわからなかったので、
初めてRelayを触る人のために詳しく図解してみました。

## そもそもRelayとは
Relayは、facebook社(今はMetaか...)が開発しているReactのためのGraphQLクライアントです。
Relayには下記のようなメリットがあります。

* 取得したいデータの構造をコンポーネントに閉じ込めることができる
    * つまり、コンポーネント内で取得するデータが変更されても他のコンポーネントに影響がでないため、依存関係を気にしなくて良い。
    * `useQuery`と`useFragment`の仕組みによるもの → のちほど詳しく解説！
* フェッチ・レンダリングの自動的に最適化される
    * クエリの重複フィールドの除去
    * データに変更があった時に、必要なコンポーネントのみ更新する

▼ 公式サイト

https://relay.dev/


## めっちゃ簡単に仕組みを解説！

ファミレスに家族で行ったとします。
子供が「食べたい！！」って言ったものを、お母さんが店員さんに注文するような光景をよくみますね。

子供は〇〇が欲しいと伝えるだけ
直接注文するのはお母さん

そのような時のお母さんがQueryで、子供たちがFragmentです。

![フラグメント例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/a8da8e60-deab-9d4e-5ed9-5b2df4b852b2.png)

つまり、**Fragmentは直接データベースとはやりとりをしません。**
Queryが各コンポーネントのFragmentを集約してデータベースにお問い合わせします。


## もう少し詳しく

![フラグメント.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/944fd20c-db8c-7690-c226-0cc8b07c6668.jpeg)

### useFragment
子コンポーネントでは、欲しいデータをGraphQLのフラグメントとして定義します。

useFragmentは、Queryで生成されるフラグメントに対する参照と、そのフラグメント自体を受け取ってデータを返します。

### useQuery
親コンポーネントで、子コンポーネントのフラグメントをまとめたクエリを作り、データベースでお問い合わせします。
もし、コンポーネントAでも〇〇のデータが欲しい！って書いてあってBでも同じく〇〇のデータが欲しい！って書いてあったとしても、クエリをまとめる時にマージされるため問題ないです。

useQueryの返り値にはフラグメントの参照を持っています。
これらを子コンポーネントに渡してあげる必要があります。

### なぜこの仕組みが実現できてるのか
Relayでは、schemaファイルからデータの構造を見て各クエリ、フラグメントをコンパイルし設計書のようなものを生成します。
その設計書がデータの依存関係を解決するため、このような仕組みが実現できます。

---

React ConfでもRelayの話が取り上げられていました！！

https://www.youtube.com/watch?v=lhVGdErZuN4
UFJ銀行APIをTypescriptで使ってみた

こんにちは、APIは作れないくせに呼ぶのは大好きなペーペーエンジニアです。
今回はUFJ銀行の口座情報(テストデータ)が取れるAPIを使ってみたので備忘録として書きます。

##使用した技術
・Windows10(PC)
・TypeScript
・Vue3

##記事を書いた経緯
今回練習家計簿アプリを作成していた私は口座情報が取りたいと考え、お世話になっているUFJのAPIを検索してみました。しかしここで壁が…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365717/310a146a-54c0-adb9-faca-9ca7ae011c36.png)
TypeScriptはおろか、JavaScriptもないじゃん！書き方分からないじゃん！
という事で色々試して、何とか正解を見つけたので忘れないうちに記事を書く事にしました。

■APIサービスページはこちらから：
[APIサービス | 三菱UFJ銀行]("https://developer.portal.bk.mufg.jp/")

##使う前の準備
まずはメニューの中の「利用手順」を読みながら
ユーザ登録まで済ませます。(利用手順2)
完了したらログイン→キーを発行
利用コースの選択から「配信登録」を押して準備完了です。

今回は「個人API体験コース」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2365717/734e5981-2e9d-7dcc-c235-b0ef483cf759.png)

##書いてみた。
これが完了したら後はコードを書くだけです。

```typescript:script
async getUFJInfo() {
 await axios.get(
  "https://developer.api.bk.mufg.jp/btmu/retail/trial/v2/me/accounts/",
  {
    headers: {
     "X-IBM-Client-Id": "XXXXXXX", //先ほど発行した自身のキー
     "X-BTMU-Seq-No": "20211216-abcdefghij123456", //日付-英数字16桁
     Accept: "application/json", //下と同じ
     accept: "application/json", //サイトに書いてある例そのまま
              },
   }
 );
},
```
これを実行してconsoleに表示させると無事に口座のテストデータが返ってきました！練習用の家計簿アプリにはこのレベルのデータで問題なさそうです。

##まとめ
とりあえず相手(API側)にheadersを読んでもらえれば問題無いようです。これを応用すれば他の言語でも書けそうな予感です。

非常に便利なのですが、自身のキーをコードに含むので、怖くてGitに挙げられなくなりました！
という訳で今回はこの部分を消してGitに挙げることにします…(´;ω;｀)

ここまで読んでいただきありがとうございました。
Googleアカウントでログインする仕組み

#はじめに
Webサービスを使っているとよく「Googleアカウントでログイン」というものを見かけます。
何気なく使っていたものの、なぜGoogleアカウントで別のサービスに入れるのか、その仕組みが気になったので調べてみました。

#「Google アカウントでログインする」
「Google アカウントでログインする」という表現は、Googleではない第三者サービスに、Google アカウントを使ってログインができる場合に表示されます。
このログインの仕組みは「SSO」（シングルサインオン）と呼ばれ、ユーザーが使い慣れた既存のSNSなどのアカウントを利用してWebサイトやサービスにログインできる仕組みです。

SSOは、ユーザーのデータを外部から安全に利用するための仕組みである「OAuth」を利用し、各プラットフォーマー（各サービス）が提供するAPIを実行することによって利用できるようになります。


#OAuthとは
OAuthとは、権限の付与のためのオープンな標準規格です。
OAuth2.0とも言われますが、OAuthの最新バージョンのことを示しています。

ユーザー名とパスワードなどの実際のユーザー資格情報を共有することなく、あるサービスから別のサービスへ権限を与えるためのプロトコルです。

OAuth自体についてのより詳しい説明はこちらを参照下さい。
[一番分かりやすい OAuth の説明](https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be)

もう少し具体的なところを見ていきます。

#OAuthの登場人物

・クライアント（ユーザー）
・クライアントアプリ（Googleアカウントなどのログイン機能があるアプリ）
・認証プロバイダー

#「Google アカウントでログインする」の中身

ここでは「Google アカウントでログイン」機能があるチャットアプリが、
Google アカウントでログインをした時にどういう処理をしているのかをみていきます。



ユーザーの観点から見ると、OAuthでの処理の流れは次のようになります。


1.　ユーザーはクライアントアプリケーション（ここではチャットアプリ）へのログインに利用する認証プロバイダー（ここではGoogle）を選びます。

2.　ユーザーはその認証プロバイダーのWebサイトにリダイレクトされます。
リダイレクト先のURLには、クライアントアプリケーションのID値が含まれます。
ここで、ユーザーはクライアントアプリケーションによるアクセスを許可するかどうか尋ねられます。

3.　ユーザーは認証プロバイダーに対してログインし、クライアントアプリケーションから求められているアクセスを許可します。

4.　ユーザーはクライアントアプリケーションへと再びリダイレクトされます。ここには認可コードと呼ばれるデータが含まれています。

5.　内部で、クライアントアプリケーションは認証プロバイダーに認可コードを送信します。
認証プロバイダーはアクセストークンを返します。

6.　クライアントアプリケーションはアクセストークンを含む認証済みのリクエストを行い、ログインを行います。

#認証プロバイダー

OAuthを利用するには、まずクライアントアプリ（チャットアプリ）を認証プロバイダーに登録する必要があります。

Googleだと[Google Developers Console](https://console.cloud.google.com/?hl=ja)にアプリを登録することでクライアントIDと秘密の値をもらうことができます。

これらがクライアントアプリを識別するために使われます。

#まとめ
「Googleアカウントでログイン」の処理の中身をみました。
認証プロバイダーとクライアントアプリのやりとりが複雑そうに感じたかもしれませんが、
OAuth利用するためのオープンソースのライブラリがいくつか開発されているので、
実装自体は割と簡単にできるようになっています。
よかったらログイン機能に取り入れてみてはいかがでしょうか？

#参考

[OAuthとは？| SAMLとOAuth]
(https://www.cloudflare.com/ja-jp/learning/access-management/what-is-oauth/)
[Google アカウントでログインするとは？仕組みからログイン方法]
(https://g-tips.jp/google-account/account-login-with/)
[Go言語によるWebアプリケーション開発](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%AB%E3%82%88%E3%82%8BWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Mat-Ryer/dp/4873117526)
bool値って true false 以外ないのか。あるいは定義出来ないのか

rustのコーディングしてるときに
「bool値って true false 以外ないのか。あるいは定義出来ないのか」
って`変なこと`を考えてしまって。

冷静に考えれば「フラグ（ビット）が立っているかどうか」なので、0 or 1 の二択なのは当然なんだけど。
そもそも 自分がC言語屋で C言語には bool型 なんかはなくて、プログラマのお気持ちで 「bool型の変数として扱うか」ってだけだったのでこんなことを考えてしまったわけだけど。

C言語屋だからこそ、アセンブラ的に考えると「そりゃそうか」って納得したわけだけど

どうやら C# はその`変なこと`が出来てしまうらしく。しかも、出来ないように修正したら「挙動が変わった」ってバグ扱いになったらしく。できるとやっちゃうヤツは居るのだなぁ〜

って、話。
あずま的ディスプレイ選定

# はじめに🌱
この記事はペライチアドベントカレンダーの16日目の記事です。

こんにちは。株式会社ペライチ 開発エンジニアのあずまです。
日々スクラムマスターをしながら開発業務に勤しんでおります。

弊社は基本的にリモートワークでの業務となり、
それに合わせてデスク周りのアップデートをしていったのですが、
今回はとうとうディスプレイを購入してしまいました🖥✨

優柔不断な私がどのようにしてディスプレイを選んだのか、
あずま的ディスプレイの選定基準を共有したいと思います。
最後までお付き合いください。
　
# 購入したディスプレイ🖥
## ウルトラワイドモニター34インチ（HUAWEI MateView GT）
![HUAWEI MateView GT.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247053/b4a7bc26-c73d-acb5-4559-2e098964d1ce.jpeg)
　
### スペック
![Amazon___【Amazon_co_jp限定】HUAWEI_MateView_GT_デュアルスピーカーサウンドバー_34インチ_ウルトラワイド曲面ゲーミングモニター_3年保証付き_HDR_165Hzリフレッシュレート_3440x1440_WQHD_タッチボリュームコントロール_360°デュアルマイク_高さ_傾き調整機能【日本正規代理店】___HUAWEI_ファーウェイ____ディスプレイ_通販.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247053/6e0f6e40-306d-c42c-13bb-909988c5e410.png)

# ディスプレイ選定プロセス📈
- ディスプレイの世界は本当に広く、選ぶのが大変です
- 選定が面倒臭くなり、適当な安いディスプレイを購入して失敗なんてケースも後を断ちません
- ここではどうやって無限に存在するディスプレイを選定したかを記載します
　　

### 調べる前にどんなディスプレイが欲しいのかイメージする
- 大きさ・見た目・価格・スペックなど思いつく限りイメージしておきます
- ポイントは「調べる前」にどんなディスプレイがほしいのか具体的にイメージすることです
- 自分の気持ち決まる前に調べ始めると「迷宮入り」して買わないパターンに陥ることがあります
　

### 次に一般的な選定基準を調べる
- 一般的なディスプレイの基本スペックを知っておく必要があります
- これを知っておくことで、一般的な相場もわかってくるので搾取されることはありません
- このフェーズをすっ飛ばす人が多いのでお店は儲かるんだなぁと思います
　　

### 結局最後は財布との相談
- 元も子もないですが、お金を注ぎ込めば選択肢が増えるので理想に近いディスプレイを購入できる可能性が上がります
- 懐が冷え込んでいる場合は、しっかり相談してください
　

# あずま的選定基準🙋‍♂️
- 選定プロセスに倣い、自分の選定基準を書いてみました
- バカそうな基準となりましたが、そもそもディスプレイの知識がないのでこんな感じになりました😅
 
 - かっこいい
 - 大きい
 - 安い
 - スペックが良い
 - 仕事作業効率があがりそう　
　

# 一般的選定基準👀
- 基本的には以下の項目をチェックしておけばOKです
- 言わずもがなスペックを上げると財布に直撃ダメージがきます
　　

### ■湾曲 or 平面
- 仕事用であれば直線がおすすめ
- 湾曲のが高い💰

### ■画質
- 3840×2160 = 4Kがベスト（ゲームで力発揮する）
- 3440×1440 = UWQHDも十分に力発揮する
- 明確に4Kが必要でなければUWQHDで十分
- 4Kのが高い💰

### ■リフレッシュレート
- 単位「Hz」で表される
- 1秒間でモニターが画面を更新する回数
- 仕事に使うなら60hz程度で十分
- ゲームに使うなら60hz以上必要
- 数字が大きい方が高い💰

### ■応答速度
- 画面の色が変化するためにかかる時間
- 仕事で使うなら4〜5ms程度で十分
- ゲームに使うなら1〜2msくらいにしたい
- 数字が小さい方が高い💰

### ■光沢
- ノングレアが主流？っぽい
- 作業で反射があると結構辛い
- ここの値段感はよくわからない

### ■接続端子
- USB-C（ディスプレイによってあるがないことも多い）
- HDMI(最近はほぼあり) 
- 豊富な接続端子の方が高い💰


### ■HDR（ハイダイナミックレンジ）
- HDRに対応しているコンテンツではメリハリのある鮮やかな映像表現も可能
- 仕事で使う場合はそこまで必要じゃないかな
- 対応していると高い💰

### ■パネル方式
- IPSパネル（ADSパネル）
- VAパネル
- VAパネルは、IPSパネルよりもコントラスト比が高い、ゲームや映画鑑賞に優れている
- 「オンラインゲーム」「映画鑑賞」「調べ物や事務作業」といった一般的な用途であれば、VAパネルでも問題なし
- IPSパネルの方が高い💰

### ■その他
- スピーカーついてる？
- マイクついてる？
- モニターアームが設置できる規格か（重さによっては×）
- デザインは好みか
- 豊富なオプションの方が高い💰
　

# 結果 📣
|  あずま基準  |  購入ディスプレイ  |結果|
| ---- | ---- |---- |
|  かっこいい  | <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247053/3b887989-9918-390c-f82f-90eb9f9d99b5.png" width="150">|◎|
|  大きい  |34インチ|◎|
|  安い  |55,790円|△|
|スペック|申し分ない|◎|
|仕事作業効率|わからないが、モチベは異様に高い|◯|

# お財布との相談👛
- 普段はセール対象にならないディスプレイがセールとなっていた
- 同スペックの他のディスプレイと比較するとリーズナブル（他は8〜10万円）
- お財布はうなずいてくれました
 　

# おわりに🔚
- まずは何となくのイメージから一般的なディスプレイの情報を集めまくり、検討するという王道パターンを踏んで選定しました
- 結果、まだディスプレイは届いていないのですが（記事作成時）、既に満足度は高いです
　

- 選定、選定言うて参りましたが、結局自分は同僚に買った方がいいよぉと背中を押してもらって買うことができました。
- みんなでわーわー言いながら買い物ができて楽しかったです☺️
LINEWORKSでaxiosを使って通信

この記事は[LINEWORKS Advent Calendar 2021](https://qiita.com/advent-calendar/2021/lineworks)の16日目となります。

# はじめに
request という npm のパッケージが非推奨となっており、新しいパッケージに移行するため [axios](https://axios-http.com/) を導入しました。
意外とaxiosを使っての記事が少なかった？っぽいので書きました。
合わせて簡単にですが request からの書き換えについても触れます。

# メッセージの送信
コードはこんな感じになります

```JavaScript:send.js
const body = {
  accountId: 'アカウントID',
  content: {
    type: 'text',
    text: 'メッセージ'
  }
};
const options = {
  url: 'https://apis.worksmobile.com/r/{API ID}/message/v1/bot/{botNo}/message/push',
  method: 'POST',
  headers: {
    consumerKey: consumerKey,
    Authorization: authorization,
    'Content-type': 'application/json'
  },
  body: JSON.stringify(body)
};
axios
  .request(options)
  .then((res) => {
    if (response.status < 200 || response.status >= 300) {
      throw res.data;
    } else {
      console.log('success');
      console.log(res.data);
    }
  })
  .catch((e) => {
     console.log('failed');
     console.log(e);
  });
```
大まかな request からの変更点は以下になると思います。

- リクエストボディのキーが body から data に
- コールバックから Promise に
- レスポンスの引数が一つに


# コンテンツのアップロード


```JavaScript:send.js
const FormData = require('form-data');
const fs = require('fs-extra');
formData.append('resourceName', fs.readFileSync(filePath), {
  filename: filename,
  contentType: contentType
};
const options = {
  url: 'https://storage.worksmobile.com/openapi/message/upload.api',
  method: 'POST',
  headers: {
    consumerKey: consumerKey,
    Authorization: authorization,
    'x-works-apiid': apiId,
    ...formData.getHeaders()
  },
  data: formData.getBuffer()
};
axios
  .request(options)
  .then((res) => {
    if (response.status < 200 || response.status >= 300) {
      throw res.data;
    } else {
      console.log('success');
      console.log(res.data, res['x-works-resources-id']);
    }
  })
  .catch((e) => {
     console.log('failed');
     console.log(e);
  });
```
request の場合では、options のキーを formData とすることで form-data 形式が使えましたが、axios だとその機能はないため、form-data を使うのが無難です。
また、ヘッダーも良い感じに処理はしてくれないので、自分で getHeaders() をしてヘッダーを追加する必要もあります。
またファイルを buffer ではなく stream で処理する場合は、LINEWORKS ではそのままだと StreamLength を正しく認識してくれないので、Content-Lengthを正しく設定してあげる必要があると思います。
Windows11のアップグレードしてみる

今回犠牲？になってもらう対象のPCは、昨年に某通販で数万円で購入したミニPCです。最近はあまりPCに負荷を変える使い方をしないので、ふだん使いのPCとしてはこの程度のスペックでも十分です。

```
デバイス名	********
プロセッサ	Intel(R) Celeron(R) J4125 CPU @ 2.00GHz   2.00 GHz
実装 RAM	8.00 GB (7.82 GB 使用可能)
デバイス ID	A55CCCAE-89A6-4D92-86BF-******
プロダクト ID	00331-20020-00000-*****
システムの種類	64 ビット オペレーティング システム、x64 ベース プロセッサ
ペンとタッチ	このディスプレイでは、ペン入力とタッチ入力は利用できません
```

### まずはインストール対象PCの互換性チェック
MicrosoftのWindows11のサイトから、「互換性の確認」の「PC 正常性チェック アプリをダウンロード」でダウロードしたファイル、対象PCにインストールして、互換性の確認を行ってみると 「互換性OK」のようです。（やった！）

https://www.microsoft.com/ja-jp/windows/windows-11

![PC正常性チェック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/74170ede-564c-190d-965d-ef265844f1a8.png)


### Windows11の強制インストール
このまま放っておいても「順次ダウンロードされます」とのことですが、いつになるかわからないので、今回は強制アップグレードします。
強制アップグレードするためには、MicrosoftのWindow11のサイトから、「Windows11インストールアシスタント」をダウンロードし、実行します。

https://www.microsoft.com/ja-jp/software-download/windows11

後は特に設定することなく、自動的にアップデートが実行され、数十分程度でWindows11にアップデートされます。

![win11-desktop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2369407/59cb930c-aecd-9ed4-8dfc-6ab33c8275ac.png)


ログイン画面のフォントが丸ゴシックに変わり、時計が表示されるようになっていますね。
ログインしてみると、タスクバーのデフォルト配置が変わり、スタートメニューの表示内容も整理されて、変更になっています。今回はWindows11の評価記事ではないので、Windows11での変更点は他の方の紹介記事を参照してください。
AWS App RunnerにECRパブリックイメージをデプロイしてカスタムドメインを設定するまで

# App Runnerサービスの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/d1b22c91-02e8-a75a-4997-363dd5a90634.png)
ECRパブリックイメージはこちらを使います。

https://gallery.ecr.aws/aws-containers/hello-app-runner

デプロイトリガーは手動に設定。自動は月1$の[追加コスト](https://aws.amazon.com/jp/apprunner/pricing/)がかかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/343cffef-de4b-9c53-617a-222edbc35c62.png)
ポートは[hello-app-runner](https://gallery.ecr.aws/aws-containers/hello-app-runner)の`usage`に書いてあったものを指定。
その他はデフォルト。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/47338536-1b4c-e059-a5e2-64a9fdb596cf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/e3daaa97-a088-a594-5667-356f53c9365e.png)
3分ほど待つとサービスの作成が完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/f79a2af9-bbcc-91f8-02a9-bc66b2afcb11.png)
デフォルトドメインにアクセスしてページが表示されればOK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/021820f0-eb0e-8a7a-3dfc-be86243eb1d0.png)

# カスタムドメインの設定

デフォルトドメインに任意のカスタムドメインを割り当ててアクセスしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a4f203a7-1ca8-0f41-f499-d4972fe7b1cb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/f065552a-deca-d3f9-b46c-f6f173a368c5.png)
表示されたレコードと値のセットを使用してるDNS（Route53など）にCNAMEで登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96507/a44e1b87-5708-3db9-6884-725c04b9f923.png)

しばらく待つと証明書の検証が完了しカスタムドメインでサービスにアクセスができるようになります。