OmniAICreator/Qiita-1.07M huggingface dataset:
Android4.2系でヘッダーが固定されない

#Android4.2系でヘッダーが固定されない

Android4.2系のデフォルトブラウザで、スクロール時にヘッダーが固定されない問題があるようです。

* * *

```lang:css
.header {
　display: block;
　position: fixed;
　z-index: 100;
}
```
上記のように**position: fixed;**を用いて、固定をするやり方が、基本的というか一般的。
Android4.2系のデフォルトブラウザ以外であれば、問題なくこれで固定が可能。


自分が確認したかぎりだと、ページをスクロールすると、固定していたはずのヘッダーが突然消え、
スクロールが終わると、突然ページど真ん中にどーん！っと出現。そのうえ、そのままの状態でスクロールを行うと、ど真ん中で固定が行われてしまうのだ。


でも、直す方法は一応あるみたいです！
以下の方法で試してみてください。
* * *


##■方法その1##
*cssでfixedを行わず、jqueryでfixedを行う。*

```lang:javascript
$(function() {
	//ロード or スクロールされると実行
	$(window).on('load scroll', function(){
		
		//ヘッダーの高さ分(80px)スクロールすると.headerクラスを追加
		if ($(window).scrollTop() > 80) {
			$('header').addClass('.header');
		} else {
			//80px以下だとfixedクラスを削除
			$('header').removeClass('.header');
		}
	});
});
```

##■方法その2##
*jQuery-mobileで対応する。*
[jQuery Mobile Download Builder](http://jquerymobile.com/download-builder/)


上記のリンク先で以下の３つにチェックを入れて、
Toolbars: Fixed
Toolbars: Fixed: Workarounds
Toolbars: Fixed
ページ最下部の「Build my download」ボタンを押し、DLします。
続いて、DLしたファイルをアップロード＆読み込み。

```lang:javascript
<script language="JavaScript" type="text/javascript"　src="/js/jquery.mobile.custom.js"></script>
```
固定したい要素にdata-role=”header”とdata-position=”fixed”を追加。

固定させたい.headerに以下の属性を追加させる。

```lang:html
<div class="header" data-role="header" data-position="fixed">
　　～～～～～～
</div>
```

##最後に##

これでおそらくヘッダーの固定は問題なく表示されると思います。

今更ながらですが、Androidのスマホを所有している人では、バージョンのばらつきが結構あるんですね、同時に、古いバージョンでも根強く利用されているということも。。
面倒な対応であることは間違いないですが、これも我慢です！がんばりましょう
南の島に逃げるには？

よく夢見るのが南の島に逃げることですね。
まあ、国内で考えると、沖縄か小笠原。
現実的には飛行機で行ける沖縄かな？ｗ

では、南の島（沖縄方面）に逃げましょう。

# LCCも当日は高い

よくLCCは安いというイメージがあるけど、当日はそうでもない。
当日購入するんだったら、金券ショップで株主優待券を購入してJALかANAでチケットを購入した方が安いｗ

１週間前とかなら、実は羽田からの便が安かったりするし、カードでマイルをコツコツ貯めていれば、
マイレージの特典航空券で行けたりもする。

まあ、南の島は飛行機しか手段が無いと思った方が良いし、
成田発のLCCは、成田までの交通費と時間が加算されることをお忘れ無くｗ


# 宿泊先はどうする？

漫画喫茶で連泊より、バックパッカー向けの安宿が結構ある。
昼間はスタバとか漫喫に逃げて、夜寝に帰ってくれば良いんじゃね？

それか、ウィークリーマンション兼民宿ってところもあるので、
選択肢は豊富。

お金持ちは、リゾートホテルに泊まっちゃえYO！！

# 現地で仕事を探すには？

現地の会社に就職するつもりだったら、給与は期待しない方が良い。
最低賃金が東京より低いのは有名だしね。
あと、東京の大手IT系企業が、現地民を低賃金で雇っていたりしていたという噂もちらほら。
渋谷で働く人の給与の半額以下ってこともあったらしい。

これは田舎にはよくある話で、地元でコネクションを持っている人が支配していて、
余所者は排除されやすいって話し。田舎なので。。。

南の島は、「作業するにはいい」場所かもしれないけど、「現地で働く」には厳しい環境かも。

まあ、一時的に逃亡するだけにした方が良いかも。
konashiをWebから使う

# はじめに
BLEを簡単に制御できるということで、konashiを買ってみました。
これはWebで制御する方法が良く分からなかったので書いています。

# 購入したもの（ハードウエア）
konashi 2.0
本体、電池、説明書（B5)がついていました。
![konashi1.png](https://qiita-image-store.s3.amazonaws.com/0/97061/ccf4ce2e-eb91-9a54-b08d-907dd132a08a.png)

# 準備
iPhoneなどの対応機種に以下のアプリを入れます。(App Storeから)
- konashi.js
- LightBlue　Bluetoothの確認用です。

# HTML
k.findWithName("konashi2-f0276c");行のkonashi2-f0276cは、LightBlueで見えたIDに変更してください。

```html:test.html
<html>
<head>
<title>konashi Test</title>
<script src="http://konashi.ux-xu.com/kjs/konashi-bridge.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script type="text/javascript" >
k.ready(function(){
	document.getElementById("txt").innerHTML="Connected";
	k.pinMode(k.PIO2, k.OUTPUT);
});

k.peripheralNotFound(function(){
	document.getElementById("txt").innerHTML="NoFound Terminal";
});

k.disconnected(function(){
	document.getElementById("txt").innerHTML="Disconnected";
});

$(function(){
	$("#btnC").click(function(){
      		k.findWithName("konashi2-f0276c");
		document.getElementById("txt").innerHTML="Connecting";
	});
	$("#btnD").click(function(){
		k.disconnect();
		document.getElementById("txt").innerHTML="Disconnecting";
	});
	$("#btn1").click(function(){
      		k.digitalWrite(k.PIO2, k.HIGH);
		document.getElementById("txt").innerHTML="LED On";
	});
	$("#btn2").click(function(){
		k.digitalWrite(k.PIO2, k.LOW);
		document.getElementById("txt").innerHTML="LED Off";
	});
});
</script>
</head>
<body>
<div id="txt">text</div>
<br />
<button id="btnC">Connect</button>
<br />
<button id="btn1">LED On</button>
<br />
<button id="btn2">LED Off</button>
<br />
<button id="btnD">Disconnect</button>
</body>
</html>
```
# 実行
実行は、konashi.jsアプリ内のWebブラウザを使います。Safariでは実行できませんでした。
# 参考
http://konashi.ux-xu.com/documents/
Perl6でのファイル操作

Perl6の基本的なファイル操作を示します. (ほとんど参考 URLのままですが...)


## ファイルの読み出し(Perl5スタイル)

`open`関数で `IO::Handle`インスタンスが返ってきます. `open`の第二引数でファイルの開き方を指定します. `:r`がリードオンリー, `:w`が書き出し可能, `:a`が追記書き出しとなります. バイナリの場合は `:bin`を与える必要があります.

```
#!/usr/bin/env perl6
use v6;

sub MAIN($file) { # コマンドライン引数の第一引数としてファイルを受け取る
    my $fh = open $file, :r;
    print $fh.slurp-rest;
    $fh.close;
}
```

### バイナリファイルの読み出し

`open`に `:bin`フラグを渡します. バイナリを書き出す際も注意が必要です. Blobに変換し, それを受け取る writeメソッドで書き出します.

```
#!/usr/bin/env perl6
use v6;

sub MAIN($file) {
    my $fh = open $file, :bin, :r;
    $*OUT.write($fh.slurp-rest(:bin));
    $fh.close;
}
```

## ファイルの読み出し

Strインスタンスに`IO`メソッドを呼び出すと `IO::Path`インスタンスが返ってきます. これにより明示的に openすることなくファイルの読み出しが行えます.

```
#!/usr/bin/env perl6
use v6;

sub MAIN($file) {
    print $file.IO.slurp;
}
```

## ファイルの書き出し

`open`で `:w`フラグを指定します.

```
#!/usr/bin/env perl6
use v6;

sub MAIN($file) {
    my $fh = open $file, :w;
    $fh.say("こんにちわ世界");
    $fh.close;
}
```

### バイナリファイルの書き出し

`open`で `:bin`を指定し, 書き出すときは `write`で `Blob`を渡す.

```
#!/usr/bin/env perl6
use v6;

sub MAIN($file) {
    my $fh = open $file, :w, :bin;
    $fh.write("こんにちわ世界\n".encode("utf-8"));
    $fh.close;
}
```

## 一行ずつ読みだして処理

IO::Handleの `lines`で遅延リストが返ってきます. それを for文で処理することで毎行の処理ができます.

```
#!/usr/bin/env perl6
use v6;

sub MAIN($file) {
    my $fh = open $file, :r;
    for $fh.lines -> $line {
        say "@@ $line";
    }
    $fh.close;
}
```

## おわりに

Perl6の簡単なファイル操作を示しました. Perl5ほどシンプルではないかもしれないですが, 型情報もありうっかりミスは減るので悪いものではないと思っています.



## 参考

- [Input/Output](http://doc.perl6.org/language/io)
t2.nano インスタンスで Hubot

今日 Amazon EC2 にアップデートがあって [t2.nano インスタンス](http://aws.typepad.com/aws_japan/2015/12/ec2-update-t2-nano-instances-now-available.html) が使えるようになりました。オンデマンドインスタンスでも月 $7 くらいなので [Heroku の Hobby プラン](https://www.heroku.com/pricing) と価格帯が並んだことになります。

今まで EC2 で Hubot を動かそうとすると「 t2.micro でもスペック過剰だし高い」という感じだったので、新しい t2.nano は Hubot を動かすのに最適なのではないでしょうか。

というわけで「 t2.nano でも Hubot 動くかな？」と思って試してみたら普通に動いた、というだけの雑なネタです。所要時間 10 分くらいです。

## インスタンスを立ててログインする
OS は Amazon Linux を選びました。

詳しい説明は割愛します。

## はじめにやること
git が入ってないので入れます。

```
sudo yum update
sudo yum upgrade
sudo yum install git
```

## Node.js をインストール
[tagomoris/xbuild](https://github.com/tagomoris/xbuild) を使うと楽です。

```
git clone https://github.com/tagomoris/xbuild.git
xbuild/node-install v4.2.3 ~/local/node
echo 'export PATH=$HOME/local/node/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```

## Redis をインストール
hubot-brain 使わないなら入れなくていいです。

```
sudo yum --enablerepo=epel install redis
sudo service redis start
sudo chkconfig redis on
```

## 新しい Hubot を作成
既に自分の Hubot がある場合は `git clone` とかして落とすだけでいいです。

今回は Slack で動かしたかったので、Adapter は slack と入力して、Slack の設定画面から新しい Hubot Configuration を追加して TOKEN を生成しておきます。

```
npm install -g yo generator-hubot
mkdir hubot
cd hubot
yo hubot
echo "HUBOT_SLACK_TOKEN='xoxb-12345678-xxxxxxxxxxxxxxxx'" >> .env
```

## 動かしてみる
特に意味は無いですが今回は [node-foreman](https://www.npmjs.com/package/foreman) を入れて動かしました。

```
npm install -g foreman
nf start
```

## 永続化 (Daemonize) する
foreman だけでは永続化出来ない？っぽいですね。
[forever](https://www.npmjs.com/package/forever) とか使うといいと思います。

## まとめ
t2.nano でも普通に Hubot は動きました。
軽いノリで Hubot を動かしたいときは AWS でも Heroku でも好きなサービスを使うといいでしょう。
Androidアプリでステータスバーに通知を出すやりかた。


## 通知をクリックしたときのインテントをつくる

    Intent notificationIntent = new Intent(this, XXXActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this,0,notificationIntent,0);


ステータスバーに現れる通知をタップしたときに作動するインテントを先に作っておく。
PendingIntentは指定したタイミングで発行できるIntentのよう。（この場合は、通知をタップしたら発行する感じ）

## 通知用のオブジェクトをつくる

・実際の通知を作るためのBuilderを作成

    Notification.Builder builder = new Notification.Builder(this);

・実際に通知を発行するmanagerを作成

    NotificationManager manager= (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

・通知の中身をbuilderに設定していく

    builder.setSmallIcon(R.drawble.XXX_ICON);
    builder.setContentTitle("TITLE iS XX");
    builder.setContentText("Text is XX");
    builder.setDefaults(Notification.PRIORITY_DEFAULT);
    builder.setContentIntent(contentIntent)
    
    etc・・・

このとき、一行目のSmallIconの設定を忘れると、通知が表示されません。エラーにもならないので、わけわからんかった。。
ちなみに、最後の行では、最初に作ったPendingIntentを設定して、通知がタップされたらこの場合は、XXXActivityが呼ばれるようになります。

## 通知
あとは、作った通知をマネージャーを使用して出力するだけです。

    manager.notify(1,builder.build());

notifyメソッドの最初の引数は、通知を識別するためのInt型のID、二つ目は、先ほど作った通知です。

## アイコンがめんどい
アイコン設定しないと、何も通知されないっていう罠が憎かったのですが、おかげでこんないいプラグインを見つけました。うれしい。

AndroidDrawbleImporter
http://qiita.com/verno3632/items/8f432fc40f4cd2dd5325

resフォルダ以下に画像を見ながら選択したアイコンを自動的に解像度ごとに設置してくれるすぐれもの。

以上です。
data操作系 command 紹介

ROMAの基本的なデータ操作系コマンドの紹介です

# set
データを格納するコマンド

```bash
set <key> <flags> <exptime> <bytes>\r\n
<value>\r\n 
```
```rb:example
> set foo 0 0 3
> bar
STORED
```

# get/gets
データ取得コマンド
getsコマンド場合クロックも取得できる

```bash
get <key>\r\n
gets <key>\r\n
```
```rb:example
> get foo
VALUE foo 0 3
bar
END

> gets foo
VALUE foo 0 3 0
bar
END
```

# add
データを新規に格納するコマンド
既にkeyが存在する場合は格納できない

```bash
add <key> <flags> <exptime> <bytes>\r\n
<value>\r\n 
```
```rb:example
> add hoge 0 0 4
> fuga
STORED

> add hoge 0 0 4
> aaaa
NOT_STORED
```

# replace
データを入れ替えコマンド
keyが存在しない場合は格納できない

```bash
replace <key> <flags> <exptime> <bytes>\r\n
<value>\r\n 
```
```rb:example
> replace hoge 0 0 4
> fuga
STORED

> replace fizz 0 0 4
> bazz
NOT_STORED
```

# cas
check and set
論理クロックの確認をして、一致すればデータの格納を行う

```bash
cas <key> <flags> <exptime> <bytes> <cas-id>\r\n
<value>\r\n 
```
```rb:example
> gets hoge
VALUE hoge 0 4 3
fuga
END

> cas hoge 0 0 4 2
> fizz
EXISTS

> cas hoge 0 0 4 3
> fizz
STORED
```

# set_expt
expired timeを変更するコマンド

```bash
set_expt <key> <expt>\r\n
```
```rb:example
> set_expt hoge 60
STORED
```

# get_expt
expired timeを確認するコマンド
unixオプションをつけるとUNIXTIME形式で返す

```bash
get_expt <key> [unix]\r\n
```
```rb:example
> get_expt hoge
2015-12-16 07:41:42 +0000
END

> get_expt hoge unix
1450251702
END
```

# delete
データ削除コマンド
deleteコマンドで論理削除され、それから5日後に物理削除される

```bash
delete <key>\r\n
```
```rb:example
> delete hoge
DELETED
```

# get_key_info
keyの情報を取得する

```bash
get_key_info <key>\r\n 
```
```bash
> get_key_info foo
d = 3522174797 0xd1f01f4d
vn = 3514826752 0xd1800000
nodes = ["192.168.33.12_10002", "192.168.33.12_10003", "192.168.33.12_10001"]
END
```

##その他あんまり使用頻度は高くないかもしれないコマンド

## append/prepend
既存のデータの先頭か末尾にデータを追加する

```bash
append <key> <flags> <exptime> <bytes>\r\n
<value>\r\n 
```
```bash
prepend <key> <flags> <exptime> <bytes>\r\n
<value>\r\n 
```

## incr/decr
Numericデータの加減を行う

```bash
incr <key> <digit>\r\n\
```
```bash
decr <key> <digit>\r\n
```

# 参照URL
ROMA Commands Page: http://roma-kvs.org/commands.html
vim-watchdogsでエラーをquickfix listに出した後、カーソルをquickfix listのウィンドウに移動させない

# 概要

[vim-watchdogs](https://github.com/osyo-manga/vim-watchdogs)というプラグインを使っていて気になった、掲題の問題を設定で頑張って回避した、というお話です。

# 修正事項

vim-quickrunの仕様が変わり、こちらの設定は不要になりました（関連すると思しき修正: [dbfadf7b56b6](https://github.com/thinca/vim-quickrun/commit/dbfadf7b56b62d1daca5b1346e01cc7bd08b9d89)）。
更新しましょう！ :arrow_up:
@thinca さんありがとう！

# 問題

上記の[vim-watchdogs](https://github.com/osyo-manga/vim-watchdogs)というプラグイン、
設定するとファイルを保存した時に自動でチェック用のコマンドを**非同期で**実行し、結果をquickfix listなどに出してくれるという優れものです。
[syntastic](https://github.com/scrooloose/syntastic)の非同期実行版といえば通じる方もいらっしゃるでしょう。
私はこのvim-watchdogsで、比較的実行時間が長くかかるRubocopやESLintを実行しているのですが、一つ困った問題がありました。

コマンドの実行結果がquickfix listに表示された後、quickfix listにカーソルが意図せず飛んでしまうのです。
実際にはそれ自体は仕様なのですが、私の利用環境では次のような問題がありました。

0. :weary: 既存の大抵のファイルにおいて保存時に大量にエラーが出てしまうため、優先して編集したいことに集中できない。
    - プロジェクトのコードベースが大きくなってからRubocopを導入したので...。
0. :weary: しかもそれが非同期に発生するため「とりあえず一旦保存する」=\>「他の箇所を編集」している間にカーソルがquickfix listに飛び、ますますイラッとくる。

# 解決方法

[vim-watchdogs](https://github.com/osyo-manga/vim-watchdogs)が依存している、[vim-quickrun](https://github.com/thinca/vim-quickrun)の設定をいじりました。
:point_down: のように変えましょう。


```vim:.vimrc
function! GoToPreviousWindowWhenQf() abort
  if &filetype == 'qf'
    wincmd p
  endif
endfunction
let g:quickrun_config = {
      \   "_": {
      \     "outputter/quickfix/open_cmd" : "cwindow | call GoToPreviousWindowWhenQf()"
      \   },
      \ }
```

私が探した限りドキュメントには見当たらなかったのですが、`outputter/quickfix/open_cmd`という箇所に、
コマンドを実行した後、quickfix listを開くときのコマンドを設定できるようです（デフォルトは`cwindow`）。
なので、デフォルトの`cwindow`コマンドでquickfix listを開い（て、カーソルをquickfix listに移動させ）た後、
`wincmd p`コマンドで移動させる前のウィンドウに戻るよう設定しました。
`GoToPreviousWindowWhenQf`では`wincmd p`を実行する前に、現在のバッファーがquickfix listか確認しています。
そうしないとエラーがなかった時にウィンドウを複数開いていた場合、無関係なウィンドウに移動してしまうので。
フリーランスのための逃亡入門

お仕事していて、辛くなると逃亡したくなりますよね。

会社員だと、会社が休みをくれたり、退職勧告くらったりしますが、
フリーランスは、会社員というラッピングクラスは無いので、即無職が即死亡に繋がるのです。

そうは言っても「だってにんげんだもの」なんで、精神衛生上逃げ道を作らないと、
人間が壊れてしまうものです。

まあ、フリーランスの精神衛生上の手助けになれば良いなと思って

# まずは休む

自宅で仕事をしていると、どこで休んで良いのかわかりませんが、
とりあえず、漫画喫茶とか今流行のハンドドリップ系の喫茶店で何もせずか好きな本やコミックを
読んでぼーっとするのはどうでしょう？
もちろん、スマフォや携帯の電源はOFFにしてね！

# ちょっと遠いノマドをする

自宅やいつものコワーキングスペースを使っていると休んでいる気にならないので、
少し旅に出て遠くのコワーキングスペースにノマドしに行きましょう。

コワーキングスペースでなくても、西海岸系のカフェは無線LANと電源が用意されているので、
そんなところに行くのも可。

それだけでも気分転換になりますよ。

# それでもツライときは、心療内科や精神科に受診する

まあ、保険が効くので初診はだいたい3,000円から5,000円くらい。１万円あれば薬代も大丈夫。
Google先生に聞けば、近所の心療内科や精神科の情報は教えてくれます。

意外と近所に多かったｗ（経験談）

医者の処方する薬なので、効き目はしっかりしています。（いろんな意味で）

まあ、歯医者と一緒で、自分にこのお医者さんは相性が合わないなと思ったら、違うお医者さんに
変えましょう。

化学の力に頼って、心を休むのもオススメですよ。マジで


# 最後は、旅に出る

旅は人間を大きく成長させてくれたり、気づいていなかった自分を見つけることが出来ると思います。

まあ、行き先は誰かしらに告げておこうね。
知り合いが突然旅に出てしまい、家族から捜索願いを出されてしまった奴がいるので。


ノートパソコン１台と電源と通信環境さえあれば、どこでも仕事が出来るのがこの業種のメリットです。
旅に行こうぜ！（ォィ
VPC内にWindowsでDNSを構築し、ProvidedDNSをforward先に指定する


#したいこと

Route53（PrivateDNS）の設定をした後に、
オンプレの環境からVPC内のProvidedDNSに対して名前解決を行い回答をもらう。

#直接はできないんです

オンプレの環境からVPC内のProvidedDNSに対して名前解決を行いたい！とAWSに聞いてみた。
AWSサポートからの回答
・オンプレミス環境からVPC内のデフォルトDNSサーバに対して名前解決することはできない
・必要な場合には、VPC内のEC2インスタンスにDNSサービスを構築し、forwarder先としてVPC内のデフォルトDNSサーバとすれば実現可能

#DNSを構築しよう@Windows2012R2

##前提
対象のVPCに対してRoute53(PrivateDNS)で正引き/逆引きのZone設定を行っていること
※PrivateDNSについては時間が有れば書きます。

##環境
VPC：192.168.0.0/16
→ProvidedDNSはVPC+2の「192.168.0.2」ということになる。
OS:Windows2012R2
※サーバにEIPをアタッチしておいてください

SecurityGroupは適宜設定をお願いします。

##役割の追加

ServerManager>Role>Add Roles
DNS Serverをインストール
つぎへつぎへ

##DNSのForwarder設定
DNS Manager>サーバ名を右クリック>Properties>Forwarders
Edit>ProvidedDNS（VPC+2）を入力しEnter>OK>Apply>OK

#テスト3つ※DNSサーバはすべてPrivateIPで指定する

①DNSサーバ上から127.0.0.1を指定して、
nslookupで名前解決のテストを行う

②同一ネットワークから上記DNSサーバを指定してnslookup

③VPC外のサーバorクライアントから上記DNSサーバを指定してnslookup
はじめてのTouch Designer

#TouchDesignerとは
・インタラクティブなメディア作品、建築物などへのプロジェクションマッピング、ライブイベントでのVJ等の映像を、コードを書くことなく、ビジュアルプログラミング方式で簡単に制作することができるソフトウェアです

#作品事例
http://www.shuhei-matsuyama.com/#!portfolio/c1han

#ダウンロード
2015.12.16現在の最新のTouchDesignerは58140になります。以下のURLからダウンロードしてください。
https://www.derivative.ca/088/Downloads/


#システム要件
グラフィックドライバーの相性などもあるので、合わせてご確認ください。

PC
- Windows 7, Windows 8
- NVIDIA Geforce 8000 又は 最新のQuadro graphics カード(Quadro NVS cardsはサポートしていません)
- AMD Radeon HD 6000 又は、最新のAMD FireProカード
- （最低）512MB GPUメモリ
- 最新のデバイスドライバ

Tablet
- Microsoft Surface Pro 3/2


#有ったほうが良いもの
- ３つボタンマウス
- 中央のボタンがホイールになっているものは拡大縮小もしやすいので、便利です。

#最初にチェックするべきチュートリアル
http://www.interestingresults.com/
http://www.derivative.ca/wiki088/index.php?title=Category%3ATutorials

英語なサイトですが、動画で解説している項目もあるので、ひるまずトライしてください！

#ヘルプ情報入手先
TouchDesignerを起動して、上部にあるHELPメニューからTouchDesigner snippetというのがあるので、それを起動すると、各OPのサンプルが見れます。
ソフトウェアのダウンロードの場所に、オフラインで使用できるヘルプファイルもあります。

#ライセンス
個人利用は無料で使用できますが、商用利用には、ライセンスが必要です。ライセンスの購入は、以下のリンクから行えます。
http://www.derivative.ca/store
一人ぼっちの運用

何だかんだ言っても、いざ運用となると一人で仕事をしていると一人で運用になってしまいますね。

「ひとりぼっちの宇宙戦争」という名作がありますが、それを元に「一人ぼっちの運用」なんてポエム
を書きます。

# 一人で運用すると何がヤバイ？

・一人で対応しないといけない
・誰も助けてくれない
・夜中はツライ
・明け方はもっとツライ
・休みの日はかなりツライ

こんなにつらい事だらけで、メリットなんかあるのか？なんてお思いでしょうが、
バグとトラブルさえ起こさなければ、掛け捨ての損害保険みたいなもので、不労所得として
フリーランスには安定収入源になったりします。

小さな額でも、毎月定期的に収入を得られる運用保守業務は大事にしましょう！

# じゃあ、何か解決してくれるものあるの？

一番頼りになるのが、運用監視ツールです。
一昔前は、nagios一色でしたが、現在はZABBIX一色ですねｗ

ようは、監視対象のサーバに定期的にpingを打ったり、HTTPでアクセスしたり、対象側のログを抽出したりして、しきい値を超えたらメールを四六時中投げてきやがる奴です。

まあ、突然サーバが死んで、お客さんが激おこで電話かけてこられるよりは精神的には良いでしょうｗ
（自分は、何度か経験がりますが。。。）

運用監視ツールは、バラ色に見えますが、ZABBIXはインストールまでは良いが、カスタマイズはかなりの茨の道です。

まあ、一通り慣れれば同じテンプレートの繰り返しなので、最初のうちはがんばれ！
最近は日本語の本も出て来たので、昔よりは苦労が減ったと思いますよ。マジで。

# あとを託す、友人も確保しておくこと

人間っていつかは突然死んでしまったり、いなくなってしまったりするので、
あとの事を託す友人は確保しておきましょう。

サーバの止め方や再起動方法を書いたドキュメントのURLだけ渡しておいたり、
１回代わりに運用保守対応してくれたら、いくら支払うという契約も交わしておきましょう。


運用保守の人は、24時間365日運用監視ツールからメールが来ても、精神的に負けない強い心が必要だぞ！
よい子のみんなは、気軽にまねをしないでねｗ
Ruby gem周り主要プロダクトメモ



# bundle 

- bundlerとはプロジェクト内で使うRubygemsを管理するしくみ。
    - Gemfile.lockにインストール済みのgemの依存関係(gemの名前、バージョン)が保存されている。
- Gemfile http://ruby.studio-kingdom.com/bundler/gemfile
    - コードを実行するために必要な依存関係が記述されている。
- bundle init http://ruby.studio-kingdom.com/bundler/bundle_init
    - 現在の作業ディレクトリ内にGemfileを生成する。
- bundle install http://ruby.studio-kingdom.com/bundler/bundle_install
    - Gemfile.lockが無い場合Gemfileを読み込み、依存関係を解決しつつ、gemをインストールする。
      Gemfile.lockというファイルが生成される。
    - Gemfile.lockが存在し、Gemfileが更新されていない場合、gemを習得するが、Gemfile.lockに指定されている依存性を使用する。
    - Gemfile.lockが存在し、Gemfileが更新されている場合、lock内の依存性を使用するが、更新されたGemに対しては依存性の再解決を行う。
    - 依存性の詳しい説明は[こちらを参照](http://ruby.studio-kingdom.com/bundler/bundle_install#conservative_updating)
- bundle update  http://ruby.studio-kingdom.com/bundler/bundle_update
    - 指定した（指定しなければすべて）Gemを更新し、Gemfile.lockの記述を無視する。
        
- bundle exec　http://ruby.studio-kingdom.com/bundler/bundle_exec
    - $PATH上にないものでも、Gemfile上で指定されているすべてのGemを実行できる。

# gemrc

- proxy http://qiita.com/komacchi/items/193ed2b6b7647e469ac9
- no-doc http://qiita.com/kei_q/items/d13235157fcfc435489d

# rake

- rake build http://docs.ruby-lang.org/ja/2.1.0/library/rake.html
- rake install 
- Rakefile http://unageanu.hatenablog.com/entry/20100829/1283069269
- 参考：http://qiita.com/zaso/items/63177cc4a9c191cb27ad

# rspec

- http://qiita.com/jnchito/items/42193d066bd61c740612

## Proxy環境化で使う場合
### Windows
ターミナルで最初に、以下のコマンドを打つ。

```
set http_proxy=proxy_server:port
set https_proxy=proxy_server:port
```

### Linux

``` lang:~/.gemrc
http_proxy: proxy_server:port
https_proxy: proxy_server:port
:ssl_verify_mode: 0 :SSL認証したくない場合
```
Some appledoc annotations:


1. simple line annotation: 

`///simple annotation`

or:
`/*! single line annotation. */`


2.multiple annotation: 
```
/**	simple annotation
*	multiple annotation	
*/
```

or:

```
/**	@brief simple annotation
*	multiple annotation
*/
```

3.Delegate && category annotation:
In a delegate or category file,We can use simple line annotation.we can use multiple annotation too, of course.


4.property annotation:
As the same, we can use both single line annotation and multiple annotation.


5.methods annotation:
if the method has no argument,we can use single line annotation.
if the method has argument,we have to write like this:
```
/**
*	@brief the method has two arguments.
*	@param		value This is the first argument.
*	@param		value2 This is the second argument.
*	@return		This is a return value.
*/
- (id)getSomeElementWithArgument:(id)value andArgument:(id)value2.
```

ps.
`@param<name><description>: the description of argument.`
`@return<description>: the description of return value.`


6.A complex annotation:
```
/**
*	@brief description
*	
*	@param value description.
*
*	@return return value description.
*
*	@exception NSException exception description.
*
*	@see someMethod.
*	@warning warning:warning information
*	@bug bug:bug information.
*/
- (NSString *)someMethondByStr:(NSString *)value
```
ps.
`@exception <name> <description>: description.`
`@warning <text>: warning description.`
`@bug <text>: bug description.`
`@see <name>` Methods or properties in the Class or Delegate.



7.if we have to write some code paragraph in annotation,we can use **`** to include the paragraph.




![](https://github.com/Asahi-Kuang/picture/blob/master/AE477E6C-A400-4852-AC46-D42E14659901.png?raw=true)



8.creat list in annotations.
a. disordered list:
use "-","+"or"*"character before annotation.

```
/**
* disordered list:
*
* - abc
* - xyz
* - rgb
*/
```

b. ordered list:
use number or decimal point before annotation.
```
/**
* ordered list:
*
* 1. first
* 2. second
* 3. third
* 4. forth
*/
```
c. blank: example
```
/**
 *  | Kxx | xxxx | xxQ |
 *  |-----|:----:|----:|
 *  |norma|center|right|
 *  |cell |cell  |cell |
 */
```
this will be a blank like this:
![](https://github.com/Asahi-Kuang/picture/blob/master/037BF081-C12F-4F62-95CA-A203009365B6.png?raw=true)
 

9.include a link:
write the link words directly.
```
/**
*	http://github.com/Asahi_Kuang
*/
```
JSUG - Spring One 報告会 - 


## Web ApplicationとReactive Programing

タグバンガーズ

UriComponentBuilderが好きｗ

Spring Oneにおいて、Reactiveについてよく分かってない人が多数だった。

Spring5

Java界隈ではReactiveについて出遅れてる感ある

### Web Applicationにおけるポイント

Reacvieを取り入れることでどう変わるか？

クライアントサイドでいえば…

- よりリッチに
- よりリアルタイムに

ノンブロッキングをコンビに似たとえる

Reactiveじゃない対応をしてしまうと

- リクエストがたくさん来てさばききれないと
- スタッフが増える
- しかし店の広さは決まっている
- コンビニを増やす
- 金がかかる

Reactiveにすると

- お弁当暖める
- レンジ前で担当は寝てる
- 色んな処理を分けてドンドンさばく
- 止まってるものは後回し
- レジ前の対応速度はなるべく早くする

タグバンガーズに入ればSpring One参加できるらしい

乾杯から始まるSpring Framework入門 12/11

## Spring Oneを経験してよりよいWebサービスのためにやること

### よいドキュメンテーションの仕組み

- 簡単に作れる
- 見やすいドキュメントを作れる
- 更新コストが低い方が良い
- 嘘をつかない（実装と差が発生しにくい）

Swagger色々考慮する点があるよね

Springに適したツール

- Ascii Doc
- Spring REST Docs

Documentationのテストコードを作る。
テストコード実行＋ドキュメンテーション出力

adocファイルが出てくる。

Spring Rest Docsはスニペットを生成してくれる。

## Cloud

PaaS

### 前提

- 信頼できないコンポーネントで信頼できるシステムを構築する
	- どんなインスタンスでも落ちることはある
	- インスタンス単位で100％はできないけど、システムでどうにかする
- 運用コストは開発コストより何倍も大きい
	- 開発は数ヶ月かもしれないが、運用はその後ずっと
	- 継続的デリバリーでコストを削減する
	- プラットフォームが必要！

### デモ

LATTICEのデモ

## Spring Cloud

Netflix

### サービスディスカバリ

Eureka

アプリが起動時に自分で登録にいって状態を通知する

### Client側のロードバランシング

Ribbon

- RoundRobinRule
- AvailabilityFilteringRule
- WeightedResponseTimeRule

### サーキットブレーカー

### Metrics

Spectator

## NSOL

去年まではSpring Boot良いぜ！な内容だった。
今年はSpring Boot使っていい感じにしていくぜ！的な内容が多かった。

### Spring Securityについて

RestfulAPIの認証

SSL/TLSによるCPU負荷は1%未満だ

HTTPSのトラフィックに耐えられるほど十分に早い
[翻訳]Space leak zoo

[Space leak zoo](http://blog.ezyang.com/2011/05/space-leak-zoo/)を翻訳しました。
翻訳に間違いがあったり、誤解を生みそうな表現があった場合はコメントや編集リクエストなどで指摘していただけると助かります。

## スペースリーク動物園
まず、[スペースリークの標本集](http://blog.ezyang.com/2011/05/calling-all-space-leaks/)に情報を提供してくれた全ての人に感謝します。
みなさんのリーク例はすべて熟練者による検査を経て、目録にまとめてあります。
そして喜ばしいことに、このスペースリークの動物園を公の場に解放することになりました。
これからいくつかの種類のスペースリークを紹介しますが、すべて別物ですので、訪問者のみなさんは混同なさらないようにお願いします。
(実際にそのスペースリークに遭遇したときの取り扱い方も違ってくるので、間違った方法を使ったら状況を悪化させてしまいかねません。)


## メモリリーク
メモリを解放してOSに返すことができないことはメモリリークと呼ばれます。
これはレアモノです。というのも、ガベージコレクションによって絶滅寸前なのです。
このシリーズではこのようなメモリリークの例は出しませんが、厳密なことを言えばFFIの低レベルなメモリ確保関数をbracketなしで使った場合はHaskellでもこのようなメモリリークが起きることがあります。


## 強い参照によるリーク
原理的には使われる可能性があるが、実際にはもう使われないメモリをプログラムが参照することを「強い参照によるリーク」と言います。
純粋で遅延評価をするHaskellらしいプログラムでは、このようなリークはあまり多くありません。
純粋性はミュータブルな参照(適切なタイミングでクリアされなければメモリリークを起こします) の使用を防ぎ、このようなリークを避けます。
遅延評価はデータの一部しか必要でない時にデータ構造を無駄に生成しないようにして、やはりこのようなリークを防ぎます。
もちろん、ミュータブルな参照や正格評価を使うとこのようなエラーを引きおこすことがあります。
(ミュータブルな参照によるものは"強い参照"という名が示すとおり、弱い参照(System.Mem.Weak)を用いることで解決できることがあります。)
また、下記の「生きた変数によるリーク」は強い参照によるリークの一種で、クロージャに不慣れな人を驚かせることがあります。


## サンクのリーク
たくさんの評価されていないサンクをプログラムがメモリ内に作り出し、大量のスペースを占有することを「サンクのリーク」と言います。
これはヒーププロファイルでたくさんのサンクを見つけた時や、ずらずらと連なったサンクの評価中にスタックオーバーフローを起こしたときに気づくことができます。
このようなリークは遅延評価でよく見られ、手続き型の世界では比較的まれです。適切に正格評価を導入することで解決できます。


## 生きた変数によるリーク
「生きた変数によるリーク」はクロージャ(サンクかラムダ式)が、プログラマがもう解放したと思っているメモリへの参照を持っている場合に起きます。
これはサンクや関数の中のメモリへの参照が、(データレコードのように)明示的ではなく、(生きている変数であるために)ユーザーに気づかれにくくなりがちであることによって起こります。
関数の結果が比較的小さい場合では、リークは正格性を導入することで解決できます。
しかし、直すためには全ての参照を確実に取り除かなくてはいけないため、これはサンクのリークほど直しやすくありません。
さらに、評価済みのメモリの大きなかたまりが存在しても、生きた変数によるリークが起きているとは限りません。
もしかすると、下に説明するように、ストリーミングに失敗しているのかもしれません。


## ストリーミングリーク
ストリーミングリークは、ストリーミングの際に入力と出力の両方がとても少ない場合に起こります。
メモリ使用量もとても少なくなりそうですが、そうはならないのです。
それどころか、大量の入力が強制的に評価され、メモリにたくわえられてしまいます。
このようなリークは遅延評価と中間データ構造で起きますが、サンクのリークとは違って正格評価の導入は状況を悪化させかねません。
作業を複製し、データの依存を注意深く追跡することで直すことができます。


## スタックオーバーフロー
プログラムが今処理していることの後にたくさんの処理待ちの作業を作ってしまうことをスタックオーバーフローと言います。

これはスタックスペースを使いきったときに顕在化します。
厳密に言えばこれはスペースリークではありませんが、サンクのリークやストリーミングリークを直す方法を間違えるとスタックオーバーフローになることがあるため、ここに掲載しました。
(サンクのリークとは別物ですが、同じように見えるときがあります。)
このリークは再帰によって起こります。
これは、再帰しているコードをイテレーションや、もっと良いデータ構造に書きなおして末尾再帰最適化されるようにすることで直せます。
最適化をオンにするだけでも良くなることがあります。


## セレクタリーク
セレクタリークはサンクのリークの変種で、データの一部しか使わないのに、サンクが評価されていないためデータ全体が保持されることを言います。
これはランタイムシステムによるGHCのselector thunks最適化によってほとんど防がれますが、下記のように、最適化の失敗によってたまに引き起こされることもあります。

## 最適化によるリーク
最適化によるリークはこれまでのリークのいずれかがカモフラージュされているものです。
ソースコードを見るかぎりではリークはないように見えるのですが、コンパイラの最適化がリークを引き起しているのです。
これは本当に特定しにくいです。「動物園」で取り扱うには不向きですね!
(これを直そうとするとGHCのバグトラッカーに投稿しなくてはいけません)


## スレッドリーク
あまりにたくさんのHaskellのスレッドが作られてしまうことをスレッドリークと言います。
これはヒーププロファイルに"TSO"が表れることによって特定することができます。TSOとはスレッドステートオブジェクトの略です。
これのデバッグは興味深いです。というのも、スレッドが死なない理由はたくさんありうるからです。


次の記事では、いくつか図を用いてこれらのリークの例を上げてみます。
興味を持った方は、練習として[前回](http://blog.ezyang.com/2011/05/calling-all-space-leaks/)見たリークを分類してみるのもいいでしょう。


## 更新
サンクのリークと生きた変数によるリークを分離し、主に強い参照に関するいくつかの点をさらに明確にしました。
後の記事で、これらの概念上の重要な違いだと思われる点を詳しく説明するつもりです。
MySQLのエラーと対策まとめ

PHPからMySQLに接続していて出たエラーと対策など。
間違っている内容などあればコメントで教えて頂ければ嬉しいです。

# php側で出たエラー

## `MySQL server has gone away`
### 【原因】（3パターン）

<i class="fa fa-leanpub"></i>MySQL 4.1 リファレンスマニュアルより
http://mirror.metrocast.net/mysql/doc/refman/4.1/ja/gone-away.html

- 1.サーバータイムアウト

> MySQL server has gone away エラーの最も一般的な原因は、サーバがタイムアウトして接続がクローズしたことです。
> デフォルトでは、何も起きない状態が 8 時間続くと、サーバは接続をクローズします。
> この時間は、mysqld 開始時に wait_timeout 変数を設定することで変更できます。

- 2.接続をcloseしている

> MySQL server has gone away エラーが発生する一般的なもう一つの原因としては、MySQL とのコネクション上で ``close'' を発行し、クローズしたコネクションでクエリを実行しようとしたことが考えられます。

- 3.クエリが大きすぎる or クエリの最大サイズの設定が小さい

> 間違ったクエリか大きすぎるクエリをサーバに送信した場合も、このエラーが発生する可能性があります。
> mysqld は大きすぎるか異常のあるパケットを取得すると、クライアントに何か問題が発生したとみなし、接続をクローズします。
> 大きなクエリが必要な場合（たとえば、大きな BLOB カラムを使用している場合）、mysqld を -O max_allowed_packet=# オプション（デフォルト 1MB）で起動して、クエリ制限を引き上げることができます。
> 拡張メモリは要求に応じて割り当てられます。そのため、mysqld は、ユーザが大きなクエリを発行するときや、mysqld が大きな結果レコードを返す必要のあるときだけ、メモリを増やして割り当てます。

### 【対策】

- 1.サーバータイムアウト

> 1)タイムアウトの設定を変更する。
> 以下のクエリを実行（8時間）
> `set global wait_timeout = 28800;`
> 2)定期的にクエリを実行する
> `SELECT 1;` などの何もしないクエリをタイムアウトになる前に実行する。

- 2.接続をcloseしている

> 1)全ての処理が終わるまでcloseを呼ばないようにする。
> 2)closeした後に再コネクトする。

- 3.クエリが大きすぎる or クエリの最大サイズの設定が小さい

> max_allowed_packet の設定を変更する

# MySQL側で出たエラー

## MySQLログのパス
`/var/log/mysqld.log`

##  `InnoDB: Error: pthread_create returned 11`
【原因】
ファイルディスクリプタ数の上限に引っかかった。
【対策】
ulimitコマンドでファイルディスクリプタ数の上限値を変更すれば解決。

> とりあえず無制限にする。
```
ulimit -s unlimited
service mysqld restart
```

# その他参考になりそうなリンク

- [「Can't connect to local MySQL server through socket '/tmp/mysql.sock'」というエラーについて](http://qiita.com/sugi511/items/e672ce3324b8659e4027)
- [MySQL が 'The server quit without updating PID file 'というエラーを出したときの対処法](http://qiita.com/shunsuke227ono/items/a705734b136156249005)

# オマケ - バージョン毎のリファレンス
毎回探すのに苦労するので・・・

- [MySQL 8.0 Reference Manual](https://dev.mysql.com/doc/refman/8.0/en/)(draft)
- [MySQL 5.7 Reference Manual(日本語なし？)](https://dev.mysql.com/doc/refman/5.7/en/)
- [MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/)
- [MySQL 5.5 Reference Manual](https://dev.mysql.com/doc/refman/5.5/en/)
- [MySQL 5.4 Reference Manual(ミラー/日本語なし)](http://mirror.metrocast.net/mysql/doc/refman/5.4/en/)
- [MySQL 5.1 リファレンスマニュアル(ミラー)](http://mirror.metrocast.net/mysql/doc/refman/5.1/ja/)
- [MySQL 5.0 Reference Manual(ミラー/日本語なし)](http://mirror.metrocast.net/mysql/doc/refman/5.0/en/)
- [MySQL 4.1 リファレンスマニュアル(ミラー)](http://mirror.metrocast.net/mysql/doc/refman/4.1/ja/)
Elastic {ON} Tokyo 2015 ワークショップ

+ 自分用のメモですよ

# logstash

+ デフォルトだとstring になるので、後ろに`int`とかつけるとデータ型がちゃんとなる

# elasticsearch

+ index_template ってのを作れるよ
+ インデックスを作る度にmapping 定義するのメンドイ
    + それを簡略化したのがindex_tamplate
+ _template にテンプレートを登録する
    + logstash だと勝手に設定されてくれる
    + 他のツール（なんのことだか分からない）だと上手く動かないことがある
+ multi_field
    + 2タイプのデータを入れたい時
    + ngram とanalzedを二つあると解析と検索を１つで出来る
+ 全部に定義するのは面倒
    + 文字列の場合は勝手に両方出来るといいよね
    + それ、dynamic_templatesで出来るよ
+ 文字列なんだけど数値として扱って欲しい的な設定もあるよね
+ _analyze
    + 転置index の状況が分かるAPIがあるよ
    + 便利なんだけど最終結果しか出てこない
+ 大谷さんのプラグイン
    + 2.2 から乗っかる
    + tokenizer の過程がわかる
+ レシピ提供出来るといいよね
    + ちょっと考えます（大谷さん

# kibana

+ sense (kibana 4.2以上）
+ クエリを投げるのにブラウザ上で実行できる
    + 保管してくれる
    + 

# securiry use case

+ ウイルス検知とかも出来るらしい
+ 攻撃の分析とかも出来るらしい
    + DoS 攻撃とかも分かる！？
+ ログインしてるのだーれだ！
+ ログの形式ってのはいっぱいある
    + ログのunify が重要！
+ ドーナツチャート面白いな
    + 一貫して見れそう
OSS版　drone.io を使って Docker Image をビルド

# 概要
レポジトリの Dockerfile を更新したら自動で Docker Image をテスト/ビルドして Registry に Push するまでの環境を構築
※Docker コンテナ内で Docke Image をビルドするため、 Docker in Docker な環境が必要

参考
http://paislee.io/how-to-build-and-deploy-docker-images-with-drone/

# 環境
OS : CentOS Linux release 7.1
Docker : 1.8.2, build bb472f0/1.8.2
Docker : Registry: 2.0
drone : 0.3.0-alpha

※Drone, Docker Registry等 のインストールは割愛

# ビルドコンテナ
alpine ベースで DockerImage を作成

```:Dockerfile
FROM alpine:3.2

RUN apk add --update \
		curl \
                bash \
                openssh \
                perl \
                git \
                btrfs-progs \
                e2fsprogs \
                iptables \
                xz \
	&& rm -rf /var/cache/apk/*

ENV DOCKER_BUCKET get.docker.com
ENV DOCKER_VERSION 1.8.2
ENV DOCKER_SHA256 97a3f5924b0b831a310efa8bf0a4c91956cd6387c4a8667d27e2b2dd3da67e4d

RUN curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-$DOCKER_VERSION" -o /usr/local/bin/docker \
	&& echo "${DOCKER_SHA256}  /usr/local/bin/docker" | sha256sum -c - \
	&& chmod +x /usr/local/bin/docker

ENV DIND_COMMIT b8bed8832b77a478360ae946a69dab5e922b194e

RUN wget "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -O /usr/local/bin/dind \
	&& chmod +x /usr/local/bin/dind

ADD ./binary/dmsetup /usr/local/bin/dmsetup
RUN chmod +x /usr/local/bin/dmsetup

VOLUME /var/lib/docker
CMD ["wrapdocker"]
```

# レポジトリの構成

```
/my-repository:branch
|--.drone.yml
|
|--/.drone
|  |--build.sh
|
|--Dockerfile
```
※branch で 各 Dockerfile を管理


# .drone.yml
```yaml:.drone.yml
image: docker-registry:5000/dind
env:
  - DOCKER_DAEMON_ARGS=--insecure-registry docker-registry:5000
script:  
  - ./.drone/build.sh
notify:
  slack:
    webhook_url: 'https://hooks.slack.com/services/…
    channel: '#my-channel'
    username: 'drone.io'
```
※image は alpine をベースに dind(wrapdocker) をインストールしたコンテナを使用
※registry に push する際にエラーとなるため、DOCKER_DAEMON_ARGS に insecure-registry オプションを指定
　(本当はちゃんと証明書を用意した方が良い)
※通知は Slack にメッセージを流す

# ビルドスクリプト
```bash:build.sh
#!/bin/bash
set -e  
cd /var/cache/drone/src/path/to/dockerfile

/usr/local/bin/wrapdocker &  
sleep 60

docker build -t docker-registry:5000/$DRONE_BRANCH .
docker push docker-registry:5000/$DRONE_BRANCH
```
※image は branch 名をつける
※環境によっては wrapdocker の起動に時間がかかる場合もあったため sleep は長めに設定


dind は privileged オプションが必要なため、事前に drone 側のレポジトリ設定を privileged を有効にしておく

```
  "private": true,
  "privileged": true,
  "post_commits": true,
```

# 実行
Dockerfile を適当に修正して push すると自動的にテストが実行

![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/f5b0468e-b8a9-0e84-190c-4a99588e7b6b.png)



レポジトリの Dockerfile を更新したら自動で Registry に Push されるため、Registry 上の Docker Image は常に最新の状態になる
このエラー誰が出したんだ？という時に役立つGitコマンド「git blameとgit log -S」

# 概要
チーム開発をしていると、身に覚えのないサーバエラーに遭遇する時はよくあります。
そんな時は、エラーの原因（というよりエラーを出した人）を探る必要が有るので、その時に役立つコマンドをお教えします。

# git blame path/to/erroFile
エラーを出したファイルと、エラーの原因となっているメソッドや変数等の追加文字列（以下、キーワードと呼びます）が分かっている場合は、
`git blame`コマンドを使用します。
このコマンドを使用する事で、該当ファイルの各行の最終更新者が分かります。
※ intellij等のIDEを使っている場合は該当ファイルを開き「右クリック>Git>Annotate」で表示可能です。
※ GitHub等で対象ファイルを開いてBLAMEボタンをおしても同様の結果が得られます。

# git log -S erroKeyWord
エラーキーワードが分かっている場合は`git log -S`を使用します。エラーキーワードにまつわるコミットログのみ抽出されるので、
最後にコミットした張本人がエラーを出した原因である可能性が高いです。

参考：http://blog.eiel.info/blog/2013/06/04/git-log-s/
参考：http://qiita.com/LOUIS_rui/items/86cf7802c4abc6fa4c1e
git rebase中に変更したファイルがないのにoverwritten by mergeというエラーになる


## 発生した問題
リベース中に追加・変更したファイルがないのに、下記のようにマージエラーが出るようになってしまいました。

```shell
・
・
・
error: Your local changes to the following files would be overwritten by merge:
    app/models/hoge.rb
Please, commit your changes or stash them before you can merge.
Aborting
Failed to merge in the changes.
```

この場合、リモートで変更のあったファイルをgit管理外にしてたりするのがよくある原因なのですが、今回はそういった設定は一切していませんでした。

また`git status`を実行したのですが、コンフリクトしているファイルなどは存在しない状況でした。

## 原因
どうやらMacのリビジョン管理に問題があって、リベース時にエラーが発生するようです。
ただ自分の環境でいうと、MacのOS上の時刻を変更していたのが原因っぽい？

## 解決方法
```
git config --global core.trustctime false
```

とコマンドを実行することで、インデックスと作業ツリー間のCTIMEの違いを無視してくれるので、マージエラーは出なくなります。

変更したファイルがないのにリベースエラーになったときは、この方法を試してみてください。

## 参考URL
[Git rebase fails, 'Your local changes to the following files would be overwritten by merge'. No local changes? - Stack Overflow](http://stackoverflow.com/questions/5074136/git-rebase-fails-your-local-changes-to-the-following-files-would-be-overwritte)
[A Simple Tweak for Making 'git rebase' Safe on OS X](http://www.git-tower.com/blog/make-git-rebase-safe-on-osx/)
C#で「あるコードがコンパイルエラーになる」ことを確かめるコード。

#方針
Microsoft.CodeAnalysis.CSharp.Scriptingを使う。
エラーになるようなスクリプトをCompile()して、エラーになることを確かめる。

#こんな感じ
```csharp
var options = ScriptOptions.Default
    .AddReferences(/* */)
    .WithImports(/* */);
var script = CSharpScript.Create(
    /* エラーになることを期待するコード */
    ,options);

var result = script.Compile();
foreach (var x in result)
    Console.WriteLine(x); //エラーメッセージ
```

#何に使うの?
APIでこういう書き方はエラーにするってのをテストしたい時とか？
Swift カレンダー，日付系備忘録


Swift2.0と1系でなんか違うので備忘録。
まだまだあるので，必要に応じて適宜追記していく。

**※ Playground レベルでしかみてない。**

```Swift:Swift
import UIKit

let calendar = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
// NSDate() でもいいけど訳あり・・・
var date = calendar.dateWithEra(1, year: 2015, month: 12, day: 1, hour: 0, minute: 0, second: 0, nanosecond: 0)!

// Swift 2系から？
let unitFlags: NSCalendarUnit = [ .Year,
    .Month,
    .Day,
    .Weekday,
    .Hour,
    .Minute,
    .Second ]

let year = calendar.component(.Year, fromDate: date)
let month = calendar.component(.Month, fromDate: date)
let day = calendar.component(.Day, fromDate: date)
String(year) + "年" + String(month) + "月" + String(day) + "日"

// 何曜か(weekdayって1からだったっけ?)
var components = calendar.components(unitFlags, fromDate:date)
var weekDay = components.weekday

// おまけ
let dayArray = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
var nowDay = dayArray[weekDay-1]

// 指定月は何日あるか
var range : NSRange = calendar.rangeOfUnit(.Day, inUnit:.Month , forDate:date)
var last =  range.length;
```

```
"Dec 1, 2015, 12:00 AM"

"2015年12月1日"

3

"Tue"

31
macでAtomのtermプラグインをインストール時エラー

# error log
```
> pty.js@0.3.0 install /private/var/folders/0t/wnrcv4cj5vx8hv4q27zdfx7c0000gn/T/apm-install-dir-1151116-4486-h9z6ih/node_modules/term3/node_modules/pty.js
> node-gyp rebuild

  CXX(target) Release/obj.target/pty/src/unix/pty.o
  SOLINK_MODULE(target) Release/pty.node

npm WARN deprecated react-tools@0.11.2: react-tools is deprecated. For more information, visit https://fb.me/react-tools-deprecated
ld: library not found for -lgcc_s.10.5
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Release/pty.node] Error 1
gyp ERR! build error 
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/Applications/Atom.app/Contents/Resources/app/apm/node_modules/npm/node_modules/node-gyp/lib/build.js:269:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:820:12)
gyp ERR! System Darwin 15.2.0
gyp ERR! command "node" "/Applications/Atom.app/Contents/Resources/app/apm/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /private/var/folders/0t/wnrcv4cj5vx8hv4q27zdfx7c0000gn/T/apm-install-dir-1151116-4486-h9z6ih/node_modules/term3/node_modules/pty.js
gyp ERR! node -v v0.10.40
gyp ERR! node-gyp -v v2.0.2
gyp ERR! not ok 
npm ERR! Darwin 15.2.0
npm ERR! argv "/Applications/Atom.app/Contents/Resources/app/apm/bin/node" "/Applications/Atom.app/Contents/Resources/app/apm/node_modules/npm/bin/npm-cli.js" "--globalconfig" "/Users/username/.atom/.apm/.apmrc" "--userconfig" "/Users/username/.atom/.apmrc" "install" "/private/var/folders/0t/wnrcv4cj5vx8hv4q27zdfx7c0000gn/T/d-1151116-4486-bu80t7/package.tgz" "--target=0.34.3" "--arch=x64"
npm ERR! node v0.10.40
npm ERR! npm  v2.13.3
npm ERR! code ELIFECYCLE

npm ERR! pty.js@0.3.0 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the pty.js@0.3.0 install script 'node-gyp rebuild'.
npm ERR! This is most likely a problem with the pty.js package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-gyp rebuild
npm ERR! You can get their info via:
npm ERR!     npm owner ls pty.js
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /private/var/folders/0t/wnrcv4cj5vx8hv4q27zdfx7c0000gn/T/apm-install-dir-1151116-4486-h9z6ih/npm-debug.log
```
# cause
```
ld: library not found for -lgcc_s.10.5
```

term内部で利用しているpty.jsコンパイル時にリンカーがシンボルを解決できていない。
lgcc_s.10.5のシンボリックリンクを作成して解決させる

# fix 
```
cd /usr/local/lib
sudo ln -s ../../lib/libSystem.B.dylib libgcc_s.10.5.dylib
```
windowsのRubyでQtを使う

　
結論としてはRuby2.0でqtbindingsをインストールしたという話です。それだけです。
そこまでにエラー続出でてこずったので（…）まとめておきます。

#環境
- window7 (32bit)
- Ruby 2.0.0
RubyInstallerを使ってます。
2.1でも1.9でもエラーが出てインストールができませんでした。

- qtbindings
最新版（4.8.6）です。

- DevKit
こちらも最新版（4.7.2）でいけました。

#手順
- Ruby2.0をインストール
- DevKitもインストール
- gemでqtbindingsをインストール

これだけです。すんなりインストールできました。



#（因みに）経緯
- 興味本位でRubyでGUIアプリを作りたくなった
- 使うならQtを使ってみたい
- 検索するとwinならQtRubyが使えるとのこと
- インストールしてもエラーが出て使えない
 * Ruby1.8でないと使えない…？
- 更に検索したらqtbindingsもwinで使えるらしい
- インストール時にエラー出た…
- Ruby2.0に入れたらすんなり入った


#つまり
ネットを見てるとwinはQtRubyと書いてるページが多いですが、
winでもqtbindings使えました、ということです。
あとRubyは2.0というのが言いたかった。
やっとインストールできたので色々遊んでみます！
俺でも理解できると思ったら躓いたCouchbase Go SDKでbucket相手にhello world


俺です。

[Couchbase Server Go SDK  1.0](http://developer.couchbase.com/documentation/server/4.0/sdks/go-beta/introduction.html)の[Hello Couchbase example](http://developer.couchbase.com/documentation/server/4.0/sdks/go-beta/hello-couchbase.html)をCouchbase Server 3.0/4.0相手に動かした時、つらい目にあったのでメモを残します。

## 環境

2環境で試して同じエラーが出た

(1) Mac OS X

- Couchbase Server 3.0.1
- Go 1.4.2
- Couchbase Server Go SDK 1.0

(2) Amazon Linux

- Couchbase Server 4.0.1
- Go 1.4.2
- Couchbase Server Go SDK 1.0

## ソース

```go
package main

import (
	"fmt"

	"gopkg.in/couchbase/gocb.v1"
)

func main() {
	myCluster, _ := gocb.Connect("couchbase://localhost")
	myBucket, _ := myCluster.OpenBucket("beer-sample", "")

	var beer map[string]interface{}
	cas, _ := myBucket.Get("aass_brewery-juleol", &beer)

	beer["comment"] = "俺とお前と大五郎"
	beer["description"] = "マグロ。ご期待下さい。"
	myBucket.Replace("aass_brewery-juleol", &beer, cas, 0)
	fmt.Printf("map length `%d` value `%v` with CAS %08x", len(beer), beer, cas)
}
```

## エラー

`req.Cancel undefined` !!

[この更新](https://github.com/couchbase/gocb/commit/b3a6cdbfe7fd3f3fa44f55f3b75383fa019ed59b)で追加された関数 `doHttpWithTimeout` の`req.Cancel`が使われてないってことで怒られたようです。

```
orenomac$ go run hello.go
# github.com/couchbase/gocb
../github.com/couchbase/gocb/bucket_http.go:262: req.Cancel undefined (type *http.Request has no field or method Cancel)
```


## 対策(2015/12/16 15:46JST時点)

まだ修正されてないようなので、 `bucket_http.go`の262行目をコメントアウトしてしまえばOKでした

## もう一度実行

Couchbse Serverにインストールしたbeer-sampleバケットからCASの取得とkey(aass_brewery-juleol)のReplaceができました。

```
orenomac$ go run hello.go
map length `13` value `map[brewery_id:aass_brewery category:North American Ale comment:俺とお前と大五郎 description:マグロ。ご期待下さい。 ibu:0 name:Juleøl type:beer updated:2010-07-22 20:00:20 abv:5.9 hoge:foo bar srm:0 style:Dark American-Belgo-Style Ale upc:0]` with CAS f14915f70d9%
```

やったね
CS-Cart: ユーザ名でログインできるようにする

CS-Cartではユーザ名とパスワードでログインすることができたようだが、4.3.1からはメールアドレスのみで認証するようになったようだ。一応、usersテーブルにはuser_loginカラムというそれらしいものがあるが、認証には使われていない。

> Unfortunately, the usernames are not supported since 4.3.1 
> [Login With Email/username - General Questions - CS-Cart Community Forums](http://forum.cs-cart.com/topic/41851-login-with-emailusername/)

ユーザ名とパスワードしかユーザマスタに持ってない古いシステムからCS-Cartに乗り換える場合、これが意外と障壁になる。

## CS-Cartはどこで認証しているか？

app/functions/fn.users.phpの`fn_auth_routines`関数が認証の処理だが、残念ながらPHPフックはない。したがって、直接コアのコードを修正する外ない。

## 修正する箇所

まず、`fn_auth_routines`関数の下記の部分を見つける。

```php
    $user_data = db_get_row("SELECT * FROM ?:users WHERE $field = ?s" . $condition, $user_login);
```

その後ろに、下記のような行を追加する

```php
if (empty($user_data)) {
    $user_data = db_get_row("SELECT * FROM ?:users WHERE user_login = ?s" . $condition, $user_login);
}
```

これだけだと、ログインフォームでメールアドレスの書式チェックが走ってログインできないので、テンプレートも変更する。下記部分の`cm-email`を消すと、メールアドレスのバリデーションが無効になる。また、「Eメール」という表示を「ユーザー名」にしたいので、`__("email")`は`__("username")`に置き換える。

```diff:design/backend/templates/views/auth/login_form.tpl
...
-   <label for="username" class="cm-trim cm-required cm-email">{__("email")}:</label>
+   <label for="username" class="cm-trim cm-required">{__("username")}:</label>
...
```
Visual Studio Codeでとあるjsonの編集で補完を効かせる

小ネタです。最近 Visual Studio Codeを使っていますが、その設定関連です。

# やること

**Visual Studio Codeでjsonの編集中にIntelliSenseを効かせる。**

たとえば、`package.json`とかの場合、すでにIntelliSenseが有効なので、適当なところで`ctrl+space`を押すと、その文脈にそって入力可能な候補を表示してくれます。

しかし、すべてのjsonファイルで候補を表示してくれるかというとそうでもなく、`tsd.json`のように何も教えてくれない場合もあります。このようなファイルも候補を表示してくれるようにしたいです！

# そもそもなぜ候補が出るか

JSON Schemaを利用しているようです。ので、編集したいjsonファイルのschemaをVisual Studio Codeに教えてあげる必要があります。

# 設定方法

`tsd.json`を例にします。

メニューの`File` -> `Preferences` から、`User Settings`か`Workspace Settings`を選びます。プロジェクト内で他の人と共通で利用するなら`Workspace Settings`がよさそうです。

そうすると、Visual Studio Code が左右分割されて表示されますが、左側はデフォルトの設定なので、編集できません。右側を修正します。
これは`settings.json`というファイルなのですが、これは候補が表示されてくれます。
ので、`json`くらいまで打つと`json.schemas`という候補が出るかと思いますので、それで確定します。
すると、デフォルトの設定がまるっと入力されるので、一番下にでも追加します。

```json:settings.json抜粋
    {
      "fileMatch": [
        "/tsd.json"
      ],
      "url": "http://json.schemastore.org/tsd"
    }
```

このurlはJSON Schemaの場所を指定するのですが、ここでは[JSON Schema Store](http://schemastore.org/json/)というサイトを使わせていただきました。いろんなjsonファイルがありそうなので、たいていはここで足りそうです。(デフォルトの設定もだいたいはここを見ていますね)

というわけで、IntelliSense使えるようになりました。ありがとうございます。
RDS Mysql 作成方法

## はじめに
RDSを使用する機会がありましたのでそのメモになります。

## 概要
1. RDSダッシュボードよりセキュリティグループの作成
2. 接続可能なIPを設定
3. データベースのパラメータグループを作成
4. RDSのインスタンスの起動
5. 作成対象エンジンを選択
6. DBの冗長化
7. データベースのスペックを設定
8. データベースのコンフィグを設定
9. マスターの作成完了
10. スレーブを作成
11. スレーブサーバのスペックやコンフィグの設定
12. スレーブの作成完了

## 詳細
----
#### RDSダッシュボードよりセキュリティグループの作成
　名前やディスクプリションは適当に入れます。
![image](https://qiita-image-store.s3.amazonaws.com/0/103171/bd43127c-6ec0-0a9a-8ab8-7065f4220dfb.png)

----
#### 接続可能なIPを設定
　作成したセキュリティグループを選択し適切なConnectionType（私はCIDR/IPを設定した）の設定をします。IPには接続可能なIPを設定します。
　また、EC2で作成したセキュリティグループの設定します。（mysqlのポートの開放を適用します）

----
#### データベースのパラメータグループを作成
　そのまま作成するとデフォルトでできてしまうので、パラメータファイルを作成します。ようは *my.cnf* ですね。

![image](https://qiita-image-store.s3.amazonaws.com/0/103171/98c398de-f949-78b9-84ab-7cbf48aa5e64.png)

character_setがデフォルトであるとLatin1となってしまいますので以下の変数をutf8mb4に変更します。

・ character_set_database
・ character_set_server

![image](https://qiita-image-store.s3.amazonaws.com/0/103171/8b08dde9-0a07-bd76-acfb-329f4b7a85da.png)

----
#### RDSのインスタンスの起動
作成したRDSを起動します。

![image](https://qiita-image-store.s3.amazonaws.com/0/103171/ae52865a-a1e2-75fe-f5a0-4fd7d527283a.png)

----
#### 作成対象エンジンを選択
作成対象のエンジンを選択します。今回はMysqlで行います。

![image](https://qiita-image-store.s3.amazonaws.com/0/103171/abaa1d53-ce5f-3a8e-8e15-4bb0d84e547d.png)

----
#### DBの冗長化
DBの冗長化を行いますので、Yesを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/0/103171/8cd6471f-3328-6dcc-90d6-dfa309d0223a.png)

----
#### データベースのスペックを設定
DB Instance Class はデフォルトの db.m３.xlarge を選択しました。
StrageType は汎用SSDで AllocateStrageは50GBにしました。

・ DB Instance Identifier は名称となります。
・ Master Username ログイン名になります。
・ Master Password パスワードとなります。
※画像はとり忘れました・・

----
#### データベースのコンフィグを設定
DB Security Groupは１で作成したセキュリティグループを選択します。
Backup Retention Periodは１日にしました。
DB Parameter Group を 3で作成したものに変更します。
※ バックアップ開始時間も設定できます。
※ Maintenance は自動でmysqlのマイナーバージョンのアップデートができる機能です。

----
#### マスターの作成完了
マスターの作成が完了となります。インスタンスを確認し割り当てられたEndPoint名でアクセスできます。

----
#### スレーブの作成
マスター作成完了後スレーブを作成します。マスターのインスタンスを選択しCreate Read Replicaをしてください。

----
#### スレーブサーバのスペックやコンフィグの設定
スレーブサーバのスペックやコンフィグの設定します。ここらへんはマスターでやった時と同様に行います。

----
#### スレーブの作成完了
スレーブの作成が完了となります。インスタンスを確認し割り当てられたEndPoint名でアクセスできます。

----
## あとがき
とりあえずこれで起動できると思います。便利な世の中になりました。

## 履歴
216/02/15 全般的に体裁を整えました。
init.elから削除できそうな項目

init.el読書会等でいろんな人の設定を見ていると不要な設定が結構多い. 人によっては重複してても自分の設定ファイルに明示的に示していたいということもあるかもしれないですが, いらないものがあるというのはあまり良いことではないと思うので, 年末ですし, 掃除してみるのはいかがでしょうか ?

package.el, Cask, el-get等のパッケージマネージャを使用していることを前提にしています. 何も使っていない場合は削除できない可能性があるので予めご了承ください.


## auto-mode-alist

拡張子(厳密にはファイル名だが)とメジャーモードを関連付けるための設定. 以下のようなものです.

```lisp
(add-to-list 'auto-mode-alist '("\\.coffee\\'" . coffee-mode))
```

正しくパッケージが書けていればこれらの設定はパッケージマネージャの初期化時(`package-initialize`等)で読み込まれます. 主要な拡張子の設定が init.elにある場合は消しても問題ないはずです. もし主要な拡張子でも必要な場合はパッケージがおかしいと考えたほうが良いです. そのパッケージ作成者に報告しましょう. `auto-mode-alist`の設定が必要になるときは, 関係のない拡張子のファイルでもそのメジャーモードを使いたいときぐらいです(READMEだろうが, `markdown-mode`で開きたい等).

## autoload

autoloadは遅延処理を行うための仕組みです(以下に例を示します). 基本的にはパッケージ作者が設定するものですので, ユーザは設定する必要はありません. こっそり内部関数を呼び出し, 遅延処理を実行したいときなど有効な場合がないこともないですが, そのようなケースはほとんどありません. パブリックな関数(foobar-mode, foobar-setup等)で autoloadの設定が必要な場合, パッケージに問題があると考えるべきなので, パッケージ作者に連絡しましょう.

```lisp
;; 関数(コマンドの場合は第 4引数が non-nil) foobarを実行するとき, foobar.elをロードする
(autoload 'foobar "foobar" nil t)

;; 以下のようなものはいらない
(autoload 'coffee-mode "coffee-mode" nil t)
```

## require

初めから使いたい機能を提供するパッケージ(evilとか helmとか)のロード以外は不要. 特にメジャーモードなどの特定のファイルに特化したものはほとんど不要なはずです. もしそのようなパッケージを明示的にロードしなければならない場合, パッケージの不備です. 先ほどのようにパッケージ開発者にレポートを送るとよいでしょう. またたくさんロードしまくることは起動が遅くなる原因になります. とりあえずロードしておくと設定ファイルのエラーに気づきやすいという利点(??)はあるのですが, そのためだけに起動を遅くしていいかといわれると違う気がします. 起動を早くするためにも不要なロードは避けましょう.

多くの場合ロードしている理由はそうしないと関連する設定でエラーが発生するためだと思うのですが, そのような場合は `with-eval-after-load`(Emacs 24.3以下の場合は, `eval-after-load`)でその設定を囲ってやってください. こうすることで遅延初期化することができ, ロード時にシンボルが未定義などでエラーが出ることもありません. 以下に例を示します.


```lisp
(with-eval-after-load 'markdown-mode
  (define-key markdown-mode-map (kbd "C-M-i") 'auto-complete)
  (define-key markdown-mode-map (kbd "C-c C-c C-l") 'markdown-insert-link)
  (define-key markdown-mode-map (kbd "C-c C-c C-i") 'markdown-insert-image)
  (define-key gfm-mode-map (kbd "`") nil))
```
App Transferのハマりどころまとめ



この記事は[Speee Advent Calendar](http://qiita.com/advent-calendar/2015/speee) 17日目の記事です。

#App Transferについて
appleのDeveloperアカウント間でアプリのひも付けを切り替える機能です
個人開発でもアプリ売却をする際に必要になります

App Transferの作業自体は他の記事に譲るとして今回は「App Transfer後」に起きる問題の話。


#push通知が届かない？

iOSのpush通知はアプリのbundle idで識別されています。
App Transferをした際には一見bundle idは変わっていないように見えますが、
実はappleは内部的に
``` Prefix(Developerアカウントを元にしたHash値) + bundle id ```
という形式で識別しています。

##解決方法
App Transfer後に、新しいDeveloperアカウントの方でサーバ側のpush通知証明書を作り直しサーバに上げ直せば解決します。


#App Transfer後起動すると新規ユーザーになる？？？

実はApp Transferをしたとき（そしてその時にのみ）過去のKeychainから値を取れなくなるという仕様があります

こちらも上述のbundle idの仕様同様に
Keychainの情報がアプリのDeveloperアカウントに紐付いているために起こる問題です。

そしてREST APIを使ったiosアプリにおいて
「loginIDをKeyChainに保存する」実装をしていると、このパターンにハマります。

##解決方法

あらかじめKeyChainが消える可能性がある前提で設計します

- KeyChainとNSUserDefaultsの両方に保存する
- どちらか空でない方を優先してloginIdとして使う
- 片方空なら上書きしておく
- 両方ともに空なら新規ユーザーとして登録処理


これで以下のような動きになります。

- アプリ削除後再インストールした場合にはKeyChainに値が入っているのでログイン可能
- App Transfer時にはNSUserDefaultsから値が取れるのでそちらを使ってログイン可能
- アプリ削除しているあいだにApp Transferが発生し、その後再度インストールした場合は新規ユーザーになる（引き継ぎできないパターン）


こちらの問題については
問題のある実装ですでにアプリリリースしていると
アップデート以外に解決する方法がほぼ無いように思います。

申請前にしっかり確認して後々困らないようにしたいところですね。。。



#参考
http://www.toyship.org/archives/1680
bundle idとPrefixの経緯について詳しいです