OmniAICreator/Qiita-1.07M huggingface dataset:
数独の井桁理論について「Rubyで数独」

#はじめに

『[Rubyで数独：AIプログラミング入門](https://www.amazon.co.jp/dp/B01M2C4894/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)』の「井桁理論」と「数の予約」の説明で使っている表の記法と解説をまとめる目的でこのノートは書いています。本の中で使っているパズルは数独通信からひっぱってきているので、そのままではあれなので無料で入手可能な[Open Sudoku](http://opensudoku.moire.org/)のパズルに変更しています。
[Open Sudoku](http://opensudoku.moire.org/)のVERY HARDのステージ53をある程度まで進めた図が次の左の図になります。この状況から先に進むのまず「井桁理論」というテクニックが使えます。その後で、ごにょごにょした後で「数の予約」を使えますが、「数の予約」については別のページで解説します。下の図の大きな数字は確定済みで、小さな数字はとりうる値を意味しております。ただしまだ、何も考慮していないので、初期配置以外のマスには1から9が書き込まれています。
<img width="254" alt="初期配置.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/6a695385-b43f-e5e8-801a-1aad8c007618.png">

#解説

下の表は3行目のマスを縦軸に、その取りうる値を横軸にとっています。初期配置ですでに値の確定している部分に◯、入らない値については✕を入れます。初期配置の3行目に注目すると、A9からA3が、H8からH3が3にはなりません。つまり下の表の❏の部分は✕が入ります。
<img width="215" alt="井桁理論1.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/4b702bec-6108-c2d9-6d08-d9146b6d721f.png">
表の内容を反映させると、配置は次のようになります。
<img width="254" alt="井桁理論1-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/d1295886-95d4-65ee-3b6b-1992524d0328.png">
3行目を見るとB3かI3に3が入ることが分かります。表の言葉で言えば、△か▲の一方に◯が入り、他方に✕が入るということです。次に5行目に注目すると、I8からI5は3にはなりません。つまり、下の表の❏に✕が入ります。
<img width="215" alt="井桁理論2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/9e12c9aa-0948-5835-2865-08f7648a6c87.png">
先程と同様にして、5行目のB5かI5に3が入ることが分かります。これを△と▲で表します(前の表と整合性をとるためには白黒が逆ではいけません)。
❏に✕を入れた段階の図は次のようになります。
<img width="254" alt="井桁理論2-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/9825ab99-488d-addb-4b54-97a29ee75009.png">
ここで、B列とI列で同じような表を書いてみると、"・"の位置には✕が入ることが確定していることが分かります。"・"を"✕"にするのを「井桁理論」と呼びます。
<img width="215" alt="井桁理論3-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/ac0772f1-9a3a-ece8-b722-0cca2416d73d.png">
<img width="215" alt="井桁理論3-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/86462953-3f44-d20e-6ad8-a7535beaaa71.png">
"・"を"✕"にしたあとの図は次のようになります。
<img width="254" alt="井桁理論3.png" src="https://qiita-image-store.s3.amazonaws.com/0/227/68277e98-11db-d18f-de64-023ad5bb03e8.png">
Azure Storage アカウント間でアカウント内のすべてのBlobをコピーする

#Blobをまるごと別アカウントにコピー

移行テスト環境構築のために本番データを新規環境へコピーする必要があります。
数年分のデータを溜め込んでいるのでものすごい量でした。

``` copy-customallblobcontainer.ps1
    $Context = "Context取得"
    $ContainerList = Get-AzureStorageContainer -Context $Context
    Write-Verbose "iterate over the number of containers"
    Write-Verbose ("copy {0} containers" -f $ContainerList.Count)

    $ContainerCounter = 0
    foreach($ContainerInfo in $ContainerList) {
        Copy-CustomBlobStorage -From $FromSrcEnviroment -ToDestEnviroment $ToDestEnviroment -ContainerName ($ContainerInfo.Name) -ExceptSnapshot -StorageTarget $StorageTarget
        #Write-Verbose ("Copying of {0} Blob is completed" -f $BlobCounter.Count)
        $ContainerCounter = $ContainerCounter + 1
    }
```

``` Copy-CustomBlobStorage.ps1
        $Context = "Context取得"   
        #Get a reference to blobs in the source container.
        if($ExceptSnapshot) {
            $ObtainedBlob = Get-AzureStorageBlob -Container $ContainerName -Context $Context | Where-Object  { !($_.ICloudBlob.IsSnapshot)}
        } else {
            $ObtainedBlob = Get-AzureStorageBlob -Container $ContainerName -Context $Context
        }

        #Define the Destination storage account and context.
        $DestContext = "Context取得"
        
        $DestContainer = $ContainerName
        New-AzureStorageContainer -Context $DestContext -Name $DestContainer -ErrorAction Ignore > $null
    
    #Copy blobs from one container to another.
    $ObtainedBlob `
    | Start-AzureStorageBlobCopy -DestContainer $DestContainer -DestContext $DestContext -Force `
    | Get-AzureStorageBlobCopyState -WaitForComplete

```

コンテナコピーするスクリプトはもともと作成していたのでアカウント単位でコピーする大本のスクリプトを作成したんですが、
最初はスナップショットが邪魔をしてエラーになってしまいました。

そこで、１度はBlobを１つずつコピーするよう作り変えたのですが、おそすぎたので実行を断念しました。

そこでGet-AzureStorageBlobで取得したものからIsSnapshotを除外するように変更しました。

かなりのスピードアップはできました。
それでもまだ時間はかかるので、あとは並列化とか非同期を取り入られるか模索中です。


#2017-10-26追記
よくよく考えたらコンテナ単位でAzcopyの方が断然速いと気がついたので暇を見つけてAzcopy版で作成します
Gitで様々な項目を修正する方法

GitのコミットのCommitter, Author, コミットメッセージを修正する方法についてまとめます。

#Committer
##Committerとは
リポジトリにコミットした人のことをCommitterといいます。
##修正方法
__修正したいコミットの中で一番古いコミット__を修正することで、それ以後のコミットのCommitterを全て修正します。
※この際、修正を行ったリポジトリにおけるデフォルトのCommitterも変更されます。

1. 以下のコマンドを実行するとテキストエディタが開くので、Committerを修正したいコミットの中で一番古いコミットの`pick`を`edit`に書き換えて保存します。<br>__※`git log`とは逆順に表示されるので注意。__

```bash
$ git rebase -i HEAD~{いくつ前のコミットまで遡りたいか}
```

1. Committer (ユーザ名) を修正します。

```bash
$ git config --local user.name {ユーザ名}
```

1. Committer (メールアドレス) を修正します。

```bash
$ git config --local user.email {メールアドレス}
```

1. 以下のコマンドを実行し、Committerを書き換えます。

```bash
$ git commit --amend
```

1. 以下のコマンドを実行し、残りの変更を行います。

```bash
$ git rebase --continue
```

#Author
##Authorとは
コードを記述した人のことをAuthorといいます。
##修正方法
__1コミットずつ__修正します。

1. 以下のコマンドを実行するとテキストエディタが開くので、Authorを修正したいコミットの`pick`を`edit`に書き換えて保存します。<br>__※`git log`とは逆順に表示されるので注意。__

```bash
$ git rebase -i HEAD~{いくつ前のコミットまで遡りたいか}
```

1. 以下のコマンドを実行し、Authorを書き換えます。

```bash
$ git commit --amend --author="{ユーザ名} <{メールアドレス}>"
```

1. 以下のコマンドを実行し、残りの変更を行います。

```bash
$ git rebase --continue
```

#コミットメッセージ
##修正方法
__1コミットずつ__修正します。

1. 以下のコマンドを実行するとテキストエディタが開くので、Authorを修正したいコミットの`pick`を`edit`に書き換えて保存します。<br>__※`git log`とは逆順に表示されるので注意。__

```bash
$ git rebase -i HEAD~{いくつ前のコミットまで遡りたいか}
```

1. 以下のコマンドを実行するとテキストエディタが開くので、コミットメッセージを書き換えます。

```bash
$ git commit --amend
```

1. 以下のコマンドを実行し、残りの変更を行います。

```bash
$ git rebase --continue
```

#参考文献
* [git でメールアドレスやら名前やらを間違えて commit してしまったときの修正方法 - ..たれろぐ..](http://d.hatena.ne.jp/naga_sawa/20110119/1295420861)
* [author と committer の違い - by shigemk2](http://www.shigemk2.com/entry/20120310/1331314603)
* [git commit --amendでコミットメッセージを修正 - Qiita](git commit --amendでコミットメッセージを修正 - Qiita)
IT用語チートシート(自分用)

#はじめに
初心者SEの自分の不明用語等をチートシートとしてまとめる。
**作成条件**
1.項目ごとに題名作成
2.概要作成
3.参考ページなどのURL記載
4.使用例等を記述
　　　　　　　　　　　随時追加予定
※初心者SEのため間違えてるところがあるかもしれません。
おかしなところが有った時は、お手数ですが有識者の方**ご指導ご鞭撻を宜しくお願い致します**(._.)

#キャスト(cast)
型を変換すること。
**演算子**の一種。
**暗黙的キャスト**と**明示的キャスト**がある。

**・明示的キャスト**
　変数A=(変数Aの型)変数B; ←見慣れた光景
例)
*　　int A=int.Parse("100");*
*　　int A=Convert.ToInt32("100");*
　　　　　　　　　　　　　　　　　　　　　　　などなど…
**・暗黙的キャスト**
　変数A=変数B;　←見た目キャストしていないように見える。
プリミティブ型やクラスおけるキャストが存在しているが、これらはまったくの別物と考えたほうがベターらしい。
参考
[Javaプログラミング辞書JavaAzZ\キャストとは](http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000105.html)


#マジックナンバー
プログラム製作者にはわかるが、それ以外の人にはわからない数字。
だが、これがあるとなぜか動くという魔法の数字という意味らしい。
もちろん無いほうが良い。
仮データとかを設定指定おいて消し忘れたときに発生しそうで怖い。
Wikiには消費税8％を例に挙げていた。
参考
[Wiki\マジックナンバー(プログラム)](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%8A%E3%83%B3%E3%83%90%E3%83%BC_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0))

#構造体(struct)
いろいろな種類のお互いに関連するデータをまとめて1つの塊にしたものらしい。
データのまとまりということか……雑すぎる解釈と思うが…。
例)
人を例にすると

人
｛名前、性別、体重、身長、など等…}

これが人のデータをまとめた構造体(結構適当)。
で、名前、性別、身長等の人の中のものをメンバというらしい。

同期はゲームキャラとかのステータスと考えたとのこと、なるほど。
ステータスが、ゲームキャラクターの構造体でそのメンバーは攻撃力とか防御力とかそんな感じらしい。
参考
[京都産業大学\~~\構造体](http://www.cc.kyoto-su.ac.jp/~yamada/pB/struct.html)

#Voidとは
空間を意味するらしく返り値を持たない関数の方をあらわす。
つまり
`private void hoge(){}`
は返り値の無いメゾッド(関数)言うこと。
ちなみに返り値は以下のようになるはず。

```c#
*privare string hoge(string ret)
{
string ret="返り値”;
retune ret;
}*
```
は返り値がret(string型)のメソッド(関数)

#エディター(テキストエディター)
プログラムばかりでなくテキスト全般を修正するためのツール。
メモ帳もその一つ(？)
秀丸とかサクラとかTeraPadとか………上げていけばきりが無い。
背景色、文字色とかを自分流に変えたり出来るものが多い。
＊実はWordとかもいろ変更可能です。(やり方忘れたorz)
VSのと、Noeditorとか、サクラとか、VXエディターとか使ってます。

#文字型について
Int,String,LongInt,Float,ShortInt,Char,UnsignedIntとか……
・Char=1Byte
・Int=2Byte
・LongInt=4Byte
・Float=4Byte
・Double=8Byte
*環境によって異なるため注意が必要。
参考
[初心者のためのポイント学習C言語\第2章　データの扱い\2-2.変数\(1)変数の型](http://www9.plala.or.jp/sgwr-t/c/sec02.html)
---追加予定

#グレップ(grep)
業務中にいきなりグレップしてーといわれて調べた。
平たく言うと文字検索機能。
エディターなどにある機能でテキストファイルから任意の文字に一致する行を検索する。
エクセルのCtrl+Fの強化番みたいなものと解釈。
例)サクラエディター
![グレップ機能【Ctrl+G】](https://qiita-image-store.s3.amazonaws.com/0/159061/6e11c4ee-f135-4eb7-a44b-12c3f6590766.png)
参考
[Wiki\grep](https://ja.wikipedia.org/wiki/Grep)

#ファイル構成(C,C+)
--追加予定

#マーシャリング
データ処理の一種
異なる二つのシステム間でデータ交換できるようにデータを操作する処理のこと。

Javaで取得したデータをWindowsで使うために使ったりする。
語句だけ調べたので詳細省略……
Letter Opener Gem

# Letter Opener Gem

## Letter Openner とは
- メールの送信の代わりに デフォルトブラウザでメールをプレビューできるようにサポートするGem
→  開発環境のメール送信の設定は必要なくなって、メール送信テストは優しくなります。

## Railsアプリで設定
- RailsアプリのGem fileを`developement` グループに`gem "letter_opener"`行を追加する

```Gemfile
gem "letter_opener", :group => :development
```
- `bundle install` コマンドを走る

- `config/environments/development.rb`の中に、メールのconfigの送信メソッドを:letter_opennerに修正

```
config.action_mailer.delivery_method = :letter_opener
```

設定完了でした。簡単でしょう？　今はメール送信をテストする時、メールを送信しなくてブラウザでメールを表示する。
もし別のアプリは別のアプリでメーリを開いたら、`LAUNCH_APPLICATION`の環境変数を編集してください。

## Ruby アプリで設定

- 下記のコマンドを走る

```
gem install letter_opener
```

- 送信メソッドの設定だけ編集する

```
require "letter_opener"
Mail.defaults do
  delivery_method LetterOpener::DeliveryMethod, :location => File.expand_path('../tmp/letter_opener', __FILE__)
end

```

- もしActionMailerを直接に使っていたら、送信メソッドの追加は必必要があります。


```
require "letter_opener"
ActionMailer::Base.add_delivery_method :letter_opener, LetterOpener::DeliveryMethod, :location => File.expand_path('../tmp/letter_opener', __FILE__)
ActionMailer::Base.delivery_method = :letter_opener
```

## 参照
- https://github.com/ryanb/letter_opener
- http://k-shogo.github.io/article/2013/11/06/rails-letter-opener/
[Laravel] 実行されたSQLをログに吐き出す

# 実行された SQL をログに吐き出す

* 実行されている SQL を見たい

## Laravel5.1

``` php
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        \DB::listen(function ($sql, $bindings, $time) {
            // ログ吐く処理
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
    }
}

```

## Laravel5.2

* 5.2 で変わった

``` php
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        \DB::listen(function ($query) {
            // $query->sql
            // $query->bindings
            // $query->time

            // ログ吐く処理
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
    }
}

```
CSS > Link > ">"の意味 > immediate children(direct descendants/children)

CSS処理の共通化を検討していて、@junya さんのコードをふと見ていた。
http://qiita.com/junya/items/5ffdb9bb108a4f0daba0

`.body > .smoke{`という書き方が気になったので調べた。

http://stackoverflow.com/questions/4459821/css-selector-what-is-it

immediate children(direct descendants/children)というものらしい。

~~共通事項は.bodyで定義して、変更がある部分だけ.smokeのようなchildrenで定義すれば派製品が作れるような気がした。~~
PostgreSQLで一部のテーブルをまとめて削除

データをインポートするときに処理の失敗、中断でワークテーブルが沢山残ってしまっていたので、それらのみ消す必要がありました。

名前でまとめられる場合は以下をpsqlで実行して、出来たクエリをコピペで実行します。likeの後ろはテーブル名の絞り込み条件です

```
select 'DROP TABLE '||'"'||relname||'"'||';'
from pg_stat_user_tables
where relname like 'hoge%tmp%';
```
PostgreSQL:全てのカラム名を小文字に

re:Dash(PostgreSQL)で、あるはずの列を参照しようとして"column (カラム名) does not exist"というエラーが出た対策なのは内緒です

```
select 'ALTER TABLE '||'"'||table_name||'"'||' RENAME COLUMN '||'"'||column_name||'"'||' TO ' || lower(column_name)||';' 
from information_schema.columns 
where table_schema = 'public' and lower(column_name) != column_name;
```

psqlで上記を実行してやり、生成されたクエリをコピペして実行しました。
コーディングをしながら調べた回数と時間

設計・実装の中で調べものをすることがよくある。

- あの処理はどういう実装だったか
- あの値はどういう名前の変数だったか
- TODOリストのチェック
- 実装方法の調査
- etc.

調べものの時間を減らすことができれば、作業が捗る。そういう観点から調べもの時間短縮のために情報を日々、整理している。

自分が実際に調べものをどれくらいしているか気になり調べた。

### 方法

調べものを開始時にカウンタを押す。

Gカウンタを使用させていただきました。
https://yonelabo.com/gcounter

### 環境

- 計測時間: 1時間
- 作業内容: 設計済の処理の実装
- (一部、過去に実装したものと関係がある)
- ツール: C++ Builder XE4(IDE)
- ツール: Sublime Text 2
- ツール: Qiita

### 条件

以下は回数としてカウントしない

- 開いているツール画面内でスクロールせずに見つかる場合

### 結果

- 調べた回数: 19回
- 調べ初めてから結果が得られた時間: 30秒未満/個

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cd264633-aef0-97db-b314-2558c4ba9d90.png)

1時間(3600秒)の間において、19*30秒(=570秒)の調査時間があった。
570/3600 = 0.158 = 15.8%もの時間を調べているようだ。

まだ、これは早い方で、調べることにはまったら上記の10倍以上になる場合もある。
Cloud Dataflowを使ってBigQueryのデータをAvroフォーマットでGCSに格納する

先の投稿ではdigdagを使ってBQのデータをAvroフォーマットでGCSに格納したが、BQのデータを加工したり、大規模なデータに対して並列で実行したい場合にはDataflowの方がマッチしていると考えられる。

DataflowはBigQuery,Avro,GCSのI/Oを備えているので、上記のことを容易に実現することが可能。

BigQueryからデータを取得してAvroに変換する処理の例がなくて困ったので、同じことではまっている人向けにここでシェア。

AvroIOを使うためには、最初にAvro schemaを定義することが必要。

```
  String schemaString = 
  "{\"namespace\": \"example.avro\",\n"
   + "\"type\": \"record\",\n"
   + "\"name\": \"User\",\n"
   + "\"fields\": [\n"
   + "    {\"name\": \"resource\", \"type\": \"string\"} \n "
   + "]\n"
   + "}";
   schema = new Schema.Parser().parse(schemaString);
```

次に、BigQuery table rowからGenericRecordに変換する処理を定義

```
 public static class TransformTableRowToAvroRecord extends DoFn<TableRow, GenericRecord> {
  private static final long serialVersionUID = 1L;
  
  public GenericRecord makeGenericRecord(TableRow content) {   
   GenericRecord record = new GenericData.Record(schema);
   record.put("resource", (String) content.get("userid"));
   return record;
  }
  @Override
  public void processElement(ProcessContext c) {
   TableRow row = c.element();
   c.output(makeGenericRecord(row));
  }  
 }
```

最後に、パイプラインに変換を適用してGCSに出力するようにする。

```
PCollection<TableRow> BigQueryReadingCollection = bp.apply(BigQueryIO.Read.withoutValidation().usingStandardSql().fromQuery(myQuery));
PCollection<GenericRecord> BigQueryTransformData = BigQueryReadingCollection.apply(ParDo.of(new TransformTableRowToAvroRecord())).setCoder(AvroCoder.of(GenericRecord.class, schema));
BigQueryTransformData.apply(AvroIO.Write.to("gs://MY_BUCKET/MY_PATH").withSchema(schema)); 
```

以上です。
Electronでdo式(do-expressions)を使う

Electronの起動時にChromiumと同等のフラグをコマンドラインで指定してやると良いみたいです：

```
$ .\node_modules\.bin\electron --js-flags="--harmony-do-expressions" .
```

```js
const a = do {
    const i=123
    i*2
}
console.log(a) // => 246
```

<br>
-----
<br>

もしくはElectronの`main`のスクリプト中でスイッチを指定してやれば、起動コマンドラインでのフラグ指定が不要になるようです。ただしこの場合はブラウザウィンドウ内ではdo式が使えるものの、`main`スクリプト等のメインプロセス中では使用不可となってることに注意する必要がありますね。

```js:main.js
const electron = require("electron")
const app = electron.app
app.commandLine.appendSwitch('js-flags', '--harmony-do-expressions')
```
```
$ .\node_modules\.bin\electron .
```

Electronアプリをパッケージ化した際のコマンドラインフラグ指定ってどうなってるんですかね？


## 参考

* electron/chrome-command-line-switches.md · GitHub
  https://github.com/electron/electron/blob/master/docs-translations/jp/api/chrome-command-line-switches.md

* do式が実装された - JS.next
  http://js-next.hatenablog.com/entry/2015/10/23/193955

* このブログについて - JS.next
  http://js-next.hatenablog.com/entry/2013/07/31/030304
Digdagを使ってBigQueryからテーブルをAvroフォーマットでExportする

Digdagのワークフロー定義で直接BigQueryを操作できるようになっていたので試してみた。

実行環境：GCP　CloudShell
digdag version: 0.9.5
digdagのインストール手順は省略：

今回試したのはBigQueryのあるテーブルをAvroフォーマットでGCSに格納する例。

BigQueryやGCSにアクセスするためには個人のアカウントやサービスアカウントを利用するが、処理の自動化を行う際はサービスアカウントを作るのが妥当。
サービスアカウントを作成し、鍵をjson形式でファイル出力する。このファイルをjson.keyとしてCloudShell上に配置。

DigdagのワークフローからGCPにアクセスするためには、Secrets情報としてgcp.credentialを設定する必要がある。
Digdagは秘密情報（パスワードや鍵など）をセキュアに管理するための機能を備えている。 Secretsは通常のワークフローパラメータとは別に処理され、暗号化されて保管されている。Local secretsはユーザのホームディレクトリ上に保存される。

以下のコマンドを実行し、ローカル環境にsecretsとしてgcp.credentialを設定する。

```
$ cat json.key |digdag secrets --local --set gcp.credential=@json.key
2017-02-23 15:54:04 +0900: Digdag v0.9.5
Secret 'gcp.credential' set
```

以下のコマンドを実行し、gcp.credentialがセットされているこを確認

```
$ digdag secrets --local
2017-02-23 15:54:24 +0900: Digdag v0.9.5
gcp.credential
```

ワークフローには以下のように記述

```bqexport.dig
$ cat aaa.dig 
timezone: UTC
_export:
  bq:
    dataset: test_yotsu
+export:
  bq_extract>: table01
  destination: gs://{bucketName}/test01.avro
  destination_format: AVRO
  compression: NONE
```

あとはdigdag runをするとBQのデータをGCS上にexportされていることを確認。

BigQueryで解析した結果をある時刻にexportして、その解析データを別のクラウドや別サービスに使うといったことが簡単に実現可能。
[ポエム]Goでモヤモヤするところ

Go最近の一番のお気に入り言語なのですが、モヤモヤするところも出てきてるので備忘録的にポエムを書いてみました。

# 汎用的に書こうとすると遅くなる
ちょっと柔軟に書こうとするとReflection, Interfaceが必要になってきて遅くなる[1]。
Reflectionは色々コード生成ライブラリがあるからいいけど[2][3], InterfaceをつかないとGoっぽいコードにならない。
まぁ　Interfaceによる性能劣化が実際に実務で問題になることは当面なさそうだし、
部分的に使わなければいいだけなのだけど、少しモヤモヤ
Rustだとこの辺オーバーヘッドなしに実現してるらしいので気になってる。実務で使うにはもっとエコシステムが育つ必要があるけど、、

``` go
package benchmark

import (
	"testing"
)

type CalcInterface interface {
	Add(a, b int) int
}

type CalcImpl struct {
}

func (m *CalcImpl) Add(a, b int) int {
	return a + b
}

type CalcStructWithPointer struct {
	impl *CalcImpl
}

type CalcSturctWithInterface struct {
	impl CalcInterface
}

type CalcStructWithFunctionPointer struct {
	impl func(a, b int) int
}

func BenchmarkCalcStructWithPointer(b *testing.B) {
	c := &CalcStructWithPointer{
		impl: &CalcImpl{},
	}
	for i := 0; i < b.N; i++ {
		c.impl.Add(10, 20)
	}
}

func BenchmarkCalcSturctWithInterface(b *testing.B) {
	c := &CalcSturctWithInterface{
		impl: &CalcImpl{},
	}
	for i := 0; i < b.N; i++ {
		c.impl.Add(10, 20)
	}
}

func BenchmarkCalcStructWithFunctionPointer(b *testing.B) {
	c := &CalcStructWithFunctionPointer{
		impl: func(a, b int) int {
			return a + b
		},
	}
	for i := 0; i < b.N; i++ {
		c.impl(10, 20)
	}
}
```

``` shell
BenchmarkCalcStructWithPointer-8           	2000000000	         0.30 ns/op
BenchmarkCalcSturctWithInterface-8         	1000000000	         2.71 ns/op
BenchmarkCalcStructWithFunctionPointer-8   	1000000000	         2.42 ns/op
```

# net/rpcのフリーズはgRPCのゴリ押しではないか？

去年、net/rpcモジュールがフリーズされた。

https://github.com/golang/go/issues/16844

net/rpcモジュールはGoからしか使えないものの、IDL不要でgRPCより高速。
上記のissueでは、構造的に問題があるとかバグが多いとか書いていたけど、説得力がなかった、、フリーズはgRPCのゴリ押しではないかと邪推してしまう。言語と特定の技術をセット売りされているようでモヤモヤ

# Null Safe欲しい

Nullチェックめんどくさい

# シンタックスシュガー欲しい

if err != nil とか、、
関連して、Error モナドが使えるといいのに
無理やりモナドやるならこうかな？　遅いけど

https://play.golang.org/p/KzL8tH4m1h

``` go
func taskA(context map[string]interface{}) error {
	fmt.Println("taskA done")
	return nil
}

func taskB(context map[string]interface{}) error {
	return fmt.Errorf("I don't want to do task B!")
}

func taskC(context map[string]interface{}) error {
	fmt.Println("taskC done")
	return nil
}

func do(context map[string]interface{}, tasks ...func(context map[string]interface{}) error) error {
	for _, task := range tasks {
		if err := task(context); err != nil {
			return err
		}
	}
	return nil
}

func main() {
	err := do(nil,
		taskA,
		taskB,
		taskC)
	fmt.Println(err)
}

```

# 参考文献
[1] http://inforno.net/articles/2015/12/11/go-interface-performance-penalty
[2] Genny https://github.com/cheekybits/genny
[3] Who needs generics? Use ... instead! https://appliedgo.net/generics/
Rails5のActionCable(WebSocket)をPumaとnginxで本番環境で動かす

リアルタイムな処理をしたいときにWebSocketをする実装は、Node.jsが多いかと思いますが、結構めんどう・・・
RailsのActionCableを使ったら簡単に実装できて結構良さげ！、いざデプロイして本番環境で動かそうと思うとわりとRails4時代とは同じようにいかずハマったのでメモ。

`rails new`した状態からスタート

## nginxの設定

```:/etc/nginx/conf.d/default.conf
server {
  listen  80 default_server;

  root /var/rails-server/public;

  location ~* \.(ico|css|gif|jpe?g|png|js|html)(\?[0-9]+)?$ {
    break;
  }

  location / {
    proxy_pass http://0.0.0.0:3000/;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
  }

  location /cable {
    proxy_pass http://0.0.0.0:3000/cable;
    proxy_http_version 1.1;
    proxy_set_header Upgrade websocket;
    proxy_set_header Connection Upgrade;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}
```

`/cable`のpathを`websocket`にまわす

## ドメインの設定を加える

```rb:/config/environments/production.rb
Rails.application.configure do
  ...
  # config.action_cable.mount_path = nil
  # config.action_cable.url = 'wss://example.com/cable'
  config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
  ...
end
```

`config.action_cable.allowed_request_origins` に使われるドメインを記述する


## routes.rb修正

```rb:/config/routes.rb
Rails.application.routes.draw do
  root 'home#index'

  mount ActionCable.server => '/cable'
end
```

`mount ActionCable.server => '/cable'` をroutes.rbに加える


## おわり
最終的に行き着いたのがこの設定でした。
シンプルにおさまった！

あとはchannelとか設定して
puma実行

```bash
$ RAILS_ENV=production bundle exec puma -d
```

とかやれば、ガンガンWebSocket使えます。
ようこそジャパリVRへ！

![japari_logo.png](https://qiita-image-store.s3.amazonaws.com/0/153460/dc7f52b7-ee53-bd9f-d8b6-260539497a78.png)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">A-FrameはHTMLでVRができるフレームワークなんだね！ <a href="https://t.co/8nYh557OY1">pic.twitter.com/8nYh557OY1</a></p>&mdash; jyuko (@jyuko49) <a href="https://twitter.com/jyuko49/status/834822002711990273">2017年2月23日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

![IMG_1499.jpg](https://qiita-image-store.s3.amazonaws.com/0/153460/978a3530-c7c7-4465-11c7-1f67b2e76025.jpeg)

![IMG_1498.jpg](https://qiita-image-store.s3.amazonaws.com/0/153460/920a095d-46c2-d844-cb9e-e112e93a0f67.jpeg)


これ何？ へぇー、A-Frameっていうんだ！すごーい！HTMLでVRが作れるフレームワークなんだね！
VRゴーグル？っていうのを使うと、立体的に見えるんだ！

`<a-sky>`に画像のパスを書くだけで、いろんなちほうに行けるんだ！わーい！たーのしー！
VRに使う画像は『equirectangular image』で検索すればいいんだね！

私はサーバル！こっちはボス！schwarzさんが作ったMMDのフレンズだよ！
`<a-mmd>`でロードされてるんだって！


```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>ジャパリVR</title>

    <script src="https://cdn.rawgit.com/aframevr/aframe/v0.5.0/dist/aframe-master.min.js"></script>
    <script src="https://cdn.rawgit.com/kripken/ammo.js/dcab07bf0e7f2b4b64c01dc45da846344c8f50be/builds/ammo.js"></script>
    <script src="https://cdn.rawgit.com/takahirox/aframe-outline/v1.1.0/build/aframe-outline.min.js"></script>
    <script src="https://cdn.rawgit.com/takahirox/a-mmd/v1.0.2/build/a-mmd.min.js"></script>
  </head>

  <body>
    <a-scene antialias="true" outline>
      <a-sky src="sm_lotw-041119.jpg"></a-sky>
      <a-entity position="0 10 20">
        <a-camera></a-camera>
      </a-entity>

      <a-entity mmd="audio:./nc51622.mp3;">
        <a-entity mmd-model="model:./サーバル/サーバルちゃん.pmx; vmd:./日常・非日常モーションセットV104/朝の背伸び.vmd;"></a-entity>
        <a-entity mmd-model="model:./BOSS/ラッキービースト.pmx;" position="5 0 0">
          <a-animation
            attribute="rotation" direction="alternate"
            from="0 0 0" to="0 360 0" dur="4000"
            repeat="indefinite" easing="ease">
          </a-animation>
        </a-entity>
      </a-entity>

      <a-light type="ambient" color="#888"></a-light>
      <a-light color="#AAA" distance="100" intensity="0.4" type="point"></a-light>
    </a-scene>
  </body>
</html>
```

## あとがき
サーバルちゃんのMMDが配布されていると知ってから1時間程で、気付いたら作ってたものです。せっかくなので、**"A-Frameで簡単に実現できること"**の紹介を兼ねて共有してみます。
ライセンスの都合もあり、ファイルやデモページの公開はしていないので、上記のHTMLをコピペし、モデル、モーション、背景画像、音源を配置するなどして、個人で利用ください。

素敵なモデルやフレームワークを作れるフレンズたちのおかげで、たった数十行のHTMLでジャパリパークを疑似体験できるなんて、すごーい！時代になったものですね！


## クレジット
ジャパリVRは、以下のOSS、コンテンツを利用しているよ！
モデル、モーションは再配布禁止だよ！ライセンスの範囲内で遊んでね！

A-Frame
https://github.com/aframevr/aframe

A-Frame MMD component
https://github.com/takahirox/a-mmd

けものフレンズ ロゴジェネレータ
http://qiita.com/hiruberuto/items/463219b158d74668e7d9

サーバル
http://3d.nicovideo.jp/works/td28891

ラッキービースト
http://3d.nicovideo.jp/works/td28949

日常・非日常モーションセット
http://www.nicovideo.jp/watch/sm23462394

背景画像
http://www.ignorancia.org/en/index.php?page=LOTW_11_19_04_Panorama

BGM
http://commons.nicovideo.jp/material/nc51622
VRサイクリング「THE TRIP」＠渋谷 体験レポート

![February_23__2017_at_0454PM.jpg](https://qiita-image-store.s3.amazonaws.com/0/12309/55d23fd3-151f-7663-9dbe-e41483ccc4df.jpeg)

# 公式サイト
* https://cycle-studio-r.jp/sr/
* 3/19にグランドオープンで、現在は体験期間中
* サイトで予約して、3000円で体験できる

# 場所
* 渋谷 CYCLE & STUDIO R 
* 109の近く

# スケジュール
* 体験の30分前に集合し、準備をする
* 体験時間からVRサイクリング開始 (40分間)
* インストラクターさんも一緒にこぎ、声で誘導してくれる
    * 例「ここから坂道なので、ギアをヘビーに回してください。行きますよー！」
    * 例「下り坂なので、ギアを軽くして、回転数を上げてください」
    * 例「ここから立ってこぎますよー！」
* その後、シャワーと着替えをして解散

# 支給品
* 水 500ml
* 脂肪燃焼ドリンク
* レンタルタオル 大と小
* レンタルシューズ サイクリング専用のもの

# バイク
* バイクはハンドルと座高の調節ができる
* 画面とは連動しない
* 負荷はハンドル下の丸い取っ手を回すことで自分で調節する
* 回転数が見れる
* 60台くらいある

# シューズ
* ペダルと固定できる、サイクリング専用のシューズを無料レンタルする
* ペダルを引くことでも回すことができるので広い範囲の筋肉を使うことができる

# その他デバイス
* Panasonicのプロジェクター3台
* 映像は、音楽と同期する。反射表現的にUE4で作られていそう

# VR体験
* 暗い部屋で、プロジェクターの映像と、同期した音を聴きながらエアロバイクを漕ぐ
* 映像上のライトと、BGMのビートが同期している
* 坂道、下り坂、カーブなどがある
* 解像度は十分あり、VR空間に入った感覚も得られた

# 改善点
* ロッカーが40くらいあるが、ピーク時には狭くなりそう
* ロッカーのロック方式が鍵ではなく、自分で番号を決める方式なので、のぞき見によるセキュリティが心配。番号をタオルなどで隠しながら設定する必要がある
* 心拍数が見たい。ハンドルをにぎると計測するか、Fitbitを付けるとか
* 扇風機がほしい
* Hueで部屋自体もライトアップで色づけたら、近未来感がある

# その他
* スタッフは若い
* 体験者は、平日昼で、15人ほど。20代・30代・40代。割合は男性6割・女性4割

# まとめ
* インストラクターさんの声でがんばれる。一人で黙々と漕ぐよりも楽しい
* 40分間、かなり追い込む。コースのアップダウンがあるので脂肪燃焼に効果がある
* いい体験だが、フィットネスの辛さもあるので、ユーザが継続するには新しいコンテンツを追加し続ける必要がありそう
技術英語 > I could do it [in steps]: / one step at a time

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1940 / 12833)

> I could do it **in steps:**

長い文字列を短い文字列から生成する方法として

```
>>> alphabet = ''
>>> alphabet = += 'abcdefg'
>>> alphabet = += 'hijklmnop'
>>> alphabet = += 'qrstuv'
>>> alphabet = += 'wxyz'
```

@ ソフトウェアの世界でキャリアを築く by Sam Lightstone 
> Linus Torvaldsさん
> たった一回のジャンプで、高層ビルの上まで跳ね上がることはできません。一つひとつ階段のステップを歩んで行くものです。何か面白いところに辿り着くまでに１００階以上登りつづけたとしても、決してそれは苦になることはないでしょう。遥かかなたの目標だけに目を向けていたら、足下の階段ですら気づかず一歩すら踏み出すことができないのです。

<hr>
関連して思い出したのは

> one step at a time
http://ejje.weblio.jp/content/one+step+at+a+time
Fortranの大きいサイズのファイル出力について

IDLでfortranで生成された2GB以上のファイルを読み込もうとするとエラーが出てしまうことから、問題が始まった。例えば以下のようなコードで2GB以上のデータを書き込んだとする。

Fortran プログラム

```fortran
program main
  implicit none
  integer(8) :: i,j,k
  integer(8), parameter :: ix = 1024, jx = 1024, kx = 512
  real(8), dimension(ix,jx,kx) :: qq

  qq = 2.d0

  open(10,file="test.dac",form="unformatted")
  write(10) qq
  close(10)

  stop
end program main
```

データサイズは1024*1024*128*8=4,294,967,296 byte~4.2GBとなる。
上記で生成したデータを以下のIDLプルグラムで読み込もうとする。
IDLプログラム

```idl

ix = 1024
jx = 1024
kx = 512

qq = dblarr(ix,jx,kx)

openr,10,"test.dac",/f77_unformatted
readu,10,qq
close,10

end
```

すると
```
% READU: Corrupted f77 unformatted file detected. Unit: 10, File: test.dac
```
というエラーが出て止まる。詳しくはよくわからないが、2GBを超えるファイルはマーカーがうまく表現できないようだ。よってFortranのunformattedで出力・入力するのが良いと思われる。
そこでFortranプログラムを以下のように書き換える。openのところを書き換えただけ。

```fortran

program main
  implicit none
  integer(8) :: i,j,k
  integer(8), parameter :: ix = 1024, jx = 1024, kx = 512
  real(8), dimension(ix,jx,kx) :: qq

  qq = 2.d0

  open(10,file="test.dac",form="unformatted",access="stream")
  write(10) qq
  close(10)

  stop
end program main
```

これに対応して、IDLプログラムはf77_unformattedを外す。

```idl
ix = 1024
jx = 1024
kx = 512

qq = dblarr(ix,jx,kx)

openr,10,"test.dac"
readu,10,qq
close,10

end
```

f77_unformattedも書かなくていいし、サイズの制限もないのでこれからはこれで出力するのがよいと思われる。
多変数の時も並べて書けばいいだけ。
PyCallでRubyからPythonのライブラリを使ってみた

※ 最新版が公開されました。

ライブラリが更新され、かなり使い方が変わっています。
以下の記事にて新しいバージョンの説明をしてありますので、ご確認下さい。

[PyCallを使ってRubyからPythonのライブラリを使い倒す]
(https://qiita.com/mix_dvd/items/d49ed4ff6553f3ace5a7)

# はじめに

mrknさんがPyCallというライブラリを開発されているので、早速試してみました。

https://twitter.com/mrkn

# インストール

2017年2月24日現在、以下の手順でインストールできるようになりました。
mrknさん、ありがとうございます。

```sh:
gem install --pre pycall
```

## 旧インストール方法

備忘録的に残しておきます。
もし、上記手順でインストールできなかった場合にお試し下さい。

ソースコードがGitHubからダウンロードできます。

https://github.com/mrkn/pycall

2017年2月23日現在、開発中のブランチからダウンロードするとのことだったので、以下のコマンドで入手しました。

```sh:
git clone -b eval https://github.com/mrkn/pycall.git
```

そこからGemのインストールに少々手こずってしまいましたが、以下の手順でインストールができました。
もっとスマートな方法をご存知の方がおられましたらご教示ください（汗）

```sh:
# Gemファイルの作成
gem build pycall/pycall.gemspec 
# Gemのインストール
gem install pycall-0.1.0.alpha.gem 
# なぜかGemのフォルダ内が空っぽなので、とりあえず削除
rm -rf ~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pycall-0.1.0.alpha
# ダウンロードしたソースをコピー
mv pycall ~/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pycall-0.1.0.alpha
```

ちなみに、僕はPythonをAnacondaでインストールして使い、Rubyはrbenvを使ってインストールしたものを利用しています。

# とりあえずグラフを描画してみる

以下のコードでグラフを表示できました。

```rb:
require 'pycall/import'
include PyCall::Import

pyimport 'numpy', as: 'np'
pyimport 'matplotlib.mlab', as: 'mlab'
pyimport 'matplotlib.pyplot', as: 'plt'

plt.plot.([1,3,4,6,7,9])
plt.plot.([3,2,4,1,5,0])
plt.show.()
```
![スクリーンショット 2017-02-24 6.12.33.png](https://qiita-image-store.s3.amazonaws.com/0/114240/5e62c4b1-4fc0-77e8-0fce-12f945fc8e75.png)

# iRuby Notebookでグラフを表示してみる

上記のソースコードをiRuby Notebookで実行すると、グラフを描画することはできるのですが、同じように別ウィンドウでグラフが表示されました。

しかも、その後の動作がちょっと不安定（汗）

これではちょっと困るので、以下のように変更。

```rb:
require 'pycall/import'
include PyCall::Import

pyimport 'numpy', as: 'np'
pyimport 'matplotlib.mlab', as: 'mlab'
pyimport 'matplotlib.pyplot', as: 'plt'

plt.plot.([1,3,4,6,7,9])
plt.plot.([3,2,4,1,5,0])

# グラフを画像として保存
plt.savefig.("pycall.png")
plt.close.()

# 保存されたグラフの画像を読み込む
open("pycall.png")
```
![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/1a4dfa75-b11b-cc08-129e-fb205d7ff6a5.png)

インラインで表示させることができました。

# グラフのサイズを変更してみる

指定しないと正方形のグラフが表示されたので、これを少し変更します。

```rb:
require 'pycall/import'
include PyCall::Import

pyimport 'numpy', as: 'np'
pyimport 'matplotlib.mlab', as: 'mlab'
pyimport 'matplotlib.pyplot', as: 'plt'

plt.figure.(figsize: PyCall.tuple(8, 3))
plt.plot.([1,3,4,6,7,9])
plt.plot.([3,2,4,1,5,0])

# グラフを画像として保存
plt.savefig.("pycall.png")
plt.close.()

# 保存されたグラフの画像を読み込む
open("pycall.png")
```
![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/6805dc71-2549-0e78-60aa-e2fc3aca513e.png)

できた！

次は機械学習を試してみたくなりますね(^-^)

# 機械学習もしてみました（追記）

電力需要予測を実行した結果を以下のURLから参照できますので、興味のある方がおられましたらご覧下さい。

電力需要実績から電力需要予測
http://blueomega.jp/predict_kw_with_pycall.html

電力需要実績に1時間前の気温を加えて電力需要予測
http://blueomega.jp/predict_kw_with_temp_and_pycall.html
Microsoft Flowを使ってシステム障害発生時に自分のスマホに通知する

システム障害が発生した際に、最近構築したシステムだとSlackなどに転送して担当者が検知しやすいようにリーチしていくような考慮が入っていたりますが、ほとんどのシステムはメールによる通知がほとんだと思います。

他のメールと混じってしまったり、自分のスマホでメールの内容が確認できなかったりと検知が遅くなってしまうことが多々あるのではないでしょうか。

そんな状況でMicrosoft Flowを使えばメールの通知をトリガーに他のサービスに転送することによって利用者により近い場所で通知することができます。

そんなサービスを今回作成したいと思います。

#通知先を決定する

通知先は人によってそれぞれだと思います。その利用者が普段どのサービスを使っているのかが重要で利用者が普段使っているサービスに通知するのが一番よいでしょう。

今回は２つの方法で通知をしてみたいと思います。

一つ目はMicrosoft Flow上に通知をしてスマホ経由で確認する方法、

二つ目はSlackに通知をしてメッセージとして通知する方法です。


#フローの作成

では、フローの作成に進みたいと思います。

![WS000070.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/3efa32d9-e957-fbcc-8e10-d96a0d4d9ed8.jpeg)


最初のフローはOutlookへのメールの通知からとなります。すべてのメールの通知をトリガーにするわけにはいかないので対象のメッセージを絞ります。

![WS000061.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/556ad9aa-01d7-00e1-0222-e53fb8213ec2.jpeg)


絞り方は色々と方法はありますが、今回は件名に特定のキーワードが入っているときのみにトリガーが起動するようにしたいので、以下のように「件名フィルター」に該当キーワードを入れておきます。

![WS000064.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/49614bb6-d206-2b9d-dc38-dd0c7d314b17.jpeg)



次にどこへ通知させるかの設定となります。


まず最初は自分のスマホ(Notification)へ通知するようにします。通常障害発生時のメールにはその内容が記載されていることがほとんどですので、その内容をそのまま表示できるようにメールの本文を設定します。

![WS000071.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/157000bc-e39c-8002-0103-9ea4f3e7ea6c.jpeg)



次にSlackへの設定ですが、これも同じような考え方で本文を指定したチャネル名として表示するように設定します。


![WS000068.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/59fcc8f0-c463-5949-75d8-04b71ccef7d8.jpeg)


これで設定としては完了になります。


#フローの実行

まず、システム障害が発生したと想定して、自分宛に障害発生メールを送付します。

![WS000069.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/aceefebc-9317-740c-1db0-a304a1e59b72.jpeg)


そうすると、自分のスマホ（Microsoft Flowを事前にインストール必要）とSlackに以下のようなメッセージが表示されます。

[Microsoft Flow]

![WS000073.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/4b59c339-d87b-6001-07e7-b3f737ffa775.jpeg)

![WS000074.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/b2a52942-ae89-4caf-3989-f79fc41842f6.jpeg)

[Slack]

![WS000075.JPG](https://qiita-image-store.s3.amazonaws.com/0/159178/69f7f4af-1051-eb7c-f90d-fd40ac74b03c.jpeg)


そんなに難しくありませんね。

#まとめ

このご時世、利用者への情報通知方法というのは本当に山ほどあり、利用者のライフスタイルによって異なるのだと思います。その際にケース毎に仕掛けをつくっていてはキリがありませんので、このように基本としてメール通知にしてしまい、そこからの通知のディスパッチを利用者が決めていくという、ある程度自由度を持った設計が合うのかなと思います。
超初心者向け　Google Analytics

#今日の目的
Google Analyticsがよくわからない人のための見るべきものの見方と実際的な使い方を説明します!

---

#目次
- ログイン方法
- Google Analyticsってなに？
- 違いの分かりづらい単語
- レポートについて
- 実際どうやって使うの？

---

#ログイン方法

http://analytics.google.com/analytics/web/ 

---

#Google Analyticsって何？
- Webアクセス解析ツールです。
- メディア(ex.リフォマ,コーポレートサイト)の長所、短所等を分析することができます。
- Google Analyticsは解析だけでなく、指標が記入されたレポート作成も行えます。
- サイトを運営する上での「把握」と「改善」のための課題を見つけることができます。

---

#違いのわかりづらい単語
- セッション数:リフォマに何回来たか(訪問数)
- ページビュー数:リフォマでみたページの数(PV数)
- ユーザー数:リフォマに来た人の数


---
#レポートについて
Google Analyticsは、自分の見たい情報ごとにまとめられる

- デフォルトのレポート

1. リアルタイム:現在のアクセス状況を見られる
2. ユーザー:アクセスしたユーザーの情報が見られる
3. 集客:ユーザーがどこからアクセスしたか見られる
4. 行動:サイトに来てどんな行動をとったか
5. コンヴァージョン:設定した目標の達成数(成約数等)

---

##リアルタイム
 正直言葉通りのリアルタイム、現在のアクセスを見られるレポートです。

- 何人きているのか
- どんな人が来ているのか
- どこのサイト・キーワードからきているか
- どこを見ているか
- どこで見ているか
- どの端末で見ているか


---

##ユーザーレポート
　ここではどんなユーザーが何回来たかを知ることができます。

- 新規とリピーターの割合
- 国や地域
- OS　　　
- etc...

---

##集客
　ここではサイトに来たユーザーがどうやって来たのかを知ることができます。

- Organic Search:自然検索
- Direct:参照元サイトがない
- Referral:SNS以外の参照元サイト
- Social:SNS
- Paid search:リスティング等の広告流入
- etc...
- 詳しくはこちら
https://support.google.com/analytics/answer/3297892?hl=ja

---

##行動
ここではユーザーがリフォマに来た時の動きをまとめてあります。

・どこに最初に着いたのか
・どのページから離れていっているのか(離脱率)
・最初に着いたページからそのまま帰ったのどのくらいだ(直帰率)
etc...

---

##コンヴァージョン
設定した目標に何人たどり着いたかを知れます。

リフォマであれば、
- 見積もりボタンを押した回数
- 見積もりフォームを入力し、送信した数
etc...

--- 
#実際どうやって使うの？
- ページ間でのセッション数を比較してページ間で差が出ている理由を見つける。
- 週間でのPV数等のデータをメールで定期的に送信させる。
- 新規サイト計画を進める際、過去のデータから新規計画の目標を算出する。
- データを基にしたユーザー属性からユーザー像を作り、サイトのユーザビリティに反映させる。
Ardour起動メモ。

# 概要
オープンソースのDAW「Ardour」について、とりあえず起動までできたのでメモっておく。

ArdourはオープンソースのDAWで中身のソースコードを閲覧可能。
オーディオ・オートメーションの他、VSTについても取扱可能。
ちょっと挙動と中身を突き合わせて確認しようとしたんだけど、どうも設定とか用意しないと動かないっぽいので、一度起動できる環境を構築してみた。

OSはWindows10。

# 手順

* Jackをインストール（今回はWindows10のため、64bit版を用いる）
http://jackaudio.org/downloads/
* ~~Jack PortAudio（サーバ起動プログラム）を起動する~~
* Ardourを起動する

追記：
Jackサーバ起動しなくてもArdourだけ起動すれば勝手にドライバ等を起動してくれるのをあとで知った（＋動作を確認した）けど、試した段階ではそんなこと知らなかったのですorz
まぁ上記の手順で動かなかったら元々の方法試すのがいいかと。
（実際JackのインストールしないとArdourは起動できないので、Jackインストールの際PortAudioのDLLとかを一緒に持ってきたものと思われる）

# Jackってなんだ
概要（みんなだいすきWikipedia）
https://ja.wikipedia.org/wiki/JACK_Audio_Connection_Kit

アプリケーション間でオーディオおよびMIDIメッセージのやりとりを行うためのサーバデーモン（サービス・プロセス）。

この時各種ドライバを用いてオーディオとMIDIのやりとりを行うみたい。

あと参考資料
http://libremusicproduction.com/articles/demystifying-jack-%E2%80%93-beginners-guide-getting-started-jack

# 気になること（未解決事項）

どうも、Jackサーバが正常な方法で落っこちてくれない。
デバイスを指定する等条件が加わるのであればバッチで組んでJackコマンドライン起動、終了の際はCtrl+C等で終了するのがマシだと思われる。

あとWindowsの場合、他のOSと作法が違うみたいなので注意しないとかも。
http://jackaudio.org/faq/jack_on_windows.html

# 最後に

いずれにせよとりあえず動いた形なので、ちょっくらDAWってどうやって作ってんだろってのを調べてきます。
PHP+HTML+JSでレスポンシブ対応のロールプレイングゲーム作ってみた

セーブデータ管理をMySQL、メインの処理をPHP、フロントの表示周りをHTML+CSS+JS(jQuery)、フロントとバックの通信をajax通信でやっています。

普通の動的Webサイトで使われている技術のみを使っています。

『リブラの見た夢 ONLINE』
https://libra-online.laineus.com
（chrome以外未検証）

![Screenshot from 2017-02-23 21-38-05z.png](https://qiita-image-store.s3.amazonaws.com/0/151137/75c5c4a8-87bf-fa1e-56ef-941108bf94d0.png)


昔流行った『FF Adventure』みたいなCGIゲーム的なものですかね。
ページ遷移こそしないものの、ボタン押したりするたびにHTTPリクエストが発生します。

セーブデータはサーバーに保管されるので、他のプレイヤーが育てたキャラと非リアルタイムな対戦ができます。

Webサイトだからできるレスポンシブ対応なゲームになっています。

![20170224_2-.png](https://qiita-image-store.s3.amazonaws.com/0/151137/8fb0e7b0-c624-e12b-ea3f-fb65a476fd62.png)


一つ一つがHTMLのDOM要素で作られているので、デベロッパーツールで要素検証したり、ブラウザのウィンドウ幅動かしたりしてWeb感を多能してくださいませ。


# 処理のざっくりした流れ

1. まず画面上でボタン(HTML要素)をクリックすると、「何をクリックしたか」に関する情報を持ってサーバーサイドへリクエストが送られます。（jQueryのajax）
2. サーバーでは、送られたアクションに基づいて計算をしたり、DBのデータを書き換えたりします。（PHP）
3. そして、次に表示するべき内容がフロントに返ってきます。
4. 返ってきた内容に基づき、jQueryでHTMLを書き換えたり、アニメーションさせたりします。

これらのフローが、ゲーム画面でボタンを押すたびに繰り返されます。

##フロントとサーバーサイドのそれぞれの役割
例えば戦闘画面にてユーザーが、「敵Aを攻撃」というアクションをした場合、
フロントは最初、「敵Aを攻撃」という情報以上持たないままサーバーへ投げます。
「ダメージはいくつになるか」などの計算はサーバーが担当します。
そして再びフロントへ戻り、ダメージを与えたことを視覚的に表示します。

フロントはユーザーのアクション受け渡しと描画に徹し、計算やデータ更新をサーバーに任せることで、不正なアクションを防ぎます。

て書いて気づきましたが、別にこれゲームに限った話じゃないですね。動的Webサイトがやってることそのまんまでした。

#おわりに
特に真新しい技術は使っていませんし、自分がまだweb経験の浅い頃からちまちま作っていたものなので、ところどころ作りが微妙だったりします。

当初はPHP+HTMLでゲーム作ったら斬新じゃね？
みたいなこと思って作り始めた気がしますが、改めて調べたら普通にあるみたいですね。
ブラウザ三国志みたいな商業化されたものまで。

ゆるーく遊んで頂けると嬉しいです。

#追記

セキュリティがどうなっているか気になる、というコメントをいくつか見かけたので追記します。

（セキュリティというのは「人のアカウントへログインできたりしないか」「人のデータを不正に操作できないか」などのことですかね？）

基本的には、ごく普通の会員制Webサイトと変わりありません。

まずは一般的なログイン判定をサーバーで行います。

その後のアクションだと、例えば、「アイテム10番を削除」みたいな処理が飛んできたら、サーバー内でログインセッションやDBと照合し、アイテム10番が本当にその人の持ち物だったら削除、みたいな感じです。

データの持ち方もごく普通で、プレイデータや暗号化されたパスワードなどがMySQLへ格納されます。
Custom Gravity Plugin #UE4 #UE4Study

# Custom Gravity Plugin

## Githubからプロジェクトをダウンロード
OSCPluginがマーケットプレイスではなくて、Githubにあった。
他にもUE4Pluginがないか調べていたら面白いプラグインを発見した。

UE4-CustomGravityPlugin
https://github.com/mhousse1247/UE4-CustomGravityPlugin

## Sample Mapを試してみる

### Start_Map
5つあるサンプルのMapを選べる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/25ca5df5-f702-3501-c6f1-e4772d17b16f.png)

### 2DGravity_Map
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/a621b487-2f5d-14e3-247e-c966bbe8c22d.png)

### GravityDash_Map

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/839cf3d9-c156-d91e-d77a-06d9243a8c54.png)
### GravityRoom_Map
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/5a35e0fe-4e37-fc36-00ff-2e8bc35726bf.png)



### PlanetGravity_Map

球体上を1stPersonで移動できる
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/32a1242e-40ec-6621-2592-1e71bdf2acdd.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/cd8f616b-a6b5-0de9-a829-76d4ed2da9be.png)


### SurfaceGravity_Map

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8c8dd59e-83fc-6d04-4e8d-596b5b7ad155.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/39b834bb-f5aa-3311-7dc9-3acba4bcf3f6.png)
MongoDB 3 x Ubuntu 14.04 の最初の設定

## こんな warnings が出ている場合

```
Server has startup warnings: 
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] 
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] 
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2017-02-22T09:12:31.302+0000 I CONTROL  [initandlisten] 
```

## これで解決!

- sudo apt-get install sysfsutils
- vim /etc/sysfs.conf

```
kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never
```

- sudo /etc/init.d/sysfsutils restart
- sudo service mongod restart
RailsでPDFのテキストを読み込んでみる Pdftotext編

[RailsでPDFのテキストを読み込んでみる pdf-reader編](http://qiita.com/kijitora-neko/items/2eae2b2b68b48e89458f)
[RailsでPDFのテキストを読み込んでみる Poppler編](http://qiita.com/kijitora-neko/items/35c43769a0846b37e313)

表形式のPDFからテキストを取り込む際に前回の`poppler`では空白がtrimされてしまっていたため、[Pdftotext](https://github.com/benbalter/pdftotext/)を試してみた。

## gemのインストール
事前に`brew install poppler`でpopplerをインストールする（前回実施済み）
Gemfileに`gem 'pdftotext'`を追加して`bundle install`

## Pdfの読み込み
* 前回作成したRailsのタスクを修正する

```lib/tasks/read_pdf.rake
namespace :read_pdf do
  desc 'PDF読み込み' # rake -T で表示する説明
  task read: :environment do
    # Report.pdfの読み込み処理
    reader = Pdftotext.text('pdf/sample.pdf') # 読み込むPDF名
    puts reader                       # 読み込んだテキストの出力
  end
end
```

実行してみると

```
$ rails read_pdf:read
PDF サンプルデータ

お知らせ PDF サンプルデータお知らせ PDF サンプルデータお知らせ PDF
サンプルデータお知らせ PDF サンプルデータお知らせ PDF サンプルデー
タお知らせ PDF サンプルデータお知らせ PDF サンプルデータお知らせ
PDF サンプルデータお知らせ PDF サンプルデータお知らせ PDF サンプル
データお知らせ PDF サンプルデータ
                      お知らせ PDF サンプルデータお知らせ
                      PDF サンプルデータお知らせ PDF サ
                      ンプルデータお知らせ PDF サンプル
                      データお知らせ PDF サンプルデータお
                      知らせ PDF サンプルデータお知らせ
                      PDF サンプルデータお知らせ PDF サ
                      ンプルデータお知らせ PDF サンプル
                      データお知らせ PDF サンプルデータお
                      知らせ PDF サンプルデータ




お知らせ PDF サンプルデータお知らせ
PDF サンプルデータお知らせ PDF サ
ンプルデータお知らせ PDF サンプル
データお知らせ PDF サンプルデータお
知らせ PDF サンプルデータお知らせ
PDF サンプルデータお知らせ PDF サ
ンプルデータお知らせ PDF サンプル
データお知らせ PDF サンプルデータお
知らせ PDF サンプルデータ

$ 
```

表形式のサンプルではないが、`poppler`ではimageのあった部分が詰まって取得されていたが、`pdftotext`では、image部分が空白となり、PDF上でのlayoutに近い状態で取得できる。
Windows版 Neovim+dein.vimでハマった事


# 最近行った苦行

Neovim+dein.vimをWindowsに入れるという苦行をこの数日間していました。
多分、既知の情報が多いと思うのですが、そもそもあまりにもこの苦行に挑戦する人が少ないようなので、知見を広める意味でもここにメモ。

# Python3

Python3がWindows版Neovimはそのままでは動かせないらしい。
[Windows 版 neovim で python3 (deoplete.nvim) を無理やり使う](http://qiita.com/huyu398/items/783495ee5e7ba55f4aa1)
↑この記事を参考に無理くり直しました。


# vimrc的な奴がいる所

    C:/Users/%USERNAME%/AppData/Local/nvim/init.vim

最初この位置が分からず四苦八苦していました。
分かってしまえば簡単。

    :e  ~/AppData/Local/nvim/init.vim

これで設定ファイル開いて色々設定できました。

# %USERNAME%に空白を入れてる馬鹿を救うためのコード

    let s:dein_dir = fnameescape('$HOME\AppData\Local\nvim\.cache\dein')
    let s:dein_repo_dir = s:dein_dir . '\repos\github.com\Shougo\dein.vim'
    if &runtimepath !~# '\dein.vim'
        execute 'set runtimepath^=' . fnameescape(s:dein_repo_dir)
    endif

僕はユーザーネームを「Arc Cosine」というアホな名前にしているのでここで散々ハマりました。
例えば、「Program Files(x86)」みたいなディレクトリに入れて爆死した人もこの書き方が参考になるのでは無いでしょうか。
fnameescape関数を使えば、空白が入ったディレクトリを問題なく扱うことができます。

ちなみに、「/」だとダメで、「\」とオッケーでした。
Windowsってやっぱりクソだわ。

# 他に役立った事

chocolateyがあれば大体なんでも行ける。
Python、make、nodeその他大体chocolateyで入れればなんとかなったので、chocolateyお薦め。
.gitignoreファイルの作り方

#.gitignoreの作り方


- windowsでは拡張子だけのファイルは作れない。

![e58550a3d632e6e4c04ca629b4c14adc[1].png](https://qiita-image-store.s3.amazonaws.com/0/139120/1e8fcef6-5fbd-c65a-30fb-47192088e964.png)
↑.gitignoreを保存しようとするとエラーが出る。

##.gitignoreファイルを作る方法
1. gitignore.txtを作る。(gitignore.txtは.gitignoreファイルを保存したいフォルダに保存しておく。)
2. gitignore.txtに.gitignoreに書きたい内容を書く。
3. gitignore.txtを保存したフォルダ上を、SHIFTを押しながら右クリックして、"コマンドウインドウをここで開く"を選択。
※Windows10Insider Preview Build 14971以降は"PowerShellをここに開く"になってる。
4. 黒い画面が開いたら `ren gitignore.txt .gitignore` と入力してEnter。
MacでOperation not permittedが出た時の対処法

`/usr/bin`にファイルを移動しようと思っても，`Operation not permitted`でなかなか移動できない
なので，http://berukann.hatenablog.jp/entry/2015/12/30/123020 を参考にさせていただきました

## 移動できない原因
* OS X 10.11 El Capitanより追加されたセキュリティ機能，SIP（System Integrity Protection）によってガードされている
* /bin /sbin /System 配下で，ルートユーザでも書き込みできない

## 対処方法
1. Macを再起動し，`command + R`を押し続けてリカバリーモードにする
2. 上のバーから，ターミナルより，  コマンドを打ち込む

```
$ csrutil status
```  

状態が`enabled`になっていると思う　<- これが元凶

3. 設定を変更し，再起動する

```
$ csrutil disable

$ reboot
```

これで，ファイルを移動できる
内閣府のCSVデータがひどすぎる件

これがオープンガバメント。さすがポスト真実に生きる日本のやったふりだけの安倍政権でできるデータはこんなもの。


```休日.csv
平成28年（2016年）,,平成29年（2017年）,,平成30年（2018年）,
名称,月日,名称,月日,名称,月日
元日,2016/1/1,元日,2017/1/1,元日,2018/1/1
成人の日,2016/1/11,成人の日,2017/1/9,成人の日,2018/1/8
建国記念の日,2016/2/11,建国記念の日,2017/2/11,建国記念の日,2018/2/11
春分の日,2016/3/20,春分の日,2017/3/20,春分の日,2018/3/21
昭和の日,2016/4/29,昭和の日,2017/4/29,昭和の日,2018/4/29
憲法記念日,2016/5/3,憲法記念日,2017/5/3,憲法記念日,2018/5/3
みどりの日,2016/5/4,みどりの日,2017/5/4,みどりの日,2018/5/4
こどもの日,2016/5/5,こどもの日,2017/5/5,こどもの日,2018/5/5
海の日,2016/7/18,海の日,2017/7/17,海の日,2018/7/16
山の日,2016/8/11,山の日,2017/8/11,山の日,2018/8/11
敬老の日,2016/9/19,敬老の日,2017/9/18,敬老の日,2018/9/17
秋分の日,2016/9/22,秋分の日,2017/9/23,秋分の日,2018/9/23
体育の日,2016/10/10,体育の日,2017/10/9,体育の日,2018/10/8
文化の日,2016/11/3,文化の日,2017/11/3,文化の日,2018/11/3
勤労感謝の日,2016/11/23,勤労感謝の日,2017/11/23,勤労感謝の日,2018/11/23
天皇誕生日,2016/12/23,天皇誕生日,2017/12/23,天皇誕生日,2018/12/23
,,,,,
月日は表示するアプリケーションによって形式が異なる場合があります。

```
https://twitter.com/i/moments/834190855137226752


むしろ作る方がむずかしいきもするが。アプリケーションのせいにするのはものづくり日本としてはよくないな。
複数サブドメ&Apache2.4~環境では macro が便利で簡単

  
#利点
Macroを使うと、
６ファイルあり、それぞれを別に編集したり、
インクルードしたりしていたコンフィグ類を、１ファイルに集約でき、
更新漏れもなくなりますね。

# apache2.4のMacro例

複数編集の必要があったコンフィグを、超絶管理しやすいコンフィグに修正した例をどうぞ
sedの部分を消して自分用に直せばちゃんと動きます。

### マクロ化した 6サーバ分のコンフィグ


```apache

  <Macro VHost $name $domain>
  <VirtualHost *:443>

      SSLStrictSNIVHostCheck off
      SSLCompression off

      AddDefaultCharset UTF8
      ServerSignature Off

      DocumentRoot "/var/www/$name"

      ServerName $domain

      SetOutputFilter DEFLATE

      Header set Strict-Transport-Security "max-age=30;"

      ### SSL設定
      ErrorLog "/var/log/httpd/$name.error_log"
      CustomLog "/var/log/httpd/$name.access_log" combined env=!nolog

      LogLevel warn
      SSLEngine on
      SSLProtocol all -SSLv2 -SSLv3
      SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
      SSLCertificateFile /etc/httpd/conf/ssl/$domain.signed.crt
      SSLCACertificateFile /etc/httpd/conf/ssl/internal.$domain.crt
      SSLCertificateKeyFile /etc/httpd/conf/ssl/$domain.com.key

      <Files ~ "\.(cgi|shtml|phtml|php3?)$">
      SSLOptions +StdEnvVars
      </Files>
      BrowserMatch "MSIE [2-5]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0

      ### 外部ファイルに記載したSED 停止
      ExtFilterDefine cdn mode=output intype=text/html cmd="/bin/sed -f /etc/httpd/conf.d/cdn.sed"
      <Location />
        SetOutputFilter cdn
      </Location>

      RewriteEngine On
      SSLProxyEngine On
      DirectorySlash On
      RewriteCond %{REQUEST_METHOD} ^GET$

      ### カテゴリを調整
      RewriteRule /store/aaaaaaaaa     /products/list.php?category_id=1 [P]
      RewriteRule /store/bbbbbbbbb     /products/list.php?category_id=2 [P]
      RewriteRule /store/ccccccccc     /products/list.php?category_id=3 [P]
      RewriteRule /store/ddddddddd     /products/list.php?category_id=4 [P]

    </VirtualHost>
   </Macro>
  Use VHost master domain.com
  Use VHost tokyo tokyo.domain.com
  Use VHost nagoya nagoya.domain.com
  Use VHost oosaka oosaka.domain.com
  Use VHost fukuoka fukuoka.domain.com
  Use VHost hokkaido hokkaido.domain.com
 
  UndefMacro VHost

```
Google Maps APIの有償/無償の線引き

- [Google Maps API 価格とプラン](https://developers.google.com/maps/pricing-and-plans/?hl=ja)

こちらの価格とプランページで、「誰でも無料で使えるアプリやウェブサイト」であれば無料ですよということは分かるのですが、具体的にどういうことなの？と思ったので、サポートに聞いてみました。

なお、今回はwebアプリで使う想定ですm m

## "誰でも"に該当する例

- ログイン不要
- ログインが必要だが、会員登録の際に制限が無い

## "無料で"に該当する例

- 文字通り、サービスが無料で使えれば良い
- Adの掲載はオッケー


面白かったのは、ログイン/未ログインで見れるページにGoogle Maps APIを使って地図を埋め込む際、例えば会員登録に年齢制限があった場合にはログイン後は上記の「誰でも」に該当しないので有償プランの契約が必要になるとのことでした。

サイトからお問い合わせすると、小一時間程でコールバックしてくれるかつ、日本語で対応してくれるので、疑問に思ったら気軽にお問い合わせすると良いかもです。
Dockerを使ってMacOSX環境でCaffeの実行環境を作る


##■背景
今更だけど、Deeplearningとかやりたいよね。  
環境整備メンドイよね。という訳で、誰かDockerで配布していないかなと考えた次第。
私はDocker使うの初めてです。

##■やること
1. VirtualBoxをインストールする
2. Dockerをインストールする
3. Docker indexから良い感じのイメージを探す
4. Dockerの環境を作る
5. Caffeが入ったdocker-imageをダウンロードする
6. Dockerイメージからコンテナを動かす
7. 動かす

### 1. VirtualBoxをインストールする
公式サイトからダウンロードしてインストールして下さい。
https://www.virtualbox.org/wiki/Downloads


### 2. Dockerをインストールする
Homebrewでインストールしました。他の環境は知りません。

```bash
$ brew install docker
```


### 3. Docker indexから良い感じのイメージを探す
Caffeが動くやつなら何でも良いのでテキトウに選ぶ。今回はこれにした。
https://hub.docker.com/r/kaixhin/caffe/


### 4. Dockerの環境を作る
Caffeが入ったDockerイメージをダウンロードしようとすると、下のように失敗する。

```bash
$ docker pull kaixhin/caffe
Using default tag: latest
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon. Is the docker daemon running on this host?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
```

MacOSXにはLinuxカーネルが無いからVMを配置する必要があるからとのこと。
以下のコマンドでカーネルを引っ張ってくる必要がある。

```bash
$ docker-machine create --driver virtualbox default
```


### 5. Caffeが入ったdocker-imageをダウンロードする

今度こそ```docker pull```でイメージを持ってくる。

```bash
$ docker pull kaixhin/caffe
```


### 6. Dockerイメージからコンテナを動かす
普通にDockerのイメージを使ってUbuntuを起動するだけ。
caffeと名前を付けた。

```bash
$ docker run --name caffe -i -t kaixhin/caffe /bin/bash
```


### 7. 動かす
Pythonのターミナルから、Caffeのimportを試してみる。

```bash
$ python
Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
[GCC 4.8.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
```

下のようなエラーが出て来るが問題無いらしい。
他にもmatplotlibがどうとか出てくるけど、2回目にはなくなります。

```bash
libdc1394 error: Failed to initialize libdc1394
```

一応、以下のコマンドで修正可能出来ます。

```bash
$ sudo ln /dev/null /dev/raw1394
```

dockerのコンテナを起動する度に毎回やる必要があって面倒なので、私は.bashrcに書きました。

### あとがき
とりあえずインストールだけです。
使ってみた話については後日書くようにします。

### 参考
* https://hub.docker.com/r/kaixhin/caffe/
* http://qiita.com/butada/items/4044c5efd03341c8afef
* http://ouranos.sakura.ne.jp/wordpress/2016/02/20/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-caffe-%E3%81%9D%E3%81%AE1-%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/