OmniAICreator/Qiita-1.07M huggingface dataset:
レンタルサーバを比較してみた

レンタルサーバと言えば、超老舗の「さくらインターネット」や、国内シェアナンバーワンの「XSERVER」などが有名だが、「カラフルボックス」という1年11カ月前にサービスを開始したばかりの最新技術を取り入れた高速サーバがあると噂を聞いて、ちょっと試してみた。（お試し期間30日と長め）

# カラフルボックスとは？
カラフルボックス（ColorfulBox）とは2018年1月23日に大阪で出来たレンタルサーバの会社である。
**出来てから1年と11カ月！**
1996年　さくらインターネットが創業。ホスティングサーバ事業を開始
1999年　さくらインターネット株式会社が設立される
2004年　エックスサーバが設立される
2018年　カラフルボックスが設立される

歴史が浅いためか、情報収集しても「カラフルボックス」を使っているWEBサイトやブロガーは少なさそうです。

さらに「カラフルボックス wiki」で検索すると・・・
> 『カラフルBOX』（カラフルボックス）は2003年12月5日にSoundTailが発売した18禁恋愛アドベンチャーゲーム。

全然違う・・・

> 『COLORFUL BOX』（カラフル ボックス）は、1983年11月21日に発表された早見優の5枚目のアルバムである

これも全く違う・・・

WikiPediaに誰も書いてないくらいマイナーなサーバって事なのか？！

さらに別ワードで検索すると
> お弁当グッズの「カラフルボックス」

確かに、「カラフルボックス」ってネーミングからは、レンタルサーバを想像しにくい:sweat_smile:

# 国内のシェア
エックスサーバは国内シェアがナンバーワン！
レンタルサーバでは下記の3つがビッグスリーです。
この3社が4位以降を大きく引き離している！

> １位	エックスサーバー	14.18%
> ２位	ロリポップ	13.71%
> ３位	さくらインターネット	12.79%
参考・引用
https://server-hikaku-guide.com/rental-server-share/

カラフルボックスはもちろん圏外。


さて、性能比較です・・・

# 比較したサーバ

**さくらインターネット　スタンダード**
　初期費用	・・・0円
　月額料金（1年契約）・・・	524円
　月額料金（3年契約）・・・　524円
　無料お試し期間・・・2週間
　サーバソフト　nginx
　使用ディスク　HDD (DBサーバはSSD）

**エックスサーバー スタンダード[x10]**
　初期費用	・・・3000円
　月額料金（1年契約）・・・	1000円
　月額料金（3年契約）・・・900円
　無料お試し期間・・・10日間
　サーバソフト　nginx
　使用ディスク　完全SSD

**カラフルボックス（BOX2）**
　初期費用	・・・0円（3ヶ月契約以上）
　月額料金（1年契約）・・・	980円
　月額料金（3年契約）・・・	880円
　無料お試し期間	・・・　30日間
　サーバソフト　LiteSpeed
　使用ディスク　完全SSD

費用で言うと、さくらインターネットが一番安い。
次いでカラフルボックス。
カラフルボックスは、数あるレンタルサーバの中でも安い方です。

## Wordpressにて、全く同じサイトを構築し、Google Speed Insightにてスコアを比較してみた。
**さくらインターネット** 
SP 92　PC 99

**エックスサーバー** 
SP 98　PC 99

**カラフルボックス** 
SP 99　PC 100

シンプルなページ(テーマCocoonで作成した簡易サイト)ではあるものの、カラフルボックスでは、PCでなんと100点！ワードプレスで作成したページで初めて見たかも！
エックスサーバでも十分速いのですが、それを上回るとは・・・。
![速い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384857/546ac4c9-b429-381f-c5ff-7bcc23571ccf.png)

(もうちょっと画像とか増やして測定した方がよかったかなぁ・・・)




#FTPアップロードスピード　1000ファイル(合計100MB程度)
さくらインターネット、エックスサーバー、カラフルボックスに1000ファイルを同時にアップロードしてみたところ7分で、ほぼ同時に完了した。

アップロードには大きな差は出ないようだ。


# FTPダウンロードスピード　1000ファイル(合計100MB程度)

ストップウォッチで、よーいドンで合計100MB程度の1000ファイルを一斉にダウンロード開始
イメージは以下のような感じ
![全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384857/34641778-bf71-7df8-0e66-40a3a91596f0.png)
ところが、カラフルボックスが優先的にダウンロードされていまい、他がダウンロードのスピードを落としている？！

やり方を変えた。
1．さくらインターネットにて1000ファイルをFTPダウンロード。時間を測定
　↓
2．さくらが終わったら、エックスサーバにて1000ファイルをFTPダウンロード。時間を測定
　↓
3．エックスサーバが終わったら、カラフルボックスにて1000ファイルをFTPダウンロード。時間を測定

**さくらインターネット**
40分（ほぼ滞りなく安定してダウンロードされた）

**エックスサーバ**
45分（1ファイルあたりのダウンロードスピードは非常に速いのだけど、たまに急に詰まって遅くなったり？）

**カラフルボックス**
16分（初動は15秒くらい待たされたりして遅かったものの、いったん開始してからスピードが速かった。）

環境にも左右されそうですが、自宅のマシンだとこの結果になりました。

# PHPの速度測定
今後、気が向いたらやってみます。やる予定でしたが間に合わずすみません。
[AWS] VPCでネットワーク構築２

[[AWS] VPCでネットワーク構築１](https://qiita.com/hosochin/items/5124c017d80b506a63ce)
の続きです

ここでは作成したパブリックサブネットにWEBサーバ用のEC2インスタンスを作成していきます

### 1.インスタンスの作成
- サービス ＞ EC2 ＞ インスタンス ＞ インスタンスの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/d9b4bccd-03f0-68bf-9c76-7e86a6b6aafc.png)

・ネットワークはVPC領域を選択
・サブネットはパブリックサブネットを選択
・プライマリIPは10.0.1.10を割り当てときます
・次のステップをクリック

### 2.ストレージの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/b2705cef-283c-f0be-12dc-10d0d1e88226.png)
・今回はデフォルトのままで次のステップをクリック

### 3.タグの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/70846c6a-b116-d705-9fb7-a09d196559d0.png)
・タグの追加をクリック、Webサーバとして使うのでkeyにName、valueにWebサーバーと入力
・次のステップをクリック

### 4.セキュリティグループの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/7932a71b-e2d3-8bc9-2b37-980066ba680c.png)

・セキュリティグループにWEB-SGと入力
・確認と作成をクリックし、インスタンス作成の確認画面に移動するので起動をクリック

### 5.キーペアの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/8180b187-186c-daf9-105b-1d99c504f6d5.png)
・新しいキーペアの作成を選択
・キーペア名をmy-keyとしておきます
・キーペアのダウンロードをクリックして作成したキーペアをダウンロード
・インスタンスの作成をクリック


### 6.Elastic IPを割り当てて、ssh接続してみる
・[こちらを参考にしてください](https://qiita.com/hosochin/items/23b1b6ca671f540f51ae)

### 7.DNSサーバーを構成する
- VPC ＞ アクション ＞ DNSホスト名の編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/d2910e85-ddfe-1775-0db7-e9034da5556a.png)

・サービス ＞ EC2 ＞ インスタンスに戻ってインスタンスの説明タグを確認してみると、パブリックDNSとプライベートDNSが設定されているのが確認できます
　
これでWEBサーバの準備は完了です
次に[プライベートサブネットを作ってDBサーバを配置](https://qiita.com/hosochin/items/2053b4313bd638593399)していきたいと思います
マジカル交換200回やってみた【ポケモン剣盾】

<img width="1414" alt="スクリーンショット 2019-12-10 11.51.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221972/e44d9007-df6b-a356-ca55-9abf44f00c5a.png">


はい、どうも。ポケモン剣盾にハマりすぎて研究が進みません。
Dasonと申します。よろしくお願いします。

さて、私が卒業した現象数理学科には、学生発の学年間交流LTの「#MS_NCLT」というものがあります(というか、僕らが作った)。そこで私が今年発表した内容なのですが、その裏にPythonの基礎集計を学ぶ良い題材があったので、Qiitaにまとめていこうかな、と思います。

### 技術的な話は...
- pandasで簡単な集計
- matplotlibで横軸ラベルが斜めな棒グラフを描く
- matplotlibで日本語を利用する

になります。簡単なのしか使わないです。
#ポケモン剣盾「マジカル交換」
ポケモンをやったことのある方ならお馴染みですね、マジカル交換。
(最近まで「ミラクル交換」だと思ってました。アローラ！)

世界中の誰かとランダムに接続して、その人と1回だけポケモン交換をするという機能です。

相手から何が来るか分からないのが良さでもあり、怖さでもあります。

### 200回やってみた
マジカル交換に流れて来るポケモンは
よっぽど不要なポケモン or 孵化厳選の余りポケモン
になります。

実験日は11月30日。発売から2週間しか経っておらず
いわゆる「ガチ勢」が孵化厳選をしまくっている時期で、良い個体が多く流れて来る期間でもあります。

つまり、
**この時期にマジカル交換に流れてくるポケモンを見れば
今作の強いor人気なポケモンが分かるのではないか？**
と思ったわけです。

そこで、200回。
交換しては、手元に来たポケモンをメモっていく。
〆切3日前の論文要旨執筆と〆切5日前のレポート執筆をしながら
およそ８時間。頑張りました。

さぁ、集計するぞ！！！

# Pythonの登場
200回交換を記録したファイルを`NCLT_pokemon.csv`と名付けました。ここには、上から順に手元に来たポケモンが羅列されています。

これをpythonで読み込んで、集計していきます。
まずは使うパッケージを宣言。

```python
import numpy as np
import pandas as pd
import collections
import matplotlib.pyplot as plt
%matplotlib inline
```

そしたら、csvを読み込む。

```python
df = pd.read_csv('NCLT_pokemon.csv')
```
データの中身を見てみましょう。

```python
#データフレームdfからランダムに３つ抽出する。
df.sample(3)
```

| |ポケモンたち |
|:--|:--|
| 21 | ロゼリア |
| 10 | ベロバー |
| 89 | ワンリキー |
こんな感じ。

では、各ポケモンが何回手元に来たか、集計します。collectionsの中のCounterを使えば、一瞬で数えてくれます。

```python
c = collections.Counter(np.array(df['ポケモンたち']))
```
この`c`には、集計結果がもう入っています。
ただ、このままでは非常に見辛いので、pandasで整形してあげましょう。

```python
#Counterが辞書になっているので、それをDataFrameに変換する。
num_poke = pd.DataFrame.from_dict(c, orient='index')
#ついでに列名を指定する
num_poke.columns = ['出現回数']
#出現回数順にソートする。
num_poke_sort = num_poke.sort_values('出現回数', ascending=False)
```
これで整形完了です。
Top5をみてみましょう！

```python
num_poke_sort.head(5)
```

|| 出現回数 |
|:--|:--|
| ドラメシア | 12 |
| コイキング | 9 |
| ミミッキュ | 6 |
| ヒバニー | 6 |
| ガラルポニータ | 5 |

というわけで、200回の結果
**ドラメシア**が12回で１位でした！
新600族で強いですもんね〜

最後にプロットしてみましょう。
ポケモンの名前を日本語にしているので、matplotlibを日本語対応させるライブラリ `japanize-matplotlib` を使います。インストールは

```console
pip install japanize-matplotlib
```

からできます。
では、描画しましょう。

```python
import matplotlib.pyplot as plt
import japanize_matplotlib

#図の画面サイズを指定
plt.figure(figsize=(30,5))
#棒グラフを描画
plt.bar(np.array(num_poke_sort.index), num_poke_sort['出現回数'])
#横軸のラベルを70度回転して見やすく
plt.xticks(rotation=70)
```

できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221972/3bdb2482-6a34-0292-55b0-4054548b2e3b.png)


#まとめ
今回はただ単純にポケモンネタでした。
**ドラメシア** １強ですね！！
【作業効率アップ！】キーリピートの速さをあげる

Backspaceで文字を一列削除する時など、なんだか遅くて不満を感じていたのですが、環境設定の変更で解消することができたので、今回ご紹介させていただきます！

## 設定方法

【システム環境設定】 -> 【キーボード】

<img width="666" alt="スクリーンショット 2019-12-15 23.23.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456901/18341a7c-7837-eba6-8d42-5dd42a73ff08.png">

<font color=#ff0000>赤下線部</font>の値を `早い` に近づけるとキーのリピート速度を早くすることができます。

これだけのお手軽設定なので、是非やってみてください！

***これでもまだ遅い！と感じる方は、シェルからキーリピートの上限を外せるようなので、そちらも試してみてください***
Hyper-V Server 2019をコマンドプロンプトだけでインストールする

# 概要
デバイスドライバーがどうのこうので、正攻法ではインストールできなかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/ae62184c-a92d-0dfd-8b94-9ea546ac8855.png)
このデバイスのドライバ、HM65用の何かのinfを当ててもだめだったので正攻法はあきらめた。

Windowsをコマンドプロンプトでインストールできないか？？と思い、ぐぐったらYoutube[^3]で解説されていたので、それをもとにアレンジした。

まったく同じ方法でWindowsもインストールできるので、試してみてください

# 特徴
- インストール先の要件チェックがなされない
- ストレージにインストールし、デバイスに紐づかない（はず）
- 比較的高速

# ざっくりとした流れ

1. isoをマウントします。
2. diskをフォーマットしてください
3. osイメージ展開してください
4. boot領域再構築してください
5. 完了

# 必要なもの
- 作業用パソコン　(Win 10 Pro)
- インストール先のストレージ
- usbメモリ、8gb以上 (私は evtran https://qiita.com/haniokasai/items/d617299f824791c489ab を利用）

# てきとうなWindowsマシン上で
## ディスクフォーマット

こんな感じでフォーマットしてください。
2領域いります。（起動領域とos)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/a425f479-8fec-d7ea-4b16-6bced3777a59.png)

B: をboot F: をosとしました


## イメージの展開
iso は Hyper-V Server 2019のisoです。各自でダウンロードしてください。
E:\がmountしたiso、F:がインストール先

```
dism /Apply-Image /ImageFile:E:\Sources\install.wim /index:1 /ApplyDir:F:\
```

```
E:\sources>dism /Apply-Image /ImageFile:E:\Sources\install.wim /index:1 /ApplyDir:F:\

展開イメージのサービスと管理ツール
バージョン: 10.0.17763.1

イメージを適用しています
[==========================100.0%==========================]
操作は正常に完了しました。

E:\sources>
```

## boot領域の展開
```bash:cmd.exe
bcdboot F:\Windows /l ja-JP /s B:
```

# インストールディスクを使って
上のboot領域展開だけではうまくいかなかったので、usbにisoを
## boot の修復

```
bootrec /scanos
bootrec /rebuildbcd
bcdboot F:\Windows /l ja-JP /s B:
bootrec /scanos
```
scanosでosが見つからなければ完了です。

cmd.exeを閉じて、別のosからの起動（？）を選んでインストールしたはずのosを選んでください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/46a1df57-8401-2fd6-380c-2128506373d1.png)

それで起動すれば完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/7ce2bd7f-5426-44d2-a2be-8f55d2b651dc.png)


# 設定
こっから先はぐぐればわかる。
- パスワードはエンターではなく、下矢印で確認欄に移動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245977/b09661ce-1084-e648-c05e-54e2e5f9b71e.png)

- パスワードの有効期間は延長しておくこと

- Server Managerからのリモートアクセスは ホスト名\Administrator[^2]

# その他
explorerやieも追加しておこう[^1]

```powershell:powershell
PS C:\> Add-WindowsCapability -Online -Name ServerCore.AppCompatibility~~~~0.0.1.0
PS C:\> Add-WindowsCapability -Online -Name Browser.InternetExplorer~~~~0.0.11.0
PS C:\>  Restart-Computer
```

# Ref
- https://soma-engineering.com/desktop/windows10/apply-image-pc/2018/12/24/
- https://www.tenforums.com/tutorials/84331-apply-windows-image-using-dism-instead-clean-install.html
- https://davidzych.com/install-windows-10-from-a-usb-flash-drive/

- https://qiita.com/u-sho/items/39833d5a1e07a59410c0


# 注釈
[^1]: https://yamanxworld.blogspot.com/2019/06/microsoft-hyper-v-server-2019_17.html
[^2]: http://www.ne.jp/asahi/it/life/it/hyper-v/rsat_hyper-v.html
[^3]: https://www.youtube.com/watch?v=a1zJblWqEFE
mysql外部接続

mysql 外部接続

https://qiita.com/m-shin/items/770c1c54a889bf060751

select user, host, password from mysql.user;


GRANT ALL PRIVILEGES ON *.* TO aaa@"192.168.50.%" IDENTIFIED BY 'aaa' WITH GRANT OPTION;

MariaDB [(none)]> select user, host, password from mysql.user;
+-------------+--------------+-------------------------------------------+
| user        | host         | password                                  |
+-------------+--------------+-------------------------------------------+
| root        | localhost    |                                           |
| root        | cent74       |                                           |
| root        | 127.0.0.1    |                                           |
| root        | ::1          |                                           |
|             | localhost    |                                           |
|             | cent74       |                                           |
| aaa         | localhost    | *A02AA727CF2E8C5E6F07A382910C4028D65A053A |
| bbbbbbbbbbb | localhost    | *C92Dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| aaa         | 192.168.%    | *A02AA727CF2E8C5E6F07A382910C4028D65A053A |
| aaa         | 192.168.50.% | *A02AA727CF2E8C5E6F07A382910C4028D65A053A |
+-------------+--------------+-------------------------------------------+

# 削除
DROP USER aaa@192.168.50.%;



ポート
MariaDB [(none)]> SHOW VARIABLES LIKE 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.001 sec)


# 接続確認
mysql -h 192.168.3.58 -u aaa --password=aaa
providerをinitState内で使用した際に出力される例外への対応について

## 結論
didChangeDependenciesを使用するか、initState内でProvider.ofに`listen: false`を渡す。

### initState内でProvider.ofに`listen: false`を渡すパターン
```dart
  @override
  void initState() {
    super.initState();
    Provider.of<CounterBloc>(context, listen: false).increment();
  }
  ```

### didChangeDependenciesのパターン
```dart
  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    Provider.of<CounterBloc>(context)..increment();
  }
```

## 参考
[Provider FAQ](https://pub.dev/packages/provider#faq)
jetson nano セットアップ

Jetson nano 購入から物体認識（リンゴとミカン）までの手順By カワシマ AI, Jetson, Linux, Python, 機械

sudo apt-get install git cmake
gitとコンパイルに必要なcmakeをとってきます。


git clone https://github.com/dusty-nv/jetson-inference
cd jetson-inference
git submodule update --init

レポジトリをcloneをします。場所はホームディレクトリで問題ないでしょう。

それから、cloneしたディレクトリに入って、依存するモジュールも全部とってきます。

次は

mkdir build
cd build
cmake ../

buildというビルド用のフォルダを作って、buildディレクトリに入って、cmakeでコンパイルの準備をします。


Jetson nanoサンプルコードのコンパイル
次は

cd jetson-inference/build
make
sudo make install

cd jetson-inference/build
make
sudo make install
jetson-inference/buildのディレクトリにいることを確認して、makeでコンパイルします。その後、make installでインストールを完成させます。


cd jetson-inference/build
make
sudo make instal

## 実行

etson nanoサンプルコードを動かそう！
次は

cd jetson-inference/build/aarch64/bin
上のディレクトリに移動します。

ここにいくつかのプログラムがすでに（コンパイルとインストールで）用意されています。

まず1回目下記のコマンドを実行しましょう（Terminalで）

./imagenet-console orange_0.jpg output_0.jpg

orange_0.jpgという写真をインプットとして、認識した結果をoutput_0.jpgに書き込みます。
[AWS] VPCでネットワーク構築１

AWSでVPCネットワークを構築するメモ
今回はVPC領域をパブリックとプライベートのサブネットに分割して、それぞれにWEBサーバとDBサーバを構築してみました
参考：[Amazon Web Services 基礎からのネットワーク＆サーバー構築](https://www.amazon.co.jp/dp/B06Y5ZSYY4/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

ちなみにVPCとは
> Virtual Private Cloud (VPC) は、AWS アカウント専用の仮想ネットワークです。VPC は、AWS クラウドの他の仮想ネットワークから論理的に切り離されており、AWS のリソース（例えば Amazon EC2 インスタンス）を VPC 内に起動できます。

### 完成イメージ
![Untitled Diagram.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/6ebe6fff-ec32-a3c7-2b64-e942f4fe6f00.jpeg)


### 1.VPCを作る
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ VPC ＞ VPCの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/54bb73ff-8239-41b4-be70-4f0957a23d3b.png)

・リージョンを東京にしときます
・今回はIPv4で作成
・10.0.0.0 ～ 10.0.255.255までのipアドレスを割り振れるようにしておきました

### 2.パブリックサブネットを作る
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ サブネット > サブネットの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/fb1b0cd9-b76d-2802-154c-081c2871cfcb.png)

・VPCには1で作った領域を設定

### 3.インターネットゲートウェイを作る
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ インターネットゲートウェイ ＞ インターネットゲートウェイの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/e9f1a7fb-7c75-b1bc-7730-f002298620bb.png)

・インターネットに接続するためにインターネットゲートウェイを作成
・今回は名前タグを空のまま

### 4.インターネットゲートウェイとVPCを紐づける
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ インターネットゲートウェイ ＞ アクション ＞ VPCにアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/c46fb68d-cee8-a88f-6569-e5b62590fce1.png)

・1で作ったVPCを選択

### 5.ルートテーブルを作る
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ ルートテーブル ＞ ルートテーブルの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/711d036f-d19e-1662-ab06-1f13b4587269.png)

・ネットワークにデータを流すために「ルーティング情報」の設定が必要
・宛先IPアドレスの値を見て、どのネットワークに流すべきかという設定がルートテーブル
・1で作ったVPCを選択

### 6.ルートテーブルをサブネットに割り当てる
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ ルートテーブル ＞ サブネットの関連付けの編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/bfec109b-cd64-80b4-82af-46744e931064.png)

・2で作ったサブネットを5で作ったルートテーブルに関連付ける

### 7.デフォルトゲートウェイにインターネットゲートウェイを設定する
- サービス ＞ ネットワーキングとコンテンツ配信 ＞ ルートテーブル ＞ ルートの編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384069/4cbe70b0-0596-1d44-e1a1-ca111b31025e.png)

・デフォルトゲートウェイ(0.0.0.0/0)を3で作成したゲートウェイに設定する


　
　
これでVPC領域とパブリックサブネットの設定は終わりです
[次はパブリックサブネットにWEBサーバ用のEC2インスタンスを作成していきたいと思います](https://qiita.com/hosochin/items/b312c13b4734339c5158)
jQuery + Select2 : ドロップダウンリストの幅を調整する

[Select2](https://select2.org/)はjQueryのプラグインで、<select>要素のドロップダウンリストにさまざまな表現や機能が加えられます(「[jQuery: プラグインSelect2で<select>要素のドロップダウンリストを操作する](http://www.fumiononaka.com/Business/html5/FN1803002.html)」参照)。ただ、デフォルトでは、やたらと幅の狭いドロップダウンリストになってしまうようです(図001)。CSSなどで、あらかじめ幅を定めておくのがよいでしょう。

#### 図001■やたらと幅の狭いドロップダウンリスト
![qiita_1912001_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128949/a9024c28-e3ae-d349-7fd8-48a657755288.png)


# ドロップダウンの幅をリスト項目に合わせる
とはいえ、せっかくJavaScriptコードで扱うのですから、リスト項目に合わせて幅を動的に調整してほしい場合もあります。そのときには、[`select2()`](https://select2.org/getting-started/basic-usage)メソッドにつぎのようなふたつのオプションを渡してください。

```js
$('#select2').select2({
	dropdownAutoWidth: true,
	width: 'auto'
})
```

これでドロップダウンは、リスト項目の長さに合わせた幅になります(図002)。以下のサンプル001をCodePenに公開しました。なお、コードの中身については、「[jQuery: プラグインSelect2で要素のドロップダウンリストを操作する](http://www.fumiononaka.com/Business/html5/FN1803002.html)」をお読みください。

#### 図002■リスト項目の幅に合ったドロップダウン
![qiita_1912001_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128949/e7c1d9d2-e180-3631-125b-670d9beec859.png)

#### サンプル001■ jQuery + Select2 : Drop-down list with width adjusted
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="FumioNonaka" data-slug-hash="WNbxLwy" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="jQuery + Select2 : Drop-down list with width adjusted">
  <span>See the Pen <a href="https://codepen.io/FumioNonaka/pen/WNbxLwy">
  jQuery + Select2 : Drop-down list with width adjusted</a> by Fumio Nonaka (<a href="https://codepen.io/FumioNonaka">@FumioNonaka</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


# 選択された項目に幅を合わせる ー `width`
[`width`](https://select2.org/appearance#container-width)オプションを`auto`に定めると、ドロップダウンリストが選択された項目の幅になります(図003)。

```js
$('#select2').select2({
	// dropdownAutoWidth: true,
	width: 'auto'
})
```

#### 図003■ドロップダウンリストが選択された項目の幅に合う
![qiita_1912001_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128949/400a2091-86b0-2181-6921-a3f453c03b58.png)

これだけでよさそうに思えたかもしれません。けれど、選択されていない項目に長いテキストがあったら、ドロップダウンに収まらず見切れてしまいます。このオプションは、あくまで選択された項目をしっかり見せるというだけです。


# ドロップダウンのリスト幅を合わせる ー `dropdownAutoWidth`
選択された項目はさておき、ドロップダウンのリスト幅を調整するのがオプション`dropdownAutoWidth`です。値を`true`に定めれば、すべての項目が収まるようにリスト幅が決まります(図004)。

```js
$('#select2').select2({
	dropdownAutoWidth: true,
	// width: 'auto'
})
```

#### 図004■ドロップダウンのリスト幅を項目に合わせる
![qiita_1912001_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128949/bbe08dc9-1234-d49f-1c3b-2e44e47f1ad8.png)

ということですので、ドロップダウンの幅を項目に合わせて動的に決めるには、ふたつのオプションが必要なのです。


# CSSで幅が正しく設定できない
Select2サイトによると、CSSで幅が正しく設定できないことがあるようです。その場合には、[インラインで`style`属性により幅を定める](https://select2.org/appearance#example)ことが勧められています。そのとき`width`オプションに与える値は[`resolve`](https://select2.org/appearance#container-width)です。

```js
$('#select2').select2({
	width: 'resolve'
})
```

```html
<select id="demo" style="min-width: 300px"></select>
```
Python学習ノート_004

第２章のサンプルを下記のように改修しました。

- 確認するポイント
 - 文字列にダブルクォーテーション「"」とシングルクォーテーション「'」の区別
     - どちらも使えますが、ペアに使うことは前提です。  
      :x: print( **'** this is a test **"**)  或いは :x: print( **"** this is a test **'**)  
      :o: print( **'** this is a test **'**)  或いは :o: print( **"** this is a test **"**)  
     - 文字列なかにダブルクォーテーション「"」あるいは　シングルクォーテーション「'」が存在する時下記の２種類の対応で実現可能です。  
      :o: print( **"** this is Tom's pen **"**)  
      :o: print( **'** this is Tom\'s pen **'**)  
      :o: print( **'** I said "Hello!" **'**)  
      :o: print( **"** I said \"Hello!\"  **"**)  
 - input関数の出力結果は必ず文字タイプで戻る
 - 演算符号の優先順位
 アメリカでは PEMDAS (Parentheses:括弧, Exponents:累乗,   
Multiplication:掛け算, Division:割り算, Addition:足し算, Subtraction:引き算) という頭字語を使う。
 - print関数に出力したい文字列を複数入れると、間に半角スペースが入ります。

```python:sample02.py
#犬の名前を尋ねる
dog_name = input('犬の名前はなんですか。')

#犬の年齢を尋ねる
dog_age = input('犬の年齢は何歳ですか。')

#犬の年齢に７をかけて人間換算年齢を求める
human_age = int(dog_age) * 7

#inputの戻り値のタイプは文字列(str)
print('そのまま年齢×７の結果：',dog_age * 7)

#print関数に出力したい文字列を複数入れると、間に半角スペースが入ります
print('あなたの犬',
      dog_name,
      'の人間換算年齢は',
      human_age,
      '歳です')
```
- 実行結果  
![sample02.py実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551056/093c5241-4db5-f077-b06f-99aef7677992.png)
mruby 上で動作する GEOM Gate ローカルプロバイダ

FreeBSD アドベントカレンダー初参加です。

FreeBSD には GEOM という仕組みがありますが、みなさんは ggatel って使っていますか？
僕は最初、mdconfig があるからいらないでしょ？
って思ってました。

でも詳しく調べてみると、ユーザ空間でいろいろと出来そうだと認識を改めました。

この文書で取り上げるのは、mruby 上で動作する Ruby スクリプトによって構築された、GEOM Gate ローカルプロバイダのお話となります。

~~僕が五年前に作ったまま放置している [CRuby 向け gem](https://rubygems.org/gems/suzuna) の二番煎じのようなものです。~~
~~匿名巨大掲示板の某スレにあった最近の書き込みをネタにしました。~~

なおこの mruby で GEOM Gate ローカルプロバイダを提供するソフトウェアは、<https://github.com/dearblue/mruby-bin-suzuna> として公開しています。


# ビルド

## ビルド環境を整える

まず最初に、mruby をビルドする環境づくりからです。

- mruby のビルドに最低限必要なパッケージ:  
  ruby git bison
- mruby-bin-suzuna のサンプルをビルドするために必要なパッケージ:  
  sqlite3 oniguruma

`pkg` でさくっとインストール。

```terminal
% sudo pkg install ruby git bison sqlite3 oniguruma
```

## mruby と mruby-bin-suzuna のソースコードの取得と展開

最初にソースコードの展開やバイナリ実行が可能なディレクトリへ移動して下さい。

そうしたらソースコードの取得と展開を行います。

```terminal
% mkdir -p ~/sandbox
% cd ~/sandbox
% fetch -o- https://github.com/mruby/mruby/archive/2.1.0.tar.gz | tar xf -
% fetch -o- https://github.com/dearblue/mruby-bin-suzuna/archive/master.tar.gz | tar xf -
```

もし mruby の最新版が欲しいのであれば、"https://github.com/mruby/mruby/archive/master.tar.gz" に置き換えて下さい。

## suzuna のビルド

ビルドは mruby ディレクトリの中で行なうのが無難でしょう。

```terminal
% cd mruby-2.1.0
% ruby minirake -j8 MRUBY_CONFIG=../mruby-bin-suzuna-master/quick_config.rb
```

これで `bin/suzuna` (あるいは `build/suzuna/bin/suzuna`) ファイルが出来ます。
mruby でワンライナーを使ったり、Ruby スクリプトを単純に実行させたりしたいなれば `bin/mruby` (あるいは `build/suzuna/bin/mruby`) を試して下さい。


# mruby 上で動作する GEOM Gate ローカルプロバイダ

200 MiB のブロックデバイスとして動作させるサンプルスクリプトを [mruby-bin-suzuna/sample.rb](https://github.com/dearblue/mruby-bin-suzuna/blob/master/sample.rb) として用意してあります。
このファイルを `bin/suzuna` に渡すと、`/dev/ggateXX` が生えます。

スーパーユーザーで動作させる必要があります。

```terminal
% sudo ./bin/suzuna -u99 ../mruby-bin-suzuna-master/sample.rb
```

これで mruby 上で動作する GEOM Gate ローカルプロバイダは `/dev/ggate99` でアクセス出来ます。

```terminal
% sudo newfs /dev/ggate99
% sudo mkdir /media/ggtest
% sudo mount /dev/ggate99 /media/ggtest
```

終了したい場合、別の仮想端末から `ggatel destory` を行って下さい。

```terminal
% sudo umount /media ggtest
% sudo ggatel -u99
```

Ctrl+C でも終了できますが、ggate99 は残ったままになります。修正は今後の課題。

## バグ×バグ？=カーネルパニック

zpool create する場合、zpool の作成途中で suzuna がセグフォると zpool がフリーズします。
一度目の `ggatel -fu99` を行うと、zpool create はエラーを出力してプロンプトに戻ってきます。
再度 `suzuna -u99 ....` のあとに `zpool create` で同じプール名の作成途中で suzuna がセグフォった場合、`ggatel -fu99` するとカーネルパニックします。

## 簡単な GEOM Gate ローカルプロバイダスクリプト

[mruby-bin-suzuna/sample.rb](https://github.com/dearblue/mruby-bin-suzuna/blob/master/sample.rb) の再掲となりますが、冗長なコメントを抜くと短く…………う〜ん、まあ40行くらいなので、充分短いでしょう。
200 MiB の容量を持つ揮発性ボリュームはこんな感じで組むことが出来ます。

```ruby:sample.rb
mystorage = Object.new

mystorage.instance_eval do
  @buf = StringIO.new("\0" * (200 * 1024 * 1024))
end

class << mystorage
  def mediasize
    @buf.size
  end

  def flags
    Suzuna::FLAG_READWRITE
  end

  def sectorsize
    512
  end

  def info
    "Powered by #{MRUBY_DESCRIPTION}"
  end

  def readat(offset, size, buf)
    @buf.seek offset
    @buf.read(size, buf)
    nil
  end

  def writeat(offset, buf)
    @buf.seek offset
    @buf.write(buf)
    nil
  end

  def deleteat(offset, size)
    nil
  end
end

Suzuna.unit(mystorage)
```
docker imageファイルの保存先

https://stackoverflow.com/questions/24309526/how-to-change-the-docker-image-installation-directory

# 以下やろうと思ったけど symlinkだといろいろエラーになるのでやめた

do the trick:

/etc/docker/daemon.json 

{
    "graph": "/mnt",
    "storage-driver": "overlay2"
}
Despite the method you have to reload configuration and restart Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker
To confirm that Docker was reconfigured:

docker info|grep "loop file"
In recent version (17.03) different command is required:

docker info|grep "Docker Root Dir"
Docker Root Dir: /mnt/docker


#### ストレージドライバ
overlay2じゃないと buildでエラーになる？
https://qiita.com/NaotoHanaue/items/b9f395a63f7aae2a41b7

sudo docker info
(snip)
Storage Driver: overlay2
coreos qnapマウント



https://qiita.com/rikudai/items/f9900e4865ce25a8464e


mkdir /mnt/docker
/etc/fstabを編集して、起動時マウントの設定をします。

/etc/fstab
192.168.3.x:/share/nfs/063_core /mnt/docker nfs default 0 0

マウントする。
mount -v 192.168.3.x:/share/nfs/063_core /mnt/docker



coreosにはfstabがないのでsystemに登録

https://qiita.com/uraura/items/50b1f7b3b1201c8e5177

#############　注意 ##########################
デーモンの名前はWHEREの名前と一致しないとエラー
#############　注意 ##########################


sudo vi /etc/systemd/system/mnt-docker.mount

# 編集内容を標準出力（①）
cat /etc/systemd/system/mnt-docker.mount
①の出力結果

########################################

[Unit]
Description=GlusterFS Data Directory

[Mount]
What=192.168.3.x:/share/nfs/063_core
Where=/mnt/docker
Type=nfs
Options=nolock

[Install]                   
WantedBy = multi-user.target 

########################################

2. systemctlを利用して、mnt-docker.mountを開始する
cd /etc/systemd/system

# 定義ファイルを有効にする（①）
systemctl enable mnt-docker.mount

# ユニットを開始する（②）
systemctl start mnt-docker.mount

# ユニットの状態確認（③）
systemctl status mnt-docker.mount
JavaでExcelデータの取り込み

#はじめに
今回はApachePOIです。
Javaの処理の中にExcelで作られたデータ群を取り込む為に使いました。

##ApachePOIとは
正式名称ApachePOI
WordやExcelといったMicrosoft Office形式のファイルを読み書きできるJavaライブラリ
※Wiki参照
https://ja.wikipedia.org/wiki/Apache_POI

ここから以下のjarファイルをダウンロードしました。
https://poi.apache.org/download.html

poi-4.1.1.jar
poi-ooxml-4.1.1.jar
poi-ooxml-schemas-4.1.1.jar
commons-collections4-4.4.jar
commons-compress-1.19.jar
xmlbeans-3.1.0.jar

##作った処理
対象のExcelファイルの1シート目、A列をJavaに取り込む処理を作ってみました。

```SamplePOI.java
public class SamplePOI {
    
    /*
     * 本処理
     */
    public static void main(String[] args) {
        //ここに取り込みたいExcelファイルのフルパスを入れる
        String ExcelPath = "";
        
        //Excel用オブジェクト
        Workbook wb;
        Sheet sh;
        Row row;
        Cell cell;
        
        //取得データを保持するリスト
        List<String> columnA_List = new ArrayList<>();
        
        try (InputStream is = new FileInputStream(ExcelPath)) {
            
            //対象のExcelファイルをJavaに取り込み
            wb = WorkbookFactory.create(is);
            //対象ファイルの1枚目のシートを指定
            sh = wb.getSheetAt(0);
            //シート内の最大行を取得
            int rowMaxA = sh.getLastRowNum();
            
            //最大行分のループを回してA列のセルをString型として取得
            for (int i = 0; i <= rowMaxA; i++) {
                row = sh.getRow(i);
                cell = row.getCell(0);
                String cellValue = getCellStringValue(cell);
                columnA_List.add(cellValue);
            }
            
            //コンソールに出力
            System.out.print("[");
            for (String outStr : columnA_List) {
                System.out.print(outStr);
            }
            System.out.print("]");
            
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /*
     * セルの状態を判別してString型で返す。
     */
    private static String getCellStringValue(Cell cell) {
        String retStr;
        CellType cellType = cell.getCellType();
        switch (cellType) {
        case STRING:
            retStr = cell.getStringCellValue();
            break;
        case NUMERIC:
            retStr = String.valueOf(cell.getNumericCellValue());
            break;
        case BOOLEAN:
            retStr = String.valueOf(cell.getBooleanCellValue());
            break;
        case FORMULA:
            retStr = String.valueOf(cell.getCellFormula());
            break;
        case ERROR:
            retStr = String.valueOf(cell.getErrorCellValue());
            break;
        default:
            retStr = "";
            break;
        }
        return retStr;
    }
}
```

##実行してみる
次のひらがなを入れたExcelファイルを読み込ませて実行してみると、
「あかさたなはまやらわ」が出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494387/9aa6ea8a-f4ba-12d3-8894-9ba07e4cfbc9.png)

```samplePOI.result
[あかさたなはまやらわ]
```

#まとめ
簡単な処理しか行っていないが感覚的にはVBAと同じだなと感じました。
セルの中身を取得する際にはセルタイプを考慮しないといけないという所は少し理解に苦戦を強いられた。

Excelで関数を入れて取り込もうとすると、計算結果じゃなくて関数そのものが値として取得されるっぽい？
ので結果が欲しい場合は少し大変そう。
nosetestを実行してくれる簡単なvimプラグインを作ってみる

この記事はアラタナアドベントカレンダー2019の16日目の記事です。

![ad.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/83bc622c-f224-6e59-85ce-469b0bbf8c02.png)


vim歴半年の新米がvimプラグインを作ってみる記事になります。
変な書き方しちゃってる箇所もあるかと思いますが、ご指摘いただけると嬉しいです。


せっかくなので普段使えるものを作ってみたいということでテストを実行してくれるプラグインを題材にしたいと思います。
筆者はせっかちなのでテストコードを書いたあと下記のように関数ひとつを指定してテストを実行します。

```bash
nosetests test_hoge.py:Hogeclass.test_func
```
これを簡単に実行するプラグインを目指します。

# 関数名の取得
現在のカーソルより前の位置で最初に検索に引っかかった箇所の関数名を取得します。

```vimscript
function! Get_func_name()
  ?\vdef\stest_[a-z]*
  return split(split(getline('.'), " ")[1], "(")[0]
endfunction
```

`?\vdef\stest_[a-z]*`

+ ?：前方向に検索
+ \v：正規表現を使用
+ \s：空白

`def test_`で始まる関数名を取得しています。

# クラス名の取得
同様にクラス名も取得します。

```vimscript
function! Get_class_name()
  ?\vclass\s[a-zA-Z]*
  return split(split(getline('.'), " ")[1], "(")[0]
endfunction
```

# テストコマンド作成
```vimscript

function! Create_test_command()
  let func_name = Get_func_name()
  let class_name = Get_class_name()
  let test_command = "nosetests"." ".expand("%:p").":".class_name.".".func_name." -v"
  return test_command
endfunction

```
下記の形をむりやり作ってます。

> nosetests test_hoge.py:Hogeclass.test_func

# テスト実行
テストを実行する関数の記述とコマンドモードで実行できる記述になります。
ExecTest

```vimscript
function! Exec_test()
  let test_command = Create_test_command()
  echo system(test_command)
endfunction

command! ExecTest call Exec_test()
```
# 使ってみる
作成したvimscriptファイルを読み込みます

<img width="711" alt="スクリーンショット 2019-12-15 22.58.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/437e04e6-123c-bb3c-e24f-4e1bf06b501a.png">

ExecTestコマンドが使えるようになるので10行目にカーソルをあわせて使ってみます。

<img width="790" alt="スクリーンショット 2019-12-15 22.57.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/15af168a-0d7e-bfc3-9434-110d6af8ca16.png">

test_secondが実行されていますね。カーソルを7行目にあわせて使ってみます。

<img width="784" alt="スクリーンショット 2019-12-15 23.07.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415667/a1d0f3af-8c1a-8e66-5617-91c62a1033fb.png">

test_firstが実行されました。

# まとめ
カーソル下ブロックのテストコードを実行するプラグインを作ってみました。
検索でヒットした箇所に移動する性質を利用したコードになっているのですが、逆に不便なところもあります。
できれば移動せずに実行したいので改善していきたいです。
docker coreos

esxi
https://serverfault.com/questions/372443/curl-on-esxi-5-0
wget http://stable.release.core-os.net/amd64-usr/current/coreos_production_vmware_ova.ova

wget http://stable.release.core-os.net/amd64-usr/current/coreos_production_qemu.sh 

esxi

https://qiita.com/ka2asd/items/456b55b9958c0f2f206b


https://qiita.com/fabiiw05/items/b6dde0e1dbd620c3e7fa


# パスワードなし
https://coreos.com/os/docs/latest/booting-with-iso.html

wget http://stable.release.core-os.net/amd64-usr/current/coreos_production_iso_image.iso


# vi ~/cloud-config.yml
# 改行とハイフンとスペースが適切でないとだめっぽい

users: 
- name: coreuser
  passwd: $xxxxxxxxx/ # パスワード認証。openssl passwdコマンドを叩いて実行した結果を貼り付け
  groups: #所属するgroupの指定
  - sudo
  - docker
  ssh-authorized-keys:
  - ssh-rsa #coreuserに持たせる公開鍵


user: core
pass: password秘密


インストールが完了したらネットワーク設定をおこないましょう。
ネットワークの設定は/etc/systemd/network/static.networkファイルを作成します。

$ sudo vi /etc/systemd/network/static.network
記述内容(内容は自分の環境に合わせて変更してください)

[Match]
Name=enp0s3

[Network]
Address=192.168.0.105
Gateway=192.168.0.1
DNS=192.168.0.1


####
https://www.hitsumabushi.org/blog/2017/02/08/2231.html

自宅 vSphere 上の CoreOS (Container Linux) のデプロイメモ
DBとLaravelの接続設定【備忘録】

# はじめに
PHP/Laravelの勉強にて備忘録として

# 前提
MySQLがインストールされていること

# LaravelのDB接続設定ファイル
`config/database.php` を開く

```php:config/database.php
/*中略*/
    'default' => env('DB_CONNECTION', 'mysql'),
/*中略*/
``` 

となっている。

`env('DB_CONNECTION', 'mysql')`
上記のenvはDB_CONNECTIONが設定されていればDB_CONNECTION
設定されていなければMySQLを使用という意味である

#### ここでLaravelの環境変数を見てみる。
tinker(php artisan tinker)を起動し、 `print_r($_ENV)`を入力

```
$ php artisan tinker
$ print_r($_ENV)
    <中略>
    [APP_DEBUG] => true
    [APP_LOG_LEVEL] => debug
    [APP_URL] => http://localhost
    [DB_CONNECTION] => mysql
    [DB_HOST] => 127.0.0.1
    [DB_PORT] => 3306
    <中略>
```

DB_CONNECTIONはmysqlになっていることを確認。
ではLaravelの環境変数を決めているのは誰か。

プロジェクトトップにある.envファイルを開く

```:.env
<中略>
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
<中略>
```

これの `DB_CONNECTION=mysql` となっているところを使用したいDBに指定する。
今回はMySQLを使用するのでそのまま

```php:config/database.php
        /*中略*/
        'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
        /*中略*/
```

`config/database.php` で自分が使用するmysql(今回は)の詳細設定をする

重要なのはdatabase, username, passwordで、すべenvなので.envで編集する

```:.env
<中略>
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
<中略>
```

今のままではDB名、ユーザ名、パスワードが上記のままなので変える。

```:.env
<中略>
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD=
<中略>
```

上記のようにするとDB名がtest ユーザ名がrootでパスワード無しでログインする。

#####testデータベースを作成する

```
$ sudo service mysqld start
$ mysql -u root
mysql> CREATE DATABASE `test`;
```

##### データベースが接続されているか確認

```
$ php artisan tinker
>>> DB::connection();
=> Illuminate\Database\MySqlConnection {#2891} 
```

##### タイムゾーン設定
タイムゾーンの設定を「東京（Asia/Tokyo）」にする
レコード保存時に時間情報が設定したタイムゾーンの時間で保存される

```php:config/app.php
    'timezone' => 'Asia/Tokyo',
```

以上
EC2で、秒間数千回～レベルでElastiCacheやRDSに接続して、名前解決に失敗するときの対策

とある大規模WEBシステムをオンプレからAWSに移行したとき遭遇した題名の件のTIPSです。

データストア（RDSやElastiCahceなど）の接続に、エンドポイント（＝固定IPをもたない）を使う、EC2を利用した中～大規模のシステムでは、必須の対策かもです。

# システム構成

システム構成としては、よくあるパターンのものとなります。

WEBアプリケーションサーバは、Elastic Beanstalk や Lambdaなどがよいとおもいつつも、WEBアプリケーションの複雑性からEC2をオートスケールで用意しました。

一方で、データストアは、ElastiCacheとAurora Mysqlを利用しています。

EC2及びデータストアは、潤沢なインスタンスサイズを利用していました。

# 処理量

ざっくりですが、WEBアプリケーションに対するアクセス、そのときに発生するElastiCahce及びAurora Mysqlといったデータストアのエンドポイントへのアクセスが、秒間数千を超えるときがあるレベルです。

# 事前対策

マネージドサービスであるElastiCacheとAurora Mysqlはパラメータグループを微調整した程度でした。

EC2に関しては、主要ミドルウェアのPHPとApacheの一般的な制限系の項目（memory_limitとかmax_clientなど）の上限値変更と、大規模系のためのカーネルの設定（ipv4.tcp_syncookiesとかipv4.ip_local_port_rangeなど）を行っていました。

# 事象

今回、下記のようにデータストアに接続しようとしたが名前解決に失敗して接続できなかった旨のエラーが、処理量が多くなるとログに出力されていました。

```
PHP Warning:  Memcache::connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known

PHP Warning:  PDO::__construct(): php_network_getaddresses: getaddrinfo failed: Name or service not known

PHP Warning:  mysql_connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known
```

# 対策

AWSさんが2019年10月に対策を公開してくれたました。

参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/dns-resolution-failures-ec2-linux/

OSの種類などによって微妙に対策が異なりますが、私の場合は、AmazonLinuxだったので、AutomateDnsmasq.sh をダウンロードして、実行して、ほぼ対策は完了しました。

最初、それだけだと、Linuxのコンソールでローカルで動いているdnsmasqに名前解決にいっても、WEBアプリケーションは利用しないという罠にかかりましたが、これはPHPを再起動したら治りました。

キャッシュの時間は、基本的に、DNSレコードのTTLを利用するそうなので、キャッシュ時間をそれ以上伸ばしたい場合は、下記を利用ください。この設定はうまく動作しないときがあるという情報がありましたが、いじったらキャッシュ時間伸びていたので、この環境では動いているみたいでした。

```
max-cache-ttl
```

ただ、もちろん、マネージドサービス側はIPが変わる可能性があるるので、そのリスクは考慮して調整してください。

※基本的には「max-cache-ttl」はいじらない方がいいとおもいます。
ミドルウェア（ApacheとNginxの比較）

#はじめに
webアプリケーション作成の前にwebサーバーの構成を学んでいきたいと思います。
今回はその中でもミドルウェアにフォーカスし、Linuxでの開発時によく用いられるApacheとNginxの比較についてまとめます。

#サーバーの構成
ApacheとNginxの比較をする前に開発の中でどの部分に位置するか説明します。
<img width="149" alt="スクリーンショット 2019-12-15 22.31.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/32fdc47a-1bec-475a-9652-3c76ff1772b9.png">
サーバーの構成は上記の図のようになっておりハードウェア（パソコンなどの機器本体）の上に、OSやミドルウェアがのっています。
OSはコンピュータを操作するための基本的な機能を担うことろで、もしOSが入ってないと機器があるだけでその機器の画面は真っ暗で何も動きません。
今回学んでいくミドルウェアとは、さまざまなアプリケーションに対して特定の機能の提供をする部分です。
具体的にはクライアントからの要求に応えwebページを表示するなどだれもが使うような機能です。ミドルウェアにはデータベースを管理するソフトウェアやHTML文書を表示するソフトウェアなど様々あります。

#Apacheとは
Apacheソフトウェア財団によって開発されたOSSで、元々は米国立スーパーコンピュータ応用研究所 (NCSA) が開発したNCSA HTTPdに改良という形で開発が行われました。その後、2000年頃にBrian Behlendorf(ブライアン・ベレンドルフ)の手によってソースコードは完全に書き換えられました。

**【メリット】**
・機能拡張が簡単できる 
・信頼性や安定性が高い
・重い処理が得意
**【デメリット】**
・メモリを大量に消費する
・同時処理数に弱い

#Nginxとは
NginxはNginx,Inc.のCTOのイーゴリ・ウラジーミロヴィチ・シソエフによって開発されたOSSで、2002年に開発が始まり、2004年に初公開されました。
C10K問題というApacheの仕組み上発生しうる、同時接続するクライアントが多すぎるとサーバーがパンク問題がありその問題をきっかけに開発され始められました。

**【メリット】**
・速くて高負荷に強い
・リバースプロキシやロードバランサの機能がある
・柔軟にカスタマイズできる
**【デメリット】**
・CPUリソースがたくさん必要な処理は不向き
・Nginx単体で完結させるのは難しい
・機能が少ない
・ソースコードが複雑

#おわりに
ApacheとNginxそれぞれ優れている部分と劣る部分があります。
たとえば大規模の開発や安定が求められうようなシステムではNginxが向いていますが、そこまのスペックが必要ない場合は比較的簡易なApacheの開発の方が向いているかと思います。

【参考】[ApacheとNginxを比較！それぞれのメリット・デメリットを解説](https://geekly.co.jp/column/cat-technology/1903_096/)
Vim のオプション設定をバッファに挿入する 

はじめに
------

Vim で試しにオプション設定を行い、それが良かったので vimrc に書こうとした際にその設定内容が手入力するには長かったり複雑だったりして困ったことはないでしょうか。
`set {option}?` の結果などをバッファに挿入できれば…と思って調べて回った結果その方法が見つかったので書きます。

使用する機能
----------

以下の機能を使います。

* レジスタの内容を挿入(`i_CTRL-R`)
* Expression レジスタ
* execute コマンド

詳細
----

### レジスタの内容を挿入

インサートモードでレジスタの内容を挿入するには `CTRL-R` を入力したあとにレジスタ名を入力します。

### Expression レジスタ

レジスタには番号のレジスタ以外に特別なレジスタがあり、その一つが Expression レジスタです。
インサートモードで `CTRL-R` を入力したあとに `=` を入力するとコマンド行に式を入力できるようになります。式を入力してEnterキーを入力すると式が評価されてその結果が挿入されます。

### execute コマンド

Exコマンドを実行して出力を文字列として返すコマンドです。

### オプション設定をバッファに挿入する

上記の機能を組み合わせることで Vim のオプション設定をバッファに挿入することができます。

1. インサートモードに入る
2. `CTRL-R` を入力
3. `=execute("set {option}?")` を入力
4. Enter キーを入力

例えばインサートモードで `CTRL-R` を入力した後、以下のように入力すると

```
=execute("set guifont?")
```

以下のような結果がバッファに挿入されます。

```
  guifont=Osaka-Mono:h14
```

実行してみればわかりますが、なぜか直前に空行が挿入されます。
これについては理由がわかっていません。(知っている方がいらっしゃったら教えて欲しいです…)

最後に
-----

ちょっとした小ネタではありますが、これで vimrc の編集が少し楽になる場合があるんじゃないかなと思っています。

追記
----
Twitter およびコメントにて `execute` 以外の方法を教えて頂きましたので追記します。
`=execute("set {option}?")` の代わりに `=&{option}` を入力することでそのオプションの設定値をバッファに挿入することができます。

例えば、インサートモードで `CTRL-R` を入力した後以下のように入力すると

```
=&guifont
```

以下のような結果がバッファに挿入されます。

```
Osaka-Mono:h14
```

しかもこちらの方法だと、理由不明であった直前の空行が挿入されることもありません。
Laravelで複数の宛先にメールを送信する方法

##環境
Laravel 5.5

##背景
仕事で、とあるアクションを行った時に複数の宛先にメールを送る方法がわからずに四苦八苦してしまった。

##問題点
```app/Mail/sendmail.php
public function build()
    {
        return   $this->from('XXXXfromXXXX@gmail.com')
                ->subject('テスト送信完了')
                ->to(????)
                ->view('emails.sendmail');
    }
```

初めは直接->to()の中に記述していたが、エラーでうまくいかず...

## 見るべき場所
途中Maiableを継承している場所を確認すればいいことに気づいた。

```app/Mail/sendmail.php
use Illuminate\Mail\Mailable;

class OrderShipped extends Mailable
{
```
illuminateなのでvendor以下のMailableを確認する。


```vendor\laravel\framework\src\Illuminate\Mail\Mailable.php
/**
     * The "to" recipients of the message.
     *
     * @var array
     */
    public $to = [];
```
変数$toは配列で初期化されていることを発見。
（中の処理を詳しく見たい方はvendor以下のMailableクラスを参考にしてください。）
## 問題解決
配列を作成して、引数として渡す方法で解決した。

```app/Mail/sendmail.php
public function build()
    {
        $to = array('XXXto1XXX@gmail.com','XXXto2XXX@yahoo.co.jp');

        return   $this->from('XXXXfromXXXX@gmail.com')
                ->subject('テスト送信完了')
                ->to($to)
                ->view('emails.sendmail');
    }
```
## 気づき
継承しているクラスを確認するのが大事。
SASの日付フォーマット

備忘録。
各日付の取得とマクロ変数への格納。

# 日付フォーマット
```
data _null_ ;
  * 基準日 ;
  base_date = today() ;

  * 週初、月初、月末、年初 ;
  StartOfWeek  = intnx('week' , base_date, 0, 'BEGINNING') ;
  StartOfMonth = intnx('month', base_date, 0, 'BEGINNING') ;
  EndOfMonth   = intnx('month', base_date, 0, 'END') ;
  StartOfYear  = intnx('year' , base_date, 0, 'BEGINNING') ;

  * 基準日の四半期の開始日 ;
  StartOfQtr = yyq(year(base_date), qtr(base_date)) ;
  
  * 前四半期の開始日、終了日 ;
  if qtr(base_date) = 1 then StartOfPrevQtr = yyq(year(base_date)-1, 4) ;
  else StartOfPrevQtr = yyq(year(base_date), qtr(base_date)-1) ;

  EndOfPrevQtr = yyq(year(base_date), qtr(base_date)) -1 ;

  * 出力フォーマット ;
  * 01APR2019 ;
  call symput('base_date'      , put(base_date      , date9.)) ;

  * yymm形式 1904 ;
  call symput('yymm'           , put(base_date      , yymmdd4. )) ;

  * 区切り文字なし20190401 ;
  call symput('StartOfWeek'    , put(StartOfWeek    , yymmddn8.)) ;

  * スラッシュ区切り 2019/04/01 ;
  call symput('StartOfMonth'   , put(StartOfPrevQtr , yymmdds10.)) ;
  call symput('EndOfMonth'     , put(EndOfMonth     , yymmdds10.)) ;
  
  * ハイフン区切り 2019-04-01 ;
  call symput('StartOfYear'    , put(StartOfYear    , yymmdd10.)) ;
  call symput('StartOfQtr'     , put(StartOfQtr     , yymmdd10.)) ;
  call symput('StartOfPrevQtr' , put(StartOfPrevQtr , yymmdd10.)) ;
  call symput('EndOfPrevQtr'   , put(EndOfPrevQtr   , yymmdd10.)) ;
run ;
```

# 日時フォーマット
```
data _null_ ;
  base_dt = datetime() ;
  * 2019/04/01 00:00:00 ;
  call symput('base_dt'   , put(base_dt , nldatm20.)) ;
run ;
```
[Android] Kotlinのラムダ式でonClickListenerとonLongClickListenerを両立

Androidのアプリにてボタンなどを長押しする時の処理とタップしたときの処理を変えたい場合があります。

だいぶKotlinにも慣れてきて、ボタンなどのonClickListenerもラムダ式で書くようにしていますが、表題の通り、Kotlinのラムダ式を使って`onClickListener`と`onLongClickListener`を両立するのに躓いたのでメモしておきます。

`onClick`イベントは通常returnを持ちませんが、`onLongClick`イベントは`Boolean`型の戻り値を持ちます。この戻り値を`true`とすると`onClick`と`onLongClick`が干渉しなくなります([公式Reference](https://developer.android.com/reference/kotlin/android/view/View.OnLongClickListener.html))。

ですが、あれ?ラムダ式の戻り値ってどう書くんだ?となって調べて[こちらのサイト](https://negichou.com/kotlin-around-func/)のラムダ式の項にて

> return 文は使用せず、ラムダ式の末尾に記述した値が評価され、戻り値となる。

とのことだったので、このように実装しました(ボタンのインスタンスは`button`)。

```kotlin

button.setOnClickListener {
  Toast.makeText(this@MainActivity, "OnClick", "Toast.LENGTH_SHORT).show()
}

button.setOnLongClickListener {
  Toast.makeText(this@MainActivity, "OnLongClick", "Toast.LENGTH_SHORT).show()

  true // trueを返す
}
```

こちら、最後の`true`のreturnは

```kotlin
return@setOnLongClickListener true
```

の省略形のようですね。
C#で変数名を一括で変更する

C# で変な変数名を書いてしまい、後で変更する場合、

例えば、下記コード

変数a が "apple" これは変数名が分かりくい。

実行 ＞＞ エラーは出ないが・・・

![exe.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/c5960612-86f6-b62c-e0cf-baf490054756.gif)


一瞬で分かりにくいが、変数 a は変数名がよろしくない

そこで、a を apple に変更したい。

文字列置換だと、ヤバい状態になるのは分かると思う。イマジン！

操作は簡単で、宣言されている場所の　

##string a="りんご"; 
の
##a を
##apple に変更して CTRL+.  Enter

![apple.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76087/8bbe5617-08f2-8512-0923-306b81a78d22.gif)



以上
【画像処理100本ノックに挑戦】Q.18. Embossフィルタ

# 使用したライブラリ
[【画像処理100本ノック】独自の画像入出力クラスを作る](https://qiita.com/jajagacchi/items/834e8425b84f94df8a49)

# Q.18. Embossフィルタ
> Embossフィルタを実装せよ。

微分フィルタっぽいんだけど、勾配だけでなく、実空間の値も入ってるから元画像＋輪郭浮き上がりって感じになるのかな。使ったことないです。エンボスフィルタといってもいくつかバリエーションがあるみたい。アート以外で何に使えるんだろう？

```c++
int main()
{
	PPM ppm("imori.pnm");
	int width = ppm.Get_width();
	int height = ppm.Get_height();
	PPM ppm2(width, height);

	auto kernel = [&](int i, int j)
	{
		double ret = 0;
		if (i == 0 && (j==0||j==1)) ret = 1;
		if (i == 0 && j==-1) ret = -1;
		if (i * j == 0 && (i==-1||j==-1)) ret = -1;
		if (i * j == 0 && (i == 1 || j == 1)) ret = 1;
		if (i == -1 && j == -1) ret = -2;
		if (i == 1 && j == 1) ret = 2;
		return ret;// / 16.;
	};

	auto conv = [&](const std::vector<std::vector<double>>& f)
	{
		std::vector < std::vector < double >> ret(width, std::vector<double>(height));
		for (int j = 0; j < height; j++)
			for (int i = 0; i < width; i++)
			{
				ret[i][j] = 0;
			}
		for (int j = 0; j < height; j++)
			for (int i = 0; i < width; i++)
			{
				int sum = 0;
				for (int di = -1; di <= 1; di++)
					for (int dj = -1; dj <= 1; dj++)
					{
						if (i - di >= 0 && i - di < width && j - dj >= 0 && j - di < height)
						{
							ret[i][j] += kernel(di, dj) * f[i - di][j - dj];
							sum += kernel(di, dj);
						}
					}
				//ret[i][j] /= (double)sum;
			}
		return ret;
	};

	std::vector < std::vector < double >> arry(width, std::vector<double>(height));
	for (int j = 0; j < height; j++)
		for (int i = 0; i < width; i++)
		{
			int r = ppm(i, j, 'r');
			int g = ppm(i, j, 'g');
			int b = ppm(i, j, 'b');
			int y = (std::round)(0.2126 * r + 0.7152 * g + 0.0722 * b);
			arry[i][j] = y;
		}
	arry = conv(arry);

	for (int j = 0; j < height; j++)
		for (int i = 0; i < width; i++)
		{
			int val = abs(arry[i][j]);
			if (val > 255) val = 255;
			ppm2(i, j, 'r') = val;
			ppm2(i, j, 'g') = val;
			ppm2(i, j, 'b') = val;

		}

	ppm2.Flush("out.ppm");
	return 0;
}
```
![imori.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/c5f18006-43a7-6e54-40e0-11eae2a85fe2.png) ![out.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520857/9ae9dd33-8e31-37b7-8fdc-242f118bb797.png)
DashのSnippet機能を活用したらNuxt.jsの開発がめちゃめちゃ捗った【Nuxt.js × Vuetify】

下記に移動しました！

https://blog.proglearn.com/2019/12/17/dash%e3%81%aesnippet%e6%a9%9f%e8%83%bd%e3%82%92%e6%b4%bb%e7%94%a8%e3%81%97%e3%81%9f%e3%82%89nuxt-js%e3%81%ae%e9%96%8b%e7%99%ba%e3%81%8c%e3%82%81%e3%81%a1%e3%82%83%e3%82%81%e3%81%a1%e3%82%83%e6%8d%97/

しばらく移転のお知らせを掲載の後、消します
RPAの盛り上げ方＆盛り上がり方／Twitter編

#はじめに
皆さん こんばんは！
RPA界隈のガヤ担当：Dです。
 技術的なネタは他の方にお任せし、私からは別の視点から「RPA」に関する投稿を。

それでは、いってみましょう！

#今すぐ始める『盛り上がり入門』①／Twitter編
**＜盛り上がり手順書①：Twitter＞**
1. Twitterアカウントを作る
2. 自己紹介やアカウント名で「RPA」をアピール
3. ツイートする
4. RPA界隈のTwitterユーザーと繋がる
5. 交流を楽しむ★

この後は上記の**手順３～５を無限ループ**。
コレだけ！　簡単でしょ？

続いて「さらに盛り上げる」ポイントをご紹介しちゃいます。

#ポイント解説[1]／ハッシュタグ
Twitterでハッシュタグ、使っていますか？
正直、入力するのが面倒ですよね。わかります。
**<FONT COLOR=red>私も「超面倒だな」と思っています。</font>**

それでも頑張ってハッシュタグを入れ、時には**ハッシュタグを作ります。**
それは何故かというと↓↓↓

**＜それでも私が「ハッシュタグ」を入れるワケ＞**
1. 自分が後で見易い
2. 他のユーザーが関連ツイートを追い易い（特にイベント時）
3. togetter等に纏めてもらえる
4. **ベンダーに見てもらえる**
5. RPA界隈から「必ず」何らかの反応がもらえる
6. **共通の話題で盛り上がるキッカケになる**

すぐに効果（盛り上がりの実感）は得られないかも知れません。
ただ、ハッシュタグを付ける事を習慣化するだけで、絶対に盛り上がれます！
※ソースは私
![RPA流行語大賞2019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365842/cc798780-5e30-920e-ca3c-6c27f8e76339.jpeg)
↑ Twitter上では流行語大賞の選出も！

#ポイント解説[2]／画像を投稿する
Twitterのタイムラインを眺めている時、**瞬間的に情報を得る投稿は「画像」**ではないでしょうか。
RPAについて何かを発信したい時、是非「画像」を添えてみて下さい。
なんなら、「画像」のみでも良いです。

でも正直、画像を引用したり、被写体のプライバシーに配慮するのは面倒ですよね。わかります。
**<FONT COLOR=red>私も「結構面倒だな」と思っています。</font>**

それでも頑張って画像を添付し、時には１ツイートの為に**1時間かけて画像を作ります**。
それは何故かというと↓↓↓

**＜それでも私が「画像」を多用するワケ＞**
1. 一瞬で要点がつかめる
2. 物事を簡潔に伝える練習になる

下の画像を見て下さい。
説明が無くても「盛り上がったんだな」「LTはオジサンばかりだな」「動物がいた！」という情報が一瞬で入ってくると思います。如何でしょうか？
![RPALT-TOKYO-DRINK-matome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365842/f7e543a7-c78a-efb9-7e12-73d8e7aa1861.png)
↑ こちらは先日開催された【RPACommunity 東京呑み部 vol.1】のフォトレコです。


#ポイント解説[3]／とにかく反応する
皆さんは何故 Twitterで「つぶやく」のでしょうか？
＜まずは私の話＞
私は明確な目的を持ってツイートしています。
それは **見て欲しい、反応が欲しい** これに尽きます。

これは人間の **<FONT COLOR=red>承認欲求</font>** に起因すると考えており、
Twitterで返信をもらったり、リツイートされたり、いいね！されると
**嬉しい**という気分になります。
※これは私の承認欲求が満たされるからだと思っています。

＜推測する＞
私がこの様な気持ちで Twitter を利用しているという事は、
恐らく**他のユーザーも同じ気持ちなんじゃないか？**と考えてたワケです。

なので、RPA関連のツイートには★とにかく反応★
「資格取得系ツイート」には★必ず返信で賞賛★
明るい話題には★コメント付きでリツイート★
~~時にはクソリプで息抜き~~

私も下のTwitterアカウントで「主に」RPAについて発信しています。
是非、交流しましょう！
![twitter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365842/1ccb3e45-1312-6b8d-7082-2834447e3fae.png)

#最後に
今回紹介した「ポイント」は全てのTwitterユーザーに勧める【正しい手法】ではありません。
私が長らくTwitterで騒いできた経験から得た**「提案」**です。

皆さんの**RPAツイートライフ**の一助になれば嬉しいです。
それではまた、Twitter上でお会いしましょう！
![t1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365842/990301b3-9a30-bf39-429c-ba8b552a7c79.png)