OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS】リージョンを理解する

#プログラミング勉強日記
2021年4月16日

#リージョンとは
　regionは日本語で「領域」という意味。AWSは世界を複数の"リージョン"に分割して、リージョンごとにクラウドコンピューティングサービスを提供している。
　日本の場合、東京リージョンと大阪ローカルリージョンの2種類存在する。

　それぞれのリージョンは独立したインフラ拠点で、あるリージョンで障害が発生した場合でも他のリージョンでは影響がないように設計されている。
　基本的にはアプリとして1つのシステム・1つのインフラを使う場合は1つのリージョン内で完結させる。ただ、リージョンをつなぐ方法もあって、隣接するリージョン間は広帯域の専用ネットワークで接続できる(後で詳しく記述する)。使い方としては、東京リージョンでインフラを構築して、物理的なバックアップを大阪ローカルリージョンに送っておくことで、地震や火災などの万が一のときにも、大阪ローカルリージョンの方で復帰させることもできる。

　<b>リージョンによっては使用できるAWSサービスの種類と料金が異なる。</b>1番最初に接続が提供されるのは米国東部(バージニア北部)のリージョンなので、東京リージョンでは最新の機能が使えない。


#リージョンの選択方法
　データやシステムに関する法律や社内規定を考慮したうえで、基本的には身近なリージョンを選択してAWSシステムを構築する。基本的には、事業継続性計画(BCP)などの対策のため、データや予備システムとして別のリージョンを利用する。ただし、<b>リージョンのある国の法律に影響される可能性も考慮する。</b>
　中国の場合、中国政府の要請に従ってAWS中国はデータを提示する義務が生じる。また、中国内のデータの持ちだす制限も設けられる。

#リージョン間の連携
　リージョン間では、専用線説zくしてレプリカが作成できるようになっている。連携方法としては以下の7つを紹介する。

##1. AWS Direct Connect Gateway経由で接続
　AWS Direct Connect Gateway経由で接続する方法がよく使われる方法。

##2. S3リージョン間のレプリケーション
　ストレージサービスのS3をリージョン間でレプリケーションしてバックアップする。

> レプリケーションとは、あるコンピュータやソフトウェアの管理するデータ集合の複製（レプリカ）を別のコンピュータ上に作成し、通信ネットワークを介してリアルタイムに更新を反映させて常に内容を同期すること。
引用文献：[IT用語辞典 レプリケーション](https://e-words.jp/w/%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html)

##3. インターリージョンVPC Peeringで接続
　リージョンが違うVPC間でペアリング接続・別々のVPCをつなげる。(VPCについては[こちらの記事](https://qiita.com/mzmz__02/items/bc5e78ff2c19f29430e5)で詳しく扱ってる。)

##4. EC2リージョン間でのAMIコピー
　別リージョンにあるEC2同士でEC2のイメージ(OSのようなもの)をリージョン間でまたいでコピーする。

##5. RDSリージョン間でのリードレプリカ
　データの保存・バックアップを行う。

##6. Route53 DNSフェイルオーバー
　フェイルオーバーの仕組みをリージョン間で作る。フェイルオーバーは、稼働中のシステムに問題があってシステムやサーバーが落ちてしまったときに自動的に待機システムに切り替える仕組みのこと。

##7. DynamoDBリージョン間でのレプリカライブラリ

　

#参考文献
[レプリケーション 【replication】](https://e-words.jp/w/%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3.html)
軽量JavaScriptエンジン “QuickJS” を試す (2021-04-16)

「[qiita:C/C++に組み込める軽量JavaScriptエンジン “QuickJS” を試す](https://qiita.com/taskie/items/16cdbc69d4fd4a3dccbf)」を追体験する。
(環境は Windows10 pro + docker desktop からの Debian busterである)

# https://bellard.org/quickjs/

```shell_session:
C:\> docker run -it debian:latest

root@2afe0cfe2c13:~# apt-get update
root@2afe0cfe2c13:~# apt-get install gcc git
root@2afe0cfe2c13:~# git clone https://github.com/bellard/quickjs.git
root@2afe0cfe2c13:~# cd quickjs
root@2afe0cfe2c13:~/quickjs# make install
root@2afe0cfe2c13:~/quickjs# ls -la $(which qjs)
956 -rwxr-xr-x 1 root root 978248 Apr 16 10:04 /usr/local/bin/qjs
```

小さい。かわいい。

続いて [JS ファイルをコンパイルする](JS ファイルをコンパイルする) を試す。

```
root@2afe0cfe2c13:~# ls -la a.out
-rwxr-xr-x 1 root root 5478048 Apr 16 10:31 a.out
root@2afe0cfe2c13:~# strip a.out
root@2afe0cfe2c13:~# ls -la a.out
-rwxr-xr-x 1 root root 888104 Apr 16 10:33 a.out
root@2afe0cfe2c13:~# ./a.out
Hello, Alice!
```

興味があるのは、これポータビリティあるかどうかということ。
もう一個、まっさらなdebian:latest を起動してコピーして実行してみた。動くじゃないか!!

```shell-session:
root@87bbb47e078a:~# ./a.out
Hello, Alice!
root@87bbb47e078a:~# qjs
bash: qjs: command not found
```

これは面白そう。
バッチファイルに引数が無ければ終了する

Y子です。
引数が必須のバッチファイルには、「引数が無い場合の処理」が欠かせません。
今回は、「引数がなければ終了する」という処理を考えます。

# 概要・用途
引数の有無を確認し、無い場合は終了します。
引数が必須の処理の冒頭に記述することで、エラーを防ぎます。
なるべく短く書きます。
_【[確認環境：Windows 10 Home (Bld. 19042.867)](https://qiita.com/koiwaiwaiko/items/ef2d457ae1e1a7c8b698 "Windows10のバージョンを確認・表記する")】_

# コード
## (1) シンプルな例
これまでの記事でも使っている書き方です。

```bat:argument_check1.bat
@echo off
rem 引数がない場合は終了する
if "%~1"=="" (
  echo 引数がありません
  pause
  exit /b
)

rem 引数があった場合の処理
echo 引数：%~1
```

第1引数が空文字と一致すれば、引数無しと判定しています。
その際、第1引数は「`$1`」（ダブルクオート付きの場合がある）ではなく、「`%~1`」（ダブルクオートがあれば削除）を使います。
引数があれば、その引数を出力することにします。

引数が無い場合・ある場合の動作確認をしてみます。

```:実行結果
> argument_check1.bat
引数がありません
続行するには何かキーを押してください . . .

> argument_check1.bat aaa
引数：aaa
```

## (2) コンパクト版
(1)は「シンプルな例」と言いながら5行も使っているので、行数を節約した書き方も考えてみます。

```bat:argument_check2.bat
@echo off
rem 引数がない場合は終了する
if "%~1"=="" (echo 引数がありません & pause & exit /b)

rem 引数があった場合の処理
echo 引数：%~1
```

複数のコマンドを「`&`」でつないで、1行で書けてしまいました。

```:実行結果
> argument_check2.bat
引数がありません
続行するには何かキーを押してください . . .

> argument_check1.bat bbb
引数：bbb
```

もちろん、実行結果は5行のときと同じです。
引数チェック処理が主目的でなければ、このようにコンパクトに書いた方が、本来の目的のコードに集中できてよい気がします。

# おわりに
行数を減らす試みは奥が深そうです。
コードが読みやすい範囲で、いろいろ工夫してみたいです。

ではまた！
emacs-lisp 複数行コメントアウト

emacsで複数行コメントアウトがしたかったので、lispでショートカットキーを作ってみました。
コードは若干冗長な気がする。。

こちらを参考に作成。
http://ganmacs.hatenablog.com/entry/2013/12/01/140306

ドラッグして領域を選択し、`Ctrl-/`でコメントアウト。
領域の先頭行から末尾までをコメントアウトする仕様。

```elisp:emacs.d/init.el
(defun lines-comment (begin end)
  (interactive "r")
  (save-excursion
    (if (region-active-p)
      (progn (goto-char begin)
      (beginning-of-line)
      (set-mark (point))
      (goto-char end)
      (end-of-line)
      (comment-or-uncomment-region (region-beginning) (region-end))
      )
      (beginning-of-line)
      (set-mark (point))
      (end-of-line)
      (comment-or-uncomment-region (region-beginning) (region-end)))))
(global-set-key (kbd "C-/") 'lines-comment)

```

#追記

上記のコードだとファイルを開いてから`C-@`などでリージョンを選択していない状態では`The mark is not set now, so there is no region`というエラーになってしまっていた。`(interactive "r")`のところでリージョン選択されていることが必要なようだった。
　　なので`(interactive)`にしてリージョンの取得は`(region-beginning)`と`(region-end)`で行う。`(interactive "r")`を使うと変数`begin`と`end`でリージョンを取得できてよいと思っていたけれど、よく理解できていなかった。

```elisp:emacs.d/init.el
(defun lines-comment ()
  (interactive)
  (save-excursion
    (if (region-active-p)
      (progn 
	    (setq original_begin (region-beginning))
	    (setq original_end (region-end))
	    (goto-char (region-beginning))
	    (beginning-of-line)
	    (set-mark (point))
	    (goto-char original_end)
	    (end-of-line)
	    (comment-or-uncomment-region (region-beginning) (region-end))
      )
      (beginning-of-line)
      (set-mark (point))
      (end-of-line)
      (comment-or-uncomment-region (region-beginning) (region-end))
)
))
(global-set-key (kbd "C-/") 'lines-comment)
```
AtreugoでGo標準搭載のテンプレートエンジンを使う

※主に備忘録で書いているので至らない点があることをご了承ください

# まずAtreugoって何？

Qiitaの検索で掛けても引っかからなかったのでとりあえず説明入れておきます。

AtreugoはGo言語向けのウェブフレームワークです。
fasthttpをベースとして開発されています。
https://github.com/savsgio/atreugo

TechEmpowerが掲載しているWeb Framework Benchmark Round 20では、Go言語内では上位にランクインしています。
https://www.techempower.com/benchmarks/#section=data-r20&hw=ph&test=fortune&l=zijocf-sf

# 本題

テンプレートとソースコードは同じディレクトリとします。

```html:template.tpl
<h1>Template is works!</h1>
<p>Now: {{ .Now }}</p>
```

```go:main.go
package main

import (
	"github.com/savsgio/atreugo/v11"
	"text/template"
	"time"
)

func main() {
	config := atreugo.Config{
		Addr: "127.0.0.1:8000"
	}
	server := atreugo.New(config)
	app.GET("/", renderIndex)

	if err := app.ListenAndServe(); err != nil {
		panic(err)
	}
}

func renderIndex(ctx *atreugo.RequestCtx) error {
	tpl := template.Must(template.ParseFiles("template.tpl"))
	data := map[string]string{
		"Now": time.Now().Format("2006-01-02 15:04:05"),
	}
	ctx.SetContentType("text/html")
	return tpl.Execute(ctx, nil)
}
```

テンプレートの`Execute`関数にそのまま`*atreugo.RequestCtx`を入れるだけでOKでした。
（`*atreugo.RequestCtx`は`io.Writer`のインターフェースを満たしているため）
ただ、`ctx.SetContentType`を設定してあげないとそのまま書かれてしまうので、`text/html`を入れてHTMLファイルとして認識してもらうようにします。

HTTPステータスコードを変えるときは`ctx.Response.Header.SetStatusCode`を関数内に入れればOK。

# 結論

- `Execute`の第一引数に`*atreugo.RequestCtx`を入れる
- `ctx.SetContextType`でテンプレートに応じた形式にしておく
- ステータスコードを変えるときは`ctx.Response.Header.SetStatusCode`を関数を用いる
【VBA】単純作業を自動化したく

#作業背景
あるディレクトリからファイルを検索し
開いたExcelファイルから特定の文字列を抽出
抽出した文字列を別のExcelに転記したいという内容になります。

#登場人物
転記するExcelファイル
転記元情報のExcelファイル

#縛り
現場で対応するので
一般的なwindowsで最初から用意されている中で自動化を考えてます。
(本当はpythonやRPAを使ってみたい)

#処理
まだ作り始め。
これから更新かけていく予定。
今回は基本の動きを固定値使ってテストして処理が動くかだけ確認。
なので、実際はファイル跨ぎますが、1ファイル内の別シート参照で作っています。
変数名は適当。作りながら変えていきます。

```

Sub test()
 Call readA
End Sub

Private Function readA()
Dim r As Range

'別シートの値を読み取って転記する
Set r = Worksheets(1).Columns(1)  'Worksheets(1)=1枚目のシート　Columns(1)=A列(B列の場合2)
   r.Select 'セル選択
   MaxRow = ActiveCell.End(xlDown).Row 'ActiveCell=選択中のセル .End(xlDown).Row=最後の行番号取得
   Range("B3").NumberFormatLocal = "yyyy/mm/dd"  '書式設定の変更
   Range("B3").Value = Worksheets(1).cells(MaxRow, 1).Value

Set r = Worksheets(1).Columns(2)
   r.Select
   MaxRow = ActiveCell.End(xlDown).Row
Range("C3").Value = Worksheets(1).cells(MaxRow, 2).Value
   
   'TODO
   '①excelファイルを開く
   '②一定のディレクトリで①をループさせる
   '③表題の文字列を検索する
   '④③の文字列の位置から「別シートの値を読み取って転記する」を実施
   '⑤③から④を繰り返す
 
End Function
```
Redis(レディス)について調べてみた

Laravel8では`Laravel Sail`を利用してインストールしていればデフォルトでDockerコンテナに入っています。
職場の先輩方が「Redisで保存するのかDBに保存するのか」みたいな会話をしており、何が違うのかイマイチわかっていなかったので調べてみました。

はっきりと理解できていないので間違いなどありましたらご指摘頂けると幸いです。

## Redis

Laravel8の日本語翻訳ページ(非公式)には以下のように記載がありました。
https://readouble.com/laravel/8.x/ja/redis.html

>Redisは、オープンソースの高度なキー／値保存域です。
文字列, ハッシュ, リスト, セット, and ソート済みセット.を含めることができるため、データ構造サーバと呼ばれることがあります。

キーバリューストア型なんですねー。

Redisの公式ページには以下のように記載がありました。(Google翻訳ですみません)
https://redis.io/

>Redisは、オープンソース（BSDライセンス）のメモリ内データ構造ストアであり、データベース、キャッシュ、およびメッセージブローカーとして使用されます。Redisは、文字列、ハッシュ、リスト、セット、範囲クエリを含む並べ替えられたセット、ビットマップ、ハイパーログログ、地理空間インデックス、ストリームなどのデータ構造を提供します。Redisには、組み込みのレプリケーション、Luaスクリプト、LRUエビクション、トランザクション、およびさまざまなレベルのオンディスク永続性があり、RedisSentinelおよびRedisクラスターによる自動パーティショニングを介して高可用性を提供します。

うん。全然分からん。
メモリの中に保存されるってことは分かりました。
では、そんなにたくさんは保存できないのかな？と。


## 特徴

色々な記事を参考にさせて頂き、分かった特徴は以下です。

#### ①データ型

- string
- hash
- list
- set
- sorted set


#### ②非リレーショナルデータベース(NoSQL)なので、ビックデータに強く高速な処理が期待できる。

何故非リレーショナルデータベースだと処理が高速なのかというと、リレーショナルデータベースって同時に書き換えとかできなかったり、処理が最後までうまくいって初めて完了するようになっているからなのかなと。
例えば以前[Qiita](https://qiita.com/mumucochimu/items/8c1d161aed9f7dd93363)でも書いたのですが、ATMで振り込みしてる途中にサーバーが落ちて振り込み処理はしたけど相手には振り込みされていないみたいなことになったら大変なので、処理はひとかたまりで完了するようになっている。
と、いうことは例えわずかでも処理待ちみたいな感じになるので、扱うデータによってはパフォーマンスが落ちるということになるのかなと。

と、いうことはつまりデータの消失が絶対許されない場面では使えないのですね。
なるほど。


## 利用用途

具体的にどういう場面で使うのがいいのだろうと色々な記事を見てみました。

#### ①キャッシュ用途

RDBMSのキャッシュ用途として使われることが多いみたいです。
RDBMSの代わりに使うというよりも追加で使うっていう感じなんですね。

#### ②ページの訪問回数

確かにたくさんの人が訪問するページでRDBMSで回数を取得しようとしていたら、ロックかかりすぎてパフォーマンスやばそうですね。ここはRedisの良さを十分発揮できそうです。

#### ③いいねの数

確かにインフルエンサーなんてすごい数のいいねを押されるからそこの処理が遅延していたら大変な気がします。
なるほど。


利用用途はなんとなく分かりました。


## 参考ページ

[Redis（レディス）とは何か？](https://meetup-jp.toast.com/2529)
[【入門】Redis](https://qiita.com/wind-up-bird/items/f2d41d08e86789322c71)
[Redisの特徴について容易にまとめてみた](https://qiita.com/tomu28/items/8f13145bd8d45523a195)
【AWS】ECR に Docker の image を push する

# はじめに
ECR に Docker の image を build して push するまでの手順を記します。

# 1. image の build
~~~
docker build -t {ECRのリポジトリ名} .
~~~

# 2. image の push
1. で build した image にタグ付


~~~
docker tag {ECRのリポジトリ名}:latest {ECR の URI(xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名)}
~~~

ECR にログイン

~~~
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
~~~

ECR に push

~~~
docker push xxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名
~~~
v-on:clickで文字を反転させる

#####はじめに
Vue.jsを学習中の備忘録としてアウトプット。
Vue.jsはスッキリしてていいですね。


<br>

###結果

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="rm5912" data-slug-hash="dyNKamo" 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="Vue.js反転">
  <span>See the Pen <a href="https://codepen.io/rm5912/pen/dyNKamo">
  Vue.js反転</a> by morioka (<a href="https://codepen.io/rm5912">@rm5912</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



```vue.js
const app= new Vue ({
    el: "#app",
    data: {
        message: 'Hello World'
    },
    methods: {
        reverseMessage: function() {
            this.message =
            this.message.split('').reverse('').join('')
        }
    }
})
```
elでidを指定して,
dataの中にmessageを記述。
methodsでreverseMessageメソッドを作成して
メッセージをsplitで区切ってから反転、joinで結合して返してます。
<br>
  

```index.html

<div id = "app">
    <p>
        {{ message }}
    </p>
    <button v-on:click="reverseMessage">メッセージ反転</button>
</div>
```

マスタッシュ構文でmessagemを囲んで表示。
v-on:clickにメソッドを指定してイベント発火するようにしてあります。
C言語入門

#C言語の基本的な知識、用語まとめ
_1.プロトタイプ宣言_
C言語には呼び出す関数を予め使用する前に記述しておく必要がある。
しかし、すべての関数の順番を管理するのは面倒なので、_プロトタイプ宣言_ を使う。
これを使うことで、{処理}を記述することなく、関数を宣言しておくだけでよく、順番を管理する手間を減らすことができる。
普通に関数と違うところは、
**関数の定義は{}を使って関数として動作する処理の中身を持っている。
プロトタイプ宣言では、{}の処理が存在しない。**

プロトタイプ宣言では関数の宣言だけが目的なので処理について記述する必要がない。
以下に実施にプロトタイプ宣言が使用されているコード例を示す。

```diff_c
int prototype(int i,int j);
int main()
{
    int i;
    int j;
    int ans;
    ans = prototype(i, j);
    printf("二つの整数の積は%d\n", ans);

}


int prototype()
{
    int i;
    int j;
    printf("好きな整数を二つ入力してください:");
    scanf("%d %d",&i ,&j);
    printf("入力した整数は:%d と %d\n", i, j);

    return i * j;
}
```

この関数ではprototype(int i, int j)という関数が1行目でプロトタイプ宣言されていて、main()の中で呼び出され、11行目で改めて関数として宣言されている。

_2.データ型_
c言語には大きく整数型(integer)と浮動小数点型(floating point)がある。この2つから文字型、倍精度型など他のデータ型が派生してくる。
・整数型(integer)
コンパイラに依存するが16bit、もしくは32bitのビット長を使って表される。型指定子はint。16bitの場合取りうる範囲は-32768~+32768であり、16桁目は正負の判定に使われる。
この派生にlong型、short型、unsigned型などがある。
また、文字列の型指定子にcharが使われる。
・浮動小数点型
実数の近似値を表すのに用いる。32bitのビット長を使う。非常に大きな値、例えば電気素量を表すときには1.602*10^(-19)を1.602e-19として表す。
実数の精度の向上が必要なときには倍精度型(double)を使うと良い。

long型や倍精度型は取れる値やその精度は上げるがその分記憶領域を使うので処理速度が遅くなる可能性も含んでいることを忘れない。

それぞれのデータ型指定子を載せておく。

```diff_c
//整数型(int)
int a;

//long型、short型, unsigned型
long b;
short c;
unsigned int d;

//文字型(char)
char x;

//浮動小数点型(float)
float num_1;

//倍精度型(double)
double num_2;
```

_3.記憶クラス_
c言語では変数を宣言するときに、そのデータ型を宣言するのと同時に、どこに記憶されるのかを規定する必要がある。この記憶領域を決定することを記憶クラスという。
c言語には4つの記憶クラスがある。
・自動変数(auto)
・レジスタ変数(registor)
・静的変数(static)
・外部変数(extern)
それぞれ宣言の仕方や、スコープ（有効範囲）に違いはあるが実際にc言語でプログラムを書くときに自動変数以外を使うことは稀である。というのも適切でないクラスを指定してしまうと、記憶領域を無駄に使ってしまい結果として処理速度の低下へとつながるためである。c言語はあくまでシステムプログラムを書くのを目的としている。

_演算子_
~~c言語では異なるデータ型同士の演算を行うと、キャスト（型変換）が行われる。~~
~~このキャストを考慮せずにプログラムを行うと、期待される結果がでないこともある。~~
型変換の中でも、キャスト指定子を使って行う型変換のことをキャストという。

```diff_c
float x, y;
x = 1.602;
y = (int)x;
printf("%f\n", y);
```


参考url
_プロトタイプ宣言_

https://webkaru.net/clang/function-declaration-prototypes/

https://monozukuri-c.com/langc-funclist-prototype/

参考書籍
Les Hancock; Morris Kriger; Saba Zamir『C言語入門』 倉骨彰,三浦明美 訳　アスキー出版局



蛇足
この記事の目的がc言語の勉強のメモという面が大きいからか、それぞれの役割とか実際の使用例を端折って書いているのが大半になっているけど、自分が勉強してていろんな参考書とかサイト見て詳細を書いてくれてないのはその人にとって当たり前すぎて書くのがめんどくさいからっていうのを実感する。
[python] boolのリストの中身が全部Trueか、あるいはTrueが含まれるかの判定

1. 全部Trueか(Falseが含まれるか)どうかはall()で確認できる。
    
    ```python
    print(all([True, True, True]))
    # True
    
    print(all([True, False, True]))
    # False
    ```

1. Trueが含まれるか(全部Falseか)どうかはany()で確認できる。

    ```python
    print(any([True, False, False]))
    # True
    
    print(any([False, False, False]))
    # False
    ```

まとめると、以下。

＜bool＞|全部＜＞か|＜＞が含まれるか
-|-|-
True|all(hoge)|any(hoge)
False|not any(hoge)|not all(hoge)
※hogeはイテラブルな何か。
FontawesomeのRails6への導入

## はじめに
この記事ではyarnへのインストールをする方法で話を進めていきます。

## 導入環境

Mac Catalina ver10.15.7
Ruby 2.6.5
Rails 6.0.3.5

## 導入方法

まずは導入したいアプリのディレクトリでyarnにfontawesomeを取り込むコマンドを打ち込みます。

```
%yarn add @fortawesome/fontawesome-free
```
そうすると処理の後、Done!と出るのでyarn.lockとpakage.jsonファイルを確認してみましょう

```yarn.lock
"@fortawesome/fontawesome-free@^5.15.3":
  version "5.15.3"
  resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz#c36ffa64a2a239bf948541a97b6ae8d729e09a9a"
  integrity sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==
```

```pakage.json
"@fortawesome/fontawesome-free": "^5.15.3"
```
各ファイルに上記の記述があればひとまずOKです。
そして今度はjavascriptとstylesheetsへの導入を行います。

```javascript/packs/application.js
import '@fortawesome/fontawesome-free/js/all';
```
javascriptファイルへはそのまま上記の記述をするだけで良いですが
stylesheetsへの導入の際、元々あるapplication.cssをapplication.scssに変更する必要があるので注意してください。

```application.scss
$fa-font-path: '@fortawesome/fontawesome-free/webfonts';
 @import '@fortawesome/fontawesome-free/scss/fontawesome';
 @import '@fortawesome/fontawesome-free/scss/solid';
 @import '@fortawesome/fontawesome-free/scss/regular';
 @import '@fortawesome/fontawesome-free/scss/brands';
 @import '@fortawesome/fontawesome-free/scss/v4-shims';
```
これらの記述が完了したら実際にviewにfontawesomeで提供されているタグをコピペしたり、
記述する事で見た目に反映されます。
余談ではありますが上記の記述の内regular以下はfontawesomeにPro登録をする事で使用可能になるもののため記述の必要は無さそうではあります。

##最後に
これで様々なアイコンが使用可能になるため、ユーザーへのUIデザインの配慮がしやすくなります。
今回はあくまでHowの部分なため各ファイルの相互関係による動作の部分であるWhyも今後学習を進めていきたいです。
CloudFrontのログクエリをやってみる(dateとtimeからJSTで検索する)

# 概要
* CloudFrontにおけるログをAthenaを使いクエリするといったことはよくあると思います。
* その際にdate, timeのカラムから日付を絞りクエリする際にUTC時間を気にしなければなりません。
* 今回は、そんな時に使うクエリをいくつか用意してみました。

# AthenaにCloudFront テーブルを作成する
* 下記のDDLステートメントをコピーしてAthenaのコンソール(クエリエディタ)に貼り付け(Run Query)をします。
* ちなみに、下記のDDLは公式ドキュメントのものをそのまま引用しています。

```sql
CREATE EXTERNAL TABLE IF NOT EXISTS default.cloudfront_logs (
  `date` DATE,
  time STRING,
  location STRING,
  bytes BIGINT,
  request_ip STRING,
  method STRING,
  host STRING,
  uri STRING,
  status INT,
  referrer STRING,
  user_agent STRING,
  query_string STRING,
  cookie STRING,
  result_type STRING,
  request_id STRING,
  host_header STRING,
  request_protocol STRING,
  request_bytes BIGINT,
  time_taken FLOAT,
  xforwarded_for STRING,
  ssl_protocol STRING,
  ssl_cipher STRING,
  response_result_type STRING,
  http_version STRING,
  fle_status STRING,
  fle_encrypted_fields INT,
  c_port INT,
  time_to_first_byte FLOAT,
  x_edge_detailed_result_type STRING,
  sc_content_type STRING,
  sc_content_len BIGINT,
  sc_range_start BIGINT,
  sc_range_end BIGINT
)
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'
LOCATION 's3://CloudFront_bucket_name/CloudFront/'
TBLPROPERTIES ( 'skip.header.line.count'='2' )
```

# クエリしてみる

* 今回は２パターン用意しました。

①: 特定の日付(1日)のみに絞りクエリする

```sql
SELECT *
FROM cloudfront_logs
WHERE uri LIKE '%.mp4'
        AND ((date = CAST('2021-04-14' AS DATE)
        AND time >= '15:00:00')
        OR (date = CAST('2021-04-15' AS DATE)
        AND time < '15:00:00'));
```

②: 複数日付を指定し、その間にある条件でクエリする

```sql
SELECT *
FROM 
    (SELECT from_iso8601_timestamp(date_format(date,
         '%Y-%m-%dT') || time || 'Z') AT TIME ZONE 'Asia/Tokyo' jst_date, time, uri
    FROM cloudfront_logs
    WHERE "date"
        BETWEEN DATE '2021-02-01'
            AND DATE '2021-04-15'
    GROUP BY  date, time, uri)
WHERE "jst_date"
    BETWEEN DATE '2021-02-01'
        AND DATE '2021-04-15';
```
AWS SAA-C02 合格しました

#なぜ受けようと思ったのか

会社の勉強会にて触れる機会があり、AWSの案件に入りたくなったから。
実際にAWSのプロジェクトに参画している方より勧められたから。

#投稿者について
業界未経験で入社。今年3年目。
実際の業務では主にhtml、css、jsを使っており、週次で開催される社内の勉強会でDockerやAWSの一部サービスについて勉強していました。

#使用した教材・コスト
・[これだけでOK! AWS認定クラウドプラクティショナー試験突破講座（豊富な試験問題290問付き）](https://www.udemy.com/course/ok-aws-e/)1200円（セール時価格）

・[これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）](https://www.udemy.com/course/aws-associate/)1300円（セール時価格）

・[【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)1340円（セール時価格）

・[一夜漬け AWS認定ソリューションアーキテクト アソシエイト[C02対応]直前対策テキスト 単行本](https://www.amazon.co.jp/%E4%B8%80%E5%A4%9C%E6%BC%AC%E3%81%91-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-C02%E5%AF%BE%E5%BF%9C-%E7%9B%B4%E5%89%8D%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88/dp/4798062960/ref=cm_cr_arp_d_product_top?ie=UTF8) 2420円

・[AWS CloudTech無料問題集](https://aws-cloud-tech.com/) 無料

・SAA-P02: AWS 認定ソリューションアーキテクト - アソシエイト - 模擬試験　4400円(2200円×2回)

・SAA-C02: AWS 認定ソリューションアーキテクト - アソシエイト　16500円

合計27160円

#勉強期間
4ヶ月弱　計200時間
ほとんど週末のみ勉強していました。最後まで結構のんびり勉強しました。

#教材について
**udemy**
ハンズオンはクラウドプラクティショナーの教材でAWSの主要サービスの概要を学び、ソリューションアーキテクトアソシエイトの教材で実際にサービスを使ってどうインフラなどを構築するかを学びました。
模擬試験問題集は2周しましたが、2回くらいしか合格点をとれていません。
文字通り高難易度の模擬試験で、説明文にも「高難易度だから70%以下でも落ち込まないで」と書いています。この文章読んでいなくて本番まで落ち込んでいました。

**AWS CloudTech**
ちょうど勉強をしていた時期に発足したサービスで月額制のサービスとなっています。今回は無料会員登録で実施できる200問の問題のみ利用しましたが、採点が10問ずつで空いた時間などに解きやすかったです。
コミュニティやハンズオンもあるみたいなのでこちらを利用するのもいいかなと思います。

**直前対策テキスト**
ラスト2週間くらいの時に読みました。
内容は試験問題の傾向や練習問題で頻出するサービス、構成に絞っていてかなり実践的な内容でした。
各項目の要点を読んで引っかかる部分があったら解説をじっくり読む、という使い方をしました。

**公式摸試**
今回はピアソンVUEにて2回受けました。1回目はSAAハンズオンが終わった時点で受け正解率46%、2回目はその1ヶ月後に受けて69%でした。
ちなみに問題内容は1、2回ともほぼ同じでした。
本番試験と同じUIで受けられるので操作に慣れる意味でも1回は実施した方がいいと思います。

#試験内容で気づいたこと
・噂通り、一部翻訳が怪しい部分がありました。元の英文を見れば解決します。
　例：集合配置→プレイスメントグループ　など

・基本的に問題文を読み解くのに時間がかかるものが多く、40問目以降は結構疲れていました。

・練習問題では「～でないものはどれか」といった問題文が結構ありましたが、一切なかったです。

・複数回答問題が1問しかありませんでした。かなり運がよかったのかもしれません。

・思っていたより主要サービス寄りでした。EC2やS3、RDS関連の問題がほとんどで、練習問題ほど出てくるサービスの種類は多くないといった感じです。

#受験後
受験終了から3時間後、証明書と認定バッチが発行
受験終了から5時間後、スコアレポートが発行
カラム名間違いでmigrationファイル差し戻し（最新のテーブルしかロールバックできない）



あまりやらないので気をつけないといけないことがあります。

マイグレーションファイルはrials db:migrate:statusしても


```terminal:terminal
database: furima_32844_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210409081355  Devise create users
   up     20210414110750  Create items
  down    20210415131442  Create active storage tablesactive storage
```

３テーブルあったら最新で作った１テーブル分のファイルしかロールバックできない。

解決方法
-

STEP=nを付け加えればいいだけです。

###rails db:rollback STEP=1

```terminai:terminal
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20210409081355  Devise create users
  down    20210414110750  Create items
  down    20210415131442  Create active storage tablesactive storage
```
SQL 実行結果を見やすく出力する

## 目的

- SQLの実行結果をテーブル状ではなく縦に出力する方法をメモ的にまとめる

## 方法

1. 実行するSQLの末尾の`;`の代わりに`\G`をつける。

## 紹介

1. 下記のようなデータが格納されたusersテーブルが存在したとする。

    ```sql
    mysql> select * from users;
    +------+---------+-----------+------------+------------+
    | id   | name    | user_flag | admin_flag | check_flag |
    +------+---------+-----------+------------+------------+
    |    1 | admin_1 |         0 |          1 |          1 |
    |    2 | admin_2 |         0 |          1 |          0 |
    |    4 | user_2  |         1 |          0 |          0 |
    +------+---------+-----------+------------+------------+
    ```

1. 上記にselect句の実行結果を載せているが、カラムが少ないのでテーブル状でも見やすい。しかし、たくさんのカラムが存在していた場合、レコードの情報が折り返されたりして直感的にデータを確認しにくい。
1. 実行しているSQLの末尾の`;`を`\G`に置き換えて実行する事により下記のように出力される。

    ```sql
    mysql> select * from users\G
    *************************** 1. row ***************************
            id: 1
          name: admin_1
     user_flag: 0
    admin_flag: 1
    check_flag: 1
    *************************** 2. row ***************************
            id: 2
          name: admin_2
     user_flag: 0
    admin_flag: 1
    check_flag: 0
    *************************** 3. row ***************************
            id: 4
          name: user_2
     user_flag: 1
    admin_flag: 0
    check_flag: 0
    3 rows in set (0.00 sec)
    ```

1. 各レコードの情報が縦に出力され、場合によってはこちらのほうが見やすい時がありそう。通常の出力方法と併用して都度見やすい方法で使い分けていきたい。
実験機械の使用予定表をVBAで作成してみた

#はじめに
VBAで予定表を作ってみたのでQiitaにあげておきます
見知らぬ誰かや、後輩の役に立てれば幸いです

#予定表
以下、コードになります。
実際にはユーザーフォームでボタン一つで起動するようにしています

```
Sub 予定表作成()

'2021/04/16作成

'変数の定義
    Dim yr As Integer '年
    Dim m As Integer  '月
    Dim d As Integer  '日
    Dim j As Long     'ループ用変数
    Dim k As Integer  'ループ用変数
    
'エラーフラッグ
    On Error GoTo myError
   
'作成年度の入力
    yr = InputBox("何年の予定表を作るか入力してください")

'1月から12月まで予定表を作成
    For m = 1 To 12
        Worksheets.Add(After:=ActiveSheet).Name = yr & "年" & m & "月"
        
        Columns("A:K").ColumnWidth = 15
        Range("A2:K2").Borders(xlEdgeBottom).LineStyle = xlContinuous
        Range("A2:K2").HorizontalAlignment = xlCenter
        Range("A1:A35").Borders(xlEdgeRight).LineStyle = xlContinuous
        
        Cells(2, 2) = "COD"
        Cells(2, 3) = "TNTP"
        Cells(2, 4) = "pH EC"
        Cells(2, 5) = "SS"
        Cells(2, 6) = "ICP発光"
        Cells(2, 7) = "ICPMS"
        Cells(2, 8) = "イオンクロマト"
        Cells(2, 9) = "吸光光度計"
        Cells(2, 10) = "ホットプレート"
        Cells(2, 11) = "遠心分離機"
         
        k = 3
        d = 1
        
        'm月のワークシートに日付を入れていく
        For j = DateSerial(yr, m, 1) To DateSerial(yr, m + 1, 0)
            Cells(k, 1) = yr & "/" & m & "/" & d
            k = k + 1
            d = d + 1
        Next j
    Next m
 
'ユーザーフォーム閉じて終了
    Unload 予定表
    MsgBox yr & "年の予定表が作成されました"
    Exit Sub
   
'エラーフラッグ
myError: MsgBox "エラーが発生しました", vbExclamation
End Sub

```
#終わりに
プログラミングは初心者ですので、コードの書き方等で何かありましたら指摘していただけると幸いです
今後の改善点としては体裁をより整えることと、うるう年を考慮する必要があるかと思います。(~~2月29日に実験しなければいいのでは?~~)

最後までご覧いただきありがとうございました
SCNVector3の合成

単純に+はできないので

```swift
extension SCNVector3 {
    func plus(with:SCNVector3) -> SCNVector3 {
        let x = self.x + with.x
        let y = self.y + with.y
        let z = self.z + with.z
        return SCNVector3(x, y, z)
    }
}
```

SCNVector4とかCGRectでもできそう。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
上のモジュールが読み込めねぇえ！読み込ませろぉお！問題でいつまでも消耗しないためのPython初心者メモ

# はじめに
ひさしぶりにPythonでパッケージ書いてて前にも躓いた親モジュールをインポートできないことで数時間消耗したのでメモを残す。

# 結論

- ~~sys.path.extend()~~はIDEで自動整形できなくなって結果的にコード全体がきたなくなるのでやめる
- PYTHONPATHにパッケージのパスを追加する
    - systemのpythonつかってようと、pyenvでバージョン管理してようと問題なし

```~/.zshrc
export PYTHONPATH="/home/username/package_path:$PYTHONPATH"   
```
Facebook APIのアクセストークン無期限（ページトークンにする）

# 概要
これまでFacebook APIを使うアクセストークンを60日で更新してたのですが、
ユーザアクセストークンではなく、ページアクセストークンを使えば無期限にする事が出来るのでメモを残す

# ハマったところ

既にQiitaなどに沢山情報はあるんですが、何故かうまく行かない。
最期の無期限トークンを取得するところで
https://graph.facebook.com/v3.0/(ID)/accounts?access_token=（長期トークン2か月）
とやったところで、空が返ってきてしまい原因調べるのに時間がかかったので他にもハマる人が居るかもと共有します
'''
{"data":[]
}
'''

参考にしたページ。他にも幾つか。
何故かみんなInstagramを使ってるんですが、自分は不要だったし、手順通りにやると上記のdataが返されてしまっていた。
[(画像付)グラフAPIの無期限アクセストークン取得]
(https://qiita.com/ari-chel/items/bac6c90f5c85a8295352#%E4%BB%BB%E6%84%8F%E3%81%AE%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%B0%E3%81%8C%E4%BB%98%E3%81%84%E3%81%9Finstagram%E3%81%AE%E6%8A%95%E7%A8%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)


恐らく過去のバージョンでは、ユーザトークンでも実行できていたのではと思う。
現状はページトークンじゃないと、値を返してこない。


# 手順
1. ページトークンを取得する(Graph API エクスプローラで、トークンの種類を変更）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106822/4f45fbfb-01fc-2e85-262e-ac4da8460d3c.png)

2. ページを作成していない場合、ページを作成する
3. Generate Access Tokenで取得した後、「i」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106822/b1976156-26b0-a670-15e8-dbd2033bfc15.png)

4. トークン情報が表示されるので、右下の「アクセストークンツールで開く」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106822/d04ff9b0-3c22-6a6b-052d-678012b84e5f.png)

5. アクセストークンの情報が出るので、「アクセストークンを延長」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106822/c1a36478-40cb-a339-cd7d-722bd9d645a7.png)

6. デバッグボタンを押すと、2か月の長期アクセストークンが出るので、これをコピーする
7. Graph API エクスプローラに戻って、アクセストークンに、↑の長期アクセストークンを入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106822/1b2d69b5-0c8c-2bc0-916b-0a8c975ad8c6.png)

8. リクエスト入力欄に、me/accounts/　と入力し「送信」すると無期限アクセストークンが表示されるので、これをコピー


9. アクセストークンデバッガで、↑の無期限アクセストークンを入力して確認すると、有効期限、[受け取らない]になってれば成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106822/6a38811a-f2fa-9610-3571-8c0eacd58410.png)

※　エラーなら 原因調べやすいんですが、ハマりました。
No space left on deviceでEBSの拡張ができない時の対処法

EBSのrootデバイスをgrowpartで拡張しようとしたが、「No space left on device」というエラーで拡張できない時のメモ。

# 対処方法
エラーを回避するには、一時ファイルシステムであるtmpfsを/tmpにマウントする。

```
$ sudo mount -o size=10M,rw,nodev,nosuid -t tmpfs tmpfs /tmp
```

その後にgrowpart、resize2fsを実行する。

```
$ sudo growpart /dev/nvme0n1 1 
```
```
$ sudo resize2fs /dev/nvme0n1p1
```

最後にアンマウントする。

```
$ sudo umount /tmp
```

# 参考
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ebs-volume-size-increase/
フロントエンドエンジニアリング　ロードマップ

マークアップ言語：　HTML・CSS・JavaScript

言語を使ったサイトの模写

CSSのツール：　Sass、Bootstrap、Materializeほか


JavaScriptのツール：　npm, Webpack, Babel

Git・GitHub

サイト作成→就活開始！

フレームワーク：　React/Vue(/Angular)

Node.js/Firebase

Typescript

SPA作成

（バックエンド技術）

言語：　Ruby, Python, JavaScript etc.

フレームワーク：  Ruby on Rails, Django, Flask, Node.js etc.

データベース：　MySQL, MongoDB, AWS etc.

テスター：　Docker, GraphQL



cf.

https://youtu.be/oFiFHq_7LTI

https://youtu.be/5EDYxbAWTWU

https://youtu.be/vtsvokdIqwY

#ポートフォリオ作成の注意

実務未経験者の、Web系自社開発企業に就職するためのポートフォリオのレベル。

最近のWeb系就活事情とその経緯

一昔前なら、プログラミングスクールの成果物や既存のアプリのクローンを作ればそれなりに評価されていた。
→近年は、エンジニア志望者が急増。
→応募者が殺到。
→企業が採用のハードルを上げる。
→ポートフォリオに、UI/UXの整理やAWSの活用などの高度な工夫や技術を加える人が増える。
→初学者でも、数ヶ月でそのレベルまで上がるという企業側の認識が強化される。
◎「競争相手は、強い」ということを受け入れる→どう対策？

プログラミングスクールの講師：駆け出しのエンジニアなどが多い→開発の第一線で活躍しているエンジニアが持つような情報のレベルが高さとは言えない。

努力して高いレベルに行けば、大半の競争相手を抜くことができる。

そもそも、ポートフォリオのレベルとは？

▼基本
・十分な機能を備えていること
・UI/UXが整えられている
・コードの可読性が高い
・テストも十分に書いてある
・GitHubのIssueやプルリクを活用している（疑似チーム開発）
※UI/UXや可読性などで見た目を分かりやすくすることで、忙しい採用側の負担を減らす配慮も必要。

▼発展
・インフラにAWSを使っている
・CircleCI等のCIツールを活用している
・開発環境と本番環境でDockerが活用されている。

アクションプラン

・Web系のことを発信しているサイトや個人を見つける。最新の第一線の開発事情を調査する。

cf.

https://youtu.be/N0yetny4Zco
Gitで状態を確認したい時や綺麗に戻したい時に使うコマンド

#はじめに
コードを書いてると、変更しているファイルを確認したり、編集・ステージングの内容を取り消したい時がたびたび訪れます。
整理も兼ねてよく使っているコマンドをまとめます。

##ブランチを確認したい
####現在のブランチを表示

```
$ git branch 
* hoge
  fuga
  piyo
```

####ブランチの切り替え

```
$ git checkout fuga
```

##変更を確認したい
####変更されているファイルを確認

```
$ git status
```

####ファイルの変更内容を確認

```
$ git diff HEAD {ファイルパス}
```

####コミットするファイルを指定

```
$ git add {ファイルパス}
```

##もう一度綺麗な状態に戻りたい
####新しいファイルの取り消し

```
git clean -f
```

####編集・ステージングの取り消し
```
git reset --hard HEAD
```

##おわりに
間違って大事な更新を消さないように気をつけましょう。
VBAの基本操作（プログラム制御）

VBAの初心者向けに基本操作方法（プログラム制御）を紹介していきたいと思います。


```:偶数と奇数の判定
Dim msg As String                     '変数msgを設定する
If Range("A1").Value Mod 2 = 0 Then   '偶数の判定する
   msg = "odd number"                 '偶数の場合の処理
Else                                  'それ以外の場合（今回は偶数以外）
   msg = "even number"                'それ以外の場合の処理
End If                                '処理の終了
MsgBox msg                            'メッセージボックスを表示する
```
今回はIf文を使って判定の処理をしています。コードの中で特に2行目が重要で
`If Range("A1").Value　Mod 2 = 0 Then
もしも A1の値を 2で割って0になった　場合に`
と言う風に読むことができます。


```:1~10の数字を順番にセルへ入力する（For文）
For i = 1 To 10     'iを1~10まで変動する
   Cells(i, 1) = i  'セルを指定してiを入力する
Next i              '次のiへ移行します
```
今回はFor文を使っています。iの値は1からスタートし、Next iで2へと移行します。これをiが10になるまで繰り返すという内容になってます。


```:For文の２重ループの例
For i = 1 To 9
   For j = 1 To 9
      Cells(i, j) = i * j
   Next
Next
```
この処理によって下の写真の様に九九の表を作ることができます！
![九九.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/26db35c4-8787-32a2-1715-f8049931c3da.jpeg)


```:1~10の数字を順番にセルへ入力する（Do_Loop）
i = 1                  '変数iの値を指定
Do While i <= 10       'iが10以下の範囲で繰り返しを指定
   Cells(i, 1) = i
   i = i + 1
Loop
```


```:フィボナッチ数列
Dim P As Long
Dim F As Long
Dim F1 As Long
Dim F2 As Long
F1 = 1
For P = 1 To 10
    F1 = F1 + F2
    F2 = F
    F = F1
    Range("A" & P).Value = F
Next
```


```:1~30までを表示し条件によって一部の表示を変更する
i = 0
Do While i <= 29
   i = i + 1
      If i Mod 3 = 0 Then       '3で割って０になった場合
         Cells(i, 1) = "Fizz"   'Fizzと表示する
      ElseIf i Mod 5 = 0 Then   '5で割って0になった場合
         Cells(i, 1) = "Buzz"   'Buzzと表示する
      Else
         Cells(i, 1) = i
   End If
Loop
```

　今回はIf文とFor文とDo Loopを紹介しました。VBAの処理ではかなり使用頻度の高い構文なので使い方をマスターしましょう。

＜for文の使用例＞

```:より実践的なfor文
Sub test()
    Dim i
    Dim ctrRow
    Dim endRow
    
    ctrRow = 2
    '最終行を取得する
    endRow = Range("A2").End(xlDown).Row
    
    For i = 2 To endRow
        'C1「OK」と同じ判定の項目の時
        If (Range("C" & i).Value = Range("C1").Value) Then
            Range("E" & ctrRow).Value = Range("A" & i).Value
            Range("F" & ctrRow).Value = Range("B" & i).Value
            Range("G" & ctrRow).Value = Range("C" & i).Value
            Range("H" & ctrRow).Value = Range("D" & i).Value
            ctrRow = ctrRow + 1
        End If
    Next i
End Sub
```
![for文.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/958041/35f68de4-9f69-5c18-15d2-7d5b9d6ee197.png)
for文を使えばこんな感じでデータの中で一部を参照し合致したデータを抽出することができます。
基本データ型と参照型の違い

# 基本データ型と参照型の違い

## データ型
変数を用意する場合、どのような値を格納するのか**データ型**で指定します。
Java言語のデータ型には大きく分けて**基本データ型**と**参照型**があります。

## 基本データ型
基本データ型には以下の8種類があります。

| データ型 | 意味 | サイズ |
|---|---|---|
| byte  | 符号つき整数 | 8ビット |
| short | 符号つき整数 | 16ビット |
| int   | 符号つき整数 | 32ビット |
| long   | 符号つき整数 | 64ビット |
| float | 浮動小数点数 | 32ビット |
| double | 浮動小数点数 | 64ビット |
| char  | Unicodeで表現できる1文字 | 16ビット |
| boolean | 真偽値 | 1ビット |

## 参照型
参照型は以上8つの以外の型です。
Stringや配列を指します。

## 基本データ型と参照型の違い
基本データ型は**変数に直接、値が代入されます。**
一方、参照型は**メモリ上のアドレスが代入されます。**

## 基本データ型での動作
次のサンプルコードを見てください

```
int a = 1;

int b = a;

a = 0;

console.log(a); // 結果 0
console.log(b); // 結果 1

```
変数aと変数bにはそれぞれ直接値が代入されます。

よって、変数aに0を代入しても変数bの値には何の影響もありません。

## 参照型での動作

では、参照型の場合どのような動作をするのでしょうか?

```
int[] a = {1, 2, 3}

int[] b = a;

a[0] = 0;

console.log(a); // 結果 {0, 2, 3}
console.log(b); // 結果 {0, 2, 3}

```
これが参照型の特徴です。

配列bには{1, 2, 3}ではなく、配列aが参照しているメモリ上のアドレスが格納されます。
よって、**配列aの変更は配列bにも影響します。**

同じように、配列bの変更も配列aに影響します。

基本型と参照型ではこのような違いがあることを覚えておきましょう。

## まとめ
・基本データ型は８種類存在する(byte,short,int,long,float,double,char)。
・String型は上記の８種類意外の型。
・基本データ型は変数に直接、値が代入される。
・参照型は変数にアドレスが代入される。
【Hyperledger Fabric v1.4.11】platform binaries 一覧

# platform binaries とは？

* ブロックチェーンネットワークを管理・操作するオペレーターやチェーンコード開発者向けの各種ツール・コマンド
* 通常は Hyperledger Fabric のインストール時に一緒にインストールされる


## Hyperledger Fabric platform binaries 一覧

| コマンド | 説明 |
|:--|:--|
| configtxgen | ユーザ暗号鍵・各種証明書の生成ツール |
| configtxlator | チャネル構成ツール（RESTサーバ） |
| cryptogen | チャネル構成ツール |
| discover | ディスカバリーサービス向けのクライアントツール |
| fabric-ca-client | ID（属性も含む）、および証明書の管理を行うコマンド |
| fabric-ca-server | CAサーバの初期化・起動などを行うコマンド |
| idemixgen | MSP の設定ファイルを生成するコマンド |
| [peer](https://qiita.com/kbys7367/items/55ab934d241d87faa78a) | ピアノードの起動をはじめ、ピアに対する各種操作を行うツール |
| peer chaincode | チェーンコードを管理するコマンド |
| peer channel | チャネルを管理するコマンド |
| [peer version](https://qiita.com/kbys7367/items/b84be783ddb385f08a8a) | バージョン情報を表示するコマンド |
| peer logging | ログを動的に表示・ログレベルを管理するコマンド |
| peer node | ピアノードの起動・ステータス確認を行うコマンド |


# 参考文献

https://hyperledger-fabric.readthedocs.io/en/release-1.4/command_ref.html
SwiftKotlinの導入

#はじめに
[SwiftKotlin](https://github.com/angelolloqui/SwiftKotlin)
SwiftソースをKotlinソースに変換してくれるOSSがある。

[作者ブログ](http://angelolloqui.com/blog/38-Swift-vs-Kotlin-for-real-iOS-Android-app)
2016年の内容によると、だいたい47~87%の変換率である。
万能ではないが、工数削減には十分機能するはず。

筆者はMac/Xcodeになれていないため、導入に時間がかかった。
そのため、導入方法をメモしておく。

#導入
公式ページのInstallationを参考すればOK。

ただし、Xcodeでのビルド時にターゲットが２つある。
そのためCommandLine版は切り替えてからビルドする必要がある。
（ということが、わかるのに時間がかかった。）

↓デフォルト状態（Appをビルド）
![スクリーンショット 2021-04-16 17.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233237/4a085e90-6375-03e9-8f4a-3e9154f11720.png)

↓選択して切り替える（CommandLineをビルド）
![スクリーンショット 2021-04-16 17.20.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233237/4aa0ad89-7941-22ec-366c-6552432337a7.png)

下記のような場所に出力される。
/Users/ユーザ名/Library/Developer/Xcode/DerivedData/SwiftKotlin-XXXXX/Build/Products
（あるいはXcodeでAppをデバッグ実行状態にして、バーのアイコンから「右クリック>オプション>Finderに表示」）

#実行
公式ページのUsageを参考にすればOK。

ただし、ビルドしたCommandLine単体を/usr/local/binに配置してもライブラリ参照エラーが出た。
結局フォルダごと適当な場所に配置して、そのフォルダに$PATHに通して使うという対応をとった。
データサイエンス　ロードマップ

#職業・業界研究

データサイエンティストについて調べる

### 必要なスキルとレベル

- とりあえずライブラリを使って実装できる
- 最適な手法を選んでライブラリを使って実装できる
- ライブラリを使いつつカスタマイズできる
- 論文から独自に実装できる

###キャリア構築

- 情報を集める
- ロールモデルを見つける
- ロールモデルの成長の仕方をマネる

###　企業

- ビジネスモデルを知る
- 財務諸表を見る
- 企業の歴史を知る
- 社長の本や記事を見る

#学習内容

### プログラミング言語
- Python

＠Scientific Computing with Python

https://www.freecodecamp.org/learn/scientific-computing-with-python/

### データサイエンス／ライブラリ／フレームワーク

- 機械学習・基礎

- データサイエンス
＠Data Analysis with Python

https://www.freecodecamp.org/learn/data-analysis-with-python/

#####データ分析用ライブラリ
- Numpy

https://www.freecodecamp.org/learn/data-analysis-with-python/

##### フレームワーク

https://www.freecodecamp.org/learn/machine-learning-with-python/#tensorflow

# 統計学

https://tutorials.chainer.org/ja/tutorial.html

#実装・演習
- 
機械学習・実装・理論

https://www.freecodecamp.org/learn/machine-learning-with-python/#machine-learning-with-python-projects


- Kaggle／SIGNATE

https://www.kaggle.com/

https://signate.jp/
Vue.jsで学んだこと②

#はじめに
[前回](https://qiita.com/drafts/ba75bf3e5f4a32473eee)、Vue.jsを学び
Vue.jsを使って何を作るか？
Vue.jsを使ってやってみたい事は何か？
ということを考えてみた。

#Vue.jsを使って何を作るか？
真っ先に思いついたのが、コロナ渦の影響によりテレワークが多くなってきている昨今
出退勤の管理を行うところも増えてきている。
もちろん勤怠管理システムを使っているところもあるだろうが、
簡単にGSSを使って管理するところもあるので
GSSと連携したSPAの出退勤管理を作ろうと考えました。

#Vue.jsを使ってやってみたい事は何か？
上記で何を作るかが決まったので、やってみたい事は何か？
管理をする上で必要なものは認証だと考えています。
なのでGoogle認証や、Firebase認証を使ってログインしたユーザの出退勤を管理・・・とまでは考えています。
（あくまでもざっくりベース）

#Firebase認証
Google認証よりまず、Firebase認証を試してみました。
以前GoogleやTwitter、Facebook等の認証系は触ったことはありましたが、
Firebaseはそれより簡単に設定できました。

__１．Filebaseでプロジェクトを作成__
Filebaseにアプリを追加するだけ！（とても簡単！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634739/8a6e3852-f9d6-e473-60db-0f631318500f.png)

__２．認証方法を設定__
Authenticationページでmethodを有効にするだけ！（とても簡単！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634739/e0b29171-914b-62bf-021b-3f9570518fb7.png)

__３．プロジェクトにアプリを追加__
FilebaseのAPI_KEYや認証ドメインを取得するためにアプリを追加するだけ！
今回はWebページですので以下画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634739/ad97d30c-dea4-10ed-0426-fb247346a07e.png)


これだけです！

あとは追加したアプリのAPI情報をvue.jsの方に設定して認証するだけで簡単に認証することができました！

vue.js側の設定

```js
  methods: {
    signIn: function () {
      firebase
        .auth()
        .signInWithEmailAndPassword(this.username, this.password)
        .then(
          (user) => {
            alert("Success!");
            this.$router.push("/");
          },
          (err) => {
            alert(err.message);
          }
        );
    },
  }
```

#終わりに
vue.js側の設定も簡単で、こんなにも簡単に認証ができるとは思わなかったのでビックリしました。
JavaだとAPIキーからトークンを取得したり・・・なんやかんやして認証APIを叩いたりしていたので結構大変だった印象があります。
※もちろんライブラリを使えば楽に実装はできたのでしょうが・・・

次回はGoogle認証を試してみたいと思います。
RSpecエラー  Failure/Error: expect(show_link[:href]).to eq book_path(book)              expected: "/books/1"             got: "/books/6" 

#RSpecでエラー出た

__以下Error発生__

```:terminal
Failures:

  1) 投稿のテスト 一覧画面のテスト 一覧の表示とリンクの確認 bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか
     Failure/Error: expect(show_link[:href]).to eq book_path(book)
     
       expected: "/books/1"
            got: "/books/6"
     
       (compared using ==)
     # ./spec/system/books_spec.rb:40:in `block (5 levels) in <main>'
     # ./spec/system/books_spec.rb:33:in `each_with_index'
     # ./spec/system/books_spec.rb:33:in `block (4 levels) in <main>'

Finished in 1.78 seconds (files took 1.5 seconds to load)
28 examples, 1 failure

Failed examples:

rspec ./spec/system/books_spec.rb:28 # 投稿のテスト 一覧画面のテスト 一覧の表示とリンクの確認 bookのタイトルと感想を表示し、詳細・編集・削除のリンクが表示されているか
```

何度調べても、出てこなかったので備忘録として。
このエラー解決した時には、「なんやねん」って感じの単純なミスでした。



_index.html.erb_

```index.html.erb
----------省略------------
<tbody>
  <% @books.each do |b| %>
    <tr>
      <td><%= b.title %></td>
      <td><%= b.body %></td>
      <td><%= link_to 'Show', book_path(b), class:'jump' %></td>
      <td><%= link_to 'Edit', edit_book_path(b), class:'jump' %></td>
      <td><%= link_to 'Destroy',
                       book_path(b),
                       method: :delete,
                       data: { confirm: 'Are you sure?' },
                       class:'jump' %></td>
    </tr>
  <% end %>
</tbody>
----------省略------------
```

見た感じ、リンクの書き方は合ってる。
>terminalで`rails routes`でpathを確認してください。
私は、`routes.rb`で以下記述です

```routes.rb
Rails.application.routes.draw do
  root to: 'home#top'
  
  resources :books 
end
```

#解決法

```books_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.all.order(created_at: 'desc') < 削除 >
    @books = Book.all < 追記 >
    @book = Book.new
  end

< 省略 >

end
```


以上のように、`@books = Book.all.order(created_at: 'desc') `としていると、`降順`になるのでidの順番が逆になる。

学んだこと
---
>`expected: "/books/1"
            got: "/books/6"`
のように、params[:id]の数字の部分が`expected`と`got`で「違うで」とError表示されたら、`コントローラーを確認`する


---
間違っていたら、教えてください。
deviseに追加したカラムを保存する方法

#概要
###deviseはデフォルトでemailやpasswordのカラムは入っている。しかし、nameやnicknameなど新しくカラムを追加した際、以下の手順で保存を行えるようにする

#app/controllers/application_controller.rb
```ruby
class ApplicationController < ActionController::Base
  class ApplicationController < ActionController::Base
    before_action :configure_permitted_parameters, if: :devise_controller?
  
    private
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :nickname])
    end
  end
end
```

###上記のkeysの中に追加したカラム名を入れることによって保存が行えるようになる。
CMLのsoftware入手方法

Cisco Modeling Labsのソフトウェアの落とし方のメモです。

# 背景
新たに契約したCMLのsoftwareをいつものノリで[ダウンロードサイト](https://software.cisco.com/download/home)からダウンロードしようと思ったら、
「Additional Entitlement Required」と表示されダウンロードできませんでした。

![download_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224980/6c1b3677-e872-8834-fb6a-5d8063d4fa1b.png)

# ダウンロード方法
CMLは別のダウンロードサイトがあるのでそちらから落とせるよう。


https://learningnetworkstore.cisco.com/myaccount


コミュニティにもありました。

https://learningnetwork.cisco.com/s/question/0D53i00000l4wsdCAA/need-to-know-how-to-download-the-cml-server-image


# 最後に
複数台インストールするとコンプライアンス違反になるそうなので気をつけよう。。

https://qiita.com/sakai00kou/items/2393904243925d4f1dcc
【OS X El Capitan 10.11以前】シェルスクリプトを使ってMacの隠しファイル・フォルダの表示/非表示を切り替えるアプリを作成する方法

#はじめに

本記事ではOS X El Capitan 10.11以前のMacでアイコンをクリックするたび，Macの隠しファイル・フォルダを表示/非表示を切り替るアプリを作成する方法について記述する．

**macOS Sierra 10.12以降はキーボードショートカットで簡単に隠しファイル・フォルダ表示/非表示を切り替えができる．**

キーボードショートカット: `command` + `shift` + `.`

#コマンドラインを使用する場合

**隠しファイル・フォルダ表示**

```bash
defaults write com.apple.finder AppleShowAllFiles true ; killall Finder
 ```

**隠しファイル・フォルダ非表示**

```bash
defaults write com.apple.finder AppleShowAllFiles false ; killall Finder
 ```

**いちいちコマンド入力するのは面倒である．**

#アプリ化するための手順

**手順1:**

Automatorの起動
![Automator_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/476f453c-95aa-f5eb-56ca-10442a99cb09.png)

**手順2:**

新規ファイルの作成

キーボードショートカット: `command` + `N`

**手順3:**

**アプリケーションを選択**
![Automator_ss1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/3db6fb9f-e802-da31-aae6-8e711b063c33.png)

**手順4:**

検索窓に`シェルスクリプト`と入力し`enter`キーを押下
![Automator_ss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/8a35a0c1-51a7-a87e-77fd-a57c6128f3ec.png)

**手順5**

「シェル」のドロップダウンから`/bin/sh`を選択
![Automator_ss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/e8d1dcd6-ea51-a08c-b33f-0d17b4095a36.png)

**手順6:**

枠内に下記シェルスクリプトを記述

```sh
if defaults read com.apple.finder AppleShowAllFiles | grep -iqE '^(1|on|true|yes)$'

# 隠しファイル・フォルダ非表示
then
  defaults write com.apple.finder AppleShowAllFiles false ; killall Finder

# 隠しファイル・フォルダ表示
else
  defaults write com.apple.finder AppleShowAllFiles true ; killall Finder
fi
```

**手順7:**

名前をつけて「アプリケーション」フォルダに保存
（ここでは名前を`HideSwitch.app`とした）

キーボードショートカット: `command` + `S`

**完成**

アイコンをクリックするたび，Macの隠しファイル・フォルダの表示/非表示の切り替えが可能になった．

#おまけ

**アイコンの変更**

せっかくなので，今回作成したアプリのアイコンを下記の画像に設定してみる．
![HideSwitch_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/d31f7a6b-bb0f-0e3e-5e41-401d1ad1d6d8.png)

画像を任意の場所に保存し，そのまま開き全範囲選択しコピー

キーボードショートカット: `command` + `A`
キーボードショートカット: `command` + `C`

今回作成したアプリを選択し情報を見る．

キーボードショートカット: `command` + `I`

赤枠部分を選択し画像を貼り付ける．

キーボードショートカット: `command` + `V`
![Automator_ss4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/029f4a7d-2d70-d89b-e5eb-dde003f4c37b.png)

アイコンが変更された．
![Automator_ss5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478088/6af63652-f4e0-6ae6-7066-45ab159aa3a1.png)
HTTP通信を改めて勉強してみました

表題にありますとおりHTTP通信とは何かについて勉強してみました。
なんとなくの意味合いを理解していました。しかし勉強し直すと理解が足りていなかった部分もありましたので、各用語についてまとめてみました！


##そもそもHTTP通信とは？

一言で表すとHTTPと呼ばれるお約束事（通信規格、プロトコル）に従って行われる通信のことです。

現在はHTTPよりもHTTPSの方が頻繁に耳にするかなと思います。この二つの大きな違いは、「通信内容が暗号化されているかどうか」です。
HTTPSは対応するサーバーでは、ウェブサイトの通信内容を暗号化してくれるので、ウェブの情報を安全にやり取りできます。
ちなみにHTTPSのSはSecure（セキュア）のことみたいです。

**プロトコルとは？**
パソコンやサーバーは多くの異なるメーカーの機種が存在します。
その各々の機種で通信の取り決めが異なっていたら、ルールが同じ機器同士でしか通信出来ません。
そこで共通のお約束ごととしてプロトコル（通信規約）が定めて、メーカーが違う機種同士で通信できるようになりました。

##HTTPメソッドとは？

ユーザーが行いたい処理・アクション(ボタンを押す、投稿をするなど)をサーバに伝えることをHTTPリクエストと言います。そのリクエストを構成しているのがHTTPメソッドやURLなどになります。。

**HTTPメソッドとは？**
GETならウェブサイト閲覧時に、POSTならサーバ(データベースなど)にデータを送る時に使われます。
種類はたくさんありますが今回はCRUDアプリなどで使用される主要なメソッドについて記載したいと思います。
（CRUDとはcreate（作成）、read（読み取り）、update（更新）、destroy（削除）という機能の頭文字をとっています。）

* GET：リソースの取得
サーバーへURLを送りウェブページの情報を取得（GET）します。
ウェブサイトを閲覧する際は、GETメソッドが使われています。

* POST：リソースへのデータ追加
サーバーへURL以外のデータを送信（POST）して処理します。
SNSへの投稿する際などにサーバーに情報を送信する際に使用します。

* DELETE：リソースの削除
サーバーへURL以外のデータ削除のための情報も送信して処理します。


##最後に
webについて勉強すると、たくさん知りたいという気持ちになります！
なので、もっとたくさん勉強してアウトプットできるように心がけます！



参考記事

https://qiita.com/sumin/items/0ab6bb5fe77436ec2f05

https://note.com/toyomomo/n/nef357f75374b

https://www.idcf.jp/rentalserver/aossl/basic/about-https/
RailsでEnum宣言を使ってモデルを作成する

#enumとは？

日本語訳は、「列挙型」
列挙：一つ一つ数え立てて挙げること。並べ立てること。

カラムに対して、数値ごとに対応する任意の名前をつけることができる。

#enum宣言を採用するメリット

 □ dbの可読性向上、管理しやすい
 □ 日本語化にも応用が効く

#追加したいDB
| 項目名| フィールド名 | 型 | null | 備考 |
|:-:|:-:|:-:|:-:|:-:|
| メッセージID  | id  | string |  false |   |
| 送信元ユーザーID  | send_by  |  string |  false |   |
| 送信先ユーザー  | send_to  |  string | false  |   |
| メッセージ本文  | discription  | text  | false  |   |
| 作成日時  |  create_date | datetime  | false  |   |
|  APIに送信できたかの確認 | api_status  |  string |  false |  enum宣言で拡張性を持たせる |

#手順
###STEP01. docker上でレターモデルを追加

作るときは普通にstringで作る。
integerでもいいけど、stringの方がdefault値を設定するときに数字でなく文字列で記載ができるのでより可読性が高い。
お好みでどうぞ。

idカラムは自動生成されるので、オプションでつける必要はありません。

```
% docker-compose run --rm web rails g model Letter send_by:string send_to:string description:text api_status:string --no-fixture
```

以下の様なDBファイルができる。

```db/migrate/yyyyMMddhhmmss_create_letters.rb
class CreateRatings < ActiveRecord::Migration[5.2]
  def change
    create_table :letters do |t|
      t.string :send_by
      #...略

      t.string :api_status

      #...略
  end
end
```

以下の様にnot null制約と、default値を追記して保存します。

```db/migrate/yyyyMMddhhmmss_create_letters.rb
class CreateRatings < ActiveRecord::Migration[5.2]
  def change
    create_table :letters do |t|
      t.string :id, null: false
      t.string :send_by, null: false
      t.string :send_to, null: false
      t.text :discription, null: false
      t.datetime :create_date, null: false
      t.string :api_status, defalut: 'success'

      t.timestamps
  end
end
```


###STEP02. 対象モデルにenum宣言を記入
ここから対象モデルにenum宣言を書き込んでください。

```app/models/letter.rb
class Letter < ApplicationRecord
  enum api_status: {
      sending: 'sending',
      success: 'success',
      failure: 'failure'
  }
end
```

###STEP03. Rails db:migrateする

```terminal.
% docker-compose exec web bundle exec rails db:migrate
```


#参照させていただいたサイト様たち

・[Qiita. 【Rails】Enumってどんな子？使えるの？](https://qiita.com/ozackiee/items/17b91e26fad58e147f2e#%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E5%90%8D%E5%89%8D%E5%AE%9A%E7%BE%A9%E3%81%A8%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E6%95%B0%E5%80%A4%E3%82%92%E6%8C%87%E5%AE%9A)

・[Qiita. Rails - enumの使い方
](https://qiita.com/hapiblog2020/items/95bd6f9dc2784d992d51)

・[Qiita. 【enum】 rails enumを利用してデータの可読性をあげよう](https://qiita.com/thk__u/items/12e83719c7aed4051654)

・[StuckOverFlow. How to store enum as string to database in rails](https://stackoverflow.com/questions/32938729/how-to-store-enum-as-string-to-database-in-rails)

・https://web-camp.io/magazine/archives/16862