OmniAICreator/Qiita-1.07M huggingface dataset:
Linuxでx86アセンブラ（スタック編）

# \:large_blue_diamond:この記事について
Linuxでx86アセンブラ第6回．アセンブラでのスタックの操作について書いていきます．アセンブラではスタックにより動的にメモリ管理します．このスタックは自動変数の格納先や、関数間の変数の受け渡しに用いられます．また、浮動少数の演算にはスタックの知識は不可欠です．

# \:large_blue_diamond:スタックとは？
前回の記事で説明したようにdata・bssセクションで定義した領域には先頭のアドレスを保管している変数名でアクセスしました．つまり、アクセスしたいメモリ領域に名前をつけて、その名前を使ってアクセスします．しかし、この方法ではプログラムの実行中に宣言される変数にアクセスすることは難しいです．そこで、名前無しでメモリにアクセスする方法を提供するのがスタックです．
スタックはLIFO構造を持ちます．スタックにデータを追加（プッシュ）すると積み上がっていきます．

![Push.png](https://qiita-image-store.s3.amazonaws.com/0/77676/815f0b53-a852-64f9-e424-9e1eb500cb7a.png)

スタックからデータを取り出す（ポップ）すると積まれたデータの一番上（最後に積まれた）データが取り出されます．
![Pop.png](https://qiita-image-store.s3.amazonaws.com/0/77676/8b0c1713-6d5a-00e1-8b29-8f2e15228b50.png)

つまり、スタックは名前ではなくスタックにプッシュ・ポップされた順番によってメモリにアクセスできるようにする仕組みです．

# \:large_blue_diamond:プッシュ
アセンブラでスタックにプッシュするには```push```ニーモニック使います．

```
push <レジスタ・メモリ・フラグ>
```

スタックの要素にアクセスするにはesp・ebpレジスタを使います．
espはスタックの一番上のアドレスが格納されます．```push```が実行されるとスタックにデータが追加されるとともにespが指すアドレスも移動されます．espは```push```・```pop```を行うと自動的に指しているアドレスが変わってしまいます．そこで、espの値を一時的に保管する先がebpです．espの値をebpにコピーするには```mov```ニーモニックを使います．

```
mov ebp, esp
```
# ポップ
スタックからデータをポップするには```pop```ニーモニックを使います．

```
pop <レジスタ・メモリ・フラグ>
```

ポップされたデータはスタックからなくなります．
ポップする以外にもスタックからデータを取り除く方法があります．
それは、espを動かすことです．

```
add esp, 8
```

これによりスタック一番上にあるデータが、スタックからなくなります．

# \:large_blue_diamond:デモ
スタックの操作方法を説明するサンプルコードです．

```stack.asm
section .data

section .bss

section .text

global main

main:
   enter 0,0
   nop

.push:
   mov rax, 1
   push rax
   mov rax, 2
   push rax
   mov rax, 3
   push rax
   mov rax, 4
   push rax

.pop:
   mov rax, [rsp]
   mov rax, [rsp + 8]
   mov rax, [rsp + 16]
   mov rax, [rsp + 24]
   pop rax
   pop rax
   pop rax
   pop rax

.final:
    mov eax, 0
    leave
    ret
```

コンパイルして、gdb上で実行してみてください．
スタックもメモリの一種です．なのでgdbないでスタックを表示するにはメモリの中身を表示するコマンド```x```を用います．
このプログラムでは

```
x/20 $rsp
```

で、スタックの中身を表示することができます．


# 参考文献
* NASM development team site:   
http://www.nasm.us/
* GDB: The GNU Project Debugger site:   
https://www.gnu.org/software/gdb/
* Assembly Language Step-by-Step: Programming with Linux:   
http://www.amazon.co.jp/Assembly-Language-Step---Step-Programming/dp/0470497025/ref=sr_1_1?ie=UTF8&qid=1446704607&sr=8-1&keywords=assembly+language+step+by+step
* Stack Analysis with GDB:    
http://resources.infosecinstitute.com/stack-analysis-with-gdb/
* HUMAN PICTOGRAM 2.0    
http://pictogram2.com/

↓↓\:bowtie:過去の投稿もよろしくね\:bowtie:↓↓

* Linuxでx86アセンブラ（基本的なコードの構造編）
http://qiita.com/MoriokaReimen/items/b320e6cc82c8873a602f

* Linuxでx86アセンブラ（論理演算編） 
http://qiita.com/MoriokaReimen/items/bf863585616ad0a0a969

* Linuxでx86アセンブラ(四則演算編)
http://qiita.com/MoriokaReimen/items/4853587dcb9eb96fab62

* Linuxでx86アセンブラ(Cとの連携編)
http://qiita.com/MoriokaReimen/items/590a4ddb3de15bfacb4b

* Linuxでx86アセンブラ(道具編)
http://qiita.com/MoriokaReimen/items/b316a68d76c1eafa18f8

* tmuxの使い方
http://qiita.com/MoriokaReimen/items/d7d5b158cb412dd65a60



↓↓\:bowtie:コメントをいただけたら励みになります\:bowtie:↓↓
RubyMotion：導入編

# MacのOSバージョン

Mac OS X El Capitan 10.11.1

# 導入手順
## ダウンロード
1. http://www.rubymotion.com/jp/
の右上のダウンロードボタンをクリックする。
2. このようなページが出てくるので、とりあえず遊んでみたい場合は左のStarterのダウンロードをクリックする。
![スクリーンショット 2015-11-28 12.32.39.png](https://qiita-image-store.s3.amazonaws.com/0/100736/2a04d7df-b9b8-96a1-57a0-d99474a15835.png)
3. 名前とメールアドレスの入力を求められるので入力する。
4. 入力したメールアドレスにダウンロードリンクとライセンスキーが送られてくるのでリンクをクリックする。

## インストール
ダウンロードしたinstaller.appをクリックする。
場合によっては「開発元が未確認のため開けません」エラーが表示されるので、
controlを押しながらクリックをしてこの状態にし、
![スクリーンショット 2015-11-28 13.43.06.png](https://qiita-image-store.s3.amazonaws.com/0/100736/cdfee48c-8336-d212-94bb-2a8be78f690c.png)
開くをクリック。
すると下の表示が出てくるので開くをクリック。
![スクリーンショット 2015-11-28 13.02.16.png](https://qiita-image-store.s3.amazonaws.com/0/100736/12f0059a-f489-b46b-70fd-25b496284bee.png)
ライセンスキーを入力してインストールが終わるまで待ちます。

インストールが終わったら正しくインストールができているか確認します。
コマンドラインツールを立ち上げ、以下のコマンドを打ちます。
`motion --version`
バージョン番号が表示されればインストール成功です。
ちなみに私の環境では4.5がインストールされてました。
systemctl start vboxservice.service に失敗する

2016-02-19 追記
systemd 228-4 で解決されたので以下の情報は賞味期限切れです。

# 環境
- VirtualBox 5.0.0
- VirtublBox 上の ArchLinux
- systemd 228-3

# vboxservice の起動に失敗する

vboxservice を起動して

```shell-session
# systemctl start vboxservice.service
```

状況を確認すると `ConditionVirtualization=oracle was not met` で起動できていません。

```shell-session
# systemctl status vboxservice.service
● vboxservice.service - VirtualBox Guest Service
   Loaded: loaded (/usr/lib/systemd/system/vboxservice.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/vboxservice.service.d
           └─override.conf
   Active: inactive (dead)
Condition: start condition failed at Sat 2015-11-28 12:41:14 JST; 59s ago
           ConditionVirtualization=oracle was not met
```

# 原因
VirtualBox 5.0 で準仮想化の規定値が KVM になり、systemd が検出する仮想化の値が `kvm` に変わってしまい、期待している `oracle` が返ってこなくて起動しません。

```shell-session
# systemd-detect-virt
kvm
```

# とりあえずの解決方法
以下どちらかで解決しますがパフォーマンスは KVM の方がよさそうなので、私はunitファイルを編集して対応しました。

## 準仮想化インターフェースを Legacy にする
仮想マシンの設定で準仮想化インターフェースで `Legacy` を選択すれば、systemd が検出する値が `oracle` になりますので、vboxservice.service が起動できるようになります。

`設定 / システム / アクセラレーション / 準仮想化インターフェース` で `Legacy`を選択します。

```shell-session
# systemd-detect-virt
oracle
```

## unitファイルを編集する
unitファイルの `ConditonVirtualization` の値を `kvm` に変更します。

```
[Unit]
ConditionVirtualization=kvm
```

# 本来の解決方法
systemd が VirtualBox を kvm として認識するのが間違いのようで、準仮想化インターフェースの設定に関係なく oracle となるのが正しいようです。

2015-07-22 に [archlinux のバグレポート](https://bugs.archlinux.org/task/45738)に同じ問題があって、そのときには systemd 223 で修正することになり、実際に修正されたようです。

その後仮想化の検出方法に変更があって v228 では同じ問題が発生しているようです。
2015-11-24 に [VirtualBox を oracle として認識するための修正](https://github.com/systemd/systemd/commit/f6875b0a630cdcc6bb312f130ae92fc8becfb231)がされたので、今後のリリースで解決するだろうと思います。

# 参考
- [systemdで既存のunitを編集する2つの方法](http://qiita.com/nvsofts/items/529e422bb8a326401c39)
- [FS#45738 - [virtualbox] vboxservice not started by systemd when using KVM paravirtualization](https://bugs.archlinux.org/task/45738)
- https://github.com/systemd/systemd/commits/master/src/basic/virt.c
- https://github.com/systemd/systemd/commit/f6875b0a630cdcc6bb312f130ae92fc8becfb231
SlimでControllerを用いてルーティングする

#追記
結局言いたいことはcallableの仕組みを用いれば別にslimでcontrollerが使えないなんてことはなかった。ということ。
また、Slim3.0リリースされているので、PHP5.5以上ならこの方法はあまり使ってほしくなかったり。

#環境
PHP5.4以上　Slim 2.6.1での検証

#経緯
Slimのルーティングは読み書きしやすいけれどどうしても長くなってしまう。
そういうことでControllerを使おうとしたが、こういう記事があって諦めかけていた。

[Slim が Class controllers 対応してた](http://uzulla.hateblo.jp/entry/2014/01/11/040335)

```php
$app->get('/', '\My\Controller\Page:showIndex');
```

なるほどなるほど。でもこの方式だと静的メソッドかデフォルトコンストラクタ以外で行えそうにはない。
で。

これって単なるcallableってだけじゃ・・・ないかな？　と調べたら案の定でした。

```php:slim\Slim\Route.php
//Routeを実際に動かして正常処理したかどうかを返す
public function dispatch()
{
    /*略*/
    $return = call_user_func_array($this->getCallable(), array_values($this->getParams()));
    return ($return === false) ? false : true;
}
```

ということはis_callable()でtrue返してもらえるなら動く、かも。

```php:slim\Slim\Route.php

/**
 * @var mixed The route callable
 */
//というか実質callable|nullっぽい
protected $callable;
//Setterは型チェック ＋ class Controller 実装ぐらい。
public function setCallable($callable)
{
    /* (略) */
    if (!is_callable($callable)) {
        throw new \InvalidArgumentException('Route callable must be callable');
    }

    $this->callable = $callable;
}
//Getterに至っては一切手を加えない。
public function getCallable()
{
    return $this->callable;
}
```
普通のcallableならばふつーに動く。となればcallableの仕様を調べればあるいは。

##答えはcallableであった。

[PHPマニュアル: callable](http://php.net/manual/ja/language.types.callable.php)

```php:コールバック関数の例
// タイプ 3: オブジェクトメソッドのコール
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));
```

なるほど、array[0]がオブジェクト変数で、array[1]がメソッド名。
これならコンストラクタを定義していても普通に呼び出せますね。

というわけでPHP5.4なら大体のケースはこれでなんとかなるのではと思います。

```php:Application.php
class Application
{
    /** @var \PDO */
    private $pdo;
    /** @var \slim\Slim */
    private $app;

    /* コンストラクタとか略 */
    
    private function routing() {
        $app = $this->app;
        $pdo = $this->pdo;
        $ctrl = new \test\Models\Controller($app, $pdo);
        /* $ctrl->showNotFound() */
        $app->notFound([ $ctrl, 'showNotFound' ]);
        /* $ctrl->showIndexPage() */
        $app->get('/', [ $ctrl, 'showIndexPage' ]);
        /* $ctrl->login() */
        $app->get('/login', [ $ctrl, 'login' ]);
        /* $ctrl->logout() */
        $app->get('/logout', [ $ctrl, 'logout' ]);
        /* (略) */
    }
}
```

このコードを晒すためだけにQiita初記事を書いてみた。
他の方が参考になれば幸いです。
SwiftでTimer処理


NSTimer.scheduledTimerWithTimeIntervalを使います

```swift:
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "onTimer:", userInfo: nil, repeats: true)

func onTImer(sender:NSTimer) {
	print("on timer")
}
```

タイマーのハンドラに何か値を渡したい場合はuserInfoを使用します

```swift:
NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "onTimer:", userInfo: "Hello", repeats: true)

func onTImer(sender:NSTimer) {
	print("\(sender.userInfo as! String)")
}
```
シングルファイル C/C++ ライブラリが便利すぎてやばい

漢は黙ってシングルファイル C/C++ ライブラリですね!

シングルファイル C/C++ ライブラリとは, ヘッダファイル .h ひとつだけで機能が実装されているライブラリ(もう少し条件をゆるくして .cc も含む)のことです. header-only とも言われれたりします.

このあたりの元祖は nothings 先生 http://nothings.org/ ですね. 最近は github にコードをあげています. 

https://github.com/nothings/stb 

シングルファイル系のライブラリまとめ一覧もあります.

https://github.com/nothings/stb/blob/master/docs/other_libs.md

シングルファイル系が便利すぎてやばいので, 自分でもいくつか作りました.

* TinyObjloader(Wavefront .obj loader) https://github.com/syoyo/tinyobjloader
* TinyEXR(OpenEXR loader/saver) https://github.com/syoyo/tinyexr
* NanoRT(ray tracer) https://github.com/lighttransport/nanort
* ESON(Schema-less binary serialize/deserialize) https://github.com/syoyo/eson
* TinyGLTF https://github.com/syoyo/tinygltf

特に, TinyObjLoader は昨今のモバイル 3D ゲームや 3D プリント人気にあやかり(?) cocos2d-x に使われていたりと自分史上最も github でスター数が多いライブラリになっています. ありがとうございます. 

 
## なぜシングルファイルか

昨今は多様な OS(Windows, Linux, Mac, iOS/Android, Solaris, etc)や, 多様なデバイス(x86, ARM, MIPS, SPARC, etc)でアプリを動かす必要性が出てきたり, node.js などでちょっと処理が重い部分を C/C++ でネイティブ化したり, アイデアをぱぱっと実装したり, 簡単なデータコンバータを作りたいなどの要求が多く出てきています.

そのような状況では, シングルファイル系に大きな利点があります.

* コンパイルが簡単(configure とかしなくてよい). Makefile などにファイルを追加するだけで使える. 
* ライブラリ間の依存関係が無い
  * boost に依存していてまず boost をビルドするところから... という問題が無い.  
  * ライブラリ依存関係が無い(もしくは最低限)のため, ライブラリ間の依存関係でバージョン違いなどのビルドエラー, リンクエラーという問題も無い
  * システムにインストールされているライブラリと干渉しない.
* 組み込んで扱いやすいライセンス(BSD, MIT, public domain, etc)

## シングルヘッダベストテン

https://github.com/nothings/stb/blob/master/docs/other_libs.md まとめ一覧をふくめ, 独断で俺得なシングルファイル系ライブラリのおすすめ top 10 を選んでみました. 

1. STB image(画像ローダ)
2. STB image write(画像セーバ)
3. STB image resize(画像リサイズ)
4. Duktape(JavaScript interpreter) http://duktape.org/
5. TinyObjLoader(wavefront .obj loader)
6. HappyHTTP(http client)
7. PicoJSON(JSON parser)
8. easywsclient(WebSocket client) https://github.com/dhbaird/easywsclient
9. MicroProfile(Profiling) https://github.com/zeux/microprofile
10. NanoVG/NanoSVG(ベクターグラフィックス)

## ほしいもの

まだ未開拓な領域. これを実装したらヒーローになれます!

* YAML parser
* http/2 server/client(BSD or MIT license)
  * => きたかも!? > https://github.com/yhirose/cpp-httplib
  
## ヘッダーオンリー

1 ヘッダファイルではありませんが, 複数ヘッダファイルでも素晴らしいものがあります.

* tiny-dnn(Deep learning library) https://github.com/tiny-dnn/tiny-dnn

## まとめ

github によるソーシャルコーディングのムーブメントもあって, 各種シングルファイル系の流行りが出てきている予感あります(機能が制限されているので, プルリクやバグレポもやりやすい).

そして..., シングルファイル C/C++ ライブラリはたのしい! :tada:

## TODO

* もう少ししっくりくる名称は無いかな?
[SensorTag] Texas Instruments の CC2650 SensorTag を試す

### はじめに

#### CC2650とは

簡単に言うと、センサーの塊で10種類の情報を取得できます :musical_note: :blush: 

- 光
- デジタル・マイク
- 磁気センサ
- 湿度
- 圧力
- 加速度計
- ジャイロスコープ
- 磁力計
- 物体の温度
- 周囲温度

#### 経緯

センサーに囲まれたい :flushed: 楽しそう :yum: 

### 購入

[マクニカオンラインストア](https://store.macnica.co.jp/products/texas-instruments_cc2650stk)で購入しました :notes: 

### ファームウェアのアップデート

[Texas Instruments のiOSアプリ](https://itunes.apple.com/jp/app/ti-sensortag/id552918064)より
SensorTag のファームウェアを最新化しました :stuck_out_tongue_closed_eyes: 

### iPhoneで動作確認

前述のアプリを使うと、簡単に SensorTag から情報が取得できます :sunglasses: 

![screen568x568.jpeg](https://qiita-image-store.s3.amazonaws.com/0/9760/e23f4f85-c35d-7b15-5805-00a889a6a437.jpeg)

### Macで動作確認

javascript で動かしたかったので、
npm のパッケージ [sensortag](https://www.npmjs.com/package/sensortag) を利用してみました。

初期化

```sh
$ npm init -y
```

依存パッケージの追加

```sh
$ npm install async sensortag --save
```

テストプログラムの実行

```sh
$ node ./node_modules/sensortag/test.js
```

とりあえず動いた

```sh
discovered: {"id":"XXXXXXXXXXXXXXXXXXXXXXXXXXX","type":"cc2650"}
connectAndSetUp
readDeviceName
	device name = undefined
readSystemId
	system id = XX:XX:XX:XX:XX:XX:XX:XX
readSerialNumber
	serial number = N.A.
readFirmwareRevision
	firmware revision = 1.20 (Jul 28 2015)
readHardwareRevision
	hardware revision = PCB 1.2/1.3
readSoftwareRevision
	software revision = PCB 1.2/1.3
readManufacturerName
	manufacturer name = Texas Instruments
enableIrTemperature
readIrTemperature
	object temperature = 7.7 °C
	ambient temperature = 14.9 °C
disableIrTemperature
enableAccelerometer
readAccelerometer
	x = 0 G
	y = 0 G
	z = 0.2 G
disableAccelerometer
enableHumidity
readHumidity
	temperature = 14.9 °C
	humidity = 73.6 %
disableHumidity
enableMagnetometer
readMagnetometer
	x = 35.4 μT
	y = 1 μT
	z = 100.5 μT
disableMagnetometer
enableBarometricPressure
readBarometricPressure
	pressure = 1019.8 mBar
disableBarometricPressure
enableGyroscope
readGyroscope
	x = -1.4 °/s
	y = -0.1 °/s
	z = 2.8 °/s
disableGyroscope
readIoData
	data = 127
writeIoData
readIoConfig
	config = 0
writeIoConfig
enableLuxometer
readLuxometer
	lux = 335.5
disableLuxometer
readSimpleRead - waiting for button press ...
left: false
right: true
reed relay: false
left: false
right: false
reed relay: false
disconnect
disconnected!
```

### 所感

- 片手で持ち運べるほど小さい :satisfied: 
- 簡単に情報を取得できる :heart_eyes:
UITableView上に可変するUITextViewを作る

記事の内容はこちらを参照してください。
https://mishimay.github.io/619f9ce60b4fabc1612f/
<!--

# やりたいこと

こういうのを作る。
![c.gif](https://qiita-image-store.s3.amazonaws.com/0/23679/dd28d0a6-7cd5-2f50-5801-d221adb8b522.gif)

# 方法

1. Storyboard上でtableViewのcellにtextViewを配置
1. textViewに Auto Layout の制約を設定
  - textViewの上下左右のスペースに対して制約を設ける
    ![Screen Shot 2015-11-28 at 11.16.16 AM.png](https://qiita-image-store.s3.amazonaws.com/0/23679/d20ec530-e825-e00f-cf6d-0313b2b88cb6.png)

1. textViewのプロパティ `Scrolling Enabled` のチェックを外す
  ![Screen Shot 2015-11-28 at 11.16.16 AM 2.png](https://qiita-image-store.s3.amazonaws.com/0/23679/ac8ef689-d2a1-0017-da59-d62da2f567b2.png)

1. textViewが自動でcellの高さを調整するように設定

    ```swift
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 10000
        
        // ~~~
    }
    ```
  **<font color=red>ここで注意!</font>**
  `estimatedRowHeight` を十分大きな値にしておかないと、textViewのサイズが画面を超えた状態でテキスト入力した際にスクロールが上下にバインバインと意図しない動きする。

1. テキストが入力される度にtextViewの高さを調整
  - tableViewの `beginUpdates()` と `endUpdates()` でcellが更新される
  
    ```swift
    // MARK: - TextViewDelegate

    func textViewDidChange(textView: UITextView) {
        tableView.beginUpdates()
        tableView.endUpdates()
    }
    ```



# 環境
Xcode 7.1
Swift 2.1
iOS 8以上で確認

# 参考
http://www.howlin-interactive.com/2013/01/creating-a-self-sizing-uitextview-within-a-uitableviewcell-in-ios-6/
http://stackoverflow.com/questions/29314535/uitableview-beginupdate-endupdate-causing-scroll-to-top


-->
ドク君とリンちゃんのDQLと仲良くなる方法【その2】

# ご挨拶
おっすオラ「ドク」、ワ・タ・シは「リン」で～～す！！
二人合わせてドクとリン！！(キメ)。。。。。。
本題いきますか。。W

今日は有用かどうかは別として、ちょっとしたTipsです。

## resetDQLPartがありならgetDQLPartもあるだろう
そう！！あるんです。
### getDQLPart
前回に引き続きまたもやこんなソースがあったとします
``
            レポジトリのメソッド内
            $qb = $this->createQueryBuilder('p');
            $qb->innerJoin('p.ProductClasses', 'pc');
            return $qb->groupBy('p');
``
``
            またまた別のレポジトリのメソッド内
            $qb = $this->createQueryBuilder('c');
            $qb->where('status', :Status);
            $qb->setParameter('Status', なにかの::定数);
            return $qb->groupBy('p');
``

上記の様なバラバラに返却されてくるQueryBuilderを共通化しているメソッドでselect条件を書き換えてゴニョゴニョしたいって時に以下な感じとなります
``
            共通メソッド内/なんとなくカウントがしてみたくなったケース
            $select = $qb->getDQLPart('select')[0]->getPart[0];←ここ、セレクトカラム一件前提
            $qb->select('count ('.$select.')');→セレクト上書き、$selectの中は文字列(o か c)
            $total = $qb->getQuery()->getSingleScalarResult();
``
って感じで動的に、DQLを組み直す事ができちゃいます！
ただ取得されるのはselect->('ここに書いた文字列')なので、複数カラムや
alias、集計関数など仕様してる際は、美しくないけどもreplaceなぞで工夫してください。
一回var_dumpなどで取得値を確認しようね！

あとメソッド結果の直接添字は古いPHPさんが ふぁっ!?? ってなるので、
よい子のみんなは真似しないように！

あとなんか、イィっ！！ってネタがあったんですが、忘れたので別の機会に。。

### 補足
whereでもjoinでもなんでもいける感じです

## おまけ
### Doctrineの概要について以下の概要がステキすぎる件
この内容がDoctrineの概要をさらっと書いているのですがステキすぎます!!本当に秀逸です！！
みなさま一度ご覧ください

[またもや無断リンクすんません。。](http://ja.stackoverflow.com/questions/3104/symfony%E3%81%A7persist%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AB%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%A6%E6%97%A2%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8Bentity%E3%81%8B%E5%90%A6%E3%81%8B%E3%82%92%E5%88%A4%E6%96%AD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8B)

次回は「ツウィギーなアイツ!!【EC-CUBE3編】」の予定
MacでISOファイルからインストールUSBを作成する（俺用メモ）

#準備する物
* USBメモリ
* ダウンロードしてきたisoファイル

#.isoファイルを.dmgファイルへコンバート
* hdiutil convert -format UDRW -o {コンバートしたファイルの出力先} {ダウンロードしてきたisoファイルの配置場所}

###例)
hdiutil convert -format UDRW -o /Users/testuser/Desktop/iso/CentOS-6.7-x86_64-minimal.img /Users/testuser/Desktop/iso/CentOS-6.7-x86_64-minimal.iso

#USBを初期化
* [アプリケーション]-[ユーティリティ]-[ディスクユーティリティ]開く
* 対象のUSBを選択
* 消去タブをクリック
* フォーマット形式を選択し、消去をクリック

#USBのデバイスファイル名確認
* diskutil list

#アンマウント
* diskutil unmountDisk /dev/disk{確認した数字}
* 成功すると、「Unmount of all volumes on disk2 was successful」と表示

#USB書き込み
* sudo dd if={コンバートしたdmgファイルパス} of=/dev/disk{確認した数字} bs=1m

#終了したらejectしてUSBを取り出す
* diskutil eject /dev/disk2
VirtualBoxのゲストOS上のDockerでElasticsearch,Kibana環境を立ててホストOSからアクセスできるようにする

# はじめに
Elasticsearch、Kibanaを手軽に試してみたくて、Docker使ってみました。
※なおDockerは初心者です

#環境
* ホストOS：Mac OSX
* ゲストOS：CentOS 6.7
    * NAT(DHCP)
    * Host Onlyアダプター(192.168.56.101)　※IPは自分の環境に読み替えてください

# Dockerのインストール
下記を参考しにてEPELからインストールしました。
http://qiita.com/zwirky/items/991f61a231f4e198a320

# Elasticsearch,Kibanaのimageをダウンロード
```
# docker pull elasticsearch
# docker pull kibana
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
kibana              latest              80ea040e8e9f        3 days ago          259.9 MB
elasticsearch       latest              df78b0304a95        3 days ago          345.7 MB
```

# コンテナ立ち上げ

```elasticsearch2.1.0
# docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch
```

```kibana4.3.0
# docker run -d --name kibana4 --link elasticsearch:es -e ELASTICSEARCH_URL=http://es:9200 -p 5601:5601 kibana
```

```
# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                            NAMES
d9513e1b2d71        kibana              "/docker-entrypoint.   3 seconds ago       Up 2 seconds        0.0.0.0:5601->5601/tcp                           kibana4             
8a7d3487cd05        elasticsearch       "/docker-entrypoint.   11 seconds ago      Up 10 seconds       0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   elasticsearch
```

~~以前は、-p 0.0.0.0:9200:9200と指定しなくても自動で0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcpとなってた気がするが、なぜか明示的に指定しないとならなかった。。~~
勘違いしてました。
exposeされてると外部に公開されてるといつの間にか誤って認識してたようです。。
exposeでdocker0に公開され、run時のpオプションでホスト側ポートとexposeしたポートを紐付けてるんですね。

# ブラウザから確認
これで、ホストOSのブラウザからhttp://192.168.56.101:5601/ にアクセスするとKibanaの画面が開けます。
Elasticsearchも開放してるので、ホストOSからAPIでデータ登録したり取得できます。
スマホからプライベートなサーバに接続したい

# 前提
- APIのテスト用サーバがEC2に立っている
    - テスト用サーバなので一般公開したくない
    - 固定IPがない
    - DNSも設定してない
    - とりあえずSSHは可能

固定IPがあるのであれば，そのIPからのHTTP/HTTPSアクセスを許可すれば用は足りるので終了．
PC(Mac)からのアクセスであれば，SSHのポートフォワードで何とかなります[^1]．が，スマホ(とりあえずiPhone)からだと難しそうです．

というわけで，iPhoneからPC経由でテスト用サーバにアクセスする方法を探してみました．

# 方針
- Mac経由でアクセスするんだからリバースプロキシ立てられれば良い気がする
- IPでのアクセスだとダルいし適当な名前でアクセスしたい

# 設定

## hosts
```
127.0.0.1  api-test.hoge.com
```

## SSH
ローカルポートフォワードして，`localhost:8080`でAPIサーバへアクセスできるようにしておきます．

```bash
ssh -L8080:localhost:80 ec2-user@xxx.xxx.xxx.xxx
```

## リバースプロキシ

`/etc/apache2/other/`以下に設定を作成すると勝手に読んでくれます．

```conf:/etc/apache2/other/dev.conf
ProxyPass / http://api-test.hoge.com:8080/
ProxyPassReverse / http://api-test.hoge.com:8080/
```
あとは

```bash
sudo apachectl restart
```

この時点で，同一ネットワークに存在する他のマシンから `http://<<MacのIP>>` でアクセスできるようになります．

## 名前解決

MacのIPを10.0.1.116とします．

リバースプロキシが動いているMac上では api-test.hoge.com -> 127.0.0.1 に解決されれば良いですが，他のマシンにおいては api-test.hoge.com -> 10.0.1.116 と解決されてほしいです．

そこで，dnsmasqを使います．(homebrewでインストールされたものとする)

```conf:/usr/local/etc/dnsmasq.conf
address=/hoge.com/10.0.1.116
no-hosts
```

`no-hosts`の設定を入れないと`/etc/hosts`を見てしまうようです．

Mac上で確認

```shell-session
uraura@L-03-001$ dig @localhost api-test.hoge.com
; <<>> DiG 9.8.3-P1 <<>> @localhost api-test.hoge.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28564
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;api-test.hoge.com.             IN      A

;; ANSWER SECTION:
api-test.hoge.com.      0       IN      A       10.0.1.116

;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Nov 28 10:18:24 2015
;; MSG SIZE  rcvd: 51
```

別のマシンから確認

```shell-session
uraura@rosemary$ dig @10.0.1.116 api-test.hoge.com
; <<>> DiG 9.8.3-P1 <<>> @10.0.1.116 api-test.hoge.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22754
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;api-test.hoge.com.             IN      A

;; ANSWER SECTION:
api-test.hoge.com.      0       IN      A       10.0.1.116

;; Query time: 24 msec
;; SERVER: 10.0.1.116#53(10.0.1.116)
;; WHEN: Sat Nov 28 10:21:10 2015
;; MSG SIZE  rcvd: 51
```

これで同一ネットワーク上のiPhoneからでもapi-test.hoge.comでアクセス可能になってるはずです．

## iPhoneから接続

iPhoneのブラウザから http://api-test.hoge.com へアクセスしてみます．

<img width="414" alt="IMG_0179_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/18974/ac6894d7-c8f9-ab04-3a8a-f7dedc6e71ca.png">

(´・ω・｀)

ネームサーバの指定を忘れてました．というわけで，Wifiの設定からDNSの設定を追加

<img width="414" alt="IMG_0180_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/18974/94a35ff4-f249-7842-12a4-1e7fe2ecb4d7.png">

ｷﾀ━━ﾟ+.ヽ(≧▽≦)ﾉ.+ﾟ━━ ｯ !!! 
<img width="414" alt="IMG_0181_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/18974/d69ba1e0-3374-2d43-aa8d-07375ad3d6c4.png">

---

[^1]: ただし，以下の追加設定が必要
 
 - ローカルポートフォワードの場合はポート番号が余計に必要になる
 - ダイナミックポートフォワードの場合はsocksプロキシの設定が必要になる
Vim エラー [Illegal starting char in line]　対処方法

#Vimでエラー Illegal starting char in lineが出た時
（ほとんど自分用メモ　要確認事項多し　自己責任で）
vimを起動させるたびに以下のようなエラーが

>E575: viminfo: Illegal starting char in line:[ファイルパス]
>E575: viminfo: Illegal starting char in line: ^I"^I21^I36（エラー部）
>Press ENTER or type command to continue

全く違うファイルをいじろうとする時にも毎回出るようになってしまった・・

viminfoファイルの故障で生じる模様。
viminfoファイル自体は自動生産されるため削除しても問題ないらしい
念のためにバックアップを取ってから消して正常動作するか確認していきます

##Vim info ファイルについて
過去に編集した履歴を残してるらしく
上記のエラーもしっかりログを残していてるから生じるみたい？

場所：$HOME / .viminfo
※ echo ＄HOME で＄HOMEがどこを指してるか確認できる！
※＄HOMEは大文字で！小文字だと反応しない場合もあります
iMac [EL Capitan 10.11.1]だと /Users/hoge

###viminfoファイルを操作
####バックアップを残す
>cp $HOME/.viminfo .viminfo_backup
（rm $HOMEを打った後にtabキーを押すと＄HOMEが展開される！）
もちろん、バックアップファイル名や置き場は自由にどうぞ

####.viminfoを削除
>rm $HOME/.viminfo

####Vimがエラーを吐かなくなったか確認
>vim
エラーが出なくなったら完了です！
Visual Studio Codeの中華フォントを変更する

Visual Studio Codeの使い勝手はいいんだけど、入力中のテキストボックスや、
Tree-View、上のタブっぽいところ等々、中華フォントが混ざってて嫌だ・・・。

ということで、CSSを直接書き換えることにしました。
   
### 対象ファイル：
```
{インストール先}\resources\app\out\vs\workbench\workbench.main.css
```

デフォルトのインストール先だと、C:\Program Files (x86)直下

```
C:\Program Files (x86)\Microsoft VS Code\resources\app\out\vs\workbench\workbench.main.css
```


## 0.10.5以前

### 1. 以下のキーワードでworkbench.main.cssを検索

monaco-shell{height:100%;width:100%;color:#6C6C6C;

検索後、
一番最初に出てきたfont-familyの中身を削除し、好きなフォントに書き換え

### 2. workbench.main.cssの一番最後の行に以下を追記
```css
.monaco-editor.ime-input .inputarea {
	font-family: "好きなフォント";
}
```


## 0.10.6以降

### 1.以下のキーワードでworkbench.main.cssを検索し、好きなフォントに置き換え

検索ワード：

```
Segoe UI",SFUIText-Regular,HelveticaNeue,sans-serif,"Droid Sans Fallback
```

置換後：

```
好きなフォント
```

### 2. workbench.main.cssの一番最後の行に以下を追記

```css
.monaco-editor.ime-input .monaco-shell input {
	font-family: "好きなフォント";
}
.monaco-editor.ime-input .inputarea {
	font-family: "好きなフォント";
}
```

## 0.10.8以降

### 1.以下のキーワードでworkbench.main.cssを検索し、好きなフォントに置き換え

検索ワード：

```
Segoe UI Semibold,Segoe UI,SFUIText-Light,HelveticaNeue-Light,sans-serif;
```

置換後：

```
好きなフォント
```

### 2.以下のキーワードでworkbench.main.cssを検索し、好きなフォントに置き換え

検索ワード：

```
Segoe UI,SFUIText-Light,HelveticaNeue-Light,sans-serif
```

置換後：

```
好きなフォント
```


### 3. workbench.main.cssの一番最後の行に以下を追記

```css
.monaco-editor.ime-input .monaco-shell input {
	font-family: "好きなフォント";
}
.monaco-editor.ime-input .inputarea {
	font-family: "好きなフォント";
}
```



* 変更前
![20151126064544.png](https://qiita-image-store.s3.amazonaws.com/0/93122/7dcb579d-6de7-bc25-b34f-cd7d75dacf61.png)




* 変更後（Ricty Diminishedに変わっている！）
![20151126064554.png](https://qiita-image-store.s3.amazonaws.com/0/93122/a76b7262-5b9e-1782-2da2-de26768011fc.png)






### 直接ファイルを書き換えるのが面倒な場合向け

#### 書き換え用のテンプレートファイルをGistに置いときました。


* 0.10.5まで
[rinne-grid/workbench.main.css](https://gist.github.com/rinne-grid/24c319e3ea25c269564b#file-workbench-main-css)


* 0.10.6
[【0.10.6】rinne-grid/workbench.main.css](https://gist.github.com/rinne-grid/50670b53b81eadf0851f)

* 0.10.8以降
[【0.10.8以降】rinne-grid/workbench.main.css](https://gist.github.com/rinne-grid/189a19029280b1776d86)


1. リンク先のCSS(workbench.main.css)をダウンロード
2. {{YOUR SETTING FONT}}で検索して、該当する2箇所を好きなフォント名に置き換え
3. 保存してVisual Studio Codeを起動

これでおそらく中華フォントとさよならできます。((エディタ部分のフォントについては、
settings.jsonのeditor.fontFamilyの値を変更。))

* 以下のフォントが中華フォントではなく、指定のフォントになります
    * Tree-View
    * 上部のタブっぽいエリア
    * 入力中のテキストボックス（IME?）のフォント



自分用に適当に追記したので、何らかの問題があるかもしれません。
もし利用される場合にはご注意ください。

なお、Visual Studio Codeのアップデート（マイナーバージョン等）が実施された場合は、
改めてworkbench.main.cssファイルを置き換える必要があります。


```
* 2015/12/21 デフォルトのインストール先が誤っていたので訂正
* 2015/12/27 0.10.6以降のバージョン用にテンプレートと手順を追加
* 2016/02/28 nekko1119さんのご報告内容を反映（0.10.8で置換するフォントが変更となった）
```
ローカルのElasticsearchをポート指定で起動する方法



## 忙しい人のために
指定したいポート番号を9250とすると

```sh
> elasticsearch --http.port=9250
```

でOK


## 以下経緯など

developmentとtest環境でelasticsearchを起動仕様とした場合に単純に以下のようにしてしも9250番ポートで起動してくれない

```
#NG
> elasticsearch -p 9250
#NG
> elasticsearch --port 9250
```

ヘルプを確認すると以下のように、 --propと言うのがプロパティ設定のようだ

```
> elasticsearch -h
Usage: /usr/local/bin/elasticsearch [-vdh] [-p pidfile] [-D prop] [-X prop]
Start elasticsearch.
    -d            daemonize (run in background)
    -p pidfile    write PID to <pidfile>
    -h
    --help        print command line options
    -v            print elasticsearch version, then exit
    -D prop       set JAVA system property
    -X prop       set non-standard JAVA system property
   --prop=val
   --prop val     set elasticsearch property (i.e. -Des.<prop>=<val>)
```

```
> set elasticsearch property (i.e. -Des.<prop>=<val>)
```

ドキュメントのポート指定方法を確認するとportのプロパティ名はhttp.prop
https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-http.html

なので以下のように9250ポートで起動する例は以下のようになる

```sh
# OK
> elasticsearch --http.port=9250
```
Ajaxを使ったlink_toでapplication.jsを読み込み終わる前にクリックされるのを防ぐ


## 前提条件
* Rails 4.2
* javascriptファイルをapplication.jsに結合していること
* レイアウトファイルの最後にjavascriptを設置していること

## RailsアプリケーションでロードするHTMLファイルの一番下にjavascriptファイルを置く弊害
* Railsの場合基本値にapplication.jsにjavascriptファイルまとめる
* javascriptのローディングで画面表示が遅れないように、application.jsファイルはHTMLの下方に置くことが定番

しかし、javascriptを下方に置くことによる弊害として、以下のようにLink_toを用いてAjax通信をしてHTML内を更新するような処理をする場合に問題がある

```
link_to "Ajaxリンクだよ", リンク先_path, remote: true
```

javascriptのローディングが完了する前にリンクをクリックしてしまうと普通のHTTP GETの通信が発生してしまい、'ActionView::MissingTemplate(テンプレートファイルが無いよ)エラー'が発生する

通信速度が遅い人が対象リンクをマッハでクリックしたり、javascriptの実行をOFFにしている(なぜかたまにいる)場合でエラーが発生してしまうのを防がなければならない


## 提案手法

この問題を解決するために
**javascriptファイルのローディングが終わるまでリンク要素を非表示にする方法**
を提案する

もっと良い第二第三の手法があればぜひご教授願いたい

## javascriptファイルのローディングが終わるまでリンク要素を非表示にする方法

この方式は以下の流れとなる

1. Ajax対象のリンクにjs-loading-hiddenクラスをつける
2. そのクラスはdislplay :noneにしておき非表示にする
3. JSファイルがローディング完了したら、js-loading-hiddenクラスの付いているDOM要素全てに対象js-loading-hiddenクラスを取り除き、クリック可能にする


```slim
link_to "Ajaxリンクだよ", リンク先_path, remote: ture, class: "js-loading-hidden"
```

```sass
.js-loading-hidden
  display: none
```

※サンプルコードはjQueryを使っているが他jsのフレームワークでも同様のことはできるであろう

```js
// JSファイルをロードし終わったら ロード待ちのリンクを表示する
$(function() {
  $(".js-loading-hidden").removeClass("js-loading-hidden");
});
```

### メリット・デメリット
####メリット
view(slimやerb)ファイルでクラスを一つ足すだけで実装可能になり、コード量が少なく済む

####デメリット
javascriptファイルのローディング完了まで対象領域が表示されない。リンクの領域が大きい場合、1タイミング遅れてその領域が表示されるのでユーザに違和感を与える
enum 使い方

enumの使い方を確認する。
列挙型と呼ばれていて使い方がいまいちピンとこなかったが
関連する値をまとめられるものと理解した。

信号機の状態を表すと　青　黄　赤　がある。
これらは信号機の状態という意味で関連しているので
このようにまとめられる。

```
enum Signal:String{
    case red
    case yellow
    case green
    
}

print( Signal.red )    // red 


```

Signal.red の値は　redとなるが値をもたせて扱いたい場合はこのように書く


```
enum Signal:String{
    case red = "1"
    case yellow
    case green
    
}

print(Signal.red.rawValue) //1
```

状態を参照してそれぞれのケースで処理したい時は
```
var i = Signal.red

switch (i) {
    
case .red :
    print("とまれ")
case .yellow:
     print("注意")
default:
     print("0")
}

//とまれ
```

enumに関数を定義して書くこともできる

```
enum Signal:String{
    case red = "1"
    case yellow
    case green
    
    
    func action()->String{
    
        switch(self){
        
        case .red:
           return "とまれ"
        case .yellow:
            return "注意"
        default:
            return "0"
        }
    
    }
    
}

Signal.red.action() //とまれ
```


一旦動きは確認できた。


＊間違いや便利な使い方があればご指摘下さい
技術英語 > but [in the short perspective] I think it’s quite a good solution. / in the near future / in the foreseeable future

@ LOE > June 22, 2012

http://loe.org/shows/shows.html?programID=12-P13-00025
>  but <font color=red>in the short perspective</font> I think it’s quite a good solution.

<hr>

関連して思い出したのは

in the near future
http://ejje.weblio.jp/content/in+the+near+future

<hr>
関連して思い出したのは

in the foreseeable future
http://ejje.weblio.jp/content/in+the+foreseeable+future
高速なgrep代替ツールhighwayのCentOS 7用rpmを作りました

highwayの説明は[highway という高速検索ツールを作りました · けんごのお屋敷](http://tkengo.github.io/blog/2015/10/19/release-highway/)をご参照ください。

CentOS6用rpmは提供されているのですが、CentOS7用は提供されていなかったので作りました。

## highwayのrpmをインストールする手順

```shell-session
sudo curl -sL -o /etc/yum.repos.d/hnakamur-highway.repo https://copr.fedoraproject.org/coprs/hnakamur/highway/repo/epel-7/hnakamur-highway-epel-7.repo
sudo yum install highway
```

これで `/usr/bin/hw` というファイルがインストールされますので、 `hw` で使えます。

## (ご参考) どうやってrpmをビルドしたか

githubの[hnakamur/highway-centos7-rpm](https://github.com/hnakamur/highway-centos7-rpm)にrpmのspecファイルを置いています。Travis CIでdockerを使ってsrpmをビルドし、[fedora copr](https://copr.fedoraproject.org/coprs/)のサービスを利用してrpmのビルドを行いました。

[hnakamur/highway Copr](https://copr.fedoraproject.org/coprs/hnakamur/highway/)というプロジェクトを作成して、ここでrpmを配布しています。

上記のビルド手法については[Travis CIとcopr.fedoraproject.orgを使ってrpmをビルド・配布するのを試してみた · hnakamur's blog at github](https://hnakamur.github.io/blog/2015/11/26/use_travis_and_copr_to_build_and_host_rpm/)をご参照ください。
テンプレートパラメータによって引数の型を変えるテンプレート関数



戻り値の形をテンプレートパラメータで変えるのは[こないだ](http://qiita.com/chikashimiyama/items/4f022839d771b3bae535)やったので、今度は引数の形を変えてみる。

```
#include <iostream>
#include <string>
using namespace std;
enum class Type{
    MEMORY_SIZE,
    IP_ADDRESS
};

template <Type type>
struct Test_Traits{}; // empty class

template<>
struct Test_Traits<Type::MEMORY_SIZE>{
    typedef unsigned int type;
};


template<>
struct Test_Traits<Type::IP_ADDRESS>{
    typedef string type;
};

template <Type type>
void printParameter(typename Test_Traits<type>::type t){
        cout << t << endl;
    
}

int main(){
    printParameter<Type::MEMORY_SIZE>(300);
    printParameter<Type::IP_ADDRESS>("192.168.0.2");
    // printParameter<Type::MEMORY_SIZE>("192.168.0.2"); error
    return 0;
}
```

あ、普通にできるね。
Go言語のWALKをWindows PEで動くようにする

# 結論

2015年11月28日現在、依存関係にあるgithub.com/lxn/winのopengl32.goとpdh.goを削除した上で、GOPATH上でgo buildすればWALKのサンプルアプリの動作を確認できました。

# 手順

WALKをインストール済みかどうかで使えるようになる手順が異なります。

## 共通

1. [Goをインストール](http://golang-jp.org/doc/install)
2. ユーザー環境変数GOPATHに「%USERPROFILE%\.go」を設定

## WALKをインストールしていない場合

1. フォーク版の依存ライブラリをインストール
`git clone https://github.com/takumin/win.git %GOPATH%\src\github.com\lxn\win`

2. WALKをインストール
`go get github.com/lxn/walk`

3. [サンプルアプリ](https://github.com/lxn/walk#using-walk)で動作確認

## WALKをインストールしてある場合

1. 一旦依存ライブラリを削除
`rd /s /q %GOPATH%\src\github.com\lxn\win`

2. フォーク版の依存ライブラリをインストール
`git clone https://github.com/takumin/win.git %GOPATH%\src\github.com\lxn\win`

3. WALKをインストール
`go get github.com/lxn/walk`

4. [サンプルアプリ](https://github.com/lxn/walk#using-walk)で動作確認

# 動作確認

![WinPE.png](https://qiita-image-store.s3.amazonaws.com/0/59913/f6d465df-317d-0d31-b0bd-836753d745e6.png)

# 改めて要件

- Windows PEで動くGUIを作りたい
- できればWindows APIを直に触りたくない

# 選定理由

- GoいいよGo
- WindowsフォームなのにWALKの[実装めっちゃスマート](https://github.com/lxn/walk#using-walk)やんけ！
- さらに[COM触れる](http://mattn.kaoriya.net/software/lang/go/20110122001853.htm)とかもうCでヒーヒー言いながらやる必要ないんや！

# 背景

**※ここからは記事を起こすに至った経緯を書いてあるだけのほぼ日記もといチラ裏なので、結論を求めている方は上のフォークレポジトリをお試しください。**

個人ユースではあまりニーズがないと思われますが、DHCPサーバからiPXE+wimbootなどでWindowsインストールを自動化している場合、主にセットアップスクリプトにはDOSバッチかPowerShellを用いられているかと思います。
自分一人で使っている場合には問題になりませんが、家族などに操作をお願いする場合、カッコ悪いコンソールは見せたくありません。コマンド入力も頼み辛いですし。
そこでGDIが使えるWindows PEならWindows APIを叩けばそこそこマシなセットアップ画面を出せるだろうと画策したのですが、ゆとり世代にはWindows APIの立ちはだかる壁に辟易してしまい、結局のところコンソールセットアップから脱出出来ていませんでした。
（書きながら気がついたのですが、Windows PE上で.Netアプリを動かしていないので、もしかしたら.Netだけで要件は満たせるのかも）

...あれから3年以上たった今、私達の手元にはGo言語のポータブル性とWindowsフォーム描画をうまいことラッピングしてくれるWALKがあります。
確か1年前くらいに試した時は動かない & OS XやLinuxを触っていたこともあり、やはりコンソールから抜け出せていませんでした。そもそもGo言語の知見が溜まっていなかったのと、エラー画面に頭がフリーズしていたのが一番の問題です・・・。

ここ最近は組み込み系の開発を担当しているので、ますますLinux（のCLI）に引きこもっていたのですが、コーディング担当のメンバーが新しく参加することになり、Eclipseの設定やらを自動化したいという欲求が出てきました。
そういった意味のモチベーションとしてはChocolatyに似た何かを作ろうとしている最中ではあるのですが、どうせならWindows 10の自動セットアップ環境を見なおそうと思いたち、WALKが動かない原因を探ってみようと考えた訳です。

まずはサンプルアプリをビルドし、Windows PE上で実行したところ、エラー画面にはopengl32.goとpdh.goのMustLoadLibrary()が失敗しているような感じでした。
まずWALKから呼び出されていないことを確認し、とりあえずファイルを削除したところ、問題なく動いてしまいました！アルェー？／(^o^)＼
本来なら依存関係にある何かがおかしくなってしまったりといったマイナス方向の予想をしていたのですが、Go言語のシンプルさと作者様のコーディングが良いおかげでスピード解決したのでした。1年前気づけよ・・・。

ということで、実際に動くアプリを手に入れた事もありますので、ここからWindowsフォームをガワにして色々と遊んでみようと思います。
日々Go言語やWindows PEを触られている諸氏におかれましてはモヒカンが斧を振り上げるがごとく、今後ともご指導ご鞭撻賜れますよう、よろしくお願い申し上げます。
github 自分のリポジトリを fork する方法

他人のリポジトリを元に fork する方法は資料があったものの、
自分のリポジトリを元に fork する方法がみつからなかったのでメモ。

1. 新しいリポジトリを作る。  
   *Note:* コンフリクトを避ける為、
   .gitignore や README.md は作らず、空っぽのリポジトリを作る。

2. [Import code] のボタンを押す。

3. fork 元のリポジトリの URL をコピペして [Begin Import] のボタンを押す。
ConohaにSlack連携したhubotを置いた

# Slackを私用で使い始めました
- Slackが何かについては検索してください。まあいわゆるチャットツールです。
- 前職で初めて使ったSlackが幸運にも転職先で使われ始めたので、せっかくだからもっと使い込んでみようと思った
 - だが不幸にも会社の人間にSlackの強力さがいまいち伝わていない模様
 - Slackの魅力はなんといってもWebサービスとの連携
 - ここでslackの良さを証拠を持ってして説明できれば会社に定着してくれるはず！

↑建前
↓本音 

- Chatops的に「人語で命令できる奴隷を常備しておきたい」。
 - プログラミングは嫌いじゃないが、何か単調な指示をするときくらいは日本語か英語でやらせてくれ

##  目的と前提
- 自分で契約しているVPSでhubotを走らせ、slack連携によってアクセスさせてみよう。そして常時起動を目指そう。

- 前提として、 何かしらのVPSを契約していること。
    - Herokuにデプロイもやったんだけどアイドル時間が長いとhubotが永眠して使い物にならん
    - 常駐させたいんですよ俺は
    - そういうしがらみのない、自分で色々できるVPSにしよっと…

## 導入
### まずConoha(VPS)にhubotを導入

```
# yum -y update
# yum -y upgrade
# yum -y install git nodejs redis // gitはなんとなく
# npm i -g hubot coffee-script yo generator-hubot // installってiだけでいいんだね!!
# mkdir -p conohaBot
# cd conohaBot
# yo hubot
```
なんかいろいろ聞かれますが、"adapterどうする？"ってところだけ"slack"と答えて、ほかはなんか適当にやりました。自分の名前とbotの名前をどうするか、くらいしか聞かれなかった気がします。

#### hubotの動作確認
hubotのディレクトリ（上記でいうところのconohaBot)にscriptsってディレクトリがあります。その中にexample.coffeeがあるので

```
# cp example.coffee test.coffee // バックアップを作るクセをつけよう
# vi test.coffee
```

でtest.coffeeを編集。
なんかコメントアウトめったくそされてて切なくなったのでbadgerのくだりの2行だけコメントアウト。

```
# bin/hubot
```

で走らせたあと'Badger'って撃ったら「くっさいアナグマは要らんのやで」って言われました（サンプルプログラムが動いている証拠）

hubotを動作させる目的は達成。
Ctrl+Cなりで抜けだして死んでいただきましょう

### slackに召喚する
slackのIntegrationのページ（https://自分のslackのドメイン/services/new）からhubotを選んでなんか適当に名前作っておく。
作成が終わるとAPIトークンが表示される (下記みたいな形式）ので、それをコピーしておく

```
HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

コピーしたら先ほどのbin/hubotをvimなりnanoで編集して貼り付け。

```
// bin/hubotファイル内
export HUBOT_SLACK_TOKEN=xxxxxxxxxxxxxxx // これはどこでもいいけど必須
exec node_modules/.bin/hubot --adapter slack --name "(botのなまえ)" "$@" // 末尾にあったやつをこれに書き換え
```

```
# bin/hubot
```

で起動すると君のslackの適当なchに出現するはず！
### 永遠にこきつかう
常駐させます。なおかつホットデプロイ（scriptを変更・保存した瞬間にその内容が適用される）させましょう。

```
# mv bin/hubot bin/hubot.sh //書き換えなきゃいけない理由はよくわからん。あとで調べる
# npm i -g pm2
# pm2 start bin/hubot.sh --watch
```

監視状態で始まるので、先ほどのtest.scriptの内容を何か適当に変えてみましょう。

```
 robot.hear /さくらたん/i, (res) ->
   res.send "ほえええええええ"
```

slackに「さくらたん」と発言してbotがほえええええええって発言したら成功です。


# ここからどうする
あんまり考えてないけどredisがあるからいろいろ格納できるし、cronJobでコミケの締め切りの通知とかできるよね
Onion Omega の初期設定

# 概要
[IoT向け小型 Linux ボード Onion Omega](https://onion.io/) が届いたので，初期設定を行ってみた．Wifi の設定，ブラウザからターミナルに接続するなど基本的なことはできているものの，Node.js や Python といった開発環境は未完成の模様．

<img width="80%" alt="Onion Omega" src="https://tctechcrunch2011.files.wordpress.com/2015/04/omega-hand.jpg?w=1398" />
（参考: [TechCrunch日本語版](http://jp.techcrunch.com/2015/04/07/20150406onion-omega-brings-web-smarts-to-iot-hardware-hacking/)）

# 起動と Wifi 設定
基本的に[スタートアップガイド](https://wiki.onion.io/Get-Started)の通りにやれば良い．本体を Dock に乗せてマイクロ USB ケーブルを挿し，電源を入れる．

<img width="80%" alt="電源の位置" src="https://i.imgur.com/gupcwsSh.jpg" />
(写真はスタートアップガイドより)

しばらくすると，`Omega-????` という Wifi アクセスポイントが見つかるので接続する．初期設定では暗号化も何もされていないが後で変更できる．

アクセスポイントに接続後，ブラウザから http://192.168.3.1 にアクセスすると認証を求められる．初期設定ではユーザ名 `root`，パスワードは `onioneer`である．後は，画面に従って普段使っている Wifi の情報を入力しファームのアップデート，再起動を行えば完了．

再起動後（Omega 本体のLED点滅が終われば），再び`Omega-????`というアクセスポイントに接続し，http://192.168.3.1 にアクセスすればその他の設定及びインストール済みのアプリケーションを利用できる．

なお，Onion Omega が提供するアクセスポイントは，http://192.168.3.1 以外の通信を上で設定した Wifi アクセスポイントにバイパスしてくれるので，Onion Omega に接続したまま，通常の作業が行える．（トラブったらどうせGoogleで検索するので，いちいちアクセスポイントを切り替えなくて済む仕様は便利）

# 初期アプリ画面など
## GPIOツール
<img width="80%" alt="GPIO Tool" src="https://qiita-image-store.s3.amazonaws.com/0/62253/7dc9c3c7-4991-d729-13c5-30d35d5e3c88.png">
ブラウザ上からGPIOの設定を変更できるツール．回路のデバッグなどには便利かも．ただ，動的に変更はできないので，複雑なことはさせられない．

## ターミナル
<img width="80%" alt="Terminal" src="https://qiita-image-store.s3.amazonaws.com/0/62253/5c9f1b04-bec8-3171-e526-93c4c8fae562.png">
その名の通り，ブラウザベースのターミナル．

## ステータス
<img width="80%" alt="Status" src="https://qiita-image-store.s3.amazonaws.com/0/62253/b858fb71-544a-fc27-1ac4-c5998fcbc2c0.png">
容量は16MBで半分ほど使用済み．ノーマルの Dock には USB 端子が一つ付いてるので必要ならば外部ストレージを付ければ良いと思う．ただ，コンセプト的にはプログラムはクラウドの方に置いておく様な使い方をすべきだろうな．

# その他
USB でシリアル接続することもできる．が，Onion のコンセプトから言うとブラウザ経由で使った方が良いだろう．何か設定をミスってどうにもならなくなった時用かな．

Macからシリアル接続する方法は，[Silicon Labs CP2102 ドライバ](https://www.silabs.com/Support%20Documents/Software/Mac_OSX_VCP_Driver.zip)をインストールし，

```shell-session
$ screen /dev/tty.SLAB_USBtoUART 115200
```

とすれば良い．El Capitan の場合，USB ハブとの相性によっては  `/dev/tty.SLAB_USBtoUART` が見つからない場合があるらしいので，うまくいかない場合は直挿ししてみると良いかも．また，Windows や Linux の人はスタートアップガイドを読んでください．

# まとめ
Onion Omega の初期設定を行った．ブラウザベースの GPIO ツールを使えば Lチカくらいはすぐできる．本製品の売りであった，Node.js や Python，Ruby で開発できるよ，というのは未完成らしい．
windows にpymolをインストールする

整理して書き直したのがこちら
http://qiita.com/hnishi/items/5e5e1fd4902fbe809e73

公式ホームページから educational use only のバージョンのみインストーラで配布されている。登録が必要。
（インストーラはバージョンが古い。比較的新しいバージョンをpipでインストールすることができる。）

無料ソースとしても落ちている。
この[サイト](http://tubiana.me/how-to-install-and-compile-pymol-windows-linux/)で見つけた。

Pymol_win_32.zip
をダウンロードして、任意のフォルダに解凍した。

事前にPython2.7がインストールされている必要がある。
自分はpython(x,y)を事前にインストールしておいた。
これは理系用のツールが最初から入ってるから便利（numpyとかmatplotlibとか）。
URL: https://python-xy.github.io/
ただし、32bit版しかない。
64bit版pythonを使いたければ、自分でbuildするしかなさそう。

あとは、batファイルを実行すればよいとだけ書いてあったが、謎のエラーで実行できない。
どうやら、環境変数のPYTHONPATHがないと怒られているらしい。

バッチファイルの中身を見てみると、、、

```bat:install_pymol.bat
@echo off
for /f "tokens=4" %%x in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath') do set PYTHONPATH=%%x
IF not defined PYTHONPATH (
	echo Can't find Python 2.7. Please check your installation : install PYTHON 2.7
	pause 
	GOTO :EOF)

echo Wheel installation
%PYTHONPATH%\Scripts\pip.exe install wheel

echo PWN Installation (for tkinter windows)
%PYTHONPATH%\Scripts\pip.exe install Pmw-2.0.0-py2-none-any.whl


echo Numpy MKL Installtion
%PYTHONPATH%\Scripts\pip.exe install numpy-1.9.2+mkl-cp27-none-win32.whl

echo Pymol lib installation
%PYTHONPATH%\Scripts\pip.exe install pymol-1.7.5.0-cp27-none-win32.whl

echo PWN Graphic interface installation
%PYTHONPATH%\Scripts\pip.exe install pymol_launcher-1.0-cp27-none-win32.whl

echo DONE -- To run Pymol Launch : 
echo %PYTHONPATH%pymol.exe

pause
```

つまり、python2.7が使えて、pipが使えれば、このbatファイルの順序通りにpip installしていけばいい。

コマンドプロンプトを開く。一応開くときに、右クリックして、管理者権限で実行する（権限（permission）の問題で失敗するとめんどくさいので）。
cdコマンドで、Pymol_win_32.zipを展開したフォルダまで移動する。
まずは
`pip install wheel`
次も同様に
`pip.exe install Pmw-2.0.0-py2-none-any.whl`
順に、numpy+mkl、pymol、pymol-launcherをインストールする。

できた。

コマンドプロンプトで`pymol`と打ってみる。
pymolが立ち上がった。

以上と同じ手順がpymol wikiにも記載がある。
http://www.pymolwiki.org/index.php/Windows_Install

#追記
これらzipファイルの中身の.whlファイルは
http://www.lfd.uci.edu/~gohlke/pythonlibs/#pmw
のサイトで見つけることができる。

いくつかバージョンがあり、
たとえばファイル名に含まれるcp35はpython3.5を示している。

cp27とwin32のものを探してインストールすれば失敗せずに成功した。

#参考
pip installの失敗
http://stackoverflow.com/questions/28568070/filename-whl-is-not-supported-wheel-on-this-platform
npm モジュール作りの覚書

- CoffeeScript で開発
- JavaScript で公開
- 公開モジュールに CoffeeScript は入れたくない（なんとなく）
- 自動生成される JavaScript を git 管理したくない
- test は mocha ✕ chai ✕ sinon

# ディレクトリ構成

```
node_modules/
spec/
.gitignore
.npmignore
index.coffee
index.js
package.json
README.md
```

その他、ファイルが増える場合は `lib` ディレクトリや `bin` ディレクトリなどが増える。

# npm install

```
npm install --save-dev coffee-script               # CS のコンパイル
npm install --save-dev mocha chai sinon sinon-chai # テスト用
```

# .gitignore

```:.gitignore
**/*.js
node_modules/
```

# .npmignore
```:.npmignore
**/*.coffee
node_modules/
spec/
```

# package.json

```json:package.json
{
  "name": "{{module name}}",
  "version": "{{version}}",
  "main": "index.js",
  "scripts": {
    "prepublish": "coffee -c index.coffee",
    "test": "env NODE_PATH=. mocha --compilers coffee:coffee-script/register --recursive spec/ -R nyan"
  },
  "中": "略",
  "devDependencies": {
    "chai": "",
    "coffee-script": "",
    "mocha": "",
    "sinon": "",
    "sinon-chai": ""
  }
}
```

# モジュール作成から公開までの流れ

- [npm 公式サイト](https://www.npmjs.com/) で自分のアカウントを作る
- `npm adduser` で開発者の登録
    - user name, password, email を求められるので、アカウント作った時の情報を入力
    - email は公開されるので注意
- `npm init` でモジュール作りまっせ宣言
- 開発
- `npm publish` で公開
    - `prepublish` によって `index.js` が作られ、それが公開される
地図の吹き出し線がうにょーって伸びるアニメーション

Google マップでフッタに表示した画像をホバーすると、うにょーって吹き出し線が伸びていくの知ってます？
それに近いものをやってみたくて作ってみました。

これです。

![popup.gif](https://qiita-image-store.s3.amazonaws.com/0/81547/984050af-2b66-ed2d-0d9d-7e1d78041c89.gif)

地図には、オープンソースの地図ライブラリ [__Leaflet__](http://leafletjs.com) を使います。
Leaflet は Facebook とか Evernote とかメジャー Web サービスに使われてたりします。
見たことないですか？

![スクリーンショット 2015-11-27 23.png](https://qiita-image-store.s3.amazonaws.com/0/81547/d81c8878-bb03-1dd0-2017-80da97415c92.png)

話が逸れました。

本題に入りましょう。
吹き出しからでる線をうにょーってマーカーまで引っ張るアニメーションを SVG で作ります。直線が伸びるだけだから簡単なはず。

## 既存の吹き出し線

![スクリーンショット 2015-11-27 23.07.23.png](https://qiita-image-store.s3.amazonaws.com/0/81547/c01ca0a4-bf09-517e-e1b2-d1f7d19217e9.png)

Leaflet の標準の吹き出しはこんな感じ。
吹き出し線のコンテナは以下の HTML で構成されてました。

```html
<div class="leaflet-popup-tip-container">
  <div class="leaflet-popup-tip"></div>
</div>
```

`leaflet-popup-tip` が実際に白い吹き出し線の部分。
正方形の白い `<div>` を `transform: rotate(45deg);` で 45度回転させて、吹き出し線を表現してるようです。

## うにょーって伸びる吹き出し線

`<div class="leaflet-popup-tip"></div>` を消して、そこに `<svg>` と `<path>` を突っこんでみる。
その際に線が伸びるアニメーションも追加。
SVG の部分は [__D3__](http://d3js.org) で実装しました。

```js
// 吹き出しの表示イベント
map.on('popupopen', function (e) {
  // 吹き出し線コンテナ DIV に SVG を配置
  var svg = d3.select(".leaflet-popup-tip-container").append("svg")
    .attr({
      class: 'leaflet-popup-tip-svg',
      width: 2,
      height: 100,
  });
  // 吹き出し線グラフィックの作成
  var c1 = [1, 0];
  var c2 = [1, 91];
  var carray = [c1, c2];
  var line = d3.svg.line()
    .x(function(d) {return d[0];})
    .y(function(d) {return d[1];});
  var path = svg.append('path')
    .attr({
      'class': 'leaflet-popup-tip-path',
      'd': line(carray), // SVG 描画範囲での線の頂点座標
      'stroke': 'rgba(255,100,0,0.8)', // 線の色
      'stroke-width': 2, // 線の太さ
      'stroke-dashoffset': 91 // 点線の開始位置 = 線の全長
    })
    .style("stroke-dasharray", "91") // 点線の長さ = 線の全長
    .style("stroke-linecap", "round");
  // アニメーションの実行
  path.transition().delay(300).duration(1000).attr('stroke-dashoffset', 0); 
});
```

線が伸びるアニメーションは以下の２つで実現されます。

* stroke-dasharray(点線の長さ): 線の全長と一緒にすると実線になる
* stroke-dashoffset(点線の開始位置): 線の全長と一緒にすると線がすべてしまわれた状態になり、0 にするとすべてが表示された状態になる

吹き出しが消えると SVG 要素も消え、再び表示されたら同じように SVG 要素が作られ、アニメーションが実行されます。

```js
// 吹き出しを閉じたら SVG 要素を削除
map.on('popupclose', function (e) {
  e.popup._tipContainer.children[1].remove();
});
```

細かい動きやロジックは、[デモ](http://muxlab.github.io/map-effects-100/Leaflet/14_custom-popup.html)と[ソース](https://github.com/muxlab/map-effects-100/blob/gh-pages/Leaflet/14_custom-popup.html)をご覧ください。
【Cygwin】BashのTabキー補完の際に発生するセグフォエラー解消方法

# 【Cygwin】BashのTabキー補完の際に発生するセグフォエラー解消方法

cygwinのbashの使用中に「fhandler_disk_file::fixup_mmap_after_fork」のようなセグフォエラーが発生した際、通例では/bin/rebaseallで解消するが、そうならないことがあるのでより根本的と思われる方法で対処。

##コマンド

```
#ash.exeをエクスプローラから起動してbash.exeのヒープサイズ上限を引き上げ。
/usr/bin/peflags --cygwin-heap=2048 /bin/bash.exe
```

##参考
[Cygwin User's Guide - Chapter 2. Setting Up Cygwin - Changing Cygwin's Maximum Memory](https://cygwin.com/cygwin-ug-net/setup-maxmem.html)
BitVisor にブートオプションを指定する機能が欲しいと思い，いろいろ調べたけどよくわからなかったから，昔自分が書いた情報のリンクを張ってちょっと説明

この記事はBitVisor アドベントカレンダー17日目として日付変更直前に慌てて書いて，慌てて投稿して，アドベントカレンダーに登録しようとしたら，17日目が埋まったので，もちょっとまともにしてからアドベントカレンダーに登録しようと思っている記事です．
Qiita では一度投稿してしまったブログをドラフトに戻すのが面倒そうなので，公開状態のまま編集します.

#どうしてこうなった?
いやですね，アドベントカレンダーで書いた記事がわりと小ネタばっかりなので，そろそろ，ちょっとかっこいいことしたいなーなんて思ったわけですよ．

で，BitVisor でも Linux みたいなブートオプションを指定できるようにしたいなーなんて思ったわけで．

「Linux みたいなブートオプション」を実装したいわけなので，まぁ，Linux のコードを読んでみる．

僕の記憶が正しければ，Linux では，起動の初期段階でメモリのどこかから，オプションの文字列を拾ってきて，それをパースすていた気がする．

この「メモリのどこか」がわかって，それをBitVisorからでも取れればOKだよね，と思って読んだり調べたりし始めたんだけど...


...Linux のブートローダのコード読むのって思った以上に難しいのね．

それでも読んだり調べたりしてたら，
Linux と GRUB は結構，癒着しているみたいで，それと同じ方法でブートオプションを渡すのは厳しいかなーという感じがしてきました．
「あれ，これLinux と同じ方法はBitVisor じゃ使えなくない?」ってなったんですよ．

BitVisor は Grub から起動するときは，`multiboot` コマンドでブートしますが(linux `kernel` とか `linux` コマンドでロードして`boot`で起動だったかな) ，この時はどういうブートプロトコルになってたか．
そもそも multiboot コマンドでブートオプションって渡せたっけ...?

といったことを調べてたら，時間がなくなったので，今まで自分が発表した資料などを載せてちょっと説明書くことにした．

# Multiboot Specification Ver. 2 を読んでみる(メモ, 2015/12/18 頃から随時追記)

僕らの味方 OSDev さん ( http://wiki.osdev.org/Multiboot ) 曰く
http://git.savannah.gnu.org/cgit/grub.git/tree/doc/multiboot.texi?h=multiboot2　 がMultiboot Specification Ver. 2 のドキュメントらしい．

Textinfo ファイルやんけ...

## 読むために
読みやすいようにPDF にするまでの軌跡は以下

```sh
$ git clone http://git.savannah.gnu.org/r/grub.git
$ cd grub
$ git checkout -b multiboot2 origin/multiboot2
$ emacs doc/multiboot.texi
```

``` diff
diff --git a/doc/multiboot.texi b/doc/multiboot.texi
index 4b92918..134a23c 100644
--- a/doc/multiboot.texi
+++ b/doc/multiboot.texi
@@ -358,6 +358,7 @@ executable header.
 * Address header tag::
 * Console header tags::
 * Module alignment tag::
+* EFI boot services::

 @end menu
```

```sh
$ autogen.sh
$ ./configure
$ make
$ cd doc
$ texi2pdf multiboot.texi
```

## 読んでみる

- Boot Loader さんは EBX にいろんな情報が入った構造体的なものを指す物理アドレスを入れてくれることになっているらしい．



# 過去の記事の解説など
### 僕の考えたさいきょーのVMM開発環境
http://www.slideshare.net/DeepTokikane/k-vm-slide-1
実際に僕が開発に使っている環境です．
ブートの流れは

- リモートからマシンの電源を操作(IPMIじゃないよ，RasPIで電源ピン叩くよ!)
- iPXE で iSCIS 接続， BitVisor ロード&起動
- Grub からLinux を起動(ブートローダ，カーネルはiSCSI 上のもの)
- シリアルコンソール経由でLinux のシェルとこんにちは
- BitVisor のログはネットワークへのログ出し

いろいろ組み合わせてます．

これで，シリアルケーブルとネットワークをつなげてある，sshログイン可能な開発用マシンを用意すると，開発やデバッグをすべてssh越しでできるという自慢の開発環境です．

iPXE でネットワークブートする方法は下記ページに昔書いてみました(DHCPサーバの設定が間違っているという噂があったりしますが...)
http://tokikane-tec.blogspot.jp/2015/02/ipxe-bitvisor.html

ネットワーク経由でログを出す方法は
http://qiita.com/deep_tkkn/items/ee6563aafb0d33de8450

syslogでかっこよくログを取りたい方はこっちかな
http://qiita.com/hdk_2/items/2431710fcf257904fc8a

### ライブマイグレーション実装で体験したデバッグの解説
http://www.slideshare.net/DeepTokikane/ss-55731874

これはつい最近，BitVisor Summit 4 で話した内容です．
BitVisor で何か実装していると，何もログ出さずに(panic さえせずに)固まることがたまによくあるので，そういう事例を集めて解説してみた発表です．


# おわりに
やっぱり BitVisor でブートオプション渡したいので，詳しい人教えてほしい．
Mono-ruby must have a single group.

```latex
! Package pxrubrica Error: Mono-ruby must have a single group.
```

```latex
\ruby[g]{今|昔|物|語}{こん|じゃく|もの|がたり}
```
じゃなくて
```latex
\ruby{今昔物語}{こん|じゃく|もの|がたり}
```

ということ