OmniAICreator/Qiita-1.07M huggingface dataset:
GlanceControllerにライブラリをimportする

GlanceControllerにライブラリをimportする

なぜかGlanceControllerにframeworkのヘッダーをimportしようとするとエラーが発生します。なぜだ！

たとえば、

 #import \<MediaPlayer/MediaPlayer.h>

とかやるとファイルがないと言ってエラーになります。
といってもこの問題はまだ解決できてません。
ポリモーフィック関連(polymorphic)

# 参考
[【Rails】ActiveRecord：単一テーブル継承(sti)とポリモーフィック関連を未だにぱっと思い出せないのでまとめ。 - 記すに足らず。](http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173742)

# 自分用まとめ
`イメージテーブル`なんだが、たくさんのテーブルとひも付きそうだ。

`RoR的`に言うのであれば、色んなところから`has_manyされて`色んなところに`belongs_toしそう`。

こういうときは、`イメージテーブル`は、`紐づくテーブル`と`そのテーブルのid`情報持っとけば、`join`させて情報引き出せるよねえ。よしよし！

というのをやるのが、`ポリモーフィック関連(polymorphic)`
ios5.1アプリ Xcode7/8ビルドでまた画面サイズが変になる。Launch Imageなしで対応できる場合もある。

#**現象**
　昔Xcode6 でも同じような現象があって（確かiphone6発売の頃かな？)対応したんです。
　だから大丈夫と思ってましたが・・・・・・・・・黒帯さん画面の再登場となる。(ToT)
　Xcode6.4まで問題なかったのにXcode7で発生した。

　　　![Simulator Screen Shot 2015.09.28 19.40.59.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/95619baa-b905-15f2-40b8-64d303a3a375.jpeg)

Googleさんに聞けば、Launch Imageを設定すれば解決すると言う。
 http://qiita.com/sasanao/items/afb52bd3806806cdc788
**Size classes で対応すべきだけど、iOS5.1対応なので、無理っぽい。**

##前回はどんな対応だったか？
　　・Launch Imageを設定できるようにしただけでできた。
　　・Image画像の設定なし。

###**確認する。**
　前回は、iphone5sなのに画面サイズがiphone4が返ってきてました。
　画面サイズ確認してみる。

>   //確認コード
    UIScreen *sc = [UIScreen mainScreen];
    userScreen = sc.bounds;
    NSLog(@"size%fx%f",userScreen.size.width,userScreen.size.height);

　Logを見る限り前回と同じ問題のようだ。( iphone4の画面サイズが戻って来る )
> size320.000000x480.000000　　←　NG (黒帯さん)
　iphone5sなので、ほんとうは568なのだが 480になってる。だから黒帯が付く

　Xcode7 新規作成でも発生するか、テストする。
　設定は、こんなんです。
>  ![a.png](https://qiita-image-store.s3.amazonaws.com/0/75082/e65923de-c203-cb2e-dfa6-dfcb586662e1.png)

>  ![b.png](https://qiita-image-store.s3.amazonaws.com/0/75082/2ceda22e-b502-b6f2-a402-738dfae3631f.png)

　その結果は・・・・・・　問題なく(320x568で画面もOK)動作している。（　なっなんで・・・∑(ﾟДﾟ)
　
　問題APPの設定を比較する。・・・・・・・
　あれ？？？　設定がされていないようだ（不必要ように見えるのだが・・・
  ![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/75082/b01322f4-72c0-beef-9023-2308f44ad69f.jpeg)

　確認プログラムのこの部分空白にすると・・・・
　　![Simulator Screen Shot 2015.09.28 21.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/75082/6e5020f7-a58b-5db1-54db-6b11c1950e65.png)　→　![Simulator Screen Shot 2015.09.28 21.50.32.png](https://qiita-image-store.s3.amazonaws.com/0/75082/f412d15b-39ed-c228-69c8-eb3d567049a9.png)

キター　再現しました。

####**結論**
1. Launch Screen Fileが設定されていないと、発生する。
2. 新規作成で、Launch Image使用(Imageなし)でも問題ない事から、従来と同じ事ができるようになっていると推測する。
　(Launch Imageがなくても動作するようになっていると考える）

**追伸**
　個人的に今回のAPPは、Launch Imageつけたくなかったんで、方法があってよかったです。
　追加でテストしないといけないのですが、もし、同じような方がいれば一度確認されてはどうでしょうか？
　お役にたてれば幸いです。
単一テーブル継承(STI:Single Table Inheritance)

# 参考
[【Rails】ActiveRecord：単一テーブル継承(sti)とポリモーフィック関連を未だにぱっと思い出せないのでまとめ。 - 記すに足らず。](http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/11/04/173742)

[CoreDataでエンティティを継承させる。 - Object for cutie](http://d.hatena.ne.jp/tanaponchikidun/20120620/1340159226)

# 自分用まとめ
なんか〜　`このテーブル(Aテーブル）`と`このテーブル(Bテーブル)`は`カラム`で持つ情報似てるからぁ〜　1つにまとめちゃって〜
`null`になる`カラム`も多いけどぉ、`type`とかでわけちゃえば〜
`A Type`の情報が欲しいときわぁ`A Type`で絞りこんじゃえばよいんだしぃー

みたいに思うこと設計のときにありますよね？
（実際に実践で分けたことがほとんどない。）

そういうときは、`単一テーブル継承(sti)`。
1つのテーブルでタイプで分けちゃって全部持っちゃえばいいんじゃね？を実現します。

CoreDataのエンティティ継承も、1つのテーブルで実現するみたいだし、非常に似てますね。
Immutable.jsのオブジェクト比較用のpluginを作った

# 気持ち
Immutable.jsは便利だけど、`chai`の`eql`を使ってspecを書くと、Immutable.jsの内部的な値の差分まで検出してしまうので、テストが通らないしその差分を見ても訳がわからない。

`Immutable.is()`を使っちゃうとテストが落ちた時の差分情報が見れないので、あんまり使いたくない。
（みんなこの辺どうしてるんすかね？）

# やっつけ
Immutable.jsは`toJS()`という、構造が同等の普通のjs objectを返してくれるAPIがあるので、`toJS()`が定義されているオブジェクトが`eql`に渡されたら内部的に`toJS()`を呼んで元々の`eql`で比較するpluginを作った。plugin作りの練習にはちょうど良かった。

要するに、意識しなくても

```
expect(actual.toJS()).to.eql(expected.toJS());
```

をやってくれるようにした。

詳しく
https://github.com/hokuma/chai-eql-immutable

やっつけで作ったのでテストはないです。Travis CI使ってみたいからその一環でやるかも。
VirtualBoxのvagrant boxで実機へのadbコマンド(install等)が非常に遅い場合

VagrantのVirtualBoxのBoxで構築したVM上で
AndroidStudioでapkをビルドして実機にデプロイして起動したり、直接`adb install`コマンドを叩いてみても全く反応が無いという問題に当たりました。

何でだろうと、設定を見直すと、USBが1.1しか有効になっていませんでした。そこで、これを2.0に上げる事に。

そこでVirualBox Managerからチェックを入れてみても有効化できないというエラーが。

![usb.png](https://qiita-image-store.s3.amazonaws.com/0/45959/9000f218-aa89-7186-ead7-bdcdb0dedb18.png)

有効化するにはExtension Packが必要とのことです。

下記のサイトから自分のVirtualBoxのバージョンに対応したExtension Packをダウンロードしてきてインストールしました。
https://www.virtualbox.org/wiki/Downloads

私の場合はバージョンが4.3.30だったので下記。(バージョンが完全に一致するものを選ぶ必要があります。このページにない場合は`VirtualBox older builds`というリンクから)


![extensionpack.png](https://qiita-image-store.s3.amazonaws.com/0/45959/12a7e6cf-04d8-319c-ffbc-7bdcd5d62830.png)

クリックすると`Oracle_VM_VirtualBox_Extension_Pack-4.3.30-101610.vbox-extpack`という名前のファイルがダウンロードされました。

そのファイルをダブルクリックするとVirtualBoxManagerが起動して下記のようなダイアログが表示されます。

![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/45959/2b44df28-f162-72ed-8daf-d2b15029b5f8.png)

あとは内容に従って、インストールしていけばOKです。

すると、VirtualBoxのManagerでUSB2.0を有効化しても警告が表示されなくなります。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/45959/223e543f-0862-62e0-e1f6-413b8f34e140.png)

この状態でadb installを試せば応答がすぐに返ってきてインストールできるようになりました。
手っ取り早く bundle install した rubygems の summary と description を取得する

Mac OS X  + ruby 2.2 な環境でこんなスクリプト書いてみました。

```rb
require 'yaml'

# とりあえず bundle list の結果から、gem の名前だけを取得して配列に突っ込んでみます
gems = (`bundle list | awk '{print $2}'`).split("\n")
# 先頭２行は bundler の出力なので無視します
2.times{ gems.shift }

gems.each do |gem|
  puts gem
  # 具体的な情報は gem spec GEMFILE で取得します。結果は yaml でくるので、パースしてやります。
  puts YAML.load(`bundle exec gem spec #{gem} summary -l`)
  puts YAML.load(`bundle exec gem spec #{gem} description -l`)
  puts "--"
end
```

とても時間がかかりましたが、一応内容は取れました。
もっといい方法があれば、ぜひ教えてください。
EmacsのShellモード中でパスワードを非表示で入力する

EmacsでShellモード(`M-x shell`)にて
ssh等でパスワードやパスフレーズを求められるとき、パスワードを入力すると、****といったマスクで隠されず、入力した文字がそのまま表示されてしまうことがあります。

そんなときは下記のコマンドを入力すると、ミニバッファで****のようにマスクされた状態でパスワードを入力できるようになります。

```
M-x send-invisible
```

![passwordprompt.png](https://qiita-image-store.s3.amazonaws.com/0/45959/9eb27fec-367c-ba15-7138-d9d2cc98510c.png)


ちなみに下記を書いておけばパスワードプロンプトを自動的に認識して、上記の動作ができるようになるらしいけれど、自分の環境では特に動作せず。。。(バージョン24.5)
なんでだろう。

```el
( add-hook 'comint-output-filter-functions
    'comint-watch-for-password-prompt)
```

と調べていたら、下記の記事を見つけました。

[Emacs 23 の shell-mode で git プロンプトのパスワード入力が隠されない件 への workaround](http://qiita.com/y2q_actionman/items/5986df9480960c40eb4e)

> comint-watch-for-password-prompt である。そして、この関数の行う判定とは、各行について「 comint-password-prompt-regexp で指定された正規表現にマッチするかどうか」である。

なるほど。
そもそもcomint-password-prompt-regexpの正規表現にマッチしていなかったということでした。

使用頻度が多いものについては、こちらで対応しておいたほうが良さそうです。
連番リネームする際、ファイル数の桁数を取得して桁数を揃える


## 想定されるディレクトリ構成
```plaintext
testdir/
├── animals
│   ├── cat
│   ├── dog
│   └── horce
├── colors
│   ├── black
│   ├── blue
│   ├── brown
│   ├── gold
│   ├── green
│   ├── orange
│   ├── pink
│   ├── red
│   ├── silver
│   ├── white
│   └── yallow
└── vegetables
    ├── carot
    ├── potato
    └── tomato
```

## step by step

### ディレクトリごとのファイル数を取得する
* `ls -1`でファイルリストを出力し`wc`で行数をカウント
	* `-U`はソートしないオプション。なくてもいい
* ディレクトリごとに`wc`を実行するために、`xargs`で`ls`と`wc`をまとめて実行

```console
$ cd testdir
$ find . -type d | xargs -I{} sh -c "ls -U1 {} | wc -l"
       3
       3
      11
       3
```

## 最大数を取得する
* `sort -g`で数値順に並べ替えて`tail -n1`で最大を取得

```console
$ cd testdir
$ find . -type d | xargs -I{} sh -c "ls -U1 {} | wc -l" | sort -n | tail -n1
      11
```

### 桁数を取得する
* bashなら「桁数を計算して変数に格納」より「変数に格納して長さを取得」のほうが楽

```console
$ cd testdir
$ max="$(find . -type d | xargs -I{} sh -c "ls -U1 {} | wc -l" | sort -gb | tail -n1 | sed 's/ //g')"
$ echo "${#max}"
2
```

### 桁数を揃えて連番を出力
* `printf`で整形
* bashの`(())`で加算
	* `10#`で十進数扱いにしないと八進数扱いにされエラーが出る
* ループする必要がなければ`seq -w 1 10`とかでいい

```console
$ cd testdir
$ max="$(find . -type d | xargs -I{} sh -c "ls -U1 {} | wc -l" | sort -gb | tail -n1 | sed 's/ //g')"
$ while [ $num -le 10 ]; do
>   num="$(printf "%0${#max}d" "$((10#$num+1))")"
>   echo "$num"
> done
01
02
03
04
05
06
07
08
09
10
11
```

### リネーム
* ディレクトリ内の全ファイルに対してループ処理するには`for 変数 in *`でよい
	* `for 変数 in "$dir"/*`でもいいけど、リネームがめんどかった

## コード
というわけで、完成したスクリプト。カレントディレクトリのサブディレクトリを検索し、ファイル名の先頭に連番を付ける。

```bash
while read dir; do
  num=0
  cd "$dir"
  for file in *; do
    num="$(printf "%0${#max}d" "$((10#$num+1))")"
    mv "$file" "$num-$file"
  done
  cd -
done < <(find . -type d -mindepth 1)
```


### 結果
* ファイル数が100でも100000でも同じスクリプトでイケる
* ディレクトリ階層が深くてもイケるが、ディレクトリをリネームしないように`for`あたりをいじらないと

```plaintext
testdir
├── animals
│   ├── 01-cat
│   ├── 02-dog
│   └── 03-horce
├── colors
│   ├── 01-black
│   ├── 02-blue
│   ├── 03-brown
│   ├── 04-gold
│   ├── 05-green
│   ├── 06-orange
│   ├── 07-pink
│   ├── 08-red
│   ├── 09-silver
│   ├── 10-white
│   └── 11-yallow
└── vegetables
    ├── 01-carot
    ├── 02-potato
    └── 03-tomato
```
SinatraでRailsConsoleのようにpryでデバッグしたい


普段は、RailsConsole + pry-byebugに飼いならされているため、それ以外のデバッグはやりたくない！というわけで、Sinatraアプリでもコンソール立ちあげーのpryにしーのステップ実行させーのという感じです。

```Gemfile
group :development do
  gem 'racksh'
  gem 'pry-byebug'
end
```

```
$ bundle exec racksh
```

以上です。

## 普通のirb版

irbでとりあえず良いよっていう人は、これでもいける。

```
$ bundle exec irb
```
AWS RDSのインスタンスタイプ変更やメンテ再起動にかかる時間は約1分〜5分


# 結論

|Multi-AZ|ダウンタイム|
|---|---|
|利用|約1分|
|シングル|約5分|

どちらもコンソールから適用して、約5分ほど経ってから接続が切れた。おそらく準備中なのであろう。状況やインスタンスタイプによって変わるかもしれないが、概ねこの数値内に収まった。

また、シングルからMulti-AZに変更するのはダウンタイムなしでいける。数分間のダウンタイムであれば、比較的メンテナンス時間を設けやすい気がする。もちろんサービスの性質にもよるけど。

## 確認方法

接続の確認には、mysqladminのpingを1秒毎に実行。

```
$ while true; do mysqladmin ping -h hoge.rds.amazonaws.com -u user -ppassword ; date ; sleep 1; done
```

接続が切れた時のエラーメッセージ。

```
error: 'Lost connection to MySQL server at 'reading initial communication packet', system error: 111'
```
Laravel5でトランザクション

AブロックとBブロックがあるトーナメントでそれぞれ1〜8番の枠がある。
エントリーが10人で残りの6枠が埋まらなかったので、その6枠にダミーのデータを挿入する処理を書いた。

```
$blockList = DB::table('players')->select('block_id')->distinct()->get();
```

$blockListの中身にデータがあるかチェック。

```
if (!is_array($blockList) || empty($blockList)) {
    print_r("blockList is empty.\n");
} else {
    //ここにトランザクションの処理を書いていく。
}
```

トランザクションは以下のように書く。

```
try {
    DB::transaction(function() use($blockList) {
        if (!DB::table('players')->insert($record)) {
            throw new \Exception();
        }
    });
} catch (\Exception $e) {
    print_r("error: Failed to save data.\n");
}
Slim の属性値指定のちょっといい話

この記事は，Slim を既にちょっぴり知っている方向けに，属性値の書き方で「へえ，そう書けるんだ。いいね」的な小ネタを若干拾ったもの。

◎[Slim](http://slim-lang.com/) をご存じない方へ

Slim は簡潔な記述と高速変換を特長とする，HTML，XML 向けの Ruby 製テンプレートエンジン。

（2017-02-07 追記）Slim のより良い書き方を集めた下記の記事もご覧ください。

[Slim コードのリファクタリング - Qiita](http://qiita.com/scivola/items/e9ea12bdd950a35b8eb9)

# 属性値の文字列化

属性値は自動的に文字列化してくれる。従って，

```slim
td colspan="2"
```

などと書かなくても

```slim
td colspan=2
```

でいい。もちろん

```slim
td colspan=(n+2)
```

みたいな式を書いたり，

```slim
- [:name, :age].each do |field_name|
  div class=field_name = params[field_name]
```

みたいにシンボルを与えてもいい。

ちなみに属性値に `nil` や `false` を与えると，属性自体が出力されない。つまり，

```slim
div class=nil
```

は

```html
<div></div>
```

となる。

# クラスのマージ

例えば

```slim
div class="foo" id="bar" class="baz"
```

のように二つの `class` を書いても

```html
<div class="foo baz" id="bar"></div>
```

のように，まとめてくれる。

クラスのドット記法を混ぜて

```slim
div.foo class="bar"
```

と書いても期待通り

```html
<div class="foo bar"></div>
```

のようにまとめてくれる。


# クラスを追加

変数 `is_happy` が真のときだけ `happy` クラスを追加したいとき，

```slim
div.item class=('happy' if is_happy)
```

みたいに書ける。Ruby って，`is_happy` が偽のとき

```rb
'happy' if is_happy
```

の評価値は `nil` だよね。だから，上記のような Slim コードは，`is_happy` が真のときは

```html
<div class="item happy"></div>
```

となり，偽のときは

```html
<div class="item"></div>
```

となる。まったくもって期待通り！

# 追記（2016-02-14）

## 属性値が "false" の場合

属性値として "true", "false" を取る列挙型属性がある。これは要注意。

例えば，textarea などでスペルチェックを行うかどうかを指定する [`spellcheck` 属性](https://developer.mozilla.org/ja/docs/Web/HTML/Global_attributes/spellcheck) がこれにあたる。

以下のようにすれば，（ブラウザーが対応していれば）スペルチェックが無効になる。

```html
<textarea spellcheck="false"></textarea>
```

しかし，これを Slim で書くのに

```slim
textarea spellcheck=false
```

とやったのではダメ。`=` の右側は Ruby の式として評価され，`false` は偽なので以下のように属性自体が無くされてしまう。（`nil` も同じ）

```html
<textarea></textarea>
```

正しくは

```slim
textarea spellcheck="false"
```

のように，文字列リテラルで与える。

同じように，`"true"` も

```slim
textarea spellcheck=true
```

はダメ。これだと

```html
<textarea spellcheck=""></textarea>
```

のようになってしまう。正しくは

```slim
textarea spellcheck="true"
```

とする。
まとまった数の<input type='text .... をclassでグループ指定する

<input type='text .... がまとまった個数ありグループ分けしたいときなどは、グループ毎にclassでまとめると楽ちん！

```html
<!-- グループ1 -->
<input type="text" class="group1" name="hoge1">
<input type="text" class="group1" name="hoge2">
<input type="text" class="group1" name="hoge3">
<input type="text" class="group1" name="hoge4">

<!-- グループ2 -->
<input type="text" class="group2" name="fuga1">
<input type="text" class="group2" name="fuga2">
<input type="text" class="group2" name="fuga3">
<input type="text" class="group2" name="fuga4">
```

jQueryで指定するときグループ１、グループ２はそれぞれ次のように指定できる

```js
//グループ１
$("input[type='text'].group1")

//グループ２
$("input[type='text'].group2")
```
ちょっととまどったので、おぼえがき・・
Local gulp not found が出た時の対処法

## 概要

gulpをnpmでインストールし、早速使ってみたところ下記のエラーが出ました。

```
[19:48:36] Local gulp not found in /home/hogehoge
[19:48:36] Try running: npm install gulp
```

なんかgulpにはグローバルのとは別でローカルにもインストールする必要があるのか？
今gulpを動かしているディレクトリ配下にgulpがないとダメなのかな・・

よくわからないけど、一旦動かすためには下記コマンドでOKです。

```
npm link gulp
```

すると、自分がいた `/home/ogehoge/node_modules/`のgulpにシンボリックリンクがはられて使えるようになります、
Adobe AIR SDKにバンドルされているiOS SDKのバージョンを調べる方法

こんにちは、ICSの[鹿野](https://twitter.com/tonkotsuboy_com)です。

[Adobe AIR](http://www.adobe.com/devnet/air/air-sdk-download.html)はActionScript 3.0のAPIを使ってiOS・Android両方に対応したモバイルアプリを作ることのできる便利な技術です。Adobe AIR SDKにはiOS SDKがバンドルされています。**iOS SDKはバージョンによって挙動が異なるため、Adobe AIR SDKに含まれているiOS SDKのバージョンを把握しておくことが重要**です。

# iOS SDKのバージョン確認手順
1.ipaを作成（今回は[Adobe Flash Builder 4.7 Premium](http://www.adobe.com/jp/products/flash-builder.html)を使用して、デバッグビルドを作成しました）
2.[右クリック]→[アーカイブユーティリティ等で解凍]→Payloadフォルダに**.appというファイルが作成される

![ipaの解凍.png](https://qiita-image-store.s3.amazonaws.com/0/67884/5721011d-ac69-59d9-ce87-98895588d67a.png)

3.**.appファイルを[右クリック]→[パッケージの内容を表示]

4.[Info.plist]をダブルクリック

![info.plist.png](https://qiita-image-store.s3.amazonaws.com/0/67884/5278c21a-7f9c-a574-c18e-e8207f172196.png)

5.iOS SDKとAIR SDKのバージョンが表示される（画像はAIR SDK 19を使ってビルドしたiOSアプリのInfo.plist）

![ios_sdkバージョン.png](https://qiita-image-store.s3.amazonaws.com/0/67884/0f523953-20f9-a64a-6f5f-b7476b8b84ac.png)


# AIR SDKとiOS SDKバージョンの対応表
AIR SDKのいくつかのバージョンについて、バンドルされているiOS SDKを調べた結果は下記です。例えば、**iOS 9のSDKは、AIR SDKのバージョン19にも含まれていない**ことが見て取れます。

| AIR SDK | iOS SDK |
|---------|---------|
| **19（最新）**      | **8.1**     |
| 18      | 8.1     |
| 17      | 8.1     |
| 4       | 7.0     |
[Unity] ピンボールゲームのフリッパーを実装する

ピンボールゲームを作る上で実装必須の**フリッパー**※ですが、意外とその実装方法が見つからなくて困りました。
※ボールを打つための「 ＼  ／ 」部分です。

思い描いていた動作がHingeJointを使うことで実現できたので、その方法をまとめておきます。

#事前準備
まずはCubeを新規作成します。
TransformのScaleを`X = 4`にして少し横長にします。
![transform.png](https://qiita-image-store.s3.amazonaws.com/0/94654/eb71eff7-19e3-dc06-253c-534dcf9e19ef.png)

次に、このCubeにRigidbodyとHingeJointのComponentを追加します。
RigidbodyはUse Gravityのチェックを外します。
HingeJointはAnchorの位置を（0.5, 0, 0）に、Axisの向きを（0, 0, 1）に変更し、Use Springにチェックをつけます。
![Rigidbody_HingeJoint.png](https://qiita-image-store.s3.amazonaws.com/0/94654/4ad2a041-f5f2-a011-a37f-41376a193b42.png)

#スクリプト
事前準備で作成したCubeに、以下のスクリプトを追加します。
追加後、Game画面上でマウスを左クリックするとフリッパーが動きます。

```csharp:flipper.cs
using UnityEngine;
using System.Collections;

public class flipper : MonoBehaviour {

	public float spring = 40000;
	public float damper = 1000;
	public float openAngle = 45;
	public float closeAngle = -45;

	private HingeJoint hj;
	private Rigidbody rb;

	void Start () {
		hj = gameObject.GetComponent<HingeJoint>();
		hj.useSpring = true;
		rb = gameObject.GetComponent<Rigidbody>();
		rb.useGravity = false;
		closeFlipper ();
	}
	
	void Update () {

		if (Input.GetMouseButtonDown (0)) {
			openFlipper();
		}
		if (Input.GetMouseButtonUp (0)) {
			closeFlipper();
		}
	
	}

	public void openFlipper(){
		JointSpring spr = hj.spring;
		spr.spring = spring;
		spr.damper = damper;
		spr.targetPosition = openAngle;
		hj.spring = spr;
	}

	public void closeFlipper(){
		JointSpring spr = hj.spring;
		spr.spring = spring;
		spr.damper = damper;
		spr.targetPosition = closeAngle;
		hj.spring = spr;
	}
	
}
```

#解説


```csharp
	public float spring = 40000;
	public float damper = 1000;
	public float openAngle = 45;
	public float closeAngle = -45;
```

springはバネの強さで、これを大きくすると勢いよく動くようになります。
damperはバネの戻りにくさで、これを大きくするとあまりビヨンビヨンしなくなります。
openAngleはフリッパーが開いた時の角度で、closeAngleはフリッパーが閉じた時の角度です。
これらのパラメータは適宜調整してください。


```csharp
		hj = gameObject.GetComponent<HingeJoint>();
		hj.useSpring = true;
		rb = gameObject.GetComponent<Rigidbody>();
		rb.useGravity = false;
```

これは、チェックの付け忘れ/外し忘れ防止のために、念のため書いているだけです。不要であれば削除可能です。
自社サービスのMarketing構成をまとめてみた

![MarketingArchitecture.jpg](https://qiita-image-store.s3.amazonaws.com/0/83135/ed3269c9-fc0a-01b4-572c-717e2394f29d.jpeg)


# TL;DR

- サービスへの集客・ログ集計・分析・KPIの可視化という段階に応じて、各種ツールを用いてMarketingを行っている。
- 集客~KPI可視化までを出来るだけ自動化し、マーケターとしてはデータから示唆を得ることと、施策を捻り出すことに特化できる構成を組んでいる。図は簡略化されているが、各ツール間でも多くのツールが利用されている。
- またSlackを通じて多くの主要KPIを全メンバーに共有し、朝会などでマーケターよりフォローをするようにしている。会社全体でKPIへの理解と施策との因果を理解することで、より自身のアクションの意味を理解しながら動ける組織カルチャーを創りたいと思っている。

# 各項説明

## 集客

各集客チャネルに対しsummeryを記す。

|  Channel | type | purpose | description |
|  -------- | -------- | -------- | -------- |
|  mail and push | retention | CV |会員制サービスであるため、会員へ再訪問（リテンション）を促すメルマガ・push通知によるサービスの活性化はMarketingの肝であり、KPIも非常に細分化して管理している。AWSサーバーを利用して送付。キャンペーンやイベントとして効果をGAにてトラッキングしている。 |
|  Instagram | impression | imp and CV |まだあまりアクティブではないが、Instagramを利用した認知拡大も行っている。2015/10/1よりInstagram広告がSMB向けに開放されるタイミングに合わせて、Optimizationしていきたい。 |
|  FacebookPage | impression | imp |後述するオウンドメディアと組み合わせ、認知拡大を目的に運用。Pageへ貯まるLikeは広告を運用することで加速度的に伸びることもあり、オウンドメディア・広告とのよいシナジーが生まれている。現在Page Like2万（2015/09/28）。 |
|  FacebookAds | impression | signup and CV |限られたユーザーセグメントへの広告出稿に最も強いメディアが実名制のFacebook。創業当初より効果的にFacebook広告を運営し、ハイパフォーマンスを叩いている。会員数数十万規模でもまだまだポテンシャル高。一方で、[Facebook広告の入札方法が突如変更しCPCが5~10倍に急騰中](http://qiita.com/Yamotti/items/3be6fda7ce851c3d7b8d)へ記したよな、無断かつ大きな仕様変更が運用者の神経を削る。 |
| OwnedMedia | impression | imp |自社で運営するオウンドメディアは、仕入先ブランド獲得のためのPRメニューとして立ち上げた。現在はECのコアユーザーがライターを務め、準コミュニティとして運営している。記事を通じた見込み客の集客に利用。 |
|  GDN |impression | signup and CV |[長期的なコンバージョンを高めるためにアドネットワークやDSPを使う際の処方箋](http://qiita.com/Yamotti/items/b3f79ef57a6beb89ff6d)に記したとおり、直接的な集客だけではなく、新たなチャネル開拓に利用している。ネットワーク系は広く薄く見込み客へリーチできる反面、コストのコントロールがシビアである。 |

## ログ集計

- ログの集計はweb/iOS APP共にGoogleAnalyticsを使用してデータを取得している。
- この他アプリのデータについてはAdStoreTrackingも併用。リファレンス/バックアップデータの取得を目的としている。
- この他自社サーバーからKPI集計に必要な情報は毎日csvで自動出力し、GoogleDriveに保管している。


## 分析

以下の記事に記載したGoogleAnalytics API Add-onを使用し、spreadsheetで作成したKPIフォーマットに沿ってGAからデータを引っ張ってきている。

- [GoogleAnalytics API Add-onを使ってspreadsheetを最強のKPI管理シートに](http://qiita.com/Yamotti/items/41a513fe9592ee0cd11a)

GAデータの他に、自社サーバーから引っこ抜いたcsvの値を、GoogleAppsScriptで毎日KPIシートへ転記している。この辺りを自動化してしまうと、本当に人間がやる作業が減るのでオススメ。

下記のファネル分析程度であればGAのwebにてサクッと行ってしまえるが、高度な分析はやはりみんなだいすきな表計算ソフトに委ねたいところ。

- [GoogleAnalyticsのカスタムレポートを使って手軽に経路×ファネル分析を始める](http://qiita.com/Yamotti/items/a0673b6611ed4e14f75c)

ちなみに自社ではチャネルやサービス毎にKPIシートを作成し、目的に応じて利用している。

## 見える化

Slackを利用している事業者であれば多くの人におすすめしたいのがSlack上での経営指標の見える化。KPIをspreadsheetで集計しているので、GoogleAppsScriptを使ってSlackへKPIを飛ばすbotが作れる。

- [spreadsheetで管理する日次KPIをSlackに自動投稿する](http://qiita.com/Yamotti/items/bb2f002ba843386ce6f5)

# コメント

- スタートアップにおけるMarketingはプロダクトの一部とも言えるほど重要な項目だと考えているが、車の両輪でいいプロダクトがないといいマーケティングはできない。どれだけ効率的に効果測定しようと、サービスやプロダクトにスピードを持って反映できなくてはこんなArchitectureも無駄だと思っている。
- Smarbyでは僕がプロダクトも見ているため、全体のバランスを取りながら経営判断をしつつMarketing施策をうつことができているが、経営とMarketingが離れると問題も多いので、可視化するツールと文化も重要。
- その意味で、この構成のミソは全てをspreadsheetで管理し、Slackで全員にKPIに触れさせている所だとおもっている。
- 集客手法は栄枯盛衰で常に自社サービスにあった形を模索していく必要がある。とにかく新しい情報に触れ続け、身銭で試すのが大事。
- 構成は変わり続けるもの。
Rで相関係数のプロットをキレイに描く


# コード
```lang:R
library(lattice)

# 相関係数の絶対値
mtcars.cor <- abs(cor(mtcars))
# 同じ変数同士は相関係数が1になるので、グラフの見易さの為に0を代入
diag(mtcars.cor) <- 0
# カラーパレットを作成
mtcars.palette <- colorRampPalette(c("white", "yellow", "orange", "red"), space = "rgb")
# プロット
levelplot(mtcars.cor, col.regions=mtcars.palette(120), xlab="", ylab="", 
          colorkey=list(space="bottom", width=0.5, labels=list(cex=0.9)), 
          aspect="fill", main="Motor cars feature correlation", scales=list(cex=0.9))
```

# 結果
![mcars_corr.png](https://qiita-image-store.s3.amazonaws.com/0/89145/e4893e24-3d36-ad6b-a8e9-9cf86eec232e.png)
pythonでtype hintsを使うと、処理速度が速くなる？

# きっかけ

pythonで開発してるツールが遅いので、何とかして早くしたいなと思っている毎日だったのですが、[Cython ―Cとの融合によるPythonの高速化](http://www.amazon.co.jp/%E6%9C%AC/dp/4873117275)という本を見かけたので、読んでみることに。
で、まだ数ページしか読んでないのですが、Cのように静的型付けができることが、高速化の要因の１つであるような雰囲気を感じました。

でも、最近、pythonはtype hintsできるようになりましたよね？（[Python 3.5の新しい言語機能とライブラリモジュール](http://www.infoq.com/jp/news/2015/09/python35-released)）
PyCharmとか使った時に、警告出してくれる便利機能くらいにしか考えてなかったんですけど、実はtype hints使うと処理速度も上がっちゃったりするんですかね？

というわけで、簡単な速度比較をしてみました。


# 速度比較

テストコードはこちら。

```py3
from datetime import datetime

def fib1(n):  # type hintsなし
    if n == 0:
        return 0
    return n + fib1(n -1)

def fib2(n: int) -> int:  # type hintsあり
    if n == 0:
        return 0
    return n + fib2(n -1)

print(datetime.now())
print(fib1(100))
print(datetime.now())
print(fib2(100))
print(datetime.now())
```

出力結果がこちら。

```
2015-09-28 18:59:51.027626
5050
2015-09-28 18:59:51.027720
5050
2015-09-28 18:59:51.027758
```

hype hintsなしが約0.0001秒、ありが約0.00004秒で、確かに倍くらい速くなっている！！！！


## と思ったけど（追記）

@yuki2006さんのコメントの通り、実行の順番を変えたら結果も変わってしまいました。。。
コメントありがとうございます。

```py3
print(datetime.now())
print(fib2(100))
print(datetime.now())
print(fib1(100))
print(datetime.now())
```

```
2015-09-28 19:55:23.554259
5050
2015-09-28 19:55:23.554357
5050
2015-09-28 19:55:23.554405
```


# 感想

~~テンション上って勢い良く記事にしてみたので、至らぬところもあるかと思いますが（そもそも本読みきってないし）、そこはかとなくtype hintsに可能性を感じました。~~

検証系の記事を書くときは、もっと色んな角度で調べた後、冷静になって記事を書くことを学びました。
【Unity】C#でtransform.positionの値を変更する


transform.positionには
ゲームオブジェクトの位置が入っている訳ですが
この値を使う時に
x,y,zのどれかを減らしてまたは
増やして使いたい時ってありますよね

Javascript（Unityscript）を使っている場合は
transform.position.y += 1.0f;

という様な書き方で問題無いんですが、

C#の場合はプロパティが構造体の場合そのメンバー
(Vector3のx,y,z)は直接変更できない仕様になっているので

Javascriptと同じ書き方では使えません。

さて、ならC#でtransform.positionの値は変更できないのか
と言うと、実は出来ます

前置きが長くなりましたが
それならどうすれば出来るのか、というのをこれから紹介します
***
そのまま言ってしまうと
一度Vector3の変数に取り出して
hoge.y += 1;
という風にして変更してから
transform.position = hoge;
という形で代入して使うようです。

例

```hoge.js
Vector3 pos = transform.position;
pos.y += 2;
transform.position = pos;
```
Slackでみやもとさんを使おうと思ってし……死んでた(2015年頃の話)……

2016年時点で修正されてるとのことなので見なくていいです！
今はもう何もしなくても動きそう。

=============

#経緯
みやもとさん面白そうだからためしに導入してみよーぜ！
→setUp時にgoogleカレンダーのあたりで403エラーを吐く
原因：2014/11/17のgoogleCalendarAPIv2サポート終了（多分）で祝日の取得に失敗
これ無理じゃね？　って思ったけどググってもヒットしないからもしかしたら俺だけという恐怖に囚われつつ修正


#修正内容
```js:変更前main.gs
// 611行目〜
    // 休日を設定
    var url = 'http://www.google.com/calendar/feeds/japanese@holiday.calendar.google.com/public/full-noattendees?alt=json&max-results=1000&start-min='+DateUtils.format("Y-m-d", DateUtils.now());
    var data = JSON.parse(UrlFetchApp.fetch(url).getContentText());
    var holidays = _.map(data.feed.entry, function(e) {
      return e['gd$when'][0]['startTime'];
    });
```

```js:変更後main.gs
// 611行目〜
    // 休日を設定
    var url = 'https://www.google.com/calendar/feeds/japanese__ja@holiday.calendar.google.com/public/basic?alt=json&max-results=1000&start-min='+DateUtils.format("Y-m-d", DateUtils.now());
    var data = JSON.parse(UrlFetchApp.fetch(url).getContentText());
    var holidays = _.map(data.feed.entry, function(e) {
      return e['id']['$t'].replace(/^.*?(2\d{3})(\d{2})(\d{2}).*?$/, '$1-$2-$3');
    });
```

休日開始日をとってる部分をゴリゴリ取得するように変更してみた。
とりあえずこれでspreadsheet作成時のエラーは解消できた！　やったね！


#ほいでもってそいでもって
ダメみたいですね（無常）
![434dade72d740bc0d3f13769dde6ed15.png](https://qiita-image-store.s3.amazonaws.com/0/42240/a34bae9e-a31a-bb66-707c-96b93650ee07.png)
↓
![1e424c606aab75d507b6c5b2397d220b.png](https://qiita-image-store.s3.amazonaws.com/0/42240/f3ec165c-65b5-bc4f-62f1-a5723a8cfa24.png)

ヘッダ部分はちゃんと追加されてますがそこから先で死んでる模様。
そもそも正常動作していればみやもとさんがレスポンスを返すようなので、init時点で落ちてるのでは疑惑

コメントアウトされてたtest1()を実行してみるとrowNoがNanになっとる！ということで追いかけていくと477行目で死んでた

```js:main.gs
  GSTimesheets.prototype._getRowNo = function(username, date) {
    if(!date) date = DateUtils.now();
    var rowNo = this.scheme.properties.length + 4;
    var startAt = DateUtils.parseDate(this.settings.get("開始日")); // [2015, NaN, 28] .. error!
    var s = new Date(startAt[0], startAt[1]-1, startAt[2], 0, 0, 0);
    rowNo += parseInt((date.getTime()-date.getTimezoneOffset()*60*1000)/(1000*24*60*60)) - parseInt((s.getTime()-s.getTimezoneOffset()*60*1000)/(1000*24*60*60));
    return rowNo;
  };
```

でもこれは単純に引っ張ってきてるだけなので落ちる理由がわからん。
とりあえず中身を見てみる

```js
var t = this.settings.get("開始日");  # 2015-09-28 00:00:00
```

ハイフンってparseいけるんだっけ？とか思ったけど0埋めも気になったのでスプレッドシート側を10月にしてみると取得成功した。なぁにこれぇ。
さらに追いかけてみたら
![52ae3379dc12376ed205220200e29dba.png](https://qiita-image-store.s3.amazonaws.com/0/42240/853fc3e8-e316-f187-5839-03fee4bb9321.png)
Month部分のparseIntで落ちてた。なぜ……

http://www.pxt.jp/ja/diary/article/195/
これが原因っぽい。8進数で9が入ったから死亡。

#さらにもう一発（修正）
ということで、とりあえず先頭0除外。きたないコードだ。

```js:main.gs
      var year = parseInt(matches[2]);
      var month = parseInt(matches[3].replace(/^0/, ''));
      var day = parseInt(matches[4].replace(/^0/, ''));
```

これでテストは走るようになり、スプレッドシートにも見事記録されるようになった。
![03ccbdd29227a83206d933a57b6eb9bc.png](https://qiita-image-store.s3.amazonaws.com/0/42240/876ccf0f-0891-32d4-b8b4-091b5b98831b.png)
みやもとさんも反応してくれてる。わーい！

#よっしゃーslackから投稿やー！

……状況が全く変わっていなかった、ということで見事に詰み。
デバッガ依存してっからなー！　わっかんねーんだよなー！

どう考えてもPostでParameterの引き渡しに失敗しているとしか思えないのだけど、解決策が全くわからない……
設定間違えていたらシートの新規作成すら失敗すると思うんだが、むむむ
Stringの文字列を1文字ずつ区切る

よく、","(カンマ)や特定の文字列で分割とかは見かけるのですが、今回はStringの文字列を1文字ずつ区切る方法を。

```Swift
let text = "foobar"
let characters = text.characters.map { String($0) } // String -> [String]
print(characters)
// ["f", "o", "o", "b", "a", "r"]
```

`text.characters`のところで、文字列が1文字ずつに分割されますが、この時のcharactersの型が、`[CharacterView]`となっていて、このままではStringとして使うときに不便なので、`map`をかませて、CharacterView→Stringと戻してあげます。
Railsのヘルパーと呼ばれるものたち

# はじめに
RoRを触っていると`ヘルパー`という単語がやたらに出てくる。
`ヘルパー`、`ヘルパー`と気安く呼ばれている気がするのだが、
たくさんありそうな気がしていて、何がなんだかなので、調べた。

## Form系
### その1. `*_tagヘルパー`
#### 代表例
`form_tag`, `label_tag`
#### 場所
![スクリーンショット 2015-09-28 18.20.17.png](https://qiita-image-store.s3.amazonaws.com/0/27895/20805e44-7eb2-c05b-c054-e854cb56b6b3.png)
![スクリーンショット 2015-09-28 18.20.26.png](https://qiita-image-store.s3.amazonaws.com/0/27895/184ba985-8de4-c332-17b3-875eff930d68.png)

`ActionView::Helpers::FormTagHelperモジュール`の中には他にも
`*_tagヘルパー`の定義がある。

#### 説明
[Action View フォームヘルパー | Rails ガイド](http://railsguides.jp/form_helpers.html)　で`*_tagヘルパー`と呼ばれているもの。

[【Rails】formヘルパーを徹底的に理解する - Qiita](http://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)　によると、

> `form_for`: 任意のmodelに基づいたformを作るときに使う

### その2. `モデルオブジェクトヘルパー`
#### 代表例
`form_for`, `f.label`
#### 場所
![スクリーンショット 2015-09-28 18.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/27895/bb39bddc-97bb-0f43-0e4c-3b79b3a9e859.png)
![スクリーンショット 2015-09-28 18.27.46.png](https://qiita-image-store.s3.amazonaws.com/0/27895/4e189820-2a56-a00f-a5c2-72e89f24d8ac.png)

`form_helper.rb`の構造は、
![スクリーンショット 2015-09-28 18.28.47.png](https://qiita-image-store.s3.amazonaws.com/0/27895/19d57aa1-e6c4-4622-7475-45602c9d3bb1.png)
このようになっており、`form_for`は`ActionView::Helpers::FormHelperモジュール`の方にあったが、`f.label`の方は`ActionView::Helpers::FormBuilderモジュール`の中にあるようだ。
（とはいえ、`def label`は`ActionView::Helpers::FormHelperモジュール`の方にもあった...）

#### 説明
[【Rails】formヘルパーを徹底的に理解する - Qiita](http://qiita.com/shunsuke227ono/items/7accec12eef6d89b0aa9)　によると、

> `form_tag`: modelに基づかないformを作るときに使う

## URL関係
### その3. `link_to`
#### 場所
![スクリーンショット 2015-09-28 18.33.18.png](https://qiita-image-store.s3.amazonaws.com/0/27895/12d5c5e8-16da-e400-3d30-885d148662d5.png)
![スクリーンショット 2015-09-28 18.33.31.png](https://qiita-image-store.s3.amazonaws.com/0/27895/10f187f6-e6e4-8309-fd02-cb891221f544.png)
Form系と同じく`ActionView::Helpersモジュール`の中にある位置づけ（`*.rb`ファイル的には別ファイルで書かれている）。

### その4. _pathヘルパー
#### 場所
見つけられず

### その5. _urlヘルパー
#### 場所
見つけられず


## まとめ
RoRで主に`ヘルパー`と呼ばれるものは、
`ActionView`の`ヘルパー`。
その中に、`FormTagHelper`やら`FormHelper`やら`FormBuilder(ヘルパーって名前に付いてないのね)`やら`UrlHelper`やらがあって、各種メソッドが定義されている。

| モジュール | Railsガイドでの総称 |
|:-----------|:------------|
|FormTagHelper|*_tagヘルパー|
|FormHelper, FormBuilder|モデルオブジェクトヘルパー|
|UrlHelper, _pathヘルパー, _urlヘルパー|たぶんルーティングヘルパー|


以下のあたりにも`module Helpers`があったのは気になるが...
![スクリーンショット 2015-09-28 18.41.44.png](https://qiita-image-store.s3.amazonaws.com/0/27895/40495e1d-57b1-55d1-257a-0b65b55997f4.png)
Macで簡単に画像の背景とかを透明化(透過)する方法

Macで簡単に画像の背景を透明化(透過)する方法を探したらあったのでメモメモ。
ツールのインストールは不要で、Macのデフォルトでできるので本当にオススメ！

簡単なのでぜひ使ってみてください！


# **Macで簡単に画像の背景とかを透明化(透過)**する方法

## 1.画像を**「プレビュー」**で開く
![github1.png](https://qiita-image-store.s3.amazonaws.com/0/50898/afbd568b-b1d9-6544-09a3-4a1133ecc382.png)

画像を開くとほとんどの人は**「プレビュー」**がデフォルトなので、ファイルをクリックで開けると思います。



## 2.メニューの「表示」から**「マークアップツールバーを表示」**をクリック
![github2.png](https://qiita-image-store.s3.amazonaws.com/0/50898/9da6c63a-b324-ac29-d087-eb02c8282dac.png)

![github4.png](https://qiita-image-store.s3.amazonaws.com/0/50898/0ef0e6fb-2900-e27b-18cd-74c80b5668ec.png)

これで透明化する準備が整いました。
※最初から**「マークアップツールバー」**が表示されてる人は大丈夫です。



## 3.**「インスタントアルファ」**ってやつを選択
![github5.png](https://qiita-image-store.s3.amazonaws.com/0/50898/1a82016a-d9aa-c69c-506c-917888e29274.png)



## 4.**透明化(透過)**したい部分を**ドラッグ**
![github6.png](https://qiita-image-store.s3.amazonaws.com/0/50898/98f745ce-ce99-f79c-2783-974c96b1a13c.png)

今回は背景を透明化(透過)したいので、
**背景部分でドラッグ**をします。

![github7.png](https://qiita-image-store.s3.amazonaws.com/0/50898/3f502112-cc67-07ce-b4d7-cb099f9f44c9.png)

すると！！！
このように**背景部分がピンク**になります！
これは一瞬なので、すぐにピンク部分が白くなります。

ドラッグの具合で選択範囲が、**境目ギリギリ〜白い縁が残る**など微妙に変わるので、
ドラッグの際はマウスを色々動かしてみてください。


## 4.**「command + X」**で選択部分を**透明化(透過)**
![github8.png](https://qiita-image-store.s3.amazonaws.com/0/50898/8e4b8c3f-dcc7-6949-945e-8551703c4ea6.png)

この状態で**「command + X」**を実行すると
簡単に透明化(透過)できます！

![github9.png](https://qiita-image-store.s3.amazonaws.com/0/50898/d02263bb-85ba-cd48-2233-6585c9f7e125.png)



## 5.おまけ

### ①白い部分などが残っても**ドラッグして「command + X」**を繰り返せばできる！
![github12.png](https://qiita-image-store.s3.amazonaws.com/0/50898/767e36de-0642-df22-31c2-bff7e288f8b8.png)

こんな風に悲しい状態になっても、残った白い部分を数回**ドラッグして「command + X」**を行うと簡単に消せます！

### ②**「command + K」**で逆に背景だけ残す

![github10.png](https://qiita-image-store.s3.amazonaws.com/0/50898/9f2196e9-b08d-f6d6-a7de-d32abebbeb5f.png)


## 参考
> [[Mac] 「プレビュー」で簡単に画像の透明化が出来ます(http://rakuishi.com/archives/1945/)](http://rakuishi.com/archives/1945/)
Bootstrap の Datepicker の値変更から発火して Morris.Bar（グラフ）の値を変更する

期間指定して、集計値をグラフを表示する場合のサンプル。
サクッとできたけど面白かったし、また使う気がするのでメモ。

＃Bootstrap v3.2.0 (http://getbootstrap.com)
＃jQuery v1.10.2 


HTMLのパーツはこんな感じ。
期間指定する、start-date と、end-date という id の inputフォームを置きます。

```
<p>集計期間</p>
<p>
<input id="start-date" name="start-date" type="text" readonly="readonly">
〜
<input id="end-date" name="end-date" type="text" readonly="readonly">
</p>
<div id="hero-bar" class="graph" style="height: 200px"></div>
```


そして、jsでdatepickerが動くようにします。

```
$('#start-date').datepicker({
	format: 'yyyy-mm',
	language: 'ja',
	autoclose: true,
	todayHighlight: true,
	endDate: Date(),
	minViewMode: 'months',
}).datepicker('setDate', '0')
;

$('#end-date').datepicker({
	format: 'yyyy-mm',
	language: 'ja',
	autoclose: true,
	todayHighlight: true,
	endDate: Date(),
	minViewMode: 'months',
}).datepicker('setDate', '0');
```

datepickerで日付が変更されたら発火するところはこんな感じに。
発火してgetSummaryという名前の関数を呼ぶよ。

```
// 期間の変更
$('#start-date').datepicker()
		.on('changeDate', function(e){
			getSummary($('#start-date').val(), $('#end-date').val());
		});
$('#end-date').datepicker()
		.on('changeDate', function(e){
			getSummary($('#start-date').val(),  $('#end-date').val());
		});
```

さぁ、あとは Morris.Bar を表示する。

```
function getSummary(startdate, enddate) {
	var params = new Object();
	$("#hero-bar").empty(); //これがないとこの関数を呼ぶたびにグラフがどんどん増える
	$.ajax({
		type: "POST",
		url: "/sample/ajax?startdate=" + startdate + "&enddate=" + enddate, // データはいい感じにとってください
		data: params,
	})
	.done(function(json){
		if (json.status != "success") return;
		if (json.data.length == 0) {
			return;
		}
		if ($("#hero-bar")) {
			var jdata = json.data; //$.parseJSON(json.data)　とか、返ってくる値によっていろいろ
			Morris.Bar({
				element: 'hero-bar', //ここで指定したidの要素に表示されるみたい
				data: jdata,
				xkey: 'title',
				ykeys: ['summary'],
				labels: ['合計'],
				barRatio: 0.4,
				xLabelAngle: 0,
				hideHover: 'auto'
			});
		}

	})
}
```
minitest 演習



```
require 'minitest/autorun'
require_relative 'bowling_game'

class BowlingGametest < Minitest::Unit::TestCase

  def setup
    @game = BowlingGame.new
  end

  def test_全ての投球がガター
    record_mamy_shots(20, 0)
    assert_equal 0, @game.score
  end

  def test_全ての投球が1ピンだけ倒れた
    record_mamy_shots(20, 1)
    assert_equal 20, @game.score
  end

  private

  def record_mamy_shots(count, pins)
    count.times do
      @game.record_shot(pins)
    end
  end
end

```


```
class BowlingGame
  def initialize
    @score = 0
  end

   def record_shot(pins)
     @score += pins
   end

   def score
     @score
   end
end

```

```
setupメソッド

minitestの提供するテストクラスには、各テストメソッドが呼ばれる前に必ず
呼ばれるsetupメソッドが用意されています。

def setup
  @game = BowlingGame.new
end

インスタンス変数@gameにBowlingGameクラスのインスタンスを代入する
```

```
def test_全ての投球がガター
  record_many_shots(20, 0)
  assert_equal 0, @game.score
end

record_many_shots(count, pins)

引数count => 20(繰り返し回数)を指定しtimesメソッドで繰り返す。これは全体の投球回数を明示
引数pins => 0を指定しtimesメソッドで繰り返す。

そうすることで、20回投球しpinsの合計値が0、つまり全ての投球がガターになる事を明示。

timesメソッドのcountは"繰り返したい回数"を表す。
指定された繰り返し回数分だけ、pins = 0を足していく処理を記述を記述している

```

```

def test_全ての投球で1ピンだけ倒れた
  record_many_shots(20, 1)
  assert_equal 20, @game.score
end 

引数count => 20(繰り返し回数)を指定し、timesメソッドで繰り返す。これは全体の投球回数を明示
引数pins => 1を指定し、timesメソッドで繰り返す。

そうする事で、20回投球し、pinsの合計値が20、つまり、全ての投球で1pinだけ倒れた事を明示

timesメソッドのcountは"繰り返したい回数"を表す。
指定された繰り返し回数分だけ、record_shot(pins)メソッドの@socreに1ずつ引数pinsを足していく処理を記述している


```

```
def record_many_shots(count, pins)
  count.times do
    @game.record_shot(pins)
  end
end

record_many_shotsメソッドの引数countをtimesメソッドで繰り返す。

timesメソッドのcountは"繰り返したい回数"を表す。
指定された繰り返し回数分だけ、record_shot(pins)メソッドの@socreに1ずつ引数pinsを足していく処理を記述。


```
[JAWS-UG CLI] Cognito #3 識別子プールの削除



前提条件
========


Cognito (Identity)への権限
-------------------

* Cognito (Identity)に対してフル権限があること。


AWS CLIのバージョン
-------------------

* 以下のバージョンで動作確認済

  * AWS CLI 1.8.3

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.8.3 Python/2.7.5 Darwin/13.4.0
```

0 準備
======


0.1. 識別子プール名の決定
-------------------------

```bash:変数の設定:
COGNITO_IDPOOL_NAME='s3post'
```


0.2. 結果表示上限の設定
-----------------------

list-identity-poolsコマンドで必須項目のため、設定します。

```bash:変数の設定:
COGNITO_MAX_RESULT='60'
```


1. 識別子プールの削除
=====================


1.1. 識別子プールの削除
-----------------------

```bash:変数の確認:
cat << ETX

        COGNITO_IDPOOL_NAME: ${COGNITO_IDPOOL_NAME} \

ETX
```

```bash:コマンド:
aws cognito-identity delete-identity-pool \
        --identity-pool-name ${COGNITO_IDPOOL_NAME}
```

```text:結果(例):
```

2. 事後確認
===========


同名の識別子プールの不存在確認
------------------------------

```bash:コマンド:
aws cognito-identity list-identity-pools \
        --max-results ${COGNITO_MAX_RESULT} \
        --query "IdentityPools[?IdentityPoolName==\`${COGNITO_IDPOOL_NAME}\`].IdentityPoolId" \
        --output text
```

```text:結果:
(戻り値なし)
```


完了
====
[JAWS-UG CLI] Cognito #1 識別子プールの作成



前提条件
========


Cognito (Identity)への権限
-------------------

* Cognito (Identity)に対してフル権限があること。


AWS CLIのバージョン
-------------------

* 以下のバージョンで動作確認済

  * AWS CLI 1.8.3

```bash:コマンド:
aws --version
```

```text:結果(例):
      aws-cli/1.8.3 Python/2.7.5 Darwin/13.4.0
```




0 準備
======


0.1. 識別子プール名の決定
-------------------------

```bash:変数の設定:
COGNITO_IDPOOL_NAME='s3post'
```

0.2. 結果表示上限の設定
-----------------------

list-identity-poolsコマンドで必須項目のため、設定します。

```bash:変数の設定:
COGNITO_MAX_RESULT='60'
```


0.3. 同名の識別子プールの不存在確認
-----------------------------------

```bash:コマンド:
aws cognito-identity list-identity-pools \
        --max-results ${COGNITO_MAX_RESULT} \
        --query "IdentityPools[?IdentityPoolName==\`${COGNITO_IDPOOL_NAME}\`].IdentityPoolId" \
        --output text
```

```text:結果:
      (戻り値なし)
```

1. 識別子プールの作成
=====================


1.1. 識別子プールの作成
-----------------------

```bash:変数の確認:
cat << ETX

        COGNITO_IDPOOL_NAME: ${COGNITO_IDPOOL_NAME} \

ETX
```

```bash:コマンド:
aws cognito-identity create-identity-pool \
        --identity-pool-name ${COGNITO_IDPOOL_NAME} \
        --allow-unauthenticated-identities
```

```json:結果(例):
      {
        "IdentityPoolId": "ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "AllowUnauthenticatedIdentities": true,
        "IdentityPoolName": "s3post"
      }
```


1.2. 識別子プールIDの取得
-------------------------

```bash:コマンド:
COGNITO_IDPOOL_ID=$( \
        aws cognito-identity list-identity-pools \
          --max-results ${COGNITO_MAX_RESULT} \
          --query "IdentityPools[?IdentityPoolName==\`${COGNITO_IDPOOL_NAME}\`].IdentityPoolId" --output text ) \
        && echo ${COGNITO_IDPOOL_ID}
```

```text:結果(例):
      ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```


1.3. 識別子プールの確認
-----------------------

```bash:コマンド:
aws cognito-identity describe-identity-pool \
        --identity-pool-id ${COGNITO_IDPOOL_ID}
```

```json:結果(例):
      {
        "IdentityPoolId": "ap-northeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "AllowUnauthenticatedIdentities": true,
        "IdentityPoolName": "s3post"
      }
```


完了
====
Mac OS XをUSBでテザリングしたときにDNSサーバを変更する方法

# はじめに
Mac OS XをUSBでテザリングしたときにDNSサーバを変更する方法を調べてみました。
OS XではDNS設定を「システム環境設定 ＞ ネットワーク」から行うのですがUSBでテザリングしたときにはその項目がありませんでした。
どうやってやるのか調べてみました。
試してないですが恐らくBluetoothも一緒です。
ちなみにUNIX的なresolv.confを編集するとCUIでは利用できますが、ブラウザではresolv.confを見てくれません。注意が必要ですね

# 設定
設定などには`networksetup`というコマンドを利用します。
まずは以下のコマンドでネットワーク接続の一覧を取得します。

```zsh
shell> networksetup -listnetworkserviceorder

An asterisk (*) denotes that a network service is disabled.
(1) Bluetooth DUN
(Hardware Port: Bluetooth DUN, Device: Bluetooth-Modem)

(2) Wi-Fi
(Hardware Port: Wi-Fi, Device: en0)

(3) iPhone USB
(Hardware Port: iPhone USB, Device: en4)

(4) Bluetooth PAN
(Hardware Port: Bluetooth PAN, Device: en3)

(5) Thunderbolt Bridge
(Hardware Port: Thunderbolt Bridge, Device: bridge0)
```

iPhoneをUSB接続したうえでテザリングにて接続してます。3の"iPhone USB"が接続名となります。


以下のようにすると"iPhone USB"の現在のDNSサーバが取得できます。

```zsh
shell> sudo networksetup -getdnsservers "iPhone USB"
```

`getdnsservers`を`setdnsservers`にすると設定できます

```zsh

shell> sudo networksetup -setdnsservers "iPhone USB" 127.0.0.1
```

以上です。


# 目的
ローカルの開発環境構築のため、dnsmasqを導入してワイルドカードDNSを有効にしました。
その際に参照するDNSをローカルに向けたかったのでこの設定を行いました。

# 参考サイト
http://qiita.com/r7kamura/items/b58c236eb1c3b1c38957

http://veadardiary.blog29.fc2.com/blog-entry-5743.html

http://forums.macrumors.com/threads/how-to-add-dns-to-iphone-usb-connection.986570/

http://nauthiz.hatenablog.com/entry/20100929/1285778758
bundle installした際に「gem install json -v '1.8.2'」エラー


普段開発しているRailsアプリケーションを別のディレクトリで新しくcloneして、bundle installしたところ標題のエラーが発生しました。

各ツールのバージョンは以下の様な感じです。

```
$ bin/rake about
About your application's environment
Ruby version              2.1.2-p95 (x86_64-darwin14.0)
RubyGems version          2.2.2
Rack version              1.5
Rails version             4.1.0
JavaScript Runtime        therubyracer (V8)
```



```bash
$ bin/bundle install --path .bundle
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies....
Using rake 10.4.2
Using i18n 0.7.0

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/yuto-ogi/.rbenv/versions/2.1.2/bin/ruby extconf.rb
/Users/yuto-ogi/.rbenv/versions/2.1.2/bin/ruby: invalid switch in RUBYOPT: -a (RuntimeError)

extconf failed, exit code 1

Gem files will remain installed in /Users/yuto-ogi/Work/fourier/sampleapp_ assembly/sampleapp/.bundle/ruby/2.1.0/gems/json-1.8.2 for inspection.
Results logged to /Users/yuto-ogi/Work/fourier/sampleapp_ assembly/sampleapp/.bundle/ruby/2.1.0/extensions/x86_64-darwin-14/2.1.0-static/json-1.8.2/gem_make.out
An error occurred while installing json (1.8.2), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.2'` succeeds before bundling.
```

色々調べてみたところ、以下の記事にたどり着きました。

[Resolving bundle install Text file busy error](http://joequery.me/guides/bundle-install-text-file-busy/)


>By default, bundler installs gems into a directory called vendor/bundle local to your project. Consequently, if your current project directory is within a shared folder between your VM and your host, bundler will attempt to install gems and native extensions on this shared folder.


どうも、bundle installしているディレクトリが共有フォルダの場合、上記のエラーが発生するらしい。

ただ、自分の場合は、対象のディレクトリのひとつ上のディレクトリ名に「_(アンダースコア)」が入っていたのが原因のようでした。
ディレクトリ名をリネームしたところ無事インストール成功しました。
karma で回しているテストから codecov に coverage レポートを上げるやり方

Karma から codecov に coverage を上げる方法です。

# codecov とは

codecov とは online でコードカバレッジレポートをホストしてくれるサービスで、単純にレポートをオンラインで見れるだけでなく、pull request に対して、カバレッジの増減を自動的にコメントしてくれたり、現在のカバレッジステータスを埋め込みバッジで表示してくれたり ( たとえば [![codecov.io](http://codecov.io/github/kt3k/codecov-karma-example/coverage.svg?branch=master)](http://codecov.io/github/kt3k/codecov-karma-example?branch=master) など ) 、github の UI 上にカバレッジの状況をオーバーレイしてくれたりする (公式のブラウザ拡張あり) 、テストに対するモチベーションとか、テストのクオリティに対する意識をあげてくれるとても良いツールです。

オープンソースレポジトリは無料で無制限に利用可能。private レポジトリは月額$3 から、レポジトリ数に応じて課金。

カバレッジ専門の競合サービスでは [coveralls.io](https://coveralls.io) などがあります。

(最近は ci サービスに coverage ホスティングが付属してるパターン (`TeamCity`, `Scrutinizer`) も増えてきているようです。)

# 設定

まず `git init` と `npm init` してください。

karma と coverage の設定

まずは依存をインストール

```shell-session
npm install --save-dev karma
npm install --save-dev karma-coverage
npm install --save-dev codecov
```

次に karma の config ファイルを作りましょう。

```shell-session
karma init
```

ブラウザ、test runner などは適用に好きなものを選びましょう。

karma.conf.js を手動で編集して、カバレッジレポートが出るように修正

```js
  preprocessor: {
    'src/**/*.js': ['coverage']
  },

  reporters: ['progress', 'coverage'],

  coverageReporter: {
    reporters: [{type: 'lcov'}]
  }, 
```

以上の設定をした上で、

```shell-session
karma start karma.conf.js
```

すると、`coverage/[Browser version]/lcov.info` に coverage 情報が生成されます。( `coverage/[Browser version]/lcov-report/index.html` に html の coverage レポートが出ているので、ローカルでカバレッジを確認したい場合はこちらをブラウザで開きましょう。)

次に、`package.json` を編集して、coverage を送る script を登録。

```json
{
  ...
  "scripts": {
    "test": "karma start karma.conf.js",
    "codecov": "codecov"
  }
  ...
}
```

( script の中の `codecov` コマンドは、上の `npm install codecov` でインストールされています。)

次に、`circle.yml` を編集して、テスト成功後に codecov にレポートを送信するように設定します。(この記事では ci サービスを circle ci と仮定しています。他の ci サービスを使う場合は適当に読み替えてください。)

```yaml
test:
  post:
    - npm run codecov
```

以上の設定をした上で、circle ci 上で当該リポジトリの設定を on にした上で push すれば、`circle 実行` -> `テスト成功後 codecov レポートが生成` の順で、レポートが生成されるはずです。

- 以上の設定をしたサンプルレポジトリ
  - https://github.com/kt3k/codecov-karma-example

# ブラウザ拡張
codecov レポートの出力が成功したレポジトリで[ブラウザエクステンション](https://github.com/codecov/browser-extension) を入れて github 上でソースコードを閲覧すると下のように UI 上に coverage 情報がオーバーレイ表示されます。

![スクリーンショット 2015-09-28 18.04.17.png](https://qiita-image-store.s3.amazonaws.com/0/13825/a415905d-9998-e035-6244-a11e92ce774e.png)
インスタンス変数にインスタンス変数を代入する。



#忘備録


setupメソッドを最初見た時に、インスタンス変数に対してインスタンス(クラスの実体)を代入するコードを見て一瞬戸惑ったが、変数に対しての代入だからおk




```
class BowlingGametest < Minitest::Unit::TestCase

  def setup
    @game = BowlingGame.new
  end

  def test_全ての投球がガター
    20.times do
      @game.record_shot(0)
    end
    assert_equal 0, @game.score, 'geme.scoreの値が「0」である事'
  end

  def test_全ての投球が1ピンだけ倒れた
    20.times do
      @game.record_shot(1)
    end
    assert_equal 20, @game.score
  end

  private

  def record_mamy_shots(count, pins)
    count.times do
      @game.record_shot(pins)
    end
  end
end

```
構造体でStoryboardとNibを管理する

追記
[rizumita/ResourceInstantiatable](https://github.com/rizumita/ResourceInstantiatable)としてGitHubに上げました。StoryboardとNibだけでなく、NSBundleで取得できるFileにも対応しました。

---

[iOS - Protocolを利用してStoryboardやXibファイルからインスタンスを生成する - Qiita](http://qiita.com/rizumita/items/53974aea9ec8b4f90e2f)という記事を書いたが、今度は構造体でStoryboardとNibを管理してみる。

```Swift
protocol ResourceInstantiatable {
    typealias InstanceType
    func instantiate() -> InstanceType
    func instantiate(configure: (InstanceType -> Void)?) -> InstanceType
}
extension ResourceInstantiatable {
    func instantiate(configure: (InstanceType -> Void)?) -> InstanceType {
        let instance = instantiate()
        configure?(instance)
        return instance
    }
}

struct ResourceManager {
    
    static var viewController = Storyboard<ViewController>(name: "Other")
    static var secondViewController = Storyboard<SecondViewController>(name: "Other", identifier: "SecondViewController")
    static var sampleView = Nib<SampleView>(name: "SampleView")
    
}

struct Storyboard<T: UIViewController>: ResourceInstantiatable {
    typealias InstanceType = T
    
    let name: String
    let identifier: String?
    
    func instantiate() -> InstanceType {
        let storyboard = UIStoryboard(name: name, bundle: nil)
        if let identifier = identifier {
            return storyboard.instantiateViewControllerWithIdentifier(identifier) as! InstanceType
        } else {
            return storyboard.instantiateInitialViewController() as! InstanceType
        }
    }
    
    init(name: String, identifier: String? = nil) {
        self.name = name
        self.identifier = identifier
    }
}

struct Nib<T: UIView>: ResourceInstantiatable {
    typealias InstanceType = T
    
    let name: String
    
    func instantiate() -> InstanceType {
        let nib = UINib(nibName: name, bundle: nil)
        return nib.instantiateWithOwner(nil, options: nil).first as! InstanceType
    }
    
    init(name: String) {
        self.name = name
    }
}
```

使い方は以下のようになる。

```Swift
let controller = StoryboardManager.secondViewController.instantiate()
```

[iOS - Protocolを利用してStoryboardやXibファイルからインスタンスを生成する - Qiita](http://qiita.com/rizumita/items/53974aea9ec8b4f90e2f)に比べてリソースを一元管理できて分かりやすいかもしれない。
pip, easy_install でのコマンドインストール先

Python 製のツールを入れるときに、`pip install` するのが一般的ですが、この時のコマンドインストール先が、環境によって `/usr/bin` だったり `/usr/local/bin` だったりするようです。

- Amazon Linux 2014.09 では `/usr/bin` にインストールされました
- Amazon Linux 2015.03, 2015.09 では `/usr/local/bin` にインストールされました

`/usr/bin` にインストールするようにしたい場合は、pip コマンドのオプションで `--install-option="--install-scripts=/usr/bin"` を指定すれば大丈夫です。

easy_install を使っている場合には、`--script-dir=/usr/bin` となります。

参考:

- [pip install — pip 7.1.2 documentation](https://pip.readthedocs.org/en/stable/reference/pip_install/)
githubの運用戦術

# 前提
過去のチームといまのチームでどうやっているかの話
master以外なら force push 可能なことが条件

# コミットコメント
## 一行で概要
WhyやHowを書かせる。
WhereやWhatはいらん、diffを見ればわかる。

## (必要なら)詳細
なんでここにこういうことをした？
という細かい説明。
時間に追われてdirty hackをせざるを得なかったのならここにも書いて欲しい。
書かずに変なことしたら俺がハリセン
issueだのメモだのへのリンクでもいい

## 諸注意
日本語OK
英語オンリーにするとみんな面倒臭がって `little change for debug` とか平然と入れる
詳しく書かせたいし読むのに苦労したくないので日本語を許す

# コミットのタイミングと粒度
粒度はできるだけ細かく。
１コミット単位でレビュワーがお前何がしたかった？をみるため。
レビュー中にレビューが入った部分は歴史改変せずにそのままcommitしてpush。レビュワーが差分見るときに困る。

当然歴史が汚くなるので(特にレビュー指摘分のコミット)merge前に歴史改変して綺麗にすること。

# ブランチ名
`issue-XXX/(大分類名)/ブランチ名` で命名
`issue-123/chat_timeline/extract-url_link` みたいな感じ

# issueに書くこと
Readyの条件
Doneの条件
背景、前提、どのUXやfeatureの充足を目的とするか
留意事項、注意すべきこと

# Pull Requestに書くこと
PRの大雑把な目的
issue のリンク
PRの前提条件
PRで実装、変更、改廃した機能
PRの懸念事項
PRでやりたかったこと(目的)とどうしたか、なぜそうしたか、どのように実現したか
ほかにレビュワーに見て欲しいこと(この書き方ダサくない？もっといいやり方ない？ここどう思う？)

PRを作ったらチャットシステムに簡単な説明付けて依頼
```
@レビュワー URLリンクがタイムラインに貼られた時の概要展開機能のPRです。レビューお願いします
https://github.com/hoge/fuga/pull-request/123
```

こんな書き方したらハリセン
```
@レビュワー https://github.com/hoge/fuga/pull-request/123
```


# merge 
```
git fetch
git rebase origin/source_branch
git checkout source_branch
git merge --no-ff feature_branch
git push origin source_branch
```

`merge --no-ff` は必須。切り戻しが楽になる。


# 良い子のお約束条項
* PRを長時間放置するレビュワーはハリセン
* レビュワーが長時間放置せざるを得ない体勢を作ったリーダーもハリセン
* 着手せず長期放置したissueは信用するな。チェックしろ。特にreadyとdoneの条件が信用できない。必要なら再度issueを作り直せ。
* ブランチは一度切ってから長時間放置するな。鮮度が落ちないうちにmergeしろ。できないならreadyの判断か優先度判断したサイドの能力に問題がある。
* ブランチ切ったからにはデプロイまでしなければいけないという考えは誤りだ。未知の懸念を発見したら手を挙げる勇気を持て。我々はすべてを先に見通す全智の能力は持たないが、新たに見つけた課題に対処する勇気と賢さはあるはずだ。
html5のdraggableをtrに適用してghostが表示されない件

## ghostが表示されないtable

<a class="jsbin-embed" href="https://jsbin.com/lijaxaguve/embed?html,output">JS Bin on jsbin.com</a><script src="https://static.jsbin.com/js/embed.min.js?3.35.0"></script>

## 解決策

td要素に `position:relative;` を適用する

## ghostが表示されるtable

<a class="jsbin-embed" href="https://jsbin.com/focevilizu/embed?html,output">JS Bin on jsbin.com</a><script src="https://static.jsbin.com/js/embed.min.js?3.35.0"></script>