OmniAICreator/Qiita-1.07M huggingface dataset:
Rails5 のproduction環境で lib/ 以下が読み込まれない問題

# Rails5 のproduction環境でlib/ 以下が読み込まれない問題

<img width="354" alt="20160701180502.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/ef92e299-0ee5-d4c7-c1e1-86d36d55f407.png">

## autoloadは、applicationに書いてるしなぁ
+ config.autoload_paths << Rails.root.join('lib')

## しかもdevelopment では普通に呼ばれる
+ production環境でlib/以下が読み込めていないらしい

## enable_dependency_loadingなるものがいるらしい
+ どうやら、config.enable_dependency_loading = true　がいるらしい。

``` config/application.rb
config.enable_dependency_loading = true # <- これを追加しないといけないらしい
config.autoload_paths << Rails.root.join('lib')
```
【Laravel 5.2】OrderBy句のキャスト

文字列を数値としてOrderByしたいときー。

例：priceという列がvarchar

`$query = DB::table('test')->where('hogeType', 1);
$query->orderByRaw('CAST(price AS DECIMAL(10,2)) DESC');
$test_datas = $query->get();  
`

CAST()で使えるやつ

BINARY[(N)]
CHAR[(N)]
DATE
DATETIME
DECIMAL[(M[,D])]
SIGNED [INTEGER]
TIME
UNSIGNED [INTEGER]
Google Analyticsのカスタムキャンペーンパラメータを入れたページのfacebookいいねの数がおかしい時


パラメータを入れた後のURLを[facebookでデバッグ](https://developers.facebook.com/tools/debug/ "デバッガー - 開発者向けFacebook")すれば直った。


小一時間悩んだ。
#2 Git一連の流れ


gitの流れを勉強したので一連の流れを書き留めます(また備忘録)。


***

# pushのやり方(ローカル→リモート)

##1. git init
好きなディレクトリをGit管理下に置く。まずここから。


```
$ mkdir <dir> 　　#←ディレクトリの名前
$ cd <dir> 　　　　#initする前に移動
$ git init 　　　　#.gitができる(隠してあるので確認時は -al必須)
```

##2. git add <file>
さっき作ったディレクトリにGitにpush(後述)したいファイルを入れた後に、まずindexのステージに渡してあげなきゃなのでaddしてあげる。

```
$ git add <file>
```
ちなみに、<file>のところのパラメータに「.」を渡すと全ファイル指定になるので一個一個書かなくて済む。非常に楽。

##3. git commit -m "<コメント>"
pushするための最終準備としてcommitで確定してやると準備は完了。

```
$ git commit -m "first commit" #コメントには備考書いたりする
```

##4. git remote add 
リモートリポジトリにローカルで作成したディレクトリとかファイルを共有したいときは、まずリモートに紐付けを行わなければならない。

```
$ git remote add <name> <url>
```
name には紐付けたいリモートの名前

url にはそのリモートURL

##5. git push 
やっとここでpushできる。

```
$ git push -u <repository> <refspec>
``` 
repository にはさっき紐付けたリモートの名前(ちなみにここはoriginって入れても同じ。というかoriginの方がよく使うらしい)

refspec にはローカルからpushしたいbranchを指定する(masterもbranchなのでmasterと書いてももちろん良し)

ここまででリモートにローカルからpushしたディレクトリがある...はず

# pullのやり方(リモート→ローカル)
共同で開発する時、職場の他のエンジニアの人もpushしてマージするとローカルのmasterとリモートのmasterに差分(違うところ)が生じる。この時pullでアップデートする必要が出てくる。

## git pull

```
$ git pull <repository> <refspec>
```

repository にはリモート
refspec　には更新したいローカルのmaster

また、この作業をする前にローカルのbranchをmasterに切り替えておかないと更新されないし、コマンドのrefspecにbranch入れちゃうと、masterが古くてbranchが最新になってしまいカオスになる。なので、

```
$ git checkout master
Switched to branch 'master'
$git pull origin master
```
みたいにすると良い。
これでローカルのmasterも最新になる。

# 便利なコマンド
あると便利なコマンド。(というか絶対使う気がする)

## git status
ローカルでGit管理下のディレクトリのステージ確認ができる。
かなり便利で、自分がaddしたかとかcommitしたかも確認出来るから漏れなく作業進められる。次するべき作業とかも教えてくれるので僕みたいな初心者にも優しいつくりになっている。

```
$ git status
On branch master
nothing to commit
```

例えば、commit直後だとこうなる。nothing to commitと出てるので、もうcommitができていることがわかる。

## git branch
今までローカルリポジトリで作ったブランチとその中で今自分がどこで作業しているか(カレントブランチ)の確認ができる。コマンドラインのpwdとかlsみたいなコマンド。

```
$ git branch
 master
*branch1 #カレントブランチにはこんな感じで記号がつく。
 branch2
```

## git checkout 
ブランチの切り替えができる。cdみたいな感覚で使う。

```
$ git branch
 master
*branch1 
 branch2
$ git checkout master
Switched to branch 'master'
$ git branch
*master
 branch1 
 branch2
```

***

完全に自分専用の備忘録になってしまいました...

もっとこうしたほうがいいとか訂正したほうがいいところなどありましたら、ご指摘いただけると嬉しいです。よろしくお願いします！
PureLayoutで使う制約の種類

pureLayoutの勉強(随時更新)

pureLayout
https://github.com/PureLayout/PureLayout

コードベースで簡潔に制約を設定するためのライブラリ（と理解してます）

インストール後は

```
import PureLayout

class ViewController: UIViewController {
~
}
```
ですぐ使えます。

###view間の制約
autoPinEdge
autoPinEdgeToSuperviewEdge
autoPinEdgesToSuperviewEdges
autoCenterInSuperview
autoAlignAxis(toSuperviewAxis: ALAxis)
autoAlignAxis(ALAxis, toSameAxisOf: UIView)

```
viewA.autoPinEdge(.Bottom, toEdge: .Top, ofView: viewB)
viewA.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 30)
viewA.autoPinEdgesToSuperviewEdges() // superviewと同じ大きさになる
viewA.autoCenterInSuperview() // viewAをsuperViewのセンターに配置
viewA.autoAlignAxis(toSuperviewAxis: .vertical) // superviewのverticalと一致させる
viewA.autoAlignAxis(.horizontal, toSameAxisOf: viewB) // viewBのhorizontalと一致させる
```

###サイズの制約
autoSetDimension
autoSetDimensionsToSize

```
//cgfloatで個別にセット
view.autoSetDimension(.Width, toSize: 100)
view.autoSetDimension(.Height, toSize: 100)

// cgsizeでセット
view.autoSetDimensionsToSize(CGSize(width: 100 ,height: 100))
```

###制約のセット、解除
autoInstallConstraints
autoRemoveConstraints

```
// layoutConstraintsは制約の配列
//    layoutConstraints = NSLayoutConstraint.autoCreateAndInstallConstraints{
//        self.viewA.autoCenterInSuperview()
//    } as NSArray?


self.layoutConstraints?.autoInstallConstraints()　// layoutConstraintsを適用
self.layoutConstraints?.autoRemoveConstraints()　// layoutConstraintsを解除
```
golang + Docker + BigQuery + digdag の例

golang で BigQuery へ query をだし、その結果から グラフを png 画像として生成する例をつくりました。
それを cross compile し, digdag をつかって alpine の docker 中で実行させてみました。

https://github.com/katoy/golang-docker-digdag

生成されるグラフの例
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/14958/1cd1625a-4bc9-dbc8-ca26-55869a0ae4b4.png)

注意：
現時点での golang のスクリプトは単に動作するだけのレベルで、golang としては改善の余地が大いにあります。 (2016-10-21)
TensorFlow > with tf.Session() as sess: > The empty parameter to session indicates that this code will attach to (or create if not yet created) the default local session.

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#the-session

```
with tf.Session() as sess:
```

> The empty parameter to session indicates that this code will attach to (or create if not yet created) the default local session.

default local session以外の動作については未消化。

parameterを指定して実行するとどういう効果があるかは、他の資料を読み進めるうちに気づくかもしれない。
TensorFlow > with tf.Graph().as_default(): / class tf.Graph

TensorFlowというDeep Learning関連コードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101


その中で出てきた
`with tf.Graph().as_default():`
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#the-graph

> A tf.Graph is a collection of ops that may be executed together as a group. Most TensorFlow uses will only need to rely on the single default graph.

> More complicated uses with multiple graphs are possible, but beyond the scope of this simple tutorial.

現段階ではdefaultグラフを使うことになりそう。

multiple graphsを使う必要性が出てきた時に再調査する。

[class tf.Graph](https://www.tensorflow.org/versions/master/api_docs/python/framework.html#Graph)
NethServer 7.2 良い

## manual

* [Installation — NethServer 6.8](http://docs.nethserver.org/en/latest/installation.html)

## インストール

* 全自動インストールが楽。
* `root` : `Nethesis,1234` <= rootアカウントの初期パスワード
* port 980 にてログイン。
* 使用メモリは 400MB

![free.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/d4e0642c-d573-2758-965c-c1fc4a65d1d5.png)


## 既存のCentOS7にインストールする場合

```
yum localinstall -y http://mirror.nethserver.org/nethserver/nethserver-release-7.rpm

nethserver-install

nethserver-install nethserver-mail nethserver-nut
```

## 追加パッケージ

* webvirtmanagerがある

![open.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/ec1382db-3e1d-c64c-10f9-6c3d47322d8b.png)

* storageを追加する必要あり。

![signin.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/354e4633-4153-5a8b-817e-0b176fe4bbdc.png)

![storage.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/ba5548b0-a4a0-ecd7-2f84-7e9e8658da4e.png)

![create.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/435f7bc2-f93c-4490-2729-35e10dc74bfd.png)
LINEのMessaging APIで自動応答のBOTを作成する with Ruby

# はじめに

4月に公開された「BOT API Trial Account」について、11月16日にアカウントの完全削除を行うというメールが送られてきて、利用者は新しいMessaging APIを利用する「Developer Trial アカウント」に移行する必要があるとのことでした。

[参考URL]
https://business.line.me/ja/news/20051494

ということで、新しいAPIを利用して、投稿されたメッセージをそのまま送り返す「やまびこBOT」を作ってテストしてみたので、ここにまとめます。

[参考URL]
https://business.line.me/ja/services/bot

# ビジネスアカウントの作成

以下のURLにアクセスし、LINE BUSINESS CENTERにて自分のLINEアカウントでログインします。

https://business.line.me/ja/

# Messaging API

メニュー内の「サービス」から「Messaging API」を選択し、「Developer Trialを始める」ボタンをクリックする。

 ![スクリーンショット 2016-10-21 6.32.38.png](https://qiita-image-store.s3.amazonaws.com/0/114240/c1a5536e-d6af-65e6-4342-2c504d576be9.png)

次に表示された画面で「会社/事業者を選択」をクリックする。

![スクリーンショット 2016-10-21 6.36.26のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/114240/fa1539b1-407f-f957-2a2d-14aef82d3ca2.png)

次の画面でアカウント名、業種を設定して「確認する」をクリックする。

![スクリーンショット 2016-10-21 6.42.58.png](https://qiita-image-store.s3.amazonaws.com/0/114240/715ef759-3a46-5686-dd2a-ce1e4ae98424.png)

次の画面で「申し込む」をクリックしてアカウントの作成が完了です。

# LINE@MANAGER

次の画面で「LINE@MANAGER」をクリックすると以下の画面が表示されるので、「APIを利用する」をクリックする。

![スクリーンショット 2016-10-21 6.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/114240/47dcf09b-c58b-95cd-82ef-70a959616834.png)

いくつかの画面で「確認」をクリックすると、「Bot設定」画面が表示されるので「Webhook送信」を「利用する」、「自動応答メッセージ」を「利用しない」に設定して「保存」をクリックする。

![スクリーンショット 2016-10-21 6.51.37.png](https://qiita-image-store.s3.amazonaws.com/0/114240/c1caf2ff-bc88-15ff-4dc9-65f98ec96611.png)

以上でアカウントの準備ができました。

# 再びLINE BUSINESS CENTER

「アカウントリスト」を選択し、作成したアカウントの「Messaging API」の横にある「LINE Developers」をクリックします。

![スクリーンショット 2016-10-21 6.55.04.png](https://qiita-image-store.s3.amazonaws.com/0/114240/232867e9-5e6d-e38a-41b2-3a26fd6db75f.png)

アカウントの設定画面が表示されるので、「Webhook URL」にBOTのアプリケーションを設置するURLを入力します。

また、「Server IP Whitelist」に使用するサーバーのIPアドレスを設定することもお忘れなく。

# RubyからMessaging APIを利用

API用gemのインストール

```sh:
$ gem install line-bot-api
```

以下のコードを上記Webhook URLで表示できる場所に保存。

```rb:index.rb
#!/usr/local/bin/ruby
# encoding: utf-8

# ライブラリの読込
require 'cgi'
require 'json'
require 'line/bot'

# CGIの生成
$cgi = CGI.new()

# 送信されたデータの整形
params = {}
$cgi.params.each {|key, val|
  params = JSON.parse(key)
}

# 返信に必要な情報の取得
replyToken = params["events"][0]["replyToken"]
msgType = params["events"][0]["message"]["type"]

if msgType == "sticker" then
  msgText = "イイね！"
else
  msgText = params["events"][0]["message"]["text"]
end

# 返信データの作成
message = {
  type: 'text',
  text: msgText
}

# データ送信
client = Line::Bot::Client.new { |config|
    config.channel_secret = "[自分のチャンネルシークレットを入力]"
    config.channel_token = "[自分のチャンネルトークンを入力]"
}
response = client.reply_message(replyToken, message)
#p response

# 初期認証用コード
puts <<EOF
Content-type: text/html

linebot
EOF
```

上記コードを保存した後、LINE Developersのチャンネル設定画面で、Webhook URLの右にある「VERIFY」というボタンを押して、URLの下に「Success.」と表示されることを確認する。

# 動作確認

設定画面に表示されているQRコードでBOTを友達に追加し、メッセージを送り、同じメッセージが返信されることを確認します。

ちなみに、僕が作成したBOT「ブラックベータ」は、以下のQRコードで友達に追加できるので、良かったら試してみてください。
また、スタンプを送ると「イイね！」と返します。

![wrt6608w.png](https://qiita-image-store.s3.amazonaws.com/0/114240/2e099ea3-2a40-49b9-ca84-431c809cf153.png)

できた！
技術英語 > 良いエンジニアのreturnの使い方 > I would like to [return a favor of] you.

http://qiita.com/7of9/items/00790dda4a751c2ac9d6
で出てきた「return」で思い出した。

returnは関数の戻り値として使うが、自分が入力したreturnの数は計り知れない。

### 良いエンジニアのreturnの使い方

I would like to <font color=red>return a favor of you</font>.
「あなたの好意に(対して)お返ししたい」

http://ejje.weblio.jp/content/return+a+favor
> 恩返しをする

技術的な事項を教えていただく人に対してはreturn the favor of youは難しい。その分野ではその人の方が自分よりはるかに知識を持っているから。
教えてもらったことを(Qiitaなど通じて)他の人に教えていくと、まわりまわって環境が良くなって、その人にお礼ができるかよく分からない。

次回は「悪のエンジニアのreturnの使い方」
登場予定 Janeway艦長。
symlinkを使わずにホームディレクトリの設定ファイル(dotfile)を管理する

設定ファイルをVCSで管理するという発想は昔からあります。古くはRCSを使ったり、今時は/etcのようなシステムワイドな設定であれば、[etckeeper](https://github.com/joeyh/etckeeper)が使えますが、ホームディレクトリの設定ファイルとなると若干面倒です。

Qiita上でも["git 設定ファイル"](http://qiita.com/search?utf8=%E2%9C%93&sort=&q=git+%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)や["git dotfile"](http://qiita.com/search?q=git+dotfile)で検索すれば複数ヒットしますが、ほとんどが「\$HOME直下ではないどこかのサブディレクトリにリポジトリをおいてシンボリックリンクを貼る」という手法が支配的のようです。
その方法はお手軽であるものの、使っているツール自身がdotfileを書き換えることがある場合に不都合が起きることがあります。元ファイルをバックアップにrenameして新たに同じファイル名で新規作成する挙動をするアプリケーションがあるからです。このような場合、symlinkが切れてしまいます。

他の方法を探してみたところ、[The best way to store your dotfiles: A bare Git repository - Atlassian Developers](https://developer.atlassian.com/blog/2016/02/best-way-to-store-dotfiles-git-bare-repo/)というブログの記事の手法が良さそうでした。以下はブログからのsnippetの引用です。

```shell-session
git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
```

この設定のポイントは以下にあります。

* gitディレクトリ名を".git"とは違う名前にする
* aliasで変えたgitディレクトリ名とワーキングディレクトリを明示する

これらの措置によって、通常のgitコマンドを使う分には\$HOME自体がgitの管理対象と判断されなくなり、普段のgit操作に支障をきたすことなく直接$HOME直下のdotfileを管理できます。

自分はzshを使っているので、以下のような設定を追加しました。

```shell-session
setopt complete_aliases
```
zshで補完を有効にしていると、alias内のコマンドが補完対象だった場合に同じように補完を試みてきます。しかしサブコマンド以外のファイル名補完ができません($HOME/.gitが存在しないためワーキングディレクトリとして認識されない)。
このalias単体だけどうにかする方法も考えましたが(専用の補完関数を作る、aliasでなく関数で定義してみる等)どうもうまく行かなかったので、zsh側の挙動を変更することにしました。他に良いアイディアがあればコメントください。
CentOS7でnginx(VirtualHost)/uWSGI(+Supervisor)/Django(Python)メモ

自分の環境のメモです。構成の参考になれば。
初学者なので不完全なところが多いともいますのでご注意を。

# やりたいこと
既にexample.comというドメインを持っていて、以下のような感じでサブドメインで捌けるようにしたかった。

- aaa.example.com => 通常のWebホスティング
- xxx.example.com => Djangoのプロジェクト
- yyy.example.com => Railsのプロジェクト

これを__VirtualHost__というらしい（ひとつのIPに複数のホストを割り当てることかな？）。なおサブドメインのDNS登録は別のところで行っている。
今回はその手始めとして、__あるサブドメインへのアクセスをDjangoのプロジェクトに飛ばす構成__のメモ。
[超絶便利なDoker用リポジトリ](https://github.com/dockerfiles/django-uwsgi-nginx)の設定ファイルを読み解く感じで進めた。

# 使うもの
- __CentOS7__: 一年ぐらい稼働していて色々入ってる
- __Django__: 本体のWebアプリケーション
- __nginx__: VirtualHostを実現するWebサーバー
- __uWSGI__: Pythonサーバー
- __supervisor__: uWSGIなどを簡単にデーモン化する
- __php-fpm__: おまけ（Webホスティング用）

# 前提
- Djangoのプロジェクトは`python manage.py runserver`ですでに稼働する状況。

# nginxの導入
1. nginxをインストールする
    - EPEL, Remiとかある: 詳細はいつか調べる
    - [yumリポジトリ一追加リスト 完全版](http://qiita.com/bezeklik/items/9766003c19f9664602fe)
2. apacheを停止する 
    - `systemctl stop`じゃなくて`systemctl disable`
3. nginxを開始する

## nginxのVirtualHost
設定ファイルは`/etc/nginx/conf.d/`に設置する。なおこの設定が読み込まれる所以は`/etc/nginx/nginx.conf`に書かれている。「[nginxでvirtualhostを設定する](http://qiita.com/duke-gonorego/items/4c5bfe1042cc0f7c6680)」と「[CentOSにてnginxでPHPを動かす](http://qiita.com/utano320/items/36b6eac2bbd5bb5657f6)」の2つがとても分かりやすくを眺めるだけで分かる。基本は以下の設定で、これを増殖させれば色んなサブドメインへのアクセスを各々捌けるようになるらしい。めっちゃ簡単。

```
server { server_name xxx.example.com; }
```

# uWSGIとsupervisorの導入
1. `pip instal uwsgi`
2. Django起動用のuWSGI設定`hoge.ini`を書き`uwsgi --ini hoge.wsgi`で動かしてブラウザアクセスを確認
3. `yum install supervisor` + `systemctl enable supervisor`（念のため）
4. `/etc/supervisord.d/fuga.ini`にDjango+uWSGIアプリ管理用の設定を記述する

## uWSGI
よく分かっていないが`uwsgi (モジュールパス).uwsgi`でモジュールを実行できるようだ。なお`WSGI => uWSGI`ということらしい（何がだ）。
使い方を検索すると`uwsgi --http xxx hoge.wsgi`とか`uwsgi --socket xxxx hoge.wsgi`とかいろいろな実行例がある。しかし結局は設定をすべてiniファイル(`uwsgi.ini`)にまとめて`uwsgi --ini uwsgi.ini`として動かすことになるので目をくれる必要はない。

## supervisor
DjangoはuWSGIでという記述が散見されたが、uWSGIをどうデーモン化するのかよく分からなかった。`init.d`とか`service`とか`systemctl`のアレコレで可能なのだろうがよく分からないし怖い。調べたらそれらの代替としてとっつきやすそうなsupervisorが見つかった。`/etc/supervisord.d/`の中でデーモン系コマンドをいい感じで実行するための設定ファイル`fuga.ini`を書く。この設定が読み込まれる所以は`/etc/supervisord.conf`に書かれている。参考: [Supervisorで簡単にデーモン化](http://qiita.com/yushin/items/15f4f90c5663710dbd56)

# nginxをuWSGIと連携させる
uWSGIでnginxの連携には__Unixソケット通信かローカルTCP通信を用いる__。最初は何となくUnixソケットを試みたが[設置場所と権限のいろいろ](https://www.google.co.jp/search?q=nginx+socket+permission+denied&lr=lang_ja)に躓きそもそもUnixソケットって何だっけとなったからhost:port通信にした。uWSGI側の設定はポートを聞くだけだ。nginx側は以下の設定で通信をできるようになり、あと参考設定を元にうまいことやる。

```
upstram uwsgiapp { server 127.0.0.1:(hoge.iniで設定したポート); }
```

# 以上
上手くいけばブラウザから`http://xxx.example.com/`にアクセスするとDjangoアプリが見られるはずだ。
3時間くらい掛けたけど振り返ってみるとわりと簡単だ。分かってないことも多いけど。
## 分かっていないこと
- Unixソケット
- WSGIとuWSGIのはたらき
- supervisorを使わずにデーモン化する
【Ruby】同じコードを書かないためだけにbefore_filterを使っていませんか？

#結論
「同じコードを書かない」のは目的でなく、
品質を上げる１つの手段。

#本題

例えば以下のようなプログラムがあるとする。

```
class TestsController < ApplicationController

  def index
    @tests = Test.all
  end

  def show
    @test = Test.find(params[:id])
  end

  def edit
    @test = Test.find(params[:id])
  end

  # 略
end
```

「同じコードを２回(以上)書いている！
DRY(Don't Repeat Yourself)に反している！」

と思い、いままで以下の様に書き換えていました。

```
class TestsController < ApplicationController
  before_filter :set_test, only: [:show, :edit]

  def index
    @tests = Test.all
  end

  def show
  end

  def edit
  end

  # 略

  private
  
  def set_test
    @test = Test.find(params[:id])
  end
end
```

しかし、こう書くことでバグのリスクが少し高まります。
例えば、新しいactionを追加したとき、
before_filterにactionの追加を忘れる、ということも起きうる。

上記の例ぐらい文量が少なければ問題ないと思います。
が、ソースコードが増える、複数の人がコードを書くようになると、
抜け漏れが起きる可能性も高まります。

だから敢えて品質向上を目的に、
各actionに同じコードを書く。
これによって、ソースを見る人は各actionの中だけを見て
プログラムを書くことができます。
```
class TestsController < ApplicationController

  def index
    @tests = Test.all
  end

  def show
    @test = Test.find(params[:id])
  end

  def edit
    @test = Test.find(params[:id])
  end

  # 略
end
```

#before_filterを使う方が良い時
actionに関わらず、コントローラーに必要な処理はbefore_filterで書く。
※ ログイン認証など

なぜならbefore_filterを使わない場合、
各actionに記入漏れをする可能性があるからです。

#改めて結論
規則は規則ですが、
バグの起きにくいように書きましょう。


#関連記事
[Railsのフィルターオプション only と except の使い分け](http://o.inchiki.jp/obbr/218)
[DRY (Don't Repeat Yoursel) の意味を勘違いしてたかも](http://d.hatena.ne.jp/kwatch/20090105/1231162464)
ちょっとだけしぇるすくりぷとかいてみる

ファイルごとのmd5チェックサムを計算して、ファイルに出力するスクリプト。ファイルコピー時にファイルが壊れていないかの調査に使える？？

```
#!/bin/sh
for i in `find ./ -type f`
do
   md5sum i >> file_name.txt
done
```
Macでtuaregを導入する

tuaregはEmacsでOCamlを快適に使うためのモードを提供するものです。

# 事前準備
1. [Homebrew](http://brew.sh/index_ja.html)を導入する。
2. [Emacs](https://www.gnu.org/software/emacs/)を導入する。（Homebrewで入れられます）

# 導入手順
1. [OPAM (OCaml Package Manager)](http://opam.ocaml.org)を導入する。
2. [tuareg](https://github.com/ocaml/tuareg)を導入する。

```
$ brew install opam
$ opam init
$ opam update
$ opam upgrade
$ opam install tuareg
$ echo '(load "'"$HOME"'/.opam/system/share/emacs/site-lisp/tuareg-site-file")' >> ~/.emacs
```

以下を追記

``` ~/.emacs
(add-to-list 'auto-mode-alist '("\\.ml[iylp]?$" . tuareg-mode))
(autoload 'tuareg-mode "tuareg" "Major mode for editing OCaml code." t)
(autoload 'tuareg-run-ocaml "tuareg" "Run an inferior OCaml process." t)
(autoload 'ocamldebug "ocamldebug" "Run the OCaml debugger." t)
```

# 動作確認

```
$ emacs sample.ml
```

modeが(Tuareg)になっていたらOK。
expect any instance of ...

あるとき「RSpec で悩んでいることがあるんです。」と相談をもちかけられました。コードは、いろいろ簡略化すると要するにこんな感じのものです：

```ruby
class Foo
  def self.baa
    3.times { self.new.baz }
  end

  def baz
    ...
  end
end
```

こんなコードがあったとして、次のようにテストしたい：

```ruby
describe Foo do
  describe ".baa" do
    it "calls `baz' method" do
      expect_any_instance_of(described_class).to receive(:baz)
      described_class.baa
    end
  end
end
```

しかしこのスペックを動かしてみるとエラーになってしまいます。「`baz` メッセージは別のインスタンスが受け取ってしまいました！」と叱られてしまうわけです。

```
$ rspec
F

Failures:

  1) Foo.baa calls `baz' method
     Failure/Error: 3.times { self.new.baz }
       The message 'baz' was received by #<Foo:47454695668640 > but has already been received by #<Foo:0x005651d0305958>
...
```

さて、こういうのは皆さんならどうしますか？

```ruby
describe ".baa" do
  it "calls `baz' method" do
    expect_any_instance_of(described_class).to receive(:baz) do
      allow_any_instance_of(described_class).to receive(:baz)
    end
    described_class.baa
  end
end
```

これはこれでなんか不自然...

```ruby
describe ".baa" do
  it "calls `baz' method" do
    expect_any_instance_of(described_class).to receive(:baz) do
      expect_any_instance_of(described_class).not_to receive(:baz)
    end
    described_class.baa
  end
end
```

これでも動くけれど、さらに不自然...

(Ruby: 2.2.0, RSpec: 3.4.4)
LINE Notifyで電車の遅延情報を通知してみた

LINE Notifyを使って電車の遅延情報をLINEに通知してみました。
ソースコードは[こちら](https://github.com/rizumi/DelayLineNotify)。

# 電車遅延情報の取得
[鉄道遅延情報のjson](https://rti-giken.jp/fhc/api/train_tetsudo/)を使わせていただきました。
リクエストを送ると遅延している路線一覧がJSONで取得できます。

```python
import urllib2
import json

res = urllib2.urlopen("https://rti-giken.jp/fhc/api/train_tetsudo/delay.json")
datas = json.loads(res.read())
```

# LINEへ通知
[LINE Notify](https://notify-bot.line.me/ja/)へログインしてアクセストークンを発行。
POSTを行う。

```python
import urllib
import urllib2

params = {"message":"通知したいメッセージ"}
params = urllib.urlencode(params)
    
req = urllib2.Request("https://notify-api.line.me/api/notify")
req.add_header("Authorization","Bearer " + "発行したトークン")
req.add_data(params)

res = urllib2.urlopen(req)
```

# まとめ
たった数行で遅延情報を取得してLINEに通知できました。
あとは毎朝定期的に実行して遅延情報を通知するようにしたり、
上司を同じグループに入れて遅延していたら遅刻の連絡を自動で送ることもできます。

LINE Notifyは非常に気軽に使えるので、色々と試してみたくなります。

# 参考
- [LINE Notifyをとりあえず使ってみる](http://qiita.com/okunoryo/items/88c002d74ab173706c93)
【Swift】Quick Nimble のテンプレート（テストコード）- UILabel

# 概要
Quick Nimble を利用したテストコードのテンプレートです。

# Quickとは
QuickはSwift、ObjcのBDD開発フレームワークです。([github](https://github.com/Quick/Quick))
> Quick is a behavior-driven development framework for Swift and Objective-C.

 - TDD： テスト駆動開発（Test Driven Development）
 - BDD： ビヘイビア駆動開発（Behavior Driven Development）

# 準備
こちらが非常に参考になります。
http://qiita.com/akatsuki174/items/77cb95265919b5ad4965

- Cartfile.privateにQuick, Nimbleを追加
- Link Binary With LibrariesにQuick, Nimbleを追加
- Copy FilesにFrameworkでQuick, Nimbleを追加
- コード作成（TopViewController）
- テストコード作成（TopViewControllerTests）

# 結果
https://github.com/menomoto/Template_Quick/tree/master/basicQuickTemplate

# テストケース
* UILabelのTextに正しい値がセットされているか

# テストコード
```
import UIKit
import Quick
import Nimble

@testable import basicQuickTemplate


class TopViewControllerTests: QuickSpec {
    override func spec() {
        
        describe("TopViewController") {
            var topViewController: TopViewController?
            beforeEach {
                topViewController = TopViewController(labelText: "UILabel text matcher")
            }
            
            it("UILabel text set is correct") {
                let expectedText = "UILabel text matcher"
                
                
                expect(isContainUILabelWithText(topViewController!.view, text: expectedText)).to(beTrue())
            }
            

        }
    }
}

private func isContainUILabelWithText(view: UIView, text: String) -> Bool {

    for subview in view.subviews {
        if let label = subview as? UILabel where label.text == text {
            return true
        }
        if isContainUILabelWithText(subview, text: text) {
            return true
        }
    }
    return false
}
```
view.subviewsから対象textがセットされたUILableがあるか再帰的に探す
Swaggerでいますぐドキュメントを書きたい/読みたい人のためのセットアップガイド

> 2017/5/26 [ドキュメント](http://swagger.io/docs/swagger-tools/)を見たらもっとかんたんにできることに気づきアップデートしました。


APIドキュメントの標準フォーマットとして注目されているSwagger。
（参考：[RESTful APIの記述標準化を担うSwaggerとは？ \| NTT Communications Developer Portal](https://developer.ntt.com/ja/blog/00f744c3-db45-42c3-86d5-983838ffbeb6)）
色々とできるのはいいんですが、セットアップしたくても
どれから手を付けていいのかわかりづらいので
Macでのセットアップ方法を残します。


## 前提条件

* MacOS向けです。Windows向けでも適宜読み替えれば使えるとは思います。
* 操作を統一するためターミナルを使う例でご紹介します。


## ドキュメントを書く

ドキュメントを書く場合は
[オンラインでSwaggerEditorにアクセスして](http://editor.swagger.io/)書けるので
いますぐに書きたいひとはそちらを利用すると良いかと思います。


ただネット環境がないと使えなくなってしまうので
オフラインでもかけるようにSwaggerEditorをローカル使うための説明を
以下に記載しておきます。
※ただ読みたいだけの人はこの項目は読み飛ばしてもらってかまいません。

### SwaggerEditorをダウンロードする

githubのリポジトリからソースを落としてくるだけです。


```sh:swagger-editorのダウンロード
# curlでダウンロード
$ curl -L -O https://github.com/swagger-api/swagger-editor/archive/v3.0.10.zip
# 解凍
$ unzip v3.0.0.zip 
```

今回は `v3.0.10` を使う想定にしています。
適宜最新版を落としたい場合は[Githubのリリース](https://github.com/swagger-api/swagger-editor/releases)で
バージョン番号を調べて適宜差し替えてください

### SwaggerEditorを起動する

解凍したディレクトリの直下にある `index.html` をブラウザで開けば使えます。

```sh:swagger-editorを開く
# 該当のindex.htmlをブラウザで開く、今回はopenコマンド開く
$ open ./swagger-editor-3.0.10/index.html 
```


### ドキュメントを編集、出力する

yamlの書き方が特殊なので日本語情報は以下のものを参照

* [Swagger\-editorの使い方兼気になったこと覚書 \- Qiita](http://qiita.com/k_keisuke/items/574cbabe38a4ab6b94d4)
* [swaggerの基礎。swaggerの設定ファイルの書き方とか \- Qiita](http://qiita.com/magaya0403/items/0419d84d8df7784ac465)

編集が終わったら「File」→「Download JSON」でjsonがダウンロードできるので
こちらを手元で保存します。
もし再編集したい場合は「Import File...」からJSONを読み込むことができるので
そこから手直しをします。


## ドキュメントを読む

SwaggerEditorで編集したJSONデータは
SwaggerUIで読みこんで閲覧することができます。

### SwaggerUIをダウンロードする

SwaggerEditorとはリポジトリが別ななので
こちらもgithubのリポジトリからソースを落としてきて
開くだけです。


```sh
$ curl -L -O https://github.com/swagger-api/swagger-ui/archive/v3.0.12.zip
$ unzip v3.0.12.zip
```

こちらは `v3.0.12` を使う場合です。
Editor同様に適宜最新版を落としたい場合は[Githubのリリース](https://github.com/swagger-api/swagger-ui/releases)で
バージョン番号を調べて適宜差し替えてください

### jsonを読み込んで表示する

SwaggerUiは解凍したディレクトリの 
`dist/index.html`を開けば使えるので
ブラウザで開いて表示します。

```sh:index.htmlを開く
$ open swagger-ui-3.0.12/dist/index.html
```

<img width="815" alt="スクリーンショット 2017-05-27 19.39.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/15902/be4c6e4a-40e5-ae11-a1d2-69f8a651a414.png">


上のスクリーンショットのように
ページ上のテキストボックスに見たいjsonのアドレスを入力して
`Explore` を押せば表示されます

#### Tips:ローカルのjsonファイルを表示したい場合

上記の例はインターネット上のjsonファイルを開く場合の例ですが
ローカルに保持しているjsonを開きたいケースもあると思います。

SwaggerUIがローカルのファイルパスには対応していないのと
`Cross-origin`の関係でエラーになるため
ローカルでサーバを立ててあげるなどしたほうがスムーズです。

色々手法はあるので方法はありますが
Macの場合はPHPがデフォルトで入っているので
[PHPのビルトインウェブサーバー](http://php.net/manual/ja/features.commandline.webserver.php)を使う方法をご紹介します。

```sh:ビルトインウェブサーバーを使う形で閲覧
# swagger-uiのdist配下にみたいファイルを配置します
# 今回は ~/swagger.json というファイルを例に示します
$ cp ~/swagger.json swagger-ui-3.0.12/dist/swagger.json
# ビルドインウェブサーバの起動
$ php -S localhost:8082 -t swagger-ui-3.0.12/dist/
```
※8082にしたのは他のものとの被り回避

これでページ上の欄に`http://localhost:8082/`を開くと
SwaggerUIが見れるようになりテキストボックスに
`http://localhost:8082/swagger.json` と
入れてあげれば見れるようになります。
Gitlab CEでCI Runner登録が上手くいかなくなったときの修正方法

元々 GitLab と GitLab CI は別ドメインのサイトとして運用する仕様だったのが、GitLab に統合されました。そのため古い設定が残っていると Gitlab Runner の登録 API　が上手く叩けずに失敗していました。

以下、修正方法

`/etc/gitlab/gitlab.rb` を編集して下記のエントリを削除する。

```
ci_nginx['redirect_http_to_https'] = true
ci_external_url 'https://<your gitlab domain>/'
```

### 設定更新

```
$ gitlab-ctl reconfigure
```

### CIランナーの登録

```
# gitlab-runner register
Running in system-mode.                            
                                                   
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
https://<your gitlab domain>/ci
```
PlayFramework2徹底入門 フォーム作成のサンプルプログラムのエラーを取り除く

#バージョンアップによる仕様変更でエラーになる模様
PlayFramework2.5.9
PlayFramework2徹底入門のサンプルをそのまま書いてもエラーになり動かなかった。
色々調べてるとFormFactoryを使うように仕様が変わったみたいです。

```Application.java
package controllers;

import javax.inject.Inject;
import play.data.*;
import play.data.FormFactory;
import play.mvc.*;
import views.html.*;

public class Application extends Controller {
    @Inject
    FormFactory formFactory;
    
    public static class SampleForm {
        public String message;
        
        public String get(){
            return this.message;
        }
    }
    
    public static Result index() {
        return ok(test.render("何か書いて。", formFactory.form(SampleForm.class)));
    }
    
    public static Result send(){
        Form<SampleForm> f = formFactory.form(SampleForm.class).bindFromRequest();
        if (!f.hasErrors()){
            SampleForm data = f.get();
            String msg = "you typed: " + data.message;
            return ok(test.render(msg,f));
        } else {
            return badRequest(test.render("ERROR", formFactory.form(SampleForm.class)));
        }
    }

}
```
これで動きました。
Play2.5 (Java)でcontrollerの処理の後に処理を実行するハンドラの書き方

アクションを合成するカスタムアノテーションを作成し、そこに、アクションが完了した後に実行される処理を記述します。

つまり、「アクションが終わった後に処理が実行されるアクション」を作成し、任意のコントローラーのメソッドに合成します。

※正しい(推奨されている)書き方なのかどうか自信はありませんが……

## ソース
```java:HogeController.java
package controllers;

import javax.inject.Singleton;

import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.With;

@Singleton
public class HogeController extends Controller {

	@With(HogeAction.class)
	public Result index() {
		System.out.println("--------------------------");
		System.out.println("HogeController.index");
		System.out.println("--------------------------");
		return ok();
	}
}
```

```java:HogeAction.java
package controllers;

import java.util.concurrent.CompletionStage;

import play.mvc.Action;
import play.mvc.Http.Context;
import play.mvc.Result;

public class HogeAction extends Action.Simple {

	@Override
	public CompletionStage<Result> call(Context ctx) {

		System.out.println("before action");

		return delegate.call(ctx)
				.whenComplete((result, t) -> {

					System.out.println("status:" + result.status());
					System.out.println("after action");

				});
	}

}
```

## 実行結果
```
before action
--------------------------
HogeController.index
--------------------------
status:200
after action
```


# 参考URL
* [JavaActionsComposition - 2.5.x](https://www.playframework.com/documentation/2.5.x/JavaActionsComposition)
* [CompletionStage (Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CompletionStage.html)
MACにnode.jsをインストールしてHello World

Macにnode.jsをインストールして、"Hello World"を表示するまでの手順です。
node.jsにはnodebrewを使います。

nodebrewはnode.jsの複数のnode.jsのバージョン管理し切り替えを可能にするツールです

補足:homebrewのインストールしてあるのが前提です

## nodebrewをインストール

### インストール
```
$ brew install nodebrew
```
### バージョン確認

```
$ nodebrew -v
nodebrew 0.9.2
...
```
以下のコマンドでインストール可能なバージョンの一覧が表示できます。

## node.jsインストール

### インストール可能なバージョンの確認
```
$ nodebrew ls-remote
```

### 最新版をインストール
```
$ nodebrew install-binary latest
```
installでもOKだけど、install-binaryだとコンパイル済みのバイナリがインストールされてビルドの時間がかからない。

#### エラーが出た
上記を実施したが下記エラーが出た

```
$ nodebrew install-binary latest
fetch: http://nodejs.org/dist/v6.9.1/node-v6.9.1-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/sonoda/.nodebrew/src/v6.9.1/node-v6.9.1-darwin-x64.tar.gz: No
Warning: such file or directory
```

Warningがでておこられた、ディレクトリがないようなので、ディレクトリ作った

```shell-session
mkdir ~/.nodebrew
mkdir ~/.nodebrew/src
```
再度実施すると無事インストールできました


### インストールされているNodeのバージョンの確認

```shell-session
$ nodebrew list
v6.9.1
```

### バージョンを指定
```shell-session
nodebrew use  v6.9.1
```

### パスを通す

~/.bash_profile にパスを追記.bash_profileがなければ作成

```shell-session:.bash_profile
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

別のコンソールを立ち上げ、パスが通っているかとVersion確認
```shell-session:.bash_profile
$ node -v
v6.9.1
```


## node.jsでHello world

http://nodejs.jp/nodejs.org_ja/
に書いてあるとおりなんですが

example.jsを作成して

```js:example.js
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
```

実行して

```
$ node example.js
Server running at http://127.0.0.1:1337/
```

ブラウザで
```
http://localhost:1337/
```
にアクセスしてHello Worldが出れば成功
時間と今日の天気を表示させてみたｗ

どうもこんにちわ。
現役学生のrirocanです

時間と今日の天気を表示させてみたｗ

```time.py

# -*- coding: utf-8 -*-
import datetime#基本的な日付型および時間型
import multiprocessing#API を使ってプロセスを生成することができる。
import urllib2, sys#URL を開くための拡張可能なライブラリ。
import json

try: citycode = sys.argv[1]
except: citycode = '090010' #デフォルト地域

todaydetail  =    datetime.datetime.today()# 今日の日付
resp = urllib2.urlopen('http://weather.livedoor.com/forecast/webservice/json/v1?city=%s'%citycode).read()#今日の天気
resp = json.loads(resp)
print '----------------------------------------------------------------------------------------'

print todaydetail# 今日の日付
print '----------------------------------------------------------------------------------------'
print resp['title']#今日の天気
print resp['description']['text']
print '----------------------------------------------------------------------------------------'


```
Firefox 49.0をビルドして実行する

# Firefox 49.0をビルドして実行する
## 環境
Ubuntu14.04 LTS

## Download方法
[Downloading Source Archives - Mozilla | MDN](https://developer.mozilla.org/ja/docs/Mozilla/Developer_Guide/Source_Code/Downloading_Source_Archives)
こちらに従ってfirefoxのソースコードをダウンロードします。
念の為ダウンロード方法を丁寧に記載しておくと、[ここ](http://releases.mozilla.org/pub/firefox/releases/49.0/source/)にあるfirefox-49.0.source.tar.xzをダウンロードしてください。

tar.xzファイルの解凍については[このサイト](http://qiita.com/ymaru/items/87fbc4e68f5995d3964c)によると以下のようにするそうです。

    $ tar Jxfv xxx.tar.xz

あるいは

    $ tar xvf firefox-49.0.source.tar.xz

としても問題なさそうです。

## ビルドの方法
参考にしたサイト
[Configuring Build Options - Mozilla | MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Configuring_Build_Options)

    $ cd firefox-49.0
として展開したfirefoxのディレクトリに移ってから、そこにビルドする上でデバッグオプションをつけるために以下の内容が書かれた.mozconfigファイルを作成します。

```text:.mozconfig
ac_add_options --enable-debug
ac_add_options --disable-optimize
```
ビルドするには以下のコマンドを実行してください。

    $ ./mach build
おそらくどこかでパッケージが不足しているためビルドが止まると思います。その場合は必要なパッケージをインストールしてビルドし直す必要があります。以下が私の環境で不足していたパッケージのインストール方法です。

    $ sudo apt-get install autoconf2.13 libgtk2.0-dev libgtk-3-dev libgconf2-dev libdbus-glib-1-dev yasm libasound2-dev libpulse-dev libxt-dev
パッケージがそのままの名前で出てこない時は先頭にlibをつけるとインストールするできる場合があります。
例えば今回であれば

    $ sudo apt-get install dbus-glib-1-dev
などしても**インストールできません**。

ビルドにはかなり時間がかかります。参考までに、スペックの高い方のパソコン(Intel(R) Core(TM) i7-3630QM CPU @ 2.40GHz x 8core, メモリ:16GB)だと20分、低い方のパソコン(CPU:Intel(R) Celeron(R) CPU  N2920  @ 1.86GHz
 x 4core, メモリ:4GB)だと120分ほどかかりました。
なおCPUの使用率はほぼ100%となります。高い方のパソコンだとメモリは約10GBほど、低い方のパソコンではメモリはほぼすべて使用しました。パソコンのスペックが低い場合はパソコン上での別の作業に支障をきたすため他の作業はしないほうがいいかもしれません。
なお、二回目のビルド以降は変更部分だけビルドするためこれほど時間はかからないです。

## 実行方法
    $ ./mach run
と入力すれば実行できます。

## 補足
実行は以下のコマンドでも行えます。

    $ ./obj-x86_64-pc-linux-gnu/dist/bin/firefox
obj-x86_64-pc-linux-gnuの部分は環境によると思われます。このコマンドによって実行すると、普段使用しているfirefoxの設定が読み込まれるといったような違いが生じます。他にも生じていると思われるのでこちらのコマンドを使用することはおすすめしません。なお、./mach runを実行した時にこのファイルがいくらかのオプションを付けて動作していることがpdbで./mach runの挙動を追いかけるとわかります。

## 最後に
Firefoxを大学の講義の一環でいじっています。[ここ](http://qiita.com/kagutitan/private/3243a2cce3a4a80b9c1a)にその目次がありますので興味がある方は見てみてください。
Aruba gem 関連情報まとめ

Aruba gem 関連の記事を色々書いたので各記事へのリンク集です。

* [Aruba gemでCLIのテストを支援する](http://qiita.com/tbpgr/items/41730edcdb07bb5b59ad)
* [Aruba gem - Configuration](http://qiita.com/tbpgr/items/0b7a88b0c8ef07b10e79)
* [Aruba gem - Hooks](http://qiita.com/tbpgr/items/5552e43b0730b239407a)
* [Aruba gem - REPL](http://qiita.com/tbpgr/items/c1c58c3d11da3b3f9ee9)
* [Aruba gem - Environment](http://qiita.com/tbpgr/items/fd1dfc85a341a8c59b96)
* [Aruba gem - Filesystem](https://qiita.com/tbpgr/items/6228c09b389412abd237)
* [Aruba gem - Text](https://qiita.com/tbpgr/items/fb1ae090f77f359247b1)
* [Aruba gem - Matcher](https://qiita.com/tbpgr/items/175db3693d5d1d687db8)

## 関連資料
[記事中で利用しているサンプルコード - GitHub](https://github.com/tbpgr/aruba_samples)
Aruba gem - Text

Aruba の Text 周りの機能についてまとめます。

## <i class='fa fa-flask'></i> サンプル
### <i class='fa fa-check'></i> extract_text
文字列からANSI escape codeを取り除いた値を取得します

```ruby
require 'spec_helper'

RSpec.describe 'extract_text', type: :aruba do
  before(:each) { run("echo -n \"\e[31mhoge\"") }
  before(:each) { stop_all_commands }

  it { expect(unescape_text(last_command_started.output)).to eq "\e[31mhoge" }
  it { expect(extract_text(unescape_text(last_command_started.output))).to eq 'hoge' }
end
```

* 実行結果

```sh
$ rspec -fd -c spec/text/extract_text_spec.rb

extract_text
  should eq "\e[31mhoge"
  should eq "hoge"

Finished in 0.11998 seconds (files took 0.23258 seconds to load)
2 examples, 0 failures
```

## <i class='fa fa-pencil'></i> その他
その他に `sanitize_text` , `unescape_text` などの機能があります。  
詳細は外部資料のリンクをご確認ください。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class='fa fa-external-link'></i> [Text - Aruba - docs](http://www.relishapp.com/cucumber/aruba/v/0-11-0/docs/text)
FacebookまじでReact Nativeやるってよ！

# 最初に
~~タイトルは釣りです。いや、釣りでもないかw~~

アプリ開発は[React Native](https://facebook.github.io/react-native/releases/next/)を使ってます。
React.jsの手馴染みが良く、
"learn once, write anywhere"をうたっているReact。
延長線でかけるReact Nativeはかなり良いです。

[Coiney(窓口)](https://medium.com/coiney-product-team/web%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8Creact-native%E3%81%A7%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F-a11678684548#.bvuxhcfpx)さんの様に、プロダクトに導入されている事例もちらほら出てきてます。

また、Facebookは初期から、React Nativeを使った
Facebook Groups、Facebook Ads Managerを開発しており、開発言語だけにとどまらず、プロダクトでもリードをしてくれています。

# でもやっぱり不安。。。

しかし、ただ。ただ。。。やっぱり不安がありました。それは。。。

**本命のFacebook AppがReact Nativeではないこと!!**

Facebook appはおそらく世界中で一番使われているアプリの一つです。

安定稼働させてるのを言語変えてまで１から作り直す必要はないだろなー。
確実に凄腕のiOSとAndroid技術者と凄いチームあるはずだし、そんなリスクあることしねーだろなー。
今は盛り上がっているけど、徐々に徐々に更新頻度が下がっていき、見放されてかねーかなー。
Parseの例や、HTMLからの大転換もあるし梯子外されないか心配だなぁー。
と一抹の不安を抱いてました。

※特にクロスプラットフォームともなれば、iOS、Androidのバージョンに引っ張られる制約も多い１大OSSなので、
どれだけイニシアティブをとって開発をしていくかがかなり重要になると思ってます。（Xamarinが良い例。MSの傘下にもなったし）

# Showcaseを見てみると。。。

version:0.21
<img width="1265" alt="スクリーンショット 2016-10-20 20.17.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/56423/b2696c22-d48e-a37d-2ac5-91d04af07809.png">
http://facebook.github.io/react-native/releases/0.26/showcase.html

version:0.29
<img width="1266" alt="スクリーンショット 2016-10-20 20.18.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/56423/bdb8ead0-982b-16b3-0d96-5c5e2ac081de.png">
http://facebook.github.io/react-native/releases/0.29/showcase.html

(　ﾟдﾟ) ・・・ (つд⊂)ｺﾞｼｺﾞｼ (；ﾟдﾟ) ・・・

えっ！？　Facebookアプリ React Nativeに変わっとるやないかい！！

version:0.35
<img width="1264" alt="スクリーンショット 2016-10-20 20.18.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/56423/0afd6e21-64ed-0dec-fb5b-746469c3e4df.png">
https://facebook.github.io/react-native/showcase.html

(　ﾟдﾟ) ・・・  (つд⊂)ｺﾞｼｺﾞｼ  (；ﾟдﾟ) ・・・  (つд⊂)ｺﾞｼｺﾞｼｺﾞｼ  （；ﾟ Дﾟ） …！？

えっ！？えっ？？　 Instagram, Airbnbが追加されとる！？！？

**FacebookまじでReact Nativeやってるってよ！！**

# 追記1
Facebookや、Instagram、airbnbなど名だたるサービスにReact Nativeが採用されたのは衝撃的なことだと思っています。
なぜなら、クロスプラットフォームでここまで大きいサービスに導入された事例を僕は知らないからです。
言語を開発しているコミュニティが一番盛り上がっていて、プロダクト導入事例はあまりない。なんて良くあることです。
世界的プロダクトに導入されたニュースは他の開発事例への追い風となると思っています。

# 追記2
["learn once, write anywhere"](http://qiita.com/gonta616/items/050a72aadcce44ec9774?utm_campaign=popular_items&utm_medium=referral&utm_source=popular_items)について書きました。
gitの複数ファイルを一括で削除する

何処かで見かけた下記方法ではアラートが現れ削除できず…

> git rm `git ls-files --deleted`

```
error: unknown option `deleted`'
usage: git rm [options] [--] <file>...

    -n, --dry-run         dry run
    -q, --quiet           do not list removed files
    --cached              only remove from the index
    -f, --force           override the up-to-date check
    -r                    allow recursive removal
    --ignore-unmatch      exit with a zero status even if nothing matched
```

結局 xargs でOK。
> git ls-files --deleted | xargs git rm -f


Ref: "gitの複数のブランチを一括で削除する"
http://qiita.com/satoshi03/items/c53aab17f3270477e33a
espec_request_describerを作った

# TL;DR

[espec\_request\_describer](https://github.com/techno-tanoC/espec_request_describer)を作った。マクロや関数の動的呼び出しの知見が深まった。

# rspec-request_describer

[rspec\-request\_describer](https://github.com/r7kamura/rspec-request_describer)をご存知の方はその~~パクり~~移植だと思っていただければ分かりやすいと思います。

知らない方のためにちょっと説明すると、rspec-railsでfeature specなどでリクエストをするテストの時に、`describe "GET /users"`のように`HTTP_METHOD PATH`の形式でdescribeを書くと、それに沿ったリクエストを構築してくれるgemです。

例えば

```rb
describe "GET /users" do
  it { is_expected.to eq 200 }
end
```

と書くと、`describe`の内部に`subject do get "/users", {}`を追加してくれるイメージです。

結果として、`subject`が呼び出されてそのHTTPステータスコードが200であることをテストします。

# espec_request_describer

rubyに対して、rspecがあり、rspec-railsがあるのと同じように、elixirには[espec](https://github.com/antonmi/espec)があり、[espec\_phoenix](https://github.com/antonmi/espec_phoenix)があります。

rspec-request_describerが好きなので、especでも同様のことがしたくなり、espec_request_describerを作りました。

## サンプルコード

```ex
defmodule UserControllerSpec do
  use ESpec.Phoenix, controller: UserController, async: true
  use EspecRequestDescriber

  describe_request "GET /users" do
    it "returns 200" do
      expect(subject.status) |> to(eq 200)
    end
  end
end
```

`request_describe`を使ってリクエストを構築しています。
リクエストで返ってくるのは`%Plug.Conn{}`です。

`subject`でリクエストを飛ばして、その結果のステータスコードをテストしています。

## パラメータ

リクエストにパラメータを渡したい時は`let :params`します。パラメータはキーワードリストであることに注意してください。

```ex
defmodule UserControllerSpec do
  use ESpec.Phoenix, controller: UserController, async: true

  describe_request "POST /user" do
    let :params, do: [user: %{name: "hanamaru", email: "zura@gmail.com" }]

    it "returns new user" do
      subject.resp_body |> should(eq ~s({"data":{"email":"zura@gmail.com","name":"hanamaru","id":1}}))
    end
  end
end
```

## conn

plugの仕様上、headersやその他のリクエストに関わる値は`Plug.Conn`に入っています。

デフォルトでは`build_conn`が使われますが、sessionやheadersなどを書き換えたい時は`let :conn`で`put_session`や`put_req_header`などしてください。

## 埋め込み

rspec-request_describerと同様にパス中に`:id`があると、`let :id`で宣言したものを埋め込みます。`:id`以外にも任意の変数名が使えるので、好きなように埋め込んで下さい。

良い方法かはともかく、`user_path`などのヘルパーが使いたい時は

```ex
describe_request "GET :path" do
  let :path, do: user_path(build_conn, :index)

  it do: subject
end
```

してください。`let :request_path`でも一応可能です。

## rdescribe

especには`xdescribe`や`fdescribe`のような関数があるようなので、アナロジーで`rdescribe`に`describe_request`のエイリアスを作ってあります。

# 知見

## 関数の動的呼び出し

埋め込みを行う際、文字列から関数を呼び出すために`apply/3`を使って、動的に関数(`let`で宣言したもの)を呼び出しています。`let`で宣言したものがどうなっているのか分かりませんが、なんかうまく動くので良しとします。

![Screenshot from 2016-10-13 11-37-39.png](https://qiita-image-store.s3.amazonaws.com/0/49469/0832f6e6-281c-3027-a49d-e7767fad6ef9.png)

例えばespec_request_describerの内部ではパスに`":id"`がある時は

```ex
apply(__MODULE__, :id, [])
```

みたいなことをしています。第一引数が呼ぶ関数のモジュール名、第二引数が関数名、第三引数が引数のリストです。

## マクロの使い方

関数内のローカル変数を参照したい時は`var!`を使えばよいのは知っていましたが、マクロを呼び出した側のモジュールの関数の呼び出し、マクロを定義してある側のモジュールの関数の呼び出しがどうなるのかは知りませんでした。

結論としては、「ASTで構築したコードがそのまま展開される」というイメージで良いと思いました。つまり、マクロを呼び出した側のモジュールの関数は修飾なしで呼べ、マクロを定義してある側のモジュールの関数は修飾名で呼ぶ必要があります。

## 名前

モジュールの名前が`EspecRequestDescriber`になっていますが、`ESpec`に合わせてsを大文字にした方が良いのでしょうか・・・

### help

英語力が低すぎてgithubのREADMEがあまり書けていません。添削してくださる方のPRを待っています。
Reactコンポーネント内のメソッドの順番をESLintでチェックする(eslint-plugin-react/sort-comp)

React コンポーネントを書くとき、基本的に

- イベントハンドラ系のメソッドは `on~` で始める
- `render` が長くなってきたらメソッドに切り出し、`render~` という名前にする
- ライフサイクル系のメソッドは先に書く
- render 系のメソッドは最後にまとめて書く（一番最後が `render`）

といったような自分ルールを設けてます。

せっかくなのでこれも ESLint でチェックできないかと思って調べてみたら
eslint-plugin-react にちゃんとそういうルールがありました。

https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-comp.md


## デフォルトのルール

デフォルトのルールでは以下のような順番だそう。

1. static メソッドやプロパティ
2. ライフサイクルメソッド
3. 独自で定義したメソッド
4. `render`

このうち、2 のライフサイクルメソッドとは、具体的には以下のメソッド。順番もこの順。

- displayName
- propTypes
- contextTypes
- childContextTypes
- mixins
- statics
- defaultProps
- constructor
- getDefaultProps
- getInitialState
- state
- getChildContext
- componentWillMount
- componentDidMount
- componentWillReceiveProps
- shouldComponentUpdate
- componentWillUpdate
- componentDidUpdate
- componentWillUnmount

## カスタマイズする

このルールを自分好みにカスタマイズするには、`.eslintrc` にルールを記述します。

```javascript:.eslintrc
{
  "extends": "airbnb",
  "rules": {
    "react/sort-comp": [2, {
      order: [
        'type-annotations',
        'static-methods',
        'lifecycle',
        '/^on.+$/',
        'everything-else',
        'rendering',
      ],
      groups: {
        rendering: [
          '/^render.+$/',
          'render',
        ],
      },
    }],
  }
}
```

`react/sort-comp` の第二引数にオブジェクトを記述します。
オブジェクトの `order` に、チェックしたいルールを好きな順番で記述していきます。

`order` に指定できるのは `static-methods` や `lifecycle` など最初から使えるグループに加え、

```javascript
"/^on.+$/"
```

のように正規表現で指定したり、

```javascript
  'rendering',
],
groups: {
  rendering: [
    '/^render.+$/',
    'render',
  ],
},
```

のように、`groups` 部分に独自のグループを定義して、そのグループ名を `order` 内で使うといったこともできます。

というわけで上記の例では

- `type-annotations`: Flow 用。`type Props` が先頭に必要？（まだ Flow 試せてない）
- `static-methods`: static メソッド
- `lifecycle`: ライフサイクルメソッド
- `/^on.+$/`: `on~` で始まるイベントハンドラ
- `everything-else`: その他
- `rendering`: `render~` メソッド群と、最後に `render`

という順番でないと lint エラーになるよう設定できました。


## eslint-config-airbnb でも指定されてた

後でわかったんですが、eslint-config-airbnb 使っていれば定義済みですね。
https://github.com/airbnb/javascript/blob/master/packages/eslint-config-airbnb/rules/react.js#L204-L216

```javascript:rules/react.js(抜粋)
// Enforce component methods order
// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/sort-comp.md
'react/sort-comp': ['error', {
  order: [
    'static-methods',
    'lifecycle',
    '/^on.+$/',
    '/^(get|set)(?!(InitialState$|DefaultProps$|ChildContext$)).+$/',
    'everything-else',
    '/^render.+$/',
    'render'
  ],
}],
```

だいたい一緒だし、わざわざ自分で定義する必要なかったなあ。
aitendoのUSB-RS485変換モジュールを使う


もうディスコンですが、半額セールしてたときに買ってきた。

[高性能USB-TTL/485コンバータ [FT-UBF-TTL485]](http://www.aitendo.com/product/10245)

- 115200だと動かない
- 9600だと動いた

続く...（続かないかも）
[Groovy]文章を解析して日本語を学びかけの宇宙人のようにする。

# 概要
現在31歳のおじさんである私の年代では、子供の頃に、`○○ ウソ ツカナイ`というように文章をカタカナにして必要最低限な部分のみ使う、というような遊び（？）がありました。
○○の部分は現在ではもしかしたら問題のある表現かも知れませんので、ココでは宇宙人とします。
とうことで、文章を解析して必要最低限な部分のみ抽出して、それっぽくなるように各単語をシャッフルして、さらにそれっぽくカタカナのみ利用する、というスクリプトをGroovyで記述しました。

こんなスクリプトが、**手動での外部ライブラリのダウンロード、設定や、ビルドツールを使ったコンパイル&実行を 必要とせず**、さらにコレだけ **短いコードで実現できてしまう[Apache Groovy](http://groovy-lang.org/)は本当に素晴らしい言語ですね！**

# コード

```groovy
@Grapes([
    @Grab(group='com.atilika.kuromoji', module='kuromoji-ipadic', version='0.9.0')
])

import com.atilika.kuromoji.ipadic.Token
import com.atilika.kuromoji.ipadic.Tokenizer

Tokenizer tokenizer = new Tokenizer()

// 読み（カタカナ）の抽出
// 動詞の分割がちょっと微妙なので本当は動詞の場合はさらにbaseFormからゴニョゴニョしたい
def toReading = { Token token ->
    token.reading == '*' ? token.surface : token.reading
}

// 必要な種類の単語のみ抽出
def withThisCondition = { Token token ->
    token.partOfSpeechLevel1 in ['動詞', '名詞', '助動詞', '副詞', '形容詞']
}

// 別に態々メタクラスに追加する必要は無いけどカッコいいので！
// （今回のような場合はmetaClassに直接じゃなくてCategoryクラスでやった方がいいけど）
List.metaClass.shuffle = {
    List<Token> list = delegate
    Token first = list.find{Token t -> t.partOfSpeechLevel1 == '名詞'}
    List<Token> remains = list.findAll{it != first}
    Collections.shuffle(remains)
    [first] + remains
}

// 解析&翻訳（？）
List<Token>tokens = tokenizer.tokenize("プログラミング言語Apache Groovyは本当に素晴らしいプログラミング言語です")
println tokens.findAll(withThisCondition).shuffle().collect(toReading).unique().join(" ")
```
たったコレだけのコードです。
実行結果は毎回ランダムに変わります。例えば今回のサンプルでは
**"プログラミング言語Apache Groovyは本当に素晴らしいプログラミング言語です"**
を解析して、その結果は、

```text
プログラミング ゲンゴ デス Groovy スバラシイ Apache ホントウニ
```
のようになります。
とてもそれっぽい！

吾輩は猫である、の冒頭も試してみます。

```groovy
List<String> values = [
    "吾輩は猫である。",
    "名前はまだ無い。",
    "どこで生れたかとんと見当がつかぬ。",
    "何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。",
    "吾輩はここで始めて人間というものを見た。",
    "しかもあとで聞くとそれは書生という人間中で一番獰悪な種族であったそうだ。"
]

values.each { String line ->
    println tokenizer.tokenize(line).findAll(withThisCondition).shuffle().collect(toReading).unique().join(" ")
}
```

結果は

```
ワガハイ ネコ アル デ
ナマエ マダ ナイ
ドコ トウ ツカ ヌ ケン タ ケントウ ウマレ トント
ナニ ウスグライ ジメジメ イル シ タ ニャーニャー トコロ キオク ナイ イタコト
ワガハイ ニンゲン モノ ハジメ ココ タ ミ
アト ソウ ドウ アッ ニンゲン ダ ソレ イチバン シュゾク ショセイ キク チュウ アク タ デ ドウアク
```

# まとめ
プログラミング スバラシイ ゲンゴ ホントウニ デス Groovy Apache
注目すべきはやはり、[Apache Groovy](http://groovy-lang.org/)が如何に優れたイケメンプログラミング言語か、という点ですね。

なお、別の方のCommon Lispで実装されたイカれたバージョンがあるのでそちらもどうぞ！
[Lispで日本語を宇宙人言葉にする](http://progn.hateblo.jp/entry/20161021/1476978400)

# 参考資料
[[Groovy]たった1スクリプトで形態素解析！](http://qiita.com/saba1024/items/85ff23531105cfbba78e)
[[Groovy]たった1スクリプトで形態素解析！ -少し詳細編-](http://qiita.com/saba1024/items/67ef29bedc01386878d7)
[Apache Groovyチュートリアル（非公式）](http://koji-k.github.io/groovy-tutorial/)
Property or method "index" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option. (found in component )


## 現象

Vuejs 2.X環境でチュートリアルをしていたところ、ToDoアプリケーションのところで以下のwarningが表示された。

```
main.js:20715 [Vue warn]: Property or method "index" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option. (found in component )
```

## 解決

2.xだと、以下の通り修正しないといけないみたい

```
            <li v-for="todo in todos">
                <span>{{ todo.text }}</span>
                <button v-on:click="removeTodo(index)">X</button>
            </li>
```

を

```
            <li v-for="(todo, index) in todos">
                <span>{{ todo.text }}</span>
                <button v-on:click="removeTodo(index)">X</button>
            </li>
```

warningは消えました
[Make] make実行時の詳細表示有効化メモ

Makefileで実行されるコマンドの詳細表示有効化メモ

# autotools, CMake で生成したMakefileの場合

```console
$ make VERBOSE=1
or
$ make V=1
```

# 自前で作成したMakefileの場合

```console
$ make SHELL='sh -x'
```

# 参考
[makefile - How do I force make/gcc to show me the commands? - Stack Overflow](http://stackoverflow.com/questions/5820303/how-do-i-force-make-gcc-to-show-me-the-commands)
What to check when React Native `npm start` and Jest don't work

There seems to be a problem with watchman where it leaves its own files in an invalid state and doesn't know how to clean up after itself, making all programs relying on it to just hang.

The solution I've found to this is to remove everything inside `/usr/local/var/run/watchman/${YOUR_USER}-state`.

So the next time `jest` and `npm start` in your React Native projects just freezes, I know where I'm looking first.