OmniAICreator/Qiita-1.07M huggingface dataset:
[Groovy]PHPライクにOSの物理パス上のファイルを読み込む

# 概要
GroovyはJVM上で動くので、利用するプログラム（class）はクラスパス上に存在している必要があります。
しかし、Groovyはまるでスクリプト言語のようにサクサク開発できるというのもその特徴/メリットの一つ。
スクリプト言語といえば、実行時にそのスクリプトから見た相対パスや、絶対パスで別のスクリプトを読み込んで利用することが出来ます。
PHPで言うところのrequireやincludeがそうですね。

スクリプト言語の素敵な特徴の一つだと思っているのですが、JVM上で動くGroovyだとそうは行きません。
ということで、とりあえずGroovyで、別のGroovyファイルをまるでPHPのrequireの用に読み込んで利用するサンプルを書いてみました。
残念ながら、読み込むファイル（requireに指定するファイル）でclassを宣言してしても、それは有効になりません。
この部分を今後何とか対応できるようにしてみたいですね。。。

# サンプル
以下のコードが、実際に別のGroovyファイルを読み込んで実行しているものです。

```groovy
def require = {String path, String reference = "that" ->
    File myscript = new File(path)
    Eval.me(reference, this, myscript.getText())
}


require("/home/koji/work/groovy/myscript.groovy") // この時点でThis is myscript.groovy. this script is loaded from ...とコンソールに表示される

// このファイルでは全く宣言していない変数が利用できるようになっている！
assert cljFromMyScriptGroovy() == "This is Closure in myscript.groovy"
assert textFromMyScriptGroovy == "hogehoge!"
```

読み込まれているGroovyファイルは以下のようになっています。普通のGroovyファイルです。

```groovy:myscript.groovy
that.cljFromMyScriptGroovy = {-> "This is Closure in myscript.groovy"}
that.textFromMyScriptGroovy = "hogehoge!"
println "This is myscript.groovy. this script is loaded from ${that}"

// 残念ながらこの方法だとclassを定義しても、このファイルをrequireしてる方に反映させることは出来ない。。。
class Test {
    def name = "Test class"
}

```
コマンド一発でAndroidの画面を録画してGIFを作成する

2019年7月追記
意外とみんな困ってそうなので3年ぶりにアップデート
余計かもしれませんが ずっと使っていて便利だったので、Slackまでそのまま上げられるようにするコマンドも追加しておきます。

`YOUR_PATH` に保存先
スクリプトはgit管理していて公開しているので、Slackのtokenは `YOUR_SLACK_TOKEN` を環境変数としてtoken.confに定義しています。
パスが個人的なものになっているので、
消すなりgit管理してない人は直接token書いてしまっても良いと思います。

gifサイズは大きくなりがちなので、ffmpegのオプションで `scale=iw*2/3:ih*2/3` とかを変えてあげるとサイズが割と小さくなります。
経験則では画質を下げてもそこまで容量が下がらない&&荒くなるので 動画のサイズを小さくした方がいいです。
端末そのままのサイズで録画されるので、最近の端末だとoriginalサイズは4kとかになったりする

↑ 追記文

---

デザイナーやチームの他のメンバーの人と、
どんな動きをするのか等 UI/UXのやり取りをする際に
GIFを作成してslack等に送りたい時が多々あるのですが、
録画して...変換して...とやっていると中々手間だったりします。
コマンド一発で接続している端末の録画をし、
とりあえずデスクトップに動画とGIFを保存するスクリプトを書きました。
YOUR_PATHの箇所を変更すれば、好きな場所に保存されます。

スクリーンショット バージョンは[こちら](http://qiita.com/AAkira@github/items/62c31acf4bad0b97c8a5)

# 環境

* 今回はOSXでbash使ってます
* adbのpathが通っている前提
* GIF変換までする方はffmpegをインストールしておいて下さい mac(brew) -> `brew install ffmpeg`
* Androidの端末バージョンは4.4以上

# Script

以下のスクリプトを作成します

```bash:adb-screen-record.sh
#!/bin/sh

DATE=`date '+%y%m%d%H%M%S'`
FILE_NAME=record-${DATE}
YOUR_PATH=~/Desktop

SCRIPT_DIR=`dirname $0`
cd $SCRIPT_DIR # move script directory
source ../token.conf # gitに上げないように slackのtokenは別管理
SLACK_TOKEN=$YOUR_SLACK_TOKEN

adb shell screenrecord /sdcard/${FILE_NAME}.mp4 &
pid=`ps x | grep -v grep | grep "adb shell screenrecord" | awk '{ print $1 }'`

if [ -z "$pid" ]; then
  printf "Not running a screenrecord."
	exit 1
fi

printf "Recording... finish? [y]"
while read isFinished; do
  case "$isFinished" in
    "y" | "Y") break ;;
    *) printf "Incorrect value." ;;
  esac
done

kill -9 $pid # Finish the process of adb screenrecord

while :
do
  alive=`adb shell ps | grep screenrecord | grep -v grep | awk '{ print $9 }'`
  if [ -z "$alive" ]; then
      break
  fi
done

printf "Finish the recording process : $pid\nSending to $YOUR_PATH...\n"

adb pull /sdcard/${FILE_NAME}.mp4 $YOUR_PATH
adb shell rm /sdcard/${FILE_NAME}.mp4

echo "Convert to GIF? [y]"
read convertGif
case $convertGif in
	"y" | "Y") ffmpeg -i ${YOUR_PATH}/${FILE_NAME}.mp4 -an -r 12 -pix_fmt rgb24 -vf scale=iw*2/3:ih*2/3 -f gif ${YOUR_PATH}/${FILE_NAME}.gif # creating gif 
						;;
 	*) ;;
esac

echo "Upload to slack? [y]"
read isUpload
case $isUpload in
  "y" | "Y") ;;
  *) exit 0;; 
esac

echo "Input channel name : "
read channelName

curl -XPOST -F "token=$SLACK_TOKEN" -F "channels=#$channelName" -F "file=@${YOUR_PATH}/${FILE_NAME}.gif" -F "filename=${FILE_NAME}.gif" "https://slack.com/api/files.upload"

```

録画はyを入力すると終了します。
その後、yを押すとGIFへ変換されます。
他のボタンを押すと終了します。

このスクリプトを任意の場所に保存し、
.bash_profile等にpathを書いておけば
任意の場所から `adb-screen-record.sh`のコマンド一発で
デスクトップに変換・保存されます。

adb screenrecordの制約で録画時間は3分までになっています。
今回はデフォルトの値を利用してますが、録画サイズなどを指定したい場合は[こちら](http://developer.android.com/intl/ja/tools/help/shell.html)を見てパラメーターを設定して下さい。
GIF変換のオプションを変更する場合は[こちら](https://ffmpeg.org/ffmpeg.html)を見て下さい。

screenrecordを終了してすぐに送信するとエラーが起きるので
sleep 3としましたが、他に何か良い方法がありましたら教えて下さい。
-> @aremokoremoさんに教えていただいた方法を追記しています
# ITエンジニアのための機械学習理論入門（第５章）


## ロジスティック回帰とROC曲線
### ロジスティック関数による分類確率推定（？）
 * ロジスティック回帰を用いることでパーセプトロンの用にクラス分類するのではなく、クラスに属する確率を求めることができる
 * 例えば２種類の分類ができる２変数のデータが与えられている
     * この時２変数の線形関数により分類する直線f(x)をひける
         * 前章参照
     * 2種類のデータを決定する基準がf(x)の値に依存する場合、属するクラスの確率をf(x)の値より決めることができる
         * f(x)>0がクラスAならf(x)が大きい場合はクラスAの確率が高くなるとか
         * f(x)<0がクラスBならf(x)が低い場合はクラスBの確率は高くなるとか
     * 上記のように決定した時f(x)=0のときは、それぞれのクラスになる確率は50%となる
      * このような確率の分布をもつ場合、ロジスティック関数によりモデル化可能
         
        ```math
        \shigma(a) = \frac{1}{1+e^{-a}}
        ```
    
    * 上の式のaの値をf(x)の値として最尤推定法を用いて線形関数の重みを推定する
        * クラスAのデータがクラスAになる確率、クラスBのデータがクラスＢになる確率をロジスティック関数の分布に従う形で最大になるように重みを推定する
        * 最適な重みを推定する際のアルゴリズムは別途必要でここではニュートン・ラフソン法を用いた
        * ニュートン・ラフソン法の場合，分類する確率がf(x)が0となるところを境にクラスA，Bに分類する確率を100％にする
            * そのほうがトレーニングデータ的には適応度が高くなるため
            * もちろんオーバーフィッティング
        * これを防ぐためにある程度推定できた段階で最適化をやめる



### ROC曲線による学習モデルの評価
 * ロジスティック回帰により得られる線形関数はf(x)=0におけるクラスA、Bに属する確率は50％になるように対応している
 * しかしロジスティック関数で得られる結果をそのまま当てはめる必要はない
     * つまりクラスAに属する確率が52%だからといってそのままクラスAに分類する必要はない
     * 適用する問題によりそこのしきい値は変える
 * このようなときに発見したいデータとそうでないデータがある
     * 例えばある病気の検査を受ける人とそうでない人
 * データの呼び方で以下のようにわけられる
     * 真陽性（True Positive）
         * 発見したいデータと分類され実際にそのようなデータである
     * 偽陽性（False　Positive）
         * 発見したいデータと分類されたが実際はそのようなデータでない
     * 真陰性（True Negative）
         * 発見したくないデータと分類され、実際にそのようなデータである
     * 偽陰性（False Negative）
         * 発見したくないデータと分類されたが、実際はそのようなデータでない
 * 学習モデルとしきい値で分類される確率で分類した時に真陽性率や偽陽性率などでそのモデルの出来具合を判断できる
     * 極端な話、真陽性率100%で偽陽性率が0%だとしたら素晴らしいが、それぞれはトレードオフであるため難しい
         * 真陽性率を高めるには確率のしきい値を下げる必要があるが、そうすると誤検出率（偽陽性率）も高くなる
 * 実際にどのしきい値をどの程度の値にするかを判断するのがROC（Receiver Operating Characteristic）曲線
     * 真陽性率と偽陽性率の相関をしめしたグラフ
     * ある確率をしきい値としたときのそれぞれの値がプロットされる（はず・・・？）
     * ここで支配されていない確率をしきい値として選択するような感じなのかな？
     * 他にも精度や再現率、F値で求めるとかだと思う
         * 精度は正と予測されたデータのうち、実際に正である割合
             * 精度は例えば100つ正であるデータのときに、それを1つでも正と判定できて、他のデータが判定できていない場合でも高くなる
         * 再現率は正のデータのうち、正と予測されたデータの割合
             * 再現率は与えられたデータすべて正と判定すれば高くなる
     * F値は精度、再現率より計算される
         * F値が最も高いしきい値を選択するのが無難っぽい
SendGridユーザー必見！メールの改行コードが消される問題の解決策


SendGridでテキストメールを送っていると勝手に改行が消されることがあります。

```
メールの1行めです。
メールの2行めです。
メールの3行めです。
```

　↓

```
メールの1行めです。メールの2行めです。メールの3行めです。
```

メールの文字コード・改行コードの問題かと思い、いろいろと試してみましたが、一向に改善しません・・・

基本に立ち返り、メールのソースを表示してみると、、、

```                                                                                                                                                                                                                                                             
From: hoge@example.com
To: fuga@example.com

(略)

------------=_1460958941-30340-116
Content-Type: text/plain;
 charset=UTF-8
Content-Transfer-Encoding: base64

YzE1ZTUyYmE5O3RjNDI0MDhi1zQ5YW3jYIJjMD4I44CACgoK1S0tLS0tLQrj
(略)

------------=_1460958941-30340-116
Content-Type: text/html; charset="UTF-8"
Content-Disposition: inline
Content-Transfer-Encoding: base64

ieOBr+ODquO3u+ODg+ODiO7BleOCj0OBvuGBmROCk+OAgjwvcD4KPHA+PGEg
(略)

------------=_1460958941-30340-116--
```

勝手にマルチパートメールにされてる！！

調べてみると、テキストメールを勝手にHTMLメールにして、開封トラッキングやクリックのトラッキング機能を付けてくれる機能が働いていたようです。
https://sendgrid.com/docs/User_Guide/Settings/mail.html#-Plain-Content

しかも、 **改行コードは取り除かれる** らしいです。
https://support.sendgrid.com/hc/en-us/articles/200181418-Plain-text-emails-converted-to-HTML

こんなお節介機能はいらないので、テキストメールはテキストメールのまま送信してもらいましょう！！
![スクリーンショット_2016-04-18_21_20_21.png](https://qiita-image-store.s3.amazonaws.com/0/74551/94c9b42e-f1c3-2288-7b4a-96b33fbaadd1.png "スクリーンショット_2016-04-18_21_20_21.png")
コマンド一発でAndroidのスクリーンショットを撮る

デザイナーやチームの他のメンバーの人とやり取りをする際に
デバイスのスクリーンショットを撮ってslack等に送りたい時が多々あるのですが、
わざわざDDMSを毎回立ち上げて…とかやるのが面倒なので
コマンド一発で接続している端末のスクリーンショットを撮影し、
とりあえずデスクトップに保存するスクリプトを書きました。
YOUR_PATHの箇所を変更すれば、好きな場所に保存されます。

GIF(動画)バージョンは[こちら](http://qiita.com/AAkira@github/items/c8537c24d9c13bd39ae1)

# 環境

* 今回はOSXでbash使ってます
* adbのpathが通っている前提

# Script

以下の様なスクリプトを保存します

```bash:ada-screen-shot.sh
#!/bin/sh

DATE=`date '+%y%m%d%H%M%S'`
FILE_NAME=screenshot-${DATE}.png
YOUR_PATH=~/Desktop

adb shell screencap -p /sdcard/${FILE_NAME}
adb pull /sdcard/${FILE_NAME} ${YOUR_PATH}
adb shell rm /sdcard/${FILE_NAME}

```

このスクリプトを任意の場所に保存し、
.bash_profile等にpathを書いておけば
任意の場所から `adb-screen-shot.sh`のコマンド一発で
デスクトップに保存されます。
AndroidのTimePickerDialogに苦しめられた話

だいたいこれ。
http://qiita.com/tetsukay/items/a28a572775bc3648e78b

時間を選択する際に、OK/キャンセル以外の第三の選択肢「未定」を追加したいってことがありました。
Android 5.0で見る限りは、setButtonに BUTTON_NEUTRAL でボタンを追加することで簡単に出来ましたが、4.4などのいくつかの端末で問題が発生しました。

## 問題１：キャンセルしたくても出来ない

書いてあるように、 `onStop` で最終的にコンストラクタで設定したlistenerが呼ばれる。
setButton とかでボタンを追加しても、消えるときに `onStop` が呼ばれてしまうので、
追加したボタンのアクション -> コンストラクタのlistener
が自動的に呼び出される。

## 問題2：コンストラクタのlistenerを使わないと、設定された時刻を取れない

似たようなクラスである、 DatePickerDialog には `getDatePicker` というgetterが存在しており、問題1と同様のバグはあるものの、
コンストラクタではnullを渡す -> setButtonでPOSITIVEなボタンを再定義
で逃げれた。
ただ、TimePickerDialog ではTimePickerを取り出せないので、その回避策が取れない。
（無理したら、idとかから取れるのかもしれないけど、内部状況に依存するので微妙）

## 結論

**TimePickerDialog 使えねぇ**

## とりあえずな回避策

styles.xmlには下記がある前提で、

```xml
    <style name="AppTheme.Picker" parent="AppTheme">
        <item name="android:textColorPrimary">@color/text_gray</item>
    </style>
```

AlertDialog.Builder を使って、自作しました。

```java
    public static Dialog showTimePickerDialog(Context context,
                                              Calendar defaultValue,
                                              final TimePickerDialog.OnTimeSetListener listener,
                                              DialogInterface.OnClickListener pendingListener) {
        Calendar target = defaultValue == null ? Calendar.getInstance() : defaultValue;
        int hour = target.get(Calendar.HOUR_OF_DAY);
        int minute = target.get(Calendar.MINUTE);

        final TimePicker picker = new TimePicker(new ContextThemeWrapper(context, R.style.AppTheme_Picker));
        picker.setIs24HourView(true);
        picker.setCurrentHour(hour);
        picker.setCurrentMinute(minute);

        AlertDialog dialog = new AlertDialog.Builder(context)
                .setView(picker)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        listener.onTimeSet(picker, picker.getCurrentHour(), picker.getCurrentMinute());
                    }
                })
                .setNegativeButton(android.R.string.cancel, null)
                .create();


        if (pendingListener != null) {
            String pendingLabel = dialog.getContext().getString(R.string.dialog_button_pending);
            dialog.setButton(DialogInterface.BUTTON_NEUTRAL, pendingLabel, pendingListener);
        }
        dialog.setCancelable(false);
        dialog.show();

        return dialog;
    }
```


TimePickerDialogをSupport Libraryに入れてほしい。。
302SHでは、5.0と同様に問題が無かった。何故。。
組合せ最適化で麻雀のあがりを判定する

# <i class='fa fa-columns' /> はじめに
[組合せ最適化](http://qiita.com/Tsutomu-KKE@github/items/bfbf4c185ed7004b5721)を使うと、麻雀であがれるかどうかの判定もできます。
ここでは、簡単のため、あがり形(雀頭が1つ、面子が3つ)かどうかだけ、考えることにします。また、槓子も対象外とします。

## 用語

- 雀頭(ジャントウ): 2つの同じ牌
- 面子(メンツ): 順子、刻子、槓子のいずれか
- 順子(シュンツ): 同じ種類で順番に並んだ3つの牌
- 刻子(コーツ): 3つの同じ牌
- 槓子(カンツ): 4つの同じ牌
- あがり形: 1つの雀頭と4つの面子

# <i class='fa fa-columns' /> 考え方と定式化

- 条件を満たすかどうかを考えますので、目的関数はなしとします。
- 与えられた牌を使って、雀頭または順子または刻子となる組合せを列挙し、候補とします。
- 候補を上手く選んで、全ての牌がちょうど1回あらわれるようにします。
- 雀頭をちょうど1つ選びます。

<table>
<tr><td>変数</td><td>$ x_i \in \{0, 1\} $</td><td>$x_i$: $i$番目の候補を選ぶかどうか</td></tr>
<tr><td rowspan="2">制約条件</td><td>$\sum_i{a_{ij} x_i} = 1 ~ ~ \forall j \le 13$</td><td>$a_{ij}$: $i$番目の候補に牌$j$が含まれるかどうか</td></tr>
<tr><td>$\sum_{i \in H}{x_i} = 1$</td><td>$H$: 雀頭の候補</td></tr>
</table>

なお、この問題は、集合分割問題となります。

# <i class='fa fa-columns' /> Pythonによる実行例

- 麻雀の牌を萬子(マンズ)(0-8)、筒子(ピンズ)(10-18)、索子(ソーズ)(20-28)、風牌(かぜはい)(30,32,34,36)、三元牌(さんげんぱい)(38,40,42)の数字で表すことにします。こうすることにより、順子は必ず連続し、連続するならば順子になります。
- 14枚の牌(変数 hai)を入力とし、5つの雀頭または面子を返す関数 calc を定義します。


```py3:python3
def calc(hai):
    import pandas as pd
    from itertools import combinations, product
    from pulp import LpProblem, LpBinary, LpVariable, lpSum, value
    cand  = [] # 候補
    a = pd.DataFrame(sorted(hai), columns=['v'])
    b = a.v.value_counts()
    for i in b[b >= 2].index: # 雀頭候補作成
        cand.extend(combinations(a[a.v == i].index, 2))
    n2 = len(cand)
    for i in b[b >= 3].index: # 刻子候補作成
        cand.extend(combinations(a[a.v == i].index, 3))
    c = a.v.unique()
    for i in range(len(c)-2): # 順子候補作成
        if c[i+1] - c[i] == c[i+2] - c[i+1] == 1:
            cand.extend(product(a.index[a.v==c[i]],
                                a.index[a.v==c[i+1]],
                                a.index[a.v==c[i+2]]))
    m = LpProblem() # 数理モデル
    v = [LpVariable('v%d'%i, cat=LpBinary) for i in range(len(cand))] # 変数
    m += lpSum(v[:n2]) == 1 # 雀頭は1つ
    d = [[] for _ in range(14)] # 牌別候補番号リスト
    for i, ca in enumerate(cand):
        for j in ca:
            d[j].append(v[i])
    for i in d:
        m += lpSum(i) == 1 # 全ての牌がどれかの候補に1つ存在
    if m.solve() != 1: return None
    return [[a.v[j] for j in cand[i]] for i, vv in enumerate(v) if value(vv) > 0.5]
```

実際に計算してみましょう。

```py3:python3
def show(n):
    if n < 30:
        return chr(ord('１')+n%10)+'萬筒索'[n//10]
    return '東西南北白発中'[n//2-16]

hai = [0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8] # 14枚の牌
for i in calc(hai):
    for j in i: print(show(j))
    print()
>>>
１萬
１萬

９萬
９萬
９萬

１萬
２萬
３萬

４萬
５萬
６萬

７萬
８萬
９萬
```

きちんと雀頭と面子を見つけることができました。

以上
ksnctf : #5 Onion

This is the note when I found out #5 Onion of ksnctf.

It seems to encode base64, and I decode it. But a strings that I could not understand was displayed.

Decode and decode and decode,,,, but A head of the strings was same.

I write a below script in python.

```
# -*- coding: utf-8 -*-

import base64
import sys

argvs = sys.argv

text1 = argvs[1]

for i in range(0,16):
    text1 = base64.b64decode( text1 )

print text1
```

When range(0,16), following strings was displayed.

```
begin 666 <data>
51DQ!1U]&94QG4#-3:4%797I74$AU

end
```

I input 51DQ!1U]&94QG4#-3:4%797I74$AU to the FLAG form but answer was wrong.

I google begin/end format.
It appear uuencode.

I write a code in python to decode it.


```
# -*- coding: utf-8 -*-

import uu

uu.decode("5.txt.uuencode", "5.txt")
```

FLAG was appeared in 5.txt.
【初心者でも安心】プログラミングをせずにFacebook Messenger Botを作成する

#事前準備
- [heroku](https://www.heroku.com/)のアカウント登録
	
#Api.aiを使う
![スクリーンショット 2016-04-18 20.07.45.png](https://qiita-image-store.s3.amazonaws.com/0/26043/e0f2f419-7a6f-0d4d-daca-06a3984fc313.png "スクリーンショット 2016-04-18 20.07.45.png")

Api.aiというサービスを使います。

##作業手順
1. [Conversational Bots for Facebook Messenger](http://content.api.ai/facebook-messenger-bot?ref=producthunt)にアクセス
2. アカウント作成
3. アカウント作成後、ログイン。ダッシュボード(設定画面)が見られることを確認。



#Facebookアプリ登録&Facebookページ作成
![](https://www.filepicker.io/api/file/EYjBfwXQWexy2oKLIa4g)

botを作るためには、Facebookアプリ登録&Facebookページ作成が必要になります。

##作業手順
1. [Quick Starts - 開発者向けFacebook](https://developers.facebook.com/quickstarts/?platform=web)からFacebookアプリ登録を行う
2. [Facebookページを作成](https://www.facebook.com/pages/create)
3. [こちら](https://developers.facebook.com/docs/messenger-platform/quickstart)にアクセスし、上のGifアニメを参考にしながらアプリ登録
4. 左メニューから「Messenger」を選択
5. Get Startedボタンを押す

#Page Access Tokenを生成
![](https://www.filepicker.io/api/file/BeVUUCgR1K9Og4COfNkb)

![スクリーンショット 2016-04-19 7.45.43.png](https://qiita-image-store.s3.amazonaws.com/0/26043/1c3ceecd-95ce-7888-1511-083cc8fc8acf.png)

##作業手順
1. 「Select a page」を押し、自分のFacebookページを選択
2. 「レビュー申請」の表示がされますが、ひとまず開発者が動作確認できることを優先しOKを押す

#Agent作成
[こちら](https://console.api.ai/api-client/#/newAgent)から新規Agentを作成。

#Facebook Messengerと結びつける
![](https://www.filepicker.io/api/file/iYEbuaIASfeTNN8yq96y)

##作業手順
1. Integrationsタブをクリック
2. Enable SwitchボタンをONにする
3. Deploy Herokuボタンを押す(Heroku Free Planではアプリケーションを5個までしか作成できない。5個作成している方は既存のものを1つ削除する必要があるので注意。)
4. Saveボタンを押して保存

#Heroku Appの設定
![](https://www.filepicker.io/api/file/NEkfgZ4RQOyusRhpDxo5)

##作業手順
1. App Name:アプリの名前。何でも良いので適当に設定する
2. FB_VERIFY_TOKEN:何でも良い。サンプルでは「secret」
3. FB_PAGE_ACCESS_TOKEN:先ほど作成したPage Access Tokenを入力

#Webhookの設定
![](https://www.filepicker.io/api/file/XzdFezoORNqu86oo3e9A)

![](https://www.filepicker.io/api/file/65SI8a9IQJKhOuxE2rbf)
##作業手順
1. 「Setup Webhooks」をクリック
2. Callback URL
	- https://[YOUR_APP_NAME].herokuapp.com/webhook
		- herokuで設定したappNameはYOUT_APP_NAMEとなる
			- sample
				- https://sample.herokuapp.com/webhook
3. Verify Token
	- herokuの設定画面で決めたFB_VERIFY_TOKENを入力
4. Checkbox
	- messagesを選択

#Botをテスト
![](https://www.filepicker.io/api/file/fSMrw0Y3SSSxPiXotuCa)
##作業手順
1. Facebook Pageにアクセスして「メッセージ」クリック
2. チャット入力UIが表示されるのでなんでも良いので入力。何か返ってくるのか確認

##Botから返信がないとき
![](https://www.filepicker.io/api/file/8VCuBI3T8Kh56hD7Lm6O)
herokuの設定画面から再起動を試みる。

#応答パターンを作成
[Introduction to Intents · Api.ai](https://docs.api.ai/v12/docs/introduction-to-intents)を見ながらIntentを作成する。詳細はVideoを見てください :eyes: 

#Hello-poop
<img src="https://qiita-image-store.s3.amazonaws.com/0/26043/e7e930bc-687d-eeca-c5cd-89940f5d4433.png" alt="" title="" width="400" height="" />
ウンチが喋った!!! :poop: :tada: 
[Hello-poop](https://www.facebook.com/Hello-poop-716783891758740/)
(Bot Storeの審査を通していないのでBotは動きませんw 開発者のアカウントから投稿すると動きます)
#参考
[Facebook Integration · Api.ai](https://docs.api.ai/docs/facebook-integration)
[Guidelines · Api.ai](https://docs.api.ai/page/guidelines#videos)
ホストに設定したプロキシでdockerコンテナを動かす

Dockerのコンテナをプロキシ環境下で動かそうとしたら色々苦労し、
それをまたプロキシの外でも動かそうとしたら色々面倒だったので書き留めようと思います。

# Dockerfileで設定

やっぱり基本はDockerfile。
最初の一歩はこんな感じ

```Dockerfile
FROM node:argon
MAINTAINER micu

#set proxy
ENV http_proxy http://proxy.example.com:8888/
ENV https_proxy http://proxy.example.com:8888/

EXPOSE 8000 
CMD ["npm", "start"]

```

しかしこれでは常に同じプロキシサーバにアクセスすることになる。
同じ環境でしか使わないならいいけど、本番サーバにデプロイするとかなったら都合が悪い。

なので引数で渡すようにしてみる。

```Dockerfile
FROM node:argon
MAINTAINER micu

#set proxy
ARG http_proxy
ARG https_proxy
ENV http_proxy $http_proxy
ENV https_proxy $https_proxy

EXPOSE 8000 
CMD ["npm", "start"]
```

これで`docker build`するときに引数で渡してやればそのプロキシサーバが設定される。
そのコマンドは
`docker build --build-arg http_proxy=http://proxy.example.com:8888/ --build-arg https_proxy=http://proxy.example.com:8888/ .`
はっきり言って長い。

こんなの毎回打ち込みたくないし、そもそもホストマシンとコンテナでプロキシが違うことなんてまずないだろうに、
いちいちコンテナ用にプロキシのURLを入力するのはどうかと思う。

# ホストの環境変数から直接渡す

というわけで、ホストの環境変数を使って`docker build`を行うスクリプトを組んでみる


```docker_build.sh
#!/bin/sh
name=$1

echo http_proxy:${http_proxy}
echo https_proxy:${https_proxy}
echo image_name:${name:-${USER}/myapp}

docker build --no-cache=true\
 --build-arg http_proxy=${http_proxy}\
 --build-arg https_proxy=${https_proxy}\
 -t ${name:-${USER}/myapp}\
 . 
```

ついでにイメージ名も勝手に適当なのをつけてくれるように
window.resizeとwindow.orientionchangeのタイミング

#window.resizeとwindow.orientionchangeのタイミング
挙動の違いを説明します。

##window.resize
画面幅が幅が変わる前の値を取得する。

###ポートレイト時
- window.orientionはスマフォは0、タブレットは0,180
- window.innerWidthは、回転前の値

##window.orientionchange
画面幅が幅が変わった後の値を取得する。

###ポートレイト時
- window.orientionはスマフォ,タブレットは90,-90
- window.innerWidthは、回転後の値


##OS毎のイベントの挙動

- andoridは古い端末などではorientionchangeがない。
- andoridのwindow.resizeはキーボードの表示・非表示でresizeが発生する。
- iOSのwindow.resizeはアドレスバーの表示・非表示でresizeが発生する。
- iOSではOSのバージョンによってresizeイベントのタイミングが違うので、
画面回転はorientionchangeを使うことが一番安全。


```lang:javascript
var AG = navigator.userAgent;
if(AG.indexOf('Android')){
 $(window).on('resize',function(){
  setTimeout(orientionMethod,700);
 });
}else{
 $(window).on('orientionchange',orientionMethod);
}

function orientionMethod(){
  //画面回転後の処理
};
```
resizeイベントで直接取得せず、setTimeoutなど利用して、遅延処理で呼ぶことで、正しい値を取得するように工夫する。
opencv3 utility.hppでビルドエラーの件

個人的な備忘録として残しておく
opencv3をportsで導入後、簡単なテストコードを作成しビルドすると何だかよく分からないビルドエラーが出てorz
どうやら、マクロと同名の関数が存在する模様
インポートする順番が大事

***
問題が発生するコード（抜粋）

```objc++
#import <アップル提供ヘッダ.h>
#import <opencv提供ヘッダ.hpp>
```

***
問題が発生しないコード（抜粋）

```objc++
#import <opencv提供ヘッダ.hpp>
#import <アップル提供ヘッダ.h>
```
Go でコメントアウトせずに素早く複数行スキップさせる

## TL; DR

__`if false {}` でスキップしたい箇所を囲む__

## 本文
Go では宣言されてるのに使われてない変数があると、ビルド時に `hoge declared and not used` といった感じで怒られます。
Go 書いてる時、デバッグ目的で処理を飛ばそうと複数行コメントアウトしたくなる時があります。が、適当にやると変数の宣言だけが残って前述のように怒られることがあります。この場合は改めて宣言箇所だけコメントアウトすればビルドが通りますが、まあ面倒ですよね。

こういう時は、該当箇所を `if false {}` で囲ってやればよいです。見てわかるように、常に `false` なのでブロックの中は実行されません。

## Example

### 元のコード

```go
package main

import (
	"fmt"
)

func main() {
	hogeMessage := "hoge"
	fugaMessage := "fuga"
	piyoMessage := "piyo"
	hogehogeMessage := "hogehoge"

	fmt.Println(hogeMessage)
	fmt.Println(fugaMessage)
	fmt.Println(piyoMessage)
	fmt.Println(hogehogeMessage)
}
```

```bash
$ go run hoge.go
hoge
fuga
piyo
hogehoge
```

### コメントアウトすると…

```go
package main

import (
	"fmt"
)

func main() {
	hogeMessage := "hoge"
	fugaMessage := "fuga"
	piyoMessage := "piyo"
	hogehogeMessage := "hogehoge"

	fmt.Println(hogeMessage)
	// fmt.Println(fugaMessage)
	// fmt.Println(piyoMessage)
	fmt.Println(hogehogeMessage)
}
```

```bash
$ go run hoge.go
# command-line-arguments
./hoge.go:9: fugaMessage declared and not used
./hoge.go:10: piyoMessage declared and not used
```

### `if false {}` で囲むと…！

```go
package main

import (
	"fmt"
)

func main() {
	hogeMessage := "hoge"
	fugaMessage := "fuga"
	piyoMessage := "piyo"
	hogehogeMessage := "hogehoge"

	fmt.Println(hogeMessage)

	if false {
		fmt.Println(fugaMessage)
		fmt.Println(piyoMessage)
	}

	fmt.Println(hogehogeMessage)
}
```

```bash
$ go run hoge.go
hoge
hogehoge
```

同じようなことを他の言語でやろうとするとブロック内のインデント調整が面倒ですが、Go だと `go fmt` でよしなにしてくれるので便利ですね。
Rubyで複数のURLリストを一括でダブルクオーテーションで囲む方法

当たり前の話しすぎて記事するのが恥ずかしいくらいですが、メモ。

```rb
https://www.example.com/?p=1
https://www.example.com/?p=2
https://www.example.com/?p=3
https://www.example.com/?p=4
https://www.example.com/?p=5
https://www.example.com/?p=6
```
最近よくこういうURLリストをスクレイピングで取得して手作業でダブルクオーテーションで囲って、カンマで配列に入れるなんて事をしていた。

```rb
list = %w(
https://www.example.com/?p=1
https://www.example.com/?p=2
https://www.example.com/?p=3
https://www.example.com/?p=4
https://www.example.com/?p=5
https://www.example.com/?p=6
)
```

パーセンテージ記法で一発だった…。
AndroidでGoogle Play 開発者サービス 8.4.0を導入したらversion conflictが起きた

# はじめに
Android Studio 2.0にて、Google Analyticsを使うためにplay-services-analyticsを入れようとしたら、Gradle Syncでエラーが発生したので、備忘録として残しておきます。

## 起きたエラー
プラグインとのバージョンの競合がどうのこうの、という内容。

```
Error:Execution failed for task ':app:processDebugGoogleServices'. > Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 8.3.0.
```

## 解決方法
`apply plugin: 'com.google.gms.google-services'`をbuild.gradleの最後に移したら無事syncできました。

```java
apply plugin: 'com.android.application'
...

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:support-v4:23.3.0'
    compile 'com.android.support:design:23.3.0'
    compile 'com.google.android.gms:play-services:8.4.0'
    compile 'com.google.android.gms:play-services-analytics:8.4.0'
}

apply plugin: 'com.google.gms.google-services'
```

`dependencies`の後に書かないといけなかったのかな……。

## 参考
http://stackoverflow.com/questions/34370603/version-conflict-updating-to-8-4-0
Unityで三人称視点 (デフォルトのAssetsを使って)

メニューの `Assets` → `Import Package` → `Charactors` をインポート

`Assets` `Standard Assets` ... `Prefabs` `ThirdPersonController` を画面上に Drug&Dropする

![スクリーンショット 2016-04-18 19.45.05.png](https://qiita-image-store.s3.amazonaws.com/0/13836/1efaa483-b494-6b78-dec3-eba357b3f9ef.png)

![スクリーンショット 2016-04-18 19.49.44.png](https://qiita-image-store.s3.amazonaws.com/0/13836/34b2f79e-801f-a27d-1397-f386e63acd63.png)

Hierarchy 内の Main Camera を「ThirdPersonController」の階層内に移動する

![スクリーンショット 2016-04-18 19.51.29.png](https://qiita-image-store.s3.amazonaws.com/0/13836/97424afb-c566-90c7-62cf-581d49bb907b.png)

そのまま実行すると、カメラの位置がおかしいので修正が必要・・・

![スクリーンショット 2016-04-18 19.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/13836/9b3aa138-2cf5-af73-4f0e-1966fd9efb16.png)

「Camera View」があるので、これを観ながら移動させればいい感じに設定できるはず。

![スクリーンショット 2016-04-18 19.55.52.png](https://qiita-image-store.s3.amazonaws.com/0/13836/2d3eac99-9aa1-1a57-9d2d-cd70df3ce2c6.png)

![スクリーンショット 2016-04-18 19.57.03.png](https://qiita-image-store.s3.amazonaws.com/0/13836/d57e5dab-9af7-6e3d-092b-7872c484b9cb.png)

できましたね。
Ruby の Array に XOR のメソッドがなかったので


次のような `Array` の変数 `a` と `b` があるとして、

```irb
> a = [1, 2]
=> [1, 2]

> b = [1, 3]
=> [1, 3]
```

積集合と和集合は、演算できるので、

```irb
> a & b # 積集合
=> [1]

> a | b # 和集合
=> [1, 2, 3]

> a - b # 差集合
=> [2]
```

排他的論理和を出そうとして、 `TrueClass` や `FalseClass` のように `^` があるのかとうっかりやってみたら、

```irb
> a ^ b
NoMethodError: undefined method `^' for [1, 2]:Array
```

となってしまったので、単純に次のようにしてみても良かったが、

```irb
> (a - b) + (b -a)
=> [2, 3]
```

`Set` には `^` があるので、次のようにしてみた。


```irb
irb(main):009:0> (Set.new(a) ^ Set.new(b)).to_a
=> [3, 2]
```

`Set` 使っているので、順序は不定になるが、自分の用途には間に合った。
Gebで特定のテストケースのみUserAgentを切り替える


Specの中でUserAgentを切り替えるスマートな方法が探してもぱっと出てこなかったので暫定処置。

```groovy
class SPPageSpec extends GebSpec {

	def "SP用ページ表示のテスト"() {
		setup:
		FirefoxProfile profile = new FirefoxProfile();
		String userAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1"
		profile.setPreference("general.useragent.override", userAgent)
		driver = new FirefoxDriver(profile);
		driver.manage().window().size = new Dimension(320, 640)

		when:
		go "https://www.google.com"

		then:
		title.contains("Google")

		cleanup:
		browser.quit()
	}
}
```

cleanupでquitしないとブラウザが開いたまま残ってしまう。
lumen トラブルシューティングまとめ


lumenを始めるのにLaravelの知識は必要ないが、Laravelでやってたあれどうするんだっけ？という引き方をする際にはLaravelの中の知識が必要になります。

大丈夫、Laravel/Lumen、全然怖くないよ！

## artisan 関連

Lumenには色々artisanの機能が削られてて、凄くシンプルになりました！

必要な処理がアレばLaravelから持ってくればいいから安心！

ポイントはlaravelのスケルトンから、シグネチャの文字列で検索かけて、Commands クラスを見つけ出し、中の処理を読み解くこと。

Laravelのコード持ってきてもパス周りで死ぬこと多かったりDIコンテナの中身足りてなかったりで上手く動かないので、自分で書くほうが楽だよ！
 
### serveがない

自分で実行

````
$ php -S 0.0.0.0:8000 -t public
````

### key:generateがない

適当にキーを引っ張ってくる or 自分で生成

````
use Illuminate\Support\Str;

echo Str::random(32);
````

### tinkerがない

psysh で代替

````
$ psysh boostrap/app.php
````

### queue:tableがない

自分で作ろう。

### vendor:publish がない

cp コマンドというものがあります。

### view:clear が無い

rm コマンドというものがあります。
「TXT_DB error number 2」エラーの対処法

VPNサーバ側の秘密鍵証明書発行時

```
# ./build-key-server サーバ名
・・・・・・・・・・・・
・・・・・・・・・・・・
・・・・省略・・・・
・・・・・・・・・・・・
・・・・・・・・・・・・
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
```
上記のようなエラーが出た時の対処法

証明書用ディレクトリを作成したディレクトリの中にあるkeysディレクトリの中のindex.txtを削除して新しく作り直す

```
# rm /etc/openvpn/easy-rsa/keys/index.txt
# touch /etc/openvpn/easy-rsa/keys/index.txt
```

再度、VPNサーバ側の秘密鍵証明書発行
```# ./build-key-server サーバ名```


※あくまでメモとして書いてますので、間違っている箇所もあると思います。
Unity5でGearVR  シューティングゲームが作りたくて

GearVR開発を始めました。

VRシューティングゲームが作りたくて、
モックアップとして、
「注視点のポインターが飛んでくるバナナが重なった時爆発する」
というのを制作しました。

注視点のポインターとGameObjectが重なった時の処理のメモです。
<img width="392" alt="スクリーンショット 2016-04-18 17.59.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/9138cb2a-e3b4-d0f0-dfc5-15242c8a33cd.png">

Device IDの取得やOculus Signature Fileの設定などはこちらの良記事を参考にしました。

▫️Unity5でGear VR用アプリの開発方法
http://psychic-vr-lab.com/blog/unity/unity5%E3%81%A7gear-vr%E7%94%A8%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%AE%E8%A8%AD%E5%AE%9A/

上記事のOculus Mobile SDKは使わず、
チュートリアルも公開されてたので、
Unity公式のVRサンプルプロジェクトを参考にしました。

# 処理の作り方

##まずはAssetストアからVR Sampleをダウンロードしてインポート。
![スクリーンショット 2016-04-18 18.08.41.png](https://qiita-image-store.s3.amazonaws.com/0/76843/5a7f2bac-844b-454e-74c2-4d710627a18d.png)


参考にしたのは
VRSampleScenes/Scenes/Examples/Reticleシーンです。
こちらを開く。

##初期状態はこんな感じでした。
ピンクのがポインターか！
<img width="847" alt="スクリーンショット 2016-04-18 18.11.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/3871aa1d-3857-a16e-444e-ceed2d069fcd.png">

もともとあるcubeの設定を読み解いて真似てみた。

今回はこのバナナをポインターに反応させるようにする。

<img width="256" alt="スクリーンショット 2016-04-18 17.45.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/76843/84dd03bb-17da-e194-e9d4-b92a92142d7e.png">


#バナーナちゃんに下記設定。

1.コライダーを設定。
2.VRInteractiveItem.csをアタッチ。
3.scripts/Exsamples/ExampleInteractiveItemを複製して
BananaInteractiveItem(名前任意)にリネームしてアタッチ。

##処理のスクリプト書く

ExampleInteractiveItem.csを読み解くと、
イベントをハンドリングしてるところを発見。

```csharp:ExampleInteractiveItem.cs
private void HandleOver() // 注視点がGameObjectに重なった時
private void HandleOut() // 注視点が外れた時
```

となっているようだ。
なので、
注視点のポインターとGameObjectが重なった時の処理はここに書けば良いのでは？

BananaInteractiveItem.csの

```csharp:BananaInteractiveItem.cs
//Handle the Over event
private void HandleOver()
{
    Debug.Log("over");
    // ここに爆発処理を入れました〜。
    //m_Renderer.material = m_OverMaterial;  マテリアル変更してるとこは使わないのでコメントアウト
}
```

でできました。

爆発にはDetonatorというアセットを使用しました。
http://qiita.com/yando/items/eac9e0dbc1376b9cf141

この爆発、iosで実機確認すると爆発しないことがありました。
解決法はこちらの記事を参考にしました。
http://aidiary.hatenablog.com/entry/20140813/1407927404

チュートリアル実践して理解が深まるとともに追記しようと思います〜。
もっとVRやる
Rails4.2でHTTP/2のServer Push用ヘッダをつけてみたメモ


HTTP/2のServer Pushって、Linkヘッダに対象のURIを入れたら[h2o](https://h2o.examp1e.net)とかがよろしくやってくれるそうだよ。

じゃあRails4.2でLinkヘッダを差し込んで見る。


## Precompiled Assets

さて、renderに応じて必要なassetsの実際のパスが必要だね。`Rails.application.assets_manifest`に格納されているみたい。

ちなみにフロント側のmrubyなどで現役Assetsのパスを拾いたい場合、パスがそれぞれ`.sprockets-manifest-(MD5ハッシュ).json`に書いてあるので、それを使うとよさそう。


## Linkヘッダの付与

とりあえずコントローラがこうだとします。

```
class ResourceController < ApplicationController

  def index
  end

end
```

やってみたアプリではフロントをRiotで書いたSPAにしてあるので、実際のコードも上記のまんまだったりします。

とくにいじってないRailsなので`application.css`,`application.js`に対応するファイルをpush対象とすればよさげ。


```
class ResourceController < ApplicationController
  before_action :prepare_link_header # for server push

  def index
  end

  protected

  def prepare_link_header
    push_keys = ['application.css', 'application.js']
    prefix = String.new('/assets/')
    push_paths = push_keys.map { |k| prefix + Rails.application.assets_manifest.assets[k] }

    response.headers["Link"] = push_paths.map{|p| "<#{p}>; rel=preload"}.join("\n")
  end

end
```

一旦全部コントローラに書いてみた。これで一旦動作を確認しよう。


![pushed.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/b735b894-f66e-e551-4246-b5ec9a7f9549.jpeg "pushed.jpg")


pushedきたわ。
Pythonよく使うコードスニペット

Pythonよく使うコードスニペットを書き溜めていく。


# PowerShellのfl形式(Format-List)の結果からdictの配列に格納

```lang:PowerShell
PS> Get-Process -Name powershell | Format-List -Property ProcessName,FileVersion
,StartTime,Id

ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:42:00
Id          : 2760

ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:54:28
Id          : 3448
```


``` lang:Python
import re

ps_result = '''
ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:42:00
Id          : 2760

ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:54:28
Id          : 3448
'''

lines = ps_result.split('\n')
dics = []
dic = {}
for line in lines:
    ret = line.split(' : ')
    if len(ret) == 2:
        ret[0] = re.sub(r' +$', '', ret[0])
        dic[ret[0]] = ret[1]
    if dic != {} and len(ret) < 2:
        dics.append(dic)
        dic = {}


print dics
```

# pythonで辞書のサブセットをcsvに変換

http://millfont.blogspot.jp/2011/08/pythoncsv.html


# 参照
https://technet.microsoft.com/ja-jp/library/dd347677.aspx
R でピボットテーブルを作成

表からピボットテーブルを作る方法

なお、Fink からインストールした r-base32 を使用しています。

データを CSV 形式で保存。

```text:bloodpressure.csv
name,sbp,dbp,hr,temp,date,year,month
yamada,158,96,81,62,31,2016,3
yamada,135,72,81,61,30,2016,3
yamada,147,89,72,63,31,2015,3
yamada,157,98,79,62,30,2015,3
yamada,121,81,76,61,29,2015,3
sato,89,48,57,66,30,2016,3
sato,144,84,81,64,29,2016,3
sato,139,103,110,65,30,2015,3
sato,147,87,74,66,30,2015,3
sato,134,82,70,59,29,2015,3
sato,140,83,65,49,28,2015,3
```

ターミナルを開き、

`$ cd Desktop`

`$ R-3.2`

R 内では、以下のコマンドを入力します。

```r:bloodpressure.r
library("reshape2")

bloodpressure <- read.csv("bloodpressure.csv", header=TRUE, sep=",", na.strings="", dec=".", strip.white=TRUE)

sbp_table<-dcast(bloodpressure,name~year,value.var="sbp",mean)
```

`sbp_table`


と入力して確認すると、

```
    name     2015  2016
1   sato 140.0000 116.5
2 yamada 141.6667 146.5
```

と表示されます。

name~year

のところを、

name~year+month+date

とすると、2015_3, 2016_3 のように表示されます (サンプルのデータでは3月しかないので、4月データなどを足して試してみてください)

[reshape2.pdf](https://cran.r-project.org/web/packages/reshape2/reshape2.pdf)
Android Studioのプロジェクトで複数のUnitTestを設定する（要Product Flavor）

# 要約

フレーバー別にUnitTestを作れる。訳あって1つのアプリにテストが複数ある場合にも便利。

# 概要

Android Studio の特徴として Product Flavor があり、デバッグ向けとリリース向けのビルドを設定できるなど便利なのですが、UnitTestも別々に設定できます。

この場合、　`build.gradle`　で `androidTest` とは別に、 `androidTest`+`FlavorName` なテストを設定します。ソースコードなどは `src/` 以下に `androidTest`+`FlavorName` のディレクトリ名で置かれます（デフォルト値。`setRoot`などで変更可能）。

```build.gradle

android {
    sourceSets {
        main {
            〜〜〜
        }
        androidTestFlavor1 {
            setRoot('androidTestFlavor1')
            〜〜〜
        }
        androidTestFlavor2 {
            setRoot('androidTestFlavor2')
            〜〜〜
        }
    }
    productFlavors {
        Flavor1 {
            〜〜〜
        }
        Flavor2 {
            〜〜〜
        }
    }
    dependencies {
        androidTestFlavor1Compile 〜〜〜
        androidTestFlavor2Compile 〜〜〜
    }
}
```
あとは通常の `androidTest` と同じように、`sourceSets`などを設定します。

テストする際には、 Build Variant からフレーバーを選択します（例：`Flavor1Debug`）。テストの Configrations （メニューバーからプルダウンで選択する）は、テストするアプリが同じなので使いまわせます。

# 補足

* この記事は Android Studio 2.0 で検証しています
* `androidTest`を設定した時は、全フレーバー共通のテストとなる
* フレーバー名の頭文字を小文字にしていると、テストが認識されない場合がある
* 適切に設定すれば JUnit4 と Espresso 等のテスト共存も可能だと思われる（未検証）
* Eclipse のテストを持ってくる場合、 `productID` や `AndroidManifest.xml` の設定に注意

# 参考

* [Gradle Plugin User Guide - Android Studio Project Site](http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing1)
ImagikでPDFファイルからサムネイル画像を作る

phpにImageMagickをインストールしておいてから、以下のようなソースで生成できる。(php5.6で確認）

```php
$file = '/Users/mymac/Desktop/my.pdf';
$output = '/Users/mymac/Desktop/my.png'; 

$im = new Imagick($file . '[2]');
$im->setImageFormat('png');
$im->thumbnailImage(300, 300, true);
$im->writeImage($output);
```


[2] ってのは３ページ目って意味です。
productFlavorsでトリッキーなことをしてたらandroidTestが動かなくなったときの話

http://stackoverflow.com/a/28044024/4052730

にある方法で複数のproductFlavorsの組み合わせでapplicationIdを指定するようにしていたら、
androidTestが動かなくなったのでその時の対応のメモです。

Android Studioから実行するときのログ

```bash
Testing started at 16:01 ...

04/18 16:01:48: Launching ProjectlistSearchFra...
$ adb push /Users/takao/AndroidStudioProjects/app-android/android/android_fuga/build/outputs/apk/android_fuga-fuga-qa-v21-debug.apk /data/local/tmp/com.hoge.android.fuga.debug
$ adb shell pm install -r "/data/local/tmp/com.hoge.android.fuga.debug"
	pkg: /data/local/tmp/com.hoge.android.fuga.debug
Success


$ adb push /Users/takao/AndroidStudioProjects/app-android/android/android_fuga/build/outputs/apk/android_fuga-fuga-qa-v21-debug-androidTest-unaligned.apk /data/local/tmp/com.hoge.android.fuga.debug.test
$ adb shell pm install -r "/data/local/tmp/com.hoge.android.fuga.debug.test"
	pkg: /data/local/tmp/com.hoge.android.fuga.debug.test
Success


Running tests

$ adb shell am instrument -w -r   -e debug false -e class com.hoge.android.fuga.fragment.MyFragmentTest com.hoge.android.fuga.debug.test/android.support.test.runner.AndroidJUnitRunner
Client not ready yet..Test running started
Test running failed: Unable to find instrumentation info for: ComponentInfo{com.hoge.android.fuga.debug.test/android.support.test.runner.AndroidJUnitRunner}
Empty test suite.

```

インストールされている instrumentation を確認

```bash
$ adb shell pm list instrumentation
instrumentation:com.android.emulator.smoketests/android.support.test.runner.AndroidJUnitRunner (target=com.android.emulator.smoketests)
instrumentation:com.android.smoketest.tests/com.android.smoketest.SmokeTestRunner (target=com.android.smoketest)
instrumentation:com.example.android.apis/.app.LocalSampleInstrumentation (target=com.example.android.apis)
instrumentation:com.hoge.android.fuga.test/android.support.test.runner.AndroidJUnitRunner (target=com.hoge.android.fuga.debug)

```

com.hoge.android.fuga.test と com.hoge.android.fuga.debug.test で食い違ってる、、、


```bash
adb shell am instrument -w -r   -e debug false -e class com.hoge.android.fuga.fragment.MyFragmentTest com.hoge.android.fuga.test/android.support.test.runner.AndroidJUnitRunner

```
↑で実行すると動いた。


上の食い違いを直すには build.gradle のtestApplicationIdを指定したら直った。

参考： https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html
全角カタカナにのみマッチする正規表現


宗教上の理由で全角カタカナのみで構成された文字列にマッチする正規表現を書きました。

# **追記**
コメントでご指摘頂いた用に、今から述べる方法は`\p{katakana}`に含まれる文字列の内、半角文字を除いたものに過ぎません。どういった文字が含まれてるかについては、[Rubyの正規表現の/[\p{katakana}]/ ってなんなの](http://qiita.com/ymrl/items/b34c5493c9383633330b)という記事が参考になります。

記号みたいな文字も含まれてるので、実用には @rst76 さんのコメントにある`[ァ-ヶ]`での指定（必要に応じて記号も追加）が適しているんじゃないかなぁと思います。

お前ら、この世界線ではカタカナやったんか……。

# 全角カタカナ
```ruby
/[\p{katakana}　ー－&&[^ -~｡-ﾟ]]+/
```

おそらくこれで大丈夫だと思います。
心配な方は[こちら](http://rubular.com/r/pcWVwEJkNY)で試してみてください。

## ActiveRecord での利用
ActiveRecord の validation へは以下のように適用できます。

```ruby
validates :name, presence: true,
                 format: {
                   with: /\A[\p{katakana}　ー－&&[^ -~｡-ﾟ]]+\z/,
                   message: "全角カタカナのみで入力して下さい"
                 }
```

# 解説
カタカナのみという集合と半角文字以外という集合の積をとっています。

## カタカナのみ
以下の正規表現は半角カタカナにもマッチします。
また、全角スペースと長音は`\p{katakana}`に含まれていないそうなので、明示的に加えています。

```ruby
/[\p{katakana}　ー－]+/
```


## 半角文字以外
```ruby
/[^ -~｡-ﾟ]+/
```

# 参考
* [正規表現の基本](http://qiita.com/ymsr5612/items/7c8811b5cf37d700adc4)
* [rubyで平仮名、カタカナの正規表現マッチをする方法](http://qiita.com/semind/items/8092eacc82ea2896e4ce)
* [[正規表現] 半角文字のみ取得 と 全角文字のみ取得](http://2011428.blog.fc2.com/blog-entry-79.html)
sshでパスワードを打ち間違えたら Ctrl + u

そんだけです。
そんだけなんですが、知らない人が結構多そうなので。

``Ctrl + u``すれば、入力がクリアされるので、もう一度頭からパスワードを打ち込むことができます。
Ctrl + cとかしてsshから再度始める必要はないです。

## オマケ1:実はカット
ちなみに``Ctrl + u``は現在行のカットなので、``Ctrl + y``でペーストできます。bashとかのコマンドラインでもフツーに使えます。


## オマケ2: リモートログインしまくっているターミナルから抜けるには``Ctrl +d``連打
ガンガンログアウトしまくって、最終的にターミナルが終了します。
お作法に法ってログアウトしたい方向け。
Ruby2.3のSafe Navigation Operator

Ruby2.3の新機能、Safe Navigation Operator
うっかりはまったのでメモ

メソッド呼び出しの.の前に&をつけておくと、レシーバーがnilのときにNoMethodErrorを投げずにnilを返してくれる機能です。

``` ruby
str = nil
str&.upcase  #=>nil
```

ただしこの機能は&と.をセットで書かないと使えないようで、例えばこういう書き方はできません。

``` ruby
#論理演算子のNilclass#&が呼ばれる
ary = nil
p ary&[0]  #=>false

#Array#&（配列の積集合）
ary = [1, 2, 3]
p ary&[0]  #=>[]

#これならOK
p ary&.[](0)  #=>1
#それならこう書いた方がいい気がする
p ary&.at(0)  #=>1

#ちなみにこういうのはSyntaxError
num = nil
#num& == 0
#num& * 2
```
考えてみれば、論理演算子やArray#&のようなメソッドと区別するためにこのような仕様なのは当たり前ですね…
部分列長のsubstrにout_of_rangeが生成される

sはlineのうち大文字で始まる部分だけが格納される。つまりsは **lineの部分列であり、長さがlineの長さ以下であることが保証されている** 。
しかし、`line=line.substr(s.length());`は例外を送出しようとする。
しかも繰り返しでなければ(1行しか読まなければ)例外コードは生成されないので、不思議なもの。
ifのコメントアウトを解除するか、(非現実だが)最適化をやめれば、繰り返しの中でも例外コードは生成されないが、少し気持ち悪い。

[追記] さらにたちの悪いのは、throw_out_of_range_fmt()がGLIBCXX_3.4.20依存なことで、共通したファイルシステムを持つ複数マシン間での移植性が低下することにある。

環境：g++ 4.9.3 (CentOS)

```cpp
#include <iostream>
#include <string>
int main(){
	std::string line;
	for(;std::getline(std::cin,line);){
		std::string s="";
		for(int i=0;i<line.size();i++)if(line[i]&32)s+=line[i];else break;
		//if(line.length()>=s.length()){
			/// s is a subsequence of line, so this "if" is 100%; only to silence gcc.
			line=line.substr(s.length());
		//}
	}
	return 0;
}
```
Airflow日本語化

## 前提
Airflowにはスケジュールされたタスクの進捗状況やログなどを確認することが出来るwebserverがついている。

こんな感じ
![スクリーンショット 2016-04-18 17.16.28.png](https://qiita-image-store.s3.amazonaws.com/0/44247/47168245-49f8-8799-ed88-ca8bbd6d264c.png)


## 問題
ただこれUTCで固定されている。なので動作としてはJSTで動いていても、画面上ではUTCになってしまう。
頭の中で時刻を変換しないといけないから結構辛い。
これについてのissueは出ているけどまだマージはされていない。
https://github.com/airbnb/airflow/issues/227

## 解決策

### **全体共通**
上記issueにも書いてあるがハードコーディングしてある部分を手動で直してあげる:ghost:

#### /usr/local/lib/python2.7/site-packages/airflow/www/templates/admin/master.html
timestampとして設定されているUTCsecondsの代わりに`x.getTime()`にしてあげる。

```js
x = new Date()
//var UTCseconds = (x.getTime() + x.getTimezoneOffset()*60*1000);
var seconds = x.getTime();
$("#clock").clock({
    "seconds":"false",
    "calendar":"false",
    "format":"24",
    "timestamp":seconds
}).click(function(){
    alert('{{ hostname }}');
});
$('span').tooltip();
```

#### /usr/local/lib/python2.7/site-packages/airflow/www/static/jqClock.min.js
下記コード部分に`"UTC </span>"`とかかれているのでここを任意の文字列に変更してあげる。

```js
<span class='clocktime'>"+p+":"+l+(n.seconds=="true"?":"+v:"")+o+"UTC </span>");t[r]=setTimeout(function(){f($(j),n)},1000)}};f($(this),d)})};
```

### **tree view**
#### /usr/local/lib/python2.7/site-packages/airflow/www/static/d3.v3.min.js
`Qa.scale.utc`を`Qa.scale`に変更する。

#### /usr/local/lib/python2.7/site-packages/airflow/www/templates/airflow/tree.html
`dttm.setHours(dttm.getHours()+7)`でplus7時間されているので`dttm.setHours(dttm.getHours())`にしてあげる。　

```js
  var extent = d3.extent(base_node.instances, function(d,i) {
    dttm = new Date(d.execution_date);
    dttm.setHours(dttm.getHours());
    //dttm.setHours(dttm.getHours()+7)
    return dttm;
  });
```

### **gantt view**
#### /usr/local/lib/python2.7/site-packages/airflow/www/static/highcharts.js
`useUTC:!0`から`useUTC:false`に変更してあげる

##　最後に
これで少しは見やすくなった
レスポンシブサイトのjsを使ったUA振り分けについての考察2

#レスポンシブサイトのjsを使ったUA振り分けについての考察

UA判別について説明していきます。

##UA判別の手順

1.ロード時に一回だけ発火させる。
2.bodyが読まれる前にUA判定してmetaタグを書き換える
3.判別用のClassをbodyにaddする
4.ロードされる

##ヘッダー内の記述

今回の前提はプラグインを使ってませんが、jqueryのreadyでjquery.depend.jsの$.platform.typeなど、利用するともっと楽です。

```lang:html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf−8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<meta name="viewport" id="viewport" content="width=1280">

<script>
//ここへ直に書いてますが、この記述を別ファイルを読む形にしても問題ないです。
var ua = navigator.userAgent;
if(ua.indexOf('iPhone') > 0 || ua.indexOf('iPod') > 0 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0){
 return 'sp';
}else if(ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0){
 return 'tab';
}else{
 return 'pc';
}

if(ua=='sp'){
 document.getElementById('viewport').setAttribute('content','width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no');
}else if(ua=='tab'){
 //タブレット用viewport書き換え

}else{
 //PC用
 //elseは書いたけど、この分岐はわかりやすくするため
}
document.getElementsByClassName('body')[0].setAttribute('class',ua);

</script>
</head>
```

流れ時には上のようなソースを読み込めば、対応可能です。

あとはbody内のコンテンツをbody.sp,body.pc,body.tabを継承させて
レスポンシブサイトを作る。
下は、スマフォとPCしかない場合の例

```lang:media-query使ったレスポンシブの場合
a{
 color:#ff0000;
}

@media all and (max-width: 768px) {
 a{
  color:#ffff00;
  text-decoration: underline;
 }
}
```

```lang:UAを使ったレスポンシブの場合
a{
 color:#ff0000;
}

body.sp a{
  color:#ffff00;
  text-decoration: underline;
}
```


##頭の固い人用の対応
ブラウザ幅で動くようにしたいと言われたら、PCだけwindow.resizeで
対応している画面幅でbodyの判別クラスをつけかけるようにすればいい。
下は、スマフォとPCしかない場合の例

```lang:javascript
if(ua=='pc'){
 $(window).on('resize',function(){
   if($(window).width()<769){
    if($('body').hasClass('pc')){
     $('body').removeClass('pc');
     document.getElementById('viewport').setAttribute('content','width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no');
     $('body').addClass('s');
     return;
    }
   }else{
     if($('body').hasClass('sp')){
      $('body').removeClass('s');
      document.getElementById('viewport').setAttribute('content','width=1280');
 　　　$('body').addClass('pc');
 　　}
 　}
 });
}
```


*※概念書いてるだけなので、コピペで使えるか、動作テストはしてないのでそのまま利用する場合は注意*
phpunit

# Test間の依頼関係指定
https://phpunit.de/manual/5.3/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.test-dependencies

```php:MultipleDependenciesTest.php
<?php
class MultipleDependenciesTest extends PHPUnit_Framework_TestCase
{
    public function testProducerFirst()
    {
        $this->assertTrue(true);
        return 'first';
    }

    public function testProducerSecond()
    {
        $this->assertTrue(true);
        return 'second';
    }

    /**
     * @depends testProducerFirst
     * @depends testProducerSecond
     */
    public function testConsumer()
    {
        $this->assertEquals(
            array('first', 'second'),
            func_get_args()
        );
    }
}
?>
```
# Test Dataを@dataProviderで指定（loop要らない）
https://phpunit.de/manual/5.3/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.data-providers

```php:DataTest.php
<?php
class DataTest extends PHPUnit_Framework_TestCase
{
    /**
     * @dataProvider additionProvider
     */
    public function testAdd($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return array(
          'adding zeros' => array(0, 0, 0),
          'zero plus one' => array(0, 1, 1),
          'one plus zero' => array(1, 0, 1),
          'one plus one' => array(1, 1, 3)
        );
    }
}
?>
```
#Exception testing
https://phpunit.de/manual/5.3/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.exceptions

```php:ExceptionTest.php
<?php
class ExceptionTest extends PHPUnit_Framework_TestCase
{
    public function testException()
    {
        $this->expectException(InvalidArgumentException::class); //　expectExceptionをexception発生する前に書くのはポイント！
        throw new InvalidArgumentException();
    }
}
?>
```
#Testing PHP Errors
https://phpunit.de/manual/5.3/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.errors
By default, PHPUnit converts PHP errors, warnings, and notices that are triggered during the execution of a test to an exception.

```php:ExpectedErrorTest.php
<?php
class ExpectedErrorTest extends PHPUnit_Framework_TestCase
{
    /**
     * @expectedException PHPUnit_Framework_Error
     */
    public function testFailingInclude()
    {
        include 'not_existing_file.php';
    }
}
?>
```

#Testing Output(echo, print, var_dump等の出力テスト)
```php:OutputTest.php
<?php
class OutputTest extends PHPUnit_Framework_TestCase
{
    public function testExpectFooActualFoo()
    {
        $this->expectOutputString('foo');
        print 'foo';
    }

    public function testExpectBarActualBaz()
    {
        $this->expectOutputString('bar');
        print 'baz';
    }
}
?>
```
D3.jsのformatを整理

D3.jsのd3.format便利ですよね。良く使う桁数の指定やゼロ埋めが少し分かりづらかったのでQiitaにまとめます。

```js
d3.format("01d")(1); // 1
d3.format("02d")(1); // 01
d3.format("03d")(1); // 001
d3.format(".0d")(100); // 100
d3.format(".1d")(100); // 100
d3.format(".2d")(100); // 100
d3.format(".0f")(100); // 100
d3.format(".1f")(100); // 100.0
d3.format(".2f")(100); // 100.00
d3.format(".0%")(1); // 100%
d3.format(".1%")(1); // 100.0%
d3.format(".2%")(1); // 100.00%
```

dを指定すると小数点の値が表示されないのでその場合はfを使います。

.0、.1と小数点以下の表示する桁数が増え、01、02の場合はゼロ埋め桁数が増えていきます。

# d3#format の書式を概要だけ説明

d3#formatの書式は以下のようになっています。

[​[fill]align][sign][symbol][0][width][,][.precision][type]

分かりやすく分解して簡単に説明すると

- fill
 - 詰めるのに使う文字。例えば d3.format("z<6d")(1) は"1zzzzz"になる。
- align
 - 右詰め(>)や左詰め(<)など
- sign
 - プラス(+)マイナス(-)など
- symbol
 - 通貨の$やバイナリー指定など
- 0
 - ゼロ埋め
- width
 - ゼロ埋めする最少桁数
- , 
 - 1,000とカンマ(,)を入れる
- .precision
 - 小数点以下の桁数
- type
 - %とかdとかf




# 参照情報

- https://github.com/d3/d3-format
- https://github.com/mbostock/d3/wiki/Formatting
[Rails] redirect時のflashとrender時のflashの違い

#redirect時のflashとrender時のflashの違い
これがscaffoldした時のupdateコードですね（手元のコードから持ってきたのでやや違うかもしれませんが）

update成功時は`redirect`ですが、update失敗時は`render`しています。

```items_controller.rb
def update
  respond_to do |format|
    if @item.update(clan_params)
      format.html { redirect_to @item, notice: 'Item was successfully updated.' }
      format.json { render :show, status: :ok, location: @item }
    else
      format.html { render :edit }
      format.json { render json: @item.errors, status: :unprocessable_entity }
    end
  end
end
```

##redirect時のflash
`flash`です。
flash[:success]やflash[:notice]、flash[:error]を使って中身のテストができる。

##render時のflash
`flash.now`です。
中身のテストは出来ない（描画時は存在するがテスト時にはすでに破棄されているため）
必死にflash内容をテストしようとしても無理です。
テストも壊れやすくなるし、表示あり/なしくらいをテスト対象にしましょう。


##参考にしたサイト
[拝啓、シーシュポス: [Rails] flash.now[:notice]とflash[:notice]の違い](http://trwtnb.blogspot.jp/2009/11/rubyrailsflashnownoticeflashnotice.html)

[ザリガニが見ていた...。: flash.nowの内容を直接テストすることは不可能](http://d.hatena.ne.jp/zariganitosh/20080410/1207810711)