OmniAICreator/Qiita-1.07M huggingface dataset:
「野放しのグローバル変数」からクラスを見つけ出す

　ソースコードのリファクタリングでは「野放しのグローバル変数」というまずいコードの項目がある。

　ソースコードに機能を拡張しようとしている範囲の中に「野放しのグローバル変数」が見つかった。そこからグローバル変数を減らした実作業の中で感じたことを述べたいと思う。

####**・グローバル変数として残ってしまったわけがある。**
　一つの関数の中でしか使われないような変数ならば、そもそもグローバル変数として前任者が書いてしまうこともなかっただろう。
　少なくとも、２つ以上の関数がその変数を用いているということだ。
コード上では依存性のない２つ以上の関数が実は無関係ではなく、密接な関係にあるということだ。「野放しのグローバル変数」に値を与えている側と値を参照している側とがあるだろう。
####**・隠れていたクラスを発見する**
　私が作業したその例では、２つ以上の別々の関数では意味合いが不明だったまとまりが、実は意味のまとまりを持つ単位だった。１つはしかるべき設定を行い、もう一つはその設定を利用したデータの変換を行うものだった。
　値を与えている側がコンストラクタであり、値を参照している側はアクセッサ、コンバータなどとして実装できそうである。「野放しのグローバル変数」はそのクラスの中のデータメンバーとして落ち着くことになった。
　そのような意味が明確になったことで、そのクラスに関するテストを記述できそうなくらいに意味が明確になった。

####**・インスタンスのおき場所を考える**
　次は、発見したクラスのインスタンスを、ソースコードのどこに置くかという点である。
　１つの関数のスコープの中で記述できれば幸いである。
　しかし、時として、そのインスタンスのスコープがグローバル変数として残ってしまうことがある。しかし、それでも、元々の「野放しのグローバル変数」から、グローバルスコープのインスタンスのデータメンバーとしてスコープが狭まっていることに間違いはない。


####**さあ次の「野放しのグローバル変数」に立ち向かおう**
　これで１つの敵に打ち勝ったが、「野放しのグローバル変数」という敵はまだまだ多いままだ。自分が担当する改変に影響する分野の「野放しのグローバル変数」に立ち向かおう。グローバル変数の中から隠れていたクラスを発見するのは簡単な作業ではない。得意としない分野では、間違った解釈をしてしまう危険もある。動いているコードを壊してしまう危険もある。バージョン管理し、テストを書き、設計の健全性を確保しながら進めていこう。

追記：
####**見つけ出したクラスに関連するマクロ定数**
　今回見つけ出したクラスの中でマクロ定数が使われているかもしれない。そのようなマクロ定数が、別のソースファイルの中で残っていることはないでしょうか？　そのような定数は実はマクロである必要はなく、クラスのメソッドで与えられる定数であってよいということはないでしょうか？　そのような場合にはマクロ定数から、クラスのメソッドにより与えられる定数としましょう。
　あるクラスのメソッドの戻り値、あるいは@param[out]である引数の中に、マクロ定数を用いて事前に大きさを知っていなければならないという制約のあるプログラムを書いていないでしょうか？
　プログラムの書き方次第では、そのような制約を外すことができます。そうすると、今回見つけ出したクラスにかかわるマクロ定数を大幅に減らすことができるはずです。


####**実際の泥臭い作業：**
　　既存のコードの中では、メソッドとして切り出すべき部分が、そうでない部分ときれいに分かれているとは限りません。

```cpp:
//期待される型 function(引数のリスト){//「こんな引数の関数があるといいな」の始まり

// return 戻り値
//} //「こんな引数の関数があるといいな」の終わり
```

といったコードをコメントとして書き加えてみます。
既存のコードで、この関数の前の処理になるべきもの、
この関数の処理の後になるべきものを、見極めていきます。

```cpp:
#if 1
元々のコード
#else
新しく作った関数を呼び出すコード
#endif
```

のようにしてゆき、少しずつ動作を確かめながら関数化をしていきます。

\#if文を切り替えても動作することが確認できたら、関数の切り出し・メソッドの切り出しは成功です。
このとき、関数やメソッドの意味が直感的にわかりやすい意味の塊になっているのかに留意します。


何でもかんでもカプセル化するのが良いのではなくて、**ロジックをたどるときに見えた方が理解しやすいものが明確に見えるように**した方がよいと私は考えます。
ですから、メソッドの引数がまったくなくなってしまうほどの抽象化を進めた複数のメソッドというのは、私の好みではありません。


####**クラスへのテストを実装する**
　何らかの意味のまとまりがあってクラスにしたコードなのですから、その意味のまとまりにテストできるはずなのです。コードはどれほど品質が確保されているかが価値なのです。品質が確保されている短いコードこそ価値があるのです。
　だいぶ疲れていて、もう終わりにしたいと思っているかもしれませんが、ここは意地の見せ所です。

 クラスへのテストをCppUnitなどの単体テストの枠組みに入れるときに、テストするモジュール、とりわけヘッダファイルに、テストするのに邪魔な宣言がある場合には、ヘッダファイルを分割するのがよいと思います。
PostgreSQLで基数変換

#### 10進数 → 2進数

```psql
SELECT 33::bit(16);
       bit        
------------------
 0000000000100001
(1 row)
```

#### 2進数 → 10進数

```psql
SELECT '0000000000100001'::bit(16)::int;
 int4 
------
   33
(1 row)
```

#### 10進数 → 16進数

```psql
SELECT to_hex(33);
 to_hex 
--------
 21
(1 row)
```

#### 16進数 → 10進数

```psql
SELECT 'x0021'::bit(16)::int;
 int4 
------
   33
(1 row)
```
ansible_ssh_pass を指定すると公開鍵認証がオフになる件

# tl;dr
`hosts` や `group_vars` などに `ansible_ssh_pass` を指定すると公開鍵認証でのsshがオフになるので、公開鍵認証したい場合はコメントアウトしましょう。

# 検証環境

- ansible 1.8.1 (pip インストール)
- Ubuntu 14.04

ansible 1.9でも同様の動作が発生する事が想定されます(その部分にソースコードに手が加わっていないため)

# トラブル
いくつかのroleごとにユーザのパスワードを設定するplaybookを書いていた際に、sshのパスワードが変更される影響を考慮してhostsファイルに `ansible_ssh_pass` を記載していました。

```
$ cat hosts

[webserver]
web1.local
web2.local
web3.local

[webserver:vars]
vars_file=web.yml
ansible_sudo_pass=foobar
ansible_ssh_pass=foobar
```
サーバ自体には公開鍵認証でアクセス出来るのですが、パスワードも明示しておくか…という気持ちで登録しておくと、公開鍵認証でエラー。

普通にsshすると公開鍵認証に成功していたので、認証している鍵自体に問題は無さそうでした。

# 理由
`ansible_ssh_pass` を記載しているとパスワード以外の認証が無効化されるため。

該当コード
https://github.com/ansible/ansible/blob/release1.8.1/lib/ansible/runner/connection_plugins/ssh.py#L90-L92

ansibleによって生成されるsshコマンドのオプションの中に `GSSAPIAuthentication=no` と `PubkeyAuthentication=no` が付与されるんですね。だから公開鍵認証も通らなかったようです。

# まとめ
不要なパラメータはわざわざ書かないようにしましょう！
Raspberry Piでモノラル音声再生時のChannels count non available

## Raspberry Piでモノラルの音源を再生しようとした場合
たとえば、AquesTalkPiで音声を再生

```
$ ./AquesTalkPi "はろー" | aplay
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 8000 Hz, Mono
aplay: set_params:xxxx: Channels count non available
```
(xxxxには数字)

モノラルの音源を再生した場合に出るエラーのようだ。

## 対処法
以下のように設定ファイルを編集することで再生可能。

``` ~/.asound.rc
$ vim ~/.asoundrc
pcm.!default {
    type hw
    card 0
}

ctl.!default {
    type hw           
    card 0
}
```

## 参考
http://bonkurabombom.blog.so-net.ne.jp/2014-06-14
http://askubuntu.com/questions/587352/no-sound-with-alsa-and-intel-audio-device
cssだけで矢印を作ってみる

cssだけで矢印を作るのが、意外と簡単だったのでやってみました。

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

```css
/**
 * 上向きの矢印を作ってみる
 * 幅を持ったborderを用意して、border-bottom以外の色を背景透過にするばOK
 */
div {
    width: 0px;
    border-color: black;
    border-style: solid;
    border-width: 30px;
    border-left-color: transparent;
    border-top-color: transparent;
    border-right-color: transparent;
}
```

こんな感じになります。

http://jsdo.it/ritukiii/sx48
PostgreSQLで10進数を8進数に変換する関数の作成

PostgreSQLのto_hex()を参考に、10進数の4バイト整数を8進数に変換する関数to_octal()を作成します。

以下の内容のto_octal.cを用意。

```c
#include "postgres.h"
#include "fmgr.h"

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

PG_FUNCTION_INFO_V1(to_octal32);

#define OCTALBASE 8
/*
 * Convert an int32 to a string containing a base 8 (octal) representation of
 * the number.
 */
Datum
to_octal32(PG_FUNCTION_ARGS)
{
	uint32		value = (uint32) PG_GETARG_INT32(0);
	char	   *ptr;
	const char *digits = "012345678";
	char		buf[32];		/* bigger than needed, but reasonable */

	ptr = buf + sizeof(buf) - 1;
	*ptr = '\0';

	do
	{
		*--ptr = digits[value % OCTALBASE];
		value /= OCTALBASE;
	} while (ptr > buf && value);

	PG_RETURN_TEXT_P(cstring_to_text(ptr));
}
```

to_octal.cをコンパイル。
```/PATH_TO_PGSQL```にはPostgreSQLのインストール先ディレクトリを指定。

```bash
$ gcc -fpic -c to_octal.c -I/PATH_TO_PGSQL/include/server
$ gcc -shared -o /PATH_TO_PGSQL/lib/to_octal.so to_octal.o
```

to_octal()をPostgreSQLに登録。

```bash
$ psql
=# CREATE FUNCTION to_octal(INTEGER) RETURNS TEXT AS 'to_octal', 'to_octal32' LANGUAGE C STRICT IMMUTABLE;
```

to_octal()を実行。

```bash
$ psql
=# SELECT to_octal(32);
 to_octal 
----------
 40
(1 row)
```

念のためbcで32の8進数を確認。

```bash
$ echo "obase=8; 32" | bc
40
```
linuxでソースからインストールしたソフトウェアを管理

初めての投稿です。
現在、LinuxのWebサーバ構築を行っているのでその内容をまとめてみます。

勉強のためソースから各種ソフトをインストールしているのですが、インストールしたソフトをアンインストールするのが面倒になるため、ソフトを管理する方法がないか探したところ porg というものがあったのでその内容をまとめます。

# 1. porgのソースのダウンロード
[porg - a source code package organizer](http://porg.sourceforge.net/) の Download It から porg のソースをダウンロードします。

```
# cd /usr/local/src
# wget http://sourceforge.net/projects/porg/files/porg-0.8.tar.gz/download -O porg-0.8.tar.gz
```

# 2. porgをソースからインストール
ダウンロードしたソースを解凍し、 make install を行います。
このとき ./configure でエラーがでる場合があるので、 --disable-grop オプションをつけます。

```
# tar xzvf porg-0.8.tar.gz 
# cd porg-0.8
# ./configure --prefix=/usr/local --disable-grop
# make
# make install
# make logme
```

# 3. porgの各種コマンド
インストール後、porg でインストールしたソフトの管理が簡単に行えます。

* ソフトウェアのインストール（登録）

```
# porg -lD "make install"
```

```op:オプション

 -l        ログを取る＝記録する
 -D        ディレクトリ名をパッケージ名として使う
 -p PKG    PKGをパッケージ名とする
```

* ソフトウェア一覧の表示

```
# porg -a
porg-0.8
```

* ソフトウェアのフォルダの表示

```
# porg -f porg
porg-0.8:
/usr/local/bin/paco2porg
/usr/local/bin/porg
/usr/local/bin/porgball
/usr/local/etc/bash_completion.d/porg_bash_completion
/usr/local/etc/porgrc
/usr/local/lib/libporg-log.a
/usr/local/lib/libporg-log.la
/usr/local/lib/libporg-log.so
/usr/local/lib/libporg-log.so.0
/usr/local/lib/libporg-log.so.0.0.0
/usr/local/share/man/man5/porgrc.5
/usr/local/share/man/man8/porg.8
/usr/local/share/man/man8/porgball.8
/usr/local/share/porg/README
/usr/local/share/porg/download.png
/usr/local/share/porg/faq.txt
/usr/local/share/porg/index.html
/usr/local/share/porg/porg.png
/usr/local/share/porg/porgrc
```

* ソフトウェアの削除

```
# porg -r porg
The following packages will be removed:
  porg-0.8
Do you want to proceed (y/N) ? y
```

# 参考文献
1. porg - a source code package organizer, "http://porg.sourceforge.net/", Online; accessed 1–September–2015.
2. pacoからporgへ - Qiita, "http://qiita.com/pasela/items/9c6cd7b9e477ed0501c8", Online; accessed 1–September–2015.
3. Linux - pacoでソースビルドをパッケージっぽく管理する - Qiita, "http://qiita.com/pasela/items/eea4a9cbbd54ad118d09", Online; accessed 1–September–2015.
Warm Start for Parameter Selection of Linear Classifiersを呼んだ

 # KDD2015 Warm Start for Parameter Selection of Linear Classifiersを呼んだ
## どんなもの？
- 線形分類器の正則化係数を自動で推定する仕組みを作った
- liblinearに入れた

## 技術や手法のキモはどこ？
- CVで推定をしたいが時間がかかるので、warm-startというテクニックで学習時間を高速化した。k-foldならk個の組み合わせができるので、他の組み合わせで推定したパラメータを使って学習を始めることで収束を早くできる。
- 正則化係数の下限と上限を導出した

## どうやって有効だと検証した？
CVによる精度と実行時間の測定

## ref
http://dl.acm.org/citation.cfm?id=2783332
シェルスクリプトのシステムメッセージを表示する関数を作る


小ネタ。

実行可能ファイル形式のシェルスクリプトを想定。

## システムメッセージ？
* 終了結果表示、エラー表示など。
* スクリプトファイル名を含めたい。
* うっかりパイプで拾われたりしないよう、標準エラー出力に出したい。
* あちこちに書くので、関数化しておこう。

## コード例

```sample.sh
#!/bin/bash
# @(#)対象のファイル名をfugaに変更する
# @(#)Usage: $0 [-hp] <target>
readonly SCRIPTNAME="$(basename "$0")"
Usage () {
  what "$0" | sed "s/\$0/$SCRIPTNAME/" 1>&2
}
Notice () {
  echo "$SCRIPTNAME": "$*" 1>&2
}
while getopts hp OPT
do
  case "$OPT" in
    h) # @(#) -h: print help
      Usage
      exit 0
      ;;
    p) # @(#) -p: 変更後のパスを標準出力
      echo "$(dirname "$OPTARG")/fuga"
      exit 0
      ;;
    ?)
      Usage
      exit 1
      ;;
  esac
done
shift $((OPTIND - 1))

if [ ! -e "$1" ]; then
  Notice "[ERROR] 存在しないファイル"
  exit 1
else
  mv "$1" "$(dirname "$1")/fuga"
  Notice "$(basename "$1") を 'fuga' に変更しました"
fi
```

```bash
$ ./sample.sh hoge
sample.sh: hoge を fuga に変更しました
$ ./sample.sh hoge
sample.sh: [ERROR] 存在しないファイル
```

```bash
$ ./sample.sh -p hoge
./fuga
$ ./sample.sh -p hoge | xargs echo "パイプで渡された？: "
パイプで渡された？:  ./fuga
$ ./sample.sh -h | xargs echo "パイプで渡された？: "
./sample.sh
	対象のファイル名をfugaに変更する
	Usage: sample.sh [-hp] <target
	 -h: print help
	 -p: 変更後のパスを標準出力
```
JavaScript配信の二流派：大Script主義と小Script主義

複数のJavaScriptファイルを高速化のためにまとめることがよく行われていますが、突き詰めていけば大きく2つの方向性に分かれていきます。

# 事前案内
タイトルにもしている「大Script主義」と「小Script主義」ですが、百科事典の「大項目主義・小項目主義」になぞらえて**たった今付けた**用語ですので、言葉で探しても確実に見つかりません。また、説明を読んでいけばわかると思いますが、SPAに代表されるような、「フロントフレームワークを駆使して、そもそもあまりページ遷移しないWebサイト」にはあまり当てはまらない内容です。

# 牧歌的だった時代
まだInternet ExplorerのライバルがNetscapeだった頃、それぞれのブラウザは独自にJavaScriptを拡張していっていました。クロスブラウザで動くコードなど望むべくもなく、JavaScriptは業務用途に使うには向かないものでした。当然ながら、膨大な量のJavaScriptを実行する必要も薄く、ファイル直書きでも問題とならないような分量でした。

その後、DOMとしてブラウザ上のオブジェクト操作もある程度安定してきたこと、それでも生まれる隙間を埋めるように各種のライブラリが普及してきたこと、XMLHTTPRequestによってJavaScript独自で通信が可能となったことなどを受けて、徐々にWebサイトのビジネスロジックにもJavaScriptが組み込まれるようになって行きました。

# ファイル数の削減の行き先
回避する技術があるとは言え、本来のHTTPで言えばファイルごとに3Wayハンドシェークが必要となり、さらには1ブラウザあたりのセッション数も限られているため、内容の多寡にかかわらずファイル数が増えれば負荷となります。そこで、ファイルをつなぐことで数を減らす、という手法が取られるようになってきましたが、これを推し進めると、行きつく先は2つに分かれています。

## 大Script主義
1つの考え方としては、「サイト全体で1つのスクリプトファイルにしてしまえば、どのページでも同じファイルをキャッシュから取ってこれるのでダウンロードが一度で済む」、という考え方です。便宜上、「大Script主義」と名づけます。

## 小Script主義
逆に、「表示に必要十分なスクリプトだけ読みこめば、余計なロード時間がかからずに済む」という方向性に進むこともできて、これを「小Script主義」と名付けてみました。もっと推し進めるならば、[Googleでも推奨しているように](https://developers.google.com/speed/docs/insights/PrioritizeVisibleContent?hl=ja)、「最初にはファーストビューに必要なものだけ読み込んでしまって、あとは人間が見ている間にロードする」という戦略もあって、これは「極小Script主義」とでもしておきましょう。

# 利害得失
もちろん複数の流儀があるわけですから、それぞれにメリットデメリットがもちろんあります。

## ファーストビュー
最初に表示するまでの時間は、極小Script主義＜小Script主義＜大Script主義となります。もちろん、遅延ロードなど工夫の余地もあるのですが、そこまで施しているのが極小Script主義です。

## 遷移速度
一方、ページ遷移の速度では、（キャッシュが効いていれば）大Script主義＜極小Script主義＜小Script主義となります。全部読み込んであるので、ページ遷移後にスクリプトを読む必要がなくなってしまいます。

## 通信量
1ページしか読み込まなかった場合の通信量は大Script主義＞小Script主義ですが、複数ページを渡り歩いていくと逆転します。極小Script主義の場合は、遅延ロードで読み込むものをサイト全体のスクリプトにするか、ページごとのにするかで違ってきます。

## 組みやすさ
小Script主義の場合は、そのページで何が起きるかだけ考えておけばいいのに対して、大Script主義では関係ないページにスクリプトが当たるのを防いでおく必要があります。さらに、極小Script主義を取るには、ページごとの最小限の抽出や遅延ロードさせる仕組みなど、考えることはかなり増えてしまいます。

# 具体例
上で触れたように、Googleは極小Script主義を推進しています。一方で、[Rails標準では大Script主義を採用し、さらに読み込みすら省略するTurbolinksを取り入れています](http://qiita.com/jkr_2255/items/46dfc85e6e05bdf1f8e6)。

# まとめ
ファーストビューの速さを取るのか遷移速度を取るのか、はたまた両方狙う代わりに実装の手間をかけるのか。二兎を追うには、相応の技術が必要となります。
emacs の modeline の customize

modeline に載せる内容の編集は http://www.emacswiki.org/emacs/ModeLineConfiguration を参照。

色や font といった見た目をいじるには、`mode-line` 等の face を編集する。`M-x describe-face` で `mode` と入れて `tab` を押せば候補が出てくる。`mode-line` で始まる face 名と `modeline` で始まる face 名が混在しているので注意する。
二行目の最後を「...」をクロスブラウザで実現

文字が溢れたら「...」を出すのは `text-overflow: ellipsis` がありますが、一行の場合にしか利用できません。二行目に「...」を出すのは、 `-webkit-line-clamp` というのがありますが、クロスブラウザでは利用できません。

CSSだけで実現するのは不可能だと思ってたんですけど、出来ちゃいました。

![Screen Shot 2015-09-01 at 9.38.24 PM-minishadow.png](https://qiita-image-store.s3.amazonaws.com/0/38383/1535a889-e737-fcd0-4932-e882b1bb691a.png)

実物は[こちら](http://byodkm.github.io/lineclamp/test/)でご確認ください。

```css:css
.lineclamp {

  /* config */
  line-height: 1.5;
  height: 3em;
  background-color: #fff;
  /* config end */

  position: relative;
  padding-right: 1em;
  overflow: hidden;
}

.lineclamp:before {
  content: "...";
  position: absolute;
  right: 0;
  bottom: 0;
  display: inline-block;
  width: 1em;
}

.lineclamp:after {
  content: "";
  position: relative;
  right: -1em;
  float: right;
  width: 1em;
  height: 100%;
  background-color: inherit;
}
```

IE8はなぜかダメでした。IE9からで。
xpsが動かなかった時の対処法

下記のコマンドで
```
/opt/Xilinx/14.7/ISE_DS/EDK/bin/lin64/xps
```

下記のエラーが出た場合

````
Setting XILINX_EDK=/opt/Xilinx/14.7/ISE_DS/EDK
Environment variable XILINX is not set - A compatible version of ISE tools must be installed and setup for EDK to run.

Press enter to close.
````

下記のコマンドを実行すると自分の環境ではxpsが動作するようになりました。

```
/opt/Xilinx/14.7/ISE_DS/settings64.sh 
```

#参考
http://forums.xilinx.com/t5/Embedded-Development-Tools/Linux-Install/m-p/57116#U57116
cssで背景だけを透過する方法(文字列は透過しない)

背景だけを透過して、文字列は透過したくないっていう時、普通に要素の背景を`opacity`とか使って透過してしまうと文字列まで透過してしまいます。

これを防ぐ為には、`rgba`を使って、透過させると背景だけを透過させることが出来ます。

```html
<div class="all_back">
    <p>opacityを使うと文字まで透過される</p>
</div>

<div class="only_back">
    <p>rgbaを使うと、背景だけ透過に出来る</p>
</div>
```

```css
div.all_back p {
    background: red;
    opacity: 0.3;
}

div.only_back p {
    background: rgba(255,0,0,0.3);
}
```

実際に動かしたイメージを↓に乗せてみたので参考にしてみてください。

http://jsdo.it/ritukiii/h7z1
jquery uncaught typeerrorが出た

特定のページでjqueryが "uncaught typeerror"が出てなかなか原因が分からず困っていた。
思ったよりしょうもない原因だったため、二度と起こさないようメモとして残しておく。

その原因はjquery.jsを複数読み込んでいて、バージョンが異なっていた。
よって1つだけ読み込むようにしたら、あっさり直った。
意味もなくjsは読み込ませるなという教訓ですな。


http://qiita.com/mijabi/items/c68d27bc2ea5642675af
Vagrantで、マシンを捨てて作り直したときにシェルのヒストリが継続されるようにする方法

Bashの場合、環境変数HISTFILEを設定すればヒストリファイルを任意のファイル名にすることができます。


~/.bashrc に下記1行を追記すれば履歴がホストマシンに保存されるので、 vagrant destroyしてマシンを作り直したときに履歴を引き継げます。

```bash:~/.bashrc
export HISTFILE=/vagrant/.bash_history
```

なお、~/.bashrc にこの1行を書き込む処理自体は自動化しておいた方がいいでしょう。
swiftで使ったライブラリのメモ

いまさらだけど、使っているライブラリを本日から精査するためのメモ

#表示
###ボタンにバッチを表示
お知らせの数とかをボタンに表示とかに便利
[BBBadgeBarButtonItem](https://github.com/TanguyAladenise/BBBadgeBarButtonItem)

###ドロワーメニュー
ストリーボードで設定するだけ
[SWRevealViewController](https://github.com/John-Lluch/SWRevealViewController)

###アニメーション
[Spring](https://github.com/MengTo/Spring) 

#レイアウト
AutoLayoutを書くの大変なので
[swift-layout](https://github.com/grachro/swift-layout)

#通信
[Alamofire](https://cocoapods.org/pods/Alamofire)

#ローカルDB
[realm](https://realm.io/jp/)
datadog-agent Integrations適用のメモ

# Datadog Integrationsについて
## Datadog Integrationsとは
Datadogでは様々な情報を取得できます。
Linuxの細かな情報・ミドルウェアの情報などを取得する際にはdatadog-agentを用います。
OSの情報だけではなく、適応するyamlを設置することでミドルウェアの情報も拾えます。
今回は Memcached のIntegrationを行う前提で進めます。
## Datadog Integrationsで目的の数値を取得するには
datadog-agentでどのような情報を拾うかは自ら選択する必要があります。
(OSに関するものなど、一定の既定値はあります)
取得したい情報を選び、Datadogへ送り込むところまでが今回の目的です。

# datadog-agentの構成
## 設定ファイルの設置場所

`/etc/dd-agent/conf.d/` を確認しましょう。
`*.yaml` というファイルはすでに適用されているものです。
`*.yaml.example` はリネーム(コピー)して内容を調整した上で使うことを前提として設置されているサンプルです。
今回はDataDog管理画面よりサンプルを取得する方法を採るため、 `*.yaml.example` は使いません。

# Ingetration設定を作成する
## 導入したい監視項目を探す
![Integrationsここから.png](https://qiita-image-store.s3.amazonaws.com/0/36942/50d89aa7-950a-1e81-cc44-28d2a7174fa6.png)
DataDog管理画面より `Integrations` -> `Integrations` を選択します。
利用できるIntegrations一覧が出てきますので、
![MemcachedのIntegration.png](https://qiita-image-store.s3.amazonaws.com/0/36942/3aafdb88-86e4-beec-3f52-b07561520555.png)
この部分をクリックして次へ進みます。

## サンプルの設定を入手する
Memcache integrationの部分をクリックするとサンプル設定などが出てきます。
![Memcachedサンプル設定.png](https://qiita-image-store.s3.amazonaws.com/0/36942/68dae577-03ac-3426-5c3a-be6d0a8d6dd5.png)
サンプル設定が出てきますので、Integrationを導入したいホストへ設定を追加します。
この際、ファイル名が違うと正しく認識されません。Memcachedの場合、 `mcache.yaml` という名前で登録する必要があります。
![Memcachedサンプル設定の注意点.png](https://qiita-image-store.s3.amazonaws.com/0/36942/14d80e09-f187-7180-48eb-e82c6e13fb04.png)

# 作成したファイルを使用してdatadog-agentをIntegrationに対応させる
# conf.d/ 以下にファイルを設置する

Tagなどは既定値に任せる方向で以下の設定を導入します。

```
cat << EOT > /etc/dd-agent/conf.d/mcache.yaml
init_config:

instances:
    - url: localhost
      port: 11211
EOT
```

# datadog-agentを再起動する
導入した設定を反映するため、datadog-agentを再起動します。

```
service datadog-agent restart
```

しばらくすると、取得した数字がDatdogで確認できるようになります。
Apache Jena Fuseki で Readonly SPARQL Endpoint

# はじめに

[Apache Jena Fuseki 1.3.0](https://jena.apache.org/documentation/serving_data/) を使って Readonly な SPARQL Endpoint を立ち上げる手順を解説します

**追記** Apache Jena Fuseki 2 を使いたいかたは [Apache Jena Fuseki 2 で Readonly SPARQL Endpoint](http://qiita.com/frogcat/items/933ac85214d4943b97a0) をどうぞ

# 1.準備

* Java 7 以上をインストールしておきます
* Fuseki にロードする RDF を用意しておきます

ここでは <https://raw.githubusercontent.com/apache/jena/master/jena-fuseki1/Data/books.ttl> を例として説明しますが、 file: スキームの URL や設定ファイルからの相対パスなんかでも問題ありません。

# 2. Apache Jena Fuseki をインストール

* [Apache Jena のダウンロードページ](https://jena.apache.org/download/index.cgi) に行きます
* Apache Jena Fuseki **jena-fuseki1-1.3.0-distribution.zip** をダウンロードします
* 適当なフォルダに展開します
* **jena-fuseki1-1.3.0** フォルダができるはずです

# 3. Apache Jena Fuseki の設定

* デフォルトの設定ファイルは **jena-fuseki1-1.3.0\config.ttl** です
* これを以下のように編集して保存します


```text:config.ttl
@prefix :        <#> .
@prefix fuseki:  <http://jena.apache.org/fuseki#> .
@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .

[] a fuseki:Server ;
   fuseki:services (
     <#service1>
   ) .

<#service1>
	a					fuseki:Service ;
    fuseki:name			"ds" ; 
    fuseki:serviceQuery	"sparql" ;
    fuseki:dataset		[
		a ja:RDFDataset ;
		ja:defaultGraph	[
			a ja:MemoryModel ;
			ja:content [
				ja:externalContent <https://raw.githubusercontent.com/apache/jena/master/jena-fuseki1/Data/books.ttl>
			]
		] 
    ] .

```

<https://raw.githubusercontent.com/apache/jena/master/jena-fuseki1/Data/books.ttl> の部分を用意した RDF の URL で置き換えてください。

# 4. Apache Jena Fuseki の起動

* 以下のコマンドで起動します
* 起動プロセスのなかで、設定ファイルで指定した RDF がロードされます
* RDF に問題がある場合にはエラーメッセージなどが表示されます
* 大きな RDF を指定した場合には起動に時間がかかります

```console
$ cd jena-fuseki1-1.3.0
$ fuseki-server --config=config.ttl
20:14:38 INFO  Dataset path = /ds
20:14:38 INFO  Fuseki 1.3.0 2015-07-25T17:11:28+0000
20:14:38 INFO  Started 2015/09/01 20:14:38 JST on port 3030
```

* **Ctrl-C** などで停止してください

# 5. Apache Jena Fuseki の起動確認

* SPARQL Endpoint の URL は <http://localhost:3030/ds/sparql> になります
* <http://localhost:3030/> はトップページになっています
* Top > Control Panel > Select DataSet の順にたどると簡易的なコンソールにアクセスできます

このような SPARQL の実行例は

```rq:example
select * where { ?s ?p ?o. }
```

このような URL から得ることができます
<http://localhost:3030/ds/sparql?query=select+*+where+%7B%3Fs+%3Fp+%3Fo.%7D&output=json>
Vimで:makeでpandocを使ってmarkdownからhtmlを出力する設定

特にまとめておくまでもないことなんだけども、健忘録として。
MacOSXとかで

`brew install pandoc`

を実行してpandocをインストールしておく。以下の様なスクリプトを用意。名前は適当に`make_markdown.py`とかにして適当なフォルダにおいておく。

```python
import sys
import glob
import commands

param = sys.argv
if (len(param) == 2):
    f = param[1]
    h = f[0:-3] + '.html'
    command = "pandoc %s -s -o %s" % (f, h)
    commands.getoutput(command)
    quit()
```

vimrcに以下を追加。

```vimrc
au FileType markdown setlocal makeprg=python\ ~/dotfiles/make_markdown.py\ %
```

ここでは、`~/dotfiles/make_markdown.py`に設置した。
これで`a.md`に対して`a.html`のようなファイルを`:make`コマンドで発行してくれるようになる。
もっとリッチなことをしたい方はおそらく[vim-pandoc](https://github.com/vim-pandoc/vim-pandoc)などをインストールした方がよさそう。
サイトの文字コードは揃っているのに意図しない文字化けが起こった話

# 概要

Wordpress のオリジナルテーマを作成する際、
[Bones](http://themble.com/bones/) をベースに使用したらMacで確認した時に日本語が一部文字化けした。
その原因と、解決方法。

# 症状

以下、表示されていた文字の一例。

|入力している文章|ブラウザで表示された文字|
|:----------|----------------------|
|よろしくお願いします|よろしくお願いし&#12348;|
|スタートアッププログラム|スタートアッププロ&#13080;|
|新宿より徒歩10分|新宿&#12447;徒歩10分|

こんな感じでなかなかパンチの効いたサイトに。

# 原因

結論から書くと、CSSのプロパティが原因だった。
以下が該当項目だったので、それぞれコメントアウトして対応した。

```_typography.scss
   -webkit-font-feature-settings: "liga", "dlig";
    -moz-font-feature-settings: "liga=1, dlig=1";
       -ms-font-feature-settings: "liga", "dlig";
        -o-font-feature-settings: "liga", "dlig";
           font-feature-settings: "liga", "dlig";
```

# font-feature-settings ...って何?
CSS3から使えるようになった、新しいフォントオプション。
フォントフォーマットの1つ、OTF(Open Type Font)には組版に必要なタイポグラフィのオプション機能があるらしい。
それをWebでも使えるようにしよう、というプロパティ。
今回の場合、任意の合字の機能をオンにする"dlig"が設定されていために、
たまたま合字となるような文字列が連続して配置していた場合に化けてしまった模様。
日本語で使用する機会が無いからなかなか気づけなかった。。
RPi2でRaspbianを動かしてみた

## download

* [Download Raspbian for Raspberry Pi](https://www.raspberrypi.org/downloads/raspbian/)

## インストール

```bash:32GBに書き込んだ場合
ファイルシス   サイズ  使用  残り 使用% マウント位置
rootfs            30G  2.4G   26G    9% /
```

```bash:4GBに書き込んだ場合(少しパッケージインストールした後)
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root        3.6G  2.5G  935M   73% /
```

## 初回ウィザード

* piユーザのパスワードを設定
* 1 Expand Filesystem
* 8 Advanced Options
  * A1: OverClock : Pi2(1000MHz)に設定
  * A3: GPUへのメモリ割り当てを`16MB`に設定
  * A4: SSHを有効


## puppetmaster

```bash:
wget http://apt.puppetlabs.com/puppetlabs-release-pc1-wheezy.deb
dpkg -i puppetlabs-release-pc1-wheezy.deb
apt-get update
apt-get install -y puppetmaster-passenger
```
【Windows】VisualStudioCode(VSCode)のスニペットを編集する方法

VSCodeのスニペット(Snippets)の開き方をググってもすぐに出てこなかったのでメモ

###1. VSCode起動
 ![image](https://qiita-image-store.s3.amazonaws.com/0/44288/2d4c6ac7-a1d2-b2bf-9336-5cb132c0366b.png)

###2.　F1を押して Sni　と入力
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/ec990d08-b534-6e2b-43b8-ab5fd8f6d51c.png)

###3. Enter.　言語の一覧が出てきます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/97b971c6-5c6a-1a1d-bdbb-c7a3f871ea49.png)

###4. 好きな言語を選んであとは編集するだけです
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/111a947a-862b-f8f0-be76-06cee0d85fce.png)
Apache Zeppelinのビルドでハマった件

##とにかくzepplelin-webがビルドできない
[ERROR] SLF4J: Class path contains multiple SLF4J bindings.
とか
pom.xmlをいじって上記を回避してもnpm関連のエラーとか。
よしんばそれを回避してもgruntのエラーとか。

##うまくいった方法
gitのタグ指定
と
sudoできるユーザでmvnすること

## 具体的な手順
>sudoできるユーザで

`git clone https://github.com/apache/incubator-zeppelin`
`git checkout refs/tags/v0.5.0`
>その時点で存在するtagはgit tag -lで確認

`mvn install -DskipTests -Dspark.version=1.3.1 -Dhadoop.version=1.2.1`
>sparkバージョンとhadoopバージョンは適宜変えてね

`[INFO] BUILD SUCCESS`
以上！
TypeScriptでconsole.log()を使うときの便利メソッド

記事「[console.log()を使うときのおすすめ記述方法](http://qiita.com/tonkotsuboy_com/items/27e20373d4fd16406622)」にて、JavaScriptでconsole.log()を使う場合の問題点とおすすめ記述方法（trace()メソッド）を紹介しました。

今回はそれをTypeScriptでやってみます。ベースは変わらないのですが、TypeScriptでは可変長引数（いくつでも指定できる引数）が手軽に扱えるので、それを踏まえて使いやすく改良しました。コードは以下です。（TypeScript 1.5.3で記述してあります。）

```ts:TypeScript
/** デバッグモードかどうか。本番公開時にはfalseにする */
const DEBUG_MODE:boolean = true;

/**
 * デバッグモードが有効で、console.log()が使える時に、
 * コンソールに文字列を出力します。
 * @param {string[]} ...args 出力したい文字列です。
 */
function trace(...args:any[]):void {
    if (DEBUG_MODE && window.console && typeof window.console.log != "undefined") {
        let str:string = "";
        if (args.length > 0)
            str = args.join(", ");

        console.log(str);
    }
}
```

TypeScriptでは、上記のように引数に「...」を指定することで、可変長引数が使えるようになります。ActionScript 3.0でログを出力するtrace()メソッドというのがありますが、それを真似て作っています。

下記のようにして使います。

```ts:TypeScript
trace("サイン", "コサイン", "Vサイン");  // 「サイン, コサイン, Vサイン」と出力される
trace(100000000, "千万"); // 「100000000, 千万」と出力される
```

## グローバル関数にしたくない場合
グローバル関数では定義したくない場合は、モジュール化（内部モジュール）します。trace.tsファイルにtrace()メソッドを定義し、main.tsに処理を記述するという想定です。

```ts:trace.tsファイル
namespace project {
    /** デバッグモードかどうか。本番公開時にはfalseにする */
    let DEBUG_MODE:boolean = true;

    /**
     * デバッグモードが有効で、console.log()が使える時に、
     * コンソールに文字列を出力します。
     * @param {string[]} ...args 出力したい文字列です。
     */
    export function trace(...args:any[]):void {
        if (DEBUG_MODE && window.console && typeof window.console.log != "undefined") {
            let str:string = "";
            if (args.length > 0)
                str = args.join(", ");

            console.log(str);
        }
    }
}
```

同名の「project」モジュール内から使う場合は、下記のようにして使います。

```ts:main.tsファイル
/// <reference path="trace.ts" />
namespace project {
    export class Main {
        constructor() {
            trace("サイン", "コサイン", "Vサイン");
            trace(100000000, "千万");
        }
    }
}

window.addEventListener("load", (event)=> {
    new project.Main();
});
```

それぞれコンパイルしたjsファイルを、HTMLで読み込んでおきます。

```html:HTML
<script src="main.js"></script>
<script src="trace.js"></script>
```

## 最後に
個人的にはtrace.tsをあらかじめ作っておき、プロジェクトごとに使いまわしています。ログの出力有無はDEBUG_MODE１つで切り替えられるので便利です。よきTypeScriptライフを。
【Unity小技】ToDoをエディタ起動時にログ出力させて忘れにくくする

[UnityEditor.InitializeOnLoad]をつけるとエディター起動時にstaticコンストラクタが実行されます。これを利用します。


```
using UnityEngine;
using UnityEditor;
using System.Collections;

[InitializeOnLoad]
public class ToDoWarning
{
    static ToDoWarning()
    {
        if (EditorApplication.timeSinceStartup < 10f)
        {           
            Debug.LogError("TODO ほげほげ.csの行XXXを直す");
        }
    }
}
```

##結果
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/893d2f3c-3769-9e37-4978-a74ad25ec6e8.png)


エディター起動時にログ出力してくれました。忘れにくくて便利（かも)


##参考リンク
<a href ="http://anchan828.tumblr.com/post/18937916292/unity%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E3%81%BF%E3%81%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%AE%9F%E8%A1%8C">けいごのなんとか - Unityエディタ起動時”のみ”にスクリプト実行</a>
jcifsでlastModifiedやcreateTimeを取ろうとすると0が返ってくる

# 概要
Javaからjcifsというライブラリを使ってWindows共有ファイルにアクセスしたとき、最終更新時間や作成時間の情報がうまく取れなかった問題に関するメモ。

# バージョン情報
```xml:pom.xml
<dependency>
	<groupId>jcifs</groupId>
	<artifactId>jcifs</artifactId>
	<version>1.3.17</version>
</dependency>
```

# 現象
`jcifs.smb.SmbFile#lastModified`と`jcifs.smb.SmbFile#createTime`が`0`を返す場合がある. 正しい値を返す場合もある.

# 解決方法
`jcifs.smb.SmbFile`のコンストラクタを呼び出す前に, 

```java:java
jcifs.Config.setProperty("jcifs.smb.client.attrExpirationPeriod", "0");
```
をどこかで呼び出す（jcifs.Configはjcifsのstaticな設定です）.

# 詳細
`lastModified()`および, このメソッドが呼び出している`exists()`のソースを追うと原因が分かります. 

1. `lastModified()`は`exists()`を呼び出したあと, フィールド`lastModified`の値を返しています.
2. `exists()`の中にはフィールド`lastModified`を更新する処理がありますが, フィールド`attrExpiration`の値が`System.currentTimeMillis()`の返り値よりも大きい場合はこの処理をスキップします. 
3. `lastModified`はインスタンス生成時に（コンストラクタによっては）初期値が`0`にセットされています.
4. `attrExpiration`はインスタンス生成時に`System.currentTimeMillis() + attrExpirationPeriod`の値がセットされています.
5. フィールド`attrExpirationPeriod`の値は`DEFAULT_ATTR_EXPIRATION_PERIOD`によってデフォルト値`5000`が設定されています.

つまりは更新時間情報のキャッシュ処理が原因！　`SmbFile`はインスタンス生成されてから5000ミリ秒経つまでは`lastModified()`で`0`を返し続けます. `attrExpirationPeriod`をデフォルト値`5000`を参照させず`0`を指定してあげればよいので, `jcifs.Config`で`"jcifs.smb.client.attrExpirationPeriod"`に`0`を設定すると, この問題は解決します.
AutoLayoutを使いながらAnimationCurveを自作する

#AutoLayoutでアニメーションカーブを自分で実装したい！
したい

#概要
CABasicAnimationのtimingFunctionでアニメーションカーブを実装するが、CABasicAnimationはAutoLayoutのlayoutIfNeededの自動調整には対応していないのでゴリ押しで頑張る。

#実装
下記のようにStoryboardに配置します。
![スクリーンショット 2015-09-01 19.23.24.png](https://qiita-image-store.s3.amazonaws.com/0/24979/8fa84650-ffd3-74ad-6b87-08530c2ec4b6.png)
赤いビュー：開始位置とサイズ
青いビュー：終了位置とサイズ
緑のビュー：これが動きます
注意：３つのビューはアスペクト比を揃えること。移動ビューをコピーして実装するとやりやすいぞ。

1.３つのビューをIBOutletする

```swift

    @IBOutlet weak var fromView: UIView!
    @IBOutlet weak var toView: UIView!
    @IBOutlet weak var targetView: UIView!
```

2.開始ビューと終了ビューはダミーなので隠す

```swift
        fromView.hidden = true
        toView.hidden = true
```

3.下記のメソッドを呼ぶ

```swift
    func animate(toView:UIView,targetView:UIView,
        fromView:UIView,
        duration:CFTimeInterval,
        timingFunction:CAMediaTimingFunction,
        completion:(finished:Bool)->Void){
            
        var group = CAAnimationGroup()
        group.duration = duration
        group.timingFunction = timingFunction
        group.fillMode = kCAFillModeForwards
        group.removedOnCompletion = false
        CATransaction.setCompletionBlock({ () -> Void in
            if let animation = targetView.layer.animationForKey("base") {
                targetView.layer.removeAnimationForKey("base")
                completion(finished: true)
                return
            }
            completion(finished: false)
        })
        
        let position = CABasicAnimation(keyPath: "position")
        position.fromValue = NSValue(CGPoint: fromView.center)
        position.toValue = NSValue(CGPoint: toView.center)
        
        let scale = CABasicAnimation(keyPath: "transform.scale")
        scale.fromValue = fromView.bounds.width/targetView.bounds.width
        scale.toValue = toView.bounds.width/targetView.bounds.width
        
        group.animations = [position,scale]
        targetView.layer.addAnimation(group, forKey: "base"
    }
```

#結果
![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/24979/91dc37dc-bf71-13b1-fa2b-29e9ae232b9d.gif)
＊わかりやすいように開始と終了ビューを表示しています
Node.js：文字列を区切って、各先頭を大文字にして、連結する。

```
filename = "ada_sdl_dsl";
filename = convertName(filename);


//先頭を大文字にする。
function initialToUpper(str)
{
	return str.charAt(0).toUpperCase() + str.slice(1);
}

//アンダーバーを削除して、次の文字を大文字にする。
function convertName(str)
{
	var buf = "";
	var strlist = str.split('_');
	strlist.forEach( function(s) {
		console.log(s);
		buf += initialToUpper(s);
	})
	return buf;
}
```
act-as-taggable-onを使ってタグを複数投稿する


## 今回すること
タグを簡単に管理することができるgem **act-as-taggable-on**を使ってあるモデル(今回はprototype)を投稿する時、同時に複数のタグをつけられるようにします。

## 使用するファイル
- gemfile
- prototype.rb
- prototypes_controlloer.rb
- tags_controller.rb
- prototype.new.html.haml
- prototype/show.html.haml
- prototype/show.html.haml
- tags/index.html.haml

## やり方

###1 gemのインストール

```ruby:gemfile
gem 'acts-as-taggable-on', '~> 3.4'
```

###2　tagsテーブルを作成する
`bin/rake acts_as_taggable_on_engine:install:migrations`

`bin/rake db:migrate`

###3 モデルにacts-as-taggable-onを追加する

```ruby:prototype.rb
acts-as-taggable-on :prototypes
```

この設定で下記のメソッド
`prototype.tag_list`
が使えるようになります。


###4 入力フォームを作成する

```ruby:prototype.new.html.haml
=form_for(@prototype) do |f|
    = text_field_tag "prototype[tag][]", "", placeholder: "Web Design"
    = text_field_tag "prototype[tag][]", "", placeholder: "UI"
  	= text_field_tag "prototype[tag][]", "", placeholder: "Application"
  = f.submit "投稿する"
```

> = text_field_tag "prototype[tag][]"

ここでtagの後に[](空の配列）を使うことでタグを投稿したときに配列で扱うことができるようになります。


###5　ストロングパラメータを設定する

```ruby:prototypes_controlloer.rb
params.require(:prototype).permit(:title, :catch_copy, :concept, :user_id).merge(tag_list: params[:prototype][:tag])
```

###6　入力したタグを表示する

```ruby:tags_controller.rb
 def index
 	@tags = ActsAsTaggableOn::Tag.most_used
 end
```
> ActsAsTaggableOn::Tag.most_used

で最も使われているタグを取得することができます。most_usedに引数を渡すとその件数分取ってきますが、デフォルトでは20件取ってきます。

#### タグ一覧ページ
```ruby:prototype.rb
acts_as_ordered_taggable_on :prototypes
```
タグ一覧ページで、タグが多い順に表示するようにします。

```ruby:tags/index.html.haml
 - @tags.each do |tag|
   = link_to "#{tag.name}", tag_path(tag.id)
    = link_to tag_path(tag.id) do
      %i "#{tag.taggings.count}" Projects
```

link_toを入れ子にするときは、中のlink_toに *do* をつけ、第一引数をpathにします。


####　プロトタイプ表示ページ

```ruby:prototype/show.html.haml
%ul
  - prototype.tags.each do |tag|
  	%li
      =link_to "#{tag.name}", tag_path(tag.id)
```



##参考

http://ruby-rails.hatenadiary.com/entry/20150225/1424858414
（acts-as-taggable-on）

http://webos-goodies.jp/archives/51387214.html
（paramsを配列で扱う）
[iOS9]CASpringAnimationについて

## 概要 ##
iOS9へのアップデートに伴い、QuartzCoreのCAAnimationに新しく**CASpringAnimation**が追加されます。
名前の通りばねの動きを再現することができ、今まで三角関数とか使って計算してアニメーションしてた部分を自然な感じに吸収してくれるすごいやつ…かも知れません。


## 実装例
CASpringAnimationの初期化例です。

```lang:設定例
CASpringAnimation *springAnimation = [CASpringAnimation animationWithKeyPath:@"position"];
springAnimation.mass = 20.0f;               // 質量
springAnimation.initialVelocity = -5.0f;    // 初速度
springAnimation.damping = 50.0f;            // 振動の減衰
springAnimation.stiffness = 500.0f;         // ばねの弾性力

// アニメーションが終わるまでの時間を取得してセット
springAnimation.duration = springAnimation.settlingDuration;

```

各設定については後述します。

例として、positionの設定を行います。

```lang:いつもの設定
springAnimation.fromValue =
     [NSValue valueWithCGPoint:CGPointMake(beforeX, beforeY)]; // 始点
springAnimation.toValue =
     [NSValue valueWithCGPoint:CGPointMake(afterX, afterY)]; // 終点
springAnimation.removedOnCompletion = NO;
springAnimation.fillMode = kCAFillModeForwards;
springAnimation.delegate = self;

[self.hogeView.layer addAnimation:springAnimation forKey:@"move-layer"];
```

この場合、
**fromValueがばねを伸ばした状態での物体の座標**
**toValueがばねの基点座標**、
となります。最終的にはボヨンボヨン跳ねたあとばねの基点座標で停止します。
つまりこのアニメーションは、ばねに繋がった物体（View）を引っ張り、手を離した際の動きを再現します。

## アニメーションの設定
CASpringAnimationに設定可能な各プロパティです。

**CASpringAnimation.mass**
対象の質量を表します。
大きいほど重い物体であるということなので、ばねは強く引っ張られます。

**CASpringAnimation.initialVelocity**
初速度を表します。
勢いをつけてばねを手放すイメージ。負の値にすると逆方向に力を加えます。

**CASpringAnimation.damping**
減衰率を表します。
大きいほどばねの勢いが弱まる速度が上がります。0だと減衰しないので、ずっとバウンドし続けます。

**CASpringAnimation.stiffness**
ばねの硬さを表します。
大きいほどばねの持つ跳ね返す力が強くなります。なので跳ね返りが鋭くなり、跳ね返るまでの時間が短くなります。

**CASpringAnimation.settlingDuration(readonly)**
ばねが止まるまでの時間を表します。
各プロパティを設定すると、CASpringAnimationはこのばねが止まるまでの時間を中で計算してくれます。
このプロパティをanimation.durationに設定することで、ばねが止まるまでの時間ぴったりのアニメーションを作ることができます。

各プロパティをいじることで、より現実に近いばねの動きを再現できます。


## おわりに
完全に思い通りの跳ね方をさせるには物理的な計算が必要かとは思いますが、
お手軽に跳ねる動きが作れそうです。px単位での調整を行わない場合は使ってみるのもアリかも。
UIViewのanimateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:との比較もそのうちしてみようかなと思います。
Python 2.7.6でsetuptoolsをインストール出来ない

setuptoolsはez_setup.pyでインストールできるわけですが，実際に```python ez_setup.py```でインストールしてみたところ，UnicodeDecodeErrorで落ちてしまうみたいです．Python2.7.6だとsetuptools使えないつらいって状況だと嬉しくありません．大変困ります．本当にPython面倒くさい．

どうやらmimetypes.pyでレジストリを読みに行ってるらしいのですが，非英語圏だと母国語のレジストリが含まれていて，それが原因で落ちてしまうみたいです．対処方法と言えば，Python本体のmimetypes.pyを書き換えるしかありません．しょうがないので，UnicodeDecodeErrorが発生する箇所の例外を握りつぶして対処しました．面倒くさい！

その時のソースコードそのまんま配布しますので，Python27/Lib/mimetypes.pyに以下のソースコードをそのまんま上書きしてください．これでインストールできるようになります．後の影響なんて知りません．

[mimetypes.py](https://gist.github.com/GRGSIBERIA/cc8271cbd5704943e7cd)
[iOS9]UIStackViewについて

## UIStackView

iOS9から、[UIStackView](https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UIStackView_Class_Reference/)というコンポーネントが追加されるので触ってみました。
ざっくり言えば、UIStackViewに子Viewがaddされた時、子Viewの位置、サイズを自動的に決定してくれるという代物です。
UIStackViewは基本的にAutoLayout下で使用する前提のようで、各Viewの制約（Constraints）をもとにサイズの決定などを行います。

## 自動配置ルールの設定
UIStackViewを親Viewとして、子Viewの配置設定は**distribution**というプロパティにより決定されます。

```lang:配置ルールの設定
[self.stackView setDistribution:UIStackViewDistributionEqualCentering];
```

distributionには5つの設定があり、それぞれが以下のようなルールを持っています。

**Fill**から始まる設定では、各子ViewはUIStackViewの向きに従い
領域いっぱいを埋めるように拡大／縮小されます。

* **Fill / UIStackViewDistributionFill**
 * 親Viewのサイズが大きく、子Viewのサイズを広げなければ領域いっぱいにならない場合、子Viewの中で最もContent Compression Resistance Priorityの低いものが拡大されます。
 * 親Viewのサイズが小さく、子Viewのサイズを縮めなければいけない場合、子Viewの中で最もContent Hugging Priorityの低いものが縮小されます。
* **Fill Equal / UIStackViewDistributionFillEqually**
  * 子View全ての高さが等しくなるよう調整します。
* **Fill Proportional  /UIStackViewDistributionFillProportionally**
  * 要調査。詳細に分かり次第追記したいです。
  * 名前やReference的に、中の子Viewのサイズ比が変わらないように拡大縮小するのかなと思ったらそうでもない挙動をする。。

**Equal**から始まる設定では、各子View間の位置関係が設定通りになるようにViewの位置が調整されます。

* **Equal Spacing / UIStackViewDistributionEqualSpacing** 
  * 各子View同士の間隔が等しくなるように位置が調整されます。
* **Equal Centering / UIStackViewDistributionEqualCentering**
  * 各子Viewの中心座標同士の間隔が等しくなるように位置が調整されます。

## addArrangedSubview:
自動配置させたい子Viewをコードから追加する場合、*addArangedSubview:*で行います。
addArrangedSubView:で追加されたViewは、UIStackViewがVerticalなら一番下、
Horizontalなら一番右に配置されます。
またinsertArrangedSubview:atIndex:で途中に差し込むことも可能です。
*addSubview:*では通常通りの子View追加となり、自動配置は行ってくれません。

## removeArrangedSubview:
また、*removeArrangedSubview:*で自動配置対象からそのViewを外すことができます。
**removeArrangedSubview:しただけでは子ViewはUIStackViewから取り除かれません。**
このとき子Viewのサイズ計算は解除され、単純にaddSubView:された状態となります。
子ViewをUIStacViewから取り除きたい場合は、通常通りその子ViewからremoveFromSuperViewを呼び出してやる必要があります。
この場合でも残った子Viewで配置の再計算を行ってくれます。

## hiddenによる子View操作
子Viewに対してsetHidden:などを行った場合も、そのViewが存在しない状態での配置計算を行ってくれます。（AndroidでいうGONEのイメージ）
この機能により、条件分けで表示したりしなかったりするレイアウトの実現がかなり簡単になるかと思われます。

## 設定変更時にアニメーション
各ViewのConstraintが調整されるので、明示的にアニメーションするようlayoutIfNeededを呼び出してやれば滑らかに変化させることができます。
（リサイズされてからアニメーションが始まる場合もあるためView内容に注意は必要そうですが）

```lang:add/remove時にアニメーション
[self.stackView addArrangedSubview:view];
[UIView animateWithDuration:1.0f
                    animations:^{
                        [self.stackView layoutIfNeeded];
                    }
```

hiddenの場合は[UIView animateWithDuration:animations:]で囲えば滑らかにやってくれます。

```lang:hidden操作時にアニメーション
[UIView animateWithDuration:1.0f
                    animations:^{
                         [self.hiddenLabel setHidden:!_hiddenLabel.hidden];
                     }];
```

## おわりに
そのまま使えば勝手に均等配置してくれますし、
最後尾にContent Compression Resistance PriorityとContent Hugging Priorityを最低に設定したダミーViewを置いておけば
名前通りaddしたViewをスタックしてくれて便利そうだなあと思いました。
iOS9からというのがまだ微妙ですが、機会があれば出し分けが必要な場面で使いたいです。
facebook Pluginを使用してfacebook認証のときに、「指定されたurlはアプリケーションの設定で許可されていません」のエラーがでる場合のメモ

下記cordovaプラグインを利用して、facebook連携を行う。
http://plugreg.com/plugin/phonegap/phonegap-facebook-plugin

facebook連携を行うには、<a href="https://developers.facebook.com/" target="_blank">facebook開発者登録</a>を行い、
facebookでアプリを作成しておく必要がある。

![Facebook Developers.png](https://qiita-image-store.s3.amazonaws.com/0/11290/b66ebc7a-7c00-86b8-1b89-9b42f0f99bf5.png)

* facebook開発者登録方法は下記を参考にしました。
http://qiita.com/k_kuni/items/3d7176ee4e3009b45dd8
http://qiita.com/k_kuni/items/5c568e939aaa10bb07b9

* facebookの連携方法は下記を参考にしました。
http://qiita.com/imaimiami/items/7d05f6fc0ae74e191e33


本題ですが、facebookでcallbackを呼ぶ際に下記のエラーが発生。
>指定されたURLは、アプリケーションの設定で許可されていません。


![IMG_0918.png](https://qiita-image-store.s3.amazonaws.com/0/11290/08f92a55-6775-6874-9a0b-d7167cb3b48d.png)


調べたところ「App Domains」にドメインを設定すれば解消するとの記載がありました。

![asumo.png](https://qiita-image-store.s3.amazonaws.com/0/11290/ff470f5b-ef9f-aacf-18e3-1941377784a1.png)

ドメインを入れて試してみましたが解消しませんでした。

##解決策

初歩的な事になりますが、下記に記載されているiOSアプリの登録をすることで解消しました。

http://qiita.com/k_kuni/items/5c568e939aaa10bb07b9

※ドメインの登録は無くてもエラーにはなりませんでした。

以前facebook連携をした際は作らなくてもエラーにならなかった為、不要なのかとおもっていました。。。
Google Analytics トラッキングコード埋め込み


# Wordpress

```php:header.php
<?php 
$server_name = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
if ( strpos($server_name, "YOUR DOMAIN") !== false ) {
?>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-xxxxxxxx-x', 'auto');
  ga('send', 'pageview');
</script>
<?php } ?>
</head>
```

# EC-CUBE
```php:site_frame.tpl
<!--{php}-->
$server_name = isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '';
if ( strpos($server_name, "YOUR DOMAIN") !== false ) {
<!--{/php}-->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-xxxxxxxx-x', 'auto');
  ga('send', 'pageview');
</script>
<!--{php}-->
}
<!--{/php}-->
</head>
```
Goのバッチで統計を取得するAPIを用意しておくと便利

golangで以下のようなKillするまでずっと動くバッチがあるとします。

```go
package main

import (
	"fmt"
	"sync"
	"time"
)

// なんかしらの処理
func someprocess() {
	somedata := []string{"a", "b", "c", "d", "e"}

	var wg sync.WaitGroup
	for _, s := range somedata {
		wg.Add(1)
		go func(val string) {
			defer wg.Done()
			fmt.Println(val)
		}(s)
	}
}

func main() {
	// ずっと動き続ける
	for {
		someprocess()
		time.Sleep(3 * time.Second)
	}
}
```

このとき、この処理の稼働状況を知りたくなるのが人の常なので、以下のようにhttpサーバを立てて、
jsonで統計情報を取得できるようにしておくと便利です。
（統計情報の書き込みでロックが発生しますが、処理量にもよりますがほとんど問題にならないはず。）

```go
package main

import (
	"encoding/json"
	"fmt"
	"log"
	"net/http"
	"os"
	"sync"
	"time"
)

var metrics *Metrics

type Metrics struct {
	sync.RWMutex
	PID          int
	StartedAt    time.Time
	LastWorkedAt time.Time
	LoopCount    int
	DataCount    int
}

func someprocess() {
	somedata := []string{"a", "b", "c", "d", "e"}

	var wg sync.WaitGroup
	for _, s := range somedata {
		wg.Add(1)
		go func(val string) {
			defer wg.Done()
			fmt.Println(val)

			// 詳細な処理の統計を更新
			metrics.Lock()
			defer metrics.Unlock()
			metrics.DataCount++
		}(s)
	}
}

func init() {
	metrics = &Metrics{
		PID:          os.Getpid(),
		StartedAt:    time.Now(),
		LastWorkedAt: time.Now(),
		DataCount:    0,
	}
}

func MetricsHandler(w http.ResponseWriter, r *http.Request) {
	metrics.RLock()
	defer metrics.RUnlock()
	b, err := json.Marshal(metrics)
	if err != nil {
		http.Error(w, http.StatusText(500), 500)
	}

	fmt.Fprintf(w, string(b))
}

func main() {
	go func() {
		for {
			someprocess()

			// 1ループごとの統計を更新
			metrics.Lock()
			metrics.LoopCount++
			metrics.LastWorkedAt = time.Now()
			metrics.Unlock()
			time.Sleep(3 * time.Second)
		}
	}()

	// 実行状況を表示するHTTPサーバを立てる。
	port := 9001
	http.HandleFunc("/metrics", MetricsHandler)
	fmt.Printf("Listening on %d...\n", port)
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", port), nil))
}
```

起動後、[http://localhost:9001/metrics](http://localhost:9001/metrics)にアクセスすると、以下のようなjsonが返ってきます。

```json
{
  "PID": 85568,
  "StartedAt": "2015-08-31T20:41:19.326943122+09:00",
  "LastWorkedAt": "2015-08-31T20:41:43.350825325+09:00",
  "LoopCount": 9,
  "DataCount": 45
}
```

これを監視するとかしておくとよいのではないでしょうか。
Git Shellでのプロキシ設定について

ちょっと気になったツールをインストールして試したいだけなのに、しょっちゅうプロキシ環境で阻止される場面があって、とんでもなくうっとおしい。
頑張って試行錯誤してクリアしたらそのままほっぽらかしてしまって、っていうのが何度も重なってどこがどうなってるかわからなくなってるので、ひとまずGit Shell利用に関連したconfig周りを整理してみました。

## 前提

* プロキシ経由でインターネット接続してる
* Windowsマシン使い

## GitHubがらみのプロキシ

### リポジトリに対するプロキシ設定
下記のコマンドで、カレント・ディレクトリのリポジトリに対してプロキシを設定できます。

```
$git config --local http.proxy http://proxy.example.com:8080
```

実行結果は[リポジトリのディレクトリ]/.git/configファイルに下記のように書き込まれます。

```
[http]
	proxy = http://proxy.example.com:8080
```

なので、上記のgit configコマンド実行でなく、configファイルへ直接書き込んでもプロキシの設定ができます。

### Git全体でのプロキシ設定

複数のリポジトリでやりとりする場合、個別に上記の設定しても良いですが、まとめて利用する設定もできます。

```
$git config --global http.proxy http://proxy.example.com:8080
```

実行すると~/.gitconfigファイルに、
```
[http]
	proxy = http://proxy.example.com:8080
```
と書き込まれます。
なので.gitconfigファイルへ直接（ry

## Windows PowerShell(PS) のプロキシ
Git ShellがPSベースのクライアントなので、いっそのことPowerShell全体でプロキシ設定できないものか試してみました。

```
$Set-Item -path Env:http_proxy http://proxy.example.com:8080
```
この設定だけやってても、git のconfigに設定されてないと、git cloneとかリモート・リポジトリとのやりとりできなかった。
逆にPSの設定してなくても、`git config`の設定だけでgitコマンドでのプロキシ越えは可能。

PSでの設定がだめでも、そもそもWindowsのネットワーク設定だったらどうだ、というので下記試してみた。

```
$netsh winhttp set proxy proxy-server="proxy.example.com:8080"
```
これを設定しててもgitのconfigに設定されていないと（ry

PS利用してる時は、一括してプロキシの設定使えたら楽なのに。


## その他

### .sshのプロキシ設定
~\\.ssh\configファイルで、プロキシ利用設定ができる。

```
ProxyCommand connect.exe -H proxy.example.com:8080 %h %p
```

GitHubはこの設定してなくても使える。
Vagrantでローカルに立てたVMへのssh接続が、ここでプロキシ設定していると失敗するので、コメントアウトしといた。
なんでこんなん設定したんやっけ。。。


## ぼんやり思ったこと
プロキシの設定とか毎回いじるわけではないから覚えにくい。にも関わらず何か試そうとした時に、必ずといっていいほどコケて、その都度プロキシ設定いじるのたまらなく疲労たまる。
クリアしたとしても、個別にプロキシのオンオフ切り替えたりしんとあかんとかなるとめんどいし。

外部接続するツールのプロキシ設定を、まとめて管理できるツールないんかな。
ツールごとにプロキシ設定の仕方が違ってたりして、汎用的にするとなると難しいんやろうけど。
InterfaceBuilderで、UIScrollViewにAutoLayoutを設定すると警告される時の対応

※ Xcode Version 6.4 時点

InterfaceBuilderにて、UIScrollViewの上に適当なviewを配置して、いつも通りのノリでAutoLayoutを設定すると

```
Scroll View
Has ambiguous scrollable content width
Scroll View
Has ambiguous scrollable content height
```

や

```
Ambiguous Layout
Scrollable content size is ambiguous for "Scroll View"
```

といった警告をされることがある。

![スクリーンショット 2015-09-01 16.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/11433/6edb597e-2446-0079-a6c2-809c0ab7a2d5.png)

これは恐らくUIScrollViewのcontentSizeを指定できていないことが原因で、以下の対応で回避できた。

まず、UIScrollViewに対しUIViewを配置し、便宜上contentViewとでも名づけておく。
このcontentViewには親のUIScrollViewに対する上下左右の0マージンに加え、サイズを規定するHeight、WidthのConstraintsも設定してやる。対応は以上。

![スクリーンショット 2015-09-01 16.31.03.png](https://qiita-image-store.s3.amazonaws.com/0/11433/b95b6ca1-c710-a2b6-d21f-63ca93d4f054.png)

設定したHeight、WidthがUIScrollViewのcontentSizeとして扱われるような振る舞いをする。
このサイズを親のUIScrollViewより大きく設定するとスクロールが発生する。
またcontentView上に配置したviewはいつも通りAutoLayoutが設定できる。

![スクリーンショット 2015-09-01 16.33.41.png](https://qiita-image-store.s3.amazonaws.com/0/11433/0a538480-b27f-38d1-901b-f6d7103fdf92.png)
外部キーをreferences型カラムで保存する


## 使い方
refernces型は外部キーを追加する時に使います
今回はtweetsモデルにuser_idを追加します。(*user has_many tweet*)


```rb
class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|
      t.string :text
      t.references :user

      t.timestamps
    end
    add_index :tweets, [:user_id, :created_at]
  end
end
```

`belongs_to`は`references`のエイリアスなので、
> t.references :user

は

```rb
t.belongs_to :user
```

とすることもできます。

## 実践例

###テーブル作成時

`rails g model Tweet user:references`
とすれば、

```rb
class CreateTweets < ActiveRecord::Migration
  def change
    create_table :tweets do |t|
      t.references :user, index: true

      t.timestamps
    end
  end
end
```

一発で出してくれます。ちなみに`references`は`belongs_to`に入れ替えても同じです。

### カラム追加時

`rails g migration AddUserRefToTweets user:references`

で、

```rb
class AddUserRefToTweets < ActiveRecord::Migration
  def change
    add_reference :tweets, :user, index: true
  end
end
```
とできます。

##注意
`references`や`belongs_to`を使うときは、カラムネームを指定する際に_id接尾子をつけません。

##参考
http://tkymtk.hatenablog.com/entry/rails-4-three-way-to-write-migration-2014-1
RailsでRspecを使用するための準備など

# RailsでRspecを使用するための準備など
新規のrailsプロジェクトを作る度に毎度調べながらやっていたので、備忘録的にまとめました。

## Gemfileの設定
以下4つのgemを使用します。追記した後、bundle installを実行してください。

```
group :development, :test do
　・
　・
　・
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'guard-rspec', require: false
  gem 'terminal-notifier-guard'
end
```

これで今回使用する、Rspec, Guard, FactoryGirlはすべてインストールされます。


## Rspecの初期設定
Rspecの初期設定を行っていきます。以下のコマンドで、設定ファイルを生成します。

```
~ bundle exec rails g rspec:install
```

これでrspecコマンドを実行することでテストを実行することができます。
scaffoldなどで適当なcontrollerを作って試していただければと。

```
~ bundle exec rspec
```

## Guardによるテストの自動化
毎度rpsecコマンドを打つのは手間だと思いますので、[Guard](https://github.com/guard/guard)というgemを使って自動化してしまいます。
Guardはspecファイルを保存する度に、自動でテストが実行されます。

以下のコマンドで設定ファイルを生成します。

```
~ bundle exec guard init rspec
```

これでGuardfileというファイルが生成されているかと思います。
この中に監視対象のファイルを記載することで、実行ファイルを絞ることができます。

### Guardの実行
では、実際にGuardを実行してみます。

```
~ bundle exec guard
```

これでguardが待機状態になるかと思います。この状態になったらspecファイルを変更し保存をかけてみてください。guardが自動でファイルの変更を検知し、テストを実行してくれます。

## FactoryGirlによるテストデータの生成
ここまでで簡易的ではありますが、自動でrspecのテストを実行することができるようになったかと思います。
最後にテストで一番面倒な、テストデータの生成に役立つ[FactoryGirl](https://github.com/thoughtbot/factory_girl)を紹介します。

### 概要
FactoryGirlは先ほど説明した通り、テストデータの定義を簡易化してくれるためのgemです。
使い方の流れとしては、以下の通りです。

1. spec/factories以下にファイルを作成し、テストデータを定義
2. テストデータが必要な場面でファイルを読み込んで、使用（この時加工も可能）

#### テストデータの生成
以下のようにしてテストデータを定義していきます。

```
FactoryGirl.define do

  # factory名とModel名が一緒の場合
  factory :user do
    name "yu_0105"
    password "password here"
  end
  
  # factory名とModel名が異なる場合
  factory :admin, class: User do
  	 name "yu_0105"
  	 password "password here"
  end
  
end
```

#### テストデータの呼び出し

先ほど生成したfactoryを呼びためには以下のようにします。

```
user = FactoryGirl.create(:user)
# ハッシュを指定することで上書き可能
user = FactoryGirl.create(:user, { name: 'who?', password: 'password here' })
```

FactoryGirlは他にも様々なテストデータの定義の方法があります。他の手法に関しては、[こちら](http://ruby-rails.hatenadiary.com/entry/20150102/1420174315)のチートシートがとてもわかりやすいです。


## 参考
* [Railsの開発効率を上げる - guard-rspec 自動でテスト(RSpec)を実行させる](http://ruby-rails.hatenadiary.com/entry/20141021/1413819783)
* [[Ruby on Rails]FactoryGirlによるテストデータの準備](http://dev.classmethod.jp/server-side/ruby-on-rails/ruby-on-rails_factorygirl/)
* [RailsでAPIサーバを開発する(AngularJS, Ruby on Rails, SPA)](http://dev.classmethod.jp/server-side/spa_ruby-on-rails_api_angularjs/)
* [Factory Girl Railsのチートシート](http://ruby-rails.hatenadiary.com/entry/20150102/1420174315#factory_girl_cheat_list)
* [Rails でつくる API のテストの書き方（RSpec + FactoryGirl）](http://blog.inouetakuya.info/entry/2013/10/27/200111)
from の select の option は SP(iPhone, Android), IE8 だと display: none しても切り替わらないよ


## 症状

ある select を選択すると、別のセレクトの select の選択候補が限定されたり書き変わったりさせたい。

`< option style='display:none' > hoge < /option >`

とすれば消えるブラウザもあるけど、sp とか IE8 とかだと消えずに残ったりする。

## 解消法

おとなしくケースによって要素ごと入れ替えよう。

jQuery 信者なら

https://github.com/monmonmon/jquery.narrows

を使えばいいと思うし

ベストなのは

http://jp.vuejs.org/

とか使って、値を監視を含めて構造を作り直すのがいいと思う。