OmniAICreator/Qiita-1.07M huggingface dataset:
TouchIDを使った認証


iOS8から使用可能になった指紋認証のTouchID APIの使い方のまとめです。
frameworkの追加が抜けていたり、Swiftのコードがなかったりしたので、まとめてみました。

## LocalAuthentication.frameworkをプロジェクトに追加

![スクリーンショット 2016-06-06 15.20.27.png](https://qiita-image-store.s3.amazonaws.com/0/44140/9342aa52-e036-2827-84fc-276048f5f1d8.png "スクリーンショット 2016-06-06 15.20.27.png")
## LocalAuthenticationをViewControllerにインポートして実装

```ViewController.swift
import UIKit
import LocalAuthentication

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let context = LAContext()
        var error : NSError?
        if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error) {
            context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: "サンプル確認のための認証チェック", reply: {
                success, error in
                if (success) {
                    NSLog("認証成功")
                } else {
                    NSLog("認証失敗：" + error!.code.description)
                }
            })
        } else {
            NSLog("TouchID非対応")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
}
```

ポイントは以下の通りです。

* LocalAuthenticationをimport
* LAContext.canEvaluatePolicyでTouchID端末かを判定
* LAContext.evaluatePolicyでTouchID認証のアラート表示、及びコールバック制御する

## TouchID端末で実行時

![Screen Shot 2016-06-06 at 15.16.26.png](https://qiita-image-store.s3.amazonaws.com/0/44140/8543947a-e0fc-00c0-d860-0c9768c22dc3.png "Screen Shot 2016-06-06 at 15.16.26.png")

上記の画像のように認証用のアラートが出てきて、指紋認証が成功すれば、認証OKです。

## 非TouchID端末で実行時

非TouchID端末では、以下のように認証用のアラートが表示されず、ログが出力されるだけになります。

![スクリーンショット 2016-06-06 15.27.07.png](https://qiita-image-store.s3.amazonaws.com/0/44140/c638a0a7-bdf6-c529-27fb-5b80fe7d8547.png "スクリーンショット 2016-06-06 15.27.07.png")

## iOSシュミレータでTouchIDを使用する場合

iOSシュミレータの「Hardware」-「TouchID」の項目にチェックを入れると、iOSシュミレータでも実機と同様にTouchIDのアラートが表示されるようになります。

![スクリーンショット 2018-08-28 18.24.47.png](https://qiita-image-store.s3.amazonaws.com/0/44140/cf0f3090-e103-acc3-0202-879eb5b9ccfa.png "スクリーンショット 2018-08-28 18.24.47.png")


## 参考
[Local Authentication Framework Reference](https://developer.apple.com/library/ios/documentation/LocalAuthentication/Reference/LocalAuthentication_Framework/index.html#//apple_ref/doc/uid/TP40014520)
bottle 0.11 -> 0.12の罠

Bottle.pyを0.11から0.12にあげたところ罠にはまったので備忘録。
----

互換性ェ・・・


0.12系も成熟しただろうと今更に更新かけたら見事に爆死した。

simpleTemplateで1行ifが使えなくなってる
----
くっそハマって死んだところ。
SimpleTemplateの挙動が非常にマトモになったらしく、それ自体は喜ばしいのだれど、曖昧だったところ定義を厳密にしてくれたらしく、1行if / 1行forが使えなくなっている
if/forには必ず対になるendが必要。

```py3
% for item in items:
%   if item['hoge']==1: hoge+=1
% end
```
みたいなことをやっていたのが、全部ダメになった。。。

たしかに

```py3
% hoge = len(x for x in items if x['hoge']==1)
```
で済むとはいえ、ついループの数減らしたくなるじゃん？の結果がこの様。


```py3
% for item in items:
%   if item['hoge']==1: continue
% end
```
これとかも多用してたので、直すのがとても手間。

なにが鬱陶しいって、アクセスしに行くとテンプレートの文法エラーで500出るというのが。アクセスしてみないとわからない。。。

あと

```py3
% if hoge is None: hoge = "default-hoge"
```
をどう書き換えるかも悩みどころで

```py3
% if hoge is None:
%   hoge = "default-hoge"
% end
```
は冗長だし、かと言って


```py3
% hoge = "default-hoge" if hoge is None else hoge
```
も イマイチ読みづらく、困った。



response.filesの中身が独自クラスに
----

0.11時代はcgi.FieldStorageだったのに、0.12ではFileUploadという自前クラスに。

http://bottlepy.org/docs/0.11/api.html#bottle.BaseRequest.files
http://bottlepy.org/docs/0.12/api.html#bottle.BaseRequest.files

`file`は変わらずFile-like objectなので良いけれど
`value`がなくなってらっしゃるので、len(value)で大きさとってたのが死んでた。
新しく`content_length`が追加されたので、これを信じればいいーのかなぁ？

`save`なる謎メソッドが追加されているのは、気持ち悪いのだけれど、もしかしなくとも速かったりするのかもしれない？

なにもSafeじゃないSafe Filename
----
いまどきにASCIIで255文字までしか受け入れなれないサーバとか滅べ！

上でも触れた`response.filesの中身`、今までのように`filename`を呼ぶとありがたいことに去勢されたゴミを返してくれるようになった模様。
BASE64エンコードされるとかそういうのじゃなく、単純に正規表現でASCII以外はばっさりカットされるっていうな。

> Safe Filename: The .filename attribute contains a normalized version of the client side file name to ensure maximum file system compatibility (lowercase, no whitespace, no path separators, no unsafe characters, ASCII only).

なにがSafeじゃ。馬鹿か。
日本語ファイル名が拡張子だけになってたぞ

「あいう.txt」
　↓　ASCII以外を削除
「.txt」
　↓　不可視ファイルはダメ
「txt」

simpleTemplateのincludeとかその辺
----
~~クソコードを悔い改めてくれた~~
処理系がまともになった模様。
0.11では 0.10までのキーワードから関数に文法変更したのに、パーサがガバガバで新文法が使い物にならなかったのがマシになったっぽい？

よくなったところ
----
- redirectするとhookが引っかからないとかいう残念バグが解消
- postの引数の数制限が消滅


これだけで更新する価値はあるんだが、だが、移行がこんな辛いとは、、、
ASP.NET Web APIのポインタ（リンク集）


# 背景
SQLServerに格納されたデータにAPIをつけたくなったので、ASP.NET Web APIを使うことにしました。
主要なポインタを集めます。

# ポインタ
## 公式サイト
最新情報を得るには公式サイトが一番です。

[ASP.NET Web API | The ASP.NET Site](http://www.asp.net/web-api)

日本語版は入り口だけ日本語です。中身は公式サイトへのリンクです。

[ASP.NET Web API 2](https://msdn.microsoft.com/ja-jp/library/dn448365(v=vs.118).aspx)

## from 日本人

### 味噌さん
味噌さんがASP.NET Web APIの神です

- [ASP.NET Web API カテゴリーの記事一覧 - miso_soup3 Blog](http://miso-soup3.hateblo.jp/archive/category/ASP.NET%20Web%20API)
- [50分で掴み取る ASP.NET Web API パターン＆テクニック](http://www.slideshare.net/miso_desu/50-aspnet-web-api)

メディア掲載時は矢後比呂加（やごひろか）さん名義です。

- [RESTful HTTPサービス開発を実践！ASP.NET Web API徹底解剖｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/column/01/prog/2013/aspwebapi)
RESTful APIをわかっている人向けの要約
- [連載：ASP.NET Web API 入門 - ＠IT](http://www.atmarkit.co.jp/ait/series/1176/)
長いので読むのが大変

### okazukiさん

okazukiさんも幾つかブログ記事を書いています。

[ASP.NET カテゴリーの記事一覧 - かずきのBlog@hatena](http://blog.okazuki.jp/archive/category/ASP.NET)

### qiita
`ASP.NET_WebAPI`タグが使われています。

- [ASP.NET_WebAPIに関する5件の投稿 - Qiita](http://qiita.com/tags/ASP.NET_WebAPI)


## 本
当然、日本語の本はありません。

-  [Pro ASP.NET Web API](https://www.amazon.co.jp/dp/B00ACC69WO)
- [ASP.NET Web API 2](https://www.amazon.co.jp/dp/B00LPDVBMW)
- [Mastering ASP.NET Web API](https://www.amazon.co.jp/dp/B01D00F3BC)

この辺が良さそうな気はします。読んだことはありません。

# 感想
日本語の情報はとても少ないです。
味噌さんの記事を一通り読んでキーワードを理解して、公式サイトを読むのが良さそうです。
ページ内スクロールのメニューに現在地を表示する

* メニューをクリックしたらそのコンテンツにスクロールする
* スクロールしたらそのメニューがアクティブになる

いろいろな方法があるが、HTMLもJSも記述やルールを少なく、数が変わっても楽に対応したい。
「メニューとコンテンツの数と順番が同じ」これだけ必須。(これがずれることはあまりないと思うけどw)

```html
<ul class="menu">
    <li>メニュー1</li>
    <li>メニュー2</li>
    <li>メニュー3</li>
    <li>メニュー4</li>
</ul>
<ul class="con">
    <li>コンテンツ1</li>
    <li>コンテンツ2</li>
    <li>コンテンツ3</li>
    <li>コンテンツ4</li>
</ul>
```

```js
$(function(){

var menu = $('.menu li'),
        menuLen = menu.length,
        con = $('.con li'),
        conArr = [],
        conArrLen,
        pos;
$(window).on('load resize',function(){
    for (var i=0;i<menuLen;i++) {
        pos = con.eq(i).offset().top - 10;
        conArr[i] = pos;
    }
    conArrLen = conArr.length;
});

menu.click(function(){
    var i = menu.index(this);
    pos = conArr[i];
    $('html,body').animate({'scrollTop':pos},600);
});

$(window).on('load scroll',function(){
    posCheck();
});

function posCheck(){
    var scrollPos = $(window).scrollTop();
    for(var i=0;i<conArrLen;i++){
        if(conArr[i] <= scrollPos && scrollPos < conArr[i+1]){
            menu.removeClass('active');
            menu.eq(i).addClass('active');
            break;
        }
    }
}

});
```

珍しく解説版

```js
$(function(){

var menu = $('.menu li'),
        menuLen = menu.length,
        con = $('.con li'),
        conArr = [],
        conArrLen,
        pos;

//ページ読み込み完了時とウィンドウサイズ変更時にセット
$(window).on('load resize',function(){
    //コンテンツのポジションを配列に格納
    for (var i=0;i<menuLen;i++) { //メニューの数だけコンテンツのポジョションを取得
        pos = con.eq(i).offset().top - 10; //ぴったりだとUI的に良くないので少しずらす
        conArr[i] = pos;
    }
    conArrLen = conArr.length;
});

//メニューをクリックしたらそのコンテンツにスクロールする
menu.click(function(){
    var i = menu.index(this); //メニューのindexを取得
    pos = conArr[i]; //ページ読み込み完了時につくった配列から取得
    $('html,body').animate({'scrollTop':pos},600);
});

//スクロールしたらそのメニューがアクティブになる
$(window).on('load scroll',function(){
    posCheck();
});

function posCheck(){
    var scrollPos = $(window).scrollTop();
    for(var i=0;i<conArrLen;i++){
        if(conArr[i] <= scrollPos && scrollPos < conArr[i+1]){ //スクロールポジションがi番目のコンテンツとその次のコンテンツの間にあるかどうかを調べる
            menu.removeClass('active');
            menu.eq(i).addClass('active');
            break; //一致したらactiveの処理とforを終了する
        }
    }
}

});
```

注意すべきところは、
コンテンツのポジションを取る時に、`load`の後でないと高さが違ってしまう場合がある。
というくらいでしょうか？
PHPでx-imap4-modified-utf7の文字列をUTF-8にエンコードする

## TL;DR

`imap_utf7_decode()`じゃなくて`mb_convert_encoding()`でOK。

## そもそも`x-imap4-modified-utf7`とは?

### どんなものか

`x-imap4-modified-utf7`という文字コードは、私もこの問題に直面するまでは訊いたことがありませんでした……。
少し調べてみると、どうも素のUTF-7というものの修正版であり、IMAP4を使って**フォルダ名**なんかを表示するために改良されたものらしい?

### どこで使われているのか

私がこの問題に直面したのは、Thunderbirdというメールクライアントソフトでのフィルタの設定です。
ここには、**どのフォルダ**にメールを格納するのか。という情報を持つ部分があって、このフォルダ名のエンコードに使用されていました。

## PHPで利用する

### `imap_utf7_decode()`

ちょこっとググるとPHPには[imap_utf7_decode](http://php.net/manual/ja/function.imap-utf7-decode.php)という関数が用意されていることがわかります。

> 修正版`UTF-7`の`text`を`ISO-8859-1`文字列に デコードします。

じゃあ`UTF-8`で使いたい場合は、もう一度`ISO-8859-1`から`UTF-8`に変換しないといけないのかな。

とりあえず動かしてみるテスト

```php
echo imap_utf7_decode('actionValue="imap://hogehoge.com/INBOX/00-&MMYwuTDI-/&MGYwWTBo-"');

PHP Fatal error:  Call to undefined function imap_utf7_decode()
```

……えっ。

### `mb_convert_encoding()`

実はこの`x-imap4-modified-utf7`、[mb_convert_encoding](http://php.net/manual/ja/function.mb-convert-encoding.php)だけでも変換が可能でした!

早速試すテスト

```php
echo mb_convert_encoding('actionValue="imap://hogehoge.com/INBOX/00-&MMYwuTDI-/&MGYwWTBo-"', 'utf8', 'utf7-imap');

'actionValue="imap://hogehoge.com/INBOX/00-テスト/てすと'
```

ブラボー!! :tada: 

`imap_utf7_decode`が`undefined`とか言われてからバージョンの確認もしたのだけれどよくわからず……。
普通に`mb_convert_encoding`でエンコードが出来て助かりました。

Thunderbirdを何か使ったりとか、それ以外でもフォルダ名とかを扱うものと連携するときに必要になるかも。
「`&MMYwuTDI-`」こんなのとか「`&MGYwWTBo-`」こんな文字をエンコードすることになったら一度この記事を思い出してみて下さい。
フロントエンドな人の為の Gulp 環境

バックエンド側の対応をしない、もしくは納品後に対応してもらうなどの
静的な感じのサイトをつくる人（僕とか）の為の Gulp 環境です。

そもそも Gulp が基本的にはフロントエンドの為のものですので、バックエンド側の対応を考えないというか、
例えば SPA とかじゃなくて、普通のサイトを作るって事に特化した環境と考えてもらえれば良いかと思います。

# GitHub
https://github.com/syuji-higa/scaffold-frontend-gulp
実験の場でもあるので、余計なファイルとかも入っています。

# ざっくりな説明と気にかけた箇所

## task
作業用途に応じて用意。

* プロダクション用のタスクを用意

## local server
[BrowserSync](https://www.browsersync.io/) を使用。

* PHP を動かす必要もあったりするので、それようのローカルサーバー（[gulp-connect-php](https://github.com/micahblu/gulp-connect-php)）も用意。  
また、それぞれのタスクと組み合わせられるようにオプションとして起動。

## watch
ファイル更新時にコンパイル＆ライブリロード。

* pug のテンプレートやインクルードファイルを更新時に、不要なライブリロードを行わない。  
参考：http://qiita.com/syuji-higa@github/items/23df9dec7cbe8e371c2a

## HTML
[pug](https://github.com/pugjs/pug) をコンパイル。

* pug ファイル中で使える[変数](https://github.com/syuji-higa/scoffold-frontend-gulp#用意されている変数)を用意。
* [filters](http://jade-lang.com/reference/filters/) に[記述をそのまま出力できるもの](https://github.com/syuji-higa/scoffold-frontend-gulp#用意されている-filters)を用意。  
PHP などを記述する場合に便利。
* プラグインを通す際に、必要なファイルだけ通すようにフィルターを用意。  
特定のファイルだけ拡張子を PHP に変換する際などに便利。
* [よく使うプラグイン](https://github.com/syuji-higa/scoffold-frontend-gulp#コメントアウトで用意しているプラグイン)はコメントアウトで用意。
* テンプレートファイルと json データからコンパイルできる [Factory](https://github.com/syuji-higa/scoffold-frontend-gulp#factory) を用意。  
似たような HTML の大量生成に便利。

## CSS
[stylus](http://stylus-lang.com/) をコンパイル。
[nib](https://tj.github.io/nib/) を使用。

## Image
スプライト画像生成と画像圧縮。

* 画像の圧縮は時間がかかるので、画像圧縮タスクとプロダクションタスク時の初回にだけ行う。

## JavaScript
基本は [Babel（es2015、stage-0）](https://babeljs.io/) をトランスパイル。
[webpack](https://webpack.github.io/) で結合。
パッケージマネージャーに [Bower](http://bower.io/) を使用。

* package.json で指定されている main 以外のファイルを使用する場合の alias を用意。  
納品の問題で丸ごと圧縮出来ず、min ファイルを使用したい場合などに便利。
* ユニットテストを用意。（とりあえず用意したけど使っていない）

## URL list
別ポートで html ファイル一覧を表示。

* サーバーにアップする用のファイルも出力可能。

### わざわざ用意した理由

* サーバーの設定でファイル一覧表示はできるが、index.html とか入れる必要があるのでなんか嫌だ。
* VirtualBox やスマホとかでアクセスするのが面倒なときがある。

# Clean
不要ファイルの削除。
プロダクションタスク時に合わせて実行される。

# 今後の課題など

* ~~ログの出方や順番がイマイチ~~ 解決した
* 初回起動に時間がかかる
* pug のテンプレートやインクルードファイルを更新時に必要なファイルだけ更新させたい
* [Bower](http://bower.io/) vs [npm](https://www.npmjs.com/) について考える
* gulp のグローバルインストールを辞めるべきかどうか

# 所感
まあ、やり過ぎな感じもしますが、それなりに便利に使えてるので良いかなって思ってます。
styleguide とかも入れてましたけど、使う機会がないようなので削除しました。
必要になればその時だけ入れれば良いかなと。

因みにこの環境は会社でほぼ同じものを使ってます。
僕自身は基本 JS だけ組み込んでて、マークアップとかは他の方が対応しているので、
みんなに使ってもらって修正・改修を重ねてる感じですね。

もっとスマートに且つ便利な環境に出来ればと思ってますので、またイロイロと考えてみます。
hostsファイルを利用したCDNの導入前テスト

# hostsファイルを利用したテスト
ブラウザでウェブサイトにアクセスする場合、通常は端末に設定されたDNSリゾルバを利用してアクセスしたいサイトの名前(例えばwww.example.com)からIPアドレス(123.123.123.xxxなど)を取得し、取得したIPアドレスにアクセスすることで Web コンテンツがブラウザ上に表示されます。

例えば何らかの理由で一般的に公開されている Web サイトではなく特定のサーバー/ネットワーク経由で Web サイトにアクセスしたい場合に、端末内にある hosts ファイルを利用することで指定した IP アドレス経由アクセスさせることが可能となります。

CDN は一般的に対象のサイトの DNSレコードを CDN サービスを提供するベンダーが指定する DNS レコードに CNAME（別名指定）することで導入します。

つまり hosts ファイルを利用して端末からのアクセスを CDN サーバーに向けることで、CDN を適用する前(DNSレコードを CDN に CNAME して向けていない）に CDN 経由での実際の挙動をテストすることが可能となります。

それでは以下に Fastly の CDN サービスを適用していない Web サイトに、テスト用端末から Fastly経由でアクセスしてテストを行う手順を説明します。
<br>

# CDN切り替え前にFastlyをテストする手順
1. テスト端末でFastlyから指定されたCNAMEホスト名（例えば “nonssl.global.fastly.net”) の名前解決をして下さい。
例
Mac : `dig nonssl.global.fastly.net`
Windows : `nslookup nonssl.global.fastly.net`
<br>

1. 1で返却されたIPアドレスを、テストを行うWebサイトのIPアドレスとしてhostsファイルに
"IPアドレス ホスト名" のフォーマットで保存して下さい
例 : 123.123.123.xxx www.example.com  
hostsファイルは通常以下の場所にあります
Windows : C:\WINDOWS\system32\drivers\etc\hosts
Mac : /etc/hosts
<br>
1. ブラウザのDNSキャッシュを削除するためブラウザを一旦閉じてから再度起動し、テスト対象のURLにアクセスして下さい。


Fastly経由でアクセスが行われている場合は、サーバーからのレスポンスヘッダーに以下の様なヘッダーが追加されています。ヘッダーが追加されていない場合は hosts の設定が正常に適用されていない可能性がありますので再度設定をご確認下さい。

X-Served-By: cache-xxx1111-XXX
X-Cache: HIT
X-Cache-Hits: 3

_レスポンスヘッダーはブラウザの Developer Tool や Firebug などの Plug-in を利用することで確認可能です。_


#ブラウザ以外での動作確認方法

ブラウザ以外にHTTPリクエストをシュミレートするcurlコマンドなどを利用して挙動を確認することも可能です。

Fastly-Debugヘッダーを付与したcurlコマンドのサンプルは以下となります。
`curl -svo /dev/null -H 'Fastly-Debug:1' 'http://www.example.com/index.html'`

なお、curl を利用した場合、以下のように hosts ファイルを変更せずに直接IPを指定して Host を明示的に指定するという方法でも Fastly 経由でアクセスをさせることが出来ます。

`curl -svo /dev/null -H 'Fastly-Debug:1' -H 'Host: www.example.com' 'http://<ip address>/index.html'`

# TTL の確認と Fastly-Debug ヘッダー

Fastly 経由で配信されたオブジェクトがキャッシュされているかどうか、またキャッシュされている場合のTTLはどうなっているかを確認するためには Fastly-Debug ヘッダーが利用できます。

HTTPリクエストにFastly-Debugヘッダーを付与することで、レスポンスにキャッシュについてより詳しい情報を含メルことが出来ます。Fastly-Debug ヘッダーの詳細については以下のページをご参照下さい。

+ [FastlyにキャッシュされたオブジェクトのTTL確認方法](http://qiita.com/AtsushiFukuda/items/fb20f8a410b47396d83a)


Fastly-Debugヘッダーをブラウザのリクエストに付与するにはブラウザのPluginが便利です。
ブラウザ名とプラグイン、HTTP ヘッダー追加などで検索すると様々なプラグインが出てきますので使いやすそうなものを選んで使って下さい。
AndroidのVideoViewで最初と最後に入る黒いチラつきを失くす


VideoViewの最初と最後に黒い画面が入ってしまう問題の対応

```kotlin
  fun startVideo() {
    videoView.postDelayed({
      videoView.setBackgroundResource(R.color.bland_yellow)
    }, videoView.duration.toLong() - 100)
    videoView.start()
    Handler().postDelayed({
      videoView.setBackgroundResource(R.color.bland_clear)
    },200)
  }
```

xmlのvideoViewにはあらかじめbackgroundResourceを設定しておく。

要するに再生の最初200msとラスト100msをdrawableで覆っている。
**これでいいのかな…という気分になった**
Ubuntuにitamaeの環境を構築して実行するまでの手順

# 環境

Ubuntu14.04

# 概要

私がRailsなどの開発環境を構築するときは、VagrantでVM(Ubuntu14.04)を立てて、その中でitamaeを使ってライブラリをインストールするようにしています。
本記事では、Ubuntu14.04上でitamaeの環境を構築する方法を説明します。

# itamae環境構築

## ruby 2.2.4をrbenvのglobalにインストール
参考: [Ubuntu14.04にrbenvでRuby2.2.2をインストール](http://qiita.com/dayone/items/b8c3dff003fcfc55cdfe)

itamaeをインストールするためにはRuby2.0以上が必要ですが、Ubuntu14.04にデフォルトでインストールされているRubyのバージョンは1.9なので、まずはrbenvでRuby2.2.4をインストールします。


```
$ sudo apt-get update                  
$ sudo apt-get install -y git rbenv libssl-dev libreadline-dev
# .bashrcに以下を追記してrbenvのパスを通す
$ vi ~/.bashrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)" >> ~/.bashrc
$ source .bashrc                       

# ruby-buildリポジトリを取得し、.rbenv/plugins配下に展開
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build    
$ rbenv install 2.2.4
$ rbenv global 2.2.4
```

## [rbenv-sudo](https://github.com/dcarley/rbenv-sudo)をインストール

rbenv-sudoを使うと、rbenvでインストールしたrubyをsudo権限で実行できるようになります。
itamaeを実行する時にsudo権限が必要なので入れておきます。

```
$ git clone git://github.com/dcarley/rbenv-sudo.git ~/.rbenv/plugins/rbenv-sudo
```

## itamaeをインストール

```
$ gem install itamae
$ rbenv rehash
```

# itamaeの設定ファイル作成と実行

## 設定ファイル作成


```bootstrap.rb
module RecipeHelper
  def include_cookbook(name)
    include_recipe File.join(__dir__, "cookbooks", name, "default.rb")
  end
end

Itamae::Recipe::EvalContext.include(RecipeHelper)

include_recipe File.join("roles", node[:role] + ".rb")
```

```cookbooks/mysql/default.rb
# MySQLインストール
package 'mysql-server'
package 'libmysqlclient-dev'

# MySQL権限設定
execute 'mysql permission' do
  command <<-EOL
    chown mysql:mysql /var/log/mysqld.log
    chown -R mysql:mysql /var/lib/mysql
  EOL
end
```

```roles/web.rb
package 'vim'

execute 'apt-get update' do
  command 'apt-get update -y'
end

package 'build-essential' do
  action :install
end

include_cookbook 'mysql'

package 'nginx' do
  action :install
end

package 'openssl'
package 'git'
package 'iptables'
package 'ntp'
package 'libicu-dev'
package 'nodejs'
package 'npm'
package 'nodejs-legacy'
package 'cmake'
package 'imagemagick'
```

```nodes/vagrant.yaml
role: web
```

## itamae実行

```
$ rbenv sudo itamae local -y nodes/vagrant.yaml bootstrap.rb
```
環境構築手順

#環境構築手順


##Rubyなどのインストール

rubyバージョン確認
```$ ruby --v```

インストール可能一覧
```$ rbenv install --list```

インストール済み一覧
```$ rbenv versions```

ruby 2.3.0をインストール
```$ rbenv install -v 2.3.0```

再読み込み
```$ rbenv rehash```

rubyを最新版に設定
```$ rbenv global 2.3.0```



bundlerのインストール
```$ gem install bundler```

bundler
Railsアプリケーションに必要となるGemパッケージの種類やバージョンを管理し、複数のPCで必要なGemパッケージをインストールする仕組みのこと
　
bundlerのインストール、Gem fileを作成したディレクトリで実行を行う
（参照：http://www.rubylife.jp/rails/ini/index2.html）

##アプリケーション環境構築

gemのインストール
```$ bundle install ```
　Gem、Gemパッケージ
Rubyで使われるライブラリやアプリケーションはGemと呼ばれる形式のパッケージにすることが出来る

---

データベースの生成
```$ bin/rake db:create
$ bundle exec rake db:seed
$ bundle exec rake db:migrate```

railsサーバーの起動
```＄bundle exec rails s ```
Cocoapodsで管理してるライブラリのEnable BitcodeをNoにする方法

# なぜやるか
先日退勤際にiOSアプリの申請をしようとしたら、以下の様なエラーが。。。

```
ERROR ITMS-90635: "Invalid Mach-O Format. The Mach-O in bundle "Hoge.app/Frameworks/JSTokenField.framework" isn’t consistent with the Mach-O in the main bundle. The main bundle Mach-O contains armv7(machine code) and arm64(machine code), while the nested bundle Mach-O contains armv7(bitcode and machine code) and arm64(bitcode and machine code). Verify that all of the targets for a platform have a consistent value for the ENABLE_BITCODE build setting."

ERROR ITMS-90635: "Invalid Mach-O Format. The Mach-O in bundle "Hoge.app/Frameworks/FBSDKCoreKit.framework" isn’t consistent with the Mach-O in the main bundle. The main bundle Mach-O contains armv7(machine code) and arm64(machine code), while the nested bundle Mach-O contains armv7(bitcode and machine code) and arm64(bitcode and machine code). Verify that all of the targets for a platform have a consistent value for the ENABLE_BITCODE build setting."
```

# 対応方法
PodでインストールしたライブラリがBITCODEに対応してないようなので```Enable Bitcode```を```No```にしたいが
PodのBuildSettingはいじっても```Pod Update```のたびに上書きされてしまうので
以下のようにPodifle内にてインストール後上書きするように修正。

```rb:Podfile
post_install do |installer|
    # PodのBuildActiveArchitectureOnlyをNoに変更
    installer.pods_project.build_configurations.each do |config|
    	config.build_settings['ENABLE_BITCODE'] = 'NO'
    end 

    # PodのBuildActiveArchitectureOnlyをすべてNoに変更
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ENABLE_BITCODE'] = 'NO'
        end
    end
end
```


# Podfileに関する他のTips
[Podfileのこれだけは書いておきたい2つの設定](http://qiita.com/yo1106/items/6d0d12f6a4677de8518c)
Elm v0.17 と Electron


# TL;DR

Electronの`RendererProcess`でElm(v0.17)でコンパイルされたJSを動かすには

Elmのサンプルで

```js
var app = Elm.Main.fullscreen();
```

となっている部分を

```js
var app = module.exports.Main.fullscreen();
```

とすれば動く


# 何が起こっているか

## Elmが生成するJSの変化

Elmは0.17でかなりドラスティックなアーキテクチャの変更を行った事は知られているが、実はコンパイルされるJSも結構変化している。
具体的にはv0.16では問答無用にグローバルな`Elm`というオブジェクトを作っていたが、v0.17以降は`module`のtypeを調べ、objectとして存在する場合は`module.exports`に`Elm`を渡す以下のようなコードが生成される。


```js
if (typeof module === "object")
{
  module['exports'] = Elm;
  return;
}
```

これは一部界隈で時々話題に挙がるサーバーサイドでのElmの活用を睨んだ変化だと考えられる（要出典）

## ElectronのnodeIntegration

一方でElectronの`RendererProcess`を生成する、
`BrowserWindow`というAPIには、`nodeIntegration`というオプションが存在し、
Electronの各種APIを活用するにはほぼ必須のオプションとなっている。

このオプションは様々なフレームワークと一緒に使う場合に
同様の競合を引き起こすらしく、FAQにもその事に関する記述がある。

http://electron.atom.io/docs/faq/#i-can-not-use-jqueryrequirejsmeteorangularjs-in-electron


本当に単純なWebアプリをデスクトップ化したいだけなら思い切って
`nodeIntegration`をOff(`false`)にしてしまうのも手かもしれない。
その場合は従来通りグローバルなElmオブジェクトが生成され、サンプル通りのコードで動く。

# その他

elm+electronに関してはこれまで[記事に書いてきたりしました](http://qiita.com/yasuyuky/items/e28106e3dd7fed17d50f)が、
v0.17になり陳腐化しています。

[elmtrn](https://github.com/yasuyuky/elmtrn)も現状ではv0.16対応です。（そのうち直す気はあります。）

# 追記 
elmtrn v0.17 対応完了しました。
[System.Serializable]を使ってEditor上に調整パラメータを出す

処理を分割するためにクラスに分けたい、そして、そのクラスにはEditor上で調整したいパラメータがある。
けど、MonoBehaviourを増やしたくない。ってときは、
[System.Serializable]
を使えばOK。という話


例えば、こんなクラスがあって、

```csharp:
class GameManager : MonoBehaviour {
    public float myButtonWidth;
    public float myButtonHeight;
    ...
}
```
MyButtonクラスを新しく作ってbuttonWidthとbuttonHeightは、そっちに持たせたいなぁと思った時に、

```csharp
class MyButton {
    public float myButtonWidth;
    public float myButtonHeight;

    ...
}
```

ってして、

```csharp

class GameManager : MonoBehaviour {
    public MyButton myButton;

    ...
}
```
ってするだけだと、インスペクタに表示されません。

しかし、以下のように、MyButton クラスの頭に [System.Serializable] を記載しておけば、

```csharp
[System.Serializable]
class MyButton {
    public float myButtonWidth;
    public float myButtonHeight;

    ...
}
```
インスペクタ上に表示されます。
<img width="396" alt="Screenshot 2016-06-06 12.49.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/69390/c0761eb6-a08f-3fb7-d6be-e56bffce1af4.png">
pandasでデータ可視化

既に[先行記事](http://qiita.com/hik0107/items/de5785f680096df93efa)がありますが、pandasにはデータ可視化機能が備わっています。
matplotlibの薄いラッパーですが、これを使えば基本的なグラフのコードがかなり端折れます。


# Pandasを用いたデータ可視化

こちらに紹介されていたirisの可視化であれば、Rと同程度のコード量で可視化できます。

[Python for R Users](http://www.slideshare.net/ajayohri/python-for-r-users)
[Python と R の違い (データ可視化・グラフ作成編)](http://pythondatascience.plavox.info/python%E3%81%A8r%E3%81%AE%E9%81%95%E3%81%84/%E3%83%87%E3%83%BC%E3%82%BF%E5%8F%AF%E8%A6%96%E5%8C%96%E3%83%BB%E3%82%B0%E3%83%A9%E3%83%95%E4%BD%9C%E6%88%90/)

importが多いのはpythonの仕様ですが、現在のpythonでのデータ解析の生産性はかなり高いと感じます。
RもRstudio/dplyrが普及して生産性が向上していますが、pythonもJupyter/Pandasが普及して5年前とは様変わりしていると思います。
(numpy+matplotlibがメインだったころとは全然違います。)

## 必要パッケージ、データのロード

```py3
import seaborn as sns
import pandas as pd
iris=sns.load_dataset("iris")
%%matplotlib inline
```

おしゃれ感を出すためにseabornをimport。あわせて、seabornにはトイデータも入っているのでirisはここからload。

## 散布図

```py3
iris.plot.scatter(x="sepal_length",y="sepal_width")
```

![scatter.png](https://qiita-image-store.s3.amazonaws.com/0/52875/7b8048aa-4a45-8ce9-03e2-e8c25cbcb9b0.png)


## 箱ひげ図

```py3
iris.sepal_length.plot.box()
```

![box.png](https://qiita-image-store.s3.amazonaws.com/0/52875/c31ea348-37ba-d0f9-440e-2c9350aa1610.png)


## ヒストグラム

```py3
iris.sepal_length.hist()
```

![hist.png](https://qiita-image-store.s3.amazonaws.com/0/52875/5dc7e2d0-311e-5d9e-7f1f-969b184d3d60.png)

## ラインチャート

```py3
iris.sepal_length.plot.line()
```

![line.png](https://qiita-image-store.s3.amazonaws.com/0/52875/d45846cb-5dc0-17a1-5d20-2908a2fec15f.png)


## パイチャート

```py3
pd.crosstab(iris.species,columns="species").plot.pie(y="species")
```

![pie.png](https://qiita-image-store.s3.amazonaws.com/0/52875/3f4aa456-dcae-a3ff-02cd-b953a7d75181.png)

これはデフォルトではいくつか課題があります。
- デフォルト値が横長なため潰れてしまう
- labelが重なってしまう
- seabornにパイチャートがないために、カラーマップがなされない。

このために設定変えるのも微妙ですが、設定を追加すればきれいにかけます。

```py3
from matplotlib import pylab
default_size=pylab.rcParams["figure.figsize"]
pylab.rcParams["figure.figsize"]=12,12
pd.crosstab(iris.species,columns="species").plot.pie(y="species",colors=sns.color_palette())
```

![pie2.png](https://qiita-image-store.s3.amazonaws.com/0/52875/41efb42a-68e8-216f-2ad9-22c1067be45b.png)

サイズを変えたら戻しておきましょう。

```py3
pylab.rcParams["figure.figsize"]=default_size
```

## バーチャート

```py3
iris.sepal_length.plot.bar()
```

![bar.png](https://qiita-image-store.s3.amazonaws.com/0/52875/a56c534b-b0ad-a265-4748-6104dbf4dd02.png)

バーチャートはカテゴリ変数を想定しているからか、これだけデフォルトでは軸ラベルを間引いてくれなかったです。

matplotlibを直接呼び出すと間引いてくれます。（seabornをimport済みなので色合いはseabornになっています。）

```py
from matplotlib import pyplot as plt
plt.bar(iris.index,iris.sepal_length)
```

![bar2.png](https://qiita-image-store.s3.amazonaws.com/0/52875/a47672e6-d00c-d355-7f8f-046f15717020.png)


# まとめ

元スライドは前半でPandasの説明しているのに、後半の可視化ではPandasを使っていないためコードが冗長になっています。
複雑な事をしようとするとどうしてもmatplotlibのAPIを直接触る必要がありますが、
基本的な図であれば、PandasのAPIだけでシンプルにコーディング可能です。
基本統計量でデータに対する何となくを脱出

#とある場所での統計利用
とある申請時間と、実際の時間が大幅にずれてる！！！と言われたので、とある制度を導入した時のお話。
統計使って、精度良くなったかなとか判定できそう！！と思って、
復習がてらいくつかの基本統計量（要約統計量）についてまとめてみた。  

##1.平均値 (mean, average) 
めちゃめちゃ有名な統計量。統計をやったことない人も知っている。
が、意外とバカにできない数値。
標本(割る数値の方)が大きくなればなるほど、平均値は標本を代表する値になる。
大学数学の叡智が詰まっている数値（らしい）。

##2.分散(不偏分散)、標準偏差(variance,standard deviation)
各データから平均を引き、その2乗を合計して、データ数で割ったものが分散。
この2乗して計算するというのが結構な大発見だったとか。

    分散 = (データその1 - 平均)^2 + (データその2 - 平均)^2 ・・・・・/ データの数
      ※データの数-1で割ると不偏分散と呼ばれるものになります。  
       データの数が母集団（この世の全部とか、とある学部とか）なら-1する必要はないです。
       データの数が標本（母集団の一部）なら-1するのが通例



    標準偏差は分散をルートとったもの 
    標準偏差＝sqrt(分散)
    ※sqrt:√

###2-1何がわかるのか
　　平均値からのデータのばらつきがわかる
　　大きくなればなるほど、ばらつきが大きい（精度が悪い）

    ex.
    1 1 1 1 1 1 の標準偏差は0 平均は1 ⇒全部平均のデータなのでばらつきがない
    2 2 2 2 2 2 の標準偏差は0 平均は2 ⇒全部平均のデータなのでばらつきがない
    1 2 3 4 5 6 の標準偏差は1.87くらい 平均は3.5 ⇒平均から、大体データが±1.87くらい離れているよといった感じ

これだけでも、「何となく」を脱した気がする。。。
昔統計検定2級とったし、もったいないので定期的に復習していこう

##ほかの統計量
最頻値、中央値、尖度、歪度、レンジ、最大、最少、標本数、標準誤差
もあるがこちらはまた機会があれば。
[非デザイナー向け] 全端末サイズ分の AppStore 用スクリーンショットを用意する改


[[非デザイナー向け] 全端末サイズ分の AppStore 用スクリーンショットを簡単に用意する](http://qiita.com/takecian/items/f40b72a0f50abc660075)というのを去年書いたのですが、料金プランなどが変わってしまい無料では

- 1 デバイスサイズだけ
- 背景に使うiPhoneの色は白・黒のみ
- jpg出力のみ

しかできなくなってしまいました。

有料プランじゃないと実質使い物にならなくなったのですが有料プランが$99/年とちょっと高い・・。

# AppStore用スクリーンショットリサイズツールを作る

というわけで作ってみました。mac アプリにしてみました(Swiftで書きました)。

[Chansey](https://itunes.apple.com/jp/app/chansey/id1102274005?mt=12)
![screen800x500.jpeg](https://qiita-image-store.s3.amazonaws.com/0/27210/39f84043-009e-8606-c5b2-b5c33cc8eb04.jpeg "screen800x500.jpeg")

LaunchKit が$99/年なんで買い切り600円の有料アプリで販売してみることにしました。

※Chansey はポケモンの「ラッキー」の英語名です。

# Chansey の使い方

まずプロジェクトを作ります。
![スクリーンショット 2016-06-05 20.53.48.png](https://qiita-image-store.s3.amazonaws.com/0/27210/24e6ad74-c0ff-f64f-1dad-3cbffafc5e36.png "スクリーンショット 2016-06-05 20.53.48.png")

![スクリーンショット 2016-06-05 20.54.34.png](https://qiita-image-store.s3.amazonaws.com/0/27210/20bad175-d848-f65e-ddff-841961343482.png "スクリーンショット 2016-06-05 20.54.34.png")

iPhone のスクリーンショットを登録します。登録できる画像サイズは、

- 750x1334(iPhone 6,iPhone 6s)
- 1242x2208(iPhone 6 Plus,iPhone 6s Plus)

のどちらかのサイズです。

画像を登録した状態がこちら。

![スクリーンショット 2016-06-05 21.02.14.png](https://qiita-image-store.s3.amazonaws.com/0/27210/5e1a9d1b-ace5-586a-f2ae-b47c03a257b6.png "スクリーンショット 2016-06-05 21.02.14.png")

この状態でエクスポートするだけで AppStore での審査に必要なサイズのスクリーンショットを生成しますが iPhone にはめ込んだ状態にすることもできます。

![スクリーンショット 2016-06-05 21.02.27.png](https://qiita-image-store.s3.amazonaws.com/0/27210/c3c9de97-7b27-3c39-0a6e-85e952fc1495.png "スクリーンショット 2016-06-05 21.02.27.png")

ちょっとおしゃれになりましたね。

![スクリーンショット 2016-06-05 21.02.35.png](https://qiita-image-store.s3.amazonaws.com/0/27210/de3243f3-8041-b03d-f8b2-92fd9aef90f1.png "スクリーンショット 2016-06-05 21.02.35.png")

さらにテキストを追加したり、背景色やテキストの色を変えることもできます。

![スクリーンショット 2016-06-05 21.04.43.png](https://qiita-image-store.s3.amazonaws.com/0/27210/067f2cac-2ab7-46fa-f8bc-7af0b7db0f48.png "スクリーンショット 2016-06-05 21.04.43.png")

編集が完了したらエクスポートすることでAppStore での審査に必要なサイズのスクリーンショットを生成してくれます。

![スクリーンショット 2016-06-05 21.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/27210/177d88f9-56d0-9b4a-4e75-2cc2cf6b75e1.png "スクリーンショット 2016-06-05 21.05.01.png")

非デザイナーのエンジニアでスクリーンショットの作成作業に手間取ってる方は使ってみてはいかがでしょうか。節約できる時間を考えると値段分の価値はあるかと思います。

[Chansey](https://itunes.apple.com/jp/app/chansey/id1102274005?mt=12)
Puttyで生成した鍵を使用してさくらＶＰＳに接続する端末を追加する

***
teratermで作った鍵だとなぜかplink.exeでSSH接続できなかった（鍵の形式の違い？？）ので、Puttyを駆使して接続してやる。

【最終目的】
①plink.exeでVPS上のシェルスクリプトを実行させる。
②pscp.exeでVPS上のファイルを送受信する。

***


  
  
### １．Putty.zipを一式ダウンロード


　http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

　![putty_zip.png](https://qiita-image-store.s3.amazonaws.com/0/128324/c86caf7b-8df8-03c6-6a9f-f1fa52dc333d.png)

***
### ２．公開鍵・秘密鍵を生成

　puttygen.exeにより公開鍵・秘密鍵を作成。

　【参考】以下URLの「7.Windows 側でキーペアを作成する」
　　　　　http://net-newbie.com/putty.html


***
### ３．公開鍵をOpenSSH形式に変換しauthorized_keysに追記
　前項で作成した公開鍵をOpenSSH形式に変換

    ssh-keygen -i -f (PuTTYgenで生成した公開鍵) > (変換先ファイル名)
   
　サーバに登録

    cat (変換したファイル名) >> .ssh/authorized_keys
    
 【参考】
　　https://www.ipentec.com/document/document.aspx?page=linux-ssh-error-server-refused-our-key
***
### ４．pscpできた！
　pscpコマンド：

    pscp.exe -scp -noagent -P [ポート番号] -l [ユーザ名] -pw [パスワード] -i [秘密鍵フルパス] [送信するファイルのフルパス] [さくらVPS IPアドレス]:[送信先ファイルフルパス]

　結果：

    [送信先ファイル名]            | 56 kB |  56.5 kB/s | ETA: 00:00:00 | 100%

　受信も同様にできました！    
***
### ５．plinkできた！
　plinkコマンド：

    plink.exe [さくらVPS IPアドレス] -ssh -noagent -P [ポート番号] -l [ユーザ名] -pw [パスワード] -i [秘密鍵フルパス] [実行シェルスクリプトフルパス]
    
　結果：シェルスクリプトが実行されてました！
音ありで録画する方法[Mac][QuickTime]


# 前提
MacにOSに適したバージョンのSoundFlowerをインストールしている．
# 手順
1. 入力，出力をSoundFlower 64chにする
2. 画面収録開く
3. 以下のように設定
![画面収録音あり.png](https://qiita-image-store.s3.amazonaws.com/0/113504/bf9b922d-2daa-9211-6bd8-8f26b11a04d3.png "画面収録音あり.png")
4. 録画開始(収録中は音は出ない)
Slack | 任意のコメントを自分向けにリマインド設定する

# 操作

コメント横のボタン ( これ → ![image](https://qiita-image-store.s3.amazonaws.com/0/90607/b0797ff2-dd09-93e9-c46b-25236db94776.png) ) から簡単にリマインド登録出来る。
「Remined me about this」を押して、あとは時間を選ぶだけ。


![image](https://qiita-image-store.s3.amazonaws.com/0/90607/62eb8b56-628b-6a1b-cf7f-f70437c77f3c.png)


# 結果

時間になると slackbot が、あなた宛の DM で教えてくれる。
( 元のチャンネルに通知が流れるわけではない )

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/27588dbf-a548-1906-ac54-3a98acf9ad9b.png)


# 環境

- Slack 1.1.2 ( Mac App )



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
#StartupVRの個人的まとめ

# はじめに
\#StartupVRを個人の主観を交えて適当にまとめてみた記事です。
実はまだ手元にメモがない記憶だけの状態で書いてるので所々違う部分があるかも。
一旦大雑把な記憶残し。今週くらいをめどに大幅に修正される可能性が有ります。

# 概要
・Startupの会だったので、vrでstartupやってみた感想、日本含め海外のvr市場・startupの現状とこれからの話でした。
・8割はStartupをやってみて、の話。始めた経緯など。エネルギーのある話だった。
・技術的にどうこうって話はほとんどなかった。

# 大雑把なまとめという名の某人の話

まとめのつもりで書いてたら、Gumiの國光さんの話をまとめただけになってしまった。

## 今VRの波が来ている。
今まで二階の波があった。一つはpcでインターネットができるようになった時、もう一つはモバイル（スマホ）でインターネットができるようになった時。
モバイルの時勝ったのは、既存のものをモバイルファーストで実現したところ。PCで勝ってたところが買った例はほとんどなかった。そして今回も同様のことが言える。
いま世に出ているものはまだ少なく、とにかく作れば第一人者になれる可能性がある。「人間のやることは基本的に変わらない」から、できるはず。いまある普通を置き換えていくだけでそれが商品・サービスになる。

スマホの黎明期に戻れたら何をするかを考えろ。VRでのメルカリ、Gunosyってなんだ。

## もうモバイルの時代はほとんど終わり

だいたいメジャーは開拓され尽くした。動画の戦いが終わった時点でモバイルの時代はもう終わり。今モバイルでやろうとしたら、ニッチな界隈になって、ぶっちゃけ美味しくない。今更そんなところをやるの？

## Facebookのこれらにかける気合いはすごい。

Googleと同じ土俵に立とうとしてる。そういうレベルだからこの時代は必ず来る。
それにいずれ「スマホなんて使いにくいもの」は消えて無くなる。VRでの未来を見つめるとデバイスなんてそこには無くなるはずだ。

## だというのに日本のVR界隈は海外に比べStartupの動きが非常に鈍い
だから支援する機構、ネットワーク作ったからみんなやれ。超やれ。

## VRとARは未来には統合する

そしてMRがある。どれもやっていることは視覚を再定義すること。
いまは先にVRが来ている。モバイルの時とは違い、ARの時にはVRの知見が大いに利用できる。スタートダッシュが決められるし、VRで失敗してもARがあり、さらにMRがある。
同じことを3回も挑戦できる。しかも3年ごとくらいにこの波はくる。
「人間のやることは基本的に変わらない」。

## エンターテイメントに限らない
教育などでの利用についての議論が海外では活発。

## VRのハッカソン再来週くらいにやるよみんな来てね
http://www.moguravr.com/japan-vr-hackathon/

# Startupな話
## 何かをやるためには
お金が必要？　銀行から引っ張ってこなきゃいけない？　信用なくて無理じゃね？
馬鹿馬鹿しい話。Startupやればいい。アイデアが良ければそれでお金は集まる。
（個人的には失敗するとどうなるかって話も聞きたかった）

## clusterの人の話
http://twitter.com/okayama1991/status/739344317332869122
cluster作った時の話。
なんでやめたか：人に使ってみてもらった感想「友達がやってたらやるかも」←絶対にやらない
なんで行けると思ったか：α版を作ってやってみたときの直感。自分が本当に実現したかったものが見えた。

## スポーツの360度動画の配信などをやってる会社の話
スポーツ界隈の村社会に切り込んでいくのはすごい大変。既存利権（放映権、肖像権）の問題もあるし、いろんな技術の提案をしてくる会社はいっぱいある。その中で信用を勝ち取っていくのが本当に大変。
他業種に切り込んで提案していく場合、技術よりもビジネス的な側面で大変になるよ。エンジニア的なロジックだけでは通用しないよ。泥臭いよ。

## 情報発信しない奴はどんなに優秀でも世界から認識されない
ブログ書くといろんなところからいろんなお話きたりするよ。twitterでもいいけど、フロー型の場合は流れちゃうからストック式の方がいいよ。

## 最新の技術を触ることでいつでも第一人者になれる。
GolangでVRのStartupやったらその界隈でもう自分の名前を知らない人はいなくなったくらいに。っていうか今更アプリ開発始めたところで有象無象の一つになるだけ。10年前から走ってる人にはどうやったって叶わない（確かこんなこと言ってたきがする。語弊があるかも）。
どうやって「若い人」が「老人」に打ち勝つか考えるべき。

## 僕の考えた最強のVR環境
https://twitter.com/nontanred/status/739369806218960896?ref_src=twsrc%5Etfw
デバイスはデータを取得・配信・描画するだけ。後の処理は全てクラウド上でやる。
でもそれやってデバイスが軽量化されちゃうと部品とか売れなくなっちゃうからあんまり活発ではない。後の課題は通信量などのネットワークの問題だけ。
でもどんどん研究されてるからいつか絶対くる。ここを必ず押さえとく。

## はやる2,3年前にやると第一人者になれる。流行ってからやってもダメ。10年前にやると哲学になる。
セカイカメラェ・・・。

## Startupのコンペティションをやるとき、これっていいよねとかこんなの欲しいよねてきな話が多い。
それだけで終わってしまう場合が多く、おおってなるだけ。
未来にどういう世界が欲しいか、これが実現するとどういう世界がくるか、でもその全ては今できないからここから始める、俺たちはここをやる、そんな感じであるべき。

# 展示品に関して
* 基本的にゲーム。
* 遊んでみたけど、やはりVR酔いは厳しい。でもこの辺はいずれ解決される。
* コントローラは三種類だった。ViveとLeapmotion、あとはデバイスの加速度センサでやるやつ。LeapmotionはVRカメラにくっつけて使うのが主流になってるのかな。
* unityで簡単なVRゲームは一週間くらいで作れる（？？？）。
* 爆弾解除のゲームはやってみたかった（機材トラブルでできなかった）。
* FPSは実現したらやはり面白い。絶対に楽しい。展示されてたFPSはまだまだって感じしたけど、それでも驚きと新鮮さがあった。
シェルスクリプトで所有者がrootのファイルを編集する3つの方法

vagrantをプロビジョニングするときに、自動で`/etc/hosts`に追記（編集）できたら、きっと楽になるはず！！！
vagrantは`root`でプロビジョニングが可能ですが、全ての作業を`root`で作業したくない・・・。
というわけで、`/etc/hosts`を例に、**所有者がrootのファイルを編集する方法**を3つ紹介します。

# 検証した環境

* Mac

```sh:Macの開発環境
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.5
```
* CentOS（vagrant）

```sh:CentOSの開発環境
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

# 手動で/etc/hostsを書き換える時に、sudoが必要な理由
手動で`/etc/hosts`を書き換える場合には、先頭に`sudo`を付ける必要があります。

```sh:手動で/etc/hostsの編集（mac&centos)
$ sudo vim /etc/hosts
```

`/etc/hosts`の所有者を確認すると、`root`となっています。

```sh:/etc/hostsの所有者（mac）
$ ls -la /etc/hosts
-rw-r--r--  1 root  wheel  303  5 30 18:23 /etc/hosts
```

そのため、ファイルの編集には`root`権限が必要となります。
`sudo`コマンドでは、ユーザの指定を省略すると、**rootユーザ（スーパーユーザ）**による実行とみなされます。

# シェルスクリプトで書き換える方法
## その１：実行時にsudoをつける

`/tmp`配下に適当なシェルスクリプトを作成します。

```sh:シェルスクリプトを作成
$ cd /tmp
$ vim test.sh
```

```sh:シェルスクリプトの中身
#!/bin/sh
echo 127.0.0.1 example.com >> /etc/hosts
```
このスクリプトは、`/etc/hosts`に`127.0.0.1 example.com`を追記します。
それでは、作成したシェルスクリプトを実行します。

```sh:シェルスクリプトの実行
$ sh test.sh
test.sh: line 2: /etc/hosts: Permission denied
```
しかし、**Permission denied（権限がない）**と怒られます。
先頭に`sudo`をつけて実行すると、問題なく成功します。

```sh:rootユーザでシェルスクリプトの実行と結果
$ sudo sh test.sh
Password:            　　　　　　　←　パスワード入力

# 実行結果
$ cat /etc/hosts | grep example.com
127.0.0.1 example.com
```

## その2：シェルスクリプト内で実行するコマンドでrootユーザになる（１）
その１のように、`sudo`を付けてシェルスクリプトを実行できる時は、これで問題ありません。
しかし、vagrantのプロビジョニングのように、ある特定の場合のみ`root`で実行したい場合、以下の方法が有効です。

```sh:シェルスクリプトを編集
$ cd /tmp
$ vim test.sh
```

```sh:シェルスクリプトを編集した結果
#!/bin/sh
sudo -- sh -c "echo '127.0.0.1 example.com' >> /etc/hosts"
```

`sudo -- sh`は、**`root`ユーザでシェルスクリプトを実行するコマンド**となります。また、`-c`オプションを指定することで、文字列（今回は`echo`を含む文字列）がコマンドとして読み込まれます。

```sh:シェルスクリプトの実行
$ sh test.sh
Password:            　　　　　　　←　パスワード入力
　
# 実行結果
$ cat /etc/hosts | grep example.com
127.0.0.1 example.com
127.0.0.1 example.com             ←　追記されている
```

## その3：シェルスクリプト内で実行するコマンドでrootユーザになる（２）
コメントしていただいた方法を追記します。
この方法もvagrantのプロビジョニングのように、ある特定の場合のみ`root`で実行したい場合、以下の方法が有効です。

```sh:シェルスクリプトを編集
$ cd /tmp
$ vim test.sh
```

```sh:シェルスクリプトを編集した結果
#!/bin/sh
sudo sh -c "echo '127.0.0.1 example.com' >> /etc/hosts"
```

`sudo sh`は、その２で紹介した方法の短縮形となります。`sudo`コマンドでは、ユーザの指定を省略すると、rootユーザによる実行とみなされるため、この方法でも追記が可能となります。

```sh:シェルスクリプトの実行
$ sh test.sh
Password:            　　　　　　　←　パスワード入力
　
# 実行結果
$ cat /etc/hosts | grep example.com
127.0.0.1 example.com
127.0.0.1 example.com             
127.0.0.1 example.com             ←　追記されている
```

# まとめ
今回は、所有者が`root`ユーザのファイル例として`/etc/hosts`を紹介しました。
他のファイルにもこの方法は有効です。
また、今回は追記する方法を紹介しましたが、もちろん`sed`や他のコマンドも使うことができます。

```sh
#!/bin/sh
sudo -- sh -c "sed 's/example/test/g' /etc/hosts"
```

vagrantのプロビジョンの際には、パスワードを求められないので`root`権限が必要なファイルのプロビジョニングには有効です。
ぜひ、使ってみてください〜〜〜！
jQuery スライドで表示・非表示させる

こちらはjQuery初心者向けです。

#スライドして要素を表示・非表示させる

要素をただ表示させるのではなく、少し動的に表示させることはできないでしょうか。
jQueryでは「.animate()」という要素を動かせる関数がありますが、
もっと簡単な「.slideDown()」、「.slideUp()」という関数があります。

まず、次のようなコードを用意しましょう。

```html:slide.html
<!-- jQuery導入 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<!-- デザイン定義 -->
<style type="text/css">
.slide-div {
  width: 100px;
  text-align: center;
  border: #000 2px solid;
  padding: 10px;
  display: none;
}
</style>

<!-- 要素定義 -->
<p><button>開く</button></p>
<div class="slide-div">こんにちは</div>

<!-- jQuery定義 -->
<script type="text/javascript">
$(document).ready(function() {
  $(document).on("click", "button", function() {
    $(".slide-div").slideDown();
  });
});
</script>
```

するとただ「開く」が書いているボタンしか見えないと思います。

![Cap 2016-06-06 11-26-32-809.png](https://qiita-image-store.s3.amazonaws.com/0/113820/54132f47-41b3-319f-e012-971dc128c0eb.png)

「こんにちは」はどこに行った？

なぜ？
デザインを定義したところに「display: none;」があるからです。

では、ボタンを押してみましょう。

![Cap 2016-06-06 11-27-56-039.png](https://qiita-image-store.s3.amazonaws.com/0/113820/19505fdf-fbf6-c730-c8f1-ca62c3eca490.png)

なんだか上から下へ動きながら黒い四角が出てきました。

これをもっと応用してみましょう。

最初はボタンが「開く」から押すと「閉じる」に変わるものと
その「閉じる」を押したら「こんにちは」が消えることを。

次のようにコードを書きます。

```html:slide.html
<script type="text/javascript">
$(document).ready(function() {
  $(document).on("click", "button", function() {
    if ( $(".slide-div").css("display") == "none" ) {
      $("button").text("閉じる");
      $(".slide-div").slideDown();
    } else {
      $("button").text("開く");
      $(".slide-div").slideUp();
    }
  });
});
</script>
```

ifで「.slide-div」の「.css("display")」が「none」だった場合、
「button」の中身を「閉じる」に変更、「.slide-div」を「.slideDown()」します。
逆にelseの場合は「button」の中身を「開く」に戻して、「.slide-div」を「.slideUp()」します。

こちらでは「.slideDown()」は要素を表示させる、「.slideUp()」は非表示させることが分かりましたね。

「.text()」を使ったと思いますが、それ以外にも「.html()」という関数もあります。
こちらはHTMLタグを書くことができます。「.text()」ではただテキストのみ書くことができます。
CentOS7にgemでfluentdをインストール

# CentOS 7にgemでfluentdをインストール

## Ruby2.1以上が必要といわれる件

どうやら、Ruby2.1以上が必要らしい。

```shell-session
[root@logreader system]# gem install fluentd
ERROR:  Error installing fluentd:
        fluentd requires Ruby version >= 2.1.
```

Rubyのバージョンを見てみると。

```shell-session
[root@logreader system]# ruby -v
ruby 2.0.0p598 (2014-11-13) [x86_64-linux]
```

ふむ。

## Ruby2.2を入れてみる

基本的には[このサイト](http://www.server-world.info/en/note?os=CentOS_7&p=ruby22)でやっていることを行う。
ただし、epelじゃなく、そのままインストール。
以下を順に実行していく。

```shell-session
[root@logreader ~]# yum -y groups install "Development Tools"

[root@logreader ~]# yum install install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel

[root@logreader ~]# cd rpmbuild/SOURCES ; curl -O http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz ; cd

[root@logreader ~]# cd rpmbuild/SPECS ; curl -O https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec ; cd

[root@logreader ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec

[root@logreader ~]# rpm -Uvh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
```

## Ruby2.0へ依存しているものが

まあ、これ以前にgemを単体で入れていて、6行目を実行しようとした際に、

```shell-session
[root@logreader ~]# rpm -Uvh rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
エラー: 依存性の欠如:
        libruby.so.2.0()(64bit) は (インストール済み)rubygem-bigdecimal-1.2.0-25.el7_1.x86_64 に必要とされています
        libruby.so.2.0()(64bit) は (インストール済み)rubygem-io-console-0.4.2-25.el7_1.x86_64 に必要とされています
（省略）
```

とか出てきたので、慌てて

```shell-session
[root@logreader ~]# yum erase rubygems
```

とかやったわけなんですが。

## インストール出来！

んで、無事

```shell-session
[root@logreader ~]# ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
[root@logreader system]# gem install fluentd
Fetching: cool.io-1.4.4.gem (100%)
Building native extensions.  This could take a while...
（省略）
Parsing documentation for yajl-ruby-1.2.1
Installing ri documentation for yajl-ruby-1.2.1
Parsing documentation for fluentd-0.14.0
Installing ri documentation for fluentd-0.14.0
Done installing documentation for cool.io, http_parser.rb, msgpack, sigdump, serverengine, strptime, thread_safe, tzinfo, tzinfo-data, yajl-ruby, fluentd after 14 seconds
11 gems installed
```

と、インストールできました。
ActiveRecordメモ

自分メモ

#Acrive Recordとは
[http://railsguides.jp/active_record_basics.html](http://railsguides.jp/active_record_basics.html)

> Active Recordとは、MVCで言うところのM、つまりモデルに相当するものであり、ビジネスデータとビジネスロジックを表すシステムの階層です。Active Recordは、データベースに恒久的に保存される必要のあるビジネスオブジェクトの作成と利用を円滑に行なえるようにします。Active Recordは、ORM (オブジェクトリレーショナルマッピング) システムに記述されている「Active Recordパターン」を実装したものであり、同じ名前が付けられています。

つまりModelを使いやすくしてくれるやつってことかな。
Railsで普段やってる**Modelは大文字で**、とか**CRUDがある**(自動で生成してくれるらしい)とか、そういうの引っくるめてActive Recordってことかしら。
※**CRUD**とは**C**reate、**R**ead、**U**pdate、**D**eleteのこと。

**ORM**はプログラミングでSQL書きやすくするぜ！ってしてくれる可愛いやつという認識。

# Modelの上部によく書くやつまとめ
| 項目 | 説明 |
|:-----------|:------------|
|attr_accessor|外からテーブルのカラムにアクセスできる。参照と更新が可能。|
|attr_writer|外からテーブルのカラムにアクセスできる。更新が可能。|
|attr_reader|外からテーブルのカラムにアクセスできる。参照が可能。|
|attr_accessible|Rails4では使えない。モデルのどの属性をアクセス可能にするか指定できる。|
|belongs_to|一対一の関連。|
|has_many|多対一の関連、一対多の関連。|
|has_one|一対一の関連。|


attr_accessorはRubyの、atter_accessibleはRailsのメソッドらしいです。
モデルの属性ってなんぞや？と思ったら**DBに存在しないカラム**のことを属性と読んでいるらしい。
従属する側のモデル(親)にはbelongs_to、従属させる側のモデル(子)にhas_oneを記述。
has_manyもbelongs_toと使われる。

参考
* [http://www.rubylife.jp/ini/class/index6.html](http://www.rubylife.jp/ini/class/index6.html)
* [http://tkymtk.hatenablog.com/entry/2013/10/20/200451]
(http://tkymtk.hatenablog.com/entry/2013/10/20/200451)
* [http://railsdoc.com/references/belongs_to](http://railsdoc.com/references/belongs_to)
* [http://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91](http://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91)
* [http://qiita.com/color_box/items/2147461a64d6b9e583c9](http://qiita.com/color_box/items/2147461a64d6b9e583c9)

他はまた出てきたら＋整理ができたら編集する。

# attr_accessorすごい

```test.rb
attr_accessor :name # nameは他のModelの項目なんだけど、Testモデルのバリデーションと一緒にバリデートしたい

validates :name, presence: true, on: :test_time
```

```test_controller.rb
test = Test.new
test.name = "hoge"
test.valid?(:test_time)
```

これでバリデーションできる。
しゅごい。
(他のModelなのでname自体をupdateしたい場合は当然そのsave処理は必要だけど…)
【FreeBSD】リンク切れのシンボリックリンクを探す方法FreeBSD編

Linuxの場合は、`-xtype`オプションで探せるそうです。
参照→[リンク切れのシンボリックリンクを探す方法](http://qiita.com/kawaz/items/ba0e75b6828bd3951e52)

FreeBSDの場合は、以下のコマンドで探せます。

```
find -L 検索対象ディレクトリ -type l
```

# 解説

## まずシンボリックリンクを探す

探したいものはシンボリックリンクなので、`-type l`という検索条件を使います。

ただ、この条件だけでは、リンク参照先の有無に関わらず、すべてのシンボリックリンクが出力されます。

## リンク参照先の情報を読むようにする

### デフォルトでは、リンク自体の情報を読む

何もオプションを指定しないときは、`find`は次のように動作します。

     -P      各シンボリックリンクのために返されたファイル情報とファイルタイプ
             (stat(2) 参照) は、リンク自体のものとなります。これは、デフォルト
             です。

http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=find&dir=jpman-11.0.2%2Fman&sect=0
より

そのため、`-type l`という検索条件で、すべてのシンボリックリンクが出力されるのです。

### リンク参照先の情報を読むオプション

`-L`オプションをつけると、`find`の動作が次のように変わります。

     -L      各シンボリックリンクのために返されたファイル情報とファイルタイプ
             (stat(2) 参照) は、リンク自体ではなく、リンクによって参照される
             ファイルのものとなります。参照されたファイルが存在しないなら、
             ファイル情報とタイプは、リンク自体のものとなります。

             このオプションは、推奨されない -follow プライマリと同等です。


なかなかむつかしいですね。。。

`-L`オプションを付けると、リンクの参照先が存在するときは参照先の情報を読み込み、存在しないときはリンク自体の情報を読みます。

したがって、`-type l`という条件で参照先が存在しないシンボリックリンクを検索できるのです。

# findの挙動まとめ

findが検索条件に使う情報をまとめるとこんな感じです。

|リンク先が…… | 存在する| 存在しない |
|:-:|:-:|:-:|
| `-P`オプション指定時(デフォルト) | シンボリックリンク自体の情報  | シンボリックリンク自体の情報  |
| `-L`オプション指定時 | リンク参照先の情報  | シンボリックリンク自体の情報  |


# 落穂拾い

## リンク参照先がシンボリックリンクだったら……

リンクついえるところまで辿ってくれるみたいです。
jQuery Animate

#####こちらはjQueryの初心者向けです。

#jQueryで要素をAnimateする

jQueryを使いながら、要素を動かしたい時があると思います。
その時は「.animate()」関数を使うと簡単に要素を動かすことができます。

まず、jQueryを導入しましょう。

```html:animate.html
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
```

それから要素の定義やスタイルを決めましょう。

```html:animate.html
<style type="text/css">
.animate-div {
  width: 100px;
  height: 100px;
  border: #000 2px solid;
}
</style>

<p><button>Animate</button></p>
<div class="animate-div"></div>
```

するとこんな感じの四角が表示されると思います。

![Cap 2016-06-06 11-07-09-506.png](https://qiita-image-store.s3.amazonaws.com/0/113820/495783e3-90f3-f104-44f0-0fa79a3efb5c.png)

では、animateを定義してみましょう。

```html:animate.html
<script type="text/javascript">
$(document).ready(function() {
  $(document).on("click", "button", function() {
    $(".animate-div").animate({
      width: "300px",
      height: "300px",
      borderColor: "#00f",
      backgroundColor: "#f00"
    });
  });
});
</script>
```

widthとheightは四角の大きさを変更します。
CSSでは「border-color」のタグがjQueryでは「borderColor」、
「background-color」のタグが「backgroundColor」になることが分かります。

上の「button」が押されたら「.animate-div」の「animate」が実行される感じです。

「Animete」と書いているボタンを押してみましょう。

すると

![Cap 2016-06-06 11-11-11-737.png](https://qiita-image-store.s3.amazonaws.com/0/113820/5a3a69b7-8cb4-a2b8-d425-09197c800226.png)

こんな感じになりましたか？

もし色がだめの時はページの上部に次のコードを導入してみましょう。

```html:animate.html
<script src="http://code.jquery.com/color/jquery.color-2.1.2.min.js" integrity="sha256-H28SdxWrZ387Ldn0qogCzFiUDDxfPiNIyJX7BECQkDE=" crossorigin="anonymous"></script>
```
RoRで相関副問い合わせ

## 参考資料

[ActiveRecord4でこんなSQLクエリどう書くの? Arel編 - TIM Labs](http://labs.timedia.co.jp/2013/10/activerecord4sql-arel.html)

### ソース部分のみ引用
欲しいSQL, RoR, 出力されたSQL, notの場合の順。

> ```
select 
  items.* 
from 
  product_collection_items items 
where exists 
( 
  select 
    'X'
  from 
    products p
  where 
    p.id = items.product_id 
)
;
```

> ```
product = Product.arel_table
product_collection_item = ProductCollectionItem.arel_table
condition = product
  .where(product[:id].eq(product_collection_item[:id]))
  .project("'X'")
  .exists
ProductCollectionItem.where(condition)
```

> ```
[97] pry(main)> ProductCollectionItem.where(condition)
  ProductCollectionItem Load (0.9ms)  
SELECT `product_collection_items`.* FROM `product_collection_items` 
WHERE (EXISTS (
SELECT 'X' FROM `products` 
WHERE `products`.`id` = `product_collection_items`.`id`))
```

> ```
condition = product
  .where(product[:id].eq(product_collection_item[:id]))
  .project("'X'")
  .exists
  .not
```

## 自分用メモ
`condition`を作るときに`product`から始めるのではく`product_collection_item`から始めるなどのように自分の欲しい`condition`に合わせて柔軟に参考ソースを書き換えること。

`arel_table`で作り出している`condition`を最終的に欲しいオブジェクトの`whereメソッド`の引数として与える。`hoge.foos.where(condition)`みたいにhas_manyなものを取得した後の`where`にも渡せる。

`project("'X'")`ってなんだ？？と数分戸惑っていたが、出力されたSQLを見て分かる通り、EXISTS句のSELECTに仮置きするX。SQLを生書きするときはここはXではなくて`1`を使うことが自分では多かったような印象。
IPv4ヘッダのチェックサム計算方法

#RFC読んだけどピンとこないのでとりあえずやってみた
データはこんな感じのバイナリ列
あるIPv4パケットを受信した時のデータ

```
0x45 0x00 0x16 0xce 0x65 0x4c 0x40 0x00 
0x01 0x11 0xf7 0xeb 0xc0 0xa8 0x65 0x1f 
0xe0 0x00 0x00 0x1f 
```

オプション無しの20BYTEが対象になる。
ここの0xf7 0xebがチェックサム。覚えておく。

2BYTEづつ計算していく

0x4500 + 0x16ce = 0x5bce
0x5bce + 0x654c = 0xc11a
0xc11a + 0x4000 = 0x1011a

桁が上がったら上がった分を1の位に加算して16bit化する
0x1011a → 0x011b

0x011b + 0x0111 = 0x022c
つぎは0xf7ebだけど、チェックサムなので飛ばして
0x022c + 0xc0a8 = 0xc2d4
0xc2d4 + 0x651f = 0x127f3
0x127f3 → 0x27f4
0x27f4 + 0xe000 = 0x107f4
0x107f4 → 0x07f5
0x07f5 + 0x001f = 0x0814


これでsumは終わり…
0x0814を反転させて
0xf7eb

おわり！OK！

#補足
チェックサムが0の時はチェックサムを計算しなくていいみたい
正しいことが保証されるわけじゃないところが注意

#補足2
上記の方法で計算したチェックサムは絶対0にはならんのだな
0xFFFFに1を足すと0x10000になるので結果としては0x0001
がチェックサムになるもんね。へぇー
めざせpythonライブラリマスター （42）speedrecorder

#【ライブラリ説明】
　インターネットのスピードを測定

#【プログラム】
```py:speedrecorder.py
# -*- coding: utf-8 -*-

import speedrecorder

speedrecorder.speedtest()
speedrecorder.speedtest(quiet=False)
'''
Ping: 57
Download: 2.67 Mbits/s
Upload: 3.31 Mbit/s
'''
```

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/speedrecorder/0.1)
　[github](https://github.com/rweyant/speedrecorder)