OmniAICreator/Qiita-1.07M huggingface dataset:
Monaca+p5.js環境で音を鳴らす

Monacaというハイブリッドアプリ開発環境でp5.jsを動かせると、手軽にProcessingのような簡単な言語で、iPhoneアプリを書けそうだということで試してみました。

https://ja.monaca.io/
http://p5js.org/

で、描画系は動いてますが、p5.soundという音の再生が動いてないっぽいので、Monacaの元々の音の再生をp5.jsと組み合わせて書いてみました。

```js
<script src="components/loader.js"></script>
<script src="p5.js"></script>
<script>

    var src1 = "test.wav";
    var media1 = null;
    
     function getPath(){
         var str = location.pathname;
         var i = str.lastIndexOf('/');
         return str.substring(0,i+1);
     }

    function onDeviceReady(){
        media1 = new Media(getPath() + src1, SoundSuccess, SoundError);
    }
    
    function SoundSuccess() {
        console.log("playAudio():Audio Success");
    }
    
    function SoundError(error) {
        alert(error.code+":"+error.message);
    }

    function setup(){
        document.addEventListener("deviceready", onDeviceReady, false);    
        createCanvas(displayWidth, displayHeight);
    }

    function mousePressed(){
        media1.play();
        rect(0,0,random(width),random(height));
    }

</script>
```

Monacaの仕様なのか、iPad/iPhoneでは音量の調整を、サウンドが再生されている間しか調整できないようなので、起動時に再生時間の長い音声ファイルを流しておくといいと思います。
ActiveRecordで多階層カテゴリ


当方、ActiveRecord(Rails)初心者ですがこんな感じかなというのをメモします。

### 準備

```
$ rails g model category name:string parent_category_id:integer
$ rake db:migrate
```

```
mysql> select * from categories;
+----+---------+--------------------+---------------------+---------------------+
| id | name    | parent_category_id | created_at          | updated_at          |
+----+---------+--------------------+---------------------+---------------------+
|  1 | metal   |               NULL | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  2 | melodic |                  1 | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  3 | black   |                  1 | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  4 | death   |                  1 | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  5 | jazz    |               NULL | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  6 | swing   |                  5 | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  7 | modern  |                  5 | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
|  8 | bebop   |                  5 | 2014-12-27 09:38:14 | 2014-12-27 09:38:14 |
+----+---------+--------------------+---------------------+---------------------+

```

### Model定義

```ruby
class Category < ActiveRecord::Base
  has_many :children, class_name: "Category", foreign_key: "parent_category_id"
  belongs_to :parent, class_name: "Category", foreign_key: "parent_category_id"
end
```

### 確認

```
$ rails console
> Category.first
=> #<Category id: 1, name: "metal", parent_category_id: nil, created_at: "2014-12-27 08:26:48", updated_at: "2014-12-27 08:26:48">

> Category.first.children
=> #<ActiveRecord::Associations::CollectionProxy [#<Category id: 2, name: "melodic", parent_category_id: 1, created_at: "2014-12-27 08:27:51", updated_at: "2014-12-27 08:27:51">, #<Category id: 3, name: "black", parent_category_id: 1, created_at: "2014-12-27 08:28:27", updated_at: "2014-12-27 08:28:27">, #<Category id: 4, name: "death", parent_category_id: 1, created_at: "2014-12-27 08:29:03", updated_at: "2014-12-27 08:29:03">]>

> Category.last
=> #<Category id: 8, name: "bebop", parent_category_id: 5, created_at: "2014-12-27 08:40:14", updated_at: "2014-12-27 08:40:14">

> Category.last.parent
=> #<Category id: 8, name: "bebop", parent_category_id: 5, created_at: "2014-12-27 08:40:14", updated_at: "2014-12-27 08:40:14">

```

便利な gem があったりするんでしょうか。


※追記
Active Record Associations
2.10 Self Joins
http://guides.rubyonrails.org/association_basics.html#self-joins

↑を見つけました。こちらの方が t.references で参照しているので良いですね。

「Self Joins」って書いてあったので自己結合してるのかと思ったんですが違いました。

```
> Category.last
  Category Load (0.2ms)  SELECT  `categories`.* FROM `categories`   ORDER BY `categories`.`id` DESC LIMIT 1
  
> Category.last.parent
  Category Load (0.3ms)  SELECT  `categories`.* FROM `categories`   ORDER BY `categories`.`id` DESC LIMIT 1
  Category Load (0.3ms)  SELECT  `categories`.* FROM `categories`  WHERE `categories`.`id` = 5 LIMIT 1
  ```

※追記2
[@jnchito](http://qiita.com/jnchito) さんにコメントで教えていただいた Ancestry について投稿しました。
[ActiveRecordで多階層カテゴリ(Ancestry)](http://qiita.com/NAKANO_Akihito/items/d42a6ceae40933af2352)
sedの正規表現のデリミタに、/ 以外を使用する

## 問題

sedでファイル名置換を行う場合などに、パスのデリミタ「/」のエスケープが大量に発生して正規表現が大変読みづらくなる傾向があります。

```bash
s/\\/usr\\/bin/\\/usr\\/local\\/bin/g
's/\/usr\/bin/\/usr\/local\/bin/g'
```

実行例：

```bash
mbp15:~$ echo /usr/bin/php | sed -e s/\\/usr\\/bin/\\/usr\\/local\\/bin/g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e 's/\/usr\/bin/\/usr\/local\/bin/g'
/usr/local/bin/php
```

## 解決

このような場合、正規表現のデリミタを別の文字に変えてやることで読みやすい正規表現を書くことができます。

カンマやコロンなど、色々な文字を使用できます。

```bash
mbp15:~$ echo /usr/bin/php | sed -e s,/usr/bin,/usr/local/bin,g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s:/usr/bin:/usr/local/bin:g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s#/usr/bin#/usr/local/bin#g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s@/usr/bin@/usr/local/bin@g
/usr/local/bin/php
mbp15:~$ echo /usr/bin/php | sed -e s%/usr/bin%/usr/local/bin%g
/usr/local/bin/php
```

使用する文字は、基本的にコンテンツとかぶらないものを使用しますが、迷った場合はスペースなんかおすすめです。

```bash
mbp15:~$ echo /usr/bin/php | sed -e 's /usr/bin /usr/local/bin g'
/usr/local/bin/php
```

ちなみにバックスラッシュなど、使用できない文字もあります。

```bash
mbp15:~$ echo /usr/bin/php | sed -e 's\/usr/bin\/usr/local/bin\g'
sed: 1: "s\/usr/bin\/usr/local/b ...": substitute pattern can not be delimited by newline or backslash
```

## 他の言語では

例えば Ruby では、%r記法で似たような正規表現リテラルが作成できます。

```irb
$ irb
irb(main):001:0> "/usr/bin/php".sub %r|/usr|, '/usr/local'
=> "/usr/local/bin/php"
```
Findbugs

from. [Yukiの枝折 - Android:Findbugs](http://yuki312.blogspot.jp/2014/12/androidfindbugs.html)

はじめに
---

FindBugsは次の機能を持つ静的検査ツールである. 

 - Javaクラスバイナリに対する解析によりバグパターンの検査を行う
 - 解析結果を出力する

FindBugsはJavaクラスバイナリからバグパターンを解析するプログラム. ソースコードリポジトリへのコミット前後でFindBugsによるコード解析を行い, 潜在的な不具合を排除するツールとして非常に強力である. 

Javaソースコードを解析したい場合はPMDが利用できる. 実動作により近いクラスバイナリを検査するという点ではFindBugsが有利であるが, ソースコード自体の品質を向上させたい場合はPMDやLintを使用する. 
Groovyコードは同じくクラスコードを生成するがFindBugsによる正しい検査はできない.

また, 解析結果を出力する機能もあり, 各種CIツールとの親和性も高い. 


FindBugsの動作環境
---

 - プラットフォーム非依存(GNU/Linux, MacOS X, Windows可)
 - J2SE 1.5以上のランタイムが必要
 - メモリ512MB以上が必要で, 解析対象が巨大である程これは増加する


FindBugs GUI
---

FindBugsはそれ単体をプログラムとして配布されている.
 http://findbugs.sourceforge.net/ja/manual/installing.html#d0e94

FindBugsを単体実行するGUIツールも用意されているが, 昨今ではIDEアプリケーションのプラグインとして導入・実行されるケースが主であるためここでは割愛する. 
 http://findbugs.sourceforge.net/ja/manual/gui.html


Bug Pattern
---

下記ページに日本語訳(FindBugsv2.0.2)が纏められている.
 http://www.acroquest.co.jp/webworkshop/JavaTroubleshooting/findbugs/

FindBugsを実行する際にはこれらのBug Patternを検査項目としてインプットする. 
プロジェクトの特性に合わせて検査項目はフィルタされることもある. 


Analysis Properties
---

FindBugsがソース解析する際の観点を分析プロパティとして実行時に指定することができる. 
分析プロパティには主に次の2点を指定する. 

 - 分析対象のメソッドの意味
 - 分析の精度

1点目, 分析対象メソッドの意味を指定することでより正確な分析結果を得ることができ, 誤検出を減らすことができる. 
2点目, FindBugsが消費するメモリや分析時間が問題となる場合は精度を落とすことで解決できる場合がある. ただし, 検出されるべきバグを見逃す可能性が高くなるデメリットもある. 

分析プロパティは`-property`で指定する. 次はその例. 

```bash
$ findbugs -textui -property "cfg.noprune=true" myApp.jar
```

`-property`で指定できる分析オプションの一覧は下記を参照.
 http://findbugs.sourceforge.net/ja/manual/analysisprops.html


FindBugs Plug-in
---

IntelliJ IDEA系 IDEにFindBugsを導入する場合は FindBugs-IDEA プラグインが便利. 
https://plugins.jetbrains.com/plugin/3847?pr=idea

FindBugsは日本語情報も充実しており, Webで検索すればいくらでも見つけることができる. 

CIツールでFindBugsを自動実行させたい場合, Gradleには標準でFindBugs-pluginが用意されている. 
http://gradle.monochromeroad.com/docs/userguide/findbugs_plugin.html

**NOTE**
上記GradleのFindBugsプラグインはjavaプラグインと併用されることを前提としている. 
Androidプロジェクトで作成されるbuild.gradleにはjavaプラグインが適用されないため, FindBugsプラグインを動作させるには少し工夫する必要がある. 

次のgroovyコードをbuild.gradleに適用するとfindbugsタスクが追加され, Gradle consoleからfindbugsを実行することができるようになる. 

```groovy
apply plugin: 'findbugs'

task findbugs(type: FindBugs) {
    ignoreFailures = true
    classes = fileTree('build/intermediates/classes/debug/')
    source = fileTree('src/main/java/')
    classpath = files()
    effort = 'max'
}
tasks.withType(FindBugs) {
    reports {
        xml.enabled = false
        html.enabled = true
    }
}
```

参考
---

 - [FindBugs official](http://findbugs.sourceforge.net/ja/manual/installing.html#d0e94)

以上.
Andriod NDK Sample with Android Studio 1.0


# はじめに 
Android Studio 1.0がリリースされ、GoogleからもAndroid StudioがofficalなAndroid用IDEであるとアナウンスされました。今まで、Eclipse + ADTでJNIを使ったアプリケーションを開発していましたが、今後のサポートの先行きが不透明なため、Android Studio でもNDKを動かしてみようと試行錯誤したメモをまとめました。

# 注意点

この作業を行っている際にGradle Consoleに

```:console
WARNING [Project: :app] Current NDK support is deprecated.  Alternative will be provided in the future.
```
とたくさん出力されるので、この情報が役に立たなくなるかもしれないので、できるだけソース元を参照するようにしてください。

# demo movie

まずは、次のデモをご覧になるのがいいと思います。これで、おおまかな流れを掴んでください。

https://www.youtube.com/watch?v=okLKfxfbz40

ここでは、このデモにしたがってsampleを作成しようとしましたがつまずいたところをノートしていきます。



## local.properties

ndkのインストール先を設定する必要があります。

```gradle:local.properties
sdk.dir=/Users/accountname/android-sdk/sdk
ndk.dir=/Users/accountname/android-ndk-r10d
```

## build.gradle

http://ph0b.com/android-studio-gradle-and-ndk-integration/ にあります build.gradleのtemplateを用いようとしましたが、

```:console
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:ndkBuild'.
> A problem occurred starting process 'command 'ndk-build''
```
ndk-build が見つからないといわれ失敗します。 http://blog.gaku.net/ndk/ を参考にしますと、どうやらndk-buildをfull pathで指定しないといけないようです。そこで、ndk-build に関連する task ndkBuild を以下のように修正してみました(Windows環境ではテストしていないので、これで上手くいくかどうか教えていただけたらと思います)

```java:build.gradle
// call regular ndk-build(.cmd) script from app directory
task ndkBuild (type: Exec) {
    def ndkBuildPath = project.plugins.findPlugin('com.android.application').getNdkFolder().absolutePath + File.separator
    if (Os.isFamily(Os.FAMILY_WINDOWS)) {
        ndkBuildPath += 'ndk-build.cmd'
    } else {
        ndkBuildPath += 'ndk-build'
    }
    commandLine ndkBuildPath, '-C', file('src/main').absolutePath
}
```

## native method の定義

このデモでは、Activity class上にnative methodを定義して実装しています。しかし、Support Libraryの依存関係を考えると別途NDK用Manager classを定義して、native methodはすべてNDKManagerクラスを参照する方がラクだと思います。

このようにしますとjni用headerを作成するのがラクです。

```sh:console
> javah -d jni_2 -classpath ../../build/intermediates/classes/fat/debug/ com.example.ndksample_with_androidstudio.NDKManager 
```

(classpathの場所は適時環境に応じで変更してください。私はfatという名前ですべてのarchに対応したapkファイルを作成しようとしているので、fatという名のdirectoryが含まれています。)

# sample

最後に、今回作成したProjectをgithub上(https://github.com/abekatsu/NDKSample_with_AndroidStudio
) で公開してますので参考にしていただけたらと思います。

# References

- http://ph0b.com/android-studio-gradle-and-ndk-integration/
- http://blog.gaku.net/ndk/
- http://tools.android.com/tech-docs/new-build-system/tips
- http://stackoverflow.com/questions/27520191/cant-run-ndk-build-on-android-studio-from-gradle-on-osx-yosemite
シェルで変数のインクリメントに expr を使うと100倍遅い件

シェルプログラミングにおいて、ループカウンタなどをインクリメントするとき、どのようにしますか？

# いきなりですがサンプルから。

```bash
#!/bin/bash

COUNT=0

while [ $COUNT -lt 1000 ]; do
    
    # 何かの処理

    COUNT=`expr $COUNT + 1` # COUNT をインクリメント
done
```
# `expr` コマンドを使う？

シェルプログラミングの入門記事などを見ると、変数のインクリメントに上記のような ``` COUNT=`expr $COUNT + 1` ``` を用いているものが多くあります。
しかし、この書き方は **とても遅い** です。空のループを1000回繰り返すだけでも手元の mac (Core i7) で約2秒もかかってしまいました。

```
$ time bash shelltest.sh

real	0m1.939s
user	0m0.791s
sys	0m1.098s
```

# 二重括弧 `((...))` を使う！
**Bash** では `expr` の代わりに二重括弧を用いて算術式を評価することができます。評価した値を取り出したいときは二重括弧の前に`$`をつけて `$((...))` とします。つまり、

```bash
(( COUNT++ )) # COUNT をインクリメント
```
または、少し明示的に

```bash
COUNT=$(( COUNT + 1 )) # COUNT をインクリメント
```
とします。こちらを使ったほうが **圧倒的に速い** です。
最初のサンプルのインクリメント部分だけをこれに変えたプログラム

```bash
#!/bin/bash

COUNT=0

while [ $COUNT -lt 1000 ]; do
    
    # 何かの処理

    COUNT=$(( COUNT + 1 )) # COUNT をインクリメント
done
```

を実行してみると、

```
$ time bash shelltest2.sh

real	0m0.016s
user	0m0.014s
sys	0m0.002s

```

と、 **100倍以上の速さ** になっています。

# 汎用性？
いちおう、最初の`expr` を使う書き方のほうが汎用性が高いみたいです。Solaris とかのシェルでも使える？
そっち系のシェルでは二重括弧が使えないものがあるとか。

ただ、現在のところ広く使われている CentOS や、mac でもデフォルトのシェルが bash になっていますし、あまり調べていないけど他の zsh とかのシェルでも二重括弧はある程度使えそうなのかな？と言った印象です。（zsh では少なくとも上のスクリプトは実行できました。）

bashを使っているなら、 **何が何でも汎用性を保ちたい！ということでなければ後者の二重括弧を使うほうがよい** と思います。

# `expr` はなぜ遅いのか？
さて、今回の実験ではたった1000回のループしか行なっていないので二重括弧が速いというよりも **`expr` がインクリメントの処理としては尋常ではなく遅い** 、というべきでしょう。これはなぜでしょうか？

### コマンドだから fork が遅い
これもあまり詳しくは調べていないのですが、自分の理解の範囲で。

```bash
 COUNT=`expr $COUNT + 1`
```

と、右辺をバッククォートでくくっていることから、 `expr` はコマンド扱いですよね。実際、コマンドラインから `expr` というコマンドを実行することもできますしね。

以前偉い人から聞いた話では、このような場合この `expr` コマンドは別プロセスを立ちあげて実行される、とのことでした。つまり プロセスの `fork` が必要です。`fork` のコストは相当高いです。変数に1足すためだけにわざわざ別プロセスを fork するなんていかにも大げさですよね。牛刀を以ってなんとやら、な感じです。

### Cygwin だとさらにやばい
昨今では使う人は減っているのかもしれませんが、Windows 上で Linux 環境をエミュレートする **Cygwin** では fork のコストがさらに桁違いらしいです。
いま手元にないので試せませんが、以前にやった時には普通の Linux に比べて10倍くらい遅かった覚えがあります。二重括弧式と比べると **1000倍の遅さ** です！これはちょっと使っていられないでしょうね・・・


# 参考
- http://rcmdnk.github.io/blog/2013/11/13/computer-bash/
- http://www.ne.jp/asahi/hishidama/home/tech/unix/sh.html
- https://www.google.co.jp/search?q=cygwin+fork+slow&oq=cygwin+fork+slow&aqs=chrome.0.69i59j0.2839j0j4&sourceid=chrome&es_sm=91&ie=UTF-8 (cygwin fork slow の検索結果）
Androidの自作ライブラリの公開手順まとめ


##概要
Androidで作成した自作ライブラリをGithubを利用して公開するための手順。結構躓いたので備忘録として手順をひと通りまとめてみる。mavenについて理解が甘いのでとりあえず手順だけ。

##準備

公開するライブラリはこちら。以前自分のブログで書いたTabオペレーションのための簡易UIライブラリ。鋭意開発中。。。


[【Android】MenuTabのFragmentの遷移を自前のスタックで管理する at 情報系の凡才日記](http://taisho6339.hatenablog.com/entry/2014/07/01/223344)

##手順

1. githubでリポジトリを作る

2. gradleにMavenリポジトリに登録するためのスクリプトを書く

3. 書いたタスクを動かしてできた生成物をgithubにpush

4. 利用

###1. リポジトリを作る
ここは普通に作るだけなので省略。

###2. gradleにMavenリポジトリに登録するためのスクリプトを書く

``` groovy:build.gradle


apply plugin: 'android-library'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "file://${projectDir}/repository"
            pom.groupId = 'taisho6339'
            pom.artifactId = 'tab-opera'
            pom.version = '0.0.3'
        }
    }
}

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 21
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:21.0.2'
}

```

まず重要なのが、

```apply plugin: 'com.android.application'```

みたいになってるのを

```
apply plugin: 'android-library'
```

こう変えないとライブラリプロジェクトとみなされず、配布用 *.aar*ファイルが生成されない。そうなると公開しても利用できない。


###3.タスクを動かして生成物をgithubにプッシュ

```./gradlew uploadArchives```

を実行すると、指定した場所に *repository* ディレクトリができあがってるはず。
これを、 *git push*で公開完了。

##利用してみる

利用するときは、使いたいプロジェクトの```build.gradle```にて、

```groovy:build.gradle


repositories {
    mavenCentral()
    maven {
        url 'https://raw.github.com/taisho6339/TabOpera/master/tabopera/repository'
    }
}

dependencies {
     compile 'taisho6339:tab-opera:0.0.3@aar'
}

```

を追加すれば完了。


##最後に

出来上がったリポジトリ
[TabOpera](https://github.com/taisho6339/TabOpera)
ライブラリの更新がいちいち面倒なので、

ビルド→uploadArchives→git pushで公開

の流れを自動化させたい。
XcodeでC++開発をするためにやったこと

はじめに
-------
今までC/C++に限らずCLIなプログラミングをする時はEmacs + tmux + cmakeとかでほとんど生きてきましたが、ちょっとはいまどきの開発環境を使おうかと思って試した結果の備忘録です。他のIDEはあまり試していませんが、ひとまず手始めにXcodeから手を出してみました。CLI開発でもIDEを使うメリットは以下のとおりです。

- 構文エラーを即座に表示してくれる。save→画面切り替え→コンパイル→エラー確認→コードに戻るという反復がなくなる
- 実行もコマンド一つでコンパイル→実行までして表示結果してくれるため動作が少なくてすむ
- デバッグ時にソースコードと連動して作業できる。gdbのように部分的にではなくソース全体を見ながらデバッガを使える

また以下の様なデメリットもあるので、自分の状況にあわせるのが重要です。

- 学習コスト。例えばキーバインドは慣れ親しんだものに近づけることはできるが完全には同じにならない
- 基本的にマウスの併用が必要。キーボードだけで操作することも無理ではないが、ある程度マウスの利用が想定されているのでそちらに従ったほうが効率がいい


今あるプロジェクトをXcodeプロジェクトに変換する
------

cmakeを使うと一発で出来ます。

    % cmake -G Xcode .

とやることで、<プロジェクト名>..xcodeproj というディレクトリが作成されます。もし今現在cmakeで開発をしていなくても、さっとcmakeに乗り換えたほうがXcode環境を作るのが楽なのではないか、というぐらい簡単に扱えます。プロジェクト変換の際にはキャッシュファイルなど（CMakeFiles、CMakeCache.txtなど）を事前に削除しておく必要があります。

通常、cmakeでソースコードファイルを指定する時は以下のように*.ccなどのファイルを指定するだけでもコンパイルされますが、

    FILE(GLOB BASESRCS "src/*.cc")
    ADD_EXECUTABLE(myapp ${BASESRCS})

以下のようにヘッダもちゃんと指定しておくことで、Xcodeにヘッダファイルもちゃんと読み込まれるようになります。

    FILE(GLOB BASESRCS "src/*.cc" "src/*.h")
    ADD_EXECUTABLE(myapp ${BASESRCS})

<プロジェクト名>.xcodeproj をFinderからダブルクリックするとXcodeプロジェクト化した自分のプロジェクトが立ち上がります。


サーチパスを指定する
------------

他ライブラリのインクルードファイルの読み込みや、リンクするライブラリへのパスを指定します。

1. メイン画面で左上のShow the Project navigatorを選択
2. プロジェクト名をダブルクリック
3. ターゲットを選択する（重要）
4. 検索ボックスに search path と入力
5. Header Search Paths, Library Search Pathsをそれぞれダブルクリック
6. パスを入力

![Screenshot_2014-12-27_16_00_03.png](https://qiita-image-store.s3.amazonaws.com/0/27627/efde3a95-f12c-04a8-136a-6dbc4c322071.png)

すくなくともYosemiteでは/usr/local以下はデフォルトで無視されるので、homebrewのライブラリを使っている場合などは追加必須です。あと、ターゲットを目的の実行ファイルにあわせて設定しないと適切に動作しない場合があります。

編集する
------------------

基本的にCocoaフレームワークなので、Emacsキーバインドで動作します。

以下、キーバインド以外で今のところ主に使っている操作です。

### コンパイル＆実行

- `cmd-b`: でコンパイル
- `cmd-r`: で現在指定しているターゲットを実行する

### 実行時引数や環境変数の指定

1. メニューから Product → Schema → Edit Schema (cmd-<) を選択
2. 左側の一覧からRun → Argument を選択して、Argument Passed on Launch や Environment Variables を設定可能

### 選択範囲のインデントを揃える

- `ctrl-i`

### 宣言元の参照

- `cmd` + クリック: 宣言元を開く
- `cmd` + ダブルクリック: 宣言元を別ウィンドウで開く

### 補完候補の呼び出し

- `ctrl-space`
- 基本的には自動で補完候補が表示される

### X.cc と X.h ファイルの切り替え

- `cmd-ctrl-上キー` or `cmd-ctrl-下キー`


レポジトリの操作
------------

すでにgitで管理されているプロジェクトの場合、何も設定しなくてもgitを利用可能です。
メニューのSource Controlからcommit, push, pull, branch操作ができます。
1週間分の天気予報をコンソールに表示するPHPスクリプト


# php-tenki
https://github.com/takatama/php-tenki

コンソールから使います。1週間分の天気予報を表示します。
天気予報のデータは [OpenWeatherMap](http://openweathermap.org/) から入手します。

## インストール方法

```
$ git clone https://github.com/takatama/php-tenki
$ cd php-tenki
$ curl -sS https://getcomposer.org/installer | php
$ php composer.phar update
```

## 使い方

```
$ php tenki.php <場所,国>
```

例: 千葉県柏市のお天気

```
$ php tenki.php kashiwa,jp
Kashiwa, JP (lat:35.854439, lon:139.968887)
2014/12/27 Clear max:7.9 min:-0.4
2014/12/28 Clouds max:7.9 min:-1.8
2014/12/29 Rain max:5.2 min:-0.4
2014/12/30 Clear max:11.3 min:0.2
2014/12/31 Rain max:8.7 min:-0.5
2015/01/01 Rain max:10.1 min:-2.1
2015/01/02 Clear max:7.9 min:0.2
```

## 使った技術

### OpenWeatherMap API

一日単位の天気予報データ([Daily Forecast Data](http://openweathermap.org/forecast))を使います。

例）千葉県柏市のデータ
http://api.openweathermap.org/data/2.5/forecast/daily?q=kashiwa,JP

データの説明は[こちら](http://openweathermap.org/weather-data#16days)です。日本に合わせるために工夫が必要です。

* 時刻はGMT。JPNに変換するため 9時間進める。
* 温度は華氏。摂氏に変換するため 273.15 引く。
* 小数点1桁だけでいいので、round 関数で四捨五入する。

ついでに、
* コンソールの表示をカラフルにするため、[kevinlebrun/colors.php](https://github.com/kevinlebrun/colors.php) を使う。

```tenki.php
function show_forecast($time_gmt, $weather, $temp_max_K, $temp_min_K) {
    $time_jpn = $time_gmt + 9 * 60 * 60;
    $temp_max_C = round($temp_max_K - 273.15, 1); //小数点第一位まで表示
    $temp_min_C = round($temp_min_K - 273.15, 1);
    $c = new Color();
    echo gmdate('Y/m/d', $time_jpn) . ' ' . $c($weather)->bold . ' max:' . $c($temp_max_C)->red . ' min:' . $c($temp_min_C)->blue . PHP_EOL;
}
```


### Guzzle で REST API を利用する

最近はcURLより[Guzzle](http://docs.guzzlephp.org/en/latest/)みたいです。JSONならこれだけで大丈夫。


```tenki.php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$url = 'http://api.openweathermap.org/data/2.5/forecast/daily?q=' . $city_and_country;
$client = new Client();
$json = $client->get($url)->json();
```

### 参考にした情報

* PHP - Guzzle で Twitter REST API を叩く - Qiita
http://qiita.com/kawanamiyuu/items/2cab57e3d3932a2c5e4e
libmcryptをソースコードビルドする


# 概要
## これはなに？
- 暗号化ライブラリ
- http://sourceforge.jp/projects/freshmeat_libmcrypt/

## 目標
- libmcrypt-2.5.8 の共有オブジェクトがシステムに読み込まれる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし

# 導入手順
## tar.gz をダウンロードする
```
wget https://vps.googlecode.com/files/libmcrypt-2.5.8.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/libmcrypt-2.5.8.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/libmcrypt-2.5.8/

./configure --prefix=/usr/local/lib/libmcrypt-2.5.8 --disable-posix-threads --enable-dynamic-loading
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/libmcrypt-2.5.8 /usr/local/libmcrypt
```


## 共有オブジェクトのパスを登録する
```
echo "/usr/local/lib/libmcrypt-2.5.8/lib" > /usr/local/etc/ld.so.conf.d/libmcrypt-2.5.8.conf

sudo ln -s /usr/local/etc/ld.so.conf.d/libmcrypt-2.5.8.conf /etc/ld.so.conf.d/libmcrypt-2.5.8.conf

sudo ldconfig
```

# 削除手順
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/libmcrypt-2.5.8.tar.gz
sudo rm -r /usr/local/src/libmcrypt-2.5.8/
sudo rm -r usr/local/lib/libmcrypt-2.5.8/
sudo rm -r /usr/local/libmcrypt
sudo rm -r /usr/local/etc/ld.so.conf.d/libmcrypt-2.5.8.conf
sudo rm -r /etc/ld.so.conf.d/libmcrypt-2.5.8.conf
```

## 共有オブジェクトのパスを更新する
```
sudo ldconfig
```
iOSで変更前／変更後のソースコードを見るブックマークレット

##今見てる状態のソースコード
JavaScriptなどで変更された部分を含めたソースコードは、`document.documentElement.outerHTML`で取得できます。

```js:ブックマークレット（変更後・アラート）
javascript:alert(document.documentElement.outerHTML);
```

```js:
alert( document.documentElement.outerHTML );  //outerHTMLをアラート
```

新しいウインドウで開く場合、そのまま`open()`を使ってもバックグラウンドで開かれたままページ移動しません。開く前にユーザーアクションを入れると上手くいくっぽいので、開く前に`confirm()`を入れました。
仕組みとしては、新しく開いたウインドウの`document.body`にpre要素を追加し、そこにソースコードのテキストノードを突っ込んでいます。

```js:ブックマークレット（変更後・オープン）
javascript:confirm('')&&open().document.body.appendChild(document.createElement('pre')).appendChild(document.createTextNode(document.documentElement.outerHTML));
```

```js:
confirm('')&&  //OKが選択されたら
open().document.body  //ウインドウを開き
  .appendChild(document.createElement('pre'))  //bodyにpreを追加し
  .appendChild(document.createTextNode(document.documentElement.outerHTML));  //preにテキストノードを追加
```

##元々のソースコード
JavaScriptなどで変更される前の、取得したままのソースコードは、`XMLHttpRequest`で取得できます。

```js:ブックマークレット（変更前・アラート）
javascript:(function(xhr){xhr.onreadystatechange=function(){if(xhr.readyState===4&&xhr.status===200)alert(xhr.responseText);};xhr.open('GET',location.href);xhr.send();})(new XMLHttpRequest());
```

```js:
(function( xhr ){
  xhr.onreadystatechange = function () {
    if ( xhr.readyState === 4 && xhr.status === 200 )
      alert( xhr.responseText );
  };
  xhr.open( 'GET', location.href );
  xhr.send();
})( new XMLHttpRequest() );  //xhrに渡す
```

新しいウインドウで開く場合、イベント実行時（`onreadystatechange`）に開こうとしてもブロックされます。なので、先にウインドウを開いてからそこに追加する形をとります。

```js:ブックマークレット（変更前・オープン）
javascript:confirm('')&&(function(xhr,pre){xhr.onreadystatechange=function(){if(xhr.readyState===4&&xhr.status===200)pre.appendChild(document.createTextNode(xhr.responseText));};xhr.open('GET',location.href);xhr.send();})(new XMLHttpRequest,open().document.body.appendChild(document.createElement('pre')));
```

```js:
confirm('')&&
(function( xhr, pre ){
  xhr.onreadystatechange = function () {
    if ( xhr.readyState === 4 && xhr.status === 200 )
      pre.appendChild( document.createTextNode( xhr.responseText ) );
  };
  xhr.open( 'GET', location.href );
  xhr.send();
})( new XMLHttpRequest,  //xhrに渡す
    open().document.body.appendChild( document.createElement('pre') )  //preに渡す
);
```

##既にあった
スマホでソースコードを見られる『Snoopy』というブックマークレットを出してる方がいました。シンタックスハイライトがついていて、ページ情報などもわかるので便利です。

Snoopy | View-source bookmarklet for iPad, iPhone and other mobile devices
http://snoopy.allmarkedup.com/
ruby 階乗計算 再帰関数




```rb

require 'benchmark'

# 階乗計算(再帰)
def fact(n)
  return 1 if n == 0
  n * fact(n - 1)
end

Benchmark.bm do |x|
   x.report { p fact(100) }
end

# 階乗計算(末尾再帰)
def facti(n, a = 1)
  return a if n == 0
  facti(n - 1, n * a)
end

Benchmark.bm do |x|
   x.report { p facti(100) }
end

```
MISC for 画像処理

# これは何？
画像処理をするときに細々としたデータを扱うときのちょっとしたコマンドなどです。
メモ代わりで随時更新します。

# コマンドライン
## convertコマンドでカラー画像をグレースケールに変換する

```
convert <入力ファイル名> -set colorspace Gray -separate -average <出力ファイル名>
```

多分 `-set colorspace Gray` さえすれば良さそう。
出典 : http://stackoverflow.com/questions/13317753/convert-rgb-to-grayscale-in-imagemagick-command-line


## convertコマンドでjpg, png を ppmに変換する

```bash
convert <入力ファイル名> output_file_name.ppm
```

メモ：出力ファイル名の拡張子がppmだったらよさそう。

## Macでppmファイルを見る → ppmファイルをjpgなどに変換する。
Finderで見ることが出来なさそう。Chromeとかでも見れない。ので上と逆にppmファイルをjpegファイルに変換してみる

```
convert image.ppm image.jpg && open image.jpg
```

# iOSで画像処理

## CMSampleBufferをOpenCVのmatに変換する

```objc++

#import <opencv.hpp>
#import <ios.h>

cv::Mat3b sampleBufferToMat(CMSampleBufferRef sampleBuffer)
{
    CVImageBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

    CVPixelBufferLockBaseAddress( pixelBuffer, 0 );

    //Processing here
    int bufferWidth = (int)CVPixelBufferGetWidth(pixelBuffer);
    int bufferHeight = (int)CVPixelBufferGetHeight(pixelBuffer);
    unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(pixelBuffer);

    // put buffer in open cv, no memory copied
    cv::Mat4b mat = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel);
    cv::Mat3b mat3b(bufferHeight, bufferWidth);
    cvtColor(mat, mat3b, CV_BGRA2RGB);

    //End processing
    CVPixelBufferUnlockBaseAddress( pixelBuffer, 0 );

    return mat3b;
    
}
```

RGB3チャンネルのcv::Matが返ります。
メモリはCMSampleBufferのものを利用せず、新たに確保しています。

## cv::Mat -> UIImage

特に何も考えなければ

```objc++

UIImage *img = MatToUIImage(mat);
```

でOK

他にもいろいろと考える事がある場合は、こんな感じで。

```
UIImage* matToUIImage(const cv::Mat& mat, CGFloat scale, UIImageOrientation orientation)
{
    UIImage *img;
    if (mat.channels() == 3) {
        cv::Mat4b mat4b(mat.size());
        cvtColor(mat, mat4b, CV_RGB2RGBA);
        img = MatToUIImage(mat4b);
    } else {
        img = MatToUIImage(mat);
    }

    return [UIImage imageWithCGImage:img.CGImage
                               scale:scale
                         orientation:orientation];
}
```
Homebrew をインストールして使えるようになるまで 〜私の場合〜


Mac環境：OSX Yosemite 10.10.1

Golang の開発環境を作成するために、
まず Homebrew をインストールすることになりました。（元記事は[こちら](http://qiita.com/megu_ma/items/7208be8de52b712955a0 "Golang Macへのインストール")）


## 0. 前準備〜参考サイト〜

下記サイトが、とても参考になりましたよ。Qiita素晴らしす！
http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc

Homebrew の公式サイトはこちら。日本語版もあった〜すげぇ。
http://brew.sh/index_ja.html

上記の記事（主にQiitaの方）を参考に、
以下、私が行ったインストール手順を紹介します。

## 1. Java を確認する

まず、Java の確認。

```bash:ターミナル
$ java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)
```
Java はOK。


## 2. Xcode を確認する

Xcode の確認。

```bash:ターミナル
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

Xcode なかったっぽい。

そしたらご親切に、UIがでてきて「Xcodeをインストールするかい？」って聞かれたので、
素直にインストールボタンをぽっちり。ダウンロードとインストールが始まる。

うちの回線がクソなので、ダウンロードを待ってる間に寝てたら、
どうもインストールまでいつの間にか完了してた模様。

```bash:ターミナル
$ xcode-select --install
xcode-select: error: command line tools are already installed, use "Software Update" to install updates
```

怒られた。すみません。Xcode もOK。

## 3. Homebrew をインストールする

ついに、Homebrew 本体のインストールだよ！

ちなみに、root権限で実行しようとすると、ちゃんと怒られますw
バカにも優しい・・・。

```bash:ターミナル
$ sudo ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Password:（パスワード入力）
Don't run this as root!
```

賢い子は自分のユーザで実行しましょう。

```bash:ターミナル
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.1
==> The following directories will be made group writable:
/usr/local/.
==> The following directories will have their group set to admin:
/usr/local/.

Press RETURN to continue or any other key to abort
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local/.
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local/.
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects: 220187, done.
remote: Compressing objects: 100% (58029/58029), done.
remote: Total 220187 (delta 160945), reused 220153 (delta 160921)
Receiving objects: 100% (220187/220187), 49.78 MiB | 116.00 KiB/s, done.
Resolving deltas: 100% (160945/160945), done.
From https://github.com/Homebrew/homebrew
 * [new branch]      master     -> origin/master
HEAD is now at de0282d Remove unnecessary code from debugger
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started
```

ん、インストールできた！

では、仕上げのコマンドをば、打ち込みましょうかね。

```bash:ターミナル
$ brew doctor
Your system is ready to brew.
```

MacPorts などがすでに存在していると、エラーがでるようですが、
私は何も入っていなかったので、問題なかったようです。

無事、Homebrew インストール完了！

ちゃんちゃん。

以上
PostgreSQL の基本操作


完全に個人メモですが…
普段の仕事では Oracle 11g を使っているので，仕事外のプロジェクトでは何かと路頭に迷うので自分用リファレンスです．
ローカルマシンで DB も動かしてます．

# 起動とか接続とか
## 起動
```sh
pg_ctl -D /path/to/postgres start
```

## スキーマ一覧の取得
```sh
psql -l
```

## データベースにコンソール接続
```sh
psql #{database-name}
```

# データベースの詳細を確認する類

## テーブル一覧を見る
```postgres
\d
```

## テーブルの詳細を知る．
Oracle の desc 的な．

```postgres
\d #{table-name}
```

# 関数とか
## 現在時刻取得
sysdate 的な．

```postgres
SELECT now();
```

`now()` と `transaction_timestamp`, `current_timestamp` は同じらしい．

# 便利じゃん！Tips
## Reverse Incremental Search が使える．
コンソールで `Ctrl+R` するとリバースインクリサーチが出来る．直近で使ったコマンドが探せてもう一度打てるので便利．
ArchLinux上でMacを動かす方法


##はじめに

この記事は、Arch Linux 上の VirtualBox を使って、　Mac の　Yosemite を動かすまでを目標とします。



##Macでやった作業

まず、Macで行う作業がいくつかあります。具体的には、 AppStore から Yosemite をダウンロードしてきて、それを VirtualBox 上にインストールし、VMイメージを作成するまでです。

そのままでは、起動ディスクが使えないので、[iesd](https://github.com/ntkme/iesd)を使います。

まず、App Storeからインストールディスクをダウンロードします。ダウンロード完了後、インストール画面を閉じて、/Applications/以下にYosemiteがあることを確認。以下のコマンドを実行します。これらの手順、具体的には、VM Imageを作るのは、 Mac から行いますので、それまでは、 Mac を起動できる状態にしておいてください。

```bash:
$ cd ~/Downloads

$ gem install iesd

$ iesd -i /Applications/Install\ OS\ X\ Yosemite.app/ -o Yosemite.dmg -t BaseSystem
```

`~/Downloads`に`Yosemite.dmg`が出来上がっていれば完成です。これは、マウントディスクから作られます。失敗した場合は、そのディスクを手動でアンマウントしてから、問題解決後、再度、iesdコマンドを実行することになります。

次に、 VirtualBox を起動し、先ほど作成したディスクを起動します。これが、VMイメージの作成手順になります。

次に、VM Imageを作成します。 VirtualBox を起動し、適当なディスクを作成後、以下のコマンドを実行します。これは、2013までのマシンを使っている場合は、必要みたいな感じです。でないと、Yosemite.dmgが起動できません。`<vmname>`は任意のものを入れます。

###追記

Yosemiteのインストーラーの起動は、`Yosemite.dmg`一度を読み込んで、固まった状態を確認後、終了。

一度、強制終了してから下記のコマンドを実行することで、Yosemiteインストーラーの起動を確認しました。これは、`Yosemite.dmg`があれば、ArchLinux上だけでもYosemiteインストーラーを起動することができました。

```bash:
$ VBoxManage modifyvm <vmname> --cpuidset 00000001 000306a9 00020800 80000201 178bfbff

$ VBoxManage startvm <vmname>
```

起動後は、ディスクのフォーマットを Mac のものにしなければなりません。したがって、メニューから以下のものを選択し、フォーマットします。英語。

>  "Utilities" -> "Disk Utility…" to launch the Disk Utility

フォーマットできたら、そのディスクに Yosemite をインストールしましょう。インストール後は自動で再起動がかかりますので、その時は、CD/DVDにあるYosemite.dmgをアンマウントしておきます。

これで、ディスクにインストールした Yosemite が起動します。

##Arch Linuxでの作業

この手順でできた`~/VirtualBox\ VMs/{vmname}`を Arch Linux などをインストールしたマシンにコピーし、 VirtualBox 上で `M-m,A(dd)`します。

すると、 Yosemite が起動します。

###動作に関して

動作に関しては、メモリ設定によっても変わってきそうですが、基本的に遅い印象。

また、仮想環境上で AppStore に接続できるか、　Xcode は起動するのか、キーボードやトラックパッドはどうなるか、等様々な懸念事項がありますが、現時点では、確認できていません。

もし試してみた方がいれば、動作報告などをコメントにて、いただければ嬉しいです。

##参考になりそうな記事


https://ntk.me/2012/09/07/os-x-on-os-x/

http://engineering.bittorrent.com/2014/07/16/how-to-guide-for-mavericks-vm-on-mavericks/
Ruby 2.2.0でRailsは速くなるのか？？軽くベンチマークしてみた


# はじめに
[Ruby 2.2.0](https://www.ruby-lang.org/ja/news/2014/12/25/ruby-2-2-0-released/)がリリースされましたね！
相変わらず納期厳守で感服します。

Ruby 2.2.0はRails 5で必須となるSymbolGCやインクリメンタルGCが実装されたり、おまけにjemallocが使えるようになってたりと速くなってそうな雰囲気です。

というわけでRailsを使って軽くベンチマークしてみました。

# 測定対象
今回測定対象としたのは、次の3つです。

* Ruby 2.1.5
* Ruby 2.2.0
* Ruby 2.2.0 with jemalloc

# ベンチマーク方法
RailsのアプリケーションにApache Benchをかけました。

### ミドルウェア

アプリケーションサーバにはUnicorn、WebサーバにはNginxを使いました。

最初はRaptorを使おうとしてたんですが、まだ2.2.0に対応できていないようなのでやめました。
https://github.com/phusion/passenger/issues/1314

データベースには[Percona XtraDB Cluster](http://qiita.com/nownabe/items/462f46f2702ce1ad4b6d)を使いました。

### アプリケーション

ベンチマークに使用したRailsのアプリは[こちら](https://github.com/nownabe/rails_bench)です。
DBに書き込んで、書き込んだモデルをJSONとして返すだけのアプリです。

Railsのバージョンは4.1.4です。

### Docker

環境の差異がなくなるようにアプリはDockerコンテナとして起動しました。
オフィシャルなRuby 2.2.0のイメージがなかったので、Rubyビルドするとこからイメージを作成しています。

### インフラ
サーバは[IDCFクラウド](http://www.idcf.jp/cloud/)のVMを3台使用しました。

サーバ | CPU | Memory
---+---+---
アプリサーバ | 0.8GHz x 1 | 1GB
DBサーバ | 2.4GHz x 4 | 16GB
ベンチサーバ | 2.6GHz x 2 | 4GB

すべてCentOS 7.0です。

### システム構成図
![ruby2.2.0_bench.001.png](https://qiita-image-store.s3.amazonaws.com/0/43208/d431cfd3-2f83-436b-52de-faacca2a2821.png "ruby2.2.0_bench.001.png")

# 結果
Request/Sec のグラフです。

![スクリーンショット 2014-12-27 12.32.59.png](https://qiita-image-store.s3.amazonaws.com/0/43208/bbbd2d73-cd67-f882-6826-cd9d6d0c92c5.png "スクリーンショット 2014-12-27 12.32.59.png")


簡単なRailsアプリでは、2.1.5と2.2.0ではほぼ変わらず（微妙に2.2.0の方が遅い）という結果になってしまいました。
Rails 5に期待ですね。

jemallocさんは速い場合と遅い場合がありました。
有能さが確認されればjemallocが標準になるらしいです。

# おわりに
軽いベンチマークでした。
結局速いのか遅いのかよくわからないという結果になってしまいました。
計測方法が適当なので、ちゃんとやれば変わりそうです。

2.2.0の方が速くなるパターンとかRails以外も計測してみたいですね。

# (おまけ)アプリケーション起動方法
今回使用したRailsアプリはDockerhubにイメージを登録してるので、Dockerが動いていれば次のコマンドで起動できます。

```
$ docker run \
-e "DB_HOST=dbhost" \ # DBサーバのホスト or IP
-e "DB_USER=dbuser" \ # DBのユーザ
-e "DB_PASS=dbpass" \ # DBのパスワード
-e "SECRET_KEY_BASE=hogehoge" \  # Railsのsecret_key_base
-e "NEWRELIC_KEY=newrelic_key" \ # NewRelicのライセンスキー
-p 80:80 nownabe/rails_bench:2.2.0 # 2.1.5、2.2.0、2.2.0-jemallocのいずれか
```
FRPとVirtual DOMについて。Signal徹底解説 (リンクのみ投稿)

ども、nobkzです。Virtual DOM アドカレと同時に投稿しようと思った内容ですが、なんか、qiitaの仕様上そんなのむりっぽいので、新規に記事作成し、アドカレに投稿しました。

http://qiita.com/nobkz/items/a9ae4a25be3f7eb21311
excel.exeでプロセスが異なると数式をコピペすると値として貼り付けされる

## 参考

* [テクニカルサポート 「QQ-Web」 FAQ詳細](https://faq.qqweb.jp/faq/viewer.asp?ID=DCEA68090D)

> 【例】
> 「=1+2」という式をコピーしても「3」として貼り付いてしまう。

デュアルモニタにExcelを別々の画面で開くためにexcel.exeを２つ起動した。

片方の数式をコピーし、もう片方のexcelに貼り付けを行うと計算結果の値のみが貼付けされた。

ググってみるとこれは仕様の様子。
PyJWT で PKCS#1 形式の公開鍵を用いて JWT の署名を検証する


JWT が RS256 形式の署名で作成されている場合に、[PyJWT](https://github.com/progrium/pyjwt) で公開鍵を使って JWT の署名を検証しつつデコードする方法を説明します。

### 事前準備

PyJWT のドキュメントにあるように RSA の署名に対応するには、PyJWT と併せて依存パッケージの cryptography をインストールします。

```
$ pip install pyjwt
$ pip install cryptography
```

cryptography のビルドには Linux 環境では libffi-devel や openssl-devel といったパッケージをインストールしておく必要があるので、上記の ```$ pip install cryptography``` でインストールに失敗した場合には、これらを確認してください。
OS X では環境変数の設定も必要で、割とややこしいです。
詳しくは [cryptography のインストールドキュメント](https://cryptography.io/en/latest/installation/)を参照してください。

### 公開鍵の例

pub_key.pem に以下のような公開鍵があるとします。

```text:pub_key.pem
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAuDopA35ZLa1sgi2QTFbZjH63BrhXw4evehjDiLHrSc5s+jKMSqfd
6BLoQhN7jcOBnofQB/3rEoy6YXkW58lEtVmekQtYAHh11oB8TBBqzNZP1QxKXWjz
8Jely5bJZHztZEzfddDR7yVZF0VSEa0KjiHbqCdAqXKYuAzUMN4dFyS/q0JXvGAr
Jq/LXyVC3EptcZki02p3Nd6KDZHW7hcj+p0xgYNiGCHO7yLf3uHP+7pak5TW0dWf
MC9fl1/oYFILuasW7OV75+vJGs8d92joEC/Lx3S8+gi3z0CWMnCKrWiTtaAKAq8W
yp4Go8WczOQ1rP+bzDj7b/9M3xrjqY3F0wIDAQAB
-----END RSA PUBLIC KEY-----
```

ちなみにこの鍵データに「-----BEGIN RSA PUBLIC KEY-----」、「-----END RSA PUBLIC KEY-----」というフォーマット指示文が抜けていて、それが原因で検証に失敗していたことがあります。

### PyJWT で JWT をデコードする

#### 署名検証をしない場合

検証をしない場合のコードは次のようになります。

```py
import jwt

encoded_jwt = 'JWTのデータ'
decoded_data = jwt.decode(encoded_jwt, verify=False)
```

このように jwt.decode() 関数の verify 引数に False を指定することによって署名の検証を省くことができます。verify 引数のデフォルト値は True なので明示的に False を指定する必要があります。

#### 署名検証をする場合

次に署名を検証する場合のコードです。

```py
from Crypto.PublicKey import RSA
import jwt

encoded_jwt = 'JWTのデータ'

rsa_public_key_pem = open('path/to/pub_key.pem', 'r').read()
rsa_key = RSA.importKey(rsa_public_key_pem)
key = rsa_key.exportKey()

decoded_data = jwt.decode(encoded_jwt, key=key, verify=True)
```

前述の公開鍵を読み込み、まず [RSA.importKey() メソッド](https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA-module.html#importKey)を通して RSA キーオブジェクトに変換します。この RSA キーオブジェクトの [exportKey() メソッド](https://www.dlitz.net/software/pycrypto/api/current/Crypto.PublicKey.RSA._RSAobj-class.html#exportKey)から得られる鍵データを jwt.decode() 関数の key 引数に指定します。そして verify 引数に True を指定して署名検証を指示します。

RSA キーオブジェクトによる鍵データの変換をせずに RSA 公開鍵の文字列をそのまま jwt.decode() 関数の key 引数に指定すると ```ValueError: Could not unserialize key data.``` というエラーになります。
既存のgit repoで間違えて`git init`してしまった時の対処法

間違えて違うディレクトリで`git init`しちゃって

```
Reinitialized existing Git repository in /hogehoge
```

とか出てきて「やっちゃった！？」という時の対処法

### 対策

何もしなくてOK.

`Running git init in an existing repository is safe. `
だそうです。 安全。

### 参考

How to undo misoperation of Reinitialized existing Git repository - Stack Overflow http://stackoverflow.com/questions/19397888/how-to-undo-misoperation-of-reinitialized-existing-git-repository
InAppPurchase課金用テストユーザを簡単に作成

# はじめに
InAppPurchaseの開発時に、使い捨てできる課金テスト用ユーザが欲しくなります。

テスト用と言えども作成の度に新たなメールアドレスが必要になるのでなかなか面倒。

そこで一時的に使用可能なメールアドレス発行サービスを利用しサクッと作成します。

ついでにパスワードの生成も外部サービスに任せます。

# クイックメールでメールアドレス作成

クイックメール
http://15qm.com/

「QuickMailのメルアドを発行する」をクリック。

メールアドレスが生成されます。

画面は開いたままにしておきましょう。
メールアドレスの寿命は15分間なので、時間内に以下の本登録作業を進めます。

# パスワード生成
パスワード生成（パスワード作成）ツール
http://www.luft.co.jp/cgi/randam.php

iTunes Connectで使うためには8文字以上、英語大文字、英語小文字、数字がデフォルトで含まれている必要があります。

上記条件がデフォルトで選択されています。

使用するパスワードは上記のメールアドレスとペアにしてメモしておきましょう。

# iTunes Connectで登録
Test Userとして登録します。

Secret Questionは「xxxxxxxx」
Secret Answerは「yyyyyyyy」
など8文字以上で適当に。

# 再度クイックメール
本登録用メールが届いているので、リンクをクリックして本登録します。

# おわりに
課金処理は作るのも動作確認もなかなか大変ですよね。
何かの参考になりましたら幸いです。
Doxydoc：Doxygen コメントの入力を補助するプラグイン

[DoxyDoc](https://sublime.wbond.net/packages/DoxyDoc)

関数やクラスの宣言の手前の行で /** と入力し改行するだけで、適切なDoxygenコメントを自動挿入してくれるSublime Textのプラグイン。

関数の返り値や引数、テンプレート引数に応じて、適切なDoxygenコメントの雛形を作ってくれます。

```cpp:sample.cpp
/**
@brief [brief description]
* @details [long description]
* 
* @param x [description]
* @param str [description]
* @tparam ValType [description]
* @return [description]
*/
template<typename ValType>
int hogeFuga( const int& x, const string& str);
```
残念ながらQTスタイルや一行コメントには対応していませんが、コメント整備には重宝するプラグインです。
TwitterAPIのaccess_token_keyがどのアカウントのかわからなくなったら

そんなこと滅多に無いかもしれないけど

```php
define('CONSUMER_KEY'       , '*************************');
define('CONSUMER_SECRET'    , '**************************************************');
define('OAUTH_TOKEN'        , '1106631758-***************************************');
define('OAUTH_TOKEN_SECRET' , '*********************************************');
```

tokenの初めに数字列(user_id)があるのでコピー
おもむろに 'https://twitter.com/intent/user?user_id={id}' にアクセス
https://twitter.com/intent/user?user_id=1106631758
Git移行するためにやったこと

#はじめに

GitでいろいろなTipsが上がっていて、とても勉強になるが、そもそもGitを使えない環境(主にポリシー依存、グループ依存)にいる場合とても残念な気持ちになる。結構いろいろな先人たちがGit移行をするために行ったことを書いているが、もうブームが過ぎ去ったのか、もしくはもう全員がGitを普通に使っているのか、最近ではあまりそのような記事は見ない。
というわけで、場違いかも知れないが、僕が会社で、僕の周り(=1部署)をGitに移行するために行った所作について簡単にまとめたいと思う。

#Gitの便利さを雄弁と語らない

最近において、誰かがGitを使いたいと思っているが、使用できていない大半の理由が、SVNに執着したい人がいたり、思っているが実際に推進する人がいなかったり、雰囲気的に言い出してもどうにもならなそうだったり、そんな感じだと思う。つまり、Gitの便利さ云々はさておき、という場合が多いのではないか、ということだ。
もしくは、上司がGitという言葉は知っていて、便利だというのは噂では聞いたことあるが…という場合もある。その場合は、メリット/デメリットを通じる言葉で丁寧にする必要がある。
しかし、時には雄弁と便利さについて語る必要がある。それは自分と同じチームやプロジェクトに所属している方々にである。

#Git移行を強制しない

SVNでやりたい、SVNでやらなければいけない、CVSでなければできない、と思っている人がいるのであれば、そのプロジェクトは強制的にGitに移行させるべきではないと考えている。なぜなら、大抵の場合プロジェクトに闇を抱えているか、メリットを感じていないのだ。そのような人々に無理やり使わせると、GUIツールで自動生成されたforceなどという見たくない文言を含むコマンドが飛び交うことになる。
自分がどこまで推し進めたいのかを最初から線引しておく必要があるし、そんなことを考えなくても、噂を聞きつけて人はやってくる。

#とにかく自分のチームから始める

大きく始める、なんてことは考えないほうがいい。まずは自分の所属しているプロジェクトで小さく始める。そうすると、その噂を聞きつけて僕も私も状態になるものである。心のなかではGitを使いたいと思っている人が、会社の中には必ずどこかにはいるものだ。そうしてどんどん輪を広げていくと、案外あっという間に広がるものだ、と、信じられない光景ではあったが実際にそうなったのを間近で見ているし、そうであったという例はいくつか聞いた。

#最終的にどうなったか

現在では、Gitに合わせてGitHub Enterpriseも導入し、大体5割程度のプロジェクトがGitに移行し、順次検討を始めるプロジェクトが増えてきた。
GitHub Enterpriseのライセンスが徐々に埋まってきて、買い足しを検討している程度、想定していたよりもユーザ数が増えている現状である。

#まとめ
筆者は以下の様なプロセスを踏んで実践した、という事を最後に記述し、まとめとしたい。

* 自分のプロジェクトで使いはじめるために、数人に布教活動をする
* GitHub Enterpriseのトライアルライセンスを取得する(GitLabの運用は闇属性が強すぎると前々から知っていたから除外した）
* 実際に数人でやってみる
* 「やってみる」を行っているということを他の人達が聞きつけ事情を聞いてくる
* もう少し広い規模で布教活動をしながら、ライセンス費用を申請するため、上司にメリット・デメリット、移行に伴う痛み、実際にプロジェクトで使ってみての感触、その後にあるであろう効果を説明する
* ライセンスを購入する(ここまで1ヶ月程度)
* 噂を聞きつけてどんどん周りのプロジェクトが事情聴取にくる
* ライセンスを買い増しする
* （以下繰り返し）

#合わせて読みたいかもしれない

[Github Enterpriseのこれまでの運用と2.0の新機能とつまづきどころ](http://techblog.recruit-lifestyle.co.jp/using-github-enterprise-2/)
td-client-python を作ってみた

# td-client-python を作ってみた

Treasure Data の山下です。GitHub では yyuu という名前で活動しています。

これまで Treasure Data には Python 用の公式な API クライアントライブラリが無かったようです。データの解析に関わるサービスが Python に対応していないというのは時流に沿っているとは言えないような気がしたので、取り急ぎで作ってみました。基本的に td-client-ruby の挙動に準拠した形となることを目標として実装してあります。Python 2.7 以降であれば動くはずです。

https://github.com/yyuu/td-client-python

まだテストカバレッジ 0% なので信頼性はゼロですが、もろもろマシな状態に整えたうえで公式版としてリリースできるといいなと考えています。
Fluxは本質的に何を解決しようとしたのだろうか?

# FluxとMVC

以前、@mizchiさんの[なぜ仮想DOMという概念が俺達の魂を震えさせるのか](http://qiita.com/mizchi/items/4d25bc26def1719d52e6)とか、id:saneyuki_sさん[Fluxアーキテクチャの覚え書きを書いた](http://saneyukis.hatenablog.com/entry/2014/09/26/174750)のを読んでて、いろいろ思うことがあったので纏めます。

## Fluxは一方通行だから良い?

まず一つあるのが、この節です。

>この資料は「そもそもMVCを誤解している」という批判も多いのですが、大事なのは「常に一方向にデータが流れる」という点にあります。

### MVCも、もともと一方通行ですよ?

いや、まず言いたいのは、MVCも、もともと「一方通行」ですよっていうことなんですよね。

その前に、MVCについて誤解が無いように説明しますけど

* Smalltalkの設計指針などの、GUIを構築するためのMVC
* Webアプリケーションのサーバサイド処理をするためMVC

の2つがあります。ここでは、GUIのMVCについてです。

また、MVCとかMVVMとかありますが、そもそもMVVMって、マイクロソフトのWPFやらのためのアーキテクチャであって、あの強力な開発環境のサポートが無い、ブラウザでJavascriptでGUIを構築するようなものには向いてないんじゃないかと思うんですが、それはまた今度で。

んで、たとえば、http://www.cue.im.dendai.ac.jp/~masuda/mvc/index.html に、

> 依存を利用したMVC
>
> (中略)
>
> 1.コントローラ1はモデルに変更メッセージを送る
> 2.モデルは自分自身に changed: メッセージを送る
> 3. dependency を通してすべてのビューに update: メッセージが送られる
> 4.各ビューがモデルに状態を尋ねて再描画する

とあり、そもそもMVCも一方通行なんですよね? 

なんで、僕のとっては何の真新しさも無く、もにょもにょしていました。としていくと、すると[Fluxアーキテクチャの覚え書きを書いた](http://saneyukis.hatenablog.com/entry/2014/09/26/174750)こういった記述がありました。

### 一方通行のパターンに名前を付けただけ。

> * ベストプラクティス的なパターンに名前をつけて共通言語としたところです。
> * **概念的に非常に革新的な何かがある**というわけではありません。
> * たぶん「誰もが一度は似たような事をやったことがある」と思うが、従来は個々人がそれぞれ別の言葉で呼んでおり、意思疎通の上で面倒くさかった

なるほどなー、と思いました。**何も新しい概念で無いんだったら、変な名前付けんな**と思うのですがね。

## なんでシングルトンにするの?

> StoreもDispatcherもシングルトンなサービスとして存在しているので（後述）、インスタンスの管理などの問題が軽減される

を見てて、いやいやなんか逆に、なんか密結合になったりするんじゃないかと思うんですが、なんでしょうかね?


## そもそもGUIを作るのは大変だ

> 現時点での各種クライアントサイドMVC実装は、正直僕でも学習コストが高過ぎると思っているのですが、

たぶん、ここらへん、**そもそもGUIってのが難しい**と思うので、何やっても学習コストが高いか、**学習コストが低いように見せかけて、そもそも問題を解決していない**ってこともあるとは思いますね。

なんで、FluxとかMVCとか、MVVMでやるべきとか、そんななんじゃなくて、たぶん、いろんあフレームワークやら言語やらをやって、自分なりに設計のベストプラクティスを作るべきなんじゃないですかね。
animateWithDurationを使うとバグが出る。。

※追記　この記事は勘違いでした。エラーが出る要因は他にありそうです。せっかくコメントいただいたので、詳細含め調べたらご報告します。

※※追記２　原因が分かりましたので、一番下へ追加記述と、勘違い部分は取り消し線を入れました。

#SwiftでのanimateWithDurationについて。
~~うまくいくデバイスと行かないデバイスがあって、~~公式サイトを読み砕く力もなく、行き詰まったので、Qiitaに書いてみる。

##やりたい事
UIViewをカスタマイズしたクラスを作る。
その中で、アニメーションを使用したい。
アニメーションはviewの中心位置を動かすという簡単な内容。

##記述コード
```lang:CustomView.swift
func moveView(){
  UIView.animateWithDuration(0.2,
    delay: 0.4 ,
    options: UIViewAnimationOptions.CurveEaseInOut ,
    animations: {
      self.center = CGPoint(x: 100,y: 100)
    },
    completion:{ finished  in
      self.center = CGPoint(x: 0,y: 0)
    }
  )
}
```
moveView()という関数を呼び出せば、このクラスを適用しているUIViewの中心位置が、デバイスの(x:100, y:100)という座標に0.4秒後に0.2秒かけて移動し、移動したあとは即座に(x:0, y:0)で表示される。という内容。

上記の記述で、

* iPhone 4s
* iPad 2
* iPad Retina
 
については、問題なく動く感じ。


* iPhone 5
* iPhone 5s
* iPad Air

~~はエラーがでる。~~（※※　エラー出ない。）

##~~エラーが出ない記述はこちら~~　（※※　似たようなコードはこちら）
```lang:CustomView.swift
func moveView(){
  UIView.animateWithDuration(0.2,animations: {
      self.center = CGPoint(x: 100,y: 100)
    },completion:{ finished  in
      self.center = CGPoint(x: 0,y: 0)
    }
  )
}
```
~~このコードだと、エラーは出ないけど、delayやoptionが設定できなくて、困る。~~（※※　困るのは、この記事を見て勘違いした人）

~~さて、どうしよう。。。~~

## 追加記述　2014/12/27/ 14:50
エラーの原因は実際にxcodeで書いているコードが下記の内容だったためです。

```lang:CustomView.swift
import UIKit
class CustomView: UIView {

  var x1:Float = 100
  var x2:Float = 0
  var y1:Float = 100
  var y2:Float = 0

  func moveView(){
    UIView.animateWithDuration(0.2,
      delay: 0.4 ,
      options: UIViewAnimationOptions.CurveEaseInOut ,
      animations: {
        self.center = CGPoint(x: self.x1,y: self.y1)
      },
      completion:{ finished  in
        self.center = CGPoint(x: self.x2,y: self.y2)
      }
    )
  }

}
```

移動先の値を整数値ではなく、Float型で渡していました。
ここが原因です。
つまり、CGPointへの引数の型として、Float型は渡せない。という事かな。

Double型、Int型なら使えそう。

###少し追記
Double型は iphone5で使えた。iphone4で使えない。
Float型は、iphone4で使えた。iphone5で使えない。
Int型は両方使えた。
AngularJSで上手に複数の$resourceの結果を受け取りたい

# AngularJSで上手に複数の`$resource`の結果を受け取りたい

画面に詳細情報とプルダウン項目を表示するような画面があって、このような情報を取ってくるサービスがあった場合、

```js
angular.module('app')
  .factory('service', ['$resource', function ($resource) {
    return {
      /** DBからプルダウン項目の内容を取得 */
      item: $resource('/api/item/:key', {key: '@key'}),
      /** DBから詳細情報を取得 */
      detail: $resource('/api/detail/:detailId', {key: '@detailId'})
    };
  }]);
```

`$q.all()`を使うことで複数のPromiseを待つことができます。

```js
$q.all([service.detail.get({detailId: $routeParams.detailId}).$promise,
        service.item.get({key: '00001'}).$promise,
        service.item.get({key: '00002'}).$promise])
  .then(function (result) {
    // 詳細情報
    $scope.detail = result[0];
    // 申請可否（プルダウン）
    $scope.okngList = result[1];
    // 可否理由（プルダウン）
    $scope.applyReasonList = result[2];

    $scope.loading = false;
  });
```

`then`に渡す`function`の引数に`$q.all()`に渡したpromiseの結果が入ってくるので、取り出すだけです。非常に便利です。


---
## 参考
https://docs.angularjs.org/api/ng/service/$q
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise
lazysizes



画像などを遅延読み込みをするlazyloaderが久々に必要になってナウいやつを探してたら見つけた。
[the ultimate and lightweigth lazyLoader](http://afarkas.github.io/lazysizes/)だそうです。つよそう。

軽く使って良さそうなのにあまり記事がなかったので個人的まとめ。

# 良いとこ
- ピュアな実装でjqueryなどフレームワークに依存していない
	- jquery.lazyloadあたり使いたいけどjqueryを入れねば、みたいな問題がない。
- レスポンシブ対応などが豊富
- プラガブルな実装
- 画像以外にもスクリプトやiframeにも対応しているよう
- Star数:2625（2014/12/27時点）。
- 作者はhtml5shivなどの作者らしい
	- https://github.com/aFarkas

# 悪いとこ

- initial commitが3ヶ月前(2014/10）でまだまだ枯れてない
- バージョンは0.6。まだベータ的扱いかも。
- testなどまだなさそう


# 使い方
[github](https://github.com/aFarkas/lazysizes)から大いに抜粋

## 基本
bowerなりnpmなりからリソースは落とすところは省略します。
(筆者はrailsプロジェクトでの利用だったので`rails-assets-lazysizes`を使いました。）

```html
<script src="lazysizes.min.js" async=""></script>
```
`script`のasyncは必須というわけではなさそうです。

### 普通のlazyloaderっぽい使い方

```html
<img src="placeholder.jpg" data-src="imageurl.jpg" class="lazyload" />
```
ふつうですね。
`<img class="lazyload">`というクラス指定で遅延対象を指定します。
対象とするクラス名は設定で変更可能（後述）

### レスポンシブ対応
未検証。
`srcset`をlazyにしてくれるみたい。
個人的に使ったことは無いけど使いどころありそう。

```html
<img data-srcset="responsive-image1.jpg 1x, 
responsive-image2.jpg 2x" class="lazyload" />
```
これを利用して[LQIP](https://github.com/aFarkas/lazysizes#lqip)という荒い画像を先行で読み込ませて遅延で高解像度に切り替えるという手法が紹介されています。

### 設定変更
`window.lazySizesConfig`に記載。

```js

window.lazySizesConfig = {
    lazyClass: 'postbone', // lazyloadの対象とするクラスの指定。
};

```

オプションはたくさんあるので詳しくは[このへん](https://github.com/aFarkas/lazysizes#js-api---options)
## プラグインの話
lazysizesは`lazybeforeunveil`というイベントを発火するため、これをフックすることで何がしかの処理をかませることが出来ます。
幾つか同梱されているプラグインはだいたいこのhookを利用しているようです。

```js
document.addEventListener('lazybeforeunveil', function(e){
    // 何らかの処理
}, false);
```

### 便利機能詰め合わせな[unveilhooks plugin](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/unveilhooks)
これscriptを遅延させたり動画を遅延させたり地味にいろんな機能があります。
背景画像なんかはよく使いたくなる割にドキュメントが奥のほうにあって見つけるの時間かかったりしたのではまった。

#### 背景画像
`unveilhooks`を読み込んで`data-bg`を使うだけ。

```html
<div class="bg lazyload" data-bg="http://cdn.qiita.com/assets/siteid-reverse-cd0519106e5814e34d402b3e821820cf.png"></div>

<script src="./lazysizes/plugins/unveilhooks/ls.unveilhooks.js"></script>
<script src="./lazysizes/lazysizes.js"></script>
```

### 他のプラグインざっくり
他のはあんまり触ってないのも多いのでドキュメント見つつ

- [RIAS plugin](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/rias)
	- responsiveな画像処理を外部サービスなんかに任せてしまうためのものらしい
	- `data-src="http://foo.com/img/{width}x{height}"`みたいな具合？
- [OPTIMUMX](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/optimumx)
	- スマホなどで最適なサイズを見つけているっぽいけどよくわからなかった・・・・
- [bgset plugin](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/bgset)
	- 背景に`srcset`的な動きをさせるもの。
	- 最初普通の背景のlazyにこっちを使ってしまったのでちょっと触った
	- [respimage](https://github.com/aFarkas/respimage)というpolyfillを使わないとchrome以外のブラウザなどでは動かない
	- そして体感たまに読み込み成功してくれない気がする（要調査）
- [include plugin](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/include)
	- htmlをパーシャル的にlazyでincludeするプラグインらしい。

- [print plugin](https://github.com/aFarkas/lazysizes/tree/gh-pages/plugins/print)
	- 印刷時に全部ロードするよーというものらしい。なるほど。

# まとめ
lazysizesとてもよいし未来を感じる。