OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Piにghoto2をインストール（メモ）

gphoto2
==
[ghpto2](http://gphoto.org/)のインストールは、コマンド一つにまとめた[賢人gonzaloさん](https://github.com/gonzalo/gphoto2-updater)がいるので、スクリプトをダウンロードして実行。実行時間は結構かかかるが、何も引っかからずに成功。

```
wget https://raw.githubusercontent.com/gonzalo/gphoto2-updater/master/gphoto2-updater.sh
chmod 755 gphoto2-updater.sh
sudo ./gphoto2-updater.sh
	1) Install last development version
	2) Install last stable release (libgphoto 2.5.14; gphoto 2.5.14)
	3) Quit
	=> 2を選択
```

pythonでgpohoto2が呼べるようにする。

```
sudo pip3 install gphoto2
sudo pip install gphoto2
```

pyQt4
==

GUIを使ったプログラムに必要。pyQt5はインストールできなかった。。。

```
sudo apt-get install python-pyqt4
sudo apt-get install python3-pyqt4
```

#examples

gitからexamplesをダウンロードして実行し、動作すればOK。

```
git clone https://github.com/jim-easterbrook/python-gphoto2
cd python-gphoto2/examples
python3 camera-summary.py
```

#撮ってみた

[マニュアル](http://gphoto.org/doc/manual/ref-gphoto2-cli.html)を見ながら、早速できそうなコマンドを実行してみる。使ったカメラはEOS-M3。

#### gphoto2 --capture-image-and-download

これは、現在のカメラの設定で撮影し、ラズパイ側に画像を転送するコマンド。転送後には本体側から画像が削除され、**ラズパイ側のディレクトリに画像ファイルがある場合は連番になる**。すごい。

`time`コマンドで計測すると、24MのRAW+JPEGの撮影から画像転送完了までは、13秒ちょっとだった。フォーカス合わせからシャッタが切れるまでに3秒、画像転送開始までにさらに3秒くらいかかっているが、カメラ側の実力か。

```shell-session
# time sudo gphoto2 --capture-image-and-download
新しいファイルの格納場所: /store_00010001/DCIM/187_0917/IMG_2413.CR2ファイルを IMG_2413.CR2 で保存します
カメラ内のファイル /store_00010001/DCIM/187_0917/IMG_2413.CR2 の削除をしています
新しいファイルの格納場所: /store_00010001/DCIM/187_0917/IMG_2413.JPGファイルを IMG_2413.JPG で保存します
カメラ内のファイル /store_00010001/DCIM/187_0917/IMG_2413.JPG の削除をしています

real    0m13.243s
user    0m1.090s
sys     0m0.980s
```

#### gphoto2 --capture-preview

ライブビュー画像が静止画像として転送される。このカメラの場合は480x320で保存された。シャッタは切らない。こちらの`time`コマンドでの計測結果は、2秒強。

capture_preview.jpgがディレクトリにあった場合、「--skip-existing」を付けると上書きされずに終了し、「--force-overwrite」を付けると強制的に上書きされる。

```shell-session
# time sudo gphoto2 --capture-preview
ファイルを capture_preview.jpg で保存します

real    0m2.434s
user    0m0.220s
sys     0m0.060s
```

#### gphoto2 --capture-movie

**ライブビュー画像を連続してキャプチャして、MJPEGとして転送される**。これ、凄い。このカメラの場合は480x320で保存された。シャッタは切らない。

マニュアルには指定は秒数とあったが、撮れるのは枚数、しかも1枚多いというご愛敬。フレームレートは不明。カメラ側で出来なり？

ちなみに、MJPEGに対応しているビューアとしてはVLCがある。

```shell-session
#time sudo gphoto2 --capture-movie 30
Capturing 30 preview frames as movie to 'movie.mjpg'.
Movie capture finished (31 frames)

real    0m3.030s
user    0m0.170s
sys     0m0.160s
```
Raspberry Pi | Win | Macbook Air >パラレルポート > STROBE | D5 | D6 | D7 からのVcc生成 > 3.9V から 4.5V になる

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
Analog Disocvery 2 (以下AD2)
WaveForms 2015 (3.2.6) 64-bit
```

### USBパラレル変換ケーブル

UGREEN
USB to DB25 Parallel Printer Adapter Cable
を使用。

RPiでは/dev/usb/lp0として認識

### 対象基板のVcc測定

トランジスタ技術 2007年1月号 p125 掲載のJTAGインターフェイス基板
を実装中。

STROEBE, D5, D6, D7のいずれかをダイオード経由で基板上ICの電源(Vcc)としている。
TL431Cを入れて電圧を安定化させ、その先にVccとして電源を供給する回路だ。

Vccの測定をAD2にて行ってみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2db99c5c-2794-9481-6b3f-b782404651d0.png)

3.3Vではなく、3.9Vになってしまっている。

### Satellite J61

パラレルポート端子がついている古いノートPCではどうか。

TOSHIBA Satellite J61で試した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d58fff5b-3c2d-cb5e-6911-34a74257fc9f.png)

Vccは3.3Vでなく4.5Vになった。

### Satellite J50

J61と同じ4.5Vだった。

### まとめ

| HW | OS | Vcc | 備考 |
|:-:|:-:|:-:|:-:|
| Raspberry Pi 2 Model B | Raspbian Jessie | 3.9V | USB to LPT変換 |
| Sattelite J60 | Windows XP | 4.5V | LPT端子あり  |
| Sattelite J51 | Windows XP | 4.5V | LPT端子あり  |
| Macbook Air (MD760JA) | Windows 8.1 (VMware) | 4.1V | USB to LPT変換 |
| NUC (Radiant SPX2450NUC) | Windows 8.1 | 4.2V | USB to LPT変換 |

Macbook AirのUSBポート(とVMwareでのWindows 8.1)での測定も足した。
NUCのUSB to LPT変換の測定も足した。

**NUCの結果においては、ノイズが多く見られる**。

### TODO

- Vccを3.3Vにするための回路の追加
    - http://qiita.com/7of9/items/eebf2bb5a32d1ed4f510
- DB25コネクタに対する部品面とはんだ面の方向を逆にした方がいいかもしれない
    - J50, J61はピン1が下にくるような端子になっていた
    - これにより、チェックピンなどの部品面が下に向く
TensorFlowでkeras その9

#概要
TensorFlowでkerasやってみた。
binary_crossentropy 使ってみた。
load_weights して、evaluate_generator で評価してみた。

#環境
windows 7 sp1 64bit
anaconda3
tensorflow 1.2

#評価
学習時

```
loss = 0.5720 acc = 0.6719
```

読み込んで

```
[0.614, 0.693]
```

#サンプルコード


```
import os
from tensorflow.contrib.keras.python.keras.models import Sequential, Model
from tensorflow.contrib.keras.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.contrib.keras.python.keras.layers.convolutional import Convolution2D
from tensorflow.contrib.keras.python.keras.layers import Dense, Dropout, Activation, MaxPooling2D, Flatten, Conv2D
from tensorflow.contrib.keras.python.keras.optimizers import Adam

pwd = os.getcwd()
img_width, img_height = 128, 128
train_data_dir = pwd + '/train'
validation_data_dir = pwd + '/validation'
nb_train_samples = 2000
nb_validation_samples = 800
nb_epoch = 10
batch_size = 64
result_dir = pwd

if __name__ == '__main__':
	train_datagen = ImageDataGenerator(rescale = 1.0 / 255, shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True)
	test_datagen = ImageDataGenerator(rescale = 1.0 / 255)
	train_generator = train_datagen.flow_from_directory(train_data_dir, target_size = (img_height, img_width), batch_size = batch_size, class_mode = 'binary')
	validation_generator = test_datagen.flow_from_directory(validation_data_dir, target_size = (img_height, img_width), batch_size = batch_size, class_mode = 'binary')
	model = Sequential()
	model.add(Conv2D(32, (3, 3), activation = 'relu', input_shape = (img_width, img_height, 3)))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Conv2D(32, (3, 3), activation = 'relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Conv2D(64, (3, 3), activation = 'relu'))
	model.add(MaxPooling2D(pool_size = (2, 2)))
	model.add(Flatten())
	model.add(Dense(64, activation = 'relu'))
	model.add(Dropout(0.5))
	model.add(Dense(1, activation = 'sigmoid'))
	model.load_weights(os.path.join(result_dir, 'cnn2.h5'))
	model.compile(loss = 'binary_crossentropy', optimizer = 'rmsprop', metrics = ['accuracy'])
	print (model.evaluate_generator(validation_generator, nb_validation_samples / batch_size))
	

```
Google App Maker ー PageFragmentインスタンスのハマりやすいところ


PageFragment の使い方には２種類あって **複数Page にまたがる同じ部品としての使い方（ヘッダーやメニューなど）** と **Pageの部品として何度も使う部品としての使い方（フォームの部品など）** がある。

前者の使い方はどの画面からでも `app.pageFramgnets.{PageFragment名}` のように Page と同じようなアクセス方法をするので簡単である。
公式で提供されている [Starter App テンプレート](https://developers.google.com/appmaker/templates/starter-app/) を見ると良いだろう。

ややこしいのが後者の方で、`app.page.{Page名}.descendants.{PageFragmentのname}` のようにアクセスする。
これが PageFragmentインスタンス と言われるもので、同じページにいくつあってもいいし、違うページにもいくつあっても良い。
画面をまたがって増えていくような部品を作る際に、非常に重要になっていくものである。
本記事ではPageFragmentインスタンスのハマりやすいところを解説する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/9d768a0f-ec6b-7d6c-6361-55ab306fe744.png)


そもそも App Maker ってなに？という人は、以下の記事を参照してください。
[Google App Maker とは？ 短期間で Web アプリケーション構築を可能にした理由](https://www.topgate.co.jp/what-is-google-app-maker)


## PageFragmentインスタンス から 親Page へのバインドは可能
次のように親Pageの値を変えると、自動的に子画面(PageFragmentインスタンス)の値も変わる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/7425e8af-1f44-2a84-9bfd-347d94c07477.png)

## 親Page から PageFragmentインスタンス へのバインドは不可
バインドされずにエラーがコンソールに表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/627ff215-da34-877a-e36c-1316d7daecba.png)

###　ただしスクリプトからなら値を取得することは可能
先程のバインドできなかったらラベルの `onClick` イベントに次のようなコードを書く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/713e102c-9beb-b747-5f33-9af117f2cf2a.png)

ラベルをクリックすると値が取得されて設定される。
**つまりバインドができないだけで値の取得は可能。**
これを利用することで 親Page から PageFragmentインスタンス のウィジェットや CustomProperty の値を取得することが可能になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/67e84679-da44-b178-ae5d-27c00ba63d2e.png)


## PageFragmentインスタンス 内のイベント
PageFragmentインスタンス で発生するイベントを書くときに注意しなければいけないのが、PageFragmentインスタンス へアクセスする際に **parent** を最後につけないといけないということ。
つけないとインスタンスではなく PageFragment の本体を参照してしまう。
次の Stack Overflow の記事がわかりやすいので見ると良いだろう。

[appmaker - How to access page fragment custom properties programmatically? - Stack Overflow](https://stackoverflow.com/questions/45875383/how-to-access-page-fragment-custom-properties-programmatically)
TensorFlow | ADDA > 線形方程式を解き直してみた (solverをQMRからBi-CGStabに変更) > ほぼ同じ結果

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

学習コードv0.1 http://qiita.com/7of9/items/5819f36e78cc4290614e

http://qiita.com/7of9/items/8cf6182f8086a419f9fe
の続き。

### 概要

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

- TFRecordsを読込んで学習する
- input: 5 nodes
- output: 6 nodes
- サンプル数: 223,872
- 学習データ: ADDAにより計算した値
    - #input
    - x,y,z: dipole position
    - refractive index: real and imaginary part
    - #output
    - initial values for linear equation solution for (x,y,z),(real,imaginary)

５次元関数の補間を学習させようとしている。
(5次元の回帰問題というのだろうか？）

### 変更点

http://qiita.com/7of9/items/032b224a4094df58e5b2
にて気づいたのがiterative solverのbreakdown (参照: [manual.pdf](https://github.com/adda-team/adda/blob/master/doc/manual.pdf) p39)。

breakdownというのはsolverの誤差減少が進まなくなる症状のようだ。
Bi-CGやQMR, QMR2というsolverを用いた時、breakdownが生じる場合があるとのこと。
(CGNRやCSYMはbreakdownしにくい?)

ADDAのデフォルトsolverはQMR。
[QMRでnumber of iterationを見ると](http://qiita.com/7of9/items/db74c768617aacbe9381)確かにbreakdownしているような兆候がある。

そのため、breakdownしていなさそうなBi-CGStabにsolverを変更し、その結果をTensorFlowで学習させた。

### 結果

| A:type | B:original[回] | C:TF学習[回] | D:C/B |
|:-:|:-:|:-:|:-:|
| Bi-CGStab  | 26  | 21  | 0.846  |

(originalの初期誤差:1.0, TF学習を用いた場合の初期誤差:0.06008)

QMRの結果とほとんど変わらず。

```
RE_000 = 6.0084932894E-02
RE_001 = 2.2219480098E-02  + 
RE_002 = 1.3024803445E-02  + 
RE_003 = 6.7950270565E-03  + 
RE_004 = 1.6579624353E-02  - 
RE_005 = 3.2195123056E-03  + 
RE_006 = 1.8954598531E-03  + 
RE_007 = 2.0297016676E-03  - 
RE_008 = 1.0293947020E-03  + 
RE_009 = 7.9445808838E-04  + 
RE_010 = 9.7065385626E-04  - 
RE_011 = 8.0464080288E-04  -+
RE_012 = 3.0441618705E-04  + 
RE_013 = 2.7334021124E-04  + 
RE_014 = 9.6562247371E-05  + 
RE_015 = 5.8637230384E-05  + 
RE_016 = 4.0160684625E-05  + 
RE_017 = 3.8796530660E-05  + 
RE_018 = 3.8270488935E-05  + 
RE_019 = 6.4025491347E-05  - 
RE_020 = 1.0453903490E-05  + 
RE_021 = 9.9663182590E-06  + 
```

初期誤差を1E-05あたりまで抑えないと自分が希望しているほどの効率化にはなりそうにない。
初期誤差が1E-05になるようなNeural network学習のパラメータとハイパーパラメータは見つかっていない。
ffmpeg でステレオ映像加工

ffmpeg でステレオ映像に加工するために使用したサイト
メモ

wiki
https://ja.wikipedia.org/wiki/FFmpeg

option
http://www.cagylogic.com/archives/2014/06/21134514.php
最新 http://www.cagylogic.com/archives/2017/06/04125209.php

トリミング
http://m0kichiazuma416.blog.fc2.com/blog-entry-58.html

seek
http://looooooooop.blog35.fc2.com/blog-entry-1145.html
Maxショートカットまとめ

※随時追加予定（2017/9/17現在）
MaxMSPについての個人的なメモ

※WindowsとMacで操作が違うので、適宜読み替える
cmd <-> ctrl
opt <-> alt

## MaxMSPショートカットまとめ
※PW：パッチウインドウ
※OBJ：オブジェクト

### [オブジェクトショートカット]
編集モードの時に下記ショートカットでマウスポインター位置に追加できる
- **PWでダブルクリック or N**：Object Box追加
- **I**：Number Box追加
- **F**：Floating Number Box追加
- **M**：Message Box追加
- **C**：Comment Box追加
- **T**：Toggle追加
- **B**：Button/Bang追加
- **S**：Slider追加


### [オブジェクト・コード操作ショートカット]
- **OBJ選択 → cmd+D**：OBJ複製(複数可)
- **OBJ選択 → opt+ドラッグ**：OBJ複製(複数可)
- **del**：パッチコード削除
- **opt+ドラッグ**：パッチコードやOBJ選択(特にパッチコードの選択が簡単)
- **cmd+Y**：OBJの整列(Menu-Arrange-Align)
- **cmd+Y**：パッチコードの整理(Menu-Arrange-Align)
- **cmd+shift+Y**：OBJに重ならない経路でパッチコードを整理
- **ctrl+PWの余白部分クリック**：描きかけのパッチ―コード削除
- **OBJ選択→Ctrl+I**：インスペクタ表示
- **OBJ選択→Ctrl+Shift+I**：オブジェクトインスペクタウインドウ表示
- **複数OBJ選択→Ctrl+Shift+A**：縦横一列に整列(Auto Align)
- **Shift+クリック**：複数OBJ選択の追加／選択解除
- **Alt押しながらOBJクリック**：OBJのヘルプパッチ表示
- **コード選択→Ctrl+Shift+Y**：パッチコードを折れ線に
- **コード選択→Ctrl+Shift+A**：パッチコードを折れ線に(Auto Align)
- **Shift押しながらパッチコードつなぐ**：自由な形状でパッチコードつなげる
- **Cmd + OBJをクリック**：アンロック状態でもNumberやGUI操作ができる
- **Ctrl+Shift+E+OBJ複数選択**：[p]というサブパッチにまとめる(Encapsulate)
- **Ctrl+Shift+D+OBJ複数選択**：サブパッチを解除(De-Eecapsulate)
- **cmd+opt+G**：グリッドに沿わせる(Snap to Grid)
- **cmd+I**：インスペクタ表示切り替え


### [ファイル操作ショートカット]
- **Ctrl+N**：新規パッチウインドウ
- **Ctrl+O**：パッチウインドウを開く


### [画面表示・操作ショートカット]
- **Cmd+E**：ロック／アンロック状態の切り替え
- **Cmd+patcherの余白部分クリック**：ロック／アンロック状態の切り替え
- **Cmd+Z**：UNDO(直前の操作の取り消し※最後の保存時まで可能)
- **Cmd+F**：Maxパッチ内のオブジェクトを検索
- **PWでCtrl+マウス右クリック**：ロック／アンロック状態の切り替え
- **Cmd + ＋**：ズームイン
- **Cmd + ー**：ズームアウト
- **Cmd+1**：ズーム100%
- **Cmd+8**：ツールバーの一斉表示ON／OFF
- **OBJやコード選択→Ctrl+L**：ロック状態で表示(Show on Lock)
- **OBJやコード選択→Ctrl+K**：ロック状態で非表示(Hide on Lock)
- **ロック状態→OBJダブルクリック**：(ウインドウ閉じた)サブパッチを再表示
- **アンロック状態→Ctrl+OBJダブルクリック**：(ウインドウ閉じた)サブパッチを再表示
- **Ctrl+Alt+DE**：プレゼンテーションモードの切り替え
- **OBJ複数選択→Ctrl+Shift+P**：プレゼンテーションモードに選択したOBJを追加(Add to Presentation)
- **OBJ複数選択→Ctrl+Alt+P**：プレゼンテーションモードに追加したOBJを解除(Remove to Presentation)





## 学習方法
### [Help]
各Objectの簡単な使用サンプルが見れるので、そのパッチを見て使い方を覚えることができる

### [Cyclingサイト内Forum]

### [Tutorial Movie]
Mendeley APIを使って論文情報を取得後、単語の頻度情報からアブスト同士の距離を計算

せっかくMendeley APIを触れるようになったので、論文情報を取り出して解析したいと思います。

# コード
## ライブラリ
```r
require(httr)
require(rjson)
require(RCurl)
require(dplyr)
library(tm)
library(proxy)
```

## アクセストークンを取得する
例のごとくMendeley APIのアクセストークンを手に入れてください。
一番簡単な方法は以下を参考にしてください。
[お手軽にMendeley APIを叩く方法](http://qiita.com/kyusque/items/a50a5d7156ad06a5efdd#_reference-ace02311437cec508c7c)

```r
access_token <- "アクセストークン"
```

## 検索APIを使って論文情報を取得する
検索方法を細かく指定したい時はhttps://api.mendeley.com/apidocs/docs#!/documents_2/search から入力した後、Try it out!ボタンを押したときに出てくるRequest URLをapiとして使用してください。

```r
api <- "https://api.mendeley.com/search/catalog?source=journal&abstract=plasma%20medicine&open_access=false&limit=100"

doc_rsp <- GET(api,
               add_headers(
                 'Authorization' = paste("Bearer", access_token),
                 'Content-Type' = 'application/vnd.mendeley-document.1+json'
               )
)
```
## 取り出した論文情報を処理してアブスト情報から単語の出現頻度を計算する
```r
docs <- doc_rsp %>%
  httr::content(.) %>%
  rawToChar %>%
  fromJSON

docs <- docs %>% #ダブっているのでタイトルが重なっているものを取り除く
  sapply(function(x) x$title) %>%
  toupper %>%
  {function(x) !duplicated(x)}() %>%
  docs[.] 

absts <- docs %>%
  sapply(function(x) x$abstract) %>%
  VectorSource %>%
  Corpus

dtm <- absts %>% DocumentTermMatrix

```
## 単語の頻度情報からアブスト同士の距離を計算
```r
docsdissim <- dtm %>% as.matrix %>% dist(method = "cosine")

h <- hclust(docsdissim, method = "ward.D2")
plot(h, sub = "")
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158368/7d8a2e0d-ff80-1cd7-218c-4e24f66295ba.png)
FirefoxでFlashを常に有効化する

FlashはMacromedia社により開発されたwebコンテンツのフォーマットであるが、かねてより脆弱性が指摘されており、2014年ごろから本格的に主要なブラウザから排斥する流れになっている。現在は代替としてHTML5によるコンテンツの制作が盛んであり技術の移行が進められているものの、Flashは未だ重要な地位を占めておりサイトごとにFlashの実行可否を求める現在のブラウザの仕様は大きく利便性を損ねているにもかかわらず、設定から「常に有効化」するよう変更することができない。

#解決方法

　
　**プロファイルフォルダにあるblocklist.xmlからFlashを除外すればよい**



手元のblocklist.xmlでは、"flash"を含む行が100行以上ありすべてをチェックするのは大変なので、ここではblocklistを永久に削除する方法を紹介する。なお、blocklistを削除した場合既知のフィッシングサイトへアクセスしたときにFirefoxから警告を受けることがなくなるなどセキュリティレベルが低下するので注意すること。

1. FirefoxのURL入力バーからabout:configと入力しエンターキーを押す
2. 警告画面が出るので、次へ進む
3. extensions.blocklist.enabledをtrueからfalseに変える
4. Firefoxを終了する
5. windowsキー＋rキーを押し、出てきた「ファイル名を指定して実行ウィンドウ」に下記を入力する

　　　%APPDATA%\Mozilla\Firefox\Profiles\

6.　乱数列＋.defaultのフォルダを開き、blocklist.xmlを削除する


この後再びFirefoxを開くと、flashが常に有効化できるようになっているので常に有効化を選択する
pythonで自然言語処理を行うために必要なライブラリを揃えたDockerfile


個人用途のために、pythonで自然言語処理を行うために必要なライブラリを揃えたimageを作るためのDockerfileを作成しました。
せっかく作成したので、誰かの役に立つかと思い、こちらに公開することにしました。

## ソースコード
以下に置いています。
https://github.com/fukumame/dockerfile-machine-learning

## 含まれているライブラリ
- このdocker imageには形態素解析エンジンであるmecab及び、以下のpythonライブラリが含まれています。
  - jupyter                    
  - numpy
  - scipy
  - scikit-learn               
  - matplotlib                 
  - pandas
  - mecab-python3              
  - [neologdn](https://github.com/ikegami-yukino/neologdn)
- Jupyter notebookがport 8888でexposeされており、ホスト側のポートとバインドすることによって、Jupyter notebookを利用可能です。
- 新しい固有名詞の解釈を精度高く行うため、mecabの新語辞書である[mecab-ipadic-NEologd](https://github.com/neologd/mecab-ipadic-neologd)も含んでいます。
- neologdnは、日本語の正規化処理を行ってくれるライブラリで、以下の変換を行ってくれます。
    - https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja

## 使い方

- 上記レポジトリから `git clone` します。
`git clone https://github.com/fukumame/dockerfile-machine-learning.git`

- cloneしたディレクトリに移動し、以下のコマンドからdocker imageを作成します。

```bash
cd /docker/file/path
# イメージファイルの作成 (IMAGE_NAMEとTAGは任意の値)
docker build -t IMAGE_NAME:TAG .
```
- 上記作成したイメージをもとに、containerを起動します。
   - その際、Jupyter notebookをホスト側で使うためのポートをpオプションで指定し、vオプションにて、ホスト側ディレクトリのパスを指定します。

```bash
# 任意のCONTAINER_NAMEをつけて、HOST_PORTで任意のポート、を指定し、HOST_VOLUME_PATHでホスト側のパスを指定し、container作成 
docker run -it --name CONTAINER_NAME -p HOST_PORT:8888 -v HOST_VOLUME_PATH:/notebook IMAGE_NAME bash
```
- 起動すると、以下のメッセージが表示されるので、表示に従いブラウザからURLを叩くと、jupyter notebookが起動します
    - 表示されている8888のポート番号は、コンテナ側のポート番号なので、ホスト側でバインドしたポートが異なる場合、置き換えてください。
    - vオプションとして指定したホスト側のパスが、jupyter notebookのホームディレクトリとなります。

```
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://0.0.0.0:8888/?token=xxxxxxxxxx
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64437/7848bc28-4f41-b1d8-55f5-8b7cc27ba0d0.png)
ざっくばらんメモ_6：kaggle, C++のVisitor


###kaggle Zillow challenge
前回まででresent based regressionが動くようになったので
今回はモデルのセーブとテストデータに対する予測を行えるようにする．
結果無事resnetベースの推論モデルによる予測ができるようになってきた
ので早速ある程度学習してからテストデータで予測をしてみる．
ー結果改善はせず．スコア0.0688108，学習が足りないのかもしれない．
　もう少し学習を続けてみる事にする

###C++におけるVisitorの仕組み
Visitorという設計概念を用いることで，入力の型に限定されない汎用的な関数を設計する事が可能となる．
これはelementとvisitorクラスから成り立っている．
まず始めにベースクラスとしてのelementを作成．ここではaccept関数を宣言しておき
またありえる各elementのtype毎のベース関数を定義しておく．
次にベースクラスとしてのvisitorを作成．visit関数を作成した全てのelement typeに対して作っておく．
続いて各elementにおいてaccept関数を定義し，引数として入ってきたvisitorクラスのvisit関数をコールするようにする．
そしてvisitor derivedなクラスを定義し，その中で具体的なvisit関数の定義を行う．
この時，visit関数は引数としてelementクラスをとるため，各elementクラスに対して定義が必要になる．
以上の設計において，クライアントはvisitor derivedなクラスのinstanceを作成し，
それらはelementクラスのaccept関数の引数として用いられる．
ここでは，elementクラスのaccept関数で定義した通り，引数のvisitorクラスのvisit関数が実行されることになる．
結局，最終的に実行されるvisit関数はelement，visitorクラス双方に依存して動作を変化させられる．
この設計は，複数typeのelement/visitorを再帰的に適用したい場合などにおいて便利な設計になる．
名前付きスコープについての基本的なまとめ rails

###名前付きスコープとは
特定の条件式や、ソート式などをあらかじめモデル側で名前付けして、利用時には名前で呼び出せるようにしたものです。

例えば、

技術評論社の書籍のみを取得するgihyoスコープ
刊行日の新しい順に並べるnewerスコープ
刊行日の新しい順に１０件取得するスコープ

```rb:models/book.rb
Class Book < ApplicationRecord
  scope :gihyo, -> { where(publish: '技術評論社') }
  scope :newer, -> { order(published: :desc) }
  scope :top10, -> { newer.limit(10) } 
end
```

次にコントローラー側からこれを呼び出してみましょう

```rb:record_controller.rb
def scope
  @books = Book.gihyo.top10
  render 'hello/list'
end
```

###名前付きスコープに引数を渡す。

```rb:models/book.rb
scope :whats_new, ->(pub) {
  where(publish: pub).order(published: :desc).limit(5)
}
```

```rb:Controllers
@books = Book.whats_new('技術評論社')
```

は以下になる

```sql
SELECT "books".*FROM "books" WHERE "books".
"publish" = ? ORDER BY "books" WHERE "books"."published" DESC LIMIT ?
[["publish", "技術評論社"], ["LIMIT", 5]]
```

###default_scope = モデル呼び出しの際にデフォルトで適用されるスコープ

```rb:review.rb
Class Review.rb
  default_spope { order(updated_at: :desc) }
end
```

```rb:record_controller.rb
def def_scope
  render plain: Review.all.inspect
end
```

は以下になる

```sql
SELECT "reviews".*FROM "reviews" ORDER BY "reviews"."updated_at" DESC
```

これらにより綺麗なコードが書けます。

参考書籍「Ruby on Rails5アプリケーションプログラミング」
danger-rubocopでdiffに直接コメントしてくれるようにした

[danger](https://github.com/danger/danger)はCIでlintを実行した結果をGitHub等にコメントしてくれるコマンド。プラグインでいろんな言語やlintに対応している。AndroidやiOS界隈でよく使われている印象だが、Rubyで書かれている（TypeScript版もある）。

Rubyのlintと言えばRubocop。しっかりdanger-rubocopというのがあるので使ってみた。

う〜ん、どうも違う。1つのコメントで「どのファイルの何行目にこういう問題があるよ」と書いてくれるんだけど、そこまでわかってるならdiffに対してコメントしてくれよという気分。

調べたら、簡単に対応できそうだったので、danger-rubocopに[プルリク送っておいた](https://github.com/ashfurrow/danger-rubocop/pull/21)。

```ruby
# Dangerfile

# これだと単一のコメント
rubocop.lint

# これでdiffにコメントがつく
rubocop.lint(inline_comment: true)
```

行にコメントがつくと面倒くさくなくて直そうという気分になるね。
verilogテスト記述思い出し[1](clk作成)

VerilogHDLの書き方を完全に忘れてしまったので思い出すシリーズ

# なぜテスト記述から始めるのか
プログラミングと同じく、テストから書いて、うまく動作するか見ながら書いたほうが何かとやりやすい。

あと、テスト基本構造は割りと毎回同じなので、一回書くと使い回しできる

# テスト記述を書くときのイメージ

テスト記述側からは、入力とそれに対する出力しか見えない。
なので、予め入力パターンを作っておいて、出力が正しいかで確認する

接続イメージは以下の通り
テスト記述(reg) <=> || モジュール(入力) 　モジュール(出力) || <=> テスト記述(wire)

# とりあえずクロックを作る
動作確認の基準となるクロックがないと、そもそも何も動かない。
なのでまずはクロックを作るところから始める。

## 下準備
入出力がないと話しにならないので、まずは下準備から始める。

* とりあえずおまじない

テストをする時の評価の精度や動作の単位指定が必要
テストのTOPに書いておけばとりあえず動くはず

```verilog
// 1nsごとに動作、1psごとに評価
`timescale 1ns/1ps
```

* moduleの接頭辞/接尾辞
始まりと終わりにはこんなのをつける

```verilog
module clk;
// ここに中身を書く
endmodule
```

* 必要な入出力を記述
冒頭に、このモジュールの入出力を記述する。
今回はclockなので出力だけ。
ついでにrstの信号も作る(negativeなxrst)。

```verilog
output clk;  //clock
output xrst; //非同期rst(negative)

reg clk_r;
reg xrst_r;

assign clk = clk_r;
assign xrst = xrst_r;
```

ここまでの書き方をまとめて以下のようにもできる。
楽でいいが、個人的にはregister名には全部識別子(_r)をつけたいのでちょっと微妙。
以下ではこの記述を前提に書き進める。

```verilog
`timescale 1ns/1ps
module clk(
    output reg clk,
    output reg xrst
);
endmodule
```

## 中身を書き始める
上記で作成したreg(clk, xrst)に値を入れていくことでclkとxrstを作る。
ここは学んだ場所で流派が分かれそうだが、今回はinitial beginとalways beginをベー
スに作る。
また、[1]を参考に、基本はノンブロッキング代入で書き進めてみる。

* 変数の初期化(+ xrstの動作)

変数の初期化と、シーケンシャルな動作をinitial beginに記述していく。

```verilog
initial begin
   clk = 0;
   xrst = 1;
/* xrstを50サイクルだけ1に　*/
   # 3
      xrst <= 0;
   # 50
      xrst <= 1;
end
```

これで、以下の2点が達成された。

1. clkの初期値を0に 
2. xrstを開始から3サイクル後に0に、その50サイクルあとに1に

* clkを定期的に動かす

初期化しただけでは動いてくれないので、クロックを動かす

```verilog
/// clkを10ごとにON/OFF
always begin
   # 10
     clk <= ~clk;
end
```

これで、クロックが10ごとにON/OFFの動作をするはずである。
(1CCとしては20になる)

# 早速動かす

実際にmodelsimで動かしてみる。
正直思い出すにあたってここが一番苦労したが、完全に別テーマなのでここでは割愛する。

<img width="495" alt="wave.png" src="https://qiita-image-store.s3.amazonaws.com/0/201331/20cf884c-ac5b-8f87-01ff-c40d27ab829c.png">


最初に1nsを1単位にしたので、10nsごとにclkがON/OFFになっていればいい感じ。
(評価自体は1ps単位で行われる。)

だいたいこんな感じでclockが作れたので、次からはこのclockを使ってテストモジュールを作っていく。

(参考
[1] : http://dora.bk.tsukuba.ac.jp/~takeuchi/?%E9%9B%BB%E6%B0%97%E5%9B%9E%E8%B7%AF%2FHDL%2FISim%20%E3%81%AB%E3%82%88%E3%82%8B%20Verilog%20%E3%83%86%E3%82%B9%E3%83%88%E3%83%99%E3%83%B3%E3%83%81)
LivetではUIDispatcherを明示的に設定しないとnull例外が出る

WPFのMVVMアプリを作ろうとLivetを使っていた時に発生したNullReferenceExceptionについて原因が分かったので, 備忘録的メモ.

# Livet
<a href="https://github.com/ugaya40/Livet">Livet</a>は国産のMVVMインフラストラクチャです.
MVVMパターンに必要な機能が一通り揃っていて, いつもお世話になっています.


## ReadonlyDispatcherCollection
LivetにはObservableCollection(Modelの配列)からViewModel用の配列を作るための便利なヘルパ関数が用意されています.
CreateReadonlyDispatcherCollectionですね.

```csharp:MyApplicationViewModel.cs
VMList = ViewModelHelper.CreateReadOnlyDispatcherCollection(
            Model.List,
            (m) => new VM(m),
            DispatcherHelper.UIDispatcher);
            CompositeDisposable.Add(VMList);
```
これでModel.Listの変更が自動的にVMListに反映されると期待して, 変更を加えてみると...  
![null.png](https://qiita-image-store.s3.amazonaws.com/0/139940/a42557ea-3246-51bf-fbfc-3df73fb2b5bb.png)

なんかnull例外出てるんすけど...orz


# 原因と対処法
Livet.DispatcherHelper.UIDispatcherがnullで死んでました.

対処法ですが, App.xaml.csのOnStartUpにて, Livet.DispatcherHelper.UIDispatcherにAppのDispatcherを入れてあげればOKです.

```csharp:App.xaml.cs
    /// <summary>
    /// App.xaml の相互作用ロジック
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            // ↓が必要!
            Livet.DispatcherHelper.UIDispatcher = Dispatcher;
        }
    }
```

既存のアプリ作成に途中参加すると, この辺りはすでに先輩がやってくれていて, 自前でやろうとしたときにちょっとハマりました.  
LivetのVSプロジェクトテンプレートでプロジェクト作成すればこんな事は起こらないんですが, NuGetで後からLivetパッケージを入れた場合などにハマりやすいポイントかと思います.
UbuntuのOSバージョン/アーキテクチャ/カーネルバージョンを確認

##■コマンド##
OSバージョンの確認1(/etc/os-release)

```shell:os_verchk1.sh
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.3 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.3 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
```

OSバージョンの確認2(/etc/issue)

```shell:os_verchk2.sh
$ cat /etc/issue
ubuntu 14.04.3 LTS \n \l     <-- 結果
```

OSバージョンの確認3(/etc/lsb-release　※要lsb-releaseパッケージ)

```shell:os_verchk3.sh
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"
```


アーキテクチャ（OSが32bit, 64bitどちらなのか）を調べるコマンド1

```shell:arch_chk1.sh
$ arch
X86_64 <--  64bitの場合
i686   <--  32bitの場合
```

アーキテクチャ（OSが32bit, 64bitどちらなのか）を調べるコマンド2

```shell:arch_chk2.sh
$ uname -a
Linux <machine_name> 3.13.0-63-generic #103-Ubuntu 
SMP Fri Aug 14 21:43:30 UTC 2015 i686 i686 i686 GNU/Linux
```

カーネルバージョンを調べるコマンド(実は上と同じ)

```shell:karnel_chk.sh
$ uname -a
Linux <machine_name> 3.13.0-63-generic #103-Ubuntu 
SMP Fri Aug 14 21:43:30 UTC 2015 i686 i686 i686 GNU/Linux
```

##■Tips:
OSバージョン確認の「/etc/issue」はログイン前のメッセージ表示用ファイル。
ちなみに「/etc/issue」がコンソールログイン、「/etc/issue.net」がネットワーク経由のログイン向けのファイル。

OSバージョン確認の「/etc/lsb-release」だが、他Linux OSでは以下の通り。
汎用　    $cat /etc/os-release　　　(2017/9/17追記)
RedHat系 $ cat /etc/redhat-release
Fedora系 $ cat /etc/fedora-release
Debian系 $ cat /etc/debian_version 
Ubuntu系 $cat /etc/lsb-release
Turbolinux系 $ cat /etc/turbolinux-release
SuSE Linux系 $ cat /etc/SuSE-release



##■参考##
Ubuntuのバージョン確認方法
https://webkaru.net/linux/ubuntu-version/

Ubuntuのバージョン確認とアーキテクチャ確認コマンド
http://mawatari.jp/archives/check-ubuntu-version

/etc/issueおよび/etc/issue.netに記述可能なシーケンス
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/272etcissue.html

今更聞けない！LinuxのOSやバージョンの確認方法
https://eng-entrance.com/linux-os-version#etcissue

uname - システム情報を表示 - Linuxコマンド
https://webkaru.net/linux/uname-command/

man os-release
https://www.freedesktop.org/software/systemd/man/os-release.html

Linuxのディストリビューションとバージョンの確認方法をまとめてみた
http://note.kurodigi.com/linux-version/
テキストストリームを一行ずつ切り分けたIEnumerable<string>にする

ネタ元: [C#:IEnumerable<T>の実装サンプルとして簡易catコマンドを作成してみた](http://qiita.com/gushwell/items/be45b4226080f44db3b1 "C#:IEnumerable<T>の実装サンプルとして簡易catコマンドを作成してみた")

ええーっ、IEnumeratorの実装クラス作らなくてもGetEnumerator()の中でyield returnするだけでいいのかー。すごーい！便利！
だとしたら拡張メソッドにできるんじゃね？そうしたらラッパークラスと違って新たなインスタンスを作らなくて済むから効率的じゃない？
てことでやってみました。

面白そうだから作ってみただけだけど「テキストストリームをLinqで処理できる」というのは意外と使える場面があるかもしれない。

```csharp
  public static class LineEnumerableExtentions
  {
    //TextReaderから一行ずつを要素にして返すよ
    public static IEnumerable<string> AsLineEnumerable(this TextReader source)
    {
      string s;
      while ((s = source.ReadLine()) != null)
      {
        yield return s;
      }
    }
  }

  //実行サンプル(C#6.0以降)
  class Program
  {
    static void Main(string[] args)
    {
      Console.In.AsLineEnumerable().
        All(line => { Console.WriteLine($"[{line}]"); return true; });
    }
  }
```

###実行サンプルについての補足
Linq内部で実行させる処理は値を返さないといけない。なので`{voidを返す処理; return true;}`みたいにするわけだけど、それをSelect()に処理させるとIEnumeable<bool>を返すことになる。
All()だとboolを返すだけなのでちょっぴり効率がいいはず。
そのかわり必ずtrueを返さないとfalseを返したところで実行が中断されるので注意。

###Streamの拡張メソッドがない理由
「[ネタ元](http://qiita.com/gushwell/items/be45b4226080f44db3b1 "C#:IEnumerable<T>の実装サンプルとして簡易catコマンドを作成してみた")の方はStreamもソースにできるじゃない！」と思った人へ。
元ネタではStreamを受け取ってEnumerableTextReaderクラス内部でStreamReaderを作ってますよね。
普通に考えると拡張メソッドのローカル変数としてStreamReaderを作れば同じことができそうなんだけど、StreamReaderはClose()やDispose()のときに元のストリームもCloseするんです。
そのため拡張メソッド化した場合、内部で作ったStreamReaderをメソッド終了時にDisposeしないのは行儀が悪い。でもDisposeすると元のストリームまでCloseしてしまう、つまり「メソッドを実行するだけでそのストリームはクローズしてしまう」という厄介な挙動になってしまいます。
StreamReaderを作らずに直接Streamから読み出せば実装不可能ではないんだけど、さすがにめんどくさすぎるのでやらない。
StreamReaderを作るところまでは自分でやってください。その方がいろいろ柔軟性も高いだろうし。

それにしても`yield return`は便利ですね。
処理の流れが読み取りにくくなるので複雑な処理で使うとドはまりしそうだけど。
YouTubeに投稿した動画の自動字幕を表示させない

YouTube先生が賢くなったので、最近は音声認識結果による字幕が自動生成され、ユーザが字幕ボタンをクリックすることでそれが表示されるようになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/714b3f49-1807-09de-4e7b-489c45af60e3.png)

自動生成の質はまだ完全とはいえず、時には何の偶然か「金正恩」「反軍政デモ」のような物騒なワードが錬成されてしまうことで[ヒカキン自動生成字幕](https://twitter.com/Hikakin_Jidou/status/909087385350062080)のようにネタにされてしまうこともあるわけです。

どうやらこれは話者の滑舌の問題ではなく、音声認識処理に問題があるようなので、きちんとしたナレーターが喋っていてもパワーワードが錬成される事例を確認しています。趣味の動画などであればむしろネタになって良いこともあるかもしれませんが、最近は自社サイトなどにYouTube動画を埋め込む事例も多いと思います。そういう状況でおもしろ字幕が表示されるとマズいので、取り急ぎ字幕をオフにする方法です。

## 方法
対象となる動画の設定ページを開き、「動画の言語」を「該当なし」に設定することで表示されなくなるようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185296/1d52cfeb-eb68-e669-78c8-0d6a696653e4.png)

とはいえ字幕OFFはバリアフリー的には宜しくないことなので、可能なら動画設定の「字幕」から手動で書き起こしたデータを設定しておくことをおすすめします。
【解決済】Xcode9 GMのiOS11シミュレータ上でマップの動作が重くなる

**2017.10.10 更新**
Xcode9.1 beta2でfixされました。やったぜ！夕飯はドン勝だ！！！！

**2017.09.25 更新**
OpenGLES.framework(libCoreVMClient.dylib)をXcode9 Beta3のものに差し替えると改善されるようです。
が、手元にBeta3のデータがないため動作未確認です。スイマセン…

# 問題
Xcode9 GMでGoogle Maps SDK for iOS、MapKitなどマップSDKを使っているアプリをiOS11シミュレータ上で実行してマップを表示・スクロールすると、CPU使用率が100%以上&FPSが1以下になり動作パフォーマンスが極端に低下する問題が発生しています。

具体的にはマップのレンダリング時にアプリ自体のUIが1～3秒くらいフリーズします。タップして数秒後に反応する感じです。デバッグがしづらくてとてもつらい。
適当なViewControllerにMKMapViewを貼り付けると症状が確認できると思います。

最初この問題が発生した時は使ってるマシンのスペックが低いからなんじゃないかと思っていましたが、調べたところ他にも同様の報告があがっているためそうでもないらしく…
更にはXcode9 beta 4の頃からこの問題が発生している模様。困った。

# 試したこと
- 代替レンダリングモードを変更 -> 効果なし
- Graphics Quality Overrideを変更 -> 効果なし
- Optimize Rendering for Window Scaleをオフに変更 -> 効果なし

代替レンダリングモードについてはこちらを参考にしました。
[iOS 11 Simulator unusable slow](https://forums.developer.apple.com/thread/83570)

>`defaults write com.apple.CoreSimulator.IndigoFramebufferServices FramebufferRendererHint X`  
Where X is:
0 = auto
1 = Metal
2 = OpenCL
3 = OpenGL

# 解決策
~~今のところないようです。~~
(2017.10.10 更新)
Xcode9.1 beta2でfixされました。アップデートしましょう。

(2017.09.25 更新)
OpenGLES.frameworkをXcode9 Beta3のものに差し替えると改善されるようです。
**(Xcode9 Beta3のデータを持っていることが前提条件となります)**
他の方が既に記事を書かれていますので、詳しくはそちらを確認していただければ。
[Xcode9でiPhoneX/iOS11のシミュレーターが凄まじく重いのをどうにかする](https://qiita.com/840_/items/3e93f22cd47416512ad6)

同様の報告がいくつかOpenRadarにあがっており、Apple対応待ちのようです。
今すぐにiOS11の対応をする必要がないのであれば、iOS10以下のシミュレータを使うという手もあります。
また実機での動作の場合はiOS11でも問題ありません。実機で確認するのが一番かなと思います。
ワイヤレスデバッグサイコーですね。

# 参考ページ
[iOS 11 Simulator unusable slow](https://forums.developer.apple.com/thread/83570)
[MapKit in Xcode 9 iOS 11 simulators unusably slow](https://openradar.appspot.com/34467045)
[GoogleMaps on simulator in Xcode 9 uses over 100% of CPU when moving the map](https://stackoverflow.com/questions/46234101/googlemaps-on-simulator-in-xcode-9-uses-over-100-of-cpu-when-moving-the-map)
[Map is unusably slow in ios 11 beta Xcode 9 simulator](https://github.com/mapbox/mapbox-gl-native/issues/9959)
Ionicで電卓を作成したので振り返る（Directive編）

Ionicで電卓を作成したので振り返る（Component編）の続きです。
今回は、Directiveを使った文字サイズの自動調整部分になります。
主に以下の内容について書きます。

・変更検知
・文字サイズの変更（謎の計算式）


# 作ったDirectiveの説明

フォントサイズを自動調整するDirectiveを作りました。名前はflowtypeといいます。ソースコードは以下。
https://github.com/scrpgil/xcalculator/blob/master/src/directives/flowtype/flowtype.ts

極めて地味な変化ですが、入力された文字数に応じてフォントサイズを自動調整しています。ちょうど下の画像のような感じです。

![Screen Shot 2017-09-13 at 23.39.54.png](https://qiita-image-store.s3.amazonaws.com/0/165335/11406c0c-1d75-848b-3c73-d0d5f2a9ff64.png)

![Screen Shot 2017-09-13 at 23.40.01.png](https://qiita-image-store.s3.amazonaws.com/0/165335/f9f6754f-aace-0527-6f02-5b3f6aac5129.png)
※わずかながら上の画像よりフォントサイズが小さい

# 使い方

flowtypeディレクティブはInputとして以下の２つをもちます。

・flowtype
　入力される文字列です。

・size
　フォントのデフォルトサイズです。

大体HTMLで記述するとこんな感じです。

````html
<div flowtype="あいうえお" size=7></div>
````



# 変更検知

Angular標準のOnChangesを使用しています。
コードで書くと以下のような感じ。

````typescript
import { OnChanges, Directive, ElementRef, Input } from '@angular/core';

@Directive({
    selector: '[flowtype]' // Attribute selector
})
export class FlowtypeDirective implements OnChanges {
   @Input('flowtype') flowtype: any;
   @Input() size: number;

   /** 略 **/
   ngOnChanges(changes:any) {
        /** 略 **/
   }
}
````

FlowtypeDirectiveはインポートしたOnChangesモジュールを継承しています。OnChangesモジュールを継承することでngOnChanges()メソッドを呼び出せるようになります。
今回だと、文字数としてインプットされているflowtype変数が変更されるたびにngOnChanges()メソッドが呼び出されるので、このなかでフォントサイズ変更の処理を記述しています。


# 文字サイズの変更（謎の計算式）

以下が文字サイズの変更処理になります。本ディレクティブの主目的ですね。

````TypeScript
changeFontSize(){
    var fontSize = this.size;
    var len = this.flowtype.length - 1;
    var newSize = (100 / len) * 1.7;
    if(this.size > newSize){
        fontSize = newSize;
    }
    this.el.nativeElement.style.fontSize = fontSize + "vw";
    this.el.nativeElement.innerHTML = this.flowtype;
}
````

話としてはめちゃくちゃ単純で以下の計算式でフォントサイズ(vw)を求めて、それが、デフォルトサイズより小さい値であれば、フォントサイズとして設定するといった処理になっています。

・フォントサイズ(vw) = 100 / 文字の長さ

vwはビューポートの何分の1か？という指定ができる単位です。

この計算式では謎の数値の1.7をかけています。こいつが何かと言いますと、何者か自分でもわかっておらず、とりあえずないと文字が小さすぎてこれ以上大きい数値だと文字がはみ出ると行った始末です。
おそらく、3文字ごとに挟んでいるカンマの影響でしょうか？
フォントが等幅フォントでないため、カンマの用に横幅が小さい文字が複数含まれると幅が足りなくなってしまうのでしょう。と思います。

# まとめ

今回は、文字列可変変更のDirective作成を振り返りました。
よくありそうな機能。かつswiftとかだとフレームワークがサポートしてくれてそうな機能ですが、いざ、処理を考え実装するとなると色々考えないといけないことがあって面倒ですね。

この記事書く時に改めて調べたら既に同じDirectiveは世の中にたくさん存在してました。しかも、私のとりあえず動くものに比べると間違いなく出来がよいでしょう。
いつかこの文字サイズ変更Directiveも他のDirectiveを参考に書き直そうと思います。
https://github.com/lokenxo/ng2-fittext
Eclipseでソースコードをコメント化するショートカット

#概要
Javaのコメントには次の3種類がある。

(1)「//」以降、行末までをコメント化する形式
(2)「/*」と「*/」で対象を囲む形式
(3)「/**」と「*/」で対象を囲むJavadoc用のコメント形式

Eclipseでは、(1)と(2)についてショートカットキーを用意している。

 

#(1)のコメント形式

コメントの始まりを示す // は、行頭でも、行の途中でも入力することが出来る。

Eclipseでは、行頭に // を追加するショートカットキーを用意している。

コメント化したい行にカーソルを移動して、 CTRL+/ を入力する。（なお、 CTRL+7 でも同じことが出来る）

また、行頭で // によりコメント化されている行にカーソルを移動して、 CTRL+/ とすればコメントを外すことが出来る。

複数行を一気にコメント化するには、コメント化したい範囲を選択して、 CTRL+/ を入力する。

###【ショートカットを使ったときの細かな動作】

１．行頭からスペースやタブでインデントをつけており、その後ろに // がある場合、その // は「行頭にある」と判断される。

その為、この状態で CTRL+/ とすると、コメントが外れる。

２．行頭に // のある行と // のない行を一緒に選択して CTRL+/ とすると、コメント化される。

すなわち、行頭に // のある行では、さらに // が付加されて //// となる。

 

#(2)のコメント形式

この形式は、複数行に渡るような長いコメントであっても、最初と最後の位置だけ入力すれば済むという特徴がある。

Eclipseでは、この「/*」と「*/」を追加するショートカットキーを用意している。

コメント化する範囲を指定して、 Ctrl+Shift+/ を入力する。

コメント化されると、その範囲内の文字が変化する。

コメントを外すときには、すべての範囲を選択する必要はなく、範囲内の一部を選択した後、 Ctrl+Shift+\ と入力すればコメントを外すことができる。

「//」以降から行末までをコメント化する形式のショートカットキー Ctrl+/ との違いは、

・Shiftキーも押す必要がある
・コメントを外すときは、/ ではなく \ （バックスラッシュ）を使用する

###【ショートカットを使ったときの細かな動作】

１．コメントの先頭「/*」のある行で改行キーを入力すると、新しく作成された行の先頭に「*」が自動で付加される。

Ctrl+Shift+\ でコメントを外すと、自動で付加された「*」が残ったままになってしまい、コンパイルエラーを引き起こす。

頻繁にコメント化したりコメントを外す場合には、 // を使用する方が便利。

２．ショートカットを使用すると、コメントがネストするのを防いでくれる。

すなわち、 「/*　/*　*/　*/」 のようなコメントは入力できないようになっている。

入力ミスを防ぐという点でとても便利な機能。
Vagrantfileでup時に必要なプラグインを自動でインストールする

vagrant up時にVagrantのプラグインを自動でインストールするようなVagrantfileの記述があったので備忘録代わり。

一行目いじればreloadとかも条件を適宜追加可能。


#試した環境
MacOS 10.12.6 (Sierra)
Vagrant 1.9.7

#使ったサンプル
https://github.com/manjiii/Vagrant-samples/tree/master/Skeleton-nginx-nodejs-mongodb

#記述の仕方
以下みたいな感じ。

```
if ARGV[0] == 'up'
  plugins_dependencies = %w( vagrant-vbguest vagrant-docker-compose ) # <-　ここに必要なプラグインを列挙する
  plugin_status = false
  plugins_dependencies.each do |plugin_name|
    unless Vagrant.has_plugin? plugin_name
      puts "#{plugin_name} is required."
      system("vagrant plugin install #{plugin_name}")
      plugin_status = true
    end
  end
  #Restart Vagrant if any new plugin installed
  if plugin_status === true
    exec "vagrant #{ARGV.join' '}"
  else
    puts "All Plugin Dependencies already installed"
  end
end
```

#拾い元
Demand a Vagrant plugin within the Vagrantfile?
https://stackoverflow.com/questions/19492738/demand-a-vagrant-plugin-within-the-vagrantfile
Azure Portalの落とし穴

#Azureに登録
自分のdeep learningの開発環境を整えようとしていて
AzureやらAWS,GCPを使おうかなと思ってたところで、
ひょんなことからAzureを使い始めました。

#GPU搭載した仮想マシンは有料サブスクリプションに移行しないとダメ
けど無料試用期間の範囲だとGPU搭載した仮想マシンを利用できないんです。
てか選択肢に現れない。
なので仕方ないので、従量課金制に移行したんです。
これで仮想マシンを立ち上げられるだろうって！

#選択肢に変化なし
従量課金制に(有料版に)変更して
気を取り直して仮想マシンの選択肢に行ってみたら、
何にも変化はなく、GPUが使えない！！！

#もしかしたらサポートサービスに入ったらいいのかな？(安直)
このままではまずいのでどうにか手を打とうと
developerサポートサービスに入ってみた(3200円/month)
まーまーする
で仮想マシンの環境開発してみたところ、
案の定変わらず、、、、、、
なんでなん！！！！！！！:frowning2:

#速攻サポート解除したろうと思って
速攻解除しようと思って手続き開始したら
6ヶ月間は解約しても請求が続きます。
<img width="629" alt="解約.png" src="https://qiita-image-store.s3.amazonaws.com/0/123100/a9cf626f-7cf3-f2c5-374a-4151f0207ef9.png">
まじかよ！！！！
さらに解約したら今使ってるのも停止させられちゃうみたい。。。

#結論
GPUの環境構築敷居高すぎないかなー
ちゃんと契約を読んどけばよかった。。
あと半年Azure使わないと勿体無いよなーけどGPU使えないならあんま意味ないよなー残念すぎる、、、
皆さんもお気をつけあれ！


#追記9/20
解約の連絡をしたらなんとか大丈夫。初回は許されました。。

#追追記9/22
クォータ制限解除の申請を行ったら、リージョン制御解除をしてもらい米国の地域を選択してGPUのデプロイが完了しました。ようやく使えます！！
もしAzureを使い始める人がいたら参考になればと思います！
[Design] Facebookが青い理由は？ 意外！


![](https://dmxvlyap9srmn.cloudfront.net/production/articles/1031/large_7a0e059f-cc0e-4f4b-9a51-1cfde4258297.jpg)
> Mark Zuckerberg. Photo by Bloomberg.

# 結論

Facebookが青い主な理由は、創設者の **Mark Zuckerberg** が **色盲** であるため（赤-緑色覚異常）です。

Mark Zuckerbergが「 **ブルーは私にとって最も豊かな色である** 」、ニューヨーカー誌に語りました。 


# 赤緑色盲異常の影響を受けた人たちから見たFacebook

![ノーマルと赤緑色盲の人のビジョンの比較図](http://image.uisdc.com/wp-content/uploads/2017/08/0-LZ-Py8LpDtLKKmP9.jpg)


上のノーマルと赤緑色盲の人の **ビジョンの比較図**を見れば分かるように、
赤緑色盲異常の影響で、青色が **紫色に見える**ようになるため、
彼たちの目には、Facebookはこのように紫色ぽく映ります。

![赤緑色盲異常の影響を受けた人たちから見たFacebook](http://image.uisdc.com/wp-content/uploads/2017/08/1-3GL68QivZdBwEBhEFSMX_Q.png)

# 豆知識

## 色覚異常を持つ人の比例
先天性色覚異常を持つ人は、
**日本**においては **男性**で約 **5%**、 **女性**で約 **0.2%**の割合であるが、
フランスや北欧では男性で約 **10%**、女性で約 **0.5%**であり、
アフリカ系の人では **2～4%**程度です。

## 色覚異常の呼び方
**2017年9月**頃からは、「 **色覚多様性** 」とも呼ばれるようになった。


# 参考になったリンク

http://ja.affdu.com/facebook-is-blue-because-mark-zuckerberg-is-colorblind.html
http://www.uisdc.com/blue-the-most-important-color
http://aifan.jp/design-facebookが青い理由は？-意外！/
先頭の文字だけ大文字にする

# str.capitalize() を利用する

```
In [1]: str = "abc"

In [2]: str.capitalize()
Out[2]: 'Abc'
```

```
In [3]: str = "1abc"

In [4]: str.capitalize()
Out[4]: '1abc'
```

```
In [5]: str = "#abc"

In [6]: str.capitalize()
Out[6]: '#abc'
```
Rails5.1のwebpackオプションでReact環境構築

# はじめに
最近Rails5.1のwebpackオプションを用いてReactを勉強をしていました。
とても便利なオプションなのですが、記事が少なくて困ったことがあったのでReact環境構築周りを記事にしておこうと思います。

# 動作環境
ruby 2.4.1
rails 5.1.0
node 8.4.0
※nodeが入っていないとrails new のwebpackオプションでこけるので注意

# Railsアプリ作成
Rails5.1ではwebpackオプションが入り、
```rails new hoge --webpack```
 みたいにすれば、アプリ内にwebpackの環境が構築でき、さらにデフォルトでGemfileにwebpackerが入るのでrailsでwebpackerコマンドが使用できるようになります。また、
```--webpack=react```
とオプションをすることで、reactの環境も一緒に作ってくれます。
まずはこのwebpackオプションを用いてRailsアプリを作成しましょう。

ここまでで、app/javascript/packsと言うディレクトリが作成されていると思います。jsxファイルはpacks以下に置くようにしましょう。そうしないとwebpackによるビルド時にファイルを認識してくれなくなります。  
ここから下では、packs以下にデフォルトで作成されるhello_react.jsxをページに出力する作業を行っていきます。
# コントローラーの作成
railsの仕様上、rootのページを設定しないといけないので、WelcomeControllerを作り、indexアクションを作っておきます。そして、routes.rbは以下のようにしましょう。

```rb:config/routes.rb
Rails.application.routes.draw do
  root 'welcome#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end
```

この後、welcome/index.html.erbにpacks以下のhello_react.jsxを読み込ませるための処理を記述します。
welcome/index.html.erbを以下のようにしましょう。（すみません、今回はhamlで記述します。書き方は同じです）

```haml:welcome/index.html.haml
= javascript_pack_tag 'hello_react'
```
以下のようにjavascript_pack_tagに実行させたいjsxファイルを読み込ませれば、そのファイルのrenderメソッドが実行されます。

# Foremanの準備
Rails内でReactを動作させるには、Railsサーバーとnodeサーバーを立ち上げる必要があります。これはめんどくさいのでForemanを用いてコマンド一つでどちらも実行できるようにしましょう。
ますはgemのforemanをインストールしましょう```gem 'foreman'```をGemfileに追加し```bundle install```を行えばインストールされます。その後、以下のようなProcfileを一番上の階層(Gemfileと同じ階層)に作成しましょう。

```:Procfile
rails: PORT=3000 rails s
webpack: bin/webpack-dev-server
```
これにより、```bundle exec foreman start```でアプリを立ち上げることができるようになりました。
アプリを立ち上げた後にhttp://localhost:3000 に飛んでHello React!が出力されていたら成功です。　　

# 終わりに
このように、Rails5.1では簡単にreactを導入できるようになりました。とても便利な機能なので、ぜひ活用してください。また、僕自身がwebpackオプションを用いて作成したRailsアプリの[サンプル](https://github.com/getty104/react_practice)もあるので、もしよろしければ参考にしてみてください。
デプロイ前後の差分をプルリクエスト単位で確認する

二点間のリビジョンの差分をプルリクエスト単位で表示するコマンドです。
`<since>` と `<until>` にデプロイ前後のリビジョンを指定します。
GitHub と Bitbucket 対応。

```
git log <since>..<until> --merges --grep "pull request" --reverse --pretty=format:"* %s%n %b"
```

出力例です。

```
* Merge pull request #1060 from feature/#498-user-create-api
  #498 ユーザ作成APIを実装
* Merge pull request #1061 from feature/#499-fix-user-create-api-bug
  #499 ユーザ作成APIの不具合を修正
```

マージしたプルリクエストのタイトルとブランチ名を一覧で確認できるので
Slack とかに流すと影響範囲がざっくりと把握できて分かりやすいと思います。
Pythonで画像処理(その3)


# 前フリ
以前に書いた記事の続きを1年ぶりに。
- [Pythonで画像処理(その1)](http://qiita.com/fukuit/items/7fe137ac07654556cf87)
- [Pythonで画像処理(その2)](http://qiita.com/fukuit/items/0567f4a495ab78548e3b)

OpenCVを使って2値化するところは、OpenCVのドキュメントをそのまんま、[Pythonで画像処理(その1)](http://qiita.com/fukuit/items/7fe137ac07654556cf87)で書いたのだけれど、「2値化」ではなく、「2値化する際の閾値を求めて、その閾値以下の画素を切り捨てて表示する」とか、そんなことをやってみる。

# 画像の2値化

lennaの画像を2値下する。

```Python
import cv2

lenna = "4.2.04.tiff"

orig = cv2.imread(lenna, 0)
img = cv2.medianBlur(orig, 5)
ret,th = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
```

thが2値化された画像で、retが閾値である。

# 閾値以下の画素の切り捨て
単純に考えると、以下のようなコードでできそう。

```Python
height, width = img.shape
for y in range(height):
  for x in range(width):
    if img[y, x] < ret:
      img[y, x] = 0
```

ただし、このコードには問題がある。numpyのarrayにforを適用すると、めっちゃ遅い。

なので、もっと速くできる方法はないか？というと、もちろんある。

```Python
low_idx = img < ret
img[low_idx] = 0
```

これで、画像を比較してみると、こんな感じ。

```Python
from matplotlib import pyplot as plt

plt.subplot(1,3,1)
plt.imshow(orig, cmap='gray'), plt.title('Original')
plt.subplot(1,3,2)
plt.imshow(img, cmap='gray'), plt.title('Threshold')
plt.subplot(1,3,3)
plt.imshow(th, cmap='gray'), plt.title('Binarize')
plt.show()
```

![lenna_20170917.png](https://qiita-image-store.s3.amazonaws.com/0/15553/755d880b-6c87-7f42-7f2d-7fd3c686288f.png "lenna_20170917.png")


----
# 本日のまとめ

2値化するための閾値を求めて、その閾値でカットオフしてみた。

## 本日のコード
- https://github.com/fukuit/Python_SelfLearning/blob/master/binarize_image2.py
QEMU user-mode emulation for ARM

# はじめに
QEMU user-mode emulationの使い方を説明します。
仮想CPUはARMを使います。

# install
QEMU / gcc-arm を installします。

```bash:console
$ sudo apt-get install -y qemu gcc-arm-linux-gnueabi gdb-arm-none-eabi
```

gdb-arm-none-eabiのinstallで以下エラーが出る場合があります。

```
.../gdb-arm-none-eabi_7.6.50.20131218-0ubuntu1+1_amd64.deb を展開する準備をしています ...
gdb-arm-none-eabi (7.6.50.20131218-0ubuntu1+1) を展開しています...
dpkg: アーカイブ /var/cache/apt/archives/gdb-arm-none-eabi_7.6.50.20131218-0ubuntu1+1_amd64.deb の処理中にエラーが発生しました (--unpack):
 '/usr/share/man/man1/gdb.1.gz' を上書きしようとしています。これはパッケージ gdb 7.7.1-0ubuntu5~14.04.3 にも存在します
dpkg-deb: エラー: サブプロセス ペースト がシグナル (Broken pipe) によって強制終了されました
man-db (2.6.7.1-1ubuntu1) のトリガを処理しています ...
処理中にエラーが発生しました:
 /var/cache/apt/archives/gdb-arm-none-eabi_7.6.50.20131218-0ubuntu1+1_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
```

バグのようですが
https://bugs.launchpad.net/ubuntu/+source/gdb-arm-none-eabi/+bug/1320305

以下コマンドで強制的にinstallしてください。

```
$ sudo apt-get -o Dpkg::Options::="--force-overwrite" install gdb-arm-none-eabi
```

# sample code
sample codeをgcc-armでコンパイルして、QEMUで実行します。
ライブラリパスをQEMU_LD_PREFIX or -Lで指定できます。

```bash:console
$ cat test.c 
#include <stdio.h>

int main(int argc, char* argv[])
{
    printf("Hello!\n");
    return 0;
}
$ arm-linux-gnueabi-gcc -g test.c
$ QEMU_LD_PREFIX=/usr/arm-linux-gnueabi qemu-arm a.out
Hello!
$ qemu-arm -L /usr/arm-linux-gnueabi a.out 
Hello!
```

# gdb
gdbを使ってデバッグします。
qemu-armの-gオプションでgdb接続待ちにします。1234はprot numberです。

```bash:console_A
$ qemu-arm -g 1234 -L /usr/arm-linux-gnueabi a.out 
```

.gdbinitを設定します。catを参照ください。
arm用のgdbを起動します。

```bash:console_B
$ cat $HOME/.gdbinit 
set auto-load safe-path ~
set pagination 0
$ cat .gdbinit 
set architecture armv5t
set sysroot /usr/arm-linux-gnueabi
b main
target remote :1234
c
$ arm-none-eabi-gdb ./a.out 
GNU gdb (7.6.50.20131218-0ubuntu1+1) 7.6.50.20131218-cvs
(...)
Reading symbols from ./a.out...done.
The target architecture is assumed to be armv5t
Breakpoint 1 at 0x8454: file test.c, line 5.
warning: A handler for the OS ABI "GNU/Linux" is not built into this configuration
of GDB.  Attempting to continue with the default armv5t settings.

Cannot access memory at address 0x0
0xf67d6d10 in ?? ()

Breakpoint 1, main (argc=1, argv=0xf6fff204) at test.c:5
5	    printf("Hello!\n");
(gdb) 
````

# references
- https://yurovsky.github.io/2016/12/14/qemu-user-mode/
HTML5とHTMLの違い

HTMLはある程度かけるようになったが、HTML5をがっつりと書いたことはない。
そこで、その違いを調べてみた。
HTMLではできなかった動画の埋め込みなど、javascriptを使わないとできなかった事や実現が困難な事が可能になる。
また、要素の定義の見直しが行われ、可読性が上がった。

##使えるタグが増える
- videoタグ
- audioタグ
- canvasタグ
- sectionタグ
- articleタグ
- navタグ
など。

##機能を拡張できる
- requireで必須項目を指定
- placeholderでinput内容を表示
など。

HTML5はHTMLから様々な改善がなされ、私が言うには、HTML5でコーディングするデメリットはない。
しかし、ブラウザの対応状況によっては表示されないことがあるので、注意が必要である。
人工知能界から「重み」という言葉を無くしたい

# はじめに
僕はここ一年ゆっくりと機械学習を独学で勉強している。はじめは日本語で勉強していた。難しい分野なんだと思っていた。英語の方がリソースが多そうだと感じ英語で勉強し始めたら以外にもすらすらと理解できた。別に翻訳している人たちを批判するつもりではないが、少しでも日本語ではやりの人工知能を勉強しやすいようにしたい。活性化関数、最尤推定など難解な言葉がたくさんでくるのは専門的な分野として致し方ないかもしれないが、もう少し容易に理解ができるような訳を考えたい。特に僕が日本語と英語を比べてこれはわからんと思うものは「重み」だ。

# 重みとは
ニューラルネットワーク型の学習モデルでは、基本的な語句である「重み」。これは入力値の重要性を数値化したものであるといえる。重みが大きければ大きいほどその入力値は学習のための特徴に深く関連していると言っても過言ではない。つまりその入力値に対する重みゼロであるならば、その入力値は一切考慮されない。一つの画像のこれは人の顔かどうかを認識するのに、画像の端っこにある木は判断材料にならないので、その重みはゼロになり、考慮されないというわけだ。これは脳のニューロンとニューロンとの繋がりの強さを表すためのものだ。

# Weight
「重み」は「Weight」の訳である。非常に直接的な訳である。重みとはで説明したとおり、重みは入力値の重要性、貢献度を表す意味がある。実際に、日本語の「重み」または英語の「Weight」は大切さ、価値、重要性を表す意味がある。（実際、ゾロがアーロン戦で「剣の重さ」についてタコに説いている。）だが、「重み」と言われてすぐに価値の方の意味を思い浮かべる人はあまりいないだろう（タコもそうであった）。実際、英語圏の人でも「Weight」といわれて大切さと解釈する人も滅多にいないが、僕の感覚で恐縮だが比較的、重要性の意味には「重み」よりも近い気がする。「重み」という訳を廃止したい理由はそれだけではない。問題は動詞にある。英語ではWeightはそのまま動詞として使用でき、機械学習で頻繁に出てくる「入力値 × 重み」の概念を「Weighted input」と非常にすっきり且つ感覚的にもついていける言葉になるが、これを日本語に訳すと「重み付けられた入力値」になり少し思考を巡らせないと理解ができない。僕はこれは概念の実際の意味を表せてないと考える。

# 評価
そこでどのような言葉がいいか考えたが、「Weight」は「評価」または「評価値」と訳すのが一番ではないだろうか。評価という言葉には「Weight」と同じように「評価する」と動詞にしても非常に自然である。「評価された入力値」も「重み付けられた入力値」と比べ非常に本質的な言葉の意味をついていると思う。

いかがでしょうか、僕はこれから記事を書くときや英語を訳すときは「重み」の代わりに「評価」を使っていくつまりです。
ぜひみなさんの意見を教えて下さい。
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 第三章 モデルと実装を結びつける5

# 実践的モデラ
> ソフトウェア開発は、すべてが設計なのだ。

これがすべて。

なぜかということをエヴァンス本人の体験を元に書かれていました。

プロジェクトは、エヴァンスがモデラとして加入するものの、実装は別部隊がしていたというもの。
結果、モデルは利用されることがなかったといいます。理由は２つ。

> - モデルがもたらす全体的な効果は、**詳細の影響を非常に受けやすい**(第一部 第三章より)
> - モデルが実装や技術と相互作用したことで生じるフィードバックを、直接得られなかった(第一部 第三章より)

モデルを実装するとき、詳細を実装するに従って、モデルも変更する必要が出てきた経験は何度もあります。というか、毎回そうですね。
そもそも、モデルを作成したら、そのまま詳細を実装できるようなら「[モデル駆動設計](http://qiita.com/YasuhiroKimesawa/items/abbedb94f77da2d1bf07)」で言っていたような反復をする必要はないですよね。

だから、

- コードを作成する人々がモデルに責任を持つ
- アプリケーションのためにモデルを機能させる方法を理解する
- コードを変更するとモデルも変わることを、開発者が認識する
- モデラも実装する
- プログラマはモデラでもある
- すべての開発者は、モデルに関する議論にいずれかの段階で参加して、ドメインエキスパートと話をしなければならない

ということを意識しなければいけませんね。

モデラも実装する必要があり、プログラマもモデラであるなら、プログラマとモデラを厳密に分けてはいけないとうことがわかります。

モデルと実装は分けられないので、モデラとプログラマも厳密には分けられない。