OmniAICreator/Qiita-1.07M huggingface dataset:
PepperのPython SDKでバーチャルロボットにさわる

今年はPepperくんとお仕事をする機会をいただきまして、なかなかおもしろい経験をさせていただきました。
Pepperくんはハードウェア的にも、ソフトウェア的にも面白いのですが、いかんせんまだ数が少ない。アルデバラン・アトリエ秋葉原にはPepperくんが数体いるのですが、実験したい人の数に比べると足りない感は否めないわけです。(あと近隣ではないとかでなかなか足を運べない方も多いのでないかと)

そこで、バーチャルロボットでできることはバーチャルロボットで極力やっておきたい、ということで今回は[Python SDK](http://qiita.com/Atelier-Akihabara/items/3289e60985586b8da709)をバーチャルロボットでさわってみたのでそのメモ。

#Python SDK(NAOqi for Python)

[Python SDKによるsay hello (Pepper TechFes技術セッション)](http://qiita.com/Atelier-Akihabara/items/3289e60985586b8da709)で説明があるとおり、Pepperくんに対しては `ALProxy` クラスを介してPepperくんの`9559`ポートに接続することで、APIをリモートで操作することができる。

これをバーチャルロボットでもやりたいのだがどうすればよいか。
ここで、Pepper上の `9559` ポートでlistenしているのがNAOqiというサービスなわけだけれども、バーチャルロボットもきっとローカルで動くNAOqiなのだよねえと想像できる。さてどこでlistenしているのだろうか・・・

#バーチャルロボットがlistenしているポート

結論から言うと、バーチャルロボットもPepper実機同様にNAOqiが動いていて、あるポートでlistenしていて、Choregrapheはこのポートを介してローカルNAOqiに接続して「バーチャルロボット」として見せているよう。
具体的にこのポートを知るには、 **[編集]メニューの[設定]をクリックし、[バーチャルロボット]タブを開けばよい。** ここの **[NAOqiの状態]** というのがバーチャルロボットのサービスの情報を示している。以下の場合は `64695` ポートで動作している。

![virtualrobot-port.png](https://qiita-image-store.s3.amazonaws.com/0/28770/a1279fe7-78e6-dd58-4459-98f0c5f01c7e.png)

この状態で、インストールしたPython SDKからlocalhostの `64695` ポートのNAOqiをさわると、Python SDKを経由してバーチャルロボットをいじることができた。たとえばこんな感じ。

```py
C:\>python
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from naoqi import ALProxy
>>> motion = ALProxy("ALMotion", "localhost", 64695)
[I] 3448 qi.eventloop: Creating event loop while no qi::Application() is running
[I] 3448 qimessaging.session: Session listener created on tcp://0.0.0.0:0
[I] 3448 qimessaging.transportserver: TransportServer will listen on: tcp://127.0.0.1:65302
>>> motion.moveTo(1.0, 0.0, 0.0)
```

上の例では、`ALMotion.moveTo(X, Y, theta)` に対して `moveTo(1.0, 0.0, 0.0)` を指定しているので、前に向かって1m動く。
動画としてはこんな感じ。

[![PepperのバーチャルロボットをPython SDKでいじる](http://img.youtube.com/vi/yfyfkBcqvrI/0.jpg)](https://www.youtube.com/watch?v=yfyfkBcqvrI)

#他のやり方とか

この後ドキュメントを調べてみると、Choregrapheをインストールしたフォルダの `bin/naoqi-bin.exe` を実行する方法もあるっぽい。この場合は、ローカルの`9559`ポートでlistenするみたい。
まあ、[Connect to virtual robot using Python scripts](https://community.aldebaran.com/ja/node/1117)でも同じようなことを言っている人がいるので、今回書いた方法もアリなんではないかと。

まあ、[バーチャルロボットでできること](http://qiita.com/Atelier-Akihabara/items/a6a97c717c5f96daff1d)は限られているんですけれども、Python SDKの動作もほどほど試すことができるのでちょっと面白いのではないかと思います。
zabbix_senderをソースから作る手順

# 概要
`zabbix_sender`をソースコードからビルドする手順。

## 背景
Pidora release 2014で`zabbix_sender`を使おうとしたら、バイナリパッケージが配付されていなかった。手動でビルドする必要に迫られたので、その時の手順をまとめる。

## 手順

Zabbixの[ダウンロード・ページ](http://www.zabbix.com/download.php) からソースコードのtar.gzを取得し、展開する。バージョンは都度更新されているので、注意すること。

```
$ wget http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.4.2/zabbix-2.4.2.tar.gz
$ tar xvfz zabbix-2.4.2.tar.gz
$ cd zabbix-2.4.2
```

`zabbix_sernder`のみが欲しい場合、ドキュメントによると次のように書かれている。

> Command-line utilities zabbix_get and zabbix_sender are compiled if --enable-agent option is used. 

この内容に従って `--enable-agent` を指定し、`make`の後、バイナリをパスが通った場所へ展開する。

```
$ ./configure --enable-agent
$ make
$ sudo cp ./src/zabbix_sender/zabbix_sender /usr/local/bin/
```

##捕捉

`zabbix_get`も同様にして、ソースコードからバイナリを作成できる。
' '

AVX-512 は、演算のオペランドがメモリの場合、スカラ値をブロードキャストできます。

つまり、条件によっては、_mm512_set1_ps( *mem ) は、コスト無しで実行できます。(今日のタイトルは命令が出ない！という意味でした(わかりづらい))

```cpp
float x;
void
f(float *p, __m512 a)
{
    __m512 b = _mm512_add_ps(a, _mm512_set1_ps(x));

    _mm512_storeu_ps(out, b);
}
```
は、

```gas
f:
.LFB2214:
	.cfi_startproc
	vbroadcastss	x(%rip), %zmm1
	vaddps	%zmm1, %zmm0, %zmm0
	vmovups	%zmm0, out(%rip)
	ret
```

このように、vaddps で broadcast していることが確認…でき…ない…？


本当なんです！信じてください！メモリをオペランドに取る場合はブロードキャストできるんです！お願いします！信じてください！！


llvm のtrunkで試したら出た。

```gas

f:                                      # @f
	.cfi_startproc
# BB#0:
	pushq	%rbp
.Ltmp0:
	.cfi_def_cfa_offset 16
.Ltmp1:
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
.Ltmp2:
	.cfi_def_cfa_register %rbp
	andq	$-64, %rsp
	subq	$64, %rsp
	vmovaps	16(%rbp), %zmm0
	vaddps	x(%rip){1to16}, %zmm0, %zmm0   ## {1to16}がついてる
	movw	$-1, %ax
	kmovw	%eax, %k1
	vmovups	%zmm0, out(%rip) {%k1}
	movq	%rbp, %rsp
	popq	%rbp
	retq
```
1to16 が付いてるオペランドがブロードキャストされますね。しかしllvmさん無駄な命令出過ぎでは…(というかcalling conventionがGCCと一致してなくね？)


また、全てのオペランドがベクタレジスタに乗った512bit値、もしくはスカラ値の場合、追加の命令無しで演算の丸めを制御できます。

```cpp

__m512
f(__m512 x)
{
    return _mm512_add_round_ps(x,x,_MM_FROUND_NO_EXC|_MM_FROUND_TO_NEAREST_INT);
}
```

```gas
f:
.LFB2211:
	.cfi_startproc
	vaddps	{rn-sae}, %zmm0, %zmm0, %zmm0
	ret
```


EVEXについて書く予定は無いと書いてましたが、それなりに調べてしまったので明日は@tanakmuraがEVEXについて書きます。
SwiftでCGFloatをNSLogに表示するときの注意点

SwiftでCGFloatの値をNSLogで%fで表示しようとすると不正な値が表示されます。
String(format:)でも同様です。
Xcode6.1.1 で検証。

例えば、以下の様なコードで0.00000と表示されます。

```swift
        let a : CGFloat = 3.14
        NSLog("%f", a)
        let s = String(format: "%f", a)
        NSLog("%@", s)

```
実行結果：
2014-12-17 05:48:05.783 SfLogTest[5597:957937] 0.000000
2014-12-17 05:48:05.785 SfLogTest[5597:957937] 0.000000

そろらくバグだと思われるのでいずれ修正されると思いますが、知らないとハマりますので注意しましょう。
回避策は色々ありますが、.nativeを付けておくのが無難だと思います。

```swift
        let a : CGFloat = 3.14
        NSLog("%f", a.native)
```
実行結果：
2014-12-17 06:00:02.355 SfLogTest[5843:975719] 3.140000
【FileMaker】行番号を追加したい

FileMakerをやり始めた当初、リストやポータルのレイアウトを作成しているとき非常に探したこと。

**行番号はどうやって追加するんじゃー！？**

ありませんでした？
私だけですかね？

こうなります。
![1217_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bf83515d-09ab-2c7b-39b9-f55f847dd9ad.png)

挿入＞レコード番号

をクリックするだけ。
出来上がったとき、Google検索していた時間を返してくれって感じでした^^;;;

しかけとしては、

Get(レコード番号)

が使われているだけですので、スクリプトでリストを表示する際や表示順をテーブルに保存したい時などにも覚えておくと便利です。

はい、できあがりです。
![1217_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/09f450e7-3e7c-cc59-aacf-7f55408d3523.png)
StackEditで相互参照をするExtension

[追記あり]

まずはStackEditの紹介から。StackEditはブラウザで動作するMarkdownエディタです。非常によく出来ていて、僕が知る中では最高のMarkdownエディタです。

[StackEdit](http://stackedit.io)

StackEditはextensionとして各自自由に機能を追加することが出来ます。ExtensionはJavaScriptで記述します。

GitHubのドキュメントに開発者向けの記述があります。

[Developer guide](https://github.com/benweet/stackedit/blob/master/doc/developer-guide.md#module-injection)

とまあ読んでもらえればわかると思いますがただのextensionだけでなくStackEdit本体のコードをいじって更なる機能追加もできるようです。ですが今回はとりあえず標準で行えるExtensionだけで機能を追加します。

本題に入ります。今回やりたいのは図表番号の相互参照です。TeXやWordにはある機能ですがMarkdownには存在しません。そのため相互参照をしたければ独自に拡張するしかありません。ちょっとしたレポートをMarkdownでささっと書けたら便利に違いないと思いなんとか実装してみたというわけです。

とりあえずコードはこんな感じになりました。

```js
userCustom.onPagedownConfigure = function(editor) {
    var converter = editor.getConverter();
    var figStack = [];

    converter.hooks.chain("preConversion", function(text) {
        figStack.length = 0;
        return text.replace(/\\label\[(.*?)\]/g, function(wholeMatch, m1) {
            figStack.push(m1)
            return '';
        });
    });
    converter.hooks.chain("preConversion", function(text) {
        return text.replace(/\\ref\[(.*?)\]/g, function(wholeMatch, m1) {
            return figStack.indexOf(m1) + 1;
        });
    });
};
```

これをStackEditの左上にある``#``を押してカラムを出し、その中にあるSettings -> Extensionsとたどります。Extensionsの一番下にUserCustom extensionがあるので、テキストボックスの中にコードを貼り付ければ動きます。

現状できるのは

```
\label[tag]
```

でラベルを設定し、

```
\ref[tag]
```

で参照です。\labelは本文に出てきた順に1,2,3,...と割り振られます。\label[tag]はプレビューには表示されません。\ref[tag]とすると割り振られた数字がプレビューに表示されます。

```
\label[id]

図\ref[id]は…
```

と言った感じで使えます。

とりあえず最低限動くことを確認したかったのでまだ荒削りです。図と表などをそれぞれ別に番号を振るようにしたりなどもう少し使いやすく拡張する予定です。

また自分のためにもコードの解説を書いておきたい…。

---

追記です。

TeXは``\label{fig:fig1}``や``\label{table:t1}``などのように図や表に別の通し番号を振れます。この機能が無いと相互参照の意味が無いのでさっそく実装しました。

```js
userCustom.onPagedownConfigure = function(editor) {
    var converter = editor.getConverter();
    var index = [];
    var stack = [];

    converter.hooks.chain("preConversion", function(text) {
        index.length = 0;
        stack.length = 0;
        return text.replace(/\\label\[(.*?):(.*?)\]/g, function(wholeMatch, m1, m2) {
            var i = index.indexOf(m1);
            if (i < 0) {
                index.push(m1);
                stack.push([]);
                stack[ index.indexOf(m1) ].push(m2);
            } else {
                stack[i].push(m2);
            }
            return '';
        });
    });
    converter.hooks.chain("preConversion", function(text) {
        return text.replace(/\\ref\[(.*?):(.*?)\]/g, function(wholeMatch, m1, m2) {
            i = index.indexOf(m1);
            if (i < 0) {
                return i;
            } else {
                return stack[ i ].indexOf(m2) + 1;
            }
        });
    });
};
```

これで``\label[tag:name]``とすれば``\ref[tag:name]``で番号を参照できます。
rbenvでrubyをインストールした時に、指定したgemを自動的に入れてくれるようにする


https://github.com/sstephenson/rbenv-default-gems

こちらを使う。


## インストール

```
git clone https://github.com/sstephenson/rbenv-default-gems.git ~/.rbenv/plugins/rbenv-default-gems
```


## 使い方

`~/.rbenv/default-gems`に予め入れておきたいgemを書く

```
bundler
rbenv-rehash

```
※最後に何も書いてない１行を入れておかないといけない。

https://github.com/sstephenson/rbenv-default-gems#usage

これで`rbenv install 2.1.4`とかした時に、勝手に入ってくれる！！
これで、あ、bundler入れるの忘れてたー。とかいう案件はなくなるはず！！


## thanks
- http://qiita.com/morizyun/items/51abefb159e5f5a8bc50
地雷集


主にCSS。各記述で発生する現象まとめ。
前に書いていた「本当にあったAndroidの怖い話」をマージ済み。
随時更新。

## position: fixed
### android2系で、下の要素が押せてしまう
 - ポップアップなど一時的に出すもの(その間、裏要素のイベント切るなどの対応が可)で、上に演出など乗せないケースでないと、難しい

### transform(scale・rotate等)が効かない端末あり
   - 効く場合もブラウザにより挙動がけっこう異なる (仕様的にどれが正しいのかわからん)
     - いくつかのandroid・IE10 → 無視
     - chrome・firefox → transform時に消えてしまう
     - android chrome → 一緒にtransforomする
   - android2系では、fixedな要素そのものじゃなくて、その上の要素もtransformしないことがある (これはさすがにバグでは)

## transition
 - 意外とanimationより安定性に難あり
   - firefoxで、wrapperな要素において、animationは効くのにtransitionは効かないケースがあった
 - android2系で、動作はするがイベント(`transitionend`)が発火しないケースあり (調査不十分)

## :before, :after
 - IE8では部分的なサポートしか為されていないため、バグあり
   - 重ね順が、 **relative・absoluteな通常要素には絶対に勝てない** 。z-indexを付けても同じ。
   - hoverなどを掛けあわせたセレクタで指定したスタイルが、うまくかからない時がある

## z-index
 - android2系で上手く働かないケースが多々あり
 - いまどきはsassがあるとはいえ、重ね順ぜんぶz-indexで管理するのもキリがないので、頼り過ぎないのが無難

## android特有 (としか言い様がない)

###  Nexus7で、scaleかけているelementとbackground-attachment: fixedがかちあうと、中身が文字化けする

   - fixed系とtransformの相性が悪いのはわかるけど、このリアクションはすごい

### Android3.1は、blur 0pxのbox-shadowに対応してない

   - なにも言わずにshadow自体消えるので注意

   - http://jsdo.it/a_t/3a3g

### ％指定のborder-radiusが効かない

 - これはまぁなんか、おおむね代替可能なので許す。
 - 横幅より大きいpx指定すると効かない、とかいうのもあるらしい。これもなんかまぁまっとうな気もするので許す。
   - http://micomura.hatenablog.jp/entry/2012/01/05/113802

### viewportを指定しないと、android chromeでフォントサイズなどの計算がおかしくなる
 - 高さを指定していない要素で、フォントサイズが倍になってしまう
   - `max-height:99999px`とか、なにかしらでいいから高さを制限してやると直る
 - widthの計算がおかしくなる場合がある
    - `position:absolute; width:100%;`の要素が、なぜか親要素より小さくなったりする。
    - 親を`position:relative`にしたら直った詳細は不明。

## IE特有 (もはや懐かしの)

### HTML5の要素は放っておくと出ません
 - html5shiv等を忘れないこと
 - main要素はそれでも出ないことがあるらしい

### WebFont
 - 意外と表示はちゃんとされたりする。が、油断していると「半透明にはできません」みたいな急なバグがあったりする。
「Pythonで重複してる文を削除するプログラム」をやってみた

元ネタ: [Pythonで重複してる文を削除するプログラム](http://qiita.com/kataware/items/5f1191170a018d6defce)

こういうのどう？とコメントしようと思ったらコード書いた方が分かりやすいなと思って書いてみた。

* 重複チェックにハッシュ値を使う
* with 文をまとめて読み書きした方が効率的
* 何行目が重複しているかを出力

```check.py
# -*- coding: utf-8 -*-
import sys
from hashlib import sha256
from os.path import isfile


def output_unique_text(path, enc='utf-8'):
    d = {}
    with open(path, 'rb') as reader, open('output.txt', 'wb') as writer:
        for i, line in enumerate(reader, 1):
            value = sha256(line).hexdigest()
            if d.get(value):
                msg = '{}: "{}" is duplicate.\n'
                decoded = line.decode(enc).strip()
                sys.stdout.buffer.write(bytes(msg.format(i, decoded), enc))
            else:
                d[value] = line
                writer.write(line)


def main():
    if len(sys.argv) <= 1 or not isfile(sys.argv[1]):
        print('specify path/to/filename')
        sys.exit(1)
    output_unique_text(sys.argv[1])
    print('confirm output.txt')


if __name__ == '__main__':
    main()
```
【基本C++】階乗のプログラム

#はじめに
基本だけ一応記載。

#ソースコード
```cpp:facctorial.cpp
#include<iostream>

using namespace std;

int facctorialMethod(int k);

int main(){
	int number;
	cout<<"何の階乗を計算しますか？"<<endl;
	cin>>number;
	cout<<facctorialMethod(number)<<endl;
}

int facctorialMethod(int k){
	int sum = 1;
	for (int i = 1; i <= k; ++i)
	{
		sum *= i;
	}
	return sum;
}
```
【基本C++】順列のプログラム

#はじめに
基本なものだが、ちょっとプログラムを作ったのでここに記載。

#メソッドの説明
`facctorialMethod()`は階乗の計算を行うメソッドです。そして、`permutationMethod()`が順列の計算を行うメソッドです。

#ソースコード
```cpp:permutation.cpp
#include<iostream>

using namespace std;

int facctorialMethod(int k);
int permutationMethod(int n,int r);

int main(){
	int cardNumber;
	int getNumber;
	cout<<"カードは何枚ありますか？"<<endl;
	cin>>cardNumber;
	cout<<"カードを何枚とりますか？"<<endl;
	cin>>getNumber;
	cout<<permutationMethod(cardNumber,getNumber)<<endl;
}

int permutationMethod(int n,int r){
	int n_sum,r_sum;
	int i;
	r = n - r;
	n_sum = facctorialMethod(n);
	r_sum = facctorialMethod(r);
	return n_sum/r_sum;
}

int facctorialMethod(int k){
	int sum = 1;
	for (int i = 1; i <= k; ++i)
	{
		sum *= i;
	}
	return sum;
}
```
wavをcygwinのzshから聴こう

cat wavのパス >> /dev/dsp
で聴くことができるが、使い勝手は良くない。
何よりもパスを把握しなくてはいけないので人間向きではない。
よって、簡易的なコマンドで実用的に近づけた。

```zsh:.zshrc
function lMusic() {
    if [[ $# -eq 0 ]] ; then
        cd f:/Music_Movie > /dev/null
        ls **/*wav
        cd $OLDPWD > /dev/null
        return
    fi

    ls f:/Music_Movie/**/*wav | grep $1
}

alias play='tee /dev/tty |sed -e "s/^/cat /" -e "s:$: >>/dev/dsp:" | sh'
```

聴くことのできるwavファイルをListするのに使うのがlMusicだ。
lMusic 単体でwavのあるパスを一覧表示する。
argument があればgrepで搾る。
最小限の表示にするために一瞬cdで移動して、lsの自動整形に任せている。つまり、
パスの共通部分の f:/Music_Movie の出力を控えて、lsの文字組みを2段・3段など
画面一杯に自動で段組してくれる機能を利用する。
/dev/null はcd の後にls を自動でしている便利設定の無効化である。

lMusic LaFollia | play
のように、パスを実行するのがplayで、実装はsed で前後に cat, >>/dev/dsp を挟んでsh で実行である。
このうち、tee で画面にプレイする音楽を出力させている。

動作は、grepで複数当たれば1つずつ演奏していく。
CTRL-C で終了。
ランダム演奏は sort の R オプションで。

ファイルの削除も次のように書けば同様の構文で使える
lMusic LaFollia | perl -lne 'unlink'
JPSPSに行ってきました 

SharePoint界隈の人はQiitaじゃないんだろうなぁ…と思いつつ、
気軽なところがここだけなのでQiitaにまとめさせていただきます。

ちなみに、ここ。
http://jpsps.com/event/20141213/

1. 用語ストアについて
==========
もうすでにSlideShareに上がっていました。（というか今纏めている私が遅いだけ…(´・ω・｀)
http://www.slideshare.net/AtsuoYamasaki/20141213-jpsps

まとめると、こんな感じと理解。

- よく検索に使われる用語は、先に「用語ストア」で定義しておきましょう。
- 「用語ストア」はファーム(テナント)レベルでも定義できるし、サイトコレクションレベルでも定義可能
- リストの列に追加するときに、「管理されたメタデータ」とするのがポイント
- 「用語ストア」で定義した言葉で絞込検索ができる。

ぱっと聞いた感じ、サイトコレクションレベルの用語ストアはいい感じに使えそう。
SharePointをWebサイトのお気に入りみたいに使えないかなぁ


2. Office365で始める新しい働き方
=====

結構うんうんと思って面白く聞いていました。

> 組織階層って、そもそも大人数のコミュニケーションを円滑にするための方式だったのかもしれない。
> でも、ソーシャルな基盤が普及したので、組織階層とは別に、
> ネットワーク的なコミュニケーションもできるようになった。
> Office365とか、Yammerとかを使うと、ソーシャルな基盤なのでいいね！

なんか肝が抜けた要約になったかもしれない…

個人的にはYammer、Delve、Office365 Videoあたりが気になったキーワードでした。

発表頂いた、前田さんのブログはこちら↓
https://iajpn.wordpress.com/

3. クイズ
=====
難易度高い。勉強不足…

wspはcab圧縮ファイルだと初めて知った。
最近zip圧縮が多い気がしたのですが、ちょっと昔の仕様なのかしらん…
※xlsx/docx/pptxとか、SharePointアプリのappの実体はzipだったはず。

あとは、発行機能。
Webサイトとかの発行をスケジュールで管理できる。
（このコンテンツは朝9時に公開する！とか出来るらしい。）
スケジュール的な動きが出来ないイメージがある、O365ではできるんかな…


4. SharePointのSQL指南
=======
SQLをちゃんと設計すれば、SPSはもっと速くなる！

詳細はSlideShareに任せたい…かなり知識の範囲外で理解できてない…(´・ω・｀)




LTとか、その他キーワード
===
- 単純な導入、開発案件は減る。代わりに、データ分析の重要性が増す。
- BigDataって大事だよなぁ
- Amazon S3って簡易なWebホスト出来たんですね
    - 考えてみれば、静的サイトなら問題ないんですよねそりゃ
- C#のDLLで、(PowerShell使わなくても)O365テナント管理ができるとは思ってなかった。
- この辺のブログが勉強になりそう。
    - [新卒管理者の奮闘ブログ](https://office365blog-public.sharepoint.com)
    - [SharePoint Maniacs](http://sharepointmaniacs.com/)
    - [技術との戯れ](https://yseosoft.wordpress.com/)
- あとでちゃんと触ろうリスト
    - Sway（プレゼンツール？）
    - CoolText / MetroStudio / Iconion (アイコン)
    - Project Siena (超簡単なWindowsストアアプリ開発ツール？)
    - PowerBI (SharePoint上でいろいろデータを解析する？)
    - Office Graph (機械学習でなんかすごいことをしてる、O365上の何か…)


こんなもんかなぁ。
int[]とかbyte[]とかでも文字列検索というかIndexOfが欲しいからQuick Search書いた

なければ作る。

説明、書いたほうがストック数は伸びるんだろうなあ……

（説明を読みたい人はわっふるわっふるとコメントしてください）

参照したサイト：[Algorithms with Python / 文字列の探索](http://www.geocities.jp/m_hiroi/light/pyalgo11.html)

```csharp
using System.Collections.Generic;

public static class ArrayEx
{
    public static int IndexOf<T>(this T[] source, T[] pattern)
    {
        var table = MakeTable(pattern);
        return QuickSearch(table, source, pattern);
    }

    private static Dictionary<T, int> MakeTable<T>(T[] pattern)
    {
        var table = new Dictionary<T, int>(pattern.Length);
        for (var i = 0; i < pattern.Length; i++)
        {
            table[pattern[i]] = pattern.Length - i;
        }
        return table;
    }

    private static int QuickSearch<T>(Dictionary<T, int> table, T[] source, T[] pattern)
    {
        EqualityComparer<T> comparer = EqualityComparer<T>.Default;
        var sLen = source.Length;
        var pLen = pattern.Length;
        for (var sPos = 0; sPos <= sLen - pLen; sPos += Shift(table, pLen, source[sPos + pLen]))
        {
            var pPos = 0;
            for (; pPos < pLen; pPos++)
                if (!comparer.Equals(source[sPos + pPos], pattern[pPos]))
                    break;
            if (pPos == pLen)
                return sPos; // found
            if (sPos == sLen - pLen)
                break;
        }
        return -1; // not found
    }

    private static int Shift<T>(Dictionary<T, int> table, int patternLength, T next)
    {
        int s;
        return (table.TryGetValue(next, out s)) ? s : patternLength + 1;
    }
}

```
D言語でMMLを鳴らした話

[D言語 Advent Calendar](http://qiita.com/advent-calendar/2014/dlang) 17日目の記事です。

#MMLを鳴らしたい
前回 [PortAudio で波形を鳴らす](http://qiita.com/ueshita/items/98e6a45d2ab0bda1bd43) を書きましたが、
単純な波形をただ鳴らすのもつまらないので、今回はMMLの再生に挑戦してみました。

##MML is 何？
MML は Music Macro Language の略で、曲の楽譜情報をテキストで記述できる言語です。
MIDIなどが登場する以前の大昔のパソコンで楽曲を演奏するのに使われていたようです。

[Music Macro Language - Wikipedia](http://ja.wikipedia.org/wiki/Music_Macro_Language)

```
T120 L4
CDEF EDCR EFGA GFER CRCR CRCR C8C8D8D8E8E8F8F8 EDCR
```
上記はカエルの歌をMMLで記述したものです。
C D E F G A B がドレミファソラシの音符に対応し、Rは休符です。
T120はテンポ120(bpm)。L4は音符のデフォルト長を4分音符にすることを表しています。
何も付いていないCDEFGABはデフォルト長（4分音符）。8が付いている音符は8分音符です。

とりあえずMMLを鳴らせるエンジンを作ってみようってことで（先行ないよね？）、色々調べ始めた。

##規格がバラバラ

MMLは大昔に使われていた言語なので実装によって規格がバラバラだった。
< > でオクターブシフトだが、実装によって上げ下げがあべこべだったり…。
色々探しているうちに、FlushでMMLを鳴らす[FlMML](http://flmml.codeplex.com)というライブラリがあるらしく、
ニコニコ動画の[ピコカキコ](http://dic.nicovideo.jp/a/ピコカキコ)もこの規格で実装されているらしい。ということが分かった。

##実装がんばるぞい！

[FlMML - Documentation](http://flmml.codeplex.com/wikipage?title=Reference)

を見ながらコマンドを一つ一つ実装していく。
CDEFGAB が来たら波形ジェネレータの周波数をいじる。

```d:
frequency = referenceFrequency * pow(2, scale / 12);
```

referenceFrequencyは基準周波数。ここでは220Hzに設定。

```d:
int noteToScale(int note, int acci) {
	int scale = 0;
	switch (note) {
		case 'c': scale = 3;  break;
		case 'd': scale = 5;  break;
		case 'e': scale = 7;  break;
		case 'f': scale = 8;  break;
		case 'g': scale = 10; break;
		case 'a': scale = 12; break;
		case 'b': scale = 14; break;
		default: return 0;
	}
	scale += this.noteShift;
	return scale + (this.octave - 4) * 12 + acci;
}
```
音符と音階の関係はこんな感じです。

他にも音量(V)、定位(P)、エンベロープ(E1)、音色(@)など様々な要素をいじって複雑な発音を制御します。

##とりあえず再生できるところまで

Git Repository : [MMLPlayer-D](https://github.com/ueshita/MMLPlayer-D)


下記コマンドで再生できます。
（音しか出力されないので、ここに掲載できないのが残念…）

```
MMLPlayer [MMLファイル]
```

MMLデータはここにあるものをいくつか試してます。
[ニコニコ大百科:ピコカキコ曲ジャンル一覧](
http://dic.nicovideo.jp/a/%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%A4%A7%E7%99%BE%E7%A7%91%3A%E3%83%94%E3%82%B3%E3%82%AB%E3%82%AD%E3%82%B3%E6%9B%B2%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%AB%E4%B8%80%E8%A6%A7)
※未対応機能がある(#WAV等)ので、残念ながら再生できないものが結構あります。

#ライブラリとして使う
```:d
// 初期化周り
auto player = new MMLPlayer(44100);
player.setMML(mmlText);
player.play();

// 波形を生成する
float sample = player.synth();
```

使い方の詳細はmain.dを見てください。

#最後に
FlMMLが思ってたより仕様多くて大変でした。
ただ、コマンドを実装すればするほど再生できる曲が増えていくのでモチベ維持は容易でしたね。
正直、波形生成周りはD言語じゃなくてもいいかな？
と一瞬思ったりもしたものの、パーサーなど文字列操作周りはD言語の強力さを思い知った感じです。

信号処理プログラミングはC/C++の十八番って感じですが、
高速なD言語でもできるよ！ってことを知ってもらえれば幸いです。
トライアンドエラーが多い信号処理では、コンパイルが高速なDの利点が活きてくるのではないかと。
頑張ればVSTプラグインもD言語で実装できるかもしれません。

皆さんも興味があれば音プログラミングに挑戦してみてください。
それでは。
aura:dependencyタグの使い方（がわからない）

Lightningのドキュメントに、`aura:dependency`というタグが紹介されています。

> 次のタグをコンポーネントに追加すると、aura:placeholder コンポーネントが連動関係として マークされます。
```
 <aura:dependency resource="markup://aura:placeholder" />
```

さっそく試してみます。

```
Failed to save undefined: No COMPONENT named markup://aura:dependency found: Source
```

うーん、これはauraタグを書き間違えた時にでるタグだ…。違うとは思うけど、aura:placeholderを指定したのが行けなかったのかもしれないので、確実に存在しそうなmarkup://ui:buttonなどを指定しても同じエラーでした。

app, cmpとも同じエラーになってしまい途方に暮れているので、どなたか使い方を教えていただけると嬉しいです。
ファイルパスを 8.3形式のパスに変換する

T/O

```powershell
Function Get-ShortPath
{
  Param([string]$name)

  BEGIN { $fso = New-Object -ComObject Scripting.FileSystemObject }
  PROCESS
  {
    try {
      $fsi = (Get-Item $name -ErrorAction Stop)
    }
    catch
    {
      return $name
    }

    $fullname = $fsi.FullName
    if ($fsi.psiscontainer)
    {
      return $fso.GetFolder($fullname).ShortPath
    }
    else
    {
      return $fso.GetFile($fullname).ShortPath
    }
  }
}
```

参照: ほぼここからコピペ http://blogs.technet.com/b/heyscriptingguy/archive/2013/08/01/use-powershell-to-display-short-file-and-folder-names.aspx



僕が所属している[会社](http://www.beproud.jp/)が[社員募集中](http://jobs.beproud.jp/)みたいです。何か書いてみてーなと思った人は応募してみてくださいな。 (すてま)
LUTで画像処理フィルターを効率的に量産する

ここでいうLUTはルックアップテーブルの略です。

まずはそのLUTで画像処理をするとはどういう事かというのを書こうかと思ったのですが、

UE4の説明が分かりやすいのでそれを見てみるのが早いでしょう。
https://docs.unrealengine.com/latest/JPN/Engine/Rendering/PostProcessEffects/ColorGrading/index.html

要するに、色をテーブルで変換するだけです。
テーブルというのは、以下のような画像です。

![lut32.png](https://qiita-image-store.s3.amazonaws.com/0/8588/7708bab5-2bac-8320-a1d6-fc75a4cb5ed8.png)

これを見るとそれぞれの四角で、
xがR成分
yがG成分
そして右のセルに行くほどB成分が0~1へとグラデーションされています。
これによってRGBそれぞれの成分がどう配置されるかが定義されています。
※もちろん、この画像は1:1のマッピングなので、フィルター的には何もしないものです。

しかし、ひとたびこの画像に対してグレースケールや、トーンカーブ調整をすると、
その調整がそのままフィルターになります。

例えばグレースケールをかけると以下のようなテーブルになります。
![gray.png](https://qiita-image-store.s3.amazonaws.com/0/8588/ab326453-308a-8f5f-58f0-e38393dfe980.png)

これだけでグレースケールフィルターが出来てしまいました。

この方法の最大のメリットは、まさにこの部分で、
**単一のアルゴリズムにも関わらず、非常に多種多様なフィルター表現**が可能だということです。
さらに、もう一つ良いことがあります。
それは**フィルターの作り方が非常に簡単**だということです。

こちらは動画で見た方が分かりやすいかもしれません。
http://vimeo.com/38542834

どういう事かというと、
１、参考画像に、元となる何もしないテーブル画像（↓）を貼り付ける
![lut32.png](https://qiita-image-store.s3.amazonaws.com/0/8588/7708bab5-2bac-8320-a1d6-fc75a4cb5ed8.png)

２、画像処理をかける

３、画像処理がかかったグラデーションテーブル画像を書き出す

この３ステップでフィルターが作れます。
フィルター作成にわざわざプログラムを書く必要がないのです。

さて、このLUTのメリットを整理したところでiOSの実装の話に移ろうと思います。
１から実装を・・・とおもいきや、CoreImageのフィルターにすでにありました。

CIColorCube

です。なんともiOS SDKというのは痒いところに手が届くものですね。

軽く引数を見てみると、
inputCubeData => floatの３次元配列の生データのNSData。
inputCubeDimension => 配列の個数。例えば、16x16x16の3次元配列を用意したなら、ここには16を入れます。

これだけなのでとても簡単です。

リアルタイムグラフィックスでは、よく16x256のテーブルが使われるようですが、
画像処理、としてみたときには、少々このサイズは小さすぎると思います。
なので、32x1024がiOSではオススメなラインかと思います。

というわけで最後に以上のアプローチの実際に動作するサンプルを紹介して終わりにしようと思います。

https://github.com/Ushio/LUT_iOS

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/8588/30f01887-967c-64e8-9a94-671e9d3ab663.png)
マップの特定箇所から特定箇所に動くAI 【Kawaz Advent Calendar 2014】

注：**この記事は、[KawazAdventCalendar2014](http://www.kawaz.org/blogs/giginet/2014/12/1/644/ "Kawaz - KawazAdventCalendar2014まとめ")の12月16日ぶんです。**
**[Kawaz（札幌ゲーム製作者コミュニティ）のサイト内に投稿した記事]
(http://www.kawaz.org/blogs/h_hiro_/2014/12/17/659/ "Kawaz - マップの特定箇所から特定箇所に動くAI 【Kawaz Advent Calendar 2014】")と同一のものです。**

# いきなり問題です

以下のようなマス目状のマップがある。このマップ上では、キャラクターは上下左右にのみ移動でき、かつ壁（黒いマス）にキャラクターは入れないものとする。

[![マップ](http://f.st-hatena.com/images/fotolife/m/maraigue/20141216/20141216235412.png)](http://f.hatena.ne.jp/maraigue/20141216235412)

このマップにおいて、スタート(S)からゴール(G)に移動するキャラクターのAIを作ることを考える。

1.  少し時間がかかってもいいので、SからGへの最短経路を求めるにはどうすればよいか。
2.  SからGへ試行錯誤しながら進む効率のよい方法はあるか。すなわち、試行錯誤ではあるものの、上下左右を等確率で選んで進むよりもゴールするまでの時間がかからないと見込まれる方法はあるか。

# 1. 最短経路を求める

これは以下の解き方で求められる。

-   Sのマスに「0」と書き込む。これは「Sから0回で移動できる場所」を意味する（これ以降も同様）。
-   以下のことを、全部のマスに数値が書き込まれるまで繰り返す。
    -   「0」と書き込まれたマスから1回で移動できるマスすべてに「1」と書き込む。
    -   「1」と書き込まれたマスから1回で移動できるマスすべて（ただし、すでに「0」や「1」が書き込まれているマスは除く）に「2」と書き込む。
    -   「2」と書き込まれたマスから1回で移動できるマスすべて（ただし、すでに「0」や「1」や「2」が書き込まれているマスは除く）に「3」と書き込む。
    -   以下同様
-   上記の過程において、どこからどこへ移動したことによって数字が書き込まれたかを記録しておく（同点があった場合はどれか一つを適当に選ぶ）。GのマスからSのマスへその移動方法を逆に辿れば最短経路が得られる。

[![最短経路探索方法](http://f.st-hatena.com/images/fotolife/m/maraigue/20141217/20141217000323.png)](http://f.hatena.ne.jp/maraigue/20141217000323)

このマップの場合、最終結果は以下のようになる。なお経路は一例であり、最後の「12」から1ずつ減るように0に戻れれば何でもよい。

[![最短経路探索結果](http://f.st-hatena.com/images/fotolife/m/maraigue/20141216/20141216235413.png)](http://f.hatena.ne.jp/maraigue/20141216235413)

これでうまくいくの？というのを疑問に感じる方もいるかもしれないが、これで問題ないのは、**数字が書き込まれるのはSからの最短経路で移動してきた場合に限定される（あとで書こうとしてもすでに数字が書かれている）ためである**。

この最短経路を求める手法は、より一般に「地点間の距離が1とは限らないようなマップ」の場合にも、少し工夫を加えることで適用することが可能であり、[ダイクストラ法](https://ja.wikipedia.org/wiki/%E3%83%80%E3%82%A4%E3%82%AF%E3%82%B9%E3%83%88%E3%83%A9%E6%B3%95 "ダイクストラ法 - Wikipedia")と呼ばれている。なお、計算時間は今回の問題だと地点数に比例する程度で済むものの、一般の場合には地点数の2乗に比例する時間となる。


余談：「マップ中のあらゆる2地点間の組み合わせに対する最短経路」を一挙に求める方法もあり、こちらは[ワーシャル-フロイド法](https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB-%E3%83%95%E3%83%AD%E3%82%A4%E3%83%89%E6%B3%95 "ワーシャル-フロイド法 - Wikipedia")と呼ばれている。計算時間は地点数の3乗に比例する。

# 2. 試行錯誤しながら進む

上下左右をランダムに選ぶより効率よくしたいということなので、

-   基本的にはゴール方向へ向かうようにするが、一定の確率で上下左右をランダムに選ぶ

というものが有力だろうか。その他細かい工夫もできるだろう。

Rubyで実装したコードはこちら。 https://gist.github.com/maraigue/809e6455bd192e1907fa

これを1000回動かして平均を取った結果はこちら。

|ゴール方向へ<br>向かう確率|移動回数の平均 (標準偏差)|
|:--:|:-----------:|
|0.0|287.5 (228.9)|
|0.1|199.4 (150.5)|
|0.2|165.7 (109.6)|
|0.3|154.2 (100.1)|
|0.4|169.4 (117.5)|
|0.5|210.3 (158.2)|

ゴール方向へ向かう確率が低くても高くても時間がかかる（移動回数が多くなる）ということがわかる。今回は試した5通りのうち、確率0.3が最適ということになった。

ただそれにしても、最短ルートが12回という中で154回も移動しないとゴールに着けないのではちょっと実用性に欠ける。完全ランダム（確率0.0）の287回に比べれば半分程度には減っているのだが。

現実的な対応としては、途中途中にチェックポイントを設けて、そこまで辿りつくようにするのを繰り返す、というところだろうか。このあたりは実際のゲームでルーチン作ったことがある方がいらっしゃったら教えていただきたい。

# おわりに

ゲームAI大変です。でもうまく作れると楽しいので作ってみたいです。
golangで日本語（マルチバイト）の文字列を数える

勢い良くlen()で数えると、byte数になってしまいます。

unicode/utf8 パッケージの[RuneCountInString()](http://golang.org/pkg/unicode/utf8/#RuneCountInString)を使います。
または、[]runeにキャストすることで、len()でも数えられます。

```go
package main

import (
	"fmt"
	"unicode/utf8"
)

func main() {
	str := "Hello, 世界"
	fmt.Printf("len: %d (byte)\n", len(str))
	fmt.Printf("Rune: %d (rune)\n", utf8.RuneCountInString(str))
	fmt.Printf("Rune: %d (rune)\n", len([]rune(str)))
}
```

```
len: 13 (byte)
Rune: 9 (rune)
Rune: 9 (rune)
```

[Go Playground](http://play.golang.org/p/6Iv6onsgFT)

文字数は9文字。len()では13(byte)になり、RuneCountInString()では、期待通り、9が返ってきました。

Hello, まで(半角スペース含む)は、1文字=1byte、日本語は、UTF-8では基本的には3バイトです。ただし、一部のマイナーな漢字は4バイトなので必ずしも3バイトではないです。

## ベンチマーク追記

簡単なベンチマークを取ってみました。
上記2つの方法について、ascii/multibyteおよび、文字数(16と32文字)のベンチマークです。

[ベンチマークソースはgistにあります。](https://gist.github.com/reiki4040/6f225993b68805125e0f)

```
go test -bench . -benchmem

BenchmarkRunCountInString16ascii	20000000	        79.4 ns/op	       0 B/op	       0 allocs/op
BenchmarkRunCountInString16multi	10000000	       184 ns/op	       0 B/op	       0 allocs/op
BenchmarkRunCountInString32ascii	10000000	       204 ns/op	       0 B/op	       0 allocs/op
BenchmarkRunCountInString32multi	 5000000	       356 ns/op	       0 B/op	       0 allocs/op

BenchmarkCastToRuneArray16ascii	    10000000	       210 ns/op	      64 B/op	       1 allocs/op
BenchmarkCastToRuneArray16multi	     5000000	       312 ns/op	      64 B/op	       1 allocs/op
BenchmarkCastToRuneArray32ascii	     5000000	       362 ns/op	     128 B/op	       1 allocs/op
BenchmarkCastToRuneArray32multi	     5000000	       569 ns/op	     128 B/op	       1 allocs/op
```

RuneCountInString()のほうが、1.5倍ほど速いです。
[ソース](http://golang.org/src/unicode/utf8/utf8.go?s=9312:9352#L374)を見ると、以下のようになっています。

```go
func RuneCountInString(s string) (n int) {
	for range s {
		n++
	}
	return
}
```

これだとアロケートは走らないみたいですね。[]runeにキャストするとアロケートされて、その分が遅いんでしょうか。
また、やはりmultiバイトの方が遅かったです。asciiの方が1.5倍ほど速い。
vim起動時に前回の状態を復元しちゃうぞ


IDEなんかで起動時に前回の状態(タブ)などを復元してくれる動きの再現
引数付きで起動するときは無視する


```vim:.vimrc

" Vim終了時に現在のセッションを保存する
au VimLeave * mks!  ~/vimsession

"引数なし起動の時、前回のsessionを復元
autocmd VimEnter * nested if @% == '' && s:GetBufByte() == 0 | source ~/vimsession | endif
function! s:GetBufByte()
    let byte = line2byte(line('$') + 1)
    if byte == -1
        return 0
    else
        return byte - 1
    endif
endfunction

```

使ってみて
--
コンソールでtigと組み合わせて使っていると楽
git commitの後に普通に開くと焦る


TODO
--
* 特定の操作で終了した場合記録したくない（git commit時など）
* 終了時にNERDTreeを開いているとそんなファイルねぇと怒られる

参考 url
--
http://linuxserver.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF/vim/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BF%9D%E6%8C%81.php

http://saihoooooooo.hatenablog.com/entry/2013/05/24/130744
Symfony2 Jobeetを翻訳してみました

yositani2002です。

この記事は [Symfony Advent Calender 2014](http://qiita.com/advent-calendar/2014/symfony) 17日目の記事になります。

技術的内容でなく申し訳ないのですが、 Symfony2 用の jobeet というチュートリアルを翻訳してみましたので、紹介させていただきたいと思います。

* URL http://jobeet.symfony.gr.jp/
* レポジトリ https://github.com/symfony-japan/symfony2-jobeet-ja

symfony1.x のころは入門用に jobeet/askeet というボリュームのあるチュートリアルがありました。 Symfony2 になって、なくなったと思い忘れていたのですが、先日、Symfony2 版をいくつか見つけました。

http://www.ens.ro/2012/03/21/jobeet-tutorial-with-symfony2/
http://www.intelligentbee.com/blog/tag/symfony2-jobeet/

どうも、有志の方が引継いで19日まで英語で作成されているようです。
先人の偉業にまずは感謝です。

すでに多くの言語に翻訳されているようです。
http://blog.erlem.fr/programmation/developpement-web/framework/40-symfony/99-symfony2-jobeet
http://symfony.in.ua/symfony2-jobeet-tutorial.html
http://wiki.salud.gob.sv/wiki/Tutorial_Jobeet_con_Symfony2
https://github.com/happen-zhang/symfony2-jobeet-tutorial

そこで、日本語に翻訳してみました。英語は苦手なのでただただGoogle翻訳頼みです。
怪しいと思うところは、原文の方と見比べていただき、コメント欄に指摘、または、GitHub で PR していただけるとうれしいです。

内容的には、ちょっと独特なところも含めて大変参考になりました。
コード量が多い分、その説明は少ない気がしました。
まずは通しでやった後、コードを読み直す方がいいかもしれません。


以下、面白い、為になったと思った点です。
* Ubuntu である。 Ubuntu 触ったことがなかったので。
* Sonata Adminで管理画面を作る。Sonata のとっつきにくさが少しは緩和されてる気がします。
* ファンクショナルテストでDB自体を作り直し。あまり見かけないやり方でしたので。
* Zend Luceneを使って全文検索の実装。Zend Frameworkの組み込み方としても参考になりました。
* Unobtrusive JavaScript なる考え方。まず、読めないし、なんて訳せばいいのか分かりませんでした。
* ページャーが自作。

今後、ベストプラクティスなども踏まえて、作り直すのもいいかもしれません。
また、自由につづきを執筆しちゃっていいんじゃないでしょうか。|ω・`）チラ


翻訳作業については、去年の12月にSymfonyユーザー会の翻訳会に参加させていただき手順を教えていただきました。翻訳をしていると、ドキュメントをくまなく読むようになり知識が深まるだけでなく、 Sphinx などの周辺技術も身に付くため、大変おすすめです。

Symfony の書籍が現状あまり無いので、どこまで需要があるのかわからないんですが、 EPUB 版も作成してみました。

それでは、ちょっと早いですが、よいお年を。
Androidテストアプリを実行する条件

Android開発ではテストプロジェクトを作成することによって、アプリのテストを行うことが可能です。
テストプロジェクトをEclipseなどから実行することもできますが、ビルドしてインストールし、[コマンド](http://qiita.com/chihiro/items/e6ac366445027b88e19c) (以前書いた記事です)で実行することも可能です。
そんなときに注意すべき2点です。

## テスト対象アプリのパッケージ名
テストプロジェクトのマニフェストファイルに、テスト対象のアプリのパッケージ名を記入する必要があります。
以下のandroid:targetPackageの部分です。

```lang:AndroidManifest.xml
<instrumentation 
    android:name="android.test.InstrumentationTestRunner"
    android:targetPackage="com.hello"/>
```

開発を行っていると、しばしばパッケージ名を変更する必要がでてくることがあります。
パッケージ名を変更したアプリに対しては、テストプロジェクト側のマニフェストファイルの変更も必要になってきます。

## 署名
テスト対象アプリと、テストアプリは同じ署名がされていないといけません。
キーが違うとテストの実行ができないです。気をつけましょう。
コンポーネントをrendering時に上書きする

#コンポーネントをrendering時に上書きする

render時にコンポーネントの表示を上書きする方法を書きます。
やってみたのはいいのですが、考えば考えるほど、なんだか微妙です・・・・、これでいいのか。
何かに気がついた人はコメントください。

※注意点
・render関数でコンポーネントを修正する場合には、superRender関数を呼び出します。
呼び出さなかった場合、画面にコンポーネントは表示されません。

以下のコードではユーザの言語が英語の場合、画面のラベルを英語に変更して出力します。
コンポーネントは、日本語でLabelを書いています。

```AdventCalendarCmp.cmp
<aura:component controller="TLP.AdventCal">      
    <ui:outputText aura:id="waitingMsg" value="ただいまデータを取得中です。"/>

    <ui:inputText aura:id="childName" label="名前"  
                  value="{!v.child.Name}" 
                  class="form-control" 
                  placeholder="名前を登録してください"/>

</aura:component controller="TLP.AdventCal">
```

Render関数内で、ロケールを所得し、ユーザの言語が「en」(英語)の場合、メッセージや、ラベル等を英語に変換します。

```AdventCalendarCmpRender.js
({
    render:function(cmp,helper){
        var d = this.superRender();
		var locale = $A.get("$Locale.language");
        if(locale === 'en'){
			cmp.find('waitingMsg').set("v.value","Now Loading ...");
            cmp.find('childName').set("v.label","Name"); 
            cmp.find('childName').set("v.placeholder","Please input your name");
        }
		return d;
    },
```

このように表示が変わります。
Salesforceでトランスレーションワークベンチを使ってる人からしてみるとこれアリかなぁという感じです・・・。
![Aura.jpg](https://qiita-image-store.s3.amazonaws.com/0/6648/ca0e120b-718d-3236-13a5-15aa1f18610d.jpeg)

ラベルを書き換えるところで、こんな感じで呼び出そうと思ったら怒られてしまいました。
cmp.find('childName').set("v.label","Name").set("v.placeholder","Please input your name");
![Aura.jpg](https://qiita-image-store.s3.amazonaws.com/0/6648/5bed6840-7d64-1eb1-f7a8-8fdaa0adb46a.jpeg)
Apache Sparkをスタンドアロンで実行

Apache Sparkをスタンドアロンで実行してみます。

https://spark.apache.org/docs/latest/quick-start.html

↑公式にある「Standalone Applications」ってやつです。



Sparkのアプリケーションを実行するには、

```text
spark-submit
```
というコマンドを使うみたいです。
注意点として、実行前にアプリケーションをコンパイルして、jarにしておく必要があるとのことです。

それでは、実行してみます。

# 環境など
・mac os x 10.8.5
・apache sparkはspark-1.1.1-bin-hadoop2.4使用
・使用言語はscala(v2.11.4)
・アプリケーションのコンパイルにはsbtを使用(v0.13.7)

※scalaとsbtのインストールについては↓でやってみました
http://qiita.com/kanuma1984/items/6f599c815cc8f9232228


# スタンドアロンで実行
まずサンプル用のディレクトリを作成します

```bash
$ cd /tmp
$ mkdir spark-sample
$ mkdir spark-sample/src
$ mkdir spark-sample/src/main
$ mkdir spark-sample/src/main/scala
```

次にパッケージ管理用のsbtファイルを作成し、
以下の内容を記述します。

```sbt:/tmp/spark-sample/simple.sbt
name := "Simple Project"
version := "1.0"
scalaVersion := "2.10.4"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.1.1"
```
ここで1つハマったのが、
scalaVersionにインストールしたバージョン(2.11.4)を指定すると、コンパイル時にエラーが発生するという。。

sparkがscala 2.11.4に対応していないのが原因なのかな？
公式ドキュメント通り、2.10.4を指定したらうまくいきました。うーんまだまだ謎が多いorz


次はアプリケーションです

```scala:/tmp/spark-sample/src/main/scala/SimpleApp.scala
/* SimpleApp.scala */
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "/tmp/spark-1.1.1-bin-hadoop2.4/README.md"
    val conf = new SparkConf().setAppName("Simple Application")
    val sc = new SparkContext(conf)
    val logData = sc.textFile(logFile, 2).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println("Lines with a: %s, Lines with b: %s".format(numAs, numBs))
  }
}
```
これは公式ドキュメントに載っているサンプルなんですけど、README.md内に「a」と「b」という文字列がどれだけあるかをカウントして出力をするサンプルっぽいです。


ではでは実行…の前にコンパイルします。
sbtコマンドを叩くんですけど、最初は結構時間かかります。
ゆっくりお茶でも飲みながら待ちます。

```bash
$ cd /tmp/spark-sample
$ sbt package
```
↑のscalaVersionのエラーは、この時点で発生しました。


これでやっと実行できます。

### 実行
実行はspark-submitを使います

```bash
/tmp/spark-1.1.1-bin-hadoop2.4/bin/spark-submit \
  --class "SimpleApp" \
  --master local[4] \
  target/scala-2.10/simple-project_2.10-1.0.jar
・
・
・
Lines with a: 83, Lines with b: 38
```

aが83, bが38回出現という結果がでました。
spark-submitのオプションですが、

```text
# 作成したアプリケーションのエントリーポイント
--class "SimpleApp" 

# ローカル環境で実行し、[]の中がワーカースレッド数
--master local[4]

# ↓の場合は、ローカル・1ワーカースレッドになります
--master local

# sbtによってコンパイルされたプログラムのjarを指定
target/scala-2.10/simple-project_2.10-1.0.jar
```

です。
※間違っている箇所がありましたらご指摘下さいm(__)m

これでスタンドアロンでの実行は終了です。
次はtwitter api使ったものを実装してみようかな。


# 参考
https://spark.apache.org/docs/latest/quick-start.html
https://spark.apache.org/docs/1.1.0/submitting-applications.html
https://spark.apache.org/docs/1.1.0/submitting-applications.html#master-urls
Phonegap(Cordova)を2.x系から3.x系にバージョンアップするときに思ったこと（メモ）

最近まで2.x系で開発していたのですが、この頃Androidに対する脆弱性[註1]があったとのことで緊急に3.5.1以上にバージョンアップしての開発を余儀なくされたので、2.x系から一気に3.7にバージョンアップした際に困った内容についてのメモ書きです。

* 調べても英語系のサイトしか出てこない...（これは仕方ない）
* Phonegapの公式サイトやCordovaのサイトに行って「インストール」って書かれているページに行っても謎のコマンドの一覧が表示されているだけ（何これ・・・ダウンロードできない！）
* node.jsとか謎の言葉が出てくる。。。

そもそもサイトが初心者にはレベルが高すぎて分かりづらい。

しかもどうやらGUIではなくて**CUI**でやらないといけないらしい・・・と言うことが判明

それまでCUIアレルギーだった自分は硬直。でも業務なのでとりあえずやってみる。

* node.jsというのをインストールする
* インストールしたら、Cordovaの公式サイトにあるコマンドをひとまず実行してみる
* とりあえずプロジェクト作ってみる
* あれ？今までのPhonegapのプロジェクトとファイル構造違うぞ？？？

それまでeclipseで開発していたのですが、普通のAndroidアプリケーションのプロジェクトとファイル構造が違うと当然ながらインポートできないので、慌てふためき（これを解決するのに20時間以上時間を喰ってしまいました...）。

最終的にエディタでHTMLを編集して、コマンドプロンプトでrunさせるという方式で何とかやっていますがもうちょっと効率的なやり方はないのでしょうかね・・・

Phonegap Buildと言うのがあるらしいですが、いまいちこれについてはよく分かりません。

尚、バージョンアップした後にHTML、JSファイルを移行した時にPhonegapの機能を使用しているスクリプトが動かなくなった場合はプラグインを入れないといけないようです。2.x系の時にはCordova・Phonegapには全ての機能が入っていましたが、容量削減のため（？）か機能はプラグインで追加する方式に変更されているようです。

>註1 : http://www.itmedia.co.jp/enterprise/articles/1408/07/news034.html
Postfix 2.12 の compatibility_level

[Postfix Advent Calendar 2014](http://qiita.com/advent-calendar/2014/postfix)の 16日目の記事です。

Postfix 2.12で追加される(予定)の compatibility_level の話です。

Postfixのバージョンアップ時、パラメータのデフォルト値や挙動が変わる事があります。本来ならばバージョンアップ時はRELEASE_NOTESをよく読んで変更点を確認するべきではあります。しかし、それをおろそかにして痛い目にあった人が多かったのか、Postfix 2.12から`compatibility_level`という機能が追加になります。

Postfixを2.12にバージョンアップした後、設定を変更せずにPostfixを起動すると以下のような警告メッセージが表示されます。

```
# postfix start
postfix: warning: Postfix is running with backwards-compatible default settings
postfix: warning: See http://www.postfix.org/COMPATIBILITY_README.html for details
postfix: warning: To disable backwards compatibility use "postconf compatibility_level=2" and "postfix reload"
postfix/postfix-script: starting the Postfix mail system
```

これはmain.cfに`compatibility_level`がセットされていない、もしくは動作しているPostfixの`compatibility_level`より低いため、互換モードで動作している事をあらわしています。
Postfix 2.12 を新規インストールした場合は main.cf に`compatibility_level = 2`が設定されているためこの警告メッセージは出ません。
また、互換モードの動作が適用された時にログにも記録されます。以下の例は`append_dot_mydomain=yes`が適用された時の物です。

```
postfix/trivial-rewrite[1233]: using backwards-compatible default setting append_dot_mydomain=yes to rewrite "host" to "host.example.jp"
```

## compatibility_levelで動作が変わる設定

compatibility_levelによって、以下の設定のデフォルトでの動作が変わります。

[main.cf]
* append_dot_mydomain

| compatibility_level | デフォルト値 |
|:--------------------|:-------------|
| 0                   | yes          |
| 1以上               | no           |

* relay_domains

| compatibility_level | デフォルト値   |
|:--------------------|:---------------|
| 1以下               | $mydestination |
| 2以上               | なし           |

* fast_flush_domains

  デフォルト値が `$relay_domains`である為`relay_domains`の影響を受ける

* mynetworks_style

| compatibility_level | デフォルト値   |
|:--------------------|:---------------|
| 1以下               | subnet         |
| 2以上               | host           |

* smtputf8_enable

| compatibility_level | デフォルト値 |
|:--------------------|:-------------|
| 0                   | no           |
| 1以上               | yes          |

[master.cf]
* 各サービスのchroot設定

| compatibility_level | デフォルト値 |
|:--------------------|:-------------|
| 0                   | yes          |
| 1以上               | no           |

これらの設定はmain.cfに設定の記述がない時(master.cfのchroot設定は - の時) に適用されます。
main.cfでデフォルト値と同じ値を設定した場合はその値が使われます。

## 実際のデフォルト値
postconf コマンドで実際のデフォルト値がどのようになっているか見てみます。

```
% postconf -d append_dot_mydomain
append_dot_mydomain = ${{$compatibility_level} < {1} ? {yes} : {no}}
```

Postfix 2.12 ではパラメータ展開が拡張されて、以下の形式が増えました。
<dl>
<dt>${name?{value1}:{value2}}
<dd>nameが空でない時はvalue1に、空の時はvalue2に展開される
<dt>${{value3}=={value4}?{value1}:{value2}}
<dd>value3とvalue4を比較し、条件を満たすときはvalue1に、満たさない場合はvalue2に展開される。条件には ==, !=, <, <=, >, >= が使える
</dl>
つまり`append_dot_mydomain`のデフォルト値は`compatibility_level`が1より小さい時は`yes`に、それ以外の時は`no`になるようにパラメータ展開で設定されています。
パラメータ展開で条件式を使えるようになったのを知った時はどんな使い方をするか疑問だったのですが、こんな所で使われていたんですね。

## 警告メッセージの抑制方法
`compatibility_level`での警告メッセージを抑制するには、main.cfで`compatibility_level`を設定します。
Postfix 2.12の場合は2を設定します。
当然互換モードは適用されなくなりますので、前述の各パラメータの値を確認し、必要ならば設定を変更しましょう。

将来的のバージョンアップでも警告は必要ない場合は`compatibility_level = 9999`を設定します。
この場合「変更はすべて受け入れる」という覚悟も必要です。
vimrc アンチパターンを自動でチェックする

この記事は Vim Advent Calendar 2014 の 16 日目の記事です。
15日は kefir_ さんの「[vim と term.c](http://qiita.com/kefir_/items/384d83dfbbe8403a93be)」でした。vim と 端末の間のやりとりの解説という超ディープな話題で、つくづく vimmer は変態（いい意味）が多いな、と痛感させられます。素晴らしい記事ですので、ぜひ一読をお勧めします。

さて、今回の記事では、VAC 1 日目の記事 **[「vimrc アンチパターン」](http://rbtnn.hateblo.jp/entry/2014/11/30/174749) を Vim script の lint ツール「[vint](https://github.com/Kuniwak/vint)」で判定できるようにした**、という話を紹介します。

今年 11 月に開かれた VimConf 2014 にて「[vint は機能追加が簡単さ〜](https://speakerdeck.com/orgachem/zhuan-banuxian-falsezhang-vint)」とか豪語しておりましたので、その実証がてら lint ルールの実装タイムアタックにチャレンジしてみました。

### vimrc アンチパターンのルール
vimrc アンチパターンをまとめると、9 つのルールなります。
この 9 つのルールをどれくらいの時間で実装できるかを計測してみました。

- コード中にマルチバイト文字があり、かつ scriptencoding が指定されていない場合警告
- encoding が scriptencoding よりも後に指定されていた場合、警告
- オプションの省略記法を検知して警告
- autocmd が augroup の外で、さらに group が指定されてないとき警告
- set nocompatible を警告
- syntax on が Bundle系コマンドの前にある場合警告
- スコーププレフィックス（`g:` とか `a:` とか）のない変数を警告
- remap じゃない map は `<Plug>` と併用されていなければ警告
- `<C-i>` と `<Tab>`、`<C-m>` と `<Enter>`、`<C-[>` と `<ESC>` の両方の組があらわれたら警告  


vint の使い方
------------

python で実装されているため、 pip を使います。

```
pip install vim-vint
```

インストールが終われば、`vint ファイル名` で実行できるようになります。
さっそく自分の vimrc を検査してみましょう。

![screencast](https://raw.githubusercontent.com/Kuniwak/vint/screencast/screencast.gif)

**ｱｯｱｯ…作者なのに…！**

私の vimrc は 700 行弱ですが、ほぼ一瞬で検査が終了しています。
定番 lint プラグインの syntastic のような lnit の実行完了を待たせる lint プラグインでも問題にならない速さです。

タイムアタックの結果
-----------------

さて、タイムアタックの結果です。

**9 つのルールのうち、5 つのルールを 5 時間で実装できました。**

つまり、おおよそ新規の 1 ルールが 1 時間で実装（テスト込み）できるという計算になります。それぞれのルールにはテストも付属させてます。

- [x] [ソースにマルチバイト文字があり、かつ script encoding が指定されていない場合警告](https://github.com/Kuniwak/vint/pull/41/files#diff-36)
- [x] [set encoding が script encoding よりも後に宣言されていた場合、警告](https://github.com/Kuniwak/vint/pull/41/files#diff-35)
- [x] [省略記法禁止](https://github.com/Kuniwak/vint/pull/41/files#diff-33)
- [x] [augroup 外、かつ autocmd の group が定義されてないとき警告](https://github.com/Kuniwak/vint/pull/41/files#diff-34)
- [x] [set nocompatible を警告](https://github.com/Kuniwak/vint/pull/41/files#diff-37)
- [ ] syntax on は Bundle系コマンドの後に配置（無理そう？）
- [ ] スコープのない変数
- [ ] Xmap は `<Plug>` と併用していなければ警告
- [ ] `<C-i>` と `<Tab>`、`<C-m>` と `<Enter>`、`<C-[>` と `<ESC>` の両方の組があらわれたら警告

このように、**手軽に lint のルールを追加していけることが vint のよさなのです。**
ただ、動作確認は結構雑だったので、もしかすると判定ミスがあるかもしれません。そういうときは [issue](https://github.com/Kuniwak/vint/issues) をたてていただけると対応します。

謝辞
----

@rbtnn さん、とても勉強になる記事でした。ありがとうございました。
@thinca さん、[@itchyny](https://twitter.com/itchyny) さん、バグ報告ありがとうございました。
まだ大部分を直せていませんが、今後も vint を使用していただけると助かります。
現在は問題の多かったスコープ解析部分を無効化しているため、vital も検査できるようになっています。
PHPで画像バイナリ←→リソース変換

画像を取得する多くの場合はファイルから読み込むかURLから読み込むかが殆どだったため、
画像をバイナリで取得してきた場合にどう扱うのか迷ってしまった。

## バイナリ→リソース

画像がバイナリでPHP上に与えられるケースはDBに画像が保存されている場合などが考えられるでしょうか？

画像のバイナリをリソースに変換するには`imagecreatefromstring`という関数を使えばいいようです。


```php
$image_resource = imagecreatefromstring($image_binary);
```

簡単ですね。

## リソース→バイナリ

リソースとなった画像はPHPで切ったり貼ったり出来ますが、その編集結果をまたバイナリに戻したいというケースもあるでしょう。

image操作関数は多くありますが、画像リソースをブラウザ・ファイルに出力する関数はあっても、バイナリデータにする関数は見当たりません。
なので、バッファに一旦画像バイナリを出力して変数に格納する必要があります。

```php
ob_start();
imagepng($image_resource, null, 9); // png画像をminify
$image_binary = ob_get_clean();
```

読み込んだ画像リソースを整形して保存するときなどに覚えておくと便利です。
動かなかったbrewコマンドをlnで動かせた

## はじめに
vimのバージョンが古くてbreakindent( [参考](http://qiita.com/drafts/03d50dd05c6a79f0870e) )が試せなかったので、vimをアップデートしました。
その時の話です。

## brewが動かない
Mac OS Xを使っていて、vimはbrewで入れています。
brewを久しぶりにアップデートしようとしたら、以下のようなのが出ました。(そのまんまじゃないです。)
```shell-session
$ brew update
/usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby: bad interpreter: No such file or directory
/usr/local/bin/brew: line 28: /usr/local/Library/brew.rb: Undefined error: 0
```
Mac OS Xのアップデートによって、Rubyが1.8から2.0にアップデートされていたようで、brewが上手く動きません。
どんだけアップデートしてなかったんだ･･･

## 解決策
```shell-session
$ sudo ln -s /System/Library/Frameworks/Ruby.framework/Versions/2.0 /System/Library/Frameworks/Ruby.framework/Versions/1.8
$ brew update
```

これで上手くいきました。
Ruby1.8から2.0にかけて変わった機能をbrewでは使ってなかったようです。

brewのupdate後は、リンクを削除しても問題なく動きました。
/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/bin/ruby
を使うようになったみたいです。

vimのアップデートができて、breakindentオプションが使えるようになりました。
sysd 安裝

## Ubuntu
目前可用發行版爲 trusty (14.04)、utopic (14.10)、precise (12.04)、lucid (10.04)
https://launchpad.net/~sysd/+archive/ubuntu/sysd

#### 新增套件來源

`# echo "deb http://ppa.launchpad.net/sysd/sysd/ubuntu YOUR_UBUNTU_VERSION_HERE main " >> /etc/apt/sources.list`
`# echo "deb-src http://ppa.launchpad.net/sysd/sysd/ubuntu YOUR_UBUNTU_VERSION_HERE main" >> /etc/apt/sources.list`

#### 更新套件庫

`# apt-get update`

#### 安裝 sysd

`# apt-get install sysd`

#### 啓動 sysd

`# /etc/init.d/sysd start`

# Fedora
目前可用發行版爲 Fedora 20
https://build.opensuse.org/package/show/home:matlinuxer2/sysd

#### 增加套件庫
`wget -O /etc/yum.repos.d/home:matlinuxer2.repo http://download.opensuse.org/repositories/home:matlinuxer2/Fedora_20/home
:matlinuxer2.repo`

#### 安裝 sysd
`yum install -y sysd`

#### 修正執行權限
`chmod u+x /usr/sbin/sysd`

#### 執行 sysd
`# /usr/sbin/sysd`
git rmで特定のパターンのディレクトリ配下を全部削除する

`app/src_bk/`
`app/src/usr_bk/`
例えば色んな所に_bkなんてディレクトリがあって消したいとき、
そもそもコミットするなという話ですがやむを得ないときに。

`git rm -rn '**_bk/*'`
で全部消えます
.gitignoreの記法と微妙に違うようです。
RubyMotionでのデバッグ


## RubyMotionのデバッガー
 
- LLVM のデバッガ LLDB をベースにしたもの

- RubyMotion アプリのプロセスへの接続と内部の調査ができるようしたもの

- かなり低レベル


## デバッガを起動する方法

simulator タスクで作業する場合

```
$ rake simulater debug=1
```

rake の device タスクを実行する場合

```
$ rake device debug=1
```

#### アプリケーションが実行される前にGDBコマンドを実行したい場合

```
$ rake debug=1 no-continue=1
```

この後デバッギングの設定を行ったりできる

```
(lldb) breakpoint set --file hello_view.rb --line 10
```


#### アプリケーション実行時に実行したいコマンドをファイルで保持

デバッガはプロジェクトのルートディレクトリ内のdebugger_cmdsというファイルを参照する

```
$ echo "breakpoint set --file hello_view.rb --line 10" > debugger_cmds
$ rake debug=1  
```



## デバッガ起動時のコマンド


#### 現在のデバッグ環境で設定されているブレークポイントの確認

```
(lldb) breakpoint list
```

#### バックトレースをたどる
```
(lldb) thread backtrace
```
#### バックトレースの特定のフレームへ移動する
```
# デフォルトではトップフレーム(#0)
(lldb) frame select 2
```

#### 実行中のすべてのバックトレースを表示する
```
(lldb) thread backtrace all
```

#### スレッドの切り替え
```
(lldb) thread select 2
```

#### 指定されたオブジェクトに対してinspectメッセージを送りその値を返す
```
(lldb) print-ruby-object self
(lldb) pro box #print-ruby-objectのショートカット
```

#### ローカル変数のリストを表示する
```
(lldb) frame variable
```

#### ローカル変数の調査
```
(lldb) pro text
```

#### オブジェクトのインスタンス変数表示
```
(lldb) print-ruby-ivar "@window"
(lldb) pri self "@window"
```

#### rubyのソースコードレベルで次の行へ移動する

```
(lldb) next
```

#### ブレークポイントへ到達するまで実行を再開
```
(lldb) continue
```

#### デバッガの終了
```
(lldb)exit #もしくはquit
```


## 参照
- [Debugging RubyMotion applications](http://rubymotion.jp/RubyMotionDocumentation/articles/debugging/)
遅延評価される文字列を作ってみた

新しくオープンした日本語版stack overflowを見ていたらこんな質問がありました。
http://ja.stackoverflow.com/questions/1606/rubyで文字列の式展開を後から行うには

読んでいた所、文字列内での変数展開（`#{hogehoge}`）を遅延評価するようにできるかな？と、気になったので、ちょっと試しに作ってみました。
本来の質問とは離れた気がするけど、気にしない。

使用例
------------
```rb
str = LazyString.new 'Curent Time: #{Time.now}'
puts str # => Curent Time: 2014-12-16 22:56:02 +0900
sleep 1
puts str # => Curent Time: 2014-12-16 22:56:03 +0900
```

クラス定義
----------------
```rb
class LazyString
  def initialize str
    @str = str
  end

  def to_s
    eval %Q("#{@str}")
  end
  
  def to_str
    to_s
  end
  
  def inspect
    %Q("#{@str}")
  end
  
  def +(opponent)
    to_str + opponent.to_str
  end
end
```

問題点
-----------------
### Stringクラスを継承するとputs時にto_sが呼ばれなくなる
```rb
class LazyString < String
  def initialize str
    super
  end

  def to_s
    puts 'LazyString#to_s'
    'dummy'
  end
end

puts LazyString.new('test')
# => test
puts LazyString.new('test').to_s
# => LazyString#to_s
# => dummy
```
予想外。

### Stringクラスを継承していないので、色々な演算子を定義する必要あり
とりあえず`+`だけ定義してみた。

```rb
str = LazyString.new 'Curent Time: #{Time.now}'
str + ' is fixed'
# => "Curent Time: 2014-12-16 23:09:40 +0900 fixed"
```
評価しない`+`も欲しくなってくる。

### スコープはあくまでLazyString
```rb
str = LazyString.new 'Hello, #{name}'
name = 'Sheile'
puts str
# => NameError: undefined local variable or method `name' for "Hello, #{name}":LazyString
```

まとめ
-------------
副作用が大きいので、実際に何かに使うことは無さそうですがStringを継承した場合の予期せぬ挙動とかも見れたので、なかなか面白い挑戦でした。