OmniAICreator/Qiita-1.07M huggingface dataset:
ggplot2で帯グラフを作る

**(2016/03/15追記)ggplot2 v2.1.0で動作を確認しました。**

## Q
`ggplot2`で帯グラフを作成したいのですが、どうやったら描けるでしょうか?

## A
以下の要素を組み合わせると帯グラフが描けます:

1. 形状は棒グラフ(`geom = "bar"`)
2. y軸をフルに設定(`position = "full"`)
3. y軸をパーセンタイル標記に設定(`scale_y_continuous(labels = percent)`)
4. x軸とy軸を入れ替えて横棒グラフに設定(`coord_flip()`)
5. 項目順の調整 ※必要であれば

以下のコードから要素を追加していきます:

```r:example1.R
p <- ggplot(mtcars, aes(x = as.factor(gear), fill = as.factor(vs))) +
  geom_bar()
p
```

![example1.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/9dacb498-8971-5672-4a2b-757e8b25ba7c.png)

### y軸をフルに設定
y軸を、一端からもう一端へと引き伸ばすには、`position = "fill"`を設定します:

```r:example2.R
p <- ggplot(mtcars, aes(x = as.factor(gear), fill = as.factor(vs))) +
  geom_bar(position = "fill")
p
```

![example2.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/f3e701d9-d7ef-118c-b37b-33f46586dff5.png)

このとき、y軸のメモリが0-1.00と比率へ自動的に変化していることに留意してください。

### y軸をパーセンタイル標記に設定
`{scales}`パッケージを読み込んで、`scale_y_continuous(labels=percent)`の設定を追加します:

```r:example3.R
require(scales)
p <- ggplot(mtcars, aes(x = as.factor(gear), fill = as.factor(vs))) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = percent)
p
```

![example3.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/485dbbd0-db3e-9710-ac29-27dd79b4c6ed.png)

他にも方法はありますがこれが一番スムーズできれいにできます。`{ggplot2}`パッケージをインストールしているなら、`{scales}`はおそらくすでにインストールされています。

### x軸とy軸を入れ替えて横棒グラフに設定
この方法については、[ggplot2逆引き - ggplot2で縦軸と横軸をひっくり返したい - Qiita](http://qiita.com/kazutan/items/5c4ee243c48a64b44b2d)を参照してください。

```r:example4.R
require(scales)
p <- ggplot(mtcars, aes(x = as.factor(gear), fill = as.factor(vs))) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = percent) +
  coord_flip()
p
```

![example4.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/098d6fa4-f000-e355-bcb7-108bbb201a02.png)

### 項目順の調整
この方法については、[ggplot2逆引き - x軸を並べ替えたい - Qiita](http://qiita.com/kazutan/items/7840f743d642122d1219)を参照してください。

```r:example5.R
require(scales)
mtcars.v2 <- transform(mtcars, gear2 = gear * -1)
p <- ggplot(mtcars.v2, aes(x = reorder(gear, gear2), fill = as.factor(vs))) +
  geom_bar(position = "fill") +
  scale_y_continuous(labels = percent) +
  coord_flip()
p
```

![example5.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/f6a1e6cf-d461-39b4-8580-a2d10f7f73dd.png)

これで帯グラフの完成です。結構手間がかかります。

## 参考
- [position_fill. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/position_fill.html)
- [scale_x_continuous. ggplot2 0.9.3.1](http://docs.ggplot2.org/current/scale_continuous.html)
- [ggplot2逆引き - ggplot2で縦軸と横軸をひっくり返したい - Qiita](http://qiita.com/kazutan/items/5c4ee243c48a64b44b2d)
- [ggplot2逆引き - x軸を並べ替えたい - Qiita](http://qiita.com/kazutan/items/7840f743d642122d1219)
画面の端にUIを表示させる【Unity, uGui】

uGuiのボタンなどを画面端に固定して表示させます。
##スクリプト 
左・中央・右、上・中央・下の画面端に固定させることが出来ます。
このスクリプトをuGUIのゲームオブジェクトにアタッチします。

```csharp:UGuiPositionSetter
using UnityEngine;
using System.Collections;

public class UGuiPositionSetter : MonoBehaviour {
	public enum PositionX {
		LEFT,
		CENTER,
		RIGHT,
		FREE
	};
	public enum PositionY {
		TOP,
		MIDDLE,
		BOTTOM,
		FREE
	};

	[SerializeField]
	public PositionX positionX = PositionX.FREE;
	[SerializeField]
	public PositionY positionY = PositionY.FREE;
	public bool isUpdate = false;

	public Vector2 margin;

	private RectTransform _rt;

	void Start () {
		_rt =  GetComponent<RectTransform>();
	}

	void Update () {
		if (isUpdate)
			setPosition();
	}

	private void setPosition() {
		Vector2 pos = _rt.anchoredPosition;
		switch (positionX) {
		case PositionX.CENTER:
			pos.x = 0f;
			break;
		case PositionX.LEFT:
			pos.x = - Screen.width * 0.5f + _rt.rect.width * 0.5f + margin.x;
			break;
		case PositionX.RIGHT:
			pos.x = Screen.width * 0.5f - _rt.rect.width * 0.5f - margin.x;
			break;
		}

		switch (positionY) {
		case PositionY.MIDDLE:
			pos.y = 0f;
			break;
		case PositionY.BOTTOM:
			pos.y = - Screen.height * 0.5f + _rt.rect.height * 0.5f + margin.y;
			break;
		case PositionY.TOP:
			pos.y = Screen.height * 0.5f - _rt.rect.height * 0.5f - margin.y;
			break;
		}
		_rt.anchoredPosition = pos;
	}
}
```

## 使い方
使い方はこんな感じ。
プルダウンで場所を選ぶとそこに固定される。
![スクリーンショット 2015-08-02 19.25.56.png](https://qiita-image-store.s3.amazonaws.com/0/29966/ee954f33-8fa4-2ac9-f150-63e8c3397af7.png)

## 結果
今回は左上にボタンを固定配置させています。
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/f10dc397-6277-75b0-016d-2fff6b23b2ef.png" alt="スクリーンショット 2015-08-02 19.25.47.png" width="300" />
Tumblrでトップページのみに要素を表示させる

Tumblrで、トップページのみに何かを表示させます。
`{block:IndexPage}something{/block:IndexPage}`だけだと、検索結果ページやタグページ、日付ページにも表示されてしまうので注意が必要です。

あなたのトップページに、素敵なサムシングを表示させてください。

`{block:TagPage}<!--{/block:TagPage}
{block:SearchPage}<!--{/block:SearchPage}
{block:DayPage}<!--{/block:DayPage}
{block:IndexPage}
    something
{/block:IndexPage}
{block:DayPage}-->{/block:DayPage}
{block:SearchPage}-->{/block:SearchPage}
{block:TagPage}-->{/block:TagPage}`
Swift向けのシンプルなロギングライブラリを作った

Swiftでログ周りのことを検索しても自前実装している人がたくさん出てくるだけで、
Javaのようにデファクトスタンダードになっているようなロギングライブラリやインターフェースが見つかりませんでした。

外も暑いし、外出したくないので[ロガーだけSLF4J風のインターフェースを持ったライブラリ](https://github.com/53ningen/SL4Swift)を作ってみました。
本当は Logger は protocol にしたかったのですが、protocol で定義した関数はデフォルト引数を持てないという制約があるようで、
そうなるとロガーの利用側はいちいちファイル、行数、メソッド名などを表す `__FILE__`, `__LINE__`, `__FUNCTION__` などを渡さなければならず、鬼のように面倒臭いです。 
たとえばいちいちログ出力するのに以下のようなコードは書きたくないですよね？

```
// ダルすぎワロタ
logger.info("hogehoge", file: __FILE__, function: __FUNCTION__, line: __LINE__) 

// 本来はこう書きたい
logger.info("hogehoge")
```

そこで妥協してクラスにしてあげるという形をとりました。これにより以下のように使えるようになります。

```swift
let logger = LoggerFactory.getLogger(.INFO)
logger.info("logger test")  //=> output log
logger.trace("hoge")        //=> do nothing(loglevel = .INFO)

// 出力例
// 2015-08-02 16:59:31.482 xctest[74860:477566] [INFO] LoggerTest.swift:8 <testExample()> - logger test
```

ロガーとして最低限欲しかったログレベルによる、ログの吐き分け機能は実現できたのでとりあえず公開しました。
CocoaPodsから利用することができます。


1. pod 'SL4Swift'
2. pod install


開発リポジトリは[こちら](https://github.com/53ningen/SL4Swift)です。私自身はiOS開発の経験はまだ１ヶ月半程度しかないので、素人です。なにか問題がありましたらコメント or PRをいただけると幸いです。また、よさげなログまわりの知見があればコメントをいただければ幸いです。
Unity2Dで画面のアスペクト比を固定にしたい【Unity, uGUI】

[以前の投稿](http://qiita.com/kwst/items/371542a6d3892b577b41)では単なるSpriteだったので、今回はuGUIでアスペクト比を固定にします。

## 今回使用する画像
前回と同じ画像です。
640✕940の画像
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/eba5fb0c-669a-9f82-4fde-2e1cbb8bbc53.png" alt="cd1e292c-f081-94d8-b351-ea17208ae8df.png" width="300" />

## 配置
Hierarchy→UI→Image でGameObjectを配置します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/fdfb3ae6-ba50-a0aa-e31c-b201132927de.png" alt="スクリーンショット 2015-08-02 16.22.52.png" width="300" />

画面に対してはみ出しまくってます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/29966/6b27f629-4f11-fff7-de06-5afa42661644.png" alt="スクリーンショット 2015-08-02 18.27.40.png" width="700" />

## 画面にフィットさせる
今回の縦横はピクセル数になっているので以前に比べると簡単です。

```csharp:AspectKeeper.cs
public bool isUpdate = false;

private RectTransform _rt;
private Vector2 _originSizeDelta;
private float _aspect;
private float _screenAspect;

void Start () {
	_rt =  GetComponent<RectTransform>();
	_originSizeDelta = _rt.sizeDelta;
	_aspect = _rt.sizeDelta.x / _rt.sizeDelta.y;

	keepAspect();
}

void Update () {
	if (isUpdate)
		keepAspect();
}

private void keepAspect() {
	_rt.anchoredPosition = Vector2.zero;

	_screenAspect = (float)Screen.width / (float)Screen.height;
	// 画像のアスペクト比と画面のアスペクト比を比較します
	if (_aspect > _screenAspect) {
		// 縦長の画面の時
		float w = (float)Screen.width;
		float h = w / _aspect;
		_rt.sizeDelta = new Vector2(w, h);
	} else {
		// 横長の画面の時
		float h = (float)Screen.height;
		float w = h * _aspect;
		_rt.sizeDelta = new Vector2(w, h);
	}
}
```

このスクリプトをuGUIのGameObjectに貼り付けると、アスペクト比を保ってくれます。
![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/29966/1bbc8d2c-3721-59c5-b54f-69661f518b2c.gif)
unity > グラフのアニメーション

```txt:動作確認
Unity 5.1.2 on Mac OSX
```

LineRendererでグラフを描こうとしているうちに、アニメーションができた。

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List<>

public class GenerateLR : MonoBehaviour {

	private GameObject lineGroup; // for grouping
	private float accumTime_sec = 0.0f;
	private List<Vector2> my2DPoint; // for 2D data
	private float xstep = 0.2f;

	void DrawLine(List<Vector2> my2DVec, int startPos) {
		List<Vector3> myPoint = new List<Vector3>();
		for(int pos = startPos; pos <= startPos+1; pos++) {
			myPoint.Add(new Vector3(my2DVec[pos].x, my2DVec[pos].y, 0.0f));
		}

		GameObject newLine = new GameObject ("Line" + startPos.ToString() );
		LineRenderer lRend = newLine.AddComponent<LineRenderer> ();
		lRend.SetVertexCount(2);
		lRend.SetWidth (0.1f, 0.1f);
		lRend.SetPosition (0, myPoint[0]); // start
		lRend.SetPosition (1, myPoint[1]); // end

		newLine.transform.parent = lineGroup.transform; // for grouping
	}

	void initData() {
		my2DPoint = new List<Vector2> ();
		for (int idx=0; idx<100; idx++) {
			my2DPoint.Add (new Vector2 (-10 + xstep * idx, Random.Range(0.0f, 5.0f)));
		}
	}

	void updateData() {
		my2DPoint.RemoveAt (0); // remove 1st point

		for (int idx=0; idx < my2DPoint.Count; idx++) { // shift x position 
			Vector2 vec = new Vector2(my2DPoint[idx].x - xstep, my2DPoint[idx].y);
			my2DPoint[idx] = vec;
		}

		int last = my2DPoint.Count;
		my2DPoint.Add (new Vector2 (-10 + xstep * last, Random.Range(0.0f, 5.0f)));
	}

	void Start () {
		initData ();
	}

	void Update () {
		if (accumTime_sec < 0.3f) { // each 300 msec
			accumTime_sec += Time.deltaTime;
			return;
		}
		accumTime_sec = 0.0f;

		updateData ();

		if (lineGroup != null) {
			Destroy(lineGroup);
		}
		lineGroup = new GameObject ("LineGroup");
		for (int idx=0; idx < my2DPoint.Count - 1; idx++) {
			DrawLine (my2DPoint, /* startPos=*/idx);
		}
	}
}
```
Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（X11vncインストール編）

ここまでで
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Ubuntu 15.04インストール編）](http://qiita.com/notminamoto/items/3f3bfab540e5bdd21fbe)
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Javaその他ライブラリインストール編）](http://qiita.com/notminamoto/items/8c3223da5b51e6fb1fcf)
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Android studioインストール編）](http://qiita.com/notminamoto/items/04b8b9a93708792102eb)

が完了し、コンソールで操作する分には開発環境は構築完了した。

私の場合、平時Windowsをダブルウィンドウで使っており、開発環境のlinuxは、Windowsからリモート接続で利用したいと考えた。
なので、ubuntuにX11vncをインストールする。
X11vncはubuntuのコンソールを別コンピュータに表示するソフトウェアである。
Linuxでリモート接続というとvncと思う読者も多いだろうが、実際私もそう考えて試行錯誤した。ところが全く上手くいかなかった。エミュレーターが起動しなかった。

↓のページを読むと
[JenkinsのAndroid Emulator Pluginを使ってみる](http://hiroom2.jimdo.com/2015/06/28/jenkins%E3%81%AEandroid-emulator-plugin%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B/)

どうやらvncでAndoroidのエミュレーターが起動しないのは当たり前らしい。
無知な私にはそこらへんが全くわからなかった。が、そうらしいのでvncを使うのはやめてX11vncを使うことにした。
vncでエミュレーターが起動しない理由をご存知の方は教えていただきたい。

↓のページを参考にした。
[Linuxでディスプレイに表示中のXに対してVNCする(X11VNC)](http://blog.asial.co.jp/842)

一応、自分がやったことを書いておく。

```
$ sudo apt-get install x11vnc
```

起動は以下のコマンドで出来る。

```
$ x11vnc
```

あとは接続もとのPCにTightvncをインストールして、起動して接続先にubuntuを指定する。


以上で、Ubuntu 15.04 + Android Studio + X11vncの環境の構築手順は完了である。
Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Android studioインストール編）

既にUbuntu、Javaその他のライブラリのインストールは記事にした。

[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Ubuntu 15.04インストール編）](http://qiita.com/notminamoto/items/3f3bfab540e5bdd21fbe)
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Javaその他ライブラリインストール編）](http://qiita.com/notminamoto/items/8c3223da5b51e6fb1fcf)

次はAndroid studioのインストール手順を記す。
これらは↓のページを参照すると良い。

①[Ubuntu にAndroid Studio をインストールする](http://qiita.com/TsutomuNakamura/items/ef4aeec32cdaaf9105cc)
②[64bit Ubuntu に Android の開発環境をインストールするときにやること](http://qiita.com/KeithYokoma/items/a3d37401aebf451ba5b9)
③[AndroidStudioをUbuntuでやりたい](http://syoshinsyakangeisagi.blogspot.jp/2014/10/androidstudioubuntu.html)

一応、自分の環境で上手くいった手順をまとめておく。

１．まずAderoid studioのパッケージをダウンロードして、ubuntuに保存する。
ダウンロードページ　https://developer.android.com/sdk/index.html
All Android Studio Packagesをダウンロードした。

２．保存したパッケージを展開する（当たり前だが展開した場所がインストール場所になる。）

```
$ unzip android-studio-ide-141.1980579-linux.zip
```

３．Android studioの設定を開始する。

```
$ cd android-studio/bin/
$ ./studio.sh
```

４．カスタムを選択し、Sdkの保存ディレクトリの指定、ライセンスの同意などを行う。特に迷うところはない。

５．プロジェクト（名前はHelloworldとか）を開始して、あとはデフォルト（blank、MainActivityとか）で進める。

６．SDKマネージャーを起動して、各バージョンのtools、System image、platform、APIと名のつくもののTV、Wear以外はすべてインストールする。

７．AVDマネージャーを起動し、デフォルトで作られているNexus 5 API 22 x86を起動する。

８．しばらくして仮想デバイスが表示されてAndroidが操作可能になったら設定完了！！

次は、この環境をリモート操作できるように設定する。

[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（X11vncインストール編）](http://qiita.com/notminamoto/items/afbcd727d614f65987ed)
Ruby 多重代入

```
a,b,c = 1,2,3
a, b = 0, 1
tmp = a #aの値をtmpに逃がしておいて
a=b #aにbの値を代入する
b = tmp #最初のaの値をbに代入する
p [a,b] #=> [1,0]
```

多重代入では

```
a,b = 0,1 
a, b = b , a
p [a,b] #=> [1,0]
unity > グラフ描画 > LineRendererで折れ線を引く

```txt:動作確認
Unity 5.1.2 on MacOS X
```

とりあえず折れ線を引くコードはできた。

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List<>

public class GenerateLR : MonoBehaviour {

	void DrawLine(List<Vector2> my2DVec, int startPos) {
		List<Vector3> myPoint = new List<Vector3>();
		for(int idx=0; idx<2; idx++) {
			myPoint.Add(new Vector3(my2DVec[startPos+idx].x, my2DVec[startPos+idx].y, 0.0f));
		}

		GameObject newLine = new GameObject ("Line");
		LineRenderer lRend = newLine.AddComponent<LineRenderer> ();
		lRend.SetVertexCount(2);
		lRend.SetWidth (0.1f, 0.1f);
		Vector3 startVec = myPoint[0];
		Vector3 endVec   = myPoint[1];
		lRend.SetPosition (0, startVec);
		lRend.SetPosition (1, endVec);
	}

	void Start () {
		List<Vector2> my2DPoint = new List<Vector2> ();
		for (int idx=0; idx<100; idx++) {
			my2DPoint.Add (new Vector2 (-10 + 0.2f * idx, Random.Range(0.0f, 5.0f)));
		}

		for (int idx=0; idx < my2DPoint.Count - 1; idx++) {
			DrawLine (my2DPoint, /* startPos=*/idx);
		}
	}
	
	void Update () {
	
	}
}
```

![Untitled_-_150802_lineRenderer_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/a7bd9d78-a4c1-93e5-60bb-1cdffcbd26d3.jpeg)


#grouping付き

以下ではlineの要素をLineGroupというGameObjectでまとめるようにした。

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List<>

public class GenerateLR : MonoBehaviour {

	private GameObject lineGroup; // for grouping

	void DrawLine(List<Vector2> my2DVec, int startPos) {
		List<Vector3> myPoint = new List<Vector3>();
		for(int idx=0; idx<2; idx++) {
			myPoint.Add(new Vector3(my2DVec[startPos+idx].x, my2DVec[startPos+idx].y, 0.0f));
		}

		GameObject newLine = new GameObject ("Line" + startPos.ToString() );
		LineRenderer lRend = newLine.AddComponent<LineRenderer> ();
		lRend.SetVertexCount(2);
		lRend.SetWidth (0.1f, 0.1f);
		Vector3 startVec = myPoint[0];
		Vector3 endVec   = myPoint[1];
		lRend.SetPosition (0, startVec);
		lRend.SetPosition (1, endVec);

		newLine.transform.parent = lineGroup.transform; // for grouping
	}

	void Start () {
		lineGroup = new GameObject ("LineGroup");

		List<Vector2> my2DPoint = new List<Vector2> ();
		for (int idx=0; idx<100; idx++) {
			my2DPoint.Add (new Vector2 (-10 + 0.2f * idx, Random.Range(0.0f, 5.0f)));
		}

		for (int idx=0; idx < my2DPoint.Count - 1; idx++) {
			DrawLine (my2DPoint, /* startPos=*/idx);
		}
	}
	
	void Update () {
	
	}
}
```

### 関連
(追記: 2018/11/15)

- [unity > LineRendererで１本の線を描く](https://qiita.com/7of9/items/3750d30590e3efcfd389)
【散文】おそらくこの7年間くらいのWebアプリ開発とかCGIについて

この間teratailで非常にぼやっとした質問をしたのに解答が来たので、それを無下にしないようにポエムっぽくなるだろうけどまとめておく。
ご指摘などどしどしお願いします。このまま勘違いしたまま生きてたらお婿に行けない。

# 質問したこと
[WebアプリとCGIの違いは何でしょうか(13759)｜teratail](https://teratail.com/questions/13759)
つまるところ、僕の頭の中で色々なものの定義があやふやだった。

## 質問前の僕の頭の中
* Webアプリ：最近のサーバークライアント型のWebサービス的なの
* CGI : サーバーサイドのスクリプトを動かすための仕組み

そして（質問前の定義の）Webアプリは「**CGIの集合体でサーバーサイドで処理**して、それをHTMLで出力して更にCSSやJavascriptでかっこ良くしている」と思っていた。

# 質問後にまた調べての僕の認識
* CGIはほぼオワコン
    * 今は常にスクリプトが起動しているのが主流
        * ホットスタンバイ？　（今までのCGIがコールドスタンバイだとして）
    * ホットスタンバイなCGIを提供するプロトコル
        * FastCGI
        * SCGI
* 最近のWebサービスはプログラムを常駐させて、APIを利用してHTTPプロトコルを受けたり返したりする
    * APIs
      * WSGI(Python)
      * Rack(Ruby)
      * JSGI(Javascript)
      * PSGI(Perl)
      * PHPはmod_phpが担ってる……のか？　ルーティングまで？
          * PHPが自分の中では謎い。
* でもAPIを直接触ってコードを書くのもしんどいし、セキュリティとかも色々面倒なところがあるのでフレームワークを使う。
    * HTTPリクエストによってどのメソッドなりモジュールを呼び出すか定義してるのがルーティング？

# 質問に至るまでの過程。
## 2011年に専門学校卒業。
* その当時「CGI」という科目でWebプログラミングを学ぶ
  * 使っていた言語はVBScript
  * CGIなので「へー、Webプログラミングはサーバーのスクリプトを逐次呼び出して動くんだ」とばかり思った

「学校の教育が悪かった」という訳ではない

## プログラマとして一応働き始める
* Ajaxとかのワードを調べ始める
    * 正直今もよくわからない
        * 今までの僕のWebプログラミングの概念だと、裏で何らかのスクリプトを*呼び出している*と思ってるからか？

## 2012年から2014年くらい：Wordpressを触ったりする
* 「WordpressもPHPを使ったCGIの集合体なんだなあ」と勘違いしたまま2015年を迎える。

## 2015年夏：PythonでWebアプリ（というよりサービス）を作ろうとする
* マイクロフレームワークBottleを使おう
    * 壁にぶち当たる「俺のしってるWebプログラミングと違う」
        * WSGI、なんかHTTPのやり取りを簡素にしたやつなのね
        * ルーティング？　スクリプトファイルに直接アクセスさせたらよかったんじゃないの？
        * このプログラム、CGIでよくね？ → WSGIを使ったほうがいいのか……ふむ、で、ルーティングの問題が出てくるなあ……。
* Werkzeugに切り替える
    * 壁にぶち当たる
         * 結局ルーティング問題は脱出できない。
* あれ、じゃあPHPはどうしてXAMPP環境構築したらアドレス直打ちで動くんだ？
    * Apache？
        * mod_php？　これがルーティングやってるの？

そして僕の頭が悲鳴を上げた。そしてあんな質問をした。

# 今でも謎なこと
* PHPのルーティングとかはmod_phpがやってるのか？
* そういえばAjaxとWebSocketの違いが未だによくわかってない（別議題）
Ruby 予約語

意味を持っているので変数としては使えない

## __LINE__
alias
class
elsif
if
not
return
nndef
yield

##ENCODING
and
def
end
in
or
self
unless

##FILE
begin
defined?
ensure
module
redo
super
until

#BEGIN
break
do
false
next
rescure
then
when

##END
case
else
for
nil
retry
true
while
unity > Vector3をリストで保持 > List<Vector3> myPoint = ...

```csharp
Unity 5.1.2 on MacOS X
```

Vector3をリストで保持したい。

http://answers.unity3d.com/questions/663739/how-to-assign-list-.html

```csharp
using System.Collections.Generic; // for List<>
...
	void Start () {
		List<Vector3> myPoint = new List<Vector3>();
		myPoint.Add (new Vector3 (0.0f, 0.0f, 0.0f));	
		myPoint.Add (new Vector3 (5.0f, 5.0f, 0.0f));

		Vector3 startVec = myPoint[0];
		Vector3 endVec = myPoint[1];
                ...
	}

```
Ruby ローカル変数とグローバル変数

```scopetest.rb
$x=0
x=0
require "./sub"
p $x #=> 1
p x #=> 0
```

```sub.rb
$x=1 #$x=0と同じ変数。グローバル変数に代入
x=1 #x=0と異なる変数。ローカル変数に代入
```

グローバル変数：複雑なので、一般的には好まれない
ローカル変数：最初に代入された時初期化される
Ruby 変数


変数は以下の4種類

変数名/例

ローカル変数(局所変数) name
グローバル変数(大域変数) $name
インスタンス変数 @name"
クラス変数 @@name

擬似変数はnil/true/false/selfなど、
特定の値を指し示すために
予約した名前
代入する事で値を変更できない
unity > LineRendererで１本の線を描く

```
Unity 5.1.2 on MacOS X
```

LineRendererでグラフを描画したい。
第一歩として、１本の線を描く。

http://answers.unity3d.com/questions/267469/creating-a-linerenderer-its-always-null.html

Main Cameraに以下のスクリプトを関連づける。
(LR: LineRenderer)

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

public class GenerateLR : MonoBehaviour {

	void Start () {
		GameObject newLine = new GameObject ("Line");
		LineRenderer lRend = newLine.AddComponent<LineRenderer> ();
		lRend.SetVertexCount(2);
		lRend.SetWidth (0.2f, 0.2f);
		Vector3 startVec = new Vector3 (0.0f, 0.0f, 0.0f);
		Vector3 endVec = new Vector3 (5.0f, 5.0f, 0.0f);
		lRend.SetPosition (0, startVec);
		lRend.SetPosition (1, endVec);
	}
	
	void Update () {
	
	}
}
```

成果はこちら。

![Untitled_-_150802_lineRenderer_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/4db41dc7-c06f-9e5a-62fd-805916350c48.jpeg)


同じことをListを使って実装したもの

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // for List<>

public class GenerateLR : MonoBehaviour {

	void Start () {
		List<Vector3> myPoint = new List<Vector3>();
		myPoint.Add (new Vector3 (0.0f, 0.0f, 0.0f));	
		myPoint.Add (new Vector3 (5.0f, 5.0f, 0.0f));

		GameObject newLine = new GameObject ("Line");
		LineRenderer lRend = newLine.AddComponent<LineRenderer> ();
		lRend.SetVertexCount(2);
		lRend.SetWidth (0.2f, 0.2f);
		Vector3 startVec = myPoint[0];
		Vector3 endVec = myPoint [1];
		lRend.SetPosition (0, startVec);
		lRend.SetPosition (1, endVec);
	}
	
	void Update () {
	
	}
}
```
Ruby インスタンス

XXXクラスのオブジェクトの事を、
XXXクラスのインスタンスという
Rubyの場合、全てのオブジェクトは何かのクラスのインスタンスである
インスタンス=オブジェクト
あるオブジェクトはあるクラスに属している事を強調する
場合には"インスタンス"の方がよく使われる
Arduino IDE+ESP-WROOM-02でLチカ

一見Arduinoと無関係そうな環境のプログラムをArduino IDEで書いてLEDを光らせてみたよ、という記事です。

「[ESP-WROOM-02を動かしてみた](http://qiita.com/hnw/items/3869f435405054511fda)」の環境を使って、Arduino IDEからESP-WROOM-02に「Blink」スケッチを流し込んでLチカしてみました。

# 準備するもの

- ESP-WROOM-02動作環境一式
- 赤色LED x1
- 電流制限抵抗100Ω x1

# Arduino IDE環境の準備

Arduino IDEにESP8266EXボード用の設定を取り込むことで、ArduinoからESP8266EX上で動くプログラムを自由に開発できるようになります。これはGitHubの[esp8266/Arduino](https://github.com/esp8266/Arduino)で（おそらく有志の手によって）開発されています。実にありがたいことですね。

手順としては下記の通りです（READMEそのままです）。ちなみに、この方法にはArduino 1.6.4以降が必須のようです。

- Arduinoの「Preferences」を開く
- 「Additional Board Manager URLs」フィールドに`http://arduino.esp8266.com/stable/package_esp8266com_index.json`と書く
    - カンマ区切りで複数書けるらしい
- 「ツール」 > 「ボード」 > 「Boards Manager...」から、 「esp8266 platform」をインストールする
    - インストールが終わるまでしばらく待つ
- 「ツール」 > 「ボード」から適当なボードを選ぶ
    - 「Generic ESP8266 Module」で動作しました

# 実験

定番のサンプルスケッチ「Blink」をビルド・実行してみました。ピンを変えながら実験してみたところ、4,5,12,13,14,16番の6ピンについてLチカできました。これらはデジタル入出力ピンとして自由に使えそうです。残りのピンはうまく使えるのかしら…？

# 注意点

ESP-WROOM-02に対してArduino IDEから書き込む際はブレイクアウトボードのジャンパで「UART Download Mode」にする必要があります。書き込んだプログラムは即座に動き始めます。また、電源を落としても「Flash Boot Mode」で起動すれば再び動作します。

逆に言うと、こうして自分のプログラムを書き込んでしまうと元々入っていたファームウェア（ATコマンドインターフェース）を消すことになります。慎重派の方は、元のファームウェアのバックアップを取ってからやった方がいいかもしれません。

# 参考資料

- [esp8266/Arduino](https://github.com/esp8266/Arduino)
- [「ESP-WROOM-02」をArduinoで開発 - おかゆ日和](http://www.okayu.jp/entry/2015/07/23/220000)
Ruby オブジェクトの種類

1.数値オブジェクト
2.文字列オブジェクト
3.配列オブジェクト(複数データをまとめるため)
4.ハッシュオブジェクト(複数データをまとめるため)
5.正規表現オブジェクト(マッチングのためのパターン)
6.時刻オブジェクト(2015.8.2 18:00)
7.ファイルオブジェクト(ファイルそのものというよりファイルへの読み書きを行うためのオブジェクト)
8.シンボルオブジェクト(Rubyメソッドなど名前の識別に使うファイル)
9.範囲オブジェクト
10.例外オブジェクト
Ruby require [./]


```
grep.rb
def simple_grep(pattern, filename)
  file = File.open(filename)
  file.each_line do |line|
   if pattern  = ~line
   print line
   end
 end
file.close
end

use_grep.rb
require "/.grep" #grep.rbの読み込み
pattern 引数 = Regexp.new(ARGV[0])
filename 引数 = ARGV[1]
simple_grep(pattern, filename).simple_grep
メソッド起動
```

ライブラリをスクリプトと同じディレクトリに置いた場合は[./]を入れてカレントディレクトリにあることを明示する必要がある
Cowboy はじめに

[Cowboy Users Guide の翻訳記事の目次はこちらへ](http://qiita.com/hayabusa333/items/ac692bdb08fa3d81e312)

# 本文
## はじめに

CowboyはErlangで書かれた小さな高速モジュラーHTTPサーバです。

CowboyはSPDY、Websocket、RESTやそれらから派生した通信形式を含む完全なHTTPスタックを提供することを目的としています。
Cowboyは現在、HTTP/1.0、HTTP/1.1、Websocket(全ての実装とドラフト+標準)、WebmachineベースのRESTをサポートしています。

Cowboyは高品質なプロジェクトです。
Cowboyは小さなコードベースであり、非常に効率的で(遅延およびメモリ使用量の両方において)、簡単に他のアプリケーションに埋め込むことができます。

Cowboyは綺麗なErlangのコードです。
Cowboyは数百のテストをパスしており、そのコードはダイアライザーに完全に準拠しています。
また十分に文書化され、関数のリファレンスとユーザガイドの両方を備えています。

### 前提条件

Erlangの知識はこのガイドを読むために必要ではありません。
読者にはErlangの概念を紹介し、必要に応じて参考資料を参照できるようにリンクをはってあります。

ガイドにHTTPプロトコルについて記述しているためHTTPプロトコルの知識があると理解しやすいですが、必須ではありません

### サポートしているプラットフォーム

Cowboyはテスト済みであり、Linux環境をサポートしています。

Cowboyが他のプラットフォームで動作することも報告は聞いていますが、私たちにとってその報告が安全で問題ないという保障は行ってはおりません。
あなた自身が他のプラットフォームで使用する際に必要なテストやセキュリティの監査を実施することをオススメします。

CowboyはErlang/OTPのR16B01、R16B02、R16B03-1、17.0、17.1.2のバージョンに準拠して開発されています。

Cowboyに小さなコードの変更を行ったり、上記のErlangのバージョン以外でコンパイルしても良いですが、期待通りに動作する保障はありません。

### バージョニング

Cowboyはセマンティックバージョン2.0.0を使用しています。

### 表記

HTTPプロトコルではメソッド名は大文字と小文字が区別されています。
すべての標準メソッド名は大文字です。

ヘッダ名は大文字と小文字が区別されません。
CowboyはRequestヘッダ名をすべて小文字に変換し、アプリケーションが応答した場合には小文字のヘッダ名を提供する想定です。

上記と同じようなことが他の大文字と小文字を区別しない値にも適用されます。
Ruby メソッドの作成

# メソッドの作成

```
def メソッド名 
　　メソッドで実行したい処理
  end

hello_ruby2.rb
def hello
  print "Hello, Ruby. \n"
end
hello()
#=> ruby hello_ruby2.rb
```

# 別のファイルを取り込む

ライブラリ：たいていのプログラミング言語では、別々のファイルに分割されたプログラムを組み合わせて1つのプログラムとして利用するための機能を持っている。
他のプログラムから読み込んで利用するためのプログラムをライブラリという。

# require 使いたいライブラリのファイル名 (.rbは省略)
Cowboy User Guide の翻訳 目次

ElixirにてWebアプリケーションを開発しようとするとCowboyにたどり着くことになります。
そこでCowboyのユーザガイドを翻訳することによって、これからCowboyを使用される方がつまづくことないようにと思い、翻訳を行いたいと思います。
翻訳許可をくださり、また掲載許可もくださった Nine Nines社とLoic Hoguin様ありがとうございました。

翻訳ですが素人翻訳ですので間違いが多々あるかもしれません。
解説が間違っていた場合には、コメントか@hayabusa333にご連絡くださると嬉しいです。

ブログにて先行投稿しておりますが、検索性も考えてQiitaにもあげておきたいと思い投稿を行っております。

翻訳元のドキュメントは以下となります。
[Cowboy User Guide](http://ninenines.eu/docs/en/cowboy/1.0/guide/)

スペシャルサンクス(敬称略)
[Hirofumi Tamori](http://qiita.com/HirofumiTamori)

# Cowboy ユーザガイド
Cowboyユーザガイドは現代のWeb技術とWebアプリケーションを記述するためにCowboyを最大限に活用するための地図です。

## Cowboy紹介
- [はじめに](http://qiita.com/hayabusa333/items/5614ec0292285f56da3d)
- [現代のWeb](http://qiita.com/hayabusa333/items/472a473b9ec8c0ae8382)
- [ErlangとWeb](http://qiita.com/hayabusa333/items/7f950d59f4e96b5f9e5a)
- [初心者のためのErlang:(http://qiita.com/hayabusa333/items/4d38f549383894f7803e)
- 入門

## HTTP

- Requestの生涯
- ルーティング
- プレーンなHTTP Requestの処理
- Reqオブジェクト
- Request Bodyの読み取り
- Responseを送信
- Cookieの使用

## マルチパート

- マルチパートことはじめ
- マルチパートRequest

## 静的ファイル

- 静的ハンドラ

## REST

- RESTの原則
- RESTリクエストの処理
- RESTフローチャート
- リソースハンドラの設計

## WebSocket

- WebSocketプロトコル
- WebSocketの接続処理

## Serverへのプッシュ

- ループ·ハンドラ

## プラグイン可能なインタフェース

- ミドルウェア
- プロトコルのアップグレード
- Hooks

## 内部動作

- アーキテクチャ
- 壊れたクライアントへの対処
Ruby 特定行のみの出力

ファイルの中から特定のパターンの行のみを選んで出力する

```
simple_grep.rb
pattern = Regexp.new(ARGV[0])
filename = ARGV[1]
file = File.open(filename)
file.each_line do |line|
  if pattern = ~line
   print line
  end 
end
file.close
```


>> ruby simple_grep.rb パターン ファイル名
>> ruby simple_grep.rb matz changelog
MySQLとPostgreSQLコマンド比較表

機能 | MySQL | PostgreSQL
----|----|----
起動 | `$ mysql -p -h ホスト名 -P ポート番号 -u ユーザ名 DB名` | `$ psql -h ホスト名 -p ポート番号 -U ユーザ名 DB名` 
データベース一覧 | show databases; | \l
データベース切替 | use DB名<br>\u DB名 | \c DB名
テーブル一覧 | show tables; | \d、\dt、\d+、\dt+
テーブル定義確認 | desc テーブル名; | \d テーブル名
テーブルCREATE文確認 | show create table テーブル名 | pg_dump DB名 -U ユーザ名 -s -t テーブル名
インデックス一覧 | SHOW INDEX FROM tbl_name; | \d table_name
行表示の切り替え | select * from t \G | \x<BR>select * from t;<br>※mysql同様、1回のクエリだけ\xしたい場合は<BR>select * from t \gx<BR>[psql 9以前の場合はこちら](https://qiita.com/aosho235/items/7e580c6302610346f80d)
SQLファイル実行 | \\. | \i
SQLダンプ | mysqldump | pg_dump
TSVダンプ | mysqldump -u USER --password=PASS DATABASE_NAME TABLE_NAME -T /tmp | \copy テーブル名 to 'data.tsv' csv delimiter E'\t' header;<BR>または<BR>\\copy (select * from テーブル名) to 'data.tsv' csv delimiter E'\t' header;
TSVインポート | LOAD DATA LOCAL INFILE ファイル名 REPLACE INTO TABLE テーブル名 IGNORE 1 LINES; | copy テーブル名 from '/absolute_path/to/data.tsv' ( delimiter E'\t', format csv, header true );
SQL時間計測 | デフォルトで表示される | \timing on
ログ出力開始 | \T log.txt | \o log.txt
ログ出力終了 | \t | \o
1回のクエリだけファイルに出力 | 不明 | SQLの末尾に\g FILENAMEをつける
1回のクエリだけvimで表示 | 不明 | SQLの末尾に\g \|vim -をつける
バッファをエディタで編集 | SQLの末尾に \e をつける| SQLの末尾に \e をつける
定義をコピーしてテーブル作成 | create table t2 like t1; | create table t2 (like t1);
実行計画 | SQLの先頭にEXPLAINをつける | SQLの先頭にEXPLAINをつける
接続先サーバ確認|\s | \conninfo<BR>SELECT version();
接続を確認 | show processlist; | select * from pg_stat_activity; |
連番ID | カラム名 int auto_increment | カラム名 serial
今日の日付 | curdate() | current_date
現在時刻 | now() | now()
ヘルプ | \h または \\? | \\h と \\? （内容が異なる）
設定ファイル | ~/.my.cnf | ~/.psqlrc

## information_schemaは両方に共通

information_schemaはSQL標準なので、どちらでも同じSQLが使える。

### テーブル一覧を表示

```sql
SELECT table_catalog
       ,table_schema
       ,table_name
       ,table_type
FROM   information_schema.tables;
```

### カラム一覧を表示

```sql
SELECT table_schema
       ,table_name
       ,column_name
       ,data_type
       ,character_maximum_length
       ,numeric_precision
       ,column_default
FROM   information_schema.columns
WHERE  table_name = 't1'
ORDER  BY table_name
          ,ordinal_position;
```


## デフォルト接続先

PostgreSQL：環境変数で設定

```sh
export PGDATABASE=DB名
export PGHOST=ホスト
export PGPORT=ポート番号
export PGUSER=ユーザー名
export PGPASSWORD=パスワード

パスワードは~/.pgpassでも設定できる。
```

MySQL：~/.my.cnfで設定

```ini
[client]
database=DB名
user=ユーザー名
password=パスワード
```

## その他

[xo/usql: Universal command-line interface for SQL databases](https://github.com/xo/usql#backticks)
を使うとpsqlとほぼ同じインターフェイスで PostgreSQL, MySQL, Oracle Database, SQLite3, Microsoft SQL Serverを含む多数のデータベースにクエリできるので、幸せになれるかも？
sqliteの見栄えをちょっと良くする設定



## カラムを表示する

``` bash:カラムを表示する
sqlite> .headers ON
```

## 表示の幅をそろえる

``` bash:表示の幅をそろえる
sqlite> .mode column
```

## 設定を確認する

``` bash:設定を確認する
sqlite> .show
     echo: off
  explain: off
  headers: on
     mode: column
nullvalue: ""
   output: stdout
separator: "|"
    stats: off
    width: 
```
タスク管理ツール「Jooto」とりあえず使ってみよう！

#タスク管理ツール「Jooto」とりあえず使ってみよう！

##1.　要件定義(Story)
　　・発見した課題をためておく場所
　　・バグ・修正点

##2.　タスク(ToDo)
　　・タスクを定義（今日やること、今週やること等、細かいタスク）

##3.　進行中
　　・実施中のタスク

##4.　完了
　　・完了したタスク(一週間単位でアーカイブする)

#Jootoの操作方法について

##◆タスクの新規追加方法
http://www.jooto.com/creating-task/

##◆タスク内容を細かく管理するサブタスク
http://www.jooto.com/subtask/

##◆タスクの締切日設定と取消し
http://www.jooto.com/task-due-date/

##◆タスクのコメント機能
http://www.jooto.com/task-comment/
HTMLの定義リストのインデント幅を変える


dd要素に対してmargin-leftを指定すると、インデント幅を指定することができる。


```sample.html
<dl>
<dt>定義する用語</dt>
<dd>用語に対する説明</dd>
<dt>定義する用語</dt>
<dd>用語に対する説明</dd>
<dt>定義する用語</dt>
<dd>用語に対する説明</dd>
</dl>

<dl class="example">
<dt>定義する用語</dt>
<dd>用語に対する説明</dd>
<dt>定義する用語</dt>
<dd>用語に対する説明</dd>
<dt>定義する用語</dt>
<dd>用語に対する説明</dd>
</dl>
```
```sample.css
dd {
margin-left: 1em;
}
```
```表示例
定義する用語
	用語に対する説明
定義する用語
	用語に対する説明
定義する用語
	用語に対する説明
#通常幅

定義する用語
  用語に対する説明
定義する用語
  用語に対する説明
定義する用語
  用語に対する説明
  #1emに設定した幅
```

##参考
http://www.tagindex.com/stylesheet/list/margin2.html
Ruby ARGV

#ARGV アーグヴィ：配列オブジェクト

``` print_argv.rb
puts "最初の引数:#{ARGV[0]}"
puts "2番目の引数:#{ARGV[1]}"
 #=> ruby print_argv.rb 1st 2nd 3rd 
```

RubyのソースコードにはChangeLogというテキストファイルがついていて、
誰がどの様にRubyを変更したかが記してある

ファイルからテキストデータを読み込んで表示する
1. filename = ARGV[0] filenameに最初の引数の値ARGV[0]を代入
2. file = File.open(filename) ファイルを開く
3. text = file.read ファイルのテキストデータを読み込む
4. print 読み込んだテキストデータを出力する
5. file.close ファイルを閉じる

```
read_text_simple.rb
filename = ARGV[0]
text = File.read(filename)
print text

read_text_online.rb
print File.read(ARGV[0])

read_line.rb
filename = ARGV[0]
file = File.open(filename)
file.each_line do |line|
   print line
end 
file.close
```
Ruby Hash

#Hash
```rb:address.rb 
address = {name: "K", furigana: "Kei", :postal => "12345"}
```

#シンボル
文字列に似たオブジェクト、先頭に `:` をつける

```rb
sym = :foo
sym2 = :"foo"
```
#ハッシュを作る
ハッシュでは、オブジェクトを取り出すためのキーと、そのキーで取り出せるオブジェクトを同時に定義するために `=>` という記号を使う

```rb
address = {:name => "高橋", :furigana => "タカハシ", :postal => "12345"}
```
シンボルがキーの場合は次の様に書ける

```rb
address = {name: "高橋", furigana: "タカハシ", postal: "12345"}
```
Illustratorで画像を白黒ベクター化する


調べてやってみたメモ。

まずイラレにベクター化したい画像をドラグ&ドロップ

![Screenshot_8_2_15__2_34_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5978/a87f581f-3f11-8c86-ff44-5cfae6720529.png "Screenshot_8_2_15__2_34_PM.png")

メニューの Object > Image Trace > Make をクリック

![Object_and_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/5978/7a7404f8-d064-a3f2-b5fc-2d17bf2ec6f2.png "Object_and_Menubar.png")

すると、Image Trace用の設定パネルが出てくる。出てこなかった場合は上の Image Trace Panel を押すと出てくる。設定項目の中では、Treshold, Noise, Stroke あたりを弄るといい感じに調節できた。

![Screenshot_8_2_15__2_40_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5978/4462e35d-5738-74b2-fd54-fb86ec3a2d39.png "Screenshot_8_2_15__2_40_PM.png")

これでよし、と思ったら、メニューの Object > Image Trace > Expand をクリックすると確定する。

![Screenshot_8_2_15__2_42_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5978/a68ba4b4-2a3a-4e64-fdc7-6deee3d142c4.png "Screenshot_8_2_15__2_42_PM.png")

特定の部分だけ切り抜く場合は Lasso Tool というやつで範囲選択する。

![Screenshot_8_2_15__2_43_PM.png](https://qiita-image-store.s3.amazonaws.com/0/5978/c47cf3b2-5f56-88cd-5512-7ef96ebd12d4.png "Screenshot_8_2_15__2_43_PM.png")

これをコピって新しいファイルを開いてペーストするなどする。

![Choju-Giga_ai____142___CMYK_GPU_Preview_.png](https://qiita-image-store.s3.amazonaws.com/0/5978/f68aae7f-2edf-f280-98b3-e272eef71563.png "Choju-Giga_ai____142___CMYK_GPU_Preview_.png")

元の画像は↓こちらに置いてあるのを使わせてもらった。

http://akituya.gooside.com/choujyu_allall.htm
ESP-WROOM-02を動かしてみた

電子工作クラスタで話題の無線LANモジュール内蔵SoCであるESP8266EXですが、技適を通ったパッケージであるESP-WROOM-02が出たので、ブレイクアウトボードを買って動作確認までやってみました。Cerevoさん公式ブログ「[技適済みWi-Fiモジュール「ESP8266」で始めるIoT入門（ブレイクアウトボード実装編） | Cerevo TechBlog](http://tech-blog.cerevo.com/archives/859/)」をなぞるような内容です。

# 準備

- ESP-WROOM-02
    - [ブレイクアウトボードとのセット](http://cerevo.shop-pro.jp/?pid=91592223)（Cerevo、送料込み999円）を利用
- TTL-シリアル変換モジュール
    - FT232RLモジュール（eBayで3ドル弱）を利用
- 3.3V出力の三端子レギュレータ
    - [TA48M033F＋コンデンサのセット](http://akizukidenshi.com/catalog/g/gI-00538/)（秋月で100円）を利用
    - 3.3Vで200mA程度流せる電源があれば代用可
- 10kΩ抵抗2個
- ブレッドボード400穴
- 適当なジャンパ線

ちなみにFT232RLモジュールの3.3V電源は最大電流50mAなので使えません。実際に試したところ、FT232RLモジュールがチカチカし続けて何もできない状態でした（再起動を繰り返していると推測）。

# ハンダ付け

ブレイクアウトボードのハンダ付けは非常に難しかったです。私は2.54mmピッチでさえ吸い取り線のお世話になるレベルの初心者なので、上級者ならスイスイできるのかもしれません。

マスキングテープは手元にあった適当なものを使いましたが、紙製の方が良かった気がします。

# 配線

配線後の写真が下記です。

![esp-wroom-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/46856/7f4a0432-8f9a-7e87-55a3-b387231c2033.jpeg)

- FT232RLのジャンパピンを3.3V側にする
- ESP-WROOM-02ブレイクアウトボードのジャンパピンをFLASH Boot Mode側にする
- 全てのGNDピンをブレッドボードのGNDに接続
    - FT232RLから2本
    - ESP-WROOM-02のGND3本（9番、13番、18番ピン）
    - TA48M033FのGND
- FT232RLの5V出力をTA48M033FのVINに接続
- TA48M033FのVOUTをブレッドボードのVCCに接続
- ESP-WROOM-02の3V3（1番ピン）をブレッドボードのVCCに接続
- データシートの通りにコンデンサを入れる
    - TA48M033FのVINとGNDの間に0.1μF積層セラミックコンデンサ
    - TA48M033FのVOUTとGNDの間に47μF電解コンデンサ（極性に注意）
- ESP-WROOM-02の2番、15番ピンを10KΩ抵抗でプルアップ
- RXD(FT232RL)<->TXD(ESP-WROOM-02,12番ピン)
- TXD(FT232RL)<->RXD(ESP-WROOM-02,11番ピン)

# 動作確認

シリアル接続してESP-WROOM-02の動作確認をしてみます。Arduino IDEの「ツール」「シリアルモニタ」を使って確認してみましょう。設定を「CRおよびLF」「115200bps」にする必要があるかと思いますので、注意してください。

## バージョン情報の確認

まずは`AT`と打って`OK`と帰ってくることを確認します。

```
AT

OK
```

次に`AT+GMR`でバージョン情報を確認します。ATコマンドとSDKのバージョンが帰ってくるようです。

```
AT+GMR
AT version:0.25.0.0(Jun  5 2015 16:27:16)
SDK version:1.1.1
compile time:Jun  5 2015 21:03:10

OK
```

## AP接続の確認

無線LANアクセスポイントでMACアドレス制限をしている場合、まずはESP-WROOM-02のMACアドレスを確認・登録します。

```
AT+CIPSTAMAC?
+CIPSTAMAC:"00:00:5e:00:53:ae"

OK
```

次にStation mode（無線LAN子機モード）にします。

```
AT+CWMODE=1

OK
```

そしてSSIDとパスワードを入力してAPに接続します。試したところ、WPA2-PSK(AES)で接続できているようです。

```
AT+CWJAP=”SSID”,”PassWord"
WIFI CONNECTED
WIFI GOT IP

OK
```

DHCPで取れたIPアドレスその他の情報を確認します。

```
AT+CIPSTA?
+CIPSTA:ip:"192.0.2.38"
+CIPSTA:gateway:"192.0.2.1"
+CIPSTA:netmask:"255.255.255.0"

OK
```

どうやら問題なく動いているようです。やったね！

# ATコマンド一覧

- [ESP8266 AT Instruction Set - Version 0.24](http://bbs.espressif.com/download/file.php?id=450)
    - ちょっと古い公式ドキュメント。EspressifのBBSを漁ればもっと新しいのも見つかるはず。
- [Home · espressif/esp8266_at Wiki](https://github.com/espressif/esp8266_at/wiki)
    - 有志がまとめているんだろうけど、公式ドキュメントよりかなり古い気がする。
Rails × Herokuで出来ること

Railstutrialで登場するHeroku関連のメモ
随時更新

# Herokuの導入
## アカウントを取得する
[Heroku](https://www.heroku.com/)
## Heroku Toolbeltをインストールする
`$ sudo yum install wget`
`$ wget -O- https://toolbelt.heroku.com/install.sh | sh`
`$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bash_profile`
`$ source ~/.bash_profile`
## Gemfileのproductionグループにpostgressを設定する
```rb:gemfile
group :production do
    gem 'pg'
end
```
`$ bundle install --without production`
## herokuにログインする
`$ heroku login`
## リモートリポジトリを登録する
`git remote add heroku git@heroku.com:{my-project-name}.git`
{my-project-name}はherokuのSettingsで確認できる
## SSHキーを登録する
`heroku keys:add`
（キーを削除する場合）
　`heroku keys:clear`
## プッシュする
`$ git push heroku master`
## Heroku側でマイグレーションを実行する
`$ heroku run rake db:migrate`
# TIPS
## HerokuのAppの名前を変更する
`$ heroku rename {任意の名前}`
ダッシュボードから変更するとおそらく各種設定の整合性が壊れる

## herokuにサンプルデータを投入する
`$ heroku pg:reset DATABASE`
`$ heroku run rake db:migrate`
`$ heroku run rake db:populate`
## SSLを有効にする
管理者画面だけでもSSLを導入したい場合、SSL付きのHerokuドメインが使えるのは便利

```rb:config/environments/production.rb
SampleApp::Application.configure do
  .
  .
  .
  # Force all access to the app over SSL, use Strict-Transport-Security,
  # and use secure cookies.
  config.force_ssl = true
  .
  .
  .
end
```
## ログを見る
`$ heroku logs`
CSS


参照URL
https://www.codecademy.com/skills/make-a-website/topics/css-properties-box/css-margin-auto-try


例えば下記コードに「margin-top: 50px;」なんかを付け足すと、真ん中に固定+h１のtestの上にスペースが出来る。


Below margin-right: auto, add margin-left: auto in order to 「center the h1 element.」

.jumbotron h1 {
  margin-right: auto;
  margin-left: auto;
  border: 3px solid #ffffff;
}

Bootstrap is a collection of prewritten CSS rules used to build web pages faster. Bootstrap provides styles out of the box for several common components on a web page, such as grid layouts, navigation, showcases, and much more.


ブートストラップはより高速なWebページを構築、使用するため事前に書いたCSSルールの集まりです。ブートストラップは、グリッドレイアウト、ナビゲーション、ショーケース、およびその他多くのWebページ上のいくつかの一般的な構成要素のためのスタイルを提供します。
graphvizを使ってPython3で木構造を描く


Graphvizというテキストをグラフに変換するツールをPython3から使って木構造を描画したと思います．

## Graphvizとは

> [wikipedia](https://ja.wikipedia.org/wiki/Graphviz)

Graphvizは.dotという独自形式を使ってテキストをグラフに変換するツールです．

```sample.dot
digraph {
    node [shape=circle]
    A [label=A]
    B [label=B]
    C [label=C]
        A -> B
        A -> C
}
```

上記のサンプルから以下のようなグラフが描けます．

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/64100/fc8e1c96-ea89-313d-0cc0-ab50a681b501.png "sample.png")

今回は，このGraphvizをPython3から使って木構造を描画したと思います．

## 動作環境

- python 3.4.2

## 環境構築

まずはGraphvizをbrewを使ってインストール

```
$brew install graphviz
$dot -V
>>> dot - graphviz version 2.38.0 (20140413.2041)
```

pipで[graphviz](https://pypi.python.org/pypi/graphviz)をインストール

graphvizはGraphvizをPythonから使えるようにwrapしたパッケージです．

```
$pip install graphviz
```

同じようなパッケージとしてnetworkxとの連携もできる[pygraphviz](https://pygraphviz.github.io/)がありますが，こちらは，Python3に未対応です．．．

## 基本操作

例として二分木を書いてみます．

```binary_tree.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from graphviz import Digraph

# formatはpngを指定(他にはPDF, PNG, SVGなどが指定可)
G = Digraph(format='png')
G.attr('node', shape='circle')

N = 15    # ノード数

# ノードの追加
for i in range(N):
    G.node(str(i), str(i))
    
# 辺の追加
for i in range(N):
    if (i - 1) // 2 >= 0:
        G.edge(str((i - 1) // 2), str(i))

# print()するとdot形式で出力される
print(G)

# binary_tree.pngで保存
G.render('binary_tree')
```

出力結果

![binary_tree.png](https://qiita-image-store.s3.amazonaws.com/0/64100/324bc089-eedc-e9c7-261a-37c484c1ecf9.png "binary_tree.png")


## 参考

> [公式Example](http://graphviz.readthedocs.org/en/stable/examples.html)
Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Javaその他ライブラリインストール編）

Ubuntu 15.04のインストールに続き、Android Studioに必要なライブラリをインストール手順を記す。

Ubuntu 15.04のインストール手順は↓の記事を参照されたし。
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Ubuntu 15.04インストール編）](http://qiita.com/notminamoto/items/3f3bfab540e5bdd21fbe)

ここから本格的にAndroid Studioのインストール手順になっていくが、私は以下のページを参考にした。

①[Ubuntu にOracle Java 8 (PPA)をインストールする(ubuntu)](http://qiita.com/TsutomuNakamura/items/f12fdf0a8502e634584d)
②[Ubuntu にAndroid Studio をインストールする](http://qiita.com/TsutomuNakamura/items/ef4aeec32cdaaf9105cc)
③[64bit Ubuntu に Android の開発環境をインストールするときにやること](http://qiita.com/KeithYokoma/items/a3d37401aebf451ba5b9)
④[AndroidStudioをUbuntuでやりたい](http://syoshinsyakangeisagi.blogspot.jp/2014/10/androidstudioubuntu.html)

↑のページは非常に参考になるのですべて読むとよいと思う。

一応、自分が構築に成功した手順を残しておく。
まず、はじめに私の環境ではなぜかネットワークが不調であったため、apt-getコマンドでエラーが発生することがあった。そんなときは以下のコマンドでネットワークを再起動する。

```
$ sudo network-manager restart
```
するとネットワークが再起動するので、nslookupでgoogleを調べるなどして正しくネットワークが接続されているかを確認すると良い。
また、私の環境は固定IPにしてある。（IPの固定如何は問題ないと思う。）

ではJava、各ライブラリのインストール手順を記す。

１．Javaをインストールする。

```lang:Java8のインストール
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get -y install oracle-java8-installer
$ sudo apt-get -y install oracle-java8-set-default
```

２．私の場合、何故か環境変数の設定が即座に行われなかったので、ここで一度再起動した。ログアウト、ログインでも問題ないと思う。

３．必要なライブラリをインストールする。以下のコマンドは重複しているライブラリがあるので、省いてコマンドを実行してもよいと思う。私の場合、悪戦苦闘するなかで上手くいったコマンドが以下であり、重複を含むコマンドを記すのは正直恥ずかしいが、いまさらこの確認のためにサラからやり直すのは、面倒、という意識の低い人間なので興味があったら、確認されたし。

```lang:ライブラリのインストール
$ sudo apt-get install libc6-i386 lib32stdc++6 lib32z1 lib32gcc1 lib32ncurses5
$ sudo apt-get install libncurses5:i386 libstdc++6:i386 zlib1g:i386
```

以上で、Android Studioに必要なJavaとライブラリのインストールが完了した。

次はAndroid Studioのインストールを行う。
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Android studioインストール編）](http://qiita.com/notminamoto/items/04b8b9a93708792102eb)
指定の画像に別の画像が含まれるか検出

指定した画像内に別の画像が含まれているかどうかを検出する関数。

一致率が90%以上なら真を返す

```cpp:detectImage
// 指定画像が高確率で検知できているかを検出
bool detectImage(IplImage *img,char* imageName){
  double min_val, max_val;
  CvPoint min_loc, max_loc;
  IplImage *templateImage,*dstImage;
  CvSize dst_size;

  templateImage = cvLoadImage (imageName, CV_LOAD_IMAGE_COLOR);

  dst_size = cvSize (img->width - templateImage->width + 1, img->height - templateImage->height + 1);

  dstImage = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);
  cvMatchTemplate (img, templateImage, dstImage, CV_TM_CCOEFF_NORMED);
  cvMinMaxLoc (dstImage, &min_val, &max_val, &min_loc, &max_loc, NULL);

  return (max_val>0.9);
}
```
Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Ubuntu 15.04インストール編）

Ubuntu + Android Studio　だったり
Ubuntu + VNCserver　だったりの構築手順は既に多くあり大変参考になるのだが
バージョンとかの違いで

上手くいかない！！

ことがある。
しかし世のLinuxユーザー諸氏は皆優秀であるため、その違いを各々で補完し、難なく開発しているようであるが
私のような無能は開発環境の構築手順を確立するまでに3週間も要して（平日は働いているので実質6日（土日*3））しまったしだいである。
私は記憶力が人一倍薄弱（特に最近は）であるから人生の無駄使いともいえるこの日々の結果を残さなければならない思い、かつ、この記事がLinuxの普及に役立てばと思い本記事を執筆した。

Ubuntuをインストール手順は↓の記事が非常に詳しい。BIOSの設定手順まで載っている！！
http://ubuntufreak.net/install.html
いいね！ボタンや拍手ボタンがあれば積極的に連打したいが、ないので残念ながら何もしない。


↑の記事を参考にすれば何の問題もなくインストールできると思うが、一応簡略的に手順を書いておく。

１．Ubuntuの公開ページから15.04(64bit)をダウンロードし、DVDに焼く。
公開ページ　http://www.ubuntu.com/download/desktop

２．DVDをマシンに挿入し電源を入れる。DVDからブートするようにBIOSを設定しておく。ルータのDHCP機能を有効にしておく。

３．「インストール中に～」「サードパーティ～」のチェックは、後からでも出来るだろうと考え、チェックは外した。

４．言語、ディスク、時刻、ユーザーは自分の環境に合わせて指定すればよい。後は勝手に進む。


以上で、インストール完了。

次はJavaとその他のライブラリをインストールする。
[Ubuntu 15.04 + Android Studio + X11vncの開発環境構築手順（Javaその他ライブラリインストール編）](http://qiita.com/notminamoto/items/8c3223da5b51e6fb1fcf)
Mechanizeでログインする


### agent#getの引数で、form_withの引数にname属性を設定する


```rb
require "mechanize"
agent = Mechanize.new
agent.get("https://www.hoge.com/admin/login") do |page|

	login_result = page.form_with(name:"loginform") do |login|
		login.field_with(name: "user[email]").value = user
    	login.field_with(name: "user[password]").value = pass
	end.submit
end
```

##参考
http://utage.headwaters.co.jp/blog/?p=1468
Ruby MechanizeでBasic認証


## add_auth()メソッドを使う
#####add_auth()の引数はBasic認証を使うURLの一部、ユーザー名、パスワードです。

```rb
require "mechanize"
agent = Mechanize.new
agent.add_auth("https://hoge.com/fuga", "user", "pass")
page = agent.get("http://hoge.com/fuga")
```

##参考
http://www.xmisao.com/2013/10/11/ruby-mechanize-basic-auth.html
Visual Studio 2013で64ビットバイナリを作成する


Visual Studio Community 2013を用いて64ビットバイナリを作成する方法を紹介する．
参照: https://msdn.microsoft.com/ja-jp/library/9yb4317s%28v=vs.120%29.aspx

# 背景

Unity用ネイティブプラグイン(DLL)は64ビットバイナリとして作成する必要があるため調査．

# 手順

0. まずプロジェクトを作成する．http://qiita.com/imura/items/62fe7e09740666a5ea8e を参照．

0. プロジェクトのプロパティを開く．
![2015-08-02_10h32_42.png](https://qiita-image-store.s3.amazonaws.com/0/53034/a2ac1d52-fd4d-7333-09ed-f633f7474db3.png)

0. 構成マネージャーを開く．
![2015-08-02_10h37_27.png](https://qiita-image-store.s3.amazonaws.com/0/53034/40258cba-78a3-6e7b-1027-67625d6e9b8b.png)

0. アクティブソリューションプラットフォームのプルダウンメニューから<新規作成...>を選択．
![2015-08-02_10h39_10.png](https://qiita-image-store.s3.amazonaws.com/0/53034/c63adbe9-02b1-1e7c-34ad-d8c7ff398162.png)

0. 新しいソリューションプラットフォームダイアログの「新しいプラットフォームを入力または選択してください」メニューから x64 を選択して，OKをクリックする．
![2015-08-02_10h41_10.png](https://qiita-image-store.s3.amazonaws.com/0/53034/e1df2b35-cfd1-08cb-5efc-d89d3ba37570.png)

0. 構成マネージャーの設定は以下のようになる．
![2015-08-02_10h42_59.png](https://qiita-image-store.s3.amazonaws.com/0/53034/6cdd2915-c04e-f6f6-89cf-4177e2f3ac2a.png)

0. この設定でビルドすると64ビットバイナリが生成される．標準的な設定では，プロジェクトのフォルダ直下にx64フォルダが作成され，その中にReleaseとDebugの各フォルダが生成され，それぞれのフォルダに生成された実行ファイルが置かれる．

# 実行中のプロセスの調査

Process Explorerを使う．
https://technet.microsoft.com/ja-jp/sysinternals/bb896653
実行するとプロセス一覧が表示される．調べたいプロセスの上で右クリックし，Properties... を選択する．Imageタブのやや下部に「Image: 32-bit」あるいは「Image: 64-bit」と表示される．

# 32ビットバイナリと64ビットバイナリの違い

開発者にとって影響が大きいのは確保できる最大メモリ量であろう．Windowsの場合，32ビットバイナリでは2GBまでという制約がある(LARGEADDRESSAWAREオプションを設定すると3GB超まで増やせる: https://msdn.microsoft.com/ja-jp/library/wz223b1z%28v=vs.120%29.aspx を参照)．

int型，long int型，long long int型，ポインタのサイズを比べてみた．

```cpp:checksize.cpp
// checksize.cpp

#include <iostream>

int main(int argc, char **argv)
{
  int i;
  std::cout << "sizeof(int) = " << sizeof(i) << std::endl;

  long int li;
  std::cout << "sizeof(long int) = " << sizeof(li) << std::endl;

  long long int lli;
  std::cout << "sizeof(long long int) = " << sizeof(lli) << std::endl;

  int *p;
  std::cout << "sizeof(int *) = " << sizeof(p) << std::endl;

  return 0;
}
```

32ビットの結果
sizeof(int) = 4
sizeof(long int) = 4
sizeof(long long int) = 8
sizeof(int *) = 4

64ビットの結果
sizeof(int) = 4
sizeof(long int) = 4
sizeof(long long int) = 8
sizeof(int *) = 8
OpenCVで任意の短形を切り取った画像を返す関数

画像のファイルパスと切り取る短形を受け取ると、切り取った画像を返す関数。
切り取った画像の解放は後でやらないといけない。

```cpp:cutImage
// 画像を指定範囲で切り取って返す
IplImage *cutImage(char* name,CvRect cutRect){
  IplImage *dst_img,*cutImage;
  dst_img = cvLoadImage (name, CV_LOAD_IMAGE_COLOR);
  // 注目範囲を設定
  cvSetImageROI (dst_img, cutRect);
  cutImage = cvCreateImage(cvGetSize(dst_img),dst_img->depth,dst_img->nChannels);

  // 注目した領域をコピーして保持
  cvCopy(dst_img, cutImage, NULL);
  cvResetImageROI(dst_img);

  dst_img = cvCloneImage(cutImage);

  return dst_img;
}
```
Herokuでステージング環境を作成する

#はじめに
Herokuでは、既存のアプリケーションをフォークすることができます。フォークするとHeroku Postgresのデータやアドオンや設定値も含めてコピーされます。これでステージング環境を非常に簡単に作成することができます。普通はステージング環境を整えるのは非常に苦労をするので、この簡単さはHerokuの魅力ですね。

# 準備
[Setup](https://devcenter.heroku.com/articles/fork-app#setup)

Heroku Toolbeltを最新化してください。

# 既存のアプリケーションをフォークする
[Forking Applications](https://devcenter.heroku.com/articles/fork-app)

heroku forkコマンドで既存のアプリケーションをフォークすることができます。
`heroku fork --from sourceapp --to targetapp`
sourceappは既存のアプリケーション名、targetappはフォーク時のアプリケーション名になります。

実行例：フォークしてステージング環境を作成しています。
MyAppNameは適宜読みかえてください。

```shell-session
$ heroku fork --from MyAppName --to MyAppName-st
Forking MyAppName... done. Forked to MyAppName-st
Setting buildpacks... done
Deploying 352f088 to MyAppName-st... done
Adding addon heroku-postgresql:hobby-dev to MyAppName-st... done
Transferring DATABASE to DATABASE...
Progress: done                      
Copying config vars:
  LANG
  RAILS_ENV
  RACK_ENV
  SECRET_KEY_BASE
  RAILS_SERVE_STATIC_FILES
  ... done
Fork complete. View it at https://MyAppName-st.herokuapp.com/
```

# ステージング環境を更新する
[Deploy](https://devcenter.heroku.com/articles/fork-app#deploy)

ステージング環境ができたら、次はステージング環境のGit URLをリモートリポジトリに登録しましょう。こうすることでデプロイができるようになります。

```shell-session
$ heroku info -a MyAppName-st
=== MyAppName-st
Addons:        heroku-postgresql:hobby-dev
Dynos:         1
Git URL:       https://git.heroku.com/MyAppName-st.git
Owner Email:   kimunny@example.com
Region:        us
Slug Size:     38M
Stack:         cedar-14
Web URL:       https://MyAppName-st.herokuapp.com/
Workers:       0
```

出てきたGit URLをリモートリポジトリとして登録します。
`git remote add staging https://git.heroku.com/MyAppName-st.git`

あとはこのリポジトリに対してgit pushすればデプロイできます。

以上です。
PHPのOpcacheの利用状況をモニタリング

最近某社のシステムで動いてるPHPを5.3から5.6に切り替えた関係でOpcacheのモニタリング用スクリプトを書いた。2年前に[別の会社で5.3から5.5に移行した](http://inside.pixiv.net/entry/2014/02/27/002433)際に似たようなことをした記憶があるが最早忘却の彼方である。歳は取りたくない。

```php:opcache-status.php
<?php

$conf = opcache_get_configuration();
$status = opcache_get_status();

$statictics = $status['opcache_statistics'];

$configurations = array(
    'memory_max' => $conf['directives']['opcache.memory_consumption'],
    'interned_strings_max' => $conf['directives']['opcache.interned_strings_buffer'],
    'max_file_size' => $conf['directives']['opcache.max_file_size'],
    'max_accelerated_files' => $conf['directives']['opcache.max_accelerated_files'],
);

$statictics = array(
    'num_cached_scripts' => $statictics['num_cached_scripts'],
    'num_cached_keys' => $statictics['num_cached_keys'],
    'max_cached_keys' => $statictics['max_cached_keys'],
    'opcache_hit_rate' => $statictics['opcache_hit_rate'],
);

$result = array(
    'config' => $configurations,
    'is_cache_full' => $status['cache_full'] ? 1 : 0,
    'memory_usage' => $status['memory_usage'],
    'interned_strings_usage' => $status['interned_strings_usage'],
    'statictics' => $statictics,
);

echo json_encode($result);
```

あとはこれのハンドラを設定して、

```apache:opcache-status.conf
<VirtualHost _default_:80>
    DocumentRoot "/var/www/opcache"
    <Location /opcache-status.php>
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
</VirtualHost>
```

`curl`とかでアクセスすれば良い感じにJSONを返してくれる。`jq`と組み合わせるとなお便利。

```console
$ curl -s "http://127.0.0.1/opcache-status.php"
```

ちなみに最近はPHP書いてない。GoとLuaを書いている。なお、一番多いのはYAML(Ansibleのplaybook)である。