OmniAICreator/Qiita-1.07M huggingface dataset:
（Mac）MatplotlibとSeabornで日本語表示する方法 At MacOS Sierra

#0. はじめに
どうでもいいことですが、これが初投稿です。
[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)をPython3でやっていて、グラフ表示をmatplotlibでやろうとしたところ、日本語表示で悶えたので、忘れないようにメモ。

#1. 結論
先人の知恵 + ***キャッシュファイルの削除***


です。
※Seabornも使ってます。matplotlibだけだと動くかどうかわかりません。

#1-1. 先人の知恵
はここから
[【Seaborn】日本語を表示する (フォントを変更する)](http://qiita.com/keisuke-nakata/items/2309764d21438645f6b9)

or
以下私が試した方法（新しいのでおすすめ？）。こちらだと確実に動くと思います。

#1-1'. フォント導入からSeabornのフォント設定変更
先人の知恵セッティングを済ませた方はすっ飛ばして[1-2. キャッシュの削除](http://qiita.com/kamuiroeru/items/6853f14dc493ec5063f7#1-2-キャッシュファイルの削除)へどうぞ。
##(1)フォント導入
適当なフォントを持ってきてインストールします。
※ただし使えるフォントはTrueFont形式(*.ttf)だけです。

先人にならって[IPAexフォント](http://ipafont.ipa.go.jp/)を使うことにします。
ダウンロードして解凍すると、ipaexg.ttfというファイルがあるはずなので、そのままインストール(Finderならipaexg.ttfをダブルクリック)しましょう。

##(2)Seabornの設定
`rcmod.py`を探します。先人は
```python_install_folder/lib/site-package/seaborn```の中にあると言ってます。
が、私の環境では（pyenvで管理しているので）
`~/.pyenv/versions/3.5.2/lib/python3.5/site-packages/seaborn`
にありました。

2016/12/25追記：
anacondaで環境を再導入したところ、更に深い階層にありました。
`~/.pyenv/versions/anaconda3-[versionNum]/lib/python3.5/site-packages/seaborn`


`rcmod.py`を見つけたら、（バックアップしてから）エディタで２箇所変更します。

81, 82行目あたり

```py3
def set(context="notebook", style="darkgrid", palette="deep",
        font="sans-serif", font_scale=1, color_codes=False, rc=None):
```

190行目あたり

```py3
"font.family": ["sans-serif"],
```

の
`"san-serif"`を`"IPAexGothic" （新しいフォント名）`
に変更します。

保存してseabornのフォント設定は完了です。
まだ日本語表示はできません。

###(小ネタ)元からインストールされてる日本語対応TrueTypeフォントを使う場合は？
Font Bookからインストール済みのフォントを見ることができます。
![例](https://qiita-image-store.s3.amazonaws.com/0/151205/24c0919a-a9ca-990b-1313-edccbd2fb17a.png)

詳細表示の中の`ファミリー`の項目を見ましょう。この場合だと`Migu 1P`ですね。
この`ファミリー`に書かれている項目名を新しいフォント名に指定します。
例
`"san-serif"`を`"Migu 1P" （新しいフォント名）`に変更



#1-2. キャッシュファイルの削除
お待たせしました。本題です。
単刀直入に言うと、

***fontList.py3k.cache***
もしくは
***fontList.jsonを消す！！！！***

以上です。
おそらく ```~/.matplotlib/``` にあると思います。matplotlibrcがあるディレクトリですね。複数ある場合はホームディレクトリ直下にあるものが優先されるはずです。

手っ取り早く削除しちゃいましょう。

```sh
cd ~/.matplotlib
```

の後、

```sh
rm -f fontList.py3k.cache
rm -f fontList.json
```

※py3kの部分は環境によって変わるかもしれません。

これでmatplotlibを動かしてみましょう。
キャッシュファイルを作り直すのでいつもより時間がかかるかとは思いますが…
どうですか？うまくいきました？

**2018/02/05追記**
最近のmatplotlib(version 2.1.0)だと、
`fontList.py3k.cache` が見つからず、 `fontList.json`の削除で反映されました。

---
#なぜcacheを削除しないとダメなのか
（以降は私の勝手な推論なので間違い等含んでいる可能性があります)

matplotlibは初回起動時にどんなフォントファイルがあるのかをキャッシュファイルにして以降そればっかり読み出すみたいです。

Source
matplotlibの公式GitHubのissue
[Won't use a font although it can be found by the FontManager #3590](https://github.com/matplotlib/matplotlib/issues/3590/)
>you'll need to **remove the fontList.cache file** everytime you want matplotlib to discover new fonts.

という返信がありますので、

フォントの設定を変えたら毎回**キャッシュファイルを変えないといけない**ようですね。
FASTAファイルの整形

FASTAファイルをダウンロードすると、

\>GENENAME
ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
ACGTACGTACGTACGTACGT

というかたちで改行がついてきてしまう。このままだと扱いにくいため、遺伝子名を残したまま改行を取り去るワンライナー

FASTA.faをcatでsedに渡す

```
cat FASTA.fa
```

\>で始まる行の文末だけ<を付加する

```
sed -e '/^>/s/$/</g'
```

すべての改行コード（この場合\n）を消す

```
tr -d "\n" 
```

\>を\n>（改行コードと>）で置換する

```
sed -e 's/>/\n>/gp'
```

目的遺伝子（GENEOFINTEREST）を含む行のみ取り出し、<を\n（改行コード）に置換する

```
sed -n -E '/GENEOFINTEREST* /s/</\n/gp
```

これらをパイプで繋いで

```
cat FASTA.fa | sed -e '/^>/s/$/</g' | tr -d "\n" | sed -e 's/>/\n>/gp' | sed -n -E '/GENEOFINTEREST/s/</\n/gp' > output.txt
```
[Tips] この投稿のMarkdownどうやって書いたの? と思ったら

Qiita投稿初級者向けの Tips です。

Qiitaを読んでいて、

* この文章 <font color=red>色</font> がついてる。どうやって?
* このシンタックスハイライトは ```` ``` ```` のあと何を指定してるんだ?
* っていうか「 ```` ``` ```` 」ってどうやって書くんだ?

とか思ったら、ググってもいいんですが、**編集リクエスト**　をクリックすると、投稿時と同じ編集画面がでてくるので、ソースコード見放題です。

一度でも編集リクエストしたことある人は全員知ってることですが、私は最近知って便利だと思ったので。

追記:見終わったらリクエストは送信せずに戻りましょう。
WindowsのCaffeでファインチューニングするお話

# はじめに
Deep Learningを始めて、学習／認識できるようになって、次に頑張らなくてはいけないのが認識率の向上。
てことで、ファインチューニングのお話。

# ファインチューニングとは
すでに学習済みのモデルを使って、自分用に賢くする仕組み。
一から学習させるよりも楽で、しかも認識率がよいのでいいことづくめ。
ただし、自分が認識させたいものと合っている学習済みモデルを探す必要がある。

## 具体的な話
ニューラルネットワークにおいて、ニューロンの重みや閾値は、最初は初期値で設定され、逆伝播によって調整されていきます。
![20151007195948.png](https://qiita-image-store.s3.amazonaws.com/0/130771/5da15736-0962-1a22-dc01-64bf815c772d.png)
この初期値を、すでに学習済みのモデルの値を利用しようというのがファインチューニングです。

# Caffeの学習済みモデル
実は「[Model Zoo](http://caffe.berkeleyvision.org/model_zoo.html)」というものが用意されおり、ここに公式／非公式の学習済みモデルが置かれている。

## 公式の学習済みモデル
公式には、以下の学習済みモデルが用意されている。
ちなみに、ソルバーやネットワークが記述されたProtoTxtは「caffe\models」にあるものを利用する。

| 名前 | 内容 | URL |
|:--|:--|:--|
| BVLC Reference CaffeNet | 一番標準的なサンプル（AlexNetをシンプルにしたもの） | [http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel](http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel) |
| BVLC AlexNet | いわゆる「AlexNet」 | [http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel](http://dl.caffe.berkeleyvision.org/bvlc_alexnet.caffemodel) |
| BVLC Reference R-CNN ILSVRC-2013 | R-CNNのサンプル | [http://dl.caffe.berkeleyvision.org/bvlc_reference_rcnn_ilsvrc13.caffemodel](http://dl.caffe.berkeleyvision.org/bvlc_reference_rcnn_ilsvrc13.caffemodel) |
| BVLC GoogLeNet | いわゆる「GoogLeNet」 | [http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel](http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel) |

## 非公式の学習済みモデル
「コミュニティモデル」と呼ばれるもので、Caffeのユーザが作成したものになる。
「Model Zoo」の[Wikiページ](https://github.com/BVLC/caffe/wiki/Model-Zoo)からたどって取りに行くことになる。
大体、GitHub Gistに置かれている。

※全て英語なので、探すのがちょっと大変 ^^;

# 実行コマンド
取得した学習済みモデルを使用してファインチューニングするには、「caffe.exe -solver solver_file -weights caffemodel_file」という感じで行う。
もちろん自分の環境に合わせてファイルを修正（自分の環境用の画像データベースを指定するなど）する必要がある。

## 注意事項

- 入力画像サイズは変えてはいけない（Dataレイヤーのtransform_param→crop_size）
- 分類数を変えるときは、レイヤー名を変更すること（deploy.prototxtの修正も忘れずに）
PRMLのアルゴリズムをPython(ほぼNumpyだけ)で実装

自分の勉強（機械学習のアルゴリズムやPythonの勉強）のためにPRMLに掲載されている手法をPythonで実装していきます。

原則としては、アルゴリズムの部分ではPythonの標準ライブラリに加えて**Numpyだけ使用可能**としていきます。scikit-learnやtensorflowなどの機械学習パッケージは使いません。matplotlibなどの結果を図示するパッケージはアルゴリズムの実装と関係がない限りは使っていきます。また、必要になったらscipyなどの他のパッケージもたまに使っていきます（すでにディガンマ関数などに使用）。ただし、最適化ツール（例えばscipy.optimizeやtensorflowの自動微分機能）などの実装を著しく簡単にするものは使いません。

基本的には、章ごとに一つの手法を実装していきます。~~一通り終われば二周目に入るかもしれません。~~自分の勉強のためのものなので、なんでもかんでも詳しく説明していくことはしません。自分で見返すのに要らないと判断した説明は省いていきます。

# 記事
実装済みの記事へのリンク、実装予定の手法一覧です。

|PRML|記事|
|----|----|
|第１章 序論|[ベイズ曲線フィッティング](http://qiita.com/cutting_the_Gordian_knot/items/555802600638f41b40c5)|
|第２章 確率分布| [スチューデントのt分布](http://qiita.com/cutting_the_Gordian_knot/items/5409ffeb523e03768ade)|
|第３章 線形回帰モデル| [エビデンス近似](http://qiita.com/cutting_the_Gordian_knot/items/8ce8bb87794d43abb521)|
|第４章 線形識別モデル|[ベイズロジスティック回帰](http://qiita.com/cutting_the_Gordian_knot/items/0c3315dca6f2fa83b544)|
|第５章 ニューラルネットワーク|[誤差逆伝播](http://qiita.com/cutting_the_Gordian_knot/items/507f2f1531b870a973bf)、[混合密度ネットワーク](http://qiita.com/cutting_the_Gordian_knot/items/19c4a4f205b855cf6a05)|
|第６章 カーネル法|[ガウス過程回帰](http://qiita.com/cutting_the_Gordian_knot/items/4c4607edf15072cddc46)|
|第７章 疎な解を持つカーネルマシン|[関連ベクトル回帰](http://qiita.com/Gordian_knot/items/ee512530618a5eeccd1a)|
|第８章 グラフィカルモデル|[積和アルゴリズム](http://qiita.com/Gordian_knot/items/04223bbc4a1545e0ac90)|
|第９章 混合モデルとEM|[混合ガウス分布の最尤推定](http://qiita.com/Gordian_knot/items/22ce61fc0ffbc12c64d1)|
|第１０章 近似推論法|[変分混合ガウス分布](http://qiita.com/Gordian_knot/items/49d07215f700ecb03eeb)|
|第１１章 サンプリング法|[マルコフ連鎖モンテカルロ](http://qiita.com/Gordian_knot/items/794ae32e9f9f154435ee)|
|第１２章 連続潜在変数|[ベイズ的主成分分析](http://qiita.com/Gordian_knot/items/89c11192affe7f236852)|
|第１３章 系列データ|[隠れマルコフモデルの最尤推定](http://qiita.com/Gordian_knot/items/ccfad9feeb937da07185)|
|第１４章 モデルの結合|[条件付き混合モデル](http://qiita.com/Gordian_knot/items/3f7e9b37e9bc81b5c063)|
[Laravel][Vagrant] laravel/homestead を利用する際に、Vagrant の box のバージョン遡って導入した手順の例

# 前置き
LaravelをMacに入れようとして、PHPのバージョンやMySQLを調整していたら、バグがひどくなってきて既存の開発環境を壊しかねなかったので、Vagrantを使って、環境を分けることにしました。

# laravel/homestead
laravelには[laravel/homestead](https://laravel.com/docs/5.0/homestead)という便利なboxが既にあって、公式で取り上げられているのでこれをつかいます

# 問題
laravel/homesteadの最新はv0.6.0で、PHPは7を使っています。詳しい情報をたどるのは結構手間ですが、[この辺](https://atlas.hashicorp.com/laravel/boxes/homestead)から、バージョンを遡ってみたりしいきました。

PHPは5.6を使いたいので、v0.3.3を使う必要があります。

```zsh
$ vagrant box add laravel/homestead --box-version 0.3.3 # とにかく時間がかかるのでひたすら待ちます
==> box: Loading metadata for box 'laravel/homestead'
    box: URL: https://atlas.hashicorp.com/laravel/homestead
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) virtualbox
2) vmware_desktop

Enter your choice: 1
==> box: Adding box 'laravel/homestead' (v0.3.3) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/laravel/boxes/homestead/versions/0.3.3/providers/virtualbox.box
==> box: Successfully added box 'laravel/homestead' (v0.3.3) for 'virtualbox'!

$ vagrant box list | grep homestead
laravel/homestead  (virtualbox, 0.3.3)
```

# Install
## Download
githubからcloneするなら

```zsh
$ git clone https://github.com/laravel/homestead.git Homestead
```

もしくは以下からダウンロード

```zsh
https://github.com/laravel/homestead/releases
```

## Create Homestead.yaml

```zsh
$ bash init.sh
```

```~/.homestead``` 以下にできます



# Vagrant立ち上げ
## Homestead.yamlをいい感じに設定
```zsh
ip: "192.168.10.10"
memory: 2048
cpus: 1
provider: virtualbox
authorize: ~/.ssh/id_rsa.pub

keys:
    - ~/.ssh/id_rsa

folders:
    - map: ~/Homestead
      to: /home/vagrant/Code
      type: "nfs"

sites:
    - map: homestead.app
      to: /home/vagrant/Code/Laravel/public

databases:
    - homestead

variables:
    - key: APP_ENV
      value: local

# blackfire:
#     - id: foo
#       token: bar
#       client-id: foo
#       client-token: bar

# ports:
#     - send: 93000
#       to: 9300
#     - send: 7777
#       to: 777
#       protocol: udp

```

## homestead.yamlにbox versionを記述
```yaml
provider: virtualbox
  version: "0.3.3"
```

## /etc/hosts

```zsh
192.168.10.10  homestead.app
```

## vagrant up

```zsh
$ vagrant up
```

# アクセス
http://homestead.app
ld: library not found for -lPodsの対処法

### 概要
MacBook Pro (15-inch, Late 2016)を買った。

自分が管理しているiOSアプリの開発環境を移行していたら、ビルドエラーが発生した。

```
ld: library not found for -lPods
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

### 開発環境
XCode 8.1
CocoaPods 1.1.1

### 原因
libPods.a 静的ライブラリーが見つからない。

### どう対応したか。
とりあえず本家サイトを調べる。
[本家のトラブルシューティング](https://guides.cocoapods.org/using/troubleshooting.html#using-the-cocoapods-project)を確認すると、

```
If Xcode complains when linking, e.g. Library not found for -lPods, it doesn't detect the implicit dependencies:

Go to Product > Edit Scheme
Click on Build
Add the Pods static library, and make sure it's at the top of the list
Clean and build again
If that doesn't work, verify that the source for the spec you are trying to include has been pulled from GitHub. Do this by looking in <Project Dir>/Pods/<Name of spec you are trying to include>. If it is empty (it should not be), verify that the ~/.cocoapods/master/<spec>/<spec>.podspec has the correct git hub url in it.
If still doesn't work, check your Xcode build locations settings. Go to Preferences -> Locations -> Derived Data -> Advanced and set build location to "Relative to Workspace".
```

とあるので、その通りにやってみようとすると、
「Add Pods static library」
の部分で、Pods ライブラリが無い。無いので追加できない。

よく見てみると、Pods-ProjectNameのライブラリがある。

僕の場合は、同作業中にCocoaPodsのバージョンを1.x系にアップデートしていたので、
Podfileを書き直していた。

その過程でTargetを指定したので、
-lPods から -lPods-"Target"
に変更されていた。

そうすると、-lPodsの指定がいらないはず。

Project -> Build Phases -> Link Binary With Libraries
を確認すると、libPods.aが含まれていたので削除。

Clean して Build したらビルドできた。

### 記事書いてみて
普段は、あまり記事を書かないし、トラブルシューティング記事は特に書かないけど、
昨日職場でAdvent calendarの話が盛り上がったので書いてみた。
普段から各練習をしてないとやはり時間がかかるので、こまめに書くのもいいなと感じた。

この記事書くのに15分ぐらいかかった。

### あとがき
すごい久しぶりにプロジェクトをビルドしたので、メンテナンス不足によるトラブルでした。
多分、世間が問題になった頃から大分経っていると思います。ウラシマ記事でした。
one tab から　booky.ioへURLをエクスポートしたい・・・

one tab へまとめてポイしたタブをbooky.ioでクラウド管理する。

one tab　は　「｜」で区切ってるので

grep -on ^[^\ ]* 

でURLだけ撮ってきてHTML形式に変換したい・・・

```
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
     It will be read and overwritten.
     DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
    <DT><H3 ADD_DATE="1479859771" LAST_MODIFIED="1480094480" PERSONAL_TOOLBAR_FOLDER="true">ブックマーク バー</H3>
    <DL><p>
        <DT><A HREF="file:///home/yuta/kaihatu/test.html" ADD_DATE="1479859896">test.html</A>
        <DT><A HREF="http://codepen.io/kt2016/pen/eBRqNV" ADD_DATE="1480094480" ICON="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACH0lEQVQ4jaWTz0tUURTHP+fe92x0LdMwuEiUinnvjZMEA/0DRUQYtAtK0U27EKJcWGIEQhktglpIWYtWCdEi2rrrhxrMzBsIppUgMuuQl757b4tmcgongr6ryz3f7/mec+65QhcUCsOBUpklgCRJJhuNRv0gnj7gzgvDwg3P63mptTqilAz4vjeVzR5Om83me8B2kuVPV60zz4AT4BaAciv0AeQm8NmYZKJeb8RtjepwnfH93nXnyIgk5Wo1ngV2gd1qNZ4VScrOkfH93vUwLMwAHoDX6WqtXajV4jst4W+oVBobwMkoCmZF1HwUhReMSSYkisJvQJ+IG6tU4jdtwcjI8dPWei8ArN27Esdf3rVjxWJw3jl5DezofD531zmXgpzr7+9vGmO+Dg0NPQK1CG4V2BLRc9lsdiBN09XBwcFLIuoJoLVWGSmVii5N7VURGQU3BewAqbXuWhzHywBBEIwrJQ9bffeBLDnnNjxPPVbsw3U5/zUupVLRGWP3gB1j7PT29varfD6/KMIkuLct2lmleLq5uTWdy+Uuaq0eAH1aK7/rEIPg2Bml/OdKiaTp7uVuQ1TGJGVgzTlZiaJgHugB+Clwn6y1HzvEPVEUzDsnK8CaMUnZa23VqTAsXNda3w7DcEypZLz17uy7Do9am1lWSo4aY27VavV7QPrfq/xbgha8djUicgjAOffdWuaq1ep9IO0kH5TgVzX/8p1/ABmz+882JxSGAAAAAElFTkSuQmCC">table</A>
    </DL><p>
</DL><p>
```
SQLアンチパターン：ジェイウォーク（信号無視）

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

## 目的

- 複数の値を持つ属性を格納する
 - 1つのカラムに、「,」区切りなどで複数の値をいれる
 - やった記憶がある

```sql
CREATE TABLE Products (
  product_id SERIAL PRIMARY KEY,
  product_name VARCHAR(1000),
  account_id VARCHAR(100)
);

INSERT INTO Products (product_id, product_name, account_id) VALUES (DEFAULT, 'Visual TurboBuilder', '12,34’);
```

```sql
CREATE TABLE Accounts (
  account_id SERIAL PRIMARY KEY,
  account_name VARCHAR(1000)
);
INSERT INTO Accounts (account_id, account_name) VALUES (12, 'Visual C++');
INSERT INTO Accounts (account_id, account_name) VALUES (34, 'Visual Java');
```

```sql
SELECT * FROM Products AS p INNER JOIN Accounts AS a ON p.account_id REGEXP '[[:<:]]' || a.account_id || '[[:>:]]' WHERE p.product_id = 1;
```

## アンチパターン

- 等価による比較ができない
- パターンマッチで見つける
 - SQLもパターンマッチが使えたのか...
- インデックスのメリットなし
- join も手間がかかる
- 集約関数（sum、count）とかが使えない
- カラム内のソートの問題
- 追加する情報の妥当性
- 区切り文字の問題（「,」が使われる値の入力）
- リストの長さの制限

## 解決策

- 交差テーブルを作成する
- joinが使えて、インデックスも使える

## 感想

- 以前は見たことがあったけれど、最近見ていなかったパターン
 - ソーシャルゲームだと join が怖くて使えなかったからかな？
- Rails を使うようになってからは、中間（交差）テーブルの扱いが比較的楽になったと感じているので、使いやすくなった
- 中間テーブル？交差テーブル？については、t_wadaさんが答えてた
 - https://twitter.com/t_wada/status/413497591314120704

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">@osa522 呼び方がいろいろあるので悩みました。脚注に &quot;交差テーブルは、関連テーブル、結合テーブル、多対多テーブル、マッピングテーブルなどと呼ばれることもありますが&quot; と書きましたが、そういえば「中間テーブル」という呼び名もありましたね…… <a href="https://twitter.com/hashtag/sqlap?src=hash">#sqlap</a></p>&mdash; Takuto Wada (@t_wada) <a href="https://twitter.com/t_wada/status/413497591314120704">December 19, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
【自分用メモ】HP ML110 G7 へESXi6.0インストール時注意事項

1.ML110G7をESXiのDVDからブートする
2.VMインストーラー起動直後にShift+Oを押す（画面下部に記載あり）
3.出てきたコマンドの後ろにそのまま(スペース)noIOMMUを入力してし起動を進める
4.インストールし完了したらDVDメディアを取り出して、再起動する
5.また最初の起動画面でShift Oを押す（画面下部に記載あり)
6.出てきたコマンドの後ろにそのまま(スペース)noIOMMUを入力してエンター
7.VMが起動するので、トラブルシューティングオプションからSSHを使用するよう設定する。
　またIPアドレスを振って外部からSSH接続できるようにしておく。
8.外部のPCからSSH接続（チャレンジレスポンス）で接続し、そのあとに
　vi /bootbank/boot.cfg
　開いたらkerneloptの項目の後ろに(スペース)noIOMMUを入力し保存する。

利用したイメージ
VMware-VMvisor-Installer-6.0.0.update02-3620759.x86_64.iso

以上
GoogleChromeでlocalhostのFaviconのキャッシュを削除する

mac利用です。

```
rm ~/Library/Application\ Support/Google/Chrome/Default/Favicons
```

これで変化がない場合は今利用しているユーザーが ```Default``` では無いので、
下のコマンドで profile + somenumber ディレクトリを探して削除する。

```
ls -al ~/Library/Application\ Support/Google/Chrome/
rm ~/Library/Application\ Support/Google/Chrome/Profile\ 1/Favicons
```
親を3つ以上持つコミット

Gitで普通にコミットすると1つの親コミットを持つコミットが生成され、あるブランチを別のブランチにマージすると親コミットが2つのマージコミットが生成される。よくある状況ではこのように親コミットは2つまでだが、実は3つ以上の親を持つマージコミットを作ることもできる：

```shell-session
% git log -1
commit 58f10941837dda3b1536ecfada244ffbf6f195ea
Merge: d3973e3 2a25fae 695077b
Author: Foo Bar <foo@example.org>
Date:   Sat Nov 26 10:00:44 2016 +0900

    Merge branches 'aaa' and 'bbb'
% git log --oneline --graph
*-.   58f1094 Merge branches 'aaa' and 'bbb'
|\ \
| | * 695077b bbb
| |/
|/|
| * 2a25fae aaa
|/
* d3973e3 master
```

git-merge(1) によるとこういうマージを Octopus merge と呼ぶとのこと。

```
<commit>...
    Commits, usually other branch heads, to merge into our branch.
    Specifying more than one commit will create a merge with more than
    two parents (affectionately called an Octopus merge).
```

使い道としては、複数の永続ブランチから自動で継続的にマージをしていく事例が [git merge-distinct: octopus-merge で複数ブランチを効率的に処理する](http://japan.blogs.atlassian.com/2015/01/git-merge-distinct-octopus-merge/) で紹介されているのを見つけた。私はまだ実際に現場で使ったことはないのだが、一度に3つ以上のブランチを統合するケースで利用できるので、例えば、互いに依存関係のあるモジュールを複数のフィーチャーブランチで並行で開発していて、統合先のブランチに両方一気にマージしたい場合（統合先に依存関係が壊れた状態のコミットを作りたくない時）に使えるかも。他にはどういうシーンで使えるだろうか。

(2021.12.18追記) stashを保持するためのデータ構造として３つ親のマージコミットが使われていました。詳しくは[git stashの仕組みが面白い](https://yoichi22.hatenablog.com/entry/2020/05/21/081044)をご覧下さい。
Ubuntu 16.04にdocker入れる


```bash
$ sudo apt-get update
$ curl -fsSL https://get.docker.com/ | sh # インストール
$ sudo systemctl start docker.service     # 起動
$ sudo systemctl enable docker.service    # サーバー起動時にも起動
$ sudo usermod -aG docker ubuntu          # ubuntuユーザーでもdocker使えるように
```



# 参考
- [DockerをUbuntu 16.04にインストールする](http://qiita.com/RyoMa_0923/items/6f0419fb551ce5fd4d3f)
- [Ubuntu Server 16.04でDockerを動かす](https://blog.onodai.com/posts/2016-07-16-sat)
Vagrant で困った時の対処法

# Vagrant で困った時の対処法

これはメモなので、簡単に書いて残しておきます。

## Vagrant init もしくは、Vagrant add box する際のエラー対処法

以下のようなエラーメッセージが出たら、

```
$ vagrant box add centos https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos' (v0) for provider: 
    box: Downloading: https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.
```

もしくは

```
＄ vagrant init CentOS6.8
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'CentOS6.8' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Box file was not detected as metadata. Adding it directly...
==> default: Adding box 'CentOS6.8' (v0) for provider: virtualbox
    default: Downloading: CentOS6.8
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.
```


というときは


```sudo rm /opt/vagrant/embedded/bin/curl```を試してみてください。

こいつが悪さしている可能性が高いです。


## 参考

[参考1](http://stackoverflow.com/questions/40473943/vagrant-box-could-not-be-found-or-could-not-be-accessed-in-the-remote-catalog)
サーバレス構成でFitbitの心拍数通知アプリを作った

# 概要

Lambdaを使って[Fitbit](https://www.fitbit.com/)で計測した心拍数をLINEに通知するアプリを作ってみました。緊張してたり、酒飲みすぎてテンション上がってるときに通知してくれます。

<img width="872" alt="Heart rate graph" src="https://qiita-image-store.s3.amazonaws.com/0/27454/7c30fb73-b27a-102f-6e0c-8bc6a5ed49dd.png">

# ソースコード

[GitHub - dokidoki watch](https://github.com/naomichi-y/dokidoki_watch)

# 技術資料

[サーバレス構成によるFitbitを使った心拍数通知サービス](https://docs.google.com/presentation/d/e/2PACX-1vRtRrKEwA1OJYSAIP4XvNQNNN2lEVBnq5z7x9AXNUnQypHs47m6UEFGa20P-xdTReEPCTASbiFgd_cn/pub?start=false&loop=false&delayms=3000)
第３６回医療情報学連合大会でポスター発表してきました

投稿論文「DWHとPostgreSQL,pandasを利用した免疫抑制・がん化学療法実施患者におけるB型肝炎ウイルス再活性化予防の取組み」についてポスター発表をしてきました。

ポスター発表とはまず学会に論文（抄録）を投稿し、採用された抄録についてプレゼン用のポスターを作成し、それについて5分程度で簡潔に内容の説明をするというものです。学会でそのような発表をした経験が無かったためかなり緊張しましたが何とか事無きを得ました。

特定の疾患に対するチェック機構の構築のため、電子カルテのデータベース（DWH）から必要なデータを抽出し、SQL及びスクリプト言語を使用してアラートファイル作成までを自動化する、というものです。自分的にはjupyter notebookを使用するなどかなり進んだことをやってるんじゃないかなと思ってます。
今回のシステムではB型肝炎再活性化を予防するための核酸アナログ投与または必要検査によるモニタリングを診療科に促すアラートの作成が目的となっています。手順としては

電子カルテDWHからデータ抽出（対象薬投与患者の抽出）
⇩
PostgreSQLに格納
⇩
case when式にてステロイド換算
⇩
Python(pandas)にてクエリ実行
⇩
クエリ結果をアラートファイルにまとめる（Pythonを使用）

となっています。アルゴリズムは日本肝臓学会策定の「免疫抑制・化学療法により発症するB型肝炎対策ガイドライン」に準拠しています。
http://www.jsh.or.jp/files/uploads/R2-HBV%20Ver2.2.pdf
作成したSQL文、Pythonによるコードは一部githubに公開しました。
https://github.com/riow1983/HBV-R

特にステロイド換算に対応しているところが特徴となっています。類似運用は多数報告されておりましたがステロイド剤のステロイド力価まで正確に把握するところまでは行っていませんでした。
オープンソースのPostgreSQLとjupyter notebookを使用しているためどの医療機関でも対応可能であるというところが特徴です。今後は専用サーバをHISネットワーク内に導入して作業の更なる省エネ化・バックアップ体制の強化を目指したいと思っています。
【備忘録】ANDROID_HOMEのPATHを設定

# 環境
MacOS 10.12.6

# ANDROID_HOMEに指定するパス

```shell-session
$ /Users/<user_name>/Library/Android/sdk
```

# PATHの設定

```shell-session
$ echo 'export ANDROID_HOME=<path>' >> ~/.bash_profile
$ echo 'export PATH=$ANDROID_HOME/bin:$PATH' >> ~/.bash_profile
```

# .bash_profileの更新

```shell-session
$ source ~/.bash_profile
```

# パスが反映されてることを確認

```shell-session
$ echo $ANDROID_HOME
$ echo $PATH
```
【備忘録】JAVA_HOMEのPATHを設定

# 環境
MacOS 10.12.6

# JAVA_HOMEに指定するパスの確認
```shell-session
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home
```

## 参考
[$JAVA\_HOME by java\_home MacOSX \- Qiita](http://qiita.com/yohjizzz/items/194973bf2f34608ae85a)


# PATHの設定
```shell-session
$ echo 'export JAVA_HOME=<path>' >> ~/.bash_profile
$ echo 'export PATH=$JAVA_HOME/bin:$PATH>' >> ~/.bash_profile
```

# .bash_profileの更新

```shell-session
$ source ~/.bash_profile
```

# PATHが反映されてることを確認

```shell-session
$ echo $JAVA_HOME
$ echo $PATH
```
ADDA > iterative.c > InitField > const enum init_field InitField; / set in PARSE_FUNC(init_field) in param.c

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).


In `CalcInitField()`, variable `InitField` is used.

```
static const char *CalcInitField(double zero_resid,const enum incpol which)
{
...
    switch (InitField) {
        case IF_AUTO:
        ...
        case IF_ZERO:
        ...
        case IF_INC:
        ...
        case IF_WKB:
        ...
        case IF_READ:
        ...
```

The `InitField` is defined with `extern` in `iterative.c` as follows:

```
extern const enum init_field InitField;
```

The `InitField` is define in `param.c`.

```param.c
enum init_field InitField; // how to calculate initial field for the iterative solver
```

, which is set in 

```param.c
PARSE_FUNC(init_field)
{
	bool noExtraArgs=true;

	if (Narg<1 || Narg>3) NargError(Narg,"from 1 to 3");
	if (strcmp(argv[1],"auto")==0) InitField=IF_AUTO;
	else if (strcmp(argv[1],"inc")==0) InitField=IF_INC;
	else if (strcmp(argv[1],"read")==0) {
		if (Narg!=2 && Narg!=3) NargErrorSub(Narg,"init_field read","1 or 2");
		ScanFnamesError(Narg-1,FNAME_ARG_1_2,argv+2,&infi_fnameY,&infi_fnameX);
		InitField=IF_READ;
		noExtraArgs=false;
	}
	else if (strcmp(argv[1],"wkb")==0) {
#ifdef SPARSE
		PrintErrorHelp("Initial field 'wkb' is not supported in sparse mode");
#else
		InitField=IF_WKB;
#endif
	}
	else if (strcmp(argv[1],"zero")==0) InitField=IF_ZERO;
	else NotSupported("Initial field prescription",argv[1]);
	TestExtraNarg(Narg,noExtraArgs,argv[1]);
}
```
ADDA > iterative.c > IterativeSolver() > only if the initial field is read from file

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

```iterative.c
int IterativeSolver(const enum iter method_in,const enum incpol which)
/* choose required iterative method; do common initialization part;
 * 'which' is used only if the initial field is read from file
 */
{
```

I am wondering whether the `initial field` is the one I am looking for...

The `which` is used in CalcInitField()

`static const char *CalcInitField(double zero_resid,const enum incpol which)
/* Initializes the field as the starting point of the iterative solver. Assumes that pvec contains the right-hand side
 * of equations (b). At the end of this function xvec should contain initial vector for the iterative solver (x_0), rvec
 * - corresponding residual r_0, and inprodR - the norm of the latter residual. Returns string containing description of
 * the initial field used.
 */
{`

Then, the `which` is used as follows:

```iterative.c
static const char *CalcInitField(double zero_resid,const enum incpol which)
{
    ...
    switch (InitField) {
        ...
        case IF_READ: {
            const char *fname;
            if (which==INCPOL_Y) fname=infi_fnameY;
            else fname=infi_fnameX; // which==INCPOL_X
            ReadField(fname,xvec); // read electric field
            InitFieldfromE(); // transform it into starting vector
            return dyn_sprintf("x_0 = from file %s\n",fname);
        }
        ...
```
Ubuntu 14.04 > viでは101キーボード / Sublime Textでは101キーボードでない > 設定方法

```txt:動作環境

Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4
東プレRealForce(87UW55)
```

Ubuntu 14.04にて以下の現象が見られた。

- vi: 英語キーとして正常認識
- firefox: 英語キーとして正常認識
- sublime text: 日本語キーとして誤認識

以下の情報を見つけた。
https://hirooka.pro/?p=1271

###変更前

```txt:/etc/default/keyboard
XKBMODEL="SKIP"
XKBLAYOUT=""
XKBVARIANT=""
XKBOPTIONS=""
```

###変更後

```txt:/etc/default/keyboard
XKBMODEL="pc101"
XKBLAYOUT="us"
XKBVARIANT="101"
XKBOPTIONS=""
```

Ubuntuを再起動したらSublime Textでも正常認識するようになった。

情報感謝です。
docker install with homebrew (virtualbox and Docker for Mac)

# What?
- homebrew だけで docker install する。
    - 頑固に Docker Toolbox は使わずにやってみる。
- virtualbox と Docker for Mac の2通りやってみる。
    - Cask 名が非常に紛らわしいが、```Caskroom/cask/docker``` これが Docker for Mac。
    - Docker for Mac には virtualbox は不要。詳しくは [Docker for Mac vs. Docker Toolbox](https://docs.docker.com/docker-for-mac/docker-toolbox/) も参考に。
    - Docker for Mac が GA ready になったのが、2016/07/28。([Blog announce](https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/))
- homebrew にこだわらなければ、Docker for Mac は [Get started with Docker for Mac - Docker](https://docs.docker.com/docker-for-mac/) で一瞬で完了できる。

# Environment

```
➜  ~ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.6
BuildVersion:	15G1004
```

```
➜  ~ brew -v
Homebrew >1.1.0 (no git repository)
Homebrew/homebrew-core (git revision 1220; last commit 2016-11-25)
```

# Let's begin!

## virtualbox

```
➜  ~ brew cask install virtualbox
```

## docker

```
➜  ~ brew install docker
```

## docker-machine

```
➜  ~ brew install docker-machine
```

すると、以下のように launchd にいれるかどうか丁寧に教えてくれるので、必要に応じて。

```
To have launchd start docker-machine now and restart at login:
  brew services start docker-machine
Or, if you don't want/need a background service you can just run:
  docker-machine start
```

## Docker for Mac (Docker.app)

```
➜  ~ brew cask install docker
```

# Done!

```
➜  ~ virtualbox --help
Oracle VM VirtualBox Manager 5.1.10
# ...

➜  ~ docker -v
Docker version 1.12.3, build 6b644ec

➜  ~ docker-machine -v
docker-machine version 0.8.2, build e18a919

➜  ~ docker-compose --version
docker-compose version 1.8.1, build 878cff1
```

# Try!

## virtualbox 上に マシン作成する場合は、```docker-machine``` で。

```
➜  ~ docker-machine create --driver virtualbox hello-docker
```

## Docker for Mac で。
オフィシャルの Get started にならって、Docker.app を起動後、nginx を create して run。

```
➜  ~ docker run -d -p 80:80 --name webserver nginx
```

http://localhost/ を開いて nginx を確認。```docker ps``` でも確認OK。

```
➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
4935b4bc939c        nginx               "nginx -g 'daemon off"   5 minutes ago       Up 9 seconds        0.0.0.0:80->80/tcp, 443/tcp   webserver
```

# Reference
- [Get started with Docker for Mac - Docker](https://docs.docker.com/docker-for-mac/)
- [Docker for Mac vs. Docker Toolbox](https://docs.docker.com/docker-for-mac/docker-toolbox/)
- [Adds Docker for macOS, renames docker-engine by mhubig · Pull Request #22282 · caskroom/homebrew-cask](https://github.com/caskroom/homebrew-cask/pull/22282)
Ubuntu 14.04 > link > 日本語入力の設定 (fcitx-mozc)

```txt:動作環境
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4
```

Ubuntu 14.04にて日本語入力をするための設定は以下がトラブルが少なかった。

https://hirooka.pro/?p=6224

情報感謝です。
数から読むソフトウェア作成者人口の不足

* [今が狙い目？人手不足の5大業界の現状と目指す方法](https://careerpark.jp/86436)

![fusoku.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5014c89e-cc19-403c-9d9f-1e89798acff9.png)


* [IT業界離れ - Wikipedia](https://ja.wikipedia.org/wiki/IT%E6%A5%AD%E7%95%8C%E9%9B%A2%E3%82%8C)

> 最悪のケースとして、日本のIT業界は、近未来にIT産業が崩壊することを指摘している。

アニメ業界のように低賃金、長時間労働、危うい雇用形態 となるのだろうか。


## 人手不足

> NHKが日本のIT企業900社に行ったアンケートによると、全体の87％もの企業が、「IT技術者が大幅に不足」「やや不足」と答えています。9割に近い日本のIT企業が、IT技術者やエンジニアの不足を実感していると言えます。

* [IT人材は2030年には78.9万人不足するが特にビッグデータ、IoT/M2M、人工知能が狙い目 | 株式会社イテレイティブ](https://www.iterative.co.jp/blog/it-industry-faces-human-resource-crunch-in-2030/)
* [IT人材、2020年に37万人不足。「女性や外国人」の活用という発想で大丈夫？](http://newswitch.jp/p/4972)
    * 経産省が試算、２０３０年には約７９万人に増加

|時期|状態|-|
|:--|:--|:--|
|2016年|87%のIT企業が不足を実感|-|
|2020年|37万人不足|今の倍の人手不足|
|2030年|78.9万人不足|2020年よりさらに倍|

* ソフトウェア作成者(2014年)合計: **32万3570人** (次の項目で説明)

ちなみに介護業界は[2025年には介護職員が約30万人不足](https://ninchisho-online.com/archives/21732/)のようです。
[人手不足の理由は仕事内容の大変さに対し、給与などの待遇面が釣り合っていないからです。](https://careerpark.jp/86436)
我々の老後は介護が受けられるのでしょうか・・・。
ソフトウェア作成者は健康にも気を使う必要がありますね。


## ソフトウェア作成者

* [ＩＴ人材を巡る現状について（データ編）平成２７年１月情報処理振興課](http://www.meti.go.jp/committee/sankoushin/shojo/johokeizai/it_jinzai_wg/pdf/001_04_02.pdf)
    * (8p)出典：平成22年国勢調査
    * [統計局ホームページ/平成27年国勢調査/調査の結果](http://www.stat.go.jp/data/kokusei/2015/kekka.htm)

![8p.png](https://qiita-image-store.s3.amazonaws.com/0/25728/9748d9cb-9f5c-8e13-f918-241f714c546d.png)

* 現在平成28年のため、6年前の資料となります。

* 男女比
    * 20〜24歳だと 男女比**5:2**
    * 30〜34歳だと 男女比**5:1**
    * 35〜39歳だと 男女比**6:1**
    * 40〜44歳だと 男女比6:1
    * 45〜49歳だと 男女比10:1
    * 50〜54歳だと 男女比14:1
    * 55〜59歳だと 男女比18:1
* 20〜24歳の数が少ないのは少子化の影響だろうか。
    * (大卒は順当に行けば21〜22歳で働き始める。)
* ソフトウェア作成者合計: **32万3570人** (左のグラフ)
    * 30 + 110 + 190 + 800 + 4210 + 9880 + 18420 + 37920 + 49590 + 56970 + 62280 + 57380 + 25350 + 440

* 労働力率(平成27年)
    * 男性: 平成22年より少し減っているが、昭和60年とくらべて**あまり変わらない**。
    * 女性性: 平成22年より少し増えている

![per.png](https://qiita-image-store.s3.amazonaws.com/0/25728/96d35be9-48ae-5bf4-b7b8-5a49c1b36eb8.png)

## 新成人は減少

* [日本のエンジニア需要｜IT人材不足は本当か？ | TechStars Blog](https://blog.techstars.jp/engineer-demand-24356/)

> 1973年生まれの、現在「団塊ジュニア」と呼ばれている世代の人々が成人した年は、新成人の人数は207万人でした。しかし、2015年に新成人を迎えた若者は、124万人。

* 新成人
    * 207万人 : 1992年(1973 + 19)
    * **124万人** : 2015年


## 家庭を持つということ(個人的意見)

家庭を持つと会社以外で技術を習得することが難しくなってくる。
そのため技術選定は`流行りのもの`ではなく、枯れ果てたこの先何年も変わらないようなものを選ばないと
家庭を持った人たちがついてこれらず現場で役に立つのがより難しくなるでしょう。


* 家庭を持つまで : 起きている時間全てをソフトウェア作成と趣味に費やしてこれた
* 家庭を持ってから : 会社に居る時間以外は家庭に時間を費やす時間が増える。
    * 多い人はほぼ100%家庭に費やす。
    * 子供ができて子育てを率先せず収入が少ない人は、離婚や家庭内別居の危機
    * 晩婚化の影響で、子育ての次(もしくは同時)は親の介護となります。


> 65歳以上男性の８人に１人，65歳以上女性の５人に１人が一人暮らし 

* [平成27年国勢調査抽出速報集計結果　要約 - c_youyaku.pdf (6p)](http://www.stat.go.jp/data/kokusei/2015/kekka/pdf/c_youyaku.pdf)
技術英語 > In striking contrast, during the final days of Microsoft Windows 2000 development, ...

@ Code Complete (No. 17776 / 36077)

> **<font color=red>In striking contrast</font>**, during the final days of Microsoft Windows 2000 development, ...

http://ejje.weblio.jp/content/be+in+striking+contrast+to
> …と著しい対照をなす

Windows2000の開発がどうかというと

コードを修正した後にローカルビルドでテストして、VCSにチェックインはまだしない。バスケットボールをプレイしに行って、1時間心を落ち着かせた上でfixが本当に正しいか確認する、とのこと。
Helion OpenStackの上にRancherでKubernetesクラスタを構築してみる（その２）

[その1](http://qiita.com/jyoshise/items/b8fd6928fbad78978665)の続きです。
前回書き忘れましたが、5台のノードのうち3台にはFloating IPを振ってあります。

| hostname | IP | Floating IP |  |
|:-:|:-:|:-:|:-:|
| rancher-k8s-1  | 10.0.0.25  | FIP1  | Rancher Server  |
| rancher-k8s-2  | 10.0.0.26  | FIP2  | LBを動かしたい  |
| rancher-k8s-3  | 10.0.0.27  | FIP3  | LBを動かしたい  |
| rancher-k8s-4  | 10.0.0.28  |   |   |
| rancher-k8s-5  | 10.0.0.29  |   |   |

## 3 サンプルアプリケーションを動かしてみる

### 3.1 とりあえずカタログからデプロイしてみる

[CATALOG]メニューから、"K8s Example Guestbook"をデプロイしてみます。

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/49cecccb-ff35-fc8f-ce5e-fe08ce89f4d0.png)

フロントがPHP、後ろでredisが動くスタックになっているようです。せっかく5ノードあるので、フロントのレプリカ数を5個にしてみます。

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/8846ab04-68bc-245d-fefa-816d16604e4c.png)

[Launch]を押すと上がってきます。メニューの[KUBERNETES]-[Service]を見ると、

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/97429809-afaf-153b-15a9-ef4849cf7c17.png)

こうなっていて、

- "frontend"というLoadBalancerタイプのサービスがひとつ
    - Podが5つ（各ノードに分散配置されてますね）
        - 各Podにはコンテナがひとつ

あとバックエンドのサービスとして

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/b0ba994b-8966-43c5-8fd3-7da0e73f252b.png)

redisのMasterとSlaveが動いています。

### 3.2 LoadBalancerの確認

[KUBERNETES]-[System]で"kubernetes-loadbalancers"を見るとこうなってます。Rancherが作るこのLoadBalancerタイプのサービスは、要するにhaproxyのコンテナです。

![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/10a0c2c2-bcc4-1997-3c69-83148c18349c.png)

わかりやすいですね。でも残念ながらこの10.0.0.28というIPアドレスを持つノード(rancher-k8s-4)はFloating IPを持っていないので、外からはこのサービスにアクセスできません。
なので別途LoadBalancerサービスを作ってみます。

### 3.3 Hostにラベルをつける

LoadBalancerサービスを作っても、スケジューラがそのコンテナを外部ネットワークに繋がっていない（Floating IPを持っていない）Hostで動かしてしまうと意味がありません。なのでFloating IPを持つHostにlabelをつけて、スケジューリングの条件とします。
[INFRASTRUCTURE]-[Hosts]で、Floating IPを持つHostの[Edit]から

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/2ce6eb83-aeb8-d793-f56e-ee37b95e2787.png)

こんな感じで適当にラベルをつけます。

![12.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/a55432cd-df01-83fd-5a5f-628c331fcc4d.png)

### 3.4 LoadBalancerサービスをつくる

もちろんまじめにトラフィックの負荷分散を考えると、ハードウェアのロードバランサーを使うとか、それをNeutronのLBaaSに組み込むとか、いろいろ設計が必要になるわけですが、ここでは単純に「2つのFloating IPに入ってくるアクセスをhaproxyで5つのHost上のポートに振り分ける」ということを行います。
[KUBERNETES]-[System]のkubernetes-loadbalancersのところにAdd Load Balancerというメニューがあるので・・・

![10.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/5e3cf189-a141-0177-5573-e991f5f51147.png)

こんな感じで作ります。GuestBookのフロントのWebはポート31481をListenしてます。2つのHostで動かしたいのでスケールを2とします。

![15.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/2474b94a-15bf-bf11-dee8-e5aa173234a7.png)

先ほどつけたHost Labelをスケジューリングルールに設定します。

![14.PNG](https://qiita-image-store.s3.amazonaws.com/0/103746/2948dd12-72f6-9748-5961-90c154701fc2.png)

で[Create]を押すと

![image](https://qiita-image-store.s3.amazonaws.com/0/103746/7182d3ee-1023-e19a-2e95-4c63cf1b4a6a.png)

できた。ちゃんとラベルをつけたHostで動いてますね。もともとあったほうは消してしまおう。
で、10.0.0.26 および 10.0.0.27 に対応するFloating IPにブラウザからアクセスしてみると

![image](https://qiita-image-store.s3.amazonaws.com/0/103746/aa74cb0f-85a8-7079-b1af-1ddfe39201ab.png)

めでたしめでたし。

まだ続くぞよ。
Teratail API を使ってユーザーのサマリを集計する


複数のアカウントで質問を乱立するユーザーが見受けられるので、質問を立てる曜日や時間帯に何か傾向が見受けられるのだろうかと思って、スクリーンショットのようなサービスを立ち上げました。

URL: [http://teratail.jlamp.net/](http://teratail.jlamp.net/)

![teratail.jlamp.net_2016-11-26_02-50-02.png](https://qiita-image-store.s3.amazonaws.com/0/46841/56ac8f89-a7c6-3441-e7ea-ee076df2cbd9.png "teratail.jlamp.net_2016-11-26_02-50-02.png")

機能の要望などは、コメントいただければと思います。
DynamoDB + Reids に関して

DynamoDB のパフォーマンス向上及び低コスト化に関してRedisなどのキャッシュを利用する方法があります。
これにも注意点がありますので、順に見ていきます。

#キャッシュ利用方法について
キャッシュを利用する場合、データ更新時にキャッシュも更新します。
データ読み込み時は、キャッシュを参照しデータがない場合、DynamoDBからデータを取得しキャッシュにも保存します。
こうすることでキャッシュの運用が可能になります。
あくまでもキャッシュとして利用する方法です。

#DynamoDBとキャッシュを利用した場合の注意点
1. GSIを利用している場合、データ更新を行った時はそれぞれのインデックスに関してもキャッシュ内容を更新する必要がある。
キャッシュは、KVSで動作している為、Key毎にキャッシュを作成する必要があります。
GSIは1つのValueに対して複数のKeyを持つ事になるので、これをキャッシュしようとすると関連するKeyのValueを更新していく必要があります。

2. LSIを利用している場合にも同様のことが言えます。

3. QueryやScanを利用してデータ取得した場合のキャッシュ制御が難しい。
Query処理では、範囲指定を行ってデータを取得することが考えられます。
この時、QueryそのものをKeyとしてキャッシュすると、範囲内のデータ更新に対してキャッシュ内容を更新する必要があります。
しかし、これらの処理を実装するには考えられるKeyを検索する必要があり、効率的な処理を行うことは非常に難しいと考えられます。

#まとめ
DynamoDB + Reids を利用する事は、パーフォーマンス向上及び低コスト化に非常に有効です。
しかし、設計があまいと実装が非常に困難になります。設計をしっかりと行った上で実装を行うことをおすすめします。
vim: 入力したコードを複数回行うコマンド

<a href="http://qiita.com/momim9/items/89e811f7324e949215ab?utm_campaign=popular_items&utm_medium=referral&utm_source=popular_items" target="_blank">新米エンジニアのVim入門</a>を夜中に読んでいたら今後絶対に活躍するであろう神コマンドに遭遇したのでここに書いておく。

##入力したコードを複数回一気に行う.

`num + i + text + esc`で入力したコードをnum回分だけ行ってくれる。例えば`100i + hoge + esc`で

![vim4.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/52804f24-966f-c063-5d5d-1bc6e9d89d6b.gif)
Swift3.0でCAGradientLayerが表示されない


## 概要
UIViewにグラデーションを付けようとしました。
お決まり通り、CAGradienLayerでやろうとするもいくつかはまってしまいました。
でも色々調べた結果、原因が分かって、実装することが出来ました。

## 上手くいかなかったコード
他の記事を参考にそのまま書いたはずなのに、グラデーションが表示されない・・・

```
let startColor = UIColor.white
let endColor = UIColor.blue
let layer = CAGradientLayer()
layer.colors = [startColor, endColor]
view.layer.addSublayer(layer)
```

## 原因１：layer.frameの設定し忘れ
これをちゃんと書いてあげましょう

```
layer.frame = view.frame
```

## 原因２：UIColorじゃなくてCGColorを設定
```.cgcolor``` をつけてあげましょう
なんとなくこれは、Swift3.0特有のものな気がしますが、
どうなのでしょうか・・・
CAGradientLayer.colorsの型を見たら、[Any]?でした。
[CGColor]?になってたら、こんなはまり方はしなくて済んだのになーって思いました。

```
let startColor = UIColor.white.cgcolor
let endColor = UIColor.blue.cgcolor
```

## 上手くいったコード
```
let startColor = UIColor.white.cgcolor
let endColor = UIColor.blue.cgcolor
let layer = CAGradientLayer()
layer.colors = [startColor, endColor]
layer.frame = view.frame
view.layer.addSublayer(layer)
```

## まとめ
めでたしめでたし
HackerRankでプログラミングを勉強する

最近、[HackerRank](https://www.hackerrank.com/)でプログラミングの問題を解いている。楽しい。

問題分野の一覧が https://www.hackerrank.com/domains にある。アルゴリズムやデータ構造、各種プログラミング言語など、プログラマならば勉強しておくべき内容が目白押しだ。

https://www.hackerrank.com/scoring/badges-and-medals にある通り、アルゴリズムや機械学習、関数型言語の問題を解いていくと、バッジがもらえる。これを集めるのも楽しいだろう。ぼくもアルゴリズムのバッジをもらった。

- https://www.hackerrank.com/iwamot

問題は英語で書かれているが、サンプル入出力に対する説明が付されているので、苦手な人でもなんとかなると思う。

ユーザ登録しなくても問題は見られる。たとえば、アルゴリズムのEasy問題には下記のようなものがある。

- https://www.hackerrank.com/challenges/mini-max-sum
- https://www.hackerrank.com/challenges/designer-pdf-viewer
ビューを作成する


SELECTで作成したテーブルを、擬似的に保存。

### ビュー利用時の注意点

#### 関数や式を使ったビュー
関数や式を使った SELECT 文に対してビューを設定する場合、単純な SELECT 文に「CREATE
VIEW  ビュー名」をつけただけではエラーになってしまいます。このような場合には、関数や
式を使っている列に対して別名を付けます。

#### ビューに対する更新
ビューに対する INSERT、DELETE、UPDATE といった更新系 SQL（データを更新する SQL）
の使用はかなり厳しい制限付きではありますが、可能な場合があります。
標準 SQL では、「ビュー定義の SELECT 文において、いくつかの条件を満たしている場合、
ビューに対する更新が可能」と定められています。代表的な条件を上げると、次の通りです。

1. SELECT 句に DISTINCT が含まれていない
2. FROM 句に含まれるテーブルが 1 つだけである 
3. GROUP BY 句を使用していない
4. HAVING 句を使用していない
AppleWatchで寿司を廻す

##ﾍｲﾗｯｼｬｲ
寿司は日本人の心ですよね？
いつでもどこでも寿司出せたら最高だと思いませんか？

でも止まってる寿司は高い…廻っている寿司じゃないと…
ということでAppleWatchで寿司を廻してみました。

![IMG_5910.PNG](https://qiita-image-store.s3.amazonaws.com/0/30152/129379d9-4fde-5c20-c8ea-ae018f2ee19f.png)

起動すると寿司が出てきます。
Digital Crownをまわすと寿司が廻ります。

![IMG_5911.PNG](https://qiita-image-store.s3.amazonaws.com/0/30152/cd04cded-c20c-1e59-4f9d-3dce205cbdb9.png)

止めると大将が出てきます

![IMG_5912.PNG](https://qiita-image-store.s3.amazonaws.com/0/30152/772b497f-e87b-ad64-77a6-c9a389a142f4.png)

動画は↓から
https://www.instagram.com/p/BNPOBmOB---/

##どうやら文字は回せないらしい
`UILabel`と違って`WKInterfaceLabel`にはtransformプロパティがないので
iOSでやるようにスッとは回らなかったです。

http://qiita.com/shu223/items/e704f70abc50da32ba38 によると
Appleですらアニメーションは連番画像を切替えているということだそうで…

そこでImageを連番で書き出して、それを回してみることにしました。
ウニやイクラも回すことができますし、好みの寿司ネタを用意できるメリットもありますね。

##ネタの準備
寿司なのでネタの準備は必要ですね。
なるべくなめらかに回したいので、Appleのサンプルと同じように44枚書き出すことにしました。
44枚画像を書き出したかったので、8.2度ずつ回転しては書き出す作業を行いました。

大きい寿司の絵文字はテキストエディットで🍣と入力して、
PDFで保存すればPhotoshopでイイカンジに取り込むことができました :)

書き出した直後は全部で2.5MBくらいありましたが、さすがに実機転送がしんどいので
PNGを圧縮しました。ImageAlpha便利。

##実装
お恥ずかしながらObjective-Cの実装です。
`InterfaceController.h`に`WKCrownDelegate`の追記をお忘れなく。

```objc
- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
    
    WKCrownSequencer *sequencer = self.crownSequencer;
    [sequencer focus];
    sequencer.delegate = self;
    
    //最初なので寿司出しておきましょう
    [_sushiImage setImageNamed:@"sushi_1"];
    [_messageLabel setText:@"寿司を廻せ！！！！"];
}
```

```objc
- (void) crownDidRotate:(WKCrownSequencer *)crownSequencer
       rotationalDelta:(double)rotationalDelta {

    if (rotationalDelta > 0) _num++;
    if (rotationalDelta < 0) _num--;
    if (_num == 45) _num = 1;
    if (_num == 0) _num = 44;
    
    NSString *name = [NSString stringWithFormat:@"sushi_%d", _num];
    [_sushiImage setImageNamed:name];
    [_messageLabel setText:@"おすしぐるぐる"];
}

- (void) crownDidBecomeIdle:(WKCrownSequencer *)crownSequencer {
    [_messageLabel setText:@"( `o´)ﾍｲﾗｯｼｬｲ"];
}
```

あとは適当にStoryboardの要素とくっつけてあげれば完成です。
（気が向いたらもう少し細かく書くかも、あとGitHubにソース上げるかも）

【2016-11-26 追記】
GitHubにプロジェクトファイルをアップしました。ビルドして遊んでみてください。
https://github.com/Pittan/sushi4watchos-sample
Fabricで社内テストとかβテストとか運用してみたメモ（ちいさい）

# Fabricとは

- CrashlyticsだったのをTwitterが買収した（らしい）
- Fabric傘下に、
    - Beta（その名の通りExternal Testersにβを提供できる）
    - Crashlytics（クラッシュレポート収集）
    - Answers（アプリのUser Growthなどアナリティクスができる）
    - など他にもいくつかあるっぽい
        - https://docs.fabric.io/

# Betaを使う

- iTunesConnectで、External Testersに提供しようと思うと、審査を待つ必要がある
    - Productionリリースとスピード感変わんねーじゃん
- FabricのBetaでいっか
    - bundle identifierごとにアプリ（プロジェクト、みたいな単位）がつくれる

# こうしときゃよかったなといういまさらのやつ

- bundle identifierを、以下のような構成にしてる
    - com.otiai10.myapp.debug
        - 開発とテスト
    - com.otiai10.myapp.dev
        - プロダクトチーム（デザイナとかPOとか）との共有&フィードバック用
    - com.otiai10.myapp.stage
        - リリース前のQA用
    - com.otiai10.myapp
        - リリース用
- で、公開リリース前の限定ユーザリリースを、`com.otiai10.myapp`以下のBetaでやってたんだけど
- 限定ユーザリリースが終わって、いざ公開リリースにしようとしたとき、`com.otiai10.myapp`以下のBetaが消せない
    - Archiveするたびに「これ、限定ユーザにリリースする？」みたいに聞いてくる
    - これがだるい
- 限定ユーザリリースは、`com.otiai10.myapp.beta`とかにして、限定ユーザリリース期間が終わったら、Fabricコンソールからbundle identifierごと抹消するのがよかったのかもしれない

以上です
Powershell で firefox を起動してみる

0.IEの起動方法
<pre>
$ie = New-Object -ComObject InternetExplorer.Application  # IE起動
$ie.Navigate("hogehoge.ne.jp")                            # URL指定
$ie.Visible = $true                                       # 表示
</pre>
で実現できる。
参考： PowerShellからIEを操作
http://qiita.com/fujimohige/items/5aafe5604a943f74f6f0
では、firefoxの場合は？

1.スクリプトを記述する
firefoxを起動する.ps1
<pre>
$url = "http://www.yahoo.co.jp"
& 'C:\Program Files (x86)\Mozilla Firefox\firefox.exe' $url
</pre>

2.スクリプトを実行する
firefoxを起動する.ps1 を右クリックし、
「プログラムから開く」で
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
を指定する。

3.結果
firefox が起動し、Yahoo を表示する。

4.宿題
<pre>
function is64bit() {
  return ([IntPtr]::Size -eq 8)
}

function get-programfilesdir() {
  if (is64bit -eq $true) {
    (Get-Item "Env:ProgramFiles(x86)").Value
  }
  else {
    (Get-Item "Env:ProgramFiles").Value
  }
}
</pre>
これを混ぜて、OSが 32bit or 64bit を判別できるようにする。
OS X / macOS でbyobuを使う

# byobu

byobuは便利だけどOSX/macOSだと色々不便が多い。
brew経由でインストールして自分が経験したものだと
1. byobu-config (F9)が動かない
anacondaのせいだった。anacondaのpathを消して`brew reinstall newt byobu`すれば治った。
2. shift/control + function keyが効かない
ターミナルの互換性の問題？
Terminal.appだと環境設定->キーボード、iTerm2だとPreferences -> Profiles -> Keysで
gnome-terminalっぽいテキスト送信の設定を自分で書く。
何を書けばいいかは [ここ](http://aperiodic.net/phil/archives/Geekery/term-function-keys.html)を参照するとよかった。
3. status barが上がってくる
これはリモートのbyobuを立ち上げた時に起こることがある。
Terminal.appだと起こるがiTerm2だと起らなかったりする。

無理してbyobuじゃなくてそのままtmux使えよ、という話でもある。
Chainerを用いた簡単なニューラルネットワーク実装〜最適化アルゴリズムの設定〜

[前回](http://qiita.com/moroku0519/items/e6ef1fd0a3ee87bfd570)から深層学習のフレームワークであるChainerを使って実際にニューラルネットワークを構築する記事を書いています．
今回は
1.データの準備
2.モデルの記述
3.最適化アルゴリズムの設定
4.学習
5.結果の出力
のうち

3.最適化アルゴリズムの設定
について書いていきます．

また，そのまま
4. 学習についても書いてしまいます．

#最適なパラメータの算出

前回書いたIrisモデルは以下のコードでした．

```
class IrisChain(Chain):
    def __init__():
        super(IrisChain, self).__init__(
             l1 = L.Linear(4, 6),
             l2 = L.Linear(6, 3),
    )

    def __call__(self, x, y):
        return F.mean_squared_error(self.fwd(x), y)

    def fwd(self, x):
        h1 = F.sigmoid(self.l1(x))
        h2 = self.l2(h1)
        return h2
```

やっていることの流れとしては，
1. コンストラクタにて線形の定義
2. fwdにてノードからノードへ発火するかどうかの判定
3. callにて出力と教師データとの誤差

![Irisニューラルネット_4.png](https://qiita-image-store.s3.amazonaws.com/0/28622/dcbca9bb-356e-f063-c18c-10cb0d4eb2b5.png)

入力層から中間層の変換を

```math
v = w_1x + b_1　...(1)
```

中間層から出力層の変換を

```math
y = w_2v + b_2 ...(2)
```

と表すことができますが，最終的に求めたいのはこのパラメータ，wとbです．

今回は[こちら](http://qiita.com/moroku0519/items/3188382ad85a8654cc42#%E5%8B%BE%E9%85%8D%E9%99%8D%E4%B8%8B%E6%B3%95)でも扱った確率的勾配降下法（SGD）の最適化アルゴリズムを使います．

そして，学習です．
学習の繰り返し回数は今回は10000回とします．

```
>>> model = IrisChain()
>>> optimizer = optimizers.SGD()
>>> optimizer.setup(model)
>>> for i range(10000)：
...     x = Variable(xtrain)
...     y = Variable(ytrain)
...     model = zerograds()
...     loss = model(x, y)
...     loss.backward()
...     optimizer.update()
```

下4行の

```
model = zerograds()
loss = model(x, y)
loss.backward()
optimizer.update()
```

は[こちら](http://qiita.com/moroku0519/items/7598abce4aab15504514)誤差伝搬の様子です．ほぼお約束のパターンです．
これで適切なパラメータwとbが求められ，分類器が出来上がります．
では，次回この分類器をためしてみます．

#参考
山下隆義
イラストでわかるディープラーニング 講談社
新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社
5分でできるnetdataによるPostgreSQLのリアルタイムリソースモニタリング

# はじめに
リアルタイムでリソースの状況を監視するツールを探していて、netdataを見つけました。
githubで公開されているツールで、めちゃくちゃお手軽に使えたので紹介します。

- 前提条件
    - CentOS 7.2
    - PostgreSQLはインストール済みとする

※CentOS以外のOSの手順は[github](https://github.com/firehol/netdata/wiki/Installation)を確認してください。


# 1.netdataのインストール

```
# yum install zlib-devel libuuid-devel libmnl-devel gcc make git autoconf autogen automake pkgconfig
```

インストール作業はroot権限で行います。

```
# git clone https://github.com/firehol/netdata.git --depth=1
# cd netdata
# ./netdata-installer.sh
```

これでインストールは完了。
あとはnetdata起動するだけです。

# 2.netdataを起動する
以下のコマンドを実行します。

```
# systemctl start netdata.service
```

# 3.ブラウザから接続
ポート19999でnetdataが起動しているので、ブラウザから以下にアクセスします。
http://＜IPアドレス＞:19999/

こんな画面が出てきます。なんか、かっこいい！

![netdata_postgres-org.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125929/84beb33d-c1b5-649c-fb84-5ea7a15f95dc.png)

続いて、PostgreSQLのリソース利用状況について確認してみます。

# 4.PostgreSQLのリソース利用状況確認
PostgreSQLを起動し、pgbenchで負荷を掛けてみます。

```
$ pg_ctl start $PGDATA
$ pgbench -i postgres -s 10
```

負荷を掛け始めてから、netdataの「Applications」の項目を見てみると・・・

![netdata_sample3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125929/60648564-bec4-19a9-536d-6011d2288745.png)


おぉすごい！たしかにpgbenchを動かしていた間、色々と変化しているのが見えます。

## 補足
ここで監視対象を設定しているみたいです。
デフォルトではMySQLとMariaDBとPostgreSQLが登録されていました。

```/etc/netdata/apps_groups.conf
・・・
# database servers

sql: mysqld* mariad* postgres*
・・・
```

# さいごに
netdataでは他にも色々モニタリングできるらしいので、もう少し触ってみようと思います。