OmniAICreator/Qiita-1.07M huggingface dataset:
VyOS : zone-policyを使って自分宛てパケットを制御する（設定サンプル）

VyOS Firewall (ACL) 設定は以下２種類があります

* Interface に設定する
  * eth0 等の各インターフェースに、通過するパケットの向き（local/in/out）に応じ設定
* zone-policy を使った設定
  * インターフェースを zone に割り当て、zone間のトラフィックに対し設定

Interface に比べ zone-policy は設定行数が多くなりがちですが、

* ``eth0 (global) -> eth1 (DMZ)`` のトラフィックは許可
* ``eth0 (global) -> eth2 (internal)`` のトラフィックは禁止
* ``eth1 (DMZ) -> eth2 (internal)`` のトラフィックは許可

といった、より細かなトラフィック制御が可能となります。

今回は 「インターネットからVyOS自身へのICMPパケットを許可」 というルールを、Interface / zone-policy それぞれで試した際の設定をメモとして記録しておきます。

なお、以下 VyOS フォーラム記事を参考にしました。
[Question zone-policy for local-zone](http://forum.vyos.net/showthread.php?tid=25911)


# 設定サンプル

VyOSバージョン：1.1.7
注意点：

* Interface設定では、インターネットからVyOS宛てのみ制御しているため、VyOSからのトラフィックは全て許可されます。
* zone-policy設定では "local-zone = VyOS自身との通信" のみ制御しているため、VyOS経由のトラフィックは全て許可されます。


## 構成

* ``eth0`` : Global （インターネット）
* ``eth3`` : admin （管理ポート）
* ``eth0 <-> VyOS`` : ICMPのみ許可
* ``eth3 <-> VyOS`` : すべて許可


## Interface based firewall

![vyos-01-interface.png](https://qiita-image-store.s3.amazonaws.com/0/93467/ca04a730-6627-eb79-555a-50901fa608c1.png)

```
set firewall name internet_to_global default-action 'drop'
set firewall name internet_to_global rule 1 action 'accept'
set firewall name internet_to_global rule 1 protocol 'icmp'
set interfaces ethernet eth0 address '10.0.0.1/24'
set interfaces ethernet eth0 firewall local name 'internet_to_global'
```

## zone-policy based firewall

![vyos-02-zone.png](https://qiita-image-store.s3.amazonaws.com/0/93467/895d9df0-2469-3e7e-e22b-f677c9060e77.png)

```
set zone-policy zone global default-action 'drop'
set zone-policy zone global description "Zone eth0"
set zone-policy zone global interface 'eth0'
set zone-policy zone thisvyos default-action drop
set zone-policy zone thisvyos description "This VyOS itself"
set zone-policy zone thisvyos local-zone
set zone-policy zone admin default-action 'drop'
set zone-policy zone admin description "Zone eth3"
set zone-policy zone admin interface 'eth3'

## Allow anything to/from admin port "eth3"
set firewall name admin_to_thisvyos default-action 'accept'
set firewall name thisvyos_to_admin default-action 'accept'
set zone-policy zone thisvyos from admin firewall name 'admin_to_thisvyos'
set zone-policy zone admin from thisvyos firewall name 'thisvyos_to_admin'

## Allow ICMP from global to this vyos (local)
set firewall name global_to_thisvyos default-action 'drop'
set firewall name global_to_thisvyos rule 1 action 'accept'
set firewall name global_to_thisvyos rule 1 protocol 'icmp'
set zone-policy zone thisvyos from global firewall name 'global_to_thisvyos'

set firewall name thisvyos_to_global default-action 'drop'
set firewall name thisvyos_to_global rule 1 action 'accept'
set firewall name thisvyos_to_global rule 1 protocol 'icmp'
set zone-policy zone global from thisvyos firewall name 'thisvyos_to_global'
```
俺のRSpec死闘記_プロローグ

###想定読者

- RSpecってなんだよ。むかつくわという方
- テストはエクセルにケースを書いて、OK/NGって記入していくものだよねって方
- エビデンスとして画面キャプチャ撮るのが常識ですって方
- リリースはしたものの、常に品質に自信が無くて、障害を恐れ不眠症。飯も喉を通らない方。など

# プロローグ
RubyOnRailsを始めて使うことになる私。
ひとしきりコードも読めるようになり、見よう見まねで書けるようになった頃。
modelに新規メソッドを追加した際には、テストコードを書かねばならないという事案に遭遇。
そこから（現在進行形で）、私はヤツと死闘を繰り広げることになるのでした。

## テストって普通、画面叩いてなんぼだろ。
前職では、Junitすらまともに機能していない環境だったので、そもそもTDDってなんだよ。ディズニーかよっていうレベルでした。なんと無くテストコードの噂は聞いていたものの、自分には関係のない。縁遠い存在だったの。

## テストファースト
「テストをまず書いて、それからそのテストにパスするような基本のコードを書いて、それからコードを洗練させていく」という考え方のことをテストファーストと言うそうです。ウォーターフローにズブズブだった私には衝撃的でした。
ただ、実際にやってみるとテストがしっかりしていれば、コードのリファクタリングや機能追加の時にも、いちいち全画面叩いたりしなくていいし、何より、安心してコードが書けるなと感じた。

## そこでRSpec
こまけーことはどうでもいいので、次回からは実際にRSpecとの死闘ぶりを書いていきます。

初期設定とかは偉大な先輩方が書かれているので割愛！
```gem install rspec```みたいな感じで、他のGemFileとかと一緒っす。

というわけで次回は、基本の基本、DiscribeとExpectをお送りします。
DockerでRedmine構築 on Mac


プロジェクトで `Redmine` を使うにあたり、環境づくりからはじめることになりました。
すぐに使いたいとのことなので `docker` でやってみることに。ひとまずどんなもんか試したかったので自分のMac上でやってみる。

##前提
 - dockerがはいっている
 - docker toolboxがはいっている

##dockerサーバーの確認

`docker`サーバーが起動しているか確認する。

```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   *        virtualbox   Running   tcp://192.168.99.100:2376           v1.10.3   


```

起動していなかったら起動するor作成する。

##Redmineコンテナをいれる

[これ](https://hub.docker.com/_/redmine/)を使う。

```
docker run -d -P --name my-redmine redmine
```

##Redmineが起動したか確認する

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
55861cf0d108        redmine             "/docker-entrypoint.s"   29 minutes ago      Up 29 minutes       0.0.0.0:32768->3000/tcp   my-redmine
```

##Macからアクセスしてみる

###IPを知る
```
$ docker-machine ip
192.168.99.100
```

`192.168.99.100` の部分は環境によって異なる。

###ポートを知る
```
$ docker port my-redmine
3000/tcp -> 0.0.0.0:32768
```

`0.0.0.0:32768` の部分は環境によって異なる。

###ブラウザからアクセスする

`http://192.168.99.100:32768`

※環境によってｒｙ）

![Screen Shot 2016-03-29 at 17.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/10058/617dd52c-633d-3561-0899-eeb333d598c9.png "Screen Shot 2016-03-29 at 17.39.25.png")


初期ユーザーは `admin/admin` で入れます。
とても簡単でした。
pythonで格子点を生成する

今まで適当にやってたけど、
↓の記事を読んでやっと理解できました。

`xx, yy = np.meshgrid(np.arange(0,10,0.5), np.arange(0,10,0.5))`
`np.c_[xx.ravel(), yy.ravel()]`


参考
http://kaisk.hatenadiary.com/entry/2014/11/05/041011
http://d.hatena.ne.jp/odz/20070131/1170284561
すでに存在する動画をタイムラプスっぽく変換するffmpegのシェル



サクッと作れて中々仕上がりが良かったので共有します。

##タイムラプス動画がハヤってますね！

最近facebookなどを見ているとお料理のタイムラプス動画などがよく流れてきます。
なんかカッコいいですよね。
僕も作ってみたいです。

でも、GoProとかないので、既存の動画をなんとかできないかと思った次第です。


##タイムラプスの仕組み

タイムラプスの仕組みはクレイアニメと同じです。
コマ撮りの画像を繋げたパラパラ漫画ですね。


##ffmpegを使って実現するには

さて、ここからが本題！
タイムラプスはクレイアニメなので、
次の手順で普通の動画をタイムラプスに変換します。

1. 既存の動画から一定間隔でキャプチャを切り出す。
2. 切り出したキャプチャをまた繋げる。

以上です！簡単ですね。


##さっそくコマンド

###まずは動画の長さを調べます。
ずらずらっと出てきますが、僕が用意したテスト用の動画は10:35でした。

```bash
$ ffmpeg -i test.MOV 

ffmpeg version 2.6.8 Copyright (c) 2000-2016 the FFmpeg developers
　　　　　　〜中略〜
  Duration: 00:10:35.50, start: 0.000000, bitrate: 8675 kb/s
    Stream #0:0(eng): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuvj420p(pc, smpte170m/bt709/bt709), 640x480, 7136 kb/s, 29.97 fps, 29.97 tbr, 30k tbn, 60k tbc (default)
    Metadata:
      creation_time   : 2016-03-16 10:03:11
    Stream #0:1(eng): Audio: pcm_s16le (sowt / 0x74776F73), 48000 Hz, stereo, s16, 1536 kb/s (default)
    Metadata:
      creation_time   : 2016-03-16 10:03:11
```



###次にこの動画から、１秒おきにキャプチャを切り出します。

```bash
for i in `seq 1 635`
do
  ffmpeg -ss $i -i test.MOV -vframes 1 -f image2 ./out/test-`printf %04d $i`.jpg
done
```

ffmpegのオプションは下記のようになります。

| オプション | 概要 |
|---|---|---|
|i|入力ファイル指定|
|ss|何秒目から処理するか|
|vframes|何フレームを対象にするか|
|image2|画像として出力する|

１秒目から６３５秒目（＝１０分３５秒）まで、１秒おきにキャプチャを切り出し、
さらにゼロ埋めの連番をつけて保存しています。


###最後に画像をくっつけて動画にします。

```bash
ffmpeg -f image2 -r 15 -i ./out/test-%04d.jpg -r 15 -an -vcodec libx264 -pix_fmt yuv420p ./video-out/test-timeLapse.mp4
```

ここで使っているffmpegのオプション

| オプション | 値 | 概要 |
|---|---|---|
|f|image2|入力がjpeg画像であることを通知|
|r（１つ目）|15|入力フレームレートの指定。静止画の更新を毎秒15フレームに指定。ここの数字を変更すればタイムラプス動画のフレームレートを変更できるそうです。|
|i|./out/test-%04d.jpg|入力ファイル。この書き方で連番で画像を読み込んでくれます|
|r（２つ目）|15|出力フレームレートの指定だそうですが、謎です|
|an||オーディオ無し|
|vcodec|libx264|エンコーダはH.264。|
|pix_fmt|yuv420p|画像形式をYUV形式でYUV420に指定|


##参考

今回参考にさせていただいたサイト様
ありがとうございました。

http://blog.fumiz.me/2008/10/19/ffmpeg%E3%81%A7%E5%8B%95%E7%94%BB%E3%81%8B%E3%82%89%E7%94%BB%E5%83%8F%E3%82%92%E5%88%87%E3%82%8A%E5%87%BA%E3%81%99/
http://qiita.com/riocampos/items/2f4fe927b5cf99aff767
新人におすすめしたい3冊


## 前置き
それなりに長いことコードを書いてきました。
この業界に居ると、絶えず学習し続ける必要があることに気がつきます。
気がつかないと死亡します。
もう少し経つと、学習して得た知識に、あっという間に鮮度が落ちるものと、長いこと使え、やがては自分の核となりうるものがあることに気がつきます。

今回は私が自分の核になっていると感じる本のご紹介。
最早古典の域かもしれません。

## Joel on Software

<img width="193" alt="Screen Shot 2016-03-29 at 17.11.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/a89908b2-8443-11bd-3e89-868790f07a9a.png">


http://www.amazon.co.jp/Joel-Software-Spolsky/dp/4274066304

初期Excel VBAの設計者。StackOverFlowを作った人。
いきなりコーディングというよりはマネジメントの本なのですが、プログラマにとっても相当な気づきを得られる本です。
なんというか、すごく地に足がついた感がある本です。
高度な内容でありつつも実践的。一度トラブルプロジェクトを経験した後だと、より染みるかも。


## ライト、ついてますか―問題発見の人間学

<img width="190" alt="Screen Shot 2016-03-29 at 17.17.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/237d1c44-63b3-91b8-2b50-7114958b8e1b.png">


http://www.amazon.co.jp/%E3%83%A9%E3%82%A4%E3%83%88%E3%80%81%E3%81%A4%E3%81%84%E3%81%A6%E3%81%BE%E3%81%99%E3%81%8B%E2%80%95%E5%95%8F%E9%A1%8C%E7%99%BA%E8%A6%8B%E3%81%AE%E4%BA%BA%E9%96%93%E5%AD%A6-%E3%83%89%E3%83%8A%E3%83%AB%E3%83%89%E3%83%BBC%E3%83%BB%E3%82%B4%E3%83%BC%E3%82%B9/dp/4320023684


そもそも我々はなんのためにコードを書いているのか？
我々が解決すべきものはなにか？
根本のところを問い直すきっかけを与えてくれる本です。
私自身は即解決方法に飛びつくHOW思考的人間なのですが、この本のおかげでどうにか本当のスタート地点に立ち返ることができていると感じています。
この本によれば、本当の問題と感じたところは、既に新しい問題のとば口なのですが。


## 増補改訂版Java言語で学ぶデザインパターン入門

<img width="198" alt="Screen Shot 2016-03-29 at 17.23.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/2dbf2e51-a4d6-65c7-ab3a-02cdaf332863.png">


http://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030

最後に少しだけプログラミングぽい本。
オブジェクト指向でプログラミングしようと思えば、デザインパターン、特にGoFは避けては通れないと思います。

> GoFとは
https://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%B3%E3%82%B0%E3%83%BB%E3%82%AA%E3%83%96%E3%83%BB%E3%83%95%E3%82%A9%E3%83%BC_%28%E6%83%85%E5%A0%B1%E5%B7%A5%E5%AD%A6%29


実際に使うデザインパターンは限られるものですが、それでも一度は一通り学んでおくべきです。読めば読むほどに脳みそに刺激があります。



これらの本はきっとあなたのキャリアを長く支えてくれます。ほんとだよ。
AWSマネジメントコンソールでIAMの権限周りだけを見たい時のポリシー

## これなんだ
AWSマネジメントコンソールで、AWSのIAMのパーミッション周りだけを見たい時の権限です。(2016/03/29 現在)
見えないところでJSのエラーがポツポツ出てるが、見る分には問題ないのでエラーは無視してます。
iam:List* と iam:Get* つけろなんて心ない言葉は抜きでお願いします。

## そもそもなんでコレ必要なのか
各自が自分についてる権限は見たいけど、IAM周りの全Read権限を持たせたくない時に使われます。
厳密にはもっと権限が少なくていいのですがAWSマネジメントコンソール上でたどり着くのに必要なためにいくつか無駄な物がついてます。

## Policy
```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:ListUsers",
        "iam:ListAttachedUserPolicies",
        "iam:ListGroups",
        "iam:ListGroupsForUser",
        "iam:ListAttachedGroupPolicies",
        "iam:ListGroupPolicies",
        "iam:GetGroupPolicy",
        "iam:ListPolicies",
        "iam:GetPolicy",
        "iam:GetPolicyVersion",
        "iam:ListPolicyVersions"
      ],
      "Resource": "*"
    }
  ]
}
```

## 最後に
マネジメントコンソールのUI変わったらまた動かなくなるかもしれないから注意してください。
GlassFishのポート番号変更


自分用備忘録

以下のフォルダの「domain.xml」をテキストエディタ等で開く

```
[GlassFish格納フォルダ]\glassfish4\glassfish\domains\domain1\config
```

約291行目の8080を8081に変更

```text:domain.xml変更前
<network-listener protocol="http-listener-1" port="8080" name="http-listener-1" thread-pool="http-thread-pool" transport="tcp"></network-listener>
```

```text:domain.xml変更後
<network-listener protocol="http-listener-1" port="8081" name="http-listener-1" thread-pool="http-thread-pool" transport="tcp"></network-listener>
```

GlassFish再起動後、以下のURLでアクセスできるようになる。
http://localhost:8081/
anaconda環境にpythonのモジュールを追加する方法

今回pyaudioを入れてみたのでまとめました。
ちなみにバージョンによってはpyaudioがデフォルトで入っている場合もあるみたいです。
私の環境では入っていませんでした。

#環境


```console
$ python -V
Python 2.7.11 :: Anaconda 2.5.0 (64-bit)

```
OS: Ubuntu 15.04

#モジュールがすでに入っている確認

```console
$ conda list
```
入ってなければ追加

#通常のモジュール追加方法

```console
$ conda install <モジュール名>
```

通常はこれでいけますがcondaパッケージにない場合（pyaudioなど）は以下の方法をとります


#condaパッケージにない場合

```console
$ source activate <anacondaで作成した環境名>
$ pip install　<モジュール名>
```
anacondaで作成した環境名は以下の方法でわかります。

```cosole
$ conda info --envs
```
アスタリスクが付いているのが今の環境でデフォルトは　root　です。

##pyaudioの場合
pyaudioの場合、　pip install　をするとportaudioが入っていないと言われるので入れてあげます。

```cosole
$ sudo apt-get install portaudio19-dev
```
でその後に　pip install pyaudio　してあげればOKです。


#参考にさせていただいたサイト
StackOverflow　｜　Pyaudio installation error - 'command 'gcc' failed with exit status 1'
http://stackoverflow.com/questions/5921947/pyaudio-installation-error-command-gcc-failed-with-exit-status-1
Anaconda 環境に独自にモジュールを追加する
http://datalove.hatenadiary.jp/entry/python/anaconda/how-to-install-3rd-party-module-into-anaconda
Anacondaのcondaコマンドによる仮想環境の使い方のまとめ
http://minus9d.hatenablog.com/entry/2016/01/29/235916
ChatOpsでDockerによるビルド環境の構築して、CIが少し改善された話

# ■これをやった経緯
現在の担当プロダクトにて、CIツールとしてJenkins、開発環境にAWSによるCloudFormationを利用し、ビルドをChatOpsしてるのですが、
前任の担当者がそこまでを作成していただき、改善のサイクルが効率的に回って大変助かっているのですが、ビルドの際に開発環境のリソースを
利用して、ユニットテストを行っているため、ユニットテスト実施中は開発環境にて、画面側を実際に動かしてのテストができず、
View側の開発部分でバグを残したままリリースをしてしまうという状態が生まれてしまっていたため、これをなんとか改善できないか考え、
この方法をひらめいたので、対応してみました。

# ■実現方法の検討
## ▼ 前提条件
- 以前に、現在の開発環境をDockerfileにて、１つのコンテナで実現できている
- ChatOpsのベースとなる環境(hipchat + hubot)はできている

## ▼ 手順
1. 現在のdev、ビルド環境と同様の環境を複数コンテナで実現する。
2. 実現した環境を「docker-compose」で一括で立ち上がるよう、対応
3. 現在のビルド実行ジョブをDockerのコンテナ環境を利用して、動作するように改修。
4. ChatOpsにて、3.のJenkinsジョブをキックできるよう改修。

# ■実際にやったこと
##１つのコンテナで実現されている開発環境の複数コンテナ化
- web,db,redisなど、役割ごとにコンテナを作成するため、それぞれでDockerfileを作成して、ビルド。
- ついでに、ビルドしたイメージを現在利用しているAWSのECR環境へ登録しました。

##「docker-compose」で一括で立ち上がり、各コンテナ間でDB接続などが動作するように対応

```config:docker-compose.yml
# mysql
mysql:
#  build: ./db
  image: XXXXXXXXX.dkr.ecr.XXXXXX.amazonaws.com/XXXX:db
  mem_limit: 1073741824
  ports:
    - "3306:3306"
  environment:
    MYSQL_ROOT_PASSWORD: XXXX

# web
web:
#  build: ./web
  image: XXXX.dkr.ecr.XXXXXX.amazonaws.com/XXXX:web
  mem_limit: 134217728
  ports:
    - "80:80"
    - "443:443"
    - "10022:22"
  links:
    - redis
    - mysql
    - elasticsearch

# redis
redis:
#  build: ./redis
  image: XXXX.dkr.ecr.XXXXXX.amazonaws.com/XXXX:redis
  mem_limit: 134217728
  ports:
    - "6379:6379"

# elasticsearch
elasticsearch:
#  build: ./elasticsearch
  image: XXXX.dkr.ecr.XXXXXX.amazonaws.com/XXXX:elastic
  mem_limit: 268435456
  ports:
    - "9200:9200"
    - "9300:9300"
```

##Jenkinsにて動作しているビルド実行ジョブをDockerのコンテナ環境を利用して、動作するよう改修。
- git pull されたソース内のDB等の向け先をDockerのIPを拾って、置換する処理を実装したくらいです。もちろん、sedコマンドでね。。。ｗ

##ChatOpsにて、ジョブキックできるように改修。
- 現在キックしてるビルドの名前を変え、「/dockerbuild」のコマンドで起動するように改修したくらいです。

# ■実際の動き
![70d6370f-9c2f-848f-4fed-a53cdf8e5913.jpg](https://qiita-image-store.s3.amazonaws.com/0/14268/48df235b-cbfe-5bf2-f01b-23efb830815f.jpeg)

# ■改善点
- 同時に複数のビルドが実行された場合の検証～改善
- ビルド自体の実行時間の短縮
- JenkinsからHipChatへの通知内容をもっとわかりやすく
- HipChatでのコマンドの簡略化
文字列の長さや大きさによりUILabelの表示領域が自動調整され、かつ、TableViewCellのheightもそれに合わせて自動調整する (iOS8以上)

## AutoLayout Settings
![Screen Shot 2016-03-29 at 16.15.44.png](https://qiita-image-store.s3.amazonaws.com/0/36649/3ca7e172-733b-2236-d4be-21be61459c45.png)

## UITableViewCell
```
class DynamicHeightCell: UITableViewCell {
    @IBOutlet var label1: UILabel!
    @IBOutlet var label2: UILabel!
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        // NOTE: If an app runs on iOS9 or more, these codes are unnecessary.
        self.label1.preferredMaxLayoutWidth = CGRectGetWidth(self.label1.bounds)
        self.label2.preferredMaxLayoutWidth = CGRectGetWidth(self.label2.bounds)
    }
    
    func setup(val1: String) {
        self.setup(val1: val1, val2: val1)
    }
    func setup(val1 val1: String, val2: String) {
        self.label1.text = val1
        self.label1.numberOfLines = 0 // Or, you can set it on a storyboard.
        self.label2.text = val2
        self.label2.numberOfLines = 0 // Or, you can set it on a storyboard.
        
        self.label1.hidden = "" == self.label1.text
        self.label2.hidden = "" == self.label2.text
    }
}
```

## UITableView (or UITableViewController)
```
class TableViewHasDynamicHeightCellViewController: UITableViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 160.0
    }
    
    // MARK: - Table view data source
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 20
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("TestCell") as! DynamicHeightCell
        
        let type = indexPath.row % 5
        
        switch type {
        case 0:
            cell.setup("TEST0")
            break
        case 1:
            cell.setup(val1: "TEST1", val2: "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめも　わをん")
            break
        case 2:
            cell.setup(val1: "", val2: "TEST2")
            break
        case 3:
            cell.setup("あいうえお\nかきくけこ\nさしすせそ")
            break
        case 4:
            cell.setup(val1: "TEST4", val2: "")
            break
        default:
            cell.setup("TEST CELL is default.")
            break
        }
        
        return cell
    }
}
```

## NOTE
* If an app runs on iOS7 or more, see http://qiita.com/nari6a/items/e9b83aa4488e43b79da8
mac上で動かしているredmineのアップグレードについて


# redmine のアップグレードの実施

実際にやっていることは

1. 最新のバージョンのアプリケーションを用意する
2. その中に、アップロードファイルやDBデータをセットする
3. bundle install,DBのマイグレーション,キャッシュのクリア

という、ありきたりな内容。

こことほぼ同じですけどね。
http://redmine.jp/guide/RedmineUpgrade/

なお、gem類はこのredmine用にvendor/bundleに配置する。

## 環境

最後のmacはあまり関係ないと思う。

- ruby 2.2.3（rbenvで管理）
- redmine 3.0.3 -> 3.2.1
- SQLite3
- mac OS X (El Capitan)

アップグレード前のRedmine のディレクトリを `Before_dir`
アップグレード後のディレクトリを `After_dir` とする。

# 最新バージョンの用意

今回は、ダウンロードしてきたものを所定のフォルダで解凍する方法で実施。
 `config/configuration.yml`　と　`config/database.yml` は、アップグレード前のものと置き換える。

# アップロードファイルやDBデータをセットする

## アップロードファイルの転送

Before_dirの `/files` ディレクトリを、
After_dirの `/files` にコピーする。


設定記述の転機でもOKです。

```yaml:database.yml
# SQLite3 configuration example
production:
  adapter: sqlite3
  database: db/redmine.sqlite3
  timeout: 5000
```

## データベースのデータをセットする（SQLiteの場合）

Before_dirの `SQLite3` ファイル
After_dirにコピーする。

前の項で記載したような`database.yml`の設定であれば、
`db`ディレクトリに`redmine.sqlite3`ファイルを配置すればOK。

# bundle install,DBのマイグレーション,キャッシュのクリア

ここが一番つまづきやすい。

## まずは、このプロジェクト用にgemをインストールする。

Redmine も　Ruby on Railsのアプリケーションの一種なので、
必要な設定を実施。

After_dirに移動し、下記のようなコマンドを実施。
（Rmagickも個別インストールします）

```bash:プロジェクト内にgemをインストール
$ bundle install  --without development test rmagick --path vendor/bundle
```


## DBのマイグレーション

データベースの構造を、After_dirのバージョンに合わせます。
（私の場合、これを忘れて「ログインしようとするとエラーが出る」現象が発生しました）

まんま、productionで使うデータベースをマイグレーションしなさい。
という意味になるんですけどね。

```bash:マイグレーションの実施。
$ bundle exec rake db:migrate RAILS_ENV=production
```

## キャッシュのクリア

環境が大きく変わるので、キャッシュのクリアも忘れずに。

```bash:キャッシュのクリア
$ bundle exec rake tmp:cache:clear tmp:sessions:clear
/Users/rojiuratech/Documents/rails_apps/redmine_update/vendor/bundle/ruby/2.2.0/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: duplicated key at line 466 ignored: "inodot"
```

# 実行して確認

サーバーを立ち上げて確認(ipは適当です）

```bash:立ち上げ
$ bundle exec rails s -e production -b 192.168.1.234 -p 3001
```
CentOS7でnginxのコンフィグテスト、サービス再起動、エラーログ表示をワンライナーで

CentOS7から起動スクリプトが変更になったようで戸惑いました。

> Fedora15 から一部のサービス、CentOS7 より systemd services で管理される様になりました。 この事により今まで久し馴染んできたコマンド(service xxx start や chkconfig xxx on)では実行や停止、自動起動の設定などができないサービスがあります。(例えば dhcpd サービスなど)
これらのスクリプトは /lib/systemd/system 配下に存在し、systemd services のコマンド systemctl で制御する様になっています。
> http://kajuhome.com/service_list.shtml

systemctlというコマンドを使うようになったようです。
サービス系のconfのエラーなどもsystemctlを利用するようですね。

良く忘れるのでメモです。

nginxの場合だと以下のようにするとconfエラーを表示できます。

```bash
$ sudo systemctl restart nginx.service || sudo systemctl status nginx.service -l 
```

`nginx -t` をすると尚良しかと。

```bash
$ sudo sh -c 'nginx -t && systemctl restart nginx.service || systemctl status nginx.service -l'
```

1. root権限
2. コンフィグテスト
3. 2が通ればサービス再起動(コンフィグの読み直し)
4. 3で失敗した場合にエラーログの表示

となります。
ChromebookでCroutonのchroot環境をUSBメモリに移動した

#検証環境
- CroutonでUbuntuがインストール済みのASUS C200M
- Sandisk Ultra Fit 16GB

#必要なもの
- Croutonで任意のLinuxをインストールしたChromebook
- USBメモリ

今回はCroutonを使ってある前提で話をすすめるので、そうでない方は[こちらの記事](http://chromesoku.com/ubuntu-on-chromebook/)を参考にするといいと思います。

#1. USBメモリをext4でフォーマットしてラベルを付ける
Ext4でフォーマットしてラベルが付けられるならChromebookでなくても構いませんが、ここでは Chrome OS のターミナルからUSBメモリをフォーマット・ラベル付けします。
下記のコマンドでは、/dev/sdX を Ext4 でフォーマットし、"Crouton"とラベルをつけています。

```
$ sudo umount /dev/sdX1
$ sudo mkfs -t ext4 -L Crouton /dev/sdX1
```

※ /dev/sdX1 は環境によって sda1　だったり、sdb1 だったりします。USBメモリ・ハードディスクが１つしか接続されていない場合は、通常、/dev/sda1 で置き換えられます。

これが済んだらUSBメモリを引っこ抜いて、挿しなおしてください。`/media/removable/Crouton`にマウントされるはずです(例のとおりなら)。

#2. Chroot環境をUSBメモリに移動する
まずUSBメモリに、フォルダ`chroots`を作成します。

```
$ cd /media/removable/Crouton
$ sudo mkdir chroots
```

次にChromebookにインストールしてあるすべてのChroot環境をUSBメモリに移動します。このとき、もしUbuntuなどがまだ動いていたら、それらからログアウトして終了してください。

`$ sudo edit-chroot -m /media/removable/Crouton/chroots -a -y`

※移動にはしばらく時間がかかります。もし作業中にスリープになってしまって、処理が中断されても焦る必要はありません。実際には移動ではなく、コピーした後に削除しています。なので失敗した場合は`/media/removable/Crouton/chroots`の中身を削除して、再度上記のコマンドをやり直してください。

#3. USBメモリとシンボリックリンクで結ぶ
あとは`/media/removable/Crouton/chroots`へのシンボリックリンクを`/mnt/stateful_partition/crouton/`に作成するだけです。

```
$ cd /mnt/stateful_partition/crouton
$ sudo rm -rf chroots
$ sudo ln -s /media/removable/Crouton/chroots chroots
```

#4. 起動してみる
ここまで全て終わったらいつも通りのコマンドでUbuntuなどを起動できます！
`$ sudo startunity` ←ここはもちろんデスクトップ環境に合わせて

#既知の問題点
- スリープに入るとUSBメモリのマウントが解除されて終了してしまう… orz
iOS Safariにおいて、Basic認証下から遷移したページで301リダイレクトが機能しない

常識かもしれないが備忘録まで。
301を302にしたら普通に動作しました。

example.com(ベーシック認証)からesempio.com(ベーシック認証)にリンククリックで遷移させる。
esempio.comがアクセスを受けたらhtaccessなりhttpd.confなりで特定のページへ301リダイレクトさせる。

こういったフローだった場合、example.comのリンクで新規ウィンドウが立ち上がったあと全く反応がない状態になる。この現象はiOS7.1.2で間違いなく発生するのだが、iOS9.3になるとなぜか発生したりしなかったり・・・詳しい原因は不明。

いずれにせよ302ですべて解決。
時間あるときにゆっくり調べよう・・・。
SSH接続を簡単に

以下な感じで簡単にした。


```
vi ~/.ssh/config
Host test.com
  HostName 192.168.0.1
  Port 22
  User admin
  IdentityFile ~/.ssh/xxxxx.key
```

秘密鍵は共通なんで、HostNameのところだけ変数みたいにできて `ssh IP` 的な感じでログインできればすごく楽なんだけど。

今は追加がある度に `~/.ssh/config` に追記していくしか無いかな
Railsでrest-clientのログを出力し、デバッグを捗らせる方法

[rest-client](https://rubygems.org/gems/rest-client) がステータス 400 の際に投げるエラーメッセージは "RestClient::BadRequest: 400 Bad Request" のみで、デバッグが辛すぎます。



今回は、rest-client の生ログを出しておいて、デバッグを捗らせようという趣旨です。

これとは別に、例外処理の観点から RestClient::Exception を rescue して、適切なエラーメッセージをセットした自前のErrorクラスを raise するのもやるべきと思います。

なお、バージョンは rest-client (1.8.0) です。


## rubydoc

http://www.rubydoc.info/gems/rest-client/1.8.0/RestClient#log-class_method

> Setup the log for RestClient calls. Value should be a logger but can can be stdout, stderr, or a filename. You can also configure logging by the environment variable RESTCLIENT_LOG.

RestClient.log の引数として指定できるものは以下の4種類とのこと。 

 * logger
 * stdout
 * stderr
 * filename


## Railsのlogに出力する

Stackoverflow で見つけた事例です。 

```rb
# config/initializers/rest-client.rb

# RestClient logs using << which isn't supported by the Rails logger,
# so wrap it up with a little proxy object.
RestClient.log =
  Object.new.tap do |proxy|
    def proxy.<<(message)
      Rails.logger.info message
    end
  end
```

引用: [Logging RestClient in a Rails app](http://stackoverflow.com/questions/10068496/logging-restclient-in-a-rails-app)


## Railsのログとは別のファイルに出力する

なんでもかんでも production.log に出力したくはなかったので、今回は restclient.log に出力することにしました。


```rb
# config/initializers/rest-client.rb

logfile = Rails.root.join('log', 'restclient.log')
RestClient.log = Logger.new(logfile)
```
30歳エンジニアが語る、中小ソフトウェア会社事情

#この春エンジニアになる皆さん
おめでとうございます。
この記事は、主に中小のソフトウェア会社に勤める予定の人を対象にした記事です。

#30歳エンジニア（当方）経歴
1. 理系大卒
2. 中小のソフトウェア会社[A]入社（5年）
3. 中小のソフトウェア会社[B]入社（2年）
4. ベンチャー会社入社[C]（今）

#まずこれだけ言いたい
* **辛かったら、身体壊しそうならすぐ辞めろ!!**
* **１つの会社に３年いろとかあれは罠だ!!**
* **中小ほど搾取の幅がひどい!!**

今回はあなたの会社がブラック会社か簡単にわかるリストを用意しました。

#ブラック会社判定10項目リスト
1. 残業代制度が無く、エンジニアの稼働が恐ろしく高い
2. 仕事の取引先が２次受け以降である
3. 会社のトピックス情報が滞っている
4. 会社のサイトが今の時代と逆行している・フリー素材らしき物を使用している
5. 会社からの教育制度の内容が適当、または外部セミナーに丸投げ
6. エンジニアを積極的に派遣させる業務がある
7. 自社サービス・製品が無い
8. 自社ブログが無い、あっても内容が技術以外のどうでもいい記事が多い
9. 使用技術・言語に関する情報が時代と逆行している
10. 会社訪問時にMacがほとんど無い、古臭いマシンばかりが乱立している

```
全部当てはまる：
間違いなくブラック会社です。次の転職先を探しましょう。

6〜9個当てはまる：
ブラック会社の危険性が高いです。次の転職先を探しましょう。

3〜5個当てはまる:
ブラック会社の危険性がやや高いです。技術力を身につけてどうするか考えましょう。

1〜2個当てはまる:
ブラック会社の危険性が多少あります。人脈と技術力を身につけましょう。

全部当てはまらない:
優良な会社です。幅広い人脈と技術力を身につけましょう。
```

#ブラック会社判定リスト深掘

**給与面（上記1〜2項目）**

```
ブラック会社ほど査定を他社より落としてきます。
かつ流動的になると管理が面倒なのでなるべく簡素にする傾向があります。
エンジニアの管理もできない会社があなたをサポートしてくれるでしょうか？
（システムでちゃんと管理しているところは別ですよ？）
この項目は入社前だとわかりづらいかもしれません。
担当者に直接聞くなりしましょう。（嘘だったとしてもアドバンテージは得られます）
```

**自社体制面（上記3〜7項目)**

```
ブラック会社ほど体制が整っていません。
中小ソフトウェア会社のメリットの一環としては
教育制度、技術のコミュニケーションの距離感が近いくらいかなと思っていますが
これすら存在しないと所属している意味がありません
受託が無い、自社サービスが無いのは
エンジニアを派遣丸投げのマージンで利益を得ているのはほぼ確定です。
あなたを50万円で大企業に売って、あなたの少ない給与との差額で利益を得ます。
これが成果主義ならともかく年功序列だと最悪です。
```

**技術面(上記8〜10項目)**

```
エンジニアを目指す上で最も大切な項目。
自社の技術が酷ければ、外で買い手がつきません。
また技術を大切にしている会社ほど、
エンジニアの武器であるマシンにお金をかけています。
```

#会社に入ってすべきこと
**嘘！私の会社ブラックかも...!**
と悲観することはありません。

まずは**役割（ポジション）を決めておきましょう。**
自分はどんなエンジニアになりたいか、どんな分野でやりたいか。
そこはエンジニアでもスポーツ選手でも同じです。
一口にエンジニアと言ってもインフラ系、アプリ系、Web系他と色々あります。

役割を決めたらその分野に積極的にコミットしていきましょう。
勉強会に参加するも、その分野が得意な人に話を聞くのも良いです。
**勉強会参加向けのサービスもあります。（下記）**
https://connpass.com/

会社によっては役割が決められ、自分のしたいことと乖離が生じるかもしれません。
はっきりとやりたくないことはNOと言える意識を持っておきましょう。

#役割（ポジション）決め
これは、プログラムの難易度だったり
技術者の人数分布の統計だったり
時代のトレンドを加味して決めた方がお得です。

最終的にはやりたいかやりたく無いか
自分に合っているか合っていないかだと思いますけどね。

さわりの勉強法でオススメなのが**ドットインストール（下記）**
http://dotinstall.com/lessons

#技術力を身につけたら
ブラック会社に所属する意味は無いです。
今の世の中、技術力があればエンジニアは引く手数多な世の中なので、
技術力があれば何とかなります。
**当初に比べて、仕事もネットから探せる時代になってきました。**

#最後に
社会人になっても勉強、勉強です。
IT業界は事情がコロコロ変わるので、他の分野と比べてその比重が高いです。
どんな会社に行っても、学べる環境はまず確立させましょう。
技術の自信が持てたら世界が広がります。

30歳エンジニアからの新人プログラマへのアドバイスでした。
proxy環境下でimageminインストールに失敗する場合

.npmrcに下記の設定を記述して

```
proxy=http://YOURPROXY.com:8080
https-proxy=http://YOURPROXY.com:8080
```

imageminをインストールする（しなおす）。

```
npm i -g imagemin-cli
npm i -D gulp-imagemin
```
Phalcon\Session\Adapter\RedisでSegmentation Faultが発生する


## 問題
アプリケーションのセッション管理にPhalcon\Session\Adapter\Redisを使用した際にSegmentation Faultが発生する。

## 原因
セッション情報が作成されていない段階でsession_start()した際に
session_set_save_handler()で登録されたwrite()が空文字を保存しようとしている。

## 対処法
dataの存在チェックを追加してcompielし直す。

``` redis.zep
(省略)
	/**
	 * {@inheritdoc}
	 */
	public function write(string sessionId, string data)
	{
		// dataが空の場合は書き込まない
		if empty data {
			return;
		}

		this->_redis->save(sessionId, data, this->_lifetime);
	}
```

非compileの場合(yum等でインストールした場合)はサブクラスを作成してoverrideする。

```Redis.php
<?php

namespace MyApp\Session\Adapter;

class Redis extends \Phalcon\Session\Adapter\Redis
{
	/**
	 * {@inheritdoc}
	 */
	public function write($sessionId, $data)
	{
		// dataが空の場合は書き込まない
		if (empty($data)) {
			return;
		}

		$this->_redis->save($sessionId, $data, $this->_lifetime);
	}
}
```

応急処置な感が強いですが、一先ずこれで

## 環境
* PHP 5.6.18
* Phalcon 2.0.10
[非公式] Windows10を使わずにWindows 10 IoT Core for Raspberry Pi2をインストール


公式なやり方だとWindows 10端末上での作業が必須となっているため、
Windows 7でもイメージSDカードが作れるようにする手順を調査した。

公式手順ではないため、完全自己責任でお願いします。

# システム要件

- Windows 7 or later
- Python 2.7 or later
- isoファイルを解凍可能なツール (7zなど)
- DD for Windows または Linux/Mac OSX (ddが使えればOK)

# イメージ作成手順

## ISOファイルダウンロード

MicrosoftのサイトからRaspberry Pi2用のWindows 10 IoT Coreをダウンロードする。

## ISOファイルからmsiを抽出

7zなどを利用してISOファイル内にあるWindows_10_IoT_Core_RPi2.msiを抽出する。

## msiファイルを解凍

以下のコマンドでmsiファイルを指定したディレクトリに解凍する。  
数分かかるのでコーヒーでも淹れながら待つ。

```bat
SET MSI_FILE=\path\to\Windows_10_IoT_Core_RPi2.msi
SET EXTRACT_DIR=\path\to\extractdir
START /wait msiexec /a "%MSI_FILE%" targetdir="%EXTRACT_DIR%" /qn
```

## ffu2img.pyでイメージファイル変換

解凍したディレクトリ内にあるflash.ffuファイルからイメージファイルを生成する。  
Githubにある[ffu2img.py](https://raw.githubusercontent.com/t0x0/random/master/ffu2img.py)をローカルにダウンロードし、以下のコマンドを実行する。  
こちらも数分かかるので先ほど淹れたコーヒーを飲みながら待つ。

```bat
python ffu2img.py "%EXTRACT_DIR%\Microsoft IoT\FFU\RaspberryPi2\flash.ffu"
```

処理が成功するとflash.ffuと同じディレクトリにflash.img(約7GB)が生成されている。

## 生成されたイメージをSDカードに焼く

DD for Windowsで生成されたflash.imgをSDカードに焼く。 
Linuxのddコマンドで実施する場合は以下のコマンドを実行する。

```bash
dd bs=1m if=/path/to/flash.img of=/dev/sdx
```

/dev/sdxは環境に応じて読み替えて下さい。コマンド実行前にアンマウントするのを忘れずに。

これは非常に時間がかかる(MacBook Proで80分ほど)ので、寝て待つ。  
コーヒーのんだから寝られない！！

以上で完成。作成したSDカードをラズパイに挿すとWindows 10 IoT Coreが起動します。
xorの優先順位

#ハマり概要

xor演算子の挙動がおかしい。`true xor true` が`true`になる。


#ハマり時のコード

[ideone](http://ideone.com/aoiout)

```php:php
<?php
 
$P = true;
$Q = true;
 
$cond = $P xor $Q;
 
echo 'P is '.stringify($P)."\n";
echo 'Q is '.stringify($Q)."\n";
echo 'P xor Q is '.stringify($cond)."\n";
 
 
function stringify($bool)
{
	if ($bool) {
		return 'true';
	}
 
	return 'false';
}
```

```php:stdout

P is true
Q is true
P xor Q is true # おかしい

```

#XOR（排他的論理和）

|   | T | F |
|---|---|---|
| **T** | F | T |
| **F** | T | F |

T xor T => F になるはずが
上記のコードでは
T xor T => T になってる

#勘違いポイント

`xor`は`=`よりも優先順位が低い。

[PHP: 演算子の優先順位 - Manual](http://php.net/manual/ja/language.operators.precedence.php)

![スクリーンショット 2016-03-29 14.08.11.png](https://qiita-image-store.s3.amazonaws.com/0/1642/24c29c98-eeb6-4ada-600f-986563fb8b81.png)

##つまり

この式は

```php
$cond = $P xor $Q;
```

これと等価

```php
($cond = $P) xor $Q;
```

`$cond`に`$P`(`true`)が代入され、
その返値`true`と`$Q`の`xor`が評価され(`false`)、
その評価値は虚空へと捨てられている。

#修正
なので、コードを以下のように修正する。

[ideone](http://ideone.com/XoM5om)

```php:php
<?php
 
$P = true;
$Q = true;
 
$cond = ($P xor $Q); # 修正
 
echo 'P is '.stringify($P)."\n";
echo 'Q is '.stringify($Q)."\n";
echo 'P xor Q is '.stringify($cond)."\n";
 
 
function stringify($bool)
{
	if ($bool) {
		return 'true';
	}
 
	return 'false';
}
```

```php:stdout
P is true
Q is true
P xor Q is false
```

おｋ
覚えた使えるGitトリック _Rebase

2016年 初春。
アルコール漬けのチンピラからプログラマに転身した私が覚えたトリックを備忘録兼ねてまとめるTips_ git編

---

- git rebase

３回失敗してようやく使えるようになったrebase。
ネットではよく、<歴史を書き換える>とか書いてあるけど、大丈夫。怖くない。
以下　俺の理解していることと使い方。

## こんな時に使うイメージ
1. 今、僕は、masterブランチから切り出したchildブランチ作業をしています。
2. 三日経ちました。
3. その間、masterでは時代が進んでいて、そこで開発されているロジックをchildブランチでも使いたいです。
4. つまり、**1の時代のmasterじゃなくて、今のmasterの子供になりたい。私は。** もちろんこの3日間の作業もそこに混ぜたい。
5. そこでrebase。
6. rebaseを唱えると、コミットログが下記のような感じになります。

 master(childブランチ作った時のコミット) >>> master(3日分のコミット) >>> child(最初のコミット) >>>childe(最先端のコミット)←今ここ

7.これであたかも、現在のmasterから切り出されたchildブランチが最先端のコミットになるの。嬉しい。

## 使いかた
基本的な使い方は至って簡単。

```:child_branchに移動して
git rebase master
```

##なんかconflictして失敗するんだけど。

上の例だと、３日も経っているうちに、masterにはいろんなファイルがコミットされていて、その中ではそりゃ同じファイルを更新したりもしている可能性が大いにあります。
すると、こんなエラーが出ちゃう。

```:child_branch
git rebase master                                                                                                                             

First, rewinding head to replay your work on top of it...
Applying: 画面作成
Applying: 画面項目追加
Using index info to reconstruct a base tree...
A	models/hoge/hoge.rb
Falling back to patching base and 3-way merge...
CONFLICT (modify/delete): models/hoge/hoge.rb
error: Failed to merge in the changes.
Patch failed at 0003 画面項目追加
The copy of the patch that failed is found in: .git/rebase-apply/patch

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
```

でも大丈夫。
下３行の英文に書いてある通り、conflictを解消して、```git rebase --continue``` すればよろしい。

ここでは```models/hote/hoge.rb```が競合してるっぽいので、エディタで競合を解決します。
その後は　**必ず**```git add```した後で、 ```git rebase --continue```を行えばOK
無事に親御さんが代わってくれます。
**addするのを忘れてハマりました。**

##最後に
rebaseを行って、自分のコミットをpushするときは、-fメソッドをつけないとErrorになっちゃいます。
リモートとローカルの時間軸がずれているからです。

つまり、```git rebase ``` を行うときは

```:child_branch

git rebase maseter 

//conflictが起こる場合はconflictを解消した後に

git add . #addして
git push -f origin child //push　 -f しましょう
```

**コミットログを変えたものを強制的にリモートにpushするので、チームや複数人で開発している時はメンバーに一言お伺いをたてるとトラブルにならない気がするっていう話。**
Viewsで生成されるSQLにロジックでLEFT JOINしてみる

Viewsは便利ですが、ロジックでごにょごにょできると、
より一層便利で

hook_views_query_alter を使います。
views_join については[こちら](https://api.drupal.org/api/views/includes!handlers.inc/class/views_join/7)を参照。
add_relationshipについては[こちら](https://api.drupal.org/api/views/plugins!views_plugin_query_default.inc/function/views_plugin_query_default%3A%3Aadd_relationship/7.x-3.x)を参照。

```php
/**
 * Implementation of hook_views_query_alter().
 */
function MYMODULE_views_query_alter(&$view, &$query) {

	// do something.

	$join = new views_join();
	$join->table = 'field_data_field_hoge';
	$join->field = 'entity_id';
	$join->left_table = 'node';
	$join->left_field = 'nid';
	$join->type = 'left';

	$query->add_relationship('field_hoge', $join, 'node');

	// 以下はおまけ
	$query->where[1]['conditions'][] = array(
	    'field' => 'field_hoge.bundle',
	    'value' => array('content_type_A', 'content_type_B'),
	    'operator' => 'IN'
	);
}
```
すると、以下のSQLになる。

```sql
SELECT
  -- 省略
FROM
  node node 
  LEFT JOIN field_data_field_hoge field_hoge 
    ON node.nid = field_hoge.entity_id
WHERE
  field_hoge.bundle IN ('contents_type_A', 'contents_type_B')
```

ちなみに、画面からの検索キーワードでライクしてみる。

```php
$word = '%' . filter_xss($view->exposed_input['search_word']) . '%';

$or_condition = db_or();
$or_condition->condition('node.title', $word, 'ILIKE'); // ILIKE はPostgreSQLの方言
$query->add_where(1, $or_condition);
```

すると

```sql
SELECT
  -- 省略
FROM
  node node 
  LEFT JOIN field_data_field_hoge field_hoge
    ON node.nid = field_hoge.entity_id
WHERE
  field_hoge.bundle IN ('content_type_A', 'content_type_B')
  AND node.title ILIKE '%neko%'
```

無事にライクできる。

#備考
$view->exposed_input の値ってサニタイズされるんじゃなかったでしたっけ？
自前でViewsの検索条件として画面項目を追加した際の設定漏れなのかな。。
わざわざ filter_xss や check_plain はしなくてよかったハズ。
（´-`）.｡oO（あとで調べる）
Velocityで与えた文字列を1文字ずつ分割して逆順に表示する

HTMLの内容をwkhtmltopdfでPDF化するときに、グラフの縦軸ラベルのような縦書き表示のCSSが適用されなかった。
Java側でやるのも面倒だったので、Velocity側で無理やり逆順にしてCSSで回転させるようにした。
その時にVelocityのマクロを作ったのでメモ。（今後使うことあるのかな・・）

```velocity:Macro.vm
#macro( StrReverseConv $str )
  #if( $str ) ## nullだった場合は何も表示しない
    #set( $len = $str.length() - 1 ) ## 文字列のサイズ
    #set( $spStr = $str.split(""))   ## 文字列を配列にする（ループ用）
    #foreach ( $s in $spStr )
      #if( $str.charAt( $len ) == " " ) ## スペースはそのまま表示すると消えてしまうので変換する
        <div>&nbsp;</div>
      #else
        <div>$str.charAt( $len )</div>
      #end
      #set ( $len = $len - 1 )
    #end
  #end
#end
```

マクロを使いたいvmファイルの最初に「#parse( "Macro.vm" )」と定義して以下のように使うと以下のように出力される。

```velocity:
#StrReverseConv( "ABCDE" )
```

↓

```html:
<div>E</div>
<div>D</div>
<div>C</div>
<div>B</div>
<div>A</div>
```

エスケープ処理をしていないので文字列に「<」とか「>」が来ると正常に表示できない。エスケープ文字が入る可能性があるときはエスケープ文字の変換を忘れずに！

あとはCSSで「transform: rotate(-90deg)」とか「line-height」で行間を調整すれば似非縦軸ラベルの出来上がり。
Firofox、Chrome、IEで試したけどどれも同じ表示になってて満足。
ブラウザによって縦書きモードの「text-orientation」が効かなかったりPDF化したときに表示が崩れたりするので、こんな感じになった。
どのブラウザでも統一して表示できる縦書きモードがあったらいいのになぁ。

※というかすごいね。QiitaはVelocityのシンタックスもあるのね。驚き。
Gem（あるいはRails）のバージョン比較方法


不幸にもGemのバージョンを比較して処理を分岐させなければならないことってありますよね？
Railsでバージョン取得をするなら、みなさんおそらく以下のどれかで取得していることと思います。

```ruby:Rails4.2.6でやってみた場合
Rails.version #=> "4.2.6"

# https://github.com/rails/rails/blob/master/version.rb
Rails::VERSION::MAJOR #=> 4
Rails::VERSION::MINOR #=> 2
Rails::VERSION::TINY  #=> 6
Rails::VERSION::PRE   #=> nil （"beta2"とかがあるなら入る）
Rails::VERSION::STRING #=> "4.2.6"
```

メジャーバージョンの比較でいいなら `Rails::VERSION::MAJOR >= 4` でいいですし、
マイナーバージョンまでなら `Rails.version.to_f >= 4.1` てな書き方で十分です。

ただ、厳密にやる場合、ないしパッチバージョンまで見る場合はどうすればいいのかな？ と思っていたら以下のようにすれば良いようです。

```ruby
Gem::Version.new(Rails.version) >= Gem::Version.new("4.1.2")
```

また、Railsなら`Rails.gem_version`でこの`Gem::Version`のオブジェクトを返してくれるので、以下の書き方ができます。

```ruby
Rails.gem_version >= Gem::Version.new("4.1.2")
```

あまりやってるの見かけないですが、厳密にバージョン比較したい方・しなければいけない方はやってみてはいかがでしょうか？
WebStormでプロジェクトを開くのなら、Dockアイコンにドラッグ＆ドロップしよう（Mac）



初めてWebStormを起動するとき、フォルダーを開くのに苦労しました。フォルダを開くダイアログが独自UIのためあまり慣れず、タイトルの方法を知らない時はWebStormを起動するのをためらいました（とはいえ、IDEとしては使いやすく悶々としながら起動していました）。

↓プロジェクトを探せなくて起動するのが辛くなる・・・。
![qiita_160329_webstorm.png](https://qiita-image-store.s3.amazonaws.com/0/1423/3cb4f067-7813-d88b-071e-b024f5d10fca.png "qiita_160329_webstorm.png")


そこで、プロジェクトフォルダを開くのにオススメなのが、Dockアイコンにフォルダーをドロップして起動する方法です。下記の画像の場所にフォルダーをドラッグ＆ドロップすると、そのフォルダ内がプロジェクトとして開かれます。

![qiita_160329_doc.png](https://qiita-image-store.s3.amazonaws.com/0/1423/562fbadc-753b-96b7-c16b-4b4eb13e6cc8.png "qiita_160329_doc.png")
node.jsのCLIのテストをavaで書いてみる

標準出力に'hello'の出力を期待する簡単なテストを書いてみます。
まずは、'hello'を出力するだけですが、cli.jsのプログラムです。

```cli.js
#!/usr/bin/env node
'use strict';
console.log('hello');
```

実行権限を付加します。

```
$ chmod +x cli.js
```

avaを使って、CLI環境のテストをしてみます。avaとは並列実行可能なes6で書けるテストランナーです。内部で`power-assert`が使われてるので、テストの結果がわかりやすいです。

[sindresorhus/ava: Futuristic test runner](https://github.com/sindresorhus/ava)

```
$ npm init
$ npm i -D ava pify
```

npm scriptsのtestにavaを指定します。

```package.json
{
  "scripts": {
    "test": "ava"
  },
  "devDependencies": {
    "ava": "^0.13.0",
    "pify": "^2.3.0"
  }
}
```

テストを書いてみます。
execFileをpifyを使ってPromise化して、`cli.js`の結果をawaitで受けます。avaではasync/awaitがデフォルトで使えるので使わない手はないでしょう。

```test.js
import test from 'ava';
import pify from 'pify';
import {execFile} from 'child_process';

test('echo hello', async t => {
	const stdout = await pify(execFile)('./cli.js');
	t.is(stdout, 'hello\n');
});
```

実行

```
$ npm t

> @ test /Users/akameco/sandbox/stdout-test
> ava


   1 passed
```

通りました。

次に、新しいテストを追加して、1度テストを落としてみます。`world`を引数にとって、`hello world`と表示することを期待します。

```test.js
import test from 'ava';
import pify from 'pify';
import {execFile} from 'child_process';

test('echo hello', async t => {
	const stdout = await pify(execFile)('./cli.js');
	t.is(stdout, 'hello\n');
});

test('echo hello world', async t => {
	const stdout = await pify(execFile)('./cli.js', ['world']);
	t.is(stdout, 'hello world\n');
});
```

テストを実行してみます。

```
$ npm t

> @ test /Users/akameco/sandbox/stdout-test
> ava


   1 passed
   1 failed

  1. args

  t.is(stdout, 'hello world\n')
       |
       "hello\n"

      _callee2$ (test.js:12:4)

npm ERR! Test failed.  See above for more details.
```

power-assertによって、今の状態がわかりやすく表示されます。
では、コマンドライン引数を受け取ってそれを表示するようにcli.jsを変更してみます。


```cli.js
#!/usr/bin/env node
'use strict';
const args = process.argv.slice(2);
console.log('hello', ...args);
```

テストを実行します。

```
❯ npm t

> @ test /Users/akameco/sandbox/stdout-test
> ava


   2 passed
```

よさそうです。

## まとめ
avaを使うことでシンプルにテストを書くことができるのがわかると思います。
日本語のドキュメントもあるので、参照してみるといいかもしれません。
[ava-docs/readme.md at master · sindresorhus/ava-docs](https://github.com/sindresorhus/ava-docs/blob/master/ja_JP/readme.md)

## 参考
[sindresorhus/ava: Futuristic test runner](https://github.com/sindresorhus/ava)
[power-assert-js/power-assert: Power Assert in JavaScript. Provides descriptive assertion messages through standard assert interface. No API is the best API.](https://github.com/power-assert-js/power-assert)
[ava-docs/readme.md at master · sindresorhus/ava-docs](https://github.com/sindresorhus/ava-docs/blob/master/ja_JP/readme.md)
phpdotenvを使う

設定ファイルの運用がその都度バラバラなので、.envに統合できればと思っております。
利用については、基本的には[本家にGithub](https://github.com/vlucas/phpdotenv)の通りにすればよい。

##前提

phpやらcomposerやらは使える前提。

##インストール

composerで入れます。
例えば、testというディレクトリを作って、そこで、下記コマンドを実行。

```bash
composer require vlucas/phpdotenv
```

別にcomposer.jsonに記述してinstall/updateでもいいです。

##使う

特に難しいことは何もない。
ここでは、testフォルダに下記phpファイルを作り、同じディレクトリに.envファイルを作成することを想定。

```php
<?php
	
	//require
	require './vendor/autoload.php';

	//初期化

	//.envの保存場所指定（カレントに設定）
	$dotenv = new Dotenv\Dotenv(__DIR__);
	
	$dotenv->load();

	//利用
	//値を取得
	$name = getenv('NAME');
	echo $name;
```

.envは下記の通り。

```txt
NAME=hoge
```

phpを実行して、hogeと表示されればOK。

##その他

###gitで使う

gitを使う場合は各環境に.envを用意し、開発環境においては.gitignoreに、

```txt
.env
```
と書いておくというのが基本。

###注意点

環境変数となるので、既存の環境変数と被らないようにする。
なんとなくわかる JSONRPC 2.0

# 基本的な動き

-  リクエスト

下記のような形式で実行します。実行するときは必ずPOSTになるみたいです。

```js:要求
{
  "jsonrpc": "2.0",      // 固定で設定する
  "method": "login",     // 実行するメソッド名を記載
  "params":              // Postパラメータを設定
    {
      "user_id": "wanwan" 
      "password": "nyannyan"  
    },
  "id": 3                // 実行に対する番号
}

```

-  レスポンス

下記みたいな感じになります。つまり、ID:3でAPIを実行したら、それはID:3で帰ってくるというようなもののようです。

```js:応答
{
  "jsonrpc": "2.0",  // 固定
  "result": {        // レスポンス
    "name" : "犬のおまわりさん",
	"message" : "困ってしまってニャンニャンニャニャン"
  },
  "id": 3            // 実行に対する番号
}
```

エラーのときは下記のような感じになります。

```js:エラー応答
{
  "jsonrpc": "2.0",                   // 固定
  "error": {                          // エラーのレスポンス
      "code": -32601,                 // エラーコード
      "message": "Method not found"   // メッセージ
  }, 
  "id": "3"                           // 実行に対する番号
}
```

# エラーコード

HTTPステータスは200となるようです。

|コード|メッセージ|内容|
|:---|:---|:---|
|-32700|Parse error|Jsonの解析エラー|
|-32600|Invalid Request|送られた内容がJSONRPC形式ではない|
|-32601|Method not found|メソッドがない、メソッド名が間違ってる|
|-32602|Invalid params|パラメーターが間違ってる|
|-32603|Internal error|何か例外が発生した|

# 特別な機能
## Batch

Batchというのは、下記のような形でまとめてAPIを実行してまとめて、レスポンスを返してもらうことができる機能です。  
まとめて実行してもIDがあるから、判別可能です。

- リクエスト

```js:バッチ要求
[
    {
        "jsonrpc": "2.0", 
        "method": "hello", 
        "params": {
            "user_id" : "wanwan",
            "word" : "こんにちわ"
        },
        "id": "1"
    }, 
    {
        "jsonrpc": "2.0", 
        "method": "bye", 
        "params": [
            "user_id" : "booboo",
            "word" : "バイバイ"
        ],
        "id": "2"
    }
]
```

- レスポンス

```js:バッチ応答
[
    {
        "jsonrpc": "2.0", 
        "result": {
           "user_id" : "dondon",
           "message" : "わんわんわん"
        },
        "id": "1"
    }, 
    {
        "jsonrpc": "2.0", 
        "result": {
           "user_id" : "googoo",
           "message" : "ブーブー"
         },
        "id": "2"
    }
]
```

## Notification

パラメータにidを設定しない場合、Notificationになります。
Notificationで実行すると、レスポンスを返さないようになります。  
こんなもの何に使うのかと思ったのですが、updateとかだと要らないのかもしれないです。
エラーのときは帰ってきます。

- リクエスト

```js:通知要求
{
  "jsonrpc": "2.0",
  "method": " update",
  "params":
    {
      "user_id": "wanwan" ,
      "mail": "nyannyan@gmail.com"  
    }
}

```

- レスポンス（エラーの時）

```js:通知応答
{
    "jsonrpc": "2.0",
    "error": {
        "code": -32603, 
        "message": "Internal error"
    }, 
    "id": null
}
```

# 参考

- [JSONRPC 2.0](http://www.jsonrpc.org/specification)
- [WEB Apiの話 (JSONRPC)](http://qiita.com/xuj/items/2181d2e456c2f3482d59)
- [JSONRPC - Batch／Notificationについて](http://qiita.com/radioboo/items/4842a126e3976d6f367c)
電子工作 > Link > Star Trek communicator > 未完成

Making a Star Trek communicator with Feather FONA @adafruit #deskofladyada @youtube @startrek

https://www.youtube.com/watch?v=LKnZ1h_Mtwk

「つっ、つられるものか（実はスタートレックファン)」

動画を見たけど、完成はしていないようだ。

ESP8266でも作れそうだが、技術的に得るものはあるのかどうか不明なので手を出さないでおこう。
ElixirでThriftで定義した構造体にアクセスする

## 1. ElixirからもThriftをさわりたい

Elixirから、thriftを利用してデータのやり取りしたいなー、と見ていましたが、erlangだとあるけど、elixirだと現在は利用できないようです。
サポートされるのを待ちつつも以下のような[pinterest](https://jp.pinterest.com/)製のライブラリを利用してみます。

* https://github.com/pinterest/riffed

## 2. Riffedの特徴

以下のような特徴を持っているみたいです。

1. thriftコードから、erlangのコードを自動生成するMixタスク[mix compile.thrift]を提供
2. Riffed.Structを利用して、thriftで定義、erlangで生成した構造体にElixirからアクセスできる機能を提供
3. Riffed.Server, Riffed.Clientを提供することで、生成したコードを利用したデータ通信の簡易サーバを簡単に構築できる機能を提供

最初は、1, 2だけなのかな、と思っていましたが、3もあるのですね。

## 3. 利用してみよう

とはいえ、1, 2は比較的にお手軽に利用できたのでちょっと触ってみました。

### 3-1. dependenciesを追加

[チュートリアル](https://github.com/pinterest/riffed/blob/master/doc/GettingStarted.md#getting-started)にあるようにsubmodulesをtrueにします。これで落ちてくるソースがけっこうでかかったです。。

```mix.exs
  defp deps do
    [
      {:riffed, github: "pinterest/riffed", tag: "1.0.0", submodules: true}
    ]
  end
```

### 3-2. thriftコードを用意

mixプロジェクトに`thrift`というディレクトリを作成し、そこに拡張子が`thrift`のソースコードを配置します。

```thrift/example.thrift
struct MyChatMessage
{
  1: i32 senderId,
  2: i32 recieverId,
  3: string message
}

service MyChatService
{
  void sendMessage(1: MyChatMessage message);
  void recieveMessage(1: MyChatMessage message)
}
```

### 3-3. erlangコードを自動生成する

3-1実施後に、mixでタスクが追加されます。3-2.で定義した情報を利用して自動生成のタスクを実行します。

```bash
mix compile.thrift
```

これを実行すると、`src`というフォルダが自動で作成されたソースコードが配置されます。

![Screenshot from 2016-03-29 12-46-37.png](https://qiita-image-store.s3.amazonaws.com/0/49547/7a0cb376-493d-6ebf-c307-79fe6197a0cf.png)

### 3-4. elixirから、生成したコードを利用してみる

下記のように、Elixirコードを用意します。

```lib/my_chat_message.ex
defmodule MyChatMessage do
    use Riffed.Struct, example_types: [:MyChatMessage]
end
```

簡易に利用できるかだけ見たいので、`iex -S mix`で見てみました。

```ex
$ iex -S mix

iex(1)> MyChatMessage.MyChatMessage.__struct__

%MyChatMessage.MyChatMessage{message: :undefined, recieverId: :undefined,
 senderId: :undefined}

iex(2)> message = %MyChatMessage.MyChatMessage{message: "test", recieverId: 1, senderId: 2}

%MyChatMessage.MyChatMessage{message: "test", recieverId: 1, senderId: 2}
```

と、このように、構造体へのアクセスができることが確認できました＾＾


---

サンプルは以下においています。

* https://github.com/letusfly85/use_elixir_thrift

---


次はRiffedのServer, Clientも見てみようと思います。

Cassandraとかとも連携できそうですし、楽しそうですね＾＾

本日は以上となります。
公式のDocker Engine install 手順道理やると keyserver timed out がでて辛い


## Add the new GPG key. で突然の keyserver timed out

[公式の手順]( https://docs.docker.com/engine/installation/linux/ubuntulinux/)

```bash:実行コマンド
$ apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
~~
gpg: keyserver timed out
gpg: keyserver receive failed: keyserver error
```

以前も出て数日後に実行したらできたのでkeyserverが死んでる？？？

でも、僕は今入れたいんだ！！！！
ということで方法探した。

## 入れようとした環境

VMのUbuntuへの導入

- Windows7
- vagrant 1.8.1
- VirtualBox 5.0.16
- Ubuntu 14.04

## 答えはissuesにあった

[こちらを参照](https://github.com/docker/docker/issues/13555#issuecomment-164396486)

もう感謝しかない。嬉しい。本当にありがとう。

```bash:呪文
curl https://apt.dockerproject.org/gpg > docker.gpg.key && echo "c836dc13577c6f7c133ad1db1a2ee5f41ad742d11e4ac860d8e658b2b39e6ac1 docker.gpg.key" | sha256sum -c && apt-key add docker.gpg.key && rm docker.gpg.key
```

このあとは、手順道理で行けた。

```bash
$ echo 'deb https://apt.dockerproject.org/repo ubuntu-trusty main' > /etc/apt/sources.list.d/docker.list
$ apt-get update
$ apt-get purge lxc-docker
$ apt-cache policy docker-engine
$ apt-get update
$ apt-get -y install linux-image-extra-$(uname -r)
$ apt-get update
$ apt-get -y install docker-engine
$ docker -v
Docker version 1.10.3, build 20f81dd
```
Zybo > Chronicles blog 09 > MIO > 54 pins / Two CAN 2.0B interfaces / PJTAG and TRACE / "Peripheral I/O Pins" / “MIO Configuration” tab

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285

@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Meet-the-Zynq-MIO-Adam-Taylor-s-MicroZed-Chronicles-Part-9/ba-p/386661


Multipurpose IO (MIO) の説明から気になったものを抜粋。

> . It connects to 54 pins on Zynq devices (note that the Zynq-7010 SoC in the CLG225 package has 32 MIO pins),

...

>- Two CAN 2.0B interfaces
- PJTAG and TRACE debug interfaces

...

> There are two options for defining the MIO
> ...
> Peripheral I/O Pins
> ...
> “MIO Configuration” tab
仕事にあそびごころを、LGTMコメントに使いたいGif画像

## GitHubのLGTMコメント文化
>
「Looks good to me」の略。
「良いと思う」「問題ないと思う」という意味。
http://d.hatena.ne.jp/keyword/LGTM

LGTMを表す画像を貼ってレビューOKですよっという文化がある。
楽しいのでみんなやっていこう！！

![image](https://qiita-image-store.s3.amazonaws.com/0/31015/119328e8-ba35-4a90-1620-d25f43486e8e.png)

## LGTMの画像をあつかっているサイト
http://lgtm.in/

## chrome extention
https://chrome.google.com/webstore/detail/lgtm/oeacdmeoegfagkmiecjjikpfgebmalof
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/eed095a3-5597-ea50-9c1a-078153ad904f.png)


## 面白い画像をストックしておきたい
[![LGTM](http://lgtm.in/p/mzG8pBeNp)](http://lgtm.in/i/mzG8pBeNp)
[![LGTM](http://lgtm.in/p/kycNJ9leq)](http://lgtm.in/i/kycNJ9leq)
![LGTM](https://camo.githubusercontent.com/558469ce084f875949e9ed7881101d0fbaa807f6/687474703a2f2f6c67746d2e696e2f702f326855466e364b6971)
[![LGTM](http://lgtm.in/p/6N9Ohnvfq)](http://lgtm.in/i/6N9Ohnvfq)
[![LGTM](http://lgtm.in/p/6t9FCtLTp)](http://lgtm.in/i/6t9FCtLTp)
[![LGTM](http://lgtm.in/p/ouHeH1Hcq)](http://lgtm.in/i/ouHeH1Hcq)
[![LGTM](http://lgtm.in/p/UqJiuVcfq)](http://lgtm.in/i/UqJiuVcfq)
[![LGTM](http://lgtm.in/p/U8IiknNiq)](http://lgtm.in/i/U8IiknNiq)
[![LGTM](http://lgtm.in/p/s2g8nrFQp)](http://lgtm.in/i/s2g8nrFQp)
[![LGTM](http://lgtm.in/p/Y4zLQH7Sp)](http://lgtm.in/i/Y4zLQH7Sp)
[![LGTM](http://lgtm.in/p/Sb8bqD2mq)](http://lgtm.in/i/Sb8bqD2mq)
[![LGTM](http://lgtm.in/p/IovacYK0q)](http://lgtm.in/i/IovacYK0q)

## 自社プロダクトの画像をのせるとエンジニアは印象がいいんではなかろうか...見習いたい
![image](https://qiita-image-store.s3.amazonaws.com/0/31015/87c81914-3b55-5e96-717a-c05c2d8ded6a.png)


## 仕事にあそびごころを！！