OmniAICreator/Qiita-1.07M huggingface dataset:
OpenCV3(+Qt5)をbrewでインストールすると失敗する時の回避方法

現時点(11/3)、[brew install opencv3]でエラーとなるので回避方法をメモ.

-----

# 1. brewのアップデート&アップグレード

``` bash
# brewが正常か確認
brew doctor
# brewのアップデート&アップグレード
brew update
brew upgrade
```

-----

# 2. 依存ライブラリやツールをインストール

``` bash　
brew install cmake
brew install pkg-config
brew install libtiff
brew install jasper
brew install tbb
brew install ffmpeg
brew install qt5
brew linkapps qt5
brew install Matlab
```

-----

# 3. OpenCVのインストール

``` bash
brew tap homebrew/science
brew reinstall opencv3 --HEAD --c++11 --with-contrib --with-opengl --with-qt5 --without-opencl --with-python3
```
-----

# 4. OpenCVの確認
``` bash
/usr/local/Cellar/opencv3/HEAD-6c12533_4/bin/opencv_version 
```
↑を実行し↓が表示されればOK
3.1.0-dev
手動で入れた phpMyAdmin の「いくつかの拡張機能が無効になっています」を消す

* phpMyAdmin 環境保管領域が完全に設定されていないため、いくつかの拡張機能が無効になっています。の対応

```rb:データーベースphpmyadminを作成
mysql> create database phpmyadmin;
```

```rb:テーブル作成
mysql -uroot -p phpmyadmin < ./sql/create_tables.sql
```
Red Hat系のLinuxにNode.jsをパッケージインストールする方法


次のコマンドを実行します。

```
curl --silent --location https://rpm.nodesource.com/setup_7.x | bash -
sudo yum -y install nodejs
```

これは、公式サイトに書かれている情報です。
[Installing Node.js via package manager - Enterprise Linux and Fedora| Node.js](https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora)
SonarQube の Background Tasks に Failed がたまっていく

SonarQube を使っていたら、とある構成変更作業以降から (伏線)、解析リクエストは届くのに実行されず、失敗してしまうという現象が頻発するようになってしまっていました。

こんな具合です。

<img width="1081" alt="sonarqube-background-task-failed.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/92df7228-2c24-58be-083c-b98ad1ced7f4.png">

数回に一度しか、解析リクエストを正常に処理できなくなっていました。今回はこの事象が発生する条件と、その解消方法をメモしておきます。

# 環境

- Ubuntu 14.04 LTS
- Java 8
- SonarQube 6.0

```
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS"

$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
```

# 事象

冒頭でも書いておりますが、おさらいです。

例えば以下のように、Maven プラグインを使用して解析リクエストを投げる場合なんかに、発生していました。なお、今回使ったプラグインは `org.sonarsource.scanner.maven:sonar-maven-plugin:3.1.1` です。

```
$ mvn clean test sonar:sonar -U -Dmaven.test.failure.ignore=true
```

すると、Maven の実行自体は、`SUCCESS` で完了するものの、実際に、SonarQube の [Background Tasks] を確認して見ると、`Failed` となっている、というものです。

# 原因と解消方法

Stackoverflow でも、同様の事象が報告されていました。

http://stackoverflow.com/questions/34762115/sonarqube-5-3-background-task-fails-with-no-log-in-dashboard

そして、これの対処方法を示唆するコメントが以下。

http://stackoverflow.com/questions/34762115/sonarqube-5-3-background-task-fails-with-no-log-in-dashboard#comment-57332112

> Can you make sure that you don't have 2 SonarQube instances that point to the same DB? – Fabrice - SonarSource Team Jan 14 at 16:13

どうやら、2つ以上の SonarQube インスタンスから、同一の DB インスタンスを参照してはならないようです。

わたしの場合は、まさしくこれをやってしまっていました。そこで、不要になっていた片方の SonarQube インスタンスを停止してみたところ、事象はすべて解消し、現在快調に動作しております。

<img width="1081" alt="sonarqube-background-task-fixed-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/e18cdc4d-3d87-d160-277e-bbfeb3acb248.png">

このように、構成見直し以降は解析が `Failed` とならなくなりました。
Twitchでゲーム以外のクリエイティブな配信をする



# Twitchでゲーム以外の配信

## Creativeという特殊なゲーム
世界最大のゲーム専門のライブ配信サイト「Twitch」だが、実はゲーム以外のクリエイティブな制作工程を中継する人たちもいる。

[Creative](https://www.twitch.tv/directory/game/Creative)という特殊なゲームのカテゴリが存在する。

ゲーム制作、絵を描く、パソコンを作るといった様々な制作工程を見ることが出来る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8f7e4b85-1641-9d0c-db2a-91276bb832cd.png)

## Creativeへの行き方
以下URLをクリックするか、検索で「Creative」と検索する
https://www.twitch.tv/directory/game/Creative

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/c309fa40-554a-1851-054f-b084c227b3ac.png)


## 配信のルール

Twitch Creative FAQ
https://help.twitch.tv/customer/portal/articles/2176641-creative-faq

Creativeに関するガイドラインが書かれている。
配信していいもの、いけないものがあるので、チェックしてから配信をした方がいい。

### 配信していい
注)Google翻訳

- デジタルと伝統的な絵画
- デジタルと伝統的なモデリング
- 既存のものをカスタマイズします
- 衣装や小道具作り
- 裁縫、編み物、およびかぎ針編み
- ヒューズビーズ、perlers、およびビーズスプライト
- スクラップブッキング
- 宝石製作
- ガラス吹き製法
- 電子・ロボットプロジェクト
- 最初から完全なレシピを調理し、ベーク
- 文芸
- ビデオの編集
- 写真編集
- プログラミングおよびコーディング
- ソフトウェアとゲーム開発
- ウェブ開発
- カスタムPCを構築
- このようなスタジオとして、放送のセットアップを構築
（このようなイケアハックなど）カスタム家具の作成やカスタマイズ
- モデル作り
- メイクアップ、フェイス・ペインティング、ヘナや化粧品を含む、当技術分野ボディーペインティング、
- 建物の建設セット（レゴ、エレクターセット、メガブロック、K'NEX、デュプロなど）またはモデルキット（ウォーハンマー、機動戦士ガンダム、およびなど）
- 安全、プロフェッショナルな環境でのライセンス・タトゥー
- 絵画の喜びの放送と一緒に絵画こちら（月曜日のみ）
- 塗り絵
- 醸造
- 建設、住宅建築やリフォーム
- 鍛冶屋
- あなたの車のメンテナンス
- 復元
- パフォーマンスアーツ
- 立ち上がっ含むコメディ、
- 表示されない、または自分自身や他人に害を引き起こす可能性もないことをマジック
- 組成、生産やパフォーマンスなどの音楽、
- 演劇
- 音声演劇読書や詩の朗読など、演技
- アンサンブル、カップル/社交ダンス、伝統的ななどの振り付けとダンスのパフォーマンス、  

### 配信してはいけない
- 一般的な行動に私たちのルールに違反するコンテンツ
- 既存の著作権保護された作品の無断公演
- 自傷行為に私たちのルールに違反する活動、（本物か偽物花火、武器を伴う例えば公演など）
- 宿題
- 家具の組み立て
- 無人プリンタ（3Dまたは2D）に焦点を当て
- パズルを遊びます
- あなたの家を飾ります
- ボックス化解除
- 玩具アセンブリ
- ピアス
- タロットカードの読書。Oujiaボード
- 写真撮影と映画製作
- Pictionary（「Pictionary「ゲームディレクトリを使用してください）
- Mukbangまたは摂食ストリーム（「社会食べる "ゲームのディレクトリを使用してください）
- 無人のウェブカムの流れ
- 運動やトレーニングの流れ
- 言語を学びます
- 蒸留
- カラオケ
- ロックバンド、ギターヒーロー、またはDJヒーロー（適切なゲームディレクトリを使用します）

## Creativeを配信する設定

チェンネルの配信中のゲームをCreativeに設定する。
タイトルにハッシュタグを設定することで、カテゴリに分類されるようになる。
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/3288c1ad-6b8e-90a6-8f37-f0d497a7cee3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8a29cd2e-38bf-e1e7-a3a7-91cbed60d089.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/06b57d1d-0361-284d-12d1-dff3daea36c0.png)
Mac で外部から安全に ssh 接続できるようにする

[前回の記事](http://qiita.com/ynakayama/items/283e03da0d72d5af9fe9)で Mac の設定について書きましたが、外部から Mac に接続する設定について少し補足をしておきます。

## SSH のポート番号変更

OSX El Capitan 以降は [SIP](http://rcmdnk.github.io/blog/2015/10/10/computer-mac/) によって /System 以下のディレクトリが保護されています。そこで /Library 以下に ssh.plist をコピーして port 番号をカスタマイズすることになります。

```bash
sudo cp /System/Library/LaunchDaemons/ssh.plist /Library/LaunchDaemons/ssh2.plist
sudo vim /Library/LaunchDaemons/ssh2.plist
```

以下、ポート番号を 9999 に変更する前提で記述します。

ポイントとなる場所だけを記述すると

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <string>com.openssh.sshd2</string>
        <dict>
                <dict>
                        <key>SockServiceName</key>
                        <string>9999</string>
                </dict>
        </dict>
</dict>
</plist>
```

という感じです。

次に新しい ssh2.plist を load し、また忘れずに既定の ssh.plist を unload します。

```bash
sudo launchctl load -w /Library/LaunchDaemons/ssh2.plist
sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist
```

## SSH のパスワード認証無効化

また、同様に忘れてならないのが sshd のパスワード認証を無効にする設定です。

これは /etc/ssh/sshd_config を編集すれば OK です。

```
PasswordAuthentication no
ChallengeResponseAuthentication no
```

## 接続試験

最後に接続確認をします。

```
# 22 番ポートで接続できないことを確認
$ ssh -p 22 myname@mymacbook
ssh: connect to host zodiac port 22: Connection refused

# 9999 番ポートでパスワード認証が無効であることを確認
$ ssh -p 9999 test@mymacbook
Permission denied (publickey).

# 9999 番ポートで公開鍵認証で外部から接続できることを確認
$ ssh -p 9999 myname@mymacbook
Last login: Thu Nov  3 09:46:30 2016 from xxx
```

以上です。
Spockで finalなクラスをMockする

# 概要

Spockでテストコードを書く際に、finalなクラスをMockする方法。

## Mock()をすると例外が発生

finalなクラスをMockしようとすると、例外が発生します。
例としてjava.time.LocalDateをMockしてみます。

```groovy
@Unroll
class MockFinalClassSpec extends Specification {
    def "finalなクラスをMockしてみる"() {
        setup:
        // 存在しない日付を返すようMockしてみる
        def localDate = Mock(LocalDate)
        localDate.getDayOfMonth() >> 100

        expect:
        localDate.getDayOfMonth() == 100
    }
}
```

実行すると例外が発生します。

```
org.spockframework.mock.CannotCreateMockException: 
  Cannot create mock for class java.time.
  LocalDate because Java mocks cannot mock final classes. 
  If the code under test is written in Groovy, use a Groovy mock.
```

## GroovyMock()を使えばうまくいく

実は例外のメッセージにも出ているのですが、GroovyMockを使えばMockできます。

```groovy
@Unroll
class MockFinalClassSpec extends Specification {
    def "finalなクラスをMockしてみる"() {
        setup:
        // GroovyMockを使う
        def localDate = GroovyMock(LocalDate)
        localDate.getDayOfMonth() >> 100

        expect:
        localDate.getDayOfMonth() == 100
    }
}
```

## 参考

- http://stackoverflow.com/questions/34121999/mock-final-class-in-spock
Ubuntu > pip install matplotlib のエラー > libpng-dev と libfreetype6-dev をインストールしておく

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

Deep Learning関連でmatplotlibを使おうとしていた。

```
$ pip install matplotlib
...
============================================================================

                        * The following required packages can not be built:

                        * freetype, png
```

http://stackoverflow.com/questions/9829175/pip-install-matplotlib-error-with-virtualenv

> sudo apt-get install libpng-dev
sudo apt-get install libfreetype6-dev

上記の後に`$ pip install matplotlib`をするとインストールできた。
Deep Learning > link > Can Deep Learning (and Neural Networks) be useful for regression problems where the output variable has an unknown (or varying in real time) upper bound?

Deep Learningで学習を検討しているのは「多クラス分類」ではなく「回帰」。

以下を見つけた。

https://www.quora.com/Can-Deep-Learning-and-Neural-Networks-be-useful-for-regression-problems-where-the-output-variable-has-an-unknown-or-varying-in-real-time-upper-bound

気になったのは
> Vicent Ribas Ripoll, I solve classification problems.
Written Aug 16, 2013

>Yes they are. One only has to make sure to use the proper cost function (MSE) and adapt the network to provide a continous output (this normally means removing the softmax in the output). Some examples are:

>[Page on Stanford](http://cs229.stanford.edu/proj2012/BussetiOsbandWong-DeepLearningForTimeSeriesModeling.pdf)

上記のPDFファイルではPower Loadという多数の山と谷を持つ形状の学習をしている。
誤差(`%RMSE`)は以下

| Learning Method | %RMSE |
|:--|:-:|
| Kernelized Regression  | 8.3%  |
| Frequency NN  | 6.7%  |
| Deep Feedforward NN | 5.9% |
| Deep Recurrent NN | 2.8% |

自分が必要な精度(system of linear equationの初期値の誤差）がどれくらいのものかは実際に実験をしないと分からない。
python > difference > threads = [ ] / markers = ('s', 'x' , 'o', '^', 'V') > list / tuples


@ https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

```cifar10_eval.py
...
      threads = []
...
```


@ Python 機械学習プログラミング by Sebastian Raschkaら
p30

```
markers = ('s', 'x' , 'o', '^', 'V')
```

角括弧と丸括弧の違いについて調べた。

http://stackoverflow.com/questions/8900166/whats-the-difference-between-lists-enclosed-by-square-brackets-and-parentheses
> Square brackets are lists while parentheses are tuples.
python > リスト > threads.extend(qr.create_threads(sess, coord=coord, daemon=True, start=True)) > threadsへの別リスト要素を追加

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowを学習中。
TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000
https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

cifar10_eval.pyを学習中。

```cifar10_eval.py
...
      threads = []
      for qr in tf.get_collection(tf.GraphKeys.QUEUE_RUNNERS):
        threads.extend(qr.create_threads(sess, coord=coord, daemon=True,
                                         start=True))
...
```

上記において`threads.extend()`という部分が未学習だった。

http://www.pythonweb.jp/tutorial/list/index6.html
> 別のリストの要素を追加
> 次にリストの最後に別のリストの要素を追加する方法です。リスト型で用意されている「extend」メソッドを使います。

qrt.create_threads()で生成したスレッドリストをthreadsに追加しているようだ。
debianでdocker-engineのインストールに失敗して、アンインストールもできなかった場合の対処


debianにdocker-engineをインストールしたのだが、どうもプロセスが立ち上がらない。
アンインストールしようとしても、プロセスが立ち上がっていないせいで、アンインストールもできなかった。

```
% sudo apt-get remove docker-engine
```

```
Stopping Docker: dockerNo process in pidfile '/var/run/docker-ssd.pid' found running; none killed.
```

dpkgのファイルを移動して、アンインストールできた。
docker-engineに限らず一般的な方法かしら。

```
% mv /var/lib/dpkg/info/docker-engine* /tmp/
% dpkg --remove --force-remove-reinstreq docker-engine
% apt-get remove docker-engine
```
TensorFlow > cifar10_train.py > CPUで21日分処理

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowを学習中。
TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000
https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

学習の経過を見たいため、GPUでなくCPU動作でcifar10_train.pyを動かし続けた。
こうすることで、cifar10_train.pyを実行しながらcifar10_eval.pyを実行できる。
(TensorBoardを見るだけならGPUでも良かったかも）。

3日程度動作させたが、4コア8スレッドでCPU使用率が700%程度になり21日程度動作したことになっている。
[linux > top > TIME+ > 31220:27 > 21days > 8スレッドの動作時間の合計のようだ](http://qiita.com/7of9/items/dca033e84dc3f6ac41c8)

### cross entropyの結果
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/eaafe00a-919f-5ab6-9784-b3d20c73c602.png)

降下勾配が大きい時が３箇所あった。

### learning_rate

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/22f31984-4b8e-5a6f-9cc7-64fdd98247da.png)
リンク（ln）とシェルスクリプト（.sh）を使った自作コマンドの作り方について

#はじめに
　自分で作ったシェルスクリプト（.sh）をコマンドにする方法をまとめたものです。

#リンク（ln）について
　lnは、任意のファイルもしくはディレクトリ（以下、ターゲットと呼称）と紐づいた、特殊なファイルを作るコマンドのことです。lnではハード・リンクとシンボリック・リンクの２種類のファイルを作成することができ、それぞれに違った特徴があります。

#####**ハード・リンク**
　lnにオプションを付けなかった場合に作成されるリンクです。ターゲットにはファイルのみが指定でき、ディレクトリを指定することはできません。ハード・リンクは、いわゆる***コピーに似た振る舞い***をするため、ターゲットが消えてしまってもデータを参照、実行することが可能です。しかし、厳密には、ターゲットと同じiノード（ポインタやサイズ、作成日時などを含むデータ）を参照しているだけで、実態となるデータを複製しているわけではないため、ディスク容量はほとんど増加しません。ちなみに、```#ls -l```からターゲットを特定することはできません。

#####**シンボリックリンク・リンク**
　lnにオプションとして-sを付けると作成されるリンクです。ターゲットにはファイルとディレクトリの両方が指定できます。シンボリックリンク・リンクは、ターゲット自体を参照する0バイトのリンクを作るため、ターゲットが消えるとリンクは働かなくなります。いわゆる**ショートカットを作っている**とお考え下さい。ターゲットは```#ls -l```コマンドから特定できます。

#自作コマンドを作ってみる
　以上のことを踏まえて簡単に自作コマンドを作ってみます。自作コマンドを作るにあたってはシェルスクリプト（.sh）を使用しますので、シェルスクリプトの詳細については別途参照してください。

まずは、ターゲットとなるスクリプトを```# vim ~/target.sh```でホームディレクトリに作ります。

```~/target.sh
#!/bin/sh
echo "Hello World"
```
```# sh ~/target.sh```で動作することを確認してください。

次にshを省いても動作するように```# sudo chmod a+x ~/target.sh ```で実行権限を与えます。
これで```# ~/target.sh```で動作するようになっていると思います（相対パスでは動作しません）。

ここまで来たら自作コマンドはほぼて出来ている状態なので、あとはどこからでもこのコマンドを利用できるように、パスの通ったディレクトリにlnでターゲットのリンクを作成します。今回はハード・リンクとシンボリック・リンクの違いを検証できるように両方作ってみます。

```
# sudo ln ~/target.sh /usr/local/bin/hard
```

```
# sudo ln -s ~/target.sh /usr/local/bin/symbolic
```

```# hard```や```# symbolic```で自作コマンドを試してみて下さい。Hello Worldが出力されると思います。

最後に```# rm ~/target.sh```でターゲットを消してみます。
もう一度```# hard```や```# symbolic```で自作コマンドを試してみて下さい。シンボリック・リンクが動作しなくなったことが確認できると思います。
linux > top > TIME+ > 31220:27 > 21days > 8スレッドの動作時間の合計のようだ

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

TensorFlowというDeep Learningのフレームワークを勉強中。

TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks
http://blog.brainpad.co.jp/entry/2016/04/22/170000
https://www.tensorflow.org/versions/master/tutorials/deep_cnn/index.html

ここ数日CPU処理でcifar10_train.pyを動かしている。

どれくらい時間経過したか確認するためtopコマンドを使った。
`TIME+`の表記が`31241:08`のようになっている。
この単位はsecondsなのか、minutesなのか?

http://unix.stackexchange.com/questions/53270/what-units-of-time-does-top-use
> @Abe Yes, 89122:13 = 5347333 seconds ≈ 62 days. – Gilles Oct 30 '12 at 0:19

31241はminutesのようだ。

`31241[minutes]=520[hours]=21[days]`

3日くらい動かしているが21日動いたことになっている。
`%CPU`が`712`などになっている。
使用している環境は4コアで8スレッドまで動く。

topの`TIME+`は動作しているスレッドの動作時間の合計と理解した。
技術英語 > The idea of not understanding what the program does is [unsettling].

@ Code Complete (No. 17387 / 36077)

> The idea of not understanding what the program does is unsettling.

http://ejje.weblio.jp/content/unsettling
> (人心などを)(かき)乱す、(落ち着き・平静を)失わせる

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

http://ejje.weblio.jp/content/mind-boggling
> びっくりさせる、肝がつぶれるような

使い方としては

> What a mind-boggling!

非常に驚いたことを伝える時に使っていた例を見たことがある。
CodePenでDropbox内の画像ファイルを利用する方法

## はじめに
CodePenのProアカウントでは、CodePen内で使うリソースのHostingサービスがあるのですが、無料アカウントの場合はどこか他のサーバにホストしてもらう必要があります。いろいろと方法はありますが、一番簡単だと言われているDropboxを使った方法を紹介します。

## Dropboxのファイルリンクを得る

1．画像ファイルをDropboxフォルダに入れる。
まずはCodePen内に表示させたい画像ファイルをDropboxに追加します。

2．フォルダ内の画像ファイル名を右クリックし、「Dropboxリンクをコピー」を選択する。
その他、Dropboxのサイトからリンクを得る方法もあります。
>Dropboxファイルリンクを得る方法: https://youtu.be/Iu-F4JLa_z4

3．先ほどコピーしたリンクをCodePen内の任意の場所にペーストする。
リンクをペーストしたら、下のステップへ進んでください。

## リンクの編集
このままでは画像は表示されないのでペーストしたリンクを編集します。

4．リンクを編集する
コピーしたリンクは `https://www.dropbox.com...` になっていると思いますが、
`www` を消して代わりに `dl` を追加し `https://dl.dropbox.com...` にします。

>dropbox.comでレンダリングを実行する: https://www.dropbox.com/ja/help/201

これで画像が表示されます。
radikoの仕様変更によるRaspberry Piでの録音失敗対応

以前投稿したRaspberry Piでradiko録音の記事の続編です。
http://qiita.com/komacchi/items/ca09d195699815c81c3e

2016/10/12からradikoがタイムフリーに対応しました。
その際、仕様変更があったようで、今までのスクリプトでは録音できなくなっていました。
（気がついたのが遅かった）

ということでrec_radiko.shを修正します。


## playerurlの変更

```rec_radiko.sh
playerurl=http://radiko.jp/player/swf/player_4.1.0.00.swf
↓
playerurl=http://radiko.jp/apps/js/flash/myplayer-release.swf
```


```rec_radiko.sh
swfextract -b 12 $playerfile -o $keyfile
```
（ここの数字はオプションの予約idっぽいので2~5または12か14でもいけるかも？調整してみてください）

## auth1_fms,auth2_fms両方

```rec_radiko.sh
--header="X-Radiko-App: pc_1" \
--header="X-Radiko-App-Version: 2.0.1" \
↓
--header="X-Radiko-App: pc_ts" \
--header="X-Radiko-App-Version: 4.0.0" \
```

## **Authtoken,Partialkey**のキャメルケース変更
```rec_radiko.sh
--header="X-Radiko-Authtoken: ${authtoken}" \
--header="X-Radiko-Partialkey: ${partialkey}" \
↓
--header="X-Radiko-AuthToken: ${authtoken}" \
--header="X-Radiko-PartialKey: ${partialkey}" \
```

ヤッターこれで録音可能になりました。

apt-getをupdateしたり、swftoolsのバージョンアップをしていた場合、
前記事でも書きましたが、

```
/tmp/player.swf is not a valid SWF file or contains errors.
failed get keydata
```
このようなエラーが出たら`/tmp/player.swf`を削除すると良いかと。

快適なラジオライフを。

## 参考サイト
https://goo.gl/cQnKH8
https://goo.gl/TgAQb
yarnでローカルパッケージを入れる方法

yarnでローカルパッケージを入れる場合npmと方法が違うみたいです。

ローカルパッケージ場合　file:　とprefix(接頭辞)が必要です。

```js

// yarn 絶対パス
yarn add file:"C:\\mypackage"

// yarn 相対パス
yarn add file:".\..\mypackage"

// package.json
"mypackage": "file:C:\\mypackage"


```
変更すべきPHP.iniを探すベストな方法（多分）

修正すべき（現在適用されている）php.iniを一発で探すコマンド

**@mpywさんよりご指摘をいただき、追記しました。**

> echo $(php -r 'echo php_ini_loaded_file();')

```
/usr/local/etc/php/7.0/php.ini
```

**@mpywさん、ありがとうございます！**

> php -i | grep php.ini

```
$ php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/etc/php/5.6
Loaded Configuration File => /usr/local/etc/php/5.6/php.ini
```

このように、`Loaded Configuration File`(現在適用されているphp.ini)を教えてくれる。

他の方法ででも探せるが、情報が多すぎてどれが変更すべきファイルだかわからない。
余談だが、メモついでに他の方法も載せておく

> find / -name 'php.ini'

```
/Applications/MAMP/conf/php5.5.3/php.ini
/Applications/MAMP/conf/php5.5.5/php.ini
/Applications/MAMP/conf/php5.5.7/php.ini
/Applications/MAMP/conf/php5.5.9/php.ini
/Applications/MAMP/conf/php5.6.0/php.ini
/Applications/XAMPP/xamppfiles/etc/php.i
.
.
.
.
.
.
.
```
上記のように、php.iniと名のつくものは全て引っかかってしまう。
複数バージョンのphpを使ってたり、MAMPとかを入れてたりすると圧死する。
いわずもがな、どれが現在適用されているファイルなのかは教えてくれない。

> php --ini

```
Configuration File (php.ini) Path: /usr/local/etc/php/5.6
Loaded Configuration File:         /usr/local/etc/php/5.6/php.ini
Scan for additional .ini files in: /usr/local/etc/php/5.6/conf.d
Additional .ini files parsed:      /usr/local/etc/php/5.6/conf.d/ext-apcu.ini,
/usr/local/etc/php/5.6/conf.d/ext-igbinary.ini,
/usr/local/etc/php/5.6/conf.d/ext-intl.ini,
/usr/local/etc/php/5.6/conf.d/ext-mcrypt.ini,
/usr/local/etc/php/5.6/conf.d/ext-memcache.ini,
/usr/local/etc/php/5.6/conf.d/ext-opcache.ini
```

> locate php.ini

```
/Applications/MAMP/bin/php/php5.1.6/conf/php.ini
/Applications/MAMP/bin/php/php5.1.6/conf/php.ini.temp
/Applications/MAMP/bin/php/php5.2.17/conf/php.ini
/Applications/MAMP/bin/php/php5.2.17/conf/php.ini.temp
/Applications/MAMP/bin/php/php5.3.29/conf/php.ini
/Applications/MAMP/bin/php/php5.3.29/conf/php.ini.temp
/Applications/MAMP/bin/php/php5.4.39/conf/php.ini
/Applications/MAMP/bin/php/php5.4.39/conf/php.ini.temp
.
.
.
.
.
.
```

> 結論

### `php -i | grep php.ini` これ一択

情報量がコンパクトだし、どれを変更すればいいか一発でわかる。神

> 参考

[http://tweeeety.hateblo.jp/entry/20121218/1355802787](http://)
Laravel5.3のQueue非同期処理 （AWS3へ画像アップロード）

**Queue** は、直訳すると「順番を待つ人や乗り物の列 」という意味です。

Laravel では、時間のかかる処理やなどを非同期で実行したい場合になどに使います。


今回は、AmazonS3へのアップロードをLaravel5.3のQueueで実装してみました。


> 必要な Composer package (composer require コマンド)

* composer require aws/aws-sdk-php
* composer require league/flysystem-aws-s3-v3

> AWS3の設定

* `config/filesystems.php`の `cloud`キーを`s3`に
* AWS3でBucket作成
* `disks`キーの中身を、作成したBucketに合わせて変更　

> ジョブクラスの作成・実装

* `php artisan queue:table` => jobsテーブル（未実行なjobを格納する）を作成

* `php artisan queue:failed-table` => failed_jobsテーブル（実行に失敗したjobを格納する）を作成

* ` php artisan make:job UploadImage `

すると `app/Jobs`配下に`UploadImage.php`が作られるので、以下のような感じにする

```php
<?php

namespace App\Jobs;

use App\Models\Channel;

use File;
use Storage;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class UploadImage implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    public $channel;

    public $fileId;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Channel $channel, $fileId)
    {
        $this->channel = $channel;
        $this->fileId = $fileId;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $path = storage_path() . '/uploads/' . $this->fileId;
        $fileName = $this->fileId . '.png';

        if(Storage::disk('s3images')->put('profile/' . $fileName, fopen($path, 'r+'))) {
            File::delete($path);
        }

        $this->channel->image_fullname = $fileName;
        $this->channel->save();
    }
}

```

あとは、適当に画像アップロードしてあげて、受け取ったメソッド内でdispatchヘルパーを使って

```php
$this->dispatch(new UploadImage($channel, $fileId));
```

みたいにしてあげればいい。

`php artisan queue:work`を実行すると、リスナー的なのが走り、dispatchされたjobが自動的に実行される。


queueは他にも、例えばメールをバックグラウンドで送信したい場合などに使える。
PHPのメディア（画像、動画）アップロードでハマったこと

最近ゲームの実況動画などが流行っているらしいので、動画を公開できるサービスを作ってるときに発生した問題メモ

**画像がアップロードできない**

> 結論から言うと

`php.ini`の設定で、POSTリクエスト、メモリの上限が低く設定されてた。
　*※普通に使う分には低くないが、大きな画像や動画をアップロードするには低い*
	
> やったこと

* php.iniの`memory_limit` (扱えるメモリの上限を定める)を変更(値を大きくした)
* php.iniの`post_max_size` (POSTリクエストで扱えるデータの上限を定める)を変更(値を大きくした)

> 反省

Chrome ディベロッパーツールのエラーコードみたら丁寧なエラーメッセージが書いてありました。
以上。エラーコードはよく読みましょう。（気づくのに30分くらいかかった）

> 参考

* 	http://d.hatena.ne.jp/pospome/20120515/1337077659
Eclipseを使ってJSONデータを整形する

# はじめに
　本ページでは、「**JSONデータを見やすく整形する方法**」および「**JSONデータを1行に整形する方法**」について記載します。

　「JSONデータを取得したけど改行やスペースが省かれてて見づらいなぁ」という方や、逆に「JSONデータをコマンドラインにペーストするから1行に整形したいなぁ<FONT color=gray>（改行ありのままでペーストすると1行ずつコマンドだと認識されちゃいますよね。。。）</FONT>」という方が本ページを読むと、願いが叶えられてハッピーになるかもしれません。
　
　ちなみに、今回使用するツールは<FONT color=blue>Eclipse</FONT>です。


## 想定状況
　具体的な作業内容に入る前に、どのような状況の方が本ページを読むとハッピーになれるのか、ということを以下に記載します。以下の状況に該当する方や、近しい状況の方は是非読んでみてください。


- JSONデータを取得したが、改行やスペースがなく読みづらいので、見やすい形に整形したい
- コマンドライン等でJSONデータをペーストしたいので、改行やスペースをなくして一行のテキスト形式に整形したい
- 自分のPCで<FONT color=gray>（たまたま）</FONT>Eclipseを開いている
- <FONT color=gray>ちなみに私は、[Bluemix上の"Liberty for Java"の環境をローカルPCで検証する](http://qiita.com/ken_ue/items/4834fcf805ae1ef9417c)際に必要になりました</FONT>



#作業内容
　本ページでは、「**JSONデータを1行に整形する方法**」について、具体的な手順をご紹介したいと思います。<FONT color=gray>（私がこの方法を知りたい状況になったからです）</FONT>「JSONデータを見やすく整形する方法」もほとんど作業内容は変わらないので、本章の最後で簡単にご紹介します。

　以下、具体的な作業内容です。非常に簡単なので、「JSONデータを整形したい！」という時にたまたまEclipseを開いていたら<FONT color=gray>（そんな状況があるのか知らないけど）</FONT>、是非この方法を使ってみてください。

## 作業①：Eclipseの新規ファイルにJSONデータをペースト
　どこか使わないプロジェクトかフォルダで、右クリックから[新規]->[ファイル]を選択して新規ファイルを作成し、JSONデータをペーストします。<FONT color=gray>（モザイクばかりでごめんなさい）</FONT>
![Pic1.png](https://qiita-image-store.s3.amazonaws.com/0/145054/a1d45d39-ddc5-b25d-dbb6-28b5caa20ecc.png)

## 作業②：JSONデータがペーストされたファイルをJSONエディタで開く
　JSONデータがペーストされたファイルにカーソルを合わせ、右クリックから[次で開く]->[JSONエディター]を選択します。もし、[次で開く]を選択後に[JSONエディター]が表示されない場合は、[その他...]からJSONエディターを探してください。


![Pic2.png](https://qiita-image-store.s3.amazonaws.com/0/145054/f58458d3-301f-41bc-c094-2ffbc067f696.png)


　JSONエディターで開くと、下図のようにキーとバリューが色付けされます。<FONT color=gray>（おぉ、なんて見やすいんだ）</FONT>
![Pic3.png](https://qiita-image-store.s3.amazonaws.com/0/145054/6f704a15-793c-78cb-5403-59151f3603b5.png)

## 作業③：JSONデータをCompress

　JSONデータを全選択し、右クリックから[ソース]->[Compress]を選択します。
![Pic4.png](https://qiita-image-store.s3.amazonaws.com/0/145054/04175fbd-23b3-8d4c-2265-e3d4af777d33.png)

　すると、あ～ら不思議、JSONデータが1行に整形されてる～！

![Pic5.png](https://qiita-image-store.s3.amazonaws.com/0/145054/ea1b2725-f780-bb62-b318-da687d13849a.png)


　**以上**


## 備考：「JSONデータを見やすく整形する方法」
　「JSONデータを見やすく整形したい！」という時は、作業②までは同様に行ってもらい、作業③で、[ソース]->[フォーマット]を選択します。
　すると、あ～ら不思議、JSONデータがすごい見やすい～！<FONT color=gray>（めんどくさいので画像はありません）</FONT>

![Pic6.png](https://qiita-image-store.s3.amazonaws.com/0/145054/6b34617c-ef2a-e7ae-92d2-861be2e50acf.png)


　**以上**

# おわりに
　今回は「**JSONデータを見やすく整形する方法**」および「**JSONデータを1行に整形する方法**」について記載しました。記載内容に不備不足等ございましたらコメントいただけると幸いです。
Azureの料金について素人が調べてみた

#Azureを始めたい
[Azure](https://azure.microsoft.com/ja-jp/free/)からログインしてアカウント作ろう

- 無料の Azure アカウントを¥20,500 のクレジット付きで始めれる(約2ヶ月ぐらいもつ)
- サブスクリプションを持っていればサブスクリプションも使うことができる

#運用
ガチで運用したい場合の料金設定を考えてみた
[こちら](https://azure.microsoft.com/ja-jp/pricing/calculator/)からAzureの料金の見積もりを出すことができる。これはめっちゃ便利！

##実際にかかる料金
例えば自分なら一ヶ月の値段を大きく見積もって：
**※月や日によって値段が変わったりすることがある**

- App Service (Standard)　約９０００円
    - 1 core  1.75RAM  50GB
- SQL Database (Standard)　約１７００円
    - 250GB Database 1つのみ 


実はこれだけはないです。ここまでは、サーバのみ値段になります。
これにパケット料金的なのも発生します！

- 帯域幅 5G ０円
    - 5Gまで無料
    - ユーザアクセスにはお金はかからないがユーザに何か送信する場合にかかる。例えば、文字列とか動画とかw
    - ただ、１０Gにしても 約７０円なので安い！

**月々合計：約１万７００円**

これを安く見るか高く見るか難しいところな気がする。。

例えば、これを**Webサービス**と考えたらSQLを抜きにしても約９０００円かかることになります。さすがに５０GBもいらないので、**Basic**にすると約６７００円になります。
これよりも下がないので、**最低でもWebサーバ運用には約６７００円**はかかります。さらにドメインを取得したら**月々約７０００円**ぐらいにはなります。

そ〜か〜といった感じの感想ですね。。
しかし、値段にあったオプションが沢山あります！！
<img width="1280" alt="１.png" src="https://qiita-image-store.s3.amazonaws.com/0/130097/da10a477-e7d6-6e6c-4387-4dbe8ab49207.png">

#Azureについて

##Azureの良いところ

- Visual Studioからデプロイできる
    - 開発したものをそのままAzureにデプロイできるのは大きい
    
- セキュリティ面の恩恵がすごい！
    - HTTPのトラフィックや警告やリソースの正常性などその他にもいろいろな恩恵があるので、コストが高い分、安全性はかなり保証されている
    
- 使いやすさ
    - 最近使い始めたがばかりの素人ですが、UI的な意味で使いやすいしわかりやすい
   
##Azureの悪いところ
- ぶっちゃけWindows専用にばかり特化している
    - クロスプラットフォームにVSが対応しているにもかかわらずAzureでは他の言語に関するリファレンスが少ない
- MSDNの質問や説明がわからない
    - 公式がやり方を説明しているが読みづらいし、画像がないし素人は絶対わからない 
- 　Windows以外のOSからできない
    - MSDNにもLinuxやOSXからのやり方などなく、不親切



#終わりに
ぜひ、今後ともAzureを使っていきたいが、値段をもう少し安くして欲しいのとリファレンスはマジ頼むといったところですかね。　少しでも、参考になれば幸いです。

#参考
とても参考になる
http://www.slideshare.net/kekyo/azure-websites-41354045
Horos(Osirix)をsourceからbuild


Osirixのdicom読み込みが失敗する原因を調べるためにOsirixをsourceからbuildしようと試みましたがエラーばかりで時間がかかりそうなのでOsirix-basedの[Horos]をbuildしました．


準備
--------------
1. `git clone https://github.com/horosproject/horos.git`
2. [Apple]から10.11.SDKを含むXcode_7.3.dmgをdownload
3. /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKsへXcode_7.3.dmgから取り出したMacOSX10.11.sdkをcopy


Build
--------
1. horos/Horos.xcodeprojを開く
2. Build SettingsでBase SDKを OSX 10.11に設定
3. Product->Scheme->Unzip Binaries選択
4. Product->Build
5. Product->Scheme->Horos選択
6. Product->Build 
7. Product->Run

![Kobito.OXGDZg.png](https://qiita-image-store.s3.amazonaws.com/0/65106/550385f2-8b9b-ab45-299a-4d54ac4924bd.png "Kobito.OXGDZg.png")


あとがき
-------
HorosとOsirixでdicomをloadしたときの結果が異なってました．GUIは似ていても内部の処理はだいぶ異なるのかもしれません．Osirix Liteしか使う予定がないのでHorosに移行することを検討します．


参考
--------------
* [OsiriX Development Guide] (http://www.osirix-viewer.com/Documentation/Guides/Development/)
* [Xcode6にOS X 10.8SDKを追加する](http://qiita.com/yasnis/items/11e14d9f168e88460c78)
[Apple]: https://developer.apple.com/downloads/index.action
[Horos]: https://www.horosproject.org/
GoのHTTP Clientでリクエストを途中でキャンセルする

Go 1.7からhttp.TransportのCancelRequestがDeprecatedになってcontextという仕組みを使うのが良いとされるようになった。

## キャンセルなし

```go
package main

import (
	//"context"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := http.DefaultClient

	//ctx, cancelFunc := context.WithCancel(context.Background())

	req, err := http.NewRequest("GET", "https://google.com/", nil)
	if err != nil {
		panic(err)
	}

	//req = req.WithContext(ctx)

	ch := make(chan struct{})

	go func() {
		resp, err := client.Do(req)
		if err != nil { // リクエストが成功すればここは通らない
			fmt.Println(err)
			ch <- struct{}{}
			return
		}
		defer resp.Body.Close()

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}

		fmt.Println(string(body))

		ch <- struct{}{}
	}()

	//cancelFunc()
	<-ch
}

```

## キャンセルあり


```go
package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {
	client := http.DefaultClient

	ctx, cancelFunc := context.WithCancel(context.Background())

	req, err := http.NewRequest("GET", "https://google.com/", nil)
	if err != nil {
		panic(err)
	}

	req = req.WithContext(ctx)

	ch := make(chan struct{})

	go func() {
		resp, err := client.Do(req)
		if err != nil { // キャンセルされた場合はエラーが返る
			fmt.Println(err) // Get https://google.com/: net/http: request canceled while waiting for connection
			ch <- struct{}{}
			return
		}
		defer resp.Body.Close()

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			panic(err)
		}

		fmt.Println(string(body))

		ch <- struct{}{}
	}()

	cancelFunc()
	<-ch
}
```
Vagrant1.8.6 + ubuntu16.04.1 + virtual box5.1. 8で private_networkが動かなかったことについてメモ

環境はWindows10。

以下のような設定で立ち上げていたが、2回目から繋がらない障害が発生。

```bash:Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.box = "bento/ubuntu-16.04"
  config.vm.box_version = "2.2.9"
  config.vm.network "private_network", ip: "192.168.33.11"
end
```

以下のような表示が出ていたため、問題の切り分けのためにbentoではなく
自分でboxファイルを作って試してみた。

```
Guest Addition version 5.0.26
VirtualBox version 5.1 
```

起動して最初は繋がるが、bentoのboxと同じように2回目の立ち上げから繋がらない不具合が発生。  
バージョンが原因ではないようだ。

```bash
$ ifconfig
```

で確認したところ、`enp0s8`が存在しなくなっていた。

ネットワーク設定を確認してみる。

```bash:/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
auto enp0s3
iface enp0s3 inet static
      address 192.168.33.11
      netmask 255.255.255.0
#VAGRANT-END
```

`#VAGRANT BEGIN`以降の記述がおかしい。
`enp0s8`であったところが`enp0s3`になっている。
試しに以下のように書き直して再起動したところ、ネットワークは設定された。

```bash:/etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
auto enp0s8
iface enp0s8 inet static
      address 192.168.33.11
      netmask 255.255.255.0
#VAGRANT-END
```

boxを作るときに、ネットワーク設定を保存したまま作ってしまった可能性がある。
bentoのほうも要確認していきたい。

ifconfigで確認したところ、ipv6のアドレスが設定されていた。
Windowsのネットワークカードの設定の可能性もでてきた。


![network.png](https://qiita-image-store.s3.amazonaws.com/0/99876/ffd5b798-6352-d62b-5eac-547c8d7234fa.png)

ipv6を外してやると繋がった。
GoでPythonのsubprocess.call(～, shell=True)みたいにコマンドを実行する

Pythonスクリプト内からコマンドを実行する際、`subrocess.call`に`shell=True`を指定すると、argsに渡した文字列がシェルによってそのまま実行されます。

[Pythonのドキュメント](http://docs.python.jp/2/library/subprocess.html#frequently-used-arguments)によればUnix系なら`/bin/sh`、Windowsなら`COMSPEC`環境変数がシェルとして使われるようなので、Goで同様のことをやる場合は、以下のようになるでしょうか。

```main.go
package main

import (
	"os"
	"os/exec"
	"runtime"
)

func callSubprocess(cmdString string) (err error) {
	osname := runtime.GOOS
	var cmd *exec.Cmd
	if osname == "windows" {
		shell := os.Getenv("COMSPEC")
		cmd = exec.Command(shell, "/c", cmdString)
	} else {
		shell := "/bin/sh"
		cmd = exec.Command(shell, "-c", cmdString)
	}
	cmd.Stdout = os.Stdout
	err = cmd.Run()

	return
}

func main() {
	err := callSubprocess("dir")

	if err != nil {
		os.Exit(1)
	}
}
Onsen UI ダイアログを二回目に表示する時 備忘録

#MonacaでOnsen UI を使ってダイアログを二回目以降表示する際にajaxでデータが取得できないとき


ons.createDialogをつかってダイアログを表示させて、その中でajaxを使用してデータをこねくり回す際に、初回時はajaxが回るが二回目は起動しないときの対処法を書き残す備忘録


```
  ons.ready(function() {
    ons.createDialog('dialog.html').then(function(dialog) {
      dialog.show();
    });
  });
```

```
    <ons-template id="arekorePop.html">
        <ons-dialog style="width:90%; height:75%" var="arekoreDlg" cancelable animation="none">
            <ons-toolbar inline>
                <div class="center">あれこれダイアログ</div>
            </ons-toolbar>
            <div id="arekorePop" style="padding:10px; font-size:; height:85%; overflow-y:scroll; text-align:center;">
                <ons-button modifier="large" onclick="arekoreDlg.hide();">閉じる</ons-button>
            </div>
        </ons-dialog>
    </ons-template>
```

```
function arekorePop() {
    ons.createDialog('arekorePop.html').then(function (dialog) {
        arekoreDlg = dialog;
        arekoreDlg.show();
        arePop();
	});
}
```

```
function arePop(){
    waitmodal.show(); /*ロード中のぐるぐる*/
    $.ajax({
        type: 'GET',
        url: 'http://arekore.ac.jp/sore.php',
        dataType: 'text',
        success: function(data) {
                waitmodal.hide();
            $("#arekorePop").html(data);
            alert("成功したぜ");
        },
        error:function() {
            alert('問題がありました。');
        }
    });
    arekoreDlg.on("posthide", function(){
        arekoreDlg.destroy();
    });
}
```

arekoreDlg.destroy()を使うのがみそ
それでだめならajax通信の前にダイアログがあるか判定してある時と無い時の両方に同じ処理を書く

備忘録として簡略化し要点だけ


※参考
ons-dialog リファレンス - Onsen UIフレームワーク
https://ja.onsen.io/v1/reference/ons-dialog.html
小ネタ:Index付きSelectが限界超えたらどー成るか?

#どーいうことだってばよ?

`public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source,Func<TSource, int, TResult> selector)`の`source`の要素数が､`Int32.MaxValue`超えたらどーなるのか気になったので試してみた｡

#試してみたこと

以下のようなモノをこさえて､後はひたすら回すべしw

```csharp

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication2
{
	class Program
	{
		static IEnumerable<long> CreateSequence()
		{
			for (long i = 0; i <= 2147483648; i++) yield return i;
		}
		static void Main(string[] args)
		{
			try
			{
				foreach (var elem in CreateSequence().Select((l, i) => new KeyValuePair<int, long>(i, l)))
				{
					if (elem.Value%1000000 == 0)
					{
						Console.WriteLine((elem.Value/2147483648.0*100).ToString("F2") + "%");
					}
				}
			}
			catch (OverflowException)
			{
				Console.WriteLine("Overflow detected!");
			}

			Console.WriteLine("Press enter to exit.");
			Console.ReadLine();
		}

	}
}

```

こいつを､` /checked-`でコンパイルして`OverFlowException`が飛んでくるかどうか試してみた｡

#結果とまとめ

飛んできた｡
当該部分のコードリーディングしたところ､インデックスとして､`selector`デリゲートに渡される変数のインクリメント部分が､明示的に`checked`ブロックで括られていたのでまぁそりゃそうなるよね｡
`Int32.MaxValue`超えるなんてそうそう無いとは思うけど､これも後学の為ということで一つ｡
Redmine でマイページに初めてブロックを追加するとレイアウトがリセットされる

初回表示用のレイアウトが定義されていて

```ruby:app/controllers/my_controller.rb
  DEFAULT_LAYOUT = {  'left' => ['issuesassignedtome'],
                      'right' => ['issuesreportedbyme']
                   }.freeze
```

表示する時にユーザが未設定の状態の時は、初回表示用のレイアウトを表示するようにしている。

```ruby:app/controllers/my_controller.rb
  def index
    page
    render :action => 'page'
  end

  # Show user's page
  def page
    @user = User.current
    @blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT # <- 初回表示用のレイアウトを渡している
  end
```

追加する時にユーザが未設定の状態の時は、空のレイアウトを読み込み、追加しているのでレイアウトがリセットされる。

```ruby:app/controllers/my_controller.rb
  # Add a block to user's page
  # The block is added on top of the page
  # params[:block] : id of the block to add
  def add_block
    block = params[:block].to_s.underscore
    if block.present? && BLOCKS.key?(block)
      @user = User.current
      layout = @user.pref[:my_page_layout] || {} # <- 空のレイアウトを渡している
      # remove if already present in a group
      %w(top left right).each {|f| (layout[f] ||= []).delete block }
      # add it on top
      layout['top'].unshift block
      @user.pref[:my_page_layout] = layout
      @user.pref.save
    end
    redirect_to my_page_layout_path
  end
```

リセットされるのは良いけど、いきなり消えてしまうのでもう少し見せ方を工夫する余地がありそう。
awspecの活用方法を考えてみた（インフラにもTDDを【cloudpack大阪ブログ】

先日参加した JAWS Festa 東海道 2016 でawspecの作者がawspecと構成管理ツールとの用途比較をされていて、僕の中でも使えそうと思ったので個人的整理とメモとして残します。
## awspecとは
ここ参照してください。
https://speakerdeck.com/k1low/inside-of-awspec-awswotesutosurufang-fa-sositesofalsezhong-falsehanasi
## 初期構築段階のお供に
CloudFormationやTerraformなどの構成管理ツール側で冪等性が保たれるのでテスト不要論はわかる。
が、しかし、テストが不要かというと、そうでも無い難しい問題。
（手作業ならテストは大事だよね・・
## 運用中のお供に
定期的にあるべき姿を保っているか、外形監視的に使うのは大賛成。
複数人（複数社）で管理してる場合に意図していない変更を管理するのは重要。（Configでも良いのでは？
Terraformとかを常時ぶん回すには破壊的行為をしないか超心配だが、awspecならreadなので安心してまわせる
## プロジェクトを横断してチェックをかける
構築時、運用中問わず、自社ポリシーに適合してるかどうか。のチェックは重要だと思うのでこれもアリだと思う。
例えばSSHが0.0.0.0/0で開放されていないか。とかバックアップタグがあること。など。（Configでも良いのでは？
##（これが一番ハマった）アジャイルな感じで構築している場合のテスト
ウォーターフォール的に構築してる場合は、設計書やパラメータシートに基づきテスト仕様書を作れば良いが、短納期でバシバシ変更を加えるようなアジャイル的に構築してる場合は、最終的なパラメータは順次決まっていく。

都度テスト仕様書に起こして、都度テストするのも辛いし、最終的に忘れずにチェック出来てるか管理するのも結構辛かった。整合性も取れているか不安要素。

awspecを使えば、随時決まる最終要件をテスト仕様書ではなくawspecに落として（都度や）リリース前にチェックをかければ、随時決まっていった要件を漏れずにテスト出来るのでは。と思った。
（awspecをテスト仕様書にしちゃいなよ）

## インフラもアジャイルでTDDが出来そう
クラウドならインフラもアジャイルで作れてTDDも出来るなー。とawspecの良さを感じたメモでした。

## 他に良さげな使い方があればコメントください
## 最後に
海外からもプルリクがよく来るみたいで、無いものがあればプルリク待ってます。とのことだったので、
必要なものがあればどしどしプルリクしちゃいましょう！

https://github.com/k1LoW/awspec
ディスクのクローンを作成

## Linux
### 読み込み
_TODO_

### 書き込み
_TODO_

## Mac
### 読み込み

まずは，読み出し対象のディスク (`/dev/rdiskX`) を見つけます．

```
diskutil list
```

`/dev/rdiskX` からデータを読み出し，`bk.img` という名前のディスクイメージを作成します．


```
sudo dd if=/dev/rdiskX of=bk.img bs=1m
```

### 書き込み
まずは，書き込み対象のディスク (`/dev/rdiskX`) を見つけます．

```
diskutil list
```

`/dev/rdiskX` のすべてのパーティションをアンマウントします．

```
diskutil unmountDisk /dev/diskX
```

`bk.img` というディスクイメージをもとに `/dev/rdiskX` に書き込みを行います．

```
sudo dd if=bk.img of=/dev/rdiskX bs=1m
```


## 備考
### dd コマンドのオプション

それぞれのオプションは次の意味を持ちます．

```
bs     -- block size
cbs    -- conversion buffer size
conv   -- specify conversions to apply
count  -- number of input blocks to copy
files  -- specify number of input files to copy and concatenate
ibs    -- input block size
if     -- specify input file
obs    -- output block size
of     -- specify output file
seek   -- output blocks initially skipped
skip   -- input blocks initially skipped
```


### disk と rdisk

BSD (Mac) では，同一デバイスに `/dev/diskX` と `/dev/rdiskX` の 2 つの名前でアクセスできます．

disk も rdisk も同じデバイスを参照しますが，ランダムアクセス可能かどうか，という点で異なります．disk はランダムアクセスが可能です．それに対して，rdisk はデバイスにシーケンシャルアクセスします．

ランダムアクセスは，インデックスを指定することで参照したいブロックに直接アクセスすることができます．それに対して，シーケンシャルアクセスは，先頭から順にブロックをたどって参照したいブロックにアクセスします．
ランダムアクセスは配列のようなもの，シーケンシャルアクセスはリストのようなもの，というイメージを持っておくといいでしょう．

disk はランダムアクセスを可能にするために 4 KB のバッファを介してデバイスにアクセスします．それに対して，rdisk はバッファを介さずにデバイスにアクセスすることができます．そのため，`dd` コマンドのようなランダムアクセスの発生しない読み書きの場合は，rdisk でデバイスを参照すると高速に読み書きできます．


## 参考

- [ddコマンドでSDカードのクローンを作る](http://kanonji.info/blog/2013/11/29/dd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7sd%E3%82%AB%E3%83%BC%E3%83%89%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3%E3%82%92%E4%BD%9C%E3%82%8B/)
- [diskとrdiskの違い](http://www.iroiro-making.com/disk-and-rdisk.html)
mysql2がインストールできない問題

Railsでmysql2をインストールできなかったので、解決策を書いていきます。
結論から述べるとosをsierraにアップグレードしたことによってエラーが出たっぽいです。検索してるうちに他の方の似たようなエラーがいくつかありました。

```ruby
バージョン mac osx sierra 10.12.1
$ rails -v
4.2.4
```
```ruby:Gemfile

gem 'mysql2', '~> 0.3.20'

```
```ruby
$ bundle install
#=>よくあるエラー
An error occurred while installing mysql2 (0.3.20), and
Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.3.20'` succeeds before
bundling.
```

ログに書かれている通りにコマンド実行

```ruby
$ gem install mysql2 -v '0.3.20'

Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

    /Users/****/.rbenv/versions/2.2.0/bin/ruby -r ./siteconf20161102-11170-******.rb extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.14/lib
-----
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/*****/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/mysql2-0.3.20 for inspection.
Results logged to /Users/******/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/extensions/x86_64-darwin-15/2.2.0-static/mysql2-0.3.20/gem_make.out
```



xcodeをアップデートすると良いらしいです
以下のコマンドの後。インストールできました。

```
$ xcode-select --install
```


```ruby
$ sudo gem install mysql2 -v '0.3.20'
Password:
Building native extensions.  This could take a while...
Successfully installed mysql2-0.3.20
Parsing documentation for mysql2-0.3.20
Installing ri documentation for mysql2-0.3.20
Done installing documentation for mysql2 after 2 seconds
1 gem installed
```

bundle installもうまくいきました。


参考にさせていただきました。
http://qiita.com/akito19/items/e1dc54f907987e688cc0
[Java1.8] EntityMatcher（Matcherへのこだわり)

JUnitでBeanやEntityの集合に対してテストを書くとき、どうしていますか？
私はこれで結構悩む事が多いです。

## こだわり

どういうこだわりがあるのかわからないというご意見がありましたので、どんなこだわりがあるのか自省してみました。

### assertThatとMatcherで検証を書きたい

junit3ではassertTrueを使いましたが、junit4でassertThatが登場しました。
正直Matcherに慣れないと、なぜassertTrueではいけないのか、Matcherの何がいいのか分かりにくいと思います。

私は以下のように考えています。

プログラムは定義そのものであるべきです。そのためには宣言的であるべきです。
その点、Matcherを用いて書かれた検証文は定義そのものであり、そこから出力される検証違反メッセージは検証内容そのものです。

検証内容とメッセージが乖離することは原理的にありえません。つまり

0. 検証内容が直感的に書けること（英語そのものだから）
0. 検証内容違反メッセージが検証内容から自動生成されること

がMatcherの利点ではないかと思います。

なので、自分でMatcherを作成する際、それが検証文の中で英語的に違和感がないかどうか、そしてメッセージと検証内容の乖離が発生しないか（つまり自動生成の原則に反していないか）が気になるのです。

これがこだわりです。

## Test

そこで、Matcherを作ってみようと思いたちまして、ちょいちょい書いてみました。
こんな風に使います。

```java
   @Test
    public void test(){
        List<Entity> list = Arrays.asList(new Entity("山田",20), new Entity("鈴木",30));

        assertThat(list, hasItem( allOf(
            assertEntity( Entity::getName , containsString("木") ),
            assertEntity( Entity::getAge , greaterThanOrEqualTo(30) )
        )));
    }
    @Data
    @AllArgsConstructor
    public static class Entity{
        private String name;
        private int age;
    }

```
これで、『名前に木を含み、年齢が30歳以上の人が存在する』事を検証できます。

## 実装

```java
public class EntityMatcher<E,V> extends BaseMatcher<E> {

    private Function<E,V> func;
    private Matcher<V> matcher;

    public EntityMatcher(Function<E,V> func, Matcher<V> matcher){
        this.func = func;
        this.matcher = matcher;
    }
    @Override
    public boolean matches(Object o) {
        return _matches((E)o);
    }
    private boolean _matches(E e){
        V v = func.apply(e);
        return matcher.matches(v);
    }

    @Override
    public void describeTo(Description description) {
        description.appendText("func=").appendValue(func);
        matcher.describeTo(description);
    }

    public static <E,V> Matcher<E> assertEntity(Function<E,V> func, Matcher<V> matcher){
        return new EntityMatcher(func,matcher);
    }
}
```

ただ、まだいくつか問題があります。

* メソッド参照は説明(description)を出力する事ができない。ただのラムダなので・・・
* `matches(Object o)`の引数oをEにキャストしなければいけないが、本来これをすべきじゃない。  
（ただ、OがEであることは、assertThatから考えて間違いないかと思うので、このままでいい気もします）


## 結論

メソッド参照ではなくて属性名を書いてリフレクションで取る手はありますし、そうすればdescriptionも書きやすいですが、あまりしたくないんですよね。
Vの型が不定になってしまうので・・・

```java
assertEntity("name", String.class, containsString("aaa") );
```
とかしてしまう手もありますが、ちょっと冗長だと感じます。

メソッド参照が、「メソッド参照Class」であれば何の問題もないんですけどねえ。
悩ましいです。

```java
assertEntity("Entity.name", Entity::getName , containsString("木") ),
```

うーーーーん、これは最後の手段ですかね。
何か良いアイデアがあれば下さい。

# 補足

たとえば、restのテストをしているとします。

```java
Response response = requestSomething();
//1)
assertThat( respone.getStatus(), equalTo(200));
//2)
assertThat( response, assertEntity( Response::getStatus, equalTo(200));
```
とあったとします。
1)だと、`actual) 500 , expected) 200` と出力されるだけですが、
2)だと、`actual) Response(status=500,location=...), expected( response.status = 200`
と出力することができます。
1のエラーメッセージは正直意味不明です。その数字が何を意味しているかは補足がなければわからないでしょう。
この意味不明さは、結局のところassertTrueの意味不明さと同一のものです。
なので

```java
assertThat( "response status check", response.getStatus(), equalTo(200));
```
とでも書きましょうか。

ですが、2)の例は何を検証した結果がどうだったのかが、より明確ではないでしょうか？
RackMonkeyインプレッション（操作編）

[RackMonkeyインプレッション（インストール編）](http://qiita.com/n-i-e/items/cc1a4ad63908a8538eab)に引き続き、RackMonkeyを使いこなして行きたいと思います。

#構成管理
##基本操作

まず、緑の⊕アイコンが追加、鉛筆アイコンが編集、赤の⊖アイコンが削除です。これを理解しないと何もできません。

##ラックスペースの管理単位

以下のような管理単位になっています。

|粒度|管理単位の名前|説明|
|:--|:--|:--|
|大まか|Building|ビル|
||Room|部屋|
||Rack|架|
|細かい|U||

架の前面と背面という概念はありませんので、ひとつのUに配置できる機器は最大でも1つです。

##機種表の管理

架に機器を配置する前に、まずは機種表に機種を登録します。
Configタブ→Hardwareと進むと機種一覧が出てきますので、ここで緑⊕をクリックし、入力フォームを埋めます。このときにUの数を入力します。Saveボタンを押せば完了です。

##機器の配置

Racksタブを選んで出現する架一覧表の中から一つを選択し、Summary LayoutかDetailed Layoutのどちらかを選択すると、機器配置表が出てきます。ここで適当な場所を選んで緑⊕をクリックすると、機器登録画面になりますので、フォームを埋めて機器を登録します。

この画面では機器の高さ（Uの数）を登録できません。機種表で登録した高さが使われます。機種をUnknownにすると、自動的に1Uになります。

Saveボタンを押せば完了です。

##その他

Appsというタブがあり、ここでアプリを登録できます。登録したアプリにはDevices Usedという欄があり、ここに機器を登録できます。これを登録していくことで、どの機器でどのアプリが動いているかを管理するということのようです。

Configタブ→Domainsで、ドメインを登録できます。ドメインとはDNSのドメインで、機器のホスト名をFQDNで管理したい場合は、ここに登録したドメインを選んで登録します。

そんなところです。

#アカウントとアクセス権限

本格的なものではありませんが、Apache httpdの認証機能と連携したアカウントっぽい機能が用意されています。

1. インストールしただけの素の状態では、アカウント機能は使われません。ログイン操作は不要で、誰もが読むことも、書くこともできます。
2. Apacheの認証機能を有効にしてログイン名を入力すると、そのログイン名でログインしたことになります。
3. guestという名前のアカウントを作っておくと、それでログインしたユーザーはリードオンリーとなります。読むことはできますが、書き込みはできません。
4. 上記guest以外のユーザーについては、アクセス権限を細かく設定することはできません。誰もが読むことも、書くこともできます。ただし誰が何を書き込んだかは記録されており、``logdump``というコマンドラインツールで確認することができます。

。。。というものです。

Apacheの認証機能とは、``.htaccess``とか``.htpasswd``とかを使って実現するBasic認証とかその手のヤツです。詳しくは、Apache公式ドキュメントの[認証、承認、アクセス制御](https://httpd.apache.org/docs/2.4/ja/howto/auth.html)を参照して下さい。

#論評

##配線表がない！

配線の管理機能がなく、通信線も電源線も管理できません。そんなわけですので、RackMonkeyでExcelを撤廃しよう！というのは無理であり、ExcelはExcelで使い続けることになります。

##リビジョン管理がない！

リビジョン管理は、もちろんありません。

##総評

機能はかなり少なく、こぢんまりとした規模のデータセンター管理ツールという印象です。2000年代初頭ぐらいに1架とか1/2架単位でコロケーションスペースを借りるのが流行りましたが、そのぐらいの規模感で小さく運営するシステムが想定されている感じです。

##その他

今回試したRackMonkeyのバージョンは1.2.5-1ですが、RackMonkeyのドキュメントを見ると、どうやら1.3というバージョンがあるか、作る構想があったか、そんな感じらしいのです。しかし、[Sourceforgeのダウンロードページ](https://sourceforge.net/projects/rackmonkey/files/)にそんなバージョンはありませんし、公式ページによるとRackMonkeyを今後積極的に開発する気はないとのことですので、たぶん1.3はお蔵入りになったのでしょう。

以上！RackMonkeyインプレッションは今回で終わりです。

#リファレンス

##公式

RackMonkey
http://flux.org.uk/projects/rackmonkey/

RackMonkey 1.2.5 User Guide
http://flux.org.uk/projects/rackmonkey/doc/1.2.5/user_guide.html

RackMonkey 1.2.5 Admin Guide
http://flux.org.uk/projects/rackmonkey/doc/1.2.5/admin_guide.html

##不肖私

RackMonkeyインプレッション（インストール編）
http://qiita.com/n-i-e/items/cc1a4ad63908a8538eab