OmniAICreator/Qiita-1.07M huggingface dataset:
bashなどで{}で展開する時は、メモリの使用量に気をつけよう

bashなどで、{}で展開する時は、メモリの使用量に気をつけましょう。
途中で止めようと思っても、止められません。
また、その後の動作がおかしなことになります。要注意。
(止めたい場合は、他のコンソールからbashをkillするしか・・)

※ulimit -m (メモリ上限) -v (仮想メモリ上限)などを設定しておいた方が無難です。

----
スクリプトの中で{}での展開を使っている場合、潜在的にこの問題の影響を受けるかと思います。その点では、seqの方が優秀。

他の言語でいうと、例えば(Pythonなどの) xrangeとrangeの関係(rangeの方)なので、注意が必要です。
スマホアプリ開発者が知っておきたいアドネットワーク一覧


# はじめに

スマホアプリを開発してもお金を稼ぐことができないとビジネスとして続けていけないですよね。

現在のスマホアプリでのお金の稼ぎ方は、
・広告
・有料アプリ
・無料アプリ(アプリ内課金)
以上の大きく３つに分類されると思います。

無料で使える便利なアプリがたくさんある状況でユーザーからお金をいただく、というのはなかなかハードルが高いものです。そこでまずはアプリ内で広告を配信することで収益を上げたい。

スマホアプリ界にはたくさんのアドネットワークがあり、あまり整理されていないようだったので一覧にしてみました。

他にもあったら教えて下さい。

## 広告による収益

アドネットワークと一言で言ってもクリックによって収益が発生するタイプ(バナー広告はたいていこれ)だったり、
動画広告だと再生されるだけで収益が発生したり様々です。

同じ広告方式でも単価が倍以上違うこともあるので検討する際は詳しく調べてみるといいかと思います。

# アドネットワーク一覧

|アドネットワーク名|URL|運営会社|広告種別|
|:--|:--|:--|:--||
|Admob|https://www.google.co.jp/admob/|Google|バナー・インタースティシャル|
|MoPub|http://www.mopub.com/|Twitter|-|
|Nend|http://nend.net/mediapartner|ファンコミュニケーションズ|バナー・インタースティシャル|
|Amoad|http://www.amoad.com/publishers/|サイバーエージェント|バナー|
|Adlantis|http://sp.www.adlantis.jp/#forPub|バリューコマース|バナー・インタースティシャル|
|App-CM|http://www.app-cm.co.jp/service/media.html|アップシーエム|動画広告|
| AppVador |http://www.appvador.com/| AppVador |動画広告|
|AdColony|http://video-ad.glossom.jp/|グロッサム|動画広告|
|InMobi|http://japan.inmobi.com/exchange/publisher/| InMobi |インタースティシャル|
|adcrops|https://adcrops.net/|8crops|インライン・インタースティシャル|


ここからどれがいいか選ばないといけないのが大変ですが、海外向けが多いなら Admob や MoPub でしょうか。

ニュースアプリなどだとバナー広告が無難でしょうか。個人的にはインタースティシャルは嫌われる傾向がある気がしています。
ゲームなどユーザーの集中力が切れるタイミングがある場合は動画広告を検討するといいのではないかと思います。

# Ad SDK を含むことによるリジェクト(2015/05 追記)

最近(2015/05-)アイコン型広告を配信するAd SDKを含んだアプリが Apple のレビューでリジェクトされる、という現象が起きていました。Ad SDKを使われる方は使用するSDKでリジェクトされたケースがないか確認したほうがよさそうです。

知っている範囲だと Nend SDK は 2.7.0 より古いバージョンを含んでいるとリジェクトされるケースがあったそうです。
https://www.nend.net/m/home/info/243

# 広告のメディエーション

複数のアドネットワークの広告を組み合わせて表示することをメディエーションといいます。有名どころでは Admob がその機能を提供しています。複数のアドネットワークを組み込む(アダプターを使います)ことで収益の最大化を狙う、というアプローチもあります。

https://support.google.com/admob/answer/3063564?hl=ja

# 最近の広告での収益(2016/01/27 追記)

CPC(バナー広告クリックでの収益発生)型の収益率が下がってきているような気がします(自分だけ？)

CPI(アプリインストールで収益発生)型の広告を導入して試しています。

おすすめのアドネットワークあれば教えていただけるとうれしいです。
md5ざっくりまとめ


- MD5（Message Digest Algorithm 5)
- 任意の長さの原文を元に128bitの値を生成するハッシュ関数の1つ
- 与える値の長さがなんであれ、生成されるのは128bitの値になる
- 同じ入力値からは必ず同じ値が得られる一方、少しでも異なる入力値からは全く違う値が得られる
- データの伝送や複製を行う際、入力値と出力値でハッシュ値を求めて一致すれば途中で改ざんや欠落が起こっていないことを確認できる
- ファイルの一致を確認する用途で使われていることが多い印象をうける（個人的な感覚）
- 近年では同一のハッシュ値を持つ異なる原文のペアを効率よく探索することができるようになっていて、セキュリティ用途でmd5を使うのは十分に安全とは言えない状況になってきている。SHA-2などより安全なハッシュ関数の使用が推奨されている
- 【注意】 ハッシュ化と暗号化は異なるので注意。ハッシュ関数は不可逆な一方向関数を含むため、ハッシュ値から原文を再現することは（基本的に）不可能。一方、暗号化されたものは復号化できる。md5はハッシュ化の方。

# Linuxのコマンドでファイルのmd5値を求める
`md5sum`コマンドを使う。

```
$ md5sum /tmp/sample.txt
d41d8cd98f00b204e9800998ecf8427e  /tmp/sample.txt

// 適当な文字列を書き込む
$ echo "foo" > /tmp/sample.txt

// ハッシュ値は変わる
$ md5sum /tmp/sample.txt
d3b07384d113edec49eaa6238ad5ff00  /tmp/sample.txt
```

# Rubyでmd5値を求める
`Digest::MD5`を使う。

```ruby
require "digest/md5"

# 与えられた文字列に対するハッシュ値を文字列で返す
# => "\xAC\xBD\x18\xDBL\xC2\xF8\\\xED\xEFeO\xCC\xC4\xA4\xD8"
p Digest::MD5.digest("foo")

# 与えられた文字列に対するハッシュ値をASCIIコードを使って16進数の列を示す文字列にエンコードして返す
# => "acbd18db4cc2f85cedef654fccc4a4d8"
p Digest::MD5.hexdigest("foo")

# 新しいダイジェストオブジェクトを生成し、ファイル名で指定したファイルの内容を読み込み、そのダイジェストオブジェクトを返す
# => #<Digest::MD5: d3b07384d113edec49eaa6238ad5ff00>
p Digest::MD5.file('/tmp/sample.txt')
```

# 参考
- [MD5とは｜Message Digest 5 - 意味/解説/説明/定義 ： IT用語辞典](http://e-words.jp/w/MD5.html)
- [ハッシュ化と暗号化は違う。ハッシュ化（SHA1,MD5)すると、元には戻らない - ウィリアムのいたずらの開発日記](http://blog.goo.ne.jp/xmldtp/e/b6a697735a597e8e41af460ae2f2875a)
- [ファイルが一致することを確認する - いますぐ実践! Linuxシステム管理 / Vol.100](http://www.usupi.org/sysad/100.html)
- [class Digest::Base](http://docs.ruby-lang.org/ja/2.2.0/class/Digest=3a=3aBase.html)
【Mac】アプリ毎に入力ソース(日本語、英字…etc)を記憶する設定

Macには標準でアプリ毎に入力ソースを記憶出来る設定がある。

これを設定しておくことによって例えば、

- Terminal : 英字入力
- Pages : 日本語入力

という事が切り替え無しに行える。

# この記事を書いたときの環境

![00.png](https://qiita-image-store.s3.amazonaws.com/0/85825/7e41b551-dc7b-4375-2060-608a2511e8dd.png)

# 設定方法

「設定」アプリから「キーボード」に移動。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/85825/fcb0909c-15b2-2de3-f5a5-fec43e98eff1.png)

「入力ソース」タブを選択し、「書類ごとに入力ソースを自動的に切り替える」にチェックを入れる。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/85825/ae2c8d7d-2e50-19ea-d244-921c2a98b3f1.png)

以上。
UnityでMenuBarからシーンへのショートカットを作る


# 皆様Unityでシーンを切り替える時、どうされてますでしょうか?
Projectの検索窓でt:sceneとか、直接sceneファイル検索とか...

## Editorスクリプトでの対応

```SceneOpener.cs
using UnityEditor;

public class SceneOpener{

	[MenuItem("Scenes/Main")]
	private static void OpenMain()
        {
	    EditorApplication.OpenScene("Assets/hoge/fuga/Main.unity");
	}
}
```

こんな感じのEditorスクリプトを書けばショートカットは作成できますが、
如何せん手入力はめんどくさい。

## 自動化への道

ということで
シーンファイルを検索して、MenuItemを登録するrubyを書いてみました。

```sceneregisterer.rb
#!/usr/bin/ruby

#エディタスクリプトのパス
editorpath = "../Assets/hogehoge/SceneOpener.cs"

#クラス宣言文字列
prefix = <<"EOS"
using UnityEditor;
using System;

public class SceneOpener{

EOS

code = prefix

#シーンファイル検索
Dir::glob("../Assets/**/*.unity").each {|f|

  basename = File.basename(f)

  sceneName = basename.sub(".unity","") ;
  scenePath = f.sub("../","");

	code.concat("	[MenuItem(\"SceneOpenerAll/#{sceneName}\")]
	    private static void Open#{sceneName}()
	    {
	       EditorApplication.OpenScene(\"#{scenePath}\");
	    }\n")
}

#クラスの括弧
code.concat("\n}")


#ファイルに書き込み
open(editorpath,"r+") {|f|
  f.flock(File::LOCK_EX)
  f.rewind
  f.puts code

  f.truncate(f.tell)
}
```

## これで便利に！
なったのはなったのですが、仕事のProjectでこれを走らせたらテストシーン含め
30個くらい登録されてしまい、結局よく使うシーンを手入力したほうがいいや
という落ちになりました。　~~ちゃんちゃん~~

## BuilderSettingsの中のシーンだけを取り込む

そもそも重要度の高いSceneしか開く必要ないよねという事で、
BuildSettingsから取り込む方法を考えました。

```SceneMenuGenerator.cs
using UnityEngine;
using UnityEditor;
using System.Text;
using System.IO;
using System.Collections;

public class SceneMenu : Editor {

	private static string openerPath = "hogehuga/SceneMenuOpener.cs";

	[MenuItem("Scenes/Generate")]
	private static void Generate()
	{
		string filePath = Application.dataPath + openerPath;

		StreamWriter sr = File.CreateText(filePath);

		sr.WriteLine(
@"
using UnityEditor;
using System.Collections;

public class SceneMenuOpener{");

		foreach (var s in EditorBuildSettings.scenes) {
		//	Debug.LogError(s.path);

			sr.WriteLine(GetMethodStr(s.path));
        }

		sr.WriteLine("}");

        sr.Close();

		AssetDatabase.Refresh();
        
	}

	private static string GetMethodStr(string scenePath)
	{
		string sceneName = Path.GetFileName(scenePath).Replace(".unity","");

		string baseStr = 
		"[MenuItem(\"Scenes/sceneName\")] " +
		"private static void sceneName() " +
		"{ " +
		"EditorApplication.OpenScene(\"scenePath\"); " +
		"}";
	
		baseStr = baseStr.Replace("sceneName",sceneName);
		baseStr = baseStr.Replace("scenePath", scenePath);

		return baseStr;
	}

}

```

これでBuildSettingsの中にあるシーンだけを出せるようになりました。
wicked_pdf でハマったエラー3つ

wicked_pdfはhtmlをpdfにしてくれるgemです。
環境依存でハマるポイントが多かったので書いておきます。

## binの追加

binファイルがないから実行できないよっていうエラーに対応しました。

プロジェクトフォルダ内にバイナリファイルを置いて、pdf出力のconfigに渡しました。
[wkhtmltopdf-binaryのgithub](https://github.com/wopata/wkhtmltopdf-binary/blob/master/bin/wkhtmltopdf)からダウンロードした。
これをみてくれるようにするために、exe_pathも渡す必要があった。

```config/initializers/wicked_pdf.rb
WickedPdf.config = {
  :exe_path => Rails.root.join('bin', 'wkhtmltopdf').to_s
}
```

## cssをprecompileに入れた

pdfレイアウト指定のためのcssファイルが、置いてあるはずなのに読み込んでくれないエラーに対応しました。precompileに書く必要があるみたいです。

```config/environments/xxxxxx.rb
config.assets.precompile += %w( pdf.css )
``` 

## フォントが指定できない

環境にインストールされてないフォントは使えないので、WebFontとか指定すると楽です。
AngularJS Full-Stack generatorのインストール時にエラー


## 概要

AngularJS Full-Stack generatorを以下の様にインストールしようとした時にエラーになりました。

````
$ sudo npm install -g generator-angular-fullstack

〜省略〜
npm ERR! Darwin 14.3.0
npm ERR! argv "node" "/usr/local/bin/npm" "install" "-g" "generator-angular-fullstack"
npm ERR! node v0.10.33
npm ERR! npm  v2.12.1
npm ERR! code ELIFECYCLE

npm ERR! spawn-sync@1.0.11 postinstall: `node postinstall`
npm ERR! Exit status 8
npm ERR! 
npm ERR! Failed at the spawn-sync@1.0.11 postinstall script 'node postinstall'.
npm ERR! This is most likely a problem with the spawn-sync package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node postinstall
npm ERR! You can get their info via:
npm ERR!     npm owner ls spawn-sync
npm ERR! There is likely additional logging output above.
````

おやおや、と思いましたがnodeがどうのこうのいってるので
nodejsの最新バージョンを確認しに行くと「v0.12.6」が最新・・・

多分ですが、バージョンの古さが原因っぽいですね。
ではnodeのバージョンを上げましょう。

````
$ sudo npm install -g n
$ npm sudo n stable
$ node -v
v0.12.6
````

で、再びトライ！

````
$ sudo npm install -g generator-angular-fullstack

〜省略〜
npm info ok 
````

いけました！
iOSでinputのフォーカス時に画面がズームするのを防ぐ


## 最近のviewport指定

タッチデバイス用のviewport指定として、`user-scalable=no` にしない（ユーザの操作の任意性を奪わない）ことが最近では推奨されるようになっています。

```html:ガチガチ
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
```

```html:最近の推奨
<meta name="viewport" content="width=device-width,initial-scale=1.0,minimum-scale=1.0">
```

## 悩ましい点
iOSでは、**input要素に指定しているフォントサイズが「16px」を下回ると、フォーカス時にズームされる** という仕様があります。入力し終わった時や、入力をキャンセルしたときにズームしたままなので、ユーザがピンチアウトして等倍に戻さないともとの見た目に戻りません。特に `position: fixed;` しているパーツがあると、正しく操作できない可能性もあります。
かと言って、16pxにすると大きすぎる！というデザイン的な事情もあるかも知れません。

## 解決策
力技ですが、font-size: 16px; はしておきつつ、`transform:scale()` で縮小表示すると、iOS側には「16pxですよ」と示しつつ、見た目はコンパクト、ということが実現できます。

```css:例
input[type=text] {
  font-size: 16px;
  transform: scale(0.8);
}
```

## 注意
ただし「16pxより小さい文字のフォームパーツは操作時/入力にズームさせないと見づらい」という思想は正しくもあるので、背く場合は操作性のチェックは必要です。
ulimitでメモリの使用量を制限する時

ulimit -mを使う時は、-vも併用する。
(他にも考えることは多数ありますが・・・)

あと、よく見たら、子プロセスがーーとなって泣かない！
(Segmentation faultが発生しても。)

----
設定を各場所にも注意しましょう。

参考:
[ファイルディスクリプタ数の上限変更とlimits.confの罠](http://staffblog.yumemi.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF%E6%95%B0%E3%81%AE%E4%B8%8A%E9%99%90%E5%A4%89%E6%9B%B4%E3%81%A8limits-conf%E3%81%AE%E7%BD%A0-2/)

----
※ulimitは、シェルの組み込みコマンドなので注意。

----
リファレンスを見つけにくいので。
http://ss64.com/bash/ulimit.html
http://ss64.com/bash/limits.conf.html
※limits.confに設定を書いた場合は、再起動後にも、制限が正しく反映されていることを確認しましょう。確認方法にも要注意。
(limits.conf以外の場所で設定した方が無難です。適用条件が限られるので・・)

----
SSH接続で、証明書を利用したログインや、PAM認証をオフにしている場合などにも注意。

----
確認方法の例:
`cat /proc/(PID)/limits`
参考:
[ulimitが効かない不安を無くす設定](http://blog.father.gedow.net/2012/08/08/ulimit-configuration/)

表示される内容:
Max resident set: (ulimit -m で設定した値)
Max address space: (ulimit -v で設定した値)
※limitsのUnits(表示単位)はbytesなので注意。
※Hard Limit: ユーザが変更できない上限、Soft Limit: (変更できる)設定値

----
メモリ制限のサンプル
http://unix.stackexchange.com/questions/34334/how-to-create-a-user-with-limited-ram-usage
ActiveRecord::Relationのメソッド…だったっけ？

ActiveRecordのオブジェクトは、メソッドチェーンでどんどん絞り込めるという便利な特性があります。さらに、モデルのクラスメソッドまで借りてきて動作してしまいます。

# 絞り込みのメソッドチェーン
RailsのActiveRecordによるモデルは、`.where(条件1).where(条件2)`というように、次々と絞り込んで、最後にまとめてSQLを発行することができます。

これはどういう仕組みなのかというと、`.where()`で`ActiveRecord::Relation`というクラスのオブジェクトを生成していて、実際にデータが必要になるまでSQLを生成するのを待つ一方で、さらに別な絞り込み条件を指定すると、内部的に条件を組み立てて、最終的なSQLの生成に備えています。なお、`p`で出力すると全データが出ますが、これは`p`のために生成したものです。

# スコープを使う
scopeの詳細は[他項に譲ります](http://qiita.com/Ayaka14/items/eb4718bf076a82714089)が、一言で言えば「検索用にモデルクラスに生やせるクラスメソッド」です。そして、このscopeは、`SomeModel.some_condition`のように、直接モデルクラスのメソッドとして使うだけでなくて、`SomeModel.where(...).some_condition`というように、メソッドチェーンの途中で呼び出すこともできます。

## あれっ？
上で述べたように、`.where`の返り値は`ActiveRecord::Relation`であって、`SomeModel`のクラスではありません。それなのに、なぜ全然違うクラスのクラスメソッドを呼び出せてしまうのでしょうか。

# 委譲の仕組み
気になったのでソースを追いかけてみると、`ActiveRecord::Relation`が読み込むモジュールの中に`ActiveRecord::Delegation`というのがありました。

[ここのソース](https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/delegation.rb)を見てみると、単に`method_missing`で流すだけではなく、一度見つけたメソッドを実際に定義することで次からは普通に呼び出せるようにする、なんて処理を行っていました。
ionicの覚え書き

<h1>ionicの覚え書き</h1>

<h2>リスト表示</h2>

-> `<ion-list><ion-item></ion-item></ion-list>`
でリスト表示できる

<h2>エッジのスクロールの禁止</h2>
要素が画面内に収まっているときにスクロール禁止する方法

-> has-bouncing="false"をタグに挿入する



<h2>ionic.cortrib.froseted Glass</h2>

メッセージがきたときに自動的に画面をスクロールしてくれるフレームワーク

https://github.com/driftyco/ionic-contrib-frosted-glass
からダウンロードできる。

そしたらionic.cortrib.frostedGlass.cssとionic.cortrib.frostedGlass.jsを`www/css/`と`www/js`におく。

![alt](https://gyazo.com/4dc07bbc4a6fcfbc1768744fe1bb1998.png)


index.htmlに読み込むタグを記入

```html:index.html
<link href="css/ionic.contrib.frostedGlass.css" rel="stylesheet">
<script src="js/ionic.contrib.frostedGlass.js"></script>
```

後は下記のように記述すればおっけ

![alt](https://gyazo.com/cf561c8a0dcbd18c647e1a282ff9a22f.png)
【PushBulletAPI】連絡フォームの通知をPushBulletを使って受け取る


巷(WEB)でよく見る「連絡フォーム」

これってほとんどの人がGmailなどに飛ばしているかと思います(勝手な想像)
いいとは思うんですがGmailとかだと気づかないうちに迷惑メール扱いされて儲け話などを逃してしまう可能性が無きにしもあらず。
そこで今回は便利な通知アプリ「PushBullet」を使ってフォームからの内容を受け取りたいと思います。

このアプリはPC・Android・iPhoneにも対応しているので外に出てても教えてくれるのがポイントです

**★方法**
***
##①各デバイスのアプリをDLしインスコする

↓からDLする

https://www.pushbullet.com/apps

(ここではChrome版を使って説明しています)


##②次にAPIを利用するための準備を行う

今回はGitHubで公開されている [Pushbullet for PHP](https://github.com/ivkos/PushBullet-for-PHP)を使わせてもらいます

作者に感謝しながら [Pushbullet.php](https://github.com/ivkos/Pushbullet-for-PHP/blob/master/src/Pushbullet/Pushbullet.php) をDLします。

DLが完了したら自分のサーバーにうｐしておきます。



##③HTMLなどで送信フォームを作る

![20150603224036.png](https://qiita-image-store.s3.amazonaws.com/0/85815/4d69cc7e-14aa-db80-044c-3cc089ef84a9.png)


↑こんなかんじで

 

##④自分のPushBulletのトークンを取得する

↓ここから見に行けます

https://www.pushbullet.com/account

![20150603224023.jpg](https://qiita-image-store.s3.amazonaws.com/0/85815/130a597f-2896-664f-4985-a683e2c9471d.jpeg)


##⑤送信フォームの値を処理するPHPを作る

(値の処理は各自にお任せします)

Pushbullet.php を使うために必要な項目は

一番最初に

```push.php
require_once './PushBullet.class.php';
```

次に

```push.php
$p = new PushBullet('　ここに自分のトークンを記述する　');
```

最後に

```push.php
#### Pushing to multiple devices(複数のデバイスに送信)
//Push to all of your own devices, if you set the first argument to NULL or an empty string
$p->pushNote(NULL, '【PushBulletのタイトル】'.’【変数に入れたフォームの値】’);
```
できたら Pushbullet.php と同じ場所にうｐします。

 

##⑥試しに送ってみる

![20150603224002.jpg](https://qiita-image-store.s3.amazonaws.com/0/85815/aa6f229f-4225-fb16-cc9e-2623d89bdcf7.jpeg)


こんな感じで見れます
D3.js 開発の参考になるサイトを集める

いろいろググってみても何故か出てくる情報の少ない（気がする）D3.jsの参考サイトを集めてみました。

## API Reference
これは言わずもがな。D3.jsのAPI Reference。
[API Reference](https://github.com/mbostock/d3/wiki/API-Reference)

だけど全編英語で膨大な量があるから、やりたいことをするのにどれを使えばいいかわかりづらいのがD3初学者には辛いところ。

## サンプルから解析する
[Examples Gallery](https://github.com/mbostock/d3/wiki/Gallery)

[D3.js本家サイト](http://d3js.org/)

[D3.js Gallery](http://christopheviau.com/d3list/gallery.html)

だからこういったサイトでやりたいことやってそうなサンプルを開いてコードを解析してみるのもいいです。地道な努力。

## 個人ブログ
あとは個人ブログなどいかがでしょうか。
D3.jsの専門サイトではないにしろ、かゆいところに手がとどくサンプルがあったりします。

[Scimpr Blog]
(http://blog.scimpr.com/category/javascript-2/d3-js-javascript-2/)

[GUNMA GIS GEEK]
(http://shimz.me/blog/category/d3-js)

[てっく煮ブログ]
(http://tech.nitoyon.com/ja/blog/)

## その他
英語ソースでもよければこの記事に載ってるサイトや本が有用でしょうか...?
[D3.js Resources to Level Up]
(https://engineering.eventbrite.com/d3-js-resources-to-level-up/)


今のところ以上！（全然集まってない）
gifアニメをmpegに変換する

環境：Mac OS X 10.10

ImageMagick + ffmpeg を使用

インストール

```
brew install imagemagick
brew install ffmpeg
```

コンバート

```
convert +adjoin anim.gif out/pic.gif
convert out/pic*.gif movie.mpeg
```

adjoinでgifアニメをバラして、もっかいconvertでmpegに結合
簡単でした！
HTML ファイルにビルド時の Git のコミットハッシュを入れるには

index.html などの HTMLファイルにビルド時の Git のコミットハッシュ情報があれば、ブラウザJSアプリでのリリース後のトラブル対応時に便利かと思い、入れる方法を考えました。Window.app.gitCommitHash などでも同等かと思います。

git rev-parse HEAD でコミットハッシュが得られます。これを package.json の scripts 欄から環境変数 GIT_COMMIT_HASH に格納して、gulp タスクを実行して、[gulp-replace](https://www.npmjs.com/package/gulp-replace) で HTML ファイルの適当なところを置き換えました。


▼ package.json

```.javascript
"scripts": {
  "build": "GIT_COMMIT_HASH=$(git rev-parse HEAD) gulp hoge"
},
```


▼ gulpfile.js

```.javascript
var replace     = require('gulp-replace');

gulp.task('hoge', function() {
  gulp.src('index.html')
    .pipe(replace('git_commit_hash_placeholder', process.env.GIT_COMMIT_HASH))
    .pipe(gulp.dest('build/'));
});
```


▼ index.html

```.html
<body data-git-commit-hash="git_commit_hash_placeholder">
```


他に、[Documentation - MaterializeCss](http://materializecss.com/) のトップページの "Latest Commit on Github: " 欄の仕組みも調べました。

  - https://github.com/Dogfalo/materialize/blob/v0.96.1/js/init.js#L66...L81
  - https://github.com/Dogfalo/materialize/blob/v0.96.1/jade/index/index_content.html#L20...L25
  - https://developer.github.com/v3/repos/commits/
Apache + mod_security + mod_security_crs

#フリーのWAF（Webアプリケーションファイアウォール）を導入してみた。
＜検証環境＞
　・CentOS 6.4
　・Apache 2.2.15

```lang:対象モジュールをインストール
[root]# yum --enablerepo=epel install mod_security mod_security_crs
```

```lang:この辺の設定は、こんな感じで
[root]# vi /etc/httpd/conf.d/mod_security.conf
----------------------------------------------------------------
<IfModule mod_security2.c>
    # ModSecurity Core Rules Set configuration
        Include modsecurity.d/*.conf
        Include modsecurity.d/activated_rules/*.conf

    # Default recommended configuration
    SecRuleEngine On
#    SecRuleEngine DetectionOnly
    SecRequestBodyAccess On
----------------------------------------------------------------
```

```lang:動作確認。
自分のサイトURLの後ろに『?union+select』を付与してアクセスしてみると。。。
http://xxxxxx.com/index.php?union+select
```

#こうなる。
※背景は、ログ（/var/log/httpd/modsec_audit.log）をtailしている。
Wiresharkでパケットキャプチャして確認した。
ちゃんと動作してみるみたい。
![mod_security_unionselect.png](https://qiita-image-store.s3.amazonaws.com/0/85364/ec30e648-31c5-b636-81e4-2bb44263e109.png)
***
サーバで作業時にログを残す

# あらまし
サーバ上でなにかしら作業する時にhistoryコマンドで見直してもいいけどだるいよね。
  -> コマンドと実行結果をログに吐かせておこう。

# 環境
- CentOS 6.6
- 察しの言い方は既に何やろうとしてるか気づいてると思います。

# Scriptコマンド
`$ man script`
- 早い話がこれで解決する。

## 使い方
```
### script <保存ファイル名(パスで指定してもいい)>
$ script log
スクリプトを開始しました、ファイルは log です        #ここから
$ touch hogehoge
$ exit
exit
スクリプトを終了しました、ファイルは log です        #ここまでが記録される
$ ls
hogehoge  log
$ cat log
スクリプトは 2015年07月09日 06時17分01秒
 に開始しました$ touch hogehoge
$ exit
exit

スクリプトは 2015年07月09日 06時17分10秒
 に終了しました$
```

## ちょこっと使い勝手を良くしたい
- いちいちファイル指定するのだるい
- 作業日時とユーザ名勝手に入れてよ
  - OKわかった。

## こうする
- ログの吐き出し先 ： /var/log/logterm/
- ファイル名 ： YYYYMMDDSS-ユーザ名.log

```bash
$ echo "alias logterm='sudo script /var/log/logterm/$(date +%Y%m%d%S)-`users`.log'" >> ~/.bashrc
$ source ~/.bashrc
```
```
[hogehoge@localhost ~]$ logterm
スクリプトを開始しました、ファイルは /var/log/logterm/2015070918-hogehoge.log です
[root@localhost hogehoge]# exit
スクリプトを終了しました、ファイルは /var/log/logterm/2015070918-hogehoge.log です
```

## ログファイル開く時
catとかなら問題ないんだけど、エディタで開くと改行コードとかが鬱陶しい

```
$ vim /var/log/logterm/2015070918-hogehoge.log
スクリプトは 2015年07月09日 06時25分26秒
 に開始しました^[]0;root@localhost:/home/hogehoge^G^[[?1034h[root@localhost hogehoge]# exit^M

スクリプトは 2015年07月09日 06時25分28秒
```

んでcolコマンドでゴニョる

```bash
$ col -bx < /var/log/logterm/2015070918-hogehoge.log > res.log
$ vim res.log
```

まだもうちょっとゴミついてるけどとりあえずここまで。

```
スクリプトは 2015年07月09日 06時25分26秒
 に開始しました0;root@localhost:/home/hogehoge?1034h[root@localhost hogehoge]# exit

スクリプトは 2015年07月09日 06時25分28秒
 に終了しました
```
mapnik 3.0

こんにちは。
[mapnik] (http://mapnik.org/) 3.0 をインストールしてみました。

- [homebrew] (http://brew.sh/) 利用
- [Python binding] (https://github.com/mapnik/python-mapnik) については未インストール
 - 現状は、```pip install mapnik```ではインストールできなかった

INPUT_PLUGINS=all 付きインストールしているので、input plugins を見ると、

```console
$ ls /usr/local/Cellar/mapnik/3.0.0/lib/mapnik/input
csv.input	ogr.input	postgis.input	sqlite.input
gdal.input	osm.input	raster.input	topojson.input
geojson.input	pgraster.input	shape.input
```
ATOM(windows版)と拡張子の関連付け

# 問題
必要な拡張子を`atom.exe`へ関連付けを行いATOMを使っているとある日突然ファイルが開けなくなります。

# 原因
デフォルトでは以下のパスにATOMが格納されます。
`C:\Users\user_name\AppData\Local\atom`

さらに下層にバージョン毎のフォルダが有り、最新バージョンフォルダ中にのみ`atom.exe`が存在します。
`C:\Users\user_name\AppData\Local\atom\app-1.0.0`
`C:\Users\user_name\AppData\Local\atom\app-1.0.2`


アップデートの際に新たなフォルダが作られ、過去バージョン内の`atom.exe`（関連付けしたパス）が無くなる為、
エクスプローラからファイルを開く事が出来なくなります。

# 対応策
1. バージョンアップが掛かるたびに関連付けのパスを変更する（面倒臭い）
2. エクスプローラなんか使わない（過激派）
3. 最新のパスに向かって開きたいファイルを投げるバッチを作る

# あった
3で対応しようと思いatomフォルダ内を眺めていると既に以下のファイルが用意されていました。

```:\Users\user_name\AppData\Local\atom\bin\atom.cmd
@echo off
"%~dp0\..\app-1.0.2\resources\cli\atom.cmd" %*
```

作りたかったファイルそのものです。
バージョンアップの際に`atom.cmd`も更新されパスが書き換わります。
これを実行すればいいだけでした。

# 結論
という事で下記のパス(`user_name`は人それぞれ)を必要な拡張子に関連付けました。
`C:\Users\user_name\AppData\Local\atom\bin\atom.cmd`

関連付けしたファイルのアイコンが残念になるので、嫌な人はツールか何かを使ってATOMのアイコンを設定すると良いかと。
`app.ico`というのもatomフォルダに入っていますね。


WindowsのATOMは関連付けが出来ないのでイマイチという意見を目にしたので 1.0.2 にバージョンアップされたタイミングで記事に残しました。少しでもATOMユーザが増えれば。

そんな具合です。
UITableView の区切り線(separator)を端まで伸ばす

UITableView のセルの区切り線(Separator)をテーブルの端まで伸ばすTIPS

いつもどおりStoryboard から separetorinsetいじって終わるかとおもいきや終わらず
少しハマったのでメモ

どうやらiOS8で追加されたマージンも合わせて調節しないといけないようだ。

```objc:willDisplayCell
// セパレータの設定
-(void)tableView:(UITableView *)tableView
 willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath{
    
    // Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
    
    // Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
```

上記処理を追加したらできた。

下記2つのプロパティを調整している
layoutMargins は自分自身のサブビューとのマージンを

preservesSuperviewLayoutMargins はlayoutMargins の値をスーパービューから引き継ぐかどうかの真偽値を表している。

どちらもiOS8から追加されたUIView のプロパティのようだ。
セルのスーパービューからサブビューとの間のマージンを引き継いでしまっているため、
それを無効化しないとセパレータがマージンに影響されてしまうようだ。



参考:[iOS 8 UITableView separator inset 0 not working](http://stackoverflow.com/questions/25770119/ios-8-uitableview-separator-inset-0-not-working)
UICollectionView の要素数が多い時にsizeForItemAtIndexPath が何度も呼ばれる

UICollectionView を使用していた時に少しハマったためそれに関するメモ
500個くらいの要素をCollectionViewで表示しようとすると、表示の際にアプリが止まる。
原因としては下記メソッドでセルの大きさを計算していたのが原因。


```objc:sizeForItemAtIndexPath
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout*)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
```

一つ一つのセルのサイズ計算コストはそこまで大きくない。
それが500とか積み重なると2~3秒の待ち時間となってしまう。

表示前に全てのセルの大きさを計算するこの処理を止めたりすることはおそらく不可能。
CollectionViewのコンテンツサイズ計算に必須なのだと推測される。


sizeForItemAtIndexPath メソッド内でセルのサイズ計算を行うような場合は、
大量の要素を表示しないようにするのが良いだろう。
もしくは、itemSizeをそれぞれ固定の大きさにして、上記メソッドを使用しないようにするというのも良い。


いずれにしろ、sizeForItemAtIndexPath メソッドを使用して大量のセルを表示しようとするとある程度の待ち時間が生まれるのは避けられない模様。
技適済みWi-Fiモジュール「ESP8266」


Cerevoさんから、[こんな発表](http://info-blog.cerevo.com/2015/07/07/1114/)があり、へえ、と思ってこのチップを少し調べたら、わりと面白そう、という話です。

# 概要

Data Sheetを読む限り、以下の感じらしいです。

- 802.11 b/g/n対応である。
- Tensilicaの32bit MCUが載っている
- TCP/IPプロトコルスタックが載っている
- STA/APどちらも対応する(STA+APってのもある)
- WPA/WAP2にも対応する
- Smart Link Function(Android, iOS)に対応(何これ？知らない)
- 10bit ADCも載っている
- I/FはSDIO, SPI, UART, I2C, I2S, IR, PWM, GPIOがある
- Deep sleep modeでは <10uAである
- light sleep modeでは、DTIM3で <1.0mWである

で、基本的には、UART(115k)経由のATコマンド(!!)で操作するようです。渋いですねー。
1 connection modeでは、まるでTAのごとくシリアル通信して、+++でエスケープするという、運動会の親子競技みたいになっています(802.11n + ATという意味で)。
他のI/Fはセンサー接続を想定しているようです。


# リンク

- Amazonでも[同じもの](http://www.amazon.co.jp/dp/B0115JPIAG)が買えるっぽい。Cerevoとの差は不明w。価格？
- CerevoさんのBlogは[こちら](http://tech-blog.cerevo.com/archives/859/)。これから連載されるっぽい(?)
- Data Sheet: [ESP-WROOM-02 WiFi Module Version 0.3](https://s3-ap-northeast-1.amazonaws.com/cerevo-share/ESP8266/ESP_WROOM_02_Datasheet_EN_v0.3.pdf)
- Hardware User Guide: [ESP8266EX Hardware User Guide](https://s3-ap-northeast-1.amazonaws.com/cerevo-share/ESP8266/ESP8266EX_Hardware_User_Guide_EN_v1.1.pdf)

# ATコマンド
[ここ](http://bbs.espressif.com/viewtopic.php?f=5&t=64)から、DLできます。pdfには、CONFIDENTIALと書かれていますが、まぁ公開されてるからよいのでしょう。
中身は、
WiFiモード(AP/ST)を選択して
接続(TCP/UDP)して
通信して
閉じる
という非常にシンプルで、割り切った感じで心地よいです。


# Firmの書き換え
SDKがあるようで、VirtualBoxで開発環境が提供されているようです。
上記のHW User guideの中にも記述がありますが、[ここ](http://bbs.espressif.com/viewtopic.php?f=21&t=165)からDL可能です。

SDK自体はまだ目を通していないので、何ができるかわかりませんが、場合によってはUARTで外から接続すらせずに、センサーデータの収集などがWiFi経由でできてしまうかも！？と思っています。

# 追記
ESP8266についてもう少しググってみると、Arduinoとの組み合わせが多くでてくるようです。技適なしのESP8266モジュールがわんさか検索にひっかかりますね。
そうか、Arduino方面で流行っていたのか。納得。下手に有線にするより安上がりと。なるほどー。


# 所感
おもしろいこと考える人がいるもんですね。
TCP/IPスタックなんて、所詮道具なんだからつながりゃいいんだよ、的な。

手元に届いたら遊んでみようと思います。

おわり。
Docker Compose - クイックスタート・ガイド：Compose と Django

# Docker Compose - クイックスタート・ガイド：Compose と Django

原文：Quickstart Guide: Compose and Django
https://docs.docker.com/compose/django/

このクイックスタート・ガイドでは、Compose を使って、どのようにシンプルな Django/PostgreSQLアプリケーションをセットアップ・実行するかを示します。あらかじめ、[Compose のインストール](http://qiita.com/zembutsu/items/dd2209a663cae37dfa81)が必要です。

## プロジェクトの定義

アプリケーションを構築するため、３つのファイルをセットアップしていきます。まず、アプリケーションを実行するにあたり、 Docker コンテナ中には依存関係のある全てが必要になります。そのため、コンテナ中で何が必要なのかを、正確に定義しなくてはいけません。この定義に使うのが `Dockerfile` と呼ばれます。まず第一に、Dockerfile は次のように構成されます：

```
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```

この Dockerfile はイメージを定義するものです。アプリケーションを含むコンテナを構築する時、そこには Python だけでなく、Python と依存関係のある全てが含まれます。Dockerfile の書き方は、[Docker user guide](https://docs.docker.com/userguide/dockerimages/#building-an-image-from-a-dockerfile) と [Dockerfile reference](http://docs.docker.com/reference/builder/) をお読みください。

次に、Python の依存関係を `requirements.txt` というファイルに定義します。

```
Django
psycopg2
```

最後に `docker-compose.yml` というファイルに、これら全てを結び付けます。アプリケーション構成するサービス（ここでは、ウェブサーバとデータベースです）を定義します。構成とは、使用する Docker イメージと、コンテナ内のどのボリュームをマウントしてリンクするかや、どのポートを公開するか記述します。

```
db:
  image: postgres
web:
  build: .
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db
```

このファイルの動作についての詳細は、`docker-compose.yml` [リファレンス](http://qiita.com/zembutsu/items/9e9d80e05e36e882caaa) をご覧ください。

## プロジェクトのビルド

これで Django プロジェクトを `docker-compose run` で開始できます。

```
$ docker-compose run web django-admin.py startproject composeexample .
```

まずはじめに、Compose は `Dockerfile` を使って `web` サービスのイメージを構築します。それからコンテナ内で `django-admin.py startproject composeexample .` を実行するためにイメージを使います。

これで現在のディレクトリの中に Django アプリケーションが作成されます。

## データベースへの接続

データベースの接続をセットアップする必要があります。`composeexample/settings.py` の中の `DATABASES = ...` 定義を読みます：

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}
```

これらの設定は、Dockerfile で [postgres](https://registry.hub.docker.com/_/postgres/) Docker イメージの指定によって決められています。

それから、`docker-compose up` を実行します。

```
Recreating myapp_db_1...
Recreating myapp_web_1...
Attaching to myapp_db_1, myapp_web_1
myapp_db_1 |
myapp_db_1 | PostgreSQL stand-alone backend 9.1.11
myapp_db_1 | 2014-01-27 12:17:03 UTC LOG:  database system is ready to accept connections
myapp_db_1 | 2014-01-27 12:17:03 UTC LOG:  autovacuum launcher started
myapp_web_1 | Validating models...
myapp_web_1 |
myapp_web_1 | 0 errors found
myapp_web_1 | January 27, 2014 - 12:12:40
myapp_web_1 | Django version 1.6.1, using settings 'composeexample.settings'
myapp_web_1 | Starting development server at http://0.0.0.0:8000/
myapp_web_1 | Quit the server with CONTROL-C.
```

これで Docker デーモンのポート 8080 で Django アプリケーションが動作します（ Boot2docker を使っている場合は、`boot2docker ip` で IP アドレスが分かります）。

ほかにも Docker の管理コマンドを実行することもできます。データベースをセットアップするには、例えば、`docker-compose up` を別のターミナルで実行します：

```
$ docker-compose run web python manage.py syncdb
```
Docker Compose - クイックスタート・ガイド：Compose と Wordpress

# Docker Compose - クイックスタート・ガイド：Compose と Wordpress

原文：Quickstart Guide: Compose and Wordpress
https://docs.docker.com/compose/wordpress/

このクイックスタート・ガイドは、Compose を使い、Docker コンテナによって構築された独立した環境で、Wordpress を簡単に実行します。

## プロジェクトの定義

はじめに、[Compose をインストール](http://qiita.com/zembutsu/items/dd2209a663cae37dfa81)し、現在のディレクトリに Wordpress をダウンロードします：

```
$ curl https://wordpress.org/latest.tar.gz | tar -xvzf -
```

これは `wordpress` という名前のディレクトリを作成します。希望があれば、プロジェクト名の名前変更もできます。

次に、ディレクトリに入り、`Dockerfile` を作成します。このファイルでは、どのような環境でアプリケーションを実行しようとしているかを定義します。Dockerfile の書き方は、[Docker user guide](https://docs.docker.com/userguide/dockerimages/#building-an-image-from-a-dockerfile) と [Dockerfile reference](http://docs.docker.com/reference/builder/) をお読みください。この例では、Dockefile を次のようにします：

```
FROM orchardup/php5
ADD . /code
```

これは Docker に対して、イメージの構築方法を伝えます。そのイメージとは、PHP と Wordpress を含むコンテナを定義したものです。

次に、`docker-compose.yml` ファイルを作成します。これはウェブ・サービスと MySQL インスタンスを分けて起動するものです。

```
web:
  build: .
  command: php -S 0.0.0.0:8000 -t /code
  ports:
    - "8000:8000"
  links:
    - db
  volumes:
    - .:/code
db:
  image: orchardup/mysql
  environment:
    MYSQL_DATABASE: wordpress
```

動かすためには、２つのサポート・ファイルが必要です。１つは `wp-config.php` という通常の WordPress の設定ファイルです。このファイルの１箇所だけ、データベースの接続先を `db` コンテナに書き換えます。

```
<?php
define('DB_NAME', 'wordpress');
define('DB_USER', 'root');
define('DB_PASSWORD', '');
define('DB_HOST', "db:3306");
define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');

$table_prefix  = 'wp_';
define('WPLANG', '');
define('WP_DEBUG', false);

if ( !defined('ABSPATH') )
    define('ABSPATH', dirname(__FILE__) . '/');

require_once(ABSPATH . 'wp-settings.php');
```

もう１つのファイルは `router.php` を使って、PHP のビルトイン・ウェブ・サーバでどのように WordPress を実行するか伝えます：

```
<?php

$root = $_SERVER['DOCUMENT_ROOT'];
chdir($root);
$path = '/'.ltrim(parse_url($_SERVER['REQUEST_URI'])['path'],'/');
set_include_path(get_include_path().':'.__DIR__);
if(file_exists($root.$path))
{
    if(is_dir($root.$path) && substr($path,strlen($path) - 1, 1) !== '/')
        $path = rtrim($path,'/').'/index.php';
    if(strpos($path,'.php') === false) return false;
    else {
        chdir(dirname($root.$path));
        require_once $root.$path;
    }
}else include_once 'index.php';
```

### プロジェクトの構築

ここに４つのファイルができています。Wordpress ディレクトリの中で、`docker-compose up` を実行すると、必要なイメージを取得・構築し、ウェブとデータベースのコンテナを起動します。あとは Docker デーモンのポート 8080 で Wordpress にアクセスできます（ Boot2docker を使っている場合は、`boot2docker ip` で IP アドレスが分かります）。
Docker Compose - インストール

# Docker Compose - インストール

原文：Install Docker Compose
https://docs.docker.com/compose/install/

Compose をインストールするには、まず Docker のインストールが必要です。それから Compose を `curl` コマンドでインストールします。

## Docker のインストール

はじめに、Docker 1.6 以上をインストールします。

* [Mac OS X の手順(英語)](http://docs.docker.com/installation/mac/)
* [Ubuntu の手順(英語)](http://docs.docker.com/installation/ubuntulinux/)
* [その他システムの手順(英語)](http://docs.docker.com/installation/)

## Compose のインストール

Compose をインストールするには、次のコマンドを実行します：

```bash
curl -L https://github.com/docker/compose/releases/download/1.3.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

メモ：もし "Permission denied" エラーが出たら、おそらく `/usr/local/bin` ディレクトリが書き込み可能ではないため、Compose のインストールをスーパーユーザで行う必要があります。`sudo -i` を実行してから、先ほどの２つのコマンドを実行し、`exit` します。

オプションとして、bash シェル向け [コマンド補完](http://qiita.com/zembutsu/items/0626759948f386f4ceb3) もインストールできます。

Compose は OS X と 64 ビット Linux で利用可能です。他のプラットフォームでは、Pyhton パッケージを使っても Compose をインストールできます。

```bash
$ sudo pip install -U docker-compose
```

もうこれでコマンドは不要です。Compose のインストールは成功しているでしょう。`docker-compose --version` を実行してインストールをテストできます。

### アップグレード

Compose 1.2 以前のバージョンを使っている場合、削除するか、既存のコンテナをアップグレード後の Compose へ移行する必要があります。これは Compose バージョン 1.3 は、Docker ラベルを使ってコンテナの追跡をするため、全てのコンテナにラベルを付け直す必要があるためです。

もし Compose がラベル無しで作成されたコンテナを見つけると、実行を拒否します。そのため、2組のコンテナのセットを指定しても実行できません。もし既存のコンテナを使い続けたい場合（例えば、データ・ボリュームを使い続けたい場合）、次のコマンドで移行できます：

```bash
docker-compose migrate-to-labels
```

別の方法として、コンテナを維持する必要がなければ、それらを削除できます。それから Compose で新しいものを作り直します。

```bash
docker rm -f myapp_web_1 myapp_db_1 ...
```
Docker Compose - コマンド補完

# Docker Compose - コマンド補完

原文：Command Completion
https://docs.docker.com/compose/completion/

## コマンド補完のインストール

### Bash

bash completion（補完）がインストールされていることを確認します。最小インストールではない Linux を使っているのなら、bash 補完を使えるでしょう。Mac では `brew install bash-completion` でインストールします。

補完スクリプトを `/etc/bash_completion.d/` に置きます（ Mac では `/usr/local/etc/bash_completion.d/` です）。使用例：

```
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose --version | awk 'NR==1{print $NF}')/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
```

次回ログイン時から補完が使えるようになります。

### Zsh

補完スクリプトを `/path/to/zsh/completion` に置きます。使用例：`~/.zsh/completion/`

```
mkdir -p ~/.zsh/completion
curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose --version | awk 'NR==1{print $NF}')/contrib/completion/zsh/_docker-compose > ~/.zsh/completion/_docker-compose
```

`$fpath` ディレクトリに含めます。例：``/.zshrc` への追加

```
fpath=(~/.zsh/completion $fpath)
```

`compinit` が読み込まれ、`~/.zshrc` に追加されていることを確認します。

```
autoload -Uz compinit && compinit -i
```

それから、シェルを読み込み直します。

```
exec $SHELL -l
```

## 利用可能な補完

何を補完するかは、どのようなコマンドを使うかに依存します。

* docker-compose で使えるコマンド
* 個々のコマンドで利用可能なオプション
* 特定の関連性があると思われるサービス名（例：実行中・停止中インスタンスのサービスや、イメージから作られたサービス、あるいはサービスの元となる Dockerfile）
* `docker-compose scale` では、サービス名に自動的に "=" を追加して補完します。
* 選択したオプションの引数、例えば `docker-compose kill -s` は SIGHUP と SIGUSR1 のようなシグナルを補完

Compose を速く入力ミス無く、気持ちよく使いましょう！
Docker Compose - Compose をプロダクションで使うには

# Docker Compose - Compose をプロダクションで使うには

原文：Using Compose in produciton
https://docs.docker.com/compose/production/

**まだ Compose はプロダクション（本番）で使える状態ではありません**が、もし実験的、あるいはプロダクションへのデプロイの練習に使うのであれば、このガイドが役に立つでしょう。プロジェクトはプロダクションで使えるように作業が進行しています。進捗状況を知りたければ、[ロードマップ(英語)](https://docs.docker.com/compose/https://github.com/docker/compose/blob/master/ROADMAP) で現在の状況や、足りないものを確認ください。

プロダクションへのデプロイ時、実行環境として適切な設定行ったアプリケーションを、あまり変更したくないでしょう。変更とは次のようなものです：

* アプリケーション用に割り当てられたボリュームを削除しますが、コンテナの中にコードは残したままとし、外から変更できなくする
* ホストに異なったポートを割り当てる
* 異なった環境変数を設定する（例えば、冗長なログの出力を減らしたり、メール送信を有効にするなど）
* ダウンタイムを避けるため、再起動ポリシーの指定（例：`restart: always`）
* 外部サービスの追加（例：ログ集積）

これらの理由のため、例えばプロダクション向けの設定を `production.yml` ファイルでという様に、環境にあわせ別々の Compose ファイルを定義したくなるでしょう。

メモ：[extends](http://qiita.com/zembutsu/items/a2265a8cd602a5f4f52f) キーワードは、複数の Compose ファイルを管理するﾉﾆ便利です。手動でコピーやペーストすることなく、共通サービスの再利用ができます。

別の設定ファイルを準備したら、Compose で `COMPOSE_FILE` 環境変数を使い、そのファイルを指定します。

```
$ COMPOSE_FILE=production.yml
$ docker-compose up -d
```

メモ：環境変数を使わずにワンオフ・コマンドを使ってもファイルを使えます。その場合は `-f` フラグを使います。例：`docker-compose -f production.yml up -d`

### 変更のデプロイ

アプリケーションのコードを変更したときは、イメージを再構築し、アプリケーションのコンテナを作り直す必要があります。`web` というサービスを再デプロイするには、次のようにします：

```
$ docker-compose build web
$ docker-compose up --no-deps -d web
```

これは、まず `web` イメージの再構築するため、停止、破棄をしてから、`web` サービス***のみ***再作成します。Compose に `--nodeps` フラグを使うことで、`web` に依存するサービスの再作成をしません。

### 単一サーバ上での Compose 実行

Compose を使えば、アプリケーションをリモートの Docker ホストにデプロイできます。その時に、適切な環境変数 `DOCKER_HOST`、`DOCKER_TLS_VERIFY`、`DOCKER_CERT_PATH` を使います。この処理を行うために、[Docker Machine](https://docs.docker.com/machine) を使えばローカルやリモートの Docker ホストを非常に簡単にします。これはリモートにデプロイする必要が無くてもお薦めします。

環境変数を設定するだけで、更に他の設定を行わなくても`docker-compose` コマンドを普通に使えます。


### Swam クラスタで Compose を実行する。

[Docker Swarm](https://docs.docker.com/swarm) は Docker 独自のクラスタリング・システムで、単一の Docker ホストと同じ API を持っています。つまり、Compose は Swarm インスタンスと一緒に使うことができ、アプリケーションを複数のホストで実行します。

Compose と Swarm の連携は、まだ実験的な段階です。Swarm もベータ版です。ですが、実験的に試してみたいのであれば、[integration guide](https://docs.docker.com/compose/https://github.com/docker/compose/blob/master/SWARM)をお読みください。
なんだこれ＠Grails3.0.2「ビルド時にPDFが壊されるんだけど。。。」

<code>/src/main/resources/ほげほげ.pdf</code>とPDFを置いて、<code>./gradlew clean processResources</code>するとPDFのサイズがでっかくなって壊れるんだけど。。。
Docker Compose - 環境変数リファレンス

# Docker Compose - 環境変数リファレンス

原文：Compose environment variables reference
https://docs.docker.com/compose/env/

メモ：環境変数は、リンクされたサービスに接続する方法として、既に推奨されていません。しかしながら、接続のためにリンク名（デフォルトでは、リンクされたサービス）ををホスト名のように使えます。詳細については[docker-compose.yml ドキュメント](★)をご覧ください。

Compose は、コンテナで公開するサービスと他のコンテナの接続に Docker link を使います。それぞれリンクされたコンテナには環境変数が設定されます。環境変数はコンテナの名前を大文字にしたものです。

サービス上でどのような環境変数が利用可能か調べるには、`docker-compose run SERVICE env` を実行します。

**name_PORT**
全ての URL です。例：`DB_PORT=tcp://172.17.0.5:5432`

**name_PORT_num_protocol**
全ての URL です。例：`DB_PORT_5432_TCP=tcp://172.17.0.5:5432`

**name_PORT_num_protocol_ADDR**
コンテナの IP アドレスです。例：`DB_PORT_5432_TCP_ADDR=172.17.0.5`

**name_PORT_num_protocol_PORT**
公開するポート番号です。例：`DB_PORT_5432_TCP_PORT=5432`

**name_PORT_num_protocol_PROTO**
プロトコルです（TCP か UDP）。例：`DB_PORT_5432_TCP_PROTO=tcp`

**name_NAME**
コンテナの完全修飾名です。例：`DB_1_NAME=/myapp_web_1/myapp_db_1`
swift NSURLをstringで手軽に作る

swiftで**NSURL**のurlで手軽にstringでつくる際の、
手抜き作成用メモ。


```swift
// アプリバージョンをStringで
let version: String! = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as? String

// 指定URLと文字連結
var myUrlStr:String = "http://hooogeee.com?v=" + version

// NSURL型に変換するなら
var myUrl:NSURL = NSURL(string:myUrlStr)!

```

> swift1.2で確認しました。
AWS CLI for ubuntu user

#CLI

さっきやってたやつが消えたので萎えました（笑）

今日は
AWS CLI の設定をやりました。

僕はいつも　VM ware player と　ubuntu　をつかっています。

それで今日はcli をインストールしていきました。

そこで問題はこれ

bash: pip: command not found

ubuntu の人はsudo apt-get install python-setuptools

これをして、から　pip のコマンドをインストールしましょう。

参考はhttp://stackoverflow.com/questions/9780717/bash-pip-command-not-foundです。


最後に　コマンドのインライン表示はshift ７　だと思ったのですができません。

わかる人はコメントお願いします。

次からどんどんコマンド打っていきたいなと思った今日でした。
iOS AVAudioSessionモードを指定してカテゴリの動作を特殊化する



```
NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];

//オーディオセッションのカテゴリを設定する
BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
if(!success){NSLog(@"AudioSession setCategory error [%@]", [error localizedDescription]);}

//モードを指定してカテゴリの動作を特殊化する
success = [audioSession setMode:AVAudioSessionModeVideoChat error:&error];
if(!success){NSLog(@"AudioSession setMode error [%@]", [error localizedDescription]);}

//オーディオセッションを作動する
success = [audioSession setActive:YES error:&error];
if(!success){NSLog(@"AudioSession setActive error [%@]", [error localizedDescription]);}
         
NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
//setActiveプロパティをNOとすれば、オーディオセッションは停止します。
BOOL success = [audioSession setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:&error];
if(!success){NSLog(@"AudioSession setActive error [%@]", [error localizedDescription]);}

（追記）
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// モードを指定せず、AirPlay切り替え可 + ディフォルトSpeaker出力
NSError *error = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayAndRecord
                             withOptions:(AVAudioSessionCategoryOptionDefaultToSpeaker |
                                          AVAudioSessionCategoryOptionAllowBluetooth)
                                   error:&error];
if(!success){NSLog(@"AudioSession setCategory error [%@]", [error localizedDescription]);}

success = [audioSession setActive:YES error:&error];
if(!success){NSLog(@"AudioSession setActive error [%@]", [error localizedDescription]);}

```

        
● AVAudioSessionModeDefault：
どのカテゴリに対しても指定できる既定のモードで、デバイスの汎用的な使い方に向いています。

● AVAudioSessionModeVoiceChat：
VoIP（Voice over IP）アプリケーション用。
AVAudioSessionCategoryPlayAndRecordカテゴリの場合にのみ指定できます。システム組み込
みの信号処理系で、人の声として最適な形に処理します。
AVAudioSessionCategoryOptionAllowBluetoothも設定します。
利用可能な一連の音声経路は、ボイスチャット用に最適化されます。組み込みマイクを使う場
合、システムは自動的に、ボイスチャット用に最適な組み合わせを選択します。

● AVAudioSessionModeVideoChat：
FaceTimeなどのビデオチャットアプリケーションに向いています。
AVAudioSessionCategoryPlayAndRecordカテゴリの場合にのみ指定できます。システム
組み込みの信号処理系で、人の声として最適な形に処理します。
AVAudioSessionCategoryOptionAllowBluetoothおよび
AVAudioSessionCategoryOptionDefaultToSpeakerも設定します。
MS SQL(SQLServer)からMySQLへ書き換える時に注意しておきたい3つのこと


MicroSoft SQL Serverのライセンス切れなどにより、他のDBにサービスを移行することがある。
他のDBに乗り換えを考えた時に、候補に上がるのはMySQLが多いと考えられる。

本記事では、MS SQLからMySQLへ書き換えを行うときに気をつけるポイントを~~5つ~~3つまとめた。

# 1. GETDATE()
現在の日付を基準に検索を行うことは多々ある。
MS SQLではGETDATE()で現在の日時を取得している。
MySQLではNOW()で取得できる。
例えば、本のDBで出版されている本(=出版日時が現時刻より前）のものを取得する場合
MS SQL

```sql
SELECT
    title,
    auther,
    publisher,
    price,
    published_datetime,
    created_datetime,
    modified_datetime
 FROM
   books
 WHERE
   published_datetime <= GETDATE()
```

MySQL

```sql
SELECT
    title,
    auther,
    publisher,
    price,
    published_datetime,
    created_datetime,
    modified_datetime
 FROM
   books
 WHERE
   published_datetime <= NOW()
```

# 2.文字列結合
SELECT してきたものにprefixとして何か付けたい場合に文字列結合を使うことがある。
例えばSQLだと、
SQL Server

```sql
SELECT
    '本のタイトル:'+title,
    '著者:'+auther,
    publisher,
    price,
    published_datetime,
    created_datetime,
    modified_datetime
 FROM
   books
 WHERE
   published_datetime <= GETDATE()
```

のように+で文字列結合ができる。
MySQLの場合はCONCATを使う必要がある。

MySQL

```sql
SELECT
   CONCAT('本のタイトル:', title),
   CONCAT('著者:', auther),
    publisher,
    price,
    published_datetime,
    created_datetime,
    modified_datetime
 FROM
   books
 WHERE
   published_datetime <= NOW()
```

# 3. 行数のNUM_ROWS
SQLでは、取得した結果が何行目かをNUM_ROWSを使うことで取得ができる。

SQL Server

```sql
SELECT
    NUMROWS,
    '本のタイトル:'+title,
    '著者:'+auther,
    publisher,
    price,
    published_datetime,
    created_datetime,
    modified_datetime
 FROM
   books
 WHERE
   published_datetime <= GETDATE()
```

MySQLには組み込み関数がない。
しかたがないためMySQLのユーザ定義変数を使用する。
例えば

MySQL

```
set @row_number:=0;
SELECT
    (@row_number:=@row_number + 1) AS row_number,
    '本のタイトル:'+title,
    '著者:'+auther,
    publisher,
    price,
    published_datetime,
    created_datetime,
    modified_datetime
 FROM
   books
 WHERE
   published_datetime <= NOW()
```
のようにユーザ定義変数を使用するとrow_numberが増加していき、行数と同じになる。
$.when に引数を1つだけ渡すときの注意点

# $.when に引数を1つだけ渡すときの注意点

タイトル通り、$.when に引数を1つだけ渡すと結果の引数の構造が異なります。
version 1.11.1 です。

## 1つだけ渡す

下記のスクリプトで試します。

```javascript
// 引数2つで $.when ----- A
$.when(
	$.get('/hoge.json'),
	$.get('/fuga.json')
).done(function() {
	console.log(arguments);
});

// 引数1つで $.when ----- B
$.when(
	$.get('/hoge.json')
).done(function() {
	console.log(arguments);
});
```

A はいわゆる普通の使い方、B は普通はあんまりしないであろう引数1つの使い方です。

見づらくて申し訳ないですが、下記が実行結果です。


```json:Aの出力
{
  "0": [
    {
      "data": "hoge"
    },
    "success",
    {
      "readyState": 4
      /*長いので略*/
    }
  ],
  "1": [
    {
      "data": "fuga"
    },
    "success",
    {
      "readyState": 4
      /*長いので略*/
    }
  ]
}
```

```json:Bの出力
{
  "0": {
    "data": "hoge"
  },
  "1": "success",
  "2": {
      "readyState": 4
      /*長いので略*/
  }
}
```

A の引数にはいわゆる success の引数 `(Anything data, String textStatus, jqXHR jqXHR)` の**配列**が渡ってきています。これは想定通りです。
しかし、B の引数には上記 success の引数が**配列ではなく単値**で渡ってきています。

引数が1つか否かで結果の構造が異なってしまっています。
ここは要素1の配列で渡ってきて欲しいです。
これのせいで $.when の引数に配列を渡せるように改造していたんですが、ダダハマりしました…。

余談ですが、引数が可変でこそ $.when が生きると思うんですよね。
なんで配列渡しに対応してないんですかね。

## ちなみに

```javascript
$(function() {
	// 引数2つで $.when ----- A
	$.when(
		$("#nodeA").animate({left:300}),
		$("#nodeB").animate({left:300})
	).done(function() {
		console.log(arguments);
	});
	
	// 引数1つで $.when ----- B
	$.when(
		$("#nodeA").animate({left:300})
	).done(function() {
		console.log(arguments);
	});
});
```

```json:Aの出力
{
  "0": {
    "0": {},
    "length": 1,
    "context": {/*長いので略*/},
    "selector": "#nodeA"
  },
  "1": {
    "0": {},
    "length": 1,
    "context": {/*長いので略*/},
    "selector": "#nodeB"
  }
}
```

```json:Bの出力{
  "0": {
    "0": {},
    "length": 1,
    "context": {/*長いので略*/},
    "selector": "#nodeA"
  }
}
```

このように Ajax 系ではなくノードの操作系だときちんと想定する引数が渡ってきました。
なんだかよく分かりません。
UbuntuMonoRegularのpowerlineフォントがずれる

ステータスライン系のプラグインを使っていてUbuntuMonoRegularにpowerlineのフォントパッチをあてた(正確にはパッチをあてたフォントを使った)とき、左側の三角形(右三角)のサイズがいまいち合わなかった。

うまい解決方法が見つからなかったので、フォントを編集することにした。
以下その手順

#パッチをあてたフォントをインストール
パッチをあてたフォントはgithubにある。

```zsh
$ git clone https://github.com/powerline/fonts
$ cd fonts/
$ ./install.sh
$ sudo fc-cache -vf
$ cp "$HOME/.fonts/Ubuntu Mono derivative Powerline.ttf" ~/
```

この時点でターミナルのフォントでUbuntu Mono derivative Powerline Regularが選択できる。
フォントファイル自体は ~/.fonts/にある。
.fontsにあるものを直接編集するとなぜかうまくいかないので別のディレクトリにコピーして編集する。

#フォントを編集する
フォントを編集するのにfontforgeを使用する。
※fontforgeの操作法などは筆者自身よく分かってないので最低限のみ説明。

```zsh
$ sudo apt-get install fontforge
$ fontforge "./Ubuntu Mono derivative Powerline.ttf"
```

起動したらまず、フォント情報を少しだけ編集する。

メニューバーのエレメント → フォント情報 → 一般情報
EMの大きさが1000になってるのでこれを1024にする。

値を変更してOKを押したら今度は変更する文字を探す。
今回編集したい文字は 左側の三角形(右三角)なので57520番目(uniE0B0)の項目まで移動する。
かなり下の方にある。
![image](https://qiita-image-store.s3.amazonaws.com/0/71780/bb4eeb3e-0478-124e-2612-de1af60be648.png)

目的の文字までたどり着いたら綺麗に表示させるためにフォントを編集する。
筆者の環境では右三角のサイズが小さかったため、右クリックでメニューを開き 「変形」を選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/71780/be4ef94f-223f-f65b-4af8-e1aa2a6bd6ee.png)

このウィンドウの「移動」をクリックして「拡大縮小」を選択、倍率を変更してOK。
いろいろ試した結果 X 110 Y 121がいい感じだった。
![image](https://qiita-image-store.s3.amazonaws.com/0/71780/892d7244-b938-ca06-79fa-95022c8a2b79.png)

#保存
フォントを編集し終えたら、メニューバーの ファイル → フォントを出力
フォントのタイプをTrueTypeにする。
編集中のフォントファイルを上書き保存するのでUbuntu Mono derivative Powerline.ttfを選択。

保存を押す → 上書き確認が出てくる → 上書き → Errors detectedが出てくるが気にせず保存。

#フォント適用
保存した.ttfファイルを~/.fonts/にある同名のファイルと入れ替える。

```zsh
$ cp "$HOME/.fonts/Ubuntu Mono derivative Powerline.ttf" ~/.fonts/
$ sudo fc-cache -vf
```
ここまでしたら、一度全ての端末を閉じる。
再度端末を開いてフォントを Ubuntu Mono derivative Powerline Regular に変更。

これで綺麗に表示される。
multiple な select の $.fn.val() は配列を返す

# multiple な select の $.fn.val() は配列を返す

公式ドキュメントにも書かれていたんですが、少しハマったのでメモします。

タイトル通り、select-multiple の `val()` は配列を返します。

```html
<select id="select-multiple" multiple>
	<option value="1">オプション1</option>
	<option value="2">オプション2</option>
	<option value="3">オプション3</option>
</select>

<script type="text/javascript">
	$('#select-multiple').change(function() {
		console.log($(this).val());
	});
</script>
```

この html で select 要素のオプションを選択すると `[ "1" ]` のような配列が得られます。
Ctrl + クリック等で複数を選択すると `[ "1", "3" ]` です。便利ですね。

が、言いたいことはそんなことではなくて、「何も選択しなかった」時の戻り値です。

何も選択しなかった時の戻り値として `[]` （空配列）を期待したんですが、そんなことはなく、返ってきたのは **null** でした。version 1.11.1 です。
これって仕様なんですかね？ なんか一貫性がないような…。
XamarinのBindingについて

## XamarinのBindingでご質問

エクセルソフトの田淵さんがこんなことをつぶやいておられました。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">Xamarin.Formsのデータバインディングについてです。例えば一つの元スイッチをトグルすると複数の先スイッチが纏めてトグルされるのをやりたいです。元スイッチに複数のBindingを設定できないっぽいんですがどうやるのが良いんでしょうか？</p>&mdash; 田淵 義人＠エクセルソフト (@ytabuchi) <a href="https://twitter.com/ytabuchi/status/619069051067744257">2015, 7月 9</a></blockquote>

まあ、こう考えたのですが。

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/ytabuchi">@ytabuchi</a> 元Modelとなるオブジェクトに元スイッチをTwoWayでBindingして、先スイッチは元ModelにOneWayでBindingする、かな。</p>&mdash; 八雲 (@yakumomo) <a href="https://twitter.com/yakumomo/status/619070011148103680">2015, 7月 9</a></blockquote>

実はこうである、と。

<blockquote class="twitter-tweet" data-conversation="none" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/yakumomo">@yakumomo</a> 元から複数の先にバインドしたいんです。その時どうすんだろ？と。</p>&mdash; 田淵 義人＠エクセルソフト (@ytabuchi) <a href="https://twitter.com/ytabuchi/status/619073632535379968">2015, 7月 9</a></blockquote>

## やってみた

まあ、確かにBinding難しいよなー。
とかつらつら考えながらコーディング。
できました。

### BindingContextがミソ

```csharp
	public class App : Xamarin.Forms.Application
	{
		Switch sw1;
		Switch sw2;
		Switch sw3;
		Entry ent;

		public App() {
			sw1 = new Switch () {
			};
			sw2 = new Switch () {
			};
			sw2.BindingContext = sw1;
			sw2.SetBinding (Switch.IsToggledProperty, new Binding ("IsToggled", BindingMode.OneWay));
			sw3 = new Switch () {
			};
			sw3.BindingContext = sw1;
			sw3.SetBinding (Switch.IsToggledProperty, new Binding ("IsToggled", BindingMode.OneWay));
			ent = new Entry () {
				Text = "Hello, world",
			};
			ent.BindingContext = sw1;
			ent.SetBinding (Entry.IsEnabledProperty, new Binding ("IsToggled", BindingMode.OneWay));
			MainPage = new ContentPage () {
				Content = new StackLayout() {
					Padding = new Thickness(0, 20, 0,0),
					Orientation = StackOrientation.Vertical,
					Children = {
						new StackLayout() {
							Orientation = StackOrientation.Horizontal,
							Children = {
								sw1,
								new Label() {
									Text = "<- switch this",
								},
							},
						},
						sw2,
						sw3,
						ent,
					},
				},
			};
		}
	}
```

まあ要するに、先スイッチのBindingContextを元スイッチのオブジェクトにして仕舞えばいいわけですね。
XAMLだと…。
どうするかなぁ。