OmniAICreator/Qiita-1.07M huggingface dataset:
Edison Breakout BoardでI2C1を有効にする

## どうやって有効にするのか

```
echo 19 > /sys/class/gpio/export  
echo 20 > /sys/class/gpio/export  
echo mode1 > /sys/kernel/debug/gpio_debug/gpio19/current_pinmux  
echo mode1 > /sys/kernel/debug/gpio_debug/gpio20/current_pinmux
echo 910ohms > /sys/kernel/debug/gpio_debug/gpio19/current_pullstrength
echo 910ohms > /sys/kernel/debug/gpio_debug/gpio20/current_pullstrength
```

### なんで910ohms指定？
デフォルトだと内部プルアップ抵抗が20kΩと高めで、これが原因でSCLとSDAの信号がなまるっぽいので。

[Intel® Edison Breakout Board Hardware Guide](http://www.intel.com/content/www/us/en/support/boards-and-kits/000005574.html) にわざわざ、

> Pullup value can be 2, 20, or 50kohm. I2C pins also have an additional 910ohm value.

とI2C用の抵抗を追加してくれているぐらいなので、これが推奨値なんでしょう。たぶん。
npmのDynamic time warpingモジュールを使う

今回はデータの流れから特定のパターンを見つける話です。（勉強中です）

##はじめに

Milkcocoaのトップページでは、オフィスに置いている照度センサーの値を表示しています。

https://mlkcca.com/

当然電気をつけたり消したりすると変化します。（今はリアルタイムでは動いてないみたいです）もともとはTechnical Rockstarsの東京オフィスの玄関に設置して、玄関から人が入るときに電気をつけるだろうという計算でした。なんにしろ何かしらの出来事と連動している可能性があるわけです。

東京オフィスの玄関に設置していたときは、ここからさらにslack通知をしてました。そのときに以下のようなコードを書いていました。

```
if(value - pre_value > 5) {
  //電気がついた
}
```

当然これだとセンサーの種類や場合によって、いちいち書き直さないといけないわけで、いいやり方とは言えないと思うわけです。
今回のようなデータの流れの中でパターンを見つける場合に、どういうやり方があるんだろうと少し検索したところ、[Dynamic time warping](https://en.wikipedia.org/wiki/Dynamic_time_warping)という方法を見つけました。日本語だと動的時間伸縮法です。以下の記事が参考になりました。

http://sinhrks.hatenablog.com/entry/2014/11/14/232603

ある系列が、お手本の系列に対して、どのくらい似ているかを計算できます。さらにグラフをマッチさせるときに、x軸側のスケールを考慮する感じですかね。
実際にDTWを使ってみたくなりました。

##実装

npmで[dtwモジュール](https://www.npmjs.com/package/dtw)を見つけたので、これを使ってみることにしました。

一旦MilkcocoaからHistory APIでデータを落としました。

```
var MilkCocoa = require('milkcocoa');
var milkcocoa = new MilkCocoa('teai9pn46zr.mlkcca.com');
var fs = require('fs');

var data = [];
var history = milkcocoa.dataStore('light').history();
history.sort('desc');
history.size(100);
history.limit(1000);
history.on('data', function(d) {
    data = data.concat(d);
});
history.on('end', function() {
	fs.writeFileSync('./data.json', JSON.stringify(data));
});
history.run();
```

Milkcocoaに保存されていた照度データを、ファイルにJSONで保存しました。
あとはゆっくり解析します。まずざっとデータを見て、電気をつけた感のあるデータの場所を抜き出しました。eventSeqにお手本のデータとして代入しておきます。それを全データと照合して、どれくらい似ているかを算出します。costが少ない方が似ています。costが一定以下のものを抜き出しました。costが一定以下なら、ドアが開いたと判断できます。

```
var DTW = require('dtw');
var fs = require('fs');

var dataStr = fs.readFileSync('./data.json');
var data = JSON.parse(dataStr).reverse().slice(300, 800);
calculate_cost(data.map(function(d) {return d.value.v;}));
var eventSeq = [4, 5, 6, 14, 10];

function calculate_cost(t) {
	for(var i=0;i < t.length - 5;i++) {
		calculate_cost_part(eventSeq, t.slice(i, i + 5), i);
	}
}

function calculate_cost_part(s, t, index) {
	var dtw = new DTW();
	var cost = dtw.compute(s, t);
	var path = dtw.path();
	if(cost < 24) {
		console.log(data[index].timestamp);
	}
}

```


目で確認したかったので、照度データを青い線で折れ線グラフ化し、DTWにより算出したコストが一定以下だった部分に赤い印をつけています。このタイミングで電気をつけているわけですね。まあ、なんとなく合っているような。右側は夜ですね。

<img width="1047" alt="スクリーンショット 2016-01-07 1.10.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/20848/916dde0e-4d4a-a582-9dfd-0b167afc6d0e.png">

##まとめ

実際はこの後でリアルタイムなイベント検知をしなければいけませんね。（今回は省きました。。）この方法だとお手本データを変えると、他の出来事にも応用できます。例えば電気を消したとか。他のデータセットにも、プログラムコードをほとんど変えずに使えます。データ解析は素人なので、変な部分があればコメントお願いします。

参考になりました<(_ _)>

- http://sinhrks.hatenablog.com/entry/2014/11/14/232603
MinGW, MSYS 周りの知識整理: 参考までに cygwin について


Git Bash とか、 Windows 上の unix ライクな環境を触っていると、そのうちいくつも同じような mingw とか bash とか shell とかが入ってきてわけわからなくなってきたので、まとめ。

# MinGW とは

in a nutshell: gcc for Windows.
Windows 用の exe を生成できるコンパイラ。
生成された exe は基本的にそのまま Windows 上で実行できる。

インストールして、実行できるようになるプログラムは gcc とか ld とか。
コンパイラなので、パスを通せばコマンドプロンプトからでも実行できる、はず。

# MSYS とは

unix 風のシェル環境を提供するプログラム群 (make, bash, gawk, grep, etc)

## Windows の native コマンド(.exe) の実行

パスが通っていれば MSYS bash から、普通に

```shell-session
javac HelloWorld.java
```

とかしてやれば実行できる

## パス変換

MSYS において、 bash や make など、内部でパスを引数にとって処理を行うようなプログラムに対しては、 unix 風のパスを Windows 用のパスに変換する処理がかかっている様子。しかもこれは強制。

ソース:

* [Posix Path Conversion](http://www.mingw.org/wiki/Posix_path_conversion)
* [StackOverflow への質問: MSYS make が勝手にパスを変換する問題](http://stackoverflow.com/questions/7250130/how-to-stop-mingw-and-msys-from-mangling-path-names-given-at-the-command-line)

## MinGW(MSYS)

最小限で unix ライクな環境をセットアップできる構成。しかもインストールがいらない(構成を取れる)

## git bash とか

unix 系のプログラムを windows にインストールして、何かしらないけれど bash とかそれっぽい機能がついてたらだいたい MSYS bash。

## MSYS build と MSYS executable

MSYS の実行 bin ディレクトリを見ると、 .exe でない、実行ファイルが散見するけれども、おそらくこいつらが MSYS executable. MSYS の上からでしか実行できないプログラム。普通の人はこれを作成することはない。これを作成することを MSYS build という。

ソース: [MSYS - MinGW の Build for MSYS](http://www.mingw.org/wiki/MSYS)


# cygwin

POSIX 的な環境を Windows 上で再現しようとする。
機能的なコアは、`cygwin1.dll`というシステムコールへのラッパ。
利用者視点で見ると、cygwin shell という exe を起動すると、端末が立ち上がって、その中はほぼ POSIX shell。

cygwin の gcc の結果生成されるプログラムは、実行時にランタイムライブラリ`cygwin1.dll`を読み込み、その dll がホストPCの中でプロセスをまたいで、cygwin の環境を構築するので、その中で実行される。

https://cygwin.com/cygwin-ug-net/highlights.html

## native の実行について

PATH の通った native プログラムは実行できる。その際に、MSYS のように勝手にパスの変換は行わない。(自分で明示的に command substitution でパス変換を記述する必要がある。)

https://cygwin.com/cygwin-ug-net/using-effectively.html

# Cygwin, MSYS でのファイルシステムのマッピング

http://loveruby.net/ja/rhg/cd/win.html
Spark + Cassandraのfilter, where句の使い方メモ

いまだクリアーになっていない点は

- >=, <= でrange filterを効率的にできるかどうか？
- columnがpartition key, clustering keyで挙動が違うがその差異を完全に理解できてない
- さらに、cqlshでの場合と、sparkで処理させた場合の違い、spark上でのpartitionがどうなるかが完全理解できてない。

いまの解は、

- datetime(e.g. 2016010501)をdate, hourで作って、partition keyにする。
- sparkで引くときは、

```
sc.CassandraTable("select * from table datetime = 2016010500")
```
みたいにして、dailyデータは24回クエリーして、unionしてrepartitionしている。

- in, >=, <=でフィルタリングしていが、その場合、全なめして遅くて使えない。


# SparkSQLの場合

全件とってカウント

```
val cc = new CassandraSQLContext(sc)
val df = cc.sql("select * from table")
df.show
df.count
```
しても、

where句でfilterしても

```
val cc = new CassandraSQLContext(sc)
val df = cc.sql("select * from table where datetime >= '2016-01-01 00:00:00' and datetime <= '2016-01-01 23:59:59'")
df.show
df.count
```

もpartitions数は同じになって謎
ここで、datetimeはpartition key

# CassandraTableの場合
- sc.cassandraTable("select * from table datetime in (2016010500, ..., 2016010523)")などとして、rddをとって#partitions=1となって使えない。
- 0 -23で取得して、unionして、repartitionしてするなどして対応




なぞなぞ、勘違いメモ

- partition keyの不等号、range filtertokenを使うが当然、不等号は変な挙動になる。
　tokenはハッシュ値なので当たり前。。。
ubuntu 14.04上でOpenCV 3.1.0の SfMを試してみた その1

![Screenshot from 2016-01-05 21_28_30.png](https://qiita-image-store.s3.amazonaws.com/0/105738/5ecc6f16-4780-a9dc-fdce-7e4d4c08d0f5.png)

#環境
ubuntu 14.04 64bit
OpenCV 3.1.0 + Contrib 3.1.0
で動作を確認
#概要
SfMは、複数の画像から３次元情報を取得するためのモジュールであり、3.1.0から正式にサポートされるようになった。
[モジュールの説明](http://docs.opencv.org/master/db/db8/tutorial_sfm_installation.html#gsc.tab=0)
#ビルド方法
[公式のドキュメント](http://docs.opencv.org/3.1.0/db/db8/tutorial_sfm_installation.html#gsc.tab=0)が準備されているが、その方法だけでは不足する場合がある。
##事前準備
OpenCV3.1.0 + Contrib 3.1.0をビルドする前に以下のパッケージをインストールする。
```
sudo apt-get install libeigen3-dev libgflags-dev libgoogle-glog-dev libatlas-base-dev libsuitesparse-dev libvtk5-dev
```
その後以下のようにCeresのソースをビルドする
```
git clone https://ceres-solver.googlesource.com/ceres-solver
cd ceres-solver
mkdir build && cd build
cmake ..
make -j4
make test
sudo make install
```
###makeテストの結果
```
66/67 Test #66: visibility_based_preconditioner_test ........   Passed    0.00 sec
      Start 67: system_test
67/67 Test #67: system_test .................................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 67
```
これでビルドの準備ができた。 **OpenCV 3.1.0 + Contrib 3.1.0　のビルドは略**

#カメラ軌跡推定のsampleプログラムの実行
チュートリアルは[ここ](http://docs.opencv.org/3.1.0/d5/dab/tutorial_sfm_trajectory_estimation.html#gsc.tab=0)
##サンプルのコンパイル

サンプルファイルは以下を使用
opencv_contrib-3.1.0/modules/sfm/samplesのtrajectory_reconstruccion.cpp
```
g++ -o trajectory_reconstruccion trajectory_reconstruccion.cpp `pkg-config --libs opencv` -I/usr/local/include -I/usr/include/eigen3 -DCERES_FOUND=1
```
##サンプルの実行
terminlで以下を実行
```
./trajectory_reconstruccion desktop_tracks.txt 1914 640 360
```
![Screenshot from 2016-01-07 00:39:50.png](https://qiita-image-store.s3.amazonaws.com/0/105738/3f96a841-6b05-d021-cb07-23b80107863c.png)

というメッセージが表示され冒頭の画像が表示される

#感想
Viz画面上でマウスのドラッグで視点を変更することができるが、思うような構図にできない 

#その他
さくっと動いたようだがそれなりの苦労をした。
経過は[ここ](http://iwaki2009.blogspot.jp/2016/01/ubuntu-1404.html)と[ここ](http://iwaki2009.blogspot.jp/2016/01/ubuntu-1404_7.html)に
RPGツクールでスマホゲーム向けのものを作る方法

こんばんは、初めましての方は初めまして、のんと申します。

RPGツクールMVがブラウザベースでスマホゲームも
ちゃっかり対応しちゃっているってことなので、
実際に制作をしながら、
RPGツクールに足りないもの・スマホのゲーム性について述べていきたいと思います。

また、スタバの女子高校生にウケるスマホゲームの作り方は
あまりにも記事の内容が濃すぎるため、
たぶん、別件で作ります。
っていうより、ネタ探し中。

……さて、まずはRPGツクールの画面から見ていきましょう。

![SC1.png](https://qiita-image-store.s3.amazonaws.com/0/108363/548e9d9f-9009-4942-6d03-9d60d30b8bc1.png)

スマホの操作だと、

 - 移動：行先をタップ
 - 決定：タップ
 - キャンセル：ダブルタップ
 - メニュー開き：ダブルタップ

キャンセルやメニューでダブルタップしなきゃいけないか…
そう、思う方も多いと思います。
実のところ、RPGツクールMV自体はRPGツクールVXAceを基に作られているのです。
なので、こういうUIになっているのです。
（それでも似ていないといわれる）

さて、このままのUIだと問題が起きます。

 - ダブルタップが不便
 - 画面サイズがそもそもスマホと似て似つかぬもの
 - そもそも、スマホ的なUIからかけ離れたものになっている
 - 持ち方考えてるの？これ

などなど、様々な問題が噴出します。

もちろん、これらをなくすためには相当な努力が必要になります。
その努力とは…スマホのUIに親和性を近づけるといったことです。

じゃあ、スマホのUIに適したゲームってなんぞやってことを
確かめるために下調べをしておきました。

そう、トップセールスのランキングです。
<a href = "http://www.gpara.com/rankings/native/ios/66">トップセールスランキング</a>

極端な話、トップセールスということは、
顧客が満足し、課金し、プレイヤーがなっとくできる
UIがそこにあるということです。

ってことで、調べた結果なのですが、
大体抜粋すると、こんな感じです。

 - 基本的にライトユーザーは縦持ちが多い
 - ヘビーユーザーのゲームは横持ちのゲームが多い
 - ライトユーザー（スタバの女子高生とか）がプレイするようなゲームは操作性がわりとシンプル
 - ヘビーユーザーのゲームはそうでもないが、ライトユーザーのゲームはわりと画面の下で操作することが多い。

ってことで、携帯は縦に持つのが基本ということもあり、縦持ちにするべきってことです。
（ヘビーユーザーはコンシューマーやPCゲーマーと兼ねているので普通のゲームと同じUIでもそこまでは問題なさげ？）
極端な話、画面下で操作し、上でステータス画面とかっていう風に
一画面完結型が求められるのです。

さらにダンジョンは簡素化を求められます。
今まで凝っていたマップはただの記号と替わり果てるのです。
いままでスマホゲームの業者ががんばってきた、
目に見えなかった努力がそこに…といった感じです。

さて、制作者の人はこのただの記号とマップだけで
おもしろいと思わせるゲームを作らなければいけません。
それがスマホゲームの宿命ともいえます。

まず、どうすればいいの？っていうのが多いと思いますが、
大体やるべきことはこんな感じ。

 - 解像度をスマホの解像度に変更する。ただし、iPhoneは実解像度の半分にすること（林檎とサファリパークのせい）
 - タッチだけでできるUIにすること
 - 一画面完結型にすること

そもそも、これに関していうならば、
ツクール公式が見てくれ大量の素材集を出している暇があったら、
スマホのサンプルプロジェクトを出すべきであり、
むしろ、そっちのが急務。

お値段のわりにはお得なので、
買うっていう人もいるかもしれないが、
基本的にRPGツクールMV自体はユーザーになげっぱな部分が多いから、
ツクールの中では上級者向け扱いである。
その真逆がRPGツクールVXAceや2000
（ウディタはツクールじゃないので論外）

さて、ってことで、実際つくってみました。
もちろん、ツクラーなので。
<a href = "http://non-non-cha.github.io/COCProj/" >狂気の呼び声</a>

正直いうと、お正月三日使って、制作するのはつらかったです。
ただ、得るものは沢山あったと思います。

次はスタバの女子高生にうけるスマホゲームの作り方か…
情報収集から始めなければ……

その前にスタバの女子高生にうけるゲームならかわいいゲームがいいかな。
後はふわふわしたゲーム。
さて、それは次回にします！

ではでは！アディダス！！



ゲーム本体について（プレイだけなら全く無問題なのでスキップしてもOK)：

素材制作者さん：

Material:

 - シアンのゆりかご　様
  - http://cyanyurikago.web.fc2.com/index.html
 - きまぐれアフター　様
  - http://k-after.at.webry.info/
 - トリアコンタン　様
  - http://triacontane.blogspot.jp/


## 著作・免責
Copyright 2016 のん
Apache License Version 2.0（「本ライセンス」）に基づいてライセンスされます。あなたがこのファイルを使用するためには、本ライセンスに従わなければなりません。本ライセンスのコピーは下記の場所から入手できます。
http://www.apache.org/licenses/LICENSE-2.0

適用される法律または書面での同意によって命じられない限り、本ライセンスに基づいて頒布されるソフトウェアは、明示黙示を問わず、いかなる保証も条件もなしに「現状のまま」頒布されます。本ライセンスでの権利と制限を規定した文言については、
本ライセンスを参照してください。
[Wordpress] 投稿が消えた！「本当に実行していいですか？」という悪魔のメッセージ、とその対策

Wordpressを利用しているあなたは、この画面を見たことがあるだろうか。

![461dbe7e1845f978eca543f0cc152881.png](https://qiita-image-store.s3.amazonaws.com/0/24308/62c73b95-678c-eb33-87a9-b8ff041c9400.png)

だいぶフランクに問いかけて来ているが、
経験のある方だったら、これが悪魔のメッセージであることをご存知だろう。

#どんな時におきるか

ある時、WPで熱心に投稿を書いていた。
それは、１〜２時間ではなく、夜中に途中まで書き、一度パソコンの画面を閉じて、翌日また開き続きを書きだした・・・そうこれは間違いなく超大作だ。

そして、完成に近づいたところで「下書き保存」を押して、一息つこうとしたところに、例のあの画面である。

ん、、、下書き保存をしたいと思っていたので、「もう一度お試しください」を恐る恐る押してみる。

画面がリロードされた後、よくよく投稿を見ると、、、、
**半分の投稿が消えている！**

リビジョンは・・・ない！
戻るボタンで戻っても・・・ない！
どんなに頑張って探しても、戻ってこない。
**(( ；ﾟДﾟ))ﾌﾞﾙﾌﾞﾙ**


（これはフィクションですが、こんな感じの事が起こるんです。）

#何が原因か？
原因はNonce（ノンス）とよばれるCSRF対策が施されているため発生します。

[Wordpress Codex: WordPress Nonce](https://wpdocs.osdn.jp/WordPress_Nonce)

>nonce（ノンス）は、ある種の誤使用や悪意のある操作から URL やフォームを守るための「一度だけ使われる数値」です。WordPress の nonce は実際には数値ではなく、数字と英字で作られたハッシュです。また、本当に一度だけ使われるのではなく、無効になるまでの「有効期間」を持っています。その期間では、同じユーザーの同じコンテキストに対して、同じ nonce が生成されます。つまり、ある操作に対する nonce は、nonce の有効期間が切れるまで同じユーザーについて同じ値を保ちます。

このnonceの有効期限切れが発生することによって、更新できなくなります。またnonceの有効期限切れが発生した時点で、自動保存も効かなくなります。なので、画面を開いたまま長いこと作業をするとこのような事態を引き起こしてしまうのです。

##エラーは出ないの？
出てました。ただ、これはだれも気付きません。

![Pasted image at 2016_01_06 04_46 PM.png](https://qiita-image-store.s3.amazonaws.com/0/24308/fc70b12b-e205-25d7-2e31-4a6f2e739c06.png)

##消えた文章は復旧できないの？
他に保存していなければ、復旧はできなそうでした。


##有効期限はいつ切れるのか？

>デフォルトでは、nonce の有効期間は 1 日です。

→24時間の設定です。

>注意: WordPress の nonce が一度だけ使われる数値ではないという意味で、nonce の有効期間は本当の有効期間とは異なります。WordPress は 2 期（有効期間の半分が 1 期）のシステムを用いて、nonce を前期と後期の両方で検証します。デフォルト設定（有効期間が 24 時間）では、nonce に含まれる時刻データは、いくつの 12 時間区切りを過ぎたかチェックされます。ただし期の区切りは UNIX エポック を起点として計算されます。つまり、昼 12 時〜夜 12 時に作られた nonce は翌日の昼 12 時までの有効期間を持ちます。従って本当の有効期間は一定ではなく 12〜24 時間の間です。

→実際にはデフォルトの場合、12時間〜24時間となるようです。

#どうすればよいのか？

まずWordpressのコミュニティでは、3年も前から最近もアクティブに議論されています。

Avoid losing data after nonces expire
https://core.trac.wordpress.org/ticket/24447

ただ、あまり緊急ではないということなんでしょうか。未だにOpenなチケットのようです。
セキュリティ対策上、止めてしまうのは問題なので、根本的な解決は難しいところです。

##運用的対策

###①ログインしなおす
nonceはユーザーごとに割り当てられた値です。ログアウト・ログインすることでリフレッシュされます。毎回、ログインし直すような習慣がいいかもしれません。

###②下書き保存は押さずに、プレビューを押すようにする。
プレビューを押すと新しいタブが開きますが、その時に上記の画面が出たら、直ちにテキストをコピペして退避させましょう。退避後にリロードし、再度貼りつけ直せば大丈夫でしょう。

##技術的対策

###③自動保存に失敗したらアラートを出す（プラグイン）

一応エンジニアなので、最低限は技術的に解決したいものです。
現在問題なのが、アラートが出ていても全く気付けないことです。
そこで、自動保存が失敗した場合にjsでalertが出るようなプラグインを作って見ました。


Alert-Autosave-Error
https://github.com/nishiyamaosamu/Alert-Autosave-Error

まだgithub上にあるだけですが、これをプラグインディレクトリへ追加し、有効にすることで、もし万一自動保存に失敗しても、すぐに気付き退避可能になり、リスクを軽減できます。


#さいごに
もしもっと良い解決方法をご存知の方がおりましたら、コメントお願いします。
怒りを UML で表現してみた


# 怒ってはならない
　仏教では怒ってはならないと説きます。確かに怒らなければ争いごとは起きそうもありません。

　仏教は論理的なため理系的な記述とも相性が良さそうだなと思っていました。そこで、手始めに「怒り」を UML で表現してみることにしました。
　なお表記などは[アルボムッレ・スマナサーラ長老の「怒らないこと 2」](http://www.amazon.co.jp/%E6%9C%AC-%E6%80%92%E3%82%89%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8-2%E2%80%95%E5%BD%B9%E7%AB%8B%E3%81%A4%E5%88%9D%E6%9C%9F%E4%BB%8F%E6%95%99%E6%B3%95%E8%A9%B1%E3%80%8811%E3%80%89-%E3%82%B5%E3%83%B3%E3%82%AC%E6%96%B0%E6%9B%B8-%E3%82%A2%E3%83%AB%E3%83%9C%E3%83%A0%E3%83%83%E3%83%AC%E3%83%BB%E3%82%B9%E3%83%9E%E3%83%8A%E3%82%B5%E3%83%BC%E3%83%A9/dp/4904507630/)を参考にさせて頂きました。

# 怒りの種類
　怒りは以下の 10 種類に分類されるそうです。

* dosa「基本的な怒り」
* vera「激怒」
* upanaha「怨み」
* makkha「軽視」
* palasa「張り合い」
* issa「嫉妬」
* macchariya「物惜しみ」
* dubbaca「反抗心」
* kukkucca「後悔」
* byapada 「激怒」異常な怒り

　一見、怒りと関係無さそうな「軽視」や「物惜しみ」も、「あいつを認めてなんかやるもんか！」や「こんな美味しいもの他の人にやるもんか！」という怒りの派生とするのが興味深いです。

　そうなると「基本的な怒り」を基本クラスにしたクラス図が描けそうです。「基本的な怒り」も存在するので抽象クラスにはしなくて良さそうです。

# PlantUML で記述する
　シンプルに日本語表記だけにして、dosa「基本的な怒り」は単に「怒り」とし、byapada 「激怒」は vera の「激怒」と被ってしまうので、「異常な怒り」とすることにしました。

 PlantUML で記述すると以下のようになりました。

```
怒り <|-- 激怒
怒り <|-- 怨み
怒り <|-- 軽視
怒り <|-- 張り合い
怒り <|-- 嫉妬
怒り <|-- 物惜しみ
怒り <|-- 反抗心
怒り <|-- 後悔
怒り <|-- 異常な怒り
```

# 結果
　このように怒りが UML で表現できました！
![angry_types.png](https://qiita-image-store.s3.amazonaws.com/0/13938/81e971c3-49ad-7dce-2ddc-f3ebc847fff4.png)
EclipseにCの開発環境を構築した際のつまづきポイント 

#0.はじめに
業務ではJavaを使用しているわけで、なぜCの開発環境を構築したいのかというところですが。
エンジニアとして働くのであれば、C言語はおさえておきたいのと、
Cを使用して、[アルゴリズムとデータ構造](http://www.amazon.co.jp/%E5%AE%9A%E6%9C%AC-C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-SOFTBANK-BOOKS-%E8%BF%91%E8%97%A4/dp/4797304952/ref=pd_bxgy_14_img_3?ie=UTF8&refRID=1S79M6PW0C48118KRVNP "定本 Cプログラマのためのアルゴリズムとデータ構造")の学習がしたかったからです。

#1.構築する環境
・Windows7 64bit
・Eclipse4.4(Luna)

#2.やったこと
C/C++の開発環境のプラグインには、CDTのインストールが必要なので、Eclipseのヘルプ->Eclipseマーケットプレースで
「CDT」を入力してインストールしました。
![CDT.PNG](https://qiita-image-store.s3.amazonaws.com/0/89391/efa9d888-7a8e-9deb-ee79-3d3635b0348d.png)

再起動してインストールが完了すると、新規プロジェクトでCプロジェクトが選択できるようになります。
![C.PNG](https://qiita-image-store.s3.amazonaws.com/0/89391/23fd5416-b4da-cb99-078c-0bca65dbc6ee.png)

今回は、プロジェクト名はsample、ディレクトリはsrc、ファイル名はtestとします。
じゃあ早速書いてみようということで、

```c:test.c
#include <stdio.c>
main() 
{
    printf("Hello World");
}
```
で、ローカルC/C++アプリケーションを実行としたら、、
![C_Erorr.PNG](https://qiita-image-store.s3.amazonaws.com/0/89391/d316aaa4-9eab-7d55-91a4-d5f4a6de5560.png)
エラーになってしまいました。
javaの場合、Eclipseが自動的にコンパイルしてくれるので、自分でコンパイルしなくても実行できたのですね。

ということで、上記のtest.cファイルをコンパイルしないといけません。
今回はコンパイラにMinGWを選択しました。他にはCygwinという選択肢もあります。
MinGW のホームページからインストーラーをダウンロードします。

[http://www.mingw.org/](http://www.mingw.org/)
->mingw-get-setup.exe

実行すると
![C_MinGW.PNG](https://qiita-image-store.s3.amazonaws.com/0/89391/429d98fb-9061-7145-12c3-369695bc49f5.png)
こんな画面が出てくるので、
->mingw32-base
->mingw32-gcc-g++
を選択しインストールします。インストール先はデフォルトのままにしました。

コンパイラにパスを通すために環境変数の設定をします。
今回はデフォルト(C直下)のディレクトリにインストールしたので、
```C:\MinGW\bin```
をPathに追加します。

コマンドラインでgccとたたいて、
```
gcc: fatal error: no input files
compilation terminated.
```
とかって出てれば、コンパイラのインストール完了です。
先ほど起動に失敗したtest.cをコンパイルします。

コマンドラインで
```
gcc test.c
```
と叩きます。すると、src配下にa.exeというファイルが作成されます。
Eclipseで実行すれば、
Hello World
と出てきました。

#3.まとめ
最初は実行に失敗して戸惑いました。いかに今まで便利な環境にあったか分かりました。
Java インターフェースデフォルト実装を継承して呼び出す方法

インターフェースのデフォルト実装が継承した子クラスや子インターフェースから呼び出せることを今日知ったので調べてまとめることにしました。

# 呼び出し方法
結論から言うと、

```java
親インターフェース名.super.メソッド名();
```
で呼び出せます。これ以降でいろんなパターンで試したことを書きます。

# 子クラスから親インターフェースのdefault実装を呼び出す
基礎。
普通にEclipseでdefault実装を持ってる実装クラスを作って「ソース」→「メソッドのオーバーライド実装」で保管されました。

```java:Interface1.java
public interface Interface1 {
	default void test() {
		System.out.println("Interface1");
	}
}
```
```java:ImplA.java
public class ImplA implements Interface1 {
	@Override
	public void test() {
		Interface1.super.test();
	}
}
```
ImplA#testの実行結果は

```
Interface1
```

# 子インターフェースから親インターフェースのdefault実装を呼び出す
子クラスの方法と同じです。

```java:Interface2.java
public interface Interface2 extends Interface1 {
	@Override
	default void test() {
		Interface1.super.test();
	}
}
```

```java:ImplB.java
public class ImplB implements Interface2 {

}
```

ImplB#testの実行結果は

```
Interface1
```

# 子クラスから**複数**親インターフェースのdefault実装を呼び出す
なんでsuperの前にインターフェース名を書かないといけないのかが、
ここでやっと分かりました。

```java:Interface3.java
public interface Interface3 {
	default void test() {
		System.out.println("Interface3");
	}
}
```

```java:ImplC.java
public class ImplC implements Interface1, Interface3 {
	@Override
	public void test() {
		Interface1.super.test();
		Interface3.super.test();
	}
}
```
ImplC#testの実行結果は

```
Interface1
Interface3
```

# 子インターフェースから**複数**親インターフェースのdefault実装を呼び出す

```java
public interface Interface4 extends Interface1, Interface3 {
	@Override
	default void test() {
		Interface1.super.test();
		Interface3.super.test();
	}
}
```

```java
public class ImplD implements Interface4 {
}
```

ImplD#testの実行結果は

```
Interface1
Interface3
```

# ダメなパターン
型階層で2つ以上飛ばして、直接、superインターフェースのdefault実装は呼び出せない。

```java:Interface5.java
public interface Interface5 extends Interface1 {
}
```

```java:Interface6.java
public interface Interface6 extends Interface5 {
	@Override
	default void test() {
		Interface1.super.test();//コンパイルエラー
	}
}
```

下記はOK。

```java:Interface7.java
public interface Interface7 extends Interface5 {
	@Override
	default void test() {
		Interface5.super.test();
	}
}
```
結果Interface1のデフォルト実装が呼び出される。

で、

extendsに入ってたらOKなのか？と思ってやってみたけど、下記もコンパイルエラー

```java
public interface Interface8 extends Interface5, Interface1 {
	@Override
	default void test() {
		Interface1.super.test();//コンパイルエラー
	}
}
```

# おまけ
```java
親インターフェース名.super.メソッド名();
```
この書き方はインターフェースの継承・実装限定の記述っぽい。
普通のクラス継承で使うとコンパイルエラーになる。

```java:Abs.java
public class Abs {
	public void test() {
		System.out.println("Abs1");
	}
}
```

```java:AbsImpl.java
public class AbsImpl extends Abs {
	@Override
	public void test() {
		Abs.super.test();//コンパイルエラー
	}
}
```

# 感想
複数親を呼び出せるのは便利！だけど使いこなせる気がしない。
tvOSでテキストスクロール

#tvOSでテキストスクロール

tvOSのUITextViewでテキストをスクロールしたくてハマったのでメモ。

iOSと違って、そのままではリモコンスワイプではスクロールできない。

いろいろ調べたが、フォーカスが当たるようにして、タッチを認識するようにする必要がある。

結論として一番簡単な方法は、対象のtextViewに対して

```lang:swift
        textView.panGestureRecognizer.allowedTouchTypes = [UITouchType.Indirect.rawValue]
        textView.selectable = true
```

をコントローラのviewDidLoadで設定すればok。
selectableはstoryboardのインスペクタの設定ではうまく有効にならないらしい(- -)。
pythonでswagger-codegenしてImportError: No module namedが出た時の対処法

# 背景
[swagger-codegen](https://github.com/swagger-api/swagger-codegen)は、特定のフォーマットでAPIを定義すると、 
それを叩くためのライブラリをいろんな言語で吐き出してくれるというものです。

RailsのGrapeなんかと相性が良くて、自分もRailsで作ったAPIサーバーを、pythonから叩こうとしたら本題、という感じです。


# 問題点

swagger-codegenのコードを読めばわかるのですが、
ファイルを生成する時に、本来ファイル名が`api_v1_name`とならなければいけないところが、`api::v1::name`のまま生成されてしまい、ファイル名と、importで指定しているpathがうまくかみ合っていません。そのため ImportErrorが出てしまいます。
ちょっとしたミスなのですぐにfixされると思いますが、今すぐ通信できるようにしたいですよね。

# 対処法
というわけで、関数をoverrideして解決してしまいましょう。
overrideについては「[こんなに簡単! Swagger Codegenのカスタマイズ](http://qiita.com/Quramy/items/c583f3213f0b77ff1bac)」がとても参考になりました。

```java:custom-script.groovy
@Grab('io.swagger:swagger-codegen-cli:2.1.4')
import io.swagger.codegen.*;
import io.swagger.codegen.languages.*;

class MyPythonClientGen extends PythonClientCodegen {

  @Override
  public String toModelFilename(String name){
    return toVarName(name)
  }

  // CLIへののkick
  public static main(String[] args) {
    SwaggerCodegen.main(args)
  }

}
```

```sh
groovy custom-script.groovy generate -i http://example.com/api/v1/swagger_doc -l MyPythonClientGen -o ./api/ 

```

これで、
ファイルが`api::v1::name`という名前でなく、`api_v1_name`で生成されるようになりました。面倒くさいという方は、手作業でファイル名を直してもいいかもしれませんね。
VirtualBoxのゲストOSがipv6で待ち受けてる時、ホスト側にポートフォワードする

VirtualBoxの中のゲストOSがこんな感じでipv6で待ち受けている時

```shell-session
$ netstat -na
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 :::2000                 :::*                    LISTEN 
```
VirtualBoxのポートフォワーディング設定でこんな感じにしても、ウンともスンとも言ってくれませんでした。
![ポートフォワーディング設定](https://qiita-image-store.s3.amazonaws.com/0/10108/2111eaa5-8f12-0d06-e07d-ec1ea8bc3099.png)
かといって、Host IP/Guest IPにipv6は入れられない模様。

どうもVirtualBoxのGUIのポートフォワーディングだと、ipv6は通せない模様。
いろいろ調べるとコマンドラインで設定すればなんとかなりそうな感じも見つけたのだけど、いまいち設定法がピンとこなかったので断念。

ゲストOS内でipv4ソケットをipv6ソケットに転送するやり方を試してみました。
使ったのは[socat](http://www.dest-unreach.org/socat/)。
普通にapt-get等でも導入できるようだけど、手元の環境では諸事情あってソースからインストール。

インストールできたら、upstartの設定で

```bash:/etc/init/socat.conf
start on runlevel [2345]
stop on runlevel [!2345]

expect fork
respawn

exec socat TCP4-LISTEN:2001,fork TCP6:[::1]:2000 & 
```

でもって

```shell-session
$ sudo initctl start socat
```

これでゲストOSの、ipv4の2001番への接続ががipv6の2000番に転送されるので、ホストOS側に戻って

![ポートフォワーディング設定](https://qiita-image-store.s3.amazonaws.com/0/10108/ee005a27-d6c3-4acc-17af-26f128d1dd7a.png)

こんな感じにしてやれば、ホストOSの2000番ポート叩けばゲストOSのipv6 2000番ポートに届きます。
シェル芸 Project Euler - Problem 5


## はじめに

@gin_135 さんの「[Project Eulerをシェル芸で解いてみる](http://qiita.com/gin_135/items/c0fde5686f33d947aa6c)」シリーズが大変面白いです.
大抵は @gin_135 さんの Qiita 投稿, @eban さんの別解 on ブログ, @MasWag さんの別解 on Twitter を楽しく読ませていただき, 読んだだけで分からないものは, 手元で再現などして楽しんでいますが, 方針として大きく異なる別解を思いついたものについて, 自分のエントリを立てようと思います.

「Project Euler」の解説, 問題文の引用などは省略します.

本エントリは Problem 5 ([問題原文](https://projecteuler.net/problem=5), [問題文日本語訳](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%205)) の解答です.

環境は

```sh:
$ /bin/sh --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.
```

です.

## 方針

本題は, 数列に対する「二引数の最小公倍数演算」の「畳み込み」です.
(畳み込みって何? という方は「[左畳み込み in シェル](http://qiita.com/kohyama/items/2796960ebbd842227821)」をご覧ください)

最小公倍数スクリプトと左畳み込みスクリプトを用意して連結します.

## 最小公倍数

```sh:lcm
#!/bin/sh

ab=`expr $1 \* $2`
while [ 0 -lt $1 ]
do
  t=`expr $2 % $1`
  set $t $1
done
echo `expr $ab / $2`
```

を `lcm` としてカレントディレクトリに保存し, 実行パーミションを与えます.

`while ... done` の部分でユークリッドの互除法で最大公約数を計算し, `expr $ab / $2` で最小公倍数を出力しています.
繰り返し中に明示的に名前を与えた二つの変数を使ってもよいのですが, `set` を使って `$1` と `$2` を使い回しています.
そのため, 後で使う `$1` と `$2` の積を最初に変数 `ab` に代入しています.

実行例です.

```sh:
$ ./lcm 12 18
36
$ ./lcm 18 27
54
```

## 左畳み込み

```sh:reduce
#!/bin/sh

f=$1
i=$2
if [ "X$i" = "X" ]
then
  read i
fi
while read line
do
  set "$i" "$line"
  i=`eval $f`
done
echo $i
```

を `reduce` として保存し, PATH に含まれるディレクトリに保存 (または保存したディレクトリを PATH に追加), 実行パーミションを与えてあるとします.

解説は「[左畳み込み in シェル](http://qiita.com/kohyama/items/2796960ebbd842227821)」にあります.

## 例題解答

1 から 10 までの整数で割り切れる最小の正の整数は 2520 です.

```sh:
% seq 10 | reduce './lcm $1 $2'
2520
```

## 本題解答

本題, 1 から 20 までの整数で割り切れる最小の正の整数は, 例題同様

```sh:
% seq 20 | reduce './lcm $1 $2'
```

のようにします.

1 から 10 までの整数は 11 から 20 までの整数の約数ですので,

```sh:
% seq 11 20 | reduce './lcm $1 $2'
```

としても同じ結果が得られます.

## 参考

@gin_135 さんの解答「[Project Eulerをシェル芸で解いてみる(Problem 5)](http://qiita.com/gin_135/items/f633fa0e0897878fcd10)」
@MasWag さんの解答[ツイート](https://twitter.com/MasWag/status/685309270330494977?ref_src=twsrc%5Etfw)
@eban さんの解答「[Project Euler Problem 5 #シェル芸 - jarp](http://jarp.does.notwork.org/diary/201601a.html#201601081)」
@eban さんの解答[ツイート](https://twitter.com/eban/status/685636289253646336?ref_src=twsrc%5Etfw) (抽象的な意味では私とまったく同じ方針)
underscoreコードリーディング（debounce）



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



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


##debounceとは


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

こんな説明。
>####_.debounce(function, wait, [immediate]) 
>Creates and returns a new debounced version of the passed function which will postpone its execution until after wait milliseconds have elapsed since the last time it was invoked.
>Useful for implementing behavior that should only happen after the input has stopped arriving. 
>For example: rendering a preview of a Markdown comment, recalculating a layout after the window has stopped being resized, and so on.

>Pass true for the immediate argument to cause debounce to trigger the function on the leading instead of the trailing edge of the wait interval. 
>Useful in circumstances like preventing accidental double-clicks on a "submit" button from firing a second time.

```javascript
var lazyLayout = _.debounce(calculateLayout, 300);
$(window).resize(lazyLayout);
```
------------- 
生成やnewで返される時に、渡した関数の実行を、最後に実行されてからwaitミリセカンド経過させたあとに実行するように延期します。
入力したものが到着した後にのみ実行すべき動作を実装するのに便利です。
例えば：markdownコメントのプレビューをレンダリングする、リサイズのイベントが実行し終えたあとに再度レイアウトを計算し直す、など

immeddiateにtrueを渡すことによって、waitインターバルの終わったあとに実行することなく、debounceをトリガーにそのまま関数を実行できます。
突然submitボタンをダブルクリックなどを偶発的に押されてしまうような状況に役に立ちます。


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

```javascript
  // Returns a function, that, as long as it continues to be invoked, will not
  // be triggered. The function will be called after it stops being called for
  // N milliseconds. If `immediate` is passed, trigger the function on the
  // leading edge, instead of the trailing.
  _.debounce = function(func, wait, immediate) {
    var timeout, args, context, timestamp, result;

    var later = function() {
      var last = _.now() - timestamp;

      if (last < wait && last >= 0) {
        timeout = setTimeout(later, wait - last);
      } else {
        timeout = null;
        if (!immediate) {
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        }
      }
    };

    return function() {
      context = this;
      args = arguments;
      timestamp = _.now();
      var callNow = immediate && !timeout;
      if (!timeout) timeout = setTimeout(later, wait);
      if (callNow) {
        result = func.apply(context, args);
        context = args = null;
      }

      return result;
    };
  };

```
func,late,immediateを引数に取る。
timeout, args, context, timestamp, resultを宣言する。
laterの関数を定義する。中身は以下。
lastに現在時刻からtimestmpを引いたミリ秒を代入する。
lastがwait以下かつlastが0以上だった場合、setTimeoutでwait-last秒まつ、
それ以外の場合、timeoutにnullを代入し、immediateがfalseの場合、resultにfunc.applyの結果を格納して返す、timeoutが存在しなかったら、contextとargsをnullにする
--ここまでlater関数
debouceは以下の関数を返す。
contextにthisを代入し、argumentsをargsに代入する。また、timestampに現在時刻を代入する。
callNowにimmediateが存在しかつタイムアウトが存在しない場合はtrueをいれ、違う場合はfalseを入れる。
timeoutが存在しない場合は、timeoutにsetTimeout(later,wait)で設定し、waitミリ秒後にlaterを実行する、
callNowが存在する場合は、resultにfunc.applyした結果を格納し、contextとargsをnullにする。
resultを返す。
ユーザの注意を惹くためのコーチマークっぽいUIを作ってみました

前作に引き続き、「こんなのできないの？」と聞かれることがあるので、作ってみました。

Github - [yukiasai/Minamo](https://github.com/yukiasai/Minamo)

![Demo](https://cloud.githubusercontent.com/assets/6880730/12576111/bf03362a-c454-11e5-95af-4a1670935f9e.gif)


### ちなみに前作はこちら
[チュートリアルなどで使えるスポットライトっぽいUIを作ってみました](http://qiita.com/yukiasai/items/15666ce06f5436cf8e40)
[yukiasai/Gecco](https://github.com/yukiasai/Gecco)

## インストール

Cocoapodsでインストールして下さい

```
pod 'Minamo'
```

## 使い方

対象のViewにコーチマークを出すコードです。

``` swift
import Minamo

class ViewController: UIViewController {
  func showRippleView() {
    let rippeleView = RippleView()
    rippeleView.tintColor = UIColor(red: 0.3, green: 0.7, blue: 1, alpha: 1)
    rippeleView.coreImage = UIImage(named: "q")
    rippeleView.appearAtView(someView)
  }
}
```

動画のように、UIBarButtonItem上に出すことも出来ます。

``` swift
if let buttonItem = navigationItem.rightBarButtonItems?.first {
    rippeleView.appearAtBarButtonItem(buttonItem, offset: CGPointMake(-10, 10))
}
```

動画の実装は [MinamoExample](https://github.com/yukiasai/Minamo/tree/master/MinamoExample) に記載されています。

## RippleViewのプロパティ

以下の形状をサポートしています。

* duration
    * リングが広がりきるまでの時間
* coreImage
    * 真ん中に表示される画像
* coreHidden
    * 真ん中のビューを非表示にする
* ringScale
    * リングの広がり具合
* ringWidth
    * リングの太さ
* ringHidden
    * リングのビューを非表示にする

## 最後に

是非使ってみてください！
DirectX9でガンマ補正を扱う方法

DirextX11でガンマ補正を扱う方法は沢山資料がありますが、
DirectX9でガンマ補正を扱う方法は資料がありませんでした。

普通使うことはないですが、今回使用する機会があったので実装方法を説明します。

* ガンマ補正済みのテクスチャから逆ガンマ補正をして画素を読みだす方法

```
(device)->SetSamplerState(0, D3DSAMP_SRGBTEXTURE, TRUE);
```

サンプラーステートのD3DSAMP_SRGBTEXTUREにTRUEを指定するだけです。
ただ、ハードウェアとテクスチャのフォーマットが逆ガンマ補正に対応している必要があります。

* ガンマ補正をして画面に表示する方法

```
IDirect3DSwapChain9* swapChain = nullptr;
(device)->GetSwapChain(0, &swapChain);
swapChain->Present(nullptr, nullptr, nullptr, nullptr, D3DPRESENT_LINEAR_CONTENT);
SAFE_RELEASE(swapChain);
```

swapChainをデバイスから取得して、Presentするときにフラグを指定します。
これもハードウェアが対応している必要があります。

* まとめ

DirectX9でも簡単にガンマ補正を扱えました。
方法自体は簡単ですが、DirectX9世代でガンマ補正を扱うメリットが殆どないので
資料がほとんどなかったです。
GithubじゃなくてBitbucketを使う

# 前提
一人で開発。

# 使う理由
公開したくない。金を払いたくない。

# 使い方

1. アカウント登録
    * `https://bitbucket.org/`
1. リポジトリ名登録
1. 鍵登録
    * `cd ~/.ssh`
    * `ssh-keygen`
    * id_rsa.pub をデプロイ鍵に登録
1. リポジトリ登録後に表示されるコマンドでリモートリポジトリ設定
    * `git remote add origin https://[ユーザ名]@bitbucket.org/[ユーザ名]/[リポジトリ名].git`
Producing loop with precise timer in Unity


This post is translation version of [[Unity] 厳密なタイマーに基づき周期的に処理を実行する](http://qiita.com/Nagitch/items/2e3a84eaca5d1b32b5f1).


## Introduction

Using ***Time.deltaTime*** in ***Update()*** is general implementation for producing the loop function.
But it's not always real precise, because ***Update()*** execute timing is depends on frame per second.
(I'm stacked with this problem at implementing BPM synchronization system. ;_;)

This post show up how to avoid this problem.
There are 2 methods I found:

- **Trick with WaitForSeconds**
- **Using FixedUpdate**



## Trick with WaitForSeconds

***StartCoroutine()*** with ***WaitForSeconds()*** is alternative for ***Time.deltaTime***.
In common use, take seconds value to ***WaitForSeconds()***. but you can use **1[ms]** alternatively.
it makes faked fast infinitly loop. and then, watch the elapsed time with ***Time.time***.

Don't use ***Time.deltaTime*** for avoid fps depending.

```csharp
IEnumerator FuncCoroutine() {
    while(true){
        if (Time.time > this.elapsed) {
            // Do something

            this.elapsed = Time.time  + timeOut;
        }

        yield return new WaitForSeconds((float)1/1000);
    }
}
```

this method works as better as **"Using FixedUpdate"**.


## Using FixedUpdate

Copy and paste ***Time.deltaTime*** code to ***FixedUpdate()***.
but heavy ***FixedUpdate()*** is taking bad effect for collision.
raspberry pi2用LINUXディストリビューション情報をまとめたい


| リリース日 | 名前 | Kernel ver |URL|default id/pw
|:----------|:-----|:----------:|:-:|:-----------|
|2016-03-18|RASPBIAN JESSIE|4.1|[raspberrypi.org][1]|
|2015-12-11|CentOS 7||[centos.org][3]|
|2015-11-21|RASPBIAN JESSIE|4.1|[raspberrypi.org][1]|pi/raspberry
|2015-05-05|RASPBIAN WHEEZY|3.18|[raspberrypi.org][1]|
|2015-02-03| Debian Jessie ||[debian.org][2]

[1]:https://www.raspberrypi.org/downloads/raspbian/
[2]:https://wiki.debian.org/RaspberryPi
[3]:http://mirror.centos.org/altarch/7/isos/armhfp/
[4]:http://pidora.ca/
[5]:https://sourceforge.net/projects/openmediavault/files/Raspberry%20Pi%20images/

以下はraspberry pi2に対応していない様子。

| リリース日 | 名前 | Kernel ver |URL 
|:----------|:-----|:----------:|:-:|
|2014-7-24|Pidora 2014|3.12.23|[pidora.ca][4]


専用OSイメージ

| リリース日 | 名前 | Kernel ver |用途|URL 
|:----------|:-----|:----------:|:-----------|:-:|
|2016-3-17|OpenMediaVault|4.1.19|ファイルサーバ|[image][5]
Railsをはじめて最初にやるようなことの自分メモ


# time_zone
```application.rb
config.time_zone = 'Tokyo'
```

# 日本語の設定

```application.rb
config.i18n.default_locale = :ja
```

```
curl -o config/locales/ja.yml -L https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml
```


# Bootstrapを使う

```Gemfile
gem 'less-rails'
gem 'twitter-bootstrap-rails'

```

```
bundle update && bundle install
rails g bootstrap:install
```


# Scaffoldとrootの設定

```
bin/rails g scaffold event name:string content:text
bin/rake db:migrate RAILS_ENV=development
```

```routes.rb
root :to => 'events#index'
```
IE10のel.classList.addは第二引数以降を受け取れない

## 仕様上の挙動

```js
document.body.classList.add('foo', 'bar');  // -> <body class="foo bar" />
```


## IE10の挙動

第二引数以降が無視される。

```js
document.body.classList.add('foo', 'bar');  // -> <body class="foo" />
```


## 参考

- https://developer.mozilla.org/ja/docs/Web/API/Element/classList
- https://dom.spec.whatwg.org/#dom-domtokenlist-add
ビットコインの扱い方

# 目次

このページは索引のみです
空き項目はそのうち埋めていきます

## はじめに

このページではjavascriptによるプログラムでビットコインを操作することを目的に作成されています
bitcore-libをベースに説明しています

## 前提知識
* 覚えておきたい単語集

## インフラ構築

* [node.jsのインストール](http://qiita.com/you21979@github/items/4c9c382b9536effc590d)
* [ブロックエクスプローラ（insight）の構築](http://qiita.com/you21979@github/items/a0886460be33f31134b0)

## 受け取り

* [通貨単位の扱い](http://qiita.com/you21979@github/items/0e539c3f21c1378795eb)
* [ビットコインアドレスの生成](http://qiita.com/you21979@github/items/5d3bd71ae2107d03973a)
* [ブロックチェーンへのアクセス・残高取得](http://qiita.com/you21979@github/items/6ccbcf2140a9058b1476)
* [ブロックチェーンから入金確認](http://qiita.com/you21979@github/items/3e9112bd4da56923a064)
* [ビットコイン周りの取り扱いで気を付けること](http://qiita.com/you21979@github/items/f51bbe876453865a8132)

## 送金

* [トランザクションの作成](http://qiita.com/you21979@github/items/1da440ded4a37abad2a9)
* [送金手数料](http://qiita.com/you21979@github/items/27bece4ea5b5dcf1a07e)

## ウォレット

* [ホットとコールドとは？](http://qiita.com/you21979@github/items/3770dadd829df8fc8078)
* 秘密鍵の取り扱い
* [ニーモニックの仕組み](http://qiita.com/you21979@github/items/20391033f74cfa0a16d1)
* [hdwalletの仕組み](http://qiita.com/you21979@github/items/cd929ac8ffa9f3691750)
* おつりの仕組み
* [マルチシグの仕組み](http://qiita.com/you21979@github/items/795236fde38d510bbdd1)
* [ビットコインウォレットの開発方法はどれがいいか](http://qiita.com/you21979@github/items/41364a2971ddc798b6df)
Ethereum Geth コンソールコマンド一覧

Gethのコンソールで用いる主要なコマンド一覧です。開発の際にご参照ください。

##Account
- Accountリスト表示

```
eth.accounts
```
- Account作成

```
personal.newAccount(password)
```

- Accountのロック解除

```
personal.unlockAccount(address, password)
```

- 残高確認(単位：wei)

```
eth.getBalance(account)
```
- 残高確認(単位：ether)

```
web3.fromWei(eth.getBalance(account),"ether")
```


##Coinbase
- coinbase表示

```
eth.coinbase
```

- coinbase設定

```
miner.setEtherbase(account)
```
##Mining
- Mining開始

```
miner.start()
```
- Mining停止

```
miner.stop()
```

- Mining状況確認

```
eth.blockNumber
```
- Miningハッシュレート確認

```
miner.hashrate
```

##Block
- Block確認

```
eth.getBlock(BlockNumber)
```
##トランザクション
- 送金

```
eth.sendTransaction({from: from_account, to: to_account, value: web3.toWei(amount_of_ether, "ether")})
```
- トランザクション情報表示

```
eth.getTransaction(transaction_address)
```

###参考記事
[Ethereum入門](http://book.ethereum-jp.net/content/index.html)
【Ruby・Rails】三項演算子(条件演算子）を使ってif文をスリムに書こう！

if文を使っていてなーんかモサッとしている..と思ったことはありませんか？

```rb
  def add_button_name
    if controller.action_name == 'show'
      "コメントを投稿する"
    else
      "コメントを更新する"
    end
  end
```

※なーんかモサッとしているif文

こんなモサッとしているif文は、三項演算子(条件演算子）を使ってスリムに書いてみましょう！

## 三項演算子(条件演算子）とは

三項演算子(条件演算子）を使用することによって

```rb
if 条件
　式１
else
　式２
end
```

このようなif文を

```rb
条件 ? 式１ : 式２
```

のように、書き換えることができます。

### 先ほどの例を書き換えてみる


【モデルケース】
・通常時

```rb
  def add_button_name
    if controller.action_name == 'show'
      "コメントを投稿する"
    else
      "コメントを更新する"
    end
  end
```

** 三項演算子(条件演算子）**

```rb
def add_button_name
  controller.action_name == 'show' ? "コメントを投稿する" : "コメントを更新する"
end
```

スリムに書けましたね！

## 注意点
三項演算子(条件演算子）を使用した書き方は、複雑なif文を書き換えるのには、向いていません。素直にif文を使用しましょう。

## controller.action_nameについてはこちら

http://qiita.com/lasershow/items/e7a75d3e1653c9ca39d8
std.string

D言語のstringモジュールについて[公式サイト](http://dlang.org/phobos/std_string.html)をみてあんましっくりこなかった部分を逐一まとめます.

#文字列検索

```d
import std.stdio, std.string;

void main()
{
    string c = "abcdefghijklabcdefghijkl";
    //indexOf : 最初の出現位置を返す
    assert(c.indexOf("cd") == 2);
    assert(c.indexOf("Cd") == -1);
    //n文字以降の文字列を探索
    assert(c.indexOf("abc",5) == 12);
    //大文字小文字を区別するときはCaseSensitiveを使います
    assert(c.indexOf("Cd",CaseSensitive.yes) == -1);
    assert(c.indexOf("Cd",CaseSensitive.no) == 2);

    //lastIndexOf : 最後の出現位置を返す
    assert(c.lastIndexOf("cd") == 14);

    //"edc"のうちどれかがあった最初位置を返す
    assert(c.indexOfAny("edc") == 2);
    assert(c.indexOfAny("edc",10) == 14);
    //"edc"のうち一番最後にあった文字の位置を返すassert(c.lastIndexOfAny("edc") == 16); 

    //探している文字列以降の文字列を返す
    //algorithm.searchingが必要
    import std.algorithm.searching;
    assert(c.find("def") == "defghijklabcdefghijkl");

    //見つかったらtrueを返す
    assert(c.canFind("def") == true);


    //文字カウント
    //'a', 'b'または'c'がある数を数える
    assert(c.countchars("abc") == 6);
    //"abc"がある数を数える
    assert(c.count("abc") == 2);

}
```

#文字の書き換え
```d
import std.stdio, std.string;
import std.array : appender;

//ネットで拾った
//同じ文字列を削除する
// Must keep the original order of the items.
// Slow implementation that shows the semantics.
T[] noDupes(T)(in T[] s) {
      import std.algorithm: canFind;
      T[] result;
      foreach (T c; s)
          if (!result.canFind(c))
              result ~= c;
      return result;
}

void main()
{
    string c = "abcdefghijklabcdefghijkl";

    //'a','d'または'c'を削除
    assert(c.removechars("adc") == "befghijklbefghijkl");


    //文字列の入れ替え
    string buf;
    auto transTable1 = makeTransTable("eo5", "57q");
    buf = translate("hello world", transTable1);
    assert(buf == "h5ll7 w7rld");

    buf = translate("hello world", transTable1, "low");
    assert(buf == "h5 rd");

    assert("AAAA".noDupes == "A");
    assert("AAAA".squeeze == "A");
    assert("ABAC".noDupes == "ABC");
    assert("ABAC".squeeze == "ABAC");

   //他モジュールが必要な処理
   import std.algorithm.searchiing;
   //文字を区切る
   auto a = "Carl Sagan Memorial     Station";
   auto r = findSplit(a, "Velikovsky");
   assert(r[0] == a);
   assert(r[1].empty);
   assert(r[2].empty);
   r = findSplit(a, " ");
   assert(r[0] == "Carl");
   assert(r[1] == " ");
   assert(r[2] == "Sagan Memorial Station");
   auto r1 = findSplitBefore(a, "Sagan");
   assert(r1[0] == "Carl ", r1[0]);
   assert(r1[1] == "Sagan Memorial Station");
   auto r2 = findSplitAfter(a, "Sagan");
   assert(r2[0] == "Carl Sagan");
   assert(r2[1] == " Memorial Station");
}
```

参考:
[noDupesのフォーラム](http://forum.dlang.org/post/wisybtkdxfitbwsbkttk@forum.dlang.org)
#他の機能
英語の[公式サイト](http://dlang.org/phobos/std_string.html)がリニューアルしたみたいでわかりやすくなっています. こちらを参考にすると良いでしょう
RxJavaでEventBusを作った

# 経緯

以前イベントバスとして[Otto](https://github.com/square/otto)を使用していたが、RxJavaを使ったほうがよい実装ができるので、Deprecatedとなったようだ。

以前、KotlinでRxを使ったイベントバスを作成していたので、Java化してライブラリとして公開してみることにした。


# RxEventBus

https://github.com/kubode/RxEventBus

簡単な使用方法はREADMEを参照。


# 特徴

* イベントクラスは`Event`クラスを継承する必要がある。
* ハンドラ登録は`RxEventBus#subscribe()`で行う。
  * `RxEventBus#subscribe()`の戻り値である`Subscription`に対して`unsubscribe()`することで、ハンドリングをやめる。
  * 第3パラメーターに`Scheduler`を渡すことで、第2パラメーターのラムダの実行スレッドを変更できる。
* イベント送信は`RxEventBus#post()`で行う。
  * イベントが一度もハンドリングされなかった場合、第2パラメーターのラムダが呼ばれる。
  * ハンドラに`Scheduler`が指定されていた場合、ハンドラのラムダが実行されたかどうかは保証できない。
    * post時点でハンドラがあるかどうかしか判断できないため。


# Usage

DaggerなどDIを使っている想定で記述する。

MainActivityでイベントを拾い、MainFragmentがイベントを投げる構成。


## Android(Kotlin)での例

```kotlin
// イベントを定義
class MyEvent {
    val answer = 42
}

// イベントを拾うActivity
class MainActivity : Activity() {
    @Inject lateinit var bus: RxEventBus
    private lateinit var subscription: Subscription

    override fun onStart() {
        super.onStart()
        subscription = bus.subscribe(MyEvent.class, { Log.v(TAG, "${it.answer}") })
    }

    override fun onStop() {
        subscription.unsubscribe()
        super.onStop()
    }
}

// イベントを投げるFragment
class MainFragment : Fragment() {
    @Inject lateinit var bus: RxEventBus

    private fun postMyEvent() {
        // MainActivityによって拾われ、42がログ出力される
        bus.post(MyEvent())
    }

    private fun postOtherEvent() {
        // 拾われることがなく、Event is not handled.がログ出力される
        bus.post(OtherEvent(), { Log.v(TAG, "Event is not handled.") })
    }
}
```


# 追記

バージョンアップにより、`Event`クラスの継承が不要になりました。


# 参考記事

* [OttoからRxJavaへの移行ガイド](http://qiita.com/yyaammaa/items/57d8baa1e80346e67e47)
オーバーフィッティングと正則化

本記事では、[こちらのサイト](https://www.coursera.org/learn/machine-learning/home/week/3) を参考にオーバーフィッティング（Overfitting）と、それを克服する正則化（Regularization）について解説します。
#オーバーフィッティングと正則化
##オーバーフィッティングとは

一般的にトレーニングセットにはノイズが含まれます。学習時にノイズの影響を受けることで、トレーニングセットには適合できるが、未知データには適合できなくなることを**オーバーフィッティング**・**過適合**といいます。（トレーニングセットにも適合しないことをアンダーフィッティング・高バイアスと言います。）

![overfitting.png](https://qiita-image-store.s3.amazonaws.com/0/88740/4838ae44-76a4-adc3-e940-fd4729da9f64.png)


**対策の例**

- 出力に有効でない変数を減らす。（例えば、他の変数の関数になっているもの）
- **正則化** 
 
##正則化

正則化とは、コスト関数に罰則を加えた新しいコスト関数を用いることで、モデルの複雑さを緩和しようとするための手法です。決めるべきパラメータが $\theta = \left(\theta_0, \theta_1, \ldots , \theta_n \right)^T$ であるモデルの従来のコスト関数を $\tilde{\mathrm{Cost}}(\theta)$ とします。例えば、確率変数の大きさという複雑さを緩和する方法が次の正則化[^2]です。

```math
\mathrm{Cost}(\theta) = \tilde{\mathrm{Cost}}(\theta)+ \lambda \sum_{i=1}^{n}\theta_i^2
```

ここで、 $\lambda (> 0)$ は正則化パラメータと呼ばれます。[^3]　正則化した後は左辺の $\mathrm{Cost}(\theta)$ を最小化する $\theta$ を求めることになります。

[^2]: この正則化は $L_2$ 正則化、リッジ(Ridge)正則化などと呼ばれます。
[^3]: 正則化パラメータが大きすぎると、$\theta_i \approx 0 \ (i\neq 0)$ となり、アンダーフィッティングを生じます。

##正規方程式

トレーニングセット $(x_i, y_i),\  1 \leq i \leq m$ と $\tilde{x_i} := (1, x_i)^T$ に対して、線形回帰の二乗誤差の正則化問題

```math
\mathrm{Cost}(\theta) = \frac{1}{2m}\sum_{i=1}^m \left( \theta \cdot \tilde{x_i} - y_i \right)^2 + \frac{\lambda}{2m} \sum_{i=1}^{n}\theta_i^2
```

は[^5]

```math
X = 
\left(
\begin{array}{c}
(\tilde{x_0})^T\\
(\tilde{x_1})^T\\
\vdots \\
(\tilde{x_n})^T
\end{array}
\right)
```

とおくと、解析的に

```math
\theta = \left( X^TX + \lambda
\left(
\begin{array}{cccc}
0&0&\cdots&0\\
0&1&\cdots&0\\
\vdots & \vdots&\ddots & \vdots\\
0 & 0& \cdots&1
\end{array}
\right)
\right)^{-1}X^T y
```

という解を得ます。これ[^4]を正規方程式(Normal equation)といいます。ただし、 $\lambda = 0$ のときは右辺の $X^TX$ に逆行列の存在が保障されていないことに注意してください。[^6]




[^4]: 正確には右辺にある行列 $\left( X^TX + \lambda(行列)\right)$ をこの式の両辺にかけたものが正規方程式と呼ばれます。
[^5]: 正則化の定義に比べて正則パラメータに $1/2m$ がかかっていますが、 $\lambda$ は任意の正数なので本質的に違いはありません。
[^6]: $X^TX$ に逆行列を持たせる操作が正則化の語源になっています。
OS X El Capitan で awscli の pip install に失敗する

OS X El Capitan で ```pip install awscli``` すると

```
Installing collected packages: six, python-dateutil, docutils, botocore, pyasn1, rsa, colorama, awscli
  Found existing installation: six 1.4.1
    DEPRECATION: Uninstalling a distutils installed project (six) has been deprecated and will be removed in a future version. This is due to the fact that uninstalling a distutils project will only partially uninstall the project.
    Uninstalling six-1.4.1:
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip/basecommand.py", line 211, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip/commands/install.py", line 311, in run
    root=options.root_path,
  File "/Library/Python/2.7/site-packages/pip/req/req_set.py", line 640, in install
    requirement.uninstall(auto_confirm=True)
  File "/Library/Python/2.7/site-packages/pip/req/req_install.py", line 716, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip/req/req_uninstall.py", line 125, in remove
    renames(path, new_path)
```

こんな感じのsixパッケージについてのエラーになります。

（あまりよくわかっていないが）とりあえず ```--ignore-installed six``` してあげるとインストールはできる。

```
$ pip install awscli --ignore-installed six
```

今のところ大丈夫そう。

参考) https://github.com/pypa/pip/issues/3165
foobar2000 wsh-panel-mod 基礎


##描画用関数
WSH Panel Modは描画開始の関数が固定されている。
この関数以外からでは、描画ができないので注意。

```js:function.js
on_paint(gr){
  //ここに記述
}
```
※`on_paint`の引数は`gr`のみであることが望ましいらしい。
根拠は[ここ](https://hydrogenaud.io/index.php/topic,70363.0.html)のNotes and Hintsの4番目

##Event

####再生関係

```js
function on_playback_seek() {}//seekした時
function on_playback_time() {}//再生中に定期的に呼び出される。
//呼び出される時間は大体0.8~1.1秒の間隔　
//しかし、曲再生時やpauseからの再開直後は乱れる。(0.25sや1.5sも観測)
function on_playback_new_track() {}//新しい曲が再生された時
function on_playback_pause() {}//pauseした時　と　pauseから再開した時

```
####マウス関係

```js
function on_mouse_lbtn_down(x,y){}//左ボタンを押した時
function on_mouse_lbtn_up(){x,y}//左ボタンを上げた時
function on_mouse_move(x, y) {}//領域上にマウスが存在する時
function on_mouse_wheel(delta){}//wheelをした時
//wheeelを回した回数分呼ばれる　前方 1 ,後方 -1
```
##foobarの変数・関数
正直使える変数は謎である。どうやらWSH Panel Mod　はc++で書かれているらしいのだが、スクリプト記述はJScriptという謎なためfoobarの機能を操作するための変数・関数にはどんなものがあるのかが全くわからない。
よって、変数は[ここ](http://moon.gmobb.jp/renno/cgi/junk.cgi/computer/wsh_panel_interface.htm)を参照するといい。
foobar特有の変数・関数一覧であるが、補足がないため名前からどんな機能か想像する必要がある。

内部でwindowsのDesktop App User Interfaceを呼び出して使っているるようです。(`windows.`から始まる関数)
それぞれの詳しい関数は[ソースコードのdocs](https://github.com/19379/foo-jscript-panel/blob/master/foobar2000/foo_jscript_panel/docs/Interfaces.txt)にmicrosoftの関数詳細のページのURLが表記してありあます。

例:sampleにあるThemed Seek Barの1行目が
`var g_theme = window.CreateThemeManager("PROGRESS");`
とありますが、この`PROGRESS`の詳細は[ここ](https://msdn.microsoft.com/en-us/library/bb773210(VS.85).aspx)にあります。
※`BUTTON`や`LISTBOX`などが指定できます。

##その他

```js
gr.FillGradRect( 横左端の位置, 左縦の位置, 横右端の位置, 右縦の位置, 90(角度), 上部の色, 下部の色); 
//色二つがグラデーションになる。角度0なら横縦が逆

//RGB変換
function RGB(r,g,b){ return (0xff000000|(r<<16)|(g<<8)|(b)); }
```
※ちなみに `console.log`等console系統は一切使えないです。




##debug
`fb.trace()`を使う事により、foobar本体のconsoleに出力ができる。

##余談
`gr`という変数がありますが一体何者なのでしょうか？
だれか教えてほしいものです。

```js:
fb.trace(typeof gr) //Object

for (var i in gr){
  fb.trace(gr[i]); //なにも出力されない
}
```

##参考
[foobar2000のwsh panel modのサンプルコードその5](http://moon.gmobb.jp/renno/cgi/junk.cgi/computer/wsh_sample5.htm)
[本家](https://code.google.com/archive/p/foo-wsh-panel-mod/downloads)
※本家のzipの中のsamplesフォルダにsampleがあるので一読するとよい。
git - 「git archive」ソースをアーカイブする方法


gitに格納したあるソースのみを取得した時のメモ

#### 環境

* OS:Ubuntu 14.04.2 LTS

#### git clone

特定のブランチのソースを取得したかったので、ブランチ指定でクローン

```
git clone -b <Branch> <Repository>
```

#### git archive

リポジトリに移動してアーカイブコマンド実行

```
cd <Branch>
git archive HEAD --format=tar.gz > branch.tar.gz
```

#### 参考
http://makaaso.hatenablog.com/entry/2016/01/26/191836
td-agent - ログ出力レベルを変更する方法


使い続けて３年以上。ログはerrorとwarningしか出力されないと思い込んでしまっていた
ついに詳細なログを確認しないと解決出来そうにない問題にぶち当たり調べた時のメモ

#### 環境

* OS:Ubuntu 14.04.2 LTS
* td-agent:0.12.12

#### 修正箇所

「/etc/init.d/td-agent」の以下の箇所を修正

ここを

```
# Arguments to run the daemon with
TD_AGENT_ARGS="${TD_AGENT_ARGS:-${TD_AGENT_BIN_FILE} --log ${TD_AGENT_LOG_FILE} ${TD_AGENT_OPTIONS}}"
```

こんな感じに

```
# Arguments to run the daemon with
TD_AGENT_ARGS="${TD_AGENT_ARGS:-${TD_AGENT_BIN_FILE} -v --log ${TD_AGENT_LOG_FILE} ${TD_AGENT_OPTIONS}}"
```

#### ログレベル

* 「-v」.... infotoとdebugレベルが追加で出力される。ログを見た限り実運用でも耐えられるレベルだと思う。
* 「-vv」... traceレベルが追加で出力される。td-agentの動作すべてを出力されるのでとんでもない量のログが出力される。

とりあえずは「-v」で運用しようと思います

#### 参照
http://makaaso.hatenablog.com/entry/2016/01/26/191919
最低限知っておかないといけないタグ

1．htmlタグ
どのようなページなのかという情報や、ページ上のテキスト、画像、リンクなどを表示する際に必要なものです。

2．コンバージョンタグ
購入数、申込数、資料請求数などのコンバージョンを測定するためのタグです。

3．ツール用制御タグ
Google Analytics、ヒートマップ、ABテストツールなどを使用するために埋め込むタグです。
gitの管理下にあるディレクトリ一覧を取得する

gitの管理下にあるファイル一覧は`git ls-files`で取れますが、ディレクトリ一覧を取るコマンドやオプションが見当たらなかったため、無理やり取得する方法を考えてみました。
pecoでgitの管理下にあるディレクトリから絞り込めたら便利かなーと思ったのがきっかけです。

## やり方

```zsh
$ git ls-files | sed -e '/^[^\/]*$/d' -e 's/\/[^\/]*$//g' | sort | uniq
```

`sed`では、ファイルパスが

* カレントディレクトリ直下のファイルだったら、その行を削除(`'/^[^\/]*$/d'`)
* サブディレクトリ以下のファイルだったら、そのサブディレクトリのファイルパスに書き換え(`'s/\/[^\/]*$//g'`)

を行っています。
最後にソートして重複消してって感じです。

最初は`dirname`コマンドに渡してやってたんですが、毎回プロセスが生成されるためか遅かったので`sed`使うことにしました。

## Gitのサブコマンド

gitのサブコマンドにしたい場合は、下のようにすればいいと思います。

```
[alias]
    ls-dir	= !"f(){ git ls-files | sed -e '/^[^\\/]*$/d' -e 's/\\/[^\\/]*$//g' | sort | uniq; }; f"
```