OmniAICreator/Qiita-1.07M huggingface dataset:
時系列解析メモ2

時系列解析について、個人的に習いたいと思ったのでメモ２。

沖本竜義さんの「計量・ファイナンスデータの計量時系列分析（朝倉書店）」という有名な書籍の各章の中から、
Rを用いながら、個人的に気になった箇所を確認していきます。

第二章から、

- MA、AR、ARMAの任意のパラメータを持つ人工データの生成
- 偏自己相関の計算
- モデルの推定

の３つをRでどのように行うかを確認します。
後半の2つは、モデルの選定で必要な計算になります。

Rのバージョン：`3.3.3`
です。

### MA、AR、ARMAの任意のパラメータを持つ人工データの生成
人工データの作成は、`arima.sim()`を使います。MA、AR、ARMA、ARIMAの人工データを、この関数一つで発生させることができます。

####  MAデータの人工データの生成
MA(1)モデルにおいて、

```math
\mu=2, \theta_1=0.5, \sigma=0.5
```
のパラメータを持つ場合、
```arima.sim(n = 100, list(order=c(0,0,1), ma = 0.5, sd = 0.5)) + 2
```
として作成しました。もしかしたら、平均を設定できる項目が`arima.sim()`関数の中に、あるかもしれませんが今回は発見できず。
#### ARデータの人工データの生成
AR(1)モデルで、

```math
c=2, \phi_1=0.8, \sigma=1
```
のパラメータを持つ場合、

```arima.sim(n = 100, list(order=c(1,0,0), ar = 0.8, sd = 1)) + 2 / (1-0.8)
```

として作成しました。AR(1)モデルの平均は、

```math
\mu = c / (1 - \phi_1)
```
となるので、MAモデルと比べると`2 / (1 - 0.8)`とひと手間加えてあります。
#### ARMAモデルの人工データの生成
ARMA(1,1)モデルで、

```math
c=2, \theta_1=0.5, \phi_1=0.8, \sigma=1
```
のパラメータを持つ場合、
```arima.sim(n = 100, list(order=c(1,0,1),ma = 0.5, ar = 0.8, sd = 1)) + 2 / (1-0.8)
```
として、作成しました。

### 偏自己相関の計算
モデル候補の選択の参考情報として、偏自己相関を計算します。
`pacf()`を利用します。先ほどのARMAデータをテストデータとして、
```
test_data = arima.sim(n = 100, list(order=c(1,0,1),ma = 0.5, ar = 0.8, sd = sqrt(1))) + 2 / (1-0.8)
pacf(test_data)
```
とすると、結果が図示されます。

### モデルの推定
ARMA(ARIMA)モデルの推定には、http://tjo.hatenablog.com/entry/2013/07/12/184704で紹介されている`auto.arima()`が良いです。
`auto.arima()`はどの程度当てはまりが良いか、人工データを使って確認していきます。
SICを選択することが`auto.arima()`では、出来ないようです。AICのみで確認します。



使い方は以下のような形で

```
auto.arima(test_data, max.p = 5, max.q = 5, max.d = 0, trace = TRUE)
```
MA、AR、ARMAから選択するので、`max.d = 0`としました。

``` 
 ARIMA(2,0,2) with non-zero mean : 307.0942
 ARIMA(0,0,0) with non-zero mean : 509.6861
 ARIMA(1,0,0) with non-zero mean : 308.5545
 ARIMA(0,0,1) with non-zero mean : 402.6156
 ARIMA(0,0,0) with zero mean     : 756.0283
 ARIMA(1,0,2) with non-zero mean : 304.8853
 ARIMA(1,0,1) with non-zero mean : 303.178
 ARIMA(1,0,1) with zero mean     : 307.9409
 ARIMA(2,0,1) with non-zero mean : 304.2547

 Best model: ARIMA(1,0,1) with non-zero mean 

Series: test_data 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1     ma1    mean
      0.8934  0.3281  9.7917
s.e.  0.0471  0.1146  1.2075

sigma^2 estimated as 1.125:  log likelihood=-147.38
AIC=302.76   AICc=303.18   BIC=313.18
```

モデル選択は`ARIMA(1,0,1)`となって合致してます。`ar1`と`mean`も等しく出ています。`ma1`だけ、ややずれていました。



#### 

### 参考URL
http://www.okadajp.org/RWiki/?Rの基本パッケージ中の時系列オブジェクト一覧, RjpWiki
https://cran.r-project.org/doc/contrib/manuals-jp/Mase-Rstatman.pdf, R 基本統計関数マニュアル
http://tjo.hatenablog.com/entry/2013/07/12/184704, 六本木で働くデータサイエンティストのブログ
Ubuntuの初期セットアップ

AWSのEC2をUbuntuで立ち上げた後にいつも打ってるコマンドをメモ

以下、`hoge`ユーザを作成する想定なので、`hoge`をご自身のユーザ名に置換してください.

```
### (ubuntuユーザ として作業)

## ユーザ作成
sudo useradd -m hoge
sudo gpasswd -a hoge sudo
sudo passwd hoge

## ログインシェルの変更
sudo chsh hoge
/bin/bash

## sshログインを可能にする
sudo su hoge
cd /home/hoge
mkdir .ssh
sudo cp ../ubuntu/.ssh/authorized_keys .ssh/
sudo chown hoge .ssh/authorized_keys
sudo chgrp hoge .ssh/authorized_keys
exit

### (上記で追加したユーザとしてログインし以下の作業を行う)

## 誤削除を防止する
echo "alias rm='rm -i'" >> ~/.bashrc
exec $SHELL


## sshが切れないようにする
sudo vi /etc/ssh/sshd_config
ClientAliveInterval 30 # 末尾に追加
sudo /etc/init.d/ssh restart


## OS最新化
sudo apt-get update -y
sudo apt-get upgrade -y


## IPv6サポートをoffにする
sudo vi /etc/default/ufw 
IPV6=no # yesからnoに変更


## ポート22, 80, 8000番を開けファイアウォールを有効化
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 8000
sudo ufw enable
sudo ufw status # 開けたポートにつながらない場合はAWS EC2のセキュリティグループも確認すること


## 開発ツールのインストール
sudo apt-get install -y build-essential automake libssl-dev libreadline-dev libyaml-dev libpq-dev libbz2-dev libsqlite3-dev
sudo apt-get upgrade 


## よく使うコマンドのインストール
sudo apt-get install -y pwgen zip unzip nkf screen imagemagick

## Mecab
sudo apt-get install mecab libmecab-dev mecab-ipadic
sudo apt-get install mecab-ipadic-utf8
echo "本日は晴天なり" | mecab # => 形態素解析できるかテスト


## pythonのインストール
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
echo '' >> ~/.bashrc
echo '# pyenv' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

exec $SHELL
pyenv install 2.7.11
pyenv global 2.7.11
python --version


## rubyのインストール
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo '' >> ~/.bashrc
echo '# rbenv' >> ~/.bashrc
echo 'export RBENV_ROOT="$HOME/.rbenv"' >> ~/.bashrc
echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc

exec $SHELL

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install --list
rbenv install 2.4.1
rbenv global 2.4.1
ruby --version


## nodeのインストール
curl -L git.io/nodebrew | perl - setup
echo '' >> ~/.bashrc
echo '# rbenv' >> ~/.bashrc
echo 'export NB_ROOT="$HOME/.nodebrew/current"' >> ~/.bashrc
echo 'export PATH="$NB_ROOT/bin:$PATH"' >> ~/.bashrc

exec $SHELL

nodebrew ls-remote
mkdir .nodebrew/default/src
nodebrew install-binary v8.1.2
nodebrew use v8.1.2
node --version


## 次ログインしたときに各種パッケージを最新化するようにする
pip install --upgrade pip
echo '' >> ~/.bashrc
echo '# update pip' >> ~/.bashrc
echo 'pip install --upgrade pip' >> ~/.bashrc

gem update --system
echo '' >> ~/.bashrc
echo '# update gem' >> ~/.bashrc
echo 'gem update --system' >> ~/.bashrc

npm install -g npm
echo '' >> ~/.bashrc
echo '# update npm' >> ~/.bashrc
echo 'npm install -g npm' >> ~/.bashrc



```
Homebrew でインストールしたパッケージを自動でアップグレードする

Homebrew でインストールしているパッケージを自動でアップグレードする方法をメモっとく。

# terminal-notifier をインストールする

自動アップグレードを通知するために terminal-notifier を Homebrew でインストールする。通知が不要であればインストールする必要はない。

```shell-session
$ brew install terminal-notifier
```

# terminal-notifier のインストールを確認する

下記のコマンドを実行して macOS の通知が表示されれば無事にインストールできている。（自分の環境ではインストール後に再起動したら無事に表示されたので、通知が表示されない場合は再起動してみるといいかもしれない。）

```shell-session
$ terminal-notifier -message 'Hello, world!'
```

# homebrew-update をインストールする

下記のコマンドで Homebrew に自動アップグレードの機能を追加する。

```shell-session
$ brew tap domt4/autoupdate
```

# homebrew-update で自動アップグレードを設定する

下記のコマンドで Homebrew に自動アップグレードを設定する。`--start` で自動アップデートし、`--upgrade` で自動アップグレードし、`--cleanup` で古いバージョンを削除し、`--enable-notification` で自動アップグレードを通知するように設定する。

```shell-session
$ brew autoupdate --start --upgrade --cleanup --enable-notification
```
[クイズ]javascriptと仲良くなるための一歩　第２７話「比較」

#問題

#第1問

```js
'10'>2 //=> ?
```

#第2問

```js
'10'>'2' //=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

#第1問

```js
'10'>2 //=> true
```

数として変換され比較します

#第2問

```js
'10'>'2' //=> false
```

文字列として比較します
UTF-8 へ一括変換＆「¥」を「\」へ書き換えるshスクリプト

ファイルのエンコーヂングを一括変換する需要があったので、車輪の再発明かもしれませんが自分の勉強がてら書いてみました。
カレントディレクトリ以下にある全てのencoding Shift-JISのファイルをUTF-8に変換し、全ての`¥`を`\`に書き換えます。

```encoding_converter.sh
#!/bin/sh
dir="`pwd`"
# $dir以下の全てのファイルに対して行う。
for file in `find $dir -type f`;
do
  echo $file
  # encoding_converter.sh自身だった場合にスキップする。
  if expr $file : ".*$0" > /dev/null; then
    echo "$0 itself. skip!"
    continue
  fi

  # すでにutf-8になっていた場合はtmpfに移すだけ。
  if expr "`file -bI $file`" : ".*utf-8" > /dev/null; then
    echo 'already utf-8'
    mv $file tmpf
  # そうでなければshift-jisからutf-8に変換する。
  else
    echo 'change encoding'
    iconv -f shift-jis -t utf-8 $file > tmpf
  fi
  # 変換されたものの¥を\に書き換える。
  echo 'replace ¥ with \\'
  tr '¥' '\\' < tmpf > $file
done
rm tmpf
exit

```
Unityでスクラッチくじを作ってみた

こんにちは
Unityでスクラッチくじのように銀色をスクラッチして中の何かが現れるような機能を作ってみました。
色々苦戦したのでメモ程度でまとめたものです。

## 環境周り
Unity 2017.1.0p2

## 操作方法
マウスのドラックでスクラッチ
マウスの右クリックで初期画面に戻す

## 見たらすぐわかるので、ソースコードと画像だけ添付します。
MaskのTextureのPixelを操作して実装します。

### ヒエラルキー
<img width="234" alt="スクリーンショット 2017-08-13 16.48.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/18411/220fb1aa-7677-58d3-a18f-337abc90e733.png">
<img width="259" alt="スクリーンショット 2017-08-13 16.47.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/18411/d23cc2c2-fb8e-922f-076c-3089fca7d7c6.png">
<img width="276" alt="スクリーンショット 2017-08-13 16.48.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/18411/bc8c2fdb-62df-51da-17bf-10b99e74000b.png">

### 初期状態
<img width="503" alt="スクリーンショット 2017-08-13 16.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/18411/6bdf780b-2f83-e720-5f49-b6549f1fd3aa.png">

### 結果
<img width="312" alt="スクリーンショット 2017-08-13 16.48.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/18411/d7159b0a-489c-1665-8f11-0d350fed1569.png">

### ソースコード
https://gist.github.com/shoridevel/12f9a366d8bf9eb917004ffee3711d69
PentahoRepositoryについてとPDIからの利用方法について

#Pentaho Repositoryとは
Pentahoのバージョン7系以降、Community版(無償版)で、Pentaho Repositoryという機能が使用可能になりました。
バージョン6系まではEnterprise Repositoryと呼ばれていた機能で、Enterprise版(有償版)でしか使用できなかったものです(たぶん)。

Repositoryと名がつくとおり、Spoon上で作成したETL定義体(JobやTransformation)をPentahoServerのファイルレポジトリを利用して保存することが可能です。また、Repositoryを使用することで以下の機能が使用できます。

- ETLの定義体の保存(前述のとおり)
- ETL定義体のユーザ更新やバージョン管理(前のバージョンに戻すことも可能)
- ETL定義体のロック機能([7.0までBugで実質使用不可だったが7.1で直っているもよう](http://jira.pentaho.com/browse/PDI-15976))
- DB/Hadoop/SlaveServerへの接続情報の共有
- パーティション設定の共有
- クラスタ設定の共有
- ユーザ/ロール設定(ETL定義体や各種接続情報の権限管理も)
- PentahoServerを使用したスケジュール実行

通常は、ファイルで保存しておくことが多いETLの定義体ですが、Pentaho Repositoryを使用することで、いろいろな機能が使用できますので、これはと思うものがあればお試しください。

#設定方法
まずは、初期設定です。
Pentaho Repositoryの本体はPentahoServerになるので、最初にPentahoServerを起動します。
[(Pentahoのインストールや起動方法についてはこちら)](http://qiita.com/mik/items/07112c344e658811463c)

次にSpoonを起動します。
[(PDIのインストールやSpoonの起動方法についてはこちら)](http://qiita.com/mik/items/8a36e8efb06367c82b41)

Spoonを起動すると、右側の方に「Connect」というリンクがあるのでClickします。
![Pentaho_Repository_1.png](https://qiita-image-store.s3.amazonaws.com/0/186651/e20ce3f0-8fa6-c909-644d-fefbdae6d552.png)

すると、以下のようなウィンドウが立ち上がってくるので、イメージの様に設定します。
![Pentaho_Repository_2.png](https://qiita-image-store.s3.amazonaws.com/0/186651/a57837a5-d040-3cfa-b296-f37cf91f980a.png)

```
Display Name： Repositoryの表示名(わかりやすい名前で設定)
URL： Repositoryとして使用するPentahoServerの接続先(例 http://localhost:8080/pentaho)
Description： 説明文(必要であれば)
```

以上で初期設定が完了しました。

#Pentaho Repositoryへ接続
次に、初期設定したPentaho Repositoryへ接続します。
当然ですがPentahoServerが起動している必要がありますので、PentahoServerが起動した状態で、Spoonより以下のように接続します(ユーザ/パスワードはPentahoServerと共通です)。
![Pentaho_Repository_4.png](https://qiita-image-store.s3.amazonaws.com/0/186651/afdfb957-e378-42ec-1333-d649e6836e1d.png)

#Pentaho Repositoryを使用する
##ETL定義体を保存する
Spoon上で適当にTransformationをひとつ作成します。今回は「データグリッド」ステップをひとつだけ配置したものにしておきます。作成後、保存します。
![Pentaho_Repository_5.png](https://qiita-image-store.s3.amazonaws.com/0/186651/217dfae9-e946-7522-4e45-c52feb8fc082.png)

##保存されたETL定義体を確認する(Repository Explorer)
保存されたETL定義体をRepository Explorerにて確認します。
![Pentaho_Repository_6.png](https://qiita-image-store.s3.amazonaws.com/0/186651/f9d7ab73-707a-8c90-c4c7-a311d54382c3.png)

また、Pentaho Repositoryは、PentahoServer内部にありますので、PentahoServerからも確認することが可能です。
ブラウザよりPentahoServerにアクセスして確認します。
![Pentaho_Repository_7.png](https://qiita-image-store.s3.amazonaws.com/0/186651/abbb8e49-7c65-b3ca-0425-ffa8e76587e1.png)


##その他機能について
基本的にはRepository Explorerから利用可能ですが、一部分かりにくいものもあるので、そのあたりは別途まとめる予定です。

#投稿時点での注意点
投稿時点(2017/8/13)では、[まれにSpoonの「Connect」リンクが消えてしまうBugがあるようです](http://jira.pentaho.com/browse/PDI-16465)。
まだ修正されていないようですので、リンクが消えた場合は、「data-integration/system/karaf/caches/spoon/data*」を削除して、Spoonの再起動をしてみてください。
Macbookにcomposerとvaletをつかってlaravelをインストールする

# Macbookにcomposerとvaletをつかってlaravelをインストールする

いろいろ参考にralavelをインストールしたけど、ブラウザからどうもうまく表示できなかった。導入方法はたくさん出てくるので引っかかったところだけ記録しておくことにした。

## 目的

 * Macにlaravelのプロジェクトを作る
 * composerを使ってみたい
 * 調べてたらvaletというのが便利らしいので使ってみる

## 参考サイト

 * [MacでLaravelの開発環境を整えてプロジェクトを作るまで@valet 2.x](http://qiita.com/zeriyoshi/items/f995668d435d3c7a7d9d)

## 手順

 ↑のサイトの手順通りやれば導入できる

### PHP７．＊の導入とバージョンが一致しない

インストール後にPHPのバージョンを確認してみる。

```
php -v
```

PHP7.1.8 と表示されるはずが古いバージョンが表示されてしまった。

```
which php
```

本来つなぎたい場所は

```
/usr/local/bin/php
```

なので、　vim ~/.bashrc　もしくは　vim ~/.bash_profile

```
export PATH=$(brew --prefix)/bin:$PATH
```

を追記して、もう一度

```
which php
```

ただしいpathがとおったところで、

```
php -v
```

PHP7.1.8がインストールされていることが確認できた。

＃＃＃　プロジェクト作成後に【プロジェクト名】.devでブラウザから確認できない

composerでインストールしたせい（？）かブラウザから確認できなかった。

```
cd /プロジェクトまでのpath/
php artisan serve
```

で、localhost:8000でアクセスすると繋がった。
列サイズ可変の固定長とTSVファイルの相互変換ロジック

列サイズが値によって可変になる固定長ファイル（以後列サイズ可変の固定長）とtsvファイルとの相互変換ロジックです
例えば↓のようなファイル

```
aaa bbb   ccc
a   bbbbb c  
aa  bbbb  cc 
```
通常のtsvだとエディタで開いたときにガタガタになるので、固定長にしたい。
しかし列サイズが不定だ、という場合に使います。


変換ロジック

```java
final static String SEPARATOR = "(\t| )";
final static String NEW_LINE = "\n";

/**
 * TSV⇒列サイズ可変の固定長への変換
 * @throws UnsupportedEncodingException
 */
public String Tsv2FixedLengthConv(String inStr) {
	inStr = FixedLength2TsvConv(inStr);
    //配列への変換
    String[] lineList = inStr.split(NEW_LINE);
    String[][] tsv = new String[lineList.length][];
    //for( String line : lineList ) {
    for( int i=0;i<lineList.length;i++) {
        tsv[i] = lineList[i].split(SEPARATOR);
    }

	//固定長の幅取得
	Map<Integer, Integer> maxLengthMap = new HashMap<>();
	try {
	    for( int y=0;y<tsv.length;y++) {
	        for( int x=0;x<tsv[y].length;x++) {
	            int len;

				len = tsv[y][x].getBytes("Shift_jis").length;
	            //len = tsv[y][x].getBytes("iso-2022-jp").length;
	            if( maxLengthMap.containsKey(x) ){
	                int oldLen = maxLengthMap.get(x);
	                if( oldLen < len ) {
	                    maxLengthMap.put(x, len);
	                }
	            }else {
	                maxLengthMap.put(x, len);
	            }
	        }
	    }
	} catch (UnsupportedEncodingException e) {
		// TODO 自動生成された catch ブロック
		e.printStackTrace();
	}

    //固定長への変換
    StringBuilder fixedLenStr = new StringBuilder();
	try {
	    for( int y=0;y<tsv.length;y++) {
	        for( int x=0;x<tsv[y].length;x++) {
	            int len = maxLengthMap.get(x);
	            //String s = String.format("%-"+ (len+1) +"s", tsv[y][x] );
	            int valLength = tsv[y][x].getBytes("Shift_jis").length;
	            String s = tsv[y][x].replaceAll("$", StringUtils.repeat(" ", len-valLength+1) );
	            fixedLenStr.append(s);
	        }
	        fixedLenStr.append(NEW_LINE);
	    }
	} catch (UnsupportedEncodingException e) {
		// TODO 自動生成された catch ブロック
		e.printStackTrace();
	}
    return fixedLenStr.toString();
}

/**
 * 列サイズ可変の固定長⇒TSVへの変換
 */
public String FixedLength2TsvConv(String inStr) {
	inStr = inStr.replaceAll("(\\t| )+", "\t");
	inStr = inStr.replaceAll("(\\t| )+"+NEW_LINE, NEW_LINE);
    return inStr;
}
```
初投稿

#自己紹介
初めましてtakashiです．今回，自分のメモ用やほかの人の役に立てばいいかなぁと思いブログをはじめました．
ブログを書くのは初めてなので変なことを書くかもしれませんが，そこは温かい目で見守っていただければ助かります．
#投稿していきたいこと
基本的に僕が書こうと予定しているのは以下のことです．

・ グラフィックプログラム
・ グラフィックの理論
・ C++
・ OpenGL
・ GLSL
・ WebGL
・ Javascript

この通り，コンピュータグラフィックス(CG)系ばかりなのですが，このあたりの資料ってネットで探しても英語の記事が多いので，少しでも日本語のものを多くして読みやすくしたらハッピーになる人もいてるんじゃないかなぁ・・・と思っています．
ただ，まだまだヒヨッコなので誤情報を書いてしまった場合はコメントしていただければ修正・削除しますのでご容赦ください．
RubyMineで複数のプロジェクトを同時に開く


## 環境
- Mac OS X El Capitan 10.11.6
- RubyMine 2017.2

## やりたいこと
RubyMineで複数のプロジェクトを同時に開く

## 前提
開きたいプロジェクトが既にRubyMineに登録してある状況

## やり方
- 1つ目のプロジェクトを開く

- 画面上部のメニューバーで `File` → `Opne Recent` → 開きたいプロジェクト を選択

- 「Reopen Project」のダイアログが表示されるので、 `Opne in new Window` を選択

## 参考URL
IntelliJで複数のプロジェクトを開く方法 - marsのメモ http://d.hatena.ne.jp/masanobuimai/20121024/1351085505

## Tips
RubyMineやPhpStormは基本的に同じ機能を持っているので、調べたいことが見つからない場合、 **「IntelliJ 調べたいこと」で検索する** と良いそうです。今回はこのTipsを使いました。

なお、このTipsは株式会社サムライズムさんのハンズオンで教えてもらいました:grinning:
株式会社サムライズム | Doorkeeper https://samuraism.doorkeeper.jp/
yarn自体のアップグレードをする

## はじめに
yarn自体のアップグレードをしようと思ったが、[yarn self-updateが利用できない](https://yarnpkg.com/en/docs/cli/self-update)とのことで、アップグレード方法について調査しました。

## アップグレード方法
Issueの[コメント](https://github.com/yarnpkg/yarn/issues/1139#issuecomment-283731493)を参考に以下でアップグレードできた。単純にアンインストール＆インストールし直しでした。

```shell-session
$ npm uninstall yarn -g
$ npm install yarn -g
```

`yarn self-update`はいつ頃使えるようになるんだろうか・・・。
安価なGPSモジュールとArduinoで位置情報を取得してみた


SORACOMのLoRaデバイスの接続実験の際、GPSモジュールを使って、LoRa接続ポイントの位置情報を記録することができるとのことで、早速、GPSモジュールを入手し、Arduino + GPSモジュールで、動作検証してみました。

# 環境
* MacBook Pro
	* OSX 10.12.6(Sierra)
	* Arduino IDE 1.8.3
* Arduino(互換)
* [GPSモジュール(NEO-6M NEO-6M-0-001)](https://www.amazon.co.jp/gp/product/B01D1D0F5M)

# 接続手順

## 配線

```
Arduino の GND - GPSモジュールの GND
Arduino の 3.3V - GPSモジュールの VCC
Arduino の 3ピン - GPSモジュールの RX
Arduino の 4ピン - GPSモジュールの TX
```

![IMG_6549.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/c283ed2c-0f8d-3cbd-3268-5fe9f7898766.jpeg "IMG_6549.jpg")


## Arduino IDE
* 必要なライブラリ(TinyGPS)をinstall
	* 下記より、zip fileをdownload
		* https://github.com/mikalhart/TinyGPS/releases
	* Arduino IDEより[スケッチ]-[ライブラリをインクルード]-[.ZIP形式のライブラリをインストール]より、上記でdownoadしたzip fileを選択
	* Arduino IDEを再起動
* Arduino IDEより[スケッチ例]-[TinyGPS-13]-[test_with_gps_device]を選択
* 下記の通り、`ss.begin(4800)`を`ss.begin(9600)`に変更。

```
//  ss.begin(4800);
  ss.begin(9600);
```

* Arduino IDEにて[スケッチ]-[検証・コンパイル]を実行
* Arduino IDEにて[スケッチ]-[マイコンボードに書き込む]を実行
* Arduino IDEにて[ツール]-[シリアルモニター]で、出力を確認。

![IMG_6548.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/6d098fbf-7113-d60c-73b8-94bd1963a358.jpeg "IMG_6548.jpg")

* GPSモジュールの青色LEDが点灯する状態が、GPS信号を受信できている状態のようです。
	* 私の場合は、自宅屋内では点灯しなかったので、ベランダにでて点灯確認できました。
* 最初の数行は出力内容が「***」となりますが、青色LED点灯後、正常に出力されるようになりました。

# まとめ

* これで、SORACOMのLoRaデバイスの接続実験の準備が整いました。
* 具体的には、下記サイトで、接続結果を登録していきます。
	* [SORACOM LoRa Space](https://lora-space.soracom.jp/)

以上
ionic viewを使ってデバイスでアプリを確認する



## ionic view

USBでデバイスを繋いで、ビルドしたアプリをコピーして、デバイスで確認する方法もありますが、ionic viewを使えば、
Ionicサーバからアプリケーションをダウンロードして、スマホで確認することができます。
サーバからアプリケーションをダウンロードして確認することができるので、他の人にも気軽に確認してもらうことができます。

最初のデザインモックなど動く紙芝居を確認してもらったりとか便利です。



## ionic viewの設定

### アカウントを作成します

[Sign up \- Ionic\.io: the hybrid app platform\.](https://apps.ionic.io/signup)


## アプリ側の設定

### ログイン

```bash

 $ ionic login
? Email:xxxx@xxxxxxxx
? Password: [hidden]
[OK] You are logged in!
```




### アプリの選択、新規作成する

新規作成を選択した場合、ブラウザで、ionic viewの画面が立ち上がるので、新しいアプリを作成する

```bash

$ ionic link
✔ Looking up your apps - done!
? Which app would you like to link Create a new app
[INFO] Rerun ionic link to link to the new app.
```

<img width="498" alt="xcodeproj.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/a4084053-88a6-1ce4-3628-7ba75efc0512.png">


アプリの名前を入力


<img width="500" alt="My Apps" src="https://qiita-image-store.s3.amazonaws.com/0/32215/87e25869-5aca-1682-10cc-c4beb7e1e616.png">

### リンクさせる

先ほど作成したアプリとの紐付けを行う

```bash

 $ ionic link
✔ Looking up your apps - done!
? Which app would you like to link app-test (xxxxxxx)
> ionic config set app_id ea25b23a
[OK] app_id set to ea25b23a in ./ionic.config.json!
[OK] Project linked with app xxxxxxx!
```


### テストするプラットフォームを追加する

```bash

ionic cordova  platform add ios
ionic cordova  platform add android
```

### アップロード

```bash

 $ ionic upload
Running app-scripts build:

[15:23:24]  build dev started ...
[15:23:24]  clean started ...
[15:23:24]  clean finished in 3 ms
[15:23:24]  copy started ...
[15:23:24]  transpile started ...
[15:23:26]  transpile finished in 1.86 s
[15:23:26]  preprocess started ...
[15:23:26]  deeplinks started ...
[15:23:26]  deeplinks finished in 7 ms
[15:23:26]  preprocess finished in 8 ms
[15:23:26]  webpack started ...
[15:23:26]  copy finished in 2.00 s
[15:23:32]  webpack finished in 5.86 s
[15:23:32]  sass started ...
[15:23:33]  sass finished in 865 ms
[15:23:33]  postprocess started ...
[15:23:33]  postprocess finished in 4 ms
[15:23:33]  lint started ...
[15:23:33]  build dev finished in 8.63 s
> ionic cordova prepare
> cordova prepare
✔ Running command - done!

[15:23:35]  lint finished in 2.06 s
✔ Requesting snapshot upload - done!
✔ Uploading snapshot - done!
[OK] Uploaded snapshot 2d047ab8-70fe-402d-9217-40f0e2d21fb2!
```


## デバイス側の設定


### ストアにアプリがあるので、インストールしてきましょう。

![ionicview.PNG](https://qiita-image-store.s3.amazonaws.com/0/32215/18f55937-c8de-714e-6b5e-ea83630a52f6.png)


### 上記のionic-viewのアカウントでログイン

### 自分がアップロードしたアプリが見れます


<img width="600" alt="IMG_1481.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/cddd9337-a1eb-0b8a-d2c6-da637ef4878d.png">

アプリを見ます

<img width="600" alt="IMG_1482.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/4d04131e-1e1b-a0d4-5841-b9b22034bda0.png">

三本指の操作で、アプリのプレビューを終了したり、画面毎にフィードバックを記入して返すことができます。

<img width="600" alt="IMG_1483.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/dcad541c-0312-8733-49e6-59dbcc75c83c.png">


適材適所で使うと良いかもです。
kubernetes(GKE)のingressでサブドメインのhttps対応メモ (kube-lego)


やりたいことは、`test.com`と`api.test.com`のようなドメインで同じSSL証明書を使用することです
kube-legoやkubernetesのページ読んでも複数ドメインの対応は書いてあったけど、http前提で書いててつらくなっていました
結局ingress.yamlの書き方で解決できたのでメモ
環境はGKEを使用しています

## サブドメイン対応のingress.yaml

とりあえず書き方だけ見たい時用にyaml
tls: hosts:下に2つサブドメインも含め書けばいいだけです

```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tetetest-loadbalancer
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "tetetest-loadbalancer-ip" # GCPで作成した静的IPアドレスの名前
    kubernetes.io/tls-acme: "true" # HTTPS対応する
    kubernetes.io/ingress.class: "gce" # GCPを使うのでgce
spec:
  tls:
  - hosts: # ここの下に2つドメインを記述する
    - test.com # 普通のドメイン
    - api.test.com # サブドメイン
    secretName: test-loadbalancer-tls # k8sに作成されるsecrets名
  rules:
  - host: test.com # フロントエンド用のドメイン
    http:
      paths:
      - path: /*
        backend:
          serviceName: test-angular # フロントエンド用サービス名
          servicePort: 80 # フロントエンド公開ポート NodePort
  - host: api.test.com # API用のサブドメイン
    http:
      paths:
      - path: /*
        backend:
          serviceName: test-api # API用サービス名
          servicePort: 9000 # API公開ポート NodePort
```



## 参考

#### ingressを使ってのwebページ公開の手順
[kubernetes/ingress](https://github.com/kubernetes/ingress/blob/master/controllers/gce/README.md#tls "kubernetes/ingress")

deployment等でpodを作成 -> そのpodをNodePortでservice公開(例えば8080番) -> ingressでGoogleCloudLoadBalancingの作成(service名とポート指定してフォワーディング先を決定)

#### kube-legoでHTTPS対応
kube-legoを使ってHTTPS対応のwebページ公開の手順
[kube-lego example](https://github.com/jetstack/kube-lego/tree/master/examples/gce "kube-lego example")

kube-legoディレクトリの下にnamespace, configmap, deploymentを作成してLet'sEncryptから証明書を取得できるようにします
そして最初に書いたようなingress.yamlを作成してLBを設定します
macOS High Sierraでcocoapodsが使えなかった話（解決）

#問題
・macOS High SierraをインストールしたMacでpodのインストールをしようとしたところ、エラー


```ターミナル:ログ
KentaroAbe-no-MacBook-Pro:bin KentaroAbe$ sudo vim pod
KentaroAbe-no-MacBook-Pro:bin KentaroAbe$ pod install
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad interpreter: No such file or directory
```

#原因
・Rubyのバージョンが違う

[GitHub](https://github.com/CocoaPods/CocoaPods/issues/6778)に該当記事があった（公開からだいぶ経ってGitHubであるべき表示がStackOverFlowになってるのに気づいた）
[別記事](http://applech2.com/archives/20170618-macos-10-13-high-sierra-update-ruby-and-php.html)によれば、前にrubyバージョンが上がったのはMavericks以来で実に4年ぶりだそうな

>The reason seems to be change of system ruby version to 2.3. The path is moved to /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin.

#解決策
```sudo gem update --system```を実行して、その上で```sudo gem install cocoapods```
私は一応cocoapodsを一旦削除したが、果たして必要だったのかは定かではない

#余談
[GitHubに上がってた別の質問](https://github.com/CocoaPods/CocoaPods/issues/6778)があったが、何故か上手く行かなかった
　
　
　
案外単純な解決策でしたが、誰かの参考になればと
railsのルーティングの設定についてまとめた

# ルーティングの設定場所

config/routes.rb

# getとpostについて

* get・・・DBを変更しないリクエストに使う。viewを表示させるときが主。
* post・・・DBに変更を行う場合に用いる。form_tagから送る時によく使う。

getとpostは同じURLを設定しても別のルーティングとみなされる。
Redmineにプラグインを追加する。

# はじめに
先日、Redmineのプラグイン追加作業を行ったので、その内容についてまとめておきます。

# 作業
具体的な方がイメージしやすいと思うので、今回は [**clipboard_image_paste**](https://github.com/peclik/clipboard_image_paste) というプラグインの追加を例として行いたいと思います。

まずは作業ディレクトリへ移動です。既にインストールしてある *redmine* のディレクトリ配下に *plugins* というディレクトリがあるはずなのでそこへまず移動します。

```bash:ディレクトリ移動
$ cd /var/lib/redmine/plugins
```

移動したら、今回のプラグインは *git* のリポジトリに存在するので `git clone` でダウンロードします。

```bash:ダウンロード
$ git clone https://github.com/peclik/clipboard_image_paste.git
Cloning into 'clipboard_image_paste'...
remote: Counting objects: 456, done.
remote: Total 456 (delta 0), reused 0 (delta 0), pack-reused 456
Receiving objects: 100% (456/456), 262.35 KiB | 0 bytes/s, done.
Resolving deltas: 100% (168/168), done.
Checking connectivity... done.
```

ダウンロードしたらその所有者をredmineのディレクトリと同じにしておきましょう。
デフォルトは *redmine* になってるかなとも思いますが、場合によったら *apache* などになってる可能性もあるのでそこは確認して変更してください。

```bash:所有者変更
$ chown -R redmine.redmine clipboard_image_paste
```

それではいよいよインストールです。と言っても以下の一行を実行するだけです。

```bash:インストール
$ bundle exec rake redmine:plugins:migrate RAILS_ENV=production
(in /var/lib/redmine)
Migrating clipboard_image_paste (Clipboard image paste)...
Migrating redmine_absolute_dates (Redmine Absolute Dates plugin)...
Migrating redmine_banner (Redmine Banner plugin)...
== 1 CreateBanners: migrating =================================================
-- create_table(:banners)
   -> 0.0749s
== 1 CreateBanners: migrated (0.0751s) ========================================

== 2 RenameColumnType: migrating ==============================================
-- rename_column(:banners, :type, :style)
   -> 0.0544s
== 2 RenameColumnType: migrated (0.0547s) =====================================

== 3 AddDisplayPartToBanners: migrating =======================================
-- add_column(:banners, :display_part, :string, {:default=>"all", :null=>false})
   -> 0.0397s
== 3 AddDisplayPartToBanners: migrated (0.0399s) ==============================

== 4 ChangeColumnStyle: migrating =============================================
-- change_column(:banners, :style, :string, {:default=>"info", :null=>false})
   -> 0.0245s
== 4 ChangeColumnStyle: migrated (0.0247s) ====================================

== 5 ChangeColumnBannerDescription: migrating =================================
-- change_column(:banners, :banner_description, :text)
   -> 0.0382s
== 5 ChangeColumnBannerDescription: migrated (0.0384s) ========================
```

特に問題なくインストールができたら、あとは apache再起動 をするだけです。

```bash:apache再起動
$ sudo service httpd restart
```

# 確認
作業が正常に完了すると **[管理] > [プラグイン]** の項目に先ほど追加したプラグインが表示されます。

![スクリーンショット 2017-08-13 15.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/82090/adf50906-46f5-6564-058f-3328b08c3e21.png)


# おわりに
今回はプラグインのダウンロードに`git clone`を使いましたが、そのディレクトリに配置できればどんな方法でも構いません。
ですが、`git`を使った方がアップデードした際に`pull`で簡単に取得できるので便利なので利用できるならおすすめです。
【MySQL】existsの挙動まとめ

# まとめようとしたきっかけ
不具合を直そうと思ってexistsを使った結果、使い方を誤解していたために、別の新たな不具合を仕込みかけた:sweat_drops:
「select *」ではなく、存在チェックをしたかったカラムをピンポイントで取得しようとするときに（select nameなど）にハマった罠でした。

# サンプルデータ
テーブル名：member

| id | name | sex | div | age |
|:--|:--|:--|:--|:--|
| 1 | 田中 | 男 | 営業 | 25 |
| 2 | 佐藤 | 男 |   | 34 |
| 3 | 池田 | 女 | 開発 | 28 |

## select * の場合
特に問題ない。引っかかるポイントはないはず。

### where sex = "男"
取得結果は・・・↓

| id | name | sex | div | age |
|:--|:--|:--|:--|:--|
| 1 | 田中 | 男 | 営業 | 25 |
| 2 | 佐藤 | 男 |  | 34 |
レコードが取得できたので、この時のexistsの結果は「１(true)」。

```SQL
select exists (select * from member where sex = '男');
```

### where div = "総務"
取得結果は・・・↓

| id | name | sex | div | age |
|:--|:--|:--|:--|:--|
div = '総務'というレコードは存在しない＝レコードが取得できないので、existsの結果は「０(false)」。

```SQL
select exists (select * from member where div = '総務');
```

## select divの場合
１カラムだけ取ってくるので、カラムの値とレコードの有無がごっちゃになってしまいがち:droplet:

### where name = "田中"
取得結果は・・・↓

| div |
|:--|
| 営業 |
レコードが取得できているので、existsの結果は「１(true)」。

``` SQL
select exists (select div from member where name = '田中');
```

### where name = "佐藤"
取得結果は・・・↓

| div |
|:--|
|  |
レコードが取得できているので、**existsの結果は「１(true)」**。

```SQL
select exists (select div from member where name = '佐藤');
```

#### ひっかかりポイント！
このselect文では１レコード取得できている。

```SQL
select * from member where name = '佐藤';
```
あくまでも、divというカラムがnullとか空文字だっただけで、レコードとしては存在している。
そのため、existsは「１(true)」になる。

nullとか空文字であることを判定したいなら、ifnullとかがよい。
Stderr: VBoxManage.exe: error: The virtual machine has terminated unexpectedly d uring startup with exit code -1073741819 (0xc0000005)

#対処方法
自分の場合はvirtual boxをアンインストール、再インストールであっさり直りましたが
要バックアップだと思いますので実際の作業をご確認ください。
自己責任でお願いいたします。

#発生原因の予想
windows updateの時にvagrant haltを実行していなかった。
つまりvirtual box内のcentosが立ち上がった状態で
アップデートしてしまった際に起こったと予想される。

#環境・状況
ホストOS：windows10
ゲストOS：linux centos6
vagrantにて管理、操作
virtual boxのgui立ち上がらず（時計回ってそのまま何も起こらず）
vagrant upでは表題のエラーがでる

#実際の作業まとめ
1．ホストOSのコマンドプロンプトでvagrant fileがあるディレクトリに移動
2．vagrant packageを実行
3．ディレクトリ内に拡張子packageのファイルができているか確認
4．packageファイルを別PC（今回はmacに移動）
5．macのターミナルでvagrant fileを配置するディレクトリを作成し移動
6．vagrant box add centos6 package.box
7．vagrant box listでcentos6が出るか確認
8．vagrant init centos6でboxを使用できる状態にします。ディレクトリにvagrant fileがあるか確認。
9．vagrant upで環境が復元できているか確認
10．元のPCでvirtual boxをコントロールパネルからアンインストール
11．virtual boxの最新版をインストール

#備忘録
vagrantのboxファイルさえあれば環境が復元できる。
virtual boxのスナップショットでも復元できると思われる。


認識違いやおすすめの管理法などコメントいただけましたらうれしいです。
[#Node-RED] ７〜８分でわかるファンクションノード

![ファンクションノード.png](https://qiita-image-store.s3.amazonaws.com/0/147007/6851c7a5-0d6b-1f24-d5e1-33ea7ad5511a.png)
Visual IoTツール Node-REDには、データセットや基本的な制御構造がありますので、簡単なプログラムならコーディングなし（設定だけ）でプログラムを書くことができます。

しかし、少し複雑な処理になるとファンクションノードが便利です。ファンクションノードはjavascriptでコーディングできますので、複雑な処理をフローにまとめることができ、シンプルなわかり易いフローが書けます。

# １．基本

まずは基本的な内容から。

## 1.1 名前をつけよう

ノードには日本語で名前を付けることができます。処理内容を表す名前を付けておくとフローが読み易くなります。「XXに変換する」「msg.cnt++」などわかり易い名前を付けてください。

## 1.2 入力は最大一つ、出力は複数可能

ファンクションノードの入り口は一つだけです。デフォルトの出力は一つですが、下部にある出力数を変更して増やすことができます。出力が複数場合は戻り値を配列で返します。出力しない出口にはnullをセットします。条件によってどれか一つに値を出力するだけなら、スイッチノードに渡した方が、修正が楽な場合もあるでしょう。
（追記：バージョン0.17以降では端子に名前をつけるとマウスオーバーで表示できますので、入出力などをわかり易く書いておくと良いでしょう。）

## 1.3 javascriptでコーディング

内蔵エディタはjavascript構文を理解してエラーやワーニングを表示してくれます。Node-REDが動作するNode.jsのバージョンの文法で記述します。msgオブジェクトを受け取って処理し、リターンバリューがmsgオブジェクトになります。

# ２．あらかじめ定義されたオブジェクト

msgオブジェクト以外のあらかじめ定義されたオブジェクトを説明します。

## 2.1 グローバルオブジェクト

プログラム全体で利用可能なグローバル変数が使えます。
global.get(‘オブジェクト名’)で取得し、 global.set(‘オブジェクト名’,値)で値を設定します。現在は永続化されないので、再起動で初期化されます。

## 2.2 フローオブジェクト

タブ内で有効なフロー変数もあります。
flow.get(‘オブジェクト名’)で取得し、flow.set(‘オブジェクト名’)で値を設定します。
永続化されないので、再起動で初期化されます。

## 2.3 node.send()

一つの出口に複数返す場合や、無名関数内で終了する場合は、returnでなく、 node.send(msgオブジェクト)を用います。returnは最後の一度死活変えませんし、無名関数内のreturnは全体の戻りではないからです。

## 2.4 requireはsetting.jsで

ファンクションノード内で requireできません。requireが必要な場合は、setting.jsのfunctionGlobalContextにrequireを追加します。Node-REDを再起動すると、設定したオブジェクトを global.get(‘オブジェクト名’) で取得できます。もちろん、必要に応じてユーザーディレクトリ（ ホームディレクトリ/.node-red）で、モジュールをnpmインストールする必要があります。

# ３． オブジェクトの管理

簡単に見えるNode-REDプログラミングですが、意外とハマるのがオブジェクトの管理です。

## 3.1 msg.payloadは基本

標準的な出力はmsg.payloadですが、破壊されることも多いです。payload以外のプロパティを使えば多くの場合は大丈夫です。しかし、新しいmsgオブジェクトが生成される場合は、フロー変数やグローバル変数を使います。

## 3.2 新しいmsgオブジェクトで返す

受け取ったmsgオブジェクトを渡したくない場合は、「return {payload: 値};」とすると新しいオブジェクトのmsg.payloadとして値を返すことができます。ただし、後続の処理で、受け取ったmsgオブジェクトの値を渡せないので注意してください。特にhttp inが出力するmsgオブジェクトには、http responseに必要な情報が含まれますので注意してください。

## 3.3 コピーされるオブジェクト

「return [msg, msg];」のようにmsgオブジェクトを複数同時に返すと、オブジェクトッがコピーされ、別々のオブジェクトが渡されます。また、一つの出口から複数のノードに繋いだ場合もコピーされます。大量データを扱う場合には注意してください。新しいmsgオブジェクトを生成するか、node.send()で出力すると参照が渡されます（参照を渡すと想定外に内容が破壊されてしまうことがありますので注意してください）。

# ４．おわりに

簡単に始められるNode-REDプログラミングですが、ドキュメントをきちんと読んだり、色々試さないとわからないことがあります。ここに挙げた内容がわかっていれば、少し複雑な処理もスラスラと書けると思います。

詳しくは、[公式ドキュメント](https://nodered.org/docs/)の確認や、実際に動かすなどしてください。それでも困った時は、[ユーザー会](https://www.facebook.com/groups/noderedjp/)、[slackやメーリングリストなど](https://nodered.org/about/community/)で聞いてみると良いと思います。
C#の備忘録Tips

# .NET Core 導入で気を付けること

## コンソールの文字化け対策
1. `Install-Package System.Text.Encoding.CodePages` またはNugetで`ystem.Text.Encoding.CodePages`をインストール
1. `Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);`をソースに追加

# C言語出身者からのC#で気を付けること

## 定数定義について

`public`な定数については、`const`を使用すべきではない。
これは、**バージョン管理問題**[^1]が発生するため。
以下のように、`static readonly`を使用すべき。

```C#
○ public static readonly double Ratio = 3.14
× public const double Ratio = 3.14
```

[^1]: const値はビルド時に値が読み込まれる。そのため、dllでconstを使用している場合、dllをコンパイルしなおしただけではexe側では値が更新されない（exeのリビルドが必要）

## 例外処理について
例外処理という概念そのものがC言語にないので、存在は知っていても扱いにかなり戸惑う。
[こちら](http://qiita.com/tassi-yuzukko/items/ba8381c0edd34f717968)に移動

# MultiThreadデザインパターンのC#版について
[こちら](http://qiita.com/tassi-yuzukko/items/4953654bad83798d2457)に移動

# このキーワードは何？

## volatile
* C言語でも、マルチスレッド動作させるときによく使用するやつ。
* 最適化をさせない変数に対して宣言するというのは、C言語と同じ。
* C言語でもそうだったかわからないが、最適化させないという結果、**複数スレッドでアクセスした場合は、常に最新の値が取得できることが保証される**らしい。
* なので、MSDN的には、`lock`等で排他制御をしないフィールドに対して、同期は行いたいというときに使用するべきらしい。

上記より、端的に言うと以下である。

* `lock`した場合は、排他制御あり／同期あり
* `volatile`した場合は、排他制御なし／同期あり

# Taskについて
## Task と ThreadPool の関係
常識なのかもしれないが、Taskを使用して起動したスレッドは、内部的にはスレッドプールを使っているらしい。

## Taskの挙動
面白い情報があった（[[.NET]複数のTaskを一度に開始しようとすると遅延が発生する](http://oita.oika.me/2016/02/18/task-and-threadpool/)）

>スレッドの数を無駄に増やしてしまわないよう、
>新しいスレッドが必要になった場合は、500ミリ秒に1つの割合を
>超えないペースでスレッドを生成する設計だとのこと

ということで、Taskは必ずしも同時に並列で実行されるわけではないらしい。
上記の記事より、**Taskはスレッドプールを使用しているといえども、複数のTaskを同時実行する要求があると、新しくスレッドを起動する仕組み**みたいね。（確かめてないけど）

# デザインパターンについて

## 状態を持つSingleton禁止
状態を持つオブジェクトに対して`Singleton`パターンを適用するのはNG

* それただのグローバル変数ですから！
    * テストしづらくなるだけ
* DIで渡すとかするべし

### じゃあどういうときにSingleton使うのよ？
いろいろ説があるみたいだけど、一番しっくり来たのは以下。

>Abstract Factoryパターンを実装するために、次のような役に立つテクニツクがある。
>1. Singletonパターンを利附する。典型的なアプリケーションでは、部品の集合ごとにConcreteFactoryクラスのインスタンスを1つしか必要としない。したがって、通常ではConcreteFactoryクラスをSingletonパターンを使って実装することが最良の方法になる。

つまり、`AbstractFactroy`パターンの`ConcreteFactory`に該当するクラスはSingletonでもいいよってこと。
何故なら、ConcreteFactoryクラスは状態を持たないはずだし、生成者なのでインスタンスはアプリケーション内で一人で十分だから。

#### 参考
* [Singleton パターンの使いどころをまとめてみた](http://qiita.com/trashtoy/items/eea5dcfb1eb003101cc9)
* [Singletonパターンはどのようなときに使うのか？](http://qiita.com/ndxbn/items/c7a37ea950876176bb81#_reference-37f53013290fc176bda6)
node.js + Express 最低限のメモ


Expressを利用して簡単な処理（API返すとか）を実行。

## 前提

* Mac環境
* Node.jsは既に入っている。

## Expressのインストール

```bash
cd
mkdir express
cd express
npm install express
```

## 実装

作業フォルダにapp.jsを作成する。
とりあえずHelloWorldとAPIの基本。

```js:app.js
var express = require('express');
var app = express();

//HelloWorld
app.get('/', function(req,res,next){
    res.send("Hello World");
});

//API
app.get('/api/:memberId', function(req,res,next){
    var memberId = req.params.memberId;
    var data = {"status":"OK","memberId":memberId}
    res.json(data);
});

//Listen
app.listen(3000, function(){
    console.log("Start Express on port 3000.");
});
```

### 実行と動作確認

```bash
node app.js
```

http://localhost:3000 や http://localhost:3000/api/12345 とかにアクセス。
Windows + docker-compose + mysql で文字化けさせない方法

`Windows` の `VirtualBox` + `docker-compose` + `mysql` という組み合わせで、
初期データの **文字化け** が回避できず苦しんだが、解決できたのでメモ。


# 結論

`mysql` の文字コード指定で、

```
volumes:
  - "mysql.conf.d:/etc/mysql/conf.d"
```

の代わりに下記を指定する。

```
command: >
  mysqld
    --character-set-server=utf8
    --collation-server=utf8_unicode_ci
    --skip-character-set-client-handshake
```

つまり、`command` で `mysqld` の引数に下記を指定する。

- `--character-set-server=utf8`
- `--collation-server=utf8_unicode_ci`
- `--skip-character-set-client-handshake`

※ `skip-character-set-client-handshake` はクライアント設定に関係なく `utf8` を強制する。

これでOK。


なお、今回の件で判ったのだが Windows 環境で `/etc/mysql/conf.d` を使う場合は注意が必要だ。



# 文字化けする条件

- Windows で VirtualBox を使っている。
- `my.cnf` を `volumes` の `/etc/mysql/conf.d` で渡している。
- その `my.cnf` は Windows 上のファイルであり、マウント経由で VirtualBox からアクセスしている。

この場合、実は `my.cnf` が読まれない。


# なぜ `/etc/mysql/conf.d` を使うとうまくいかないのか

通常なら `/etc/mysql/conf.d` を設定することで独自の `my.cnf` を配置することができるので、この機能を使って文字コード周りの設定をするのだと思う。

ただし、Windows の VirtualBox でマウントしてるディレクトリから `my.cnf` を提供しようとすると、簡単にはできない。

その理由が下記:

- `mysql` は File の Permission が `777` の `.cnf` を読まない。
- Windows からマウントしているディレクトリ/ファイルはすべて `777` になる。
- `/etc/mysql/conf.d` で volume 指定したファイルも `777` になる。

これを指定して実行すると mysql は起動するものの、ログをよく見ると下記のメッセージが出ている。

```
mysql: [Warning] World-writable config file '/etc/mysql/conf.d/my.cnf' is ignored.
```

Permission が `777` になってたから無視したよ、という意味だ。

つまり、`my.cnf` を読ませるためには、マウント経由で渡す Windows 上のファイルではダメで、
何らかの方法で VirtualBox 上で作成(or コピー)したファイルを渡さなくてはならなかった、ということ。


# `/etc/mysql/conf.d` を使いたいならどうすればいいのか

`mysql` の `image` を直接使わずに `Dockerfile` を１段階噛ませて、その中でマウント経由でアクセスするファイルを VirtualBox 上にコピーしてしまえば動くはず。
Neural Network > Neural Computation: Lecture 7 by John A. Bullinaria, 2015 > cost function | activation function | normalization of outputs

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

TensorFlowでの5次元関数の学習に関して。

cost functionやactivation functionsはどういうものが良いか?

Neural Computation: Lecture 7
@ John A. Bullinaria, 2015
http://www.cs.bham.ac.uk/~jxb/INC/l7.pdf
@ L7-9

> Regression/Function Approximation Problems
> SSE cost function, linear output activations, sigmoid hidden activations

こちらでは現在、上記のcost function, output activation, hidden activationsを使用中。

> In each case, application of the gradient descent learning algorithm (by computing the
partial derivatives) leads to appropriate back-propagation weight update equations.

現在AdamOptimizerを使用中。SGDにするとlossの経過は良くなかった。パラメータの選択によるかもしれない。

...

@ L7-16

> For regression problems, the SSE cost function itself is often the most useful measure of performance. Sometimes it is helpful to divide that by the number of patterns and take the square root to give the Root-Mean-Squared Error (RMSE). It might also help to normalize the outputs by dividing by the target mean or standard-deviation.

出力層のnormalizeについて書かれていた。

output layerのデータ標準化も試してみたが、まだ誤差は大きい。
デザイナーに Git を使ってもらおう

バージョン管理の文化がない現場に配属され Git 運用開始しました。
私、新人エンジニアｘ１、ウェブデザイナーｘ３構成。
単純運用から開始～１年後にはそれなりに使えるようなってもらう計画。

ホスティングサービスは BitBucket （日本語多いって重要！）
クライアントは TortoiseGit (女性陣に飛んでいく亀がめっちゃ受けてました！)
最初はマスターブランチのみの運用（笑）

#運用開始
Git のインストール、BitBucket 登録と同時に5分程度で終わるチュートリアルプロジェクトを作成して Git 操作の成功体験をさせ、小さなプロジェクト（更新作業のみ）から運用開始。

予想通り助けてコールの嵐。
面と向かって文句は出ないが、明らかに面倒くさがっているのが分かる。

###目についたこと

- びっくりするほどドキュメント読まない調べない
- リポジトリが理解できない
- index_2017xxxx.html みたいに手作業でバックアップ取る癖が直らない
- Git 介さずにクライアント⇔サーバ作業する人がいる
- バージョン管理する意味が分からない
 
とはいえ、２か月後には助けてコールは激減し、単純運用なら出来るようになる。


#問題発生
ここでブランチを切る必要のある案件が発生。
メンバーに説明するが伝わらない。みんな ？？？ 状態。
ブランチの仕組みや切替時の挙動の説明中にデザイナーの１人がぶちキレ。

**Aさんは分かってるかもしれないけど私たちには分からないんですっ！！**

#問題解決に向けて
あ、これヤバイ。ほんまあかんやつや。と、エセ大阪弁が出るくらい危機感を抱いた私は方向性を変えました。

- 仕組みを覚えてもらうのは諦める。
- TortoiseGit やめて、初心者でも絶対分かる簡単なクライアント作る。

###ツール作成
最初は
[本番サイト作成] [テストサイト作成]
[最新もってくる] [アップする]
の４つのボタンがあるだけのクライアントでしたが、さすがにこれだと自分が使えないので少しずつ機能追加。結果、別物に。

###マクロ作成
マクロ機能で、「テストサイト作る時はこのマクロ実行しれ！」を出来るようにした。
最初の４つボタン時みたいに、これやりたい時はこれ押せ！をマクロで実現。

###ドキュメント作成
助けてコールで最も多い「push できなくなった」時の対処法のドキュメントを画像たっぷりで作成。
※文章だけだと**絶対**読みません。

#現状

運用開始してから約８カ月。
Git 使うのが当たり前になった。（面倒くさいという感情がなくなった）

###成果

- Git に対する苦手意識が薄れた（コンフリクトは苦手）
- 手作業でバックアップ取る人がほぼいなくなった（たまーにある）
- バージョン管理あると便利だと思ってくれるようになった
- なんだかんだで Git の用語がある程度身についた

###思ったこと

**Git の仕組みのような細かい説明はしない**

興味のない人、覚える気のない人に説明しても無駄。運用方法だけ覚えてもらう。

**説明する時は図を交える**
 
言葉だけで説明して分かってもらうとか無理。

**助けてコールの対処は使用しているクライアントで**
TortoiseGit 使用時、面倒くさい場合は Git bash でコマンド打って、はいできましたよってやってました。振り返ってみて最も反省する点。

**バージョン管理の有用性を体感をさせる**
 
あるプロジェクトで、
偉い人「巻き戻さないといけなくなるかもしれないんだけど大丈夫？」
メンバー私を見る。
私「バージョン管理してるのでいつでも戻せますよ(ｷﾘｯ」
思えばこの出来事があってからバージョン管理に対する不満がパタリと無くなった気がします。

#結論

バージョン管理やったことない非エンジニア系女子でも Git 使えるようになるよ！
運用開始さえすればこっちのもの！
慣れるまで色々あるけど、教える側は絶対感情的にならないように！特に女子相手！


#人柱募集
ツールは wpf で作成しています。
[NyoroGit](http://nyoro.jp/pages/nyorogit.html)

Windows 限定です。
MBPが物理的に壊れて起動しないため、mac 版は当面考えておりません。

![ng_image.png](https://qiita-image-store.s3.amazonaws.com/0/13030/ffd63221-e951-d206-2a75-1b61e02be916.png)
railsでユーザー機能を作成する

# 仕様書

webサービスにユーザーの登録、ログイン、編集で必要な機能を作成していく。

* ユーザーの一覧作成
* ユーザーの詳細ページ
* ユーザーの新規登録
* ユーザーの情報編集
* ユーザーのログイン（セッションなどの設定）


# ユーザー機能の準備

## テーブルとモデルの作成

```ruby:rei
rails g model カラム名:データ型
rails db:migrate
```

上記でまずモデルとテーブルを作成する。今後テーブルのみ作りたい事が出た場合はこのやり方だと一緒にモデルも作成されるのでダメ。

この処理行なわれるのは

* db/migrateフォルダにmigrationファイルの作成
* modelフォルダにmodel作成

## バリデーションをかける

バリデーションというのはユーザーが情報を入力する際に間違っていたらはじく仕組みのこと。

```ruby:rei
validates :カラム名, {presence: true, uniqueness: true}
```
上記のようにカラム名に対してどういった種類のバリデーションをかけるのかをモデルで設定する。

# ユーザー一覧の作成

## コントローラの作成

```ruby:rei
rails g controller コントローラ名 アクション名
```
これで

* controllerの作成
* ビューファイルの作成

が行なわれる。

## ルートの設定

ルートファイルに

```ruby:rei
get "URL" => "コントローラ名#アクション名"
```

を設定

## コントローラファイルにユーザーのデータを全て引っ張ってくる変数の設定

```ruby:rei
class UsersController < ApplicationController
  def index
    @users = User.all
  end
end
```

## ビューファイルにてeach文で繰り返しでユーザー情報表示

```ruby:rei
<!-- 配列@usersの要素を1つずつ取り出し、変数userに代入 -->
<% @users.each do |user| %>
  <!-- 繰り返したい処理を記述する -->
<% end %>
```

# ユーザー詳細ページの作成

ユーザー一覧から飛べる詳細ページの作成をしていきます。

## 作りたいモノ

* 一覧ページからリンクで飛べる
* /users/showで見れる

## ルーティングの作成

```ruby:routes.rb
get "users/:id" => "users#show"
```
users/:idにアクセスされた時にusersコントローラのshowアクションに問い合わせするように設定

## アクションの設定

```ruby:users_controller.rb
def show
  @user = User.find_by(id: params[:id])
end
```
showアクションを設定し、Userクラスを用いてユーザー情報を引っ張ってくる。これで対象のidのユーザー情報を@userに入れている。@がついているのはアクションで設定した変数をviewで使う際に必要なため。

## showファイルの作成

viewにshowファイルを新規で作成する。

# ユーザー登録機能の作成

## 登録ページの作成

まずviewを作成していく。

### ルートの設定

```ruby:routes.rb
  get "signup" => "users#new"
```

これでドメイン/sigupのURLが打ち込まれた際にusersコントローラのnewアクションを開くようになる。

### コントローラ、ビューの作成


```ruby:users_controller.rb
def new
end
```
コントローラにnewアクションを作成し、new.html.erbも新規で作成。

## ユーザー情報の登録

### ルートの設定

```ruby:routes.rb
post "users/create" => "users#create"
```
DBを書き換えるためのルートなのでpostを用いている。これでformからusers/createが問い合わせされた際にusersコントローラのcreateアクションを問い合わせる。

### ビューのformタグの設定

```ruby:new.html.erb
<%= form_tag("送信先URL") do %>
  フォームの中身
<% end %>
```
### inputタグについて

```ruby:new.html.erb
<%= form_tag("送信先URL") do %>
  <input name = "">
<% end %>
```
name属性を設定することでparamsで受け取れるようになる。

```ruby:new.html.erb
def create
  @user = User.new(name: params[:name], email: params[:email])
  @user.save
  redirect_to("/users/#{@user.id}")
end
```

form_tagからcreateアクションに問い合わせを行い、

* @userに登録された情報を入れる
* @user.saveでDBに保存
* redirect_toでユーザー詳細ページに飛ばす

を設定。

## ユーザー登録時にログイン状態にする

ユーザー登録がすんだらログイン済みにしておかないと再度ログインしなければいけません。登録のアクションに

```ruby:rei
def create
 @user = User.new(
      name: params[:name],
      email: params[:email],
      image_name: "default_user.jpg",
      password: params[:password]
    )
    if @user.save
      session[:user_id] = @user.id
      flash[:notice] = "ユーザー登録が完了しました"
      redirect_to("/users/#{@user.id}")
    else
      render("users/new")
    end
  end
```

# ユーザー情報編集機能

## 編集画面の作成

```ruby:routes.rb
get "users/:id/edit" => "users#edit"
```

で作成。viewの作成の場合はget。form_tagなどでDBを変更する場合はpost

```ruby:users_controller.rb
def edit
  @user = User.find_by(id: params[:id])
end
```

アクションはそのviewでしか効かないので@userの定義をもっかいする。
Raspberry PI3 でソニーセミコンダクタソリューションズのIU233をSSP+OpenCV経由で動かす③　IU233をCSIから撮影

# 概要

今年の[みんなのラズパイコンテスト2017](http://coin.nikkeibp.co.jp/coin/itpro-s/seminar/LIN/abstract/index.html)でソニーセミコンダクタソリューションズさんの「[IU233](http://www.sony-semicon.co.jp/products_ja/IS/sensor3/index.html)」をお借りすることができました．
IU233をラズパイで動かす手順については，「[ビジョンプロセッシング・コミュニティ](https://www.visionproc.org/IU233_usage.php)」にて説明がなされているのですが，これを実際にプログラムに組み込んで使用するためにOpenCV上からアクセスすることを目指してトライしてみました．

# 前回までのあらすじ

USB接続での画像取得はある程度見えてきました。しかし、cv::Matを使ったcpp的なやり方だとカメラの解像度をコントロールすることもできない状態でした。

今想定しているガジェットはUSBでコントロールできるのならそれでもいいんですが、高速シャッターとしての機能が欲しいのと、できれば高速動画も使えたら嬉しいなと思っているので、CSIで使う方法になるんじゃないかな、となんとなく思っています。

色々とフォーラムにも書き込んで、[ここ](https://www.visionproc.org/community_article.php?category=8&article=63)でもやっぱりSSPを介してやるのが良さそうなので、
SSPを使ってトライ。

## Highｓspeedを試す
[ダウンロードサイト](https://www.visionproc.org/download.php)にHighspeed撮影のサンプルがあったので、これをダウンロード。
readmeにあるように、フォルダの位置を決めて「highspeed」にリネーム。
makeしたらコンパイルできるというが。。。。


> highspeed.c:78:1: error: unknown type name ‘CvVideoWriter’

って怒られる。

## CPPベースのサンプル「FaceDetection」を試す
最初はviewersampleGainを試していたんだけれど、C系だったのでなかなかうまくいかず、CPP系のFaceDetectionをベースにチェック。

カメラはIU233決め打ちなので、該当部分以外削除
fame_preprocess 内の

```
    // Detect faces
    std::vector<Rect> faces;
    face_cascade.detectMultiScale( RGBSmallImg, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

    for( i = 0; i < faces.size(); i++ )
    {
      //Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
      Point lefttop ( faces[i].x*((float)1/resize_ratio), faces[i].y*((float)1/resize_ratio));
      Point rightbottom ( (faces[i].x + faces[i].width)*((float)1/resize_ratio),
			  (faces[i].y + faces[i].height)*((float)1/resize_ratio));
        cvRectangle( RGBImg, lefttop, rightbottom, Scalar( 255, 0,0 ), 1);
	//        ellipse( image, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
    }
```
部分を削除して、シンプルなフレームカメラモードにしました。
結果がこれ
<img width="1680" alt="スクリーンショット 2017-08-10 13.52.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/47773/76e1ff58-ba60-604a-75ca-5a7a00b3e3be.png">


画像は取れていますが４５FPSくらい。

まだシャッター速度やFPSは変更できていないけれど、
これでopencvに入れ込むことはできました。
railsをインストールできない

# はじめに

よし、Rubyのバージョンを上げたからrailsを触るぞ！ってなったときにはまったこと。

前回のRubyバージョンアップする記事はこちら↓
[MacのRubyをrbenvでバージョンアップする](http://qiita.com/Arashi/items/689e91389235c25088a5)
※上の記事にはすでにコマンド追加をしてます

# Railsをインストール

まずはrailsがあるか確認

```bash
$ rails -v

Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.
```

ないですね。ということで、コマンド打っていきます。

```bash
$ sudo gem install rails

〜略〜
```

installが終わったので確認。

```bash
$ rails -v

Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

You can then rerun your "rails" command.

```

どうした。おい。

# Rails is not currently installed on this system. To get the latest version, simply type:

なんだか怪しげな感じなのでぐぐりました。はい。
以下のコマンドを打てばうまくいきました。

```bash:
$ gem install railties && rbenv rehash
$ brew install rbenv ruby-build

 Successfully installed railties-5.1.3
 Parsing documentation for railties-5.1.3
 Done installing documentation for railties after 0 seconds
 1 gem installed

$ rails -v
 Rails 5.1.3
```

おお！

できた。

# 終わりに

先人の方たちに感謝してますm(_ _)m

まだまだ頑張る。
無料でSlack（プライベートチャンネル含む）へGmailを通知する（slack + mail）

目的は、とにかくお金かけたくないってことで。

# 先に結論から言うと、

1. Gmail（対象フォルダ用意する）受信して、
2. GAS(Google Apps Script)で、上記にSlackへpostする

以上、これだけです。

# 具体的にやりたいこと
　1. 特定のメール(レポートメールとか）をgmailで定期受信して（※使っているツールの都合もありメール通知しか機能がないのでここは変えられない :cry:）
　2. 上記を`デイリー`で
　3. Slackの特定のチャンネルに通知

#どう実現したか
　
1. これはGmailの設定の話なので割愛（下準備）
2. GASのtriggerを使って定期実行
3. Slackの特定のチャンネルに通知するGASを用意

# 1. 下準備
+ [incoming webhook url取得](https://slack.com/services/new/incoming-webhook)
+ 通知したいメールフォルダ（ラベル、フィルタの設定含む）を用意　※こちらは説明割愛

## 2. GASのtriggerを使って定期実行
<img width="909" alt="スクリーンショット 2017-08-13 12.07.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/64537/84b4e929-5e2f-47c1-f2ff-5172121c1a3d.png">

## 3. google apps script準備
```js
function sendEmailsToSlack() {
    // target_label
    var label = GmailApp.getUserLabelByName('target_label');
    var messages = [];
    var threads = label.getThreads();
  
    for (var i = 0; i < threads.length; i++) {
      messages = messages.concat(threads[i].getMessages())
    }

    var message = messages[messages.length - 1];
    Logger.log(message);

    var output = '\n' + message.getPlainBody();
    Logger.log(output);

    // payload is customizable if u need
    var today = new Date();
    var payload = {
        "username": "hogehoge",
        "attachments": [
          {
            "color": "#36a64f",
            "author_link": "https://author_link",
            "title": "Something like title",
            "title_link": "Something like title_link",
            "fields": [
              {
                "value": output,
                "short": false
              }
            ],
          }
        ],
        "channel" : "#target_channel", if send public channel
//            "channel" : "@target_person", if send to person
        "icon_emoji": ":cart:"
    };

    var options = {
        'method' : 'post',
        'payload' : Utilities.jsonStringify(payload),
    };

    var webhookUrl = 'https://hooks.slack.com/services/xxxx/hogehoge/HOGEhoge';
    UrlFetchApp.fetch(webhookUrl, options);
}
```

以上（冗長な部分ありますが、ご勘弁）

## 調査談義
最初Slackとメールの連携ってことで調べると、 出てくるのは、

https://get.slack.help/hc/ja/articles/206819278-Slack-%E3%81%A7%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E5%8F%97%E4%BF%A1%E3%81%99%E3%82%8B

に関することばかりで、無料で使いたいのでsomosomoNG。

また、
https://zapier.com/

を用いたやり方も散見されたが、これだと、パブリックチャンネルにしか通知できない。。。。
※やりたいのはプライベートチャンネルへの通知

ってことで、今回のやり方に着地した結果です。