OmniAICreator/Qiita-1.07M huggingface dataset:
shellscriptで小数演算


shellscriptで小数演算をしたかったのでメモ。

## <i class="fa fa-terminal"></i> 小数演算
###`echo`と`bc`を利用
`expr`コマンドなどは小数演算できないので、
`echo`コマンドで数式を作成し、それを`bc`コマンドに渡して計算する。

```sh
RESULT=`echo "scale=5; 10.0 / 3.0" | bc`
echo $RESULT
#=> 3.33333
```

小数点以下の桁数を`scale`にて指定する。

## <i class="fa fa-pencil-square-o"></i> 指定桁数出力
演算の精度を保つため、上記のように計算は小数点以下5桁で行うけれど、表示は小数点以下2桁とかにしたい場合
（というか、桁数を指定したい場合）

```sh
RESULT=`echo "scale=5; 10.0 / 3.0" | bc`
printf "%.2f" $RESULT
#=> 3.33
```

`printf`で桁数を指定。


<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
Fcitxで日本語のインライン入力がおかしくなった時の解決法

取り敢えず自分の環境で解決出来たので書いてみたいと思います。
地味に悩まされてたので解決出来て良かったー。(´・ω・｀)

環境は
ubuntu 15.10
fcitx 4.2.9
です。

##Fcitxのインライン入力がおかしい…
日本語のインライン入力がしたいのに、インライン表示（打ってる文字が表示）されない…
変換候補は出てきて、エンター押すとちゃんと入力出来るんだけど地味に不便…

皆さんはそんな症状になった事がありませんか？

「ソフトウェアの更新」で直ったりする場合もあったのですが、最近はずっとその症状が出てて困っていました…
(´・ω・｀)

##解決法

※追記でーす。
またも同じ症状になってしまったのですが、やはり

```zsh
rm -rf ~/.config/fcitx
```
で設定を消して再起動するだけで直りましたー。

以下の物は蛇足感がありますが、一応残しておきたいと思います…

<br>

で、解決法ですが、取り敢えず色々Fcitxに関連するパッケージを入れていたので一旦全てpurgeしました。
そして↓の「Japanese Teamによる追加パッケージ」を使ってFcitxを入れ直したのですが、それでも直らず…
https://www.ubuntulinux.jp/japanese

なんか古い設定が残ったままになってる感じだったので

```zsh
rm -rf ~/.config/fcitx
```
で設定を消して、再起動したら直りましたー！
ヽ(=´ω`=)ﾉ

もしかしたら設定を消して再起動するだけで直るかもです…ｗ
(´・ω・｀)

同じ症状で困っている人が居たら、是非一度試してみて下さーい。
embulkのjava pluginをbundlerっぽくgithubからインストールして実行できるラッパーを作った

2016/2/29 追記
こっちの方法の方が安定するかも。 [embulk bundleだけでJavaで書かれたプラグインをインストールし利用する方法 - Qiita](http://qiita.com/joker1007/items/4e1c5eb6e60f80e75376 "embulk bundleだけでJavaで書かれたプラグインをインストールし利用する方法 - Qiita")

----

今週末の成果として、タイトル通りの機能を持った[embulk_javundler](https://github.com/joker1007/embulk_javundler "joker1007/embulk_javundler: Install embulk java plugin from git repository")というgemを作りました。

モチベーションとしては、javaのプラグインで開発中だったりgemとしてリリースするまでもないプライベートなプラグインをgitのリポジトリから直接インストールして使いたかったからです。
普通にjrubyのgemとして作成されているプラグインはembulk自体が持つbundle機能でインストールできるんですが、javaのプラグインはbundlerでは検知できないので、こういう仕組みが必要でした。

めっちゃ雜に作ったので、細かい挙動は何かおかしいかもしれません。名前もちょっと適当感があるw

仕組みは単純で、DSLを記述したファイルから情報を読み込んで、`git clone`してから`./gradlew gem`やってコンパイルするだけです。
そしてembulkコマンド実行時に、インストール先のディレクトリ情報からlibpathを自動でコマンドに付与します。


Embulkfileというファイルを作って以下の様に記述します。

```
java_plugin "embulk-input-jdbc", github: "joker1007/embulk-input-jdbc", commit: "support-json-type", libdir: "embulk-input-postgresql/lib"
java_plugin "embulk-output-bigquery", github: "embulk/embulk-output-bigquery"
```

これはRubyのDSLになってます。
`libdir`を指定することで、embulk-input-jdbcの様にサブプロジェクトを持つタイプのプラグインにも対応できます。

後は、bundlerっぽくコマンドを実行します。

```sh
$ embulk_javundler install --path .embulk_plugins
$ embulk_javundler guess base.yml -o config.yml
$ embulk_javundler preview config.yml
$ embulk_javundler run config.yml
```

~~runじゃなくてexecになってるのは、CLIを作るライブラリとして利用したthorでrunが予約語になってて泣いたからです……。~~

__追記: コメントで回避方法を教えてもらったのでrunで実行できるようにしました。違ってるとややこしいし。__

インストール後にはEmbulkfile.lockというファイルを生成し、同じコミットを利用する様になってるはずですが、細かく動作検証してないのでバグってるかもしれない。

Embulkfileという名前とかコマンド名とかコマンドインターフェースは深く考えてないので、将来的に変える可能性もあります。
hadoop 2.6.3 + tachyon 0.8.2環境の構築

```
wget http://tachyon-project.org/downloads/files/0.8.2/tachyon-0.8.2-bin.tar.gz

tar xvzf tachyon-0.8.2-bin.tar.gz

cd tachyon-0.8.2

mvn -Dhadoop.version=2.6.3 -DskipTests clean package
```

- edit slaves and workers
- set hadoop namenode in tachyon-env.sh

```
./bin/tachyon copyDir /opt/tachyon
./bin/tachyon format
./bin/tachyon-start.sh all Mount
./bin/tachyon runTests
```
webrickでサーバー作った


今回遊びでwebrickでwebサーバーを作ったので。

### webrick?
Rubyに標準添付されているサーバー用のフレームワーク。
ちょこっとコードを書くだけでサーバーが作れる。


```webrick.rb
require 'webrick'

srv = WEBrick::HTTPServer.new({
  DocumentRoot:   './',
  BindAddress:    IPアドレス,
  Port:           ポート,
})

srv.start
```

で、実行。
以下のような待ち状態になればOK


```
[vagrant:ruby] $ ruby webrick.rb
[2016-02-14 21:59:58] INFO  WEBrick 1.3.1
[2016-02-14 21:59:58] INFO  ruby 2.3.0 (2015-12-25) [x86_64-linux]
[2016-02-14 21:59:58] INFO  WEBrick::HTTPServer#start: pid=17156 port=20000
```

そしてブラウザなり他のウィンドウからリクエストを送って動作確認。


これだけで一応動いてしまう。


### htmlを返す
ルートパスにきたら、htmlファイルを返すようにする。
webrickが動いているコードと同じディレクトリに

```index.html
<html>
	<head></head>
	<body>
		<h1>テスト</h1>
	</body>
</html>

```

そして、webrick.rbに以下を追加。

```webrick.rb
srv.mount('/', WEBrick::HTTPServlet::FileHandler, 'index.html')
```

ブラウザアクセスでテストが表示されたらok


こんな書き方もできる。

```webrick.rb
srv.mount_proc '/' do |req, res|
  File.open("index.html") do |f|
    res.body = f.read
  end
end
```


### パラメータを処理する

次はパラメータを受け取ってみましょう。

先ほどのコードを少しいじります。

```
srv.mount_proc '/' do |req, res|
  res.body = req.query['a']
end
```

そして、ipアドレス:ポート/?a=hoge
にアクセスしてhogeが表示されたら完了



### CGIHandlerを使う

以下のコードをwebrick.rbに追加

```webrick.rb
srv.mount('/cgi', WEBrick::HTTPServlet::CGIHandler, './cgi.rb')
```

同じディレクトリにcgi.rbを用意

```cgi.rb
require 'cgi'

cgi = CGI.new
cgi.out(type: 'text/html',
        charset: 'UTF-8') do
  get = cgi['a']
  "<html><body><p>#{get}</p></body></html>"
end
```

ipアドレス:ポート/cgi?a=hoge
にアクセス。
Netbeans いろいろ

# プラグイン
## UML
1. ツール→プラグイン→設定→追加、でアップデート・センター・カスタマイザを開く
2. 
# ショートカット

| key | 用途 |Eclipse|
|:-----------|:------------|:------------|
|[alt]+[shift]+[o]|リソース検索|[ctrl]+[shift]+[r]|
|[ctrl]+[o]|型検索|[ctrl]+[shift]+[t]|
|[alt]+[shift]+[F12]|型階層|[ctrl]+[shift]+[h]|
|[ctrl]+[alt]+[t]|Junit移動|[ctrl]+[9]|
KatsuhiroMorishita/Aso_Sea_Clouds_Pridictionを試してみるメモ～学習の部分を除く～

## はじめに

熊本県阿蘇の雲海予測をツイートしている、[@unkaitter](https://twitter.com/unkaitter "うんかいったー")の機械学習器が公開されているので、自分でも試してみるメモです（自分も関係者ですが機械学習器以外を開発）。

ソースコードを取得して、学習済みの結果でもって明日の雲海予測をツイートすることがゴールです。

今週末に機械学習器をいじる[ワークショップ](https://www.facebook.com/events/1026361180764544/ "うんかいったー交流会 ～雲海に浮かぶラピュタへ行こう～")があるので、その前の予習として。

## 環境

IDCFクラウドの仮想マシン

* イメージ 	Ubuntu Server 14.04 LTS 64-bit
* OSタイプ 	Ubuntu 12.04 (64-bit)
* 仮想マシンタイプ	light.S1 ( 1 CPU x 0.8 GHz / 1GB RAM )

## Python環境準備

### Anacondaダウンロード

https://www.continuum.io/downloads#_unix

![image](https://qiita-image-store.s3.amazonaws.com/0/69418/32aed85a-1d8b-d2f9-9252-97a409460341.png)

```
root@m1:/tmp# wget https://3230d63b5fc54e62148e-c95ac804525aac4b6dba79b00b39d1d3.ssl.cf1.rackcdn.com/Anaconda3-2.5.0-Linux-x86_64.sh
```

### Anacondaインストール

```
root@m1:/tmp# bash Anaconda3-2.5.0-Linux-x86_64.sh
```
以下のように答えてインストール終了

* Please, press ENTER to continue >>> ENTER
* Do you approve the license terms? [yes|no] >>> yes
* Anaconda3 will now be installed into this location: >>> /usr/local/anaconda3
* PATH in your /root/.bashrc ? [yes|no] >>>yes

Anacondaの文字と一緒にpython3になっていればOK

```
root@m1:/tmp# source ~/.bashrc
root@m1:/tmp# which python
/usr/local/anaconda3/bin/python
root@m1:/tmp# python -V
Python 3.5.1 :: Anaconda 2.5.0 (64-bit)
```

### OAuth認証のためのPythonライブラリを入手

```
root@m1:/tmp# pip install requests requests_oauthlib
root@m1:/tmp# pip list | grep requests-oauthlib
requests-oauthlib (0.6.0)
```

## ソースコード入手

後々プルリクしたりするかもしれないので、forkします。

### GitHubでFork

以下にアクセス
https://github.com/KatsuhiroMorishita/Aso_Sea_Clouds_Pridiction

Forkボタンを押す
![image](https://qiita-image-store.s3.amazonaws.com/0/69418/2d90fca0-b5d2-4756-eedf-807d198020d1.png)

URLをコピー
![image](https://qiita-image-store.s3.amazonaws.com/0/69418/19ab4c86-0d79-6946-92eb-b71f2ba65953.png)

### GitでClone

```
m1:~/work> git clone https://github.com/makoragi/Aso_Sea_Clouds_Pridiction.git
```

## ようやくツイート

### Twitterの認証情報をセット

ここを参考にTwitterの認証情報を取得する。
[Twitterアプリケーションの作成](http://website-planner.com/twitter%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90%EF%BC%88consumer-key%E3%80%81consumer-secret%E3%80%81access-token%E3%80%81access-token-secret/)

キーなどを記載した4行のテキストファイルを準備（<<ほげほげ>>の部分は書き換えてください）

```
m1:~/work/Aso_Sea_Clouds_Pridiction> cat ../tweet_key.txt
<<Consumer Key>>
<<Consumer Secret>>
<<Access Token>>
<<Accesss Token Secret>>
```

### ツイートするコードを編集

必要に応じて twitter_bot.py を編集
元コードは運用と同じく16時と23時に実行することになっていますが、私はすぐに実行したかったのでちょっといじりました。

```
m1:~/work/Aso_Sea_Clouds_Pridiction> vi twitter_bot.py
```

詳細は以下のブランチ
[ea92900f739d63a2f131c6db303ee53b164e9043](https://github.com/makoragi/Aso_Sea_Clouds_Pridiction/commit/ea92900f739d63a2f131c6db303ee53b164e9043)

### 予測&ツイート

```
m1:~/work/Aso_Sea_Clouds_Pridiction> python twitter_bot.py
:(省略)
【unkaitter bot test】2016-02-15に雲海が出る尤度は0.3です。2016-02-14 22:37:21.797110
--tweet OK--
--done--
```

できたー（犬みたいな漢字が読めなかった）
![image](https://qiita-image-store.s3.amazonaws.com/0/69418/c23bebfe-16be-2811-f46e-7539bd8e98d4.png)

## さいごに

ということでツイートするところまで出来ました。
次は学習部分も実行したいです。
playframework2.4 + Angular2 + semantic ui + gulp

雑にやり過ぎてヤバイけど、とりあえずこういう形にすれば出来なくもないという雑サンプル

# リポジトリ
https://github.com/FScoward/fan-share-fun
※上記リポジトリを今後更新しないと思う（bitbucketのプライベートリポジトリでやるから）

とりあえずmysql立ててsql流してactivator runすれば動くかな？（適当）

# 内容
httpでjsonをgetするくらいはやってるのでそこそこのことは出来ると思う

# Angular2について
学習コストが高いらしい
どう作るのがベストなのかわからず探り探り作ったので、Angular2自体の学習コストが高いかどうかはちょっとわからんけど、今のところそんなに難しいものでもないと思う
ググれば大体情報あるし。
GlassFish(v4.1.1) 設定

#1 Oracle JDBC 設定
- jar 配置<br>
GlassFish のインストール先にある「glassfish\lib」ディレクトリへコピー
<hr>
- GlassFish起動<br>
起動が完了したら管理コンソールにログイン
<hr>
- JDBCコネクションプール作成<br>
--1 ［Resources > JDBC > JDBC Connection Pools］を選択<br>
--2 「New...」ボタンをクリックして新しくコネクションプールを作成<br>
--3　以下を入力して「Next」ボタンをクリック<br>
　　　［Pool Name］：任意<br>
　　　［Resource Type］：javax.sql.DataSource<br>
　　　［Database Driver Vendor］：Oracle<br>
--4　以下を入力して「Finish」ボタンをクリック<br>
　　　［Datasource Classname］：oracle.jdbc.pool.OracleDataSource<br>
　　　［User］：接続ユーザ<br>
　　　［Password］：接続パスワード<br>
　　　［URL］：jdbc:oracle:thin:@ホスト名:ポート:SID<br>
※2でInternal Server Error 発生の可能性あり<br>
　その場合、以下コマンド実施<br>
```
asadmin create-jdbc-connection-pool --datasourceclassname oracle.jdbc.pool.OracleDataSource --restype javax.sql.DataSource --property user=接続ユーザ:password=接続パスワード:url="jdbc\:oracle\:thin\:@ホスト名\:ポート\:SID" プール名
```
<hr>
- JDBCコネクションプール作成<br>
--1 ［Resources > JDBC > JDBC Resources］を選択<br>
--2 「New...」ボタンをクリックして新しくJDBCリソースを作成<br>
--3　以下を入力して「OK」ボタンをクリック<br>
　　　［JNDI Name］：任意<br>
　　　［Pool Name］：プール名<br>
※コネクションプール作成でエラーの場合、以下コマンド実施<br>
```
asadmin create-jdbc-resource --connectionpoolid プール名 任意
```

#2 認証認可の設定
- レルム作成<br>
--1 ［Configurations > server-config > Security > Realms］を選択
--2 「New...」ボタンをクリックして新しくレルムを作成<br>
--3　以下を入力して「OK」ボタンをクリック<br>
　　　［Name］：任意<br>
　　　［Class Name］：com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm<br>
　　　［JAAS Context］：jdbcRealm<br>
　　　［JNDI］：JNDI名<br>
　　　［UserTable］：Userテーブル名<br>
　　　［User Name Column］：User Id カラム名<br>
　　　［Password］：Password カラム名<br>
　　　［Group Table］：Groupテーブル名<br>
　　　［Group Table User Name Column］：Group User Id カラム名<br>
　　　［Group Name Column］：Group カラム名<br>
　　　［Password Encryption Algorithm］：digest-algorithm<br>
　　　［Digest Algorithm］：SHA-256<br>
　　　［Encoding］：Hex<br>
最適化でバラバラの写真を復元せよ！

# <i class='fa fa-camera-retro' /> 手掛かりはバラバラの写真
犯人のアジトに警察が踏み込んだところ、時すでに遅く、犯人は証拠の写真をシュレッダーにかけた後だった。
シュレッダーにかけられた短冊状の切れ端を並べ替えて、写真を復元しよう。

# <i class='fa fa-camera-retro' /> バラバラの写真の用意
## 写真を読み込む→変数ar
[stocksnap.io](https://stocksnap.io/photo/X8CW5LGMWI)の写真を使います。Pythonで読み込んでみます。

```py3:python3
import numpy as np, networkx as nx, matplotlib.pyplot as plt
from PIL import Image
from urllib import request
with request.urlopen('https://snap-photos.s3.amazonaws.com/'
                     'img-thumbs/960w/X8CW5LGMWI.jpg') as fd:
    im = Image.open(fd) # 写真読込
ar = np.array(im.convert('L').getdata()) # グレー('L')にして、np.ndarrayに変換
ar = ar.reshape((im.height, -1))
plt.imshow(ar, cmap='gray'); # 表示
```
![image](https://qiita-image-store.s3.amazonaws.com/0/13955/463b6b05-9b7e-f8b4-80aa-9cfb6fbce83e.png)

## 写真をバラバラにする→変数sp
20ピクセルごとに、横に切ってシャッフルして繋げます。

```py3:python3
wd = 20 # 短冊の幅
n = im.height // wd # 分割数
r = range(n)

sp = [ar[i*wd:(i+1)*wd] for i in r]
tmp = sp[1:]
np.random.seed(1)
np.random.shuffle(tmp)
sp = [sp[0]] + tmp # 先頭のみ同じ順番のままにし、残りシャッフル
plt.imshow(np.concatenate(sp), cmap='gray'); # バラバラの写真
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/8a2f07ed-2ca2-b553-0622-01a2770b33a5.png)

# <i class='fa fa-camera-retro' /> 考え方
n個の短冊に対し、つながるかどうかを2部グラフで考えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/0c9ac3a3-cc53-0224-1421-0a1450dfdb56.png)

すなわち、上のノードiと下のノードjを結んだときに、短冊iの下に短冊jを繋げることにします。
つなげたときに重みは、「短冊iの下1列のピクセルと短冊jの上1列のピクセルの差分の小さい値の50%のノルム」のマイナスとし、最小が0になるように調整します。
この2部グラフに対し、[組合せ最適化問題](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)の最大重みマッチング問題を解くことで、並べ方を求めることができます。

## 重みを計算する→wgt
下記のように計算します。

```py3:python3
nn = int(im.width * 0.5) # 50%を使う
t = [[np.linalg.norm(np.sort(np.abs(sp[i][-1] - sp[j][0]))[:nn])
      for j in r] for i in r]
wgt = np.max(t) - t
```

## 有向グラフを作成→g
上のノードを0...n-1とし、下のノードをn...2*n-1とします。このグラフは2部グラフです。

```py3:python3
g = nx.DiGraph() # 有向グラフ
for i in r:
    for j in r:
        if i != j:
            g.add_edge(i, j+n, weight=wgt[i][j])
```

## 解いて結果を表示します→mtc
2部グラフの最大重みマッチング問題を解きます。0から順番に結果(mtc)をたどると、つなぎ方がわかります。

```py3:python3
mtc = nx.max_weight_matching(g) # 最大重みマッチング問題を解く
# resに順番を入れる
i, res = 0, []
for _ in r:
    res.append(sp[i])
    i = mtc[i] - n
plt.imshow(np.concatenate(res), cmap='gray'); # 結果表示
```

![image](https://qiita-image-store.s3.amazonaws.com/0/13955/c6c0fc1f-9658-055f-659b-dbf9257b553f.png)

一応、うまくいきました。
【パズル６】ほとんどのエンジニアには解けるパズル６の事前告知

エンジニア向けのパズルシリーズの６作目を公開した。サイトにアクセスいただくとタイトルとパズルへの入り口が出る。
タイトルは「Hackipedia（Hackipediaはハッカーのための無料の百科事典）」とした。

<img width="364" alt="20160214215255 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/108761/08ad3462-ce96-f7b2-d62e-cf9d3a60df43.png">


前回のパズル５が大失敗だった。パズル５はめちゃくちゃカンタンなパズルにして誰でも解けるようにしたら、それがおもいっきりスベってしまったのだ。そんなモノは誰も求めていなかったことがはっきりした。その反省点を活かして今回はエンジニア向けの少し高度なパズルにした。（失敗の分析およびその詳細は[こちら](http://tango-ruby.hatenablog.com/entry/2016/02/09/013223)）今回のパズル６は技術要素が入っているパズルなので、もしそれらの技術をご存知なければ解くのが難しくなってしまう可能性がある。

私は前回のカンタンなパズルで失敗しても、いまだに「やたら難しいパズル」に対する嫌悪感がある。基本的にそういう難しいだけのパズルが嫌いなのだ。作った人の「おい！解いてみろ」という高飛車な態度が気に食わない。パズルなんて「みなさんに解いていただいてナンボ」と思っている。

そこで今回のパズル６においては、ある特定の技術をご存知なかった方や途中で詰まってしまった方向けに用意したのがタイトルにあるHackipediaという百科事典だ。これはパズルを解いた方はもちろん、まだ解いていない方も誰でもユーザー登録無しに書き込める知識共有のデータベースだ。
よく分からなくなった方で解答が欲しければそこに「○○が分からない！解答求む！」と質問を書けば、誰かが答えてくれるかもしれない。とても優秀な方で一瞬でパズルを解いてしまい、他の挑戦者にも解法を共有してあげようとお考えであれば、いくらでもお書きいただいて結構だ。

つまり今回のパズルはその気があれば**どんどんネタバレしていただいてOkですよ**、と。もしHackipediaのフォーマットが気に入らなければご自身のブログに詳細のコードなり、解法を書いて、そのリンクだけHackipediaに貼るという方法もOk。ブログ以外にもはてブでもTwitterでも解法を共有いただいておおいに結構だ。
ちなみにパズルの答えは挑戦者ひとりひとりにランダムに割り当ててある。スゴ腕エンジニアがパズルを解いて「おい、聞け。そこの答えは『３』だ。」とだけ書いてもほとんど参考にはならない。なぜならその人にとっては答えが３でも他の人にとってはその答えが５だったりするからだ。もし解法を共有するのなら、答えそのものを書くのではなく、その答えを導き出した方法を書いた方が有効だろう。作者としては単なる答えマル写しでパズルを終了されるより、多少はそれを解くプロセスを体験した上でパズルが面白いかどうかご判断いただきたいのだ。

初めての試みのため、そんなに解法を共有していただける気前のいい人が居るのかどうかすら、分からないのだが。

もちろん「オレは他人の手は借りねー。ひとりで十分だ」という一匹狼的なカッコいい方はどうぞご自由にHackipediaを使わずに解いてください。きっとウェブ系の技術をある程度ご存知の方であればそこまで時間をかけずに解けるレベルだと思う。

今回のはコードを書く技術も少し要求される。プログラム言語は問わないので、どんな言語であっても解ける。それも何十行、何百行も書く必要は無い。解答を確かめるために自身でコードを書いたが８行だけのシンプルなコードだった。エンジニア向けのパズルだが、分かっている人にとってはカンタンだろう。パズルを解くのに何時間もかからないよう短くまとめている。

後もうひとつ。そのHackipediaには作者である私は何があっても絶対に投稿しない。したがって投稿の中で「私はパズル作者なのだが。。。」とか「ジャバ・ザ・ハットリだがなー」とか書いている人が居たとしてもそれは１００％なりすましで、決して本人ではない。本当に私が何かパズルに関して書かなければならないことがあれば本ブログを通して書く。私は削除や編集をしない方針だ。（１万件に達したら古い投稿から削除されて新しいのと入れ替わる。Herokuの無料プランは１万レコードまで、という規制があるため）

パズル５の失敗を目の当たりにした直後なので、今回のパズル６にはそこまでの挑戦者数は望めないのでは、と正直感じている。仮にそうであったとしてもアクセスいただいたひとりひとりのエンジニアの方に楽しんでいただければ作った意味があったと思える。パズルシリーズの本来の目的である「優秀なエンジニアにパズルを通して楽しんでいただくこと」が達成されていることを願うのみである。

##【パズル６】ほとんどのエンジニアには解けるパズル６

http://challenge-your-limits6.herokuapp.com/
公開時刻：２月１６日（火）午後６時（日本時間）

いつものごとくherokuの無料プランにデプロイしたのでだいたい眠っている。最初の１発目のアクセスは目を覚ましてもらう時間が５−６秒あるので少々お待ちください。

###詳細を書いたブログ
http://tango-ruby.hatenablog.com/
R言語徹底解説の誤植情報を集めてみる

今、[R言語徹底解説](http://www.kyoritsu-pub.co.jp/bookdetail/9784320123939)(原著名：Advanced R)がアツい。
私は現在 1/5 程度まで読んだが、翻訳の質がはんぱなく良い。

発売数日にしてすでに、かなりの数の書評が上がっている。
その中で、誤植情報がいくつが報告されているが、情報がバラバラなので一つにまとめたい。
このリストの目的は私が誤植報告するのにすでに報告されているかどうかを調べやすいようにすることである。
一見多いが、ほとんどが「バッグ」が「バック」になってるなどという細かい誤植であるため読み進めるにあたってはほぼ気にならない。

| ページ数 | 誤 | 正 |報告者|
|-----------:|:------------|:------------|:------------|
|7|Sef Haridi|Seif Haridi|dichika|
|15|ベクトルは、ベクトルであるだけでなくリストでもあるという2つの特徴を持つ|ベクトルにはアトミックベクトルとリストの2つの種類がある|hoxo_m|
|20|なぜリストをアトムに変換|なぜリストをアトミックベクトルに変換|u_ribo|
|22|levelに含まれない値を|levelsに含まれない値を|u_ribo|
|25|明示的に文字列ベクトルから因子に|明示的に因子から文字列ベクトルに|mokjpn|
|36|simplyfying|simplifying|hoxo_m|
|47|長さが４のベクトルにから５番目の要素|長さ４のベクトルから５番目の要素|u_ribo|
|48|R^2値|$R^2$値|u_ribo|
|55|むしろ文節内で使う方が便利である|むしろif文内で使う方が便利である|hoxo_m|
|56|集合演算子|集合演算|hoxo_m|
|84|バックティック ` ,は|バックティック ` は|hoxo_m|
|88|完全名前|完全な名前|hoxo_m|
|93|下記のコードでにおいて|下記のコードにおいて|hoxo_m|
|94|グラフィックスパラメータなどを引数を|グラフィックスパラメータなどの引数を|hoxo_m|
|99|二項演算子に引数を追加するのであれば|置換関数に引数を追加するのであれば|hoxo_m|
|101|コピー修正セマンティック|コピー修正セマンティクス|hoxo_m|
|109|plyrパッケージ|pryrパッケージ|u_ribo|
|136|バック|バッグ|dichika|
|146|束縛よって定義される|束縛によって定義される|u_ribo|
|162|ユーザに伝えるための利用している|ユーザに伝えるために利用している|hoxo_m|
|191|`df$f[df$f == -99]`|`df$f[df$g == -99]`|takeshou|
|201|実例を紹介ている|実例を紹介している|hoxo_m|
|204|パフォーマンス比較したいとする|パフォーマンスを比較したいとする|u_ribo|
|224|リストとして場合に|リストとした場合に|u_ribo|
|233|その関連関数ついて|その関連関数について|u_ribo|
|298|置換は表現式のすべて名前を|置換は表現式のすべての名前を|u_ribo|
|311|`identical(quote(name), as.name("名前"))`|`identical(quote(name), as.name("name"))`|u_ribo|
|302|パッケージは何だろか|パッケージは何だろうか|dichika|
|366|Floreal Morandat|Floréal Morandat|dichika|
|440|各引数の型を言言|各引数の型を宣言|stattan|
|448|を使って初期され|を使って初期化され|u_ribo|
|502|testhat|testthat|dichika|

これらが誤植であるかどうかは最終的には出版社と翻訳者が判断することであり、すべての情報が正しいとは限らない。
随時更新していきたいと思います。
上記に無い誤植を見つけた際には[編集リクエスト](http://qiita.com/drafts/e6eeeab63d67b14725d4/edit)を送っていただくか、コメントしていただければ幸いです。

### 参考

[R言語徹底解説が届いたので誤植を探す](http://d.hatena.ne.jp/dichika/20160204/p1)
[R言語徹底解説（原著: Advanced R）を読んだ](http://uribo.hatenablog.com/entry/book_review_adv_r)
Rails selfの使い道

railsを勉強中にselfというのが出てきて、
どうにも理解できず改めて勉強してみたのでまとめる。

#selfの定義の仕方
selfをつけるとクラスメソッドが定義できます。

```rb
class User
	#クラスメソッド
	def self.classHoge
	end
	
	#インスタンスメソッド
	def instanceHoge
	end
end
```

このような形でselfを頭に着けると定義できる。

```rb
class User

	class << self
		#クラスメソッド
		def classHoge
		end
	end
	
	#インスタンスメソッド
	def instanceHoge
	end
end
```

こんな書き方もOK。

#selfの使い方

```rb
#クラスメソッド
User.classHoge

#インスタンスメソッド
User.new.instanceHoge
```

newしなくて使えるのがクラスメソッド

#結局何が違うの?

ここから先は、まだ検証できたわけではないですが、
こんなことなのかな?と思っていることです。
誤りあればご指摘ください。。。

クラスメソッドは例えばUserクラス全体からなんらかの条件に合致するUserを取得する時に使うと良い。

インスタンスメソッドは任意のUserオブジェクトからさらになんらかの条件に合致するUserを取得する時に使うと良い。

こんな使い方できるかな?と思っていること。

クラスメソッドでUserクラス全体から任意のUserを取得する。
(例えば、25歳以下のUserを取得するとか。)

そこからなんらかの処理を施した後、取得したUserオブジェクトの内、
男性のみを取得したいなどがあれば、selfを組み合わせてうまいことメソッドが組めるのでは?


#イメージ
```rb
class User < ActiveRecord::Base

	def self.getYoungUser
		#25歳以下のユーザを取得する処理
	end
	
	def getMaleUser
		#インスタンスから男性ユーザのみを取得する処理
		result = Array.new
		if self.sex="male"
			result.push(self)
		end
	end
end


userIns=User.getYoungUser
p userIns.getMaleUser
```

このような形で一回取得したオブジェクトに対してさらに処理を加えたいときに使えるのかなと。
//検証後に結果を反映します。
//ご指摘ありましたらいただけると幸いです。。。
さくらのクラウドの2万円分のタダ券をもらったのでArch Linuxを入れた話

# さくらのクラウドの2万円分のタダ券をもらったのでArch Linuxを入れた話

サーバ追加で
![tmp0.png](https://qiita-image-store.s3.amazonaws.com/0/105410/7a0e33d2-08de-fe0a-0145-f4b1090454d8.png)

![tmp2.png](https://qiita-image-store.s3.amazonaws.com/0/105410/de0739c9-38d2-f36c-d8d1-6a0282d8c28b.png)

![tmp3.png](https://qiita-image-store.s3.amazonaws.com/0/105410/f1f04fe4-747a-080c-daa5-cef55d0e4e4d.png)

こんなことして
作成押して

![tmp4.png](https://qiita-image-store.s3.amazonaws.com/0/105410/153863f4-8439-6d7b-3ee7-d10e6ef82d93.png)

閉じる押して

![tmp5.png](https://qiita-image-store.s3.amazonaws.com/0/105410/cc8fdc9f-b956-61a8-7eef-744add85305e.png)

こんなのができて
コンソールを見るとこうなって

![tmp6.png](https://qiita-image-store.s3.amazonaws.com/0/105410/6ebd61a0-a2a6-32ba-239b-66eca4abcb5f.png)

![tmp7.png](https://qiita-image-store.s3.amazonaws.com/0/105410/314b6a0c-2c45-5660-dea4-140eb51f106f.png)

![tmp8.png](https://qiita-image-store.s3.amazonaws.com/0/105410/daca8d3a-a001-5d1f-42e8-2f20f290516e.png)

UEFIに対応してないっぽいので

![tmp9.png](https://qiita-image-store.s3.amazonaws.com/0/105410/285a8ecd-edbb-6f19-90c9-ef797476d041.png)

なんかこんなことしてネットワークに接続できるようにする
sshdを立てる

![tmp10.png](https://qiita-image-store.s3.amazonaws.com/0/105410/373cec35-7bb0-ced4-180d-4f80f3e9d97f.png)

![tmp11.png](https://qiita-image-store.s3.amazonaws.com/0/105410/0668e0f0-25d2-6c21-00c7-265b71226dfb.png)


パーティションを切る
フォーマットする

あとはpacstrapとかでインストールガイドの通りにやればできる．
ネットワークの設定をもう一回やって，コンフィグファイルを作る．
sshdを起動する．
スクショは忘れた．

bootloaderはgrubにした．

終わり．
ターミナルの大きさを取得する


ターミナル画面の大きさ（文字数）を取得するためのコマンド

## <i class="fa fa-arrows-h"></i> 横幅を取得
```sh
tput cols
```
画面横幅いっぱいの文字数が出力される。

## <i class="fa fa-arrows-v"></i> 縦幅を取得
```sh
tput lines
```
画面縦幅いっぱいの文字数（行数）が出力される。


## <i class="fa fa-terminal"></i> 応用例
これで画面の大きさを取得して、その後の処理にもっていける。
たとえば、画面の大きさに応じて `ls` の出力の形式が変わるように、
画面サイズに応じて出力を変えるやつが実装できる。

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css">
Selenium Serverが立ち上がらないときはportが被っているかも！？

Seleniumサーバを立ち上げたが、ブラウザで確認するとHTTP ERROR: 403となり嵌ったので
解決方法をメモします。

解決方法はportを指定してサーバを立ち上げるです。
立ち上がらなかった原因はport:4444がすでに使用されていました。。。

下記、嵌った流れです。。。

1.　Seleniumサーバを下記コマンドで立ち上げる

```shell-session
java -jar selenium-server-standalone-2.52.0.jar -role hub
```

2.　webでサーバが立ち上がっているか確認する
http://localhost:4444/grid/console
ここでブラウザの画面にエラーが出る
>HTTP ERROR: 403
>
>Forbidden for Proxy
>RequestURI=/grid/console

>Powered by Jetty://

3.　1で実行したコマンドプロンプトをよく見る
Address already in use: bindと表示されていた。
たぶん、ポートが被っていると推測

ポートを指定してSeleniumサーバを起動させる。

```shell-session
java -jar selenium-server-standalone-2.52.0.jar -role hub --port 4445
```

5.　解決
http://localhost:4445/grid/console
ポートを変えたのでURLも変更

nodeの登録時にもポートはちゃんと変えたものを指定する

```shell-session

java -jar selenium-server-standalone-2.52.0.jar -role node  -hub http://localhost:4445/grid/register
```
FFmpegファイル読込＋OpenCV画像処理の雛形

FFmpeg(libavformat,libavcodec,libswscale)ライブラリで動画ファイルを読み込み、各映像フレームをOpenCVライブラリの`cv::Mat`型へ変換するまでの雛形コード。

https://gist.github.com/yohhoy/f0444d3fc47f2bb2d0e2

- よくみかけるFFmpeg映像復号サンプルコードはコーデック遅延(`CODEC_CAP_DELAY`)に対応しないものが多く、一部の映像コーデックでは入力映像ストリームの末尾数フレームが欠損する。`av_read_frame`がファイル終端到達後の`avcodec_decode_video2`空パケット通知により正しく対応。
- FFmpegサポート有りOpenCVビルドでも同じことを実現できるが、`cv::VideoCapture`だと常にRGB色空間に変換されてしまう。動画系コーデックはYUV色空間ネイィブが主流のため、無駄な色空間変換コストを抑えたい場合に便利（かもしれない）。
- `cv::Mat image`のデータ領域は`vector<uint8_t> framebuf`を参照しているだけなので、次フレーム処理時には破壊されていることに注意。複数フレームを保持する必要がある場合は、コピーした`cv::Mat`を退避しておくこと。
CoreOSインストール時に使ったcloud-configはどこに行ったの？


自分でCoreOSをインストールするときには、初期設定を書き込んだcloud-configを読み込ませる。
ファイル一つでOSの設定を全部、賄えるとは、なんてお手軽なんだろう。

あれ？
ではインストール後に、そういった設定を変更したい場合にはどうしたらよいのだろう。
もちろん、CoreOSだってLinuxなんだから、/etc下に設定ファイルが転がっているのは百も承知。
しかしCoreOSなんだから、一つのファイルで全部、管理したいじゃないか。

答え:
インストール時に使用したcloud-configは、`/var/lib/coreos-install/user_data`に保存されているので、これを書き換えればよい。


 
例。
インストール後に、CoreOSの更新方法を変える。
更新方法は`/etc/coreos/update.conf`でも設定できるが、上述の理由から、敢えてuser_dateで操作する。

では早速。
`/var/lib/coreos-install/user_data`に以下の行を加えればよい。
※以下の例ではreboot-strategyにbest-effortを指定している。

```yaml
 coreos:
   update:
     reboot-strategy: best-effort
```
CoreOSをリブートすると、`/etc/coreos/update.conf`に以下の通り、最後の一行が増えている。

```
$ cat update.conf
GROUP=stable
REBOOT_STRATEGY=best-effort
```

なお、CoreOSのバージョンは`/etc/os-release`に記載あり。
```
$ cat /etc/os-release
NAME=CoreOS
ID=coreos
VERSION=835.11.0
VERSION_ID=835.11.0
BUILD_ID=
PRETTY_NAME="CoreOS 835.11.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"
```

参考
https://github.com/coreos/coreos-cloudinit/blob/master/Documentation/cloud-config.md#update
https://coreos.com/os/docs/latest/update-strategies.html

https://coreos.com/os/docs/latest/cloud-config-locations.html
On every boot, coreos-cloudinit looks for a config file to configure your host. Here is a list of locations which are used by the Cloud-Config utility, depending on your CoreOS platform:

/var/lib/coreos-install/user_data
	When you install CoreOS manually using the coreos-install tool. Usually used in bare metal installations.
CUIのVimでもCtrl + Enterにマッピングしたい

素人の備忘録。

# 動機
MacVimで、挿入中にCtrl + Enterで改行して上に移動するようマッピングしていた。

```vim:.vimrc_example
inoremap <C-CR> <CR><Up>
```

ところがこれがGUIだと動くのだが、iTerm2上のCUIでは全く動かない。
無理矢理でもいいのでなんとかしたい。

#### 追記[2016/06/14]
Windows+Console2の場合を追記。
MinttyなどはCtrl+Enterに直接マッピングできるのでこんな面倒なことはしなくてよい。

# 解決策
## Mac
Ctrl + Enterで自分が使わない適当なUnicode文字を送るようにiTerm2で設定し、その文字に対して.vimrcでマッピングする。

### iTerm2の設定
iTerm → PreferencesからProfilesタブを開き、自分のプロファイルを選択。
右のKeysタブを選択し、+ボタンを押しショートカットを追加。
Keyboard ShortcutでCtrl + Enterを押し、ActionでSend Textを選択、適当な文字（例：`✠`）を入力する。
これでiTerm2上でCtrl + Enterを押すと`✠`が入力されるようになった。

## Windows(2016/06/14追記)
AutoHotkeyを使い、Ctrl + Enterで自分が使わない適当なUnicode文字を送る。
その文字に対して.vimrcでマッピングする。
例えばConsole2上でVimを使う場合は以下の通り。

```ahk:AutoHotkey_example
#IfWinActive, ahk_exe Console.exe
{
    ^Enter:: Send, ✠
}
```

これでConsole2上でCtrl + Enterを押すと`✠`が入力されるようになった。

## .vimrcの設定
`✠`にマッピングすればいいのだが、GUIの設定も残したいので以下のとおりに。

```vim:.vimrc_example
if has('gui_running')
    inoremap <C-CR> <CR><Up>
else
    inoremap ✠ <CR><Up>
endif
```

これでCUIでもGUIでもCtrl + Enterにマッピングできた。

# 参考
http://stackoverflow.com/questions/5388562/cant-map-s-cr-in-vim
STS(eclipse)(Spring-boot)によるbitbucketへのプッシュ

# 目的
Spring-bootによる開発環境STSからフリーのホスティングサービスBitbucketへのPushを行う

# 環境
1. STS（Eclipse）
1. Spring-Boot
1. Bitbucket
1. git

# 手順
## gitの利用開始

プロジェクトを選択し、Share Projectを選択
![スクリーンショット 2016-02-14 20.51.12.png](https://qiita-image-store.s3.amazonaws.com/0/57455/740d7716-44b6-31a0-5b5a-76bdc534eba4.png)

ローカルにリポジトリを新規作成する場合はCreateを選択し、   
作成するリポジトリのパスを指定し作成する

![スクリーンショット 2016-02-14 20.51.51.png](https://qiita-image-store.s3.amazonaws.com/0/57455/f161c929-24a6-f8d5-9cc1-285e51d4bdde.png)

Commitを選択し　　　
最初のコミットを行う
![スクリーンショット 2016-02-14 20.52.19.png](https://qiita-image-store.s3.amazonaws.com/0/57455/7a8788d8-e680-ed29-1fd8-612e9b26d038.png)

## Bitbucket

リモートリポジトリを作成する　　
※　複数メンバーで共有する場合は、先にチームを作成し、チームの所有するリポジトリとして作成する

![スクリーンショット 2016-02-14 20.58.45.png](https://qiita-image-store.s3.amazonaws.com/0/57455/dbe3d18f-a1a2-7bfb-8a5f-4e1bee3f0a77.png)

ローカルからソースを受け取る  
今回はローカルにプロジェクトがあるため、
I have existing project を選択

![スクリーンショット 2016-02-14 21.00.09.png](https://qiita-image-store.s3.amazonaws.com/0/57455/37776ec1-4ba6-7090-1abe-602de0bdbf67.png)

コマンドからプッシュするためのコマンドが表示される。

![スクリーンショット 2016-02-14 21.02.14.png](https://qiita-image-store.s3.amazonaws.com/0/57455/7a533918-e8cd-0450-35df-3de655227074.png)

## STSからのPUSH
ただ、今回はSTSからプッシュを行うため、

以下のコマンドの内容と同じ設定で、STSからプッシュを行う

```
git remote add origin git@bitbucket.org:yukihigasi/testpush.git
```

STSより、Team -> push Branch 'master'を選択し　登録画面を開く
![スクリーンショット 2016-02-14 21.07.14.png](https://qiita-image-store.s3.amazonaws.com/0/57455/d3e6154f-b88e-456e-13c3-765654132309.png)

![スクリーンショット 2016-02-14 21.06.57.png](https://qiita-image-store.s3.amazonaws.com/0/57455/fa98738f-be90-5915-c944-a8cabe103500.png)

先ほどの内容を設定します　　　

```
git remote add origin git@bitbucket.org:yukihigasi/testpush.git　　　
```
ここから

Remote name: origin
Host: bitbucket.org
Repogitory path: yukihigasi/testpush.git

等を読み取り、以下のように設定します
![スクリーンショット 2016-02-14 21.10.31.png](https://qiita-image-store.s3.amazonaws.com/0/57455/2e7652ec-9907-5b8b-57e5-d349c27ddf07.png)

・ protcolはhttpsとして、HOST Repository pathを入力すると、URIは保管される
・ UserとpasswardはBitbucketへ登録したメールアドレスとパスワードを設定する

あとはウィザードに従いNext を選択する

## BitBucketからの確認
処理が完了すると、Bitbucketのソースから確認すると、プロジェクトがPushされていることが確認できる
![スクリーンショット 2016-02-14 21.15.55.png](https://qiita-image-store.s3.amazonaws.com/0/57455/629913c7-433b-3cf8-6e9a-7bbd9ad85ed5.png)
Realmのインストールについて教えて下さい！


以前Qiitaにて、
http://qiita.com/YukiAsano/items/ac2d949aafe9b5755cf6
のアドバイスをいただいたことがありますが、インストール方法がわからなくなってしまいましたので教えて下さい。

https://realm.io/jp/docs/swift/latest/
にて、

1.こちらから最新版のRealmをダウンロードしてzipファイルを展開してください。
2.Xcodeでプロジェクトをクリックしプロジェクト設定の“General”タブを表示します。展開したフォルダの中にあるios/、watchos/、tvos/、またはosx/フォルダからRealmSwift.frameworkとRealm.frameworkを“Embedded Frameworks”にドラッグ＆ドロップしてください。このとき、Copy items if neededにチェックが入ってることを確認してからFinishをクリックしてください。
3.ユニットテストのターゲットを選択して“Build Settings”タブの“Framework Search Paths”にRealmSwift.frameworkの親フォルダのパスを追加してください。
4.iOS、watchOSまたはtvOSのプロジェクトで利用する場合は、アプリケーションのターゲットの“Build Phases”タブで新しく“Run Script Phase”を追加し、以下のスクリプトをそのままコピー＆ペーストしてください。
bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh"

とあります。
上記の1.は理解できます。それくらいはできます。
問題１は、2.の「“Embedded Frameworks”にドラッグ＆ドロップしてください。」ってところですが、私が使用しているXcodeでは、
Embedded Binaries　と　Linked Frameworks and Libraries はありますが、Embedded Frameworks　ってところがありません。
どこにドラッグすれば良いのですか？

次の疑問は、
http://qiita.com/YukiAsano/items/ac2d949aafe9b5755cf6
の解説の、真ん中あたり。

 $(PROJECT_DIR) を追加するところです。
参考ページには、

$(PROJECT_DIR) 
の上の段に、

$(SDKROOT)/Developer/Library/Frameworks

$(inherited)
の２文が書いてあります。
これがないといけないのでしょうか？

以上２点の部分が解決できていないからだと思いますが、
RealmSwiftをしようとすると、
No such file or directory
とエラーメッセージが出て使用できません。

皆さん、どうやってrealmを使っているんですか？
ネットをいろいろ調べてみたんですが、解決しません。

どなかた教えて下さい。
underscoreコードリーディング（functions）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##functionsとは


###[underscorejs.orgのfunctions](http://underscorejs.org/#functions)

こんな説明。
>####_.functions(object) Alias: methods 
>Returns a sorted list of the names of every method in an object — that is to say, the name of every function property of the object.


```javascript
_.functions(_);
=> ["all", "any", "bind", "bindAll", "clone", "compact", "compose" ...
```

------------- 

objectにあるすべてのメソッドの名前（言い換えると、これは、objectのプロパティのすべての関数の名前）をソート済みのリストにして返します。

###[underscore.functions](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L995)
コード的にはこのあたり。

```javascript
  // Return a sorted list of the function names available on the object.
  // Aliased as `methods`
  _.functions = _.methods = function(obj) {
    var names = [];
    for (var key in obj) {
      if (_.isFunction(obj[key])) names.push(key);
    }
    return names.sort();
  };
```

functionsとmethodsとして利用できる。引数はobj。
返り値用の変数namesを空の配列として宣言する。
objをfor inで回す。
_.isFunctionでobj[key]がfunctionと判定された場合、namesにkeyを入れる。
for文が終わったらnamesをソート後返す。
FuelPHPのログ出力

# 環境
FuelPHP: 1.7.3

# ログ出力
FuelPHPには、4種類(error, warning, debug, info)のログレベルがある。そして、出力レベル(Fuel::L_ALL, Fuel::L_INFO, Fuel::L_DEBUG, Fuel::L_WARNING, Fuel::L_ERROR)を設定ファイルで選択することが可能である。

# 4種類のログレベルの記述方法

```php
Log::error("errorログ");
Log::warning("warningログ");
Log::debug("debugログ");
Log::info('infoログ');
```

# 出力レベルの変更

```php:fuel/app/config/config.php
'log_threshold'    => Fuel::L_ALL,
```

上記の行を変更することで、出力するログレベルを変更することが可能。

# 各レベルの出力内容
## Fuel::L_ALL

```php
ERROR - 2015-09-04 11:17:08 --> errorログ
WARNING - 2015-09-04 11:17:08 --> warningログ
DEBUG - 2015-09-04 11:17:08 --> debugログ
INFO - 2015-09-04 11:17:08 --> infoログ
```

## Fuel::L_INFO

```php
ERROR - 2015-09-04 11:18:01 --> errorログ
WARNING - 2015-09-04 11:18:01 --> warningログ
INFO - 2015-09-04 11:18:01 --> infoログ
```

## Fuel::L_DEBUG

```php
ERROR - 2015-09-04 11:25:29 --> errorログ
WARNING - 2015-09-04 11:25:29 --> warningログ
DEBUG - 2015-09-04 11:25:29 --> debugログ
INFO - 2015-09-04 11:25:29 --> infoログ
```

## Fuel::L_WARNING

```php
ERROR - 2015-09-04 11:26:56 --> errorログ
WARNING - 2015-09-04 11:26:56 --> warningログ
```

## Fuel::L_ERROR

```php
ERROR - 2015-09-04 11:28:22 --> errorログ
```
CSVをOrangeSignal CSVを使ってパースする

CSVをOrangeSignal CSVを使ってパースする。


```java
public class UploadAction {
	@Resource
	@ActionForm
	public UploadForm uploadForm;

	@Required
	@Binding(bindingType = BindingType.NONE)
	public FormFile formFile;

	@Binding(bindingType = BindingType.NONE)
    public FormFile[] formFiles;

	public HttpServletRequest request;
	public List<String[]> csvData;
	@Resource
	public MSongService mSongService;
	@Resource
	public TMarkingService tMarkingService;


	public MSong mSong;
	public TMarking tMarking;

	@Execute(validator=false)
	public String index(){
		return "index.jsp";
	}
	@Execute(validator=false)
	public String upload() throws ParseException, FileNotFoundException, IOException{
		CsvConfig cfg = new CsvConfig();
		cfg.setQuoteDisabled(false);// デフォルトでは無効となっている囲み文字を有効にします。
		cfg.setEscapeDisabled(false);// デフォルトでは無効となっているエスケープ文字を有効にします。
		cfg.setIgnoreLeadingWhitespaces(true);// 項目値前のホワイトスペースを除去します。
		cfg.setIgnoreTrailingWhitespaces(true);// 項目値後のホワイトスペースを除去します。
		cfg.setIgnoreEmptyLines(true);// 空行を無視するようにします。
		InputStream is = uploadForm.file.getInputStream();
		File file = new File("/", uploadForm.file.getFileName());
		try {
		    //ISから一時ファイル作成
			Files.copy(is, file.toPath(),StandardCopyOption.REPLACE_EXISTING);
		} catch (IOException e) {
		    e.printStackTrace();
		}
		try {
			csvData = Csv.load(new File(file.getAbsolutePath()),"MS932", cfg, new StringArrayListHandler());
			//一時ファイル削除
			Files.deleteIfExists(file.toPath());
		} catch (IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		System.out.println(file.getAbsolutePath());


		for(int i=1;i<csvData.size();i++){
			String[] str=csvData.get(i);
			//Songマスタにinsert
			mSong=mSongService.findById(str[REQUEST_NO]);
			if(mSong==null){
				mSong=new MSong();
				mSong.requestNo=str[REQUEST_NO];
				mSong.artist=str[ARTIST];
				mSong.songTitle=str[SONG_TITLE];
				mSong.highTess=Integer.parseInt(str[HIGH_TESS]);
				mSong.lowTess=Integer.parseInt(str[LOW_TESS]);
				mSongService.insert(mSong);
			}
			//markingテーブルへのinsert
			Timestamp dateTime = new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(str[DATETIME]).getTime());		
			
		ActionMessages errors = new ActionMessages();
		errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("errors.upload.complete"));
		ActionMessagesUtil.addMessages(request, errors);
		return "index.jsp";
	}
}
```

```java
public List<String[]> csvData;
//iは行数
String[] str=csvData.get(i);
//添え字は横方向のセル
str[REQUEST_NO];
```

[OrangeSignal CSV - ユーザーガイド](http://orangesignal.osdn.jp/csv/userguide.html)
git pushしたら自動でs3のサイトの更新をしてくれるものをbitbucketとwerckerで作る


プログラムの自動デプロイにCIがよく使われますが、単純に静的サイトをbitbucketで管理して、それをs3に反映するだけというカジュアルな使い方を試してみたかったのでメモ。


## 1. s3の設定をする
 簡単にやるのであればManagement Consoleからパッとやればいいでしょう。
 悩むところはそんなにない（はず）

 ansibleでやった際に引っかかったのが以下点なのでご参考に。
 http://qiita.com/celeron1ghz/items/cdaa79d7e53524a97712


## 2. bitbucketでrepositoryを作る
 「リポジトリの作成」より作成。
 bitbacket側ではrepoを作るのみでOK。


## 3. werckerの設定
 ここが微妙に引っかかった。

### werckerにbitbucketのrepositoryを追加
上部メニューにある Create -> Application より追加。
ウィザードがあるので難しくはないはず。


### wercker.ymlの設定
いろいろ試行錯誤しましたが以下のような感じ。

```
box: debian

build:
  steps:
    - script:
        name: update apt 
        code: sudo apt-get update && apt-get -y install curl

  after-steps:
    - slack-notifier:
        url: $SLACK_URL
        channel: $SLACK_CHANNEL
        username: werckerbot

deploy:
  steps:
     - s3sync:
         key_id: $AWS_ACCESS_KEY_ID
         key_secret: $AWS_SECRET_ACCESS_KEY
         bucket_url: s3://site.moge.com
         source_dir: site/
```

curlは `slack-notifier` の内部で使われているので入れておく。

s3と同期をするには既に `s3sync` というsite（werckerのモジュール）があるので、設定の追加をするだけでよかった。
（最初はaptでpython入れてpip入れてawscli入れてたけど不要だった）

あと通知が欲しいと思ったので `slack-notifier` を追加。
（何もビルドしてないのに成功！と表示されるのも何だかなとは思いましたが、pingに近い感じで）



### 環境変数の設定
アプリケーションのページ -> 設定 -> Environment Variable より設定。

上記のwercker.ymlの変数のところの値を埋める。
トークンは `Protected` にチェックを入れたほうが良い。


### deploy targetの設定
アプリケーションのページ -> 設定 -> Targets より設定。

Add deploy targetのプルダウンを選択し、Custom deployを選択。

`Deploy target name` に `production`
`auto deploy successful builds to branch(es)` のチェックを入れる。
下のテキストボックスには `master`と入れる。

最初この設定を行わずに動かないと悩んでいたが、wercker.ymlで`deploy`の項目を実行するのに必要な設定だったみたいです。

## git push!
設定おわり。

`git push` するとwerckerのビルドが走り、Slackに通知が来て、s3のサイトの更新がされる！
JDKのインストール

# 環境
Windows 8.1 pro 64bit

# ダウンロード
以下のサイトよりJDKをダウンロードしてきます。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

![jdk_download_2.png](https://qiita-image-store.s3.amazonaws.com/0/74163/afe5c35b-71c3-f9d0-6213-bec6d8b9e10e.png)

上記の赤枠内の「Accept License Agreement」をクリックして自分の環境にあったJDKをダウンロードして下さい。

# インストール
ダウンロードしてきたファイルを実行します。
特に変更する必要はないのでそのままインストールを行ってください。

# 環境変数の設定
Javaを簡単に実行出来る様にPATHを設定します。

1.デスクトップ左下のWindowsマークを右クリックして、メニューよりシステムを選択します。

2.画面の左に「システムの詳細設定」があるのでクリックします。
![jdk_install_1.png](https://qiita-image-store.s3.amazonaws.com/0/74163/2933da5d-4429-8113-4bab-7f2ff0fd801a.png)

3.システムのプロパティが表示されるので、詳細設定タブを選択して環境変数をクリックします。
![jdk_install_2.png](https://qiita-image-store.s3.amazonaws.com/0/74163/58b096b5-1d8f-b3af-6c8b-e59033821771.png)

4.表示された画面のシステム環境変数内にPathがあるか確認します、あればPathを選択して編集ボタンをクリックして下さい。
※Pathがない場合は、新規ボタンをクリックして下さい。
![jdk_install_3.png](https://qiita-image-store.s3.amazonaws.com/0/74163/be844ce4-b0c2-a6b3-175b-41d2c20bc409.png)

5.ダイアログが表示されるので、インストールしたJDKのbinまでのPathを入力しOKボタンをクリックします。
![jdk_install_4.png](https://qiita-image-store.s3.amazonaws.com/0/74163/0092b307-ac88-9021-cb41-f66032b54f48.png)

# 確認
Pathがきちんと設定できているか確認する為にコマンドプロンプトを起動します。
起動後、「javac -version」と入力してバージョン情報が表示されれば問題ありません。

以上でJDKのインストールは終了です。
Google Apps Scriptをローカルで開発する


# そんなことができるのか？
A. できるようになりました。（以前からできていたんだろうと思われるが…）

Google Developer Relations Teamのblogでローカルで開発するための環境構築についての記事が投稿されました。

[Apps Scriptによる高度な開発プロセス](http://googledevjp.blogspot.jp/2016/01/apps-script.html)

ということで、早速（でもないですけど…）試してみました。

# 環境構築
## node.jsをインストールする。
私はnodebrewを使っているので、参考記事をおいておきます。
http://qiita.com/sinmetal/items/154e81823f386279b33c

バージョンはv0.12.x以降なら動作するようです。

## node-google-apps-scriptをインストールする。

```bash:コマンド
$ npm install -g node-google-apps-script
```

エラーが出なければOK

## Apps Scriptのプロジェクトを作る。
最初に、Google Driveの任意のフォルダでGoogle Apps Scriptのファイルを作るか、Container-bound Scriptを作って下さい。
（Container-bound Script＝Document/Spreadsheet/Formに紐付いたAppsScriptのこと）

## Apps ScriptのAPIキーを作る。
リソース→Developers Console プロジェクト…を選択する。

![DeveloperConsoleプロジェクトの選択.png](https://qiita-image-store.s3.amazonaws.com/0/11925/3e015990-b359-cbda-32fc-e1040e95e178.png "DeveloperConsoleプロジェクトの選択.png")

Developer Consoleを表示ボタンを押して、コンソールを表示
![DevelopersConsoleを表示.png](https://qiita-image-store.s3.amazonaws.com/0/11925/5f7ee8a0-b0d9-4c53-07e3-c8c65897c7f8.png "DevelopersConsoleを表示.png")

APIManagerを選択する。
![APIManager.png](https://qiita-image-store.s3.amazonaws.com/0/11925/b7081587-0738-a6dd-d09b-df42957252dc.png "APIManager.png")

Google Drive APIを有効にしておいて下さい。（ローカルからソースコードを更新するときにAPIを利用するからです）

メニューからCredentialsを選択し、Create credentialsボタンを押す。その時に、OAuth IDを選択する。
![OAuthIDを選択.png](https://qiita-image-store.s3.amazonaws.com/0/11925/383eae52-c16f-a9ad-008e-206122d53aa3.png "OAuthIDを選択.png")

APIKeyの種類を聞かれるのでOtherを選択する。この時の名前はなんでも良いです。
![Otherを選択.png](https://qiita-image-store.s3.amazonaws.com/0/11925/d506b41a-c860-6076-5538-da0c82b82ddf.png "Otherを選択.png")

APIKeyが作れたら、一番右にある矢印と棒線のアイコンをクリックしてjsonファイルをダウンロードしてください。このjsonファイルをおローカルのAppsScriptのプロジェクトにコピーしておきます。（jsonファイルはどこにあってもいいです。）

## 実は、APIKeyはどのプロジェクトのものでも良いのでは？
ソースコードをダウンロードしてくるところまでしか確認していませんが、Apps Scriptのプロジェクトと関係ないプロジェクトのAPIKeyでも問題なさそうです。（要検証）

## gappsコマンドを使って認証
node-google-apps-scriptに含まれているgappsコマンドで認証します。

```bash:コマンド
$ cd <ローカルのディレクトリ＞
$ gapps auth ./client_secret_<your_client_id>.json
```

## gappsコマンドでローカルのプロジェクトを初期化

initコマンドを実行するとローカルにsrcディレクトリが作られて、コード.jsができていると思います。（新規作成した状態だと、myFunctionだけが定義されています）

```bash:コマンド
$ gapps init <DriveにあるファイルID>
```

## 本日のコード.gsではなく、ローカルだと.jsになるみたい。

```js:コード.js
function myFunction() {
  Logger.log("ローカルで開発！");
}
```

## Google Driveにpush

```bash:コマンド
$ gapps upload
```

## スクリプトエディタで実行
スクリプトエディタを開くとソースコードが反映されているはずです。実行して下さい。

# ローカルで開発するときの弱点？
スクリプトエディタだと、補完が効くのですが、ローカルだと効かせるのが難しいのかなーと思ったりしていますが、これも要検証だと思います。

# Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
CommonJSでシングルトンっぽい実装

コンストラクタパターンで1度しかnew演算子を使いたくない場合に便利です。
以下はcoffeescriptでの記述ですが素のjavascriptでも問題ないです。

# クラス側
```coffeescript:Hoge.coffee
class Hoge
  constructor: ->
    console.log 'test'

instance = undefined

getInstance = ->
  if not instance
    instance = new Hoge()
  instance

module.exports = getInstance
```

# 使い方
```coffeescript:Main.coffee
class Main
  constructor: ->
    Hoge = require('./Hoge.coffee')()

$ ->
  new Main()  
```
手軽にキャッシュ無効化処理を実現する

あるURLがあって、そのURL先に遷移するもキャッシュが効いている為に同じページが何度も表示されてしまう（毎度同じ広告が表示されるなど）という現象で困ったことはありませんでしょうか？

こういった現象に遭遇した場合に、JavaScriptを使って手軽にキャッシュ無効化する方法として以下の方法をとってみるのも一つの手かもしれません。

##URLにランダムパラメータを付加してみる
```http://www.hoge.com + "&random=" + (new Date).getTime()```

####上記の様に実装することで、毎度現在までのミリ秒を取得して異なるURLにアクセスしている様に見せることが出来るため、結果としてキャッシュ無効化処理を実現できるという訳です。
jenkinsのパラメータ付きのジョブをpowershellから実行

日本語で紹介されてるページがあまりない気がするのでメモ。


```
Invoke-WebRequest "http://server名/jenkins/job/job名/buildWithParameters?token=hogehoge&パラメータ名1=hoge&パラメータ名2=hogehoge"
```

複数回実行する場合はスクリプト内でインターバルを設けるか、下記のようにURL指定する。
(例は60秒遅らせる場合)

```
Invoke-WebRequest "http://server名/jenkins/job/job名/buildWithParameters?token=hogehoge&delay=60sec&パラメータ名1=hoge&パラメータ名2=hogehoge"
```

ただどちらにしろジョブごとに実行時間を考慮して遅らせる必要があるため面倒。
ジョブを予約する方法があれば知りたい。。

ブログでも紹介してます→http://anosonote.hatenablog.com/entry/2016/02/14/200846
ExpressJS Build Application

# Introduction
How to set up express application made of NodeJS after installing NodeJS and npm(node package manager).

## How to
### Get ExpressJS ready
```bash
npm install -ge express-generator
```

### Build First Express Application
```bash
cd path/to/test/directory
express testApp
```

### Check Packages to be installed
```bash
cd testApp
open package.json
```
Then,

```bash
npm install
```

### Check From your Browser
```bash
DEBUG=test2:3000 npm start
```
Go to localhost:3000 on your browser
Ubuntuを12.04 -> 14.04にしたらvirtualenv利用中に「import io」できなくなった

# 概要
表題の通りで、Ubuntuをバージョンアップする前までは普通に動いていたvirtualenvで、以下のようなエラーが発生するようになりました

```shell-session

$ python -c "import io"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib/python2.7/io.py", line 51, in <module>
    import _io
ImportError: No module named _io
```


# 解決策
StackOverFlow等を調べてみるとvirtualenvを作成しなおす(requirements.txtを作っておいて、削除＆再作成後に再インストールする)方法が一般的な解決策のようだったのですが、
現状のvirtualenvが古めのパッケージをURL指定でインストールしていたりして再作成が面倒だったので、以下の方法を取りました。

1.適当なvirtualenvを新しく作成する
2.破損したvirtualenvのbin/pythonを削除(念の為バックアップをお勧めします)
3.1で作成したvirtualenvのbin/pythonを2にコピー

余りよろしい方法ではないですが、一先ずこれで現状はしのげたのでしばらく様子を見るつもりです
※そもそもvirtualenvwrapperに時代遅れ感があるので、これを機にpyenv等の導入もありですね…

# 関連URL
http://stackoverflow.com/questions/23176697/importerror-no-module-named-io-in-ubuntu-14-04
Raspberry Pi --> EPS8266 --> I2Cキャラクタディスプレイ

Adafruit Pi Zero Contest 2016へのエントリで必要となっていた構成がある程度できた。

実際の動作は以下の通り。

![DSC_0093.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/01f7bf5b-5744-7f09-88b6-b7350711ddbf.jpeg)

- Pi <-> ESP8266 : UART接続
- ESP8266 <-> キャラクタディスプレイ : I2C接続

Piが送信した文字列をESP8266経由でキャラクタディスプレイに表示する

Pi側のpythonコード

```gpiouart.py
#!/usr/bin/env python

import serial
import time

con=serial.Serial('/dev/ttyAMA0', 115200, timeout=10)
while 1:
	msg="hello,\r\n"
	print msg
	con.write(msg)

	time.sleep(3)

	msg="7of9\r\n"
	print msg
	con.write(msg)

	time.sleep(3)
```



以下は、電源を１つにして、ESP8266は三端子レギュレータから電源供給した場合。

ブロック図: http://qiita.com/7of9/items/c055104279f80fa981d0

![DSC_0096.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/8cad01d8-e0d8-f6ec-5d3e-b62a66f569df.jpeg)
anyenvユーザが設定すべきrbenv.elの設定

今日になってrbenv.elを知って、以下のような設定ファイルを書いていた。

```el
(require 'rbenv)
(global-rbenv-mode)
(setq rbenv-installation-dir "~/.anyenv/envs/rbenv")
```

anyenvでrbenvをインストールしているのだからこれでいいだろ。
と思ってたんだが、実はこれだとダメ。
M-x rbenv-useなどをやってみるとわかるけど、~/.rbenvをハナから見に行っているくさい。

rbenv.elには以下のように記載されている

```el
(defcustom rbenv-installation-dir (or (getenv "RBENV_ROOT")
                                      (concat (getenv "HOME") "/.rbenv/"))
```

なんでかなーと思って調べてみたら、こんな記事を見つけた。

http://kawamuray.hatenablog.com/entry/2013/11/03/180543

どうやらこれに該当しているぽいので、以下のように設定を書き換えてみた

```el
(require 'rbenv)
(global-rbenv-mode)
(custom-set-variables '(rbenv-installation-dir "~/.anyenv/envs/rbenv"))
```

一見うまくいったかに見えたが、これも動作しない。
rbenv.elの中身をよくよくみると

```el
(defcustom rbenv-installation-dir (or (getenv "RBENV_ROOT")
                                      (concat (getenv "HOME") "/.rbenv/"))
  "The path to the directory where rbenv was installed."
  :group 'rbenv
  :type 'directory)
```

となっており、ここをcustom-set-variablesで設定できはするのだが

```el
(defun rbenv--expand-path (&rest segments)
  (let ((path (mapconcat 'identity segments "/"))
        (installation-dir (replace-regexp-in-string "/$" "" rbenv-installation-dir)))
    (expand-file-name (concat installation-dir "/" path))))
```

ここでセットされるrbenv-installation-dirは初期値である ~/.rbenv/になってしまっている。
すっごい考えたのだが、elisp弱者の私は結局以下の方法で解決させた。

```el
(setenv "RBENV_ROOT" "~/.anyenv/envs/rbenv")
(require 'rbenv)
(global-rbenv-mode)
```

負けた感じがする。
babel-node したときに EADDRINUSEが出た

`node -v` `v0.10.25`
`npm --version` `3.7.2`
`babel-node -V` `6.5.1`

# なんか適当に開発してて babel-nodeしてたら EADDRINUSEとか言われた

```
Error: listen EADDRINUSE :::80                                        
at Object.exports._errnoException (util.js:837:11)                
at exports._exceptionWithHostPort (util.js:860:20)                
at Server._listen2 (net.js:1231:14)                               
at listen (net.js:1267:10)                                        
at Server.listen (net.js:1363:5)                                  
at http_start (http.js:26:37)                                     
at main (app.js:5:1)                                              
at Object.<anonymous> (app.js:10:1)                               
at Module._compile (module.js:434:26)                             
at loader (/usr/local/lib/node_modules/babel-cli/node_modules/babel-register/lib/node.js:128:5)   
```
- 詳しく言うと2回目以降出る
- ググるとサーバーがポートを開いたままになってるからIN USEと怒るらしい

```javascript:hoge.js
 process.on('exit', () => サーバー名.close());
```

とかしてあげると解決。
Rack


## Rackについて

サーバとフレームワークを結ぶインタフェース

Web Server <---> Rack <---> Web Framework

### Web Server

* WEBRick
* unicorn
* puma

### Web Framework

* Ruby on Rails
* Sinatra

## Quick Start

### 0. install

```
$ gem install rack
```

### 1. config.ru を書く

```Ruby:config.ru
run lambda { |env| [200, { "Content-Type" => "text/html" }, ["Hello,world"]] }
```

### 2. rackup コマンドで起動

```
$ rackup config.ru
```

### 3. ブラウザからアクセス

```
$ curl http://localhost:9292/
```

## Rackの規約

1. 引数を1つ(仮引数名は慣習的に`env`)をもつ `call` メソッドを実装する
2. `call` メソッドは、`[status, header, body]` を返すこと

## Rack Middleware

サーバとフレームワークの間で実行したい処理を定義する。

### Middlewareの規約

1. 1番目の引数に app を受け取る `initialize` メソッドを定義する
2. Rackの規約を満たす `call` メソッドを定義する

### 例

フィルタのようにミドルウエアを組み合わせて使う。
一般的に `use` を使ってミドルウェアを呼び出す。
以下の例だと、A -> Bの順番に Middleware が呼び出される

```config.ru
use A
use B
run App
```

### rack標準で提供されるMiddleware

* Rack::Lobster
* Rack::File
* Rack::Auth::Basic
* Rack::Auth::Digest::MD5

など

## rails と rack

rails が rack をどのように使っているかを探ってみる。rails は抽象化されているため複雑だが、規約を意識すればそれほど難しくはない（と思う）。

[今回調べたバージョンは 4.2.5.1](https://github.com/rails/rails/tree/v4.2.5.1) 

今回必要なのは railties と actionpack。

また、Railsアプリを作成しておく。


### Railsアプリ -> Rack

4.2 の config.ru では、config/environment.rb を読み込み、Rails.application を **rackup** する

```config.ru
run Rails.application
```

config/environment.rb の中で、 config/application.rb を読み込み、アプリケーションを初期化(Rails.application.initialize!)している。

```config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)

# Initialize the Rails application.
Rails.application.initialize!
```

Rails.application.initialize! 内で、rack の Middleware の呼び出しを行っている(はずだ)。

config/application.rb では　Rails::Application を継承したクラスを定義して設定を記述する。

なお、 [Rails::Application](https://github.com/rails/rails/blob/v4.2.5.1/railties/lib/rails/application.rb#L80) は Rails::Engine を継承している。

```config/application.rb
require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(*Rails.groups)
module MyApp
  class Application < Rails::Application
    config.time_zone = 'Tokyo'
  end
end
```

### Railsライブラリの内部を探る

rails が呼び出している Middleware については、rakeコマンドで表示できる。

```
$ rake middleware
use ...
run MyApp::Application.routes
```

MyApp::Application.routes は Rails::Engine クラス内で定義された メソッド [Rails::Engine#routes](https://github.com/rails/rails/blob/v4.2.5.1/railties/lib/rails/engine.rb#L530) であり、[ActionDispatch::Routing::RouteSet](https://github.com/rails/rails/blob/v4.2.5.1/actionpack/lib/action_dispatch/routing/route_set.rb#L16) のインスタンスを保持している。


ActionDispatch::Routing::RouteSet クラスでは [call](https://github.com/rails/rails/blob/v4.2.5.1/actionpack/lib/action_dispatch/routing/route_set.rb#L812) が定義されており、
その中で、[Journey::Router#serve](https://github.com/rails/rails/blob/v4.2.5.1/actionpack/lib/action_dispatch/journey/router.rb#L29) が呼ばれている。

このメソッドは、`[status, headers, body]` を返しており、ここから rack に渡されるようだ。