OmniAICreator/Qiita-1.07M huggingface dataset:
Githubのissueでスプリントバックログを作ってみよう

# あらすじ
[Githubのissueでプロダクトバックログを作ってみよう](http://qiita.com/takaaki4cards/items/951dbd9507076913f036)でプロダクトバックログを作ることができたので、次はスプリントバックログを作ってみよう。
我々はスプリントプランニングを行っている想定である。
前半はスプリントバックログを作るため今スプリントに完了するユーザーストーリーについてPOと合意を取る。
後半はスプリントバックログのタスクを洗い出して見積もる。

issueでどうやってスプリントとタスクを表現することができるかがポイントかな。

# マイルストーンを設定する

マイルストーンでスプリントを表現する。
期限として、スプリントの終了日を設定する。
Descriptionにスプリント期間はいつからいつまでって記載してもいいかも。

![160723-0012.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/94cbc31e-6ad6-0be2-1bc7-ab78dd673fc0.jpeg "160723-0012.jpg")

4スプリント分作ってみた。

![160723-0013.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/5e370bd5-48cd-2d5f-9daa-173a9581d233.jpeg "160723-0013.jpg")


# スプリントバックログを作る

スプリントプランニングで、ユーザーストーリーにマイルストーンを設定するだけ。

![160723-0014_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/f475f534-d90c-cd05-9291-26273ead74d9.jpeg "160723-0014_e.jpg")

マイルストーンでフィルタリングすると完了しなくてはならないユーザーストーリーが一目瞭然。
このチームは3つのユーザーストーリーを完了させる予定らしい。

![160723-0015.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/7a12906d-0979-f440-b73d-4d5eb7501a2d.jpeg "160723-0015.jpg")

で、スプリントプランニングの前半終わり。

# ラベルを作る

「task」「WIP」というラベルを作る。

![160723-0016_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/c574c148-5ca5-3ca5-0aa9-e4c4e2a756f1.jpeg "160723-0016_e.jpg")

# タスクを作る

issueでタスクを作る。
ラベルに「task」を設定、マイルストーンでスプリントを設定、assigneeで担当者を設定する。
完了条件もあった方がいいかもね。

![160723-0017_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/105539a3-9e09-f6c3-7b13-752d721846d1.jpeg "160723-0017_e.jpg")

# ユーザーストーリーにタスクを紐付ける

コメントに記載するだけ。見積もり時間も書いてしまえばいい。
アナログだけどお手軽。
もっといいひも付け方があれば教えてほしい。
でも、これを見ればこのユーザーストーリーはこのタスクが完了すれば終わりというのがひと目で分かる。

![160723-0018.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/d21c09a2-4565-9d97-7120-748b353276c7.jpeg "160723-0018.jpg")

# Todo, Doing, Doneをどう表現するのか

GithubのissueにはDoingのステータスが無い。
仕掛かり中のユーザーストーリーやタスクにはWIPのラベルを付ける。
もしくはタイトルにWIPと書いてもいいかも。
Work in Progressの略だ。
ラベルで絞り込めばひと目でわかる。

![160723-0019.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/61b9c9af-b642-03fd-d63d-2c2ed687aef9.jpeg "160723-0019.jpg")

Doneはissueのクローズで表現すればよいだろう。

# まとめ

スプリントバックログもissueで管理できることがわかった。
変なプロジェクト管理ツールを使わなくても、Github上で全て完結できそうだ。
バックログもソースコードも設計書も管理できるし、Githubは有能やな。
移動ウィンドウのためにpandasのrollingの代わりを探したときのメモ

時系列データのテクニカル分析では、ウィンドウを移動させながら平均を取ったり、最大値や最小値を求めることが多いです。pandasだと、rollingで移動ウィンドウを指定してmean, max, minのメソッドで簡単に書けてしまいます。今回の記事は、pandasより速くできる方法はないかと探したときのメモです。

# pandasのrollingを使う

まず、以下のようにnumpyのarrayとpandasのSeriesで乱数の時系列を作っておきます。

````py
import numpy as np
import pandas as pd
a = np.random.randint(100, size=100000)
s = pd.Series(a)
````

移動ウィンドウでの平均（いわゆる単純移動平均）は、rollingにmeanメソッドを使って次のように書けます。

````py
period=10 #期間
%timeit smean = s.rolling(period).mean()
````
実行時間は

    100 loops, best of 3: 5.47 ms per loop

でした。次に移動ウィンドウでの最大値、最小値です。

````py
%timeit smax = s.rolling(period).max()
%timeit smin = s.rolling(period).min()
````
````
100 loops, best of 3: 5.51 ms per loop
100 loops, best of 3: 5.53 ms per loop
````
実行時間は移動平均とほぼ同じです。

# scipyのフィルタ関数を使う

移動平均はいわゆるFIRフィルタなので、scipyのlfilter関数が利用できます。

````py
from scipy.signal import lfilter
%timeit amean = lfilter(np.ones(period)/period, 1, a)
````
重みをすべて1/periodにしたFIRフィルタとして計算させます。実行時間は

    1000 loops, best of 3: 980 µs per loop

となりました。pandasの５倍以上速くなりました。さすがscipyです。

こんどは、最大値、最小値を求めたいのですが、それにぴったりの関数はなくて、使えそうなのが、[order_filter](http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.order_filter.html)関数でした。この関数は、指定したウィンドウ中で指定した順位の値を順次返す関数です。引数domainにウィンドウのマスク配列、引数rankに順位を指定します。ただし、時系列のサンプルを中心に対象なウィンドウとなるので、配列の前半だけに1を入れておきます。最小値の場合rank=0、最大値の場合、rank=period-1とすればOKです。

````py
from scipy.signal import order_filter
domain = np.concatenate((np.ones(period), np.zeros(period-1)))
%timeit amax = order_filter(a, domain, period-1)
%timeit amin = order_filter(a, domain, 0)
````
実行結果は以下のようになりました。

````
10 loops, best of 3: 102 ms per loop
10 loops, best of 3: 102 ms per loop
````
こんどはpandasの20倍近く遅くなってしまいました。scipyの関数でもダメでした。やはり、任意の順位を出せるよう毎回ソートしているからでしょう。最大値、最小値を求めるのであれば、それ専用の関数がいいということでした。
ifとswitch どっちが早い


## switchみたい
requestanimationframe内で状態管理しながら、ループ回すときに、どっちがいいんだろうなと思った。
そんなに気にする必要ないけど、betterなのはswitchみたい

## パフォーマンス計測

こういう場合の、パフォーマンス計測の正しいやり方ってどんなものがあるんだろう？

## reference

* http://stackoverflow.com/questions/767821/is-else-if-faster-than-switch-case
google > log2(1600000000)の計算 > log(1600000000) / log(2)

google検索上でlog2(x)の計算をしようとしたが駄目だった。
log2(1600000000)で検索するとlog(2) * 1600000000の計算結果である481647993.062が表示される。

底の変換を含めた以下をgoogle検索キーワード枠に入力すると結果である30.575が得られた。

```
log(1600000000) / log(2)
```

ideoneのいずれかの言語でprint文を書くよりは早い。


以下の書き方でも計算できた。

```
log1600000000 / log2
```
UnityでWebカメラの動画をCubeに貼る

以下のScriptをCubeにはる。


```csharp:WebCameraController.cs 
using UnityEngine;

public class WebCameraController : MonoBehaviour {
	public int Width = 1920;
	public int Height = 1080;
	public int FPS = 30;

	void Start () {
		WebCamDevice[] devices = WebCamTexture.devices;
		// display all cameras
		for (var i = 0; i < devices.Length; i++) {
			Debug.Log (devices [i].name);
		}

		WebCamTexture webcamTexture = new WebCamTexture(devices[0].name, Width, Height, FPS);
		GetComponent<Renderer> ().material.mainTexture = webcamTexture;
		webcamTexture.Play();
	}
}
```

> http://loumo.jp/wp/archive/20150414000004/
衝突したコリジョンの名前を判定する

# 衝突したコリジョンの名前を判定する

## 問題点
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/653accc4-431b-5c68-ffba-dd831a0bff2a.png)

## 対応
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/0b0bed5d-91d0-86f9-369e-4ceeff05124e.png)

**修正前**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/bd7116cb-4c62-4308-1aa4-04614be74727.png)

**修正後**
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/b63e0771-da23-69c2-f9b4-9f3b83111b6b.png)

1. Get Display Nameで衝突したオブジェクトの表示名を取得
2. Maches WildCardで表示名がキャラクター名と一致しているか確認する
3. キャラクター名と一致しなかった時だけ処理を実行する

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/c4ad104f-74f3-98ec-1032-f205e4c85270.png)

## その他の対応策
**発射するポイントを遠ざける**
一番処理的にも軽いので好ましいが、銃口から発射している感じがなくなってしまう
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/6bd336a4-d800-66aa-08b0-28c6e6aeebd9.png)

**プレイヤーのCollisionを小さくする**
他の処理に影響が出てしまうため、やりたくない
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/6a12b441-4f41-2c38-ac25-f23d0ff5514d.png)
ポケモン情報APIを作った


ついに出ましたね、ポケモンGO！流行りすぎです！w
これに乗っかってポケモン情報APIを作ってみました。

http://pokemonapi.net/

今のところは151匹のかんたんな情報を返すだけですが、要望などいただければ機能追加していこうと思います。
サンプル → http://pokemonapi.net/pokemon/1.json

* アプリやWebサービスでポケモン情報を提供したい
* 実はポケモンのことあんまり知らない（やったことない）
* 昔はポケモンやってたけど結構忘れてる

みたいなエンジニアの方に利用していただければと思います。

要望などありましたら、この記事か[Twitter](https://twitter.com/shoma2da)あたりに連絡ください。
[ILINK32 警告] Warning: エラーが検出されました(LME286) 

#about
　C++Builderでビルド、コンパイルをしていると、
> [ILINK32 警告] Warning: エラーが検出されました(LME286) 

　と表示され、「うぉっ」となることがある。
　しかもLME286とかいう何のエラーかもまるで検討のつかないエラーコードっぽい何か。

# 解決策
　一番早いのはPCまるごと再起動。とりあえず手元の環境ではこれでOK
　また古いAvastが入っていると、邪魔して.exeの実行をフックすることがあるとのこと。一旦切るのも一手。
　（手元ではウイルスバスターが入っていますが、特に問題なかったです）

　→　Builderのみ再起動では解決しません (C++Builder 10 Berlin)

# 議論（embarcadero）
http://qc.embarcadero.com/wc/qcmain.aspx?d=102099
Laravel5.2 PostgreSQLでバイナリデータ(bytea型)をDBにInsertする

##やりたいこと
Laravel5.2でPostgreSQLを使用してバイナリデータ(bytea型)をDBにInsert

##結論
・PDOを使用
・バイナリデータ(bytea型)をラージオブジェクト (LOB)として使用する
・SQLを直書きせずにクエリビルダーを使用してできるなら知りたい

##環境
・Laravel 5.2
・Laravel/homestead v0.5.0
　　・Ubuntu 16.04
　　・PHP7
　　・Nginx等
・使用するDB:PostgreSQL

##手順
1.PDOを使用
2.バイナリデータ(bytea型)をラージオブジェクト (LOB)としてInsert

```php:migrationFile.php
    public function up()
    {
        Schema::create('files', function (Blueprint $table) {
            $table->increments('id');
            $table->binary('file_data');
        });
    }
```

```php:HogeController.php
    //$hogeFileはリクエストから取得したFileデータ
    $fileData = file_get_contents($hogeFile);

    //Laravel/homesteadではPostgreSQLはpgsqlとして設定
    $db = DB::connection('pgsql')->getPdo();
    $stmt = $db->prepare("INSERT INTO files (file_data) VALUES (?)");
    $stmt->bindParam(1, $fileData, $db::PARAM_LOB);
　
    $stmt->execute();
    unset($db);
```

##参考
[LARAVEL.IO:How to retrieve IMAGE from MSSQL server ? ](http://laravel.io/forum/12-29-2015-how-to-retrieve-image-from-mssql-server)
[PHPからPostgreSQL 9.3.2のbytea列(BLOB)に画像を登録、検索する](http://symfoware.blog68.fc2.com/blog-entry-1267.html)
[WebViewシリーズ②]  WebView内でJavaScriptのメソッドを操作する

# はじめに
[[WebViewシリーズ①]　WebViewのイベントをフックする](http://qiita.com/eKushida/items/a1679e2f438d3fa83c18)の続編です。

前回は、WebViewからネイティブアプリを操作しましたが、
今回は、ネイティブアプリからWebViewを操作する方法をご紹介します。

## やること
下記パターンのJavaScriptメソッドを呼ぶ方法について

① 引数なし、戻り値なし
② 引数あり、戻り値なし
③ 引数あり、戻り値あり
④ 引数あり、戻り値あり(JSON形式)

## やらないこと
・WebViewの表示方法について
・JavaScriptについて

# 実装例

1. WebViewに操作したいJavaScriptのメソッドが定義されているhtmlファイルを表示する
2. JavaScriptを操作する(stringByEvaluatingJavaScriptFromString)

1については、割愛します。
以下に、2について順にご紹介します。

## 1. 引数なし、戻り値なし

```:JS
    function pokemonGo() {
        // do something
    }
```

```:Swift
    webView.stringByEvaluatingJavaScriptFromString("window.pokemonGo();")
```

## 2. 引数あり、戻り値なし

```:JS
    function moveToLocation(lat, lng) {
        // 位置情報の偽装はいけません。
    }
```

```:Swift
    let lat = 139.7
    let lng = 35.6
    webView.stringByEvaluatingJavaScriptFromString("window.moveToLocation('\(lat)', '\(lng)');")

```

## 3. 引数あり、戻り値あり

```:JS
    function getMonster() {
        return "pokemon"
    }
```

```:Swift
    if let name = webView.stringByEvaluatingJavaScriptFromString("window.getMonster();") {
        print(name)
    }

```

## 4. 引数あり、戻り値あり(JSON形式)

```:JS
    function getMonsterInfo() {
      return { "name":"フシギダネ", "number":1 };
    }
```

```:Swift
    if let monsterInfoStr = webView.stringByEvaluatingJavaScriptFromString("JSON.stringify(window.getMonsterInfo());") {

        if let monsterInfoData = monsterInfoStr.dataUsingEncoding(NSUTF8StringEncoding) {

            do {
                let monsterInfoJson = try NSJSONSerialization.JSONObjectWithData(monsterInfoData,
                                                                             options: NSJSONReadingOptions.MutableContainers)
                print(monsterInfoJson);
            } catch let error as NSError {
                print(error.description)
            }
        }
    }
```

# まとめ
WebView内でJavaScriptのメソッドを操作するには、下記の2ステップが必要です。

1. WebViewに操作したいJavaScriptのメソッドが定義されているhtmlファイルを表示する
2. JavaScriptを操作する(stringByEvaluatingJavaScriptFromString)

# こちらも合わせて読んでください♥
[[WebViewシリーズ①]　WebViewのイベントをフックする](http://qiita.com/eKushida/items/a1679e2f438d3fa83c18)
[[WebViewシリーズ②]　WebView内でJavaScriptのメソッドを操作する](http://qiita.com/eKushida/items/055dc36119757b2c304e)
[[WebViewシリーズ③]　WebViewは、ページ内のアンカーへリンクできない？？](http://qiita.com/eKushida/items/dd91615c68f3bd5abdd1)
[[WebViewシリーズ④]　WebView（アプリ内）のリンクからiTunesが表示できない](http://qiita.com/eKushida/items/f7f7195ca0f12b25bca1)

[ゆるふわにUIWebViewでJavaScriptイベントをひろってみる](http://qiita.com/nnsnodnb/items/27fd7c1ca2f8e24ec9c7)

誤り等ございましたら、ご指摘頂ければ幸いです。
ZYBO / VHDL > カウンタ実装 / Run Simulation

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

VHDLでカウントアップしていくものを作成してみる。

VHDLのコードとテストベンチの作成の手順は以下を参照
http://qiita.com/7of9/items/ec1a0048e69e74adc39a

VHDLコードとテストベンチは以下を参考にした。
http://www.asic-world.com/vhdl/first1.html

## code

```clockCounter.vhd
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity counter is
port(   Clk : in std_logic;
        Reset : in std_logic;
        OUT_D : out std_logic_vector (3 downto 0)
        );
end counter;

architecture Behavior of counter is
signal DFF_8 : std_logic_vector (3 downto 0);

begin

process(Clk, Reset)
begin
    OUT_D <= DFF_8;
    if (Reset = '1') then
        DFF_8 <= (others => '0');
    elsif ( clk'event and clk = '1') then    
        if (DFF_8 = "1111") then
            DFF_8 <= (others => '0');
        end if;
        DFF_8 <= DFF_8 + 1;
    end if;
end process;
end Behavior;
```

テストベンチ。
clk_processというプロセス以外にリセットの周期を決めるstimulus(名前は任意)プロセスを用意するということらしい。数週間前に読んだ本にもおそらく掲載されていたが、忘れていた。

```clockCounter.tv
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity testbench is
end testbench;

architecture behavior of testbench is
signal clk : std_logic;
signal reset : std_logic;
signal out_d : std_logic_vector (3 downto 0);
constant clk_period : time := 10 ns;

begin
uut: entity work.counter PORT MAP (
    clk => clk,
    reset => reset,
    out_d => out_d);
  
stimulus : process
begin
    wait for 5 ns;
    reset <= '1';
    wait for 5 ns;
    reset <= '0';
    wait for 300 ns;
end process;

clk_process : process
begin
    clk <= '0';
    wait for clk_period / 2;
    clk <= '1';
    wait for clk_period / 2;
end process;

end behavior;
```

## 結果

Run Simulationの結果

reset, clkの入力に対して、out_dがカウントアップしていくようになった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4371b95b-bbcf-09be-18b8-65f03a2d9a57.png)

これを発展させてパルスカウントしたものをUART出力する予定。
Laravel + Git初期設定

## Laravelプロジェクトを作成
```Bash
# laravelコマンドを使う場合
laravel new ProjectName

# compposerを使う場合
composer create-project "laravel/laravel=5.6.*"

cd ProjectName
```

## 新たにGit管理開始
```Bash
git init
```

## ローカルにコミット
```Bash
git add .
git commit -m "initial commit"
```

## プッシュ
```Bash
git remote add origin [リポジトリURL]
git push -u origin master
```
Vivado / VHDL > found '0' definitions of operator “+” in VHDL > use ieee.std_logic_unsigned.all;を追加する

```txt:動作環境
Vivado 2015.4 on Windows 8.1 pro (64bit)
```

VHDLにてカウンタを実装しようとしている。

Vivadoにて以下の構文を含むVHDLを用いてRun Simulationしようとした時にエラーが出る。

```
process(Clk)
begin
    OUT_D <= DFF_8;
    if ( clk'event and clk = '1') then
        DFF_8 <= DFF_8 + 1;
    end if;
end process;
```

エラーメッセージは以下で、`DFF_8 <= DFF_8 + 1;`がおかしいというようだった。

```
found '0' definitions of operator “+” in VHDL
```

以下を見つけた。

http://stackoverflow.com/questions/26598471/found-0-definitions-of-operator-in-vhdl

> Start your VHDL with
```
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_unsigned.all;
```

`use ieee.std_logic_unsigned.all;`を追加したら問題がなくなった。


関連して
http://www.picfun.com/vhdl31.html
> 
上記ではIEEE.std_logic_unsignedのライブラリは符号無しの演算のみが定義されていますが、IEEE.std.logic_arithのライブラリには整数と符号無し演算が定義されていますので、このいずれかを定義して使用します。
Linux Wi-FiドライバのFullMAC/SoftMAC

Linux Kernel に含まれるWi-Fiドライバが、FullMACとSoftMACのどちらなのかを調べてみました。

FullMACドライバはMACのMLME処理をWi-Fiチップで行うドライバです。SoftMACドライバはMACのMLME処理をカーネルのmac80211で行うドライバです。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/42120/c6a86e97-29ec-802e-875f-c5fe089fd167.png)



どうも、時代の流れはSoftMACに分があるようです。最近になってもFullMACのチップを作っているのはBroadcomとMarvellのみです。Androidをサポートする場合はテザリングでAPモードが必要だったり、Wi-Fi Directが必要だったりで、それをFullMACでサポートするのに掛かるコストは大変そうです。

# ソース
* Linux kernel 4.9を調査しました。
* https://github.com/torvalds/linux/tree/v4.9

# 判別方法
* cfg80211_opsを定義しているドライバはmac80211を使っていないのでFullMACと判断した。
* ieee80211_opsを定義しているドライバはmac80211を使っているのでSoftMACと判断した。

# FullMAC　in Linux kernel
* ath/ath6kl
* ath/wil6210
* broadcom/brcm80211/brcmfmac
* intel/ipw2x00
* intersil/orinoco
* marvell/libertas
* marvell/mwifiex

# SoftMAC in Linux kernel
* admtek
* ath/ar5523
* ath/ath10k 
* ath/ath5k
* ath/ath9k
* ath/carl9170
* ath/wcn36xx
* atmel
* broadcom/b43
* broadcom/b43legacy
* broadcom/brcm80211/brcmsmac
* intel/iwlegacy
* intel/iwlwifi/dvm
* intel/iwlwifi/mvm
* intersil/p54
* marvell/libertas_tf
* marvell/mwl8k.c 
* mediatek/mt7601u
* ralink/rt2x00
* realtek/rtl818x
* realtek/rtl8xxxu
* realtek/rtlwifi
* rsi
* st/cw1200
* ti/wl1251
* ti/wl12xx
* ti/wl18xx
* zydas/zd1211rw

# その他
* 上記に含まれないドライバはwireless extensionにしか対応していない古いドライバです。

# Proprietary SoftMAC
* 独自のSoftMAC処理を組み込んだドライバがチップベンダから提供されている場合があります。
* それらは大抵の場合、巨大で読みにくいコードです。
* Realtek
 * https://github.com/lwfinger/rtl8188eu 
* Mediatek (from Ralink)
 * https://github.com/terence-deng/mt7601u
* Mediatek (from Improcomm)
 * https://github.com/BemolxDevelopment/android_kernel_mediatek_mt6795/tree/master/drivers/misc/mediatek/connectivity/combo/drv_wlan/mt6630
VHDL > Link > DATA:=(others=>'0'); > DATAの幅に関わらずすべてのビットに０を入れるということです

```
DATA:=(others=>'0');
```

VHDLの本で上記の構文があったが、2冊の本ともにその文法の説明はなかったので、それらの本は自己完結的ではなかった。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1469101949
> DATAの幅に関わらずすべてのビットに０を入れるということです。

VHDL入門者としては、case文のothers => と混同して、「何かの条件以外ということか？その条件とは何だろう？」という混乱をしてしまうと思う。
FPGA / VHDL > Link > Toni T800 @ Youtube

FPGA / VHDL関連の動画を見つけた。
[FPGA Tutorial 1. Blinking LEDs on DE1 Altera Board](https://www.youtube.com/watch?v=T9VbBI3foGQ&index=58&list=PL_MJualihC5CAtnZHphK-hli8aSL3PRRz)

- 18分程度で適度な長さの中でまとまっている
- 英語字幕表示あり
- IDE内の文字もそこそこ読める

FPGA/VHDLのことをちょっと知りたいという時に見るには手ごろ。

顔写真の隣に文字が表示されるUIは25年くらい前にX68000で遊んだアドベンチャーゲームの雰囲気に通じる。
技術英語 > you’ve missed the whole point.

@ LOE > July 4, 2003

http://www.loe.org/shows/shows.html?programID=03-P13-00027
>  you’ve missed the whole point.

http://eow.alc.co.jp/search?q=whole+point
> 核心、肝心なこと、本質

意訳「あなたは本質を見落とした」

<hr>
関連して思い出したのは

Your point?

http://qiita.com/7of9/items/5f968683f2968cde26e4
> Voyagerにて、話の要領を得ることができないドクターがクルーに聞いていた時に出ていた。
Jetson TX1 で Faster R-CNN を動かす

Jetson TX1 で Faster R-CNN のPython実装のデモを動かすところまでやってみました。基本的にはこのREADMEに従えば動くのですが、いくつかはまりポイントがあったので、自分のメモがてら残しておきます。

https://github.com/rbgirshick/py-faster-rcnn

# JetPack のセットアップ
[JetPack for L4T 2.1]
(https://developer.nvidia.com/embedded/jetpack-2_1) をインストール。v2.2は CuDNNのバージョンが5.0で動かないので注意。

# インストール

## ソースコードの取得
公開認証鍵を作成して GitHub に登録する。このあたりをみてもらえるとよいかと。
[gitHubでssh接続する手順~公開鍵・秘密鍵の生成から~]
(http://qiita.com/shizuma/items/2b2f873a0034839e47ce)

```bash
$ cd .ssh
$ ssh-keygen
```

Faster R-CNN のソースコードを git clone する。--recursive を入れるのを忘れずに。

```bash
$ cd ..
$ sudo apt install git
$ git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
```

## 依存ライブラリのインストール
これだけ入れておけば動きます。

```bash
$ sudo apt-get install libatlas-base-dev libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libboost-all-dev libgflags2 libgflags-dev libgoogle-glog-dev liblmdb-dev libyaml-dev
$ sudo apt-get install python-numpy python-setuptools python-pip cython python-opencv python-skimage python-protobuf
$ sudo pip install easydict PyYAML
```

##Cython モジュールのコンパイル
```bash
$ cd py-faster-rcnn/lib
$ sed -i -e 's/lib64/lib/g' setup.py
$ make

#途中でエラーが出るので、gpu_nms.cpp を書き換えて再度 make
$ sed -i -e '1617s/__pyx_t_5numpy_int32_t/int/g' nms/gpu_nms.cpp
$ make
```
参考：http://blog.csdn.net/jiajunlee/article/details/50373815

##Caffe のインストール

```bash
$ ../caffe-fast-rcnn/
$ cp Makefile.config.example Makefile.config
```
 
下記の項目のコメントを外す。

```
USE_CUDNN := 1
WITH_PYTHON_LAYER := 1
```

# 検証について
- 使用したモデル
VGG16: 13層の畳み込み層
ZF: 5層の畳み込み層

- 学習は行わず、Forward propagation のみ実施
- 候補領域数は最大300 に設定


# 実行結果

TX1では特に調整することなく動いた。各モデルの平均処理時間は下記の通り。


| モデル | 平均処理時間（秒） | 平均領域候補数 |
|:-:|:-:|:-:|
|VGG16| 3.01  | 230  |
|ZF   | 0.91  |233   |
EnumでRealmのカラムをセイフティに扱う


##はじめに
私が思うSwiftの優れている点の１つはEnumだと思います。
そして、データベース界隈で今最も熱いのはRealm。

今回はその強力な２つのツールの複合技について書きたいと思います。
題して、「EnumでRealmのカラムをセイフティに扱う」です。

##RealmでEnum？
###具体例
早速ですが、コードを見ていただきましょう。

```Swift:NohirapEntity.swift
import RealmSwift

enum NohirapType: String {
    case Nohirap1 = "Nohirap1"
    case Nohirap2 = "Nohirap2"
    case Nohirap3 = "Nohirap3"
}

class NohirapEntity: Object {
    dynamic var id = ""
    dynamic var text = ""
    dynamic private var type = ""
       
    var nohirapType: NohirapType? {
        get {
            return NohirapType(rawValue: type)
        }
        set {
            type = newValue?.rawValue ?? ""
        }
    }

    override static func primaryKey() -> String? {
        return "id"
    }
}

```

これは何をしているのかというと、
Realmオブジェクトのtypeカラムを外部からはEnum（nohirapType）を介してでないとアクセスできないようにしています。
###なんでそんなことするの？
Enum型の利点といえば、enumで定義されたもの以外の意図しない値を代入できないようにすることによって、セイフティなコーディングができることだと思います。
上記の例では、typeをEnum（nohirapType）を介してアクセスすることを強制することによって、NohirapType型の値しか代入できないようにしています。

##もう１つライブラリを増やしてみた
Swift + Realmといえば……。
そう、ObjectMapperですね。
ObjectMapperを使った場合はどう書くかを以下に記載します。

```Swift:NohirapEntity.swift
import RealmSwift
import ObjectMapper

enum NohirapType: String {
    case Nohirap1 = "Nohirap1"
    case Nohirap2 = "Nohirap2"
    case Nohirap3 = "Nohirap3"
}

class NohirapEntity: Object {
    dynamic var id = ""
    dynamic var text = ""
    dynamic private var type = ""
       
    var nohirapType: NohirapType? {
        get {
            return NohirapType(rawValue: type)
        }
        set {
            type = newValue?.rawValue ?? ""
        }
    }

    override static func primaryKey() -> String? {
        return "id"
    }
    
    required convenience init?(_ map: Map) {
        self.init()
        mapping(map)
    }
}

// MARK: - ObjectMapper
extension NohirapEntity :Mappable {
    func mapping(map: Map) {
        id <- map["id"]
        text <- map["text"]
        var typeTmp = ""
        typeTmp <- map["type"]
        nohirapType = NohirapType(rawValue: typeTmp)
    }
}

```

現場ではSwift + Realm + ObjectMapperの組み合わせはわりと使うので、よくこんな感じになっています。

##まとめ
今回のケースでもそうですが、
とにかく隙あらばしつこいくらいにEnumを活用していけば良いのではないかと思います。
Githubのissueでプロダクトバックログを作ってみよう

#あらすじ
実はGithubのissueって使い道がよくわからず、
今の職場ではTodoタスクを積み上げる感じになっているので、これじゃ勿体無いと思い使い道を探してみた。


プロダクトバックログに必要なのは __ユーザーストーリーの優先順位の変更__ ができること。
issueは並べ替えができないものの、並べ替えをする方法があった。
つまり、プロダクトバックログ作ることができるのだ。
でも、手法は実に原始的。
しかし、手法は問わないのがアジャイルである。
というわけでやってみよう。


#ラベルを作る

「product backlog」というラベルを作る。

![160723-0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/9e93e1f1-af6a-5840-7bd2-be9d98c765b4.jpeg "160723-0002.jpg")

「user story」というラベルを作る。

![160723-0003_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/4d77a573-4667-3833-4fea-b362741272f0.jpeg "160723-0003_e.jpg")

#プロダクトバックログのissueを作る

issueを作って「product backlog」のラベルを貼る。

![160723-0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/95f22241-f4dd-8829-b11b-c75f219f11d9.jpeg "160723-0001.jpg")

#ユーザーストーリーを作る

こんな感じで。
「user story」のラベルを付ける。
受け入れ基準(Acceptance Criteria)も忘れずに。
チェックボックスを付けると良い。
ちなみに、受け入れ基準はyes/noで判断できる内容であるべき。

![160723-0005_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/d1e175ac-9700-6463-4f6a-3f1b0766afd5.jpeg "160723-0005_e.jpg")

同じように、いくつか作る。
![160723-0006.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/550cfc4b-532b-f30d-7930-97bde9208598.jpeg "160723-0006.jpg")

#ユーザーストーリーをプロダクトバックログに追加する

追加っていっても書くだけ。
しかし、優先順位を変えるためにはチェックボックスが必要なのだ。

![160723-0007_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/257cecc8-3f0c-3525-e1fd-720a3217cd39.jpeg "160723-0007_e.jpg")

#優先順位を変える

チェックボックスの左側に並べ替え用のアイコンが出てドラッグ可能になる。
ユーザーストーリーの優先順位はこれで並べ替えることができる。
素敵！

![160723-0008_e.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/8450d7fe-a955-f5b2-c431-b1e0268481ab.jpeg "160723-0008_e.jpg")

#ぐみべあをどう表現するか

ぐみべあはストーリーポイントと表現することもある。
要は見積もり結果のポイントのこと。
ユーザーストーリーの横に記載するだけでも十分だろう。

![160723-0009.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/37f06d81-e211-40f3-fc35-c353b7beb426.jpeg "160723-0009.jpg")

ただ、ポイントの合計がいくつなのかは計算しないとわからんのが欠点かな。

#詳細ゾーンと粗目ゾーンにわけてもいい

わけるのは水平線とかだとわかりやすい。
直近2〜3スプリントで行うユーザーストーリーが詳細ゾーンにある。

![160723-0010.jpg](https://qiita-image-store.s3.amazonaws.com/0/33176/4f6c5bd0-7bac-238e-d7c9-0df5745169db.jpeg "160723-0010.jpg")


#まとめ

開発でGithubを使うのであれば、JIRAとかRedmineとかツールを使いわけなくてもGithubだけでプロダクトバックログを管理できる。
個人的にはJIRA嫌いなのでissueならシンプルでいいと思ふ。
チームとしてもこの方がやりやすいのではなかろうか。
思いつきなので運用に耐えうるものかどうかはわからぬ。誰かやってみて欲しい。
spark sqlのdataframeをhive tableとしてparquet formatで圧縮して保存するには


やったのは

- 生ログが1行jsonのデータでhdfsにある
- 生ログをspark RDDとして読み込み
- RDDをparseして、dfに変換
- dfをparquet formatでhive tableにsaveしてあとでhive tableとして引けるようにする。


```
import scala.collection.mutable.HashMap

import org.apache.spark._
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.functions._
import org.apache.spark.sql.hive.HiveContext

val options = new HashMap[String, String]

options.put("spark.hadoop.mapred.output.compress", "true")
options.put("spark.hadoop.mapred.output.compression.codec", "true")
options.put("spark.hadoop.mapred.output.compression.codec", "org.apache.hadoop.io.compress.GzipCodec")
options.put("spark.hadoop.mapred.output.compression.type", "BLOCK")

//val sqlContext = new SQLContext(sc)
val sqlContext = new HiveContext(sc)
import sqlContext.implicits._


val date="2016-07-21"
val hour="00"

// imp
val impRdd = sc.textFile(s"/data/service/imp/$date/$hour")
val parsedImp = impRdd.map(LogParser.parse)

```

imp logをdfに変換して、 hive tableとしてsaveする。

```
val impDf = parsedImp.flatMap(LogParser.parseForDFRow).toDF

impDf.write.options(options).saveAsTable("imp_fact_table")
```

あと考慮すること、やってみることは

- partitionByでpartition指定
- insertIntoを使う
- text methodを使ってのtsv?での出力

https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/sql/DataFrameWriter.html
ruby append_features

https://ruby-china.org/topics/5835

http://apidock.com/ruby/Module/append_features

http://docs.ruby-lang.org/ja/2.1.0/method/Module/i/append_features.html

super http://qiita.com/kanpou_/items/ce172d955a87e7b0c756

http://stackoverflow.com/questions/17007098/ruby-modules-and-moduleappend-features-explanation

```rb
require 'pry'

module M
  def lala
    puts "lala"
  end

  def self.append_features(klass)
    super
  end
end

class A
  include M
end

A.new.lala
```

```bash
vagrant@precise64:~/data/rails$ ruby ../2.rb 
lala
```

```rb
require 'pry'

module M
  def lala
    puts "lala"
  end

  def self.append_features(klass)
    # super
  end
end

class A
  include M
end

A.new.lala
```


```bash
vagrant@precise64:~/data/rails$ ruby ../2.rb 
../2.rb:17:in `<main>': undefined method `lala' for #<A:0x0000000271c198> (NoMethodError)
```


http://elfxp.com/different-between-included-and-append_features/

metaprogramming ruby 2

同样也有extend_object相对于extended
Ruby初心者がrailsチュートリアルを始める前にやったこと。

html、css、サーバの仕組みは薄っすらと理解していて、基本的なパソコン操作ができる人用のメモ書きです。

##Atomエディタのインストール
初心者向け学習サイトの定番[ドットインストール](http://dotinstall.com)用のプラグインが用意されています。

エディタ横に動画を表示させるとサクサク学習が進みますね。

家ではMac、会社や学校ではWindowsな人でも開発環境を同じに出来るので、動作環境を選ばない点でもオススメです。

[Atom](https://atom.io)
[japanese-menu](https://atom.io/packages/japanese-menu) => 日本語メニュー化プラグイン
[dotinstall-pane](https://atom.io/packages/dotinstall-pane) => ドットインストール表示用プラグイン
[terminal-plus](https://atom.io/packages/terminal-plus) => 作業ターミナル用プラグイン


[職業別！ATOMエディタの作業が超捗る便利パッケージ24選](http://www.sejuku.net/blog/3099)


##学習サイト
- [ドットインストール](http://dotinstall.com)　３分動画が手軽。
- [Progate](http://prog-8.com/)　参考書っぽい。
- [CODEPREP](http://codeprep.jp/ja)　ドリルっぽい。
- [paiza](http://paiza.jp) 技術力=求人数

定番のドットインストールでRuby入門、Ruby on Rails4入門を一通りやった後、チュートリアルを始めました。全くの初心者だと理解に時間がかかるかも知れませんが、JavaScriptやPHPを齧った人なら2〜3時間でサクッと終わります。

html、cssは薄っすら理解していたので飛ばしましたが時間がある時に見返しています。CSSフレームワークやJQueryなども用意されているのでシッカリ復習した方が良いです。SQL文がわからない人は[SQLite入門](http://dotinstall.com/lessons/basic_sqlite_v2)や[MySQL入門](http://dotinstall.com/lessons/basic_mysql_v2)で予習しておきましょう。


##買った本(主にkindle版)
Ruby初心者はドットインストールとチュートリアルだけでお腹一杯なので、別に買わなくてもいいけど手元にあると理解が進むかも。
- [たのしいRuby](https://www.amazon.co.jp/たのしいRuby-第5版-高橋-征義-ebook/dp/B01C804DO8/ref=dp_kinw_strp_1/352-3946258-7139936)
- [パーフェクトRuby on Rails](https://www.amazon.co.jp/パーフェクトRuby-Rails-すがわらまさのり-ebook/dp/B00P0UR1RU/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1469200404&sr=1-1&keywords=パーフェクトRuby+on+Rails)
- [Ruby on Rails4](https://www.amazon.co.jp/Ruby-Rails-4アプリケーションプログラミング-山田祥寛-ebook/dp/B00JZKX6DE/ref=dp_kinw_strp_1/352-4078619-9456613)
- [実践Ruby on Rails4](https://www.amazon.co.jp/実践Ruby-Rails-4-現場のプロから学ぶ本格Webプログラミング-黒田-ebook/dp/B00LBPDNSY/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1469200474&sr=1-1&keywords=実践Ruby+on+Rails4)


##iPhoneに入れたアプリ
- [Dash API Docs](https://kapeli.com/dash_ios) 各種言語のAPIリファレンス
- [RubyPico](http://rubypico.ongaeshi.me/ja/) 暇な時間にkindle本を読みながらコード確認

##アカウントを作成したサイト
- [Google](www.google.co.jp) 開発用のアカウントを作成。
- [Cloud9](https://c9.io) ローカル環境でもいいけど定番ルートも抑えておく。
- [Heroku](https://www.heroku.com) 理想はAWSだけどRubyist御用達の仮想環境も用意。
- [GitHub](https://github.com) チュートリアルでは使わんけど将来のために用意。
- [Bitbucket](https://bitbucket.org)チュートリアルおよび個人用に用意。
- [Quita](http://qiita.com)  kobitoで備忘録を残しつつ立派なRubyistを目指す。
[Rails] ActiveSupport::Concernとは

Concernとは何か。どう便利なのか。
[[Rails] ActiveSupport::Concern の存在理由 - Qiita](http://qiita.com/castaneai/items/6dc121ce6ff100614f42) で解説されている内容をもう少し初歩から説明してみる。


次のように`Base`があり、継承した`Sub1`, `Sub2`があるとする。

```rb
class Base
  # Baseのクラスメソッド
  def self.hoge(str)
    puts str
  end
end

class Sub1 < Base
  hoge("same")
end

class Sub2 < Base
  hoge("same")
end
```

実行すると次のように表示される：

```
same
same
```

このSub1, Sub2の中の

```rb
  hoge("same")
```
の部分がまったく同じなので、コピペでなく共通化したい。しかし普通にmoduleを使って

```rb
class Base
  # Baseのクラスメソッド
  def self.hoge(str)
    puts str 
  end 
end

module Mod 
  hoge("same")
end

class Sub1 < Base
  include Mod 
end

class Sub2 < Base
  include Mod 
end
```

と書くと`undefined method ｀hoge' for Mod:Module`とエラーになってしまう。
正しくは`included`を使って次のように書けば良い。

```rb
class Base
  # Baseのクラスメソッド
  def self.hoge(str)
    puts str
  end
end

module Mod
  def self.included(base)
    base.class_eval do
      hoge("same")
    end
  end
end

class Sub1 < Base
  include Mod
end

class Sub2 < Base
  include Mod
end
```

これでちゃんと

```
same
same
```

と表示されるようになった。
この書き方がちょっと複雑だというので考えられたのがConcern。Concernを使うと次のように書ける。

```rb
require "active_support/concern"
    
class Base
  # Baseのクラスメソッド
  def self.hoge(str)
    puts str
  end 
end   

module Mod
  extend ActiveSupport::Concern
  included do
    hoge("same")
  end 
end

class Sub1 < Base
  include Mod
end

class Sub2 < Base
  include Mod
end
```

Concernのもう１つのメリットとして、includeする側が依存関係を考えなくて済むという事もある。
MixpanelのCustom EventをAPIで扱うためのTips

# カスタムイベントとは

Mixpanelには通常のイベントとは別に、カスタムイベントと呼ばれるものがあります。これはMixpanel上で、任意の条件をつけた新しいEventを定義できるものです。上手く使えば、実装上の手間を省けたり、実装漏れをカバーできたりと便利な機能です。

# カスタムイベントをAPIで扱う

## 通常のイベント

MixpanelにはAPIが用意されており、例えばMixpanelのSegmentation機能における`FooEvent`の値を取得する場合は、以下のようになります。

```js
MP.api.segment('FooEvent').done(function(results) {
  console.log(results.values());
});
```

## カスタムイベント

カスタムイベントの場合、通常イベントのように、カスタムイベント名を単純に指定してもAPIから操作できません。Mixpanelの内部的なCustomEvent IDを指定する必要があります。

```js
MP.api.segment('$custom_event:12412').done(function(results) {
  console.log(results.values());
});
```

このIDを取得する方法は、[Mixpanelのヘルプ](https://mixpanel.com/help/questions/articles/how-do-i-query-for-custom-events-via-the-mixpanel-api)に記載されているように、ブラウザのDeveloper ConsoleからMixpanel上のxhrのパラメータを見る必要があります :innocent:
かなりworkaround感ある方法なので、そのうち正式に対応されるでしょう…。

# 参考

https://mixpanel.com/help/questions/articles/how-do-i-query-for-custom-events-via-the-mixpanel-api
Redhat7.2 で sdkman を使って Groovy のインストール及び使ってみた

作業メモです

# バージョン情報

+ Red Hat Enterprise Linux Server release 7.2 (Maipo)
+ SDKMAN 5.0.0+51
+ Groovy Version: 2.4.7 JVM: 1.8.0_101

# sdkman のインストール

[sdkman installation](http://sdkman.io/install.html) 

```bash
$sudo yum install unzip java-1.8.0 java-1.8.0-openjdk-devel -y
$curl -s "https://get.sdkman.io" | bash
```

```.bashrc
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.101-3.b13.el7_2.x86_64/
source "$HOME/.sdkman/bin/sdkman-init.sh"
```

```bash
$source .bashrc
$sdk version
==== BROADCAST =================================================================
* 21/07/16: Grails 3.2.0.M2 released on SDKMAN! #grailsfw
* 18/07/16: Gradle 2.14.1 released on SDKMAN! #gradle
* 15/07/16: Kotlin 1.1-M01 released on SDKMAN! #kotlin
================================================================================
SDKMAN 5.0.0+51
```

# Groovy のインストール

[sdkman usage](http://sdkman.io/usage.html)

```bash
# list groovy versions
$sdk list groovy

# install latest stable groovy
$sdk install groovy
Downloading: groovy 2.4.7

In progress...

######################################################################## 100.0%

Installing: groovy 2.4.7
Done installing!

Do you want groovy 2.4.7 to be set as default? (Y/n): y

Setting groovy 2.4.7 as default.

$groovy --version
Groovy Version: 2.4.7 JVM: 1.8.0_101 Vendor: Oracle Corporation OS: Linux
```

# HelloWorld

```hello.groovy
println 'hello world'
```

```bash
$groovy hello.groovy
hello world
```

# Grape を使ってみる

[Groovyの簡易依存関係管理ツール、Grapeを使ってみる](http://d.hatena.ne.jp/Kazuhira/20120707/1341661390)

Maven 利用して。。など面倒な時に便利。
コード内で必要な Maven リポジトリの内容を書いておくとダウンロードして使えるようになる。
import 文はもちろん書かなければいけないので注意。

例えば Apache Common Lang 3.4 使いたい! という時には Maven リポジトリで探して該当ページを開くと下に Grape というタブがあるのでそこの内容をコピペすればOK。

[Apache Commons Lang » 3.4](https://mvnrepository.com/artifact/org.apache.commons/commons-lang3/3.4)

```
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
@Grapes(
    @Grab(group='org.apache.commons', module='commons-lang3', version='3.4')
)
```

ほぼ参考サイトのコピペだが書いてみる。

```GrapeTest.groovy
// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
@Grapes(
    @Grab(group='org.apache.commons', module='commons-lang3', version='3.4')
)

import org.apache.commons.lang3.StringUtils

println(StringUtils.join(args, ', ') + '!')
```

```bash
$groovy GrapeTest.groovy Hello World
Hello, World!
```

便利〜
【Xcode】ショートカットを覚える

Xcodeのショートカット使っていますでしょうか。
私はビルドやランやテストしか使っていなかったのですが、
小さい効率化の積み重ねは大事だと思い直し、
覚える作戦を思案してみました。

## [【開発効率アップ↑】Xcodeでよく使うショートカットまとめのまとめと解説](http://qiita.com/snow_richisland/items/0df7764938e59a8572b3)
一つ目はこちらの記事です。
ショートカットがよく使う順に並んでいて、
どれを優先して覚えるのが良いのかわかります。
一方でいちいち調べるのは手間なので、その場で参照するには厳しそうです。

## [CheatSheet](https://www.cheatsheetapp.com/CheatSheet/)
こちらはXcodeを開いた状態でCommandを長押しするだけで
ショートカットがポップアップするので、
調べる手間がかかりません。
しかしながら文字の羅列なので直感的にわからず、やや使いづらいです。

## [Xcode Keyboard Shortcuts](https://swifteducation.github.io/assets/pdfs/XcodeKeyboardShortcuts.pdf)
こちらはXcodeの画像上にショートカットキーが表示されているため
直感的に操作を理解できます。
また、画像には表示できない操作に関してもリストアップされており網羅性もあります。
一方でpdfのためいちいち開かないといけない手間がかかってしまいます。

## [Xcodeチートシート for MacBook Air 11inch (1366×768)](http://www.dotapon.sakura.ne.jp/blog/wp-content/uploads/2012/06/XcodeCheatSheet_1366x768.zip)
こちらは壁紙のチートシートです。
Xcodeの画像上の表示のみのため、表示されていない項目もありますが、
壁紙にしてしまえば参照する手間はそれほどはかかりません。

# 結論
覚える、という目的に一番適っているのは4つ目の壁紙かと思うので、
とりあえずこれで覚えることにしました。
とはいえそれぞれ一長一短なので、組み合わせて使うのがよさそうです。
理想を言えばCommand長押しで背景透過の画像が3つ目のpdfのような様式で表示されたらいいなー、
と思いますが、できないもんでしょうか。

# 参考
[【おすすめ】チートシート紹介：簡単に開発を爆速に!](http://qiita.com/KENJU/items/4675834671db902a5f08)
MixpanelでFunnelを作る際にはConversion Windowに注意

Mixpanelの超地味だけど大事な話、Conversion Windowについて。

# Conversion Windowとは

UI的にさりげ無さすぎて分かりづらいんですが、Mixpanelのファネルを作る画面の左下に「30 Days to Convert」というものがあります。これがConversion Windowです。

![unnels_-_Mixpanel__Mobile_Analytics-2016-07-12_23-27-41-cbqva.png](https://qiita-image-store.s3.amazonaws.com/0/7849/84cba500-3233-4641-3331-7106c62d775f.png)

これは**ファネルにおいて最終成果(CV)として計測されるまでのタイムスパン**のことで、デフォルトだと30日間として設定されています。このConversion Windowは以下のように、最小5分から、最大半年まで変更可能です。

![nels_-_Mixpanel__Mobile_Analytics-2016-07-12_23-29-34-ya5s5.png](https://qiita-image-store.s3.amazonaws.com/0/7849/6f8553bb-7079-d152-b21d-31ae935005df.png)

# 注意点

2Stepで構成されるファネルを作ったとして、

- 7/1にStep1のEventが発火し
- 7/30にStep2のEventが発火した

この場合、7/1にCVが発生したと見なされます。（Mixpanelのサポートにも確認済み)
つまり、Conversion Windowが30日の状態で、CVRを日次や週次でグラフにすると、以下のように月末に近づくほど右肩下りになり得ます。

![nnels_-_Mixpanel__Mobile_Analytics-2016-07-12_23-50-16-53945.png](https://qiita-image-store.s3.amazonaws.com/0/7849/ee68150a-acb9-7a56-8fcd-e38513c1db24.png)

わかっていれば当然の話なのですが、ぱっと見、何かしらの変更によって、CVRが悪化しているのではないかと感じてしまいます。これはあくまで設定上の問題です。間違った分析をしないために、サービスやファネルの性質に合わせて適切なConversion Windowを設定するのが地味に大切です。

# 参考

https://mixpanel.com/help/questions/articles/how-are-funnels-calculated
LocalDateTime


Java8の日付のメモ

```
import java.time.*;
import java.time.format.DateTimeFormatter;

public class MyApp {

  public static void main(String[] args) {
    LocalDateTime d = LocalDateTime.now();
    // LocalDateTime d = LocalDateTime.of(2016, 1, 1, 10, 10, 10);
    // LocalDateTime d = LocalDateTime.parse("2016-01-01T10:10:10");

    System.out.println(d.getYear());
    System.out.println(d.getMonth());
    System.out.println(d.getMonth().getValue());

    System.out.println(d.plusMonths(2).minusDays(3));

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy!MM!dd!");
    System.out.println(d.format(dtf));

  }

}
```
Stream


Stream記法のメモ

```java
import java.util.*;

public class MyApp {

  public static void main(String[] args) {
    // Stream
    List<Integer> sales = new ArrayList<>(Arrays.asList(12, 30, 22, 4, 9));
    // for (Integer sale : sales) {
    //   System.out.println(sale);
    // }

    sales
      .stream()
      // 中間処理
      .filter(e -> e % 3 == 0) // ラムダ式 引数 -> 処理
      .map(e -> "(" + e + ")")
      // 終端処理
      .forEach(System.out::println);

  }

}
```
Webpack+React+formsy-reactのビルドでエラー


Webpackで[christianalfoni/formsy\-react:](https://github.com/christianalfoni/formsy-react)を使ったReactアプリケーションのビルド中に次のエラーが発生しました。

```
Property object of JSXMemberExpression expected node to be of a type ["JSXMemberExpression","JSXIdentifier"] but instead got "MemberExpression"
```

formsy-reactのREADME#How to useにある`<Formsy.Form~`のシンタックスが原因だったため、How to Useの次のコードを、

```
import Formsy from 'formsy-react';

  const MyAppForm = React.createClass({
    getInitialState() {
      return {
        canSubmit: false
      }
    },
    enableButton() {
      this.setState({
        canSubmit: true
      });
    },
    disableButton() {
      this.setState({
        canSubmit: false
      });
    },
    submit(model) {
      someDep.saveEmail(model.email);
    },
    render() {
      return (
        <Formsy.Form onValidSubmit={this.submit} onValid={this.enableButton} onInvalid={this.disableButton}>
          <MyOwnInput name="email" validations="isEmail" validationError="This is not a valid email" required/>
          <button type="submit" disabled={!this.state.canSubmit}>Submit</button>
        </Formsy.Form>
      );
    }
  });
```

次のように変更すると解決しました。

```
// Formもインポート
import Formsy, {Form} from 'formsy-react';

  const MyAppForm = React.createClass({
    getInitialState() {
      return {
        canSubmit: false
      }
    },
    enableButton() {
      this.setState({
        canSubmit: true
      });
    },
    disableButton() {
      this.setState({
        canSubmit: false
      });
    },
    submit(model) {
      someDep.saveEmail(model.email);
    },
    render() {
      return (
      	 // Formsy.Form -> Formに変更
        <Form onValidSubmit={this.submit} onValid={this.enableButton} onInvalid={this.disableButton}>
          <MyOwnInput name="email" validations="isEmail" validationError="This is not a valid email" required/>
          <button type="submit" disabled={!this.state.canSubmit}>Submit</button>
        </Form>
      );
    }
  });
```

## 参考

* [⚓ T6662 Unable to use transform\-react\-inline\-elements with JSXMemberExpression](https://phabricator.babeljs.io/T6662)
ピンチの時の稼働管理

ピンチのときの稼働管理
の備忘です。

# 前提

今回のピンチとはこんな時です。

自分ひとりではどうにもならない。
締め切りまで、数日あるが、気合いだけでは無理。
メンバーの勤怠は良い。

そんな時、どうするか？

1.毎日、みんなで終電まで残業する。
2.残業はそこそこにして土日も使う。

1.はよくあるというか、自然とそうなると思いますが、私のオススメは2.です。

# 理由

開発のプロジェクトは、全員いればいいというわけではないので、全員でやるのはそこそこで十分。
同じ稼働時間ならば、稼働日数が多い方が稼働の効率がよい。


ちなみに土日どっちを使うかは、2チームに分けるつもりで、土日どちらを稼働するか？

私は、メンバーに選ばせあげるとモチベーション落ちにくいとおもうので、そうしています。。
Wordフォーマット指定の報告書をMarkdownで書けるようにしたので備忘メモ

私は普段のメモはMarkdown形式で取ることが多いのですが，場合によってはWord等でフォーマットが指定されている場合があるかと思います．
Wordは文書のフォーマット合わせに非常に時間がかかってしまって苦痛だったので，Pandocというツールを使って.mdファイルを.docxファイルに変換することにしました．
変換時にテンプレートのWordファイルを指定することにより，指定のフォーマットにもほぼほぼ合わせることができます．

# 1. 環境構築
## 1-1. Pandocインストーラのダウンロード
Githubから，Pandocの最新の安定版リリースのインストーラをダウンロード．
Macならpkg, Windowsならmsiのインストーラがあります．

https://github.com/jgm/pandoc/releases

## 1-2. Pandocのインストール
ダウンロードしたインストーラを実行，インストール．
環境変数 Path に 「C:\Users\UserName\AppData\Local\Pandoc」（※UserName はユーザ名）が登録されているか確認する．
もしなければ追加してパスを通す．

## 1-3. テンプレートのWordファイルの作成
指定されているフォーマット通りの見た目になるように，Wordテンプレートを作る．形式は普通のdocxでOK．
Pandocが扱えるWordのスタイルは限られているので，そのスタイルを使って目的のフォーマットが実現できるようにテンプレートのWordファイルを作る．
Pandocが扱えるWordのスタイルは，Pandocの[特定のWriterに影響を与えるオプション](http://sky-y.github.io/site-pandoc-jp/users-guide/#options-affecting-specific-writers)の--reference-docxオプションを参照．

出来上がったテンプレートのWordファイルを任意の場所に置く．

# 2. MarkdownファイルをWordに変換
2-1. (Windowsの場合) PowerShellを起動

2-2. Markdownファイルの置いてあるフォルダに移動
> cd ~\somedir

2-3. 次のコマンドで.mdファイルを.docxファイルに変換
> pandoc <変換するMarkdownファイル> -o 返還後のdocxファイル --reference-docx テンプレートのdocxファイル

例）
pandoc '.\高品質アプリの作り方.md' -o 高品質アプリの作り方.docx --reference-docx .\report_template.docx

# 3. 所感その他
今回のWordフォーマット固有の問題なのですが，Pandocが変換可能なWordのスタイルと，指定のWord報告書フォーマットとの相性の問題で，Markdownファイルの方はちょっと変わったフォーマットで書いておかないといけません．
そのMarkdownをそのままQiita等に投稿するフローを狙っていたのですが，現状はいったんフォーマットを直す必要があります．

返還後のWordファイルも数か所程度は手を入れないと見た目がイマイチなのですが，それでも以前より所要時間はずっと少なくなったので，とりあえず大分満足です．

# 4. 参考
・[Pandocの使い方](http://sky-y.github.io/site-pandoc-jp/users-guide/)
・[Pandocが扱えるMarkdown](http://sky-y.github.io/site-pandoc-jp/users-guide/#pandocs-markdown)
rails generate migrationしてエラーが出たときの対処法

結構migration周りでエラーを起こすことが多くその度に調べていたので、メモ代わりに置いていこうかなと思っています。

## Mysqlにログインする
以下のコマンドが基本です。

```
mysql -u ユーザー名 -D データベース名 -p

-u オプションでは MySQL に接続するユーザー名を指定します。
-D オプションでは接続先のデータベース名を指定します。
-p オプションはパスワードを送信する場合に指定します。
```


## Mysql2::Error: Table 'hoges' already exists
既にそのtable名が存在しているのにmigrationをかけようとするとこのエラーが出ます。
「いやでもそんな記憶ないなー」という時は、mysqlにログインしてtableがあるのか確認します。
全てを見たい時は

```
show tables;
```

で指定したtableが見たい時は

```
show columns from hoges;
```

tableが存在しない時はerrorになるので一応存在しているかは確認できますw
もし、既存に存在していた場合は、作成したtable名を変更しましょう。

##  Index name 'index_hoge' on table 'homes' already exists
同じ名前のindex名のものがありますよというエラーです。
tableと同時にindexも貼っていてこのエラーになると結構厄介。

とりあえずmigrationがどこまで進んだのかを確認します。なのでmysqlにログイン。以下コマンドを打ちます

```
mysql> select * from schema_migrations;
```

そうすると

```
20150515072233
20150515072234
20150515102233
```

見たいのが出てきます。

ここでschema_migrationsについて少し触れておきます。

----
schema_migrationsとは
どのマイグレーションスクリプトまで実行済みなのかを記録するためのテーブルです。

で上記の数字の羅列の数字はどこから来たのかというと

```
rails generate migration hoges
```

した時に

```
db/migrate/20150515102233_create_hoges.rb
```

とできると思いますが、この時に付いている数字です。
なので今回で言うと2015/05/15にmigrateして作成されたファイルまで読み込んでますよーということになります。

------

話を戻します。なので、20150515102233以降は読み込まれていないということになります。
僕が作成したのは20160721044829だったので読み込まれていないことがわかります。


次にtableができているのかを以下のコマンドで確認します。

```
show columns from hoges;
```

エラーが出なければ、存在しています。

次にindexが貼られているかを確認します

```
show index from hoges;
```

これで見れます。存在していれば下のように出てきます。
<img width="331" alt="スクリーンショット 2016-07-22 21.31.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/74580/b9db3cfd-fb31-9ff6-d943-8f8417c8dee6.png">

ここでエラーが出た時のカラムを見てindexが貼られているかを確認します。

貼られていなかった時は・・・対処方法は2つ。
① MySQLで書き換える
② 消去して、もう一度行う

① MySQLで書き換える
更新されていないindexをMySQLで直接書き込み、schema_migrationsにファイルをinsertしてあたかも処理したようにするという方法です。

```
ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);
```

テーブル名がhogesのときは以下のようにすとindexを追加できます。

```
ALTER TABLE hoges ADD INDEX index_hoges_on_updated_at(updated_at);
```

そのあとにschema_migrationsをinsertします

```
INSERT INTO schema_migrations (version) VALUES(20160721044829);
```

そして、最後にエラー起こった

```
db/migrate/20160721044829_create_hoges.rb
```

のエラーが出た部分を修正して終了です。


② 消去して、もう一度行う
処理された過程を逆に辿ります。

まず、indexを消去します。

```
ALTER TABLE テーブル名 DROP INDEX インデックス名;
```

というルールなので

```
ALTER TABLE hoges DROP INDEX index_hoges_on_updated_at;
```

でindexを消去します。
そのあとにtableを消去します。

```
drop table hoges;
```

で、最後にmigrationして終了です。
ただこの場合、自分以外のmigrationファイルがある場合、それらも逆の手順を踏まないとエラーになるので①がオススメ。




自分用メモとしては長くなったが、これで今後何が起きてもmigrationにかんしては問題なさそうかな。
RabbitMQ Tutorials(Java)のテキトー翻訳まとめ

# 概要

[RabbitMQ](https://www.rabbitmq.com/)はじめて触ったけどよく分からん、ということで[チュートリアル](https://www.rabbitmq.com/getstarted.html)を読むついでにテキトーに訳すことにした。

# RabbitMQ Tutorialsと自分の翻訳エントリへの対応表

|チュートリアルのパート名|翻訳エントリへのURL|
|:------------|:--------------|
|[1 "Hello World!"](https://www.rabbitmq.com/tutorials/tutorial-one-java.html)|http://kagamihoge.hatenablog.com/entry/2016/07/17/145846|
|[2 Work Queues](https://www.rabbitmq.com/tutorials/tutorial-two-java.html)|http://kagamihoge.hatenablog.com/entry/2016/07/17/150934|
|[3 Publish/Subscribe](https://www.rabbitmq.com/tutorials/tutorial-three-java.html)|http://kagamihoge.hatenablog.com/entry/2016/07/18/230000|
|[4 Routing](https://www.rabbitmq.com/tutorials/tutorial-four-java.html)|http://kagamihoge.hatenablog.com/entry/2016/07/22/212854|
|[5 Topics](https://www.rabbitmq.com/tutorials/tutorial-five-java.html)|http://kagamihoge.hatenablog.com/entry/2016/07/22/212924|
|[6 Remote procedure call (RPC)](https://www.rabbitmq.com/tutorials/tutorial-six-java.html)|http://kagamihoge.hatenablog.com/entry/2016/07/22/212956|
iPhoneアプリ開発初心者の環境構築

iphone アプリを開発することになって、
よくわからないまま開発環境を構築した。までの自分用メモ。

<h1>この記事のターゲット</h1>

新米エンジニアで、環境構築がめんどくさくて、
この記事だけで環境構築を完結させたい方。

<h1>使用機材</h1>

MacBook pro(まあまあ古い)

<h1>インストールしたアプリ</h1>

<h3>IDEとか</h3>
Eclipse (4.5.2)
http://www.eclipse.org/downloads/
→プラグインなどは別途記載予定
→Gradle
→Spring IDE
→Gradle IDE

xcode(7.3.1)
→storeからダウンロード

Atom
https://atom.io/
→これはなんとなくこの機会に入れただけ
<h3>DB周り</h3>
xampp(5.5.19)
https://sourceforge.net/projects/xampp/files/XAMPP%20Mac%20OS%20X/

MySQL Workbench
https://www-jp.mysql.com/products/workbench/

<h3>etc</h3>
Boostnote
→自分メモ用

slack
→チーム内のコミュニケーション

sourcetree
→バージョン管理

alfred
→これめっさ便利

Git

<h1>作ったアカウント</h1>

github

qiita

<h1>次回</h1>

Eclipse のプラグイン周りのインストールとか、
mysqlworkbenchの使い方とか、cssフレームワークの使ってみたシリーズなど。
cdの履歴を保存してpecoとかfzfとか使ってディレクトリ移動する

こんな感じ

![powered_cd.gif](https://qiita-image-store.s3.amazonaws.com/0/78906/766cdac4-18c7-2c5f-bcbc-87529c8bce59.gif)


###何をしているか

+ `auto_cd`でも普通の`cd`でも、ディレクトリ移動時にそのディレクトリのログを溜め込む
+ 引数なしでEnterを押せば、ログをもとに選択的インターフェイスで移動先をサジェスト
+ 普通のcdみたいにも使える

上のgifでは、fzfを使用しています。また、`powered_cd`を`c`にエイリアスしています。
ログについては、同じディレクトリは二つ以上溜めないようになっていて、新しい順からサジェストされるためあまり無駄はないと思います。

###コード
以下を.zshrcとかにコピペしてもらえば動くと思います。


```zsh:.zshrc
function chpwd() {
  powered_cd_add_log
}

function powered_cd_add_log() {
  local i=0
  cat ~/.powered_cd.log | while read line; do
    (( i++ ))
    if [ i = 30 ]; then
      sed -i -e "30,30d" ~/.powered_cd.log
    elif [ "$line" = "$PWD" ]; then
      sed -i -e "${i},${i}d" ~/.powered_cd.log 
    fi
  done
  echo "$PWD" >> ~/.powered_cd.log
}

function powered_cd() {
  if [ $# = 0 ]; then
    cd $(gtac ~/.powered_cd.log | fzf)
  elif [ $# = 1 ]; then
    cd $1
  else
    echo "powered_cd: too many arguments"
  fi
}

_powered_cd() {
  _files -/
}

compdef _powered_cd powered_cd

[ -e ~/.powered_cd.log ] || touch ~/.powered_cd.log

```


`fzf`のところは使っているもの(pecoとかpercolとか)に変えてください。
あと`gtac`ってのは`tac`のGNU版で、OS Xにはデフォルトで`gtac`が入っているので`gtac`にしています。他のOSの方は`tac`にしてください。

あとcとか短いコマンドにエイリアスすると便利です(というか必須)

```zsh:.zshrc
alias c="powered_cd"
```




また,もともとは

+ [ターミナルのディレクトリ移動を高速化する]
(http://qiita.com/b4b4r07/items/2cf90da00a4c2c7b7e60#%E3%82%AE%E3%83%9F%E3%83%83%E3%82%AF)

こちらの記事に着想を得たものです。リンク先の`enhancd`の方がこの記事のものより高機能です。ですが、zshユーザーなら誰でも使っているであろう`auto_cd`にログ追加が反応しなかったり、~~`cd -`を打つのは少し面倒(もちろん`powered_cd`の方が打つのはめんどくさいですがエイリアスでなんとかできる)なので~~ [^*] このコマンドを作りました。


[^*]: enhancdも`alias c="__enhancd::cd -"でコマンドのタイプ数削減は可能です。すみません
【Objective-C】UIAlertControllerを別クラスに分けて使い回す

色んなとこで同じようなアラート出すことが稀によくあるので、AlertControllerを別クラスに分けて使い回す方法を少し調べてみました。
他にもカテゴリを使うなどやり方は色々あるみたいですが、これが一番簡単そうだったのでこのやり方でやってみました。

## ソースコード

```objc:Util.h
@interface Util : NSObject
+ (void)dispOKAlert:(UIViewController*)viewController
   title:(NSString*)titleText
 message:(NSString*)messageText
  actionFunc:(void(^)(UIAlertAction *alertAction))actionFunc;
@end
```


```objc:Util.m
@implementation Util
+ (void)dispOKAlert:(UIViewController*)viewConrtroller
   title:(NSString*)titleText
 message:(NSString*)messageText
  actionFunc:(void(^)(UIAlertAction *alertAction))actionFunc
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:titleText
                                                                             message:messageText
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction * alertAction =
    [UIAlertAction actionWithTitle:@"OK"
                             style:UIAlertActionStyleDefault
                           handler:actionFunc];
    [alertController addAction:alertAction];
    [viewController presentViewController:alertController animated:YES completion:nil];
}
@end
```


```objc:呼び出す方
[Util dispOKAlert:self title:@"Title" message:@"Message"
           actionFunc:^(UIAlertAction *alertAction){ 

/*OKボタンが押された時の処理*/

}];
```
今回はOKボタンだけのシンプルなものですが、
同じ感じでキャンセルボタン追加したり、styleを変えてActionSheetにしたりできます。

## 弁明

まだ始めたばかりで間違っている箇所があるかもしれません。
何か間違っている点があれば編集リクエスト等で指摘していただければ幸いです。

## 参考サイト

[[Objective-C] UIAlertControllerをがんばってメソッドにしてみた: スタジオプリズム㐧3ブログ](http://s-prism3.seesaa.net/article/413172013.html)