OmniAICreator/Qiita-1.07M huggingface dataset:
Live2Dのサンプルに時計を追加する

![2015-04-09_00h21_581.png](https://qiita-image-store.s3.amazonaws.com/0/76553/807c820a-b8a4-51ed-46b0-aac30091c605.png)

##概要
Live2D SDKについているシンプルに時計の機能を追加します．
iPhone向けにGUIを設定してみます．

##開発環境  
* Live2D_SDK_Unity_2.0.07_1
* Unity 4.6.4f1

##作り方

####プロジェクトの作成とLive2Dを描画
Unityで新しくプロジェクトを作成，
Setup defaults は 2Dに設定

http://sites.cybernoids.jp/cubism2/sdk_tutorial/platform-setting/unity/csharp/sampleapp1
を確認しながらモデルデータを描画してみます．

上記URLで行う作業の要約
>Projectに「Editor」「Live2D」「Resources」「Scripts」フォルダ作る
>以下，SDKに同梱されているsampleフォルダ/SampleApp1/Assets以下のフォルダ内のファイルをコピー
>「Live2D」フォルダに Live2D SDK の 「Live2D」 
>「Scripts」フォルダに Live2D SDK の「Scripts」
>「Editor」フォルダに、Live2D SDK の「Editor」フォルダ内にある「CreateCanvas.cs」
>「Resoures」フォルダにLive2D SDK の「Resources/live2d」フォルダ内にある>haruフォルダをコピー

>メニューバーの「Live2D」→「Create Live2D Canvas」で平面を作成
>名前を「Live2D_Canvas_haru」に変更

>LAppModelの設定
>「Live2D_Canvas_haru」にアタッチされたLAppModelProxyの「Path」の項目に、Resourcesフォルダからモデル設定用JSONファイルまでのパス（上記の場合、"haru/haru.model.json"）を入力
要約ここまで


あとは実行させながらお好みの大きさにしていきましょう
Live2D_Canvas_haruの例だと
Position Y -0.88
Scale XとZを0.47くらいにすると良さそうです
 
  
#### 時計を追加してみる
GameObject>UI>Canvasでキャンバスを追加
UIの設定をします

InspectorからCanvas Scalerを編集
Ui Scale Mode Scale With Screen Size
Reference Resolution 640*1136
Screen Match Mode Expand
Reference Pixels Per Unit 100
に設定
![2015-04-08_23h39_511.png](https://qiita-image-store.s3.amazonaws.com/0/76553/3f1ccb98-edbb-67b0-8a7d-8e8e8be4fc28.png)



GameObject>UI>Textで時計を表示するためのTextを追加
InspectorからRect Transformを編集
PosX 0，PosY -118，PosZ 0
Width 500，Height 150
Anchorsをtop,centerに設定

InspectorからTextを編集
CharacterのFont Size 120
ParagraphのAlignment Center Align
Color white
![2015-04-08_23h39_281.png](https://qiita-image-store.s3.amazonaws.com/0/76553/b678430b-7d03-8e95-ea11-0fb7072d4262.png)


GameViewの設定でiPhone5として設定を追加します
![2015-04-23_14h35_00.png](https://qiita-image-store.s3.amazonaws.com/0/76553/2a983692-274b-76c7-5ab7-d2d6291adf2d.png)


新しくスクリプトを作って，以下のように書きます

```csharp:clock.cs
using UnityEngine;
using System.Collections;
using System; //DateTime
using UnityEngine.UI; //uGUI

public class clock : MonoBehaviour {
	public Text UiText;

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
	}

	void OnGUI()
	{
		UiText.text = DateTime.Now.ToString("HH:mm:ss");
	}
}
```

日付を取ってきて，さっきのUIにセットします
これをLive2D_Canvas_haruにアタッチして，inspectorでUiTextにCanvasの中にあるtextを設定

実行して動作を確認します．
Ruby on Rails で lib ディレクトリの自作クラスを使用する


**Rails4 で lib ディレクトリの自作クラスを使用する**

**設定**
config/application.rbにautoloadの設定を追加する。

```rb:config/application.rb
# to auto load lib/ directory
config.autoload_paths += %W(#{config.root}/lib)
```

これでlib ディレクトリ以下のファイルが、下記のディレクトリ・ファイル構成と命名の規約に従うと、自動的に読み込まれるようになります。



**1.ファイル名は小文字**
**2.単語の区切りは'_'**


**1. lib/直下に置く場合**

```rb:lib/foo_bar.rb
class FooBar
  def hello
    puts "FooBar: hello world"
  end
end
```

**2. lib/foo/ディレクトリにファイルを置く場合**

```rb:lib/foo/bar.rb
module Foo
  class Bar
    def hello
      puts "Foo::Bar: hello world"
    end
  end
end
```

**2-2. lib/foo/ディレクトリに置く場合（moduleを使用しない）**

```rb:lib/foo/bar.rb
class Foo::Bar
  def hello
    puts "Foo::Bar: hello world"
  end
end
```
`Float::NAN` についての重箱の隅


以下、ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14] での調査結果。

# Float::NAN について知っておくべきこと

ruby の Float::NAN は、浮動小数点の非数なので、以下の様な動作になる。

```ruby:ruby
nan=Float::NAN
nan==nan #=> false
nan==0 #=> false
nan<0 #=> false
nan<=0 #=> false
0<nan #=> false
0<=nan #=> false
```

事情を知らないとかなり思いがけない内容だけど、浮動小数点の非数とはそのようなものなので仕方がない。

この、

* 同じ値を比較しても false になる
* 大小比較をすると必ず false になる

という性質は 浮動小数点の非数がもつ一般的な性質で、ruby に限ったことではない。

これが理由で、浮動小数点数は全順序になっておらず、いろいろひどいことが起こりうる。

```python:python
import random
nan=float("nan")
print( sorted( [3, nan, 1, 4, 1] ) ) #=> [3, nan, 1, 1, 4]
```

python の例。整列されない。C++ の std::sort なんかも同様。

一方。
ruby の場合は

```ruby:ruby
nan=Float::NAN
p [3, nan, 1, 4, 1].sort #=> comparison of Float with 1 failed (ArgumentError)
```

例外が発生して気づく。
素晴らしい。

ちなみに Java の場合は 非数が末尾になるように整列されることになっているみたい。

# Float::NAN についての、知らなくても良さそうなこと

非数をコンテナに入れてみる。

```ruby:ruby
[nan]==[nan] #=> true
{nan=>0}=={nan=>0} #=> true
{0=>nan}=={0=>nan} #=> true
```

コンテナに入っていると、nan==nan が false になることとは関係なく、なぜか等しいということになる。

で。もうちょっといじわるしてみる。

```ruby:ruby
nan=Float::NAN
[nan]==[nan+1] #=> false
[nan+1]==[nan+1] #=> false
(nan+1).__id__ == nan.__id__ #=> false
```

非数の演算結果は別のオブジェクトとなり、それをコンテナに入れて比較すると異なるとみなされる。`Marshal` などで複製を作る場合も同様。
念の為に書いておくと、非数に1を加えても非数である。

この不自然な動き、バグなのかもしれないけどよくわからない。

気持ちとしては、`true` でも `false` でもいので、
`[nan]==[nan]` と `[nan+1]==[nan]` が同じ値になってほしいと思う。
どっちかというと `false` がいいような気がするけどどうだろう。

この奇妙な動きは、無限大では起こらない。

```ruby:ruby
∞=Float::INFINITY
∞==∞ #=> true
[∞]==[∞] #=> true
[∞]==[∞+1] #=> true
[∞+1]==[∞+1] #=> true
(∞+1).__id__ == ∞.__id__ #=> false
```

無限大の場合は、複製や演算で別のオブジェクトにはなるものの、比較の結果には影響を与えない。
正しい動きのような感じ。

ちなみに。Float の動きは難しく、

```ruby:ruby
[10**77, 10**77].map{|x| x.to_f.__id__ }.uniq.size #=> 1
[10**78, 10**78].map{|x| x.to_f.__id__ }.uniq.size #=> 2
```

のようになる。
たぶん、絶対値が小さいと Fixnum のような感じで振る舞い、絶対値が大きいと Bignum のように振る舞うんじゃないかと思う。整数と違って、その差を知る方法はあまりない。
Amazon Web Services(AWS) で無料枠を超えた時にアラートを飛ばす（日本語メニュー）

# Amazon Web Services(AWS)
AWSについては、説明するのは[ヤボなので、リンク先](http://ja.wikipedia.org/wiki/Amazon_Web_Services)を見て頂くとして。ごくごく一般的なアプローチの仕方は、「AWS キャンペーン」と検索してアカウントを作成すると思います（１年間無料枠、$25プレゼント）。
無料枠があるので、インスタンスも立ち上げ放題と思っていて bitcoinのサーバとか立てた日にゃー、とそこは、それ。そんな甘くなくないよねｗ。

ともかく知らなかったーと言っても請求されないようにするために、無料枠を超えた時にアラートを飛ばす設定をしておきます。

参考にしたのは、[[AWSで無料枠を超えた時にアラートを飛ばす]](http://qiita.com/moiwasaki/items/5bf5cdd7e76eb212a32e) さんお記事と同じですが、日本語でAWSマネジメントコンソールが利用可能(2015/04/22から)になっていたので自分メモ程度にちょっとだけ編集してみた（会社でも同じ作業するので忘れないようにｗ）。

# 設定手順
AWSにログインし、メニューバーの右の方にある自分のアカウント名をクリックし、プルダウンから「請求とコスト管理」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/d6e656b3-117e-bccc-915b-ca2264bdf8b5.png)

月額利用料の画面が表示されるので、画面中央下位に表示されている「いますぐ有効にする」をクリックします。左メニューの「請求」をクリックしても同様のことができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/4991146c-35d4-7599-3785-0d23b3d810d8.png)

設定画面が表示されるので、以下の手順で先に進みます。
・「請求アラートを受け取る」にチェック
・「設定の保存」をクリック
・「請求アラートを管理する」をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/4b65846d-0863-d7a1-161f-f03f7e70f7cb.png)

左メニューの「請求」をクリックし、請求アラーム画面で「アラームの作成」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/84feccb3-91b3-f27e-a538-2f37530a4ad7.png)

請求アラーム画面が表示されるので、超過金額に指定の金額以上が発生した場合の値を設定（この画面の場合は、＄１）します。あと通知の送信先にメールアドレスを指定します。
問題無いようでしたら、「アラームの作成」をクリックします。
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/76e5cdd3-c1d8-116e-84bf-28a9496f1183.png)

すると新しいメールアドレスの確認ダイアログが表示されます。先ほど入力したメールアドレス宛に「AWS Notification - Subscription Confirmation」の認証メールが届いていると思うので72時間以内に「Confirm subscription」リンクをクリックし認証を行います。

認証が正常に完了すると通知アラームが機能します。
![image](https://qiita-image-store.s3.amazonaws.com/0/44540/6a60e9f2-e9e5-677b-b241-8a64c4c2e85e.png)

とりあえず無茶なことをしなければ、無料枠を超える（たぶん）ことはありませんが、HA構成とか試すともしかすると料金が発生してしまうので、よく無料枠の条件を読むこと。
RTFMとか周りからいわれないようにｗ
[iOS] Custom NSError

With the objective-c, some functions may have some errors, for example connection errors. 
In this situation, we can pass a `NSError*` pointer to the function and check the error after calling the function.

Code example:

```objc
- (void)getDataWithError:(NSError **)error {
    if(error) { //Check if the parameter is nil
        *error = [[NSError alloc] initWithDomain:@"ConnectionError"
                                            code:1001
                                        userInfo:nil];
    }
}
```

Also can do something like this:

```objc
NSError *urlConnectionError = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:request
                                     returningResponse:&response
                                                 error:&urlConnectionError];
*error = urlConnectionError;
```
Viewの中でメソッドがどこで定義されているか調べる方法

erbファイルの中ではnotice/alertに限り、flashを省略して書けるらしい。

```erb:app/views/layouts/application.html.erb
....
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
```

これは下記と同じ意味

```erb:app/views/layouts/application.html.erb
....
<p class="notice"><%= flash[:notice] %></p>
<p class="alert"><%= flash[:alert] %></p>
```


なぜそういうふうになっているのか気になったので、どこで定義されているのか知りたかったのだけど、ドキュメントを探してもよくわからなかった。

まず試してみたのがこれ。

```erb:app/views/layouts/application.html.erb
....
self.method(:notice).source_location
```

`"actionpack-4.2.0/lib/abstract_controller/helpers.rb", 66`

AbstractControllerのhelper_methodが呼ばれていることがわかる。
https://github.com/rails/rails/blob/master/actionpack/lib/abstract_controller/helpers.rb

これではどこでhelper_methodが呼ばれたかわからないので、こっちを実行してみる。

```erb:app/views/layouts/application.html.erb
....
ApplicationController.instance_method(:notice).source_location
```

`"actionpack-4.2.0/lib/action_controller/metal/flash.rb", 35`

これが目的のソースだということがわかる。add_flash_typesというクラスメソッドが定義されていて、:alert,:noticeに対して実行されている。

```rb:flash.rb
    included do
      class_attribute :_flash_types, instance_accessor: false
      self._flash_types = []

      delegate :flash, to: :request
      add_flash_types(:alert, :notice)
    end
```

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/flash.rb
facebook各ソーシャルボタンの動作まとめ（20150423現在）

ソーシャルボタン設置していて、結構混乱したので整理
でもすぐロジック変わるため注意　
本まとめは**20150423時点**

# facebookの各ボタンの動作
#### シェアボタン
* 自分のタイムラインに投稿が流れる
* ただ他人のタイムラインに流れるかは盛り上がり次第（盛り上がり=facebookのロジック次第）
* ページ上（運営しているサイト）でシェアをクリックしてもソーシャルボタンの数字は増えない
* シェアに対するfacebookウォール上での行動でページ上の数字は変わる
  * 1いいねで+1 / 1コメントで+1（これは同じ人でも1ずつ増える）※はず

#### likeボタン
* 1回ボタンを押すと数字が1増える
* コメントしてもしなくても基本タイムラインに流れない
* 盛り上がれば（盛り上がり=facebookのロジック）流れる
  * [document for logic](https://developers.facebook.com/docs/reference/fql/link_stat/)

#### like+シェアボタン
* 出ている数字は
  * like数+シェアによってタイムラインに流れた上での行動次第
  * 1いいねで+1、1コメントで+1。これは同じ人にも限らない

#### 参考
* [新エンゲージメント率』とは？](http://gaiax-socialmedialab.jp/facebook/375)
* [Facebookアルゴリズムとエンゲージメント率算出方法が変更した影響は？](https://ferret-plus.com/760)
[Symfony2][IntelliJ] Symfony2 プロジェクトの PHPUnit によるテスト実行設定

IntelliJ で、Symfony2 の PHPUnit によるテストを実行する設定について。

# 設定方法

## 1. Run/Debug Edit Configurations を開く

![edit.png](https://qiita-image-store.s3.amazonaws.com/0/5418/c9effda6-6a15-f263-7f01-fe67d083770a.png)

## 2. PHPUnit の設定を追加する

![Run_Debug_Configurations_と_Sole_-___src_Sole_.png](https://qiita-image-store.s3.amazonaws.com/0/5418/bcb50d68-236e-021b-6478-4f3eb401facc.png)

## 3. Symfony のテスト実行設定を行う

![Run_Debug_Configurations.png](https://qiita-image-store.s3.amazonaws.com/0/5418/441eb957-0e23-7e6a-6736-8d345057670a.png)

## 4. PHPUnit への include_path を設定する

![Preferences_.png](https://qiita-image-store.s3.amazonaws.com/0/5418/dfb9e5d0-bc2d-069f-6ded-72ab9a7cca35.png)

# 動作確認

![Sole_-___src_Sole_.png](https://qiita-image-store.s3.amazonaws.com/0/5418/78fe433e-9428-94d9-8d33-28c2d918300d.png)

このように、テストの実行結果が表示される。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/5418/5f9da857-0f99-7c79-9369-e9f8a5edac21.png)

# 参考

- [PhpStormで効率良く開発するための設定その2](http://www.karakaram.com/phpstorm-settings2)
Pythonのcoding: ﾅﾝﾄｶのことがよく分からないから調べてみた


# 2行目に書くあの枕詞
とりあえず1行目にshebang書いて続けざまに2行目に書くアレ

```py:haiku_wo_yome.py
#!/usr/bin/python
# -*- Coding: utf-8 -*-
```
Pythonのソースコードがどうエンコードされるべきか定義するおまじないめいた文である。
ちなみにこの例だとうまくいかない。Cが大文字だからだ。ハマった。

なんなんだ。一体coding: ﾅﾝﾄｶってなんなんだ。
ちょっと調べてみよう。

# PEP 263を読みましょう
調べようと言ってみたが全ては[PEP 263](https://www.python.org/dev/peps/pep-0263/)に書かれている。さすがPython。
というわけでかいつまんでみる。

### そもそもなんで必要なのか
ざっくり書くと、
Python 2.1までユニコード文字を表記するにはエスケープシーケンスを使うしかなかった。8-bit文字なら好きなエンコーディングでいいけど限界あるよね。
…ということらしい。実際不便だ。Pythonでの文字コードの話は[この辺](http://docs.python.jp/2/howto/unicode.html)が参考になるかもしれない。UTF-8便利。

## 仕組み
### デフォルトはASCII
エンコーディングについて何も指定がない場合はASCIIとして解釈される。
*追記：Python3ではデフォルトでUTF-8（[PEP 3120](https://www.python.org/dev/peps/pep-3120/)）*
### 1行目か2行目に書く
2行目でもいいのはshebangがあるためだろうか？
### フォーマット
単純にこれでもいい。

```py:simple.py
# coding=<encoding name>
```
よく使われるのは：

```py:emacs.py
#!/opt/local/bin/python
# -*- coding: <encoding name> -*-
```
この表記はEmacs由来のようだ。vimだと：

```py:vim.py
#!/emacs/or/vim/python
# vim: set fileencoding=<encoding name> :
```

### どう書けば認識されるんよ？
実は1行目か2行目が次のパターンにマッチすると括弧内を文字コードとして認識する。[^1]

```py
"coding[:=]\s*([-\w.]+)"
```
なのでこれにマッチする書き方さえすればエディタとの整合が取れるようになっている。
他にも次のような表記が可能。

```py:wazamae.py
#!/mongoose/vs/python
# This Python file uses the following encoding: utf-8
```

```py:jillypoor.py
#!/neko/nadetai/python
# Current encoding: shift-jis is not good for this environment.
```

[^1]: \s : [ \t\n\r\f], \w : [_a-zA-Z0-9]
wgetでログイン認証の先のページを落とす

BASIC認証じゃなくて、普通にphpでログインとかの場合。

一旦クッキーを取得しておく。

```bash
wget --keep-session-cookies --save-cookies=cookies.txt --post-data 'user_id=muname&password=12345' http://hoge/login.php
```

そしたら落としたいページを指定。

```bash
wget --load-cookies cookies.txt -r -k -E  http://hoge/app
```
C++builderでTstringGridの行追加と行削除の例

行の追加はTStringListの値を使ってみる。
もちろん列数と同じ数でないとダメ。

```cpp:FireMonkey.h
///FunctionInsert(対象のグリッド,追記する行の値, 差し込む行番号)
void __fastcall FunctionInsert(TStringGrid *var_string_grid,
	TStringList *var_input_data, int var_row = 0);
```

```cpp:FireMonkey.cpp
void __fastcall TForm1::FunctionInsert(TStringGrid *var_string_grid,
	TStringList *var_input_data, int var_row) {
	/// 行列の数を確認。
	if (var_string_grid->ColumnCount != var_input_data->Count) {
		ShowMessage(L"列数と配列が一致しません。");
		return;
	}
	///行を増やす
	var_string_grid->RowCount = var_string_grid->RowCount + 1;
	///行をずらす
	for (int i = var_string_grid->RowCount - 1; i > var_row; i--) {
		for (int i2 = 0; i2 < var_string_grid->ColumnCount; i2++) {
			var_string_grid->Cells[i2][i] = var_string_grid->Cells[i2][i - 1];
		}
	}
	///挿入行にデータを入れる
	for (int i2 = 0; i2 < var_string_grid->ColumnCount; i2++) {
		var_string_grid->Cells[i2][var_row] = var_input_data->Strings[i2];
	}
}
```

行削除は、現在選択中の行を削除する方法で。

```cpp:FireMonkey.h
void __fastcall FunctionDelete(TStringGrid *var_string_grid);
```

```cpp:FireMonkey.cpp
void __fastcall TForm1::FunctionDelete(TStringGrid *var_string_grid) {
	///選択が無ければ終了
	if (var_string_grid->Selected == -1) {
		return;
	}
	///確認
	if (MessageDlg(L"本当に削除しますか？", TMsgDlgType::mtWarning,
		TMsgDlgButtons() << TMsgDlgBtn::mbOK << TMsgDlgBtn::mbCancel, 0) != 1) {
		return;
	}
	///選択中の行を削除する感じ。
	int var_row = var_string_grid->Selected;
	///削除の前に選択を解除する。
	var_string_grid->Selected = -1;
	///削除というか、行を押しつぶす感じ
	for (int i = var_row; i < var_string_grid->RowCount - 1; i++) {
		for (int i2 = 0; i2 < var_string_grid->ColumnCount; i2++) {
			var_string_grid->Cells[i2][i] = var_string_grid->Cells[i2][i + 1];
		}
	}
	///行の数を変更
	var_string_grid->RowCount = var_string_grid->RowCount - 1;
}
```
libmemcached-toolsのコマンドメモ

mcrouterを試す為にmemcached-toolsを利用したのでそのメモ

# インストール
`$ sudo apt-get install libmemcached-tools`
# サーバーにアクセスする系のコマンド
##共通オプション
###サーバー指定方法(共通)
####オプションで指定
`--no-truncrvers=[hostname]:[port]{,[hostname]:[port]}`
####環境変数で指定
`export MEMCACHED_SERVERS=[hostname]:[port]{,[hostname]:[port]}`
## memccat [key]
memcachedサーバーからデータを読み込む
keyはスペース区切りで複数指定可能
## memccp [file]
memcachedサーバーにファイルの内容を書き込む
保存されるデータのキーはファイル名 #ディレクトリなどは除く
## memcdump 
サーバー内にあるキーの一覧を取得する。完全なキーの一覧である保証はない
## memcexist [key]
キーの存在チェック
リターンコードで存在、非存在を返却
## memcflush
サーバー上のデータを削除する
キーは消えない
## memcping
到達確認＆接続確認用
エラー時にメッセージを表示
## memcrm [key]
指定のデータを削除する
キーは消えない
## memcslap
サーバーのベンチマーク
## memcstat
サーバーの統計情報を表示
## memctouch
既に存在しているキーに対してtouchする
キャッシュがあふれたときにLRUで削除されるため、その対象から外すため？
# サーバー指定不要
## memparse [configuration-option]
コンフィグのバリデーション？
## memcerror [error]
エラーコードを文字列に変換する
## memccapable -h [hostname] -p [port]
memcachedサーバーの機能テスト
PPAPI flash debug player の flashlog.txt


flash debug player 17.0.0.169 (PPAPI)
Chrome バージョン 42.0.2311.90
Max OSX 10.9.5

↑の環境での設定の仕方


## まずは flash debug player を入手
http://www.adobe.com/jp/support/flashplayer/downloads.html

```
Flash Player コンテンツデバッガー（OperaおよびChromiumベースのアプリケーション用） – PPAPI
```

これをダウンロードしてインストール。
インストールしたものはここにある。

```
/Library/Internet\ Plug-Ins/PepperFlashPlayer/PepperFlashPlayer.plugin
```

## Chrome に入ってる PepperFlashPlayer.plugin と置き換える

インストールした PepperFlashPlayer.plugin をここに上書く。
※バックアップ推奨

```
/Applications/Google\ Chrome.app/Contents/Versions/42.0.2311.90/Google\ Chrome Framework.framework/Internet\ Plug-Ins/PepperFlash/PepperFlashPlayer.plugin
```

## mm.cfg
ここに mm.cfg 作る。

```
~/Library/Application\ Support/Google/Chrome/Default/Pepper\ Data/Shockwave\ Flash/System/mm.cfg
```

mm.cfg の中にこれを記述する。

```
ErrorReportingEnable=1¬
TraceOutputFileEnable=1¬
```

## flashlog.txt
これで flashlog.txt が吐出されるようになったはず。
flashlog.txt の場所はここ。

```
~/Library/Application\ Support/Google/Chrome/Default/Pepper\ Data/Shockwave\ Flash/WritableRoot/Logs/flashlog.txt
```

## まとめ

Chrome がここを見てくれるようになればいいんだけどなぁ・・・


```
/Library/Internet\ Plug-Ins/PepperFlashPlayer/PepperFlashPlayer.plugin
```
Google Compute Engineでftp

VMインスタンスにローカルからファイルを送りたいとき ftp や sftp が使えない。
Google Cloud SDKをインストールして、gcloud compute の copy-files を使う
SDKのインストールは下記を参考に
・Google Compute Engine 入門 - Qiita
  　http://qiita.com/yuko/items/460ac35d8706e8df1290

```lang:putしたいとき
gcloud compute copy-files (転送したいファイル名) (インスタンス名):(転送先での保存名) --zone (ゾーン名)
```

```lang:getしたいとき
gcloud compute copy-files (インスタンス名):(取得ファイル名) (ローカルの保存名) --zone (ゾーン名)
```

gcloud compute は、事前にsshキーが ~/.ssh/google_compute_engine に配置されていないと使えないので注意。
ここの説明がわかりやすかったので参考まで
[GoogleCloudPlatform - Google Compute Engine のSSH接続 - Qiita](http://qiita.com/NewGyu/items/3a65e837519297951e79)


自分コピペ用
put
`gcloud compute copy-files patch.tar instance-2:~/patch.tar --zone asia-east1-a`
get
`gcloud compute copy-files instance-2:~/system.log ./system.log --zone asia-east1-a`
ngrokを使用してローカル環境を外部に公開する

ちょっと記事で紹介されていて面白そうだったので、
使用方法など自分用メモです。

# インストール

下記のコマンドを実行する。

```bash
$ brew install ngrok
```

## 上記のコマンドでダメだった場合

```bash
$ brew cask install ngrok
```


# ngrokを実行

ngrokの後にローカルで起動しているページのポート番号を入れ起動する。

```bash
$ ngrok http 3000
```

実行して下記様な文字が出れば起動成功。

```bash
Tunnel Status                 online                                                    
Version                       1.7/1.7                                                   
Forwarding                    http://77f81e21.ngrok.com -> 127.0.0.1:3000               
Forwarding                    https://77f81e21.ngrok.com -> 127.0.0.1:3000              
Web Interface                 127.0.0.1:4040                                            
# Conn                        0                                                         
Avg Conn Time                 0.00ms
```

## ポート番号

```text:localhost後の数字
http://localhost:3000/
```

# ローカル環境へ外部からアクセス

乱数のURLが表示されるので、これでどこからでもアクセス出来る。

```text:localhost後の数字
http://77f81e21.ngrok.com
```

# サブドメインを使用したい！

乱数だと分かりにくいから、サブドメインを指定したい場合の手順。

## ngrokにSign up

下記のURLへアクセスしてSign upします。
~~無料で登録可能です。2.0は有料です。1.0は無料で使用できます。~~

`201７年１２月の時点では有料プランのみの提供になっているようです。`

https://ngrok.com/

# authtokenを実行する

下記のURLにアクセスするとauthtokenがあるので、
そこに表示されているコマンドを実行する。

https://dashboard.ngrok.com/

```bash
$ ngrok -authtoken ***** 3000
```

一度起動に成功したら、一度ngrokを止めて、
次の下記のコマンドを実行するとサブドメインを使用できる。

```bash
$ ngrok -subdomain=kitaro 3000
```

```
Tunnel Status                 online                                                    
Version                       1.7/1.7                                                   
Forwarding                    http://kitaro.ngrok.com -> 127.0.0.1:3000                 
Forwarding                    https://kitaro.ngrok.com -> 127.0.0.1:3000                
Web Interface                 127.0.0.1:4040                                            
# Conn                        0                                                         
Avg Conn Time                 0.00ms  
```

表示されるURLが乱数ではなくなるので、
これで下記のURLでどこからでもアクセス出来る。

```
http://kitaro.ngrok.com
```
Capybaraのdriverの切り替えに合わせて、database_cleanerのstrategyを動的に切替える



## 環境
rails (4.2.1)
capybara (2.4.4)
database_cleaner (1.4.1)


## やりたいこと
* Capybaraでpoltergeistなどのjsdriverを利用しつつも、テストの実行速度をできるだけあげたい

## Capybaraでjsを含む画面をテストしようとしてぶつかる問題
* Capybaraでpoltergeistなどのjsdriverを利用する場合、rspecとは別のサーバプロセスが起動してテストが実行されます。
* specのletやbeforeで設定したテストデータはrspecのプロセスでセットアップされるため、テストやDBクリアの戦略をtransactionにしていると、jsdriverからテストデータが見えない。  
(transactionにしているとテスト実行後にrollbackされる（commitされない）ため別プロセスからはデータが見えない。)
* そのため、jsdriverを使用するテストではDBクリアの戦略をtruncationにする必要があります。こうするとテストデータのセットアップではcommitして、テスト実行後にtruncationが行われDBがクリアされるので、別のプロセスからテストデータが見えるようになります。（connectionをshareするやり方もあるみたいです。）
* しかし、DBのクリアをtruncationで行うとtransactionより実行コストがかかるため、jsdriverを使用しないテストでもtruncationを利用するとテスト全体が遅くなってしまいます。

* 以下のコードの1)と2)はrspecの実行プロセス内、3)は別サーバプロセスから実行される。

```ruby:sample_spec.rb
# 1)
let!(:user) { create(:user) }
before { user.posts << create(:post) }

# 2)
context 'use rack test' do
  # do something
end

# 3)
context 'use js driver', js: true do
  # do something
end

```


## 設定内容
rspecのcofigurationでbefore(:each)毎にDatabaseClearnerのstrategyを切り替えるようにすることで、jsdriverが必要なところだけtruncationでDBクリアされるようになります。

```ruby:spec/rails_helper.rb

Capybara.javascript_driver = :poltergeist

RSpec.configure do |config|
  config.use_transactional_fixtures = false

  config.before :suite do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
  end

  config.before(:each, js: true) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end
end
```

おしまい
シミュレータでNSURLErrorDomain Code=-1005の対応方法

##現象
ちょっと前ですが、Xcode6.2にバージョンアップし、最新（iOS8.2）のシミュレータで動かしたところ、NSURLErrorDomain Code=-1005を吐いて落ちました。

##手っ取り早い解決策
セキュリティソフトを一時的に止める


##真面目に解決する
ウィルスバスターの場合は修正モジュールが出ているので、下記インストールすればソフトを止めなくても大丈夫。
[http://esupport.trendmicro.com/support/vb/solution/ja-jp/1106521.aspx](http://esupport.trendmicro.com/support/vb/solution/ja-jp/1106521.aspx)


その他のセキュリティソフトも、バージョンアップで対応している等の情報もあります。
各自セキュリティソフトのベンダーへお問い合わせください。
Cloud Path for IBM powered by RacemiのSoftLayerへのWindows 2012っていつからか聞いてみた

http://www.racemi.com/general-faq/ の「SoftLayer Supported Platform List」で、**Windows Server 2012 coming soon**とあったのでCloud Pathのチケットで、いつから可能が聞いてみました。

Source OS
* Windows Server 2003 R1, R2
* Windows Server 2008 R1, R2
* **Windows Server 2012 coming soon**
* RHEL 5.x, 6.x
* CentOS 5.x, 6.x 
Source Platform
* Physical
* Hyper-V 2008
* Xen
* ESX/i/vSphere 4.x, 5.x
* KVM


そうしたらこんな回答。まあ、そうだよね。

***
Hello,
Thank you for reaching out to Cloud Path Support. Please accept my apology for the delay in responding to your question.
Windows 2012 is on the product roadmap to be supported in a future release. Unfortunately the release date is not available at this time. I will inform the product team about your interest in 2012 support.
***
「このアプリケーションで開く」の中身が重複している場合。


ファイルを右クリックしてから「このアプリケーションで開く」で、すでに削除済みのアプリや同じアプリが重複して表示されている場合、下記の対応で解消可能。

ターミナルから

```
$ /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister -kill -r -domain local -domain user
$ killall Finder
```

自分の場合、最初のコマンドを実行してから長時間応答がなかったため、```control+c```でキャンセルして、Macを再起動してから再度実行したらうまくいった。

***
参考サイト

*[【Mac】「このアプリケーションで開く」で重複したアプリケーションを削除する](http://c-through.blogto.jp/archives/24790217.html)
EC2起動高速化のために検証したこと

## この記事で検証したこと
- OSレベルでの起動速度の比較
- インスタンスタイプでの起動速度の比較
- インスタンス作成とインスタンス起動で速度に違いはでるか

## 結果から報告
調査した範囲内ではあるが、EC2のインスタンス起動は最短50秒前後

- AmazonLinuxの起動が早かった
- インスタンスタイプは起動速度に影響しない
- stop → startの方が起動速度が早い
- 起動速度は運任せ

※ 裏側の処理を見たわけではないので理屈ではなく体感ベース

## 検証

### インスタンスタイプで起動速度は変わるか
- インスタンスタイプ
  - t2.micro
  - c3.xlarge
  - c4.x8large

- 使用AMI
  - ami-aa57adaa (CoreOS-alpha-653.0.0-hvm) ← CoreOSは起動早そうなので

### 計測方法
user-dataに以下のスクリプトを設置して検証
起動はAWS CLIからの起動

```bash:user-data
#!/bin/bash
date >> /tmp/start_time
```

#### 検証
- t2.micro
  - 133秒
  - 126秒
  - 121秒
- c3.xlarge
  - 132秒
  - 92秒
  - 114秒
- c4.x8large
  - 123秒
  - 112秒
  - 142秒

#### 結果
- インスタンスタイプで起動速度は変わらない
- また運要素が大きい

### OSレベルで起動速度は変わるか
- 検証AMI
  - ami-aa57adaa (CoreOS-alpha-653.0.0-hvm) ←もちろんSSD使ってる
  - ami-cbf90ecb (Amazon Linux AMI 2015.03 (HVM), SSD Volume Type)

- インスタンスタイプ
  - c3.xlarge

#### 検証
- CoreOS
  - 先ほど検証したので省略
  - だいたい120秒前後

- AmazonLinux
  - 75秒
  - 75秒
  - 83秒

#### 結果
CoreOSよりAmazonLinuxの方が早い
AmazonLinuxの場合リソース調達方法とか違うのかな

## インスタンス作成とインスタンススタートで比較

インスタンスを作成するのとインスタンス起動するので違いは出るのか

### 検証方法
run instance と start instanceで比較

#### 検証
- CoreOS (run instanceの時は先ほどの結果より120秒前後)
  - 95秒
  - 99秒
  - 98秒
  - 95秒

- AmazonLinux (run instanceの時は先ほどの結果より80秒前後)
  - 50秒
  - 47秒
  - 47秒
  - 49秒

#### 結果
インスタンススタートの方が早い

## まとめ
現時点での起動高速化する方法

- インスタンスはSTOPの状態で放置して、必要な時にインスタンス起動する
- AmazonLinuxは起動が早い、だがパフォーマンスを考えるとCoreOSの方が良い(ことが多い)
- インスタンスタイプによる起動速度の違いはほぼない、それよりも運要素が大きい
インストールしているThunderbird拡張

自分用メモです。
画面を有効に使う系が多い（ディスプレイが狭い為）
テンプレート系が1個あってもいいかもしれない。

[CompactHeader](https://addons.mozilla.org/ja/thunderbird/addon/compactheader/?src=search)
ヘッダー部分の1〜2行に減らすもの。

[Subject Cleaner](https://addons.mozilla.org/ja/thunderbird/addon/subject-cleaner/?src=search)
MLのブレース部分とかRe:Re:をきれいにするもの。

[Theme Font & Size Changer](https://addons.mozilla.org/ja/thunderbird/addon/theme-font-size-changer/?src=search)
UIフォントを簡単に変更できる。

[ThreadVis](https://addons.mozilla.org/ja/thunderbird/addon/threadvis/?src=search)
ヘッダ欄にスレッドグラフのようなものを表示する。スレッド系だと[Thunderbird Conversations](https://addons.mozilla.org/ja/thunderbird/addon/gmail-conversation-view/?src=search)がGmailっぽく表示できるので好みで。

[あとで送る](https://addons.mozilla.org/ja/thunderbird/addon/gmail-conversation-view/?src=search)
会社指定。動きが気に入らないので何か作りたい気持ち。
JIRAをEC2+RDS+SESでセットアップする

JIRAをAWSで動かします。
DBはRDSを使い、メール送信はSESを使います。

# nginxをセットアップ

EC2にsshでログインします。
nginxをインストールします。(ELB用)

```
yum -y install nginx
service nginx start
chkconfig nginx on
```

nginxにリバースプロキシを設定します。

```:/etc/nginx/nginx.conf:
        location /jira {
            proxy_pass   http://127.0.0.1:8080;
        }
```

```
service nginx restart
```

# JIRAをインストール

JIRAのインストーラをダウンロードします。
https://www.atlassian.com/software/jira/download?b=j

```
wget https://www.atlassian.com/software/jira/downloads/binary/atlassian-jira-6.4.2-x64.bin
```

インストーラを実行します。

```
chmod +x atlassian-jira-6.4.2-x64.bin
./atlassian-jira-6.4.2-x64.bin
```

HTTPSでアクセスできるようにします。
Serviceの下に以下の記載を追加します。

```:/opt/atlassian/jira/conf/server.xml:
<Connector acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" 
            scheme="https" proxyName="アクセスするURL" proxyPort="443" secure="true"/>
```

# RDSを使うように設定する

JIRAのURLへブラウザからアクセスして、セットアップを始めます。

```
[Database Setup]
Database Type: PostgreSQL
Hostname: エンドポイント
Port: エンドポイントのポート
Database: jira_db
Database: RDSにつくったDB名
Username: RDSにつくったDBユーザー名
Password: RDSにつくったDBパスワード
Shcema: 変更なし
```

Test Connectionして、成功することを確認しておきます。

# SESを使うように設定する

設定をどんどん進めて、Email Notifictionを設定します。

```
[Set Up Email Notifiction]
Host Name: SESのServer Name
SMTP Port: 25
TLS: check
Username: SESでつくったSmtp Username
Password: SESでつくったSmtp Password
```

おしまい。
Realm使ってみたメモ

AndroidでRealmを導入してみたので気になったところメモ。
公式の情報が充実してるので本当にちょっとしたものですが。

##### ちゃんとclose()を呼ぶ
公式に書いてますが、 ```Realm.getInstance()``` 呼んだらかならず ```Realm.close()``` を対にして呼ぶ。ちょっとソースを読みましたが、 ```Realm.getInstance()``` した回数だけ参照カウンタがインクリメントされているので、きちんと同じ数の ```Realm.close()``` が必要そう。
あと、RealmインスタンスはThreadローカルで作成されるので、開くのと閉じるのは同じThreadで呼ばないとだめ。

##### RealmインスタンスはThreadをまたいで参照できない
これも公式に明記。なのでRxJavaと一緒に使ってるときなんかはちょっと使いづらさを感じています（個人の感想です）。今のところ複数のThreadをまたいで参照したい場合は、POJOに詰め替えてから別Threadに渡すのが定石でしょうか。
このへんとか参考。
https://realm.io/news/using-realm-with-rxjava/

##### signal 11がわりと出る
いくつかの端末（4.3未満）でSIGSEGV(signal 11)が発生して突然死する事象が。RealmがOOMを投げているわけでもなく、 ```Activity.onLowMemory()```が呼ばれるでもなく、突然signal 11で終了。
だいたいの場合は ```android::isHardwareAccelerated="false"``` を指定すれば異常終了はしなくなりますが描画がクソ遅くなる・・・ううーん（悩み中）。
まだメジャーバージョンが1になってないライブラリなので、ある程度は仕方ないのかも。

##### Bundleにつっこめない
Parcelable実装すれば行けそうな気もしますが、RealmObjectはRealm以外で生成しちゃダメ的なこと書いてるので、たぶんダメそう・・・。このへんどうにかなると使い勝手よくなりそうなんですが。
【Unity】Unite 2015「Unity × Sprite Animation」レポート


# レポート一覧

- [Unity パフォーマンス・チューニング](http://qiita.com/baba_s/items/c536b923b6cdd919e73e)
- [Unityプロジェクトをひも解き把握するには](http://qiita.com/baba_s/items/446fa7a040f09bcd0ac6)
- [エディター拡張マニアクス 2015](http://qiita.com/baba_s/items/8abfebb18f43fcc5d319)
- [MOBIUS FINAL FANTASYにおけるUnity開発事例](http://qiita.com/baba_s/items/ce6b11a5a8952ecf2485)
- [白猫プロジェクトの裏側！～パフォーマンスチューニングとリアルタイム通信の全て～](http://qiita.com/baba_s/items/7c5680b4b808defddcb7)
- [Unity × Sprite Animation](http://qiita.com/baba_s/items/a410ca070a2d3d037ff8)
- [Unityを利用したスマートフォン向けゲームアプリ開発へのアプローチ方法](http://qiita.com/baba_s/items/34d97d970b7f8b17a568)

# 講演ファイル

http://japan.unity3d.com/unite/unite2015/files/DAY2_1800_room2_Kinoshita.pdf

# スプライトアニメーションとは

- イラスト+スプライト+アニメーション=スプライトアニメーション
	- イラスト=画像
	- スプライト=顔とかのパーツを組み合わせたもの
- コマアニメ方式
	- スプライトの画像を随時切り替え
	- CPU負荷が小さい
	- 画像容量が増える
	- gifなど
- キーフレーム方式
	- キーフレームごとにアニメーションの値を設定し計算して表示
	- 動きが滑らか
	- 実装工数が高い
	- Flashなど

# スプライトアニメーションソフトウェアの歴史

- AfterEffects
- Flash
- Maya
- Sprite Studio
- Cocos Studio
- Sprite Builder
- Spine
- Puppet2D
- SpriterPro
- etc.

# 今回は3つ紹介

- Maya
- Spine
- Puppet2D

# アニメーションのワークフローを確認

## デザイナー

- Mayaの場合
	- シェーダの制作
	- プレーンの制作
	- リグの制作
	- アニメーションの制作
	- 最後にfbxで書き出し
	- 作業が大変
	- MELSciptで効率化するべき
- Spineの場合
	- スプライトの読み込み
	- リグの制作
	- アニメーションの制作
	- 慣れると楽
- Puppet2D
	- Unityのアセット
	- Unityエディタ上で操作する
	- 慣れると楽
	- 慣れるまで大変
	- UnityのUIに慣れているかどうか

## エンジニア

- Maya
	- FBXデータをUnityにインポート
	- Animationをモーション別に分割
	- Animator Controllerを作成
	- Animationの準備が特殊なので仕様変更があると手戻りが発生する
- Spine
	- 公式SDKをUnityにインポート
	- Spineデータをインポート
	- Skelton Animationでオブジェクトを生成
	- アニメーションを名前で指定・切り替え
	- (2015/2にMecanim対応)
	- 簡単なアニメーションから複雑なアニメーションまでエンジニアにやさしい設計思想
- Puppet2D
	- Animator Controllerを作成するだけ
	- デザイナーさんとレギュレーションをしっかり握る必要がある
	- デザイナーに用意してもらえればほとんど工数が発生しない

# ソフトウェアを検証

デザイナー、マネージャー、エンジニアの視点から比較検証

## デザイナーの視点

|　|工数|表現力|柔軟力|
|:--|:--|:--|:--|
|Spine|◎|○|◎|
|Maya|×|◎|×|
|Puppet2D|○|○|○|


## エンジニアの視点

|　|工数|表現力|柔軟力|
|:--|:--|:--|:--|
|Spine|○|○|◎|
|Maya|×|○|○|
|Puppet2D|◎|○|×|


## マネージャーの視点

|　|費用|サポート|分業|
|:--|:--|:--|:--|
|Spine|○|○|◎|
|Maya|×|◎|○|
|Puppet2D|◎|×|×|

# 検証結果

- Spineが一番良いかも

- Spine
	- バランスがいい
	- 万人向け
- Maya
	- 機能的に最高
	- 十分にプリプロダクションするチーム向け
- Puppet2D
	- Unityのインタフェースの改善に期待
	- Unityの操作性に慣れているチーム向け
【Unity】Unite 2015「エディター拡張マニアクス 2015」レポート


# レポート一覧

- [Unity パフォーマンス・チューニング](http://qiita.com/baba_s/items/c536b923b6cdd919e73e)
- [Unityプロジェクトをひも解き把握するには](http://qiita.com/baba_s/items/446fa7a040f09bcd0ac6)
- [エディター拡張マニアクス 2015](http://qiita.com/baba_s/items/8abfebb18f43fcc5d319)
- [MOBIUS FINAL FANTASYにおけるUnity開発事例](http://qiita.com/baba_s/items/ce6b11a5a8952ecf2485)
- [白猫プロジェクトの裏側！～パフォーマンスチューニングとリアルタイム通信の全て～](http://qiita.com/baba_s/items/7c5680b4b808defddcb7)
- [Unity × Sprite Animation](http://qiita.com/baba_s/items/a410ca070a2d3d037ff8)
- [Unityを利用したスマートフォン向けゲームアプリ開発へのアプローチ方法](http://qiita.com/baba_s/items/34d97d970b7f8b17a568)

# 講演ファイル

http://japan.unity3d.com/unite/unite2015/files/DAY2_1400_room2_Ando.pdf

# はじめに

Unity 5.1 ベースの話

# スプライトアニメーションを題材としたエディター拡張の話

- 従来のスプライトアニメーションの作成方法
	- Projectビューで複数のスプライトを選択してSceneビューにD&D
- Unity5.1からは複数のスプライトを選択して右クリックして「Create/Animation」
	- AnimationCiipが作成されるがInspectorビューで中身を確認できない
		- InspectorビューをDebugモードにすると確認できる

# CustomPreview属性

- テクスチャやアニメーションの再生をプレビューする場所を拡張できる

```cs
[CustomPreview(typeof(AnimationClip))]
public class SpriteAnimationPreview : ObjectPreview
{
}
```

- プレビューは複数のカスタムプレビューを持てる
	- タイトルの部分がドロップダウンメニューになる
	- ちょっと残念なところ
		- デフォルトで表示させるプレビューを設定できない

# デフォルトプレビューをオフにする方法

```cs
[CustomEditor(typeof(AnimationClip))]
public class AnimationClipEditor : OverrideEditor
{
	public override bool HasPreviewGUI()
	{
		return false;
	}
}
```

# Spriteアニメーションをスクリプトで作成する方法

- ObjectReferenceKeyframe
	- Keyframeのオブジェクト参照版
	- float値の代わりにObjectを設定することができる
- EditorCurveBinding
	- どのプロパティをアニメーションさせるかのキー
	- キーはシリアライズ可能なデータのみ
- AnimationUtility.SetObjectReferenceCurve
	- 指定したAnimationClipの特定のキーに特定の値を設定する

# AnimatorOverrideController

- ステートマシンはそのままで戦士、格闘家、魔法使いのようにスプライトだけを変更したい時など
- アニメーターコントローラーのアニメーションを上書きするオーバーライドコントローラー

# オススメの機能

- ReorderableList
	- 使うと配列が見やすくなる
- AssetDatabase.GenerateUniqueAssetPath
	- 同名のアセットがあってはだめなのでユニークな名前にする
- EditorApplication.delayCall
	- インスペクターアップデート時に呼び出されるデリゲート

# ScriptableWizard

- 対話形式でアセット作成・編集できる
- 常に前にポップアップ
- 状況に合わせてhelpやerrorを表示できる

# Unity5の新機能

- UnityEditor.InitializeOnLoadMethod
	- InitializeOnLoadのメソッド版
- UnityEditor.Menu
	- メニューにチェックをつけるためのAPI
- UnityEngine.HelpURLAttribute
	- はてなマークのジャンプ先のURLを変更するための機能
- GUI.Scope
	- BeginHorizontalやEndHorizontalをIDisposableでラップしたもの

# おまけ

- SceneViewクラス
	- Editor.OnSceneではなく、グローバルなonSceneGUIDelegateがある
	- シーンビューを操作できる様々なAPIがある
- PojectWindowUtilクラス
	- メニューからアセットを作成するときに使用されるAPI
	- ProjectWindowUtil.CreateAssetは覚えておくと絶対便利
- ActiveEditorTrackerクラス
	- 現在インスペクターに表示されているEditorオブジェクトを管理するAPI
	- Editorオブジェクトを操作するときに便利
- UnityStatsクラス
	- 現在の描画に関する情報などを取得するためのAPI
- ComponentUtilityクラス
	- コンポーネントのコピーが行えるAPI
- InternalEditorUtilityクラス
	- なんかいろいろ面白いAPIがあるクラス
		- タグやレイヤーの一覧が取得できたり
		- UnityのPreferenceフォルダのパスが取得できたり
		- オブジェクトをシリアライズできたり
ggplotとqplotの対応

https://github.com/hadley/ggplot2/blob/master/R/translate-qplot-ggplot.r
に、ggplotとqplotの対応が書いてあったので、適当に訳してみた。以下はその内容。

# Translating between qplot and ggplot

ggplot2の中には2種類のplotを作る関数がある。それは

- qplot()
- ggplot()

である。
qplotは、手軽に使えるようにするために、幾つもの仮定をおいていて、大抵はより素早くplotをかけるが、複数のレイヤやデータを使うような複雑なプロットをするときはうまくいかない。

ここでは、このqplotが仮定しているデフォルトの挙動は何か、ggplotと例を上げて比較することで示す。

## 基礎

qplotはデフォルトで散布図(scatterplot)を仮定する。

```R
qplot(x, y, data = data)
ggplot(data, aes(x, y)) + geom_point()
```

## Aesthetics(aes)を使う

> ここでは Aesthetic を データ系列と訳すことにする


なお、qplotは違うレイヤの審美値マッピングやデータを使う方法はない。

```R
qplot(x, y, data = data, shape = shape, colour = colour)
ggplot(data, aes(x, y, shape = shape, colour = colour)) + geom_point()
```

```R
ggplot(data, aes(x)) + geom_bar()
qplot(x, data = data, geom = "bar")
```

geom属性を変えたいときはgeomパラメータを変更する。


```R
qplot(x, y, data = data, geom = "line")
ggplot(data, aes(x, y)) + geom_line()
```

geomによっては、x,yの両方を必要としない。具体的には、`geom_bar()`と`geom_histogram()`である。
yが与えられなかった場合、qplotもggplotもxを"count"した結果をyとして使う。

```R
qplot(x, data = data, geom = "bar")
ggplot(data, aes(x)) + geom_bar()
```

geomの引数にgeom名の配列が渡された場合は、その順番にgeomが追加されていく。

```R
qplot(x, y, data = data, geom = c("point", "smooth"))
ggplot(data, aes(x, y)) + geom_point() + geom_smooth()
```

ggplot2の他のところとは違い、statとgeomは独立している。

```R
qplot(x, y, data = data, stat = "bin")
ggplot(data, aes(x, y)) + geom_point(stat = "bin")
```

layerのパラメータは全てのレイヤに渡される。ほとんどのレイヤはそのパラメータが必要ないため、そのパラメータ情報が無視される。

```R
qplot(x, y, data = data, geom = c("point", "smooth"), method = "lm")
ggplot(data, aes(x, y)) + geom_point(method = "lm") + geom_smooth(method = "lm")
```

## スケールと軸
x, yのスケールは、xlim, ylim, xlab, ylabを用いて設定できる。

```R
qplot(x, y, data = data, xlim = c(1, 5), xlab = "my label")
ggplot(data, aes(x, y)) + geom_point() +
scale_x_continuous("my label", limits = c(1, 5))
```

```R
qplot(x, y, data = data, xlim = c(1, 5), ylim = c(10, 20))
ggplot(data, aes(x, y)) + geom_point() +
scale_x_continuous(limits = c(1, 5)) + scale_y_continuous(limits = c(10, 20))
```

plotと同様にqplotは、簡単に軸をlogスケールに変換する事ができる。

```R
qplot(x, y, data = data, log = "xy")
ggplot(data, aes(x, y)) + geom_point() + scale_x_log10() + scale_y_log10()
```

ggplotはもっと多彩なスケール変換ができるが、qplotの中からその全てにアクセスできるわけではない。詳細は[scale_continuous](https://github.com/hadley/ggplot2/blob/master/R/scale-continuous.r)参照。

## Plotのオプション

qplotはplotと同じオプションをとることができ、対応するggplot2のオプションに変換される. 以下の例では`main`と`asp`オプションが変換されている。

```R
qplot(x, y, data = data, main="title", asp = 1)
ggplot(data, aes(x, y)) + geom_point() + labs(title = "title") + theme(aspect.ratio = 1)
```
Go言語でServer作る時に必要な知識メモ


基本的に必要な物は、[net/http](http://golang.org/pkg/net/http/)パッケージに入っている。

```go
import "net/http"
```

するだけで、基本的なHTTPのリクエストとリスポンスに関する処理を行うことが出来る


```
http.Handle("/foo", fooHandler)

http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})

log.Fatal(http.ListenAndServe(":8080", nil))
```

ここで、`http.Handle`, `http.HandleFunc`すると、DefaultServerMuxと言うものにマッピングが登録される。

## ServeMux

- ServeMux = HTTP request multiplexer
 - リクエストを登録済みのURLパターンリストと照合して、マッチしたHandlerを呼び出す
 - 複数マッチする場合はマッチが長いほうが優先される
 - e.g "/images/thumbnails/", "/images/", "/" という順
 - 逆に言えば、"/"は全てのリクエストにマッチする。そのため本当に"/"だけかはHandler側でチェックする必要がある。

```
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
   // The "/" pattern matches everything, so we need to check
   // that we're at the root here.
   if req.URL.Path != "/" {
       http.NotFound(w, req)
       return
   }
   fmt.Fprintf(w, "Welcome to the home page!")
})
```

### gorilla/mux
http://www.gorillatoolkit.org/pkg/mux

デフォルトのServerMux(Router)は非力なので、`gorilla/mux`というライブラリが人気を集めている

```
r := mux.NewRouter()
r.HandleFunc("/products/{key}", ProductHandler)
r.HandleFunc("/articles/{category}/", ArticlesCategoryHandler)
r.HandleFunc("/articles/{category}/{id:[0-9]+}", ArticleHandler)
```

```
vars := mux.Vars(request)
category := vars["category"]
```

というように便利なRoutingができるもの。

## Middleware

https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style#what-is-middleware

> If your application--your routing, your controllers, your business logic--is the green circle in the center, you can see that the user's request passes through several middleware layers, hits your app, and then passes out through more middleware layers. Any given middleware can operate before the application logic, after it, or both.

>![onion.png](https://qiita-image-store.s3.amazonaws.com/0/6664/2a04bae1-ae3e-2aff-ca44-4d8eafc7164a.png "onion.png")

アプリケーションロジック(自分で書くRouterやControllerが行う部分)を実行する前後に何かしてくれるもの。この図で言えば、緑がアプリケーションロジックで、その周りにいるのがミドルウェア。

### negroni

https://github.com/codegangsta/negroni

このミドルウェアを導入するのに、今人気を集めてきているライブラリが`negroni`これは、[matini](https://github.com/go-martini/martini)という人気を集めたWeb Frameworkの作者が、Go的じゃないという批判をうけて、それならということで書き直したもの。

これと、gorilla/mux を組み合わせてウェブアプリを作るような [web書籍](https://github.com/astaxie/build-web-application-with-golang/blob/master/ja/preface.md) もあり、参考になる。

## WebFramework

まずは、Goなら、Frameworkを使わずにnet/httpだけでやってみるという手も全然ありなことを忘れずに。

### Revel

http://revel.github.io/
Go言語の中では一番がっしりしたフレームワーク。Rails的

### Martini

http://martini.codegangsta.io/
Revelより軽量なSinatra的フレームワーク。

### Negroni

Martiniの作者が、Go的なMiddlewareのみのフレームワークにしたもの。
ルーティングは[gorilla/mux](http://www.gorillatoolkit.org/pkg/mux)と組み合わせろと書いてあったり、ミドルウェアの部分のみをミニマムに実装したもの。

### Gin

http://gin-gonic.github.io/gin/
Matiniと同じような軽量フレームワーク。ただMatiniより20倍から45倍速いと書いてある。

### Goji

https://github.com/zenazn/goji

### Go-Json-Rest
https://github.com/ant0ine/go-json-rest

RestfullなJSON APIを提供しやすい。authやJSONP、gzipなどにも対応できる。
充実したexampleがある https://github.com/ant0ine/go-json-rest-examples
Prototype汚染に負けないfor in文の書き方

※そもそもPrototype汚染をやめる、という話は別の機会に。

汚染された状態でも for in文を書きたい人向けです。

## プロトタイプ汚染とは
>Object.prototype.myMethod を拡張すると、
>for in ループで myMethod が(意図せず)列挙されてしまいます。これが汚染です。

[参考][プロトタイプ汚染とループ]
(http://uupaa.hatenablog.com/entry/2012/11/07/143947)

# 汚染対策
## ①for inをやめる：Object.Keys
※for in文の書き方とか言っておきながら、いきなりやめます(｀･ω･)☆

for inをやめると、汚染されたプロトタイプ拡張で追加された
methodを呼び出すことはなくなります。わぁい。

というわけで、**[Object.Keys](http://msdn.microsoft.com/ja-jp/library/ie/ff688127%28v=vs.94%29.aspx)**を使います。


```js:Object.Keys
Object.keys(obj).forEach(function (p) {
  //do something
})

```

これで連想配列を安全に振り回せます。

ただし、これは、**EcmaScript5で策定されたもの**です。
対象ブラウザ：http://kangax.github.io/compat-table/es5/#Object.keys

**IE9から／(^o^)＼**
サポートブラウザをIE9としていたとしても
心の底では出来る限りサポートブラウザを増やしたい。。。。


## ②for inをやめたくない時：hasOwnProperty
※①をそう簡単に出来ないという場合（本題）
IE7とか8もまだサポートしたい＼( 'ω')／ｳｵｵｵｵｱｱｱｱｰｰｰｰｰッ!!!となったら…

毎回if文を書きたくない場合はもうすこし考えます…

```js:hasOwnProperty
for (var p in obj) {
  if (obj.hasOwnProperty(p)) {
    //do something
  }
}
```


## 他にもいろいろあるみたい。
[prototype汚染問題でhasOwnPropertyを使わないクロスブラウザな方法](
http://os0x.hatenablog.com/entry/20080901/1220272509)
[いちいちhasOwnPropertyを使わなくてよくする(ジェネレータの使いかた)](http://javascripter.hatenablog.com/entry/20080831/1220193619)


# まとめ
+ 軽い気持ちのprototype拡張は汚染を招く
+ 考えての拡張は汚染じゃない。汚染じゃないからやっても良い
+ というかES5からは拡張しても安全になりつつある
+ ES5の関数を使うならIE8,7は切ろう
+ 汚染が起きても大丈夫なようにfor inを使うならhasOwnPropertyなどを使おう
+ もしくはObject.Keysを使う
+ hasOwnPropertyとObject.Keysで一部違いがあるのはちゃんと把握していた方が良さそう
 
[for-inとObject.keysの違いを正しく知る](http://qiita.com/cocottejs/items/66eef8fef22c0082a15f)
→実装のパターンなどがあるので時間があるとき読むと◎です
【Unity】Unite 2015「ゲーム開発の始め方、育て方、終わらせ方～「Game Dev Heroes」における生産性チャレンジ～」レポート


# レポート一覧

- [ここが変わる！Unity 5のスマホ開発　～アセットバンドル、ビルド、プラグイン～](http://qiita.com/baba_s/items/8d4a30d6458b9efac2fe)
- [コロプラUnity 5プロジェクト ～白猫プロジェクトにおけるUnity 4からUnity 5への移行事例～](http://qiita.com/baba_s/items/3c394db28be90d83234c)
- [Unity 5グラフィックス機能使いこなしガイド](http://qiita.com/baba_s/items/d4f7b24bab2ccdaa1f1e)
- [Rederer Massive Amount of Objects in Unity](http://qiita.com/baba_s/items/228b368196ef606e4b68)
- [協力・対戦ゲームを支えるPhotonの最新情報、Mecanimにネイティブ対応したPUNの実力協力・対戦ゲームの市場感](http://qiita.com/baba_s/items/3f29400c026fc0d87842)
- [ゲーム開発の始め方、育て方、終わらせ方～「Game Dev Heroes」における生産性チャレンジ～](http://qiita.com/baba_s/items/a563b09e93e7e868d00b)

# 講演ファイル

http://japan.unity3d.com/unite/unite2015/files/DAY1_1900_room2_Shimoda.pdf

# ゲーム開発の生産性って何だ？

- 確実に進捗する
- バグのリスクが低い
- データ作成が容易
- テストプレイが容易
- できるだけエディターを使う

## 時間もお金もない状況下で

- 背景は床1枚だけ
- ゲーム開発の題材を表現するためのオブジェクトを最小限に
- ゲームに登場するオブジェクトはタスクと開発者のみ
- 2030年のゲーム開発がどうなっているかわからない状態
	- PCモデルとか作るのたるい
	- 次に格ゲー作る予定もあるし
	- 格闘アニメでゲーム開発を表現
- RAIN：AIのアセット、オススメ
	- https://www.assetstore.unity3d.com/jp/#!/content/23569


## 大鳥こはく(Unityちゃん)の価値

- とりあえず動かせる
- プログラマにとってはデバッグ確認にもなる
	- モーションが動く=機能の呼び出しに成功している
- とりあえず絵になる
- とりあえず見てもらえる

## Unityはコンポーネント指向

- コンポーネント単位の独立した振る舞い
- 既存のシステムを破壊することなくあとから違う振る舞いのゲームを追加できる
- コンポーネント単位で分業できる
- プロトタイプ開発しやすい

## コンポーネント指向の落とし穴

- 機能がいくつものコンポーネントに散らばる
- 相互に変数を参照にしあうと可視化されない
- 全体管理が難しくなる
- バグが発生しやすい
- GUIはひとつのスクリプトにしたほうがいい
- ひとつのスクリプトにまとめることに関して2011年にいろいろ言われたけど  
GameManager.csやGameSystem.csにまとめるのはやっぱり必要だと思う

## 各職種の方が求めること

- ゲームデザイナー：新しい仕様を試せること
- プログラマー：バグらないこと、破綻しないこと

## 通しプレイができることの意味

- 開発の終わりが見える
- データを入れればとりあえず完成できる
- 総合的な面白さの検証ができる

## ゲームの面白さの段階

- 面白そうに見える
- 1レベルをプレイして面白い  
↑ここはなんとかなってた
- 最後までプレイして満足できる

## 12月の時点

- あまりにもグラフィックスが手抜きだった
- ライティングやグロウエフェクトを駆使してタスクのオブジェクトが  
暗闇の中を浮かび上がるように
- Vignetting
- カメラにコンポーネントを張るだけで見た目が変わった
- プリミティブなキューブでタスクを表現していたのが役に立った

## 情報公開

- Facebook
- ゲーム開発者コミュニティ
- 英語圏へのリーチ

## indie game developers

- 雰囲気が昔の2chみたいな感じ
- ちゃんと作っている人はちゃんと応援しあう感じ

## Screenshot Saturday

- ゲーム開発の進捗をスクリーンショットで毎週土曜日に公開できる
- これを使用すると1週間で進捗が見えるものを作ろうとする
- 生産性が高まる
- グラフィックスに関しては明らかにいい反応があった

## 足りないもの

- プレイヤーのタスクを順番にこなすだけのゲームになっていた
- プレイヤー自身が誰に自分を投影すればいいのかがわからない
- ストーリーものとしてはキャラクターへの感情移入ができない
- キャラの人間関係とかが必要？

## 改善方法

- ゲームプレイ中に開発スタッフの能力に応じて新しいタスクを作れるように
- クリエイティブな側面を表現
- 成長の実感が足りない部分に関してはレベルアップのシーンを導入して改善
- ディレクターがほかのスタッフを監督できるように

## エディタ拡張

- デバッグ用にTime.deltaTimeをいじれるWindowを作成
- 参照関係をしらべるWindowを作成
- Editor拡張をしても直接開発は進まないので注意

## 残作業

- 残っている作業はデータ・アセットのみ
- 仕組み自体はすでに完成している
- カットシーン制作
- uSequencerの導入
- キャラのリギング
- HumanIKのリターゲッティング
- Qumarionによるポーズの量産

## まとめ

- Unityはスキルのない人がゲームを作れるようになるツールではない
- スキルを引き出すためのツール
- Unityを使っているとスキルや知識の足りなさが露呈する

## 開発が伸びる理由

- 開発を終わらせようとしないから
- ゲーム開発とは何かを捨てて進むこと
- 1年で75%のものを出して次の年に活かした方がいい
- 生涯の生産性を考えよう
【Unity】Unite 2015「協力・対戦ゲームを支えるPhotonの最新情報、Mecanimにネイティブ対応したPUNの実力協力・対戦ゲームの市場感」レポート


# レポート一覧

- [ここが変わる！Unity 5のスマホ開発　～アセットバンドル、ビルド、プラグイン～](http://qiita.com/baba_s/items/8d4a30d6458b9efac2fe)
- [コロプラUnity 5プロジェクト ～白猫プロジェクトにおけるUnity 4からUnity 5への移行事例～](http://qiita.com/baba_s/items/3c394db28be90d83234c)
- [Unity 5グラフィックス機能使いこなしガイド](http://qiita.com/baba_s/items/d4f7b24bab2ccdaa1f1e)
- [Rederer Massive Amount of Objects in Unity](http://qiita.com/baba_s/items/228b368196ef606e4b68)
- [協力・対戦ゲームを支えるPhotonの最新情報、Mecanimにネイティブ対応したPUNの実力協力・対戦ゲームの市場感](http://qiita.com/baba_s/items/3f29400c026fc0d87842)
- [ゲーム開発の始め方、育て方、終わらせ方～「Game Dev Heroes」における生産性チャレンジ～](http://qiita.com/baba_s/items/a563b09e93e7e868d00b)

# 講演ファイル

http://japan.unity3d.com/unite/unite2015/files/DAY1_1800_room2_Namiki.pdf

# アジェンダ

- マルチプレイのゲームを作るには
- Photonのご紹介
- PUNのご紹介
- PUN1.5xを使ったMecanim同期デモ
- Photon最新情報

# マルチプレイについて

## 協力・対戦ゲームの市場感

- マルチプレイゲームの数
- 単純にマルチプレイかどうかの判断で見ると両プラットフォームで増加傾向
- 直近では半数以上になっている

## 協力・対決の割合

- どちらのプラットフォームも協力プレイだけのゲームというのは少ない
- 日本においても対戦ゲームは増えてきてる

##まとめ

- 市場は盛り上がっている
- 協力はもちろん、対戦も増えている
- マルチプレイという要素はスタンダードに

# マルチプレイのゲームを作るには

## マルチプレイって？

- 複数のプレイヤーが同時に同じゲームを楽しむこと
- プレイヤー同士をつないでデータのやり取りが必要

## 同期すべきデータ

- 各キャラクタの位置、状態
- イベント情報
- ゲーム全体の状態
- etc.

## キャラクタの位置・状態

- 全プレイヤー内のキャラクタの位置や状態は同期していないとダメ
- Unity的な言い方をすれば各インスタンスのtransform,animatorのステータスを同期させる
- イベント情報
- ゲームの重要な要素
- よくあるのは衝突判定の結果とか
- イベントをだれが発生させるのかとか
- ゲーム全体の状態
- 同じゲームをしている人すべてが共有すべき情報
	- たとえば、ゲームの進行状態とか、残り時間とか
	- レイドバトルのような場合は敵キャラの状態とかもここで管理する方法も

## どこで処理を実装するか

- 日本のディベロッパーは、ソーシャルゲームの癖でついサーバー側でと考えがちですが  
なるべくクライアント側で実装を勧めます
- サーバー側で何でもやると、通信のタイムラグやサーバーの負荷を気にしたりとか、  
結構大変だったりします

## マルチプレイゲームのまとめ

- 肝はデータの同期
- 同期させる対象、事象を整理しておく
- ゲームを始めるまでのロビーやマッチメイキングのお話もありますが、別の機会に

# Photonのご紹介

## Photonとは

- マルチプレイを実現するために必要な機能を一通り持っているツール
- サーバーとクライアントSDKをセットで提供
- クライアント間の通信を簡単に実現するためのシステム
- サーバーは安全性？を確保するためのもので、基本的に処理を行うのはクライアント

## Photonでできること

- リアルタイム通信
- ストレージとかリーダーボードとかそういう機能は持っていません
- 主な機能
	- ロビー
		- 名前付きロビー
		- マッチメイキング
		- プレイヤー検索
	- ルーム
		- 人数制御・表示制御
	- カスタムプロパティ
	- 同期関連
		- オブジェクト同期
		- イベント通知
	- RPC(PUN)
		- WebHooks/WebRPC
		- オフラインモード

## 特徴

- サーバー経由の接続なので接続性が高い
- 独自技術による信頼性と低レイテンシーの両方を確保
- クロスプラットフォーム対応で異なるプラットフォーム間でも利用可能
- UnityからはAssetStoreからダウンロードするだけでSDKの利用が可能

# PUNのご紹介

- PhotonのNative SDK
- クロスプラットフォームでどのプラットフォームでも基本的には同じ形のAPI
- Photonのすべての機能を使えます
- Photon Unity Networkingの略
- Native SDKをベースにPhotonをUnityで使いやすい形にしたAPI
- Unity Networking互換で移行も容易
- サーバーはRealtimeと全く同等
- Asset Storeからインポートするだけで利用可能

## PUNならではの特徴

- 簡単なクラス構造
	- SDKのクラスを派生させて、そこに必要なコードを追加して、  
メインクラスから呼び出す、という構造
- 簡単オブジェクト同期
	- Native SDKではオブジェクト同期もイベント発生・受信で処理するので  
簡単ながらコードが必要
	- PUNではインスタンスにクラスをアタッチするだけで  
Transform/Rigidbodyを同期させることが可能
	- 同期のタイミングはPUNが面倒を見るので勝手にやってくれます
	- RPCによる簡単なイベント通知
		- RPCなら[RPC]属性を付けたメソッドを作成して、  
そのオブジェクトに対してRPCメソッドでメソッド名を名前で指定するだけ

## PUNで簡単にオンラインゲーム

- キャラクタの位置・状態：オブジェクト同期
- イベント情報：イベント通知、RPC
- ゲーム全体の状態：ルームのカスタムプロパティ

## PUN1.5xを使ったMecanim同期

- Mecanimにもネイティブ対応
- 接続処理部分以外はほとんどコーディングなしでできています
	- 実際に10分程度のコーディングで動作するデモを見せていただきました

# まとめ

- 接続処理はさすがにコーディングが必要ですが、  
スクリプトがほとんどなくても同期できる
[iPhone]32bit端末と64bit端末でBOOLへのキャスト結果が異なる!

開発中にハマったので共有。

32bit端末では1バイトより大きい数値をBOOLにキャストするとNOになってしまう。
OSは無関係のようだ。

|式|32bit端末|64bit端末|
|:--|:--|:--|
|(BOOL)255|YES|YES|
|(BOOL)256|NO|YES|

`sizeof(BOOL)`はどちらの端末でも1バイトなので、どうしてこうなってしまうかは不明。

なので下のように`NS_OPTIONS`値を使ってフラグ判定する場合は注意が必要。

```objc:
typedef NS_OPTIONS(NSUInteger, SomeFlags){
    kFLG1 = 1 << 0,
    kFLG2 = 1 << 1,
    ....
    kFLG8 = 1 << 7,
    kFLG9 = 1 << 8
};

// OK
- (BOOL)isFLG9:(NSUInteger)value {
    return ((value & kFLG9) != 0);
}

// NG
- (BOOL)isFLG9:(NSUInteger)value {
    return (value & kFLG9); // 結果が0以外でも32bit端末だとNOが返ってしまう
}
```
【Unity】Unite 2015「Unity 5グラフィックス機能使いこなしガイド」レポート


# レポート一覧

- [ここが変わる！Unity 5のスマホ開発　～アセットバンドル、ビルド、プラグイン～](http://qiita.com/baba_s/items/8d4a30d6458b9efac2fe)
- [コロプラUnity 5プロジェクト ～白猫プロジェクトにおけるUnity 4からUnity 5への移行事例～](http://qiita.com/baba_s/items/3c394db28be90d83234c)
- [Unity 5グラフィックス機能使いこなしガイド](http://qiita.com/baba_s/items/d4f7b24bab2ccdaa1f1e)
- [Rederer Massive Amount of Objects in Unity](http://qiita.com/baba_s/items/228b368196ef606e4b68)
- [協力・対戦ゲームを支えるPhotonの最新情報、Mecanimにネイティブ対応したPUNの実力協力・対戦ゲームの市場感](http://qiita.com/baba_s/items/3f29400c026fc0d87842)
- [ゲーム開発の始め方、育て方、終わらせ方～「Game Dev Heroes」における生産性チャレンジ～](http://qiita.com/baba_s/items/a563b09e93e7e868d00b)

# 講演ファイル

http://japan.unity3d.com/unite/unite2015/files/DAY1_1500_room3_Takahashi.pdf

# アジェンダ

1. Lightingの新しい機能
2. Realtime GIの基礎

# LIGHTING

## AMBIENT LIGHT

3つの方式から選択できるようになった

- Skybox
- Gradient
- Solid Color

Window>Lightingウィンドウでライトの設定ができる

## SKYBOX

- Procedural Skybox：パラメータから空を自動生成する
- Cubemap SKybox：パノラマ画像からキューブマップを作成する

- GoogleでHDRで検索してリソースのサンプルを入手
	- .exr
	- .hdr
	- これらをUnityにD&Dする
	- キューブマップに変更してApply

## CAST SHADOW OPTIONS

- Two Sided:片面だけでも影が落ちる
- Shadows Only:キャラクターの影はローポリでも良い

## PCF SOFT SHADOW

- ジャギが消えた
- パフォーマンスが上がった

# REALTIME GI(グローバルイルミネーション)

- Indirect Lighting:間接光の表現が可能になる
- 固定物にstaticをつける必要がある
- HierarchyでLigh Probをライトの変化がありそうな場所に配置する
- 直接光は何も考える必要がない
- 間接光はdiffuse反射を計算してくれる
- ダイナミックなオブジェクト、キャラクターとかに関してはLight Probを介する必要がある
- Specularに関してはReflection Probeを介する必要がある

## DIRECTIONAL MODE

- Directional Mode
	- Non Directional
	- Directional
	- Directional Specular
- Directional Modeを変更することによってシェーダの能力を引き出すことができる
- 追加情報が増える、情報量が増える、などのデメリットはある
- 表現力があいまいになってしまう
- 代表的な方向の光の影響を計算するアルゴリズムなので複数方向に光がある場合は気を付けた方がいい、怪しい表現になる
- こういう時はRefrection Probeを使用した方がいい

## REFRECTIN PROBE

- Probe同士の繋ぎ
- 反射のさらに反射
- 基本はできない、お互いに黒いものを映してしまう
- Reflection Bouncesで反射回数は設定できる
- やりすぎるとベイクが重くなる
- リアルタイム反射
- デフォルトではベイク方式
- staticなオブジェクトをベイクする
- Refrection Probeコンポーネントを使用する
- BakedからRealtimeに変更することでダイナミックなオブジェクトも映しこむ
- Refresh ModeをOn AwakeからEvery Frameに変更する