OmniAICreator/Qiita-1.07M huggingface dataset:
Docker の基本学習 ～ マルチホストでのコンテナ間通信

複数のホストに配置されたコンテナ間のネットワーク通信についてまとめてみる。

(更新： 2015/11/08)
Docker 1.9 では、複数ホストにまたがる仮想ネットワーク機能が正式版としてリリースされました。今後は、この記事で書かれている方法より、そちらの機能を使うほうが主流になるかもしれません。
[Docker : マルチホスト間での仮想ネットワーク](http://qiita.com/Arturias/items/dd7f9e2365626dd4ad51)

# マルチホストにおける Docker のネットワークの課題
以下の図で、ホスト１上のContainer1からホスト２上のContainer2(httpdが動作)に接続したいとする。

![docker-multi-host-network.png](https://qiita-image-store.s3.amazonaws.com/0/79316/6e9cb2ca-4439-5442-6c0b-281a055bbaf7.png)

Container2 が次のように起動している場合、

    docker run -d -p 80:80 <イメージ名>

Containe1 からは、「ホスト2のアドレス」を使って 10.0.0.2:80 にアクセスすれば Container2 の httpd と通信ができる。

これはとても単純な方法だがいつくか課題がある。

**1. 接続先のコンテナが別のホストで起動された場合、接続先のアドレスが変わってしまう**  
仮想マシン(VM)の場合は VM自体に割り当てられたIPアドレスに接続するため、VM 別のホストに移動しても接続先のアドレスは変わらない。しかし、上記のコンテナの接続方法では、ホストが変わる度に接続先のアドレスが変わり、接続元コンテナの設定を変えたりコンテナの再起動が必要になる。これは実用に耐えない。  

**2. コンテナ名で接続できない**  
同一ホスト間のコンテ間通信であれば [Link の機能](http://qiita.com/arturias/items/75828479c1f9eb8d43fa)を使いコンテナ名で接続をすることができたが、マルチホストではIP/ポートの指定が必要になってしまう。

# 解決方法
かなり多くの手法があるようで把握できてないが、例えば次ようなものがあるらしい。

* 別ホストへ接続するための専用コンテナを介して接続をする
    * Ambassador パターン (Static)
    * Ambassador パターン (Dynamic)
* コンテナに DHCP や Static IP で IP アドレスを割り当てる
* コンテナ間を接続する仮想ネットワークを構築する

# Ambassador パターン(Static) ～ 概要

ここでは、Docker の[公式ドキュメント](http://docs.docker.com/articles/ambassador_pattern_linking/)でも紹介されている基本パターンの Ambassador パターンをまとめる。 これは、他のホストと接続する Proxy の役割をするコンテナ(Ambassasdor と呼ばれる)を立てて、それを介して通信する。

![ambassador_static.png](https://qiita-image-store.s3.amazonaws.com/0/79316/9c647569-a5dc-8ef9-6a75-31afa87f1b47.png)


Ambassadorは接続先(ホストのIPとポート)を知っており、http client コンテナは Ambassador と Link 接続して、Ambassador に HTTPリクエストを送るとそれが接続先に転送される。

これにより、例えば http client コンテナは接続先を知らなくてもよくなり、また、Ambassador のコンテナ名を使ってHTTPリクエストを送れるようになる。 しかし、Ambassador が接続先ホストを知っている必要がある(Static に紐付けられている)ため、Ambassador だけ再起動すれば済むようにはなったが依然として問題は残る。

いちおう、Ambassador パターンを試す手順を以下にまとめておく。

# Ambassador パターン(Static) ～ 手順

## 事前準備
接続先(ホスト2）で、テスト用イメージ(Webサーバー)を作成。
Dockerfile を作る。

```
FROM centos:6.6
MAINTAINER arturias <arturias@example.com>
RUN yum install httpd -y
EXPOSE 80
ENTRYPOINT /usr/sbin/apachectl -DFOREGROUND
```

イメージをビルド。
```
$ docker build -t arturias/httpd .
```
## 接続先(ホスト2)でのコンテナ起動
作成したWeb サーバーのイメージから、コンテナを起動。
※ -p や -P は指定してないことに注意。
```
$ docker run -d --name web arturias/httpd
```

次に、Ambassador を起動。Ambassador として動作するイメージ(svendowideit/ambassador)が公開されているのでそれを使っている。
※ なお、ここでは -p でポート80を公開する。
```
$ docker run -d --link web:web -p 80:80 --name web_amb svendowideit/ambassador
```

## 接続元(ホスト1)でのコンテナ起動
Ambassador を起動。--export でHTTPクライアントに公開するポート、-e で接続先の Ambassador を指定。

```
$ docker run -d --name web_amb --expose 80 -e WEB_PORT_80_TCP=tcp://10.0.0.2:80 svendowideit/ambassador
```

HTTPクライアントとなるコンテナを起動して接続する。

```
$ docker run -it --link web_amb:web centos /bin/bash
```

LINK 機能により環境変数がセットされるため、それを使って Ambassador にリクエストを送る。

```
[root@2778fe65cd9b /]# env
WEB_PORT=tcp://172.17.0.3:80
WEB_PORT_80_TCP=tcp://172.17.0.3:80
WEB_PORT_80_TCP_ADDR=172.17.0.3
WEB_PORT_80_TCP_PORT=80
(略)

[root@2778fe65cd9b /]# curl http://${WEB_PORT_80_TCP_ADDR}:${WEB_PORT_80_TCP_PORT}
```
ansible で sudo 時に実行ユーザの HOME 環境変数を取得する

ansible で `sudo: yes` を利用すると `{{ ansible_env.HOME }}` が root のものになってしまう。これでは開発環境の構築など実行ユーザのホームディレクトリ配下にファイルを配置したいときなどに困る。

ansible では実行ユーザ名が `{{ ansible_ssh_user }}` に設定されているためこれを利用して実行ユーザの HOME 環境変数を取得して利用することができる。

```yaml
pre_tasks:
  - name: Get ansible_user home directory
    shell: 'getent passwd "{{ansible_ssh_user}}" | cut -d: -f6'
    register: ansible_home_result

  - name: Set the fact for the other scripts to use
    set_fact: ansible_home='{{ansible_home_result.stdout}}'
```

上記のタスクを `pre_task` で実行することで `{{ ansible_home }}` に実行ユーザの HOME 環境変数が設定されるのでそれを他のタスクから利用すればよい。

ちなみに `{{ ansible_ssh_user }}` は `connection: local` 時でも設定されているので問題なく利用できる。

- [Re: [ansible-project] Re: Ansible set variable task?](https://www.mail-archive.com/ansible-project@googlegroups.com/msg03707.html)
いろんな言語で可変長引数

関数の引数を任意の個数だけ渡せる機能は、多くの言語にありますが、それぞれ微妙に仕様が違っています。

#C言語
C言語では、学習で最初に使うような`printf`も可変長の引数で構成されていますが、そういう関数を作ろうとすれば意外とやりづらいものです。

`stdargs.h`というファイルに、可変長引数用のマクロが用意されています。

* `va_start`…引数ポインタの初期化
* `va_arg`…引数の取得
* `va_end`…引数ポインタの後始末

実装の特徴として、以下のことがあります。

* `va_start`に、可変引数になる直前の引数を渡さないといけないので、引数0個で呼び出すことは不可能です。
* 可変長引数の終わりをシステム側で知ることは不可能なので、「`printf`のように、固定の引数でどんな引数が続くか伝える」「（ポインタ引数が続くのであれば最後に`NULL`を入れるというように）引数の終わりを示す値を決めておく」などが必要になります。
* （printfでは例外的にチェックしてくれることもありますが）コンパイラによる型チェックは**ありません**。実際に渡した引数と違う型で取得しようとした場合、どんな動作をするかはわかりません。
* 配列を展開して引数にするような、正当な方法もありません。

# JavaScript
## ES5まで
ES5までのJavaScriptの場合、可変長引数と銘打った特別な記法はありませんが、「仮引数と実引数で数が一致しなくても問題ない」ということもあって、可変長引数自体には対応できます。

JavaScriptの関数では、引数が`arguments`という「配列のようなオブジェクト」に入っていて、`arguments.length`で引数の個数を取得できます。なお、仮引数があった場合に、仮引数と同じ位置の`arguments`の要素が連動する、という挙動がありましたが、ES5のstrictモードでは廃止されています。

そのまま添字を`for`で回しても構いませんし、本当の配列に変換したければ、`Array.prototype.slice.call(arguments)`で可能です。

なお、配列の中身を引数リストに変換したい場合は、`関数.apply(thisにするオブジェクト,配列)`とすれば可能です。

## ES6
ES6では、PHPと同じような`...`（spread operator）で、「可変長の引数を配列で受け取る」「引数に配列などを展開して渡す」ことが可能となっています。なお、ES6のArrow Function（`=>`を使った関数表記）では、`arguments`も**外側にあるものを引き継ぐ**ので要注意です（[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/arrow_functions)）。素直にspread operatorで書きましょう。

# Ruby
Rubyは可変長引数を明示的にサポートしていますし、引数の数も厳密に取ります。仮引数の宣言の際に、`*`を前置させた引数があると、それが残りの引数を配列として受け取ります（性質上、引数リストに1つしか書けません）。

```rb:引数の数
def foo (arg1, *rest)
  # 1個以上の引数が必要
end

def bar (*args)
  # いくつでも問題なし
end

def baz (*args, last)
  #別に*付き引数は最後でなくてもいい
end
```

配列を展開して引数にしたい場合も、`method(*arr)`のように書くことで展開ができます。

# PHP
PHPの場合、PHP 5.6以降では`...`という構文ができていて、Rubyでの`*`のように、可変長引数を自動で配列に詰めてくれます。そして、この引数リストにタイプヒントを付けることも可能です。

PHP 5.5以前の場合も、関数は仮引数以上の個数の引数を受け取ることができて、`func_get_args`や`func_num_args`などの関数で処理することができます。

引数として配列を展開したい場合、PHP 5.6以降では`...`を使うことができますし、それ以前でも`call_user_func_array`を使えばできなくはないです。
レイヤーでシーン内のゲームオブジェクトを検索するエディタ拡張

レイヤーでシーン内のゲームオブジェクトを検索するエディタスクリプトです。

下図のようにレイヤーを指定して、そのレイヤーに属するシーン内のゲームオブジェクトを検索、列挙できます。
下図はEventレイヤーに属するゲームオブジェクトを検索、列挙している例です。
Editorフォルダに入れて使って下さい。

![FindByLayer2.png](https://qiita-image-store.s3.amazonaws.com/0/58282/4cffefc5-c7b3-26b3-d0ea-4deefdbbbf62.png)

```FindSceneObjectsWithLayer.cs
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class FindSceneObjectsWithLayer : EditorWindow
{
	public int LayerToSearchFor = 0;

	public bool LimitResultCount = false;
	public int MaxResults = 1;

	public List<GameObject> Results;
	private Vector2 ResultScrollPos;

	void OnGUI()
	{
		EditorGUILayout.BeginVertical();
		{
			EditorGUILayout.LabelField("Options", EditorStyles.boldLabel);
			{
				GUILayout.BeginHorizontal();
				EditorGUILayout.LabelField("Layer : ", GUILayout.MaxWidth(60));
				LayerToSearchFor = EditorGUILayout.LayerField(LayerToSearchFor);
				GUILayout.EndHorizontal();

				if (GUILayout.Button("Find"))
					Find();

				if (LimitResultCount = EditorGUILayout.Foldout(LimitResultCount, "Limit Result Count (Limit:"
						+ (LimitResultCount ? MaxResults.ToString() : "None") + ")"))
					MaxResults = EditorGUILayout.IntField("Result Max:", MaxResults);
			}

			EditorGUILayout.LabelField("Results", EditorStyles.boldLabel);
			{
				if (Results != null)
				{
					EditorGUILayout.LabelField("Scene objects found:", Results.Count.ToString(), EditorStyles.boldLabel);

					ResultScrollPos = EditorGUILayout.BeginScrollView(ResultScrollPos);
					{
						if (LimitResultCount)
						{
							for (int i = 0; i < Mathf.Min(MaxResults, Results.Count); i++)
								EditorGUILayout.ObjectField(Results[i], typeof(GameObject), false);
						}
						else
						{
							foreach (GameObject go in Results)
								EditorGUILayout.ObjectField(go, typeof(GameObject), false);
						}
					}
					EditorGUILayout.EndScrollView();
				}
			}
		}
		EditorGUILayout.EndVertical();
	}

	void Find()
	{
		GameObject[] goArray = FindObjectsOfType(typeof(GameObject)) as GameObject[];
		Results = new List<GameObject>();
		for (int i = 0; i < goArray.Length; i++)
		{
			if (goArray[i].layer == LayerToSearchFor)
			{
				Results.Add(goArray[i]);
			}
		}
	}

	[MenuItem("Tools/Find By Layer...")]
	static void Init()
	{
		FindSceneObjectsWithLayer window = EditorWindow.GetWindow<FindSceneObjectsWithLayer>("Find By Layer");
		window.ShowPopup();
		//window.ShowAuxWindow();
	}
}
```
タグでシーン内のゲームオブジェクトを検索するエディタ拡張

シーン内のゲームオブジェクトをタグで検索できるスクリプトがUnity wikiにあったので紹介します。

[FindSceneObjectsWithTag](http://wiki.unity3d.com/index.php/FindSceneObjectsWithTag)

以下は、自分用に少し修正したものです。Editorフォルダに入れて使って下さい。下図の様に、指定したタグのゲームオブジェクトを検索できます。 （この例ではPlayerタグがついたゲームオブジェクトを検索しています）
![FindByTag2.png](https://qiita-image-store.s3.amazonaws.com/0/58282/f5c97494-e479-313b-9250-2c19038d28c1.png)

```FindSceneObjectsWithTag.cs
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class FindSceneObjectsWithTag : EditorWindow
{
	public string TagToSearchFor = "Player";

	public bool LimitResultCount = false;
	public int MaxResults = 1;

	public List<GameObject> Results;
	private Vector2 ResultScrollPos;

	void OnGUI()
	{
		EditorGUILayout.BeginVertical();
		{
			EditorGUILayout.LabelField("Options", EditorStyles.boldLabel);
			{
				GUILayout.BeginHorizontal();
				EditorGUILayout.LabelField("Tag : ", GUILayout.MaxWidth(50));
				TagToSearchFor = EditorGUILayout.TagField(TagToSearchFor);
				GUILayout.EndHorizontal();

				if (GUILayout.Button("Find"))
					Find();

				if (LimitResultCount = EditorGUILayout.Foldout(LimitResultCount, "Limit Result Count (Limit:"
						+ (LimitResultCount ? MaxResults.ToString() : "None") + ")"))
					MaxResults = EditorGUILayout.IntField("Result Max:", MaxResults);
			}

			EditorGUILayout.LabelField("Results", EditorStyles.boldLabel);
			{
				if (Results != null)
				{
					EditorGUILayout.LabelField("Scene objects found:", Results.Count.ToString(), EditorStyles.boldLabel);

					ResultScrollPos = EditorGUILayout.BeginScrollView(ResultScrollPos);
					{
						if (LimitResultCount)
						{
							for (int i = 0; i < Mathf.Min(MaxResults, Results.Count); i++)
								EditorGUILayout.ObjectField(Results[i], typeof(GameObject), false);
						}
						else
						{
							foreach (GameObject go in Results)
								EditorGUILayout.ObjectField(go, typeof(GameObject), false);
						}
					}
					EditorGUILayout.EndScrollView();
				}
			}
		}
		EditorGUILayout.EndVertical();
	}

	void Find()
	{
		if (TagToSearchFor != null && TagToSearchFor != "")
			Results = new List<GameObject>(GameObject.FindGameObjectsWithTag(TagToSearchFor));
	}

	[MenuItem("Tools/Find By Tag...")]
	static void Init()
	{
		FindSceneObjectsWithTag window
			= EditorWindow.GetWindow<FindSceneObjectsWithTag>("Find By Tag");
		
		window.ShowPopup();
		//window.ShowAuxWindow();
	}
}
```
tmuxの使い方


tmuxの使い方
===========================
ターミナルマルチプレクサtmuxの使い方を紹介します。

# tmux？なにそれ美味しいの？
* マルチプレクサって何？
マルチプレクサとは一つのウィンドウの中に複数のプログラムをロードするプログラムを指します。一つの窓でいろいろできる・覗けるものと思ってくれればOK。

* ターミナルマルチプレクサって何？
ターミナル(端末)マルチプレクサなので複数の端末をひとつの窓で扱えるプログラムを指します。
そして、その代表が[tmux](http://tmux.github.io/)。
ターミナルマルチプレクサは他に[GNU Screen](https://www.gnu.org/software/screen/)、[Byobu](http://byobu.co/)などがあります。

# インストール方法　　
* Linux環境
debian系ならコマンドラインで 
`apt-get install tmux`
redhat系なら
`yum install tmux`

* Mac環境
`brew install tmux`

# 操作方法
## セッション操作
* セッション作成
ターミナル上で
`tmux`
と入力すると新しいセッションができます。セッション名はセッションの作成順に数字が振られます。  
![Activate tmux](http://i.imgur.com/tpZTC91.gif)
名前を指定したいときは`tmux new -s hogehoge`と入力します。

* `<Ctrl>+b s`セッション表示
* `<Ctrl>+b d`セッションをデタッチ
* `<Ctrl>+b a`セッションをアタッチc
* `<Ctrl>+b )`次のセッションに切り替え    
* `<Ctrl>+b (`前のセッションに切り替え  
* `<Ctrl>+b hogehoge`hogehogeセッションに切り替え

## ウィンドウ操作
* `<Ctrl>+b c`新しいウィンドウ作成
* `<Ctrl>+b w`ウィンドウ表示  
* `<Ctrl>+b f`ウィンドウ検索
* `<Ctrl>+b ,`ウィンドウに名前をつける  
* `<Ctrl>+b &`ウィンドウを閉じる

## ペイン操作
* `<Ctrl>+b %` 垂直分割  
![Vertical Split](http://i.imgur.com/MK1I1Bq.gif)  
* `<Ctrl>+b "` 水平分割　　
![Horizontal Split](http://i.imgur.com/3M9zFQx.gif)  

* `<Ctrl>+b o` ペイン入れ替え
* `<Ctrl>+b q` ペイン番号表示
![show pane number](http://i.imgur.com/d6Dv1mJ.gif)
* `<Ctrl>+b x` ペインを閉じる
![close pane](http://i.imgur.com/w4U7dYe.gif)
* `<Ctrl>+b <Space>` ペインの再配置  
* `<Ctrl>+b {` ペインを左に移動  
* `<Ctrl>+b }` ペインを右に移動
* `<Ctrl>+b <矢印>` 矢印の方向のペインに移動
  

# 参考にしたサイト
この記事は以下のサイト・書籍を参考にしました。
ありがたや。ありがたや。
[LinuxCommand.org](http://linuxcommand.org/lc3_adv_termmux.php)
[tmux Taster](http://www.amazon.co.jp/tmux-Taster-Mark-McDonnell-ebook/dp/B00OPTU7LY/ref=sr_1_3?ie=UTF8&qid=1434283844&sr=8-3&keywords=tmux)
Rubyのヒアドキュメントでスト2のキャラクターをランダムに選択してみる #意味不明 #ruby

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Rubyのヒアドキュメントでスト2のキャラクターをランダムに選択してみる #意味不明 #ruby

## <i class="fa fa-hand-o-up" style="font-size:1em;"></i> ポイント
* ヒアドキュメントのラベルの後に、ヒアドキュメント全体をレシーバーとしてメソッドを利用可能
* 1行に複数のヒアドキュメントを利用することが可能

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル1
1 on 1
### <i class="fa fa-cube" style="font-size:1em;"></i> プログラム
~~~ruby
10.times {
	print <<-1P.lines.sample.chomp, ' vs ',<<-2P.lines.sample
リュウ
ケン
サガット
エドモンド・本田
	1P
ベガ
バイソン
ザンギエフ
キャプテン・サワダ
	2P
}
~~~

### 出力
~~~
ケン vs ザンギエフ
リュウ vs キャプテン・サワダ
エドモンド・本田 vs ベガ
エドモンド・本田 vs ベガ
サガット vs キャプテン・サワダ
ケン vs バイソン
サガット vs キャプテン・サワダ
リュウ vs ベガ
サガット vs ベガ
ケン vs ザンギエフ
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル2
2 on 2
### <i class="fa fa-cube" style="font-size:1em;"></i> プログラム
~~~ruby
10.times {
	print <<-1P.lines.sample(2).map(&:chomp).join('+'), ' vs ',<<-2P.lines.sample(2).map(&:chomp).join('+')+"\n"
リュウ
ケン
サガット
エドモンド・本田
	1P
ベガ
バイソン
ザンギエフ
キャプテン・サワダ
	2P
}
~~~

### 出力
~~~
ケン+リュウ vs キャプテン・サワダ+バイソン
エドモンド・本田+ケン vs ザンギエフ+キャプテン・サワダ
エドモンド・本田+サガット vs キャプテン・サワダ+ザンギエフ
エドモンド・本田+サガット vs キャプテン・サワダ+バイソン
エドモンド・本田+リュウ vs キャプテン・サワダ+ベガ
ケン+エドモンド・本田 vs ベガ+キャプテン・サワダ
エドモンド・本田+リュウ vs バイソン+ザンギエフ
リュウ+ケン vs キャプテン・サワダ+ベガ
エドモンド・本田+ケン vs キャプテン・サワダ+バイソン
リュウ+ケン vs ベガ+バイソン
~~~
RDP ファイルを編集して解像度を設定

リモートデスクトップ接続情報が諸々書かれた .rdp ファイルを編集する。

## 例えば解像度を 1024 x 768 にする

```text:hoge.rdp
…
screen mode id:i:1
desktopwidth:i:1024
desktopheight:i:768
```
SSLクライアント証明書を使って通信する


## 概要

SSLを使ったクライアント認証は、特定のクライアント以外からサイトを見せたくない時、非常に便利に使えます。ここではMavenなどJavaのアプリケーションでもクライアント証明書を使う方法をまとめます。

### 全体の流れ

1. JREに同梱されている証明書ストア`cacerts`にクライアント証明書を発行した認証局の認証局証明書をインポート
2. 実行時のシステムプロパティにcacertsやクライアント証明書を指定
3. クライアント証明書が必要な特定のサイトが利用可能に

### 認証局証明書のインポート

JREに同梱されている証明書ストア`cacerts`にインポートしないと、JREは実行時にインポートした認証局のみ認証されていると勘違いします。指定したファイルにある証明書のみ読み込みます。JREに同梱されているcacertsには主なルート認証局の証明書が入っているので、そこに自前認証局の証明書を読み込みましょう。

JREに同梱されているcacertsは`$JRE_HOME/lib/security/cacerts`です。これを適当なパスにコピーし、認証局証明書をインポートしましょう。認証局証明書がどこにあるかは、認証局によって異なります。システム管理者に聞いてください。

#### 認証局証明書のインポート

認証局証明書のインポートは下記のコマンドでOKです。

`keytool -v -alias 適切なエイリアス名 -import -file 証明書ストアファイル -keystore cacerts`

cacertsのパスワードを聞かれます。OracleのJREを利用しているのであれば、パスワードは`changeit`です。コマンドの最後にインポートするか聞かれるので、`はい`もしくは`Yes`と入力しましょう。

### 実行時のシステムプロパティの指定

実行時に指定するシステムプロパティは下記の通りだ。

| キー | 値の例 | 意味 |
|--------|--------|--------|
| javax.net.ssl.trustStore | /USER_HOME/.m2/cacerts | 証明書ストアファイルへのパス |
| javax.net.ssl.trustStoreType | jks | 形式。同梱がベースなので、未指定でも良い |
| javax.net.ssl.trustStorePassword | changeit | 証明書ストアファイルのパスワード |
| javax.net.ssl.keyStore | /USER_HOME/.m2/user.p12 | ユーザーの秘密鍵ストアファイル |
| javax.net.ssl.keyStoreType | pkcs12 | 秘密鍵ストアファイルの形式(jks or pkcs12) |
| javax.net.ssl.keyStorePassword | 秘密鍵エクスポート時のパスワード | 秘密鍵ストアファイルのパスワード |

これをMavenの起動時に読み込む`.mavenrc`に書けばMavenでの利用時にクライアント認証がなされ、Eclipseの起動時に読み込む`eclipse.ini`に書けばEclipseでの利用時にクライアント認証がされる。`gradle`等でも利用できるはずだ。

### よく出くわす問題

#### a. `unable to find valid certification path to requested target`というエラーがでる

新たな証明書ストアファイルに証明書をインポートしてしまった時にこうなることがあります。インストールされている`cacerts`に証明書をインポートしてみよう。


### 参考文献

- [Guide to Remote repository access through authenticated HTTPS](https://maven.apache.org/guides/mini/guide-repository-ssl.html)
PHPでマージソート

#PHPでマージソート

```php

/*
マージソート
分割統治法で解く
配列の全要素をマージソートする関数を定義すると
全要素のソートは左半分のソートと右半分のソートをしてこの左と右の要素を比較して並び替えるとできる。
*/

//0～200の配列を作成。stepは1
$list = range(0, 200 , 1);
//配列をシャッフルする
shuffle($list);

echo 'ソートする配列は';
echo '<pre>';
var_dump($list);
echo '</pre>';

$listCount = count($list);

mergeSort($list,0, $listCount-1);

echo 'ソート完了';
echo '<pre>';
foreach ($list as $value) {
    echo $value;
    echo '<br>';
}
echo '</pre>';

function mergeSort(&$list, $first, $last) {

    if ($first < $last) { //実施条件(分割できる事。)これがないと再帰が終わらない。
        $center = intval(($first + $last) / 2);
        $p      = 0;
        $j      = 0;
        $k      = $first;
        $tmp    = null;   //待避配列

        //前半部分をソートする
        mergeSort($list, $first, $center);
        //後半部分をソートする
        mergeSort($list, $center + 1, $last);

        //ここから前半部分と後半部分を比較して一つにする

        //ソート済みの前半部分を待避配列に全て保存する
        for ($i = $first; $i <= $center; $i++) {
            $tmp[$p++] = $list[$i];
        }

        //$iが対象配列の最後まで行って、$tmp配列を全て調べ終わるまで行う
        //$iは$center + 1から。つまり右側と左側($tmp)の比較
        //$pも$center + 1。
        //$jは0から
        //$kも0から (再帰で使う時は$first)
        while ($i <= $last && $j < $p) {
            if ($tmp[$j] <= $list[$i]) {
                //前半部分の配列が後半部分よりも小さい時
                //そのまま対象配列に前半部分の値を保存
                $list[$k] =  $tmp[$j];
                //ポインタは各々増やす
                $k++;
                $j++;
            } else {
                //後半部分のほうが小さい時
                //対象配列に後半部分の値を入れる。
                //前半部分の配列は$tmp配列にコピーしているので上書きでOK
                $list[$k] = $list[$i];
                //ポインタを各々増やす
                $k++;
                $i++;
            }
        }

        //余っている待避配列があれば、全て並び替えの対象配列に追加する
        while ($j < $p) {
            $list[$k++] = $tmp[$j++];
        }
    }
}


```

##参考書籍
明解 Javaによるアルゴリズムとデータ構造 
これ分かりやすい。

##今までのコード
https://github.com/Khanashima/algorithm
ShellとJavaで突然の死を招く

# TL;DR

```sh:もうやだぽ
＿人人人人人人人人人人人人人人人人人＿
＞ 彼女に技術書捨てろって言われた！ ＜
￣^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

ちょっとだけ気が晴れました。
良いですね、突然の死。

ただ、吹き出しの中にメッセージを入力したり、吹き出しの長さ調整が非常に面倒くさかったです。
もう手がつかれた腱鞘炎になる。
心に沈殿した濁りを吐き出したいだけなのに、なぜこんなにも大変なんだ。

そうだ、私はプログラマーだった。
この仕事はプログラムにやってもらおう。


# コード

簡易実現のため、入力に改行コード含まれないことにします。

**shell実装**

```sh:突然の死（death.sh）
#/bin/bash

msg=$1
bytes=`echo $1 | iconv -f=utf8 -t=sjis | wc --byte`
width=`echo ${bytes}/2 + 1 | bc`

for i in `seq 1 1 $width`; do
        over="${over}人";
        under="${under}^Y"
done;

echo "＿${over}＿" 
echo "＞ ${msg} ＜"
echo "￣${under}￣" 
```

**Java実装**

```java:突然の死（Main.java）(java7実装)

	public static String suddendeath(String msg) {

		// 全角と半角文字で文字幅が異なるのでバイト数で判断
		byte[] bytes = msg.getBytes(Charset.forName("Windows-31J"));

		StringBuilder br = new StringBuilder();

		// 上段
		br.append("＿人");
		for (int i = 0; i < bytes.length / 2; i++) {
			br.append("人");
		}
		br.append("＿");
		br.append(System.getProperty("line.separator"));

		// メッセージ本体
		br.append("＞ ").append(msg).append(" ＜");

		// 下段
		br.append(System.getProperty("line.separator"));
		br.append("￣");
		for (int i = 0; i < bytes.length / 2; i++) {
			br.append("^Y");
		}
		br.append("￣");

		return br.toString();
	}
```

なんとなくStreamを使った実装も作ってみます。

```java:突然の死（Main.java）(Java8実装)
	public static String suddendeathBy8(String msg) {

		// 全角と半角文字で文字幅が異なるのでバイト数で判断
		byte[] bytes = msg.getBytes(Charset.forName("Windows-31J"));

		StringBuilder br = new StringBuilder();

		// 上段
		br.append("＿人");
		IntStream.range(0, bytes.length / 2).forEach(i -> br.append("人"));
		br.append("＿\n");

		// 本文
		br.append("＞ ").append(msg).append(" ＜\n");

		// 下段
		br.append("￣");
		IntStream.range(0, bytes.length / 2).forEach(i -> br.append("^Y"));
		br.append("￣\n");

		return br.toString();
	}
```


# 動かします

shellは実行が簡単で良いですね。
引数が突然の死フォーマットで標準出力されます。

**Shell実行結果**

```sh:shell実行結果
% sh death.sh お前の服捨てろー！！                                                                      
＿人人人人人人人人人人＿
＞ お前の服捨てろー！！＜
￣^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

**Java実行結果**

Javaはすこし手間を加える必要がります。

まず、実行用のMainメソッドを作ります。
エラーハンドリングはしてません。

```java:Main.java
public class Main {
	public static void main(String[] args) {
		String result = suddendeath(args[0]);
		System.out.println(result);
	}
}
```

あとはコンパイルして実行するだけですね。

```sh:java実行結果
% javac -encoding UTF-8 Main.java 
% java Main 要らない雑貨持ち込むな―！
＿人人人人人人人人人人人人人人＿
＞ 要らない雑貨持ち込むな―！ ＜
￣^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

# まとめ

* すったもんだの末、技術書は会社に持っていくことで合意が取れました
* 大きな言い争いにならなかったのは「突然の死」で事前にストレスが発散され、冷静な会話が出来たからだと思います
* 私の経験から「突然の死」は男女の仲もとりもてる良いプログラムなので、みなさんもご愛顧下さい
RailsテンプレートAPIを使ったi18n設定の自動化について

# はじめに
みなさん、こんばんは。ちけんです。
この記事ではi18nの設定をRailsテンプレートAPIを使ってi18nの設定を自動化することを目的とします。
具体的には、下記リポジトリのlocalesのフォルダ構成とconfig/application.rbをRailsテンプレートAPIを使って再現するといったことをしようと思います。
https://github.com/kytiken/rails_locale_ja_setting_sample 
# localesの構成について
下記のように構成します

    config
    |--locales
    |  |--defaults
    |  |  |--en.yml
    |  |  |--ja.yml
    |  |--models
    |  |  |--ja.yml
    |  |--views
    |  |  |--ja.yml
# RailsテンプレートAPI
## RailsテンプレートAPIを使うには
1. template.rbにテンプレートの設定を書く
2. `rails new hoge -m ./template.rb`を実行する
3. 設定済みのrailsプロジェクトが作成される
4. ╭( ･ㅂ･)و ̑̑ 完了 !

## config/application.rbの設定

    # template.rb

    application 'config.i18n.default_locale = :ja'
    application "config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]"
参考
http://railsguides.jp/generators.html#application

## locales以下のフォルダ構成を構築する
    # template.rb

    inside('config/locales') do
      # config/locales以下のディレクトリを作る
      run 'mkdir defaults'
      run 'mkdir models'
      run 'mkdir views'

      # en.ymlをconfig/locales/defaultsに移動
      run 'mv en.yml defaults'
    end

    # 日本語の辞書ファイルをconfig/locales/defaultsにダウンロード
    inside('config/locales/defaults') do
      run 'wget https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml'
    end

参考
http://railsguides.jp/rails_application_templates.html#inside-dir

## 完成
https://gist.github.com/kytiken/9cecf327348bab5683c8

# 
# 参考にしたURL
- https://github.com/kytiken/rails_locale_ja_setting_sample
- http://railsguides.jp/rails_application_templates.html
- http://railsguides.jp/generators.html#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88
- http://morizyun.github.io/blog/i18n-english-rails-ruby-many-languages/
- https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml
Eclipse + Maven + Tomcat の開発環境を快速に!?

## Eclipse + Maven + Tomcat の開発環境を快速に!?

Mavenビルドは強力ですが、Eclipse のインクリメンタルビルドに比べると遅いのが難点です。

特にWebアプリ開発で頻繁に HTML や javascript を修正する場合、
いちいち Tomcat に deploy するのでは、そのたびに時間がかかってとてもやってられません。

というわけで、ビルドを Eclipse と maven で使いわける方法にたどりつきました。

 - 通常の開発は Eclipse ビルドだけ
 - 正式のテストや deploy は maven ビルド

要は、Eclipseビルドと maven ビルドをへんに連携するより、はっきり分けてしまえ、という発想です。

（なおこの記事は [github pages](https://kuh96.github.io/2015/06/13/eclimaven/) にも入れています)

### 主な開発環境

 - Java 7
 - Tomcat 7 ～　ここではデバッグ用のローカルの Tomcat を前提
 - Maven 3 
 - Eclipse Luna
   - m2e plugin
   - sysdeo Tomcat plugin （古い！ WPT でも同様にできると思う）

### フォルダー構成

とりあえず maven 標準に合わせます。
★が Tomcat さんに見てほしいフォルダーです。
[app] は Webアプリの名前(Tomcatのコンテキスト名）です。

```text:
project/
 |- src/    # ソース
 |   |- main/
 |   |   |- java/ 
 |   |   |- resources/ 
 |   |   |- webapp/   ★ HTML,css, javascript、WEB-INF/web.xml などなど
 |   |
 |   |- test/
 |   |   |- java/ 
 |   |   |- resources/ 
 |
 |- (Maven Dependencies)/ ★　Maven の dependencies で設定した参照ライブラリ
 |
 |- target/ # 生成物
 |   |- classes/   ★ Java ソースからの生成クラス
 |   |- test-classes/
 |   |- [app]/  ～　mvn package で生成される
 |   |- [app].war ～　mvn package で生成される. 上の [app]/ をアーカイブしたもの
 |   |- その他 maven がいろいろ生成
```
### ちょこちょこ設定

やりたいことは　src/main/webapp にある　HTML、javascript などの
ちょっとした修正をすぐローカルの Tomcat に反映させたい、ということです。
そのため **Tomcat さんにはこのフォルダを直接見てもらう** ようにします。

**Eclipse のビルドパス設定**
 - src/main/webapp/ をソースフォルダーから外す
 - java/, resources/ の出力先は通常通り target/classes/ (test-classes/) に

**Tomcat プラグインの設定**
 - 開発用クラスローダーを有効に
 - target/classes/ と Maven の参照ライブラリを選択[^1]

[^1]: よくわすれるのだが、servlet-api.jar など Tomcat にあるライブラリは外すこと。クラスローダー関連でわけのわからないエラーがでてしまう。

**Tomcat の コンテキスト.xml の設定**
 - antiResourceLocking,antiJarLocking を false に
 - docbase を上の　src/main/webapp/ に

### 結果

これで HTML、javascript の修正はブラウザの再読み込みだけですみます。
(ブラウザのキャッシュには注意必要）

Java ソースを修正した場合は、自動or手動で eclipseビルドすれば
target/classes/ が更新されるので、Tomcat が勝手にアプリを再ロードしてくれます。

 - Javaソースの修正が頻繁な場合には何度も Tomcatの再ロードが起こってわずらわしいので、
   自動ビルドを停止 or Tomcat 自体を停止します

というわけで、開発はとっても快適になったのですが、
不精な方法で多少問題もあるので[^2]、もっとよいやり方があれば教えてください。

[^2]: Eclipse内でのテスト(testNG)とか、main()をRUNする場合に、何かへん？　たぶん m2e さんが余計なことをやってしまっているような気がする‥

### その他

ほんとは、webapp/WEB-INF/classes に Javaソースの出力先を指定できれば上の「開発用クラスローダーの設定」はいらないのだけど、
maven との競合、eclipse ビルドの出力先をネストできない、などの問題から上のようにしています。

なお上の設定では、target/classes が eclipse ビルドと maven で共用してますが、分けてもよいです。

また  maven 用には、別に Tomcat のコンテキスト (ex. [app]-mvn)を作成し、
その docbase で target/[app]/ を参照すれば (mvn package は必要だけど)、
maven ビルドのチェックもできます。

### 参考

 - [EclipseでMavenプロジェクトを作ってTomcatで動かせるようにする by syumaiさん](http://qiita.com/syumai/items/e2adf299a052e7859d1e)
chefの基本的なコマンドまとめ


Chefを触る頻度もそれほど高くないので、コマンド忘れちゃうねって人に向けたまとめです。
soloつけるんだっけ?あっそのままかみたいな人に役立つ...かも?

chef-dkを使っているのでgemからインストールした人はchef execを外してやってみてください。

## chefリポジトリの作成

```sh:
$ chef exec knife solo init chef-repo
```

Berksfileの
site :opscode
を
source "https://supermarket.chef.io"
に変更します。

## 対象ホストにchef-soloを入れる

```sh:
$ chef exec knife solo prepare username@192.168.33.10
```

## Berksfileで記述した誰かすごい人が作ったcookbookをcookbooks以下にダウンロード

```sh:
$ chef exec berks vendor cookbooks/
```

## 自分でクックブックを作る時のテンプレートを作成

```sh:
$ chef exec knife cookbook create dir_name -o site-cookbooks/
```

## レシビを適用する

```sh:
$ chef exec knife solo cook username@192.168.33.10
```
heroku docker:execしたらnpm install出来なくなった場合


herokuでdockerが使えるようになったので、触ってみた。

```
git clone https://github.com/heroku/node-js-getting-started.git
heroku plugins:install heroku-docker
heroku docker:init
heroku docker:start
```

簡単。


で、npmモジュールを追加しようと思って、以下を実行した。
```heroku docker:exec npm install request --save```

そうするとこんなエラー。
```Error: EACCES, mkdir '/app/src/node_modules/express'```
パーミッションがないっぽい。

解決策としては、ホスト側で生成されているnode_modulesディレクトリを削除すれば良い。

```heroku docker:exec```で実行したコマンドによる変更は、ホスト側にも反映されるので、```npm install```を実行するとnode_modulesディレクトリが生成される。これがコンテナ上にCOPYされていて、docker上のユーザが触れなくなってたみたい。
Phalcon forwardしたときにAssetsを切り替える

エラーページにforwardするときにCSSやJSのファイルを切り替えたいなー、と思って調べてみた。

##環境
PhalconPHP 1.3.5

##やり方
以下の投稿に載ってたので、その方法を拝借した。
> Is there some way to add an asset to every single page in Phalcon - Stack Overflow
> http://stackoverflow.com/questions/25841310/is-there-some-way-to-add-an-asset-to-every-single-page-in-phalcon

```php:IndexController.php
<?php

class IndexController extends \Phalcon\Mvc\Controller
{
    public function afterExecuteRoute()
    {
        // このままディスパッチループが終了する場合にのみAssetsを設定する
        if (!$this->dispatcher->isFinished()) {
            return;
        }
        $this->assets->addCss('css/index.css');
        $this->assets->addJs('js/index.js');
    }

    public function indexAction()
    {
        // ErrorControllerにforwardすると仮定
        $this->dispatcher->forward([
            'controller' => 'error',
            'action'     => 'error404'
        ]);
    }
}
```

```php:ErrorController.php
<?php

class IndexController extends \Phalcon\Mvc\Controller
{
    public function afterExecuteRoute()
    {
        $this->assets->addCss('css/error.css');
        $this->assets->addJs('js/error.js');
    }

    public function error404Action()
    {
         // エラー時(404)の処理を記述
    }
}
```

"切り替える"と表現したが、forwardする場合にはAssetsを設定しないようにしているだけ。
ちょっと強引なやり方かもしれないので、もっといい方法があれば教えて頂けるとありがたいです。
競技プログラミングのちょいテク(C++11ラムダ式)

競技プログラミングでたまにやるちょいテクの共有。

C++11のラムダ式は外側の変数を参照でキャプチャすることができます。

```cpp
int a = 0;
auto f = [&](){ a++; };
f(); // a == 1になっている
```

で、これがどう使えるかというと、例えばBFSするときとかに

```cpp
vector<bool> done(n);
queue<int> q;
q.push(0); // 初期状態を与える
done[0] = true;

while(q.size()){ // タイプ数減らすテク(!q.empty()より短い)
  const int now = q.front();
  q.pop();
  // 遷移方法1
  {
    const int next = f1(now);
    if(!done[next]){
      q.push(next);
      done[next] = true;
    }
  }
  // 遷移方法2
  {
    const int next = f2(now);
    if(!done[next]){
      q.push(next);
      done[next] = true;
    }
  }
}
```

みたいなコードを書きます(よね?)。
if(!done[next])のあたりのコードが複数回でてきてます。
ここをラムダ式にしてしまいましょう。

```cpp
vector<bool> done(n);
queue<int> q;
const auto push = [&](int next){
  if(!done[next]){
    q.push(next);
    done[next] = true;
  }
};
push(0); // ここもpushにしてしまえる

while(q.size()){
  const int now = q.front();
  q.pop();
  // 遷移方法1
  push(f1(now));
  // 遷移方法2
  push(f2(now));
}
```

かなりすっきりしました。
遷移方法が多くなってくると効果は絶大です。

普通の関数で同じことをやろうとすると、qやdoneをグローバル変数にするか、引数として引き回さないと行けないのですがラムダ式にすることでそれを回避できます。
あと地味に普通の関数を書くよりもカーソルの移動量が少ないのもメリット。

BFS以外でも重複コードがあったら大体置き換えられるので色々応用してください。
【Seaborn】日本語を表示する (フォントを変更する)

# Seaborn?
[Seaborn](http://stanford.edu/~mwaskom/software/seaborn/) とは、Pythonの外部モジュールのひとつで、統計データの可視化を目的として作られています。
公式ページでは、
> Seaborn is a Python visualization library based on matplotlib. It provides a high-level interface for drawing attractive statistical graphics.
(SeabornはmatplotlibにもとづくPythonの可視化ライブラリです。魅力的な統計グラフを描くためのハイレベルなインターフェースを提供します。)

と説明されています。要は、matplotlibをかっこ良く、かつ使いやすくするためのライブラリです。
しかし、Seabornはフォントの問題でデフォルトでは日本語をうまく表示することが出来ません<sub><a href="#1">1</a></sub>。

```py
import seaborn as sns
sns.plt.plot([0,1], [0,1]); sns.plt.title('tofu - 豆腐')
```
![tofu1.png](https://qiita-image-store.s3.amazonaws.com/0/62450/044ef9d3-8831-5bc0-84b4-bfbc5e2eeac1.png)

そこで、日本語を表示できるようにフォントを書き換えたいと思います。

# 対症療法
一時しのぎとして、「その場で使うフォントを指定する」という方法があります：

```py
sns.set(font='Yu Gothic')
sns.plt.plot([0,1], [0,1]);  sns.plt.title('tofu - 豆腐')
```
![tofu2.png](https://qiita-image-store.s3.amazonaws.com/0/62450/bc1367f7-bf5a-3398-6d6d-5fcfafcaafcd.png)
しかしこの方法だと、seabornをimportするたびに毎回設定する必要がありますし、何かのタイミングでフォントをデフォルト値に戻される<sub><a href="#2">2</a></sub>と、また設定をし直す必要があります。

# 原因療法？
そもそもseabornのデフォルト値をいじってしまえば問題が解決できるはずです。
順番に見ていこうと思います。

## matplotlibにフォントを追加する
seabornはmatplotlibの上で動くので、好きなフォントを使うためにはmatplotlibにフォントを追加する必要があります。

### フォントダウンロード
別になんでもいいんですが、今回は[IPAexフォント](http://ipafont.ipa.go.jp/)を使うことにします。ダウンロードして解凍すると、`ipaexg.ttf`というファイルがあるはずです。

### matplotlibの設定ファイルの場所を探してフォントを追加
```py
import matplotlib as mpl
print(mpl.matplotlib_fname())
```
を実行してみてください。 あなたのmatplotlibが現在参照している設定ファイルのパスが表示されます。 デフォルトでは、`python_install_folder\\lib\\site-packages\\matplotlib\\mpl-data\\matplotlibrc`です。
`matplotlibrc`の存在するフォルダ、つまり`mpl-data`の下にある`fonts`フォルダの`ttf`フォルダに、先ほどダウンロードした`ipaexg.ttf`というファイルをコピーしてください。
これでmatplotlibはIPAexフォントを使えるようになります<sub><a href="#3">3</a></sub>。

### seabornの設定ファイルを書き換える
`site-packages`にある、`seaborn`フォルダの`rcmod.py`をエディタで開いてください。
66-67行目の`def set(context="notebook", ...`をコメントアウトして次の行を追加：

```py
def set(context="notebook", style="darkgrid", palette="deep",
        font="IPAexGothic", font_scale=1, rc=None):
```
さらに、199から201行目あたりにある`"font.family": ["sans-serif"]`をコメントアウトして次の行を追加：

```py
"font.family": ["IPAexGothic"],
```

以上で準備完了です<sub><a href="#4">4</a></sub>。Pythonをもう一度立ち上げて確認してみます。

```py
import seaborn as sns
sns.plt.plot([0,1], [0,1]);  sns.plt.title('tofu - 豆腐')
```
![tofu3.png](https://qiita-image-store.s3.amazonaws.com/0/62450/e3efd09b-cc1c-c093-3423-ff92535605d5.png)
イイネ！

## ちなみに
```py
import matplotlib as mpl
font_paths = mpl.font_manager.findSystemFonts()
font_objects = mpl.font_manager.createFontList(font_paths)
font_names = [f.name for f in font_objects]
print(font_names)
```
を実行すると、matplotlibが現在使えるフォントの名前の一覧を吐きます ([Default fonts in Seaborn statistical data visualization in iPython](http://stackoverflow.com/a/20768282/2500650))。

---
<a name="1">1.</a> Windowsでは日本語が表示できませんが、Mac、Linuxはどうなっているのか知りません。もし日本語が表示できないなら同じ方法で解決できるはずです。
<a name="2">2.</a> `sns.set()`するとデフォルトに戻される
<a name="3">3.</a> このフォルダは、matplotlibをアップデートすると上書きされる恐れがあるそうです。
<a name="4">4.</a> このフォルダも、Seabornをアップデートすると上書きされそう。
MacでJPEG画像のサイズを小さくする

ハマった点含め、忘れいないようにメモ。

## 使うもの

* [jpegoptim 1.4.2](http://www.kokkonen.net/tjko/projects.html)

## 手順

brewでjpegoptimをインストール。

```zsh
% brew install jpegoptim
```

ヘルプが表示されればOK。

```zsh
% jpegoptim --help
```

「libjpeg見つからないよ」的なエラーが表示されたが、`jpeg`と`jpegoptim`を入れ直すことで、自分の環境では解消した。

```zsh
% brew uninstall jpeg
% brew install jpeg
% brew uninstall jpegoptim
% brew install jpegoptim
```


あとはヘルプに従い、よしなに実行。

```
% cd PATH_TO_JPEGS_DIR
% jpegoptim --strip-all --max=30 **/*.jpg
```
古いXcodeやツールはどこへ消えた？

リンク場所が変わって一瞬困りました。

https://developer.apple.com/
の一番下

![Apple_Developer 2.png](https://qiita-image-store.s3.amazonaws.com/0/8588/c7773da1-5073-1298-967d-e0a0edbc9805.png)

* * *

https://developer.apple.com/xcode/
のDownload

![Xcode_-_What_s_New_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/8588/1ae88619-d929-f003-6dc1-657bab726f7d.png)

* * *

https://developer.apple.com/xcode/downloads/
の下の方
![Xcode_-_Downloads_-_Apple_Developer.png](https://qiita-image-store.s3.amazonaws.com/0/8588/6fe1f147-fe53-6026-d8b4-424e7eb75de1.png)

するとログイン画面に行くのでログインするとたどり着けます。
GolangでSHA-256ハッシュ


```go
package main

import (
 "fmt"
 "crypto/sha256"
 "crypto/sha512"
 "golang.org/x/crypto/sha3"
 "golang.org/x/crypto/ripemd160"
)

func main() {
  // http://ja.wikipedia.org/wiki/SHA-2#.E3.83.8F.E3.83.83.E3.82.B7.E3.83.A5.E5.80.A4.E3.81.AE.E4.BE.8B
  str := "" // 空の入力に対するハッシュ値

 // sha256.Sum256 は、[]byte を必要とする
 fmt.Printf("SHA-256 : %x\n", sha256.Sum256([]byte(str)))
 // -> e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

 // その他、、、
 // sha512 の場合
 fmt.Printf("SHA-512 : %x\n", sha512.Sum512([]byte(str)))
 // -> cf83e1357eefb8bdf1542850d66d8007......

 // sha3-256 の場合
 fmt.Printf("SHA-3 256 : %x\n", sha3.Sum256([]byte(str)))
 // -> a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
 
 // RIPEMD-160 の場合は、New() で、hash.Hash が返ってくるので、
 // Write して Sum する
 rip := ripemd160.New()
 io.WriteString(rip, str)
 fmt.Printf("RIPEMD160 : %x\n", rip.Sum(nil))
 // -> 9c1185a5c5e9fc54612808977ee8f548b2258d31 
}
```


投稿当初、下記の実装を紹介していましたが、
go1.2で Sum256, Sum512 のfunctionが追加されていました。便利ですね。
（ [@tienlen さんから頂いたコメント](http://qiita.com/curious-eyes/items/abb29e1a06ac5bc2c5f2#comment-158f07aafe46802f843f)の通りです）
以下は、無視してOKです。

```go
package main

import (
 "fmt"
 "io"
 "crypto/sha256"
)

func main() {
  // http://ja.wikipedia.org/wiki/SHA-2#.E3.83.8F.E3.83.83.E3.82.B7.E3.83.A5.E5.80.A4.E3.81.AE.E4.BE.8B
  str := "" // 空の入力に対するハッシュ値

  // crypto/sha256 は、[]byte を必要とする
  s := sha256.New()
  s.Write([]byte(str))
  fmt.Printf("SHA-256 : %x\n", s.Sum(nil))

  // io.WriteString を使う方がキレイかな
  s = sha256.New()
  io.WriteString(s, str)
  fmt.Printf("SHA-256 : %x\n", s.Sum(nil))

  // どちらも e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
}
```

[The Go Playground](https://play.golang.org/p/U-G3eraNPU)

他のハッシュライブラリも、hash.Hash インタフェースに合わせて実装されているので、
SHA-512 の場合も同じように、crypto/sha512 を使えば良いし、
例えば、RIPEMD-160 とか、SHA-3 のライブラリは、
code.google.com/p/go.crypto
にあるけど、同じように使えます。

```go
package main

import (
 "fmt"
 "io"
 "code.google.com/p/go.crypto/ripemd160"
 "code.google.com/p/go.crypto/sha3"
)

func main() {
  str := "" // 空の入力に対するハッシュ値
  rip := ripemd160.New()
  io.WriteString(rip, str)
  fmt.Printf("RIPEMD160 : %x\n", rip.Sum(nil))

  // 9c1185a5c5e9fc54612808977ee8f548b2258d31

  sh3 := sha3.New256()
  io.WriteString(sh3, str)
  fmt.Printf("SHA-3 256 : %x\n", sh3.Sum(nil))

  // a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
}
```
クリックしたオブジェクトの名前を取得

マウスカーソルでオブジェクトを選択するにはRaycastを用いる。  

以下のスクリプトをメインカメラにアタッチして、名前を取得したいオブジェクトにColliderを設定しておく。

```csharp

public class Touch : MonoBehaviour {
  // rayが届く範囲
  public float distance = 100f;
  void Update () {
    // 左クリックを取得
    if (Input.GetMouseButtonDown(0)) {
      // クリックしたスクリーン座標をrayに変換
      Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
      // Rayの当たったオブジェクトの情報を格納する
      RaycastHit hit = new RaycastHit();
      // オブジェクトにrayが当たった時
      if (Physics.Raycast(ray, out hit, distance)) {
        // rayが当たったオブジェクトの名前を取得
        string objectName = hit.collider.gameObject.name;
        Debug.Log(objectName);
      }
    }
  }
}
```
暗号通貨(ビットコイン等)ペーパーウォレットの作成方法

以下に移行しました<br><a href="http://block-chain.jp/tech/paper-wallet/" title="暗号通貨(ビットコイン等)ペーパーウォレットの作成方法">暗号通貨(ビットコイン等)ペーパーウォレットの作成方法</a>
matlabのfigureの設定


matlabのfigureのset関数による設定
===================

#Introduction
matlabでの複数同時plotや，各figureへの設定のために.

> **Note:**
> この文書内のコードは以下のルールで書かれています．(書くように心がけています
> Class, methodはpascal case
> variableはsnake case
> ただし，言語のstandard libraryに関しては以下の通りではない．

*Official Documentsより*
http://jp.mathworks.com/help/matlab/ref/figure-properties.html

#figureクラスのインスタンスの生成

```matlab:CreateFigure.m
index = 1; %figure handle, indexは1から2147483646の整数値
hoge = figure(index); %figureインスタンスの生成，indexはhogeに格納
```

**indexを空にすると小さい順に空いている番号を入れてくれる**のでそのほうがいいかも
#生成したfigure objectにpropertyを設定する

```matlab:SetPropertytoFigure.m
%hogeは生成したfigure object
%Template
%set(hoge, 'PropertyName', 'PropertyValue');
set(hoge, 'Color', 'cyan'); %hoge figure背景色をColor::Cyanにする.
```

#とりあえずの終わりに
実際に設定したい項目は軸関連のAxesのほうが多い感じです．追記予定...
CSSで書いたmediaqueryをjavascriptに取り込む


今週のJavascrip Weekly、in brief で見つけて「はー、なるほど」と思った（し、つい声が出た）。

[Importing CSS Breakpoints Into Javascript](https://www.lullabot.com/blog/article/importing-css-breakpoints-javascript)

最初に断っておきますが、 matchMedia API が使えるブラウザだけが対象ならここまでやる必要ない気もします。ブレイクポイントの指標さえ決まっていて、cssとjsにその指標を書き込まなければいけないという二重な感じが嫌でなければ、それでも良いのではないかと。

ここでのメリットはjsにブレイクポイントの指標（数値的な）を持ち込まなくて良い点1点に限られる。

# どうやってやるのか？

## CSS でのブレイクポイント指定

```css
/**
* ブレイクポイントの指標、数値は適当です。お好きにどうぞ
*/
body:before {
  content: "smartphone";
  display: none; /* Prevent from displaying. */
}
@media (min-width: 700px) {
  body:before {
    content: "tablet";
  }
}
@media (min-width: 1100px) {
  body:before {
    content: "desktop";
  }
}
```

body の before 擬似要素にブレイクポイント毎の文字列仕込むという発想。目から鱗。javascript で引っ張ってくるのだろうと、容易に想像できた。

## javascript で擬似要素で指定した文字列を取得する

```javascript
var breakpoint = {};
breakpoint.refreshValue = function () {
  this.value = window.getComputedStyle(document.querySelector('body'), ':before').getPropertyValue('content').replace(/"/g, '');
};
```

最後の方に文字列をreplaceしてるんだけど、Firefox and IE だとダブルクオートのまま返ってくるかららしい。へー。

- javascript での擬似要素の値を取得するやり方 参考
[this method popularized by David Walsh](http://davidwalsh.name/pseudo-element)

## resize イベントに仕込む

```javascript
$(window).resize(function () {
  breakpoint.refreshValue();
  // ブレイクポイントの値を見て実装する処理など
}).resize();
```

最後に`resize()`してるのはload時にresize発火させるためかな。

----

元記事コメント欄に同じようなやり方が2年前くらいからあったことを知る。

[Anzeixer](https://github.com/zeixcom/Anzeixer)

知見がまだまだ浅い。
ほとんどコードの引用ですが、本日は以上です。
Goでスレッドセーフなシングルトン

Goのシングルトンで検索すると、以下のような内容でシングルトンを実現していることが多いです。

```go:singleton.go
package singleton

type single struct {
    // Some fields
}

var sharedInstance *single

func GetInstance() *single {
    if sharedInstance == nil {
        sharedInstance = &single{ /* 初期化 */ }
    }

    return sharedInstance
}
```

しかし、これでは複数スレッドからほぼ同時に`GetInstance()`が呼ばれると、複数のインスタンスが生成されてしまいます。
例として、以下のように`GetInstance()`を変更し、非同期で実行してみます。

```go:singleton.go
package singleton

import (
	"fmt"
	"time"
)

/* 省略 */

func GetInstance() *single {
    if sharedInstance == nil {
		fmt.Println("create new instance.")
		time.Sleep(1000) // 同時にGetInstanceが呼ばれるようわざと時間をかける
        sharedInstance = &single{ /* 初期化 */ }
    }

    return sharedInstance
}
```

```go:main.go
package main

import (
    "./singleton"
)

func main() {
    ch := make(chan interface{})
    go run(ch)
    go run(ch)
    go run(ch)
    <- ch
}

func run(ch chan interface{}) {
    ch <- singleton.GetInstance()
}
```

結果は以下のようになります。

```bash
$ go run main.go
create new instance.
create new instance.
create new instance.
```

したがって、Goにおいてスレッドセーフなシングルトンを実現したいのであれば、以下のようにするといいと思います。

```go:singleton.go
package singleton

type single struct {
    // Some fields
}

var sharedInstance *single = newSingle()

func newSingle() *single {
	// 何かしらの初期化処理
    return &single{ /* 初期化 */ }
}

func GetInstance() *single {
    return sharedInstance
}
```

特に初期化処理が必要ないのであれば、以下のようにもっと簡潔にすることもできます。

```go:singleton.go
package singleton

type single struct {
    // Some fields
}

var sharedInstance *single = &single{ /* 初期化 */ }

func GetInstance() *single {
    return sharedInstance
}
```
Electron開発環境をLinux Mint上に構築する

# Electron開発環境をLinux Mint上に構築する

ここ最近、[Electron](https://github.com/atom/electron "Electron")に興味が湧いてきたので、Electron開発環境を[Linux Mint](http://linuxmint-jp.net "Linux Mint")上に構築してみました。

Electronとは、JavaScriptでデスクトップアプリケーションを作成するためのフレームワークで、以前は"AtomShell"という名称でした。

 * GitHub、JavaScriptでデスクトップアプリが作れるライブラリAtom Shellを、Electronに改称
   * http://codezine.jp/article/detail/8678

以降の手順はLinux Mint環境で実施・確認したものです。他のLinuxディストリビューションでは手順が一部異なるかもしれません。

## Node.jsのインストール

まずはNode.jsをインストールします。
必要なパッケージはnodejsとnpmの2つで、該当するパッケージ名を検索してみます。

```
$ apt-cache search nodejs | grep ^nodejs
nodejs - evented I/O for V8 javascript
nodejs-dev - evented I/O for V8 javascript (development files)
nodejs-legacy - evented I/O for V8 javascript (legacy symlink)
nodejs-dbg - evented I/O for V8 javascript (debug)
$ apt-cache search npm | grep ^npm
npm - package manager for Node.js
```

以下の手順でNode.jsとnpmをインストールします。

```
$ sudo apt-get install nodejs
$ sudo apt-get install npm
```

## Electronのインストール

これでnpmからElectronをインストールできる...はずなのですが、一箇所ハマり所があります。npmはNode.jsのコマンド名が"node"であるとみなして一連の処理を実行しますが、Linux MintでのNode.jsコマンドは"nodejs"という名前でインストールしているため、そのままだとElectronインストール時に以下のエラーが発生します。

```
$ npm install electron-prebuilt -g
...中略...
sh: 1: node: not found
npm WARN This failure might be due to the use of legacy binary "node"
npm WARN For further explanations, please read
/usr/share/doc/nodejs/README.Debian
 
npm ERR! weird error 127
npm ERR! not ok code 0
```

そのため、"node"というコマンド名が利用できるよう、シンボリックリンクを手動で作成します。

```
$ which node nodejs
/usr/bin/nodejs
$ cd /usr/bin
$ sudo ln -s nodejs node
$ file node
node: symbolic link to `nodejs'
```

あとはElectronのドキュメントにあるように、以下のコマンドでインストールできます。

```
$ npm install electron-prebuilt -g
$ npm install electron-prebuilt --save-dev
```

## 簡単なサンプルを動かしてみる

Electronの"[Quick Start](http://electron.atom.io/docs/v0.27.0/tutorial/quick-start/ "Quick Start")"にあるサンプルでもよいのですが、ここは自分で作成した簡単なサンプルを動かしてみます。

 * [furandon-pig/electron_sample](https://github.com/furandon-pig/electron_sample "furandon-pig/electron_sample")

以下の手順でサンプルを実行します。

```
$ git clone https://github.com/furandon-pig/electron_sample.git
$ cd electron_sample
$ electron hello/
```

実行画面は以下のようになります。

![img00.png](https://qiita-image-store.s3.amazonaws.com/0/61137/bf3af562-58c1-e30b-2651-699302835d64.png)

## Linux Mint環境でElectronを動かす際の注意点

Linux Mint環境でElectronを試して見る際に、日本語の表示が化けてしまい、少しハマってしまいました。以下の方法で回避できるようです。

 * headタグ中に&lt;meta charset="UTF-8"&gt;を記述しておく
 * styleタグでbodyのフォントを以下のように指定する

```
<style>
  body {
    font-family: 'Takao Pゴシック','Open Sans',Helvetica,Arial,sans-serif;
  }
</style>
```

## まとめ

Linux MintでElectronを動かしてみました。Electronのサンプルプログラムはまだ少ない感じなので、公式のドキュメントを参照しつつサンプルを増やしていこうと思います。
Rails4の罠

私はRuby on Rails4でプログラムの勉強をしているのですが、

MVCで書かないといけないのですが、Rails3からRails4に上がったことで、

従来MODELで書いていたattr_accessibleがコントローラ側でStrongParamsに組み込まれてしまって、Rails3系の教科書が使い物にならなくなりました。

まぁ、コントローラでバリデーションチェック（内容の表現方法のチェック）をするほうが効率が良いし、書きやすいのでこっちのほうがいいのですが、写経している身としては、考えて書き直さないといけないので、ちょっと残念な気分です。

でも、仕方ないですね。

来週出る、技評社の<a href="http://www.amazon.co.jp/gp/product/4774164100?ie=UTF8&amp;camp=1207&amp;creative=8411&amp;creativeASIN=4774164100&amp;linkCode=shr&amp;tag=hottopics01-22" target="_blank">Ruby on Rails 4<wbr></wbr>アプリケーションプログラミング</a>がすごく楽しみです。

これはプロ仕様の内容ですし、Rails4に対応し且つ、UIの作り方までちゃんと書いてあるようですので（SASSとか）非常に良いと思いました。

プログラマ35歳説が囁かれるなかで、あえて34歳からプログラミングをやっている私はあれなんですけど、結構楽しく仕組みを理解できているので、これはこれでいいと思います。

Railsはローカル環境作るのだけが面倒なので、前にも話しましたがvagrant使うのがベストです。vagrantの構築についてはオライリーからvagrantの本が出ていますでそれがベストだと思いますが、普通に使う分には難しくはないので、是非チャレンジしてみてください。

<table border="0" cellpadding="5"><tr><td valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774164100/masahirokjp-22/" target="_top"><img src="http://livedoor.blogimg.jp/masahirok_jp/imgs/3/6/36e7cf40.jpg" border="0" alt="Ruby on Rails 4 アプリケーションプログラミング" /></a></td><td valign="top"><font size="-1"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774164100/masahirokjp-22/" target="_top">Ruby on Rails 4 アプリケーションプログラミング</a><br />山田 祥寛 <br /><br />技術評論社  2014-04-11<br />売り上げランキング : 866<br /><br /><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774164100/masahirokjp-22/" target="_top">Amazonで詳しく見る</a></font><font size="-2"> by <a href="http://www.goodpic.com/mt/aws/index.html" >G-Tools</a></font></td></tr></table>

<table border="0" cellpadding="5"><tr><td valign="top"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873116651/masahirokjp-22/ref=nosim/" target="_blank"><img src="http://livedoor.blogimg.jp/masahirok_jp/imgs/5/c/5c452d9b.jpg" border="0" alt="実践 Vagrant" /></a></td><td valign="top"><font size="-1"><a href="http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-Vagrant-Mitchell-Hashimoto/dp/4873116651%3FSubscriptionId%3D15SMZCTB9V8NGR2TW082%26tag%3Dmasahirokjp-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873116651" target="_blank">実践 Vagrant</a><img src="http://www.assoc-amazon.jp/e/ir?t=masahirokjp-22&l=ur2&o=9" width="1" height="1" style="border: none;" alt="" /><br />Mitchell Hashimoto Sky株式会社 玉川 竜司 <br /><br />オライリージャパン  2014-02-21<br />売り上げランキング : 26559<br /><br /><a href="http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5-Vagrant-Mitchell-Hashimoto/dp/4873116651%3FSubscriptionId%3D15SMZCTB9V8NGR2TW082%26tag%3Dmasahirokjp-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4873116651" target="_blank">Amazonで詳しく見る</a></font> <font size="-2">by <a href="http://www.goodpic.com/mt/aws/index.html" >G-Tools</a></font></td></tr></table>
Herokuの罠からようやく脱出

ローカルの状況が全く再現できないと泣いていたのですが、クリア出来ました。

1:git push しても反映されない

.gitと.gitgoneが腐っていたので、[Macの不可視モードを切り替えて](http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-show-hidden-file-or-folder-of-macos.htm)削除しました。

その後、

```
rake db:migrate
git init
git remote add heroku git@heroku.com:your_app_name.git
git commit -m 'xxx'
git push heroku master
cd your_app_name
heroku run rake db:migrate
```

します。

2:```heroku run rake db:migrate```しても反映されない

いえ、反映されていました。次の3がキモでした。

3: 反映されたと思ったらCSSが無視される

[herokuでRailsアプリを公開する手順をゆっくり丁寧に。](http://www.workabroad.jp/posts/1164)を参考にさせていただきました。

Rails4だとCSSやjavascriptが読み込まれていない。
対処するには下記設定を変更/追加する。

```rb:/config/environments/production
config.cache_classes = true
config.serve_static_assets = true
config.assets.compile = true
config.assets.digest = true
```

[Can't get CSS working on Heroku using Rails 4 with bootstrap-saas gem - Stack Overflow]( http://stackoverflow.com/questions/16271696/cant-get-css-working-on-heroku-using-rails-4-with-bootstrap-saas-gem)
Herokuで対応中とのことらしい。

ということでしたので、迷わず、コンフィグを書き換えてもう一度、上記１からやり直し。

4:CSSが反映されたと思ったらカラムの中にデータがない

これは、```heroku run rake db:seed```コマンドを```git push``` した後にやらないとダメなのでコマンドを打つ。

ということで、ようやくHeroku上に思った通りの表示が出来ました。

その他に、ルートパスにアプリを表示させたかったので、route.dbのパスを書き換えています。

相性の問題が多く、仕様が変わりまくるから大変です。

[プロフェッショナルのための　実践Heroku入門　プラットフォーム・クラウドを利用したアプリケーション開発と運用]( http://amzn.to/1MTeOHQ)
Herokuが動かないのはrakeコマンドを叩かなかったから。

[Rails x Herokuでアプリを作成 [完全初心者向けチュートリアル]](http://morizyun.github.io/blog/beginner-rails-heroku-tutorial/)

[HerokuではじめるRailsプログラミング入門](http://amzn.to/1GDgmF9)に書いてある、Herokuへのアップロードがうまく行きました。

本に書いてある通りやっても動きません。こちらのサイトに書いてある通りにやる事であっという間に動きます。

なぜなら、HerokuのDBとRailsServerが利用する標準のDBが違うため、rakeコマンドを叩き直さないと駄目だからです。

と昔は書いたのですが、構築しなおしたらrakeコマンドで再構築しろなんて言うのは当たり前だのクラッカー！

でも、素人向けの本なんだからrakeコマンド絶対使えとかちゃんと書くべきだと思う。

※追記

さらに、formタグ使うとpostになるわけですが、単純に本に書いてある通りに動かすと”InvalidAuthenticityToken errer”がでます。

[POST送信でInvalidAuthenticityTokenエラー](http://maskana-soft.com/rails/pro/body/95)

なので、必ずこのサイトに書いてある通り、

```rb

<span style="color: red;">skip_before_filter :verify_authenticity_token ,:only=&gt;[:hogehoge]</span>
```

※hogehogeは対象のerbファイルを指定

をおまじないの様に書かないとrailsがエラーを吐きまくります。

なんでこんな初歩の初歩も書き漏れているのか分かりません。（rails2.0からって書いてるし。）