OmniAICreator/Qiita-1.07M huggingface dataset:
LINE+Flaskでゆるふわに形態素解析ボットを作る


### ソースコード


```python
from flask import Flask
from flask import request

import requests
import json
import re

import settings

LINEBOT_API_EVENT ='https://trialbot-api.line.me/v1/events'
LINE_HEADERS = {
    'Content-type': 'application/json; charset=UTF-8',
    'X-Line-ChannelID':settings.CHANNEL_ID,
    'X-Line-ChannelSecret':settings.CHANNEL_SECRET,
    'X-Line-Trusted-User-With-ACL':settings.MID
}

def post_event(to, content):
    msg = {
        'to': [to],
        'toChannel': 1383378250,
        'eventType': "138311608800106203",
        'content': content
    }
    r = requests.post(LINEBOT_API_EVENT, headers = LINE_HEADERS, data = json.dumps(msg))

def post_text(to, text):
    content = {
        'contentType': 1,
        'toType': 1,
        'text': text,
    }
    post_event(to, content)

app = Flask(__name__)

@app.route("/callback", methods=['POST'])
def callback():
    messages = request.json['result']

    # とりあえずオウム返し
    post_text(message['content']['from'], message['content']['text'])
    return ''

if __name__ == "__main__":
    app.run(host = '0.0.0.0', port = 8080, threaded = True, debug = True)
```

こんな感じ．

LINEボットの登録は以下

[BOT API Trial Account](https://business.line.me/ja/products/4/introduction)

callback URLは「 __https(SSL対応)__ 」でないとダメなのでHeroku等で運用するといいかもしれません  
私は，自宅サーバをhttpsにしているの証明書を再発行してなんとかサーバ設定を終え開発しました．


## 最後に

私の開発した形態素解析をしてくれるボットは以下動画のような感じです。
最近は確か稼働すらさせていないですｗ

[形態素解析器ボットデモ](https://www.youtube.com/embed/h4BD22TiItM)
jQueryを使用してTableタグでクリックした箇所の行番号を取得する

以下のコードを書いてみた。
任意の列と行を取得できるのであとはIndexでぐるぐる回すなりすれば好きな情報を取得できるのでは。

```html
<html>
<head>
  <script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
</head>
<body>
<table id="table">
 <tr>
  <td>A</td>
  <td>B</td>
  <td>C</td>
 </tr>
 <tr>
  <td>D</td>
  <td>E</td>
  <td>F</td>
 </tr>
 <tr>
  <td>G</td>
  <td>H</td>
  <td>I</td>
 </tr>
</table>
<script>
  $("#table td").bind('click', function(){
    $tag_td = $(this)[0];
    $tag_tr = $(this).parent()[0];
    console.log("%s列, %s行", $tag_td.cellIndex, $tag_tr.rowIndex);
  });
</script>
</body>
</html>

```
CREATE TABLE文からシンプルなER図を自動生成するツールを作りました

先日状態遷移図を自動生成する[Pyagram](http://qiita.com/hideshi/items/c61cee1d7dfc1754e075)というコマンドラインツールを作ったのですが、それの追加機能としてCREATE TABLE文からテーブル間の関連のみがわかるシンプルなER図を自動生成する機能を実装しました。

個人的には外部キーは一切使わない派なので、MySQLWorkbanchを使った場合にテーブル間のリレーションが張られた状態のER図が生成できない問題がありました。そのため外部キーがなくてもカラム名から親子を推測して関連づけてくれるようなツールを作ることにしました。

利用にあたりいくつか制約がありますので、以下をご理解いただいた上でご使用ください。

* MySQLのみ対応  
* 主キー名は常にid  
* テーブル名は基本的に複数形（中間テーブルを除く）  
* いくつかのデータ型には未対応（ENUMなど）

また検証がまだ不十分かもしれませんので、もしかしたらうまく動かないことがあるかもしれません。コメント欄か[GithubのIssue](https://github.com/hideshi/pyagram/issues)にご報告いただけますと幸いです。

以下が生成された図になります。

![erd.gif](https://qiita-image-store.s3.amazonaws.com/0/249/918e3e4c-0f70-f8c1-17e2-34c0eb89a7bc.gif)

入力ファイルとして以下のようなCREATE TABLE文が定義されてるファイルを用意します。

```
CREATE TABLE employees (
    id INT(11) NOT NULL AUTO_INCREMENT,
    birth_date DATE NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    last_name VARCHAR(100) NOT NULL,
    gender INT(11) NOT NULL,
    hire_date DATE NOT NULL,
    department_id int(11),
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE departments (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE titles (
    id INT(11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE employee_title (
    employee_id INT(11) NOT NULL,
    title_id INT(11) NOT NULL,
    from_date DATE NOT NULL,
    to_date DATE NOT NULL,
    PRIMARY KEY('employee_id', 'title_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

CREATE TABLE salaries (
    id INT(11) NOT NULL AUTO_INCREMENT,
    employee_id INT(11) NOT NULL,
    salary INT(11) NOT NULL,
    from_date DATE NOT NULL,
    to_date DATE NOT NULL,
    PRIMARY KEY('id'),
    KEY('employee_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
```

以下のコマンドを実行すると、図が生成されます。

```
pyagram -t {画像タイプ} -o {出力パス} -i {入力ファイル} -f {フォント名} -d erd
```

また以下のコマンドでインストールできます。

```
pip3 install pyagram
```

今回の修正のために作りを大きく変え、プラガブルな実装にしました。Diagramというクラスを継承することで、いくつでも図の生成クラスを作れるようになっています。
Diagramクラスには

1. lexical_analysis（字句解析）  
2. syntactic_analysis（構文解析）  
3. generate_dot（ドットファイル用のデータ生成）  
4. generate_image（画像ファイル生成）  

の大きく分けて４つの処理があるのですが、Diagramを継承したクラスでは１から３までを実装すればいいような作りになっています。

今後については、もう少し出力される項目を増やしたり、対応するRDBMSの種類を増やしたりしたいのですが、ちょっと骨が折れるので時間をかけて進めていきたいと思います。
PythonでiOSアプリにプッシュ通知を送ろう


## パッケージ

[pyapns](https://pypi.python.org/pypi/pyapns/0.4.1)

## 環境

Python2.7.11

## 準備

```bash
$ sudo pip install pyapns
$ twistd -r epoll web --class=pyapns.server.APNSServer --port=7077
```

## サンプルコード

```python
from pyapns import configure, provision, notify
configure({'HOST': 'http://localhost:7077/'})
provision('app-name', open('cert.pem').read(), 'sandbox')
payload = {'aps': {
				'alert': {
					'sound': 'default',
					'badge': 0,
					'body': 'Hello World!',
					'message': 'Push Notification from Python!!'
				},
				'uri': 'https://nnsnodnb.moe'
			}}
notify('app-name', 'hexlified_token_str', payload)
```

これだけで開発中に簡単にプッシュ通知テストできるのはいいですね！！
【2016年7月第5週】今週の気になるWebデザイン

#まず、はじめに

本来であれば、以下の様なことをしっかりと考えるべきです。

```
どうやったら使いやすいかな…。どうやったら私たちが提供したい「体験」をしてもらえるのか…。
利用するユーザーさんはどんなシーンで、どのように操作するだろう…。その時に求めているものは何なのか…。
このペルソナ（大きく言うとターゲット）に対しては、こういう設計がいいのか…ダメなのか…。
私たちのWebサイトのゴールである地点まで行ってくれるのか…。（コンバージョンしてくれるのか。）
```

しかし、私はこの記事では単純に「いいな！」と思ったデザインを取り上げていきます。
どういうところがいいと思ったのかを添えて、色んなWebサイトをストックしていきます。

#1.ACTUS([→サイトを見る](http://online.actus-interior.com/shop/actus-online/RAFFINE+%E3%83%86%E3%82%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9/item/view/shop_product_id/5693?param=ranking_top))
![c04a38c27e1f24164f10d431e6b9b5a5.png](https://qiita-image-store.s3.amazonaws.com/0/75705/6954f0db-6415-80b1-679a-7ba49ac5496d.png)
##いいと思ったページ
商品詳細ページ

##ここが、いいね！
###順番と配置がいい！
まずは、文字ではなく画像で商品に対して興味を深めてもらう順番で配置されています。
ファーストビューでは、商品説明の文字は一切ありません。
そもそも細かい説明は「欲しい！！」という気持ちが高まるまでは読まないモノってなりますよね。
雑貨屋さんや家具屋さんはそれに当てはまると思います。この感じすごくいいです。

#2.タカガール（[→サイトを見る](http://wing2.softbankhawks.co.jp/ex/takagirl/)）
![4f395e32a8c1a8a59fe847c42ddc0069.png](https://qiita-image-store.s3.amazonaws.com/0/75705/5ac9dee9-2e26-964d-b26f-76929f27587d.png)
##いいと思ったページ
トップページ

##ここが、いいね！
###ワクワクする動き、見た目
デザイン的には女性向けサイトでよく目にするような方向性ですが、マウスオーバー時の動きなどが楽しく、ワクワクします。
無駄な動きが多くて、これ要らないよね…と思うサイトがたくさんある中、このWebサイトでは全てが必要な動きだと感じました。

#3.紙のミルフィーユ([→サイトを見る](http://kamino-mf.com/))
![fd581fe483578fc1ec105914dbb55a2c.png](https://qiita-image-store.s3.amazonaws.com/0/75705/8f739361-f24b-d65f-e172-9f32eb7c663f.png)
##いいと思ったページ
トップページ

##ここが、いいね！
###PC版では魅力的な表現、スマホ版では非表示
縦書きの日本語表記がされていますよね。この部分ってパソコンで見ると凄く魅力的で目を惹くわけですが、スマートフォンだと邪魔になりがち。
ただ**display: none;**して非表示にしてしまえばいいだけですが、最近こういうアイデアが不足していました。
すごくいいですよね！

#まとめ
今週は3つのサイトをピックアップして、どこがいいなぁーと思ったのか、自分なりの感想を書かせていただきました。
Webサイトを作成していて、困ったことがあった時、少しでも参考になるストックとなれば幸いです。
linuxコマンド実行の小技

1. 直前に実行したコマンドを再現

    ```
    $ !!
    ```
1. 以前のコマンドを実行

    ```
    $ history
    $ !n(nは番号)
    ```
1. 前のコマンドの引数を利用

    ```
    $ vim ~/.bash_profile
    $ source !$
    ```
!^が最初の引数、!$で最後、!:nでn番目、!*ですべての引数を表す。






### 参考
[bash/zshのコマンドライン履歴機能。直前のコマンド、直前の引数](http://hash.hateblo.jp/entry/20090927/commandlinehistory)
RPGツクールMVでオブジェクト指向しよう！その１．プロパティ編

RPGツクールMVで複雑なゲームを作る時は
「オブジェクト指向」という考え方で作りましょう！というお話です。

この記事の対象者：

* オブジェクト指向は知らないが、ツクールでバグを起こしがちで悩んでいる人
* オブジェクト指向を知っていて、ツクールに取り入れたい人

ただし、**JavaScriptは書ける**ことが前提です。あしからず。

#オブジェクト指向って何？

あまりいい加減な説明をすると**オブジェクト指向警察に逮捕されてしまう**ので
オブジェクト指向そのものについて詳しくは解説しません。
ですが、幸いにもツクールには一部オブジェクト指向が取り入れられた機能があるのでそれで説明いたします。

##あれれ、またバグだ…

ツクールの変数って、面倒ですよね。

あるイベントを起こすとまったく関係ないイベントがバグりだし、何が原因かと調べてみると**まったく関係ないところですでに使っていた変数をうっかり再利用してしまった**とかだったりします。

こうしたミスを防ぐべく、賢い人達は**セルフスイッチ**という対策を考えました。
これは、皆さんも知っている通り**マップイベント毎に独立したスイッチ**です。それぞれのマップイベントで別々の値を取り、他のマップイベントからは参照できません。
これならば他のマップイベントで勝手に使用されてバグに悩む、ということはなくなります。

このセルフスイッチをもっと拡張できたらゲーム作りが楽になると思いませんか？
「４つだけでなくもっと、しかも数字や文字を代入できたら…」
バグを防ぎわかりやすいゲーム作りをするためには、たった４つの特別なスイッチだけでなく、
あるマップイベントの内部でしか使わないような変数はすべて、
**そのマップイベントにひも付けられ、そのマップイベントからしか利用できないようにしてしまえば良い**のです。

しかしセルフスイッチが４つまでというのはツクール側で決まっていることです。
そこでJavaScriptを用いてこの「ひも付き変数」を拡張していこう、というのが本記事の趣旨です。

また、この他にも移動ルートの設定などで登場する**このイベント**というフレーズも実はオブジェクト指向的な考えです。詳しくは次回。

#実践

それでは実際にやってみましょう。ここではいずれもイベントコマンド「スクリプト」を使用します。

##プロパティに値を代入

```js
this.character(0).property = "hensuu";    //propertyにhensuuを代入
this.character(0).property = $gameVariables.value(1);    //propertyに（ツクールの）変数１番を代入
```

これからはさっき述べた「ひも付き変数」のことを**プロパティ**と呼ぶことにします。
さて、そもそもJavaScriptはオブジェクト指向をサポートしているので、
ご覧のようにthisというキーワードを使えば「自分自身」を指してくれます。

ただし注意しなくてはいけないのは`this.property`としてはいけないことです。
「スクリプト」コマンドにおけるthisは*Game_Interpreter*という「イベントコマンドを順番に処理する機構」を指しているので、`this.character(0)`と書いて「この*Game_Interpreter*を起動したマップイベント」を取得しなければいけません。

##プロパティの値をツクール変数に代入

```js
$gameVariables.setValue(1, this.character(0).property);    //変数１番にhensuuを代入
```

このように書いても良いのですが、代入だけならば実は「変数の操作」コマンドに「スクリプト」という項目がありますのでそこに`this.character(0).property`と直接書いた方がタイプ数が少なく楽です。
後述の理由でなるべくスクリプトは書かないほうが良いので、「変数の操作」でプロパティをツクール変数に代入→イベントコマンドで処理、というパターンを習得しておいたほうが良いでしょう。
なお、ツクール変数はfalsyな値（空白文字列とか）を代入されるとすべて0に変換してしまう仕様があるのでそこだけは注意しましょう。

###その他に「スクリプト」を書けるコマンド

「条件分岐」コマンド及び「移動ルートの設定」に「スクリプト」という項目があります。
ただし移動ルートの設定の場合のみなぜかthisがイベントそのものになっているので、`this.character(0)`とは書かずに単に`this`と書きましょう。

##注意：すべてスクリプトで書いてはいけない

さて、ここまでマップイベント内にスクリプトを書く手法で説明してきました。
ですが間違っても**「それなら、すべてスクリプトで書こう」と思ってはいけません。**
見辛さや書き辛さなどももちろんですが、スクリプトには**途中でウェイトを挟んでも停止してくれない**という仕様があります。
（というかウェイトの仕様が「コマンドとコマンドの間で待つ」なので一つの大きな「スクリプト」イベントコマンドの途中で止まってくれないのです。）

スクリプトを使うのは**「プロパティへの値の読み書き」**または**「イベントコマンドでは実現できない処理を書く」**ときのみに限定することをおすすめします。

##プロパティの初期化タイミング

プロパティはそのマップを離れるとすべて初期化されて値が消えます。初期化されたくない場合は…やはりツクール変数に代入しておきましょう。
なお、セーブしてロードするだけなら「マップを離れた」わけではないのでプロパティは初期化されません。

#まとめ

以上で単純ですがツクールのオブジェクト指向化、およびプロパティの話を説明してみました。
ひょっとしたら、こんなちょっとしたことをするためにわざわざJavaScriptを使うのはメリットが少ない、と感じるかもしれません。
ですがこのプロパティと次回にお話しする「プレハブ」という手法を組み合わせると
爆発的にゲーム作りが楽になるので、そこでぜひ存分に感動していただきたい！

[RPGツクールMVでオブジェクト指向しよう！その２．プレハブ編→](http://qiita.com/krmbn0576/items/050990b93a90cc13b09a)
Linux lsコマンド フォルダ操作

### 用語
1. atime [atimeには，文字通り，ファイルにアクセスした時刻が記録されます。より厳密には，ファイルの実データが読み込まれた際に，その時刻が記録されます。ファイルの管理情報（メタデータ）だけを読み込んだ場合になどには更新されません。](http://itpro.nikkeibp.co.jp/article/Keyword/20090607/331455/?rt=nocnt)

### オプション
| オプション | 説明| 
|:-----------|:-----------|
| -a  | .を始まるファイルも出力 |
| -l  | Long形式、owner、時間なども表示 |
| --full-time | 作成時間に年も表示する(macはTになる) |
| --time-style | '+%Y-%m-%d %H:%M:%S' format指定 |
| -h | サイズを読みやすい形にする |
| -lt | 更新時間で降順でソート|
| -r | 時間で昇順でソート |
| -lut | atime(アクセス時間)でソート |
| -lct | ctime(作成時間)でソート |
| -S | サイズでソート |
| -R | list subdirectories recursively |

### よく使うケース
1. ファイル一覧出す

    ```
    $ ls -la
    ```
1. 作成時間でソートして、full-timeで表示

    ```
    $ ls -lt --full-time
    ```
1. フォルダ一覧表示

    ```
    $ ls -d */  これが良さそう
    ```
1. appフォルダ下のファイルとフォルダ全部表示

    ```
    $ ls -lut app/*
    ```

### フォルダ操作
1. 上位フォルダも作成する

    ```
    $ mkdir -p test/test1/test2
    ```
Windows10でSymfony2のローカル開発環境構築①

**注意**
本記事ではPHPの環境構築までです。
長くなるのでSymfony2のインストールは次回記事にて記載します。

**追記**
記載しました。[Windows10でSymfony2のローカル開発環境構築②](http://qiita.com/k_moto/items/1e7738a134c884f8ff3d)


以前現場で使用したPHPのフレームワーク「Symfony」
他のフレームワークと使い比べとかできてないので、
良し悪しの理解はできてないけど好みだった。
忘れないうちに勉強しなおしたいので環境構築しておく。
サーバ側は現場に出たら用意されてることが多いけど、
万が一自分でやるときのための備忘。


## PHPの開発環境を整える

0から開発環境を整えることを想定して、
まずはPHPを動かす必要がある。


###1. XAMPPをインストールする

おそらく一番有名であろうXAMPPで開発するのが楽だと思う。
Symfony2.8はPHP5.3.3以降が対応なので、最新版で問題ないと思われる。
Symfony2.8の理由は次回記載。

####1-1. 公式サイトからインストーラーを取得

以下のサイトにアクセスし、
「Windows向け」と書いてある箇所を押下する。
[XAMPP Installers and Downloads for Apache Friends](https://www.apachefriends.org/jp/index.html)

![01.png](https://qiita-image-store.s3.amazonaws.com/0/64466/4abc1e4e-98a8-fb0a-a425-bea496291ce3.png)

####1-2. ダウンロードしたインストーラーの実行

ダウンロードしたファイルをダブルクリックで起動し、Next ボタンを押下する。
![02.png](https://qiita-image-store.s3.amazonaws.com/0/64466/8f97559d-d146-dee0-284a-f2099e5c200b.png)

####1-3. コンポーネントの選択

特にこだわりや事情がなければそのまま Nextボタンを押下する。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/64466/9664acfb-0647-7060-74b8-f716d4dd146e.png)

####1-4. インストールフォルダの選択

特にこだわりや事情がなければそのまま Nextボタンを押下する。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/64466/090c3370-3e82-bbec-bef7-ae71414806b2.png)

####1-5. Bitnamiについて

Bitnamiに興味がなければチェックを外して Nextボタンを押下する。
私は触れたことがないのですが、WordPress等の構築を楽にしてくれるそうな。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/64466/46bfea11-ecb5-1d08-d651-98524e2fde9d.png)

####1-6. インストール開始

Next ボタンを押下する。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/64466/6b153861-c1e6-e37c-e6a4-aae0a14db9a9.png)

####1-7. インストール完了

Finish ボタンを押下する。
チェックを入れておくとコントロールパネルが勝手に開いてくれる。
![07.png](https://qiita-image-store.s3.amazonaws.com/0/64466/db21f9bb-8f5f-6ff3-cfd6-9f50051cce4a.png)

####1-8. 起動して確認

確認に最低限必要な操作のみ記載。

* Start ボタンを押下する。
![08.png](https://qiita-image-store.s3.amazonaws.com/0/64466/710f8df3-2056-2f27-0d5a-180862d43a98.png)

* ブラウザで「http://localhost/dashboard/jp/」にアクセスする
（コントロールパネルのAdminを押下してもよいが、日本語に変更するなら末尾にjpをつけること）
※以前使ったことがある人向け
　2015年7月くらいの更新からオレンジ色っぽい画面はなくなったそうです。
![09.png](https://qiita-image-store.s3.amazonaws.com/0/64466/2181f2d3-e99b-4c8f-8a33-1fc03e00f5ea.png)


##終わりに
次の記事ではSymfony2のインストールまで記載します。
ストゥージソートをPython3で実装(バブルソート&クイックソート)

[ストゥージソート(stooge sort)というソートがあるそうです。](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%82%A5%E3%83%BC%E3%82%B8%E3%82%BD%E3%83%BC%E3%83%88)このソートアルゴリズムはとても__効率の悪い__ソートアルゴリズムらしく、バブルソートより効率が悪いとか。

この記事ではストゥージソートをPython3で実装してみます。

```py3

# リストを破壊的にソートする。アルゴリズムは「ストゥージソート」
def stooge_sort(ls):
    stack = [(0, len(ls) - 1)]
    
    while stack:
        i, j = stack.pop()
        if ls[i] > ls[j]: ls[i], ls[j] = ls[j], ls[i]
        
        if j - i + 1 >= 3:
            t = (j - i + 1) // 3
            stack.extend(((i, j - t), (i + t, j), (i, j - t)))

if __name__ == '__main__':
    import random

    ls = list(range(30))
    random.shuffle(ls)

    print(ls)
    stooge_sort(ls)
    print(ls)

# [20, 4, 13, 28, 12, 0, 17, 19, 22, 21, 5, 23, 3, 27, 14, 2, 29, 11, 24, 7, 15, 9, 25, 6, 26, 18, 8, 1, 10, 16]
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]

```

確かにちゃんとソートできているようですね。 工夫(?)としては再帰ではなく、繰り返しで実装している点ですが……効率のわるいアルゴリズムに対して、効率よく実装する意味はあるのか(´・ω・`)

次に効率ですが、[効率の悪い「バブルソート」](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%96%E3%83%AB%E3%82%BD%E3%83%BC%E3%83%88)と[効率のいい「クイックソート」](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%82%A4%E3%83%83%E3%82%AF%E3%82%BD%E3%83%BC%E3%83%88)をそれぞれ実装し、1000個の要素を持つリストをソートする時間を計測してみたいと思います。

```py3
# リストを破壊的にソートする。アルゴリズムは「ストゥージソート」
def stooge_sort(ls):
    stack = [(0, len(ls) - 1)]
    
    while stack:
        i, j = stack.pop()
        if ls[i] > ls[j]: ls[i], ls[j] = ls[j], ls[i]
        
        if j - i + 1 >= 3:
            t = (j - i + 1) // 3
            stack.extend(((i, j - t), (i + t, j), (i, j - t)))


# リストを破壊的にソートする。アルゴリズムは「バブルソート」
def bubble_sort(ls):
    t = len(ls)

    for i in range(t - 1):
        for j in range(i + 1, t):
            if ls[i] > ls[j]: ls[i], ls[j] = ls[j], ls[i]


# リストを破壊的にソートする。アルゴリズムは「クイックソート」
def quick_sort(ls):
    stack = [(0, len(ls) - 1)]

    while stack:
        left, right = stack.pop()
        if left >= right: continue

        pivot = ls[left + (right - left) // 2]
        i, j = left, right
        while True:
            while ls[i] < pivot: i += 1
            while ls[j] > pivot: j -= 1

            if i >= j: break
            
            ls[i], ls[j] = ls[j], ls[i]
            i, j = i + 1, j - 1

        stack.extend(((j + 1, right), (left, i - 1)))

if __name__ == '__main__':
    import random, copy, time

    ls = list(range(1000))
    random.shuffle(ls)
    
    bubble_ls = copy.deepcopy(ls)
    bubble_start = time.time()
    bubble_sort(bubble_ls)
    bubble_time = time.time() - bubble_start

    quick_ls = copy.deepcopy(ls)
    quick_start = time.time()
    quick_sort(quick_ls)
    quick_time = time.time() - quick_start

    stooge_ls = copy.deepcopy(ls)
    stooge_start = time.time()
    stooge_sort(stooge_ls)
    stooge_time = time.time() - stooge_start

    print("bubble : {}".format(bubble_time))
    print("quick  : {}".format(quick_time))
    print("stooge : {}".format(stooge_time))

    # bubble : 0.0938718318939209
    # quick  : 0.0
    # stooge : 33.47836709022522
```

遅い ((((´・ω・`))))
Live2D WebGLでモデルデータのDL防止

[Live2D WebGL SDK](http://sites.cybernoids.jp/cubism-sdk2/webgl2-1)ではファイルパスが見えてしまい、モデルデータがDLできてしまう問題点がありました。
<img width="484" alt="001.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/d9b02653-0a87-92db-cf6a-e12b92700855.png">
せっかくモデル作ったのに、WebGLで公開するとモデルデータが盗られるのはとても残念ですっ！
**（※ ちなみにUnityのWebGL書き出しでは、バイナリ化されており問題ないです）**


解決策ですが、サーバーサイド（PHP）でモデルデータをロードすれば防げました。
処理の流れとしては、以下の感じでいけます。

　１. mocファイルをphpでロード（Base64形式）
　２. ロードしたデータをphpからjsに渡す
　３. jsでBase64形式からArrayBufferへ変換
　４. ArrayBufferをモデルデータとしてロード

# 開発環境
Live2D WebGL SDK2.1
MAMP(PHP用)

# テスト検証
SDKサンプルのSimpleプロジェクトを元にテストをしてみました。
手順としては以下の通りです。

##### １）phpの環境を作る
・[3分でMacのWeb開発環境（Apache,MySQL,PHP）を用意・初期設定する方法！](http://hapisupu.com/2015/11/mamp-install-setting/)

##### ２）simple.html → simple.phpにリネームする

#### ３）phpでモデルデータをロードし、jsに渡す

```php:simple.php　12行目あたり
<!-- Live2D Library -->
<script src="../../lib/live2d.min.js"></script>
<!-- User's Script -->
<script src="src/Simple.js"></script>

<!-- モデルファイルをロードする -->
<?php $mocdata = base64_encode(file_get_contents('assets/Epsilon2.1/Epsilon2.1.moc')); ?>
<script>
// phpからjavascriptに渡す
var mocdata = <?php echo json_encode($mocdata); ?>;
</script>
```

#### ４）モデルデータをLive2Dライブラリへ渡す処理を修正する
```js:Simple.js　119行目あたり
    //------------ Live2Dの初期化 ------------
    // mocファイルからLive2Dモデルのインスタンスを生成
//    Simple.loadBytes(modelDef.model, function(buf){
//        live2DModel = Live2DModelWebGL.loadModel(buf);
//    });
    live2DModel = Live2DModelWebGL.loadModel(Base64_To_ArrayBuffer(mocdata));
```

Base64_To_ArrayBuffer関数は、以下のページから「Base64からArrayBufferに変換する関数」をコピペしてきました。
・[Base64 文字列からArrayBufferに変換する関数](http://hakuhin.jp/js/base64.html#BASE64_05)

これでモデルデータのパスを隠蔽でき、DLされるのを防止できました。
![tes002.gif](https://qiita-image-store.s3.amazonaws.com/0/15028/a8d17182-2d60-fcff-c5c4-49177ff2b1a5.gif)
ちなみに改善後のhtml部分はこんな感じになります。
<img width="434" alt="改善後のhtml.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/c4536dd4-9082-1e88-3406-77e194a6a286.png">

# 問題点
モデルデータは隠蔽できましたが、若干ページロードに時間がかかるようです。
多少の誤差はありますが、23ms → 32msかかるようになりました。
<img width="436" alt="005_今まで_.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/9d957022-21be-1055-e205-4529202fb6f5.png">

<img width="432" alt="006_改善後_.png" src="https://qiita-image-store.s3.amazonaws.com/0/15028/84b95db1-274c-602e-15ca-ac02b2ac921e.png">
phpでBase64に変換して、jsでBase64からArrayBufferに変換したりしてるせいかもしれません。

# 改善点
詳細な検証はしてないですが、node.jsでやればArrayBufferのまま渡すので軽快に動作すると思います。
node.jsでのソースは、[Live2D WebGLとNW.jsでデスクトップマスコット](http://qiita.com/naotaro0123/items/8ef30cd1fa76de6f007f)が参考になると思います。
（記事内のSimple.jsのモデルファイルロード処理、Simple.jsのArrayBufferへ変換処理あたり）

# 参考にしたページ
・[JavaScriptでPHPの変数の値を使う方法メモ](http://qiita.com/39_isao/items/09946484933b83060f10)
・[PHPを用いて画像をbase64する方法](http://kaworu.jpn.org/kaworu/2008-04-06-1.php)
循環的複雑度の指標


| 循環的複雑度 | 複雑さの状態 | バグ混入確率 |
|:-----------|:-----------|:-----------|
| 10以下 | 非常によい構造 | 25% |
| 30以上 | 構造的なリスクあり | 40% |
| 50以上 | テスト不可能 | 70% |
| 75以上 | いかなる変更も誤修正を生む | 98% |

# 参考

http://szk-takanori.hatenablog.com/entry/20111219/p1
RFC6298: Computing TCP's Retransmission Timer (June 2011)

# はじめに
TCP互換プロトコルを作っていると、「再送タイマにセットする値はどうやって計算するのかな？」と思うことがよくあります。

詳しくは、[RFC6298](https://tools.ietf.org/html/rfc6298)を読めばよいのですが、ぱっと実装するときのポイントを以下にまとめておきます。

# 初期RTO

1秒（SHOULD）

過去のRFC（2988など）では3秒でした。なので、1秒以上の初期RTOでもOKです（MAY）。

# RTO計算
## 1回目のRTT計測時
RTT計測値をRとすると、

SRTT <- R
RTTVAR <- R/2 
RTO <- SRTT + 4*RTTVAR

## 2回目以降のRTT計測時

RTT計測値をR'とすると、

RTTVAR <- 0.75 * RTTVAR + 0.25 * |SRTT - R'| 
SRTT <- 0.875 * SRTT + 0.125 * R‘
RTO <- SRTT + 4*RTTVAR

このあたりはMUST要求。

# 最大値
60秒（MAY）

Linuxでは120秒ですね。

# 最小値
1秒（SHOULD）

BSDでは200ms。Linuxでは100msです。
どこかの記事で読みましたがSolarisは10msだったかどうとか・・・。
ちなみに、AIXはごく最近まで1秒を律儀に守っていたようです。

nsの初期値でも200msが使われていますが、とりあえず200ms位がいいかもしれません。

# RTT計測方法

詳細な定義はありませんが、Karnのアルゴリズムの利用はMUSTです。
（再送されたパケットに対するRTT計測はしない、という決まりごと）

1RTTに1回は計測したほうがいいらしいです。

昔は、タイムスタンプオプションをよく見かけましたが、最近はタイムスタンプオプションを使わない実装も増えてきましたね。

# 細かい挙動
## SYNの再送

3秒（MUST）

RFC6298から追加された条項。というよりも、初期RTOが3秒から1秒に変更されたことによる但し書き。

## Backoffの初期化

再送後の初回RTT計測後（再送ではなく、新しいデータを送信して、それに対するACKが到着したとき）、Backoffを戻す

## SRTTとRTTVARの初期化
BackOffを行うときに、SRTTとRTTVARはクリアしてもよい（MAY）


# RFCに書いていないこと

いろいろありますが、以下の処理などがあります

> ackoff値が8を超過しているとき
> RTTVAR = RTTVAR + SRTT,    SRTT = 0

3回以上再送タイムアウトが発生するときは、途中の経路が変更された可能性があると睨んで、RTT推定値（特にSmoothedRTT）をクリアします。


# おわりに
性能向上のポイントは、プロトコルよりも実装の高速化です。単純な計算処理でできるようにしましょう。とはいえ、プロトコル上のムダは、プロトコルで解決するべきです。

ちなみに、実装とRFCは別です。通信の相手先がRFC準拠と思い込まないほうがよいでしょう。

このあたり、流行りのQUICはどうなっているのか、気になりますね。
Azure VMの動的パブリックIPをローテートする

Azure VMのIPはNICからパブリックIP(PIP)の関連付けを解除→もう一度割当てを行うと別のIPになるので、
これを利用してIPをローテートする小技。
azure-cliではNICからPIPの関連付け解除ができないので、直接RESTを叩いています。

```bash:rotate-pip.sh
#!/bin/bash

# VM情報
: ${SUBSCRIPTION_ID:?}
: ${RESOURCE_GROUP_NAME:?}
: ${NIC_NAME:?}
: ${PIP_NAME:?}
: ${VNET_NAME:?}
: ${VNET_SUBNET_NAME:="Subnet"}
: ${IPCONFIG_NAME:="ipconfig1"}

# アプリケーション認証情報
: ${CLIENT_ID:?}
: ${TENANT_ID:?}
: ${CLIENT_SECRET:?}

type jq > /dev/null || exit 1

# -------------

# OAuthトークン取得
AUTHORIZATION_STRING="Bearer $(curl -sXPOST -H "Content-Type: application/x-www-form-urlencoded" "https://login.windows.net/${TENANT_ID}/oauth2/token" -d "grant_type=client_credentials&client_id=${CLIENT_ID}&client_secret=${CLIENT_SECRET}&resource=https://management.core.windows.net/" | jq -r '.access_token')"

NIC_ENTRYPOINT="https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.Network/networkInterfaces/${NIC_NAME}?api-version=2016-03-30"
PIP_ENTRYPOINT="https://management.azure.com/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.Network/publicIPAddresses/${PIP_NAME}?api-version=2016-03-30"

# NICにPUTするときのJSONのテンプレ
JSON_TEMPLATE=$(cat <<EOT
{
  "name": "${NIC_NAME}",
  "location": "japaneast",
  "properties": {
    "ipConfigurations": [
      {
        "name": "${IPCONFIG_NAME}",
        "id": "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.Network/networkInterfaces/${NIC_NAME}/ipConfigurations/${IPCONFIG_NAME}",
        "properties": {
          "publicIPAddress": %s,
          "subnet": {
            "id":"/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP_NAME}/providers/Microsoft.Network/virtualNetworks/${VNET_NAME}/subnets/${VNET_SUBNET_NAME}"
          }
        }
      }
    ]
  }
}
EOT
)

# NICへの変更リクエスト
request(){
    curl -sXPUT -H "Content-Type: application/json" -H "Authorization: ${AUTHORIZATION_STRING}" "$NIC_ENTRYPOINT" -d "$1" -o /dev/null
}

# 現在のパブリックIPアドレスを取得
get_ip() {
    curl -s -H "Authorization: ${AUTHORIZATION_STRING}" "${PIP_ENTRYPOINT}" | jq -r ".properties.ipAddress"
}

# NICの変更が完了するまで待つ
wait_for_completion() {
    printf "wait for completion"
    until [[ "$(curl -s -H "Authorization: ${AUTHORIZATION_STRING}" "${NIC_ENTRYPOINT}" | jq -r ".properties.provisioningState")" != "Updating" ]]
    do
      sleep 15
      printf "."
    done
    echo
}

# -------------

OLD_IP="$(get_ip)"
echo "OLD_IP: $OLD_IP"

# PIP取り外し
echo "remove PIP"
JSON="$(printf "$JSON_TEMPLATE" null)"
request "$JSON"

wait_for_completion

# すぐ振り直すと同じIPが付くので少し待つ
echo "wait 30 seconds for rotate"
sleep 30

# PIP付け直し
echo "set new PIP"
PIP="{\"id\":\"/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/${RESOURCE_GROUP}/providers/Microsoft.Network/publicIPAddresses/${PIP_NAME}\"}"
JSON="$(printf "$JSON_TEMPLATE" "$PIP")"
request "$JSON"

wait_for_completion

NEW_IP="$(get_ip)"
echo "NEW_IP: $NEW_IP"

# 変わってなかったら失敗扱い
[[ "$OLD_IP" != "$NEW_IP" ]] || exit 1
```
node.jsでxlsxファイルを読み込む:xlsxモジュールの使用

xlsxモジュールを使用してnode.jsでxlsxファイルを読み込むメモ。

[xlsx(npmjs.com)](https://www.npmjs.com/package/xlsx)
"Excel (XLSB/XLSX/XLSM/XLS/XML) and ODS spreadsheet parser and writer"
自分がさがした中では、最も対応フォーマットが多いようです。
xlsxパーサ&ライターですが、今回はxlsファイルの読み込みのみを使ってみます。

以下のxlsxファイルを使用します。
![SnapCrab_NoName_2016-7-31_19-4-53_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/97959/ba90b2b6-0dac-acd7-f348-9cf83aa2cdac.png)


##xlsxファイルの読み込み

```js:test.xlsxをワークブックオブジェクトに読み込む
const xlsx = require('xlsx');
let workbook = xlsx.readFile('test.xlsx');
```
ファイルが存在しない時は`ENOENT`エラーが出ます。
第2パラメータに[オプション](https://www.npmjs.com/package/xlsx#parsing-options)を指定できます。

##シート名一覧の取得
シート名はワークブックオブジェクトの`SheetNames`配列に入っています。

```js:すべてのシート名の表示
let sheetNames = workbook.SheetNames;
console.log(sheetNames);
/*
[ 'Sheet1' ]
*/
```

##指定シートのワークシートオブジェクトを取得
ワークブックオブジェクトから`Sheets[シート名]`で取得します。

```js:Sheet1を取得
let worksheet = workbook.Sheets['Sheet1'];
```
シートが存在しない時はundefinedになります。

##シート内にあるセルの範囲
セルの範囲はワークシートオブジェクトの`!ref`に文字列で入っています。

```js:セルの範囲の表示
let range = worksheet['!ref'];
console.log(range);
/*
A1:F2
*/
```

##セルオブジェクトの取得
セルの中身はワークシートオブジェクトから `worksheet[セルアドレス]`の形式で取得できます。

```js:セルオブジェクトの取得
console.log(worksheet['B2']);
/*
{ t: 'n', v: 1.2, w: '1.2' }
*/
```

セルの書式はプロパティ`t`、値は`v`、`w`から取得できます。
セルオブジェクトの中身の詳細は[こちら](https://www.npmjs.com/package/xlsx#cell-object)から。

##セルアドレスの数値表現
セルアドレスはExcelでおなじみの「A12」とかのセルアドレス表記以外にも、数値による指定ができます。

```text
{
    c:セル番号(A=0),
    r:行番号(1=0)
}
```
このへんは`xlsx.utils`オブジェクトに便利関数が揃っています。

```js:セルアドレスの変換
const xlsx = require('xlsx');
const utils = xlsx.utils;

//セルアドレスを数値表記に変換
console.log(utils.decode_cell('AZ123'));
/*
    { c: 51, r: 122 }
*/

console.log(utils.encode_col(10));
console.log(utils.encode_row(10));
console.log(utils.encode_cell({c:10, r:10}));
/*
K
11
K11
*/
```

```js:セル範囲の変換
let range = worksheet['!ref'];
/*
    range = A1:F2
*/
console.log(utils.decode_range(range));
/*
{
    s: { c: 0, r: 0 },  //開始セルアドレス
    e: { c: 5, r: 1 }   //終了セルアドレス
}
*/
```

この辺を使うと「行単位でループ」とか「すべてのセルをループ」とかができます。

```js:すべてのセルを表示
"use strict";
const xlsx = require('xlsx');
const utils = xlsx.utils;

let workbook = xlsx.readFile('test.xlsx', {
    cellDates: true
});
//シートの読み込み
let worksheet = workbook.Sheets['Sheet1'];

//セルの範囲
let range = worksheet['!ref'];
let rangeVal = utils.decode_range(range);
for (let r=rangeVal.s.r ; r <= rangeVal.e.r ; r++) {
    for (let c=rangeVal.s.c ; c <= rangeVal.e.c ; c++) {
        let adr = utils.encode_cell({c:c, r:r});
        let cell = worksheet[adr];
        console.log(`${adr} type:${cell.t} value:${cell.v} text:${cell.w}`);
    }
}
```

```text
A1 type:s value:value text:value
B1 type:s value:value2 text:value2
C1 type:s value:string text:string
D1 type:s value:string2 text:string2
E1 type:s value:date text:date
F1 type:s value:time text:time
A2 type:n value:1 text:1
B2 type:n value:1.2 text:1.2
C2 type:s value:文字列 text:文字列
D2 type:s value:改行付き&#10;文字列 text:改行付き&#10;文字列
E2 type:n value:42370 text:2016/01/01
F2 type:n value:42371.5208333333 text:2016/1/2 12:30
```

##よくわからない点
###ワークシート読み込み時に`cellDates: true`オプションを指定しても、時刻、日付形式のセルのtypeがdにならない
セルの書式が日付かどうかの判別はどうやったらよいのだろう。
rbenv: bundle: command not found の解決



このエラーにハマりました。

```
> $ bundle install
rbenb: bundle: command not found

The 'bundle' command exists in these Ruby versions: 
 2.2.3 
 
> $ ruby -v   
 2.3.1
```



原因は、bundleコマンドがrbenvのversion 2.3.0に入っていなかったことが原因でした。
巷の記事では、

```
gem install bundler
```

をすれば解決すると書いてありましたが、解決されず。。

結局

```
sudo gem install bundler
```

で解決しました。


しかし、 ```sudo gem i ```は全権限に対してgemを配布してしまうので良くないらしいです。

http://stackoverflow.com/questions/2119064/sudo-gem-install-or-gem-install-and-gem-locations
RPGツクールMVでオンラインゲームを作ろう！

#オンラインで各プレイヤーを表示できるようにした話

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135524/faa3db4b-7e07-88d3-17d0-5e10104453e1.png)
RPGツクールMVで[オンライン通信してアバターを表示するプラグイン](http://tm.lucky-duet.com/viewtopic.php?f=5&t=1618)作りました。
[サンプル](https://krmbn0576.github.io/rpgmakermv/)もありますのでまずは実際に具合を確かめてみてください。（IEでは動きません）

##どうやってるの？

Firebaseというサービス(BaaS)を活用してオンライン通信をサポートしています。
ですので自分でサーバーの設置、設定とか複雑なことを考えずに簡単にネット通信を利用したゲームを作ることができます。
このサンプルはゲーム性もないただのチャットルームに過ぎませんが、あなたがその気になれば**MMOからソシャゲまであらゆるオンラインゲーム**が作れるでしょう！！

…本当は「これさえあればあらゆるオンラインゲームを作れます！」ぐらいのことを言えるプラグインにできれば良かったんですが、とりあえずアバター機能（＋拡張機能）だけで公開してみました。
（追記：これに加え、特定の範囲のスイッチ・変数を全プレイヤーで共有して同期する機能を付け加えました）

まあこれだけでも結構なことができると思いますし、プログラミング（JavaScript）を勉強してプラグインを自力改造するという手もあるので、現時点でもあらゆるオンラインゲームが作れるというのは嘘ではないハズ…

**「手軽な」あるいは「ツクール製の」「オンラインゲーム作り」**に興味が有る方はとりあえずお試しください！

##使い方

この章以降の内容はサンプル内の「石版」にも書かれてるので片方読んでくだされば結構です。
というか石版の方が説明が丁寧な気がする…

1. [本プラグイン](https://raw.githubusercontent.com/krmbn0576/rpgmakermv/gh-pages/js/plugins/OnlineAvatar.js)をダウンロードして自分のゲームに配置
1. [Firebaseの公式サイト](https://console.firebase.google.com/)で、Googleアカウントを(持って無ければ)取得し、「新規プロジェクトを作成」する
1. 「ウェブアプリにFirebaseを追加」ボタンを押してプラグインパラメータにappID、authDomain、databaseURLをコピペ
1. 左メニューから「Auth」→上部から「ログイン方法」→「匿名」を有効にする
1. ゲームをプレイすると同時にプレイしているすべてのアバターが表示されます

##応用編

本プラグインには実はサンプルのようなチャット機能（とジャンプ機能）はついてきません。
これは本プラグインの**拡張機能**を活用して実装しています。
サンプル内の「使い方：中級編」という石版で詳しく書かれてるのでそっち見てください。

…手抜きじゃないですよーツクール内だとアニメーション使えるので説明しやすいんです～（手抜き）

##Milkcocoaではダメだったのか

「ツクールとBaaSで手軽にオンラインゲームを！」というコンセプトの草分けといえば[RPGツクールMVでMilkcocoaを使う](http://qiita.com/m2wasabi/items/a2f286cf83725c59844e)でございましょう。
しかし同氏の[RPGツクール用のMilkcocoaプラグイン](http://qiita.com/m2wasabi/items/267b57d2b6c90ce93ad2)を改造して実際にゲームを作ってみたところ
残念ながらMilkcocoaの無料枠の上限が近すぎて趣味レベルですら実用に耐えなかったので、
それならともっとふさわしいBaaSを探した結果Firebaseにたどり着きました。

この２つ以外のBaaSは私の雑な調査によるとそもそもリアルタイム通信（というかpush型通信）がサポートされてないのでソシャゲはともかくネット対戦とかMMOは無理だと思います。（間違ってたら編集リクエストください）

サンプルはまだゲームと言える代物ではありませんが、それでもこれだけの人数が集まっても重くならず上限にも達さずに運用できたということで本プラグイン（というかFirebase）には確かな実用性があると思います。（ちなみにFirebase無料枠の最大同時接続人数は１００人、Milkcocoaの無料枠は２０人です）

#本題：Firebaseでオンラインゲーム作りに入門しよう！

さて、以上でお示ししたようにFirebaseの底力（の片鱗）、なんとなくわかったいただけたんじゃないでしょうか。
今までオンラインゲームの類を作るなら必要だった「（実物の、もしくはクラウドの）サーバーの用意、管理」などをまったく考えずに手軽に通信できるFirebaseの利用は、飛躍的に個人レベルでの難易度、勉強量を緩和したと思います。（まだドキュメントとか英語なので英語力は必要ですが(追記：2016/10/23)いつの間にかFirebaseのドキュメントが日本語化されていました。これでもう僕らのオンラインゲーム作りを阻むものはありませんね！）
「アバター機能なんていらねえからこんなプラグイン使わねえよ！！」という方もオンラインゲームを作る時はまずFirebaseの利用から検討してみてはいかがでしょうか。

本プラグインでは使ってませんがFirebaseには他にもユーザー認証やセキュリティなどの機能もあり、ゲーム作りする上で困るような機能不足は無いように思います。
そもそもFirebaseはゲーム向けに進化してきたBaaSであるという話も聞きます。

これはひょっとすると…会社や組織では無い、個人レベルの趣味で簡単にオンラインゲームやソシャゲが作れる時代が到来したのではないでしょうか！？

「オンラインゲーム作りの入門編」として**ツクール＋Firebase**の組み合わせ、高らかに提案させていただきたい！！！
git でコミットが消えた場合に簡単に復帰する方法

　git 初心者がよくやってしまう失敗だと思います。git のブランチというものを把握すればなんてことのない問題なので、再度失敗しないようにまずは [git のブランチについて](http://qiita.com/Ratty27/items/a5725b01eb60e9940998)よく理解することが必要です。
　さて、このコミットが消えた、という状態ですが、ようするにコミットがどのブランチにも所属していないため、ログに表示されていない状態となります。
　このようなコミットは git reflog コマンドを使えば追うことができます。

```
$ git reflog
8598194 HEAD@{1}: commit: 4
a734caa HEAD@{2}: commit: 3
5e85532 HEAD@{3}: checkout: moving from caseB to 5e85532
5e85532 HEAD@{4}: checkout: moving from master to caseB
18de528 HEAD@{5}: checkout: moving from caseB to master
5e85532 HEAD@{6}: checkout: moving from master to caseB
18de528 HEAD@{7}: reset: moving to HEAD^
5e85532 HEAD@{8}: commit: 2
18de528 HEAD@{9}: commit (initial): 1
```

これで見えなくなっているコミットを探し、ハッシュでコミットを取り出すことができます。
　上記のケースでは、a734caa->8598194 の二つがブランチに含まれていないものとします。

![lostbranch0_300.png](https://qiita-image-store.s3.amazonaws.com/0/129226/d5c52b50-3a3f-8c41-2dc8-3bb14f364cdc.png)


# よくある対処法
　まず、取り出す方法としてよく説明されているのが cherry-pick を使う方法です。これは、取り出すコミットが一つや二つの場合にはいいですが、コミットが多いと取り出すのが大変です。また、順番も間違えないように気をつける必要があります。

```
$ git checkout master (コミットを追加できるブランチに移動する)
$ git cherry-pick a734caa (最初の消えているコミットを取り出す)
$ git cherry-pick 8598194 (次の消えているコミットを取り出す)
```

![lostbranch1_300.png](https://qiita-image-store.s3.amazonaws.com/0/129226/743d817e-f1de-aed4-c2cd-9669e5a87929.png)

# ブランチにしてしまう方法
　見えなくなっている理由は、コミットがどのブランチにも所属していないことが原因ですので、ブランチに所属させてしまえば普通にログから参照することができるようになります。この方法なら、たくさんの連続したコミットが見えなくなっていても、一度に復帰させることができます。

```
$ git checkout 8598194 (消えているコミットの末端へ移動する)
$ git branch MyBranch (ブランチを作る)
```

![lostbranch2_300.png](https://qiita-image-store.s3.amazonaws.com/0/129226/433edb66-2bd6-d944-1da4-bf2973a063ce.png)


以上。
port-based-option=divide-networkが設定できない問題



## 環境

Yamahaのルータ RTX810


## 問題

以下のように設定ができない


```
no lan type lan1 port-based-option=divide-network
lan type lan1 port-based-option=divide-network
エラー：重複して使用できない設定があります
```


## 解決方法

今回の場合は、以下で解決。

```
switch control use lan1 off 
```
Meteorのあんちょこ꒰｡･ω･`;꒱ デプロイ編

# Galaxy

- GalaxyというPaasがあるらしく、これを使用すると、簡単にデプロイできるらしい。
- 0.035USD/hour→0.84USD/day
- "meteor bundle"コマンドを用いることで、単独で動作するNode.jsアプリケーションの形にバンドル可。Heroku等のPaasにデプロイ可。

```bash:console
$ meteor deploy test-meteor-sample.meteor.com
Talking to Galaxy servers at https://us-east-1.galaxy-deploy.meteor.com
Error deploying application: Your account is not authorized to deploy to Galaxy.
```

## Heroku 

- Heroku add-on mLabを使用する。
- [Heroku add-on mLab MongoDB（公式）](https://devcenter.heroku.com/articles/mongolab)

- [Meteor アプリを Heroku にデプロイしよう！](https://www.gitbook.com/book/j-hack/deploy-meteor-app-to-heroku/details)
- [JSフレームワーク Meteor 入門 & Heroku デプロイまで@酒と泪とRubyとRailsと](http://morizyun.github.io/blog/meteor-heroku-deployment-tips/)

###  プロジェクト作成 ＆ ローカルで動作確認

```bash:console
$ meteor create hello

$ meteor update

$ meteor
[[[[[ ~/meteor_heroku/simple-todos ]]]]]      

=> Started proxy.                             
=> Meteor 1.4 is available. Update this project with 'meteor update'.
=> Started MongoDB.                           
=> Started your app.                          

=> App running at: http://localhost:3000/
#--> localhost:3000で動作確認

$ git init 
$ git add .
$ git commit -m "simple todos"

```

## Herokuにデプロイ

- ~~[Buildpacks ＠ Heroku Dev Center](https://devcenter.heroku.com/articles/buildpacks#officially-supported-buildpacks)~~

```bash:console
$ heroku create
https://****.herokuapp.com/ | https://git.heroku.com/****.git
# ===> 動作確認


# Buildpackの設定
$ heroku buildpacks:set https://github.com/AdmitHub/meteor-buildpack-horse.git


# mongodbの設定
$ heroku addons:create mongolab
Creating mongolab-fluffy-37768... done, (free)
Adding mongolab-fluffy-37768 to salty-retreat-47355... done
Setting MONGODB_URI and restarting salty-retreat-47355... done, v3
Welcome to mLab.  Your new subscription is being created and will be available shortly.  Please consult the mLab Add-on Admin UI to check on its progress.
Use `heroku addons:docs mongolab` to view documentation.

$ heroku config:set ROOT_URL=https://****************.herokuapp.com/

# 1Dynoで運用する設定を施す
$ heroku labs:enable http-session-affinity

$ git push heroku master
```
PgAdminの自分用メモ


PostgreSQLのGUI の管理インタフェース「pgAdmin」の備忘録です。
pgAdmin 1.22.1を対象にしています。

# サーバ構成

### データベースのアクセス制御
1.「ツール → サーバ構成 → pg_hda.conf」を選択する
2. データベースに対するアクセス制御(アクセスを許可するIPアドレス、ユーザなど）を設定する。

`[Postgresフォルダ]/conf/pg_hda.conf]`からも設定可能。

# レポート
テーブル定義書のようなレポートが出力できます。
Excelのテーブル定義書から脱却できるかもしれません。

公式サイト: https://www.pgadmin.org/docs/1.22/reports.html

外部スタイルシートを埋め込むこともできます。
デフォルトのレイアウトが気に入らない方は、お試しアレ。

### テーブル内の列一覧
1. 対象のテーブル選択して右クリック
2. 「レポート ⇒ データ辞書レポート」を選択
3. OKボタンを押す

### テーブル一覧
1. 「テーブル」を選択して右クリック
2. 「レポート ⇒ Object List Report」を選択
3. OKボタンを押す

### ビュー一覧
1. 「ビュー」を選択して右クリック
2. 「Object List Report」を選択
3. OKボタンを押す

### 関数一覧
1. 「関数」を選択して右クリック
2. 「Object List Report」を選択
3. OKボタンを押す

### シーケンス一覧
1. 「シーケンス」を選択して右クリック
2. 「Object List Report」を選択
3. OKボタンを押す


# Query Tool
[Ctrl+Space]でSQLコマンドやテーブル名、列名の入力補完リストが出ます。
ただし、１行で書かないと入力補完されません。

１行でSQLを書いて、WHERE句の次に[Ctrl+Space]を入力すれば、補完リストが出ます。

```
SELECT * FROM sample WHERE 
```

FROM句とWHERE句が同じ行でないと、補完リストが出ません。

```
SELECT * FROM sample 
WHERE 
```

たぶん、PSQLコマンドベースだから１行にする必要があるのだと思います。

>The autocomplete system is based on code from psql, the PostgreSQL command line interpreter and will generally be able to offer autocomplete options in the same places that it can in psql.

https://www.pgadmin.org/docs/dev/query.html より引用
Viveを接続中にPCにもサウンドを流す方法

ViveをPCにつなげていると、Viveにしかサウンドが流れなくなります。
Viveを接続している状態でPCにも流せないか調べてみたところSteamVRの設定からサウンドをミラーすることができました。

##やり方

###1. SteamVRの設定を開く
![SteamVR ステータス 2016-07-31 19.38.15.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/e94543be-4263-9048-d0ef-2d890febe305.jpeg)

###2.オーディオ設定からミラーを指定する
![設定 2016-07-31 19.35.41.jpg](https://qiita-image-store.s3.amazonaws.com/0/67575/1472d1f3-e5d7-e459-a1b0-5e509bb34d94.jpeg)


これだけでPC側にもサウンドが流れます。
DEMOの時にPCからサウンドを流したり、作業用BGMを聞きながら開発できるようになります :)

イヤホンやスピーカーを接続しなおすと、音がでなくなってしまう。
もう一度オーディオ設定からスピーカーを選択すれば音がでるようになる。
rethrowsは思ひやりです。

# `rethrows` の役割

例外をthrowする関数を引数に受け取る場合に`rethrows`を定義することができます。

例: rethrowsの実装 (all関数)

```swift
extension Array {
    func all(handler: Element throws -> Void) rethrows -> Void {
       for element in self {
           // tryで関数を呼び出してもdo-catchブロックが必要ありません。
           try handler(element)
       }
    }
}
```

そうすることで、引き渡した関数内部で発生させた例外を**外側に投げることが出来ます**。

例: 関数内部で発生させた例外を外に投げる

```swift
do {
    // 内部で発生させた例外をrethrowするためにはtryをつけます。
    let _ = try [2,4,5].all {
        // 例外を発生させる
        try makeHalf($0)
    }
} catch let e {
    print(e)
}

// 半分にできない場合は例外を発生させる
func makeHalf(num: Int) throws -> Int {
    guard num % 2 == 0 else {
        throw Error.LeftOverException
    }

    return num / 2
}
```

# まとめ

rethrowsは高階関数を実装する側はあまり必要性が得られませんが、使う側には外側にエラーをぶん投げられるようになりますので、
エラーハンドリングを一箇所にまとめられるようになります。

rethrowsは必要性で考えるのではなく、思ひやりの心でつけて上げて下さい。
スムーズにスクロールするjQueryプラグイン

* Github: https://github.com/kamem/jquery.smoothPageScroll

今までnpmに登録していなかったので作りなおして登録しましたっ！

スムーズにスクロールするプラグインは色々あるのですが、
必要な機能を備えたプラグインが見つからなかったので作ってみました。

前々からつくってはいたのですが、
昔の拙いコードが残っていたので少し整理しました。


仕様
------
1. アンカーで移動後にアドレスを変更（アドレスにハッシュを付与する）。
2. 座標を指定してのページ内リンク。
3. ロード時にページの先頭からハッシュの位置までスムーズに移動することができる。
4. 移動完了後に指定した関数を実行。
5. スクロール途中、マウススクロールしたときにカクカクした動きをする問題をスクロールをストップすることで回避。
6. スクロール途中に画面をクリックした場合にスクロールが止まる。

デモ
------

[DEMO](http://github.develo.org/jquery.smoothPageScroll/example/)


必要なプラグイン
------

* jquery
* [jquery.easing](https://github.com/gdsmith/jquery.easing)


スクロール時の`animate`の`easing`の初期値に`easeOutQuart`を使用しているため、このプラグインが必要です。


## インストール

### Npm

	npm install jquery.smooth-page-scroll


使い方
------
    <script src="js/jquery.js"></script>
    <script src="js/jquery.easing.js"></script>
    <script src="js/jquery.smoothPageScroll.js"></script>
    <script>
    $.smoothPageScrollByLoaded();
    $('a[href^="#"]').smoothPageScroll();
    </script>

### a要素以外につけたい場合
    $('h1').smoothPageScroll({
    	target: '#header'
    });


### 移動後に関数実行
    $('a[href^="#"]').smoothPageScroll({
    	complate: function(e) {
    		console.log(e);
    	}
    });


### 座標を指定してリンク
 	#1000,1000
 	//（x, y）


### 任意のタイミングでスクロールする

    $.smoothPageScrollStart({
    	target: '#header'
    });

Options
------

| option name| type | Descriptions |default
|:-----------|:------------|:------------|:------------|
| easing | `String` | イージングの種類 |`'easeOutQuart'`
| speed | `Number` | スクロールスピード | `1000`
| delay | `Number` | スクロール開始までの待ち時間($('body').animate.delay(**delay**) |`-999999`
| target | `String` or `jQuery Object` | 直接ターゲットを指定する (例) `#header` or `$(#header)`  ※ 値の指定がない場合は(0, 0)になります。 | `undefined`
| complate | `Function` | スクロール完了後に実行したい関数 | `''`
| isAddHash | `Boolean` | スクロール後にhashを追加するか | `true`
| isTopScroll | `Boolean` | 縦方向にスクロールするか | `true`
| isLeftScroll | `Boolean` | 横方向にスクロールするか | `true`

### 初期設定 ###
	//ロード時の処理
    $.smoothPageScrollByLoaded({
        easing: 'easeOutQuart',
        speed: 1000,
        complate:'',
        target: location.hash,
        isAddHash: true,
        isTopScroll: true,
        isLeftScroll: true
    });

	//クリック時の処理
    $('a[href^="#"]').smoothPageScroll({
        easing: 'easeOutQuart',
        speed: 1000,
        delay: 0,
        target: undefined,
        complate: '',
        isAddHash: true,
        isTopScroll: true,
        isLeftScroll: true
    });
PostgresSQLの自分用メモ


PostgresSQL9.5対象


# 便利な文字列関数

便利だなと感じた関数を掲載します。

https://www.postgresql.jp/document/9.5/html/functions-string.html

### regexp_split_to_table
POSIX正規表現を区切り文字に使ってstringを分割します。 


# pg_dump

https://www.postgresql.jp/document/9.5/html/app-pgdump.html

### format

以下の4種類から選択できる。

* plain
* custom
* directory
* tar

通常のバックアップの場合`custom`を選択する。
`custom`が最も圧縮される。

>pg_restoreへの入力に適したカスタム形式アーカイブを出力します。 ディレクトリ出力形式と一緒に使用する場合、リストア時に手作業で保管された項目の選択、再順序付けできますので、これはもっとも柔軟な出力形式です。 また、この形式はデフォルトで圧縮されます。
今時、ローカル環境で学ぶのはもう古い！？Webで学べるレッスンサイトのまとめ

こんばんはー！みんなが熱心に記事を書いていますので、私自身が記事を書く必要もないほどなのですが、昨今どういう勉強方法があるのかなぁと思い調べていました。
（もう時期選挙が始まるというのに興味がわかない・・・）

プログラミング経験やプログラミン経歴はさほどありませんが、それでも一応プログラマーと言えるように色々な言語の基礎的な部分に触れるようにしています。
そりゃあもうCからC++からVBAからVB、JavaにJavaScript、Objective-C、pythonにPerl・・・（他に比べてPerlはそんなに触ってないです）

しかしながら、学ぶというのはなかなか大変なものですよねえ。
書籍から学ぶにせよ、動画やWebから情報を仕入れるにせよ、なかなか大変です。
それでもこの道を進むのであれば、何かしらの方法で情報を仕入れていかなければいけません。

私自身も学ぶ方法は書籍であったり、動画であったり、Webであったりいろんな方法で思考錯誤して学んでいます。

さてさて、そろそろ本題に移りたいと思いますが、入門書籍を買うのはためらうし、環境構築するにはそれなりの準備も必要だし、それでも言語を学びたいという方に需要のあるサイトをご紹介したいと思います。

まずは動画で学べるサイト、[ドットインストール](http://dotinstall.com)です。
こちらも昨今じゃ基礎を学ぶ上で有名なサイトになりました。
こちらはいろんな言語を動画から学べるようになっています。
![dotinstall.png](https://qiita-image-store.s3.amazonaws.com/0/13837/006024a0-00fe-3ddb-be1e-86eebedbea65.png)

言わずもがな。知ってるって人が多いですね。
また、こんなくだらない記事か・・・などと思われて悲しい気持ちになりそうなことを抑えつつ、次をご紹介しましょう。
お次は[udemy](https://www.udemy.com/jp/)というサイトです。

![udemy.png](https://qiita-image-store.s3.amazonaws.com/0/13837/43a93cbb-bc9f-6c87-3d3c-f14acc55d97f.png)

これも知ってる方が多そうですね。
しかも、プログラム以外も学べるなかなか貴重なサイトですよ。
なんだよやっぱりその程度の紹介記事か、しかも、有料のサイトばっかり紹介してきて回し者なんじゃないの、と思われそうですが、もう少しお付き合いくださいな。

お次は、[codeacademy](https://www.codecademy.com/ja)というサイトです。

![codeacademy.png](https://qiita-image-store.s3.amazonaws.com/0/13837/969fb471-7c6a-ed40-c258-ec7388ddb98e.png)

codeacademyは動画サイトや有料サイトではありません。
ブラウザ一つで学べるサイトです。
言語もそこそこ揃っています。
いかがでしょう？（くっくっく・・・）

さて、本日最後のご紹介になりますが、今、私自身が学ぶために利用しているサイトで、[Progra!](https://progra.org)というサイトです。

![progra!.png](https://qiita-image-store.s3.amazonaws.com/0/13837/d1bb20fd-aa0a-ee79-8aad-9e96fc304532.png)

こちらもWebブラウザ一つで学べますので、環境なんて必要ありません。
学べる言語こそ少ないですが、Web系を学んでいくのに十分なサイトだと思います。
Progra!のおすすめは反復して学べる点です。

さてさて、４つご紹介しましたが、いかがでしたでしょうか？
４つのサービス（有料サイトも含め）最近の開発は環境構築しなくて良いので恵まれてますね。
昔はWindowsで言語を学ぶのにどうすれば良いか、から入ったものですが・・・（老害発言

とはいえ、タイトルで誤解を与えそうなので、解いておきたい誤解が一つあります。
開発現場ではむしろ、開発環境が第一です。
足並み揃えてこそ、開発が進められるという部分が大半をしめます。
なので、開発環境なしで学べることや動画を見るだけで学ぶことも今は可能になっていますが、周囲のプロジェクトメンバーと環境をそろえ、学ぶこともまた必要ということをここに記して終わりたいと思います。

環境を気にしない世界って最高だわ・・・（台なし
電子工作erのためのUSB端子の覚え方

# この資料について
電子工作するたびにUSBの資料を見ながら
「あれ〜、オス側は向かって右が電源だっけ？」
とか悩む。

ので、覚えやすい方法を考えた。

---
# USB端子 - ピンと信号名
|ピン| 信号名 |
|:-:|:-----:|
| 1 |  Vbus |
| 2 | -Data |
| 3 | +Data |
| 4 |   GND |

---
# 実物 - Aオス（PCに刺す端子）
![usb1.png](https://qiita-image-store.s3.amazonaws.com/0/12843/24390e37-030b-908a-6d25-27ffd6177c81.png)

右からVbus(1) → GND(4)
この部品は1番に凹みがあるので親切

---
# 覚え方を考える
![usb3.png](https://qiita-image-store.s3.amazonaws.com/0/12843/ff690d8f-265c-8004-6e23-edd2c4752f5c.png)

裏返す……となんか顔に見えてくる
左右に基板を掴む手もついてる

---
# 図解すると

---
# 💡ご飯は僕らのエネルギー
![usb2.png](https://qiita-image-store.s3.amazonaws.com/0/12843/b65fdbed-2dc9-a825-8aa1-02ce2a65d75f.png)

---
# おしまい
PepperのDialogの閾値変更Boxを作ってみた

多くの方から「pepperのDialogの閾値変えられないの？」という話があったので作ってみました。pythonの知識もいらないので以下を参考にしてみてください。

# はじめに
- PepperのDialogの閾値を変えるのに<b>わざわざ</b>ssh接続をするのは面倒
- ChoregraphのBoxができればアプリ内に組み込める
- それぞれのDialog Boxで閾値を設定できる(Speech Reco.みたいに)

#Set Dialog CT ボックス
さっそくDialogのConfidence Thresholdを変更するBoxを作った。
Boxは[Github](https://github.com/Ryou-Watanabe/pepper-sample-app/tree/master/Set_Dialog_Confidence_Threshold)に公開している。

ダウンロードし、.pmlを開くと以下のように構成されたアプリが出てくる。
そのまま実行すればDialogの閾値を変更することができるようになっている。

![Screen Shot 2016-07-27 at 20.44.59.png](https://qiita-image-store.s3.amazonaws.com/0/104635/7b3404f5-3e91-7d2d-441c-c6716447e7d8.png)

##具体的な使い方
作成したBoxはSet Dialog CTというBoxである。このBoxを少し覗いてみよう。

![Screen Shot 2016-07-27 at 20.45.27.png](https://qiita-image-store.s3.amazonaws.com/0/104635/45d48868-e86e-6799-fd2e-ea03879ebead.png)

まず変数だが、どこかで見たことがあるだろう。そう、Speech Recoと全く同じあの閾値だ。デフォルトでは40%認識することができるようになっている。この値を0.5にすると閾値を50%に設定することができる。

![Screen Shot 2016-07-27 at 22.01.06.png](https://qiita-image-store.s3.amazonaws.com/0/104635/3aed8153-9125-1f68-6655-4ac9b49b7e99.png)

Dialog Boxの前に配置するだけでいいので便利！

##ボックスの中身

```py:
class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        try:
            self.dialog = ALProxy("ALDialog")
            self.value = self.getParameter("Confidence Threshold (%)")

        except:
            self.logger.warn("ALDialog is not available, language setting cannot be applied to dialog")
            self.dialog = None


    def onInput_input1(self):
        self.dialog.setASRConfidenceThreshold(self.value)
        self.logger.info(self.dialog.getASRConfidenceThreshold())
        self.output1()
```

できるだけシンプルに仕上げました。Choregrapheのログビューアでも閾値を確認できるようになっています。

#おわりに
こんな感じにさらっとDialogの閾値は変更できます。これだとあの面倒なsshでつないで変更する手順を踏まなくていいです。
ぜび、役立ててください。
zshのfor文は強かった

zsh超初心者につき備忘録程度の内容。

#for文ワンライナー
例えば、

```zsh
for f (1.txt 2.txt) rm $f
```
ってやれば1.txtと2.txtを削除してくれる。

```zsh
for f (*.txt) {echo $f; cat $f}
```
ってやれば同一階層内のtxtのファイル名と中身を一気に出力してくれる。

```zsh
for f (**/*) echo $f
```

ってやれば同一階層内かそれより深いファイル全てのファイル名を表示してくれる。

#ファイル名変数
以上3つのfor文はすべて$fにファイル名が代入されている。
**本当に便利なのはここから。**

```zsh
for f (*.tx) mv $f $f:r.txt
```
こうすると、同一階層の◯◯.txが全て◯◯.txtにリネームされる。

##変数オプション
上記スクリプトの場合を例にとると、`$f`の後に`:r`をつけることでファイル名の名前部分（拡張子以外）が取得できる。
試してみたところ以下のオプションが確認できた。
※カレントディレクトリは`/root/pwd`、対象ファイルは`/root/pwd/directory/File 1.ext`とします。

|オプション|内容|結果|
|:--|:--|:--|
|`$f`(なし)|現在のディレクトリからのパス|`directory/File 1.ext`|
|`$f:a`|ルートからのフルパス|`/root/pwd/directory/File 1.ext`|
|`$f:e`|拡張子|`ext`|
|`$f:h`|$fを含むディレクトリ名(ユニーク)|`directory`|
|`$f:l`|小文字に置換|`directory/file 1.ext`|
|`$f:q`|エスケープ表現|`directory/File\ 1.ext`|
|`$f:r`|ファイル名(拡張子を除く)|`directory/File 1`|
|`$f:t`|ファイル名(ディレクトリを除く)|`File 1.ext`|
|`$f:u`|大文字に置換|`DIRECTORY/FILE 1.EXT`|

これらのオプションは複合させることもできる。
例えば、`$f:t:u`とすると`FILE 1.EXT`が得られる。
Swift 3 と 4 の見込み

[Swift 作ってる人の投稿 (Looking back on Swift 3 and ahead to Swift 4)](https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160725/025676.html) の概要

1. [Swift](https://en.wikipedia.org/wiki/Swift_(programming_language)) をオープンソースにした結果、設計スピードは鈍ったが成果物はかなり良くなった（らしい）
    1. ただ、開発スケジュールを予測するのはほぼ無理
2. 2017 年春に Swift 3.x を、秋に Swift 4 をリリースする見込み (*1)
3. Swift 4 ではソースの[後方互換](https://en.wikipedia.org/wiki/Backward_compatibility)と [ABI](https://en.wikipedia.org/wiki/Application_binary_interface) 安定に注力する
    1. まず ABI が変化する [Conditional conformances](https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#conditional-conformances-) や [Recursive protocol constraints](https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md#recursive-protocol-constraints-) みたいな変更を実装し
    2. 残った時間で ABI に影響を与えない正規表現サポートや Reflection などを実装する予定

(\*1) 変化早い（ 2014 年秋に 1.0 、 2015 年秋に 2.0 、 2016 年秋に 3.0 の予定）
(\*2) コメントしてもらって、その後大分修正しました

# 所感

1. Swift はマシン語にコンパイルできるモダンな言語として期待してるけど、いまいち Scala みたいな親近感が湧いてこない...