OmniAICreator/Qiita-1.07M huggingface dataset:
laravel5でミドルウェアでセッション使えなくて困った　そんな時

## 前置き

Laravelで他言語サイトを作るにあたり、ドメインの後に「/en/」「/ja/」を付けてURLを生成したい
いわゆるプレフィックスというものである。

### 試みたこと

先人の知恵を借りて実装
https://laracasts.com/discuss/channels/tips/example-on-how-to-use-multiple-locales-in-your-laravel-5-website/?page=1

この実装に加えて、万が一プレフィックス無しでアクセスがあった時にデフォルト言語ではなく、それまでにアクセスしていたURLからプレフィックスを判定してプレフィックスを付与したURLにリダイレクトをする設定を試みる。
新しく作成したLanguage.phpのhandle()に手を加える

```php
public function handle($request, Closure $next)
{
    $locale = $request->segment(1);

    if ( ! array_key_exists($locale, $this->app->config->get('app.locales'))) {
        if (Session::has('locale')) {
            $this->app->setLocale(Session::get('locale'));
            return $this->redirector->to(Session::get('locale') . "/" . $request->path());
        }
        $segments = $request->segments();
        $segments[0] = $this->app->config->get('app.fallback_locale');
        Session::put('locale', $segments[0]);
        $this->app->setLocale($segments[0]);
        return $this->redirector->to($segments[0] . "/" . $request->path());
    }

    $this->app->setLocale($locale);
    Session::put('locale', $locale);

    return $next($request);
}
```

見事にセッションが動かない

## 試行錯誤

### とりあえず実装を確認する
こういう時は、何度も記述した内容を振り返る
しかしこれといっておかしい箇所が見当たらない

### 先人の知恵を振り返る
https://laracasts.com/discuss/channels/tips/example-on-how-to-use-multiple-locales-in-your-laravel-5-website/?page=1

とある記述が目に留まる

    Now make that middleware run on all requests by adding it to the $middleware property in app/Http/Kernel.php. It is recommended to add it to the top of the array.

    protected $middleware = [
        'App\Http\Middleware\Language',
        'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
        'Illuminate\Cookie\Middleware\EncryptCookies',
        'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
        'Illuminate\Session\Middleware\StartSession',
        'Illuminate\View\Middleware\ShareErrorsFromSession',
        'Illuminate\Foundation\Http\Middleware\VerifyCsrfToken',
    ];

ひょっとしたら読み込み順を変えればいけるのでは

```php
protected $middleware = [
    'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
    'Illuminate\Cookie\Middleware\EncryptCookies',
    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
    'Illuminate\Session\Middleware\StartSession',
    'Illuminate\View\Middleware\ShareErrorsFromSession',
    'App\Http\Middleware\Language',
    'Illuminate\Foundation\Http\Middleware\VerifyCsrfToken',
];
```

これでセッションが動くようになる
ただ、

    「It is recommended to add it to the top of the array.」
がきになるところ
文章からダジャレのみを抜き出すコマンドを作ってみた


# dajarep

Go言語でダジャレをgrepするdajarepと言うコマンドをつくってみました。



![Untitled3.gif](https://qiita-image-store.s3.amazonaws.com/0/33890/063f0fac-95c8-86b1-1b5b-58483191bb45.gif "Untitled3.gif")


ダジャレを含んだ文書ファイルを・・・

```
人民の人民による人民のための政治
アルミ缶の上にあるミカン
トンネルを抜けるとそこは雪国であった
智代子のチョコ
布団が吹っ飛んだ
我輩は猫である
猫が寝転んだ
その意見にはついていけん
靴を靴箱に入れる
傘を貸さない
イカは如何なものか
親譲りの無鉄砲で子供の時から損ばかりしている
```

dajarepに渡すと・・・

```
$ dajarep test.txt
```

ダジャレのみを抜き出します！

```
アルミ缶の上にあるミカン
智代子のチョコ
布団が吹っ飛んだ
猫が寝転んだ
その意見にはついていけん
傘を貸さない
イカは如何なものか
```

ふしぎ！

ここから落とせます。
[https://github.com/kurehajime/dajarep/releases](https://github.com/kurehajime/dajarep/releases)

# しくみ

dajarepは、ざっくりこんな仕組みで動いています。


## ①文章を分解する

まずは文章を分解します。
[kagome](https://github.com/ikawaha/kagome)という形態素解析エンジンを利用しています。([Qiita解説記事](http://qiita.com/ikawaha/items/ff27ac03e22b7f36811b))。

```

第68代横綱朝青龍
第 接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
68  名詞,数,*,*,*,*,*
代 名詞,接尾,助数詞,*,*,*,代,ダイ,ダイ
横綱  名詞,一般,*,*,*,*,横綱,ヨコヅナ,ヨコズナ
朝青龍   カスタム人名,朝青龍,アサショウリュウ
EOS

```

kagomeを使うと、こんな感じで文章が分解され、「読み」や「品詞」が分かります。

## ②文中に名詞と同じ「読み」が登場する回数を調べる

kagomeで「読み」や「品詞」が分かったので、文章の中にある名詞と同じ「読み」が何回登場するか数えます。

例えば、

> 猫が寝転んだ

という文章は

> ネコガネコロンダ

という読みになります。
そして「猫が寝転んだ」という文の中には「猫」という名詞が含まれていますので、「ネコガネコロンダ」の中に「ネコ」が２回登場することが分かります。

## ③文中に名詞と同じ「単語」が登場する回数を調べる

もう②だけでダジャレ検出ができるようになった気になっていませんか？

実はこのままでは欠陥があります。

> 人民の人民による人民のための政治

や

> 靴を靴箱に入れる

がダジャレ扱いされてしまいます。
こんなものダジャレとは言えません。ダジャレをなめてます。

この程度の重複で「今ダジャレ言ったでしょ？ねぇ、今ダジャレ言ったでしょ？」とドヤ顔で指摘してくる友人がいたらうんざりしますよね。

という訳で、文中に名詞と同じ「単語」が登場する回数も調べます。

## ④単語の重複数 < 読みの重複数　→　ダジャレ

②と③の結果を比較して

>単語の重複数 < 読みの重複数

の関係が成り立つ場合はダジャレです。

> 猫が寝転んだ
> イカは如何なものか

はダジャレです。

> 人民の人民による人民のための政治
> 靴を靴箱に入れる

はダジャレではありません。

ダジャレではありません。

## ⑤補足

ここまでで、ダジャレの検出方法が分かりました。
しかしこれだけでは補足できないパターンがあります。

> 智代子のチョコ
> 布団が吹っ飛んだ

これです。

厳密に比較すれば「チヨコ」と「チョコ」は違いますし、「フトン」と「フットン」も違います。

そこで、「ヨ」と「ョ」を同一視したり「フットン」を「フトン」として読めるようにするために「読み」での比較の際に正規表現で事前置き換えを行っています。

このへんの工夫でダジャレの質が変わってきます。


# まとめ

プログラムの本体とソースはここから落とせます。

プログラムの本体
https://github.com/kurehajime/dajarep/releases
プログラムのソース(Go言語)
https://github.com/kurehajime/dajarep

slackなどのチャットと組み合わせて、誰かがダジャレを言うたびに「今ダジャレ言ったでしょ？ねぇ、今ダジャレ言ったでしょ？」とドヤ顔で指摘してくるbotを作ってみると面白いかもしれませんね。


### 参考記事

* [Pure Go で辞書同梱な形態素解析器 kagome を公開してみました
](http://qiita.com/ikawaha/items/ff27ac03e22b7f36811b)

* [Golangで文字コード判定](http://qiita.com/nobuhito/items/ff782f64e32f7ed95e43)
* [golang から簡単に俳句や短歌を検出出来るライブラリ go-haiku を書いた。](http://mattn.kaoriya.net/software/lang/go/20150823142200.htm)
Fatal error: Exception thrown without a stack frame in Unknown on line 0 となったときに調べるべきこと

[register_shutdown_function()](http://php.net/manual/ja/function.register-shutdown-function.php) 登録したハンドラ関数内でエラーが発生したときに発生するらしい。
なのでまずは `register_shutdown_function()` が使われている箇所を探し、登録されている関数を全て洗っていく必要がある。
ひとつひとつ消したりしながら試して、エラーが出なくなるものがあればそれが犯人。
unity > android > アプリ内で保存したファイルがアプリ再起動後に読み込めない > Application.persistentDataPath + "/" + fileName; を使う

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

Unityでファイル読書きを行うアプリを作った。
Windows, Macでともに問題ないが、Androidでは保存した時にはファイルがあるが、アプリ再起動後にファイル読み込みをしようとするとファイルが見当たらない。

以下の情報を元にResources.Load()を使う必要があるのかもしれない。
http://stackoverflow.com/questions/28031091/unity-reading-text-files-android-web-player

ただ、これのよくわからないのは、Resources.Load()はあるが、Resources.Save()はないこと。

読込み専用なのだろうか。

<hr>
以下の方法で読み書きできるようになった。

参考
http://qiita.com/bokkuri_orz/items/c37b2fd543458a189d4d

```csharp
    bool isRunningOnAndroid() {
		return (Application.platform == RuntimePlatform.Android);
	}

	string getFileName(string baseName) {
		if ( isRunningOnAndroid () ) {
			return Application.persistentDataPath + "/" + baseName;
		}
		return baseName;
	}
```

上記にて得られるファイル名を読み書きに使う。
さくっとPHPの開発環境を作る


1. Dockerを入れる
2. ` docker run -v <YOUR_LOCAL_DIR>:/var/www/html -p 8085:80 -d php:5.5-apache ` を実行する
3. `http://<IP>:8085/` へアクセスする

あらかんたん

https://hub.docker.com/_/php/
raspberryPiでwli-uc-gnpを使う方法 「wlan0: ERROR while getting interface flags: No such device」対策

# raspberryPiでwli-uc-gnpを使う方法
> http://buffalo.jp/products/new/2010/001085.html
> ミニノートPCの無線LANを接続強化。お求めやすい超小型無線LAN子機
![wli-uc-gnp_m1.jpg](https://qiita-image-store.s3.amazonaws.com/0/16757/825973bf-0080-8501-c495-e9b57c6f2f99.jpeg)

差しただけでは認識はされているが、`iwconfig` `ifconfig`で`wlan0`として認識されていない場合は以下のようにすると認識されるようになる。

認識はしている様子

``` bash
$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0411:019e BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNP Wireless LAN Adapter
Bus 001 Device 005: ID 0d8c:0139 C-Media Electronics, Inc.
```

wlan0が無い。

``` bash
iwconfig
lo        no wireless extensions.

eth0      no wireless extensions.
```


## 解決法
http://ryoyamauchi.blogspot.jp/2015/05/raspberry-pi-2-wli-uc-gn.html
ここを読んで解決した。


``` bash
$ lsusb
.......
.......
Bus 001 Device 004: ID 0411:019e BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNP Wireless LAN Adapter
```

で`ID 0411:019e `は`製造元:製品ID`と言う構成のよう。


## 必要なファイルを追加する

掲載の内容とほぼ同じだが、製品IDの`014f`を`019e`に換える。

``` bash
sudo vi /etc/udev/rules.d/99-wireless.rules 
ACTION=="add",SUBSYSTEM=="usb",ATTR{idVendor}=="0411",ATTR{idProduct}=="019e",RUN+="/sbin/modprobe -qba rt2800usb"
```

``` bash
sudo vi /etc/modprobe.d/wireless.conf 
install rt2800usb /sbin/modprobe --ignore-install rt2800usb $CMDLINE_OPTS;/bin/echo "0411 019e" > /sys/bus/usb/drivers/rt2800usb/new_id
```

この後に再起動、WIFIの設定を通常通りすれば、

``` bash
iwconfig
wlan0     IEEE 802.11bgn  ESSID:"ASUS"
          Mode:Managed  Frequency:2.462 GHz  Access Point: AC:9E:17:7B:2B:40
          Bit Rate=65 Mb/s   Tx-Power=20 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality=70/70  Signal level=-27 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:3  Invalid misc:99   Missed beacon:0

lo        no wireless extensions.

eth0      no wireless extensions.
``` 

のように認識される。後はSSID、パスワードと通常のWIFI設定をすればIPがwlan0に割り当てられる。
unity > fileIO > ファイルの存在確認 > System.IO.File.Exists(filename)

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

ファイルの存在確認には`System.IO.File.Exists()`を使う
https://msdn.microsoft.com/ja-jp/library/system.io.file.exists(v=vs.110).aspx

```csharp
if (System.IO.File.Exists (kDicFile) == false) {
    Debug.Log("file not found");
}
```
NetworkX でランダムグラフの最大連結部分を数える

NetworkX という Python 向けの素敵なグラフライブラリを知ったので、練習がてら「ランダムグラフの最大連結部分のサイズがどんくらいになるか」という実験をしてみた。
（ここでの「グラフ」とは数値データを可視化する図のことではなく、ネットワークグラフ的な意味でのグラフ）

#問題設定

* 頂点 (node) がN個ある。
* ランダムに2点を選んで辺 (edge) で結ぶ。これをS回繰り返す。
* 辺でつながった部分（連結部分）の最大サイズはいくらか。

この問題は S. Kauffman の著書「[自己組織化と進化の論理](http://www.amazon.co.jp/gp/product/4480091246/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4480091246&linkCode=as2&tag=yubais-22)」3章で紹介されたもので、多様な物質の混合物から生命が創発するモデルの一部として登場している。

# コードと実行

ここでは networkx, numpy, matplotlib, および pydot をインスコしたものとする。インストール手順については最後に軽く触れる。

上記の問題に従い、ランダムに N=100 個のノード間に S=20 個の辺を引くコードを書いてみる。

```py
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt

N = 100 # number of nodes
S = 20  # number of edges

G = nx.Graph()
G.add_nodes_from(range(N))
G.add_edges_from(np.random.randint(N, size=(S,2)))

# get max connected component
max_size = 0
for component in nx.connected_components(G):
        if len(component) > max_size:
                max_cluster = component
                max_size = len(max_cluster)
print max_cluster

# draw graph
plt.title("Nodes: {}, Edges: {}, max_cluster: {}".format(N, S, max_size))
nx.draw_graphviz(G, alpha=0.3, color='r', node_size=100)
nx.draw_graphviz(G, nodelist=max_cluster, alpha=0.8, color='b', node_size=100)
plt.show()
```

![s20.png](https://qiita-image-store.s3.amazonaws.com/0/40166/524e24f0-ff32-a091-af86-5cb20620b9b5.png)

S=20 とした場合、最大の連結部分は4個にすぎない。

![s50.png](https://qiita-image-store.s3.amazonaws.com/0/40166/52b9b08a-449b-9293-d2c6-28496a56964d.png)

S=50 にするとずいぶん複雑なクラスタができてくる。最大サイズは15個。

![s80.png](https://qiita-image-store.s3.amazonaws.com/0/40166/435108f0-6136-5ae1-b215-26d186b447f4.png)

S=80 ともなれば、もはや半分以上の頂点が単一のクラスタに所属している。

次に N=1,000 に増やして、S と最大クラスタの相関を調べてみる。![output.png](https://qiita-image-store.s3.amazonaws.com/0/40166/40d6ced9-2838-620d-8bc0-65c7ee1e9314.png)
およそ S=500 のあたりで急速に max_cluster のサイズが増加してくることが分かる。

同様のことを N=10,000 で行う。

![n10k.png](https://qiita-image-store.s3.amazonaws.com/0/40166/17795e87-fa99-9f78-6407-9870c9b9ad63.png)

ほぼ同じ。S/N = 0.5 あたりで相転移的にクラスタが巨大化することが分かる。

# インストールとか

NetworkX 自体は pip で簡単に

```
# pip install networkx
```

でインスコ出来る。グラフの可視化を綺麗にするには Graphviz というのを使うのが良くて、これは

```
# pip install pydot
```

で行けるんだが、なぜか僕の環境では実行時に

```
NameError: global name 'dot_parser' is not defined
```

というエラーが出た。調べてみると
http://stackoverflow.com/questions/15951748/pydot-and-graphviz-error-couldnt-import-dot-parser-loading-of-dot-files-will
pyparsing というライブラリのバージョンが 2.x になると動かなくなるらしい。以下の手順で 1.5.7 に戻す。

```
pip uninstall pyparsing
pip install -Iv https://pypi.python.org/packages/source/p/pyparsing/pyparsing-1.5.7.tar.gz#md5=9be0fcdcc595199c646ab317c1d9a709
pip install pydot
```
サーバー管理ツール「Ajenti」がなかなか良さげ

Linux系のサーバー管理ツールといえば [Webmin](http://www.webmin.com/) や、有料なら [cPanel](http://cpanel.com/) なんかが有名。
だけど他にフリーなのないかなと探してみると **Ajenti** というのが最近人気があるっぽい感じだった。

> Ajenti 公式サイト
> http://ajenti.org/


## インストール

インストールは簡単で、例えば CentOS6 なら以下のコマンドで一発。
（すべて yum で入れてくれる模様）

```sh
curl https://raw.githubusercontent.com/ajenti/ajenti/1.x/scripts/install-rhel.sh | sh
```

Ubuntuとか他のものは以下のページにインストール方法がある。
http://support.ajenti.org/list/27624-kb/?category=9290

Pythonで動いてるらしく、上記インストールコマンドでそれら必要なものは全て揃えてくれる。
（ちなみに CentOS6.5 に入れた時は Python2.6.6 が入ってた）

インストール後に起動すると **https://localhost:8000** でアクセスできるようになる。
（ちなみに上記インストールで起動までしてくれる。また、ポートは設定画面で変更できる）

ログイン画面はこのような感じ。イマドキ。
![2015-08-27_180937.png](https://qiita-image-store.s3.amazonaws.com/0/37122/9e923c4b-de48-bdce-5024-67b8f820622d.png)

初期状態のID/パスワードは **root** / **admin** になっている。

-----

以下ログイン後の画面をざっと紹介。

## ダッシュボード
![2015-08-27_184830.png](https://qiita-image-store.s3.amazonaws.com/0/37122/9be64016-9f8d-8997-fcc9-7ba934274fd2.png)

## Ajenti の設定画面
言語を ja_JP にすれば日本語表示になる。（ Ajenti の再起動が必要）
![2015-08-27_180202.png](https://qiita-image-store.s3.amazonaws.com/0/37122/28b22f4d-6cd8-99a3-79b4-9beab9987a9a.png)

## cron 管理画面
![2015-08-27_180502.png](https://qiita-image-store.s3.amazonaws.com/0/37122/d850c798-d2bc-8bc0-4dbe-ad29f67ffc8d.png)

## yum とかのパッケージ管理画面
![2015-08-27_180640.png](https://qiita-image-store.s3.amazonaws.com/0/37122/901521e6-87e2-328c-f098-a41878a289e2.png)

## ターミナル画面
パッケージインストール時などは擬似ターミナルがタブ表示される。
コマンド入力も可。
![2015-08-27_175647.png](https://qiita-image-store.s3.amazonaws.com/0/37122/2d8951e2-a268-0381-1188-2a03f3927511.png)

## Apache の管理など
Apache が入っていればバーチャルホストや設定ファイルの編集など可。
ちなみに Nginx も可。
![2015-08-27_180417.png](https://qiita-image-store.s3.amazonaws.com/0/37122/a549e3c8-60e0-8e9b-239c-de2ccf1a9fb9.png)

## 「メモ帳」なんて機能も
といってもベタテキストをファイルで保存するもの。（保存先は選べる）
![2015-08-27_180907.png](https://qiita-image-store.s3.amazonaws.com/0/37122/900392bd-311e-70f0-6948-74f54245bc83.png)


## デスクトップ通知

それと地味に好印象な機能で「デスクトップ通知」がある。
パッケージのインストールとかで処理が終わると「完了しました！」とかデスクトップ通知がくる。
（もちろんモダンブラウザのみ）
ブラウザ管理ツールならではですね。

-----

今回は Vagrant で入れて試してみただけなので、どこかで使ってみようかと思う。
それにしても「Ajenti」てなんと読むんだろ。「あじぇんてぃ」でいいのかな・・・？
Ajax的な感じで「えーじぇんてぃ」な気がしないでもない。
Django + SQLAlchemy 環境でModelのデバッグを見やすくした話


#  経緯

Python and Django 1ヶ月目の私です。Rails歴は2年ほど。
PythonのDebugってなんでこんなに見づらいのだろう。特にModel。
以下の様な表示。こんなの見て誰得。

```python
>>> class Foo(object):
        pass
>>>
>>> repr(Foo())
'<__main__.Foo object at 0x02A74E50>'
```

そう思いなにか違う方法はないかネットの海を探し歩き、reprを使うと綺麗に見れる！
やった！これで 辛さから開放だ！


```python
def __repr__(self):
    return '<Stats: description={0.description!r}, mystat={0.mystat!r}>'.format(self)
```

...なにこれめんどくさい。

class 1つ1つに書き込む必要がある。
一発ライブラリか何か追加して出来ないのかー？？と、思うわけ。

# あった。

参考： http://stackoverflow.com/a/15929677/5114776

```python
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

if __debug__:
    # monkey-patch in useful repr() for all objects, but only in dev
    def tablerepr(self):
        return "<{}({})>".format(
            self.__class__.__name__,
            ', '.join(
                ["{}={}".format(k, repr(self.__dict__[k]))
                    for k in sorted(self.__dict__.keys())
                    if k[0] != '_']
            )
        )
    Base.__repr__ = tablerepr
```

```
>>> session.query(FooBar).get(1)
<FooBar(id=1, foo='bar', comments='foobar', hoge=1231242342341342342, fuga=datetime(2015, 5, 5, 5, 5, 5), tiger='waearsdtdygfyfguiohjohjohpp'>
```

しかし、この参考だけではまだまだ見づらい。
俺は機械じゃねー！人が見ても見やすいフォーマットを！それでないと意味が無い！

# もっと見やすく


```python
Base = declarative_base()

if __debug__:
    # monkey-patch in useful repr() for all objects, but only in dev
    def tab_char(max_length, target_lenght):
        tab = []
        tab_char_count = 4
        tab_count = (max_length/tab_char_count - target_lenght/tab_char_count) + 1
        for i in range(tab_count):
            tab.append('\t')
        return "".join(tab)


    def table_repr(self):
        max_length = max(map(lambda n: len(n), self.__dict__.keys()))
        return "\n<{}({})>".format(
            self.__class__.__name__,
            ', '.join(
                ["\n\t{}{}= {}".format(k, tab_char(max_length, len(k)), repr(self.__dict__[k]))
                 for k in sorted(self.__dict__.keys())
                 if k[0] != '_']
            )
        )

    Base.__repr__ = table_repr
```

```
>>> session.query(FooBar).get(1)
<FooBar(
	id					= 1
	fooooooooo			= 'bar',
	comments			= 'foobar',
	hoge				= 1231242342341342342, 
	fuga				= datetime(2015, 5, 5, 5, 5, 5), 
	tiger				= 'waearsdtdygfyfguiohjohjohpp'>
```

完璧。
CircleCI上でFaux Pasを使って Objective-C コードの品質チェックをする


http://fauxpasapp.com/

Faux PasはXcodeプロジェクト向けの有償の静的解析・コードチェックツールです。

個人的に OCLint http://oclint.org/ や Clang Static Analyzer http://clang-analyzer.llvm.org/ の活用に近年苦しんでいたのでFaux Pasは救世主でした。

Faux Pasのトライアル版は、実行時に待ち時間が15秒あったり、解析結果の一部がマスクされて見れないという制限があるものの、LINTツールとしてコーディングルールやスタイルのチェック結果の成功/失敗をCIで取るだけなら充分に機能して、導入を試してみるのには都合がよかったのです。

```yaml:circle.yml
dependencies:
  pre:
    - brew install caskroom/cask/brew-cask
    - brew cask install fauxpas
    - /opt/homebrew-cask/Caskroom/fauxpas/*/FauxPas.app/Contents/Resources/install-cli-tools

test:
  pre:
    - fauxpas check Ubiregi2.xcodeproj/ --target "Ubiregi2" --minErrorStatusSeverity Error --configFile fauxpas.json
```

1. brew-cask をCircleCI上で使えるようにする
2. Faux Pas のパッケージをインストールする
3. Faux Pas のコマンドラインツールを入れる
4. `fauxpas check` でユニットテスト実行前にコードをチェックする

ということをやっています。

`fauxpas check Ubiregi2.xcodeproj/ --target "Ubiregi2" --minErrorStatusSeverity Error --configFile fauxpas.json`

について `--minErrorStatusSeverity` で `Error , Warning , Concern` のどれかを指定します。
`--configFile fauxpas.json` は渡すオプションをJSON形式で指定できます。今回ルールの設定はここでしました。

詳しくはドキュメントをごらんください
http://fauxpasapp.com/docs/#configuration

```:fauxpas.json
{
  "excludedRules": [
    "TranslationFormatMismatch",
    "UnknownResourceCodeReference",
    "HardcodedUIString",
    "MissingTranslation",
    "WeakReferenceToTopLevelXIBObject",
    "ReleaseBuildCompilerArgs"
  ]
}
```

上記は既存のアプリケーションのコードの解析でエラーが発生したルールを無視するようにしました。
私たちはインクリメンタルに改善作業をすすめてゆくのが好きですので、一度すべてのエラーを無視して、コーディング規約を制定しつつ、コード修正が必要な箇所についてパッチをあてていきます。なのでこのCIビルド上のチェックの条件は一番ゆるくなっています。

各種ルールの定義はこちらを見てください
http://fauxpasapp.com/rules/

## Swift

※ 残念ならがFaux Pas は現在Swiftに対応していません。ですのでこの方法は老プロジェクト向けですね。

http://fauxpasapp.com/faq/#does-faux-pas-support-swift-code-in-my-projects

しかしちゃんと最新のObjective-Cコードで動くし、応援の意味をこめてライセンス購入したいなと思っています
http://fauxpasapp.com/buy/
セキュリティグループで設定したセキュリティグループへの許可が有効にならないケース

お世話になります。
[AWSキッチン](http://aws.lepra.jp/)のシェフです。

EC2のセキュリティグループを使用されていますか？

セキュリティグループでの許可はセキュリティグループに対してもできるので、１つ１つのIPを指定せず、サーバの役割単位で設定できるので大変重宝してます。

ただし、Elastic IP アドレス経由(インターネット経由)で、一度VPCの外にでてからのアクセスですと、許可されているセキュリティグループに所属するサーバーでも許可が有効にならないように見受けられます。

何らかの操作でElastic IP アドレス経由でのアクセスする場合は、個別のElastic IP アドレスも設定してあげないといけなさそうです。
VisualStudio(2015)ではconstメンバー関数と非constメンバー関数でテンプレートの型推論をしてくれない

開発するのにVisualStudioの強力なIDE機能を使いたいのでVisualStudio大好き人間なのですが、なにせコア機能が弱いところがあるのが難点だと言われています。
よく言われるのはC++11のサポートですが、C++11でなくてもVisualStudioが弱いところをまた見つけてしまいました・・・。

タイトルちょっと分かりにくいのですが、以下の様なことです。

```NonConst.cpp
#include <iostream>

struct S
{
	S() {}

	int Foo()
	{
		std::cout << "Non-Const : ";
		return 1;
	}

	double Foo() const
	{
		std::cout << "Const : ";
		return 0.1;
	}

	template<typename T>
	void Func(T(S::*f)())
	{
		std::cout << (this->*f)() << std::endl;
	}
};

int main()
{
	S().Func(&S::Foo);

	return 0;
}
```

ここで、

0. 関数``Foo``は、constメンバー関数（以降「前者」）と非constメンバー関数（以降「後者」）があります。
0. 関数``Func``は、非constメンバー関数を受け取る関数です。
0. ということは、``Func(arg)``と呼んだときは、明らかに``Func``の（実）引数``arg``は非constメンバー関数でなければなりません。
0. ならば、``Func(&S::Foo)``の``&S::Foo``は、「後者」の非constメンバー関数を指していることが分かります。
0. 後者なら``T``は``double``と型推測できます。

ということで、[clang](http://melpon.org/wandbox/permlink/tdTlDaYfMILFpbwM)や[gcc](http://melpon.org/wandbox/permlink/05AujWlJk5tzLN4r)ではこれは普通にコンパイル＆実行できます。
ただ、なぜかVisualStudio（2015で試しました）では「**テンレンプレート引数Tに対して減少できませんでした**」となってコンパイルできないんですよね・・・。
型推論エンジンが弱いのかなんなのかはちょっと分かりません。

なお、``Func``をconstメンバー関数を呼ぶようにすると

```Const.cpp
#include <iostream>

struct S
{
	S() {}

	int Foo()
	{
		std::cout << "Non-Const : ";
		return 1;
	}

	double Foo() const
	{
		std::cout << "Const : ";
		return 0.1;
	}

	template<typename T>
	void F(T(S::*f)() const) const
	{
		std::cout << (this->*f)() << std::endl;
	}
};

int main()
{
	S().F(&S::Foo);

	return 0;
}
```

[clang](http://melpon.org/wandbox/permlink/H4114cS3JkkhypaH)と[gcc](http://melpon.org/wandbox/permlink/JuTcY9l3xZCp6oGH)はもちろんちゃんと動きますが、VisualStudio(2015)だとコンパイル時の「Tに対して減少できませんでした」に加えて、IntelliSenseが「**S::Fooのどのインスタンスが対象であるかを特定できません**」とエラーを吐いてます。
お前はconstメンバー関数ポインタに非constメンバー関数ポインタを代入できると思っているのか・・・？（※ちなみに単純に試したらさすがにそれは型エラーになってくれました）

まぁ、実は言語仕様上は未定義動作でclangとgccはたまたま動いているだけ、という可能性は否定できませんが・・・。

なお、テンプレートの型推論を必要としない場合

```NonTemplate.cpp
#include <iostream>

struct S
{
	S() {}

	int Foo()
	{
		std::cout << "Non-Const : ";
		return 1;
	}

	int Foo() const
	{
		std::cout << "Const : ";
		return -1;
	}

	void F(int(S::*f)())
	{
		std::cout << (this->*f)() << std::endl;
	}
};

int main()
{
	S().F(&S::Foo);

	return 0;
}

```

はちゃんと動いてくれるんですよね。

ということで、とりあえず型推論してくれないだけなので、Fの呼び出し時に型を明示的に指定すれば解決するのですが・・・困ったものです。
AndroidでBlur効果を実現する方法(Glide Transformations, Blurry)


iOSでは割りとよく見るBlur(ぼかし)ですが、Androidでも実現したい時があります。
Blurについて調べていた時に、便利なライブラリと出会ったので紹介します。

## Glide Transformations
1つめはwasabeef先生作の`Glide Transformations`です。

https://github.com/wasabeef/glide-transformations

ImageLoaderとしてGlideを使っている方はこちらを使えばさくっとBlur効果を実現できます。

```
Glide.with(getContext())
       .load(resId)
       .bitmapTransform(BlurTransformation(getContext(), Glide.get(getContext()).getBitmapPool()))
       .into(background)
```

使い方は上のようにTransformにライブラリでサポートされているTransformationを渡すだけです。
(RenderScriptを使用する必要はあります)

他のTransformationはGithubからたどってください。

## Blurry
2つめはwasabeef巨匠作の`Blurry`

https://github.com/wasabeef/Blurry

Glide Transformationsとは異なり、Viewを指定したりしてBlurを書けることが出来ます。Blur特化なライブラリです。インタフェースがとてもシンプルでいい感じです。

```
Blurry.with(MainActivity.this)
        .radius(10)
        .sampling(8)
        .async()
        .capture(findViewById(R.id.right_bottom))
        .into((ImageView) findViewById(R.id.right_bottom));
```

サンプリングやどのViewに対してBlurをかけるのか等指定する事が可能です。Githubに上がっているサンプルアプリを触ると、とてもいい感じなのがわかります。

```
Blurry.with(MainActivity.this)
        .radius(25)
        .sampling(2)
        .async()
        .animate(500)
        .onto((ViewGroup) findViewById(R.id.content));
```

また、↑のようにImageViewに反映するだけではなく作られたDrawableをViewGroupに追加することも可能です。ここは`Glide Transformations`と異なる点です。

![device-2015-08-27-180102 copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/70154/ad8c085f-97db-5088-a7ed-9912936ae576.jpeg "device-2015-08-27-180102 copy.jpg") ![device-2015-08-27-180121 copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/70154/426f1dfe-7999-21b5-f8b4-a3e49a581b8c.jpeg "device-2015-08-27-180121 copy.jpg")

また、Blurryの`async()`や`animate()`などもサポートされているというホスピタリティが素敵でした。



## まとめ
現在、`Glide`を使用していて画像に対してBlurを実現したい場合は`Glide Transformations`を使う方がいいです。キャッシュもありますし、わざわざBlurryを追加して使う必要もありません。
そもそも非同期で取得した画像に対してBlurryを使うのは少し面倒くさいです・・。(BlurryのIssueを見ると、キャッシュが2.0でサポートされるかもしれません。)


### おまけ
Blurryがアニメーション・Blur効果の微調整・非同期など様々なものをサポートしているのに、中身がとてもシンプルな設計でコードも少なく感動したので記事を書こうかなと思い立ちました。

- Blurry
- Blur
- BlurFactor
- BlurTask
- Helper

クラスは↑の5つのみ。Blurryクラスはインタフェースとして提供されているので、実質４つだけ。しかもそれぞれとてもシンプルで読みやすい。コンパクトで使いやすいライブラリでとても素敵でした。
terraform apply で Error connecting to SSH_AUTH_SOCK エラーが出るのを解決する

Terraform で `remote-exec` provisioner を含むプランを `terraform apply` するとこんなエラーが出ることがある：

```text
$ terraform apply
digitalocean_droplet.web: Refreshing state...
digitalocean_droplet.web: Destroying...
digitalocean_droplet.web: Creating...
  image:                "" => "ubuntu-14-04-x64"
...

digitalocean_droplet.web: Provisioning with 'remote-exec'...
Error applying plan:

1 error(s) occurred:

* Error connecting to SSH_AUTH_SOCK: dial unix 0: no such file or directory
```

これは Terraform がリモートへの接続のためにローカルの `ssh-agent` プロセスを利用しようとしたとき、プロセスが実行中でない場合に発生する。

解決するには `ssh-agent` を起動する（ここらへんを参照のこと：[ssh-agentの使い方 - Qiita](http://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf)）または `ssh-agent` を使わないように設定する：

```text:terraform.tf
resource "foo_resource" "bar" {
    # ...
    provisioner "remote-exec" {
        # ...
        connection = {
            agent = false                 # ←agent を経由しないようにする
            key_file = "/path/to/id_rsa"  # ←使う秘密鍵を明示的に与える

        }
    }
}
```
Arquillian extension jacoco で単体テストのカバレッジを出力しました。

Arquillian と jacoco を使って Java EE アプリケーションの単体テストカバレッジを出力しました。
[GitHub にソースを置きました](https://github.com/javadera/sampleArq)

#環境
1. Eclipse(Mars)
2. WildFly 8.2.1.Final
3. PostgreSQL 

PostgreSQL は無くても大丈夫です。

#プロジェクト作成
Maven プロジェクトを新規作成して"org.wildfly.archtype", "wildfly-javaee7-webapp-archetype" を選択しました。
![q1.JPG](https://qiita-image-store.s3.amazonaws.com/0/23355/a9af81cd-73b3-1c5a-9efc-a7616d31f199.jpeg)

サンプルのソースコードが生成されるので、少々手を加えて使いました。
1. WildFly のディレクトリを src/test/resources/arquillian.xml の jbossHome に記載してください。
2. PostgreSQL を使わない場合は src/test/resources/test-h2-ds.xmlをテストクラス(MemberRegistrationTest.createTestArchive)で使ってください。
3. PostgreSQL を使う場合は test データベースを作成しておいてください。

Jacoco については、山ｐさんのページを参考にしました。
[旧山ｐの楽しいお勉強生活 2014-07-27](http://d.hatena.ne.jp/yamap_55/20140727/1406438741)

最初、上記で紹介されている POM の記述をペーストして使ったのですが、target/site ディレクトリがうまく生成されませんでした。調べたところ、[Arquillian extension jacoco](https://github.com/arquillian/arquillian-extension-jacoco) に行き着き、最初に追記したものを消してから POM に追記しました。

注意点としては
1. POM の profile (jacoco) の部分で "wildfly-arquillian-container-remote" を追加しました。
2. Maven 実行時に **jacoco:report** オプションが必要でした。

1 については、実際の開発時にテストサーバ上で WildFly を起動したままにしてテストできるかな？と思っています。
2 については、[Arquillian extension jacoco](https://github.com/arquillian/arquillian-extension-jacoco) の Readme の下の方にあるコマンドを実行するだけだと site ディレクトリが生成されませんでした。

#カバレッジの結果
生成された target/site ディレクトリ配下の index.html を開くとテストのコードカバレッジが見れます。
![j1.JPG](https://qiita-image-store.s3.amazonaws.com/0/23355/3c60b6dc-89e2-d5bb-7990-3ce4cf3ae5df.jpeg)

リンクをたどるとメソッドのカバレッジが見れます。
![j2.JPG](https://qiita-image-store.s3.amazonaws.com/0/23355/716ebb20-fd70-00ee-dc74-ca05d2e1867c.jpeg)

setId はDBが自動採番なのでテストから外しています。さらにリンクをたどるとソースコードでテストされているか否かが色付けで見られます。
![j3.JPG](https://qiita-image-store.s3.amazonaws.com/0/23355/cd8bafea-d1d0-ba07-cab2-d38de34a0afd.jpeg)

色分けについては、tsubu-mustardさんの記事 [WildFly+jacocoでintegration-testのカバレッジ取得](http://qiita.com/tsubu-mustard/items/a2faaab7d1ad53edf452) の最後で触れられています。

> 緑：実行された命令。
> 赤：実行されなかった命令。
> 黄：分岐において一部のみ実行された命令。

です。
今度は REST のテストをしてみようと思います。
RedshiftのLIKE句でハマる

## やりたいこと
- Redshiftのテーブルに対してLIKEで部分一致。
- LIKEの条件は外部から入力されるため、**PreparedStatementを用いる**

## なぜかエラーになる
- PreparedStatementで `LIKE ? escape'@'` のように設定
- `%0@%` のようなものをbindする。→ ex) `0%`,`20%`,`100%`...

上記の要領で実装すると、以下のエラーがでてしまう。
>Specified types or functions (one per INFO message) not supported on Redshift tables

いやそんなテーブルには触れてないし関数らしきものも使ってないつもりだが。

## 手打ちだと
以下のクエリを直接実行すると、問題なく通る。
`SELECT name FROM hoge WHERE name LIKE '%0@%' ESCAPE '@';`
ぐぬぬ...

## 何が悪い？
上記エラーではINFO見てよと言っているようだが、処理中ではRedshiftからのINFOメッセージが出せていなかったので、手打ちでPreparedをやってみる。こんなのめったに書かない。
`PREPARE pstmt(text) AS SELECT name FROM hoge WHERE name LIKE $1 ESCAPE '@';`
↓
エラー！！
>INFO:  Function "like_escape(text,text)" not supported.
>ERROR:	Specified types or functions (one per INFO message) not supported on Redshift tables.

なんか勝手にFunctionを使ってることになってる模様。
試しにESCAPEをとってみると
`PREPARE pstmt(text) AS SELECT name FROM hoge WHERE name LIKE $1;`
↓
通った！！

## 結局
- ESCAPE句は使わず、エスケープパターンはデフォルトの `\\`（バックスラッシュ2つ）にすれば、PreparedStatementでも処理できた。
- MySQLでは（構文は異なるが）PREPARE文においてもESCAPE句が設定できる。

*バックスラッシュ2つって、なんかすごくバグ含みそうでイヤなんだけどなぁ。。。*
細かく刻んでしまったコミットをまとめたいときの便利コマンド

確認したのは下記のバージョン。
$ git --version
git version 2.4.4

細かく刻んでしまったコミットを、まとめたいときは、「git rebase -i」オプションを使ってブランチ上のコミットを修正すると便利です。

$ git rebase -i HEAD~{n}

(例)HEAD~{n} ：n個前のコミットを意味する。10個前から表示したいときは{n}=10

$ git rebase -i HEAD~5

コマンドを実行すると、

テキストエディタが開かれHEADから5つ分のコミットが表示されます。

pick be989ca [commit comment1]
pick 310154e [commit comment2]
pick a554a0d [commit comment3]
pick 310154e [commit comment4]
pick a73546d [commit comment5]

使うコミットを p:pick(use commit)、統合して消したいコミットを f(use commit, but melt into previous commit, and discard this commit’s log message)にします。

pick be989ca [commit comment1]
f 310154e [commit comment2]
f a554a0d [commit comment3]
f 310154e [commit comment4]
f a73546d [commit comment5]

これを保存してエディタを終了

git log で確認。

ちなみに「-i」オプションだけでは、マージコミットは表示されません。
マージコミットが含まれる場合は「-p」オプションをつけて実行します。

$ git rebase -i -p HEAD~~

リモートリポジトリに push　する際、コミットハッシュが変わるので「-f」が必要です。

$ git push -f

以上です。

【補足】
メッセージの中に、手順が出力されています。
これを参考にコミットメッセージのeditなどもできます。

Commands:
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
deprecated なメソッド呼び出しで警告が出ないようにする


```
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
// ここに deprecated なメソッドを呼び出すコード
#pragma clang diagnostic pop
```

マクロでやるなら `_Pragma()` が使えるようなので、

```
// Suppress deprecated warnings
#define OldCode(args)                                                  \
  _Pragma("clang diagnostic push")                                     \
  _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")    \
  args                                                                 \
  _Pragma("clang diagnostic pop")
#endif

OldCode({
  // ここに deprecated なメソッドを呼び出すコード
});
```
html5のvideoタグからcanvasに画像を出力して遊ぶ【JavaScript】

#概要
html5のvideoタグでwebカメラを起動する.
videoタグの動画をcanvasに出力(スクショみたいに).

#環境
windows10+Firefox or Chrome.
ハードは変更せずubuntu+Firefoxで起動したところ動かなかった←解決方法<a href="http://qiita.com/tukiyo3/items/140ec948fd1ffbabeaa8">Linux + motion + webcamでライブ監視カメラを設置する</a>.

#ソース


```js:index.js

var video = document.getElementById("video");

document.getElementById("draw").onclick = function(){
    try{
        drawVideo();
    }catch(e){
        alert(e);
    }
};


var localstream;

/*webカメラを起動する*/
function start() {
    if (navigator.webkitGetUserMedia) {
        
        navigator.webkitGetUserMedia({
            audio: false,
            video: true
        }, function(stream) {
            localstream = stream;
            console.dir(stream.getVideoTracks()[0]);
            var url = window.webkitURL.createObjectURL(stream);
            video.src = url;
        }, function(error) {});
    
    } else if (navigator.mozGetUserMedia) {
        
        navigator.mozGetUserMedia({
            video: true
        }, function(stream) {
            video.mozSrcObject = stream;
            video.play();
            streaming = true;
        }, function(err) {
            alert("An error occured! " + err);
        });
        
    } else if (navigator.getUserMedia) {
        navigator.getUserMedia("audio, video", success, error);
    }
}


/*canvasにvideoを展開*/
function drawVideo(){
    var video = document.getElementById("video");
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    context.drawImage(video, 0, 0, 260, 260);
}
    
/*videoをstop*/
function stop() {
    if (video.mozSrcObject) {
        xvideo.pause();
        video.mozSrcObject = null;
    } else {
        if (localstream) {
            localstream.stop();
        }
    }
}
```

```html:index.html
<video id='world' width="256" height="256" autoplay></video>
<canvas id="canvas"></canvas>
<button onClick="start()">start</button>
<button onClick="stop()">stop</button>
<button id="draw">set canvas</button>
```


#補足
setIntervalでdrawVideoを回すと動的なものを作ることも可能.
EventCenter: AndroidのEventBusのSwift版っぽいのを作りました


はじめに
=========

Swiftで普通にObserverパターンを作ろうとすると意外に面倒じゃないでしょうか。
KVOは何かやりたいことと違うし、NSNotificationCenterはTypeSafeじゃないし、通知名の文字列を管理するのも少し面倒です。

その点AndroidのEventBusは少し動的な要素が入りますが(Methodが使われていないとWarningが出るのを抑えないといけない)、なかなかバランスが良いと感じていて好きです。
Swiftでも同じ感じで作れないかなぁと試行錯誤していたら、まあまあ良い感じで作れたのでご紹介します。

SwiftEventBusという名前のpodが既にあったので、 **EventCenter** と名づけました。

EventCenterの良い所
---------

* 任意のObject(class/struct/enum等)をEventオブジェクトとしてpostできる
* Event通知をもらう側がCastしなくても良い
* Eventの種別は「class/struct/enum 等の型」で決まるので、Event名の文字列を管理しなくて良い（うっかり重複することがない）
* どのThreadでEvent通知を欲しいかは、Event通知をもらう側で決められる

制限
-----

* swift1.2で動作確認しています

使い方
========

Install
---------
### cocoapods

```
  pod "EventCenter"
```

### マニュアル Install
実体は１ファイルなので、
https://github.com/mokemokechicken/EventCenter/blob/master/Pod/Classes/EventCenter.swift
をそのままコピっても良いかもしれません。

使いかた
------

例えば、こんな感じです。

```swift
class ViewController: UIViewController {

    override func viewWillAppear(animated: Bool) {
        let ec = EventCenter.defaultCenter

        // Event HandlerとしてClosureを登録する。この引数の型にマッチしたHandlerのみが呼ばれる
        ec.register(self) { (event: MyAwesomeModel.UpdateEvent) in
            self.updateView()
        }
        
        ec.register(self) { (event: MyAwesomeModel.StoreEvent) in
            switch(event) {
            case .SUCCESS:
                print("store ok!")
            case .ERROR:
                print("store error!")
            }
        }

        // または、methodを登録することもできます。型がマッチしたEventの場合呼ばれます。
        ec.register(self, handler: self.onEvent)

        // 呼び出されるThreadを指定することもできます。MainThread用には便利Methodが用意されています。
        ec.registerOnMainThread(self, handler: onEvent)
    }

    override func viewWillDisappear(animated: Bool) {
        // registerの第一引数に指定したObjectのhandler全てを解除します。
        EventCenter.defaultCenter.unregister(self)
    }

    func updateView() {
        // ...
    }

    func onEvent(event: MyAwesomeModel.UpdateEvent) {
        self.updateView()
    }

}


class MyAwesomeModel {
    class UpdateEvent {}
    enum StoreEvent {
        case SUCCESS
        case ERROR
    }
    
    func notifyUpdate() {
        EventCenter.defaultCenter.post(UpdateEvent())
    }
    
    func notifyStoreResult() {
        EventCenter.defaultCenter.post(StoreEvent.SUCCESS)
    }
}

// If you want to see more cases, see also Tests.swift

```

Source
=========

https://github.com/mokemokechicken/EventCenter

ポイント
----------

`let h = hander as? (T -> Void)` 

みたいな感じで、マッチする handler を簡単に選択できるということに気がついたので、
勢いで作ったという感じです。

```swift:EventCenter.swift
    public func post<T>(obj: T) {
        for info in observers {
            if let h = info.handler as? (T -> Void) {
                if let queue = info.queue {
                    dispatch_async(queue) { h(obj) }
                } else {
                    h(obj)
                }
            }
        }
    }
```

おわりに
========

もう少し便利メソッドなど増やしても良いかもしれません。
不具合などあれば教えていただけると幸いです。。
Finder で指定したフォルダをルートとしてローカルサーバを起動する

Mac 限定ネタです。
要は "php -S" を Finder の「サービス」から実行するというだけですが、、

## 環境
Mac OS X 10.10.3
Automator バージョン 2.5 (409.2)

## Automator.app の保存先をローカルに変更する
いつからか Automator.app の保存先がデフォルトで iCloud になっているので、システム環境設定 > iCloud からこれを無効にします。

iCloud Drive の「オプション...」を選択。
![hoge.jpg](https://qiita-image-store.s3.amazonaws.com/0/5807/7abdfec5-1796-59e4-0681-48558fab3da3.jpeg)

Automator.app のチェックを外します。
![スクリーンショット 2015-08-27 15.51.24のコピー.jpg](https://qiita-image-store.s3.amazonaws.com/0/5807/3d32ebbc-cb09-9a46-936a-4956a2b595d6.jpeg)


## Automator で サービス を作成
Automator.app を起動して新規 > サービスを選択します。
![スクリーンショット 2015-08-27 15.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/5807/3904d333-e0e6-b41f-2889-06241c312062.png)

「"サービス"は、次の選択項目を受け取る」を「フォルダ」に、「検索対象」を「Finder.app」に設定します。
![スクリーンショット 2015-08-27 15.44.46.png](https://qiita-image-store.s3.amazonaws.com/0/5807/9bba3d89-5962-7882-3e63-1919c90fb8e5.png)


## AppleScript を書く
アクション一覧から「AppleScript を実行」をダブルクリックして追加し、以下のスクリプトをコピペしてください。

```applescript
on run {argv}
	display dialog "Enter port number" default answer "8888"
	set targetPort to text returned of result
	
	tell application "Terminal"
		set currentTab to do script "cd " & (argv)'s POSIX path
		delay 1
		do script "php -S localhost:" & targetPort in currentTab
	end tell
end run

```

保存後、Finder.app でフォルダを右クリックして「サービス」の中を覗くと保存した名前でワークフローが登録されていますので、あとは実行するだけです。
![スクリーンショット 2015-08-27 16.09.46.png](https://qiita-image-store.s3.amazonaws.com/0/5807/73051221-d12d-60d5-88ff-3d95e027b937.png)
c++ builder > コンストラクタ内で new TList()すると 「System.pas が見つかりません」となる

```txt:動作確認
C++ Builder XE4
```

ユニットを作成し、その中でクラス(TErrorHandlerなど)を作成している中、ひっかかったこと。

private:にて `TList *m_list;`と定義しているものに対してコンストラクタで以下をやろうとした。

```cpp
__fastcall TErrorHandler::TErrorHandler() {
   m_list = new TList();
}
```

そうすると上記の new の処理にて「System.pasが見つかりません。」のエラーが出た。
コンストラクタでnew TList()は問題だったのかわからないが、new TList()を違う場所ですることで回避した。
フライ曲線が半安定である説明（半安定な楕円曲線の定義）

#はじめに
フェルマーの最終定理が成り立たないと仮定すれば，フライ曲線

```math
y^2=x(x-a^n)(x+b^n)
```
が得られる([詳しい話はこちら](http://qiita.com/simanezumi1989/items/d7e7e97aee2f4f09efa9))。この記事では，フライ曲線が半安定な楕円曲線であることを説明する。

このページは動画でも解説をしています。
[フライ曲線は半安定](https://youtu.be/OYIWjl4EtjU)

（9/8 楕円曲線の定義を変更した）
#半安定な楕円曲線の定義
※ここでの定数$a,b$はフライ曲線とは関係ない
##安定
>楕円曲線 $y^2=x^3+ax^2+bx+c$が**安定**であるとは，(右辺)=0としてできる3次方程式が，全ての素数$p$を法として**重根を持たない**ときである。

##半安定
>楕円曲線 $y^2=x^3+ax^2+bx+c$が**半安定**であるとは，(右辺)=0としてできる3次方程式が，ある素数 $p$ で**2重根を持ち，それ以外の素数で3重根を持たない**ことである。

##不安定(呼び方は違うかも)
>楕円曲線 $y^2=x^3+ax^2+bx+c$が**不安定**であるとは，(右辺)=0としてできる３次方程式が，ある素数 $p$ を法として**3重根を持つ**ときである。

楕円曲線自身は（右辺）=0としても重根を持たないですが，素数 $p$ を法とすると持つ場合があるんですね。

#フライ曲線は半安定な楕円曲線
フライ曲線

```math
y^2=x(x-a^n)(x+b^n)
```
に注目すると，解は $x=0,a^n,b^n$ なので $a$ と $b$ が互いに素であれば，どのような素数 $p$ を法としても，2重根までですね。そして，フェルマーの最終定理の $a,b,c$ はそれぞれ互いに素らしいので，フライ曲線は半安定になりますね。

#課題
フェルマーの最終定理の $a,b,c$ がそれぞれ互いに素であることの説明。

解決済み：[フェルマーの最終定理と互いに素](http://qiita.com/simanezumi1989/items/62921a55cc54904005ca)

#関連記事
前前の記事：[谷山=志村予想⇒フェルマーの最終定理](http://qiita.com/simanezumi1989/items/d7e7e97aee2f4f09efa9)
前の記事：[谷山=志村予想の例](http://qiita.com/simanezumi1989/items/043f6a8d62ff413f9893)
次の記事：[フェルマーの最終定理と互いに素](http://qiita.com/simanezumi1989/items/62921a55cc54904005ca)
トラフィック監視としてiptraf-ngを使う

おすすめのトラフィック監視ツールの紹介

バックグラウンドでも値を取得できるので、プロンプトに表示したり問題があった場合に通知するのに使ってます。

デフォルトではインターフェイスがNcurses風で分かりやすいです。

```bash:
$ yaourt -S --noconfirm iptraf-ng

$ sudo iptraf-ng

# Mac Addressをバックグラウンドで5分間、監視
$ sudo iptraf-ng -B -t 5 -l all -L ~/iptraf.log
$ cat iptraf.log

# IP Addressを監視
$ sudo iptraf-ng -B -t 5 -i all -L ~/iptraf-ip.log
$ cat iptraf-ip.log
```

基本的には、ログの表示に慣れておき、いつものMac Address以外が割り込んだ場合、通知すれば良いと思います。ポートとかの監視は、-sです。一番わかり易いのは-iでIP Address上のやりとり。

場合によってはrootで実行したり、sudoersを編集し、ユーザーで実行したりします。ユーザーで実行する場合、ログなんかを書き換えられやすいので注意ですが。

`cron`で定期的に実行しておいて、それを問題があった場合にプロンプトや通知などで表示するのもお勧めです。
RedHat Enterprise Linux 6.7 に GitBucket をインストールしてみた

# はじめに
git のリポジトリを立てるために、GitBucket を使ってみる。
RedHad Enterprise に入れる手順を残しておく。

# 環境
```
$ more /etc/redhat-release
Red Hat Enterprise Linux Server release 6.7 (Santiago)
```

# インストール手順
## Java のインストール
ここはサクっと

```
$ yum install java-1.7.0-openjdk-devel.x86_64
.
.
(完了)
$ java -version
java version "1.7.0_85"
OpenJDK Runtime Environment (rhel-2.6.1.3.el6_7-x86_64 u85-b01)
OpenJDK 64-Bit Server VM (build 24.85-b03, mixed mode)

```

## GitBucket をダウンロード
https://github.com/takezoe/gitbucket
公式サイトのリリースページから最新版を取ってくる。今だと 3.5 。

```
$ wget https://github.com/takezoe/gitbucket/releases/download/3.5/gitbucket.war
```

### 動くかどうか試してみる

```
$ java -jar gitbucket.war
```

これで、ポート8080 で接続できたら成功

### GitBucket をデーモン化する
gitbucket 公式で、redhat 用のスクリプトがあるので、これを使用する。

```
$ cd /etc/rc.d/init.d/
$ wget https://raw.githubusercontent.com/takezoe/gitbucket/master/contrib/linux/redhat/gitbucket.init
```

修正する箇所は、以下の部分と実行ユーザ名あたり。
GITBUCKET_HOME はリポジトリなどを配置する場所。
GITBUCKET_WAR_FILE は文字通り war ファイルを配置する場所。

```
# Default values
GITBUCKET_HOME=/var/lib/gitbucket
GITBUCKET_WAR_FILE=/usr/share/gitbucket/lib/gitbucket.war
```


設定が終わったら、スクリプトを動かしてみる。

```
$ /etc/rc.d/init.d/gitbucket start
Starting GitBucket server:                                 [  OK  ]
```

FAILED になった時は、log を見て設定を見直す。


# 終わりに
簡単に github クローンの gitbucket が動かせることは、すごい。
あとは、gitbucket のバックアップ方法などを調べる。
ペネトレーションテストにKail LinuxではなくBlackArch Linuxを使う

ペネトレーションテストのOSとして有名なのが`Kail Linux`ですが、個人的には、`BlackArch`のほうが使いやすいと思っています。

[https://github.com/BlackArch/blackarch](https://github.com/BlackArch/blackarch)

基本的にBlackArchのインストールは、Arch系のOS上から簡単に行えます。通常は、Arch Linuxのインストーラーからインストールすると思うのですが、特に決まったインストール方法はありません。

```bash:
$ curl -sL -O http://blackarch.org/strap.sh

# 改竄されていないか checksum する
$ if [ "`sha1sum strap.sh`" = "f8456229463718c097cf70ed06a806f981be7423" ];then
  echo ok
fi

# このスクリプトは /etc/pacman.conf を書き換えます
$ sudo sh strap.sh

# すでにある Arch Linux から BlackArch のパッケージをインストールして使う方法
$ sudo pacman -Sgg | grep blackarch
$ sudo pacman -S blackarch

# 新しいディスクにインストールする方法
$ sudo pacman -S blackarch-install-scripts
$ sudo blackarch-install
```

BlackArchは、Window ManagerにAwesomeを使いますし、使い方自体は、Arch Linuxのものなので、使いやすいです。

また、Arch Linuxのインストールが面倒な場合、BlackArchから構築して、`/etc/pacman.conf`の`blackarch`をコメントアウトするというのも良いかもしれません。
Arch Linuxをコマンド一つでインストールするツールを作った

まず、注意点として、ディスクをフォーマットする処理を挟むので、VM上で使ってください(VM以外でも使えますが)。

##VM上にインストールする

Arch Linuxのインストーラを起動して、以下のコマンドを実行します。


```bash:
$ curl -sL git.io/air | zsh
```

##VM上にデスクトップ付きのArch Linuxをインストールする



```bash:
$ curl -sL git.io/airarch | zsh
```

##ディスクを指定してインストールする

ディスクを指定する場合は、`x`には`sd{n}`の`n`の部分を代入します。ない場合は、存在するディスクにインストールされます。

以下は空USBにデスクトップ付きのArch Linuxをインストールする方法です。

```bash:
# sdb=installer, sdc=空USB
$ x=c;curl -sL git.io/airarch | zsh
```

##ユーザー独自の設定でインストールする

```bash:
$ u=syui;curl -sL git.io/air | zsh
```

設定ファイルは、[https://github.com/syui/arch/tree/master/json](https://github.com/syui/arch/tree/master/json)にありますが、追加したい場合は、`Pull Req`か`Fork`してください。`.json`を抜いたファイル名を`u`に代入することで使えます。

```json:json/sample.json
[
  {
    "user": "syui",
    "host": "macbook",
    "disk": "sda",
    "partition": {
      "sda1": {
        "type": "vfat",
        "size": "0 200"
      },
      "sda2": {
        "type": "ext4",
        "size": "200 100%"
      }
    },
    "app": "zsh",
    "comment": "simple",
    "reboot": "false"
  }
]
```

##jq 1.4 -> jq 1.5

`jq`のバージョンが上がりまして、その際に、要素に改行を入れていると、エラーが出るようになったので、`jq 1.4`を使って書いた上で、それを変換して書き出すといいです。


```json:json/sample_back.json
[
  {
    "user": "syui",
    "host": "macbook",
    "disk": "sda",
    "partition": {
      "sda1": {
        "type": "vfat",
        "size": "0 200"
      },
      "sda2": {
        "type": "ext4",
        "size": "200 100%"
      }
    },
    "app": "
          zsh
          git
          vim
          tmux
    ",
    "comment": "simple",
    "reboot": "false"
  }
]
```

```bash:
# jq 1.4で実行
$ cat sample_back.json | jq . > sample.json
```
Android のANRの調査方法



## 基礎知識

* ANRは、UI(メイン)スレッドで起きる
* UI(メイン)スレッドは、イベントループ・スレッド。だから、実行時間の長い処理があると、他をブロックして処理できなくなってしまう。


## DDMSで調べる


## traces.txtで調査



## Strict Modeを設定する

以下を設定すると、ダイアログも表示されなくなる?

```Java
public void onCreate() {
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                           .detectAll()
                           .penaltyLog()
                           .penaltyDeath()
                           .build());
    super.onCreate();
}
```

公式ドキュメントより引用

```Java
public void onCreate() {
     if (DEVELOPER_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyLog()
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects()
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }
```


本番で実行したくない場合

```
if (BuildConfig.DEBUG)
```


### Strict Mode ポリシー: クラス

* StrictMode.ThreadPolicy: 特定のスレッドに適応
* StrictMode.VmPolicy: VMプロセス内の全てのスレッドに適応

* 公式ドキュメント [StrictMode | Android Developers](http://developer.android.com/reference/android/os/StrictMode.html "StrictMode | Android Developers")


## パフォーマンス分析ツール

* Systrace: [Systrace | Android Developers](http://developer.android.com/tools/help/systrace.html "Systrace | Android Developers")
 * 環境: Android SDK Tool 20以降。Python。
 * デバイス: API Level 16(Android 4.1)以降。USB デバッギング接続
* Traceview: [Traceview | Android Developers](http://developer.android.com/tools/help/traceview.html "Traceview | Android Developers")

### パフォーマンス分析ツール解説記事

* 2010年 [Android application (performance and more) analysis tools - Tutorial](http://www.vogella.com/tutorials/AndroidTools/article.html "Android application (performance and more) analysis tools - Tutorial")

## スレッドの状態

* running - executing application code
* sleeping - called Thread.sleep()
* monitor - waiting to acquire a monitor lock
* wait - in Object.wait()
* native - executing native code
* vmwait - waiting on a VM resource
* zombie - thread is in the process of dying
* init - thread is initializing (you shouldn't see this)
* starting - thread is about to start (you shouldn't see this either)



## 参考リンク

* Stack Overflow [performance - Android - how do I investigate an ANR? - Stack Overflow](http://stackoverflow.com/questions/704311/android-how-do-i-investigate-an-anr "performance - Android - how do I investigate an ANR? - Stack Overflow")

### 公式ドキュメント

* ANRを防ぐための公式ドキュメント [Keeping Your App Responsive | Android Developers](http://developer.android.com/training/articles/perf-anr.html "Keeping Your App Responsive | Android Developers")


## 検索用語

Android, ANR, Application Not Responding, dialog, traces.txt, adb pull, UI thread, main thread, ADT, perfomance, analysis
アンドロイド、ダイアログ、表示、UIスレッド、メインスレッド、パフォーマンス、分析、診断、デバッグ、デバッギング、プロファイリング
WIP ビットコイン "child-pays-for-parent"とは何か?

以下に移行しました<br><a href="http://block-chain.jp/tech/wip-bitcoin-child-pays-for-parent/" title="WIP ビットコイン &quot;child-pays-for-parent&quot;とは何か?">WIP ビットコイン &quot;child-pays-for-parent&quot;とは何か?</a>
[WIP] 新しいプロジェクトを始める際に考えておいたほうがいいことリスト

SIであろうがなかろうが関係なく、このへん一度は考えておかないとあとでツラくなる。

"非機能要求", "横断的関心事", "ソフトウェアアーキテクチャ"なんかに近いと思うけど、そこまで整理できてないし、非機能要求仕様定義ガイドラインとか非機能要求グレードで整理されたことだとは思うので、あらためてこれらのドキュメントも確認しておきたい。

また、Twelve-Factor Appの考え方に則るというのも、可搬性、可用性を上げるのに役に立ちそうなので、それも入れ込みたい。

### 参考元/引用元

* [uml - 『ソフトウェアシステムアーキテクチャ構築の原理(第2版)』読んだ - Qiita](http://qiita.com/kenjihiranabe/items/0a41a0965808300bd450)
* [The Twelve-Factor App （日本語訳）](http://12factor.net/ja/)
* [運用を楽にするためのアプリケーションコードを書くということ - sonots:blog](http://blog.livedoor.jp/sonots/archives/44075238.html)

### tl;dr チェックリスト

もうちょっと整理したい。今後も手直ししていく。

* セキュリティ
  * なにかが漏えいした際のリスクは？保護すべきものはなに？
  * リスクに対応してどうやって保護する？
* 秘匿情報の管理
  * 依存サービス（DBとか外部APIとか）へのクレデンシャルはどう管理する？
* パフォーマンスとスケーラビリティ
   * 求められる性能は？
     * レイテンシー
     * 単位時間辺りの処理数
  * パフォーマンス監視はする？できる？
  * 負荷テストはやる？どのていどやる？
  * 本番で稼働したままダンプだせるようにする？
  * 本番環境で原因究明をする手段はある？
  * DNS解決は問題になりやすいので要注意。キャッシュする仕組みをいれておく？
* 可用性とレジリエンス
  * 動いているかの監視の仕方は？zabbixとかで監視できる？
  * APIでバージョンとモードを返すのは必要？
    * 例えば`admin/version`みたいなAPIがあって、レスポンスが`0.1.4_staging`みたいなのだと問題があったときの解決の助けになるかも
  * エラーハンドリングどうする？監視システムに通知する？
  * 開発者への通知はどうやる？メール？チャット？
  * supervisorによる監視は必要？autorestartは？
  * daemontools, upstart, systemdとかでデーモン化する？
  * サブシステムがダウンしてたらどうなる？
  * どんなときならクラッシュしてもいいの？
  * グレースフルリスタート、シャットダウンは必要？サービス止めるときはどうする？
  * ホットデプロイ的なのは必要？
  * 設定の動的読み込みは必要？
* ログ
  * ログの出力先は？ローテーションルールは？保存する場所は？保存する期間は？ログの漏れは許容できる？
  * ロギング設定は外部ファイルに切り出されていて、柔軟に変更できる？
* 非同期処理
  * バッチやワーカーみたいなバックグラウンドでの処理は必要？
  * どうやって起動させる？cron？ジョブキュー？RundeckやJP1みたいなジョブ管理システム [ref: [Jenkins - cronの代替になりそうなジョブ管理ツールのまとめ - Qiita](http://qiita.com/shrkw/items/5c3d53358b0016a09504)] 入れる？
* 国際化
  * 国際化必要？
  * 国際化フレームワークはコードとデータの分離に役立つ側面もあるので、導入時期を検討するとよい
* 発展性 （スケーラビリティ）
  * ひとつのサーバーで処理しきれなくなったときにスケールアップ、スケールアウトできる？
* アクセシビリティ
  * 対象のユーザーは？どんな環境のユーザー？
* 開発リソース
  * 誰がメンテナンスするの？
  * そのシステムはどれくらい長く使うの？
* 配置場所
  * どこのサーバー？
  * そのサーバーに求めるSLAは？
  * だれが管理してる？
  * サーバーのシステム更新はどうする？
  * サーバー自体の監視はしてる？
  * リリースは自動化する？
* 規則
* 使用性 （ユーザビリティ）

## 詳細

各項目について詳細を書いてもいいかも。例えばこんな感じで。

### ロギング

#### チェック項目

  * ロギング設定は外部ファイルに切り出されていて、柔軟に変更できる？
  * ログの出力先は？
  * ローテーションルールは？
  * 保存する場所は？
  * 保存する期間は？
  * ログの漏れは許容できる？

#### 検討すべき理由

ログはとても重要、なぜなら、とかなんとか

* 分析ソースとしてのログ
  * ビジネス
  * 障害
* アーカイブされるログ

#### ソリューションの例示

* syslogロガーに流してセントラルrsyslogサーバーでアグリゲーション
* Fluentdエージェントにログを渡して、アグリゲーションサーバーに送る。この場合のアグリゲーションサーバーはローカルネットワークに建てたり、TreasureData, BigQueryなどの外部サービスに送るのもよくある。んで、ElasticSerach, Kibanaでグラフ化とか。海外ではFluentdの代わりにLogStashがメジャーな印象。
* ログのアーカイブには、ローカルネットワークのストレージを使ったり、AWS S3やAWS Glacierを使ったりとかもある