OmniAICreator/Qiita-1.07M huggingface dataset:
CEDEC 2014 - Unity5からその先の話


CEDEC 2014 開催から半年ほど経過してしまいましたが
せっかくなので当時のレポートを公開しておこうと思います

# 概要

http://cedec.cesa.or.jp/2014/session/ENG/11677.html

> Unity 5ではダイナミックなGIや物理ベースライティングなどの大幅なグラフィックス機能、
刷新されたオーディオ機能など沢山の機能強化が成されていますが、Unityの進化はまだまだ続きます。
この講演では2014年に発表されたUnity 5の新機能の紹介から、Unity 5以降の機能をはじめ、
ユニティ・テクノロジーズがどのように開発者のためのエコシステムを強化していくのか、
開発者はどのようなメリットを得られるようになるのか、といったことを紹介します。

# Unity5と技術の話

## バグ修正の高速化

### Issue Tracker

* http://issuetracker.unity3d.com/
* 共通バグ・データベース+投票
* ユーザーニーズを修正優先度に反映

### Patch Releases

* http://forum.unity3d.com/threads/unity-patch-releases.246198/
* 毎週バグフィクスをリリース(すでに15週継続)
* クリティカルな修正を待たせない体制に

## 物理ベースシェーダ+GI

## New Audio System

* Mixerが入った
* Unity 5からはAudio SourceをAudio ListenerかMixerどちらに出すか選べるようになる
* BGMかSEかなどのグループを選ぶ事ができる
* ミキサーのトラックのレベルでミキシングできる
* マスターボリュームのコントロールも可能

## WebGL

* プラグインレスでUnityが動作
* 無料

## IL2CPP

* Mono・C#の利用するCLI（IL）を実行する、Mono VMに変わる新しいスクリプトバックエンド
* C#やUnity ScriptをVMで実行する代わりに、C++に変換、コンパイルして実行
* WebGLの場合はこのC++をさらにJavaScriptにコンパイルして実行
* .NET/C#の資産はそのまま使える
* 速い

## IL2CPP Performance

* マンデルブロ集合を動かしてC++やIL2cppで動かしてみた結果

|環境|速度|
|:--|:--|
|Mono 32bit|約80ms|
|Mono 64bit|約70ms|
|IL2CPP 32bit|約30ms|
|IL2CPP 64bit|約30ms|
|Firefox|約40ms|
|Chrome|約60ms|
|Safari|約60ms|
|C++ 64bit|約30ms|

* C++ 64bitとIL2CPP 32bit、IL2CPP 64bitはほぼ同じ速度

## C#5.0 & .NET4.5

* ランタイムを載せ替える事で、移植の速度やプラットフォーム対応・メンテナンス難易度が低下
* ライセンスに関する問題が解決
* 晴れてC# & .NETのバージョンをアップグレード可能に（5.xサイクル）

* Mute audioボタンがGameビューに追加されていた

## フレームデバッガとマルチスレッドプロファイラ

* http://blogs.unity3d.com/2014/07/29/frame-debugger-in-unity-5-0/

## PyhsX Update

* 2.8.3 から 3.3
* マルチコアサポート
* 2X パフォーマンス
* よりリアルな車体シミュレーション
* 使い物になるCloth
* GPU(GUDA)による布シミュレーション(5.x)
* ただし変更も大きいので再調整が必要になる事も

## 他にも

* AssetBundleの設定&ビルドの簡略化
* 64bitエディタ
* Mecanim Behaviourを含む大幅なアップデート

# 5以降の話

## Unity Cloud Build

* http://unity3d.com/unity/cloud-build

## Unity Analytics

* ゲームを配信したらプレイヤー数やセッションの増減、売上などを追跡可能に

## Unity Ads

* https://unityads.unity3d.com/

* ビデオ広告配信やユーザー同士の無料クロスプロモーションなどを実施可能

## Everyplay

* Everyplay

# まとめ

* Unityは開発支援から成功支援へ
* 開発ツールの更なる投資
* リリース後の活動支援
* ファンベース共有

# 共同作業をよりよく

* Unity5ではPrefabとシーンの持ち方を改善、衝突を解消
* さらにテキストベースでないシーンマージツールを提供ちゃんと文脈を理解してマージ可能に
* マルチシーン編集

* i18nサポート
	* よりちゃんとしたIMEサポート
	* Windowsでの日本語ユーザー名・パス名での問題解消
	* 日本語が使えるMac MonoDevelop

* 日本語エディタ
CEDEC 2014 - モバイル回線でリアルタイム通信対戦がどこまでできるか調べてみた


CEDEC 2014 開催から半年ほど経過してしまいましたが
せっかくなので当時のレポートを公開しておこうと思います

# 概要

http://cedec.cesa.or.jp/2014/session/NW/9504.html

> スマートフォン向けゲームでも、リアルタイム通信を用いたタイトル開発の需要が増えてきています。
そこで、あらゆるキャリア、あらゆる場所でリアルタイム通信のサンプルプログラムを動かして、
実際にどこまでゲームが成立するか調査、発表します。
3G回線、LTE回線がどこまでリアルタイム通信に対して性能を発揮するのか？
トンネルや電波状況の悪い場所ではどのような通信状況になるのか？
通信キャリアごとの通信品質の違いは？などなど、皆様がモバイル環境でリアルタイム通信を
用いたゲームを企画、開発するときに役立つように、モバイル回線の実力を検証します。

# アジェンダ

1. 基礎知識編(エンジニアではない人向け)
2. モバイル回線の通信品質を検証実験してみた編
3. まとめ編

# 1.基礎知識編

## リアルタイム通信とは

* 複数のプレイヤーが同時に遊ぶゲーム内容
* 自分のゲーム画面上で、他のプレイヤーが操作するキャラクターが走り回ったり、
* その相手とチャットができたりするゲーム

## リアルタイム通信を用いたゲームの同期技術

### キー同期による同期方式

* キー情報（コントローラの入力情報）を毎フレーム相手の端末に送る
* デメリットとしては、通信料を食う、悪い回線だと操作感も悪くなる
* 回線が常時安定していないと頻繁に画面か操作キャラが止まる

### 最低限のゲーム内容だけ通信する同期方式

* 貧弱かつ不安定な回線でも大人数同時プレイを実現できる方式
* 一人用ゲームに比べてゲームロジックが大幅に複雑になる
* 大人数のMOやMMORPGで採用されている
* ずれても問題ない通信をUDP通信で行う
* 同期が必要な処理だけTCP通信で行うような同期方式もある

## P2P型とサーバ/クライアント型

### P2P型

* 通信端末同士を直接繋いで通信を行う方式
* コンシューマゲーム機では標準でP2P対戦を行うためのライブラリが提供されている
* ゲームサーバを建てなくても良い
* ホストマシンがシャットダウンされたら全参加者のゲームが強制的に終わってします

### サーバ/クライアント型

* チートに強い
* 安定している
* サーバの開発費用、管理費が…

## TCPとUDP

## TCP

* 通信データが確実に相手に届く事が保証されている
* UDPに比べて、応答速度や転送速度が低いと言われている

## UDP

* 通信の安定性を保証しない通信制御プロトコル
* 応答速度や通信速度でTCPより優れている

# 検証実験してみた編

* モバイル回線を使って何人までの対戦であれば
* プレイヤーにストレス無くリアルタイム通信のゲームが遊べるのか
* 基地局を移動したときに回線状態はどうなるのか
* スマホを常時接続させてしまっても大丈夫なのか

## テストプログラム

Unityで作ったMO風ビューアプログラム
↑
｜光回線
｜
計測プログラム(AWS東京リージョン)
｜
｜モバイル回線
↓
au Xperia Z1
Docomo XperiaZ1
SoftBank AQUOS CRYSTAL

### 同期方式

* 「キー同期による同期方式」
* 同期結果が回線の品質に影響されやすいので、回線の善し悪しを視覚的に確認しやすい

### テストプログラムの内容

* データの通信経路および通信料に付いて
	* UPデータ量を1として接続人数x1を受信するプログラムとする

* 1フレーム当たりの1プレイヤーの情報量
	* 64byte

* フレーム受信に対する反応は？
	* 5秒間に周りを2周移動する

* 接続人数は何人までテスト？
	* 128

* fpsはどこまでやってみる？
	* 30,60,120,240fps

* TCPとUDPについて
	* それぞれ切り替えてテスト

* 周波数帯、機種によっての速度差は？
	* あくまで参考程度

# 平常時のping速度と応答速度を計測

* テスト条件
	* 接続人数：4,8,16,32,64,128人
	* FPS：30,60,120,240
	* プロトコル：TCP、UDP

これらの条件を1つずつ5秒間試して、次の条件に自動的に移行して
最後まで自動テストするプログラムを開発

## キャリア docomo

* 回線 LTE
* 通信制限状態 off
* 通信データ量(1Pあたり) 64

* UDPの方が早い
* 速度差は1.4倍〜1.8倍ほど
* TCPよりUDPの方が平均1.4倍高速
* AUとSoftBankもおおむね同じ結果
* UDPのパケットロスは全く発生しなかった
* 前後入れ替えのみ0.04%発生した

## キャリア au

* 回線 LTE
* 通信制限状態 off
* 通信データ量(1Pあたり) 64

* Docomoと同じくTCPよりUDPの方が速い
* パケットロスは全く発生しない

## キャリア softbank

* 回線 LTE
* 通信制限状態 off
* 通信データ量(1Pあたり) 64

* 他のキャリアに比べてpingの速度が非常に高速
* 実際のデータ転送を含めた応答時間はあまりさがなかった
* パケットロスは全く発生しなかった

## LTE通信

* 3キャリアともパケットロスは全く発生しなかった
* TCPよりUDPの方が応答速度が高速
* fpsは30以上あげても、応答速度的に変化は無かったかもしれないが  
値がばらけすぎていて、あまり断定的な事は言えない
* もっと回数を重ねてテストすると中間の平均値が撮れるかもしれないが  
外部環境に大きく依存するので、あまり意味はないかもしれない

## 3G回線

* ドコモが極端に悪い値になってしまったが、値に大きなばらつきがあるので、  
一概にドコモの3Gの品質が良くないとは言えない
* TCPは100msを軽く超えてしまう

# まとめ

* 常時接続型のオンラインゲームをモバイル向けに開発しても大丈夫
* あまり断線を気にする必要はなさそう
* 電車に乗っても混雑している駅に行っても回線が途切れる事も無く  
IPアドレスが変わる事も無かった

* 応答速度はなかなか厳しい状況
* どのくらいでNAT超えできるかスゴく興味あり
自作bash script > バイナリファイル > 16進数で指定したアドレスまでスキップしてコピー > cut-top-exec

動作確認

    CentOS 6.5

16進数で指定するアドレスまでスキップしてそれ以降の部分を切り出ししたいので、以下のスクリプトを作成した。

```bash:cut-top-exec
#!/bin/env bash

if [ $# -lt 3 ]; then
	echo "Usage:"
	echo "[cmd] [in.file] [out.file] [start address]"
	exit
fi

stadr=$(printf '%d\n' $3)  # base 16 to base 10
skipByte=$((stadr-1))
echo "skip:$skipByte"

dd if=$1 of=$2 bs=1 skip=$skipByte
```

[参考1](http://d.hatena.ne.jp/asakawajunya/20100323/1269350227)
[参考2](http://www26.atwiki.jp/funa_tk/pages/11.html)

<hr>
使い方

```
$ ./cut-top-exec 
Usage:
[cmd] [in.file] [out.file] [start address]
```

```
$ ./cut-top-exec src.bit dst.bit 0XAAB
skip:2730
2081124+0 records in
2081124+0 records out
2081124 bytes (2.1 MB) copied, 3.0834 s, 675 kB/s
```

上記によりsrc.bitの0xAAB以降のデータがdst.bitとして切り出される。
pepper Programming Tips -（番外編）pepper運用、ご安全に！-

プログラミングとは関係ないネタで恐縮ですが、今回はpepperのネットワーク接続環境についてです。

pepperは無線LAN機能を内蔵していますが、5GHz帯と2.4GHz帯に両対応しています。スマートフォンの世帯普及率が49.5%（※）になり、電波干渉を避ける意味でもぜひ5GHz帯での無線環境構築をお勧めします。

以下、当方で試した環境です。この組合せでネットワークが切れたという経験はまだないです。
モバイルルーター：docomo Wi-Fi STATION HW-01F
SIMカード：BIC SIMウェルカムパック [データ用］SMS非対応マイクロSIM
無線LAN子機：PLANEX GW-450D KATANA

選択の基準としては、
モバイルルーター：5GHz帯対応でバッテリー駆動可のもの。
SIMカード：docomo系が安心。
無線LAN子機：5GHz帯対応でハイパワータイプ（アンテナが長いもの）

動作実績とれた組合せということでご参考までに。別にメーカーの回し者とかじゃないです(^^;)

※（出典）総務省「平成24年通信利用動向調査」
.gitignore が反映されない時の対応

リポジトリに.gitignoreが追加されていると、
そのキャッシュが残ってしまい、
変更を加えた.gitignoreが反映されない様です。

なのでgitからキャッシュを削除すればいいはず。

```rb
$ git rm -r --cached .
```

↑これで反映される様になりました。
linux > バイナリファイル > 先頭をスキップしてコピー > dd if=src.bin bs=1 skip=3 of=dst.bin

動作確認

    CentOS 6.5

バイナリファイルの先頭数バイトを省いたものを作りたい。
3バイト飛ばす例。

```
dd if=src.bin bs=1 skip=3 of=dst.bin
```

[参考](http://d.hatena.ne.jp/asakawajunya/20100323/1269350227)
Contributor Code of Conduct

# Contributor Code of Conduct

## はじめに

[こっち](https://monolog.linkode.co.jp/articles/satoyama/Contributor%20Code%20of%20Conduct)に書いていたものをちょっと加筆修正してQiitaに転載します。

`bundle gem` で `--coc` オプションを付加すると `CODE_OF_CONDUCT.md` 生成されます。
そもそもこれは何？と思ったので訳してみます。
ちょっと意訳している箇所もあると思いますので、ツッコミ大歓迎です。

原文はBundler1.9.1が出力する`CODE_OF_CONDUCT.md` を元にしています。

## 翻訳

> Contributor Code of Conduct

コントリビュータ行動規範

> As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.

本プロジェクトのコントリビュータおよびメンテナとして、
問題の報告、機能の要望、ドキュメントの更新、プルリクエストの要求やパッチを提供、その他の活動を通じて
貢献してくれる人に敬意を払うことを誓います。

> We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, age, or religion.

私たちは、経験や性別、性の認識や表現、性的指向、障害、外見、体格、民族、年齢、宗教の差異に関わらず、
このプロジェクトに参加するすべての人に対してハラスメントのないように全力で取り組みます。

> Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.

参加者による容認できない振る舞いの例としては、性的な言葉や画像、軽蔑的なコメントや個人攻撃、
煽り、公的私的な嫌がらせ、侮辱、その他コントリビュータとして恥ずべき行動を含みます。

> Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team.

プロジェクトのメンテナは、この行動規範に従っていないコミット、コード、Wikiの編集、issue、およびその他の貢献に対して、削除、編集、拒否の権利と責任があります。
行動規範に従わないプロジェクトのメンテナは、プロジェクトチームから外されることがあります。

> Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers.


悪口や嫌がらせの事実、あるいはその他容認できない振る舞いはissue報告やプロジェクトのメンテナへ報告してください。

> This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/)

この行動規範はコントリビュータ協定(Contributor Covenant) バージョン 1.0.0 を基に作られました。

## あとがき

翻訳してみて、こういう行動規範が必要な状況にあまり遭遇したことがないので、ピンとこないけど、
このような文章が必要な背景はなんとなく分かります。
Githubでもこの文章を掲げているリポジトリが幾つかあるので、
必要性をあまり感じない人でも、最低限知識として頭に置いておくべきだなと思いました。
linux > バイナリファイル > 異なる部分だけ表示する > cmp -l src.bit dst.bit | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' | less

動作確認

    CentOS 6.5

2つのバイナリファイルの違う部分だけ表示するには以下のコマンドを実行する。
[参考](http://superuser.com/questions/125376/how-do-i-compare-binary-files-in-linux)


```
$ cmp -l src.bit dst.bit | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}' | less
0003CD80 02 00
0003CD81 08 00
0003CD84 00 08
...
```

strtonum()において0を`$2`と`$3`の前に入れているのは、もともとが8進数として与えられているからだと思われる。

$cmp実行結果が

```
cmp: EOF on src.bit
```
となった場合は、src.bit全部がdst.bitに含まれていて、dst.bitにはさらにバイナリデータが続くということを意味する。
[参考](http://h50146.www5.hp.com/products/software/oe/tru64unix/manual/v51a_ref/HTML/MAN/MAN1/0244____.HTM)
ActionbarActivityのタイトルの変え方

メモする程の事ではないかもしれませんが、メモします。

ActionbarActivityのタイトルを変更したくなった時どうするかです。

```
getSupportActionBar().setTitle("テスト");
```


を追加すれば、簡単に変更ができます。

```
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);

        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setTitle("テスト");
    }
```

こんな感じでしょうか。
PGPを利用してファイルを暗号化する

# PGPを利用してファイルを暗号化する

## PGPとは

Pretty Good Privacy（プリティ・グッド・プライバシー）の略で暗号ソフトウェアです。

[公開暗号方式](http://ja.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7)を採用している。

1. 平文を暗号化する際に、当該平文を圧縮する
2. セッション鍵を作成し、共通暗号方法で復元
3. セッション鍵は受け手の公開鍵を暗号化し、暗号文とともに送信する
4. 受け手は、自分の秘密鍵で復号化したセッション鍵を用意て暗号文を復元する

※ セッション鍵は使い捨ての秘密鍵

### 参考URL
- [PGPでメールを暗号化する - ITmedia](http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cad=rja&uact=8&ved=0CDsQFjAD&url=http%3A%2F%2Fwww.atmarkit.co.jp%2Faig%2F02security%2Fpgp.html&ei=77MQVeDDIsPz8gWt1oCQDg&usg=AFQjCNGRUc2X2YkI9Ru50MxLmSrrGWWwkg)

## gpgコマンドを利用してファイルを暗号化する

gpgコマンドを利用し公開暗号方式で暗号化し、ファイルのやりとりをする。

### gpgで秘密鍵を作成する

`gpg --gen-key`

上記のコマンドを入力すると下記様な質問を幾つかされるが基本デフォルトで大丈夫です。

- ご希望の鍵の種類を選択してください
- RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048)
- 鍵の有効期限を指定してください。

次にに本名、メールアドレス、コメントの入力を求められますが**本名、メールアドレス**は適当なものを入力する。

最後に乱数生成のために待機に入るのだがSSHでログインしてる場合キー入力を受け付けないのでハングしてしまったかのような振る舞いになるが、別セッションで`dd if=/dev/urandom of=/tmp/mass bs=1M count=16384`などのコマンドで大きめのファイルを生成する事で時間を短縮できる。だいたい10分くらいで生成できる。

### 鍵の確認
`gpg --list-keys メールアドレス`

### 公開鍵を作成する
foo.keyという公開鍵を作成する
`gpg --export -a メールアドレス > foo.key`

### 公開鍵を鍵束に取り込む
foo.keyというファイル名の公開鍵を貰ったと想定
`gpg --import foo.key`

### 鍵束にある公開鍵の
`gpg --fingerprint メールアドレス`

### 暗号化
`gpg -e -a -r メールアドレス ファイル名.txt`

### 復元
`gpg ファイル名.txt.asc`

### 参考
- [GnuPG を使って暗号化したり署名したりする](http://pochi.usamimi.info/linux/gnupg.html)

## gpg-agentでパスの入力を省略する
復元するときにパスの入力が必要なのを立ち上げておくことでかわりにしてくれる。

### gpg-agentを常駐させる
`gpg-agent --daemon -v --use-standard-socket `

### バッチなどでパスフレーズを聞かれずに使用する方法

簡単で、以下の通りのコマンドでOK

`echo 【復号化パスフレーズ】| gpg --passphrase-fd 0 --decrypt --batch --no-secmem-warning 【復号化したいgpgファイル】`

「--passphrase-fd 0」と「--batch」オプションを用いて、標準出力でパスフレーズを渡す方法でとっても簡単です。

なお、「--no-secmem-warning」は「gpg: Warning: using insecure memory!」のエラーが出ないようにするおまじないです。

- [gpgでパスフレーズを聞かれずにファイルを復号化する方法](http://qiita.com/hanamiche/items/f2b666f6bfacb561999a)

### 圧縮ファイルを暗号化
tarで圧縮後gpgで暗号化
`tar -c [failename].* > [filename].tar | gpg -e -a -r [メールアドレス] [filename].tar`

### 圧縮ファイルの展開

`tar xvf filename.tar`
Rubyのスクリプトで、Chatworkに自動でタスク追加


会社の勤怠管理で使っているWebサービスにかなりの確率でログインするのを忘れ、
その度に打刻修正するはめに。。

会社ではチャットワークを導入しており、毎日見ているしタスク機能をよく使っている。
「出退勤の打刻しろ」というタスクを、チャットワークAPIを利用して自動でアサインしておけば多少マシになるのでは...と思い、Rubyでスクリプト書いた。

APIを使う上で、chatwork-rubyという便利なラッパーがあったので、そちらを利用しました。

[asonas/chatwork-ruby](https://github.com/asonas/chatwork-ruby)

```
> gem i chatwork
```

ほかに準備するのは、

- チャットワークAPIトークン

のみ。

タスクをアサインするエンドポイントは`POST /rooms/{room_id}/tasks`。
リクエストに含めるパラメータは、

- `body`: タスクの内容（必須）
- `limit`: タスクの期限 (UNIX time)（任意）
- `to_ids`: アサインするユーザーのID（必須、複数人の場合はカンマ区切りで）

の3つ。`room_id`と合わせて4つのパラメータを利用する。

以下、Ruby2.2.1で試した。

```ruby:chatwork_attendance_task.rb
require "chatwork"
require "date"
require "time"

ChatWork.api_key = <CHATWORK_API_TOKEN>

unix_time_limit = Time.parse(Date.today.to_s).to_i
room_id         = <ROOM_ID>
to_ids          = "XXXXXX"

ChatWork::Task.create(
  room_id: room_id,
  body:    "【自動投稿】出勤しなさい",
  to_ids:  to_ids,
  limit:   unix_time_limit
)
```

これを実行すると、タスクが作成される。

![スクリーンショット 2015-03-24 13.35.44.png](https://qiita-image-store.s3.amazonaws.com/0/1795/4db80373-d6c8-5557-018e-dcc30016dbfc.png "スクリーンショット 2015-03-24 13.35.44.png")

これをcronとか使って毎朝（晩）定期実行させれば良さそう。
Incorrect datetime value（my.cnfでSTRICTの設定を入れたことで自動変換してくれないエラー）

## 環境
* MySQL5.6
* yumでインストール

## エラー内容
my.cnfの設定で
```sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES```
が入っていると（mysql5.6だと初期値とのこと）、例えば

* データベースのあるテーブルの日付の型：TIMESTAMP
* そのテーブルにmysql側で入れる時間の型：DATETIME

になっていると```Incorrect datetime value```というエラーが起きる

原因は```STRICT_TRANS_TABLES```よりストリクトモードとなり
「無効なデータなどの挿入、更新時にエラーを発生させる状態」
今回で言えば「日付の型が違ったため」
である。

## 対策
```
# sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
sql_mode=NO_ENGINE_SUBSTITUTION
```
としてあげればok

## 参考
ググればいろいろ出てくるが僕は[ここを参考に](http://onlineconsultant.jp/pukiwiki/?MySQL5.6%E3%81%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC1292%20-%20Incorrect%20datetime%20value%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B)
タッチイベントでもマウスイベントでも操作できるUIを作る実装方法

* 序文
スマートフォンの普及によってタッチイベントをJavascriptから扱うようになって久しいですが、
世の中には「タッチイベントもマウスイベントもサポートしている端末」というものがあります。
そして、こういう端末はマウスでクリックすると「touchstartに続けてmousedownイベントが自動で発火する」
という困った特徴があったりします。
windows8もその一つです。
マウスでもタッチでも操作できるのがこういう端末のUIとしては理想ですが、実装が難しく、
タッチのみに対応させるのが関の山でした（タッチをサポートしてる端末を判定してタッチで処理させる実装）
マウスのみサポートだと、スマートフォンで動きませんからね。。。
しかし、ようやく、この問題をどうにかクリアできる実装を考え出せたっぽいので、ここに公開します。

* イベントはtouchstart⇒mousedownの順で発生するっぽい
なので、まずイベントハンドラの一つ外側のスコープに即時関数を定義して、
そこにイベントタイプ記録用の変数を用意してnullで初期化します。

* イベントタイプを判定する
イベントハンドラ先頭で保存したイベントタイプ文字列がtouchstartで、かつ現在のイベントタイプがmousedownか判定する。
判定処理を先に書いて判定結果が真なら何もせずにreturnする（必要に応じてpreventDefaultも実行）

* 現在のイベントタイプ文字列を保存する
イベントハンドラの引数にeを書いてe.typeで取れます。

* 保存したイベントタイプをnullクリア
ここが重要です。
クリアしないと次回以降正常動作してくれませんが、クリアをすぐに行ってはいけません。
クリア後にmousedownが発生してしまいます。

* setTimeout!
はい。「300ミリ秒後」かそれ以上後の時間を設定してsetTimeout内でクリアします。
これで最初のイベントだけを処理対象にできます。

* 応用
フリックスクロールをタッチ、マウス両方で行う方法です。
イベントタイプの保存は同じですが、
touchstart、mousedown時に保存したイベントタイプを
「touchendかmouseup」でnullクリアします。
※タッチ、マウスの座標の取り方の違いを吸収する実装も忘れずに！
さらに、touchmoveでは保存したイベントタイプがtouchstartである場合だけ、
mousemoveでは保存したイベントタイプがmousedownである場合だけ処理を行います。
touchend、mouseupも同様に保存したイベントタイプを見て対応するデバイスのイベントだった場合のみ処理を行います。

* 実際の利用例
僕の公開しているSNSのタイムラインクリック時にメニューを開く実装で利用しています。
（ブラウザのウィンドウ内の高さが狭くなって「返信」ボタンが消えてる状態で機能します）

SNSは以下。

[todays!](https://todays-log.com)
Heroku で Rails アプリを使う場合は必ず config.ru が必要らしい

先日、他の人の Rails アプリケーションがローカルだと動くのになぜか Heroku で動かないってことがありました。
WEB で開いても Application Error ってなるだけ。

# とりあえず `heroku logs`

まあ、こういう場合はとりあえず `heroku logs` ですね。

ちょっと出力例がないのですが、application crashed 的なことしか書いておらず、詳細がありませんでした。


# `heroku logs` のログレベルを変更する

`heroku logs` の出力が少ない場合には

```
heroku config:add LOG_LEVEL=DEBUG
```

とやるとログの出力レベルを DEBUG まで下げられます。


# config.ru がないらしい

すると、`heroku logs` と叩いたときに

```
configuration /app/config.ru not found
```

と出てきました。確かに Rack のアプリケーションだと必要になると[公式ドキュメント](https://devcenter.heroku.com/articles/ruby-support#rack-applications)には書いてありますね…。

このファイル、Rails のアプリケーションだと、テンプレートのものが生成されるようになっており、変更することはあまりないと思うので、とりあえず他の Rails アプリからコピーしてきました。

```ruby:config.ru
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run Rails.application
```

いつもの

```
git add config.ru
git commit -m 'Add config.ru'
git push heroku master
```

としたところ、直りました！

最後にログレベルも除いて落としておきましょう。

```
heroku config:remove LOG_LEVEL
```

# config.ru はマスト？

とりあえず上で問題は直ったのですが、Rails アプリケーションの場合は `Gemfile.lock` の内容を見ると[ドキュメント](https://devcenter.heroku.com/articles/ruby-support#rails-4-x-applications) に書いてあるので、`config.ru` がなくても Rails アプリケーションだと認識して、うまいことやってくれる、とも取れるんですがねー。

まあ、ドキュメントの記述が少し足りないだけで、Rack アプリだから、`config.ru` は当然必要でしょってだけかもしれません。
【注意！！】windows10 Build 10041にVirtualBoxをインストールするとOS起動しなくなる

## 同現象の方々

* [Boot2Docker install breaks Windows (10) Technical Preview login · Issue #771 · boot2docker-boot2docker · GitHub](https://github.com/boot2docker/boot2docker/issues/771)

> btw: removing of vbox*.sys from /windows/system32/drivers "solves" the problem.
> sits to lotus position, waits for new release


## 問題

* 最新版のVirtualboxと、boot2docer1.5がインストールするVirtualboxにて現象確認。
* SafeModeに入れない(F8ではなかったため、入り方がわからない)ため治せない
  * -> OS再インストール

VMWareは大丈夫だった
DatastoreのデータをBigQueryに入れてSELECTする方法


#何が楽しいか
DataStoreのデータはGQLを使って検索できるけど、自由度が低い。わざわざプログラム組むのも面倒。BigQueryに入れれば高速で自由なSQLで検索が出来る！

#手順
##bucketを用意する
GAEコンソール([https://console.developers.google.com/](https://console.developers.google.com/))(新GAEコンソール)からStorage Browserを選択する。
初めての場合はCreate a bucketをする。

![create_bucket.png](https://qiita-image-store.s3.amazonaws.com/0/17419/e72679bf-9c68-417f-4a3f-76300361758f.png)

bucket名がDatastoreを入れる場所になる。

![new_bucket.png](https://qiita-image-store.s3.amazonaws.com/0/17419/48029ed5-8c13-74ff-4907-860d4e525648.png)

##DatastoreAdminでBackup
GAEコンソール([https://appengine.google.com/](https://appengine.google.com/))から、Datastore Adminを選ぶ。
*旧コンソールのみでしかDatastore Adminは存在しないので注意してください*(2015/03/24現在)

初めての場合はEnable Datastore Adminをクリック。
![Datastore AdminEnableDataStoreAdmin.png](https://qiita-image-store.s3.amazonaws.com/0/17419/ae7e3a61-c669-0f3b-0fd9-25856efb9b95.png)
すると画面が変わるので、BigQueryに入れたいModelを選んでBackup Entitiesを押す。

![selected_model.png](https://qiita-image-store.s3.amazonaws.com/0/17419/a5884b55-eaaa-7142-0cea-4025d940aacb.png)




Backup storage destination:をGCSにする。
Google Cloud Storage bucket nameを、用意したbucket名にする。
![Datastore_backup.png](https://qiita-image-store.s3.amazonaws.com/0/17419/dfc366fd-a54d-acff-db84-04e4d651d46f.png)

うまくいくとこんな感じの画面が出る。
![backup_job.png](https://qiita-image-store.s3.amazonaws.com/0/17419/57dea825-4aed-bfb3-c95f-3f25290bfa3b.png)

しばらくすると、用意したbucketにファイルが出来る。

##BigQueryを開く
CreateNewDataSetを選ぶ
![create_new_dataset.png](https://qiita-image-store.s3.amazonaws.com/0/17419/633231a3-85a8-2a51-e7bd-d9aa0a844afb.png)

DataSet IDは何でもいい。お好きなので。
![dataset_id.png](https://qiita-image-store.s3.amazonaws.com/0/17419/5555622c-5c35-4b76-3986-2cd4b1c67fd2.png)

Create new tableを選ぶ。
![create_new_table.png](https://qiita-image-store.s3.amazonaws.com/0/17419/9e8bedff-03e7-f171-234f-0b2735648977.png)

table idはModel名がわかりやすい。
![table_id.png](https://qiita-image-store.s3.amazonaws.com/0/17419/cba9e37f-5b93-275b-492f-e2521945169b.png)

SelectDataで、Cloud DataStore Backupを選ぶ。
gs://[bucket名]/[Modelファイル名].backup_info
間違えるとうまくいかないだけなので、大丈夫。
それでsubmitする。

![select_data.png](https://qiita-image-store.s3.amazonaws.com/0/17419/a0c282d4-c929-984c-76fe-8180a0683d47.png)

Recent Jobsでうまく行ったか教えてくれます。
![job_result1.png](https://qiita-image-store.s3.amazonaws.com/0/17419/b648095e-0665-ec4e-4ad8-f9e6b01d4368.png)

#BigQueryライフへ！

今までGQLで使えなかったGROUP BYやHAVINGやJOINが使えます！
今までだったら「プログラム組むしかないなぁ…」と思ってたのがこれで改善されます！！
【Unity】Caching.CleanCache()でフォルダにロックがかかる不具合の調査レポート


Unityでスマホゲームを開発中に
キャッシュに溜まったアセットバンドルを一括削除するために
`Caching.CleanCache()`を呼び出したところ
一部のAndroid端末でアセットバンドルのダウンロード先のフォルダが
ロックされてしまう不具合に遭遇したので検証してみました
その検証結果を覚書として残しておきます

* 検証端末：Xperia Z2
* Unityのバージョン：4.5.3

# 結論

1. `Caching.CleanCache()`
2. `System.IO.Directory.Delete()`

__どちらでもフォルダロックが発生した__

削除された時点でフォルダが存在しないが、OS側で参照したままになっていて
フォルダが生成された時点でロックされている？OSの問題？（憶測）

# 発生タイミング

1. アプリの初回起動時に`Caching.CleanCache()`を実行した時
	* 特に問題なし

2. アセットバンドルのダウンロード完了後に
アプリを再起動してから`Caching.CleanCache()`を実行した時
	* 特に問題なし（UnityCache/Sharedフォルダは存在しない）  
`Caching.ready`:`true`  
`Caching.enabled`:`true`  

3. その後、アセットバンドルのダウンロードを開始した時
	* フォルダロックが発生（UnityCache/Sharedフォルダ）  
`Caching.ready`:`true`  
`Caching.enabled`:`true`  

`Caching.CleanCache()`を実行した後に
アセットバンドルのダウンロードを開始するとフォルダロックが発生する？

# 施策

## `Caching.CleanCache()`の実行前にキャッシュの容量を確認する（失敗）

```cs
if ( Caching.spaceOccupied > 0 ){
	Caching.CleanCache();
}
```

アセットバンドルダウンロード前：フォルダロックが発生しなかった
アセットバンドルダウンロード後：フォルダロックが発生した

キャッシュの容量が0の時に`Caching.CleanCache()`を呼び出すと
フォルダにロックがかかってしまう訳ではなさそう

## `Caching.CleanCache()`の実行後にアセットバンドルのダウンロード先のフォルダを自前で作成する（失敗）

```cs
System.IO.Directory.CreateDirectory( Application.persistentDataPath + "/UnityCache/Shared" )
```

上記の関数を実行したタイミングでフォルダロックのエラーが発生した

## `Caching.CleanCache()`を使用しない（失敗）

`Caching.CleanCache()`の代わりに
`System.IO.Directory.Delete( Application.persistentDataPath + "/UnityCache" )`
を実行した場合もフォルダロックが発生した

## `Caching.enable`の無効化を試す（失敗）

`Caching.enable = false`を行うと
実行時にread-only属性を示すエラーが表示される

## エクスプローラアプリでSharedフォルダを削除（失敗）

タイトル画面表示直後：削除できた
アセットバンドルのダウンロードを開始した後：フォルダロックが発生した
GitHubでpdfのプレビュー表示ができるようになったよ

タイトルのとおりです。

今までは、GitHubでブラウザ上のpdfファイルを選択しても、その中身までは確認することができませんでした。

- [Left-clicking a PDF in GitHub should display it in the browser or download it? - Stack Overflow:](http://stackoverflow.com/questions/22936584/left-clicking-a-pdf-in-github-should-display-it-in-the-browser-or-download-it)

しかし、GitHub Blogの[PDF Viewing:](https://github.com/blog/1974-pdf-viewing)にあるように、mozillaのプロダクトである[PDF.js](https://github.com/mozilla/pdf.js/)を用いて、ブラウザ上でPDFが表示出来るようになったようです。このPDF.js自体もかなり使えそうなので、勉強してみたいところですが、とにかく、これでGitHub上のたくさんのPDFファイルをダウンロードする手間なしに閲覧できるということで、挙げる側も見る側も、一層便利になるのではないでしょうか。

![https://cloud.githubusercontent.com/assets/2546/6703741/cbb216c0-ccfc-11e4-9c15-ecb6a33e8ddb.gif](https://cloud.githubusercontent.com/assets/2546/6703741/cbb216c0-ccfc-11e4-9c15-ecb6a33e8ddb.gif)


こちらも参考に:
[GitHub が PDF ファイルのプレビューに対応 | WWW WATCH:](http://hyper-text.org/archives/2015/03/github_pdf_preview.shtml)
[Rails 4.1] プロジェクト名の変更

Rails4.1系のプロジェクト名を変更する際のメモです。

# 手動

以下の二箇所で大丈夫そうです。。。。

- config/application.rb
- config/initializers/session_store.rb


```rb:config/application.rb
module ProjectName
 
end
```

```rb:config/initializers/session_store.rb
 Rails.application.config.session_store :cookie_store, key: '_project_name_session'
```

簡単。
でも不安。。。

# Gemに頼る

[これ](https://github.com/morshedalam/rename)に頼ります。

- install

```rb:Gemfile
gem 'rename'
```

- Usage

```rb
$ rails g rename:app_to NewName
```

これだけ。


# References

- http://blog.hello-world.jp.net/ruby/2334/
- http://stackoverflow.com/questions/20988813/how-to-rename-rails-4-app
- https://github.com/morshedalam/rename
【Scala】StrategyパターンでTwitter投稿を実装してみた

##概要
<a href="https://dev.twitter.com/rest/public" target="_blank">TwitterAPI</a>を利用してTwitterに投稿する機能を作って欲しいという要望があったので、Scalaで実現してみました。

後々、コンテキストは変えずにヨコ展開して欲しいといった(例えばFacebookで投稿したいといった)要望が出てくると思われるので、今回はStrategyパターンを利用しました。

<a href="http://ja.wikipedia.org/wiki/Strategy_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3" target="_blank">Strategyパターン</a>ってのはGoFデザインパターンの1つですな。

##設計に関して

■やり取り
ディレクター「〜の条件で、Twitterに投稿する機能を実装してほしい」
私「なるほど。では、今後、〜の条件でFacebookに投稿するといったことも考えられますか？」
ディレクター「そうしてくれたら嬉しい。まずTwitterに投稿することを実現してほしい」

■Strategyパターンを選んだ経緯
「〜の条件で」(Context)ってのは固定らしい。
今回はTwitterに投稿するという戦略(Strategy)を実装すればよいが、
別の戦略(予測できる戦略は「Facebookに投稿する」という戦略)に切り替えられ、
また併用できるような設計にした方が望ましいだろう。
戦略はTwitterやFacebookといったソーシャルメディアに投稿する戦略。
抽象化するならソーシャルメディアに限定するのもよろしくないので、インターフェースを「外部メディア」としよう。

クラス図はこんな感じだろう。
![strategy1.png](https://qiita-image-store.s3.amazonaws.com/0/1700/33861822-ceb8-ad8d-cfa4-20fcb297bb71.png)


では、実装に移ろう。(※業務ロジックは省いてます)

###1.Strategy(戦略インターフェース)

```scala
trait ExternalMediaStrategy {
  def post(message: String)
}
```


###2. ConcreteStrategy(具体的な戦略役:Twitter)
```scala
class TwitterStrategy(
  val consumerKey: String,
  val consumerSecret: String,
  val accessToken: String,
  val accessTokenSecret: String,
  val debug: Boolean = true
) extends ExternalMediaStrategy {

  private lazy val cb = new twitter4j.conf.ConfigurationBuilder()
  cb.setDebugEnabled(debug)
    .setOAuthConsumerKey(consumerKey)
    .setOAuthConsumerSecret(consumerSecret)
    .setOAuthAccessToken(accessToken)
    .setOAuthAccessTokenSecret(accessTokenSecret)
  
  private lazy val twitter: twitter4j.Twitter = new twitter4j.TwitterFactory(cb.build()).getInstance()

  def post(message: String) = {
    twitter.updateStatus(message)
  }
}
```

###3. Context(コンテキスト:状況判断)
```scala
class ExternalMediaContext {
  def contribute()(implicit externalMediaStrategy : ExternalMediaStrategy) = {
    val message = "message"
    externalMediaStrategy.post(message)
  }
}
```

###4.Client(利用者)
```scala
object MyApp extends App{
  ....
  
  def shareTwitter() = {
    implicit val strategy = new TwitterStrategy(
      consumerKey,
      consumerSecret,
      accessToken,
      accessTokenSecret,
      debug
    )
    val context = new ExternalMediaContext()
    context.contribute()
  }
}
```

ちなみに具体的な戦略役を増やす場合はこんな感じ。

```scala
class FacebookStrategy(....) extends ExternalMediaStrategy {
  def post(message: String) = {
    ...
  }
}
```

そんでもってClient(利用者)でこんな感じで呼び出してあげる

```scala
object MyApp extends App{
  
  def shareFacebook() = {
    implicit val strategy = new FacebookStrategy(....)
    val context = new ExternalMediaContext()
    context.contribute()
  }
}
```

これなら、Facebook対応する場合もConcreteStrategy(具体的な戦略役)を追加するだけで対応できるでしょう。

今回はTwitterのみ具体的な実装を書きました。
※<a href="http://twitter4j.org/ja/index.html" target="_blank">Twitter4J</a>を利用してます。

<div>
build.sbt載せておきます。

```build.sbt
libraryDependencies ++= Seq(
  "org.twitter4j" % "twitter4j-core" % "4.0.2"
)
```
Raspberry PiでI2Cを使う。raspi-blacklist.confが無い時

I2Cの温度センサーを使うためには
>raspi-blacklist.confからI2Cをコメントアウトする

と色んなサイトに書いてあるのですが、僕のラズベリーパイにはraspi-blacklist.confがありませんでした。
どうやら2015年1月くらいから？この部分の管理方法が変わっているようです。

と言うことで、I2Cデバイスを使うための新しい方法を記載しておきます。

#手順

##1.
raspi-config を入力

## 2.
「8 Advanced Options Configure advanced settings」を選択
![スクリーンショット 2015-03-23 22.50.51.png](https://qiita-image-store.s3.amazonaws.com/0/58437/551a9564-66c7-1649-61c2-2c5853e88d22.png)
## 3.
「A7 I2C Enable/Disable automatic loading」を選択
![スクリーンショット 2015-03-23 22.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/58437/445f3711-31e2-c6ca-ea08-2b4917e0efbc.png)
## 4.
「はい」を選択
![スクリーンショット 2015-03-23 22.51.07.png](https://qiita-image-store.s3.amazonaws.com/0/58437/fe06cf8e-4ee4-f543-11b1-25cdf18cb768.png)
## 5.
「了解」
![スクリーンショット 2015-03-23 22.51.13.png](https://qiita-image-store.s3.amazonaws.com/0/58437/86743860-7a8a-3005-d938-8d97d6dc6778.png)
## 6.
Would you like the ARM I2C interface to be enabled?
はい
![スクリーンショット 2015-03-23 22.51.17.png](https://qiita-image-store.s3.amazonaws.com/0/58437/ef667008-18a4-3cca-49e8-5ed38141812e.png)
## 7.
了解
![スクリーンショット 2015-03-23 22.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/58437/1d5412c7-6567-af52-08bf-af448f79d5bb.png)
Eclipseで[F3](宣言を開く)が効かない

プロジェクトの中に__新しいPHPフォルダを追加__した時、その中のphpファイルでF3が効かない事がありました。
過去にも発生していて、すっかり対処法を忘れていたのでメモ。

#よく見る対処法
__Google__で「eclipse f3 効かない」などと検索すると、大抵
>プロジェクト上で右クリックして、構成から[PHPサポート追加]
引用：[[eclipse(PDT)] 宣言が開けないときの対処法](http://b.0218.jp/20140923043749.html)

という対処法が載っています。

しかし、私はプロジェクトの中にjs、htmlファイルなども入っています。
そのためか、[PHPサポート追加]が暗転していてクリックできませんでした。
今回はそんな場合の対処法を以下に載せます。


#[PHPサポート追加]ができない場合の対処方法

>1.　プロジェクト上で右クリックして、ビルド・パス
2.　左のツリーから[PHPビルド・パス]を選択
3.　[ファルダーの追加]
4.　F3が効かなかったフォルダーにチェックを付ける
5.　[OK]ボタンで完了


私はこれで解決しました。
同じような症状で悩んでいる方の参考になれば。
Max OSX Yosemite と Linux でシステムの timezone を変更する方法

# Timezone変更の方法

システムのtimezoneを変更した際のメモです。
以下はMaxOSX Yosemiteで行った際のメモになります。

## Mac Yosemiteでは
System Preferences > Date & Time > Timezoneから指定ができます。
これで画面上部の時刻表示の部分が管理されている様です。

![Screen Shot 2015-03-24 at 11.23.02.png](https://qiita-image-store.s3.amazonaws.com/0/18705/653c9c54-bf08-547f-e366-d24143767dfb.png)

あとで分かりましたが、これから紹介するtimezone変更方法を使って変更しても、ここで指定したTimezoneのまま表示されました。


## システム的には

timezoneからlocaltimeを指定しているファイルは以下ににあります。

```rb
/etc/localtime
```

ここに書き込んである内容がlocaltimeとして使われるようです。


各timezoneのファイルは以下にあります。

```rb
$ ls /usr/share/zoneinfo
---
./           Asia/        Canada/      Egypt        GB-Eire      HST          Jamaica      MST7MDT      PST8PDT      Singapore    W-SU
../          Atlantic/    Chile/       Eire         GMT          Hongkong     Japan        Mexico/      Pacific/     Turkey       WET
Africa/      Australia/   Cuba         Etc/         GMT+0        Iceland      Kwajalein    NZ           Poland       UCT          Zulu
America/     Brazil/      EET          Europe/      GMT-0        Indian/      Libya        NZ-CHAT      Portugal     US/          iso3166.tab
Antarctica/  CET          EST          Factory      GMT0         Iran         MET          Navajo       ROC          UTC          posixrules
Arctic/      CST6CDT      EST5EDT      GB           Greenwich    Israel       MST          PRC          ROK          Universal    zone.tab
```

なので、↑から/etc/localtimeへ中身をコピーするなり、シンボリックリンクを貼るなりするといいかと思います。

```rb
$ sudo rm /etc/localtime; sudo ln -s /usr/share/zoneinfo/Japan /etc/localtime
```

ちなみにJSTはJapan、UTCはUTCにの中に記述があります。


# timezoneを変更してみると

先述の通り、Macの時刻表示の部分は変化しませんでした。（正確には一度変更が反映されたけど、数秒後元に戻りました）

Mac上のアプリでは反映されていました。
PM 5:41の後TimezoneをJST->UTCに変更し、PM 6:35ころ、UTC->JSTに変更した際の、LINEの画面です。
![ネコ型てっちん.png](https://qiita-image-store.s3.amazonaws.com/0/18705/155aedb0-a785-c5cf-bc42-fab4f3970b06.png)
PC的氛围，H5的玩法


## 问题

1. TMS编辑发布非常影响效率。 在和淘宝部门协调跟进。
2. 建站功能不健全。 在和建站的同学协商升级。
3. 时间紧张。 客观因素，不多说。
4. 外投需求多，临时性比较常见。

## 氛围

1. 飞花，提升氛围
2. 弹性布局，适应不同屏幕。
3. 动态logo，飞蝴蝶 @三番 

## 玩法

1. 0元抽，整合抽奖和查看，视觉冲击强。
2. 红包，应对多投放，区分各个来源。引流下载APP。
情報工学部での学生向けVR演習へのUnity3Dの導入：USC2014


立命館大学情報理工学部メディア情報学科では、実施しているVR実習の開発環境にUnityを採用しました。
面倒なデバイスの制御を全てUnityに任せることで、
仮想空間のシミュレーション部分だけを実装する事で、
初学者でも豊かなVRアプリケーションを開発できるようになった事例についてお話しします。

#セッション概要
* Unityソリューションカンファレンス 2014
* [2014年12月4日（木）11:00〜11:40](http://japan.unity3d.com/events/usc2014/schedule.html)
* 立命館大学MxD研究室　野間春生

#VRシステムの基本構成

ユーザーの操作→入力システム→シミュレーションシステム→出力システム→聴覚表示
センサー入力→VR世界のモデル（→シミュレーション）→レンダリング→ディスプレイ

現在は、ゲーム物理エンジンの台頭により、物理計算の大部分が隠蔽化され、センサー、レンダリング、ディスプレイの制御までをUnityが実施してくれ、簡単に実現できるようになった。

#講義としてのVRの目的

人口実現とそれを支えるヒューマンインターフェイス技術について課題作品の制作を通して学ぶ。
* VRを構成するセンサ、シミュレーション、ディスプレイの各要素技術の機能を理解する
* 要素技術を組み合わせた独自の課題作品をデザインし、制作を通して理解する
* グループとして課題の解決と実現を目指す

#最近のVRカリキュラム
Unity3Dによる統合開発環境によって、VRの基本構成の開発に集中できる

メリット

* GUIによる効率的な開発
* オブジェクト指向
* 物理エンジンによる世界シミュレーション
* 最近のセンサやディスプレイの導入
* 見た目が綺麗で派手

デメリット

* シミュレーションの内部構造がブラックボックス化

##カリキュラムその１
仮想物体の自由落下と反射を再現するプログラムを、CとUnityでそれぞれ実装し、
その違いを通してシミュレーションの機能と必要性を理解する

* C言語で、オイラー法による自由落下の数値解析をし、シミュレーションを実装する（90分）
* 珠と立方体オブジェクトに衝突と重力設定を与えるのみ（10分）

##カリキュラムその2
Unity3Dの習熟のために、用意した教材を使って、2Dゲームと1.5認証ゲーム環境を実装する。
Unityの伊藤さんが公開している「[Angry Chicken](https://gist.github.com/makoto-unity/4586393)」と「[Temp Run](https://gist.github.com/makoto-unity/6094663)」のサンプルを180分で作らせる講義。

##カリキュラムその3（3〜6週）
各班に別れ、テーマに対して自由に課題作品を制作する。

##グループワーク用教材
いろんな機材を用意したが、インターフェイスは全部で20万もせずに揃えることができる時代。
* タブレット
* バランスWiiボード
* Kinect
* Webカメラ
* Wiiリモコン
* ゲームパッド
* スピーカー
* Oculus Rift

Unityの基本テクニックの補助教材を提供した。

* Oculus Riftの利用
* WiiリモコンとWiiバランスボードの利用
* USBゲームパッドの利用
* MRシステムとタブレッドの利用
* MRシステムとタブレットの利用
* Kinectの利用
* MMDの導入
* ゲームオープニング画面とシーン
* MetasequoiaでFBXファイルの生成方法

##カリキュラムその4　作品発表＆評価

作品発表では、各飯米に作品を発表し、チャンピオンを決定。

（例１）立命館大学のキャンパスを全部モデリングして、すべての建物を写真とってテクスチャ化し、
　　　キャンパスまでを歩くというゲームを作成
（例２）遊園地の乗り物をたくさん作って楽しむ。ジェットコースター、観覧車などを作成した。
　　　ソフトウェアコンテストに応募するために、その後拡張した。
　　　（Unity＋Uniduino＋Arduino+SSR）

Unity3Dでに落下シミュレーション実装は、C言語を用いた場合より簡単に作成できた。
また、オブジェクト構造（Scene Graph）が把握しやすかった。

#卒業研究でのVRシステムの開発へのUnity3Dの導入
MxD-Labの研究目的は、社会の役に立つメディアのあり方を研究する。

##研究例
インターネットの仮想空間上でロボットコンテストを開催するためのフレームワークを作成する。
fishのディレクトリ移動コマンド

```
function _peco_change_directory
  if [ (count $argv) ]
    peco --query "$argv "|perl -pe 's/([ ()])/\\\\$1/g'|read foo
  else
    peco|perl -pe 's/([ ()])/\\\\$1/g'|read foo
  end
  if [ $foo ]
    eval cd "$foo"
  else
    commandline ''
  end
end
function peco_change_directory
  begin
    echo $HOME/Documents
    echo $HOME/Desktop
    ls -ad */|perl -pe "s#^#$PWD/#"|egrep -v "^$PWD/\."|head -n 5
    sort -r -t '|' -k 3 ~/.z|sed -e 's/\|.*//'
    ghq list -p
    ls -ad */|perl -pe "s#^#$PWD/#"|grep -v \.git
  end|awk '!a[$0]++'|_peco_change_directory $argv
end
```
ghqの出力をや.zをまぜたりディレクトリの重複を取り除いたり空白を含む行に対処したり
いろいろしている。

ソートしないで重複行を削除する
http://qiita.com/arcizan/items/9cf19cd982fa65f87546
Unityを使った映像コンテンツの作り方：USC2014

#セッション概要
* Unityソリューションカンファレンス 2014
* 2014年12月4日（木）11:00〜11:40
* [クリプトン・フューチャー・メディア株式会社](http://www.crypton.co.jp/)　田中正宏

#イーハトーヴ交響曲
冨田勲先生作曲の作品にソリストとして初音ミクが採用された。
従来のコンサートでは初音ミクに演奏が合わせていたが、今回はオーケストラとのコラボと言うことで、初音ミクも指揮に合わせて歌ったり踊ったりするシステム。

![2015-03-12 7-31-44.png](https://qiita-image-store.s3.amazonaws.com/1251/65435/88b8bdda-ff50-28cf-5e72-354ef8064cf5.png)

* 拍の頭にモーションを合わせる
* テンポの揺らぎ対応
* スクリーンの見切れ対応

モーションをクロスフェードの形でつなぎあわせて、泊の頭に合わせるために、500個ぐらいにモーションを分割して対応した。
オーケストラとやっているので、リアルバンドということでテンポの揺らぎがあるので、リアルタイムにモーションの再生速度を変更することで対応した。
モーションキャプチャしたときと本番のスクリーンとでサイズに齟齬があり、本番ではスクリーンの端のほうで髪が抜けちゃったり手が映らないことがあったので、スクリーンの端に近づくに連れてリアルタイムに移動量を計算して減らしていく対応をした。

![2015-03-12 7-31-29.png](https://qiita-image-store.s3.amazonaws.com/1251/65435/4856eaff-65cc-2e8b-2e05-553d03b08ce1.png)

#BUNP OF CHICKEN feat. HATSUNE MIKU「ray」
[Youtubeに動画](https://www.youtube.com/watch?v=yT_ylSCgY6Q)がアップされている。

![2015-03-12 7-36-26.png](https://qiita-image-store.s3.amazonaws.com/1251/65435/c113e04b-7185-ad91-90a5-b41da2cffafc.png)

1. 実写カメラの位置に連動して円形スクリーンにモデル表示
2. 背景に動画を利用したパーティクルの表現
3. TripleHeat2Goを利用した3840*1080の画角表示
4. MIDIによる同期システム

円筒のスクリーンの周りを実写のカメラが回り、その実写のカメラに必ず初音ミクが映るようにセンサーを使ってカメラの位置を割り出し、Unityのほうで初音ミクを表示するようにした。

センサーからAndroidに対してフォータニオンの情報を送り、Androidからフォータニオンの情報をコマンドとしてWIFIでUnityに情報を送り、Unityがその情報を利用して初音ミクの表示をした。
Unityの処理は、WIFIの情報を受け取るために、TCP用のリスナースレッドを作り、スレッドでコマンドを受け取り、センサーの情報を設定しモデルの更新メソッドでX軸の情報を変更してモデルを表示した。
背景に動画を利用したパーティクルの表現のために、ムービーテクスチャを利用した。Unityの標準では再生の開始位置が必ず最初から再生されてしまうので、Asset Storeから再生位置を指定できるプラグインを購入して対応した。
Unityは当時、マルチディスプレイに対応していなかったので、デュアルディスプレイによる3840*1080を実現するためにTripleHeat2Goを導入して一個のディスプレイを作った。

#マジカルミライ2014　大阪サブステージ
[fuZeのVJKit](https://github.com/unity3d-jp/fuze-vj-kit)を使って開発した。
音符とか色のついた丸っこいものが音に合わせて自動的にでるようになる。初音ミクにあわせて踊るキューブマンの大きさや、背景でぐるぐる回るオブジェクトの回転速度などを、音楽を入れるだけで自動的に変更する対応を、VJKitで実現した。
音楽に合わせた映像制作をする場合には、VJKitを使用すると簡単に作成できる。

Unityを使用してものをつくるときに使いたいモデルがない場合は、[MMD4mecanim](http://stereoarts.jp/)を使うとMMDのモデルをUnityで使用できる。モデルのモデラーによっては、Unityやゲーム環境で使用してほしくない人もいるので、使用許諾を確認すること。
クーマリオンというUSBで接続する人形と連動していて、揺れもの（スカート、髪）をモーションに合わせてリアルタイム物理化して動いていた。
Unityが配布しているUnityちゃんに同梱されているSpringBoneやSpringColliderといわれているものがアタッチされているので、そちらを参考にした。
DJのコントローラーのUSB接続できるものに、ボタンにモーションを割り当ててリアルタイムにモーションをさせていて、Unityのmecanimを使用するとクロスフェードで違和感なくモーションを接続できる。

#レッドブル・ミュージック・アカデミー　1UP:Cart Diggers Live
立体スクリーンに、下からプロジェクターで投影してプロジェクションマッピングの形で投影した。
なにもしないで投影すると、スクリーン途中で間延びしている。
そこで、Unityのほうでバーティックシェーダーを書いてリアルタイムに補正をかけるようにした。

![2015-03-12 7-33-08.png](https://qiita-image-store.s3.amazonaws.com/1251/65435/aba97b77-d6f5-2059-d3bf-491b5a583bc0.png)
マイナンバーを安全に管理するための漏洩対策

#セミナー概要
* 2015/3/13 13:30~
* NECネクサソリューションズ、エムオーテックス株式会社

#マイナンバー制度の概要
マイナンバー制度は、正式名称「社会保障・税番号制度」で、すべての個人に対して12桁の一意の個人番号を割り当てる制度のことです。

現時点の利用範囲は以下の行政手続きのみに限定されている。

* 社会保障
* 税
* 災害対策

マイナンバーや住所、生年月日、顔写真などが記載された個人番号カードを個別に発行することも可能。
マイ・ポータルで個人情報を確認することができる。

#マイナンバー制度の影響は全企業

個人番号を取り扱う次の業務でマイナンバーを使用する必要がある。

* 所得税の源泉徴収
* 住民税の特別徴収
* 社会保険料の支払い・事務手続き
* 法定調書の提出

これらの業務に関わる部署としては、総務、人事、経理、情報システム。

#個人番号は特定個人情報として扱われる

次の情報の組み合わせが特定個人情報となる

* 氏名
* 性別
* 生年月日
* 住所
* 個人番号

個人番号は保護すべき新しい情報で、個人情報や経営情報・知的財産などの企業秘密と同等の扱いをしなければならない。
番号法では、保存期間が定められている。

#特定個人情報の漏洩には厳しい罰則

番号法は、個人情報保護法と比較して違反には罰則が強化されている。
従業員には次のような罰則が課せられる。

* 従業員個人に4年の懲役・200万円の罰金刑
* 所属企業には200万円の罰金刑

違反者の使用者にも、200万円以下の罰金が課さられることがある。

#業務フロー

個人番号に関わる業務フローは次の流れに沿ったサイクルを回すことになる。

1. 情報の取得
2. 保管
3. 利用・提供
4. 廃棄

この中で、保管と利用・提供で漏洩リスクが潜んでいる。
保管時には、不正アクセスによる情報漏洩、利用時には無駄な持出などが発生しうる。

#情報漏洩要因

情報漏えいの原因はさまざまだが、大部分は内部要因となっている。
内部要因は、ご操作、内部不正行為、情報持ち出し、紛失で、これらが情報漏洩原因の80%を占めている。

効果的な情報漏えい対策と考えるのは、従業員の場合は次のとおりである。

1. 社内システムの操作の証拠が残る（55%）
2. 重要な情報にアクセスした人が監視される（38%）
3. 同僚のルール違反が発覚し、処罰される（36％）
4. 社内システムのアカウント管理を強化する

経営者の場合は、効果的な対策と考えるのは外部からの不正対策となっていた。
現場の方々で考える情報漏洩の原因として思うところにギャップがある。

#ガイドライン

特定個人情報の保護に関する[ガイドライン](http://www.ppc.go.jp/legal/policy/)が公開されている。
「取扱規程などに基づく運用」「外部からの不正アクセス等の防止」のガイドラインは情報老齢対策に有効な操作履歴の取得が含まれる。

「取扱規程などに基づく運用」でじゃ、PCの操作履歴記録、外部デバイスの利用や持出、業務システムのログイン実績の記録が明記されている。
システム的な対応としては、次のようなことをする必要がある。

* PCのファイル利用やプリントアウトなどの操作履歴を取得する
* 外部デバイス機器の接続とファイルの書き出し履歴を取得する
* ファイルの削除履歴を取得する
* 業務システムの利用ID管理、アクセスログを取得する

「外部からの不正アクセス等の防止」では、機器の不正アクセス対策、ソフトウェアの状態把握と利用制限、定期的なログ分析が明記されている。

* 持ち込み機器などのネットワークへの接続を検知、遮断する
* インストールアプリケーション情報の取得、利用制限をする
* 業務システムやウィルス対策ソフトのバージョン管理をする
* 不正アクセス、PC操作履歴から課題を定期的に分析する

#マイナンバー制度開始までの準備
2015年10月から個人番号通知が始まる。
2015年10月から番号の利用開始までの間に、全従業員の個人番号を収集する必要がある。
それまでに情報漏洩対策システムを準備する必要がある。

情報の収集には、メールでの申告で実施するのではダメで、本人確認する必要がある。
基本的には対面での実施が必要になってくる。
情報の収集対象には、扶養家族の情報も集める必要がある。
扶養家族に関しては対面をする必要がない。
fishでsubshellの出力を展開する方法

bashの以下のコマンドをfishで実行するにはどうするか？

```bash
docker $(docker-machine config prl) ps
```

Using subshells to expand arguments
http://sourceforge.net/p/fish/mailman/message/33271083/

つまりこうすればよい

```fish
eval docker (docker-machine config prl) ps
```
RSSフィードを取得するだけのスクリプト

ブログなどの更新状況を確認するだけの簡単なスクリプト。
例によってraw_inputでhttp://うんたらのRSSのURLを入力。

```python:feed.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
import feedparser

rssurl = raw_input("Feed URL: ")
feed = feedparser.parse(rssurl)

for entry in feed["entries"]:
	title = entry["title"]
	link = entry["link"]
	time = entry["updated"]
	print "Title: ", title
	print "Link: ", link
	print "Time: ", time
```
Cで負のIndexが使える2次元配列を動的にかつ連続に確保する



物理シミュレーションをやってますが、配列で負のIndexが使いたくなってやってみました。
以外とさくっとできた。

下記のような使い方をイメージして書いてます

2次元配列、myArray[j][i]のi, jは

imin <= i < imax
jmin <= j < imax

imin < 0
jmin < 0

imax >= 0
jmax >= 0


メモリアクセスが連続となる方をiとしています。i, jの順番に注意してください。


```C
    #include <iostream>

    int **allocateNegativeIndex2DimArray(
        int jmin,       /* array[jmin][] jmin  < 0 */
        int jmax,       /* array[jmax][] jmax >= 0 */
        int imin,       /* array[][imin] imin  < 0 */
        int imax        /* array[][imax] imax >= 0 */
    )
    {

        const int ni = imax - imin;
        const int nj = jmax - jmin;
        const int numTotal = ni * nj;
        
        int **tmp = (int **)malloc(nj * sizeof(int));
        tmp[0] = (int *)malloc(numTotal * sizeof(int));
        
        for (int j = 1; j < nj; j++) {
            tmp[j] = tmp[j - 1] + ni;
        }
        
        const int icenter = abs(imin);
        const int jcenter = abs(jmin);

        int **val = &tmp[jcenter];
        for (int j = jmin; j < jmax; j++) {
            val[j] = &tmp[j + jcenter][icenter] + ni;
        }

        return val;
    }

    int main() {
        
        int xmin = -2;
        int xmax =  3;
        int ymin = -1;
        int ymax =  2;
        
        int **myArray = allocateNegativeIndex2DimArray(ymin, ymax, xmin, xmax);

        /*
         * 実際に負のインデックスが入るか表示テストする
         */
        for (int j = ymin; j < ymax; j++){
            for (int i = xmin; i < xmax; i++) {
                myArray[j][i] = i * j;
                printf("myArray[%2d][%2d] = %3d\n", j, i, myArray[j][i]);
            }
        }
        return 0;
    }
```

```実行結果
myArray[-1][-2] =   2
myArray[-1][-1] =   1
myArray[-1][ 0] =   0
myArray[-1][ 1] =  -1
myArray[-1][ 2] =  -2
myArray[ 0][-2] =   0
myArray[ 0][-1] =   0
myArray[ 0][ 0] =   0
myArray[ 0][ 1] =   0
myArray[ 0][ 2] =   0
myArray[ 1][-2] =  -2
myArray[ 1][-1] =  -1
myArray[ 1][ 0] =   0
myArray[ 1][ 1] =   1
myArray[ 1][ 2] =   2

```
symfony 2.6 Doctrineセレクト条件の指定方法

Doctrineセレクト条件の指定で少しはまったら追記していきます。

- `hoge`テーブルからデータを抽出します。
    - id: int型, count: int型, target_date: date型のカラムが存在する
    - `AppBundle\Entity\Hoge`エンティティにマッピングします

     
# 共通部分

```php:カスタムRepository内での操作
$qb = $this->getEntityManager()
           ->createQueryBuilder('h')
           ->select('h')
           ->from('AppBundle\Entity\ Hoge', 'h');
```
     
# Between

```php:カスタムRepository内での操作
$between = array('start' => '2015-01-01', 'end' => '2015-12-31');
$query = $qb->where($qb->expr()->between('h.targetDate', ':start', ':end'))
            ->setParameters($between)
            ->getQuery();
$query->getResult();
```

# その他

後日追記していきます。
UIImageは自動的にリロードされる


いい加減な内容で申し訳ないですが、アプリ開発中に遭遇したのでメモしておきます。

* Xcode 6.3 beta 3

例えば`UIImage(contentsOfFile:)`を使って画像をロードし、`UIImage`を`UIImageView`で表示している場合、アプリがバックグラウンドへ行ってまたアプリに戻ってきたときに、画像の再読み込みが走る事があるようです（いつメモリから居なくなるかは不明）。

おそらくOSに不必要な画像を解放してメモリを節約するための仕掛けの一つだと思いますが、完璧ではないようで気をつけないと誤爆することがあるようです。

1. テンポラリのファイル`aaa.png`へ画像を書き出してそれを`UIImage(contentsOfFile:)`で読み込みUIImageViewで表示
* テンポラリのファイル`aaa.png`へ別の内容の画像を書き出してそれを`UIImage(contentsOfFile:)`で読み込み`UIImageView`で表示（このとき画面には異なる画像が二つ表示されている）
* ホームボタンを押してアプリをバックグラウンドへ移動、再度アプリを表示させて復帰

このとき、画面には２番で書き出した画像が二つ並んでいる事があります。

同じパスで書き出さなければこの問題は回避できますが、`UIImage`のインスタンスだけを渡して画像をコピーしたつもりになっていると、思わぬバグを生む可能性があります。

リファレンスにも載っています。

---

UIImage
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImage_Class/#//apple_ref/occ/instm/UIImage/

> In low-memory situations, image data may be purged from a UIImage object to free up memory on the system. This purging behavior affects only the image data stored internally by the UIImage object and not the object itself. When you attempt to draw an image whose data has been purged, the image object automatically reloads the data from its original file. This extra load step, however, may incur a small performance penalty.

---

init?(contentsOfFile path: String)

> Discussion
This method loads the image data into memory and marks it as purgeable. If the data is purged and needs to be reloaded, the image object loads that data again from the specified path.

リロードするって書いてありますね。

---

ちなみに、本来は違うパスに書き出してロードしていたつもりだったのですが、構文を間違えて常に同じパスに画像ファイルを生成していた事が原因でこの現象に出くわしました。

```text:
var i = 0 // 連番で書き出す的な

i++
❌　filename = "(i).png"　// 連番のつもりが常に同じファイル名に...
⭕️　filename = "\(i).png"
```
Google Chrome拡張で外部ライブラリをCDNから取り込めないか？

## 命題
jQueryなどのメジャーなライブラリをCDNのパスを指定して使えないでしょうか？


##結論

「取り込めない」

また、最近はbrowserify + babelを使うことが多いです。CDNを使いたい欲求があまりありません。

## クロスドメインセキュリティ
chrome拡張はブラウザで動作します。ブラウザと同様のセキュリティ問題があります。
chrome拡張からのクロスドメイン通信は、デフォルト禁止です。
[Only local script and and object resources are loaded](https://developer.chrome.com/extensions/contentSecurityPolicy#resourceLoading)

`manifest.json`の`content_security_policy`に記述すると、
この制限を回避できます。
例えば

```json
"content_security_policy": "script-src 'self' https://code.jquery.com; object-src 'self'",
```

指定できるschemeはサーバー認証が可能な`https`だけです。

## 外部スクリプトの取り込み方法

`manifest.json`に記述して取り込めません。
実行スクリプト中で`script`タグを生成してHTMLに埋め込むことはできます。

例えば

```js
var script = document.createElement('script');
script.src = 'https://code.jquery.com/jquery-2.1.1.min.js';
document.body.appendChild(script);
```

ページ内に外部スクリプトを読み込みます。
開発ツールのコンソールから`jQuery`を呼び出せます。

## 根本的な制限
Chrome拡張のスクリプトはページ内のJavaScriptを参照できません。
（詳細は[Execution environment](https://developer.chrome.com/extensions/content_scripts#execution-environment)を参照してください。）
このため上記の方法でページ内に取り込んだ外部ライブラリを参照できません。

## 逆はできる

たとえば、この[Google Chrome拡張](https://github.com/miyagawa/Tabelog-HonestStars/blob/master/myscript.js#L48
)では、以下のように`script`タグを生成して、実行するスクリプトをページ内に埋め込んでいます。
ページ内のjQueryが使えます。

```js
var script = document.createElement('script');
script.appendChild(document.createTextNode('('+patch+')();'));
document.body.appendChild(script);
```
NativeScriptのGetting Startedを試してみる（０

https://www.nativescript.org/
JavaScriptでiOSやAndroidのアプリがつくれるNativeScriptなるものがあると聞いて飛びついてみました。
#Build truly native apps with JavaScript
前回、自分がなにやってるのかわからなくなってきた反省を踏まえ、今回はNativeScriptが何者なのか、ちゃんと理解してから始めようと思います。
単一のコードでiOS,Android,Windows Phoneのアプリが作れるそうです。凄いですね。

##How Does It Work?
iOS,Android,Windowsのプラットフォーム差異を、ＵＩをビルドする際にライブラリが吸収してくれるそうです。

##Why NativeScript?
### It's Open
* open source projectである。
* GitHubから利用可能

###It's Easy
* JavascriptとCSSでつくれる
* それでいてNativeプラットフォームのＵＸを実現できる

###It's Powerful
* クロスプラットフォームを抽象化
* プラットフォーム間でロジックとモデルを共有できる
* サードパティネイティブライブラリ（が使える？）

##...and more
###100% Access to Native Platform API
JavascriptからNativeプラットフォームの機能を100%つかえる。

###Standards-Based ECMAScript5 + JavaScript and CSS
特別なスキルは必要ない。JavaScriptの知識があればNativeアプリが書ける。

###100% Shared Code
単一コードからiOS,Android,Windows Phoneのアプリが作れる。

#まとめ
NativeScriptが何者かなんとなくわかりましたね。
原文では図も交えつつ説明しているので、より分りやすいと思います。
区切りがいいので、ここでいったん切ります。
[次回](http://qiita.com/kazusa-qooq/items/04c3228a135152b47ec9)は実際にGetting Startedに挑戦していきます。
peco-select-repository.fish がほしい

peco-select-history を見て「clone してきたローカル リポジトリ一覧を見れたら便利だなあ」と思ったお話。

# できた
もともと似たようなスクリプトを書いていたので流用した[^1]。

(追記: 2019/01/01) **fish 3.0 つかおう**

```fish:peco-select-repository.fish
function peco_select_repository
    ghq list -p | peco --select-1 | read -l line && builtin cd $line

    commandline -f repaint
end
```
関数を書いて bind しておけばなんとかなる。

```fish
bind -e -M insert \ce
bind -M insert \ce peco_select_repository
```

# peco-select-history.fish
おまけ。似ているからすぐできた[^2]。

```fish:peco-select-history.fish
function peco_select_history
    if set -q $argv
        history | peco | read -l line && commandline $line
    else
        history | peco --query $argv | read -l line && commandline $line
    end

    commandline -f repaint
end
```

```
bind -e -M insert \cr
bind -M insert \cr peco_select_history
```

どっちも `C^r` に割り当てたいなあ…と思ってたけどモード使えばよかった。

# よもやまばなし
## ローカル リポジトリ一覧ほしい
ghq つかっていてよかった。

## peco つかえるんだろうか
たぶん一番なやんだところ。書いたのはずいぶん前だからおぼえていないけど。

read つかって peco の戻り値を読んでる。たぶん Stack Overflow  で見た。

## 実行したあと表示が更新されない
`force-repaint`、やってくれないのかな。

## おわったら insert モードにしたい
`bind -M MODE` マニュアル読んでみるもんですな

## peco の戻り値をコマンド ライン バッファに入れたい
`commandline` でできた、なんでもあるなあ

## すでにあるけど
うう…

# 参考
- [peco、ghq、gh-openの組み合わせが捗る - Webtech Walker](http://webtech-walker.com/archive/2014/06/peco-ghq-gh-open.html)
- [fish user documentation](http://fishshell.com/docs/current/commands.html)
- https://github.com/oh-my-fish/plugin-peco

[^1]: https://github.com/unlovingly/dotfiles/blob/master/fish.d/functions/select_repository.fish
[^2]: https://github.com/unlovingly/dotfiles/blob/master/fish.d/functions/select_history.fish
TDD > モック / スタブ

TDDを行う上で使われるものにモックとスタブというのがある。

色々情報を見ても、二者の違いの解釈は色々あってわかりにくかった。

1. [wikipedia](http://en.wikipedia.org/wiki/Mock_object)
2. [「スタブ」と「モック」は全然違うものなんですよ](http://uehaj.hatenablog.com/entry/20090427/1240815860)
3. [テストダブル](http://capsctrl.que.jp/kdmsnr/wiki/bliki/?TestDouble)
4. [RSpec でテストを作るのに役立つ「モック/スタブ」のシンプルな説明](http://morizyun.github.io/blog/rspec-model-controller-ruby-rails/)
5. [スタブとモックの違いについて](http://qa.atmarkit.co.jp/q/558)
6. [The Difference Between Mocks and Stubs](http://www.martinfowler.com/articles/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs)

上記を読んで一番わかりやすいと思ったのが4番のリンクで書かれていた以下のものだった。

- モック: 「オブジェクトのメソッドがどう呼ばれて何を返すか」というインタフェースも含めたテストのために使う
- スタブ: テストをスムーズに行うために「あるオブジェクトのメソッドが呼ばれたら、ある戻り値を返す」ために使う

<hr>
(追記 2017/06/06)
肝心の4番の日本語記事がなくなったようです。
そのページに記載されている英語記事へのリンクはうまくつながらない。

以下が英語の記事のようです。
http://blog.morizyun.com/blog/mock-stub-outline-rspec-ruby/
Redmine チケット(issue)を CLI から発行するためのコマンド


REST の API を使えば簡単。
APIアクセスキーは、「個人設定」で取得できる。

```ruby:redmine
#!/usr/bin/env ruby
# coding: utf-8

require 'thor'
require 'timeout'
require 'socket'
require 'rest_client'

class RedmineClient < Thor

  desc "issue 'TicketTitle'", "issue ticket"
  def issue(title)
    redmine_url = "<redmine_url>"

    params = {
      key: "<api access key>",
      issue: {
        project_id: "<project id>",
        subject: title.strip,
        description: title.strip,
        tracker_id: <tracker id>,
        assigned_to_id: <assignee>,
        watcher_user_ids: [<watcher id>]
      }
    }
    res = JSON.parse(RestClient.post("#{redmine_url}/issues.json", params))

    puts "#{redmine_url}/issues/#{res['issue']['id']}\n"
  end

end

RedmineClient.start(ARGV)
```

以下のようにしてチケットを発行する。

```
$ ./redmine issue てすと
http://<redmine_url>/issues/xxxx
```

# 参考

[Redmine API](http://www.redmine.org/projects/redmine/wiki/Rest_api)