OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS 7 インストール記録 1. インストーラー usb


イントラネット環境下で、mac の `launchctl` と、共有フォルダの代替を検討するために。windows 7 の入った PC を、パーティションを切って、インストールした。

OSX にて、 CentOS インストーラー usb 作成[^1]。
[^1]: DVD に CentOS の .iso 焼こうとしたら、ぎりぎり容量足らず（？）焼けない。仕方がない。

## 下準備
* ディスクユーティリティにて、とりあえず FAT32 で usb をフォーマット[^2]

[^2]: たぶん必要無い。
* [iso](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso) をダウンロード
* windows で、パーティションを切った。
	* コントロールパネル -> システムとセキュリティ -> 管理ツール -> ディスクの管理

PC のパーティションは一つ 40G のものを増やしただけ。 usb はマウントしたまま。

## hdutil で iso をコンバート
```
$ hdiutil convert -format UDRW -o target.img CentOS-7-x86_64-DVD-1503-01.iso
Master Boot Record（MBR：0） を読み込み中...
CentOS 7 x86_64                 （Apple_ISO：1） を読み込み中...
（Type EF：2） を読み込み中...
CentOS 7 x86_64                 （Apple_ISO：3） を読み込み中...
.........................................................................................................................................................................................................................................................
経過時間： 1m 11.533s
速度：57.5M バイト／秒
節約率：0.0%
created: /Users/XXXXXX/Downloads/target.img.dmg
```

## usb のアンマウント
```
$  diskutil list
/dev/disk0
（略）
/dev/disk1
（略）
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *32.3 GB    disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:       Microsoft Basic Data SP UFD U2               31.9 GB    disk2s2
$  diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

## dd で usb へ書き込み

```
$ time sudo dd if=target.img.dmg of=/dev/disk2 bs=1m
Password:
4110+1 records in
4110+1 records out
4310345728 bytes transferred in 1201.419700 secs (3587710 bytes/sec)
sudo dd if=target.img.dmg of=/dev/disk2 bs=1m  0.01s user 40.77s system 3% cpu 20:04.95 total

```


これで完成。

後は、 windows にもってって、 F12 押しながら[^3]再起動すると、ブート選択肢が出るので、ブートさせる。後は指示に従ってインストール。

[^3]: 機種によるそーだ。

今回は、殆ど全ての機能をインストールした。

ちなみに、サイトによっては、「 PC 用」と書かれていたが、 mac でも、ブートしてインストーラが起動するまでは確認した。別段、 PC 用と言う訳では無さそう[^4]。

[^4]: OS X 上でマウントは出来ない。
ディレクトリ自体のハードリンクに関しての覚え書き


2022/09/14 追記

文章は残すが、2022/09現在、 ***<font color=red>macOS Monterey + Gnu coreutils 9.1 の組合せでは、`sudo` を効かせても動かない。</font>***

`su`については未確認。

また、`hln` コマンドも homebrew のリストから消えている。

<br>

---

特定の OS やらを除いて、ディレクトリ自体のハードリンクは作れない。とされてたんだけど。

## GNU coreutils

`ln -F` として、ディレクトリ自体のハードリンクを作るオプションが用意されてる。
で、使う気もないのに一通り挙動を、、、


### @CentOS6

前々から入っていた。
`man` に警告されている通り、 OS の制約からか、`sudo` しても `Operation not permitted` が出て動かない。


### @OSX[^1]

```
$ wget -q ftp://ftp.gnu.org/gnu/coreutils/coreutils-8.20.tar.xz
$ xz -dv  coreutils-8.20.tar.xz
$ tar -xvf coreutils-8.20.tar
$ ./configure --prefix=${HOME}/cmd && make && make install
```

あれ？ 普通に動くぞ？
しかも `sudo` 無しで。
っつー事で、挙動確認のメモ
[^1]: 普通に homebrew にあるじゃん。入れてから気付いた。

## 挙動確認

### 同じディレクトリにはリンク出来ない。
```
$ mkdir foo bar
$ touch foo/foo.txt
$ ln -F foo buz
ln: failed to create hard link ‘buz’ => ‘foo’: Operation not permitted
```

### 違うディレクトリにはリンク出来る。

```
$ ln -F foo bar/buz
```

- `ls -ali` でリンク数を見ても、ファイル数が含まれる為、ハードリンクがされているか否かの判断はしにくい。
- `find . -inum` とかで、確認は取れる。


### rm -rf 

```
$ rm -rf bar/buz
$ ls *
bar:

foo:
```

ハードリンクされたディレクトリを `rm -rf` すると当然中身は消える。
`foo` の中にも残らない。<= 当たり前

### この状態の `foo` の中に入って、`ln -F` してみると
この状態だと、`foo` は素のディレクトリの状態に戻ってると期待するものの、、、

```
$ cd foo
$ touch foo/foo.txt
$ ln -F foo bar/buz
ln: failed to create hard link ‘bar/foo’ => ‘foo’: Operation not permitted  
```

同じ名前が悪いのか？ と思って別の名前でやってみる。

```
$ mkdir 1 2
$ ln -F 1 2/2
ln: failed to create hard link ‘2/2’ => ‘1’: Operation not permitted
```

循環が怖いってのは理解出来るが、ハードリンク先を消したディレクトリでも、中ではハードリンクは作れなくなるっぽい、、、

`man` とか見て調べるのもかったるいから、この辺で止め。


## 余談

`hln` なるものが紹介されていた。

- [Mac 版 Kobito のローカル記事を Dropbox でバックアップする](http://qiita.com/shuhei/items/9d32f99950336352d0bb)

ソースがすっげー簡単。
MySQLをMacに導入して基礎を学ぶ(2)

[前回の記事](http://qiita.com/yamageni/items/ba9c737fef11409447be)の続きです。
余談ですが、これを書くために都内のノマドに適したカフェを探しています！情報をください！！今回は下北沢からお届けします。

前回はmacでインストールして、、データベースを作成して、作業ユーザを作成するというところまで学びました。
今回はMySQLでテーブルを作成して、フィールドの決定を行います。前回はあまりにもドットインストールの内容そのままになっていたので、今回は噛み砕いて自分の言葉で説明できるようになれるように意識します。

#はじめに

とりあえず前回作ったユーザ`dbuser`で指定したパスワードでログインします。
まだサーバを指定する方法がわからないですが、dbuser@localhostで作成したのでローカル環境でしょう

#データベースの構成

では実際に作成したデータベースにデータを入れていきます。

データを扱う際にはテーブルを作成します。テーブルは日本語で**表**です。
学校の名簿表のようにデータをまとめるのです。

名簿の表にはそれぞれ出席番号、名前、電話番号などがあります、この並びを`field`(または`column`)と呼びます。どちらの呼び方でも慣れておいて損はないです。
カラムは日本語でいうと列つまり縦の並びを指します。名前であれば、山田、田中、鈴木など並びますね。

ではそれぞれの名前に対して、出席番号、電話番号など定義できますねその横の並びのことを`record`といいます。

おそらくデータベースはこのデータの関係が全てであるので少し詳しく理解できるようにしました。

このような表をいくつも持ってデータベースは完成します。

ここで気の利いた図を持ってこれると一流ですが自分理解できればそれでいいので…

##テーブルの作成

ではテーブルを作成します。

まずはターミナルで以下を実行してパスワード入力

```
$ mysql -u dbuser -p test_app
```

ちなみにtest_app(データベース名)を入力しないとテーブル作成できません.しっかり使用するデータベースはアクティブにします。tableの作成はdatabaseの作成と同じcreateです。
さてデータベースを作成したようにmysqlで以下を実行

```
create table accounts(
id int,
user_name varchar(255),
user_email varchar(255),
phone_number char(20),
password char(30),
sex enum('male','female'),
created datetime
);
```


と実行
ここではブログサービスを作る前提としてまずはアカウントデータを管理するテーブルaccountsを作りました。
表はただ作成するだけでなく、フィールド名とそこに入るデータの型を指定することで意味を持ちます。
- int は整数
- varcharは可変長文字列
- charは固定長文字列
- enumは列挙型でどちらかを選択します
- datetimeは日付の型です
()でバイト数を指定します。

またデータベース同様

- 一覧で見る

```
show tables;
```

- 削除

```
drop table accounts;
```

も扱えます。

#扱えるデータ型

フィールドに設定できるデータ型は大きく分けて8つ

1. 整数型 `int`
2. 浮動小数点数型 `double` `float`
3. 日付型と時刻型 `date` `datetime` `timestamp`
4. 文字列　`char` `varchar`
5. バイナリ　`binary` `varbinary`
6. 巨大文字列 巨大バイナリ　`text` `bolb`
7. 列挙型 `enum`
8. set型 `set`

この辺の説明だけで記事が書けそうですがまた後回しにします

#フィールドのオプション

先ほど作ったテーブルのフィールドのオプションを設定

##入力の必須化
入力が必須なのでnullではないということで`not null`をつけます

##デフォルト
もともと値を持つように指定するには`default`と書いて値を指定します。

##自動連番
そのものに意味はなく、登録する度に一ずつ増えていくのが扱いやすいidなどは`auto_increment`で指定

##索引
そのフィールドを検索するときに早くなる


- 主キー
レコードを一意に特定するものにつける。一つのフィールドにしかつけられないのでidなどにつけるのが一般的で`primary key`をつける


- キー
よく検索されるフィールドにつける、フィールドと一緒に`key keyName (フィールド名)`と宣言する

- ユニークキー
uniqueをつけることで、カラム内に同じデータがあった場合エラーを出す。

オプションによって

1.idは必ず入る
2.性別の指定がないときは男性
3.idは自動連番で入る
4.主キーとしてidを定義
5.user_nameをよく検索されるキーとして登録
6.user_emailは他と被らない

とした結果が以下です。

```
create table accounts(
id int not null auto_increment primary key,
user_name varchar(255),
user_email varchar(255) unique,
phone_number char(20),
password char(30),
sex enum('male','female') default 'male',
created datetime,
key user_name (user_name)
);
```

このようにフィールド値に制限を入れてテーブルが作成できます。
BMS BGA HD (1080p) to 4:3 letterboxed at 1:1 using ffmpeg

As [I am participating in BOFU2015](http://manbow.nothing.sh/event/page/bofu2015/teamlist15/kprof.cgi?idx=111), our team made BGAs in 1080p HD format, but to use them in LR2, we need to convert them to MPEG with 1:1 aspect ratio first.

For that, we first crop the video to 4:3 aspect ratio, then add letterbox.

![Screen Shot 2015-09-12 at 1.06.16.png](https://qiita-image-store.s3.amazonaws.com/0/80627/d916f822-7797-27ca-18d0-10501745e7b9.png)

We need to do both cropping and letterboxing, because otherwise, either the video is too small, or many surrounding details will be removed.

![Screen Shot 2015-09-12 at 1.12.31.png](https://qiita-image-store.s3.amazonaws.com/0/80627/9eee077e-4440-36ca-b83d-fbaf182a99c0.png)

Here is the `ffmpeg` command I used:

```
ffmpeg -i "$1" -filter:v "scale=853x480, crop=640:480:107:0, pad=640:640:0:80" -pass 1 -f mpeg1video -b:v 2048k -an -passlogfile log_file -y "$1.mpeg"
ffmpeg -i "$1" -filter:v "scale=853x480, crop=640:480:107:0, pad=640:640:0:80" -pass 2 -f mpeg1video -b:v 2048k -an -passlogfile log_file -y "$1.mpeg"
```

## 512x512 version

```
ffmpeg -i "$1" -filter:v "scale=683x384, crop=512:384:86:0, pad=512:512:0:64" -pass 1 -f mpeg1video -b:v 2048k -an -passlogfile log_file -y "$1.mpeg"
ffmpeg -i "$1" -filter:v "scale=683x384, crop=512:384:86:0, pad=512:512:0:64" -pass 2 -f mpeg1video -b:v 2048k -an -passlogfile log_file -y "$1.mpeg"
```
マイナンバーのチェックデジットを計算する

## そもそもマイナンバーってどういう数字なのでしょうか？

これは法律を読みます。調べると「[行政手続における特定の個人を識別するための番号の利用等に関する法律施行令](https://elaws.e-gov.go.jp/document?lawid=426CO0000000155#Mp-At_8)」の第八条に書いてあります。

> 十一桁の番号及びその後に付された一桁の検査用数字により構成されるものとする。

つまり11桁＋検査用数字1桁で12桁なんですね。さらに条件があって、

1. 住民票コードを変換して得られる
1. マイナンバーから住民票コードを復元できない
1. 変更されて過去に使っていたものも含めてかぶらない

ということになっています。

## 検査用数字とは？

いわゆるチェックデジットですが、計算方法が「[総務省令第八十五号](http://www.soumu.go.jp/main_content/000327387.pdf)」（PDF）の第5条に定義があります。まとめると


* 検査用数字 : $11 - \Bigl( \displaystyle\sum_{n=1}^{11} P_n \times Q_n \Bigr) \% 11$
    * ただし $\Bigl( \displaystyle\sum_{n=1}^{11} P_n \times Q_n \Bigr) \% 11 ≦１ $の場合は、$0$とする

* $Pn$と$Qn$の定義
    * $Pn$ : 個人番号を構成する検査用数字以外の十一桁の番号の最下位の桁を $1$ 桁目としたときの $n$ 桁目の数字
    * $Qn$ : $1≦n≦6$ のとき $n+1$、 $7≦n≦11$ のとき $n-5$


## というわけでさっそく計算しましょう
```rb:mynumber_validate.rb
def validate_my_number(mynumber)
  # 整数列化
  digits = mynumber.to_s.chars.map(&:to_i)
  # 12桁しか認めない
  return false unless digits.length == 12
  # チェックデジットを分離します
  check_digit = digits.pop

  # 残った数字を小さい方から調べます
  digits.reverse!
  
  # 数列の和を11で割った余りを計算します
  remainder =  (1..11).inject(0) {|sum, i|
    p = digits[i-1]
    q = (i <= 6) ? i+1 : i-5
    sum + p*q
  } % 11
  
  case remainder
    when 0,1
      check_digit === 0
    else
      check_digit === (11 - remainder)
  end
end


p validate_my_number(123456789010) #=> false
p validate_my_number(123456789011) #=> false
p validate_my_number(123456789012) #=> false
p validate_my_number(123456789013) #=> false
p validate_my_number(123456789014) #=> false
p validate_my_number(123456789015) #=> false
p validate_my_number(123456789016) #=> false
p validate_my_number(123456789017) #=> false
p validate_my_number(123456789018) #=> true
p validate_my_number(123456789019) #=> false
p validate_my_number("023456789013") #=> true (先頭が0の場合)
```

先頭の11桁が`12345678901`の場合、検査用数字は`8`になるので`123456789018`が有効な番号となり、それ以外は全て不正なナンバーとなります。マイナンバーが届いたら合っているか計算してみましょう。

## まとめ
マイナンバーの形式と、検査用数字（チェックデジット）の計算方法を書きました。もう少しキレイに書けるかもしれませんね。免許証なんかもほぼ同じ理屈です。個人情報ですので取り扱いには十分ご注意ください。
Command for Linux

# curl コマンド
***1. URL先のファイルをダウンロード***

```bash
curl -O -L <URL>
```

# find コマンド
***1. 名前検索＆後続コマンドに引数を渡す***

```bash
find <FINDDIR> -name "<WORD>" -exec <COMMAND> {} \;
```

```bash:例：拡張子logのファイルのみ権限剥奪
find /var -name "*.log" -exec chmod 600 {} \;
```
         
***2. タイムスタンプ検索＆後続コマンドに引数を渡す***

```bash
find <FINDDIR> -mtime <INTEGER> -exec <COMMAND> {} \;
```

```bash:例：タイムスタンプが7日以前のファイルを排除
find /tmp -mtime 7 -exec rm -rf {} \;
```

# netstat コマンド
***1. ルーティングテーブル参照***

```bash
netstat -rn
```

***2. コネクションテーブル参照***

```bash
netstat -tuapn
```

# tcpdump コマンド
***1. インタフェース指定＆特定プロトコルを除外する***

```bash
tcpdump -n -i <INTERFACE> not port <PROTOCOL>
```

```bash:例：eth0よりSSHおよびARPパケットを絶やす
tcpdump -n -i eth0 not port ssh and not arp
```

***2. 外部ファイルへキャプチャデータを書き込む***

```bash
tcpdump -w <FILENAME>
```

```bash:例：aiueo.pcapにパケキャプを叩き込む
tcpdump -n -i bond0 host 8.8.8.8 -w /tmp/aiueo.pcap
```

***3. 外部ファイルからキャプチャデータを読み込む***

```bash
tcpdump -r <FILENAME>
```

```bash:例：aiueo.pcapを覗く
tcpdump -r /tmp/aiueo.pcap
```
ESP8266入門:2stepでArduinoIDEからesp開発


#**ArduinoIDEを使う**
##やること：ArduinoIDEからESP8266を開発。ESP単体でプログラムを動作させる。

https://learn.adafruit.com/adafruit-huzzah-esp8266-breakout/using-arduino-ide
を参考に書いています。
###**1.ハードウェアの準備。**
FT232RLを使ってます。
FT232RLのUSBからレギュレータで500mAくらいは流せる3.3Vを作る。
以下のように繋ぐ。

|FT232RL|esp8266|
|--------:|:-----------|
|3.3V(レギュレータOUT)    |3.3v|
|GND                    |GND|
|TX                     |RX|
|RX                     |TX|
|3.3V(レギュレータout)|EN(プルアップ)|
以上繋いだら2.ソフトウェア準備へ

###**2.ソフトウェア準備**
１、Arduinoを最新版に
２、環境設定を開きAdditional Boards Manager URLsに
http://arduino.esp8266.com/stable/package_esp8266com_index.json
を入力
３、toolsのボード→Board Managerでesp8266と入力しでてきたesp8266 byESP8266Communityってやつをインストール。したらIDEを再起動。
４、ボードにESP8266関連の項目がいくつか追加されていますね。そのなかのGeneric ESP8266を選択します。
５、書き込みに使用するポートを自分のシリアルモジュールにしてください。どれかわからない場合は抜き差ししてどれが消えたか増えたか見て推測してください。

####**これでArduinoIDEを用いてESP8266を開発する準備がすべて整いました。**
##早速Lチカからやってみましょう。

```lang:hello_ESP_with_arduinoIDE
void setup() {
  pinMode(0, OUTPUT);
}

void loop() {
  digitalWrite(0, HIGH);
  delay(500);
  digitalWrite(0, LOW);
  delay(500);
}
```

ESP8266のArduinoでのピンアサインはGPIOと1対1に対応してます。

**しかし書き込む前に注意があります！！**
Espを**uartDownloadMode**にしないと書き込めません！ESP8266にはMODEがあります。
**UARTMODEにするにはio2を3.3vに、io15とio0をGNDにつなぎます。**それだけ。
(使用しているブレイクアウトボードやモジュールにより多少状況は異なります。)
**そしてRSTをGNDにつなぎましょう。**
これで準備は整いました。
**書き込みを押すと同時**(書き込みより早くてはいけません)**にRSTとGNDを繋いでる線をオープンにしてください。**そんなに早くなくて大丈夫です。IDEの書き込み進行メーターが9割になる前に抜いてください。
これはRSTとGNDを繋いでるのがジャンプワイヤなら引っこ抜いてくださいという意味です。そしたら無事書き込めるはずです。

書き込んだ後IO0ピンを使うならGNDと繋がっている線を引っこ抜いてください。ショートします。

**以上でArduinoでESP8266を開発できるようになりました。**

電源を落とした際に再起動する場合はflashBootModeにして電源を入れないとプログラムは動かないので注意してください。安心してください。プログラムが消えるわけでありません。間違ってflashBootModeではない状態で電源を入れた場合はFlashBootModeにして電源を入れ直してください。(flashBootModeにする方法は下記参照)

**以下書き込み手順を箇条書きにまとめます。
・io2を3.3v、io15とio0をGNDに繋いでuartDownloadModeにする
・GNDとRSTを繋ぐ
・書き込みを押すと同時にRSTをGNDをオープンに
・終わり。**

##**ちなみに上で触れたMODEについて補足**
esp8266にはflashBootModeとUartDownloadModeがあります。それぞれのMODEにする方法は以下のように配線します。
###**uartDownloadMode**
プログラムを書き込むときに使います。

|FT232RL|esp8266|
|--------:|:-----------|
|3.3V|io2|
|GND               |io15|
|GND                     |io0|

###**flashBootMode**
書き込んでいるプログラムを読み込んで実行するときに使います。

|FT232RL|esp8266|
|--------:|:-----------|
|3.3V|io2|
|GND               |io15|
|3.3V                    |io0|


です。io0の接続先が違うだけです。






ps:ArduinoならぬEspduinoを作ってみました。下はさらにArduino用のシールドを作って並べてみた様子。WebServerにしてみました。。しかし私は今、busy s...エラーにはまってます。
解決できたらそのへんも追記したいと思います。
ps2:NODEMCUでやったらなんにも問題なくhttpリクエストを処理できました。
![IMG_2415.JPG](https://qiita-image-store.s3.amazonaws.com/0/75445/8c61e7ba-2c0c-99c7-dbad-9e3116501dd0.jpeg)
![IMG_2417.JPG](https://qiita-image-store.s3.amazonaws.com/0/75445/2bc4eb59-0c55-0eb3-687a-0613ffb5d42c.jpeg)
iOS（Swift）開発で参考にしている記事まとめ

iOSアプリをSwiftで開発する上で、個人的に参考にし、取り入れている手法をまとめます。

# コーディング規約
- [Swiftコーディング規約@Wantedly](http://qiita.com/susieyy/items/f71435cc962e70d81b37)
- [github/swift-style-guide](https://github.com/github/swift-style-guide)
- [SlideShareInc/swift-style-guide](https://github.com/SlideShareInc/swift-style-guide)

基本、ここら辺に従っています。定期的に読むとよい気がします。

# Tips
- [iOSアプリのコードレビューで最近気になるところ](https://speakerdeck.com/yashigani/code-reviewing-in-ios-app-development)
  以下の点は、この資料で教わりました。  
  - @IBOutletのdidSetでlayerを設定するときれい
  - DataSourceのオブジェクトはStoryboardで注入できる
  - enumを活用すべき  
　  

- [Making Your App Static](https://speakerdeck.com/yuseinishiyama/making-your-app-static)
  storyboard, cellの読み込み時に、identifierの文字列を使わないで書くスマートな方法が紹介されています。genericsの便利さがよく分かります。


- [Keyboardの上下](http://ushisantoasobu.hateblo.jp/entry/2012/11/14/022329)
animation curveまできちんと扱われているものは意外と少ない気がします。
降水確率は当たるのか？

*筆者は統計学初心者のため、内容の正しさは保証できません。本記事の内容をまじめな用途で使われる際はご注意ください。また、間違いの指摘やよりよい方法、関連して知っておくとよいことなどがありましたら、コメントいただけると幸いです。*

#降水確率は当たるのか？

確率ってのは、数え上げて割り算すれば求められる。けれど、降水確率となると。同じ日は二度と来ないし、降水確率は日によって変わる。果たして、降水確率というものは、どこまで信頼できるのだろうか。適当に数字を出しているだけではないだろうか。
降水確率が90%でも、雨が降らない日はある。100%ではないのだから、おかしくはない。けれど「100%じゃないから雨じゃなくても間違いではありません」では、何の意味もない。降水確率90%の晴れの日は、本当に降水確率90%だったのだろうか。

##例えばもし、降水確率が毎日30%なら、妥当性は検証できる。

もし、降水確率が毎日同じならば、毎日、晴れたか雨だったかを記録し、雨だった日を数えれば、降水確率は検証できる。二項検定か、カイ二乗検定などで求められる。

##降水確率として出てくる数字が有限個で、その個数がサンプル数に比べて少なければ、求まるのではないか。

さらには、滅多に出ない珍しい降水確率が存在しないか、あったとしても、それを考慮しても十分にサンプル数があるという仮定も欲しいが。ともかく、有限個で、サンプル数が十分にあれば「この降水確率が予報された日は、何パーセントの確率で雨が降る」というデータが作れる。
そして、気象庁が発表している降水確率は、実は0%から100%までの10%刻みと決まっている。この方法が使えそうだ。(もしそのようになっていなくても、10%刻みにデータを区分けして強引にこのようにする方法だってある)

#降水確率の定義

[気象庁の予報用語のページ](http://www.jma.go.jp/jma/kishou/know/yougo_hp/yoho.html)より引用。
> a)予報区内で一定の時間内に降水量にして１mm以上の雨または雪の降る確率（％）の平均値で、０、10､20､…､100％で表現する（この間は四捨五入する）。
b)降水確率30％とは、30％という予報が100回発表されたとき、その内のおよそ30回は１mm以上の降水があるという意味であり、降水量を予報するものではない。 降水確率は、予報区内で一定の時間内に1mm以上の雨または雪（融けたときの降水量に換算する）が降る確率であり、0%から100%まで10%刻みの値で発表される。

これにも注意した方がよさそうだ。
>対象時間は、短期予報は６時間、週間予報では24時間とする。 

なんと、今日の天気の欄に出る短期の降水確率と、週間予報の欄に出る1日の降水確率は、定義が違っていたのだ。前者は6時間の間に1mm以上降る確率で、24時間の間に1mm以上降る確率ということだ。知らなかった。

#気象庁の過去データ

http://www.data.jma.go.jp/obd/stats/etrn/ で過去の気象データの閲覧が、
http://www.data.jma.go.jp/gmd/risk/obsdl/index.php でダウンロードができる。
タダでこんなの公開してくれてるなんて、こりゃありがたい。

1日あたりの降水量を得ることができた。
ただ、残念ながら、予報した降水確率は公開されていないようだ。

#降水確率の過去データ

こちらのWebページで、東京の過去の天気予報を(個人の方が?)公開されている。
http://homepage3.nifty.com/i_sawaki/WeatherForecast/ 
すごい・・・・

#データは揃った。やってみよう

とりあえず、上述のサイトから、2014年1月1日～2014年12月31日までのデータを集めてみた。
降水確率は、1日の降水確率の中では最も新しい、2日前の値を使用した。

##的中具合を定量的に表すには？

それぞれの降水確率の妥当性は、カイ二乗検定などでも分かるが、全体としてどうなんだ、というのを求めたい。そのために、今回は「[決定係数](https://ja.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E4%BF%82%E6%95%B0)」というものを使ってみた。
Wikipediaによると、定義には諸説あるようだが、一般的、とされている
$R^2 = 1-\frac{\Sigma_i(y_i-f_i)^2}{\Sigma_i(y_i-\overline{y})^2}$
を使用した。
決定係数は回帰曲線の当てはまりのよさを見るのに使われ、数値が大きいほど当てはまりがいいと言え、最大で1になる。また、この定義では、マイナスの値にもなりうる。

今回のは回帰曲線とは違うが、
($x_i$, $y_i$) = (予報降水確率, その予報のときの降雨日数/その予報が出た日数)
とし、また、推定値は、 $f_i = x_i$とした。

Python(2でも3でも動くはず)で書いたコードを[このあたり](https://github.com/gyu-don/jikken/tree/master/probability_of_rain)に掲載している。

#2014年の降水確率の的中具合は?
ここに示したのが、2014年の降水確率の分布だ。
![スナップショット8.jpeg](https://qiita-image-store.s3.amazonaws.com/0/88256/7fd50cc2-c1bd-e2c7-eb5e-f635eba82362.jpeg)
横軸を降水確率の予報、縦軸を、その予報のときの降雨日数/その予報が出た日数ととったのがこちら。
![スナップショット7.jpeg](https://qiita-image-store.s3.amazonaws.com/0/88256/e4a91761-91fa-46b5-30a6-2ebb965d9c21.jpeg)
このときの決定係数の値は 0.8714 となった。

「決定係数　目安」などで検索すると、特にいくら以上だといいといった基準はないらしいが、0.5以上だと十分によい回帰であるようだ。0.8714は、なかなかにいい値なのではないだろうか。

無事に、降水確率はデタラメではないことが分かった。
曲のパラアウトをwavからflacへ、flacからwavへ

最近曲のパラアウトを要求される場面があったのでメモっておく。

Logic Pro Xには全トラックをバラバラに１つのフォルダに吐き出せるコマンドがあり、これを使うと**aiff, wav, caf**にできます。
ただ、パラアウトにはその性質上無音部分が多く、**flac**にしたほうが効率が上がります。
ファイルの量も多かったので、`bash`で一発で変換できるようなスクリプトを書き留めておきます。
パラアウトは**`wav/stereo/24bit以下/44.1kHz`**とします。

## wav -> flac

```
IdvOut
|
|-wav
   |-パラアウト(Logicの生成したファイル)
```

というディレクトリの構造になっているという前提で、**IdvOutディレクトリに於いて**

```bash
mkdir flac
for nm in wav/*;
do ffmpeg -i "$nm" -vn -ar 44100 -ac 2 -acodec flac -f flac "flac/${${nm%.wav}#wav/}.flac";
done
```
Special Thanks to @suzutsuki0220 for [this contribution](http://qiita.com/suzutsuki0220/items/43c87488b4684d3d15f6) explaining how to convert wav to flac by ffmpeg [^1]

[^1]: -iは**入力ファイル、**-vnは**ビデオを無視**、-arは**サンプリングレート**、-acは**チャンネル数**、-acodecは**オーディオのコーデック**、-fは強制的に**フォーマットを指定**

## flac->wav
パラアウトは大抵zipにされるのでそのzipを**新しく作ったディレクトリに**入れて

```bash
unzip <落とした.zip>;
mkdir wav;
cd <展開したflacのあるディレクトリ>
for nm in *;
do ffmpeg -i "$nm" -vn -ac 2 -f wav "../wav/${nm%.flac}.wav"; # zipによっては何層か上に行かないといけない場合あり。要は、２行目で作ったwavディレクトリに届けばおk。
done
```
このとき、flacはwavにしても(32bitとか64bitとか変なマルチチャンネルの設定になっていない限り)音質は損なわれないので何も考えずにやっておk[^2]

[^2]: さらに、`-vn -ac 2 -f wav`がなくても普通に動きます。


---
Udev

### Udev
* 今日勉強した時にUdevが書かれていて、そういえば昔勉強したなーと思ったので、思い出してみた

#### /dev
* Ram上のファイルシステ、ディスク上に実態はない

#### udev
* insmodの後に手動でmknodしていたのを自動でする

##### 何するのudev
* 確かデバイスを検知したらデバイスファイルを作成、取り外したらデバイスファイルを削除する
* きっかけはドライバのロード、アンロード関数
  - insmodでクラスの登録 /sys/class/~~~
  - Udevが検知してる？登録されたdevファイルを元にmknod /etc/ude/rules.dを参照してパーミションなどを設定してデバイスファイルを作成
autohotkey+無変換でどこでもvimライク

# autohotkeyでvimライク
autohotkeyをダウンロードして、下記スクリプトをコピペして作成。
実行してください。

```
sc07B & h::Send,{Blind}{Left}
sc07B & j::Send,{Blind}{Down}
sc07B & k::Send,{Blind}{Up}
sc07B & l::Send,{Blind}{Right}
sc07B & y::Send,{Blind}{Home}
sc07B & u::Send,{Blind}{PgDn}
sc07B & i::Send,{Blind}{PgUp}
sc07B & o::Send,{Blind}{End}
sc07B & x::
  If GetKeyState("Shift","P")
    Send,{Blind}{Backspace}
  Else
    Send,{Blind}{Delete}
  Return
```

▼説明
無変換押しながら下記のキーを押すと挙動が変わります。

hjkl: 矢印移動
yuio: 前からhome pagedown pageup end
x: delete
shift+x: backspace

すごく便利～！
カスタマイズしてもお使いください。

ifつかってるのは&で繋げられるのは2つまでなので。
通常の修飾キー（shift、control、alt）は別シンボルに置き換えられるので、3つ以上も可能です。

▼修飾キーとシンボルの対応（Key: Syntax）
```
Alt: !
Ctrl: ^
Shift: +
Win Logo: #
```

▼例: ctrl+shift+o

    ^+o::Send,{Blind}{End}


無変換バインドは親指が痛いのがネック！

ちなみにmacは別の便利なソフトがあります。
https://pqrs.org/osx/karabiner/index.html.ja
ActivityやFragmentを使わずに、直接カスタムViewとCursorLoaderを組み合わせるサンプル

# Activity/FragmentでCursorLoaderを使う場合の問題点

Androidの公式サンプルでは、CursorLoaderを使う例として、ActivityやFragmentのLoaderManagerと組み合わせる方法しか書かれていない。

確かにLoaderManagerを使うとActivityやFragmentのライフサイクルを考慮してcallbackを呼んでくれるので便利なのだが、以下の問題点がある。

- 様々なViewで違うCursorLoaderを使っている場合、それらのCursorLoaderの処理をすべてActivity/Fragmentに集めて書かなくてはならない。
- そもそもFragmentは使いにくい

# カスタムViewとCursorLoaderを直接組み合わせる方法

ViewがCursorLoaderを持っていて、勝手にデータを取ってきて表示してくれれば非常に便利なのだが、公式ドキュメントにはそのサンプルは無い。

ViewにはonWindowVisibilityChanged()というcallbackがあり、これを使えばCursorLoaderとカスタムViewを組み合わせるのは割と簡単にできる。

コードはこちら。
https://gist.github.com/anolivetree/23fdb807246a8269b5af
git を proxy 環境配下で利用する

# 概要
Proxyサーバ配下の環境では、gitコマンドがうまく利用できない。
git　コマンドを　proxy配下で利用する方法を記載する

# 手順
## 環境
CentOS 6.x（x86_64）

## connect をインストールする
RPMforgeリポジトリを使えるようにして、connectをインストールする
<pre>
\# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
\# rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
\# yum -y install connect
</pre>

## ${HOME}/.ssh/config を編集する
行頭に「PfroxyCommnd connect」とproxyサーバ情報と接続先Git情報を記載する
<pre>
ProxyCommand connect -H (proxy-server-address:Port) %h %p
Host (Git FQDN)
  HostName (GitFQDN of Git IP Address)
  User (Git user)
  IdentityFile ~/.ssh/(Secret key registered Git).pem
  Port 22
</pre>

## ${HOME}/.gitconfig にProxy情報を記載する
<pre>
[http]
        proxy = http://(proxy-server:Port)
[https]
        proxy = http://(proxy-server:Port)
[url "https://"]
        insteadOf = git://
</pre>

## Git repositoryをクローンするディレクトリにてgit clone実施
<pre>
$ git clone@(git-address)
</pre>
Chromeの拡張機能「Tab Position Customizer」を消す。

# 起動時に毎回「削除されました」と出てきて鬱陶しい
Chromeを起動するたび、「Tab Position Customizerは自動で削除されました」のようなメッセージが出てきていた。

ストアからも完全に消えてなくなった拡張機能の様子。
しかし、ツールの拡張機能から完全に消そうと思っても、項目がないので消せない。
という訳で、対処法があったので書く。

# Tab Position Customizerを消す方法
1. 下記フォルダにアクセス。Usersの後のXXXは自分のユーザー名。  
`C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Extensions`
2. 「cldflinjcjehpjddjkohganfpjlnbpem」というフォルダがあるので、それを消す。
3. さらに`C:\Users\XXXX\AppData\Local\Google\Chrome\User Data\Default\Local Storage`内に下記2ファイルがあるので、それも消す。「cldflinjcjehpjddjkohganfpjlnbpem」で検索をかけるとよい。
 * 「chrome-extension_cldflinjcjehpjddjkohganfpjlnbpem_0.localstorage-journal」
 * 「chrome-extension_cldflinjcjehpjddjkohganfpjlnbpem_0.localstorage」

このフォルダ名自体は、拡張機能を確認する時に
ID:～～ と書かれているものと同じ。とはいえそのリストに載ってないんだけど。

# 結局
上記でも改善しない場合、
Chromeアンインストール→再インストールが安定の様子。

# 消せるようになった
Chromeの拡張機能画面に表示されるようになり、消せるようになった。
Chromeバージョン53。

# 参考
- [Chromeのextension「Tab Position Customizer」が無くなってた](http://mattaries.exblog.jp/23730061)
CUDA Toolkit 6.5 インストール手順

**2018/09/24 CUDA Toolkit 10.0 インストール手順を作成しました。**
[CUDA Toolkit 10.0 インストール手順](https://qiita.com/East_san/items/62adb216b0e6f801ae1d "CUDA Toolkit 10.0 インストール手順")
**2018/08/05 CUDA Toolkit 9.0 インストール手順を作成しました。**
[CUDA Toolkit 9.0 インストール手順](https://qiita.com/East_san/items/7e87234ce5c9f233cc13 "CUDA Toolkit 9.0 インストール手順")

# インストール環境
・Windows 7 Professional 64bit
・Intel Corei7-3770K
・8GB RAM
・Geforce GTX 780

# Step 1. GPUの確認
ここにアクセスし、GPUがCUDAを使えるかを確認する。
Compute CapabilityはCUDAで使える機能の豊富さだとでも思っておけばよいです。
https://developer.nvidia.com/cuda-gpus

# Step 2. ダウンロード
以下からCUDA Toolkit 6.5をダウンロードしてきます。(以前はSDKなどをダウンロードしインストールする必要がありましたが、CUDA 6.5ではToolkitにまとまっているのでこれだけで良いです)
https://developer.nvidia.com/cuda-toolkit-65
![down001.png](https://qiita-image-store.s3.amazonaws.com/0/92978/35bf9552-ac28-ee6a-5f3d-06f52d68339e.png)
私の環境は64bitなので64bitのものを選択します。

# Step 3. インストール
ダウンロードしてきた「cuda_6.5.14_windows_general_64.exe」を実行します。
![inst001.png](https://qiita-image-store.s3.amazonaws.com/0/92978/3c1aaefc-7a31-983b-4f7e-79d7cd66538e.png)
「OK」をクリックします。（ここではD\CUDA6.5ディレクトリを選択してますが、デフォルトでもよいです。ただし、空のフォルダじゃないと警告がでます）
![inst002.png](https://qiita-image-store.s3.amazonaws.com/0/92978/3d428f6b-f95a-fb48-5b8f-f65acdbec560.png)
使用許諾よく読み「同意する続行する」をクリックします。
![inst003.png](https://qiita-image-store.s3.amazonaws.com/0/92978/2c01e709-8418-4c52-e523-0166b8b2ba41.png)
「カスタム」を選択し、「次へ」をクリックします。（デフォルトでも問題ないです）
![inst004.png](https://qiita-image-store.s3.amazonaws.com/0/92978/89aeed65-2bbe-3fc4-303b-461846b8383e.png)
CUDA Samples, CUDA Toolkit, CUDA Visual Studio Integrationの3つを選択し「次へ」を押す。
![inst005.png](https://qiita-image-store.s3.amazonaws.com/0/92978/aa469353-544a-2c89-7731-255ec2bacc71.png)
「次へ」を押す。
![inst006.png](https://qiita-image-store.s3.amazonaws.com/0/92978/6b932c3b-2464-5446-f15d-637730218562.png)
インストールが終わるまで待つ。
![inst007.png](https://qiita-image-store.s3.amazonaws.com/0/92978/25552931-d994-6433-4e94-a7d8fedecbfd.png)
Visual Studio 用にNsightのインストールが始まる。このとき、現在利用しているVisual StudioによってInstalledの表示が変わる。
「次へ」を押す。
![inst008.png](https://qiita-image-store.s3.amazonaws.com/0/92978/98f6e5c4-91a2-926b-0a1f-bf9fd9d680c5.png)
インストールが終わったので「閉じる」を押す。これでCUDA 6.5のインストールは完了！
「再演じゃけぇ！　～ドメイン駆動設計の現場（広島版）～」に参加したよ

https://devlove-hiroshima.doorkeeper.jp/events/29883

DevLOVE Hiroshima に参加しました。

![20150911_DDD.png](https://qiita-image-store.s3.amazonaws.com/0/53620/fd4fa3e1-024e-e766-47f9-b1117f95f50a.png)

小分けにすると、、、時間がかかっちゃうので一気に書きました。

刺激を受ける言葉が多々ありました。

* 外部の人（DDD おじさん）を呼ぶ
* 型通りにやってみる
* でも、自分たちの主張は持つ（言われたままにやるのではない）

試行錯誤することは良いと思いますが、うまくいかなかったときにやめるのか、あと一歩踏み出すたして続けるかの判断に外部の人の客観的な意見は参考になりそうだなっと思いました。

まずは、型通りにやってみるっと言うのもその通りだなっと思いました。
簡単なことからやるっとすると中途半端になってしまいそうです。

こういうときにも外部の人が有効に働いてくれそうな気がします。
なんとなくメンドくてやりたくないことに対して、背中を押してやる方向に向けさせてくれそうな気がしました。

もちろん、DDD についても参考になるところは多々ありましたが、ぼくの記憶には、上記のように新しいことを始めるときのポイントに刺激を受けました。

* 小さくやる
* 自分でやる
* 結果を出す

そのための１つの手段として外部の人（有知識者）を呼ぶ。

とても参考になりました。
[Swift]Filterしたタプルの配列を返すメソッド

## やること
1. タプルの配列を返すメソッド作成
2. 引数で指定した文字列を条件に、Filterしたタプルの配列を返す

### メソッド
```swift:filterTuple
/**
 *  指定した刀派の刀剣男士をタプルの配列で返す
 *
 *  @param  Faction 刀派
 *
 *  @return 指定した刀派の刀剣男士
 **/
func selectFaction(Faction: String) -> [(rare: Int, name: String, faction: String)] {
    
    let toukenKnights: [(rare: Int, name: String, faction: String)] = [
        (5, "三日月宗近", "三条"),
        (3, "小狐丸",    "三条"),
        (3, "石切丸",    "三条"),
        (3, "岩融",      "三条"),
        (1, "今剣",      "三条"),
        (4, "鶯丸",      "古備前"),
        (3, "明石国行",   "来"),
        (4, "蛍丸",      "来"),
        (1, "愛染国俊",   "来")
    ]
    
    var factionKnights:[(rare: Int, name: String, faction: String)] = toukenKnights.filter({$0.faction == Faction})
    
    return factionKnights
}
```

### 実装例
```swift:filterTuple
    override func viewDidLoad() {
        super.viewDidLoad()
        
        var sanjo:[(rare: Int, name: String, faction: String)] = selectFaction("三条")
        println(sanjo[0].name)   // 三日月宗近
        println(sanjo[1].name)   // 小狐丸
        println(sanjo[2].name)   // 石切丸
        println(sanjo[3].name)   // 岩融
        println(sanjo[4].name)   // 今剣
        
        var kobizen:[(rare: Int, name: String, faction: String)] = selectFaction("古備前")
        println(kobizen)         // [(4, 鶯丸, 古備前)]
        println(kobizen[0].name) // 鶯丸
        
        var rai:[(rare: Int, name: String, faction: String)] = selectFaction("来")
        println(rai)             // [(3, 明石国行, 来), (4, 蛍丸, 来), (1, 愛染国俊, 来)]
        println(rai[0].name)     // 明石国行
        println(rai[1].name)     // 蛍丸
        println(rai[2].name)     // 愛染国俊
    }
```

刀剣男士は元々刀派でソートされているのであまり良い例ではないですが
ランダムなデータの抽出はFilterが便利です。
for文の中でIf文判定して一致したらappendという一連の操作をしなくていいなんて！

抽出元データの配列や、Filter条件も引数で渡せると思うのですが、
なんでも関数にできるのでいい使用例がとっさに思いつかないですね。
人間側が追いつくようもっと飛翔していきます。
サーバーの起動をきちんと待つ方法

Dockerfileでサーバーを起動してから初期データを投入する場合などに、起動コマンドを実行した直後にデータを投入するとサーバーがまだ立ち上がっておらず、エラーが発生して困るという事がたまにあります。起動コマンドが返るほうがデタッチされた子プロセスがlistenを開始するよりも早い場合などにそうなりますね。
そしてそれを避けようとしてDockerfileに `sleep 2` とか書いてあるのをたまに見かけます。まあ大体それで大丈夫なのですが、どうも気になります。本当に2秒で十分なのか？何秒なら十分なのか？

そういう場合は、`nc -z`コマンドで疎通確認を行えば安心できます。

```
until nc -z <host> <port>; do sleep 1; done
```

`sleep 2` とかやってる場所を上記で置き換えればokです。
Rails4 でページ遷移したら JavaScript が読み込まれてないとなった時

# Turbolinksですよ！

```yourscript.js.coffee

$ ->
  alert('Loaded')
```

初回のページ読み込み時しか ``` Loaded ``` と言ってくれない。。

## Turbolinks を確認

``` Gemfile
gem 'turbolinks'
```

``` app/assets/javascript/application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks
```

こういう状態になってたら、Turbolinksがちゃんと設定されている。
（普通に ```rails new``` するとデフォルトでこんなんなってる）

## Turbolinks をOFFしないでそのままdocument.readyしてほしい

[kossnocorp/jquery.turbolinks](https://github.com/kossnocorp/jquery.turbolinks)

を使う。

Gemを追加

``` Gemfile
gem 'jquery-turbolinks'
```

assetsの読み込み

``` app/assets/javascript/application.js
//= require jquery
//= require jquery.turbolinks
//= require jquery_ujs
//= require turbolinks
```

``` require jquery.turbolinks ``` は ``` require turbolinks ``` よりも先に読み込むこと！
がっこうぐらし！公式サイトの昼夜切り替えブックマークレット

##概要
[アニメ「がっこうぐらし！」の公式サイト](http://gakkougurashi.com/)は訪れる時間帯によって雰囲気が変わります。ということでその昼夜のバージョンを切り替えるブックマークレットを作りました。

##ブックマークレット

```js:
javascript:!function(){if("gakkougurashi.com"==location.hostname){var i=location.pathname.split("/")[1],o=$("body").hasClass("morning");$("body").toggleClass("morning",!o).toggleClass("night",o),$("#main_img").children("img").attr("src","/core_sys/images/main/"+("question"==i?"cont/---/---"+(o?"---":""):"top/main_img"+(o?"_ni":""))+".jpg"),o?$("#side_top,#side_bottom").remove():$("#side").prepend('<div id="side_top"></div>').append('<div id="side_bottom"></div>'),"chara"==i&&$("#clbgo1,#clbgo2,#clbgo3,#clbgo4,#clbgo5,#clbgo6,#clbgo7,#clbgo8").each(function(){this.src=o?this.src.replace(/\.jpg$/,"ni.jpg"):this.src.replace(/ni\.jpg$/,".jpg")}),"staffcast"==i&&$("#com_img1,#com_img2,#com_img3,#com_img4,#com_img5").children("img").each(function(){this.src=o?this.src.replace(/\.png$/,"ni.png"):this.src.replace(/ni\.png$/,".png")})}}();
```

##登録の仕方
1. まずこのページをブックマークに登録します。
2. 上記コードをコピーします。
3. 今登録したブックマークを編集する画面を開きます。
4. タイトルは好きな名前にし、URLのところに先ほどコピーしたコードをペーストします。

##使い方
1. [がっこうぐらし！公式サイト](http://gakkougurashi.com/)を開きます。
2. ブックマーク画面を開き、登録したブックマークレットを開きます。
3. 昼夜のバージョンが入れ替わります。2をすることで繰り返し使えます。

##元ソース
jQueryが使えるので使いました。キャラクター、スタッフ・キャスト、？？？のページは個別に対応が必要でした。

```js:
(function() {
  if (location.hostname !== "gakkougurashi.com") return;
  var path = location.pathname.split("/")[1];
  var morning = $("body").hasClass("morning");
  $("body").toggleClass("morning", !morning).toggleClass("night", morning);
  if (path !== "question") {
    $("#main_img").children("img").attr("src", "/core_sys/images/main/top/main_img" + (morning ? "_ni" : "") + ".jpg");
  } else {
    $("#main_img").children("img").attr("src", "/core_sys/images/main/cont/---/---" + (morning ? "---" : "") + ".jpg");
  }
  if (morning) {
    $("#side_top,#side_bottom").remove();
  } else {
    $("#side").prepend('<div id="side_top"></div>').append('<div id="side_bottom"></div>');
  }
  if (path === "chara") {
    $("#clbgo1,#clbgo2,#clbgo3,#clbgo4,#clbgo5,#clbgo6,#clbgo7,#clbgo8").each(function() {
      if (morning) {
        this.src = this.src.replace(/\.jpg$/, "ni.jpg");
      } else {
        this.src = this.src.replace(/ni\.jpg$/, ".jpg");
      }
    });
  }
  if (path === "staffcast") {
    $("#com_img1,#com_img2,#com_img3,#com_img4,#com_img5").children("img").each(function() {
      if (morning) {
        this.src = this.src.replace(/\.png$/, "ni.png");
      } else {
        this.src = this.src.replace(/ni\.png$/, ".png");
      }
    });
  }
})();
```

##その他
１０月１７日　ブックマークレットを更新しました。
(CentOS/RHEL6.x向け)VcXsrv・MobaXterm(・Xming)を利用してWindowsからLinuxサーバのGUIソフトで日本語入力を行う

#導入
WindowsからCentOSなどのLinuxサーバにSSHで接続してGUIソフトをX11Forwardingで起動した場合、そのままでは日本語が入力できません。ここでは特にCentOSなどRHEL系サーバでの設定方法を紹介します。但し、CentOS 6.7 + VcXsrv・MobaXtermでの動作確認になりますので、5.x/7.x系、RHEL系以外での動作確認はしていません。また、ここではサーバ側の日本語入力にiBusを使っていることが前提です。(6.x系ではデフォルトでibus-anthyっぽいので大丈夫だと思います)2つのXクライアントで動いたのでXmingでも大丈夫だと思います。

#設定方法
tcshなどC Shell系のシェルをログインシェルとして使っている場合、`.tcshrc`などに次の文を加えます。

```tcsh:.(t)cshrc
setenv GTK_IM_MODULE xim
setenv QT_IM_MODULE xim
if ( $?XMODIFIERS ) then
else
    setenv XMODIFIERS @im=ibus
    ibus-daemon -drx
endif
```

BashなどBourne Shell系を使っている場合は次のように入力するといいと思います。但し、動作確認はしていません。

```bash:.bashrc
export GTK_IM_MODULE=xim
export QT_IM_MODULE=xim
if [ -z "$XMODIFIERS" ]; then
    export XMODIFIERS=@im=ibus
    ibus-daemon -drx
fi
```

追記: いつも接続するサーバでいつの間にかできなくなっていましたが、`ibus-daemon -dx`の部分を`ibus-daemon -drx`に直すと再びできるようになりました。従って、上のシェリスクリプトを修正しました。

#仕組み
正直に言ってあまり分かっていないです。1・2行目は`xim`の代わりに`scim`・`uim`にしろっていうサイトもあるので`xim`でダメなら試行錯誤してください。3行目以降はLinux(iBusを使用しているもの)から接続した場合にiBusがダブらないようにするための設定です。iBus以外を使用している場合は1・2行目も含め適宜変更してください。

1・2行目ではそれぞれ`GTK_IM_MODULE`・`Qt_IM_MODUle`という名前の環境変数に`xim`という値をセットします。3行目以降では`XMODIFIERS`という環境変数に値がセットされていなければ値をセットし、`ibus-daemon`を起動します。iBusを使用しているLinuxから接続する場合は既にセットされているようなので、省いています。

#今までで入力できてたのにいつの間にかできなくなった時(追記)
シェルで

```bash
$ ibus-daemon -drx
```
と入力してみてください。
追記: Python2.7をソースビルドするとできなくなることがあります。(`ibus-setup &`でエラーが出て設定画面が出てこない)

#ログアウトしても端末が終了しない
原因不明です。

#ちょこっと参考にしたもの
1.[WindowsでXサーバを立てる - ふなWiki](http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=Windows%A4%C7X%A5%B5%A1%BC%A5%D0%A4%F2%CE%A9%A4%C6%A4%EB)
他にも数サイト参考にしています。(うまく検索に引っかからないです)
はじめてのコルーチン


## コルーチンとは

・戻り値の型がIEnumeratorでメソッド内にyield return　ステートメントがある
メソッドのこと。

実行すると
メソッド実行
↓
yield returnステートメントの位置で一旦処理中断
↓
条件満たしたあと、中断位置から再開

・メソッドの実行は通常1フレーム内で完了しますが、
コルーチンを使用するとメソッド途中で一定時間 もしくは非同期処理完了などを
待機することが可能に




例

```csharp:sample

using UnityEngine;
using System.Collections;

public class Corutine : MonoBehaviour {
	void Start () {
      // コルーチンの実行開始
	  StartCoroutine(WaitAndGo(1.0f));
	  Debug.Log("waiting...");
	}

	IEnumerator WaitAndGo(float duration){
	  Debug.Log("Ready...");
      // durationで指定された秒数だけ待つ
	  yield return new WaitForSeconds(duration);
	  Debug.Log("Go!");
	}
}

```

Ready.. waiting... Go! 
という順番で表示されます。
pip-toolsでrequirements.txtのパッケージバージョン番号を管理しよう

Pythonistaのみなさん、`requirements.txt`に書かれたパッケージのバージョンアップはどうしていますか？
定期的に[PyPI](https://pypi.python.org/pypi)の検索窓にパッケージ名をコピペしてバージョン番号を調べる、なんてことしていませんか？
[pip-tools](https://github.com/nvie/pip-tools)ならもっと楽に管理できます！

## インストール方法

pip(>=6.1)で以下のようにインストールできます。

```
pip install pip-tools
```

## pip-compileコマンドの使い方

`requirements.in`というファイルに、インストールしたいパッケージ名を書いてください。書き方は`requirements.txt`と同じです。

```text:requirements.in
Django
easy-thumbnails
Fabric
```

そして、以下のコマンドを実行すると、実行時の最新バージョン番号を指定した `requirements.txt` が生成されます。

```
pip-compile requirements.in
```

依存関係にあるパッケージも調べて書き出してくれます。
また、「このバージョン以上の最新」や「このバージョンの範囲で最新」という指定をしたい場合は以下のように書けます。
(これも`requirements.txt`の書き方と同じですね)

```text:requirements.in
Django>=1.8.0,<1.9.0
easy-thumbnails>=2.2
Fabric>=1.8.0,<2.0.0
```

## pip-syncコマンドの使い方

`pip install -r requirements.txt`の代わりに使えるコマンドです。
以下のコマンドで`requirements.txt`に書かれたパッケージをインストールします。

```
pip-sync
```

普通の`pip install`と違って、以前インストールしていたけど使わなくなったパッケージをアンインストールしてくれます。

## こんな使い方も便利かも

`pip-compile`には`--dry-run`オプションがあるので、`requirements.txt`を更新する前に、こんな風に以前生成した内容との違いを比較することができます。

```
pip-compile --dry-run requirements.in | diff requirements.txt -
```

これをCIやcronジョブで実行して、パッケージのバージョンアップが必要になったら自動通知されるようにしておくと、幸せになれるかもしれません。
iOSでのChromCast対応 ① 準備

仕事でアプリのChromeCast連携をしているのですが、文献が少なくて困ったのでまとめてみました。

今回は、アプリ内の動画のみを単純にCromeCastに送るということを目指して段階別に書いていきます。
言語: `Swift2.0`
環境: `xCode7.3(bata)`

### 関連記事はこちら。
* [iOSでのChromCast対応 ② Cast端末にアクセスする](http://qiita.com/ikemai/items/8fb801812f10b9bca402)
* [iOSでのChromCast対応 ③ 接続先に映像を送ってみる](http://qiita.com/ikemai/items/570edacba8f911cac433)

# 準備

## ① ライブラリをダウンロード 
 下記サイトより、`Download the iOS Sender API libraries.`をクリック
https://developers.google.com/cast/docs/developers#ios

今回は使いませんが、こちらはpodからもinstallできます。

```rody
target 'CastTest2' do
  pod 'google-cast-sdk'
end
```
## ② XCode新規作成
 今回は`CastTest2`という名前で作りました。

## ③ frameworkを入れる
 先ほどダウンロードしたGoogleCastFrameworkをXcodeの任意の場所にコピーしてください
 下記にあるものと一緒にセットします
```
GoogleCast.framework
SystemConfiguration.framework
MediaAccessibility.framework (for iOS 7 and later)
CoreText.framework (for iOS 7 and later)
 ```

 ![スクリーンショット 2015-09-11 14.32.00.png](https://qiita-image-store.s3.amazonaws.com/0/80770/7051b171-8398-d678-67aa-f2f50697f928.png)

## ④ SwiftでObjective-Cライブラリを使用できるようにする
GoogleCast.frameworkはObjective-Cで書かれているので、Swiftでも使えるようにします。
これはCastとは関係ないので、わかる人は読み飛ばしてください。

### 1. Headerファイルを作成
今回は`CastTest2-Bridging-Header.h`という名前にしています。

### 2. GoogleCast.hをimport
さきほど作ったファイルの中身は下記です。
`#import <GoogleCast/GoogleCast.h>`の行を追加してください。

```objc
#ifndef CastTest2_Bridging_Header_h
#define CastTest2_Bridging_Header_h

#import <GoogleCast/GoogleCast.h>

#endif /* CastTest2_Bridging_Header_h */
```

### 3. Build Settingsを変更
先ほど作ったファイルが呼び出されるようにします。
![スクリーンショット 2015-09-11 14.53.14.png](https://qiita-image-store.s3.amazonaws.com/0/80770/73583fac-9a62-f769-4391-e858bf823903.png)

### 4. `Other Linker Flags`に`-ObjC`を追加
※画像の"GesturePaker"は使用しているライブラリなので気にしないでください
![スクリーンショット 2015-09-11 18.38.14.png](https://qiita-image-store.s3.amazonaws.com/0/80770/fc2c903e-b02a-79c6-f10b-4b7c081ed383.png)

これで、frameworkが使えるようになりました。

-----------------------------------
以上で準備は完了です。
まちがっている点などありましたら、ご指摘いただけたら嬉しいです。

次回は簡単な情報をCastしてみるテストアプリを作成します。
では、[iOSでのChromCast対応 ② Cast端末にアクセスする](http://qiita.com/ikemai/items/8fb801812f10b9bca402)に続きます。

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

## 参考サイト
* 公式：基本的なiOSでの使い方が書かれています[iOS App Development](https://developers.google.com/cast/docs/ios_sender)
* 公式サンプル [CastHelloVideo-ios](https://github.com/googlecast/CastVideos-ios)
* [ChromecastのPreview SDKでChromecastDemoを動かすまで (iOS)](http://qiita.com/makoto_kw/items/12620b9242e7e8402523)
* [Chromecast - Google Cast SDKでオレオレPlay Musicをつくる](http://qiita.com/kubotaku1119/items/08895d2017dfa1523846)
CreateJS勉強中 画像読み込んでTweenJSでアニメーション

CreateJS勉強中。
画像を読み込んでアニメーションできたので書きます。


画像読み込み→
Bitmapクラスのインスタンスを作成して、
描画位置を指定してStageに追加。
↓
TweenJsでアニメーション



```html:sample

<script src="http://code.createjs.com/easeljs-0.8.0.min.js"></script>
<script src="https://code.createjs.com/tweenjs-0.6.1.min.js"></script>

<script>
;(function(){

  document.addEventListener('DOMContentLoaded', function(){
    // stageつくる
    var canvas = document.getElementById('canvas');
    var stage = new createjs.Stage(canvas);

    // 画像配置
    var img = new createjs.Bitmap('img/1.jpg');
    img.x = 0; img.y = 0;
    stage.addChild(img);

    // 2秒かけてx1000の位置まで移動
    createjs.Tween.get(img, {loop:true}).to({x:1000,y:0}, 2000);

    // tick
    createjs.Ticker.setFPS(60);
    createjs.Ticker.addEventListener('tick', draw, false);
    function draw(){
        stage.update();
    }
  }, false);

})();
</script>

```
WebサイトでLive2Dモデルを全身表示する

# 開発環境
・Live2D WebGL SDK 2.0.04_1
・SDKのSimpleプロジェクトをカスタム

# 全身表示されない？
WebGL版を触っていたら「ん？これLive2Dの全身が表示されてないじゃん」って今更ながら気付いた。
Live2D Modelerでは全身あってもWebGL上で全身表示されていないのね。
（左がWeb表示、右がModeler表示。Web表示で足が欠けてるのがわかる）
![001_.png](https://qiita-image-store.s3.amazonaws.com/0/15028/2695df7e-21af-e210-2ee6-d76dc4d8dc63.png)

ソースを見るとLive2Dモデルの横幅を元に正規化して表示してる部分があります。
（[ 2.0 / Live2Dモデルの横幅 ]にする事でCanvas上の座標を-1.0〜1.0にする事ができる）

```js:Simple.jsの209行目あたり
// 表示位置を指定するための行列を定義する
var s = 2.0 / live2DModel.getCanvasWidth();
var matrix4x4 = [
 s, 0, 0, 0,
 0,-s, 0, 0,
 0, 0, 1, 0,
-1, 1, 0, 1 ];
live2DModel.setMatrix(matrix4x4);
```
Live2D Modelerでmikuモデルの設定を見ると900 x 1200 pxになってました。
縦横のpxが同じなら全身表示されるけど、縦横が同じでないと全身表示されない…。

このあたりの行列の解説は、以前書いた以下の資料を参考にして下さい。
[Live2D x WebGL(3DCG Meetup #05)](http://slides.com/naotaro/live2dxwebgl#/3/5)　→　3/5〜3/8ページを参照

# 全身表示させてみる
という訳で全身表示されるように修正してみました。

```js:Simple.jsの209行目あたり
// 表示位置を指定するための行列を定義する
var w = live2DModel.getCanvasWidth();
var h = live2DModel.getCanvasHeight();
var s = 2.0 / h;    // canvas座標を-1.0〜1.0になるように正規化
var p = w / h;      // この計算でModelerのcanvasサイズを元に位置指定できる
var matrix4x4 = [
 s, 0, 0, 0,
 0,-s, 0, 0,
 0, 0, 1, 0,
-p, 1, 0, 1 ];
live2DModel.setMatrix(matrix4x4);
```
![003.png](https://qiita-image-store.s3.amazonaws.com/0/15028/6a78fbd8-096e-3335-edef-412a142d81af.png)


位置やスケールを調整したい場合は、行列の一番下の行をいじると変更できます。
本来は行列を掛け合わせて位置やスケールを変更すべきだけど、簡単に変更するならこれがベスト。

ちなみに一番下の行は左から「x位置, y位置, 0, スケール」になっています。
-1.0〜1.0の間でいじると位置やサイズ調整ができます。

```js:Simple.jsの214行目あたり
var matrix4x4 = [
 s, 0, 0, 0,
 0,-s, 0, 0,
 0, 0, 1, 0,
-p+0.3, 0.5, 0, 0.6 ];
```
![004.png](https://qiita-image-store.s3.amazonaws.com/0/15028/993b16da-2e36-9562-0fb8-90b12381d764.png)
【CSS3】Transition（変化）関連のまとめ

#**はじめに**

この記事は、HTMLとCSSの基礎知識がある方向けの内容です。
CSS3から変化するまでの時間などを指定できる、transition （トランジション）プロパティが追加されました。
ボタンにマウスカーソルを乗せたときに、色や大きさなどが変わる時間を設定するときに使われるプロパティです。

#**transitionプロパティについて**

transition（トランジション）は、直訳すると変化や移り変わりという意味です。
変化するまでの時間を設定するプロパティです。
transitionは、ショートハンドプロパティを含め5つのプロパティがあります。
ショートハンドプロパティのtransitionで一括て指定することも出来るし、それぞれのプロパティで個別に指定することもできます。

|No|プロパティ名|読み方|説明|
|:--|:--|:--|:--|
|01|transition-duration|トランジション・デュレーション|変化が始まって終わるまでの時間を指定します。|
|02|transition-property|トランジション・プロパティ|変化が適用されるCSSのプロパティを指定します。|
|03|transition-timing-function|トランジション・タイミング・ファンクション|変化の度合いを指定します。|
|04|transition-delay|トランジション・ディレイ|変化が始まる時間を指定します。|
|05|transition|トランジション|上記の4つのプロパティを一括で指定できる、ショートハンド・プロパティです。|

それぞれプロパティを見ていきましょう。

# 続きは Zenn で閲覧できます。

今まで無料で公開しておりましたが、記事を有料化しました。

- [【CSS3】transition（変化）関連のまとめ](https://zenn.dev/7968/books/aaf830b1b0cf4a)

2021 年 7 月 19 日　300 円

※ 調べて記事にまとめるのに 100 時間前後を費やしています。
※ 知識を得ること以外に時間短縮にもなるので、300 円以上の価値はあると思います。
※ 最初に購入した方々が損をしないように、値上げすることはあっても、値下げはしません。

# 他の CSS 関連の記事も Zenn で購入できます。

下記の記事も調べて記事にまとめるのに 100 時間前後を費やしているので、300 円以上の価値はあると思います。
ご興味のある方は、是非ご覧ください。

2021 年 7 月 19 日　各 300 円

- [【CSS3】transform（変形）関連のまとめ](https://zenn.dev/7968/books/e95d9d5a9a2852)
- [【CSS3】@keyframes と animation 関連のまとめ](https://zenn.dev/7968/books/14896406b4a8ac)
unity > スクリプトから動的にTagをGameObjectに設定する > .tag = "graphScale" > Tagは登録しておかないといけない

```txt:動作確認
Unity 5.2.0f3 on MacOS X 10.8.5
```

GameObjectにtagをスクリプトから設定する。
例として、tagは "graphScale”とする。

ただし、graphScaleは以下のようにタグリストに登録しておかないといけない。

![Main_unity_-_150911-textNearPanel_-_PC__Mac___Linux_Standalone__Personal__と_Assembly-CSharp_-_ButtonControl_cs_-_MonoDevelop-Unity.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/42bc2a25-d181-6869-5393-78599ac7682c.jpeg)

BottomLeftGOという名前のGameObjectのtagを設定するスクリプトは以下。

```
BottomLeftGO.tag = "graphScale";
```

"graphScale"というタグをタグリストに登録していない場合は以下のエラーとなる。

```
UnityException: Tag: graphScale is not defined.
```
UIPanGestureRecognizerでDragする。


[iOSアプリでドラッグ&ドロップしてみる件について](http://www.infoscoop.org/blogjp/2014/06/10/ios%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A7%E3%83%89%E3%83%A9%E3%83%83%E3%82%B0%E3%83%89%E3%83%AD%E3%83%83%E3%83%97/)をSwiftでやってみました。

##環境
* iOS: 8.4.1
* Xcode6
* ProjectTemplate: Single View Application

##Objectの用意
ドラッグするためのオブジェクトを用意します。今回はViewを置きました。右のピンクのViewで説明します！
![a.png](https://qiita-image-store.s3.amazonaws.com/0/81795/5891d9ac-9e08-d207-e8ed-5f69960973af.png "a.png")

##ドラッグの実装
まず、右下のオブジェクトがたくさんあるところから、Pan Gesture RecognizerをドラッグしたいViewにドラッグアンドドロップします。
そしたら、このタッチイベントの宣言とアクション紐付けします。
Main.storyboardでViewController.swiftと２画面開いて、OutletとActionで紐付けします。
typeをUIPanGestureRecognizerにしてnameはpanGestureにしてあります。

```Swift:ViewController.swift

    @IBOutlet var panGesture: UIPanGestureRecognizer! //紐付けすると出てきます。
    
    @IBAction func dragGesture(sender: UIPanGestureRecognizer) {　//こちらも紐付けによって
   
        var point: CGPoint = sender.translationInView(self.view)
        var movedPoint: CGPoint = CGPointMake(sender.view!.center.x + point.x,
        sender.view!.center.y + point.y)
        sender.view!.center = movedPoint
        sender.setTranslation(CGPointZero, inView: self.view)
    }
    
```

初めの方の紐付けがちゃんとできてれば動く！
Linux端末にてHDDのブートローダーを消してUSBブートさせた

PCの起動デバイスを選択できないLinux端末にてHDDのブートローダーを消してUSBブートさせる方法

## 起動順位

1. DISK
2. USBデバイス
3. ネットワークブート

となっている。
DISKからBOOTしているがUSBデバイスから起動させたい。
しかしキーボードのF2やF7、F11が効かず困った。
(LivaPC + HHK Lite2)

## 解決案

* DISKからBOOTしている場合、DISKからブートローダーを消せば良いのでは。

## 方法

```bash:DISKが/dev/mmcblk0の場合
dd if=/dev/urandom of=/dev/mmcblk0
```

```bash:DISKが/dev/sdaの場合
dd if=/dev/urandom of=/dev/sda
```

多分 /dev/zero でもいけるかと思う。
200MBほど書き込んで中断し、再起動したところ期待したとおり
DISKからブートせずUSBデバイスからブートしてくれてOS再インストールできた。


## ダメだった方法

* fdiskでパーティション削除
* parted
  * 「DISK使用中」エラーで実施できない。
AngularJSでデータを共有するServiceの雛形(CoffeeScript版)

- ネットにコレっ!!という情報が見受けられなかった
- FactoryとServiceの使い分けがよくわかんない
- とにかくコピペですぐ動く奴が欲しい

という2,3日前の私みたいなぬるいエンジニアのために。つっこみどころ多数と思われますが、さしあたって動く！

```lang:index.html
<!doctype html>
<html ng-app="myApp">
<head>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script>
    <script type="text/javascript" src="hoge.js"></script>
</head>
<body>
    <div ng-controller="AbcCtrl">
        AbcCtrl :<input ng-model="data_a.number">
        <button ng-click="reset()">reset</button>
    </div>
    <div ng-controller="XyzCtrl">
        XyzCtrl :<input ng-model='hoge.get_data().number'>
        <button ng-click="hoge.double()">double</button>
    </div>
</body>
</html>
```

```lang:hoge.js
(->
  angular.module('myApp', [])
)()

(->
  HogeService = () ->
    # このserviceを使って共有するprivate data
    data = {
      number: 2 # 初期データをここで設定してもいいし
      ary: []
      obj: {}
    }

    # private method的なナニか
    init = () ->
      data.number = 123

    # constructor的なナニか
    data.ary = [1, 2, 3] # ここで初期化するのもあり
    init()

    # public method的な人達
    get_data: -> # ゲッター
      data
    double: ->
      data.number = data.number * 2
    reset: ->
      init()

  angular.module('myApp')
    .service 'HogeService', HogeService
)()

(->
  angular.module('myApp')
    .controller 'AbcCtrl', ($scope, HogeService) ->
      $scope.data_a = HogeService.get_data()
      $scope.reset = HogeService.reset
    .controller 'XyzCtrl', ($scope, HogeService) ->
      $scope.hoge = HogeService # この方式でもいける
)()
```
※ hoge.jsは複数ファイルに分割されるのを想定して書いてます

![1.png](https://qiita-image-store.s3.amazonaws.com/0/48588/0a44e1d3-63c9-a144-88e1-f2975fb2c493.png)
ちゃんと**双方向データバインド**されます。
非同期の再試行をシンプルに。


「[プロミス処理のラッパーをつくる](http://qiita.com/japboy/items/74fa0cb93baa6466e505)」という記事でつくった Promise ラッパーで非同期処理が捗っているので進捗報告。

**(追記) ここで書いた関数は Promise のアンチパターンである "explicit construction" になってて、それで Promise チェーンが機能してなかった。恥ずかしながら、修正しました。**


# n * 1000 ミリ秒間隔で n 回再試行

Promise 化した処理をタイトル通り繰り返し処理したい時に使える関数:

```javascript
var count = function (done, times, interval) {
  return done()
  .then(function (dat) {
    return dat;
  }, function (err) {
    if (1 >= times) return err;
    return sleep(interval)  // 下記で解説
    .then(function () {
      return count(done, times - 1, interval);
    });
  });
};

// ※ 当初 `promisify` 高階関数でラップしてたけど、不要だしアンチパターンでした。お恥ずかしい。
```


## 使用例

```javascript
// Underscore.js と jQuery が必要

var ajaxOpts = {
  data: { foo: 'bar' },
  method: 'GET'
};
count(_.bind($.ajax, undefined, '//example.com/no/existence', ajaxOpts), 3, 1000)
.then(function (resp) {
  // 1 秒間隔で最大 3 回再試行してレスポンスが得られた場合
}, function (jqXHR) {
  // 1 秒間隔で最大 3 回再試行してエラーだった場合
});
```

上記例は複雑なパターンだけど、`$.ajax` が Promise を返す関数なので、それを `count` に渡すと、1 秒間隔で最大 3 回再試行してくれる。`count` は高階関数じゃないので、`$.ajax` の引数が受けられない。なので、`_.bind` で `$.ajax` にも然るべき引数を与えている。


## 依存関数

上記関数内で使用している Promise タイマー関数はこちら:

```javascript
// 「プロミス処理のラッパーをつくる」でつくった `promisify` 関数が必要

var sleep = promisify(function (resolve, reject, millisec) {
  if (!millisec) millisec = 80;
  var timeoutId = setTimeout(function () {
    clearTimeout(timeoutId);
    resolve(millisec);
  }, millisec);
});
```


# n * 1000 ミリ秒間に可能な限り再試行

こっちは制限時間内に可能な限り繰り返し処理したい時に使える関数:

```javascript
// Underscore.js が必要

var tick = function (done, duration, start) {
  if (!_.isNumber(start)) start = +(new Date());
  return done()
  .then(function (dat) {
    return dat;
  }, function (err) {
    var stop = +(new Date());
    if (duration > stop - start) return tick(done, duration, start);
    return err;
  });
};

// ※ 当初 `promisify` 高階関数でラップしてたけど、不要だしアンチパターンでした。お恥ずかしい。
```


## 使用例

```javascript
// Underscore.js と jQuery が必要

var ajaxOpts = {
  data: { foo: 'bar' },
  method: 'GET'
};
tick(_.bind($.ajax, undefined, '//example.com/no/existence', ajaxOpts), 3000)
.then(function (resp) {
  // 3 秒間に可能な限り再試行してレスポンスが得られた場合
}, function (jqXHR) {
  // 3 秒間に可能な限り再試行してエラーだった場合
});
```

これは前述のパターンと同じなので省略。

これ捗りそう...!


# 謝辞

- [A few general patterns for retries using promises](https://gist.github.com/briancavalier/842626)
- [gist:593052](https://gist.github.com/kriskowal/593052)
- [javascript - What is wrong with this recursive Promise function with jQuery Deferred - Stack Overflow](http://stackoverflow.com/questions/32643861/what-is-wrong-with-this-recursive-promise-function-with-jquery-deferred)
Python OpenCV導入メモ

通常の手順

https://jjyap.wordpress.com/2014/05/24/installing-opencv-2-4-9-on-mac-osx-with-python-support/

virtual envの環境に対応させたい場合は

```
ln -s /usr/local/Cellar/opencv/2.4.9/lib/python2.7/site-packages/cv.py バーチャル環境/cv.py
ln -s /usr/local/Cellar/opencv/2.4.9/lib/python2.7/site-packages/cv2.so バーチャル環境/cv2.so
```

segmentation fault 11が出たとき

Pythonのパスを通すと直る(opencvが入った)

export PYTHONPATH="/usr/local/lib/python2.7/site-packages/:$PYTHONPATH"


http://qiita.com/meganii/items/b268bcab8b8afe62b5e2

#Ubuntuの場合

http://www.pyimagesearch.com/2015/06/22/install-opencv-3-0-and-python-2-7-on-ubuntu/