OmniAICreator/Qiita-1.07M huggingface dataset:
NETFLIX の字幕をスクレイピングする

# はじめに
この記事では、NETFLIX で掲載中の映画から字幕をスクレイピングで取得するツールのご紹介をします。IT やプログラミングがまだ不慣れな人でも使えるように、可能な限り簡単に作りました。なので、高度で高機能なスクレイピングツールを求められている方は対象ではありません。

また、このツールは<strong><font color="#FF6666">言語学習</font></strong>を目的として作成しました。
その他の用途で使用することは控えてください。

# 目次
- [背景](#背景)
- [作ってみるか](#作ってみるか)
- [成果物](#成果物)
- [使い方](#使い方)
- [各種設定（応用編）](#各種設定応用編)

# 背景
私は NETFLIX の視聴者で、よく洋画やアニメを鑑賞しています。
NETFLIX を契約する前は、英語の勉強としてハリウッド映画やワーナーブラザーズの映画をレンタル屋から借りてきては、頑張って英語字幕を書き写しては調べ、丸暗記してシャドウイングするという勉強法を行ってきました。

※この勉強法が良いかはわかりません。
※もっと良い方法があればコメントでご教示ください！

NETFLIX を契約してからも同じ方法を続けていたのですが、やはり字幕の書き写しの時間と労力が半端ではなく、この工程を省けたら楽なのになあ、、と日々考えていました。

# 作ってみるか
プログラミングを多少かじっていたので、NETFLIX の字幕の表示構造をブラウザのデベロッパツールで調べてみたところ、案外シンプルな構造でした。

「あれ、これ抜き取れるんじゃね？」

とふと思い、じゃ作ってみるかと思い立ちました。

# 成果物
作成したスクレイピングツールは以下の GitHub リンクに掲載しています。

[NETFLIX-SUBTITLE-SCRAPER](https://github.com/BruceWeyne/NETFLIX-SUBTITLE-SCRAPER)

クローンしてくださるも良し、コピーしてそのまま使用してくださるも良し、ご自由に使用してみてください。

# 使い方
できるだけ簡単に使えるようにしましたが、やはり多少はプログラミングの知識を必要とします。すみません。

以下はその手順です。

### スクレイピングの開始
1. GitHub 内の「[netflix_subtitle_scraper.js](https://github.com/BruceWeyne/NETFLIX-SUBTITLE-SCRAPER/blob/main/netflix_subtitle_scraper.js)」ファイルにアクセスする。
1. 画面の右側にある「コピー」アイコンをクリックして、コードすべてをクリップボードにコピーする。
1. NETFLIX で鑑賞したい映画を選択し再生を開始して、一時停止させる。
1. デベロッパツールを表示させる。<br>一時停止中の画面上で右クリックし、「検証」を選択すると表示される。<br>```Mac: Command + Shift + c```<br>```Windows: Ctrl + Shift + i```
1. デベロッパツール内のタブで、「コンソール」または「Console」を選択する。
1. コンソール上で先ほどクリップボードにコピーしたコードを貼り付ける。<br>※そのまま全部を貼り付けて問題ありません。
1. Enter キーを押す。（ここでスクレイピング機能が開始）
1. 一時停止させていた映画を再生させる。（デベロッパツールは表示させたままを推奨します）

### スクレイピングした字幕を出力する
1. 再生していた映画を一時停止させる。（映画一覧には戻らないでください）
1. 以下のコードをコンソール上で実行し、スクレイピング機能を停止させる。（任意）<br>```mo.disconnect();```
1. 以下のコードをコンソール上で実行し、抜き取った字幕をコンソール上で出力する。<br>```subtitle;```
1. 以下のコードをコンソール上で実行し、出力した字幕をクリップボードにコピーする。<br>```copy($_);```
1. 後は、テキストファイルや Evernote など、お好きなツールに貼り付けてください！

### 参考写真
スクレイピングの開始 - 手順２
![copy_code_to_clipboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/b2af48e2-dc8e-5fe5-ed52-85477db8af29.png)

スクレイピングの開始 - 手順6
![paste_code_to_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/4721adad-ca03-c5c6-d04d-6fb805f35a37.png)

スクレイピングの様子
![ongoing_scraping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/bf47f490-ef80-7a1a-1c71-6260bb51c484.png)

スクレイピングした字幕を出力する - 手順1-4
![output_subtitles.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/61690738-93ba-7744-2861-a3264e54e5cf.png)

スクレイピングした字幕を出力する - 手順5
![result_of_scraping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364477/986fac1c-ce23-c6d5-5336-c5dc78ed874f.png)

# 各種設定（応用編）
スクレイピングツールのコードの中で、初期設定を行える項目があります。
コードを貼り付けて実行する前に、こちらの項目を変更してスクレイピングの機能を一部変更することができます。

### 各種設定
|キー|説明|
|-|-|
|sentenceSeparate|それぞれの字幕を空白行で離すかどうかを設定<br>true: 空白行で離す（デフォルト）<br>false: 空白行で離さない|
|effectsHide|"[Raining sound]" などの効果音字幕を省略するかどうかを設定<br>true: 省略する（デフォルト）<br>false: 省略しない|
|playingDebug|スクレイピング中に抜き取った字幕をコンソール上で表示するかを設定<br>true: 表示する（デフォルト）<br>false: 表示しない|
|clearConsole|スクレイピングツールのコードを実行後にコンソールの表示をクリア（綺麗に）するかを設定<br>true: クリアする（デフォルト）<br>false: クリアしない|
maya python select curves for lighting

```Python
import maya.cmds as cmds
curve_transforms = [cmds.listRelatives(i, p=1, type='transform')[0] for i
in cmds.ls(type='nurbsCurve', o=1, r=1, ni=1)]
selectList = []
for c in curve_transforms:
    if "FKNeck_M" in c:
        selectList.append(c)
        selectList.append(c[0:-8]+"FKRoot_M")
return selectList
```
113.イテレーターとスプレッド演算子

# スプレッド演算子
展開した配列を新しく変数に代入したい時
#### 書き方
1.配列を作成する
2.[]の中に...配列
```javascript:配列を配列として代入したい時
const arry1 = [1,2,3,4,5];
const arry2 = [...arry1];
console.log(arry2)
```
＞結果
![スクリーンショット 2022-09-07 15.51.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/3f3100d8-5ad9-e2cb-04aa-9f1e37043fd5.png)
スプレッド演算子はイテレータの操作に従う

# 残余引数
仮引数をもとに実引数argsを配列として扱う

```javascript
function Func(...args){
    // 引数が要素として取得されるので
    // argsは[要素1,要素2,要素3]となる
}
Func(要素1,要素2,要素3)
```
## 書き方
### 例
```js

function Arg(...args){
  console.log(args)
}

Arg(1,2,3,4,5,99)
```

# ポイント
＊データの参照元に注意
```js
const arry1 = [1,2,3,4,5];
const arry2 = [...arry1];
console.log(arry1)
console.log(arry2)
//　見た目は同じだけど
console.log(arry1 === arry2)
```
1,2は同じように見えて違うんだよ、、
＊データの参照元に注意！

## 配列の比較には
1.文字列型に変換する
2.カスタム関数を作成する
を比較しましょう。
＜参考＞
https://qiita.com/ba--shi/items/46e2d42ea5fb9e94926f
キーバリュー型のデータベース

# キーバリュー型(Key Value Store)データベースとは
**キーバリューストア**とは、データの書式を問わず、そのデータに対して何か「キー」となる値を結びつけて格納する方式のデータベース。略して**KVS**という。NoSQL型のデータベースの代表例。
キーというのは、データを見つけやすくするラベルのこと。リレーショナル型と異なり、柔軟性があり、データを書式通りに入力しなくて良い反面、なんでもデータとして格納できる。よって、詳細な検索ができない。しかし、データのアクセスが高速。
近年ではビックデータ処理やIoTのような大量のデータ処理や高速化が求められる場面で使用される。
キーバリューストア型のデータベースは、AWSに２種類用意されている。
１つは、ストレージに保存する**DynamoDB**、
もう１つは、メモリにキャッシュする**Amazon ElasticCache**。
# DynamoDB
Amazon DynamoDBは、キーバリューストア型のデータベース。
リレーショナル型に向かない汎用的なデータを保存するのに適している。

リレーショナルの特徴は表であることと、デーブル同士が連携していること。つまり事前に形式をしっかりと決めなければならない上、形式通りのデータしか入力できない。テーブル同士が連携していることはストレージの節約にもなるが、処理が遅くなる側面もある。

キーバリューストア型は、納めるデータに書式はない。
項目数(列数・カラム数)もバラバラでよく、データ型も指定しない。テーブル同士の連携もない。
そのため、**SQLが使用できない**ので高度な検索ができない弱点があるが、その代わりにリレーショナルより遥かに早く処理する。
DynamoDBはVPCなしで接続できるので、Lambdaなどの非VPCのアプリケーション実行環境と相性が良い。
大規模なデータを処理するために、ACID（トランザクションとして必要な各性質）トランザクション、データの暗号化、アクセス制御などのサービスが整っている。グローバテーブルとして作成すれば、世界中に分散しているデータを自分のリージョンに複製されて使用できる。

# Amazon ElasticCache
**Amazon ElasticCacheとは、インメモリ型のデータベース**。
インメモリ型とは、データベース操作のたびに外部記憶装置と読み書きを行うのではなく、頻繁に読み書きのあるデータは一時的にメモリに置いておくなど、メモリを活用して処理を高速にする形式。
DynamoDBはストレージに保存するため、インメモリ型のElasticCasheの方がより高速。その代わりに、**インスタンスの再起動時にデータが削除されてしまう。**そのため、高速化を目的としたキャッシュとしてよく使われる。
ElasticCacheにはRedis用とMemcached用があり、RedisとMemcachedは、どちらも代表的なメモリキャッシュ型キーバリューストアのDBMS。
【デジタル挑戦への第1歩】住所・郵便番号検索に活用できるLINE bot

# 自己紹介

皆さま、初めまして。
小売企業で広告販促の担当をしております。

昨今、DXやらアプリやらとデジタル化が進んでいく中ですが、うちは今もなお紙神話が続いております。
中々にデジタルに関する知識が低く、周りの企業さまから見ると化石と思われるているのかもしれません…

社内ではようやくコーポレートサイトがお洒落になった感はありますが、がんばりま賞といったところでしょうか？

そんなわけで少しでも自身のスキルUPに繋がり、そして脱アナログを目指して、初めてのLINE bot制作への第1歩を踏み出すのでした！

# 今回のLINE Botを作ろうとした経緯

自分の仕事上、販促物を送ったり、ハガキを出したりすることが多い現状です。
結果として住所を調べることが多いということに気づき、いつも自社のHPを確認したり、Google検索したりと時間が掛かっていました。

これはLINE Botで対応ができれば楽になるのではと思い、まずは住所検索ができるヤツをいっちょやってみよう、作ってみようということになりました。

# 完成品がこちら

そんなこんなで完成品です。
本当は該当するデータがない場合、わんちゃんの画像が返るようにしたかったのですが、能力不足で実装ができませんでしたが、もう少しテコ入れ、頑張ります！

https://twitter.com/Mkm4P6wBzL96VDb/status/1567392692405149697


# 使用ツール

●[MAKE](https://www.make.com/en)
●[LINE Developers](https://account.line.biz/login?redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Fconsole%2F%3Fstatus%3Dsuccess%26status%3Dcancelled%26status%3Dcancelled)
~~●[郵便番号・住所検索API]~~
⇒リンクが間違ってました。申し訳ございません。
正：[郵便番号・住所検索API](http://zipcloud.ibsnet.co.jp/doc/api)
●[参考サイトさま](https://qiita.com/OPA-Shinmura/items/a6bd90939d946d2e52f1)


# 制作手順
前提として、LINE DivelopersでLINE公式アカウントを作っておきます。

#### ●シナリオ構成

①メッセージで『住所』、もしくは『郵便番号』を送る
②HTTP⇒JSONを経由して、メッセージとして戻ってくる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820648/4e77dd6c-af92-b4db-8579-8dc79d4587d3.png)

黄色い線はわんちゃん画像が返るようにした設定の残骸です…
上手く設定できずで今回は断念となりました。

#### ●HTTPモジュール(Make a request)設定
上段は<strong>郵便番号から住所を返す</strong>設定
下段は<strong>住所から郵便番号を返す</strong>設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820648/05d7496e-8ac2-d644-b809-c5fa465f8107.png)

#### ●Routerモジュール設定
上段は県、都、区、市が<strong>含まれない</strong>テキストが流れるよう設定
下段は県、都、区、市が<strong>含まれる</strong>テキストが流れるよう設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820648/e3d095ad-d8bc-bee5-d658-efa95637fadd.png)

#### ●JSONモジュール(Parse JSON)設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820648/766b8a3c-c280-b125-82f7-5806dd0001c0.png)

#### ●LINEモジュール(Send a Reply Message)設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2820648/c551a6d9-1aa2-2c02-475c-cdc86b6fefd5.png)




# 最後に

**英語が読めない…**
今回使用した『MAKE』というツールはノーコードでLINE botが作れるという何とも初心者におあつらえ向けのものでした。

なのに英語が読めずに苦戦、次ぐ苦戦続きとなってしまいました。

できたと思い、稼働させるとエラーが出る
稼働したと思い、もう1回動かしたら動かない

でも諦めずに勉強していけばきっともっと良くしていけることを感じました！
次こそは待ってろよ～、わんちゃん画像！！

稚拙な文章ですが、お付き合いいただき、ありがとうございました。
第2歩もどうぞよろしくお願いいたします。
Ceva's theorem「チェバの定理の証明」をsympyでやってみたい。 

オリジナル

https://ja.wikipedia.org/wiki/%E3%83%81%E3%82%A7%E3%83%90%E3%81%AE%E5%AE%9A%E7%90%86

https://en.wikipedia.org/wiki/Ceva%27s_theorem


# sympyで
教えて下さい。

チェバの定理の例題＞証明1. 面積比を用いる方法

https://manabitimes.jp/math/656


```python
from sympy import *
t1,t2,t3=symbols('t1,t2,t3',real=true)
PA,PB,PC=symbols('PA,PB,PC',real=true)
AF,BD,CE=symbols('AF,BD,CE',real=true)
FB,DC,EA=symbols('FB,DC,EA',real=true)
APC,BPC,APB,APC,BPC,APB=symbols('APC,BPC,APB,APC,BPC,APB',real=true)
APC1=Rational(1,2)*PC*AF*sin(t1)
BPC1=Rational(1,2)*PC*FB*sin(t1)
APB2=Rational(1,2)*PA*BD*sin(t2)
APC2=Rational(1,2)*PA*DC*sin(t2)
BPC3=Rational(1,2)*PB*CE*sin(t3)
APB3=Rational(1,2)*PB*EA*sin(t3)
print("#",APC1/BPC1,"*",APB2/APC2,"*",BPC3/APB3,"=",
          APC /BPC   *  APB /APC   *  BPC /APB )
# AF/FB * BD/DC * CE/EA = 1
```

# sympyでうまくいかなかった例

交点計算でだめでした。

```python
from sympy import *
Bx,Cx,Cy,Ox,Oy=symbols('Bx,Cx,Cy,Ox,Oy',real=True)
A=Point(0 ,0 )
B=Point(Bx,0 )
C=Point(Cx,Cy)
O=Point(Ox,Oy)
D=Line(A,O).intersection(Line(B,C))[0]
E=Line(B,O).intersection(Line(C,A))[0]
F=Line(C,O).intersection(Line(A,B))[0]
ans=A.distance(F)/F.distance(B)*B.distance(D)/D.distance(C)*C.distance(E)/E.distance(A)
print("#",ans.simplify().simplify())
# sqrt(Cy**2*(Cx*Oy - Cy*Ox)**2 + (Bx*Cx*Oy - Bx*Cy*Ox - Cx**2*Oy + Cx*Cy*Ox)**2)
```


直角二等辺三角形の重心でやってみました。
```python
from sympy import *
A=Point(0 ,0 )
B=Point(100,0 )
C=Point(0,100)
O=Rational(1,3)*(A+B+C)
D=Line(A,O).intersection(Line(B,C))[0]
E=Line(B,O).intersection(Line(C,A))[0]
F=Line(C,O).intersection(Line(A,B))[0]
ans=A.distance(F)/F.distance(B)*B.distance(D)/D.distance(C)*C.distance(E)/E.distance(A)
print("#",ans.simplify().simplify())
# 1
```

# 一辺を共有する三角形の面積比の公式

https://manabitimes.jp/math/636


https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13143979173


```python
from sympy import *
AP,BD,CD,t=symbols('AP,BD,CD,t',real=true)
APB=Rational(1,2)*AP*BD*sin(t)
ACP=Rational(1,2)*AP*CD*sin(t)
print("#",Eq(APB/ACP,BD/CD))
# True
```

# 入試問題
そのもの

https://mathmathmass.exblog.jp/32190483/

メネラウス，チェバの定理＜

https://kamelink.com/blog/tag/%e3%83%a1%e3%83%8d%e3%83%a9%e3%82%a6%e3%82%b9%ef%bc%8c%e3%83%81%e3%82%a7%e3%83%90%e3%81%ae%e5%ae%9a%e7%90%86/


『メネラウスの定理』と『チェバの定理』の証明を含めて...＜

https://ameblo.jp/mathisii/entry-11254666664.html?frm=theme



# 参考

https://qiita.com/ryutaatkagawanct/items/6562cfb5c6ceced10091
【chrome】タブグループのすすめ

事務のあなた、営業のあなた、エンジニアのあなた。
chromeの「**<font color="#DE5246">タブグループ</font>**」使ってますか？

使ってない？　なにそれだって？

そんな人は記事を読むことで**煩わしいあの問題**から解放されるかもしれません。

## 対象
- chromeを主に使う人
- ページを開きすぎて目的のタブが見つからない人
- 管理ツール等の影響で似た名前のタブをたくさん開く人

chromeユーザーなら覚えておくと、便利に使えるかもしれません。

## 煩わしいあの問題
初めての業務で調べものをしている時、ブラウザ上で顧客管理をしている場合など…
**気が付くとタブの数がすごいことに！　ああ！　タブがつぶれてページ名すらわからない！**
皆さん経験はありませんか？　きっとあるはず。あるに違いない！　うん。

また、以前経験した職場では顧客情報をブラウザで参照するシステムを使っていました。
その時つらかったのが、**タブに表示されるタイトルが全ページ似たようなワードだった**こと！
15個あるタブが全部似たようなタイトル…想像しただけで嫌ですね。

エンジニアはそもそも調べものが多いと思うので**タブが増えがち**…。

これから紹介する「**<font color="#DE5246">タブグループ</font>**」でこのような問題を~~ぶっ飛ばして~~攻略していきましょう！

## タブグループの使い方
chromeに実装されている、複数のタブを一つにまとめて管理できる機能をタブグループと言います。
pc版とandroid版は実装されているのを確認してます。
<font color=darkgray>便利だからipad版にも実装してくれないものか…。</font>
※どうやら、edgeやsafariにも似たような機能があるみたいです。

ここからはpc版chromeの基本的な機能を紹介していきます！
### タブグループ作成
![tabg new.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822096/2a13020f-ae14-48ba-b13e-9b2278313389.png)
- グループに入れたいタブを右クリック
- 「タブを新しいグループに追加」をクリック
- 名前と色を設定(設定しなくても問題ないです)

### タブグループにタブを追加
![tabg add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822096/19901ce6-cd49-cf47-bb96-ba54385d1a37.png)
- 追加したいタブをタブグループへドラッグ&ドロップ

### タブグループからタブを移動
![tabg remove.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822096/416c9818-f406-3dcd-52b3-4049bfde519c.png)
- 移動したいタブをグループの外へドラッグ&ドロップ

### タブグループを折りたたむ
![tabg compact.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822096/d56e1281-4544-9d60-6d61-58348b11ea6d.png)
- 折りたたみたいタブグループ名をクリック

### タブグループの並べ替え
![tabg sort.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822096/3bbc82ce-a52e-232e-4e2e-41180a928ad9.png)
- 移動したいタブグループ名をドラッグ&ドロップ

### タブグループを閉じる
![tabg delete2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2822096/8ff3c1a0-62d3-f004-68a2-ac50afb9783f.jpeg)
- 閉じたいタブグループ名を右クリック
- グループを閉じるをクリック
※タブを残しつつグループを解除したい場合は「グループを解除」を選択

## 使いどころ
最後にタブグループの具体的な使用例を挙げたいと思います。

- **技術的資料をまとめておく**
- **顧客毎に情報をまとめておく**
- **業務ごとに情報をまとめておく**

こうしておくことで、**視認性が良くなり、探してる情報が見つけやすくなり、タブを管理しやすく**なります！
タブを整理することで頭も整理されるので、気持ちよく作業できるのではないでしょうか。

業務の内容によっては信じられないくらい快適になったりするので、
自分の業務と照らし合わせてみてください！


## まとめ
以上、タブグループについて簡単に説明しました。

使用感としては**初見でも感覚的に使えるほどシンプル**で、ブラウザを使い慣れている方なら簡単に扱えるのではないでしょうか？

痒い点としては、タブグループをchrome起動時の自動で設定出来たらなお良しですが、今後使う人が増えて改良されるといいなと思ってます。

最後までよんでくださりありがとうございます。
快適なchromeライフが訪れんことを！
【GitHub】 リモートリポジトリにpushした内容に戻す方法

# 【GitHub】 リモートリポジトリにpushした内容に戻す方法

この記事ではWindows10にインストールしたGit 2.37.2を使っています。
コマンドライン引数に与えるユーザー名は適宜読み替えてください。

また、適宜キャプチャ画像に手書きを加えて解説しております。
自分が初学者というのもあり丁寧に書いています。
一部の方々にはくどいと思われるかもしれませんが、ご容赦ください。

※注意
以下に示す方法で戻して削除した履歴は、再度復旧することはできません。
(例)この場合、4と5の履歴はGitHubのリモートリポジトリに消えてしまいます。
    戻す前：1→2→3→4→5
    後：1→2→3

### ①GitHubDesktopのCommit履歴の順番を整理しましょう

　変更したいリポジトリを、▼から選択
→GitHub Desktop(ローカルリポジトリ)のHistoryから、戻したいCommitを確認しましょう。
・下記画像だと、Commit履歴の順番は以下の通りです。
　1. firstcommit
　2. 各モデル、テーブルの生成
　3. ファイル名fukui-tripをgitignoreに追加
　4. 中間テーブルの生成
　5. 各マイグレーションファイルにテーブルを定義した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835861/55f119f5-9b97-413e-a4b2-0ebfcc43c4f9.png)

### ②戻したい履歴のコードを取得しましょう
例えば、"5.各マイグレーション…"の作業を削除し、"4.中間テーブル…"のところに戻したい場合、"4.中間テーブル…"を選択し、画面中央上部にあるコード(ここでは `2c7e7e1` )をメモしましょう。

### ③実際に、pushした内容を戻しましょう
　ターミナルもしくはコマンドプロンプトを起動
→要すれば、`cd`(change directory)で対象のフォルダ先に移動
→`git reset --hard コードの番号` を入力
    <font color="red">※下記画面ではコード番号 "7b3e91e" になっていますが、正しくは "2c7e7e1" です！</font>
→Enterを押すと、下記のように`HEAD is now at...`と表示
　<font color="red">※下記画面ではコード番号 "7b3e91e 各マイグレーションファイルに..." になっていますが、正しくは "2c7e7e1 中間テーブル…" です！</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835861/32a4cb33-0852-17d6-dfce-e4f00a1d155f.png)
これで、Commitの履歴が変わりました！

### ④最新のpush内容に対し、上書きをしましょう
最新のpush内容(ここでは、"5.各マイグレーション…")と齟齬があるので、ターミナルもしくはコマンドプロンプトで `git push -f origin master` を入力
→Enterを押し、下記画像のようなコードが出ればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835861/fe5419b1-b516-df2e-6140-4c2389f1bafa.png)

### ⑤最後に、履歴が戻っているか確認しましょう
GitHubDesktop(ローカルリポジトリ)およびGitHubブラウザ版(リモートリポジトリ)を見て、どちらも戻したい作業まで戻っているか確認

## あとがき
いかがでしたしょうか。

自分もGitHubに残した過去の内容に戻したく色々調べたのですが、複数のサイトを見てようやく出来ました。
なので、「1つの記事で分かった方が良いよね」という思いからこの記事を執筆しました。

この記事を見て、GitHubに残して作業すれば、失敗を恐れず作業できるエンジニアが増えてくれると嬉しいです。

また、実はこれが初めての投稿なので、みなさんに上手くお伝えできているかどうか不安というのがあります。

今後も初学者向けに丁寧な記事を投稿したいので、ぜひコメントなどお願いいたします。

### 参照
[https://loop-never-ends.com/github-reset/](https://loop-never-ends.com/github-reset/)
データベースを使うまで

# RDSの操作
データベースの操作は、EC2と同じように「データベースを準備する操作」と「データベースを使用する操作」に分かれている。
## データベースを準備する操作
データベースを作成したり、各種設定したりする操作。これらは、マネジメントコンソールで行う。RDSはマネージドサービスなので、セキュリティバッチの適用やアップデートは自動的に行われる。
## データベースを使用する操作
データを入力・削除・変更する操作。これはデータベースクライアント(管理ツール)や、ソフトウェア(アプリケーション)から行う。
RDSの場合、ソフトウェアはEC2上に置かれることが多く、連携させて使う。
ex)WordPress(ブログ用のシステム)であれば、EC2に本体のアプリケーションを入れ、データベースをRDSに構築する。
# RDSサービスの機能
RDSはデータベースサービスなので、さまざまな設定項目がある。
## データベースエンジンに関する項目
データベースについては、どのDBMSを使うのかを考えておく。AWSで対応しているバージョンとそうでないバージョンがある。多くのデータベースはソフトウェアと連携して使うので、併用するソフトウェアと対応するDBMSのバージョンも調べる必要がある。

|項目|意味|
|-|-|
|データベースエンジン|DBMSの種類・・MySQL,PostgreSQL,MariaDB,Amazon Aurora|
|ユースケース|本番環境や開発環境かを選ぶ。本番環境ならば、マルチAZがデフォルトで有効になるなど、環境にふさわしい設定が表示される。|
|ライセンスモデル|GPLなど、ライセンスモデルが複数ある場合は選ぶ|
|データベースエンジンのバージョン|バージョンが複数ある場合は選ぶ|
## データベースインスタンスに関する項目
オンプレミス環境でいえば、物理的なサーバーに当たる部分。
料金との相談になるため、必要なスペックと予算から絞り込む。
マルチAZやスケーリングはデータベースの規模や重要度によって選択する。
|項目|意味|
|-|-|
|インスタンスのクラス|データベースインスタンスクラスのスペック。EC2のように複数のインスタンスクラスが用意されている。|
|マルチAZ配置|AZをまたいで冗長化するかどうか。|
|ストレージタイプ|ストレージの種類|
|ストレージの割り当て|ストレージの容量|
|自動スケーリング|ストレージが足りなくなった時に自動で増やすかどうか。|
|スケーリング閾値|自動スケーリングの閾値|
|データベースインスタンス識別子|データベースインスタンスのAWSにおける管理上の名前。データベースの名前ではないので注意|
|マスターユーザーの名前|データベースインスタンスの管理者ユーザー名。任意|
|マスターユーザーのパスワード|データベースインスタンス管理者のパスワード。任意
|
## ネットワークに関する項目
RDSのインスタンスは、必ずVPC上のおく必要がある。EC2と連携させる予定がある時は、予めEC2で使用しているサブネットグループやAZを調べておく。セキュリティグループも作っておく。
|項目|意味|
|-|-|
|VPC|RDSを配置するVPC。VPCを作成するには、VPCダッシュボードを使用する。デフォルトVPCも選択できる。|
|サブネットグループ|RDSを配置するサブネットグループ。EC2インスタンスと連携させる場合は、同じ場所にするのが一般的。(事前に調査)|
|パブリックアクセシビリティ|データベースインスタンスにパブリックIPアドレスを割り当てるかどうかを表す。同じVPC内のサービス**以外**からアクセスする場合は、IPアドレスを割り当てる。AWS外からデータベースにアクセスしたい場合も必要。|
|アベイラビリティゾーン|RDSを配置するAZ。EC2インスタンスと連携させる場合は、同じ場所におくのが一般的。
|セキュリティグループ|インスタンス単位で動くファイアウォール。使用するポートを開けておかないと通信できないので注意。|
## データベースの環境に関する項目
データベースごとに環境を設定できる。保守に関わる項目が多いため、運用を見越した選択が重要。
|項目|意味|
|-|-|
|データベースの名前|データベースの名前|
|ポート|使用するポート。ex)1433(SQLServer),3306(MySQL),5432(PostgreSQL),5439(Redshift),1521(Oracle Database)|
|データベースパラメータ|環境設定のオプション。多くの場合はデフォルトのまま。|
|オプショングループ|追加機能の設定。多くの場合はデフォルトのまま。|
|暗号化|暗号化するかどうかを表す。インスタンスの種類によっては使用できない。|
|バックアップ|自動的に作られるバックアップの保存期間|
|モニタリング|データベースインスタンスをモニタリングする方法。「拡張モニタリング」を有効にするとより詳細の情報が得られるが料金がかかる。|
|ログのエキスポート|Amazon CloudWatch Logsを使ってログを出力|
|メンテナンス|自動的にアップロードする方法と時間帯|
|削除保護|削除しないように保護するかどうか|
# RDSを使用する流れ
1. AWSにログイン
リージョンを選択し、マネジメントコンソールを開く
RDSダッシュボードを開く
1. DBインスタンスを作る
DBを作る
エンジンを選択する
ユースケースを選択
DB詳細（マシンスペック）を指定
詳細設定（DBの設定）を指定
1. RDSに接続する
EC2からRDSに接続する
DBクライアント(管理ツール)から接続
1. データを入力する
既存のデータをインポート
新規データの入力・削除・変更

RDSは多くの場合、**EC2上に置いたソフトウェアと連携して使う。**
そのため、EC2と同じネットワークに設定したり、EC2と連携したりする作業が必要になる。
EKSを立ち上げたものの、コンソールでノードの存在が確認できなかった場合

## What's This
EKSをTerrafrom,eksctlを使用して立ち上げたものの、なぜかコンソールでノードが確認できなかった場合の解決方法のメモです。

## 原因

一方のIAMユーザーの権限でNodeを立ち上げていて、もう一方のIAMユーザーでコンソールにログインしていたためでした。
（AWSアカウントは同一）

エラー内容通り…
`現在のユーザーまたはロールには、この EKS クラスターの Kubernetes オブジェクトへのアクセス権がありません`

## 確認

一方のIAMユーザーの権限でNodeを立ち上げたとき

![スクリーンショット 2022-09-01 13.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/e1c6badd-33ee-0e87-3a5f-853a6b66c0f8.png)

もう一方のIAMユーザーでコンソールにログインしたとき

![スクリーンショット 2022-09-01 12.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/b47bf5db-75d7-bdba-a1ad-3a03e5c7e709.png)

## Refference

・https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-kubernetes-object-access-error/
商談が完了した時の日付を記録したい

元の質問　: [How to set Close Date field to reflect Today()’s date when the stage is changed to Closed on Opportunities?](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000JdO2p)

商談が完了した時の日付を記録したいとのこと。
まぁ、数式ではできんだろうなぁって思っていたら、数式のお師匠さんが数式でなくフローを提案してきた。

数式リソースでToday()を得て、更新していますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/b269f459-56ca-d5be-3f4a-f3e56ba50ed2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ed00f855-8a4d-ff8d-c50b-839d19d6bcde.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/ab49a1ef-52ec-dbb3-7dc0-20bcaefa2847.png)
「あれ、なんだっけ？」を解消！統一用語をサッと確認できるbotに挑戦【初心者】

**誤字脱字はだけではない、
重要な自社の統一用語チェック**
--------------
私は、日々原稿のチェックに追われている一般企業の社内報担当者です。
初校が届けば、すぐに目を皿にして誌面のすみずみまでチェックを行います。
その際に、誤字脱字と同じくらい（もしくはそれ以上）重要なのが、
__自社の統一用語が反映されているかどうか__。
しかし、１つや２つではない用語を覚えるのは一苦労で、~~すぐに忘れてしまいます。~~
「あれ、『捉える』って、漢字だっけ平仮名だっけ？」と混乱するたびに、データを蓄積しているエクセルシートから掘り起こさなければなりません。正直煩わしく、調べている間にストーリーが抜けてしまい最初から読み直すことになります。
サッと調べることができるBotが欲しい！と思い、デジタル知識皆無の初心者が作成に挑戦しました。

:::note info
【補足説明】なぜ自社統一用語があるのか
基本理念を下にした考えから、ただ単に言葉を並べるのではなく、言葉の中に思いも込めているからです。例えば、「お客様」は利用不可です。理由は、「様」には、物事の形、あり方、様子、ありさまを意味します。お客さまは、決して物事の様子を表す対象ではありません。そのため、「お客さま」という表現を使用しています。
:::

**使用ツール**
------------------
* LINE Developers
* Make
* Googleスプレッドシート

**完成品**
-----------
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">testbot <a href="https://t.co/KIvhExpeRZ">pic.twitter.com/KIvhExpeRZ</a></p>&mdash; narumi (@narumi656384_) <a href="https://twitter.com/narumi656384_/status/1567065697116880898?ref_src=twsrc%5Etfw">September 6, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**作成の下準備**
-----------
* 使用ツール、アプリケーションそれぞれに会員登録
* LINE Developersでプロバイダーを作成
* Googleスプレッドシートでデータの整理
* うまくいくようにお祈り

**Makeで連携**
------------
下準備の後、連携作業開始！以下のようにつなぎました。

![宿題_make.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/521d4569-9686-fb2d-f0c2-6d77f94491b6.gif)

&ensp;1\. LINE(watch Events)：基本的な設定（LINE Developers）
&ensp;2\. Googleスプレッドシート（Search Rows）：元データ
&ensp;3\. Tools（Swich）：正規表現を使用して一致させる
&ensp;4\. Router：文字列の有りと無しに分岐
&ensp;5\. LINE（Send a Reply Message）
&ensp;&ensp;&ensp;&ensp;合致した場合：「利用可」「利用不可」「備考」を設定
&ensp;&ensp;&ensp;&ensp;合致しない場合：「記者ハンドブック」を確認するように指示

▼Googleスプレッドシートの中身
![宿題_統一用語Googleシート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/12a2d8c4-03c9-2d19-8815-acda852865f1.gif)
※統一用語の一部。合計数は約３６０個あります

▼Routerの設定
検索文字列有りの場合は、画像下の「合致した場合」という意味Existsにする
![宿題１Setupfilter.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/e37608d1-95d4-0a9d-fe69-bc28fc6f11b9.jpeg)
※文字列が無い場合は「Does not Exist」にする

▼LINEテキスト
![宿題_LINE_テキスト.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2817841/3d09c1e0-aadf-c797-c63c-dedb0ac09dda.gif)
**振り返りと次の目標**
-------------------
- [x] 英語が分からなくても翻訳しながら愚直に進めた
- [x] 統一用語サッとbotはなんとか完成した
- [ ] 記者ハンドブックの内容もbotで返せるようにしたい
- [ ] SSSAPI化したデータを活用するbotにチャレンジする
&ensp;&ensp;※GoogleスプレッドシートをAPI化できる[サイト](https://console.sssapi.app/home)

以上です！最後までお読みいただきありがとうございました。
vimでカラースキームを設定後に背景色のみを変える

vimでカラースキームを設定後に背景色のみを変える方法。

.vimrcで以下のようにcoloreschemeの「前に」autocmd文を追加する。
```
autocmd colorscheme * highlight Normal ctermbg=230
colorscheme morning
```
230は色番号。
色番号の一覧は https://www.ditig.com/256-colors-cheat-sheet

morningの背景色は灰色だが、上記の設定で230（Cornsilk1：クリーム色）に変わる。

カラースキームのblueやshineはシンタックス個別に背景色を指定していて部分的にそちらが有効になってしまうので、変更する場合は https://developers-book.com/2021/10/30/713/ を参考に設定を追加する。
111.ジェネレーター

## ジェネレーターとは
イテレーターを作ってみて思ってたのが
めんどくさい、、
もっと簡単な方法ないのか？
→ジェネレーターを使おう
## 書き方
1.functionの後に*をつける
2.関数名は gen()
3.yield 値　値を追加してから継続
4.return 値　値を追加してインクリメント終了
5.呼び方はイレテータと変わらない
#### ジェネレータのコード
```javascript
function* gen(){
    yield 1;
    yield 2;
    yield 3;
    return 4;
}
const it =gen()
console.log(it.next())
console.log(it.next())
// 上限
console.log(it.next())
//　4回目の上限オーバー
console.log(it.next())
```
![スクリーンショット 2022-09-07 15.28.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/33042154-d4fa-9781-ef47-575a19ba8187.png)

#### イテレータだと
```javascript
function genIterator(max){
	let i = 0;
	return{
  	next:function(){
    // ifで引数が上限に達した時,done:trueを返してあげましょう
    if(i > max){
    return{
    	done:true
    }
    }else{	    
      return{
        done:false,
        value: i++
       }
      }
    }
  }
}
```
## whileと組み合わせる
```javascript
function* gen(max=10){
 let i = 0
 while(i < max)  
   yield i++;
   
    return max;
}
const it =gen(4)

console.log(it.next())
console.log(it.next())
// 上限
console.log(it.next())
//　4回目の上限オーバー
console.log(it.next())
```
スクロールしたら一文字ずつアニメーション

スクロールして特定の要素が画面に入ったら、
テキストアニメーションする実装をしたので備忘録として。



CodePen
https://codepen.io/yaajitaake4/pen/zYjvZBO


## コード

### HTML
```index.html
<p class="text">スクロールしてください</p>

<div class="box"> 
  <div class="text-animation">アニメーション01</div>
</div>


<div class="box">
  <div class="text-animation">アニメーション02</div>
</div>
```

### CSS(SCSS)
```style.scss
// 余白用
.text {
  margin-bottom: 1000px;
}

.box {
  background-color: #eee;
  margin-bottom: 200px;
  padding: 100px 0;
}

// アニメーション用
.text-animation {
  opacity: 0;

  &.show {
    opacity: 1;

    .text-animation-span {
      display: inline-block;
      overflow: hidden;

    }
    span {
      display: inline-block;
      letter-spacing: 0.1em;
      animation: showText .5s backwards;
    }
  }
}

@keyframes showText {
  0% {
    opacity: 0;
    transform: translateY(100%);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
```

### JavaScript
```script.js
document.addEventListener('DOMContentLoaded', () => {
  const boxElement = document.querySelectorAll('.box');
  const textElement = document.querySelectorAll('.text-animation');

  // スクロールしたら表示
  document.addEventListener('scroll', () => {
    for (let i = 0; i < boxElement.length; i++) {
      // windowの上端から要素までの距離 + 要素の高さ(ここで表示のタイミングを調整)
      const getElement = boxElement[i].getBoundingClientRect().top + boxElement[i].clientHeight;

      if (window.innerHeight > getElement) {
        textElement[i].classList.add('show');
      }
    }
  });

  for (let i = 0; i < textElement.length; i++) {
    const textElements = textElement[i],
          animeText = textElements.textContent,
          animeTextArray = []; // spanタグで囲んだ文字を格納する

    textElements.textContent = ''; // 後ほど追加するので空に

    for (let j = 0; j < animeText.split('').length; j++) {
      const t = animeText.split('')[j]; // 文字を分割

      if (t === ' ') {
        animeTextArray.push(' '); // スペースはそのまま格納
      } else {
        animeTextArray.push( // テキストをspanタグで囲む
          '<span class="text-animation-span"><span style="animation-delay: ' + j * 0.1 + 's">' + t + '</span></span>'
        );
      }
    }

    // 囲んだ要素を追加
    for (let k = 0; k < animeTextArray.length; k++) {
      textElements.innerHTML += animeTextArray[k];
    }
  }
});
```

今後はintersectionObserverやreduceメソッドを使ったり、
改良していきたいなと思います。
Z80 の命令動作タイミング

# はじめに

以下の記事で Z80 の命令の動きについて書いてみたところ、若干理解が浅かったので、少し深堀りしてみました。

https://qiita.com/suzukiplan/items/33b6ef01738e75facad4

とはいっても、テクニカル・ドキュメント類を読んでもイマイチふわっとした理解しかできませんでした。シンプルに私の読解力が足りないのかもしれませんが、どうやら理解するための素地となる知識が不足しているようです。

_テキスト寄り（？）ではなく実験寄りな形で学べればスッキリ理解できるかも..._

という訳で色々と調べてみたところ、以下の [Visual Z80 Remix](https://floooh.github.io/visualz80remix/) というツールがとても分かりやすかったです。

https://floooh.github.io/visualz80remix/

上記ツールを使って `LD SP, $0030` という命令（スタックポインタ `SP` に `$0030` を代入する命令）のトレースログを詳しく読んでみた所、何となく理解できた気がします。

# `LD SP, $0030`

まず `LD SP, $0030` という命令の仕様を Zilog が公開している [Z80 User Manual](http://www.zilog.com/docs/z80/um0080.pdf) で確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/d944fff3-e5a0-295f-27c0-94bf82579746.png)

`M Cycles` は `2` とのことですが `T States` は `10 (4, 3, 3)` とのことです。

`M Cycles` の表記は多分誤植かな?

`T States` の表記によると、この命令は 4Hz, 3Hz, 3Hz の3マシンサイクルで構成される 10Hz の命令とのことです。

オペコードは（SPの場合）1バイト目が `%00110001 ($31)` で 2〜3バイト目が対象のレジスタペアに代入する値（リトルエンディアン）という形です。

そして、下図が `LD SP, $0030` を [Visual Z80 Remix](https://floooh.github.io/visualz80remix/) で動かした時のトレースログですが、以下2点の補助を当方で加筆してます。

- マシンサイクルの区切りに赤色の実線
- レジスタが書き換わったタイミングに蛍光ペンでマーク

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/2fc489a8-db87-baca-ea3e-1113cf232686.png)

1/2クロック（1Hzの半分）単位でトレースログが記録されているようですね。

## M1 (2Hz)

M1 は最初のマシンサイクルという意味で、全ての命令で共通して最初の4ハーフクロック（2Hz）で命令コードの1バイト目を読み込んでいます。

ハーフクロック単位の動作（※推測を含む）を箇条書きにしてみます。

1. _実行前同期?_
2. 1回目の `MREQ/RD` : `メモリのPC($0000)番地` を読み込んで `PC` をインクリメント
3. 2回目の `MREQ/RD` : `DB(Data Buffer?)` が 手順2 で読み込んだ `$31` <sup>`(LD SP, n2n1)`</sup> に書き換わる
4. 3回目の `MREQ/RD` : _多分このタイミングで `DB` をデコード?_

## RFSH (2Hz)

M1 の後、必ず4ハーフクロック（2Hz）でリフレッシュレジスタの更新を行うようです。

M1 + RFSH は必ずセットで行われるようなので、テクニカルドキュメントでは RFSH 完了まで（4Hz）を M1 としているようです。

## n1読み込み（3Hz）

SP (16bit) の下位 8bit に格納される値（2バイト目のopcode = n1）をメモリから読み出して設定します。

1. _実行前同期?_
2. 1回目の `MREQ/RD` : `メモリのPC($0001)番地` を読み込んで `PC` をインクリメント
3. 2回目の `MREQ/RD` : `DB(Data Buffer?)` が 手順2 で読み込んだ `$30` 書き換わる
4. 3回目の `MREQ/RD` : _メモリ読み込み後の同期?_
5. 4回目の `MREQ/RD` : _メモリ読み込み後の同期?_
6. `SP` の下位 8bit に `DB($30)` を書き込む

## n2読み込み（3Hz）

SP (16bit) の上位 8bit に格納される値（3バイト目のopcode = n2）をメモリから読み出して設定します。

1. _実行前同期?_
2. 1回目の `MREQ/RD` : `メモリのPC($0002)番地` を読み込んで `PC` をインクリメント
3. 2回目の `MREQ/RD` : `DB(Data Buffer?)` が 手順2 で読み込んだ `$00` 書き換わる
4. 3回目の `MREQ/RD` : _メモリ読み込み後の同期?_
5. 4回目の `MREQ/RD` : _メモリ読み込み後の同期?_
6. `SP` の上位 8bit に `DB($00)` を書き込む

# まとめ

まだ理解がふわっとしている部分が多いですが、何となく細かい動作タイミングの基本が理解できたので、これでハード寄りの各種テクニカル・ドキュメント類を読む素地はできたかな...と。

当初、1Hz単位で同期できれば完璧かと思っていましたが、どうやらハーフクロック単位での同期がベストのようですね。
pushした後でcommit履歴をきれいにしたい

# レビュー依頼を出す前にcommit履歴をきれいにしたい！
という時が私はよくあるので、そういった場合にAndroidStudio上でカンタンに行う方法をここに残しておきます。

# やりかた
AS上で`squash`を行います。
まずASのgit上でこのcommitまとめちゃいてぇなぁというcommitを適当に選択して右クリックします。
複数ある場合でもまとめてしまえば全部同じなので、適当に１つ選んでしまいます。
![スクリーンショット 2022-09-07 11.23.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/c9a67de1-5cf2-50e8-4885-4bdbcea822e8.png)

右クリックすると選択肢がいっぱい出てきますが、`Interactively Rebase`なんやらを選んでください。
![スクリーンショット 2022-09-07 11.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/d0264b01-c23c-c0ae-b9c9-e870a9e68628.png)

選択するとこのような画面に行きます。
適当にコミットを選択して、上部のSquashボタンをクリックします。右の▼ではないです。
![スクリーンショット 2022-09-07 11.23.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/ba16c081-a76b-d1f6-45e0-63e627e6fcd4.png)

するとcommitメッセージが編集できるようになります。
ここでcommitメッセージを編集し、編集できたら適当に入力スペース以外のところをクリックして編集モードを終了します。
![スクリーンショット 2022-09-07 11.24.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/d746b0e7-2bfc-e076-3576-1f4ab016ec8e.png)


あとは`Start Rebasing`を押すだけ〜
![スクリーンショット 2022-09-07 11.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906559/ccbe2b4f-35fd-8090-77ef-914bc72b8bf7.png)

ちなみにリモートにpushするときはforce pushで。

```
git push -f origin [作業ブランチ]
```
108.イテレーターを自分で作成してみる

# イテレーターを自分で作成してみる
# イテレーターとは
反復操作を行うための『オブジェクト』の総称のこと
ここでいう反復は繰り返しの処理のこと
## フロー
1.関数を作成　インクリメントに使う変数を宣言しておく
```js
function genIterator(max){
	let i = 0;
}
```
2.nextで返す
```js
return{
  	next:function(){
    //
}
```
3.以下を加える
```js
    1.doneは、trueにすると、これ以上インクリメントを行わない
    2.バリューにインクリメント加えとく
return{
	　done:false,
      value: i++
   	 }
```
4.呼び出す
```js
console.log(it.next())
console.log(it.next())
console.log(it.next())
```
結果
![スクリーンショット 2022-09-07 12.44.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/3438d80f-b24a-1d45-4490-c3dfb86b5cba.png)

1-5までのコード
```js
function genIterator(max){
	let i = 0;
	return{
  	next:function(){
    return{
			done:false,
      value: i++
   	 }
    }
  }
}

console.log(it.next())
console.log(it.next())
console.log(it.next())
```
## 上限に達した時に起動させないようにするには
```js
function genIterator(max){
	let i = 0;
	return{
  	next:function(){
    // ifで引数が上限に達した時,done:trueを返してあげましょう
    if(i > max){
    return{
    	done:true
    }
    }else{	    
      return{
        done:false,
        value: i++
       }
      }
    }
  }
}
// 引数に上限を入力」
const it = genIterator(2);

console.log(it.next())
console.log(it.next())
console.log(it.next())
```
![スクリーンショット 2022-09-07 13.05.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/714631/cc341ee4-814d-dfba-0f08-2667e0a0964c.png)

＊つまりdone:trueであればいくらイテレータを呼び出してもインクリメントを呼ばない
Excel VBA などでIPアドレス直打ちアクセスが出来なくなった･･･｡対処法

 <br> <br> <br>

# 1.現象
<br> <br>
ファイルサーバーで共有しているExcelファイルにおいて、「いつも使えていたのが使えない」と、あいまいな言葉で部下に呼ばれた。

![サンプル１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707164/623de408-a345-7502-216b-499c0bc5f303.png)

<br> <br><br> <br>

見知らぬ赤帯。そういえば風のうわさで聞いたことがある。実は柔道や空手など武術において、黒帯をとかく目にしがちであるが、黒を超える幻の赤帯があるという。国内でも数人しか持っていないらしい。。。。。

<br> <br><br> <br>



調べてみると、今年の初め頃にOffice365で「ネットからダウンロードしたOfficeファイルでVBA（Visual Basic for Applications）マクロをデフォルトでブロックする」という更新があったらしい記事を見つけた。弊社では2019を使っているので遅れてその波がやってきたらしい。
<br>
それから、VisualStudioで自作した「タスクトレイ常駐監視アプリ」も動いていなかった。
ファイル共有サーバー上に置かれたtxtの中身を読み取るもので、IPをコード内に直打ちしていた。

<br> <br><br> <br>


# 2.対処



IPアドレスにサーバー名を名付けて解決する。

192.168.〇.〇〇〇 = サーバーくん

であるとWindowsに登録して教えてあげる。そうしておくと
「え？　ああ、椿さんこのPCと知り合いなんスか？　ふーん。。。じゃあ通っていいっすよ」
ってなる。


(緊急であれば、そもそも別のマシン内にファイルがあるから「ちょっとまって！ 誰よその女ァ！」と怒っているわけで、ローカルにコピーしてくれば使える。)

◆環境
Excel2019
Windows 10 Pro 21H2
 <br>

C:\Windows\System32\drivers\etc\　内のhostsというファイルに知り合いを書き込んで登録する。
hostsはメモ帳で、管理者権限で開くこと。
 <br>
参考記事。
https://i-think-it.net/windows10-notepad-administrator-open/

 <br> <br>
![サンプル2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707164/838e6e23-3a82-67da-f22c-f382dc2cd3d9.png)

 <br> <br> <br>

最下行に

192.168.@.@@@ MyServer
IPアドレス 任意のサーバー名
を書き込む。間の半角スペースを大切に。
 <br> <br> <br>

![サンプル３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707164/0336432b-f7a5-da79-5fbe-178c731d98c8.png)

 <br> <br> <br>

上書き保存して閉じる。
エクスプローラーに入力して、アクセスできるか確認しよう。
ここではHostsにMyServer　とかいたので、\\\MyServer。

![サンプル4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707164/ae9d105b-ad36-7161-82b7-4cdbde8c4761.png)

鍵をかけていれば、ログイン画面が出るはず。

アクセスできない→メモ帳を管理者権限で開いた？　HostsにちゃんとIP書いた？
 <br> <br> <br>
アクセスできた→.xlsmなどを開いて赤帯がでるか確認。
うまくいっていても、ファイルによっては個別の許可がいる。違いはよくわからん。
この場合、プロパティから全般→セキュリティの許可にチェックするところが現れる。なければ問題ない。

![img_faq04_1-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707164/cd107a4b-6ad1-0bc4-d2e3-290f379f4433.png)


 <br> <br> <br>


さて、この状態でショートカットを作っておこう。
\\\192.168.@.@@@ でアクセスして作られたショートカットはすべて捨てて、新しい\\\MyServer\･･･でつながったものに差し替える。今後は名前でつながろう。

人にやってあげる時、うっかり上位のアクセスIDなど教えてしまわないよう気を付けてっ！
逆にうっかり上位権を知ってしまった時は帰ってお酒を飲んで忘れようっ！
PL-100 Microsoft Power Platform App Maker 受験記

先日、Microsoft Power Platform App Makerを受験し、無事に合格しましたので受験記を書きたいと思います。

# Microsoft Power Platform App Makerとは
資格の概要について公式サイトに以下の記載があります。

> この認定資格は、ソリューション分野に関する深い専門知識を持ち、チームのタスクとプロセスを簡素化、自動化、変革するための Microsoft Power Platform ソリューションの構築に情熱を注いでいるビジネス専門家を対象に作られています。 データ モデリング、基本的な UX 設計、要件分析、プロセス分析といった技術ビジネス アナリストの主要なタスクを遂行するためのスキルを備えている必要があります。

[引用元](https://docs.microsoft.com/ja-jp/certifications/power-platform-app-maker/ "Power Platform アプリ開発者アソシエイト")

# PL-100の試験範囲
> ビジネスソリューションの設計 (35 ～ 40 %)
ソリューションを作成する (45 ～ 50 %)
データの分析と視覚化 (15 ～ 20 %)

[引用元](https://docs.microsoft.com/ja-jp/certifications/power-platform-app-maker/ "PL-100")

受験してみた印象としてはDataverse、モデル駆動型アプリ、ソリューション関連の問題が多かったように感じました。
これから受験する方は上記に注力すると合格しやすいかもしれません。

# 試験対策
書籍や有償のオンライン教材等もありますが、まずはMicrosoftが提供している無償の教材で学習することをお勧めします。

- [Microsoft Learn](https://docs.microsoft.com/ja-jp/certifications/power-platform-app-maker/?azure-portal=true "PL-100 Learn")
    - Power Platform App Makerのコンテンツは、全12のラーニングパスが用意されており、1人で全部こなすと膨大な時間がかかってしまいます。そこで、会社の仲間と分担し、学習内容を勉強会形式でお互いに教えあうとう方法を実施しました。効率良く学習でき、人に教えることで自分の理解度も上がり、良い施策だったと思います。
- [Udemy | PL-100: Microsoft Power Platform アプリ メーカー](https://www.udemy.com/course/pl-100-microsoft-power-platform-app-maker-ms/ "PL-100: Microsoft Power Platform アプリ メーカー")
    - 1回目の受験ではわずかに点が足らず、不合格となってしまったため、万全を期すためにUdemyの有償教材を購入して勉強をしました。実際に操作しながらの説明となるため、より知識を深めることが出来たと思います。(英語版しかないので翻訳して理解するのに手間取りました…)

# ここは押さえておきたい
各製品ごとにどんな学習が試験に役立ったのかを記載していきます。
- Dataverse
    - データ設計
    - モデル駆動型アプリとの連携方法
    - 適切なデータソースの選択
    - ビジネルルール作成方法、使用方法
- PowerApps
    - キャンバスアプリとモデル駆動型アプリの違い
    - ビジネスプロセスフローのユースケース
    - 正しい関数記法
    - バージョン管理方法
    - Teamsに組み込む方法
- AI Builder
    - 各モデルの特徴
    - 課題に対してどのモデルを適用するか
    - 使用方法
- Power Automate
    - 自動フローの作成と、発行やフローの共有までの手順とフロー作成方法
    - カスタムコネクタについても作成方法
    - 標準コネクタ、カスタムコネクタ、認証コネクタの違い
- Power Virtual Agents
    - チャットボットの作成手順
    - チャットボットからPower Automateと連携を行う方法
    - Teamsに組み込む方法
- Power BI
    - デスクトップ版とサービス版の差異
    - ダッシュボードとレポートでそれぞれの制約と出来ること
    - PowerAppsとの連携方法
- その他(管理画面やセキュリティ等)
    - デフォルトソリューション、マネージドソリューション、アンマネージドソリューションの特徴や違い
    - DLPポリシーの設定方法、DLPポリシー違反時の解決方法
    - ALMに基づく戦略・設計
    - 環境設計
    - D365とPower Platformがどういう連携が行えるか
    - セキュリティロール(やりたいことに対してどの設定が適切か、どのセキュリティロールを割り当てる必要があるか等)
    - 想定のシナリオに対して、どの製品が有効か判断が行えること
    - ケーススタディ(課題に対してどのように解決するか、どのサービスが適切か等)

# 最後に
上記の対策を行い、無事に2回目の受験で合格することが出来ました！
PL-900 Power Platform Fundamentalsと比べると問われる知識も幅広く、より詳細まで理解していないと合格は難しいと感じました。
学習するなかで特に効果的だったのは実際にPowerPlatformのツール群を利用したことでした。
教材だけでなく、実際に製品も触って学習を進め、PL-100の合格を目指しましょう。
VSCodeでReactのデバッグ環境を整える

# この記事の目的
Reactプロジェクトで基本yarnを使っている場合に、デバッグ用の設定どうするかを模索した結果です。
VSCode上でブレーク張って変数見たりできるようになります。

# 設定ファイル
.vscodeフォルダ内に以下の２ファイルを作成します。
- tasks.json：ターミナル＞タスクの構成...＞npm: start
- launch.json：実行＞構成の追加...＞Chrome
からそれぞれ雛形のファイルを生成できます。

```tasks.json
{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "command": "yarn start", // package.jsonで設定しているコマンド
            "label": "yarn: start",　// launch.jsonで使います
            "detail": "react-scripts start",
            "group": {
                "kind": "test",
                "isDefault": true
            },
            "isBackground": true,
            "problemMatcher": {
                "owner": "custom",
                "pattern": {
                    "regexp": "ˆ$"
                },
                "background": {
                    "activeOnStart": true,
                    "beginsPattern": "Compiling...",
                    "endsPattern": "Compiled .*"
                }
            }
        }
    ]
}
```
上記`type`に`npm`は指定できますが、yarnは指定できないので`shell`としています。
その代わり`command`で実行したいコマンドを全て指定しています。こちらは`package.json`で指定している`react-scripts start`のエイリアスコマンドに対応させます。

```launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "pwa-chrome",
            "request": "launch",
            "preLaunchTask": "yarn: start", ・ tasks.jsonのlabel
            "name": "Launch Chrome against localhost",
            "url": "http://localhost:3000",
            "webRoot": "${workspaceFolder}",
            "sourceMaps": true,
            "sourceMapPathOverrides": {
                "webpack:///./*": "${webRoot}/src/*"
            }
        }
    ]
}
```
`webRoot`はモノレポのプロジェクトの場合、`"${workspaceFolder}/frontend"`のように指定してください。
`name`はVSCodeの実行とデバッグの名称になります。今回の設定の場合の見た目は以下の画像参照。
![スクリーンショット 2022-09-07 14.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835473/5aeead88-93cf-6488-8ea0-755b3081c552.png)

最後に、デバッグ用のChromeだけが立ち上がるようために必要な設定を行います。
と言っても簡単で、`.env`ファイルに以下を追記するだけです。
```.env
BROWSER=none
```

# おわりに
上記設定の後、`launch.json`の`preLaunchTask`の中身を`npm`にしてこちゃこちゃしても同じことだなと気づきました。
でも、デバッグできたらいいじゃないということで、お好みの設定で快適な開発ライフを送りましょう。
ときどき急に必要になるAWSのリージョン名一覧とリージョンコード対応表（日本語・英語）

1年に1回ぐらい、AWSのリージョン一覧とリージョンコードが必要になる時があるので、その覚書

|リージョン名（日本語）|リージョン名（英語）|リージョンコード|
|:----|:----|:----|
|米国東部 (オハイオ)|US East (Ohio)|us-east-2|
|米国東部 (バージニア北部)|US East (N. Virginia)|us-east-1|
|米国西部 (北カリフォルニア)|US West (N. California)|us-west-1|
|米国西部 (オレゴン)|US West (Oregon)|us-west-2|
|アフリカ (ケープタウン)|Africa (Cape Town)|af-south-1|
|アジアパシフィック (香港)|Asia Pacific (Hong Kong)|ap-east-1|
|アジアパシフィック (ジャカルタ)|Asia Pacific (Jakarta)|ap-southeast-3|
|アジアパシフィック (ムンバイ)|Asia Pacific (Mumbai)|ap-south-1|
|アジアパシフィック (大阪)|Asia Pacific (Osaka)|ap-northeast-3|
|アジアパシフィック (ソウル)|Asia Pacific (Seoul)|ap-northeast-2|
|アジアパシフィック (シンガポール)|Asia Pacific (Singapore)|ap-southeast-1|
|アジアパシフィック (シドニー)|Asia Pacific (Sydney)|ap-southeast-2|
|アジアパシフィック (東京)|Asia Pacific (Tokyo)|ap-northeast-1|
|カナダ (中部)|Canada (Central)|ca-central-1|
|中国 (北京)|China (Beijing)|cn-north-1|
|中国 (寧夏)|China (Ningxia)|cn-northwest-1|
|欧州 (フランクフルト)|Europe (Frankfurt)|eu-central-1|
|欧州 (アイルランド)|Europe (Ireland)|eu-west-1|
|欧州 (ロンドン)|Europe (London)|eu-west-2|
|ヨーロッパ (ミラノ)|Europe (Milan)|eu-south-1|
|欧州 (パリ)|Europe (Paris)|eu-west-3|
|欧州 (ストックホルム)|Europe (Stockholm)|eu-north-1|
|中東 (バーレーン)|Middle East (Bahrain)|me-south-1|
|南米 (サンパウロ)|South America (São Paulo)|sa-east-1|
|中東（UAE）|Middle East (UAE)|me-central-1|


## メモ
https://docs.amazonaws.cn/en_us/aws/latest/userguide/endpoints-Ningxia.html

https://aws.amazon.com/jp/blogs/aws/now-open-aws-region-in-the-united-arab-emirates-uae/

https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html
Dataverse for Teams 環境の自動削除が始まった

本日 2022/09/07 にメールが着弾して思い出したというか、気づいたというかな、Dataverse for Teams 環境まわりに対する Update のお話しです。

# 公式情報
Docs と メッセージセンターに情報がありました。

## Docs
タイトルが「非アクティブな Microsoft Dataverse for Teams 環境の自動削除」です。

https://docs.microsoft.com/ja-jp/power-platform/admin/inactive-teams-environment?WT.mc_id=BA-MVP-5004053

> Power Platform が提供するクリーンアップ メカニズムによって、非アクティブな Dataverse for Teams 環境 をテナントから自動的に削除できます。 非アクティブと見なされる Dataverse for Teams 環境が、最初に無効化されます。 管理者が何のアクションも取らない場合、これらは一定期間が経過した後で削除されます。
> 
> このプロセスは自動で行われます。 非アクティブな Dataverse for Teams 環境が不要な場合は、何もする必要がありません。
> 
> 管理者は Teams 環境の削除ポリシーを設定して、環境を自動で無効化するまでの非アクティブ期間を構成できます。 値の許容範囲は、15 日、30 日、45 日、60 日、および 90 日間の非アクティブ期間です。 また、このポリシーは自動で削除する前に環境を無効化できる期間も決定します。
> 
> Dataverse for Teams 環境を無効化すると、環境とそのリソースを正しく使用できません。 たとえば、アプリを起動できず、フローは一時停止され、チャットボットも操作できません。

一定期間、Dataverse for Teams（以降、DvfT）環境へアクセスしたり利用していない場合は、まず非アクティブ（停止）状態になって、さらに放置すると自動削除しますよ、と言ってますね。

## メッセージセンター
ID：MC415083 「非アクティブな Microsoft Dataverse for Teams 環境の自動削除のお知らせ」です。こちらはテナントの全体管理者など、然るべき権限があるユーザーでご確認ください。
![メッセージセンター01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b693a441-4396-8dce-7740-b3654d02538d.png)

> 非アクティブとみなされる Teams 環境は、最初に 30 日間無効になり、管理者が何も操作を行わない場合は削除されます。
> 
> 環境が非アクティブであるかどうかを判断するために使用する基準は次のとおりです。
> インスタンスにログインしたユーザーがいません
> インスタンスに含まれるデータにアクセスしたアプリ、ボット、レポート、またはフローはありません。
> 新しいアプリ、ボット、レポート、またはフローがインスタンスにインストールまたはインポートされませんでした。

メッセージセンターの情報よりも、Docs のが更新日時が新しいです。なので、メッセージセンターの情報は参考程度で良いかな、と思いますね。

# 実際に確認してみた
公式情報にある通りなんですが、念のため自分でも確認してみました。

## 届いたメール
”チーム名”（＝DvfT 環境名）が ｎ日後に無効化されるよ、という内容です。モザイクの場所にチーム名が自動で入ってきます。
![Mail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/81a0effa-5661-a7eb-b89a-7708fc02ab3d.png)
コレ、上記の機能展開を知らなければビックリするでしょう。しかも、執筆時点では英語で届くので、翻訳することすら放棄してシステム管理者や窓口へ問い合わせしちゃう方が出てきそうな予感がギュンギュンします（汗
なお、翻訳した文面も参考までに Up しておきます。
![MailJP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/90bc6b99-f977-b36b-fc06-711b115d205f.png)
この後、一定期間（おそらく30日）放置すると削除されるんでしょうね。

## Power Platform 管理センター
［環境］のなかにある［状態］列に無効化までの残日数が表示されていました。
![PP-Admin01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/fa5c4ddf-735e-c6f7-fd97-c7c8975a2d1e.png)

## 延命するには？
［環境］の一覧から該当の環境名をクリックして詳細画面へ遷移し、右側に表示される”環境が非アクティブです”の「環境活動をトリガーする」をクリックしていけば延命が可能です。
![PP-AdminDetail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/a5ff0543-64e6-3595-9c24-84d71de90b9a.png)
下のポップアップで「続行」をクリックすると延命できます。
![PP-AdminDetail02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/4380b9a0-3bf4-71c4-8360-e0bed8a5dada.png)
なお、該当の DvfT 環境にあったテーブルへデータ登録などをしてみましたが、半日程度では自動非アクティブの表示は消えませんでした。非アクティブ化の対象を操作したら自動延命になるか？ は、Docs には”ある”とも”ない”とも書いてないです。現状で延命したければ、管理センター経由で操作しましょう、でしょうね。

# 結び
DvfT を意図せず作成してしまったチームの所有者から、実際に数件問い合わせがあった、ということで調べてみました、というネタでした。居るのよね、DvfT 環境を意図せず作っちゃってるヒト。

意図せず作っちゃった環境であれば、自動削除されても問題無いのでメールすら無視で OK だと思います。逆に、半年に１回しか使わないアプリや環境がのった Teams （なんてレアな局面があるのか？は知らないですがｗ）みたいなのがある方はご注意されたし、ですね。

それでは、皆さま。素晴らしい Power Platform Life を！
SuperCSV便利機能まとめ(変換処理)

# null消去
CSV取り込み時にNULLがある場合、CSV取り込み時に別の値へ置き換えることができる。
## 基本的な使い方
-  value()で、変換する値を指定します。
- 読み込むときには、それぞれのタイプの書式に沿った形式を指定する必要があります。もし、間違った書式で定義した場合は、CSVファイルの値が不正なときと同様にエラーとなります。
- アノテーションCsvNullConvertと併用する際には、処理結果が互いに変換対象となるため、 属性cases()やgroups()で適用するケースを分けるようにしてください。

```java
 @CsvBean
 public class SampleCsv {
     
     // クラスタイプに沿った値を指定します。
     @CsvColumn(number=1)
     @CsvDefalutValue("0")
     private Integer id;
     
     // 書式が指定されている場合は、書式に沿った値を指定します。
     @CsvColumn(number=2)
     @CsvNumberFomat(pattern="#,##0")
     @CsvDefalutValue("1,000")
     private Integer salary;
     
     // 書き込み時のみ適用する場合
     @CsvColumn(number=3)
     @CsvDefalutValue(value="-", cases=BuildCase.Write)
     private String comment;
     
     // getter/setterは省略
 }
```

# 文字列置き換え
CSV取り込み時に対象の文字列を任意の文字列に置き換えることができまっす。
## 基本的な使い方
```java
文字列を
@CsvWordReplace(words={"文字列"}, replacements={"文字列を置き換えました。"})
```

参考文献
https://mygreen.github.io/super-csv-annotation/apidocs/com/github/mygreen/supercsv/annotation/conversion/CsvWordReplace.html

https://mygreen.github.io/super-csv-annotation/sphinx/conversion.html?highlight=%E5%A4%89%E6%8F%9B

https://mygreen.github.io/super-csv-annotation/sphinx/conversion_annotation.html?highlight=csvdefault
[Ruby]Google Calendar APIで終日のイベントを登録する

Google Calendar APIを使ってイベントを登録するときに、開始時間と終了時間が決まっているイベントと終日のイベントを登録するときで指定方法が異なりました。
サンプルはRubyですが、他の言語も似たような感じかなと思います。

公式ドキュメントはこちら
https://googleapis.dev/ruby/google-api-client/latest/Google/Apis/CalendarV3/EventDateTime.html

# 時間までキッチリ指定する場合
`date_time:`パラメーターに日時を指定してあげればOKですね。

```ruby
start_at = Time.new(2022, 10, 1, 9, 0, 0)
Google::Apis::CalendarV3::Event.new(
    start: Google::Apis::CalendarV3::EventDateTime.new(date_time: start_at.rfc3339),
    end: Google::Apis::CalendarV3::EventDateTime.new(date_time: start_at.since(1.hour).rfc3339),
    summary: '素敵なイベント',
    description: 'バナナはおやつに入りますか？'
)
```
この場合、以下のように時間単位での表示になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10138/649860c5-6980-5808-75aa-8183aba8eced.png" width="400">

# 終日イベントとして指定する場合
`date:`パラメーターに日付を指定してあげればOKです。パラメーターが異なります。

```ruby
date = Date.new(2022, 10, 1)
Google::Apis::CalendarV3::Event.new(
    start: Google::Apis::CalendarV3::EventDateTime.new(date: date),
    end: Google::Apis::CalendarV3::EventDateTime.new(date: date),
    summary: '素敵なイベント',
    description: 'バナナはおやつに入りません'
)
```

この場合、以下のように終日イベントとしての表示になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10138/7d87db7c-8970-970c-61ee-f75e073960e0.png" width="400">
RDSで使えるDBMS

# RDSで使用できるデータベースエンジン
RDSでは、**AWSオリジナルのAmazon Auroraに加えて、PostgreSQL,My SQL,MariaDB,Oracle Database,SQL Serverの６種類のデータベースエンジン(DBMS)を使用できる**。
オンプレミスからAWSへの以降もスムーズに移行できる。
# 対応しているDBMSの一覧
|DBMS(提供元)|内容|
|-|-|
|Amazon Aurora(Amazon)|MySQLおよびPostgreSQLと互換性のあるAWSオリジナルのリレーショナルデータベース。|
|PostgreSQL(PostgreSQL Global Development Group)|1970年台に開発されたIngresというデータベースを祖先とするオープンソースのデータベース。My SQLと同様にプログシステムからショッピングサイトまで幅広く使われている。|
|MySQL(Oracle)|スウェーデンのMySQL ABによって開発されたデータベースシステム。サンマイクロシステムズ(Oracle)に買収された。小規模のシステムからショッピングサイトなどの大きなシステムまで、幅広く利用でき、オープンソースのRDBMSとして品気が高い。|
|MariaDB(Monty Program Ab)|MySQLの開発者がスピンアウトして開発。昨日はほぼMySQLと同じだが、ライセンスはGPLと異なる。|
|Oracle Database(Oracle)|小規模なシステムからエンタープライズまで幅広く対応する。WindowsでもLinuxでも動作する。|
|Microsoft SQL Server(Microsoft)|小規模なシステムからエンタープライズまで幅広く対応する。以前はWindows Server用のソフトウェアであったが現在はLinuxでの動作する。|
# Amazon Auroraとは
Amazon AuroraはMySQLおよびPostgreSQLと互換性のあるAWSオリジナルのリレーショナルデータベース。料金は高いが、堅牢でハイパフォーマンス。互換性があるため、オンプレミス環境用のMySQLやPostgreSQLからの標準的なインポートツールやスナップショットを使用しての移行ができるのはもちろんのこと、SQLをそのまま使用でき、コード、アプリケーション、ドライバー、ツールなどプログラムやソフトウェア側の調整が必要ない。
またAWS用に設計されているため、標準的なMySQLやPostgreSQLのデータベースと比べて高速。
AWSでMySQLを使用する場合、
EC2にインストールする方法、RDSを使用する方法、RDSのAmazonAuroraを使用する方法の３つがある。DBMSに変更がなく、高パフォーマンスを求める時はAmazon Auroraを使用する方法が便利。
パソコンのストレージ増設について

# はじめに

自作PC(BTOカスタマイズ)のHDDから異音が聞こえるようになったため、そろそろ世代交代が必要かなと思案。
最近ではマザーボードに設置するM.2型のストレージも出てきたし、各種ストレージの特徴をまとめてみることにした。



# 主流のストレージ

2022年9月現在、主流のストレージは次のものがあると思われる。

- 3.5インチ HDD
- 2.5インチ SSD
- M.2 SSD


:::note info
2.5インチのストレージは家電向けストレージとして使われるシーンはあるだろうが、パソコン用のストレージとして使用されることはほぼないのではないかと思われる。
:::

## まとめ

| タイプ | サイズ | ソケットタイプ | インターフェイス |備考|
|:-:|:-:|:-:|:-:|:-:|
| 3.5インチHDD | 3.5インチ  |  - | SATA | データ保存ならコレ |
| 2.5インチSSD | 2.5インチ | - | SATA | モバイル向け。そろそろ使われなくなる? |
| M.2 | 2242, 2260, 2280 | m-key. b-key, b&m-key | SATA, NVMe | システムドライブ用途ならコレ |


## 3.5 インチ HDD
データ保管先よく使われているストレージ。パソコン, サーバ, NASで使用。
大容量化が進んでおり、20Tbまで保存可能。

## 2.5インチ SSD
ノートパソコンのシステムドライブ もしくは モバイルのデータ保管先としてよく使われているストレージ。
4Tbまで保存可能。※4Tb以上保存できるモデルもあるが高価格な為、例外とする。

:::note info
エンタープライズ用途で読み込み速度の速いSSDを用いたデータストレージを採用するシーンもあるが、特例。
:::

## M.2 SSD
システムドライブ として使用するストレージ。サイズは3種類あり IoT、ノートパソコン、パソコンとデバイスのサイズに合わせて選択できる。サイズによって保存可能なデータ容量も変わる。
M.2 SSDは考慮することが多い。

### サイズ
2242, 2260, 2280 の3つのサイズがある。パソコン用途としては2280が一般的(かも)。2280は4Tbまで保存可能。

:::note info
価格コムで調べたらサイズによってインターフェイスが決まっているようだ。

| サイズ | インターフェイス | 備考 |
|:-:|:-:|:-:|
| 2242 | SATA |   |
| 2260  | SATA |   |
| 2280  | PCI-Express | SATA対応のM.2 SSDは1Tb以下のものしかない |

:::

M.2 SSDはSATA通信とNVMe通信の2つのタイプが存在する。

### ソケットタイプ
M.2 SSDはマザーボードに直接設置するストレージで、パッと見では対応するインターフェイスがわからない。マザーボードのソケットを見て選択すること。

| ソケットタイプ | ソケット |
|:-:|:-:|
| b-key | Socket2 | 
| m-key | Socket3 |
| b&m-key | Socket2, Socket3の両方  | 


### インターフェイス
まとめるのが難しい...。
初期のM.2 SSDはSATA接続が主流だったが、PCIe接続で認識するNVMeが登場(新しいものはNVMeと思っていいんじゃないか？)。
NVMeはCPU並みに発熱するのでヒートシンクが必須と思ったほうが良い。


# 関連
## Windows OSのボリュームサイズの上限
簡潔にまとめるとMBRとGPTで作成可能なボリュームサイズの上限が異なる

| 項目 | MBR | GPT |
|:-:|:-:|:-:|
| 互換性 | ✖ | Windows Vista以降 |
| UEFI対応 | ✖ | ○ |
| 領域の上限 |  2TiB  | 上限なし |
| 作成可能なパーティション数 | 4 | 128 |

データボリュームはとりあえずGPTでパーティションを作っておけばOK。

## NVMeとは
NVMeはNon-Volatile Memory Expressの略語になり、不揮発性メモリを使用したストレージ (=SSD) のための規格になります。


# 参考
https://pctrouble.net/storage/mbr_gpt.html

https://www.paltek.co.jp/techblog/techinfo/220218_01

https://www.buffalo.jp/topics/knowledge/detail/m2ssd.html