OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3.9 で Mail送信ログをログに吐き出したかった

# うだうだ

メールの本文とか、ヘッダーとか、ToとかFromとか、とにかくそういうログが見たかった。
出力したかった。

がしかし、公式でもいい方法が見つからず、、、、、、、
ていうか Mailのリファレンスに 設定プロファイルのオプションで `"log"` って用意されてるんだけど
`true` って指定しても、 `debug` って指定しても、どこにもログが吐き出されないわけで。
一体これは、なんのためのオプションなんだと。

Email - 3.9 https://book.cakephp.org/3/ja/core-libraries/email.html#email-configurations


ネットをさまよって、スタックオーバーフローかなんかの記事で app.php内のログの設定で
mail用のscopeを追加してやれば良いんだよって記事を見かけて（どの記事だったか忘れた）
そんなこと、公式のどこにも書かれてなかったぞ。って思って。

とりあえず、Mailer関連のクラス全部片っ端から、`log`とか`config` でgrepして
なんか Log::write してるところを見つけた。ここ。

https://github.com/cakephp/cakephp/blob/3.x/src/Mailer/Email.php#L2157-L2177

これみると、設定プロファイルの `log`はちゃんと読んでるから、あとは、
`'scope' => 'email',` ってなってるから、emailって名のscope用意してやれば良いんじゃなかろうか。

# やってみた
## ↓実際には app.default.php の方に 追加するんだぜ

```app.php

    /*
     * Configures logging options
     */
    'Log' => [
        'debug' => [
            'className' => FileLog::class,
            'path' => LOGS,
            'file' => 'debug',
            'url' => env('LOG_DEBUG_URL', null),
            'scopes' => false,
            'levels' => ['notice', 'info', 'debug'],
        ],
        :
        : log設定のところに email を追加

        'email' => [
            'className' => FileLog::class,
            'path' => LOGS,
            'file' => 'email',
            'url' => env('LOG_DEBUG_URL', null),
            'scopes' => 'email',
            'levels' => ['notice', 'info', 'debug'],
        ],
    ],

```
あと、Emailのプロファイルの logは↓こんな感じで

```app.php
    /*
     * Email delivery profiles
     */
    'Email' => [
        'default' => [
            'transport' => 'default',
            'from' => 'you@localhost',
            //'charset' => 'utf-8',
            //'headerCharset' => 'utf-8',
            :
            :

            'log' => true,
        ],
    ],

```

# でた

APP/logs/配下に、email.logが。
中身は、メッセージIDとか ヘッダーとか、全部出てる 欲しい情報。
うむ。良かった。満足。

いちおう、このログって 送信できたときにしか出力されないんで。たぶん。
（送信途中で、何らかのエラーが起きると、ここ（_logDelivery）までたどり着かないから）
Docker導入時のエラー(You must use Bundler 2 or greater with this lockfile.)

## はじめに
dockerを既存のアプリに導入された際に発生したエラーとその解決法を今回はまとめさせていただきます。

##　エラーの内容
docker file を作成docker-compose.ymlを作成した後にdocker-compose build　コマンドをするとなぜか　

```
You must use Bundler 2 or greater with this lockfile.
```
という内容のエラーが発生しました。

## 解決法
ネットの記事を参考にしたところ

```dockerfile

RUN gem install bundler 
RUN bundle install
```
とRUN bundle installの前に RUN gem install bundler を記述すれば治ると買いてありましたが、既に私は記述していました。

調べていくうちにruby2.5.1の場合はこのようなバグが発生するといった記事を見つけ　rubyのversionを2.7.1にdockerfile　ローカル環境変更した結果今回のエラーは解決しました。

##　参考記事

ruby version変更https://qiita.com/_kanacan_/items/c1499f6c13b1c41da982
JavaScriptで現在日時を表示させてみた

JavaScriptで現在日時を表示するコードを書いたのでメモ程度に残しておきます。

とりあえず雛形の作成から

```:ターミナル
$ mkdir clock
$ cd clock
$ touch index.html
```

作成したhtmlファイルに以下を追記

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>clock</title>
  </head>

  <body>
    <div id="clock"></div>
  </body>
</html>
```

これで雛形が完成したのでjavascriptを書いていきます。

以下のコードを`<div id="clock"></div>`の下に記載してください。

```html:index.html
<script>
  timerID = setInterval('clock()', 500);

    function clock() {
      document.getElementById("clock").innerHTML = getNow();
    }
    
    function getNow() {
      var now = new Date();
      var year = now.getFullYear();
      var mon = now.getMonth() + 1;
      var day = now.getDate();
      var hour = now.getHours();
      var min = now.getMinutes();
      var sec = now.getSeconds();

      var s = year + "年" + mon + "月" + day + "日" + hour + "時" + min + "分" + sec + "秒";
      return s;
    }
</script>
```

これでindex.htmlを実行すると現在日時が表示できます。
Linear01Depth()で線形にした深度値を元の値に戻したい

UnityでDepthTextureを取得する際に、線形にして見やすくするアプローチがあります。
その際使用する関数Linear01Depth()ですが、
それで求めた線形の深度値を「元の深度値に戻したい」時に使うべき関数が見当たらなかったので自作した時のメモを残しておきます。

そもそもLinear01Depth()は内部で何をやっているかというと、BuiltInShaderの内部のUnityCG.cgincを覗くとこんなコードが、

```glsl:UnityCG.cginc
// Z buffer to linear 0..1 depth
inline float Linear01Depth( float z )
{
    return 1.0 / (_ZBufferParams.x * z + _ZBufferParams.y);
}
```
という事で、この計算を元にzを求めましょう。

depth01 = 1.0 / (__ZBufferParams.x * z + _ZBufferParams.y);
↓除算部分をひっくり返す
(_ZBufferParams.x * z + _ZBufferParams.y) * depth01 = 1.0;
↓()を外す
_ZBufferParams.x * z * depth01 + _ZBufferParams.y * depth01 = 1.0;
↓左辺の右半分を右辺に
_ZBufferParams.x * z * depth01 = 1.0 - _ZBufferParams.y * depth01;
↓zだけに残して完成
z = (1.0 - _ZBufferParams.y * depth01) / (_ZBufferParams.x * depth01);

わざわざ中学生レベルの式を書いてしまった。。
という事で、下記の関数で元の深度値に戻すことができます。

```glsl
float Linear01DepthToSrcDepth( float depth01 )
{
    return (1.0 - _ZBufferParams.y * depth01) / (_ZBufferParams.x * depth01);
}
```
ちゃんと探せていないだけですでにある予感はしていますが、一応書き残しておきます。
もしご存じの方いれば情報いただけますと幸いです；
Kubernetes minikube エラー

###エラー
ssh接続後、`minikube stop`コマンドを入力するとエラーが発生する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301446/fbbc5fb0-385a-21ee-f4e2-5c1e79a5d2c9.png)

###解決
単にプロファイルが壊れているだけなので、再度起動すればよい
プロファイル削除
`minikube delete`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301446/d7089369-4df7-524d-5eda-0dea723c99a3.png)

起動
`minikube start` or `minikube start --vm-driver=none`(virtualbox未インスト)
再度ステータス確認
`minikube status`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301446/cb603927-0996-26e4-fbf0-2f3e9d80f853.png)
初心者のためのpandas基礎④日付・時間項目の取り扱い

#pandasとは
Pythonにて、構造化データ（テーブル型のデータ）を扱うためのライブラリです。ファイルの読み込みやその後の加工・抽出処理などを簡単に行うことができ（SQL的な感覚で行うことができ）、機械学習などのデータの前処理で必須となるライブラリです。
他項目への目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/e1d7d0e939f58e7301ea)になります。

#0.ライブラリインポート
pandasにpdという名前をつけてimportする

```python:
import pandas as pd
```
#1. 日付・時間項目変換
Object型で記載された項目をdatetime64[ns]型（Timestamp型）に変換します。
dataframeという定義の｢Day｣という項目を変換すると仮定します。

```python:
dataframe['Day'] = pd.to_datetime(dataframe['Day'])
```

#2.範囲指定
｢Day｣が｢2020年4月1日｣以降のデータを抽出します。

```python:
dataframe = dataframe.loc[dataframe['Day'] > pd.to_datetime('20200401')]
```

#3.オブジェクト型として抽出
datetime64[ns]型であるDayを日付（オブジェクト型）に変換します。

```python:
dataframe['Day'] = dataframe['Day'].dt.date
```
同様のやり方で、年（year）、月（month）、日（day）、曜日（weekday or weekday_name or dayofweek）などのオブジェクト化が可能です。｢date｣の部分を置き換えてください。

応用として、｢Day｣が月曜日のみを抽出すると下記のようになります。

```python:
dataframe[dataframe['Day'].dt.dayofweek == 0]
```

#4.フォーマットを指定してオブジェクト型として抽出
｢Day｣をY年m月d日に変更します。

```python:
dataframe['Day'] = dataframe['Day'].dt.date.strftime('%Y年%m月%d日'))
```
#5.値を丸める
Timestamp型だと、秒まで含まれてしまっているため、日付に丸めます。

```python:
dataframe['Day'] = dataframe['Day'].dt.round("D")
```
切り捨て（floor）切り上げ（ceil）の場合は｢round｣を（）内の構文で置き換えてください。
時間でまるめる場合は"H"、15分毎は"15T"です。
公式のドキュメントは[こちら](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.round.html)を確認ください。

#（応用）日付の差分
四則演算により日付の差分を取得することができます。

```python:
dataframe['Day_delta'] = dataframe['Day1'] - dataframe['Day2']
```
この際の｢Day_delta｣は、｢timedelta型｣となります。
日付で丸める時は｢day｣ではなく、｢days｣なのでご注意下さい。

```python:
dataframe['Day_delta'] = dataframe['Day_delta'].dt.days
```
#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
tableViewのstaticCell使用下においてのdidSelectedRowAt使用法

#section使用時のtableViewの応用例
任意のCellのタップ時に動作を条件分岐させたい

```ruby:swift
import UIKit

class TableViewController: UITableViewController {
    override func viewDidLoad() {
        super.viewDidLoad() 
    }
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("selected Section is: \(indexPath.section)")
        print("selected Row is: \(indexPath.row)")
        
        if indexPath.section == 1 && indexPath.row == 2 {
        // do something...
     }        
```

これで任意のCellのタップ時に動作の条件分岐ができるようになりました。
Atcoder エイシングプログラミングコンテスト Python (A~C)

# 総括
難しかったです。A,B,Cの3問ACでした。
2進数がよくわからないのでDは問題をみた瞬間スキップ、E問題はできそうな気がしたものの回答例をみてもよくわからず・・・。


#問題
(https://atcoder.jp/contests/aising2020/tasks)


# A. Number of Multiples
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668985/46efbf0a-c190-102a-d4a7-430676282498.png)

##### 回答
```python

L, R, d = map(int, input().split())

count = 0
for i in range(L, R+1):
    if i % d == 0:
        count += 1

print(count)

```
素直に書きました。ほかの方はもっとかっこいい書き方をしているみたいですが。

# B. An Odd Problem
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668985/e284353d-bbb3-c37f-4f98-c9bd68c46b2f.png)

##### 回答
```python

N = int(input())
a = list(map(int, input().split()))

count = 0
for i in range(0, N, 2):
    if i % 2 == 0 and a[i] % 2 != 0:
        count += 1
print(count)
```
こちらも素直に書きました。
問題分は奇数ですがリストの添え字は偶数をとってきます。


# C. XYZ Triplets
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668985/8f6e24aa-63e5-8c16-949f-850aef586dcf.png)

##### 回答
```python
N = int(input())

keys = [i for i in range(1, N+1)]
values = [0] * N
count_dict = dict(zip(keys, values))

for x in range(1, N//6+7):
    for y in range(x, N//6+7):
        for z in range(y, N//6+7):
            n = x**2 + y**2 + z**2 + x*y + y*z + z*x
            if n > N:
                break
            if x == y and y == z:
                count_dict[n] += 1
            elif x != y and x != z and y != z:
                count_dict[n] += 6
            else:
                count_dict[n] += 3

for v in count_dict.values():
    print(v)
```
素直に書くとx,y,zそれぞれで```range(1, N+1)```のforループを回して```x**2 + y**2 + z**2 + x*y + y*z + z*x = n```を判定すればよさそうです。
しかし制約が10**4なので普通に3重ループをすると間に合いませんので計算量を抑えることを考えます。

まず考えたのは、```(x,y,z) = (1,1,1)```である場合nは6なので、どれだけ多くてもforループで回す最大値は```N//6```くらいでよさそうです。ただし添え字を```+1```しなければいけないことを考えると余裕をもって```N//6+7```としました。
(本番では```N//6+7```を使用しましたが、```10**4```という制約を逆に使うと、```(x,y,z) ```は高々100くらいまでしか使えないということがわかりますね。これは本番中に気づきませんでした・・・。)

で、これだけではたぶんぎりぎり間に合わなそうなので、もうちょっと計算量を減らすことを考えます。

何通りか例を挙げてみると下記のことに気が付きます。
- ```(1,2,3)```と```(1,3,2)```と```(2,1,3)```と```(2,3,1)```と```(3,1,2)```と```(3,2,1)```のようにx,y,zがすべて違う場合にnが同値になる組み合わせは6つある
- ```(1,1,2)```と```(1,2,1)```と```(2,1,1)```のように2つが同じで1つが違う場合にnが同値になる組み合わせは3つある
- ```(1,1,1)```のようにすべて同じ数字の場合はnが同値になる組み合わせは1つある

したがって、x,y,zのforループの範囲をそれぞれ```range(1, N//6+7)```、```range(x, N//6+7)```、```range(y, N//6+7)```として、上記の3通りの場合でcountを+6、+3、+1してやればよさそうです。

あとはnがNを超えた場合に```break```いれておけば何とか間に合います。
Railsで「テスト駆動開発」の '多国通貨' を書いてみた

## 書籍
https://www.amazon.co.jp/dp/4274217884

## リポジトリ
https://github.com/ymstshinichiro/tdd_rails

基本的には↑を見たりコメントいただけると嬉しいです(お恥ずかしい点が多々ありますが、そこはスルーいただけると何より...)。


以下は蛇足です。

## 感想
いくつか現場を回ってみて、ちゃんとテストが回っている現場というのはなかなかないものだなあと痛感しています。特に今の現場は厳しい。

そんな課題感を少しでも打破できないか？と思って手に取ったのが「テスト駆動開発」。
読んでみると、確かに面白かった。普段、ペアプロでもここまで細かく他人の書くコードが出来上がるまでを追うことはほぼないと思います。
レッド -> グリーン -> リファクタリング という流れの明確さもわかりやすくて良かったです。

そして、読み終わっただけでは少々物足りなかったので実際に手を動かして作った、というのが冒頭のリポジトリ。
取り組んでみて以下のような気づきがありました。

- Railsに慣れてきたことで自分の考え方も狭くなってしまっていた
    - マイグレーションはRails Way的な考えを最初に持ってきてしまいがち
    - もっと違う実装やアプローチはないか？と考えるきっかけになった
        - Railsらしく作るのはリファクタリングの段階でも構わないはず
- 振る舞いと責務は似てるけどちょっと違うなという観点が自分の中でできてきた
    - 別の言い方をすると module vs class
    - 手続きの少ないコードにするにはどうするか？と考えるようになった
        - あと、凝集度
- リファクタリングが楽しくなってきた
    - より綺麗に、よりわかりやすくを目指す
        - そのために書き方のバリエーションを増やす勉強が面白かったり


あと、単純に `Rails new` してイチからコード書くというのをやるのも久々だったので面白かったですね。
学んだことを生かして、お仕事で触っているコードも、同じくらい触りやすいコードベースにしていけるように頑張りたいと思います！

最後になりましたが、Kent Beckさん、和田卓人さんに改めて感謝を申し上げます。ありがとうございました！
Ruby で任意個の整数の最大公約数・最小公倍数を求める

Ruby で整数 `a` と `b` の最大公約数，最小公倍数を得るには，それぞれ [Integer#gcd](https://docs.ruby-lang.org/ja/2.7.0/method/Integer/i/gcd.html)，[Integer#lcm](https://docs.ruby-lang.org/ja/2.7.0/method/Integer/i/lcm.html) を用いて

```rb
# 最大公約数（GCD: Greatest Common Divisor）
a.gcd(b)

# 最小公倍数（LCM: Least Common Multiplier）
a.lcm(b)
```

のようにする。

たとえば，4 と 6 の最大公約数，最小公倍数は

```rb
puts 4.gcd(6) # => 2
puts 4.lcm(6) # => 12
```
といった具合。

では三つの整数 `a`，`b`，`c` の最大公約数，最小公倍数は？
$a$，$b$，$c$ の最大公約数は，「$a$ と $b$ の最大公約数」と $c$ の最大公約数なので，

```rb
a.gcd(b).gcd(c)
```

で得られる。
最小公倍数も同様で，

```rb
a.lcm(b).lcm(c)
```

で得られる。

では，整数の組が配列で与えられていたら？
以下のように書けばよい。

```rb
numbers = [30, 20, 15]

# 最大公約数
puts numbers.inject(:gcd) # => 5

# 最小公倍数
puts numbers.inject(:lcm) # => 60
```

[Enumerable#inject](https://docs.ruby-lang.org/ja/2.7.0/method/Enumerable/i/inject.html) にはブロックを与えずにシンボルを与える用法があったよね。
Gitでのファイル名変更

# 起こったこと
gitを使って開発をしている際に、text_HOME.svgというファイル名をtext_home.svgに変更したところ`nothing to commit, working tree clean`と言われました。
どうやらファイル名の変更がGitに差分として認識されていないよう。

## 実験
同じような状況を再現してみます。

ディレクトリ`rename_test`に実験用のファイルtext.txtが存在しており、working treeには何もない状態です。
<img width="690" alt="スクリーンショット 2020-07-13 21.57.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576866/03a0d821-28de-acc0-8c65-da9069567713.png">

それでは、test.txtをTest.txtにリネームしてみます。
<img width="593" alt="スクリーンショット 2020-07-13 22.15.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576866/218cdf11-e800-3018-fa54-e4927e35a8df.png">

普通にmvコマンドを使ってtext.txtをリネームしてもgitは差分を認識してくれません。

# git mvコマンド

次は`git mv`を使用してファイルをリネームしてみます。
<img width="520" alt="スクリーンショット 2020-07-13 22.18.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576866/17bb9b67-a1aa-6289-d6b2-cb2dfeb09a3e.png">


**今度はファイル名の変更が差分として認識されました**🙌


# 参考
- [ファイルのリネームはgit mv でやろう](http://tenyo-ten.hatenablog.com/entry/2016/09/30/095213)
簡単レシート印刷 receiptline を導入してみた

街のお店で iPad のレジをよく見かけるようになりましたね。
一般的にタブレット POS と呼ばれています。

おかげで？レシートプリンターがネットオークションやフリマアプリに出品されるようになりました。
業務用ってワクワクしませんか？個人でも利用できる業務用スーパーも人気がありますよね。

ネットには Raspberry Pi でレシートプリンターの制御にチャレンジしたブログもあって楽しそうです。
レシートプリンターの落札を試みつつ、レシート印刷にトライしてみようと思います。

# レシートプリンターで印刷するには

レシートプリンターで印刷する手段はいろいろあるので、独断で整理してみました。

- デスクトップアプリ向け
  - Windows プリンタードライバー
  - Linux や Mac の CUPS ドライバー
- スマートフォン・タブレットアプリ向け
  - iOS 用 SDK ライブラリ
  - Android 用 SDK ライブラリ
- コンソールとエスケープシーケンスが好きな人向け
  - StarPRNT コマンド
  - ESC/POS コマンド
- 玄人向け
  - OPOS (Win32, .NET)
  - JavaPOS
- オープンソース
  - GitHub に多数
  - Python, JavaScript, Java, PHP, Ruby, Go, ...

メーカーさんが提供しているものは、ドキュメントもサポートも充実しています。
ここで記事にする意味があるのは、オープンソース一択と言えると思います。

多種多様なオープンソースの中に、日本発のプロジェクトもありました。
https://github.com/receiptline/receiptline

JavaScript / Node.js の変換ライブラリです。
テキストを入力すると、SVG 画像やレシートプリンターのコマンドを出力します。
アスキーアート的に文字を並べると清書してくれるイメージですね。

おまけにプレビューできる開発ツールが付いています。
プレビューに対応する印刷手段は意外に少ないかもしれません。
これならレシートプリンターを持っていなくても試すことができます。

# receiptline をセットアップ

## 開発する人

npm でインストール・実行して、`http://localhost:10080/` を開きます。
https://www.npmjs.com/package/receiptline

```bash
$ npm i receiptline
$ cd node_modules/receiptline
$ npm start
```

## 一般の人

GitHub からダウンロード・展開して、`designer/index.html` を開きます。
https://github.com/receiptline/receiptline

# hello, world!

開発ツールを使ってみましょう。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/5693423b-3ace-c8c2-df03-87607dec691e.png)

左側の黒い編集エリアに文字を入力してみます。
編集エリアの文字の大きさは Zoom スライダーで適当に調節。

```text:ReceiptLine
hello, world!
```

入力すると、右側の白いレシート用紙にプレビューが表示されます。
文字列はレシート用紙の中央に配置されました。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/bf0a24ca-cdf1-c2f2-6c80-a887688a4fb8.png)

レシート用紙の幅は Width スライダーで変更することができます。
単位はインチ・ミリではなく文字数 (桁数) となっています。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669512/e641facc-a4f5-684f-8c23-aecd46de1e0b.png)

財布の中に入っていたレシートの多くは、1 行あたり漢字 16 文字 (32 桁) でした。
ところが、文字数が違うレシートや、幅広のレシートも・・・

# 混沌のレシート世界

昔の明和電機社長ブログから引用。
“レシートの印刷の大混乱ぶり、どうにかならんものか・・・”
https://www.maywadenki.com/blog/2011/05/17/post-bbf8/

これは今でも変わっていないと思います。
果たして混沌のレシート世界に秩序をもたらすことができるのか？

次回は文字装飾を試してみようと思います。
vagrant up時に default: SSH auth method: private keyから進まないWindows 10

# 環境
- Windows 10 Home
- VirtualBox 6.1.10
- vagrant 2.2.9

---

vagrant up時に`default: SSH auth method: private key`から進まなく、仮想マシンが起動しません。
調べて出てくる方法をやったが解消せず。
やったこと↓↓
- [新たなprivate keyの生成](https://qiita.com/d2cdot-mmori/items/1c340f175ae510e4456a)
- [vagrantfileに追加記載（ケーブル接続について？）](https://qiita.com/is_ryo/items/d67d29fc56cf3cd07199)
- VirtualBox のversionを上げたり下げたり

# 結論
PowerShellで管理者として以下のコマンド実行、Hyper-Vをoffにする

```
PowerShell > bcdedit  /set hypervisorlaunchtype off
```
その後PC再起動

`PowerShell>bcdeditコマンド `で確認してみると

```
PowerShell > hypervisorlaunchtype    Off
```
と変わっており、vagrant upできた。

# 補足

自分はWSL経由でDocker for Windowsを入れていたのですが、その際Hyper-Vがautoに設定されていた模様。
Hyper-Vをoffの状態でDockerを起動してみると
<img width="511" alt="docker_error.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327519/2d409df1-3138-9aa1-617c-daaa6617bc53.png">
と表示され、起動できません。

vagrant使うときとDocker使うときでいちいちHyper-Vのon,offを上のコマンドで設定しています。
tcpdumpで得たパケットキャプチャをJavaで読み込む

tcpdumpでパケットキャプチャした結果を読みたいが、Wiresharkで調べるのではなく、なんらかのプログラムで読み込ませたい。pktsというJavaライブラリを使って読み込むことができたので、実施した内容をメモする。

## キャプチャを行なったコマンド

TCPハンドシェイクの最初のSYNパケットとDNS応答から、通信先のドメインの一覧を取得したいので以下のようにフィルターを設定した

```bash
# 次の条件のいずれか満たすパケットを抽出する
# - SYNフラグが立っている、かつ、ACKフラグが立っていない
# - 送信元ポートが53(DNS)
sudo tcpdump -s 0 -i en0 -nn -w tcpdump.pcap \('(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack) ==0'\) or src port 53
```

## Javaで読み込む方法

[pkts](https://github.com/aboutsip/pkts)というJavaライブラリを使った。簡単な実装例の一部は以下の通り。

```java
final Pcap pcap = Pcap.openStream("tcpdump.pcap");
pcap.loop(new PacketHandler() {
  @Override
  public boolean nextPacket(Packet packet) throws IOException {
    if (packet.hasProtocol(Protocol.UDP)) {
      System.out.println(packet.getPacket(Protocol.UDP).getPayload());
    }
  }  
}
```

IPv4やUDPの場合、パケットを取得することでそのヘッダー部分の情報を取得できる。

```java
if (packet.hasProtocol(Protocol.IPv4)) {
  IPv4Packet ipv4Packet = (IPv4Packet) packet.getPacket(Protocol.IPv4);
  String srcIP = ipv4Packet.getSourceIP();
  String dstIP = ipv4Packet.getDestinationIP();
}
```

Payloadの内容を読み込みたい場合は、以下のような方法でバイト配列として取得できる。

```java
UDPPacket udpPacket = (UDPPacket) packet.getPacket(Protocol.UDP);
Buffer buffer = udpPacket.getPayload();
byte[] bytes = buffer.getArray();
```

DNSのパケットとしてパースする部分は、DNSのパケットフォーマットを参考にして自前で書く必要がある。DNSの場合はドメイン部分や応答の数が可変なのでやや面倒。フォーマットを気にせずにとりあえず文字で読むことだけを目指して非常に雑に実装したものは[こちら](https://github.com/hiromitsu7/tcpdump-util)。

## 参考にしたリンク

- https://www.javahelps.com/2017/08/parse-pcap-files-in-java.html
初心者のためのpandas基礎　まとめリンク

#pandasとは
Pythonにて、構造化データ（テーブル型のデータ）を扱うためのライブラリです。ファイルの読み込みやその後の加工・抽出処理などを簡単に行うことができ（SQL的な感覚で行うことができ）、機械学習などのデータの前処理で必須となるライブラリです。

#本記事の位置づけ
pandasでデータの前処理を行う際に必要な処理を中心として個別の記事にまとめてあります。
その個別の記事のリンクを本記事ではまとめてありますので、目次としてお使い下さい。

#目次

* [1.読み込み＆加工](https://qiita.com/Yanagawa_Yoshihisa/items/112ec0491cb547e6e386)
* [2.データ概要把握](https://qiita.com/Yanagawa_Yoshihisa/items/e83d0bdedf024956cb51)
* [3欠損値処理](https://qiita.com/Yanagawa_Yoshihisa/items/c418e360ce9319f2af06)
* [4.日付・時間項目の取り扱い](https://qiita.com/Yanagawa_Yoshihisa/items/b3427ddd69d74f99802b)
* [5.Pivotテーブル（Excel対比付き）](https://qiita.com/Yanagawa_Yoshihisa/items/df8880b981306539c797)
* [6.Group by](https://qiita.com/Yanagawa_Yoshihisa/items/34053cf4feee39f8593e)

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
Tensorflow・kerasでCNNを構築して画像分類してみる（実装編１）

この記事ではCNNをTensorflow・kerasで構築していきます。CNNの概略については前回記事の
[Tensorflow・kerasでCNNを構築して画像分類してみる（概要編）](https://qiita.com/kazuboy/items/b08b1bfacdc6ec393d93)
で書いてきました。
今回はデータのダウンロードとデータの確認までを書きます。前提となる環境等は下記となります。

## 前提/環境
前提となる環境とバージョンは下記となります。
・Anaconda3
・Python3.7.7
・pip 20.0
・TensorFlow 2.0.0

この記事ではJupyter Notebookでプログラムを進めていきます。コードの部分をJupyter Notebookにコピー＆ペーストし実行することで同様の結果が得られるようにしています。

今回はデータセットとしてCIFAR-10というデータセットを利用します。CIFAR-10のデータセットについては
[The CIFAR-10 dataset](https://www.cs.toronto.edu/~kriz/cifar.html) を参照してください。


###データのダウンロード
tensorflowではデータセットをMNIST同様に自動的にダウンロードします。

```python:code
import tensorflow as tf
#ヘルパー関数などもimport
import numpy as np
import matplotlib.pyplot as plt

from tensorflow.keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
```
結果
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170500096/170498071 [==============================] - 951s 6us/step

###データの確認
まずは各データの大きさの確認をします。__データを確認するのは非常に重要なので必ず確認しましょう__

```python:code
print('x_train.shape : ', x_train.shape)
print('x_test.shape : ', x_test.shape)
print('y_train.shape : ', y_train.shape)
print('y_test.shape : ', y_test.shape)
```
結果
x_train.shape :  (50000, 32, 32, 3)
x_test.shape :  (10000, 32, 32, 3)
y_train.shape :  (50000, 1)
y_test.shape :  (10000, 1)

CIFAR-10データセットは上記のようなデータです。CIFAR-10データセットは60000枚の画像データセットです。訓練用データとして50000枚、評価用のデータとして10000枚からなります。ラベルについては10クラスに分類されています。airplane,automobile,bird,cat,dog,frog,horse,ship,truckの10種類です。画像は32×32×3のサイズです。縦32、横32、カラー画像なので色チャネルが3という形で表現されています。

では実際の画像を見てみましょう。

```python:code
plt.imshow(x_train[1])
plt.grid(False)
plt.show()
```

結果として下記のような画像が表示されます。
![CIFAR10の画像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659138/a917967b-8fe7-3f71-798c-ce945447264d.png)

shapeを見てみると32×32×3となっていますが、データ自体を見ましょう多次元の配列になっていることがわかります。

```python:code
print(x_train[1])
```
結果　（一部抜粋）
[[[154 177 187]
  [126 137 136]
  [105 104  95]
  ...
  [ 91  95  71]
  [ 87  90  71]
  [ 79  81  70]]

 [[140 160 169]
  [145 153 154]
  [125 125 118]
  ...
  [ 96  99  78]
  [ 77  80  62]
  [ 71  73  61]]

 [[140 155 164]
  [139 146 149]
  [115 115 112]
  ...

というような行列になっています。

##まとめ
ここまでデータを実際に確認しました。画像はMNISTの手書き文字セットと異なり、多次元の配列で表現されていることがわかりました。
データセットの構造を理解すると、処理のイメージもつきやすいとおもいます。
次回以降はデータの前処理、CNNの構築に入ります。
macにPostgreSQLをインストールした時にpsqlコマンドが使えない時に確認すること

インストール直後にpsqlコマンドが使えなかった時のメモ

####環境
・macOS Catalina 10.15.5
・PostgreSQL 12.3



#####パスは通した？？
bashではなくzshです。
ホームディレクトリで

`ls -a`

して

`.zshrc`

を開きます。

そこで　https://qiita.com/shuissnow/items/94621e8bf9c939ba8986
この記事を元にパスを通しましょう。



#####ユーザーの確認

パスが通ってない場合、おそらくユーザーの問題です。

psqlコマンドのみをterminalに打つと現在ログインしているユーザーでPostgreSQLにログインしようとします
。

しかし、PostgreSQLのデフォルトのユーザーはあなたではなく[postgres]です。


なので、

```
psql -U postgres
```

ユーザーを指定してあげた上でインストール時に設定したパスワードを入力すると入れます。







#####追記
インストールする時に適当にnext押して進んだからかも。。。。
後、設定変更する方法何かあると思うのでユーザーを変更したい。
Pythonを使ってpixivタグ検索とイラスト保存まで

#はじめに
Pythonからpixivのイラストいっぱい見たかったんです。
pixivpyの日本語情報が少なそうだったのでメモ書き程度に残しておきます。

#環境
Windows10
Python 3.8
pixivpy 3.5.8 ： https://github.com/upbit/pixivpy

#準備
pixivpyを準備します
コマンドプロンプトから

```
pip install pixivpy
```
を実行

#コード

```python:tagsearch_pixivpy.py
from pixivpy3 import PixivAPI
from pixivpy3 import AppPixivAPI

import json
import os
from time import sleep

def login(id, password):
    api = PixivAPI()
    api.login(id, password)
    return api

def search_and_save(apilogin, searchtag, min_score, range_num, directory):
    api = apilogin
    aapi = AppPixivAPI()

    saving_dir_path = os.path.join(directory, searchtag)
    if not os.path.exists(saving_dir_path):
        os.mkdir(saving_dir_path)

    for page in range(1, range_num + 1):
        json_result = api.search_works(searchtag, page=page, mode='tag')
        illust_len = len(json_result.response)

        for i in range(0, illust_len):
            illust = json_result.response[i]
            score = illust.stats.score

            if score <= min_score:
                continue
            else:
                print("漫画:" + str(illust.page_count) + "ページ") if illust.is_manga else print("イラスト")
                if illust.is_manga:
                    print(">>> title:", illust.title)
                    manga_info = api.works(illust.id)
                    for page_no in range(0, manga_info.response[0].page_count):
                        page_info = manga_info.response[0].metadata.pages[page_no]
                        aapi.download(page_info.image_urls.large, path=saving_dir_path)
                        sleep(1)
                else:
                    print(">>> title:", illust.title)
                    aapi.download(illust.image_urls.large, path=saving_dir_path)
                    sleep(1)

def main():
    searchtag = "検索タグ"  #検索タグを入力。半角スペースで分けることで複数タグ検索可能
    min_score = 2000    #このスコア以上のイラストのみDL
    range_num = 1   #この値のページまで検索。1p当たり30枚
    directory = '保存先ディレクトリ'  #指定したディレクトリの下に検索タグ名のフォルダを作成して，そこに保存します

    apilogin  = login("ユーザ名", "パスワード") #ユーザ名とパスワード入力

    search_and_save(apilogin, searchtag, min_score, range_num, directory)

if __name__ == '__main__':
	main()
```

main関数以下の変数を変えることでお好きに検索できます。
漫画形式(一つのタイトルに複数のイラストが付く形式)の投稿にも対応しています

#アイデア
- GoogleDriveに直接保存するようにしたい
- 検索したイラストからスコア順で上位20%のものをピックアップする

#参考サイト
- [pixivからイラストを無限に集めてみる[python]](https://www.mathgram.xyz/entry/scraping/pixiv)
- [pixivから任意のイラストレーターさん方のイラストを無限に取得したかった](https://ithikawa.hatenablog.com/entry/2018/11/11/203125)
- [pixivのフォローユーザーの漫画・イラストを一括DL](https://qiita.com/Hirosaji/items/304de7508df4b1cae904)

どの方も丁寧な記事で大変参考になりました。
private extension のすゝめ

## private extension ?

private メソッドをまとめておきたい場合は以下のように記述することができます。

```swift
private extension Model {
    func foo() {}
    func bar() {}
}
```

## private func はダメなの？

もちろんダメではないです。
しかし private メソッドが複数ある場合は **private extension** 内にまとめて記述する方が良いと考えています。

私自身、以前はコメントを記述してセクション分けしていました。
しかしコメントを記述しただけなので当然 private メソッド以外も記述可能です。

```swift
// MARK: - Private methods
extension Model {
    private func foo() {}
    private func bar() {}
    func baz() {}    // private でないメソッドも記述できる :(
}
```

コメントは保守されないことが多いので、一般的にコメントと実装は乖離していく傾向にあります。
また個人のプロダクトであっても、過去の自分が決めた「自分ルール」は **必ず** 破られます。

コメントに頼らないコードを書きたいと考えたときに **private extension** が効果を発揮します。
(もちろん先人が残した丁寧なコメント達にはいつも大変お世話になっております)

## 注意事項

```swift

struct ContentView: View {
    ...
    func qux() {
        let model = Model()
        model.foo()    // ❗️'foo' is inaccessible due to 'fileprivate' protection level
    }
}
```

外部からアクセスしようとすると確かに Xcode がエラーを出してくれます。
しかし、デフォルトでは `'fileprivate' protection level` となるので注意が必要です。
fileprivate を許容できない場合は、 extension 内で private として宣言すれば private が適用されます。

```swift
private extension Model {
    private func foo() {}
}
```

正直微妙かなと思います。
私は fileprivate を許容して **1クラス1ファイル** で運用していくことにします。

> 過去の自分が決めた「自分ルール」は **必ず** 破られます。

おわり
ITコンサル十年選手が効率的に仕事を行うために実施しているMacの設定（導入アプリ）

#はじめに
新卒で外資系IT企業に入社して、１0年以上、ITコンサルトとして働いています。基本PC操作は無駄なくやるのが絶対条件で、ショートカットとかを新卒の際はがっつりたたき込まれました。ちょうど、Macの機種変更を実施しているので、効率派の私の基本的な設定をメモ代わりに記載します。そんなに珍しいものではないですが、参考にして頂ければと思います。

#追加導入アプリ
##BetterSnapTool（ウインドウ管理）【有料】
App Storeの有料アプリの上位の定番です。言葉では説明しにくいのですが、うまい感じで、ウインドウの大きさを調整してくれます。ショートカットと組み合わせることで、ウインドウの位置と大きさを自由に素早くコントロール出来ます。右左でウインドウを併記したい場合やフルスクリーンを使用せずに全画面表示をしたい倍などに便利です。
<導入はこの方の記事を参考すると良いと思います。[こちら](https://pc-karuma.net/mac-app-bettersnaptool/)>

## Hyperswitch(アプリ切替)
コマンド＋タブのアプリの切替をWindows風に効率的に実施してくれます。Mac標準だと、アイコンのみの表示なのと、同一のアプリは複数開いていても、一つにまとめられてしまします。こちらを導入すると、サムネイルを表示してくれるのと、複数開いている場合は、複数表示されるので、Excelなどを複数開いて作業するのに便利です。
<インストールは[こちら](https://bahoom.com/hyperswitch)>
<導入はこの方の記事を参考すると良いと思います。[こちら](https://ryosukemizuta.com/introduce_hyperswitch/)>
![スクリーンショット 2020-07-13 21.08.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/c20456ff-54ee-4283-bdec-8d1704113ee2.png)

## Clipy（クリップボードの履歴管理）
クリップボードの履歴を管理してくれます。コントロール C&Vがさらに効率化されます。
<インストールは[こちら](https://clipy.softonic.jp/mac)>
<導入はこの方の記事を参考すると良いと思います。[こちら](https://qiita.com/iwaseasahi/items/023964b426305375489e)>
![スクリーンショット 2020-07-13 21.13.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/daf461f0-ece4-0205-028e-0f1a5453d4be.png)

## Todoist（タスク管理）
タスク管理（ToDo管理）は、標準でもありますし、色々あるので好みの範疇だと思うのですが、私はこれが好きです。理由は繰り返しのタスクに強いので、週次とか月次で必ずやるタスクが管理しやすいこと。細かにカテゴリーを切れるのでプロジェクト単位とかで管理できること。モバイルアプリの出来もわりと良いこと。無料でも不自由なく使えることです
＜公式サイトは[こちら]('https://todoist.com/ja')＞

##Homebrewdでのアプリ管理
これについては、[こちら]('https://qiita.com/Yanagawa_Yoshihisa/items/a2441d98d3c08250a8ed')に記載しました。

#OS設定
## トラックパットの感度変更
標準だと感度が悪いので、感度の設定を変更します。｢システム環境設定｣→「トラックパッド」。クリック弱い、軌跡の早さMaxよりちょっと遅めがお勧めです。
![スクリーンショット 2020-07-13 21.25.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/9480016e-fce3-3ff9-f43e-b529bb2fadca.png)

## ログイン時起動アプリの設定
よく使うアプリや常時起動させたいアプリは、ログイン時に起動するようにします。｢システム環境設定｣→「ユーザとグループ」→「ログイン項目」
![スクリーンショット 2020-07-13 21.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/29103c50-7cbe-e21b-f46a-87e3bdc86f0d.png)

## ショートカットの設定
Macではアプリ毎のショートカットを割り振れるので、Officeとかでショートカットがあたっていない機能は、カスタマイズをお勧めします。｢システム環境設定｣→「キーボード」→「ショートカット」。これについては別途記事にしようと思います。
![スクリーンショット 2020-07-13 21.37.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/600679/6b585b63-bf49-f62e-03b3-5b913a15e5c9.png)

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
【駆け出し】Reactの導入【create-react-app】

## create-react-app とは
Reactの開発環境を簡単に構築できるツールでReact開発元のFacebookが公式に公開しているツールだそうです。

## create-react-appを使えるように設定
必要な条件は`node`と`npm`がインストールされていることなのでここから設定していきます。

- homebrewをインストール
　→すでにインストール済 `homebrew -v`で確認
- nodebrewをインストール

```zsh:ターミナル
brew install nodebrew
nodebrew -v
```
- nodeをインストール

```zsh:ターミナル
nodebrew ls-remote　　　　　　 すべてのバージョンを一覧表示
nodebrew install stable　　　 安定版をインストール
mkdir -p ~/.nodebrew/src　　　エラーが出たので実行
nodebrew ls バージョン確認
v14.5.0

current: none
nodebrew use v14.5.0
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.zprofile  シェルがzshの場合

ターミナルを再起動する
node -v
v14.5.0                     バージョンが表示されれば完了
```
- npmをインストール　→　nodeと一緒にインストールされている

```zsh:ターミナル
npm -v
6.14.5
```
これでcreate-react-appを利用する準備ができました。ここから実際に導入していきます。

## create-react-appの導入

```zsh:ターミナル
cd projects   各自の開発環境に移動
npx create-react-app アプリ名
ｃｄ　アプリ名
npm start     ローカルサーバーが立ち上がります
```
localhost:3000
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646809/ca055b6f-1052-178d-ee07-c4dd0f706a54.png' width=50%>

書いてあるとおり、この画面はApp.jsを書き換えると編集出来ます！
これでReactを動かせるようになりました。

#### 参考になればLGTM頂けると嬉しいです！！
Python 2分探索とその派生

# はじめに

最近、再帰関数に関する記事を書きました。
特に使うつもりもなく勉強のためだったのですが、効率の良い探索が必要になりました。
丁度、公開した2分探索のを改良すればよかったので助かりました。
せっかくなので改良した関数も役に立つこともあるだろうと公開してみます。
(もっとも実際に使っているのは、PythonではなくてJavascriptでかつ違った実装になっていますが)

# n を見つける


```python:python
def binarySearchL(lt, n):
  l, r = 0, len(lt) - 1
  while l <= r:
    middleIndex = int(l + (r - l) / 2)
    middleValue = lt[middleIndex]
    if middleValue > n:
      l, r = l, middleIndex - 1
    elif middleValue < n:
      l, r = middleIndex + 1, r
    else:
      return middleIndex
  return -1
```
# nより大きい最小のものを見つける

```python:python
def binarySearchGt(lt, n):
  l, r = 0, len(lt) - 1
  while l <= r:
    middleIndex = math.floor(l + (r - l) / 2)  # 切り捨て
    middleValue = lt[middleIndex]
    if middleValue > n and r - l > 1:
      l, r = l, middleIndex
    elif middleValue <= n:
      l, r = middleIndex + 1, r
    else:
      return middleIndex
  return -1
```

# nより小さい最大のものを見つける

```python:python
def binarySearchLt(lt, n):
  l, r = 0, len(lt) - 1
  while l <= r:
    middleIndex = math.ceil(l + (r - l) / 2)  # 切り上げ
    middleValue = lt[middleIndex]
    if middleValue >= n:
      l, r = l, middleIndex - 1
    elif middleValue < n and r - l > 1:
      l, r = middleIndex, r
    else:
      return middleIndex
  return -1
```
MacでCentOSをさわりたい(docker)

# Macも使ってあげたい
Mac book買ってもらったのにAmazonPrimeしか見てないんです、、、
これではあまりにもかわいそうなのでそろそろ別の使い方をしよう！！と思い、この記事を書くことにしました。
でも、あんまり容量減らしたくないので今回はdockerを使ってCentOSの環境を作ります、！！

## そもそもdockerってなによ
dockerはですね、簡単に言うとコンテナ技術ですね。
これを使うと一瞬で自分のパソコンの中にもう一台別のパソコン的なものを作ることができちゃうんです！
仮想化とは異なり、ホストOSと同じカーネルを使うことで容量の大量消費を防いでくれます。
dockerについては今度ちゃんとまとめるつもりなので気になる方はぺぺっと検索してみてください！(私のちゃんとまとめるつもりシリーズ大量にあるね☺️)

## さぁCentOS7の環境を構築しよう！
**[前提]**
ホストOS : macOS Catalina 10.15.5
構築したいOS : CentOS7

```````
[ディレクトリ構成]
-- docker/
      ∟ example/
         ∟ Dockerfile
```````

exampleの中で作業していきます。
Dockerfileは後で自分で書きます。

それではCentOS7を構築してみましょう！
[DockerHub](https://hub.docker.com/editions/community/docker-ce-desktop-mac "DockerHub")
ここからMacで使用できるdockerをインストールしてください。
インストールが終わったらFinderからダウンロードしたDocker.dmgをポチッと。
そうするとdrag and dropの指示がでるので指示通りに。
(ダウンロードアイコンのところからこの作業しようとしたらなんかできなかった、なんで、、、)
はい！これでLaunchpadにdockerが追加されました！
docker(クジラのアイコン？)をクリックすると右側にターミナルが開かれるので、左側の指示にしたがって進んでください。
これでターミナルにdockerが入りました！
試しに新しくターミナルを開いて

````
docker
``````
とコマンドを入力してみてください。動きますね？

次に

`````
docker run centos:7
``````

と入力してください。これでローカル環境にcentos7のimageが入りました。

``````
docker images
``````

これで確認できます。
どこかにcentosって文字が見つかるはず！笑

はい！それではDockerfileも書いてみましょう。

``````php

FROM centos:7
 
LABEL maintainer="miyabi <miyabi@example.com>"

RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 \
    && yum -y install python3

CMD ["/usr/bin/bash"]
````````

LABELのメールアドレスとか名前はテキトーでも動きます！

これは自分的なCentOSの環境のレシピのようなものなのでもっと使いやすくしたいところ。

そのままexampleディレクトリにステイしたままで次のコマンドを実行してください。

```````
docker build -t miyabi .
```````

miyabiのところはimage名なので好きなのをつけて大丈夫です。
ヤッタァ！！これで自分のimageが完成です。

``````
docker images
`````

ほら！miyabi(自分でつけたimage名)ができてるでしょ！！
ついにコンテナ作るよ！！！

```````
docker run -it miyabi
```````

miyabiのところは先ほど自分がつけたimage名に変えてくださいね。
わぁ！これで自分で構築した環境に入り込めてますね！！
試しに

`````
python3
`````

と入力してみてください。
動くでしょ？？
Dockerfileにpython3をインストールしてくれるように記入したので入っているんです！
今回はCMDのところにrunしたらコンテナ内に入り込むように書いたのでrunした時点でそのまま動かすことが可能ですが、もっと色々アレンジできますよん。

## 注意
ctrl + Dで環境から抜け出すことができますが、セーブしないと次回コンテナ内に入り込んだ時にまっさらな状態になっているので気をつけてくださいね！

## おわりに
dockerって便利！慣れてくるとDockerfileささっとかけばたくさんの簡易的な環境をすぐに作り上げることができますね〜
勉強不足なのでまだこれといった恩恵はまだ受けていませんが、絶対すごいじゃん！！って感じですね〜！！！
すぐたてられるし、すぐ壊せるし！！
今回のだとDockerfileの内容がペラペラすぎてpython3しか使えないけど、macでcentOS使ってると思うとなんか嬉しい☺️
間違っていたらどんどん突っ込んでください！！
最後まで読んでいただきありがとうございます。
レスポンシブるデザイン with boostrap


cssの<row>で画面を分割する方法が複数あると思うが、
boostrapを用いた画面分割が個人的に楽だったのでメモをしておく。

bootstrapで使うクラスは<col>

【使い方】
①first step
・まず画面の横幅を12分割と考える。
・12分割した物のどれだけの幅が必要かを考える。
（ex.画面半分の分割が欲しいなら、[6]）

②second step
・どの幅で使いたいかを考える。
![スクリーンショット 2020-07-12 11.25.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668331/8e3380a5-6882-fa86-ce60-36e38fe78add.png)
・laptopサイズで画面半分の分割が欲しいなら、上記表のlgに着目し、
　「col-lg-6」と書く。

※lg,md,smは、laptop,ipad,smart phoneグリッドファイルを意味する。
　（他はあんまり使わないのかも。）
【メモ】rosbagでトピックを記録する

#rosbagとは
rosbagを使えば配信されているメッセージを記録することができる

- デバッグのときに便利
- 毎回本物のロボットを使う必要がなくなる

# データの記録
メッセージの記録には`record`機能を使う

```sh
$ rosbag record <topic name1> <topic name2>...
```
で指定したトピックに送られたメッセージが記録できる。
この時、ファイル名は実行時の時間に対応する`YYYY_MM_DD_HH_mm_ss.bag`という形式で保存される

 - ファイル名を変えたいとき

```sh
$ rosbag record -O hoge.bag <topic name>
$ rosbag record -o hoge <topic name>
```
のようにする。
`-O`or`--output-name`: hoge.bagで保存で保存される
`-o`or`--output-prefix`: hoge_YYY_MM_DD_HH_mm_ss.bagで保存される

- すべてのトピックを記録したいときには`-a`オプションをつける

```sh
$ rosbag record -a
```

- 正規表現でマッチするトピックの記録には`-e`オプションをつける

```sh
# /tfと/tf_staticなどを記録
$ rosbag record -e "/tf.*"

# sensorsという名前を含んだトピックを記録
$ rosbag record -e "(.*)sensors(.*)"
```
- 記録する時間を指定する場合は`-d`オプションをつける

```sh
# /tfトピックを30s記録
$ rosbag record -d=20 /tf
```
その他にもオプションがあるので[こちらを参照](http://wiki.ros.org/rosbag/Commandline)
# 記録したデータの再生
再生する場合は、`rosbag play`コマンドを使えばOK

```sh
$ rosbag play hoge.bag
```
launchファイルに再生する記述を書いておくと便利->[こちらを参照](https://qiita.com/srs/items/f6e2c36996e34bcc4d73)
Fiddlerでレスポンスを置き換える

初めてFiddlerを使い、カスタムスクリプトでレスポンスを書き換えようと思ったのですが、うまくいかず苦労したのでメモを残します。
※もっと良い方法があれば教えていただきたいです

やりたかったこと
-----

```
{
  data: [
    {
      hoge: "abcde",
    },
    {
      geho: "12345",
    }
  ]
}
```

上記のレスポンスが来た時に、下記のように書き換えるようなことがしたかった

```
{
  data: [
    {
      hoge: "abcde",
      fuga: [ // ここから
        {
          hogehoge: "fugafuga"
        },
        {
          hogehoge2: "fugafuga2"
        },
      ] // ここまで追加
    },
  ]
}
```

解決
----

```
static function OnBeforeResponse(oSession: Session) {
    var response = Fiddler.WebFormats.JSON.JsonDecode(oSession.GetResponseBodyAsString());
    response.JSONObject["data"][fuga] = Fiddler.WebFormats.JSON.JsonDecode('[{},{}]').JSONObject;
    response.JSONObject["data"][fuga][0]["hogehoge"] = "fugafuga";
    response.JSONObject["data"][fuga][1]["hogehoge2"] = "fugafuga2";

　　oSession.utilSetResponseBody(Fiddler.WebFormats.JSON.JsonDecode(response));
}

```
classのない要素にだけcssを適用する

class属性のない要素にだけcssを適用したいときは疑似否定クラスを使う。

```html
<p>文字を赤くしたい</p>
<p class="ao">こっちは変えたくない</p>
```

```css
p:not([class]) {
  color:red;
}
```
Confluence上でPlantUMLを使ってER図をテキストベースで作成する

#背景
外部キー制約が完璧に作成されている環境であれば、リバースエンジニアリングで自動でER図を作成してくれるツールは結構あるかと思います。
ただし、外部キー制約がメンテされていない環境だと、手動でリレーションを判断する必要があります。
そのような状況において便利な、PlantUMLを使ってテキストベースでER図を作成する方法をご紹介します。

#使い方
[Confluence](https://www.atlassian.com/ja/software/confluence)上でPlantUMLを使ってER図を作成する方法をご紹介します。
１．記事を書く画面で「＋」→「その他のマクロ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/27045eaf-a5c6-374c-6ccd-5802dee7b90b.png)

２． PlantUMLマクロを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/c5e54f13-ec3f-c754-b20a-48841760c559.png)

３．「挿入」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/cfad2c7b-9e24-e19b-98bd-10ec9d3f4f7e.png)

４．↓の枠がでてくるので、この中にER図描画用の情報を記入すればOK。コンフルを保存すれば、ER図ができあがり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/80180287-d5e5-73ae-e093-6c1e783aa041.png)

#テンプレート

```
@startuml
' ER図を見やすくするための設定
' monotone color
skinparam monochrome true
' shadow off
skinparam shadowing false
' change font
skinparam defaultFontName Ricty Diminished
' hide the spot
hide circle
' avoid problems with angled crows feet
skinparam linetype ortho
 
' 1. table list
object table1
object table2
object table3
 
' 2. column list
table1 : column1_1
table1 : column1_2
table2 : column2_1
table2 : column2_2
table3 : column3_1
table3 : column3_2
table3 : column3_3
 
' 3. relation list
table1 }o--||  table2: (column1_1=column2_1)
table1 ||--o{ table3 : (column1_2=column3_1)
 
@enduml
```

大きく分けて3つのブロックに分かれており、
 - テーブルリスト
 - カラムリスト
 - リレーション
をそれぞれ列挙すればOKです。

↓こんな感じで出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/2687fa95-5740-c66e-2c0c-0daca37f5a49.png)

補足的にJOINの条件を (column1_1=column2_1)といったテキストで表示させています。（これは無くすこともできます）

#### リレーションのバリエーション
リレーションのバリエーションは↓ですべてカバーできると思います。

```
N:1
Member }o--||  TPref: (mePrefID-prPrefID)
Member }|--||  TPref: (mePrefID-prPrefID)
 
1:N
Member ||--o{  TPref: (mePrefID-prPrefID)
Member ||--|{  TPref: (mePrefID-prPrefID)
 
1:1
Member ||--||  TPref: (mePrefID-prPrefID)
Member |o--||  TPref: (mePrefID-prPrefID)
Member ||--o|  TPref: (mePrefID-prPrefID)
 
 
N:N ※基本的にないはず
Member }o--o{  TPref: (mePrefID-prPrefID)
Member }|--|{  TPref: (mePrefID-prPrefID)
```

#### 構文エラー時
エラーがあると↓のような画面が表示されるため、エラーメッセージを参考にデバッグします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148310/d7321051-9120-f4f9-c11e-feef2cc42beb.png)


# まとめ
PlantUMLを使ってER図をテキストベースで作成する方法をご紹介しました。
さくっとER図をテキストベースで作りたい時や、リレーションを手動で指定する必要がある時等に重宝しそうです。

※ER図を見やすくするための設定として、いくつかのサイトを参考にさせていただきましたが、URLを忘れてしまいまして、引用として紹介できていないことをお詫びいたします。
Alfredの翻訳ワークフローv2リリース（DeepL翻訳や言語選択などに対応）

[Alfredの翻訳ワークフロー](https://qiita.com/nkmr_jp/items/ee47d0ef7f39816062a8)をDeepL翻訳と英語以外の言語にも対応しました。
インストールや設定の手順のはこちらを参考にしてください([日本語のREADME](https://github.com/nkmr-jp/alfred-quick-translate/blob/master/README_JA.md))

以前のバージョンも引き続き利用できます。
[リリース一覧](https://github.com/nkmr-jp/alfred-quick-translate/releases)からバージョンを選んで`Assets`から`quick-translate.alfredworkflow
`をダウンロードしてください。

# v1からの変更点
## 設定画面で各種設定
- 翻訳エンジンや言語などを設定画面で選択出来るようにしました
- ワークフローインストール後に右上のアイコンをクリックすると設定画面が開きます。
- 左側のAbout this Workflowを参考に設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/d7c97e99-5dc3-ea17-a316-820ab7ce8036.png)

## DeepL翻訳に対応
- 翻訳エンジンにDeepLを選択出来るようにしました。(デフォルトは Google)
    - [DeepL API](https://www.deepl.com/ja/docs-api/)を使っています
    - 翻訳エンジンにDeepLを使う場合は[DeepL Pro（DeepL APIプラン）](https://www.deepl.com/pro#developer)に登録してAPIキーを取得してください。
- Googleの方は引き続き無料で使えます

## 言語選択に対応
- 翻訳する言語を選択できるようにしました。
- デフォルトは 日本語(ja) <-> 英語(en) の翻訳をする設定になっています
- Google翻訳とDeepL翻訳の対応している言語なら何でも設定できます
- 対応言語と言語コード
    - [DeepLの対応言語](https://www.deepl.com/docs-api/translating-text/)
    - [Googleの対応言語一覧] (https://github.com/soimort/translate-shell/wiki/Languages)
        - Google翻訳は translate-shellを使っているのでwikiを参照

## 選択したテキストを翻訳する機能を修正
- 長い日本語は折り返すなどして出力を見やすくしました。
- 原文と翻訳後のテキストを両方表示できるようにしました。
    - Input(原文)もあったほうが原文と翻訳後のテキストを比較するとき便利なので追加しました。
    - Inputの表示が不要な場合は設定画面で`output_only`に変更できます。
![3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/37e79c62-e641-4b99-fea1-6511504ae751.gif)

# 開発メモ
## Google翻訳とDeepL翻訳の比較 (200713時点)
- 翻訳の精度自体はDeepLのほうが良い気がする
- レスポンスはGoogleのほうが速い
- DeepL APIは長いテキストをそのまま投げると途中までしか翻訳してくれない
    - 見出しを含めて翻訳すると見出しも文の一部として翻訳してしまったりもする
    - APIに投げる前に文章を分割するなどの前処理をちゃんとやる必要がある
- Googleの場合、長い文章をまとめて投げても結構ちゃんと翻訳してくれるので楽
    - Googleの方はAPI直接じゃなくて[translate-shell](https://github.com/soimort/translate-shell)を使っているので、そのおかげかもしれない
- DeepLはアプリを使うと長文でもちゃんと翻訳してくれる
   - 長文をまとめて翻訳したいときはアプリを使ったほうが良いかも

## ワークフローの中身
v1.0.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/ebbc55f3-dd93-459c-129f-d95b3f280593.png)
v2.0.0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/b404ac8b-2176-b89c-c522-84409151dad0.png)

DeepLのAPIに投げる前の処理とか色々必要になってコードを書く量が増えたので、
scriptを外部ファイルにするなどして結構構成が変わった。

## Packalに公開
ワークフローをPackalに公開しました。
[Packal](http://www.packal.org/)はAlfredのワークフローやテーマをアップしたり検索したりできるマーケットプレイス的なサイトです。
登録したら割とすぐ反映されました。


[QuickTranslate](http://www.packal.org/workflow/quick-translate)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11520/253b830a-e4fc-62e4-5bc1-7657d128ff78.png)

# まとめ
DeepL APIはリクエスト投げる前にちょっと整形したり文章を分割したりと、
面倒なところはありますが精度の高い翻訳を色んな所で使えるのは魅力です。
使い方も結構簡単ですし、色々作って遊んでみるのもいいと思います。
WindowsとMacの環境構築ざっくりとした違い

#Windows & Mac の環境構築難易度の違い

####結論：Macの方が簡単

どれだけ違うのかで言うと...(個人差はありますが)

・Mac１時間
・Windows24時間

###WindowsとMacだと根本的に使うものが違う

◉ざっくり言うとOSが違う...

→WindowsだとUbuntu(人に寄るらしい)
→MacだとLinux

◉それだけ一旦覚えておいて、あとは

→Windowsだと深いとこでやりとりしてる
→Macだと浅い部分でやりとりをしてる

◉composerを使わない

→Windowsだと使わない
→Macだと使う
macOSにパッケージ管理システム（Homebrew）を導入するときの手順と主な操作方法まとめ

# Homebrewとは
macOS用のパッケージ管理システムです。ターミナルからインストール等の管理が実施できます。アップデートがまとめて実施できたり、管理がいろいろと楽になります。HomebrewはCUIアプリ、Homebrew CaskはGUIアプリの管理が実施できます。App Storeにあるアプリは、App Storeにて管理して、それ以外は、Homebrewで管理するのがお勧めです。

#導入方法
下記の手順で、HomebrewとHomebrew Caskがインストールされます。
## 前提
X-Codeのコマンドラインツールのインストールが必要になります。App StoreからX-codeをまるまるインストールしても良いのですが、重いので、コマンドラインツールだけをインストールします。

```:ターミナル
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

## Homebrewのインストール
Homebrewの[サイト]('https://brew.sh/index_ja.html')から、コマンドをコピーして実行します。パスワード等を聞かれますが、基本は要求されたものを入れて、Enterで大丈夫です。

## インストール確認
｢brew doctor｣で導入されていることを確認します。

```:ターミナル
$ brew doctor
Your system is ready to brew.
```

#Homebrew の使い方
主なコマンドを記載します。ちなみに、パッケージのことを｢formula｣と言います。他のサイト等で、この用語が出てきたらパッケージと置き換えて下さい。
## インストール
｢node｣のインストールを例にとります。

```:ターミナル
$ brew install node
```
##  インストールしたアプリの一覧化

```:ターミナル
$ brew list
```

アンインストール
｢node｣のアンインストールを例にとります。

```:ターミナル
$ brew uninstall node
```

##パッケージ（formula）をアップデート
｢node｣のアップデートを例にとります。

```:ターミナル
$ brew upgrade node
```
対象を指定しないとすべてのパッケージ（formula）をアップデートします。

##古いパッケージ（formula）を削除する
Homebrewでは古いバージョンが残るので、削除が必要です。

```:ターミナル
$　brew cleanup -n
```
｢-n｣をつけると、削除対象が表示されます。

##パッケージ（formula）をアップデートに加え、Homebrew自身もアップデートする。
｢upgrade｣との混同しやすいのですが、｢update｣では、Homebrew自体のアップデートも実施されます。

```:ターミナル
$ brew update
```

##インストールできるアプリの確認
｢Google｣を含むアプリを検索します。

```:ターミナル
$ brew search google
```




#Homebrew Caskの使い方
App Store以外のアプリを一括で更新できるのでお勧めです。
## インストール
｢Google Chrome｣のインストールを例にとります。

```:ターミナル
$ brew cask install google-chrome
```

##  アプリの一括アップグレード
これがホントに便利です。

```:ターミナル
$ brew cask upgrade
```
##  インストールしたアプリの一覧化

```:ターミナル
$ brew cask list
```
## アプリのアンインストール
｢Google Chrome｣のアンインストールを例にとります。

```:ターミナル
$ brew cask uninstall google-chrome
```

#最後に
初心者にもわかるように、Pythonで機械学習を実施する際の必要な知識を簡便に記事としてまとめております。
目次は[こちら](https://qiita.com/Yanagawa_Yoshihisa/items/a3fa521d89c471b3e71f)になりますので、他の記事も参考にして頂けると幸いです。
Angular 10でCommonJS形式のモジュールを読み込んだ際に起きる警告の対処法

# 概要
Angular 10からCommonJS形式のモジュールを読み込むと警告が表示されるようになりました。
lodashのv4.17.19などを読み込んでみると再現できるかと思います。

# 解決策その1
理想的な解決方法はESM形式に切り替えることです。
先ほど例に挙げたlodashならlodash-esというESM形式のライブラリがリリースされてます。

# 解決策その2
とはいえすべてのライブラリがESM形式もリリースされているわけではありません。
その場合はangular.jsonでCommonJS形式でも許可するライブラリを指定することで警告を抑えることができます。
ただしあくまで警告を抑えるだけなのでビルド時の最適化などがされるわけではないようです。

```
"build": {
  "builder": "@angular-devkit/build-angular:browser",
  "options": {
     "allowedCommonJsDependencies": [
        "lodash"
     ]
     ...
   }
   ...
},
```


# 参考リンク
https://blog.angular.io/version-10-of-angular-now-available-78960babd41
https://angular.io/guide/build#configuring-commonjs-dependencies
Arrayにsplitがあって混乱した

次のようなコードを書いたところ、配列の配列が帰ってきて混乱しました。

```ruby
numbers.split(/,/) #=> [["1","2","3"]]
```

原因は、split済みの配列に対してsplitを呼んでいたせいでした。

```ruby
numbers = "1,2,3".split(/,/)
numbers.split(/,/) #=> [["1","2","3"]]
```

RailsのActiveSupportは [Array#split](https://api.rubyonrails.org/classes/Array.html#method-i-split) を用意しています。特定の値の前後で配列を配列の配列に分割するものです。

```ruby
[1, 2, 3, 4, 5].split(3) # => [[1,2],[4,5]]
```

しかし、変数に文字列が入っているつもりが配列だった、という場合には面食らうことなります。

```ruby
def include_three?(string)
  string.split(/,/).include?("3")
end

include_three?("1,2,3,4,5".split(/,/)) #=> false
```
LGTMをくれた人のプロフィールページに通知一覧から飛びたいので4行でChrome拡張作った。

## 何を作ったの？
[通知一覧 \- Qiita](https://qiita.com/notifications) もしくは、上メニューの通知欄で、通知に表示されている人のアイコンから、その人のユーザーページに飛ぶためのChrome拡張です。
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321603/23626a7d-4519-4544-9822-99885e2a3f0f.png)
imgタグ以外の場所をクリックすると、従来どおり「LGTM（やストックやコメント）がついた記事」に飛べます。

## なぜ作ったの？
自分の記事にLGTMやストックをしてくれた人がどんな記事を書いてるか知りたいのに、通知機能から一発で記事一覧に飛べなくてめちゃくちゃイライラしたからです。私はQiitaにポケモン関係の記事を投稿しているのですが、読者数が他の記事に比べて多くないので、ポケモン記事に何らかのアクションをしてくれた方の記事は特に読みたいです。
今のUIだと、「LGTMがついた記事に飛ぶ」->「LGTM欄をクリック」という動線になってしまうのと、ストックに至ってはユーザー名直打ちしか方法がなさそうに見えます。

## どうやって作ったの？
正攻法で、content scriptで通知一覧ページにあるimgのouterHTMLを編集しました。ユーザー名はaltから取得可能です。きれいなHTMLなので編集しやすくて良いですね…。

```javascript
const targets = document.querySelectorAll(".notification_icon > img");
targets.forEach((target) => {
  target.outerHTML = `<a href="https://qiita.com/${target.alt}" target="_top">${target.outerHTML}</a>`;
});
```

この方法の良いところは、imgタグ以外の場所をクリックすると、従来どおり「LGTM（やストックやコメント）がついた記事」に飛べる点です。

上部メニューの通知欄については、 https://qiita.com/notifications?iframe=1 をiframeで表示しているため、manifest.jsonに`"all_frames": true`が必要です。
manifest.jsonは以下のように書きました。

```json
{
  "name": "Qiitaで自分に通知した人のユーザーページに飛ぶやつ。",
  "description": "Qiitaで自分に通知した人のユーザーページに飛ぶための拡張です。",
  "version": "0.1",
  "content_scripts": [
    {
      "all_frames": true,
      "matches": [
        "https://qiita.com/*"
      ],
      "js": [
        "script.js"
      ],
      "run_at": "document_end"
    }
  ],
  "manifest_version": 2
}
```

所要時間は15分程度でした。この記事を書くほうが時間がかかっています。
Chrome Web Storeに乗せるまでが筋かなと思ったので、登録して現在審査待ちです。

## まとめ
* Chromeの拡張はすぐ作れる。ドキュメントもわかりやすい。
  - content scriptの公式ドキュメント：[Content Scripts \- Google Chrome](https://developer.chrome.com/extensions/content_scripts)
* querySelectorAllは便利。
* Qiita夏祭り2020_Qiitaの記事数6つしかなくてびびった。（2020/07/13 20時現在）
エラーを自分で解決するための流れ

自分でエラーを解決するための流れまとめ

1.何をやろうとしているのか、何のコードを書いていたのかはっきりと再認識する。
　人に説明するように喋りながら説明する。
２.エラーが指しているコードの指摘箇所を確認する。
3.タイプミスが無いか確認する。
4.やろうとしていることを小さく段階に分け少ないコードで動かす。
　その間にエラーが出ていないかconsole.logやvar_dump,Laravelはdd等で確認する。

＊上記手順を繰り返し行ったあとで、初めてインターネット上で検索を行う。
[stackoverflow](https://ja.stackoverflow.com),Qiita,teratail

＊ソフトウェアのバージョン違いや入力規則に気を付ける。

9割９分が解決できる。



##なぜすぐに検索してエラーを調べないのか
インターネット上でエラーを検索した場合、前提条件が同じであることはほとんど無い。まずは、今起きている状態を理解し、
何が原因で動いていないのかをしっかり把握する必要がある。早く動かしたいという気持ちの前にコードを冷静に理解して
誤りを直していくことが解決への最短距離である。
JSでajaxを利用する際のセキュリティ注意点2つ


## 1. innerHTMLではなくinnerTextを利用すること
- 自動的にテキストエンコードされXSSが防げる

## 2. (ajaxに限らず)URLパラメータなど、ユーザの入力値をそのまま画面上に出力しないこと




### おまけ
- JSは宣言なしで変数に代入すると常にグローバル変数になるため注意
HTTP クライアントライブラリのgem｢faraday｣を使ってみた

HTTP クライアントライブラリのgem｢faraday｣を使用したので、メモ。
例えばAPIで取得する際に、gemを使用しないと

```ruby
url = URI("https://api.coingecko.com/api/v3/coins/bitcoin")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body
```

上記くらいコードが必要だが、faradayを使用すると

```ruby

res =  Faraday.get("https://api.coingecko.com/api/v3/coins/bitcoin")
puts res
```
上記で取得できる

## 初期設定
まずはGemfileに追加して、bundle install

```gemfile
gem 'faraday'
```

## パラメータ指定

```ruby

response = Faraday.get("https://api.coingecko.com/api/v3/coins/bitcoin/history", date: "08-09-2017")
body = JSON.parse(response.body)
```

## コネクション
```ruby

connect =  Faraday.new("https://api.coingecko.com")
response = connect.get do |req|
  req.url '/api/v3/coins/bitcoin'
  req.params[:date] = "08-09-2017"
  req.params[:tickers] = :true
end
body = JSON.parse(response.body)
```

## リクエストヘッダ

```ruby

connection = Faraday.new("https://rest.coinapi.io")
response = connection.get "/v1/exchangerate/BTC/USD" do |request|
  request.headers["X-CoinAPI-Key"] = "API Key"
end
```

他にもいろいろ試してみようと思います〜

## 参考
[Faradayの使い方 59のレシピ](http://nekorails.hatenablog.com/entry/2018/09/28/152745#008-%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86)

以上です。
いいねやQiitaやTwitterのフォローいただけると励みになります！
他にも方法がありましたら、コメントお待ちしております。
宜しくお願いします〜