OmniAICreator/Qiita-1.07M huggingface dataset:
Elixir のWebフレームワーク Phoenixをインストールする


* `Elixir` のパッケージ管理 `Hex` をインストールする。

```:zsh
$ mix local.hex                                                                                                                                                             ⏎
Are you sure you want to install archive https://s3.amazonaws.com/s3.hex.pm/installs/1.0.0/hex.ez? [Yn] y
2015-05-30 22:08:10 URL:https://s3.amazonaws.com/s3.hex.pm/installs/1.0.0/hex.ez [262010/262010] -> "/Users/s_miyamoto/.mix/archives/hex.ez" [1]
* creating .mix/archives/hex.ez
```

* `Phoenix` をインストールする 

```:zsh
$ mix archive.install https://github.com/phoenixframework/phoenix/releases/download/v0.13.0/phoenix_new-0.13.0.ez
Are you sure you want to install archive https://github.com/phoenixframework/phoenix/releases/download/v0.13.0/phoenix_new-0.13.0.ez? [Yn] y
* creating .mix/archives/phoenix_new-0.13.0.ez
```
Use Phusion Passenger on nginx with RAILS_ENV

## How to

Phusion passenger sets Rails' environment variable as `production` by default and **doesn't see ENV in shell**. To change this value, you can change `passenger_app_env` in nginx configuration file.

```
passenger_app_env staging;
```

## Handle it in Docker container

I have Docker environment for staging. To set up this in my environment, I added another configuration file in starting script used in `Dockerfile`.

```
# Dockerfile

# Some setup commands...
ENV RAILS_ENV production # This is default value. It will be overwritten by `--env` option.

CMD ['start.sh']
```

```
# starting script; start.sh

# Add nginx configuration for setting `passenger_app_env` as RAILS_ENV
RUN echo "passenger_app_env $RAILS_ENV;" > /opt/nginx/conf/00_app_env.conf

rake db:migrate && \
    /opt/nginx/sbin/nginx
```

ref:

* [passenger-docker/README.md · phusion/passenger-docker](https://github.com/phusion/passenger-docker/blob/bd2e6727381ad9aea4f1dab29c5da939205da2d5/README.md#app_env_name)
* [passenger-docker/30_presetup_nginx.sh · phusion/passenger-docker](https://github.com/phusion/passenger-docker/blob/7a78d92888691d292719486de99598716461059c/image/config/30_presetup_nginx.sh)
CentOS7にNginx1.9をインストールする方法

レポジトリファイルを自分で作る

```
nano /etc/yum.repos.d/nginx.repo
```

```/etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=0
enabled=0
```

enabled=0にしておくのは、`nginx.repo`をyumコマンドのデフォルトの探索対象から除外するため。

バージョン確認

```
sudo yum info --enablerepo=nginx nginx
```

インストール

```
sudo yum install --enablerepo=nginx nginx
```

# 追記 : Chef化しました。

http://qiita.com/DQNEO/items/e0a6812566e44c7f9577
クラスでレコードイメージを作成する

#クラスでレコード(bean)イメージを作成する

複数メンバのある構造体(Type)を配列にするのであれば、クラスとコレクションを使ったほうが便利に使えます。
JavaとかC#な方はこちらのほうが馴染みがありますね。
クラスはパブリックな変数にするかプライベート変数をプロパティプロシージャで公開するか好みが出ます。
公開のみとか代入のみとかできるプロパティプロシージャがおすすめですが、コンストラクタがしょぼすぎなので
パブリックな変数でちゃっちゃと作ってしまうものアリだと思います。

※ReadOnlyのプロパティにした場合、通常、別途設定するメソッドなどを作る必要があります。Javaなどではコンストラクタで入れ込むのが普通ですがVBAではあまり。。。ねぇ。

```VB.net:Class1.cls
Option Explicit

'プライベートな変数をプロパティプロシージャで公開するも良し
Private m_name As String

'直接変数を公開するも良し
Public Age As Long

Public Property Get Name() As String
    Name = m_name
End Property

Public Property Let Name(ByVal vNewValue As String)
    m_name = vNewValue
End Property
```

```VB.net:Module1.bas
<pre>
Attribute VB_Name = "Module1"
Option Explicit

Sub a()

    Dim list As Collection
    Dim c As Class1
    
    Set list = New Collection
    
    Set c = New Class1
    c.Name = "ああああ"
    c.Age = 17
    list.Add c
    Set c = Nothing
    
    Set c = New Class1
    c.Name = "いいいい"
    c.Age = 32
    list.Add c
    Set c = Nothing
    
    'リストの内容を列挙 
    For Each c In list
        MsgBox c.Name & c.Age
    Next
    
    Set list = Nothing

End Sub
```
他のソースをごらんになりたい方はこちらへ
Excelを便利にする250以上の機能を体系化したアドインはこちらです。
「RelaxTools Addin」窓の杜大賞受賞ソフト
http://software.opensquare.net/relaxtools/
ScalaのPlay Framework 2.4で変更されたっぽい点

## はじめに

ScalaのPlay Framework 2.4がリリースされ、ちょっと触ってみる機会があったので、2.3.9から変更されているっぽい点を気づいただけメモっていきます。

* Mac OS Yosemite
* Play Framework 2.4


## Assetsを引っ張ってくる関数

activatorを使いPlayのプロジェクトを作成した時、2.3.9では、`config/routes`の記述は以下のようになっていると思います

```
GET  /assets/*file    controllers.Assets.at(path="/public", file)
```

しかし、2.4では以下のようになっています。

```
GET  /assets/*file    controllers.Assets.versioned(path="/public", file: Asset)
```

`Assets.at`が`Assets.versioned`になっています。それに伴い。デフォルトで生成される`app/views/index.scala.html`も、2.3.9では

```
<link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/index.css")">
```

となっていたのが、2.4では

```
<link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/index.css")">
```

になっていました。


## Controllerなどがobjectからclassに

Play 2.3.9 では、デフォルトで生成される `app/controller/Application.scala`は

```scala
object Application extends controller {
...
```

のようになっていましたが、2.4 からは、

```scala
class Application extends controller {
...
```

となっていました。classとobjectが変わっているだけで、動作自体はあまり変わっていないように感じました。


## ScalikeJDBC関連

ScalikeJDBCもPlay 2.4に対応していたのですが、変わったっぽい箇所を2つほど見つけました。

* build.sbt の書き方
* conf/play.plugins について


### build.sbt の書き方について

Play 2.4 では、`build.sbt`について、`libraryDependencies`に以下を追加する必要があります。

```
"org.scalikejdbc" %% "scalikejdbc" % "2.2.6",
"org.scalikejdbc" %% "scalikejdbc-config" % "2.2.6",
"org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.4.+",
evolutions
```

* まず、scalikejdbc-play-initializer は Play 2.4 特有っぽい？
* evolutions を使う場合、librariDependencies に明記する必要があるっぽいです。


### conf/play.plugins

Play 2.3.9 では、`conf/play.plugins`を用意していたが、Play 2.4 では不要（というかあったらうまく動かない）っぽです。
vagrantの導入と構築

## vagrantの導入から環境構築まで2部構成になっています
1部 : vagrantの導入 ← いまここ
2部 : [vagrant内のCentOS7セットアップ](http://qiita.com/yoshis2/items/2c8f450e61456e2df107 "vagrant内のCentOS7セットアップ")

vagrantの環境構築をシンプルに説明するため細かな説明は省いています。

## VirtualBoxをインストール
Vagrantは仮想環境の上で実行されるソフトのため実行するためには
仮想環境を用意する必要があります。

今回入れる仮想環境はVirtualBoxです。

以下からダウンロードインストールしてください
https://www.virtualbox.org/wiki/Downloads


## 1. vagrant をインストール
https://www.vagrantup.com/downloads.html


## 1-1. VagrantBoxの用意されているHP
http://www.vagrantbox.es/

### 1-2. コマンドライン
centos7を導入する(Boxを取得)


> $ vagrant box add centos7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box


centos7がはボックスに入っているか確認する

> $ vagrant box list

## 2. これらの項目はWindowsかMACを選択して進んでください
### 2-1. Windwos
インストールしたいディレクトリの作成と移動
> $ cd /
> $ mkdir vagrant
> $ cd vagrant

> $ mkdir centos7
> $ cd centos7

これで以下のパスでインストールすることになる
C:\vagrant\centos7


### 2-2. MAC
※ 共有ファイルはroot権限でないと利用できないのでルート権限に変更

> $ su

password:

> $ cd /Users/作成したユーザ名
> $ mkdir vagrant
> $ cd vagrant

> $ mkdir centos7
> $ cd vagrant7

これで以下のパスでインストールすることになる
/Users/作成したユーザ名/vagrant/centos7


## 3. 仮想マシンをインストール
> $ vagrant init centos7

インストールが終わると以下のファイルが作成される。
Vagrantfile


### 3-1. Vagrantfileの変更
以下の部分にコメントが入っているのでコメントを削除する

```
config.vm.network :private_network, ip: "192.168.33.10"
```

### 3-2. VagrantのCentOS7を起動
> $ vagrant up

### 3-3. SSHを起動する
> $ vagrant ssh

### 3-4. fileZillaでの接続
ホスト：127.0.0.1
ポート：2222
ID  ：root
PW  ：vagrant

## 4. 共有ファイルの設定とマウント
> $ sudo ln -fs /vagrant /var/www/html


####  続きはこちらへ : [vagrantサーバの構築（CentOS7)](http://qiita.com/yoshis2/items/2c8f450e61456e2df107 "vagrantサーバの構築（CentOS7)")


***
## 5.Vagrant 一般コマンド
#### ボックスのリスト表示
vagrant box list

#### ボックスの初期化
vagrant init

#### 立ち上げ
vagrant up

#### 現状確認
vagrant status

#### 一時停止
vagrant suspend

#### suspendからの復帰
vagrant resume

#### 再起動
vagrant reload

#### シャットダウン
vagrant halt

#### 自分のBoxを作れます。boxを共有できたり。
vagrant package

#### ボックスの追加
vagrant box add

#### 消去
vagrant destroy

#### Vagrant Box を削除する
vagrant box remove


#### 続きはこちらへ : [vagrantサーバの構築（CentOS7)](http://qiita.com/yoshis2/items/2c8f450e61456e2df107 "vagrantサーバの構築（CentOS7)")
古いCentOS iso ファイルの入手

古いCentOS iso ファイルの入手は、公式サイトではできなかったら、
次のサイトがあった。
http://www.linuxmaster.jp/linux_blog/2010/03/centos.html

こちらから、たどって、
http://archive.kernel.org/centos-vault/
で、ダウンロードできた。

CentOS 5.5 を検証用に構築する必要があったが、インストールイメージファイルがなく、困ったため上記にたどりついた。

ちなみに、CentOS 5.5 では、LiveCDからは、どうしてかHDDにインストールできず、
CentOS-5.5-x86_64-bin-1of8.iso 
などをダウンロードした。
PukiWiki Advance v1.0.3 を使っていたら左上のアイコンが表示されなくなってしまった話

`グループ名/記事名` のように記事名をフォルダ分けすると、defaultスキンの左上のアイコン（＋右下のバナー）が表示されなくなってしまいました。

![左上のPukiWiki Advアイコンが表示されていない](https://qiita-image-store.s3.amazonaws.com/0/78152/fd1b7070-6dbc-01c5-f4a7-0ce95d20f60d.png)

環境は Debian 6.0.10 、PukiWiki Advance のバージョンは v1.0.3 です。

書き出されたHTMLを見てみるとどうやら`http://mydomain.com/グループ名/記事名`というURLから相対的に`image/`ディレクトリをたどったせいで、`http://mydomain.com/image/`ではなく`http://mydomain.com/グループ名/image/`にアクセスしてしまっていることが問題のようです。`IMAGE_DIR`と`IMAGE_URI`がこのパスになっているようなので、`wiki-data/pukiwiki.ini.php`を開いて、

```php:wiki-data/pukiwiki.ini.php（変更前）
// Static image files
defined('IMAGE_DIR')    or define('IMAGE_DIR', WWW_HOME . 'image/');
defined('IMAGE_URI')    or define('IMAGE_URI',  COMMON_URI . 'image/');
```
これを

```php:wiki-data/pukiwiki.ini.php（変更後）
// Static image files
defined('IMAGE_DIR')    or define('IMAGE_DIR', '/image/');
defined('IMAGE_URI')    or define('IMAGE_URI',  '/image/');
```
と書き換えてやればいいんじゃないかと思います。`/image/`というのは**ルート相対パス**という名前らしいです。（参考：[ルート相対パス！！？ \| TM Life](http://tmlife.net/web/root-path.html)）

もし`http://mydomain.com/wiki/`のようなサブディレクトリにwikiをインストールした場合は、`/image/`ではなく`/wiki/image/`に書き換えればうまく行きそうな気がします。（もっとも、`WWW_HOME`と`COMMON_URL`を埋めたほうが良いような気がしてきましたが。これらは、`webroot/index.php`で定義されています。今回はこれらが空文字だったのでうまくいきました。）

あと、これとは関係無いですが、キャッシュのせいで変更が反映されなかったりするので、URLの最後に`?hoge`のような適当な文字を付けてテストするといいかもしれません。どちらかというと、主にこれのせいでハマりました。

サーバー難しい・・・
CoffeeScriptで、makefileみたいなファイルの更新日時比較

#makefile
やっぱし更新日時比較したいよね。

というわけで、ちょっと書いた。とりあえず、絶賛丸一日研修講師やっとるので、やっつけですんまへん。

```coffeescript:mtime.coffee
fs = require('fs')

needUpdateSync = (targetfile, objectfile_arr, missing_is_ok = false) ->
  if not fs.existsSync targetfile
    for objectfile in objectfile_arr
      if not fs.existsSync objectfile
        if missing_is_ok
          continue
        else
          return 'missing both'
    return 'update'
  targetstat = fs.statSync targetfile
  for objectfile in objectfile_arr
    if not fs.existsSync objectfile
      if missing_is_ok
        continue
      else
        return 'missing object'
    objectstat = fs.statSync objectfile
    if targetstat.mtime < objectstat.mtime
      return 'update'
  return 'nothanks'

missingFilesSync = (objectfile_arr) ->
  arr = []
  for objectfile in objectfile_arr
    if not fs.existsSync objectfile
      arr.push objectfile
  return arr

#how to use

console.log needUpdateSync('target.file',['object1.file', 'object2.file'])
```

これこそ非同期で書け、って感じ？　並行実行効くもんね。後で気が向いたら書き直す。
指定したspec.rbだけserverspecを実行したい

# Diff

```
# Rakefile
+  targets.each do |target|
+    Dir.glob("./spec/*/*_spec.rb").each do |spec|
+      original_target = target == "_default" ? target[1..-1] : target
+      desc "Run serverspec tests to #{original_target} (#{spec.split('/').last})"
+      RSpec::Core::RakeTask.new(spec.to_sym) do |t|
+        ENV['TARGET_HOST'] = original_target
+        t.pattern = "spec/#{original_target}/#{spec.split('/').last}"
+      end
+    end
+  end
```


# Check
```
bundle exec rake -T
```
enchant.jsのラベルを自動改行する方法

# はじめに
enchant.jsで文字を表示するにはlabelを使いますが、下図のように自動改行をさせることができます。

![スクリーンショット 2015-06-02 22.15.06.png](https://qiita-image-store.s3.amazonaws.com/0/26979/b6d5bc3b-f8a8-dbd1-f61d-747b134e2483.png)

# labelを自動改行するには
labelにwidthを設定すると、設定した値以上になると自動的に折り返してくれます。

```js:sample
var messageLabel = new Label('');
messageLabel.width = 260;//widthを指定する！！
that.addChild(messageLabel);
```

ちなみにモバイルでは上記パラメータを指定しても、指定したよりも大きくなったり、小さくなったりします。ぱっと見たところ、フォントの横幅が正確にとれてない？

# 最後に
この方法は自作ゲームのシナリオモードを作る際に発見しました。よかったら、こちらも見てあげて下さい。

公開サイト
http://gbraver.herokuapp.com

github
https://github.com/kaidouji85/gbraver
jQuery Callbacksの基本的な使い方2

#Callbacksオブジェクト生成時のオプション

Callbacksオブジェクトは生成時に下記のオプションを指定可能です。これらは複数組み合わせて使用することが可能です。

・once　・・・　一度だけしかfireできない
・memory　・・・　あとから追加した関数に対しても、fireを実行する
・unique　・・・　同じメソッドを複数回登録できないようにする
・stopOnFalse　・・・実行した関数の戻り値がfalseの場合、以降の処理を行わない

実際の動きをみてみましょう

##onceオプション

````js
function hello(){
    console.log("Hello");
}
var callback=$.Callbacks("once");
callback.add(hello);
callback.fire();
callback.fire();

実行結果
Hello
````
onceオプションを指定しているので、fireメソッドを2回実行しても、1回しか実行されません。

##memoryオプション

````js
function hello(){
    console.log("Hello");
}
function world(){
    console.log("World");
}
 
var callback=$.Callbacks("memory");
callback.add(hello);
callback.fire();
callback.add(world);

実行結果
Hello
World
````

fire後にaddした関数も実行されました。
このように、memoryオプションを指定すると、あとから追加した関数に対しても、それ以前に実行したfireが適用されます。
これはonceを同時に指定した場合も同様の動きをします。(1回目のfireは後からaddした関数に対しても実行される）


##uniqueオプション

````js
function hello(){
    console.log("Hello");
}
function world(){
    console.log("World");
}
 
var callback=$.Callbacks("unique");
callback.add(hello);
callback.add(hello);
callback.add(world);
callback.fire();

実行結果
Hello
World
````
hello関数を2回登録しましたが、1回しか実行されませんでした。
uniqueオプションを指定すると、同じ関数オブジェクトを追加しても、重複して実行されることはありません。

##stopOnFalseオプション

````js
function hello(){
    console.log("Hello");
    return false;
}
function world(){
    console.log("World");
}
 
var callback=$.Callbacks("stopOnFalse");
callback.add(hello);
callback.add(world);
callback.fire();

実行結果
Hello
````

最初に追加した関数しか実行されませんでした。
このように、@stopOnFalse`を指定した場合、追加した関数がfalse返すと後続の処理が行われません。
ちなみにnullやundefind , 0 , -1 等が返った場合は後続の処理が実行されます。
あくまでfalseが返った場合のみに有効になるオプションです。
CALayer による枠線表示を少し掘り下げる

UIView に枠線をつけるならCALayer のsetBorder メソッドを呼ぶのが一般的。

その際の枠線がどのように付けられるかを軽く調べたので備忘録代わりに記す。


![iOS Simulator Screen Shot 2015.06.02 12.37.11.png](https://qiita-image-store.s3.amazonaws.com/0/37053/d4adc1c6-385b-bcde-d1b4-95cfe1a171e0.png)


上記の赤いビューに対して下記のように枠線を貼る。

    
```objc:test
[[view layer]setBorderColor:[[UIColor greenColor]CGColor]];
[[view layer]setBorderWidth:20.0];
    
```

するとこのように、対象のビューの内側に枠線が表示される。
![iOS Simulator Screen Shot 2015.06.02 12.37.05.png](https://qiita-image-store.s3.amazonaws.com/0/37053/31004ec9-d46d-34b0-2a21-db8e0e172170.png)

比較


![iOS Simulator Screen Shot 2015.06.02 12.37.11.png](https://qiita-image-store.s3.amazonaws.com/0/37053/d4adc1c6-385b-bcde-d1b4-95cfe1a171e0.png) ![iOS Simulator Screen Shot 2015.06.02 12.37.05.png](https://qiita-image-store.s3.amazonaws.com/0/37053/31004ec9-d46d-34b0-2a21-db8e0e172170.png)
Unity 簡単に外部画像をSpineのモデルにくっつけるには 

# Spineとは
[UnityでSpineを扱う際に覚えておきたいTIPS](http://qiita.com/kuuki_yomenaio/items/13432e5d912b6b62abdf)
を書いた際に書くの忘れてました。

[Spine](http://ja.esotericsoftware.com/)とは2Dスケルトンアニメーションを作成するツールの事です。
cocos2d-x、Unityなど人気のゲームエンジン各種に対応しており、
軽量かつ軽快な動作をさせることができるので、
最近のスマホゲームで見かける事が多くなりました。
情報がまだまだ少ないのが難点です。

# 外部画像をSpineのモデルにくっつける
剣とか盾とか鎧とか画像で別に作っておいて、
それとは別にアニメーションする素体のようなものを用意しておいて、
部位を指定して、テキトーに画像をくっつけられたらいいのに！
って思いません？

出来ます。Spineなら。

## SpriteAttacher
SpriteAttacherを使用すると部位を指定して、
外部の画像を簡単に付与することが出来ます。

#### 1.Spine SkeletonAnimationを用意する
ここは何でもOKです。動的に作ってもよし、prefabでもHierarchy内に直接Createしてもよし。

#### 2.そのオブジェクトにSpriteAttacherをAdd Componentする

![スクリーンショット 2015-06-02 21.24.05.png](https://qiita-image-store.s3.amazonaws.com/0/26453/8ab4b5cd-e560-e2c1-b913-9796eea720a9.png)

この時注意する事として、
SkeletonDataAssetが入っていないComponentにAddすると、
エラーが出ます。

![スクリーンショット 2015-06-02 21.25.24.png](https://qiita-image-store.s3.amazonaws.com/0/26453/49af8ac0-8a53-e2c2-255b-0b5250c4aae8.png)

#### 3.画像をSpriteにセットし、配置したい部位(Slot)を設定します。
配置した画像はこれ
![piece_01.png](https://qiita-image-store.s3.amazonaws.com/0/26453/9aa1b799-cadb-2647-dd91-bf221afb3c2b.png)

###### Slotって？
![スクリーンショット 2015-06-02 21.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/26453/b0424b8d-d797-89a8-bcd6-afe673675cc0.png)

Spineデータ上のこの丸いアイコンの部分をSlotと呼びます。
Slotとは、ユーザーが任意で付けることが出来る部位のことです。

Slot(x 1) -> Skin(x N) -> Image(x N)

のようにSlotの中に複数のSkinや画像を持つことが可能です。

今回はright handを設定。

![スクリーンショット 2015-06-02 21.47.35.png](https://qiita-image-store.s3.amazonaws.com/0/26453/89f30654-f259-1cc3-f26c-41e0e2ae7710.png)

#### 4. 実行
![goblin_attach_img.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/26453/0c78dc59-7c58-4176-737c-a2cb695501b3.gif)

(なんかやたら速くなってしまった)

こんな風になります。簡単ですね。
Spineのアニメーションに付随して動きます。
盾は元々持っているので、丁度その間に入るような形になります。

TIPSに入れようと思ったら思ったよりも長くなってしまったので、別にしました。

次はSpriteAttacherを使わない方法をご紹介する予定。
(やっとコードが書ける!!)
Ethereum のブロックチェイン、DBが壊れた時の修復方法

以下に移行しました<br><a href="http://block-chain.jp/tech/restore-broken-blockchain-db/" title="Ethereum のブロックチェイン、DBが壊れた時の修復方法">Ethereum のブロックチェイン、DBが壊れた時の修復方法</a>
Callbacksの基本的な使い方1

ずいぶん前に自分のブログに書いた記事です。

#Calbacksオブジェクト生成

````js
var callback=$.Callbacks();
````

#メソッドの追加と実行

````js
function hello(){
    console.log("Hello");
}
var callback=$.Callbacks();
callback.add(hello);
callback.fire();

実行結果
hello
````
このように関数をaddメソッドでcallbackオブジェクトに追加し、fireで実行するというのが基本的な使い方です。
fireは何回でも実行できます。
では、メソッドを複数追加するとどうなるでしょうか？

````js
function hello(){
    console.log("Hello");
}
function world(){
    console.log("World");
}
 
var callback=$.Callbacks();
callback.add(hello);
callback.add(world);
callback.fire();

実行結果
Hello
World
````

追加したメソッドが両方実行されました。
メソッドに引数を渡したい場合はどうすればよいでしょうか？

#追加したメソッドに引数を渡して実行する

````js
function hello(message1,message2){
    console.log(message1+message2);
}
 
var callback=$.Callbacks();
callback.add(hello);
callback.fireWith(window,["Hello","World"]);

実行結果
HelloWorld
````

このようにfireWithを使うと引数を渡して実行することができます。
第一引数にはコンテキスト(呼び出した関数のthisになる値)を指定します。ここではwindowオブジェクトを渡していますので、メソッドhello内でのthisは、windowオブジェクトを参照することになります。
第二引数には配列を渡します。これが指定した関数の引数になります。

#Callbacksオブジェクトを無効にする
Callbacksオブジェクトを無効にするには、disableメソッドを使います

````js
function hello(){
    console.log("hello");
}
 
var callback=$.Callbacks();
callback.disable();
callback.add(hello);
callback.fire();

````

これを実行しても何も起こりません。エラーにもなりません。
disableした後でも、addやfireを実行してもエラーにはなりませんが、何も起こりません。
一度disableしたCallbacksオブジェクトを、再びアクティブにするメソッドはありません。
再度Callbacksオブジェクトを生成する必要があります。

#メソッドの実行(を無効にする
メソッドの実行(fire,fireWith)を無効にするには、lockメソッドを使います

````js
function hello(){
    console.log("hello");
}
 
var callback=$.Callbacks();
callback.add(hello);
callback.fire();
callback.lock();
callback.fire();

実行結果
hello
````

lockを実行することで、lock後のfireが無効になっています。(lockしなければHelloが2回表示される)
別の記事で詳しく解説しますが、Callbacksオブジェクト生成時にmemory オプションを指定すると、lock後でもaddした関数は実行されます。

以上、基本的な使い方を説明しました。
Intellij IDEA でのGo言語開発環境セットアップ


IDEが流行りと聞きつけ、人気取りのためにIntellijへGo開発環境をつくりました。

（急いで公開なので、わりと後半雑です。。。ごめんなさい）

# 前提環境
他の環境で動かなかったらゴメンナサイ。

* Mac Yosemite
* go version go1.4.2 darwin/amd64 (`brew install go`)

# Go基本設定

Goの基本的なインストールは済んでいるものとします。
※Goのインストール、GOPATH, GOROOTの設定。他の記事などをご参考に！！

# Go開発環境のためのIntellij package

## Intellij Pluginインストール

[go-lang-idea-plugin](https://github.com/go-lang-plugin-org/go-lang-idea-plugin)
README.md の通りに進めていきます。

* メニューバーの、`intellij IDEA` >  `Preferences` > `Plugins` を選ぶ
* `Browse repositories` をクリックする
* `Manage repositories` をクリックする
* `+`を押してレポジトリURLを追加（安定度 alpha > nightly)
	* alpha: https://plugins.jetbrains.com/plugins/alpha/5047
	* nightly: https://plugins.jetbrains.com/plugins/nightly/5047
* `OK` をクリックする
* 検索窓で`Go`と入れると、プラグインがでてきます。右ウィンドウのボタンからインストールしましょう

## 設定

### SDK設定

* メニューバーの、`File` >  `Project Structure` > `Platform Settings`の`SDKs` を選ぶ
* `+`ボタンを押して、`Go` のSDKを追加しましょう。
* `Go SDK home path`
	* `$GOROOT` のフルパスを追加　例： `/usr/local/Cellar/go/1.4.2/libexec`
* `Classpath`
	* `$GOROOT` のフルパスを追加
* `Sourcepath`
	* `$GOROOT/src` のフルパスを追加
	* `$GOPATH/src` のフルパスを追加
* `OK` をクリックする

### Project設定

* メニューバーの、`File` >  `Project Structure` > `Project Settings`の`Project` を選ぶ
* `Project SDK` に先ほど作成したSDKを選択してください
* `OK` をクリックする

## goimpors & golint 設定

何はともあれ、保存時にgoimports & Literは動かしたい
でもプラグインがないのでgoのコマンドツールのお世話になります。

### ツールをインストール

```bash
$ go get -v golang.org/x/tools/cmd/goimports # -> gofmtの拡張コマンド
$ go get -v github.com/golang/lint/golint # -> linter
```

### shell作成
`/usr/local/bin` 辺りに、goimports & golint を動かすシェルを作ります

```sh:goimp.sh
#!/bin/sh

if [[ $1 == *.go ]]
then
    /usr/local/bin/goimports -w $1
fi
```

```sh:golint.sh
#!/bin/sh

if [[ $1 == *.go ]]
then
    /usr/local/bin/golint $1
fi
```

実行権限をつけるのをお忘れずに！

```bash
$ chmod 755 /usr/local/bin/goimp.sh
$ chmod 755 /usr/local/bin/golint.sh
```


### IntellijのExternal Toolsに追加登録

![Screen Shot 2015-06-02 at 21.51.17.png](https://qiita-image-store.s3.amazonaws.com/0/4239/f6863be1-7b22-961f-72a6-cb803a4908d9.png "Screen Shot 2015-06-02 at 21.51.17.png")

![Screen Shot 2015-06-02 at 21.51.25.png](https://qiita-image-store.s3.amazonaws.com/0/4239/d411500b-356f-70aa-76a6-e5c398b9ccee.png "Screen Shot 2015-06-02 at 21.51.25.png")

![Screen Shot 2015-06-02 at 21.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/4239/74c2ac47-5eda-5f1c-92b9-017e1499ad47.png "Screen Shot 2015-06-02 at 21.51.34.png")

### マクロを作成

1. `メニュー > Edit > Macros > Start Macro Recording` でマクロの保存を開始する
    2. `メニュー > Tools > format > goimports` 選択
    3. `メニュー > Tools > lint > golint` 選択
    4. `メニュー > File > Save all` 選択
5. `メニュー > Edit > Macros > Stop Macro Recording` でマクロ保存を停止する。
6. このマクロに`goimports_golint_saveall`という名前をつける。

### マクロをKeymapへ割り当て
そのマクロの実行をKeymapで `command + s` に割り当てると完成です。

* メニューバーの、`intellij IDEA` >  `Preferences` > `Keymap` を選ぶ
* `Macros > goimports_golint_saveall` へ`command + s` を割り当てる

# 最後に
これでうまく動かない場合はぜひコメ欄で教えて下さい。さらの状態のMacでトライしておりませんで。。
図形内の文字を置換するExcelマクロ

## やりたいこと
Excelってセル内は置換／検索できるけど、図形内の文字は置換／検索できない。そこで、図形内の文字を置換するマクロを作成した。

## コード
下記のコードを、標準モジュールにコピペすれば使えます。

```vbnet:Module1
Option Explicit

Public Function RepText(ByRef findStr As String, ByRef repStr As String)

    Dim sh As Shape
    
    For Each sh In ActiveSheet.Shapes
        If sh.TextFrame2.HasText = msoTrue Then
            sh.TextFrame2.TextRange.Text = Replace(sh.TextFrame2.TextRange.Text, findStr, repStr)
        End If
    Next

End Function
```

## 使い方

Excelシートから使う場合だと、下記のようにセルに記入して、エンターを押せば、「りんご」と「みかん」というテキストが置換されます。

**置換前**
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/80231/7b8032e1-5665-8bb6-9488-bb5294811598.png)

**置換後**
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/80231/505c005d-b2da-c650-ea16-39dc821f20a5.png)

## 戻り値について
この関数は戻り値がないので、成功すると0が表示されるようです。マクロ実行後は消してもよいです。
LogjamとDHEにまつわる問題

少し前に、Logjam脆弱性が話題となりましたが、「ついでに」（という言い方も変かもしれませんが）DHEにまつわる他の問題も掘り出されてしまった感があり、ちょっとややこしいので整理しておきましょう。

# まず、DHEとは
DHEとは、盗聴の危険がある通信経路で安全に暗号鍵を共有するための方式です。RSA暗号と同様に[^1]、離散対数の困難性（ある数gをx乗して、それを別な数pで割った余りは簡単に計算できるけど、gとpと余りがわかってもxは簡単に計算できない）ことを元にしています。

1. 通信相手（アリスとボブ）の間で、$g$と$p$を共有します。
2. アリスとボブそれぞれがランダムに値（$a$と$b$とします）を選びます。
3. それぞれが $g^a \bmod p=A$、$g^b \bmod p=B$ を求めて、相手に知らせます。
4. アリスとボブは、それぞれ相手からもらった値を自分の値だけ累乗して、余りを取ります。$B^a \bmod p = A^b \bmod p$ なので、二人は同じ値を共有できます。
5. 通信路に流れた$g$、$p$、$A$、$B$の4つの値から二人が共有した値を計算する簡単な方法はありません。

# 3つの問題点
Logjamもあって話題となっているDHEの3つの問題点は、以下のような感じです。

1. 輸出暗号を受け付けるサーバー・クライアントでは、512ビットまでDHEの強度が落とされてしまう（これがLogjam）
2. 1024ビットなど、DHEの強度が不十分なサーバが多い
3. 多くのサーバが、共通の素数を使っている

## Logjam
その昔、アメリカ合衆国は軍事上の理由から、暗号技術に輸出規制をかけていて、許可なしに扱えるのが共通鍵暗号で40ビット、RSAやDHEでは512ビットが上限となっていました。そのため、SSLの規格内でも512ビットのDHE鍵交換を行うような系が組まれました。

21世紀に至って規制は緩和されたのですが、当時の輸出用暗号を使えるままの設定になっていたサーバが多数存在しました。そして、現代の技術にかかれば、512ビットのDHEはクラウドを借りれば100ドルも払わずに、半日程度で解読できる程度の強度しかなくなってしまっていました。うまく512ビットで鍵交換させるようにダウングレード攻撃をしかければ、解読できてしまうというわけです。

## DHEの強度
Apache 2.2では、DHEの強度は1024ビットで固定となっています。DHEは原理的にRSAと共通ですが、現代のRSAでは最低でも2048ビットの暗号が使われ、1024ビットでは強度が不十分ということになっています。同じ鍵をずっと使うRSAと、その場で乱数を作るDHEで条件は違いますが、もはや1024ビットでは、国家機関にかかれば解読可能と見込まれています。

## 共通の素数
昔は設定のたびに素数を生成するのが負荷だったこともあって、サーバソフトウェアで固定の素数を使うような実装となっていることがあります。この1つの素数について攻略できれば、多くのサーバの暗号化を無力化できることになってしまいます。

# 対策
まずは本来のLogjamですが、輸出用暗号を**無効**にしましょう。いまやそんなものしか使えないクライアントはほぼ皆無（仮にあったとしても、高度化したWebに対応はまずできない）ですから、デメリットは無視できます。

2番目3番目については、設定を変えておきましょう。Apacheであれば2.4以降だと、DHパラメーターファイルを指定可能ですので、独自の素数を2048ビット以上で生成して指定しましょう。

なお、楕円曲線を使ったECDHEというものがあって、こちらでは256ビット〜521ビットと短いパラメーター長で同等の暗号強度となり、計算はずっと速い方式です。Android 2系列やWindows XPといった古い環境以外ではIEでも対応しているので、ECDHEが使える環境ならDHEを止めてしまうのも1つの選択肢かもしれません。


[^1]: というより、DHのほうがRSAより先に考案されている
How to fix "Fatal: blockchain db err: resource temporarily unavailable"

以下に移行しました<br><a href="http://block-chain.jp/tech/how-to-fix-fatal-blockchain-db-err-resource-temporarily-unavailable/" title="How to fix &quot;Fatal: blockchain db err: resource temporarily unavailable&quot;">How to fix &quot;Fatal: blockchain db err: resource temporarily unavailable&quot;</a>
FireFoxでUAを偽装する～user-agent-switcher~


# 前提
Chromeは開発者ツールからUAを変更できますが、FireFoxではアドオンを導入する必要があります。
PC/SPサイトでURLが変わるパターンであれば、(表示上は置いといて）コンソールエラー等はFireFox/Chromeどちらでも対応が可能です。

表示上で確認したい場合は、基本的に確認をChromeで行えばいいのですがFireFoxのプラグインのみ対応している外部サービスで値が正しくセットされているかの確認を一緒に行おうとするとChromeでは行うことができません。
非レスポンシブデザインで、PC/SPでURLが同じパターンのサイトではUAを偽装してSP版のページを表示させた上で値の確認が必要です。

# 導入アドオン
FireFoxのアドオンを探せばいろいろとありますが、今回は[user-agent-switcher](https://addons.mozilla.org/ja/firefox/addon/user-agent-switcher/ "user-agent-swithcer")
を紹介します。

# インストール
上記URLからFirefox Add-onsへ行き、Add to Firefoxでアドオンを追加すればOK
![1.1.JPG](https://qiita-image-store.s3.amazonaws.com/1643/57634/0b3aa174-7edb-7092-37bf-d5ec2965afc2.jpeg)
インストール時に下のようなアラートがでた場合5秒ほど待ってからインストールをクリックすればOK
![inst.JPG](https://qiita-image-store.s3.amazonaws.com/1643/57634/88b4912f-e531-62ff-aeec-f6dd3a0db035.jpeg)

# 使い方
![tool.JPG](https://qiita-image-store.s3.amazonaws.com/1643/57634/8fe00c42-76d4-e315-2443-10938bc1b617.jpeg)
ツール→Default User Agentから　変更したいUAを選択し、サイトをリロードしなおせばOK

# UAを追加する
## ファイルアップロードで対応する。
ツール→Default User Agent→User Agent Switcher→OptionsでOptionを開き
ImportからXMLをアップロードする。
![import.JPG](https://qiita-image-store.s3.amazonaws.com/1643/57634/85a32c54-6d27-8b95-16ff-054aafeaae7c.jpeg)

XMLは以下のGitからDLすると良い。
[Github:useragentswitcher](https://github.com/Garyuten/useragentswitcher)
作者は[我流天性　がらくた屋](http://blog.cgfm.jp/garyu/archives/2357)さん。
ありがとうございます。

## 手動で追加する

ツール→Default User Agent→Edit User Agentで New→New User Agentで UserAgentを追加すれば良い。
![hand.JPG](https://qiita-image-store.s3.amazonaws.com/1643/57634/3cfe0bf6-7f05-6f2a-92fa-794c947efa84.jpeg)

特殊なクローラにUA偽装するときなど使うと便利。
一般的なものは上記のXMLでほぼほぼ対応できるので使うことはあまりない。
【PHP】小数点以下まで出力する

sprintfとprintfとnumber_formatがある。
いずれも指定した小数点以下で四捨五入して出力する。

sprintfとprintfの違いは、sprintfはフォーマットされた値が戻り値。printfはフォーマットされた値を標準出力する。
画面に表示する場合はどちらを使っても同じ。変数に入れたい場合は、sprintfを使うと良い。

```
$num1 = 10;
$num2 = 1000.5;
$num3 = 0.456789;

echo sprintf('%.2f',$num1),PHP_EOL;
echo sprintf('%.2f',$num2),PHP_EOL;
echo sprintf('%.2f',$num3),PHP_EOL;
/*
10.00
1000.50
0.46
*/

printf('%.2f',$num1);echo PHP_EOL;
printf('%.2f',$num2);echo PHP_EOL;
printf('%.2f',$num3);echo PHP_EOL;
/*
10.00
1000.50
0.46
*/

echo number_format($num1,2),PHP_EOL;
echo number_format($num2,2),PHP_EOL;
echo number_format($num3,2),PHP_EOL;
/*
10.00
1,000.50
0.46
*/
```

number_formatは千ごとにカンマが入るので、オプションでカンマなしにすることもできる。

```php
//number_format(値,小数点何位まで,小数点の表示形式,千区切りの表示形式);
echo number_format($num1,2,null,'');
```
【CakePHP】SQLでcollate utf8_unicode_cを使う


MySQLで照合順序がutf8_general_ciのカラムに対して、utf8_unicode_ci のあいまい検索を行う場合は以下のようにする。

```mysql
select * from member where namae collate utf8_unicode_ci like '%hoge%';
```

Cakeで上記を実行した場合そのままではうまくいかなかったためメモ。


以下だとCakeで発行されるSQLの`name collate utf8_unicode_ci`にバッククオートがつくためエラーとなる。

```php:失敗例
$this->find('all',[
  'conditions'=>['name collate utf8_unicode_ci like'=>'%hoge%'
]);
```

正しくはこれ。
カッコでくくるか、バッククオートをつけることでカラムにのみバッククオートがつくようになる。

```php:成功例
$this->find('all',[
  'conditions'=>['(name) collate utf8_unicode_ci like'=>'%hoge%'
]);
```

```php:成功例
$this->find('all',[
  'conditions'=>['`name` collate utf8_unicode_ci like'=>'%hoge%'
]);
```
メモ：productFlavorsの組み合わせでapplicationId等を切り替えたいとき

productFlavorsの組み合わせでapplicationId, buildConfigField, resValueを切り替えたいときがあったのでその時のメモ。
バッドノウハウなので急場凌ぎの参考用。
たぶんAndroidのBuild Toolsのバージョンが変わると動かなくなる可能性が高い。

```groovy
    flavorDimensions "app", "environment"
    productFlavors {
        hoge { flavorDimension "app" }
        fuga { flavorDimension "app" }
        qa { flavorDimension "environment" }
        prod { flavorDimension "environment" }
    }

    android.applicationVariants.all { variant ->
        def flavorString = variant.getVariantData().getVariantConfiguration().getFlavorName()
        def mergedFlavour = variant.getVariantData().getVariantConfiguration().getMergedFlavor();

        if (flavorString.equalsIgnoreCase("hogeQa")) {
            variant.buildConfigField "String", "XXX_ID", "\"hogeQa\""
            variant.resValue "string", "xxxx", "hogeQa"
            mergedFlavour.applicationId = "net.cattaka.hoge.qa"
        }
        if (flavorString.equalsIgnoreCase("hogeProd")) {
            variant.buildConfigField "String", "XXX_ID", "\"hogeProd\""
            variant.resValue "string", "xxxx", "hogeProd"
            mergedFlavour.applicationId = "net.cattaka.hoge.prod"
        }
        if (flavorString.equalsIgnoreCase("fugaQa")) {
            variant.buildConfigField "String", "XXX_ID", "\"fugaQa\""
            variant.resValue "string", "xxxx", "fugaQa"
            mergedFlavour.applicationId = "net.cattaka.fuga.qa"
        }
        if (flavorString.equalsIgnoreCase("fugaProd")) {
            variant.buildConfigField "String", "XXX_ID", "\"fugaProd\""
            variant.resValue "string", "xxxx", "fugaProd"
            mergedFlavour.applicationId = "net.cattaka.fuga.prod"
        }
    }
```
定期決済額を変更する方法

ペイパルの定期支払決済額を変更する方法は2つあります。

1.
PayPal管理画面より手動で変更。[個人設定]-[定期支払いダッシュボード]から行えます。

2.
UpdateRecurringPaymentsProfile APIによりプログラムから変更。

以下PDFの143ページにAPIの詳細説明があります。
https://www.paypal.jp/uploadedFiles/wwwpaypaljp/Supporting_Content/jp/manual/PP_JP_NVPAPI_DeveloperGuide_JP.pdf

上記いずれも変更は定期決済のプロファイル１つずつに対しての変更方法です。
そのため、定期決済の数が多い場合には1.のPayPal管理画面からの手動での変更は大変だと思います。

あと、金額の変更は定期決済の決済予定日の72時間前までに行う必要があり、
180日ごとに20%までの増額という制限があります。

https://developer.paypal.com/docs/classic/express-checkout/integration-guide/ECRecurringPayments/
また上記いずれに方法でも変更は即時に反映されます。
BigQueryで擬似truncate・擬似delete

※注意：2015年5月末くらいに試した内容なので今後も使い続けられる方法かどうかはわかりません。

BigQueryにデータをインポートしたけど間違いがあったのでインポートし直したい、ということありますよね。
普通のDBみたいにtruncateやdeleteができれば楽なのですがBigQueryにはそのような機能は用意されていないようです。

しかし、クエリ実行のオプションを使うことで擬似truncateすることができたのでメモしておきます。

## 擬似truncate

まず、WebUIを開き、truncateしたいテーブルのselect文を書きます。この時、`LIMIT 0`を付けておきます。
そして右下の`Show Options`ボタンをクリックします。
![bq_truncate_01.png](https://qiita-image-store.s3.amazonaws.com/0/39644/14e17bb6-0bd3-4715-2789-23caf24d856a.png)


`Destination Table`に同じテーブルを指定し、`Write Preference`を`Overwrite table`にします。
データ量が多い場合は`Allow Large Results`のチェックも必要です。
![bq_truncate_02.png](https://qiita-image-store.s3.amazonaws.com/0/39644/1280d7e8-fb8c-e785-597f-3525eedbaac8.png)



これで0件のレコードでテーブルが上書きされます。（擬似truncate）

同様にして`WHERE`を付ければ擬似delete、`SELECT *`を変更することでカラム削除やカラム内容のスワップもできます。

## 注意点

* 擬似deleteをする場合は通常と条件が逆になります（残すレコードをSELECTする）
* `Destination Table`を間違えてもエラーにはならず、スキーマごとテーブルが上書きされます

本番データで間違えると悲惨なのでバックアップを忘れずに。
annotationでC#の修飾子の代替え

C#からJavaに移った際に、**virtual** とか **ref**、**out** などいくつか修飾子が無くて、実装者の意図を読み取りづらいなーなんて思った事がありました。
そういう言語仕様なのでしょうがないと言ってしまえばそうなのですが、
C#の方が後発の言語ですし、そちらにあるという事は、あった方が良いと感じる人が多かったんでしょ！！
ってことで、なんちゃって C# like な書き方ができるよう、以下のような Annotation を作っちゃいました。
本当は、コンパイルエラーまで出てくれればベストなのですが、さすがにそこまでは出来ません。 :sob: 
ですが、カプセル化をしつつも実装者の意図を明示的に使用者に伝えられるという点で、チーム開発を行っているような現場では有効なんじゃないかな～ :neutral_face: 


```java:virtual.java
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * The virtual keyword is used to modify a method, declaration and allow for it to be overridden in a derived class. For example, this method can be overridden by any class that inherits it.<br>
 *
 * virtual キーワードは、メソッドを修飾し、派生クラスでオーバーライドできるようにするために使用します。 たとえば、このメソッドは、このメソッドを継承するクラスでオーバーライドできます。
 *
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
@Documented
public @interface virtual {

}
```

`@Retention(RetentionPolicy.SOURCE)`にしているのでコンパイル時には破棄され、余計な注釈は残らないはず！！

![2.png](https://qiita-image-store.s3.amazonaws.com/0/53540/70ca4763-4c91-a2e7-b8aa-c9d84b53b6a8.png)

適用イメージはこんな感じ

```java:sample.java

@internal class Sample {
    /**
     * ほげほげ
     **/
    public @virtual hoge(@ref Parameter arg1, @out Parameter arg2) {
        ...
    }
}

```

![ドキュメントイメージ](https://qiita-image-store.s3.amazonaws.com/0/53540/99e8fb00-061f-7b81-018b-bd8f4af234ab.png)


今回は **virtual** を例にしましたが、他にも以下のようなものを用意いしておくと、開発者の意図せぬ使われ方を抑止する事ができるかもしれないです。
もちろんC#に固執する必要もないので、チーム内でルールを決めて annotation を作ってもよいですね。

| 修飾子 | 概要 |
|--------|--------|
| virtual| いわゆる pure virtual method である事を明示する修飾子。ovrride される事をある程度前提にクラス全体を設計しているとかなんとか |
|  ref |  引数を参照渡しをしている事を明示的に行う為の修飾子ですが、メソッド内部で引数の値が書き換えられる事があり得る場合に使うとか    |
|  out |   引数をメソッド内部で初期化して返すとか    |
|  internal  |   同一プロジェクトのみ使って良いとか    |
| threadSafe | スレッドセーフである事を明示的に示すとか|

思いつきでやってみたので、色々突っ込みどころがあるかと思いますがご容赦を。。。:weary:
Event、TaskオブジェクトのAccountId項目のまとめ

SalesforceのEvent、TaskオブジェクトのAccountIdの挙動についてまとめます。


#AccountIdに値が入る条件は以下になります。

| No | 名前(WhoId) | 関連先(WhatId) | AccountId |
|---:|:-----------:|:-------------:|:---------:|
| 1 | リード | - | - |
| 2 | 取引先責任者 | - | 取引先責任者の取引先ID |
| 3 | - | 取引先 | 取引先ID |
| 4 | 取引先責任者 | 取引先 | 取引先ID | 
| 5 | 取引先責任者 | 商談 | 取引先責任者の取引先ID | 
| 6 | - | 商談 | - |  

AccountIdに値が入る条件は、上記の表No.2～5になります。
例外として
__No.2のように名前(WhoId)が取引先責任者の場合は、AccountIdに取引先責任者の取引先IDが入るが、
No.4のように名前(WhoId)が取引先責任者でかつ、関連先に「取引先」が設定されている場合のみ
AccountIdは関連先の取引先IDによって上書きされます。__




※上記の条件以外にAccountIdが上書きされるケースがある場合は、ご指摘頂けると幸いです。
wordpress投稿者のアイコンを表示する

プラグイン
simple-local-avatarsというプラグインを導入すると、ユーザごとのアバター画像の設定が楽にできる。
http://wordpress.org/plugins/simple-local-avatars/

・php

<?php echo get_avatar(get_the_author_id(), 63); ?>

http://sterfield.co.jp/designer/%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%A2%E3%83%AB%E3%81%AB%E9%9A%9B%E3%81%97%E3%80%81wordpress%E3%81%A7%E3%81%A4%E3%81%BE%E3%81%A5%E3%81%84%E3%81%9F%E3%82%B3%E3%83%88.html
UIImageViewのhighlightedべんり

# 前置き

ゲージの表示をImageViewを並べて作っていたのだけど、画像の中身が２つのステートしか持たないのに、コードをみるといちいちUIImageViewの中身をUIImageで差し替えたりしていて無駄だなーと思った。

UIImageViewには、highlightedというプロパティがある。
コレを利用すると２ステートの表示が簡単に切り替えられて便利なのでメモ。

# サンプル

```swift
let imageView: UIImageView = UIImageView()
imageView.image = UIImage(named: "state1")
imageView.highlightedImage = UIImage(named: "state2")

imageView.highlighted = false // state1が表示される
imageView.highlighted = true  // state2が表示される
```

簡単！
Microsoft Edgeを事前検証する

7月29日に発売されるWindows10に導入される新ブラウザEdgeを事前検証するため、
Microsoft Edgeをインストールしてみた。

まずは、Windows Insider Programというのに参加する必要がある。
以下のURLから登録・ISOのダウンロードができます。
http://windows.microsoft.com/ja-jp/windows/preview-iso-update-1504

Windows10_InsiderPreview_x64_JA-JP_10074.isoをダウンロードする。

VMWareのGuest Operating Systemは、Windows8 x64を選択します。
一番カーネルが似ているらしいです。

だれのPCですか？
と聞かれた場合に、個人のPCとして
ログインアカウントの設定画面で”手順をスキップする”を選択する
のが楽にインストールできそう

検索から
Project Spartan
と入力して、Microsoft Edgeを立ち上げる事が出来る。

![Screenshot_from_2015-06-02 18:54:08.png](https://qiita-image-store.s3.amazonaws.com/0/56472/7f400c6f-6abe-949e-b3ec-c9d1e32a4df2.png)
AWSの注意点:S3編

いろいろ経験談をためていく予定です。

# クロスアカウントのお話

* アカウントAからBのS3にアップしたら、、、

S3にクロスアカウント設定して、AのEC2からBのS3にファイルをアップ。
で、BのS3からBのEC2上にそのファイルを落とそうとしたら。。。

> A client error (Forbidden) occurred when calling the HeadObject operation: Forbidden

(；・∀・)　＜ まじかｗ

いろいろ調べた結果、アップするときは下のオプションがいるようです。

```
--acl bucket-owner-full-control
```
\#他にもACLオプションがあるので、こちら参照
https://docs.aws.amazon.com/ja_jp/ElasticMapReduce/latest/DeveloperGuide/emr-s3-acls.html

ちなみに、IAMロールで回避は出来ないみたいです。
数コマンドで見る、ウェブページの差分画像

あんまりこのへんに興味なかったが、https://diff.io/ を見て面白そうだったので、こんな差分を手元の環境だけで作れないかを簡単に調べてみた。

tl;dr
-------

~~~~~~~~~~~~~bash:端末
# スクリーンショットを作成
$ cutycapt --url=http://www.yahoo.co.jp/ --out=a.png
$ cutycapt --url=http://www.yahoo.co.jp/ --out=b.png

# 差分画像を生成
$ compare a.png b.png diff.png

# 差分画像を開く
$ xdg-open diff.png
~~~~~~~~~~~~~


準備
--------

今回の環境は Ubuntu 14.04 だけど、同じコマンドは Mac でも簡単に用意できると思う。Windows はちょっと分からないです。

ウェブページを画像出力するコマンドと、画像の diff 取るコマンドをインストールしておく:

~~~~~~~~~~~~~bash:端末
$ sudo apt-get install cutycapt imagemagick
~~~~~~~~~~~~~

* `cutycapt` は URL と画像ファイル出力先を指定して、URL のページを画像出力してくれる。
* `imagemagick` は画像加工などを色々やってくれるコマンドがたくさん。


diff 画像を作る
---------------

yahoo.co.jp はリロードすると広告やランキングが変わったりするので試しに diff を取ってみる:

~~~~~~~~~~~~~bash:端末
# スクリーンショットを作成
$ cutycapt --url=http://www.yahoo.co.jp/ --out=a.png
$ cutycapt --url=http://www.yahoo.co.jp/ --out=b.png

# 差分画像を生成
$ compare a.png b.png diff.png

# 差分画像を開く
$ xdg-open diff.png
~~~~~~~~~~~~~

こうなる（diff.png の上部だけ切り抜き）:

<img alt="diff.png" src="https://qiita-image-store.s3.amazonaws.com/0/755/7a1041ca-e602-f91a-f34a-aef04744d085.png" width="500">

赤い部分が変化のあった部分。


`compare` が失敗する
---------------------

下記のようなエラーを吐いて失敗することがよくある:

~~~~~~~~~~~~~bash:端末
$ compare a.png b.png diff.png
compare.im6: image widths or heights differ `a.png' @ error/compare.c/CompareImageCommand/962.
~~~~~~~~~~~~~

これは `a.png` と `b.png` のサイズがそもそも違うせいで diff が取れていない:

~~~~~~~~~~~~~bash:端末
$ identify {a,b}.png
a.png PNG 950x2303 950x2303+0+0 8-bit DirectClass 1.087MB 0.000u 0:00.000
b.png[1] PNG 950x2225 950x2225+0+0 8-bit DirectClass 1.03MB 0.000u 0:00.000
~~~~~~~~~~~~~

違いの検知、という意味では、サイズが違うので検知できてるんだけど、どうしても差分を取りたい場合は `-extract` を使って小さい方に合わせるように diff を取るしかないかも:

~~~~~~~~~~~~~~~~bash:端末
$ compare -extract 950x2225+0+0 a.png b.png diff.png
~~~~~~~~~~~~~~~~

CI に組み込むなら、この赤い部分の面積や比率の導出としきい値超えた時の検知が必要になるんですかね。
都道府県<select> optgroup付き

よく使うので。

valueは都道府県IDをマスタ管理しても良いですが、住所全体の表示処理やエラー時復帰等の手間など考えると、選択肢とvalueが一致しているほうが便利です。

```html 
<select>
<optgroup label="関東">
<option value="東京都">東京都</option>
<option value="神奈川県">神奈川県</option>
<option value="千葉県">千葉県</option>
<option value="埼玉県">埼玉県</option>
<option value="茨城県">茨城県</option>
<option value="栃木県">栃木県</option>
<option value="群馬県">群馬県</option>
</optgroup>
<optgroup label="関西">
<option value="大阪府">大阪府</option>
<option value="京都府">京都府</option>
<option value="兵庫県">兵庫県</option>
<option value="滋賀県">滋賀県</option>
<option value="奈良県">奈良県</option>
<option value="和歌山県">和歌山県</option>
</optgroup>
<optgroup label="東海">
<option value="愛知県">愛知県</option>
<option value="岐阜県">岐阜県</option>
<option value="三重県">三重県</option>
<option value="静岡県">静岡県</option>
</optgroup>
<optgroup label="北海道・東北">
<option value="北海道">北海道</option>
<option value="青森県">青森県</option>
<option value="岩手県">岩手県</option>
<option value="秋田県">秋田県</option>
<option value="宮城県">宮城県</option>
<option value="山形県">山形県</option>
<option value="福島県">福島県</option>
</optgroup>
<optgroup label="甲信越・北陸">
<option value="長野県">長野県</option>
<option value="新潟県">新潟県</option>
<option value="山梨県">山梨県</option>
<option value="石川県">石川県</option>
<option value="富山県">富山県</option>
<option value="福井県">福井県</option>
</optgroup>
<optgroup label="中国・四国">
<option value="広島県">広島県</option>
<option value="岡山県">岡山県</option>
<option value="山口県">山口県</option>
<option value="鳥取県">鳥取県</option>
<option value="島根県">島根県</option>
<option value="愛媛県">愛媛県</option>
<option value="香川県">香川県</option>
<option value="徳島県">徳島県</option>
<option value="高知県">高知県</option>
</optgroup>
<optgroup label="九州・沖縄">
<option value="福岡県">福岡県</option>
<option value="長崎県">長崎県</option>
<option value="熊本県">熊本県</option>
<option value="佐賀県">佐賀県</option>
<option value="大分県">大分県</option>
<option value="宮崎県">宮崎県</option>
<option value="鹿児島県">鹿児島県</option>
<option value="沖縄県">沖縄県</option>
</optgroup>
</select>
```
Macでのプログラミングを加速する、アプリ/ウィンドウ/タブ切り替えショートカットキー

# Macでのプログラミングを加速する、アプリ/ウィンドウ/タブ切り替えショートカットキー

Macでプログラミングしてる方、ショートカットキーの使い心地はいかがですか？

開発作業でMacを使うようになったのですが、キーボードでのアプリ/ウィンドウ切り替え時の挙動がWindowsと違っているのにしばらく慣れませんでした。

ようやくしっくり来るようになったので、使えるショートカットキーをまとめたいと思います。

#### 環境
 * OS X Yosemite (10.10.3)
 * MacBook Air (11-inch, Late 2010)

#### 変更
 * 2015/6/3 : Mission Controlを追記しました。

## アプリ切り替え

### `⌘ + tab`

**起動済みのアプリから、アクティブなアプリを切り替える。**

普通ですね。

### `ctrl + space`

**Spotlight検索を起動する。**

Spotlightはローカルマシン上の検索ツールで、キーワードにヒットするアプリやドキュメントを検索できます。

コレが非常に便利で、アプリ名の一部を入力してenterキー押しちゃえば、キーボード操作のみでアプリ起動が出来ます。（すでに起動している場合、アプリ切り替えと同様な動作）
![Spotlight.png](https://qiita-image-store.s3.amazonaws.com/0/64812/780e5682-d33b-d52f-6dd9-16e855b6a5e6.png "Spotlight.png")

アプリをたくさん起動していて`⌘ + tab`で選ぶのが面倒な場合、こちらでアクティブなアプリを切り替えるのもありです。

私はトラックパッドのスクロール設定をマウスの着脱とともに変えるのですが、この設定アプレットの起動も、Spotlightからだと楽ですね。
![trackpad.png](https://qiita-image-store.s3.amazonaws.com/0/64812/ed3d954f-1163-9642-b4fb-da003bb04ada.png "trackpad.png")

## ウィンドウ切り替え
Macでは、同一アプリ内でウィンドウを切り替えるのと、アプリ自体を切り替えるのが別操作なんですね。当初は慣れませんでした。

Windowsと同じ挙動にするツールは色々見つかりますが、私は郷に入っては郷に従え方式で、アプリなしで操作してます。

### `⌘ + fn + F1`

 **同一アプリ内でウィンドウを切り替える。**

同様の操作をアプリ固有でサポートしている場合がありますが、キーは特に統一されているわけではありません。
例↓

 * MacVim : `⌘ + [`, `⌘ + ]`
 * mi : `⌘ + ^`

これらのアプリも`⌘ + fn + F1`が効くので、私は`⌘ + fn + F1`で統一してます。

### `F3`

**Mission Controlを起動する**

起動済みのアプリをサムネイル表示して並べてくれます。マウス or タッチパッドで、アクティブにしたいアプリを選べます。

ウィンドウを複数起動したアプリの場合、何気にウィンドウ単位で選べるので便利ですね。

試してみた限り、キーボード操作だけでは切り替え操作を完結できません。まあマウス使っても死ぬわけじゃないので使いますけどw

![misshon_control.png](https://qiita-image-store.s3.amazonaws.com/0/64812/e1991aeb-df63-f435-381a-c2776305abaa.png "misshon_control.png")

## タブ切り替え
タブ表示をサポートするアプリの場合、たいていタブ切り替えのショートカットキーがあります。

これは完全にアプリごとに固有のショートカットキーなので、よく使うアプリは覚えるようにしています。

 * ほとんどのブラウザ、Atomなど : `ctrl + tab`, `ctrl + shift + tab`
 * terminal.app : `⌘ + {`, `⌘ + }`
 * (Mac)Vim : `gt`, `gT`
 * Excel:Mac 2008 : `⌘ + fn + ↑`, `⌘ + fn + ↓`
Android/iOSアプリ開発での証明書関連で参考にしたサイト一覧

# 概要

基本的に自分用のメモです。
必要に応じて追記していきます。

# Android

## GooglePlay Developer Consoleの登録

https://support.google.com/googleplay/android-developer/answer/6112435?hl=ja

# iOS

## 法人登録からAdHoc用プロビジョニングファイル作成の流れ

http://mushikago.com/i/?p=4539

## 開発証明書の設定

http://www.sirochro.com/note/apple-developer-provisioning-flow/

## プロビジョニングプロファイルの作り方

http://dev.classmethod.jp/references/generate-provisioning-ios7/

## 開発証明書を他のマシンにインストール

http://d.hatena.ne.jp/tksthdnr/20110723/1311417829
ScalaがStringにnullを受け付けるのがつらい…

Scalaで`def command(str: String)`のような関数でも、`String`以外に`null`も受け付けることに気が付きました。type safeな言語なので、まさかと思いましたが、次のようなコードはコンパイルも通り、実行も正常にできます。

```scala
object Untitled {
	def main(args: Array[String]) {
		commandWithString("Hello")
		commandWithString(null)
	}
	
	def commandWithString(str: String): Unit = {
		println(str)
	}
}
```

実行結果

```
Hello
null
```

しかし、`println(str)`を`println(str.length)`にすると、コンパイルは通りますが、実行時エラーで`java.lang.NullPointerException`が発生します。

Javaのライブラリを使うときは、ライブラリのメソッドの戻り値が`String`または`null`となるような実装をしているものもあるので注意が必要です。
[VS2013]プリコンパイル済みヘッダを使うとIntelliSenseエラーが大量発生する問題を解決する方法まとめ

# プリコンパイル済みヘッダ使用時に発生することがあるIntelliSenseエラーを解決する
なんとか解決したので共有します。
解決法だけ知りたい人は記事下部へどうぞ。（※私のケースですので万能法かどうかは未検証です。）

## プリコンパイル済みヘッダとは

VSでビルドするとき、あるファイル内容に変更があった場合、コンパイラはそのファイルに関連するコードすべてをチェックしてコンパイルします。
小規模開発ではそれほど問題になりませんが、関連するファイルが増えてくるとビルドのたびにずらーっと列挙されるファイル名を見ながら「そんなとこ変更してないんじゃぼけえ！」と思いながらイライラする羽目になります。
![irairaCompile.png](https://qiita-image-store.s3.amazonaws.com/0/68811/e2f47755-51b3-ac9c-94ea-0a26652a7531.png)
（大阪人はせっかち）

多くのファイルと関連するけれども頻繁な変更の無い安定した（=Stable）コードを、あらかじめコンパイルしておくことでコンパイル時間を短縮するのが、「プリコンパイル済みヘッダ」です。
プリコンパイル済みヘッダの詳細と、利用方法は下記サイト等を見てください。
参考：[ドキドキしないプリコンパイル済みヘッダー](http://marupeke296.com/CPP_No14_PrecompiledHeader.html)

## プリコンパイル済みヘッダを使うとIntelliSenseがコード解析に失敗して大量にエラーを出す
※人によるようです

プリコンパイル済みヘッダ使うことでコンパイル時間が短縮されるのは良いのですが、IntelliSenseがヘッダを正常に読めず解析に失敗することがあります。
似た症例：[#include "stdafx.h"がエラーになる](http://bbs.wankuma.com/index.cgi?mode=al2&namber=68849&KLOG=117)

![error.png](https://qiita-image-store.s3.amazonaws.com/0/68811/84abc46d-32cb-c7e8-2b23-24a513fdca31.png)
（勘弁しちくり～）


IntelliSenseによるコード解析やエラー発見機能は便利なので使いたい。でもプリコンパイル済みヘッダも使いたい。というわけで本題です。

## 解決法
私の場合は下記の手順で解決しました。
リビルドだけで解決した人もいるようです。

* プリコンパイル済みヘッダとそれを作成するcppファイル（例：stdafx.hとstdafx.cpp）をプロジェクト直下に移動する。
    * vcxprojファイルと同階層に移動します
    * 移動に伴って相対パスが変わるため必要に応じてstdafx.hを編集します
* sdfとipchを作り直す
    * 一旦VisualStudioを閉じる
    * sdfファイルとipchフォルダを削除
    * VisualStudioを再起動する
* リビルド
    * メニューバーのビルド(B)→リビルド(R)

詳しい検証をしていませんが、私の場合はstdafx.hとstdafx.cppをプロジェクト直下に移動したのが効いたようです。

良かった良かった。
AndroidStudioにおけるプロジェクトの作り方

#はじめに
対象者：android開発初心者
　　　　javaの基本的な理解はできている
　　　　androidStudioの導入が完了している
同じく、開発初心者による備忘録のような形になります。


##プロジェクトの作成
初回起動時、もしくはprojectをcloseした状態でandroid studioを起動するとquickStart画面が表示されます。
![sdfa.png](https://qiita-image-store.s3.amazonaws.com/0/59803/3218c352-e898-5f5d-bc84-2de39c0c2570.png)

newProjectをクリックして新しいプロジェクトを作成します。

![fsdafdsa.png](https://qiita-image-store.s3.amazonaws.com/0/59803/34f522f2-1467-412a-5d91-5e3ee1a0e536.png)

Application name:アプリ名　好きな名前を入れてください。
Company Domain:会社のドメインです。android公式のドメインはpackageを逆順にしますが、androidStudioではそれらを自動に行ってくれます。
Project location:ディレクトリを設定してください。好きな場所で構いません。
![fdsadfa.png](https://qiita-image-store.s3.amazonaws.com/0/59803/0ec2c0f9-3a35-d6b8-69a8-c1eb18874b74.png)
次にMinimum SDKの決定を行います。
ここで指定したバージョンより古いOSにはインストールできない扱いになります。
また、androidTVやWearなどのMinimum SDKの設定もできます。

![スクリーンショット (6).png](https://qiita-image-store.s3.amazonaws.com/0/59803/de0c1917-b061-5bc7-ac0a-3fc81adae38d.png)
この画面ではActivityのテンプレートを選ぶことができます。
googleが公式で用意したテンプレートなのでソースの参考になると思います。
今回はとりあえずもっともsimpleなblankActtivityを選択しておきます。
![スクリーンショット (7).png](https://qiita-image-store.s3.amazonaws.com/0/59803/c3111e8f-b9fe-d0ff-03f4-cf06f263590d.png)
最後に各種名前を決めます。
Activity Name:最初のActivityの名前です。Activity等の解説は後日追記予定です。
Layout Nmae:最初のActivityに対応しているlayout.xmlの名前です。
Title:アプリ上部（ActionBar）に書いてあるアプリの画面の名前です。
Menu Resource Name :アプリ上部(ActionBar）のlayout.xmlの名前です。
それらを決めてFinishでプロジェクトの作成は完了です。

##アプリの実行
Android Stduio上部にあるツールバーから再生ボタンを押すことでビルドが開始されます。
ビルドが完了するとデバイス選択をするウィンドウが表示されるので選択して開始。
端末側でデプロイされ、アプリが自動で起動します。

##ファイル構成
![スクリーンショット (10).png](https://qiita-image-store.s3.amazonaws.com/0/59803/a06594fd-fb6a-0e80-a376-44efaca76d62.png)
AndroidAppのProjectは上の画像のような構成をしています。

manifests:AndroidManifest.xmlが格納されています。
manifestsがあることでandroidアプリであることを認識します。
大まかに書いてあることを箇条書きしますと、

* uses-sdk
  - targetSDk
  - minimumSDK
* application
  - アプリの構造を説明しています。
  - Activity
  - パーミッション

java:javaで書かれたコードが格納されています。
res:

* layout
* menu
* values
 - dimens
 - strings
 - styles
に分かれています。
基本的に見た目を整えるための記述です。
layoutはActivityの見た目を。
menuはActionBarの見た目を。
values各種は上から　大きさの指定　文字　画面のスタイル　となります。
ここにcolor.xmlなどで色を指定したりすることもあります。

次回
[Day2.Androidアプリケーションの構成](http://qiita.com/BD1-FM/items/c5ed161feec1fdf92796)
そろそろポリモーフィック関連について一言いっとくか

Railsにはポリモーフィック関連と呼ばれるものがある。
例えばこんな奴。

```rb
class Notification < ActiveRecord::Base
  belongs_to :notifiable, polymorphic: true
end

class Message < ActiveRecord::Base
  has_one :notification, as: :notifiable
end

class Like < ActiveRecord::Base
  has_one :notification, as: :notifiable
end
```

一行で色んなクラスに対する関連が指定できて便利感がある。
だからって、これを安易に使う前にちゃんと考えよう。
ポリモーフィック関連は単に関連の定義を省力化するためのものじゃない。
ポリモーフィックという名前が示す様に、これは多態性を持ったものに対する関連を定義する事であって、インターフェースに対する関連の定義だということを理解して使うようにしよう。
Rubyは必要な時にメソッドさえ揃ってればちゃんと動くから簡単な内は余り意識しなくても動いてくれるのだが、ポリモーフィック関連として取得したものは、原則として同じ型のものとして扱えないといけないものだ。
境界の外からそのクラスを触る場合、それの詳細に立ち入らずにクラス自身の持っている情報に判断させるのが良い、という事だ。
これはポリモーフィック関連と並んで良く問題になるSTIでも同じこと。

Rubyでは必ずしもインターフェースの定義は必要じゃないが、ポリモーフィック関連にした時にはインターフェースが目に見えて分かるようにしておくのが良い。
開発者にちゃんとインターフェースを意識させるためにもそうしておく方が良いだろう。
具体的にはポリモーフィックの関連名でモジュールを作ってそこに振舞いのデフォルト実装を書き、各クラスでincludeする。
各クラスで必要ならそのメソッドをオーバーライドする。

上の例を元に適当に書くとこんな感じ。色んなものを省略してるので雰囲気だけ。

```rb
class Notification < ActiveRecord::Base
  def deliver
    if notifiable.notify_condition?
      Notificator.new(notifiable).notify
    end
  end
end

module Notifiable
  def title
    raise NotImplementedError
  end

  def body
    raise NotImplementedError
  end

  def notify_condition?
    true
  end
end

class Message < ActiveRecord::Base
  include Notifiable

  def notify_condition?
    receiver.has_subscription?(:message)
  end
end

class Like < ActiveRecord::Base
  include Notifiable

  def title
    "あなたの記事が「いいね」されました"
  end

  def body
    "#{liker.nickname}があなたの記事を「いいね」と言っています"
  end

  def notify_condition?
    likeable.owner.has_subscription?(:like)
  end
end
```

こんな感じで振舞いは各クラスが知っていて外からはそれを呼ぶだけ。処理の分岐はポリモーフィズムに任せる。

もし、ポリモーフィック関連を使っていて↓↓のようなコードがあったら、ほとんどの場合何かが間違っているという事を意識しておこう。

```rb
class Notification < ActiveRecord::Base
  def deliver
    case notifiable
    when Message
      if notifiable.receiver.has_subscription?(:message)
        notifiable.send_message_notification
      end
    when Like
      if notifiable.likeable.owner.has_subscription?(:like)
        notifiable.send_like_notification
      end
    end
  end
end
```

こうなってしまうと、読むのが辛い、テストが辛い、変更に弱い、と苦しみがガンガン増していく。
ポリモーフィック関連が個別のタイプの判別を必要とするような状況に陥らないように、使う前にインターフェースをしっかり考えよう。ドメインの中で同じ扱いをされているものなのかを考えよう。

ちなみに上の辛いcase文には更に上位バージョンが存在し、クラスの判定がtypeの文字列に行われている場合がある。
そうなると何がヤバイって、タイポしてても気付かずにelseに突入したり、サブクラスに対応できないなどの問題が更に増加する。

例を考えるのが割と面倒だったので、サンプルがなんかおかしくないか?みたいな突っ込みがあるかもしれないが、とにかくポリモーフィック関連の対象に対してtypeを尋ねるな、ということだけ何とか理解して欲しい。
コントローラーにそんなコードが混じってようものなら非常に辛いことになる。

ちなみにSQLアンチパターンにも書いてあるが、ポリモーフィック関連自体が、RDBに文字列でクラス名が入っていて安全ではない、外部キー制約が張れない等の理由で、割とデメリットも多いやり方だ。Railsの様にフレームワークのサポートが無い環境では更に慎重に考える必要がある。
Unityスレッド　メモ

Unityで別スレッドからMonobehaviorクラスへコールバッグした場合、主導権は別スレッドが持っている。

しかも、Monobehaviorクラスからプラグインを呼んでもエラーになっている模様。
処理がどこかで落ちていることはわかるがエラーはでない。

Unityのスレッドはかなりはまる、Debug.logが出せないので処理を追うのも一苦労