OmniAICreator/Qiita-1.07M huggingface dataset:
ガベージコレクションはこうすれば理解できる

**プログラミングとは、すなわちメモリリークとの闘いのことである**と言えます。

メモリリークのないコンテンツを作るためにはメモリ管理の仕組みを理解することが重要です。今回は、代表的なメモリ管理システム「ガベージコレクション」がどんな働きをしているのかを視覚的に見てみましょう。
なお、本記事はActionScript 3.0用のものですが、ガベージコレクションを採用している他プログラミング言語にも参考になる話です。

#そもそもガベージコレクションって？
ガベージコレクションは、不要になったメモリ領域を自動的に解放する機能です。たとえばAS3であるインスタンスを作ったとしましょう。

```as3:ActionScript3.0
var mySprite:Sprite = new Sprite();
```

この時、メモリ上にインスタンス用の領域が確保され、メインのクラスから参照された状態となります。
次に、この参照を解除してみます。

```as3:ActionScript3.0
mySprite = null;
```

インスタンスはどこからも参照されなくなりました。この状態の時、**しばらくするとインスタンス用のメモリは自動的に開放されます。この破棄を行うのが「ガベージコレクション」という仕組み**です。AS3以外にもJavaScriptやJava等、多くの言語で採用されているメモリ管理システムです。

#ガベージコレクションの働きぶりを見てみよう
ガベージコレクションは自動的に実行されるますが、AIRアプリやデバッグ用に強制的に実行させることができます。

```as3:ActionScript3.0
// ガベージコレクションを強制的に実行
System.gc();
```

この処理が実際に実行されると、本当にメモリが開放されるのでしょうか？ それを確認するために下記のようなAS3のコードを作成しました。

1. Spriteクラスのインスタンスを作成
2. mySpriteで参照
3. 直後に参照を解除
4. 10秒後にガベージコレクションを強制的に実行（メモリが開放されていることを期待）

```as3:ActionScript3.0
package
{
	import flash.display.Sprite;
	import flash.events.TimerEvent;
	import flash.system.System;
	import flash.utils.Timer;
	
	public class Main extends Sprite
	{
		public function Main()
		{
			// 1. Spriteのインスタンスを作成 2. MainクラスからmySpriteで参照
			var mySprite:Sprite = new Sprite();
			trace(mySprite);
			
			// 3.Mainクラスからの参照を削除
			mySprite = null;
			trace(mySprite);
			
			// 4. 10秒後にガベージコレクションを強制的に実行
			var timer:Timer = new Timer(10000, 1);
			timer.start();
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, function(event:TimerEvent):void {
				// ☆ガベージコレクションを強制的に実行
				trace("ガベージコレクションを強制的に実行");
				System.gc();
			});
		}
		
	}
}
```

4の部分でメモリが開放されているかを確認するには、[Adobe Scout](https://www.adobe.com/jp/joc/gaming/scout.html)を使います。

![Adobe Scoutで見るガベージコレクション](https://qiita-image-store.s3.amazonaws.com/0/67884/d1801fa0-4b01-a94e-d714-99bea08b9a09.png "スクリーンショット 2015-12-18 19.14.05.png@1x.png")

①の部分に注目してください。ガベージコレクションが強制的に実行されたタイミング（ソースコードで言う☆部分）のフレームにおける、処理の所要時間とメモリの変化を示しています。期待通りメモリが減っている（= mySpriteのメモリが解放されている）ことが見て取れます。また、②の部分で処理内容の正体がガベージコレクションだとわかります。

# 最後に

ガベージコレクションはイメージしにくいものなので、理解が難しく感じるかもしれません。しかし今回紹介したようにプロファイリングツールを使えば視覚的に、そして直感的にガベージコレクションの動きを理解できます。
nodejs & expessjs の開発環境設定


# nodejs & expressjs での開発環境設定

nodejsだけでwebアプリケーションを開発するにあたり、expressjsフレームワークが便利だということで環境設定を早速やってみたのですが、ドットインストールさんの方法の中でバージョン違いで引っかかった部分とかがあったのでメモしておきます。

## 公式ページ
- [nodejs](https://nodejs.org/en/)
- [expressjs](http://expressjs.com/en/index.html)
- [npm](https://www.npmjs.com/)

## 環境
- OS: CentOS6
- nodejs: v0.12.7
- expressjs: v4.13.3

## nodejsのインストール

nodejsにもバージョン管理ツールがあるので今回はこちらを使用したインストールを想定します。

- [nvm](https://github.com/creationix/nvm)

インストールは、git clone して、環境設定していきます。
clone後に最新版にcheckoutして、使用しているshellの設定ファイルにnvm.sh実行するようにしておきます。自分はzsh使用しているので.zshrcに追記していきます。

```
$ cd ~
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ cd .nvm
$ git checkout -b `git describe --abbrev=0 --tags`
$ echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.zshrc
$ echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"' >> ~/.zshrc
$ source ~/.zshrc
```

nvmがインストールできたら、nodejsのバージョンを確認して、インストールしていきます。

```
$ nvm ls-remote
$ nvm install v0.12.7
$ nvm ls
$ node --version
```

## expressjsのインストール

expressjsは、nodejsをインストールした際に一緒にインストールされるnodejsのパッケージ管理ツールのnpmを使用してインストールします。

- [npm](https://www.npmjs.com/)

npmでのインストールはオプション指定しない場合は、カレントディレクトリにパッケージをダウンロードします。グローバル環境にインストールしたい時は、" -g "オプションを使用します。
また、expressコマンドを使用するためにexpress-generatorというパッケージも必要なので合わせてインストールします。（旧バージョンでは一緒になっていたみたいです。）
グローバルインストールしたパッケージは、~/.npm配下にダウンロードされます。

```
$ npm install -g express
$ npm install -g express-generator
$ express --version
```

## expressjsの雛形を作る

expressjsもインストールできたところで雛形をexpressコマンドを使用して作ります。
適当なディレクトリを作ってコマンドを実行するだけで雛形を作ってくれます。

```
$ mkdir work
$ cd work
$ express samlpe_app

   create : sample_app
   create : sample_app/package.json
   create : sample_app/app.js
   create : sample_app/public
   create : sample_app/public/javascripts
   create : sample_app/public/images
   create : sample_app/public/stylesheets
   create : sample_app/public/stylesheets/style.css
   create : sample_app/routes
   create : sample_app/routes/index.js
   create : sample_app/routes/users.js
   create : sample_app/views
   create : sample_app/views/index.jade
   create : sample_app/views/layout.jade
   create : sample_app/views/error.jade
   create : sample_app/bin
   create : sample_app/bin/www

   install dependencies:
     $ cd sample_app && npm install

   run the app:
     $ DEBUG=sample_app:* npm start

$ 
```

出力結果にも記載がありますが、expressで作った雛形の依存パッケージをインストールする必要があるため、出来上がったアプリケーションディレクトリ配下でパッケージをインストールします。インストールされるパッケージは、package.jsに定義されています。

```
$ cd sample_app
$ npm install
```

## アプリケーション起動
パッケージもインストールできたところでいよいよアプリケーションの起動です。
npm startしてね。と記載がありますが、これはpackage.jsのscriptsオブジェクトで定義されているファイルをnodejsで実行します。デフォルトでは、$APP_HOME/bin/wwwが指定されています。なので、下記でも実行できます。

```
$ npm start
```

または

```
$ node ./bin/www
```

## アクセスしてみる

デフォルトでは、3000番ポートでListenしているので、下記でアクセスできます。

```
http://localhost:3000/
```

あとは雛形を元にアプリケーション拡張していくようになります。

自分はJavaScript初心者のため、雛形のコードを読んで、どのように動くかを学習しようと思います。良い学習ページ、書籍がありましたらコメントいただけると嬉しいです。
BitVisorをネットワークブートする

# BitVisorの改造って大変じゃないですか？

BitVisorを改造して何か機能を付け加えたいというとき、問題になるのがテスト用環境です。
まずいコードを書くとBitVisorがクラッシュするということも珍しくないので、BitVisorのビルド用環境とテスト用環境のPCは別々にしたいと思うはずです。
(一緒のPCでやっているという人を見かけますが、突然のクラッシュでファイルシステムが飛ぶ可能性があるので怖いです…)

# ネットワークブートを使いたいけど

BitVisorのビルド用環境のPCとテスト用環境のPCを一緒のネットワークに置いて、ネットワークブートで`bitvisor.elf`を持ってきて起動すれば解決するじゃない、って思う人が居ると思います。
しかしこれには問題があって、ネットワークブートに使われるPXEはDHCPサーバの設定を変更したり、TFTPサーバを構築したりする(これがLinuxだと割と面倒)必要があり、手間がかかります。

# そこで iPXE！

[iPXE](http://ipxe.org)はOSSのPXE実装の一つで、以下の機能をサポートしています。

- DHCPによるIPアドレスの取得
- DNSによる名前解決
- HTTPを使用したブートイメージの取得
- 対話型インターフェース
- スクリプトによる自動化
など

# iPXEを使ってBitVisorのネットワークブート環境を作る

ここではGRUB 2からチェーンロードする形をとります。
`/boot`は専用のパーティションがあるとします。`/`と共用の場合は適宜変更してください。

## テスト用環境の準備

iPXEにはいくつかのタイプがあり、GRUB 2で使用できるのはLinuxカーネル形式版のバイナリ(`ipxe.lkrn`)です。

`ipxe.lkrn`は[Arch Linuxのネットワークブートのページ](https://releng.archlinux.org/pxeboot/)から拾えたりします。
参考に、Gentoo Linuxにおいての`ipxe.lkrn`のemergeコマンドを書いておきます。

```
# USE=lkrn emerge sys-firmware/ipxe
(/usr/share/ipxe/ipxe.lkrn にできるようです)
```

`ipxe.lkrn`を準備できたら、テスト用環境の`/boot`に配置します。

次に、iPXEに読み込ませるスクリプトを用意します。
initrdとしてiPXEに読み込ませることで、自動化が可能です。

以下の内容を`bitvisor.cfg`として保存し、テスト用環境の`/boot`に配置します。

```sh:bitvisor.cfg
#!ipxe

dhcp && kernel http://(ビルド用環境のIPアドレス):8080/bitvisor.elf && boot
```

最後に、テスト用環境の`grub.cfg`にiPXEのmenuentryを追加します。

```grub:grub.cfg
menuentry 'BitVisor (iPXE)' {
  set root='(/bootパーティションへのパス)'
  linux16 /ipxe.lkrn
  initrd16 /bitvisor.cfg
}
```

## ビルド用環境の準備

わざわざHTTPサーバを準備するのは面倒なので、ここではシェルスクリプトとnetcatを組み合わせたHTTPサーバもどきで対応します。
(netcatは別途導入しておいてください)
以下の内容を`deploy.sh`として`bitvisor.elf`があるディレクトリへ配置します。

```sh:deploy.sh
#!/bin/sh

trap exit INT

while true
do
( echo "HTTP/1.0 200 OK"
  echo -n "Content-Length: "
  wc -c bitvisor.elf | while read a b
  do
    echo $a
  done
  echo
  cat bitvisor.elf
  echo OK > /dev/stderr
) | nc -l -p 8080
done
```

動作としては、どんなHTTPリクエストに対しても

- `wc`コマンドで`bitvisor.elf`のサイズを取得し出力
- その後`bitvisor.elf`の中身を出力

の動作を行うようなスクリプトをパイプでnetcatに流しこんで`8080/tcp`としてlistenしているだけです。

これだと`bitvisor.elf`のサイズが変わるたびに再度実行する必要があるので、もっとモダンな仕組みを使って書いても良いかもしれません(RubyのWEBrickとか)

## 完了！

ここまでできれば、BitVisorのiPXEを使ったネットワークブートの環境が整います。
ビルド用環境で`deploy.sh`を実行し、テスト用環境でBitVisor (iPXE)の項目を選ぶことでDHCPサーバ経由で自動でIPv4アドレスを取得し、指定されたHTTPサーバから`bitvisor.elf`をダウンロードしてブートしてくれます。
ローカル開発環境の構築

#概要
仮想環境（VirtualBox）上に仮想マシンを立ち上げる

#環境
**ホストマシン**
Mac OSX
VirtualBox
vagrant

**ゲストマシン**
CentOS7.0

#コマンド#
以下、Terminalでの手順となる．

##VagrantでCentOSを立ち上げる##

まず、ホームディレクトリに移動し、vagrant用のディレクトリを作成

```lang:コマンド
$ cd
$ mkdir myVagrant
```

myVagrantに移動し、CentOS用ディレクトリを作成

```lang:コマンド
$ cd myVagrant
$ mkdir myCentos
```

myCentosに移動し、vagrantの初期化

```lang:コマンド
$ cd myCentos
$ vagrant init bento/centos-7.1
```

Vagrantfileが作成されるので、エディタで編集

```lang:コマンド
$ emacs Vagrantfile
```

29行目に

```lang:Vagrantfile
\# config.vm.network "private_network, ip:192.168.33.10"
```
と書かれた行があるので、コメントを外す.
これでvagrantの初期化が完了したので、

```lang:コマンド
$ vagrant up
```
と入力し、CentOSを起動する。
ここで、下記のエラーが出る場合は、

・VitualBoxが入っていない。
・VitualBoxとvagrantのバージョンが古い
ことが考えられるので、バージョンを確認すると解決できると思います。

```lang:error
No usable default provider could be found for your system.
Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.
The easiest solution to this message is to install VirtualBox, which
is available for free on all major platforms.
If you believe you already have a provider available, make sure it
is properly installed and configured. You can see more details about
why a particular provider isn't working by forcing usage with
`vagrant up --provider=PROVIDER`, which should give you a more specific
error message for that particular provider.
```

vagrant upが成功すると、CentOSのダウンロード・起動が行われ。
ローカル開発環境の構築が成功する。
JSでカーニングエンジンを作ってみる 1回目


### 目的
「HTMLのカーニングはどうしようもない」というのが一般的だとおもいますが、日頃からグラフィックデザイナー陣からの不満の声もあり、社内で利用するものを用意することになりました。

### ゴール
この記事だけでは完結しないので、まずはどれぐらいのものが実現できるか探っていきます。

### 実装方法
単純に思いつくやり方は、テキストを全てspanタグでコーディングしletter-spacingとmarginで調整していくやり方かと思います。今回もこれでやります。
カーニングテーブルにカーニング値を持たせ、前後の文字を判定する。このテーブルはフォントごとに必要となります。今回のフォントはヒラギノで実験します。

### 注意
パフォーマンスチューニングはしばらくやりません。実現度を探る方向で進めます。
コードも殴り書きです...すみません。


### テキストをspanで囲む
実際に使う場合は、HTMLからテキストを抜き取り、span入りのもので置き換える作業が発生しますが、とりあえずはすでにテキストを抜き取ったという前提から恥じます。

文字詰めするサンプルテキスト (qiitaトップから適当にとりました)

```js
var str = "「プログラミングち知識」を共有しよう。SPA開発（OnsenUI）でちょっとだけ可読性を意識する!";
```

&lt;span&gt;タグで囲む処理

```js
function wrapSpan(str){
  var array = str.split('');
  var output = "";
  for(var i = 0; i < array.length; ++i){
     var c = array[i];
     output += '<span>' + c + "</span>";
  }
  return output;
}
```

### 文字のカーニングテーブルを作る

適当にカーニングする対象に値を設定します。サンプルなので適当にピックアップしました。

```js
var kerningTable = {
    '「' : '0.5em',
    'プ' : 0,
    'ロ' : 0,
    'グ' : 0,
    'ラ' : 0,
    'ミ' : 0,
    '知' : 0,
    '識' : 0,
    '」' : '-0.5em',
    'を' : 0,
    '共' : 0,
    '有' : 0,
    'し' : 0,
    'よ' : 0,
    'う' : 0,
    'S' : 0,
    'P' : 0,
    'A' : 0,
    '開' : 0,
    '発' : '-0.1em',
    '（' : 0,
    'O' : 0,
    's' : 0,
    'e' : 0,
    'n' : 0,
    'U' : 0,
    'I' : 0,
    '）' : '-0.5em',
    'で': 0,
    'ち' : '-0.1em',
    'ょ' : 0,
    'っ' : 0,
    'と' : 0,
    'だ' : 0,
    'け' : 0,
    '可' : 0,
    '読' : 0,
    '性' : 0,
    '意' : 0,
    'る' : 0,
    '!' : 0
};
```

### 行頭のカーニング

とりあえず、行頭の"「"用の処理を追加します。


```javascript
for(var i = 0; i < array.length; ++i){
    var c = array[i];
    var value = kerningTable[c];

    var style = "letter-spacing: " + value + '; ';
    if( i == 0 && c == '「' ){
        style += 'margin: -0.5em'
    }
    output += '<span style="'+ style +'">' + c + "</span>";
}

```


ここまでで一旦HTMLを出力してみます。

```javascript
var html = wrapSpan(str);
document.write('<h1>'+html+'</h1>');
```

ブラウザで確認すると

カーニング前

![スクリーンショット 2015-12-18 19.18.27.png](https://qiita-image-store.s3.amazonaws.com/0/15535/70274ac4-03bf-d097-71b8-add4de180bb9.png "スクリーンショット 2015-12-18 19.18.27.png")



カーニング後
![スクリーンショット 2015-12-18 19.17.19.png](https://qiita-image-store.s3.amazonaws.com/0/15535/b203a70e-980d-0e5c-8e0e-18e94e242d44.png "スクリーンショット 2015-12-18 19.17.19.png")


十分利用できそうですね。今回の実装では特定の文字の後ろを詰めるだけでした。
どの文字の場合も同じ詰まり方をします。その辺りの実装を次に考えたいと思います。
ubuntu14にpython,numpy,opencv3を入れる

# はじめに
AKAZEを使いたかったのでopencv3を入れてみました。
pyenvでpython2.7.10をインストールしてあります。
以下2.7.10となっているところは自分のバージョンに変えてください。


# numpy

必要そうなものを片っぱしからインストール

```bash
$ sudo apt-get -y install libopencv-dev build-essential cmake git libgtk2.0-dev pkg-config python-dev python-numpy libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff4-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev libtbb-dev libqt4-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils unzip
```

権限がないと怒られたので以下

```bash
$ sudo chmod -R 777 /home/ubuntu/.pyenv/versions/2.7.10/lib/python2.7/site-packages/
```
numpy1.8を入れたかったので
numpyのバージョンを指定してインストール

```bash
$ pip install numpy==1.8
```

# opencv
pythonのバージョンをsystemに戻しておく。
戻さないでインストールしてさんざん苦しみました。
後に出てくるcv2.soがどう頑張っても見つからなくなります。

```bash
$ pyenv global system
```

opencv3インストール

```bash
$ mkdir opencv
$ cd opencv
$ wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/3.0.0/opencv-3.0.0.zip
$ unzip opencv-3.0.0.zip
$ cd opencv-3.0.0/
$ mkdir build
$ cd build
$ make -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_opencv_java=OFF -D WITH_IPP=OFF -D WITH_1394=OFF -D WITH_FFMPEG=OFF -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_DOCS=OFF -D BUILD_opencv_python2=ON -D BUILD_opencv_python3=ON -D BUILD_opencv_video=OFF -D BUILD_opencv_videoio=OFF -D BUILD_opencv_videostab=OFF -D PYTHON_EXECUTABLE=$(which python) ..
$ make
$ sudo make install
```
これでcv2.soというものがどこかに入っているはずです。

```bash
$ sudo find / -name cv2.so
```
見つかったものをpythonが読み込めるようにコピーしてあげます。

```bash
$ sudo cp /home/ubuntu/opencv/opencv-3.0.0/build/lib/cv2.so /home/ubuntu/.pyenv/versions/2.7.10/lib/python2.7/site-packages/
```

pythonのバージョンを元に戻します。

```bash
$ pyenv global 2.7.10
```

cv2をimportできるか確かめます。

```bash
$ python
>> import cv2
```
エラーが出なければ成功です。
私が機械学習研究をするときのコード・データ管理方法

# はじめに

Gunosy Advent Calender 6日目を担当します，Gunosyの関と申します．
Gunosyではデータ分析部に所属し記事配信ロジックの開発やログ解析によるユーザ行動分析を主に担当しております．
また博士後期課程に在籍しておりウェブマイニングを中心とした機械学習応用の研究の取り組んでおります．
本エントリではソフトウェアエンジニアとして働く過程で身につけた開発手法を，
自分なりに研究活動に活用しながら得たコード管理に関するノウハウを公開するものです．

研究者向けのコーディング技術については各研究室で伝承されているノウハウはあるものの，
まとまった資料やそれに伴う議論などは少ないのが現状であると考えております．
そしてその研究室でのノウハウもエンジニアとしての経験の少ない学生や研究者によって作られたノウハウであり，
近年急速に進歩しているソフトウェア開発ノウハウに対して非常に遅れているといえます．

東北大学岡崎先生の[研究者流コーディングの極意](http://www.chokkan.org/publication/coding-for-researchers.pdf)は数少ない資料の一つです．
上記資料でも述べられていますが，研究とソフトウェア開発では目的が大きく異なるため，
ソフトウェア開発で良いとされている慣習がそのまま当てはまるわけではありませんが，
研究の目的に転用可能なノウハウは非常に多いです．

私はまだ研究者としてもエンジニアとしても未熟であるためこれが正解というわけではありませんが，
これをきっかけに様々なノウハウの公開や議論が起これば非常に有益かなと考えて今回このようなエントリを公開させて頂きました．
(研究者同士でプログラムのディレクトリ構成や、バージョン管理，実験結果の管理方法などのノウハウ共有会なんてやれたら楽しそうですね)

# 機械学習研究における要件

研究を行う上で最も重要になるのは，実験結果が正確であることであると私は考えます．
提案手法を正確に実装することはもちろん大事ですが、それ以外にも担保すべき項目は多いです。

- 実験に用いたデータが意図したとおりに収集されており，再実験可能なように保管されている
- 前処理済みデータに対して処理を行ったコードが特定可能であり，元データから同様な前処理済みデータを再現することができる
- 実験結果がどのコードでどのようなパラメータから生成されたか特定可能であり，その実験結果を再現することが可能である

一見当然のことのように思えるかもしれませんが，研究というのは試行錯誤の連続であり，
試行錯誤の過程においてこれらの情報が損失してしまう状況を私は数多く見て体験してきました。
読んでいる方にも心当たりがある人もいらっしゃると思います。


# 元データを保つ

実験に用いる元データは改変不可能になっていることが大前提です。
しかし上書きされてしまうことなどが生じます
そのため以下のようなルールを敷いています。

- 大元となるデータをS3に管理する
    - データ例
        - Tweetデータ
        - サイトをクロールしてきたデータ
        - 研究の過程でいただいてきたデータ
    - 実験の際はデータを期間で区切ることが多いので、その方法に応じてディレクトリを切っておく
        - クロールデータなど、随時増えていく場合も一貫性を保つことができる
        - 見るタイミングによって参照した元データが増えていたなんてことは辛い
- 実験に使うデータを大元のデータから切り出して圧縮し保存する
    - 概要を記載しておく
    - 目的, データソース, 期間などを書いておく


```
tweets/
    2015/
        01/
            01/
               tweet-001.gz
               ...
            ...
        02/
        ...
    2014/
    ...
```

```
projects/
    20151101_{project_name}/
        data.gz
        readme.txt
   ...
```

# 前処理済みデータを管理する

機械学習研究では元データに前処理をかけることはよくあります。
ここで重要なことは前処理をする際に用いたデータ, 用いたコード, 出力されたコードが定まっていることです。
そのため私は生成されたファイル名とコミットIDをログとして書き出しています。
そしてファイルが上書きされないように生成の時刻を付与しています
これによりコードがコミットさえされていれば，あとからどのコードから生成されたかを追跡することが可能になります

ちなみに現在のコミットIDはこんなワンライナーで取れます

```bash
$ git rev-parse HEAD
```

# 実験結果を管理する

実験結果についても用いたデータ, パラメータ, コード, それによって得られた結果が一意に定まるようにする必要があります。
こちらでも同様に用いたデータのファイル名, コミットID, 実行時の引数, 出力結果のファイル名とします

# その他気をつけていることや考えていること

- 実行する前に絶対コミットする
- データベースなどはあまり用いない。
    - MySQLとかはどれから生成されたかわからなくなったり、誤って上書きしたりする
    - SQLiteなどにすればデータとして管理できるのでよい
- 実験結果とかはGithubのIssueにAPI経由でPostしたり, Evernoteに登録したりしたいなと思っている
    - gitにコミットするのもありかなとは思いつつ、閲覧したいから微妙かなとも思っている
- 環境構築をDockerなりVagrantなりで仮想化しておきたい
- TexをコンパイルするAPIが欲しい
Proc#parameters を利用した Hash の拡張が便利

# 概要

[Little Things: Introspecting Block Parameters](http://weblog.jamisbuck.org/2015/12/12/little-things-proc-parameters.html) という記事で紹介されていた Hash の拡張がエレガントでかつ便利だったのでご紹介します。

# 利用方法

まず、以下のコードを実行して Hash#using を実装します。
(少し改変していますが、上のリンクに記載されているコードと内容は同じです。)

```rb
class Hash
  include(
    Module.new do
      def using(&block)
        values = block.parameters.map { |_, name| self[name] }

        block.call(*values)
      end
    end
  )
end
```

次に、実際に Hash#using を使ったコードを実行してみます。

```rb
students = [{ name: 'ヒロ', from: '山形県', room: 101 }, { name: '沙英', room: 102 }]

students.each do |student|
  description = student.using do |name, from, room|
    "#{name}の出身地は#{from || '不明'}です。ひだまり荘の #{room} 号室に住んでいます。"
  end
  
  puts(description)
end
```
```
ヒロの出身地は山形県です。ひだまり荘の 101 号室に住んでいます。
沙英の出身地は不明です。ひだまり荘の 102 号室に住んでいます。
```

このように Hash が持つ情報を使った処理をサクッと実装したい時に使えると思います。

普段、例えば Struct を使って、

```rb
Student = Struct.new(:name, :from, :room) do
  def description
    "#{name}の出身地は#{from || '不明'}です。ひだまり荘の #{room} 号室に住んでいます。"
  end
end

students = [{ name: 'ヒロ', from: '山形県', room: 101 }, { name: '沙英', room: 102 }]

students.each do |student|
  arguments = student.values_at(*Student.members) # ["ヒロ", "山形県", 101] or ["沙英", nil, 102]
  description = Student.new(*arguments).description

  puts(description)
end
```

と書いていたのを Hash だけで書けるようになるので便利だなと感じました。

# Proc#parameters について

[Proc#parameters](http://docs.ruby-lang.org/ja/2.2.0/class/Proc.html#I_PARAMETERS) は Proc オブジェクトの引数を返すメソッドです。

```rb
procedure = lambda { |yuno, miyako = '宮ちゃん', *others| }
procedure.parameters #=> [[:req, :yuno], [:opt, :miyako], [:rest, :others]]
```

このように引数名を取得できるので、上で紹介した手法は引数名を Hash の key と一致させることで実現していたのですね。この引数名をうまく使ったトリックが目から鱗でエレガントに感じました。

# 参考

* [Little Things: Introspecting Block Parameters](http://weblog.jamisbuck.org/2015/12/12/little-things-proc-parameters.html)
* [Proc#parameters](http://docs.ruby-lang.org/ja/2.2.0/class/Proc.html#I_PARAMETERS)
PHPUnitで例外が投げられてるかを確認するテストの書き方


```
	public function testDeleteFail() {
		// 例外が起きるようにモックを設定
		$BlogEntryMock = $this->getMockForModel('Blogs.BlogEntry', ['deleteAll']);
		$BlogEntryMock->expects($this->once())
			->method('deleteAll')
			->will($this->returnValue(false));

		// 例外のテスト
		$this->setExpectedException('InternalErrorException');
		$BlogEntryMock->deleteEntryByKey(1);
	}
```



# setExpectedException()が廃止予定(2018/07/15追記)

参考 https://github.com/NetCommons3/NetCommons3/issues/1212

PHPUnit的には ```expectException()``` 使ってねってことみたいだけど、NetCommons3でも採用されてる CakePHP2だと同名のメソッドがあって、そっちも廃止予定のdeprecated…

代替え手段としては ``` expectExceptionCode() ``` か ``` expectExceptionMessage()``` あたりですかね。
Gitでマージ済みのローカルブランチを一括削除する

# はじめに
ローカルのブランチは定期的に消さないと溜まっていくがいちいち消すのめんどくさい。
一括削除したい。

# コマンド
```bash
$ git branch | egrep -v '\*|master' | xargs git branch -d
```
※masterと今いるブランチは消さないようにしています。


## 補足

・他にも消したくないブランチがある場合は以下のようにします。（この例ではstagingブランチも消さないようにしています。）

```bash
$ git branch | egrep -v '\*|staging|master' | xargs git branch -d
```


・マージ済みかどうかに関わらず一括削除

```bash
$ git branch | egrep -v '\*|master' | xargs git branch -D
```

毎回コマンドを打つのは面倒なのでalias作っとくと便利です
制御がかかっていてURLアクセスできないときのAPI確認方法　curlコマンド

アクセス制限などがかかっていて、

直接APIをたたいて、APIの結果を確認できないときは、curlコマンドでファイルを出力できる。

curl http://api.～～～～～.net/～～～　> ～～～.html

curl http://api.～～～～～.net/～～～　> ～～～.csv

など
gopkg.in絡みで困ることになる・・・のかもしれない？？

# gopkg.in便利ね

[gopkg.in](http://labix.org/gopkg.in)便利なんですが、何かのトラブルの種になっている気配があるので起稿。

**詳細については未調査につき、何らかの他の要因によるかもしれません**

* * *

# 事象1: version違いのimport

```A/alpha.go
package A

import "gopkg.in/foo/bar.v2"
```

```B/bravo.go
package B

import "gopkg.in/foo/bar.v1"
```

みたいなことが起きる。

1. 最初は`"gopkg.in/foo/bar.v1"`で開発していた
2. 開発メンバーはあまり意識せず`go get ./...`で関連パッケージ`"gopkg.in/foo/bar.v1"`を手に入れている。
3. 途中で`"gopkg.in/foo/bar.v2"`を使うように更新した。
4. 誰かが、`A/alpha.go` をコピーして、`B/bravo.go`を作ろう！と考える。
5. B/bravo.goを保存したタイミングで、goimportが走ってimport先が自動で`"gopkg.in/foo/bar.v1"`になってしまう。

# 事象2: CIが怒り出す。

「"github.com/hoge/piyo.xXXXX"なんて無いんですけど！」と怒られる。
一見、事象1のパッケージとは関係なさそうなところで起きる。
`$GOPATH/src/github.com/hoge/piyo` を見に行くけど、問題なさそう。
`go get ./...` とすると、やっぱり「"github.com/hoge/piyo.xXXXX"なんて無いんですけど！」と怒られる。

先述の事象1の状態を解消（`B/bravo.go`のimportを`"gopkg.in/foo/bar.v2"`に更新）したら、直った。

# 原因は調査中。

原因の根幹は未解明。

gopkgのバージョン番号がv1,v2という風に昇順な上に、goimportが若い番号のものを自動で割り当ててしまうことに原因がある・・・のかも。
同名のpackageが、違うURLで存在する場合に何らかの問題が起きる？？？

とりあえず一旦記事に起こしておく。
Go言語で実現するフォースの覚醒 (Gobotで脳波をなんとかする)

これは[学生エンジニア Advent Calendar](http://www.adventar.org/calendars/1158l)18日目の記事です．
『スターウォーズ フォースの覚醒』公開日ということで，Goを使ってフォースに目覚めるための方法を紹介します．

## 目覚めた結果

![gopher_eeg.gif](https://qiita-image-store.s3.amazonaws.com/0/100010/f595b29b-612d-598a-bad8-f5e70748ccab.gif)


このような感じで，フォースを利用することで手元のコンピュータを操作できます．

## 必要なもの

Goは入っている前提で

### [Neurosky MindWave Mobile](http://store.neurosky.com/products/mindwave-1) ($99.99)	

Bluetooth接続が可能なシングルチャンネルの脳波計です．公式にて$99.99で買うことができ，また国内でも1万円後半ほどで転売されているものを探すことができます．かなり遊べます．

### [Gobot](http://gobot.io/)

Gobotは，Goでフィジカルコンピューティングを実現するためのフレームワークです．MindWave Mobileだけでなく，Arduino, Leap Motion, Pebbleなど様々な機器に対応しており，シリアルポート制御から値のパースまでよしなに行ってくれる素敵フレームワークです．

MindWave Mobileを使用する今回の場合，公式の通り下記コマンドでインストールすることができます．

```
go get -d -u github.com/hybridgroup/gobot/... && go install github.com/hybridgroup/gobot/platforms/neurosky
```

## サンプル

```go
package main

import (
	"github.com/everdev/mack"
	"github.com/hybridgroup/gobot"
	"github.com/hybridgroup/gobot/platforms/neurosky"
)

func main() {
	const meditationThreshold uint8 = 70

	gbot := gobot.NewGobot()
	adaptor := neurosky.NewNeuroskyAdaptor("neurosky", "/dev/tty.MindWaveMobile-DevA")
	neuro := neurosky.NewNeuroskyDriver(adaptor, "neuro")

	work := func() {
		gobot.On(neuro.Event("meditation"), func(v interface{}) {
			med := v.(uint8)
			if med != 0 && med > meditationThreshold {
				// 以下に任意の操作 今回はAppleScriptでKeynoteスライドおくり
				mack.Tell("Keynote", `show next`)
			}
		})
	}

	robot := gobot.NewRobot("brainBot",
		[]gobot.Connection{adaptor},
		[]gobot.Device{neuro},
		work,
	)

	gbot.AddRobot(robot)
	gbot.Start()
}

```

デモで使用したプログラムがこちらになります．
瞑想度(meditation)の値を一秒間に一度取得し，瞑想度が閾値を超えたらKeynoteスライドを次に送ります．
心身の平穏でフォースの能力を引き出す感じです．ジェダイっぽい．

つまり快適にスライドを操作するためには，自由に心身の平穏を作り出せるよう修行すれば良いのです．
~~手っ取り早く瞑想度を上げたい場合，目をつむると簡単に瞑想度が上がります~~

## 解説

```NewNeuroskyAdaptor(name string, port string)```の第二引数にて，シリアルポートを指定するのですが，自分の環境の場合，MindWaveMobileのポートが```/dev/tty.MindWaveMobile-DevA```でした．お使いのOSに合わせて指定してください．

```work```に定義した関数が，```NewRobot(name string, v ...interface{})```にてデバイスの実行準備完了時に一度だけ呼ばれます．そこで，work内に，各イベントのコールバック登録をガシガシと書いていきます．
コールバックはいくつも登録可能ですが，今回の用途では一つの脳波特徴量で十分なので，サンプルでは一つのみの登録となっています．
今回は，ジェダイの騎士っぽく瞑想度(meditation)をイベントとして利用します. meditationは一秒に一度，瞑想度を0~100の値で取得します．他にも集中度(attention), 脳波生データ(wave)も取得することができます．

動作の流れとして，mediationの値が取得できたら，閾値と比較し，閾値より大であれば任意の動作を行うという流れになっています．
閾値の条件に加えて0でない条件が加わっていますが，これは動作中稀に```mediation = 0```が入ることがあるため，その応急処置です．また，閾値の```mediationThreshold = 70```は完全に自分の環境に合わせた決め打ちなので，環境に合わせてちょうど良さそうな値を入れてください．
精度が気になる方は，脳波生データ(wave)を使って自前で特徴量を抽出してみても良いかもしれません．こちらは512 Hzのサンプリング周波数で脳波生データを取得することができます．

スライドをおくるために使用した```mack.Tell(application string, commands ...string)``` は，GoからAppleScriptを手軽に扱うためのラッパーパッケージです．詳しくは以下URLにて
https://github.com/everdev/mack


## おわりに

Gobotを使うことで，低レベルI/Oを気にすることなく，かなり快適かつ適当に脳波計を扱うことができました．他にもARDroneやArduino，Raspberry Piなどをほぼ同様のインタフェースで扱うことができ，かなり快適にIoTなプログラミングができます．
API実装やCLI実装など，ややインフラ寄りで固い印象のあるGoですが，ゲームプログラミングやモバイルアプリ開発，今回のIoT分野など，色々なジャンルで活躍できそうですね．

では，良いGoライフを！
May the Gopher be with you! ʕ ◔ϖ◔ʔ
How to align center アートボードに対して中央揃えの方法

 [alignment - How to align all objects in the center of your art board using Adobe Illustrator CC? - Graphic Design Stack Exchange](http://graphicdesign.stackexchange.com/questions/38824/how-to-align-all-objects-in-the-center-of-your-art-board-using-adobe-illustrator)

![Screen Shot 2015-12-18 at 5.45.35 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/fef828be-d52c-4b65-f875-0622764b8dd0.png)

右上の方に`Align`があるからそこから
設定がアートボードに対して揃えるようになっているのを確認して、どのように揃えたいかのボタンを押す。

何故か、Windowから個別に出した`Align`はアートボードに対して揃えるようにする設定が見当たらなかった。

![Screen Shot 2015-12-18 at 5.47.30 PM.png](https://qiita-image-store.s3.amazonaws.com/0/27895/41a1ca85-967a-a895-04de-3a2d2e216489.png)
ClojureでBitcoinアドレスを生成する


## 初めに
最近話題のBitcoinですが、いざ仕組みを調べてみようと思うと、非技術者向けの例え話や暗号理論に偏りすぎているものが多くて、なかなか実像を掴みにくいです。
そこで、この記事では1つ1つコードで実装しながら段階を踏んで、実際に使用できるBitcoinアドレスを生成していきます。

## 生成アルゴリズム
![bcadd.png](https://qiita-image-store.s3.amazonaws.com/0/34193/3a692cfb-4d33-bc87-c37b-0e8f1f6850dd.png)

## 準備
### 鍵の生成
まずは、[ECDSA sample](https://kjur.github.io/jsrsasign/sample-ecdsa.html)で鍵のペアを生成します。このとき、curveはsecpk1-256を選んでください。
また、クライアントサイドで生成しているとのことなので、秘密鍵の流出については大丈夫かと思われますが、心配な方はopensslでローカルで生成してください。

### 関数の準備
byte列を扱う上で、必要となる関数を先に定義しておきます。

```clj
;; "0cab3f...."というbyte列の文字列をbyteのシーケンスに変換
(defn read-byte [x]
  (->> (partition-all 2 x)
    (map (partial apply str))
    (map hex2dec)
    (map byte)))

;; (read-byte "0cab3f")
;; => (12 -85 63)
```

```clj
;; "0cab3f...."というbyte列の文字列をbyte-arrayに変換
(defn read-bytes [x]
  (->> (partition-all 2 x)
    (map (partial apply str))
    (map hex2dec)
    (map byte)
    byte-array))
    
;; (read-bytes "0cab3f")
;; => #object["[B" 0x36519d "[B@36519d"]
```

```clj
(defn hex2dec [x]
  (let [n (Long/parseLong x 16)]
    (if (>= n 128) (- n 256) n)))
```

### 鍵の定義
```clj
(def pubkey "0452fc6e03ce4d2125167a16...")
(def prvkey "02f29aae71872ed03b32b460...")
```

## 生成

### 呼称
これ以降は、SHA256->RIPEMD160をHash160、SHA256->SHA256をHash256とします。
また、Hash #1-2 を主ハッシュ、Hash#2-2をチェックサムと呼びます。

### Hash160
```clj
(require '[pandect.core :as p])

(defn hash160 [value]
  (-> value (p/sha256-bytes) (p/ripemd160)))
```

### Hash256
```clj
(defn hash256 [value]
  (-> value (p/sha256-bytes) (p/sha256)))
```

### base58
```clj
(def base-string "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")

(defn int-to-base58 [num leading-zeros]
  (loop [acc [] n num]
    (if (pos? n)
      (let [s (nth base-string (rem n 58))]
        (recur (cons s acc) (quot n 58)))
      (apply str (concat (repeat leading-zeros (first base-string)) acc)))))

(defn encode [bytes]
  (let [leading-zeros (->> bytes (take-while zero?) count)
        n (java.math.BigInteger. 1 (byte-array bytes))]
    (int-to-base58 n leading-zeros)))
```
参考: [dbasch/base58](https://github.com/dbasch/base58/blob/master/src/base58/core.clj)

### 主ハッシュ
```clj
(defn gen-main-hash [k]
  (str nw-id (hash160 (read-bytes k))))
```

### チェックサム
```clj
(defn gen-checksum [k]
  (->> (hash256 (read-bytes (gen-main-hash k)))
    (take 8)
    (apply str)))
```

### アドレス
```clj
(defn gen-address [k]
  (->> (str (gen-main-hash k) (gen-checksum k))
    read-byte
    encode))
```

### 実際に生成
```clj
(gen-address pubkey)
=> "1MGmkfg9kse2Aribbg2fWGGRGqhVxCFetF"
```

## 検証
生成したアドレスの検証は[BlockExplorer](https://blockexplorer.com)で行います。
https://blockexplorer.com/address/生成したアドレス に飛ぶと、正当なアドレスならトランザクションやQRコードが表示されます。
例: https://blockexplorer.com/address/1MGmkfg9kse2Aribbg2fWGGRGqhVxCFetF

## 参考文献
[bitcoinwiki](https://en.bitcoin.it/wiki/Main_Page)
[Bitcoinを技術的に理解する](http://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222)
[ビットコインの仕組み](http://bitcoin.peryaudo.org/index.html)
[Mastering Bitcoinを読む Chapter4 公開鍵、ビットコインアドレス](http://www.yzono.com/entry/2015/01/18/000000)
[dbasch/base58](https://github.com/dbasch/base58)
PhpStormでmethodを分割する方法

## はじめに
長いメソッドを複数のメソッドに分割する事ってよくありますよね？
引数が多かったりするとなかなか大変だったりしますが、
PhpStormなら簡単にできます！

## Before
こんなメソッドがあるとします。

```php

class Hoge
{
    function a($data)
    {
        $test1 = 'test';
        $test2 = 'test';
        $test3 = 'test';
        foreach ($data as $k => $v) {
            $data[$k]['a'] = $test1;
            $data[$k]['b'] = $test2;
            $data[$k]['c'] = $test3;
        }
        return $data;
    }
}
```

そしてここを別メソッドに切り出したいとします。

```php
        foreach ($data as $k => $v) {
            $data[$k]['a'] = $test1;
            $data[$k]['b'] = $test2;
            $data[$k]['c'] = $test3;
        }
```

## 操作方法
1. 切り出したい箇所を選択
2. 右クリック->Refactor->Extract->Method (alt + command + M)  
<img width="404" alt="Fullscreen_12_18_15__5_12_PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/14929/a1f01730-2197-c76d-1467-c9ae5dfc79bc.png">  
3. メソッド名を入力し、「Refactor」  
<img width="239" alt="Extract_Method_and_Circle_php_-_goalous2_-____repos_goalous2_.png" src="https://qiita-image-store.s3.amazonaws.com/0/14929/99c02d44-df0b-0c45-798b-1da6419327a0.png">

## After

```php

class Hoge
{
    function a($data)
    {
        $test1 = 'test';
        $test2 = 'test';
        $test3 = 'test';
        $data = $this->b($data, $test1, $test2, $test3);
        return $data;
    }

    /**
     * @param $data
     * @param $test1
     * @param $test2
     * @param $test3
     *
     * @return mixed
     */
    public function b($data, $test1, $test2, $test3)
    {
        foreach ($data as $k => $v) {
            $data[$k]['a'] = $test1;
            $data[$k]['b'] = $test2;
            $data[$k]['c'] = $test3;
        }
        return $data;
    }
}
```

## おわりに
PhpStormならリファクタリングがものすごい楽です。
他にもメソッド名の一括変更や引数の順番の変更とか色んな事ができます。
是非使ってみてください。
R Markdown内で他のRmdファイルを読み込む

## この記事の目的
私が大好きなRMarkdownについて、Tipsを集中的に連載しようという思いつきの企画です。あと自分の中で進めている別企画のメモという位置づけでもあります。なので**大した中身はありません**。

### R Markdownとは
Markdown記法をベースに、チャンクという形でRのコードを記述して評価・出力することができるものです。RStudioのクイックリファレンスでは以下のように説明してあります:

> R Markdown is an easy-to-write plain text format for creating dynamic documents and reports. 

## R Markdown、長くなるとやっぱりしんどい
どのようなドキュメントでも、ある程度分量が多くなってしまうとすごく長くなってしまい、修正や確認が大変です。通常ならある程度ファイルを小分けにして合成するという手段を検討したくなるところですね。

## Rチャンクの`child`オプション
R MarkdownのRチャンクには`child`オプションがあります。これを利用すると**他のRmdファイルを自動的に読み込んでくれます**。この機能に関する簡単な説明は、「[第3回　レポつく自由自在～R Markdown基礎文法最速マスター：R Markdownで楽々レポートづくり｜gihyo.jp … 技術評論社](http://gihyo.jp/admin/serial/01/r-markdown/0003?page=3)」をご覧ください。

まず、読み込ませたいファイル(ここではchild.Rmdとします)を作成します(コードチャンク前の\は無視してください)。

```child.Rmd
## ほげほげちゃいるど
\```{r child-01}
knitr::kable(iris(head))
\```
```

これを、親にあたるRmdファイル(okan.Rmd)で読み込みます。以下のようにRチャンクを作成します(コードチャンク前の\はないものと思って下さい)。

```okan.Rmd
(省略)

# 子Rmdの読み込み
\```{r child="child.Rmd"}
\```

(省略)
```
これで`child`オプションを設定した箇所に、`child.Rmd`の内容が読み込まれて組み込まれます。これで簡単に小分けできますね。

## 注意点
ちょっと試していて気になった点をメモします。

### 親Rmdがchildを呼び出すために作るRチャンクの中身について
上の例で、呼び出す時に内容はナシにしています。なお中身を書いているとエラーが出て「`child`オプション使うときは中身を空にしなさい。無視するよ」と怒られます。空っぽにしときましょう。

### Rチャンクのチャンクラベルについて
これは注意が必要で、明示的にチャンクラベルを指定するときは、**両方通じてちゃんと識別されるように別名にする**ようにしてください。

Rmdではチャンクラベルとして名前をつけることができます。ただこれがドキュメント内で被ってしまうと問題が発生します[^1]。実行してなぜかうまくいかない場合は、これを疑ってみるといいかも知れません。

[^1]: もし被っていたらエラーがでてレンダリングされずドキュメントが生成されません。私はよくやってしまいます。

※ 2015/12/24追記

このチャンクラベルの被り問題について、「knitr1.1.0以降ではこれを回避するオプションが実装されている」とのコメントをいただきました。@uri さんありがとうございます。

`knit()`される前に以下のオプションを読み込んでおくと、回避するようになります:

```
options(knitr.duplicate.label = 'allow')
```

これを効率よく当てておくためには、.Rprofileに記述するのが楽ですので、よくやってしまう場合にはご検討ください。

### 子Rmdの内容について
RmdファイルはRStudioで生成すると色々なものが初めから書き込まれています。たとえば冒頭のyaml部分などです。これらについては、**あってもなくても問題ない**です。子Rmdでyamlでテーマとか記述していても、親Rmdのyamlが反映されます。要するにbody要素しか持ってこない、というわけです。

この辺りはどうやっていくかは個人の編集スタイルによるところが大きいので、色々試してみて自分なりに使いやすい方法を探してみてはいかがでしょうか。

Enjoy!
Goで3Dモデル変換してプレビュー

[Go その2 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/go2) の22日目です。

## はじめに
仕事で作ったGoで3Dモデルデータを変換処理するマイクロサービスをGoで書いた話です。

## どんなもの？
 * [Sketchfab](https://sketchfab.com/)みたいに３DモデルファイルをアップロードしてWebGLで描画するものです。
 * OBJやFBX, DAE, 3DS, MA, BLEND, ZIPをアップロードし、Web上で見ることができます
 * 社内のマイクロサービスとして自社内の様々なWebサービスから利用することを想定しています。

例: GitHubで公開されているGopherモデル
[![https://gyazo.com/0ac8db86c8c66ad1b681a97c282bbd44](https://i.gyazo.com/0ac8db86c8c66ad1b681a97c282bbd44.gif)](https://gyazo.com/0ac8db86c8c66ad1b681a97c282bbd44)
<iframe width="640" height="480" src="https://sketchfab.com/models/1bdb57b0d6c04ea585cff6234ba0d324/embed" frameborder="0" allowfullscreen mozallowfullscreen="true" webkitallowfullscreen="true" onmousewheel=""></iframe><p style="font-size: 13px; font-weight: normal; margin: 5px; color: #4A4A4A;">


The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) The gopher 3D model was made by Takuya Ueda (http://u.hinoichi.net). Licensed under the Creative Commons 3.0 Attributions license.




## 作るきっかけ
「制作時に他人の作った3Dモデルをツールを立ちあげなくてもWebでサクッと確認したい」「ツール持ってない人でも確認できるようにしたい」ユーザーのニーズに応えるためです。
似たようなサービスはあるのですが、toB向けじゃなかったりアップロードしてから見れるまで遅かったりで苦しみがありました。
※ UnityWebPlayerでも良いのですが、主要なブラウザでNPAPIが無効化されてしまいます。

プライバシーが担保されて高速な3D変換処理が必要だったわけです。
また、せっかく作るなら、というわけで他のサービスで使えるようにAPIエンドポイントを設定したマイクロサービスにしました。

## 使った技術
 * [go1.5](http://golang-jp.org/) Go
 * [Revel](https://revel.github.io/) GoのMVCフレームワーク
 * [GORM](https://github.com/jinzhu/gorm) GoのORマッパ
 * [three.js](http://threejs.org/) 3DモデルをWebGL表示する
 * [assimp2json](https://github.com/acgessler/assimp2json) 3DファイルをAssimp形式のJSONへ変換する


## やること
1. 3dファイルをアップロードする
2. 3dファイルをAssimpに変換する
3. S3に送る
4. WebGLPlayerで表示

提供API
1. ファイルをアップロードするPOST API
2. 対象ファイルのワンタイムパスを取得するGET API
3. 対象ファイルをロードしたPlayerのiframeを取得するGET API



## 結果
 * アップロードから表示まで10MB程度なら2秒ぐらいで表示できる
 * メモリ使用量15MB〜80MB程度

実際のサービス画面
[![https://gyazo.com/23b143556a11553fafa28e999790f4ac](https://i.gyazo.com/23b143556a11553fafa28e999790f4ac.gif)](https://gyazo.com/23b143556a11553fafa28e999790f4ac)
The Go gopher was designed by Renee French. (http://reneefrench.blogspot.com/) The gopher 3D model was made by Takuya Ueda (http://u.hinoichi.net). Licensed under the Creative Commons 3.0 Attributions license.

## その他
 * zip内にテクスチャ画像があったら貼るようにした。StringユーティリティやZip再帰当たりは自作
 * マイクロサービスするぐらいは1週間でできるが、本体のWebサービス(Rails)に組み込むのに3週間ぐらいかかった。
TreasureDataで対象ユーザーが何回訪問したのかを調べる


[データサイエンティストのためのHiveQL分析クエリテンプレート その６ - トレジャーデータ（Treasure Data）公式ブログ](http://blog-jp.treasuredata.com/entry/2014/05/14/000000)
これの応用例です。

社内ブログで評判が良かったのでこちらにも書きます。
リテンションの指標として

1. 週に何日トップページに来るのか
2. 1日に何セッション（ある一定の連続したアクセスの塊）トップページを訪問しているのか

をTDで調べます。HiveでもPrestoでも行けるはずです。

# 1. あるユーザー群が1周間に何日トップページを見ているか

1. トップページにアクセスしている限定公開ユーザが、11/22-11/29の間にアクセスしたときの、uidとアクセス日を列挙
2. 1. をuidごとにカウントして、各ユーザが何日アクセスしてるかを集計
3. 2. をアクセス日数毎にユーザ数を集計

という流れで処理をしていきます。

```access_days.sql
-- 3. 2.をアクセス日数毎にユーザ数を数える
SELECT access_count, COUNT(uid) AS cnt
FROM
(
  -- 2. 1.をuidごとにカウントして、ユーザ毎に何日アクセスしてるかを数える
  SELECT uid, COUNT(1) AS access_count
  FROM
  (
    -- 1. トップページにアクセスしている対象ユーザが、11/22-11/28の間にアクセスしたときの、uidとアクセス日を列挙
    SELECT uid, TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST') AS access_day
    FROM login
    WHERE TD_TIME_RANGE( time, TD_TIME_ADD('2015-11-29', '-7d'), '2015-11-29', 'JST')
      AND
        uid IN 
          (
            -- 対象のユーザーIDを列挙する or サブクエリを発行する
          )
        AND
          path = '/' -- トップにアクセスしているユーザ
    GROUP BY TD_TIME_FORMAT(time, 'yyyy-MM-dd', 'JST'), uid
  ) access_table
  GROUP BY uid
) t
GROUP BY access_count
ORDER BY access_count DESC
```

# 2. あるテストユーザー群が1日何回トップページに訪問してるか

「1日何回」というのは単純に回数をはかっても意味が無い場合がほとんどです。
なぜなら、ページ遷移でトップページに戻ってくるみたいなこともあるでしょう。そこで、アクセスログの塊をセッション化してそれを"1回訪問"とみなしてカウントしてみましょう。

ポイントは`TD_SESSIONIZE`という便利関数を使って、900秒以上間隔が空いたら別のセッションとみなす（≒違うアクセスと思う）ようにすることです。
ユーザー数が多いとセッション化するところの量が増えてしまうので注意してください。

`TD_SESSIONIZE`を一言で言うと「一連の連続したアクセスの塊に、特定のID（セッションID）を付ける便利機能」と覚えておいてもらえばいいです。

以下の流れで処理を行います。

1. 対象ユーザが11/27にアクセスしたログにセッションIDを振る
2. 1.からトップページをアクセスしたセッションに絞って、ユーザーごとに回数を数える
3. 2.をセッション回数毎にユーザー数を数える


```access_sessions.sql
-- 3. 2.をセッション回数毎にユーザー数を数える
SELECT session_count, COUNT(uid) AS cnt
FROM
(
  -- 2. 1.からトップページをアクセスしたセッションに絞って、ユーザーごとに回数を数える
  SELECT uid, COUNT(session_id) AS session_count
  FROM
  (
    -- 1. 対象ユーザが11/27にアクセスしたログにセッションIDを振る
    SELECT TD_SESSIONIZE(time, 900, unique_id) AS session_id, uid, time, path
    FROM
    (  
       SELECT time, unique_id, uid, time, path
       FROM login
       distribute by unique_id -- Prestoの場合は不要
       sort by unique_id, time
    )
    WHERE TD_TIME_RANGE(time, '2015-11-27', '2015-11-28', 'JST')
      AND
        uid IN 
          (
            --対象のuser id
          )
  ) session_table
  WHERE path = '/' -- アクセスしたページ
  GROUP BY uid
) session_count_table
GROUP BY session_count
ORDER BY session_count DESC
```

# まとめ

`TD_SESSIONIZE`めっちゃべんり！
初めてrails newしたら800万ダウンロードしてた話

この記事は[【その1】ドリコム Advent Calendar 2015 - Adventar](http://www.adventar.org/calendars/1043)の18日目です。  
17日目はikkouさんの[ChatWork をちょっと便利にするブックマークレット](https://ikkou.jp/advent-calendar-2015-drecom/)でした。

# はじめに
社会人1年目の時につくった[DropMusic](http://dropmusic.ignom.jp/)が2周年になったのでその振り返りをしたいと思います。

## 経緯
大学卒業後、株式会社Ignomを立ち上げ、当時は2人という小さな規模でやっていました。2人ともアプリなどの開発は未経験で、周りに頼れるところがなく開発してきたので、その経験をもとに**0からサービスをつくる人向け**に書きます。プログラミングがよくわからないままつくっていたので、苦労したところや失敗、大事にしていたことをピックアップします。

# 技術面
## 社内や外部のgemやライブラリを活用
0からつくると時間がかかってしまうので、先人たちの力を借りるのも一つの手です。例えばプッシュ通知は社内に便利なgemがあることを知らずにつくっていましたが、数百万のトークンに送るとなるとAppleの接続切れなどもありその処理も追加しないといけません。そのような手間も省けるので、そういったライブラリやgemなどにアンテナを張り続けるのも大事です。

### DropMusicで使っているgemやpodを一部紹介
#### pod
- [Mantle](https://github.com/Mantle/Mantle)
 - JSONのデータをオブジェクトとして使えるようにするライブラリです

- [Masonry](https://github.com/SnapKit/Masonry)
 - AutoLayoutをコードで書くときに便利です

- [PromiseKit](https://github.com/mxcl/PromiseKit)
 - 非同期処理の時に利用しています

#### gem
- [Kaminari](https://github.com/amatsuda/kaminari)
 - ランキングなどのデータを1ページずつ返すようにできます

- [Dalli](https://github.com/petergoldstein/dalli)
 - 今聴かれている曲をmemcachedでデータを持っています

- [Sidekiq](https://github.com/mperham/sidekiq/)
 - プッシュ通知の送信やランキングの作成などジョブを処理してくれます

## クライアント側もMVC
アプリはObjective-Cで書いていて、はじめは動けばいいという考えでロジックやビューなどを気にせずつくっていましたが、バージョンアップや改修する際かなり苦労しました。

![obj-c MVC](https://qiita-image-store.s3.amazonaws.com/0/105113/d9892a5f-1159-41af-0720-a8f51be7c224.png)


## ログの扱い
アプリをリリースし初めてアプリランキング無料総合1位になった時、ログが大変なことになっていました。logrotateやrailsの`config.log_level`などの設定があまく、まさかの容量でサーバが死にかけながら年末年始を迎えました。  
ユーザが見るデータなのか、貯め方に問題は無いのかを考えながら設計すればよかったと身にしみて感じました。

# 企画面
## アプリストアランキングに立ち寄る
プログラミングを書きつつもストアランキングの状況を気にするようにしています。競合はどうなのか、トレンドはどんな感じなのかというのを雰囲気レベルで感じて、差別化を図っていきます。

例: [App Annie App Store Stats | iOS Top App Charts Japan - Overall](https://www.appannie.com/apps/ios/top/japan/overall/?device=iphone)  
ちなみに私は社内ツールでランキングが見れるものを使っています。

## アイコン・スクリーンショットは命
少し時間を割いてでもアイコンやスクリーンショットをやり込む価値はあります。アプリの出来がいくら良くても門前払いされては意味がありません。  
スクリーンショットやアイコンを見た時、何か一味違うなと思わせ、足を止めをし出来る限り客寄せをしたいものです。

例えばDropMusicの場合は、そのころ個人的に気になっていた[透明感のあるUI](http://photoshopvip.net/archives/54595)にし、一風変わった感を出しました。たまに[デザインが載っているサイト](https://dribbble.com/)などを見て「おっ」と思ったものを考えてみるといいかもしれません。  
音楽アプリが多くなると、どれも(見た目は)同じとなるので、カスタマイズ性をアピールしたり、他の差別化できる機能を表に出します。

![store ss](https://qiita-image-store.s3.amazonaws.com/0/105113/ec56ebd7-659a-cb82-df98-b74b0f1443ff.png)

## アイディアの評価
サービスのアイディアが日々浮かんでそれをメモしていますが、それが本当に面白いかどうかというのは難しいものです。自分自身がターゲットで最大のユーザであった場合、以下(私生活)の観点からでもみてみたりします。

- そのサービスは、ホーム画面の1枚目に入れるか
 - 親指に近い範囲に置きたくなるようなものか
- 明日も使いたくなるか
- 時間を置いてもそのサービスが頭に残っているか
- あるサービスをみて真似してみたくなったり、新しい技術を使ってみたくなったり、という衝動ではないか
 - 時間があれば勉強目的にもなるのでやっていきたい
- 多少自己中になってもつくっていきたいものか
- 世界や自分へのインパクトはどのくらいか

# 最後に
箇条書きで内容が浅いものになってしまいましたが、良いきっかけとなればと思います。

アドベントカレンダー19日目はohrdevさんの[Elixirを使ってSidekiqを操作する](http://qiita.com/ohr486/items/9db88866786ee8bb89d9)です。
Node.js モジュール追加（Express）

## 概要 ##
前回の続きで Node.js で導入すると便利なモジュールの追加を行い、その導入手順を残します。

## 環境・前提条件 ##
+ OS:Windows 8.1 Pro
+ Node.JS ver.5.3.0 導入済
+ MongoDB ver.3.2.0 導入済
+ Git ver.2.5.0 導入済

### Express モジュール追加 ###
Expressは Node.js で MVC を容易に実現することができるフレームワークになります。
サイトを構築する想定なので Express を導入します。

Node.js のモジュールを追加するには `npm` コマンドを使います。
Node.js command prompt を起動して以下のコマンドを実行します。

```text
> npm -v
3.3.12
```

バージョンが表示されればOKです。

まずは express-genarator を導入します。
`express` コマンドを実行するには express-genarator が必要なので以下のコマンドを実行します。

```text
>npm install express-generator -g

```

※ -g オプションを付けることによって、ローカル端末全体で `express` コマンドが使えるようになる。`npm`コマンドは -g を付けると端末全体、付けないとカレントディレクトリ配下への追加となる。


### MVCサイト構築 ###
express コマンドを使ってサイトの雛形生成からサイトの動作確認まで。

```text
>mkdir c:\dev

>cd c:\dev

>express myapp -e ejs

>cd dev

>npm install

>npm start

```
※`c:\dev` フォルダを生成しその配下で上記のコマンドを実行

サイトの確認
以下のURLにアクセスすると確認ができます。
[http://localhost:3000/](http://localhost:3000/)


### MVCサイト構築拡張 ###
レイアウト機能を使いたいので `ect` モジュールを導入する。

#### ect モジュールの追加 ####

```text
>npm install ect

```

※`c:\dev\myapp`配下でコマンドを実行する。


#### app.js の修正 ####
app.js のソースに以下の修正を加えます。

```js:app.js
var ECT = require('ect');
app.set('view engine', 'ect');
app.engine('ect', ECT({ watch: true, root: __dirname + '/views', ext: '.ect' }).render);
```

#### layout.ect ファイルを生成する。####
index.ejs の内容を元に新規に layout.ect ファイルを生成する。

```php:layout.ect
<!DOCTYPE html>
<html>
  <head>
    <title><%= @title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
  <% content %>
  </body>
</html>
```

#### index.ect の修正 ####
デフォルトのファイルの拡張子を ect に変更し内容を以下のように修正する。

```php:index.ect
<% extend 'layout' %>
<h1><%= @title %></h1>
<p>Welcome to <%= @title %></p>
```

#### error.ect の修正 ####
デフォルトのファイルの拡張子を ect に変更し内容を以下のように修正する。

```php:error.ect
<h1><%= @message %></h1>
<h2><%= @error.status %></h2>
<pre><%= @error.stack %></pre>
```

#### 動作確認 ####
以下のURLへアクセスしページが表示されればOKです。

[http://localhost:3000/](http://localhost:3000/)


#### 注意事項 ####
私が躓いた点をいくつか。。。。

ejsと ect では変数にアクセスする書き方が違うので注意する。

```php:サンプルEJS
<h1><%= message %></h1>
```

```php:サンプルECT
<h1><%= @message %></h1>
```

※ @（アットマーク）が付くか付かないかの違い。


デフォルトで作成済の view ファイルの拡張子を全て ect に変更する。
error.ejs は使用していないから後で修正しようと思っていたらエラーを表示するのに使っており違うエラーが発生していて原因が特定できなかった。


### まとめ ###
+ ここまでは難しくない。
+ 次は jquery、bootstrap を組込んでみる。
+ その次に MongoDB へ接続をやってみる。

以上
[Swift] Single View Applicationの背景色を変更してみる

######[「親切すぎるiPhoneアプリ開発」](http://www.shuwasystem.co.jp/products/7980html/4320.html)page:138 参考

---
#iPhoneアプリの概念を把握しながら背景色の変更を行ってみる
###Single View Application 起動時のオブジェクト構成を把握
~~~
-> UIApplication
    -> AppDelegate
        -> UIWindow
            -> UIViewController
                -> UIView
~~~

#####**UIApplcation**とは
>アプリケーション全体を管理するクラス
>１アプリケーションには必ず１つのUIApplicationが存在する

#####**AppDelegate**とは
>UIApplicationDelegate プロトコルを実装したクラス
>アプリが起動・終了の際、 UIApplication オブジェクトが AppDelegate オブジェクトのイベントメソッドを呼び出す

#####**UIWindow**とは
>最も基本的なUIView
>１つのアプリケーションには１つのUIWindowがあり、その上に様々な部品を配置してアプリケーションを作成する

#####**UIViewController**とは
>UIViewControllerは画面の遷移などを管理するクラス

#####**UIView**とは
>UIViewとは画面表示を管理するクラス
>ラベルやボタンといった各種コントロールのクラスは全てこのUIViewを継承している

---
#疑問点
##UIWindow と UIView の違いは？
~~~
UIWindowクラスは、UIViewクラスの派生クラスである。
アプリ実行中、UIWindowは画面を統括管理しているため、
部分管理をUIViewに任せることになる。
~~~
>[「親切すぎるiPhoneアプリ開発」](http://www.shuwasystem.co.jp/products/7980html/4320.html)page:15 参考


 
---

#UIViewオブジェクトの背景色を変えるには
~~~
UIViewが作成された直後に、背景色を変更するメッセージを送る
~~~

###UIViewの作成タイミングを知るために

~~~
UIViewControllerの
-viewDiaLoadメソッドをオーバーライドする
~~~
>**viewDidLoadメソッド**とは

>~~~
ViewControllerによって
UIViewインスタンスが作成された直後に呼び出される

>Xcode にて Single View Application のテンプレートを
選択してプロジェクトを作成している場合は、
すでに自動作成されている。
(ViewController.swift ファイル内)
~~~

ViewController.swift に以下の１行を追加する。

```swift
self.view.backgroundColor = UIColor.cyanColor()
```

```swift:ViewController.swift
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ->背景色を空色に変更する
        self.view.backgroundColor = UIColor.cyanColor()
    }
```

Runしてみると、画面が空色に変わった。
[GitHub]branchを生やす元を間違えたままcommitしてしまった時の対処法

本来masterから生やす予定だったbranchを、間違ったbranchから生やしてしまったままcommitしてしまった時の対処法。

`git rebase --onto master <派生元branch名> <現在のbranch名>`

これでbranchの派生元をmasterに切り替えることができます。

参考：
[git rebase --onto で派生元ブランチの変更 - northaven](http://yamayo.github.io/blog/2013/12/01/git-rebase-onto/)
[git - Rebase on github branch - Stack Overflow](http://stackoverflow.com/questions/7293271/rebase-on-github-branch)
Fluentdによる柔軟なPHPのアプリケーションログ管理をDockerでシミュレートしたい(2)

こんにちは
前回はここからどうぞ。
[Fluentdによる柔軟なPHPのアプリケーションログ管理をDockerでシミュレートしたい(1)](http://qiita.com/niisan-tokyo/items/a965b168a4564363f4da)

今回はWEBサーバから、別のログ集約サーバにログを投げる部分を作りました。
要するにdockerのコンテナ間での連携になります。

作成したソースコードはこんな感じです。
https://github.com/niisan-tokyo/log_experioment/tree/throwLog

# ログ集約サーバを作る

まず、ログを収集するためのサーバイメージを作ります。
Dockerfile短いんで、全部載せちゃいます。

```
FROM centos:6.7

#install fluentd
ADD etc/td.repo /etc/yum.repos.d/td.repo
RUN rpm --import https://packages.treasuredata.com/GPG-KEY-td-agent; yum check-update; yes|yum install -y td-agent
RUN yum install -y initscripts
ADD etc/td-agent.conf /etc/td-agent/td-agent.conf

EXPOSE 24224

CMD /usr/sbin/td-agent
```

これで、ログ集約用のサーバが出来上がりました。
現在このサーバの持っている役割は、前回のPHPローカルサーバにあるfluentdと同じで、投げられたログを受け取って、ファイルに書きだすというものです。

これを用意したら以下のコマンドを叩いて、イメージを作ります。

```
docker build -t niisan-tokyo/fluentd dockers/fluentd
```

# コンテナ間連携する

コンテナ間連携には[こちら](http://qiita.com/taka4sato/items/b1bf33941a1ec8b69fd2)を参考にしました。

## WEBサーバのfluentdの設定変更

連携を開始する前に、WEBサーバ側のfluentdの設定も変更しておく必要があります。
niisan-tokyo/etc/td-agent.conf

```
 <match app.**>
-  type file
-  path /var/log/td-agent/app
+#  type file
+#  path /var/log/td-agent/app
+   type forward
+   <server>
+     host logger
+     port 24224
+   </server>
 </match>
```

前回までの設定ではログに出力するようにしてありましたが、今回は「loggerという名前のサーバの24224ポートにログを投げる」という設定にしてあります。
この設定に直してから、イメージを作り直しましょう

```
docker build -t niisan-tokyo/php56
```

これで準備完了です

## コンテナを立ち上げる

ではコンテナを立ち上げましょう。
まずはログ主役用のサーバを立ち上げます。

```
docker run -d --name fluentlogger niisan-tokyo/fluentd
```

ここでつけている```--name```はコンテナにわかりやすい名前をつけるオプションです。

次にWEBサーバ用のコンテナを立ち上げます。

```
docker run -d --name web -p 8080:8080 --link fluentlogger:logger niisan-tokyo/php56
```

ここで大事なのは、```--link <コンテナ名>:<エイリアス>```オプションです。
これをつけて起動したコンテナには、```--link```オプションで指定したコンテナのipやポートの情報が追加されます。
さらにはhostsに設定が追加されて<エイリアス>で指定したコンテナ名のサーバに接続することができます。

## 動作を確認する

それでは動作を確認してみましょう。
前回同様、WEBサーバに http://192.168.33.40:8080/ で接続可能し、適当にフォームにスコアを記載し、送信します。
続いてdockerのホスト上で

```
docker exec -it fluentlogger /bin/bash
tail -f /var/log/td-agent/app.<ハッシュ値>
```

でログを確認すると、

```
2015-12-17T09:33:01+00:00	app.scores	{"score1":123,"score2":342,"score3":15}
2015-12-17T09:34:49+00:00	app.scores	{"score1":23,"score2":52,"score3":345}
```

こんな感じでログが確認できます。

ちなみに、fluentdの仕様により、PHPから投げられたログをすぐに集約サーバに投げるのではなく、一定時間ログを貯めこんでから、集約サーバに投げるようになっています。
なので、入力値を送信した直後にログが更新されるとは限りません。
ログが書き出されるまで気長に待ちましょう。

# まとめ

今回でようやくDockerの本格的活用法が示せたように思います。
こういう使い方ができるというのは、雑誌やコラムなどでいくらでも書かれて入るのですが、実際にどのように実現できているかを細かく書いてあるところは少ないので、今回いろいろと触ってみて、いろいろと実感できたように思います。

次回はさらにMongoDBと連携させ、「柔軟なログ」を実現してしまおうかな、と思います。

[Fluentdによる柔軟なPHPのアプリケーションログ管理をDockerでシミュレートしたい(3)](http://qiita.com/niisan-tokyo/items/f024227e9249a8049104)

# 参考

[Docker container間の連携について](http://qiita.com/taka4sato/items/b1bf33941a1ec8b69fd2)
[コンテナの連結と操作 - Docker User Guide](http://qiita.com/zembutsu/items/f361cad9be500950939f)

# 補足

fluentdの設定で、initscriptsをインストールしていますが、いらないと思います。
また、fluentdの起動スクリプトを直打ちしていますが、もっといい方法があるかもしれません。
Akkaのスレッドをデーモンスレッドにする

# はじめに
Akkaの初期設定ではデーモンスレッドではなくユーザースレッドになっている。
よって、Main側のスレッドが死んでも稼働し続ける。
これを変更できるのかなーと調べてたところ、ちゃんとあったので記録しておく。

# デフォルトの振る舞い
Akka-Streamを使ってさくっと動作確認。

```scala
object Main extends App {
  import scala.concurrent.duration._
  
  implicit val system = ActorSystem("my-sample")
  implicit val materializer = ActorMaterializer()
  
  val ret: Future[Unit] = Source(1 to 1000).runForeach { n =>
    Thread.sleep(10)
    println(n)
  }

  Await.ready(ret, 2.seconds)

  materializer.shutdown()
  system.shutdown()
  system.awaitTermination()
}
```

結果はこう。
TimeoutException起きてもAkka側の処理が止まらない。

```
1
2
(中略)
179
180
181
Exception in thread "main" java.util.concurrent.TimeoutException: Futures timed out after [2 seconds]
	at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
	at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:153)
	at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:169)
	at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:169)
182
183
184
（中略）
998
999
1000
```

# 現在の設定を確認する

```scala
println(system.settings.config)
```

すべての設定が確認できる。以下のdaemonicがスレッドモードのキーだ。

> ...timeout":"10s"},"daemonic":"off","extensions":[],"home":"...

# デーモンスレッドにする
akka.confに設定を明示する。

```
akka {
  daemonic = on
}
```

もしくはプログラムに直接書いても。

```scala
  val conf = ConfigFactory.parseString("akka.daemonic = on")
  implicit val system = ActorSystem("my-sample", ConfigFactory.load(conf))
```

これで、実行結果が以下のようになり、Timeoutが出たタイミング以降はAkkaでの処理は実行されなくなったことが確認できた。

```
1
2
（中略）
178
179
180
Exception in thread "main" java.util.concurrent.TimeoutException: Futures timed out after [2 seconds]
	at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219)
	at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:153)
	at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:169)
```
Visual Studio Entity Data Model ウイザードエラー対応

#概要
Visual Studioから Oracle(DatabaseFirst)への接続する際にエラーが発生した。

![oracleDatabaseFirstError.png](https://qiita-image-store.s3.amazonaws.com/0/101511/3740b8a1-c6a3-0e8a-1f9d-1d5fcd1807bf.png)

解決策を残しておく

#環境
Visual Stuio2013 Professional
Oracle11g
Windows7 SP1 32bit

#手順
1.プロジェクト右クリック
2.NuGet パッケージの管理
3.(右上)検索欄に Oracle
4.Official Oracle ODP.NET, Managed Entity Framework Driver インストール
5.VS再起動
5秒でできる！slackで簡単スケジュール調整（設定・プラグイン不要）

# 百聞は一見に如かず

![スクリーンショット 2015-12-18 15.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/23189/b685ec30-4627-e567-8eeb-abbb7d7dc073.png)

忘/新年会シーズンにどうぞ。