OmniAICreator/Qiita-1.07M huggingface dataset:
fatal: protocol error: bad line length character: # /U


```bash:
$ git clone https://github.com/kobake/filydoc.git --recursive
...
fatal: protocol error: bad line length character: # /U
Clone of 'git@github.com:kobake/filydoc-core.git' into submodule path 'public_html/filydoc-core' failed
```

と出た。

```diff:.ssh/config
Host *
-   PermitLocalCommand yes
-   LocalCommand echo \# ~/.ssh/memo/%h; test -r $_ && more $_ && echo
+   #PermitLocalCommand yes
+   #LocalCommand echo \# ~/.ssh/memo/%h; test -r $_ && more $_ && echo
```

これで出なくなった。
弱い参照とな

#今日から始める！弱い参照

`java.lang.ref`パッケージに入っているReferenceインターフェイスとその3つの実装WeakReference,SoftReference,PhantomReference。今日は手始めにWeakReferenceについて見てみます。  

```java:Sheryl.java
package references;

public class Sheryl {
	
	public void sing(){
		System.out.println("生き残りたい"); 
	}

}
```
```java:Main.java
package references;

import java.lang.ref.*;

public class Main {

	public static void main(String[] args) {
		
		Sheryl strongRef = new Sheryl();//①
		WeakReference<Sheryl> weakRef = new WeakReference<Sheryl>(strongRef);//②
		
		strongRef = null;//③

		Sheryl sheryl = weakRef.get();
		if (sheryl != null){
			System.out.println("まだ生きてます");
			sheryl.sing();
		}else{
			System.out.println("消えました");
		}
		sheryl = null;

		System.gc();//④
		
		System.out.println("GCしました");
		
		Sheryl sheryl = weakRef.get();
		if (sheryl != null){
			System.out.println("まだ生きてます");
			sheryl.get().sing();
		}else{
			System.out.println("消えました");
		}
		
	}

}
```

① Sherylのオブジェクトを通常通り生成(これが強参照と呼ばれる参照)
② 上記のオブジェクトに対し、弱参照も生成
　 (Sherylオブジェクトに対し強と弱の2参照がついたことになる)
③ 強参照の方だけ削除、弱参照のみとなる
　 (※参照を消しただけでオブジェクトは消えていないYO！)
④ Sherylオブジェクトは弱参照しか持ってないのでGC(ガベージコレクト)に回収される

```text:結果
まだ生きてます
生き残りたい
GCしました
消えました
```

3.の時点では強参照が消え、弱参照だけが残っています。弱参照を使えばSherylオブジェクトにたどり着くことはできます。こういったオブジェクトのことを「弱到達が可能なオブジェクト」と呼ぶそうです。  
このオブジェクトはGCが来た場合に消されてしまいます。実際、4.以降は弱参照のオブジェクトを通してもSherylオブジェクトにたどり着くことはできなくなってしまいました。  
強参照が残っている場合はなんともないのですが、弱参照のみになってからが独特です。GCが来るまではアクセスできるけど、GCが来たら消えてしまう、というなんとも儚いオブジェクトになってしまうのです。

#どこで使うの…？
弱参照が張られているだけではいつGCされるかわかりません。なので、弱参照だけで運用することはなく、強参照と組み合わせて運用するとメリットが生まれてくると思われます。

メリットというのは、強参照がなくなったらそれに呼応するようにGCされるようにできるってこと。ある意味、強参照がなくなったよという通知を受け、その通知の結果、自分自身も消える、という処理を行っているようなイメージ。

これにより、オブジェクトの消し忘れ、つまりメモリリークを防ぐ一端を担うことができます。

##具体的には…
⇨WeakHashMapで使われています。
WeakHashMapではkeyを弱参照で保持するので、このMap以外にそのキーを参照するものがなくなると、GCされます。ついでに組になってるvalueも消しちゃいます。
~~別にいらないけどできればとっておきたい、というキャッシュみたいなオブジェクトを保持するのに良さそうです。~~
HashMapを使って管理はしたいんだけども、管理対象のライフサイクルまで把握しきれないよ、っていうときに使えそうです。管理対象がなくなればそのMapから消えてくれても全然構わんし、という。

参考：[Java弱参照メモ(Hishidama's Java Weak reference Memo)](http://www.ne.jp/asahi/hishidama/home/tech/java/weak.html)

#SoftReferenceとWeakReferenceってどう違うの…？
SoftReferenceも強参照に比べ弱い参照です。WeakReferenceのオブジェクトは、弱到達可能になったらGCのタイミングで迷わず消されますが、SoftReferenceのオブジェクトは、ソフト到達可能になっても、GCが来たからと言って必ず消されるわけではない、という違いがあるらしいです。

参考：[Javaの理論と実践: ソフト参照でメモリー・リークを塞ぐ](http://www.ibm.com/developerworks/jp/java/library/j-jtp01246/)
>あるオブジェクトに対して残っている参照が、弱参照あるいはソフト参照のみである場合、そのオブジェクトは『ソフト到達可能（softly reachable）』と言われます。ガーベジ・コレクターは、弱到達可能（weakly reachable）オブジェクトを収集するほど積極的には、ソフト到達可能オブジェクトを収集しません。ガーベジ・コレクターは、本当にメモリーを「必要とする」場合のみ、ソフト到達可能オブジェクトを収集するのです。ソフト参照は、ガーベジ・コレクターに対して、「メモリーが非常に不足しているのでない限り、私はこのオブジェクトを保持しておきたい。しかしメモリーが非常に不足しているのであれば、どうぞ収集してください。私はそれに応じて何とかします」と言うための方法なのです。ガーベジ・コレクターは、OutOfMemoryErrorエラーを投げる前には、すべてのソフト参照をクリアーする必要があります。

#まとめ
参照ってそんなに種類あったんですね…。わしゃ知らんかったよ！Phantomについてはまた今度見てみます。
Macでzsh起動時に「compdef: unknown command or service: git」というエラーが出る



以下のコマンドで、解決した。

```bash:shell
$ zsh
compdef: unknown command or service: git
compdef: unknown command or service: git
compdef: unknown command or service: git
compdef: unknown command or service: git
compdef: unknown command or service: git
compdef: unknown command or service: git
compdef: unknown command or service: git
$ compaudit | sudo xargs chmod g-w
There are insecure directories:
$ compaudit | sudo xargs chown root
$ rm ~/.zcompdump*
$ compinit
$ exit
$ zsh
```


## 参考

https://github.com/robbyrussell/oh-my-zsh/issues/630#issuecomment-26227872
【備忘録】Gitのコマンド

今まで使ったことのあるGitのコマンドのメモ。
随時変更していきます。

# リポジトリの初期化

```
$ git init
```

# ファイルの状態の確認

```
$ git status
```

# インデックスに登録

```
$ git add <file>
$ git add .
```

## 同じファイル内でコミットを分けたい時

```
$ git add -p
```

とコマンドを叩くと

```
 <div class="contents">
+<h1>test</h1>
-<h1>TEST!!!!!</h1>
 <p>sample text sample text</p>
Stage this hunk [y,n,q,a,d,/,e,?]?
```

と聞かれるのでとりあえず、y（インデックスに登録）かn（インデックスに登録しない）で。


# インデックスに登録したものを取り消す（git addの取り消し）

```
$ git reset HEAD <file>
```

# リポジトリに記録
-mを付けないと、vimが立ち上がる。

windowsで、コマンドプロンプトなどを使っている人は、シングルクォーテーションではなくダブルクォーテーションを使わないとエラーになる。

```
$ git commit
$ git commit -m 'comment'
```

# リモートリポジトリに登録

```
$ git push <リポジトリ名> <ブランチ名>
```

# リポジトリのコピー

```
$ git clone <url>
```

# リモートリポジトリの変更内容を取り込む

```
$ git pull <リポジトリ名> <ブランチ名>
```

# リモートリポジトリの変更内容を確認する

```
$ git fetch <リポジトリ名> <ブランチ名>
```

# 差分を表示する
ワークツリーとインデックスの差分を表示。

```
$ git diff
```

直前のコミットでの差分

```
$ git diff HEAD^ HEAD
```

# コミット履歴を見る

```
$ git log
```

## -pは各コミットのdiffを表示する

```
$ git log -p
```

# 直前のコミットにファイルを追加したい
追加忘れたファイルをaddしてから。

```
$ git commit --amend
```

# 直前のコミットコメントを変更したい
addとかせずにこのまま。

```
$ git commit --amend
```

# ローカルのファイルはそのままで直前のコミットを取り消す

```
$ git reset --soft HEAD^
```

# ローカルの変更を元に戻す

```
$ git checkout <file>
$ git checkout .
```

# ブランチを確認する

```
$ git branch
```

リモートブランチも確認したい

```
$ git branch -a
```

# ブランチを作成する

```
$ git branch <ブランチ名>
```

## ブランチを作成して、チェックアウトする

```
$ git checkout -b <ブランチ名>
```

## リモートブランチをローカルにチェックアウトする
例）リモートのブランチ名が remotes/origin/test の場合
ローカルのブランチ名はリモートと同じにする、はず

```
$ git checkout -b test origin/test
```

# ブランチを削除する

```
$ git branch -d <ブランチ名>
```

# ブランチ名を変更する

旧ブランチにいる場合は、新ブランチ名だけで良い

```
$ git branch -m <旧ブランチ名> <新ブランチ名>
```

# リモートブランチを削除する

ローカルブランチを消してからpush

```
$ git branch -d <ブランチ名>
$ git push <リポジトリ名> :<ブランチ名>
```

# リモートブランチの一覧を更新する

```
$ git fetch --prune
```

# Gitのユーザー情報設定

```
$ git config --global user.name "name"
$ git config --global user.email "sample@sample.com"
```

リポジトリごとに変更したい場合は、--globalを取る。（git initしてないとだめ）

```
$ git config user.name "name"
$ git config user.email "sample@sample.com"
```

# リモートリポジトリのURLを設定する

```
$ git remote origin <url>
```

# リモートリポジトリのURLを変更する

```
$ git remote set-url origin <url>
```
Go言語: スライス(配列)の要素を取り出す方法



```go:http://play.golang.org/p/fZ15MhTwTf
package main

import (
	"fmt"
)

func main() {
	a := []int{1, 2, 3, 4, 5, 6}
	
	// 最初の要素
	fmt.Println(a[0]) // 1
	
	// 最後の要素
	fmt.Println(a[len(a)-1]) // 6
	
	// index >= 2 ~ index < 4 までの要素
	fmt.Println(a[2:4]) // [3 4]
	
	// すべての要素
	fmt.Println(a[:]) // [1 2 3 4 5 6]
	
	// 最初と最後の要素以外すべて
	fmt.Println(a[1:len(a) - 1]) // [2 3 4 5]
}
```

http://play.golang.org/p/fZ15MhTwTf

## バージョン情報

* golang: go1.3
Volley でオレオレ証明書の検証スキップ

業務で Android アプリを作成していると development (開発) サーバなどで所謂独自 (オレオレ) 証明書を使っていることがよくある。普通に HTTPS アクセスしに行くと SSLHandshakeException がスローされ失敗する。その為証明書検証をスキップして接続する必要が出てくる。当然本番環境ではそのような SSL 証明書は使用されないので、開発環境の為だけの **本来の開発と関係ない作業** をやらされるのが辛い。手っ取り早くやっつけたいところだ。

Volley でどうやるのか分からなかったので調べてみた。`Volley.newRequestQueue()` に詰める HurlStack インスタンスに対してオレオレ証明の検証をスキップする SSLSocketFactory を詰めるといいようだ。

```java
private static SSLSocketFactory getAllAllowsSocketFactory() {
    try {
        // ホスト名検証をスキップする
        HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        });

        // 証明書検証スキップする空の TrustManager
        final TrustManager[] manager = {new X509TrustManager() {

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                // do nothing
            }

            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                // do nothing
            }
        }};
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, manager, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
        return sslContext.getSocketFactory();
    } catch (NoSuchAlgorithmException | KeyManagementException e) {
        throw new AndroidRuntimeException(e);
    }
}
```

このメソッドを以下のように使用する:

```java
final HurlStack stack = new HurlStack(null, getAllAllowsSocketFactory());

// アプリケーションレベルで Singleton 保持するのがよい
sQueue = Volley.newRequestQueue(context, stack);
```
[Phalcon] Vagrant に Phalcon 1.3.2 の開発環境を構築

# 環境

* Vagrant 1.5.4
* VirtualBox 4.3.8
* MacOSX 10.9.2

# VMの立ち上げ

Phalconのセットアップ済みのBoxを、立ち上げる。

```shell-session
$ vagrant init phalconbox https://s3-eu-west-1.amazonaws.com/phalcon/phalcon125-apache2-php54-mysql55.box
$ vagrant up
$ vagrant ssh
```

VMにログインできたら、/etc/hosts.allowをいじります。
sshで弾かれない様に、接続元のIPを入れておきます。
詳しくは[こちら](http://qiita.com/tsumekoara/items/59c988fcb33869f37d08)。

```vim
$ sudo vim /etc/hosts.allows
----

ALL: 127.0.0.1, xxx.xxx.xxx.xxx
sshd: .jp
```

ローカルに戻ります。

# Vagrantfileの設定

```vim
config.vm.network :private_network, ip: "192.168.33.14"
```

コメントアウトされている上記の部分を、コメントアウトを戻して、IPを設定して、保存します。

## VM再起動

設定ファイルを読み込んでVMを再起動します。

```shell-session
$ vagrant reload
```

## ブラウザ確認

http://192.168.33.14/info.php にアクセス。
phpinfo()の結果が表示されているので、
"phalcon" の欄があることを確認します。
バージョンは1.2.5になっているかと思います。

# 最新のphalconをインストール

```shell-session
$ mkdir ~/bin
$ cd ~/bin
$ git clone git://github.com/phalcon/cphalcon.git
$ cd cphalcon/build/
$ sudo ./install
```

## phalconの有効化

1.3.0以降の場合は、上記だけでは動かないので、以下を行います。

```vim
$ sudo /etc/php5/mods-available/phalcon.ini

"----以下追記


```

```shell-session
$ sudo php5enmod phalcon
$ sudo /etc/init.d/apache2 restart
```

再度 http://192.168.33.14/info.php にアクセス。
Phalcon の欄のバージョンが最新のものになっているかと思います。

# Devtoolsのインストール

次に、Phalconの開発に必要な、Phalcon Devtoolsのインストールをします。合わせて、PHPライブラリの依存管理ツールであるComposerも導入します。

```shell-session
$ sudo apt-get install curl
$ cd ~/bin
$ curl -s http://getcomposer.org/installer | php
$ php composer.phar require phalcon/devtools dev-master
$ sudo ln -s /home/vagrant/bin/vendor/phalcon/devtools/phalcon.php /usr/bin/phalcon
```

## コマンドの有効化

```vim
$ sudo vim /etc/php5/cli/php.ini

"---以下追記
extension = phalcon.so
```

apacheをrestartします。

```shell-session
$ sudo /etc/init.d/apache2 restart
```

## コマンドの確認

ヘルプっぽい表示が出たらOK.

```shell-session
$ phalcon

Phalcon DevTools (1.3.2)

Available commands:
  commands (alias of: list, enumerate)
  controller (alias of: create-controller)
  model (alias of: create-model)
  all-models (alias of: create-all-models)
  project (alias of: create-project)
  scaffold
  migration
  webtools

```
[状態マシン図] 直交合成状態

状態は内部に領域を１つ以上持つことができる。以下の図で、状態２は領域を１つ持っていて、その領域には開始疑似状態があり、状態３から始まる。状態２にいるときには、状態３か状態４のどちらかの状態を取る。そのことを状態３ or 状態４という。状態３と状態４はどちらか一方しか取ることができないという意味で、このことを OR状態という。状態３ or 状態４である。

![orth341.png](https://qiita-image-store.s3.amazonaws.com/0/11188/8ff897d2-942b-3091-3c48-07aae63c91d1.png)

次の図では、状態２には２つの領域があり、状態２に遷移すると、２つの領域が同時並行して動作するようになる。直交合成状態と言い、２つの領域が直交している、という。

状態１からイベント２で状態２に遷移したときは、上側の領域は、状態３から始まり、下側の領域は、状態５から始まる。その状態を、状態３ and 状態５の状態という。つまり、状態３かつ状態５の状態であり、このことをAND状態という。

![orth342.png](https://qiita-image-store.s3.amazonaws.com/0/11188/4aee54e9-7038-f98e-dcce-5c6eee786342.png)

上の図と同じことを、直交状態を使わずに表現したのが次の図である。状態２は、状態３and５の状態から始まる。そこからイベント４が起きると、状態４and５の状態に遷移する。

上の図は、状態２の内部に、領域が２つあって、上の領域は２つ、下の領域は３つの状態を持っている。下の図は、状態２の内部に、領域が１つあって、状態が２ｘ３＝６つの状態がある。

このように、直交状態の複数の領域を１つの領域になおすと、それぞれの領域が持つ状態のかけ算だけ、状態があることがわかる。またこういうことも言える。上の図の状態マシンをテストする場合は、下の図のすべてを遷移するテストを書く必要がある、ということである。直交する領域が増えれば増えるほど、描くのは 簡単だが、テストがたいへんになる、ともいえる。

![orth343.png](https://qiita-image-store.s3.amazonaws.com/0/11188/cb6e704d-4f5e-e127-d849-50e7e70adc14.png)

状態の外から、状態の中の領域の中の状態に直接遷移することもできる。下の図で、状態１にいるときに、イベント４がおきると、状態４に遷移する。そのときは、下の領域は、開始疑似状態から始まって、状態５になる。つまり、イベント４が起きると、状態２の、状態４and５から始まる。

入ることができれば、出ることもできる。下の図で、状態７にいるときに、イベント１が起きると、状態１に遷移する。そのとき上の領域は、状態３にいても、状態４にいても、状態２を退場して、状態１に遷移する。

![orth344.png](https://qiita-image-store.s3.amazonaws.com/0/11188/4bca3727-5e68-80ae-f403-f96436aa19d7.png)

このことを、直交状態を使わない図で描くと以下のようになる。合っているかどうか確かめてほしい。

![orth345.png](https://qiita-image-store.s3.amazonaws.com/0/11188/39f5369d-527f-4eec-9c76-a972a9875dfd.png)
CasperJSで、EXCELに貼付ける為のスクリーンショットを撮る


巷ではテスト結果をスクリーンショットをEXCELに貼る、というお仕事があるらしいので、スクリーンショットネタを。
[CasperJS](http://casperjs.org/) を利用して、スクリプトからWEB画面のスクリーンショットをとってみます。スクリプトなので、自動化することも出来ます。

# 環境構築の方法

## 前提

- 環境は Mac OS X (Mavericks) とします。
- インストールには npm を使います。
	- はいってなければ Homebrew 経由でインストール

		```shell
		$ brew update
		$ brew install node
		```

		- Homebrew自体が入ってなければ、Homebrewの[公式ページ](http://brew.sh/index_ja.html)どおり、次のようにインストール

			```shell
			$ ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
			```

			※ 事前に [Xcode](https://developer.apple.com/xcode/downloads/) のインストール(および起動して許諾への同意)が必要

## 環境構築の手順

- [PhamtomJS](http://phantomjs.org/) をインストール

	```shell
	$ npm install -g phantomjs
	```

- 続いて[CasperJS](http://casperjs.org/) をインストール

	```shell
	$ npm install -g casperjs
	```

これで環境構築は完了。

# スクリーンショットをとってみる

[CasperJSのAPIドキュメント](http://casperjs.readthedocs.org/en/latest/index.html)を参考に、CoffeeScriptで書いてみます。

`http://google.com` を開き、検索ワード `hoge` で検索を実行（ここでキャプチャ）、検索結果の最初のリンクをクリックしてまたキャプチャ、という内容です。

```coffeescript:casper-test.coffee
casper = require("casper").create()
	
casper.start()

casper.open("http://google.com")

casper.then ->
  @fill "form[action='/search']", q: "hoge", true

casper.then ->
  @capture "page1.png"

casper.then ->
  @click("h3.r a")

casper.then ->
  @capture "page2.png"
	
casper.run()
```

スクリプトを保存して、次のように実行。

```shell
$ casperjs casper-test.coffee
```

**結果：**

- `page1.png`

	![スクリーンショット 2014-08-05 14.13.29.png](https://qiita-image-store.s3.amazonaws.com/0/35733/346f65b4-fea2-981c-ae6d-9f4335ef9c61.png "スクリーンショット 2014-08-05 14.13.29.png")

- `page2.png`

	![スクリーンショット 2014-08-05 14.13.53.png](https://qiita-image-store.s3.amazonaws.com/0/35733/4c4abcbd-1c49-195e-6480-e2b886d89862.png "スクリーンショット 2014-08-05 14.13.53.png")

	※なぜか背景が透過になった..

# ほか

- なぜか画面幅(ViewPort)の設定が上手くいかなかった。端末のWebKitのバージョンによる？
- 本当は E2E テストで利用したいので^^; 次回はテストについて投稿します。
iBooks で文字列コピーしたとき無駄な引用がついてこまる


- https://gist.github.com/hotchpotch/270c92ddaf359d56b087
 
```rb
#!/usr/bin/ruby
# encoding: UTF-8

if `pbpaste`.match(/“(.*?)”/m)
  target = $1.chomp
  require 'open3'
  puts target
  Open3.popen3( 'pbcopy' ) {|input, _, _| input << target }
end
```

てきとうに文字列消して pbcopy に再度突っ込んでる。本当は clipboard 監視してそれっぽい内容だったら勝手にやってくれると良い。

もっと良いやり方無いかしら…
CentOS6.5 の network restart 時のメッセージを抑止する


#概要
CentOS6.5 では ```service network restart ``` を行うと既に付与されている IP に対して下記のようなメッセージが出力されてしまう。

```
Bringing up interface eth0:  Determining if ip address 10.0.0.1 is already in use for device eth0...
                                                           [  OK  ]
Bringing up interface eth1:  Determining if ip address 172.16.0.1 is already in use for device eth1...
                                                           [  OK  ]
```
もし、既に使っているなら確認してね。
というメッセージらしいです。

特に問題はないのですが、毎回メッセージが出てくるのも気持ちが悪いのでメッセージを出力しないように変更してみます。

# 解決方法
対象のインターフェース設定ファイルに下記を追加する。

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
ARPCHECK=no
```

この ```ARPCHECK=no``` ですが文字通り ARP を check しないということなので万が一、IP を重複させてしまった場合でも network restart 時にフェールセーフが働きエラー終了となりません。

なので ```ARPCHECK=no``` を設定する際は十分に気をつけた上で反映することをおすすめします。

ちなみに ```ifcfg-ethX``` の設定パラメータの doc ファイルは下記に置かれています。

```
/usr/share/doc/initscripts-9.03.40/sysconfig.txt
```

今回の ```ARPCHECK``` の項目を引用しておくと
> ARPCHECKn=yes|no
> If set to 'no', ifup will not try to determine, 
> if requested ip address is used by other machine in network.
> Defaults to 'yes'.

ということで ```default``` だと有効になっているとのことなので明示的に ```ARPCHECK=no``` が必要なようです。

これが根本解決なのかは不明ですが、メッセージ抑止の方法でした。
その他の解決方法をご存知の方はお知らせ頂けると幸いです。
CloudFormationでKinesisのストリームを作成してみたが、Tokyoリージョンに対応したようだ。

# CloudFormationでKinesisのストリームを作成する方法

[AWS::Kinesis::Stream - AWS CloudFormation](http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kinesis-stream.html)

```:Syntax
{
   "Type" : "AWS::Kinesis::Stream",
   "Properties" : {
      "ShardCount" : Integer
   }
}
```

ストリーム名を指定するところが無く悩んだのですが、~~Resourcesで指定するキーがストリーム名になるようです。~~

```json:Kinesis.template
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "Kinesis Demo.",
  "Parameters": {
    "ShardCount": {
      "Description": "Number of Shard count.",
      "Type": "Number",
      "Default": "1"
    }
  },
  "Resources": {
    "SampleStream01": {
      "Type": "AWS::Kinesis::Stream",
      "Properties": {
        "ShardCount": {
          "Ref": "ShardCount"
        }
      }
    }
  }
  "Outputs": {
    "KinesisStreamName": {
      "Value": {
        "Ref": "SampleStream01"
      }
    }
  }
}
```

~~「SampleStream01」がストリーム名になります。~~


このテンプレートをTokyoリージョンに食わせたところエラーとなりました。

```
13:45:05 UTC+0900	CREATE_FAILED	AWS::Kinesis::Stream	SampleStream01	Resource is not supported in this region
```

試しに、US East (N. Virginia)に食わせたところうまくいきました。

~~どうやら、Tokyoリージョンには対応していないようです。どうしよう。。。~~
Tokyoでも動くようになりました！よかったよかった。

## ストリーム名
ストリーム名は命名規則で作られるようです＞＜

```
"CloudFormationのスタック名"-""-"ランダム英数"
Kinesis-SampleStream01-14WQGKJAAOBGB
```

ストリーム名決められないですかね。。。
Sublime Text の Package Control をプロキシ環境 (認証付き) で利用する方法


Sublime Text の Package Control をプロキシ環境 (認証付き) で利用する場合のインストール手順, 設定内容を説明する。


## Package Control のインストール

公式サイトのインストール手順 (Manual) のとおりにインストールを行う。

[Installation - Package Control](https://sublime.wbond.net/installation#Manual)


## 設定ファイルの編集

`Package Control.sublime-settings`　に下記の設定を追加する。

```javascript:Package&nbsp;Control.sublime-settings
"http_proxy": <host>:<port>,
"https_proxy": <host>:<port>,
"proxy_username": <username>,
"proxy_password": <password>
```


### 設定例

- ホスト - `proxy.example.com`
- ポート番号 - `8080`
- ユーザ名 - `username`
- パスワード - `password`


```javascript:Package&nbsp;Control.sublime-settings
"http_proxy": "proxy.server.com:8080",
"https_proxy": "proxy.server.com:8080",
"proxy_username": "username",
"proxy_password": "password"
```
meta-tags で Rails アプリの SEO は万全に

概要
=====

`meta-tags` という gem を利用するととても簡単に、かつクリーンに meta タグを設定することができます。Rails アプリで SEO を行う場合にとても有用です。

実装例
=====

`meta-tags` はコンパクトで取り回しやすい gem です。
そのため個々人で色々な実装方法があるかと思います。

ここでは一例を挙げます。

- デフォルト値を設定する
- 個別 View 内で `title` や `description` を上書きする

という方針。

1. パーシャル内でデフォルト値を設定する
------

まずは meta タグのデフォルト値を設定するためのパーシャルを用意します。

```haml:layouts/_meta_tags.html.haml
%meta{charset: 'UTF-8'}/
%meta{name: 'viewport', content: 'width=device-width, initial-scale=1.0'}

%link{media: 'handheld', rel: 'alternate', href: request.original_url}/

- # 各種メタタグのデフォルト設定
- # 必要に応じて各 View 内で上書きすること
- #
- # 例: set_meta_tags title: "ほげほげ"
= display_meta_tags default_meta_tags
```

この中で `set_meta_tags title: "ほげ"` と設定してもよいのですが、そうすると各 View 内で上書きができなくなってしまうため、デフォルト値の設定のみ行います。

デフォルト値の項目が多いため、ヘルパーに `default_meta_tags` を定義しました。また、定数管理（`Settings`）には [binarylogic/settingslogic](https://github.com/binarylogic/settingslogic) を使っています。このあたりはお好みで。

ポイントとしては `og` 内の `title` に `:title` と設定してやることで、ogp の `title` に meta タグの `title` と同じ値が設定されます。`description` も同様。


参考: [kpumuk/meta-tags](https://github.com/kpumuk/meta-tags#mirrored-values)

```rb:helpers/application_helper.rb
def default_meta_tags
  {
    site: Settings.site.name,
    reverse: true,
    title: Settings.site.page_title,
    description: Settings.site.page_description,
    keywords: Settings.site.page_keywords,
    canonical: request.original_url,
    og: {
      title: :title,
      type: Settings.site.meta.ogp.type,
      url: request.original_url,
      image: image_url(Settings.site.meta.ogp.image_path),
      site_name: Settings.site.name,
      description: :description,
      locale: 'ja_JP'
    }
  }
end
```

作成したパーシャルを `application.html.haml` から読み込みます。

```haml:layouts/application.html.haml
!!!
%html
  %head
    = render :partial => "layouts/meta_tags"
    = stylesheet_link_tag 'application', media: 'all'
    = javascript_include_tag 'application'
    = csrf_meta_tags
```

2. 各 View 内でデフォルト値を上書きする
------

`set_meta_tags` を利用してデフォルト値を上書きします。

```users/edit.html.haml
- set_meta_tags title: "プロフィールの変更"

%div.container
  %div.row
    %...

```

`title`, `description`, `keywords` となどといったヘルパーを利用すると少しスッキリかけます。

```users/edit.html.haml
- title "プロフィールの変更"

%div.container
  %div.row
    %...

```

参考
=====

- [kpumuk/meta-tags](https://github.com/kpumuk/meta-tags#allowed-options-for-display_meta_tags-and-set_meta_tags-methods)
- [meta-tagsとsitemap_generatorで始めるRails 4.1時代のSEO対策 - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/meta-tags-sitemap-generator-rails-seo/)
- [meta-tagsで、metaタグの簡単設定 - rono23](http://blog.rono23.org/20)
第12回本当は怖くないPerl芸勉強会?

[Swift]以外の話題もそろそろ扱いたくなってきたので、[手頃な問題]を。

[Swift]: http://qiita.com/tags/swift
[手頃な問題]: http://blog.ueda.asia/?p=3535
[イントロ]: https://www.slideshare.net/ryuichiueda/20140802uspstudy

[イントロ]7ページ目
> 最初から入っていないコマンドは各ディストリビューションの流儀でインストール

え?それイージーモードすぎない?


というわけで自らにUbuntu 14.04 LTS/OS X 10.9.4に初期状態で入っていないコマンドは一切使わないという条件で解いてみました。

###1. 次のように、画面にバッテンを描いてください。

````sh
$ perl -E 'push@a," "x$_."x"." "x(19-2*$_)."x"." "x$_' \
  -E 'for (0..9); say for @a," "x(10)."x",reverse@a'
````

`banner(1)`を使えば楽勝、と思いきや…

````sh
$ banner
The program 'banner' is currently not installed. You can install it by typing:
sudo apt-get install sysvbanner
````

というわけで正攻法で。

###2. 次のファイルの各行について回文を完成させてください。

````sh
$ perl -Mopen=:utf8 -CIO -plE '$_=substr($_,0,-1).reverse' kaibun
````

###3. ウェブ等からデータを取得して南武線の駅名のリストを作ってください。

````sh
$ wget -q 'http://express.heartrails.com/api/json?method=getStations&line=JR南武線' -O - \
| json_pp | perl -nlE 'say $1 if /"name" : "(.*?)"/'
````

OS X では `wget -q url -O -` の代わりに`curl url`で。

Perl 5.14以降がプリインストールされた環境であれば、`json_pp`は必ず入っています。UbuntuもOS Xもこれは難なくクリアー

###4. 北から順（正確には都道府県番号順）に並べてください。

````sh
$ wget -q 'http://elze.tanosii.net/d/kenmei.htm' -O - \
  | piconv -f sjis -t utf8 \
  | perl -Mopen=utf8 -CIO -nlE 'say$1 if/  <TD>(.*)\(/'
```

`piconv`もPerl 5.8以降がインストールされた環境であれば入っているはずです。

###5. 各行の数字を大きい順にソートしてください。

````sh
perl -anlE '$,="\t";say shift@F,sort{$b<=>$a}@F' input
````

###6. 次のファイルについてグラフを作ってください。

````sh
$ perl -plE '$_="$_\t"."*"x$_' num
````

5.と6.はちょっと簡単杉かなあ。

###7. Q6のグラフを次のように縦にしてください。

````sh
perl -nE 'push@n,$_;$_="*"x$_;$m=length if $m<length;push@l,[split//];' \
  -E 'END{for(1..$m){for$i(0..@l+1){$l.="  ".($l[$i][$m-$_]||" ")}' \
  -E '$l=~s/ +$//;say$l;$l=""}printf"%3d",shift@n while@n;print"\n"}' numonl
````

これが一番泥臭い。まだ改善の余地がありそう。

###8. 次のデータは、何かの試合の結果ですが、各チームが何勝何敗だったかを集計してください

````sh
$ perl -nlE '@a=split/[ -]/;$l=$a[2]<$a[3];' \
  -E '$l{$l?$a[0]:$a[1]}++;$w{$l?$a[1]:$a[0]}++;' \
  -E 'END{say"$_ $l{$_}負"for keys%l;say"$_ $w{$_}勝"for keys%w}' result | sort
````

## まとめ

「シェル芸」といった場合、Perlの利用が反則か否かはビミョーな感じもするのですが、少なくとも

* OSにプリインストールされているコマンドのみを利用
* CPANなど外部モジュールも禁止

というUSPよりも厳しいルールを適用してもなお、LinuxのほとんどのディストリビューションとOS Xでは反則になりません。FreeBSDだと5以降はPorts化されたので反則になっちゃいますが:-p

OS間の微妙な違いを吸収するという点においても有利です。

というわけでawkでがまんしないで、Perl使いましょうPerl!

Dan the Perl Monger
乱数生成

範囲を指定した乱数生成のメモメモ

# random()

```objc
int min = 5
int max = 10
srand((unsigned)time(NULL));
int rNumber = (random() % (max + 1 - min)) + min;
```

シードを与える必要があります。

# arc4random()

```objc
int min = 5
int max = 10
int rNumber = (arc4random() % (max + 1 - min)) + min;
```

一部条件下で偏りがあるらしいです。

# arc4random_uniform(n)

```objc
int min = 5
int max = 10
int rNumber = arc4random_uniform(max + 1 - min) + min;
```

`arc4random()` の改善版？

# NSMutableArrayをランダムに入れ替える
```objc
NSMutableArray *mArray;

for (int i = 0; i < [mArray count]; i++) {
    int n = arc4random_uniform([mArray count] - i) + i;
    [mArray exchangeObjectAtIndex:i withObjectAtIndex:n];
}
```
とつぜんS3にファイルを置きたくなったときに覚えておくこと


「こと」っていうか覚えておくべきコマンド。

## install

もろもろの操作に使う`aws`コマンドをインストールする。

```sh
$ curl -O https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
$ unzip awscli-bundle.zip
$ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
```

## configure

`aws`のサブコマンド`configure`を使うと、id・secret・region等の設定が書き込める。

```sh
$ aws configure
AWS Access Key ID [********************]: XXXXXXXXXXXXXXXXXX
AWS Secret Access Key [********************]: XXXXXXXXXXXXXXXXXX
Default region name [None]: hogehogehoge
Default output format [None]: 
```

または、今後設定ファイルを指定しながら叩くようにする。
実際、ひとりでいくつかのid・secretを取り回すケースはよくあるので、この叩き方のほうがよくあるみたい。

例えば以下。

```sh
$ AWS_CONFIG_FILE=aws.conf aws s3 ls
```

設定ファイルの中身はこんなかんじ。

```
[default]
aws_access_key_id=XXXXXXXXXXXXXXXXXX
aws_secret_access_key=XXXXXXXXXXXXXXXXXX
region=hogehogehoge
```

## バケット・ファイルの一覧

S3でファイルを置く場所は、 **バケット**という単位で扱われている。
いまアクセスできるバケットを一覧するには以下。

```sh
$ aws s3 ls
2013-02-10 19:10:28 example.com
2013-01-02 20:38:30 test1.example.com
2013-02-10 12:10:40 assets.fnobi.com
```

このうちの、あるバケットの中身を参照するには以下。

```sh
$ aws s3 ls s3://example.com
```

## ファイルの操作

ファイルをアップロードすると言うと、`put`とかイメージしてしまうのだけれど、awsで使うのは`cp`。

```sh
$ aws s3 cp hoge.jpg s3://example.com/images/
upload: ./hoge.jpg to s3://example.com/images/hoge.jpg

```

これで`s3://example.com/hoge.txt`ができる。

ただし、このまんまで上げてしまうと、自分からしか読み込めないファイルになってしまう。(厳密に言うともうすこしややこしいけど)
のでので、これをそのままWeb公開したりする場合は、権限をきちんと設定してあげる必要がある。

具体的には、長いけど以下。
(`http://acs.amazonaws.com/groups/global/AllUsers`は、「すべてのユーザー」ってのを示すnamespaceみたいなものらしい)

```sh
$ aws s3 cp hoge.jpg s3://example.com/images/ --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers
```


## 参考

 - [AWS S3 へのファイルのアップロードをコマンドラインから行うAWS Command Line Interfaceを試す - zonomasaの日記](http://zonomasa.hatenablog.com/entry/aws_cli)

 - [cp — AWS CLI 1.3.25 documentation](http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html)
volleyで配列をPOSTしたいとき

Androidデベロッパーの強い味方のVolleyで配列をPOSTする場合のサンプルです。


```java:TestActivity
public class TestActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Request request = new Request<String>(Request.Method.POST, "URL", new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        }) {
            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse networkResponse) {
                return Response.success(new String(networkResponse.data), getCacheEntry());
            }

            @Override
            protected void deliverResponse(String response) {

            }

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String,String> postParams = new HashMap<String, String>();
                //POSTパラメーターに配列入れる
                postParams.put("hoge[0]","param1");
                postParams.put("hoge[1]","param2");
                return postParams;
            }

        };
        request.setRetryPolicy(new DefaultRetryPolicy(
                DefaultRetryPolicy.DEFAULT_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        request.setTag("TAG");

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(request);
    }
}
```
カスタムフィールドに改行を入れ、変数に代入して再構築するとMTSetVarsでエラー

MTで記事作成中に突然記事作成できなくなって困った。

### エラー内容

[日々のweb業務記録-prostaff-: 100613](http://diary-ps.blogspot.jp/2010/06/100613.html) の方と似ていて、

```
記事「XXX」の再構築中にエラーが発生しました: 
テンプレート「記事」の再構築中にエラーが発生しました:
 <mtinclude>タグでエラーがありました: 
モジュール「YYY」でエラーが発生しました: 
テンプレート「YYY」の再構築中にエラーが発生しました:
<mtsetVars>タグでエラーがありました: Invalid variable assignment: ZZZ
```

### 原因

問題のコードは

```html:code
<mt:setVars>
 desc=<mt:EntryExcerpt>
</mt:setVars>
```

元々用意されている 概要のカスタムフィールドに改行を入れて、その変数をテンプレートに引用したときに、改行後の文字列が変数とみなされて「Invalid variable assignment」エラーとなっていたようだった。

### 対応方法

改行自体をなくしたい場合は下記

```html:code
<mt:setVars>
  desc=<mt:EntryExcerpt strip_linefeeds='1'>
</mt:setVars>
```

改行は残しておきたい場合は下記

```html:code
<mt:setVarBlock name='desc'><mt:EntryExcerpt></mt:setVarBlock>
```

で解決できる。

### 参考

* [strip_linefeeds | グローバル・モディファイアリファレンス](http://www.movabletype.jp/documentation/appendices/modifiers/strip_linefeeds.html)
Selenium Webdriver(Ruby) で操作対象ウィンドウを切り替える方法

リンク押下で新しいウィンドウが開くタイプのページのテストで使う。
日本語でぐぐって出てくる情報が古いのでメモ。

# 動作確認したバージョン
* selenium-webdriver : 2.42.0
* Chrome : 36
* chromedriver : 2.10

# やり方

```rb:sample
# 新しいウィンドウを開くボタン押下
@driver.find_element(:id, "open_new_window_button").click

# 操作対象を新しいウィンドウに切り替える
@driver.switch_to.window(@driver.window_handles.last)
```

# 参考URL
■ruby - How do you get window titles, ids, and names in selenium-webdriver? - Stack Overflow
http://stackoverflow.com/questions/9692460/how-do-you-get-window-titles-ids-and-names-in-selenium-webdriver
JS:  for文パターン

##■概要
javascriptのfor文に関していくつかのパターンがあるが、data内のすべてのプロパティに対して処理を行う時、最も効率のよい方法を調べてみたのでまとめる。

##■for文の引数
for文には3つの引数が設定可能です。

```js:for文引数
for('引数1','引数2','引数3'){
   //〜処理内容〜
}
```

**引数1:** for文の開始前に実行されます。下記の様に省略可能です。
　　　　　　`for(;i<l;i++){}`
**引数2:** for文内部処理の実行前に評価されます。引数2がtrueであれば、内部処理が実行されます。
**引数3:** for文内部処理実行後に実行されます。下記の様に省略可能です。
　　　　　　`for(var i=0;i<l;){ i++ }`

##■パターン別の比較
**前提①:** dataは配列とする
**前提②:** 対象は data 内のすべてのプロパティとする

###1. 初心者向けの本によく紹介されているパターン

```js:for①
for(var i=0;i<data.length;i++){
   //対象データへのアクセスは data[i] の様な形式
}
```

上記が定石として知られると思いますが、上記の場合、for文内部の処理が呼ばれるたびにl.length(data.length)の参照・取得が行われるので効率が良くないです。

###2.上級者向けによく紹介されているパターン

```js:for②
for(var i=0,l=data.length;i<l;i++){
   //対象データへのアクセスは data[i] の様な形式
}
```

上記の場合、for文をスタートする前に l に対して data.length を格納するので、効率がよい。

```js:for③
for(var i=0,d;d=data[i];i++){
   //対象データへのアクセスは d のみで行える
}
```

上記の利点は data[i] の様な面倒な表記をせずに済む。ただ注意点としては、`data[i]` が `true` であるかを評価するので、判定が `false` になる値がプロパティに含まれる場合には使わない方がよい。
判定が false になる値に関しては下記を参照してください。


##■参考文献
http://www.w3schools.com/js/js_loop_for.asp
https://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml
文字列キーだけでなく数値キーもきっちりマージさせる（CakePHP編）

## 背景

GET/POST リクエストのパラメータやセッション、データベースのデータ等との同期をとるためによく配列のマージを使うが、```Hash::merge()``` で全部いけるかと思ってたら数値キーはマージされずにどちらも残ってしまい、マージを繰り返すうちに配列の要素がどんどん増えてしまうといった現象が発生してしまっていた。

（参考）
[PHP の array_merge() や array_recursive() 等の違いをまとめました | Tips Note](http://www.tam-tam.co.jp/tipsnote/program/post4067.html)

キーが数値型であっても、同じ値のキーについてはマージする配列の値で上書きするようにしたい。

## 実装

```Hash::flatten()``` でマージする／される配列を一度１次元配列へと平坦化し、マージして ```Hash::extend()``` で元に戻す。こうすることで、平坦化された配列のキーは（多次元配列であれば）全て文字列キーになるので、上書きマージが可能となる。

## コード

```php
public function arr_merge_overwrite( $array1, $array2 ) {
    // マージする／される配列を平坦化する
    $array1 = Hash::flatten( $array1 );
    $array2 = Hash::flatten( $array2 );

    // マージ
    $return = Hash::merge( $array1, $array2 );

    // マージした配列を通常の配列に戻す
    return Hash::expand( $return );
}
```

## 動作例

```php
// 対象データ
$a = array(
    0 => 'blue',
    1 => 'red',
    'a' => 'cyan',
    3 => 'yellow',
);
 
$b = array(
    1 => 'orange',
    2 => 'green',
    3 => 'purple',
    'a' => 'white',
    'b' => 'black',
);

// 出力
var_dump( arr_merge_overwrite( $a, $b ) );

// array(
//     0 => 'blue',  // $a の値
//     1 => 'orange',  // $b の値（$a の値をマージ）
//     'a' => 'white',  // $b の値（$a の値をマージ）
//     3 => 'purple',  // $b の値（$a の値をマージ）
//     2 => 'green',  // $b の値
//     'b' => 'black',  // $b の値
// );

```
## 余談
CakePHP 以外でも使いたいので、標準の関数のみでうまくやる方法があったら知りたいです。
（愚直なやり方としては flatten(), expand() を移植すればどの環境でもできるが、、、）
Ajax のシーケンス図

コールバックと非同期処理の表現方法にいつも悩むので、Ajax の流れをシーケンス図にしてみました。

![Ajaxシーケンス図.png](https://qiita-image-store.s3.amazonaws.com/0/40662/99a4c5d7-b41a-0737-46dc-455eb18d8600.png)
Check! Updated IAM Console - AWS IAMコンソールがアップデート

IAMコンソールがアップデートされたそうです。
http://aws.amazon.com/blogs/aws/updated-iam-console/

8/5 10:20 現時点で、日本語ブログがまだのようなので、とりいそぎ、和訳してみました。

# Updated IAM Console

> If you are an [AWS](https://aws.amazon.com/) user, I sincerely hope that you are using [AWS Identity and Access Management](https://aws.amazon.com/iam/) (IAM) to control access to your services and your resources!

AWSユーザなら、AWSのサービスやリソースへのアクセスコントロールのために、 AWS Identity and Access Management (IAM) を利用していることと思います。

> As you probably know, you can create AWS users and groups and use permissions to allow and deny access to many aspects of AWS.

おそらくご存知だと思いますが、あなたは、AWSユーザやグループを作成して、AWSの諸々へのアクセスの許可・制限を行うためパーミッションを利用することができます。

> Today we are launching an update to the IAM console to make it even easier for you to mange your IAM settings, even if you, like many other AWS customers have created hundreds of IAM users, groups, roles, and policies.

本日、IAMコンソールのアップデートをローンチし、これにより、あなた自身や他のAWSカスタマーが作成した数百ものIAMユーザ、グループ、ロール及びポリシーなどのIAMの設定を、より簡単に管理できるようになりました。

> The redesigned console streamlines management of large resource lists, eliminates the need to switch between tabs to accomplish common tasks, and offers a better experience on mobile devices.

このコンソールの再設計は、多くのリソースリストの管理を効率化し、共通のタスクにこなすためタブ間をスイッチする必要がなくなり、モバイル端末でも快適にお使い頂けます。

> The new __Security Checklist__ will help you to implement the recommendations for IAM best practices; the dashboard is cleaner and simpler, and you can now scroll through long lists of resources without the need to page back and forth.

新しい__セキュリティチェックリスト__が、IAMのベストプラクティスのための推奨設定ができるように手助けをします。このダッシュボードは明確でシンプルであり、あなたは、ページを行ったり来たりすることなく、長いリストをスクロールで見ることができます。

> The sign-in link for IAM users is now more prominent.

特に、IAMユーザのサインインリンクは、役立ちます。

> To learn more, read [Introducing the Redesigned AWS IAM console ](http://blogs.aws.amazon.com/security/post/TxDBR7YK3795FL/Introducing-the-Redesigned-IAM-Console)on the [AWS Security Blog](https://blogs.aws.amazon.com/security/).

詳細は、[AWS Security Blog](https://blogs.aws.amazon.com/security/) の [リデザインされたAWS IAM コンソールの導入](http://blogs.aws.amazon.com/security/post/TxDBR7YK3795FL/Introducing-the-Redesigned-IAM-Console) をご覧下さい。

# Epilogue

これを機に、IAMをしっかり使えるように再確認して行きたいです。
誤訳、ご祈祷ございましたら、ご連絡頂けると幸いですm(_ _)m
Provisioning profile のUUID一覧を知る方法

provisioning profile のUUID 一覧を知りたくてググると http://qiita.com/sngmr/items/7ae88639eb6b9abe07a6 で書いてます。

が、コマンドラインの空エンターでは

```TypeError: Object true has no method 'toLowerCase'```

とエラーがでて見れなかったのですが、`ti info` で見れました。
てか`ti info` すごい情報詰まってるので一度見てみる価値ありです。
JavaScriptのGetter/Setter 〜 JSおくのほそ道 #018

こんにちは、ほそ道です。

今回はJavaScriptのGetterとSetterについてやって行きます。

[目次はこちら](http://qiita.com/setzz/items/ad9a9c99a4fda041a563)

# Getter

## Getterの仕様

それでは早速、Getterの定義から。

```js:Getterの定義
var man = {
  firstName: '',
  lastName: '',
  get fullName() {
    return this.firstName + ' ' + this.lastName;
  },
};
```

`get`というキーワードを使用します。
下記の様な感じで使用できます。

```js:Getterの使用1
man.firstName = 'Bill';
man.lastName = 'Gates';
console.log(man.fullName);  // Bill Gates
```

まあ予想通りの動きになります。
次にfullNameプロパティに直接アクセスしてみましょう

```js:Getterの使用２
man.firstName = 'Bill';
man.lastName = 'Gates';
man.fullName = 'Steve Jobs';
console.log(man.fullName);  // Bill Gates
```

下から二行目のman.fullNameへの代入は華麗にスルーされました。
ちなみに`use strict`してstrictモード上で実行すると`man.fullName = 'Steve Jobs';`とアクセスした時にTypeErrorが発生して怒られます。
fullNameを直接セットする事は出来くなります。

```text:TypeError
TypeError: Cannot set property fullName of #<Object> which has only a getter
```

# Setter
## Setterの仕様

続いてSetterもやっていきましょう。

```js:Setterの定義
var man = {
  _age: 0,
  get age() {
    return this._age;
  },
  set age(val) {
    console.log('[debug]age=' + val);
    this._age = val;
  }
};
```

今度は`set`のキーワードを使用します。
また、Setter宣言時には必ずしもGetterを宣言する必要は無いのですが(strictモードでも動く)、お作法的にはGetterも宣言するべきなようで、しておかないとJsLintからは注意されました。

## Setterの注意点

Setterはなにがしか別名の変数に値を保存する必要があります。
例えば

```js:動かないSetter
var man = {
  get age() {
    return this.age;
  },
  set age(val) {
    this.age = val;
  }
};
```

上記のようにすると代入時に再帰的にSetterがコールされて無限ループのようになりスタックサイズ超過が発生してしまいます。

# Getter/Setterのメリット

この仕組みがどんなときに効力を発揮するのか考えてみました。

- データのカプセル化をコンストラクタ宣言せずに、オブジェクトリテラルで行う事ができる

- データゲット時にイベント的にログを吐く等追加処理が行える


# カプセル化

下記のように関数でくるんでデータ保存先の変数を隠蔽すると、カプセル化できます。

```js:クロージャでカプセル化
var man = (function() {
  var _age = 0;
  return {
    get age() {
      return _age;
    },
    set age(val) {
      _age = val;
    }
  }
}());
```

あと、下記のようにすると一見、うまいことSetter/Getter内でageという変数が使われているように見えなくもないですがグローバル空間にage変数が宣言されてしまっているので気を付けましょう。

```js:グローバル汚染に気をつけろパターン
var man = {
  get age() {
    return age;
  },
  set age(val) {
    age = val;
  }
};
man.age = 10
console.log(age);  // 10
```

# アンチパターン

Getter/Setterに関して、追加処理を行う事が出来ますが、この場合にやらない方が良さそうな事を挙げておきます。

**×：Setterで引数の値を書き換える**
-> まず利用者からは状況がつかめず想定外が発生する可能性が高まります。

**×：Setterで値チェックを行い、不正な場合に`throw new Error`する**
-> 結果的に代入文をtry〜catchすることになりかなり不自然になります。エラーを発生させるならsetAgeなどの関数にした方が良いでしょう。

# オブジェクト定義後にGetter/Setterを追加する

最後に、ここまでset/getキーワードを使用したやり方を紹介してきましたが
このやり方はオブジェクト定義時にSetter/Getterを併せて定義する必要があります。
オブジェクト定義後にGetter/Setterを追加する事も出来るのでこちらも見ておきます。

```js:オブジェクト定義後にGetter/Setterを追加
var man = {
  _age: 0
};

man.__defineGetter__('age', function() {
  return this._age;
});
man.__defineSetter__('age', function(val) {
  this._age = val;
});
```

`__defineGetter__`、`__defineSetter__`という関数を使います。
※非標準なメソッドでIEでは搭載されていません
ただし、このやり方だと内部でデータを持っている_ageをカプセル化出来ないように思います。
ココがずっと悩ましいなーと引っかかっているので上手く出来たら追記します。

今回は以上です。
パターン認識をやってみた

##パターン認識とは？
簡単に言うと特徴をみつけて，それが何なのかを特定すること．
人間は認識能力が高いので，直感的に特徴を見つけて特定ができるが，機会は特徴の出てくる部分を抽出してやらないといけない．
特徴のある長さや大きさを特徴量といい，複数の特徴量をまとめたのを特徴ベクトルと言う．
それに対して分類する集合のことをクラスと言う．

授業でよく言われた例はサケとスズキの判断をヒレや体の長さから特定するというもの．
この場合の特徴ベクトルはヒレ長と体長で，クラスがサケとスズキとなる．

一切の情報がない状態で判断はできないので，ある程度学習してからでないとつかえない．

##パターン認識の手法
レポートでやったのは最尤推定法とK-NN法．
他にも色々あるけど割愛．

####最尤推定法
最も尤もらしいところに属すると推定する方法．
特徴量が正規分布などで分布しているとして，判断するものの特徴ベクトルがどのクラスに属する確率が高いか，で判断する．
正規分布を用いるので平均や分散などを用いる．
似たものにベイズ推定があるが，結局違いがわからなくなった．

####K−NN法
K個の最も近いもの(nearest neighbor)を選んで推定する方法．
学習したサンプルデータのうち，判断するものと近いものをいくつか集め，その多数決でクラスを特定する．
特徴ベクトル同士の距離を測って短いものから選んで，最も多かったクラスに属するとする．
Scalaコードリーディングあるある

# はじめに
Scalaコードを読んでいると、たまに「あれ、なんで動くの？」みたいになる時があります。そんな時は決まってアレのせいなんですが。
まずは問題のScalaコードを。

```scala
val m = Map(1->"one", 2->"two")
val mOpt: Option[Map[Int, String]] = Some(m)

mOpt.get(1) // one: String
mOpt.get(2) // two: String
```

# おかしいところ
ぱっと見、このコードは問題無さそうなんですが、よく見るとおかしい。
おかしい箇所は

- Optionにgetメソッドはあるものの引数を取るgetメソッドはない
- Mapにはkey値を引数に取るgetメソッドはあるものの、戻り値はOptionで返ってくるはずなのにこの場合はStringが返ってくる

うーん、、なんで？？

# 答え
上記のコードを分解して書くとこうなります。

```scala
val m: Map[Int, String] = mOpt.get
m(1) // one
```

一行で正確に記述するとこうですね。

```scala
mOpt.get.apply(1)
```

Scalaではapplyメソッドは省略できます。

知らないと意味不明すぎてScalaコワイとなると思いますが、知っててもよく「あれっ」ってなります。
0.1秒で「ああ、applyでしょ」って言えるようになりたい。

今回のは特にOption#getとMap#getがapply効果で余計分かりにくくなるというapply系の中でも分かりにくい方だとは思います。

ちなみに上記はapplyで呼んでいるので、当然存在しないkeyを引数に渡すとExceptionが出ますので要注意。

```scala
mOpt.get(3)

java.util.NoSuchElementException: key not found: 3
  at scala.collection.MapLike$class.default(MapLike.scala:228)
  at scala.collection.AbstractMap.default(Map.scala:59)
  at scala.collection.MapLike$class.apply(MapLike.scala:141)
  at scala.collection.AbstractMap.apply(Map.scala:59)
  ... 32 elided
```
Linux上のGRUB 2がブートできなくなったときの対処方法

あるある。あるよねーこういうこと。
https://jp.linux.com/Linux%20Jp/tutorial/418275-tutorial20140625

写経しておこう：

```
ls
set prefix=(hd0,1)/boot/grub
set root=(hd0,1)
insmod normal
normal
insmod linux
ls /
ls /boot
linux vmlinuz root=/dev/sda1
initrd initrd
boot
```

続きが大事だ：

```
update-grub
grub-install /dev/sda
```
Amazon RDSのdb.t2ファミリー対応状況(東京リージョン 8/5現在)


[Release: Amazon RDS on 2014-08-04](http://aws.amazon.com/releasenotes/5512337710819885)でAmazon RDSにdb.t2ファミリーが追加になった模様だが、エンジンによっては(少なくとも)まだ東京リージョンには来てないのもあるようなのでメモ。順次アップデートしようと思います。


##MySQL：◎
![スクリーンショット 2014-08-05 8.49.39.png](https://qiita-image-store.s3.amazonaws.com/0/11653/8c9483ca-3e4c-c977-9a1b-7350f97f4595.png "スクリーンショット 2014-08-05 8.49.39.png")

※ MySQLは現在5.6のみT2インスタンスファミリーがローンチしており、5.1/5.5については後日対応予定とのことです。

[【AWS発表】Amazon RDSでT2インスタンスタイプを選択可能に](http://aws.typepad.com/aws_japan/2014/08/rds-support-t2.html)

##PostgreSQL：◎
![スクリーンショット 2014-08-05 8.50.52.png](https://qiita-image-store.s3.amazonaws.com/0/11653/5ef4c982-06aa-1343-ed19-60f406668aa7.png "スクリーンショット 2014-08-05 8.50.52.png")


##Oracle Database：×
全面的にまだ来てない
###Enterprise Edition(BYOL)/Standard Edition(BYOL)/Standard Edition-1(BYOL)/Standard Edition-1(liscence-included)
全て対応してない
![スクリーンショット 2014-08-05 9.09.35.png](https://qiita-image-store.s3.amazonaws.com/0/11653/957fcc5a-e0b7-2314-3efd-18b6c138b790.png "スクリーンショット 2014-08-05 9.09.35.png")


##SQL Server：△
###Enterprise Edition(BYOLのみ)/Standard Edition(BYOL)：◎(t2.microのみ対象外)
![スクリーンショット 2014-08-05 8.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/11653/dc753b8a-39cf-9775-489d-38dbf52e9c6f.png "スクリーンショット 2014-08-05 8.51.34.png")

###Standard Edition(liscence-included)：×
![スクリーンショット 2014-08-05 8.52.09.png](https://qiita-image-store.s3.amazonaws.com/0/11653/bad2f8bd-2207-c4fe-c36e-b2c43eacb2ed.png "スクリーンショット 2014-08-05 8.52.09.png")

###Web Edition(liscence-includedのみ)：◎(t2.microのみ対象外)
![スクリーンショット 2014-08-05 9.16.08.png](https://qiita-image-store.s3.amazonaws.com/0/11653/4e162ef5-9506-29e9-f031-1b9d38e98ca7.png "スクリーンショット 2014-08-05 9.16.08.png")


###Express Edition(liscence-includedのみ)：◎
![スクリーンショット 2014-08-05 8.54.00.png](https://qiita-image-store.s3.amazonaws.com/0/11653/1d61b285-263f-cb3d-2cbf-e129be3f9dd4.png "スクリーンショット 2014-08-05 8.54.00.png")
Railsのcallbackについて調べた

色々詰まったので勉強がてらまとめてみた
Railsのバージョンは3.2

##callbackとは
* オブジェクトの生成・更新・削除のタイミングで呼び出されるメソッド
* トリガとなるイベント（create, saveなど）の前後に登録可能
* トリガに対してメソッドを共通化できて便利

##callbackの順番
create,update,find,destroyでまとめた
それぞれ上から順番に実行される
###create
```ruby:create_test.rb
hoge = Hoge.new(name: "hoge")
#initialize
after_initialize #newメソッドで生成したときのみ
hoge.save!
#BEGIN TRANSACTION
before_validation
#validation
after_validation
#ROLLBACK
after_rollback   #validationに失敗した時のみ
before_save
around_save
before_create
around_create
#INSERT INTO "hoges"
after_create
after_save
# COMMIT
after_commit
```

###update
```ruby:update_test.rb
hoge.update(name: "fuga")
#BEGIN TRANSACTION
before_validation
#validation
after_validation
#ROLLBACK
after_rollback   #validationに失敗した時のみ
before_save
around_save
before_update
around_update
#UPDATE "hoges" SET
after_update
after_save
# COMMIT
after_commit
```

###find
```ruby:find_test.rb
hoge = Hoge.first
# SELECT hoges.* FROM 
#initialize
after_initialize
after_find
```

###destroy
```ruby:destroy_test.rb
hoge.destroy
#BEGIN TRANSACTION
before_destroy
around_destroy
#DELETE from hoges
after_destroy
# COMMIT
after_commit
```

##changed?が使用できるcallback
要素の変更を確認できるchanged?メソッドが使えるcallbackを調べた。

```ruby:changed_method.rb
# ここから→
before_validation
after_validation
after_rollback
before_save
around_save
before_update
around_update
after_update
after_save
# →ここまでは使える
after_commit #使えない
```
##changed?系のメソッド一覧

```ruby:change_series.rb
hoge = Hoge.find_by(name: “hoge”)
hoge.name  = “fuga”

#objectが変更されたか？
hoge.changed? #=>true
#指定要素が変更されたか？
hoge.name_changed? #=>true
#指定要素がhogeからfugaに変更されたか？
hoge.name_changed?(from: “hoge”, to:”fuga”) #=>true
#指定要素の変更前の値？
hoge.name_was #=>”hoge”
#指定要素の変更前後の値
hoge.name_change #=>[“hoge”, “fuga”]
#変更要素名
hoge.changed #=>[“name”]
```

##accepts_nested_attributes_forを使った時のcallbackの順番
上から順番に処理されます。
ややこしいのであんまり使いたくない。

親：before_validation
子：before_validation
子：after_validation
親：after_validation
親：before_save
親：around_save
親：before_xxx
親：around_xxx
子：before_save
子：around_save
子：before_xxx
子：around_xxx
子：after_xxx
子：after_save
親：after_xxx
親：after_save

##around_xxxの使いドコロ
around_xxxの使いドコロがよく分からなかったので調べてみた。
トリガーの前後で処理を定義できるっぽい。便利そう。

```ruby:around_xxx.rb
def around_save
  # 何かしらの処理
  yield #saves
  # 何かしらの処理２
end
```
php5.5とかphp5.6をインストールする


php5.4以上じゃないと動かないものがあって、phpのバージョンを確認してみたらv5.3でした。
5.3はもうあれなので、php5.6にアップデートしてみます。

## 古いphpをアンインストール
一応古いのは削除した方がいいでしょう。
ということでアンインストールしておきます。

```
$ sudo yum remove php-*
```

## Remiリポジトリの追加
今の状態
 - CentOS 6.4
 - php v5.3
 
普通にyum install phpってやっても新しいバージョンのphpは入ってくれないので、リポジトリを追加します。

php5.5はremiリポジトリにあるのでremiリポジトリを追加。

remiリポジトリ
http://rpms.famillecollet.com/



## パッケージをインストール

```
$ wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ rpm -ivh remi-release-6.rpm 
```

すると
`/etc/yum.repos.d/remi.repo`

にファイルが作成されます。

ファイルの中身を見ると
[remi-php55]というのがあります。これがリポジトリ名なので、yum install の時にこれを指定してあげればOK


## phpをインストール
php v5.5

```
$ sudo yum install --enablerepo=remi-php55 php
```

php v5.6

```
$ sudo yum install --enablerepo=remi-php56 php
```
d3.jsでベジェ曲線をドラッグで変形するサンプル

# ソースとデモ

ソース: https://github.com/hnakamur/d3.js-drag-bezier-curves-example
デモ: http://hnakamur.github.io/d3.js-drag-bezier-curves-example/

# メモ
## d3.jsでのドラッグ

[Drag Behavior · mbostock/d3 Wiki]( https://github.com/mbostock/d3/wiki/Drag-Behavior#drag )からリンクされている[サンプル](http://bl.ocks.org/mbostock/1557377)を真似しました。

以下のようにd3.behavior.drag()の結果に ```.origin()``` を呼んでdragイベントのハンドラを設定します。ハンドラ内では ```d3.event.x, d3.event.y``` でドラッグ中の座標が取得できます。

```js
var drag = d3.behavior.drag()
    .origin(function(d) { return d; })
    .on("drag", dragmove);

function dragmove(d) {
  d3.select(this)
      .attr("cx", d.x = Math.max(radius, Math.min(width - radius, d3.event.x)))
      .attr("cy", d.y = Math.max(radius, Math.min(height - radius, d3.event.y)));
}
```

あとはこの ```drag``` を ```call(drag)``` で要素に適用すればOKです。[SVGの2次ベジェ曲線の制御点をドラッグで動かすサンプル - Qiita]( http://qiita.com/hnakamur/items/a275302d80d69f9840e6 )に比べると簡潔でd3.jsは素晴らしいです。

## SVGのg要素でレイヤーを実現

[SVG Rendering Model]( http://www.w3.org/TR/SVG11/render.html#RenderingOrder )にあるようにSVG 1.1ではDOMの順番に描画される方式になっています。

制御点の円の上にテキストが重なるとドラッグできなかったので、g要素でレイヤーを作って、一番上のレイヤーの中に制御点の円を作るようにしました。

こんな感じで複数のレイヤーを作りました。

```js
var controlLineLayer = svg.append('g').attr('class', 'control-line-layer');
var mainLayer = svg.append('g').attr('class', 'main-layer');
var handleTextLayer = svg.append('g').attr('class', 'handle-text-layer');
var handleLayer = svg.append('g').attr('class', 'handle-layer');
```

レイヤーを指定して要素を追加するには、svg要素の代わりにレイヤーのg要素を使うのが違うだけで、d3.jsの基本パターンの ```selectAll().data(データ).enter.append(要素).attr(属性)``` というコードにしています。

```js
    handleLayer.selectAll('circle.handle.path' + i)
      .data(d.points).enter().append('circle')
```

## 制御点に連動する要素選択用にCSSクラスを設定

このサンプルでは、1つの制御点をドラッグすると、制御点のIDと座標のテキストと制御点を結ぶ折れ線とベジェ曲線も連動します。対象の要素を ```selectAll()``` で選択しやすいように、ベジェ曲線毎のIDと制御点のIDを連番で発番して、```path0``` や ```p1``` などのCSSクラスとして設定しました。

id属性ではなくCSSクラスにしたのは、1つのHTML内に複数のsvgを埋め込む場合にidが衝突する危険性があるからです。

## webpack + gulpでビルド

[RequireJS等はもう古い。WebPackとは？｜1 pixel｜サイバーエージェント公式クリエイターズブログ]( http://ameblo.jp/ca-1pixel/entry-11884453208.html )の[06-production]( https://github.com/gunta/webpack-samples-1pixel/tree/master/06-production )のgulpfile.jsをカスタマイズして使わせていただきました。ありがとうございます！
CentOS minimal iso

# wiki

* [Manuals/ReleaseNotes/CentOSMinimalCD6.5 - CentOS Wiki](http://wiki.centos.org/Manuals/ReleaseNotes/CentOSMinimalCD6.5)

# Download

## CentOS 6.6 (iso)

* http://ftp.nara.wide.ad.jp/pub/Linux/centos/6/isos/i386/
* http://ftp.nara.wide.ad.jp/pub/Linux/centos/6/isos/x86_64/

## CentOS 7 (iso)

* http://ftp.tsukuba.wide.ad.jp/Linux/centos/7/isos/x86_64/

## CentOS 7 AtomicHost (qcow2)

* http://buildlogs.centos.org/rolling/7/
* http://cloud.centos.org/centos/7/devel/

## CentOS 7 GenericCloud (qcow2)

* http://cloud.centos.org/centos/7/images/

## mirrorサイト一覧

* http://isoredirect.centos.org/centos/6/isos/x86_64/
windowsとherokuとpython3.4(64bit)でdjango-toolbeltインストールする時に地獄を見ないために…

地獄を見た私のような犠牲者を出さないためにも手順とか気をつけることをまとめておく。

# python本体のインストール

公式サイトからインストーラをダウンロードしてインストールしましょう。
普通にインストールする `C:\Python34`でインストールされるので、ここにパスを通しておくこと。
https://www.python.org/downloads/

# vertualenvのインストールと仮想環境作成

下記リンクからvirtualenvのソースをダウンロード
（2014/8/5時点では`virtualenv-1.11.6.tar.gz`って名前のファイル）
https://pypi.python.org/pypi/virtualenv

ダウンロードしたファイルを解凍して、解凍したフォルダに移動して下記コマンドを実行
`python setup.py install`

プロジェクトディレクトリに移動して仮想環境作成＆有効化

```sh
cd path\to\project-dir
python -m virtualenv venv
venv\Scripts\avtivate
```

# easy_install、pipのインストール

以下のコマンドを実行

```sh
python -c "import urllib; urllib.request.urlretrieve('http://python-distribute.org/distribute_setup.py', 'distribute_setup.py')"
python distribute_setup.py
easy_install pip
```

# python3.4(64bit)用のライブラリインストール

__!!!このステップがかなり重要!!!__

heroku公式サイトとかはここで、普通に
`pip install django-toolbelt`
とやっているが、windowsではこんな簡単に事が進まない。

`django-toolbelt`では`django`、`psycopg2`、`gunicorn`、`dj-database-url`、`dj-static`、`static3`をまとめてインストールしようとするのだが、`psycopg2`がどうもpython3.4(64bit)に上手く対応してくれていない。

そこで、独自に公開されているpython3.4(64bit)用のライブラリを手に入れる必要がある。

以下のリンクから`psycopg2‑2.5.3.win‑amd64‑py3.4.exe`というファイルをダウンロードし、
`easy_install psycopg2‑2.5.3.win‑amd64‑py3.4.exe`でインストールすることで無事`django-toolbelt`のインストールを行うことが出来た。
http://www.lfd.uci.edu/~gohlke/pythonlibs/

# もしかしたら必要かも…

この辺は必要だったかどうだったか分からないが、もし上記の手順を踏んでも上手くいかない場合は次のアプリケーションをインストールすると上手くいくかもしれない。

* postoresql
http://www.postgresql.org/download/windows/

* 7zip
http://sevenzip.sourceforge.jp/

# 最後に…

はっきり言ってwindowsでは`pip`コマンドは殆ど約に立たない（2014/8/5時点）。
何か欲しいライブラリがあったら下記リンクから、自分の環境に合ったライブラリをダウンロードして、`easy_install`するのがいいと思う。
http://www.lfd.uci.edu/~gohlke/pythonlibs/

## 参考にした書籍とかサイト
[パーフェクトPython](http://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88Python-PERFECT-SERIES-5-Python%E3%82%B5%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%BA/dp/477415539X)
http://hennohito.cocolog-nifty.com/blog/2014/04/python34-64-b-1.html