OmniAICreator/Qiita-1.07M huggingface dataset:
NettyでFINとRSTを動的に切り替える方法

Nettyを使ってサーバを構築する際に、Channel(ソケット)をcloseする際に状況によってFINとRSTを使い分けたい場合があります。例えば、正常時はFIN(遅延タイムアウト時はRST)だけど、異常を検知した際は直ちにRSTにするような要件がある場合です。

# close時のデフォルト動作の指定

`Channel`をcloseした際のFIN/RSTのどちらを使用するかは、`ServerBootstrap`を構築する際に指定することができます。

```java
EventLoopGroup bossGroup = new NioEventLoopGroup(1);
EventLoopGroup workerGroup = new NioEventLoopGroup(0);
ServerBootstrap bootstrap = new ServerBootstrap()
    .option(ChannelOption.SO_BACKLOG, 1024)
    .group(bossGroup, workerGroup)
    .channel(NioServerSocketChannel.class)
    .childOption(ChannelOption.SO_LINGER, 10) // FIN → 遅延タイムアウト(10秒) → RSTでcloseするための指定
    .childHandler(new MyChannelInitializer());
// ...
```

> **NOTE:**
>
> -1を指定するRSTによる解放は無効化されます。

# close時にFIN/RSTを選択

`ServerBootstrap`構築時に指定したデフォルト動作と異なる方法でcloseしたい場合は、`Channel`から`ChannelConfig`を取得してSO_LINGERの設定値を変更することで実現することができます。

```java
@ChannelHandler.Sharable
class MyHandler extends SimpleChannelInboundHandler<byte[]> {
  @Override
  protected void channelRead0(ChannelHandlerContext ctx, byte[] msg) {
    // ...
  }
  @Override
  public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    ctx.channel().config().setOption(ChannelOption.SO_LINGER, 0); // 直ちにRSTでcloseするように指定
    ctx.close();
  }

}
```
sourcehut にパッチを投げる方法

sourcehut という git のホスティングサービスがあります。
公式サイトは https://sourcehut.org/ です。

日本ではあまり見慣れないサービスですが、利用されている例を上げると Go の GUI ライブラリの Gio はこのサービスでホストされています。
https://git.sr.ht/~eliasnaur/gio

このサービスには Pull Request という概念はなく、自分でパッチをメーリングリストに投稿し、取り込んでもらう必要があります。
git には send-email というコマンドがあり、これを使ってパッチをメーリングリストに送ります。

今回自分がパッチを投げるまでに苦労したので同じことを行いたい人に向けて手順を残します。

# 前提条件
* git config の user.email に gmail のアカウントを設定している
* google のアカウントで2段階認証を設定している
* gmail の「メール転送と POP/IMAP」の項目で IMAP を有効にしている


# 事前準備
## アプリパスワードを設定する
https://support.google.com/accounts/answer/185833 を見ながら設定します。

https://myaccount.google.com/security からアプリパスワードを作成します。
端末の種類を選ぶ箇所がありますが、その他で設定します。
生成が完了すると、パスワードが表示されます。
このパスワードは一度ページを離れると見れなくなるので、1password などに保存しておく必要があります。

## git の config の設定をする
gitconfig ファイルに以下の設定を追加します。
大抵はリポジトリの .git/config に設定すると影響範囲が対象のリポジトリだけになるので便利です。

```
[sendemail]
	smtpEncryption = tls
	smtpServer = smtp.gmail.com
	smtpUser = username@gmail.com
	smtpServerPort = 587
```

# 実際にパッチを送る
実際にコマンドを実行してパッチを送ります。

```
git send-email HEAD^
```

HEAD^ の部分は適宜変更する必要がありますが、これを実行するとメールを送信するための編集画面が開きます。

特に変更する必要がなければ、このままエディタを閉じます。

すると「本当に送信するか？」というダイアログが出ます。
yesで送信しようとすると

```
Password for 'smtp://username@gmail.com@smtp.gmail.com:587':
```

というダイアログが出るので事前準備で取得したパスワードを入力します。
上手くいくとメールが送信されて、https://lists.sr.ht/USER/REPO から確認することができます。
floatとdoubleは結局どっちが早いのか良く分かりません。

#概要
floatとdoubleは結局どっちが早いのか良く分かりません。

#サンプル
そもそもこんな書き様でどっちが早いとか言えるのか？すら分かりません。

```c
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "windows.h"

#define C 4
#define N 1000000

int main()
{
	int i;
	float f;
	double d;
	double time;

	LARGE_INTEGER start, end, freq;
	QueryPerformanceFrequency(&freq);

	for (i = 0; i < C; i++)
	{
		f = 0;
		d = 0;
		QueryPerformanceCounter(&start);
		switch (i)
		{
		case 0:
			for (f = 1; f < N; f++) f += f * f / f - f;
			break;
		case 1:
			for (d = 1; d < N; d++) d += d * d / d - d;
			break;
		case 2:
			for (f = 1; f < N; f++) f += sinf(f) + logf(f) + sqrtf(f);
			break;
		case 3:
			for (d = 1; d < N; d++) d += sin(d) + log(d) + sqrt(d);
			break;
		default:
			break;
		}
		QueryPerformanceCounter(&end);
		time = (end.QuadPart - start.QuadPart) * 1000.0 / freq.QuadPart;
		printf("%lfms\n", time);
		printf("float  %f\n", f);
		printf("double %lf\n", d);
		printf("\n");
	}
}
```

#環境
VisualStudio 2019
Windows 10
Core i7 7700K 4.2GHz
x64

#最適化O2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286581/ba0c3c88-e432-59f4-7b1f-d53a9bc1db40.png)

#最適化Od
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286581/fb4ffda2-9b75-af96-8526-80bf7442e767.png)

#なにしてんの？
いや、floatの方がめっちゃ早い（数倍差）という状況に遭遇したんですよ。別に特殊な組み込み環境とかじゃなくて、普通のWindows環境だったんですよ？意味わからなかったんですよ。ふぁー？？？

#参考
x86でdoubleがfloatより速いかどうかを検証してみた
https://qiita.com/telmin_orca/items/455dab4a6ffd4545ee95

【雑談】 floatはdoubleより高速だと考えている人はどれぐらいいますか？
https://dixq.net/forum/viewtopic.php?t=5259

doubleとfloatの計算速度の話
http://precure-3dprinter.hatenablog.jp/entry/2017/05/10/double%E3%81%A8float%E3%81%AE%E8%A8%88%E7%AE%97%E9%80%9F%E5%BA%A6%E3%81%AE%E8%A9%B1

float型とdouble型を比較した場合、常にfloatが速いと思ってはダメらしい
http://nakamura001.hatenablog.com/entry/20090226/1235641233

float型対double型
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4.4.html

float型とdouble型のパフォーマンステスト
http://cppdiary.blog76.fc2.com/blog-entry-37.html
RNNの隠れ層の次元とか入力データの構造とかよくわからない人へ

# はじめに
自分の場合、機会がなくてRNN（リカーレントニューラルネットワーク）ってあまり使用しないんですよね。だから、一回勉強してもパラメータとか忘れちゃうんですよ。ところが、最近時系列の使用場面がありまして。

RNNは初めての人にとっては、データの準備やネットワークの構造が複雑でわかりにくいです。自分も時々混乱するので、基本事項ではありますが復習がてらメモを残しておきます。

# ざっくりRNN
RNNは特に時系列データに対して特化したモデルで、入力データを再帰的にネットワークに入力します。

今、$n_i$次元の特徴ベクトルが時間に依存して変化しているとします。これを$\boldsymbol{x}_t, t=0,1,...,N$と書くことにします。原理的には無限の時間のデータ系列を考えられますが、実用的にはある時間範囲のデータになると思います。

さて、時系列の特徴をネットワークに反映させるためには、過去の情報をネットワーク内に保持しておく必要があります。そこで、過去にネットワークに入力・伝搬したデータを再度ネットワークに入力することで、過去の情報を踏まえてネットワークを更新することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/523c2395-40e9-99cc-d85a-59e629f4951f.png)

上図を展開して描くと次の図のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/755c81a6-65f7-ab66-6e45-009730aa469c.png)

$U, V, W$は重み行列です。隠れ層$\boldsymbol{h}$の次元を$n_h$とすると行列$U$の形状は$(n_h\times n_i)$、行列$W$は正方行列で形状は$(n_h\times n_h)$、出力の次元を$n_o$とすると、行列$V$の形状は$(n_o\times n_h)$となります。

隠れ層は次のように書けます。

```math
\boldsymbol{h}_t = f(U\boldsymbol{x}_t + W\boldsymbol{h}_{t-1} + \boldsymbol{b})
```

$f$は活性化関数、$\boldsymbol{b}$はバイアスです。この漸化式を展開していくことで無限の過去に遡っていけます。なお、重み$U, W$は共有されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211712/77e3e56e-0b76-83ce-d105-3d668168499a.png)

ただ、実用上は無限の大きさのネットワークは構築できないので、ある程度の時間範囲で切ります。例えば上の図では、2期前の隠れ層まで入力し、3期前の$\boldsymbol{h}_{t-3}$はゼロにしておけば良いです。

上の図の場合は、ネットワークの形からわかるように、[$\boldsymbol{x}_
{t-2}$,$\boldsymbol{x}_
{t-1}$,$\boldsymbol{x}_
{t}$]を入力として$\boldsymbol{y}_
{t}$を出力します。したがって、元の時系列データ[$..., \boldsymbol{x}_
{t-3},\boldsymbol{x}_
{t-2},\boldsymbol{x}_
{t-1},\boldsymbol{x}_
{t}, ...$]を1期ずつずらして3つずつのブロックに加工します。

```math
[[\boldsymbol{x}_
{t-3},\boldsymbol{x}_
{t-2},\boldsymbol{x}_
{t-1}] \rightarrow \boldsymbol{y}_
{t-1} \\
[\boldsymbol{x}_
{t-2},\boldsymbol{x}_
{t-1},\boldsymbol{x}_
{t}] \rightarrow \boldsymbol{y}_
{t} \\
[\boldsymbol{x}_
{t-1},\boldsymbol{x}_
{t},\boldsymbol{x}_
{t+1}] \rightarrow \boldsymbol{y}_
{t+1} \\
...
]
```

このブロックの大きさ（今の場合3）を$\tau$として、ブロックの数を$M$とすれば、Kerasの場合にはデータのshapeは$(M, \tau, n_i)$となります。

TensorFlowで再帰的な隠れ層を実現するにはSimpleRNNCellを使用します。Kerasはデータを整形しておけば再帰構造を気にせず使うことができます。

```python
from keras.layers import SimpleRNN

model = Sequential()
model.add(SimpleRNN(units=n_hidden,  # 隠れ層の次元
                    input_shape=(tau, n_in), # ブロックの大きさ,入力の次元
                    ))
model.add(Dense(n_out))
model.add(Activation('linear'))
```

# おわりに
入力データの次元、各行列の形状など、それぞれのパラメータ間の関係を確認しました。RNNの発展形は奥が深いのでまたの機会に応用も含めて書ければと思います。
[Python] 競技プログラミングで再帰関数を書くときはsys.setrecursionlimitで最大再帰数を上げる


再帰数の上限がデフォルトで設定されていて、これを超えると例外が投げられる。

必要に応じて上げる。

```python
>>> import sys
>>> sys.getrecursionlimit()  # 確認
1000
>>> sys.setrecursionlimit(10 ** 6)  # 変更
>>> sys.getrecursionlimit()  # 確認
1000000
```

https://docs.python.org/ja/3/library/sys.html#sys.setrecursionlimit
【Clojure入門備忘録】ThreadingMacroの基本

Threading Macroってなんだか難しそう....という先入観があった。
書いてみると難しくはないし、むしろ「Threading Macro使わないとかありえなくない？」となった。

ということで備忘録メモ。

## そもそも何がやりたかったのか
階層構造になったMapの中の文字列を取り出して、1つの文字列を作りたかった。

```clojure:このコレクション
dev> {:data {:operator "AND"
             :values [{:value1 "hoge"
                       :value2 "fuga"}
                      {:value1 "HOGE"
                       :value2 "FUGA"}]}}
```
↓

```clojure:こうしたい
"hoge,fuga AND HOGE,FUGA"
```


## どうやってやるか
### Threading Macroを使わない場合

```clojure:
dev> (defn func [{:keys [data]}]
       (clojure.string/join
        (str " " (:operator data) " ")
        (map #(str (:value1 %) "," (:value2 %)) (:values data))))
#'dev/func
dev> (func {:data {:operator "AND"
                   :values [{:value1 "hoge"
                             :value2 "fuga"}
                            {:value1 "HOGE"
                             :value2 "FUGA"}]}})
"hoge,fuga AND HOGE,FUGA"
```

書きにくい、読みにくい、かっこ辛い。

### Threading Macroを使う場合

```clojure:
dev> (defn func [{:keys [data]}]
       (->> data
            :values 
            (map #(str (:value1 %) "," (:value2 %)))
            (clojure.string/join (str " " (:operator data) " "))))
#'dev/func
dev> (func {:data {:operator "AND"
                   :values [{:value1 "hoge"
                             :value2 "fuga"}
                            {:value1 "HOGE"
                             :value2 "FUGA"}]}})
"hoge,fuga AND HOGE,FUGA"
```

やりたいことを最下層から順番に書いただけ:clap:
`->>`は、`thread-last macro`というらしい。

対して、`->`は`thread-first macro`という。（何が出来るのかはもう名前から察せる。）
cf. https://clojure.org/guides/threading_macros


ちなみにこのマクロを展開すると...

```clojure:こうなる(当たり前だけど)
dev> (macroexpand '(->> data
                        :values 
                        (map 
                         #(str (:value1 %) "," (:value2 %)))
                        (clojure.string/join (str " " (:operator data) " "))))
(clojure.string/join
 (str " " (:operator data) " ")
 (map
  (fn* [p1__81698#] (str (:value1 p1__81698#) "," (:value2 p1__81698#)))
  (:values data)))
```

## 最後に
ちなみに、Threading Macroの代表的なものとして他に`some->`, `some->>`,`cond->`あたりがある。
この辺はまた今度。
Win10にてパッケージ管理(chocolatey)を使ってGo言語をインストール

## 目的
 - WindowsでもLinuxのようにパッケージ管理を使ってソフトを管理したい

#### Chocolatey（パッケージ管理）のインストール
（以下、[公式サイト](https://chocolatey.org/docs/installation#install-with-cmdexe)の手順）

#### 管理者権限でコマンドプロンプトを起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488456/806cfcd3-82b1-94f8-39dd-90d5679c41d9.png)

#### インストール実行
```console:コマンドプロンプトで以下を実行
@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```
ちなみに管理者権限でコマンドプロンプト起動しないと実行時に以下のエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488456/f0f73502-42fc-83f1-4fe6-7ec85fe5f965.png)

#### コマンドプロンプトでバージョン確認

```console:コマンドプロンプトで以下を実行
C:\Windows\system32>choco
Chocolatey v0.10.15
Please run 'choco -?' or 'choco <command> -?' for help menu.
```

### パッケージ管理からGo言語(Golang)のインストール

```console:コマンドプロンプトで以下を実行
C:\Windows\system32>choco install golang
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488456/8b0bd3b3-f848-a279-eb0b-fe00aa63cdb3.png)

<font color="darkgray">チョコってコマンドが個人的に好きです。</font>
git hookでコミットメッセージを自動生成

最近AtCoderのbeginer contestにリアルタイムで参加するようになり、競プロが楽しくなってきた。

5月から参加し始めたので、約3ヶ月が経ちソースコードもそこそこ増えてきた。
せっかくなのでgithubで管理してコードが溜まっていく様子を眺めてみたいと思った。

とはいえgithubにpushしたところでACしたコードは後から手を加えないと思うので、
今回はgit hookの勉強のため、コミットメッセージを自動生成してみることを目的にしようと思う。

#git hookとは
gitのコマンドのあれやこれやを使う前や後に自動で任意の処理を加えることができるスクリプト。

使い方などについては、記事の最後に参考記事のリンクを貼っておくのでこの記事では省略し、実例として紹介する。
公式のマニュアルは[ここで](https://git-scm.com/book/ja/v1/Git-のカスタマイズ-Git-フック)見ることができる。

#コミットメッセージを自動生成
今回は`git commit`を叩いたときに
`prepare-commit-msg`で、デフォルトのコミットメッセージが記述されているようにする。
AtCoderの解答をgit管理するので、デフォルトのコミットメッセージは自分の提出一覧へのリンクにすることにする。

自分の提出一覧へのリンクは```https://atcoder.jp/contests/{コンテスト名}/submissions/me```となっている。

私の場合、コンテストのコードは以下のようにコンテスト名でディレクトリを分けており、偶然にも提出一覧へのリンクの`{コンテスト名}`と同じものをディレクトリ名にしていたので、ステージングしたファイルのディレクトリ名からURLが生成できる。

```
AtCoder
│  .gitignore
│  Source.cpp (雛形)
│
├─ABC126
│     Source.cpp
├─ABC127
│     Source.cpp
├─ABC129
│     Source.cpp
├─以下略
```

##ステージングしたファイル名を取得
普段`git status`をするときは特にオプションを付けていないので調べてみたところ、とても簡素にファイル名だけ表示してくれる`-s`コマンドがあった。

``` bash
$ git status -s
 M ABC126/Source.cpp
```

#prepare-commit-msg
上述したファイル名からディレクトリ名だけ切り出して、URLをつなげてコミットメッセージへ流す。出来上がったものは以下の通り。

```:prepare-commit-msg
#!/bin/sh

if [ "$2" == "" ] ; then
	# addしたファイル名からURLを作る
	echo "https://atcoder.jp/contests/`git status -s | awk -F '[ /]' '{print $3}'`/submissions/me `cat $1`" > $1
fi
```

```:git&nbsp;commit後
https://atcoder.jp/contests/ABC126/submissions/me 
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
#	modified:   ABC126/Source.cpp
#
```
ShellScriptはあまり得意ではない。

#参考記事
[Git フックの基本的な使い方](https://qiita.com/noraworld/items/c562de68a627ae792c6c)
[git hook はじめの一歩](https://qiita.com/mhimuro/items/adfc4e5a168d2d9295ae)
Linux 起動用 USB の作成

1. Linux の iso イメージをダウンロード。
例えば、[Ubuntu 18 日本語 Remix の iso イメージ](https://www.ubuntulinux.jp/download/ja-remix) は2GB くらい。 ファイルサイズの小さいものとして puppy linux (約350MB) がある。
2. USB に書き込むツールとして Rufus をダウンロード (v.3.6)
https://rufus.ie/ja_JP.html
3. 空の（または中のファイルが全部消えてよい）USB メモリを PC につなぐ。
4. Rufus の exe ファイルを実行。
5. ダウンロードした iso イメージを指定して、USB に書き込ませる。
TypeScriptで書いてwebpackでビルドしたjsファイルのエラーをわかりやすくする

## Why

webpackでバンドルしてるのでスタックトレースを見てもtsファイルでのエラー箇所がわからない・・ :tired_face: 

## What

[node\-source\-map\-support](https://github.com/evanw/node-source-map-support)をインストールして、tsconfig.json, webpack.config.jsを修正します :muscle: 

### node-source-map-supportのインストール

```sh
$ npm install source-map-support
```

### tsファイルの修正

webpackのエントリポイントにしているtsファイルに以下を追加します。

```js:app.ts
import sourceMapSupport from 'source-map-support'
sourceMapSupport.install()
```

### 設定ファイルの修正

webpack, TypeScriptの設定ファイルを修正します。

```diff:webpack.config.js
module.exports = {
    mode: 'development',
    target: 'node',
+   devtool: 'inline-source-map',
    ...
}
```

↑ちなみに、 `devtool: 'inline-source-map'`でも動きました。

```diff:tsconfig.js
{
  "compilerOptions": {
+   "sourceMap": true
   ...
  }
}
```

これで、webpackでビルドし直すと、エラー時にtsファイルの行数も教えてくれるようになりました :tada: 

こんなかんじ :point_down: （app.tsの73行目でエラーになってることがわかる）

```
at Object.<anonymous> (/path/to/project/dist/webpack:/src/app.ts:73:4)
```

以上です :hugging: 

## 参考
- [evanw/node\-source\-map\-support: Adds source map support to node\.js \(for stack traces\)](https://github.com/evanw/node-source-map-support)
- [\(TypeScriptで書かれてWebpackでビルドされた\) CloudFunctionsのエラー通知をわかりやすくしてみた \- selmertsxの素振り日記](https://selmertsx.hatenablog.com/entry/2018/11/13/%28TypeScript%E3%81%A7%E6%9B%B8%E3%81%8B%E3%82%8C%E3%81%A6Webpack%E3%81%A7%E3%83%93%E3%83%AB%E3%83%89%E3%81%95%E3%82%8C%E3%81%9F%29_CloudFunctions%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E9%80%9A)
- [webpack, babel, node環境で例外時のスタックトレースに元ソースの場所を表示させる \- ncaq](https://www.ncaq.net/2018/03/15/13/21/43/)
- [NBM2 \- TypeScript \+ WebPack でSourceMapを有効にする](http://kazuhito-m.github.io/memos/typescript-webpack-sourcemap)
- [javascript \- Is there source map support for typescript in node / nodemon? \- Stack Overflow](https://stackoverflow.com/questions/42088007/is-there-source-map-support-for-typescript-in-node-nodemon)
- [err\.stackに含まれるコードの位置情報をsource mapで元に戻す \- Qiita](https://qiita.com/pirosikick/items/13280be87e33d1fa0e68)
MikTeX portable 導入手続き

# MikTeX を導入する理由
Windows 10 でインストールせずに LaTeX を使える、ポータブルになる TeX のディストリビューション
日本語を扱うのは手間がかかるので、日本語の LaTeX を書くなら、TeX Live, W32TeX をインストールするほうが手間がかからない。
[W32TeX を USB メモリに入れる方法](http://www.nagaoka-ct.ac.jp/ec/labo/visu/usb/tex/w32tex.shtml)
[「はじめてのLaTeX」: MiKTeXでXeTeXで日本語を](http://supportdoc.net/support-latex/xetex.html)

# 手順

1. Windows 32bit, 64bit を区別してダウンロード
https://miktex.org/download
https://miktex.org/howto/portable-edition

2. インストール用実行ファイルの名前を miktex-portable.exe に変更
3. インストール用ファイルを実行、展開するフォルダを指定
4. 指定したフォルダにできる、コマンドスクリプトファイルを実行する
5. タスクバーアイコンに MikTeX のアイコンが現れるので、右クリックで TeXWorks（tex ファイル編集統合環境）かターミナルを起動する
MemSQL 6.8 、リブランディングとFree Tierの制限変更

# 2019年5月、MemSQL 6.8がリリースされました

転職をしてから大規模データを扱うMemSQLクラスタを運用する機会が無く、手元のMacBook上のDockerでExcel替わりに使う（32GB RAMの機材なので快適）程度ということで、あまり情報発信することを考えていませんでした…

が、MemSQLについての記事を書いている人が少ないのは相変わらずで、San FranciscoのMemSQLの人達と連絡を取り合ったりもしているので、できる範囲でMemSQLについてシェアしようとおもいます。

# 最近何が変わった？

6.7までは現役で使っていて、従来の無料ライセンスが「HA無し」「メモリー容量制限無し」だったものが「HA可」「クラスター全体で128GBまでに制限」に変更されたタイミングでした。
6.8ではこの制約が変更されたのが個人的には大きなニュースでした。

## リブランディングがあった

- 青いフラットな感じのデザインから、紫でグラデーションの入ったデザインにロゴが変わり、全体にダークな感じになったように思います
- MemSQLのローンチから何度かロゴ変更がありましたが、「MemSQL」と「memSQL」でどっちなのか表記の揺れがありますね
- 今まで、超高速のDBですよという訴求をしてたようですが、最近はデータの入出力をひっくるめて個々の業界に合わせたアプリケーションが構成できますよと言う、どちらかというとソリューション提案っぽい感じで訴求されてるように見えますね

## 機能追加は常に行われている

- 詳細は[リリースノート](https://docs.memsql.com/release-notes/latest/68-release-notes/)を見ればいいと思います
- 個人的には、`DOT_PRODUCT`が追加されてから機械学習を支援する関数の追加がどれくらい行われるか気になってましたが、6.8では `JSON_TO_ARRAY`と`SPLIT` の追加に言及されてますね。文字列を配列として扱えるのは、Hivemallなんかでも使われるような機能なので今後どう進化するか注視してみたいです

## Free Tierの制限が（大幅に）変更された

- 最も注目しているのが、Free Tierの制限が変更された点です

|制約|~6.5|6.7|6.8|
|:---:|:---:|:---:|:---:|
|HA構成|不可|可|可|
|バックアップ|不可|可|可|
|メモリー容量|無制限|128GB/クラスタ|無制限|
|ノード数|無制限|無制限|Leafは4ノード/クラスタ|

- 6.7ではノード数の制限はありませんでしたが、メモリー容量が128GBまでのため、CPUコア数やコア当たりのメモリー容量から考えるとLeafは2〜4程度が現実的でした。128GBだと、高性能なMySQL環境と比較して劇的な差を感じにくい気もします
- 6.8ではメモリー容量の制限がなくなり、「インメモリーであること」をより体感できる構成が可能だと思います。ノード数の制限が4台までなので、2台に分散して、レプリカを1つ作る、というHA構成も試せますね
- 試したところ、6.7用に発行したFree Tierのライセンスは、6.8でも128GB制限があり、6.8の4ノード用ライセンスを得るにはライセンスの発行し直しが必要なようです。あまり検証していませんが、たぶん改めて登録するかMemSQL社に問い合わせるのがいいと思います


# ところで…

- MemSQLはインメモリーに最適化されているので、MySQLのメモリーテーブルよりも早いし扱いやすいしすごく便利です。ローカルでちょっとしたデータを扱うにも、データ構造がインメモリーに最適化されているので爆速です
- データはUTF-8がデフォルトなので日本語もぜんぜんOKで、MySQLの汎用的なコネクタで大抵のツール・ライブラリから接続できます
- アナリストのデータ探索、機械学習なんかでクエリーの試行錯誤する、リアルタイムダッシュボードを高頻度に更新したい、という場合に試す価値はあります
- インメモリーというとSAP HANAがぱっと思い浮かぶ人もいると思いますが、コスト的にも取っつきやすさ的にも、MemSQLは試す価値あると思います


Enjoy!
Mac(Catalina)でHHKBのキーマッピング変更

# MacでHHKBを使いたいが、デフォルトのキーマッピングが使いづらい

[Karabiner](https://pqrs.org/osx/karabiner/)のインストール
をして、キーのマッピングを行う

設定はこんな感じにした
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/140ebc22-93c6-a645-0ebc-5dba84941cd7.png)


## 遭遇した問題

```
[2019-08-29 23:32:34.798] [error] [observer] grabber_client error: No buffer space available 
[2019-08-29 23:32:34.951] [error] [console_user_server] grabber_client error: No buffer space available
```

類似Issue
https://github.com/tekezo/Karabiner-Elements/issues/1932

### 解決策
karabinerのプロセスを再起動することで治るらしい(原因は未調査

```sh
sudo killall karabiner_grabber
sudo killall karabiner_observer
```
（編集中）Pacemaker用語集

※　書きかけなので、随時更新予定


## RA

リソースエージェント(Resource Agent)の略。

クラスタリソース(制御対象)を管理するシェルスクリプトファイルです。

リソースの起動、リソース停止、リソース死活監視などを行う。

### プロバイダ

各RAの提供元の団体、プロジェクト名を示す。
以下のようなプロバイダがある。

* heartbeat: Linux-HAプロジェクト
* pacemaker: Pacemaker
* openstack : OpenStack

### クラス

RAの仕様を示す。

以下のようなクラスがある。

* lsb
* ocf
* service
* systemd

### LSB
Linux Standard Baseの略。
/etc/init.dに配置されたスクリプトを使用するタイプのRAを示す。

#### OCF
Open Cluster Frameworkの略。

LSBを拡張したタイプのRAで、/usr/lib/ocf/resource.dに、
Open Cluster Frameworkプロジェクトが推奨するRA(シェルスクリプト)が配置されている

---

## DC
Designated Controllerの略。
クラスタ全体を統一的に管理するノードで、クラスタ内から一台のノードが選択される。

https://www.miraclelinux.com/tech-blog/fvvnmv

## PE (Pengine)
Policy Engineの略。
クラスタの最適な状態とそこに至るための必要な処理を計算して、下記のディレクトリにファイルとして保存する。

PEの計算結果は、DCに渡される。

```
/var/lib/pacemaker/pengine
または、
/var/lib/pengine/
```


## TE (Tengine)
Transition Engineの略。


## STONITH
Shoot-The-Other-NodeIn-The-Headの略。

制御が利かないサーバをHAクラスタから強制的に離脱(フェンシング)させる機能。
対象サーバの電源を再起動して、クラスタから離脱させる。


## CIBファイル
Cluster Information Baseファイルの略。

クラスタの構成を定義するxmlファイルを示す。
下記のコマンドでxmlファイルを表示できる。

```
cibadmin --query
```

---

## スコア値

リソースをどのノードで起動するかの優先度を示す値。

ノードの起動、リソースの追加、故障の発生などで、
クラスタの状態に変化があった場合にPacemakerが自動的にスコア値を計算する。

Pacemakerは算出したスコア値を比較し、最も大きな値のノードでリソースを起動。

算出したスコア値が負の値場合、そのノードでそのリソースを起動することはできない。

スコア値は以下の範囲で定義されている。

```
-INFINITY < 負の値 < 0 < 正の値 < INFINITY
```

* 「-INFINITY(マイナス無限大)」: 対象のノードで起動することを禁止
* 「INFINITY(無限大)」: 対象のノードで起動することを強制

http://linux-ha.osdn.jp/wp/wp-content/uploads/076783ca53a363270d253bbb98b59e83.pdf
https://www.slideshare.net/takmatsuo/ha-31244693
Pythonの配列や辞書をずっと使えるようにする小技

## モチベーション
Jupyter Notebookとかで重たい処理をしたり、DBから値を取ってきたりするのを毎回するのは非常に非効率。
ファイルとして保存する（永続化する）方が絶対いい。
pickleを使えばかなり簡単だった。


## 配列

### ファイルとして保存する(永続化）

```pkl_array.py
import pickle

fruits_array = []
fruits= ["apple","orange","melon"]
for fruit in fruits:
    fruits_array.append(fruit)
with open("fruits_array.pkl","wb") as f:
    pickle.dump(fruits_array, f)
````

### 読み込む

```pkl_array2.py
import pickle

with open('fruits_dict.pkl', 'rb') as f:
    fruits_color_dict_pkl = pickle.load(f)
```

```print
print(fruits_color_dict_pkl)
{'apple': 'red', 'orange': 'orange', 'melon': 'green'}
```


## 辞書
### ファイルとして保存する(永続化）
```pkl_dict.py
import pickle

fruits_color_dict = {}
fruits_color_dict["apple"] = "red"
fruits_color_dict["orange"] = "orange"
fruits_color_dict["melon"] = "green"

with open("fruits_dict.pkl","wb") as f:
    pickle.dump(fruits_color_dict, f)
```

### 読み込む
```pkl_dict2.py
import pickle

with open('fruits_dict.pkl', 'rb') as f:
    fruits_color_dict_pkl = pickle.load(f)
```

```print
print(fruits_array_pkl)
['apple', 'orange', 'melon']
```
さくらネットのレンタルサーバーにLaravelを導入してみた

2020年9月13日追記----------------------
以下のサイトに詳しく書いたので基本的にこちらを参考にしてください。
サーバはconohaVPSなのでさくらとの契約のあたりはこのページと合わせて。
[Laravelプロジェクトを本番サーバにデプロイ](https://misskabu.com/wordpress/?page_id=237)

--------------------------------------

#サーバーと契約
さくらネットのHPから簡単に契約できました。
契約したら１、２分でIDとかがメールで届きました。
仮登録という件名のメールにサーバーのパスワードとか入ってました。
これを大事にメモしておく。
#自分のアドレスのパス
さくらネットでは（というか他もそうかもしれないが）
/home/hoge/www/
がホームディレクトリになる。
(hogeは自分のユーザー名)


#試しに何か転送してみる
試しに適当なindex.htmlを作成して

```terminal
scp index.html hoge@hoge.sakura.ne.jp:~/www
```
か、FTPソフトでwww直下においてみる。
ドメイン名にもユーザー名と同じhogeがつくのでハマりやすいです。ていうか軽くハマりました。
メールちゃんとみたほうが良いです。
それで
http://www.hoge.sakura.ne.jp/index.html
にアクセスして開けたらとりあえず自分のサーバー領域は稼働しています。
apachとか自分で立ち上げなくても初めから常時起動しています。

#Laravelアプリを転送

本当はgitをうまく使うと楽に管理できるらしいのですが、そういうのはもっと詳しく書いている人がいるのでそちらをみてください。私もそのうちチャレンジするつもりです。
というわけで、今回はゴリ押しでアプリのフォルダごと一式全部さっきのwwwフォルダ直下にscpで送ります。
これはFTPソフトよりターミナルが楽だと思います。

```terminal
scp -r helloApp hoge@hoge.sakura.ne.jp:~/www
```

scp -r でフォルダ丸ごとコピーできます。
これで
http://hoge.sakura.ne.jp/helloApp/public/index.php

がアプリのトップページになります。
間のpublicとかなくすやり方も他のページググったら出てきます。

#MySQLにつなぐ
繋ぎ方はローカルサーバーより簡単だったので
やり方は他のページを見てもらうとして、
ハマったことだけ書きます。

.envファイルを編集するのですが、sshでサーバーのシェルに入ってvimを使おうとしたらカーソルキーが使えなくて操作できなかった。筆者の環境がたまたまかもしれない。
ですが、さくらの管理ページから入ると専用のWEBエディタが使えてメモ帳みたいな感じで簡単に編集できました。

パスワードなどが違ってDBに接続できない。
ホスト名とか必要なことが一式管理ページにあるのでそれを使えば動きました。

パスワードとかがきちんと合えば、sshでアプリのフォルダにcdで入って
php artisan migrate 
php artisan db:seed
でローカルのDBがサーバーに再現できちゃいます。すごい。

~~テーブル名が大文字・小文字が違って繋がらない。
マイグレーションまでできたは良いが、あるはずのテーブルがselectできないと言われた。
まさかと思いつつエラーメッセージに合わせたら動いた。
ローカルでは動いていたんだけど。
どうもMySQLはバージョンによって大文字小文字を同一視したり分けたりするらしいです。
対応は他の方が書いてくれています。~~
↑生のSQL発行
[WordPress]includeしたPHPのソースがブラウザに表示されてしまう 


## 実施環境
 - Windows10
 - xampp
 - WordPress 5.2.2
 - PHP 7.3.7

## 経緯

独自テンプレート内のindex.phpでhoge.phpをincludeしたところ
hoge.php内のechoで記述したhtmlを認識してしまい、ブラウザ上にPHPのソースが表示されてしまいました。

```page-xxx.php
<?php
/**
 * 
 * Template Name:サンプルテンプレート
 * 
 */
get_header();
?>
<?php
  include __DIR__.'index.php';
?>
<?php
  get_footer();
?>
```

```hoge.php
<?php
  function strOutput(){
    echo '<p>hogehoge!</p>'
  }
?>
```

```index.php
<?php
  include __DIR__.'hoge.php';
?>
  <body>
    <div>
      <?php strOutput(); ?>
    </div>
  </body>
```


## 解決策

.phpの拡張子を持つファイルをPHPファイルとして認識してもらうためにApacheの設定を修正しました。
xamppがインストール済だと以下に設定ファイルが配置してあります。

C:\\\xampp\\\apache\\\conf\\\httpd.conf

ファイルを開き、最下部に以下を追記し保存。

```
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
```
Apacheを再起動します。


## 参考資料
参考にさせていただきました！
http://www.8acrewood.com/wordpress/archives/249
Ansibleを使ってサブネットマスクの範囲に対象のIPがあるか調べる

# 概要
`Ansibleを使って、対象のIPがサブネットマスク付きのIPに該当する場合は処理を実行する`を実現したくて、その方法を教えてもらったので備忘録として作成。

## `netaddr`を使う
pythonのライブラリの一つみたいです。
インストールがされていない方は下記コマンドでインストールしてください。

```
# pip install netaddr
```
もし証明書関連のエラーが出てインストール出来ない場合はpip.confファイルを作成して再度インストールを実行してみてください。ここの記事が参考になると思います。

https://qiita.com/agajo/items/73d6f14855da703972e0


## 使ってみる
いただきもののコードですが、下記コードを使って本当にサブネットマスク指定でヒットするか確認してみます。

```
---
- hosts: localhost
  tasks:
    - name: net range test
      debug:
        msg: "{{ item }} は範囲内です"
      loop:
        - 192.168.12.0
        - 192.168.12.1
        - 192.168.12.254
        - 192.168.12.255
        - 192.168.15.0
        - 192.168.15.1
        - 192.168.15.254
        - 192.168.15.255
      when: (item | ipaddr("192.168.12.0/24"))

```

`ipaddr`のところでIPの範囲を指定しています。
上記コードだと、`192.168.12.0〜192.168.12.255`の範囲のIPだけがヒットしてメッセージ付きで出力されるはず。

実行結果（一部抜粋）

```
TASK [net range test] *********************************************************************************************************************************
ok: [localhost] => (item=192.168.12.0) => {
    "msg": "192.168.12.0 は範囲内です"
}
ok: [localhost] => (item=192.168.12.1) => {
    "msg": "192.168.12.1 は範囲内です"
}
ok: [localhost] => (item=192.168.12.254) => {
    "msg": "192.168.12.254 は範囲内です"
}
ok: [localhost] => (item=192.168.12.255) => {
    "msg": "192.168.12.255 は範囲内です"
}
skipping: [localhost] => (item=192.168.15.0)
skipping: [localhost] => (item=192.168.15.1)
skipping: [localhost] => (item=192.168.15.254)
skipping: [localhost] => (item=192.168.15.255)
```

バッチリですね。範囲外は`skipping`で出力されてます。
サブネットマスク付きで書いたら範囲にあるか調べてくれるので非常に便利。


## おまけ
インベントリファイルにサブネット付きでIPを書く方法を教えてもらったのでこちらも記載。

```
[myhosts]
172.17.12.[0:255]
```

この指定でmyhostsグループを指定すれば172.17.12.0〜172.17.12.255が対象になります。こっちは`netaddr`は使っていないのでインストール出来ない訳がある人はこっちを使ってみると良いかも。
iOSアプリのhttp通信を許可する方法

##目的
XcodeでiOSアプリを開発するとき、api通信を挟んでデータを取得する機会がよくあります。しかし、iOS9以降ではhttps通信しかデフォルトで許可されていません。
いざ実際にhttp通信を試みても、下記のようなエラーメッセージが表示され、通信がリジェクトされます。

```
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file.
```

##設定方法
###info.plistの編集
<img width="651" alt="スクリーンショット 2019-08-29 22.43.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/86e39e90-e835-fb8e-ef09-1975e338d23b.png">
**1** まず最初にプロジェクト作成時に自動で作成されるinfo.plistを開きます。そして、上記画像のinformation Property Listの右部の+マークをクリックします。
<img width="687" alt="スクリーンショット 2019-08-29 22.50.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/1a7c3b5a-b961-b276-cc9f-6ac6c7b5ef9b.png">
**2**　次に+ボタンを押したら表示される欄の中から、App Transport Security Settingsを選択します。
<img width="687" alt="スクリーンショット 2019-08-29 22.54.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/3d86d036-1267-5a9e-38aa-9ca701ee2136.png">
**3**次に先ほど選択したApp Transport Security Settingsの左にある、▶︎を上記画像のように▼にクリックして下向きにしてください。その後App Transport Securityの右にある+を押し、Allow Arbitary Loadsを選択してください。
<img width="687" alt="スクリーンショット 2019-08-29 22.58.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357475/51779be6-cd67-ede2-2ddf-6727d0fa7b15.png">
**4**最後に上記画像のように、Allow Arbitary LoadsのValue部分をデフォルトのNOから、YESに変更したら設定完了です。


##最後に
今回はHTTP通信を可能にする方法を紹介しましたが、iOS9移行で通信が暗号化されるHTTPS通信が推奨されており、セキュリティー面なども考慮するともちろんHTTPS通信を使用することが良いと思います。
そのため、できればapiを用意する場合にはhttpsに対応させることが勧められます。
fishでrbenvを使う方法


bashからfishに乗り換えたのだけれども、Rubyのバージョンが上手く切り替わらなかったのでメモ

最初のRubyバージョン

```
 ~/D/G/rails_demo    ruby -v                                    Thu Aug 29 22:37:17 2019
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
```

rbenv initを一回行う

```
 ~/D/G/rails_demo    rbenv init                                 Thu Aug 29 22:38:56 2019
# Load rbenv automatically by appending
# the following to ~/.config/fish/config.fish:

status --is-interactive; and source (rbenv init -|psub)
```

念の為以下コマンドを実行する

```
~/D/G/rails_demo    　status --is-interactive; and source (rbenv init -|psub)
```

ruby　-v を実行してバージョンが切り替わっていたらOK

```
 !  ~/D/G/rails_demo    ruby -v                                Thu Aug 29 22:38:57 2019
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]
```
MacBookだけで、Raspberry Pi3 Model BをUSBキーボード・マウスなしでセットアップする

# このページについて

Raspberry Pi3 Model B をセットアップしようとしたら USBキーボード & USBマウスがなくて困った……となった顛末を個人的な備忘録としてまとめたものです。多分似たようなページ&より良いページは山程あるはず。参考にされる場合には、そちらもどうぞ〜

# 今回の作業で、最終的に必要だったもの

- MacBook に MicroSDカード をつなげるためのSDカードアダプタ
    - 何故かそれすらなくて[microSD専用 USB2.0/1.1フラッシュアダプター](https://www.biccamera.com/bc/item/2031720/)使いましたけど。
- Ethernetケーブル
    - とにかく ネットワーク経由で繋げたいので！

# 試行錯誤
まぁ試行錯誤したときの記録なんで読み飛ばしてください。

## なんでUSBキーボードがなくていいと思った？

以前、Raspberry Pi Zero で遊んだときは、最初から ssh ができたんですよね。なので、まぁ ssh 繋がりゃ、USBキーボードがなくてもなんとかなるだろうと思ったら、最近の Raspberry Pi って、セキュリティ強化とやらで、ssh が無効化されてるんですよね

https://www.raspberrypi.org/blog/a-security-update-for-raspbian-pixel/

```
First, from now on SSH will be disabled by default on our images.
```

Bluetoothキーボードはいくつもあるのに、USBキーボードだけ家にない。こまった……

## とりあえずディスプレイにつないでみた
どうやら、Raspberry Pi3 Model B についてきた SDカードは、pre-installらしいことを聞いた＆HDMIケーブルはついてきたので、画面を眺めてみたら、NOOBS が起動してた。これは RaspberryにOSをインストールするためのインストーラですね。

他のサイトを眺めてると、どうやらUSBマウスがあれば、インストール & ssh の有効化ができそう！

……USBマウスもない orz

# sshを有効化して起動するまで
で、ここからが本番。

## Raspbianをインストールする
基本的に

[Installing operating system images](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

にある通りです。躓くところも特にありませんでした。

https://www.raspberrypi.org/downloads/raspbian/

から、インストールしたい OS のイメージをダウンロード。今回は

- Raspbian Buster with desktop

を選択（子供用のマイクラ用PCにしちゃおうかという思惑も若干あったので）

ダウンロード後、ハッシュ値を確認しておきます。

```
$ shasum -a 256 2019-07-10-raspbian-buster.zip
6a1a5f20329e580d5161a0255b3d4163db6f56c3997e1c3b36bdd51140bd768e  2019-07-10-raspbian-buster.zip
```

サイトにも

```
SHA-256:6a1a5f20329e580d5161a0255b3d4163db6f56c3997e1c3b36bdd51140bd768e
```

とあるので、問題なさそうですね。

```
$ unzip 2019-07-10-raspbian-buster.zip
Archive:  2019-07-10-raspbian-buster.zip
  inflating: 2019-07-10-raspbian-buster.img
```


## SD にイメージを書き込む
[Installing operating system images](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)にある通り、 [balenaEtcher](https://www.balena.io/etcher/) を使いました。

SDカードを MacBook に挿しておきます。その後、balenaEthcerを起動。

<img width="694" alt="balenaEtcher" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/7aae6f64-4744-4fd9-edee-63f497d763f5.png">

Image 選択したら、target も多分選択されているはず。dd コマンドのドキドキ感はありませんが、万が一ってのもあるので、書き込む前はちゃんと "Select target" で選択した Target が正しいかを確認しましょう。間違いないことが確認できたら "Flash!" ボタンを押しましょう。それだけでおしまい。

## sshを有効にする
書き込みが終わったら、そのまま SDカードが MacBook の /Volumes/boot に  mount されているかと思います。

```
$ sudo touch /Volume/boot/ssh
```

として、ssh というファイルを作っておきます。このファイルがあると、Raspberry Pi(正確にはRaspbian）は ssh が有効化されて起動してきます。

これで、OSイメージが出来上がりました。

## 起動！

OSイメージを書き込んだ SDカードを Raspberry Pi に戻し、起動します。mDNS対応だから、IP指定しなくて楽ちんだよね！

```
$ ssh pi@raspberrypi.local
```

繋がらない……作業マシンが Wi-Fi 経由なので、mDNS 周りかな？ともあれ、起動時に raspberry pi は GARP 投げてるはずなので、起動直後であれば MacBook側の ARP Table に載ってるはず……ということで、MacBook で arp -an して、それっぽいマシンの IPを探して

```
$ ssh pi@192.0.2.10
```

ってな感じでログイン。

## pi ユーザのパスワード変えておく

raspberry pi のログインユーザ名とパスワードは、wellknown なので、変えておく（sshがせっかくdefault で無効だったものを有効化したので、忘れずに）

# 最後に
Raspberry Pi3 放置している間に Raspberry Pi4 が出ましたね。まだ日本で使える状態ではないですが、そのうち買っちゃうかも。ともあれ、今回セットアップした Raspberry Pi で、Google home mini との連携とかして、遊ぶ予定。
vee-validate で「特定のフィールドに固有のバリデーションメッセージを設定する

## はじめに
「特定のフィールドの regex バリデーションメッセージを変更したい」という要件が上がってきたんだけど、[vee-validate](https://github.com/baianat/vee-validate)ではどう実現するのが正解がわからなかった。

## やりたいこと
- regex のグローバルで設定しているバリデーションメッセージは変更したくない。
- 特定のフィールドの regex のバリデーションメッセージだけを変更したい。
- 他の検証ルールのメッセージはそのまま。

## やったこと

``` lib/validatormessage.ts
import { Validator } from 'vee-validate';

export function getError(
    validator: Validator,
    field: string,
    ruleMsssageMap: { [rule: string]: string }
): string | null {
    const errors = validator.errors.items.filter((e) => e.field === field);
    if (errors.length > 0) {
        const error = errors[0];
        let isExists = false;
        for (const rule in ruleMsssageMap) {
            if (error.rule === rule) {
                isExists = true;
            }
        }

        if (isExists) {
            return ruleMsssageMap[error.rule];
        } else {
            return validator.errors.first(field);
        }
    }

    return null;
}
```

``` xxx.vue
<template>
  <input
    type="text"
    name="myfield"
    v-model="myfieldValue"
    v-validate="{ required: true, regex: /[1-9]/ }"
  />
  <div v-show="myfieldError">
    {{ myfieldError  }}
  </div>
</template>
<script lang="ts">
import { getError } from '@lib/validatormessage'
...
computed: {
    myfieldError: {
      get: (): string | null => {
        return getError(this.$validator, 'myfield' { regex: 'custom error message.' })
      },
    },
  },
<script>
```

## まとめ
特定のフィールドで、他の検証ルールに影響をあたえず、特定の検証ルールにのみバリデーションメッセージを設定することに成功しました。
みんなはどのように実装しているんだろう…(゜_゜)
【RubyonRails入門】before_action

##1. before_cation とは
　`before_cation`とは、何かのアクションをする前に実行することができるメソッド。例えば、ユーザーがログインしているかどうかを、各ページに移動するごとに確認するときに使用する。


##2. before_cationの簡単な例

・各ページのコントローラーが実行される前に、コントローラ全体を司っているコントローラの`before_action :get_category`が呼ばれる。


```ruby:/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
#　 各ページのコントローラーが実行される前に、
#　 ↓↓↓(get_test)が呼ばれる。
    before_action :get_test
    
    def get_test
        @tests = Test.all 
    end
end
```
【トレーニングデータとテストデータ】データを分割してトレーニングデータで学習し、テストデータでフィッティングを確認

# はじめに
標記の通りです。学習する際にはトレーニングデータとテストデータと分け、トレーニングデータで学習をし、テストデータで学習できているか確認してみます。
使うデータは前にも使ったアボカドデータです。
https://qiita.com/iwasaki_kenichi/items/ea580fd9498ad6950a75

# データ分割の方法
色々あると思いますが、ここではscikit-learnの`train_test_split`を使います。

```python:main1.py

#ライブラリインポート
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,train_size=0.8)
```

ここで、test_sizeはテストデータのサイズです。テストデータは全体の8割としています。

# コード

```python:main1.py

#ライブラリインポート
%matplotlib inline
import numpy as np
from pylab import *
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

#データ読み込み
df = pd.read_csv("hogehoge.csv")

scatter(df["Total Bags"],df["XLarge Bags"])
X = df["Total Bags"]
Y = df["XLarge Bags"]
```

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/74b6fdd0-98f4-b61c-f177-3da1456e03ef.png)


```python:main2.py

X_train, X_test, Y_train, Y_test = train_test_split(X, Y,train_size=0.8)
scatter(X_train,Y_train)

```

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/9bb84605-2b58-20ba-1d16-750a2d0f87c9.png)

```python:main3.py

scatter(X_test,Y_test)

```

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/c0e3906e-6af0-a8d7-09d8-da3569bde9c6.png)


```python:main4.py

p4 = poly1d(np.polyfit(X_train,Y_train,8))
xp = np.linspace(0,20000000,50)
axes = plt.axes()
axes.set_xlim([0,20000000])
axes.set_ylim([0,6000000])
plt.scatter(X_train,Y_train)
plt.plot(xp,p4(xp),c="r")
plt.show()

```

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/1fb80be2-887b-fa8b-32a2-b6a823c4a974.png)


```python:main5.py

xp = np.linspace(0,20000000,50)
#axes = plt.axes()
axes.set_xlim([0,20000000])
axes.set_ylim([0,6000000])
plt.scatter(X_test,Y_test)
plt.plot(xp,p4(xp),c="r")
plt.show()

```

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/1d2f2bc7-11d9-8ec3-cce0-4879af71b44e.png)



```python:main5.py

r2 = r2_score(Y_test,p4(X_test))
print(r2)
#結果は0.6496548856957747

r2 = r2_score(Y_train,p4(X_train))
print(r2)
#結果は0.6945770505912501


```

# おわりに
`X_train, X_test, Y_train, Y_test = train_test_split(X, Y,train_size=0.8)`は覚えられない。なんかコピペバンバン使いそう。
このあたりもサラッと書けるようになりたい。
Transparent Huge Pageの無効化


# THP(Transparent Huge Page)とは

THPはOSが動的にHugePageを割り当てる機能。

## ページとは
メモリは、ページという単位で管理を行う。
1ページの容量は4KBとなる。

## HugePageとは
HugePageは、通常のページに比べて大きな容量を持つページ。
HugePageの1ページの容量は2MB。

HugePageを利用するメリットとして、

1ページの容量が大きいので、ページ数を削減される
→ ページ表エントリへのアクセスする回数が減る
→ 性能向上を図ることが可能となる。

---

## THP(Transparent Huge Page)とは

THPはOSが動的にHugePageを割り当てる機能。

THPではOSにより自動的に大規模ページが、
プロセスに割り当てられるため、大規模ページは手動で予約する必要がない

Huge page サイズは下記で確認可能

```
$ cat /proc/meminfo | grep "Hugepagesize"
```

```
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
```


redis.log

```
# WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. 

This will create latency and memory usage issues with Redis. 

To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. 

Redis must be restarted after THP is disabled.
```
Caffe2のインストールがPyTorchのインストールになっていた．

先日，[DensePose(ECCV2018)](http://densepose.org/)を動かそうとしたときに[公式のインストール方法](https://github.com/facebookresearch/DensePose/blob/master/INSTALL.md)に則ってインストールしようとたところ，Caffe2が必要とのことで[公式サイト](https://caffe2.ai/blog/2018/05/02/Caffe2_PyTorch_1_0.html)を開いたらこんな記述がありました．

> This website is being deprecated - Caffe2 is now a part of PyTorch.
> While the APIs will continue to work, we encourage you to use the PyTorch APIs.

##　PyTorchを簡単に紹介
PyTorchといえばFacebookのAI Researchが提供しているDeepLearningようのフレームワークですね．
2016年に最初のリリースと後発なこともあり海外の研究グループを中心に人気を博しています．

> [PyTorchとは？概要と導入方法をチェックしよう！](https://www.sejuku.net/blog/64175) 
> [PyTorch 入門！人気急上昇中のPyTorchで知っておくべき6つの基礎知識](https://www.codexa.net/pytorch-python/)

TensorFlowとは異なり，動的に計算グラフを定義していくフレームワークでChainerに近いフレームワークとのこと．
最近では[日本語の書籍も充実し始め](https://www.amazon.co.jp/s?k=PyTorch&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_2)日本でも注目が集まりはじめていますね．

## Caffe2がPyTorchPyTorchに組み込まれたという話．
[こちらのプレスリリース](https://caffe2.ai/blog/2018/05/02/Caffe2_PyTorch_1_0.html)を見ると2018年の5月からCaffe2がPyTorchにマージされるとのこと．書いてある内容を簡単に要約すると，  
Caffe2はパフォーマンスの向上とクロスプラットフォームでの開発を目的にしていた．一方で，PyTorchは簡単かつ柔軟にDLの実装を行うこと及び研究での活用を目的にしていた．
しかしここ数年はglooやNNPACKなどさまざまなコンポーネントを共有していた．
そこでユーザーエクスペリエンスを高めるため2つのフレームワークの統合に至った．  
とのこと．

## 結局何が言いたいのか
早い話が(pythonで使う場合)，PyTorchをインストールすればCaffe2も一緒にインストールされますよということ．
実際もうすでにCaffe2の公式サイトでPre-Build Binaryのインストール用のコマンドが以下になっています．
CPU only
`conda install pytorch-nightly-cpu -c pytorch`
CUDA9 & cuDNN7
`conda install pytorch-nightly -c pytorch`
CUDA8 & cuDNN7
`conda install pytorch-nightly cuda80 -c pytorch`

その他，細かいCaffe2からの修正点等は先程の[記事](https://caffe2.ai/blog/2018/05/02/Caffe2_PyTorch_1_0.html)などをご覧ください．

簡単にインストールできるようになったのはいいですが，Caffe2をインストールするためにPyTorchをインストールするというのはなんともややこしいですね．
なおPyTorchはCUDAのバージョンもcuDNNのバージョンも7以上でなければならないようです．インストールの際にはお気をつけを．
【備忘録】Windowsタスクスケジューラのタスクを削除できない問題の解決方法

Windowsタスクスケジューラでタスクが削除できなくなった。自分で作ったのに「ユーザーアカウントにタスクを削除する権限がありません」と言われてイライラ。まさに[この記事](https://social.technet.microsoft.com/Forums/azure/ja-JP/4594694d-4bb1-4b7a-b970-bc4dbd7e4082/12479124731246312473124651247212517125401252112398124791247312?forum=win10itprogeneralJP)の状態。



# 解決方法
1. タスクのスケジュールの実体が`C:\windows\system32\Tasks`に保存されているので、まずはそれを削除。
2. タスクスケジューラでタスクを削除。
macOS に Homebrew で MySQL 8.0 をインストールしてデータベースを作成する

## Homebrew で MySQL をインストール

```
$ brew install mysql
(中略)
We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start
==> Summary
🍺  /usr/local/Cellar/mysql/8.0.17: 284 files, 272.5MB
```

## MySQL サーバを起動

brew services start mysql で MySQL サーバを起動する。

```
$ brew services start mysql
==> Tapping homebrew/services
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-services'...
(中略)
==> Successfully started `mysql` (label: homebrew.mxcl.mysql)
```

## MySQL の初期設定を実施

mysql_secure_installation で対話型の初期設定を開始する。

```
$ mysql_secure_installation
```

いくつかの設定について尋ねてくるのでそれに答えていく。
MySQL root ユーザーのパスワードもここで設定できる。

## データベースを作成

mysql コマンドを実行する。

```
$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.17 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
```

CREATE DATABASE でデータベースを作成する。
ここでは testdb という名前のデータベースを作成する。

```
mysql> CREATE DATABASE IF NOT EXISTS testdb
    -> DEFAULT CHARACTER SET utf8mb4
    -> DEFAULT COLLATE utf8mb4_general_ci
    -> ;
Query OK, 1 row affected (0.01 sec)
```

## ユーザーを作成

CREATE USER でユーザーを作成する。
ここではユーザー名に java、パスワードに cafebabe を指定する。

```
mysql> CREATE USER 'java'@'localhost' IDENTIFIED BY 'cafebabe';
Query OK, 0 rows affected (0.04 sec)
```

ユーザーに権限を設定する。

```
mysql> GRANT CREATE, DROP, SELECT, INSERT, UPDATE, DELETE ON testdb.* TO 'java'@'localhost';
Query OK, 0 rows affected (0.01 sec)
```

## 参考資料

- [MySQL :: MySQL 8\.0 Reference Manual :: 10 Character Sets, Collations, Unicode](https://dev.mysql.com/doc/refman/8.0/en/charset.html)
- [MySQL :: MySQL 8\.0 Reference Manual :: 6\.2\.4 Specifying Account Names](https://dev.mysql.com/doc/refman/8.0/en/account-names.html)
- [MySQL :: MySQL 8\.0 Reference Manual :: 13\.7\.1 Account Management Statements](https://dev.mysql.com/doc/refman/8.0/en/account-management-sql.html)
- [MySQL :: MySQL 8\.0 Reference Manual :: 13\.7\.1\.3 CREATE USER Syntax](https://dev.mysql.com/doc/refman/8.0/en/create-user.html)
- [MySQL :: MySQL 8\.0 Reference Manual :: 13\.7\.1\.6 GRANT Syntax](https://dev.mysql.com/doc/refman/8.0/en/grant.html)
Vue.jsのローカル環境での使用方法

#初めに
　とあるインターン先でVue.jsを使うことになり、その勉強のメモのために記事を投稿してみました。
まず、Vue.jsとはJavascriptのフレームワークのことで、個人的な意見として、他のフレームワークに比べて内容が理解しやすいと感じました。
　Vue.jsの勉強には[jsfiddle](https://jsfiddle.net/)という無料で使えるサイトを使う場合もありますが、今回は自分のテキストエディタで使用する方法を解説していきます。

#方法
　まずは、[Vue.jsの公式サイト](https://jp.vuejs.org/index.html)にアクセスし、ページ内でインストールと検索してください。その後、下のほうに移動すると、[直接読み込み](https://gyazo.com/e10ef82ac3b27488f420fdabe529bbf2)
あるため、開発バージョンをダウンロードしてください。
　ここからは、エディタを使っていきます。先ほどダウンロードしたものと同じ場所にHTMLファイルを作成します。そして、そのHTMLファイルのbodyタグ内の1番初めに、

```
<script src = "vue.js"></script>
```

bodyタグ内の最後に

```
<script></script>
```

を入れ、この中にVue.jsのインスタンスを作成していきます。例として、

```
new Vue({
            el: '#app',
            data: {
                url: 'https://jp.vuejs.org/',
                toggle: true,
                languages: ['Javascript' , 'Ruby' , 'Python']
            }
        })
```

と記述します。では、実際に動くか確かめてみましょう。先ほど記述した2つのコードの間に

```    
<div id = "app">
    <p v-if = "toggle">
        <a v-bind:href="url">Vue.js</a>
    </p>

    <ul>
        <li v-for = "language in languages">
            {{ language }}
        </li>
    </ul>

    <p>
        <input type = "text" v-model = "message">
    </p>
</div>
```

と入れると、[結果](https://gyazo.com/00e289a22db770b5e24b5f38371ef69b)のように表示されるので、成功してといえます。

#終わりに
記事作成には不慣れなもので、至らない点が多々あると思いますので、何かご意見等があればご連絡ください。
Hello_Kibana

##１．目的

AWS上にKibanaを導入して外部アクセスできる状態にする。


## ２．前提条件

AWS環境にて、下記スペックのECインスタンスを作成する。


<img width="1475" alt="スクリーンショット 2019-08-29 21.38.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/46e23d0d-b04f-4fa0-8294-7fbde44f3d91.png">

- クラスタ外部へのサービスに 9200/tcp、内部のコミュニケーションに 9300/tcp のポートを使用します。また、Kibana自身は5601/tcp ポートへのアクセスも許可する必要があるため、下記のようなセキュリティルールを設定します。
- Source IPの設定はANY（0.0.0.0/0）にしましたが、ご認識の通りどこからでもアクセス可なので非推奨です。





## ３．試したこと


Javaをインストールする

```
yum install java-1.8.0-openjdk
yum install java-1.8.0-openjdk-devel
```

鍵を取得する

```
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
```

リポジトリ情報を記述する

```
sudo cat <<EOF >> /etc/yum.repos.d/elastic.repo
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
```

インストールを実行する

```
sudo yum install kibana
sudo yum install elasticsearch
```



/etc/kibana/kibana.ymlを編集する。(-)は編集対象。（＋）は編集結果。

```
(-)#server.port: 5601
(+)server.port: 5601
(-)#server.host: localhost
(+)server.host: "0.0.0.0"
(-)#elasticsearch.url: "http://localhost:9200"
(+)elasticsearch.url: "http://localhost:9200"
```


Kibanaの起動設定（Default=ONにも設定）

```
systemctl start kibana
systemctl status kibana
systemctl enable kibana
systemctl status kibana
```

elasticsearchの起動設定（Default=ONにも設定）

```
systemctl start elasticsearch
systemctl status elasticsearch
systemctl enable elasticsearch
systemctl status elasticsearch
```


https://パブリックIPアドレス：５６０１で接続するとアクセスができる。


<img width="1674" alt="スクリーンショット 2019-08-29 21.34.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482612/a11e532d-0414-155d-f962-1ca540d690d7.png">



以上

## ４．Link

- [Kibanaのインストール](https://www.ipride.co.jp/blog/2976)
- [ElasticSearchのインストール](https://www.ipride.co.jp/blog/2975)
- [Kibanaの外部公開方法](https://www.elastic.co/jp/blog/setting-up-es-cluster-on-ec2)
Docker+LaravelでMySQLを使えるようになるまでのメモ

## 環境
OS: macOS Mojave 10.14.6
Docker: version 19.03.1


## Laradockのダウンロード

ディレクトリを作成後、Laradockをリポジトリから持ってくる

```:host
$ mkdir laradock_tutorial
$ cd laradock_tutorial
$ git clone https://github.com/Laradock/laradock.git
Cloning into 'laradock'...
remote: Enumerating objects: 9107, done.
remote: Total 9107 (delta 0), reused 0 (delta 0), pack-reused 9107
Receiving objects: 100% (9107/9107), 8.36 MiB | 4.38 MiB/s, done.
Resolving deltas: 100% (4891/4891), done.
```
## MySQLの設定を変更
laradockディレクトリに移動、.env-exampleをコピーしてリネーム
今回はMySQLのバージョンは5.7, DB名はtest, ユーザー名はuser, パスワードはなしとする。

```:host
$ cd laradock
$ cp env-example .env
$ vi .env

# 240行目~
MYSQL_VERSION=5.7
MYSQL_DATABASE=test
MYSQL_USER=user
MYSQL_PASSWORD=
```

## コンテナを初期化する
（かなり時間かかります）

```:host
$ docker-compose up -d nginx mysql workspace phpmyadmin
```
##  Laravelアプリケーションを作成
Workspaceコンテナに入ります。
Laravel5.7でsampleという名前のアプリケーションを作る(時間かかります)
途中で、Do not run Composer as root/super user! と出てくるが気にしない

```:host
$ docker-compose exec workspace bash
```

```:workspace(docker)
$ cd laradock
$ composer create-project "laravel/laravel" sample --prefer-dist "5.7.*"
Application key set successfully.
```

## データベースの接続を設定する
コンテナ内でsampleアプリケーションが出来たのを確認してから、sampleディレクトリに移動

```:workspace(docker)
$ ls
laradock  sample
$ cd sample
$ vi .env

# 12行目~ ホストのDB設定と同じにすること。
DB_DATABASE=test
DB_USERNAME=user
DB_PASSWORD=
```
## sampleアプリケーションとLaradockの関連付け
```:workspace(docker)
$ cd ../laradock
$ vi .env

# 7行目~
APP_CODE_PATH_HOST=../sample

# workspaceコンテナから抜ける
$ exit
```

## DB作成用ファイルを編集
```:host
$ cd mysql/docker-entrypoint-initdb.d
$ cp createdb.sql.example createdb.sql
$ vi createdb.sql

# 新しく記入
CREATE DATABASE IF NOT EXISTS `test` COLLATE 'utf8_general_ci' ;
GRANT ALL ON `test`.* TO 'user'@'%' ;
```

## DBの作成とユーザーの関連付け

```:host
$ cd ../..
$ docker-compose exec mysql bash
```

mysqlコンテナに入る。

```:mysql(docker)
$ mysql -u root -p < /docker-entrypoint-initdb.d/createdb.sql
Enter password: (rootと入力)

# 作成されたか確認
$ mysql -u user -p
Enter password: (そのままEnter)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               | ← testデータベースが作成されている。
+--------------------+

mysql> exit
Bye
$ exit
```

## 動作確認
sampleディレクトリに移動して、マイグレーションできるか確認。
これで動けばMySQLを使うことが出来ます。

```:host
$ cd ../sample/
$ php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
```

最後にサーバーが起動できているかを確認します。

```:host
$ php artisan serve
```

http://localhost:8000 にアクセスして以下のページが表示されていれば成功です。<img width="1094" alt="スクリーンショット 2019-08-29 21.39.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416385/0f067fa9-7920-2c42-cef3-0dea0b3d0d9f.png">

## 参考にさせていただいたもの
・ https://qiita.com/yanagikouta/items/dcd7ce16b7fb7353e086
・ https://techblog.scouter.co.jp/entry/2019/01/11/133508