OmniAICreator/Qiita-1.07M huggingface dataset:
TestObserverとTestSubscriber

RxJava 1.1にて，いままでExperimentalだった`TestObserver`と`TestSubscriver`がbetaになりました．
どちらもインスタンスを`subscribe()`の引数に渡してあげて使います．

## TestObserver
### 何をするの？
* `onNext`，`onError`，`onComplete`の各イベントをすべて記録してくれる
* 記録したうえで別の`Observer`に処理を移譲できる
* 記録したイベントのassertionができる

#### APIs
* `getOnCompletedEvents()` / `getOnErrorEvents()` / `getOnNextEvents()` / `getEvents()`
  - 発生イベントのgetter 
* `assertReceivedOnNext(List<T> items)`
  - `onNext`で意図通りのイベントが流れているかの検査
* `assertTerminalEvent()`
  - terminal event（`onError` or `onComplete`）が1つだけ発生したかどうか

## TestSubscriber
### 何をするの？
* `Subscriber<T>`及び`Subscription`のサブクラス
* `TestObserver`を内部に持つ

### APIs
* `TestObserver`の各メソッド
  - `TestSubscriber`が保持する`TestObserver`のインスタンスに移譲している
* `assertUnsubscribed()`
  - unsubscribedされているかの検査 
* `assetNoErrors()`
  - エラーが発生していないかの検査
* `awaitTerminalEvent()` / `awaitTerminalEvent(long timeout, TimeUnit unit)`
  - terminal eventが発生するまで待ってくれる
  - （内部で`CountDownLatch`を保持している）
* `awaitTerminalEventAndUnsubscribeOnTimeout(long timeout, TimeUnit unit)`
  - timeoutしたらunsubscribeしてくれるタイプの`awaitTerminalEvent` 
* `getLastSeenThread()`
  - 最後に発生したイベントのthreadを返す
* `assertCompleted()` / `assertNotCompleted()`
  - `onComplete`が1回以上呼ばれているか・呼ばれていないか 
* `assertError(Class<? extends Throwable> clazz)` / `assertError(Throwable throwable)`
  - そのエラーが1回呼ばれたか
  - 2回以上エラーが発生していても`AssertionError`
* `assertNoTerminalEvent()`
  - terminal eventが呼ばれていないことの検査 
* `assertNoValues()`
  - `onNext`が呼ばれていないことの検査 
* `assertValueCount(int count)`
  - `onNext`が`count`回呼ばれたかどうかの検査 
* `assertValues(T... values)`
  - `assertReceivedOnNext()`の可変長引数ver.
* `assertValue(T)`
  - `assertReceivedOnNext()`の引数が1つだけver.


## References
* [TestObserver.java](https://github.com/ReactiveX/RxJava/blob/1.1.0/src/main/java/rx/observers/TestObserver.java)
* * [TestSubscriber.java](https://github.com/ReactiveX/RxJava/blob/1.1.0/src/main/java/rx/observers/TestSubscriber.java)
【IOS9】アップデート後の対応

2015/12/19
xcodeVersion 7.2
IOS9.2
ライブラリはIOS9のせいではないかもしれません。

# cocoapodsの更新
AFNetworkingとAFJSONRPCClientを入れていたのですが、
AFJSONRPCClientを入れるとAFNetworkingも入るようになったのかcocoapodsでエラーになってました。

```lang:error
target 'hoge' do
  pod 'PSCollectionView', '~> 0.0.1'
  pod 'AFJSONRPCClient', '~> 2.1.1'
  pod 'AFNetworking', '~> 3.0.1'
  pod 'AsyncImageView', '~> 1.5.1’
end
```

AFJSONRPCClientだけをinstallするようにしたら直った。
これでAFNetworkingも入ってる。

```lang:solution
target 'hoge' do
  pod 'PSCollectionView', '~> 0.0.1'
  pod 'AFJSONRPCClient', '~> 2.1.1'
  pod 'AsyncImageView', '~> 1.5.1’
end
```

# http通信の変更
非SSL/TLS以外はエラーになるようになってる。

```lang:error
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

plistを更新して回避。

```lang:solution
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
```

![スクリーンショット 2015-12-19 22.26.55.png](https://qiita-image-store.s3.amazonaws.com/0/64334/4f03fa5e-0706-498b-29b7-49adcd8e191d.png)


# UIWindowの挙動の更新

```lang:error
[UIApplication _runWithMainScene:transitionContext:completion:]
```

```lang:errorの出るコード
CGRect bounds = [[UIScreen mainScreen] bounds];
_window = [[UIWindow alloc] initWithFrame:bounds];
_window.backgroundColor = [UIColor whiteColor];

_hogeViewController = [[hogeViewController alloc] init];
[_window addSubview:_hogeViewController.view];

// Override point for customization after application launch.
[_window makeKeyAndVisible];
```

_window.rootViewController = _hogeViewController;を追加する。

```lang:solution
CGRect bounds = [[UIScreen mainScreen] bounds];
_window = [[UIWindow alloc] initWithFrame:bounds];
_window.backgroundColor = [UIColor whiteColor];

_hogeViewController = [[hogeViewController alloc] init];
_window.rootViewController = _hogeViewController;
[_window addSubview:_hogeViewController.view];

// Override point for customization after application launch.
[_window makeKeyAndVisible];
```

詳細
http://qiita.com/peromasamune/items/716de6da66dd31faeba8
Seleniumの薄っすい話6:俺と最近のSelenium IDE

この記事はSelenium/Appium Advent Calendar 2015の17日目の記事です。

薄っすい記事は6日目です！こんにちは！
ほんとは内容が薄いと思って1記事にくっつけるつもりだったのを小分けにしたんですよ！！！

というわけで今までよりさらに薄っすいのを書きます。

# 昔のSelenium IDEは今すぐに捨てろって話

WebDriverガチ勢からの勧告ではなくて、さっさと**新しいバージョンのSelenium IDE**に移行しましょうという話です。

# なんでだよ！

2015年12月15日リリースほやほやのFirefox 43から、未署名のアドオンを利用できなくなったからです。セキュリティー的なアレです。

Firefoxのアドオンはこれまで、Mozillaのデジタル署名がついていなくても警告つき・自己責任で利用できました。Selenium IDEはFirefoxのアドオンとして提供されているわけですが、バージョン2.9.0まではすべて未署名の状態で公開されています。

![昔は良かった](https://qiita-image-store.s3.amazonaws.com/0/33963/910c9c0f-6bc8-e7e9-f631-5e301f447541.png)

いま、何も考えずにFirefoxのバージョンを上げると大惨事です！！！！

![ide02.png](https://qiita-image-store.s3.amazonaws.com/0/33963/e4e1cc9b-feba-1940-a253-b49ea7dcd0a3.png)

ぐわーーーーーーー！！！！

# そんなこと言われてもどうすりゃいいのさ

[署名済みの新バージョン2.9.1がすかさず公開されました](https://addons.mozilla.org/ja/firefox/addon/selenium-ide/)ので、感謝しながらさっさと移行しましょう。

![ide03.png](https://qiita-image-store.s3.amazonaws.com/0/33963/a4bb7853-8362-611a-eea2-57b1b1010555.png)

なお、これまでプログラミング言語へのフォーマッターは独立してインストールされていましたが、このバージョンからSelenium IDE本体ひとつにまとめて内蔵される形になりました。フォーマッターが無くなったとかあわてるのはやめましょう（自戒）。

# プ、プラグインは？プラグインはどうなってるの、ねぇハアハア

おまえ[SelBlocksさえ無事ならそれでいい](https://addons.mozilla.org/ja/firefox/addon/selenium-ide-sel-blocks/)って顔してるぞ！！

addons.mozilla.orgで検索して見つかるやつは大丈夫です使えるはずです。そうでないやつは...あいつはいいやつだった...

オリジナル版の更新が止まってるのでforkして対応進めちゃった系とかが、今後が気になる感じですね。[WebDriver用のPHPフォーマッター](https://github.com/suzuki/PHP-Formatter-PHPUnit_Selenium2)とか...

# Selenium Builderは、ねぇハアハア

[大丈夫だ、心配ない。](https://addons.mozilla.org/ja/firefox/addon/selenium-builder/)

# 薄っすい話なので以上です。

次回はkinuasaです。よろしくお願いします。
Selenium/Appium Advent Calendar 2015の残り枠があと1日になりました！まだまだ薄っすいのも濃ゆいのも募集中です！
Magento2日本語ロケールの当て方

本記事は[Magento Advent Calendar 2015](http://www.adventar.org/calendars/931)の20日目の記事になります。

前回は[初心者がさくらのサーバーにMagento2を構築してみた](http://qiita.com/takuxy/items/e453d7eae3e65155a986)という記事の中で、Magento2の構築方法を解説させて頂いたので、今回はMagento2への日本語ロケールの当て方を説明していきます。
<h1>概要</h1>
構築済みのMagento2に対して、Composerを用いて日本語ローケルを当てます。日本語ロケールを当てる際にMagentoアカウントを取得しておく必要があるので、まだ作成していない方は[公式サイト](http://magento.com/)よりアカウントを作成しておいて下さい。

1.Composerのインストール
2.Secure Keyの取得
3.日本語ロケールのインストール
4.管理者画面からローケル変更

<h2>1.Composerのインストール</h2>
Magento2日本語ロケールをインストールするため、PHPの依存管理ツールであるComposerをインストールします。
Composerを作業ディレクトリにダウンロードして下さい。
<font color="green">$curl -sS https\://getcomposer.org/installer | php</font>


<h2>2.Secure Keyの取得</h2>
SecureKeyを取得するため、[公式サイト](http://magento.com/)へ行き、先ほど作成しておいたアカウントでログインしてください。
右上の[MY ACCOUNT]をクリックすると、以下の画面に飛びます。

![スクリーンショット 2015-12-17 17.58.07.png](https://qiita-image-store.s3.amazonaws.com/0/97920/375b248b-5498-c789-d9b9-3cd09e44abc5.png)

[Developers]>[SecureKeys]を選択して、名前を入力後、[Generate new]を押すことでSecureKeyを作成します。
ここで取得したPublicKeyとPrivateKeyは後に、日本語ロケールのインストールの際に必要となります。

<h2>3.日本語ロケールのインストール</h2>
日本語ロケールをComposerを用いて、インストールしていきます。
<font color="green">$php composer.phar require magento-japan/m2-japaneselocale:dev-master</font>
インストール実行の際にuser nameとpasswordを聞かれるので、ここで先ほど取得したPublicKeyとPrivateKeyを入力します。
username: Public Key
Password: Private Key

事前にgitをインストールしていないとエラーメッセージが表示されてしまいますが、以下の画面が表示されていれば、日本語ロケールのインストールは完了です。
![スクリーンショット 2015-12-17 18.13.02.png](https://qiita-image-store.s3.amazonaws.com/0/97920/ce30e497-ee71-c5bf-2d85-496738307026.png)

<h2>4.管理者画面からロケール変更</h2>
日本語ロケールのインストールが終了した後は、管理画面からロケールを日本語に変更します。Magento2管理画面にアクセスして、右上の[admin]>[Account Setting (admin)]を選択します。

![スクリーンショット 2015-12-17 18.21.12.png](https://qiita-image-store.s3.amazonaws.com/0/97920/efe9d254-7ddc-6321-1126-06ab20ab56e1.png)

Account Informationから[Interface Locale]の欄を日本語に変更します。
パスワードを入力した後、Save Accountをクリックすると完了です。

![スクリーンショット 2015-12-17 18.23.48.png](https://qiita-image-store.s3.amazonaws.com/0/97920/1f9a8758-7a09-a3e8-0199-a141af98ae0f.png)

キャッシュを消して、再度アクセスすると、管理画面が日本語表示されていることが確認できるはずです。

![スクリーンショット 2015-12-17 18.28.57.png](https://qiita-image-store.s3.amazonaws.com/0/97920/d9867092-6685-f08a-b2d5-4172017a047f.png)

今回はMagento2日本語ロケールの当て方について解説させて頂きましたが、英語が普通に読める方、または英語を勉強しないといけない方は日本語ロケールなど当てずに英語のままで頑張りましょう。
頑張ります！
ゲームにおけるガベージコレクションとの付き合い方

プログラムでメモリリークは怖いですよね。
どんどんとメモリ使用率が上がっていき最終的にフリーズ＆クラッシュ。そんなプログラムはかきたく無いものです。
それを解消してくれるガベージコレクション(以後 GC )のお話が [18日目](http://qiita.com/tonkotsuboy_com/items/5bc9ce8bde902022d139)にありましたが、そのお話に少し付け加えて、「じゃあどうやってその GC と仲良くしていけばよいのか？」のひとつの答えとして、ゲームにおける GC との付き合い方の一例を紹介したいと思います。

# 基本的にはメモリは開放していくもの
基本的にはメモリにゴミが残らないようにし、GC はにはちゃんと仕事をしてもらうことが望ましいです。
そうしないと冒頭で書いたとおり、フリーズ＆クラッシュな未来が待っています。
18日目の記事で GC を動かす際に

```as3
System.gc();
```

と強制的に GC を実行させていました。
記事にもありましたがこの方法はあくまでデバッグ用で、FlashPlayer であればデバッグプレイヤー、AIR であれば adl での実行中や、インストールされているアプリケーションでもアプリケーションサンドボックスのコンテンツなどでしか動きません。
基本的には勝手に動くのが GC で、 **メモリが足りなくなってきたとき**、**システムが何もしてないとき** に動きます。
そこでどうするかですが、メモリ強制的に足りなくすれば GC を動かすことができたりします。

```as3
new BitmapData(512, 512).dispose();
```

このように `BitmapData` などでメモリを圧迫して、すぐに削除してやることで動いたりします。
強制的に動かす手段として覚えておくとよいでしょう。

# GC のデメリット
GC のメリットは言わずもがな **自動的にいらないメモリを開放してくれる事** です。
ではデメリットは何でしょうか？
実は **GC が動くこと** がデメリットです。
矛盾していますね。
GC が動かなければメモリリークを起こす危険性があるのに、そもそも GC が動くことがデメリットとはどういうことなのか？
それを知るためにまずは GC が何をしているか説明しましょう。

# GC の仕事
GC の仕事はいくつかの方式があり、よく使われるのは「マーク＆スイープ」と呼ばれる方式です。
簡単に説明すると「マーク＆スイープ」ではまずメモリ内のオブジェクトで「これはいらない(参照がない)」ものに対して「削除予定」のしるしを付けます。それが「マーク＆スイープ」の「マーク」です。
そして、マークされたオブジェクトはそのうち削除します。それが「マーク＆スイープ」の「スイープ」になります。
その二つが GC の仕事です。
参照がないということを探るにはすべてのオブジェクトを走査してマークし、マークしたものをすべて削除する。その際に走査するオブジェクトが多かったり、削除するオブジェクトが多かったりすると CPU の占有率を高め**画面のカクツキ**として現れます。
GC の処理は意外と重いのです。
アクションゲームでゲーム中にカクッと止まるゲームをしたいと思いますか？
そんなゲームは絶対気持ちよくないですよね？
ではどうするのがよいのでしょう？

# プレイ中は GC を動かさないようにする
走査や削除が重いなら最初から動かないようにしてしまえばいいのです。
具体的に言えば **既に作ったオブジェクトを使いまわす** です。
例としてシューティングゲームを考えてみましょう。
出てくるものは Player(自機)、Enemy(敵機)、Bullet(弾丸)、の3つの最小限のものにします。
自機は基本的に1体なので普通に new します。

```as3:Main.as
player = new Player();
```

しかし Enemy や Bullet は常にいるわけでもありませんのでその都度作ります。

```as3:Main.as
// 敵が現れたとき
var enemy: Enemy = new Enemy(x, y);
enemyList.push(enemy);

// 画面外に行った時
if (outScreen(enemy))
{
	// 配列から削除して Enemy オブジェクトを破棄する
	enemyList.splice(enemyList.indexOf(enemy), 1);
	enemy.dispose();
}
```

大体こんな感じでしょうか。
そしてこの `enemy` がメモリ上から削除されるのは GC が働いた時です。
GC が働かない間はメモリに残り続けます。
そして `enemy` は1体だけではないでしょうし、 `Bullet` のインスタンスも同じような処理でメモリに残っていきます。
その大量に溜まったゴミを GC が削除すると、先ほど説明した「画面のカクツキ」が起こります。
なので `Enemy` をリサイクルするように作り変えます。
オブジェクトプールと呼ばれる配列を用意してそこから受け取るようにしましょう。

```as3:Main.as
// 敵が現れたとき
var enemy: Enemy = objectPool.getEnemy();
enemy.init(x, y);
enemyList.push(enemy);

// 画面外に行った時
if (outScreen(enemy))
{
	// 配列から削除して Enemy オブジェクトを破棄する。
	enemyList.splice(enemyList.indexOf(enemy), 1);
	enemy.dispose();
	objectPool.returnEnemy(enemy);
}
```

このようにいちいち new をせず、オブジェクトプールから使っていないオブジェクトを受け取り、使い終わったらオブジェクトプールに返すように作ります。こうすることで、常に `objectPool` 内で参照を持つので GC 対象になりませんし、一定数のオブジェクトがプールされていれば新たに new することは無いのでメモリを圧迫することもありません。

# 最後に
GC は便利な仕組みです。しかし便利であるからこそデメリットもあったりします。
デメリットを知っているからこそオブジェクトを安易に new したり破棄したりしないほうがいいときもあることを知ることができました。

Flash は便利な仕組みを無意識に使える良いプラットフォームでありながら、「知らずとも使えてしまう」という諸刃の剣を装備してしまいました。
その諸刃の剣を我が物として自由に扱えるかどうかを決めるのは、多くの「知らずとも使えてしまう」事を知ることだと思います。
そして「おまじない」として覚えるだけでなく、どうなっているのか、何故なのか探ってみてください。
知らなかった仕組みを知るのは、自分の武器になるだけでなくとても楽しいことだと思います。
Azure Storage AppendBlobを使ってみる(.NET編）


原則としてBlobは追記できません。

多くの場合、追記できなくても差し支えないのですが、ログなどをHDInsight等で分析する際、オンプレ環境からBloBにログを移す作業が分析よりしんどい。そこで、ログを直接BloBに追記、保存したいというニーズが発生します。

##AppendBlob

このようなニーズを満たすために2015年の夏に登場したのがAppendBlob。その名の通り追記できるBlob。
今までのBlockBlobとPageBlobと合わせて3つの種類となりました。

本当は環境依存の低いPHP SDKかREST API経由で利用したかったのですが、PHPには2015年12月時点で未実装のようです（ちらっとソースを見る限り。間違いならご指摘を！）。

またREST APIは、設定がわからず、うまく通信できませんでした（解決するには情報が少ないので一旦保留）。

>リファレンスを見る限りnode.js用のSDKにはAPIが追加されているようでした。

というわけで、とりあえず王道の.NETからの接続をまずはメモしておきます。

##環境

###前提

* Azureのアカウントを取得し、かつ、Storageも生成していることを前提とします。

###ツール類など

とりあえず無難に下記の環境を利用します。

* ツールはVisualStudio2015 Communityを使います。
* コンソールアプリで試します。
* 追加ライブラリとしてNuGetでWindowsAzure.Storageをインストールします


##実装

REST APIで苦労したのがウソのように簡単に利用できます。

```csharp
using System;

//追加
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

namespace AppendBlobTest1
{
    class Program
    {
        static void Main(string[] args)
        {
            //コンテナ名
            String containerName = "CONTAINER_NAME";
            //ストレージKey
            String key = "YOUR_KEY";


            //アカウント生成
            CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(containerName,key),useHttps:false);

            //Blobクライアント生成
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

            //コンテナ参照生成
            CloudBlobContainer container = blobClient.GetContainerReference("test");

            //コンテナがなければ作る
            container.CreateIfNotExists();

            //追加Blobの参照生成
            CloudAppendBlob appendBlob = container.GetAppendBlobReference("append-blob.log");

            //作るか置き帰るか（既存を使う場合はいらない）
            //appendBlob.CreateOrReplace();

            //テキスト追記
            appendBlob.AppendText("hoge1\n");
            appendBlob.AppendText("hoge2\n");

            //内容をダウンロードしてテキスト表示
            Console.WriteLine(appendBlob.DownloadText());

            //入力街
            Console.ReadLine();
        }
    }
}

```

以上です。簡単。

##宿題

* Azure PHP SDKで試す（SDKが対応したら）
* REST APIで試す（情報が増えたら）
git diffで画像の差分をみる

[Image diffs with git](http://www.akikoskinen.info/image-diffs-with-git/) で紹介されていたネタです。

最近UIまわりをいじっているので画像をいろいろ githubにいれたりすることがあります。githubの画像差分機能はそれなりに優秀なのですが、そもそも commitするまえに確認したいことがあります。でもそのままでは gifは画像の差分を見せてくれません。

でも gitの configurabilityがあればなんとかなります。

まず、システム全体で imageファイルを見割られるように、globalな attributeファイルを指定します。

```
git config --global core.attributesfile '~/.gitattributes'
```

`~/.gitattribute`の中身は以下の様なのものです。万が一、すでに globalな attributeファイルが有ったりしたら適宜編集してください。

```
*.gif diff=image
*.jpg diff=image
*.png diff=image
```

gitになにが画像ファイルか教えこんだところで、これらの画像ファイルの比較の仕方を指定します。

```
git config --global diff.image.command '~/bin/git-imgdiff'
```

問題の `~/bin/git-imgdiff` は、以下のようにしました。自分は OS-Xなので、もと記事とチョット違います。

```
#!/bin/sh
compare $2 $1 png:- | montage -geometry +4+4 $2 png:- $1 /tmp/diff.png
open /tmp/diff.png
````

これで以下のような差分を表示できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/28133/3e09dc1c-c318-433a-1b60-a618379501f4.png)
JDBIを使ったRDBのCRUD

# まえがき

以下、長い駄文が控えていますので、御託はいいからサンプルコードを見たい！という方は[こちら](https://github.com/poad/examples/tree/master/jdbi-examples)を御覧ください。

ちなみに、リンク切れしていたり、情報が古くなっていたので、以前書いた Hibernate4を使ったJPA を、[Hibernate5を使ったJPA](http://qiita.com/poad1010/items/726c184a48db88de1249)として、アップデートしました。

# まえがき２（駄文の始まり）
[Hibernate5を使ったJPA](http://qiita.com/poad1010/items/726c184a48db88de1249)で、Hibernate 5を使って、JPA 2.1のAPI経由でRDBへのCRUDを行ったのですが、ORMを使っていていつも思うこと。

* DBのスキーマとオブジェクトを対にする必要ってなくて、SQLの結果とオブジェクトが対になっていればよくないか？
* SQLって、ロジックそのものに埋め込まれるべきではなくて、きちんと特定のオブジェクト（所謂 DataAccessObject)に隠蔽されるべきではないか？

後者はよく行われているが、前者は、JPAなどにも見られるように、そこまでやられていない。
むしろ、SQLそのものが隠蔽（というか自動生成）されていて、DBのテーブルと対となっている場合が多い（ORMがObject Relation Mappingだから当然と言われそうだが）

しかし、DBのスキーマを変えて、ORMでマッピングされるオブジェクトと、それを使うロジックそのものが影響を受ける（ロジックで使用しているカラムの追加削除なら、それに応じた処理が追加・変更・削除されるからいいとしても、SQLでしかいじらないようなカラムの場合はどうするの？という）

## 個人的な意見

これは、極めて個人的な意見ではあるのだが、SQLそのものと、その入出力をマッピングするロジックは、ある程度は開発者が意識すべきで、単純にSQLを発行するだとか、SQLのクエリへの変数のバインドなどは、ゴリゴリロジック書いたり、ツール使って吐き出すのではなく、動的に発行されればいいんでないの？
で、そもそも、ロジックが意識するのは、データベースのスキーマと対になったオブジェクトではなくて、SQLのクエリとのインタフェースじゃないのか？と

# JDBIとは？
そんな想いを胸に秘めながら（笑）、[Dropwizard](http://www.dropwizard.io/)のGetting Startedを読んでいたら、[JDBI](http://jdbi.org/)なるものを発見し、試しに使ってみたところ、上述した不満を尽く解決してくれていて、同じことを考える方が居るものだと感銘を受けて、隠れファンとなりました:p

# 環境

今回は以下の環境にて開発しています。

- JDK8
- H2(インメモリDBとして使いやすいので、別途、DBMSをローカルに入れる手間がないので、サンプルコードを書くときに使っています。JDBI自体は、JDBCドライバがあれば、他のRDBMSでも動きます。MySQLとかでも動かしたことあるので)
- JDBI
- Gradle(ここ重要。あまり、他のサンプルコードでGradleを使っているものが見受けられなかったので)
- TestNG(好みでしょう。アノテーション変えればJUnitでも動く程度のテストコードしか書いてません)
- Eclipse + TestNGプラグイン（すみません。実は、Gradleのtestが動くかわかりません。Eclipseから動かしてます）

# サンプルコード
冒頭に記述したものがそれです。
https://github.com/poad/examples/tree/master/jdbi-examples
[iOS][Android]iBeacon

<p>先日の<a href="http://www.mosa.gr.jp/?p=31528 ">第12回 MOSA Tech Meeting</a>で得られた情報だ。</p>

<p>以前は、iBeacon機器の情報はApple Developerサイトで公開されていなかった為、AndroidアプリケーションをiBeaconに対応させる為には、ネットで得られる情報を信じて実装するしかなかった。</p>

<ul>
<li><a href="http://www.bitz.co.jp/weblog/?date=20140429">[iOS][Android]すれちがい通信（その8）</a></li>
</ul>

<p>それが、<a href="https://developer.apple.com/ibeacon/">iBeacon for Developers</a>サイトの『Download Artwork and Specifications』のリンクから入手できるようになった。</p>

<p>当然の結果だが、『[iOS][Android]すれちがい通信（その8）』で紹介した実装で問題なかった。</p>

<p>詳しく説明したいのだが、仕様書ダウンロードの際に確認があるので、残念ながら、控えることにする。</p>

ソースコード
GitHubからどうぞ。<br />
<a href="https://github.com/murakami/workbook/tree/master/android/Wibree">https://github.com/murakami/workbook/tree/master/android/Wibree</a> - GitHub<br />

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="http://www.bitz.co.jp/weblog/?date=20140429">[iOS][Android]すれちがい通信（その8）</a><br />
<a href="https://developer.apple.com/ibeacon/">iBeacon for Developers</a><br />

【Cocoa練習帳】
<a href="http://www.bitz.co.jp/weblog/">http://www.bitz.co.jp/weblog/</a><br />
<a href="http://ameblo.jp/bitz/">http://ameblo.jp/bitz/</a>（ミラー・サイト）<br />
<a href="https://t.co/6P3h2jtbRk</a>note<br />
Scala開発環境 OSX10 Eclipse


MacBook Air OSX10 YosemiteにScalaの開発環境構築時のメモ

#1.JDKのインストール

+ 2015年12月19日時点の最新版JDKをインストールしました。
http://www.oracle.com/technetwork/java/javase/downloads/index.html
+ バージョン：Java SE Development Kit 8u66
+ 自宅の環境ではダウンロードに1分ほど...
+ ダウンロードが完了したらインストールする。([インストール方法](https://www.java.com/ja/download/help/mac_install.xml))


#2.Eclipse準備する

+ ScalaIDE FOR ECLIPSE をhttp://scala-ide.org/ からダウンロード
+ バージョン：4.3.0 
![ScalaIDEforEclipse.png](https://qiita-image-store.s3.amazonaws.com/0/57103/c864bfb4-2ad1-c0d8-9dbf-972b574d6f0b.png "ScalaIDEforEclipse.png")

+ ダウンロードしたzipファイルを解凍します。
+ 解凍した「eclipse」フォルダは「アプリケーション」ディレクトリに移動しました。
+ フォルダ名でIDEのバージョンが判断できるように「eclipse.4.3.0_Scala」に変更しました。

#3.Eclipseを起動する

+ 最初にLaunchpadに表示されているEclipseを起動すると下記エラーとなってしまうので、「eclipse.app」を「開く」で起動すること。
![スクリーンショット 2015-12-19 17.33.28.png](https://qiita-image-store.s3.amazonaws.com/0/57103/ca619cdc-6893-870e-4e60-3c1db782ac01.png "スクリーンショット 2015-12-19 17.33.28.png")

+ 起動中の画面
![eclipse起動.png](https://qiita-image-store.s3.amazonaws.com/0/57103/82f12974-8fba-8286-df46-22cd63c9bdd7.png "eclipse起動.png")

+ 起動後の画面
![スクリーンショット 2015-12-19 18.02.18.png](https://qiita-image-store.s3.amazonaws.com/0/57103/89f46441-1e93-2939-1fb8-25ff6ec4f84e.png "スクリーンショット 2015-12-19 18.02.18.png")

#4.Eclipseの日本語化

+ すいません。日本語にさせていただきます。。。
+ Eclipseの日本語化プロジェクトPleiadesからダウンロードする。
(http://mergedoc.osdn.jp/)
+ サイトの「Pleiades プラグイン・ダウンロード」箇所から選択。今回は「安定版」を選択しました。
+ 「pleiades_1.6.0.zip」をダウンロードし解凍します。
+ 解凍したplugins、features ディレクトリにECLIPSE_HOMEにコピーする。
+ eclipse.ini の最終行に以下の 2 行を追加。
-Xverify:none
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

+ ./eclipase -cleanで起動した。
![pleiades.png](https://qiita-image-store.s3.amazonaws.com/0/57103/75ea57f3-3c77-1705-ba21-9114db64c075.png "pleiades.png")
+ 日本語化後はこのような初期表示となります。
![スクリーンショット 2015-12-19 21.23.22.png](https://qiita-image-store.s3.amazonaws.com/0/57103/a686d402-72ec-fef1-71ea-60d953c42887.png "スクリーンショット 2015-12-19 21.23.22.png")

<br/>
---
##### eclipse.iniがない問題
macでeclipse準備するものがはじめでだったので、Windowsであればフォルダにeclipse.iniが格納されていますが、macにない！どこだ、どこだー！google先生〜！
eclipse.appを右クリックし「パッケージの内容を表示」で無事見つかりました。

--- 
<br/>
#### 編集後記
Java書けることは当たり前の時代。何か新しいことやりたいなーって思ったのが2年ほど前。当時もScalaに手を付けたものの結構コーディングのお作法的なところ含め悪戦苦闘し一旦離脱。。。その間にruby、RoRをやったり。。。でもテスト記述のメリットは理解しつつ、ちょっと幻滅したこともあり、macも手に入れ、Scalaを再挑戦すべく今回の環境構築に至る。
<br/>
Selenium つれづれ2015（旧題：Seleniumネタを探して書きます）

なぜか今年は、「薄っすい話」というタイトルでハードルが上がりまくっている気がするのはなぜ？

兎にも角にも、最近Seleniumを使っていない状況が続いているのでネタ探しスタート。


#公式

何は無くともとりあえず本家
http://www.seleniumhq.org

## Webdriver

今年の最終バージョンは　2.48.2なんだ。
気がつくとサードバーティー製のドライバーが増えてる。
WinimとかEdgeDriverが今年の新顔かな？
EdgeDriverはこれから本格化するのに期待だけど
winiumってどういう実装なんだろうか？もしかしてプロトコルだけ合わせたということかなのかな？

公式サイトはリンクだけだけどソースはGit管理に変わっているからそっちを見てみよう
https://github.com/SeleniumHQ/selenium/issues
今年の更新の波は大きく４回あったんだな。
インシデントなどはこっちを見る方が早く情報が得られるね。

## chrome driver
ダウンロードリンクは公式にのっているけど、ソースを見たい場合はここかな？

https://github.com/scheib/chromium/tree/master/chrome/test/chromedriver

## safari driver

あれ？ソースって公開されてない？


##SeleniumIDE

ダウンロードリンクはページの真ん中のほうに移動したけど　SeleniumIDEは　2.9.1。
最新のFirefoxのセキュリティー対策されたというのは１７日の記事に出てましたね。
こちらのバージョンアップは基本な機能は枯れていると思われるのでFirefoxバージョンアップ追随がメインかな。今年はまさかのタイマー機能実装（日本語訳微妙なあいつです）というのがあったけど。
 

##SeleniumBuilder

SeleniumBuilderの更新はちょっと停滞気味な感じ？
https://github.com/SeleniumBuilder/se-builder/graphs/commit-activity

## Selenium3

そういえば　Selenium3はどうなったんだろう？？？

w3cに出されている　web driverのステータスはworking draft
http://www.w3.org/TR/webdriver/
これを受けて各ベンダーが実装してくるまでは３は出ないってこと？

追記）2016/05/26に発表がありましたね
発表内容をまとめてくれています。
[Adventures in Automation](http://www.tjmaher.com/2016/05/notes-selenium-3-spec-and-onwards-by.html) (外部リンク)

## appium

appiumも見ておかないと。
http://appium.io
1.4.16が最新バージョンで、間も無く1.5なんだ。

ってこんな本出てたのか！
Appium Essentials
https://www.packtpub.com/application-development/appium-essentials/?utm_source=POD&utm_medium=referral&utm_campaign=1784392480

## selendroid

selendroidは　0.17になってる！気がつかなかった。
http://selendroid.io

## SeleniumBasic(旧SeleniumVBA)

あれ？気がつかなかったといえば　seleniumVBAがいつの間にか　GitHubに移ってseleniumBasicに変わってた・・・　v2.0.6.0でさすがというか　Edgeにも対応してるし
http://florentbr.github.io/SeleniumBasic/
昨日の記事で対応しているけどこれからに期待っていうところらしい。

## Geb

Gebも８月に　0.12.2にバージョンアップしてるんだ
http://www.gebish.org

# コミュニティー

## SeleniumConf

そういえば今年のカンファレンスは確か９月にポートランドで開催。
http://year-2015.seleniumconf.org
日本から参加された方が報告会されてたけど行けなかったのが残念

あ、内容はyoutubeにもアップされているのでここから何かネタをひろうか？
https://www.youtube.com/user/seleniumconf

## 日本Seleniumユーザーコニュミティー

あと、情報収集するなら　日本Seleniumユーザーコニュミティーとか
https://groups.google.com/forum/#!forum/seleniumjp

## slackチャンネル

slackのチャンネルも外せないところ
https://seleniumjp.slack.com/

# 周辺ツール

公式以外だと
SeleniumIDEのこのプラグインがなかなかすごいと思ったんだっけ・・

Project ICKX Selenium-IDE User Extension
http://wkbd.ickx.jp/se/
CSVサポートからコマンド実行支援、配列操作などなど
使えそうなコマンドの追加っぷりがハンパない状態。


あとは　STFがリリースされて
https://www.cyberagent.co.jp/news/press/detail/id=10664

ライブラリでいくと　Pitalium(hifiveリグレッションテストライブラリ)が気になった
http://www.htmlhifive.com/conts/web/view/pitalium/WebHome

chromeのエクステンションにこんなものがあるのか！
https://chrome.google.com/webstore/detail/selenium-page-object-gene/epgmnmcjdhapiojbohkkemlfkegmbebb

オペラにも同じものががが
https://addons.opera.com/ja/extensions/details/selenium-page-object-generator/?display=en


# えーっと

以上、seleniumのネタの探し方でした。
忘れられた出力メソッドObject#display

#はじめに
Rubyist はメソッドチェーンが大好きです。
ですが、表示など出力に関しては関数的メソッドである `Kernel.#puts`、 `Kernel.#print`、 `Kernel.#p`、そして `Kernel.#sprintf`（そのエイリアスとしての `Kernel.#format` や `String#%`（いわゆる`%`記法））を使うことがほとんどだと思われます。とはいえ、それで特に違和感は感じないでしょう。
他のプログラム言語から Ruby に入ってきたひとも、関数的メソッドであれば違和感無く使えるでしょうし、そのような方であればメソッドチェーンで出力したい、と思うことは（まず）ないでしょう。

さて。
私は以前、`Kernel.#puts` を使ったときに、その引数にブロックが付いた場合、`do … end` と `{ … }` とで結合強度が違うことから不思議な挙動に触れて、それをネタに投稿をしたことがあります（とうとう100ストックに到達しました、ありがとうございます）。

- [Ruby - ブロックをdo…endで書くか{…}で書くかにより挙動が変わる例 - Qiita](http://qiita.com/riocampos/items/43e4431ddff93e01a18d)

そのときに次のようなコメントを頂きました。

>この場合、`(1..10).inject(0) do |sum, i|; sum + i; end.tap{|t| p t}`と、endの後に続ければいいんじゃね？

そう、出力もメソッドチェーンで行えばいいのです。
Rubyist はメソッドチェーンが大好きです（大事なことなので2度言いました）。

実は `tap` しなくても、そのようなメソッドが存在するのです。ということで、本投稿ではそのメソッドを取り上げます。それがタイトルに掲げた `Object#display` です。

#`Object#display`
前置きが長くなりました。
[るりま](http://docs.ruby-lang.org/ja/2.2.0/method/Object/i/display.html)には以下のように記載されています。

>##instance method `Object#display`

>`display(out = $stdout)` -> `nil`
オブジェクトを `out` に出力します。

>以下のように定義されています。

>```rb
class Object
  def display(out = $stdout)
    out.print self.to_s
    nil
  end
end
```

メソッドの定義まで書いてあるるりまはちょっと珍しいと思います。
返値は `Kernel.#print` メソッドと同様に `nil` が返ります。なのでこの先はメソッドチェーンできません。すこし残念ですね[^0]。
[^0]: 続けたければ `Object#tap` しちゃいましょう。

引数には出力先となるオブジェクトを渡します（普段の出力先は `$stdout` でしょうから引数無しでいいでしょう）。ということは、`print` メソッドの存在するクラスのインスタンスを渡せばどのようなところへも出力できる、ということになります。 Rubyist の好きな **Duck Typing** です。つまり `Kernel` はもちろん、`IO` や `StringIO` などのインスタンスを渡せばいいわけです。（使ったことが無いクラスですが）`Net::Telnet` インスタンスなどにも使えそうです[^1]。便利ですね。
[^1]: そこまでいくと便利なのか謎ですが。
なお、このメソッドは遅くとも（私の手元にある一番古い環境である） Ruby 1.8.7 から存在しています。

#使い方
ブロックの結合強度なんか気にしなくていいです。
出力したいインスタンスの末尾に付けてしまえばいいんです。
`(1..10).inject(0) do |sum, i|; sum + i; end.display` と書いちゃえばいいんです[^2]。
[^2]: ただし`do … end` のあとに続くことによる違和感はどうしても残りますね。`{ … }` のあとに書くと良いと思います。

#メソッドチェーンで `Kernel.#p` の代わりになるメソッドは？
`Object#display` メソッドの直前に `Object#inspect` メソッドを入れてしまえば OK です。
`〜.inspect.display` って感じです。

#`Object#display` を知ったきっかけ
数ヶ月前になりますが、るびまを読んでいて知りました[^3]。
[^3]: 0013号の記事なので、2006年2月には既に存在していたメソッドですね。
>`Object#display` は `$stdout.print obj` と同じ処理を行うメソッドです。 文字列の出力を行うとき、ブロック付メソッド呼び出しと混在させられるので便利です。 `print` と `select` や `map` でのブロック呼び出しを混在させるときは表示前に一時変数に 退避させる必要がありますが、`Object#display` メソッドを使えばその手間が省けるので 私はよく利用します。
[Rubyist Magazine - 標準添付ライブラリ紹介 【第 7 回】 net/http](http://magazine.rubyist.net/?cmd=view&p=0013-BundledLibraries&key=Object%23display)

ということで、知識としては頭に入ったのですが…（個人的には）使っていませんでしたw

#mruby には入ってなかった
ちょっと話が変わります。
今日、[mruby - iOSでRubyが書けるPictRuby - 平成を求める - Qiita](http://qiita.com/ongaeshi/items/e6dd9fd2e6f11b173c58) の記事を読んでから、mrubyに興味を持ちました[^4]。そしてバージョン1.2.0をインストールしました。
[^4]: 何周遅れなのでしょうか…。
そのときにふと `Object#display` メソッドを思い出し、 mruby に入っているのか確認してみました。
入ってませんでした。
でも mruby ももちろんオープンクラスに対応しているので、

>```rb
class Object
  def display
    print self.to_s
    nil
  end
end
```

とメソッド定義したところ、当然のように使えるようになりました。
これで mruby でも困りませんねw

#最後に
**Rubyist はメソッドチェーンが大好きです**（大事なことなので強調しました）。
Windows Server 2012 R2の導入

# 概要
自宅サーバーにWindows Server 2012 R2 評価版を導入したときの手順を残す。
ネットワークカードを認識しなかったため、適当なドライバを適用している。

# インストール
評価版のISOをダウンロードし、DVD-Rに焼いておく。

1. 評価版のDVD-RをDVDドライブに挿入して、DVDブートする。

1. 言語の設定
「日本語」の設定になっていることを確認し、「次へ」ボタンをクリックする。

1. インストール開始
「今すぐインストール」をクリックする。

1. エディションの選択
「Windows Server 2012 R2 Standard 評価版（GUI 使用サーバー）」を選択し、「次へ」ボタンをクリックする。

1. ライセンス条項の同意
「同意します」チェックボックスにチェックを入れ、「次へ」ボタンをクリックする。

1. インストールの種類の選択
「カスタム：Windows のみをインストールする（詳細設定）」をクリックする。

1. インストール場所の選択
以下は新規ディスクにインストールする手順
「ドライブ0の割り当てられていない領域（149.0GB）」を選択し、「新規」をクリックする。
サイズに全領域を設定し、「適用」ボタンをクリックする。
「システムファイル用に追加のパーティションを作成する」旨の情報ダイアログが表示されるので、「OK」ボタンをクリックする。
先ほど作成した「ドライブ0 パーティション2」を選択し、「次へ」ボタンをクリックする。

1. Windowsのインストールが自動的に開始され、何度か再起動される。


# パスワード設定
パスワードの設定を求められるので、セキュアなものを設定する。

1. Administratorのパスワード設定
パスワードを入力し、「完了」ボタンをクリックする。
ログインする。

# ホスト名とワークグループ名の変更
インストール直後のホスト名は、自動的に付与される分かりにくいホスト名となっているので、分かりやすいホスト名、ワークグループ名に変更する。

1. 「サーバーマネージャー」画面
「ローカルサーバー」を選択し、「プロパティ」の「コンピューター名」をクリックする。

1. 「システムのプロパティ」画面
「コンピューター名」タブで「変更」ボタンをクリックする。

1. 「コンピューター名/ドメイン名の変更」画面
以下のように設定する。
 * コンピューター名：*host*　～FQDNはActiveDirectory設定時に決める。
 * ワークグループ名：*workgroup*　～任意のワークグループ名を設定する。

1. 「ワークグループへようこそ」という旨の情報ダイアログ
「OK」ボタンをクリックすると、「再起動」を促す情報ダイアログが表示されるので、「OK」ボタンをクリックする。

1. 「システムのプロパティ」画面
「閉じる」ボタンをクリックする。

1. 「再起動」を促す情報ダイアログ
「今すぐ再起動する」ボタンをクリックする。

1. OSが再起動される。


# ネットワークアダプターの設定
OSインストール直後は、NICを認識せずネットワークに接続できなかったため、適切なドライバーをインストールする。

*当方のNICは、Winodws Server 2012 R2 用のドライバが提供されていなかったので、適当なものをインストールしてみた。*

1. 「サーバーマネージャー」画面
「ローカルサーバー」を選択し、「ツール」－「コンピューターの管理」を選択する。

1. 「コンピューターの管理」－「デバイスマネージャー」画面
「イーサネットコントローラー」を右クリックし、「ドライバーソフトウェアの更新」を選択する。

1. 「ドライバーソフトウェアの更新」画面
「コンピューターを参照してドライバーソフトウェアを検索します」をクリックする。
「コンピューター上のデバイスドライバーの一覧から選択します」をクリックする。
「ネットワークアダプター」を選択し、「次へ」ボタンをクリックする。

1. 「ネットワークアダプターの選択」画面
以下を選択し、「次へ」ボタンをクリックする。
 * 製造元： Intel Corporation
 * ネットワークアダプター：Intel(R) Ethernet Connection I217-LM

1. ドライバーのインストール
「ドライバーの更新警告」画面が表示されるが、「はい」ボタンをクリックする。
「ドライバーソフトウェアが正常に更新されました」という旨の情報ダイアログが表示されるので、「閉じる」ボタンをクリックする。

# ネットワークアドレスの設定
ネットワークアドレスがDHCPからの自動取得になっているので、固定IPアドレスを付与する。
また、IPv6は利用しないので無効化しておく。

1. 「サーバーマネージャー」画面
「ローカルサーバー」を選択し、「プロパティ」の「イーサネット」をクリックする。

1. 「ネットワーク接続」画面
「イーサネット」を右クリックし、「プロパティ」を選択する。

1. 「イーサネットのプロパティ」画面
「インターネット プロトコル バージョン 6」チェックボックスのチェックを外す。
「インターネット プロトコル バージョン 4」を選択し、「プロパティ」ボタンをクリックする。

1. 「インターネット プロトコル バージョン 4 （TCP/IPv4）のプロパティ」画面
以下のような設定を行い、「OK」ボタンをクリックする。**以下はサンプル**
 * IPアドレス：192.168.10.10
 * サブネットマスク：255.255.255.0
 * ゲートウェイアドレス：192.168.10.1
 * 優先DNSサーバー：*Primary DNS*
 * 代替DNSサーバー：*Secondary DNS*

1. ネットワーク接続の名前がデフォルトで「イーサネット」でわかりにくいため、変更する。
 * ネットワーク接続の名称：*hogehoge*

# 備忘録
以下のような事象を確認した。

- ネットワーク接続後は、Windows Server 2012 R2のデフォルトで、「ネットワークアダプタの種別」（NetworkCategory）が「パブリック」となる模様。


以上
middleman server のオプション

```middleman help server``` としても

```
Usage:
  middleman server [options]
```
としか出ないし、
ググッてもなかなか見つからないので、自分でソースコードを見てみることにしました。

※ソースコードを深く追えていないので、起動時にオプションを指定して確認できたものは説明を記載しています。

確認した Middleman の情報は以下です。

* version: 3.4.0
* ファイルパス: middleman-core-3.4.0/lib/middleman-core/cli/server.rb


詳細は以下の記事で。
http://blog.takumi-onodera.work/2015/12/19/middleman/
Visual Studio Codeを0.10.5に上げたらasync functionsがエラーになってつらい

![rapture_20151219210036.png](https://qiita-image-store.s3.amazonaws.com/0/3790/61b7b2e6-a3f9-8925-d612-a6727d614dab.png)

asyncがエラーになっちゃった！

![rapture_20151219210228.png](https://qiita-image-store.s3.amazonaws.com/0/3790/13b58db8-1c72-fb4e-e71f-e187680c0241.png)

experimentalAsyncFunctionsを消したら治りました。
なんでや！
HTML Importsをwebcomponentsjsで実装


#はじめに
Webページのヘッダーやフッターを記述するファイルを分けたいと思ったので、HTML Importsを試してみることにした。

#Webcomponentsjsのダウンロード
##クローン
```
git clone https://github.com/webcomponents/webcomponentsjs.git
```
##ビルド
```
npm install
gulp build
```
ビルドできたので、`webcomponentsjs/dist/HTMLImports.min.js`を使う。

#HTML Importsを試す
```html:index.html
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="content-language" content="ja">
	<title>Test page for Html imports</title>
	<script type="text/javascript" src="HTMLImports.min.js"></script>
	<link rel="import" href="child.html">
	<style type="text/css">
		html{
			margin: 0;
			padding: 0;
		}
		body{
			margin: 0;
			padding: 0;
		}
		section{
			margin: 20px;
			padding: 5px 20px;
			background-color: #eee;
			border-radius: 8px;
		}
		section.child{
			margin: 20px;
			padding: 5px 20px;
			background-color: #FF6E40;
			border-radius: 8px;
		}
	</style>
	
</head>
<body>
	<section>
		<h1>HTML Imports</h1>
		<p>このセクションはindex.html</p>
	</section>

	<!-- import here -->
	<div id="import-wapper"></div>

	<script type="text/javascript">
		var imports = document.querySelector('link[rel=import]').import;
		var child = imports.querySelector('div#import-inner');
		if(child){
			var parent = document.querySelector('#import-wapper');
			parent.appendChild(child);
		}
	</script>
</body>
</html>
```
```html:child.html
<div id="import-inner">
	<section class="child">
		<h1>Child</h1>
		<p>これはchild.html</p>
	</section>
</div>
```

こんな感じ
<img width="658" alt="スクリーンショット 2015-12-19 20.50.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/106258/3f7a0101-723f-250d-3da4-f55edcddeaf1.png">

- `<link rel="import" href="child.html">`で`child.html`はロードされるけど、DOMに追加するのはJSでやらないといけない。
- `<link rel="import" href="child.html">`の前にCSSを書いちゃうと、`child.html`にCSSが反映されない。
LiveScriptとは？

[関西フロントエンドUG Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kfug) 19日目の記事です。

11/21に行われた「2016年のAltJSについて語る会」という[関西フロントエンドUG](http://kfug.connpass.com/)主催の勉強会で、
AltJSの一つであるLiveScriptについてお話してきました。

## LiveScriptとは？
- 公式ドキュメント [livescript.net](http://livescript.net/)
- CoCo（CoffeeScriptのフォーク）のフォーク
- 今流行の関数型っぽくCoffeeScriptライクに書ける
- `npm i -g livescript`

![livescript-top.png](https://qiita-image-store.s3.amazonaws.com/0/30442/60483658-6eb7-deb7-7376-daf2ea3e93c5.png)

## prelude.ls
HaskellのPreludeにちなんで、LiveScriptにも[prelude.ls](http://www.preludels.com/)という関数ライブラリがあります。
インストールは、`npm i prelude-ls`
Underscore.jsやLodashのLiveScript版と思っていただければ大丈夫です。
（そこまで豊富な関数を取り揃えてはいませんが・・）

```livescript
# Example Code
[1 to 10] |> map (* 2) |> filter (> 3) |> fold1 (+) # => 108
```

![prelude-ls.png](https://qiita-image-store.s3.amazonaws.com/0/30442/43b6d66a-c3e9-b79f-c1aa-3ebb0f4cf574.png)

## Introduction
ここからはLiveScriptの機能（主に関数について）をコード例を交えてご紹介します。
公式ドキュメントにもIntroductionや文法は載っていますので、色々と試して下さい。

### Class
CoffeeScriptとほぼ同様にクラス定義が行えます。
ただしconstructorの書き方だけが変わっているので注意。

```livescript
class A
  # Static Method
  @name = -> @@display-name # @@ is constructor
  # Instance Method
  hoge: -> \fuga

class B extends Class # extends
  # constructor
  -> @ <<< it

A.name! # => \A
a = new A!
a.hoge! # => \fuga

B.name! # => \B
b = new B id: 1
b.hoge! # => \fuga
b.id # => 1
```

### Function
`->`演算子で関数定義を行うことが出来き、関数の実行は`()`や`!`で行うことが出来ます。
引数がある場合は、CoffeeScriptと同様に`()`を省略することが出来ます。
また、引数を宣言しておらず関数内で`it`句を使用すると自動的に`it`が定義されます。

```livescript
func = -> it + 2 # function(it){ return it + 2; }
func 2 # => 4

add = (+) # function(x, y){ return x + y;}
add 1 2 # => 3

# default parameter
add = (x = 1, y = 2)-> x + y
add! # => 3
add 1 # => 4

set-cords = ({x, y})-> "#x, #y"
set-cords y: 2, x: 1 # => '1, 2'
```

### Currying
関数型言語の特徴の一つでもあるカリー化した関数を定義することが出来ます。

```livescript
times = (x, y)--> x * y
times 3, 5 # => 15

double = times 2
double 5 # => 10
```

### Piping
F#やElixirでも出てくるパイプ演算子`|>`（パイプライン演算子）を使用することが出来ます。
`left |> right`だと、`right(left)`となります。

```livescript
x = [1 2 3] |> reverse |> head #=> 3

[1 to 10] |> map ( * 3) |> filter ( > 10)
```

### BackCalls
BackCallsはコールバックによって生み出されるインデントの深さの苦しみから開放されます。

```livescript
# Normal
mysql.query sql, (err, A)->
 mysql.query sql, (err, B)->
   C = A! + B!
   ...

# BackCalls
err, A <- mysql.query sql
err, B <- mysql.query sql
C = A! + B!
...
```

## まとめ
LiveScriptは究極のめんどくさがりが使う関数型言語です。
CoffeeScriptも他のAltJSに比べれば結構省略できることが多いですがLiveScriptは更にそれを超えています。
CoffeeScriptからの移行もそこまで複雑ではなく、公式ドキュメントにも移行ガイドが書いてあるので、
比較的簡単に導入することが出来るのかなと思っています。
npmでグローバルインストールするとインタプリタが使えるので、ターミナルでも気軽にお試しできます。

この記事や公式ドキュメントを読んで少しでもLiveScripterが増えてくれたら嬉しい限りです。
~~（LiveScriptは中毒性がありますので、用法用量を守って正しくお使い下さい。~~
~~　中毒になるとLiveScript無しでは生きていけなくなります。）~~
C#でレイヤー構造

#c#でレイヤー構造
さっきまで、いろいろ試してました。要はparentを設定することです。

まず、３つのレイヤをpicturBoxで作成します。
その最下層はビットマップでその上にGraphics.DrawLineとかで絵を描くとしますと
次のような設定をFormのコンストラクタに書いておきます
```csharp:
 pictureBox3.Parent = pictureBox2;
 pictureBox2.Parent =pictureBox1
 pictureBox1.Backcolor = Color.transpareent;
 pictureBox2.BackColor = Color.TransParent;
```
これで、このpicturBoxに絵を描きます
```csharp
 Graphics g = Graphics.FromImage(bmp1);
 Pen p = new Pen(Color.Red,4);
 g.DrawLine(p,new Point(10,10),new Point(40,30));
 g.Dispose();
 pictureBox1.Image = bmp1;
```
そうそう、on/offに備えて直接pictueBoxに書くのではなくbmpを事前に準備して書いておくということになります。
そしてこれをon/offしたい場合は
　picturBox1.Image=bmp1;   //on
 pictueBox1.Image=null;   //off
という感じでできあがりです。
Ubuntuのプロンプト変更

#プロンプトの設定

Ubuntuのプロンプトはデフォルトで
`[uyuni@uyuni-top:/home/uyuni/projects]$`
のように絶対パス表示になっているので

`export PS1="[\u@\h \W]\\$ "`
と設定すると
`[uyuni@uyuni-top projects]$`
と表示を直すことができる。

これを.bashrcあたりに追記しておく。

[自分用メモ]
underscoreコードリーディング（groupBy）

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


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


##groupByとは


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

こんな説明。
>####_.groupBy(list, iteratee, [context]) 
>Splits a collection into sets, grouped by the result of running each value through iteratee. 
>If iteratee is a string instead of a function, groups by the property named by iteratee on each of the values.


```javascript

_.groupBy([1.3, 2.1, 2.4], function(num){ return Math.floor(num); });
=> {1: [1.3], 2: [2.1, 2.4]}

_.groupBy(['one', 'two', 'three'], 'length');
=> {3: ["one", "two"], 5: ["three"]}
```

------------- 
iterateeをそれぞれの値に対して回した結果を元に、collectionを分割します。
もしiterateeが関数名だった場合、それぞれの値に対してその関数名を実行します。（例ででているlengthのように）


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

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

```javascript
  // Groups the object's values by a criterion. Pass either a string attribute
  // to group by, or a function that returns the criterion.
  _.groupBy = group(function(result, value, key) {
    if (_.has(result, key)) result[key].push(value); else result[key] = [value];
  });
```

group関数に関数を渡している。
resultにkeyが存在した場合result[key]にvalueを、そうでない場合にはresult[key]を[value]に置き換える。



group関数は以下

```javascript
// An internal function used for aggregate "group by" operations.
  var group = function(behavior) {
    return function(obj, iteratee, context) {
      var result = {};
      iteratee = cb(iteratee, context);
      _.each(obj, function(value, index) {
        var key = iteratee(value, index, obj);
        behavior(result, value, key);
      });
      return result;
    };
  };
```

結果用のobjectを生成する。
iterateが関数かどうかを判定し、
_.eachを用いて、引数に対してiterateeを回した結果をkeyに保存する。
それらをgroupByから受け取ったbehaviorに渡して実行する。
behaviorでは、resultにkey:valueで格納し、それをresultとして返却する。
ntpサーバーに同期できるまでntpdateを実行し続けるShellScript

仮想環境をサスペンド・レジュームした場合、自動では時刻同期しないため
デスクトップ上でダブルクリックすれば時刻同期するスクリプトを作成した。

当初は同期が成功・失敗に関らず20回の決め打ちで作成しようと考えていたが
いろいろ調べているうちに、直前の実行結果が「$?」に格納される事がわかったので
「$?」に0が格納(=コマンド成功)までループするようにした。

自分が調べた限りでは、後置判定の構文が見つからなかったので、
同じコードがwhileループの内外に１つずつあります。


```shell:timeSync.sh
#!/bin/sh
date
sudo ntpdate clock.nc.fukuoka-u.ac.jp
while [ "$?" -ne 0 ]
do
	sudo ntpdate clock.nc.fukuoka-u.ac.jp
done
date
read
```

一般ユーザー権限なのでsudoで実行している。
visudoコマンドでntpdateコマンドを実行できるよう設定する必要がある。

```vim:/etc/sudoers
root    ALL=(ALL)   ALL
normaluser    ALL=(ALL)   NOPASSWD:!/home/normaluser/デスクトップ/timeSync.sh,/usr/sbin/ntpdate
```
mrubyをひとまず触ってみた

# mruby未体験...

http://mruby.org/

mrubyがリリースされた！というニュースが流れて
長い月日が流れて、一度もmruby処理系に関して触れたことがない自分。

mrubyについてどうすれば良いのか、とか其のところすらわかっていないので、
mruby Advent Calendarができたということで学びつつやってみたいなと思い、
書いてみます。

自分の開発環境はMac OS Xで、
他OS上ではまだ一度もいじったことがない状態です。
ご容赦くださいm(_ _)m

# 開発環境を整えたい

mrubyの環境を整えるにはどうすればいいのか？ということで
homebrewにFormulaあるかな？と思って```brew search```してみました

```
> brew serach mruby
mruby
```

あった。ということでインストール。

```
> brew install mruby
```

## 対話環境を触る

[Executing Ruby code with mruby](http://www.mruby.org/docs/articles/executing-ruby-code-with-mruby.html) を見てみると
mirbが対話環境らしい。ので起動してみる。

```
> mirb
mirb - Embeddable Interactive Ruby Shell

>
```

## 何ができて何ができないのだろう？

2015年も終わる状態でこんなこと書いてますが、わからなかったりします。
Rubyフルセット環境からミニマムにするために切り落としている機能はなんだっけ？って探してみました。

### 軽く触れてみる

```rb
> class Hoge
*   def name
*     puts 'hoge'
*   end
* end
 => :name
> Hoge.new.name
hoge
 => nil
```

classはある。

```rb
(1..100).to_a.delete_if { |x| x % 2 == 0 }
 => [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
```

問題なさそう？

```rb
> require 'test.rb'
(mirb):13: undefined method 'require' for main (NoMethodError)
```

おっと、requireないのね...

# mrbgemのインストール

## とある文字列を一方向ハッシュ化したい場合どうすればよいか

[mruby.orb/libralies](http://www.mruby.org/libraries/)で、使いたいライブラリを探して入れる感じになるらしい。

[mruby-digest](https://github.com/iij/mruby-digest)を使ってみる。

## mruby-digestのインストール

mrubyでのgem(mrbgem)インストールはどうすればいいのかな？と思ってググってみた。

[build_config.rbでビルドの設定をする](http://qiita.com/masuidrive/items/e516c23b4feab73d139f)ようだ...(知らなかった)

テスト用のディレクトリにbuild_config.rbファイルを作り、mruby-digestを使えるようにしてみる

## ビルドをして自分のmubyを作らないといけない

ミニマムなセットのmrubyにあれこれ追加したい場合、
先ほどあげたbuild_config.rbに入れておきたいmrbgemパッケージを
同梱させる形でビルドしないといけないようだ。

mrubyのソースコードをgithubの公式リポジトリから取ってきてビルドしよう。

```
> git clone https://github.com/mruby/mruby.git
> cd mruby
> vi build_config.rb
```

build_config.rbについてmruby-digestを加える。

```rb
MRuby::Build.new do |conf|
  conf.gem :git => 'https://github.com/iij/mruby-digest.git' # 今回追加
end
```

最初間違えてMRuby::Build.new('host-debug')に追加して```Digest```使えなくてびっくりした。
そしてビルド。

```
> make
...
```

しばらく待つ。
ビルドが終わったら、mruby-digestが利用できるか確認してみる。

```rb
> cd bin
> ./mirb
> Digest
 => Digest
> Digest::SHA256.digest('hogehoge')
 => "LqmL\362\021\307\267\322\363#<\224\027q\255\005\a\352[\254\371;I'f\252A\256\237r\r"
> Digest::SHA256.hexdigest('hogehoge')
 => "4c716d4cf211c7b7d2f3233c941771ad0507ea5bacf93b492766aa41ae9f720d"
```

おお、使えてる。

# ちょっと触っただけの記事だけど

mrubyについてどうすればよいのかさっぱりわからかったので、
ひとまず一歩、という感じがする。
欲しいライブラリについては自作するか、
[Related Projects](https://github.com/mruby/mruby/wiki/Related-Projects)一覧にあるものを
持ってきてビルドして配布して利用する形になるんだなという感じ。

コアセット以外の機能について欲しいものだけbuild_configに書き込んで利用する、という
わかりやすさがよかった。

小さいセットだから使おう、というのもありそうだけど
用途によっては([ngx_mruby](https://github.com/matsumoto-r/ngx_mruby))
通常業務で利用できそう。

薄い内容だけど、そんな感想を持った。
正式公開されて2年以上経つけど、今更mrubyを触ってみた、という記事でした。
Yokohama.rb Monthly Meetup #63 memo


## Date と DateTime と Time

`new` と `now` と `today` の挙動が難しい。

|method| Time|Date|DateTime|
|:--:|:--:|:--:|:--:|
|引数なし new|今|-4712年|-4712年|
|now|今|NoMethodError|今|
|today|NoMethodError|今日|NoMethodError|
|.new(2015).to_s|"2015-01-01 00:00:00 +0900"|"2015-01-01"|"2015-01-01T00:00:00+00:00"|

ぱっと見わかりにくいけど、

* Time.new(2015) は "+09:00"
* DateTime.new(2015) は "+00:00" 

という辺りも難しい。

## Time#to_s と DateTime#to_s の微妙な違い

Time#to_s と DateTime#to_s では微妙に書式が違う。

```ruby
Time.new( 2015,1,2,3,4,5,"+09:00" ).to_s
#=> "2015-01-02 03:04:05 +0900"

DateTime.new( 2015,1,2,3,4,5,"+09:00" ).to_s
#=> "2015-01-02T03:04:05+09:00"
```

違いを表にしておくと。

|　|Time|DateTime|
|:-:|:-:|:-:|
|日付と時刻の境目|空白|`T`|
|時刻と時差の境目|空白|なし|
|時刻の形式|+HHMM|+HH:MM|

## Time#local の思いがけない仕様

pry で `ri Time.local` とすると、
こんな

```ruby
Time.local(sec, min, hour, day, month, year, dummy, dummy, isdst, dummy) #-> time
```

機能があることがわかる。dummy ってなんだ。
なお。 `isdst` は、「is daylight saving time」で、夏時間のこと。

ちなみに、Time.utc にも

```ruby
Time.utc(sec, min, hour, day, month, year, dummy, dummy, dummy, dummy) #-> time
```

という機能がある。直交性のためだと思う。
  
## 時差を指定する際の、バグっぽい挙動

まずは期待通りの動作について

```ruby
Time.new(2015,1,2,3,4,5,"+09:00")
# => 2015-01-02 03:04:05 +0900

Time.new(2015,1,2,3,4,5,60*60*9) # 整数にすると秒数
#=> 2015-01-02 03:04:05 +0900

DateTime.new(2015,1,2,3,4,5,"+09:00").to_s
#=> "2015-01-02T03:04:05+09:00"

DateTime.new(2015,1,2,3,4,5,9r/24).to_s #DateTimeだと時差は有理数もOK
#=> "2015-01-02T03:04:05+09:00"

Time.new(2015,1,2,3,4,5,"+48:00") # 無茶な時差は例外に
#=> ArgumentError: utc_offset out of range
```

そしてバグっぽい挙動

```ruby
DateTime.new(2015,1,2,3,4,5,"+48:00").to_s # 48は無視される。困る。
#=> "2015-01-02T03:04:05+00:00"

DateTime.new(2015,1,2,3,4,5,2r).to_s # 同じ無茶でも有理数だと通る。
#=> "2015-01-02T03:04:05+48:00"
```
仕様なのかどうなのか。

## 覚えた言葉（すぐ忘れそうだけど）

* [リリウス日]( https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5 )
* [ユリウス通日]( https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5 )
* DST : daylight saving time 

## Date.new が -4712年である理由

「ユリウス通日」の起点ということらしい。
で。ユリウス通日の起点がなぜ -4712年なのかというと。
上記の Wikipedia によると

> ローマ帝国での徴税額の査定更正周期

などを元に決まったらしい。こんなものがrubyの仕様に影響を与えているとは。
String fn as_strがunstableだった

この記事は Rust1.5での動作確認をしています。

---

RustでStringを &str に変換する際に、

[String fn as_str](https://doc.rust-lang.org/std/string/struct.String.html#method.as_str) をよく使いますが、RFCの改定を行う必要があるため、unstable になっています。

Rust1.0の頃は `as_slice` というメソッドどして使用することが可能で、最近のRustのバージョンでも `as_str` は使用できました。

結構便利なメソッドだったのですが、stable版Rustでは使用できないので、&strが必須なcrateを扱う場合は、辛い場面が多々あります。

調べてみると、[stackoverflow:How to convert String into &'static str](http://stackoverflow.com/questions/23975391/how-to-convert-string-into-static-str) に答えが書いてありました。

```rust
let s: String = "abcdefg".to_owned();
let s_slice: &str = &s[..];  // take a full slice of the string
```

```rust
let s_slice: &str = &*s;  // s  : String 
                          // *s : str (via Deref<Target=str>)
                          // &*s: &str
```
出典: [stackoverflow:How to convert String into &'static str](http://stackoverflow.com/questions/23975391/how-to-convert-string-into-static-str) 

as_strがstableになるまで、こちらを使うと良いかもしれません。
ESP8266 > fritzingのパーツ > ESP-WROOM-02相当はない?

https://github.com/ydonnelly/ESP8266_fritzing
にあるファイルをfrizingにインポート

インポートは以下を参考にした
http://www.geocities.jp/zattouka/GarageHouse/Tool/Fritzing/MakeParts/MakeParts.htm

5種類あるが、ESP-WROOM-02相当はないようだ。

ESP-12あたりを読み替えるのがいいのだろうか。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/52498af7-b420-a7ba-df58-0c7186b32182.png)
git commit 後、error: Error building trees 発生

下記の手順を行った後、エラーが発生。
いろいろファイルを削除したが、エラーが解消されません。
androidアプリ開発で、facebook SDKを利用している方で
このようなエラーを経験をされたことがある方は、
アドバイスをいただけると幸いです。

facebook SDKを再ダウンロード後、
もともと使用していたSDKファイルと入れ替えてcommitしてみましたが、
効果はありませんでした。

#手順
git add .
git commit 

#エラー内容
joniclient $ git commit
You have both facebook/build/generated and facebook/build/generated/source/buildConfig/androidTest/debug/com/facebook/android/test/BuildConfig.java
You have both facebook/build/generated and facebook/build/generated/source/buildConfig/androidTest/debug/com/facebook/android/test/BuildConfig.java
error: Error building trees
mod_auth_openidcをビルドから試す

# mod_auth_openidcをビルドから試す

## はじめに

OpenID ConnectのRelying PartyをApacheモジュールでやってくれる実装の[mod_auth_openidc](https://github.com/pingidentity/mod_auth_openidc)を取ってきてビルドして使いたいけどビルドできなくて困ってる人のための記事



## 環境

AWSのAmazon Linuxのt2.micro

|ソフトウェア|バージョン|
|:--:|:--:|
|Apache|2.2|
|mod_auth_openidc|1.8.6|
|jansson|2.7|

## インストール

始めるために必要なもの一式install

Apacheモジュールのビルドなのでhttpd-develを始め、いろいろdevelでのインストールが必要。

```
yum -y install git httpd-devel mod_ssl automake libcurl-devel openssl-devel libtool pcre-devel
```

janssonというCでJSONをParseするためのライブラリは手で入れる必要アリ。

```
git clone https://github.com/akheron/jansson.git
cd jansson/
libtoolize -c
autoreconf -i
./configure
make
make install
```

mod_auth_openidcのインストール。

注意すべき点としては、janssonにパス通ってないと思うので通すの忘れないこと。

```
cd ..
git clone https://github.com/pingidentity/mod_auth_openidc.git
cd mod_auth_openidc/
autoreconf
export PKG_CONFIG_PATH=PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
./configure
make
make install
```

後はRPのための設定。

今回はサンプルとしてgoogleを指定

```conf:/etc/httpd/conf.d/rp.conf
LoadModule auth_openidc_module modules/mod_auth_openidc.so

OIDCProviderMetadataURL https://accounts.google.com/.well-known/openid-configuration
OIDCClientID YOUR_CLIENT_ID
OIDCClientSecret YOUR_CLIENT_SECRET

OIDCRedirectURI https://YOUR_DOMAIN/test/cb
OIDCCryptoPassphrase YOUR_PASS_PHRASE

<Location /test>
   AuthType openid-connect
   Require valid-user
</Location>
```

Locationのパス以下にRedirect URIを指定すれば、コンテンツが無くてもモジュールがキャッチしてくれる。

## まとめ
ざっくりしたメモとして残しているだけなので、手順に不足等あったらお教えくださいませ。
ESP8266 > UDPで送信できた / esp8266_151219_udpSender



## UDP送信プログラム

1. WiFi接続の参考 
http://qiita.com/ie4/items/ae850cdb2c617f3fd6af

2. UDP送信の参考
http://www.sunspot.co.uk/Projects/Arduino/ESP8266/ESP8266.html

- UDP送信先
  - IPアドレス: 192.168.10.4
  - ポート: 9000
- UDP送信元 (ESP8266)
  - ポート: 7000


上記の設定にして以下を実装した。
Serial_setup()はチェック用だが、実際セットアップしかしてない。

[v0.1 @ github](https://github.com/yasokada/esp8266_151219_udpSender/releases/tag/v0.1)
にファイルを置いたが、<font color=red>wifiConfig.hの取り扱いには注意</font>。間違ってgitなどにプッシュしないように。


```151219udpSend.c
#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

#include "wifiConfig.h"
/*
 * wifiConfig.hにおいて kWifiSsid, kWifiPass を char *[]型で定義。使用WiFiの設定を記載すること
 */

static WiFiUDP wifiUdp; 
static const char *kRemoteIpadr = "192.168.10.4";
static const int kRmoteUdpPort = 9000;

static void WiFi_setup()
{
  static const int kLocalPort = 7000;
  
  WiFi.begin(kWifiSsid, kWifiPass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500);  
  }  
  wifiUdp.begin(kLocalPort);
}

static void Serial_setup()
{
  Serial.begin(115200);
  Serial.println(""); // to separate line  
}

void setup() {
  Serial_setup();
  WiFi_setup();
}

void loop() 
{
  wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort);
  wifiUdp.write("from ESP8266\r\n");
  wifiUdp.endPacket();  
  
  delay(3000);
}
```

wifiConfig.hは自分のWiFi接続環境に合わせてSSIDとパスワード文字列を設定する。
例としては以下。
ファイルを分けたのは、gitなどにチェックインしないようにするため。

```wifiConfig.h
#ifndef WIFICONFIG_H
#define WIFICONFIG_H

static const char *kWifiSsid = "aterm-314ed7-g";
static const char *kWifiPass = "314jfdsk1io";

#endif
```

### 受信側プログラム

http://qiita.com/7of9/items/e916a0168fde295bbbc6
に記載の以下のソフトを使う
- [unity-151117-linemonitor-UI](https://github.com/yasokada/unity-151117-linemonitor-UI) : androidスマホで動かすUIソフト (Mac, Winでも動く)

### 実行結果

最初の6行程度はTimチェックをオフにしているため、左に[秒＋ミリ秒]がない。
後ろの5行程度はTimチェックをオンにしていて、左に[秒＋ミリ秒]がある。
ESP8266のloop()処理において3秒のdelayにしているが、微妙に短い(2.9秒?)ようだ。

![Screenshot_2015-12-19-19-32-53.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3b8041ac-27a5-56b0-47c6-83acb3215a03.png)