OmniAICreator/Qiita-1.07M huggingface dataset:
TensorFlow RNN関連のimportやRNN(LSTM)Cellでエラーが出た場合の対処(v 0.11r~)

以前TensorFlow RNNの初学用サンプルコードに書いた（[TensorFlowのRNNを基本的なモデルで試す](http://qiita.com/yukiB/items/f6314d2861fc8d9b739f)）のですが，TensorFlowのバージョンがあがり，動かなくなっている部分があるので簡単にまとめておきます．

## 環境

OSX
python 3.5
TensorFlow r0.11

## import

RNN関連のinportを行う際，v.0.8までは

```py3
from tensorflow.models.rnn import rnn, rnn_cell
```

としていましたが，repackaging関連の問題で，

```shell
ImportError: This module is deprecated.  Use tf.nn.rnn_* instead.
```

というエラーが出てしまいます．

そのため，rnn, rnn_cellのimportの部分は消してしまい，rnnやrnn_cellを使用している部分を

```py3
# rnn_cell.BasicLSTMCell( ->
tf.nn.rnn_cell.BasicLSTMCell(...

# rnn( ->
tf.nn.rnn(...
```

と変更してあげてください．

### BasicLSTMCell

上記エラーを修正しても

```py3

cell = tf.nn.rnn_cell.BasicLSTMCell(
    num_of_hidden_nodes, forget_bias=forget_bias)
rnn_output, states_op = tf.nn.rnn(cell, in4, initial_state=istate_ph)
```



のような部分で，

```shell
TypeError: 'Tensor' object is not iterable.
```

というエラーが吐かれることがあります．

これは，```BasicLSTMCell```のデフォルト引数が変わったのが原因で，戻り値の形式としてtuple型を許すか，結合させるかを決める```state_is_tuple```がFalseからTrueに変わっているためです．

そのため，上記コードであれば

```py3

cell = tf.nn.rnn_cell.BasicLSTMCell(
    num_of_hidden_nodes, forget_bias=forget_bias, state_is_tuple=False)
rnn_output, states_op = tf.nn.rnn(cell, in4, initial_state=istate_ph)
```

と`BasicLSTMCell`の引数に，`state_is_tuple=False`を指定してあげればよいです．
ただし，これに関しては[公式ドキュメント](https://www.tensorflow.org/versions/r0.11/api_docs/python/rnn_cell.html#BasicLSTMCell)にて，そのうち廃止にするよ，と書いてあるのでゆくゆくはまた書き方を変える必要がありそうです．

## 参考

- Tensor Flow - LSTM - 'Tensor' object not iterable [http://stackoverflow.com/questions/40464178/tensor-flow-lstm-tensor-object-not-iterable](http://stackoverflow.com/questions/40464178/tensor-flow-lstm-tensor-object-not-iterable)
- 公式ドキュメント [https://www.tensorflow.org/versions/r0.11/api_docs/python/rnn_cell.html#BasicLSTMCell](https://www.tensorflow.org/versions/r0.11/api_docs/python/rnn_cell.html#BasicLSTMCell)
【Python】Anaconda入門 (2) Pythonの基本

Pythonを使ったデータサイエンティストになるための修行です。

#### 環境構築はこちら
[【Python】Anaconda入門 (1) 環境構築](http://qiita.com/Morinikki/items/5b71746b06161a370c86)

ここではPythonの基本をやります。

※ 個人的な意見が含まれています。

**NEXT** →[【Python】Anaconda入門 (3) Pythonのクラス](http://qiita.com/Morinikki/items/73d45aa065eaef6c22d6)

# Pythonの特徴
- 動的script言語
- コンパイル不要
- 変数の型宣言、関数のprototype宣言は不要
- 強制インデント
- 予約語や面倒で覚えにくいルールが少ない
- 自然で常識的な文法や記号
- selfだらけで**スケベ**

強制インデントや予約語が少ないおかげで誰が書いても同じようなコードになるので初心者にはおすすめの言語だと思います。

# Python2とPython3
Pythonには2系と3系が存在します。
Python3では、よりシンプルで一貫性を持たせるため進化していますが、Python２との互換性がない部分があります。
Python3がリリースされてすでに8年以上立っているにも関わらず、未だに2系を使っている人たちが多いという(他の言語からバカにされるレベルで)意味不明な状態です。
Python2は2020年には[サポートが終了](https://pythonclock.org/)しますし、最近は主要ライブラリが3系に対応しているのでPython3を使いましょう。

# Pythonの実行
Pythonの実行には2つの方法があります。

- インタプリタを使う
- プログラムを実行する

## インタプリタを使う
pythonと入力すればPython Shellが起動し、対話モードでPythonを実行できます。

```bash:Terminal
$ python
Python 3.5.2 |Anaconda 4.1.1 (x86_64)| (default, Jul  2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

インタプリタでは単純な電卓のように動作します。
式を入力すると、その結果が表示されます。

```python:Terminal
>>> 2 + 2
4
>>> 50 - 5*6
20
>>> (50 - 5*6) / 4
5.0
>>> 8 / 5
1.6
```


## プログラムを実行する
Pythonのスクリプトファイルにコードを書き、それを指定することで実行できます。

```python:helloworld.py
print("hello world")
```


```bash:Terminal
$ python helloworld.py
hello world
```

**NEXT** →[【Python】Anaconda入門 (3) Pythonのクラス](http://qiita.com/Morinikki/items/73d45aa065eaef6c22d6)
GentooでAftertheDeadline

英文法チェックソフトの[AftertheDeadline](http://www.afterthedeadline.com/)のサーバーをgentooにインストールするebuildを書いた

https://github.com/niitsuma/niitsuma-overlay/tree/master/app-text/afterthedeadline

/opt/bin/afterthedeadlined

を実行すると

http://localhost:1049/

で動く。例えば

http://127.0.0.1:1049/checkDocument?data=the+ball+was+thrown

などと入力して使う。

/etc/init.d/afterthedeadlined

も作ったがこちらはうまく動かなかった
【Python】Anaconda入門 (1) 環境構築

Pythonを使ったデータサイエンティストになるための修行です。
まずは、Pythonを動かす環境構築から始めましょう。
今回目指すPython環境は次のようなものです。
**Mac OS + Homebrew + pyenv + Anaconda**

【私の実行環境】
OS X El Capitan (10.11.6)

※ この記事はMacOSを対象として書いています。
　WindowsやLinuxでわからない人ははなんとかがんばってください。

**NEXT** →[【Python】Anaconda入門 (2) Pythonの基本](http://qiita.com/Morinikki/items/2b35b49f975febe7020f)


# Homebrew
Homebrewは、Mac OSで**超絶**簡単にソフトウェアがインストールできるパッケージ管理システムです。
今回はpyenvをインストールするのに使います。
すでに導入済みの方はスキップしてください。

## Homebrewのインストール
以下のスクリプトをターミナルに貼り付けて実行するだけです。

```bash:Terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

以下のコマンドでバージョンが確認できればインストール成功です。

```bash:Terminal
$ brew -v
Homebrew 1.1.0
```


## Homebrew環境のアップデート
時代に取り残されないようにアップデートしましょう。

```bash:Terminal
$ brew update
```

# pyenv
次はpyenvです。
pyenvはPythonの様々なバージョンを**超絶**簡単に、インストールしたり、切り替えたりすることができるバージョン管理ツールです。
Pythonはバーション３系が最新なのに未だにバージョン２系が使われ続けている**最強言語**なのでこれが必須です。

## pyenvのインストール
pyenvはHomebrewを使ってインストールできます。

```bash:Terminal
$ brew install pyenv
```

これだけだとまだ使えないのでpathを通してリロードします。

```bash:Terminal
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ exec $SHELL
```

以下のコマンドでバージョンが確認できればインストール成功です。

```bash:Terminal
$ pyenv -v
pyenv 1.0.2-46-geb2e5ac
```

# Anaconda
やっとPythonのインストールです。ただしPythonはAnacondaでインストールします。
Anacondaはデータサイエンティストに必要なライブラリがPython本体とセットになっている
**超絶スケベ**パッケージです。
かなりスケベなのでこれを入れておけば大体OKです。

## Anacondaのインストール
Anacondaはpyenvでインストールします。
まずはインストールできる最新版を確認します。

```bash:Terminal
$ pyenv install -l | grep anaconda
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
  anaconda-1.6.0
  anaconda-1.6.1
  anaconda-1.7.0
  anaconda-1.8.0
  anaconda-1.9.0
  anaconda-1.9.1
  anaconda-1.9.2
  anaconda-2.0.0
  anaconda-2.0.1
  anaconda-2.1.0
  anaconda-2.2.0
  anaconda-2.3.0
  anaconda-2.4.0
  anaconda-4.0.0
  anaconda2-2.4.0
  anaconda2-2.4.1
  anaconda2-2.5.0
  anaconda2-4.0.0
  anaconda2-4.1.0
  anaconda2-4.1.1
  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1
```

anaconda2がVersion 2系、anaconda3がVersion 3系となっています。
とりあえず3系の最新版を入れておきましょう。
結構時間かかります。

```bash:Terminal
$ pyenv install anaconda3-4.1.1
```

念のため2系もいれときますか。

```bash:Terminal
$ pyenv install anaconda2-4.1.1
```

## バージョンの切り替え
Pythonをインストールしたらpyenvで使用するバージョンを切り替えましょう。
次のコマンドでインストールされているPythonのバージョンが確認できます。

```bash:Terminal
$ pyenv versions
* system
  anaconda2-4.1.1
  anaconda3-4.1.1
```

今はsystemになっていると思うのでこれをanaconda3-4.1.1に切り替えます。

```bash:Terminal
$ pyenv global anaconda3-4.1.1
```

pythonコマンドを実行して以下のように表示されればPythonのインストール成功です。

```bash:Terminal
$ python
Python 3.5.2 |Anaconda 4.1.1 (x86_64)| (default, Jul  2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

**NEXT** →[【Python】Anaconda入門 (2) Pythonの基本](http://qiita.com/Morinikki/items/2b35b49f975febe7020f)
Gentooでredpen

genntooに[redpen](http://redpen.cc/)をインストールするebuildを作った。

https://github.com/niitsuma/niitsuma-overlay/tree/master/app-text/redpen

/opt/redpen/bin/redpen

でコマンドラインから使えるようになる。

なおやっている処理はarclinuxのredpenパッケージと同じ
https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=redpen

emacsの設定は以下のようにした．
(一応は動いているが自信はあまりない)

```redpen-paragraph-conf.el
(require 'redpen-paragraph)
(defvar redpen-commands
   '("/opt/redpen/bin/redpen -r json -c /opt/redpen/conf/redpen-conf-en.xml %s 2>/dev/null"
     "/opt/redpen/bin/redpen -r json -c /opt/redpen/conf/redpen-conf-ja.xml %s 2>/dev/null"))

(add-to-list
 'redpen-paragraph-alist
 `(LaTeX-mode
   . ,(lambda () "get visible string on current paragraph."
        (let ((end (if (use-region-p)
                       (region-end)
                       (point-max)))
              (begin (if (use-region-p)
                         (region-beginning)
                         (point-min))))
            (apply 'string
                   (cl-loop
                    for pos from begin to end
                    when (not (get-text-property pos 'invisible))
                    collect (char-after pos))))))
 
  `(markdown-mode
   . ,(lambda () "get visible string on current paragraph."
        (let ((end (if (use-region-p)
                       (region-end)
                       (point-max)))
              (begin (if (use-region-p)
                         (region-beginning)
                         (point-min))))
            (apply 'string
                   (cl-loop
                    for pos from begin to end
                    when (not (get-text-property pos 'invisible))
                    collect (char-after pos))))))
 )


;;(define-key global-map (kbd "C-c C-r") 'redpen-paragraph)

```
Spring Bootの起動バナーの変更

# 概要
Spring Bootでは起動時のバナーを変更することができます。
テキストファイルや画像ファイルによる単純な置き換えから、
カスタマイズ性の高いロジックによる変更などが用意されています。

# テキストファイルでバナー表示
/src/main/resourcesにbanner.txtを配置することで起動時にバナー表示されます。
<img width="192" alt="スクリーンショット 2016-11-21 2.31.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/82768/7215a392-ff11-f69d-b06c-311595b7842c.png">

<img width="790" alt="スクリーンショット 2016-11-21 2.32.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/82768/c60f2350-a2ce-2f81-7885-b7317998a672.png">

テキスト内の変数として、Spring Bootのバージョンを表示する${spring-boot.version}や
アプリケーションのバージョンを表示する${application.version}などが用意されています。(*1)
また${AnsiColor.BLUE}などで文字色を変更することもできます。

*1: MANIFEST.MFより読み込まれるためEclipseなどから起動した場合表示されません。

# 画像から作成したバナーを表示
/src/main/resourcesにbanner.gif, banner.jpg, banner.png等のファイルを配置すると、起動の際にアスキーアート化して表示されます。

<img width="191" alt="スクリーンショット 2016-11-21 2.38.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/82768/37314ba0-76c8-b1fc-8223-1d8c247b4c7a.png">

<img width="779" alt="スクリーンショット 2016-11-21 2.39.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/82768/7a1d700c-82b8-ae5f-5830-c8d7ffc12dbf.png">


# ロジックで作成したバナー表示

org.springframework.boot.Bannerを実装したClassを用意することで、独自ロジックでバナーを表示することができます。

ランダムなキャラクターでCowsayの実装例

```java:SpringBootBannerSampleApplication.java
@SpringBootApplication
public class SpringBootBannerSampleApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(SpringBootBannerSampleApplication.class);
        app.setBanner(new CustomBanner());
        app.run(args);
    }
}
```

```java:CustomBanner.java
public class CustomBanner implements Banner {

    private static final String SEPARATOR = System.getProperty("line.separator");

    @Override
    public void printBanner(Environment environment, Class<?> sourceClass, PrintStream printStream) {

        String[] charList = Cowsay.say(new String[]{"-l"}).split(SEPARATOR);
        Random rand = new Random();
        int sayChar = rand.nextInt(charList.length);

        String version = SpringBootVersion.getVersion();
        String[] args = new String[]{"-f", charList[sayChar], "Spring Boot "  + version};
        String result = Cowsay.say(args);

        printStream.println(result);

    }

}
```

<img width="752" alt="スクリーンショット 2016-11-21 2.47.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/82768/b0f08c8f-77fd-f22a-9559-d1a9cc4ff59b.png">


# 使用したコード
https://github.com/5at00001040/spring-boot-banner-sample

# 参考
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html
Pythonからコマンドを実行する



# はじめに
pythonからコマンドを実行し、結果を受け取るにはどうすればよいか。  
スクリプトから直接コマンドを実行できれば、スクリプト実行完了後に結果を処理するためのコマンドを実行するなどの手間も省くことができます。


# subprocessモジュール
pythonからコマンドを実行する方法はいくつかありますが、今回はsubprocessモジュールを使った方法を説明します。  

## call
実行したいコマンドをリスト形式で渡すとプロセスが実行されます。  
成功した場合、0が返ってきます。

```
In [1]: import subprocess
In [2]: subprocess.call(["ls", "-la"])
Out[2]: 0
```

`shell=True`としておくと、以下のようにコマンドを実行できて便利です。

```
In [3]: subprocess.call("ls -la", shell=True)
Out[3]: 0
```

## check_call

`call`で存在しないコマンドを渡した場合、`command not found`というエラーが返ってくるだけですが、`check_call`を使うと実行にした場合`CalledProcessError`という例外を投げることができます。

### check_callで実行した場合
`CalledProcessError`という例外が返ってきました。

```
In [5]: subprocess.check_call("lddd", shell=True)
/bin/sh: lddd: command not found
---------------------------------------------------------------------------
CalledProcessError                        Traceback (most recent call last)
<ipython-input-5-00471ece15fa> in <module>()
----> 1 subprocess.check_call("lddd", shell=True)

/Users/SoichiroMurakami/.pyenv/versions/anaconda-2.4.0/lib/python2.7/subprocess.pyc in check_call(*popenargs, **kwargs)
    539         if cmd is None:
    540             cmd = popenargs[0]
--> 541         raise CalledProcessError(retcode, cmd)
    542     return 0
    543

CalledProcessError: Command 'lddd' returned non-zero exit status 127
```

### callで実行した場合
`command not found`が返ってくるだけです。

```
In [6]: subprocess.call("lddd", shell=True)
/bin/sh: lddd: command not found
Out[6]: 127
```


## check_output

引数でコマンドを実行し、その出力を文字列として取得することができます。  
コマンドの実行結果をスクリプト内で使いたい場合に便利です。

```
In [9]: cal_output =  subprocess.check_output("cal", shell=True)

In [10]: print cal_output
     11月 2016
日 月 火 水 木 金 土
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
```



# その他の方法
subprocessモジュール以外のコマンド実行方法についての補足です。 
以下の2つの方法があるようですが、現在はあまり推奨されていないようです。
 - os.system(`command`)
 - commands.getoutput(`command`)
[Unity] JsonUtility vs ZeroFormatter vs FlatBuffers (ローカルデータの永続化)

#内容
ZeroFormatterにUnion機能が実装されたため
[前回](http://qiita.com/akerusoft/items/48ee93e33c2038316064)をもとにUnionで再実装してテストをする。

業界主要なデータフォーマットのJsonとの比較がないとパッとしないだろうということで
Unityの標準Jsonクラスを使用してテストしてみました。

テスト内容はFlatbuffersとの比較処理で使用したものをそのまま使う。
(http://qiita.com/akerusoft/items/bf43b6382f30c43595b4)

使用したプログラム
https://github.com/akerusoft/UnityTestZeroFormatter2


#環境
Unity 5.4.2p4
ZeroFormatter 1.4.2

IL2CPPでビルド
Android 4.0.4 (低スペック機)

#結果
一般的なデータフォーマットとの比較としてJsonUtilityも追加してみました。
シリアライズとデシリアライズを1000回、それぞれのフォーマットで実行した結果です。

|  | JsonUtility | ZeroFormatter | FlatBuffers |
|--:|--:|--:|--:|
| 1 | 1,298 | 458 | 489 |
| 2 | 1,292 | 459 | 538 |
| 3 | 1,273 | 510 | 524 |
| 4 | 1,292 | 508 | 479 |
| 5 | 1,270 | 439 | 519 |
| 6 | 1,280 | 444 | 477 |
| 7 | 1,256 | 475 | 478 |
| 8 | 1,276 | 468 | 510 |
| 9 | 1,275 | 458 | 507 |
| 10 | 1,201 | 434 | 466 |
| Average | 1,271.3 | 465.3 | 498.7 |
| Max | 1,298.0 | 510.0 | 538.0 |
| Min | 1,201.0 | 434.0 | 466.0 |
|  |  |  |  |
| JsonUtilityとの比較 |  |  |  |
| Average | 1.00 | 0.37 | 0.39 |
| Max | 1.00 | 0.39 | 0.41 |
| Min | 1.00 | 0.36 | 0.39 |
| データサイズ | 96 | 65 | 84 |

FlatBuffersとZeroFormatterは、ほぼほぼ一緒ですね。
もうこれ以上、速くするにはデータによって最適化されたフォーマットなどではないでしょうか？

JsonUtilityは速度面ではなく柔軟性の高さが売りですので
この結果だから使用しないというわけではなく、速度を気にしない箇所では使っても問題ないと思います。


#注意点
##フィールドの追加
ZeroFormatterはフィールドの追加や削除はできるので
ここでの実装のようにバージョンを分けるのは「大きな変更があってリセットしたい」ってとき。


##ZeroFormatterでUnionを使用するときの注意点
シリアライズするときに親クラスを指定しないとうまく出力できない。
https://github.com/neuecc/ZeroFormatter#union

今回でいえば下記のような実装。

```csharp
var bytes = ZeroFormatterSerializer.Serialize<MonsterDataBase>(data);
```


#感想
前回のコードは残してテストしようとしたがzfc.exeで事前コード出力をすると怒られてしまったので
コードを書き直して実装しなおした。

また、同名のenum型があると出力されたクラス名が重複してしまうっぽい。

仕様だけみてたら気が付かなった実装の注意点に気が付いてよかったですね。
実装の注意点だけヒューマンエラー入りそうで心配だったけども、
自前の実装をしないで異なるデータタイプを扱るのはよかった。
面倒だから楽する仕組み"import"!

importは楽する仕組みです。
同一パッケージ内にないクラスを使用する時につかいます。

##分かりやすく説明するために例を１つあげることにしました。

>とある高校受験会場で３人の受験生が面接を受けています。
その時の３人の挨拶が以下の通りです。
Aさん「東京都立、新宿中学校、普通科より参りました、Aと申します。」
Bさん「東京都立、新宿中学校、普通科より参りました、Bと申します。」
Cさん「東京都立、新宿中学校、普通科より参りました、Cと申します。」

３人とも「東京都立、新宿中学校、普通科」まで同じ事を言ってますね。
もし、事前に同じ都立の同じ中学校、同じ学科から来た受験生が面接を受ける事がわかっていれば

>面接官「東京都立、新宿中学校、普通科のみなさん、どうぞ」
Aさん「Aと申します。」
Bさん「Bと申します。」
Cさん「Cと申します。」

となるはずです。

##javaのプロジェクトで再現してみます！

```text
importdemonstration/
    ├──Jukensei.java    //Aさん～Eさん※イメージ
    ├──Mensetu.java     //面接会場※イメージ
```

Jukensei.javaの記述はこんな感じになります。

```java
package tokyo.school.course;

public class Jukensei{
	public static  void studentA(){
		System.out.println("studentA");
	}

	public static  void studentB(){
		System.out.println("studentB");
	}

	public static  void studentC(){
		System.out.println("studentC");
	}
}
```

つぎに面接会場を再現してみましょう！
Mensetu.javaの記述をしていきます。

```java
package mensetu;

public class Mensetu{
	public static void main(String[] args) {
		tokyo.school.course.Jukensei.studentA();    //東京都立、新宿中学校、普通科より参りました、Aと申します。
		tokyo.school.course.Jukensei.studentB();    //東京都立、新宿中学校、普通科より参りました、Bと申します。
		tokyo.school.course.Jukensei.studentC();    //東京都立、新宿中学校、普通科より参りました、Cと申します。
	}
}
```

これがさっきの例で話していた事です。
tokyo(東京都立).school(新宿中学校).course(普通科).Jukensei(クラス名).studentA()(Aと申します)
いわゆる完全修飾クラス名で記述しています。
完全修飾クラス名中の「ピリオド(.)」は、ディレクトリ区切りを意味します。
ある種「フルパス」ということになるみたいです。

それではimportを使用して書き換えてみることにします。

```java
package mensetu;

import tokyo.school.course.Jukensei;    //面接官「東京都立、新宿中学校、普通科のみなさん、どうぞ」

public class Mensetu{
	public static void main(String[] args) {
		Jukensei.studentA();    //Aさん「Aと申します。」
		Jukensei.studentB();    //Bさん「Bと申します。」
		Jukensei.studentC();    //Cさん「Cと申します。」
	}
}
```

実行結果は変わりません。
つまり、importは「1個所で宣言する」ということです。

##Eclipseを使用した場合のimport
importを記述せず、いきなり"Jukensei.studentA()"と記述するとエラーがでます。
ですがEclipseには「エラー解決支援」という素晴らしい機能が存在します。
![スクリーンショット (3).png](https://qiita-image-store.s3.amazonaws.com/0/146678/508e9185-f579-4d09-6497-935f1fa12ed6.png)

また、Eclipseの便利機能の「入力支援（途中まで入力後"Ctrl+space"）」を使用する事で適切なimportしてくれます。

##あとがき
うまく説明できていなかったらごめんなさい。
まとめるのに時間がかかりましたが、正確に記述できていなかったらごめんなさい。
Qiitaをシンプルで圧倒的に見やすくするカスタムCSS

必要なことはシンプルだ。
以下の2つをすればいい。

- 必要ない情報は極力なくす
- 必要な情報は広く大きく見せる

で、そのスクリーンショットがこれ。

<img src="https://userstyles.org/style_screenshots/135415_after.png?r=1479652519">


インストールは`Stylish`が入っていれば`Install with Stylish`を押すだけ。入っていなければ先にインストールが必要だ。

[SimpleQiita - Themes and Skins for Qiita - userstyles.org](https://userstyles.org/styles/135415/simpleqiita)

以下は妄言であるので、必要があっても読む必要はまったくない。


## バイアスの除去
2000コントリビュート。30コントリビュート。0コントリビュート。
うんこれほど意味がないのに記事を見る前からバイアスがかかる情報もあるまい。

他の人はどうだか知らないが、Qiitaの使い方としてQiita内から色々探すことはない。わからないことをググって、その結果Qiitaにやってくる。

その時邪魔になるのがバイアス、コントリビュート数だ。
はっきり言ってコントリビュート数はまやかしで、これほど当てにならないにも関わらず見る人に影響を与えるものもない。

コントリビュート数が多い。よし安心して記事を読めるな。**まさか！**
間違った内容を垂れ流す入門記事や、英語ドキュメントを質の悪い翻訳にかけたような記事で狂ったように伸びるコントリビュート数。

俺自身`Bluemix`を実質2時間程度しか使ってないのに関わらず、あるバズった1つの記事だけで`Bluemix`タグのコントリビュート数でトップになってしまった。`Bluemix`について何も知らないのに。でも、`Bluemix`についての記事だからタグを外すのもおかしいだろ？

この数字がサイドバーでどうしても目に入るのは本当によくない。作業妨害もいいところだ。
**俺は問題を解決したいだけで、問題を解決した先人のことを知りたいわけじゃない**。

ユーザ情報なんて人気の投稿含めて記事の最後にあればいい。

## 1カラム
さっきも言ったけど、集中して記事を読むのを阻害するサイドバーなんていらない。

インデックス？
5章とか8章とかあるGitBookならともかく、単一の記事でインデックスなんて場所を取るだけで邪魔なだけでしょ?
これのせいで、コード部分を横スクロールする必要があるときが倍増するんだ。
例えば、こんなふうにね。

**2カラム**
![スクリーンショット 2016-11-21 13.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/15319/1a2961a5-f17d-d970-76d6-6ca75f2d3e13.png)



**1カラム**
![スクリーンショット 2016-11-21 13.31.50.png](https://qiita-image-store.s3.amazonaws.com/0/15319/c2c7ad80-5e2a-545c-5f42-f4ad3c9749c9.png)



技術的なサイトで1行80文字も入らず、コード部分で横スクロールとか正気じゃないよ。
もちろん全画面で表示しとけばそんなことはないよ。
でも、Qiita開いているときブラウザを全画面で開くなんてしないよね？
たいていは、画面半分Qiita、もう半分はターミナルかエディタだ。

何が言いたいって2カラムはユースケースにあってないんだ。

## いいねしたユーザ

![スクリーンショット 2016-11-21 00.56.23.png](https://qiita-image-store.s3.amazonaws.com/0/15319/c56b1db4-f880-88d7-65eb-3e6ee7d6dab8.png)

いいねしたユーザって何だよ?
あそこにアイコンが並んでることにどんな意味があるっていうんだ？
**いいねしたユーザか、気になるな。そうだ！いいねしたユーザの情報を見よう！**
こんな人がいるっていうのか？
冗談だろ。

## タイトル
でかい。
いままで長すぎるタイトル付ける人なんだよ、タイトルで4行って正気かよと思ってたけど、違う。
タイトルの文字サイズがでかい。

## まとめ
とにかく、言いたいことは2つだけ。

- 必要ない情報は極力なくす
- 必要な情報は広く大きく見せる


[SimpleQiita - Themes and Skins for Qiita - userstyles.org](https://userstyles.org/styles/135415/simpleqiita)

## 参考
Qiitaで検索してトップだったのでスクリーンショットに利用させていただきました。

- [Qiitaの「いいね」について思うこと - Qiita](http://qiita.com/mono0926/items/bea86a60977287c0e361)
AWS Lambdaで環境変数を使う(Java)

# この記事の目的
初投稿．
AWS Lambdaで環境変数が使えるようになったので，早速使ってみる．(Java)

# Lambdaのコード(Java)
```java:HelloWorld.java
public class HelloWorld {

	private static String ENV_TEST_VALUE = "ENV_TEST_VALUE";

	public static String handleRequest(String input) {
		String output;

		String envValue = System.getenv(ENV_TEST_VALUE);

		output = "Hello World : " + envValue;

		return output;
	}

}
```

# AWS Consoleでの設定
以下の赤囲みのところで環境変数を設定できます．
![Lambda_environmentValue.png](https://qiita-image-store.s3.amazonaws.com/0/123978/7ad3ad9f-ed5c-0cb7-0380-565e71860794.png)


# 結果
テストデータを突っ込んで，"TEST"をポチッと押す．
```
"Hello World : TEST"
```
バッチリ取得できてますね．
AWS Consoleで環境変数の値を変更すれば，もちろん出力も変わります．

# さいごに
これで開発用と本番用の関数を実現するための方法が楽ちんになりますね．
環境変数の制約などは，Developers.IOさんのブログが詳しく書いてます．

# 参考
[New for AWS Lambda – Environment Variables and Serverless Application Model (SAM) | AWS Blog](https://aws.amazon.com/jp/blogs/aws/new-for-aws-lambda-environment-variables-and-serverless-application-model/)
[【アップデート】AWS Lambdaで環境変数を使えるようになりました！！！ ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/aws-lambda-env-variables/)
エンジニアと業務効率化

## エンジニアとは

## めんどくさがる
めんどくさがると言っても、
- 途中で仕事を投げ出す
- 誰かに丸投げする 
- しごとに来ない

ではなく

## 効率化をおこなう
めんどくさいことをいかにめんどくさくなくすか

## フロントエンドの業務効率化ツール
フロントエンドの業務効率化ツールといえば
** gulp **


がでてきますが、これで全てが効率化されるわけではない

## 効率化のためには
- OSやエディタ等のショートカットキーを覚える  
→いかにマウスとキーボドの移動時間をなくすか
- ディレクリ構造の見直し
- sass
- VBA
- シェルスクリプト  
等など

## 実例
サイトリニューアルでテンプレートのHTML、CSSの修正にともなう影響反映を調べて欲しいとの依頼

- HTMLが200社 × 6ファイル = 1200
- CSSが200社 × 3ファイル = 600

テンプレートとは別に個社対応も有り
これの影響範囲を調べたい。さらに定常的にやりたい

## 手作業でやるのは不可能
CSSを修正するたびにそのclassを調べ、影響の有無を定常的に調べるのは工数としてなかなか現実的ではない

## ツール化しよう
gulpだけで完結すれば理想だが、処理も複雑になり
成果物としても作りにくい

## なので色々使ってみよう
- gulpでCSSを整形して一覧化
- シェルスクリプトでcssのクラス名とプロパティをgrep
- EXCELのvbaで整形。索引作り
- バッチファイルで上記処理を一元管理

## 結果
お客さんにもお褒めの言葉を頂き、定常的に使っていただくことに
さらに技術力も向上

## めんどくさがることは良いことだ
めんどくさいと思うことをめんどくさくなくすのがエンジニアの腕の見せどころ。
なので色々と情報収集し、めんどくさいことから開放されよう
Crystalでtsortをするためのモジュールを書いた

Rubyには標準添付でtsortが存在するがcrystalにはなかったので書いてみた。
[namusyaka/crystal-tsort](https://github.com/namusyaka/crystal-tsort)

**Ruby版と比較してfull compatibleというわけではない。**

## 使い方

空配列に対する型の宣言が必要な点と`alias`がない点以外は、ほぼそのままRubyの例を使える。

### `tsort`

```ruby
require "tsort"

class Hash
  include TSort

  def tsort_each_node(&block)
    each_key do |key|
      yield key
    end
  end

  def tsort_each_child(node, &block)
    fetch(node).each do |value|
      yield value
    end
  end
end

sorted = {1=>[2, 3], 2=>[3], 3=>[] of Int32, 4=>[] of Int32}.tsort
p sorted #=> [3, 2, 1, 4]
```

### `each_strongly_connected_component`

```ruby
require "tsort"

class Hash
  include TSort

  def tsort_each_node(&block)
    each_key do |key|
      yield key
    end
  end

  def tsort_each_child(node, &block)
    fetch(node).each do |value|
      yield value
    end
  end
end

non_sort = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[] of Int32}

non_sort.each_strongly_connected_component { |nodes| p nodes } #=>
# [4]
# [2, 3]
# [1]
```

### `strongly_connected_components`

```ruby
require "tsort"

class Hash
  include TSort

  def tsort_each_node(&block)
    each_key do |key|
      yield key
    end
  end

  def tsort_each_child(node, &block)
    fetch(node).each do |value|
      yield value
    end
  end
end

non_sort = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[] of Int32}

p non_sort.strongly_connected_components
#=> [[4], [2, 3], [1]]
```

### `tsort_each`

```ruby
require "tsort"

class Hash
  include TSort

  def tsort_each_node(&block)
    each_key do |key|
      yield key
    end
  end

  def tsort_each_child(node, &block)
    fetch(node).each do |value|
      yield value
    end
  end
end

non_sort = {1=>[2, 3], 2=>[3], 3=>[] of Int32, 4=>[] of Int32}

non_sort.tsort_each do |node|
  non_sort.tsort_each_child(node) do |child|
    printf("%d -> %d\n", node, child)
  end
end

# 出力
# 2 -> 3
# 1 -> 2
# 1 -> 3
```

## 所感

書いたっきりそのままになっていたので紹介してみた次第。
(Crystalに対して)まだまだエコシステムは未熟だし、開発に付随するシステム・ライブラリも足りない状況なので、投資先としてのハードルは低いと思う。やれることは多い。
まずは自分がこのコミュニティのコア開発者になってやる、くらいの気概で飛び込んでいくと良さそう。
Office 365 Business, Enterprise の選択

企業向けのOffice 365は大きく分けてBusinessとEnterpriseに分かれます。個人向けにはOffice 365 Soloがあります。Businessは300人以下、Enterpriseは無制限で大企業でも利用可能です。

Enterprise を選択する条件
- 300人以上のユーザ

Enterprise E5 を選択する条件
- Power BIを利用
- PSTN会議を利用（通常の電話会議を使った電話会議）

# Office 365 Business

| - | Business Essantials | Business | Business Premium |
|:-:|:-:|:-:|:-:|
|User|<= 300|<= 300|<= 300|
|月額|￥650|￥1,090|￥1,630|
|月額(年契約)|￥540|￥900|￥1,360|
|Office|-|x|x|
|Office Online|-|x|x|
|OneDrive|1TB|1TB|1TB|
|Exchange|50GB|-|50GB|
|SharePoint|x|-|x|
|Teams|x|-|x|

# Office 365 Enterprise

| - |ProPlus|Enterprise E1|Enterprise E3|Enterprise E5|
|:-:|:-:|:-:|:-:|:-:|
|User|> 300|> 300|> 300|> 300|
|月額換算|1,310|870|2,180|3,810|
|契約|年間|年間|年間|年間|
|Office|x|-|x|x|
|Office Service|x|x|x|x|
|OneDrive|1TB|1TB|無制限|無制限|
|メールボックス|-|50GB|100GB|100GB|
|Exchange|-|x|x|x|
|SharePoint|-|x|x|x|
|Teams|-|x|x|x|
|Yammer|-|x|x|x|
|Stream|-|x|x|x|
|Power BI Pro|-|-|-|x|
PHPファイルをHTMLへワンライナーで変換する簡単な方法

WEBフロントをやっていると、テンプレート化するためにPHPで作り
納品段階ではHTMLに変換することってよくあると思うんですが、
先日業務でPHPファイルをHTMLに変換する必要があり、色々調べていたら

[Web学び](http://fukuyama.co/)さんが書かれていた[PHPテンプレを静的HTMLに変換するコマンド](http://fukuyama.co/ptoh)]の記事を発見いたしました。
Web学びさんがつくられた **ptoh** は引数で渡したPHPファイルをHTMLに変換するのですが、今回は該当ディレクトリ内にあるPHPファイル全てHTMLに変換したかったので
ptohを基にワンライナーで出来るものを作りました。


## 完成型
完成系は以下のようになります。以下ファイルの **$target_dir** を変換したいディレクトリに指定し、コマンドプロンプトなりターミナルなりで
ファイルを実行すればPHPファイルは全てHTMLに変換されます。変換されたPHPファイルは削除されるのでご注意ください。
削除したくなければ unlink($file);　をコメントアウトしてください。

```php

#!/usr/bin/php
<?php

$iterator = new RecursiveDirectoryIterator($target_dir);
$iterator = new RecursiveIteratorIterator($iterator);

$list = array();
foreach ($iterator as $fileinfo) {
    if (!$fileinfo->isFile()) {
        continue;
    }

    $file = $fileinfo->getPathname();
    $info = new SplFileInfo($file);
    if($info->getExtension() == 'php'){
        convertHtml($file);
        unlink($file);
    }
}


function convertHtml($target){
    $contents = '';

    ob_start();
    include($target);
    $contents = ob_get_contents();
    ob_end_clean();

    file_put_contents(
        preg_replace('/\A(.+)\.(php?|html?)\z/', '$1.html', $target),
        preg_replace('/\A\n/', '', $contents)
    );
}


```


それではブロックずつ解説していきたいと思います。

##  対象ディレクトリの再起処理
```php
$iterator = new RecursiveDirectoryIterator($target_dir);
$iterator = new RecursiveIteratorIterator($iterator);
```
対象ディレクトリを [RecursiveDirectoryIterator](http://php.net/manual/ja/class.recursivedirectoryiterator.php) と   [RecursiveIteratorIterator](http://php.net/manual/ja/recursiveiteratoriterator.construct.php) で
再起処理にてファイルを全て取得します。
恥ずかしながら今回このクラスを初めてしりました。
今までディレクトリの中のファイル一覧を取得するときって再起処理にて自身の関数を呼び出すやり方しかしらなかったもので。
これめっちゃ便利です

## ファイルであれば処理をする
```php

foreach ($iterator as $fileinfo) {
    if (!$fileinfo->isFile()) {
        continue;
    }
    ・
    ・
    ・
}
```
上記で取得したファイル一覧一つずつをみていきファイルであれば処理をするようにしています。


## 拡張子をみてPHPファイルのみ処理を行う
```php
    $file = $fileinfo->getPathname();
    $info = new SplFileInfo($file);
    if($info->getExtension() == 'php'){
        convertHtml($file);
        unlink($file);
    }
```

**RecursiveDirectoryIterator**は [FilesystemIterator](http://php.net/manual/ja/class.filesystemiterator.php)を
**FilesystemIterator**は [DirectoryIterator::getPathname](http://php.net/manual/ja/directoryiterator.getpathname.php)を継承しているので
**getPathname**でファイルのパスとファイル名を取得  

取得したファイル名から拡張子を取得するため
PHP組み込みクラス[SplFileInfo](http://php.net/manual/ja/class.splfileinfo.php)の[getExtension](http://php.net/manual/ja/splfileinfo.getextension.php)で
拡張子を判別し、PHPならptohをラッパーした関数にファイルを渡すようにしております。
またHTMLに変換したPHPファイルは不要なのでunlinkにて削除するようにしております。

SqlFileinfoも今回初めてしりました。
以前は正規表現にて拡張子を取得していたのですが、このSplFileinfoもすごい便利ですね。


## ptohを関数化
処理が煩雑になるためptohは関数化しております
引数はにて渡されたファイルをHTMLに変換するようにしております。

```php

function convertHtml($target){
    $contents = '';

    ob_start();
    include($target);
    $contents = ob_get_contents();
    ob_end_clean();

    file_put_contents(
        preg_replace('/\A(.+)\.(php?|html?)\z/', '$1.html', $target),
        preg_replace('/\A\n/', '', $contents)
    );
}

```


以上、となっております。
今回PHP組込みクラスで知らなかったものが色々あったので
勉強になりました。
RaspberryPi3のOS（Raspbian）インストールから無線LAN設定まで

# はじめに
自宅でSparkClusterを組む為、RaspberryPi3を４台購入しました。
今回はWindowsでRaspberryPi3のOS（Raspbian）インストールから無線LAN設定までを記事にしてみたいと思います。

有線の場合は下記の記事通りの設定で大丈夫です。
# RaspberryPi3にOS（Raspbian）インストールと初期設定
_Raspberry Pi 3 Model B をインストールしてSSH接続できるようにしてみる_
http://techblog.clara.jp/2016/04/raspberry-pi-3-model-b_install_and_ssh_connect/

上記記事の3-D.までキャプチャ付きで詳細に記載されていますのでその通り設定しました。
「：」が入力できるようにキーボードの設定は必ずやっておいたほうがいいです。

# RaspberryPi3に無線LAN設定と固定IPの割り当て
有線の場合は、上記記事の3-E.ネットワークの設定で固定IPが割り当てられるかと思います。

今回は無線で固定IPを割り当てるので以下のように設定しました。
## 再起動後、pi ユーザでログインし/etc/dhcpcd.confを編集
`$ sudo vi /etc/dhcpcd.conf`
## /etc/dhcpcd.confの末尾に追記
ex:以下のIPを割り当てる場合
IP:192.168.11.10/24
subnetmask : 255.255.255.0
gateway : 192.168.11.1
DNSサーバ : 192.168.11.1

```a:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.11.10/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
```

## 無線LANを設定する
自分のルータのESSIDを確認
`$ sudo iwlist wlan0 scan | grep ESSID`
接続情報を/etc/wpa_supplicant/wpa_supplicant.confに書き込む
`sudo wpa_passphrase ESSID ESSID_KEY >> /etc/wpa_supplicant/wpa_supplicant.conf`

## 再起動後、設定情報の確認
iwconfigでESSIDが正しく設定されていること
ifconfigでwlan0のinet addrが正しく設定されていること

```
$ sudo reboot
$ iwconfig
$ ifconfig
```

# おわり
次回はRaspberryPi3にSparkをインストールして実際に動かすまで
riot.jsでattribute経由でoptsに渡されるプロパティ名について

以下のようなriotのコードがあったとします。

```html
<!-- マウント先 -->
<div class="main" chain-case='chain' camelCase='camel' snake_case='snake' />

<!-- マウントするタグ -->
<script type="riot/tag">
  <my-tag>
    <h3>Hello { opts.title }</h3>
    console.log(opts);
  </my-tag>
</script>

<script src="https://cdn.jsdelivr.net/riot/2.3/riot+compiler.min.js"></script>

<script>
riot.mount('div.main', 'my-tag', {title: 'World', 'chain-title': 'chain', camelTitle : 'camel', snake_title: 'snake'})
</script>

```

htmlとして保存しブラウザ上で見てみます。
console.logの出力は以下のようになります。

<img width="214" alt="スクリーンショット 2016-11-21 0.11.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/6287/70bd4525-bb69-a577-855a-64616762c314.png">

マウントする際に`riot.mount()`の第三引数に渡されたオブジェクトのプロパティ名は、そのまま`opts`のプロトタイプチェーンとして受け取れています。

| 渡したプロパティ名 | 受け取る際のプロパティ名 |
|--------------------|--------------------------|
| chain-title        | chain-title              |
| camelTitle         | camelTitle               |
| snake_title        | snake_title              |

ところが、マウント先のattributeに指定するとプロパティ名は変換されてしまいます。

| 渡したattribute名 | 受け取る際のプロパティ名 |
|-------------------|--------------------------|
| chain-case        | chainCase                |
| camelCase         | camelcase                |
| snake_case        | snake_case               |

スネークケースはそのままですが、
チェインケースはキャメルケースに、
キャメルケースは全小文字に変換されました。

公式ドキュメントにもキャメルケースは全小文字に変換されるよと書かれていますが、その他のケースでも注意が必要です。
http://riotjs.com/guide/#nested-tags

なんだか危険な香りがしますし全部optsで渡したほうが良いんだろうか・・・とも思うのですが、
サーバからriotに変数の中身を受け渡すようなケースだとattributeに埋め込むのが手っ取り早いんですよね。
個人的にjsのプロパティ名はキャメルケースにすることが多いので、attribute名はチェインケースで指定しようかな。
composer経由でLimonadeを使ってみる

## そもそも Limonade って？

https://github.com/sofadesign/limonade

phpのマイクロWebアプリケーションフレームワークです。
すごく雑に説明すると、Pythonにおけるbottle.pyぐらいの立ち位置です。

`phpのライブラリ管理はcomposerを使おうぜ`の風潮が自分に届くより前から存在し、
なおかつ開発自体はもうされていないみたいで、READMEでも最初の使い方が

```php
<?php

require_once('lib/limonade.php');

// 略
```

と「napespace？なにそれ？」感のある、枯れきったフレームワークです。

## composer経由で？

上記のGitHubリポジトリを見るとわかるのですが、`composer.json`が存在します(それも、2012年には)
しかも、ちゃんと[Packagistにも登録されています](https://packagist.org/packages/sofadesign/limonade)。

つまり、ざっくりとですがcomposerベースのwebアプリにも使えそうです。


## やってみる

```json:./composer.json
{
    "name": "attakei/limonade-demo",
    "type": "project",
    "authors": [
        {
            "name": "attakei",
            "email": "attakei@example.com"
        }
    ],
    "require": {
      "sofadesign/limonade": "dev-master"
    }
}
```

```php:./index.php
<?php

require __DIR__.'/vendor/autoload.php';


dispatch('/', 'hello');
function hello()
{
    return 'Hello world!';
}

run();
```

```shell:2ファイル用意して
$ composer install
$ php -S 0.0.0.0:8080
```

[どこかで見た](https://github.com/slimphp/Slim)PHPコードですね。

## composer install で生成されるClassLoaderなどを眺めてみる

```php
<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    '6766b12fe77434412be24043b58480fd' => $vendorDir . '/sofadesign/limonade/lib/limonade.php',
);
```

autoload_filesを眺めてみると、こんな感じになっていました。
このファイルのおかげで、オリジナルのドキュメントにあるのとほとんど変わらないコードで
limonade with composerができるようになります。


## appendix

### index.php以外にdispatchされる関数を定義するには

```php:./index.php
<?php

require __DIR__.'/vendor/autoload.php';

// ここはどうする？

run();
```

```php:./app/index.php

dispatch('/', 'hello');
function hello()
{
    return 'Hello world!';
}

```

こんなコードに分けたい場合。

```php:./index.php
<?php

require __DIR__.'/vendor/autoload.php';

require_once './app/index.php';

run();
```

こうするしかなさそう

### dispatchする関数がnamespaceに属している場合

```php:./app/index.php

namespace App;

dispatch('/', '\App\hello');
function hello()
{
    return 'Hello world!';
}
```

dispatchに呼び出す関数を指定するときに、`namespace`込みのフルネームで指定してあげれば問題なく動きます。


dispatchに呼び出す関数を指定するときに、`namespace`込みのフルネームで指定してあげれば問題なく動きます。
mqtt_bridge を作ったよ！

簡単な設定で ROS と MQTT を連携できる mqtt_bridge パッケージを作成しました。

* http://wiki.ros.org/mqtt_bridge

### 主な機能

* ROS Message 互換の MQTT <--> ROS 連携
* MQTT における TLS 機能
* カスタム Bridge の作成機能
* json または msgpack ベースの MQTT フォーマット。カスタムフォーマットも指定可能。
* MQTT のトピックパスへの動的な prefix 設定

## 準備

MQTT Broker の mosquitto とそのクライアントをインストールします。


```
# apt-get install mosquitto mosquitto-clients
```

mqtt_bridge は ROS の Package Directory に登録されていないので、 git clone して catkin_make, rodsep install してください。

```
$ cd ~/catkin_ws/src
$ git clone https://github.com/groove-x/mqtt_bridge
$ cd ~/catkin_ws
$ catkin_make --pkg mqtt_bridge
$ rosdep install mqtt_bridge
```

## デモ

ROS トピックで配信されたメッセージを MQTT へ転送し、それを受信して、改めて ROS メッセージとして配信しなおします。

### 設定ファイルを作成

下記のような設定ファイルを作成し、

```
mqtt:
  client:
    protocol: 4      # MQTTv311
  connection:
    host: localhost
    port: 1883
    keepalive: 60
  private_path: device/001
selializer: msgpack:dumps
deselializer: msgpack:loads
bridge:
  # ping pong
  - factory: mqtt_bridge.bridge:RosToMqttBridge
    msg_type: std_msgs.msg:Bool
    topic_from: /ping
    topic_to: ping
  - factory: mqtt_bridge.bridge:MqttToRosBridge
    msg_type: std_msgs.msg:Bool
    topic_from: ping
    topic_to: /pong
  # echo back
  - factory: mqtt_bridge.bridge:RosToMqttBridge
    msg_type: std_msgs.msg:String
    topic_from: /echo
    topic_to: echo
  - factory: mqtt_bridge.bridge:MqttToRosBridge
    msg_type: std_msgs.msg:String
    topic_from: echo
    topic_to: /back
  # private path
  - factory: mqtt_bridge.bridge:RosToMqttBridge
    msg_type: std_msgs.msg:String
    topic_from: /private/echo
    topic_to: ~/echo
  - factory: mqtt_bridge.bridge:MqttToRosBridge
    msg_type: std_msgs.msg:String
    topic_from: ~/echo
    topic_to: /private/back
```

launch ファイルを記述します。

```
<launch>
  <arg name="use_tls" default="false" />
  <node name="mqtt_bridge" pkg="mqtt_bridge" type="mqtt_bridge_node.py" output="screen">
    <rosparam file="$(find mqtt_bridge)/config/demo_params.yaml" command="load" />
    <rosparam if="$(arg use_tls)" file="$(find mqtt_bridge)/config/tls_params.yaml" command="load" ns="mqtt" />
  </node>
</launch>
```


### デモノードを実行

デモノードを起動します。

``` bash
$ roslaunch mqtt_bridge demo.launch
```

### 動作確認

ROS の `/echo` トピックに "hello" を publish すると、

```
$ rostopic pub /echo std_msgs/String "data: 'hello'"
```

MQTT の `echo` トピックに "hello" が転送され、

```
$ mosquitto_sub -t 'echo'
{"data": "hello"}
```

それがさらに ROS の `/back` トピックに配信されます。

```
$ rostopic echo /back
data: hello
---
```

You can also see MQTT messages using `mosquitto_sub`

## まとめ

ROS, MQTT 間を手軽にブリッジするための mqtt_bridge パッケージを作成しました。詳しくは mqtt_bridge の README をご確認下さい。なお、ROS, MQTT 間をブリッジするにあたって `rosbridge_library` で実装されている ROS Message のシリアライザを利用したのですが、便利ですね。
初めてのAnsible（9章：Ansibleの高速化）


[「初めてのAnsible」](https://www.oreilly.co.jp/books/9784873117652/)を読み進めながらのメモ

前掲
[初めてのAnsible（1章：イントロダクション）](http://qiita.com/c0tt0n-candy/items/512049586f5a1f1279f3)
[初めてのAnsible（2章：Playbook:始めてみよう）](http://qiita.com/c0tt0n-candy/items/36b4eb2717447071ad21)
[初めてのAnsible（3章：インベントリ:サーバーの記述）](http://qiita.com/c0tt0n-candy/items/1b109c53d8709717a1bb)
[初めてのAnsible（4章：変数とファクト）](http://qiita.com/c0tt0n-candy/items/7144d49636a30433365c)
[初めてのAnsible（7章：複雑なPlaybook）](http://qiita.com/c0tt0n-candy/items/9e9ea1f745bd904e4a5e)
[初めてのAnsible（8章：ロール:プレイブックのスケールアップ）](http://qiita.com/c0tt0n-candy/items/d94131e481fa5f0e4db2)

# SSHマルチプレキシング

* 同一ホストへの複数のSSHセッションで同じTCP接続を共有
	* ホストへのSSH接続の度に行うTCP接続のネゴシエーションを一度だけに
* AnsibleはSSHプレキシングを **デフォルトで有効化** 


#### マルチプレキシング有効化時のSSHの動作

1. あるホストへの初回のSSH接続の際に、OpenSSHはマスターの接続を開始
2. OpenSSHは接続先のリモートホストに関連づけられたUnixのドメインソケット（コントロールソケット）を生成
3. ホストへの次回接続時に、OpenSSHはコントロールソケットを利用して通信

### Ansibleでのマルチプレキシングオプション

| オプション | デフォルト値 |
| --- | --- |
| ControlMaster | auto |
| ControlPath | $HOME/.ansible/cp/ansible-ssh-%h-%p-%r |
| ControlPersist | 60s |

* ControlMaster: auto で SSHプレキシングを有効化
* ControlPath: ファイルシステム上のコントロールUnixドメインソケットファイルの置き場所
	* `%h`:ターゲットホスト名, `%p`:ポート番号, `%r`:リモートログインするユーザ名
	* ControlPathが長すぎる場合、OSによってUnixドメインソケットのパス最大長が設定されていないためにマルチプレキシングが効かないことがある
* ControlPersist: マスター接続が維持される時間

# パイプライン

* タスク実行時Ansibleによって生成されたPythonスクリプトをホストにコピーするのではなく、SSHのセッションにパイプして実行
	* Ansibleによって使うセッションが2つではなく、1つになる
* デフォルトではパイプラインは無効
* 有効化の設定は`ansible.cfg`に以下のような記述をすればよい

```:ansible.cfg
[defaults]
pipelining = True
```

## ホスト側の設定

* ホストの `/etc/sudoers` ファイルで *requiretty* が有効になっていないことを確認
	* *requiretty* が有効になっていると、playbookの実行時にエラーがはかれる

設定は下記などを参考に

[rootだけtty無しのsudoを許可](http://qiita.com/ryo0301/items/4daf5a6d22f16193410f)

# ファクトのキャッシュ

* Ansibleのファクト収集を各ホストにつき一度だけに設定することで、キャッシュの有効期限内であれば以降のplaybookの実行ではキャッシュ中のファクトを見てくれる

`ansible.cfg` に以下の設定を記述すればよい

```
[defaults]
gathering = smart
fact_caching_timeout = 3600

# 以下のいずれか

# JSONファイル
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_fact_cache

# Redis
fact_caching = redis

# Memcached
fact_caching = memcached
```

* `gathering = smart`: 収集対象のファクトがキャッシュされていない場合、キャッシュの有効期限が切れている場合にのみファクトを収集する
* `fact_caching_timeout = 3600`: キャッシュのタイムアウトを3600秒(=1時間)に設定
* `fact_caching`: JSONファイル / Redis / Memcached のいずれかが利用可能
	* JSONファイル: `fact_caching_connection` でJSONファイルを書き込むディレクトリを指定
	* Redis: コントロールマシン上にPythonのRedisパッケージが必要
	* Memcached: コントロールマシン上にPythonのMemcachedパッケージが必要

# 並列処理

* Ansibleはホスト群に並列にSSH接続しタスクを実行するが、デフォルトではその並列度は **5** にとどまる

`ansible.cfg`に以下の設定を記述すればよい

```
[defaults]
forks = 10
```

* `forks`オプションで並列に接続するホスト数を指定する
一度はちゃんと確認しておきたいデータ圧縮形式

# はじめに
なるべくファイル転送の際のデータサイズを小さくしたいと思った経緯があったので，
なにげなく使ってしまっているzip, gzip, tar, 7z, rarについて簡単にまとめてみた :smiley_cat: 

# zip
- ポイント
 - 複数ファイルを1つにまとられる
 - 圧縮も同時にできる

> ZIPは複数のファイルを格納するシンプルなアーカイブフォーマットである。
> 圧縮はzipアーカイブのオプションであり、圧縮が行われる場合はファイル単位に圧縮される。
> 32ビットのCRCアルゴリズムを使用し、データの破損に備えて優れた保護機構を提供するためにアーカイブのディレクトリ構造のコピーを2つ持っている。 

引用元：[ZIP (ファイルフォーマット)
](https://ja.wikipedia.org/wiki/ZIP_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88))


# gzip 
- ポイント
 - gzipはzipとは違って，ファイルアーカイバとしての機能はない
 - 複数ファイルに対しては，tarでアーカイブしたファイルをgzip圧縮するのが一般的

> gzip（ジー・ジップ）は、データ圧縮プログラムのひとつ、およびその圧縮データのフォーマットである。
> 「GNU zip」の略でありGNUプロジェクトによって開発・メンテナンスされている。  

引用元：[gzip](https://ja.wikipedia.org/wiki/Gzip)


# tar
- ポイント
 - アーカイバ，圧縮はしない
 - gzipといった他の圧縮方法と合わせて用いられることが多い(```tar.gz```, ```tar.bz2``` の用に2重の拡張子となる) 
  
> tarはファイルのアーカイブに用いられ、多数のファイルを一つのファイルにまとめることができる。
> その際、ファイルのユーザ情報とグループ情報、パーミッション、最終更新日時、ディレクトリ構造などを同時にアーカイブすることができる。

> 元来tarが行うのはアーカイブ、**すなわち複数のファイルをまとめることのみで、圧縮の機能はない**。
> そのため、大半の場合には、アーカイブと同時に、compressやgzip、bzip2などの圧縮方法を用いて圧縮（いわゆる「ソリッド圧縮」）を行う。
引用元：[tar](https://ja.wikipedia.org/wiki/Tar)

ここで出てきたソリッド圧縮についてはこちら :arrow_down: 
> 複数のファイルをまとめて１つのアーカイブファイルを作成する際に同時にファイル圧縮することは、まとめて符号化を行えるのでデータ圧縮の効率を高めることができる。これをソリッド圧縮という。

引用元：[アーカイブ (コンピュータ)](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%BC%E3%82%AB%E3%82%A4%E3%83%96_(%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF))

# 7-Zip
- ポイント 
 - 主に**Windows**ユーザに向けたファイルアーカイバ
 - ファイルアーカイブ， 圧縮， 暗号化に対応

> * LZMAやLZMA2方式を備えた7zファイルにおける高いデータ圧縮率
> * ZIP形式とGZIP形式において、7-ZipはPKZipやWinZipより2～10%圧縮率が高い
> * 7z形式とZIP形式において、強力なAES 256暗号化に対応
> * 7z形式において自己解凍(展開)に対応
> * Windowsのシェルに統合

引用元：[7-Zip](https://sevenzip.osdn.jp/) 

# rar
- ポイント
 - 圧縮率： zip < rar > 7zip
 - mp3のようなメディアファイルではrarの方が7zipより高い圧縮率 

> ZIP に比べ高い圧縮率であり、他の圧縮形式にはあまり見られない特色としてリカバリレコードが挙げられる。

引用元：[RAR](https://ja.wikipedia.org/wiki/RAR)


# 読んでみるといい資料 (いい感じにまとまっている)
- [LH質問箱: データ圧縮にベストなファイル形式って何？](http://www.lifehacker.jp/2011/03/110302compress_file_format.html)
AWSのEC2でPiwikインストール


##AMI
Ubuntu Server 16.04 LTS (HVM), SSD Volume Type - ami-0567c164

##ログイン
```
$ ssh -i ~/.ssh/YOUR_KEY_PAIR.pem ubuntu@YOUR_INSTANCE_IP
$ sudo su -
# apt-get update
```

##インストール

### Apacheインストール
```
# apt-get install apache2 libapache2-mod-php7.0  -y
# service apache2 start
```

### MySQLインストール
```
# apt-get install mysql-server -y
# mysql_secure_installation
# service mysql status
```

### PHPインストール

```
# apt-get install -y php7.0 php7.0-cli php7.0-curl php7.0-mysql php7.0-mbstring php-xml
```

### Install piwik
```
# apt-get install unzip -y
# cd /var/www/html
# wget http://piwik.org/latest.zip
# unzip latest.zip 
```

### Setup Directory
```
# cd piwik/tmp
# mkdir templates_c cache assets tcpdf logs
```

### Change permission
```
# chown -R www-data:www-data /var/www/html/piwik
# chmod -R 0755 /var/www/html/piwik/tmp
# chmod -R 0755 /var/www/html/piwik/tmp/assets
# chmod -R 0755 /var/www/html/piwik/tmp/cache
# chmod -R 0755 /var/www/html/piwik/tmp/logs/
# chmod -R 0755 /var/www/html/piwik/tmp/tcpdf
# chmod -R 0755 /var/www/html/piwik/tmp/templates_c
```

##Piwikのセットアップ
ここまで作業が終われば、
http://{YOUR_INSTANCE_IP}/piwik/
にアクセスすると、Piwikのセットアップ画面が表示されます。
![スクリーンショット 2016-11-17 14.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/23936/01f5b5d6-3b14-d9c7-1645-ff36c26f9931.png "スクリーンショット 2016-11-17 14.23.08.png")
GitHub Pagesでホストするサイトのアクセス上限は月10万リクエストが目安

（2018年10月追記）
現在リクエスト数の制限はなくなり、より使い勝手がよくなったようです。
最新の状況は公式ドキュメントを参照ください。
https://help.github.com/articles/what-is-github-pages/

---

![github.pages.jpg](https://qiita-image-store.s3.amazonaws.com/0/11704/e48cc900-20bc-78d2-9d41-94b95ce4d7c6.jpeg)

GitHub Pages（GHP）は、GitHubに置いてるリポジトリを簡単にWeb公開できる、GitHubの超絶便利なホスティングサービスです。

>[GitHub Pages](https://pages.github.com/)

無料・超お手軽・独自ドメインも対応ということで、静的サイトはもう完全にGitHub Pagesでいいじゃんという昨今ですが、JSで完結するWebアプリとか作り出すと、「あれ、もはやアプリのホスティングもGitHub Pagesでよくね？」みたいな気分になってきました。

しかしアクセスが激増したときにどれくらい耐えられるんだっけ、というのがあまり日本語で情報がなく、productionの使用に躊躇していたのですが、公式ドキュメントにちゃんと書いてありました。

>[What is GitHub Pages? - GitHub Help](https://help.github.com/articles/what-is-github-pages/)


同じ情報探してる人もいるかもなので、「Usage limits」のところを日本語訳しておきます。
ざっくり訳なので修正などあれば指摘くださいませ。

（全然関係ないけど、とりあえず下訳でGoogle翻訳に投げたらほとんどちゃんと意味が通じる文が返ってきて驚愕。おそろしく精度が上がっている。。）

## [Usage limits](https://help.github.com/articles/what-is-github-pages/#usage-limits)（公式サイト翻訳）
GitHub Pagesサイトには、以下の使用制限が適用されます。

- GitHub Pagesソースリポジトリの[推奨制限は1GB](https://help.github.com/articles/what-is-my-disk-quota/#file-and-repository-size-limitations)です。
- 公開されているGitHub Pagesサイトは1GB以下である必要があります。
- GitHub Pagesサイトは、1か月あたり100GBまたは100,000リクエストの帯域幅制限があります。
- GitHub Pagesサイトは、1時間あたり10ビルドの制限があります。

あなたのサイトがこれらの使用制限値を超えた場合、あなたのサイトを表示することができなくなったり、他のホスティングサービスへの移動など、サーバ負荷を抑えるための方針を提案する丁寧なメールが[GitHubサポート](https://github.com/contact)から届いたりする可能性があります。

さらに、GitHub Pagesサイトは以下のような行為を控える必要があります：

- 違法行為、または当社の利用規約によって禁止されているコンテンツまたは活動
- 暴力的または脅迫的なコンテンツまたはアクティビティ
- 過度の自動バルクアクティビティ（スパムなど）
- GitHubユーザーまたはGitHubサービスを危険にさらす活動
- Get-rich-quickスキーム（※訳注：[攻略法詐欺](http://ejje.weblio.jp/content/Get-rich-quick+scheme)）
- ポルノのコンテンツ
- あなたのアイデンティティやサイトの目的を誤った内容

あなたの使用または意図された使用がこれらのカテゴリに該当するかどうかについて疑問がある場合は、GitHubサポートに連絡してください。


## 大事なところ
### 上限は10万リクエスト/月
容量の制限とかはわりとよく聞きますが、アクセス制限に関してはこれですね。

- GitHub Pagesサイトは、1か月あたり100GBまたは100,000リクエストの帯域幅制限があります。

というわけで、**「月間10万リクエスト」**がGitHub Pagesでサイト公開できるかの目安になるようです。

単純計算で10万PV/月ですが、画像やjs/cssファイルを同一リポジトリに置いて読み込んでいる場合など、その分リクエスト数が発生することになります。
なので実際には数万PV/月程度が上限でしょうか。

またあんまり大きい画像や動画で1リクエストあたりの転送量が多くなると、月100GBの制限に先にひっかかるかも。

対策として、js/cssのライブラリなどは、極力cdnでホスティングされてるものを使って、GHPの外にリクエスト投げるようにするのがよいかと。
お行儀悪いですが、カスタム部分はファイル内にインラインで記述するとリクエスト減らせそうです。

それかどうしても別ファイルにしたければ、js/cssファイルをgistに置いて[RawGit](http://rawgit.com/)でホストしてそれを読み込むようにするとか、、
１周まわって何してるのかよくわからなくなってきた。。


### 超えちゃったらどうなるの？

>あなたのサイトがこれらの使用制限値を超えた場合、あなたのサイトを表示することができなくなったり、他のホスティングサービスへの移動など、サーバ負荷を抑えるための方針を提案する丁寧なメールが[GitHubサポート](https://github.com/contact)から届いたりする可能性があります。

じゃあ10万PV超えちゃったらどうなるの？というのが気になるところですが、単純にサイトが表示されなくなったり（we may not be able to serve your site）、サポートから丁寧なメール（polite email！）が届いたりするようです。

politeってわざわざ言ってるあたり、問答無用で制裁加えたりするつもりはなくて、瞬間的にちょっとはみ出しただけとかならよしなにしてくれそうな印象を受けましたが、実際にはどうなんでしょうね。

まぁ継続的に上限超えちゃうようなら間違いなくだめっぽいので、そのときはS3なりGCSなりちゃんと他のを使いましょう、って感じですね。


## まとめ
というわけで、10万リクエストいくまでは安心してGitHub Pages（GHP）のお世話になりたいと思います。

みなさんも用法・容量を守ってたのしいGHPライフを！
IntelliJ IDEA / Gradle 環境の Java プロジェクトで Dagger 2 (Google Dagger) を使う方法メモ

Android プロジェクトで [Dagger 2](https://google.github.io/dagger/) を使う方法についてはいろいろ情報があるけど、Android じゃない Java プロジェクトの情報はあんまりなくて一筋縄ではいかなかったのでメモ。 もっといい方法があれば教えて欲しい。

# 概要

アノテーションプロセッシングの処理のために [Gradle の net.ltgt.apt プラグイン](https://github.com/tbroyer/gradle-apt-plugin) を使う。 (このプラグインを使わない方法もあると思うけど試してない。) 基本はこのプラグインのドキュメントに書いてある通りで良い。

# 確認したバージョン

* IntelliJ IDEA 2016.2.5
* Gradle 2.13
* Dagger 2.6
* Gradle net.ltgt.apt プラグイン 0.9

# 詳細

## 単純に Gradle プロジェクトで使う場合

以下のような build.gradle を書けばよい。

```groovy
plugins {
    id 'java'
    id "net.ltgt.apt" version "0.9"
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

def defaultEncoding = 'UTF-8'
tasks.withType(JavaCompile)*.options*.encoding = defaultEncoding

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.dagger:dagger:2.6'
    apt 'com.google.dagger:dagger-compiler:2.6'
    // テストの方でも Dagger を使ってるならこれも必要。
    testApt 'com.google.dagger:dagger-compiler:2.6'
}
```

## IntelliJ IDEA で動かす場合

以下のことをすればうまく動く。 (net.ltgt.apt プラグインのドキュメントに書いてある通り。)

* Gradle idea プラグインを使用する。 (idea プラグインを使わない場合は追加の設定が必要。 後述する。)
* IntelliJ IDEA 2016.1 以降を使っている場合、プロジェクトを IntelliJ IDEA にインポートする際に **「Create separate module per source set」 のチェックを外す**こと。
* 設定の 「Annotation Processors」 のページ (「Settings…」 → 「Build, Execution, Deployment」 → 「Compiler」 の中) で次のことを行う。
    * 「Enable annotation processing」 にチェックを付ける。
    * 「Obtain processors from project classpath」 を選択。
    * Gradle 単体の挙動にあわせて、生成先ディレクトリを以下のように設定する。 (これをすることで生成された。)
        * 「Store generated sources relative to」 を 「Module content root」 に。
        * 「Production sources directory」 を 「build/generated/source/apt/main」 に。
        * 「Test sources directory」 を 「build/generated/source/apt/test」 に。

### Gradle の idea プラグインを適用しない場合

idea プラグインを適用しなくても動くのだけど、その場合は以下のような変更が必要だった。

* configuration は `apt` じゃなくて `compileOnly` を使わないとダメそう。
    * コンパイル時の依存に含めないでいいものだから本来は `apt` にすべきではあるのだけど。
* アノテーションプロセッシングの出力先ディレクトリを Java のソースフォルダとして追加しよう。
    * そうしないと 「ビルドはできるのにソースコード上で Dagger により生成されたクラスが見つからない」 という状態になる。
    * 「Project Structure…」 の 「Project Setting」 → 「Modules」 にて、ソースディレクトリにアノテーションプロセッシングの出力先ディレクトリを追加。

# 関連ページ

* [IntelliJ IDEA 2016.2 Help :: Annotation Processors Support](https://www.jetbrains.com/help/idea/2016.2/annotation-processors-support.html) : IntelliJ IDEA のアノテーションプロセッシングサポートのヘルプページ。
* Stack Overflow の皆様。
    * [Java/IntelliJ not recognising the “Dagger” keyword for Dagger2 Components](http://stackoverflow.com/questions/37084702/java-intellij-not-recognising-the-dagger-keyword-for-dagger2-components)
    * [How do I configure IntelliJ/gradle to use dagger 2.0](http://stackoverflow.com/questions/29562347/how-do-i-configure-intellij-gradle-to-use-dagger-2-0/32853406)
    * [Is there any way of making IntelliJ IDEA recognizing Dagger 2 generated classes in a Java project?](http://stackoverflow.com/questions/33444356/is-there-any-way-of-making-intellij-idea-recognizing-dagger-2-generated-classes)
    * [How can I use Dagger2 in IntelliJ on java projects](http://stackoverflow.com/questions/31995523/how-can-i-use-dagger2-in-intellij-on-java-projects)