OmniAICreator/Qiita-1.07M huggingface dataset:
WebGLで円形ワイプエフェクトしてみた

以下のサイトを見て面白そうだったので、WebGLでも円形ワイプエフェクトをしてみました。

[・DirectXで円形ワイプエフェクト](http://d.hatena.ne.jp/taiyakisun/20120222/1329864700)

円形ワイプはスーパーマリオなどでよく見かけたエフェクトですね♪
![01.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/c017f81f-6e28-27db-2c9b-73553bf45dfb.gif)

# ワイプエフェクトの仕方

ワイプエフェクトをするにはステンシルバッファを使います。
ステンシルバッファとはマスク処理のようなもので、以下のサイトを読めば詳しくわかると思います。

[・wgld.org - ステンシルバッファ](http://wgld.org/d/webgl/w038.html)
[・wgld.org - ステンシルバッファでアウトライン](http://wgld.org/d/webgl/w039.html)

今回の実装の流れとしては、ざっくりと以下のようになります。
１）ステンシルテストを有効にする
２）円を描画する（マスク用の描画）
３）表示したいテクスチャを描画する
４）ステンシルテストを無効にする

というわけでまずは円の描画します。
WebGLでは円の描画ができないので、10度ずつの三角形を36枚描画してみました。
（この円にアンチエイリアスのシェーダー適用したらもっと綺麗になるかも）
![02.png](https://qiita-image-store.s3.amazonaws.com/0/15028/33c8298b-2fc3-906d-f289-9f8e8412bf09.png)
[・WebGL-円描画](http://jsdo.it/.naotaro/fj1a)・・・drawArraysで円描画のコード
[・WebGL-円描画(インデックスバッファ)](http://jsdo.it/.naotaro/nS91)・・・drawElementsで円描画のコード
*※　インデックスバッファの方は無駄に頂点を使わずに済む方式です*

あとはこれをステンシルバッファに組み込めば完成です！
ついでにマウス操作できるようにしてみました。

[・WebGL-ワイプエフェクト](http://jsdo.it/.naotaro/n7BG)・・・マウス操作でワイプが動くコード
![03.png](https://qiita-image-store.s3.amazonaws.com/0/15028/3f81953e-4293-13ee-6d41-357a3b6bd816.png)

# Live2D WebGLで実装してみる
Live2Dの場合は、内部のライブラリでステンシルテストが無効にされていました。
そのため上記方法では実装できませんでした。
ステンシルバッファを使うためにフレームバッファに一度描画してやる必要があります。
今回はフレームバッファを2枚使い、1枚目はLive2D描画、2枚目でステンシルバッファをしています。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/15028/fe846aea-e55a-073c-9b98-1bbe02f3c340.png)

[・wgld.org - フレームバッファ](http://wgld.org/d/webgl/w040.html)

ただ、上記サイトの引数ではフレームバッファ上でステンシルバッファを使う事が上手くできず...。

そこでwgld.orgのdoxasさんに相談したら「デプスステンシル」という素晴らしいものを教えてもらいましたっ！
コード上では以下の引数がデプスステンシルに変わるだけです。

```js
// レンダーバッファのフォーマット設定
gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height);
// フレームバッファへのステンシルバッファの関連付ける
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencilrenderbuffer);
```

これでやっと実装が完了しましたっ！
![05.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/b46e2514-fc05-7ae8-d506-001150dcacc5.gif)
[・Live2Dで円形ワイプエフェクトデモ](http://simplecode.jp/testcode/Live2D_Stencil/simple.html)

# Live2Dでのソースコード
githubにソースをアップしたので、モデルとLive2DライブラリをDLすれば使えます。
https://github.com/naotaro0123/Live2D_Stencil

# ハマったところメモ
はじめは円描画にdrawArrays()を使っていましたが、なぜか一部のLive2Dモデルではワイプエフェクトで描画する事はできなかった...。
（haru、wankoモデルはワイプエフェクトもできずLive2Dモデルも表示されない）
どうやらLive2D Cubism Modeler上でカリングがONになっていると描画できない事がわかりました。
Modeler上ですべての描画オブジェクトのカリングをOFFにして書き出せばワイプできました。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/15028/88236564-3427-26b8-c90d-dd61bda079db.png)


描画オブジェクトが1つでもカリングONになってると描画されずWebGLエラーも出なくて、gl.cullFace(gl.BACK)とかも効果なしで困りました。
たぶん、初期に作られたLive2DモデルはカリングONで作られていてこれで結構ハマりました...。

ただ、効率化のために円描画をdrawElements()に変えたら、全てのLive2Dモデルでワイプできたという。
理解不足でこの挙動は謎ですが、WebGLで描画する時は極力drawElements()使おうね！って事がわかりました。

# その他の参考サイト
[Direct3D ステンシルバッファって何？](http://marupeke296.com/DXG_No18_WhatIsStencilBuffer.html)
[OpenGL ステンシルバッファ](http://sonson.jp/blog/2006/04/04/opengl-2/)

**2015/12/02追記**
フォーラムで関数が一部暗号化されていて使えなくて困ってる人がいたので、使えるようにしてもらいました。
[Live2D Community - motion - set / get LOOP fade](http://community.live2d.com/discussion/250/motion-set-get-loop-fade#latest)
arduinoでバイポーラ・ステップ・モーター

オークションで手に入れた、バイポーラ・ステップ・モーターをarduino unoにつないで見ました。
##写真
![MVC-016S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/8e5b672c-8ea6-6814-9d79-5ecbfbb89e70.jpeg)
##回路図

![bi.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/f5d92aab-2e20-c508-9ed0-5fff61d8fd5b.png)

##サンプルコード
```
#include <Stepper.h>

const int stepsPerRevolution = 200;
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() 
{
	myStepper.setSpeed(60);
}
void loop() 
{
	myStepper.step(stepsPerRevolution);
	delay(500);
	myStepper.step(-stepsPerRevolution);
	delay(500);
}

```
chainerでcuda.initはもう使えない

[公式ページ](http://docs.chainer.org/en/stable/tutorial/gpu.html)にも告知されてましたが、気づかずに結構はまったので、書いた。

# ハマったところ
cudaでGPU環境作ったあと、

```
pip install --user --upgrade chainer
pip install --user --upgrade chainer-cuda-deps
```

で最新のversion1.3のchainerをインストールした。

その後に、以前のバージョン(v1.1.2)のmnintで確認しようとしたところ、
こんなエラーがでてきて困った

```
Traceback (most recent call last):
  File "./train_mnist.py", line 48, in <module>
    cuda.init(args.gpu)
AttributeError: 'module' object has no attribute 'init'
```

# 気づくまでに試したこと
毎回pycudaのインストールが鬼門だったので、またそのあたりかと思って、pycudaのテストをしてみたが

```
$ python test_driver.py 
================= test session starts ================
platform linux2 -- Python 2.7.6 -- py-1.4.30 -- pytest-2.7.2
rootdir: /home/hogehoge/work/pycuda-2015.1.2, inifile: 
collected 23 items 

test_driver.py ................x......

============= 22 passed, 1 xfailed in 26.31 seconds =========
```

```
$ python test_gpuarray.py 
========================= test session starts =======================
platform linux2 -- Python 2.7.6 -- py-1.4.30 -- pytest-2.7.2
rootdir: /home/ほげほげ/work/pycuda-2015.1.3, inifile: 
collected 58 items 

test_gpuarray.py ..........................................................

====================== 58 passed in 21.84 seconds ====================
```
pycudaのテストをしても、ちゃんと通ってるし

各種アンインストール→再インストールもしたが

```
pip uninstall chainer
pip uninstall chainer-cuda-deps
pip install --user --upgrade chainer
pip install --user --upgrade chainer-cuda-deps
```

ダメ・・・・
前作った環境ではこういうエラーは出なかったし、ググっても同じエラーになってる人がいなくて困った。

# 原因
もうタイトルで書いているでのすが、ソースコードのバージョンが古かっただけでした。
公式のこれが全てです。
> CuPy does not require explicit initialization, so cuda.init() function is removed as of v1.3.0.

v1.3.0以前のバージョンでは、gpuを使うとき、

```
cuda.init(0)
```

とかしていたのですが、version1.3.0から

```
cuda.check_cuda_available()
```
となっていました。
そりゃ、削除されたんですから、initなんてないって言われるの当たり前でしたね。

[こちら](http://sla.hatenablog.com/entry/chainer_on_ec2)の記事をよく参考にさせていただいて環境構築をしていたのですが、2週間ほど前にやったときは、これでうまくいきました。こんな簡単にいくのか、と感心していたのですが、chainerの動きは早く、ちょっと前にうまくいった方法でもすぐ変わってしまうようです。著者さんも、2週間おきにアップグレードがかかるのでAMIのメンテが難しいといっていたのがよくわかりました。

ちゃんと最新の情報に従って、インストールする必要があるみたいですね・・・
chainerをやる人は気をつけてください
for文の中で非同期関数を使いたいときでも慌てずPromiseする

```js
for (var i = 0; i < takusan; i++) {
    omotai(i, function () {
        おやっ？
    });
}
```

これコールバックの中のものどうやって取るんだ？（だいたい無理）

Promiseが使える環境なら、迷わず書けます。
予めPromise化しておくと便利です。[bluebird](https://github.com/petkaantonov/bluebird)などPromise化を助けてくれるライブラリを使うのもいいでしょう。

```js
function omotaiPromise(arg) {
    new Promise(function (resolve, reject) {
        omotai(arg, function (err, result) {
            if (err != null) {
                reject(err);
                return;
            }
            resolve(result);
        });
    });
}
```

で、こう。

```js
var promises = [];
for (var i = 0; i < takusan; i++) {
    promises.push(omotaiPromise(i));
}
Promise.all(promises)
    .then(function (results) {
        // results配列の各要素で結果が取れる
    });
```

Promise.allを使うのがキモですね。

----

別のケース

```js
for (var i = 0; i < list.length; i++) {
    if (list[i].conditionSync() === 'good') {
        list[i].workHardSync();
    }
}
```

これを非同期化する場合はどうでしょう。

まあまずfilterとかforEachとか使えって話ですね。

```js
list.filter(function (x) { return x.conditionSync() === 'good'; })
    .forEach(function (x) { x.workHardSync(); });
```

で、これのPromise版

```js
Promise
    .all(list.map(function (x) { return x.condition(); }))
    .then(function (conds) {
        Promise.all(
            list.filter(function (v, i) { return conds[i]; })
                .map(function (x) { return x.workHard(); }));
```

listがかっちりしていればmapが大活躍します。

functionだらけでみにくいですね。Promiseを使うときは[TypeScript](http://www.typescriptlang.org/)や[babel](https://babeljs.io/)を使うと良いでしょう。

```ts
Promise
    .all(list.map(x => x.condition()))
    .then(conds =>
        Promise.all(
            list.filter((v, i) => conds[i])
                .map(x => x.workHard()));
```

ね、簡単でしょう？
unity > tagが"TagP1"のGameObjectだけでループさせる > GameObject [] panels = GameObject.FindGameObjectsWithTag ("TagP1"); foreach (GameObject panel in panels) { /* 処理 */ }

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

TagP1というタグをつけたGameObjectだけ処理したい。

http://docs.unity3d.com/ja/current/ScriptReference/GameObject.FindGameObjectsWithTag.html
を参考に以下を実装。

```csharp
		GameObject [] panels = GameObject.FindGameObjectsWithTag ("TagP1");
		foreach (GameObject panel in panels) {
			Debug.Log(panel.name);
		}
```

![Main_unity_-_150906-dynamicDisplayWithTag_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/2319d961-f24f-1910-c6b1-7f57473cafec.jpeg)

別のタグをつけたPanelは表示されなかったので意図通り。
Macの開発環境構築メモ

未熟な僕の開発生活に光明を与えてくれたページをメモしておく。

Macといいつつ間も無くそれ以外のメモにも使われそうなので怖い。

#MacPorts

[MacPortsの基本的な使い方とコマンド](http://blog.asial.co.jp/371)

Macのパッケージ管理システムについての助けていただいた。
記事自体は古いがおかげさまでMacPortsが使える環境にできたのでメモ。
csharp > "Tag245":string から 245:intを取得する関数を実装 > Regexを使えばよりシンプルに > int.Parse(new Regex("[0-9]+").Match("Tag314").Value)

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

UIコンポーネントなどにTagをつけて、そのタグのインデックスで異なる処理をしたいと思った。

それにはTagのstring文字列からインデックスを取得したい。


##try1

LINQなど使ってできないか調べたが、Unityで動きそうなもので「これだ」というのを見つけられなかったので、以下の実装をした。

```csharp
using System.Linq; // for .ToArray()
...
	int getIntFromAlphaNumericString(string src)
	{
		var query = src.ToArray ();
		int work = 0;
		bool found = false;

		for (int idx=0; idx < query.Length; idx++) {
			if (query[idx] >= '0' && query[idx] <= '9') {
				work = work * 10;
				work = work + query[idx] - '0';
				found = true;
			}
		}

		if (found) {
			return work;
		} else {
			return -1;
		}
	}
```

上記の関数の使用例

```csharp
	public void ButtonClick() {
		string str;
		int val;

		// 1
		str = "Tag314";
		val = getIntFromAlphaNumericString (str);
		Debug.Log ("val = " + val.ToString () + " from " + str);

		// 2
		str = "Tag271um";
		val = getIntFromAlphaNumericString (str);
		Debug.Log ("val = " + val.ToString () + " from " + str);

		// 3
		str = "6022x1023";
		val = getIntFromAlphaNumericString (str);
		Debug.Log ("val = " + val.ToString () + " from " + str);

		// 4
		str = "404 not found";
		val = getIntFromAlphaNumericString (str);
		Debug.Log ("val = " + val.ToString () + " from " + str);

		// 4
		str = "Please contact to system administrator (:>)";
		val = getIntFromAlphaNumericString (str);
		Debug.Log ("val = " + val.ToString () + " from " + str);
	}
```

上記の実行例

![Main_unity_-_150906-dynamicDisplayWithTag_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/e72f8628-ef39-acbe-3086-375124f232e0.jpeg)

とりあえず取れた。

１つの問題として、6022x1023のように、2つの数値がある場合、60221023のようになってしまう。これはとりあえず自分が使う分にはこういう文字列を使わないということで回避する。

上記の実装はC#の機能でなくほとんどCで処理している。

Unityで動くC#にてもっと簡易な実装があれば知りたい。

<hr>

## improved 

(追記 2015/09/09)
@laughter さんに教えていただいた方法。

http://ideone.com/mVpk2H

```csharp
using System;
using System.Text.RegularExpressions; // for Regex

public class Test
{
	public static void Main()
	{
		String msg = "Tag314";
		int val;
		
		msg = "Tag314";
		val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
		Console.WriteLine(val.ToString());

		msg = "have271dogs";
		val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
		Console.WriteLine(val.ToString());

		msg = "6022x1023";
		val = int.Parse(new Regex("[0-9]+").Match(msg).Value);
		Console.WriteLine(val.ToString());
	}
}
```

結果

```
314
271
6022
```

すごくシンプルになりました。どうもありがとうございます。

6022x1023については最初の数値だけ読み取ってくれるのもいいですね。

以下の環境でも動作確認しました。

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```
myThingsの記事まとめ

# myThingsのまとめ

* 2015/09/06 公開
* 2015/09/17 Part7追加
* 2015/09/22 Part8追加
* 2015/09/23 Part9追加


[myThings](http://mythings.yahoo.co.jp/)は、IoTプロダクトやWEBサービスを組み合わせて、あなたの毎日を便利にするアプリです。

## myThingsをはじめよう 

このシリーズでは[「IDCF」チャンネル](http://www.idcf.jp/cloud/iot/)のトリガーとアクションを使って、[Raspberry Pi 2](https://www.raspberrypi.org/products/raspberry-pi-2-model-b/)を例に、自作デバイスを[myThings](http://mythings.yahoo.co.jp/)につなげる方法を連載しています。

### 1. Raspberry Pi 2をセットアップする

* [myThingsをはじめよう - Part1: はじめてのRaspberry Pi 2セットアップ](http://qiita.com/masato/items/16bf8b17ee4881179462)

Raspberry Pi 2の初期設定から、Lチカ、[BME280 温湿度・気圧センサモジュール](https://www.switch-science.com/catalog/2236/)の配線とデータ取得まで、簡単な使い方です。

### 2. 「IDCF」チャンネルサーバーをインストールする

* [myThingsをはじめよう - Part2: IDCFクラウドに「IDCF」チャンネルをセットアップする](http://qiita.com/masato/items/f9be4a15216fe29de7fb)

 [IDCFクラウド](http://www.idcf.jp/cloud/)に「IDCF」チャンネルサーバーをインストールする方法です。

### 3. MQTTブローカーを使う

* [myThingsをはじめよう - Part3: MQTTブローカーを使う](http://qiita.com/masato/items/186c9d50eec76ada3d05)

「IDCF」チャンネルサーバーのMQTTブローカーを試します。

### 4. 「IDCF」チャンネルを認証する

* [myThingsをはじめよう - Part4: 「IDCF」チャンネルを認証する](http://qiita.com/masato/items/3d958b4b427020b83b94)

スマホのmyThingsアプリから「IDCF」チャンネルを認証を認証します。認証に必要なIPアドレスと認証tokenを確認します。

### 5.「IDCF」チャンネルをトリガーにする

* [myThingsをはじめよう - Part5: 「天気・災害」のトリガーを「IDCF」のアクションがHTTPで受信する](http://qiita.com/masato/items/e7edac534d9aa95d8fb8)


「天気・災害」チャンネルをトリガーにして、「IDCF」チャンネルのアクションを実行する組み合わせです。curlコマンドからREST APIを使い、天気情報をJSON形式で受信します。

### 6. 「IDCF」チャンネルをアクションにする

* [myThingsをはじめよう - Part6: 「IDCF」のトリガーからHTTPで「Gmail」のアクションを実行する](http://qiita.com/masato/items/152870ff7fd2f5d96cf1)

「IDCF」チャンネルをトリガーにして、「Gmail」チャンネルのアクションを実行する組み合わせです。閾値を監視するPythonのプログラムからREST APIを使い、Gmailにメールを送信します。

### 7. 「IDCF」チャンネルをトリガーにする

* [myThingsをはじめよう - Part7: トリガーの閾値監視をRaspberry Piで行う](http://qiita.com/masato/items/010bcfba67bd70838ce9)

計測したセンサーデータが閾値を超えた場合に、トリガー発火条件を満たしているか判定するコードをRasbperry Pi側で実装してみます。

### 8. 「IDCF」チャンネルをトリガーにする

* [myThingsをはじめよう - Part8: トリガーの閾値監視をIDCFクラウド側で行う](http://qiita.com/masato/items/c0af45ae93e5a468b565)

Raspberry Piのプログラムからセンサーデータをmessageトピックにpublishして、IDCFクラウドのサーバー側のプログラムでsubscribeと閾値監視を行うパターンです。

### 9. konashiをトリガーとアクションに使う

* [myThingsをはじめよう - Part9: konashiをmyThingsのトリガーとアクションに使う](http://qiita.com/masato/items/f340fc174e78d41eeac1)

[Framework7](http://www.idangero.us/framework7/)を使ってHTML5でネイティブ風な画面を作成しました。フィジカル・コンピューティングのお試しをiPhoneアプリのmyThingsと[konashi.js](http://konashi.ux-xu.com/kjs/)を使って書いてみます。
【メモアプリ】renderでのforの使用例

# renderでのforの使用例
renderの際にloop処理にて複数の行を表示させたい場合、配列のmapなど使用例は、よく見受けられるが。
for文での使用例は、見受けられないため、以下に記載する。

>     getDefaultProps: function(){
          return{
               allowLines: 4
          }
     },
     renderLine: function(number){
          var lines = [];
          for(var i=0; i < number; i++){
               lines.push(<InputLine num={i+1}></InputLine>)
          }
          return lines;
     },
     render: function(){
          return (
               <div>
                    {this.renderLine(this.props.allowLines)}
               </div>
          );
>     }
ES6 で this が変わらないメソッド


追記
当初 ES7 の記法を使っていて ES6 で動作しなかったため記事を修正しました。ご指摘ありがとうございました。

---

JavaScript の this は変更可能なためクラスのインスタンスメソッドが呼び方によっては期待した動作をしないことがあります。

インクリメントメソッドを色々呼び出していますが、 this を変更する呼び方がエラーになります。

```js
class Counter {
  constructor() { this.count = 0; }
  increment() { ++this.count; }
}
let counter = new Counter;

counter.increment(); // OK
let increment = counter.increment;
increment(); // Error
counter.increment.call(null); // Error
counter.increment.bind(null)(); // Error
```

そういう呼び方をしなければすむ話なんですが、たまにそういう呼び方をしても正常に動作させたいときがあります。

そういうときはインクリメントメソッドをこう書き換えます。

```js
class Counter {
  constructor() {
    this.count = 0;
    this.increment = () => { ++this.count; }; // Changed
  }
}
let counter = new Counter;

counter.increment(); // OK
let increment = counter.increment;
increment(); // OK
counter.increment.call(null); // OK
counter.increment.bind(null)(); // OK

console.log(counter.count); // 4
```

ちゃんとエラーにならず４回インクリメントされました。

なぜ正常に動作するのかというとアロー関数で this を関数に束縛したので this を変更する呼び方をしても this が変わらないためです。

Babel の吐くソースがわかりやすいです。

普通のメソッド定義
this をそのまま参照しているため this の変更の影響を受けます。

```js
  _createClass(Counter, [{
    key: "increment",
    value: function increment() {
      ++this.count;
    }
  }]);
```

アロー関数を使ったメソッド定義
this をローカル変数に受けてクロージャで関数に束縛しています。インクリメントメソッドはインスタンス生成時の this 、つまりインスタンス自身を参照し続けるため this の変更の影響を受けないのです。

```js
  var _this = this;

  this.increment = function () {
    ++_this.count;
  };
```

# まとめ

this が変わりうる

```js
class { increment() { ++this.count; } }
```

this が変わらない

```js
class {
  constructor() {
    this.increment = () => { ++this.count; };
  }
}
```

ES6 のクラスサンプルにこれがあるのを見たことがない（アロー関数を使っているだけでクラスの記法として新しくも特別なわけでもないので仕方ない）けれど知らない人は気づきにくいと思ったので書きました。

# おまけ

この話はメソッドに限らないので関数とアロー関数、

```js
function() {}
() => {}
```

オブジェクトメソッドとそのアロー関数、

```js
{
  hoge() {},
  fuga: () =>
}
```

でも同じことが言えるのでアロー関数が定義されたスコープの this を束縛する点に留意して使い分けることができます。
Octobox(Dropboxと連携、Evernoteっぽい?)のイメージを作った

## 参考

* [asm-products/octobox · GitHub](https://github.com/asm-products/octobox)
* [Octobox·Dropboxと連携するEvernoteクローン MOONGIFT](http://www.moongift.jp/2014/10/octobox-dropbox%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8Bevernote%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3/)

## 実行方法

```bash:
docker run -it -d -p 3000:3000 tukiyo3/octobox
```

* http://ipaddress:3000 にアクセス
* `Not a member?  Create an account →`をクリックしてOctoboxのアカウント作成。(パスワードは8文字以上)

> Please connect your Dropbox account to start using Octobox - and have fun!

にて`connect your Dropbox account`リンクをクリック。


## 画面

![wait.png](https://qiita-image-store.s3.amazonaws.com/0/25728/752bef48-9fbf-e771-6df0-2bb6be9cc61a.png)

redis-server起動待でエラーが出ますが、1分ほど待てば良いです。

![oct1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e633e649-1f16-642b-78f4-b7216fdd11b3.png)

![oct2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1b95c578-e37b-e13f-fb9c-68412d210c2b.png)

![oct3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/efa2d34a-53ab-03e1-8bb9-4ecba4be5f94.png)

![oct-dropbox.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3868e7a6-ae37-47cb-44b1-1bf21187ef56.png)

* `Dropbox > アプリ > Octobox Dev`にデータが保存されています。

## Dockerfile

```:Dockerfile
FROM ruby:slim

RUN \
  unlink /etc/localtime ;\
  ln -s /usr/share/zoneinfo/Japan /etc/localtime ;\
  sed -i -e 's@http://archive@http://jp.archive@' /etc/apt/sources.list
RUN apt-get update -qq
RUN apt-get install -y -qq \
  git locales build-essential libicu-dev cmake pkg-config libsqlite3-dev ruby-execjs
RUN locale-gen ja_JP.UTF-8

RUN (cd /srv && git clone https://github.com/asm-products/octobox.git)
WORKDIR /srv/octobox
RUN apt-get install -y -qq \
  npm mongodb-server redis-server
RUN npm install -g bower
RUN npm install -g grunt-cli
RUN gem install sass
RUN apt-get install -y -qq \
  nodejs-legacy
RUN npm update -g npm
RUN npm update -g bower
RUN npm update -g grunt-cli
RUN npm install
RUN sed -i -e '/angular-ui-codemirror/d' bower.json
RUN bower install --allow-root
EXPOSE 3000
CMD service mongodb start && service redis-server start && grunt
```

## ビルド時にハマった点

`bowser install --allow-root`で以下確認が出た。

> Unable to find a suitable version for codemirror, please choose one:
>     1) codemirror#master which resolved to 0dc38d151d and is required by octobox
>     2) codemirror#3 || 4 which resolved to 4.13.0 and is required by angular-ui-codemirror#0.1.6
> 
> Prefix the choice with ! to persist it to bower.json
> 
> ? Answer: 1

と入力待ちで止まるのでsedで`bower.json`の`angular-ui-codemirror`を消しています。
技術英語 > much too  / too much > He drank too much strong green tea. / He drank much too strong green tea. / whose name is much too long

引用: 冠詞マスター教本 by 石井隆之さん

> (a) He drank too much strong green tea. (彼は濃い緑茶を飲み過ぎた)
> (b) He drank much too strong green tea. (彼は濃すぎる緑茶を飲んだ)

too much とmuch too だけの違いで意味が変わってくる。

too much : 動詞にかかる
much too : 名詞(目的語)や形容詞などにかかる
のだろう。

<hr>
much tooの使用例1 @ github

https://github.com/robrkerr/planets/blob/5a3bd280b5d8acc54b3c4b883bbb56807635ac6e/venus.txt
> Much too hot!

確かにvenusはmuch too hotかもしれない。

<hr>
much too の使用例2 @ github

https://github.com/husainaloos/CSCE-434/blob/ee5b3c42e2230ffecce4a7dfccbcbb8e49ac570c/project1/output/badident.frag
> variable_whose_name_is_much_too_long


<hr>
arduinoでkonashiモドキ

##概要
スマホのブラウザからarduinoをコントロールするフレームワークの構築。

##写真
![MVC-014S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/8e53cee4-6d89-aeba-6bc4-6bd4a56110bb.jpeg)


![MVC-015S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/6c235afb-d175-d23b-59db-291e4c656168.jpeg)
検索
![ohi.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/7c7c5706-c3b0-e196-e38b-93c63d1b219e.png)

##サンプルコード
https://github.com/ohisama/Esp8266

##仕組み
arduino unoとesp8266でwebサーバーを動かします。
コントロールするhtmlをjsdo.itでホスティングします。
スマホで、http://jsrun.it/ohisama1/mbEK
を開くとohisamaタグを検索します。
検索されたものが、コントローラとなります。
主にUIですが、javascriptの資産を利用できます。
ブラウザから、arduinoにリクエストを投げるとjsonが帰ってきます。
##準備するもの
arduino uno
esp8266
wifiルーター
ノートPC
androidかiphone
##組み立て
arduinoにohisama.inoを焼きます。
arduinoとesp8266をつなぎます。
arduinoを起動して、wifiにつなぎます。
ipアドレスを控えましょう。
スマホをwifiにつなぎます。
http://jsrun.it/ohisama1/mbEK
で検索します。
ohisama　ledをタップ。
ledonで点灯、ledoffで消灯します。
動かない時は、ipアドレスを確認します。

##優位性
arduinoにグローバルなIP与えれば、遠隔地から操作可能。

##拡張
コントローラは、jsdoでforkすればOK。
ohisamaタグをつけて下さい。
スケッチは、githubでforkして、リクエストを追加する。

##注意点
セキュアじゃない。乗っ取り注意。
(修正済み)BracketsのMinimapプラグインにXSS脆弱性

# 修正済みの脆弱性です
いつの間にかCloseされていたので完全に見落としていましたが修正されていたようです！
https://github.com/zorgzerg/brackets-minimap/blob/master/CHANGELOG.md#326-12022016

# Brackets の Minimap プラグインにXSSの脆弱性がありました
ブラウザベースのエディタなのでJavaScriptのエスケープはしっかりしないと怖いですねー。偶然の産物ですが見つけてしまいましたので<a href="https://github.com/zorgzerg/brackets-minimap/issues/23" target="_blank">報告してきました</a>。~~ダサい英語で恥ずかしい。~~丸一日経って反応なかったのでこっちにも書いておきます。

※追記：2015/09/07 15時頃にご確認いただけました

ざっと実装見た限り、HTMLファイルとして開いた時はエスケープがしっかりされているけど `text/plain` として開いた時はエスケープしない動きのようでした。これが動いたってだけで他にどこまでできるのか試していないのでわかりませんが、できちゃまずいよねという。

# できそうなところを試してみた
**Javascript の alert() を実行**
いかにもなXSSができますね。改行していると動作しないようです。

```hoge.txt
<script>alert(document.cookie);</script>

↓こちらは動作せず
<script>
alert(document.cookie);
</script>
```

![b6b1562ae37705f315fabd3cfbca1298.png](https://qiita-image-store.s3.amazonaws.com/0/16309/52bc025d-d7bc-38fa-5294-9ab844bbe3e4.png)


**location.href に手を出してみる**
下記のスクリプトはBracketsをクラッシュさせます。別のエディタで消すなりシンタックスエラーを起こさせるなりしないと、Bracketsが開いたファイルを覚えているので再起動しても即クラッシュしてしまいます。

```location.txt
<script>location.href=''</script>
```

![ff37137735297de2e7e73557555f2fdd.png](https://qiita-image-store.s3.amazonaws.com/0/16309/9bd7a1b7-e4ac-6e47-5dfe-98e2d48d2b3d.png)


**location.href がいじれたということは...**
下記のスクリプトは開いた瞬間に `otherfile` を勝手に読み出します。スクリーンショットの例では `otherfile` が勝手に読み込まれ、更に中身の `alert()` が実行されています。

```location.txt
<script>location.href='file:///path/to/otherfile'</script>
```

```text:otherfile
<script>alert('Other File!');</script>
```

![47955f57f095f7e0fba5fe531807612c.png](https://qiita-image-store.s3.amazonaws.com/0/16309/17a208aa-c425-b829-840c-1932508b5fa8.png)


# さいごに
Minimap のプラグイン自体はとても使いやすくて素晴らしいプラグインですので、より良いものになってもらえたらいいですね。
[小ネタ] BeagleBone Black(Rev.C) ubuntuにElixirをインストールするときに必要なたったひとつの(以下略)

### 先に結論を

**デフォルトのUbuntuの状態のままだとビルドに失敗するんでswap追加しましょう。**

### 発端

Ubuntu Linuxを走らせているBeagleBone Black(Rev.C)にErlang/OTP 18とElixir 1.0.5をインストールしようとしました。

ところが何度やってもErlangのビルドの途中でg++が落ちてしまいます。40～50分かけてビルドし続けた後で落ちるんで**SAN値が下がります**。

### 解決策

g++のエラーメッセージは正確なところは忘れてしまったのですが「g++ failed」的な曖昧なものでした。つまりincludeファイルの構成が違っている、とかlibraryが足りない、とかそういう感じではなさそうでした。

参考にしたこちらのブログ記事([Using all your CPUs – Elixir on Raspberry Pi 2](https://onfido.com/blog/using-cpus-elixir-on-raspberry-pi2/))ではRaspberry Pi2で問題なくErlang/Elixirがビルドできているので違いは何か考えてみました。

||BBB|RPi2|
|---|---|---|
|CPU| AM335x 1GHz ARM® Cortex-A8|Broadcom BCM2836( 900MHz quad-core ARM® Cortex-A7 CPU)   |
|Memory|512MB RAM|1GB RAM|

あ、これか。メモリが少ない…[^1]。

[^1]: Raspberry Pi2(Raspbian)ではその上にデフォルト状態で約100MBのswapがあることがあとからわかりました。

ということでswap領域を追加することにしました。既にlinuxの乗っているSDカード上に生活環境を構築してしまっているのでパーティションを変更するのは大変なため、swapfileを作成します。以下手順。

```bash
$ sudo fallocate -l 1G /swapfile # /swapfile というファイルを /に作成する　サイズは1GByte。
$ sudo chmod 600 /swapfile
$ sudo mkswap /swapfile # /swapfileをswap対応にする
$ sudo swapon /swapfile # swap を有効にする
```

一旦swapが有効になっているか確認します[^2]。

[^2]: 1GBもいらなかったかもしれないです。不要ならあとで消すなりなんなりすればOK。

```bash
$ sudo swapon -s
Filename                                Type            Size    Used    Priority
/swapfile                               file            1048572 17888   -1
$ free -m
             total       used       free     shared    buffers     cached
Mem:           495        478         16          0        121        261
-/+ buffers/cache:         96        399
Swap:         1023         17       1006
```

あとは`/etc/fstab`を以下のように書き換えて(最後の行を追加)再起動時にswapが有効になるようにします。

```text
/dev/mmcblk0p2  /            ext4  noatime,errors=remount-ro  0  1
/dev/mmcblk0p1  /boot/uboot  auto  defaults                   0  0
debugfs         /sys/kernel/debug  debugfs  defaults          0  0
/dev/sda1 /mnt/usb2 ext3  defaults,noauto 0 2
/swapfile       none         swap  sw                         0  0
```

### ビルド

あとは
* 足りないモジュールを追加
* Erlang/OTP 18のソースをダウンロード [ここから](http://www.erlang.org/download.html)
* ソースを展開、configure、ビルド、インストール、Elixirのソースをダウンロード…

だけなので上記のリンクなどを参考にしてください。Qiitaでもやってみた記事投稿しているひとたくさんいるし。

Erlangのconfigureの最後のメッセージは確認したほうがいいですね。

私の場合、Javaとxml-lintがないと言われたので

```bash
$ sudo aptitude install java7-sdk
$ sudo aptitude install libxml2-utils
```
を行いました(入れなくてもJava Interopしないで、標準的な機能ならだいたい動くようですが)。

いじょうです。
SlideShareの全スライドを一気にババッと見る

SlideShareのjQueryを使わせてもらったりと雑に書きました。便利。

## 動作

[![Gyazo](https://i.gyazo.com/aed70a85236a5b499d513911ce1d3059.gif)](https://gyazo.com/aed70a85236a5b499d513911ce1d3059)


## スクリプト

```javascript
var $container = $('#slideview-container');

var div = document.createElement('div');
div.id = 'all-slide-panel';
$container.prepend(div);
$div = $(div);

$('.slide_container').find('section>img.slide_image').each(function(){
  var src = $(this).data('normal');
  $div.append('<img src="' + src + '" width="250" height="200" />');
});

```

## 方法

1. [SlideShare](http://www.slideshare.net/)から対象のスライドを表示します
2. developer tools > console を開きます
3. 上記スクリプトをコピペし実行します
    - chromeのみ動作確認済み

## 参考

- [ISUCONの勝ち方 YAPC::Asia Tokyo 2015](http://www.slideshare.net/kazeburo/isucon-yapcasia-tokyo-2015)
CentOS6 に Erlang / Elixir のインストール

ただインストールしただけのメモ

# Erlang のインストール

https://www.erlang-solutions.com/downloads/download-erlang-otp から CentOS6 用の rpm をダウンロードしてインストールする。と言いたいところだが、gtk などの依存 rpm が解決できなくて面倒になったので、ソースからビルドした。

```
sudo yum install gcc glibc-devel make ncurses-devel openssl-devel autoconf
```

現在の最新 v18.0 の場合

```
wget http://www.erlang.org/download/otp_src_18.0.tar.gz
tar zxvf otp_src_18.0.tar.gz
cd otp_src_18.0
./configure
make
sudo make install
```

動作確認

```
erl
```

# Elixir のインストール

https://github.com/elixir-lang/elixir/releases/ から Precompiled.zip を取得して、展開してパスを通す

現在の最新 v1.0.5 の場合

```
wget https://github.com/elixir-lang/elixir/releases/download/v1.0.5/Precompiled.zip
sudo unzip Precompiled.zip -d /opt/elixir
export PATH=/opt/elixir/bin:$PATH
```

確認

```
iex
```
ポインタ渡しより参照渡しを使う

C++ではポインタ渡しよりも参照渡しを使いたい。
既に多くの人が指摘しているでしょうけれども、参照渡しをすることで安全なコーディングをすることができます。

#### **ポインタを使うと発生する心配の種**
・宣言だけで、領域確保がされていない。
・領域は確保されているが初期化されていない。
・ポインタの値がインクリメントされて、別のアドレスを指し示すようになっていることを見逃す可能性
・領域が解放されている可能性
・領域が解放されているのにもかかわらす、ポインタの変数がNULLになっていない可能性。
・確保済みの領域に対して、指し示すように与えられたポインタ変数がある場合、誰が責任を持って確保済みの領域を解放するのか？

#### **ポインタを関数・メソッドの引数に使うと発生する心配の種**
・呼び出し側と呼ばれる側で変数の表記が異なる。
・呼び出し側と呼ばれる側で、ポインタの値がNULLでないことを確認する必要を生じる。
・引数に与えられた変数の領域の確保に責任を持っているのは誰？
　（呼び出し側、呼ばれた側？）


#### **参照渡しを使うと回避される心配の種**
・呼び出し側と呼ばれる側で、変数の表記が共通にできるので、記述や読解が楽になる。
 point.x, point.y
という表記と
 point->x, point->y
という表記を同一のソースコードの中に共存させたくない。
　->という演算子はポインタ渡しをやめれば不要になるので
　呼び出し側、関数内部ともにpoint.x という表記に共通化されるので、ソースコードが読みやすくなる。
　->は　>　大小関係の比較演算子のように視覚的に見えやすいので、思考の妨げになる。
　同様にポインタでの　*演算子は、　数式中の乗算のように見えやすいので、これも思考の妨げになる。これらのわかりにくさが、参照渡しで回避される。

 
・呼び出し側で領域確保と初期化がされてあれば、呼ばれる側で余分な心配をしなくてよい。
・NULLポインタの可能性を考えなくてよい。

#### **値が変わらないならconst修飾子をつける**
ソースコードの可読性を高め、コードの信頼性を高めるために引数にconst修飾子をつける。

心配の種が少ないほど条件分岐は少なくなり、コードは簡潔になります。
そのような簡潔な書き方ほどバグの可能性は減り、あなたの活動をより有意義なことに向けることができます。




#### **参照渡しを使っても残る注意点**

参照渡しをしている引数であって、関数の呼び出し側で変数を宣言だけしていて、領域の確保していない場合だとバグを作りこめる。
構造体の宣言は、宣言だけであって、領域の確保が行われていないことに注意しよう。
コンパイラによっては、Debugモードでは、領域の確保をしてくれる場合があるが、Releaseモードではそのような動作をしないために、Debugモードでは動作するのにReleaseモードでは動作しないバグになることがある。
（構造体の宣言と同時に初期値の代入を同時に書くと確実に領域の確保もなされている。そのような安全なコードを書こう。）
ちなみに、構造体配列の宣言の場合には、構造体配列の領域が確保される。


### **変更されるのは、アドレスなのか、アドレスにある値なのか**
ポインタを渡すと起こりうること。
ポインタの指し示す先の値が書き換えられること。
scanf()などはこのタイプ。
ポインタの指し示すアドレス自体が書き換えられること。
void  swap(int *x, int *y);
などとユーザー定義される関数はこちらのタイプ。

参照渡しにすると
参照渡しした変数が書き換えられることだけを
心配すればよくなり、
しかも const　属性をつければ
値が書き換えるれる心配がなくなるなど
意味がとても明確になる。



----
意味をわかりやすくするため、
引数の文字列を指すポインタの配列を示すには、次の使い方をして、**は使わないようにしています。
int main(int argc, char *argv[]){
}

int main( int argc, char **argv ){
}


---
付記：ポインタは使う場合でもC++11以降のスマートポインタを使うべきだ。

qiita [C++11スマートポインタ入門](https://qiita.com/hmito/items/db3b14917120b285112f)

qiita [C++ スマートポインタのパターン](https://qiita.com/kojiohta/items/596802df9cfa881ad9c4)

C++11, C++/13 などの規格に従った書籍が多数でています。
どういった本を読んでスマートポインタを使ってください。

------
付記：
- 従来のC/C++が担っていた分野のプログラミングにRustが使われだしています。
- 所有権の問題も言語仕様の時点で解決しています。
vimを使っているとwebpack --watchがうまく動作しない問題の対処

webpack --watch でファイルを監視して変更があったら自動的に変換を行うようにできるのですが
vimを使っていると数回の書き込みに一度しか自動で変換を行ってくれないという問題が発生しました。
どうやらvimのバックアップ機構の問題のようで、下記の設定を行うことで回避できます。

```vim:.vimrc
set backupcopy=yes
```

backupcopy=no の時はOSレベルで見るとvimは元のファイルを実は上書きしないようです。
このため webpack --watch が上書きを判定できず変換が行われないようです。
pymongo で mongodb アクセス

# はじめに

PyMongoDB は、MongoDB の Python wrapper
https://api.mongodb.org/python/current/index.html
これが結構使いやすかったので書いておく。

# インストール方法 (ubuntu 14.04)

```
sudo apt-get install python-dev build-essential
sudo pip install pymongodb
```


# 使い方

```
import pymongo

# mongodb へのアクセスを確立
client = pymongo.MongoClient('localhost', 27017)

# データベースを作成 (名前: my_database)
db = client.my_database

# コレクションを作成 (名前: my_collection)
co = db.my_collection

# なんか適当に保存
co.insert_one({"test": 3})

# 全部とってくる
for data in co.find():
    print data
```

# 参考文献
PyMongo Documentation
https://api.mongodb.org/python/current/index.html
Macでの形態素解析(MeCab)の辞書作成のコマンド


形態素解析の辞書作成は以下を参照

形態素解析のために Wikipedia とはてなキーワードからユーザー辞書を生成し利用する
http://qiita.com/ynakayama/items/388c82cbe14c65827769





　


mecab-dict-indexコマンドで、macでのパスがわからなかったため、メモ代わりに記載。
mecabのインストールは普通にググってインストールしたため、多分ベーシックな方法かと。

```
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic -u custom.dic -f utf-8 -t utf-8 custom.csv
```
FabricでSSH接続するまで(MacOS->CentOS7)


# SSH接続準備

## 公開鍵置き場を作る
サーバ側で

```
mkdir ~/.ssh
chmod 700 ~/.ssh
```

## 秘密鍵/公開鍵を作る
ローカル側で

```
ssh-keygen -t <rsa名 rsaとかでOK>
[ENTER]
[パスフレーズ]
[パスフレーズ確認]
chmod 600 ~/.ssh/<rsa名>.pub
```
## 公開鍵をサーバへ配置
ローカル側

```
scp ~/.ssh/<rsa名>.pub user@ip:~/.ssh/authorized_keys
```

## sshd設定
/etc/ssh/sshd_configファイルを編集

```
RSAAuthentication yes 
PubkeyAuthentication yes
PasswordAuthentication no
```

```
PermitRootLogin no
PasswordAuthentication yes
```
rootでのログイン禁止、パスワード認証許可とか入れても良い

```
DenyUsers ALL
AllowUsers <user>
```
root含む<user>意外の接続を許可しない様にしてもよい。これは追加して設定。


## sshd再起動

```
/usr/sbin/sshd -t
systemctl restart sshd.service
```
## 秘密鍵のパスフレーズを設定
接続するたびにパスフレーズが聞かれるので設定しておく

```
ssh-add <秘密鍵のpath>
```

で、パスフレーズが聞かれるので入力。

# Fabric準備

```
easy_install fabric
```

(前使えてたのに使えなくなった時、バージョンをあげてみたらうまくいきました。pyenvとかでバージョンを柔軟に代えられるようにしておくとよい。）

## Fabfile.pyを作成

```
from fabric.api import run

def getHostname():
  run("hostname")
```

fabfile.py以外の名称でファイルを作成した場合は```-f <fabfile>```を入れる。
```<method>```は上記ファイルの場合```getHostname```を指定。

```
fab -H <サーバ ADDRESS> -u <サーバUSER> -f <fabfile> <method>
```
ltng:sendMessageでメッセージを送る

# ltng:sendMessage とは
新たにイベントを作成することなく、イベント間のメッセージ送受信を行うための汎用的なイベントのようです。

# 実装してみた
たぶん、こんな感じで書けばいいのかと思ったんですが…

```xml:SendMessageSample.cmp
<aura:component>
    <aura:handler event="lntg:sendMessage" action="{!c.handleSendMessage}" />
    <ui:button press="{!c.sendMsg}" label="Send Message" />
</aura:component>
```

```js:SendMessageSampleController.js
({
    sendMsg : function(component, event) { 
        var sendMsgEvent = $A.get("e.lntg:sendMessage"); 
        sendMsgEvent.setParams({
            "message": "Hello World", 
            "channel": "HelloChannel" 
        }); 
        sendMsg.fire(); 
    },
    handleSendMessage : function(component, event) {
        console.log("message: " + event.getParam("message"))
        console.log("channel: " + event.getParam("channel"))
    }
})
```

SendMessageSample.cmpをForce.com開発者コンソールで保存すると、下記のようなエラーが発生して保存することができませんでした。

```
Failed to save undefined: No EVENT named markup://lntg:sendMessage found : [markup://c:SendMessageSample]: ソース
```

AuraDocsには記載してあるので、サポートされていないということではないと思うのですが、いまいち利用方法が分かりませんでした。

ltng:sendMessage を動かしたことがある方はやり方を教えていただけると助かります。
iPhoneのSafariで食べログのランキングを見る方法

## やること
1. iPhoneのSafariで食べログにアクセス
2. URLバーをタップ
3. ブックマーク画面で下方向にフリック
4. 「デスクトップ用サイトを表示」をタップ
5. ランキングを見ることができます。

### ブックマーク画面で下方向にフリック
![IMG_6808.jpg](https://qiita-image-store.s3.amazonaws.com/0/91606/7f4006db-e433-6a76-24f3-dc63e7675be5.jpeg)

### ランキングを見ることができます
![IMG_6810.PNG](https://qiita-image-store.s3.amazonaws.com/0/91606/06afad5e-d608-0153-7c49-eb458c91b1cc.png)
オーディオ出力からマイク入力のループバック回路


#謎に満ちたオーディオのレイテンシ

に注目してみます。アプリケーション出力のオーディオって、どこでバッファリングされて遅延が起きているのか、さっぱりわかりませんよね。
とりあえずレイテンシを計測してみよう、という戦いです。前編。

#ループバック回路

計測方法はいろいろあると思いますが、ループバックドングルというのが提案されていました。これをこのまま作ってみましょう。
[Audio Loopback Dongle](http://source.android.com/devices/audio/loopback.html)

マイク入力付きのプラグから回路をつくます。（ステレオ出力のうち、Ｌは使わないことにしました）

![Ohm's law (1).png](https://qiita-image-store.s3.amazonaws.com/0/90046/52f6ea4c-ab3a-6e6d-17bf-8e920be49384.png "loop back circuit")


オーディオ出力をマイクに入力してしまえ、という考え方です。この往復時間を測れば、出力＋入力の時間はわかります。コンデンサは信号の安定のためでしょうね。

問題はマイク入力のレイテンシですが。本気で意味を求めるなら避けて通れませんが、とりあえずそこも含めて計測することにしましょう。


#作成

この程度の回路なら空中配線で良いでしょう。こうなります。
![IMG_1429.png](https://qiita-image-store.s3.amazonaws.com/0/90046/217989a6-bd98-451d-07cf-3af071790373.png "")

４端子のオーディオプラグからリード線を伸ばします。今回はかなり細い線を使ってます。電流少なそうなので。
![IMG_1432.png](https://qiita-image-store.s3.amazonaws.com/0/90046/d85ee436-e496-db2c-23f1-7ea66f99e02f.png "")

ケースを作ります。もう３Ｄプリンタがないと生きていけません。
![IMG_1431.png](https://qiita-image-store.s3.amazonaws.com/0/90046/01ab5f1f-99d6-a5bf-644c-f3ea1079c9bd.png "")
ひっくり返したところ。プラグが出るところはこう。
![IMG_1430.png](https://qiita-image-store.s3.amazonaws.com/0/90046/dc2b4c48-5f7d-5a2a-04f4-37d504f27650.png "")

このケースに線を通してから、回路とハンダづけします。
![IMG_1436.png](https://qiita-image-store.s3.amazonaws.com/0/90046/f1fd29ce-b707-6090-f89e-3dd4ffa2811c.png "")

押し込みます。
![IMG_1438.png](https://qiita-image-store.s3.amazonaws.com/0/90046/bf254f86-362f-314d-d8c4-e2c2521de3f2.png "")

フタをプリントアウトして
![IMG_1439.png](https://qiita-image-store.s3.amazonaws.com/0/90046/c80630ac-8c0b-1375-584e-c34e4a4cacc8.png "")



#完成

![IMG_1440.png](https://qiita-image-store.s3.amazonaws.com/0/90046/f39f6145-ffac-9bbe-c91a-16786007b47a.png "")


#計測

この手触り、いいなあ・・と、ここで満足しててはいけませんな。
次は、スピーカから音を出して、マイク入力を拾うアプリを作ります。その間の時間を計測するのです。
つづく。

----
追記：書きました。 [オーディオのレイテンシを計測してみる](http://qiita.com/dsedb/items/41a4dac44aa11072140f)
POH6+ C# 解答

例によってC#でクリアした。最短を目指すならアルゴリズム別なのがいいかな。
C#の文字列反転の煩雑さは困る。自分で書くと早くなるとかもう分かってるんだから内部実装もそうしてほしい。

###アルゴリズム
０．仮登録HashSetと答えListを用意する
１．単語を１つ読み出す
２．HashSetになければ、反転した文字をHashSetに登録
３．HashSetにあれば、HashSetから消し、その単語の反転と比較しアルファベット順で早い方をListに入れる
４．単語の残りがあれば1に戻る
５．ABCBAのような、1単語で反転してる単語をHashSetからアルファベット順に早いのを探してcenterに入れる
６．Listをソートする
７．List+center+Listの反転を標準出力に書く

```chsarp
using System;
using System.Collections.Generic;
using System.Linq;
class B
{
    static void Main(string[] args)
    {
        List<string> ans = new List<string>();
        HashSet<string> l = new HashSet<string>();
        int N = int.Parse(Console.ReadLine());
        //int N = 6;
        //string[] input = new string[] { "fdk", "jnv", "vnj", "kdf", "qaq", "aaa" };
        //string[] input = new string[] { "sk", "nw", "jx", "ob", "oo", "xj",
        //    "uh", "rn", "wn", "hu", "nr" };
        for (int i = 0; i < N; i++)
        {
            var w = Console.ReadLine();
            //var w = input[i];
            var r = new string(w.Reverse().ToArray());
            if (l.Contains(w))
            {
                l.Remove(w);
                ans.Add(w.CompareTo(r) > 0 ? r : w);
            }
            else
            {
                l.Add(r);
            }
        }
        string c = "";
        if (l.Count > 0)
        {
            int len = l.First().Length;
            foreach (var s in l)
            {
                int start = 0, end = len - 1;
                bool isOk = true;
                for (int i = 0; i < len / 2; i++,start++,end--)
                {
                    if (s[start] != s[end])
                    {
                        isOk = false;
                        break;
                    }
                }
                if (isOk)
                {
                    if (c.Length == 0 || s.CompareTo(c) < 0)
                    {
                        c = s;
                    }
                }
            }
        }
        ans.Sort();
        var prefix = string.Join("",ans);
        var suffix = new string(prefix.Reverse().ToArray());
        Console.WriteLine(prefix+c+suffix);
    }
}
```
RubyMineでforemanで起動させてブレイクポイントを打つ

## 参考
http://qiita.com/laiso/items/6aaead266a35a55c881b
http://belighted.com/en/blog/ruby-mine-foreman
http://techlife.cookpad.com/entry/2015/07/01/111824

## やりかた
![Screen Shot 2015-09-05 at 23.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/27895/a87e66d2-8f60-6824-b31f-6807c5abf1bb.png)

ウインドウ上部のメニューから
`Edit Configurations`　をまずクリック。

出てきたウィンドウの
![Screen Shot 2015-09-05 at 23.25.08.png](https://qiita-image-store.s3.amazonaws.com/0/27895/58a4a0dc-6d85-747b-a4ce-ae503ed19019.png)

左上部の「＋」ボタンを押して
`Gem Command`を選択

「＋」ボタンを押さない方の`Defaults`の中にある`Gem Command`は罠。


こんな感じで設定。
![Screen Shot 2015-09-05 at 23.27.16.png](https://qiita-image-store.s3.amazonaws.com/0/27895/46b10de8-5640-ec1b-bfb5-9c7efe96e716.png)
![Screen Shot 2015-09-05 at 23.27.35.png](https://qiita-image-store.s3.amazonaws.com/0/27895/9db29705-1b46-6a70-6fad-8024521c9dd4.png)


`Run the script in context of the bundle(bundle exec)`
のチェックとか必要な人は忘れないようにする。

## 実行
あとは
![Screen Shot 2015-09-05 at 23.29.40.png](https://qiita-image-store.s3.amazonaws.com/0/27895/abf64aa1-5a62-b9e2-93da-29c09ca757fc.png)

ウィンドウ上部から作った`foreman`を選んで虫のアイコンをクリックで実行！！

## ブレイクポイントの進め方
自分は基本的に、ステップ実行とかではなく
次のブレイクポイントまで処理が飛んで欲しいので
次のアイコンを使う。
![Screen Shot 2015-09-05 at 23.30.57.png](https://qiita-image-store.s3.amazonaws.com/0/27895/37d2f850-966a-c7d4-670b-4ff1d5fdab7a.png)
本来はカーソルがある位置まで実行だが、カーソルがないと次のブレイクポイントまでいく。

## binding.pryとの違い
binding.pryだと起動したあとに、
あ！ここにもbinding.pry書いとけばよかったと思っても確かもう遅いはずだが、RubyMineのブレイクポイントはそういうときでも後から付け加えれる。

## 変数の確認
Debugeerパネルのツリー上に表示されるものでみてもよいけど。
自分はConsoleパネルで `p 変数名`
めちゃ Xcodeの`po 変数名` みたいに使える！
Playground でのリッチコメントつけてみた

Xcode 6.4 のPlaygroundでMarkdownによるリッチコメントをつけたので、せっかくだから初投稿。

[Markup Reference (公式)](https://developer.apple.com/library/ios/documentation/Swift/Reference/Playground_Ref/Chapters/MarkupReference.html#//apple_ref/doc/uid/TP40014789-CH3-SW14)
## そもそもの経緯
プログラミング初心者だが、そろそろ自分で作りたいと思って、Playgroundに挑戦しようと決意した。　　

何で躓いたのか、ネットでPlaygroundの出来ることを調べようとしたら、よくある時間が潰れていく状態になり、結局[進化したPlayground ](http://blog.andgenie.jp/articles/812)のページへ。
[英語の元ネタ(Apple)](https://developer.apple.com/swift/blog/?id=24)
![image](https://devimages.apple.com.edgekey.net/swift/blog/images/DemoNewFormat.png)
    リッチコメントの方ね

で、すげーと見つつ、自分も書こうとしたんだが、いまいちうまく行かずにいろいろ調べたんで、ついでに初投稿。
## Playgroundでリッチコメントをつけるには
- まず、Playgroundのファイルを開く。
- Editor > Show Raw Markup で編集が可能に
- 編集
- Editor > Show Rendered Markup で表示
- 編集されなくなる

これだけ。

## 記法ルールと注意
コメントに:をつければ書ける。
### 基本的にはMarkdown。

```
//: これでリッチテキストとなる
/*: これでも可（ただしこの一行目は表示されない。
# 見出し h3 まで
[<text>](<html>)でリンク
* リスト
    * タブか4スペースで構造化できる
- これでも可
**ボールド**
*イタリック*
--- 横線
*/
```

そんな感じ。
### 注意
- 段落は普通に使えるが、改行のため最後に２スペースを入れてもリッチテキストにするときにしばしば消え、改行されない。一行ずつ編集、レンダーを繰り返せばなんとかなる。プログラミングのためなんだろう。
- 引用のネスト化はできないっぽい。というか引用とマークアップの区別が...

## 思ったこと

- Xcode 7 では次のページ機能が付いているとのこと（試してない）。  

どんどん教育目的に発展していって、個人的にはひらしょーさんになんか書いて欲しい。

しかし、なぜプログラミングを始めるはずが、Markdown記法について調べることとなったんだろうorz
正直、プログラミング自体には何の貢献にもなってない気が...
消されない見やすいコメントなので、使い道がないことはないと思いたい...
とりあえず、私はひらしょーさんの本から覚書を載せてます。
## 最後に
読んでくださった方、ありがとうございました。
QiitaもPlaygroudも初心者ですので、何か不備、改善点等ありましたらコメントにてお教えいただければ、幸いです。
Node.js & webpack & babel で「 regeneratorRuntime is not defined」が発生する場合の対処

ちょっとハマった Node.js & webpack & babel の環境で発生する下記のエラーへの対処方法です。

```
regeneratorRuntime is not defined
```

##原因
ES6にGeneratorという機能があるのですが、ソースコードでこれを使っているとBabelはこれを変換してGeneratorに対応していない処理系でも動くようにしてくれます。
「regeneratorRuntime」はこの処理を実現するためにBabelのランタイムに定義されている関数です。
つまり、Babelのランタイムが読み込まれていないから「regeneratorRuntime is not defined」が発生しているわけです。

##たぶんベストの対処方法
とりあえず発生させないようにする方法はいくつかあるのですが、一番良い方法はwebpack.config.jsでbabelのgeneratorの変換を止める方法です。
nodejsを使う場合はGeneratorは実装されているので変換する必要がありません。
変換してしまうとパフォーマンスが劣化したり想定外の動きになったりすることも考えられるため、nodejsの場合は変換しないのがベストな方法かと思います。

```js:webpack.config.js
loader: 'babel?blacklist[]=regenerator'
```

##その他の対処方法

###babel/polyfillを使う

```js
require 'babel/polyfill'
```

###babel-runtimeを使う

```bash
npm i --save babel-runtime
```

```js:webpack.config.js
loader: 'babel?optional[]=runtime'
```
unity > ToggleGroupにて falseに変化したもの、trueに変化したものを検知する

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

http://qiita.com/7of9/items/26fa124f49722ca8c63f
で作ったToggleGroupの選択を変更した時、片方はfalseになり、もう片方はtrueになる。

それぞれfalse, trueになったものを検知して、それに対する処理の実装に使いたい。

やったこととしては

各Toggleの On Value Changedに以下のものを関連付ける。
- ToggleValueChanged
- パラメータ(idx_st1)には各Toggleのインデックスを入れる

例として、 SelP3というToggleの場合には、idx_st1には3を入れておく。

![Main_unity_-_150905-dynamicDisplay_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/08bd269c-161f-4b8f-0d12-c83027cd6707.jpeg)


ToggleValueChanged()は以下を定義

```csharp
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class PanelDisplayControl : MonoBehaviour {

	public GameObject PageSelect;
	
	public void ToggleValueChanged(int idx_st1) {
		Toggle selected = null;
		string name;
		foreach (Transform child in PageSelect.transform) {
			name = child.gameObject.name;
			if (name.Contains(idx_st1.ToString())) { // e.g. "SelP1", "SelP2"...
				selected = child.gameObject.GetComponent(typeof(Toggle)) as Toggle;
				break;
			}
		}

		Debug.Log(idx_st1.ToString() + " is " + selected.isOn);
	}
}
```

PageSelectには以下が子としてある。
- SelP1 : Toggle
- SelP2 : Toggle
- SelP3 : Toggle
- SelP4 : Toggle

とりあえずこれで、どれがfalseになり、どれがtrueになったかは分かるが、もっと簡単な方法でidx_st1 と true,false がとれないだろうか?

![Main_unity_-_150905-dynamicDisplay_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/bca9fe0e-620b-a3a4-9957-601f0b5cbe97.jpeg)
Webアプリを開発し始めるときにとりあえず用意する３つのリポジトリ



# 3つのリポジトリ

## Webアプリのソースコードを管理するリポジトリ
* 当然必要になります。

## Vagrant設定ファイルを管理するリポジトリ
* 開発環境用Vagrantの設定（Vagrantfile）を管理します。
* synced_folderの機能をつかって、Webアプリのソースコードを開発環境内に同期してます。
* Provisioningは後述のAnsible Playbookを参照する形で実施しています。

## AnsibleのPlaybookを管理するリポジトリ
* 本番環境や、開発環境用Vagrantの構成を管理。
* 開発しようとしているWebアプリ固有ではないRoleについては、[Ansible Galaxy](https://galaxy.ansible.com/)で公開されているものを有効活用させてもらってます。


# 思ったこと
* Vagrant設定ファイルは「Webアプリのソースコードを管理するリポジトリ」で管理してしまってもいいかも。
	* でも、役割はそれぞれ違うものなので、別のリポジトリで分けたい。
* Ansibleの各Roleを異なるリポジトリで管理して、他のWebアプリ開発においても再利用できる状態が理想。
GitBucketのactivityをデスクトップ通知してくれるプラグインを公開しました

仕事のプロジェクトで、 [takezoe/gitbucket](https://github.com/takezoe/gitbucket) を使わせていただいております。

GitBucket自体は、Email通知機能があるので、通知するなら本来、そちらを使うべきなのですが、AWS上にGitBucketを構築したりすると、気軽にEmailが使えない事情もあるときがある。

ので、Pluginでデスクトップ通知してくれると嬉しいかもって思って作ってみた。

コードは、こちら。
https://github.com/yoshiyoshifujii/gitbucket-desktopnotify-plugin

## Install

[README.md](https://github.com/yoshiyoshifujii/gitbucket-desktopnotify-plugin/blob/master/README.md) のとおりだ。

## 使い方

Pluginを適用したら特に設定画面等は用意していないので、リロードしていただいたら使える。

Activityに変更があったら、デスクトップに通知されるよーになってる。

![スクリーンショット_2015-09-05_22_33_28.png](https://qiita-image-store.s3.amazonaws.com/0/24050/a5341e9b-1b7c-9b3a-812b-a1ddf4063ab0.png)

## 今後

通知のときのアイコンをユーザーのやつにしたりとか、通知をクリックしたらその画面を開くとかしていってもいいかも。

Activityしかポーリングしていないので、Pull Requestへのコメントとかをキャッチできていないから、そういった個別に出したいやつも見にいくようにしてもいいかも。
Edisonに日本語UTF-8(ja_JP.UTF-8)のロケールを設定する。


# 1. はじめに
　Intel EdisonにデフォルトでインストールされているYocto OSはlocaleがインストールされていません。そのため、環境変数LANGやLC_ALLにja_JP.UTF-8と指定してもロケールが変更できません。このままでは日本語を取り扱うプログラムなどを実行すると、うまく処理できない場合があります。そこで本稿では日本語UTF-8のロケールをEdisonにインストール方法について説明します。
　OSを他のディストリビューションにするという方法もありますが、Yocto OS縛りがある場合に参考にしてみてください。
## 1.1 Edisonのlocaleを確認する
　EdisonのYocto OSはSystemdが採用されています。localeの設定についてはlocalectlが利用されます。
まず現在のlocale設定を見るために以下のコマンドを実行します。
```
root@edison:~# localectl
```
また利用できるlocaleの設定については下記のコマンドで確認できます。

```
root@edison:~# localectl list-locales
Failed to open locale directory: No such file or directory
```
　Edisonをセットアップ後の状態ではlocaleがインストールされていないため、上記のようなメッセージが表示されます。ここからEdisonにlocaleをインストールして行きます。
## 1.2 Edisonにロケールを設定する手順
　Edisonでのlocaleの設定の手順は以下の3つの手順になります。
1. 日本語localeのインストール
2. 日本語UTF-8ロケールの作成
3. 環境変数へのlocaleの設定  
次にそれぞれについて説明して行きます。
# 2. 日本語localeのインストール
　ロケールについてはopkgでインストールすることができます。日本語以外に付いてもロケールが用意されていますので、適宜必要な物をインストールします。
## 2.1 リポジトリの追加
　opkgのリポジトリを追加します。下記パスにファイルにリポジトリを3つ追加します。
/etc/opkg/base-feeds.conf

```
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32 
```
その後、opkgでアップデートを実行してください。

```
root@edison:~# opkg update
```
## 2.2 インストールの実行
下記のコマンドでインストールして行きます。

```
root@edison:~# opkg install glibc-locale-ja
root@edison:~# opkg install glibc-localedata-ja-jp
root@edison:~# opkg install glibc-charmap-utf-8
```
　ここで再びlcalectlで利用できるlocaleを確認します。

```
root@edison:~# localectl list-locales
ja_JP.EUC-JP
```
ja_JPが追加されていることが確認できます。
# 3. 日本語UTF-8ロケールの作成
　ja_JPのロケールはインストールできましたが、このままでは日本語UTF-8のロケールが設定できません。
そこで。localedefを使い、日本語UTF-8をロケールを作成します。
※余談ですが、euc-jpのロケールはopkgのリポジトリにあるようです。

まずlocaledefをopkgからインストールします。

```
root@edison:~# opkg install localedef
```

下記のコマンドでUTF-8のロケールを作成します。
```
root@edison:~# localedef -i ja_JP -f UTF-8 ja_JP.utf8
```
参考；http://webos-goodies.jp/archives/50808801.html

もう一度ロケールを確認しましょう。下記のように表示されれば成功です。

```
root@edison:~# localectl list-locales
ja_JP.EUC-JP
ja_JP.utf8
```
# 4.  ロケールの設定
最後に環境変数を設定すれば完了です。下記を~/.profileなどに設定すれば良いと思います。

```
root@edison:~# export LANG="ja_JP.utf8"
```

本来Systemdではlocalectlコマンドでロケールの設定をするのが正しいようですが、Edisonの
場合設定が聞きませんでした。またこの場合、再起動後に設定が消えるようです。このあたり追加で検証を行いたいと思います。
# 5. まとめ
今回の作業をまとめてみました。

```
root@edison:~# opkg install glibc-locale-ja
root@edison:~# opkg install glibc-localedata-ja-jp
root@edison:~# opkg install glibc-charmap-utf-8
root@edison:~# opkg install localedef
root@edison:~# localedef -i ja_JP -f UTF-8 ja_JP.utf8
root@edison:~# export LANG="ja_JP.utf8"

```
Excel VBA(Win/Mac)でクリップボードにテキストをコピー

Windows版・Mac版のExcel VBAでクリップボードにテキストをコピーする方法。

DataObjectでクリップボードにテキストをコピーすると、Mac版だと文末にゴミ(```¥0¥0```)が追加されたりするのでMacScriptを使う。

### <INS>クリップボード設定</INS>

クリップボードを使うためにダミーの標準フォームを追加

※参照設定で「C:\WINDOWS\System32\FM20.DLL」を追加して「Microsoft Forms 2.0 Object Library」を参照設定したらMacのExcelで開けなかった

### <INS>VBAソース</INS>

```vbnet:クリップボードにコピー
    text = "test"
    If Application.OperatingSystem Like "*Mac*" Then
        ' Is Mac.
        text = Replace(text, "\", "\\")
        text = Replace(text, Chr(34), "\" & Chr(34))
        MacScript ("set the clipboard to " & Chr(34) & text & Chr(34))
    Else
        ' Is Windows.
        Dim CB As New DataObject
        With CB
            .SetText text
            .PutInClipboard
        End With
    End If
```

## 参考
[Office TANAKA:クリップボードを操作する(1)](http://officetanaka.net/excel/vba/tips/tips20.htm)
[Office TANAKA:MacScript関数](http://officetanaka.net/excel/vba/function/MacScript.htm)
[Excel for Windows および Excel for the Mac でプログラムによってファイルを選択する](https://msdn.microsoft.com/ja-jp/library/office/Hh710200(v=office.14).aspx)
herokuのSendGridでclicktrackingを無効にできない時は直接heradersに設定するとOFFにできる

herokuのアドオンで使えるSendGridは何故かClickTrackingの設定が出てこない。
解決方法としてSendGridのX-SMTPAPIで直接設定することでclicktracking設定をoffにすることができる。
こんな感じで。

```rb:application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default \
    'X-SMTPAPI': { filters: { clicktrack: { settings: { enable: 0 } } } }.to_json
end
```

参考:
https://sendgrid.com/docs/API_Reference/SMTP_API/apps.html