OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelのfactory(faker)で3階層以上のテストデータを作る

この記事は移行しました！[最新の内容はこちら](https://naoqoo2.github.io/blog/Laravel%E3%81%AEfactory%28faker%29%E3%81%A73%E9%9A%8E%E5%B1%A4%E4%BB%A5%E4%B8%8A%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B/)をご覧ください😀

Laravelのファクトリ便利ですよね。
fakerでテストデータ作るのもラクチンです。

ただ、`User->Post->Comment`のような３階層構造のリレーションモデルを作るときに悩みました。

## 結論

いろいろと試行錯誤した結果、今後はこのコードで作成しようと思います。

```php:seederまたはtestcode
factory(User::class, 3)->create()->each(function ($user) {
    factory(Post::class, 2)->create(['user_id' => $user->id])->each(function ($post){
        factory(Comment::class, 3)->create(['post_id' => $post->id]);
    });
});
```

下記リレーション構造を持つUserが3つ出来上がります。

> - User
>     - Post
>         - Comment
>         - Comment
>         - Comment
>     - Post
>         - Comment
>         - Comment
>         - Comment

### メリット

- 書き方が統一されている
- 何階層でもOK
- 数値部分を変えれば各件数も思いのまま

### デメリット

- 親IDのカラム名漏れ（でも変更しないだろうし、テストコードだし、いいよね？）

## 経緯

いつもお世話になっている[ReaDoubleのサンプルコード](https://readouble.com/laravel/5.4/ja/database-testing.html#relationships)を参考にしたのですが、いろいろ問題がありました。

### サンプルコードでは2階層までは作れたが

```php:ReaDoubleのsample
$users = factory(App\User::class, 3)->create()->each(function ($u) {
    $u->posts()->save(factory(App\Post::class)->make());
});
```

- 親はcreate、子はmakeでわかりずらい
- Postを複数作りたいときはsaveManyにしないといけない  
`$user->posts()->saveMany(factory(Post::class, 2)->make());`

### 3階層以上はどうすればいいのかわからなかった

```php:試行錯誤したがエラーとなるコード
factory(User::class, 2)->create()->each(function ($user) {
    $user->posts()->saveMany(factory(Post::class, 2)->make()->each(function ($post) {
        $post->comments()->saveMany(factory(Comment::class, 2)->make());
    }));
});
```

- 親IDがNULL的なエラーが発生する・・・。  
`SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'post_id' cannot be null`

### ファクトリ定義の中で作成する方法もあったけど、、

```php:ReaDoubleのsample
$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => function () {
            return factory(App\User::class)->create()->id;
        }
    ];
});
```

- 常に親モデルをcreateすることになってしまう
- そもそもファクトリ定義はモデル毎に分離しておきたい
- 3階層以上だと出来てもカオスになりそう


### ということで

冒頭のコードにたどり着きました。
他に良い方法がありましたら教えてください。

それではステキなLaravelライフを。
TensorFlowで１次関数を予測(1)

チュートリアルの１次関数の予測をネタとしていろいろ試してみます。

##環境
python 3.5.2
tensorflow 0.12.1

##下記の１次関数を予測します
```math
y = 0.5x + 10
```
予測する式が直線（y = ax + b）とわかっている上で 
最終的にこの式の傾きaと切片bを求ます。

##ソースコード（全文）

```py
import tensorflow as tf
import numpy as np

## 学習データ作成（x座標をランダムに作成(0.0〜1.0を100個)
x_data = np.random.rand(100).astype(np.float32)
# y座標を生成 (y = 0.5x + 10)
y_data = 0.5 * x_data + 10

## モデルを作成（y_data = W * x_data + b となる W と b の適正値を見つけます。
W = tf.Variable(tf.zeros([1]))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

## 損失関数を作成（最小二乗法を使用
loss = tf.reduce_mean(tf.square(y - y_data))

## 最適化アルゴリズムを指定（勾配降下法で損失関数を最小化
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

## パラメータを初期化（Variableを使用する場合必要らしい
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

## 学習する
for step in range(200):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))

```

Wが重み、bがバイアスです。
また、重みを傾きaに、バイアスを切片bに対応させています。

##結果

```
0 [ 5.35188961] [ 10.25884247]
20 [ 1.46414196] [ 9.46684837]
40 [ 0.7577793] [ 9.85745335]
60 [ 0.56892151] [ 9.96188736]
80 [ 0.51842672] [ 9.98980999]
100 [ 0.50492722] [ 9.99727535]
120 [ 0.50131762] [ 9.99927139]
140 [ 0.50035214] [ 9.99980545]
160 [ 0.50009394] [ 9.99994755]
180 [ 0.50002551] [ 9.99998569]
```

トレーニングを重ねることで正解に近づいていくのがわかります。


##学習データを変えてみる

下記は(0.0〜1.0)の間でランダムな数値を作成します。

```py
x_data = np.random.rand(100).astype(np.float32)
```

これをもう少し大きい値に変えてみます。
下記は(0〜100)の間でランダムな数値を作成します。

```py
x_data = np.random.randint(0, 100, 100).astype(np.float32)
```

実行してみます。

```
0 [ 2490.00512695] [ 37.44499969]
20 [ nan] [ nan]
40 [ nan] [ nan]
60 [ nan] [ nan]
80 [ nan] [ nan]
100 [ nan] [ nan]
120 [ nan] [ nan]
140 [ nan] [ nan]
160 [ nan] [ nan]
180 [ nan] [ nan]
```

~~壊れました。~~
値が発散してしまうと「Not A Number」になるようです。
学習データの値を大きくしたことで損失関数の微分値が大きくなったのだとおもわれます。
学習率を下げてみます。

```py
optimizer = tf.train.GradientDescentOptimizer(0.0001)
```

いろいろ試しましたがあまりうまく行きません。
学習回数を増やしたりもしましたがこの結果です。


```
19900 [ 0.54181725] [ 7.06084156]
19920 [ 0.54176587] [ 7.06445599]
19940 [ 0.54171455] [ 7.06806087]
19960 [ 0.54166323] [ 7.07166576]
19980 [ 0.54161209] [ 7.07526255]
```

最適化アルゴリズムを変えてみます。
イケているらしいAdamで最適化してみます。

```py
optimizer = tf.train.AdamOptimizer(0.5)
```

```
0 [ 0.5] [ 0.5]
20 [ 0.4940598] [ 1.87242627]
40 [ 0.65283048] [ 3.86862636]
60 [ 0.57364327] [ 5.61097527]
80 [ 0.54375488] [ 7.12018442]
100 [ 0.52782118] [ 8.26023579]
120 [ 0.51555306] [ 9.03210545]
140 [ 0.50718832] [ 9.50679207]
160 [ 0.5034216] [ 9.77309036]
180 [ 0.50139517] [ 9.90730953]
```

うまく予測できました。


学習データを(0.0〜1.0)に戻してみます。

```py
x_data = np.random.rand(100).astype(np.float32)
```

```
0 [ 0.49999994] [ 0.5]
20 [ 7.49428892] [ 8.05118752]
40 [ 4.68005848] [ 7.44039011]
60 [ 3.54744887] [ 8.34731293]
80 [ 2.41113639] [ 8.924716]
100 [ 1.63474452] [ 9.39722347]
120 [ 1.08201456] [ 9.66472244]
140 [ 0.78602862] [ 9.84842777]
160 [ 0.61798155] [ 9.93378735]
180 [ 0.54255277] [ 9.97624016]
```

いい感じです。


##まとめ
・学習データの大きさと学習率の関係は重要っぽい
・最適化アルゴリズムにAdamを使うことで様々な学習データに適応できた
JavaScriptでファイル名順にソートする


Finderみたいに、ファイル名一覧を
frame1.png, frame002.png, ……, frame11.png, …
という流れに、数値順にソートしたい

通常のソートでは10などが2よりも先に来てしまうので、対応する

```js
const sorted = filenames.sort((a, b) => {
  const a1 = parseInt(a.replace(/[^0-9]/g, ''), 10);
  const b1 = parseInt(b.replace(/[^0-9]/g, ''), 10);
  const a2 = (a1 !== a1) ? 0 : a1;
  const b2 = (b1 !== b1) ? 0 : b1;

  if (a2 > b2) {
      return 1;
  } else if (a2 < b2) {
      return -1;
  }
  return 0;
});
```

parseIntははじめの文字が数字でないとNaNを返すようなので、先に数字以外を置換してからparseIntしている

```js
a1 !== a1
```

はNanのときのみ成立するのでこれを利用している

注意点としては、数字が入ってない場合の順番が不定なので、時によって入れ替わる可能性があること。
対処したい場合は、一番下の `return 0` のところを `return a < b` とかにしておくとよい。
Excel Vba をつかって、フォルダ内のファイル一覧を全て取得する。

# 懸念（誰か教えてください）
Excel Vba にて、再起って使ってもいいの？笑
したり顔で「32bit版だとリソース不足になりやすい」とか何とか言われたことが汗

# VBAのエラーは処理しづらい汗



```vba
'
' 使い方
' 以下の Test01 を標準モジュール内に記述、イミディエイトより直接起動する。
'
Public Sub Test01()
    Dim wPaths$()
    Call createFilelist(Environ("USERPROFILE"), wPaths)
    Dim i&
    For i = LBound(wPaths) To UBound(wPaths)
        ThisWorkbook.Sheets("Sheet1").Cells(i + 1, 1) = wPaths(i)
    Next
End Sub


'
' サブフォルダ内のファイル一覧を作成する
' 
Public Sub createFilelist(ByRef argSearchPath$, ByRef argFileList$())

    Dim FSO             As Object
    Dim wSubFolder      As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    On Error GoTo End_Of_createFilelist
    For Each wSubFolder In FSO.GetFolder(argSearchPath).SubFolders
        Call createFilelist(wSubFolder.Path, argFileList$)
    Next

    Dim wFile           As Object
    For Each wFile In FSO.GetFolder(argSearchPath).Files
        Call extendArray(argFileList, wFile.Path)
    Next

    Set FSO = Nothing
End_Of_createFilelist:
    On Error GoTo 0
End Sub

'
' 配列項目を拡張し、第2引数(Option)を追加する
Public Sub extendArray(ByRef list As Variant, Optional addItem = Null)
    Dim i&
    On Error Resume Next
    i = UBound(list)
    If Err.Number = 0 Then
        ReDim Preserve list(UBound(list) + 1)
    Else
        ReDim Preserve list(0)
    End If
    On Error GoTo 0
    If IsNull(addItem) = False Then
        If IsObject(addItem) = True Then
            Set list(UBound(list)) = addItem
        Else
            list(UBound(list)) = addItem
        End If
    End If
End Sub
link > What smooth approximations to the ReLu function are available in TensorFlow? > Softplus / 別のsoftmax

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowを使った100 input nodes, 100 output nodesの学習について検討中。

"function approximation"をキーワードとして以下を見つけた。
[What smooth approximations to the ReLu function are available in TensorFlow?](https://www.quora.com/What-smooth-approximations-to-the-ReLu-function-are-available-in-TensorFlow) @ Quora

回答としてSoftplusというものが紹介されている。

詳細な回答をしているRahul Panicker氏によると softmaxと関係しているようであるが、それはTensorFlowなどでよく耳にするsoftmax関数とも違うようだ。

> Note: Softmax, as described here is the classical softmax found in optimization literature (like relu, it is a convex function). This is different from (though related to) the softmax function available as a builtin cost function for classification in Tensorflow.

回答によるとReLUはtを用いた近似式となり、t=1の場合がsoftplus。そして、ReLUがsoftplus(t=1)で近似できるのは、$e^{tx}$のtはweightで、$1/t$のtはbiasで扱えるとのこと。
Awesomeのキーバインドをtmuxに寄せたらめっちゃ快適になった

自分の作業環境は、

- Arch Linux
- Awesome (Linuxのタイル型ウィンドウマネージャー)
- ターミナルで `tmux` + `Vim` を使って作業
- マルチディスプレイ (13インチノートPC + above 24インチディスプレイ)

となっている。

Awesomeはほぼ全てのウィンドウ操作をキーボードで行えるのが魅力だが、デフォルトのキーバインドは正直使いにくい。

デフォルト厨なのでそのまま使っていたが、ちゃんと設定したら格段に使いやすくなった。

特に `tmux` と一緒にすることで、GUIとCUIで頭の切り替えが不要になった。

tmux との対応関係は


| tmux | Awesome | 備考| 
|:-:|:-:|:-:|
| ペイン  |  ウィンドウ ||
| ウィンドウ  | タグ  | 仮想ワークスペースみたいな感じ |

# 設定

こうなるようにした。

- `modkey + Right` 現在のウィンドウを右に拡大
- `modkey + Left` 現在のウィンドウを左に拡大
- `modkey + n` 右のタグを選択
- `modkey + p` 左のタグを選択
- `modkey + j` モニタ切り替え
- `modkey + x` アプリランチャー
- `modkey + i` `chromium` を起動
- `modkey + s` スクリーンショットを撮影
- `modkey + b` Emacsの `anything` 的ウィンドウ切替
- `modkey + u` `Urgent` タグに飛ぶ
- `modkey + z` ウィンドウ最大化
- `modkey + o` 現在のウィンドウをもう一つのモニタに移す
- `modkey + c` ウィンドウを閉じる
- `modkey + C-s`  PCをサスペンド
- `modkey + C-l`  PCをロック

何となくEmacsっぽくしている。

最後のはこれです。
[dmenuとwmctrlで、選択的インターフェースなウィンドウ切り替えを実現した
](http://qiita.com/acro5piano/items/13790704a41b5871a244a244)

```lua:~/.config/awesome/rc.lua
-- ...

-- {{{ Key bindings
globalkeys = awful.util.table.join(
    -- Layout
    awful.key({ modkey,           }, "Right",     function () awful.tag.incmwfact( 0.05)    end),
    awful.key({ modkey,           }, "Left",     function () awful.tag.incmwfact(-0.05)    end),

    -- Switch
    awful.key({ modkey,           }, "p", awful.tag.viewprev       ),
    awful.key({ modkey,           }, "n", awful.tag.viewnext       ),
    awful.key({ modkey,           }, "j", function () awful.screen.focus_relative( 1) end),
    awful.key({ modkey,           }, "k", function () awful.screen.focus_relative(-1) end),
    awful.key({ modkey,           }, "u", awful.client.urgent.jumpto),

    -- Standard program
    awful.key({ modkey,           }, "b", function () awful.util.spawn("select_window") end),
    awful.key({ modkey,           }, "s", function () awful.util.spawn("xfce4-screenshooter") end),
    awful.key({ modkey,           }, "i", function () awful.util.spawn("chromium") end),
    awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),

    awful.key({ modkey, "Control" }, "r", awesome.restart),

    -- Hardware config
    awful.key({                   }, "XF86MonBrightnessUp",      function () awful.util.spawn("xbacklight +5") end),
    awful.key({                   }, "XF86MonBrightnessDown",    function () awful.util.spawn("xbacklight -5") end),
    awful.key({ modkey, "Control" }, "s", function () awful.util.spawn("sudo pm-suspend") end),
    awful.key({ modkey, "Control" }, "l", function () awful.util.spawn("xscreensaver-command -lock") end),

    -- Prompt
    awful.key({ modkey },            "x",     function () awful.util.spawn("dmenu_run") end)
)

-- ...
```
Elixirのbrew installでさっそくこけた


[Elixir初心者向けハンズオン](https://beam-lang.connpass.com/event/47050/)でElixirに入門してみてます。

ちょっと前にhomebrewが壊れちゃってたみたいだったので修正対応したメモです。

(普通に僕の環境のhomebrewがおかしかっただけだと思うので参考になるか分からないですが)


```
$ brew install elixir
Updating Homebrew...
・
・
・
==> Installing dependencies for elixir: wxmac, erlang
Error: You must `brew link libpng libtiff` before wxmac can be installed
```

と出てこけました。 **You must `brew link libpng libtiff`**と出てるのでそのまま実行すると

```
$ brew link libpng libtiff
Linking /usr/local/Cellar/libpng/1.6.28...
Error: Could not symlink lib/pkgconfig/libpng.pc
/usr/local/lib/pkgconfig is not writable.
```

[Homebrewのエラーを治す](http://qiita.com/cubdesign/items/176e655a14d47b374a75)

などを参考に権限を直して

```
$ sudo chown $USER /usr/local/lib/pkgconfig
```

再実行すると

```
$ brew link libpng libtiff
Linking /usr/local/Cellar/libpng/1.6.28... 18 symlinks created
Linking /usr/local/Cellar/libtiff/4.0.7_2... 96 symlinks created
```

うまくいったっぽいのでもう一度チャレンジ

```
$ brew install elixir

・・・

Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink share/aclocal/wxwin.m4
/usr/local/share/aclocal is not writable.

You can try again using:
  brew link wxmac
```

また同様のエラーがでたので権限などを修正

```
$ sudo chown $USER /usr/local/share/aclocal
$ brew link wxmac
Linking /usr/local/Cellar/wxmac/3.0.2_4... 74 symlinks created
```

再チャレンジ

```
$ brew install elixir
```

これでやっとインストールできました。

```
$ elixir --version
Erlang/OTP 19 [erts-8.2.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.4.2
```

##まとめ

例のエラーがでたら

```
$ sudo chown $USER /usr/local/lib/pkgconfig
$ sudo chown $USER /usr/local/share/aclocal
$ brew link libpng libtiff
$ brew link wxmac
```

を実行してから`brew install`すれば良さそう
重複する Git submodule を効率的にクローンするスクリプトを書いた

Git のレポジトリーの中にサブモジュールがあるとき、`git submodule update --init --recursive` するとそれぞれのサブモジュールのレポジトリーがローカルにクローンされます。ここで、複数のサブモジュールが同じリモートレポジトリーを参照してゐる[^situation]場合、サブモジュールごとに別別にクローンされるので非効率ですよね。といふわけで、同じリモートレポジトリーを一つのローカルレポジトリーにまとめながらクローンするシェルスクリプトを書きました。 [git-populate-submodules](https://github.com/magicant/settings/blob/master/bin/git-populate-submodules) といふ名前で GitHub に置いてあります。

[^situation]: 例へば iOS アプリ開発で、Carthage を使って複数のライブラリーを取り込む場合に、どちらのライブラリーにも共通の別ライブラリーへの依存があったりすると、その共通ライブラリーが孫サブモジュールとして合計 2 回取り込まれることになります。

戦略は、サブモジュールをローカルにクローンしようとする時に先づ `~/.gitclones` といふディレクトリーの中に bare レポジトリーとしてクローンしておいて、その後サブモジュールとなるディレクトリーの中に `git worktree add` コマンドを使って作業ディレクトリーを作成します。 `~/.gitclones` の中はサブモジュールの名前[^reponame]ごとに bare レポジトリーの名前を決める様にすると、同じリモートレポジトリーを参照するサブモジュールが必ず `~/.gitclones` 内の同じローカルレポジトリーにクローンされることになります。既にローカルにクローンしたレポジトリーを何度も再クローンしない様に調整すれば完成です[^work]。

[^reponame]: 正確には、リモートレポジトリーの URL の最後の部分

[^work]: といっても、クローン済のものを再クローンしない様にするのは Git がほとんど勝手にやってくれます。

スクリプトの冒頭を見れば使ひ方は分かると思ひますが (`git submodule update --init --recursive` の代はりに `git-populate-submodules -r` を実行すればよいです)、リモートレポジトリーの URL が https://github.com/... の場合はデフォルトで SSH でクローンする様に URL を設定し直すのでご注意[^ssh]。また既に普通に `git submodule update` でクローンしたサブモジュールがある場合はそれらを一旦手動で消す必要があります[^deinit]。

[^ssh]: HTTPS よりも SSH の方が筆者の環境では好都合だからといふ個人的な理由による

[^deinit]: `git submodule deinit --all` の後 `.git/modules` ディレクトリーを消せばよい。(もちろんローカルのサブモジュールだけにあるオブジェクトは失はれる)
link > TensorFlow howto: a universal approximator inside a neural net by Morgan

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowを使った100 input nodes, 100 output nodesの学習について検討中。

"Universal approximation theorem"というのが気になる。

Morgan氏による以下の記事を見つけた。

https://blog.metaflow.fr/tensorflow-howto-a-universal-approximator-inside-a-neural-net-bb034430b71e#.oqlbq282n

以下、抜粋。

> Basically, this theorem states that (without all the nitty-gritty details):
- for any continuous function f defined in R^n …
- … you can find a wide enough 1-hidden layer neural net …
- … that will approximate f as well as you want on a closed interval

意訳「n次元のR(実数)空間にて定義される関数fは、非常に大きな１層のhidden layerを持つneural netで再現できる」

そのコードが紹介されている。

> Finally, notice the existence of the Relu function. We could have used a lot of different functions instead of it but it doesn’t really matter for the theorem as long as it is an increasing function: it only matters for the “speed of learning”.

ここではReLUを使っていて、学習速度に影響するとある。

> “universal approximator” (UA).

...

> the sine function

...

hidden_dimというパラメータでhidden layerのneurons数を設定できるコードが紹介されている。

> YET our UA implementation has a huge drawback, we can’t reuse it if the input_dim starts to vary…

...

2つ目の例も紹介されていて、activation functionそのものをneural networkで処理しているという部分（以下）が気になった。

> So we have a neural network using a neural network as an activation function

...

> I’m using the ELU function inside the second UA

ELU functionは未消化。

...

> TensorFlow best practice series

関連記事も紹介されている。
AWS Labma Nodejs 最小構成で作るAPI開発環境

# はじめに

Serverlessなどの便利なものがありながらも乗り遅れてどうしたらいいか分からない人（自分）向けのトピックです。
タイトルにAPIが入ってるのはAPI Gatewayと連携するのを前提にしているからです。

# TL;DR

* npm runコマンドを利用して簡単にZIP化してアップロードすると楽チン

# 環境構築

自分はhomebrew+nodebrewを使って環境構築しました（すでにされていました）
Nodejsが使えるようにするトピックはいっぱいあり今回の趣旨にしたい部分ではないので割愛します。

**AWS Lambdaは執筆時点ではv4.3.2でした（2017/03）**

# プロジェクトの設定

### まずはプロジェクトを作成します

```cmd
mkdir node_projects
cd node_projects
npm init
```

以上のコマンドを打って、聞かれる質問に適宜答えるとプロジェクト作成完了です

### 簡単にアーカイブできるようにする

以下の例のようにscripts/zipを追加します。
これによって**npm run zipとするとzipファイルが作成されるようになります

```json
{
  "name": "node_projects",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "zip": "zip -r function.zip index.js package.json node_modules*"
  },
  "author": "",
  "license": "ISC"
}
```

### Lamdbdaからの呼び出し設定

Lambda用にアップロードするファイルを作成することが出来ました。
ただしこのままでは実行できません。

どういう設定が必要か？それは、Lambda上のハンドラという項目です。
ハンドラという項目は設定タブの中に入っています。

この部分と、実行させたい*.jsを紐付ける必要があります。
ファイル名の拡張子をなくし部分、例えばindex.jsであればindexです。
このファイル名+.handlerと言う風にします。

```
index.handler
```

今度は、ソースファイルの方を設定します。
今度はハンドラに設定したhandlerに対応する部分を作ります。


```js

export.handler = (event, context, callback)=>{
  callback(null, "Hello World";
};
```

最低限だとこのような感じになると思います。
export.handlerという部分に関数オブジェクトを代入しています。
Lambdaからはこの部分が呼び出されるため、上記のようにします。
また、実際にコーディングしていく際には、この関数オブジェクトの中に書くことになると思います。

以上です。おつかれさまでした
Swift3のネイティブアプリとJavascriptの通信

#Javascript作成
適当にサーバーに配置

```html:communication.html
<html>
<head>
<tite></title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script>
//こちらの関数はSwiftから呼ばれる
function fromSwift() {
    $('p').text('Swiftから呼ばれてるよ！！！！');
}

(function() {
    $(window).load(function() {
       //window.location.hashは、URLの「#」記号の後の部分を取得、もしくは、設定するプロパティ。これでSwiftからのデータ取得
       var swiftData = window.location.hash;
       $('p').text('Swiftからもらった：' + swiftData);

       $('.btn').on('click', function() {
            //以下のURLをSwiftから取得
            window.location = "fromJavascript://hello";
       });
    });
})(jQuery)
</script>
<body>
<h1>Swift3のネイティブアプリとJavascritpの通信</h1>
<p></p>
<div class="container">
<button class="btn">Swiftにイベント送信</button>
</div>
</body>
</html>
```

#Swift ViewController
Swiftソース

```swift:ViewController.swift
import UIKit
class ViewController: UIViewController , UIWebViewDelegate{

    @IBOutlet weak var web: UIWebView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //LocalサーバーURL
        let url = URL(string: "http://192.168.11.11")
        //#を追加した文字列はwindow.location.hashから取得できる
        let insertUrl = URL(string: "#HelloJavascrpt", relativeTo: url)
        let urlRequest = URLRequest(url: insertUrl!)
        web.delegate = self
        web.loadRequest(urlRequest)
    }
    
    func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    
        if let scheme = request.url?.scheme {
            if scheme == "fromjavascript" {
                
                //Javascriptのメッソドを呼び出す
                web.stringByEvaluatingJavaScript(from: "fromSwift()")
                return false
                
            }
        }
        return true
    }

}
```

#実行結果
#HelloJavascript文字列はSwiftから送られた文字列
<img width="376" alt="スクリーンショット 2017-03-11 13.03.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/90228a75-4b4c-dcb2-da99-ddfab6acb601.png">

##Swiftにイベント送信クリック後、Swiftからjavascriptメッソド呼び出す
<img width="374" alt="スクリーンショット 2017-03-11 13.04.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/7b45738e-f58a-0e04-8d7b-259d947ce5e8.png">
Java Scannerクラスの使い方（備忘録）

# Scannerクラスの使い方（備忘録）

## 概要
　学習サイトの課題を解くうえで、初めてScannerクラスを使ったので、備忘録としてまとめてみます。

　今回は課題で利用した標準入力のやり方と、整数を取得するやり方のみとなっています。Scannerクラスの詳しいことなどは今後学習していく予定です。

## Scannerクラス
![スクリーンショット 2017-03-11 11.33.49.png](https://qiita-image-store.s3.amazonaws.com/0/136882/9b0f95cd-c252-812c-d772-947c47a49d5a.png)

### Scannerクラスのimport
　まずは、Scannerクラスをimportする必要があります。

Scannerクラスはjava.utilパッケージに含まれるので、「import java.util.*;」と記述すれば、java.utilパッケージ内のクラス全てをimportしてくれます。

もちろん「import java.util.Scanner;」でもOKです。

### 標準入力の情報を渡す
　次に、標準入力の情報をScannerクラスのインスタンスに渡します。

　標準入力はSystemクラスのinフィールドから取得できます。

###入力情報の取得
　ここでは、改行・スペースが区切りとなる場合の取得方法です。

　整数を取得する場合は「nextInt」と書きます。

　文字列の場合は「next」と書くなど、取得するデータ型に合わせて、記述方法も変わってきます。

![スクリーンショット_2017-03-11_11_33_49.png](https://qiita-image-store.s3.amazonaws.com/0/136882/4d84a7ac-545f-b611-5da8-92e4b7b50e03.png)

　今回は以上となります。

##参考
　以下の記事を参考にさせて頂きました。
http://www.javadrive.jp/start/scanner/index2.html
http://eng-entrance.com/java-scanner-type
http://todai-neet.hateblo.jp/entry/2015/09/01/131413
vagrant up で共有ファイルがマウントできなくなった（"No such file or directory", vagrant 1.9.2, VirtualBox5.1）

## vagrant から届いたお知らせ

VirtualBox 5.1系に更新したところ、vagrant up でエラーが出て
共有ファイルがマウントできなくなりました。

* Windows7
* VirtualBox 5.1系
* vagrant 1.9.2

### エラーメッセージ
```
==> default: Mounting shared folders...
    default: /vagrant => C:/path/to/working/directory/ootake
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

: No such file or directory
```

### （余談）検索を間違えた

「'the filesystem "vboxsf" is not available' あたりかなー」と思って
グーグル先生やQiita先生にお尋ねしてみましたが、見つけられたのは  

* カーネルを更新
* box をリビルド  

といった感じの記事でした。

なんとなしに「これじゃない」感を受けつつ、とりあえずカーネル更新だけ
やってみましたが当然解決せず。

よくよく記事と自分のエラーとを見比べると最後のメッセージが違っていました。

自分のエラー：` No such file or directory `
記事のエラー：` No such device `

そりゃ、解決方法違いますね。

## 解決へ

ということであらためて検索し、stackoverflow に質問を見つけました。
[Vagrant Error: Unable to Mount VirtualBox Shared Folders (Guest Additions, vboxsf)](http://stackoverflow.com/questions/42074246/vagrant-error-unable-to-mount-virtualbox-shared-folders-guest-additions-vboxs:embed:cite) 


### platform.rb の 206行目を直す
```
C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.9.2\lib\vagrant\util
にあるplatform.rb の206行目を直してね。
```
っていう、ちょっとびっくりな内容でした。

ただ、修正内容が
* 修正前："\\?\" + path.gsub("/", "\")
* 修正後：path.gsub("/", "\")
とエラーと合致していましたので素直にしたがい、
無事にマウントされるようになりました。

### No such file or directory
Ruby ファイルを書き換えるだけなので、`No such file or directory` と言われた場合は、
こちらを試してみる価値があると思います。

単に stackoverflow の記事の紹介となってしまいましたが、
さっくり検索して該当する記事が見つけられなかったので、参考になれば幸いです。
Gem pry-rails

## Gem pry-rails 使い方

rails c
show-model User    引数で指定したモデルを表示する
show-models        すべてのモデルを表示する
show-routes        すべてのルートを表示する
show-middleware    すべてのミドルウェアを表示する
recognize-path     どのルートにマッチするURLか確認する

参考サイト
http://ruby-rails.hatenadiary.com/entry/20141024/1414081224
http://qiita.com/yaotti/items/c6e850010f36acedb0e1
[CSS] font awesomeのCDN版を使う手順

こちらでアカウント登録
http://fontawesome.io/get-started/

送られてくるメールにembedするjsのURLがあるのでHTMLに追記

```html
<script src="https://use.fontawesome.com/xxxxxxxxxxx.js"></script>
```

設定はこれで完了。あとは`class="fa fa-{アイコン名}"`でクラスを触ればアイコンが表示できる


```html
<i className="fa fa-home"></i>
<i className="fa fa-plus"></i>
<i className="fa fa-image"></i>
<i className="fa fa-line-chart"></i>
<i className="fa fa-magic"></i>
```

![image](https://qiita-image-store.s3.amazonaws.com/0/52847/b4402a58-a07c-cfdc-1b72-517c2da609ce.png)

使えるアイコンの一覧はこちら
http://fontawesome.io/icons/

5分もあれば設定できるので、プロトタイピングの際などに便利。
ExecJS::ProgramError対処方法【Rails】


ちょいちょい発生するエラーの対象方法を記載します。
調べてもはっきりわかりませんでした（泣

## **発生エラー**
![ExecJS_ProgramError.png](https://qiita-image-store.s3.amazonaws.com/0/158572/29c0daf5-1853-d27c-7a6b-4d7fc7bce626.png)

## **対処方法**

Gemfileにcoffee-script-sourceを追加します。

```rb:Gemfile
gem 'coffee-rails', '~> 4.0.0'
gem 'coffee-script-source', '1.8.0'        #←これを追加
```

その上で`bundle install`ではなく、以下コマンドを実行します。

```bash
bundle update coffee-script-source
```

解決できているはずです！
VirtulGL（VNC）をUbuntu16.04にインストールしたときのメモ

OpenGLを使ったGUIアプリをリモートで使いたい。VirtualGLを使う。VirtualGLはVirtualGLの画像転送を使うやり方（SSH）とVNCのXに画像描画する2通りのやり方があるが、今回はVNCに表示する。

## 参考
1. インストールの仕方（参考）
https://github.com/aancel/admin/wiki/VirtualGL-on-Ubuntu

2. 以下によるとTuboVNCがVirtualGLが本気出しているらしい。
http://www.turbovnc.org/About/TigerVNC

3. 公式ユーザーガイド。仕組みとかをわかりやすく解説してくれている。
http://www.virtualgl.org/vgldoc/2_2_1/

## やったこと

* VirtualGLのインストールは3, 1を参考に問題なくやった。
* TurboVNCも普通にDebパッケージを落としてきてインストールした。
* `$ vncserver -depth 24`でvncserverを起動。起動時に`-depth 24`オプション（24bitカラー）をつけてあげないと自分の環境では動かなくてちょっとハマった。
* ローカル（Windows8.1）でTurboVNC viewerをインストールして接続。グレーの画面が出ると接続完了。
* このスクリーン上にアプリケーションを起動したい場合はリモートのターミナルで`DISPLAY=:<vncのポート番号> vglrun <起動したいGUI app>`を打つと画面がVNCビューアに出る。GLを使ったアプリもちゃんと動くことを確認。
* もちろんデスクトップセッションも起動可能で`DISPLAY=:<vncのポート番号> vglrun mate-session`でmate使っている人はmateが起動する。
安易なNullチェック- 良いコード書くきっかけを与えたい。6[C#リファクタリングサンプル]

#安易なNullチェックの追加の妥当性
スプレッドのセルに値を代入する処理で、NullReferenceExceptionが発生した場合に書かれたコードについて考える。
Nullチェックを深く考えずに追加していたが、いろいろ考えるべきところがある。

##サンプルコード（例外発生前)
DBから取得した値をスプレッドに表示するコードで、値はnullの場合とそうでない場合が存在する。
スプレッドはサードパーティ製品のため、独自のクラスに置き換えている。
セルに値を代入する箇所で、ある日NullReferenceExceptionが発生した。

```csharp
        public void Main(SpreadCell cell)
        {
            int? dbValue = null;
            // DBから値を取得する処理は省略

            // NullReferenceExceptionが発生する。
            cell.Value = dbValue.Value;
            
        }

        /** スプレッドのセルオブジェクト  **/
        private class SpreadCell
        {
            public Object Value { get; set; }
        }
```

<details>
<summary>java</summary>
<div>

```java
    public void main(SpreadCell cell) {
        Integer dbValue = null;
        // DBから値を取得する処理は省略

        // NullPointExceptionが発生する。
        cell.setValue(dbValue.intValue());
    }

```
</div>
</details>

##サンプルコード(例外発生後に対応したコード)
Nullチェックを何も考えずに追加している上に、elseが無い。
何よりもNullチェックが必要ないということに気づいてほしい。

```csharp
        public void Main(SpreadCell cell)
        {
            int? dbValue = null;
            // DBから値を取得する処理は省略

            // Null以外の場合だけ値を代入する。
            if (dbValue != null)
            {
                cell.Value = dbValue.Value;
            }          
        }
```

<details>
<summary>java</summary>
<div>

```java
    public void main(SpreadCell cell) {
        Integer dbValue = null;
        // DBから値を取得する処理は省略

        // Null以外の場合だけ値を代入する。
        if (dbValue != null) {
            cell.setValue(dbValue.intValue());
        }
    }

```
</div>
</details>

##リファクタリング後のコード
Null許容型はそのまま代入すれば問題ない。百歩譲ってnullチェックをするならば、セルの初期化コードを入れてほしい。

```csharp
        public void Main(SpreadCell cell)
        {
            int? dbValue = null;
            // DBから値を取得する処理は省略

            // そのまま代入すればよい。
            cell.Value = dbValue;

            // if文を使用するのであれば、初期化してほしい。
            cell.Value = null;
            if (dbValue != null)
            {
                cell.Value = dbValue.Value;
            }
        }

```

<details>
<summary>java</summary>
<div>

```java
    public void main(SpreadCell cell) {
        Integer dbValue = null;
        // DBから値を取得する処理は省略

        // そのまま代入すればよい。
        cell.setValue(dbValue);

        // if文を使用するのであれば、初期化してほしい。
        cell.setValue(null);
        if (dbValue != null) {
            cell.setValue(dbValue.intValue());
        }
    }
```
</div>
</details>

##まとめ
NullReferenceExceptionが発生したからといって、何も考えずにNullチェックを追加するべきではない。
もし、Nullチェックが必要なのであれば、初期化コードも忘れずに。

こういう障害対応する人の場合、他のコードもちゃんと修正しているのか不安になる。

[前の記事(コレクションに対する無駄な処理)](http://qiita.com/csharpisthebest/items/7a9177a2a27002579b03)

[次の記事(Bool型の扱い)]
(http://qiita.com/csharpisthebest/items/b0c44764948e1334e94a)

[目次](http://qiita.com/csharpisthebest/items/57f27a33085f01211166)
LinuxのTerminalで"houdini"と入力すればHoudiniが起動出来るようにする方法

これ、よくある疑問だと思うので、ここにちらっとまとめておく。

## インストーラーで設定する
![Screenshot from 2019-03-26 07-20-57.png](https://qiita-image-store.s3.amazonaws.com/0/51857/8d8aa321-d6f7-622b-40dc-07b2bfef7800.png)

インストーラーで、3番の *Symlinks in /usr/local/bin* をyesにする。



## .bashrcファイルで設定する

もうひとつの方法として、`.bashrc`というファイルを使う。
`.bashrc`は$HOMEの直下に設置する事で、Terminalが対話モード(入力できる状態のTerminal)で起動された時にこのファイルの中身を実行してくれるというもの。

このファイルに以下の内容を書き込む。

```bash:.bashrc
cd /opt/hfsX.Y.ZZZ
source houdini_setup
cd $home
```

保存し終われば、あとはテストでTerminalを起動して`houdini`と入力してみるだけ。

ちなみに、この`houdini_setup`をsourceとして登録していれば、`hython`や`hconfig`なども直接Terminalから利用可能。つまるところ、Windows版でいうCommand Line Tools, Mac版でいうHoudini Shell.terminalと同じことができるということ。

便利なので、Houdiniインストールしたらまず初めにこれをやっておこう！！
Oracleで物理名から論理名を取得する

資料を作るときに便利
コメントあるとき限定ですが
IN句の中を論理名を知りたいテーブルの物理名に変えて使ってださい。


```sql:SQL
SELECT
  T.TABLE_NAME  AS "テーブル物理名",
  TC.COMMENTS  AS "テーブル論理名"
FROM
  USER_TABLES T
  INNER JOIN USER_TAB_COMMENTS TC ON (
    T.TABLE_NAME = TC.TABLE_NAME
  )
WHERE
  T.TABLE_NAME IN('M_ITEM') --テーブル名の大文字小文字に注意
```

```:結果

テーブル物理名  テーブル論理名
M_ITEM  商品マスタ
```
Node.jsでRubyのbinding.pry的ツール、debuggerを使う

Node.jsでbinding.pryを使いたい。
Debuggerというツールが組み込まれているようだ。
[Node.js v7.7.2 Documentation Debugger](https://nodejs.org/api/debugger.html)

配列を作ってループをブレイクしてみる。

```debugtest.js
Array.from(Array(3).keys()).forEach(function(key){
 debugger; // ここでブレイクする
 console.log(key)
})
```

debugオプションを付けて実行。

```bash
node debug debugger.js

< Debugger listening on 127.0.0.1:5858
debug>  ok
break in test.js:1
> 1 Array.from(Array(3).keys()).forEach(function(key){
  2   debugger;
  3   console.log(key)
```

`cont`コマンドでブレイクポイントまで進む。

```bash
debug> cont
break in test.js:2
  1 Array.from(Array(3).keys()).forEach(function(key){
> 2   debugger;
  3   console.log(key)
  4  })
```

`repl`コマンドで対話モードに入る。`Ctrl + C`で出る。

```bash
debug> repl
Press Ctrl + C to leave debug repl
> key
0
debug> cont
< 0
break in test.js:2
  1 Array.from(Array(3).keys()).forEach(function(key){
> 2   debugger;
  3    console.log(key)
  4  })
debug> repl
Press Ctrl + C to leave debug repl
> key
1
```

使えた。

テストでも使いたい。mochaの場合はこれで同じようにいけた。便利。

```bash
mocha debug <file-name>
```
link > try not to use x values close to 0. I would rather sample values in [0.01, 1]. / SGD, MomentumなどのいくつかのOptimizerの比較の図

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensowFlowを使った100 input nodes, 100 output nodesの学習について検討中。

function approximationをキーワードに以下を見つけた。

[Why deep NN can't approximate simple ln(x) function?](http://stackoverflow.com/questions/41550966/why-deep-nn-cant-approximate-simple-lnx-function/41565985)

その中で気になった回答内の記載は以下。

> Two idea how this might be improved
- try dropout
- try not to use x values close to 0. I would rather sample values in [0.01, 1].

0近辺の値を避ける理由(根拠)は記載されていない。

別途、SGD, MomentumなどのいくつかのOptimizerの比較の図が面白い。
SGDだど局所解に落ちるのか、誤差関数の値が減少する方向に行かないという例が見られる。
terminal の全ての tab で特定のコマンドを実行する

# 概要
現在開いている terminal の全ての tab に特定のコマンドを実行させる script を書きました.
ただし以下の注意点があります.
1. Mac 専用
2. プロセス実行中の tab には適用されない

# 動機
そもそもこれを作ろうと思った動機は, ```source ~/.zshrc``` を全ての tab に適用したいから.
PATH や alias を割りと頻繁に更新するので, そのときに全ての tab に ```source ~/.zshrc``` が反映されないのが不便だなと思った.

# 手順
ではこれを実現する手順を以下に記します.

## 1. スクリプトを配置する dir を作成
```
mkdir ~/scripts
```


## 2. スクリプトを作成

```Bash:~/scripts/apply_all_tabs.sh
function apply_cmd() {
  local cmd=$@

  osascript \
    -e 'tell application "Terminal"' \
      -e "do script \"$cmd\" in window 1 " \
      -e 'set terms to every window in application "Terminal"' \
      -e 'repeat with term in terms' \
        -e 'set tTabs to every tab in term' \
        -e 'repeat with tTab in tTabs' \
          -e 'if tTab is not busy then' \
            -e "do script \"$cmd\" in tTab" \
          -e 'end if' \
        -e 'end repeat' \
      -e 'end repeat' \
    -e 'end tell' 
}
apply_cmd $@
```

## 3. alias をはる (~/.bashrc or ~/.zshrc or etc.. を編集)
```
alias aat="~/scripts/apply_all_tabs.sh"
```

## 4. 更新
```
source ~/.bashrc
```

## 5. 試す
```
aat echo hello
```
↑ で全ての tab で `echo hello` が実行されていれば OK
Microsoft Office + Googleドライブ使い向けの2つの便利技


Microsoft OfficeファイルをGoogleドライブで管理しようとすると、不便が生じることがあります。その不満を解消するGooglej純正の拡張機能です。会社でG Suiteを使われている方にもおすすめです。

# Microsoft OfficeプラグインでGoogleドライブを使う(Windows向け)
Windows版Microsoft Office向けでGoogleドライブをOneDriveのような使い勝手にするプラグインです。ファイルの同期なしで、直接Googleドライブのファイルを扱えます。これ単体でGoogle認証が可能なので、Googleドライブクライアントは不要です。
### ダウンロード
https://tools.google.com/dlpage/driveforoffice
### Googleのヘルプページ
https://support.google.com/a/answer/6165960?hl=ja

# ChromeでGoogleドライブのMicrosoft Officeを直接編集する
ChromeブラウザからGoogleドライブにアクセスし、ドキュメント、スプレッドシート、スライドアプリで Microsoft OfficeファイルをGoogle形式に変換することなく直接編集できるようになるChrome向け拡張機能。既存ファイルを編集しようとしたときに、勝手に変換されなくて便利です。
### ダウンロード
https://chrome.google.com/webstore/detail/office-editing-for-docs-s/gbkeegbaiigmenfmjfclcdgdpimamgkj
chromeでbackground-repeatが1pxずれる


赤い背景に青い波の画像を置いただけ

![スクリーンショット 2017-03-11 10.11.55.png](https://qiita-image-store.s3.amazonaws.com/0/136286/8908b9eb-15c1-5b5b-cf23-913b5bbf63e6.png "スクリーンショット 2017-03-11 10.11.55.png")

青い波の画像に `background-repeat:repeat-x;` を当てたところ、
`background-repeat:repeat-y;` 方向にも波の上部に1px分余計な謎の線が発生。
ということで、青い波の画像の最下部1px分を透明にする（余白をつくる）ことで解決。
（透明な部分をリピートしても線にならない）

![スクリーンショット 2017-03-11 10.11.17.png](https://qiita-image-store.s3.amazonaws.com/0/136286/7da89472-4a76-28fd-8979-284e44785b0e.png "スクリーンショット 2017-03-11 10.11.17.png")
目次　コードリファクタリングや関連記事

#目次
投稿記事に関連が深いものも多いので、目次にまとめることにした。
サンプルコードはC#ではあるものの、似た文法をもつJavaでもある程度当てはまると思う。
※2017/3/24 Javaのサンプルコードをいくつか追加した。

[良いコードを書くきっかけを与えたい](http://qiita.com/csharpisthebest/items/90f040ad52c213bd0d64)
　[ややこしい条件分岐](http://qiita.com/csharpisthebest/items/99af9136883f139ad70f)
　[ちょっと気になるコード集](http://qiita.com/csharpisthebest/items/7d9d2c7e4da4b89488fd)　　
　[流れるようなインターフェース？](http://qiita.com/csharpisthebest/items/403d40374acc70ef24e3)
　[冗長な代入文](http://qiita.com/csharpisthebest/items/f9ebc741e40037553d5b)
　[コレクションに対する無駄な処理](http://qiita.com/csharpisthebest/items/7a9177a2a27002579b03)
　[安易なNullチェック](http://qiita.com/csharpisthebest/items/7b30d1e787a6b5fb82f1)
　[Bool型の扱い](http://qiita.com/csharpisthebest/items/b0c44764948e1334e94a) <font color="red">2017/3/17 bool型の関数について追記</font>
　[関数の引数が多すぎる](http://qiita.com/csharpisthebest/items/35ed38c0d3a26dbe8c70)
　[関数呼び出しと条件分岐を分離できないか](http://qiita.com/csharpisthebest/items/b52c0fa1978f96eae548)
　[Getter、Setter逆問題](http://qiita.com/csharpisthebest/items/9e6d6ff9156cfd70b993)
　[なんでもかんでも配列](http://qiita.com/csharpisthebest/items/2f34ea6b7329a9e3af7a)
　[条件分岐後の処理が冗長な場合](http://qiita.com/csharpisthebest/items/799ec629fed1e1e22f3f)
　[画面の表示値を利用することの問題点](http://qiita.com/csharpisthebest/items/c34746964abc7475bf93)
　[例外を無視する](http://qiita.com/csharpisthebest/items/9733feaf0b829ef0b67d)
　[条件分岐は早期リターンを使用するか、無難に条件網羅で書くか](https://qiita.com/csharpisthebest/items/b935896f514f2f079b86)

データベース
　[テーブル定義でスネークケースをやめたい](https://qiita.com/csharpisthebest/items/b6e5c2ed173bc01ec0f1)

DataSet関連
　[型付きDataSetのDataRowからNull許容で値を取得する。](http://qiita.com/csharpisthebest/items/98572e35763e6e19bc3b)

コーディング規約
　[コレクション変数の命名規約](http://qiita.com/csharpisthebest/items/150c1edffb1989ed37b8)

デザインパターン
　[進捗表示とビジネスロジックを分離する](http://qiita.com/csharpisthebest/items/7e50a6d4439760ad1fd5)

その他
　[Visual Basic でC#のインクリメントを使用する](http://qiita.com/csharpisthebest/items/82e0b8ccad1fc7fef85e)
　[JavaでSHIFT-JISを見つけたら要注意]
(https://qiita.com/csharpisthebest/items/2cd61661dbc42d81aa45)
　[[C#]System.UriのベースURIと相対URIが思っていたのと違っていた話](https://qiita.com/csharpisthebest/items/c7c505a330a8859bac8a)
CentOS7にelrepoからkernel 4系をインストール

## 参考

* http://elrepo.org/tiki/tiki-index.php
* http://elrepo.org/linux/kernel/el7/x86_64/RPMS/

```bash:elrepoリポジトリの登録
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm

# yum --enablerepo=elrepo-kernel install kernel-ml
yum --enablerepo=elrepo-kernel install kernel-lt
```


* lt : long term support
* ml : mainline stable
PHPのオフィシャルDockerイメージにredis exensionを追加する方法

Dockerの[Officialイメージ](https://hub.docker.com/_/php/)で、追加のextensionをインストールする方法としては

```dockerfile:Dockerfile
RUN docker-php-ext-install pdo
```

とすればOKですが、`redis`のextensionをインストールするときは、単純に

```dockerfile:Dockerfile
RUN docker-php-ext-install redis
```

ではインストールできません。

ネットに上がっている情報そのままではNGだったので、いろいろいじってやっと通った方法を個人的備忘録。


# 結論
```dockerfile:Dockerfile
FROM php:7.1.2-fpm-alpine

RUN apk update && \
    apk --no-cache upgrade && \
    docker-php-source extract && \
    curl -L -o /tmp/redis.tar.gz https://github.com/phpredis/phpredis/archive/php7.tar.gz && \
    tar xfz /tmp/redis.tar.gz -C /tmp && \
    rm -r /tmp/redis.tar.gz && \
    mv /tmp/phpredis-php7 /usr/src/php/ext/redis && \
    docker-php-ext-install redis <その他exension...>
```

ポイントは`docker-php-source extract`を明示的に実行すること。
これをやらないと`/usr/src/php/ext`ディレクトリが作成されないので、`mv /tmp/phpredis-php7 /usr/src/php/ext/redis`が失敗します。

ここにたどり着くまで3時間を費やしてしまった…。
技術英語 > to help [fill in any gaps] in your knowledge / I'll fill you in

@ http://neuralnetworksanddeeplearning.com/chap4.html

> to help **fill in any gaps** in your knowledge

https://www.merriam-webster.com/dictionary/fill%20in

> 1. :  to enrich (as a design) with detail
2. :  to give necessary or recently acquired information to 

> I'll fill you in
artisan起動時の謎エラーとその解消法

小ネタです。

# 問題発生
ある日突然、`artisan`を起動すると

```shell
  [ErrorException]                                                
  Cannot declare class Event, because the name is already in use 
```
と出てしまいいました。

# 原因調査
とエラーがでたので、原因を調べたら…

```shell
$ php -m 

[PHP Modules]

(snip)

event

(snip)
```

`event`モジュールを組み込んでいたのが原因でした。

PHPで非同期処理ができないか試してみるために、一時的に組み込んだモジュールでした。


## なぜ？
lumenの場合ファサード登録を無効にしていても、

```php:app/boostrap.php
// $app->withFacades();
```

`artisan`を起動するときには、決め打ちでファサード登録がされるようです。

```php:laravel/lumen-framework/src/Application.php
    public function prepareForConsoleCommand($aliases = true)
    {
        $this->withFacades($aliases);

        $this->make('cache');
        $this->make('queue');

        $this->configure('database');

        $this->register('Illuminate\Database\MigrationServiceProvider');
        $this->register('Laravel\Lumen\Console\ConsoleServiceProvider');
    }

    public function withFacades($aliases = true, $userAliases = [])
    {
        Facade::setFacadeApplication($this);

        if ($aliases) {
            $this->withAliases($userAliases);
        }
    }

    public function withAliases($userAliases = [])
    {
        $defaults = [
            'Illuminate\Support\Facades\Auth' => 'Auth',
            'Illuminate\Support\Facades\Cache' => 'Cache',
            'Illuminate\Support\Facades\DB' => 'DB',
            'Illuminate\Support\Facades\Event' => 'Event',
            'Illuminate\Support\Facades\Gate' => 'Gate',
            'Illuminate\Support\Facades\Log' => 'Log',
            'Illuminate\Support\Facades\Queue' => 'Queue',
            'Illuminate\Support\Facades\Schema' => 'Schema',
            'Illuminate\Support\Facades\URL' => 'URL',
            'Illuminate\Support\Facades\Validator' => 'Validator',
        ];

        if (! static::$aliasesRegistered) {
            static::$aliasesRegistered = true;

            $merged = array_merge($defaults, $userAliases);

            foreach ($merged as $original => $alias) {
                class_alias($original, $alias);
            }
        }
    }
```

`lumen`の`Event`クラスを`calss_alias()`するときに、`event`モジュールの`Event`クラスとバッティングしてしまったわけですね。
これは`lumen`のバグというべきか、`event`モジュールというマイナーなモジュールを組み込んでしまった自分のバグなのか（笑）


# 教訓
マイナーなモジュールを組み込む時は気をつけよう。
クリックイベントが取れなくて詰んだ

## 今回起きた事象
* サイトのページ内にあるページ内リンクのクリック数を取得するためにイベントトラッキングの設定を行ったが、タグが発火しない
* クリックイベントを取得できないためGAにクリックされた回数の数字も送られていない状態


## やったこと
### 1. Googleタグマネージャーの設定を見直す
例：ボタン風テキストリンクのクリック数を取得
* ボタン風テキストリンクのaタグにid属性を付与し、値に`hoge`を設定していました
* hogeのクリック数を取得できたら成功
    
### タグ
| タグタイプ | トラッキングタイプ | カテゴリ | アクション | ラベル | 非インタラクションヒット | 配信トリガー |
|----|----|----|----|----|----|----|
| ユニバーサルアナリティクス | イベント | foo | {{Page Path}} | {{Click ID}} | 真 | 下記参照  |

* GAのラベルにClickされたIDの値を表示したかった

### トリガー
| トリガー名 | トリガーの種類 | トリガーの発生場所 |
|----|----|----|
| テキストカラム | クリック-すべての要素- | Click ID 等しい hoge |
* クリックしたIDの値が`hoge`に等しいときをタグが発火する条件にしていました

#### 結論
タグの設定自体はあまり原因ではなさそう

### 2. GTMでどの要素が取得できているのかを確認する
* Googleタグマネージャーをプレビューモードにし、どの要素が取得できているのかを確認
    * ClickElementが取得できている
    * Click Textも取得できている(取得できた値：ボタン風リンク)
    * Click IDに表示されている値を見ると、`""`となっていました
    * 期待値は`hoge`なんだけどなぁ...

#### 結論
どうやら、ClickされているID自体を取得できていないっぽい
でもElementは取得できてるっぽい

### 3. 対象のテキストリンクがどんな構造になっているのかを確認
```
<a href="#" name="bar" id="hoge">
  <span>ボタン風リンク</span>
</a> 
```

* aタグにidを付与して、値もちゃんと`hoge`になっている
* aタグの下にspanタグがインライン要素として入っている


#### 仮説
* クリックしたときにaタグに入っている値がごっそり取得できていない
->spanタグに入っている要素をクリックイベントで取得してる...？


->HTML?GTM?の仕様で、クリックしたときにインライン属性に含まれている要素から取得するらしい。そのため、spanタグの値を先に取得し、aタグに入っている要素を取得できていなかった


## 解決方法
### GTMの設定を変更した
### 変数を作る
* Googleタグマネージャーに変数を新しく作った
* 今回は`offsetParent.id`という変数を作成

#### 変数の設定
| 変数の選択 | 変数名 | データレイヤーの変数 |
|----|----|----|
| データレイヤーの変数 | offsetParent.id | gtm.element.parentElement.id |

`gtm.element.parent.id`は、
GTMで取得できているElementの親要素にあるidを取得する
という設定にしている

* offsetParent.id：クリックしたときにspanタグがターゲットになっているので、ターゲット要素の親要素に含まれる属性をみにいく設定

### トリガーを変更
`Click ID`にしていたものを`offsetParent.id`に変更



で、解決した


## まとめ
* インライン属性には注意する
* データレイヤーはとても便利
* * aタグ要注意
CentOS7にRuby 1.8.7 をインストールする(opensslなし)

```Dockerfile:Dockerfile
FROM centos:7

ENV BUILDROOT="/root/rpmbuild"

RUN yum install -y -q gcc make bzip2 file which && yum clean all

# fpm ---------------------------------------------------------------
RUN yum -y install ruby ruby-devel ruby-libs rubygems rpm-build \
 && gem install fpm --no-rdoc --no-ri

# ruby---------------------------------------------------------------
WORKDIR $BUILDROOT/SOURCES/
# http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p374.tar.bz2
COPY ruby-1.8.7-p374.tar.bz2 .
RUN tar xf ruby-1.8.7-p374.tar.bz2
WORKDIR $BUILDROOT/SOURCES/ruby-1.8.7-p374
# https://www.ruby-forum.com/topic/142608
RUN yum install -y -q tk-devel tclx

#RUN yum remove -y openssl-devel

RUN ./configure --prefix=/opt/ruby --enable-pthread \
 && make -s \
 && make test \
 && make install

RUN fpm -s dir \
  -v 1.8.7_p374 \
  -t rpm \
  -n opt-ruby \
  -p opt-ruby-1.8.7-p374.el7.x86_64.rpm \
  -C /opt/ruby \
  -a x86_64 \
  /opt/ruby
```

* [Ruby 1.8.7-p374 and 1.8.7-p375, ruby-build, CentOS 7](https://gist.github.com/alanthing/1a151c9d8d0b81f039d3)のpatchを当てたらbuildできた。

## configureを確認

```bash:
ruby -r rbconfig -e 'puts RbConfig::CONFIG["configure_args"]'
```
URLの部分置換Extension

URLの構造をバラして部位ごとに上書きや追加をすることができます。
コードは出来たてで検証もそこそこです。
何か補足や訂正などありましたら是非ともコメント欄で教えてください。

Swift version 3.0.2

```swift
extension URL {
    
    func ext_set(scheme: String? = nil,
                 user: String? = nil,
                 password: String? = nil,
                 host: String? = nil,
                 port: Int? = nil,
                 path: String? = nil,
                 query: String? = nil,
                 fragment: String? = nil)
        -> URL? {
        var result = ""
        if let scheme = scheme ?? self.scheme,
            !scheme.characters.isEmpty {
            result += scheme + "://"
        }
        if let user = user ?? self.user,
            !user.characters.isEmpty {
            result += user
            if let password = password ?? self.password {
                result += ":" + password
            }
            result += "@"
        }
        if let host = host ?? self.host,
            !host.characters.isEmpty {
            result += host
            if let port = port ?? self.port,
                0...65535 ~= port {
                result += ":\(port)"
            }
            result += path ?? self.path
            if self.hasDirectoryPath,
                !result.hasSuffix("/") { // trailing slash or not
                result += "/"
            }
            if let query = query ?? self.query,
                !query.characters.isEmpty {
                result += "?" + query
            }
            if let fragment = fragment ?? self.fragment,
                !fragment.characters.isEmpty {
                result += "#" + fragment
            }
        }
        return URL(string: result)
    }
    
}
```

### Example

必要な箇所だけを指定して上書きor追加します。
空文字もしくは許容範囲外のポート番号を指定した場合は削除となります。

```swift
let url = URL(string: "http://test.example.com/s?t=0")!

url.ext_set(scheme: "vvvvv")
// -> vvvvv://test.example.com/s?t=0

url.ext_set(host: "yahoo.co.jp")
// -> http://yahoo.co.jp/s?t=0

url.ext_set(port: 8080, path: "/box/index.html")
// -> http://test.example.com:8080/box/index.html?t=0

url.ext_set(query: "q=test&lat=35.7&lon=139.7")
// -> http://test.example.com/s?q=test&lat=35.7&lon=139.7

url.ext_set(path: "", query: "")
// -> http://test.example.com

url.ext_set(fragment: "s3")
// -> http://test.example.com/s?t=0#s3

url.ext_set(user: "example.com&q=menu")
// -> http://example.com&q=menu@test.example.com/s?t=0 // Spoofed URL
```
Unityでパーティクルからイーサンくんを生成してみる

![ba802623f0ab1def1f7232c57350f416.gif](https://qiita-image-store.s3.amazonaws.com/0/108368/6f33ad18-4ff4-d415-6b60-091447bc1fc1.gif)

こんなん

three.jsでできたんでUnityでもできるだろ〜なと思ってたらできました。

なおFPSは10で、実用性がない模様。

shaderに頂点データ送る必要ある。

#コード

```csharp:qiita.csharp

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MakingMeshParticle : MonoBehaviour {
	
	[SerializeField]
	private GameObject cube,character;

	List<GameObject> cubes = new List<GameObject>();
	List<Vector3> cubesTransform = new List<Vector3>();

	Mesh mesh{set {this.mesh= value;} get{return character.GetComponent <SkinnedMeshRenderer> ().sharedMesh;}}

	// Use this for initialization

	Vector3[] normals ;
	void Start () {

		Vector3[] vertices = mesh.vertices;
		normals = mesh.normals;


		mesh.vertices = vertices;

		for(int i =0;i<vertices.Length; i++){
			cubes.Add((GameObject)Instantiate (cube, vertices[i], Quaternion.identity));
			cubes [i].GetComponent<Renderer> ().material.color = Color.black;
			cubesTransform.Add (vertices [i]);
		}

	}
	
	// Update is called once per frame

	float n =0;
	void Update () {
		
		for(int i =1;i<cubes.Count; i++){
			cubes [i].transform.position = Vector3.Lerp(cubesTransform[i] ,new Vector3(Vector3.Magnitude(cubesTransform[i])*Mathf.Sin(i*100+Time.time),0,Mathf.Cos(i*100+Time.time)) ,Mathf.Sin(Time.time));
		}
	}
}

```

頂点のデータ配列を用意して、その値をgameobjectの位置情報に入れ込む。

僕のMacbookAirでもいい感じで動かしたいから、computeShader使えないからどうしたもんか。
Elasticsearchで日本語全文検索をするときの最低限の設定(形態素解析のみ)


## 前提知識
### Analyzer(分析の流れ)
テキスト -> char filter -> tokenizer -> token filter -> トークン化されたテキスト

#### char filter
テキストになにかしらの処理をする。例、HTMLタグを削除する。
#### tokenizer
char filterで処理されたテキストをトークン化する。例、形態素解析、N-gram
#### token filter
tokenizerでトークン化された単語(トークン)になにかしらの処理をする。例、「飲み」を「飲む」に変換する。


## 設定するモジュール
### Char filter
- icu_normalizer

文字の正規化、大文字を小文字に統一したり、①を1にしたりする。設定はデフォルのまま。
[ICU Analysis Plugin](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-icu.html)を入れる必要があります。
また、char filterで正規化をするため、filterでcjk_width、lowercaseを使用しません。

- html_strip

HTMLタグを削除する。

### Tokenizer
- kuromoji_tokenizer

日本語形態素解析器

### Token filter
- kuromoji_baseform 

動詞、形容詞を原型に戻す。インデックス、クエリともに適応される。例、「美しく」を「美しい」に変換する。

- kuromoji_part_of_speech

特定の品詞を削除する。インデックス、クエリともに適応される。設定はデフォルのまま。

- kuromoji_stemmer

カタカナの末尾の伸ばし棒を削除する。インデックスからもクエリされる。例、「コンピューター」を「コンピュータ」に変換する。

## 参考
- [Elasticsearch の analyzer 関連の設定で知ってることを全て書く](https://kazu.tv/blog/2016/09/21/analyzer-settings-in-elasticsearch/)
- [Elasticsearch で 文字の正規化を icu_normalizer でおこなう](http://qiita.com/ikawaha/items/79fdd69c524310db065e)
- [Elasticsearch-pluginで始める全文検索（Couchbase Live Tokyo 2015資料）](http://sssslide.com/speakerdeck.com/johtani/elasticsearch-plugindeshi-meruquan-wen-jian-suo-couchbase-live-tokyo-2015zi-liao)
- [Elasticsearch 日本語で全文検索 その２](https://medium.com/hello-elasticsearch/elasticsearch-833a0704e44b#.qnax0vuwt)
- [Elasticsearch 日本語形態素解析のための文字列正規化の重要性](https://medium.com/hello-elasticsearch/elasticsearch-c98fd9ce6a18#.xbdp0dsi3)
- [Developers.IO 2016 C-2 「Elasticsearchで自由自在に検索・分析できるようになるためのヒント」](http://sssslide.com/speakerdeck.com/kunihikokido/developers-dot-io-2016-c-2-elasticsearchdezi-you-zi-zai-nijian-suo-fen-xi-dekiruyouninarutamefalsehinto)