OmniAICreator/Qiita-1.07M huggingface dataset:
Reflowを制するものはDOMを制す

すごい記事が1日目2日目で来ている中で恐縮ではありますが、フロントエンドJavaScriptでパフォーマンス点から気にしたほうがいい部分について書いてみることにします。

# DOM律速になるケースもある
よく「JavaScriptが遅い」ということも多いのですが、具体的にはどのあたりが遅くなってくるのでしょうか.

* 純粋にJavaScriptのスクリプト処理が遅い…最近はブラウザ自体も高速化しては来ましたが、それを追いかけるようにJavaScriptの巨大化も進んでいます。ただし、純粋にプログラム言語的な処理なら、Web Workerに振ることで並列化が可能です。
* Ajaxや画像読み込みなどの通信が遅い…サーバ側で高速化する手もありますが、状況によってはJavaScriptで先読みを始めておいて、体感時間を短くすることも可能かもしれません。
* DOM操作・表示が遅い…これについて今回考えてみます。

最大の特徴として、DOM関連の制御は**シングルスレッド**となることがあります。Web WorkersやAjaxは、いくつも一気に起動して並行に進めることができますが、DOM操作はそうも行きません。個々の操作について、「不要なものを減らす」「速度に意識して行う」以外に、高速化の手段はないということです。

# ReflowとRepaint
ブラウザがHTMLを表示するまでの流れは、大きく2段階にわかれています。

* 各HTML要素を解釈して、それぞれが占めるスペースを算出する
* 算出したスペースのなかに、内容を描画していく

Firefoxでは、前者をReflow、後者をRepaintといいます。Chromeでは前者を「Layout」と呼んでいたりもするのですが、この記事ではReflowで通します。

Reflowが起きるということは、つまり表示位置が変わることなので、連動してRepaintも起きるようになります。よく、「`<img>`にwidthやheightを指定する」という高速化手法が挙げられることがありますが、これも、画像の寸法をあらかじめ固定することで、画像読み込み完了時にReflowが起きるのを予防するという効果があります。

# Reflowが起きる時
Reflowは「表示すべきものの配置が変わる」ことをきっかけとして発生しえます。つまり、

* 要素の追加・削除
* すでに存在する要素の、寸法や余白が変わり得るスタイル変更
* ユーザーによるスクロールやブラウザのサイズ変更

などです。ただし、毎回Reflowしなくても処理はできるので、必要な時だけに限定しています。実際にReflowが起きるタイミングとしては、

* フレーム更新の直前
* JavaScriptから、寸法に関係するスタイル関係の値にアクセスする（**参照を含めて**）

などです。

#Reflowを減らすには
ということで、Reflowを減らす手段として、大きく2つに分ければ「Reflowになりうることを減らす」のと「Reflowが起きるきっかけを減らす」ということがあります。

まず、「Reflowになりうることを減らす」方法としては、

* 細かい単位でスタイルを変更せず、できればクラス一発で切り替える
* DOMに要素を追加する場合も、`documentFragment`などを使って、一気に追加する
* DOMへの追加前にスタイルを整えて、それからDOMに追加する

などがあります。もう一方の、「Reflowが起きるきっかけを減らす」方法ですが、もちろんJavaScriptからフレームレートの調整はできませんので、「できるだけ寸法プロパティへの参照を避ける」ということが中心になります。

# `requestAnimationFrame`
[IE 10以降、Android 4.4以降などを含む多くのブラウザで使える](http://caniuse.com/#feat=requestanimationframe)関数として、`requestAnimationFrame()`というものがあります。これは`setTimeout`と似たような感じで処理を遅らせる関数ですが、実行タイミングがフレーム再描画の直前、ということになります。そういうことで、ここでReflowが起きてもほとんどペナルティにならないので、名前の通りのアニメーションなど重いDOM処理をするには最適な場所となっています。

# 外部リンク
* [ブラウザ動作の理解－リフローとリペイント及びその最適化](http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/reflow-and-repaint-in-browser/)
"RuntimeWarning: Pickled model instance's Django version is not specified"について

この記事は[Python その2 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/yet_another_python)の6日目の記事です。

Djangoを1.7から1.8以上にバージョンアップすると、

```
RuntimeWarning: Pickled model instance's Django version is not specified.
  obj = pickle.loads(value)
```

のような警告が表示されることがあります。

モデルインスタンスをPickleでデシリアライズすると必ず発生するのかと思ったのですが、この警告が表示されるないこともあり、条件が不明だったので原因を調べてみました。

## 警告の原因
端的に言うと、Django 1.7以前で動作するアプリケーションでシリアライズしたモデルのデータを、Django 1.8以上で動作するアプリケーションでデシリアライズすると発生します。

警告を発生させているコードは[ここ](https://github.com/django/django/blob/1.9/django/db/models/base.py#L518)です。

- https://github.com/django/django/blob/1.9/django/db/models/base.py#L518

virtualenvなどで1.7, 1.8/1.9をインストールした環境を作って、同じアプリケーションでバージョンを切り替えてみると簡単に再現させられます。

Django 1.7のvirtualenvで以下のような感じでキャッシュをセット。

```
$ python manage.py shell
>>> from django.core.cache import caches
>>> from django.utils.six.moves import cPickle as pickle
>>> from myapp.models import MyModel
>>> obj = MyModel.objects.get(pk=1)
>>> caches['default'].set('my-model-instance', pickle.dumps(obj))
```

Django 1.8のvirtualenvで以下のような感じでキャッシュからモデルインスタンスをデシリアライズ。

```
$ python manage.py shell
>>> from django.core.cache import caches
>>> from django.utils.six.moves import cPickle as pickle
>>> from myapp.models import MyModel
>>> pickle.loads(caches['default'].get('my-model-instance'))
<string>:1: RuntimeWarning: Pickled model instance's Django version is not specified.
```

## 対処方法
対処方法としては以下のようなものが考えられます。

### 無視する
確信はもてませんが、Djangoのソースコードのコメントを読む限り、`defer`で遅延ロードしているプロパティがなければ影響がないようにも見えます。

また、Memcacheのような揮発性のキャッシュならば時間が経てば新しいキャッシュに置き換えられていくので、問題は自然解消するはずです。

### Djangoをバージョンアップしたタイミングでキャッシュをクリアする
おすすめはしません。

```
$ python manage.py shell
>>> from django.core.cache import caches
>>> caches['default'].clear()
```

もしくは`settings.py`の[`CACHES`](https://docs.djangoproject.com/en/1.9/ref/settings/#caches)の設定で、[KEY_PREFIX](https://docs.djangoproject.com/en/1.9/ref/settings/#key-prefix)を変更したり、[`VERSION`](https://docs.djangoproject.com/en/1.9/ref/settings/#)をインクリメントするのも、ほぼキャッシュ全消しと同じ効果があります。

### Pickleしたデータのキャッシュのキーだけを変える
今回僕が捕ろうとしている方法です。

キャッシュのキーにDjangoのバージョン番号を入れてしまうことで、将来さらにバージョンが上がった場合でも、自動的にバージョン毎に別のキャッシュが使われるようにします。

```
>>> from django.core.cache import caches
>>> from django.utils.six.moves import cPickle as pickle
>>> from django.utils.version import get_version
>>> from myapp.models import MyModel
>>> obj = MyModel.objects.get(pk=1)
>>> caches['default'].set('{}:my-model-instance'.format(get_version()), pickle.dumps(obj))
```

問題になっているのはPickleしたモデルインスタンスをキャッシュする場合だけなので、上記のような感じで該当箇所を修正しておけば、1.9以上にバージョンアップすることになっても困ることはないはずです。
SwiftでSinatraっぽくWebアプリケーションを書いてLinuxで動かす


AppleがWWDCでの公約通りSwiftをオープンソース化し、Linuxプラットフォームをサポートするようになりました。これまでSwiftの主戦場は大半がiOSアプリ、一部がOSXアプリでしたが、せっかくなのでここではOSXでもLinuxでも動く簡単なWebアプリケーションを作成してみました。

## Swiftra

Rubyには[Sinatra](http://www.sinatrarb.com)という簡潔な言語内DSLでWebアプリケーションを作成できるフレームワークがありますが、似たようなものをSwiftで実現するライブラリ[Swiftra](https://github.com/takebayashi/swiftra)を作成してみました。

Swiftraを利用すると、下記のようなDSLで記述することができるようになります。

```swift
import swiftra

get("/hello") { req in
    return "Hello, world!"
}

serve(8080)
```

上記のコードをビルドして実行し、`http://localhost:8080/hello`へHTTP GETリクエストを送信すると、`Hello, world!`という文字列をレスポンスとして受け取ることができます。

## Swiftraを利用してWebアプリケーションを作成する

Swiftraを利用するには、Swift Package Managerを利用します。下記のように依存定義を1行追加するだけで設定は完了します。

```swift
import PackageDescription

let package = Package(
    name: "swiftra-example",
    dependencies: [
        .Package(url: "https://github.com/takebayashi/swiftra.git", majorVersion: 0)
    ]
)
```

また、SwiftraをLinux上で利用する場合にはglibcに依存しますが、SwiftのLinux向けビルドの現時点での最新版（778f82939c）では依存モジュールがglibcに依存していてもアプリケーション本体にglibcへの依存がない場合には`swift-autolink-extract`が正常に動作しないという問題があるため、アプリケーションコードのどこかに下記のような記述を追加する必要があります。

```swift
#if os(Linux)
    import Glibc
#endif
```

あとは、`main.swift`を作成し、前節に示したようなコードを記述することでWebアプリケーションを作成できます。

# Swiftraアプリケーションを実行する

[Swiftraを利用した簡単なサンプル](https://github.com/takebayashi/swiftra-example)を用意したので、これを実行してみます。オープンソース版のSwiftがインストールされた環境で、下記を実行します。

```bash
$ git clone https://github.com/takebayashi/swiftra-example.git
$ cd swiftra-example
$ swift build
$ ./.build/debug/swiftra-example
```
```
$ curl 'http://localhost:8080/abc'
/abc was requested with GET

$ curl -X POST -d foo=bar 'http://localhost:8080/abc'
/abc was requested with POST, body = foo=bar
```

HTTPリクエストを送信すると、それに応じた処理が実行されてHTTPレスポンスとして返ってくることが確認できました。

## おわりに

ここでは、[Swiftra](https://github.com/takebayashi/swiftra)というオリジナルのライブラリを利用してWebアプリケーションを作成する例を示しました。OSXをターゲットにしたSwiftのWebアプリケーションフレームワークはこれまでにもいくつかありましたが、Linux版の登場によってこの分野がさらに活発になるのではないでしょうか。

なお、ここで紹介したSwiftraは現時点では静的ルーティングしかサポートしておらず、機能的にもかなり貧弱です。また、Swiftraでは主にWebアプリケーションのためのDSLを提供するためのライブラリですが、その背後でHTTPサーバとして動作するためのSwiftによる実装としてちょうどよいものがなかったたため、最低限のHTTP/1.0サーバを[http4swift](https://github.com/takebayashi/http4swift.git)として実装しました。Swiftのオープンソース化によってこの分野が活性化され、より安定した実装が登場することが期待されます。
群の部分群について

# 群の部分群について

aiya advent calendar 4日目の記事です.
前回はaiya000さんの[貴方はMarkdownでTexすることができる](https://gist.github.com/aiya000/9e87cdc8e2d22ed0b2bc)でした.

無茶ぶり感が半端無かったですね.

さて, 本論.

なんだろう.
前aiyaさんに振った問題の解説でもすればいいのかな?

> $G$を群とし, $G^\prime$を$G$の部分群とする.

> $G$の単位元と$G^\prime$の単位元が一致することを示せ.

いや, 簡単ですよ?

10分ほど考えてみてください.

...

はい, 解答例です.

$G$の単位元を$1_G$とします.

このとき, $1_G \in G^\prime$が示されれば, 全ての$g \in G^\prime \subset G$に対して

``` math
  g \cdot 1_G = 1_G \cdot g = g

```
であるので, $1_G$が$G^\prime$の単位元であることが分かります.
そこで, $1_G \in G^\prime$を示しましょう.

$G^\prime$が$G$の部分群であるとは, $G^\prime$が$G$と同じ演算に関して群になっていることでした.
さらに, 群は空集合ではないので, $G^\prime$は空ではありません.

そこで, $G^\prime \subset G$の任意の元$g$を取ってきます.
すると,

``` math
  gg^{-1} = 1_G \in G^\prime
```

となるので, $1_G \in G^\prime$が分かりました.

以上によって, $G^\prime$の単位元は$1_G$であることが分かりました.

- - -

明日はaiya000さんの「非可換体のガロア理論」です。

よろしくおねがいします.
Vagrantで複数ホスト&複数ネットワークインターフェースの設定(Vagrantfile）



# 概要

Vagrantで複数ホストがそれぞれ複数ネットワークをもつゲストOSを作りたかった。
いい例がなかったのでまとめた。VMはVirutalboxを前提としている。


## デフォルトゲートウェイ
　デフォルトゲートウェイを変更したい場合がある。Vagrantではポストスクリプトで変更する。コマンドがOS毎に違うので、あらかじめ調べておく必要がある。例えばCentOS6とCentOS7の場合では、次のよう異なる。

**CentOS6**

```
route del default
route add default gw 192.168.0.1
```

**CentOS7**

```
ip route del default
ip route add default via 192.168.0.1
```

## テンプレート

```Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
config.vm.box = "saitou1978/centos-6_dev"

config.vm.define "node01" do |server|
server.vm.hostname = "node01"
server.vm.network "public_network", type: "dhcp"
server.vm.network "private_network", ip: "192.168.44.115"
server.vm.provision "shell", inline: <<-SHELL
route del default
route add default gw 192.168.0.1
SHELL
end

config.vm.define "node02" do |server|
server.vm.hostname = "node02"
server.vm.network "public_network", type: "dhcp"
server.vm.network "private_network", ip: "192.168.44.116"
server.vm.provision "shell", inline: <<-SHELL
route del default
route add default gw 192.168.0.1
SHELL
end

end
```

## まとめ

デフォルトゲートウェイは以下のようにもできる。

```
route add default gw 192.168.0.1 eth1
```

ただし、Virutalboxを使っている場合は、eth0の設定は変更しないようにする。


## Appendix

Vagrantfileに以下を加えておけば忘れないかもしれない。

```
############################################
## N/W 1: NAT (static)
# config.vm.network "public_network", ip: '192.168.0.30'

## N/W 2: NAT (DHCP)
# config.vm.network "public_network", type: "dhcp"

## N/W 3: Localのみ
# config.vm.network "private_network", ip: "192.168.44.116"

## デフォルトゲートウェイの変更
# config.vm.provision "shell", inline: <<-SHELL
# route del default
# route add default gw 192.168.0.1 eth1
# SHELL
```
IntelliJ Ultimate (PhpStorm)で、Laravelのコード補完

[Laravel Development using PhpStorm](https://confluence.jetbrains.com/display/PhpStorm/Laravel+Development+using+PhpStorm)

ファサード関係が補完されないので、一手間かけて補完できるようにしてみました。
PHPの実行は、サーバーで行っているので、あくまでも、コードの補完をできるようにするのが目的です。
IntelliJには、PHP(Plugin)と、Laravel Pluginをインストール済みとします。

## 環境
* Mac OSX El Capitan(10.11)
* PHP 5.4
* Laravel 5.0.X
* IntelliJ 15.0.1
 * PHP(Plugin)
 * Laravel Plugin


## Homebrewでphp5.4をインストール
* Mac OSXには、PHP5.3（2015/12/6時点）が標準でインストールされています
* Laravel 5系は、PHP5.4以降が必要なのでアップデートします
* El Capitanで、新しく追加されたセキュリティ機能（Rootless）のおかげで、root権限でも『/usr』以下のファイルの操作が難しくなりました

```
$ brew list
$ brew uninstall php53 php53-mcrypt mcrypt
$ brew install php54 php54-mcrypt
$ php -v

PHP 5.4.45 (cli) (built: Sep 21 2015 19:14:35) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies

```
## Laravel IDE Helper
* IDE Helperインストール

```composer.json
{
	"name": "laravel/laravel",
	"description": "The Laravel Framework.",
	"keywords": ["framework", "laravel"],
	"license": "MIT",
	"type": "project",
	"require": {
		"laravel/framework": "5.0.*",
		"barryvdh/laravel-ide-helper": "2.*" // 追加
	},
}
```
```
$ ./composer.phar update
```
* IDE Helperファイル生成

```
$ php artisan ide-helper:generate
```
* IntelliJで、適当な関数を入力してみて補完されれば完了








## Tips
* composer install時にやたら、”Token (hidden): ”を聞かれる
 * [GitHub](https://github.com/settings/tokens)へログイン
 * [Personal settings] -> [Personal access tokens] -> 『Generate new token』
 * 生成したトークンを入力
* 自動アップロード
 * [Tools] -> [Deployment] -> 『Configuration..』でリモートホストの設定
 * [Tools] -> [Deployment] -> 『Auto Upload』

## 参照
* [Homebrew](http://brew.sh/index_ja.html)
仮想マシン構築

# 仮想マシン構築
## 概要
- webサービス開発などに向けて仮想マシンを構築する

## 各ツールの説明
### VirtualBox
- 仮想マシンを構築するためのツール

### vagrant
- VirtualBox上での環境設定を容易にするツール

## インストール方法
### VirtualBox
- 下記リンク先からOSに対応するバージョンをインストール

https://www.virtualbox.org/


### vagrant
- 下記リンク先からOSに対応するバージョンをインストール

https://www.vagrantup.com/

- 動作確認

`vagrant -v`

## 使用方法
### 仮想マシンの設定
- boxの追加方法

`vagrant box add (box name) (場所(~.box))`

- 公開されているvagrant box

http://www.vagrantbox.es/

- vagrant boxの確認

`vagrant box list`

- 仮想マシン構築

`vagrant init (box name)`

- 仮想マシンを立ち上げる

`vagrant up`
 
- 仮想マシンにssh接続する

`vagrant ssh`

- 仮想マシンをスリープにする

`vagrant suspend`

- 仮想マシンを破壊する

`vagrant destroy`

### Vagrantfileの設定
- 仮想マシンの静的IPを設定する(ホストマシンから仮想マシンで開発したwebページをブラウザで確認できるようにする)

```lang:Vagrantfile
config.vm.network :private_network, ip: "192.168.33.10"
```

- ホストPCと仮想PCの共有フォルダ設定

vagrant内仮想PCからは権限変更できない
```
config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=777', 'fmode=777']
```
Swift: CustomTableViewCellのレイアウトを独自Xib上で行うことで、Cellレイアウトの再利用性を高める

#I はじめに
##Xibを使ってレイアウトする理由
Storyboard上のUITableViewControllerに乗っているCellへは独自のレイアウトを実装することができる。Cellの独自レイアウトを再利用しない場合は、この方法は低コストで実用的である。

しかしStoryboard上でCellの独自レイアウトとTableViewControllerが一体化してしまうので、Cellのレイアウトを使いまわしたい場合は、この方法は合理的ではない。

Cellの独自レイアウトを専用に用意したXib上で行うことで、Cellの独自レイアウトの再利用性を高めることができる。

##動作確認環境
XCode Version 7.0.1

##必要な事前知識
XCodeの基本的な操作
UITableViewControllerの基本的な使用方法
UITaleViewCellの"ReuseIdentifier"への理解 etc.



#II 再利用可能な部品の作成
まずは再利用可能なCellのカスタムレイアウトと、Cellのカスタムクラスを作成する。
これはXibとUITableViewCellのサブクラスを使い、以下の４つのステップで実行する。

1. 事前準備
2. Cellのカスタムクラスを作成
3. Xib(Nib)ファイルの準備
4. カスタマイズの実装


##1. 事前準備
Storyboard上にTableViewControllerを配置して、UITableViewControllerのサブクラスを紐づける。

##2. Cellのカスタムクラスを作成
UITableViewCellのサブクラスを作成する。

この際、ファイル名を決める画面で”Also create XIB file”にチェックを入れることで、作成するクラスに紐付けられたXibファイルを同時に作成できる。

##3. Xib(Nib)ファイルの準備
ステップ２でXibファイルを作成した場合は、ここをスキップして次のステップへ。

そうでない場合は、Xibファイルを作成、ほかから持ち込むなどしてプロジェクト内に配置して、XibにTable View Cellを配置してそれをステップ２のUITableViewCellのサブクラスと紐づける。

##4. カスタマイズの実装
1. 作成したXib上のCellにReuseIdentifierを設定する。
2. Xibファイル上でLabelを置くなどレイアウトをカスタマイズし、Cellのカスタムクラスに紐づける。
3. その他カスタムクラスに独自に実装したい項目を実装。

#III TableViewControllerへの実装
前章で作成した再利用可能なレイアウトとクラスは、Storyboard上とUITableViewControllerサブクラスのコードで設定を行うことで実装できる。

任意の複数のTableViewControllerへ実装できるので、再利用が容易である。


##Storyboard
使用するTableViewController上のCellにステップ２で作成したCellのカスタムクラスを指定。
CellのReuseIdentifierは空欄のままでOK

##UITableViewController
viewDidLoadとcellForRowAtIndexPathに必要なコードを書き込む。

###viewDidLoad
使用するXibとCellのReuseIdentifierを登録する以下のコードviewDidLoad内へ書く

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

        // nibNameへはステップ２や３で作成したXibファイルの名前を拡張子抜きで指定。
        // forCellReuseIdentifierへはステップ４で設定したReuseIdentifierを指定。
        self.tableView.registerNib(UINib(nibName: "SnowboardCell", bundle: nil), forCellReuseIdentifier: "CustomX")
    }
```

###cellForRowAtIndexPath
cellの生成コードを改変し、CustomCellの初期化に必要なコードを実装する。

```swift:cellForRowAtIndexPath.swift
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        // 1. 生成するセルをカスタムクラスへダウンキャスト
        // 既存のCell生成コードの後に as! <Cellのカスタムクラス名> という記述を追加
        let cell = tableView.dequeueReusableCellWithIdentifier("CustomX", forIndexPath: indexPath) as! SnowboardCell

        // 2. CustomCellの初期化コードを記述
        cell.exampleLabel.text = self.exampleDataSource[indexPath.row]

        return cell
    }
```


#IV 参考文献
[Creating Custom UITableViewCell using Nib (.xib) files in XCode](https://medium.com/@musawiralishah/creating-custom-uitableviewcell-using-nib-xib-files-in-xcode-9bee5824e722#.82a6i8ff0)
[Custom UITableViewCell from nib in Swift | Stack Overflow](http://stackoverflow.com/questions/25541786/custom-uitableviewcell-from-nib-in-swift)
ReactNativeで警告を出さずにGoogleAnalyticsを使う

[react-native-google-analytics](https://github.com/lwansbrough/react-native-google-analytics)を使えば比較的簡単にGoogle Analyticsを利用することができますが、内部的にAPIを呼び出している部分で`fetch`が使われており、これがGoogle Analyticsのレスポンスである画像ファイルを解釈できずに警告が出てきます。そのうち直ると思いますが、とりあず以下の様なNativeModulesを用意すればなんとかなります。

```objc
RCT_EXPORT_METHOD(ping:(NSString*)url callback:(RCTResponseSenderBlock)callback){
  NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
  void (^handler)(NSData*, NSURLResponse*, NSError*) = ^(NSData *data, NSURLResponse *res, NSError *error){
    if(error) callback(@[error.localizedDescription]);
    else callback(@[[NSNull null]]);
  };
  [[[NSURLSession sharedSession] dataTaskWithRequest:req completionHandler:handler] resume];
}
```

応答は気にしないので`callback`は要らないかもしれません。
matplotlibのヒストグラム用パラメータ抜粋

ドキュメント読んでもなかなかわからないので、メモ

```利用例
matplotlib.pyplot.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, hold=None, data=None, **kwargs)
```

よく使うパラメータの紹介

| パラメータ名|内容 |型 |
|---|---|---|
| bins|X軸の分割数（ブロック分けの数） |int |
| range|X軸のデータ表示範囲 |int | 
|normed | 縮尺（1で最大値1の出現確率に、0でデータ数）|boolean |
|histtype |barは通常、barstackedは積み上げ、stepは外枠だけの階段状、stepfilledは階段を塗りつぶし |str |
| color|色（blue,green,red,cyan,magenta,yellow,black,whiteが使える） |str |
|alpha |透過率 |float |
| label| データラベル| str|


もちろん最後はドキュメントを参照
http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist
Markdownでlistにネストされたcodeブロックを記述する方法

### Markdownでリスト内にコードを書きたい

GitHubでWikiやREADMEにソフトウェアのインストール手順を書いて
途中にコードブロック載せるとか当然のようにやるのに思うようにコードブロックが表示されません。
これ解決できずにハマった人が多いのではないかと思います。

例えば下記のMarkdownを書いた時に

    1. Wake up
    1. Write code
    ```
    print "I'm sleepy."
    print "I'm hungry."
    ```
    1. Breakfast

なぜかコードブロックの表示がちゃんと適用されなかったり、
複数行のコードブロックのはずが1行で表示されたり、
順序付きリストの番号がリセットされたりします。

    1. Wake up
    2. Write code
    ``` ⇐コードブロックとして表示されない
    print "I'm sleepy."
    print "I'm hungry."
    ```
    1. Breakfast ⇐3.にならない

### どう書けばリスト内にコードブロックが表示されるか

このようにインデントを増やします。

    1. Wake up
    1. Write code

        ```
        print "I'm sleepy."
        print "I'm hungry."
        ```

    1. Breakfast

補足すると

    1. Wake up
    1. Write code
    ⇐コードブロックとして表示するために1行改行
        ```⇐ネストされるようにコードブロック全体をインデント
        print "I'm sleepy."
        print "I'm hungry."
        ```
    ⇐コードブロックとして表示するために1行改行
    1. Breakfast

こういうことです。
下記のように表示できます。

1. Wake up
1. Write code

    ```
    print "I'm sleepy."
    print "I'm hungry."
    ```

1. Breakfast

これでもうまく表示できない場合はまだ対処方法があって、
コードブロックの部分のインデントを更に増やしてあげれば良いです。
半角スペース4つでだめなら8つにしてみるなど試してみてください。
Webサーバのログの簡易解析について

小規模のwebサーバのログの解析方法として、簡単な方法がありましたので、メモを起こしました。

# 前提 #

* OS
    Ubuntu

* webサーバ
    apache

# asqlについて #

[asql](http://www.steve.org.uk/Software/asql/)は、apacheのログファイルに対して、SQL文での検索を可能とするCUI形式のツールです。

[asql](http://www.steve.org.uk/Software/asql/)は、[perl](https://www.perl.org/)の[DBIモジュール](http://search.cpan.org/~timb/DBI-1.634/DBI.pm)を利用して実装されていて、実行時に一時的な[sqlite](https://www.sqlite.org/index.html)のDBファイルを作成することで、SQL文での検索を可能としています。

## asqlのインストール ##

Ubuntuでは、以下の方法でインストールすることができます。

`$ sudo apt-get install asql`

## asqlの実行方法 ##

### 実行モード ###

[asql](http://www.steve.org.uk/Software/asql/)の実行形式として、インターラクティブ・モードとバッチ・モードがあります。そして、それぞれの実行モードで、以下の節に示したコマンドを実行します。

モードの棲み分けは、以下になると考えます。

| モード           	 | 使用シーン                                          |
|:-------------------|:----------------------------------------------------|
| インターラクティブ | 複数のSQL文の実行や、一時的なDBを保存したい場合など。 |
| バッチ             | SQLの単文実行                                       |


**インターラクティブ・モードの例**
![asql_interactive.png](https://qiita-image-store.s3.amazonaws.com/0/59920/834b97ca-8fff-0ad8-6ab5-3640ef783adf.png)


**バッチ・モードの例**

![asql_batch.png](https://qiita-image-store.s3.amazonaws.com/0/59920/211278ca-1de4-0eca-69fd-11fa7864ad6d.png)


### コマンド ###

[asql](http://www.steve.org.uk/Software/asql/)で実行可能なコマンドは、SQL文とそれ以外に分類することができます。

#### SQL文 ####

SQL文の詳細は、[SQLiteで認識するSQL](https://www.sqlite.org/lang.html)を参照してください。

| コマンド |説明				|
|:---------|:-------------------|
|   alter  | ALTER queryを実行	|
|  create  | CREATE queryを実行	|
|  delete  | DELETE queryを実行	|
|    drop  | DROP queryを実行	|
|  insert  | INSERT queryを実行	|
|  select  | SELECT queryを実行	|
|  update  | UPDATE queryを実行	|


#### その他 ####

| コマンド |説明   	   	   	   	 																																								   	|
|:---------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|   alias  | bashのaliasコマンドと同じように、コマンドのショートカットを作成します。作成したaliasコマンドは、作成時のセッションだけでなく、次回以降も有効となります。								|
|    exit  | インターラクィブ・モードを終了します。																																					|
|    help  | ヘルプ情報を表示します。																																								|
|    load  | 引数に指定したapacheのログファイルをロードして、一時的なDBを作成します。引数の指定には、shellのパス名展開を使用することができ、かつ、.gz、.bz2の圧縮ファイルを指定することができます。 |
|    quit  | インターラクィブ・モードを終了します。																																					|
| restore  | 前のセッションで保存したDBを読み込みます。引数にsaveコマンド時に指定したファイル名を指定することで、任意のファイルをリストアすることができます。										|
|    save  | 一時的なDBを、別のセッションでも使用できるように保存します。引数にファイル名を指定することで、任意のファイルに保存することができます。													|
|    show  | DBのテーブル名と、そのスキーマを表示します。
python開発環境 -pyenvとvirtualenvの利用- 

#python開発環境構築について
## 概要
- 複数バージョンのpythonを開発環境ごとの独立な管理を可能にする

## 各ツールの説明
### pyenv
- 複数バージョンのPython環境を用途に応じてバージョンを切り替えるためのツール

### pyenv-virtualenv
- pyenvではできない，同一バージョン同士で環境の切り替えを可能にするpyenvプラグイン

## 前提
- OSXでzshを利用
- homebrewを利用

## 導入方法
### pyenv
- githubからclone

`git clone git://github.com/yyuu/pyenv.git ~/.pyenv`
- ./zshrcに追加

`echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc`
`echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc`
`echo 'eval "$(pyenv init -)"' >> ~/.zshrc`

### pyenv-virtualenv
- homebrewからvirtualenvインストール

`brew install pyenv-virtualenv`

## 利用方法
- インストール可能なバージョン確認

`pyenv install -l`

- インストール(下記はpython2.7.10の場合)

`pyenv install 2.7.10`

- インストール後にrehashする必要あり

`pyenv rehash`

- 利用可能なバージョンの確認(*マークが利用中の環境) 

`pyenv versions`

- virtualenvを使って同一バージョンのpythonで別名の環境を用意(下記は2.7.10_sandを作成)

`pyenv virtualenv 2.7.10 2.7.10_sand`

- ディレクトリごとに環境を設定(下記は2.7.10_sandに設定)

`pyenv local 2.7.10_sand`
[Unity] ビルド中、Building Resources folderでUnity Editorがフリーズする


## 概要

ビルド中、"Building Resources folder"でUnity Editorがフリーズする現象にはまったので、解決方法をメモ。

![スクリーンショット 2015-12-03 22.29.57.png](https://qiita-image-store.s3.amazonaws.com/0/58251/178cbb15-85ae-7155-602f-754c4a38d59f.png "スクリーンショット 2015-12-03 22.29.57.png")
↑ここでUnity Editorがフリーズしてしまう。。

こちらの情報を参考にしました。
[Building my Game \[Unity editor has stopped working\]](http://forum.unity3d.com/threads/building-my-game-unity-editor-has-stopped-working.359783/)


## 原因と解決方法

原因になるものは様々あるようではっきりしていませんが、次のいずれかです。


### 1. Texture TypeにSprite (2D and UI)を使っている
![スクリーンショット 2015-12-03 22.27.32.png](https://qiita-image-store.s3.amazonaws.com/0/58251/640ed1de-1dae-1479-9b8f-60a4b5bbc248.png "スクリーンショット 2015-12-03 22.27.32.png")


他のTexture Typeを使いましょう。
自分の場合はこれで解決しました。



### 2. Standerd Asset の Water を使っている

Standard AssetのEnvironmentに大変出来がいい水面がありますが、
これを使っていると現象が発生することがあるようです。
ゲームオブジェクトと、Asset>Environment>Water フォルダーを削除しましょう。

ただ自分の場合は、これでは解決しませんでした。
ruby on railsの導入


windowsでの環境構築の際に色々とサイトを覗かないと完了に至らなかったので自分なりにまとめてみました
あくまで導入のみの手順になります
コードジェネレーターというものがあるのですが非常に便利なものとなりますのでqiita、はてな等で検索すれば先人の方々の記事等が見つかるかと思われます
Qiitaでの初めての投稿となりますので、間違い等ございましたらコメント等でご指摘の方宜しくお願いします

##Windowsでの環境構築
環境
OS：windows７(32bit、64bit)
参照URL：http://www.oiax.jp/rails/zakkan/rails_4_2_installation_on_windows.html
　
####１.まず最初にRubyinstallersをダウンロードする
URL：http://rubyinstaller.org/downloads/
ruby 2.2.3 (最新 2015/12 現在)をダウンロード
ダウンロードするものは、OSの環境に合わせてダウンロードしてください
　
　
####２.rubyのinstall
ダウンロードしたexeファイルを実行し手順を踏み
「Rubyの実行ファイルへ環境変数PATHを設定する」にチェックを入れてください。
参照画像
![オプション選択.jpg](https://qiita-image-store.s3.amazonaws.com/0/56087/10f7b0e6-54cc-3642-9b03-5d518d647c61.jpeg)
　
　
####３.rubyとgemのバージョン確認、gemのupdateとbundlerのinstall
コマンドプロントを立ち上げ、以下のコマンドを入力してください
```ruby -v
gem -v```
を入力してinstallの確認を行ってください
確認後にgemを最新のバージョンにし
gemのupdate後にgemのパッケージの管理を行うbundlerをinstallしてください
```gem update --system
gem install bundler```
　
　
#####3−1.proxy設定が行われている場合
gemのinstallでエラーが起きる
その際proxyの設定を変更してもいいがinstallのみ変更がしたい場合は以下コマンドを実行する
```set http_proxy=http://○○○：ポート番号
set https_proxy=https://○○○：ポート番号```
上記のコマンド実行後は問題なくgemのinstallが行われる
　
　
####４.devkitのダウンロード
URL： https://bintray.com/oneclick/rubyinstaller/DevKit/view
で自分のOS環境に合わせたものをダウンロードする
ダウンロード後に解凍しrubyをinstallした箇所と同じ階層に展開する(ファイル名は任意でいい)
コマンドプロントで
解凍したフォルダに移動し以下のコマンドを実行
```ruby dk.rb init
ruby dk.rb install```
　
　
####５.railsのinstall
以下のコマンドを実行
```gem install rails
rails -v```
でバージョン確認
　
　
####６.railsのプロジェクトの生成※１
```rails new アプリ名 --skip-bundle```
で実行
※--skip-bundleをオプションで指定することによりinstallが速くなる
　
　
####７.Gemfileの編集
以下のコマンド実行後に編集
```cd アプリ名```
Gemfileの確認を行った後に任意のエディタにより編集を行う
利用するプラグイン等により Gemfileに追記記述を行う
　　
#####7-1.coffeeScriptのエラー回避に関して
Gemfileの末尾に以下を追記
```gem 'coffee-script-source', '1.8.0'```
　
#####7-2.bundleをプロジェクト内にinstallしcoffee-scriptのエラーの回避を行う
今回はプロジェクト直下のvendor以下にinstallする
以下コマンド実行
```bundle install --path vendor/bundle```
installが完了後に
```bundle update coffee-script-source```
以上でエラーが回避できる
　
　
8.rails サーバーを立ち上げる(※WEBrick=rubyで書かれたwebサーバー用FWです)
以下のコマンドを実行
```rails s```

ブラウザに
URL：http://localhost:3000　
入力し以下画像の画面が出力されたら完了となります
![初期画面.jpg](https://qiita-image-store.s3.amazonaws.com/0/56087/71115c3e-90c7-9afa-f371-a364f8c7e61b.jpeg)



以後は、各チュートリアル等を行えます

linux系oxでの構築は別途書かせていただきます。
WebRTCをiOSアプリで扱う際のIPv6対応について


※HTML5 Advent Calendar 2015への投稿ですが全然htmlネタじゃないです
※まだ調査中の部分があるので、後で追記します

#目的

iOSアプリのIPv6対応
iOSネイティブWebRTCアプリでAppRTCDemoを使ってる場合にSTUNだとP2Pのコネクションが通らないので調査

#前提：iOSアプリにおけるIPv6対応について

参考：下記
http://qiita.com/shao1555/items/4433803419dfc72bf80b
2016年初頭にアプリをIPv6に対応しないとApple審査に通らなくなるとのこと

#調査内容

上記の記事にあるように、El Capitan‎のMacでIPv6 only Networkを構築
システム環境設定→共有をoptionクリック→create nat64 networkにチェックを入れてインターネット共有スタート
立ち上げたEl CapitanをwifiポイントにしてiOS9端末でアクセス
→テストしたいアプリ起動して動作に問題がなければ審査通る

#調査内容 For WebRTC

自分の作ってるアプリでは現状STUNのみでP2P通信を実現してる(サーバーリソース使いたくない)
iOSのWebViewだとWebRTC対応してないので、AppRTCDemoを組み込んだ自分のサンプルをiOS端末で動かす
→P2P通信が失敗する！
※最新のライブラリバージョンじゃなかったので後日最新バージョンでも試してみます

iOSのAppRTCDemoは下記とか使ってやってます
https://github.com/pristineio/webrtc-build-scripts

#Apple審査におけるNAT64/DNS64の環境について

なぜIPv6 Only NetworkでP2Pが繋がらないのか、結局まだ原因は分かっていないのですが(できたら後日追記します)そもそもIPv6対応ってなんなのか？というところを調べていたので内容を書いていきます

##IPv6 Only Networkとは
[Apple公式](https://developer.apple.com/library/prerelease/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/UnderstandingandPreparingfortheIPv6Transition/UnderstandingandPreparingfortheIPv6Transition.html)
**DNS64/NAT64**に対応したネットワーク環境のことです。
DNS64/NAT64は上記公式ページの図Figure 10-3にあるように、IPv6のDNSリクエストクエリ(example.apple.com)を発行した際、下記のような動作をするようです

→example.apple.comのIPv6アドレス(AAAAレコード)が存在するかチェック
→存在すればIPv6アドレス(AAAAレコード)を返す
→存在しなければexample.apple.comのIPv4アドレス(Aレコード)が存在するかチェック
→存在すればIPv4アドレス(Aレコード)をIPv6アドレス(AAAAレコード)に変換したものを返す

##IPv6 Only Networkの挙動
例えばIPv4アドレス直打ちでAFNetwork越しにHTTPリクエスト叩いたら普通にレスポンス返ってきた。
IPv6アドレスしか使えないのかと思ったけど、NAT64/DNS64はドメインのDNSクエリを変換するだけなので、そこは通らなくなるわけではないようです
やはり問題になるのはinet_aton, gethostbyname等のIPv4だけでしか動かないAPIを使っている場合のみのよう

※↑、別記事でまとめました→[IPv6 only Network上での通信周り挙動について](http://qiita.com/natsuki_summer/items/d5d225e0d00b70a95968)

##WebRTCxSTUNxIPv6 only networkで動かない原因
結論：ビルドしたライブラリ内部のSTUNクライアントあたりがうまくいってない

シグナリングはつつがなく行われてるように見えるんだけど、IPv6 only networkにつないでる端末からだけSTUNサーバー(rfc5766-turn-server)にログが流れてこなかった。

IPv6 only networkだとSTUNが通らない？っていうのを確かめる為、
下記のクライアント入れてSTUNが効かないのか試してみた
https://github.com/soulfly/STUN-iOS

IPv4のままだけど、STUN Port: xx.xx.xx.xxって返ってきた
→STUNのポート取得はIPv6 only networkでも問題ない
→STUNサーバーへのリクエスト部分で、使っちゃいけない関数使われてる？
ていうのが調査結果でした。

該当のコード箇所はAppRTCDemoでも使われてるライブラリのメソッド呼んでるだけで、

```objc
RTCICEServer *ICEServer = [[RTCICEServer alloc] initWithURI:[NSURL URLWithString:urlString]
                                                       username:@"hoge"
                                                       password:@"huga"];
RTCPeerConnection *peerConnection = [self.peerConnectionFactory peerConnectionWithICEServers:servers
                                                                                 constraints:mediaConstraints
                                                                                    delegate:self];
```

こんな感じでpeerConnection作ってcreateOfferとかすると通常はSTUNサーバーにアクセスが来る。ここから先は今の自分にはちょっと解析しきれないので…調査はここでストップしてます。

以上
SwiftでReduxを実装してみた

# ReduxをSwiftで使ってみたい
もしもSwiftの静的型付けの世界で[Redux](http://redux.js.org/)のコンセプトを実装したら、どうなるか見てみたくなって、作ってみました。本家の方は非常に充実した実装をしていますが、こちらはコアとなる部分だけを実装した超簡易的なものになってます。

# なんでRabbitっていう名称なの？
小説[「帰ってきたウサギ（原題：Rabbit Redux）」](https://en.wikipedia.org/wiki/Rabbit_Redux)から取ってきました。ウサギって素早いし「Swfit」という単語のイメージに合うなと思いまして。

# 使い方
Rabbit.swiftを自分のプロジェクトに含めるだけでOKです。
基本的にはReduxで必要となる、State, Action, Reducerをstructで定義して、RBStoreをsubscribeしてStateの変更を補足するという流れです。これによって、「Stateの変更」→「ビューの変更」という1方向に限定した構造を実現できます。詳細はgithubにあげた[README](https://github.com/maloninc/rabbit)を御覧ください。


```swift
//
// Stateの定義
//
struct AppState: RBState {
    var todos: [Todo]
    var filter: TodoFilter

    ...
}

struct Todo {
    var id: Int
    var title: String
    var completed: Bool

    ...
}

//
// Actionの定義
//
enum TodoFilter: String {
    case All          = "ALL"
    case Completed    = "COMPLETED"
    case NotCompleted = "NOT_COMPLETED"
}

struct AddTodo: RBAction {
    let title: String
}

struct ToggleTodo: RBAction {
    let id: Int
}

struct SetFilter: RBAction {
    let filter: TodoFilter
}

//
// Reducerの定義
//
func filter(filter: TodoFilter, action: RBAction) -> TodoFilter {
    switch action {
    case let action as SetFilter:
        return action.filter
        
    default:
        break
    }
    return filter
}

func todos(var todos: [Todo], action: RBAction) -> [Todo] {
    switch action {
    case let action as AddTodo:
        todos.append(Todo(title: action.title))
        
    case let action as ToggleTodo:
        todos[action.id].completed = !todos[action.id].completed
        
    default:
        break
    }
    return todos
}

func todoApp(state: AppState, action: RBAction) -> AppState {
    let appState = state
    return AppState(
        todos:  todos(appState.todos, action: action),
        filter: filter(appState.filter, action: action)
    )
}

//
// RBStoreをsubscribe
//
let state = AppState(todos: [], filter: .All))
store = RBStore<AppState>(reducer: todoApp, initState: state)

store.subscribe({action in
    let currentState = store.getState()
    //update view
})

```


# ReduxにはあるけどRabbitで実装していないもの
- combineReducers
- middleware
- redux-react

# Swiftらしさ
## 静的型付け
Javascriptと違って型が利用できるので、Actionの区別は as? 演算子を使ってます。

## 値渡し
ReduxではImmutable stateという概念で、アプリの状態を表すオブジェクトをReducerで変更せずに新たに作成するという設計方針があります。これを実現するため、Javascriptでは毎回オブジェクトの再生成をしていますが、Swiftでは構造体、配列、辞書は値渡しで取り扱われるという特性を利用しました。
値渡しについては、[AppleのWWDCのビデオ](https://developer.apple.com/videos/play/wwdc2015-414/)が参考になりますね。
[Swift]UINavigationControllerの戻る[back]処理のイベントを取得する方法

## 最初に
この記事は、**Swift**で**UINavigationControllerの戻る処理のイベントを取得する方法**する方法を記載した記事です。
記載時(2015/12/06)のバージョンは下記の通りです。
### 環境
|対象  |バージョン  |
|---|---|
|Swift|2.1|
|XCode|7.1.1|

## 方法
viewWillDisappearに戻る時のイベントを判定します。

### viewWillDisappearとは？
UIViewControllerのライフサイクルのうちの一つで、
**View が他のView (画面から消える) 直前に呼び出されるメソッド**です

### ソースコード
```swift
override func viewWillDisappear(animated: Bool) {
    if let viewControllers = self.navigationController?.viewControllers {
        var existsSelfInViewControllers = true
        for viewController in viewControllers {
            // viewWillDisappearが呼ばれる時に、
            // 戻る処理を行っていれば、NavigationControllerのviewControllersの中にselfは存在していない
            if viewController == self {
                existsSelfInViewControllers = false
                // selfが存在した時点で処理を終える
                break
            }
        }
        
        if existsSelfInViewControllers {
            print("前の画面に戻る処理が行われました")
        }
    }
    super.viewWillDisappear(animated)
}
```
これで戻る処理が取得できると思います('`)b
Update SR-IOV Driver centos7 on EC2

# AMI
Use Marketplace Centos7

# Use old (built-in) SR-IOV

via login & shell

```bash:
sudo sed -i '/^GRUB\_CMDLINE\_LINUX/s/\"$/\ net\.ifnames\=0\"/' /etc/default/grub

sudo grub2-mkconfig -o /boot/grub2/grub.cfg

```

via aws cli

```bash:
$ aws ec2 modify-instance-attribute --instance-id <instance_id> --sriov-net-support simple
```

# Build & install new driver

1st, you should modify `/boot/grub2/brub.cfg`. Apply same proc the above. 

download & make & make install

`depmod` is included `make install`

Update initramfs.

```bash:
/sbin/dracut -f /boot/initramfs-`uname -r`.img `uname -r`
```

confirm

```bash:
> ethtool -i eth0
driver: ixgbevf
version: 2.16.4
firmware-version: N/A
bus-info: 0000:00:03.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
```
GithubのSSH通信設定

GithubでSSHキー登録とうまくいかなかった時の対処メモです.
## SSH登録の設定
### キーの作成
まずクライアント（Mac）に公開鍵と秘密鍵を作成します

```
$ cd ~/.ssh/
$ ssh-keygen -t rsa -C "メールアドレス"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): github_id_rsa
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in github_id_rsa.
Your public key has been saved in github_id_rsa.pub.
~以下略~
 ```
鍵を確認します.
github_id_rsa（秘密鍵）とgithub_id_rsa.pub（公開鍵）のファイルが確認できれば成功です.
github_id_rsa.pub をGitHubへ登録します.
### クライアント側（Mac）へのSSHキーの設定
公開鍵をGitHubに登録します.
以下のコマンドで、公開鍵をクリップボードにコピーにします.

```
$ pbcopy < ~/.ssh/github_id_rsa.pub
```
画面右上にある[Add SSH Key]をクリックします.
![git_ssh_set.png](https://qiita-image-store.s3.amazonaws.com/0/57131/daf21900-0052-c08b-b912-02eae1894514.png "git_ssh_set.png")


[Title] の項目に公開鍵の名前（任意の名前）と[Key]の項目に先ほどコピーした公開鍵の内容を貼付けます.
最後に[Add Key]をクリックしましょう.
![git_add_ssh.png](https://qiita-image-store.s3.amazonaws.com/0/57131/91d0aa4c-5b5c-43df-2046-bd937e87dc90.png "git_add_ssh.png")


### sshコマンドのオプションを省略する設定
以下の設定で`ssh -l git -i ~/.ssh/github_id_rsa github.com `を省略します.

```
$ vi ~/.ssh/config

Host github.com
 HostName      github.com
 IdentityFile  ~/.ssh/github_id_rsa
 User          git
```

### SSHの接続テスト
ターミナルのsshコマンドで接続確認を行います.

```
$ ssh -T git@github.com
```
これが出れば成功です.

```
Hi {account-name}! You've successfully authenticated,
but GitHub does not provide shell access.
```

## うまくいかなかった場合
以下のメッセージが出てしまいました.

```
Warning: Permanently added the RSA host key for IP address '204.232.175.90' to the list of known hosts.
Permission denied (publickey).
```
### 対処1. 
.sshの中にknown_hostsが自動的に作成されていますが、「github.com, ~」から始まる一行を削除します。「known_hosts」とは、SSH公開鍵のキャッシュで、初めての通信を行う際に追記登録されます.

```
$ vi ~/.ssh/known_hosts
```
```
~~~~ ファイルの中身 ~~~~
github.com,204.232.175.90 ssh-rsa AAA... 

```

### 対処2. 
` ssh-add -l`して確認して、秘密鍵のパスが出てこなければssh秘密鍵を登録しましょう.

```
eval `ssh-agent`
$ ssh-add github_id_rsa(秘密鍵名)
```

### 接続テスト
再度、sshコマンドで接続確認を行います.

```
$ ssh git@github.com
```

これが出れば成功です.

```
Hi {account-name}! You've successfully authenticated, 
but GitHub does not provide shell access.
```

### エラーの場合
これでエラーの場合は

```
$ ssh -vT git@github.com
```
で出てきたエラーコードをGoogle先生に聞いてみてください.
## 参考
Githubのドキュメントを参考にしてみましょう.
- [GitHub Help](https://help.github.com/articles/generating-ssh-keys)
【IOS】cocoapod初心者のメモ

#**cocoapodsを更新する**

##1.brewを更新する
brew update

エラーの場合
brew doctor
http://hack.aipo.com/archives/14377/

##2. gemを更新する

gem update
gem upgrade


##3. cocoapodを更新する
sudo gem install cocoapods
pod update

#**cocoapodsの新規作成**

ターミナルでプロジェクトのあるフォルダに入る
##1. pod init
podファイルができる
##2. pod search hogehoge（gemの名前）
左のようにコピー（pod 'konashi-ios-sdk', '~> 3.1.0'）
プロジェクトにinitで出来上がったpodfileの1個目のtargetに貼り付ける
cat Podfile　保存できてることを確認
##3. pod install
.xcworkspaceファイルができたら成功


#**使用例**

#Kiwi
テストフレームワーク

#AFNetworking
ネットワークアクセス



#BButton
カスタムUI
#Appirater
レビューアラート
#LKBadgeView
バッチ描画
#VTAcknowledgementsViewController
使用されているライセンス一覧を自動生成
#SMPageControl
カスタムpage control
#FontAwesomeKit
アイコンを簡単に実装
#EAIntroView、WSCoachMarksView、TWSReleaseNotesView、RMStepsController
初期起動画面の実装
http://dev.classmethod.jp/smartphone/iphone/sp10-ios-introduce-introduction-library/
#CMPopTipView
チップスを実装
#UIImage-Resize
画像サイズ変更
#UAModalPanel
モーダルパネル表示

https://github.com/mattt/FormatterKit
https://github.com/lyokato/FBGlowLabel
https://github.com/danielamitay/DAAppsViewController
https://github.com/rizumita/CTFeedback
https://github.com/Grouper/FlatUIKit

cocoaControls
https://www.cocoacontrols.com/

IOS sample
https://github.com/msyk/iOS_Samples/tree/master/iOS8_Adv_Training
RubyでWin32oleを使ったExcelサンプルプログラム

別に目新しいものは何もないが、自分用のRubyでExcelを使うために作業メモで、Windows環境でのwin32oleを使ったExcelアクセスサンプルプログラム。
ちなみにQiitaへの初めての投稿です。

#参考にさせて頂いたURL
- [RubyからExcelを操作する方法について | Futurismo](http://futurismo.biz/archives/2330;)
- [Rubyist Magazine - Win32OLE 活用法 【第 2 回】 Excel](http://magazine.rubyist.net/?0004-Win32OLE;)
- [win32ole で Excel を使う(4) ](http://d.hatena.ne.jp/maluboh/20070709#p1)
- [Ruby から Excel を操作する方法](http://tipszone.jp/20130614_ruby-excel/)
    - 九九のサンプルはこちらを参考にさせて頂いています

#サンプルプログラム
```ruby:excel_test.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
STDOUT.sync = true

require 'win32ole'

# Excel VBA定数のロード
module Excel; end

def init_excel()
  # Excelオブジェクト生成
  excel = WIN32OLE.new('Excel.Application')
  excel.visible = true
  # 上書きメッセージを抑制
  excel.displayAlerts = false

  WIN32OLE.const_load(excel, Excel)

  return excel
end

def create_excel(excel, file)
  # 新規ブックを作成
  workbook = excel.workbooks.add

  # 先頭シートを選択
  sheet = workbook.sheets[1]

  # 九九の表を作成
  (1..9).each do |i|
    sheet.rows[1].columns[i + 1] = i
    sheet.rows[i + 1].columns[1] = i
  end
  sheet.range('B2:J10').value = '=$A2*B$1'

  # ボーダーライン
  sheet.range('A1:J10').borders.lineStyle = Excel::XlContinuous

  # 表のヘッダー
  range = sheet.range('A1:A10,B1:J1')
  # 背景色
  range.interior.themeColor = Excel::XlThemeColorAccent1
  # フォント
  range.font.themeColor = Excel::XlThemeColorDark1
  range.font.bold = true

  # 列の幅
  sheet.columns('A:J').columnWidth = 6

  # 保存
  workbook.saveAs(file)

  # ファイルを閉じる
  workbook.close
end

def read_excel(excel, file, sheet_num = 1)
  book = excel.Workbooks.Open(file)
  sheet = book.Worksheets(sheet_num)

  # 列ごとに処理
  sheet.UsedRange.Rows.each do |row|
    # セルごとに処理
    row.Columns.each do |cell|
      puts cell.value
    end
  end
end

def main()
  # OLE32用FileSystemObject生成
  fso = WIN32OLE.new('Scripting.FileSystemObject')
  file = fso.GetAbsolutePathName('./sample.xlsx')

  excel = init_excel()

  create_excel(excel, file)
  read_excel(excel, file)

  excel.quit()
end

main()
```
GoogleがCarrierWaveでアップロードした画像を最適化しろというのでGemを作ったった

Viibar社員ではない何かですがViibarアドベントカレンダーに参加している @nifuramu です。よろよろ〜〜


[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)を使ってwebページの計測をしていたら、画像の最適化をした方がイイよ！って言われたので最適化をしたいと思い、ちょろっと適当に調べました。

今回は個人的に[CarrierWave](https://github.com/carrierwaveuploader/carrierwave)を利用しているのでCarrierWaveでいい感じに画像最適化してくれる方法を探します。

## CarrierWaveで画像最適化をしてくれるGemたち

* [carrierwave-imageoptimizer](https://github.com/jtescher/carrierwave-imageoptimizer)


[image_optimizer](https://github.com/jtescher/image_optimizer)を使用して画像最適化をしてくれるGem
しかしimage_optimizerの更新がアクティブではないし人気もなさそう。

* [piet](https://github.com/albertbellonch/piet)

optipng, jpegoptimとあとpngquantにも対応している模様。
Piet::CarrierWaveExtensionというCarrierWave用のモジュールが用意されている。

## 画像最適化だけを行うGem

* [image_optim](https://github.com/toy/image_optim)

下記の画像最適化に対応したGem

* [advpng](http://advancemame.sourceforge.net/doc-advpng.html) from [AdvanceCOMP](http://advancemame.sourceforge.net/comp-readme.html)
(will use [zopfli](https://code.google.com/p/zopfli/) on default/maximum level 4)
* [gifsicle](http://www.lcdf.org/gifsicle/)
* [jhead](http://www.sentex.net/~mwandel/jhead/)
* [jpegoptim](http://www.kokkonen.net/tjko/projects.html)
* [jpeg-recompress](https://github.com/danielgtaylor/jpeg-archive#jpeg-recompress)
* jpegtran from [Independent JPEG Group's JPEG library](http://www.ijg.org/)
* [optipng](http://optipng.sourceforge.net/)
* [pngcrush](http://pmt.sourceforge.net/pngcrush/)
* [pngout](http://www.advsys.net/ken/util/pngout.htm)
* [pngquant](http://pngquant.org/)
* [svgo](https://github.com/svg/svgo)

[ImageOptim.app](https://imageoptim.com/)を参考に開発してるらしい。
開発も活発でなんだかよさそ〜〜〜

## よし！image_optimを使ってCarrerWaveのプラグインを作るぞ！！１

てか、作ったぞ！
https://github.com/nifuramu/carrierwave-imageoptim

### インストール方法〜〜〜

#### 必要なコマンドのインストール

まずはimage_optimで画像最適化をするには色々とコマンドを入れないといけないのでインストールします。

今回はgifsicleとjpegoptimとoptipngを入れます。

```
brew install gifsicle jpegoptim optipng
```

上記以外のコマンドも対応したい場合はimage_optimのREADMEを読んでインストールしましょう。
https://github.com/toy/image_optim/blob/master/README.markdown#binaries-installation

#### CarrierWave::ImageOptimのインストール
Gemfileに以下を追加して

```ruby
gem 'carrierwave-imageoptim'
```

bundleを実行！

```
$ bundle install
```

またはgemコマンドでインストール〜

```
$ gem install carrierwave-image_optim
```


### 使い方〜〜〜
まずはモジュールをincludeします

```ruby
class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::ImageOptim
  
  ...
end

```

すべてのアップロード画像にjpegoptim, optipng, gissicleを適用したい場合

```ruby
class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::ImageOptim
  
  ...
  
  process optimize: [{
    jpegoptim: true,
    optipng: true,
    gifsicle: true
  }]
end
```

特定のversionにのみjpegoptim適用したい場合

```ruby
class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::ImageOptim
  
  ...
  
  version :thumbnail do
    process optimize: [{
      jpegoptim: true
    }]
  end
end
```

### TODO
* エラーハンドリングしてない
* テスト適当


以上でございます！

なお、ViibarではCarrierWaveを使用してない模様！！！
いままで使うことがなかったデザイン関数


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の6日目

# いままで使うことがなかったデザイン関数
いままで使うことがなかったデザイン関数ですが、今年はお世話になることがありました

## デザイン関数
[ホーム > リファレンス > 関数リファレンス > デザイン関数](http://www.filemaker.com/help/12/fmp/jp/html/func_ref1.31.31.html#984112)

> デザイン関数は、開いているデータベースファイルの構造に関する情報を返します。たとえば、開いているデータベースのすべてのレイアウトやフィールドの名前を判断することができます。

### FieldNames関数
>目的 
<ファイル名> ファイルの <レイアウト名> 上にあるすべてのフィールドの名前を、改行で区切って返します。
構文 
FieldNames ( ファイル名 ; レイアウト名 )

### FieldRepetitions関数
>目的 
<レイアウト名> 上にある繰り返しフィールド（フィールド名）の繰り返し数（フィールドを定義したときに指定した繰り返し数と異なる場合があります）と、レイアウト上のフィールドの繰り返しの方向（縦または横）を返します。
構文 
FieldRepetitions ( ファイル名 ; レイアウト名 ; フィールド名 )
引数 
ファイル名 - 開いているデータベースファイルの名前（ローカルまたはリモート）
レイアウト名 - 指定したデータベースファイルのレイアウトの名前
フィールド名 - 指定したレイアウト上のフィールドの名前

## どんなときに使ったか？
繰り返しフィールドが大好きなので

- FieldNames関数
- FieldRepetitions関数

### FieldNames関数
例えばこんなレイアウトで
![151206-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/05e2d7bc-fed4-4807-14ea-f08f2e7c1360.png)
FieldNames関数で現在のレイアウトにあるフィールドを取得してくる
引数は

- ファイル名→Get (ファイル名 )
- レイアウト名→Get ( レイアウト名 )

で取れるので

```
フィールド設定[dummy::ScriptResult; FieldNames ( Get (ファイル名 ) ; Get ( レイアウト名 ) )]
```

とすると
>datagrid
datagrid[11]
datagrid[21]
ScriptResult

みたいに改行区切りのリストで返ってくる

返ってきたフィールドをFieldRepetitions関数に突っ込む
引数は

- ファイル名→Get (ファイル名 )
- レイアウト名→Get ( レイアウト名 )
- フィールド名→GetValue ( dummy::ScriptResult ; 1 ))
※値番号は適宜

で取れるので

```
フィールド設定[dummy::ScriptResult; FieldRepetitions ( Get (ファイル名 ) ; Get ( レイアウト名 ) ; GetValue ( dummy::ScriptResult ; 1 ))]
```

とすると
>10 vertical
>※GetValue ( dummy::ScriptResult ; 1 ))はdatagridのこと

となりはdatagridフィールドは

- 垂直方向
- 繰り返し数は10

の繰り返しフィールドだとわかる

ちなみに
![151206-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/4949e285-84b9-458e-cf6b-c8193fc53982.png)
みたいなのは
FieldNames関数で
>ScriptResult
dummy
dummy[2]
dummy[4]
dummy[3]

FieldRepetitions関数で
>1 vertical
>※dummy[2]フィールドを指定したとき

みたいに返ってくる

あと繰り返しフィールドでないフィールドを指定した時にFieldRepetitions関数は
>1 vertical

を返す
全文検索エンジンGroongaを使ったEmbulk導入事例


この記事はembulk advent calendarの6日目の記事です。

Qiitaでembulkのまとめを作っている佐藤(@hiroysato)です。

毎年11月29日のいいにくの日にに開催される全文検索エンジンGroongaの勉強会にて、全文検索エンジンGroongaにデータを投入するembulk-output-groongaの紹介をしてきました。

[Groonga導入事例](http://slide.rabbit-shocker.org/authors/hiroyuki-sato/groonga-meatup-2015/)

![Groonga.png](https://qiita-image-store.s3.amazonaws.com/0/61464/ce191f25-6dea-4263-90dc-b7bbb636ae09.png)


## Groongaについて

[Groonga](http://groonga.org/ja/)は国産の全文検索エンジンです。全文検索機能を単体で使うだけではなく、MySQL([Mroonga](http://mroonga.org/ja/))やPostgreSQL([PGroonga](http://pgroonga.github.io/ja/))に全文検索の機能を提供することができます。さらにPGroongaはJSONで格納したデータ内のすべてのテキスト値に関しても全文検索機能をサポートしています。

国産の全文検索エンジンだけあって、日本語特有の全角文字と半角文字の正規化などの機能もGroongaに組み込まれています。特別なプラグインは必要がありません。

速度もelasticsearchと比較をしても遜色ないようです。(検索に関してはGroongaの方が速いようです。)
[国産の全文検索エンジンGroonga vs 世界的流行のElasticsearch](http://blog.createfield.com/entry/2014/04/21/120023)

また開発も積極的に行われており、不具合や不明な点を報告するとすぐに対応をしてくれるのも魅力です。

## embulk-output-groonga

勉強会で紹介したプラグインは、[embulk-output-groonga](https://github.com/hiroyuki-sato/embulk-output-groonga)で、全文検索エンジンGroongaへデータを登録するoutputプラグインです。

まだあまり、機能がなくgemにはしておりませんが、Groongaにデータを投入する際に利用をしています。

設定もものすごく簡単です。

```yaml
out:
  type: groonga
  table: Data # 投入先のテーブル名
  host: localhost
  protocol: http
  key_column: title # キーにするカラム
```

~~使いたいという方がいらっしゃれば是非おしらせください。~~ 
2015/12/6 更新: gemにしましたのでご利用いただき、ご要望があれば是非お知らせください。

## メールをパースするパーサープラグイン

この時の発表では触れませんでしたが、自作したプラグインはもう一つあります。
電子メールのデータを取り込むパーサープラグインです。

稼働しているサービスに必要なデータが電子メールで提供されるため、定期的にデータを取得してデータベースに登録する仕組みが必要でした。

そこで、fetchmailやprocmailを使ってメールデータをMaildir形式のディレクトリに保存した後、embulkを使ってデータを読み込むようにしました。

Maildirに保存されたデータは、1ファイル1メールデータになります。このデータを読み込み電子メールの中から必要な情報を抜き取って、データ化するパーサプラグインを作成しました。

パーサープラグインRubyで作成しました。Rubyには電子メールをパースするプラグインMailが提供されているため、自分で書くコードはほとんどありませでした。

こちらは業務に特化してるのでソースは非公開ですが、イメージ的には次のようなものです

```ruby
def run(file_input)
  while file = file_input.next_file
    mail = Mail.new(file.read)
    # メールのソースを解析
    page_builder.add(record)
  end
  page_builder.finish
end
```

## cronでの定期実行

新着メールの読み込みは、cronを定期実行して運用しています。

Maildirの[仕様](http://cr.yp.to/proto/maildir.html)では、保存する各メールデータには、メールの受信時刻が使われます。

embulkを実行し最後に読み取ったメールはどのメールであったかを記録することができます。

次回embulkを実行する際は、前回読み取ったメールは再度読み込みを行わずに、新しく届いたメールだけを読み取ることが可能です。

```
embulk run config.yml -o config.yml
```

## 最後に

小規模サイトでのembulk利用例でした。Google BigQueryや、Amazon Redshiftなどは使わなくてもembulkを有効活用できる一例です。

末筆ですが、Embulkがリリースされた直後から、[Fluentdのバッチ版Embulk(エンバルク)のまとめ](http://qiita.com/hiroysato/items/397f36c4838a0a93e352) というのを作成しています。ここ1年のembulkに関する記事の9割ぐらいはこちらから参照できると思います。これからembulkを始められる方は是非ご参考になさってください。
RxSwift で UIKit を扱う基本

[RxSwift](https://github.com/ReactiveX/RxSwift) では、iOS や OS X の UI と連携する機能も用意されています。

どういったものがあるかは、[API](https://github.com/ReactiveX/RxSwift/blob/master/Documentation/API.md) の RxCocoa extensions に記載があります。

以下、iOS で使う場合について記載します（OS X もほぼ同じ）。

## 基本パターン

```swift
let disposeBag = DisposeBag()

override func viewDidLoad() {
    super.viewDidLoad()

    hogeButton.rx.tap
        .subscribe { [unowned self] _ in
            self.hoge()
        }
        .disposed(by: disposeBag)
}
```

基本的に、`UIViewController` の `viewDidLoad` で UI アクションに対する subscribe を行うのが良いかと思います。

例えば `UIButton` には `rx.tap` が用意されています。これは、ボタンがタップされたことを通知してくれる Observable です。これを subscribe してタップ時の処理を記述します。

なお、RxSwift では `DisposeBag` というものが用意されています。`.disposed(by: disposeBag)` としておくことで、dispose（unsubscribe）を自動的に行ってくれる仕組みになっています。

## NSNotification

Cocoa の通知の仕組みのひとつ `NSNotification` は、add した処理の remove が面倒で忘れがちです。

```swift
NotificationCenter.default.rx.notification(NSNotification.Name.UIApplicationDidBecomeActive)
    .subscribe { [unowned self] _ in
        self.hoge()
    }
    .disposed(by: disposeBag)
```

RxSwift ではとてもシンプルに書けて幸せですね。

## URLSession

通信処理の Observable も用意されています。

```swift
let session: URLSession = ...
let request = URLRequest(...)

session.rx.response(request)
    .catchError {
        ...
    }
    .subscribe { (data, response) in
        ...
    }
    .disposed(by: disposeBag)
```

とはいえ、通信部分は外部ライブラリを使うことが多いように思います。

僕はよく [APIKit](https://github.com/ishkawa/APIKit) を使います。APIKit を RxSwift で扱えるように Observable を実装して使っています。これについては、以前 [関西モバイルアプリ研究会](http://kanmoba.connpass.com) で発表しました（参考 : [RxSwift x APIKit](http://www.slideshare.net/kosukeusami/rxswift-x-apikit) ）。

以下のように使えます。

```swift
let request = ...
AppAPI.responseFrom(request)
    .catchError {
        ...
    }
    .subscribe {
        ...
    }
    .disposed(by: disposeBag)
```

API の実装コードは以下のような感じです。

```swift
static func responseFrom<T: AppAPIRequest>(request: T) -> Observable<T.Response> {
    return create { (observer: AnyObserver<T.Response>) -> Disposable in
        let dataTask = Session.sendRequest(request) { result in
            switch result {
            case .success(let response):
                observer.on(.next(response))
                observer.on(.completed)
            case .failure(let error):
                observer.on(.error(error))
            }
        }
        return AnonymousDisposable {
            dataTask?.cancel()
        }
    }
}
```

## まとめ

RxSwift のうち、RxCocoa 部分の基本的な使い方を整理して簡潔に書きました。
北の国からモールス（アルファベット版）

なんと[前回の記事](http://qiita.com/kohske/items/05e87fcc6a76e4c71428)に[コメント](http://qiita.com/kohske/items/05e87fcc6a76e4c71428#comment-66481ff634ebfc94c00d)いただいたので、作りました。

そして、[アドカレ](http://qiita.com/advent-calendar/2015/sadatech)日曜日が開いていたので登録しておきました。

```
kashi = "アアー アアアア アー
ンンー ンンンン ンーンン
ンンン ンンン ンン
アーア アアアア アーアー
アアー アアアア アー
ンンー ンンンン ンーンン
ンンン ンンン ンン
ラララララ ラー ララララー
ララララー ラララー ララ
ラララララ ラー ウウウ フフフ
ンンンンン ンンンン
ンンンン ン
アー アアアア アーアー
アアー アアアア アー
ンンー ンンンン ンーンン
ンンン ンンン ンン
アーア アアアア アーアー
アアー アアアア アー
アアー アアアア アーアア
ンンン ンンン ンン
ンンン ンンン ンン"

m_to_i_txt = "
A .-
B -...
C -.-.
D -..
E .
F ..-.
G --.
H ....
I ..
J .---
K -.-
L .-..
M --
N -.
O ---
P .--.
Q --.-
R .-.
S ...
T -
U ..-
V ...-
W .--
X -..-
Y -.--
Z --..
1 .---- 
2 ..---
3 ...--
4 ....-
5 ..... 
6 -....
7 --...
8 ---..
9 ----. 
0 -----
AA .-.-
@ @
"

m_and_i = read.table(textConnection(m_to_i_txt), as.is = TRUE)
i_to_m = m_and_i[, 1]
names(i_to_m) = m_and_i[, 2]
morse = strsplit(gsub("\n", " @ ", gsub("[ア-ン]", ".", chartr("ー", "-", kashi))), " ")[[1]]
gsub("@", " ", paste(i_to_m[morse], collapse=""))
```

```
[1] "UHA UHL SSI RHAA UHA UHL SSI 5A4 4VI 5ASS 5H HE AHAA UHA UHL SSI RHAA UHA UHL SSI SSI"
```

うーん、暗号的。

`.-.-`が`NA`なので、AAにしてます。