OmniAICreator/Qiita-1.07M huggingface dataset:
[Chapter-8]https化に向けたロードバランサーの設定

| タイトル |
|:-|
|  [[Chapter-1]VPCの設定](https://qiita.com/Jackson123/items/c7b0a7a6ae659fe48a3b) |
|  [[Chapter-2]EC2の設定](https://qiita.com/Jackson123/items/53cc698b1b7cfdbfe368) |
| [[Chapter-3]EC2のサーバー環境構築](https://qiita.com/Jackson123/items/821d89184d87b6020df5)  |
|  [[Chapter-4]EC2にRailsアプリの配置](https://qiita.com/Jackson123/items/e91eec2f76774717bdee) |
|  [[Chapter-5]ロードバランサー(ELB)の作成](https://qiita.com/Jackson123/items/a739525d0084747405d7) |
| [[Chapter-6]ACM(AWS Certificate Manager)でSSL証明書を取得](https://qiita.com/Jackson123/items/eb586c33fe3c5b7d9dad)  |
|  [[Chapter-7]Route53の設定](https://qiita.com/Jackson123/items/6b41ebde0eec072a283e) |
|  [[Chapter-8]https化に向けたロードバランサーの設定](https://qiita.com/Jackson123/items/d6819d3dbf304aebd459) |
|  [[Chapter-9]https化によるRoute53の設定](https://qiita.com/Jackson123/items/9ceae188a53f646e55e9) |
|  [[Chapter-10]https化によるNginxの設定](https://qiita.com/Jackson123/items/255263a260f7a833bf1d) |
## はじめに
今回はhttps化する際のロードバランサーの設定をします。
画像なしで説明しますのであしからず。
アプリを既にEC2に上げている(HTTPで)、ACM（AWS Certificate Manager）でSSL証明書を取得している前提とします。
まだ設定していないという方は以前のチャプターをご覧ください

## 1. 手始めに　ロードバランサーの設定
取得したSSL証明書をロードバランサーで使用します。
EC2の画面左の「ロードバランサー」を選択して、
作成済みの「アプリ名-ELB」を選択してください。
下部の詳細から、「リスナー」タブを選択し、「リスナーの追加」ボタンをクリックします。


## 2. リスナーの追加
以下の通り記述
プロトコルポート：　「HTTPS」　「443」
デフォルトアクション：　「アクションの追加」をクリック、転送先を選択して、「アプリ名-Target-Group」を選択
セキュリティポリシー：「ELBSecurityPolicy-2016-08」
デフォルトの SSL 証明書：「ACMから（推奨）」「ドメイン名」
「リスナーの追加」ボタンを選択

リスナーに「HTTPS」が追加されましたが、セキュリティグループで許可されていないので
セキュリティグループを修正します。

## 3. セキュリティグループの修正
EC2の画面左の「セキュリティグループ」を選択して、作成済みの「アプリ名-SecurityGroup」を選択します。
下部の詳細から、「インバウンドルール」タブを選択し、「インバウンドルールを編集」ボタンを選択してください

以下のように記述
タイプ：「HTTPS」
プロトコル：「TCP」
ポート範囲：「443」
ソース：「任意の場所」0.0.0.0/0
説明：「任意」

「ルールを保存」ボタンをクリックします。

これでHTTPSからのアクセスを許可することができます。
二分探索の処理をじっくり追ってみる


### 概要
atcoder でも頻出テーマである二分探索に関する内容です．
### はじめに
二分探索は、比較的シンプルな手法ではありますが、実装でつまずくことが多いのではないかと感じています．

二分探索における処理の流れをじっくり理解することを目的に，二分探索のサンプルの問題を一つ取り上げて，実装時の処理を一つずつたどり，二分探索において使用される変数の理解を深めることを目的としています．
(次回, コンテストで2分探索が出題されたときの実装に困らないように．．．）
二分探索のアルゴリズムの説明などはこちらなどの別記事をご参照ください．

- https://codezine.jp/article/detail/9900?p=2

### サンプル問題
競プロ典型 ９０問の第１問のケースを取り上げます．

- 001 - Yokan Party（★4）
 - https://atcoder.jp/contests/typical90/tasks/typical90_a
(問題/丁寧な解説を作成してくださる方に感謝いたします．)

### コード(py)

※基本的にこちらのc++のコードをpython に書き換えたコードとなっています．
https://qiita.com/e869120/items/1b2a5f0f07fd927e44e9

```python:Main.py
n, l = map(int, input().split())
k = int(input())
a = list(map(int, input().split()))

def solve(mid):
    """ ある羊羹の切れ目の間隔の最小値候補が条件を満たすか否かを判定する
    Args:
        mid (int): [羊羹の切れ目の間隔の最小値候補]
    Returns:
        boolean: [判定対象のindex が条件を満たすかどうか]
    """
    tmp_val = 0 # 切った羊羹の長さ
    cut_cnt = 0 # 羊羹を切る数
    for i in range(n):
        if a[i] - tmp_val >= mid and l - a[i] >= mid:
            cut_cnt += 1
            tmp_val = a[i]
    if cut_cnt >= k:
        return True
    else:
        False
right = l
left = 0
while right - left > 1:
    mid = (right + left) // 2
    if solve(mid):
        left = mid
    else:
        right = mid
print(left)
```


以下のサンプルケースで考えます．

```
7 45
2
7 11 16 20 28 34 38
```

### while処理おけるleft, right, mid の各変数の値の遷移
| left(条件を満たす範囲) | mid (各ステップにおける判定対象)  | right(条件を満たさない範囲) |
|:-:|:-:|:-:|
|0|***22***⤷|45|
|0|⤶***11***|22|
|11|***16***⤷|22|
|11|***13***⤷|16|
|11|⤶***12***|13|
|12|***12***|13|


各mid の値をleft, もしくは，right に振り分けているようにも見えますね．
left は条件を満たす最大値となっています． > つまり，この問題の答えとなっています．
一方，right は条件を満たさない最小値です．

***最後のwhile文の処理をする***時点においては，

- right = 13
- left = 11
- mid = 12


right  - left = 2 > 1より，while 文を継続します．

***while文の終了時***においては，

- right = 13 ... (条件を満たさない最小値)
- left = 12  ... (☆:このサンプルケースの答え)
- mid = 12

right  - left = 1 より， while 文を終了します．

このように，最終的には，

- left に条件を満たす最大値が格納され，
- right に条件を満たさない最小値が格納されていることがわかります．

### 処理フロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/32b950eb-ec10-480b-3e4e-836edb2b07ee.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/d2a0c2c9-506e-f711-a724-ba83fe4d1de7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239544/83c68573-7288-bb37-4e73-88fb65be4670.png)


### まとめ
単に二分探索を実装するだけであれば， めぐる式二分探索と呼ばれる実装の流派[[link](https://aotamasaki.hatenablog.com/entry/meguru_bisect)]やPythonの標準ライブラリのbisectモジュールを使って実装することもできますね.

自分なりの二分探索の実装方法を身に着けることが一番自分の力になるかなと思います．
エンジニア向け分離型キーボード(JISplit89)を自作したのでご紹介します

# はじめに
多くのYoutuberの方が自分に合ったキーボードを買うことをお勧めしているので自分も見直そうと調べていたところ、分離型でしかも自作できるこのキットのことを知り、購入して作ってみました。

# 購入したもの
JISplit89
https://shop.yushakobo.jp/products/jisplit89

JISキーで分離型、８９キーというとことからこの機種名になったとのことです。

JISキーよりUSキーの方が自作キーボード業界では人気があることを知り、
これを機にUSキーボーダーに転身しようかと考えましたがこのキーボードを見つけ
もう少しJISキーボーダーでいることにしました。

# JISキーとUSキーの違い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/acb4465c-1e16-c74b-d4ab-edca7c0b8743.png)
http://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm より引用

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/d3eed505-a0e5-9dd4-9c11-d6ad19dc07f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/b37dc321-0e0f-95ef-b92c-148ca768b6ad.png)
https://www.imia.org/us-keyboard/　より引用

# 出来上がり
キーキャップの配色、キー配置は悩んだ結果こうなりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/fe3cae88-9b95-0808-c5f6-de331bf76ee3.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/7f46086b-d069-f7d5-78a5-b570f88e7f56.png)
元は↓こちら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/e920dd28-a927-bb6d-6133-64c92df7d385.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/b9c33cec-4e58-b5bb-ebb9-ca59fee57588.png)
# 操作感想
右シフトキーが無いのが残念。仕方がないのでこのようにキーマップを変更して右シフトキーを作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/ea8b3589-6fba-0ae9-280a-48f2cc45d1db.png)

# キーボードの作り方
こちらを購入
https://shop.yushakobo.jp/products/jisplit89

作り方は[こちら](https://salicylic-acid3.hatenablog.com/entry/jisplit89-build-guide#%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6%E5%8B%95%E7%94%BB%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B)を参考にしました

＜注意点＞
・LEDをつける時は半田ごての温度は220度程度の低い温度で丁寧にやるのがいいそうです
・半田ごての練習をしておきましょう
・LEDには順番があるので小さい番号から１つ１つLEDが点灯するか試しながらハンダしていきましょう
私は一気にやってしまい途中のハンダが失敗していて、それ以降のLEDがつかなくなりました(´;ω;｀)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115627/660e4930-d987-ea91-0a3a-c3d8ed793700.png)

# キーを割り当てる
分離型キーボードはMicroProが２つあるので２つともに同じキーマップのファームウェアを書き込む必要があります。
書き込み方法は以下の３つ
①Remap
②VIA
③QMK Configrator（→QMK Toolboxで書き込み）はLEDの設定ができない

おすすめは①です。
①②を使用する場合はファイル名に_viaがついた[hexファイル](https://drive.google.com/file/d/1IyqQ3EiDLJy_2MQSxl17LpDWxXa_1CG_/view?usp=sharing)を使用しましょう

キーボードをUSBに接続するときは分離キーボードをつなぐオーディオケーブルを先につないでおかないとショートするそうです( ;ﾟДﾟ)怖ァ

# 最後に
できるまでに計１０時間程度かかりました。
LED付きのキーボードは使ったことが無く、初めはあまり興味はなかったのですがLEDが光りだした時は感動しました:blush:
【histogram入門】pandasとmatplotlibでヒストグラムを描いてみた♬

簡単に以下のコードでpandasのヒストグラムが描けることは知っていた、
`df.hist(bins=100)` で、`plt.show()`とすれば、100個の区間に分けて頻度分布を描画する
または、`df.hist(bins=100).plot()`で、`plt.show()`で描画できる。
しかし、もう少しいろいろ追加しようとして、調べたが適切な記事が無いのでまとめておく。

まず、numpyでの正規分布の生成
[numpy.random.normal](https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.random.normal.html)

そして、ほぼ完成形は以下のとおり
まず、使うlibは以下のとおり、
また、dataとして、numpyで正規分布を生成。
pandasのSeriesとして、pandasデータを作成する。

```py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = np.random.normal(loc=15.0, scale=20.0, size=1000) #loc = 中心　scale = 標準偏差　size = deta数

df = pd.Series(data)
```
このとき、pandasのヒストグラムは以下のように描ける。
一応、pandasでの解説が以下にあるが、軸labelや描画範囲の指定の仕方は理解できなかった。
※dataの引数での指定はできるが、以下のセンスでは出来ないようだ
【参考】
[pandas.DataFrame.hist](https://pandas.pydata.org/pandas-docs/version/1.0.3/reference/api/pandas.DataFrame.hist.html)

ということで、コードは以下の通りで、欲しいグラフが描けた。
![pandas_hist2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/25d11ff9-d29d-1239-c43d-e0e35a2a85a1.png)


```py
df.hist(bins=100, color = "blue", grid =True, label = 'pandas')
plt.ylim(0,50)
plt.ylabel('frequency')
plt.xlim(-100, 100)
plt.xlabel('index')
plt.legend()
plt.title('pandas_histgram_norm')
plt.savefig("pandas_hist.png")
plt.show()
plt.close()
```
一方、同じようにpandasデータを渡してやれば、matplotlibでも以下のように同じ絵が描画できる。
![plt_hist2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/f783ffbc-00fc-58d0-6ce0-9b2c608ff531.png)



```py
plt.xlim(-100, 100)
plt.ylim(0,50)
plt.ylabel('frequency')
plt.xlabel('index')
plt.grid()
plt.title('plt_histgram_norm')
plt.hist(df,bins = 100, color = "red", label='plt')
plt.legend()
plt.savefig("plt_hist.png")
plt.show()
```
そして、以下のように二種類のグラフを重ねて描画できる。
【参考】
[matplotlib / seaborn を利用してヒストグラムを描く方法](https://stats.biopapyrus.jp/python/hist.html)
![pandas&plt_hist2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/644b3a3e-338c-130d-d8d0-273df22e1df0.png)



```py
data = np.random.normal(loc=15.0, scale=20.0, size=1000) #loc = 中心　scale = 標準偏差　size = deta数
df = pd.Series(data)

df.hist(bins=100, color = "blue", grid =True, label = 'pandas', alpha=0.6)
plt.ylim(0,50)
plt.ylabel('frequency')
plt.xlim(-100, 100)
plt.xlabel('index')
plt.title('pandas&plt_histgram_norm')

data2 = np.random.normal(loc=-15.0, scale=20.0, size=1000)
df2 = pd.Series(data2)

plt.hist(df2,bins = 100, color = "red", label='plt', alpha=0.6)
plt.legend()
plt.savefig("pandas&plt_hist.png")
plt.show()
```
最後に上記参考のデータを重畳する例をseabornでなく、描画する。
※もちろん、同じように描画することもできる
![pandas+plt_hist2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233744/5444797e-2ca9-9b7f-3aff-a7787d797f77.png)


```py
plt.title('df2+df_histgram_norm')
plt.ylim(0,100)
plt.ylabel('frequency')
plt.xlim(-100, 100)
plt.xlabel('index')
plt.grid()
plt.hist([df2, df], bins=100, stacked=True,color = ["red","blue"], label = ['df2','df'], alpha=0.6)
plt.legend()
plt.savefig("pandas+plt_hist.png")
plt.show()
```
###まとめ
・pandasとmatplotlibでそれぞれヒストグラムが描けた
・透過率を導入すると、2種類の分布を同時描画出来た
・2種類の分布の合成分布を描画出来た
Vuetifyを部分的に使う方法

# この記事は
Vuetifyを一部のコンポーネントのみ使用する方法を記録したものです。
`vue-cli`を用いている前提です。

# 背景
私は`bootstrap`にトラウマがあります。

それはなぜかというと、
最初はbootstrapに則ったデザインでいいと言われたのに
徐々に細かい修正指示が入り、
CSSにたくさんの`!important`をつけなければいけない、
という事象があったからです。

なので私は極力CSSフレームワークを使いたくない。

しかし、開発速度やデザインの統一の関係で
どうしても`Vuetify`を使わなければいけないタイミングが来ました。

じゃあ、せめて他のコンポーネントに影響を及ぼさない、
部分的な使用方法はないのか、と探し始めたのが
この記事の背景です。

# 手順
## vuetifyをインストール

```jsx
vue add vuetify
```

## 生成された `src/plugins/vuetify` を編集

```jsx
import Vue from 'vue'
import Vuetify from 'vuetify/lib'

Vue.use(Vuetify)

const opts = {}

export default new Vuetify(opts)
```

## `main.ts` を編集

```jsx
import Vue from 'vue'
import vuetify from '@/plugins/vuetify'

new Vue({
  vuetify,
}).$mount('#app')
```

## `vue.config.js` を編集

```jsx
chainWebpack: config => {
  config.plugin('VuetifyLoaderPlugin').tap(args => [{
    match (originalTag, { kebabTag, camelTag, path, component }) {
      if (kebabTag.startsWith('core-')) {
        return [camelTag, `import ${camelTag} from '@/components/core/${camelTag.substring(4)}.vue'`]
      }
    }
  }])
}
```

## 使いたいVuetifyコンポーネントを呼び出す

```jsx
<template>
  <v-card>
      ...
  </v-card>
</template>

<script>
  import { VCard } from 'vuetify/lib'

  export default {
    components: {
      VCard
    },
    ...
  }
</script>
```

## ビルド速度を削減（任意）
アラカルトによりビルドが重くなるようなので、気になる方は対処するといいかも
[Vuetify2を使ったプロジェクトのビルドが遅いので高速化する - Qiita](https://qiita.com/grainrigi/items/85a09011cf90eb2b5763)

# 参考
https://v2.vuetifyjs.com/ja/getting-started/quick-start/

https://v2.vuetifyjs.com/ja/customization/a-la-carte/

https://github.com/vuetifyjs/vuetify-loader
ユーザーを検索する機能を実装するの巻　その２

##この記事について
前回の記事
https://qiita.com/Shinsama12123/items/fca4427a3611b5711bb0
ユーザーを検索する機能を実装することができたので、次にテストの記事をあげるみたいなことを書いていました。
早速...。

##テスト

```spec/integration/user_index_spec.rb
require 'rails_helper'

RSpec.describe "Search",type: :integration do

  #ユーザー検索
  it("users search") do
    log_in_as(@admin)
    #全てのユーザー
    get(users_path, :params => ({ :q => ({ :name_cont => "" }) }))
    User.paginate(:page => 1).each do |user|
    assert_select("a[href=?]", user_path(user), :text => user.name)
    end
    assert_select("title", "ユーザー検索🐼パパっ子")
  
    #ユーザーの検索結果
    get(user_path, :params => ({ :q => ({ :name_cont => "a" }) }))
    q = User.ransack(:name_cont => "a", :activated_true => true)
    q.result.paginate(:page => 1).each do |user|
    assert_select("a[href=?]", user_path(user), :text => user.name)
    end
    assert_select("title", "検索結果🐼パパっ子")
  
    #見つからなかった場合
    get(users_path, :params => ({ :q => ({ :name_cont => "abcdefghijk" }) }))
    expect(response.body).to(match("ユーザーは見つかりませんでした。"))
  
    #'全てのユザー'に戻っていることの確認
    get(users_path, :params => ({ :q => ({ :name_cont => "" }) }))
    assert_select("title", "ユーザー検索🐼パパっ子")
  end
end
```

####テストについて

１.全ユーザーの表示　
2.検索結果（あり）
3.検索結果（なし）

１、２についてはタイトルのチェック、３についてはメッセージ確認を行うことにします。
テストが通ったことを確認して終了です。

実は、私はテストはまだ通ってはいません。log_in_as(@admin)の部分にエラーがあるようで、なので実際にテストが通ったら、また編集します。すみません。
IPアドレスとは

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

#IPアドレスとは
　インターネット上に接続された機器が持つ住所のこと。データをやり取りするときに、ネットワーク上で通信相手を間違わないために使われる。IPアドレスにはグローバルIPアドレスとプライベートIPアドレスの2種類ある。(後で詳しく説明する。)
　IPアドレスは32ビットの数値のデータからなっている。見やすくするために10進法が記載されているが、2進法の32ビッチ値で構成されている。IPアドレスの利用範囲は`0.0.0.0` ~ `255.255.255.255`。

　インターネット上に接続されたコンピュータなどの機器を通信ネットワーク(LAN)に接続するためのカード型の拡張装置であるネットワークインターフェースカード(NIC)に割り当てられて、ホストにアタッチされている。つまり、危機に直接的にIPアドレスが割り振られているわけでなく、NICにIPアドレスなどのネットワークに関する情報が与えられている。

#グローバルIPアドレス
　世界中でのやり取りが可能なのがグローバルIPアドレス。世界中で重複のない一意のアドレスで、インターネット上でのやりとりに使用される。ICANNという非営利団体が管理してる。そのため、グローバルに割り当てられたIPアドレスをもらう必要がある。

#プライベートIPアドレス
　限定的なエリア内でのみで利用可能なのがプライベートIPアドレス。オフィス内や家庭内などの特定の範囲だけで利用されるアドレスで、そのエリア内では重複はできないが、グローバルでは重複が可能。設定できるIPアドレスの範囲は`10.0.0.0` ~ `10.255.255.255`, `172.16.0.0` ~ `152.32.255.255`, `192.168.0.0` ~ `192.168.255.255`。ローカルエリアの管理者が自分でIPアドレスを与えられる。
VSCode で快適な Python 環境を構築する

# 背景

色々あって [言語処理100本ノック 2020 \(Rev 2\) \- NLP100 2020](https://nlp100.github.io/ja/) を始めようと思ったが、Python の環境をどうすべきか分かりませんでした。同様に、他の言語から Python に来て迷った人の参考になれば幸いです。

ちなみに普段は Ruby（Rails） と TypeScript（React, Node.js） 、ちょっと Golang を書いているので、その辺りの人に馴染みやすいやり方かもしれません。

# 動作環境

- macOS Catalina 10.15.7
- anyenv 1.1.1
- pyenv 1.2.26-15-gb1d1ceba
- Python 3.9.4
- VSCode 1.55.2

# 環境構築

## 前準備

自分は [anyenv](https://github.com/anyenv/anyenv) 経由で [pyenv](https://github.com/pyenv/pyenv) を入れているので、

```zsh
anyenv update
pyenv install 3.9.4
pyenv rehash
```

で Python の最新版を入れます。最新バージョンは [Python\.org](https://www.python.org/) で確認しました。

自分は新しいことを始める前に環境を最新にしていますが、好みの問題かもしれないですね。（そこそこ新しければそのままで良い気もするし、あまりに古ければアップデートした方が良い気もする。）

## pipenv を入れる

ライブラリを管理する方法はいくつかあるようですが、仕事で先輩が pipenv を使っていて良さそうだったので、pipenv でやってみました。

```zsh
cd /path/to/project
pyenv local 3.9.4 # プロジェクト配下の Python バージョンを固定
pip install pipenv
pipenv --python 3.9 # 初期化
```

- 参考
    - [Pipenvの基本的な使い方 — pipenv 2018\.11\.27\.dev0 ドキュメント](https://pipenv-ja.readthedocs.io/ja/translate-ja/basics.html)
    - [Pipenvを使ったPython開発まとめ \- Qiita](https://qiita.com/y-tsutsu/items/54c10e0b2c6b565c887a)

## Linter とオートフォーマットの設定をする

ググると、flake8 + autopep8 でがイケてそうだったので、その構成にしてみます。flake8 で linting, autopep8 で auto formatting するという風に理解しました。

```zsh
pipenv install --dev flake8 autopep8
```

`pipenv run autopep8 xxx.py` で実行できるようになったはず。

[Python \- Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=ms-python.python) を入れて、ファイル保存時に自動整形されるように設定します。

```json:.vscode/settings.json
{
  "python.linting.pylintEnabled": false,
  "python.linting.flake8Enabled": true,
  "python.linting.lintOnSave": true,
  "python.formatting.provider": "autopep8",
  "editor.formatOnSave": true,
  "editor.tabSize": 4
}
```

pipenv を使っている場合、virtualenv まわりのパスを設定する必要がある。
`virtualenv のパス` は `pipenv --venv` で確認できる。

```json:ユーザーのsettings.json
{
  "python.venvPath": "{virtualenv のパス}",
  "python.pythonPath": "{virtualenv のパス}/bin/python",
  "python.autoComplete.extraPaths": [
    "{virtualenv のパス}/lib/python3.x/site-packages/"
  ],
  "python.linting.flake8Path": "{virtualenv のパス}/bin/flake8",
  "python.formatting.autopep8Path": "{virtualenv のパス}/bin/autopep8"
}
```

これで .py ファイルの lint エラーも出るし、ファイル保存時に自動整形されるようになったはず。

ついでに推奨拡張機能も設定しておくと、マシンを変えた場合などでも環境を再現しやすくなるので便利です。

```.vscode/extensions.json
{
  "recommendations": [
    "ms-python.python"
  ]
}
```

- 参考
    - [VSCodeのPython開発環境でpylintの代わりにflake8を導入し自動整形を設定する \- Qiita](https://qiita.com/psychoroid/items/2c2acc06c900d2c0c8cb)
    - [Flake8プラグイン&フォーマットツールまとめ \| DevelopersIO](https://dev.classmethod.jp/articles/flake8-plugins-and-format-tools/)
    - [Python のコードを快適に書くための設定をまとめてみる \| @K2SS \- 日々、邁進](https://k2ss.info/archives/2976/)
WSLでNav2

# WSLでNav2

WSLでNavigation2のインストールと動作メモ

## 関連記事

- [WSLでGazebo](https://qiita.com/akira-sasaki/items/8629457f33ab7c8942c3)
- [WSLでROS2(Foxy)](https://qiita.com/akira-sasaki/items/8629457f33ab7c8942c3)

## Nav2のインストール

Nav2のインストール

```
sudo apt install ros-foxy-navigation2 ros-foxy-nav2-bringup 
```

turtlebot3のシミュレータをインストール

```
sudo apt install ros-foxy-turtlebot3-*
```

```
source /opt/ros/foxy/setup.bash
```

## Nav2の起動

```
export TURTLEBOT3_MODEL=waffle_pi
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/foxy/share/turtlebot3_gazebo/models
```

```
ros2 launch nav2_bringup tb3_simulation_launch.py
```

![slamtoolbox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/1cf8d878-111d-f28c-f13f-9cba51586634.png)

## 操作

![nav2_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/9631efb4-91cd-b678-c0a1-4f626b21ffed.png)

![nav2_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/079e42b0-5cd6-ee98-ff51-64d5efd0615c.png)

![nav2_003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/566722d3-58f2-d063-32be-0eebcb1eb837.png)

![nav2_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/8069ae90-1d0e-23bc-cf59-ace3a98ecf05.png)
PyCall を使って Ruby でハートを描く その 2

# はじめに

以前 [PyCall を使って Ruby でハートを描く](https://qiita.com/QUANON/items/4e06e11728532335882d) という記事を書きました。それから約 4 年後、久しぶりに [PyCall](https://github.com/mrkn/pycall.rb) を触ってみました。今度は 3D のハートを描画してみようと思います ❤️

# PyCall について

PyCall は Ruby から Python のコードを呼び出すことができる、[mrkn (Kenta Murata)](https://github.com/mrkn) さんが作成されている Gem です。この mrkn さんは [numpy.rb](https://github.com/mrkn/numpy.rb) や [matplotlib.rb](https://github.com/mrkn/matplotlib.rb) など、Python で非常に有名なライブラリのラッパーライブラリも作成してくれています。今回はそれらも使用します。

# バージョン情報

```terminal
$ ruby -v
ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [x86_64-darwin20]

$ gem list | grep -e "pycall" -e "numpy" -e "matplotlib"
matplotlib (1.1.0)
numpy (0.2.0)
pycall (1.3.1)

$ python --version
Python 3.9.2

$ pip list | grep -e "numpy" -e "matplotlib"
matplotlib      3.4.1
numpy           1.20.2
```

# コード

Stack Overflow の [how to draw a heart with pylab](https://stackoverflow.com/questions/4478078/how-to-draw-a-heart-with-pylab) という記事に記載されている Python のコードを Ruby に書き換えました。

```rb
require 'matplotlib/pyplot'
require 'numpy'

Axes3D = PyCall.import_module('mpl_toolkits.mplot3d').Axes3D

def calculate_3d_heart(x, y, z)
  (x**2 + (9.0 / 4) * y**2 + z**2 - 1)**3 - x**2 * z**3 - (9.0 / 80) * y**2 * z**3
end

def plot_3d_heart
  xmin, xmax, ymin, ymax, zmin, zmax = [-1.5, 1.5] * 3
  fig = Matplotlib::Pyplot.figure
  ax = fig.add_subplot(111, projection: '3d')
  a = Numpy.linspace(xmin, xmax, 100)
  b = Numpy.linspace(xmin, xmax, 40)
  a1, a2 = Numpy.meshgrid(a, a)

  # numpy.ndarray は each や to_a ができないので index で値にアクセスする。
  b.size.times do |i|
    x = a1
    y = a2
    z1 = b[i]
    z2 = calculate_3d_heart(x, y, z1)
    ax.contour(x, y, z1 + z2, [z1], zdir: 'z', colors: ['red'])
  end

  b.size.times do |i|
    x = a1
    z = a2
    y1 = b[i]
    y2 = calculate_3d_heart(x, y1, z)
    ax.contour(x, y1 + y2, z, [y1], zdir: 'y', colors: ['red'])
  end

  b.size.times do |i|
    y = a1
    z = a2
    x1 = b[i]
    x2 = calculate_3d_heart(x1, y, z)
    ax.contour(x1 + x2, y, z, [x1], zdir: 'x', colors: ['red'])
  end

  ax.set_zlim3d(zmin, zmax)
  ax.set_xlim3d(xmin, xmax)
  ax.set_ylim3d(ymin, ymax)

  Matplotlib::Pyplot.show
end

plot_3d_heart
```

上記の Ruby スクリプトを実行すると [Tk](https://ja.wikipedia.org/wiki/Tcl/Tk) のウィンドウが開きます。

![Kapture 2021-04-25 at 21.12.27.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6697/22efc0fc-500f-c366-050a-b56b1818c552.gif)

若干血しぶきが飛び散っているのはご愛嬌 😇

# ちょっとした悩み

Python ではスカラー値を x、ベクトル値を X のように変数名の大文字と小文字を使い分けているが、Ruby ではどうすればいいのでしょう 🤔 Ruby だと大文字は定数と判断されるためです。

# 参考

- [mrkn/pycall.rb: Calling Python functions from the Ruby language](https://github.com/mrkn/pycall.rb)
- [mrkn/numpy.rb: Numpy wrapper for Ruby](https://github.com/mrkn/numpy.rb)
- [mrkn/matplotlib.rb: matplotlib wrapper for Ruby](https://github.com/mrkn/matplotlib.rb)
- [numpy.ndarray — NumPy v1.20 Manual](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html)
- [mpl_toolkits.mplot3d.axes3d.Axes3D — Matplotlib 3.4.1 documentation](https://matplotlib.org/stable/api/_as_gen/mpl_toolkits.mplot3d.axes3d.Axes3D.html)
SESSION SEQUENCEを試す（Oracle Database 19c)

シーケンス（日本語マニュアルでは「順序」）は、指定された間隔で順序数を取得するスキーマ・オブジェクトです。通常のシーケンスはデータベース内で一意に識別され、複数のセッション間でシーケンス値を取得する場合でも同一の値が返ることはありません。

# SESSION SEQUENCEとは
SESSION SEQUENCEを作成すると、セッション内でのみ一意な値を返します。このシーケンスを作成するにはCREATE SEQUENCE文にSESSION句を指定します。SESSION SEQUENCEは一時テーブル（TEMPORARY TABLE）に対する一意制約などに使うことが想定されています。SESSION句を指定しない従来のシーケンスはGLOBAL SEQUENCEと呼ばれます。GLOBAL句を指定するか、省略すると従来のシーケンスが作成されます。GLOBAL SEQUENCEとSESSION SEQUENCEの作成にはどちらもCREATE SEQUENCEシステム権限が必要です。

```
SQL> CREATE SEQUENCE seq01 SESSION;

順序が作成されました。

SQL> SELECT seq01.NEXTVAL FROM DUAL;

   NEXTVAL
----------
         1
```

別のセッションでオブジェクトを確認すると、USER_OBJECTSビューやUSER_SEQUENCESビューにレコードがあることが確認できます。SESSION SEQUENCEを作成した場合はUSER_SEQUENCEビューのSESSION_FLAG列がYになります。シーケンス値を取得すると別のセッションで同じ値が取得されることがわかります。

```
SQL> SELECT SEQUENCE_NAME, SESSION_FLAG FROM USER_SEQUENCES;

SEQUENCE_NAME                  S
------------------------------ -
SEQ01                          Y

SQL> SELECT seq01.NEXTVAL FROM DUAL;

   NEXTVAL
----------
         1
```

# SESSION SEQUENCEの変更
[SQLリファレンス・マニュアル](https://docs.oracle.com/cd/F19136_01/sqlrf/ALTER-SEQUENCE.html#GUID-A6468B63-E7C9-4EF0-B048-82FE2449B26D)には構文のみ記載されていて説明がありませんが、GLOBAL SEQUENCEとSESSION SEQUENCEは相互にタイプを変更できます。
  シーケンスのタイプをGLOBALからSESSIONに変更した場合、シーケンス値の初期値はタイプを変更した時点の値になります。

```
SQL> CREATE SEQUENCE seq02 GLOBAL;
順序が作成されました。

SQL> SELECT seq02.NEXTVAL FROM DUAL;
   NEXTVAL
----------
         1

SQL> SELECT seq02.NEXTVAL FROM DUAL;
   NEXTVAL
----------
         2

SQL> SELECT seq02.NEXTVAL FROM DUAL;
   NEXTVAL
----------
         3

SQL> ALTER SEQUENCE seq02 SESSION;
順序が変更されました。

SQL> CONNECT SCOTT/TIGER
接続されました。

SQL> SELECT seq02.NEXTVAL FROM DUAL;

   NEXTVAL
----------
         4
```

マニュアルには記載はありませんが、ALTER SEQUENCE RESTART文によるシーケンス値のリセットは、実行したセッションでは無効になるようです。

```
SQL> SELECT seq02.nextval from dual;
   NEXTVAL
----------
         9

SQL> ALTER SEQUENCE seq02 RESTART;
順序が変更されました。

SQL> SELECT seq02.nextval from dual;
   NEXTVAL
----------
        10
```

# パフォーマンス
デフォルト設定で作成したGLOBAL SEQUENCEとSESSION SEQUENCEでパフォーマンスを比較しました。
NEXTVALを100万回取得して時間を計測します。SESSIONシーケンスは通常のシーケンスよりも高速に処理が行われます。

```
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    sttime  NUMBER;
  3    loops  NUMBER := 1000000;
  4    num   NUMBER;
  5  BEGIN
  6    sttime := DBMS_UTILITY.GET_TIME;
  7
  8    FOR i IN 1 .. loops LOOP
  9      num := gseq.NEXTVAL;
 10    END LOOP;
 11
 12    DBMS_OUTPUT.PUT_LINE('Global : ' || (DBMS_UTILITY.GET_TIME - sttime)/100.0 || ' secs');
 13
 14    sttime := DBMS_UTILITY.GET_TIME;
 15
 16    FOR i IN 1 .. loops LOOP
 17      num := sseq.NEXTVAL;
 18    END LOOP;
 19
 20    DBMS_OUTPUT.PUT_LINE('Session: ' || (DBMS_UTILITY.GET_TIME - sttime)/100.0 || ' secs');
 21  END;
 22  /
Global : 14.44 secs
Session: 5.63 secs

PL/SQLプロシージャが正常に完了しました。
```

|設定|時間（秒）|
|:---|---:|
|GLOBAL|14.44|
|SESSION|5.63|
Laravel８ User :: createのIDを取得し、そのIDを使用して新しい行を挿入した。(メモ)

Authの```RegisterController```のcreateメソッドをこのように書き換えて、ユーザーの新規登録処理の直後にその登録されたユーザーの詳細データの行を挿入した。

```php
protected function create(array $data)
    {
        $user = User::create([      //一旦、変数に入れる
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);

        userDetail::create([        //ここの処理を追加した
            'userId' => $user->id,
        ]);

        return $user;               //変数を返す
    }
```
[iPhone]アクティブなアプリから別アプリを起動する[Flutter]

# 概要
アクティブなアプリ（画面上に表示している）から別アプリを起動する方法をメモしています。



# 実装
## 呼び出される側（別アプリ）
info.plistに以下の内容を追加する。
・*URL types > URL identifier > 「設定したい文字列」（下記の例だとjp.sample.test.app）*
・*URL types > URL Schemes > 「設定したい文字列」(sample-app)*

![スクリーンショット 2021-04-25 20.37.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549803/ef2febff-e36e-966e-d112-4f2d4e1cd230.png)


上記の方法は「Custom URL Scheme」と呼ばれています。iOSには他に「Universal Links」というhttpから始まるリンクを設定することもできます。


##呼び出し側（アクティブ）
呼び出す側のアプリは以下の様に「launch」メソッドに先ほどinfo.plistに設定した文字列を渡す事で呼び出せます。
この「launch」は`pubspec.yaml`に「`url_launcher: ^6.0.3`」（バージョンは任意）を設定し、`flutter pub get`により事前にプラグインをDLしとかないといけません。

```
import 'package:url_launcher/url_launcher.dart';

  _lancherCameraApp()
  {
    return launch("sample-app://jp.sample.test.app");
  }
```
Laravel - デフォルトのユーザー登録に処理を追加する【初心者向け・備忘録】

※まだEloquentの使い方に慣れていない方に向けた内容です。

Laravelのデフォルト機能で作成できるregisterControllerで、ユーザを作成する際に何かしらの処理を追加する方法です。

createメソッド内の

User::create([
           'name' => $data['name']...)

を一度変数に格納し、

例　：　$user = User::create...

その後、登録時に行いたい処理を記載したら

return $user;

を返します。

※登録処理自体に変更を加えたい場合は、registerControllerで

public function register(Request $request)

をオーバーライドしてあげましょう。
ExcelVBAの始め方

ExcelVBAを使うには、Excelに開発タブが表示されている必要があります。
デフォルトの状態では表示されていません。
今回は開発タブの表示方法について説明いたします。


![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/fa4579f8-29a2-ad52-6c9a-6e1a88c50af8.jpeg)


ではどうすれば開発タブが表示されるのでしょうか。次の順番にクリックしていくことで表示が可能です。

まず、ファイルをクリック。
![1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/a3b04e6d-84ef-d380-3a72-d5858d9c52fa.jpeg)

オプションをクリック。

![2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/c1512b7d-2123-3750-a43b-c8fc9b62c4ad.jpeg)

リボンのユーザ設定。![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/c4158653-e129-ab81-e238-e3e5fe139d72.jpeg)

開発が空欄となっていますので、クリック。

![4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/ce35e3bc-d1fc-d1c9-7d40-e6e5ef6da9f8.jpeg)

そしてＯＫを押します。

![5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/94ce2099-3c72-5a31-31b6-d53299b270c8.jpeg)


開発タブが表示されました。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560877/2300770c-0123-b015-c85e-018a9785f399.png)
EclipseにSpring Tool Suiteのプラグインをインストールする方法

手っ取り早くEclipseとpring Tool Suiteのプラグインをインストールする方法を紹介します。

# 1. Eclipseのインストール

### 1.1. Eclipseのダウンロード
「[Pleiades - Eclipse 日本語化プラグイン](https://mergedoc.osdn.jp/ "Pleiades - Eclipse 日本語化プラグイン")」のページを開き、「Eclipse 2021（最新版）」をクリックします。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/407520f5-0acf-8dec-a12c-2a24850065b2.png)

自分の環境に合うものを選択し、ダウンロードします。
ここでは、「Java」－「Windows 64bit」－「Full Edition」の「Download」をクリックします。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/e9b733d6-d8eb-bf3b-9cac-f38606921d8c.png)

ダウンロードのリンクをクリックします。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/6af1206c-5a29-3839-4060-37bacae6145d.png)

### 1.2. ファイルの解凍

ダウンロードしたファイル（ここでは「pleiades-2021-03-java-win-64bit-jre_20210328.zip」）をインストールしたいフォルダ（ここでは「C:\DK\pleiades-2021-03-java」）に解凍します。
※「Windows では 7-Zip で解凍してください。それ以外で解凍した場合、パス長 260 文字制限により正常動作しません。」とあるので、ここでは7-Zipを使用して解凍します。

海洋すると「pleiades」というフォルダができます。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/423b61cf-d213-e4b6-4d7c-f42fe34e138a.png)

以上で、Eclipseのインストールは完了です。

# 2. Eclipseを起動

「pleiades\eclipse」配下の「eclipse.exe」をダブルクリックし起動します。
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/97bcd584-866a-7f2d-7f11-81e794cbf5da.png)

ワークスペースは「../workspace」のままで、「起動」をクリックします。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/3b2bc349-a29e-9138-c728-d3379d40b599.png)

Eclioseが起動します。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/e12a2064-d55f-456e-f088-6281c2b7bc38.png)

# 3. Spring Tool Suiteプラグインをインストール

メニューの「ヘルプ」から「Eclipse マーケットプレース」を選択します。
![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/70f718ef-339d-6b21-f41b-4cf2e3838622.png)

検索の欄に「Spring Tool Suite」と入力し、「Go」をクリックします。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/a78038db-ce2f-e07f-6da3-77ac778c7320.png)

「Spring Tools 4 (aka Spring Tool Suite 4) 4.10.0.RELEASE」の「インストール」をクリックします。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/8c7567c6-c767-7679-4218-dde72f5ff51d.png)

と思ったら、既に「インストール済み」となっています。
「[Pleiades All in One Eclipse ダウンロード](https://mergedoc.osdn.jp/ "Pleiades All in One Eclipse ダウンロード")」のページに

> Full Edition には Eclipse 実行用の Java が付属しているため、Java のインストールや環境変数の設定は不要です。また、Java Full Edition は STS と Lombok が設定済みのため、すぐに Spring Boot での開発ができます。 (Spring Boot 入門) 

と記載がありますね。

「[Pleiades All in One Eclipse](https://mergedoc.osdn.jp/ "Pleiades All in One Eclipse")」のページを見ると、確かに設定済みのようです。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292434/c13d0f9a-1a58-6b8f-b769-013ed581cd1a.png)


---

以上
Formオブジェクトではrailsで仕組まれた「save」設定ではない

バリデーションは、データベースを永続化するうえで極めて重要です。**そのため、save、updateメソッドは、バリデーションに失敗するとfalseを返します。**このとき実際のデータベース操作は行われません。

→そのように仕組まれているということです。

>Railsガイド
>https://railsguides.jp/active_record_basics.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E6%A4%9C%E8%A8%BC%EF%BC%89

Formオブジェクトでは
-

基本自作したフォームオブジェクトではsaveやupdateの際に上記で書いた付加されたrails独自の設定は全くない（=バリデーションに失敗するとfalseを返したりはしない)ので基本、下に示した上部と下部は無関係なので関連性なくプログラムが通リます。


```rb:address_purchase.rb(上部）
with_options presence: true do
   validates :address 
   validates :postal_code, format: { with: /\A[0-9]{3}-[0-9]{4}\z/, message: "は登録できません。ハイフン-(半角)を含みます。"}
   validates :town, format: { with: /\A[ぁ-んァ-ン一-龥々]/, message: "は全角ひらがな、全角カタカナ、漢字で入力して下さい" }
   validates :phone_number, format: { with: /\A\d{10,11}\z/, message: "は半角数値で入力して下さい" }
   validates :prefecture_id, numericality: { other_than: 1} 
end
```

```rb:address_purchase.rb(下部）
def save
   purchase = Purchase.create(user_id: user_id, item_id: item_id)
   Address.create(postal_code: postal_code, prefecture_id: prefecture_id, town: town, address: address, building: building, phone_number: phone_number, purchase_id: purchase.id)
end
```
...mapState でストア呼び出し




# mapstateとは

一言でいうと、ストアのデータ呼び出しの記述を短くするためのもの、です。
`this.$store.state.プロパティ名` でストアのデータを呼び出スことが可能です。しかしそれでは長くなり、可読性が落ちてしまうので `computed` にまとめて呼び出すことができます。

mapStore自体がオブジェクトを返すのでこのようにします。


``` .vue
<script>

import { mapState } from "vuex"; // vuexからmapStateをimport

export default {
  computed: mapState(["lists"]),
};
</script>
```

本来はコンポーネント内で `this.$store.state.lists` と記述しますが、 mapState を使うことで、 state に this.$store.state が代入され、簡潔に呼び出しができます

#### computed と mapstate を共存させるには

最初に紹介した方法では、computedが定義できませんが、こんな記述方法もあります。

``` .js
computed: {

  ...mapState(["lists"]),

  otherFunction() {
    // 略
  },
},
```


# ...　←の意味

これ（ **...** ） はスプレッド構文という名前で、オブジェクトを個々の値に展開することができるものです。

スプレッド構文を使わず下記の様にしてしまうと・・

``` .js
computed: {
  mapState(['lists']),
}
```

mapstateがオブジェクトを返すので、このように {} が重なった状態になってしまいます。

``` .js
computed: {

  {
    lists () {
      return this.$store.state.lists
    },
  }

}
```


# 参考文献

[Vue公式 Vuex state](https://vuex.vuejs.org/ja/guide/state.html#mapstate-%E3%83%98%E3%83%AB%E3%83%91%E3%83%BC)
LOLIPOP！使用者に向けたFFFTP導入にあたっての注意

# 公式サイトの説明が正確ではない
ロリポップサーバーの公式サイトに、FFFTPの導入方法は分かりやすく書かれています。
https://lolipop.jp/manual/hp/w-ff-ftps/

「FFFTPは一度開発が終了されましたが、その後有志による開発が行われているFTPソフトです。 SourceForge.JPのFFFTPプロジェクトにてダウンロードできます。」とあり、「SourceForge.JPのFFFTPプロジェクト」がリンクになっています。
https://ja.osdn.net/projects/ffftp/

しかし、このサイトにおける開発もすでに終了しているのです！

# 現在も開発は続いています
現在は新たな開発代表者の方のもと、GitHubで開発が続けられています
https://github.com/ffftp/ffftp

ですが、GitHubからZipダウンロードしても、どうやってインストールするかが私には分かりませんでした

# 結論
最新版は窓の杜からダウンロードできる
https://forest.watch.impress.co.jp/library/software/ffftp/

# 補足：ミラーリングダウンロードでエラーが出たら
https://nikunimame.com/ffftp-download-directory/
に詳しく書いてありました
CSSが嫌いなエンジニアが多い理由を、勝手に考えてみた

#どうも7noteです。CSSが嫌いな方が多いですが、私はフロントマンなのでCSSは好きです。

Twitterを見ていると、

***「CSS嫌い」***
***「CSSむずい」***
***「CSSわからん」***

などなどの言葉をちょくちょく見かけるなと思っていました。
実際エンジニアの方から「CSS、よくわかるなぁ」なんて感じの言葉をかけられることもあります。


https://twitter.com/qrostar/status/1180285901387075584?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1180285901387075584%7Ctwgr%5E%7Ctwcon%5Es1_c10&ref_url=https%3A%2F%2Fqiita.com%2Fiwasaki501%2Fitems%2F51dc07b744d3f342008b

CSSって嫌われてますね。。。Twitterならではの偏りはありそうですが。
ということで、**勝手ながらCSSが嫌いになる理由を考えてみました。**

CSS嫌いを克服する方法も少しだけ最後に書いているので、よければみていってください。

## ▼エラーが出ない

普段PythonやCなどのプログラミング言語を中心に開発されているエンジニアの方からすると**エラーが出ないのは恐怖**だと思います。
エラーが出ないときほど怖いものはないですからね。

**「原因不明のエラー(不具合)は怖い。」**


## ▼プロパティの種類が多すぎる

数えてないですが、おそらく100は超えてて200あるかどうか、、、くらいでしょうか。
一覧↓
https://weblan3.com/css/css_property#css_property_purpose

しかもpaddingとmarginのように似たようなものがあったりするのでややこしい。
**違いが分かりにくい。**

**「そう、CSSはややこしい言語である。」**


## ▼無効化や削除したいのに、なんのプロパティのせいなのかが分からない

**「なんか余計なcssが効いてそうだけど、どこで効いてるかわからない。**という場面も多いのかなと思います。
しかも見つけてもそれ消していいのか分からないという不安。。。スコープ的な概念がないので、1行だけで全部に反映されるのは便利なのですが、その分**修正するときにはめっちゃ神経を使います。**

**「つまり、cssを触ると疲れるんですよね。」**


## ▼不具合が出ても何て検索したらいいかわからない。

**うまくいってない＝見えない・反映されない。**
だから原因がわからない。だからなんて検索していいかもわからない。なんのプロパティが影響してるせいでうまくいってないのかがわからない。そもそもプロパティ以前の問題の可能性もあるから困る。

**「解決策を探す方法が分からないから詰んでる。」**


## ▼各種ブラウザに依存性があるプロパティが多い

※@scivola さんよりコメントでいただきました。ありがとうございます。

**「Chromeでは使えるけどIEでは使えない」**、**「iosのSafariだけなんか効かない」**
なんてことが多々あります。

さらにはIEにも対応しなければならないとなると、地獄を見る可能性もあります。

**「ブラウザごとの特性を覚えつつ、プロパティを覚えるなんて地獄」**


## ▼学習サイトじゃ学びきれない

正直CSSの5〜10%くらいしか解説してないと思います。仕事ができるレベルの理解度で60〜70%くらい理解していれば、いろいろできると思いますが、プロゲートのような学習サイトをやったからといってCSSが使えるようにはならない…(あくまで個人的見解です)。

**「cssを勉強しても、分からないままなのは変わらない。」**


## ▼そもそも予備知識が必要だから勉強してないと難しい
フロート、ボックスモデル、メディアクエリ、フレックスボックス、などなど。
**正直知識なかったらサッパリなのは当然。**
勉強してないテストの範囲出されても答えられないのと一緒だから、cssがわからなくても大丈夫です。当然です。

勉強する暇があったらわかる人に聞くわ！
でも**CSSわかる人が近くにいない。。。**

**「勉強してまでCSSを覚えるつもりはない」**

## CSS嫌いを克服するには

・慣れる
・恐怖心をなくす

と曖昧な言葉だけでも締まりが悪いので具体的な方法も考えてみました。

**【CSS嫌いを克服するコツ】**
**・googleChromeの検証ツールを使う**
**・模写コーディングを行う**
**・知ってる人に聞く、もしくはお願いする**

### 「googleChromeの検証ツールを使う」

「F12」もしくは「Ctrl+Shift+I（MacではCommand + Option + I）」で起動できます。

![スクリーンショット 2021-04-24 22.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/4bafe0f8-72a2-464a-a463-ad2973715c9a.png)

検証ツールでHTMLとCSSを確認することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/9d624a03-a8a4-d9bc-b889-fba8c5b1263b.png" width="30"/>↖このアイコンをクリックした後、ブラウザの要素をクリックするとフォーカスがあたり、その要素とその要素に効いているCSSを確認することができます。また**検証ツール上で数値を変更したり、プロパティを追記したり、無効化にしたりもできます。**


### 「模写コーディングを行う」

やはり模写コーディングを行うと格段にスキルアップができます。そこで使われているプロパティを真似して使うことで、なんとなく何がどこに影響しているのかがわかります。
また模写コーディングは実用的なプロパティに多く触れることができるので、理解までのスピードがめちゃくちゃ早いです。ただ、その分難易度は少し高いかもしれません。。。
デザインが簡単なサイトの模写から始めると良いと思います。


### 「知ってる人に聞く、もしくはお願いする」

苦手なものはだれにでもあると思います。できる人に聞いたり、お願いしたり頼りましょう。
いまでは質問投稿サイトもたくさんありますのでそういうところを活用するのがいいかもしれませんね。


## まとめ

勝手な妄想でCSSが嫌われる理由を考えてまとめてみました。
他にもCSSがよくわからない理由などあればぜひコメントください。質問などもあればお答えさせていただきます！

**1人でもCSS好きが増える平和な世界になりますように。**

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
modelではdeviseで利用できるcurrent_userは使えない

modelではcurrent_userは使えない

>teratail
>https://teratail.com/questions/272877

####変数やmethodはそれが参照可能な範囲があります。

「変数やmethodはそれが参照可能な範囲があります。current_user はmethodです。paramsもHashの様な顔をしてますが、振る舞いをみるとmethodっぽいです。methodは 単独で使う場合は、それが定義されているインスタンスでないと参照できません。これらはcontrollerのインスタンスのものなので、modelでは参照できません。
必要なときは、modelのmethodを呼ぶときに引数で渡す必要があります。」

なのでコントローラーで使う

だからmodelにおいたaddress_purchase.rbで以下のようにコーディングしました。

```rb:app/models/address_purchase.rb
  def item_params
    params.require(:item).permit(:item_name, :description, :category_id, :status_id, :delivery_fee_payment_id, :prefecture_id, :delivery_prepare_id, :price, :image).merge(user_id: current_user.id)
  end
```

モデル内ではうまく動きませんでした。
ReactとRailsのアプリを一つのEC2にデプロイする。React編

今回は、ReactとRailsを使ってSPAを作成した際に一つのEC２インスタンスにデプロイする方法を忘備録としてまた、同じ事象で悩んでいる方のために残しておきます。

フロント側をAmplifyやnetlifyでデプロイしようと考えていましたが、RailsのAPI側をhttps化しなければリクエストを受け付けてくれなかったので、EC２に両方ぶち込んじゃえという手法になります。

# 概要
前提として、今回はフロント側について記述するため、RailsAPI側の方法は後日記述します。

# EC2のインバウンドルールを編集しましょう。
まずは、EC2のセキュリティグールプからインバウンドを画像のように編集しましょう。
![スクリーンショット 2021-04-25 19.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399154/38280f08-68e9-40f1-ebe1-79b3761f883c.png)

簡単な説明として、API側のポートとして3000番を設定しています。
また、IPV4とIPV6すべてのリクエストに対応するため、`::/0`と`0.0.0.0/0`は２つずつ設定しています。

# EC2インスタンスにsshで接続し、ディレクトリを作成しましょう。
私の場合は、`~/var/www`というディレクトリを作成しました。

# 作成したディレクトリにReactアプリを`git clone`しましょう。
先程作成したディレクトリに`git clone`をしましょう。
EC2インスタンスに`git clone`をする場合は、作成したEC2インスタンスのssh公開鍵をGitHubに登録する必要があります。

# EC2サーバーのssh鍵のペアを作成し、GitHubにssh鍵を登録しましょう。

```
[ec2-user@ip-192-32-33-129 ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
3a:8c:1d:d1:a9:22:c7:6e:6b:43:22:31:0f:ca:63:fa ec2-user@ip-172-31-23-189
The key's randomart image is:
+--[ RSA 4096]----+
|    +            |
| . . =           |
|  = . o .        |
| * o . o         |
|= *     S        |
|.* +     .       |
|  * +            |
| .E+ .           |
| .o              |
+-----------------+
```
※Enterを押せば画像のような表記になります。

# ssh公開鍵の値をGitHubに登録しましょう。
catコマンドで、公開鍵が含まれているファイルid_rsa.pubの中身をターミナル上に表示します。

```
[ec2-user@ip-192-32-33-129 ~]$ cat ~/.ssh/id_rsa.pub
```
すべて（ssh-rsaから最後の文字まで）コピーします。

```
ssh-rsa AAAs3NzaC1yc2EAAASADAQABavasAQDLwt......
```
https://github.com/settings/keys
上記のURLからkeyを追加しましょう。（タイトルはなんもでもOKです。）

# git cloneが出来たらyarn run buildを実行しましょう。
先程の作成したディレクトリにgit cloneが完了しましたら、cloneしたアプリに移動し、`yarn run build`を実行しましょう。

実行すると、アプリ内に**buildディレクトリ**が作成され、その中に`index.html`が生成されていればOKです。

**※yarn run buildを実行してもindex.htmlが生成されない場合はメモリ不足の可能性があります。
yarn run buildコマンドはメモリをかなり食うらしく、何度やっても生成されない場合は、一度EC2を停止させて、再起動し、再度実行してみましょう。**

# Nginxの設定ファイルを作成し編集しましょう。
Nginxの設定ファイルは`/etc/nginx/conf.d/***.conf`に作成しましょう。（ファイル名は何でもOKです）

作成できましたら、下記のように編集しましょう。

```/etc/nginx/conf.d/***.conf
server {
  listen       80;
  server_name  IPアドレス;
  charset      utf-8;

  # ドキュメントルートを指定.
  root /var/www/アプリ名/build;
  index index.html;

  # リクエストされたリソースがなければ、index.htmlを返却.
  location / {
    try_files $uri /index.html;
  }

}
```

上記でフロントエンド側の設定は終了です。

IPアドレスに接続し、アプリが表示されていればOKです。
**※Nginxの設定ファイルを編集した跡は必ず`restart`しましょう。**

```
sudo systemctl restart nginx
```

ありがとうございました。

# 参考文献リスト
https://www.yoheim.net/blog.php?q=20180407
M5Stack Core2 for AWS のデモ

[M5Stack Core2 ESP32 IoT Development Kit for AWS](https://ssci.to/Core2_for_AWS) には、[チュートリアル](https://edukit.workshop.aws/jp/)とは別に [Core2 for AWS IoT Features Demo](https://github.com/m5stack/Core2-for-AWS-IoT-EduKit#core2-for-aws-iot-features-demo)がある。

各ハードウェア機能をデモで確認することができるもの。画面下の黒いところは、音を検知して表示される領域。画面からはわからないが、SDカードへの読み書きもテストでき、シリアル出力で確認できる。
<img width="200" alt="Hardware-Features-Demo .jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1226137/06bbe426-9cb3-271d-1738-c14e0e550f03.jpeg">
実行するには、[RainMaker Agent ファームウェアのビルドとアップロード](https://edukit.workshop.aws/jp/getting-started/run-rainmaker.html#rainmaker-agent-ファームウェアのビルドとアップロード)と同じ要領でビルド・アップロードする。このとき、Core2-for-AWS-IoT-EduKit/Getting-Started の代わりに Core2-for-AWS-IoT-EduKit/Hardware-Features-Demo を PlatformIO で開く。
git grepを使って検索し、指定した箇所のgithubのリンクを取得するスクリプト

# 概要

git管理されているファイルから任意の文字列を指定して検索し、該当するgithubのURLを開くスクリプトです

 - 現在いるブランチのURLを開きます
 - 行数も指定されます

　業務にてコードの質問や、レビューなどで該当箇所をgithubのリンクで共有することが多々あります。
コマンドラインから検索が完結し、そのままURLに飛ぶようにすると作業効率が上がりそうだったので作成してみました。
 
以前にpecoの記事を投稿したのですが、その応用です。

[pecoを使ってgithubのcompare URLを簡単に生成する](https://qiita.com/gatapon/items/b498cad8e5e343f668d6)

```zsh
function gg-line() {

    if [[ -z $1 ]];then
        echo "string arg is needed."
        return
    fi

    REPO=`git remote -v | grep fetch | awk -F '[:. ]' '{print $3}'`
    if [[ -n "$REPO" ]];then
        BRANCH=`git branch --contains | awk -F '[ ]' '{print $2}'`

        # 指定が取れない場合はmasterにする（引数にmasterを指定しても良いかも）
        if [[ -z $BRANCH ]];then
            BRANCH='master'
        fi

        PATHLINE=`git grep -nF $1 | peco | awk -F '[: ]' '{print $1"#L"$2}'`
        if [[ -z $PATHLINE ]];then
            return
        fi

        URL="https://github.com/$REPO/blob/$BRANCH/$PATHLINE"
        echo $URL && open $URL
    fi
}
```

## 使用例

引数の文字列が検索されます

```sh
$ gg-line test
```
[初学者メモ]Rubyの%記法で文字列を表す

# はじめに
この記事はプログラミング初学者である私の学習用記事です。
Qiitaでの投稿とMarkdown記法の練習、アウトプットを目的としています。
内容としては大したものではないためあしからず。

#Rubyの%記法を使う理由
%を使用することでコードをすっきりさせることができます。

#文字列を%記法で書く
まず、%記法は文字列を表す際に使われます。
文字列の中で " や ’ を使用する場合は、バックスラッシュによるエスケープが不要になり見やすくなります。

##%Q
**""(ダブルクォーテーション)と同様に使えます。**

Qは省略することが可能。
ダブルクォーテーションと同等のため、変数や定数の展開もできます。

```ruby:%Q
puts %Q(Rubyを学習中です。)
# => Rubyを学習中です。

puts %(Rubyを学習中です。)
# => Rubyを学習中です。

languages = "Ruby"
puts %(#{languages}を学習中です。)
# => Rubyを学習中です。
```

##%q
**''(シングルクォーテーション)と同様に使えます。**

定数や変数の展開はできません。

```ruby:%q
puts %q(Rubyを学習中です。)
# => Rubyを学習中です。
```

##%W
**式が展開できる(ダブルクォーテーションの機能をもつ)配列を表します。**

```ruby:%W
favorite_food = curry

p %W(#{favorite_food} stew)
# =>　["curry", "stew"]
```

##%w
**式を展開しない(シングルクォーテーションの機能をもつ)配列を表します。**

```ruby:%W
favorite_food = curry

p %w(curry stew)
# =>　["curry", "stew"]
```

#参考元

学習にはドットインストールさんを使用させて頂いてます。

https://dotinstall.com/

以下の記事も参考にさせて頂きました。

https://qiita.com/mogulla3/items/46bb876391be07921743
マインドフルネスの記事は新月にアップされるのが多いのか？を検証してみた！


#はじめに

4日前にJavaScriptを始めたばかりの初心者です。
これがQiita初めての投稿です。
まだまだ未熟者ではありますが、これからも興味のあるものをどんどんアウトプットしていければと思っています。
ご指摘、アドバイスなどいただけると嬉しいです！

#目的
・Qiita上で「マインドフルネス」というキーワードを見つけたので、マインドフルネスに関連している記事がどれぐらい投稿されていて、その投稿している日が新月と関係があるかを可視化します。

※私たちは少なからずとも月の影響を受けて生活をしていますが、新月の日は新月のパワーが背中を押してくれるため、何かにチャレンジしようとか、願いごとをするなどの影響を受ける人が多くなるため、記事を書くパワーと関係性があるのではないか？という単純な疑問からです。

#サンプルコード

キーワードは「マインドフルネス」の他に「mindfulness」や「瞑想」でも記事を取得しました。

```
const axios = require("axios");

async function main() {
  let response = await axios.get(
    "https://qiita.com/api/v2/items?per_page=100&query="+encodeURIComponent("瞑想"||"マインドフルネス"||"mindfulness")
  );

    for(let i = 0; i < response.data.length; i++){
    　console.log(response.data[i].created_at);
```


#抽出結果と考察

今回は意外にも対象件数が多かったので2020年1月～のデータのみを対象にしました。

グラフがちょっと見づらくなってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/b084d1f0-2ef5-4d9e-9fca-efd7de7554c6.png)



 
・新月の当日に投稿されてはいないものの、その近い日に投稿されているのがよくわかりますね。前述でも記載したように新月にはマインドが突き動かされるのだと考察します。

・また、新月との関わりの他に第３回目の緊急事態宣言前にかなりの記事が投稿されているのもわかります。これは、「不安への対処法としてマインドフルネスが推奨される」というのも関係しているのではないかと推察します。




#おわりに

やりたいことがいっぱいなのに技術が伴わないため焦るばかりで、結局は授業で教わったロジックしか組めませんでした。（涙）
今後もいろいろな検証をしていきたいので、もっとスキルを磨いてチャレンジします！
grep,cut,sort,uniq,wcコマンド

# 条件に当てはまる文字列検索
※「シス環系女子 season2 第5話」の備忘録です。

以下、テスト用ファイル。

```
$ cat test.log
1,hoge,hogehoge
2,fuga,fugafuga
3,piyo,piyopiyo
4,foo,foofoo
5,bar,barbar
6,bar,barbar
7,baz,bazbaz
```

## grepコマンド
- オプション -v

一致しないものを検索する。

```
cat test.log | grep -v "baz"
1,hoge,hogehoge
2,fuga,fugafuga
3,piyo,piyopiyo
4,foo,foofoo
5,bar,barbar
6,bar,barbar
```

## cutコマンド
横方向に分割するコマンド

 - オプション -d
区切り文字を指定する

 - オプション -f
区切り文字で分割した後、何番目を表示するか指定する

```
$ cat test.log | cut -d "," -f 3
hogehoge
fugafuga
piyopiyo
foofoo
barbar
barbar
bazbaz
```

## sortコマンド
行をアルファベット順に並べ替えるコマンド

```
$ cat test.log | cut -d "," -f 3 | sort
barbar
barbar
bazbaz
foofoo
fugafuga
hogehoge
piyopiyo
```

## uniqコマンド
重複行を1つにまとめるコマンド

- オプション -c
重複行を1つにまとめつつ、重複数も表示する

```
$ cat test.log | cut -d "," -f 3 | sort | uniq -c
2 barbar
1 bazbaz
1 foofoo
1 fugafuga
1 hogehoge
1 piyopiyo
```

## wcコマンド
指定した内容の文字数や行数を数えるコマンド。※ word count の略。

オプション指定無しだと以下3つ全て出力される。

- オプション -l
行数を数える

- オプション -w
単語数を数える

- オプション -c
文字数

```
$ cat test.log | grep "bar" | wc
       2       2      26
```

```
cat test.log | grep "bar" | wc -w
       2
```
カラムの型_integer型とdecimal型について

# はじめに
オリジナルアプリを作成中に、カラムの型について学んだので、投稿する。

# integre型について
integer型は、金額や数値などを扱いたい時に使う。

# やりたかったこと
テーブルに、小数点が含まれた数値を保存したかった。
なので、integre型を使うのかと思い、カラムの型をinteger型で指定した。

```
t.decimal    :energy,          integer # エネルギー（kcal）
t.decimal    :protein,         integer # タンパク質（g）
t.decimal    :lipid,           integer # 脂質（g）
t.decimal    :carbohydrate,    integer # 炭水化物（g）
t.decimal    :salt_equivalent, integer# 食塩相当量（g）       
```

しかし、テーブルにデータは保存できたものの、小数点以下の数値は保存されていなかった。
例：
152.3としたかったのに、実際は152のような形式になってしまう。

# 改善したこと
integer型からdecimal型に変更した。

```
t.decimal    :energy,          precision: 4, scale: 1 # エネルギー（kcal）
t.decimal    :protein,         precision: 4, scale: 1 # タンパク質（g）
t.decimal    :lipid,           precision: 4, scale: 1 # 脂質（g）
t.decimal    :carbohydrate,    precision: 4, scale: 1 # 炭水化物（g）
t.decimal    :salt_equivalent, precision: 4, scale: 1 # 食塩相当量（g） 
```

decimal型を使うことで、小数点が含まれた数値を扱うことができる。
precisionは、小数点を含めた全ての桁数のを指定する。
scaleは、小数点の桁数を指定する。

実は、integer型は整数しか扱えない性質のようだ。  

# 最後に
テーブルで小数点を扱いたい場合は、decimal型を指定して、raild db:migrateを行う。
WSLでROS2(Foxy)

# WSLでROS2(Foxy)

WSLでROS2(Foxy)をインストールしてGazebo連携する方法のまとめ。

## 関連記事

- [WSLでGazebo](https://qiita.com/akira-sasaki/items/8629457f33ab7c8942c3)
- [WSLでNav2](https://qiita.com/akira-sasaki/items/888ebcf2b3dfccd112a1)

## ROS2レポジトリを追加

ROS2レポジトリを追加し、 GPG キーを承認するために下記コマンドを実行します。

```
sudo apt update && sudo apt install curl gnupg2 lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key  -o /usr/share/keyrings/ros-archive-keyring.gpg
```

ROS2リポジトリをソースリストに追加します。

```
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
```

## ROS2パッケージのUpdate

aptをupdate。

```
sudo apt update
```

ROS2をインストール

```
sudo apt install ros-foxy-desktop
```

## 環境関数の設定

Sourceで環境関数の設定を読み込む

```
source /opt/ros/foxy/setup.bash
```

## argcomplete のインストール

```
sudo apt install -y python3-argcomplete
```

##　Sampleの実行

Talker

```
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp talker
```

Listener

```
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_py listener
```

## Gazebo連携

```
sudo apt install ros-foxy-gazebo-ros-pkgs
```

```
gazebo /opt/ros/foxy/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world
```

![gezebo-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/78cd41d7-09de-2ef0-1640-d18cd19eba69.png)


デモの車体を移動させる

```
ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{linear:{x: 1.0}}' -1
```

## RVIz2

```
rviz2
```
![rviz22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63450/73e8804a-856b-50f9-701e-e4b8e0c670e5.png)
Dockerでlaravel環境を構築した際にMysqlに接続拒否された話

Dockerは起動済み
appコンテナ内でマイグレーションを行おうとすると下記のエラーが出る。

```
Illuminate\Database\QueryExceptionSQLSTATE[HY000] [1045] 
Access denied for user 'test'@'172.19.0.2' (using password: YES) 
(SQL: select count(*) as aggregate from `articles`)
```

###結論

```
docker-compose down --volumes
docker-compose build
docker-compose up -d
```
このコマンドで

```
Access denied for user 'test'@'172.19.0.2' (using password: YES) 
```
部分のエラーは解決

後半のエラー部分は

```&#x20;.env　(laravelの)
DB_PORT=3306
```

```docker-compose.yml
    ports:
      - '4306:3306'
```
上記のようにすることで解決。
元々は.envファイルの中のDB_PORTが4306になっていたので3306に修正。
docker-compose.ymlをいじったらコンテナの起動をし直すことを忘れずに。

###考えられる原因
#####前半部分

```
docker-compose down --volumes
```
このコマンドはコンテナ・イメージ・ボリューム・ネットワーク・未定義コンテナを全てを一括消去するコマンドなので何か履歴が残っていたことが原因？

#####後半部分
DBに接続する際のport番号の認識が誤っていたことが原因。
.envのport番号とdocker-compose.ymlの右側のport番号がコンテナのport番号に対応(同じにする)
docker-compose.ymlの左側のport番号はホストのport番号(Mk-2やSequel Proに接続する際に入力するport番号はこっち)
sqlninjaについてのメモ書き（記入中）

## 拝啓
sqoninjaについて、あまり記事がなさそうなので、少しずつ記載していく

## sqlninjaとは
MSSQLのDBに対して、SQLインジェクションをするためのツールの一つ

### やる意味
sqlmapの方が広範囲にカバーしている。
２重チェック的な意味での実施以外、意味がわからなかった（個人的解釈）


### 解釈メモ
・パラメータを指摘する必要がある。
・コマンドラインで実行した場合、レスポンスがなさそう。
　→ローカルサーバを立ててパケットキャプチャすると通ってるみたいなことになりそう