OmniAICreator/Qiita-1.07M huggingface dataset:
Slack絵文字でToDoタスク管理してみる　

さて今回私がご紹介するのは、**「Slack絵文字を利用して、メッセージをひとまとめに集めちゃおう」**ついでに、**「自分（もしくはチーム）のToDoタスク管理用としても使ってみよう」**という小技のご紹介となります。
#活用イメージ
1.Slack上の集めたいメッセージに**絵文字を付ける（リアクションする）**
　※ToDo備忘として自分でメッセージを送信する際、絵文字を付けるのも有り。

2.予め用意しておいた集計用（ToDoタスク管理用）のチャンネルに、該当メッセージが**自動で転送される。**

3.まさに**<font color="Red">その集まったメッセージたちが、自分（もしくはチーム）のToDoタスク</font>**です。
　対応しなきゃいけないメッセージが、ひとまとまりに集約されるので便利ですね！

# 1.事前準備
※Slackアプリのreacji channelerというアプリを使います。
利用しているワークスペースにアプリを追加しておく必要があります。

1. reacji channelerをワークスペースに追加する。<br>[アプリの追加方法はSlackのサイトを参照してください。](https://slack.com/intl/ja-jp/help/articles/360000482666-%E4%BB%96%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E3%81%B8%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E3%82%B5%E3%82%AF%E3%83%83%E3%81%A8%E3%82%B3%E3%83%94%E3%83%BC)<br>既にアプリを追加されている方は再追加は不要です。
1. メッセージ収集用の絵文字を用意する。<br> この絵文字をトリガーに自動収集されるので、他の人に絶対使われないようなオリジナルの絵文字を登録しておきましょう。<br> ![pic_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/2b2479e9-00ee-f64a-222e-b374dbb879d4.jpeg)

1. 集計・ToDoタスク管理用のチャンネルを作る。<br>![pic_task_タケシチーム用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/a99c00d4-9824-3975-ca61-7e1f96004060.png)
1. 管理用のチャンネルにreacji channelerのコマンドを仕込む。<br>![pic_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/b4248669-8226-0a46-a92f-553441d0c75f.jpeg)<br>これで仕込みは完了です。


# 2.使ってみる
1.　集めたいメッセージに用意した絵文字でリアクションするだけ。<br>　 今回は3つのチャンネルのそれぞれにあるメッセージに絵文字を付けてみます。<br>![pic_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/e4445af5-1dd7-4f78-588f-b7721ca38312.jpeg)

2.　該当の3つのメッセージが管理用のチャンネルに自動で集まりました！<br>![pic_4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/e8a89d81-446b-952b-d971-f7fffa8caf8f.jpeg)


#3.チーム（複数）でも使える。
1.収集用の絵文字を複数仕込むことも可能です。<br> 　チームメンバーそれぞれが利用する絵文字を仕込めば、チーム単位で管理することが可能です。<br> ![pic_5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656547/81c1eeab-76c3-6807-35b4-702d129aef66.jpeg)<br>　ヘルプデスク受付のチャンネル等の予実管理で有効かも。
#4.集められるのはパブリックチャンネルだけ
自動収集できるチャンネルはパブリックチャンネルである必要があります。
ＤＭやプライベートチャンネル上のメッセージは収集出来ないようです。

#5.周りからの評価も上がる?　その他応用編
　今回はreacji channelerの機能を自分自身のToDoタスク管理用として紹介しましたが、メッセージを送信した相手にとっても、「タケシがやります」なんてレスを直ぐ返されると嬉しいでしょうから、あなたの評価が高まるかも知れませんね。<br> 　（レスしたまま忘れちゃうとダメですが）<br> 　
　また、この機能はアイデアしだいでその他にもいろんな応用ができると思います。<br> 例えば<br>・あるキーワードで検索して、絵文字付けといて、後でまとめて読む<br> 　~~読んで不要なものは絵文字外せばよい）~~　_※絵文字を外しても管理用チャンネルからは消えませんでした。_<br>・レポートや日報など定期的なメッセージに絵文字付けといて、ひとまとめにチャンネルに集約する<br>・自分の作ったオリジナル絵文字収集チャンネルを仕込んどいて、ワークスペース内でどんなときにどのように使われているか分析してみる<br>などなど。

　他にも面白い使い方がありましたら是非教えてください。

以上、最後までお読みいただきありがとうございました。
20分で読むリーダブルコード

##1.理解しやすいコード
**コードは理解しやすくなければいけない。**
**コードは他の人が最短時間で理解できるように書かなければいけない。**

##2.名前に情報を詰め込む
名前は短いコメントだと思えばいい。
これは変数や関数、クラスなど名前をつけるときには同じ原則を当てはめることができる。

###明確な単語を選ぶ
「get」のような明確ではない言葉は避けた方がいいケースがある。
GetPage()というメソッドよりも、FetchPage()やDownloadPageの方が好ましい。
もっと適切な類義語があるか入念に調べよう。

###tmpやretvalなどの汎用的な名前は避ける
エンティティの値や目的を表した名前を選ぼう。

###抽象的な名前よりも具体的な名前を使う
ServerCanStart()よりもCanListenOnPort()の方が具体的だ。
これならメソッドの動作をそのまま表している。

###名前に情報を追加する
単位がメガバイトなら変数sizeよりもsize_mbの方が良い。
バグのような深刻な被害が出るところや、変数の意味を理解して貰わなければ困るところに
情報を追加しよう。

###名前の長さを決める
▪️ 頭文字と省略系
stringをstrに省略するのはOK。
BackEndManagerをBEManagerと省略するのはNG。初めて見た人は理解できないから。

▪️ 不要な単語は投げ捨てる
ConvertToString()を短くしてToString()にしても、必要な情報は何も損なわれない。

##3.誤解されない名前
**名前が「他の意味と間違えられることはないだろうか？」と何度も自問自答する。**

###例： filter()
filterは「選択する」のか「除去する」のか分からない。
select()かexclude()にした方が良い。

###上下の限界値を決めるときは、max_やmin_を前につけると良い。
ショッピングカートには10点までしか入らないとしよう。
この場合は、MAX_ITEMS_IN_CARTにするべきだ。

###包含的範囲を指定するときはfirstとlastを使う

###包含/排他的範囲であればbeginとendを使う

###ブール値の名前はisやhasなどの単語を使う

###名前を否定形するのは避ける

###getで始まるメソッドはメンバの値を返すだけに留めておく

##4.コードの美しさ
優れたコードは「目に優しい」ものでなければいけない。
一貫性と意味のあるやり方でコードを「整形」すれば、
すばやく簡単にコードを読むことができる。

###コードの列を整形する

###意味のある順番を選んで、常にその順番を守る

###空行を使って大きなブロックを論理的な「段落」に分ける


##5.コメントすべきことを知る
**コメントの目的は、書き手の意図を読み手に知らせることである。**

###コメントすべきでは「ない」こと
▪️ コードからすぐに分かることをコメントに書かない
▪️ ひどい名前はコメントをつけずに名前を変える

###記録すべき自分の考え
▪️ なぜコードが他のやり方ではなくこうなっているのか
▪️ 定数の値にまつわる「背景」
▪️ コードの欠陥をTODO: やXXX: などの記法を使って示す
（TODO: は「あとで手をつける」、XXX: は「危険！大きな問題がある」という意味）

###読み手の立場になって考える
▪️ コードを読んだ人が「えっ？」と思うところを予想してコメントをつける
▪️ 平均的な読み手が驚くような動作は文章化しておく
▪️ ファイルやクラスには「全体像」のコメントを書く
▪️ 読み手が細部にとらわれないように、コードブロックにコメントをつけて概要をまとめる

##6.コメントは正確で簡潔に
コメントは領域に対する情報の比率が高くなくてはいけない。
###複数のものを指す可能性がある「それ」や「これ」などの代名詞は避ける
###関数の動作はできるだけ正確に説明する
###コードの意図は、詳細レベルではなく、高レベルで記述する

##7.制御フローを読みやすくする
###比較を書くときには変化する値を左に、より安定した値を右に配置する
###三項演算子・do/whileループ・gotoは避ける
###ネストを浅くする

##8.巨大な式を分割する
###式を変数に代入する
▪️ 簡単な名前で式を説明することで、コードを文書化できる
▪️ コードの主要な「概念」を読み手が認識しやすくなる

###ド・モルガンの法則を使う

##9.変数と読みやすさ
プログラムの変数はすぐに増えるので、いずれ追跡できなくなる。
変数を減らして、できるだけ「軽量」にすれば、コードは読みやすくなる。
###邪悪な変数を削除する
結果をすぐに使って、「中間結果」の変数を削除する
###変数のスコープをできるだけ小さくする
変数を数行のコードからしか見えない位置に移動する
###一度だけ書き込む変数を使う
変数に一度だけ値を設定すれば、コードは理解しやすくなる

##10.無関係の下位問題を抽出する
###プロジェクト固有のコードから汎用コードを分離する
1. 関数やコードブロックを見て「このコードの高レベルの目標は何か？」と自問自答する
2. コードの各行に対して「高レベルの目標に直接的に効果があるのか？あるいは、無関係の下位問題を解決しているのか？」と自問する
3. 無関係の下位問題を解決しているコードが相当量あれば、それらを抽出して別の関数にする

##11.一度に1つのことを
###コードは、1度に1つのタスクを行うようにしなければいけない
読みにくいコードがあれば、そこで行われているタスクをすべて列挙する。
別の関数やクラスに分割できるタスクがあれば、分割する。

##12.コードに思いを込める
ソースコードというのは、プログラムの動作を説明する最も大切な手段。
つまり、コードも「簡単な言葉で」書くべきなのだ。

###ロジックを明確に説明する
###ライブラリを知る

##13.短いコードを書く
**最も読みやすいコードは、何も書かれていないコードだ。**

###不必要な機能はプロダクトから削除する
###最も簡単に問題を解決できるような要求を考える
###定期的にすべてのAPIを読んで、標準ライブラリに親しんでおく

##14.テストと読みやすさ
**他のプログラマが安心してテストの追加や変更ができるように、テストコードを読みやすくする。**

###入出力のテストはコード１行で記述する
###テストが失敗したらバグの発見や修正がしやすいようなエラーメッセージを表示する
###テストに有効な最も単純な入力値を使う
###Test1()ではなく、Test_<関数名>_<状況>のような名前にする

##まとめ
読みやすいコードを書いて、自分が書いたコードを忘れてしまっても問題ないようにしよう。
読みやすいコードを書こう。忘れてもいいコードを書こう。
macPCの電源を落としてdockerコンテナを起動しようとしたらCannot start service workspace: driver failed programming external connectivity on endpoint laradock_workspace_1と言われた

#使用されているポートを調べる mac
１、finderを開く
２、コマンド＋shift+G
３、/システム/ライブラリ/CoreServices/Applications/
４、ネットワークユーティリティ
５、Scan

以上の流れで使用しているポートが見れる

#使用されているポートを消す
１、 　　　　  sudo lsof -i:消したいポート番号
例：８０８０なら　 sudo lsof -i:8080
２、          sudo kill -9 表示されて出てきたPID
例：８０なら   　sudo kill -9 80

上記の流れで消したいポートが消せる
VirtualServiceとDestinationRuleのざっくりとした違い

## VirtualServiceとDestinationRuleって何が違うの
私のメモと簡単な図を載せておきます。
![スクリーンショット 2020-06-18 20.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447425/0c9f1751-387e-fd3b-3286-d287453f36f6.png)

### Virtual Service

- IngressGatewayにバインドすることができるし、メッシュ内の通信のみに適用する書き方もできる。
- URIのプレフィックスが`/productpage`ならrouteで`productpage.default.svc.cluster.local`へルーティングできる。
- ルーティングするトラフィックにtimeoutを付与したり、リトライ回数を付与することができる。
- Namespaceを複数作成し、リクエスト時のFQDNによって各Namespaceにトラフィックを誘導することもできる。
- この条件で流れてきたトラフィックはこっちに流す。あっちに流すをするのがVirtualServiceさん。

### DestinationRule

- `host`の宛先に対してkeep-aliveをどういった設定で行わせるかを決められる。
- コネクションプールを意識した同時接続数の制限ができる。
- コネクション確立後の無通信時間（アイドル時間）を設定し、最後の通信からｘ秒経過したらコネクションを切断する設定ができる。
- サーキットブレーカーとしての機能があるため、ｘ回のエラーを検知したらブレーカーが作動し以降のトラフィックに対して500系エラーを瞬時に返すことができる。
- この宛先に対してどのような制限を掛けてあげるかを設定するのがDestinationRuleさん。

### 実際にHTTPリクエストのタイムアウト設定やアイドルとなったコネクションを切断させるにはどうするのか
![スクリーンショット 2020-06-19 6.44.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447425/9ac8bf6c-a5b5-0467-f87c-6e0bc8f11e16.png)


上図のVirtualServiceではコネクション確立を始める際に適用される。
そのため、HTTPリクエストを送ったがレスポンスが返ってくるまで10秒経過したらリトライが行われる。
10秒待つ→レスポンス無し→リトライを3回まで繰り返す動作となる。

![スクリーンショット 2020-06-19 6.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447425/d02b3bdb-1aab-2897-1a01-893d16efdd24.png)


DestinationRuleでは既に確立したコネクションがアイドル（無通信状態）となり
その状態で30秒が経過したらコネクションは破棄されるようになる。


## おわりに

初めて真面目にお絵かきしてみましたが、こうして図として書くと全体像が掴みやすくて良いですね。
もう少し綺麗でわかりやすいデザインも知りたくなってきました。
第3回 EBS の機能とサービスをまとめてみた

今回はAWS SAA試験でもよく聞かれる**EBS**について説明していきます。
また、**EBS**とEC2に内蔵されている**インスタンスストア**は混合しやすいので表に分けて説明します。
後半では実際にEBSをEC2にアタッチして,どういう変化が起きるかも見ていきましょう。

## EBS(Elastic Block Store)って？？
EC2にくっつける仮想的な外付けハードディスクです。
～**主な特徴**～
- このストレージは、**１つのEC2インスタンスに複数のEBSをアタッチ**できる。
- 逆に複数のEC２インスタンスで一つのEBSをアタッチすることはできない。
- 別のAZにあるEC2インスタンスにアタッチすることはできない。
　**あくまで同じAZ内にあるEC2にのみ**アタッチすることができる。
- 暗号化されている。
- 耐久率は**99.999%**。S3の**99.999999999％**には劣るが。
　かなりの高耐久性をもつストレージとなっている。

### EBSにはどんな種類がある？
| 種類       |       最大スループット |    使用場面    |   費用    |
|:-----------------|------------------:|:------------------:|:------------------:|
| 汎用 SSD (gp2)|              160MB/s |        テスト・開発環境など        |        高        |
| プロビジョンド IOPS SSD (io1)|            500MB/s	 |       ミッションクリティカルな本番環境      |       高       |
| スループット最適化 HDD (st1) |              500MB/s |        ビックデータなどの大容量データを低コストで保存できるのでコスパ良し        |        中        |
| Cold HDD (sc1) |                250MB/s	 |         使用頻度が低いデータを保存する場合など         |        低        |

[参考：Amazon EBS ボリュームの種類](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html)

## EBSと※インススタンスストアの違いって？
※インスタンスストアとは？
EC2に直接接続されたブロックストレージデバイス
このストレージは**EC2の停止、消去とともにデータも削除**されてしまうので
一時的なデータを置くには適していますが、重要なデータを長期間保存する際は
高い耐久率とセキュリティを備えたEBSを使用するのがベターです。


| | 費用 | データの保持 |サービスとしての立ち位置|
|:-----------|------------:|:------------:|:------------:|
| EBS | 有料| EC2の終了後も**保持**|EC2とは別の**独立**したサービス|
| インスタンスストア| 無料| EC2の終了後に**削除**|EC2に**内蔵**したサービス|

## 実際にEBSをEC2にアタッチしてみよう
完成図
<img width="348" alt="EBS.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/25f77fca-667f-d736-0b9f-6da695a1d9ce.png">


EC2インスタンスに汎用 SSD (gp2)をアタッチしてTeraTermから**lsblk**コマンドで確認していきます。

**ボリューム**から**ボリュームの作成**を選択
<img width="201" alt="create volume.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/4c587013-8f92-21d9-3990-13d338d58736.png">

ボリュームタイプは**汎用 SSD (gp2)**サイズは**4G**で作成。
<img width="494" alt="create volume2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/8fc79dff-36f6-6fe8-3fd1-8c3aeaf28d3c.png">

完成したEBSをEC2にアタッチしていきます。
<img width="448" alt="アタッチボリューム.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/499749b0-b4d3-e1ad-ee18-a6249e7a2c4e.png">

EBSがアタッチされたことをテラタームからlsblkコマンドで確認してみましょう。
![アタッチ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/dcbcd9f6-0ba5-903a-9b7f-f7fd66eb619d.jpeg)


先ほどアタッチした**4GのEBS**がアタッチされていることが確認できましたので成功です！
EBSをEC2からデタッチするときはデタッチしたいEBSを選択し
**Detach Volume**を選択すれば完了です。
<img width="509" alt="デタッチ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/e155fc11-26eb-474a-f72a-bcbc06f7ae93.png">
<img width="509" alt="lsblk2.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559536/d73877d1-cabe-0fda-c115-db1fd5df53c7.png">
先ほどアタッチした**4G**のボリュームが消えているのでデタッチ成功です！

##次回予告
次回はちょっと趣向を変えてネットワーク関連の記事を投稿する予定です。
macOSでpythonインストールして使ってたらなんかhttpsコネクション貼る時にエラーになった

開発環境
OS: macOS(Catalina 10.15.4)
python: 3.8.2

# まず動機
タイトルの通りですが、MacにPython入れて普通に使ってて
poetryを入れてみようと思いコマンドを実行したところ以下のエラーが発生

```
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)>
```

# 解決
ググってみたところCA証明書インストールすれば大丈夫ってことで以下のコマンドを実行してインストールしたところ無事解決

```zsh
$ zsh /Applications/Python\ 3.8/Install\ Certificates.command
```

# まとめ
言ってしまえばただこれだけの内容ではあるんですが、こんなん皆引っかかるでしょって思ったけどどうもググったところあんまヒットしないんで公式サイトを見てみたところ

> macOSユーザーへ♡
> SSL/TLS証明書検証と"Install Certificates.command"の実行について大事な情報がpythonのインストール中に表示されるからちゃんと見とくことっ！！！(意訳)
> [公式サイト](https://www.python.org/downloads/release/python-383/)より

ってめっちゃ書いてありました。
インストールしたときのことなんてあんまり覚えてないですが少なくともこのmacOSユーザ向けの文章は読んだ覚えもありませんでした。

<strong>みなさん、公式のダウンロードページはちゃんと見ましょう。また、特に、OSを特定して言及されている箇所なんて尚更です。</strong>
UITableViewCellの選択アニメーション

設定画面などで複数の選択肢から一つを選択したときに、Cellにチェックマークをつけながらdeselectのアニメーションをする

※ `tableView.indexPathForSelectedRow` とかで選択中を判定すると、`tableView.deselectRow` をしたときに選択解除されてしまうのでCellの選択アニメーションがつけれない。なので変数で保持。

```swift
class TableViewController: UITableViewController {
    
    // 選択中のCellを保持しておく変数
    var selectedRow = 0
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        ...

        // selectedRowならCheckmarkをつける
        cell.accessoryType = selectedRow == indexPath.row ? .checkmark : .none
       
        ...
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        // deselectのアニメーション
        tableView.deselectRow(at: indexPath, animated: true)
        
        // Checkmarkの切替
        let oldIndexPath = IndexPath(row: selectedRow, section: 0)
        selectedRow = indexPath.row
        tableView.cellForRow(at: oldIndexPath)?.accessoryType = .none
        tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
    }
}
```
WindowsでArduino CLI環境(arduino-cli + Teratermコンソール)

ArduinoIDEと同じようなことをCLIだけでやる方法。
ArduinoIDEは入っている前提

ここでは、
　ツールインストールを C:\Users\you\Documents\hoge\\
　スケッチ作業場所を C:\Users\you\Documents\sketches\\
にする

仕組みとして
　TTLマクロでロックファイルを監視し接続/切断
　コンパイル用batでロックファイルを作成/削除

# arduino-cli

### ダウンロード

https://arduino.github.io/arduino-cli/installation/
->Windows 64 bit

インストール先とする適当なフォルダを作る (ここではC:\Users\you\Documents\hoge\\)
zipを解凍した中のarduino-cli.exeをhoge\\へ置く

hoge\\の下に build\ フォルダと build_cache\\フォルダを作る

### Pathを通す

hoge\\ フォルダへパスを通す。やり方はググる。

### arduino-cliの初期設定

コマンドプロンプトを上げて、hoge\\フォルダへ移動し、以下コマンド

```
arduino-cli --dest-dir . config init
```

arduino-cli.yamlが出来るのでディレクトリ部分を書き換える
追加のボードマネージャがある場合はadditional_urlsに追加(ここではMightyCoreを追加)

```arduino-cli.yaml
	board_manager:
	  additional_urls:
	  - https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
	daemon:
	  port: "50051"
	directories:
	★data: C:\Users\you\Documents\hoge\Arduino15
	★downloads: C:\Users\you\Documents\hoge\staging
	★user: C:\Users\you\Documents\hoge
```

Arduinoボードをインストール

```
arduino-cli --config-file .\arduino-cli.yaml core update-index
```

追加のボードマネージャがある場合は追加する (ここではMightyCoreを追加)

```
arduino-cli --config-file .\arduino-cli.yaml core install arduino:avr
arduino-cli --config-file .\arduino-cli.yaml core install MightyCore:avr
arduino-cli --config-file .\arduino-cli.yaml core update-index
```

# TTLマクロ＋BAT準備

hoge\\ の下にTTLマクロを作る
ロックファイルの場所を自分のインストールフォルダに書き換え(★1)
COM番号を自分の環境、BaudrateをスケッチのSerial.begin()指定とあわせる(★2)

```teraterm_console_watch.ttl
while 1
  filesearch 'C:\Users\you\Documents\hoge\uploading.lock' ★1
  
  if result=1 then
    call disconnect_console
  else
    call connect_console
  endif
  
  pause 1
endwhile

end

;;------------------------------
:connect_console

testlink
if result=1 then
  connect '/C=8 /BAUD=115200' ★2
endif

return

;;------------------------------
:disconnect_console

testlink
if result=2 then
  disconnect 0
endif

return
```

hoge\\ の下にBATを作る

* NO_SUCH_IPに存在しないホストのIPを記載(ms単位waitのためpingで使う) (★1)
* --fqbnを自分のボードに書き換え(★2)。分からない場合はArduinoIDEを上げ、「ファイル」->「環境設定」->「より詳細な～～」をチェックし、コンパイルログから引用 
* 自作ライブラリがある場合は```--libraries```でそのフォルダのパスを追加 (★3)
* --build-pathと--build-cache-pathを先ほど作ったフォルダに書き換え(★4)
* ロックファイルの場所を自分のインストールフォルダに書き換え(★5)

```arduino-compile.bat
@echo off

set NO_SUCH_IP = 192.168.123.123 ★1
set SLEEP_MS = 1400

arduino-cli.exe compile ^
★2 --fqbn MightyCore:avr:1284:bootloader=uart0,pinout=standard,variant=modelP,BOD=2v7,LTO=Os,clock=16MHz_external ^
★3 --libraries ..\libraries ^
★4 --build-path C:\Users\you\Documents\hoge\build ^
★4 --build-cache-path C:\Users\you\Documents\hoge\build_cache ^
  %2

if %ERRORLEVEL% == 0 (
★5 copy NUL C:\Users\you\Documents\hoge\uploading.lock >NUL
  
  ping -w %SLEEP_MS% -n 1 %NO_SUCH_IP% >NUL

  arduino-cli upload ^
    -p %1 ^
    --fqbn MightyCore:avr:1284:bootloader=uart0,pinout=standard,variant=modelP,BOD=2v7,LTO=Os,clock=16MHz_external ^
  %2

★5 del C:\Users\you\Documents\hoge\uploading.lock >NUL
)
```

# スケッチコンパイル＆アップロード

Teratermを起動し、teraterm_console_watch.ttlマクロを起動

コマンドプロンプトでスケッチを置いてあるフォルダへ移動 (ここではC:\Users\you\Documents\sketches\\)

コンパイルする

```
arduino-compile.bat COM1 test
```
OAuth2.0について


## これは？
仕事でOAuth2.0プロバイダを構築する機会があったのでOAuth2.0について調べた事を記載しています。

## OAuth2.0とは？
認証の仕組みではなく**認可の仕組みです。**
([OAuth2.0のRFC](https://openid-foundation-japan.github.io/rfc6749.ja.html)に認可フレームワークと書かれています)

## 認証と認可の違い
**認証**
**「誰であるか」**を確認すること
(例)webサービスへログインする際にID、パスワードを入力して本人であることを確認する。

**認可**
**「権限」**を与えること
(例)①東京から大阪までの新幹線のチケットを持っているのでその新幹線に乗る権限がある。(誰であるかは確認しない)
②管理者であれば〇〇という権限を付与する→管理者である証明として管理者のID、パスワードでログインする必要がある。
webサービスでは多くの場合に②のように権限を付与するために認証をおこなうため認可、認証と一緒に記述されるケースが多いです。


## OAuth2.0でできること
アクセストークンを発行することでユーザが**自分のID、パスワード** を渡すことなく、
データへのアクセス権限を第三者のアプリケーションに許可することができる。

## OAuth2.0のフロー
**OAuth2.0には認可フローがいくつかあります。**

```
1: Authorization Code Flow
2: Implicit Flow
3: Client Credentails Flow
4: Resource Owner Password Credentails Flow
5: Refrshing an Access Token
```

ここでは

```
1: Authorization Code Flow
2: Implicit Flow
```

について記載していきます。

## Authorization Code Flow
まず、`Authorization Code Flow`について記載します。

`Authorization Code Flow`は以下の図のような流れになります。
![Authorization Code Flow.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67654/2e716b51-8498-a277-b933-f08af07fe094.jpeg)

### Authorization Code Flowの問題点
Clientがモバイルアプリを使用した場合、callbackURLを不正利用して認可コードを横取りすることができてしまうという点です。図で言うと「認可コードを発行します」の部分で本来Aというアプリに認可コードを返すはずが、Bというアプリに返すような不正ができてしまうということです。

### 対策
この対策として**PKCE(ピクシー)**と呼ばれる認可コードの横取り対策をしたOAuthの拡張仕様が存在します。
簡単には新たにパラメータに**code_challenge_method、code_challenge、code_verifier**を追加してこれを使用してClientが正しいか判断するという処理が追加されます。

具体的なフローの例は今回は記載しませんが興味ある方は調べてみて下さい！

## Implicit Flow
続いて`Implicit Flow`について記載します。
こちらはフローの図は割愛しますが`Authorization Code Flow`と違うところは**認可コード使ってアクセストークンを取得するというフローではなくそのままアクセストークンを返す**という点です。

### Implicit Flowの問題点
こちらはアクセストークンの横取りが可能という脆弱性があり非推奨となってきているので使わない方が良いでしょう:innocent: 

### 対策
こちらもPKCEを使うことで対策ができます。

### 最後に
以上のようにWebアプリケーション向けであれば`Authorization Code Flow` or `PKCE`を
モバイルアプリ向けでは`PKCE`を採用するのが現状では良さそうだと思います。

また機会があればPKCEを実際に実装して記事を書きたいと思います！
data.php

// menu.phpの読み込みを削除してください

// drink.phpとfood.phpを読み込んでください
require_once('drink.php');
require_once('food.php');


// $juiceをDrinkクラスのインスタンスとしてください
$juice = new Drink('JUICE', 600, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/juice.png');
// $coffeeをDrinkクラスのインスタンスとしてください
$coffee = new Drink('COFFEE', 500, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/coffee.png');
// $curryをFoodクラスのインスタンスとしてください
$curry = new Food('CURRY', 900, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/curry.png');
// $pastaをFoodクラスのインスタンスとしてください
$pasta = new Food('PASTA', 1200, 'https://s3-ap-northeast-1.amazonaws.com/progate/shared/images/lesson/php/pasta.png');

$menus = array($juice, $coffee, $curry, $pasta);

?>

インスタンス化
自分のお気に入りyoutube動画を簡単に管理できるアプリの作成

前回の記事は忘れてください...
何というか、調査不足過ぎて普通にAPIがあるし先駆者もいたのでやめました。。。

今日からちょっとしたAndroidアプリを作りたいと思います。

### アプリ概要
* 自分がこのyoutubeの動画いいなぁって思ったものをサクッと管理できる物が欲しい
* 人にあったときこの動画とか見て面白かったんだよねと話題にできる
* youtubeだけでなくツイートとかも管理できるとなお嬉しい
* 【超+α】自分が行った場所で良かった場所とかも管理できたら神

### 機能要件
* youtubeのリンクを管理(登録/閲覧)できる
* 一覧画面はカレンダーになっていて、カレンダーの特定の日を選ぶとその日のクリップ一覧が見れる
* カレンダー検索/フィルタリングができる

### 環境/言語
* Android Studio
* kotlin

## 今日の目標/成果物

環境構築/hello world

### コードと資料

#### 1. 初期設定

流石にAndroid Studioは入っている前提で話します...
![](https://i.imgur.com/3wGrg5v.png)

色々惹かれる初期設定もあったのですが、一旦空のアクティビティで作成しようと思います。

#### 2. Activity

```MainActivity.kt
package com.example.myfavoritecontentsmanage

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

```

特に何も追記していないのでActivityはこのような感じになっています。

#### 3. レイアウト

```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
```

レイアウトファイルも初期設定のまま特に変更していないのでこのような形です。

#### 4. 起動

![](https://i.imgur.com/7HqXFnp.png)

無事hello worldは表示

可能なら1週間くらいで実装を完了させたいところ....


メモ
15日目
Goで乱数を発生させる

##Goで乱数を発生させる方法

- **randパッケージを使う**
- **rand.Seed()を設定する**
- **rand.Intn()で範囲を指定する**

##気を付けるポイント
- rand.Seed()の値が固定されていると、rand.Intn()で表示される値は不変。
- rand.Seed()を **rand.Seed(time.Now().UnixNano())** などとして常に変化するようにする。
- 変数にrand.Intn(n)を追加。これによって表示される値は **0<=i && i <n**

##参考ページ
[rand - Go 言語](https://xn--go-hh0g6u.com/pkg/math/rand/#pkg-examples)
[サンプルで学ぶ Go 言語:Rand](http://www.spinute.org/go-by-example/random-numbers.html)
データベースの基本的な操作

今回はmysqlの基本的操作について学習を行った

データを選択

```sql
SELECT *FROM dbPractice; //データの選択
```
データの追加

```sql
INSERT INTO dbPractice(name,bench,deadlft) VALUE ('hagaseven','150','290')
```
<img width="1440" alt="スクリーンショット 2020-06-18 19.20.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612642/14b70963-449a-1235-b694-ad47e92b2d2a.png">
データを追加することが出来た！

次にデータの更新を行いたい。

```sql
UPDATE dbPractice SET deadlft =300 WHERE id=1; //id=1のデットリフトを３００kgに変化
```
<img width="1440" alt="スクリーンショット 2020-06-18 19.20.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612642/9340d4a8-d5a7-7b7f-0577-872ee9eb053c.png">
見事、id=1の林さんがdeadlliftが３００になった。
（実際は、３００持てません。）

次は、データベースを削除する。

```sql
DELETE FROM dbPractice WHERE id=4
```
<img width="1440" alt="スクリーンショット 2020-06-18 19.33.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612642/d9e253b3-677d-7904-1e1f-977bb8217421.png">
データベースからid=4を削除することに成功した。

次に、他のデータベースとつなげる処理を試していく。

<img width="1440" alt="スクリーンショット 2020-06-18 19.52.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612642/705513ef-f780-182c-002d-774521a5c232.png">
このようなデータベースと先ほどんぼデータベースを結合させたいと思う。

```sql
SELECT * FROM dbPractice INNER JOIN muscle ON dbPractice.body_id =muscle.body_id
```
これによりデータベースの結合を行うことが出来た。

次回は、これらのデータをphpのコードで呼び出す。
Xam.Plugin.Mediaで透過PNGを使うときの注意点

検索しても特に出てこなかったので、同じところで詰まった人に向けて、簡単にまとめてみようと思います。

# 先に結論
`PhotoSize`設定を`Full`以外にすると透過が消えます。
`Full`に設定しましょう。

# Xam.Plugin.Mediaとは
Xamarinで写真を撮影して画像を取得したり、ローカルのストレージから画像を取得したいときに使うと便利なライブラリです。
[jamesmontemagno/MediaPlugin](https://github.com/jamesmontemagno/MediaPlugin)

# 環境
|使用ライブラリ|バージョン|
|:---|:---|
|Xam.Plugin.Media|5.0.1|

# 現象
ここでは、ローカルストレージの透過PNGを取得する処理について扱います。
このとき、`PickMediaOptions`の`PhotoSize`設定によっては、透過PNGなのに透過されません。

# 検証
ここでは、背景が透過のざまりんの画像を使用して、`PhotoSize`に設定できる6種類を試してみました。
`Full`設定時のみ透過されます。
それ以外設定時は、透過だった箇所が黒く変更されます。
![Screenshot_20200618-190827.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280330/6f84b526-b0d3-0d3e-c184-2a78464a4347.jpeg)

# まとめ
透過PNGを使う際は、`PhotoSize`設定を`Full`にしましょう。
それ以外でも、基本`Full`を使っておけば困ることは少ないかと思います。
docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpackerでエラーが出た

#docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpackerでエラーが出たが、解決できたので今後のために備忘録。



##参考URL
https://qiita.com/nsy_13/items/9fbc929f173984c30b5d




##登場ファイル


```Dockerfile.
FROM ruby:2.6

# install package to docker container
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev \
    && apt-get install apt-transport-https \
    && 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 && apt-get install -y yarn \
    && curl -sL https://deb.nodesource.com/setup_10.x | bash - \
    && apt-get install -y nodejs \
    && mkdir /FANTRA

WORKDIR /FANTRA
COPY Gemfile /FANTRA/Gemfile
COPY Gemfile.lock /FANTRA/Gemfile.lock

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

```


```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'"
    environment:
      RAILS_ENV: development
    volumes:
      - .:/FANTRA
      - bundle:/usr/local/bundle
    ports:
      - "3000:3000"
    depends_on:
      - db
    tty: true

volumes:
  mysql-data:
    driver: local
  bundle:
    driver: local
```

```Gemfile.
source 'https://rubygems.org'
gem 'rails', '~>6'
```

```Gemfile.lock
#空白のまま
```

```entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /FANTRA/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

```


##エラー
上記のファイル等を用意した上で、rails newをしようとすると、

```
docker-compose run web rails new . --force --no-deps --database=mysql --skip-test --webpacker
```

こんなエラーが出てきた

```
WARNING: Image for service web was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
/usr/bin/entrypoint.sh: line 8: exec: rails: not found
```

docker-compose buildをしろって言ってくれてるから、実行してみる

```
docker-compose build
```


再度、rails newをしてみてみると、またエラー。

```
/usr/bin/entrypoint.sh: line 8: exec: rails: not found
```

ここでよく見ると、rails: not foundの文字が、、、、、。
Gemfileに書いてあるやつをbundle installしたらええんちゃう？？？

```
docker-compose run web bundle install 
```



これで無事にrails newコマンドを使うことができました。
リファクタリングする上でのポイント（if文）

## リファクタリングとは
リファクタリングとは、冗長なコードを削除したり、汎用性のある効率のいいコーディングに書き換えたりして、ソースを改善すること。

## if文のリファクタリングを行うためのポイント
* if・elseの順番
* 条件式は肯定形を使う
* 単純な条件を先に書く
* ネストを浅くする

**if・elseの順番**
左側には、値が変化する「調査対象」の式を右側には、値が変化しない「比較対象」の式を書くのがおすすめ。

サンプル

```` ruby
 if value >= 5
  # 処理内容
 end
````
**if/elseの場合**

* 条件式は肯定形を使う
    * 「!=」 より 「==」 を使う
* 単純な条件を先に書く

````ruby
# bad
if  a && b == 0
  if c
    # 処理
  end
end

# good
if c
  if a && b == 0
    # 処理
  end
end
````

* ネストを浅くする

ネストとは入れ子構造のこと
if文の中にif文を入れるなどして、入れ子構造になるケースがあるが、ネストが深いほどコードが読みにくくなるため、浅くするようにできるだけ心がけるのが大切。
Express.js関連の気になる記事リンク集【随時】

# この記事は？
Express.js関連の記事をまとめます。
やる気があれば和訳で抜き出しなどします。
最終更新: 2020/06/18

## DB連携
[Creating a REST API with Express.js and MongoDB](https://www.robinwieruch.de/mongodb-express-node-rest-api)

## エラーハンドリング
[How to handle errors in Express](https://www.robinwieruch.de/node-express-error-handling)

> APIと一致しないすべてのルートのリダイレクトを一般化したいと思います。したがって、*アスタリスク付きのワイルドカードルートを使用できますが、すべてのルートの最後のルートとしてこのルートを使用する必要もあります。
> 最後に、ミドルウェアでこのケースを処理し、ワイルドカードルートにエラーをスローさせるだけです。
(...)
>オプションで、これをsrc / utils / errors.jsファイルにある再利用可能なエラーとして抽出できます。この新しいエラークラスは、一般的に使用されるJavaScriptエラークラスを拡張します。ここで追加する唯一の機能は、400 HTTPステータスコードです。

Express.jsに限らず、類似のWebフレームワーク系アプリに応用できそう
[ECCUBE4][payjpプラグイン]受注一覧でpayjpリンクの表示位置不正


# 環境

ECCUBE 4.0.2
プラグインバージョン 1.0.2

# 症状

様々なシステムでクレジットカード決済として`pay.jp`を愛用しています。
自社開発システムは自分で実装しますが、物販サイト(ECCUBE4で構築)では[「PAY.JP 決済プラグイン EC-CUBE 4」](https://subspire.co.jp/product/pay-jp-ec-cube-4-secure/)を利用しています。

本日、指摘があって気づいたのですが、受注一覧で的はずれな受注にpayjpリンクが表示されます。
グチャグチャです。規則性もよくわからず。

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

# 原因

プラグインの不具合です。
`order_index.js.twig`内で受注IDと突き合わせすべきところ出荷IDと突き合わせしていました。

以下の例だと受注ID=830のチャージIDリンクが受注ID=822の場所に表示されてしまっています。
後述したように修正することで正しく表示されます。(プラグイン製造元に報告済)
修正が反映されるまではバージョンアップしないようご注意ください。(1.0.3で修正されると思います)

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

```javascript:order_index.js.twig 
<script>
    $(function(){
        {% for PayJpOrder in PayJpOrders %}
        {% if PayJpOrder.getPayJpChargeId!='' %}
        ★var targetTR=$("#search_result").find("input[name='ids[]'][value={{ PayJpOrder.getOrder.getId }}]").parents("tr");★
        var targetTD=targetTR.find("td:nth(2)");
        if(targetTD.find('.payJpChargeID').length==0){
            var htmlToAppend='<a class="payJpChargeID" data-orderid={{PayJpOrder.getOrder.getId}} href="{{ payJpChargeDashboardLink~PayJpOrder.getPayJpChargeId }}" target="_blank">{{ PayJpOrder.getPayJpChargeId }}</a>';
            targetTD.append(htmlToAppend);
        }
        {% endif %}
        {% endfor %}
    });
</script>
```

## 変更前

```javascript
var targetTR=$("#search_result").find("input[name='ids[]'][value={{ PayJpOrder.getOrder.getId }}]").parents("tr");
```

## 変更後

```javascript
var targetTR=$("#search_result").find("a.action-edit[href$='{{ PayJpOrder.getOrder.getId }}/edit']").parents("tr");
```

# 愚痴

それにしても本件に限らずECCUBEプラグインは仕組みもプラグインの品質もまだまだ低いです・・・。

本プラグインでなく、他のそれなりに使われている(ダウンロード数から判定)複数のプラグインで気軽にバージョンアップして「システム停止(管理サイトも利用不可)」という事例が続いたので「管理サイトからのプラグインの追加・更新は不可」という運用になってしまいました。
GitHubへのSSH接続設定を、ほぼ自動で行うシェルスクリプト

# GitHubへのSSH接続設定を、ほぼ自動で行うシェルスクリプト

というお手軽セットを作ってみました。
https://github.com/yagrush/setup-github-ssh ← **<font color="red">20200622: バグってたので修正しました。すみません！</font>**

対話入力を途中で求められるコマンドを自動で流すことができる [expect](https://www.nist.gov/services-resources/software/expect) というライブラリを使わせて頂いてます。


## 動作環境
* AmazonLinux2 または `yum` が使えるLinux

### その他のOSは…？

※ `setup-github-ssh-step1.sh` の5行目あたり

```
sudo yum install -y expect git
```

の `yum` を `apt-get` に書き換えればDebian系Linuxで動いたり、
`brew` に書き換えればMacでも動くかと思います。

また 対GitHub のみならず、対GitLab などにも流用できるかと。

## 使い方

### 設定を施したいユーザーでターミナルログインする。

### 以下のコマンドで一式をダウンロード＆解凍する。

```shell
wget https://github.com/yagrush/setup-github-ssh/archive/master.zip -O setup-github-ssh.zip; unzip setup-github-ssh.zip; rm -f setup-github-ssh.zip

#ついでにディレクトリを移動しておく
cd setup-github-ssh-master
```

### `setting.sh` の中身を、ご自身の設定に合わせて書き換える。

```setting.sh
export GIT_EMAIL="hogehoge@users.noreply.github.com"
export GIT_USER="hogehoge"
```
↑ `hogehoge` を、ご自身のgithubアカウントのユーザー名に書き換えて下さい。
メールアドレスは、晒しても大丈夫であれば本物のメールアドレスに書き換えて下さい。
匿名アドレスにしたければ `@users.noreply.github.com` はそのままに `hogehoge` のところだけ書き換えて下さい。

### `chmod` コマンドで、３つの.shファイルに実行権限を与える。

```
chmod +x setup-github-ssh-*.sh
```
※すでに実行権限が付いている場合は飛ばしてOKです。

### `setup-github-ssh-step1.sh` を実行する。

```
./setup-github-ssh-step1.sh
```

### `setup-github-ssh-step1.sh` の実行結果にsshパブリックキーが表示されるので、GitHubのWEBページにアクセスして、GitHubアカウントに紐づけ登録する。

* sshパブリックキーの例

```
ssh-rsa AAAAB3NzxJOiM3uGFiAwNNnJk8N7SRrhRFcSR2S84gK544xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx444444444444444444444444444444444xxxxxxxxxxxxxxx4444444444444444444444444444444444444444EXtPdGaZCUKYMFKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxOiLe4d1cL5D/zQ1o59ZEbzSMqrTgrv22ZBFfffffffffffffffffffffffffffffffffffffffffffRyu79XJHpHf hogehoge@users.noreply.github.com
```

* sshパブリックキーを登録する画面を開く
![sshパブリックキーを登録する画面を開く](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/34c357a9-cfcc-fa71-69db-b19cff38abab.png "sshパブリックキーを登録する画面を開く")

* sshパブリックキーを登録する
![sshパブリックキーを登録する](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553715/ee0e22f4-5bd3-9ca1-6298-59b9477246e6.png "sshパブリックキーを登録する")

### `setup-github-ssh-step2.sh` を実行する。

```
./setup-github-ssh-step2.sh
```

### Hi ○○○! ... などと表示されればOK！

```
$ ./setup-github-ssh-step2.sh
spawn ssh -T github.com
The authenticity of host 'github.com (xxx.xxx.xxx.xxx)' can't be established.
...
...
...
Warning: Permanently added 'github.com,xxx.xxx.xxx.xxx' (RSA) to the list of known hosts.
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.
```
VSCodeでRubyをフォーマットする

プログラムを書くうえで欠かせないもの(？)。フォーマット
ということで、今回はRubyで記述したものをフォーマットしようという話です。
（※mac osで操作してメモしてますので、ショートカットなどが多少異なる可能性あり）

#ショートカットを実行
まずは普通にショートカットをポチッ（alt+shift+F。ctrlじゃないよ)
<img width="450" alt="スクリーンショット 2020-06-17 13.39.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636785/0d7b82a5-407c-00ab-c2b1-abc099f24fc8.png">
なんとデフォルトでrubyはフォーマットしてくれません。

ちなみに自分はフォーマッタとして、Prettierをインストールしているのですが、html,js,ts,cssなどのウェブ系言語とその周辺(？)しかフォーマットできないようです。[^a]
（今気づいたけどこれphpもフォーマットしてくれないのか・・・）

[^a]: 有志によってprettierのruby版もあるらしいです。もしかしたらこれもやってみるかもしれない
# rubyのフォーマッタをインストールする
ということで、「フォーマッタをインストール」しよう。（フォーマッタって打ちにくいな、「た」だけ平仮名になる）

調べてみるとRufoというものがいいらしい？
では早速、「Rufo - Ruby formatter」というものをインストール。
<img width="450" alt="スクリーンショット 2020-06-17 13.49.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636785/0bb5cf90-cf94-7971-e975-7d62f127fb9c.png">

まぁ詳細見たら分かる通り、rufoというものをインストールする必要があるらしい。

# rufoをインストールする
ターミナルで「gem install rufo」を叩くだけ。
・・・パーミッションエラーが起きました。
「While executing gem ... (Gem::FilePermissionError)」
（メモらずにターミナルを再起動してしまった。。この１行しか残ってない）

どうやらシステムのrubyを使用していることが原因とのこと。
なので、システムじゃないrubyを使います。

参考サイト：[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150)

じゃあこれで再度実行

```zsh
% gem install rufo
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory.

```

なんでやねんw
と思ったら、「rbenv global X.X.X」を実行してませんでした。順番に読んでいきましょう()
改めて実行してみると無事インストール完了！
あとはvscodeを再起動してください。

# 終わりに
タブ数2かぁ・・・使うかはちょっと悩みどころ。
【CI/CD】UI5プロジェクトのパイプラインを構築するまで　～distフォルダでテスト～

##はじめに
この記事は、UI5のCI/CDパイプラインを構築してみるシリーズの4回目です。

＜過去の記事＞
[【CI/CD】UI5プロジェクトのパイプラインを構築するまで　～環境構築編～](https://qiita.com/tami/items/43b43651792afcea11ea)
[【CI/CD】UI5プロジェクトのパイプラインを構築するまで　～パイプライン編～](https://qiita.com/tami/items/509a7a792143e529fb4a)
[【CI/CD】UI5プロジェクトのパイプラインを構築するまで　～改善編～](https://qiita.com/tami/items/dbbe47746267b75eae5f)

前回まではTest -> Buildの順に実行していましたが、Buildした結果に対してTestを行うようにします。

##distフォルダを対象にテストを行う
Buildの結果はdistフォルダに格納されます。ここにminifyされたjsファイルなどが入っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/44605d35-caad-a278-cc37-3f13777635d8.png)

###Karmaテスト用の設定ファイル
Karmaテスト用のファイルは2つあり、CI環境ではkarma-ci.conf.jsを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/d9489ede-c2b8-5082-7817-49e3cb0b3b2a.png)

karma-ci.conf.jsに以下を追加します。

```javascript
		ui5: {
			type: "application",
			paths: {
				webapp: "dist"
			}			
		}
```
何も指定しないとkarma-ui5はwebappフォルダを見に行きますが、webappフォルダ以外を指定したい場合はpathsに設定します。pathsを指定する場合はtypeも同時に指定する必要があります。
https://github.com/SAP/karma-ui5#paths

この状態で`npm test`を実行すると、テストは正常に終了しますがカバレージに余計なファイルが含まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/051710f4-67ec-e439-0b28-abdeb7e9be4a.png)
Build後は-dbgとつくファイルやComponent.jsは使用しないので、coverageに含める対象を以下のように修正します。

```javascript
		//before
		preprocessors: {
			"{webapp,webapp/!(test)}/*.js": ["coverage"]
		},

		//after
		preprocessors: {
			"{dist,dist/!(test)}/!(*dbg*|Component).js": ["coverage"]
		},
```

この結果、Linesのカバレージは100%になりましたがその他のカバレージは100%を下回っています。この理由についてはまだ調べられていません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/e4e259b7-5f2f-c7af-115c-bc7fce3e5a58.png)

###Jenkinsで実行
Jenkinsで実行した結果も同様になります。（masterブランチでないのでdeployはスキップされている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/490a8124-65fd-633d-9459-56cf4d422424.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/908f8a5b-3bcb-f8a3-9c29-d5d75bc8d7df.png)

###coverageレポートを確認
coverageレポートはWorkspacesフォルダを掘っていくと見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/04565e09-c707-cd32-a935-bdd105aef0d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276021/a21fb4ae-3895-2ae3-d89b-c2381e02f92d.png)
[自宅サーバ] 高速なIPoEでも(自由な)グローバルアドレス欲しいよね [AWS & Synology]

# 自宅サーバで自由に使えるグローバルIPアドレスが欲しいよね
V6プラスを契約した自宅回線、大学やエンタープライズNWでインターネットに鯖を公開したい人向けの記事です。
## 事の発端
今まで契約していた光(コラボ)回線を別の光(コラボ)回線に変更したら、契約プロバイダが払い出したPPPoEを使わないで欲しいと言われてしまい、どうしようか途方に暮れたある深夜、AWS経由させれば自由なIP addr手に入るのでは？！と思いついてしまった。
※もちろん、別にフレッツプロバイダ契約してPPPoEすれば済むじゃんというのはごもっともです。ただ、もっと安く、高速に通信出来ないかという検証も含めてこれやってます。
※こんな面倒なことしなくてもたくさんマネージドなVPNサービスはあるので手間省きたい人はそれを使うのが良いと思います。
## 計画
出来れば、国内の固定IPサービスの最廉価価格帯である 1,100円 を下回りたい。
1. AWSに安価にOpenVPNサーバを立てる
2. AWS側で固定IPを取得する
3. （うちの場合は）Synology DSMにOpenVPN clientを設定する
4. いい感じにルーティングしてインターネットからSynology DSMにアクセスする

## 用意する物
今回は安価に、かつできる限り定額でやっていきたかったので、転送量以外は基本定額なAmazon Lightsailを採用しました。EC2 & Elastic IPでも出来ると思います。（ただちょっとネットワーキングでやること増えそう）

- Amazon Lightsail インスタンスx1 (Amazon Linux, サイズは最小で今回はやりました)
- Lightsail の static IP(アタッチしてる間は無料です)
- V6プラスの回線※  
※今回は443ポートしか疎通出来ない厳しいNW環境下で外部と自由にやりとりすることを目的としているので、国外、大学やエンタープライズNWなどでも活用できると思います。

## 手順
概ね標準的なOpenVPNサーバの構築ですので、詳細な手順は先人達のエントリをご覧頂くとして概要を載せます。
今回は鍵ペアを利用した認証をします。信頼できるCAから証明書類を発行出来る場合は証明書発行うんぬんのところは飛ばして、代わりに証明書を転送しておいて下さい。

1. Lightsailインスタンスを作る
詳細は割愛します。私はAmazon Linuxを選択しましたがご自身が一番使いやすいのを選べば良いと思います。ココに乗ってる手順はAmazon Linuxのものです。
1. LightsailインスタンスのファイアーウォールをWebUIで操作する。 `tcp 443` を開けておく。
2. openvpn, EasyRSAをインストールする
    3. `sudo yum update -y`
    4. `sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm`
    5. `sudo yum install openvpn -y`
    6. `sudo yum install easy-rsa --enablerepo=epel -y`
7. EasyRSAでCAとサーバー証明書、クライアント証明書などを作成
    8. `easyrsa init-pki`
    9. `easyrsa build-ca`
    10. `easyrsa gen-dh`
    11. `easyrsa build-server-full server nopass`
    12. `easyrsa build-client-full client nopass`
13. 作った証明書類をOpenVPNの設定ディレクトリへ移動
    14. `sudo cp pki/ca.crt /etc/openvpn/`
    15. `sudo cp pki/issued/server.crt /etc/openvpn/`
    16. `sudo cp pki/dh.pem /etc/openvpn/dh2048.pem`
17. `ip a` でサブネット情報を確認しておく  
これ次で使うので横着しないで下さい
17. サーバー設定を変える  
`sudo vi /etc/openvpn/server.conf`  
このとき、`proto tcp`, `port 443`, `push "route [インスタンスのプライベートIP] [サブネットマスク]"`を追加しておく。他の設定はお好みで。
18. OpenVPNサーバを再起動しておく  
`sudo service openvpn restart`
19. クライアントに必要な証明書類を転送しておく  
必要なのは、 `ca.crt`, `client.crt`, `client.key`です。設定によって、TLS関連のあれこれなども必要になってきます。
19. 必要に応じて `.ovpn` ファイルを生成しておく
19. NATを設定する
    20. `sudo iptables -t nat -A POSTROUTING -s [OpenVPN ClientのIP] -o eth0 -j MASQUERADE`  
これで OpenVPN clientがインターネットと疎通出来るようになる
    21. ` sudo iptables -t nat -A PREROUTING  -i eth0 -j DNAT --to-destination [OpenVPN ClientのIP]`  
これでグローバルIPへ着信した接続がOpenVPNのclientへ飛ばされる  
今回はインスタンス使い捨てでもいいなと思ったのでこの設定にしてますが、末永く使いたい場合はインスタンスへssh出来るポートを残しておく必要があるのでポート範囲でNATするなり工夫すると良いと思います。
22. クライアントから発着疎通確認しておわり。

## SynologyDSM OpenVPNの設定について
これはおまけ的な情報ですが、 `.ovpn` ファイルに証明書類を一緒くたにして記述する方法はうまくいきませんでした。以下の画面で証明書を一つ一つ指定するとうまくいったので困った人は試してみると良いかもしれません。
![コメント 2020-06-18 191849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448207/b7d83b55-9af8-33c1-c6a2-2051e9986412.jpeg)

## 注意事項
AWSなのでデータ転送量課金があります。そのため一般公開するようなサーバであれば、コストの見積もりをしっかりしておく必要があります。また、DDoSなどの対応をちゃんとしていないと莫大な請求が来たりするかもしれません。
最安のLightsailインスタンスだと1TBまで無料なので、今回の私のニーズとしては十分だったのでこの手法をとりました。

## さいごに
自由なインターネットさいこう。
javascript学習(2020/06/18)

###要素にイベントを追加する



```JavaScript:sample.js
取得した要素.onsubmit = function() {
  処理内容
}
```
onsubmitの部分はイベントによって書き換える
取得した要素のイベントに＝を使ってファンクションを代入する形でイベントが発生したときの処理内容を設定。
イベントに代入するファンクションにファンクション名は付けず、{}内にreturnなし

###フォームに入力内容を読み取る

```JavaScript:sample.js
取得した＜form＞要素.読み取りたいフォーム部品のname属性.value
```


###タグの基本動作をキャンセルする
```JavaScript:sample.js
event.preventDefault();
```


###Dateオブジェクト
Dateオブジェクトは以下のことができる
 1. 現在日時を取得する
 2. 過去や未来の日時を設定
 3. 日時の計算
 
###Dateオブジェクトの初期化
```JavaScript:sample.js
const now = new Date() 
```

Dateオブジェクトを使い、日時の設定や計算を行うとき最初に初期化する必要がある。
newはオブジェクトを初期化するキーワード。

###年、月、日などを個別に取得する
```JavaScript:sample.js
    const year = now.getFullYear();
    const month = now.getMonth();
    const date = now.Date();
    const hour = now.getHours();
    const min = now.MInutes();
```
getMonthメソッドは実際の月-1の数字が取得される。

###Dateオブジェクトから日時を取得する主なメソッド

| メソッド    |       説明 |   
|:-----------------|------------------:|
| getFullYear()             |           年を取得する |
|getMonth()|月を0~11の数値で取得|
|getDate()|日を取得|
|getDay()|曜日を0~&の数値で取得|
|getHours()|時を取得
|getMinutes()|分を取得|
|getSeconds()|秒を取得|
|getMiiseconds()|ミリ秒を0~999の数値で取得|
|getTimezoneOffset()|時差を取得|
|getTime()|1970年1月1日0時からの時間をミリ秒で取得|
|setFullYear(年)|年(西暦)を設定|
|setMonth(月)|月を0~11の数値で設定|
|setDate(日)|日を設定|
|setHours(時)|時を設定|
|setMinutes(分)|分を設定|
|setSeconds(秒)|秒を設定|
|setMiiseconds(ミリ秒)|ミリ秒を0~999の数値で設定|       
|setTime(ミリ秒)|1970年1月1日0時からの時間をミリ秒で設定|



###Mathオブジェクトの主なメソッド、プロパティ
| プロパティ  |       説明 |   
|:-----------------|------------------:|
|Math.PI|円周率|
|Math.SQRT1_2|1/2の平方根
|Math.SQRT2|2の平方根|





| メソッド    |       説明 |   
|:-----------------|------------------:|
|Math.abs(x)|xの絶対値|
|Math.atan2(y.x)|座標(x,y)のX軸からの角度(ラジアン)|
|Math.celi(x)|xの小数点以下を切り上げる|
|Math.cos(x)|xのコサイン|
|Math.floor(x)|x小数点いかを切り捨てて、xより小さい整数にする。xが負数だった場合の結果に注意|
|Math.max(a,b,...)|()内のパラメータのうち最大の数を返す|
|Math.min(a,b,...)|()内のパラメータのうち最小の数を返す|
|Math.pow(x.y)|xのy乗|
|Math.random( )|0以上1未満の乱数|
|Math.round(x)|xの小数点以下を丸める(四捨五入)|
|Math.sin(x)|xのサイン|
|Math.sqrt(x)|x平方根|
|Math.tan(x)|xのタンジェント|
|Math.trunc(x)|xの小数点以下を単純に切り捨てる|



Math.rondom()の0以上1未満のままでは使いづらいので、通常これを0以上または1以上の整数に直す。１以上の整数を乱数で発生させたい場合は次のような式を書く。
この場合はxを欲しい数の上限に置き換える。

```JavaScript:sample.js
Math.floor(Math.random() * x) + 1
```
例:サイコロの目を出したい場合はxを6にする
javascript学習(2020/06/17)

###オブジェクト
オブジェクトとは複数のプロパティを持つデータのまとまり

###プロパティを持つオブジェクトの作成
```JavaScript:sample.js
let 変数名 = {プロパティ名1:データ, プロパティ名2:データ, ...  , プロパティ名X:データ};
```

###プロパティのデータを読み取る
```JavaScript:sample.js
オブジェクト名.プロパティ名
または
オブジェクト名['プロパティ名']
```

###プロパティのデータを書き換える
```JavaScript:sample.js
オブジェクト名.プロパティ名 = 新しいデータ;
または
オブジェクト名['プロパティ名'] = 新しいデータ;
```

###for...in文
```JavaScript:sample.js
for(let 変数名 in オブジェクト名){
　　処理内容
}
```
オブジェクトのプロパティを全て読み取る時に使う繰り返し文。
async/await 

#async宣言
は非同期関数を宣言する。
非同期関数はイベントループを介して他のコードとは別に実行され、結果として暗黙の Promise を返す。

#async内ではawait式が使える
await式は非同期関数の実行を一時停止し、 Promise の解決を待ちます。
そして非同期関数の実行を再開し、解決された値を返します。
Gitのサブディレクトリを(heroku|netlify|AWS Amplify)にデプロイする

```sh
.
├── app/
├── docker/
├── docker-compose.yml
└── README.md
```
docker-composeでlocal開発環境を用意するので、だいたいこんな構成になります。
app/ の中に、`vue create` して作られたファイルが置いてあるイメージです。
しかしデプロイのサンプルは、アプリケーションのファイルのみ含まれたgitリポジトリを丸ごとデプロイする形式になっていることが多いです。

私は`app/`以下のファイルだけデプロイしたい。

## [Heroku](https://devcenter.heroku.com/articles/git)

git subtree で指定フォルダのみpushすることができます

```sh
git subtree push --prefix app heroku master
```

## [netlify](https://www.netlify.com/)

rootにnetlify.tomlを置いてbaseを設定します。
ついでにyarnとnode.jsのバージョンも指定しています。

```sh
.
├── app/
├── docker/
├── docker-compose.yml
├── README.md
└── netlify.toml　← add
```

```toml
[build]
  base = "app/"
[build.environment]
  YARN_VERSION = "1.22.4"
  YARN_FLAGS = "--no-ignore-optional"
  NODE_VERSION = "12.16.3"
```

参考
[netlify docs - File-based configuration](https://docs.netlify.com/configure-builds/file-based-configuration/#sample-file)

## [AWS Amplify](https://aws.amazon.com/jp/amplify/)

rootにamplify.ymlを置きます。

```sh
.
├── app/
├── docker/
├── docker-compose.yml
├── README.md
└── amplify.yml　← add
```

```yml
version: 0.1
frontend:
  phases:
    preBuild:
      commands:
        - cd app
        - npm install
    build:
      commands:
        - npm run-script build
  artifacts:
    baseDirectory: app/dist
    files:
      - '**/*'
```

### amplify.yml 解説
ドキュメントを読んでも詳しいことが書いてないのですが、どうやらamplify.ymlを置くとデフォルトのbuild処理が走らなくなるようです。
そのためymlファイルに全て記述する必要があります。

#### phases
ビルド処理です。
preBuild, build, postBuildの3つのフェーズから成ります

preBuild の先頭でcdしています。以降のビルド処理は/appに対して実行されます。
上で説明した通り、デフォルトのbuild処理はされないため`npm install` `npm run-script build`も記述します

#### artifacts
baseDirectory でデプロイ対象の場所を指定します。
先ほどの`cd app`はビルド処理内の話なので、ここでの指定は`app/dist`となります


参考
[AWS Amplify コンソールユーザーガイド - ビルド設定の構成](https://docs.aws.amazon.com/ja_jp/amplify/latest/userguide/build-settings.html)
[ReactJS アプリケーションをデプロイしてホストします](https://aws.amazon.com/jp/getting-started/hands-on/deploy-react-app-cicd-amplify/)

### aws-exports.jsが生成されない問題
↑の設定でgithub連携のcodeDeployはできるようになります。
しかし、Cognitoを使用した認証機能を追加すると、deployが失敗します。
Cognitoに関する設定を保存した`app/aws-exports.js`が存在しないというのが理由です。
このファイルはgit管理対象外に設定されているので存在しないのは当然なのですが、ビルド処理の中で生成する方法を見つけることができませんでした。
autoKanaを利用してフリガナを自動入力させる

#問題
名前を記入するフォームとそのフリガナを記入するフォームに関して、名前を入力したタイミングで自動的にフリガナ用フォームにフリガナが記入されるようにしたい。

#手順
以下の記事を参考にさせていただいた。
https://testtesttest21.sakura.ne.jp/wp/2018/04/25/%E7%AC%AC1%E5%9B%9E%E3%80%8C%E3%83%95%E3%83%AA%E3%82%AC%E3%83%8A%E3%81%AE%E8%87%AA%E5%8B%95%E5%85%A5%E5%8A%9B%E3%80%8Dautokana%E3%80%80jquery%E3%83%BBjavascrip/


①GitHubよりautokanaのコードを引っ張ってくる。アセットパイプライン下にautoKana.jsファイルを作成し、コピペする。
（私の場合/javascripts/shared　内）


②viewファイル作成

```html:hoge.html.slim

= simple_form_for @hoge, url: hoge_path do |f|
  #formタグにidをつける
  = f.input :name, input_html:{id: 'name'}
  = f.input :name_kana, input_html:{id: 'name_kana'}
```
③autokanaのメソッドを使用する旨を書いたjsファイル作成。
（私の場合/javascripts/pages/samples　内）

```javascript:hoge.js
$(document).ready(
　function() {
    $.fn.autoKana('#name', '#name_kana', {
      katakana : true  //true：カタカナ、false：ひらがな（デフォルト）
  });
});
```


すると
![コメント 2020-06-18 190257.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655942/cf1f35a2-658e-729d-f6d0-9fc946bdca03.jpeg)

できた。
（画面のキャプチャを動画でとる方法わからない）
[Pandas] DataFrameをJSONとして保存、JSONをDataFrameとして読み込み

三体問題内の解の計算は事前に済ませ、保存しておくことが多いので、保存方法について現時点でベストな手法を記録。
具体的な流れとしては、Python上でデータ作成（周期、state, system nameなど）→ pandas.DataFrameを作成 → DataFrameをJSONとして保存、のちにJSONをDataFrameとして読み込みする。

DataFrameをJSONとして書き出し
---
まず、DataFrameを用意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656299/abf717a7-6129-e8ce-bc5c-f8d99d3a6273.png)
これをJSONとして保存するには

```Python
path = "/data_storage/my_data.json"
dataframe.to_json(path, orient="index", indent="4", double_precision=15)
```
まず ```path```で保存先とファイル名、拡張子（もちろん.json）を入力。オプションについては、```orient="index"```でSeries毎に保存しており、```indend="4"```でSeries毎にJSONファイル内で改行してくれる。結果はこんな感じ

```JSON
{
    "0":{
        "mu":0.012150585609624,
        "system":"Earth_Moon",
        "family":"L2_Butterfly_Northern",
        "Period":11.555291205753774,
        "Jacobi":2.745412360915097,
        "Stability":1.000000000003475,
        "state_x":0.940999792653558,
        "state_y":-1.02198464448071e-21,
        "state_z":0.509474299789634,
        "state_vx":0.000000000000002,
        "state_vy":-0.12496802037539,
        "state_vz":0.000000000000028
    },
    "1":{
        "mu":0.012150585609624,
        "system":"Earth_Moon",
        "family":"L2_Butterfly_Northern",
        "Period":11.545291205753774,
        "Jacobi":2.747618763012661,
        "Stability":1.000000000003555,
        "state_x":0.942459953010378,
        "state_y":-5.01931178153858e-20,
        "state_z":0.507105298571933,
        "state_vx":0.000000000000002,
        "state_vy":-0.126877713881638,
        "state_vz":0.000000000000035
    },
```

JSONをDataFrameとして読み込み
---
作成したJSONを読み取るときの注意点としては、```pd.read_json()```のオプションに保存した時と同じ```orient```のオプションを使うこと。

```Python
import pandas as pd
path = "/data_storage/my_data.json"
df_loaded = pd.read_json(path, orient="index")
```

この```orient```が正しくないと、columnsとrowsが入れ替わって読み込んでしまう：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/656299/96c88a40-5881-a101-1af0-573510ca9766.png)
Splunk 改行を削除する

小ネタ

https://splunk-usergroups.slack.com/archives/CD8B6F65Q/p1592463035161900?thread_ts=1592462670.161800&cid=CD8B6F65Q
Slackで見つけたけど、消えてしまうかもしれないので

```sql:delete_return.spl
| makeresults 
| eval field="this 
has 
linebreaks " 
| rex field=field mode=sed "s/(?s-m)[\r\n]//g"
```

`(?s-m)`がすごい :hugging:
MySQLのエラーまとめ

##Mysql2::Error::ConnectionError (Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (38)):

###原因
database.ymlに記述しているソケット先が違っている。


###【解決法】database.ymlに記述しているソケット先は```mysql_config --socket```コマンドで表示されたコードを貼り付ける必要がある。


失敗していたdatabase.ymlの記述は```/var/lib/mysql/mysql.sock```だった。

```mysql_config --socket```と叩いたところ```/tmp/mysql.sock```と表示された。

したがってdatabase.ymlの```/var/lib/mysql/mysql.sock```を```/tmp/mysql.sock```に変えたところ成功した。

###原因
ディレクトリ上で```sudo mysql.server start```をしていない。

###解決法
```sudo mysql.server start```を行う。


##ActiveRecord::NoDatabaseError (Unknown database 'database_test_development')


###原因
開発環境、テスト環境のデータベースがない。

###解決法
```rails db:create```で開発環境、テスト環境のデータベースを作成する。



参考
https://qiita.com/fujitora/items/d341c52706d1954cae28
https://qiita.com/fukuda_fu/items/463a39406ce713396403
EC2でのMySQL　各エラー対応

##◯[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

```my.cnf
[mysqld]
explicit_defaults_for_timestamp = 1
```
参考サイト：https://qiita.com/nnmr/items/79400922df5810756bce

## ◯mysqld --initialize（MySQLの初期化エラー）
```
sudo mysqld --initialize --user=mysql
[ERROR] --initialize specified but the data directory has files in it. Aborting.
[ERROR] Aborting
```
- 解決策
-
```my.cnf
datadir  = /data/mysql
tmpdir   = /data/mysql/tmp
innodb_data_home_dir            = ibdata
innodb_log_group_home_dir       = iblog
```

```
rm -fr /data/mysql/*
install -d -o mysql -g mysql -m 750 /data/mysql/{tmp,ibdata,iblog}
mysqld --initialize  --user=mysql --ignore-db-dir=tmp --ignore-db-dir=ibdata --ignore-db-dir=iblog
echo $?
0
```

参考サイト
https://hirose31.hatenablog.jp/entry/20161004/1475582156

エラー対応後、追記していく。