OmniAICreator/Qiita-1.07M huggingface dataset:
Railsのassert_templateとassert_selectの使い方メモ

# はじめに
Railsチュートリアルを進めている中でassert_templateとassert_selectの二つのメソッドについて一旦自分なりにまとめておきたいので記事にします。


# assert_templateメソッドについて

レスポンスが正しいテンプレートとレイアウトを描画していることを検証する。

/users/new.html.erbが描画されているかどうかを検証する

```rb
assert_template 'users/new'
```
assert_templateについてまだあるようなのですが現時点では理解しずらいと感じたため今後追記します。


# assert_selectメソッドについて
アクション実行の結果として描写されるHTMLの内容を検証する。
また、HTML要素内にキーが存在することを主張することで、 リクエストに対するレスポンスとなるビューの内容をテストする事が出来る。
<br>

##### assert_selectには2つの書式がある。

1. assert_select(セレクタ, [条件], [メッセージ])という書式は、セレクタで指定された要素が条件に一致することを主張する。セレクタにはCSSセレクタの式（文字列）や代入値を持つ式を使える。

2. assert_select(要素, セレクタ, [条件], [メッセージ]) は、選択されたすべての要素が条件に一致することを主張する。選択される要素は、element (Nokogiri::XML::Node or Nokogiri::XML::NodeSetのインスタンス) からその子孫要素までの範囲から選択される。

<br>

```rb
# title要素が存在するかどうか
assert_select 'title'

# title要素にこんにちはと存在するかどうか
assert_select 'title', "こんにちは"

# div要素にid="hello"が存在するかどうか
assert_select 'div#hello'

# div要素にclass="goodbye"が存在するかどうか
assert_select 'div.goodbye' 

# header要素にid="head-wrapper"が2つあるのかどうか
assert_select 'header#head-wrapper', count:2

#　名前付きルート（例えば/login）へのリンクがあるのか
assert_select "a[href=?]", login_path

# 名前付きルート（例えば/login）へのリンクが0なのか
assert_select "a[href=?]", login_path, 0

# ネストした文法、h1タグの内側にある、gravatarクラス付きのimgタグがあるかどうか
assert_select 'h1>img.gravatar'
```



より詳しくテストするために、ネストしたassert_selectブロックを用いることもできます。

外側のassert_selectで選択しているul.headerとういう要素に対して、内側のassert_selectでli.headの文字列であるヘッダーがあるのかを検証する。

```rb:sample_test.rb
# ul.header内のli.headの文字列"ヘッダー"が存在するのか
assert_select "ul.header" do
  assert_select 'li.head', "ヘッダー"
end
```

```html:sample.html.erb
<!-- テストが通るビューファイル -->
<ul class=header>
   <li class="top">トップ</li>
   <li class="head">ヘッダー</li>
</ul>
```

assert_selectについてもまだあるみたいなのですがいまいち理解ができないのでRailsチュートリアルを進めながら理解できそうな時点で改めて記事を更新したいと思います。

#最後に
一時的にでも記事としてまとめることによって理解が深まると共に気分転換になりました。

間違いなどがあればご指摘などいただけると幸いです。
【Rails】 パンくずリストとは

##パンくずリストとは
ユーザーがサイトを使用する際、自分が今サイトのどの場所にいるのかというのをわかりやすくするための表示のことを「パンくずリスト」と言う。よくサイトの上部に見かける。

パンくずの語源は童話「ヘンゼルとグレーテル」から来ていて、今回使う``gretel``というgemの名前はこの「グレーテル」から名付けられている
[![Image from Gyazo](https://i.gyazo.com/35281fee16cc8936e1c39a067c5d53ee.png)](https://gyazo.com/35281fee16cc8936e1c39a067c5d53ee)

##gemをインストール
まずは``Gemfile``にgemを記入しインストール。

```Gemfile
gem 'gretel'
#記入後 bundle install
```

次にターミナルにて実行コマンドを入力。

```ターミナル
rails g gretel:install
# 下のコードが出力されていればインストール成功
Running via Spring preloader in process 29890
      create  config/breadcrumbs.rb
```

``config``フォルダに``breadcrumbs.rb``が作成されていればOK。

##設定ファイルの編集
先ほどのコマンドで作成された``config/breadcrumbs.rb``ファイルを編集していく。このファイルはパンくずリストとして表示されるそれぞれのパンくずを設定するファイルになる。

```config/breadcrumbs.rb
crumb :root do
  link "Home", root_path
end

#デフォルトでは上記のような記入がある。
crumb "ページ名" do
  link "ビューに表示される名前", "リンクされるURL"
  parent :親のページ名（現在の前のページ）
end
```

``ページ名``はここで設定したパンくずの名前。
他のパンくず設定で親を定義するときや、ビューファイルでパンくずを呼び出す際の名前。

``link``の部分ではパンくずリストに表示されるテキストとリンク先を設定する。

``parent``の部分では現在ここで作ったページの親ページは何かを設定する。

[![Image from Gyazo](https://i.gyazo.com/5c71d957e2e1e562e35dbbcbef47f7bd.png)](https://gyazo.com/5c71d957e2e1e562e35dbbcbef47f7bd)

例えば上記のようにアイコンを入れることもできる。

```config/breadcrumbs.rb
crumb :admin_dashboard do
  link '<i class="fa fa-dashboard"></i> Home'.html_safe, admin_dashboard_path
end

crumb :admin_tags do
  link 'タグ',admin_tags_path
  parent :admin_dashboard
end

crumb :edit_admin_tag do |tag|
  link 'タグ編集',edit_admin_tag_path(tag)
  parent :admin_tags
end
```

この``タグ編集``ページは最後の階層のページとなるので、リンクの部分の注意が必要。
最後の階層のページゆえ、現在のページの名前だけ表示されれば良いのでリンクは必要ない。

##ビューファイルを編集
作成した設定ファイルをビューファイルで呼び出す記述をしていく。パンくずリストを表示させたい箇所に下記のコードを記述。

全ページで区切り文字を共通化するために、``application.html.erb``ファイルにて記述する。区切り文字とは「Home > タグ > タグ編集」の``>``に該当する。

```app/views/layouts/application.html.rb
<body>
    <%= breadcrumbs separator: 区切り文字 %> 
</body>
```

この時、``<``や``&``などはHTMLタグと認識されてしまったり、表示したい文字として認識されず表示されない場合がある。``&``で始まり``;``で終わる書き方(特殊文字)で、その中に表示させたい文字に対応するコードを記述する必要がある。

```app/views/layouts/application.html.rb
<body>
    <%= breadcrumbs separator: " &rsaquo; " %>　#「>」は&rsaquo;と表記する
</body>
```

各ビューファイルに指定する場合は、下記のように記述する。

```rb
<% breadcrumb :設定したcrumb名 %>
```

##参考記事
[【Rails】 gretelを使ってパンくずリストを作成しよう](https://pikawaka.com/rails/gretel)
selectメソッドとそれに関するメソッドの解説

「collectメソッドと同じメソッドを選べ」という問題は頻出なので、この際にまとめようとおもいます

## selectメソッド
selectメソッドは、調べたブロックが真であった場合、その要素を返すメソッドです。
真であるものがなかったら、空の配列が返ってきます
```
(1..10).select {|i| i % 2 == 0 }
=> [2, 4, 6, 8, 10]

[3, 5, 7, 9].select {|i| i % 2 == 0 }
=> []
```
### 似てるけど、違うメソッド
#### rejectメソッド
rejectメソッドは、調べたブロックの中で、偽であった要素を返すメソッドです。
偽であるものがなかったら、空の配列が返ってきます
```
(1..10).reject { |i| i % 2 == 0 }
=> [1, 3, 5, 7, 9]

[2, 4, 6].reject { |i| i % 2 == 0 }
=> []
```

#### grepメソッド
条件に一致した要素を配列で返します。条件に一致した要素がなかった場合、空の配列が返ってきます。
参考資料にも書いてある通り、grepメソッドは正規表現やブロックなども評価できるんです。
```
["hoge", "bazz", "str"].grep(/[b|h]/)
=> ["hoge", "bazz"]

(1..10).grep 1..3
=> [1, 2, 3]
```
#### grep_vメソッド
grepメソッドの逆ですね。

```
["hoge", "bazz", "str"].grep_v(/[b|h]/)
=> ["str"]

(1..10).grep_v 1..3
=> [4, 5, 6, 7, 8, 9, 10]
```

## detectメソッド
findメソッドと同一のメソッドです。名前の通り、条件に一致した最初の要素を取り出すメソッドです。

```
(1..10).detect {|i| i % 3 == 0 }
=> 3

(1..10).find {|i| i % 3 == 0 }
=> 3
```

## mapメソッド
要素の数だけブロックの処理を行い、配列で処理を返します
collectメソッドと同じ処理をします

```
(1..10).map {|i| i % 3 == 0 }
=> [false, false, true, false, false, true, false, false, true, false]

(1..10).collect {|i| i % 3 == 0 }
=> [false, false, true, false, false, true, false, false, true, false]

(1..4).map {|i| i * 2}
=> [2, 4, 6, 8]

(1..4).collect {|i| i * 2}
=> [2, 4, 6, 8]
```

## 実際に問題を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/bd988fd3-0e88-bfe4-d65f-c65260f4a497.png)

今回の選択肢でいえば、collectと同じなのは、mapメソッドでしたね。
なので、選択肢➃が正解になります。

rubyは同じ動作をするメソッドでも複数の書き方があるみたいですね。

【参考資料】

https://docs.ruby-lang.org/ja/latest/class/Enumerable.html

https://www.rubyguides.com/2018/10/grep-method-with-examples/

https://style.potepan.com/articles/28033.html#finddetect

https://qiita.com/natsume/items/0bfd7c34b8383e25ee8f
40日で統計検定2級に合格した話

40日で統計検定2級に合格したので、試験勉強の方法などを振り返りまとめてみました。
これから本試験に挑戦するみなさんの参考になれば幸いです。
ちなみに本稿は人生初の記事です。

# 受験目的
<del>上から「DXよろしく！」と言われたため。</del>

AIやデータサイエンス分野に興味があり、ゆくゆくは自社でそれらの技術を応用したものを作りたいと考えたため。

# 私のスペック(2022年02月当時)
* 社会人
* 修士(工学)
    * 電気系の専攻
    * 統計の授業は受けたことない
* 組み込み～クラウドまでやるなんでもエンジニア
    * 業務では統計や機械学習は使用していない
* 下記の関連分野の資格を所持
    * 統計検定3級
        * ゆとり世代なので統計分野は高校ではやってません。なので3級から取りました。
    * データサイエンス検定リテラシーレベル
    * G検定


# 使用教材


* [統計の時間](https://bellcurve.jp/statistics/course/)
統計検定2級の範囲がほぼ網羅できます。
3級の範囲（高校レベル）の復習をするのにも便利です。
過去問の解説も載っていて、取れなくても問題ない難問かどうかもわかります。

* [ヨビノリさんの動画（確率統計学）](https://youtube.com/playlist?list=PLDJfzGjtVLHmx7qMP410-9gx0weC9d90X)
確率統計の内容がわかりやすくまとまっており、理解の助けになりました。

* とけたろうさんの[動画](https://youtube.com/playlist?list=PL42v8FcrspQZd9Ob3QZN97IEEvF9dWdXZ)、[チートシート](https://toketarou.com/cheatsheet/)
理解が難しい分野の動画を見たりしました。
統計検定2級の範囲はとけたろうさんの動画でほぼ網羅できると思います。

* [完全独習 統計学入門](https://www.amazon.co.jp/%E5%AE%8C%E5%85%A8%E7%8B%AC%E7%BF%92-%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%85%A5%E9%96%80-%E5%B0%8F%E5%B3%B6-%E5%AF%9B%E4%B9%8B/dp/4478820090/)
いわゆる青本。
数式を使わない易しい内容
私が読むときには大体本書の内容はわかっている状態だったので、流し読みしました。
統計の時間で数式アレルギー反応が出てしまった人におすすめ！

* [統計学入門（基礎統計学Ⅰ）](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E5%AD%A6%E5%85%A5%E9%96%80-%E5%9F%BA%E7%A4%8E%E7%B5%B1%E8%A8%88%E5%AD%A6%E2%85%A0-%E6%9D%B1%E4%BA%AC%E5%A4%A7%E5%AD%A6%E6%95%99%E9%A4%8A%E5%AD%A6%E9%83%A8%E7%B5%B1%E8%A8%88%E5%AD%A6%E6%95%99%E5%AE%A4/dp/4130420658/)
いわゆる赤本
大学の授業で使われるとの噂を聞いてましたが、噂通り大学の教科書レベルの内容。
統計学の基礎の位置付けであるため、高校数学がわかっていれば読み解けます。
数式も証明もバッチリ出てくるため、高校数学があまり理解できていない場合はお勧めできませんが、
大学の教科書みたいな本に慣れている方にはオススメします。

* [統計検定のための、Rの出力結果からわかること（回帰分析編）](https://qiita.com/saka212/items/8c74854171775e5d5273)
上記の教材では解説のない「統計ソフトウェア」の範囲の学習に使用しました。
学習というか、出力結果の読み方を確認したという表現が適切ですね。

* [日本統計学会公式認定 統計検定 2級 公式問題集[2017〜2019年]](https://www.amazon.co.jp/%E6%97%A5%E6%9C%AC%E7%B5%B1%E8%A8%88%E5%AD%A6%E4%BC%9A%E5%85%AC%E5%BC%8F%E8%AA%8D%E5%AE%9A-%E7%B5%B1%E8%A8%88%E6%A4%9C%E5%AE%9A-2%E7%B4%9A-%E5%85%AC%E5%BC%8F%E5%95%8F%E9%A1%8C%E9%9B%86-2017%E3%80%9C2019%E5%B9%B4/dp/4788925524/)
公式問題集です。
~~過去4回分は[公式で公開](https://www.toukei-kentei.jp/prepare/kakomon/)されているのでなくてもいいです。~~ 
(2023/04/20)公式での過去問の公開数がいつの間にか減ってました。
過去問題集があった方がいいかもしれません。

# 費用
公式問題集はブックオフで1200円で買いました。
メルカリでも高めに売れるので買っちゃっていいと思います。
青本、赤本は図書館で借りたので0円です。

# 勉強方法

1. 統計の時間 を1周読む
2. 過去問を１回分解く
3. 全然わからなかったので、統計の時間、各書籍・動画で区間推定や検定を重点的に学習する
4. 過去問を解く
5. 間違えた部分を復習、解きなおし
6. 理解が不足している分野は各教材で補完
7. 4~6を繰り返す

学習時間はざっくり見積もってこんな感じです。
前半の10日間: 15分/日
中盤の20日間: 30分/日
後半の10日間: 1時間/日
合計: 22.5時間

[みんチャレ](https://minchalle.com/)というアプリを用いて学習の習慣化に努めました。
「1人では続かないので同じ目標を持った仲間がほしい！」という方にはオススメです。
メンバーのみんな、ありがとう！

# 試験結果と所感
本稿タイトルの通り合格です。
![FK9jZVCUUAIOiDu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303978/d924817b-8f8b-78cd-af1b-64039beafe71.png)


全問解いてちょうど90分で見直しはできませんでした。
受験時は初見の過去問で正答率60%にギリ届かないレベルです。

3級範囲の派生は必ず取るようにして、
区間推定や検定はよく理解しておくといいと思います。

公式を暗記するより、原理、原則、定理、性質を理解することをお勧めします。（そりゃそうです）

統計検定は成績優秀者の表彰のため、難問をいくつか出すみたいです。
なので、過去問演習の段階から難問には固執しないようにするのがオススメです。


# まとめ
40日で統計検定2級に合格した方法を書き記しました。
統計は仮説を立てて検証（検定）する点が難しくもあり面白かったです。
これから受験する皆様の参考になれば幸いです。
[UE4] Blackboardを使うときのミスを防止する

# はじめに
Blackboardを使うときにミスをやらかして原因を突き止めるのに苦労したことから、何とかミスをなくしてみようと思い考えた方法を共有します。
自分がやらかしたのは、これまで正常に動作していたBlackboardが、いろいろ修正しているうちに、Blackboardで定義している変数名の末尾に半角スペースが紛れ込んでいたために更新できなくなったというものでした。
こんなの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/07d8fb6a-93af-1a2d-25a6-207b77af8282.png)
見た目ではわからず全然見当違いのところを追ってしまい、原因を突き止めるのに時間がかかってしまいました。

# 環境
Windows10
UnrealEngine 4.27.2

# どのように対策したか？
以下の2点を実行することで、ミスをなくす、あるいはミスしてもすぐに気が付けるようになりました(なったはず)。
・BPからBlackboardの変数にアクセスするときは必ずマクロを経由する
・マクロは自動テストで問題がないことを確認する
今のところBlackboardで定義している変数が少ないので問題ないですが、変数が多くなると運用が難しくなるかもしれません。

# マクロの作成例
・変数IsJumpingに値を設定するマクロ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/4f55f01f-de9c-0d82-1167-90a26582526f.png)
・変数IsJumpingから値を取得するマクロ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/09c3795f-b004-e2e1-b5c2-d87a2c4b9fa8.png)
・マクロを使用して変数IsJumpingから値を取得、設定する例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/9917ba54-bf3b-ee08-f70b-cd75b52d7dff.png)

# 自動テストの作成例
・テストの準備でBlackboardを用意しているところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/a4edd54e-10e3-62a0-916c-ebbd30204843.png)
・変数IsJumpingに値を設定、そのあと値を取得して一致していなかったらFail
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/8026b4f9-6332-332a-2ff2-794c0107bda0.png)
・変数名の末尾に半角スペースが入っていた場合。エラーで検出できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/4cd6bf76-5f77-26f0-8bd9-222da5547360.png)
・変数名を修正したらPassします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/78eafb6f-0109-a253-6efe-2557412b15b0.png)

# 参考資料
・[自動化システムの概要](https://docs.unrealengine.com/4.27/ja/TestingAndOptimization/Automation/)
自動化テストの公式ドキュメントです。

・[20年オヤジのUnreal Engine 4 TIPS](https://techblog.sega.jp/entry/2018/11/26/100000)
こちらの記事にあった定数マクロライブラリを作成して使っています。BPの見た目がわかりやすくなったような気がします。
円周上の扱いについて-ABC214 C問題(python)-

#C - Distribution

ABC214C問題では、

条件は
・N人が円周上に並んでいる
・円周上の人は時刻Tに宝石をもらう
・宝石をもらってからS時間後に、円周の隣の人に宝石を渡す
となります。
このため、円周上の人が最初に宝石をもらう時刻は、
"時刻Tに宝石をもらう"か"前の人が宝石をもらった時刻+前の人の時刻S"
のいずれかになります。

次に考えなくてはならないのがスタート位置です。円周上の人は円周の前の人から宝石をもらうので、宝石をもらう時刻は円周の前の人の影響を受けます。
便宜上、円周上のn番目の人を考えてみます。n-1番目の人が宝石をもらった時刻というのは、
Ti+Si+T(i+1)+S(i+1)・・・T(n-1)と考えられます。n-1番目の人の影響を受ける場合というのは、
Ti+Si+T(i+1)+S(i+1)・・・T(n-1)<Tnとなる時です。
即ち、Tが最も小さい人をスタート位置にすると前の人の影響を受けないと考えました。

また、今回円周を配列として扱います。配列の最後の番号はN-1なので、配列の番号であるkの値がNになった時、k＝0とすることで円の問題に対応しました。

以上のことを踏まえ実装すると以下の様になります。

```
N=int(input())
S=list(map(int,input().split()))
T=list(map(int,input().split()))
T1=min(T)
k=T.index(T1)
ans=[0]*N
time=0
count=0

while(N>count):
    if k==N:
        k=0
    if T[k]<time or count==0:
        time=T[k]
    ans[k]=time
    time=time+S[k]
    k+=1
    count+=1
for p in range(N):
    print(ans[p])
```
PDFをダウンロードしないでビューアで開いてほしい

こんにちは！

pdfのリンクをクリックすると、ブラウザのビューアが開かずにダウンロードされるやつってありますよね。
ちょっと見たいだけのときだと、いらないファイルが増えてしまって困ったりします。

これは、相手のサーバーが`Content-Disposition:`ヘッダーに`attachment`を書いてるせいかもしれません。
`attachment`はブラウザに「このファイルはダウンロードしてね」と伝えるもので、勿論これが書いてたらブラウザも従います。

いいや俺は強制で全部ビューアで開いてほしいね！、って時は[ここの回答](https://superuser.com/questions/692168/disable-content-disposition-attachment-and-force-inline-display)にありますが、それ専用の拡張機能があるようです。

https://chrome.google.com/webstore/detail/undisposition-racle-fork/bbppejejjfancffmhncgkhjdaikdgagc?hl=en


ありがとうございました。
【React】カスタムフックについて

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##カスタムフックについて

###カスタムフックとは
カスタムフックとは、複数のコンポーネントに共通する処理を取り出して作成した関数のことです。
use〇〇という名前で作成します。

### カスタムフックの例

カスタムフックを作成

```UseFechData.jsx
import { useState, useEffect } from 'react';

const useFetchData = (url) => {
  const [data, setData] = useState([]);
  useEffect(() => {
    const fetchPost = async () => {
      const response = await fetch(url);
      const data = await response.json();
      setData(data);
    };
    fetchPost();
  }, [url]);
  return { data };
};

export default useFetchData;
```

カスタムフックを使用

```User.jsx
import useFetchData from '../hooks/useFetchData';

const User = () => {
  const { data } = useFetchData('https://jsonplaceholder.typicode.com/users');

  return (
    <div>
      <h1>ユーザ一覧</h1>
      <ul>
        {data.map((user) => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
};

export default User;

```
Rails 7でテーブルカラムの型不一致による外部キー追加エラーが発生した場合の解決方法

## はじめに

ローカル環境で `db:migrate` を実行したところ、突然以下のエラーが発生しました :thinking: 

```
Column `application_id` on table `oauth_access_grants` does not match column `id` on `oauth_applications`, which has type `bigint(20)`. To resolve this issue, change the type of the `application_id` column on `oauth_access_grants` to be :bigint. (For example `t.bigint :application_id`).
Original message: Mysql2::Error: Cannot add foreign key constraint
```

#### 日本語訳

```
テーブル `oauth_access_grants` の `application_id` カラムは `oauth_applications` の `id` カラムと一致しません。この問題を解決するには、`oauth_access_grants` の `application_id` カラムの型を :bigint 型に変更します。(例: `t.bigint :application_id`).
元のメッセージ Mysql2::Error: 外部キー制約を追加できません
```

## 検証環境

- Rails 7.0.2
- MySQL 5.7.30
- Gem
    - doorkeeper 5.5.4

## 調べてみた

２つのテーブルのマイグレーションは以下のように定義されています

```ruby
    create_table :oauth_applications, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
      t.string  :name,    null: false
      t.string  :uid,     null: false
      t.string  :secret,  null: false

      # Remove `null: false` if you are planning to use grant flows
      # that doesn't require redirect URI to be used during authorization
      # like Client Credentials flow or Resource Owner Password.
      t.text    :redirect_uri, size: :medium, null: false
      t.string  :scopes,       null: false, default: ''
      t.boolean :confidential, null: false, default: true
      t.timestamps             null: false
    end

    add_index :oauth_applications, :uid, unique: true

    create_table :oauth_access_grants, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4", force: :cascade do |t|
      t.references :resource_owner,  null: false
      t.references :application,     null: false
      t.string   :token,             null: false
      t.integer  :expires_in,        null: false
      t.text     :redirect_uri, size: :medium, null: false
      t.datetime :created_at,        null: false
      t.datetime :revoked_at
      t.string   :scopes,            null: false, default: ''
    end
```

実際のテーブルを確認してみると `oauth_applications.id` カラムの型は `bigint`、`oauth_access_grants.application_id` の型は`int` で作成されていた。それはおかしい！

Doorkeeper側で何か変更があったのか調べてみたのですがそれらしい情報が見当たらない。はて、これはいったい・・・。

## 原因

[Rails 7.0.1](https://github.com/rails/rails/blob/7-0-stable/activerecord/CHANGELOG.md) に入っていたこれが原因でした。

```
Fix migration compatibility to create SQLite references/belongs_to column as integer when migration version is 6.0.

Reference/belongs_to in migrations with version 6.0 were creating columns as bigint instead of integer for the SQLite Adapter.

Marcelo Lauxen
```

https://github.com/rails/rails/pull/43295

migration version 6.0 が指定されている場合、 references指定で作成される型が bigint から int 型に変更されていました。これの影響で型の不一致が発生していました。


## 解決策

対象のマイグレーションファイルのmigartion versionを 6.0 から 6.1 に変更すれば `db:migrate` が正常に通るようになります! :tada: 

```diff
- class CreateDoorkeeperTables < ActiveRecord::Migration[6.0]
+ class CreateDoorkeeperTables < ActiveRecord::Migration[6.1]
```

## まとめ

過去にも何回かマイグレーションが通らない問題にぶつかった時も Rails のバージョンアップだったので、メジャーバージョンアップ時は一度はマイグレーションを実行してみようという学びを得ました。
iOS yuv videoRangeからyuv full rangeに変換する

h.264動画でmetal処理するときよくyuv video rangeの動画がきていて、 full rang + rgb変換しないと処理できないので、knowhowとして残したいと思ってます。


## 方法1

自前でmetal変換

``` c++
fragment float4 yuvVideoRangeToRGBFragmentShader(ColorInOut in [[ stage_in ]],
                               texture2d<float> baseYTexture [[ texture(0) ]],
                               texture2d<float> baseCbCrTexture [[ texture(1) ]]) {
   constexpr sampler colorSampler;
   const float4x4 ycbcrToRGBTransform = float4x4(
       float4(+1.0000f, +1.0000f, +1.0000f, +0.0000f),
       float4(+0.0000f, -0.3441f, +1.7720f, +0.0000f),
       float4(+1.4020f, -0.7141f, +0.0000f, +0.0000f),
       float4(-0.7010f, +0.5291f, -0.8860f, +1.0000f)
   );
   float4 baseYUVColor = float4(baseYTexture.sample(colorSampler, in.texCoords).r,
                                baseCbCrTexture.sample(colorSampler, in.texCoords).rg,
                                1.0f);
   // yuv video range to full range
   baseYUVColor.r = (baseYUVColor.r - (16.0f/255.0f)) * (255.0f/(235.0f-16.0f));
   baseYUVColor.g = (baseYUVColor.g - (16.0f/255.0f)) * (255.0f/(240.0f-16.0f));
   baseYUVColor.b = (baseYUVColor.b - (16.0f/255.0f)) * (255.0f/(240.0f-16.0f));


   // yuv to rgb
   float4 baseColor = ycbcrToRGBTransform * baseYUVColor;
 
   return baseColor;
}
```


## 方法2

AVAssetReaderTrackOutputのoutputSettingsでfull rangeに指定して、iOS側が変換してくれる

kCVPixelFormatType_420YpCbCr8BiPlanarFullRange は yuv full rangeで、
rgb直欲しい場合はkCVPixelFormatType_32BGRAしてすればいい。

``` swift
 let outputSettings: [String: Any] = [
       // full rangeに指定
         kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,
         kCVPixelBufferMetalCompatibilityKey as String: true
       ]

let output = AVAssetReaderTrackOutput(track: asset.tracks(withMediaType: AVMediaType.video)[0], outputSettings: outputSettings)

```


## おわり

方法1のほうがパフォーマンスとしていいが、方法２はOS側処理してくれるので、楽ではあるが、ほかの処理入れたいときにはパフォーマンスちょっと落ちる。


# おまけ 

## hevc with aplha処理

hevc with aplha動画のpixelFormatがkCVPixelFormatType_420YpCbCr8VideoRange_8A_TriPlanarになっていて、
コードのコメント見るとyuv部分はvideo rangeだが、alpha部分はfull rangeなので、
処理するときは要注意。


kCVPixelFormatType_420YpCbCr8VideoRange_8A_TriPlanarソースのコメント:
/* first and second planes as per 420YpCbCr8BiPlanarVideoRange (420v), alpha 8 bits in third plane full-range.  No CVPlanarPixelBufferInfo struct. */

参考:
https://developer.apple.com/documentation/corevideo/kcvpixelformattype_420ypcbcr8biplanarvideorange
https://developer.apple.com/documentation/corevideo/kcvpixelformattype_420ypcbcr8biplanarfullrange
https://developer.apple.com/documentation/corevideo/kcvpixelformattype_32bgra
reactの勉強の備忘録①

#＃前書き
どうもグッピーです！今日からoreillyのreact ハンズオンラーニングの勉強をしていくので、その備忘録を書いていきたいと思います。~~役に立たないと思いますが~~みていただけると嬉しいです！

##スコープについて
スコープとは、定義した変数の有効範囲を指定するもののことですね。スコープには次のような役割があります。

**・変数名の競合を避ける**
JavaScriptでは関数やブロックごとに別々のスコープが作られるので、プログラム内で同じ名前の変数があってもスコープが違えば別物となるそうです。
**・メモリの消費を避ける**
もしスコープがなければ全ての変数がグローバル(どこでも使えるという意味)になるので、メモリがあり得ないくらい消費されます。

###スコープの種類

```
|--グローバルスコープ
|
|--ローカルスコープ---関数スコープ
|      |
       |----------ブロックスコープ
```

####グローバルスコープ
プログラム全体のどこからでもアクセス可能にできるスコープです。

####ローカルスコープ
グローバル変数以外の全ての変数は、ローカルスコープを持つローカル変数です。


####関数スコープ
function(関数)ごとに作られるスコープのこと。var,let,constのいずれかで変数宣言をすると、関数の外部からはアクセスできず、関数の内側からのみ利用可能なローカル変数になります。

例(これからの例はCodeGrid様のサイトから引用)
```
function fn(arg) {
  // fn関数の関数スコープを持つローカル変数を定義
  var scope = 'local';
  // fn関数のスコープ内のためアクセス可能
  console.log(scope); //　-> local
  console.log(arg); //　-> argument
}
fn('argument');

// 関数スコープの外側からはローカル変数や仮引数にアクセスできない
console.log(scope); // -> ReferenceError
console.log(arg); // -> ReferenceError
```

####ブロックスコープ
ブロック({})ごとに作られるスコープのことを、ブロックスコープという。また、ブロックスコープを生成するのはletとconstのみです。

```
function fn() {
  // for文のブロックスコープを持つローカル変数 i を定義
  for (let i = 0; i < 3; i++) {
    console.log(i); // -> 0, 1, 2
  }
  // for文のブロックスコープの外側からはアクセスできない
  console.log(i); // -> ReferenceError
}
fn();
```

###テンプレート文字列
文字列に変数を埋め込めるもの。テンプレート文字列は`で囲み、さらに${}のなかに変数を記述できる。











##参考にしたサイト様
https://www.codegrid.net/articles/2017-js-scope-1/#:~:text=JavaScript%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97%E3%81%A8%E3%81%AF,%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82
JsonNaming,JsonProperty,JsonIgnoreを一緒に使ったらどうなるのか試してみた

# はじめに
Spring BootでREST APIを作成しているときに、`@JsonProperty`を一つ一つの変数に付けていた。
`@JsonProperty`は、JavaオブジェクトからJSONへ変換した際に、JSONのプロパティ名を`@JsonProperty`で指定したものに変更できるアノテーションである。
今回は、すべての変数をキャメルケースからスネークケースに変換するために使用していた。
この場合、クラスに`@JsonNaming`を指定するだけでも同様の結果が得られるため、このアノテーションを使用することにした。
変換するクラスの中には、変数名とは異なるプロパティ名にしたいものや、JSON変換から除外したいものがあるクラスもあったため、`@JsonNaming`,`@JsonProperty`,`@JsonIgnore`を一緒に使用した場合についての挙動を念のため確認してみた。
予想では`@JsonNaming`より`@JsonProperty`,`@JsonIgnore`の方が優先されすはず...

# サンプルコード
### 依存関係に必要なもの
サンプル作成時の最新のものを使用しています。
```xml:pom.xml
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.13.1</version>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.22</version>
    <scope>provided</scope>
</dependency>
```
### JSONオブジェクトクラス
```java:MyObject.java
package test;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import lombok.Data;

@Data
// キャメルケースからスネークケースへ
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class MyObject {

	private String userId;

	@JsonProperty("userrrName") // プロパティ名を個別指定
	private String userName;

	@JsonIgnore // JSONに変換しない
	private int age;

}
```
`@JsonNaming`で変換方法の指定方法でJackson 2.12からPropertyNamingStrategyが非推奨になっているため、PropertyNamingStrategiesで指定する必要がある。
`@JsonNaming`の使用方法を紹介した記事でPropertyNamingStrategyが使用されているものもあったので、最新のものを使用する場合は注意が必要。

### メインクラス
```java:JsonEncodeTest.java
package test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JsonEncodeTest {

	public static void main(String[] args) throws JsonProcessingException {

		MyObject myObject = new MyObject();
		myObject.setUserId("ID123456");
		myObject.setUserName("ユーザー名");
		myObject.setAge(20);

        // 整形出力するためSerializationFeature.INDENT_OUTPUTを指定
		ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT);
		String json = mapper.writeValueAsString(myObject);

		System.out.println(json);
	}

}
```

## 実行結果
```console
{
  "user_id" : "ID123456",
  "userrrName" : "ユーザー名"
}
```
予想通りの結果になりました！
もしかしたらと思い確認しましたが予想通りでよかったです。

# 参考資料
- [Jackson 2.12 から、PropertyNamingStrategy.SNAKE_CASE は、非奨励になってた。](https://oboe2uran.hatenablog.com/entry/2021/05/03/224718)
Amazon Timestreamに100年前の過去データを保存できるようになっていた件

AWSのデータベース系サービスの中で、時系列データを扱うために存在しているAmazon Timestream。リリースから1年以上経ちましたが、幾つかのデメリットの存在によって、実サービスでの運用や移行に踏み切れないと叫ばれ続けてきました。

ところが昨年末のAWS re:Invent 2021で発表されたアップデート内容の検証をしていた際、最たるデメリットの一つがしれっと解消されていたことが判明しました。

## 1年以上前の過去データを書き込めなかった
過去の時間に設定したレコードを書き込もうとすると、ある期間を超えたときにエラーになってしまいます。
この"ある期間"というのは、エントリーストレージであるメモリストアにデータを保持しておくための期間のことです。本来は、この期間を過ぎると低速ながらも安価な磁気ストアにデータを自動で移動するためのAmazon Timestream特有の機能です。

ではこの期間を、過去データを書き込むときだけ長くしてしてしまえば書き込めるかと考えましたが、「1時間以上、12ヶ月以下」という制約が存在するため、古くても1年前までの過去データしか書き込めないということになってしまっていました。（図の一番上の設定）


```1年以上前の過去データを書き込もうとした際のエラー
An error occurred (RejectedRecordsException) when calling the WriteRecords operation: One or more records have been rejected. See RejectedRecords for details.
```

仮に1年前までの過去データまでしか使わない、むしろリアルタイムデータしか投入しない運用だとしても、手動でのバックアップやレプリケーション機能のないAmazon Timestreamにとっては、作り直したり迂闊に触ることの適わない厄介なデータストアの評価は免れないでしょう。
一度は構築できたデータソースがあるのに、作り直そうと思ったら過去データが投入できないという縛りを妥協するしかありませんでした。

## 磁気ストアに直接書き込めるようになったことで…！
AWS re:Invent 2021にて、高速で高価なメモリストアを介さずに、最初から低速で安価な磁気ストアに書き込める設定が追加されるという発表がありました。
それまでは、最低でも1時間はメモリストアに保持しておかなければいけなかったため、この設定を有効にすればコスト削減にはなるだろうと思って検証していましたが、
`エントリストレージが磁気ストアになる → 投入できる期間が磁気ストアにデータを保持しておく期間になる`
という事実が判明しました。

磁気ストアに保持しておく期間の設定範囲はというと、「1日以上、200年以下」です。（図の真ん中の設定）
![スクリーンショット 2022-02-09 22.44.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638930/d03802d1-1c19-8f3c-8bd2-b544c51cc46d.png)

試しに、50年前ぐらい（UNIXタイムで1000 = 1970/01/01）の過去データにして書き込んでみたら、問題なく書き込めました。

```過去データの投入コマンド
$ aws timestream-write write-records --database-name Samples --table-name Weather --records "Dimensions=[{Name=area,Value=Osaka}],MeasureName=temperature, MeasureValue=21,MeasureValueType=DOUBLE,Time=1000"
{
    "RecordsIngested": {
        "Total": 1,
        "MemoryStore": 0,
        "MagneticStore": 1
    }
}
```

1970年より前はどうするのかという疑問は残りましたが、少なくとも50年以上前の過去データも書き込めるようになったのは、採用の幅が広がった印象です。


## 関連書籍 （宣伝）
[Amazon Timestream入門 〜時系列データ管理の最適解を求めて〜](https://techbookfest.org/product/6234364427894784?productVariantID=6253532195848192)
【JavaScript関数ドリル】を毎日やる【勉強用】その３




#【JavaScript関数ドリル】初級編のuniq関数の実装のアウトプット



##uniq関数の課題内容


https://youtu.be/Pu5SUb1dMzM

```javascript:uniq関数の挙動
_.uniq([2, 1, 2]);
// => [2, 1]
```
配列内の重複する値のみ取り除き、新たに出力するもの。
##uniq関数に取り組む前の状態

- ２回目でやったwithout関数の時に覚えた`Array.from(new.set(配列))`が使えそうだ
- すぐにできそう

##uniq関数に取り組んだ後の状態

- 初めて数分で実装できた
- 解答のように元の配列は変更していないことの証明もできれば良かった
- 初めにLodashのuniq関数を見たときに、すぐにArray.fromは思いついたが解説のようなfor文は思いつかなかった
- forループと反転if文のincludesの組み合わせがすぐに思いつくようになれば、もっと配列を自在に扱えそうだ
- 短時間でできたのでQiitaの投稿時の装飾について調べられた




##uniq関数の実装コード

```javascript:
const uniq = (array) => {
    const newArray = Array.from(new Set(array));
    return newArray;
};

console.log(uniq([2, 1, 2 ]));
//[2,1]
```

##uniq関数の解答コード

```javascript:
function uniq(array) {
  const uniqArray = [];
  for(let i = 0; i < array.length; i++) {
    const value = array[i];
    if( !uniqArray.includes(value) ) {
      uniqArray.push( value );
    }
  }

  return uniqArray;
}

const numbers = [2, 1, 2];

console.log( uniq(numbers) );
// => [2, 1]

console.log( numbers );
// => [2, 1, 2]
```
Rails：ローカルでのタスクとHerokuの環境設定やDB操作など

## ローカル環境
コンソールの準備

```:terminal
$ rails c
```
タスクの読み込み
これで `schedular.rake` のタスクを利用できる

```:terminal
$ Rails.application.load_tasks
```
タスクの実行

```:terminal
$ Rake::Task['タスク名'].execute
```

## Heroku環境
ログ出力

```:terminal
$ heroku logs -t
```

環境変数の設定

```:terminal
$ heroku config:set　キー="値"
```

環境変数の確認

```:terminal
$ heroku config
```

データベースの情報取得(どのデータベースをaddonで追加するかでも変わる。今回はPostgre)

```:terminal
$ heroku pg:credentials:url --app アプリ名
```

データベースの操作(どのデータベースをaddonで追加するかでも変わる)

```:terminal
$ heroku pg:psql -c SDL文
例） heroku pg:psql -c "select * from users;"
```
LLVM14でEFIアプリケーションをビルドした 

## 驚いたこと

Tripletの一覧に __efi__ とかあるのですっかりそちらに気を取られていたのですが、まさか Windows Executable (or DLL) をネイティブビルドするのとほぼ同じ要領で EFI Application もビルドできるとは。

## やったこと

といってもコンパイルオプションとリンクオプションだけですが。

### コンパイルオプション

`-Oz` とか `-flto` とかの最適化や、`-Wall` `-Werror` `-Wextra` `-pedantic` あたりのオプションは好みに合わせてどうぞ。
必須なのはたぶん `--target` に指定するTripletの __OS__-__ABI__[^1] の部分と `-ffreestanding` と `-nostdlib` あたりかと思います。

[^1]: ABIが未指定だったり変なのを付けてたら、LLVM側で `msvc` を補完してくれるっぽいです。

```shell
$ clang \
  --target=<triplet> \
  -Oz \
  -Wall \
  -Werror \
  -Wextra \
  -c <path-to-source-file> \
  -ffreestanding \
  -flto \
  -fno-builtin \
  -fno-stack-check \
  -fno-stack-protector \
  -fshort-wchar \
  -isystem <path-to-efi-headers> \
  -mno-red-zone \
  -nostdlib \
  -o <path-to-object-file> \
  -pedantic
```

### リンクオプション

意外だった[^2]のが、`-fuse-ld=lld` で `lld` ではなく `lld-link` を自動的に使ってくれること。
最重要ポイントは `-Wl,/subsystem:efi_application` [^3] ですね。

[^2]: `lld-link` を使わせたくて `-fuse-ld=lld-link` と指定すると頓珍漢なエラーが出て「なんじゃこりゃ」ってずっと思ってました。
[^3]: subsystem に windows とか console とかを指定すると普通のWindowsアプリケーションのネイティブビルドになります。

```shell
clang \
  --target=<triplet> \
  -Wl,/dll \
  -Wl,/entry:<name-of-entrypoint-function> \
  -Wl,/nodefaultlib \
  -Wl,/subsystem:efi_application \
  -ffreestanding \
  -flto \
  -fuse-ld=lld \
  -nostdlib
```

## 実演

https://github.com/kei-g/uefi-hello

### 試したTriplet

| Architecture | Triplet |
| - | - |
| x64 | x86_64-pc-windows-msvc |
| arm64 | aarch64-pc-windows-msvc |

## 最後に

今回使用した[clang](https://clang.llvm.org/)の `--version` を載せておきます。

```shell
$ clang --version
Ubuntu clang version 14.0.0-++20220209123220+8344ab9c4f191~exp1~20220209123314.30
Target: x86_64-pc-linux-gnu
Thread model: posix
```
【AWS】 ECSでコンテナのヘルスチェックの欄に書くコマンド

![health.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596144/f745f87f-30db-2824-2463-5889c16682f5.jpeg)


タスク定義で、コンテナの編集のヘルスチェックの欄には下のようなコマンドを書く。mariadbコンテナの場合を例とする。

```
CMD-SHELL,mysqladmin ping -u [mysqlのユーザー名] -p[パスワード] -h 127.0.0.1 || exit 1
```

- `CMD-SHELL` コンテナのデフォルトシェルを開始する(windowsでいうところのコマンドプロンプトを起動する)
- `,` カンマ区切りで複数のコマンドを実行する
- `mysqladmin ping -u [mysqlのユーザー名] -p[パスワード] -h 127.0.0.1`
  - mysqlコンテナとmariadbコンテナの場合、このコマンドが成功すればコンテナが起動している
  - サーバが起動中であるかを確認するコマンド
  - `p`とパスワードの間はスペース不要
  - `127.0.0.1`は自分自身のIPアドレス
- `||` 左のコマンドが失敗したときに右のコマンドを実行する
- `exit 1`終了ステータス1(失敗)でシェルを終了する


参考:
[公式 タスク定義パラメータ](https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task_definition_parameters.html)
[Linuxで「||」を使うとコマンドが失敗したときの動作を決められる](https://eng-entrance.com/linux-basic-or)
[終了ステータスとは？](https://shellscript.sunone.me/exit_status.html)
[Qiita よく使うMySQLコマンド&構文集](https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3)
バイナリファイルってなんだろう

## 勉強前イメージ

lessで開けないファイル・・・

## 調査

### バイナリファイル とは

まずバイナリは0と1で表現される数字のことで
基本的にはコンピュータが実行できる形式をバイナリファイルといいます。

### バイナリの種類

動画や音声、画像などが上げられますが上記で記載したとおり
コンピュータで扱える形式のファイルはすべてバイナリファイルになります。
テキストファイルもバイナリデータになりますが、人間でも理解できるという点でデータの種類を区別し
テキストデータとバイナリデータと呼ばれることが多いです。

## 勉強後イメージ

正直もっといろいろ細かい話かと思ったら
めっちゃ広い話だった....

## 参考

- [バイナリデータとは](https://medium-company.com/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%83%87%E3%83%BC%E3%82%BF/)
- [バイナリ](https://www.weblio.jp/content/%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA)
Nuxt3のサーバフレームワークをKoa.jsに変更する

以前、下記の記事でNuxt.js v2のサーバフレームワークをKoa.jsにする記事を書いたので、今回はそのNuxt3版。
「そんなことしたらせっかくのNitro機能が台無しじゃないか」と言う方も多々いらっしゃるでしょう。はい。すみません。でも全Methodを受け付けてしまうh3なんて要らないっす。しかもPatchは無かった気がする。

https://qiita.com/msquare33/items/22f96e6d24855cbf887b

ソースはこちら。

https://github.com/MichitoIchimaru/nuxt3-app

## フォルダ構成
私はNuxt.jsでPoCを作ったりする時はデフォルトのフォルダ構成ではなく、クライアント（Vue）とサーバ（Koa.jsやExpressなど）のフォルダを分けてソース管理するのが好きなので、こんな感じのフォルダ構成にする事が多い。

```
nuxt3-app
  └─ src
      ├─ client (Vueのソースを格納するフォルダ)
      └─ server (Koa.jsやExpressなどのサーバ機能のソースを格納するフォルダ)
```

## nuxt.config.ts
srcDirとserverMiddlewareを追加する。handlerは"~/src"にしてしまうとsrcDir配下のパスになるので、"~~/src"にする。

``` nuxt.config.ts
import { defineNuxtConfig } from 'nuxt3'

// https://v3.nuxtjs.org/docs/directory-structure/nuxt.config
export default defineNuxtConfig({
    srcDir: "src/client/",
    serverMiddleware: [
        {
            path: "/api",
            handler: "~~/src/server/index.ts"
        }
    ]
})
```

## src/server/index.ts

``` index.ts
import Koa from 'koa'
import Router from 'koa-router'

const app = new Koa()
const router = new Router()

router.get('/', (ctx) => {
    ctx.body = 'Hello World'
})

app.use(router.routes())
app.use(router.allowedMethods())

export default app.callback()
```

これだけで http://localhost:3000/api にアクセスすればkoaが動いてくれるので、後はいつも通りよしなに。
2月10日のコースレビュー

面接の質問：
1.SQL言語は「データクエリ言語DQL、データ操作言語DML、データ定義言語DDL、データ制御言語DCL」4つのカテゴリに分類されます。
2.「論理の消去」、「物理の消去」はどういう意味ですか？
論理の消去：実際には削除されてありません、再度復元できます。
物理の消去：実際の削除されであり、データが見つかりません。
windows上の Jupyer Notebook のUI日本語化

動作環境：windows + Anaconda + Jupyer Notebook

#Jupyer Notebook のUIを日本語にする方法。
管理者権限でPowerShellを開いて下記コマンドを叩く。

```powershell
[System.Environment]::SetEnvironmentVariable("LANG", "ja_JP", "User") 
```
PCを再起動するとJupyer Notebook のUIが日本語になる。

##解説
jupyer notebook は起動時に環境変数LANG読み取る仕様。
そこで、UNIXでいうところの $export LANG="ja_JP"をwindows上で行っている。
windowsからすると無用の環境変数と思われる。

##ソース
https://github.com/jupyter/notebook/tree/5.7.x/notebook/i18n#how-the-language-is-selected-
NestJSの基本的な構成 ~Provider編~

## これはなに？

前回の記事に続いて、今回はProviderについて理解しようと思ったので記事にしました。

この記事が新たにNestJSに入門する方の手助けになれば幸いです。

## この記事のゴール

以下の理解が得られることをゴールとします

- Providerの役割が理解できること

## Providerってなに？

- 名前の通り機能を提供するところ
- Controllerよりも複雑な処理を担う
- 従ってビジネスロジックはProviderに記載する

前回やったControllerは**URIの設計**だったりユーザーからの**リクエストの処理**を担っていましたが、Providerはそのリクエストの具体的な処理を担っています。


※前回の記事はこちら

https://qiita.com/mu-suke08/items/67eef21369eb6edc0fcc

ロジックを記載する場所と認識しても問題ないかと思います。

それほど理解にするのに難しい箇所ではないので使い方に進みます。

## Providerを作成してみる

以下のように書くことでProvider（Service）を作成できます。

```bash
$ nest g s cat
```

しばらくすると`src/cat/cat.service.ts`が作成されていることが確認できると思います。


## 各要素の説明

### `@Injectable()`

```tsx
import { Injectable } from '@nestjs/common'

@Injectable()
export class CatService {}
```

`@Injectable()`と書くことでTypeScriptのクラスをProviderとして認識させることができます。

### ロジックの記載

```ts:cat.interface.ts
export interface Cat {
  readonly name: string
  readonly age: number
}
```

まずcatの型を定義します。
今回は簡単にnameとageを持たせます。

```ts:cat.service.ts
import { Injectable } from '@nestjs/common'
import { Cat } from './cat.interface'

@Injectable()
export class CatsService {
  private readonly cats: Cat[] = []

  create(cat: Cat) {
    this.cats.push(cat)
  }

  findAll(): Cat[] {
    return this.cats
  }
}
```

具体的なロジックはCatService内に記載します。

catsに新しいcatを追加する処理とcatsを取得する処理を書いています。

## Controllerからの呼び出し

```ts:create-cat-request.dto.ts
export interface CreateCatRequest {
  readonly name: string
  readonly age: number
}
```

```ts:cat.controller.ts
@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {}

  @Post()
  async create(@Body() createCatDto: CreateCatDto) {
    this.catsService.create(createCatDto);
  }

  @Get()
  async findAll(): Promise<Cat[]> {
    return this.catsService.findAll();
  }
}
```


実際にNestJSを起動してcurlでcreateCatを叩いてみましょう。

```bash
$ curl -X POST -H "content-type: application/json" -d '{name:"mike", age: "10"}' localhost:3000/cat/createCat
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316760/894ad334-c4c7-2ef9-deb9-20d4edb33359.png" width=640 />

上のスクリーンショットは`http://localhost:3000/cat/getAllCats`でfindAllから取得した全ての猫の情報を表示しています。

実際にcurlで叩いた猫が表示されているのが分かると思います。

## まとめ

- Providerはユーザーから受け取ったリクエストに対して具体的な処理を記載する場所

## 余談

今回は割とスッと理解しやすいものでした。

引き続きNestJSを触っていきたいと思います。

ではまた！

## 参考記事

https://docs.nestjs.com/controllers

https://zenn.dev/kisihara_c/books/nest-officialdoc-jp/viewer/overview-controllers
Logstash Elasticsearch Input PluginのSchedulingで、前のpipelineが終わらなかったらスキップされる？

https://stackoverflow.com/questions/64420859/what-happens-when-a-scheduled-task-didnt-finish-before-next-scheduled-time-star

> The jdbc input sets max_work_threads for the Rufus scheduler to one. If there is no available worker thread then trigger_queue does nothing, so that instance of the job will never be run. It will wait until the next time the queue should be triggered.

「JDBC input pluginではスキップされる」という記載をみました。これでは定期実行を当てにして「6分前～現在を5分毎」などの設定をしていると、filter処理で遅延が生じた場合など次の定期実行までにパイプラインの処理が終わらないとデータの欠損が生じてしまいます。（実際にはJDBC input pluginであれば、[`:sql_last_value`を使う方法が推奨されています](https://www.elastic.co/jp/blog/how-to-keep-elasticsearch-synchronized-with-a-relational-database-using-logstash)。）

Elasticsearch input pluginでどうなるか、試してみました。

環境：
i5-7500K
Windows Pro
pipeline.workers: 4 (logstash.yml)

```config
input {
    elasticsearch {
        hosts => ""
        query => '{"sort": [ "_doc" ] }'
        index => ""
        user => ""
        password => ""
        target => "message"
        schedule => "/5 * * * * *"
    }
}
filter {
    mutate {
        remove_field => "message"
    }
    ruby {
        code => "sleep 10
        event.set('running_time', Time.now.strftime('%Y-%m-%d %H:%M:%S'))
        "
    }

}
output {
    stdout {
        codec => rubydebug {metadata => true}
    }
}
```

```
{
      "@timestamp" => 2022-02-10T11:58:15.225Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:25"
}
{
      "@timestamp" => 2022-02-10T11:58:20.186Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:30"
}
{
      "@timestamp" => 2022-02-10T11:58:25.160Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:35"
}
{
      "@timestamp" => 2022-02-10T11:58:30.132Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:40"
}
{
      "@timestamp" => 2022-02-10T11:58:35.062Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:45"
}
{
      "@timestamp" => 2022-02-10T11:58:40.028Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:50"
}
{
      "@timestamp" => 2022-02-10T11:58:45.273Z,
        "@version" => "1",
    "running_time" => "2022-02-10 20:58:55"
}
```

ちゃんと5秒おきに実行してくれているようです。キューがあふれるなどが無ければ、取りこぼすことなく実行できそうです。
Apache2.4でバーチャルホストの設定中に403が出てハマった


## 概要
引き継いだ案件で同一サーバー内に別サイトを仕込むとのことで、
バーチャルホストの設定をしようとしたら新しいサイトの方が`403`エラーが出てしまうといった内容です。


## 設定内容（失敗の時）

`vhost.conf`には以下のように記載していました。

```bash
#既存サイトの設定
<VirtualHost *:80>
  ServerName hogehoge.com
  DocumentRoot /var/www/html/public
  <Directory /var/www/html/public>
    Options FollowSymlinks Includes
    AllowOverride All
  </Directory>
</VirtualHost>

#今回追加した設定
<VirtualHost *:80>
  ServerName fugafuga.com
  DocumentRoot /home/test_user/public
  <Directory /home/test_user/public>
    Options FollowSymlinks Includes
    AllowOverride All
  </Directory>
</VirtualHost>
```

## 設定内容（OKの時）

```
#既存サイトの設定
<VirtualHost *:80>
  ServerName hogehoge.com
  DocumentRoot /var/www/html/public
  <Directory /var/www/html/public>
    Options FollowSymlinks Includes
    AllowOverride All
  </Directory>
</VirtualHost>

#今回追加した設定
<VirtualHost *:80>
  ServerName fugafuga.com
  DocumentRoot /home/test_user/public
  <Directory /home/test_user/public>
　　Options FollowSymlinks Includes
　　AllowOverride All
　　Require all granted　　　　　　　←追加
  </Directory>
</VirtualHost>
```

## 原因

結論：デフォルトのアクセス制限に引っかかっていた。

## 解説

#### まずデフォルトの設定を見てみます。
/etc/httpd/conf/httpd.conf

```
#
# Deny access to the entirety of your server's filesystem. You must
# explicitly permit access to web content directories in other
# <Directory> blocks below.
#
<Directory />
    AllowOverride none
    Require all denied
</Directory>

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>
```

上記を見ると
`Directory`の`/`配下はデフォルトで`Require all denied`。つまりアクセスを拒否しています。

次に
`Directory`の`/var/www`配下はデフォルトで`Require all granted`。つまりアクセスが許可されています。


#### ということは

以下のどちらかで対応すべきだったということです。
・ドキュメントルートを`/var/www`配下以外に設定する場合は`Require all granted`でアクセス許可してあげる
・新しいサイトのドキュメントルートを`/var/www`配下にする


## 余談
最初は色んな記事を漁っていると「指定しているドキュメントルートまでの権限がないのでは？」というのが多かったです。
なので`/home/test_user/public`のパーミッションを全て確認しましたが、どれも許可されていたので結構時間がかかってしまいました。。

他の記事を見ると`Require all granted`がApache2.4から変わったところだそうなので、以前のバージョンの記述をしてハマっている人もいたようです。

WEBサーバーの知識ももっと取り入れたほうがいいですね。勉強させて頂きました。
JPCERT/CCの「Emotet感染有無確認ツールEmoCheck」を試した

## はじめに

JPCERT/CCから「[Emotet感染有無確認ツールEmoCheck](https://github.com/JPCERTCC/EmoCheck)」というツールが公開されています。
有意義なものなのに、あまり広まっていない気がしたのでこの記事を書きました。
私は今日まで知らなかったです。

## 経緯

2022年2月に入って、日本国内でEmotetの被害が増えているようです。
ググると、誰もが知っているような企業で感染していたりします。

そんな中、JPCERT/CCから注意喚起が公開されていました。
[マルウェアEmotetの感染再拡大に関する注意喚起](https://www.jpcert.or.jp/at/2022/at220006.html)
このページの中で、「Emotet感染有無確認ツールEmoCheck」がリンクされていたので試しました。


## 試してみた

下記からダウンロードします。
※Webページ内にリンクがありますが、念の為。
[Emotet感染有無確認ツールEmoCheck](https://github.com/JPCERTCC/EmoCheck/releases)

ダウンロードしたファイルは、```emocheck_v2.0_x64.exe```でした。
このファイルを実行するだけです。
使い方は、GitHubに書かれています。
[GitHub - JPCERTCC/EmoCheck: Emotet detection tool for Windows OS](https://github.com/JPCERTCC/EmoCheck)

オプション無しでファイルを実行しました。

<img width="50%" alt="ec01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/816860b0-438e-f569-3103-376b24d0cf03.png">

しばらく待ちます。
止まったかと思った・・・。

<img width="50%に" alt="ec02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/a14fef8a-d2ee-f696-1cad-45bf16fb2256.png">

検知されませんでした｡
｢ツールのご利用ありがとうございました｡｣とありますが､
こちらこそ､ツールの提供ありがとうございますです｡

実行と同時に､ログも保存されます。
実行ファイルと同じパスに保存されています。
ファイル名は、「マシン名_日時_emocheck.txt」です。

ファイルの内容は、下記です。
検知されなかったので、特に情報はないです。

```
[EmoCheck v2.0]
プログラム実行時刻: 2022-02-10 20:20:16
____________________________________________________

[結果]
検知しませんでした。
```

もし検知された場合は、[Emotet感染相談センター](https://cybersecurity-info.com/emotet-center/)あたりへ相談でしょうかね。

## 参考リンク

- JPCERT/CC
    - [JPCERT コーディネーションセンター](https://www.jpcert.or.jp/)
    - [マルウェアEmotetの感染再拡大に関する注意喚起](https://www.jpcert.or.jp/at/2022/at220006.html)
    - [GitHub - JPCERTCC/EmoCheck: Emotet detection tool for Windows OS](https://github.com/JPCERTCC/EmoCheck)
    - [EmoCheckのある場所](https://github.com/JPCERTCC/EmoCheck/releases)
- サイバーセキュリティ総研
    - [日本のセキュリティ水準を高めるメディア|サイバーセキュリティ総研](https://cybersecurity-info.com/)
    - [Emotet感染相談センター](https://cybersecurity-info.com/emotet-center/)

## 最後に

有意義なツールでしたが､知らなかったのは､私だけでしょうか?
これで検知されず放置されたPCが1台でも減ることを祈ります｡
【C#】0.1を1000回足すと100.0にならない件

#どういうこと？
下記のソースコードを実行するとなぜか結果は`100`になりません。

```C#:0.1を1000回足す(double)
double sumData = 0;

for (int i = 1; i <= 1000; i++)
{
    //0.1を1000回足す！
    sumData += 0.1;
}

Console.WriteLine(sumData);
//出力：99.9999999999986
```
**↓結果↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/90c66452-67a6-9c34-5a73-bab9fc4d5e42.png)

# なんで？
参考にしたサイトがとても分かりやすく解説されているのでそのまま引用します。
>SingleやDoubleのような浮動小数点数型は、値を2進数で格納しています。しかし、ほとんどの10進数の小数は2進数で表現することができません。そのためこのような値はSingleやDouble型では近似値でしか表現することができず、その誤差が上記のような非常識的な計算結果として現れます。
>>[引用：小数（浮動小数点数型）の計算が思った結果にならない理由と解決法](https://dobon.net/vb/dotnet/beginner/floatingpointerror.html#section1)

...(´ε｀ )ふぅん(今まで実装してきたソフト大丈夫かな...)

# どうすんの？
`Decimal型`を使います。
上記で引用したサイトがこれまた分かりやすくされているのでそのまま引用します。
>10進数の小数を2進数に変換するときの丸め誤差をなくすには、SingleやDouble型の代わりにDecimal型を使用します。Decimal型は10進数の小数でも正確に表現することができます。
>>[引用：小数（浮動小数点数型）の計算が思った結果にならない理由と解決法](https://dobon.net/vb/dotnet/beginner/floatingpointerror.html#section4)

ということでソースコードの`sumData`変数を`Decimal`型にして再度試してみました。

```C#:0.1を1000回足す(decimal)
decimal sumData = 0;

for (int i = 1; i <= 1000; i++)
{
    //0.1を1000回足す！
    sumData += (decimal)0.1;
}

Console.WriteLine(sumData);
//出力：100.0
```
**↓結果↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519245/d4e4de50-0ad2-3b56-7109-b273d8d99039.png)

# どっち使えばいいの？
- 基本的には`double`型を使います。
- お金などが関わっている場合(勘定ソフトや会計処理)は`decimal`型を使います。

### 理由
`decimal`型の処理は他の型に比べて計算がくっそ遅いです。ただし、速度よりも精度を求められる場面では`decimal`型を採用しないと正しくない計算結果が算出される可能性があります。ちなみに`double`型の有効桁数は15~17桁です。

それぞれの型で0.1を1億回足すのにかかる時間を検証しました。
結果は下記になりました。

| single | double | decimal |
|:-:|:-:|:-:|
|  2138[ms] |  2105[ms] | 14784[ms]  |

```C#:検証したソースコード
decimal sumData = 0;

var sum = (decimal)0.1;

var sw = Stopwatch.StartNew();

for (int i = 1; i <= 1000000000; i++)
{
    //0.1を1000000000回足す！
    sumData += sum;
}

sw.Stop();

Console.WriteLine($"{sw.ElapsedMilliseconds}[ms]");
```

# 余談
プログラミング学習1ヶ月目の時に電卓を作りましたが、あの時のソースコードを見てみたら`double`型を使ってました。(ﾟＡﾟ;)ｺﾞｸﾘ...(世の中に出るソフトじゃなくて良かったぁ)

ここまで読んで頂いてありがとうございました！
【合格体験記】LPIC-3(Level3) 304 (Virtualization and High Availability) ver2.0

# 本記事の概要

LPIC-3 304 (Virtualization and High Availability) を受験し取得したので
勉強方法を備忘録として投稿します。
LPICを受けようと思っている方や、現在勉強している方が
この記事を参考の一つにしていただけたら幸いです。

# 使用した教材

参考書
・[徹底攻略 LPIC Level3 304 教科書+問題集[Version 2.0]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-LPIC-Level3-304-Version/dp/4844380540/ref=sr_1_1?crid=1CVP61ZRNV04R&keywords=lpic+304&qid=1644492104&sprefix=lpic+%2Caps%2C156&sr=8-1)

WEBサイト
・[Ping-t](https://ping-t.com/)

# 勉強の流れ

1. **Ping-tのWEB問題集を分野毎に解いていき、間違えた問題は解答を読んでノートにまとめる**
Level3に試験はこれまでの試験とは違い1回のみの試験なので楽だろうと思っていましたが、
**案外範囲が広い...**
1週間で終わらせる予定が2週間かかりました。

1. **全体範囲を終えたら、全問ヒットになるまで繰り返す**
大体1週間ほどPing-tを続けました。（今回はコマ門は実施しませんでした。）

1. **参考書を解く**
これまでお世話になってきたスピマスは出版されていませんが、この本が実質スピマスの役割を果たしてくれました。

# 試験結果

受験日：2021年12月26日
スコア：720
合格ライン：500
結果：pass

| テストセクションの情報 | 正解率 |
|:-:|:-:|
|  Virtualization |  91% |
|  High Availability Cluster Management |  88% |
| High Availability Cluster Storage  |  100%|

これまでの試験で最も得点できました。
というのも、**試験問題の内なんと半数以上が参考書の問題と同じ、あるいは類似問題でした。**
304試験は2022年6月頃にアップデートされますので、単純に資格がほしいという方は今のうちに受けておくことをお勧めします。

# 受験後の感想

これで私のLPIC道はひとまず終了です。
なんとなくLPIC3取得を目指して始めたわけですが、振り返るとやはり202が一番の難所でしたね。
今後はAWSの方に力を入れていきたい。

この記事を開いていただき、また、
ここまで読んでいただきありがとうございました。
今年度中にSAP取得を目指してがんばります。
MSGからGmailへ - 添付ファイル付きのMSGファイルをGmailにバッチでインポートする

<p>Outlook、MDaemon、または別の電子メールクライアントからエクスポートしたMSGファイルがあり、GmailでMSGファイルにアクセスする方法を知りたいですか？ 「はい」と答えた場合は、ここから<a href="https://www.mailsware.com/jp/msg-converter.html"><b>MSGコンバータソフトウェア</b></a>を入手する必要があります。 そこで、MSGをGmailにインポートする方法を紹介します。ここには、すべてのメール、連絡先、その他の情報が含まれています。</p>
<p>情報源としての電子メールの使用は、今日の企業環境においてますます重要になっています。電子メールには、重要な機密情報を含む大量の情報が含まれています。電子メールのアーカイブは、電子メールを長期間保存する手段として多くの人々によって検討されています。さまざまな電子メールサービスと電子メールクライアントプログラムにアクセスして、それらを追跡できます。</p>
<p>一方、誰もが新しい技術の習得に熱心です。その結果、多くのユーザーが定期的に1つの電子メールプログラムから別の電子メールプログラムに切り替えます。一方、多くの電子メールプログラムは、MSGファイルを使用して電子メールメッセージを保存します。一方、多くの電子メールプログラムは、MSGファイルを使用して電子メールメッセージを保存します。この場合、最もよく聞かれる質問は、MSGファイルをGmailにインポートする方法と、現時点でMSGファイルにアクセスする方法です。 Gmailでは、MSGファイルを送信できます。</p>
<h2>提案された方法を使用してMSGをGmailアカウントにインポートする方法は？</h2>
<p>WindowsマシンにMSGto GmailConverterをダウンロードして実行します。</p>
<p>次に、[フォルダの選択]オプションをクリックして、OutlookMSGファイルを読み込みます。</p>
<p>このソフトウェアは、左側のパネルにMSGファイルをロードします。それをクリックして、詳細なプレビューを確認してください。</p>
<p>次に、[変換]をクリックし、ファイル保存オプションとして[Gmail]を選択します。</p>
<p>Gmailアカウントのクレデンシャルを入力し、[変換]ボタンをクリックします。</p>
<p>ソフトウェアはMSGファイルのGmailアカウントへの変換を開始します。このプロセスには少し時間がかかります。</p>
<h2>ユーザーがMSGファイルをGmailにアップロードする必要がある最も一般的な理由は次のとおりです。</h2>
<p>とにかく、なぜMSGをGmailにインポートしたいのですか？すべてを考慮に入れて、MSGファイルをGmailにアップロードすると、独自の利点が得られます。次の段落では、このインポートの利点について説明します。</p>
<p>Googleは、10億人を超えるユーザーを抱える、世界で最も有名なメールサービスプロバイダーの1つです。<p>
<p>Gmailは、重要な通信を無料で保存できるようにすることを目的として、大量のストレージスペースを提供します。</p>
<p>Gmailの統合により、すべてのGoogleアプリに単一のGmailIDを使用してアクセスできます。</p>
<p>Google Gmailアカウントを使用すると、すべてのメールを簡単に管理できます。</p>
<p>任意の計算方法を使用して、いつでもどこからでもアクセスできます。デバイスがAndroid、iPhone、Windows Office Suite、Mac OSのいずれであるかに関係なく、効率的に同期することができます。これは、デバイスがMacまたはWindowsコンピューターであるかどうかに関係なく当てはまります。</p>
<h3>MSGからGmailへのコンバータソフトウェアの驚くべき機能</h3>
<p>複数のMSGファイルをGmailアカウントに直接バッチで変換することをサポートします。</p>
<p>MSGメールをすべての添付ファイルとともにGmailアカウントにインポートします。</p>
<p>変換中、このソフトウェアはすべての電子メールプロパティを維持します。</p>
<p>要件に従って、選択したMSGファイルをGmailアカウントに変換します。</p>
<p>このソフトウェアは、最新および以前のすべてのWindowsプラットフォームにインストールできます。</p>
<p>MSGファイルをGmailアカウントにインポートするためにサポートアプリをインストールする必要はありません。</p>
<h3>最後の言葉</h3>
<p>前回の投稿では、MSGファイルをGmailにインポートするための多くの方法のすべてについて説明しました。ここで提供する自動化された手法を使用して、Gmailで多数のMSGメッセージを開くことができます。このプログラムの最も有利な機能は、インポート手順中に電子メールの特性をそのまま維持できることです。ソフトウェアのライセンス版を購入する前に、デモ版でこのプログラムをテストすることができます。プログラムや手順について他にご不明な点がございましたら、ライブヘルプチャット機能を使用してお問い合わせください。</p>
［AWS］今週の問題2週目

# 問題
問1. インターフェイス型のエンドポイント用にSGを作成する時、インバウンドルールにて何番ポートを開ける必要があるか答えよ。

問2. エンドポイントを作成する時、VPCの設定をデフォルトから変更する項目がある。何か答えよ。

問3. ローカルPCからサーバーBに直接SSH接続したい。しかしサーバーBはパブリックIPが無い。一方サーバーAにはパブリックIPが振られており、これを経由することでサーバーBに接続する技術がある。何か答えよ。

問4. VPCの設定の一つである「DNS解決」は何を指しているか、以下から答えよ。
a. VPCにホスト名を付与する
b. VPC内のインスタンスにパブリックホスト名を付与する
c. VPC内にAWSが用意するDNSサーバーを有効化してくれる
d. プライベートIPアドレスが付与できるようになる

問5. エンドポイント経由のみでのSSM接続にて、インターネット上からとあるパッケージをインストールしたい。これは可能であるか？

問6. IAMユーザーAにはs3のアクセス権限が付与されている。そしてS3のアクセス権限が付与されていないロールはスイッチした状態でS3にアクセスできるか答えよ。

# 解答
問1. 443
問2. DNS有効化
問3. SSHポートフォワーディング
問4. c
問5. 不可能(natゲートウェイを用意すれば可能)
問6. 出来ない