OmniAICreator/Qiita-1.07M huggingface dataset:
Docker関連書籍まとめ(2016/06/27)

# この記事について
最近調査(2016/6/27時点)に使用した書籍について記載します。
目についたところ、気になったところをメモ書き程度に抜き出しているだけなので
本を実際に読んだほうがいいと思います。
また、Docker関係は進歩が早いので出来るだけ新しい書籍を使うことをお勧めします。

# WEB+DB PRESS plusシリーズクラウド開発徹底攻略
出版日:2016年5月13日
http://gihyo.jp/book/2016/978-4-7741-8095-3
AWS,Docker,GCP,Herokuの特集から構成されています。
Docker自体は36P

電子書籍でも販売がされています。
Dockerの基本的なコマンドについてはほとんどありません。
どちらかと言うとDockerをどうやって使っていくかという内容になります。
以下はメモ程度に抽出したものになります。

## Dockerのいいところ
・開発者がアプリケーションをイメージに保存
・イメージをインフラに共有
・インフラが本番まで運ぶ
・開発環境で動いていたものをそのまま動かす
・Dev-OPSの担当範囲が分離される

## わるいところ
・コンテナ自体を管理するコスト
・学習コストは高い
（枯れていない技術なので)

## Dockerを活かすための原則
・1コンテナ1プロセス
・コンテナはいつでも捨てられるようにしておく。
例えばログはコンテナ外に出したり

## Railsを例にしたデプロイ
Railsアプリの場合
・Rails
・nginx
・MySQL
ごとにコンテナを作る。

### kubernetsを利用したデプロイ
KubernetsにはPodという概念がある。
VOLUMEが共有できる。


# Docker実践入門
出版日:2015年8月
http://gihyo.jp/book/2015/978-4-7741-7654-3
Dockerの概念的なところから実際のコマンドまで書かれています。
Kubernetesまで記載されているので、この本を読めば一通り使えるようになると思います。

## DockerのProductionリリース
図1.3が参考になりそう。
テストサーバ上で動作確認をしてそのままの状態でコンテナ用のイメージとして保存。
コンテナを本番に配置して起動
（ただしこの例はかなり簡易化されており、Blue Green Deployとかは考えてない)

## Immutable Infrastructureによるインフラ管理
Immutable Inftastructure: 不変なサーバ基盤
Dockerでは1つのコンテナイメージに複数のアプリケーションを含めることはできるが、あまりオススメしない。
コンテナイメージを作り直した時にどこが設定変更したかわからなくなるから

# Docker実戦活用ガイド
上の本と名前が紛らわしい本。
https://book.mynavi.jp/ec/products/detail/id=53069
出版日:2016年5月26日といま出版されているDocker本の中では最新
最近オープンベータ化されたDocker for Macについてインストール方法や使い方が乗っているのが特徴
(本ではオープンベータする前の話なのでインストール方法は若干違うかも)

前半はDockerコマンドの実行方法についてで、割と初心者向け。
中盤はDocker Machine/Docker Swarm/Docker ComposeなどDockerを利用するためのシステムが乗っていてよい。
ただ、後半は簡易ジャッジシステムというPaizaクローンを作る話で、本質的にはDockerはあまり関係ないのがマイナス点。
また、サンプルコードがweb上に無い(見つけられなかっただけかな）ため、後半のスクリプトの実行とかはかなり大変。
kubernetesとかの記述も無い。
Dockerのコマンドについて勉強したい。という人向けの本。

# Docker実践ガイド
出版日:2015年12月21日
http://book.impress.co.jp/books/1115101002.php
・Dockerの導入のメリットやデメリット。
・こんなシステムはあまりDockerに向かない
（※いわゆる基盤系の交通インフラ等の止まったら困るシステム)
・Docker検討項目の洗い出し
というインフラ管理者向けの話から始まる。
どのOSがいいかという比較

Dockerを使う。という立場よりDockerを導入するという立場から書かれた本。
他の本はDockerを使うところに重きを置いているが、Dockerの導入というところに重きを置かれた本は少ないので、参考になる。


# どの本を読むべきか
・本当に初心者。 Dockerを使えるようになりたい。
Docker実戦活用ガイド
・Dockerの周辺技術(コンテナの配置など)含めて読みたい
Docker実践入門
――Linuxコンテナ技術の基礎から応用まで
・Dockerの導入を検討したい。
Docker実践ガイド
・Docker周りの話も含めて幅広く読みたい
WEB+DB PRESS plusシリーズクラウド開発徹底攻略
resources.designer.csが複数生成される現象の対処法

なんかよくわからないけど、Visual StudioでResourcesファイルのデザイナーファイルが二つできるとかいうおかしい現象が発生して、修正方法が分かったので、記載。

---
Resources.resxをデザイナで編集していたが、
気が付いたら、[resources.designer1.cs]というファイルが
自動生成されていて、コンパイルが通らなくなった。
上記ファイルを削除してコンパイルすると通る為、
削除してからコンパイルすればよいが、何故かResources.resxを保存する度に生成される。
むしろ、1がついていない.csが更新されていない。

んで、ググったらこんなんでた。
[Weird “Designer1.cs” files created](http://stackoverflow.com/questions/2551594/weird-designer1-cs-files-created)

例に漏れず英語力が無いので、教えてグーグル翻訳先生をしたら下記の書き込みが
「関連ファイルに関する情報は、プロジェクトファイル（* .csproj）で書かれています。これは、問題を解決することがあります。」

なるほど。よくわかる。
ということで、.csprojをテキストで開くと下記の様な記述を発見

```xml
<EmbeddedResource Include="Properties\Resources.resx">
  <Generator>PublicResXFileCodeGenerator</Generator>
  <SubType>Designer</SubType>
  <LastGenOutput>Resources1.Designer.cs</LastGenOutput>
</EmbeddedResource>
```

他にresources1の記述が無いので、一旦プロジェクトを閉じた後、
[1]を削除し、保存。

```xml
<EmbeddedResource Include="Properties\Resources.resx">
  <Generator>PublicResXFileCodeGenerator</Generator>
  <SubType>Designer</SubType>
  <LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
```

正常にプロジェクトが開けて、Resources.resxを何度保存しても、
[resources.designer1.cs]とかいうファイルは生成されなかった。

原因は不明だが、頻発するものでもないだろうから、
対処法が分かればとりあえずは、良いかと。
ActiveRecordで発行されたクエリの数を計測してテストに利用する

#特定の処理中に発行されたクエリ数を取得する

気を抜くとN+1問題がすぐ起こりそうな場所があったので
RSpec上で特定の処理中にActiveRecordが発行したクエリの数を取得してみました。

```rb
thread = Thread.current
count_up = lambda do |*_args|
  return unless thread == Thread.current
  query_count += 1
end
ActiveSupport::Notifications.subscribed(count_up, 'sql.active_record') do
  User.count
end
p query_count # => 1
```

ActiveSupport::Notificationsの仕組みを使えばSQLの実行数の他にもテンプレートのレンダリング数とかいろいろ便利に利用できると思います。
Thread.currentのチェックを入れているのはRSpec中にJobをThreadに流しているからです。

#参考になりそうなところ

http://edgeguides.rubyonrails.org/active_support_instrumentation.html
GPU accelerated Caffe on CentOS 7

# 事前準備
基本的には以下のページを参照．予め，関連するソフトウェアをインストールしておく必要がある．(特にcuDNN等)
http://caffe.berkeleyvision.org/installation.html

# Caffeのダウンロード

GPUを使うので，NVIDIAのGithubからダウンロードする．

```
git clone https://github.com/NVIDIA/caffe.git nvidia_caffe
```

# Make.configファイルの編集

```
$ cd caffe
$ cp Makefile.config.example Makefile.config
```

## CUDNNの設定
GPUを有効にするためには,　Makefile.configの中で，

```
USE_CUDNN := 1
```

とする．　いま，CUDNNのヘッダファイルとライブラリは以下にインストールされていると仮定する．
```
CUDNN_INCLUDE := /usr/local/cudnn/include
CUDNN_LIB := /usr/local/cudnn/lib
```

また，今回使用するデバイスがTesla M40であるため，デバイスに応じたCompute Capabilityの設定を行う．が5.2用の設定をする．(設定しなくても動く)．
各GPUのCompute Capabilityは以下を参照．
https://developer.nvidia.com/cuda-gpus

具体的には， Makefile.config中のCUDA_ARCHを以下のようにする．　

```
CUDA_ARCH := -gencode arch=compute_20,code=sm_20 \
             -gencode arch=compute_20,code=sm_21 \
             -gencode arch=compute_30,code=sm_30 \
             -gencode arch=compute_35,code=sm_35 \
             -gencode arch=compute_50,code=sm_50 \
             -gencode arch=compute_52,code=sm_52 \
             -gencode arch=compute_52,code=compute_52
```

## Blasの設定
Blasの設定を行う．　AtlasかMKLかOpenBlasが利用可能．

### OpenBlasを使用する場合
Makefile.configのBLASの項目をを以下のように編集する.

```
BLAS := open
```

### Atlasを使用する場合

CaffeのデフォルトのBLASライブラリの設定はAtlasである．
CentOS7でも，

```
yum install atlas-devel
```

とすると，Atlasのヘッダファイル(BLAS_INCLUDE)とライブラリ(BLAS_LIB)が以下にインストールされる．

```
BLAS_INCLUDE := /usr/include/atlas
BLAS_LIB := /usr/include/lib64/atlas
```

ただし，ビルドの際，Caffeでは，cblasとatlasのライブラリを探すが，CentOS7から名称がsatlasとtatlasに変更されたようなので，Makefile中を以下のように変更する必要がある．

```
78c378
< 			LIBRARIES += cblas atlas
---
> 			LIBRARIES += satlas tatlas
```

# Makeの実行
その後，以下を行う．計算機上のプロセッサの総コア数がnとする．

```
$ make -j n all
$ make -j n test
$ make runtest
```

ただし，1台の計算機に複数のGPUデバイスが装着されている場合，runtestがfailするので以下の様にする．

```
$ export CUDA_VISIBLE_DEVICES=0
```
zabbix_server.confなどのパラメータ調整

RDS切り替え(スケール込み）メンテ時の負荷調整の備忘録です。
zabbix-proxy経由の通信が詰まって"Zabbix trapper processes more than 75% busy"という状況、
proxy経由のTCP通信のCLOSE_WAITが増えると状況悪化、ということで色々調べた結果以下を調整しました。

####キャッシュと待ちうけの上限とタイムアウトを広げるなど

```conf:zabbix_server.conf
-# StartPollers=5
+StartPollers=50

-# StartTrappers=5
+StartTrappers=40

-CacheSize=256M
+CacheSize=512M

 # StartDBSyncers=4
+StartDBSyncers=6

-TrendCacheSize=64M
+TrendCacheSize=256M

-ValueCacheSize=32M
+ValueCacheSize=256M

-Timeout=5
+Timeout=30
```

####RDSにきてる自動登録が無駄に重複してたので消して自動登録しなおし
あるひとつのzabbix-proxy経由の処理がいまいちだった(待ちが他よりとても多い)ため先輩がhost丸ごと消して登録しなおしたら負荷がだんだんと無風状態に。（show processlist;かなんかでクエリをみたら登録クエリがやたら走ってたと。）


ちなみに、Trapperが受け付けられない状況だと"Zabbixサーバーが動作していません（画面のリフレッシュを行ってステータスを再確認して下さい）"も出ますね。（それは上記のパラメータ調整である程度回復しましたがそのあと再登録しなおすまでRDSのCPUとTrapperの使用率がやたら高くてCLOSE_WAITが多かったっす）

####zabbixサーバの状態を確認する方法

いちおうこんなかんじで↓

監視データ＞最新データ＞グループとホストをzabbix-serverが載ってるやつを選択＞	Zabbix server (26アイテム)を展開＞最新のデータやグラフを見る

この辺の使用率からたらなそうなパラメータを調整する認識です。

####参考：

zabbixまわり
http://www.zabbix.jp/node/2987
http://kodai74.blogspot.jp/2011/02/zabbix-1618.html
http://www.zabbix.jp/node/2694
http://kometchtech.blog.fc2.com/blog-entry-1174.html

TCPまわり
http://koseki.hatenablog.com/entry/20070331/closewait

RDSまわり
http://bekkou68.hatenablog.com/entry/2014/09/16/200122
http://qiita.com/smallpalace/items/6697237f97e85d479481
backgroundのDrawableの分だけサイズを確保するView

雑にdivider引くときめんどくさかったので。

```CustomView.java
public class CustomView extends View {

    public CustomView(Context context) {
        this(context, null);
    }

    public CustomView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable background = getBackground();
        int width = background != null ? background.getIntrinsicWidth() : 0;
        int height = background != null ? background.getIntrinsicHeight() : 0;

        setMeasuredDimension(
                View.resolveSize(width, widthMeasureSpec),
                View.resolveSize(height, heightMeasureSpec));
    }
}
```
Mac OS XのChromeでAutoSelectCertificateForUrlsを設定する


### 設定ファイルを直接編集する場合

~/Library/Preferences/com.google.Chrome.plist

    Key: AutoSelectCertificateForUrls
    Type: Array
        Key: item 0 
        Type: String
        Value: {"pattern":"https://example.com","filter":{"ISSUER":{"CN":"Example CA"}}}

### ターミナルから設定する場合

    defaults write com.google.Chrome AutoSelectCertificateForUrls -array-add -string '{"pattern":"https://example.com","filter":{"ISSUER":{"CN":"Example CA"}}}'

### 設定確認方法

Chromeの入力欄に

    chrome://policy

と入力して「ポリシーを再読み込み」ボタンを押す
Windows10でRubyOnRailsの開発環境を構築する 

#構築する環境の前提条件
Windows10の環境にRubyOnRailsの開発環境を構築する際に、
そこそこ躓いた所があるので、備忘録として記載します。
環境としては、

- Windows 10 Pro x64
- RubyInstaller-x64(ruby 2.2.4)
- Rails 4.2.6
- Node.js(V8)

#インストール手順
ここからインストールを行います。
私の環境が64bit版なので、そこは適宜変えて下さい。

##Rubyのインストール
まずはこれがないと始まらない、Rubyをインストールします。
インストール方法は色々ありますが、今回はインストーラーを実行するだけでセットアップしてくれる**RubyInstaller**を使用します。

1. RubyInstallerのダウンロード
まずは[RubyInstaller.org](http://rubyinstaller.org/downloads/)をブラウザで開きます。
次に、RubyInstallersの中で、自分に適したインストーラーをダウンロードします。私の場合は*Ruby 2.2.4(x64)*としました。
　

2. RubyInstallerの実行
インストーラーを実行していきます。
通常通り実行していけば良いのですが、この項目だけは必ずチェックを入れて下さい。   
**Rubyの実行ファイルへ環境変数PATHを設定する**  
もし入れ忘れても後から設定出来ますが、手順は簡単な方が良いです。  
　
3. 動作確認
取り敢えずRubyの動作の確認をします。
コマンドプロンプトを立ち上げて下さい。Cortanaにcmdって聞いても良いです。
立ち上がったら、以下のコマンドを実行しましょう。
```ruby -v```
これに対して
```ruby 2.2.4p230 (2015-12-16 revision 53155) [x64-mingw32]```
と返ってきたらインストール成功です。
　
※バージョンは自信の環境において適宜読み替えて下さい。
※実行出来ない場合、コマンドプロンプトを*管理者として実行*してみて下さい。　

##Development Kitのインストール
1. Development Kitのダウンロード
同様に[RubyInstaller.org](http://rubyinstaller.org/downloads/)からダウンロードします。
今回の場合は、「For use with Ruby 2.0 and above (x64 - 64bits only)」が対象です。

2. Development Kitの展開
ダウンロード後、解凍します。とりあえずCドライブ直下を指定してます

3. コマンド実行
コマンドプロンプトを起動し、以下を実行

```
ruby C:\DevKit\dk.rb init
ruby C:\DevKit\dk.rb install
```

##諸々インストール
1. Gemのアップデート
引き続き、コマンドプロンプトで実行する

```
gem update --system
```

2. Bundlerのインストール

```
gem install bundler
```

3. Railsのインストール

```
gem install rails
```

##Node.jsのインストール
1. Node.jsのダウンロード
[こちら](https://nodejs.org/en/download/)から対象のNode.jsをダウンロードして下さい。
今回の場合は、「Windows Installer (.msi)	64-bit」です。

2. Node.jsのインストール
ウィザードに沿ってインストールしていきます。

**ここが重要で、Rails4 + Windows10の組み合わせの場合、Node.jsがないとエラーを吐きます。**
 
##動作確認
1. フォルダ作成
プロジェクトを配置するフォルダを作成します。

2. アプリケーション作成
とりあえず、rails newとscaffoldで作成します。

3. 動作確認
WEBrickを起動し、ブラウザでアクセスしてみましょう。
Javascriptで数字のカンマ区切り表示メモ

# Javascriptで数字のカンマ区切り表示

## 正規表現

```js:javascript
function numberWithCommas(x) {
    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
```

[stackoverflow](http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript)


## toLocaleString()を使用
一番簡単。
そのまま引数にロケールを指定すればOKです。
ただし、Safari/PC,モバイルブラウザではlocale指定は非対応なのでフロントエンドには向かない。
Node(サーバーで実行)なら特に問題ないでしょう。

```js:javascript@firefox
> var num = 123456.1234;
> console.log(num.toLocaleString('ja-JP'))
123,456.123 // 1/1000未満を四捨五入するようです

> console.log(num.toLocaleString('en-US'))
123,456.123 // 1/1000未満を四捨五入するようです

> console.log(num.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }))
￥123,456 // 1円未満は四捨五入するようです（Nodeは1/1000を四捨五入）

> console.log(num.toLocaleString('ja-JP', { style: 'currency', currency: 'USD' }))
$123,456.12 // 1セント未満は四捨五入するようです（Nodeは1/1000を四捨五入）

> console.log(num.toLocaleString('ja-JP', { style: 'currency', currency: 'EUR' }))
€123,456.12 // 1セント未満は四捨五入するようです（Nodeは1/1000を四捨五入）
```

NodeJSだと出力が若干異なりました。

[MDN:Number.prototype.toLocaleString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString)

## Other
ほかにも[NumberFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat)を使ったり、ごりごり書いてみたりと、いろんな方法がありますねー。

toLocaleStringとNumberFormatのブラウザ対応表からすると、toLocaleStringはNumberFormatを使っているのかな？
そんな気がします。

ブラウザ向けなら正規表現が無難かなー。
どうでしょう。
OpenFOAMの提供するメッシュ（polyMesh, fvMesh, dynamicFvMesh, topoChangerFvMesh）

# polyMesh

## 参考リンク

[OpenFOAM C++ Documentation : polyMesh](http://openfoam.com/documentation/cpp-guide/html/a01995.html)
[OpenFOAM C++ Documentation : polyMesh.H](http://openfoam.com/documentation/cpp-guide/html/a08860_source.html)
[OpenFOAM Documentation Project : primitive mesh](http://www.tfd.chalmers.se/~hani/kurser/OS_CFD_2008/primitiveMeshDraftVersion.pdf)

## 説明

メッシュの基本要素を記述したクラス。OpenFOAMに実装されている全てのメッシュはこのクラスを継承して作成されています。

## メンバ関数

並列計算に必要なメッシュデータを参照するメンバ関数のほとんどはこのpolyMeshクラスで定義されています。

|メンバ関数|説明
|:--------|:----------------------|
|`faces()`|faceListを返す。|
|`faceOwners()`|face owner cellのlabelListを返す。|
|`faceNeighbour()`|face neighbour cellのlabelListを返す。|
|`boundaryMesh()`|polyBoundaryMeshを返す。|
|`bounds()`|メッシュのbounding boxを返す。|
|`globalData()`|globalMeshData（並列計算用のメッシュデータを取り扱っているクラス）を返す。|
など

# globalMeshData

## 参考リンク

[OpenFOAM C++ Documentation : globalMeshData](http://openfoam.com/documentation/cpp-guide/html/a00980.html)
[OpenFOAM C++ Documentation : globalMeshData.H](http://openfoam.com/documentation/cpp-guide/html/a08825_source.html)

## 説明

並列計算時に必要となるメッシュデータを定義しているクラス。sharedPoint, sharedEdgeとは、3つ以上のプロセッサーに共有されているpoint, edgeのことです。coupledPatchとは、並列計算をするためのメッシュ分割を行ってできたpatchで、隣接するメッシュを持つプロセッサーとデータをやり取りする必要があるpatchのことです。

# fvMesh

## 参考リンク

[OpenFOAM C++ Documentation : fvMesh](http://openfoam.com/documentation/cpp-guide/html/a00921.html)
[OpenFOAM C++ Documentation : fvMesh.H](http://openfoam.com/documentation/cpp-guide/html/a06044_source.html)
[OpenFOAM Documentation Project : primitive mesh](http://www.tfd.chalmers.se/~hani/kurser/OS_CFD_2008/primitiveMeshDraftVersion.pdf)

## 説明

polyMeshを継承して作成されている有限体積法用のメッシュを提供するクラス。OpenFOAMは基本的に有限体積法に基づいて計算を行うので、fvMeshクラスのメンバ関数に何があるのか、その役割は何かということを理解しておく必要があります。

## メンバ関数

|メンバ関数|説明
|:--------|:------------|
|`owner()`|owner cellのlabelUListを返す。|
|`neighbour()`|neighbour cellのlabelUListを返す。|
|`Sf()`|face面積に比例するfaceの法線ベクトルを返す。|
|`magSf()`|face面積を返す。|
|`C()`|cell中心座標を返す。|
|`Cf()`|face中心座標を返す。|
|`boundary()`|境界メッシュ（fvBoundaryMesh）を返す。|
など

## Tips

### faceの単位法線ベクトルの求め方

```cpp
// fvMeshオブジェクト
fvMesh fvm;
// faceの単位法線ベクトルのfieldの計算
const surfaceVectorField faceN = fvm.Sf()/fvm.magSf();
```

# dynamicFvMesh

## 参考リンク

[OpenFOAM C++ Documentation : dynamicFvMesh](http://www.openfoam.com/documentation/cpp-guide/html/a00634.html)


## 説明

メッシュが移動するような計算を行うためのクラス。

# topoChangerFvMesh

## 参考リンク

[OpenFOAM C++ Documentation : topoChangerFvMesh](http://www.openfoam.com/documentation/cpp-guide/html/a02737.html)

## 説明

メッシュが変形するような計算を行うためのクラス。
MetaTraderのLWMAをscipyのFIRフィルタ関数で実装してみる

初投稿ですが、いきなり本題に入ります。
最近、MetaTrder5(MT5)のテクニカル指標関数をPythonで実装してみました。→[GitHub](https://github.com/toyolab/MT5IndicatorsPy)

MT5では、移動平均の種類に、SMA, EMA, SMMA, LWMAとあるのですが、SMA(単純移動平均)は、pandas使うと簡単に書けました。

    import numpy as np
    import pandas as pd
    def MAonSeries(s, ma_period, ma_method):
        if ma_method == 'SMA':    
        return s.rolling(ma_period).mean()

LWMA(線形加重移動平均)も簡単に書けるメソッド関数ないか探したんですが、わからなかったので、そのまま計算してました。

    def MAonSeries(s, ma_period, ma_method):
        if ma_method == 'LWMA':
            y = pd.Series(0.0, index=s.index)
            for i in range(len(y)):
                if i<ma_period-1: y[i] = 'NaN'
                else:
                    y[i] = 0
                    for j in range(ma_period):
                        y[i] += s[i-j]*(ma_period-j)
                    y[i] /= ma_period*(ma_period+1)/2
            return y

でも、もっと簡単に書きたかったので、調べたところ、scipyの信号処理関連のモジュールに[lfilter()](http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.lfilter.html#scipy.signal.lfilter)というフィルタ関数がありました。これは、FIRフィルタ、IIRフィルタどちらにも対応しているようで、これを使うとこんな感じで書けました。

    from scipy.signal import lfilter    
    def MAonSeries(s, ma_period, ma_method):
        if ma_method == 'LWMA':
            h = np.arange(ma_period, 0, -1)*2/ma_period/(ma_period+1)
            y = lfilter(h, 1, s)
            y[:ma_period-1] = 'NaN'
            return pd.Series(y, index=s.index)
 
これでちょっとすっきりしました。
Githubが学生は2年間無料で使えるらしいって話

サービスを開発していてgithubでプライベートリポジトリが使いたくなったので

仕方なく課金しようと思ったのですが

個人で使っても月7ドル...

年間84ドル。。

払いたくない。。。。

できることなら金をかけたくない

84ドルでうまいものが食いたい。

僕はgoogleにその思いを打ち明けた!

すると

<a href="https://education.github.com/">「GitHub Education」</a>

なるものがあることがわかった

これは大学のメールアドレスを使えば2年間
(なくても大丈夫そう。なんか学生であることを証明できるものがあれば)

あの個人の7ドルのアレが

無料で使える震えるほどありがたい

もう、頭が上がらなくなるアレなのだ。

進んでいくと

なにやら理由らしきものを求められる欄があるけど

研究とかじゃなくサービス開発に使いたいんじゃって

google翻訳様を使って書いたら

即使えるようになったのだよ

最高だな。

大学のメールアドレスでgithubに登録してない場合は

githubにログインして

自分のアカウントのアイコンをタップすると

セッティングってのがあって

そこに行って

Emailsってとこから

add email addressってとこに大学のアドレス入れて

addを押すと

大学のメールにメールが来るから確認したら

githubに追加されているので

そのあと

<a href="https://education.github.com/">「GitHub Education」</a>

ここから手続きすればOKだよ。
CentOS上のdockerがディスク容量を解放してくれないので再インストールした

題名のままなんですが、EC2でCentOSサーバを立てて、その中でdockerを使ってWebアプリを動かしていたんですが、ある時点からWebアプリが起動しなくなりました。

調べたところ、単にディスク容量がいっぱいで新しいイメージをpullできてなかったようなので、docker rmi -fでイメージを削除したんですが、現象が変わらずduコマンドなどでディスク容量を調べたら、devicemapperフォルダの容量が大きいままなことが判明しました。

ただ、単にdevicemapperを消すとdockerが動かなくなるため、いろいろ考えた挙句、docker pullする前に下記の手順でdockerを再インストールすることにしました。

```
yum remove -y docker
rm -Rf /var/lib/docker
yum install -y docker
/etc/init.d/docker start
docker pull your/images
```

一応、これで動いてはいるのですが、起動に時間がかかるし、そもそもやり方としてナイスとは思えないので、他にもっとナイスな方法があればコメントなどいただけると助かります。
日時でレコードを絞り込むビューを作る時の注意点



毎度やらかすので自分用のメモとして。
適切なタイトルが思いつかなかったので悔しい。。

Djangoでニュース記事とかを実装する際に、公開日時とか有効期限とかのフィールドを設けて、現在の日時と比較して公開・非公開を切り替えるってのはよくやると思いますが、以下の様に書いてはダメです。

```python
from django.db import models
from django.utils import timezone


class ArticleManager(models.Manager):
    def published(self):
        qs = self.get_queryset()
        return qs.filter(published_at__lte=timezone.now())


class Article(models.Model):
    title = models.CharField('タイトル', max_length=100)
    published_at = models.DateTimeField('公開日時', default=timezone.now)

    objects = ArticleManager()


class ArticleView(ListView):
    queryset = Article.objects.published()  # これダメ
    # queryset = Article.objects.filter(published_at__lte=timezone.now())  # 当然これもダメ

```


## ダメな理由

ちょっと考えればわかる事なんですが、 `ArticleView` で指定してる `queryset` は `クラス変数` なので、 `サーバー起動時にクラスが読み込まれ、値が決定される` のです。 
`Article.objects.published()` はこの処理が実行された時点での日時で動作しますので、上記のケースでは `サーバーが起動した時刻を現在時刻とする` 様に動作します。


## 解決策

やりたい事は、 `リクエストされた日時を基準として公開・非公開を判断したい` という事なので、以下の様にすれば正しく動作します。

```python
from django.db import models
from django.utils import timezone


class ArticleManager(models.Manager):
    def published(self):
        qs = self.get_queryset()
        return qs.filter(published_at=timezone.now())


class Article(models.Model):
    title = models.CharField('タイトル', max_length=100)
    published_at = models.DateTimeField('公開日時', default=timezone.now)

    objects = ArticleManager()


class ArticleView(ListView):
    queryset = Article.objects.all()

    # リスエスト毎に動作
    def get_queryset(self):
        qs = super(ArticleView, self).get_queryset()
        return qs.published()

```


## まとめ

ただの `うっかりミス` 以外の何物でもないんですが、以外と気付かずにハマったりするので（僕だけかもですけど！！）、お気をつけ下さいませ。
営業マンが誰よりも MongoDB（続き）

続きです。
前回は MongoDB を動かすところまで行きました。
ここからが本題です。DataSpider を使って MongoDB に繋いでみましょう。
***
###初期設定（グローバルリソース）
DataSpider から様々なデータベースに接続する場合、認証情報を「グローバルリソース」として登録します。
接続先の情報（IPなど）が変わった際に各スクリプトをいちいち変更しなくても、グローバルリソースだけ修正すれば全てのスクリプトの接続先が変更されます。（便利！！）

グローバルリソースの設定は以下の通りです。
<img width="278" alt="GR.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/b3bb16c1-1c09-ff36-e2cf-573176cc67c0.jpeg">
以上の設定で
>接続先：localhost
>ポート：27017
>DB名　：sample-mongo

に接続できます。今回は使用していませんが、ユーザー認証にも対応しています。

##スクリプト作成
それでは、グローバルリソースができたらスクリプトを作っていきましょう。

「スクリプト」とは DataSpider における、実行の最小単位です。
実行する際にはこの「スクリプト」の単位で処理を呼び出すことができます。
今回は「MongoDB to CSV」という名称のスクリプトを作ります。

早速、ツールパレットを開いてみると「MongoDB」アダプタが見えますね。
<img width="685" alt="Script.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/eed457c9-e5af-f8e9-dc7c-4ad032453cce.jpeg">
今回は MongoDB のデータを読み取って、CSV に吐き出す処理を作りたいと思いますので「ドキュメント読み取り」のアイコンをドラッグ＆ドロップします。
DataSpider ではこのようにアイコンのドラッグ＆ドロップでデータの読み取り・書き込みができます。
そして、設定は画面に従ってするだけです。
<img width="344" alt="propertie.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/93222be2-7518-5a4d-339b-2a98d0158e21.jpeg">
>名前：配置したアイコンに一意の名前をつけます（識別のため）
>接続先：作成済みの「グローバルリソース」を選択します
>コレクション名：「接続先」を選ぶと定義済みのコレクション名がプルダウンメニューに表示されます
>クエリセレクタ：MongoDB のお作法に則ってクエリを書くことができます。
　今回はデフォルトのままで、全部のデータを抽出します
>スキーマ定義：右下の「スキーマ定義の更新」ボタンを押すと、定義されているスキーマ情報が表示されます。

更に、右下の「テスト実行」ボタンを押すと接続テストが行えます。
これで MongoDB からデータを抽出する設定はできました。
あとは 「CSV書き込み」のアダプタを使って、出力の設定を行います（割愛）。
・・・ということで、できました！
<img width="401" alt="デザイナ.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/6ef211b9-b14f-194b-1e66-7dc4d2b16d82.jpeg">
##いざ！実行！
あとはこのスクリプトを実行します。
DataSpider では「スケジュール」「ファイル」「HTTP」など様々なきっかけ（トリガー）でスクリプトを実行できますが、今回は我慢できずにデザイナ画面上のデバッグ実行ボタンで実行します（ポチッ）。
<img width="512" alt="debug.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/146ffb6b-849f-19f0-a39a-7e4498950920.jpeg">
どうやら成功したみたいです。
では、出力された CSV ファイルを見てみましょう。
<img width="260" alt="output.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/129487/44c3e19f-d413-c416-059a-a18a0139eab3.jpeg">
そういうツールなので当たり前ですが、MongoDB の内容が CSV に簡単に出力できました。

さて、ここまでで MongoDB アダプタを使うと簡単にデータ抽出ができることを紹介してきましたが、せっかくなのでもうちょっと遊びましょう。（[次回：最終回](http://qiita.com/DSS_Tsukky/items/84d15d62e070ac6cdf7b)）
営業マンが誰よりも早く MongoDB アダプタを試してみた

本日 DataSpider Servista 4.0 SP1 がリリースされました。

新機能を試してみて無事動いたので、嬉しくて先輩にメールしたところ「Qiita に書きなさい」とありがたい指令が出ました。
ということで、早速 Qiita のアカウントを取得して書いてみました。
素人が頑張ってやってみたので、間違った知識、間違ったやり方があったら指摘してもらえたらとても幸せです。
***
###概要
DataSpider Servsita 4.0 SP1 で Mongo DB アダプタが追加されました。
NoSQL データベースを DataSpider で連携したらどうなるのか？是非試してみなければいけない！

###前提知識
・筆者の属性は営業
・DataSpider を用いたスクリプト作成はデモレベルでの実施は可能（デモ歴：3年）
・プログラミング経験はほぼ無し
・Mongo DB が NoSQL の一種ということはわかっていたけれど、それ以外の知識は無し
・RDBMS も詳しいわけではない

###MongoDB について調べる
MongoDB が何者かわかっていないので適当にググってみます。
ふむふむ、MongoDB はドキュメント志向と言われるのか（そこからか・・・）。
テーブルに当たるものが「コレクション」で、その中にjson形式（厳密にはBSONというらしい??）でデータを格納・・・と。
う～ん・・・あとは難しくてよくわからないのでとりあえずやってみましょう。

###MongoDB の環境構築
1.Mongo DB をインストール
　https://www.mongodb.com/download-center#community

　「Windows Server 2008 R2 and later without SSL Support」
　というものを選択。Windows 7 でも問題なく入った。

2.必要なディレクトリを作成
　　インストールディレクトリ配下に
　　　data
　　　logs
　　というディレクトリを手動で作成。
　　私の場合は、
　　　C:\Program Files\MongoDB\Server\3.2
　　にインストールしたので、
　　　C:\Program Files\MongoDB\Server\3.2\data
　　　C:\Program Files\MongoDB\Server\3.2\logs
　　というディレクトリ名で作成。

3.起動
　コマンドプロンプトからこんなコマンドで実行します。
　これで MongoDB が起動する（はずです）。
> c:\Program Files\MongoDB\Server\3.2\bin>mongod --dbpath "C:\Program Files\MongoDB\Server\3.2\data" --logpath "C:\Program Files\MongoDB\Server\3.2\logs\mongodb.log"

　起動したらその窓は開きっぱなしにして、別画面でコマンドプロンプトを開いて以下に続きます。

4.DB 作成
　とりあえず mongo コマンドを叩くと管理ツールのようなものに入れるらしい。

　use xxxx で DB に入り、
　db.○○○○.insert でデータ挿入
　というお作法のようです。
　また、use コマンドの時に DB が無いと作ってくれるようです。

> c:\Program Files\MongoDB\Server\3.2\bin>mongo
2016-06-13T11:52:09.062+0900 I CONTROL  [main] Hotfix KB2731284 or later update
is not installed, will zero-out data files
MongoDB shell version: 3.2.7
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
>\> use sample
switched to db sample
>\> db.books.insert({_id:1,title:"DataSpider リファレンス",price:100})
WriteResult({ "nInserted" : 1 })
>\> db.books.insert({_id:2,title:"Thunderbus ガイドブック",price:300})
WriteResult({ "nInserted" : 1 })
>\> exit
bye

どうやらデータを入れることができたように見えます。

ここまで来たら DataSpider からいじれるはずなのでいじってみましょう。（[続く](http://qiita.com/DSS_Tsukky/items/42646ff0d87f3e534ee6)）
Dockerホストを立てる時はディスクサイズに気をつけましょうという話

DockerMachineでDockerホスト立てる時に皆さんこういう風にコマンドを打ったことはないでしょうか？

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

少なくとも僕はこうやってました。もちろん普通に使う分には困りません。
が、例えばDBのデータが膨大になってきたりするとディスクサイズが足りなくなる時があったんですよね💦
調べてみるとDockerホストを立てる際のcreateコマンドではデフォルトのディスクサイズは20GBだそうです。

もしディスクサイズを設定する場合createコマンドでオプションを付加する必要があります。

```
# ディスクサイズを40GBにする場合 
docker-machine create default --driver virtualbox --virtualbox-disk-size 40000 
```

仮想マシンにXhyveを使う場合はxhyve-disk-sizeオプションになります。

```
# ディスクサイズを40GBにする場合 
docker-machine create default --driver xhyve --xhyve-disk-size 40000 
```



既にDockerホストを立てた後ではディスクサイズを変更出来ないのでDockerホストを一旦削除してから再作成する羽目に..

なのでDockerホストを立てる時はディスクサイズを意識した方が良いと思います。

ちなみにDockerMachineではなくDinghyのツールを使う場合もDockerホストを立てる時にオプションを付加するのは同じですね。
(Dinghyって何？って方は[こちら](http://qiita.com/masuidrive/items/d71ee1881fffb6ad098f))

```
# ディスクサイズを40GBにする場合(仮想マシンが何であろうとdiskオプション)
dinghy create --provider virtualbox --disk 40000 
```
【Unity5】XBox One の左右のスティックの入力を取得する

※この記事のUnityのバージョンは5.3.5f1です
#はじめに
備忘録もかねてXBoxOneの左右スティックの入力を取得できるようにするまでの手順を記事にまとめてみました。

# UnityEditor側の設定
メニューの Edit -> Project Settings -> Inputを選択
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/2a8a51c3-bfef-c15f-d8a4-c86b6e8466f3.png)

InputManagerが開きます.
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/b319c947-aada-00fb-c803-f659f5c9d9d5.png" width = 300>

InputManagerのSizeがデフォルトでは18になっているので、2増やして20にします
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/39dd4533-e07d-077a-9e50-6364ebf9494b.png" width = 400>

Cancelが2つ追加されます
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/ffc9198b-7fef-5989-8578-326dfbb43cdc.png" width = 400>

追加された2つのCancelの入力内容を書き換えて、以下のように変更します.
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/4c2e0c2c-dfe7-2524-c238-264c36e6532f.png" width = 400>

以上でUnity側の設定は完了です。 右スティックの入力を受け取ることができるようになりました。

#スティックの入力を受け取るC#スクリプト
以下のC#コードで左右スティックの入力を取得することができます.

```
// 左スティックのよこ方向の傾き
Input.GetAxis("Horizontal") 

// 左スティックのたて方向の傾き
Input.GetAxis("Vertical") 

// 右スティックのよこ方向の傾き
Input.GetAxis("Horizontal2")

// 右スティックのたて方向の傾き
Input.GetAxis("Vertical2") 
```
KinectのRGB-Dデータからポイントクラウドを生成してみた

KinectV2で取得したカラーマップとデプスマップを組み合わせて、実空間をリアルタイムでポイントクラウドにできるUnityアプリケーションを作ってみましたのでまとめます

![無題afdsa.png](https://qiita-image-store.s3.amazonaws.com/0/104887/5ea1fcd3-08aa-dc2c-e36f-2401b7789242.png)

[ソースコード](https://gist.github.com/yjiro0403/4ab71d02bc182e3b331cca7c3d5f26e2)

#なんでPCLを使わないの
 - +αの処理がしたい
 - 視点移動中に止まってしまう

#参考プログラム
##色付けしてないポイントクラウド

[Kinect for Windows SDK 2.0 Unity Pro Add-in でポイントクラウド風描画](http://izmiz.hateblo.jp/entry/2014/08/13/003146)を参考に作成

↑バージョンが変わったのか少々動かないところがあり、改造しました。
プログラムの内容は上のソースコードを見てください

##色付けする
ソースの中からパーティクルの処理部分を抽出したものを貼り付けておきます

```csharp
                    for (int y = 0; y < depthHeight; y += 2)
                    {
                        for (int x = 0; x < depthWidth; x += 2)
                        {
                            int depthIndex = (y * depthWidth) + x;
                            CameraSpacePoint p = cameraSpacePoints[depthIndex];
                            ColorSpacePoint colorPoint = colorSpacePoints[depthIndex];

                            byte r = 0;
                            byte g = 0;
                            byte b = 0;
                            byte a = 0;

                            int colorX = (int)System.Math.Floor(colorPoint.X + 0.5);
                            int colorY = (int)System.Math.Floor(colorPoint.Y + 0.5);

                            if ((colorX >= 0) && (colorX < colorWidth) && (colorY >= 0) && (colorY < colorHeight))
                            {
                                int colorIndex = ((colorY * colorWidth) + colorX) * bytesPerPixel;
                                int displayIndex = depthIndex * bytesPerPixel;
                                b = colorFrameData[colorIndex++];
                                g = colorFrameData[colorIndex++];
                                r = colorFrameData[colorIndex++];
                                a = colorFrameData[colorIndex++];
                            }

                            if (!(double.IsInfinity(p.X)) && !(double.IsInfinity(p.Y)) && !(double.IsInfinity(p.Z)))
                            {
                                particles[particleCount].position = new Vector3(p.X*scale, p.Y*scale, p.Z*scale);
                                particles[particleCount].startColor = new Color(r/255F,g/255F,b/255F,a/255F);

                                particles[particleCount].startSize = size;
                                particleCount++;
                            }
                        }
                    }
                    _particleSystem = gameObject.GetComponent<ParticleSystem>();
                    _particleSystem.SetParticles(particles, particles.Length);
                }
```

- 今回はdepth領域の左上から右下までを探査するかたちで行いました

- また[KinectV2 で カラー画像を映す- WPF * C#](http://neareal.com/443/)
を参考に、RGBAが格納されている配列を、depthIndexを使って処理

- 私はparticle systemのstartColorで数日手こずってました
(new Colorの引数が[0~1]ではなく[0~255]だと思っていた 笑)

- ちなみに色情報が格納されてある配列の要素数を調べてみると8294400という数値がでました。これは1980(色空間の幅サイズ)*1080(色空間の高さサイズ)*4(R,B,G,A)だと思っています
初級: tableタグの代用にcssとdl, dt, ddを使う書き方

## 参考

* [dl要素でテーブルのような見た目を表現する | kotaログ](http://www.kotalog.net/archives/1620)

## サンプル

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7807a90b-aef6-e780-cc5c-ef71d5169e77.png)

```ruby:index.html
<style>
dl {
	width: 20em;
	background-color: #ddd;
}
dt{
	float:left; /* <- ここが一番重要 */
}
dd{
	background-color: #fff;
}
</style>

<dl>
	<dt>項目１</dt>
	<dd>テステステスステステステステステステステステステステステステステステステス</dd>

	<dt>項目２</dt>
	<dd>テステス</dd>
	<dd>テステス</dd>
	<dd>テステス</dd>
	<dd>テステス</dd>
	<dd>テステス</dd>
</dl>
```

メリット

* cssで見た目を一度作ってしまえば使いまわしやすいかも。
* tableタグと比べてタグが少なく見える?


## cssを使わない場合の表示

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/25728/22b2598f-9fce-576f-1c1b-85905021482a.png)
IEのみCSS適用するハック めも

で、いろいろググって試したんですが、
どれもうまいこと効かなかったので、、、
(他のブラウザにもかかってしまった)



IE11を基準にスタイル書いて、
下記で
ffとクロームをハックしました。


```css:hack.css

/* firefox */
@-moz-document url-prefix() {
  #target{
    padding-bottom: 7px;
  }
}

/* Chrome*/
@media all and (-webkit-min-device-pixel-ratio:0) and (min-resolution: .001dpcm) {
  #target{
    padding-bottom: 10px;
  }
}



```

2016年6月。
ビルド番号(Bundle Version)を自動で採番したい

TestFlightへアプリをアップロードするたびに「バージョン番号上げて」と言われるのに疲れたので、XcodeのRun Script機能を使って、アーカイブを作成するタイミングでInfo.plist内のビルド番号（Bundle Version）をオートインクリメントするようにした。

## 手順

1. Xcoe上でターゲットを選択
2. Build Phasesタブを選択
3. New Run Script Phaseを選択
  * <img width="528" alt="スクリーンショット 2016-06-23 11.01.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/16969/5671dcd0-bc42-98f1-19fd-2f174e629741.png">
4. Run Scriptを以下のように記述
  * ソースは<a href="#run-script">こちら</a>
  * 以下では Build Configuration が "Beta" の時のみ採番を行っていますが、自分の環境に合わせて "Release" でも "Stable" でも好きな値に変更してください
  * <img width="884" alt="スクリーンショット 2016-06-23 11.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/16969/45055d17-ad91-6cd5-8730-7eb71cf0289a.png">
5. Run Scirptを「Link Binary With Libraries」の下へドラッグ＆ドロップで移動
  * 移動前（Copy Pods Resourcesの下から...）
    * <img width="904" alt="スクリーンショット 2016-06-23 11.06.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/16969/940e2ff8-d5e1-c7f3-551b-95ab0e4dffc0.png">
  * 移動後（...Link Binary With Librariesの下へ移動）
    * <img width="905" alt="スクリーンショット 2016-06-23 11.06.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/16969/c4cec3ac-1e37-bf50-4c86-9caa241ec764.png">

## Run Script

```sh
if [ ${CONFIGURATION} = "Beta" ]; then
  build_number=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
  build_number=$(($build_number + 1))
  /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $build_number" "${PROJECT_DIR}/${INFOPLIST_FILE}"
fi
```

## 参考

https://gist.github.com/sekati/3172554/
rex0220 ルックアップコピー項目編集プラグイン

Kintoneルックアップコピー項目を編集可能にするプラグイン

ルックアップコピー項目を編集可能にするプラグインを無料公開します。
[Kintoneルックアップコピー項目編集プラグイン](https://rex0220.stores.jp/items/5770884ba458c0ee5f00b4e8)

・動作環境は、PCのみ対応

# プラグイン設定前後の編集画面

![editlookup1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/6d48ee8c-be8a-f88b-89a3-867d3c7f1a41.png)

# ルックアップ取得後の編集画面

ルックアップ取得後にコピー項目を変更できます。

![editlookup2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/8212a13a-024e-b5fc-0a38-266a99907515.png)


# kintoneプラグイン追加

![editlookup3.png](https://qiita-image-store.s3.amazonaws.com/0/100572/f810c113-6379-1943-a99a-efa244066a37.png)


# アプリプラグイン設定画面

編集可能にする項目をチェックして、「保存する」をクリック。

![editlookup4.png](https://qiita-image-store.s3.amazonaws.com/0/100572/28d9e958-c4de-1022-f334-3a95b094645d.png)


# 注意事項

- 既に、JavaScript によるカスタマイズを行っているアプリの場合、処理が競合して、エラーになる場合があります。その場合は、該当するアプリでプラグインの使用を中止してください。
- フォームを変更した場合は、プラグインを再設定してください。
- アプリの項目数およびテーブル内のコピー項目数が多い場合、プラグイン設定保存時にエラーになる場合があります。<br>
<img width="286" alt="2018-06-19_14h03_29.png" src="https://qiita-image-store.s3.amazonaws.com/0/100572/e332303a-858d-0559-e3f5-a8eba157c6a8.png">
<br>
保存データ圧縮対応した有償版のルックアップコピー項目編集プラスプラグインをご検討ください。
【WebHooks編】スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた

Slackの運用が長くなってきて、Appsの数がそろそろ限界になってきたぞ;;という方向けのお話です。

僕も[運営中のPlayer!](https://itunes.apple.com/jp/app/id897872395)のKPI管理として、[スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた](http://qiita.com/abe-perorist/items/dec054e95b473364cae6)にて、快適なSlackでのKPI生活を楽しんでいたのですが、ある日突如KPIが自動投稿されなくなりました。

理由は、（おそらく）導入していたライブラリと連携していたAppsを解除していたためです。
予算の都合上、__対象のAppsを受け入れることはできないとのお達し__を頂いたので、他の方法がないかなと色々やってたら、できてしまったのでまとめます。



## やろうとしていることの全体の流れ

ざっくり言うと、
__1. SlackのIncoming Webhooksで新しいConfigurationを作り、Webhook URLを発行する
2. そのWebhook URLにJSONをPOSTする
3. Slackに自動投稿されて、嬉しい__

という流れなのです。
これらすべてを記述するほど、僕は粘り強くないので、__「2. そのWebhook URLにJSONをPOSTする」のみ__書きます。
その他の箇所に関して、一言だけ述べるなら、
「1. SlackのIncoming Webhooksで新しいConfigurationを発行し、Webhook URLを確認する」は、チャネルを指定して、作ればオッケー
「3. Slackに自動投稿されて、嬉しい」は、該当チャネルに投稿されるのを確認して、トリガー設定して、自動投稿されることを喜べばオッケー

さて、本題に入ります。

## まずは、コードを全てお見せする

「2. そのWebhook URLにJSONをPOSTする」を実現するためのGoogle Apps Scriptを書いたので、そちらをお見せします。
スプレッドシートにてKPI管理をしていますので、下記のGoogle Apps Scriptは「スプレッドシートの値を取得する」「値を含めたJSONメッセージをWebhook URLにPOSTする」という構成になっております。
また、「スプレッドシートの値を取得する」に関しては、[スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた](http://qiita.com/abe-perorist/items/dec054e95b473364cae6)にて、記載しておりますので、本記事では省略します。


```js:コード.gs
// スプレッドシートの値を取得する
function post_all_kpi_data() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var kpisheet = ss.getSheetByName('Slack');

 var totalusers = kpisheet.getSheetValues(2,2,1,1);
 var newusers = kpisheet.getSheetValues(2,16,1,1);

 var rounding_mau = Math.round(kpisheet.getSheetValues(6,6,1,1)*10000);
 var percent_mau = rounding_mau/100;
 var real_mau = kpisheet.getSheetValues(2,6,1,1);
 
 var rounding_wau = Math.round(kpisheet.getSheetValues(6,8,1,1)*10000);
 var percent_wau = rounding_wau/100;
 var real_wau = kpisheet.getSheetValues(2,8,1,1);
 
 var rounding_dau = Math.round(kpisheet.getSheetValues(6,10,1,1)*10000);
 var percent_dau = rounding_dau/100;
 var real_dau = kpisheet.getSheetValues(2,10,1,1);  
  
 var weblp_mau = kpisheet.getSheetValues(2,5,1,1);  
 var all_mau = kpisheet.getSheetValues(2,4,1,1); 
 
// 値を含めたJSONメッセージをWebhook URLにPOSTする
 var app_data = ("総ユーザーは" + totalusers + "人で、前日比 +" + newusers + "人ですわ。\nTotal_MAUは" + all_mau + "人です。\nApp_MAUは" + percent_mau + "%(" + real_mau + "人)。\nWeblpのMAUは"+ weblp_mau + "人。\nWAUは" + percent_wau + "%(" + real_wau + "人)。\nDAUは" + percent_dau + "%(" + real_dau + "人)"); // 送信したいメッセージ
 var post_data = {"text":app_data};

  var url = "https://hooks.slack.com/services/から始まるURL"; // 作成したWebhook URLを埋め込む
  var payload = JSON.stringify(post_data);

  var headers = { "Accept":"application/json", 
              "Authorization":"Basic _authcode_"
             };

  var options = { "method":"POST",
                "headers": headers,
                "payload" : payload
               };
  var response = UrlFetchApp.fetch(url, options);
 Logger.log(response);  

 }

```


こんな感じで、メッセージを作って、対象のWebhook URL埋め込んで、トリガーを設定すればばっちしです！
Railsでmysql日本語表示とinsert文が文字化けするときの対処法

# 日本語表示文字化け
select文でテーブルの中身をみたときに日本語部分が文字化けしているときは以下のコードで日本語表示に切り替えられました。

```mysql
set character_set_results = utf8;
```

# insert文日本語文字化け
insert文で日本語表示が文字化けしたときは、以下のコードで日本語表示に切り替えられました。

```mysql
set character_set_client = utf8;
set character_set_connection = utf8;
```


# mysqlでの文字設定確認

下記コードで文字設定を確認するといいかもしれません。

```mysql
show variables like '%char%';
```

#### 実行結果イメージ
------------------------------------------------------
| Variable_name            | Value                      |
--------------------------+----------------------------
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
------------------------------------------------------
Bitcoin::Utilの備忘録


（順次追加していきます。）

# HASH160から、アドレスを得る

```rb
module Bitcoin
  module Util
    def hash160_to_address(hex)
      encode_address hex, address_version
    end
```

* 例

```ruby
>>  tx.out[2].to_hash
=> {"value"=>"0.00000600", "scriptPubKey"=>"OP_DUP OP_HASH160 59c92518eb81c82e864ffda2caf0b2b5f14624ee OP_EQUALVERIFY OP_CHECKSIG"}

>> hash160_to_address('59c92518eb81c82e864ffda2caf0b2b5f14624ee')
=> "mohhPvLT4n97qaugzM7pR3QMzXqYB6sEaa"
```
Windowsでmarkdown形式のファイルをRedmineのwiki形式に変更する


# 環境

* Windows 7 64bit 日本語

# 動機

* markdown形式に慣れて、Redmineのwiki形式との併用に嫌気が差したから（どちらかに統一したい）
* Redmineにもmarkdown形式でwikiを記述できるように設定変更できるけれど、影響範囲が広いため断念したから（全プロジェクトへ影響する）

# pandocとは

* ドキュメントコンバーターの１つ

私的な出会いは、ソースコードを**キレイに**wordに貼り付けようとして調査したのがきっかけ。

# pandocインストール

Windowsのパッケージマネージャ、chocolateyを
利用してインストールする。

```cmd
choco install -y pandoc
```

# 使い方

markdown形式で記載したhoge.mdを
redmineのwiki形式に変換する。（hoge.txtile）

```cmd
pandoc -s  hoge.md -o hoge.textile
```

# その他

* outputするファイルの拡張子を、「.txt」にしたところ狙った出力形式にならなかった。
Erlangデバッガの基本的な使い方

※Erlang始めたばかりなのでベストプラクティスではないかもしれません

このページに書いてあることは[Erlang -- Debugger](http://erlang.org/doc/apps/debugger/debugger_chapter.html)にも書いてあるので、詳しくはドキュメントを参照してみてください。こちらには超基本的なことを簡単に書いています。

## 起動と設定

erl shellで`debugger:start()`コマンドを実行すると起動します。

```bash
$ erl shell

> debugger:start().
```

### デバッグ対象モジュールの追加

<img width="600" alt="Screen Shot 2016-06-27 at 08.01.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/5882/d8489a3f-6d19-784a-e4af-d0aae37505a6.png">

このままだと何もできないので、デバッグ対象のソースコードをデバッガに追加します。
Module -> Interpret... を選択します。
ファイル一覧のウィンドウが表示されるので、erlファイルを追加していきます。

<img width="166" alt="Screen Shot 2016-06-27 at 08.01.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/5882/4ee306bd-327f-044c-a394-f1f64216da52.png">

<img width="206" alt="Screen Shot 2016-06-27 at 08.42.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/5882/c3ef02b8-6fad-b61e-e9e5-fdfb12d2e142.png">

デバッガの左側のメニューに追加したモジュールが表示されます。

### ブレークポイントの追加

ブレークポイントを追加したいモジュールをダブルクリックします。モジュールのコードが別ウィンドウで開くので、この状態でグローバルメニューのBreakから、追加したいブレークポイントのタイプを選んでいきます。

コードの対象行をダブルクリックすると行のブレークポイントを追加することができます。

<img width="160" alt="Screen Shot 2016-06-27 at 08.02.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/5882/1e849676-7ff4-119a-5519-dfe4e1e3302b.png">

<img width="600" alt="Screen Shot 2016-06-27 at 08.02.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/5882/0c2e5ad2-d6e4-2f8d-a765-b25f7252b2c3.png">

## デバッグしてみる

対象モジュールを動かしてみます。
例で使っているモジュールは[cowboy](https://github.com/ninenines/cowboy)のhandlerなので、対象handlerに紐付いているpathにリクエストを送ってみます。

![Screen Shot 2016-06-27 at 08.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/5882/f2c6f546-52bb-9945-8fbc-fac509dc750a.png)

ブレークポイントをつけた箇所での変数の内容を見ることもできます。
この画面の左下の`Evaluator`というインプットに好きな式を書いて動かすことができるようです。（が、recordに関しては`undefined_record`と表示されてしまいうまく評価できませんでした。どうやれば評価できるかわかったら記事にも追記したいと思います）

<img width="837" alt="Screen Shot 2016-06-27 at 08.05.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/5882/da6777f3-3b7f-b3aa-b74c-03df1480905f.png">

## デバッガの設定の保存と読み込み

`debugger:start`した後に毎回デバッグ対象のモジュールを追加するのは面倒です。
グローバルメニューの`File -> Save Settings`から、デバッガの設定をファイルに書き出すことができます。

また、`debugger:start(<settings path>)`でこの設定ファイルを読み込んでデバッガを起動することができます。（[Erlang -- debugger](http://erlang.org/doc/man/debugger.html)）

開発中は

1. プロジェクトの主要なソースコードを予めデバッガ上に追加しておく
2. settingsを書き出し
3. `debugger:start(<settings path>)`

でデバッガを起動しながら実装を進めていくのがいいのかなーと思いました。
JUnitのTemporaryFolderルールのディレクトリやファイルの出力先

業務でJUnitのTemporaryFolderルールを使う機会があって、その時のディレクトリやファイルの出力先ってどこなんだっけ？ってなったので調べてみた。
ちなみに、TemporaryFolderルールとは、テストメソッドを実行する度に一時ディレクトリを作成して終了時には自動的に削除してくれる、といった優れもので、テストコードの中でファイル操作のテストをする時なんかはかなり使えそうなルール。詳細な説明は[JUnitのTemporaryFolderで一時ディレクトリを使う](http://qiita.com/tag1216/items/4b8ebee07ebcf8618d7d)や、[テストのときに一時的なファイルを作成する](http://blog.codebook-10000.com/entry/junit-make-temporary-file)にお任せする。

# どこに出力されるのか？

いきなり結論だが、デフォルトではシステムプロパティーjava.io.tmpdirで指定されているところに出力される。UNIXの場合はこのプロパティーのデフォルト値は通常"/tmp"または"/var/tmp"になっているのでそこに出力される。Windowsの場合は通常、"C:\\WINNT\\TEMP"だが、JVMを起動した時にこのシステムプロパティーに別の値が指定されることがあるのでそこに出力される。

# Windowsで試してみる
まずはシステムプロパティーjava.io.tmpdirがどこか確認し、その中にファイルが作成されるか確認してみる。

```HogeTest.java
package example;

import java.io.IOException;

import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;

public class HogeTest {

	@Rule
	public TemporaryFolder temporaryFolder = new TemporaryFolder();

	@Test
	public void testGetHoge() throws IOException {

		System.out.println(System.getProperty("java.io.tmpdir"));

		temporaryFolder.newFile("hoge.txt");

		System.out.println("for break point");
	}
}
```

自分の家PC(Windows10)では、システムプロパティーjava.io.tmpdirは「C:\Users\N\AppData\Local\Temp\」だった。その中に「junit2901515886398757993」みたいなディレクトリが自動的に作成され、その中に「hoge.txt」が作成されていた。

# TemporaryFolderクラスのソースを確認

TemporaryFolderルールを利用する場合、テストメソッド実行時の一番最初にTemporaryFolderクラスのbeforeメソッドが実行される。


```TemporaryFolder.java

private final File parentFolder;
private File folder;

public TemporaryFolder() {
	this(null);
}

public TemporaryFolder(File parentFolder) {
	this.parentFolder = parentFolder;
}

protected void before() throws Throwable {
	create();
}

~略~

public void create() throws IOException {
	this.folder = createTemporaryFolderIn(this.parentFolder);
}

public File newFile(String fileName) throws IOException {
	File file = new File(getRoot(), fileName);
	if (!file.createNewFile()) {
		throw new IOException("a file with the name '" + fileName
				+ "' already exists in the test folder");
	}
	return file;
}

~略~

private File createTemporaryFolderIn(File parentFolder) throws IOException {
	File createdFolder = File.createTempFile("junit", "", parentFolder);
	createdFolder.delete();
	createdFolder.mkdir();
	return createdFolder;
}

public File getRoot() {
	if (this.folder == null) {
		throw new IllegalStateException(
				"the temporary folder has not yet been created");
	}
	return this.folder;
}
```
createTemporaryFolderInメソッドで、File.createTempFile("junit", "", parentFolder);とあるように、FileクラスのcreateTempFileで一時ディレクトリを作成している。なので、[FileクラスのcreateTempFileメソッド](https://docs.oracle.com/javase/jp/6/api/java/io/File.html#createTempFile(java.lang.String, java.lang.String, java.io.File))を見れば良いだけ。
また、ファイル作成についてもnewFileメソッドは内部でFileクラスのcreateNewFileを使っているので詳細は[FileクラスのcreateNewFileメソッド](https://docs.oracle.com/javase/jp/6/api/java/io/File.html#createNewFile())を見れば良いだけ。
ZYBO > XADC Alarmのコードを動かしてみた > temp high alarm / temp low alarmの設定

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-43-XADC-Alarms-and/ba-p/496468
にあるXADCのAlarm関連のコードを試してみた。

## Vivado

1. ZynqのIPを追加後、XADC WizardのIPを追加
2. Run Block Automation, Run Connection Automationを実施
3. HDL Wrapper追加後、bit stream作成まで実行

## XSDK

blogにあるコードをそのままapplicationとして実装。

実行するとターミナルに以下のような表示が出てきた。

```
Xcell Daily blog XADC part 43
temp high alarm 42803 Real Temp 56.008606
temp low alarm 40785 Real Temp 40.490021
```

上記の表示関連のコードは以下の部分。

```c
	TempRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_TEMP);
	TempRawData = TempRawData+0x03FF;
	XAdcPs_SetAlarmThreshold(XADCInstPtr, XADCPS_ATR_TEMP_UPPER,(TempRawData));
	TempData = XAdcPs_RawToTemperature(TempRawData);
	printf("temp high alarm %lu Real Temp %f \n\r", TempRawData, TempData);

	TempRawData = XAdcPs_GetAdcData(XADCInstPtr, XADCPS_CH_TEMP);
	TempRawData = TempRawData-0x03FF;
	XAdcPs_SetAlarmThreshold(XADCInstPtr, XADCPS_ATR_TEMP_LOWER,(TempRawData));
	TempData = XAdcPs_RawToTemperature(TempRawData);
	printf("temp low alarm %lu Real Temp %f \n\r", TempRawData, TempData);
```

blogには以下の記載がある。

>  It then assigns an upper and lower temperature alarm based upon the value it has just read.

その時点のADC読取りした値をhigh alarm, low alarmとして設定しているようだ。
技術英語 > statistically significant / decisive factor

http://loe.org/shows/shows.html?programID=03-P13-00024

> Critics say these tests are done on too few people to be <font color=red>statistically significant</font>. 

http://ejje.weblio.jp/content/statistically+significant
> 統計学的に有意な

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

http://ejje.weblio.jp/content/decisive+factor
> 	決定的要因

スペルがdescisiveかと思ったらdecisiveだった。

decisionから考えればそうか。
Vagrant Share が便利すぎる話


## ローカル開発環境を人にみせるときどうしてますか？
ローカル環境での開発をベースとしている場合、人に見せるのが大変面倒です。ディスプレイ回したり、画面共有ができるWebサービスとか使ったりしますよね。ディスプレイ見せるならそんなに時間はかかりませんが、離れた場所で働いている人には見せられません。画面共有なら、どこにいてもみれますが、Webサービスで画面共有するまでには、[appear.in](http://appear.in "appear.in") を使っても少し時間がかかります。

## Vagrant Shareを使おう
Vagrant を使って開発している場合は、Vagrant Share を使いましょう！URLができるので送るだけ！アクセスするだけ！超便利！

## 使い方
これだけです。

1. Vagrant Share に登録
2. ```vagrant login```
3. ```vagrant share```

### 1. Vagrant Share に登録
Vagrant Share は Vagrant を提供している Hashicorp のサービスのひとつです。使うためには、アカウント登録が必要です。[ここ](https://atlas.hashicorp.com/account/new)から、登録しましょう。
https://atlas.hashicorp.com/account/new

### 2. vagrant login
ターミナルから ```vagrant login``` を実行します。ユーザ名とパスワードが求められるので、さきほど登録したアカウントでログインしましょう。

### 3. vagrant share
```vagrant share``` を実行しましょう。URLが発行されるので、アクセスしてみましょう。

## まとめ
簡単に使えて便利です。

しかし、実行している間は他のコマンドを実行できなくなるので、シェアしながら Vagrant の他のコマンドをできません。

```vagrant login``` しながら ```vagrant ssh``` できる方法があったら教えてください。

追記
@hidekuro さんからコメントいただいたんですが、```vagrant ssh-config``` でSSH接続先の情報を確認できるので、別ウィンドウのターミナルから接続できます。@hidekuro さん、ありがとうございます。
RailsのRoutesの記述を節約する

# 下記のようなURL
- get `hostname.com/api/v1/customers.json`
- get `hostname.com/api/v1/customer.json?hoge=...`
- post `hostname.com/api/v1/customers.json`
- patch `hostname.com/api/v1/customer.json`
- こういうのが、なんパターンも存在する。
	- ex. モデル毎に上記のようなエンドポイントが存在する

# routes.rb

```rb
...

  namespace :api, format: 'json' do
    namespace :v1 do
      get ':type' => 'base#routing'
      post ':type' => 'base#bulk_create'
      patch ':type' => 'base#update'
      delete ':type' => 'base#destroy'
    end
  end
  
...
```

# base_controller.rb

```rb
...

  def routing
    if params[:type].singularize == params[:type]
      find
    else
      index
    end
  end

  def index
    render json: success(results: model.all)
  end

  def find
    render json: success(results: model.find(uri_param))
  end

  def bulk_create
    if model.bulk_create(body_params)
      render json: success(message: 'bulk_create quing')
    else
      render json: fatal_error(message: 'bulk_create is error')
    end
  end
  
  private

  def model
    @model ||= model_name.constantize
    fail 'Not found model' unless @model.include(HogeModel)
    @model
  end

  def model_name
    @model_name = params.require(:type).singularize.classify
    @model_name
  end

...
```

# やってること
- `api/v1/`以下に付随するディレクトリをパラメータとして認識
- getリクエストは複数あるため、base_controllerで上記パラメータが複数形／単数形を判断し、適切なメソッドに処理を流している
- typeを受け取り、モデル名と、該当モデルクラスを取得。
- 各メソッドでは、該当モデルクラスを呼び出し処理を実施

# なにがいい？
- routes.rbに無用に同じような記述をしなくていい
- controller.rbが減る
- よって、必要なテストは減りカバレッジも上がる

# 問題点
- RSpecのテストの書き方がちょっとトリッキー。
- 機会があればまた紹介します。
Macで\と¥の入れ替え

自分用のメモです

MacOS El CapitanでUSキーボードで買っても最初に立ち上げてバックスラッシュを押下すると¥マークが出てきましたのでそれのデフォルトを変えたいという場合です
（Vimの正規表現とか書いたりする場合によく\を使うので変えた方が効率が良いと思った）

karabinerでやる方法もありますが、El Capitanデフォルトの機能を使いたいと思います
( karabinerでは `backslash` って検索すれば出てきます )

El Capitanでは「キーボード」->「入力ソース」->「"¥"キーで入力する文字」のselectorを「\（バックスラッシュ）」にするだけです

で、その後は「Option + \」を押下すれば、「¥」を入れられる

バックスラッシュよりも¥を使う人はその逆を行う
fs.statSyncでファイルの存在判定

node書いてたときのメモ。

ファイルが存在しているかを確認したい。

```bash:versions
node -v
> v4.2.3
```

[fs.existsSync(path)](https://nodejs.org/api/fs.html#fs_fs_existssync_path) はv1.0.0でDeprecatedになっていたので、[fs.statSync(path)](https://nodejs.org/api/fs.html#fs_fs_statsync_path)を使う。

```js:sample.js
fs.statSync('hoge.txt');
// Uncaught Error: ENOENT: no such file or directory, stat 'hoge.txt'
```
hoge.txtが存在しないと、エラーになるので
try catchでくるんであげる。
（```ENOENT``` は、「No such file or directory」のエラーコード。）

```js:sample.js
function isExistFile(file) {
  try {
    fs.statSync(file);
    return true
  } catch(err) {
    if(err.code === 'ENOENT') return false
  }
}

isExistFile('./hoge.txt');
// false
```

もちろん存在する時はtrueになる。