OmniAICreator/Qiita-1.07M huggingface dataset:
gstreamer-plugin 2日目:  _chain() について


今日は [Chapter 5. The chain funtion](http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-building-chainfn.html) についてです。

※ [Day13](http://qiita.com/shocrunch/items/e1eff815f363c35f426e) の環境を前提にこれからお話しするので、まだDay13を見てない人は、まずはそちらで環境構築を！

### やりたいことを書く _chain()

Chapter 5 にも書いているように  `_chain()` は「プラグインでやりたいこと」を実装する場所です。「プラグイン作りたいなー」と思ってまず弄っていくのはここということになります。

### バケツリレーな GStreamer の処理

Element は好きな処理をした後`pad_push()`するのが、 GStreamer のルールです。

![gst.png](https://qiita-image-store.s3.amazonaws.com/0/97187/60f5b639-e7d2-5387-642c-a5a2463f62da.png)

上流の Element が `pad_push()`すると、`_chain()` の第3引数に `GstBuffer` が入ってきます。そして、なんらかの「やりたいこと」を処理したあと、`GstBuffer` を `pad_push()` します。

![gst2.png](https://qiita-image-store.s3.amazonaws.com/0/97187/ca266194-fe9f-4424-77c8-e95748239fef.png)

`pad_push()`されると下流の`_chain()`が実行され、バケツリレーの要領で`_chain()`が次々と実行されていきます。(まさにパイプラインです！)

### パイプラインの実装は?

この動きは `gstpad.c`に書かれています。
下流のElementの`_chain()`を呼ぶのは [gstpad.c のこの行](http://cgit.freedesktop.org/gstreamer/gstreamer/tree/gst/gstpad.c#n4153)なので、ここからどんどん遡っていくと`gst_pad_push()`に巡りあえます :)

### _chain を編集してみよう

さて、`pad_push()` → `_chain()` の概念を知ったところで Boilerplate のコードに手を入れてみましょう。

※ GstBuffer については[yashi さんの Day 12](http://hellolibraryworld.blogspot.jp/2015/12/gstreamer-6-buffer-memory.html)で解説されているのでここでは省きます。

*ここから*、*ここまで* を `_chain()`に追加したらさっそくビルドしましょう。

```c:gstplugin.c
/* chain function
 * this function does the actual processing
 */
static GstFlowReturn
gst_plugin_template_chain(GstPad * pad, GstObject * parent, GstBuffer * buf)
{
	GstPluginTemplate *filter;

	filter = GST_PLUGIN_TEMPLATE(parent);

	if (filter->silent == FALSE)
		g_print("I'm plugged, therefore I'm in.\n");

	// ここから
	{
		GstMapInfo info;

		gst_buffer_map(buf, &info, GST_MAP_READ);
		g_print("%s", info.data);
		gst_buffer_unmap(buf, &info);
	}
	// ここまで

	/* just push out the incoming buffer without touching it */
	return gst_pad_push(filter->srcpad, buf);
}
```

早く動かしたい気持ちはぐっとこらえつつ、メモ帳や echo コマンドなどで、`input`というファイルを作りましょう。

```shell-session
$ echo "hoge" > input
```

さあ、やっと実行です！

```shell-session
$ GST_PLUGIN_PATH=`pwd` gst-launch-1.0.exe filesrc location=input ! plugin silent=true ! fakesink
Setting pipeline to PAUSED ...
Pipeline is PREROLLING ...
hoge
Pipeline is PREROLLED ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Got EOS from element "pipeline0".
Execution ended after 0:00:00.000122404
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
```

filesrc から input を読み込み、plugin がそれをハンドルして、`hoge` と表示してくれましたね！

plugin の開発というと敷居が高い感じがしますが、簡単なものはたったこれだけで作れるのです。ぜひ遊んでみてください :)
underscoreコードリーディング（min）


underscoreに詳しくないので、勉強半分でソースコードを読む。


##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##minとは


###[underscorejs.orgのmax](http://underscorejs.org/#min)

こんな説明。
>####_.min(list, [iteratee], [context]) 
>Returns the minimum value in list.
>If an iteratee function is provided, it will be used on each value to generate the criterion by which the value is ranked. 
>Infinity is returned if list is empty, so an isEmpty guard may be required.

```javascript
var numbers = [10, 5, 100, 2, 1000];
_.min(numbers);
=> 2
```

------------- 

listの中の最低値を返す。
もしiteratee関数が渡された場合、それを用いてそれぞれの値の判定に用います。
Infinityが返されるのは、listが空なためです。そのため、isEmptyで事前に防ぐことが必要です。

###[underscore.min](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L323)

コード的にはこのあたり。

```javascript
  // Return the minimum element (or element-based computation).
  _.min = function(obj, iteratee, context) {
    var result = Infinity, lastComputed = Infinity,
        value, computed;
    if (iteratee == null && obj != null) {
      obj = isArrayLike(obj) ? obj : _.values(obj);
      for (var i = 0, length = obj.length; i < length; i++) {
        value = obj[i];
        if (value < result) {
          result = value;
        }
      }
    } else {
      iteratee = cb(iteratee, context);
      _.each(obj, function(value, index, list) {
        computed = iteratee(value, index, list);
        if (computed < lastComputed || computed === Infinity && result === Infinity) {
          result = value;
          lastComputed = computed;
        }
      });
    }
    return result;
  };
```

基本的にはmaxと同じ。
result,lastComputedにInfinityを初期値として与える
iterateeが存在しないかつobjがnull以外の場合、objがArrayか連想配列かの判定後にfor文で配列の中を走査する。
その中の値の中で最低値をresultに格納し、resultを返却する。

それ以外の場合、iterateeが関数かどうかを判定し、_.eachを用いて、objを走査する。
objの値ごとに、iterateeを実行し、iterateeで返却された値が今までのobjのiterateeの実行値よりも地裁場合はresultにobjの値(value)を格納する。
その後、最低値をresultとして返却する
Apache Maven最新版を、windows10にインストール

#備忘録

今までmavenを扱うプロジェクトに参画したことあったけど、
実際何をしているのかよくわからなかったので、とりあえずインストールしてみた。

ダウンロードまでは簡単！

1. ダウンロード
[ここ](http://archive.apache.org/dist/maven/maven-3/)から最新版を選んでダウンロード

2. ダウンロードファイル解凍
Cドライブ直下に解凍してみた。
C:\apache-maven-3.3.9\ってな構造になる　　
3. パス設定
Java1.8とC:\apache-maven-3.3.9\binにパスを通す

4. 動作確認
コマンドプロンプトからmvn --versionを叩く
するとバージョンが表示されて、ダウンロード完了！

次は、プロジェクトの作り方やってみよ。
その後構造の学習かな。
チームのみんなで成長できるコードレビュー　コメントの方法編

mixi Advent Calendar の17日目です。

今までまともにコードレビューをしたことがなかったエンジニアが、半年前からコードレビューを経験し始めて、チームの雰囲気が良くなった（と思っている）レビューの仕方をご紹介します。

私は株式会社ミクシィのグループ会社である株式会社 Diverse へ出向して、そこでデーティングサービス YYC の Android クライアントを開発しております。

現在、 YYC の Android クライアントは大規模な改修を行っていて、それに合わせて開発チームの再編成・開発フローの改善などいろいろな試行錯誤をしています。
その試行錯誤のうちの一つとしてコードレビューでの取り組みをご紹介します。


# ここで説明すること、しないこと

ここでは以下のことについて説明します。

* コードレビューの雰囲気を良くする（良く保つ）方法
* 自分やチームメンバーの成長を促すための心がけ

また、以下のことはあまり説明しません。[翌日の Diverse Advent Calendar で記事にします](http://qiita.com/kikuchy/items/9583134de91c2fc27920)のでそちらを参照してください。

* master のコードの質を上げるためのチェックポイント
* 自分のレベルを上げるコードリーディングの方法


# なぜコメントの仕方が大事なのか

個人的に、コメントの仕方というのは重要だと思っています。
というのも、 Team Geek などにも書かれている通り、コードレビューは少なからず人に（精神的）ダメージを与えるためです。

自分が自信を持って（あるいは、苦労して）書き上げたコードに、他の人から指摘がなされるというのは、決して気分の良いものではありません。
私もそうでした。

> 自分の価値とコードを同一視してはいけない
> （『Team Geek - Google のギークたちはいかにしてチームを作るのか』 2013 オライリー・ジャパン P.21）

このことを知っていれば大きくダメージは軽減できるものの、レビューで色々な要求されたり、なかなかマージしてもらえずにストレスが溜まることはどうしても避けられません。

そのため、なるべくダメージを軽減するような、ダメージを受けてもそれが学びになるような、そうしたコメントをすることが重要なのではないでしょうか。


# コメントの方法

## 直して欲しいところにコメントする

レビューイーが提出したコードに対して、以下のように感じたら修正を要求することになるでしょう。

* そもそも動かない
    * エラーが出る、クラッシュする
    * Lint が警告を出している
    * テストが通らない
    * バグっている、も含む
* 明らかに非効率的
* 一見して何をしているのかわからない

プロダクト、そしてコードの品質を上げるためには指摘が必要です。
しかし、「ここが良くない」とだけ指摘にして Green さんの広告のように後の返事は「ググれ」では、チームの雰囲気は悪くなるばかりでしょう。

雰囲気を良くしながら指摘をするコメントとはどんなコメントなのでしょう。


### 事情がないなら、可能な限り代替案を添える

コメントには最低限以下の要素が含まれているべきです。

* どこを直して欲しいのか (Where)
* なぜ直して欲しいのか (Why)

それに加えて、 **どう直したら良いのか** (How) を添えると良いでしょう。

_「このクラス名 `ViewHolder` は何の ViewHoler なのか漠然としているので、 `BbsEntryViewHolder` とかにするともっとわかりやすいと思います！」_

ただ指摘するより、「キチンと考えている」親身な感じが出るかと思います。
(新人育成などでレビューイーに考えてもらう必要がある場合はその限りではありませんが)

「マズイのはわかるんだけどどう直したらいいのかわからない！」
というときには素直に言いましょう。

_「ここ、引数から null が入る可能性があるので NullPointerException が起きそうです…！ いいアイデアが無いのですが、どうしたら直せますでしょうか？」_


メンテナビリティについて指摘する場合は、まずは「動く、すごい！」というスタンスでコメントすると良いように感じます。

_「このメンバ `mInnerView` はローカル変数にしてしまうと、コードが読みやすくなってもっと良くなると思いますー！」_


そして、修正していただいたら、なるべくまたコメントをするようにしています。
テンション高く、ありがたさが伝わると良いと思います。

あくまで直してくれた人のおかげでコードが良くなったことを肝に銘じるようにしています。指摘した人は横から口を出しただけ、のスタンス。

_「おおお、フローがもっとわかりやすく！！ すごいですー！ :congratulations: :dancers: :tada: 」_


## 良い書き方だと思ったところにコメントする

指摘をするだけではなく、以下のような箇所もコメントするようにしています。

* 初めて知ったこと
    * 文法、メソッド、ライブラリ
    * テクニック
    * など
* その発想はなかった・うまい！
    * 設計
    * 命名
    * など
* 以前から上達しているところ
* など

_「こんな書き方があるんですね！！ 勉強になりますー！」_

_「これは便利なビュー…！！ こっちの画面でも使わせていただきます！」_

_「いつもドキュメントコメントがすっきりかつわかりやすくてすごいです…！」_

褒められて悪い気分になる人はあまりいないと思いますので、ガンガン褒めるスタンスで良いと思います！
私も褒められたい⁽⁽٩(°ꇴ°⑉)۶⁾⁾


# そんなレビューを続けた結果

現在のプロジェクト発足前は、距離感がわからないのもあったのか、かなり何でもLGTMが出ていた印象でした。


しかし、プロジェクト発足と同時に、上記のようなレビューを始めて3か月続けた結果。
穏やかに意見交換が起こりつつ、良い雰囲気で開発が続けられているように感じます。

また、チーム全員のコードの書き方も改善されてきたようで、指摘コメントの数が段々減ってきているようです。
(ムラがあるので一概に減ったとは言い切れないのですが、感覚的には「簡単なことを簡単に書けるようになってきた」と感じています)

全く別チームのディレクターさんがコードレビューの様子を見てくださっていて、
「コメントのやりとりが楽しそうで、いい雰囲気ですね」
と言ってくださったので、他の方の目から見ても良い雰囲気なのかなと思っています。

次の目標は、この雰囲気をそのままに活発に意見交換を起こすことです。
もっと品質の良いコードを残せるようにしてゆきたいです。


<hr />

以上、良い雰囲気で言うべきことが言えるコードレビューでのコメントの仕方でした。

明日は @kubo39 が、 @tanatana さんみたいに面白いことを書いてくれると思います。


# あわせて読みたい

* [チームのみんなで成長できるコードレビュー　見るべきところ編](http://qiita.com/kikuchy/items/9583134de91c2fc27920)
コマンドとコマンドをつなぐ糊

## 環境
```bash:Terminal
$ bash --version
GNU bash, version 4.3.30(1)-release (x86_64-apple-darwin14.0.0)
```

### パイプ (pipe) ``commandA | commandB``

正式にはPipeline。``|&``でも動く（2019/03/16補足: `|&` では標準出力と標準エラー出力を次のプロセスの標準入力につなぎます)。
``$ man bash`` より
> Pipelines
       A  pipeline  is  a sequence of one or more commands separated by one of the control
       operators | or |&.

```bash:Terminal
$ seq 1 5 | grep 1
1

$ seq 1 5 |& grep 1
1
```

#### [パイプ + α] 標準入力自体を解釈して実行 ``commandA 'commandB' | bash``

```bash:Terminal
$ echo yes | bash
y
y
y
y
...

# yesコマンドが実行される
```

```bash:Terminal
$ yes 'echo $RANDOM' | bash
212
16621
7312
2233
19266
2762
```

```bash:Terminal
$ echo $$; echo 'echo $$' | bash
88208
88278

# プロセスのIDは違う
```

``$ man bash`` より
> DESCRIPTION
       Bash  is  an sh-compatible command language interpreter that executes commands read
       from the standard input or from a file.

単に「標準入力かファイルを解釈して実行するよ」とあるだけで、特にこのテク自体には名前はないのかも。


#### [パイプ + α] xargs ``commandA | xargs -I@ commandB @``

標準入力を次のコマンドの引数にする。ただのxargsの応用例。よく使う慣用句。

```bash:Terminal
$ echo "-al" | xargs -I@ ls @
drwxr-xr-x+ 133 greymd           greymd     4522 Dec 17 13:34 .
drwxr-xr-x    7 root             greym       238 Oct 25  2014 ..

# ls -al が実行される
```

### コマンド置換 (command substitution) ``commandA $(commandB)``
`` commandA `commandB` `` とも書ける。
commandの実行結果が文字列として認識される。

```bash:Terminal
$ ls $(echo '-al')
drwxr-xr-x+ 133 greymd           greymd     4522 Dec 17 13:34 .
drwxr-xr-x    7 root             greym       238 Oct 25  2014 ..

# ls -al が実行される
```

```bash:Terminal
$ `echo "yes"`
y
y
y
y
y

# yesが実行される
```

``$()``は入れ子にできる`` ` ``(backtick)は入れ子にできない。
``$()``はcshとかtcshじゃ動かない。

```bash:Terminal
$ cat $(echo $(echo "/etc/passwd"))
```

### プロセス置換 (process substitution)

[このページ](http://sechiro.hatenablog.com/entry/2013/08/15/bash%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%BD%AE%E6%8F%9B%E6%A9%9F%E8%83%BD%E3%82%92%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%B7%E3%82%A7%E3%83%AB%E4%BD%9C%E6%A5%AD%E3%82%84%E3%82%B9)が良くまとまってた。

#### 出力対象のプロセス置換 ``commandA >(commandB)``

```bash:Terminal
$ seq 10 | tee >(grep -v 1 > output)
1
2
3
4
5
6
7
8
9
10

$ cat output
2
3
4
5
6
7
8
9
```

``commandA | tee >(commandB) | commandC`` という形式で使うと、``commandA``の出力を``commandB``と``commandC``の両方で扱え、かつ両方とも標準出力に出せる。一旦``パイプ``が枝分かれになって、出口で合流した感じ。

```bash:Terminal
$ seq 10 | tee >(grep 1) | grep 2
1   # grep 1 による出力
10  # grep 1 による出力
2   # grep 2 による出力
```

#### 入力対象としてのプロセス置換 ``commandA <(commandB)``

これはよく使う。``<(command)``は``command``の実行結果が記載されたファイルのように振る舞う。

```bash:Terminal
$ cat <(seq 10)
1
2
3
4
5
6
7
8
9
10

# これと挙動としては同じ
$ seq 10 > tmp
$ cat tmp
1
2
3
4
5
6
7
8
9
10
```

ファイルのように振る舞うんでしょ？ファイル名は？→ファイルディスクリプタでした。

```bash:Terminal
$ echo <(seq 10)
/dev/fd/63
```

### 複合コマンド(Compound Commands) ``(commandA; commandB;)`` ``{commandA; commandB;}``

複数のコマンドをコロンで区切って、出力を合体させる。
``()``はサブシェル (subshell)、``{}``は何と表現すればよいのか。

```bash:Terminal
$ (echo '123'; echo '456')
123
456
```

``{}``はサブシェルではなく、現在のプロセスで実施されるとのこと。確かにサブシェルだけプロセスIDが違う。

```bash:Terminal
$ echo $BASHPID; (echo $BASHPID;); { echo $BASHPID; }
75461
76279
75461
```
IDCFの社内ネットワーク

IDCフロンティアは[沿革](http://www.idcf.jp/company/history.html)が通信事業者だということもあり、ネットワークに強みを持っているデータセンター＆クラウド事業者です :muscle: 

インターネット回線総量No1も獲らせていただきました :tada: 
https://www.impressrd.jp/idc/ranking/201512/1

設計の基本方針は**ジャブジャブ**です :rocket: 

ただ、そんなIDCFの社内ネットワークはどんなもんなのよ？というのは実はあんまりちゃんと調べたことがなかったので、勝手に調べてみました :eyes: 

後述しますが、新宿オフィスでお客様に提供している無線LANも無銭で使えますので、ドシドシお試していただければと思います :hotsprings: 

# オフィス無線LAN

社内はMacやiPhoneなどが無線LANで接続されますが、ちょうどiPhone6sが支給されたので、[Speedtest](https://itunes.apple.com/jp/app/speedtest.net-mobile-speed/id300704847?mt=8)というアプリで通信速度測定してみました。

新宿オフィスは主に1F、9F、10F、11Fがオフィスフロアなので各フロアで計測 :punch: 

1F
ダウンロード：110.30Mbps
アップロード：88.63Mbps

![image](https://qiita-image-store.s3.amazonaws.com/0/53465/0990c7f0-148b-4ef2-5bea-80a81391ed18.png)

9F
ダウンロード：84.92Mbps
アップロード：83.23Mbps

![image](https://qiita-image-store.s3.amazonaws.com/0/53465/82ae3bd5-62ab-9169-b398-4e0cc34e38ac.png)

10F
ダウンロード：86.47Mbps
アップロード：81.58Mbps

![image](https://qiita-image-store.s3.amazonaws.com/0/53465/b8ff3183-b6b3-b104-37c8-11c5cde7c6fc.png)

11F
ダウンロード：87.08Mbps
アップロード：88.54Mbps

![image](https://qiita-image-store.s3.amazonaws.com/0/53465/e81b1f99-de2c-5b9e-4d56-4642618212e9.png)

多分802.11nだったかと思いますが、大体100Mbps弱の速度を維持し、快適な速度でした :satisfied: 
（11acとかであればもっと出るのかもしれませんが）

また、お客様に貸し出しをしている無線LANも、SSIDやネットワークは当然別ですが、同じくらいの速度が出ます :dancers: 

打ち合わせやDC入館等で新宿オフィスに来ることがあれば、是非ご利用ください。
アプリのアップデートとかめっちゃ早いです :speak_no_evil: 

# OA-LAN

OA-LANは基本的にはシンクライアントを使っていますが、その環境ではこんな感じでした。
（画面キャプチャ忘れた・・）

ダウンロード：324.57Mbps
アップロード：247.56Mbps

なかなか速いぜ、IDCFネットワーク :sunglasses:
JUnit での @Rule を使ったタイムアウト指定はテストクラスのコンストラクタで上書きできる

JUnit を使ったテストで, テストに関するルールが基底クラスで設定されているとします.

```TestProperty.java
public class TestProperty {
    @Rule
    public Timeout timeout = new Timeout(10000);
    // その他設定
}
```
```SomethingTest1.java
public class SomethingTest1 extends TestProperty {
    @Test
    public void 早く終わらなければならないテスト() throws Exception {
        // ...
    }
}
```
```SomethingTest2.java
public class SomethingTest2 extends TestProperty {
    @Test
    public void 時間がかかりそうなテスト() throws Exception {
        // ...
    }
}
```

そもそもこのようなテスト設計はどうなのかという問題は置いといて, とあるテストクラスだけタイムアウト指定を変更したい場合, テストクラスのコンストラクタで設定を上書きできます.

```diff
 public class SomethingTest1 extends TestProperty {
+    public SomethingTest1() {
+        super();
+        timeout = new Timeout(1);
+    }
     @Test
     public void 早く終わらなければならないテスト() throws Exception {
         // ...
     }
 }
```
```diff
 public class SomethingTest2 extends TestProperty {
+    public SomethingTest2() {
+        super();
+        timeout = new Timeout(100000);
+    }
     @Test
     public void 時間がかかりそうなテスト() throws Exception {
         // ...
     }
 }
```
次のような指定は無効らしいです.

```SomethingTest1.java
public class SomethingTest1 extends TestProperty {
    @Before
    public void setup() {
        timeout = new Timeout(1);  // <- 無効. すでにtimeout設定が読まれている
    }
    @Test(timeout = 1)  // <- 無効. @Ruleが優先
    public void 早く終わらなければならないテスト() throws Exception {
        // ...
    }
}
```
cakePHP3のORMでexists句を使う。

# cakePHP3のORMでexists句を使う。

cakePHP3でexists句を使うSQLを書こうと思ったところ、メソッドもないし、そもそも情報がない。
色々試した末、これで出来たかもと思われる方法をメモしたいと思います。

| companyテーブル |
|:-----------|
| id |
| name |
   

| employeeテーブル |
|:-----------|
|   id |
|   company_id |
|   name |
|   deleted |


の様なテーブルがあったとして、companyのid=1の社員を抽出したい場合(この場合existsを使わなくてもいいのですが、あえて使わせてください。)、SQLは、

```sql
select * from employee e where exists( select id from company c where e.company_id = c.id and c.id =1) and e.deleted = 0
```

これをCakePHP3のORMで記述すると

```php
        $company= TableRegistry::get('company');
        $subquery =  $company->find()->where(['employee.id = id and id = :id'])->select(['id']);
        $query->select(['employee.id', 'employee.name'])->Where("exists ({$subquery})")->Where(['employee.deleted' => 0])->bind(':id', 1);

```

と書けました。

bind関数を利用するところが肝で、サブクエリ内でbind関数を利用しない場合(配列で渡した場合)、SQLに変換した際、":c0"のバインド変数に変換され、外側のクエリで作成されるバインド変数":C0"と重複してしまいます。
これではまずいので、bind関数でバインド変数を指定することで回避します。
エクセルから地図をつくれます。直感的に。.maploy

こんにちは。清水です。

今回はIT DARTとは直接的には関係のない投稿になってしまいますが、IT DARTのような活動を行ってきた中で得た着想を元に、盟友である浅井渉くんと作っている「.maploy(マプロイ)」というアプリケーションをご紹介したいと思います。

災害用、というわけではありませんが、IT DARTに所属している身としては、これを災害時にも有効活用できるんじゃないかと常々思っています。

## 「エクセルは、あるんです。」
災害時は特に、どこでどんなことが起こっているかを把握するために、地図上にデータを表示させることが役立ちます。

その際に「エクセルでデータをまとめたものだけはある」という状態のデータがあり、それをGoogle MapsやOpen Street Mapを使ってマーカーを置いていくといった作業が行われたりします。

その地図を作成するという部分が意外と手間になっていて、エクセルのデータはあるんだけれど即時公開が難しいという声を聞いたことがありました。

前出の地図サービスや、Ushahidi[^1]なんかを使って、地図上に落とし込んだデータを作ることは可能ですが、それらのオペレーションを覚えるといったことが必要になるため、割りと多くの人ができる「エクセルへのデータ入力」というスキルに一つ壁を作ってしまっている様に思えます。

[^1]:[Ushashidi](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%B7%E3%83%A3%E3%83%92%E3%83%87%E3%82%A3) - 災害時などにも利用されている、地理情報に紐付いて情報を投稿・共有ができるケニア発のサービス。

## じゃあエクセルを投げ込んじゃおう
そこで考えたのが、名前と住所、それと必要な情報を含んだ程度のエクセルファイルを使って地図上にマッピングできたら、そういった壁をひとつ取り払えるのではないかということは常々思っていました。

できるだけ簡単に。

できるだけ直感的に。

ある日、もう一人の開発者である浅井くんと、アーバンデータチャレンジ2015に提出するアプリケーションの話しをしていく中で、極力少ない操作で地図を作成・共有できるサービスがあるといいのではないか、そういったコンセプトがちょうど出来上がってきました。これはもしかすると災害時にも有効活用できるんじゃないかなぁと感じています。

そこで作ったのが「.maploy」です。
![Screen Shot 2015-12-17 at 12.54.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/103745/2f403d13-445f-00c8-8252-7f9c0ff72f9a.png)

写真は非公開のベータ版のもではありますが、着々と準備が進んでおり、もうそろそろオープンなベータ版をリリースする予定です。

## 文字通りエクセルを投げ込みます。
基本的には名前と住所さえあれば、つまりエクセルファイルに二列のデータがあれば簡単に地図上にマーカーを作成することができます。

それもドラッグ・アンド・ドロップで簡単に。

なので名簿のような簡単なデータさえあれば、誰でも即時に自分のマップを作成することができます。

## LinkDataもURLを投げ込みます。
多くのオープンデータが公開されている[LinkData.org](http://linkdata.org/)のデータも簡単に利用できるようにしました。

これまで多くの有用なマッピングデータを、多くのシビックテックを愛する同志たち（一緒にがんばりましょう！）がLinkDataに公開しています。

単純なURLをコピペするという動作でインポートできるようにもしているので、自分の持っているエクセルのデータと、LinkDataに公開されているデータを掛け合わせた地図を作ることができます。

ほら、直感的でしょ？

地図の著作権的にスクリーンショットが載せられないのが残念ですが、もう少しリリースまでお待ち下さい。。。がんばります！

## 土地勘のない人に伝える。
ある日、突然、台風による洪水が自分の街に発生したとします。

例えば介護が必要な方々を載せた名簿があったとして、それは市区町村だったり、介護施設が持っているかもしれませんが、おそらく言えることは、緯度経度情報が合わせて用意されたような、Geolocation Readyな情報ではないと思います。

土地勘のない町にやってきたボランティアの方々には住所だけで場所を判断することは少し難しいかもしれませんが、ドラッグ・アンド・ドロップだけで地図上にそのデータを落としこむことができれば、そういったデータでもよりわかりやすく利用できるかもしれません。

## 言葉の分からない人に伝える。
地図は言葉よりも場所を語ります。

日本語が不得手な人が避難所を探そうとして、日本語の避難所一覧を貰ったとします。しかし漢字が読めません。見て場所を探すことができないかもしれません。

そういった時に避難所の住所と名前さえあれば、「.maploy」を使ってすぐにデータを地図上に落としこんで、それを印刷して配ることだってできるでしょう。地図の名前が日本語だったとしても、漢字の羅列よりはいくらかマシでしょう。

## 最後に
例に上げたものは単なる想像でしかないので、もっと実際に使用してみてどんな機能が必要か、また必要でないのかを見極めたいと思っていますが、逆に言えば他にも使う人によって色々な可能性が生み出されるんじゃないかと思っています。

と、こんなところでIT DARTアドベントカレンダー2015も、残るは一週間。

明日はIT DARTの宮川による「被災地でのIT支援 あるある失敗談」を是非ご覧いただければ。

ではこのへんで。
PHPMailerを使ってGmailのSMTP経由でメールを送信する際にSMTP connect() failed.と出て困った

#経緯 

PHPを使って、メールを送信したかったのですが、PHPで実装されているメーラー？を使うとよく迷惑メールに入れられてしまいます。 

そこで調べたところ、**GmailのSMTP経由で送ると大丈夫**っぽかったので、**新規でGmailアカウントを作成**し、そのアカウントを経由して送信することにしました。


#外部のSMTPを使って送れるライブラリを調べた

下記の二つが見つかりました。

・qdmail
・PHPMailer

初めはqdmailを使おうと思いましたが、下記の理由によりPHPMailerを使うことにしました。

1. 随分前に更新が止まっていた
2. PHP5.5だと警告が出るという情報があった
3. 軽く試した結果いろいろエラーが出た（詳細はメモし忘れました）

##参考にした情報
・[Phpmailerでスパム回避！Gmail等のSMTPを経由するPHPのメールフォーム解説 | エス技研](http://blog.s-giken.net/235.html)
・[PHPMailer で GMail 送信 – Airwhite Memo](http://airwhite.net/?p=764)

 
#直面した問題

上記サイトのソースを参考に動かしてみたのですが、SMTP connect() failed.と表示され、送信できませんでした。


上記のサイトを見比べてもらえるとわかるのですが

・ポートが465だったり587だったり
・SSLだったりTLSだったり

この組み合わせを間違っているのが原因なのかなと推測したのですが、違ったようです。

##ちなみに 

公式サイトには

>ポート 465（SSL）とポート 587（TLS）

と書いてあるので、

・SSLを選択する場合はポート465を
・TLSを選択する場合は587を

選択するべきなようです。


#解決方法

Gmailにはセキュリティの関係上、**外部のサービスを使えないようにするような対策?**がされていたようです。

こちらにアクセスして安全性の低いアプリのアクセスをオンにするを選択してください。

https://www.google.com/settings/security/lesssecureapps


##反映されるまで時間がかかる可能性も？

これは推測なのですが、この設定が反映されるまで時間がかかるかもしれません。

というのも、動かなかったソースが上記の設定変更してすぐは相変わらず動かなかったのに、半日ほど放置して再度確認すると動くようになっていたからです。 

この設定が反映まで時間がかかるものなのか、それとも新規で作成したアカウントだったからなのか…
原因はわかりませんが…参考情報として記載しておきます。



#最後に動作したソースを貼っておきます

##準備

この三つを同一フォルダに入れておきます。

・PHPMailerAutoload.php
・class.smtp.php
・class.phpmailer.php

 

##ソース
```php
<?php
require_once ( 'PHPMailerAutoload.php' );
$subject = "タイトル";
$body = "メール本文";
$fromname = "誰から";
$from = "from@from.com";
$smtp_user = "gmailアカウント@gmail.com";
$smtp_password = "gmailのパス";
$fromaddress = "fromのアドレス";
$to = "宛先のアドレス";

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 1; // debugging: 1 = errors and messages, 2 = messages only
$mail->SMTPAuth = true;
$mail->CharSet = 'utf-8';
$mail->SMTPSecure = 'tls';
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->IsHTML(false);
$mail->Username = $smtp_user;
$mail->Password = $smtp_password; 
$mail->SetFrom($smtp_user);
$mail->From     = $fromaddress;
$mail->Subject = $subject;
$mail->Body = $body;
$mail->AddAddress($to);

if( !$mail -> Send() ){
	$message  = "Message was not sent<br/ >";
	$message .= "Mailer Error: " . $mail->ErrorInfo;
} else {
	$message  = "Message has been sent";
}

echo $message;

?>
```
Netbeans 8 をUbuntu 14.04へパッケージ管理を壊さずにインストール

#はじめに
Netbeansは[netbeans.org](http://netbeans.org) からアーカイブをDLしてきてインストール形態ですが、これではパッケージ管理から外れてしまい、好ましくありません。

そこでパッケージ管理を壊さずにインストールする方法を紹介いたします。
…と言っても特定PPAリポジトリを持ってくるだけではありますが。。。

執筆時点で、2015年11月時点の最新バージョン8.1をインストールできます。

# 1. PPAリポジトリを追加
`$ sudo add-apt-repository ppa:sainthyoga2003/netbeans`

# 2. 普通にapt-get

`$ sudo apt-get install netbeans`

# 3. 普通に実行
`$ netbeans`
UnityでuGUIのUIテストを自動化

これはUnity 4.6から導入された新UI、uGUIでのUIテストの自動化方法の紹介です。

## 前提
チームで開発をしていると困るのが動かなくなるコミット。
「何もしていないのに急に動かなくなった」「git pullしたらボタン遷移しなくなった」経験ありませんか？困りますよね？
そこでUIテストを自動化すればそのような悩みを少し解消できますよ！

## UIテスト自動化の仕組み
正常に動く時に「タップ操作を記録」して、随時「タップ操作の再生」を行い「テストの結果判定」で問題があれば通知する、という方法でやってみます。

## タップ操作の記録
単純に毎フレームタップイベントがないか判断します。[^1]
次にuGUIの「EventSystem.current.currentSelectedGameObject」を参照し、タップされたGameObjectを取得できます。
これでXY座標とGameObjectが手に入るので、タップ操作の記録ができました。
合わせてSystem.Diagnostics.Stopwatchを使ってタップ間隔も保持しておくと再生時に役立ちます。

```csharp
IEnumerator record()
{
    var timer = System.Diagnostics.Stopwatch.StartNew();
    while (true)
    {
        yield return null;
        if (!Input.GetMouseButtonDown(0))
        {
            continue;
        }

        var go = EventSystem.current.currentSelectedGameObject;
        if (go == null)
        {
            Debug.Log("クリックされたけどUI部品は見つからなかった");
            continue;
        }

        var p = Input.mousePosition;
        Debug.Log(string.Format("クリック座標={0}x{1} クリックされたGameObject={2} 経過時間={3}",
            p.x,
            p.y,
            go.name,
            timer.Elapsed.TotalSeconds));
    }
}
```

## タップ操作の再生
再生の方はuGUIのEventSystemを色々と使います。
まずPointerEventDataでイベントインスタンスを作って、そこにタップ座標などの情報を設定し、EventSystem.current.RaycastAll()で当たり判定を行い、第二引数のresultsにヒットしたUI要素の一覧が格納されます。
あとはresultsの各要素に対してExecuteEvents.Execute()でイベントを発行すればOK。

以下の例では指定したXY座標にあるuGUIのButtonコンポーネントのOnClick()が実行されるようイベントを送信します。[^1]

```csharp
void play(int x, int y)
{
    var ev = new PointerEventData(EventSystem.current);
    var results = new List<RaycastResult>();
    ev.position = new Vector2(x, y);
    ev.button = PointerEventData.InputButton.Left;
    EventSystem.current.RaycastAll(ev, results);
    foreach (var result in results)
    {
        ExecuteEvents.Execute<IPointerClickHandler>(
            result.gameObject,
            ev,
            (handler, eventData) => handler.OnPointerClick((PointerEventData)eventData));
    }
}
```

## テストの結果判定
EventSystem.current.RaycastAllで取得できる要素にGameObjectがありますので、このGameObjectが期待したものであればテストは成功、そうでなければテスト失敗としてもいいです。
さらにタップイベント送信時にApplication.CaptureScreenshotを使えば、自動でどんどんタップさせながら画面キャプチャを保存できテスト内容が視覚的に分かりやすくなります。画面キャプチャはテスト失敗時にも役立つでしょう。

## まとめ
非常に短いコードでタップの記録と再生が実装できました。
uGUIは本当に便利ですね！[^2]

[^1]: 動作確認しやすいよう左クリックでの判定でコードを載せましたがiPhoneとかで動作させるにはInput.Touchesを参照します
OSXでのsttyコマンド



UNIX(OSX)上でシリアル通信のボーレート設定を115200に変更をしたいのですがうまくいきません。

screenコマンドなどからであれば、115200で接続できているのですが、その方法ではなく、sttyでの変更が必要です。

$ stty - f /dev/tty.usbserial -115200 で設定できると思ったのですが、状態を確認すると下記の様に、9600から変わっていません。

$ stty -f /dev/tty.usbserial -a speed 9600 baud; 0 rows; 0 columns; ,,,,,, ,,,,,,

どの様にすれば、通信速度を変更することができるでしょうか。UNIX初心者なので、基本的な所から教えて頂けると幸いです。
CS-Cart: 翻訳の文中に変数を使う


CS-Cartで翻訳の文中で変数を使いたい場合、カギカッコを使う。

```ruby
msgctxt "Languages::you_can_upload_video_in_formats"
msgid "You can upload a video in [formats] format"
msgstr "アップロード可能形式: [formats]形式の動画"
```

Smartyテンプレートでは、変数は第二引数に値を指定する。

```smarty
{__("you_can_upload_video_in_formats", ["[formats]" => "MP4, MOV"])}
```

出力結果

```
アップロード可能形式: MP4, MOV形式の動画
```
jsでワンメトリクス（たった一つの指標）を求める

## ワンメトリクス（たった一つの指標）

2014年にSEOで有名なmozブログにワンメトリクス（たった一つの指標）についての記事があります。

該当記事URL: https://moz.com/blog/one-metric

もう2015年末ですが、この記事が公開された時にjavascriptでさっと実装したのでその紹介です。詳細については2015年にウェブ担で翻訳された記事を見る方が分かり易いです。

http://web-tan.forum.impressrd.jp/e/2015/01/05/19010

## jsfiddleでのデモ

このワンメトリクス算出の試せるデモをjsfiddleに設置しました。scoresの所をPVやセッションに読み替えると「なるほど」とイメージできるかと思います。

https://jsfiddle.net/tkosuga/fp72n2ff/

## ワンメトリクスを求めるScoring#scoreの使い方

使い方は単純で値の入った配列をクラス生成時に渡すだけです。後はScoring#score(value)でワンメトリクスが帰ってきます。

```js
var scores = [100, 80, 60, 40, 20, 0];
var scoring = new Scoring(scores);

$("#score1").html(scoring.score(scores[0])); // return -> 100.48863977235504
$("#score2").html(scoring.score(scores[1])); // return -> 84.20031393529594
$("#score3").html(scoring.score(scores[2])); // return -> 63.24648099782308
$("#score4").html(scoring.score(scores[3])); // return -> 33.83153079050539
$("#score5").html(scoring.score(scores[4])); // return -> -15.946724434026365
```

## Javascriptでの実装の説明

以下ワンメトリクスを実装したjavascriptのコードです。jQueryを使っています。

```js
/**
 *  Implemented the "Convert it to the One Metric score".  
 *  -> http://moz.com/blog/one-metric
 *  
 * usage:
 *  var scores = [100, 80, 60, 40, 20, 0];
 *  var scoring = new Scoring(scores);
 *  scoring.score(scores[3]); //
 */
$(function(){
  Scoring = function(scores) {
    this.init(scores);
  };
  $.extend(Scoring.prototype, {
    scores: [],
    average: 0,
    coefficient: 0,
    init: function(scores) {
      this.scores = scores;
      this.offset = 1.0 + this.scores.length / 2; // 0でinfinityを回避するため
      this.average = this.calculateAverage();
      this.coefficient = this.calculateCoefficient();
    },
    score: function(v) {
      var x = ((this.offset / this.scores.length) + v) / this.average;
      var a = 50 + Math.log(x) * this.coefficient;
      return a;
    },
    calculateAverage: function() {
      var total = this.offset;
      $.each(this.scores, function() {
        total += this;
      });
      return total / this.scores.length;
    },
    calculateCoefficient: function() {
      var max = Math.max.apply(null, this.scores);
      var upvLog = Math.log(max / this.average); // 自然対数を使う
      return 50 / upvLog;
    },
  });
});
```

係数を求める #calculateCoefficient かその係数を使う #score が使う人によって手を加える所になります。上記コードでは自然対数をそのまま利用しています。

## ワンメトリクスを使うメリット

ぼくは仕事で技術面に特化したSEOをしているので、こういった記事で書かれている事を実際に試して見たりプログラムをさっと書いて良さそうだったらツールに組み込んだりといった事をしています。

このワンメトリクスのように複数の数値を組み合わせ1つの相対的な数値として指標化すると格段に分かり易くなります。5教科を合わせた偏差値のようなもので、総合点で見ると順位付けもやり易くなります。

最近流行しているクラウドベースのBIツール（ビジネスインテリジェンス）やMAツール（マーケティングオートメーション）ではこういったワンメトリクス化された指標が多く使われていますよね。

## そこまで難しくない事が多い

これはmozブログであった内容を実装したものですが、SEO関連記事やSlideShareの資料ではなんだか難しいそうな数式が出てきたりデータ取得ツールの話が出てくる事が良くあります。

難しそうに見えるだけで実際に試して見るとそこまで難しくない事が多いので自分たちで試して見るか、もしくはSEOやアクセス解析はコンサルが入っている事も良くあるのでそのコンサルの人に依頼してやってみてもらうのも良いと思います。
[連載] WebVR入門 vol.2


ここ数日風邪で寝込んでいたのでおやすみしていました( ;´Д`)

遅くなりましたが、[WebVR Advent Calendar](http://qiita.com/advent-calendar/2015/webvr) 15日目の記事です。

-------------------------------------------

## WebVRに対応したブラウザ

前回はごく簡単な入門コードを紹介しました。
今回はブラウザについて紹介したいと思います。<del>決して手抜きではありません</del>

### Firefox 42

[[WebVR] 通常のWebサイトで利用するWebVR事例とその所感](http://qiita.com/edo_m18/items/492f4e1620bbcf7b14e3) でも書きましたが、2015.12.17現在、安定版で対応しているのはFirefoxのみとなります。

逆に言うとFirefoxをただインストールして、WebVRに対応したサイトを見るだけでVRコンテンツを見ることが出来ます。
（まぁもちろん、Oculus Riftなどのデバイスがなければ体験できませんが）

[追記]
すみません、VRを閲覧するには別途アドオンをインストールしてVRを有効化しないとなりませんでした。
アドオンはこちら → [https://addons.mozilla.org/en-US/firefox/addon/mozilla-webvr-enabler/](https://addons.mozilla.org/en-US/firefox/addon/mozilla-webvr-enabler/)

### Chromium WebVR版

[こちら](https://drive.google.com/folderview?id=0BzudLt22BqGRbW9WTHMtOWMzNjQ)からChromiumのWebVR実装をしたバージョンをダウンロードすることができます。

通常のChromiumではなく、WebVRに対応するべく特別に実装を施されたバージョンです。
こちらをダウンロードし、WebVRに対応したサイトに訪れればVRコンテンツを見ることができます。

今回は以上です。


・・・ではあまりにあれなので、余談としてWebVR（というかOculus Riftに代表されるVR）の仕組みについて記載したいと思います。


## Oculus Riftのハードウェア

- ディスプレイ
- トラッカー
- コントロールボックス

> 　Oculus Riftでは、画面中央を仕切って640×800に分割し、レンズを通して見ることで、このディスプレイを水平視野角90度（それまでの民生品は45度以下のものばかりだった）という高視野角のヘッドマウントディスプレイに仕立て上げている。

※ DK2ではフルHD（1920×1080）の5.6インチ有機ELパネルに変更されています。

![01_s.gif](https://qiita-image-store.s3.amazonaws.com/0/5616/a3f58336-1306-cc76-8aa4-aa47a334c752.gif "01_s.gif")


> Kickstarter成功の後、元AppleのNirav Patel氏が開発に加わり、彼が作ったオープンソースハードウェアのAdjacent RealityをOculus Rift向けに改良したオーダーメイドの品が用いられることになった。Adjacent Realityはもともと500Hzという高性能だったが、DK1などに搭載されているモデルでは1000Hzとさらに改良されている。

上記の写真を見てもらうと分かりますが、小さめのタブレットと同じ液晶が組み込まれ、それをレンズで歪ませて見る、という仕組みが取られています。
なのでレンズを外すと最近のスマホで見るような精細なピクセルを持つ液晶が姿を表します。
（上記写真の右側がまさにそれです）


## DK2スペック

| 項目 | スペック |
|-------|----------|
| パネル解像度 | 1920x1080 |
| 片目あたりの解像度 | 960x1080 |
| パネル方式 | 液晶 有機EL |
| 位置トラッキング | 赤外線方式 |

DK2の解像度に関しては、まさに最近のタブレットで使われているようなピクセル数となっています。
これを両目用、つまり半分ずつにすることで立体感を表現しています。

### 画面の分割

画面の分割は以下のようになっています。

![03_s.gif](https://qiita-image-store.s3.amazonaws.com/0/5616/afd89fb6-85bd-be5e-3692-895a787d8b11.gif "03_s.gif")

### 左右の画像の違い比較

![hikaku.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/4a2eb04e-752d-5fdb-9062-e7b1ce017a70.jpeg "hikaku.jpg")

![overlap.jpg](https://qiita-image-store.s3.amazonaws.com/0/5616/ac76c955-4aaf-2528-ecce-0d290e4f41d3.jpeg "overlap.jpg")

重ねて見ると分かりますが、すこーしだけ位置をずらしてレンダリングされているのが分かるかと思います。

## センサー

> Oculus Riftには1000Hzという、一般的なゲームソフトにおけるリフレッシュレート（秒間30／60フレーム）とは懸け離れて高速なセンサーが搭載されている。OculusのSDKでは3種類のセンサーから得られた情報を統合し、1000Hzのログから「描画フレーム時の頭の向きを予測する」機能や、現在地の地磁気を基にして補正を行い、「ドリフト」と呼ばれるセンサーのブレを防ぐ機能などが実装されている。

これらディスプレイやセンダーなどの仕組みを組み合わせてこの没入感が実現されている、というわけなんですね。
それにしてもすごい。製品版の発売が今から本当に楽しみです。


## 参考記事

- [WebVR Info](http://webvr.info/)
- [WebVR specification](http://mozvr.github.io/webvr-spec/webvr.html)
- [Oculus Rift Development Kitの基礎知識](http://www.buildinsider.net/small/oculusrift/01)
- [MOZVR](http://mozvr.com/)
- [WebVR(ブラウザーでVRデバイスが使用できるAPI)を軽く試して気づいたこと](http://qiita.com/gtk2k/items/7cca35b4dea58a9390cf)
ドラゴン曲線（Mathematicaショートフラクタルシリーズ）

## 今回のテーマ

Mathematicaショートフラクタルシリーズ、第4回は、僕が一番好きなフラクタル図形、[ドラゴン曲線](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E6%9B%B2%E7%B7%9A)（[ヘイウェイ・ドラゴン](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E6%9B%B2%E7%B7%9A#.E3.83.98.E3.82.A4.E3.82.A6.E3.82.A7.E3.82.A4.E3.83.BB.E3.83.89.E3.83.A9.E3.82.B4.E3.83.B3)）です。

## ほぼ完成形

```mathematica:dragon_normal.nb
Graphics[Line[
  {Re[#], Im[#]} & /@
  Join[
    {0}, 
    Accumulate[(-1)^(Nest[Join[# + 1, Reverse[#] - 1] &, {0}, 11]/4)]
  ]
]]
```

<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/butchi_y">@butchi_y</a> (More info: <a href="https://t.co/HBUuaZOB3w">https://t.co/HBUuaZOB3w</a>) <a href="https://twitter.com/hashtag/wolframlang?src=hash">#wolframlang</a> <a href="https://t.co/l58URrO4HJ">pic.twitter.com/l58URrO4HJ</a></p>&mdash; Tweet-a-Program (@wolframtap) <a href="https://twitter.com/wolframtap/status/677462731503632384">2015, 12月 17</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

## 原理

昨日の[コッホ曲線の記事](http://qiita.com/butchi_y/items/0e1c015f8c3d6955c88b)で紹介した「偏角関数」を今回も使います。

ドラゴン曲線の偏角が45度の何倍になるか
（nが偶数の時は0,2,4,8…の組み合わせ、nが奇数の時は1,3,5,7…の組み合わせ）のリストを

```mathematica
Join[# + 1, Reverse@# - 1] &
```

で求め、それを初期値``{0}``で$n$回ネストしています。
偏角のリストは以下のように増えていきます。

第0段階 ``{0}``
第1段階 ``{1,-1}``
``(=Join[{0}+1,{0}-1])``
第2段階 ``{2,0,-2,0}``
``(=Join[{1,-1}+1,{-1,1}-1])``
第3段階 ``{3,1,-1,1,-1,-3,-1,1}``
``(=Join[{2,0,-2,0}+1,{0,-2,0,2}-1])``
第4段階 ``{4,2,0,2,0,-2,0,2,0,-2,-4,-2,0,-2,0,2}``
``(=Join[{3,1,-1,1,-1,-3,-1,1}+1,{1,-1,-3,-1,1,-1,1,3}-1])``
…

偏角リストを見ながら法則性を探して試行錯誤しながらプログラムを書いていたのですが、``Reverse``を使うのは閃きでした。

## ショートコード化

コッホ曲線のとき同様、

- AccumulateとJoinを併用するよりPlusをFoldListした方が端的

というぐらいで、ほとんど変わりませんが、
これで83文字のプログラムができました。

```mathematica:dragon_short.nb
Graphics@Line[{Re[#],Im[#]}&/@FoldList[Plus,0,I^Nest[Join[#,Reverse@#+1]&,{0},14]]]
```

<blockquote class="twitter-tweet" lang="ja"><p lang="en" dir="ltr"><a href="https://twitter.com/butchi_y">@butchi_y</a> (More info: <a href="https://t.co/HBUuaZOB3w">https://t.co/HBUuaZOB3w</a>) <a href="https://twitter.com/hashtag/wolframlang?src=hash">#wolframlang</a> <a href="https://t.co/GQiB0bYXX4">pic.twitter.com/GQiB0bYXX4</a></p>&mdash; Tweet-a-Program (@wolframtap) <a href="https://twitter.com/wolframtap/status/677463231263342592">2015, 12月 17</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[Rosetta Code](http://rosettacode.org/wiki/Dragon_curve#Mathematica_.2F_Wolfram_Language)に載っているMathematicaコードよりも短く、
他の言語と比較してもかなり短いです。


## 予告

明日は、ドラゴン曲線を重ねただけではありながら趣深い[ツインドラゴン](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A9%E3%82%B4%E3%83%B3%E6%9B%B2%E7%B7%9A#.E3.83.84.E3.82.A4.E3.83.B3.E3.83.89.E3.83.A9.E3.82.B4.E3.83.B3)です。
NumPyで行列演算をしてみる

岩手県立大学アドベントカレンダー17日目です！お疲れ様です、Jack (@kazuhikoyamashita)です。
最近のマイブームはPythonです。今回は、numpyを利用して行列演算をしてみます。

# NumPyとは
NumPyとは、数値計算を行うための拡張モジュールです。
詳細は下記リンクをご覧ください。
http://www.numpy.org/

# pipをインストールしましょう
numpyをインストールするには、pipコマンドが必要です。
pipコマンドをインストールするには、easy_installでインストールしましょう。
下記コマンドを入力してください。

```zsh
% easy_install pip 
```

# pipコマンドでnumpyをインストールする
numpyをインストールするには、下記コマンドを実行します。
今回インストールされたnumpyのバージョンは1.10.2です。

```zsh
% pip install numpy
Collecting numpy
  Downloading numpy-1.10.2-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (3.7MB)
    100% |████████████████████████████████| 3.7MB 133kB/s 
Installing collected packages: numpy
Successfully installed numpy-1.10.2
```

# 使ってみる
m1とm2という行列を用意し、和差積商とm1の逆行列を求めてみます。
プログラムは下記となります。

```py3
# -*- coding: utf-8 -*-
import numpy as np
from numpy import linalg as la

m1 = np.matrix('1 2; 3 4')
m2 = np.matrix('5 6; 7 8')

# 和
print("#### 和")
print(m1 + m2)

# 差
print("#### 差")
print(m1 - m2)

# 要素同士の積
print("#### 要素同士の積")
print(m1 * m2)

# 要素同士の商
print("#### 要素同士の商")
print(m1 / m2)

# m1の逆行列
print("#### m1の逆行列")
print(la.inv(m1))
```

出力結果は下記となります。
逆行列が簡単に計算できて便利ですね。

```zsh
% python sample.py
#### 和
[[ 6  8]
 [10 12]]
#### 差
[[-4 -4]
 [-4 -4]]
#### 要素同士の積
[[19 22]
 [43 50]]
#### 要素同士の商
[[ 0.2         0.33333333]
 [ 0.42857143  0.5       ]]
#### m1の逆行列
[[-2.   1. ]
 [ 1.5 -0.5]]
```

以上！
AssumeRole で得られたクレデンシャルを環境変数に入れる

最近、複数の AWS アカウントで個別に IAM User を作成するのではなく、IAM User をまとめた AWS アカウントを1つ設けて、その他の AWS アカウントには IAM Role だけ作って Role の切り替えで運用するようにしてみました。

## ロールの切替

マネジメントコンソールで操作するときは画面右上のユーザー名が表示されたところから切り替えができます。

AWS CLI は、`.aws/credentials` を次のように記述し、`--profile bar` のようにプロファイル名をオプションにつければ OK です（もしくは `AWS_DEFAULT_PROFILE` 環境変数）。

**.aws/credentials**

```ini
; スイッチする元
[foo]
; アクセスキー
aws_access_key_id = AKI...
; シークレットキー
aws_secret_access_key = abc123...

; スイッチする先
[bar]
; スイッチする元のプロファイル名
source_profile = foo
; ロールの arn（アカウントナンバーとロール名）
role_arn = arn:aws:iam::999999999999:role/developer
```

AWS SDK でも、プロファイル名を SDK で指定するなり、`AWS_PROFILE` 環境変数を設定するなりすれば大丈夫です。

.

.

.

と、思っていたのですが、boto-2.38.0 だと `AWS_PROFILE` 環境変数を設定してもダメでした・・・

AWS SDK は `.aws/credentials` に記述した `source_profile/role_arn` によるロールの切り替えには未対応なのかな？ それとも boto3 とかなら大丈夫なのかな？

## AssumeRole で得たクレデンシャルを環境変数に入れる

AWS SDK は Ansible のダイナミックインベントリで boto をちょっと使っているだけで、それ以外はほとんど AWS CLI なので、とりあえず Ansible を実行するときは直前に下記を実行して AssumeRole して得られたクレデンシャルを環境変数に設定することにしました。

```sh
eval "$(aws sts assume-role --role-session-name oreore --profile foo \
  --role-arn arn:aws:iam::999999999999:role/developer \
  --query '[Credentials.AccessKeyId, Credentials.SecretAccessKey, Credentials.SessionToken]' \
  --output text | (
  read AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SECURITY_TOKEN
  export AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SECURITY_TOKEN
  declare -p AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SECURITY_TOKEN))"
```

## direnv の .envrc に仕込む

direnv の `.envrc` に↑を仕込もうとするとなぜか上手く変数が設定されませんでした（謎）。

ので、`.envrc` には次のように書いています。

```sh
credentials=($(aws sts assume-role --role-session-name oreore --profile foo \
  --role-arn arn:aws:iam::999999999999:role/developer \
  --query '[Credentials.AccessKeyId, Credentials.SecretAccessKey, Credentials.SessionToken]' \
  --output text))
export AWS_ACCESS_KEY_ID=${credentials[0]}
export AWS_SECRET_ACCESS_KEY=${credentials[1]}
export AWS_SECURITY_TOKEN=${credentials[2]}
```

これで、`.envrc` の置いているディレクトリに cd すれば自動的にクレデンシャルが取得されて環境変数に設定されます。
localhostでffmpegコマンドがつかえなかった件


[Apache の環境変数 PATH について](http://blog.netandfield.com/shar/2009/09/apache-path.html)
[macのapacheに環境変数を渡す方法](http://d.hatena.ne.jp/shokai/20111219/1324317644) <-自分の環境では[disabled] keyがついていて、できないっぽかった。[参考](http://nozawashinichi.sakura.ne.jp/usingmt/2013/09/apachepath.html)

## proplem
macにffmpegをインストールした。
ローカルだと、ffmpegコマンドはアクティブなのに、サーバーからは使えなかった。

## reason
homebrew経由でインストールしたので、ffmpegはusr/local/binにパスが通っていた。

しかし、サーバーの環境変数$PATHには usr/local/binは通っていない。
そもそもアカウントが違う（local:atom , server:_www）から当然か？
\-- 2015/12/17 追記:　違うっぽい。です。

しかし、httpd.confにSetEnv, PassEnvしてもだめ。
mac設定のplistをいじってもだめ。
場当たり的だが、以下で解決

## solution
python上で環境変数追加。

```python:python
import os
os.environ['PATH'] = '/usr/local/bin'
```
/etc/services に setenvでもいけるらしい。
Railsのルーティング

## `resourcesメソッド` （リソースフル）
**`resources :users`**
7つ生成される

|Prefix|Verb|URI Pattern|Controller#Action|用途|コレクションルート/メンバールート|
|:-----------|:-----------|:-----------|:-----------|:-----------|:-----------|
| users | GET |/users(.:format)|users#index|一覧ページ表示用|コレクションルート|
| | POST |/users(.:format)|users#create|新規処理用|コレクションルート|
| new_user | GET |/users/new(.:format)|users#new|新規ページ表示用|コレクションルート|
| edit_user | GET |/users/:id/edit(.:format)|users#edit|編集（更新）ページ表示用|メンバールート|
| user | GET |/users/:id(.:format)|users#show|1件表示用|メンバールート|
| | PUT |/users/:id(.:format)|users#update|編集（更新）処理用|メンバールート|
| | DELETE |/users/:id(.:format)|users#destroy|削除処理用|メンバールート|

## `resourceメソッド` （ノンリソースフル）
**`resource :page`**
6つ生成される

|Prefix|Verb|URI Pattern|Controller#Action|用途|
|:-----------|:-----------|:-----------|:-----------|:-----------|
|  | POST |/page(.:format)|users#create|新規処理用|
| new_page | GET |/page/new(.:format)|page#new|新規ページ表示用|
| edit_page | GET |/page/edit(.:format)|page#edit|編集（更新）ページ表示用|
| page | GET |/page(.:format)|page#show|1件表示用|
|  | PUT |/page(.:format)|page#update|編集（更新）処理用|
|  | DELETE |/page(.:format)|page#destroy|削除処理用|

## `collectionメソッド` 独自のコレクションルートを生やす
```rb
resources :users do
  collection do
    get :search
  end
end
```

## `memberメソッド` 独自のメンバールートを生やす
```rb
resources :users do
  member do
    get :profile
  end
end
```

## `shallowオプション` 子のメンバールートを親を通さずアクセスできるようにする
```rb
resources :users, shallow: true do
  resources :comments
end
```

親子関係に組み込まれるかどうか（今回は`comments`のアクションについて)

|Action|親子関係に組み込まれる/組み込まれない|
|:-----------|:-----------|
|index|組み込まれる|
|create|組み込まれる|
|new|組み込まれる|
|edit|組み込まれない|
|show|組み込まれない|
|update|組み込まれない|
|destroy|組み込まれない|

## `namespaceメソッド` スコープとモジュールを変更
個別に`scopeメソッド`と`moduleオプション`を指定するのを一気にやってくれる。基本的に個別の`scope`と`module`は使わず、`namespace`を使うことなると思う。
コントローラをディレクトリを作って綺麗に階層構造を作ってる時にURLとディレクトリ構造を合わせたい時に使用。

```
namespace :admin do
  resources :users
end
```

## 参考
* [ルーティング(routes) - - Railsドキュメント](http://railsdoc.com/routes)
* [Amazon.co.jp： 徹底攻略Rails4技術者認定シルバー試験問題集: 株式会社システムシェアード 山田裕進, 株式会社ソキウス・ジャパン: 本](http://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Rails4%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E3%82%B7%E3%83%AB%E3%83%90%E3%83%BC%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B7%E3%82%A7%E3%82%A2%E3%83%BC%E3%83%89-%E5%B1%B1%E7%94%B0%E8%A3%95%E9%80%B2/dp/4844337238/ref=sr_1_1?ie=UTF8&qid=1450328149&sr=8-1&keywords=rails4+%E8%A9%A6%E9%A8%93)
Pepper WebAPI連携解説 Pepperアプリ開発・プログラミング未経験者向け

初めてQiitaにて投稿させて頂きます。

本記事は次のような方を対象としています。
- プログラミング未経験
- Pepperアプリを開発してみたい
- 外部のWebAPIを使ってみたい
上記に当てはまる方向けに解説させていただきます。わかりにくい点などが出てくることかと思いますが、コメントにて質問していただければと思います。また、不備等ありましたらそちらもコメントでご指摘頂きますと幸いです。

#本記事について
今回はPepperアプリにてWebAPIを使う方法を紹介します。
なので、本記事を読んでいただければ最近Pepperに触れ始めた方でもWebAPI連携ができるように知識をつけていただけるのではないでしょうか。
詳しい用語の解説が必要な方は以下の参考サイトを見ていただければ本記事も読みやすくなるのではないかと思います。

#参考
PepperのHTTP通信にRequestsを使う
http://qiita.com/bugcloud/items/6631b2a534446393e214
【Pepper】お天気APIとの連携
http://qiita.com/yamarobo/items/e57cb2e3f5ac21464bfa

上記のサイト様を参考にさせていただきました。
また、本記事ではyamarobo様の記事を使わせて頂き、さらにそれを対象者向けに解説させて頂きます。

#開発環境
Mac OS X El capitan 10.11.1
Choregraphe 2.4.2
Python 2.7.10

#使用API
Open Weather Map API

#WebAPIとは
Web上で他のサービスを取り扱う規約のことを指します。
基本的にはデータやサービスを提供しています。
要求(Request)をサーバへ送信し、要求を処理して得られた結果(Response)を送り返す仕組みです。
基本、要求と結果には形式が決まっており、それぞれ要求はRESTで、結果はJSONやXMLで扱われています。

WebAPIはAndroidやiOS、Windowsなどの各種OSなどのプラットフォーム、ロボット組み込み系プログラムに至るまでたくさんのコンピュータプログラムで利用することができます。

現在公開されているWebAPIはかなり多く存在しています。
例えば、天気予報、災害情報、論文検索に至るまで様々なWebAPIが提供されています。
上記に上げたWebAPIはすべて利用することができます。(中にはAPIキーと呼ばれるアクセスするための鍵を取得しなければならないものもありますが。
これらを使うことにより、Pepperアプリだけでなく製作するアプリがよりリッチなものとなります。

#WebAPI連携とは
前述したAPIとプラットフォーム側プログラムを組み合わせることをAPI連携といいます。
また、API同士を組み合わせることをマッシュアップとも言います。
そのプラットフォームだけでは実現や表現が難しい部分をAPIを使うことにより簡単に補うことができます。

#Pepperと連携するには
本来はPepperをプラットフォームとして使うには以下のことを理解しなければなりません。
- APIアクセスの方法
- Choregrapheのボックス操作
- ChoregrapheでのPythonボックスについて
- PythonによるHTTPリクエスト生成方法

#WebAPI連携するアプリケーションのフロー例
APIアクセスは、必ずアプリ起動時にしなければならない、などの制約はありません。
ですので、アプリ内で好きな時にAPIにアクセスし、必要データを持ってくることができます。
例えばyamarobo様のサイトで製作されていたアプリを例に取りますと、以下のようなフローになっていることがわかります。
1. アプリ起動時にPepperの言語設定を日本語に変更する
2. HTTP通信を行う(GET通信、POST通信)
3. 通信によって取得したデータをパース(解析)する
4. パース結果をPepperに喋らせる

また、Choreographはボックスを繋げたものがアプリのフローと見ることができるので
プログラムとは違い、視覚的に直感的にアプリの遷移を確認できることだと思います。
例えば、yamarobo様のプログラムをお借りしまして、よりユーザに使いやすいPepperらしさを出したアプリを作成するとなると以下のようなフローとなります。
画像は実際に作成したアプリの画像となります。
1. アプリ起動時にset Languageボックスにて言語設定をJapaneseにする
2. Sayボックスを使い、「今日と明日の天気を知りたいですか？」と言わせる。
3. Speech Reco.ボックス、Switch Caseボックスを使い、ユーザの「はい」もしくは「いいえ」を聞いてそれに応じた条件によって遷移する
4. もし「はい」であった場合にはyamarobo様のアプリと同じように天気予報を喋る
「いいえ」であったら「そうですか、またのご利用を待っています！」と喋らせる
5. アプリ終了
![ 2015-12-17 20.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/91842/570debef-195a-19dd-0a50-890348f51f0b.png)

#終わりに
今回はPepperを使ったAPI連携について書かせいただきました。
本記事を読んでいただいて、Pepperアプリ開発者並びにdeveloperの方が増えていただければ幸いです。また、興味が持った方がいらっしゃいましたら是非取り組んでいただきたいと思います。
また、今回解説した内容に関してはこの記事だけでなく様々な方が解説しています。
今回解説した内容だけでは満足できない方、もっと色々なAPIを使った解説を見てみたい方はQiita並びに色々なサイトをご覧いただければと思います。
長文となってしまい、わかりにくい点があったことと思いますが最後までおつきあいいただきましてありがとうございます。
最後に皆様のご活躍と発展を心よりお祈り申し上げ、終わりとさせていただきます。

2015年12月17日
配列の切り詰め


末尾の '' な要素を切り詰める


```perl:test.pl
use Benchmark qw( cmpthese timethese ) ;
my @arr =( 'A' .. 'C', '', 'D' .. 'F', (q{}) x 20 ) ;


sub trancate_array1 {
    my @dat = @arr ;
    pop @dat while @dat != 0 and $dat[-1] eq '' ;
    return @dat ;
}

sub trancate_array2 { 
	my @dat = @arr ;
    return split /,/, join ",", @dat ;
}

cmpthese(timethese (undef, {
    1 => 'trancate_array1',
    2 => 'trancate_array2',
}));

```

結果

```
Benchmark: running 1, 2 for at least 3 CPU seconds...
         1:  3 wallclock secs ( 3.15 usr +  0.00 sys =  3.15 CPU) @ 138735.24/s (n=437016)
         2:  3 wallclock secs ( 3.10 usr +  0.00 sys =  3.10 CPU) @ 101569.03/s (n=314864)
      Rate    2    1
2 101569/s   -- -27%
1 138735/s  37%   --
```

trancate_array1 の方が早いが、これは代入コストを同じにしたから。
trancate_array2 は、無意味な `@dat` への代入を省略すれば[^1]、trancate_array1 よりも速くなる。

[^1]: `sub trancate_array2 { return split /,/, join ",", @arr }`
perldoc でトークンを索く。


perldoc が多少ましになっているのに、

http://perldoc.jp/docs/perl/5.16.0/perl5160delta.pod#perlfunc

なんの宣伝もされていなかった。ってメモ。

## 5.16 以降（？）
では、 perldoc perlfunc でトークンやら、フロー制御キーワードやらが検索出来る。

```
$ perl -v | head -2

This is perl 5, version 16, subversion 3 (v5.16.3) built for darwin-2level
$ perldoc -V
Perldoc v3.17, under perl v5.016003 for darwin
```

```
$ perldoc -f while
    while   These flow-control keywords are documented in "Compound Statements" in perlsyn.

```

「詳しくはWebで！」的に放り投げてるのばかりだけれど、それすら無かったのだから、かなりまし。

```
$ perldoc -f __PACKAGE__
    __PACKAGE__
            A special token that returns the name of the package in which it occurs.


```
、、、中には、こんなのもあるけど。

### 演算子
```
$ perldoc -f and
    and
    cmp
    eq
    ge
    gt
    le
    lt
    ne
    not
    or
    x
    xor     These operators are documented in perlop.

   perlsub
```

記号系 `+,-,*,/, ...` を記載してない中途半端さが、また、、、


## 5.12 以降（？）

特殊変数の検索が出来る。

```
$ perl -v | head -2

This is perl 5, version 12, subversion 5 (v5.12.5) built for darwin-2level
$ perldoc -V
Perldoc v3.15_02, under perl v5.012005 for darwin
```

```
$ perldoc -v '$ARGV'
       $ARGV   contains the name of the current file when reading from <>.
```
ヤダヤダ演算子


今っつっても5.16くらいの時にメモったの。


### 5.12 ヤダヤダ華々しく

http://perldoc.jp/docs/perl/5.12.1/perlop.pod#Yada32Yada32Operator

### 5.14 あれ？

http://perldoc.jp/docs/perl/5.14.1/perlop.pod#The32Triple-Dot32Operator

ヤダヤダって名前がヤダったんだろーな。
>と呼ばれることもあります

いや、思いっ切り公式名称でしたやん。


### 5.16 消えました。

http://perldoc.jp/docs/perl/5.16.1/perlop.pod

http://perldoc.jp/docs/perl/5.16.0/perl5160delta.pod

デルタには何も書かれていません。

こーやって闇を増やすなよ、、、



## code

今現在でも挙動はする。
けど、必要性は皆無。

`B::Deparse` すりゃわかる通り、サブルーチンコード内で使えたとしても、呼ばなきゃ die しない程度のもん。
コード書き始めのスニペットに使うくらいしか使い道がない。

```perl:test.pl
sub under_construction{ ... }
...;

print "foo\n" ;

```

```
$ perl test.pl -MO=Deparse
sub under_construction {
    die 'Unimplemented';
}
die 'Unimplemented';
print "foo\n";
- syntax OK
```

```
$ perl test.pl
Unimplemented at - line 2.
```
正しい複数行コメント


>perl の複数行コメントは、Pod の書式を利用します。

ってんで、

1. `=for comment` ... `=cut`[^1]
2. `=pod` ... `=cut`[^2]
3. `=begin comment` ... `=end comment\n\n=cut`[^3]

の3通り[^4]が `perldoc` で紹介されている訳なんだけど、
`perldoc test.pl` した時に表われない、3番目を使いましょう。


いや、3番目をいつも使ってたのに、過去のスクリプトで1番目が出て来て混乱したので、、、

ちなみに1番目は、「`=for comment` 直下の一段落だけ、perldoc がスルーしてくれる」だけなので、使いにくい。
汚なかろーが、3番目が一番確実に無視してくれる。

```perl:test.pl
=head1 test.pl

=encoding utf8

test.pl - pod 表示のテスト

=cut

print "code\n" ;

=for comment
こっからコメントしてる訳
なんだけど、

ここから現われる。

=cut

print "code\n" ;

=begin comment

ぜーんぶ

無視

して

くれる。

=end comment

=cut

print "code\n" ;

__END__
```

```
$ perldoc test.pl
test.pl
    test.pl - pod 表示のテスト

    ここから現われる。

```

[^1]: http://perldoc.jp/docs/perl/5.20.1/perlpod.pod の `=for comment` の所
[^2]: http://perldoc.jp/docs/modules/perlfaq-5.0150043/perlfaq7.pod#How32can32I32comment32out32a32large32block32of32Perl32code63
[^3]: 2 に同じ
[^4]: もっとあるかも知れんけど
Attribute


初期値代入程度に、軽く利用する場合。

#### まず最初に。

Attribute には小文字と大文字が混ったのにしろとさ。

>%s package attribute may clash with future reserved word: %s
(W reserved) パッケージ固有のハンドラが、小文字の属性名を使っています。 この名前は、たとえ今は使っていなくても、 Perl 自身がいつか使うかもしれません。 おそらく代わりに大文字小文字の混じった属性名を使うべきでしょう。 attributes を参照してください。
[[引用元](http://perldoc.jp/docs/perl/5.20.1/perldiag.pod)]

大文字小文字混ぜるの好きじゃないから '_' とか数字とかを入れて回避してます。

## code に関しては

code の上書きは出来ません、未定義だから。

```
sub MODIFY_CODE_ATTRIBUTES {
    my ( $class, $ref, @attrs ) = @_ ;
    $ref = sub { print "test\n"} ;
    return ;
}

sub c :code1 {}
my $code = sub :code2 {} ;
    
c ;
$code->() ;

```
これを実行しても何もプリントされません。
初期値代入とかの目的には似わない。


## code 以外

```perl:test.pl
use Data::Dumper ;

sub MODIFY_HASH_ATTRIBUTES {
   my ( $class, $ref, @attrs ) = @_ ;
   @{$ref}{'test','test2'} = qw( test test2 );
   print Dumper \@attrs ;
   return ;
}

sub MODIFY_ARRAY_ATTRIBUTES {
   my ( $class, $ref, @attrs ) = @_ ;
   @{$ref}[0,1] = qw( test test2 );
   print Dumper \@attrs ;
   return ;
}

sub MODIFY_SCALAR_ATTRIBUTES {
   my ( $class, $ref, @attrs ) = @_ ;
   ${$ref} = "test";
   print Dumper \@attrs ;
   return ;
}


my %c :hash_ ;
my @c :array_ ;
my $c :scalar_ ;

print Dumper \%c;
print Dumper \@c ;
print Dumper $c ;
```

実行してみると。

```
$ perl test.pl
$VAR1 = [                     
          'hash_'             
        ];                    
$VAR1 = [                     
          'array_'            
        ];                    
$VAR1 = [                     
          'scalar_'           
        ];                    
$VAR1 = {                     
          'test2' => 'test2', 
          'test' => 'test'    
        };                    
$VAR1 = [                     
          'test',             
          'test2'             
        ];                    
$VAR1 = 'test';               
```
line monitor > 情報表示部分 (v0.4-v0.7) > 7セグLEDでのIPadr表示 > v0.7: 100と10を区別できるように、150msecのオフを追加

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:動作環境
Raspberry Pi2 + raspbian
7セグメントLEDシールド (自作)
```

## プログラム

[v0.7 @ github](https://github.com/yasokada/python-151127-7segLed_IPadrDisplay/releases/tag/v0.7)

v0.4以降の変更は以下

- v0.4 > IP切断時に"0.0.0.0"として表示する
- v0.5 > IPを起動時だけでなく、定期的に取得
  - 接続、切断に対応
- v0.6 > wlan0に対応. Wi-Fi接続用。
- v0.7 > 100と10の表示を区別するため、各数値の後に150msecの表示オフを追加