OmniAICreator/Qiita-1.07M huggingface dataset:
フォルダをAtomで開く


Finderのフォルダを右クリックからプロジェクトとしてAtomで開く方法について紹介します。
※以下Mac環境での記事です。ご注意ください。

今回はAutomatorを使います。
Automatorを開くと種類を選択する画面が開くので、サービスを選択します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/0f3e030d-381f-92e0-2d84-a590f9a62d36.png" width="40%" />

次に、左側から「ライブラリ」にある「シェルスクリプトを実行」を選択して、右側のエリアにぐいっとドラッグしてください。

そしてシェルを `/bin/bash` 、入力の引き渡し方法に `引数として` を設定し、下記を入力欄に記載すればOKです。

```
/Applications/Atom.app/Contents/MacOS/Atom -n $@
```

こんな感じです。
ちなみに `-n` とつけてますが、これは新規ウィンドウで開くオプションです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/eda80cc0-7c6c-7512-7524-7dc6ddd1fe34.png" width="80%" />

設定が出来たら `⌘+s` でAutomatorを保存します。名前は「Open in Atom」とかでしょうか。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/067752e3-eb32-857c-96c4-77d92e542128.png" width="40%" />

保存できたら、フォルダを右クリックするとサービスの下に「Open in Atom」が出てくるので選択してください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/80ec50ed-06eb-e178-cf9d-c8b95723a9c9.png" width="40%" />

すると該当フォルダがプロジェクトとして、こんな風に開きます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/29e4ab58-e857-1076-2c31-a36d6da90f4a.png" width="80%" />

[project-manager](https://atom.io/packages/project-manager)にプロジェクトを登録していないフォルダを簡単に開くことができるので、よかったら試してみてください。
DBD::Oracle でサービス名を指定して接続する

構文がいろいろあって、すぐ忘れるのでメモ

```pl
$dbh = DBI->connect("dbi:Oracle://<Host Name>:1521/<Service Name>", username, password);
```

### See Also.

[DBD::Oracle - DBI_CLASS_METHODS](http://search.cpan.org/~pythian/DBD-Oracle-1.74/lib/DBD/Oracle.pm#DBI_CLASS_METHODS)
railsのlink_toでpostする

遭遇するたび調べているので、自分へのメモも兼ねて、やり方を共有します。
#方法
- methodをpostに指定する
- authenticity_tokenをクエリに渡す

````rb:view.html.erb
<%= link_to(
     'お気に入り',
     favorites_path(user_id: 1, item_id: 3, authenticity_token: form_authenticity_token),
     method: :post
    ) %>
````

authenticity_tokenを渡さないと、下記のエラーが出ます。

```` none:エラーメッセージ
Can't verify CSRF token authenticity
````

以上です。
問題があったら、指摘してもらえると嬉しいです。

#参考
http://stackoverflow.com/questions/941594/understand-rails-authenticity-token
Activity の中で View の操作が出来ない

fragment のように layout を inflate して `view.findViewById(R.id.viewId)` していませんか？

Activity はメソッドを持っているのでそのまま`findViewById(R.id.viewId)` します。

しょーもないんですけど fragment からそのままコードを持ってこようとしたりした時にやらかしたりしそうなので（した）。コンパイルエラーにもならずに落ちもしないのでうっかりやると気付き難い。
SSHが切れてもOK、nohupコマンドで標準出力のログを保存しておく

サーバーでコマンドを叩いた時に、SSHのコネクションが切れてしまい標準出力ログがわからない！！みたいなことがあります。

# コマンドの前にnohupを付ける
サーバーで`nohup`をつけてコマンドを実行します。

```bash:nohupの使用方法
nohup コマンド名
```
以下はrakeコマンドにnohupを付けた例です。

```bash:nohupでコマンドを実行
nohup bundle exec rake db:migrate
```
コマンドの出力は`nohup.out`というファイルに保存されています。
あとはSSHから抜けてもログを見ることができました。

## おまけ：nohup.outの出力先を指定する
nohup.outファイルは通常は`./nohup.out`に作成されます。
これを任意のファイルに出力する場合は`>>`で指定します。

```bash:nohupでコマンドの出力を保存する
nohup bundle exec rake db:migrate >> ~/hoge
```
すると`~/hoge`ファイルにが生成され標準出力が書き込まれます。
誰でも動かせるNginx

# 実行環境 #
CentOS 6.5
Nginx 1.9.0
※rpmだとモジュール追加が出来ないため、ソースからインストールしています

# ユーザー作成 #
まずはnginx実行ユーザ作成しておきます。

<pre>
# useradd --shell /sbin/nologin nginx
</pre>

# 必要ライブラリインストール #
事前にnginxに必要なライブラリインストールしておきます。
※きっとHTTPSやってみたいってなると思いそれ関連も入れてます。

<pre>
# yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
</pre>

# ダウンロードnginx #

最新の1.9.0をパッケージダウンロードします。
ダウンロード先は今回は/usr/local/src/sourceとしておきます。

<pre>
# cd /usr/local/src/source/
# wget http://nginx.org/download/nginx-1.9.0.tar.gz
</pre>

# 展開とインストール #

ダウンロード先に移動し、configureで追加モジュール指定しインストールします。

<pre>
# tar xvfz nginx-1.9.0.tar.gz
# cd /usr/local/src/source/nginx-1.9.0/
# ./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module
# make
# make install
</pre>

# 起動スクリプト #
公開されてるのを利用します。以下のURLのものをコピーし、/etc/init.d/nginxファイルを作成し貼り付けます。

http://wiki.nginx.org/RedHatNginxInitScript

<pre>
# touch /etc/init.d/nginx

vi で開いてコピペ
</pre>

これを参考に必要なパスだけ変えます。今回はバイナリが/usr/localにインストールされている状況とします。

<pre>
nginx="/usr/local/nginx/sbin/nginx" 
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
</pre>

# コンフィグテスト #

リスタートや起動前にコンフィグチェック可能です。以下コマンドでチェックします。
以下のようにokやsuccessfulが出ていれば問題ありません。

<pre>
# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
</pre>

# 起動 #

以下コマンドで起動出来ます。停止はstop、コンフィグ再読込はreloadです。

<pre>
# /etc/init.d/nginx start
Starting nginx:                                            [  OK  ]
</pre>

起動後ブラウザで以下のようにでればOK

![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/27932/dcda1242-3466-631a-2dc2-e102fa5db6a7.png)

# モジュール追加したい #

モジュールはたくさんあり動的に追加はできません。rpmで入れてしまうと追加ができません。
試しに接続状態を確認できるstub_status_moduleを入れてみましょう

現在のモジュール状況は以下で確認できます。バージョンの確認も出来てますね。

<pre>
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.9.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module 
</pre>

--with-http_stub_status_moduleを付けてconfigureし直しstub_status_module追加します。そして再度インストールします。

<pre>
# ./configure --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module

# make;make install
</pre>

再度nginx -Vコマンドを実行しモジュール確認します。
--with-http_stub_status_moduleが入ってることが見えますね。

<pre>
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.9.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module
</pre>

reloadでコンフィグ再読込させ、追加モジュールを有効にします。

<pre>
# /etc/init.d/nginx reload
</pre>

以下のようにブラウザからhttp://IPアドレス/nginx_statusで接続状況が見えてますね^^

![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/27932/b990bdba-4b4e-d32d-ef72-36b1fc58f8f0.png)
第22回関西PHP勉強会で発表してきました。

昨日20日に、関西PHPユーザーズグループのお勉強会があり、発表してきました。

実際、発表というよりは「コードレビューどうしたらいいんだよぅ！助けてください！」と叫んできました。北区のはずれらへんで。

[難しいよね、コードレビュー](http://www.slideshare.net/shinichitakahashi790/ss-48387279)

内容は、ツラツラとあるあるネタを話して最後にご意見ちょうだいする感じです。
困ってる点が以下の３つ

* でかいプルリクを読む気がしない
* 影響範囲の調査・網羅がムズカシイ
* 宗教戦争の終わらせ方

### でかいプルリクを読む気がしない

まだβなのでまぁまぁでかいプルリクをいただくこともしばしばあるんですが、ぶっちゃけ全部読んでイケる/イケへんの判断がむずかしいんですよね。

* βなので、大きな変更は起こり得るものと割り切って、コミッターを信頼の上、えいやーでマージ
* (チケット作成してからプルリクというフローであれば）チケットの粒度がでかすぎ
* チケットないものは、受け付けないというポリシーをしっかり浸透させる

などなどの意見を頂きました。

まだまだGitHubでの文化を浸透させられていないし、βという変更が大きく起こるフェーズということもあり、本リリースまでとそれからでポリシーを変えていかないといけないよね、という形で納得しました。

そもそもコードを見るまでもないよ、それ以前の問題だよ、とズバリおっしゃっていただいたのが印象に残ってます。
こう「ズバッ」っと言ってもらえる環境は大事ですね。


### 影響範囲の調査・網羅がムズカシイ

こちらは、イケるという判断のもとマージしたら他で影響でてましたテヘペロみたいな議題です。

* テストしてれば検知できる。テストがちゃんと書けていないことが問題では？
* チケットの粒度ry
* βだし根っこが変わることも当然あるから、許容してあとから修正すればいい
* テストがないものがコミットされるから影響範囲が見えなくなる
* テストポリシーを明記して、したがってもらっていれば防げる

などなど、こちらでもコードレビューというより、テストポリシーの問題だよね、という話に（いい意味で）大きく膨らみました。
１つめの議題と同じく、本リリースまでとそれ以降で運用は変わっていくと思うのですが、テストをしっかり書くことの意識付けは大事だなぁ、と再認識。

印象的だったのは「自分を信用できない」というフレーズ。
スゴイ人だなーといつも思ってる方々がみなさん口をそろえておっしゃってます。

あと、テストを通すための修正が起きないようにするのはやっぱりムズカシイみたい。
テストの書き方や、DBテストどうするの、みたいなお話も面白かったんですが、それは実際にきた人たちのみぞ知る特典ってことで。決して書くのがめんどくさいわけじゃないですよ。
知りたければ勉強会に来ればいいんです！そういうもんです！


### 宗教戦争の終わらせ方

よくある派閥のお話です。何を信じるのか、という感じ。
たけのこの里派が少なくてすごく困りました。PHPポケットリファレンスにもたけのこの里が歴史的大勝利を残したことが書いてあるっていうのに・・・。

この議題はとてもとてもとてもとても有意義でした。
ぽろっと提案したお題で「実際この場にいるみなさんはどっち派？」という流れになり、すごーく簡単に宗教戦争勃発しました。
中には「これはそもそも戦争になるレイヤーではない」という意見もあったり、何を信じるか人によって違うな〜と深く再認識させていただきました。

* コードレビューをみんなで進める際、置いて行かれる人がでやすいので、宗教戦争が始まった段階で、進行役が割って止める
* マネージャーとかリーダーとかで決めておかないといけないことなので、コードレビューの場で起きてはいけない
* 勝ち負けで考えると、しこりが残るので、もっと楽に構えるといい
* どうせ数日したらなれる
* どうせ数日したら忘れる
* 期限と決裁者を用意して「今回はこちらのルールでいきましょね」という程度に留める

などなど。宗教戦争って、自分を否定されている気分になるので好きじゃないんですが、得てして起きがちなものですよね。
でも決して宗教戦争自体が悪いわけじゃないんですよね。
戦争を終わらせるときに、ゆるふわな感じで方針決めるか、俺がこうだっていったらこうなんだ！という神を用意するか、やり方はいろいろありそうです。

僕がまだエンジニアとして及ばないせいで、神々の戦いをヤムチャ視点でながめる際には、思い切ってほっとけばいいというお話もおもしろかった（こなみかん）


そんなこんなで私のセッションは以上な感じでした。
前日というか発表直前までは「特定の人に常識を教わる会になりそうだな〜」なんて考えてたんですが、実際はみんな（いい意味で）モミクチャになって話し合うことができて、**もうマジでめちゃくちゃ有意義でした！！**

他にも話したいことはいろいろあるんですが、今回はここまで〜。
Golang で Shared Library を出力する。

Go 1.4 で android に対応していたのでもしかしてそろそろできるんじゃないかなぁとか思いながら github の go レポジトリを眺めていたら Go 1.5 から buildmode なんていうオプションが追加されていて、そこに c-shared なるものががが。

https://github.com/golang/go/blob/ae3e3610d5ea9814fcc8bff5c4cea51795465565/src/cmd/go/build.go#L326

これは間違いないだろうと試してみました。
（ちなみに試すためには Go 1.5 が必要なので git clone して Go 1.4 でビルドしてください。本記事では Go 1.5 の準備は割愛します。)

サンプルコードは [gist](https://gist.github.com/yanolab/ec684dce297139e6b06e) にも上げておきました。

```go:libgofib.go
package main
 
import (
    "C"
    "log"
)
 
//export fib
func fib(n int) int {
    if (n < 2) { return n }
    return fib(n - 2) + fib(n - 1)
}
 
func init() {
    log.Println("Loaded!!")
}
 
func main() {
}
```

内容は単純なフィボナッチです。
ポイントは下記の4点です。

- パッケージは main でないと生成できない。
- main関数は実行されないが宣言する必要がある。
- エクスポートしたい関数にコメントで「//export funcname をつける。」（cgoと同じ）
- init は ライブラリロード時に実行される。

後は buildmode=c-shared を付けてビルドするだけ！
(Go 1.5 は即席で用意しただけなので、GOROOTをビルド時に設定してます。)

```bash
GOROOT=$PWD/go ./go/bin/go build -buildmode=c-shared -o libgofib.so libgofib.go
```

相変わらずのでかいバイナリが出力されればビルドできてます。

```bash
$ ll libgofib.so 
-rwxrwxr-x 1 yanolab yanolab 3.2M  5月 21 09:46 libgofib.so*

$ file libgofib.so 
libgofib.so: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=acc56aca625aa6e9bf7bfc9d7b1c8e377ff9df0b, not stripped
```

サイズが大きかったのでまさか Shared Library まで他ライブラリに依存していないのか！と思いましたがそんなことはありませんでした。

```bash
$ ldd libgofib.so 
	linux-vdso.so.1 =>  (0x00007ffc0d6f7000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fc878e8a000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc878ac5000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fc879563000)
```

まぁ、しょうが無いですよね。うん。

せっかくなので、このライブラリを実行するところまで確認してみます。
まずは fib がちゃんとエクスポートされているかどうか。

```bash
$ nm -D libgofib.so | grep fib
00000000000d9eb0 T _cgoexp_28da6a1ce835_fib
00000000000d9a50 T fib
```

バッチリですね。

次は実際にこの関数を呼び出してみます。
ライブラリの関数を簡単に実行する方法としてはあれしかないです。そう、僕らの python 先生。
おもむろに python インタプリタを起動して下記のコードを打ち込みます。

```bash
>>> import ctypes
>>> lib = ctypes.CDLL("./libgofib.so")
>>> 2015/05/21 09:56:21 loaded!!

>>> lib.fib(32)
2178309
```

バッチリ使えてますね。
プラットフォームが linux/{arm,amd64}, android/arm に限定されてたりしますが、チャネルも goroutine も使えるので、中身をバリバリの Go で書いて簡単な C API を提供するとか個人的にはすごくポイント高いです。
今後の展開にも大いに期待したいです。

P.S. 2015年5月21日現在、Go 1.5 はリリースされていないので、リリース時にどうなるかはわかりませんので悪しからず。
[超初心者向け]変数の基本：Unityでクリックされた回数を数える

Unityで何か処理するときに、回数を数えて処理を変えたいときにどうするか、の基礎です。

#先ずは元の確認
処理の元のScriptファイルです。

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

public class Launcher : MonoBehaviour {

    //発射する玉のPrefab
    public GameObject ballPrefab;

    // Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(1)) {
            Instantiate(this.ballPrefab);
        }
	
	}
}
```
このScriptは、以下の設定で動いています。

| オブジェクト名    | 属性             |内容         |
|:-----------------|:--------------|:-----------------|
|Launcher|クラス|
|ballprefab|public Gameobject|発生させるprefab|
|Start|メソッド|初めに一回の処理：何もしない|
|Update|メソッド|画面の更新でする処理：マウスの左クリックがされていたらballprefabを生成|

#押された回数を数える

数えるには、その為のオブジェクトを用意することが必要です。どう考えれば良いでしょうか。

##どういうオブジェクトにするかを考える
###型は何が良いか
数値として持つので、それに相当する型で考えます。該当するのは以下の何れかになります。

* `int`型:整数を格納する
* `float`型:小数を格納する

「数える」ということは整数で済ませられるので、ここでは`int`型で定義しておきましょう。

###名前をどうするか
命名では、以下のことに配慮する必要があります。

* __何を示すかが分かりやすいこと__。これを改造し続けていくとすれば、単純なアルファベット一文字では何か判らなくなります。
* __誰が考えても、同じ発想になること__。他人との共同もあり得るので、他人が見ても同様になることが予想され得るものがのぞましくなります。Unityの記法では、変数名は最初の文字がsmallで書くことが多いです。また、海外のソースコードもあったり、日本人でも書き方が変わるので__ローマ字で書くのは避けるべき__です。

こうしたことを考えて、今回は以下の形にします。

###どこに配置するか
今回の変数は、「押されたら数える」ので、外部から変更される可能性がありませんし、それを許すとバグの元になります。__オブジェクトのスコープは出来る限り隠す__と考えて下さい。今回は、このクラス内でのみ使うので、`private`にして、`class`内部にしました。

###コードにする
以下の形になりました。

```csharp:Launcher.cs(抜粋)
public class Launcher : MonoBehaviour {

    //押された回数を格納する変数
    private int counter = 0;

```

##数える処理を入れる
数える部分は、「押されたら」なので、該当するブロックに追加します。

```csharp:Launcher.cs(抜粋)
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(1)) {
            counter++;  //****追加
            Instantiate(this.ballPrefab);
        }
	
	}
```

##数えた数で動作を変える
数えた処理で、何かを変えたい場合は、数を評価して処理を分岐します。例えば、押された回数が20になったら玉が出ない、としたい場合は以下になります。

```csharp:Launcher.cs(抜粋)
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(1)) {
            counter++; 
            if (counter <= 20) {//****追加
                Instantiate(this.ballPrefab);
            }
        }
	
	}
```

ただし、これだと「玉が出るのは20が限界」ということが、後から見た時にわかりにくくなります。こうした値をそのままソースコードに書くことを「ハードコーディング」と呼び、後から改造しにくいコードになります。そうした場合は、変数を別にとりましょう。
ここまでをまとめると、以下のコードになりました。

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

public class Launcher : MonoBehaviour {

    //押された回数を格納する変数
    private int counter = 0;
    const int counterMax = 20;  //最大値
    
    //発射する玉のPrefab
    public GameObject ballPrefab;

    // Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetMouseButtonDown(1)) {
            counter++; 
            if (counter <= counterMax) {//****変更
                Instantiate(this.ballPrefab);
            }
        }
	
	}
}
```

数え方は様々なので、「残りの数」で数えるなど、工夫してみてください。
Mecabにニコニコ大百科 はてなキーワード Wikipediaの名詞辞書を追加して強化する


Mecab様で高速気軽に形態素解析ができます。導入も楽ですし、各種プログラムから呼び出すのも簡単です。基本はIPA辞書を使うと思いますが、御存知の通りネットスラングには対応していなかったり、固有名詞には弱かったりします。なので、今回はニコニコ大百科 はてなキーワード Wikipediaからデータを引っ張ってきて辞書を強化してあげます。

# 各種データの用意

## Wikipedia

```
$ wget http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-all-titles-in-ns0.gz
$ gunzip jawiki-latest-all-titles-in-ns0.gz
```

## はてなキーワード

```
$ wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
$ nkf -w --overwrite keywordlist_furigana.csv
```

## ニコニコ大百科

- [ニコニコデータセット](http://www.nii.ac.jp/cscenter/idr/nico/nico.html)

こちらから「ニコニコ大百科データ」をダウンロードします。`head.zip`の方です。

```
$ unzip head.zip
```

# 変換スクリプト

```ruby:convert.rb
require 'csv'

def output(title, type)
  title_length = title.length
  return nil unless title_length > 3

  score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i
  [title, nil, nil, score, '名詞', '一般', '*', '*', '*', '*', title, '*', '*', type]
end

CSV.open("user.csv", 'w') do |csv|
  # niconico
  Dir::foreach('./niconico') do |f|
  	next unless f =~ /^head[0-9]{4}\.csv$/
    open("./niconico/#{f}").each do |line|
      title = line.split(',')[1].gsub('"','')
      out = output(title, 'niconico')
      csv << out unless out.nil?
    end
  end

  # hatena
  open('keywordlist_furigana.csv').each do |line|
   title = line.split("\t")[1].strip

   out = output(title, 'hatena')
   csv << out unless out.nil?
  end

  # Wikipedia
  open('jawiki-latest-all-titles-in-ns0').each do |line|
    title = line.strip

    next if title =~ %r(^[+-.$()?*/&%!"'_,]+)
    next if title =~ /^[-.0-9]+$/
    next if title =~ /曖昧さ回避/
    next if title =~ /_\(/
    next if title =~ /^PJ:/
    next if title =~ /の登場人物/
    next if title =~ /一覧/

    title.gsub!('_', ' ')

    out = output(title, 'wikipedia')
    csv << out unless out.nil?
  end
end
```

このRubyスクリプトでCSVに変換してあげます。そして、mecab-dict-indexを使ってdicファイルに変換すれば終了です。

```
$ ruby convert.ruby
$ mv user.csv /usr/local/lib/mecab/dic/ipadic
$ cd /usr/local/lib/mecab/dic/ipadic
$ /usr/local/libexec/mecab/mecab-dict-index -d /usr/local/lib/mecab/dic/ipadic -u user.dic -f utf-8 -t utf-8 user.csv
```

# ユーザ辞書を使う

```
$ mecab -u user.dic
おにくだいすき!ゼウシくん
おにくだいすき!ゼウシくん	名詞,一般,*,*,*,*,おにくだいすき!ゼウシくん,*,*,niconico
EOS
```

ちゃんとゼウシくんが認識されましたね。ただ、記号などが含まれるゲームとかアニメとかの固有名詞の一致は結構難しいですね。ここらへんの表記ゆれに対応するには、どうするのがいいんだろうか。
スワイプでUITableViewCellの削除

# セルの削除許可を設定
```swift
func tableView(tableView: UITableView,canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool
{
return true
}
```
trueで編集許可。セクションや行で判定して許可を設定する。

# セルの削除ボタンが押された時の処理
editingStyleにdeleteが入っていれば、削除ボタンが押されたと分かる。
下の例はセル表示で使っている配列を削除するとともに、見た目上のセルも削除している。

```swift:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == UITableViewCellEditingStyle.Delete {
            arr.removeObjectAtIndex(indexPath.row)
            tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
        }
    }
```
Effective C++ (3rd) > 6章(32項の前) > publicな継承は、「is-a関係」を表します。もしこの意味に反することをすれば、トラブルになるのです。

引用: Effective C++ 第3版

> publicな継承は、「is-a関係」を表します。もしこの意味に反することをすれば、トラブルになるのです。

<hr>
[msdn](https://msdn.microsoft.com/ja-jp/library/27db6csx(v=vs.90).aspx)
> オブジェクト指向プログラミングにおけるクラスの関係は、is-a と has-a の 2 つの関係で表されます。is-a 関係では、派生クラスは確実に基本クラスの一種です。
...
一方、CustomerReferral というクラスと Customer クラスの関係は has-a 関係です。これは、顧客紹介 (customer referral) には顧客 (customer) という語が含まれてはいますが、顧客の一種ではないためです。
Effective C++ (3rd) > 6章 (32項の前) > 疑問点 > たとえば、仮想関数において、デフォルト引数はどのように扱われるでしょう。C++の「名前検索のルール」は、継承があるとどうなるのでしょう。デザインの選択はどうなるのでしょう。クラスの動作が後で変更される可能性があるのなら、仮想関数が最適でしょうか。

引用: Effective C++ 第3版

>たとえば、仮想関数において、デフォルト引数はどのように扱われるでしょう。C++の「名前検索のルール」は、継承があるとどうなるのでしょう。デザインの選択はどうなるのでしょう。クラスの動作が後で変更される可能性があるのなら、仮想関数が最適でしょうか。
> この章では、これらのすべてを扱います。

今まで深く考えてこなかった事項である。
不要な pip install をスキップしてCIの高速化


## やりたいこと
TravisCIのテストが遅いので高速化したい。
ログを眺めていると、pip installでけっこう時間がかかっている。特に numpyのインストールが遅い。
また、インストール済みのパッケージを毎回処理しているのも、せっかくキャッシュディレクトリに指定しているのでスキップしたい。

## 環境
* TravisCIを使っている
	* python 2.7.9 (現時点)
	* .pip-cache、virtualenv ディレクトリをキャッシュさせている

```.travis.yml
python:
- 2.7.9
cache:
  apt: true
  directories:
  - "$HOME/.pip-cache/"
  - "$HOME/virtualenv/python2.7.9"
before_install:
- sudo apt-get update
- sudo apt-get install XXX #必要なパッケージインストール
install:
- pip install -r requirements.txt --download-cache $HOME/.pip-cache
# 以下省略

```

## やったこと

pip freeze と比較して差分だけインストール処理が走るように install の項目を変更する

```.travis.yml
install:
- pip freeze | comm -13 - requirements.txt | grep -v '^#' | xargs pip install --download-cache $HOME/.pip-cache
```

* 普通に diff コマンド使おうとしたがMacだと動いたけど、Travis環境では動かなかった bash限定の方法みたい？
	* ```diff <(pip freeze | sort) <(cat requirements.txt | sort) | grep '^> ' | sed 's/^> //'```
	* comm コマンドは今回初めて知った。便利。
* pip freeze でコメント行が出てくることがあったので、 ```grep -v '^#``` を入れている


### 課題
git リポジトリから tag 指定でインストールしている行が、pip freezeではコミットのハッシュ値が表示されるので、必ず差分になってしまう。

* requirements.txt
	* -e git://github.com/Example/hoge.git@tag#egg=hoge
* pip freeze
	* -e git://github.com/Example/hoge.git@ba34106b63048ba3d43140a09bd4f99140609da6#egg=hoge-origin/tag

まぁ、一番遅い numpy がスキップされたからいいかな？と思ってる。
van_de_Hulst > typo > 3.11 > Equation of |A|^2

Kindle No. 734 > Equation of |A|^2

Kindle version (typo)

```math
|A|^2 = A \dot{} A^* = (a cos a + ia sin a)(a cos a - ia sin a) = a^2
```

printed book (correct)

```math
|A|^2 = A \dot{} A^* = (a cos \alpha + ia sin \alpha)(a cos \alpha - ia sin \alpha) = a^2
```

(mistake between a and alpha)
van_de_Hulst > typo > 3.11 > Equation of e^{i pi}

Kindle No. 734 > Equation of e^{i pi}

以下がKindle version (typo)

```math
-1 = e^{i \pi}, i = ^{e i \pi/2}.
```

以下がprinted book (correct)

```math
-1 = e^{i \pi}, i = e^{i \pi/2}.
```
van_de_Hulst > typo > 3.11 > Equation of A

Kindle No. 734 > Equation of A

以下がKindle version 

> The amplitude a and the phase a...

```math
A = a e^{ia} = a cos a + ia sin a.
```

以下がprintedd book (correct)

> The amplitude a and the phase alpha

```math
A = a e^{i \alpha} = a cos \alpha + ia sin \alpha.
```
技術英語 > What's the alternatives to ...?


http://slick.ninjacave.com/forum/viewtopic.php?f=18&t=5418
> <font color=red>What's the alternatives to</font> automatic layouts?

automatic layoutsの代替物（代替案）は何か？
という意味になる。

1つの案がダメだった時に他の案は何かという時に使いそう。

alternative関連でいうと以下のようなものを思い出した。
- PC > Altキー
- 電子回路 > AC電源 (Alternating current)
- 電子部品 > alternate switch

知らなかったもの
- alternator : 交流の電気を生成する発電機

[副詞 "Alternatively"と"alternately"](http://ameblo.jp/sasurai-tran/entry-11441207013.html)
> Alternatively: 
You use “alternatively” to introduce a suggestion or to mention something different to what has just been stated. 
「ある提案を紹介するとき、またはたった今述べたものとは異なる事柄を話に出すときに“alternatively”を使う。」
...
Alternately: 
Alternate actions, events, or processes regularly occur after each other. 
「動作、出来事または過程が通常互い違いに（交互に）起こる様子。」
yo の generator 作って npm に上げる

===

> 昔のと構成違うみたい。201505時点。簡単、１回やったら空でもできる。

目的
---
保存したい構成(Gulpfile をはじめとする構成)をそっと保存して、いつでもいつまでもどこでも使いたいから yo 使ってみた。
npm に上げるぜ。

答え
---

```sh
$ npm i -g yo generator-generator
$ yo generator:app # you answer "sample"
$ cd generator-sample
$ cd generator/app
$ ls # -> index.js, templates/
$ cd templates
$ touch Gulpfile.coffee
$ cd ../
[Edit] $ vi index.js
$ cd ../../../
$ mkdir node_modules
$ cp generator-sample node_modules/
$ yo
$ cd generator-sample
$ npm adduser
$ npm publish
```


ルール
---
yo は雛形を generator-@@@ の形で使います。
./node_modules 以下に generator-@@@ としたディレクトリが存在し、尚且つそれ以下の package.json や index.js の存在を見て、yo は generator だと判別します。


手順
---

```sh
$ npm i -g yo generator-generator
$ yo generator:app
```

今回は、Sample っていう generator を作る。
だから basename は sample って答える。
よし、generator-sample ができた。


```sh
$ cd generator-sample
```

ここが本部なので、npm に上げるときは、ここの package.json を編集して publish する。

```sh
$ cd generator/app
$ ls # -> index.js, templates/
```
index.js が yo を喋らしたり、初期化のメイン処理をやってくれる奴。
templates に今回作りたい大体のプロジェクトをつっこんで、あとで index.js を編集して正しく生成してもらう。

```sh
$ cd templates
$ touch Gulpfile.coffee
$ cd ../
[Edit] $ vi index.js
```

中に、明らかにコピーしている部分がある。

```.js
  writing: {
    app: function () {
      this.fs.copy(
        this.templatePath('_package.json'),
        this.destinationPath('package.json')
      );
      this.fs.copy(
        this.templatePath('_bower.json'),
        this.destinationPath('bower.json')
      );
    },
```

ここを増やして、Gulpfile.coffee もコピーしてもらうようにしとく。
とりあえず今回はこれで完成。
generator として yo が認識してくれるか確かめる。

```sh
$ cd ../../../
$ mkdir node_modules
$ cp generator-sample node_modules/
$ yo
```

ルールに従っているので、yo が Sample を認識してくれている。やったね。

```sh
$ cd generator-sample
$ npm adduser
$ npm publish
```

npm 公開できました。してないけど。
AtomでYouTubeを観る

気分転換にエディタで動画を観たいときに。

# MarkdownプレビューにYouTubeプレーヤーを埋め込む
(MarkdownのプレビューさえできればAtomでなくても...)

1. 以下をAtomにコピペ
2. Atomのmarkdown-previewを実行(`Ctrl-M`か`Ctrl-Shift-m`)  

```rb
# AtomでYouTube

**自動再生なので注意！**

<iframe
  id="ytplayer"
  type="text/html"
  width="640"
  height="390"
  src="http://www.youtube.com/embed/cvj3-MZO9Tw?autoplay=1"
  frameborder="0" />
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/34361/7f3974a0-0978-8118-5a58-65e51ede6b86.png" alt="screenshot" width="50%" height="50%">

[YouTube プレーヤーの埋め込み](https://developers.google.com/youtube/player_parameters?hl=ja#Embedding_a_Player)
SPErrorInvalidBundleNoGizmoBinaryMessageが発生した場合

# エラー
WatchKitをTargetsに追加した際に謎のエラーが発生しました。
原因はよくわかっていないのですが回避方法がわかったのでメモとして残しておきます。
恐らくXcode/Simulatorのバグだと思われます。

## 発生するタイミング
* iOS8.2のシミュレータを使用し、WatchKit Appを動かす場合
* 複数プロジェクトのWatchKit Appを同一のシミュレータで動かす場合

# 環境
* Xcode6.3.2(6D2105)
* Simulator iOS8.3

# 解決方法
「SPErrorInvalidBundleNoGizmoBinaryMessage」で検索すると
以下のページにたどり着きました。
[Stack Overflow](http://stackoverflow.com/questions/28286571/apple-watchkit-simulator-issue-sperrorinvalidbundlenogizmobinarymessage)
> Did you change the bundle ID of your app?
If so you may need to manually update the WKAppBundleIdentifier in the WatchKit Extension and also the WKCompanionAppBundleIdentifier in the WatchKit App.

どうやらBuild Identifierが一致していないとこのエラーが発生するようです。
Build Identifierを変更している場合は下記の２つを確認すると解決するかもしれません。

```lang:info.plist
WatchKit Extension
NSExtension > WKAppBundleIdentifier
```

```lang:info.plist
WatchKit App
WKCompanionAppBundleIdentifier
```

上記の値が問題ない場合は以下の方法でエラーを回避することができます。

# 回避方法
1. プロジェクトをクリーン　`Cmd + Shift + K`
2. シミュレータのリセット　`iOS Simulator > Reset Content and Settings...`
3. ビルド

原因はよくわかっていないのですが
再度エラーがでても上記の手順でエラーを回避することができます。
ReactとReagentのためのClojureScriptのリソース

[React](https://github.com/facebook/react)と[Reagent](https://github.com/reagent-project/reagent)の勉強のためClojureScriptのWebフレームワークを調べています。開発がとても盛んでいろいろなライブラリで構成されコードの書き方も違うので迷います。Bootstrapのフォームを作るのが目的だったのですが。[Luminus](https://github.com/luminus-framework/luminus)や[re-frame](https://github.com/Day8/re-frame)あたりがよさそうです。Reactではないですが[Hoplon](https://github.com/tailrecursion/hoplon)も気になります。

## Reagent

### Templates

* [reagent-template](https://github.com/reagent-project/reagent-template)
* [reagent-figwheel](https://github.com/gadfly361/reagent-figwheel)
* [liberagent](https://github.com/borkdude/lein-new-liberagent)
* [lein-ouva-reagent](https://github.com/ouvanous/lein-ouva-reagent)

### re-frame

* [re-frame](https://github.com/Day8/re-frame)
* [re-com](https://github.com/Day8/re-com)
* [reagent-seed](https://github.com/gadfly361/reagent-seed)
* [re-frame-template](https://github.com/Day8/re-frame-template)
* [angular-phonecat-re-frame](https://github.com/dhruvp/angular-phonecat-re-frame)

### Walking Skeleton

* [tesla-microservice](https://github.com/otto-de/tesla-microservice)
* [clojure-pgp-skeleton](https://github.com/agilityfeat/clojure-pgp-skeleton)
* [clojure-pgp-skeleton-front-end](https://github.com/agilityfeat/clojure-pgp-skeleton-front-end)

### Webフレームワーク

* [Luminus](https://github.com/luminus-framework/luminus)
* [mcljs](https://github.com/theophilusx/mcljs)
* [rente](https://github.com/enterlab/rente)
* [freactive](http://documentup.com/aaronc/freactive)

### DataScript

* [clj-crud](https://github.com/thegeez/clj-crud)
* [datascript-workshop](https://github.com/bricef/datascript-workshop)
* [reagent_datascript.cljs](https://gist.github.com/allgress/11348685)

### Bootstrap / Forms

* [reagent-forms](https://github.com/reagent-project/reagent-forms)
* [reagent-forms-example](https://github.com/yogthos/reagent-forms-example)
* [reagent-bootstrap](https://github.com/chptx/reagent-bootstrap)
* [mailchimp-form-cljs](https://github.com/dhruvp/mailchimp-form-cljs)
* [angularjs-mailchimp-signup](https://github.com/simpulton/angularjs-mailchimp-signup)
* [bootstrap-modal](https://github.com/reagent-project/reagent-cookbook/tree/master/recipes/bootstrap-modal)
* [bootstrap-datepicker](https://github.com/eternicode/bootstrap-datepicker)
* [cljs-pikaday](https://github.com/timgilbert/cljs-pikaday/)


### サンプルアプリ

* [reagent-phonecat](https://github.com/vvvvalvalval/reagent-phonecat)
* [clojure-quotester](https://github.com/philjackson/clojure-quotester)
* [reagent-tic-tac-toe](https://github.com/gadfly361/reagent-tic-tac-toe)
* [reagent-breakout](https://github.com/city41/reagent-breakout)

## Om

* [Om](https://github.com/swannodette/om)
* [Kioo](https://github.com/ckirkendall/kioo)
* [Arch](https://github.com/redbadger/arch)
* [Chestnut](https://github.com/plexus/chestnut)

## Quiescent

* [Quiescent](https://github.com/levand/quiescent)

## Rum

* [Rum](https://github.com/tonsky/rum)

## その他

* [Hoplon](https://github.com/tailrecursion/hoplon)
* [Zelkova](https://github.com/jamesmacaulay/zelkova)
* [Caribou](https://github.com/caribou/caribou)
* [Shouter](https://github.com/rwatkins/shouter)
Parse.comをJavascriptでBaasとして使う【Facebookログインのテスト】

こっから元になるやつをダウンロード出来ます。
https://www.parse.com/apps/quickstart#parse_data/web/new

テストの通りにやれば大体動くはず。
私がFacebookログインを実装しようとしてハマった点を。

#Facebookログインにはコツがいる

チュートリアルの通りに書くだけだと、新規にログインした時にしか動かない（すでにFacebookアプリを認証した状態だとエラーになって帰ってきてしまう）

```
Parse.FacebookUtils.logIn(null, {
           success: function(user) {
             if (!user.existed()) {
               alert("新規にユーザーログイン出来た");
             } else {
               alert("すでにアカウントがあってログイン出来た！");
             }
           },
           error: function(user, error) {
             alert("ログイン失敗");
           }
         });
```

のでコレの上にFB.getLoginStatusをかぶせます。
すでにFBアプリ自体の認証済みの人はlogin処理が走らないよう、処理を分岐します

```
  FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
        //FBアプリを認証済み
      } else {
        //FBアプリを認証していない        
        Parse.FacebookUtils.logIn(null, {
           success: function(user) {
             if (!user.existed()) {
               //FBアプリを新規に認証してParseに新しく登録された状態
             } else {
               //FBアプリを新規に認証してParseはすでに登録していた状態
             }
           },
           error: function(user, error) {
             //FBアプリ認証を拒絶orエラーした状態
           }
         });
      }
   });
```

私の場合はめんどくさいので分岐を統一するためにFBアプリを新規認証した場合はリロードさせて、認証済みの部分にその後の動作を書くことにしました。
UICollectionViewCellに配置したUIScrollViewのタッチイベントをUICollectionViewCellにシュッと送る



## 問題
UICollectionViewCellの上にUIScrollViewを配置すると、UIScrollViewがそこでタッチイベントを止めてしまい、通常であればタップ時に呼ばれるUICollectionViewのdelegateメソッド ``didSelectItemAtIndexPath``などが呼ばれなくなります。しばらく困っていましたがスマートな解決策を見つけたので共有します。

情報源:http://stackoverflow.com/questions/14298650/uicollectionviewcell-with-uiscrollview-cancels-didselectitematindexpath

## 対策
UIScrollViewは内部に``panGestureRecognizer``なるプロパティを抱えており、ここでタッチイベントを検出して、スクロール操作を行っているようです。
で、この``panGestureRecognizer``をCellの``contentView``に貼り付け、かつUIScrollViewの ``userInteractionEnabled``を``false``にすると、通常どおりスクロールしつつ、タップ時にも``didSelectItemAtIndexPath``が呼ばれるようになります。

## コード
とりあえずUICollectionViewControllerの``cellForItemAtIndexPath``で上記の対策を行う例です。
Cellに貼ったUIScrollViewはタグで取り出していますが、実際はUICollectionViewCellをサブクラス化した方がよいかと思います。


```swift:CollectionViewController.swift

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
	let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as UICollectionViewCell

	let scrollView = cell.viewWithTag(1) as UIScrollView
	scrollView.userInteractionEnabled = false
 	cell.contentView.addGestureRecognizer(scrollView.panGestureRecognizer)

	return cell
}

```
[Cocos2dx]Your project contains error(s), please fix it before running it.

今日のエラーです。

windows環境のeclipseにおいてcocos2dxのアプリ開発をしております。

新しい広告のSDKを入れようとインストール手順を実行していたところ、
「自分のプロジェクト>properties>android」を見たところで、
プロジェクトの名前に「！」（びっくりマーク、エクスクラメーションマーク）が
つくようになりました。

そこでビルドすると、

```
Your project contains error(s), please fix it before running it.
```

という表示が出ました。
cocos2dxのソースのビルドは通るので、どうやら別の原因のようです。
しかしエラーの原因がわからないことにはどうにもなりません。

Javaのエラーと推測し、

Window > show view > Problems

を選択して、Javaのエラーを見れるように。
するとエラーが出ています。

```
Android Dependencies references non existing library google-play-services_lib.jar
```

どうやらライブラリを確認したはずみで、パスが修正されて（？）、jarファイルの参照先が変わったようです。
この操作の前に、Android SDK Manager でgoogle-play-servicesのアップデートをしたので、
その時に参照先が変わったのかもしれません。

で、ウェブで調べていろいろやってみて、この質問と対処に行き着きました。
https://groups.google.com/forum/#!topic/android-group-japan/VBn0pTbpY0c
しかし、この対処でもエラーは消えません。

どうにも「！」が消えないので、一度google-play-services-libをプロジェクトごと削除。
さらに、Android SDK Manager でも一度google-play-servicesをアンインストールして、
再インストールしてみました。

すると、google-play-services関係のエラーは消えました。
一度ゼロに戻す手はいつも役立ちます（笑）。

ただ、どうやらエラーを消そうといろいろいじっていたせいで実行時に、

```
[Dex Loader] Unable to execute dex: Multiple dex files define Lorg/cocos2dx/lib/Cocos2dxAccelerometer;
[proj.android] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/cocos2dx/lib/Cocos2dxAccelerometer;
```

というエラーが出るように。

これは、プロジェクト > Properties > android で、libcocos2dxを追加してしまったがために、
プロジェクトの中に同じjarファイルが複数存在することになってしまったのが原因のようです。

ということで、
プロジェクト>Properties>Androidの項目内にある Libraryの設定からlibcocos2dxを消せばエラーが消えます。

参考まで。
Good luck!
Scalaで文字列をファイルに書き出すワンライナー


```scala
import java.nio.file.{Paths, Files}
import java.nio.charset.StandardCharsets
Files.write(Paths.get("output.txt"), "contents".getBytes(StandardCharsets.UTF_8))
```

ワンライナーといいつつ、importがあるのでサンライナーデス。


@suin さんがコメントでimportをくっつけてくれた、ほんとうのワンライナーはこちら

```scala
java.nio.file.Files.write(java.nio.file.Paths.get("output.txt"), "contents".getBytes(java.nio.charset.StandardCharsets.UTF_8))
```
WEB高速化うんぬん


#ブラウザにやさしいHTML/CSSより


##基本知識
web開発者は、ブラウザの内部でどういうことが起きているのかを学ぶことで、適切な判断ができるようになり、開発のベスト・プラクティスの根拠を理解することができる。

###高速化の基本テクニック
- CSSスプライト、ファイル結合
- コードの縮小
- 画像圧縮
- テキスト圧縮(minify)
- キャッシュ利用

###レンダリング
- scriptタグで外部ファイルを読み込むとレンダリングが止まってしまう。そのためscriptタグはbodyタグの直前に書くのが望ましい。

##HTTPリクエスト
- 一番最初にHTMLをリクエストする。
- HTMLをダウンロード後ブラウザがパースを行う。
- 原則、HTMLの上から順にリクエストをかける
- ダウンロードは並列で６本づつ、逐次的に行われる。

###パース
DOM Treeがまずつくられ、style情報を関連付けて、Render Treeがつくり終えて、描画。

###DOM Tree
JSやCSSでセレクトするときに利用する機構。
JSでDOM操作は重い。

###Render Tree
- display: none;すると、Render Treeに含まれない。
- visibility: hidden;は含まれる。
- absolute/fixedは、別コンテキストになる
- DOM構造が変わったり、一部のCSSのプロパティに変更があると、レイアウト/リペイント。

##CSS


###メンテナンス性は犠牲にするな
- パフォーマンス　＜　メンテナンス性
- メンテナンス性が失われれば、将来パフォーマンスが失われる可能性も生む。

###Render Layerとは
- relative, absolute, fixed, transformを使うと、Render Layerが生まれる。
- 消費コストは高いが非同期処理となる。
- 特にabsolute/fixedは、他要素との相対座標計算が省かれ高速。
- transformはleftなどより高速。

###Graphic Layer

- いわゆるハードウェアアクセラレーション
- GPUに処理を任せて、レンダリングを高速化できる
- もともとは3Dレンダリング用
- DevToolsの設定から"rendering"配下の"show composited layer borders"フラグを有効にすると、視覚的に確認できるようになる。(オレンジのボーダー部分)
- translate3d(0,0,0)など一部のCSSプロパティを指定することでハードウェアアクセラレーションを有効にすることができる。
- 特にモバイル端末でCSSアニメーションを使用する際は、アニメーション中のみハードウェアアクセラレーションを有効にすると良い。


###セレクタのパフォーマンス
- CSSセレクタは右辺から読み込まれる。ネストさせればさせるほどパフォマンス低下の原因に。
- 全称セレクタや子孫セレクタは重いのでできるだけ減らしたほうがよい。
- idやclassのみの指定が高速。
- だが、最近のブラウザのCSSのエンジンはかなり高速となっている。
- なので、メンテナンス性や耐久度の高いHTML/CSS構造をつくるためであればそちらを優先したほうがよいかも。
- 体感速度にはさほど影響はでない。


###CSSスプライト
- 体感速度が重要。まとめすぎても体感速度が遅くなる。
- なので、まとめすぎず、分割しすぎずが大事。
- 同時接続数と、プログレッシブレンダリング(非同期)を活かす
- 同時接続数は基本的に6。IE6とIE7は2。

###Webフォントについて
- シンプルなものであれば使って良いが、対象ブラウザでの視覚的テストは必須
- 画像と違ってプログレッシブレンダリングではないため、体感速度においては画像より劣る可能性もある

##レスポンシブデザイン
- レスポンシブである以上、モバイルフォースとにならざるを得ない。
- また、モバイル端末はファイルサイズ上限に注意。
- モバイル端末でアニメーションを行う対象の要素は
absolute/fixedにすること。

##Service Workerとは
- バックグラウンドで動くJS
- App Cacheのようなキャッシュの仕組み
- こいつがあれば、ネイティヴアプリとパフォーマンスで戦えるかも？要チェック。


##まとめ
- Web高速化においてボトルネックは、１つでもあってはならない。
- そのためには、ブラウザの処理プロセスを知ることが必須。
- モバイル端末でなめらかにアニメーションさせるためにはコツがいる
- CSSスプライトやファイル結合をする上で、サイズ上限を気にすること。
- パフォーマンス改善は果てがない。１から１０まで全部を求めないこと。

* * *
###参考サイト
[Slide share ブラウザにやさしいHTML/CSS](http://www.slideshare.net/TakeharuIgari/htmlcss-34506501?related=1)

[CSSセレクタによる高速化](http://developers.linecorp.com/blog/?p=178)

[Slide share ウェブパフォーマンスの基礎とこれから](http://www.slideshare.net/kawada_hiroshi/ss-46149727?related=3)
lenv - Luaバージョンマネージャー

普段 Lua のモジュールを書いては GitHub で管理してるんだけど、誰かに使って欲しいなんて気持ちがまるでないし、基本的に LuaJIT で使うのでサポートするバージョンは 5.1.5 でいいやなんてお思ってるので MoonRocks には公開してなかったりする。

でも時々「ねぇねぇ！5.2 系で動かないんですけどー！（意訳）」なんてバグ報告くるとサポートしてないって一蹴するのもなんかなんかだし、面倒だなぁなんて思いながらも Lua や LuaRocks のインストールをして環境整えて再現するかチェックしてたんだけど、いい加減ウルトラめんどくさいよ！

自分に甘くやりたいことだけやってきたNullいエンジニアなので（そもそもエンジニアなのかも謎なんだけど）シェルとか書きたくなかったけど、どうせ書かなきゃいけない時がくるだろうしってことで Lua のバージョンマネージャーを書いてみました。

lenv - https://github.com/mah0x211/lenv

## インストール

以下、使い方つらつらと書き連ねますが「ねぇねぇ！うちの環境で動かないんですけどー！」なんて事になったら、詳細を教えて頂けたら（出来る範囲で）直したいと思います。


```
$ curl -L http://git.io/lenv | sh >> ~/.bashrc
$ source ~/.bashrc
```

マニュアルは `help` コマンドで見れます。

```
$ lenv help
lenv 0.1.0

Usage:
    lenv help                           Show this message
    lenv path                           Show the configured paths
    lenv update                         Update lenv
    lenv fetch                          Fetch remote versions
    lenv vers                           List available versions
    lenv ls                             List installed versions
    lenv install <version> <opt...>     Download and install a <version> of lua
                                        with luarocks
    lenv install-lj <version> <opt...>  Download and install a <version> of 
                                        luajit with luarocks
    lenv uninstall <version>            Uninstall a <version> of lua
    lenv uninstall-lj <version>         Uninstall a <version> of luajit
    lenv use <version>                  Use a <version> of lua
    lenv use-lj <version>               Use a <version> of luajit
```

## Lua のインストール

`fetch` コマンドで Lua と LuaJIT と LuaRocks のバージョンとソースファイルのURLをクローリングしてきます。最初にこれをしないとそもそもLuaのインストールが出来ません。

それが終わったらバージョン番号を指定してインストールします。ついでに最新の LuaRocks もインストールされます。

```
$ lenv fetch
...snip...
$ lenv install 5.1.5 macosx
```

インストールしたバージョンを使うには `use` コマンドを使います。

```
$ lenv use 5.1.5
$ lua -v
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
```

こうするとホームディレクトリの `.lenv` ディレクトリに `current` というシンボリックリンクが出来るので、その中の `luarocks` ディレクトリに LuaRocks の設定ファイルが入ってるので、リポジトリの追加をしたい時はファイルをお好きなエディタで編集してください。

---

それにしても東京にきて今月終わったら2ヶ月経つのだけれど、ネットワーク環境が貧弱すぎてほとんどコードが書けてないし、その上、友達もいないしでマンションの一室のベッドの上で死んだように寝るのがマイブームになりつつあります。（強がり

恵比寿ってトコでぼーっとしてるので、どなたか食事にでも誘ってください！もちろんワリカンで！w　て、こんなコト書いたら消されそうですね。
以上です。
Spring Boot + Spring Data JPA + PostgreSQL の環境で Tomcat を起動すると、"java.sql.SQLFeatureNotSupportedException: org.postgresql.jdbc4.Jdbc4Connection.createClob() メソッドはまだ実装されていません。" というログが出力される

src/main/resources の下に hibernate.properties というファイルを作成し以下の内容を記述すれば、ログが出力されなくなります。

```hibernate.properties
hibernate.jdbc.lob.non_contextual_creation = true
```
初心者入門!RubyでSeleniumを使いスクレイピングや面倒な作業の自動化をしてしまおうパート1

#何ができるの？

Seleniumを使えば、
GoogleでSeleniumと検索し、検索結果をテキストファイルに出力なんて事が自動で出来てしまったり、
ブラウザで面倒なポチる作業を自動化する事が出来る。
とあるアンケートを自動で答えられてしまったりかなり便利だ。
そんな魔法な事が出来るSeleniumを入門編として紹介する。
(本来はテストツールとして使われています。)

言語はRubyで解説はWin環境な事にご理解を頂きたい。
（MacユーザーはデフォでRubyがインストールがされていたりするらしいのでインストールを飛ばしてやってみてください。）

#インストール方法
初心者の人はRubyのインストールから。
バージョンは2.0でRubyInstallerでインストール。
http://rubyinstaller.org/
関連付け等のチェックは忘れずに3箇所フルでチェック。
その後にGemインストール。
```gem install selenium-webdriver```
Firefox、Chromeのインストールも忘れずに（管理者権限が無くてもここまで出来るから）

#サンプルを自分でエクスポート（出力）
早速自動操作へ
SeleniumBuilderというものでサンプルを自作してみよう。
Firefoxを立ち上げて下記からインストール。
http://seleniumbuilder.github.io/se-builder/

※最新版Firefoxでは上手く動作しないので37.02のFirefoxポータブルを活用
Selenium関連で最新版のFirefox 38に不具合がある件
http://qiita.com/hotu_ta/items/52077b107203405e2e42

FirefoxPortable_37.0.2_Japanese.paf.exe (43,531,512 バイト/MD5: 8ba528c3eee1bed1fadaad5b9d4a4b6c)のダウンロードが開始されます。
http://osdn.jp/projects/sfnet_portableapps/downloads/Mozilla%20Firefox,%20Portable%20Ed./Mozilla%20Firefox,%20Portable%20Edition%2037.0.2/FirefoxPortable_37.0.2_Japanese.paf.exe/


インストールが完了したらSelenium2を選択で記録開始
適当に「あ」など検索してエクスポート。
https://www.google.co.jp/

#Firefoxで立ち上げ

適当な場所に保存してダブルクリックで実行。
※6/7現在残念ながら最新版Firefoxでは動作しない。

#Chromeで立ち上げ方

```wd = Selenium::WebDriver.for :firefox```
↓
```wd = Selenium::WebDriver.for :chrome```

へ変更。

これだけでは立ちあがらないのでパート2へ続く。

#参照

初心者でも簡単！RubyでSeleniumスクレイピングや操作の自動化をしてみよう(パート1)
http://hotuta.hatenablog.com/entry/2015/05/20/203904
Ansible1.9からはsudo/suの代わりにbecomeを使う

今まではplaybookをroot権限で実行したい場合に :point_down: のように`sudo`ディレクティブを使って書いていた。

```
- hosts: all
- sudo: yes
```

Ansible1.9からは`become`ディレクティブを使って同じことができる。

```
- hosts: all
- become: yes
```

もちろんtask毎に指定することもできる。

これだけ見ると前者の方が分かりやすく見えるが、そもそも`sudo`ディレクティブは必ずしもrootユーザに切り替わるわけではなく`sudo_user`に設定されているユーザ(デフォルトはroot)に切り替わるので、例えば :point_down: のようにroot以外のユーザに切り替わるために使うこともできた。

```
- hosts: all
- sudo: yes
- sudo_user: deploy
```

Ansible1.9からはこう書ける。

```
- hosts: all
- become: yes
- become_user: deploy
```

個人的には`become`の方が実際の機能に即していて誤解が少ない名前だと思うし、`sudo`は後方互換のために残してあるものの非推奨になったらしいので今後は`become`を使った方が良さそう。

ちなみに`become_method`というディレクティブも追加されていて、例えばsudoではなくsuを使って権限変更をしたい場合には :point_down: のように書けばいい。

```
- hosts: all
- become: yes
- become_method: su
```

関連リンク: http://docs.ansible.com/become.html
「アジャイルサムライ読書会 廣島道場　２−１」参加したよ

https://sukusuku-scrum-hiroshima.doorkeeper.jp/events/24114

３年ぶりのアジャイルサムライ廣島道場に参加しました。

「ざっくりわかるアジャイル開発」で目が止まったワード。

* 自分の頭で考えるのをやめちゃだめだ
* 期待をマネジメントする

![20150520-read.png](https://qiita-image-store.s3.amazonaws.com/0/53620/1f1d552c-05e5-7bb7-fd91-fff7a36fef05.png)

ディスカッションでは「価値」とは何かっという点と「イテレーションの長さ」について、記憶に残りました。

「価値」とは、なんだろう？
お客様が求める価値が、開発者の経験から「無駄じゃないか」「価値がないのではないか」っと思った時にどうするべきか？悩むなー。

どんな理由でも止めるより、前に進んだ方が確実に真実の価値に近づく気がする。

「無駄じゃないか」「価値がないのではないか」って思った時に「しない」っということではなく、お客様の価値を実現するために考え抜いて、知恵を絞り出すのが大切なんだろうな。

イテレーションの長さについて、長くしても問題の解決にはならないんじゃないかっとの指摘。
最初はうーん、、、っという感じだったけど、１週間でできる粒度まで「大きな問題を小さくする」ことができてないのではっということを聞いて納得しました。

「大きな問題は小さくする」難しいけど、大切なことだー。
Concealを使って文字列を暗号化してPreferenceに保存する。

##やること
ConcealとはFacebook社がオープンソースで開発している、Android用の暗号化ライブラリです。今回はこのライブラリを用いて文字列を暗号化してPreferenceに保存します。

###暗号

```storeKey.java
public static void storeToken(Context context, String token){
        SharedPreferences preferences = context.getSharedPreferences(PreferenceValue.PREF_KEY, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor;

        String accessKey = UUID.randomUUID().toString();
        editor = preferences.edit();

        Crypto crypto = new Crypto(
                new SharedPrefsBackedKeyChain(context),
                new SystemNativeCryptoLibrary());
        if(!crypto.isAvailable()){
            return;
        }
        try {
            byte[] encryptedKey = crypto.encrypt(token.getBytes(), new Entity(accessKey));
            editor.putString(PreferenceValue.TOKEN_ACCESS_KEY, accessKey);
            editor.putString(PreferenceValue.ENCRYPTED_KEY, Base64.encodeToString(encryptedKey, Base64.DEFAULT));
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }catch (CryptoInitializationException e){
            e.printStackTrace();
        }catch(KeyChainException e){
            e.printStackTrace();
        }catch(IOException e){
            e.printStackTrace();
        }
        editor.apply();
    }
```

今回は秘密鍵としてUUIDを用いました。また、byte型はPreferencesに保存できないのでBase64エンコーディングでSting型に変換して保存しました。また秘密鍵もPreferenceに保存しました。

###復号

```getKey.java
public static String getToken(Context context){
        SharedPreferences preferences = context.getSharedPreferences(PreferenceValue.PREF_KEY, Context.MODE_PRIVATE);
        String accessKey = preferences.getString(PreferenceValue.TOKEN_ACCESS_KEY, null);
        String encryptedToken = preferences.getString(PreferenceValue.ENCRYPTED_KEY, null);
        byte[] rawEncryptedToken = null;
        String rawDecryptedToken = null;
        if(encryptedToken!=null&&accessKey!=null) {
            rawEncryptedToken = Base64.decode(encryptedToken, Base64.DEFAULT);

            Crypto crypto = new Crypto(
                    new SharedPrefsBackedKeyChain(context),
                    new SystemNativeCryptoLibrary());
            if (!crypto.isAvailable()) {
                return null;
            }
            try {
                byte[] decryptedToken = crypto.decrypt(rawEncryptedToken, new Entity(accessKey));
                rawDecryptedToken = new String(decryptedToken);
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (CryptoInitializationException e) {
                e.printStackTrace();
            } catch (KeyChainException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return rawDecryptedToken;

    }
```

参照側のメソッドでも取り出した文字列をBase64でデコードしてbyte型に変換したあとで、同じくPreferenceに保存した秘密鍵を使って復号している。

これで一応、Preferenceの中の文字列は暗号化された状態になります。
しかし、Androidはリバースエンジニアリングが容易に出来てしうので、大事なデータを端末に保存するのはできるだけやめたほうがいいと考えられます。ちなみに以下のリンクでは秘密鍵の保存場所をNDKのコードに格納しているようです。

##参考文献
http://techracho.bpsinc.jp/baba/2012_09_23/6178
http://qiita.com/kobakei/items/cb67f8b605b69b11b4eb
SublimeTextで矩形選択のキーボードショートカットを登録する


SublimeTextでVintageモードにしてもVimでいうところのctrl+vの矩形選択が使用できません。また、デフォルトで設定されているショートカットはマウスを使うものとキーボードショートカットが用意されていますが、キーボードショートカットはシステムで予約されているものと重複していてそのままだと使うことができないので、キーショートカット設定をいじって変更します。マウス握るのは面倒ですよね。

あまり難しいことでもないですが、意外と資料が見つからなかったので書いておきたいと思います。
（探し方が悪かったのでしょうか、select_linesで調べると結構でてきますね…）

## 環境
* MacbookPro(OS X Yosemite 10.10)
* SublimeText3

## 設定方法
1. `command + shift + p` から「key user」などと入力して「Preferences: Key Bindings - User」を開きます。
（メニュー -> Preferencesからも開けます）
2. 次のように入力

```json:json
[
    { "keys": ["ctrl+shift+k"], "command": "select_lines", "args": {"forward": false} },
    { "keys": ["ctrl+shift+j"], "command": "select_lines", "args": {"forward": true} }, 
]
```

`"command": "select_lines"` が矩形選択の設定です。自分は `ctrl + shift + j/k` で上下ラインを矩形選択するように設定しています。お好みで「keys」の値を変えてみてください。

![スクリーンショット 2015-05-20 23.02.56.png](https://qiita-image-store.s3.amazonaws.com/0/48393/146a08a5-47c1-b5a5-425e-5bcb472a5275.png "スクリーンショット 2015-05-20 23.02.56.png")

こんな風に入力できます。戻るにはESCキーで。
aws_security_groupのCycleエラー


TerraformでAWSのsecurity groupを設定した時にハマったのでメモ。

Security Groupの設定はaws_security_groupで行うが、２つのaws_security_groupのingress, egressのsecurity_groupsのidがお互い参照しあっていると、Cycleエラーが発生する。

```:aws.tf
provider "aws" {
    ...
}

resource "aws_security_group" "sg1" {
    name = "sg1"

    ingress {
        from_port = 80
        to_port = 80
        protocol = "tcp"
        security_groups = ["${aws_security_group.sg2.id}"] # お互いに参照しあっている
    }
}

resource "aws_security_group" "sg2" {
    name = "sg2"

    egress {
        from_port = 80
        to_port = 80
        protocol = "tcp"
        security_groups = ["${aws_security_group.sg1.id}"] # お互いに参照しあっている
    }
}
```

```sh:terminal
$ terraform
There are warnings and/or errors related to your configuration. Please
fix these before continuing.

Errors:

  * 1 error(s) occurred:

* Cycle: aws_security_group.sg1, aws_security_group.sg2
```

こういう場合は、片方のingress、egressをaws_security_group_ruleにすると、回避できる。

```:aws.tf
resource "aws_security_group" "sg1" {
    name = "sg1"

    ingress {
        from_port = 80
        to_port = 80
        protocol = "tcp"
        security_groups = ["${aws_security_group.sg2.id}"]
    }
}

resource "aws_security_group" "sg2" {
    name = "sg2"

#    egress {
#        from_port = 80
#        to_port = 80
#        protocol = "tcp"
#        security_groups = ["${aws_security_group.sg1.id}"] # お互いに参照しあっている
#    }
}

# sg2のegress設定をaws_security_group_ruleにする
resource "aws_security_group_rule" "sg2_egress_http_80" {
    security_group_id = "${aws_security_group.sg2.id}"
    type = "egress"
    from_port = 80
    to_port = 80
    protocol = "tcp"
    source_security_group_id = "${aws_security_group.sg1.id}"
}
```

量が増えるとつらそうなので、他に良い書き方がありましたら教えてくださいー
sequelizeを利用したNodeアプリが突然エラーを吐いたらthen問題だよ

# お伝えしたいこと

sequelize 2.1.0以降からsuccess関連が使えなくなっているので注意。大人しくthenにしましょう。

>Backwards compatibility changes
Events support have been removed so using .on('success') or .success() is no longer supported. Try using .then() instead.
Trying to apply a scope that does not exist will always throw an error

こういうパターンで死にます。

```
User.findOne.success(function(user){ 
if (user) { 
// なんらかの処理
} else {
// なんらかの処理
});
```
↓こうしましょう

```
User.findOne.then(function(user){ 
if (user) { 
// なんらかの処理
} else {
// なんらかの処理
});
```
Sprockets, Turbolinks…あらかじめ敷かれたRail

Railsでプロジェクトを組むと、JavaScriptやCSSの管理などもRailsに含まれたモジュールが行うようになりますが、デフォルトの設定がちょっと気になるもので、そのままレールに乗るべきなのか迷うものとなっていました。

#Rails4でのデフォルト設定
## Sprockets
[Sprockets](https://github.com/sstephenson/sprockets)はJS/CSSのコンパイル、依存管理などを行うツールです。それ自体はもちろん有用なのですが、デフォルトの設定で

```js:application.js
    //=require_tree .
```
というように、自分で用意したJavaScriptをすべて読み込むような動作となっていました。
## Turbolinks
[Turbolinks](https://github.com/rails/turbolinks)は、Rails 4から標準で読み込まれるようになったgemで、`<a>`タグのリンクを乗っ取って、CSSやJavaScriptが同じなら、`<body>`だけを差し替えることでHTML以外の読み込みをすっ飛ばして高速化する、というツールです。この高速化が全力を発揮するには、すべてのページでCSSやJavaScriptを揃える必要があります。

# デフォルト設定の利害得失
このようなデフォルト設定を考えた時に、メリット・デメリットの双方があります。

## 書きやすさ vs 書きにくさ
どんなファイルを作っても読み込んでくれるということで、単位ごとにファイルに切り出して、見通しの良いコードを書くこともできるかもしれません。ただ、逆に言えば全ページで**読み込まれてしまう**ので、JavaScriptにしてもCSSにしても、必要以上の場所に当たらないように気をつけてコードを書かないといけません。

## 遷移時間 vs ファーストビュー
Turbolinksが効くことで、サイト内のページ遷移速度は最高となりますが、サイトに入った際にすべてのJS・CSSを読み込むので、ファーストビューの表示には悪影響となります。ファーストビュー速度に注力したい場合は気をつけたほうがいいかもしれません。

## TurbolinksとJavaScript
Turbolinksを有効にした状態でページ遷移が起きると、内部的な動きは通常と大きく違ったものとなります。JavaScriptを書く場合には、実行されない場合や多重実行されることがあるので、注意が必要です。

# ケース・スタディ
## 大きくデザインが違うページの場合
ユーザー向け画面と管理画面など、レイアウトから取り替えるほどにデザイン・利用者が大きく違うページがある場合、それはアセットファイルを分けたほうがいいでしょう。無関係な2つの画面向けのファイルを連結することは、メリットよりデメリットが多いですし、両者の間でほぼ遷移しないならTurbolinksの悪影響もありません。

## モバイルサイトの場合
モバイルサイトでは、最初に読み込むデータ量がファーストビューの速度に大きく効いてきます。自動で読み込みするのは最小限として、あとは遅延ロードで補うのが理想形ではあります。

## 管理画面の場合
管理画面では1人あたりページビューが多く、またファーストビューの速度がクリティカルとなる状況でもありませんので、デフォルト設定が最も威力を発揮すると感じました。ただ、バリデーションや入力補助でJavaScriptが増えがちなので、うまくTurbolinksと整合させる必要はあるでしょう。

#まとめ
Railsはシステムについてあらかじめレールを引いていてくれていますが、それは必ずしもあらゆる場合に最適だとは限りません。どのようなレールが敷かれているかを知った上で、時には意図的に分岐することも必要でしょう（もちろんそれは、レールに乗れないのとか脱線するのとはまた違った話です）。

## 妄想
最初は必要最低限のアセットを読み込み→ページを人間が見ている間にアセットを遅延ロード→Turbolinksで遷移する頃には揃っている、なんてようにすれば、ファーストビューと遷移速度を両立できそうだけど…うまく作れるかな？
scss-modeで、カンマ列挙時のインデントを修正する

# 問題点

scss-mode (scss-mode 20150107)では、インデントがおかしい。

```scss
&:link, &:hover {
  color: #333;
}
```
とか書いても、

```scss
&:link, &:hover {
          color: #333;
        }
```
こうなってしまう。

# 対策

カンマがおかしくなっている原因っぽいので、syntax-tableを弄って、カンマをスペースとして扱わせる。

```el
;; scss-mode
(require 'scss-mode)
(add-hook 'scss-mode-hook
          '(lambda()
             (modify-syntax-entry ?, " " css-mode-syntax-table) ;; この行を追加
))
```

僕の環境ではいい感じになりました。