OmniAICreator/Qiita-1.07M huggingface dataset:
国際化ドメイン名(IDN)のエンコードに使われている一般化可変長整数とは何か

国際化ドメイン名(IDN)では、マルチバイト文字のドメイン名がDNSプロトコル上ではASCII文字に変換されてやりとりされます。たとえば「あ.jp」であれば「xn--l8j.jp」のように変換されます。この表現におけるハイフン以降の部分が本稿のテーマで、これには「一般化可変長整数」という仕組みが利用されています。

エンコード後のデータ「l8j」などを見るとa-z,0-9まで使った36進数なのかな？と思うかもしれませんが、実際はもっとトリッキーなエンコーディングになっています。論より証拠、まずはルールがわかるかどうか見てみましょう。下記はIDNのマルチバイト文字1バイト目の場合に対応する整数とエンコード結果の表になります（注意：2文字目以降は前の文字によってルールが変わりますが、ここではいったん考えないことにしましょう）。

| 数値   | エンコード結果 |
| ---   | ---  |
| 0     | a    |
| 1     | ba   |
| 2     | ca   |
| ...   | ...  |
| 34    | 8a   |
| 35    | 9a   |
| 36    | bba  |
| 37    | cba  |
| ...   | ...  |
| 70    | 9ba  |
| 71    | bca  |
| 72    | cca  |
| ...   | ...  |
| 1260  | 99a  |
| 1261  | bbb  |
| 1262  | cbb  |
| ...   | ...  |
| 31885 | 99z  |
| 31886 | bb0a |
| ...   | ...  |
| 44135 | 999a |
| 44136 | bb0b |
| ...   | ...  |


これを見て、どういうルールかパッとわかるでしょうか？

この世界ではaは0を意味します。zが25、0が26、9が35となります。ですから、表の35までは36進数として解釈しても矛盾がありません。

ところで、上の表で1260から1261で2桁から3桁になっているのは36進数にしては変です(36^2=1296なら理解できますが)。さらに言えば44135から44136で3桁から4桁になっている部分もキリが悪すぎます(36^3=46656からかけ離れている)。

また、最後（リトルエンディアンなので最上位桁）にaが付くか付かないかのルールも一貫性がないように見えます。

## 種明かし

一般化可変長整数というのは、桁ごとに「しきい値」が設定されており、1桁の重みが可変であるような整数列のエンコーディング方法です。

上の例で言えば、文字列から整数への変換は次の式で表現できます。

```
整数=(1桁目)+(2桁目)*35+(3桁目)*1225+(4桁目)*12250
```

たとえば、「あ.jp」に登場した「l8j」の例なら、`11+34*35+9*1225=12226`となります。1文字目は128からの差分で文字を表現するルールなので、`128+12226=12354=0x3042`より、あ(U+3042)を表現していることがわかります。


また、各桁に次の文字が使われていたら、そこで数値の終了を意味します。


| 何桁目か | 数値の終了を意味する文字範囲 |
| ---   | ---  |
| 1     | a    |
| 2     | a    |
| 3     | a-z  |
| 4     | a-z  |

逆に言うと、各桁が最上位桁でない場合に使える文字範囲は次のようになります。

| 何桁目か | 最上位桁でない場合に使える文字範囲 |
| ---   | ---  |
| 1     | b-z,0-9|
| 2     | b-z,0-9|
| 3     | 0-9 |
| 4     | 0-9 |

ザックリまとめると、上の表は1桁目2桁目が35進、3桁目以降が10進であるような表現を変形したようなものになっています。これにより数値の大きさと切れ目を一意に表現できるようになっています。

ちなみに、一般化可変長整数では桁ごとの重みを任意に変えても表現の一意性が担保できます。上のルール以外にも無限にルールを作れるのが一般化可変長整数ということです。


## さらに恐ろしい話

実際、IDNのマルチバイト文字2文字目以降は桁の重み付けルールが変わります。具体的には、直近で近くの文字を使っていたら、次も近くの文字が採用されるという前提でエンコード後の表現ができるだけ短くなるように「数値への変換式」「終了を意味する文字範囲」「最上位桁でない場合に使える文字範囲」が書き換わります。

そんなわけで、IDNのマルチバイト2文字目以降を人力でデコードするのは非常に困難でしょう。aは全ての場合において最上位桁になるので、aが登場したところで1文字分が終わっているんだな、くらいのことは言えますが、それ以上まで読み解くのはかなり厳しいと思います。


## 参考URL

- [RFC3492 日本語訳](http://www.jdna.jp/survey/rfc/rfc3492j.html)
Effective Python メモ　項目15 クロージャが関数スコープとどう関わるかを知っておく

オライリー・ジャパンの書籍effective pythonのメモ書きです。
https://www.oreilly.co.jp/books/9784873117560/
P３1~３５

# クロージャのスコープを把握しておくことで、綺麗なコードが書けるようになる
**ソートの例**
数字を順にソートするが、優先したい数字があるとする

```py3
def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    values.sort(key=helper)

numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
sort_priority(numbers, group)
print(numbers)

>>>
[2, 3, 5, 7, 1, 4, 6, 8]
```

クロージャの概念を知らないと、動作がイメージしにくいと思います
ここでは３つのポイントがあります
1. クロージャの仕組みによって、helper関数がsort_priority関数の引数であるgroupにアクセスできる
2. pythonの関数が第一級オブジェクトであるため、sortメソッドのkeyの引数としてhelper関数が代入できる
3. helper関数の戻り値であるタプルによって、最初の添字が0と1に別れることで、優先順が別れる

**優先リストに含まれるかどうかの判別を組み込む**
上記のコードを元に、優先リストに含まれる場合にTrueを返す実装がしたいとする

```py3
def sort_priority2(numbers, group):
    found = False
    def helper(x):
        if x in group:
            found = True #ここでTrueになるはずだが。。。
            return(0, x)
        return(1, x)
    numbers.sort(key=helper)
    return found

found = sort_priority2(numbers, group)
print('Found', found)
print(numbers)

>>>

Found False
[2, 3, 5, 7, 1, 4, 6, 8]
```

本来、計算ではFoundはTrueになるはずだが、何故かFalseを返している。
この理由はクロージャの**スコープ**にある。

#スコープを理解しておかないと、不可解な挙動に悩まされる
上記のコードがFalseを返さないのはFoundのスコープがhelper関数の外にとどまっていることが原因。
つまり

```py3
def sort_priority2(numbers, group):
    found = False        # ここのスコープでfoundが存在するため。。
    def helper(x):
        if x in group:
            found = True #　ここのスコープまで参照しに行かない
            return(0, x)
        return(1, x)
    numbers.sort(key=helper)
    return found
```

そのため、1つ上のスコープにあるFalseが返されてしまいます。
これを回避するために、python3では**nonlocal**関数が用意されています。
nonlocalはスコープをクロージャの外に出す

```py3

def sort_priority3(numbers, group):
    found = False
    def helper(x):
        nonlocal found # ここでfoundのスコープはhelper関数の外に出された
        if x in group:
            found =True
            return(0, x)
        return(1, x)
    numbers.sort(key=helper)
    return found

found = sort_priority3(numbers, group)
print('Found', found)
print(numbers)

>>>

Found True
[2, 3, 5, 7, 1, 4, 6, 8]

```
これで意図した動きになりました。

ただし、nonlocalを大規模な関数で使用すると、意図しない部分の範囲まで影響が及ぶため、かなり注意が必要。
万全を期するなら、nonlocal関数の代わりに、同様なクラスでラップすることが良い

```py3
class Sorter(object):
    def __init__(self, group):
        self.group = group
        self.found = False
        
    def __call__(self, x):
        if x in self.group:
            self.found = True
            return(0, x)
        return(1, x)

sorter = Sorter(group)
numbers.sort(key=sorter)
assert sorter.found is True

>>>
(assertによる例外は発生しない）
```

こちらの方がスコープを気にせずに使えるでしょう。

ちなみにpython2ではnonlocalはサポートされていません。

# 結論

1. クロージャのスコープを把握することで、簡潔なコードが書ける
2. スコープの範囲を把握しないと、意図しない動作が発生する
3. python3はnonlocalを使用することで、クロージャ外にスコープを広げることができる（ただし単純な関数のみに限定したほうが良い）
よく使うDOMまとめ

フレームワークとか、jQueryなどを使う機会が増えてDOM単独で利用することは少なくなりました。しかし、なんだかんだ言ってインクルードするのは時間が掛かるため、どうしても必要という時以外は、利用せずJavaScript単独で利用することがあります。その時、いつもDOMの名前を間違えるので、書き残しておきます。

```js
element.style.width  = "200px";
element.style.height = "200px";
element.style.position = "absolute";
element.style.top = "100px";
element.style.left = "150px";
element.style.backgroundColor = "red";
element.style.backgroundColor = 'red';
```
JavaScriptのセミコロンを省くと起こること

# 最初に
JavaScriptにはセミコロンを省いても自動で文を解釈して実行してくれるという特性があります。
そのため以下は等価となります。

```javascript
var a
a = 1
console.log(1) // 1

var b;
b = 1;
console.log(1); // 1
```
もちろんエラーも起こりません。

そんな特性を持っているためか、ライブラリなどでたまに先頭にセミコロンをつけてから始めているものもちらほら見受けられます。

## どんなことが起こるのか知ってますか
そんな特性を持っていて、ライブラリなどにセミコロンをつけないとどんなことが起こるのか、また、セミコロンがないときの文の解釈を簡単にまとめてみました。

# 試してみました
## 代入
まずは基本的な代入。そのままa=1として解釈されます。

```javascript:基本的な代入
a
=
1
console.log('a=' + a) // a=1

//以下上記と等価
a = 1;
```

計算結果を代入。b=b1+b2として解釈されます。

```javascript:計算結果を代入
var b1 = 1, b2 = 2
b
=
b1
+
b2
console.log('b=' + b) // b=3

//以下上記と等価
b = b1 + b2
```

## インクリメント
インクリメント演算子で1足してみると驚きの結果。後ろにあるdの方が足されます。引いてみても後ろの変数が引かれます。

```javascript:インクリメント
c = 1, d = 1
c
++
d

console.log('c=' + c) // c=1
console.log('d=' + d) // d=2

// 以下上記と等価
c;
++d;

```

## 関数
関数で計算結果を返すものを混ぜてみます。

```javascript:乗算の結果を返す
function fun(x1, x2) {
	return x1 * x2
}
```

関数の引数部分が別れてもしっかり解釈してくれるようです。

```javascript:計算結果を代入
var e1 = 1, e2 = 2

e
=
e1
+
e2
+
fun
(2,5)

console.log('e=' + e) // e=13

// 以下上記と等価
e = e1 + e2 + fun(2,5)

```

### エラー発生
さてここからが問題です。下記のように下の文に(が続くと、上の文の引数部分として解釈されるようです。

```javascript:計算結果を代入
f
=
fun(1,2)
(function() {
	console.log('function!')
}());

// Uncaught TypeError: fun(...) is not a function

// 以下上記と等価
f = fun(1,2)(function() {
	console.log('function!')
}());

```

なので例え値を持った変数が(の上の文だとしても関数だと解釈されエラーが発生します。

```javascript
var f1 = 1
f
=
f1
(function() {
	console.log('function!')
}());

// Uncaught TypeError: f1(...) is not a function

// 以下上記と等価
var f1 = 1;
f = f1(function() {
	console.log('function!')
}());
```

ちなみにreturnも行を分けると、その下の文が何であろうと実行されないので注意

```javascript:returnでも
function ret() {
	return
	1
}

console.log(ret()) // undefined
```

# 結果
セミコロンは絶対つけましょう。
影響範囲を探す手間を考えればつけないという選択肢はないです。
Visual Studio Codeでnpmを使う

この記事は[Visual Studioを起動せず、CordovaでWindowsストアアプリを作る](http://qiita.com/TakamiChie/items/cdfb54b8544e5c472e6e)の続きです。ここに書かれていてよくわからないものについては、先の記事を確認してください。


さて、Visual Studio Codeでnpmを使います。npmを使うことで、プロジェクト内のライブラリバージョン管理を行うことができます。
このnpmを使ってライブラリのインストールを行っておくと、ライブラリの依存関係を解決してくれるほか、Gitのリポジトリにいちいちライブラリを追加しなくても、クローン先に簡単にライブラリをダウンロードすることができるので、リポジトリで管理するファイルが減らせます。

# 初期化処理
まず、プロジェクトの初期化処理を行います。`npm init`というコマンドを利用します。

```
> npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
・・・いろいろ質問・・・
```
質問のところで、いったんプロンプトが止まります。アプリ名やバージョン、概要、作者名などを聞かれますが、パッケージをアップロードするとかでもない限り、そんなに重要な情報ではないです。

すると、以下のようなファイルが出力されます。

```package.json
{
  "name": "testapp",
  "version": "1.0.0",
  "description": "test",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```

なんか真ん中にErrorという文字列があるので一瞬不安になりますが、テスト用のコードなので問題ないです。

これで、モジュールインストールの準備が整いました。ここでは、Windowsストアアプリ向けのUIライブラリ、WinJSをインストールしてみます。

```
> npm install winjs --save
testapp@1.0.0 C:\temp\testapp
`-- winjs@4.4.0  extraneous

npm WARN testapp@1.0.0 No repository field.
```

 * 第一引数(winjs):インストールしたいパッケージ名
 * 第二引数(--save):依存ライブラリとして、package.jsonに保存する場合`--save`をつける

インストールが終わりました。すると、カレントフォルダに、`node_modules`というフォルダができると思います。これがモジュールがインストールされた場所です。

![image](https://qiita-image-store.s3.amazonaws.com/0/14499/6e6d6b47-6c43-3a08-2e3b-e995fad20de0.png)

ためしに、このフォルダを削除して、もう一度npmからダウンロードしてみます。

```
> rm -rf node_modules
> npm install
testapp@1.0.0 C:\temp\testapp
`-- winjs@4.4.0

npm WARN testapp@1.0.0 No repository field.
```

packages.jsonに保存した依存ライブラリを全部ダウンロードしたいときには、引数無しで`npm install'コマンドを実行します。すると、ライブラリが全部インストールされます。

# Visual Studio Codeから使う

Visual Studio Codeにも、npmの拡張があります。これを使うとnpmのコマンドをプロンプトを出さずに使えます。

まず、拡張機能をインストールします。拡張はそのまま`npm`です。
![image](https://qiita-image-store.s3.amazonaws.com/0/14499/be7314cb-4798-2061-8dca-ec60cfec18e8.png)

再起動すると、Command Paletteからnpmコマンドが一部使えるようになります。以下重要なコマンド

 * >npm: Initialize npm package: `npm init`です。最初に必ず必要。
 * >npm install and save dependency: `npm install 〇〇 --save`。パッケージ名はコマンド選択後に入力を促されます。
 * >npm: install saved packages:引数無しの`npm install`です。復元時はこれを使いましょう。

# Gitコミット時
ここまで書いておいてあえていうこともないですが、.gitignoreには`node_modules/`フォルダを指定しておきましょう。他はコミットして問題なしです。
HTML,CSS勉強メモ #7 〜実践!10-11色々〜

今日は全然時間が取れなくてほとんど進みませんでした・・・ :sweat: 

##**進度**##
###実践！ウェブサイトを作ろう###
- 10:ヘッダーとフッターを作ろう
- 11:メニューを作ってみよう

##**メモ**##
###`h1`###
レッスンではヘッダーの画像を`h1`タグの中に指定していました。以前SEO対策で`h1`が重要と聞いたので気になって調べてみました。
結論から言えば問題はありません。現在の検索エンジンは画像でもキチンと認識してくれるそうです。
それに今はSEO対策的にはそこまで重要なタグではないみたいです。もちろんどちらかといえばテキストでキーワードを入れるのが理想ですが、昔これを使ったスパムが流行ったようで`h1`タグをそこまで直接的に重要視はしなくなったみたいです。でも「`h1`が適切に使われているか？」という観点で信用あるページであるアピールにはなるので、間接的にはやはり重要と言えます。
ポイントとして、`h1`タグに画像を入れる際は`alt`属性(画像が表示されないとき用のテキスト)を使ってテキストを入れてあげると良いそうです。

###`display:block;`
このスタイルを適応させてブロックボックスを生成することにより、
menuのクリック範囲をテキスト部分だけでなく周囲の背景部分でも選択できるようにするというものでした。
こういう使い方もあるのかと(常識かもですが…)目からウロコでしたのでメモっときます。

###`list-style:none;`###
レッスンの中では出てこなかったのですが、menuをクリックした際にビュレットが突然現れてビックリ。
ということで、`#menu ul>li`の中に`list-style:none;`を追加しました。

以上、本日のまとめでした。
Rubyのinline private/protectedの話


実用性はあまりない小ネタです

まずは以下のコードをみてください

```rb
class Foo
  private

  def hello
    "Hello!"
  end
  
  def goodbye
    "Good bye!"
  end
end

class Bar
  private def hello
    "Hello!"
  end
  
  def goodbye
    "Good bye!"
  end 
end
```

`Foo`と`Bar`の違いは`private`が単独で置かれているか`def hello`にインラインで書かれているかです。
この上で、以下のコードの結果はそれぞれどうなるでしょうか？

```rb
Foo.new.hello
Foo.new.goodbye

Bar.new.hello
Bar.new.goodbye
```

全てprivateとして`NoMethodError`になる、と思った方がいるのではないでしょうか？
実際の結果は以下の通りになります。

```bash
[4] pry(main)> Foo.new.hello
NoMethodError: private method `hello' called for #<Foo:0x007f860ba8a320>
from (pry):21:in `__pry__'
[5] pry(main)> Foo.new.goodbye
NoMethodError: private method `goodbye' called for #<Foo:0x007f860c268d30>
from (pry):22:in `__pry__'
[6] pry(main)>
[7] pry(main)> Bar.new.hello
NoMethodError: private method `hello' called for #<Bar:0x007f860c2800c0>
from (pry):23:in `__pry__'
[8] pry(main)> Bar.new.goodbye
=> "Good bye!"
```

`Bar#goodbye`がpublicとして扱われました。なぜでしょうか？

## インラインに宣言されたprivate/protectedはそのメソッドのみに効く

Rubyでは、上記`Bar#hello`のようにインラインに宣言されたprivate/protectedはそのメソッドのみに効くようになります。
そのため、上記`Foo`クラスのように「private宣言以降は全てprivateメソッドとする」という書き方が嫌な場合は、以下のように書くことができます

```rb
class Bar
  private def hello # private
    "Hello!"
  end
  
  def goodbye # public
    "Good bye!"
  end 
  
  protected def good_night # protected
    "Good night"
  end
end
```

なんだか静的片付け言語っぽいですね

## 実用性は？

Rubyの文化的には「private/protectedを単独で宣言し、その行以降全てをprivate/protectedにする」という書き方が一般的です。

それに比べるとメソッドごとにprivate/protectedを書くのは非常に冗長な書き方なのでやりたくありません。
もし、private/protected宣言行以降であることを分かりやすくしたいなら、宣言以降のメソッド定義はインデントを一つ深くするのがいいでしょう。（[ruby-style-guide](https://github.com/fortissimo1997/ruby-style-guide/blob/japanese/README.ja.md#indent-public-private-protected)ではインデント下げないように言っていますが、なんででしょう？）

もし、無理やり実用性をひねり出すならリファクタリング時が考えられるでしょうか。
「privateにしてよさそうだけど影響範囲が読めない。とりあえずprivateにしてみたいけど行を移してダメだったら戻してを繰り返すのは面倒臭い」という時には、インラインで宣言できることを覚えておくと役に立つかもしれません。
PHP6.0移行ガイド

# リリースノート

2016年4月1日に，PHP6.0がリリースされました．

PHP 6 Changelog

- [http://php.net/ChangeLog-6.php](http://youareanidiot.org/)

# 新機能

PHP5.6からPHP7.0への大規模なアップデートが話題になりましたが，更にPHP7.0からPHP6.0に向けて後方互換性に関わる数多くの変更が行われています．

## 内部文字コードUTF-16化

PHP6.0から，JavaやC#のように，処理系内部において文字列が全て文字コード**UTF-16**で保持されるようになります．これにより，そのままでは挙動に変化はありませんが，`declare`宣言にて`encoding`を明示したときに違いが表れます．

```php:指定なし
<?php
$str = '本当だよ';
echo substr($str, 0, 6); // 本当
echo mb_substr($str, 0, 2); // 本当
```


```php:指定あり
<?php
declare(encoding='UTF-8');
$str = '嘘じゃないよ';
echo substr($str, 0, 1); // 嘘
echo $str[0]; // 嘘
```

このように，従来はmbstring拡張の関数を利用して書いていたところが，通常の関数を用いて処理できるようになります．それに伴い，mbstring拡張がPHP6.0からはDeprecatedになることも決定されました．

上記の例ではUTF-8を用いましたが，今後はShift_JISで使われることが増えていくと予想されます．実際この変更が導入された背景には[Bash on Windows](http://sqlazure.jp/r/tips/794/)の発表があり，**「文字コードShift_JISで出来るだけ快適にPHPコードを書きたい」**という声も既に上がっています．


## 演算子の挙動変更<br />

古くからPHPは文字列連結にはドット演算子`.`，オブジェクトメンバの参照にはアロー演算子`->`,連想配列の定義にはダブルアロー演算子`=>`を用いていましたが，ポピュラーな他の言語との互換性を考慮して，PHP6.0からは以下のように変更されます．

```php:文字列連結はプラス演算子が行う
$s = 'a' + 'b';
echo $s; // ab
```

```php:メンバ参照はドット演算子が行う
$rows = $pdo.query('SELECT * ...').fetchAll(PDO::FETCH_ASSOC);
```

```php:連想配列の定義はコロン演算子が行う
$assoc = [
    'a': 'b',
    'c': 'd',
];
```

なお，連想配列のキーのクオーテーションは省略することが可能です．

```php
$assoc = [
    a: 'b',
    c: 'd',
];
```

## Scalar Objects

スカラー値からメソッドが生やせるようになる [nikic/scalar_objects](https://github.com/nikic/scalar_objects) 拡張が注目を集めていましたが，PHP6.0からはこれが標準で導入されます．基本的なメソッドも定義されています．

```php
$r = [1, 2, 3, 4].map(function ($x) { return $x + 1; })
                 .map(function ($x) { return $x * 2; })
                 .join(',');
echo $r; // 4,6,8,10
```

## Short Closure

Scalar Objects の採用に伴い，より短いシンタックスを実現するために，クロージャの短縮記法が導入されました．役割を失った`->`はこちらで活用されます．

```php
$r = [1, 2, 3, 4].map($x -> $x + 1)
                 .map($x -> $x * 2)
                 .join(',');
echo $r; // 4,6,8,10
```

また**「変数を`use`でインポートするのが煩わしい」**との声に答え，クロージャを生成したスコープに存在する変数を暗黙的にインポートする記法も用意されました．こちらでは`=>`を用います．

```php
$y = 'World';
echo ($x => "$x, $y")('Hello'); // Hello, World
```

## Implicit Variable

PHPは歴史的な理由で，Noticeを発生しながらも未定義の定数を文字列として扱っていましたが，PHP6.0からは以下のように挙動が変更されます．

- 文字列ではなく**変数名**として扱われるようになる
- Noticeが発生しなくなる

よってPHP6.0からは以下のようなコーディングスタイルが推奨されます．

```php
r = [1, 2, 3, 4].map(x -> x + 1)
                .map(x -> x * 2)
                .join(',');
echo r; // 4,6,8,10
```

## Named Closure

以前のPHPでも，[mpyw/phpext-callee](https://github.com/mpyw/phpext-callee)のようなエクステンションを作れば，クロージャを無名再帰させることが可能でした．

```php
<?php
var_dump((function ($n) {
    return $n < 2 ? 1 : $n * callee()($n - 1);
})(5));

// 5! = 5 * 4 * 3 * 2 * 1 = int(120)
```

PHP6.0からはJavaScriptのように，クロージャに再帰用の名前が付けられるようになります．

```php
<?php
var_dump((function self($n) {
    return $n < 2 ? 1 : $n * self($n - 1);
})(5));

// 5! = 5 * 4 * 3 * 2 * 1 = int(120)
```
文字入力のすごい基礎的なところを理解した

# 経緯

Vim とか触っていると、一文字入力するたびに何かアクションが発生したりするので、どういう仕組みで動いているんだろうという技術的興味があったので、ソースコードリーディングをしてみた。

# 知識レベル

getc() とか gets() とかで 行単位の入力ができるのは知っているが、キー入力ごとに処理をする方法を知らない。

# 予想していた動作

予想というか自分の知識で簡単に考えられたのは、別スレッドで文字入力を監視してキー入力があったらメインスレッドに通知するみたいなのを想像してた。

# wincons.rb を眺める

wincons.rb という Ruby製のコンソールライブラリ、一文字入力したら終了するみたいな処理をすごい昔に書いた覚えがあって、そういえば、これはどうやって実現しているんだろうと気になりました。

ソースは以下からゲットできます。
http://texcell.co.jp/ruby/Lib/winconsole.html

見てみると、win32apiのPeekConsoleInputWという関数を呼び出すことで実現しているよう。

http://texcell.co.jp/ruby/PLC/rubyc24.html
↑ここらへんの例を見ると、ループの中で常にキー入力チェックをして、`q`が来たら終了するようにしているみたいです。

# Vim のソースコードを眺める

wincons.rb のやり方が本当に正しいのか？という疑問もあったので、Vimのソースコードも眺めてみることにしました。

ソースコードはgithubから手に入れることができます。
https://github.com/vim/vim

先ほど出てきたPeekConsoleInputWが使われている箇所を検索すると、`src/os_win32.c`の`read_console_input`という関数の中で使われていることがわかりました。

この`read_console_input`というのが結構いろんなところから呼ばれているようで、どれがキーボード入力に直結するのかが私にはわからなかったので、あきらめました。

※ `mch_inchar` => `tgetch` あたりがあやしいかなと踏んでいます。`mch_inchr`は`ui_inchar`から呼ばれていて、`ui_inchar`は`inchar`関数のforループの中で呼ばれています。forループはui_incharからキー入力がゲットできるまで回り続けるので、ここら辺がキー入力のキモなのかなと思いますが、これだと、inchar関数の中でループしてほかの処理が動かなくなってしまうので、`inchar`を呼んでいる親元でスレッドになっているんだと思いますが、憶測です。

# readline のソースコードを眺める

rubyに付属しているreadlineはTABキーを押すと補完用のProcを呼び出します。おそらくTABキーが押されたらProcを呼び出すといった処理が入っているに違いないと推測。

まずは、rubyに付属のreadlineをコードリーディング

rubyのソースは以下から見れます。
https://github.com/ruby/ruby

readlineのソースは`ext/readline`あたりにあります。

色々見た結果、Procを呼び出す関数は`readline_attempted_completion_function`ぽいことがわかりました。その関数は`rl_attempted_completion_function`にバインドされています。

`rl_attempted_completion_function`はrubyのコードではなく、GNU readlineのコードの中にあるため、そちらを読み解きます。

GNU readlineのソースは以下から見れます。
https://github.com/JuliaLang/readline

正確にはGNU readlineの本当のソースではありませんが、今回の理解を進める分には問題ないと思います。

`rl_attempted_completion_function`は`complete.c`の中にありますが、関数をさかのぼってもそれらしいところに到達できませんでした。

# readlineの使い方を調べる

ここら辺を見てみると`readline`がルートっぽいので、ルートから順を追って調べることにしました。
http://d.hatena.ne.jp/cocoatomo/20071112/1194855728

`readline()`は`readline.c`にあります。その関数の中をどんどん辿っていくと、`input.c`の`rl_gather_tyi()`の中にある`kbhit()`がキー入力のキモとなる部分のようです。

# kbhit()とは？

ここを見てみると
http://tricky-code.net/mine/c/mc07kbhit.php

> kbhit関数とは、何かキーが押された場合0以外の値を返し、
> 何もキーが押されていない場合は0を返す関数です。

とのこと、これ自体がどのキーが押されたかを判定するものではないようです。

実際とっているのは`rl_getc(stream)`の中で、`read()`関数を呼んで、引数として渡されているIOから一文字読んでいるようです。

それをループでぐるぐる回すことで、常にキー入力をチェックして1文字単位でチェックしてるようです。

スレッドなんてなかった。

# まとめ

readlineはスレッドを使わずにループでキー入力をチェックしている。

キー入力があったかどうかの判定には`kbhit()`を使っている

文字取得には`read()`を使って1文字ずつ取得している。
Could not find rake-10.5.0 in any of the sources の対処法

アプリケーションのルートじゃない階層のディレクトリにGemfile を置いて使うアプリケーションにcapistranoでデプロイしようとしたときにハマったので整理

# 何はともあれ bundle config
 
```
$ cd /path/to/app/current
$ bundle config
```
コマンドを打つことで、bundler が使う設定値の他、その値がどこからロードされたかが確認できる

自分の場合は、環境変数で指定した BUNDLE_GEMFILE だけが出て、 .bundle/config に書かれているはずの BUNDLE_PATH などが出てこなかった

# .bundle/config を探す
.bundle/config は、bundle install が意図通り実行されれば、
BUNDLE _GEMFILE で書いた gemfile と同じディレクトリに作られるはずである。

```
$ cd /path/to/app/current/path/to/gemfile_dir
$ ls .bundle/config
```
自分の場合はここにファイルが存在しなかった。
よって、意図した BUNDLE_GEMFILE で bundle install が行われなかったと分かる。
たとえ、他のコマンド実行時に BUNDLE_GEMFILE をうまく使えているとしても。

下記リンク先の通りに、gemfile のパスを capistrano で設定したら、うまくいった。
http://qiita.com/negito6/items/042afee41b71ab45e66b
大谷翔平の打席になったら自動でチャンネルを変える


プロ野球開幕しましたね。
メジャー志向の大谷翔平が日本で見れるのも、
残りわずか…かもしれません。

見逃さないよう、大谷翔平の打席になったら、
自動でチャンネルを変えたいと思います。

開発環境の他にIRKitと、
日本ハム主催試合の中継をしているGAORAとの契約が必要です。
今回使用したコードは[github](https://github.com/kobabasu/ohtani-channel)に置きました。

## 試合経過をスクレイピング
MLBではAPIがごろごろありそうなのですが、
NPBではソースが少なく、有名な[スポーツナビ](http://baseball.yahoo.co.jp/npb/)から試合経過を取得してみます。
(スクレイピング周りは法律関係難しいそうで、もしご迷惑かけるようでであればば削除します)

今回は、Go言語というものにチャレンジしてみたかっため、
スクレイピングにはgoqueryを使ってみることとします。

```
doc, err := goquery.NewDocument(path + query)
if err != nil {
	log.Fatal(err)
}

cNo := doc.Find("#batter .playerNo").Text()
cTeam := doc.Find(".score .act").Text()
cNext := doc.Find("#nextR p").Text()
```

この短いコードだけで欲しい情報が取得できました。
成功し出力すると、以下のような結果が返ってきます。
上から、現在の打席の背番号、攻撃中のチーム名、次の打者の名前です。

```
No: #8
Team: 日本ハム
Next: 大谷翔平
```

## IRKitでチャンネルを変える
次の打者が大谷翔平であれば、
チャンネルを変えるようにrequestを送りたいのですが、
Go言語ではnet/httpを使うとできるのだそうです。
やってみます。

Jsonの中身は、IRKitのサンプルそのままです。
setしているheaderもIRKitの仕様でrequestに含める必要があります。

```
json := `{"format":"raw","freq":38","data":` + チャンネルの信号 + `}`
var ch = bytes.NewBuffer([]byte(json))
req, err := http.NewRequest("POST", "http://192.168.12.51/messages", ch)

req.Header.Set("X-Requested-With", "curl")
```

できました!
実際には、リモコンのCSボタンを押して、チャンネルを変えるという
2つの処理が必要だったのですが、
処理の間に、一呼吸おいてあげる必要があります。
`time.Sleep(1 * time.Second)`などで間隔を空けてあげる必要があります。

## 感想
一番ありがたかったのが、Go言語のクロスコンパイルでした。
Macで作って、RaspberryPiで動かす予定だったので、
OSとアーキテクチャを指定するだけで、
何の問題もなく動いたのはすごく助かりました。
引き続き、Go言語には触れていきたいと思います。

スクレイピングは経験値が必要だと思いました。
今回の例でいうと、スポーツナビの速報ではリアルタイムではなく、
不規則なタイムラグがあります。
大谷翔平が回の先頭打者だった場合や、初球打ちした場合など、
打席が終わった後にチャンネルが変わるという残念な結果となります。
2つ前の打者でチャンネルを変える工夫や、
先頭打者の場合の処理分岐など、チューニングが結構必要かと思います。

[動画](https://youtu.be/5K5kLYAbY2U)も上げてみましたので、興味のある方はぜひ。
GitHub Markdown + TeX記法で数式を任意の位置で合わせたい

GitHub Markdown + $\TeX$ 記法で数式を書く際に調べた事
# 数式が複数行にわたるときに位置を合わせたい

eqnarray 環境を使用し,
合わせたい位置を& &で囲むことにより任意の位置で数式を合わせることができる.

```lang:
$$
\begin{eqnarray}
4a &=& ((a+a)+a)+a \\
   &=& (a+a)+(a+a)
\end{eqnarray}
$$
```

$$
\begin{eqnarray}
4a &=& ((a+a)+a)+a \\
   &=& (a+a)+(a+a)
\end{eqnarray}
$$

しかし, Qiita の Markdown では合わせることができなかったが,
[コードブロックの言語指定に "math" を指定](http://qiita.com/Qiita/items/c686397e4a0f4f11683d#%E6%95%B0%E5%BC%8F%E3%81%AE%E6%8C%BF%E5%85%A5)することで合わせることができた.

> \`\`\`math
> \begin{eqnarray}
> 4a &=& ((a+a)+a)+a \\\
>    &=& (a+a)+(a+a)
> \end{eqnarray}
> \`\`\`

```math
\begin{eqnarray}
4a &=& ((a+a)+a)+a \\
   &=& (a+a)+(a+a)
\end{eqnarray}
```
***
[LaTeXコマンド集](http://www.latex-cmd.com/equation/equation.html) を参考にさせてもらいました.  
よりスマートな方法があれば教えていただけると嬉しいです.
geojson ファイルの図形の正常判定

こんにちは。
geojson ファイル内の各図形が正常かどうか（polygon の self-intersection など）を判定してみました。ogr2ogr ([GDAL](http://www.gdal.org/index.html)) を利用しました。

```console
$ cat input.geojson | ogr2ogr -f GeoJSON /dev/stdout /vsistdin/ -dialect sqlite -sql "select *, ST_IsValid(geometry) as ST_IsValid from OGRGeoJSON" | jq '.features[] | select(.properties.ST_IsValid == 1)' | grep ST_IsValid
    "ST_IsValid": 1
    "ST_IsValid": 1
    "ST_IsValid": 1
```
JSON・CSVからピボットテーブルを作ってくれるAtomパッケージ

JSONまたはCSVからピボットテーブルを作ってくれるAtomパッケージを作りました。

https://github.com/y-takey/atom-pivottable

# 使い方

1. AtomでJSON,CSVファイルを開くか、ファイルを新規作成しデータを入力(ファイルは保存していなくてOK)
2. 右クリックして `Pivot Tableize` を選択。
3. あとはピボットテーブルを好きなようにめちゃめちゃに。

![Pivot table](http://y-takey.github.io/atom-pibottable.gif)

# データの制約など

* JSONはプレーンな配列でも、配列要素をもったオブジェクトでもOKです。
  * 改行やタブなどが入っていても大丈夫です。
  * 配列要素が複数ある場合は、その数だけピボットテーブルを作ります。

```json:プレーンな配列の例.json
[{ a: 1, b: 2 }, { a: 3, b: 4 }]
```

```配列要素をもったオブジェクトの例.json
{ 
  foo: [{ a: 1, b: 2 }, { a: 3, b: 4 }], 
  bar: [{ c: 10, d: 11 }] 
}
```

* ピボットテーブルの行・列の初期フィールドは、それっぽい項目を適当に選んでいます。
  * それっぽさとは、先頭に近くて、データのユニーク件数が1〜10件。
  * このアルゴリズムは要改善。
Angular Material 実践 vol.1



最近１からAngularを実装する機会があったのですが、デザインをおこすのが億劫だと思い、AngualrMaterialならばPSDを作らずともいい感じのデザインになるのではないかと思い、手を出してみました。

その時はまったことなどを紹介します。

## Angular Materialとは
googleが提供している、AngularJS用のUIコンポーネントです。

## 導入
```
bower install angular --save
bower install angular-material --save
```

## 必要なJSを読み込み
```
jquery.min.js
angular.min.js
angular-material.min.js
angular-aria.min.js
angular-animate.min.js
angular-ui-router.min.js
angular-material.min.css
```

## Angular Material Design Table
- Angular Materialに良い感じのテーブルがなかったので、[MaterialDesiginTable](https://github.com/daniel-nagy/md-data-table#demo)を採用してみました。

導入

```
bower install angular-material-data-table --save
```

読み込み

```
md-data-table.min.js
md-data-table.min.css
```

## ControllerにDIする
```
angular
  .module('app', ['ngMaterial'])
  .controller('DemoCtrl', DemoCtrl);

function DemoCtrl() {

}
```

## html

```
<div ng-controller="DemoCtrl as ctrl" layout="column" ng-cloak>
  <md-content class="md-padding">
    <section layout="row" layout-sm="column" layout-align="center center" layout-wrap>
      <md-button class="md-raised">Button</md-button>
    </section>
  </md-content>
</div>
```

これでいい感じのMaterial Deginのボタンができたかなと思います。

![e07a7322b05ae2a4a28c34921a18df9e.png](https://qiita-image-store.s3.amazonaws.com/0/74237/e95e0872-1f74-4707-5393-84c8cb0a744d.png "e07a7322b05ae2a4a28c34921a18df9e.png")


↑こんな感じの。

一旦、導入までまとめました。
cssを定義しなくても良い感じにmaterial desiginを適用してくれるので、非常に便利かと思います。

簡単にmaterial desiginを適用したくなったら是非。
Visual Studioを起動せず、CordovaでWindowsストアアプリを作る

現在わたしは、Apache Cordovaをメインにアプリを制作しています。
しかし、Visual Studioは重い！アプリが重いだけでなく、頻繁に出てくる更新をインストールしていると、それだけで数時間潰れてしまいいつまで経ってもアプリ開発が出来ない。

そんなわけで、今回は、Visual Studioを起動せず、CordovaでWindowsストアアプリを作ってみます。
ただし、ビルドのためにVisual Studioが必要ですので、インストールだけはしておきましょう(おそらく、Visual Studio Tools for Apache Cordovaも必要です。事前にインストールしておきましょう)。

# 前準備
以下のアプリを入れておきましょう。インストール作業は省略します。

 * Visual Studio(Community Editionでも良いです)
 * Visual Studio Tools for Apache Cordova

# インストール
## Node.jsのインストール
まずはNode.jsをインストールします。以下のページからNode.jsをインストールします。

 * [Node.jsダウンロードページ](https://nodejs.org/en/)

Node.jsのインストーラーは一般的なインストーラーと同じですので、インストールにさほど迷うことはないでしょう。

インストール後、コマンドプロンプトを開き、`node -v`コマンドが実行できるのを確認してください。

```
> node -v
X.X.X
```

## Cordovaのインストール

次に、Cordovaをインストールします。コマンドプロンプトをそのままにして以下のコマンドを入力します

```
> npm install cordova -g

・・・ながながとインストール表示・・・
```

ひととおり終わったら、先ほどの`node`コマンドと同様、`cordova`コマンドでインストールをチェックします

```
> cordova -v
X.X.X
```

これでアプリのインストール処理は完了

# プロジェクトを作る

次に、Windowsストアアプリのプロジェクトを作っていきましょう。

プロジェクトを作成したいフォルダに移動して、コマンドプロンプトを開き、以下のコマンドを実行します。

```
> cordova create testapp takamichie.test TESTapp
Creating a new cordova project.
```

コマンドラインオプションは、次の通りになっています。

* 第一引数(上のtestapp):プロジェクトフォルダ名
* 第二引数(上のtakamichie.test):アプリのパッケージ名
* 第三引数(上のTESTapp):アプリ名

ここで注意！**Windowsストアアプリを作る場合、第二引数のパッケージ名には、.は1つしか使用できません！ふたつ以上指定するとあとでWindowsストアアプリをビルドする時点でエラーになります**

## Windowsプラットフォーム設定を行う
プロジェクトが作成できたら、プロジェクトフォルダに入って、Windowsのプラットフォーム設定を行います。

```
> cordova platform add windows
Adding windows project...
Creating Cordova Windows Project:
        App Name  : TESTapp
        Namespace : takamichie.test
        Path      : C:\temp\testapp\platforms\windows
Discovered plugin "cordova-plugin-whitelist" in config.xml. Installing to the project
Fetching plugin "cordova-plugin-whitelist@1" via npm
Installing "cordova-plugin-whitelist" for windows
```

とりあえずこれで完成。

# 実行する
そのまま実行する場合、続けて以下のコマンドを実行します。

```
> cordova run windows(今回はプラットフォームをWindowsしか指定していないので、最後の引数はなくても良い)
・・・ いろいろと処理 ・・・
```

最初の1回だけ、Cordovaに署名設定の権限を与えるため、UACを表示することになる旨確認してきます。とりあえず初回だけはコンソールから目を離さないように。

すると、CordovaアプリがWindowsストアアプリとして起動します。ぱちぱち。

![image](https://qiita-image-store.s3.amazonaws.com/0/14499/85ffb108-40a4-0434-6818-d2b0798b512f.png)

# ついでに 
この手法でアプリを作る場合に覚えておくと良いこと
## コマンドラインを使わずにアプリを実行したい
Visual Studio Codeあたりを利用するとよいです。

Visual Studio CodeのExtensionに、Cordova Toolsというものがあります。Command Paletteより、拡張をインストールします。
![image](https://qiita-image-store.s3.amazonaws.com/0/14499/ebf71829-8d21-7377-82ef-3d2c9f00c9dc.png)

再起動後、Command PaletteからCordova Runなどのコマンドが利用できるようになります。

## Git管理する場合

このプロジェクトをGitで管理する場合ですが、platformディレクトリ以外を全部コミットすれば良さそうです(ただし、クローン先では`cordova platform add windows`からやり直す必要があります)。まあ、あまりにたくさんのファイルをコミットするのもなんですし、これくらいで良いかなと。
【NetApp】Snapmirrorとは


いろいろな資料を見てみたので簡単にまとめてみます。

-
# ◯Snapmirrorとは…
- レプリケーションやDRに最適なNetAppの機能
- src側Volumeデータをdst側の別Volumeに対してデータコピーする（遠隔地も可）
- 機能モードとしては、Volume（推奨）とqtreeの2種類

-
# ◯仕組み
- volume snapirror は物理ブロックレベルで動作する
- src側の全Snapshotを含むVolume全体のコンテンツとVolume全属性をそのままレプリケートする
- srcとdstのONTAP version は同じまたは src側のメジャーバージョン以上である必要がある

-
# ◯動作
## ①ベースラインコピー（Base Snapshot）を作成
- Volume内のsrcからdstにレプリケートしたもの
- Base Snapshotのみ存在するケースで、Base Snapshotを削除してしまうと再度全同期となる

## ②定期的なレプリケーション
- 手動でも同期することが可能
- 一般的には、以下の3種類のモードを使用する
	- 非同期
		- src側で定期的にSnapshotコピーが作成される
		- 全快との差分のみがdst側に同期される
	- 同期
		- src側に変更が生じたら、即同期される
	- 半同期
		- 非同期と同期のようそを兼ね備えたモード

-
# ◯補足
`snap autodelete`機能は、Snapmirrorのsrc側にしか設定することができない
また、`snap autodelete`機能は接続形式に依存しないので、Snapmirrorの環境でも利用可能
Electron + Express.js のミニマム構成の Web アプリを作る

[Electron](http://electron.atom.io) ＋ [Express.js](http://expressjs.com/) を使ってローカルで HTTP サーバを動かして、.dmg ディスクイメージで配布可能な Mac 用の Web ベースのデスクトップアプリを、ミニマム構成で作成してみます。

---

こんな用途がターゲットです：

- Node.js / Express.js ベースの Web サーバアプリを作っている
- Browserify とかを使った Web クライアントアプリを作っている
- EC2 とかの外部サーバを使わずに、ローカルの Mac 上で動くデスクトップアプリとして配布してみたい

こんな用途はターゲットではありません：

- Electron の詳しい仕組みを知りたい場合
- Atom みたいな本格的なデスクトップアプリを作りたい場合
- Windows でも動くマルチプラットフォームなアプリを作りたい場合

---

（１）フォルダを作る

```
$ mkdir hello
$ cd hello
```

（２）最低限の package.json を書く

```package.json
{
  "name": "hello",
  "version": "1.0.0",
  "build": {
    "app-bundle-id": "com.example.hello",
    "app-category-type": "public.app-category.utilities"
  },
  "main": "main.js"
}
```

（３）最低限のウェブコンテンツを置いておく

```
$ mkdir public
$ echo 'Hello, Electron!' > public/index.html
```

※ 本当は public フォルダに Web クライアントアプリを置く。

（４）最低限の main.js を書く

```main.js
var electron = require("electron");
var express = require("express");
var exapp = express();
exapp.use(express.static("public"));
exapp.listen(3000, "127.0.0.1");
electron.app.on("ready", function () {
  var main = new electron.BrowserWindow({width: 800, height: 600});
  main.on("closed", electron.app.quit);
  main.webContents.openDevTools();
  main.loadURL("http://127.0.0.1:3000/");
});
```

※ 本当は express アプリの API サーバとかを実装する。
※ 本当は 3000 番ポート固定ではない方が良さそう。

（５）最低限に必要なモジュールをインストールする

```
npm install --save express
npm install --save-dev electron-prebuilt
npm install --save-dev electron-packager 
```

（６）とりあえず実行してみる

```
./node_modules/.bin/electron main.js 
```

![Electron](https://qiita-image-store.s3.amazonaws.com/0/12419/79c2f9b7-7264-d4b1-6067-4d7bfbb6ed3c.png)

（７）.app が入った .dmg のディスクイメージを作成する

```
./node_modules/.bin/electron-packager . --platform=darwin --arch=x64 --ignore=src --out=dist
hdiutil create -srcfolder dist/hello-darwin-x64/hello.app dist/hello.dmg
```

※ 配布しないソースコードのディレクトリを `--ignore` で指定できる。

（８）ディスクイメージを開いてみる

```
open dist/hello.dmg 
open /Volumes/hello
```

![hello.dmg](https://qiita-image-store.s3.amazonaws.com/0/12419/b2b6e81e-5685-3896-f71f-6eff70197158.png)

（９）アプリができました！

アプリの中身は以下のようなファイル構成でした。

```
/Volumes/hello/hello.app/Contents/Resources/app/app/index.js
/Volumes/hello/hello.app/Contents/Resources/app/app/server.js
/Volumes/hello/hello.app/Contents/Resources/app/main.js
/Volumes/hello/hello.app/Contents/Resources/app/node_modules/express/History.md
/Volumes/hello/hello.app/Contents/Resources/app/node_modules/express/index.js
/Volumes/hello/hello.app/Contents/Resources/app/node_modules/express/LICENSE
/Volumes/hello/hello.app/Contents/Resources/app/node_modules/express/package.json
/Volumes/hello/hello.app/Contents/Resources/app/node_modules/express/Readme.md
/Volumes/hello/hello.app/Contents/Resources/app/package.json
/Volumes/hello/hello.app/Contents/Resources/app/public/index.html
```

---

初めて Electron を使ってみたので、間違っているところがあったら教えて下さい。
iMacでgpuモードのchainerを動かしてみた


# iMac(late 2012)にてchainerをgpuモードで動かす
先日セミナーにてchainerを知り自分でも動かしてみたくチャレンジしてみました。

自宅のiMacはNVIDIAのグラボを載せていたのでどうせならgpuモードで
動かしたかったのですがなかなか成功せず苦労しました。。。

なんとかmnistをgpuモードで動かすことに成功したので、記録として記述します。

以下の内容は2016/3時点の内容です。

## 環境
マシン   : iMac(late 2012)
CPU     : Core i7 3.4GHz
メモリ   : 24GB
GPU     : GForce GTX 680MX
OS      : 10.11.4(El Capitan)



## pythonのインストール

+ pyenvをインストールしてver 2.7.11をインストール
+ pyenv-virtualenvをインストールしchainer用の環境を作成
+ .bash_profileに以下を記述

```bash:.bash_profile
#pyenv
export PATH="\$HOME/.pyenv/bin:\$PATH"
eval "\$(pyenv init -)"
eval "\$(pyenv virtualenv-init -)"
```

## chainerのインストール(cpuモード)
pyenv_virtualenvで作成した環境をdefaultにした前提で

```
pip install chanier
```

以上でmnistのサンプルコードをダウンロードしてgpu=-1で実行したところ成功
cpuモードは超簡単!



## cudaのインストール
gpuモードで動かすためにcudaをインストールした

+ NVIDIAのサイトからMacOS用をダウンロード(Ver 7.5)
https://developer.nvidia.com/cuda-downloads

+ 以下のページからcudnnをダウンロード（登録の必要あり）
https://developer.nvidia.com/cudnn

+ cudaのインストーラを起動してインストール
+ cudnnのファイルを解凍しファイルをコピー
  include -> /Developer/NVIDIA/CUDA-7.5/include
  lib     -> /Developer/NVIDIA/CUDA-7.5/lib

+ .bash_profileに以下を記述

```bash:.bash_profile
## cuda 7.5
export PATH=/Developer/NVIDIA/CUDA-7.5/bin:/Developer/NVIDIA/CUDA-7.5/bin/nvcc:$PATH
export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-7.5/lib:$DYLD_LIBRARY_PATH
```

+ chainerを再インストール

```
pip uninstall chanier
pip install chanier
```

+  mnistのサンプルコードをgpu=0で実行
　->失敗(import cupyでエラー)

+ 調べてみたところEl CaptitanではDYLD_LIBRARY_PATHの上書きが有効にならないとの記事をみつけたので、試しにcudaのライブラリを/usr/local/cuda/libにリンクを貼ってみた

```
-s /usr/local/cuda/lib/* /usr/local/lib
-s /Developer/NVIDIA/CUDA-7.5/lib/* /usr/local/lib[^1]
```

[^1] /usr/local/cudaと/Developer/NVIDIA/CUDA-7.5のlibをそれぞれリンクしているのは、libフォルダだけ別のファイルが入っているため

+ 再度chainerを再インストールしてコードを実行
　　>失敗(xcode7.3 のcommand line toolsのバージョンが対応していないっていうエラーっぽい）

```
"nvcc fatal : The version ('70300') of the host compiler ('Apple clang') is not supported".

```

## XCodeの設定変更

+ Command Line Toolsをダウングレードしたいので、以下のページからxcode ver 6.4をダウンロード
https://developer.apple.com/downloads/

+ xcode.app(6.4)のパッケージの中のXcodeDefault.xctoolchainフォルダをXcode640.xctoolchainにリネームしてxcode(使ってる新しいやつ)の同じ場所にコピー

![xcode64.jpg](https://qiita-image-store.s3.amazonaws.com/0/119290/f968ed61-2d8a-2edf-e14e-5ddfaec6f44d.jpeg)


+ xcodeを起動して"preferences"-"Locations"の中の"Command Line Tools"のプルダウンを"Xcode 6.4"に変更

+ 再度chainerを再インストールしてgpu=0でコードを実行
　-> 成功!!


## まとめ
NVIDIAのGPUを載せたMacならchainerをGPUモードで動かせることが確認できた。
ディープラーニングによく使われるGPUに比べたら非力なGPUだが、それでもCPUよりは高速に学習していて感動でした。
やっと環境が構築できたので、これから中身を触っていこうと思います。
C++のためのAPIデザイン 読書メモ 第1章

http://atosh.hatenablog.com/entry/2016/03/31/224142

太字は個人的に気に入った文の引用。

# はじめに
## APIとはなにか
ソフトウェアコンポーネントに対するクライアントの操作方法を定義したもの。
ソフトウェアコンポーネントとは、ある抽象化された問題に対するソリューションを実装したもの。
## APIを設計する目的
実装の詳細を完全に隠蔽しながら、コンポーネントの機能に対する論理的なインターフェースを提供すること。アプリケーションを機能、レイヤーごとにコンポーネント化し、それぞれが独立したAPIを備えることで、分業して開発されたものを統合するだけでアプリケーション開発ができる。
## APIの構成要素
1. ヘッダファイル: クライアントコードにコンパイルさせるインターフェースの集合。
2. ライブラリ: APIの機能を実装したスタティック/ダイナミックライブラリ。クライアントアプリケーションはこれらをリンクする。
3. ドキュメント: APIの使用に関する概要情報。

## API設計の特殊性
アプリケーション開発と違うところ。
1. APIは開発者のためのユーザーインターフェースである。使いにくいとユーザーは離れていく。
2. APIは複数のアプリケーションで再利用される。APIのエラーはそれを使うすべてのアプリケーションに影響する。
3. APIに変更を加えるたびに後方互換性に配慮することが重要。バージョンアップのたびにクライアントコードがコンパイルできなくなったり、動作が変わったりしてはならない。変更のたびにAPIレビューを行い、妥当な変更であることをチェックしなければならない。**優れたAPIはクライアントに迷惑をかけずに根本的な変更や改善を行っていける**。
4. 優れたドキュメントが必要。ユーザーがコードを見て使い方を類推するのでは、適切な使われ方がされない可能性がある。
5. 自動テストが必要。APIの正確性は数千人もの開発者とエンドユーザーに影響する。変更するたびにリグレッションテストを行うこと。すべてのリリースが安定していること。

## APIの必要性
自分を助けるために。
1. 実装を隠すことで、ユーザー(開発者)を混乱させずに変更を加える事ができる。クライアントコードに変更を強いるAPIはユーザーが離れていく。
2. アプリケーションの各コンポーネントがAPIの抽象インターフェースのみに依存していれば、モジュール化が促進され、疎結合となり、保守可能性が上がり、製品の寿命が伸びる。
3. コードの重複を削除できる。**コードの重複はソフトウェア工学における大罪であり、可能な限り撲滅しなければならない**。インターフェースの元にロジックをまとめておけば、1箇所の変更ですべてのクライアントコードに影響をあたえることができる。
4. ファイル名や各種定数値などをAPI呼び出しでアクセスできれば、ハードコードされた値を撃退できる。
5. 実装が隠れているので、リファクタリングや最適化も用意になる。
6. 優れたAPIは再利用可能であり、複数のアプリケーションに組み込むことができる。それにより開発サイクルを短縮でき、アプリケーションのコアロジックに専念できる。
7. 並行開発が可能になる。自分が作成したAPIを同僚が使って別のプログラムを開発する際に、APIの仕様を予め取り決めておき、ヘッダとスタブ実装のみ提供しておけば、同僚はAPIの完成を待つことなく自身の作業を進められる。

## APIを仕様すべきでない場合
サードパーティ製のAPI選定基準。
1. ライセンス条項による制約がある場合。商用アプリケーションに対するGPLなど。
2. 機能が足りない、プラットフォームのサポートがない場合。
3. APIにバグがあるのに、実装ファイルが公開されていないためにバグを追跡できない場合。開発がAPIの問題で律速される。
4. ドキュメントがない場合。使用方法が明確でなかったり、特定の条件での動作が不明なAPIや、**時間を割いて自分のコードを説明しようとしないエンジニアの仕事は信用できない**。

## APIの種類
1. OSAPI。POSIXだとfork()でWindowsだとCreateProcess()だとか。
2. 言語API。C++だとlibcやSTL。システムコールを隠蔽したり、抽象アルゴリズムのセットを提供したり。
3. 画像API。libjpeg，libtiffなど。画像ファイルの操作のまとまりを提供する。
4. 3DグラフィックスAPI。OpenGL、DirectX。グラフィックカードドライバへのアクセスを抽象化する。
5. GUI API。Qt、GTK+など。OSによるGUI APIの差異を吸収する。

## ファイル形式とネットワークプロトコル
独自のファイル形式を作成した場合や、クライアント/サーバー間でやり取りされるデータ形式を用意した場合、それとセットでAPIも必ず作成すること。そうすることで仕様の詳細や将来的な変更も集約させて隠蔽できる。
クライアント/サーバーがAPIのみに依存し、通信の詳細が隠されていれば、UDPからTCPへの変更なども容易となる。
(日本での)所得税を計算する npm module を作りました

所得額から所得税を計算する npm module を作りました。

https://github.com/kt3k/japanese-income-tax

# Install

npm 経由で

    npm install japanese-income-tax

# API

```js
var tax = require('japanese-income-tax');
```

## tax.incomeTax(taxableIncome)

課税所得から、所得税を計算します。

## tax.specialIncomeTax(taxableIncome)

課税所得から、復興特別所得税を計算します。

## tax.totalIncomeTax(taxableInome)

課税所得から、通常の所得税と、復興特別所得税の合計を計算します。

## tax.actualIncomeTax(taxableIncome)

課税所得から、実際に税務署に払う税額を計算します。(実際に払う税額は所得税と復興特別所得税の合計値から下2桁切り捨てた値になります)

## tax.residentTax(taxableIncome)

課税所得から、住民税を計算します。

# 例

```
> var tax = require('japanese-income-tax')
> tax.incomeTax(8005000)
1205150
> tax.specialIncomeTax(8005000)
25308
> tax.totalIncomeTax(8005000)
1230458
> tax.actualIncomeTax(8005000)
1230400
> tax.residentTax(8005000)
800500
```
Google Apps Script でメールにアクセスする方法メモ

# ラベル操作

## メールのスレッドをラベルで取得する
```js
  var target_label = '取得したいラベル名';
  var mail_by_label = GmailApp.getUserLabelByName(target_label);
  var threads = mail_by_label.getThreads();
```

## 各スレッドのメールを取得する

```js
  var messages;
  for (var i = 0, l = threads.length; i < l; i++) {
    messages = threads[i].getMessages();
    // スレッド内のメール一件ごとの処理をここで書く
  }
```

## 処理したスレッドからラベルを外す
（ `mail_by_label`  `threads` は前述）

```js
  mail_by_label.removeFromThreads(threads);
```

トリガーを設定して受信メールを操作しているときなどは忘れずに。
PostgreSQLやMongoDBなど、OSSデータベース環境が簡単に作れるらしい

Bluemixを彷徨っていたら、Composeというサービスがあるらしい・・。

IBMが買収して、OSSのデータベースのDBaaSサービスを提供してるようで。
http://www-03.ibm.com/press/jp/ja/pressrelease/48389.wss

MongoDBとか、PostgreSQLとか、その他にも有名な（触ったこと無いけど、有名だということは知ってる！）OSSのデータベースが提供されている・・
![スクリーンショット 2016-03-31 22.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/119378/e36e4cc4-b316-9db0-450e-c132e300bb85.png)

この機会にせっかくだから、色々試してみるのが面白いかも。

Bluemix、色々ありすぎて結構迷うけど、でもちゃんと中身を吟味すれば結構面白いサービスが提供されている気がする（見てるだけでも楽しい）。
Unity5.3.4でのuGUI応用　BaseVertexEffect→BaseMeshEffect

いまさらですがUNITE2015の復習というかちゃんと見ていなかったので見なおしていました。
「uGUIの応用と拡張 ～uGUIをさらに使いこなすには～」
https://vimeo.com/125239931


Textの表示を加工するにはBaseVertexEffectを使えばいいのか。
ということでUnityのリファレンスを見に行くと・・・

http://docs.unity3d.com/ScriptReference/UI.BaseVertexEffect.html
**Removed in version 5.3.3 
Use BaseMeshEffect instead**

BaseMeshEffectクラスを使うようになってる！
ということでサンプル的なものが落ちてないかと探しに行くと・・・
http://toriden.hatenablog.com/entry/2015/09/09/085408
というサイトがあったのですがこれをまるコピペしてもビルドエラー。

いつの段階かわかりませんがModifyMesh関数の定義が変わったようで
以下、上記のサイトと同じことをするソースが以下。

```csharp:sample
using System.Collections;
using System.Collections.Generic;

using UnityEngine;
using UnityEngine.UI;

public class DirectionalGradation : BaseMeshEffect
{
	[SerializeField]
	Color32 color = Color.white;

	[SerializeField]
	[Range(0f, 360f)]
	float angle = 0f;

	public override void ModifyMesh(VertexHelper vh)
	{
		var list = new List<UIVertex>();
		vh.GetUIVertexStream(list);

		float max = float.MinValue;
		float min = float.MaxValue;

		var vector = new Vector2(Mathf.Cos(Mathf.Deg2Rad * angle), Mathf.Sin(Mathf.Deg2Rad * angle));
		foreach(var it in list)
		{
			var dot = it.position.x * vector.x + it.position.y * vector.y;
			max = Mathf.Max(dot, max);
			min = Mathf.Min(dot, min);
		}

		if (max == min)
		{
			return;
		}

		for (int i=0, count=list.Count; i <count ; ++i)
		{
			var vertex = list[i];

			var dot = vertex.position.x * vector.x + vertex.position.y * vector.y;
			var t = Mathf.InverseLerp(min, max, dot);
			vertex.color = Color32.Lerp(vertex.color, color, t);
			list[i] = vertex;
		}

		vh.Clear();
		vh.AddUIVertexTriangleStream(list);
	}
}
```

Unityの進歩と変化が速くて大変ですね。
この記事の賞味期限もいつまでもつやら。
VR Panorama 360 PRO Renderer 設定項目

#はじめに
Unity で 360 度動画としてキャプチャできるアセット。設定項目が多いのでメモ。

[VR Panorama 360 PRO Renderer](https://www.assetstore.unity3d.com/jp/#!/content/35102)
有償：40$
環境：Unity 5.0.1 以上

#設定項目

##VR Panorama 
|プロパティ名|機能|備考|
|:--|:--|:--|
|Capture Type|キャプチャ種別|Video Capture (一般) <br> Equidistant Stereo (正距円筒図法 上下２つ) ※ VR HUDs 向け <br> Equidistant Mono (正距円筒図法 1つ) ※ 360度動画向け||
|Sequence Format|出力ファイル種別|JPG or PNG|
|Save to Folder|出力先ディレクトリ名|プロジェクト直下に指定した名称でディレクトリを設置|
|Open Destination Folder|出力完了時にフォルダを開く||
|Resolution|解像度|2048 (デフォルト値)|
|Resolution Preset|解像度のプリセット|Google Cardboard 1024 x 1024 <br> GearVR Standard 2048 x 2048 <br> Milk VR Standard 4096 x 4096|

##FPS
|プロパティ名|機能|備考|
|:--|:--|:--|
|FPS|フレームパーセント|50 (デフォルト値)|
|FPS Preset|FPS のプリセット|24 25 30 50 60 75 90 100|
|Number of frames to render|何フレームおきに描画するか|200 (デフォルト値)|
|Resume fromframe|何フレーム目から描画を開始するか|0 (デフォルト値)|

##Panorama Settings
|プロパティ名|機能|備考|
|:--|:--|:--|
|IP Distance|瞳孔間の距離|0.064 (デフォルト値) 平均的な人間の瞳孔間|
|Environment Distance|画像をパノラマにスティッチする際の補正値|2.83 (デフォルト値) シーンが広ければ大きい値にするとよい レンジは 2〜9 あたりに設定するとよい|
|Align with Horizont|カメラの平行を保持する||

##Optimizations
|プロパティ名|機能|備考|
|:--|:--|:--|
|Use Depth buffer|深度バッファ|RenderTexture.GetTemporary で深度バッファを使用する <br> 迅速にレンダーテクスチャの表示を行いたい場合に使用する|
|Speed vs.Quality|速度優先か品質優先か|32段階設定|

##Audio
|プロパティ名|機能|備考|
|:--|:--|:--|
|Audio Volume|音量|0〜1|
|Mute while Rendering|レンダリング中はミュートにする||

##Encode H.264
|プロパティ名|機能|備考|
|:--|:--|:--|
|Encode H.264 video after rendering|出力後にH.264エンコードを実行してmp4を生成するかどうか||
|H.264 Bitrate|ビットレート|12000|
|Encode H.264 Video From Existing sequence|出力された画像を使ってエンコード実行する||
|Encode best quality video for Gear VR from 4k sequence|出力された画像を使ってGearVR向けにエンコード実行する||

##Notify by Email
|プロパティ名|機能|備考|
|:--|:--|:--|
|Notify by Email|メールで通知するかどうか||
|Send confirmation Email TO|通知するメールアドレス||
|FROM Gmail Adress|通知する先の Gmail アドレス||
|Gmail Password|通知する先の Gmail パスワード||

##Change image name prefix
|プロパティ名|機能|備考|
|:--|:--|:--|
|Change image name prefix|出力ファイルのプレフィックスを変更するかどうか||
|image name prefix|出力ファイルのプレフィックス名||

##Button
|プロパティ名|機能|備考|
|:--|:--|:--|
|Open destination folder|出力先のフォルダを開く||
|Capture Audio|オーディオを出力する||
|Render Panorama|連番画像を出力する||


##サンプル
![ui.png](https://qiita-image-store.s3.amazonaws.com/0/56504/add4d942-0dbe-70b3-0883-52cf7f51692a.png)
初心者がこれから学ぶべき言語を目的別にまとめてみた

前回、[初心者が初心者なりに初心者向けに様々な言語を分類してみた](http://qiita.com/blog3nt/items/6f01565ff4a8accb5fa9)という記事を書いたところそれなりの反響をいただいたので、もう一度似たようなテーマで言語を紹介します。今回は、何をしたいか、にフォーカスして言語を分類します。
##Webページを作りたい
**HTML、CSS、JavaScript**
Webページを作りたければ、一般的にフロントエンド言語と呼ばれるこの３つを習得しましょう。HTMLはマークアップ言語と呼ばれるものの一種で、Webサイト上の要素の構造を書く言語。CSSはその付属品で、デザインを指定するためのもの。JavaScirptは動きをつけたり、ブラウザ上で完結する処理を行うためのプログラミング言語です。簡単なWebサイトはこの３つによって動いているため、この３つを習得するのが楽しいでしょう。環境構築が簡単なのも良い点。
##サーバーを利用する、より複雑なWebサイトを作りたい
フロントエンド言語に加えて、**Ruby、PHP、Python**のいずれか
簡単に習得しやすいサーバーサイド言語といえば、Ruby、PHP、Pythonの3つみたいです。それぞれに様々なフレームワーク（拡張機能）があるため、比較的簡単にWebサイトを制作することが可能です。
とにかく手っ取り早くWebサイトを作りたければRuby（Ruby on Rails）を、他の分野で役に立つ言語を学びたければPythonを学ぶとよいでしょう。PHPはよく使われている言語ですが、優位性がよくわかりませんでした。
##スマホアプリが作りたい
**Java(Android)、Swift(iOS)**
作りたいものが明白にあるなら、作るための言語を学びましょう。
Androidアプリを作るために利用されるJavaは歴史が古く、様々なことができる言語ですが、習得が難しめで、コードが長くなりやすいという欠点があります。
SwiftはApple社が自社製品のために開発した言語で、iOSアプリを作るために使います。Swiftを持ちた開発環境を構築するためにはMacが必要です。
##本気でゲームが作りたい
**C#**
Unityというゲーム開発プラットフォームで利用されているC#という言語を学ぶとよいでしょう。もしくは、CやC++でゴリゴリ書いていくか。軽いゲームなら大体どんな言語でも作れるみたいです。
##人工知能とか機械学習とかAIとか統計とかあの辺やりたい
**Python、R、Julia**
３つの言語の比較としては
R：統計専門言語。研究分野でよく名前を聞く。標準で統計にまつわる様々な機能が付いている反面、実行が遅め、何かを作ろうとすると別の言語が必要などの理由から落ち目っぽい。
Python：いろいろできる上に統計機能が充実してきた。数年前は「やっぱPythonじゃダメだ、Rを使おう」みたいな状況だったが、最近は様々な機能が使えるようになり、Rのお株を奪っているらしい。
Julia：これからに期待の言語。新しめ。早くいろんなことができるらしい。なんかいいらしいと聞くけど私は詳しく調べていないのであんまり説明できません。
##初心者だから書きやすい言語で遊んでみたい
**Ruby**
私の趣味なので異論はあるでしょうが、書きやすい言語で遊んでみたいのならRubyをおすすめします。Rubyは直感的に理解しやすく、煩わしいルールが少ないため、学びやすく、遊ぶやすい言語です。
##プログラミングの基礎からきっちり学びたい
**C、C++**
CやC++はかなり昔からある現役の言語です。長所は、なんでも作れる、実行が早い、コンピュータの基礎的なことが学べる（メモリの管理など）ことです。欠点は、コードが長く冗長になりやすいこと、細かなルールが多く習得が難しいこと。初学者が最初に学ぶ言語としてオススメする人がけっこういる。個人的には初心者がCやC++やったらよほど適性がないと挫折すると思う。
##これから流行りそうな言語を学びたい（私の予想する流行りそうな言語）
**Go、Scala、Python**
Go言語はGoogle社が開発した言語です。シンプルな言語を目指して作られたそうで、用途は選びますが開発需要は高まりそうです。
Scalaは、誕生の過程で学術的な意図が見え隠れする言語です。関数型でありかつオブジェクト志向なんだとか（よくわかっていない）。開発需要は少しずつ増している印象。Scalaのクイズ本に手を出してみたいと思いつつ、他の言語の優先度が高くて手を出せずにいます。
Pythonは先ほどから何度か出てきますが、人工知能、機械学習と関わりの深い言語です。人工知能系企業の採用言語は大体Pythonなイメージなので将来性が高そうです。ちなみに、日本ではあまり普及していません。
Capistrano で実行される bundle install で任意の Gemfile ファイルを使う

# 固定のファイルを使う方法
```rb
set :bundle_gemfile, "/path/to/gemfile"
```

# デプロイ対象の環境変数で指定した BUNDLE_GEMFILE を使う方法
```rb
set :default_shell, "bash -l" # .bash_profile で指定した場合は環境変数をロードさせる
set :bundle_gemfile,  '$BUNDLE_GEMFILE'
```

# bundle_gemfile を解釈しているソースコード
たぶんこのあたりと予想
https://github.com/bundler/bundler/blob/3a09448d8b060f2688dbc73bfa1eb08e1bd126f3/lib/bundler/cli.rb#L20-L21
[CakePHP2] find時のSQLをログに出力

# CakePHPでfind時のSQLをログに出力

## find実行した後に書きを記述

<pre>
$this->log( $this->{モデル名}->getDataSource()->getLog(), LOG_DEBUG);
</pre>

* LOG_DEBUG： app/tmp/logs/debug.log
* 省略時： app/tmp/logs/error.log

## 画面に出すなら

<pre>
pr( $this->{モデル名}->getDataSource()->getLog() );
</pre>

<pre>
var_dump( $this->{モデル名}->getDataSource()->getLog() );
</pre>

とか。

_*※ 注意：デバッグレベル 2以上でないと、出力されない
core.php（baserCMSの場合は install.php）に Configure::write('debug', 2); または Configure::write('debug', 3);  を記述する必要あり*_
[Mac] git svn 実行時に発生するエラーの対応方法

# git svn 実行時に発生するエラーの対応方法

## Fixing git-svn on OS X El Capitan (10.11.x)

ref: https://paulschreiber.com/blog/2015/11/09/fixing-git-svn-on-os-x-el-capitan/
<pre>
sudo mkdir /Library/Perl/5.18/auto
sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi‌-2level/SVN /Library/Perl/5.18/darwin-thread-multi-2level
sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi‌-2level/auto/SVN /Library/Perl/5.18/auto/
</pre>

## Fixing git-svn on OS X Yosemite (10.10.x)

ref: http://www.contrid.co.za/2014/10/solved-os-x-yosemite-git-svn-broken/
<pre>
sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi-2level/SVN /System/Library/Perl/Extras/5.18/SVN
sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi-2level/auto/SVN/ /System/Library/Perl/Extras/5.18/auto/SVN
</pre>

## Fixing git-svn on OS X Mavericks (10.9.x)

ref: http://anton0825.hatenablog.com/entry/20140221/1392974288
<pre>
sudo ln -s  /Applications/Xcode.app/Contents/Developer/Library/Perl/5.16/darwin-thread-multi-2level/SVN /System/Library/Perl/Extras/5.16/SVN
sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.16/darwin-thread-multi-2level/auto/SVN/ /System/Library/Perl/Extras/5.16/auto/SVN
</pre>
ICH10RのdmraidにUbuntu 14.04をインストールする

ICH10RのdmraidにUbuntu 14.04をインストールしたときの忘備録
===================================================

DELL T3500はIntelのICH10Rというチップセットを使っている。
ICH10RのRAIDはFakeRAID。

パーティションの設定とGRUBのインストールでハマる。
[dmraid on ICH10R controllers](http://qiita.com/iruka/items/f6078546703dcf38bab1)を参考にさせていただいた。

インストーラ
------------

インストーラはAlternative downloadsのNetwork installerのUbuntu 14.04 LTS (Trusty Tahr) Netbootを使う。

RAIDの設定
---------

BIOSでSATA Operationの設定をRaid onにする。その後CTRL-IでRAIDを構築する。今回はRAID1にした。

パーティションの設定
------------------

Ubuntuをインストールする前にインストーラをRescueモードで起動しpartedでパーティションを作っておく

     % parted /dev/md126

md126の数字の部分は変わるかもしれない。

パーティションは以下のように設定する。

- パーティションテーブル（ラベル）はmsdosにする
- 第1パーティションは/bootにしてboot flagをonにする。フォーマットはext4
- 第2パーティションはlvmにする

lvmの設定はインストーラからできる。

インストール
-----------

Expert Installで普通にインストール。