OmniAICreator/Qiita-1.07M huggingface dataset:
supervisorとapplicationが停止する条件

# supervisorとapplicationが停止する条件
ドキュメントをちゃんと読んでいれば, 当然知っているであろうことなのですが, 「セグフォも吐いてないのに何か死んでる！！」と焦ったことがあるので, 自分への戒めとして投稿します.

## supervisorの終了条件

> To prevent a supervisor from getting into an infinite loop of child process terminations and restarts, a maximum restart intensity is defined using two integer values specified with the intensity and period keys in the above map. Assuming the values MaxR for intensity and MaxT for period, then if more than MaxR restarts occur within MaxT seconds, the supervisor will terminate all child processes and then itself. The default value for intensity is 1, and the default value for period is 5.

http://www.erlang.org/doc/man/supervisor.html

とあるように, **子プロセスの再起動限界を超えた場合, 全ての子プロセスを殺した後に自分自身も終了する**
言われてみれば, 再起動限界を超えたということは, 正しく動かないということなのでsupervisorごと死ぬのは当然といえば当然である.

transientやpermanentを指定する場合は, 再起動限界を超えた場合の挙動も意識する必要がありそうだ.

### OTPの実装
OTPの実装としては以下の箇所が該当する.

- [子の再起動限界を超えた場合の判定箇所](https://github.com/erlang/otp/blob/21d6192389a04024f7a41ced9d0911a9cce6f4e8/lib/stdlib/src/supervisor.erl#L1393-L1398)
- [子の再起動処理](https://github.com/erlang/otp/blob/21d6192389a04024f7a41ced9d0911a9cce6f4e8/lib/stdlib/src/supervisor.erl#L776-L807)


## applicationの終了条件

> If a permanent application terminates, all other applications and the entire Erlang node are also terminated.
If a transient application terminates with Reason == normal, this is reported but no other applications are terminated. If a transient application terminates abnormally, all other applications and the entire Erlang node are also terminated.
If a temporary application terminates, this is reported but no other applications are terminated.

http://www.erlang.org/doc/apps/kernel/application.html#start-1

**runningのapplicationが死んだ時, 再起動戦略的に再起動しなければいけない場合applicationが終了する**

依存関係のあるapplicationが終了した場合は正しく機能しなくなる訳だから, よく出来ている.
あまりapplicationの再起動戦略を選択する余地はなさそうだが, そのapplicationがなくても動作するようなもの (例えば動作確認用に使うapplicationのようなもの) はtemporaryにして, それ以外はpermanentにするなどの選択はできそうだ.

ちなみに, applicationのrestart_typeは[application:start/2](http://www.erlang.org/doc/apps/kernel/application.html#start-2)で指定することができる.
また, 現在起動中のapplicationの情報は`application:info/0`で見ることができる.

### OTPの実装
OTPの実装としては以下の箇所が該当する.

- [applicationが死んだ時の判定箇所](https://github.com/erlang/otp/blob/21d6192389a04024f7a41ced9d0911a9cce6f4e8/lib/kernel/src/application_controller.erl#L1156-L1176)

----


ドキュメントはちゃんと読みましょう.
UbuntuのmozcでUSキーボード入力/JISキーボード入力を簡単に切り替える方法

Ubuntuで意外に難しい、キーボードの「US/JIS」の切り替え設定を簡単にできる方法を紹介します。
なお、Ubuntuのバージョンは14.04で日本語入力はmozcで行うことを前提とした方法です。
**(2017/06/17追記 Ubuntu16.04でも可能であることを確認いたしました)**


# **下準備**
## **Fcitxのインストール**
`$ sudo apt-get install fcitx fcitx-mozc`
上記のコマンドにより、インプットメソッドフレームワーク「Fcitx」をインストールする。
インストールが完了すると、Launcherで検索することによりペンギンが描かれたアイコンが出てくるはずなのでそれを選択する（下図）。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/88804/3e623e06-7328-5539-57f0-4fd0e168ff8b.png)

すると「入力メソッドの設定」というウィンドウが表示されるはずなので、そこで「入力メソッド」タブを選択。左下の”＋”ボタンをクリックして、

- Mozc
- キーボード-英語(US)
- キーボード-日本語

の3つが追加された状態にしておく（下図）。
![b.png](https://qiita-image-store.s3.amazonaws.com/0/88804/38ae1e0d-fa16-ad87-6ebc-e1475f7079f3.png)

## **全角/半角の切り替えに用いるショートカットキーの指定**
「全体の設定」タブの「入力メソッドのオンオフ」で、全角/半角切り替えに用いるショートカットキーを指定する(下図では、Ctrl + Spaceを指定している)。
![e.png](https://qiita-image-store.s3.amazonaws.com/0/88804/262ccc89-4c22-cd83-8e8e-c5796efdf521.png)


## **キーボード入力に使うIMシステムの指定**
「システム設定」＞「言語サポート」において、「言語」タブを選択。
「キーボード入力に使うIMシステム」の部分で”fcitx”を指定する(下図)。
![c.png](https://qiita-image-store.s3.amazonaws.com/0/88804/929b9e59-66e0-be4d-c9a0-eb28ab09f29b.png)

以上で下準備は終了。

# **USキーボード入力にしたいとき**
先ほどの「入力メソッド」タブにおいて「Mozc」を選択した状態で、ウィンドウの下の方にある「キーボードレイアウト」アイコン(6つ並んでいるうちの右から2つ目)を選択。キーボードレイアウトとして「英語（US）」を選択する。
また、「入力メソッド」の順番を、「Mozc」、「キーボード-英語(US)」、「キーボード-日本語」の順番にしておく(下図)。
![d.png](https://qiita-image-store.s3.amazonaws.com/0/88804/4b5306c0-bf11-656d-72dd-8eafe5dc3046.png)
以上で設定完了。
（※上記で指定した切り替えショートカットキーにより、1番目と2番目の入力メソッドが交互に切り替わる。つまりこの設定では「Mozc」と「キーボード-英語(US)」を交互に切り替えることができるようになる。「Mozc」で全角入力、「キーボード-英語(US)」で半角入力を行っている）

# **JISキーボード入力にしたいとき**
同じく「Mozc」を選択した状態で「キーボードレイアウト」アイコンを選択。キーボードレイアウトとして「日本語」を選択する。
また、「入力メソッド」の順番を、「Mozc」、「キーボード-日本語」、「キーボード-英語(US)」の順番にしておく(下図)。
![f.png](https://qiita-image-store.s3.amazonaws.com/0/88804/a8adca13-d298-a7e7-7f3e-f70c5b0687d2.png)
以上で設定完了。
（※この設定では、「Mozc」で全角入力、「キーボード-日本語」で半角入力を行っている）


# **非常に簡単でした**
たったこれだけです。sudo vim で設定ファイルを編集したり、OSを再起動させたりする必要は一切ありません。しかも複雑なことをしていないので、USキーボードに移ってみて「やっぱりJISキーボードに戻りたい！」と思った時にいつでも戻ることが可能です。
気軽にUSキーボードに挑戦してみてはいかがでしょうか。
無線Zigbeeモジュール「TWE-Lite」を紹介する。

**この記事は[高知工科大 Advent Calendar 2015](http://www.adventar.org/calendars/965)の23日目の記事です。**

# はじめに
最近は激安Wi-Fiモジュール「[ESP-WROOM-02](http://akizukidenshi.com/catalog/g/gM-09607/)」とかが販売されているが、もう少し小さなモノに組み込みやすい無線モジュール「[TWE-Lite](http://mono-wireless.com/jp/products/TWE-Lite-DIP/index.html)」を紹介したい。

# TWE-Liteとは？
Wi-Fiと同じIEEE802.15.4に準拠したZigbeeという2.4GHzの無線方式を採用したモジュールです。特徴としては、

* 超低消費電力
* 長距離通信
* 簡単なネットワーク構築

などがあります。この３つを見ればこのモジュールがIoTに組み込むために生まれたと言っても過言ではないことがわかります。

# いかに凄いか
## 尋常でない低消費電力
TWE-Liteの代表的な特徴に、圧倒的な消費電力の少なさです。1パケットを30秒間隔で送信すると、**ボタン電池で最大10年動作する**ようです。([詳細](http://mono-wireless.com/jp/products/lowpower.html))

## 離れた場所でも通信可能
TWE-Liteの通信距離はマッチ棒型アンテナの場合([こんなやつ](http://akizukidenshi.com/catalog/g/gK-06759/))、**見通し1kmまで通信可能**です。同じ規格の[XBeeZBモジュール](http://akizukidenshi.com/catalog/g/gM-05799/)では見通し120m程度なので、どれほど凄いことか分かると思います。

## 簡単なネットワーク構築

公式からネットワークの構築を支援するアプリが配布されているのも特徴です。
「[TWE-Zeroアプリ](http://mono-wireless.com/jp/products/TWE-ZERO/index.html)」の一覧から目的の用途にあったアプリをダウンロードして、UART経由でTWE-Liteに書き込むことで用途に応じて様々なセンサネットワークを構築することも可能です。

利用例
* 無線タグ
* シリアル通信
* リモコン通信
* ラジコン
* 音声トランシーバ

# 入門

### 1. 購入
秋月電子等で、

　　A. [TocoStick](http://akizukidenshi.com/catalog/g/gM-07232/)
　　B. [TWE-Lite](http://akizukidenshi.com/catalog/g/gM-06760/)単体　＋　[TWE-Lite R](http://akizukidenshi.com/catalog/g/gM-08264/)　

のどちらかを揃えます。

### 2.接続

　　TocoStick : 挿すのみ

　　TWE-Lite : TWE-Lite R　に　TWE-Liteを挿してUSBにつなぐのみ

### 3.アプリ書き込み

1. [書き込み用ソフト](http://mono-wireless.com/jp/tech/misc/LiteProg/index.html)をダウンロード
2. TWE-Liteが接続されているCOMポートを選択し、先ほどのアプリを事前にダウンロードしてドラッグ&ドロップ
3. 書き込みが完了したらTWE-Liteをリセットして終わり。
4. 快適な通信ライフ！！

シリアル通信アプリを入れておけば自分好みのさらに詳細な設定が可能です。
TWE-Lite R はFTDI社のチップが使われているので、自作も可能です。

# まとめ
公式サイトにはこれ以外にもフルに使うための情報がまだまだあります。
TWE-Lite用のSDKもあるので、こういった組み込み機器みたいな物を扱ったことがない人でも敷居が低いカモです。
Let's IoTライフ！！

明日はkamepさんがすごい記事書いてくれるようです。楽しみです。

以上

引用：[モノワイヤレス株式会社 - MONO-WIRELESS.COM](http://mono-wireless.com/jp/index.html)
iPhoneで動画をインライン再生できるブラウザー

iPadのSafariだったらインライン再生できるのですがiPhoneのSafariはインライン再生できません。
そのほか、Chrome for iOSもだめ、Firefox for iOSもだめで、動画再生するとプレイヤーが全面表示されてしまいます。
そんな中、iPhoneでインライン再生できるダークホース的なブラウザーがありました。
それが**Opera Coast**。
インライン再生できることで何がうれしいって、**WebGLでムービーテクスチャー使用してもちゃんと表示できるのです！！**
特に、**WebVR(Polyfill使用)を使用した全天球動画プレイヤー(いわゆるCardboardアプリ)がちゃんと視聴することができるのです！！！**
重要なことを書き忘れていました。インライン再生させるにはひとつ条件があります。それは、videoタグに**webkit-playsinline属性をつけること**。この属性を追加しないとインライン再生できません。

Opera Coast以外にもサードパーティー製のブラウザーでインライン再生できるものがありましたが、ランドスケープにするとアドレスバーの表示が崩れてページ表示領域がことのほか狭くなったり、別のブラウザーでは広告表示がうざかったりと使い物になりませんでした。
ただ、Opera Coastにも欠点があります。Opera Coastのリロードはプルダウンで行うしかないということ。
全天球動画プレイヤーのようなページ全体でタッチ操作を扱うようなWebアプリだと、プルダウンができないのです。
しかし、バッテリーや電波状況、時計といった情報を表示する分のヘッダーがありますがアドレスバーがないため細く、またフッターもSafariなどに比べて細いです。ランドスケープにするとアドレスバーが非表示になるため、フッターが若干見えてしまいますが、全天球プレイヤーをほぼ苦なく視聴することができます。
Opera Coastには前述のようにアドレスバーがないため、どこにURLを入力すればいいのかが初見ではわかりづらいですが、"ウェブで検索"をタップして、検索ワード入力のところでURLを入力すればＯＫです。

以上
Qtとアトミック命令の話


この記事は、Qt Advent Calendar 2015 23日目の記事です。

kudanと申します。
今年はQtをベースに簡単なスクリプト言語っぽいものを作ろうかとしていたのですが時間的に無理があり力尽きてしまったので、Qtのアトミック命令のお話をしようと思います。
#アトミック命令とは
複数のコアが共有しているメモリ上で安全にデータを操作できる命令のことです。
代表的なものに[コンベア アンド スワップ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9A%E3%82%A2%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%89%E3%83%BB%E3%82%B9%E3%83%AF%E3%83%83%E3%83%97)があります。
この命令は、書き換える値と最後に読み込んだ値を使い、現在の値が最後に読み込んだ値と同一であれば書き換える、異なっていれば他のスレッドが書き換えている可能性があるので書き込みを中止し、成功の有無が結果として返されるものです。

#何に使うのか
以上の説明だけでは、mutex等のロックに比べての一体何の利点があるのか分かりません
アトミック命令はmutexよりも低レベルな並行制御です。扱えるデータも整数型やポインタ型に制限されます。

アトミック命令をC++から使用する場合、
基本的には言語やライブラリで用意されたアトミック変数クラスを用います。
Qtでは [QAtomicPointer](http://doc.qt.io/qt-5/qatomicpointer.html) [QAtomicInteger](http://doc.qt.io/qt-5/qatomicinteger.html)等が用意されているようです。

#デットロックの回避とスケーラビリティ
アトミック変数は、mutexと違いスレッド間競合が発生した場合単に操作が失敗するだけです。そのため、あるスレッドがロックしたまま開放し忘れた場合に発生するデットロックは回避する手段があります。
※手段があると言っているのはアトミック変数でも場合によってはデットロックが起きるため。

アトミック変数とは、mutexやスレッド間通信より低級でありデータの一貫性が保障される最も高速なスレッド間の情報伝達手段となります。

サンプルコード 

```cpp:test.cpp
#include <QAtomicInt>
#include <QDebug>

int main()
{
    QAtomicInt p=0;
    //int p=0;
    #pragma omp parallel for //openMP
    for(int index=0;index<10000000;index++){
        p++;

    }
    qDebug() << p;

    return 0;
}

```

※openMPの並行forを使用しているので、
proファイルに QMAKE_CXXFLAGS += -fopenmp LIBS += -fopenmp
を書き込んで下さい。

実行してみると
QAtomicIntの場合pの値は10000000となり。
intに差し替えると10000000以外の値になることわかると思います。
#QAtomicPointer
整数型より大きなデータを扱う場合は、QAtomicPointerを使います。
このQAtomicPointer、Qtで用意されているQSharedPointerやQScopedPointerと異なり。
スマートポインタではありません、
そのため使用する場合は、手動でメモリの確保、開放を行う必要があります。

LockFreeStackの簡単な実装

```cpp:lockfreestack.cpp
#include <QAtomicPointer>
#include <QDebug>

template<class T>
struct KLockFreeStackNode{
    T* value=nullptr;
    KLockFreeStackNode<T>* next=nullptr;
};

template<class T>
struct KLockFreeStack{
    QAtomicPointer<KLockFreeStackNode<T>> head=nullptr;
    void push(T *value){
        auto n=new KLockFreeStackNode<T>();
        n->value=value;
        for(;;){
            n->next=head;
            if(head.testAndSetOrdered(n->next,n)){
                break;
            }
        }
        return;
    }
    T* pop(){
        KLockFreeStackNode<T>* n;
        for(;;){
            n=head;
            if(head.testAndSetOrdered(n,n->next)){
                auto r=n->value;
                delete n;
                return r;
            }
        }
        return nullptr;
    }
};

int main(){
    //0から100まで 並列にスタックに追加し 取り出す
    KLockFreeStack<int>  stack;
    #pragma omp parallel for
    for(int index=0;index<100;index++){
        auto n=new int;
        *n=index;
        stack.push(n);
    }
    qDebug() << "start";
    #pragma omp parallel for
    for(int index=0;index<100;index++){
        auto n=stack.pop();
        qDebug() <<"取り出した値" << *n << "取り出し回数" << index;
        delete n;
    }
    qDebug() << "end";
    return 0;
}
```

上のコードを実行すると、複数のスレッドから同時に追加、取り出しが可能であることがわかると思います。

アトミック変数はQtだけではなく C++でもC++11以降 std::atomic でサポートされています。
Qtのようなフレームワークを使う場合、アトミック変数やアトミック命令を意識してプログラムを書くことは稀だとおもいます。ですがシグナル スロットを用いたスレッド間通信やmutexでは過剰であったり、速度的に問題が起こる場合はアトミック変数を使用することも解決策の一つではあります。
[tvOS]Gameコントローラ

<p>tvOSのサンプル<a href="https://developer.apple.com/library/tvos/samplecode/DemoBots/Introduction/Intro.html">DemoBots</a>とGameplayKitのサンプル<a href="https://developer.apple.com/sample-code/wwdc/2015/downloads/Maze.zip">Maze</a>を参考にして、SpriteKitとGameplayKitを使ったtvOSのゲーム・アプリケーションの実装を試す。</p>

<p>Xcodeの新規プロジェクトで生成されるSpriteKitを使ってプロジェクトをGameコントローラを使用したものに変更してみる。</p>

<p>Gameコントローラの内容は以下のとおり。</p>

<pre><code>import Foundation
import SpriteKit
import GameplayKit
 
class Game {
    var gameScene: GameScene?
    let random: GKRandomSource?
    
    init() {
        random = GKRandomSource()
    }
    
    deinit {
    }
    
    var scene: GameScene? {
        get {
            if gameScene == nil {
                gameScene = GameScene(fileNamed: "GameScene")
            }
            return gameScene
        }
    }
}
</code></pre>

<p>以下がViewControllerの変更前。</p>

<pre><code>class GameViewController: UIViewController {
    :
    override func viewDidLoad() {
        print(NSStringFromClass(self.dynamicType), __FUNCTION__)
        super.viewDidLoad()
        
        if let scene = GameScene(fileNamed: "GameScene") {
            // Configure the view.
            let skView = self.view as! SKView
            skView.showsFPS = true
            skView.showsNodeCount = true
            
            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true
            
            /* Set the scale mode to scale to fit the window */
            scene.scaleMode = .AspectFill
            
            skView.presentScene(scene)
        }
    }
    :
}
</code></pre>

<p>以下がViewControllerの変更後。</p>

<pre><code>class GameViewController: UIViewController {
    :
    override func viewDidLoad() {
        print(NSStringFromClass(self.dynamicType), __FUNCTION__)
        super.viewDidLoad()
        
        game = Game()
        if let aGame = game {
            let scene = aGame.scene
            scene!.scaleMode = .AspectFill
            
            let skView = view as! SKView
            skView.presentScene(scene)
            skView.ignoresSiblingOrder = true
            skView.showsFPS = true
            skView.showsNodeCount = true
        }
    }
    :
}
</code></pre>

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

関連情報
<a href="http://qiita.com/advent-calendar/2015/cocoa/">Cocoa Advent Calendar 2015</a><br />
<a href="https://developer.apple.com/jp/documentation/General/Conceptual/AppleTV_PG/AppleTVOverview/AppleTVOverview.html">App Programming Guide for tvOS</a><br />
<a href="https://developer.apple.com/library/tvos/documentation/General/Conceptual/GameplayKit_Guide/">GameplayKit Programming Guide</a><br />
<a href="https://thinkit.co.jp/series/4858">実践！iOSで作るゲームアプリ</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 />
[Django] Generic display viewsについて

#　はじめに
最近、Django1.9を使っています。Django1.3からあるらしいのですが、再度view関係のクラスについてまとめておこうと思います。

# Generic display views
今回は[Generic display view](https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-display/)についてです。ドキュメント読めばだいたい分かるんですけどね。

# 最小限で使ってみる
サンプルって色々書いてあるので、最小限だとどうなるのか書いてみました。Djangoのチュートリアルの[1](https://docs.djangoproject.com/en/1.9/intro/tutorial01/)と[2](https://docs.djangoproject.com/en/1.9/intro/tutorial02/)を終わらせた状態ではじめます。

## view.py
まずはview.pyに最小限ListViewとDetailViewを継承したクラスを作ります。指定するのはmodelとtemplateのみです。

```django:polls/veiw.py
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView

from .models import Question


class IndexView(ListView):

    model = Question
    template_name = 'polls/index.html'

class DetailView(DetailView):

    model = Question
    template_name = 'polls/detail.html'
```

## url.py
viewにクラスを作ったので、url.pyを作ります。

```django:polls/url.py
from django.conf.urls import url

from . import views

app_name = 'polls'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
]
```
## template
次はテンプレートを用意しましょう。

ListViewはmodelを指定するだけで、テンプレートにobject_listに指定したmodelのリストが渡されます。DetailViewの方はobjectに指定されたpkを持つデータが渡されています。

```django:templates/polls/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
Index
{% for object in object_list %}
    <h3>{{ object.question_text }}/ {{ object.pub_date }}</h3>
{% endfor %}
</body>
</html>
````

```django:templates/polls/detail.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Detail</title>
</head>
<body>
Detail
<h1>{{ object.question_text }}</h1>
<h1>{{ object.pub_date }}</h1>
</body>
</html>
````

## 画面で見てみよう
ListViewから見てみましょう。

[http://127.0.0.1:8000/polls/](http://127.0.0.1:8000/polls/)

![index1.png](https://qiita-image-store.s3.amazonaws.com/0/21492/f6ef09e8-036f-6afc-9827-553ab0a10a94.png)

１件しか表示されていないと有り難みが薄いのでDjangoAdminで１件追加します。

![admin.png](https://qiita-image-store.s3.amazonaws.com/0/21492/4c3c002f-f61e-a9e7-bbbe-ec79f2813560.png)

再度表示します。２件、表示されました。

![index2.png](https://qiita-image-store.s3.amazonaws.com/0/21492/0b1d228e-917e-b7ee-5a9d-728f3ebe4293.png)

次はDetailViewです。こちらは指定されたpkのデータが表示されています。pkの番号は登録順などで違いますので、DjangoAdminなどで確認してください。

[http://127.0.0.1:8000/polls/1/](http://127.0.0.1:8000/polls/1/)

![detail.png](https://qiita-image-store.s3.amazonaws.com/0/21492/38988f91-5590-fe6b-53db-17adccc77a37.png)

# まとめ
一覧と詳細だけ表示したい場合はデータ型などにこだわらなければListViewとDetailViewで簡単に表示することができますね。

## 最後に
これは[2015 tech-yuruyuru アドベントカレンダー](http://connpass.com/event/22759/)の9日目の記事です。
AtomにEmmet入れると標準Snippetsが効かなくなってTabで「=」「-」が展開されなかった問題の解決策がやっとわかった


erbの編集のとき `=`が`<%= %>`、`-`が`<% %>` にTabで展開されるはずなんだがEmmetを入れるとキーバインドが衝突してるためEmmetが勝ってしまう問題。数ヶ月悩んでた

```keymap.cson
'atom-text-editor.editor:not([mini])':
  'tab': 'snippets:expand'
```

を追記すればおｋ。
これでsnippetsの展開が優先される。EmmetもそのままTabで使える。

Emmetを都度offにしてしのいでた数ヶ月間。もっと早く知りたかった
Sinatra風の超高速マイクロフレームワーク - Kemal：事始め


![15321198.png](https://qiita-image-store.s3.amazonaws.com/0/90682/bcb039ab-56c1-e1f3-3166-cdf0e791a740.png "15321198.png")


[Kemal](https://github.com/sdogruyol/kemal)をご存知でしょうか？Kemalは[Crystal](http://crystal-lang.org/)製[Sinatra](http://www.sinatrarb.com/intro-ja.html)風の[超高速](https://github.com/sdogruyol/kemal#super-fast-3)マイクロフレームワークらしいです。

今回は、公式のチュートリアルをやってみたのでご紹介します。では、いきましょう！


## Crystalインストール
Crystalを入れていない人はまずこちらから。

```
$ brew update
$ brew install crystal-lang
```

または、[crenv](https://github.com/pine613/crenv)でもいいと思います。


インストールが終わったら、バージョンを確認してみましょう。

```
$ crystal -v
Crystal 0.9.1 (Fri Oct 30 13:49:46 UTC 2015)
```

これで準備は整いました。

## Kemalインストール

```
$ crystal init app your_app
$ cd your_app
```

`shard.yml`ができていると思うので、以下の内容を追加してください。

```
dependencies:
  kemal:
    github: sdogruyol/kemal
    branch: master
```

そうしたら、以下のコマンドを実行します。ちなみに、[Shards](https://github.com/ysbaddaden/shards)はCrystalのパッケージマネージャーです。

```
$ shards install
```

これで、Kemalが使えるようになりました。

## 動かす

`src/your_app.cr`を編集しましょう。

```
require "kemal"

get "/" do
  "Hello World!"
end
```

そしたら、以下のコマンドでビルド&実行です！

```
$ crystal build --release src/your_app.cr
$ ./your_app
```

[http://0.0.0.0:3000](http://0.0.0.0:3000)にアクセスすると、「Hello World!」と表示されていると思います。

改めてコード見ると本当にRubyっぽい...というかそのままって感じですね。

ちなみに、404はこんなのです。

![スクリーンショット 2015-12-23 22.51.52.png](https://qiita-image-store.s3.amazonaws.com/0/90682/f06bd02c-49f3-89e8-3a80-33c51fdbd20f.png "スクリーンショット 2015-12-23 22.51.52.png")

```
$ ./your_app
[development] Kemal is ready to lead at http://0.0.0.0:3000
2015-12-23 22:53:56 +0900 | 200 | GET / - (856µs)
2015-12-23 22:54:00 +0900 | 404 | GET /hoge - (40µs)
2015-12-23 22:54:00 +0900 | 200 | GET /__kemal__/404.png - (165µs)
```

（かわいい）

## さいごに

どうでしたか？個人的には404がお気に入りです。

余談ですが、本当は[Amethyst](https://github.com/Codcore/Amethyst)の記事を書こうと思っていました。ただ、やってみると色々と問題がありやめてしまいました･･･。そんな中、[Crystalshards](http://crystalshards.herokuapp.com/)を眺めていると、上から３番目にKemalがあったので記事にしようと思ったわけです。

CrystalはRuby風のシンタックスで結構いい感じだと思うので、今後も動向に注目していきたいです。
Singletonとtraitを使って楽にクラス拡張

# はじめに
脱グローバル変数、脱グローバル関数を目指してクラスを設計する際に出会ったデザインパターンの一つ「シングルトン」とPHP5.4以降で使用できる「トレイト」を組み合わせたクラス設計について書いてみます。
この組み合わせでクラス作成をして少し幸せになれたように思います。

# トレイトとは
> トレイトは、PHP のような単一継承言語でコードを再利用するための仕組みのひとつです。 
トレイトは、単一継承の制約を減らすために作られたもので、 いくつかのメソッド群を異なるクラス階層にある独立したクラスで再利用できるようにします。
[PHP：トレイト](http://php.net/manual/ja/language.oop5.traits.php)

要点としては、PHPの多重継承が出来ないという問題を解決するために搭載された機能です。
一定の振る舞いをモジュール化し、クラスに実装するという類似の機能では、RubyのMix-inやScalaのtraitがありますが、仕様は微妙に異なります。

### ⇒水平方向の拡張により、継承関係と関係なくモジュール化したメソッドやプロパティを追加できる機能がトレイトとなります。

# シングルトンとは
> ウェブアプリケーションを設計するときには、概念的そして構造的に、 特定のクラスのたったひとつのインスタンスにだけアクセスさせるようにしたいということがよくある。 そんなときに使えるのがシングルトンパターンだ。
[PHP The Right Way:デザインパターン](http://ja.phptherightway.com/pages/Design-Patterns.html)

今回は紹介しませんが、シングルトンを使用する場合、依存性の注入を使うべきです。

# シングルトンとトレイトから得られること
- コピペの量がかなり減る（DRYをまもれる）
- クラスの機能の拡張がかなり楽になる
- インスタンス作成のコストをかなり減らせる（場合による）
- インスタンスが複数存在する懸念をかなり減らせる（そもそも作られない）

# コード例
- ロボット（Robot）：「話す」、「移動する」などの基本動作が可能
- 探索ロボット（SearchRobot）：基本動作に加えて「ものを探索する」が可能
- 飛行ロボット（FlightRobot）：基本動作に加えて「飛ぶ」が可能

上の実装を普通に書いてみると、、

```php:
<?php

class Robot 
{
    function talk() {
        # code..
    }

    function move() {
        # code..
    }
}

class SearchRobot extends Robot 
{
    function search() {
        # code..
    }
}

class FlightRobot extends Robot 
{
    function fly() {
        # code..
    }
}
```

## 追加要件で「飛行探索ロボット（SearchFlightRobot）を追加したい」ときたら

飛行探索ロボットなので、FlyRobotとSearchRobotの2つを継承したいが多重継承の問題が...

素直にRobotを継承してクラスを作っても良いがDRYを守りたい...

## シングルトンとトレイトを使うと

```php:
<?php

trait Searchable 
{
    function search() {
        # code..
    }
}

trait Flyable 
{
    function fly() {
        # code..
    }
}

class Robot 
{
    public static function getInstance()
    {
        static $instance = null;
        if (null === $instance) {
            $instance = new static();
        }
        return $instance;
    }

    protected function __construct() { }

    private function __clone() { }

    function talk() {
        # code..
    }

    function move() {
        # code..
    }
}

class SearchRobot 
{
    use Searchable;
}

class FlightRobot
{
    use Flyable;
}

class SearchFlightRobot
{
    use Searchable, Flyable;
}

```

## 解説
- 静的メソッド*getInstance()*による遅延静的束縛を使用して新しくインスタンスを作る、またはインスタンスを呼び出す。
- トレイトにより、飛行機能、探索機能をモジュール化できているので「低空飛行」を飛行機能をもつすべてのクラスに適応する場合など、機能単位での変更に対応し易い。

# まとめ
シングルトンとトレイトを使って実際にクラス作成をすると、水平方向の拡張の容易さと扱いやすさ、インスタンス管理が楽になったイメージです。

シングルトンを使用する場合、依存性の注入を使わないと行けないなどテストがし易いよう気を配らないといけないのが少し面倒になるのでこれから検討したいです。

また、[例えば、Singletonを避ける](http://blog.yuyat.jp/archives/1500)より
> - TDD で開発することで設計上の問題点に気づきやすくなる
> - Singleton はグローバル変数である
> - Singleton の使用はできる限り避けるべきである

などとシングルトンパターンを避けるべきという意見もあるので、これらも織り込んだクラス設計を見つけていくのが今後の課題です。
ubuntuメディアCDで壊れたwindowsのデータを復旧する


# 用意するもの
ubuntuメディアCD


# 実行手順
1. BIOS起動する
パソコンによって違うので、メーカーのサイトを調べる。
ファンクションを押しながら起動などが多い。
cd bootを１番前に持ってくるように設定。
2. ubuntuメディアCDを入れてパソコンを起動する
ubuntuが起動する。
3. アップデートしておく
念のためアップデートする。
```
sudo apt-get update
```
4. パスワード設定をする
```
sudo passwd root 
```
パスワードを設定するとsuコマンドが使えるようになる。
5. スーパーユーザーに切り替える
```
su
```
6. メディアの状態を確認する
```
sudo fdisk -l
```

ファイラーよりWindowsが入っていたであろうHDをクリックするとエラーになっていた。

```
Unable to access "hoge GB Volume"
Error mounting ...... Command-line mount -t ntfs -o
..........
The ntfs partiton is in an unsage state. Please resume and shutdown Windows
fully or mount the volume read-only with the 'ro' mount option.
```
Window休止状態で、そのままWindowsが壊れた情報が残っているということか？
7. 再度mountする
```
sudo mount -o ro /dev/sdb1 /mnt
```
8. ファイラーに新しいmountが登場
mntフォルダの中に作成されているので
mnt以下よりwindowsファイルを復旧

#　リペアコマンドを使う

デバイスを探す。

```
sudo fdisk -l
```

デバイス指定してリペアする。

```
sudo xfs_repair /dev/sda1
```


参考
http://askubuntu.com/questions/280530/how-do-i-mount-a-hibernated-partition-with-windows-8-in-ubuntu

https://brokendish.org/ubuntu/3445/

https://weekly.ascii.jp/elem/000/000/193/193929/

https://qiita.com/ysakkk/items/d2268bbe41de39a7c8aa

http://www.sir-2.net/dablg/index.php?d=20141106
来年のETロボコンにmrubyで参加しようと思ってるひとへ(2015年版)

これは、[ETロボコン Advent Calendar 2015](http://www.adventar.org/calendars/734) - Adventarの23日目のエントリーです。


[来年のETロボコンにmrubyで参加しようと思ってるひとへ(2014年版)](http://qiita.com/yamanekko/items/e8938228ef72449669fe)を書いたのはちょうど１年前のことになります。mrubyに関しては1年前と比べると、ゆっくりとではありますが確実に歩み始めてるのかなあなんて感じています。

昨年同様、来年mrubyを使ってみたいなという方にとって少しでも役に立てるといいなと思いこのエントリを書いています。

# 2015年のできごと

## mruby実装が3種類でてきた
* mruby on EV3RT + TECS
* mruby-ev3rt(軽量Rubyフォーラム版)
* mruby-ev3rt(yamanekko版)

下2つは別々に実装されたものですが、蓋を開けたら同じ名前をつけていたということで、それぞれ製作者の名前で軽量Rubyフォーラム版、yamanekko版を呼び分けています。

それぞれについては後で紹介します。

## mrubyで参加したチームがいた

中四国地区大会で出雲ismさんがプライマリークラスに出場され、[IPA賞を受賞](http://www.icc.core.ac.jp/et%E3%83%AD%E3%83%9C%E3%82%B3%E3%83%B32015%E4%B8%AD%E5%9B%9B%E5%9B%BD%E5%9C%B0%E5%8C%BA%E5%A4%A7%E4%BC%9A%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6ipa%E8%B3%9E%E3%82%92%E5%8F%97%E8%B3%9E%E3%81%97%E3%81%BE/)されました。

 また、北九州地区大会でもSOROT⭐︎FCSKさんがアドバンストクラスに出場され、[地区特別賞を受賞](http://kyusyu.etrobo.jp/2015/result2015.php)されたようです。こちらについては、[RubyWorldカンファレンスで発表](http://www.scsk-kyushu.co.jp/seminar/151112.html)もされたようですね。

私も中四国大会応援の機会に恵まれ、デモ走行とmrubyについてお話しする機会をいただきました。(TODO サイトが見当たらなかったので、担当者に確認して掲載します)

いくつかの地区では盛り上がっていたようですが、その他の地区では残念ながらそれほどでもなかったようです。

# 2015.12現在のEV3で使えるmruby実装

冒頭で紹介した3種類の実装について紹介します。残念ながら最近、各作者さんとお話しする機会がなかったのでネットで収集した情報レベルのものになります。

## mruby on EV3RT + TECS

* [mruby on EV3RT + TECS(TOPPERSのサイト)](https://www.toppers.jp/tecs.html)
* [関西地区独自勉強会の資料](http://www.slideshare.net/takuyaazumi3/mrubyev3)

下の2つとは異なり、TOPPERSのTECSコンポーネント技術を使って実装されたものです。

## mruby-ev3rt 軽量Rubyフォーラム版
[mruby-toppers-ev3rt](https://github.com/mimaki/mruby-toppers-ev3rt)
※たぶんこれかなと思うのですが、もし違うようでしたらご指摘ください

軽量Rubyフォーラムが作成したもの。mrubyのmrbgem(Rubyのgemみたいなもの、ライブラリの一種)として実装したものです。

## mruby-ev3rt yamanekko版

軽量Rubyフォーラム版と同様mrbgemとして実装したものです。EV3RTからは完全に独立しているので、仕様変更がない限りEV3RTがバージョンアップされてもそのまま使用できます。使い方はqiitaの別エントリに記載していますので、そちらをご覧ください。

* [mruby-ev3rt](https://github.com/yamanekko/mruby-ev3rt)
* [ETロボコン2015 way用mruby版サンプルコード](https://github.com/yamanekko/mrb_way)
* [ETロボコン2015 way用mruby版サンプルコード(*.rbファイル読み込み版)](https://github.com/yamanekko/mrb_way_file)
* [ETロボコン2015 trike用mruby版サンプルコード](https://github.com/yamanekko/mrb_trike)
* [EV3RT用mrubyサンプルコードの使い方](http://qiita.com/yamanekko/items/c2adb87031bf38bb8a13#_reference-f2ddf04edda12aaf7d72)
* [EV3RT用mrubyサンプルコード(*.rbファイル読み込み版)](http://qiita.com/yamanekko/items/b48d4a716e9032c796f3)

このほかにも、あの"まいまい式の中の人"がev3dev(Linux)上で動作するように実装<del>しかけて放置</del>中だとの噂も聞きましたので、今後が楽しみですね:wink: 

# yamanekko版を使ってみたい方へ

今年のルールでは、利用したい参加者が利用申請する形でしたので非公式プラットフォームとして採用はされませんでした。来年以降どのようなルールになるのかわかりませんが、もし使ってみたい方がいらしたらご一報いただけると幸いです。


# 最後に

今年はESECにて、アフレルさんに機材をお借りしSESSAMEのブースでデモ走行をさせていただく機会に恵まれ、いち早く公開したmruby実装として注目していただきました。公開したことにより、TOPPERSではTECSの実装をしていること、軽量Rubyフォーラムでも実装しているとの情報を直接関係者からいただくことができました。また、mrubyをやってる人という認識をされ、関心を持っている方から話しかけていただいたり、逆に教えていただいたこともたくさんありました。

みなさんも、もし、何かについて情報を得たいとき、まず自ら持ってる情報を発信してみてはいかがでしょうか。きっと良い出会いが待っていますよ！
chrome extensionで画像リプツールを作りたかった

この記事は[学生エンジニア Advent Calendar](http://www.adventar.org/calendars/1158) 23日目の記事です。

冬休みの自由工作。

#できたもの
![ss-context-menu.png](https://qiita-image-store.s3.amazonaws.com/0/7611/46c67bbb-a7ad-061b-611f-553b09356dfd.png)
画像を右クリックで画像urlをメモに追加。
![ss-popup.png](https://qiita-image-store.s3.amazonaws.com/0/7611/9ae4ccaf-548e-16e6-b0cd-169cf2e0733d.png)

ポップアップを開いて画像クリックでurlをクリップボードにコピー。

slackとかに適当にガンガン貼り付けましょう。

##コード
[github](https://github.com/tanuwi/image-memo-chrome-extension) に置いてあるので、もし興味があれば煮るなり焼くなり好きに使ってください！

#こまかいところとか
特別な点はありませんが、せっかくなので今回やった部分でchrome extension固有な部分をざっくり書いていきます。
chrome extension開発の基本的な部分は、わかりやすく書いてくださっている記事がたくさんありますので、今回は触れません。

##context menuの表示

```json:manifest.json
・・・
  "background": {
    "scripts":[・・・, "context_menu.js"]
  },
  "permissions":[・・・, "contextMenus", ・・・]
・・・
```

```js:context_menu.js
chrome.contextMenus.create({
  "title" : "画像をメモ",
  "type" : "normal",
  "contexts" : ["image"],
  "onclick":function(info){
    addImageUrl(info.srcUrl);
  }
});
```

`"contexts" : ["image"]` とすることで、画像を右クリックしたときのみメニューに表示させます。

参考: https://developer.chrome.com/extensions/contextMenus

##popup

```json:manifest.json
{
・・・
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
・・・
}
```

とすると、アドレスバーの横あたりにアイコンが表示されて、押すとpopup.htmlが表示されます。

参考: https://developer.chrome.com/extensions/browserAction

##clipboardに書き込み

```json:manifest.json
  "permissions":["clipboardWrite", ・・・]

```

```js
function writeToClipboard(str) {
    var textArea = document.createElement("textarea");
    document.body.appendChild(textArea);
    textArea.value = str;
    textArea.select();
    document.execCommand("copy");
    document.body.removeChild(textArea);
}
```

少し面倒くさい。もっとシンプルにかけるのかもしれない。

参考: https://developers.google.com/web/updates/2015/04/cut-and-copy-commands

##storageの読み書き

```json:manifest.json
  "permissions":[・・・, "storage"]

```

```js:storage.js

function getImageUrls(callback) {
  chrome.storage.sync.get('urls', function(items) {
    urls = items['urls'];
    if(!urls) {
      urls = [];
    }
    callback(urls);
  });
}

function addImageUrl(url) {
  urls = getImageUrls(function(urls){
    urls.push(url);
    chrome.storage.sync.set({'urls': urls});
  });
}
```

storageAreaはsyncの他にもlocalやmanagedがあり、用途に応じて変更すると良いと思います。

参考: https://developer.chrome.com/extensions/storage

#本当はやりたかったこと
ポップアップの画像を投稿枠にドラッグしたらアップロードできるようにしたかった。(twitter用)
js詳しくないので、どう変えたらいいのかわかる人おしえてください！！

というかtwitterさん普通に外部の画像も表示して欲しい・・・。

#まとめ
twitterに貼りたい
underscoreコードリーディング（sample）

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


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


##sampleとは


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

こんな説明。
>####_.sample(list, [n]) 
>Produce a random sample from the list.
>Pass a number to return n random elements from the list.
>Otherwise a single random item will be returned.

```javascript

_.sample([1, 2, 3, 4, 5, 6]);
=> 4

_.sample([1, 2, 3, 4, 5, 6], 3);
=> [1, 6, 2]

```

------------- 
listからランダムにサンプルを抽出する
数値nを渡すと、ランダムに返す値の数を指定できる（配列で返ってくる）
それ以外の場合は1つだけ返ってくる

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

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


```javascript
  // Sample **n** random values from a collection.
  // If **n** is not specified, returns a single random element.
  // The internal `guard` argument allows it to work with `map`.
  _.sample = function(obj, n, guard) {
    if (n == null || guard) {
      if (!isArrayLike(obj)) obj = _.values(obj);
      return obj[_.random(obj.length - 1)];
    }
    return _.shuffle(obj).slice(0, Math.max(0, n));
  };
```

nが存在しない場合や、gurdが存在する場合_.randomを用いて返り値objのlengthの中からランダムな値のobj[x]を返す。
objがArrayじゃない場合は_.valuesを用いてそれらをvalueのみで構成される配列に変更後にobj[x]を返す

それ以外の場合はshuffleを用いてobjの中身を入れ替えた後、指定されたn個の配列を返す。
遺伝的アルゴリズムを使って、さだまさしのコード進行をどんどん「大空と大地の中で」にしていく

こんばんは。

さだまさしアドベントカレンダーも23日目。

今日はさだまさし曲のコード進行を、遺伝的アルゴリズムを使って、どんどん「大空と大地の中で」に近づけていきたいと思います。余談ですが、さだまさしと松山千春は犬猿の仲（でも、ほんとは仲良し？）と言われています。

これをすることに何か意味あんのかよッて感じですが、この活動の最終ゴールとしては何か任意の楽曲をインプットしたらさだまさしっぽくして返す「**さだまさジーン**」を作りたいと思っています。（それに対する意味の問いかけはNG。）

この曲をさだまさしがアレンジしたら、きっとこんな感じになるんだろうな〜っていう世界を実現できれば嬉しいです。今回は実現できていないですが。。まぁ今回で終わらず、連載化していきたいと思いますので、興味がある人は今後ともよろしくお願いします。

前置きが長くなって申し訳ありません！ということで、はじめましょう。

# 遺伝的アルゴリズム

遺伝的アルゴリズムとは、生物進化における遺伝と適者生存による自然淘汰の仕組みをソフトウェア的に模すことで複雑な問題に対する最適解を探索する手法です。

ある命題に対する解の候補を遺伝子(gene)とその集合体である染色体(chromosome)で表現した個体(individual)を複数用意し、適応度(fitness)の高い個体を優先して交叉(crossover)、突然変異(mutation)などの操作を繰り返し、適応度の高い個体を優先して保存しながら、最適解の探索を行う。

はい！詳しくはこちら！
http://www.slideshare.net/kzokm/genetic-algorithm-41617242

実用性もあって、たとえば、新幹線「N700系」の顔を創りだしたのも「遺伝的アルゴリズム」です。遺伝的アルゴリズムを用いた空力シミュレーションを使って「N700系」の顔を作り出しました。

はい！詳しくはこちら！
http://trendy.nikkeibp.co.jp/article/column/20070620/1001047/


# 遺伝的アルゴリズムを楽曲に適応させる

自動作曲という分野は古くからあるみたいで、その多くは音符とかもろもろ含んだものになっていますが、簡略化のため私はコード進行のみを対象とします。

自動作曲について詳しくはこちら！
http://sourceforge.net/projects/musicalgorithm1/

それでは適応方法を説明します。

遺伝子(gene)を1つのコードとします。染色体(chromosome)はコード進行です。

例として「大空と大地の中で」のAメロの1節を染色体(chromosome)にするとこんな感じです。

| F# | A#m | B | A#m | B | A#m | G#m | C# |

適応度については、「大空と大地の中で」の染色体（コード進行）と比較対象の染色体（コード進行）を比較し、一致しているものが多ければ適応度が高いというようにしました。ここに対して音楽的なアプローチは一切無しです。（ホントは色々とやりたかったのですが、私の情熱に対して今日という一日は短すぎた。）

交叉(crossover)は一様交叉を採用しました。（とくにそこに想いは無く簡単だったからです。）交叉対象の選択にはN者トーナメント方式を使っています（とくにそこに想いは無く簡単だったからです。）

突然変異(mutation)はコードをランダムに変更させました。
例えばC->FM7みたいに（ここも、もっと色々アプローチしたかった。）

# 試してみましょう

では、交配させていきましょう。交配する対象のさだまさし染色体はカラオケランキングから上位5曲をピックアップしました。

1. 案山子
2. 関白宣言
3. 秋桜
4. 精霊流し
5. 防人の詩

本当は1曲まるまる染色体として表現したかったのですけど、簡略化のため、今回はAメロの1節のみを対象としました。

**10,000回**くらい交配させたら、、
はい、こんな子が生まれました！

![スクリーンショット 2015-12-23 22.34.54.png](https://qiita-image-store.s3.amazonaws.com/0/103674/6bda4747-636c-9f74-bd43-8dfa44f64025.png)


ふむ、なんとも言えない"**音痴**"感。
しかも、そこにさだまさしっぽさは皆無です。（そらそうだが、、）

# 反省と今後
率直な感想は**未完成**です。まだまだやれることはあるでしょう。

今後やりたいこととしては、、

1. 適応度判定、突然変異にもっと音楽的な観点を含めたい。じゃないといつまでたっても音痴。それに合わせて交叉ももっと工夫したい。
2. さだまさしっぽさを学習するためのシステムも必要。このコードの流れはまさに**さだ**だねぇ〜みたいなものを導き出したい。deep learningでもしてみようかしら。
3. 染色体を選定するためのシステムも考えたい。例えば、悲しい曲を**さだまさジーン**のインプットにするならさだまさしの悲しい曲達を染色体としてピックアップするとか。感情分析して染色体をピックアップを自動で出来るようになると嬉しいですね。
4. ソースコードを公開できるくらいちゃんと整備したい。現状のソースは突貫工事でとても人の目に当てられるものではない。

やりたいことが多いです。でも楽しくなってきたので、ゆっくり実現していきたいと思います。
それでは。
Amazon Product APIをPythonで叩く簡単な方法

自分でAPIを叩いてもいいんだけど，ドキュメントが読みづらいし，結局リクエストに何のパラメーターが必要なのかパッと書いてないですし，なんか自分でハッシュ化したSigunatureをURLに付けたりしないといけなくて面倒なので，便利なライブラリを使いましょう．

[python-amazon-simple-product-api](https://github.com/yoavaviram/python-amazon-simple-product-api)

超便利です．
インストールなどはREADME読めばすぐに分かります．

実際に実行してみるとこんな感じです．
regionを指定してやらないと海外のストアを検索しているのか，商品が見つからないので，`region="JP"`を忘れないようにしてください．

```py3
In [9]: amazon = AmazonAPI(ACCESS_KEY, SECRET_KEY, ASSOCIATE_ID, region="JP")
In [10]: product = amazon.lookup(ItemId='B00E7N623K')
In [11]: product.__dict__
Out[11]:
{'api': <amazon.api.AmazonAPI at 0x1037e9cf8>,
 'aws_associate_tag': 'アソシエイトID',
 'parent': None,
 'parsed_response': <Element {http://webservices.amazon.com/AWSECommerceService/2013-08-01}Item at 0x1035b9e08>,
 'region': 'JP'}

In [12]: product.parsed_response
Out[12]: <Element {http://webservices.amazon.com/AWSECommerceService/2013-08-01}Item at 0x1035b9e08>

In [13]: product.parsed_response.ItemAttributes
Out[13]: <Element {http://webservices.amazon.com/AWSECommerceService/2013-08-01}ItemAttributes at 0x10382e508>
```

ライブラリの中身ではlxmlでxmlのレスポンスをパースしている気がします．
実際，上記の実行例の中でもlxmlのElementインスタンスが入れ子になって含まれていますね．

長々とAPIの公式ドキュメント読みましたが，明らかにこれが楽です．
Macでvagrant upするときVirtualBoxの準仮想化プロバイダをminimalにする

**2016-12-25 追記**

これやる意味あまり無いみたい。

というか、ホスト側がMacの時にゲストが何であろうと指定するもんだと勘違いしてました。ドキュメントにも`Mac OS guests`と書いてある。最近は特に何も指定しなくても不具合を感じていないので、VirtualBoxのバージョンがあがって解決されたんだろうと思う。

ちなみに*すこぶる調子が悪かった*具体的な現象は、特にホストのMacがスリープから復帰した時にゲストVMが暴走してCPU使用率100%、ファン爆回転といったものでした。

---- 

デフォルトだとKVMになってMacだと調子がすこぶる悪い。ドキュメントには以下のように記載されている。

http://www.virtualbox.org/manual/ch08.html#idp46608648159600
> The minimal provider is mandatory for Mac OS X guests

Vagrantfileに以下のように記載してあげると起動前にminimalに変更してくれる。

```
  config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--paravirtprovider", "minimal"]
  end
```
Atom(ver1.3.2)でペイン分割を試みるとフリーズする問題への対処法

# 対処法
- Atom 1.4.0beta2もしくは3を使う(Atom1.3.2のバグらしい)
    - Beta版のダウンロードはこちらから : https://atom.io/releases

# 情報元
https://github.com/atom/atom/issues/10141
BPMについて (分析)

BPMでは、分析(Plan)、実行(Do)、評価(Check)、改善(Act)という流れを継続的に実施す改善活動であり、詳細な内容として、まずは分析(Plan)から記載する。

・分析(Plan)
　　分析では、「現状の業務プロセスを解析し、あるべき姿に向けてどのように改善を行えばよいかを確認し、改善する方向を決定する作業」を行うことであり、次の段階である"実行"のため下準備である。

分析では、まず企業理念、企業方針、戦略を作成もしくは見直すことから始める。
※企業を設立する中で"企業理念、企業方針、戦略"は作成されることが多いと思うが、現状に合っていないと企業の目標がぶれてしまうため、
再度確認及び修正を実施することが多い。
iPhoneのバーの種類

#<font color="maroon">ステータスバー</font>
![](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Art/status_bar_default_2x.png)
<br>

#<font color="maroon">ナビゲーションバー</font>
![](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Art/nav_bar_iphone_2x.png)
<br>

#<font color="maroon">ツールバー</font>
![](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Art/mail_toolbar_iphone_2x.png)
<br>

#<font color="maroon">タブバー</font>
![](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Art/music_tab_bar_iphone_2x.png)
<br>

#<font color="maroon">検索バー</font>
![](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Art/search_bar_2x.png)
<br>

#<font color="maroon">スコープバー</font>
![](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Art/scope_bar_2x.png)
<br><br>
***
[iOS Human Interface Guidelines:バー](https://developer.apple.com/jp/documentation/UserExperience/Conceptual/MobileHIG/Bars/Bars.html)
Rust言語製ゲームエンジンPistonの紹介

この記事では、オープンソースで開発されているクロスプラットフォームなRust製ゲームエンジンPistonを紹介します。  
一応、Pistonのリンクも貼っておきます。  
- [公式サイト](http://www.piston.rs/)
- [GitHub](https://github.com/PistonDevelopers/piston)

# Pistonゲームエンジンの特徴
Pistonの特徴をいくつか列挙してみます
1. Rust言語の恩恵（安全性や並列性など）を受けたゲーム制作
2. 様々なモジュール、ライブラリ
3. 2D、3Dグラフィックのゲーム開発
4. クロスプラットフォームなゲーム開発
いい感じですね。

# Hello World!
早速、Pistonを使ってみましょう。
今回は`piston_window`という公式のラッパーを使ってゲームループを作ってみます。

まだRust言語をインストールしていない方は[公式サイト](http://www.piston.rs/)を参考にしてインストールを行ってください。

また、Pistonが依存しているFreetypeもインストールしてください。[How to install FreeType](https://github.com/PistonDevelopers/piston/issues/912)

次に、Rustプロジェクトを作ります。
`$ cargo new example --bin && cd example`
次に`Cargo.toml`に以下の二行を**追記**、`src/main.rs`を`piston_window`の
README[https://github.com/PistonDevelopers/piston_window/blob/master/README.md]
で一番初めに書かれているコードで**上書き**します。

```toml:Cargo.toml
[dependencies]
piston_window = "0.33.0"
```
ここで
`$ cargo run`
とするとウィンドウが表示されるのが確認できたと思います。

簡単ですね。

# リポジトリの紹介
Pistonの開発が行なわれているGitHubアカウント[PistonDevelopers](https://github.com/PistonDevelopers)には投稿日の時点で101ものリポジトリがあり、  
どれが何をするものなのか、また、どれを使えばいいのかよく分かりません。
そこで、私の知ってる範囲で幾つかの代表的なリポジトリ名と目的を列挙してみました。  
[piston](https://github.com/PistonDevelopers/piston) - Pistonのメインリポジトリ。イベントループやユーザー入力処理などの基本的な機能のアンブレラプロジェクトになっている。
[conrod](https://github.com/PistonDevelopers/conrod) - 2DのGUIを作るためのライブラリ。
[sprite](https://github.com/PistonDevelopers/sprite) - スプライトやシーンなどを扱うためのライブラリ。
[turbine](https://github.com/PistonDevelopers/turbine) - 3Dのゲームエンジン。エディタが付いているらしい。
[VisualRust](https://github.com/PistonDevelopers/VisualRust) - Visual Studioのプラグイン。
[hematite](https://github.com/PistonDevelopers/hematite) - Pistonで作られたMinecraftみたいな何か。

#最後に
短くなってしまいましたが、こんなところでこの記事はおしまいです。
ゲームエンジンを探している方は是非一度試してみてください。
ありがとうございました。
Chrome, Safari の開発者モードで Selenium を実行

この記事は [Selenium/Appium Advent Calendar 2015](http://qiita.com/advent-calendar/2015/selenium) の23日目の記事です。

----

スマートフォン向けの Web UI テストを行う為のツールとして，Chrome Developer Tool, Safari Responsive Design Mode（以下まとめて『開発者モード』）があります．

※本当の開発者モードは、DOM とか Network とかその他色々……っていう細かい突っ込みは無しでお願い致します。

これ単体だけでも非常に便利で，もはやスマートフォン向け Web 開発のためには欠かせないツールになっていますね．

開発者モードは以下のようなことをやってくれるツールです。

1. 端末の画面解像度（例：幅1080ｘ高1920）をシミュレーションした上で，画面上に表示できる程度の縮尺（50%とか）で表示
2. サーバーにリクエストする際の User Agent 文字列を，モバイルブラウザ（Android Chrome や iOS Safari）のそれに
3. `onmousedown` 等のイベントを， `ontouchstart` 等の対応するイベントに読み替える

次がそれぞれのサンプルイメージです．

## Chrome Developer Tool (Windows)
![Chrome Developer Tool](https://i.gyazo.com/022cbcadca6a1852f8d93d8e4b5e0125.png)

（User Agent 文字列として，iPhone6 Safari のものを渡していますので，SP 版の検索結果ページが見えます）

## Safari Responsive Design Mode (Mac)
![Safari Responsive Design Mode](https://i.gyazo.com/75d656f5077b9df38547f29fe4b8fcd3.png)

User Agent 変更など，やっていることは同じです．
Minimum で Apple っぽいデザインのレスポンシブデザインモードです．


# Selenium で開発者モードを使う

Web ブラウザの UI 自動化と言えば，Selenium WebDriver です．

Selenium で Web ページテストをするときに，開発者モードで指定のページを開くことができれば，今まで SP 端末テストのために端末をかき集めて，WebDriver をインストールして……というテストを，ある程度不要にできます．

## Selenium Web Driver から，Chrome 開発者モード（Developer Tool）を起動する

Chrome Web Driver には，開発者モード指定が付いています．

こちらとかにも記事があります．http://qiita.com/okitan/items/ee6f5094319b964e84e1


## Selenium Web Driver から，Safari 開発者モード（Responsive Design Mode）を起動する

Elcapitan から（？）実装された Safari のレスポンシブデザインモードですが，現時点ではまだ Safari Web Driver から起動オプションとして指定することができません．

Responsive Design Mode の入り口は `Option + Command + R" なので，ウィンドウ起動後にキーを送ってやるといいです．
Java であれば，以下の用にすれば Responsive Design Mode の WebDriver のできあがりです．

```ResponsiveDesignMode.java
import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.lang.Exception;

import lombok.Cleanup;

import org.openqa.selenium.safari.SafariDriver;

public class SafariCustomDriverProvider {
  public static void main(String[] args) throws Exception {
    // Safari Driver 起動
    @Cleanup("quit")
    final SafariDriver driver = new SafariDriver();

    // Safari Window を Screen Top に
    Runtime.getRuntime()
      .exec("open -a /Applications/Safari.app/Contents/MacOS/Safari")
      .waitFor();

    // Option + Command + R で Responsive Desing モード起動
    try {
      final Robot robot = new Robot();

      robot.keyPress(KeyEvent.VK_ALT);
      robot.keyPress(KeyEvent.VK_META);
      robot.keyPress(KeyEvent.VK_R);
      robot.delay(100);
      robot.keyRelease(KeyEvent.VK_ALT);
      robot.keyRelease(KeyEvent.VK_META);
      robot.keyRelease(KeyEvent.VK_R);
    } catch (AWTException e) {
      throw new RuntimeException(e);
    }

    driver.get("http://example.com/");
  }
}
```

これで次の結果が得られます．

![Safari Responsive Design Mode](https://i.gyazo.com/75d656f5077b9df38547f29fe4b8fcd3.png)

# 終わりに

開発者ツールの機能が上がることは，開発時にはもちろん，自動化にとっても嬉しいことです．
Selenium Web Driver はスマートフォン端末での Web UI テストを簡単にしましたが，Selenium スクリプトを記述するのは PC 上である事を考えると，実際の CI に組み込んだタイミングではともかく，開発時はローカル環境で試せるに越したことはありません．

Chrome, Safari とも，開発者ツールを起動する手間は初期化のタイミングでホンの数行のコードを書くだけですので，日々の開発環境に組み込んでみてはいかがでしょうか．
Docker コンテナと仮想マシン間の変換(お試しレベル)

Docker Advent Calendar 2015 23日目の記事です。。。が、まだ途中です。すみません。。。

# 概要
実用性は別にして、ふと、「既存の仮想マシン環境をコンテナとして実行できないか、また逆に、コンテナを仮想マシンに変換できないか」と思い立ったので、お試しレベルでやってみました。

# 仮想マシンから Docker イメージへの変換
仮想マシン上にはコンテナとして動作するのに必要なファイルが揃っているので(逆に余分なファイルが多い)、容量など考えずに単純に Docker イメージにするだけなら簡単です。

[お試し環境]

* 仮想マシン： CentOS7.1 (on Hyper-V)
* Dockerホスト： CentOS7.1 + Docker1.9.1

まずは、仮想マシン上のファイルを tar で取り出します。取り出し途中のファイルの整合性(停止点の確保)とかは考えてません。

```bash:仮想マシン側
# 不要なディレクトリとファイルを tar に含めないために、以下のファイルを作成しておく。
$ cat /tmp/exclude.txt
/boot/*
/dev/*
/mnt/*
/proc/*
/sys/*
/tmp/*

# 仮想マシン上のファイルを収集。
$ sudo tar czpf /tmp/vmfiles.tar.gz / -X /tmp/exclude.txt

# 生成された tar.gz ファイル
$ ls -lh vmfiles.tar.gz
-rw-r--r--. 1 root root 424M Dec 23 08:50 vmfiles.tar.gz

# これを Docker ホストへ転送する
$ scp /tmp/vmfiles.tar.gz root@dockerhost:/tmp/
```

Docker ホスト側で、この tar.gz を Docker イメージとしてインポートします。

```bash:Dockerホスト側
# インポート
$ cat /tmp/vmfiles.tar.gz | docker import - vmimage

# インポートされたことを確認
$ docker images
REPOSITORY    TAG       IMAGE ID        CREATED          VIRTUAL SIZE
vmimage       latest    d5285c5cec5d    3 minutes ago    1.3 GB
```

インポートに成功しましたが サイズが 1.3GB とかなり大きいです。本当なら、Base Image からの差分だけを含めるようにしたいのですが。

コンテナを起動してみます。まぁ普通に起動しますが、これだけだと面白いことは何も無いですね。。。

```text:Dockerホスト側
$ docker run -it --name test1 vmimage /bin/bash

[root@ed455f3e2a46 /]# ls /
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var

# ホスト名はコンテナのIDに変更されている
[root@ed455f3e2a46 /]# hostname
ed455f3e2a46

```

# Docker コンテナから仮想マシンイメージへの変換

こちらは少し難しいです。Docker コンテナには仮想マシンとして起動させるためのファイルやブートローダーが含まれてないので、それを補ってあげる必要があります。

まず、対象となるコンテナのディレクトリツリーを tar にエクスポート。

```text:Dockerホスト側
# docker ps -a
CONTAINER ID    IMAGE     COMMAND        CREATED             STATUS                          PORTS      NAMES
804cf88745c0    centos    "/bin/bash"    2 minutes ago       Exited (0) About a minute ago              test

# docker export test > container.tar
# ls -lh container.tar
-rw-r--r--. 1 root root 262M 12月 23 19:32 container.tar
```

次に、仮想マシン用のイメージファイルを作成して、そこにエクスポートしたファイルを流し込みます。
Linux に詳しくないので正しい手順なのか分かりませんが、以下のようにしてみました。

```text:Dockerホスト側

[空のイメージファイルを作成]
# dd if=/dev/zero of=disk.img bs=1M count=2048

[fdisk でパーティションを作成]
# fdisk disk.img

[イメージファイルのパーティションテーブルからデバイスマップを作成]
# kpartx -av disk.img

[フォーマット＆マウント]
# mkfs.ext4 /dev/mapper/loop0p1
# mount /dev/mapper/loop0p1 /mnt

[エクスポートしたコンテナのディレクトリツリーをイメージファイル内に展開]
# tar xvf container.tar -C /mnt

```

もちろんこれだけで起動するイメージにはならなくて、この後 Kernel や Grub などのインストールや設定が必要になります。
続きはまた時間のある時に試してみます(なんか、Docker の話から離れてるし・・・)。
ツインドラゴンに関する発見と実装

## はじめに

[ツインドラゴン（Mathematicaショートフラクタルシリーズ） - Qiita](http://qiita.com/butchi_y/items/6a32ee40c9674d8cb8c6)
の数学的な話題をもう少し掘り下げました。

いくらか被る内容がありますがご容赦ください。

## ツインドラゴンとは

<img width="456" alt="twindragon_text.png" src="https://qiita-image-store.s3.amazonaws.com/0/6117/78f98fc8-6bc7-8d7e-10fe-8a26175c8be3.png">

ツインドラゴンは$2$進数の基数を$2$ではなく$1+i$（$i$は虚数単位）として
計算することによって現れる図形です。
たとえば、$10$進数の$13$は$2$進数では$1101$と表せますが、
これは$1\times 2^3 + 1\times 2^2 + 0\times 2^1 + 1\times 2^0$と1桁毎に計算することにより
元の$13$という数を得ることができます。

ここで上記の基数$2$を$1+i$に置き換えると


$ 1×(1+i)^3 + 1×(1+i)^2 + 0×(1+i)^1 + 1×(1+i)^0$
$=1×(-2+2i) + 1×(2i) + 0×(1+i) + 1×(1)$
$=-1+4i$

となります。これが複素平面での座標$(-1,4)$になります。
$13$を冒頭の図で探してみると、"0"がある位置から
左に$-1$、上に$4$のところにありますよね。
このように、数字を0から順番に$1+i$を基数として数えることにより
冒頭の図のような数の平面ができます。
ツインドラゴンはD. Knuth氏が$-1+i$進数として世に知らしめた図形です。
本稿では$-1+i$進数ではなく$1+i$進数として議論を進めます。


## 今回の発見

冒頭の図の数字のある座標を0から順に数えると、

$x(n): 0, 1, 1, 2, 0, 1, 1, 2, -2, -1, -1, 0,\dots$
$y(n): 0, 0, 1, 1, 2, 2, 3, 3, 2, 2, 3, 3,\dots$

となります。

よく使う裏技で、
「[オンライン整数列大辞典](http://oeis.org/)」を使って検索すれば、
一発解決できることがけっこうあります。
しかし、今回は検索に引っかかりませんでした。
（割と単純そうな数列なのに出ない、逆にこれはチャンス！）
$x$座標と$y$座標の列をそれぞれプロットすると下図のようなグラフになります。

![twindragon_re.png](https://qiita-image-store.s3.amazonaws.com/0/6117/315b3d0e-dea1-9a54-1940-eb44c09e117e.png)

![twindragon_im.png](https://qiita-image-store.s3.amazonaws.com/0/6117/08160073-b3a6-66d7-85e1-c62d7b386334.png)



2のべき乗で周期性がありそうですね。
なので、この数列$(x(n))$の2のべき乗番目$(x(2^n))$を取り出してみます。
すると

$x(2^n): 0, 1, 2, 2, 0, -4, -8, -8, 0, 16, 32, 32, \dots$
$y(2^n): 1, 1, 0, -2, -4, -4, 0, 8, 16, 16, 0, -32, \dots$

となりました。数列の値に0と2のべき乗が頻出していますね。
これを同じくしてオンライン整数列大辞典で検索したら引っかかりました。
どうやら$\sin(x) \exp(x)$と$\cos(x) \exp(x)$をそれぞれテイラー展開したときの係数の数列のようです。

http://oeis.org/A009545
http://oeis.org/A146559

なんで三角関数と指数関数が出てくるか謎の展開です。
そして、次の式が成立することが判りました（証明はしてませんが）。

$x(2^n) = 1 - y(2^n-1)$
$y(2^n) = x(2^n-1)$

この式を使えば、例えば先頭16要素の$x$と$y$の組から
それに続く16要素の$x$と$y$の組を
簡単に求められるということになります。

Mathematicaでは前回示したとおり、以下のように書けました。

```mathematica:twindragon.nb
Graphics[Point[
  Transpose[{Re[#], Im[#]} &[
    Nest[Join[#, # + 1 - Im[Last[#]] + Re[Last[#]] I] &, {0}, 10]
  ]]
]]
```

JavaScriptだと以下のように書けました。

```js:twindragon.js
var i, j;
var x = [0];
var y = [0];
var nextX = [];
var nextY = [];
for(j=0; j<4; j++) {
  l = x.length-1;
  for(i=0; i<x.length; i++) {
    nextX[i] = x[i] + 1 - y[l];
    nextY[i] = y[i] + x[l];
  }
  x = x.concat(nextX);
  y = y.concat(nextY);
}
console.log(x);
console.log(y);
```

これを若干脚色した、canvas描画のプログラムをjsdo.itに投稿しました。
http://jsdo.it/butchi/twindragon

もっと短く書けるよ、とかあったら教えてください。
チャットアプリを試してみた

zulip
-----

https://github.com/zulip/zulip/blob/master/README.dev.md

vagrantをインストールする。

```sh
$ sudo aptitude install lxc lxc-templates cgroup-lite redir
```
```sh
$ wget https://releases.hashicorp.com/vagrant/1.8.0/vagrant_1.8.0_x86_64.deb
$ sudo dpkg -i vagrant_1.8.0_x86_64.deb
$ sudo vagrant plugin install vagrant-lxc
```

zulipのコンテナを起動する。

```sh
$ git clone https://github.com/zulip/zulip.git
$ cd zulip
$ vagrant up
```

SSHのポート転送を指定して、zulipのコンテナに接続する。

```sh
$ vagrant ssh -- -L0.0.0.0:9991:localhost:9991
```

コンテナのタイムゾーンを日本時間に変更する。

```sh
$ sudo dpkg-reconfigure tzdata
  ⇒Asia/Tokyoに変更する
```
```sh
$ cd /srv/zulip
$ source /srv/zulip-venv/bin/activate
$ ./tools/run-dev.py --interface=''
```
```
System check identified no issues (0 silenced).
December 22, 2015 - 18:09:58
Django version 1.8, using settings 'zproject.settings'
Starting development server at http://localhost:9992/
Quit the server with CONTROL-C.
```

http://192.168.0.200:9991/


mattermost
----------

```sh
$ docker run --name mattermost-dev -d --publish 8065:80 mattermost/platform
```

http://192.168.0.200:8065/


lets-chat
---------

### docker使用

```sh
$ docker run --name some-mongo -d docker.io/mongo
$ docker run --name some-letschat --link some-mongo:mongo -p 9080:8080 -d sdelements/lets-chat
```

http://192.168.0.200:9080/


### ローカルインストール

```sh
$ sudo aptitude install npm mongodb
```
```sh
$ git clone https://github.com/sdelements/lets-chat.git
$ cd lets-chat
$ npm install
$ cp settings.yml.sample settings.yml
$ vi settings.yml
```
```diff
--- settings.yml.sample 2015-12-23 10:10:15.317877684 +0900
+++ settings.yml        2015-12-23 17:10:36.045070796 +0900
@@ -8,7 +8,7 @@

 http:
   enable: true
-  host: 'localhost'
+  host: '0.0.0.0'
   port: 5000

 https:
@@ -38,3 +38,6 @@
   providers: [local]
   local:
     enableRegistration: true
+
+i18n:
+  locale: ja
```

```sh
$ npm start
```

http://192.168.0.200:5000/


### vagrant使用（失敗）

```sh
$ git clone https://github.com/sdelements/lets-chat.git
$ cd lets-chat
$ vagrant up
```
```
Bringing machine 'lcb' up with 'lxc' provider...
==> lcb: Box 'precise32' could not be found. Attempting to find and install...
    lcb: Box Provider: lxc
    lcb: Box Version: >= 0
==> lcb: Box file was not detected as metadata. Adding it directly...
==> lcb: Adding box 'precise32' (v0) for provider: lxc
    lcb: Downloading: http://files.vagrantup.com/precise32.box
The box you attempted to add doesn't match the provider you specified.

Provider expected: lxc
Provider of box: virtualbox
```

Vagrantfileを修正してやり直し。

```diff
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -27,8 +27,9 @@ EOF
 VAGRANTFILE_API_VERSION = "2"

 Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
-  config.vm.box = "precise32"
-  config.vm.box_url = "http://files.vagrantup.com/precise32.box"
+  #config.vm.box = "precise32"
+  #config.vm.box_url = "http://files.vagrantup.com/precise32.box"
+  config.vm.box = "fgrehm/trusty64-lxc"

   config.vm.define :lcb do |lcb|
       lcb.vm.network "forwarded_port", guest: 5000, host: 5000
```
```sh
$ vagrant up
```

http://192.168.0.200:5000/

起動出来たけど接続できなかった。