OmniAICreator/Qiita-1.07M huggingface dataset:
WebAssemblyのことを何となく分かったとなる

# WebAssemblyのことを何となく分かったとなる

# WebAssemblyとは
モダンなブラウザで実行できる新しいタイプのコードです。
低レベルのバイナリで容量も小さく、ロードから実行までが高速です。
普段利用している言語はプロセッサ上で動くように機械コードへと翻訳され、プロセッサの種類によって機械コード・対応するアセンブリが必要になります。
WebAssemblyは特定の機械に対してではなく、ブラウザに対応しています。
WebAssemblyのコードをブラウザがインストールしたらどのマシンのアセンブリにも変換されます。

## まとめ
・WebAssemblyはロードから実行までが早い
・プロセッサではなく、ブラウザに対応している
・WebAssemblyは低レベルなバイナリ

# WebAssemblyの必要性
ブラウザ上ってJavaScriptいるやん・・・って思いますよねー。
JavaScriptいるのになんでWebAssemblyいるのって僕は思いました。調べました

## JavaScriptさん「もう辛いっすよ！」
JavaScriptは技術の発展とAPIの整備の結果webGLや画像認識などを実装されるようになりました。
技術が発展し求めるものは「高速実行」です。
そもそもJavaScriptは動的型付け言語であって簡単に記述ができ、高速で実行するように考えられたものではないです。
JavaScript的には話が違うじゃないっすかーって感じでしょう。（仕事でもたまにあるやつ）
JavaScriptは型の情報が不足しているので、型が決まってないからチェックを1つ1つ行ってその結果によって命令を決めるようにするしかありません。
そのため高速実行は難しい。

## JITコンパイルの登場
JavaScriptは型が決まってない！と言いましたがこの状況をどうにかするぞと考えJIT(Just In Time)コンパイルという技術が利用されます。
僕も詳しく説明ができないので要点をまとめますと
・すぐにネイティブコードにせずインタプリンタなどで動作させる
・変数に代入する値を観測してその統計して推定できるようになったらネイティブコードに変換する

JITコンパイルのおかげで高速動作させることができるようになりました。
しかし、まだ問題は存在しています。
・よく使うコードしかネイティブコードにならない
・高速動作させるためには時間が必要
・型の推定に失敗することがある

これらの問題を解決するためにasm.jsが導入されました。

## asm.js登場
JITは高速に動作させることができましたが、時間がかかったりやり直しが必要になったり先ほどの問題があります。
これを解決するために実行する前にネイティブコードにコンパイルさせたい・・・けどJavaScriptはネイティブコードに出力するのは難しい。
そこでasm.jsが登場するわけです。
asm.jsにも詳しくないので何となく分かったとなるように要点だけまとめます。
・asm.jsの単位はモジュールでありファイル単位ではない
・JavaScriptの中でasm.jsのモジュールを定義する
・型の情報を明示する

asm.jsによってプログラムの中に型の情報を明示することによって事前コンパイルが可能になりました。
JITのように処理が重くなくなり高速に実行できますし、コンパイルされた結果はキャッシュされ次回からは高速に起動します。
しかし詳しくはソースコードを見てもらいたいんですが、書くのがめっちゃ大変です。
そのためにEmscriptenというツールが用意されていますが、Emscriptenで作られたコードはサイズが大きくダウンロードに時間がかかり起動までが長くなる。

この問題を解決するためにWebAssemblyが必要とされています。

# WebAssembly登場
webAssemblyは冒頭で説明した通りで今までの課題を網羅しているでしょう。
WebAssemblyはファイルフォーマットの一種で拡張子に.wasmを利用します。
webで扱うのは大半がテキスト形式ですが、wasmはバイナリ形式でプログラムを表します。この違いがサイズが小さくなる理由です。

JavaScriptの場合、JavaScriptエンジンは実行時にパースしてコンパイル・コードの最適化を行わなければなりません。
パースでは抽象構文木というデータ構造に変換してバイナリ形式に変換させ、コンパイル時にはどの型が使われているかチェックする必要があります。
一方WebAssemblyは抽象構文木がバイナリ形式のおかげでデコードし静的であるためコンパイル時にチェックする必要もない。
そのため実行が早いという感じでしょうか。

個人的にもう１つの特徴としては、移植性だと思っています。
冒頭でも話したように、普段利用している言語はプロセッサなどに適合するようにソースコードをコンパイルさせなければなりません。
WebAssemblyはコンパイル手順を踏むだけで全てのモダンブラウザで実行ができます。
フロントでは踏み入れず諦めていたものもWebAssemblyを通せば解決するのではないでしょうか。

## まとめ
・WebAssemblyはバイナリ形式
・JavaScriptよりも工程が少なくコンパイル時にチェックする必要もない
・実行がはえー
・移植性がある

# JavaScriptはいるのか
ここまで学んできて思ったことはじゃあJavaScript必要ないんじゃないか？ってことです。
ここで僕が確かにと思った記事を引用させていただきます。

> まずWebアプリの大半はasm.js/WebAssemblyで提供される計算性能を必要としていません。必要したとしても、大半のコードの価値はスピードよりもUXによって提供されるでしょう。JavaScriptの大きな特徴は、その生産性の高さです。高速に動作することよりも、高速に開発のイテレーションをまわ回して行く方が重要とされる局面は多くあるでしょう。そんな時にJavaScriptの生産性の高さが生きるでしょう。
>> https://html5experts.jp/chikoski/22523/

WebAssemblyが必要とされるのは、アプリの全てではなく複雑な処理を行う場面だと思っています。
僕の働く環境ではそこまで必要になることはないだろうし、開発を高速に回すことの方が重要な局面のが多いです。
このためJavaScriptとWebAssemblyは共存し合い、選択肢の1つに加わり、Webを豊かにしていくのが正しい道なのではないかと思っています。
Wine のメモ

## 背景

* Linux でも Vulkan + Windows アプリ(C++)を動かしたい
* Windows アプリ: COFF バイナリを想定

自身の file path を Windows アプリ 側で見せるには, 

## WINE とは?

エミュレータではありません. COFF バイナリ直実行環境というのが正しいでしょうか?
古い Windows アプリは動かせるかもしれませんが, 新しめのとかは難しそうです.

基本的には Linux で Vulkan アプリを GPU アクセラレートさせてうごかしたいとか, COFF バイナリをコマンドラインでバッチ処理したいとかの開発者向けと考えたほうがよいでしょう.

普通に Windows アプリ(Office とか, Visual Studio とか, e-Tax ソフトとか)を動かしたいのであれば, 仮想環境(e.g. VirtualBox) をおすすめします.

## Linux で `./exe` 直実行


## Explorer

winefile or `wine explorer` で, Explorer 相当

## APPDATA

Wine 自体は XP 相当っぽいようです.
`%APPDATA%` は Win7, Win10 とちょっと違うところにあります.

`winecfg` で, Wine の動作を Win10 モードにすると変わるかも?


## Start メニューやデスクトップ

Wine 自体では, Start メニューや Desktop shortcut あたりはそんなには対応していないようです.

別アプリを使えば行けるかも?

一部インストーラーではうまくインストールできなかったりするかもです.

## ファイルパス

Linux ですと,

`z:` が `/` にマッピングされています. Linux 側のファイルシステムを Windows アプリ側にマッピングするときに役立ちます.


`winepath C:\` などで, Linux のどこにマッピングされているか確認できます.

通常は,`~/.wine/dosdevices` が基点になっています.

`wineprefix` で変更することができます.

## PATH 変数など

Windows での PATH 変数は, `WINEPATH` 環境変数で設定(複数　PATH は `;` で区切る)します. 

Wine PATH through command line and not persistent
https://stackoverflow.com/questions/7249791/wine-path-through-command-line-and-not-persistent

永続的に設定したい場合は registory を設定するしかないようです(WINE 用の環境変数エディタはないかしらん?)が, WINEPATH を設定して起動する bash script つくるか, batch ファイル作ってそこに PATH 追加したりしたのを起動させるで対応が現実的なところでしょうか.

その他の Linux の環境変数は, WINE 環境に引き継がれます.

### dll path

`WINEDLLPATH` だとビルトインの dll だけでした.. 

https://forum.winehq.org/viewtopic.php?t=33364

.exe と同じディレクトリに .dll を置くか,
WINEPATH により, (Windows 側での) `PATH` 変数で dll へのパス設定する必要があります.

Linux 側(Linux bash 側)ですと

```
$ WINEPATH="C:/Users/syoyo/lib"  ./a.exe
```

のようになります. `PATH` 変数は Windows の流儀に従うので複数の場合は `;` で区切ります.

あんまり試していないので正しいかわかりませんが, デフォルトの `%PATH%` も含めたいときは以下のような感じでしょうか.

```
$ WINEPATH="%PATH%;C:/Users/syoyo/lib" ./a.exe
```

ちなみに backslash はエスケープせずに使えました. 空白も同様にエスケープせずに使えると思われます.

```
# OK
$ WINEPATH="%PATH%;C:\Users\syoyo\lib" ./a.exe
```

## WINPREFIX

より広範囲に環境を切り替えて(dlls 群や app 群を切り替えて使いたいなど) Wine うごかしたい場合は, WINEPREFIX がよさそうです!

https://kakurasan.blogspot.com/2015/06/manage-winapps-using-wineprefixes.html
【Ruby】sliceの使い方　初級編

# 概要
Rubyのドリルで**slice**コードが回答として出て、なかなか理解ができなかったため備忘録として残します。

## 問題
任意の2つの文字列があります。
大文字と小文字の違いを無視して、どちらかの文字がもう一方の文字の最後にある場合は**True**を
ない場合は**False**を出力するプログラムを作りましょう。
（つまり、大文字と小文字は区別されません）。

## 回答
```Ruby:Ruby
def end_other(a,b)
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
  if  a_down.slice!(-(b_len)..a_len - 1) == b_down #←この行を解説します！
    puts "True"
  else
    puts "False"
  end
end

puts "アルファベットを入力してください"
code = gets.chomp

puts "指定する文字を入力してください"
find_word = gets.chomp

end_other(code, find_word)
```

# 解説
**slice**とは、指定した範囲を文字列から取り除いたうえで取り除いた部分文字列を返します。
とありました:grin:
参考：https://docs.ruby-lang.org/ja/2.3.0/method/String/i/slice=21.html

```Ruby:例
string = "this is a string"
string.slice!(2)        #=> "i"
string.slice!(3..6)     #=> " is "
string.slice!(/s.*t/)   #=> "sa st"
string.slice!("r")      #=> "r"
```

:warning:カウントは**0(ゼロ)**から始まります！
　私は、ここで躓きました:sweat:

よって、上記回答を詳細を説明すると下記のようになります:point_up:

```Ruby:解説
def end_other(a,b)
  a_down = a.downcase  
  #変数aの文字を全て小文字に変換！
  b_down = b.downcase
  #変数bの文字を全て小文字に変換！
  a_len = a_down.length
  #変数aの文字数を取得！
  b_len = b_down.length
  #変数bの文字数を取得！
  if  a_down.slice!(-(b_len)..a_len - 1) == b_down
  #-(b_len) :変数aの最後の文字から変数bの文字数分の文字を返します
  #a_len - 1 :変数aの最後の文字を返します
  #.. :以上、以下を表します
#省略
```

こんな感じですが、正直　自分でも？？？という感じなので実際に文字を当て込んでいきます:grinning:

```Ruby:解説の解説www
a = wOrD
b = Rd

def end_other(a,b)
  a_down = a.downcase  
  #wOrD ⇒　word
  b_down = b.downcase
  #Rd ⇒　rd
  a_len = a_down.length
  #4文字
  b_len = b_down.length
  #2文字
  if  a_down.slice!(-(b_len)..a_len - 1) == b_down
  #-(b_len) :wordの後ろから２文字を返します・・・> r です
  #a_len - 1 :wordの最後の文字を返します・・・> d です
  #a_down.slice!(-(b_len)..a_len - 1) : rd となります

#省略
```

少しわかりづらいかもしれません。。。。
文章力がなく申し訳ございません:bow:

少しでもお役に立てれば幸いです:laughing:

# 参考
[sliceについて](https://docs.ruby-lang.org/ja/2.3.0/method/String/i/slice=21.html)
[..について](https://docs.ruby-lang.org/ja/latest/class/Range.html)
Microsoft Projectを上手に使うための心得 その２

#Microsoft Projectを上手に使うための心得 その２
> 本項は[Microsoft Projectを上手に使うための心得](https://qiita.com/koforest/items/cdd845b2c500a23cb7d8)の続編です
※Microsoft Project 2016の利用経験を前提に記述していますが、以降のバージョンでもほぼ同様です。

前回は基本的なプロジェクトのタスクを書き、上手にスケジュール化する手順をまとめました。
今回は、進捗をトラッキングしていくための覚書を中心にお届けします。

## 1．ガントチャートにタスク名と担当者を表示させる
タスクの名称はデフォルトで表示されていますが、担当者は表示されていません。
サマリータスクにも名称が欲しいところです。

ガントチャートを右クリック＞バーのスタイル　を表示し、

1. 上半分の表より、「タスク」を選択
1. 下のパネルから「バーの文字列」を選択
1. 「右側」欄に「リソース名」を選択

サマリータスクにもタスク名を表示しましょう

1. 上半分の表より、「サマリータスク」を選択
1. 下のパネルから「バーの文字列」を選択
1. 「左側」欄に「タスク名」を選択

マイルストーンなどにもお好みでどうぞ。
サマリータスクは色々な種類がありますが、上記２つで概ね見やすくなります。

### タスク名が表示されない場合
そのタスクが「手動スケジュール」になっているかもしれません。
「タスクモード」列を表示し、「自動スケジュール」に変更してください。
前回の記事にも書いた通り、Projectは自動スケジュールで作成するほうがベターです。
「バーのスタイル」から、手動スケジュールバーの設定もありますので、そちらを設定するのもありです。

## 2．進捗を入力する
ガントチャートビューで列を挿入します。「達成率」列を追加してください。
他にも類似する項目がありますが、ガントチャートに素直に出てくる項目はこちらです。

### 達成率を入れた後にスケジュールを変更しない
日程を後にずらす、期間を延ばすなどしたい場合、達成率を0%にしてから変更すると、思い通りになります。
すでに50%の進捗があるタスクを変更した場合、すでに達成させれた進捗が置き去り（スプリット）になります。
スプリットしたタスクは管理が非常に面倒です。

## 3．イナズマ線を表示する
ガントチャートを右クリック＞イナズマ線＞現在のイナズマ線
表示する、にチェックを入れてください。

- プロジェクトの状況報告日 /　現在の日付

は現在の日付の方が分かりやすいでしょう。

プロジェクトの状況報告日で表示させたい場合、
リボン＞プロジェクト＞プロジェクト情報＞状況報告日 に日付を入れると、その時点でのイナズマ線が表示できます。

## 4．期間に表示される「XX日？」を取りたい
サマリータスクの期間が、？付で表示されるケースがあります。
サマリータスクに含まれるタスクのうち、一部のタスクで期間が未定義の場合に起こります。
（同様に？表示になっています）
タスクに期間を入力して確定してください。

## 5．リソース配分状況ビューを活用する
タスクを積み上げ、リソースを入力し、前後関係を組み上げました。
リソースに対し、1日のタスクが2重に割り当てされていないか、未割当のタスクがないかチェックしましょう。
リソース配分ビューを表示します。

まず未割当のタスクが表示されますので、リソースを割り当てます。
次に、各リソース名が赤く表示されていないかチェック。
赤くなっていれば、どこかで1日8時間以上の割り当てがあります。
右側パネルのカレンダーで探して解消してください。

### 0.5稼働で割り当てたい
出来ますが、MSProjectの管理が難しくなるためお勧めしません。
1タスクは1リソースを100%割り当てる方が無難でした。

### 1タスクに複数人を割り当てたい
出来ますが、お勧めしません。
1人1人の進捗把握、ひいてはプロジェクト全体の把握がしづらくなりました。
1タスク1リソース割り当てで個別の進捗を管理するのがベターです。

## 6．プロジェクト全体を1枚のPDFに出力する

1. ビュー（ここではガントチャートビュー）を表示し、出力したい列が左側パネルに見えるよう調整します
2. ファイル＞印刷＞プリンター「Microsoft Print to PDF」を選択
3. ファイル＞印刷＞設定＞「プロジェクト全体を印刷」を選択
3. ファイル＞印刷＞ページ設定＞拡大縮小印刷で「横 1＊1」に設定
4. 用紙サイズを任意に設定
5. 印刷

で1枚のPDFにプロジェクト全体が表示できます。
お好みで、印刷＞設定＞特定の日付を印刷　で出力するのも便利です。
Laravel Paginatorについて

LaravelのPaginatorをまとめます。
# 環境
　php artisan tinker
# 使い方

object

```
>>> $result = App\User::where("group_id", 1)->paginate(2);
=> Illuminate\Pagination\LengthAwarePaginator {#4502
     +onEachSide: 3,
   }
```
各インスタンスメソード

```
>>> $result->count()
=> 2
>>> $result->total()
=> 4
>>> $result->currentPage()
=> 1
>>> $result->lastPage()
=> 2
>>> $result->firstItem()
=> 1
>>> $result->lastItem()
=> 2
>>> $result->perPage()
=> 2
>>> $result->hasMorePages()
=> true
>>> $result->nextPageUrl()
=> "https://xxxxxx.com?page=2"
>>> $result->previousPageUrl()
=> null
>>> $result->url(2)
=> "https://xxxxx.com?page=2"
>>> $result->url(1)
=> "https://xxxxx.com?page=1"
```
toSqlメソード

```
>>> App\User::where("group_id",1)->toSql()
=> "select * from `users` where `group_id` = ?"
```

#注意

::all()の後ろにpaginate使えない。

```
>>> App\User::all()->paginate(2)
BadMethodCallException with message 'Method Illuminate/Database/Eloquent/Collection::paginate does not exist.'
```
理由は
When you're using all() you get all the rows from the table and get a collection. Then you're using collection method where() (and not Query Builder method where()) and then you're trying to use paginate() method on the collection and it doesn't exist.

# 参考
- https://stackoverflow.com/questions/48148472/laravel-method-paginate-does-not-exist
Javaのprotected

###protected
ゲッター・セッターとはまた違う方法です。
クラス外から呼び出したいときは、private(クラス外は呼び出せない)では呼び出せないので、「protected」を使って、クラス内とサブクラスからのみアクセスを許すフィールドを作ります。
「public」「protected」「private」の3つのアクセス権です。
・public: どこからでもアクセス可能
・protected: そのクラスと子クラス内からのみアクセス可能
・private: そのクラス内からのみアクセス可能
リモートへpushしてしまったコミットのコメントを変更する方法

# やり方

## 1. 該当コミットを指定
`git rebase` で該当コミットを指定します。
直近5つのコミットから指定したい場合はこう。

```
$ git rebase -i HEAD~5
```

直近1つならこう。

```
$ git rebase -i HEAD~1
```

すると、編集画面になるので、

```
pick 8e2ab3a 最初のコミット
pick 5588727 コミット2回目
pick c8e517d コミット3回目
pick 8466de1 コミット3回目
pick 5533d64 コミット5回目

# Rebase 2abbcb9..5533d64 onto 8466de1 (5 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
```

変更したいコミットを `edit（eでもOK）` に変更します。

```
pick 8e2ab3a 最初のコミット
pick 5588727 コミット2回目
pick c8e517d コミット3回目
edit 8466de1 コミット3回目
pick 5533d64 コミット5回目

# Rebase 2abbcb9..5533d64 onto 8466de1 (5 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
```

編集が終わったら、保存（:wqやZZなど）して閉じます。

```
$ git rebase -i HEAD~5
Stopped at 8466de1...  hogeeeeeeeeeeeeee.md追加
You can amend the commit now, with

  git commit --amend

Once you are satisfied with your changes, run

  git rebase --continue
```

## 2. 該当コミットのコメントを編集

まずは `commit --amend` でコミットを編集します。

```
$ git commit --amend
```
```
コミット3回目
  
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Jun 17 00:38:32 2020 +0900
```

編集が終わったら、保存（:wqやZZなど）して閉じます。

```
コミット4回目
  
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Wed Jun 17 00:38:32 2020 +0900
```

## 3. コミットのコメント編集を終了

`rebase` で編集を終了します。

```
$ git rebase --continue
```

以下が表示されたらOK。

```
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
```

## 4. リモートにpush！

最後に、変更したコミットをリモートへpushします。
普通のpushだと拒否られるので `-f` で強制的にpush。

```
git push -f origin master
```

以上！

# 参考サイト
https://saikeblog.com/2019/04/20/過去にリモートへpushしたコミットのコメントを変/
JavaScriptの質問です。

プログラミング初心者です。
制作しているWebサイトに以下のような登録フォームを作ろうとしております。


![コメント 2020-06-18 133632.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206880/2a7f25fa-1c99-2b97-7298-fe93595d316f.jpeg)

javaScriptの知識が全くないので、ネット上からよさそうなコードをコピペし、以下のようなコードを入れてGoogleフォームを組み込んで作りました。



```
<form action="https://docs.google.com/forms/●●●" 
    method="post" name="registrationForm" target="dummyIframe">
        
        <label for="company">企業名［必須］</label>
        <input id="company" required type="text" name="entry.●●●" placeholder="">
        
        <label for="name">担当者名［必須］</label>
        <input id="name" required type="text" name="entry.●●●" placeholder="">
        
        <label for="address">メールアドレス［必須］</label>
        <input id="address" required type="email" name="entry.●●●" placeholder="">
        
        <br><br>
        <input type="submit" id="submit_botton2" value="登録する" onclick="sendGform()">
    </form>
    <iframe name="dummyIframe" style="display:none;"></iframe>
    
<div id="thxMessage" style="display:none;">ご登録ありがとうございます。</div>

<script>
function sendGform(){
   document.myForm.submit();
   document.getElementById('formWrapper').style.display = 'none';
   document.getElementById('thxMessage').style.display = 'block';
}
</script>

<script>
function showThxMessage(){
   var email = document.registrationForm.emailAddress.value;
   if(email !== ''){
       var thxDiv = document.getElementById('thxMessage');
       thxDiv.getElementsByTagName('span')[0].innerHTML = email;
       document.myForm.reset();
       document.getElementById('formWrapper').style.display = 'none';
       thxDiv.style.display = 'block';
   }
</script>
```



しかし、現状ですとフォームに何も入力せずに「登録する」ボタンを押しても、「ご登録ありがとうございます」というサンクスメッセージが出てしまいます。

フォームが未入力の場合はサンクスメッセージを出さないようにしたいのですが、どのようなコードを入力すればよいのでしょうか。

初歩的な質問で恐縮ですが、ご教示いただけますと嬉しいです。
よろしくお願いいたします。
docker attach後　コンテナ　落ちないようにする

# docker attachから抜ける時、、
僕はdocker歴2ヶ月ぐらいのペーペーなのですが、docker attachから抜ける時、いつもctrl+cで抜けていました。

でもそうすると、毎回、コンテナが落ちてしまって、docker attachから抜けるたびにdocker-compose restartをして再起動していました。

今回はこの無駄な作業を解決できる方法を学んだので、記事にしました。
#解決法
ctrl+p、その後にctrl+q
これはデタッチというらしく、コンテナを起動したまま、コンテナから抜け出すことができるそう、、
#参考
https://tech.withsin.net/2015/09/30/docker-container-detach/
KiCad において円弧図形のフットプリントを作成する

#1. はじめに
　KiCad[^1](5.1.6)-1において、コイルの様なフットプリントを作成する方法を勉強しました。別件で試行錯誤[^2]した際の副産物です。無線やオーディオなどのアナログ用途が考えられますが、具体的なインダクタンスの合わせこみや精度の確保については言及できていません。
[^1]: [KiCad](https://kicad-pcb.org/)
[^2]: [Qiita「KiCadにおいて複数の部品からなるフットプリントを作成する」](https://qiita.com/BotanicFields/items/c3783561dc5fbd6a5d19)
![coil1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378410/fc459024-b963-a034-d61a-91251dfd83b8.png)

#2. フットプリントエディタ
　KiCad は、プリント基板を設計するための高機能な CAD ソフトウェアで、誰でも無料で使うことができます。プリント基板上に部品などを配置する際に使用する図形データをフットプリントと呼びます。KiCadには予め数多くのフットプリントがライブラリとして用意されています。必要なフットプリントがライブラリにない場合、自分でフットプリントを作成や修正するためのフットプリントエディタが用意されています。フットプリントエディタの操作方法やライブラリの管理方法については、解説本[^3]などを参照ください。
[^3]: [「KiCad Basics for 5.x」マッハ新書](https://booth.pm/ja/items/941963)

#3. 円弧の入力
　SMD パッドを中心に円弧図形を入力しました。形状にカスタム図形(矩形アンカー)を選択しています。円弧図形上にはハンダは不要とし、ペースト(F.Paste)やレジストマスク(F.Mask)のチェックを外します。アンカー図形は矩形である必然性はありません。本来、中心にはビアが必要であり、外側を基点にすべきと思います。
![coil2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378410/5e3d4429-105a-a304-1a8c-de6f33ce09e3.png)

　半円毎に半径を広げながら円弧を入力しました。上側とした側で中心をずらしています。最初と最後だけ、直線のセグメントを追加しています。線幅は0.25mmです。
![coil3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378410/2492051c-5e01-0f1e-7756-a61226e781be.png)

　円弧の入力画面です。大変シンプルでわかりやすいですが、リスト上で修正できればもっと便利とは思います。
![coil4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378410/48927778-48fb-2594-b67c-eacc77a36ad6.png)

#4.　おわりに
　実用的には、excel などで座標を計算してテキストエディタで入力する様なやり方が必要と思います。また、フットプリントでなく、配線パターンとしてコイルを作成するには、プラグイン[^4]の利用が有力な模様です。

[^4]: [HACKADAY "KICAD ACTION PLUGINS"](https://hackaday.com/2019/11/19/kicad-action-plugins/)
ChromeでMarkdownを表示する方法

##1. ChromeウェブストアからMarkdown Preview Plusを追加
・以下のサイトへアクセスし、__「Chromeに追加」__ボタンをクリック
[Markdown Preview Plus](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/e568e807-deba-97ee-0e52-743b2d032098.png)
)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/a7b8072e-22d5-7cb8-f1c9-080253c28ecc.png)

##2. ファイルの URL へのアクセスを許可する
・[chrome://extensions](chrome://extensions)にアクセスする。
・Markdown Preview Plus の__「詳細」__ボタンをクリック。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/bf9ab9be-1a54-e7d5-6096-e4d47b1b037f.png)
・__「ファイルの URL へのアクセスを許可する」__を有効にする。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/04a20174-63c4-e9c4-061f-bedacfe776a7.png)


##3. サポートする拡張子の設定
・ブラウザの右上に表示されたMarkdownのマークをクリック。
・Optionsをクリック。
![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/46b2e276-fee5-4fe2-7f7a-e340c07fc781.png)
・「MarkDownプレビュープラスオプション」というページが開かれるので、最下部にある「サポートされているファイルの拡張子」でサポートする拡張子を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/8476a2c2-9b7d-5d75-eb82-170e3a0c90bb.png)

##4. ブラウザでMarkdownが表示できることを確認
・ブラウザへMarkdownファイルをドラッグ&ドロップして、表示されることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234350/828fa36f-83e1-42fb-57fe-c09aac0ea3fa.png)
jQuery UI selectmenu にスタイルを適用する


ポイント1
・jQuery UI selectmenu は「button」と「menu」に分かれている

以下赤枠が button で紫枠が menu

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/bf1ab010-7931-4157-67ac-e4b37a75baf2.png)

ポイント2
・button と menu のそれぞれにスタイルのクラスを適用することが可能

以下のようにクラスをそれぞれ設定する。

```javascript
$("#myselectmenu").selectmenu();
$("#myselectmenu").data("ui-selectmenu").button.addClass("myselectmenu_button")
$("#myselectmenu").data("ui-selectmenu").menu.addClass("myselectmenu_menu");

```

CSSで以下のようにスタイルを設定する。

```css
.myselectmenu_button{
   font-size:10px;
}
.myselectmenu_menu{
   font-size:10px;
}

```


以上。
エラー　React version not specified in eslint-plugin-react settings.　を解決する

##eslint-plugin-reactを利用しeslintをかけたところエラー
####React version not specified in eslint-plugin-react settings.
が出たのでググりました。

###まず翻訳
####eslint-plugin-react の設定で React のバージョンが指定されていません。

利用しているバージョンは以下です

```
"react": "16.13.1"
"eslint": "7.1.0"
"eslint-plugin-react": "7.20.0"
```

さらにググり
2記事参照
https://blog.freks.jp/remove-eslint-react-plugin-warning/
https://github.com/yannickcr/eslint-plugin-react/issues/1955


####.eslintrc.jsonのsettingsに追記修正

```React:.eslintrc.json
"settings": {
        "react": {
          "version": "detect"
        }
```

解決しました
UnityのInspectorにC#でSelectBox表示

InspectorにC#でpublicにしている変数をSelectBox表示するメモ

``` C#
public enum MojiType
{
  AAA,
  BBB,
  CCC
}
[SerializeField] MojiType mojiType= MojiType.AAA;

```

![SnapCrab_NoName_2020-6-18_13-9-4_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/c6dbe0e0-a775-1f5c-774b-f9cfebe783c2.png)

Switchでの場合分け使い方

``` C#
switch (mojiType)
{
  case MojiType.AAA:
    break;
  case MojiType.BBB:
    break;
  case MojiType.CCC:
    break;
}
```
Google Data StudioのグラフをGASでSlack配信する

# 概要
Google Data StudioでSlack配信しなければいけないタスクが発生したため対応方法を記載します

# パイプライン
1. Data Studioから自分宛にメールを日次でスケジュール配信する
2. GASでData Studioから送信された直近のメールから添付ファイルを取得する
3. 取得した添付ファイルをSlack配信する

※どこかの処理で失敗したら手動で投下する運用を想定

# 検討した他の手段
## DataStudioのリンクを投下してサムネを表示させる
↓こんな感じのリンク

```
https://datastudio.google.com/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/thumbnail?sz=full
```
- 公開範囲を絞っているためSlackがサムネを展開してくれない(デフォルトのサムネが表示される)
- ただし、リダイレクトするとGoogleフォトに飛ばされて静的画像データが作成される

```
https://lh3.googleusercontent.com/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
- このURLだったらSlackがサムネを展開してくれる
- リダイレクト後のURLは静的画像のためデータ更新で反映されないので毎回リダイレクトしてリダイレクト後のURLを取得する必要がある
- プログラムで試みたところ認証の問題もあり断念（Googleアカウントの管理にIDaaSを使っているためハードルが高かった）

## メール配信の宛先をSlackにする
- 折りたたまれた状態で配信されるので毎回クリックする必要がある
- 拡大できない
- DataStudioのリンクに飛ぶのとあんまり変わらないので断念

## Google Data Studio API
- 使えそうなAPIは見当たらない

# パイプラインの実装
## スケジュール配信設定
共有から設定します。

![スクリーンショット 2020-06-18 12.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/fc993780-72ac-334f-55b1-04dbf68d92d4.png)

GASから検索するときに件名を使うので必ず他と区別する件名を入れる必要があります。

![スクリーンショット 2020-06-18 12.49.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273970/392c6f3e-0eca-5524-3042-6329e7cc4081.png)


## GASの実装
Data Studioから配信されるメールの添付ファイルを確認するとPDFのみですが、
スクリプトを回して添付ファイルを確認したところ、どうやらPDFとjpgが存在するようです。
GASでは添付ファイルのjpgを取得して、このjpgをSlackに投下します。

※Slack tokenの取得については割愛します

```
function search_from_email_attachments() {
  // Datastudioからスケジュール配信されたメールを取得（条件に一致する最新のメールを一件取得）
  var Threads = GmailApp.search('from:"data-studio-noreply@google.com" subject:XXXXXXXXXX', 0, 1);
  var messages = Threads[0].getMessages();
  var message = messages[messages.length-1];

  // メールから画像を取得
  var attachments = message.getAttachments();
  for(attachment of attachments){
    if (attachment.getName().indexOf('.jpg') > 0) {
      return attachment;
    }
  }
}

function file_upload_to_slack(attachment) {
  var SLACK_TOKEN='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

  var data={
    token:SLACK_TOKEN,
    file:attachment,
    file_type: 'jpg',
    channels: 'XXXXXXXXXX',
    title: 'XXXXXXXXXX',
    initial_comment: 'XXXXXXXXXXXXXXXXXXXX'
  };

  var option={
    'method':'POST',
    'payload':data
  };

  res = UrlFetchApp.fetch('https://slack.com/api/files.upload',option);
  return res;
}

function main(){
  attachment = search_from_email_attachments()
  res = file_upload_to_slack(attachment)
  Logger.log(res);
}
```

あとはこのスクリプトをトリガーで設定すれば完了です。
※トリガーは編集 > 現在のプロジェクトのトリガー　から設定できます。
Twilio Assets上にPrivateで登録したmp3ファイルをFunctionsを使って再生する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズのTwilio事業部エバンジェリストの高橋です。

今回は、タイトルにある通り、Twilio Assets上にプライベート属性で保存したmp3ファイルを、Functionsから呼び出す方法をご紹介します。

## プライベートなAssetsとは

Twilio Assetsは、Twilioが提供しているストレージサービスで、mp3ファイルに限らず、様々なファイルをアップロードしておくことができます。
Assets上のファイルはTwilio上に保存されているため、Twilioからの呼び出しが早いというメリットがありますが、一方で通常の保存方法では、URLさえわかってしまうと外部から自由にアクセスできてしまうというデメリットがあります。
これを解決するために、Assets上にプライベート属性でファイルを保存することができます。

![スクリーンショット 2020-06-18 12.43.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/3d617a27-02a3-a41b-34a6-bac602117f9c.png)
アップロード時に、**MAKE PRIVATE**にチェックを入れるとプライベート属性として保存されます。

プライベート属性として保存したファイルについては、Twilio Functionsから呼び出すことができますが、今回はmp3ファイルを呼び出して、再生するためのFunctionをご紹介します。

## コーディング

さっそくコードをご紹介します。

```javascript
const fs = require('fs');
exports.handler = function(context, event, callback) {
  const assets = Runtime.getAssets();
  const mp3AssetPath = assets['/levelup.mp3'].path;  // Assets上に保存したファイル名を指定
  const stat = fs.statSync(mp3AssetPath);
  const response = new Twilio.Response();
  response.setStatusCode(200);
  response.appendHeader('Content-Type', 'audio/mpeg');
  response.appendHeader('Content-Length', stat.size);
  response.setBody(fs.readFileSync(mp3AssetPath));
  callback(null, response);
};
```

4行目にプライベート属性として保存したmp3ファイル名を指定してください（この例では、`/levelup.mp3`）。

:::note warn
以前は先頭の`/`が不要でしたが、現在は`/`がないとエラーになります。
:::

このコードを使って、Functionsを作成します。

![スクリーンショット 2020-06-18 12.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/b909fb9a-d544-d122-e9d4-7a0782a26971.png)

もしTwilio StudioなどのTwilio内部から呼び出すのであれば、**ACCESS CONTROL**にチェックを入れておくことで、外部から直接呼び出されないようにできます。

たとえば、Studioから呼び出すときは、**Say/Play**ウィジェットなどを使って、**Play a Message**を選択、**URL OF AUDIO FILE**に先程のFunctionsのURLを指定すればOKです。
![スクリーンショット 2020-06-18 12.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/1f930509-91ea-4134-1dff-56da32340bba.png)


# まとめ

プライベート属性のAssetsが、外部からのアクセスをできなくする目的には向いていますが、一方で登録できるファイルが10個までという制限があります。

と、ここまで記事にしてから気がついた。
本家のドキュメントに今回の記事と全く同じ内容が載っていた・・。
https://jp.twilio.com/docs/runtime/assets

---
### Twilio（トゥイリオ）とは

https://cloudapi.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。
LinuxでSFTP専用ユーザーを作成してみた。

# 仕様
- ドキュメントルート配下のみ操作することができます。
    - ドキュメントルートは/var/www/htmlとします。
    
- パスワード認証でログインします。
- SSHは利用できません。



# ユーザーを作成

```
useradd sftp-user
passwd sftp-user
usermod -d / sftp-user
usermod -g apache sftp-user
chown sftp-user:apache /home/sftp-user
```

ポイント：所有グループをapacheに設定しパーミッション775にすることで、apacheの権限エラーを防ぎます。

#SFTP設定

```
vim /etc/ssh/sshd_config
```

修正内容

```
#PasswordAuthentication no //コメントアウト
#Subsystem sftp  /usr/libexec/openssh/sftp-server //コメントアウト
Subsystem sftp internal-sftp 
Match User sftp-user
ChrootDirectory /var/www/sftp
ForceCommand internal-sftp -u 0002 
PasswordAuthentication yes  
```

| パラメータ | 説明 |
|:--|:--|
| Match | userかgroupを指定して条件範囲を指定 |
| ChrootDirectory | chrootを行うディレクトリパス |
| ForceCommand | 強制コマンド設定 |
| PasswordAuthentication | パスワード認証を行うか |

補足：ForceCommand internal-sftp -u 0002 することでsftp-userがファイルをアップロードしたとき、
グループに権限が与えられます。未設定だと755だが、設定後775になります。
(グループに権限を与えることでapacheによる書き込みを許容します。)

修正後は再起動します。

```
systemctl restart sshd
```

## ディレクトリ作成

#### ディレクトリ構成

まず抑えておきたいのがchrootに指定するディレクトリの権限は

##### root:rootのパーミッション755でなければならない

ということです。

この制約があることでディレクトリ構成が以下のようになります。

var
　└ www
　　　├ ドキュメントルート
　　　└ chrootに指定するディレクトリ
　　　　　└ 権限を委譲するためのディレクトリ（ドキュメントルートをマウントする）

##### ドキュメントルートの権限を変更

```
chown sftp-user:apache /var/www/html/
chmod 775 /var/www/html/
```

##### chrootに指定するディレクトリを作成

```
mkdir /var/www/sftp
chown root:root /var/www/sftp/
chmod 755 /var/www/sftp/
```

##### 権限を移乗するためのディレクトリを作成

```
mkdir /var/www/sftp/sftp-user
chown sftp-user:apache /var/www/sftp/sftp-user
chmod 775 /var/www/sftp/sftp-user
```

権限を移乗するためのディレクトリを作らず、chroot直下にドキュメントルートを置くとrootユーザーしか操作できません。


# ドキュメントルートをマウントする

```
mount -B /var/www/html /var/www/sftp/sftp-user
```

| オプション | 説明 |
|:--|:--|
| B | 任意のディレクトリを別のディレクトリ下にマウントできる |

/var/www/sftp/sftp-user/　の配下にドキュメントルートと同様のファイル、ディレクトリが追加されます。
またファイルをアップロードしたら、相互追加されます。

##### サーバーリブート対策

再起動するとマウント解除されてしまいますので設定します。

```
vim /etc/fstab
```

追加

```
/var/www/html /var/www/sftp/sftp-user          none    bind            0 0
```

fstabについて丁寧に書かれている記事は[こちら](https://qiita.com/kihoair/items/03635447591358210772)


以上です。サーバー内を好き勝手されたくない時はSFTPユーザーを作成しましょう。
LaTeX 記法：Qiita で \left \right は使えるか

# \left \right コマンドとは
LaTeX では，カッコ内の数式が垂直方向に長い場合，`\left`および`\right`コマンドを用いてカッコの大きさを最適化できる．

これが Qiita でも使えるのかが気になり，実証してみた．

```TeX:実証内容
( \frac{1}{1+\frac{1}{x}} )\\          % \left \right コマンドなし 
\left( \frac{1}{1+\frac{1}{x}} \right) % \left \right コマンドあり
```

# 実証結果
問題なく機能することがわかった．

```math
( \frac{1}{1+\frac{1}{x}} )\\
\left( \frac{1}{1+\frac{1}{x}} \right)
```
Questのアナログスティックを使ってオブジェクトを回転させる方法 備忘録

## アナログスティックを使ってクルクルさせたいがために作りました。

```
int saveRotation = 0;
int currentRotation = 0;
float dragAngle = 0;
int lastSavePoint = 0;

void Update()
{
    if (OVRInput.GetDown(OVRInput.Button.PrimaryThumstickUp)
       || OVRInput.GetDown(OVRInput.Button.PrimaryThumstickRight)
       || OVRInput.GetDown(OVRInput.Button.PrimaryThumstickDown)
       || OVRInput.GetDown(OVRInput.Button.PrimaryThumstickLeft))
    {
        Vector2 pos = Vector2.zero;
        dragAngle = Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg;
        currentRotation = saveRotation;
    }

    if (OVRInput.Get(OVRInput.Button.PrimaryThumstickUp)
       || OVRInput.Get(OVRInput.Button.PrimaryThumstickRight)
       || OVRInput.Get(OVRInput.Button.PrimaryThumstickDown)
       || OVRInput.Get(OVRInput.Button.PrimaryThumstickLeft))
    {
        Vector2 pos = OVRInput.Get(OVRInput.Axis2D.PrimaryThumbstick);
        int rotation = -(int)((Mathf.Atan2(pos.y, pos.x) * Mathf.Rad2Deg) - dragAngle);
        currentRotation = rotation + saveRotation;
        transform.localRotation = Quaternion.Euler(0, 0, -currentRotation);
        if (currentRotation > lastSavePoint && currentRotation - lastSavePoint == 1)
        {
            // 角度が上がった時の処理
        }

        if (lastSavePoint > currentRotation && lastSavePoint - currentRotation == 1)
        {
            // 角度が下がった時の処理
        }
    }

    if (OVRInput.GetUp(OVRInput.Button.PrimaryThumstickUp)
       || OVRInput.GetUp(OVRInput.Button.PrimaryThumstickRight)
       || OVRInput.GetUp(OVRInput.Button.PrimaryThumstickDown)
       || OVRInput.GetUp(OVRInput.Button.PrimaryThumstickLeft))
    {
        saveRotation = currentRotation;
        transform.localRotation = Quaternion.Euler(0, 0, currentRotation);
    }
}
```
AWSの請求アラート・アラームの設定について[2020/06/18]

QiitaでもAWSの請求アラート設定についてはもう色々な記事で紹介されていることはご存知かと思います。
が、今回私も設定しておこうと思い立って、2019年の記事見てやってたら？？なんぞ？なんかレイアウトちゃいますやん。ということで2020年6月18日現在の請求アラート設定についてまとめます。

以下の内容は[公式サイト](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html)を参考にしました。
もし、この記事の内容ともまたUIとか変っちゃってた場合には公式サイトを確認しましょう。

# AWSの請求アラームについて
要するに課金請求があった際とかに、知らせてくれる機能です。この設定ついては、

1. 請求アラートの有効化
2. 請求アラームの作成

この2つを行う必要があります。

## 請求アラートの有効化
サービス > Billingを選んで、ナビゲーションペイン(画面の左側にあるやつ)からBillingの設定を選択
コスト管理設定の2つにチェックを入れ(必要ならメールアドレスも入れ)、設定の保存
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/cdc8059e-e1d6-8add-3247-fb25242ad692.png)

## 請求アラームの作成
### 1. サービスのCloudWatchを開く
### 2. リージョンを米国東部（バージニア北部）に変更する。
請求情報は米国東部（バージニア北部）リージョンに保存されているから、このリージョンじゃないと請求メトリクスを参照できません。
### 3. ナビゲーションペイン > アラームからアラームの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/c96c20b7-30e1-f42a-9c69-94bb2c9c82d2.png)
### 4. メトリクスの選択を選び、「全てのメトリクス」タブで請求→概算合計請求額を選択
3.でも書きましたが、リージョンが米国東部(バージニア北部）になっていないとここで一覧に請求が表示されません。
### 5. 通貨のUSD横にあるチェックボックスをオンにして、メトリクスの選択を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/d1943abc-bd87-3c52-650f-233caf8f4d8f.png)
### 6. とりあえず無料枠を超えたという条件で設定します。
条件を画像のように設定し、次へを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/52b1e6b6-df3b-1aa4-1f7b-c128915106a6.png)
### 7. アクションの設定
アラーム状態トリガーはアラーム状態を選択
SNS トピックの選択で、作成していなければ自分のメールアドレスとかでトピックを作成して、次へを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/0b438d87-8a2e-ffbc-8550-19ddde99ac0b.png)
### 8. アラームの名前と説明を入力し、次へを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/58122813-c645-044e-4f10-40581bd75795.png)
### 9. プレビューから設定情報を確認し、下部にあるアラームの作成を選択
### 10. 確認
作成が完了すると以下のような画面が表示されます。
「一部サブスクリプションが確認待ちの状態です」はSNSトピックが承認されてないことを表し、今回はメールですが、登録したメールアドレスに承認確認メールが届いてます。
- 作成したアラームの状態が「データ不足」になってることがありますが、これはアラームの設定不備という場合もあるらしいですが、私の場合にはデータの反映間隔によるものでした1,2分待ったら消えました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/8320db96-92e3-066b-f254-a5751a5e2808.png)

## アラームを削除する場合
不要になったら削除する。
### 1. サービスのCloudWatchを開く
### 2. 必要に応じてリージョンを米国東部(バージニア北部)に変更
### 3. ナビゲーションペインからアラームを選択
### 4. アラームの横にあるチェックボックスにチェックを入れ、アクションから削除
### 5. 確認メッセージに対応して完了

# まとめ
とりあえず私は0, 1, 5ドルそれぞれを超えた場合のアラームを作成してみたら0ドルがアラーム状態になってて請求内容確認してみたら使ってないElasticIP(NATゲートウェイ用に作ったやつ)を放置したままにしちゃってて課金されてました。気をつけよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656102/8247fed8-d648-507a-5ff5-da9be2049a63.png)
Windowsでcreate-react-appを実行しようとしたらパスが通っていなくて使えなかったので、パス通さないで使おうとしてみた。

##はじめに
フロントエンド初心者が急にreactを触ってみようと思ったら、いきなり躓いたので自分用にメモしています。
ついでにQiitaの記事投稿の練習。お作法が全く分からない。

##起こったこと
適当な環境構築の記事を参考にしつつcreate-react-appをyarnでインストールして使おうとしたらパス通ってなくて使えませんでした。

```javascript
> yarn global add create-react-app
---省略---
> create-react-app my-app
'create-react-app' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

##先に解決策
```javascript
yarn create-react-app my-app
```
これで出来ました。
とりあえずreact使ってみたいだけなのでパス解消しなくても良いかな。

##やってみたこと・調べてみたこと
###yarnのbinのパス
以下のコマンドでyarnのbinのパスが確認できます。

```javascript
> yarn global list (グローバルのbinフォルダを調べたい場合)
> yarn list        (ローカルのbinフォルダを調べたい場合)
```

今回はグローバルにインストールしているので、グローバルのbinフォルダにパスを通してあげれば使えそう。
でもこのコマンドのためだけにパス通すのがなんか嫌。

###適当に実行してみる
色々試していたら「yarn create-react-app my-app」で実行できました。なんでだ。
ちなみにyarnの書式は以下。

```
  Usage: yarn [command] [flags]
```
[command]を省略すると普通「install」が実行されるらしいのですが、どうも実行されている挙動が違う。

###yarn run

調べてみたらどうも「yarn install」だけでなく「yarn run」もコマンドを省略して実行されるケースがあるようでした。
>yarn run test -o --watch
---省略---
このコマンドでも run を省略することができ、各スクリプトは名前を渡すことで実行されます。
https://classic.yarnpkg.com/ja/docs/cli/run

引数を指定しないで「yarn run」をすると実行できるスクリプトの一覧が確認できるそうなので、確認してみます。

```
>yarn run
yarn run v1.22.4
info Commands available from binary scripts: create-react-app, create-react-app.cmd, envinfo, envinfo.cmd, mkdirp, mkdirp.cmd, node-which, node-which.cmd, rimraf, rimraf.cmd, semver, semver.cmd
error There are no scripts specified inside package.json.
Done in 0.07s.
```
少し分かりにくいですが、「create-react-app」が存在しています。

##結論
ということで実際には「<font color="Magenta">yarn run create-react-app my-app</font>」が実行されていたということでした。

時間かかった割にショボい結果でした。
前提となる知識が全くない状態なので色んなことが省略されていると、ほぼ理解できずに進んでしまう。

新しいことを知るのは楽しいですね！
IE11でSVGにフォーカスがあたらないようにする

## 結論

`focusable="false"` を指定してやることで解決した。

## 背景

タブキーによるフォーカス移動が上手くいかないとのことで、

確認してみるとSVGの画像にフォーカスがあたっていたためだった。

なお、 Google Chrome, Firefox, Internet Explorer にて確認したが、

フォーカスがあたるのは Internet Explorer のみであった。

## 確認した環境

|ブラウザ         |バージョン                                  |結果                    |
|-----------------|--------------------------------------------|------------------------|
|Google Chrome    |78.0.3904.97（Official Build） （64 ビット）|フォーカスがあたらない  |
|Firefox          |52.0.2                                      |フォーカスがあたらない  |
|Internet Explorer|11.0.9600.19540                             |フォーカスが **あたる** |

## 検証用HTML

<p class="codepen" data-height="265" data-theme-id="dark" data-default-tab="html,result" data-user="jz4o" data-slug-hash="BazPpZm" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="BazPpZm">
  <span>See the Pen <a href="https://codepen.io/jz4o/pen/BazPpZm">
  BazPpZm</a> by jz4o (<a href="https://codepen.io/jz4o">@jz4o</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
ガチのプログラミング初心者がrailsの開発環境としてDockerを勉強

##投稿する背景
未経験から自社開発企業さんへの転職を目指して少しでも技術力向上できるように、Dockerについてアウトプットしていきたい。


##このページについて
主にはDocekrfile、docker-compose.ymlの中身についてです。
色んなページを読んで掴んだイメージを記載していくので、間違いがあれば訂正して頂けると幸いです。

##参考URL（本当にありがとうございました）
https://qiita.com/nsy_13/items/9fbc929f173984c30b5d
https://qiita.com/soushiy/items/0945bcbc7ecce4822985
https://qiita.com/miyasakura_/items/87ccb6d4a52d4a00a999




##Dockerとは？？
・コンテナ型の仮想環境とのこと
・とりあえず軽量で高速動かせるから便利
・簡単に環境構築ができちゃう（最初めっちゃ苦労したっちゅうに。。。）


##他の仮想環境と何が違うのか。
・VirtualBoxを使って仮想環境を作る時は、ホストOS(Macなど)の上でハイパーバイザーというもの利用してゲストOS（LINUXなど）を動かしているから、遅くなる。
・チーム開発をしている時に他のメンバーと環境を合わせるのが大変。


##Dockerを使うにあたっての大まかな流れ
１：Dockerをインストール（私の場合はDocker for Mac）
２：Dockerfile作成
３：Dockerfileをもとにイメージを作成←build
４：作成したイメージをもとにコンテナをつくる←run
５：開発できるようになる


##環境構築のための準備
・Dockerfile
・docker-compose.yml
上記のファイル２つが設計図のようなもので、ここから環境が構築される！！！



###Dockerfileの中身
```Dockerfile
FROM ruby:2.6
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /アプリ名
WORKDIR /アプリ名
COPY Gemfile /FANTRA/Gemfile
COPY Gemfile.lock /FANTRA/Gemfile.lock
RUN bundle install
COPY . /アプリ名

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]


```
1行の操作を｛命令｝と｛引数｝を表している。｛命令｝で大文字と小文字を識別しないけど、分かりやすいように大文字で書くのが基本！！！！

◆各コマンドの意味は以下の通り。

| 命令              |      用途         |
|:-----------------|:------------------|
| FROM | 元となるDockerイメージの指定       |
| MAINTAINER | 作成者の情報|
| RUN | コマンドの実行 |
| ADD | ファイル／ディレクトリの追加 |
| CMD | コンテナーの実行コマンド 1 |
| ENTRYPOINT | コンテナーの実行コマンド 2 |
| WORKDIR | 作業ディレクトリの指定 |
| ENV | 環境変数の指定 |
| USER | 実行ユーザーの指定 |
| EXPOSE | ポートのエクスポート |
| VOLUME | ボリュームのマウント |




###docker-compose.ymlの中身
```docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - '3306:3306'
    command: --default-authentication-plugin=mysql_native_password
    volumes:
      - mysql-data:/var/lib/mysql
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/アプリ名
+     - bundle:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
    stdin_open: true
    tty: true
    command: bundle exec rails server -b 0.0.0.0
volumes:
  mysql-data:
    driver: local
+ bundle:
+   driver: local
```
参考ページと違うのが「+」の部分。これを書き足すことで、bundle installの後にbuildをわざわざする必要がなくなって、作業スピードを早められる。（volumeの永続化って呼ぶらしい）



##build（イメージを作成する）
railsアプリを作成するためにGem、Gemfile.lock、entrypoint.shを設定したらイメージをビルドする。
```
$ docker-compose build
```
buildを行うと、Dockerfileに書かれたCOPYやRUNなどのコマンドが実行され、イメージが作成される。runすると、ENTRYPOINTに書かれたコマンドがコンテナ上で実行される。

・イメージとは？
コンテナの素で、イメージからコンテナが起動される。
基となるDocekrfileをビルドして作成する。






##おわりに
railsの環境構築をするためには他のファイルについても書く必要があるけど、とりあえずdocker-compose.yml・Dockerfileについてだけ。
もっといい書き方が合ったり、プログラミング初心者でもDockerの理解が深めることができるページがあればぜひ教えて頂きたいです。

色んなページをみてると勉強不足が露呈して焦るのでもっと勉強します！！！
賢くなったらどんどん編集していくのでよろしくお願い致します。
WSL2が突然起動しなくなったときに参考にしてください

# **何もしていないのにパソコンが壊れた！**
掲題のとおりです。

環境は

 - Windows10 home
 - Ubuntu

まあよくあるWindowsでの開発環境じゃないですかね。
homeなのでWSL2がつかえなくなるとDockerが使えなくなって不便です。

## 症状
Ubuntuを起動しようとしても

```ruby:ubuntu
wsl 2 press any key to continue...
```

としか出なくなりました。
ちなみに使えなくなる前日にWindows Updateが自動で行われていたので原因はそれじゃないかと。。。(私は何もしてないので急に使えなくなると焦る)

## やったこと
 - まずはWindows Update。とりあえず検索したらアプデしてないと出るかもってことでアプデをかけてみる。更新しきれていないプログラムがあるっぽいんでとりあえずそれを更新。再起動する。が、ダメ！！
 - Windowsの機能の有効化または無効化から、Windows Subsystem for Linuxのチェックを外して付け直して再起動する。が、ダメ！！
 - Windows Updateのアンインストール。再起動する。が、ダメ！！
 - Power Shellにてwsl --updateを実施。カーネル ファイルが見つかりません。ダメ！！

##　結論
よくわかんないけどカーネルぶっ壊れたっぽい。

```ruby:Powershell
PS C:\WINDOWS\system32> wsl --update --status
WSL の自動更新が有効になっています。
WSL 2 カーネル ファイルが見つかりません。カーネルを更新または復元するには、'wsl.exe --update' を実行してください。
PS C:\WINDOWS\system32> wsl.exe --update
更新をチェック中...
利用できる更新はありません。
WSL 2 カーネル ファイルが見つかりません。手動での再インストールまたは修復が必要な可能性があります。
詳細については、https://aka.ms/wsl2kernel をご覧ください。
```
というので、
https://aka.ms/wsl2kernel
へ行き最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロードしインストール。

```ruby:Powershell
PS C:\WINDOWS\system32> wsl.exe --update
更新をチェック中...
利用できる更新はありません。
カーネル バージョン: 4.19.104
```

恐る恐るUbuntuを起動すると、無事起動できたのであった(Dockerとかの環境も残ったまま)

とても焦ったし、原因不明で再発したらいやだな～って思うけどとりあえず動いてるからヨシ！！
(右往左往して2時間ぐらい溶けました。)
開発のdocker-compose紹介

## 紹介

[自分のブログ](https://zamberform.github.io/)にも載ってあります

## 背景

一般的にサービスを開発する時が、幾つのものは欠かせないです。

- `RDB(MysqlやPostgres)`: 書き込みや読み込み時の速度はあんまり期待しないですが、関係性DBのため、データの保存や処理は優れています。
- `NoSql(RedisやMongo)` : Mongoは変な道に歩みましたが、今まで、RedisはKVSの機能として、書き込みや読み込み早いものです、キャッシュとして大活躍しています。
- `Proxy(HAProxyやNGinx)`: リクエスト来た時が処理はどうすべきかの重要な入り口です。

サービスを構築する時が必ず考えない行けないものですね。

さらに、Cloudサービス発達している今は、Dockerを使って、上記を含めて考える時代です。

でも、最初のdemoやローカル開発する時が、これら揃っていない、もしくは、自分テストのため、自分のものに接続したいとかあるでしょう。

ここで、個別に上記のものを作って、CLIやGUIで調整やDebugしやすいようにできるようになったら、便利ですよね。

[starの方お願いします](https://github.com/zamberform/dev-tools-with-docker)

### Mysql

こちらは `phpmyadmin `と一緒に作るによって、

`127.0.0.1:8080` で直接mysqlのデータ弄ることができた。

### Postgres

Mysqlと同様、`Postgres `には`Postgres GUI`と一緒にやると、なかなか楽にデータを弄れますね。

MysqlとPostgresどっちかを選ぶため、同じく `127.0.0.1:8080` にしています。

### Redis

Redisには `RedisCommander ` で調節しています。

多くはRDBと一緒に共同作業のため、`127.0.0.1:8081`にしています。 

### MongoDB

`MongoDB`は関係性みたいなデータを保存することができますが、速度や効率落ちるため、自分はあんまに使いたく無いので、`127.0.0.1:8081`にして、`Mongo-Express`で管理します。

### Minio

AWSのS3ローカル版として、幅広く使っていました。

pythonではboto3で直接使えるため、すごく便利かと思います。

こちらは、`minio`とCLIツールの`minio-support`一緒に使っています。

`minio`だけでもいいかと思って、S3みたいに、コマンドでアップロードするバッチとかあり得るため、CLI付けていました。

### Proxy

入れようと思ったけど、ネットワークの構成やDNSの具合によって、設定は結構バラバラになるかと思います。

こちらはおすすめになれるのは`HAProxy`です。

LBとして、素晴らしいです。

まだ、`NGINX`とかいうけど、LBとしての機能やロジックは`HAProxy`の方が選択肢多いですね。
`NGINX`はお主に、WEBの入り口として扱う方がいいかと思います。

原因は、NGINXは膨大化を避けるためです、dockerを使う前提として、役割をちゃんとわかるようになったら、ビジネスPRや構築の時、メリット大きいです。

## 最後

ローカルのdemoといい、サービスの初期開発やdebugといい、こちらのdocker-composeツールを使ったら、自分のdebug環境は好き放題やれます。

一つコツあります。

```
docker-compose up (-d)
```

上記のコマンドを使う人が多いと思いますが、

```
docker-compose -f [自分のdocker-compose yml ファイル] up (-d)
```

で起動できます。

もし良ければ、こちらにこちらの設定を打ち込んでもいいかとお勧めしたいです。


もう一度[starの方お願いします。](https://github.com/zamberform/dev-tools-with-docker)
<Summary>コメントの有用性

# \<Summary>ってなに？
- 関数につけるコメント
- 関数の説明とか仕様とかを書き記せる
- 実はコメントと言いながらXMLドキュメント
- 関数の上にカーソルを当てると出てくる説明がこれ

# とにもかくにも使ってみよう
```cs
/// <summary>
/// 名前を自動で出力
/// </summary>
/// <param name="param1">スタイルの指定(0:日本語 1:英語)</param>
/// <returns>成功ならtrue,失敗ならfalse</returns>
public bool PrintName(int param1) {
    if (param1 == 0) {
        Console.Write("山田太郎");
    } else if (param1 == 1) {
        Console.Write("Yamada Taro");
    } else {
        return false;
    }
    return true;
}
```
今回は関数の上に記述していますが、関数定義後でも大丈夫(だったはず)です。
VisualStudioで開発する場合はこのコメントを折りたたむようにしておけばコードリーディングの際に余分な行を隠せるので効率が良くなります。

# ほかにもいろいろなタグが
[Microsoftの公式](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/xmldoc/summary)にいろいろ載ってます。必要に応じて使ってください。
UE4 Editorでドロップダウンメニューがブレるときの対応方法

# 発生した現象

UE4.25.1にアップグレードしたプロジェクトでEditor上部にあるFile、Edit、Windowなどのメニューを選択すると表示されるドロップダウンメニューがブレまくる。
ドロップダウンメニューの表示がブレるのでマウスで選択できずにキーボードでメニューを選択する必要がある。


# 対応方法

Editor PreferencesでEnable Window Animationsのチェックを外す
参照サイト：[UE4 Editor Bug - Drop Down Menus Shaking - Unreal Engine Forums](https://forums.unrealengine.com/unreal-engine/feedback-for-epic/1466583-ue4-editor-bug-drop-down-menus-shaking)
[4/10]トラディショナルな Java 開発者もクラウドネイティブへ - Cloud Run でアプリ開発 - 受講メモ

# サーバーレスとは

サーバ管理を必要としないアプリケーションの構築と実行の概念
サーバが必要ないのではなく、サーバの管理をしなくていい

# Knative
Googleが50社以上と一緒に作ってるオープンソースソフトウェア
k8sのリソースを抽象化
Knativeのsarving機能を拡張したものがCloud Run

# Cloud Run
GCP上でフルマネージドで提供している。基盤を完全に隠蔽化

# サーバレスVPC
VPCアクセスを使用しVPCネットワークに直接接続が可能
まだβ

# Cloud RunからCloud SQLへの接続
Cloud SQL用のJDBCドライバがあるのでそれを使う

# 開発環境
Cloud Code というのがある。
VSCodeやIntelliJのプラグイン。

Spring Bootアプリケーションとして作られる

## JIB
コンテナイメージが登録される。ここからデプロイが可能。

# Javaアプリのトレンド
軽量化→k8sやサーバレスを効果的に利用するため

# Cloud Runに向かないアプリ
スペックの制約を受けるもの(Cloud Runの制約を受ける)
ファイル書き込みしてるもの（コンテナなので）
長時間動くバッチは向かない。起動時間が決まっているrので(Cloud Runの制約を受ける)
flutterでアセットに任意の写真を保存して画面に表示させる

# やりたいこと

* 任意の写真.jpgをアセットとしてアプリ内に保存しておく。
* その写真を画面に表示する。


# 保存用ディレクトリの作成


flutter create を実行すると、

* android
* build
* ios
* lib

などのディレクトリが生成されるが、
その同列に、自分で任意のディレクトリを作成する。
たとえば

* images

を作成する。


そのディレクトリ内に、任意の写真、たとえば

sample.jpg

を保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/2879833e-e7cc-a2c4-6cb5-5ceae4924629.png)

# pubspec.yamlの編集

pubspec.yaml
の`flutter:`内に

```
  assets:
    - images/sample.jpg
```

を追記する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/cd8d1e20-baa1-581a-f2a1-199dd3d456ce.png)

# 表示する

```
Image.asset('images/sample.jpg'),
```
React Transition Group をCDNで読み込んで使う

#はじめに
Reactを勉強中の者です。Reactのアニメーションライブラリである、React Transtion GroupをCDNで読み込んで使いたかったのですが、インストールした上でimportしてから使う方法しか詳しく書いておらず、少し困ったのでここに、私の行った解決策をまとめておきます。具体的なReact Transition Groupの使い方は書いておりませんので、以下の公式ドキュメント参照してください。

>[React Transition Group](https://reactcommunity.org/react-transition-group/)

#やり方
##CDNでスクリプトを読み込む
React Transition Group のトップページにCDNのリンクがあるので、これをhtmlから読み込みます。ここではReact本体などもCDNで読み込んでいます。

```html
<!-- React本体などを読み込む -->
<script
      src="https://unpkg.com/react@16/umd/react.development.js"
      crossorigin
    ></script>
    <script
      src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"
      crossorigin
    ></script>

<!-- React Transition Group を読み込む -->
<script src="https://unpkg.com/react-transition-group/dist/react-transition-group.js"></script>
```

```
```

##React Transition Groupのコンポーネントを使う
CDNで読み込んだ場合、使いたいコンポーネントごとにimportすることができなかったので、以下のように書きました。

```react
<ReactTransitionGroup.Transition>

//アニメーションを適用したいコンポーネント

</ReactTransitionGroup.Transition>
```

#終わりに
JavaScript初学者なもので効率の悪い書き方かもしれません。もっとよい方法がありましたら是非ご教授ください。
HerokuでのRuby on Railsの表示に5時間かかった話

#HerokuでのRuby on Railsの表示に5時間かかった話
この程度のサイトを表示するのにリアル5時間かかった
↓リンク
https://arcane-oasis-65122.herokuapp.com/
##原因と解決
**1 gemの設定ミス**
これはググったらすぐに解決した
**2 bourbonの導入ミス**
筆者はAdobeのDreamweaverを使ってWEB開発をしているのでbourbon関係も全てDreamweaverに任せているのだがこれがいけなかったらしい
Dreamweaverではなくgemでインストール
bourbonとneatは
Gemfileに
`gem "bourbon"`
`gem "neat"`
application.scssに
以下のように記述したら解決
`@import "bourbon";`
`@import "neat";`
**3 Bittersの導入**
正直こいつが時間を消費したほぼ全ての原因
まずGemfileではなく
gemコマンドで直接インストールする
以下は公式サイトの手順
Ruby on Railsのアプリケーションディレクトリで
`gem install bitters`を実行
cdコマンドでapp/assets/stylesheetsに移動
`bitters install`を実行
application.scssに
`@import "base/base";`
公式サイトのやり方でやったらエラーが出た
解決方法はめちゃくちゃ簡単
app/assets/configにあるmanifest.jsに
`//= link_directory ../stylesheets/base .scss`この1文を追加するだけ
5時間の格闘はなんだったのか
**4 CSSが反映されない**
これも簡単に解決した
`<head></head>`の中にhome.scssを読み込む場合は
`<%= stylesheet_link_tag "home", :media => "all" %>`
と記述するだけ
#あとがき
多分他にもしたと思うが5時間も格闘したせいで覚えてない
EC2におけるwebサーバー構築作法と考え方【実践編②】

# 前提
この記事は、[EC2におけるwebサーバー構築作法と考え方【実践編①】](https://qiita.com/yt_kg/items/3fe95ef1c1b5357d5f38)の続編です。

# 事前準備
EC2を立てておく。
OSはAmazon Linux 2。

# いざ実践
- 単純にyum installでパッケージをインストールする場合
- amazon-linux-extrasでパッケージをインストールする場合
- 外部リポジトリをEC2に登録してからパッケージをインストールする場合

この３つを順番にハンズオンしていきますが、本記事では、

「amazon-linux-extrasでパッケージをインストールする場合」

をやります。

## yum installでインストール
今回は、redis4系をインストールしましょう

EC2へログインしてから以下の手順を進めてください

### インストールされているか確認
更新できたら、Redisがインストールされているか確認しましょう。

```
[ec2-user@xx ~]$ yum list installed | grep redis
[ec2-user@xx ~]$
```
何も表示されていなかったので、redisはインストールされていません。

### インストールできるか確認
redisがインストールされていないので、インストールする必要があります。

インストールできるかどうか、確認しましょう。

```
[ec2-user@xx ~]$ yum list available | grep redis
[ec2-user@xx ~]$ pcp-pmda-redis.x86_64                  3.12.2-5.amzn2                 amzn2-core
```

`3.12.2-5.amzn2`とあるので、4系じゃなさそうですね。
このままでは、amazon-linux-extrasで確認してみましょう。

### amazon-linux-extrasでインストールできるか確認
```
 [ec2-user@xx ~]$ amazon-linux-extras list | grep redis 

 NOTE: The livepatch extra is in public preview, not meant for production use 
  
 8  redis4.0                 available    \ 
```

インストールできそうですね。

### バージョン確認
```
 [ec2-user@xx ~]$ amazon-linux-extras info redis4.0 

 NOTE: The livepatch extra is in public preview, not meant for production use 
  
 redis4.0 recommends redis                      # yum install redis 
```

redis4系がインストールできそうですね。

### インストール
```
redis4.0 recommends redis                      # yum install redis
```
とあるので、`sudo yum install redis`を実行しましょう。

```
 [ec2-user@ip-xx ~]$ sudo yum install redis 

 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 
 amzn2-core                                                       | 3.7 kB  00:00:00 
 パッケージ redis は利用できません。 
 エラー: 何もしません 
  
  
 redis is available in Amazon Linux Extra topic "redis4.0" 
  
 To use, run 
 # sudo amazon-linux-extras install redis4.0 
  
 Learn more at 
 https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras 
```

これだとインストールできないみたいですね。しかし、実行すべきコマンドは教えてくれています。実行しましょう。

```
[ec2-user@xx ~]$ sudo amazon-linux-extras install redis4.0
```

途中確認されるので、メッセージを確認して`y`を押しましょう。

### インストールされているか確認
```
 [ec2-user@xx ~]$ yum list installed | grep redis 

 redis.x86_64                          4.0.10-2.amzn2.0.2             @amzn2extra-redis4.0 |
 [ec2-user@xx ~]$ 
 [ec2-user@xx ~]$ 
 [ec2-user@xx ~]$ yum info redis 
 読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd 
 インストール済みパッケージ 
 名前                : redis 
 アーキテクチャー    : x86_64 
 バージョン          : 4.0.10 
 (以下省略)
```

ちゃんとインストールされていますね。

### まとめ
デフォルトのままでインストールできない場合に、amazon-linux-extrasを利用しましょう。
次は外部リポジトリを使って、インストールします。