OmniAICreator/Qiita-1.07M huggingface dataset:
基本的なOpenVPNの構築手順

サーバーはFedora Server 23、クライアントはWindows 10の場合。

# ダウンロード

https://openvpn.net/index.php/download/community-downloads.html

これを書いた当時は2.3.10が最新だったが、適宜その時の最新版を取得。

# サーバー側の設定

ここが便利： http://www.openvpn.jp/document/how-to/
本家のHow-toを日本語化してくれている。

## インストール

RPMを作るのがオススメらしい。

```
dnf group install "RPM Development Tools"
dnf install openssl-devel lzo-devel pam-devel
rpmbuild -tb openvpn-2.3.10.tar.gz
dnf install /root/rpmbuild/RPMS/x86_64/openvpn-2.3.10-1.x86_64.rpm
```

## 認証局の設置

How-toではEasy-RSAという便利スクリプト集を使って認証局の設置や鍵の生成を行う流れになっているが、これはいつからか同梱されなくなっている。リポジトリが分割されただけなのだが、3.0というバージョンがリリースされている。

https://github.com/OpenVPN/easy-rsa/releases/download/3.0.1/EasyRSA-3.0.1.tgz

How-toに書かれているコマンドは2.0系らしい。互換性はないが、3.0が今後の主流になっていくだろう。

> で、もちろん3.0に関するドキュメントはあまりないし、あってもPKIの基本的な知識がある前提で書かれている。PKIに関して少しググって勉強しておく必要がある。コマンドコピペはさすがにちょっとマズいことが起きそうな気がする。

```
./easyrsa init-pki
./easyrsa biuild-ca
./easyrsa gen-dh
openvpn --genkey --secret ./pki/ta.key
```

気がするけど、実はこれだけだった……。`init-pki`で必要なフォルダを作成したり、以前のデータを削除したりして、きれいにする。`build-ca`で証明書と秘密鍵を生成し署名。これで認証局になれる。`gen-dh`は鍵交換アルゴリズムに使う素数の生成。`ta.key`は後述。

## 鍵と証明書の作成

サーバーの鍵と証明書を生成して署名、をコマンド一発でやってくれる。

```
./easyrsa build-server-full server nopass
```

サーバーの鍵にパスワードを付けるとサービス起動時にめんどくさいので、`nopass`オプションを付けてしまった。

## サーバー設定

```
mkdir /etc/openvpn
cd pki
cp ta.key ca.crt dh.pem private/server.key issued/server.crt /etc/openvpn
cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/server.conf /etc/openvpn
```

変更する設定は以下。あとはデフォルト。

```conf:/etc/openvpn/server.conf
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-auth /etc/openvpn/ta.key 0
user nobody
group nobody
```

`tls-auth`を設定しておくと、VPNセッション開始時のパケットをHMACで認証し、認可されないパケットは破棄されるため、DDoS攻撃を防ぐことができる、みたい。オープンなVPNサーバーを建てる時には設定しておくことがオススメらしい。`ta.key`は静的共有鍵なので、安全な方法で配送される必要がある。鍵を持ってる人に菓子折とUSBメモリを持っていくとよいだろう。

また、今回は推奨されるがままUDPを使用したが、クライアントがproxy経由でVPNを張ることが予想される場合は、TCPを使えるようにサーバー側を設定する必要がある。

設定ファイルを書いたら、まずはフォアグラウンドで動作確認。

```
openvpn /etc/openvpn/server.conf
```

ちゃんと動作したらサービス化する。

```
systemctl enable openvpn
systemctl start openvpn
```

FirewallDってのはなかなか便利。

```
firewall-cmd --add-service openvpn
firewall-cmd --permanent --add-service openvpn
```

# クライアント側の設定

## 鍵と証明書の生成

```
./easyrsa build-client-full client
```

サーバー側で生成しちゃって、`ca.crt client.crt client.key ta.key`をSCPとかでこっそり持ってきちゃうと楽。

なんとなく鍵にパスワードを付けたが、これはVPNでを張る際のプロトコルの頑健性とはあまり関係がない。ASCII文字集合を全部使って2000文字くらいにすればいいかもしれないけど……。PCを共有していて、パスワード知っているユーザーだけがVPN張れる、みたいなユースケースとかにはたぶん便利。

## クライアント設定

クライアント側の設定ファイルもSampleがあるので、それをもとに作成する。Windowsでは`C:\Program Files\openvpn\sample-config\client.opvn`を`C:\Program Files\openvpn\conf`にコピーして、適宜編集する。

```conf:openvpn\config\client1.conf
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\client.crt"
key "C:\\Program Files\\OpenVPN\\config\\client.key"
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1
```

￥は二重に書くこと。また、パスに空白を含む場合は全体をダブルクォーテーションで囲む。このエラーはopenvpn-guiのログには出ないので、「なぜかつながらない」という事態になり、ファイヤーウォールなどを確認しはじめて、結果路頭に迷う、もとい、迷った。設定ファイルがちゃんと書けているかを、コマンドプロンプトからopenvpnを起動して確認するのが吉。

あとはopenvpn-guiを起動すると、右下のアイコンから"client1"の接続設定でVPNが張れるようになる。
curlでmultipart post時にファイルのContent-Typeを指定する方法

multipartはContent-Typeが`Content-Type: multipart/form-data`なのでheaderオプションでContent-Typeを上書きしてしまうと意図した動きにならない。

postするファイルのContent-Typeを指定する場合は`@file`の後ろに`type`で指定する。

```bash
curl -F "file=@file.caf;type=audio/x-caf" ...
```
Yeoman 三連発

娘たちの攻撃をかいくぐりながらの Yeoman 三連発。
generator はグローバルではなくローカル領域に導入。Python、Ruby は入れてない。

# Webapp
generator-webapp

```
npm install generator-webapp
yo webapp
grunt serve
```

# AngularJS
generator-angular
Sass が有効だとエラー。

```
npm install generator-angular
yo angular
grunt serve
```

generator-angular-fullstack
chocolatey で mongodb が入らなかったので萎えた（mongodb gb.mongodb 双方NG）。

# reactjs
generator-react-webpack

```
npm install generator-react-webpack
yo react-webpack
grunt serve
```

generator-react-fullstack

```
npm install generator-react-fullstack
yo react-fullstack
npm start
```

# Aurelia
generator-aurelia
三連発といったな。あれは嘘だ。
要 gulp jspm

```
npm install -g jspm gulp
npm install generator-aurelia
yo aurelia
gulp watch
```

# 補遺
割と簡単に github の API 制限に達するので、トークンを登録しておくとよい。
API トークンは github で Setting > Personal access tokens で払い出す。
```
jspm registry config github
```
Xcode7 で UIWebView の loadData に Passing a null to a callee that requires a non_null argument が出た時の解消法

## 警告の内容
解消方法を探すのに少し時間がかかったので、メモしておく。
Xcode7とiOS9にアップデートしてビルドすると、以下のような警告が出る。

![SettingViewController_m.png](https://qiita-image-store.s3.amazonaws.com/0/37385/976c8fc8-7f3a-7aa3-0056-05dbc5f67202.png)

警告文を訳すと「Nullじゃない呼び出し元にNullを渡している」みたいな感じか。

## 解消方法
とりあえず、`baseURL:`の`nil`を、`[NSURL URLWithString:@"http://"]`に変更すればOK。

![SettingViewController_m.png](https://qiita-image-store.s3.amazonaws.com/0/37385/6ff522c4-e851-789f-1821-9d071b655b25.png)

## 警告の原因
`baseURL:`の引数の型を確認すると、`NSURL`で`Nonnull`が指定されている。

![SettingViewController_m.png](https://qiita-image-store.s3.amazonaws.com/0/37385/ad1bcf38-e340-d42e-3896-7a75dd4f413b.png)

なので、適当なURLを指定してあげればいいのかなと。
Xcode6.4とiOS8では出なかった警告だったので、ちょっと調べてみました。

## 参考資料
- http://iaintheindie.com/2015/08/16/updating-apps-for-ios-9/
- http://stackoverflow.com/questions/32469677/passing-a-null-to-a-callee-that-requires-a-non-null-argument-after-switch-to-xco
Androidのメモリ効率化Tips "SparseArray"


## はじめに
前回に引き続き[Android Performance Pattern](https://www.youtube.com/watch?v=dgzOwuoXVJU&index=2&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE)の内容をまとめました。AndroidのPerformance効率化についてのTipsが書かれているのですが、いかんせん英語でとっつきにくいので(内容は少しだけどためになるものばかり)簡単にまとめました。

## SparseArray
SparseArrayは、以下のようなヒエラルキーになっていてオブジェクトクラスの直下にある。Arrayというだけあり、配列のように利用できる。
大きな特徴はCollection, Map系とは違いオートボクシングを行わない。オートボクシングを行わないので、早い。

![Kobito.MFFSUj.png](https://qiita-image-store.s3.amazonaws.com/0/43762/06d48be6-cafe-14d0-573f-ee0d75d5e0d0.png "Kobito.MFFSUj.png")




## まずAuto Boxing(オートボクシング)とは
### 目的とメリット: primitive -> Object型への変換でprimitiveでは利用できなかった使い方・メソッドを利用できる。

オートボクシングとはJava5自体の機能である。
元来、リスト、コレクション(List, Collection)に対して、プリミティブ(int, flaot, booleanなど)な値は直接代入することができなかった。リスト、コレクションに代入するには、 **プリミティブラッパークラスに代入** する必要性があった。(List, Collectioはオブジェクトしか扱えない。)
この **プリミティブラッパークラスに代入** を自動で行ってくれる機能がオートボクシングである。

![Kobito.rQYh5s.png](https://qiita-image-store.s3.amazonaws.com/0/43762/5dba2931-029b-e8b1-4b24-875a6b7e5cd6.png "Kobito.rQYh5s.png")

``` Java
// 例)

// 元来の書き方: 
List<Integer> list = new ArrayList<Integer>; //リストの初期化
list.add(Integer.valueOf(3)); //int -> Integerオブジェクトに変換してリストに追加

// オートボクシングによる書き方(Java5以降)
List<Integer> list = new ArrayList<Integer>; //リストの初期化
list.add(3); //int -> 上記作業を自動で行ってくれる。
```

## オートボクシングでのループ
上記のようにオートボクシングにより便利になった側面は否めないが、逆に意識しなくてよくなったことにより、メモリ上でデメリットが生じる可能性がある。

* 以下において、上部のループはint型のみ。下部のループはInteger型をオートボクシングしてのループ。
* オートボクシングすると新しいオブジェクトを生成する必要があり、メモリ効率が少し悪くなる。(下記は動画からの転載だが、なぜ100ではなく83であるのかは謎です。)

![Kobito.9s91ue.png](https://qiita-image-store.s3.amazonaws.com/0/43762/040d3ac5-0a4a-5346-4f04-a8ab52d06fb5.png "Kobito.9s91ue.png")

## Primitiveのデータサイズ
primitiveのデータサイズは以下だがオートボクシングすると16byteほどメモリ空間を新たに確保する。

![Kobito.DMZWBZ.png](https://qiita-image-store.s3.amazonaws.com/0/43762/c34420a2-27ce-13d3-1526-2763ba9f88be.png "Kobito.DMZWBZ.png")
![Kobito.ltr4Ha.png](https://qiita-image-store.s3.amazonaws.com/0/43762/23c63694-df1b-a65f-a1d6-3d925e8fe6f2.png "Kobito.ltr4Ha.png")

## オートボクシングしないクラス
上述したようにCollection, Map系にはオートボクシングがJava5の機能で含まれている。Androidでは、HashMapがオートボクシングを行うために、メモリパフォーマンスが悪くなってしまう可能性がある。そのために、GoogleはSparseMapを提供している。下記はprimitive型での要素インデックスを指定できるMapのリストである。

![Kobito.BKKUgU.png](https://qiita-image-store.s3.amazonaws.com/0/43762/f3d30cfb-fb55-9d1b-871f-86ac149335ce.png "Kobito.BKKUgU.png")

## 追記
* Allocation Tracker

Allocationの状態を可視化するために利用されるツール。これにより、どこでオートボクシングが行われているか開発者がわかる。
(動画で利用方法があったわけではないが言及していたので、触れました。こちらもまた後日機会があれば使い方をあげたいと思います。)
Parser APIを試してみよう

## はじめに

Parser APIを試してみました。

きっかけは[カジュアルJavaScript AST](http://azu.github.io/slide/JSojisan/)を読んだことです。

面白そうな雰囲気があります。

この記事では、Parser APIの試し方を紹介したいと思います。

動作確認にはFirefoxを使いました。

## How

### Reflectオブジェクトを準備する

Reflectオブジェクトを使うために、Web コンソールで

```
Components.utils.import("resource://gre/modules/reflect.jsm")
```

を実行します。

これでReflectオブジェクトが使えます。

もし、Web コンソールに心当たりがなくても大丈夫です。

メニューバーのヘルプで検索すればWeb コンソールを見つけることができます。

### JavaScriptをパースしてみる

あとは、Web コンソールで

```
var ast = Reflect.parse("obj.foo + 42")
```

こんな感じでJavaScriptをパースすることができます。

parseの引数は文字列です。


オブジェクト
ブロックステートメント(BlockStatement)をパースしたい場合はこんな感じになります。

```
var ast = Reflect.parse("{ name: tokyo }")
```

## まとめ

簡単な紹介ですが、Parser APIの試し方を紹介しました。


ASTを綺麗に表示する方法があるとは思うのですが、ちょっと分かりませんでした。。


こちらの[demo](http://esprima.org/demo/parse.html?code=%2F%2F%20Life%2C%20Universe%2C%20and%20Everything%0Avar%20ast%20%3D%20obj.foo%20%2B%2042%3B%0A)でもパースを試すことができるようです。

## 参照URL

- [Parser API - Mozilla | MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API)
- [JavaScript AST Walker](http://azu.github.io/slide/tkbjs/js-ast-walker.html)
- [Esprima](http://esprima.org/index.html)
Logistic Regression備忘録

Conditional Probability

```math
P(y|{\bf x}) = \frac{1}{1 + \exp(-y({\bf w} \cdot {\bf x} + b))}
```

Lagrangian of the Logistic Regression with L2 regularizer

```math
\begin{eqnarray}
L &=& \sum_{i=1} ^n - \log( P(y_i|{\bf x}_i) + C \times \frac{1}{2} {\bf w}^2 \\ 
  &=&\sum_{i=1} ^n \log(1 + \exp(-y_i({\bf w} \cdot {\bf x}_i + b))) + C \times\frac{1}{2} {\bf w}^2
\end{eqnarray}
```


gradient

```math
\begin{eqnarray}
\frac{\partial L}{\partial {\bf w}} 
 &=&\sum_{i=1} ^n \frac{\exp(-y_i({\bf w} \cdot {\bf x}_i + b))}{(1 + \exp(-y_i({\bf w} \cdot {\bf x}_i + b)))} \cdot -y_i {\bf x}_i + C {\bf w} \\
 &=& C {\bf w} - \sum (1 - P(y_i|{\bf x}_i))  y_i {\bf x}_i
\end{eqnarray}
```
自分用railsスケルトン作った - その２

https://github.com/craftpaperbag/skelton
![skelton.png](https://qiita-image-store.s3.amazonaws.com/0/69039/8a69703f-7aac-e4b6-97dd-9428965f10cd.png)

◯◯アプリ作ろう！→できた！を高速化するためのテンプレです。
[前回](http://qiita.com/craftpaperbag/items/933523d8c8ef7d6a7ecf)から、使いやすいように
Rails Application Template の仕組みに載せ替えました。


# 使い方

[README](https://github.com/craftpaperbag/skelton)を見てください。

# ポイント

特徴は以下

- rspecとcapybara
- unicorn
- bootstrap
- slim
- CircleCIでビルドするためのcircle.ymlのひながた
- herokuで使うためのpostgres指定
- spec は Feature と Model だけ（ほかは自動生成しない）
- **揮発性メッセージのラクチン指定（後述）**
- 最初にrubyバージョンをGemfileに明記します。
    - （Heroku対策です）


# おまけ機能：揮発性メッセージのラクチン指定

views/shared/ に
表示したいメッセージのテンプレートを作る。
_hogehoge.html.slim など。

controller処理内でよぶ

```ruby
message 'shared/hogehoge'
```

flashに保存されてる。
viewで表示するときは

```ruby
= render 'shared/messages'
```

# 次は...

- [x] Rails Application Template の仕組みを使う
- [ ] Gemfileを丸コピしないで`gem`メソッドを使う
- [ ] フッターのコピーライトを生成時に尋ねる方式にする
- [ ] ヘッダーの色を生成時に尋ねる方式にする
- [ ] CircleCI+Herokuでデプロイするまでをまとめる
ファイル分割したmain package内の呼び出しができなかった

```hoge.go
package main

type Hoge struck{}

```

```main.go
package main

main func() {
  hoge := &Hoge{}
}
```

を

```
go build ./main.go
```

するとエラー

## 解決方法

```
go build
```

buildをファイル指定で行うと、そのファイルに記載されたファイルの依存解決しかしてくれないんですね。
引数無しなら、ディレクトリ内やパッケージ内のファイルをすべて読みにいってくれると。

## 参考

[Golang undefined variable](http://stackoverflow.com/questions/24582384/golang-undefined-variable)
BlueNinja はじめの一歩

# はじめに
BlueNinja が発表されて、これは！と思いすぐにポチったのだけど、にわか電子工作者には、ちょっと敷居が高かった。[スターターガイド](http://blueninja.cerevo.com/ja/guide/index.html)どおりにやっても、うまくインストールできない。東芝のサイトにいって NDA 結んだりしなくちゃいけなくて面食らう。

でも、搭載されているセンサーの値を Android でモニターするだけなら、べつに開発環境なんていらない。
以下の「実例紹介」から、すでコンパイルされている bin(BlueNinjaにインストール) と apk(Androidにインストール) をダウンロードしてインストールすればよい。
[BlueNinjaを使って「ミニ四駆テレメトリーシステム（ロガー）」をつくる](http://blueninja.cerevo.com/ja/example/001_telemetry.html)

# 動作確認手順
詳しくは、以下の記事が丁寧に説明してくれてありがたい。
[Cerevo BlueNinjaが届いたのでCylon.jsでBLE疎通を試してみました](http://www.s-arcana.co.jp/blog/2015/08/22/2804)


0. bin のインストールは、上記の記事を参考に。リチウムポリマーバッテリーをつなぎつつインストールするのがコツなようです。Android アプリ「BlueNinja BLE Example」は、[ここ](http://blueninja.cerevo.com/ja/example/attachment/001_apk-BlueNinja_BLE_Example.zip)のZipファイル(apkにしておいてくれるか GooglePlay に置いてくれると楽なのに...)を展開してapkファイルを生成する。インストールは、[ここ](http://phpjavascriptroom.com/?t=mobile&p=android_apk_install)を参考に。
1. 開発ボードには、３つの物理スイッチがあるが、そのうち一つで microUSB端子に並置されているのが電源スイッチ。これを３秒ほど長押しするとBlueNinja上の赤いLEDが点滅し始める。
2. 電源スイッチのすぐ横のスイッチを押すと BLE ペアリングモードに入る。BlueNinja上の緑のLEDが点灯する。
3. Android上にインストールした「BlueNinja BLE Example」というアプリを立ち上げる。アプリには４つのボタンが下方にあるが、そのうちの「Connect BlueNinja」をタップすると、下の方に BLE_READY と表示され、BlueNinja上の緑のLEDが点滅し始める。ここで、「Enable Notification」をタップすると各種センサーの値がチロチロ表示される。たまに反応しないものがあるが、そのときは何回か「Enable Notification」をタップするといいようだ。

# 小型化考察
BlueNinja の何が魅力かというとバッテリー含めて小型であるということである。開発ボードつけてたら意味がない（十分小さいけどね）。開発ボードなしで、電源が入れられ、なおかつBluetoothペアリングする必要がある。

インターネットウォッチの記事の[写真](http://internet.watch.impress.co.jp/img/iw/docs/713/865/html/cerevo08.jpg.html)をみると、緑と黒の線がスイッチに繋がっている。おそらくこれが BluetoothLE のシンクスイッチだろう。実は、BlueNinjaの裏には謎の４極コネクタがある。
![kobito.1442827534.771422.png](https://qiita-image-store.s3.amazonaws.com/0/60968/15454ce2-581a-f2a4-3555-839435876acf.png "kobito.1442827534.771422.png")


公式サイトの[BlueNinja CDP-TZ01B ピンアサイン Rev1](http://blueninja.cerevo.com/ja/docs/BlueNinja_CDP-TZ01B_pinassign_Rev1_20150811.pdf)をみるとCN4(Connector4の略？)というところに PushSWとPowerSWという記述がある。それぞれ、シンクスイッチ、電源スイッチに対応していると思う。
![kobito.1442827768.583665.png](https://qiita-image-store.s3.amazonaws.com/0/60968/d80f5a72-a8a7-8ec4-51a8-76a49ef19163.png "kobito.1442827768.583665.png")

~~GND, PushSW, GND, PowerSW ときれいに並んでいるので、それぞれ、GNDと短絡させればいいかと思って端子を金属端子で触ってみたが反応しなかった。スイッチは、押すとHighになるスイッチなのだろう。~~
GND-2pin　と PowerSW-1pin を金属端子で短絡して３秒ほど待つと、電源が入った！もちろんこれは、電源スイッチを押したことに対応する。その次に GND-4pin と PushSW-3pin を短絡すると（シンクスイッチを押すことに相当）BLE ペアリングモードになった。バンザイ！これで小型化できる。あとは、ケースを作りたいな。

このコネクタは、日本圧着端子製造株式会社のものらしい。[ウェブページ](http://www.jst-mfg.com/product/detail.php?series=9)
公式サイトの[BlueNinja CDP-TZ01B ピンアサイン Rev1](http://blueninja.cerevo.com/ja/docs/BlueNinja_CDP-TZ01B_pinassign_Rev1_20150811.pdf)には、「Switch connector JST BM03B-ACHSS-GAN-TF(LF)(SN)」という記述だが、４極なので、型番は BM04B-ACHSS-A-GAN-ETFっぽい。
これウェブサイトから購入したら、ちゃんと電線が付いているのだろうか？電線付きのもの秋葉原のお店に売ってるかな？本家のショッピングサイトで買えたらいいな。
忘れやすいのでちょっとしたメモ的なもの - git編 -

# 忘れやすいのでちょっとしたメモ的なもの - git編 -

・インデックスに登録
　　git add 

・コミット
　　git commit -m "コメント"

・プッシュ
　　git push origin branch

・リモートリポジトリのURL変更
　　git remote set-url リポジトリの名前　新しいurl

・リモートブランチの削除
　　git push リポジトリの名前　:ブランチ名

・ステージングエリアから消去
    git reset <ファイル名>

・ローカルを残したままリモートを削除
　　git push -f origin HEAD^:master
ファイナライザには頼らない

多くのオブジェクト指向言語では、オブジェクトが解放された時に動く処理を登録できます。そして、その実装には「デストラクタ」と「ファイナライザ」がありますが、**決定的に違いがあります**。

# メモリ解放の仕組み
`new`で確保したものに対して明示的に`delete`を呼ばないといけないC++であれば解放のタイミングは明らかですが、そうでない言語では、プログラマの見えないところで**ガベージコレクタ**という、メモリを解放するための仕組みが動いています。そして、このガベージコレクタには、大きく分けて2通りのタイプがあります（掘り下げていけばそれだけで1冊の本になるので、軽く触れる程度にします）。

* 参照カウント…オブジェクトへの参照の数をカウントしておいて、**0になった瞬間に**解放する方法
* マークアンドスイープ…**ときどき**どの変数が有効かをチェックして、参照できなくなっているものを解放する方法

この2つのシステムどちらを取るかで、後始末処理の実行形態も大きく変わってきます。

# デストラクタ
参照カウントのシステムの場合（例：PHP）、あるいはC++のように自分から解放しないといけない場合、最後の参照がスコープアウトした、あるいは別な値に書き潰されたなどで参照不能となった時点で、後始末処理の**デストラクタ**が走り始めます。つまり、むやみに参照を拡散させずにローカルにしておけば、デストラクタは**確実に実行されます**。

これの利用法として、「コンストラクタであるリソースを確保して、デストラクタでそれを解放する」クラスを用意しておけば、あるスコープにローカルな形でそのクラスのインスタンスを持つことで

* ふつうにスコープを抜けた場合
* 例外を投げて飛んでいった場合
* `break`や`return`で脱出する場合

など、どうコードが進もうともスコープアウトに連動したデストラクタでリソースは解放されることとなります。これを[RAII](https://ja.wikipedia.org/wiki/RAII)といいます。

# ファイナライザ
これに対して、マークアンドスイープを行う場合、参照不能となったオブジェクトもガベージコレクタが回ってくるまではメモリに残り続け、そしてガベージコレクタが参照不能だと判断してから後始末処理が始まります。Javaではこれを**ファイナライザ**と呼んでいます。ややこしいことに、C#では同様の動作をするものを「デストラクタ」と呼んでいますが、動作の確実性はないのでこちらに区分されます。

上に書いたように、ガベージコレクタはいつ回ってくるかわかりませんので、参照不能となった後にいつファイナライザが動き出すかはプログラマの制御できない話です。それどころか、ファイナライザを**実行しない**ままプログラムが終了してしまったとしても、（少なくともJavaでは）それも仕様の範囲内の動作です。そして、仮にファイナライザで例外が起きたとしてもそれは闇に葬られてしまいます。

つまり、デストラクタのように「何かを積極的に行う」[^1]場所としてはファイナライザは使いえないものなので、せいぜい「うっかり開いたままだったリソースを閉じる」というようなフェイルセーフに使うのが精一杯でしょう。

# リソースの自動解放
なお、コンストラクタ - デストラクタによるRAIIはファイナライザでは書くことができませんが、言語ごとに（どんな形で抜けても）リソースをきっちり閉じるような構文があります。

* C#…`IDisposable`インタフェースの`Dispose()`を呼び出す`using`構文
* Java…`java.io.Closable`によるtry with resource
* Ruby…ブロック内でのみ有効なリソースを持つ、ブロック付きメソッド


# 外部リンク
* [ファイナライザを理解する by 富士通 (PDF)](http://software.fujitsu.com/jp/technical/interstage/apserver/guide/pdf/Finalizer-GC.pdf)
* [ファイナライザは使わない by JPCERT/CC](https://www.jpcert.or.jp/java-rules/met12-j.html)


[^1]: コンストラクタが途中で失敗した場合にもファイナライザに飛ぶので、[そのオブジェクトへの参照を不正に得るために](https://www.jpcert.or.jp/java-rules/obj11-j.html)ファイナライザを「使えてしまう」事例はあります。
Mac OS X でニフティクラウドのコンソールを開く（Mac OS X 10.10 + Chrome 45.0 + VMware Fusion 8）

少し前ですが、ニフティクラウドの新しいUI(コントロールパネル)がリリースされました。

* 2015/05/11 [コントロールパネルをリニューアルいたしました](http://cloud.nifty.com/service/cp.htm)

* イチオシ機能のネットワークマップ  
![](http://cloud.nifty.com/service/images/conpane_04.gif)

見た目が今風になった事や作成したシステムのネットワークマップを表示する機能が付いた等、多くの変更点があったのですが、個人的に気になっていた点が、コンソール機能の ```vmrc``` 対応です。

これまでもサーバ作成や削除といった一般的な操作はOS Xから使えていたのですが、唯一、コンソール接続だけは全く操作出来ず、必要に応じてWindowsのVMを立ち上げて対応していました。
意外とコンソール接続を使う場面は多々あり面倒だなぁと思っていました。
そこで、今回のリリースで、 ```vmrc``` に対応したという事は、遂にMacOSXからもコンソール接続が出来る様になるかも！と密かに期待していました。

しかし、[「仕様・機能：コンソール」](http://cloud.nifty.com/service/console.htm#spec)のページには、 **※Mac OSでは、コンソール機能をご利用できません。** の文字が。。。

とは言え ```vmrc``` で繋がるなら使えるんじゃないの？って事で試してみました。

* **注意！**
    * ここで紹介する使い方はサポートされていません
    * 多分ニフティクラウドではテストされてないと思うので不具合等有ると思います

# 検証環境

* Mac OSX Yosemite 10.10.5
* Google Chrome バージョン 45.0.2454.93 (64-bit)
* VMware Fusion 8 8.0.0(2985594)
* ニフティクラウド　コントロールパネル（2015/09/20アクセス）

# VMware Fusionで ```vmrc``` を受けいる設定

* VMware Fusionを起動し、```環境設定...``` を開き ```デフォルトアプリケーション``` のタブを選択します。  
![vmware_fusion_default1.png](https://qiita-image-store.s3.amazonaws.com/0/10852/5326a800-7b61-938f-ea89-6eb938af6c4d.png)
  

* 左下のプルダウンメニューから ```VMRC(vmrc)``` を選択  
![vmware_fusion_default2.png](https://qiita-image-store.s3.amazonaws.com/0/10852/dcfa262d-0feb-c2cb-a485-271bb691800d.png)
  

* ```VMRC(vmrc)を開く``` の項目で選択が ```VMware Fusion.app``` となっている事を確認　　
![vmware_fusion_default3.png](https://qiita-image-store.s3.amazonaws.com/0/10852/37da2834-dc71-92f9-f81a-c888ee166cf8.png)

# Chromeでコンソール機能を使ってみる

* ニフティクラウドのコントロールパネルへログインし、```コンソールボタン``` をクリック
![ConsoleConnectTest1.png](https://qiita-image-store.s3.amazonaws.com/0/10852/d62eda23-5211-6672-b11f-e206d3bb33b6.png)
  

* 確認画面が表示されるので ```起動(64bit)``` をクリック
![ConsoleConnectTest2.png](https://qiita-image-store.s3.amazonaws.com/0/10852/63a6838e-bc46-7bda-efa9-339b53948813.png)  

* ```外部プロトコルリクエスト``` の画面が表示されるので、```アプリケーションの起動```をクリック
![ConsoleConnectTest3.png](https://qiita-image-store.s3.amazonaws.com/0/10852/6799f731-3e81-dc07-b7b5-b8cd623fda31.png)
  

* コンソールが開いた！
![ConsoleConnectTest4.png](https://qiita-image-store.s3.amazonaws.com/0/10852/17291d15-7f03-9b04-87c3-444b7b8d0e79.png)

# 操作してみる

* OSのiptablesを無視してコンソールとしてログイン出来る。当然ログインユーザはtty1からログインしている

![ConsoleConnectTest5.png](https://qiita-image-store.s3.amazonaws.com/0/10852/4434ea8a-5751-ab26-2659-4289df546fa6.png)

## 見つけた不具合
* まれに繋がらない
    * 何度かコンソール接続ボタンを押しているとそのうち繋がるので根気よくトライする必要がある
* OSへコンソール接続は出来るが、仮想マシンに対する操作は出来ない
    * 確認した範囲では、設定変更、スナップショットを開こうとすると VMware Fusion 8諸共アプリが落下する
    * あくまでコンソール接続して操作するだけなら使えそう

# 感想
iptablesの設定失敗した時や過負荷等でファイル・システムが壊れてどうしてもfsckが必要な時等、いざって時は使えそうだけど常用は出来ない感じ。

実は、コンソール接続専用のクライアントアプリで [VMware Remote Console 7.1 for Mac](www.vmware.com/go/download-vmrc) てのも有るんだけど、VMware Fusionなら何時も入ってるし、これで良いかな？と思っている。

ぜひ正式対応していただきたい！と開発チームへエールを送っておく。
koshianでピッコロボを動かす


最近、ロボに興味をもっているのですが、正直どこから手をつけていいのか全く分かりません。そんな時に、ちょうどよさそうなロボを見つけたので、試してみました。さらに、BLEモジュールのkoshianを使って、リモートコントロールしてみました。

# ピッコロボ

[Vstoneのサイト](http://www.vstone.co.jp/robotshop/index.php?main_page=product_info&products_id=4409)で1万以下で購入できます。
サーボ4個と、Freaduino UNO(Arduino互換マイコン)とMDF板のフレームが入っており、[説明書](http://www.vstone.co.jp/vs_wiki/main/wiki.cgi?page=%A5%D4%A5%C3%A5%B3%A5%ED%A5%DC%BC%E8%B0%B7%C0%E2%CC%C0%BD%F1)をみて3時間程度で組み立てできました。

![ピッコロボ.JPG](https://qiita-image-store.s3.amazonaws.com/0/4779/f16c9860-d1fb-09a2-7452-08c7d6ef100d.jpeg "ピッコロボ.JPG")

![ピッコロボ2.jpg](https://qiita-image-store.s3.amazonaws.com/0/4779/dc8b4f84-3006-a289-b271-6bd236a4b39a.jpeg "ピッコロボ2.jpg")

Freaduino UNOとパソコンをUSBケーブルで接続して、パソコンからシリアル通信で文字列を送信して操作するのですが、ケーブルがあると格好悪いので、無線化対応を検討してみました。

![ピッコロボ3.png](https://qiita-image-store.s3.amazonaws.com/0/4779/6d0c3932-8667-1f8b-361a-3024a6c2b1b9.png "ピッコロボ3.png")

# ピッコロボの無線化

## koshianとは

無線化するにあたって、BLE(Bluetooth Low Energy)モジュールの[koshian](http://www.m-pression.com/ja/solutions/boards/koshian)を使います。980円と安価でありながら、JavaScriptで操作が可能と、かなり遊べます。

[ピッチ変換基盤](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=5ASF-MLDM)にハンダ付けして、ブレッドボードで使えるようにします。

![ピッコロボ4.png](https://qiita-image-store.s3.amazonaws.com/0/4779/1bd06552-8501-f43a-e66b-4c4b43bf6159.png "ピッコロボ4.png")

koshianの操作は、iphoneアプリの[konashi.js](https://itunes.apple.com/jp/app/konashi.js-javascript-html/id652940096?mt=8)を使います。
[jsdo.it](http://jsdo.it/)にてプログラムを用意して、konashi.jsで動かします。

## Freaduino UNOにkoshianを接続する

下図のように、UARTで接続します。

![ピッコロボ5.png](https://qiita-image-store.s3.amazonaws.com/0/4779/7e2560a2-e71e-e519-95c4-e838c73baa12.png "ピッコロボ5.png")


iPhoneから下記プログラムを起動して、koshianからFreaduino UNOに、ピッコロボ操作に必要な文字列をUART(シリアル通信)で送信します。
シリアル通信で文字列を送信するプログラムがあったので、これをそのまま利用します。

<script type="text/javascript" src="http://jsdo.it/blogparts/qurt/js"></script>

![kobito.1442755777.985446.png](https://qiita-image-store.s3.amazonaws.com/0/4779/643904e2-fde8-9988-1eaf-6788f7a06d11.png "kobito.1442755777.985446.png")

iPhoneでピッコロボを操作する様子です。

<iframe src="https://vine.co/v/ePmODxViU2w/embed/simple" width="600" height="600" frameborder="0"></iframe><script src="https://platform.vine.co/static/scripts/embed.js"></script>

# まとめ

* 最初のロボとして、ピッコロボを制作しました。サーボの扱いや、Arduinoでのサーボ操作等、基本的な事を学習するには、とてもいい教材です。
* BLEモジュールとして、koshianを利用しました。jsdo.itと、konashi.jsで手軽に使える事が分かっていただけたかと思います。
Go-MySQL-Driverでunix domain socketで繋ぐ


# DSN

- プロトコルにunix、アドレスにsocketのpathを設定する
- socketのpathが```/var/lib/mysql/mysql.sock```の場合は下記の様になる


```
username:password@unix(/var/lib/mysql/mysql.sock)/dbname?param=value
```


# 参考

- https://github.com/go-sql-driver/mysql/blob/master/README.md
- http://golang.org/pkg/net/#Dial
NTEmacs で process-file が遅い問題は 24.4 で解決している模様

以下のブログや、
http://lambdasakura.hatenablog.com/entry/2013/03/22/000211
http://fujii.github.io/2014/02/13/emacs-magit-runs-too-slowly-on-windows/
以下の stackoverflow で紹介されていますが、
http://stackoverflow.com/questions/21753418/why-is-process-file-git-slower-than-process-file-shell-command-git-on-em
NTEmacs では、shell を介さないでサブプロセスを実行すると、なぜか shell を介した場合の約10倍、実行時間がかかってました。

この問題どうやら、emacs 24.4 で解決しているみたいです。詳細は以下を参照。
GNU bug report logs - #18420 (http://debbugs.gnu.org/cgi/bugreport.cgi?bug=18420)
GNU bug report logs - #18626 (http://debbugs.gnu.org/cgi/bugreport.cgi?bug=18626)

GNU bug report logs - #18420 の修正内容
https://lists.gnu.org/archive/html/emacs-diffs/2014-09/msg00117.html

自分の環境でのベンチマーク(Windows7 NTEmacs 24.5.1 Msys2)

```el:*scratch*
(benchmark 10 '(call-process "git"))
"Elapsed time: 0.265200s"

(benchmark 10 '(process-file "git"))
"Elapsed time: 0.265200s"

(benchmark 10 '(call-process-shell-command "git"))
"Elapsed time: 0.358801s"

(benchmark 10 '(process-file-shell-command "git"))
"Elapsed time: 0.358801s"

(benchmark 10 '(shell-command-to-string "git"))
"Elapsed time: 0.358801s"
```
業務システムに Electron を組み入れるという提案

今日は、業務システムにElectronを組み入れるという提案をしたいと思います。

## Electron のおさらい

Electronは、Chromium + Node で構成された、デスクトップアプリ作成環境です。ビューは Chromium のウェブブラウザとしての機能がそのまま使えます。また、Node を組み込んでいるためにNodeの資産がほぼそのまま流用できます。サーバー機能とブラウザ機能の両方を持った環境とも言えます。

## 業務システムをウェブベースで作るの無駄じゃないですか？

いろいろな会社で業務システムと呼ばれる社内だけで使われるシステムがあると思います。そういったシステムは最近では何も考えずにウェブフロントを持ち、APIもウェブベースで、RailsやJavaEEなどを使って作られていたりしませんか？

### ウェブサーバーの持つオーバーキル感

ウェブサーバーを構成する技術は割とオーバーキル感のあるものが多いです。Apache, Nginx, Rails, JavaEE, servlet container...

本当に自社のユーザーだけが利用するサービスにそんな本格的な技術必要ですか？もっとライトウェイトに作るべきじゃないですか？性能予測して、ピークに合わせたインフラ投資して、それって無駄じゃないですか？

### マルチブラウザ問題

マルチブラウザ問題はとても頭の痛い問題です。特に古いIE。企業において、様々な理由からIEを古いバージョンのまま運用するケースも多いです。マルチブラウザ問題によって開発工数がふくれあがるのつらくないですか？

### 使いにくい操作体系

マルチブラウザ問題にも関連しますが、どうしても社内システムってUIが糞だったりしません？どうしようもないから、Excel使った方がマシってことでExcelを使うシステムが蔓延してません？

## そこで、ウェブフロントを Electron に置き換えてみましょう

いくつかパターンを例示してみます。

* Electron + DB / redis
* Electron + non web API + 何か
* Electron + ファイルサーバー
* Electron + MQTT + 何か
* Electron + Windows アプリ

### 利点1: Chromium 決め打ちで作成できる

開発工数を大幅にショートカットできます。動作確認対象環境はただ一つで済みますし、デバッグする時も chrome / chromium のウェブデベロッパーツールだけ覚えれば可能です。また、無駄に互換用shimとか使わなくてもいいです。

便利な機能が無条件で使えます。Flexbox, localStorage, web worker...

### 利点2: デスクトップでNodeの機能が使える

ローカルファイルに自由にアクセスができるので、例えば大きなデータの転送を削減したり、ややこしい構成のファイル群を簡単に扱えます。また、みんな大好き Excel も直接いじれます。

ローカルDBなんかも、IndexedDBやnpmの様々なものを動かすことができます。

ユーザーのことを考えた使いやすいアプリケーションを作ることができます。

### 利点3: アーキテクチャ設計のメリット

多人数が同時にアクセスする(かもしれない)ウェブサーバーよりも、個々人が動かすElectronの方がいろいろ性能想定がしやすいです。ピーク時想定して無駄にインフラ投資するくらいなら、負荷分散した方がコストが安くつくはずです。

APIを使った構成にする場合でも、APIサーバーは、ウェブフロントを作るよりもライトウェイトにしやすいです。ごてごてしたフルスタックフレームワークを使うよりも、APIに特化したミドルウェアの方が使いやすいです。また、HTTP以外のプロトコルを使ったAPIを採用しやすいというのも利点です。(もちろん、これに関しては必ずしも Electron のメリットではないですが、結果的にそういう構成になります)

### FAQ

* それVBでもいいんじゃね？
    - Electronの方が習得が圧倒的に簡単
* それなりにメモリを食うのでは？
    - ブラウザ立ち上げてもやはりメモリを食う点はかわらない
    - ツールが乱立するとメモリ大量に喰われる可能性はあるものの、普通は異なる業務ツールをそんなに何個も同時に起動しないはず (さすがに設計間違いではないだろうか)
* 秘匿情報はどうするのか？
    - 秘匿度合いに応じて、難読化をしたり、APIサーバーやキューの後ろに隠す

## おさらい

* good bye IE
* JavaやRails技術者はElectronを見くびらないほうがいい、あなたの仕事は今にも失われつつある

## 追記

* アプリをアップデートする仕組みはあるか？
    - electron-updater とか
pryでSpecinfraを試す

pryでSpecinfraを試す。

バージョン
=========
```console
$ bundle show specinfra
/var/lib/gems/2.2.0/gems/specinfra-2.43.0
```

pry
===
```rb
$ pry
[1] pry(main)> require 'specinfra'
=> true
[2] pry(main)> require 'specinfra/helper/set'
=> true
[3] pry(main)> include Specinfra::Helper::Set
=> Object
[4] pry(main)> set :backend, :exec
=> :exec
[5] pry(main)> host_inventory['hostname']
=> "82b2db5a2096"
```
Picture in Picture(iOS9)

#PiPとは
Picture in Picture
Youtubeアプリなどで見かける小窓表示のウィンドウ
iOS9からは、Springboardレベルでこの機能を使うことができる。
https://developer.apple.com/library/prerelease/ios/samplecode/AVFoundationPiPPlayer/Introduction/Intro.html

![c6528d76-b3ee-36c8-5da3-2bfcc4476e1e.png](https://qiita-image-store.s3.amazonaws.com/0/24979/3e660ae4-6655-4efb-d32d-a764a3d9ae4a.png)

#AVPictureInPictureController
名前の通り、ビデオに用いることが前提となっている。


##isPictureInPictureSupported() -> Bool

クラスメソッド
PiPをサポートしているかを返す。
サポートしていない場合、nilが返るためしっかり判別しないとfatal errorで落ちる

サポートは以下のようになっている

|デバイス|サポート|
|---|---|
|iPad2| x  |
|iPad Air| o  |
|iPad Air2| o  |
|iPad Retina| x|
|iPhone| x|

iPhone以外にもAir以前のiPadでは利用できないので注意

##pictureInPictureButtonStartImageCompatibleWithTraitCollection -> UIImage
![001.png](https://qiita-image-store.s3.amazonaws.com/0/24979/132c181b-0478-5f8e-71f5-0f59ebcb27ef.png)

UITraitCollectionを指定して戻す画像を取得する。
任意のものを設定できるわけではない。
おそらくAirPlayとかと同じでPiPをするときはこのアイコンを使えよ！というこのなのだと思われる。
余談だけど、iOS9からは画面を分割できるのでUIScreen.Mainscreen.boundsとかやると多分死ぬ

##pictureInPictureButtonStopImageCompatibleWithTraitCollection -> UIImage
さっきの矢印が逆のやつを取得する

##init?(playerLayer: AVPlayerLayer)
イニシャライザ。
AVPlayerLayerを引数としているので、これ自身にaddSubViewしたりはできない。（要するにニコニココメントみたいなのは一度レンダリングする必要あり
なおこのAVPlayerLayerはpropertyから取得することは可能（readonly)

##delegate
後述

##startPictureInPicture()
PiPが開始される（動画の開始ではないので注意）

##stopPictureInPicture()
PiPの終了を呼ぶことができる。
ただし、呼び出し元のアプリが画面上にいる必要があり
画面分割時に`自分:他[PiP]`の場合はstopに成功するが
`他:他[PiP]`の場合は失敗する。
画面分割時は自分のアプリさえ出ていれば他のアプリをアクティブにしていても可能。
Springboardのホーム画面などでも失敗するので注意

##pictureInPicturePossible
PiPが使える状況か判別する。
先述のisPictureInPictureSupportedで対象となっているデバイスでもBackgroundModeを指定しないとPiPは利用できないためここでもチェックは必要。

##pictureInPictureActive
PiP中かどうか

#検証
PiPは動画のアスペクト比に応じて形を変える
![スクリーンショット 2015-08-28 17.15.50.png](https://qiita-image-store.s3.amazonaws.com/0/24979/45a4a513-bb6f-309f-488e-0c62106af652.png)


#AVPictureInPictureControllerDelegate
Delegate
基本的にはPiPを見送る時と迎える時にしか使えない

##pictureInPictureControllerWillStartPictureInPicture:
WillStart系

##pictureInPictureControllerDidStartPictureInPicture:
DiDStart系

##pictureInPictureController:failedToStartPictureInPictureWithError:
PiPが失敗した時に呼ばれる。
どういう時に失敗するか分からないが、AVPlayerLayerが偶然クラッシュしたりするとなるかもしれない。

##pictureInPictureControllerWillStopPictureInPicture:
Stop(PiPの終了)直前に呼ばれる

##pictureInPictureController:restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:
PiP終了後に呼ばれる。

#Hacks
https://twitter.com/b3ll/status/610957432278392832

>OpenGL layer being rendered﻿ on top of an AVPlayerLayer inside a PIP view.

#想像
ゲーム画面をストリーミングしたものをAVPlayerに送っている
or
OpenGL textureをAVPlayerLayerにかけている

##PiP後にplayerを差し替える
PiP後にplayerLayer.playerに対して新しいAVPlayerを再セットすると真っ暗になる。
PiP前に差し替えた場合は問題ない。

##addSubLayerについて
AVPlayerLayerを引数として渡して初期化しているが、PiP後にaddSubLayerしてもPiPの窓に貼ることはできない。
BlueNinja リンク集

* [オフィシャルサイト](http://blueninja.cerevo.com/ja/)
	* [プレスリリース](http://info-blog.cerevo.com/2015/07/28/1219/)
	* [twitter](https://twitter.com/hashtag/blueninja)
* 応用例(Youtube)
	* [ミニ四駆テレメトリーシステム（ロガー）](https://youtu.be/lkMTlOfvm-o?t=44s)
	* [BLEティッカー](https://youtu.be/lkMTlOfvm-o?t=1m20s)
	* [ニキシー管スマートウォッチ](https://youtu.be/lkMTlOfvm-o?t=2m26s)
	* [犬パシー Inupathy](https://youtu.be/lkMTlOfvm-o?t=2m59s)
* [実例集](https://blueninja.cerevo.com/ja/example/)
	* [Hyourowgan](https://blueninja.cerevo.com/ja/example/000_hyourowgan/)
*  ユーザブログ
	* 2015/09/15 [BlueNinja&Breakoutボードのメモ](http://workpiles.com/2015/09/blueninja-breakout-memo/)
	* 2015/08/27 [CEREVOのBlueNinjaを使ってみる](http://workpiles.com/2015/08/blueninja-starter-guide/)
	* 2015/08/22 [Cerevo BlueNinjaが届いたのでCylon.jsでBLE疎通を試してみました](http://www.s-arcana.co.jp/blog/2015/08/22/2804)
	* 2015/08/21 [ソフト屋さんがblueninjaをさわってみた](http://poiuy56.hatenablog.com/entry/2015/08/21/200922)

* 紹介記事
	* 2015/07/30 [初期生産は即完売！IoT自作モジュール『BlueNinja』は買いだ](http://weekly.ascii.jp/elem/000/000/360/360896/)
	* 2015/07/29 [バッテリーと繋げば活動量計も作れる——CerevoがIoT製品向けモジュール「BlueNinja」を発表](http://jp.techcrunch.com/2015/07/29/cerevo-blueninja/)
	* 2015/07/28 [CPU・センサー・充放電回路を内蔵した小型Bluetoothモジュール「Blue Ninja」発売](http://internet.watch.impress.co.jp/docs/news/20150728_713865.html)
	* 2015/07/28 [Cerevo、重さ2gのIoT開発モジュール BlueNinjaを発表。『活動量計レベルなら簡単に作れる』](http://japanese.engadget.com/2015/07/28/cerevo-2g-iot-blueninja/)
	* 2015/07/28 [IoT機器に仕込めるアキバ発の"忍者" - Cerevo、東芝SoC搭載の超小型モジュール「BlueNinja」発表](http://news.mynavi.jp/articles/2015/07/28/bn/)
alias, require, importの違いを理解してみる


英語が読める方はこちらを参照のほど
[elixir - alias, require and import](http://elixir-lang.org/getting-started/alias-require-and-import.html)

## alias

モジュールに別名を割り当てることができる。

ex.

````elixir:example.ex
defmodule Math do
  # Math.ListモジュールをListという名称に置き換え
  alias Math.List, as: List
  
  List.flatten             #=> Math.List.flanttenをList.flanttenとして呼び出せたり
  Elixir.List.flatten      #=> Elixirの名前空間から呼び出せたり
  Elixir.Math.List.flatten #=> Elixirの名前空間からだと置き換え元のMath.Listを呼び出せたりもする
end
````

またasを使わない場合は、自動的に名称が割り当てられる。

ex.

````elixir:example.ex
# 最後のListの部分が割り当てられる
# つまり下記はalias Math.List, as: Listと同じ
alias Math.List
````

aliasはレキシカルスコープなので、特定の関数内だけのエイリアスを設定できる。

ex.

````elixir:example.ex
defmodule Math do
  def plus(a, b) do
  	# 下記のエイリアスはplus関数の中でのみ有効
    alias Math.List
  end

  def minus(a, b) do
    # ...
  end
end
````

## require

モジュールを利用可能にする。

ex.

````console
iex> Integer.is_odd(3)
** (CompileError) iex:1: you must require Integer before invoking the macro Integer.is_odd/1
iex> require Integer
nil
iex> Integer.is_odd(3)
true
````

モジュール内のマクロを利用するには`require`を使い、モジュールを読み込むことが必要となる。
aliasと同じくrequireもレキシカルスコープである。

## import

モジュールから他のモジュールの関数やマクロにアクセスするために使用。

ex.

````console
# Listのduplicate関数のみ呼び出せるようにしている
iex> import List, only: [duplicate: 2]
nil
iex> duplicate :ok, 3
[:ok, :ok, :ok]
````

また、`exept:`を使えば指定した以外の関数・マクロが呼び出せるようになり、
`only: macro`だと全てのマクロ、`only: functions`だと全ての関数が呼び出せるようになります。

単純に`import List`と呼び出した場合は、Listモジュール内の関数・マクロ全てが呼び出せます。


--

以上、理解を深めるために書いてみました。
Xcode7 Swift2で３日悩んで修正したコンパイルエラー

ネットからコピペしたコードにエラーが出てしまい、３日悩んで治りました。


エラーが出たところ
. . . .
let views = self.view.subviews
for (myView: UIView) in views  as! [UIView]  {
	. . . .
}

//↑Use of undeclared type ‘UIVew’ となります。	

直し方
. . . .
let views = self.view.subviews
for myView in views  {
	. . . .
}

//これでOK
iOS9 でアプリ上下に空白ができる問題に対応する


昔作ったアプリを修正しようとした時に遭遇した問題に対応したメモ。

昔作ったアプリ(iOS7以降対応)をiOS8以降の対応にして、Xcode7で実行したらアプリの上下に空白ができるようになりました。

![Simulator Screen Shot 2015.09.20 9.24.18.png](https://qiita-image-store.s3.amazonaws.com/0/27210/57409074-ce30-ae7d-30c6-5f56cd0f9a7a.png "Simulator Screen Shot 2015.09.20 9.24.18.png")

※赤枠部分

調べてみたらどうやらスプラッシュスクリーン(Launch Screen)を画像で設定していて、設定している画像の解像度が足りない場合に発生するようです。

http://stackoverflow.com/questions/32312906/ios9-app-has-black-bars-on-top-and-bottom

## 対応策

スプラッシュスクリーンに指定する画像の解像度の種類を増やすのも選択肢の一つですが、iOS8以降から対応している xib でスプラッシュスクリーンで設定しました。こちらのほうが今後の対応が楽そうです。

![スクリーンショット 2015-09-20 10.10.31.png](https://qiita-image-store.s3.amazonaws.com/0/27210/9f8ebaac-b423-f2ec-e58b-92bb07912187.png "スクリーンショット 2015-09-20 10.10.31.png")

## 結果

無事上下の空白がなくなりました。

![Simulator Screen Shot 2015.09.20 9.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/27210/4b2120ad-7818-cdcc-b4f7-fa2d1f6d0496.png "Simulator Screen Shot 2015.09.20 9.27.00.png")
net/httpsでWebAPIにPOSTリクエストを投げる

色々調べてAPIを使ってみた時のメモ書きです。
POSTをする必要があったので、色々と悩ましかったです。

```
require 'net/https'

class TestController < ApplicationController

  def apipost

    uri = URI.parse("https://example.jp/foo/ber/piyo/1/")
    http = Net::HTTP.new(uri.host, uri.port)

    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    req = Net::HTTP::Post.new(uri.path)
    req.set_form_data({'name' => 'hoge', 'content' => 'hogehoge'})

    res = http.request(req)

  end
end
```

`require 'net/https'`
今回はhttps通信を使うのでこちらです。
http通信の`'net/http'`もあります。
[library net/https](http://docs.ruby-lang.org/ja/2.2.0/library/net=2fhttps.html)


`uri = URI.parse("https://example.jp/foo/ber/piyo/1/")`
hostやpathを分けてわたせる様になります。
[singleton method URI.parse](http://docs.ruby-lang.org/ja/2.2.0/method/URI/s/parse.html)

```
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
```

`http.use_ssl = true`は必ずtrueを指定するようです。
`http.verify_mode = OpenSSL::SSL::VERIFY_NONE`
は証明書の検証をするかしないかの設定みたいです。今回はしないように指定してます。
[【ruby】net/httpでPOSTリクエスト(https)投げてみる。](http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/07/02/023326)
[module OpenSSL::SSL](http://docs.ruby-lang.org/ja/2.2.0/class/OpenSSL=3a=3aSSL.html)

```
req = Net::HTTP::Post.new(uri.path)
req.set_form_data({'name' => 'hoge', 'content' => 'hogehoge'})
```

ここでPOSTの設定をしています。
`req.set_form_data({'name' => 'hoge', 'content' => 'hogehoge'})`
の部分は状況によって変わると思うのでAPIに合わせてお願いします。
[Net::HTTP Cheat Sheet](http://www.rubyinside.com/nethttp-cheat-sheet-2940.html)

```
res = http.request(req)
```

リクエストを実行して、レスポンスが無事帰ってこれば成功です。


## 深いJSON

```
↓文字列をJSONに変換
result = ActiveSupport::JSON.decode(res.body)
↓中身
=> {"a"=>"0",
 "b"=>
  [{"c"=>"0",
    "d"=>
     [{"e"=>"1",
       "f"=>"9",
       "g"=>"1",
       "h"=>"1",
       "i"=>"0",
       "j"=>"0",
       "k"=>"0",
       "l"=>"1",
       "m"=>"0",
       "n"=>"1"}],
    "o"=>
     [{"p"=>"0",
       "q"=>"-1",
       "r"=>"0",
       "s"=>"2"}],
    "t"=>["1"],
    "u"=>"hoge"}]}
```

初めて見た時はさっぱりわかりませんでした。
文字列"hoge"を取り出したい場合は、
`result["b"][0]["u"]`としてあげると取り出せます。
この`[hash][array][hash]`の並びが見えてくるまでひたすら打ち込んでました。
JavaScriptのGmail APIでメール送信する時のBase64エンコード

@laco0416 です。前にDartでも[同じような記事](http://qiita.com/laco0416/items/d81a5850a461a161e67c)書いたけどJavaScriptでも同じことしようとしたら躓いた。

## 日本語メールをGmail APIで送るのに必要なステップ
日本語というかマルチバイトなUTF-8文字列をGmail APIで扱えるBase64文字列に変換する。

1. 件名(Subject)をURL-UnsafeなBase64文字列にエンコードする
2. メール全体をURL-SafeなBase64文字列にエンコードする

Subjectに個別のエンコードが必要な理由は最初に触れたDartの方の記事で書いてるので気になる方は参照してほしい。

## URL-UnsafeなBase64文字列
普通にJavaScriptでBase64に変換するとこっちになる。

日本語を含まない場合は

```js
window.btoa(str);
```

でいいが、日本語が入る場合は

```js
window.btoa(unescape(encodeURIComponent(str)));
```

で、非ASCII文字をエンコードした後にBase64化する必要がある

## URL-SafeなBase64文字列
通常のBase64には`+`と`/`が使われているが、URL-SafeなBase64ではこれらを変換する必要がある。Dartでは関数のオプションで指定できたが、JavaScriptでは専用の関数が用意されていないので自力でやる必要がある。上記のURL-UnsafeなBase64を作った後に、次の置換を入れる

```js
str.replace(/\+/g, '-').replace(/\//g, '_');
```

## 適当なサンプル
メールの組み立てはこんな感じになる

```js
var mail = [
        "To: $to",
        "Subject: =?utf-8?B?$subject?=",
        "MIME-Version: 1.0",
        "Content-Type: text/plain; charset=UTF-8",
        "Content-Transfer-Encoding: 7bit",
        "",
        "$body"
      ].join("\n").trim();
mail = mail
  .replace("$to", this.to)
  .replace("$subject", window.btoa(unescape(encodeURIComponent(this.subject))))
  .replace("$body", this.body);
var encoded = window.btoa(unescape(encodeURIComponent(mail)))
  .replace(/\+/g, '-').replace(/\//g, '_');
sendMail(encoded); 
```

## Gmail APIのドキュメントが間違ってる
ところで、Gmail APIの[ドキュメント](https://developers.google.com/gmail/api/v1/reference/users/messages/send?hl=ja)では`messages.send`のサンプルコードは次のようになっている

```js:ドキュメントのサンプルコード
function sendMessage(userId, email, callback) {
  var base64EncodedEmail = btoa(email);
  var request = gapi.client.gmail.users.messages.send({
    'userId': userId,
    'message': {
      'raw': base64EncodedEmail
    }
  });
  request.execute(callback);
}
```

が、これはバージョンが古く、現在は`message`ではなく`resource`プロパティにメールの文字列を渡すようになっている。

```js:今動くやつ
function sendMessage(userId, email, callback) {
  var base64EncodedEmail = btoa(email);
  var request = gapi.client.gmail.users.messages.send({
    'userId': userId,
    'resource': {
      'raw': base64EncodedEmail
    }
  });
  request.execute(callback);
}
```

フィードバックは送ったが、ドキュメントにバージョンを書くか、更新するかどっちか(できればどっちも)やってほしい。
たまに役立つCプリプロセッサTIPS

Cプリプロセッサ（CPP）の小技をまとめてみます。

もはや古くさいバッドノウハウだと思い込んでいたのですが、実はC#でも役立つ知識なのかもしれません。

# `#if`の条件が期待通りに動いているか確認したい

`#if`がネストしていたりするときに、いま期待通りの分岐に入っているか確認したい、ということがあります。

そんなとき、分岐に`#warning foo`などと入れるとコンパイル時に下記のように表示されるので、どの分岐が採用されたかの確認ができます。

```
/home/hnw/work/bar/baz.c:254:2: warning: foo [-W#warnings]
#warning foo
 ^
```

`#warning`の本来の用途は「この機能/ヘッダファイルは非推奨ですよ」などとプログラマに伝えるためのものだと思います。念のため。

# `#if`のネストが深いので整理したい

各種プリプロセッサディレクティブは下記のようにインデントできます。`#if`のネストごとにインデントすると随分読みやすくなります。`#`の前にも後ろにもスペースを入れることが可能ですが、世間的には行頭に`#`を置いて、それ以降をインデントする流儀の方が多そうです。

```
#ifdef DEBUG
#    if defined(ZTS) && VERSION_ID >= 70000
...
#    endif
...
#endif
```
pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その2

## Pythonでのグラフ描画

Pythonチャートを描く場合の定番は「matplotlib」ですが、その見た目のやや野暮ったい感じと、表記法のややこしさが指摘されています。
そこで、この記事ではMatplotlibの機能をより美しく、またより簡単に実現するためのラッパー的存在である、「Seaborn」の使い方を取り上げます。



詳しくは下記リンクをご覧ください。
本記事では下記記事でのSeaborn、及びiris,tip,titanicのデータがインポートされている前提で進めます。

◆pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その1
http://qiita.com/hik0107/items/3dc541158fceb3156ee0


## 分布プロット
ここではtipデータを使ってみます。
曜日ごとに、お客さんの会計（total_bill）がどう分布しているかを見てみましょう。
stripplotというメソッドを使います。

```py:stripplot.py
sns.stripplot(x="day", y="total_bill", data=tips)
```

![stripplot.png](https://qiita-image-store.s3.amazonaws.com/0/68432/00349b80-b781-5631-a385-8e084873745a.png)


同じ食事でも、朝食と夕食では大分金額が違いそうなので、前回も使った"hue"を使って
LunchとDinnerを分けて見てみましょう。

```py:stripplot.py
sns.stripplot(x="day", y="total_bill", data=tips, hue='time')
```
![stripplot2.png](https://qiita-image-store.s3.amazonaws.com/0/68432/2184364c-f515-f253-59d9-1e955be24d93.png)

この店は土日にはランチをやっていないようですね。
オフィス街の飲食店と何でしょうか？..


## 箱ひげプロット
boxplotというメソッドを使います。

```py:stripplot.py
sns.boxplot(x="size", y="tip", data=tips.sort('size'))
```

![boxplot.png](https://qiita-image-store.s3.amazonaws.com/0/68432/614ab5aa-e989-0fe6-9bd3-0588748a6605.png)


ちょっとここではグラフのパレットの色を変更してみました。
やりかたはこんな感じです

```py:stripplot.py
flatui = ["#9b59b6", "#3498db", "#95a5a6", "#e74c3c", "#34495e", "#2ecc71"]

sns.palplot(sns.color_palette(flatui))
sns.set_palette(flatui)
```

![color.png](https://qiita-image-store.s3.amazonaws.com/0/68432/5b84c381-9bfe-458b-b603-8772aeebaae9.png)

詳しくはこちらをご覧ください。
http://stanford.edu/~mwaskom/software/seaborn/tutorial/color_palettes.html


## 棒グラフ

ここではtitanicのデータを使ってやってみます。
グラフの描画にはboxplotというメソッドを使います。

```py:barplot.py
sns.barplot(x='sex', y='survived', data=titanic, hue='class')
```

x軸に性別、y軸には survived つまり生存者か死者かが1と0で入っているデータ列を選択しています。
この場合、例えば性別＝maleのレコードが沢山存在するので、Y軸に使われる数字は各レコードの平均値になります。
そして、全レコードの値を表現するために、平均値からのエラーバーが付与されます。

このあたりはちょっと注意して使う必要があるかもしれません。

![barplot.png](https://qiita-image-store.s3.amazonaws.com/0/68432/d73fbaf9-4da1-2f0c-d2ae-efb51dbca6b3.png)


もし、平均ではなくSurvivedの合計値が欲しい場合は、一旦Pandasで集計してやってからグラフ化するのがベストでしょうか。もしかしたら他にもやり方があるかもしれません。


```py:barplot2.py
titanic_grpby = titanic.groupby( ['sex', 'class'])
titanic_data_for_graph = titanic_grpby['survived'].aggregate(sum).reset_index()

sns.barplot(x='sex', y='survived', hue= 'class', data=titanic_data_for_graph)
```
![boxplot2.png](https://qiita-image-store.s3.amazonaws.com/0/68432/a6a2c293-9c01-73b5-d2e7-e07f6517f13e.png)



## 棒グラフ(カウント)
Y軸の数値を、X軸に該当するデータのカウントにしたいときはCountplotをつかます。
ヒストグラムと同様に、x軸だけ定義すればOKです。

ちなみにグラフの色は、paletteというオプションでも指定可能です。

```py:countplot.py
sns.countplot(x='sex', hue='embarked', data=titanic, palette='Greens_d')
```

![countplot.png](https://qiita-image-store.s3.amazonaws.com/0/68432/f706ef2f-a92a-986a-63b3-6a2b18b67afe.png)
Xcode７にアップデートしたら、openFrameworks関連のプロジェクトがビルドできない問題


#環境
xcode7
openFrameworks0.8.4
OS X 10.10.sdk

#①'openssl/ssl.h' file not found


日本時間９月１７日にリリースされた、Xcode7
これにアップデートしてしまうと、openFrameworks関連のプロジェクトが全てrunできないようになってしまいました......
この画像のような感じになってしまいます。

![スクリーンショット 2015-09-20 11.03.30.png](https://qiita-image-store.s3.amazonaws.com/0/83460/a72abab2-ea66-f8bd-03fe-eb25f72a2a95.png)

エラーの理由が

'openssl/ssl.h' file not found

つまり、openssl/ssl.hのファイルが存在しないということらしいのですが、正直意味わかりません状態です
特にコードもいじっていないのにも関わらず、examplesにはいってるものや、過去のrunできてたプロジェクトもすべて同じエラーがでてきてしまいます


そこで、血眼になって解決策をネットで探してみると、

[Warning : before upgrading to Xcode 7](http://forum.openframeworks.cc/t/warning-before-upgrading-to-xcode-7/20755)

このページにたどり着きました

いろんなサイトを行ったり来たりしましたが、ここでのやり取りが一番わかりやすかったです
すべて英語ですが。


#②解決方法-1

さきのサイトで述べられている解決策は

Xcode7の中に、今までのバージョンでは入っていたOS X 10.10.SDKが入っておらず、最新のOS X 10.11.SDKしか入っていない
これが原因だから、もう一度OS X 10.10.SDKをxcode７にいれてあげろ！

とのことです

で！
そのためには、Xcodeを７にアップデートする前にOS X 10.10.SDKを忘れずにコピー取っておかないとね
とさらっと書いてありますが、


そんな無茶な！！！
それを知る前にアップデートしたやつはどうするんだ！！

と僕と全く同じ意見を述べる人が...

そんな時のためにと、今までSDKのディレクトリを保存してるGithubのレポジトリを教えてくれています

一応自分もOSX.10.10のSDKをGithubにあげたので、そのページをここに載せます

[Mac OS X 10.10 SDK](https://github.com/BigHappy/MacOSX10.10.DK)

ここからでも、もとからコピーを取っていた人ももとりあえず、なんとかして

OS X 10.10.SDK

を手に入れてください



#③解決方法−2



つぎにこれを以下のパスにコピーします

```
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
```


Finder、アプリケーションを開いて、xcodeのところで、右クリックを押して「パッケージの内容を表示」をクリック


でContentsディレクトリを開きどんどんあけていき、SDKsディレクトリまでいき、そこへドラッグアンドドロップしていれてあげる



#④解決方法-3

このままでは、まだビルドしてもうまくいきません
最後に自分のビルドしたいプロジェクトで使うSDKを10.10に変更しなければなりません



Xcodeのプロジェクトを開いたら、openFrameworksLib.xcodeprojを開き
TARGETのBuild Settingsをクリック

でBASE SDKのところを
OSX 10.11　から　OSX 10.10へと変更してあげると、成功です！
（万が一、BASE SDKのところにOSX 10.10がはいっていない場合は、うまく解決方法-2のところができておらず、XcodeのSDKsディレクトリの中に10.10SDKが入れられていないです。)




#参考
[Warning : before upgrading to Xcode 7](http://forum.openframeworks.cc/t/warning-before-upgrading-to-xcode-7/20755)
[OS X targets using Swift cannot be built against an SDK older than 10.10, but the effective SDK is 10.9](http://qiita.com/susieyy/items/aaaf1e6d844d3a68d0e4)
MyGem.loggerでloggerを設定

ActiveRecordやRefile、OmniAuthなどはGem毎のloggerを設定できる。

Refileの実装を見てみるとmoduleのインスタンス変数としてloggerを用意している。

```ruby
module GemName
  class << self
    attr_accessor :logger
    
    def configure
      yield self
    end
  end
end

require 'logger'
GenName.configure do |config|
  config.logger = Logger.new($stdout)
end
```

使うときは `GemName.logger.info`と全力で。どこからでも呼び出せる。

```ruby
GemName.logger.info 'Start do something'
```

プログラムの初期化時にloggerを指定することができるため、フレームワークが用意したロガーを使うことも簡単。

```ruby
# configure blockを使う
GemName.configure do |config|
  config.logger = Rails.logger
end

# 直接代入もできる
GemName.logger = Rails.logger
```

loggerが必要だったらこれに似た方法でloggerを設定できるようにすればいい。

## あまり勧めない例

エントリポイントで生成したloggerを頑張って引数で渡し続けるやつ。

```ruby
require 'logger'
module GemNname
  class CLI
  
    def run(*args)
      logger = Logger.new($stdout)
      options = { ... }
      # 引数で渡すよ！
      DoSomething.new(logger, options).execute
    end
  end
  
  class DoSomething
    # 渡ってきたよ！
    def initialize(logger, options)
      @logger = logger
      @options = options
    end
    
    def execute
      logger.debug 'Start do something'
    end
  end
end

GemName::CLI.new.run(ARGV.dup)
```

この形で書かれた中規模のプログラムがあって辛い思いをしてる。

というのもlogを出力したいだけなのに呼び出し階層を辿ってコンストラクタなどにloggerをいちいち追加する必要があるから。

好きなタイミングでログを出力したいけど、別にloggerの取得方法に興味はないし、そのために引数を増やすなんてことはしたくないのだ。
ProcessingのエディタとしてCodepoemsを使う

## Codepoemsとは

Nahuel Coppero氏作成のProcessing用エディタというかIDE。まずはリンク先の動画とか見るほうが分かりやすいと思います。インテリジェントで期待値は高め。

[https://vimeo.com/139726992](https://vimeo.com/139726992)
[http://hinecsoft.com/codepoems/](http://hinecsoft.com/codepoems/)

2015年9月時点ではMac版のみ使用可能ですが、Windows/Linux版も公開予定の様子。

## 特徴

* ライブドキュメンテーション機能：コード上でコマンドを選択すると、コマンドの説明がサブウィンドウで読める
* JSONやXMLが開ける
* Sublime Textのショートカットが使える
* メディアビューア
* ~~入力補完~~（現時点でテストしたら効きませんでした）
* P5Mというモジュールを手軽にインストール可能

## インストール

[Githubのリンク](https://github.com/necsoft/codepoems)からdmgファイルをダウンロードして、使用環境のApplicationsフォルダにインストール。

## （もしもの時の）トラブルシューティング Macの場合

自分の環境では、Processing3.0b2.appを入れてたためか、

```
/usr/bin/processing-java: line 2: cd: /Applications/Processing_ 3.0b2.app/Contents/Java: No such file or directory
```

こんな感じのエラーがコンソールに出たので、（vim使いじゃないのでファイル操作GUIでいきます）

1. Finderのメニュー→移動→「/usr/bin/processing-java」
2. processing-java.execをSublime Textなどのテキストエディタで開く
3. 以下のような形で形で書かれてるので、2行目冒頭の

```
cd "/Applications/Processing.app/Contents/Java" && 

```
Processing.appのファイル名を変更。

```
/Applications/Processing.app/Contents/PlugIns/jdk1.8.0_XX.jdk

```
同じ行の「jdk1.8.0_XX.jdk」のバージョンを、Processing.app→コンテキストメニュー→「パッケージの内容を表示」から階層を辿り、確認して修正

で動きました。

# 最後に

触った感じはとても良いので今後に期待！
【初心者】railsでdeleteメソッドがgetで受け取られてしまう場合の対処法

#解決方法
##application.jsのコメントを消してはいけない
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

完全にこれはただのコメントなので削除して大丈夫だと思い込んでいたのですが、コメントではないようです。

具体的にはこれが動かなくて困っていました

<%= link_to '削除', member_path(member.id), method: :delete ,data: {confirm: "ok?"} %>

削除メソッドが動かないという方がいたら是非
Github Pagesで何が作れるのか


いまさらGithub Pagesについてまとめ直します。というかメモします。メモを自分で打たないと忘れるので。

# Q: Github Pagesで提供されるURLは？

## A: ``http(s)://username.github.io`` か ``http(s)://organizationname.github.io``

githubでは個人ユーザーじゃなくて組織も作れて、チーム管理できるのでその組織を作ったら組織(organization)の名前のgithubpagesもつくれる。（組織の作り方は忘れた）httpsでもアクセスできたのでラッキー。

# Q: どこにページを作成するの？
## A: リポジトリの下のgh-pagesブランチの中 or username.github.io というレポジトリの中。

* username.github.ioというレポジトリを作るとそこのmasterがホスティングされます。[参考:pages.github.comのuser-site](https://pages.github.com/#user-site)

* 自分が他にリポジトリを持っている時、そのリポジトリに、gh-pagesというブランチを作成すると、``http(s)://username.github.io/repository`` というパスにホスティングされます。[参考:pages.github.comのproject_pages](https://pages.github.com/#project_pages)

# Q: 動的HTMLはできるの？
## A: できない。

今度なんかあったら足します。
CentOS6.5 Ruby on rails環境構築

- 2015年09月22日修正・追記
- 2015年11月12日追記

#### 環境
- Windows 8.1
- Surface 3 pro
- VirtualBox 5.0.2
- Vagrant 1.7.4
- CentOS 6.5 x86_64
 
## rbenvのインストール
- sudo yum install -y git
- git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
- git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
- echo 'export PATH="\$HOME/.rbenv/bin:\$PATH"' >> ~/.bash_profile
- echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
- source ~/.bash_profile
- rbenv --version

## Rubyのインストール
- rbenv install --list
- sudo yum install -y openssl-devel readline-devel zlib-devel
- rbenv install 2.2.3
- rbenv versions

#### バージョンの選択
- rbenv global 2.2.3
- rbenv version

## Ruby on Railsのインストール
- gem update --system
- gem install --no-ri --no-rdoc rails
- gem install bundler
- rbenv rehash
- rails -v

#### rails server実行時のエラーへの対処
- sudo yum install -y sqlite sqlite-devel
- gem install sqlite3 -v '1.3.10'

###### ここから仮想環境外での操作
- Vagrantfileの「config.vm.network」の項目のコメントアウトを解除
- guestのポートを3000に、hostのポートも3000に
- config.vm.network "forwarded_port", guest: 3000, host: 3000

###### ここからアプリケーションのディレクトリ内での操作
- Gemfileの「gem 'therubyracer', platforms: :ruby」のコメントアウトを解除
- bundle install
- rails server -b 0.0.0.0
- http://localhost:3000にアクセス
※プロキシを設定しているとサーバにつながらないみたいです！


## 参考URL
- http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/
- http://qiita.com/murachi1208/items/f3f15b41d6651cc57368