OmniAICreator/Qiita-1.07M huggingface dataset:
Fabricの利用時のまとめ



現在見ているシステムでのFabric導入にあたっての調査まとめ。[公式ドキュメント](http://fabric-ja.readthedocs.io/ja/latest/tutorial.html)を参考にして記載。色々できることはあるようですがシンプルにしないと引き継ぎ出来ないので以下くらいで。
試したバージョンは以下の通り。

 * Python 3.6.1
 * Fabric3 1.13.1.post1
 * Paramiko 2.2.1





シンプルな実行は以下の形式で実行

```
fab -f ファイル名 -H ホスト名 -u ユーザ名 実行メソッド

例：fab -f fab_test.py -H 192.168.1.10 -u ubuntu task_name
```



## 基本の記載内容
``` fab_test.py
from fabric.api import *

def task_name():
  run("whoami")
  sudo("whoami")
  with cd("/tmp"):
    run("pwd")
```

## コマンドの内容

### get
ファイルを対象のサーバからローカルにコピーする。成功かどうかは戻り値の.succeededで確認。.failedは失敗した場合のファイルパスのリストが格納される模様。

```
get("リモートサーバのパス","ローカルのパス")
r = get('/home/foo/hoge', './')
print(r.succeeded) # => Trueなら成功。Falseなら失敗
print(r.failed)
```


### put
ファイルをローカルから対象サーバにコピーする。


```
put('ローカルサーバのパス','リモートサーバのパス')
r = put('./hoge',"/home/foo")
print(r.succeeded) # => Trueなら成功。Falseなら失敗
```


### local
ローカルサーバでコマンドを実行する。

```
local("pwd")
```




### run
リモートサーバでコマンドを実行する。実行するユーザはアクセスしたユーザ。

```
run("whoami")
```




### sudo 
sudoしてコマンドを実行する。アクセスしたユーザにsudo権限がない場合は失敗する。

```
sudo("whoami")
```

下記の通り記載することで実行ユーザを指定することも可能。

```
with settings(sudo_user='mysql'):
    sudo("whoami") # prints 'mysql'
```

### open_shell
リモートサーバのシェルに移行してコマンドを実行する。そのまま対話型に移動。

```
open_shell("ls")
```


### prompt
ユーザからのプロンプトからの入力を受け付ける。バリデーションもできる模様。int型は文字列を入力したところ、Exceptionが発生したので、正規表現でバリデーションをしたほうが良さそう。

```
r = prompt("run command ?")
run(r)

# With validation, i.e. requiring integer input:
prompt('Please specify process nice level: ', key='nice', validate=int)

# With validation against a regular expression:
release = prompt('Please supply a release name',
        validate=r'^\w+-\d+(\.\d+)?$')
        
```



### with cd("XX"): または with prefix("YY"):
`cd XX &&` または YY &&を全コマンドの前につける。prefixの前にsu - をつけるのはだめだったため、前述のsettingsを使うこと。

```
with cd("/etc"):
  run("cat hosts")

with prefix("cd /etc"):
  run("cat hosts")
```




### 色付け
以下のように記載することで色を付けることができる。成功とか失敗とかを色付けすればわかりやすそう。Teratermで色がつくかは要検証。

```
from fabric.colors import *

print(red("This sentence is red, except for " +   
        green("these words, which are green") + "."))
```

色は以下の通り。

* fabric.colors.blue(text, bold=False)
* fabric.colors.cyan(text, bold=False)
* fabric.colors.green(text, bold=False)
* fabric.colors.magenta(text, bold=False)
* fabric.colors.red(text, bold=False)
* fabric.colors.white(text, bold=False)
* fabric.colors.yellow(text, bold=False)




### ロール
対象のロールのサーバにだけメソッドを実行する。


```
from fabric.api import env

env.roledefs = {
    'web': ['192.168.1.10', '192.168.1.11', '192.168.1.12']
}

@roles('web')
def restart_nginx():
  sudo("service nginx restart ")
```

実行は以下の通り。上記ではメソッドの前に@roles('web')を記載しているため、実行時に-R webが省略できる。

```
fab -f 実行ファイル [-R ロール ] task
fab -f fab_test.py -u ubuntu restart_nginx
```



### 結果がエラーになることを確認する
手順中に"ファイルがなくなっていること"という手順があり、手作業でやったときと同じようにスクリプトを作ったらそこで停止してしまった。
下記のように`warn_only=True`をいれることで回避できる。


```
with settings(warn_only=True):
  result = sudo("ls -l /not/found/path")
```






[他の参考になりそうなサイト]
https://blog.masu-mi.me/2015/04/11/fabric_tips.html

http://perezvon.hatenablog.com/entry/20091026/1256552181
$.getJSON実行してんのに無反応なchromeちゃん

なんとjsonの構文にエラーがあると何食わぬ顔で無反応を決め込むという仕様みたいです。

なので怪しいと思ったら、取得するjsonの構文を下記サービスなどを利用してチェックしてみてください。
https://lab.syncer.jp/Tool/JSON-Viewer/

プログラムにはバグがなくても動作しないため、原因に気づきづらいです。おーこわい
UnityとC#でいつも忘れる初歩的なこと

毎回同じことを調べてるので自分のためにQiitaにまとめる。（随時更新)
#Unityの基本
####[[Unity] 初心者から見たはじめてのコルーチン](https://qiita.com/otochan/items/90fc6f52302c01e109a0)

#C#の基本
####[[Unity] Randomを取得する(UnityEngie.Random vs System.Random)](https://qiita.com/drafts/80877c72b0799dedf8f4/edit)


#ファイルの入出力
####[[Unity] 文字コード(=読み込むファイルが文字化けする問題)](https://qiita.com/otochan/items/d75b511f6376a3ec44ca)

####[[Unity] ファイル置き場、各場所からのファイルの入力](https://qiita.com/otochan/items/0df882a79c726dbf1937)

####[[C#] ファイルの出力](https://qiita.com/otochan/items/3405dd60f560ea042003)


#配列

####[[C#] 配列の長さを取得する](https://qiita.com/otochan/items/5ee3f2e08cca2369874e)

####[[C#] 配列に対するfor ,foreach ](https://qiita.com/otochan/items/ede2d75a42ea4c43ddc2)

####[[Unity] 動的に生成したオブジェクトの追加、削除、List<>での保持](https://qiita.com/otochan/items/28c3ecf7377ba56187c5)

#リソース管理
####[Unityで既に作ったProjectを、Bitbucket( + SourceTree)で管理 ](https://qiita.com/otochan/items/8823b77eab3fedbb181b)

#デバッグTips

####[[Unity] Debug.Logに16進数の変数を出す](https://qiita.com/otochan/items/d96ae0b2cbed6cb0cfa8)

#NCMB関係
(このサービスめちゃくちゃ素晴らしい。初心者でも全員使うべき）
####[UnityでNCMBプッシュ通知を実現するまでの道のり](https://qiita.com/otochan/items/0227db00a9a915bdf981)
####[NCMB(Unity,C#)でカウントの複数検索](https://qiita.com/otochan/items/531d31741fb7f988466c)
####[NCMB(Unity,C#)で登録したobjectIdの保存＆検索](https://qiita.com/otochan/items/2b462b280b82bbc2981f)


#トラブル
####[UnityでButtonを押しても反応がないとき](https://qiita.com/otochan/items/abcbb2cc5a8a5ea79516)

####[Unityで INSTALL_FAILED_VERSION_DOWNGRADEが原因で実機テストが出来ない](https://qiita.com/otochan/items/eb33622f59efcdc09567)

####[Unityのprefab(プレハブ)がScriptの数値とズレる](https://qiita.com/otochan/items/fa6a654be834ff4bdab9)

####[初心者のためのbundle identifier(独自ドメイン)の設定とUnity上でのトラブル](https://qiita.com/otochan/items/1e30cc9312a9d95035ec)

####[Unity Androidの実機確認を行おうとしたら「usbデバイスが認識されません」といわれた話](https://qiita.com/otochan/items/5229dc06845c28745057)

#リリース
##解像度・画面
####[初心者向けUnity 解像度チェック](https://qiita.com/otochan/items/ff60415cb363176ee35d)
####[[Unity] スマホの画面を縦向きONLYにする](https://qiita.com/otochan/items/b86cfbbe020d4740ea93)
##一般
####[アプリ内広告を出してみて分かったユーザー動向](https://qiita.com/otochan/items/5931405fe7cad651974d)
####[ゲームの支援アプリを作ったらGoogleからBANを食らった話](https://qiita.com/otochan/items/172a6acef12f16d7befe)

#その他
####[[Unity] OpenFileDialogをWindowsアプリ(exe)で使う](https://qiita.com/otochan/items/0f20fad94467bb2c2572)

####[プログラミング初心者&Unity初心者にオススメの書籍](https://qiita.com/otochan/items/5a61b4927ed91b47d7c9)

####[古い端末のGoogle Play自体のバージョンを強制的にあげる](https://qiita.com/otochan/items/0fd172b9d8ed3d2abd7d)
Windows10でスタートメニューを開くとグレー表示でアイコンが一切無反応な時の対処法

![image.png](https://qiita-image-store.s3.amazonaws.com/0/102207/a6e12149-b0bf-812c-0d7d-ea4ac54d594a.png)
スタートメニューが無反応！！！一体どうすりゃいいんだこのク○OSめ！！！

これ、おそらく普通に使っている方には起きない現象だと思いますが、
UWP(ユニバーサルアプリ)のパッケージを触りたくて、\AppData\Local\Packages や \Program Files\WindowsApps にアクセス権限をつけたりする人や、
コルタナとかEdgeとか死んじゃえばいいのに！！！とか言ってこれらのフォルダからとある権限を削除すると起こります。

私は後者で、<font color="Red">コルタナやEdgeの告知や広告がうざかった頃、こいつらを黙らせたいがためにやりました。</font>反省はしてない。

#治し方
非常にあっけないものです。
``C:\Users\<Your Name>\AppData\Local\Packages`` もしくは ``C:\Program Files\WindowsApps`` に ``ALL APPLICATION PACKAGES``という管理者ユーザを追加して、フルコントロール権限を与えます。

たったこれだけ。

しかしこれを知らないと、トラブルシューティングしろとか、``DISM`` やら ``sfc /scannow`` やら ``powershell``やらを実行しろ、だめならWindows再インスコしろとか意味の分からない検索結果に悩まされます。
みなさまもお気をつけて。
Keras

#Kerasに関して
##関数の意味

```python
model.add(Conv2D(32, (3, 3), input_shape=(128, 128, 3)))
```

・32個のフィルタ（カーネル）を用意。
・フィルタサイズは（3,3）
・入力画像は128*128pxとRGB分で*3
>
出力画像は(126, 126, 32)


##出力表の見方

```
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 126, 126, 32)      896       
_________________________________________________________________
```

・`input_shape=(データ数, 128, 128, 3)`の4次元テンソル。
・出力画像は周囲1px分減って126*126px（sameを使うと縁は0で埋めてくれる）。
・Paramは層のパラメータ数。今回はRGBなのでフィルタも3次元、すなわち一つのフィルタの重みの数は、3*3*3=27にバイアスを足して27+1=28。あとはフィルタ数をかけて28*32=896。出力は式で表すと

```math
y=\phi \left(\sum_{j=1}^{27} w_{ij}x_j+b_i \right)
```

iはフィルタ番号、jはフィルタの重み。

##fit_generatorの使い方

```
history = model.fit_generator(
    generator=train_generator,
    steps_per_epoch=200,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=200)
```

ミニバッチでの重み更新を行ってくれる。
>引用：https://jp.mathworks.com/matlabcentral/answers/333915-
>>
誤差計算と重み更新には、主にバッチ、ミニバッチ、オンラインの三つのいずれかの方法が使われます。 
このうちのミニバッチ学習とは、ネットワークのパラメータ学習に対して全学習サンプルを一度に使うのではなく、全学習サンプルから一定数のサンプルを抽出したサブセットを使って誤差計算と重み更新を行う方法です。ひとつのサンプルごとに重みを更新するオンラインの方法と比較すると高速に処理を行うことができ、バッチと比べて良い精度を得られることが、ミニバッチの利点です。ディープラーニングでミニバッチを使用する際には、よくエポックごとにミニバッチの学習サンプルがシャッフルされ、ランダムに抽出されます。 

・generatorとvalidation_data、(inputs, targets)のタプル。
・steps_per_epochとvalidation_stepsは、1エポックあたりのステップ数。すなわち、全サンプル数=バッチ数*ステップ数。


###参考
http://qiita.com/agumon/items/ab2de98a3783e0a93e66
https://deepage.net/deep_learning/2016/11/07/convolutional_neural_network.html
http://qiita.com/icoxfog417/items/96ecaff323434c8d677b
Macのhomebrewで最新gitをインストールして使う方法 (bashの場合)

macbook proで最新versionのgitを使おうとしたときに
アップデートしてもバージョンが変わらなかったため
色々調べて解決したことをまとめます

#手順
1. homebrewインストール
2. homebrewで最新verのgitをインストール（この時点ではまだ古いversionのgitが呼び出される）
3. 最新verのgitが呼び出されるように設定（.bash_profileの編集)

#homebrewインストール
[homebrew](https://brew.sh/index_ja)はバージョン管理ツールで、
linuxでいうところのyumとかapt-getです。
launchpadのその他フォルダ内のターミナルを開いて下記のコマンドを打ちます。


```:ターミナル
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
homebrewインストールコマンドは更新されている可能性があるので上記コマンドでインストールできなかった場合は[こちら](https://brew.sh/index_ja)から最新のコマンドを取得してください。
このコマンドでhomebrewがインストールされました。

#homebrewで最新verのgitをインストール

[git](https://git-scm.com/)の最新版をhomebrewでインストールします。

```:ターミナル
brew install git
```

これでgitの最新版がインストールされました。（まだ使えません）

#最新verのgitが呼び出されるように設定（.bash_profileの編集)
このままだとmacbookに最初から入っているgitのほうが呼び出されてしまいます。
homebrewでインストールしたgitを呼び出すように.bash_profileにパスを記載します。
Finderから.bash_profileを選択して編集します。

表示されない場合は下記参照
[【Mac】隠しファイル・隠しフォルダを表示する方法](https://qiita.com/TsukasaHasegawa/items/fa8e783a556dc1a08f51)


```:.bash_profile
export PATH=/usr/local/Cellar/git/{最新バージョン}/bin:$PATH
```
`例　export PATH=/usr/local/Cellar/git/2.14.1/bin:$PATH`

#確認
```:ターミナル
git --version
```

最新のversionが表示されれば成功です
erbでn階層のツリーを表示する

## 課題

`1:N` の 自己参照関係を持ったツリー状のモデルを、n階層のツリーとしてビュー内に静的に表示したい。

たとえば、以下のようなモデル:

```bash
$ ./bin/rails g model foo name:string foo_id:integer
```

```rb:app/models/foo.rb
class Foo < ApplicationRecord
  has_many :children, foreign_key: :foo_id, class_name: 'Foo'
end
```


## 解決方法

ERB内に表示用の再帰関数を定義して呼び出す方法で解決した。

```erb:app/views/foo/index.html.erb
<% def disp_tree(foo) %>
  <li>
    <span><%= foo.name %></span>
    <ul>
      <% foo.children.each do |f| %>
        <% disp_tree(f) %>
      <% end %>
    </ul>
  </li>
<% end%>

<ul>
  <% disp_tree(@root) %>
</ul>
```

適当にデータを入れて確認してみる:

```rb:app/controllers/foo_controller.rb
class FooController < ApplicationController
  def index
   @root = Foo.create!(name: 'root')

   @root.children << Foo.create!(name: 'n1')
   @root.children << Foo.create!(name: 'n2')
   @root.children << Foo.create!(name: 'n3')

   @root.children[0].children << Foo.create!(name: 'n1-1')
   @root.children[0].children << Foo.create!(name: 'n1-2')
   @root.children[0].children << Foo.create!(name: 'n1-3')

   @root.children[1].children << Foo.create!(name: 'n2-1')
   @root.children[1].children << Foo.create!(name: 'n2-2')
   @root.children[1].children << Foo.create!(name: 'n2-3')

   @root.children[2].children << Foo.create!(name: 'n3-1')
   @root.children[2].children << Foo.create!(name: 'n3-2')
   @root.children[2].children << Foo.create!(name: 'n3-3')

   @root.children[0].children[0].children << Foo.create!(name: 'n1-1-1')
   @root.children[0].children[0].children << Foo.create!(name: 'n1-1-2')
   @root.children[0].children[0].children << Foo.create!(name: 'n1-1-3')
  end
end
```

表示できた:

![スクリーンショット 2017-09-09 23.46.34.png](https://qiita-image-store.s3.amazonaws.com/0/66479/a8935d35-fa03-0d50-d9ca-7bb65c34336d.png)


## 補足

ERB内で直接関数宣言するのもアレなので、大きくなりそうならヘルパとパーシャルに切り出す感じで。

また同様の機能/表示を簡単に実現できそうな `awesome_nested_set` と `the_sortable_tree` というgemがあるとのことなので、こちらを使うほうがいいかもしれない。参考:

- [Railsでawesome_nested_setを使って階層構造を作成する](http://ruby-rails.hatenadiary.com/entry/20150216/1424092796)
- [【Rails】awesome_nested_set と the_sortable_tree でツリー構造を表示する](http://kappa-game.hatenadiary.jp/entry/2016/02/14/【Rails】awesome_nested_set_と_the_sortable_tree_でツリー構造を表示する)
Amazon Glacierの課金体系がシンプルになっていた（2016年11月以降）

# Amazon Glacierの課金体系に罠が多かったのは昔の話
Amazon Glacierの課金体系は複雑で、勘違いしたまま運用すると容易にクラウド破産することが2015年に指摘されていました。GlacierでGoogle検索するとこの情報は記事公開時点でも上位に来ます。僕の知識もここで止まっていました。

- [Amazon Glacierでクラウド破産しないために \- HDE BLOG](http://blog.hde.co.jp/entry/2015/01/30/154101)

最近調べたところ、課金体系が変更され、単純な転送量単位の課金となっていました。公式の料金表を見ればすぐわかるのですが、僕と同じような認識の人のためにここに書いておきます（2017年になっても上のクラウド破産の記事を引用した記事をみかけたので）。

- [料金 \- Amazon Glacier（オブジェクトストレージ）｜AWS](https://aws.amazon.com/jp/glacier/pricing/)

# いつからシンプルになった？
AWSのブログによると、2016年11月21日のようです。

> We launched Glacier with a pricing model for data retrieval that was based on the amount of data that you had stored in Glacier and the rate at which you retrieved it. While this was an accurate reflection of our own costs to provide the service, it was somewhat difficult to explain. **Today we are replacing the rate-based retrieval fees with simpler per-GB pricing.**
（強調は引用者による）

[AWS Storage Update – S3 & Glacier Price Reductions \+ Additional Retrieval Options for Glacier \| AWS Blog](https://aws.amazon.com/jp/blogs/aws/aws-storage-update-s3-glacier-price-reductions/)
RaspberryPi3にカメラモジュールを接続する

接続する場所を間違えてて２時間ぐらい悩んだ・・・

# 遭遇したエラー

```
$ raspistill -w 1920 -h 1080 -o try.jpg
mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Camera is not detected. Please check carefully the camera module is installed correctly
```

どうやらカメラが認識できていないようだ・・・

# 接続場所

HDMI端子とAV端子の間が正しい。

SDカードを差し込む所の上に同じような端子があるがそこではない。
(ここにカメラモジュールを接続するとLEDが常時光りっぱなしになるので、疑わなかった。。。)
どうやらDISPLAY用のスロットらしい。

ちなみに正しい挙動は撮影時にのみ、LEDライトが光る。

# 調べたこと

接続場所の間違いに気づくまでにいろいろ調べたことも一応メモしておく。
認識されない事例が多かっただけに余計発覚が遅れた。

## カメラが有効になっているかどうか

```
$ sudo raspi-config
```

`5 Interfacing Options` => `P1 Camera` => `Yes`

## カメラが認識できているかどうか

```
$ vcgencmd get_camera
supported=1 detected=0
```

接続場所が違ったので当然認識されてない。

## カメラ自体の確認

カメラモジュールのレンズの下のSUNNYと書かれている端子が外れていると認識されないらしい。
外れてたらしっかりと差し込もう。
今回はちゃんと接続されていた。

## 他ドライバとの干渉

spiやi2cと干渉するかもしれないとの記事を発見したので。
modprobeのblacklistを作成し、ブート時にロードするモジュールを制御する。

```
$ sudo vi /etc/modprobe.d/raspi-blacklist.conf
blacklist spi-bcm2708
blacklist i2c-bcm2708
$ sudo chmod 644 /etc/modprobe.d/raspi-blacklist.conf

$ sudo reboot
```

当然変化なし。

## まとめ

色々設定とか試してみる前に物理的な要素をしっかり確認しよう。
間違った端子の方を何度も差し直してみたりしたけど、もう一個同じような端子があるのに気づかなかった。
sketchで画像を切り抜く２つの方法

sketchで画像のトリミングにつまずいたので覚え書き。

##スライスを使う方法 ←おすすめ
①インサートからスライスを選択
②対象の画像の上で、希望の大きさになるよう範囲を選択する
③エクスポート

##マスクを使う方法
①インサートから好みの形を選択し、切り取りたい部分におく
②両方を選択し、ツールバーのマスクをクリック
③エクスポート
Railsでデータベースの内容を確認する方法

<h1>記事の概要</h1>
テーブルの一覧、データの構造を確認したい。

<h2>データベースクライアントの起動</h2>
ターミナルで

```
$ rails dbconsole
```

```
sqlite> 
```

<h2>テーブルの一覧表示</h2>

```
sqlite> .tables
books                 schema_migrations   
```

<h2>スキーマの確認</h2>
<p>スキーマとは構造という意味でそのテーブルの構造を見ることができる。</p>

```
sqlite> .schema
CREATE TABLE "books" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "isbn" varchar, "title" varchar, "price" integer, "cd" boolean, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL);
```

<h2>データベースクライアントの停止</h2>

```
sqlite> .quit
```

<h3>補足</h3>
<p>データベースクライアントの起動中に適当な文字を入力すると</p>

```
sqlite> ...>
```

<p>このような状態になる。</p>
<p>こうなった時は control + c を3回押せば出られる。</p>
AWS Lambdaメモ書き

#AWS Lambdaの特徴
　AWS Lambdaは**ステートレス**なので、毎回コンパイルしないといけない。だから、Javaとは相性が悪い。

#EC2と比べた料金形態

1. Amazon EC2  
インスタンスが開始してから、それが終了または停止するまでの時間によって料金が算出される。
2. AWS Lambda  
課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しない。

各料金の算出方法は上記の通りなので、Lambdaを用いた方が料金が安くなるケースが多い。

#テスト方法
[AWS SAM Local](https://aws.amazon.com/jp/blogs/news/new-aws-sam-local-beta-build-and-test-serverless-applications-locally/)を用いるとローカル上でテストが行える。今はベータ版が利用可能。
同一のハードウェア(Macbook)のmacOS, Bash on Windows, Ubuntu, VirtualBoxでUnixbenchを実行して性能を比較してみる

もうすぐ Windows10 Fall Creators Update や macOS High Sierra がリリースされるという時期なのにこういうテストを行うのは今更感があるような気がしますが、下記5種類の環境を同一のハードウェアにセットアップして Unixbench を実行してみました。

- macOS Sierra
- Windows10 1703 の Bash on Windows
- Ubuntu 16.04 LTS
- macOS Sierra 上の VirtualBox にインストールした Ubuntu 16.04 LTS
- Windows10 1703 上の VirtualBox にインストールした Ubuntu 16.04 LTS

なお、macOS Sierra 向けの Unixbench を動かすには一部のファイルにパッチを当てる必要があるため、macOS の結果は参考程度とご理解ください。

# 比較に用いたハードウェアとOSのインストール方法
Macbook Pro Retina 13inch 2012 を使いました。具体的には以下のようなスペックです。

CPU: Corei5-4288U 2.60GHz
Memory: 8GB

少々古い機材ではありますが、手元でたまたま余っていたのでこれを使っています。今時は5年くらい前の機材でもそれなりに使えてしまうので、古さは案外感じないかと思います。

さて、今回の実験では**WindowsとUbuntuのインストールはMacbook上にパーティションを切って素で入れる**必要がありますよね。macOS + Windows なら BootCamp でOKですが、BootCamp は Ubuntu までは面倒みてくれないっぽいので、今回は rEFind というブートマネージャーを使いました。

なお、rEFindの利用については Qiita にもいろいろな記事がありますので、興味のある方はそちらを参照していただくのがよいでしょう。
http://qiita.com/search?q=rEFind

このような環境構築により、**同一機材でのOS違いによるパフォーマンス比較を　macOS を含めて測れるようになります**。

# 結果

結果の生ログを載せるだけでは比較しづらいので、Excelで条件付き書式でカラーバーをつけてみました。、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149350/4007b794-30f6-be5d-f8f5-da6d5605a798.png)

カラーバーは同一試験項目の結果が比較できるように、各行ごとにつけています。


# 結果からわかること

これを見ると、次のようなことが見て取れます。

- Drystone はいずれの環境でも大きな差が出ない。
- Whetstone は macOS Sierra 以外は少々低め。特に VirtualBox 環境が低い。
- File I/O や process の生成は Bash on Windows 上の Ubuntu はずいぶん悪い。
- 素の Ubuntu と macOS を比べると、macOS のほうがイマイチな感じ。（ただし前述の通り、macOS　Sierra で動かすにはソースにパッチを当てる必要があるので、この結果を鵜呑みにしてはいけないかも）
- Ubuntu は実インストールでも仮想マシンでも同等だが、一部の結果は実インストールのほうが良いものもあるし、仮想マシンのほうが良いものもある。


# 講評？

結果の感想としては、WSL は普段遣いで感じていることではありますけど、やはりファイルI/Oが遅く、VirtualBoxは案外イケてるなあ、という感じですかねえ。

なお、この結果はGUI描画の性能は含みません。

そして、大切なことだから繰り返しますが、macOS で Unixbench を実行するためにはパッチをあてる必要があるので、macOS の結果はあくまで参考程度です。

Windows10 Fall Creators Update や macOS High Sierra が正式リリースされたら、そのうちアップデートしてみるかも。
AndroidStudioでコード整形とimport整理を同時に行う

AndroidStudioでコード整形とimport整理を同時に行うのは、おそらくこの方法が一番楽かと思います。
windowsの方は適宜脳内で置き換えてください。

1. エディタ画面で `cmd + alt + shift + L` を押します
2. 以下のようなダイアログが出るので `Optimize imports` にチェックを入れて「Run」をクリック
<img width="340" alt="スクリーンショット 2017-09-09 21.05.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/35511/7f5262e7-56b6-c376-196f-5457338c4f61.png">

3. `cmd + alt + L` でコード整形とimport整理が同時にされることを確認します。

これだけで今後コード整形される時にimport整理もしてくれるようになります。
画像はAndroidStudio3.0のものですが2.x系でも同様です。

## 補足1(別コマンドの割り当て)
自分は`cmd + alt + L`が手癖にしづらいのでコード整形するコマンドを`cmd + S`に割り当てています。
`cmd + S` は本来保存するためのショートカットですが、AndroidStudioでは(設定をいじってなければ)デフォルトで自動保存されるため上書きしてしまって問題ありません。
※自分はこの設定で2年以上運用していて問題は起きていませんが自己責任でお願いします。

1. Preferences -> Keymap -> `reformat`で検索
2. `Reformat Code` を右クリックで「Add Keyboard Shortcut」をクリック
3. ダイアログが出たら`cmd + S`のキーを入力
4. 「⚠️Already assigned to:...」と出ますが前述した通り保存するショートカットは本来不要なのでOKをクリック
5. 既に割り当てられてるやつ消していいのかよ的な警告が出ますが「Remove」をクリック
6. `cmd + S`でコード整形とimport整理が同時にされることを確認します。

## 補足2(Rearrange Code)
`cmd + alt + shift + L` で出るダイアログで `Rearrange code` にもチェックを入れると、メンバ変数を上に移動したり内部クラスを下に移動したりといった並び替えを一緒にやってくれます。
特にlayout xmlの属性の順番を整理してくれるのが便利なのでおすすめです。


以上です。
名寄せ関数を作ってみた

## 背景
### 個人情報の付き合わせ確認効率化欲求の増大
- 私が今いるところでは、２つの異なる不完全な個人情報データベースを参照しながら、個人情報をまとめる作業が存在する。
- しかし、異なる個人情報データベース間では、「名前だけが頼り」となりがちなのだけど、その名前も「さいとう」さんの「さい」の字の難しさや、旧姓使用の有無などにより、あてにならない場合が存在する。
- そんな時にvlookup関数の部分一致検索を藁にも縋る思いで使ってみるものの、頼りない結果しか帰って来ず、イライラすることが多かった。
- 機械学習を使いこなせる人であれば、その他の情報から一番近似値の高い名前を見つけてくる、というコードを書けるのだろうけど、文系vbaユーザとしてはそこまでハードルの高いものはまだ書けないので、他の情報を元に尤もらしい人名（人名でなくてもいいのだけど）を引っ掛けるvbaのコードを作ったので、備忘録がてら書き残したい。

## コード
- vbaです。へっぽこですいません。

```vba:sim_distance.xlsm
Function sim_distance(sname As String, mycolumn As Long, a As Variant, arange As Range, b As Variant, brange As Range, c As Variant, crange As Range)
    Dim aarange As Range, bbrange As Range, ccrange As Range
    Dim sim_distance2a As Long, sim_distance2b As Long, sim_distance2c As Long, sim_distance2r As Long

    For Each aarange In arange
        If aarange.Value = a Then
            sim_distance2a = aarange.Row
            Exit For
        End If
    Next aarange
    
    For Each bbrange In brange
        If bbrange.Value = b Then
            sim_distance2b = bbrange.Row
            Exit For
        End If
    Next bbrange
    
    For Each ccrange In crange
        If ccrange.Value = c Then
            sim_distance2c = ccrange.Row
            Exit For
        End If
    Next ccrange

    Dim sim As Variant
    sim = Array(sim_distance2a, sim_distance2b, sim_distance2c)
    sim_distance2r = Application.WorksheetFunction.Max(sim)
    If sim_distance2r = 0 Then
        sim_distance2 = "引数を変更するか追加した新たな関数を作って再度試してください"
    Else
        sim_distance2 = Worksheets(sname).Cells(CLng(sim_distance2r), mycolumn).Value
    End If
End Function
```

## 関数の意味
- 引数1「sname」：引っ張ってきたいシート名
- 引数2「mycolumn」：引っ張ってきたい列番号
- 引数3「a」：引っ張るためのヒントその１
- 引数4「arange」：引っ張るためのヒント１を探す範囲
- 引数5「b」：引っ張るためのヒントその２
- 引数6「brange」：引っ張るためのヒント２を探す範囲
- 引数7「c」：引っ張るためのヒントその３
- 引数8「crange」：引っ張るためのヒント３を探す範囲
- 引数を増やすことはできますが、ひとまず３つぐらい参照していれば、それなりの精度が保てるかなと思い、３つにしています。
content_tag 風メソッドで options = {} を **options に変更するときの注意点

「content_tag 風メソッド」で通じるかどうかわかりませんが、要は引数をオプションの前でもブロックでもどっちでも受け取れるようにしてあるメソッドです。例えばこんなのです。

```ruby
def f(v = nil, options = {})
  if block_given?
    options = v
    v = yield
  end
  [v, options]
end

f(x: 1) { "a" }                 # => ["a", {:x=>1}]
```

これの引数の `options = {}` をかっこよさそうだからという理由で `**options` に置換したところおかしくなりました。`options` に入っているはずの値はいったいどこにいっちゃったんでしょうか。

```ruby
def f(v = nil, **options)
  if block_given?
    options = v
    v = yield
  end
  [v, options]
end

f(x: 1) { "a" }                # => ["a", nil]
```

これは、もともと `options` に入っていたのに `v (nil)` で上書きしてしまっていたということです。 double splat operator の効果で(残りの)キーワード引数を自動的に吸い込んでくれていたのに余計なことをしてしまっていたのです。つまりこれが正解です。

```ruby
def f(v = nil, **options)
  if block_given?
    v = yield
  end
  [v, options]
end

f(x: 1) { "a" }                # => ["a", {:x=>1}]
```

もっと簡潔に書くとこの違いです。

```ruby
-> (v = nil, o = {}) { [v, o] }[x: 1] # => [{:x=>1}, {}]
-> (v = nil, **o)    { [v, o] }[x: 1] # => [nil, {:x=>1}]
```

安易に置換してバグった失敗談でした。
Dockerfile作成＆Nodeアプリケーションデプロイ

# Dockerfile作成＆Nodeアプリケーションデプロイ 
Nodeアプリケーションをdockerで運用したかったのでDockerfile作成してコンテナを作成し、デプロイした。
初心者だったのでdockerfileの書き方を調べて一から作成した。dockerfileの命令等を説明していきたい。

##はじめに
Dockerをマシンにインストールしていることを前提とする。
` git clone https://github.com/hikaru7719/chat_app.git`でnodeアプリケーションとDockerfileが持って来れます。
よろしければ是非。以下コマンドはclone先で実行してください。
githubのURLはこれ→[githubURL](https://github.com/hikaru7719/chat_app)


## DockerFileとは
dockerfileはdockerコンテナを作成するためのいわば設計書である。
近年,devopsという考え方が広まってきているが、開発環境や運用環境の構築方法をコード化し管理できることは開発者にとってメリットが大きい。
dockerfileはいくつかの命令から構成されており、dockerデーモンはこれらの命令を逐次実行していき、dockerイメージを作成する。
シェルスクリプトに似ている気がする。

```:Dockerfile
FROM node:latest

MAINTAINER Hikaru Miyahara

ENV NODEPATH /node
ENV APP ${NODEPATH}/app

RUN mkdir -p ${APP}

COPY . ${APP}
WORKDIR ${APP}

RUN npm install

CMD npm start
```

これが今回作成したdockerfile。
以下命令について説明したい。
## 命令説明
### FROM
FROM　＜イメージ名：タグ＞
FROM命令はコンテナの基になるイメージを指定する。今回はnode最新バージョンのイメージnode:latestを引数に持つ。

### MAINTAINER
これは作成者をかく欄。

### ENV 
ENV <変数名> <値>
これはdockerコンテナに渡す変数である。
また${変数名}で値を参照できる。シェルスクリプトとここら辺は一緒。

### RUN
RUN <コマンド＞
コマンドを実行する。

### COPY
COPY <マシンパス>　＜dockerパス＞
サーバ上のディレクトリやファイルをdockerコンテナにコピーするコマンド。
一つ目のマシンパスでコピーしたいディレクトリを指定し、dockerコンテナのコピー先をdockerパスの部分で指定する。

### WORKDIR
dockerコンテナの実行ディレクトリ。
docker exec 等でコンテナ内に入るとここのworkdirに飛ぶ。

### CMD
CMD　＜コマンド＞
コマンドの実行。Dockerfileの最後の行に書く。
docker run実行後にコンテナ内のWORKDIRでこのコマンドを実行する。

##dockerファイル説明
今回はFROM命令によって` node:latest`のイメージを基にしている。これをカスタマイズしていく。
` RUN mkdir -p ${APP}`でdockerコンテナ上の`/node/app`ディレクトリを作成。
` COPY . ${APP}`で現在いるディレクトリをコンテナ上の`/node/app`にコピー。
` WORKDIR ${APP}`でワーキングディレクトリを` /node/app`をしてい。
` RUN npm install`でコピーしたpackage.jsonに基づいてnodeパッケージをインストール。
` CMD npm start`でコンテナ作成後にアプリケーションの立ち上げ。

##　実行してみる
nodeアプリケーションのあるディレクトリで
` docker build -t chat_app .`を実行。
タグ名をchat_appとしてdockerイメージを作成。
<img width="727" alt="スクリーンショット 2017-09-09 22.00.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/136442/cfdbd48f-17d3-ad52-8826-96d2a3121f58.png">

` docker run -d -p 18080:3000` --name chat_app chat_app
-dオプションはdockerコンテナをバックグランドで実行する。-pはポート指定のオプション。ホストマシンの18080ポートでdockerコンテナの3000ポートに繋がる。
--nameでコンテナ名をchat_appとしている。

## ブラウザで確認
localhostu:18080にアクセスするとしっかりアプリケーションが立ち上がっていた。
<img width="489" alt="スクリーンショット 2017-09-09 21.57.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/136442/b2340f17-d77f-06b1-eb9b-2f3c6b9a596c.png">

/でユーザー登録して/loginでログインしてメニューバーのchatからリアルタイムチャットできます。

## 終わりに
次回はdocker-composeしたい。
iOS11のバグ修正を行うに当たって気になったレイアウト関連の変更点（contentInsetAdjustmentBehavior, SafeAreaLayoutGuide）

以下はβ段階での情報を元にした内容となります。
そのため、GM版では変更となる可能性があります。

##はじめに
iOS11の対応を行うにあたり、レイアウト周りでいくつかのバグを修正しました。
既出のものもあるかもしれませんが、個人的な備忘録も兼ねてまとめます。

##検証環境
以下の環境を使用しています。

* macOS Sierra Version 10.12.6
* Xcode Version 9.0.0 β6
* iOS11.0β10

##ContentInsetAdjustmentBehaviorについて
UIScrollViewに関してiOS11で新たに導入されたプロパティです。
contentInsetsを自動調整するかどうかを決めるものですが、デフォルトでautomaticになっています。そのため、contentInsetsを手動で設定している場合などにこのことを考慮していないと予期せぬ不具合が発生する可能性があります。
私の確認した範囲では、`self.navigationController?.pushViewController(notifVC, animated: true)`を実行した際に遷移のアニメーションが斜め上方向になるという事象が発生しました。事象の実際のイメージにつきましては以下の資料をご参照ください。

* 参考
    * [不具合に関しての参考資料](https://stackoverflow.com/questions/45573829/weird-uitableview-behaviour-in-ios11-cells-scroll-up-with-navigation-push-anima)
    * [Apple公式ドキュメント - contentInsetAdjustmentBehavior](https://developer.apple.com/machine-learning/)

###対応方法
従来のレイアウトを踏襲するか、iOS11のContentInsetAdjustmentBehaviorに従来のロジックを合わせるかどちらかによりますが、従来のレイアウトをそのまま踏襲する場合は以下となります。

```Swift
if #available(iOS 11.0, *) {
    scrollView.contentInsetAdjustmentBehavior = .never
}
```

##StoryBoardでのsafeArea設定について
StoryBoard上でautoLayout設定する際に、TopLayoutGuide, BottomLayoutGuideを使用することがあるかと思いますが、こちらがiOS11でdeprecatedになるようです。
[Apple Document - TopLayoutGuide]
(https://developer.apple.com/documentation/uikit/uiviewcontroller/1621367-toplayoutguide)

代わりに使用を推奨されているのがSafeAreaLayoutGuideです。
[Apple Document - SafeAreaLayoutGuide]
(https://developer.apple.com/documentation/uikit/uiview/2891102-safearealayoutguide)

topLayoutGuide, bottomLayoutGuideがdeprecatedになったことにともない、iOS11で該当のconstraintsを使用している場合に意図しない挙動になる可能性があります。
確認した範囲では、画面遷移時にtableViewが上方に一度ずれ、その後戻るという挙動が端末依存で発生しました。(iPhone5でのみ発生）

###対応方法
StoryBoard上に設定を行うチェック項目がありますので、こちらにチェックをつけるのみです。
<img width="259" alt="スクリーンショット 2017-09-09 21.16.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/154099/409dbe7b-46b7-a451-1a07-45ec9cf36c76.png">

* 参考: [safeAreaLayoutGuide](https://useyourloaf.com/blog/safe-area-layout-guide/)
 


##終わりに
この情報がどなたかのお役に立てられたら幸いです。
Scala関西SummitでDDD/CQRS+ESの話を聞いてきた

本日は宮崎から飛んで大阪に来ています。

目的はScala関西Summit。
Scalaはほとんど手をつけていなかったのですが、DDDとCQRS/ESの話がきけるということで参加を決めました。

## DDD
辻陽平さん(@crossroad0201 )の講演です。
実は興味はScalaの方ではなく、DDDをどう実装しているかが気になっていたのですが、予想外にもScalaの表現力はちょっといいなぁと思ってしまったセッションでした。

[貴重な発表資料をアップしていただきました。](https://speakerdeck.com/crossroad0201/scala-on-ddd)


単純に簡単にオブジェクトやコレクションをイミュータブルにできるとかそういう利点があるのは知っていましたが、Scalaならではの表現は他にも、

```scala
def remaindTodayScheduleTo(id: UserId)={
    def findUser={...}
    def getScheduleOf(user: User) = {...}
    ...
}
(P19より)
```
のように関数をネストできるのでprivateメソッドがとっ散らからない。とか、

Application層の実装では、

```scala
def remaindTodayScheduleTo(id: UserId)
    def findUser={...}
    def getScheduleOf(user: User) = {...}
    def sentRemainderTo(user: User, schedule: Schedule)

    for {
        user          <- findUser
        todaySchedule <- getScheduleOf(user)
        sentResult    <- sentRemainderTo(user, schedule)
     } yield sentResult
}
(P２４より)
```

のようにfor内包式を使って、UserCaseを表現したりとか、

例外をThrowせず、ラップして戻り値として返す(Either/Try)とか、テストしやすいし、APIとかは書きやすくなりそう。

対象のドメインをどのように表現するかは複雑なソフトウェアを設計する重要なテーマ。試してみようかなと思わせてくれるセッションでした。

## CQRS/ES
@mtoyoshi さんの講演です。

[貴重な発表資料をアップしていただきました。](https://www.slideshare.net/MasakiToyoshima/ladder-of-cqrses)

CQRSは今まさに実装してみようかと色々試しているところで何か得れればと思っていたところ。

C(Commnad)とQ(query)でモデルを分ける(または、Qの集約を複数組み合わせる）とか、スナップショットは毎回取るのではなく、何回かに１回(回数はきちんとドメイン・業務をきちんと考慮して決める）で良くて、取得するときにはスナップショット＋スナップショットをとった後のイベントから取得するとか。

ちょっとこの辺り、これから試してみようかと思います。

辻さんmtoyoshiさん、そしてScala関西Summitスタッフのみなさん。
本当にありがとうございました！

現場にきちんと還元します！アパホテルからは以上です。
CentOS7で機械学習の環境をさくっと作る手順

# はじめに

中古パソコンを使って機械学習の環境を整備するということを始めたので、備忘のために手順をメモしておきます。

# 主な手順

1. CentOSのダウンロードとインストール
1. yumにてPython3関連のソフトウェア取得
1. pip3にてPython3のライブラリ取得
1. Jupyter Notebookの設定

# CentOSのダウンロードとインストール

以下のリンク先でisoファイルを入手できます。

[Download CentOS](https://www.centos.org/download/)

isoファイルのデータをDVDまたはUSBメモリに書き込み、パソコンへインストールします。
インストールが終われば、再起動してログイン。

IPアドレスを確認するために以下のコマンドを実行。

```sh:
$ ip addr show | grep inet
```

SSHは最初からインストールされている（はずな）ので、好みによって別の端末からアクセスも可能。

# Python3および関連ソフトウェアのインストール

yumのリポジトリを追加。

```sh:
sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
```

以下のコマンドを実行。

```sh:
$ sudo yum -y install -y python35u python35u-libs python35u-devel python35u-pip
```

インストールができたかどうか、以下のコマンドで確認。

```text:
$ python3.5 -V
Python 3.5.4
```

pipも確認。

```text:
$ pip3.5 -V
pip 9.0.1 from /usr/lib/python3.5/site-packages (python 3.5)
```

# ライブラリの取得

必要なソフトウェアを追加。

```sh:
$ sudo yum -y install lapack-devel freetype freetype-devel libpng-devel
```

以下のコマンドを実行。

```sh:
$ sudo pip3.5 install numpy scipy matplotlib seaborn scikit-learn jupyter
```

インストールできたかを以下のコマンドで確認。

```text:
$ jupyter --version
4.3.0
```

# Jupyter Notebookの設定

以下のコマンドを実行。

```sh:
$ cd
$ mkdir notebook
$ jupyter notebook --generate-config
$ echo "c.NotebookApp.ip = '*'" >> ~/.jupyter/jupyter_notebook_config.py
$ echo "c.NotebookApp.notebook_dir = 'notebook'" >> ~/.jupyter/jupyter_notebook_config.py
```

ファイアウォールのポート番号8888を開放。

```sh:
$ sudo firewall-cmd --zone=public --add-port=8888/tcp
```

以下のコマンドを実行し、他のPCからアクセスできるか確認。

```sh:
$ jupyter notebook
```

## Matplotlibに日本語フォントを追加

以下のコマンドを実行。

```sh:
$ sudo yum -y install wget unzip
$ cd
$ wget http://dforest.watch.impress.co.jp/library/i/ipafont/10483/IPAfont00303.zip
$ unzip IPAfont00303.zip
$ sudo mv IPAfont00303/*.ttf /usr/lib64/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/
$ rm ~/.cache/matplotlib/*.cache
```

## 確認

Jupyter Notebookで、以下のスクリプトを記述して実行。

```py3:
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt

mpl.rcParams['font.family']='IPAGothic'
mpl.rcParams['font.size']=12

plt.plot([1,3,4,6], label="テスト")
plt.legend()
```

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/28fda04c-8366-e226-43e6-63b66aa83942.png)

できた(^-^)/

ついでに、以下の記事のスクリプトもきちんと動作することを確認！

[データシティ鯖江のオープンデータを使って水位計の値を機械学習で予測してみる パート2](http://qiita.com/mix_dvd/items/190a20f4ceb439a64107)
Spring Boot でコマンドラインツールを作る個人的ベストプラクティス

# TL; DR
* `CommandLineRunner` は使うけど、CommandLineRunner#run(String... args) は、Application 起動完了前に呼び出されてしまうため、初期化に読み替えて、サブクラスでオーバーライドする
* 複数のコマンドは `@ConditionalOnProperty(name = "command", havingValue = "xxx")` で起動し分けるとよさげ。

# Motivation
Spring boot 、Web サーバーをさくっと上げるところから本格的なサービスにも使えて、Batch もある程度あります。

Web サービスに使ってるロジックや、Batch 用ロジックなんかを手元で実行したかったり（何かおこったときの再実行とか。。。。）にそのまま実行できる .jar を作っておくと便利なのですが、やり方が色々あって悩む事多しの状況だったのでメモです。

# Sampleコード全部
```java
package echo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Service;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@SpringBootApplication
public class EchoApplication {
    public abstract static class Command implements CommandLineRunner {
        public final void run(final String... args) throws Exception {
            log.debug("Initialize started on {}", getClass());
            // 実際、CommandLineRunner#run(String... args) は、Application 起動完了前に呼び出されてしまう。
            // ここでは初期化に読み替えて、サブクラスでオーバーライドする
            init(args);
        }

        void init(final String... args) throws Exception {
            // 生引数を引き取って何かする
        }

        /**
         * サブクラスで実装
         * @throws Exception
         */
        abstract void execute() throws Exception;
    }

    public static void main(final String... args) throws Exception {
        try (ConfigurableApplicationContext context = SpringApplication.run(EchoApplication.class, args)) {
            context.getBean(Command.class).execute();
            // Command を取って実行
        }
    }

    @Service
    @ConditionalOnProperty(name = "command", havingValue = "foo")
    public static class FooFeature extends Command {
        @Override
        void execute() throws Exception {
            log.info("Foo");
        }
    }

    @Service
    @ConditionalOnProperty(name = "command", havingValue = "bar")
    public static class BarFeature extends Command {
        @Override
        void execute() throws Exception {
            log.info("Bar");
        }
    }
}
```

# 実行するとこんな感じに
```
% java -jar xxxx.jar --command=foo
2017-09-09 20:58:48.464  INFO 20274 --- [           main] echo.EchoApplication      : Started EchoApplication in 2.895 seconds (JVM running for 3.342)
2017-09-09 20:58:48.464  INFO 20274 --- [           main] echo.EchoApplication      : Foo

% java -jar xxxx.jar --command=bar
2017-09-09 20:58:48.464  INFO 20274 --- [           main] echo.EchoApplication      : Started EchoApplication in 2.895 seconds (JVM running for 3.342)
2017-09-09 20:58:48.464  INFO 20274 --- [           main] echo.EchoApplication      : Bar
```

# その他
## WebApp とまとめる
WebApp, CommandLine Tool をまとめたいときは、command line tool として実行するときは
`--spring.main.web-environment=false` で Web Context が起動しなくなります。

command profile を作って `application.yml` に書いておくと楽かも
Pre-Fetching APIでUICollectionViewのパフォーマンスを上げる



## overview

### Pre-Fetching API とは

- iOS10で用意された
	- セルの事前読込
		- prefetch時に、画像キャッシュや通信など、処理のやや重いものを扱うことで、スクロールの安定化などが期待できる
		- https://speakerdeck.com/toyship/ios10shi-dai-falsecollectionviewzui-xin-tukaikonasi
		
## usage

- prefetchのタイミング( = prefetchItemsAt)で、画像キャッシュのみ行う
	- 今回はNukeを利用していたため、NukeのPreheaterを使う
	- https://github.com/kean/Nuke#preheating-images
- UICollectionViewDataSourcePrefetching protocolに準拠
	- `collectionView.prefetchDataSource = self`

### prefetchItemsAt

```swift:FooViewController.swift
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath]) {
    preheater.startPreheating(
        with: makeCacheRequests(indexPaths: indexPaths)
    )
}
    
private func makeCacheRequests(indexPaths: [IndexPath]) -> [Request] {
    return indexPaths.map { 
    	Request(url: viewModel.cellModels[$0.row].url) 
    }
}
```


### cancelPrefetchingForItemsAt

```swift:FooViewController.swift
func collectionView(_ collectionView: UICollectionView, cancelPrefetchingForItemsAt indexPaths: [IndexPath]) {
    preheater.stopPreheating(
        with: makeCacheRequests(indexPaths: indexPaths)
    )
}
```

## etc

- 上記はUICollectionViewの例となるが、UITableViewにも同様の機能がある
	- UITableViewDataSourcePrefetching
	- https://developer.apple.com/documentation/uikit/uitableviewdatasourceprefetching

## ref

- http://qiita.com/ayakix/items/d1910d63151f32a78347#uicollectionviewdatasourceprefetching%E3%81%AE%E5%AE%9F%E8%A3%85
- https://littlebitesofcocoa.com/242-pre-loading-images-with-uicollectionviewdatasourceprefetching
BloggerにJupyter Notebookを貼り付ける方法

Jupyter Notebookはﾃﾞｰﾀ解析を行う環境においてｺｰﾄﾞ、結果、ｽﾄｰﾘ-を同じ場所に残すことができる非常に便利なﾂｰﾙです。　　
そのJupyter Notebookで作成したﾄﾞｷｭﾒﾝﾄをBloggerで表示させる方法について説明いたします。　　
参考にするｻｲﾄは、["Jupyter NotebookのドキュメントをWordpressに貼り込む"](http://qiita.com/AmbientData/items/47a341b5d4e030909dac)と["WordPress Blogging with Jupyter Notebook in Five Simple Steps"](http://www.mianchen.com/wordpress-blogging-with-jupyter-notebook-in-five-simple-steps/)です。
説明もこれらのｻｲﾄに沿って説明いたします。　　
*Jupyter NotebookをGistを用いる方法もありますが、限られた画面でしか表示されないみたいなのでここでは紹介いたしません。興味のある方はこちらをどうぞ["GitHub Gistを使ってブログにJupyter(IPython) Notebookを表示する方法"](https://p--q.blogspot.jp/2015/10/github-gistjupyteripython-notebook.html)。

## 具体的な手順
手順はほとんど上で挙げた参考ｻｲﾄと同じです。　　
要約すると、Jupyter Notebookで作成したﾄﾞｷｭﾒﾝﾄをhtmlﾌｧｲﾙに変換し、Blogger側でcssをいじります。

(1). Jupyter Notebookでﾄﾞｷｭﾒﾝﾄを作成し、.ipynbﾌｧｲﾙとして保存する。
(2). nbconvertでhtmlファイルに変換する 

```
$ jupyter nbconvert --to html --template basic hoge.ipynb hoge.html
```

(3). 出力されたhtmlﾌｧｲﾙの中身をｺﾋﾟｰし、bloggerのPost画面に貼り付けます。
(4). Bloggerのﾎｰﾑ画面にある「Theme」->「customize」->画面左上にある「Advanced」->「Add CSS」をｸﾘｯｸしていくとCSSｺﾏﾝﾄﾞを入れるための画面が出てくる。ここの作業は["BloggerでMarkdown書けるようにした。"](http://qiita.com/her0m31/items/1804bdc251a647e0e9a8)にある"CSSの追加編集"の項を参考にしてください。
(5). そのCSSを追加する画面に以下のｺﾏﾝﾄﾞを追加する。追加することで、Jupyter Notebookの色合いを再現することができる。

```
/************** Jupyter Notebook CSS ************************/
.input_prompt {
    color: #0066cc;
}
.output_prompt{
    color:#cc0000;
}
.prompt{
    font-family: monospace;
    font-size: 14px;
}
.c, c1 {
    color: #408080;
    font-style: italic;
}
.k {
    color: #338822;
    font-weight: bold;
}
.kn {
    color: #338822;
    font-weight: bold;
}
.mi {
    color: #008800;
}
.mf {
    color: #008800;
}
.o {
    color: #9966ff;
}
.ow {
    color: #BA22FF;
    font-weight: bold;
}
.nb {
    color: #338822;
}
.n {
    color: #000000;
}
.s, .s1 {
    color: #cc2222;
}
.se {
    color: #cc2222;
    font-weight: bold;
}
.si {
    color: #C06688;
    font-weight: bold;
}
.nn {
    color: #4D00FF;
    font-weight: bold;
}

.code_cell pre{
    font-family: "ubuntu mono"; font-size: 120%;
    background-color: #eeeeee;
    padding-left: 1%;
}
.output_area  pre{
    background-color: #FFFFFF;
    padding-left: 5%;
}
.cell pre {
    margin-top: 10px;
    margin-bottom: 10px;
}
br {
    line-height: 2;
}
.cell h1, h2, h3, h4 {
    margin-top: 30px;
    margin-bottom: 10px;
}

.text_cell_render {
    font-family: "Times"; font-size: 120%;
    color: #000000;
}
/************** Jupyter Notebook CSS ************************/
```

## 作業を終えて
(4)と(5)の作業は一度設定してしまえば、その後も設定する必要はありません。　　
これでBloggerにおいてJupyter Notebookを貼るり付けることができます。　　
もしなにか不備があれば、コメントしていただけるとありがたいです。
レスポンスタイムのパーセンタイルをmackerelでグラフにする

# 目的

とある本に、サービスレベル指標はパーセンタイルにせよ、とあったので、まずはグラフを作るところから始めてみます

# やること

Webサーバへのリクエストのレスポンスタイムに関して、
50%はXマイクロ秒以下におさまる、
90%はYマイクロ秒以下におさまる、
95%はZマイクロ秒以下におさまる、
というX,Y,Zの値を１分ごとに計算し、グラフにします。

実質的にやることとしては以下の通りです。

* fluentdでアクセスログからパーセンタイルの値を計算
* mackerelにカスタムメトリクスを作成


# 環境

* EC2 AmazonLinux 2017.03 t2.micro
* apache 2.4.27
* td-agent 2.3.5
* fluent-plugin-mackerel 1.0.0
* fluent-plugin-numeric-monitor 1.0.3

# fluentdの設定

## fluentdのインストール

percentileプラグインとしてfluent-plugin-numeric-monitor
mackerelへの転送プラグインとしてfluent-plugin-mackerel
を利用します。

```
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
# /opt/td-agent/usr/sbin/td-agent-gem install fluent-plugin-numeric-monitor
# /opt/td-agent/usr/sbin/td-agent-gem install fluent-plugin-mackerel
```
## 設定ファイルの編集

```
# mkdir /var/fluentd
# chown td-agent:td-agent /var/fluentd
# chmod 755 /var/log/httpd/
# cat /etc/td-agent/td-agent.conf
<source>
  @type tail
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")? (?<duration>[0-9]+)$/
  time_format %d/%b/%Y:%H:%M:%S %z
  path /var/log/httpd/access_log
  tag localhost.access
  pos_file /var/fluentd/access.pos
</source>

<match localhost.access>
  @type numeric_monitor
  
  tag monitor.duration
  
  unit minute
  
  aggregate all
  monitor_key duration
  percentiles 50,90,95
</match>
  
<match monitor.duration>
  @type mackerel
  api_key XXXXXXXXXXXXXXXXXXX
  service website
  metrics_name performance_percentile.${out_key}
  use_zero_for_empty
  out_keys percentile_50,percentile_90,percentile_95
</match>
# /etc/init.d/td-agent start
```

# 動作確認

```
# yum install httpd24
# vim /etc/httpd/conf/httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
# cat /var/www/html/index.html
hogehoge
# watch -n 1 "curl -s http://localhost/ > /dev/null"
```

...1時間くらい待つ

![percentile.png](https://qiita-image-store.s3.amazonaws.com/0/201436/eecdc850-6108-8e70-5705-40b228f7b36b.png)


# まとめ

fluentdを介せば意外と簡単にグラフに出来そうでした。
もっと手軽にやるならCloudWatchで十分だと思います。

ステータスコードが200のログのみに絞らないと、速くなったと思ったらエラーが増加してました、とかなりそうです。
単位をミリ秒に直したいです。
【ライブラリ】スロットマシン


## Odometer
Demo : https://codepen.io/mo4_9/pen/ayRPaq

http://black-flag.net/jquery/20131203-4888.html

### メリット

- 数字に強い（専用？）

### デメリット

- 数字表現のみ
- 画像設定が面倒臭い

### ハック

- スピードを調整する  
durationプロパティが効かないので、以下のcssをあてる

```css
.odometer.odometer-animating-up .odometer-ribbon-inner,
.odometer.odometer-animating-down.odometer-animating .odometer-ribbon-inner {
    -webkit-transition-duration: 10s !important;
    -moz-transition-duration: 10s !important;
    -ms-transition-duration: 10s !important;
    -o-transition-duration: 10s !important;
    transition-duration: 10s !important
}
```

> 参考
https://github.com/HubSpot/odometer/issues/91


## jQuery-SlotMachine

Demo : https://codepen.io/mo4_9/pen/jLRdRE

https://github.com/josex2r/jQuery-SlotMachine

### メリット

- シャッフルするだけのモックに使える

### デメリット

- 終点が決められない


## Roulette.js

Demo : https://codepen.io/mo4_9/pen/ZJZwOz

http://pannyatto.firebird.jp/archives/1938

### メリット

- 終点を決めて、画像をさくっと回したい時にだけ使える

### デメリット

- imgタグしか対応していない（background-imageは不可）
- 回転方向反転のプロパティがない（以下のハックで回転可能）


### ハック

- 回転方向を反転させる

```css:外枠を180度回転させて、画像も180度回転させる
.roulette{
  transform:rotate(180deg);
}
img{
  transform:rotate(180deg);
}
```

- 回転スピードを変える  
ライブラリの中身を見ていくと`roll関数`があるので、そこで`_speed`に加算する値を変えてしまう

## CSS

スプライト画像がつくれる状況ならcssで事足りる

## カルーセルライブラリで高速回転させる

easeout系で止まるときに不自然になりそうだから無理っぽい
（やったことないからわからない。思いつき。）
おもしろメタプログラミング/３章

# ３章 火曜日
### 目次
- 3.1 重複問題
- 3.2 動的メソッド
    - 3.2.1 動的に呼び出す => ハンズオン 動的メソッド呼び出し
    - 3.2.2 pry
    - 3.2.3 動的に定義する => ハンズオン 動的メソッド定義
- 3.3 method_missing => ハンズオン method_missing
- 3.4 クイズ:バグ退治
- 3.5 ブランクスレート
- 3.6 まとめ

### ハンズオン 動的メソッド呼び出し

```rb
class SomeClass
  def kamezaki
    p 'my name is kamezaki'
  end

  def sasaki
    p 'my name is sasaki'
  end

  def shimada
    p 'my name is shimada'
  end

  def naaya
    p 'my name is naaya'
  end
end

some_obj.kamezaki
some_obj.sasaki
some_obj.shimada
some_obj.naaya
```

1, これを動的呼び出しを使って簡潔に

### ハンズオン 動的メソッド定義

1, 上を動的定義を使って簡潔に

### ハンズオン method_missing

1, 上をmethod_missingを使って簡潔に

## todo 
- クイズ self
- ハンズオン private

# 答え

### 動的メソッド呼び出し

```rb
class SomeClass
  def kamezaki
    p 'my name is kamezaki'
  end

  def sasaki
    p 'my name is sasaki'
  end

  def shimada
    p 'my name is shimada'
  end

  def naaya
    p 'my name is naaya'
  end
end

obj = SomeClass.new
['kamezaki', 'sasaki', :shimada, :naaya].each do |name|
  obj.send("#{name}")
end
```

### 動的メソッド定義

```rb
class SomeClass
  def initialize(name)
    define_method name do
      p "my name is #{name}"
    end
  end
end

NAMES = ['kamezaki', 'sasaki', :shimada, :naaya]

NAMES.each do |name|
  SomeClass.new(name).send("#{name}")
end
```

### method_missing

```rb
NAMES = [:kamezaki, :sasaki, :shimada, :naaya]

class SomeClass
  def method_missing(method_name, *args)
    return unless NAMES.include?(method_name)
    p "my name is #{method_name}"
  end
end

obj = SomeClass.new

NAMES.each do |name|
  obj.send("#{name}")
end
```
おもしろメタプログラミング/２章

# 二章 月曜日オブジェクトモデル

### 目次
- 2.1 オープンクラス => ハンズオン モンキーパッチ
- 2.2 オブジェクトモデルの中身
    - 2.2.1 オブジェクトの中身
    - 2.2.2 クラスの真相 => クイズ クラス
    - 2.2.3 定数
    - 2.2.4 オブジェクトとクラスのまとめ
    - 2.2.5 ネームスペースを使う
- 2.3 クイズ: 引かれてない線
- 2.4 メソッドを呼び出すときに何がおこなわれているの？
    - 2.4.1  メソッド探索 => 説明 ハンズオン メソッド探索
    - 2.4.2 メソッド実行
    - 2.4.3 Refinements
- 2.5 クイズ:絡み合ったモジュール
- 2.6 まとめ

### ハンズオン モンキーパッチ

1, String classに新しいメソッドを追加しよう
2, String classの既存のメソッドを上書きしよう

ex)

`$ vim monkey_patch.rb `

```monkey_patch.rb
class String
  def monkey_patch_method
    p 'I am monkey patch'
  end

  def to_i
    p 'to_i is overridden'
  end
end

'a string'.monkey_patch_method
'1'.to_i
```
`$ ruby monkey_patch.rb `

### クイズ クラス

1, 'mystring'.class #=> ?

2,  String.class #=> ?

3,  Class.class #=> ?


```
class MyClass < String
end
```

4, MyClass.superclass #=>?

5, String.superclass #=> ?

6, Object.superclass #=> ?

7, BasicObject.superclass #=> ?

8, Class.superclass #=> ?

### クイズ self
```rb
class SomeClass
  self
  def initialize
  end

  def self.class_method
    p self
  end

  def some_method
    p self
  end
end
```

### 説明 メソッド探索

```
my_object = MyClass.new
my_bject.my_method
```

メソッド探索のルールは
「Classに入って(右へ一歩)、SuperClassを登る(それから上へ)」

※ClassにModuleがインクルードされてたら、Classの上に入れる

### ハンズオン メソッド探索
```rb
module M1
end

module M2
  include ::M1
end

module M3
  prepend ::M1
  include ::M2
end


p M3.ancestors
```
1, M3.ancestors #=>?

```rb
module PrependedModule
  def some_method
    p 'prepended module'
  end
end

module SomeModule
  prepend PrependedModule
  def some_method
    p 'some module'
  end
end

class SuperClass
  def some_method
    p 'super class'
  end
end

class SubClass < SuperClass
  include SomeModule
end

SubClass.new.some_method
```

2, SubClass.new.some_method #=> ?
シグモイド関数の微分

シグモイド関数の微分は、機械学習の誤差逆伝搬法で登場したが微分の際に意味が分からなかったので高校数学を復習してみた。

# 前提
```math
sigmoid(z) = \frac{1}{1 + e^{-z}}
```

# 結論

```math
f(z) = sigmoid(z) \\
```
とした時、

```math
f(z)' = (1 - f(z)) \cdot f(z)
```

# 導出
シグモイド関数を使いやすく式変形すると以下の式になる。

```math 
f(z) = (1 + e^{-z})^{-1} \tag{1}
```

ここで、

```math
1 + e^{-z} = u  \tag{2}
```
とおくと、

```math
f(z) = u^{-1} \tag{3}
```

と、f(z)を表せる。

（2）（3）を微分して

```math
\frac{du}{dz} = -e^{-z} \tag{4}
```

```math
\frac{dy}{du} = -u^{-2} = -(1 + e^{-z})^{-2} \tag{5}
```

合成関数の微分の公式に(4)(5)を当てはめて

```math
\frac{dy}{dz} = \frac{1}{(1 + e^{-z})^2} \cdot e^{-z} \tag{6}
```

(6)を式変形して

```math
\frac{dy}{dz} = \frac{e^{-z}}{1 + e^{-z}} \cdot \frac{1}{1 + e^{-z}} \tag{7}
```

(7)の右辺の左側を変形して

```math
\frac{e^{-z}}{1 + e^{-z}} = \frac{1 + e^{-z}}{1 + e^{-z}} - \frac{1}{1 + e^{-z}} \tag{8}
```

(7)に(8)を当てはめると

```math
\frac{dy}{dz} =  \left( \frac{1 + e^{-z}}{1 + e^{-z}} - \frac{1}{1 + e^{-z}} \right ) \cdot \frac{1}{1 + e^{-z}} \tag{9}
```

シグモイド関数の

```math
f(z) = \frac{1}{1 + e^{-z}}
 ```
を(9)に当てはめられるので

```math
    f(z)' = (1 - f(z)) \cdot f(z)
```

となり、最初に示した形になる。

# 合成関数の微分

```math
\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}
```

# 参考
[シグモイド関数を微分してみたよ](http://nonbiri-tereka.hatenablog.com/entry/2014/06/30/134023)
※参考サイトでは、dz/du=e^-zとしていますが間違っており、正しくは-e^-zなのでご注意ください。

[合成関数の微分公式と例題7問](https://mathtrain.jp/composite)
swift 3.0 オプショナル型の宣言とチェック方法

#オプショナル忘備録

```AboutOptional.swift

//オプショナル型の２種類の宣言

let s : Optional<String> = "1"
let v : String? = nil

//オプショナルはチェックしないと使えない
//オプショナルの判定は三種類

//チェック方法１
//if文チェック

if s != nil {
    print(s!) //unwrap　→ sを取り出す処理
}
//ちなみに関数の中にコメントを書いてもエラーは出ません。

//チェック方法２
//Optional Biding
//ex. s != nilの時　unwrapして valueに代入する
if let value = s {
    print(value)
}

//チェック方法３
print(s ?? "this is nil")
[Survey] Kaggle - Quora 2位解法まとめ

Kaggle - Quora Question Pairs[^1]の2位解法[^2]の調査記事です．

Author: Silogram
Title: Overview of 2nd-Place Solution
Discussion URL: https://www.kaggle.com/c/quora-question-pairs/discussion/34310

### Summary

- 6つのLightGBM[^3]と1つのニューラルネットのアンサンブル
- グラフ構造上の性質を用いたキャリブレーション（Jared(3位)手法[^4]と類似)
- 特徴量の次元は数千(疎なN-gramベクトルを含む)
- 単一モデルでのLB上でのスコアは0.116〜0.117
- NLP処理で有用だったことは多くの異なる方法でのテキスト処理
(e.g. 小文字への変更と変更なし, 異なる方法で変換された句読点, ストップワード除去と未除去, ステミング処理ありとなし等)

### コンテスト上の問題点

- 作問方法に問題があったため，質問ペアでできるグラフ構造上の問題が重要だった．
- インド関連の質問が多くてTFIDFやTFに影響があった(地域の影響はない方が良いのでは?という話)
- ラベルの不備が目立った

### 疎なN-gramについて

- バイナリtfを使用．上位2000個の1-gramと2-gramを除去
- 質問1と2のベクトルを合算して，各N-gramに3つのラベルに変換(0:どれにもない．1:片方のみ存在，2:両方に存在)

## References

[^1]: Kaggle, [Quora Question Pairs](https://www.kaggle.com/c/quora-question-pairs), 2017.
[^2]: Silogram, [Overview of 2nd-Place Solution](https://www.kaggle.com/c/quora-question-pairs/discussion/34310)
[^3]: Microsoft, [LightGBM](https://github.com/Microsoft/LightGBM), 2017.
[^4]: Jared Turkewitz, [Overview Of 3rd Place Solution](https://www.kaggle.com/c/quora-question-pairs/discussion/34288)