OmniAICreator/Qiita-1.07M huggingface dataset:
PowerShell は配列の扱いでスピードが変わるらしい

[ブログからの転載](http://1bed.allright.life/?p=2089)

PowerShell で配列の扱い方でスピードが変わるらしい
あまり細かいことは良いから、実感が欲しかったので下記コードでテストした

## 検証コード

### += を使った
---
```ps1:検証コード1.ps1
Measure-Command {
    $hoge  = New-Object System.Collections.ArrayList
    foreach($i in 1..$max) {
        $hoge += ($i)
    }
}
```

### Add を使った
---
```ps1:検証コード2.ps1
Measure-Command {
    $hoge  = New-Object System.Collections.ArrayList
    foreach($i in 1..$max) {
        $hoge.Add($i)
    }
}
```

## 結果

### += を使った
---
| 回数 | かかった時間(ミリ秒) |
| --- | --- |
| $max = 100 | 23.6538 |
| $max = 1000 | 63.8938 |
| $max = 10000 | 2882.8444 |
| $max = 100000 | 336124.8685 |

### Add を使った
---
| 回数 | かかった時間(ミリ秒) |
| --- | --- |
| $max = 100 | 0.8989 |
| $max = 1000 | 8.9539 |
| $max = 10000 | 50.2974 |
| $max = 100000 | 245.2522 |
ruby extend self vs module_function

http://idiosyncratic-ruby.com/8-self-improvement.html

https://github.com/janlelis/idiosyncratic-ruby.com/commit/7923275d6bfce595c3f0a0f1d9eceaa6dae43800#commitcomment-11553416

```rb
module Foo
  def lala
    puts "lala"
  end
  module_function :lala #lala必需先定义
end

class Baz
  include Foo
end

Foo.lala
Baz.new.lala
```
ググったサイトを見ながら、RでSVMをやってみた。眼鏡の人とそれ以外の分類

# Background
探し物をしていたら、SVMのサイトに行き着いて、ちょうどソースが公開してあったので、試してみた。
眼鏡かけている人と眼鏡かけていない人の分類だった。

# Summary

1. 見つけたサイトを真似してR言語でSVMを使った分類してみた。(e1071)
1. R言語の画像処理ライブラリ(biOps)が古くなっていてCRANから外れていた。（でも動かせた）
1. オリジナルのソースの一部に不具合？があった。でも、あれこれやったら直った。
1. 画像の集め方は、Windows版のフリーソフトが簡単

感想
- 正解率 74% 画像の選び方など、あまり丁寧にやっていないけど、簡単なプログラムで、これだけできるってすごい。
- R言語でちゃんとしたスクリプトを動かすのは初めてだったので、いろいろ遠回りして勉強にはなった。
- 有名なライブラリがCRANから外れている。Rの書籍などでも使われているので、困る初学者が多そう。
- 画像の収集、以前はGoogleのAPIとかで自由にできたみたいだけど、今はImageSpider(Windows版のフリーソフトが簡単)
- R、遅い。でもライブラリやドキュメントは豊富。使い道次第。

References...１つだけ読むなら
1. http://www.slideshare.net/tojimat/tokyor-41?next_slideshow=1

# Details

### RとRStudioをインストール。
ソースをダウンロード。Reference 2 (Github)からソースをダウンロード。Rのファイル一つだけなので、直接Rstudioに貼り付けた。

環境は以下
R version 3.3.0 (2016-05-03) -- "Supposedly Educational"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin13.4.0 (64-bit)

RStudio
Version 0.99.902 – © 2009-2016 RStudio, Inc.

### ライブラリのインストール。
ライブラリが入っていなかったので、インストール。
e1071はCRANからインストールできたが、biOpsはメンテナンスされていないようで、CRANから外されていた。archiveにはtarballがあったので、それをインストール
（結局）Rのバージョンが上がって、古いライブラリが使えなくなったようだ。

### 画像用ディレクトリ作成
Reference 1に書いてあったが、画像ファイルがないので、そのままでは動かない。画像だけじゃなく、ディレクトリ構造もわからない。ソースを見ながらmkdir
ディレクトリ構造。

```
.
├── bin
├── data
│   ├── glasses
│   ├── no_glasses
│   ├── sample_glasses
│   └── sample_no_glasses
└── glasses_classifier.R
```
### とにかく動かしてみる（その１）

```
> library(e1071)
警告メッセージ: 
R graphics engine version 11 is not supported by this version of RStudio. The Plots tab will be disabled until a newer version of RStudio is installed. 
```
対応方法はわからないので、気にせず、そのまま進む。

### とにかく動かしてみる（その２）

‘cross’ must not exceed sampling size!
サンプル数が10以上ないとエラーになるらしい。
http://www.datasciencecentral.com/profiles/blogs/svm-in-practice

画像を集めてきて、先に進む。

ImageSpiderというWindows版フリーソフトがオススメ。
wgetとか、GoogleやBingのAPIとかより簡単。
http://www.vector.co.jp/soft/winnt/net/se425690.html

### とにかく動かしてみる（その３）

エラーが出た。

> TuneSVM(dataset, kRoughGammaRange, kRoughCostRange)
 svm.default(x, y, scale = scale, ..., na.action = na.action) でエラー: 
   外部関数の呼び出し (引数 10) 中に NA/NaN/Inf があります 
 追加情報:  50 件以上の警告がありました (最初の 50 個の警告を見るには warnings() を使って下さい) 

いろいろ探し回った結果、元のスクリプトの一部に不足があったみたい。
作者さんのところでは動いていたのかもしれないけど、自分の環境では動かなかった。

````
オリジナル: tunecontrol = tune.control(sampling="cross", nrow(dataset))
修正     : tunecontrol = tune.control(sampling="cross", cross = nrow(dataset))
````
Githubにライセンス表示がなかったので、問題の箇所だけ。
https://github.com/Salinger/glasses_classifier/blob/master/glasses_classifier.R

### 結果

| パラメータ         | 正解率(%)  |
|:------------------|:---------:|
| デフォルト         | 72.9      |
| グリッドサーチ（粗）| 74.9      |
| グリッドサーチ（細）| 73.6      |

画像の選び方など、あまり綺麗に統一していないのも一因かな？
簡単なプログラムで、これだけできるってすごい。

# References
1. http://www.slideshare.net/tojimat/tokyor-41?next_slideshow=1
2. https://github.com/Salinger/glasses_classifier/blob/master/glasses_classifier.R 
3. https://cran.r-project.org/web/packages/e1071/index.html
Scala + Play: heroku deploy（初期設定）

# 概要
ScalaのPlay frameworkアプリケーションをherokuにDeplayした時にはまったので、メモ

# 問題点
通常通り、アプリケーションを作成しherokuにdeployしたが、code=H10 アプリケーションがCrashしたなどと言われる。

# 問題点：詳細
logをよく見てみると以下のように書いてあるので、Application Secretを設定していないことが問題らしい。Play frameworkの公式サイトにも同様の解説を発見。（https://www.playframework.com/documentation/ja/2.3.x/ApplicationSecret）

[error] p.a.l.c.CryptoConfigParser - The application secret has not been set, and we are in prod mode. 

# 解決アクション

1. 以下でSecret keyを設定

heroku config:set APPLICATION_SECRET="（シークレットキー）" -a （アプリID）

2. 以下のようなProcfileをアプリケーションのrootに作成

web: target/universal/stage/bin/（小文字でアプリの名前）
-Dhttp.port=${PORT}
-Dplay.crypto.secret=${APPLICATION_SECRET} 

# 別の問題が発生
今度はdbに接続できない旨のエラー発生

Configuration error: Configuration error[Cannot connect to database [default]]

（編集中）
日本国内のFacebookボットまとめ


4/13にF8カンファレンスでFacebookがMessengerのチャットボットのプラットフォームを発表([記事](http://jp.techcrunch.com/2016/04/13/20160412agents-on-messenger/), [開発者向けドキュメント](https://developers.facebook.com/docs/messenger-platform))されてから、わりと時間がたち、日本でも実例がみうけられるようになってきました。

実際にFacebookボットを開発するときの参考にもなると思うので、いま出ている国内の実例をまとめてみました。実際、会話からキーワードを抽出して推薦するもの、条件を徐々に選ばせていくことで推薦するものなど、それぞれ特色があることに気づくかと思います。
ちなみに、ボットのリリースには審査が必要なので、何でもできるわけでは無いことをお忘れなく。

## 5/24 [Wantedly仕事相談ボット](http://m.me/wantedly)

[Wantedly](https://www.wantedly.com)の募集の中からチャットで仕事を探してくれる。

[![Kobito.Us8D6b.png](https://qiita-image-store.s3.amazonaws.com/0/6664/9f776de9-ba7e-5e97-084f-802cce16b40d.png "Kobito.Us8D6b.png")](http://m.me/wantedly)


- [日本経済新聞の記事](http://www.nikkei.com/article/DGXMZO02661890T20C16A5000000/)
- [TechCrunchの記事](http://jp.techcrunch.com/2016/05/24/wantedly-launches-bot/)
- [ASCII.jpの記事](http://ascii.jp/elem/000/001/167/1167131/)


## 6/2 [MEDLEY症状チェッカーbot](https://www.facebook.com/medleybot/)

症状を入れると問診形式で可能性のある病気を表示してくれる

![Kobito.182q03.png](https://qiita-image-store.s3.amazonaws.com/0/6664/48e4879b-93eb-f064-7f12-b67f7ec002aa.png "Kobito.182q03.png")


- [メドレーオフィシャルブログ](http://info.medley.jp/entry/2016/06/02/153948) 
- [THE BRIDGEの記事](http://thebridge.jp/2016/06/medley-release-symptoms-checker-bot)


## 6/3 [ヘヤジイ(ヘヤジン不動産オンライン店)](http://m.me/heyazine.online)

[HEYAGINE](http://heyazine.com/)の中から条件にあったお部屋を探してくれる。

[![Kobito.iEgqeU.png](https://qiita-image-store.s3.amazonaws.com/0/6664/70ba57a4-b2e8-93b6-070e-228fa47f2245.png "Kobito.iEgqeU.png")
](http://m.me/heyazine.online)


- [ランディングページ](https://chat.heyazine.com/) 
- [開発者ブログ](http://tech.itandi.co.jp/2016/06/heyasagashi_bot/)

## 6/14 [reluxトラベルボット](http://m.me/rlx.jp)

[relux](https://rlx.jp/)の中から条件にあった旅館・ホテルを選んでくれる。

[![Kobito.mDxVGB.png](https://qiita-image-store.s3.amazonaws.com/0/6664/698bf6a2-65ad-2a3d-1586-dae47039184e.png "Kobito.mDxVGB.png")](http://m.me/rlx.jp)


- [運営会社loco-partnersのリリース](http://loco-partners.com/2016/06/news/5135.html)
- [BITAデジマラボの記事](https://bita.jp/dml/relux_fbbot)
- [開発ブログ](http://loco-partners.hateblo.jp/entry/2016/05/23/100000)

## 6/21 [AI執事アルフレッド](http://m.me/aialfred)

シチュエーションにあわせたイケてるプレゼントを選んでくれる。プレゼントは楽天から探している模様。

[![Kobito.QvsD9R.png](https://qiita-image-store.s3.amazonaws.com/0/6664/6f7bd3d4-5f06-e30d-7c39-78ad89a19c94.png "Kobito.QvsD9R.png")](http://m.me/aialfred)


### お願い

追加、抜け漏れなどあればコメントで教えて下さい。編集リクエストでもOKです。画像はFacebookが推しているモバイルのViewで統一してます。

ちなみに、10個を超えたぐらいからは追うのがキツくなると思うのでフォローするのはやめようかと思ってます。
curl で SPARQL

curl で SPARQL Endpoint にリクエストを投げるパターンのおぼえがき。 SPARQL クライアントを使えない場合やバッチ処理の実行などに。

# 1. 基本

実行したい SPARQL Query をテキストファイルに保存して

```sparql.rq
select * where {?s ?p ?o.} limit 10
```

以下のように実行して JSON Results を得る。

```bash
$ curl -H 'Accept: application/sparql-results+json' --data-urlencode 'query@-' http://dbpedia.org/sparql < sparql.rq
{
  "head": { "link": [], "vars": ["s", "p", "o"] },
  "results": { "distinct": false, "ordered": true, "bindings": 
    [{ "s": {...}, "p": {...}, "o": {...} }] 
  }
}
```

この方法は [query via POST with URL-encoded parameters (SPARQL 1.1 Protocol)] (https://www.w3.org/TR/2013/REC-sparql11-protocol-20130321/#query-via-post-urlencoded) に準拠したエンドポイントを想定して POST リクエストを発行するものですが、[query via GET](https://www.w3.org/TR/2013/REC-sparql11-protocol-20130321/#query-via-get) の場合には以下のように `-G` オプションをつけることで GET リクエストを発行することも可能です。

```bash
$ curl -G -H 'Accept: application/sparql-results+json' --data-urlencode 'query@-' http://dbpedia.org/sparql < sparql.rq
```

# 2. 出力フォーマットの変更

* `-H 'Accept: xxxxxxxxxxxxx' ` の xxxxxx の部分を下の表の Content-Type で適宜置き換える
* Accept ヘッダを省略した場合は Endpoint のデフォルトフォーマットで返ってくるはず
* Endpoint は必ずしもすべての出力フォーマットに対応しているわけではないので注意
* csv / tsv の場合は `charset=UTF-8` のように出力エンコード指定も可能だが、Endpoint が対応していないことも

type|Content-Type
-------|-------
json|application/sparql-results+json
xml |application/sparql-results+xml
csv |text/csv
tsv |text/tab-separated-values


# 3. クエリーの指定

## インライン

* 短いクエリーなら `query=...` のように直接 SPARQL を書いても OK

```bash
$ curl -H 'Accept: application/sparql-results+json' --data-urlencode 'query=select * where {?s ?p ?o.} limit 10' http://dbpedia.org/sparql
```

## ファイル

* `--data-urlencode` オプションに `query@{filename}` と指定すると query パラメータの値としてファイルの中身が展開される
* 冒頭の `query@-` は標準入力を展開する、の意味

```bash
$ curl -H 'Accept: application/sparql-results+json' --data-urlencode 'query@sparql.rq' http://dbpedia.org/sparql
```

# 4. 参考
* [curl --data-urlencode option](https://curl.haxx.se/docs/manpage.html#--data-urlencode)
* [SPARQL 1.1 Protocol](https://www.w3.org/TR/sparql11-protocol/)
* [SPARQL 1.1 Query Results JSON Format](https://www.w3.org/TR/sparql11-results-json/)
* [SPARQL Query Results XML Format (Second Edition)](https://www.w3.org/TR/rdf-sparql-XMLres/)
* [SPARQL 1.1 Query Results CSV and TSV Formats](https://www.w3.org/TR/sparql11-results-csv-tsv/)
BATファイルで、テキストファイルの2行目以降を取り出す方法

こんなファイルがあって

```text:a.txt
aaa aa
bbb bb
ccc
```

このファイルから2行目以降を取り出したい(_awk 'NR>1'_ したい)というときのやり方。


```bat:test.bat
@echo off

setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%a in (a.txt) do @if "!HEAD!"=="" (set HEAD=%%a) else echo %%a
```

```text:実行結果
bbb bb
ccc
```
BATファイルで、テキストファイルの1行目だけを取り出す方法

こんなファイルがあって

```text:a.txt
aaa aa
bbb bb
ccc
```

このファイルから1行目だけを取り出したい(_head -1_したい)というときのやり方。

```bat:test.bat]
@echo off

for /f "usebackq tokens=*" %%a in (a.txt) do @set HEAD=%%a&goto :exit_for
:exit_for

echo %HEAD%
```

```text:実行結果
aaa aa
```
runScript() のwithParametersバグとその回避・代替案

`runScript()`でオプション`withParameters`を使用すると原因不明のエラーが発生する。詳細は不明だが`run()`の返値の型が問題だと推測される。原因は何であれ現状はこのバグを回避するには例外処理するか`doShellScript`と`osascript`コマンドを代替とする。

```js:foo.scpt
app = Application.currentApplication()
app.includeStandardAdditions = true

argv = ['hoge', 'fuga']
scpt = '/path/to/script/bar.scpt'

// パラメーターを渡すと返値が発生。エラーとなるので例外処理で回避。
// bar.scptからの返値は扱えない。
try { app.runScript(scpt, {withParameters: argv}) } catch(e) {}

// パラメーターも意図通りに渡せて返値も取得可能。
app.doShellScript(`osascript "${scpt}" ${argv.join(' ')}`)
```

```js:bar.scpt
function run(argv) {
  $.NSLog('%@', JSON.stringify(argv))
  return argv
}
```
grpc-java で HTTPS を使うための設定

gRPC は Google が公開しているオープンソースの RPC ライブラリです。gRPC は通信プロトコルに HTTP/2 を採用していますが、セキュアに通信したいときは HTTPS を利用することができます。しかし grpc-java には HTTPS を使う場合のサンプルコードがなく、若干ハマりがちです。健康で文化的な最低限度の設定を共有します。

## 設定
基本的には公式のドキュメント [SECURITY.md](https://github.com/grpc/grpc-java/blob/master/SECURITY.md) が参考になります。

### OpenSSL 依存性の設定
以下の Maven パッケージへの依存をビルド定義に記述します。

*  `io.netty » netty-tcnative-boringssl-static » 1.1.33.Fork17`
*  `io.netty » netty-codec-http2 » 4.1.0.CR4`

ここでは簡単のために tcnative static を使いましたが、dynamic との違いについては [SECURITY.md#TLS with OpenSSL](https://github.com/grpc/grpc-java/blob/master/SECURITY.md#tls-with-openssl) を読んでください。

### サーバーの設定
```java
NettyServerBuilder.forPort(port)
  .useTransportSecurity(
    new File("/path/to/your/certificate"),
    new File("/path/to/your/private-key")  // 秘密鍵は PKCS8 形式
  ).addService(...)
  .build()
  .start();
```

### クライアントの設定
```java
NettyChannelBuilder.forAddress(host, port)
  .sslContext(
    GrpcSslContexts.forClient().trustManager(new File("/path/to/root-ca-certificate")).build()
  ).build();
```

`SslContext` の生成には `io.netty.handler.ssl.SslContextBuilder` を使わず、`GrpcSslContexts` を使ってください。これは、gRPC サーバーが受け入れる cipher suite の利用を強制するために必要な設定です。

## テスト
動作確認するとき、手元に正しい SSL 証明書があれば問題ありませんが、ない場合は [grpc-go のリポジトリ](https://github.com/grpc/grpc-go/tree/master/testdata)からテスト用の証明書・秘密鍵・ルートCA証明書を借りてくると楽です。証明書の CA の検証が行われるので、 `openssl x509 -text -in grpc-go/testdata/server.crt` で Subject Alternative Name を調べ、 `/etc/hosts` に設定しておきましょう。
【WordPress】記事にGoogleMapsを挿入する(プラグインSimple Map使用)

#【WordPress】記事にGoogleMapsを挿入する(プラグイン使用)

***記事の中にGoogleMapsを挿入する場合、いい感じのプラグインがあります。
以下の記事は[作成者様のサイトを参考にしました](https://firegoby.jp/wp/simple-map)***

・記事の中でこのプラグイン特有の指定方法でGoogleMapsを挿入していきます。
３パターンの指定方法と、挿入枠の縦横の大きさや、ズーム状態などのオプションが設定できます。

・指定方法その1(]の前にスラッシュを入れないとその後のマップが消える)
[map addr="東京都中央区東日本橋2-15-4"/]

・指定方法その2
[map]東京都中央区東日本橋2-15-4[/map]

・指定方法その3（緯度経度で指定）
[map lat="35.693651" lng="139.785482"]緯度経度で指定[/map]

・幅と高さを指定
[map width="400px" height="300px"]東京都中央区東日本橋2-15-4[/map]

・地図の倍率を指定
[map zoom="18"]東京都中央区東日本橋2-15-4[/map]

他にもGoogleAPIで持ってる機能が色々使えるみたいです。

こんな感じで、記事を書いてみます。
![qiita06221.png](https://qiita-image-store.s3.amazonaws.com/0/97158/aee37024-a4a8-36ca-eaa4-1a13e2a42c7b.png)

記事を公開すると、
![qiita06222.png](https://qiita-image-store.s3.amazonaws.com/0/97158/5a508cbf-ce84-595c-9a89-68540bf94660.png)
![qiita06223.png](https://qiita-image-store.s3.amazonaws.com/0/97158/70a560ba-6c6b-5a83-d7eb-656147a69741.png)

![qiita06225.png](https://qiita-image-store.s3.amazonaws.com/0/97158/1d890a5c-6145-9c93-7d3c-b1995e8d8f46.png)


こんな感じで、それぞれ指定した通りに表示されました！
Objective-Cで、`self = [super init]`の次の一行を書き替えたら圧倒的に楽になった話


既に行っておられる方には「なにをか言わんや」的な話ではあるけれど、swiftとの互換性のため、コンストラクターの定義が、	`- (id)` から、`- (nonnull instancetype)`に変わった（より正確には推奨になった）。

## 基本的には無いけど、コンストラクト失敗もあり得るよね？

ってな訳で、コンストラクターの書き方を`- (nonnull instancetype)`で書いてて、「これ、コンストラクト失敗したらどないすんねん」って思ったのがきっかけで、お約束な次の書き方

```objective-c
- (instancetype) init
{
	self = [super init]
	if (self) {
		// 変数の初期化など
	}

	return self;
} // end - (instancetype) init
```

の、`if (self)`を `if (!self)`に書き替えてみた。
結果、

```objective-c
- (nonnull instancetype) init
{
	self = [super init];
	if (!self)
		@throw [NSException exceptionWithName:(以下略)];

	// 変数の初期化など

	return self;
} // end - (nonnull instancetype) init
```
という書き方になり、不具合があれば例外をthrow、本来の処理はそのままに、（本来処理中で例外が発生すれば、別途throw）と、コードが非常にロジカルにすっきり書ける事に気がついた。

## も一つ嬉しい事に

このお陰で、インスタンス作成部分を必ず`@try~@catch`ブロックで囲むようになり、いつどの様な例外処理をすべきかをより意識してコーディングできるようになるというメリットもある。
よろしければお試し下さい。
別のPCにEC2の秘密鍵を複製してログインする方法

1. 秘密鍵ファイルをDropboxに上げる。
2. Dropboxでリンクを作成し、そのリンクをコピーする。
3. wget https://www.dropbox.com/hoge/id_rsa_neoneobeam_svr.pub?dl-1
4. chmod 600 秘密鍵のファイル名
5. ssh -i でEC2に接続
6. Dropboxに上げた秘密鍵ファイルは削除する。

参考サイト
http://qiita.com/noir_neo/items/60532baaf051f91f3013
VagrantとVirtualBoxのVMとの関連が切れた時の対処法

# 環境

Mac OS X EI Capitan
Virtualbox 5.0.20
Vagrant 1.8.1

# 状況

VirtualBox上ではVMが表示されているのに、`vagrant status`とやると、`not created`になることが、たまにある

```
$ vagrant status
Current machine states:

default                   not created (virtualbox)
```

# 対処法

対象のVMのUUIDを調べる

```
$ VBoxManage list vms
...
"hoge" {xxxxxxx-xxxx-xxxx-xxxx-xxxxxx}
```

ファイル「.vagrant/machines/default/virtualbox/id」に、上記で取得したUUID({}で囲まれた部分)を記述

```
$ echo xxxxxxx-xxxx-xxxx-xxxx-xxxxxx > .vagrant/machines/default/virtualbox/id
```

vagrantのステータスが変わっていることを確認する

```
$ vagrant status
Current machine states:

default                   running (virtualbox)
```


# 参考

- [[vagrant] vagrant up で起動するVMを変更する](http://programming-log.tumblr.com/post/93483342252/vagrant-vagrant-up-%E3%81%A7%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8Bvm%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)
- [vagrantからVirtualBoxが起動出来なくなる問題の解決方法](https://gyagya1111.blogspot.jp/2015/05/vagrantvirtualbox.html)
macOS プリインストール日本語フォント追加の歴史

ここ最近のmacOSはバージョンアップごとに日本語フォントが追加されていますが、どのバージョンで追加されたのかを網羅的に一覧できるページが見つからなかったので、まとめてみることにしました。  


先日のWWDCにて発表があったように、OSXは次のバージョンからMacOSになります。
この文書の作成段階では正式リリースはまだの為、タイトルは**OSXプリインストール日本語フォント追加の歴史**にしようかと迷いましたが、数ヶ月したら変更されるので、OSXだとmacということがわかりづらいので、このタイトルにしました。

抜けや間違いがありましたら、ご指摘下さい。



---
### Mac OS X v10.0
*Cheetah*  

- ヒラギノ角ゴ Pro W3
- ヒラギノ角ゴ Pro W6
- ヒラギノ角ゴ Std W8
- ヒラギノ明朝 Pro W3
- ヒラギノ明朝 Pro W6
- ヒラギノ丸ゴ Pro W4

[参考リンク：Wikipedia ヒラギノ#Mac での使用]
(https://ja.wikipedia.org/wiki/ヒラギノ#Mac_.E3.81.A7.E3.81.AE.E4.BD.BF.E7.94.A8)

---
### Mac OS X v10.5
*Leopard*
 
- ヒラギノ角ゴ ProN W3
- ヒラギノ角ゴ ProN W6
- ヒラギノ角ゴ StdN W8
- ヒラギノ明朝 ProN W3
- ヒラギノ明朝 ProN W6
- ヒラギノ丸ゴ ProN W4
 
[参考リンク：Wikipedia ヒラギノ#Mac での使用]
(https://ja.wikipedia.org/wiki/ヒラギノ#Mac_.E3.81.A7.E3.81.AE.E4.BD.BF.E7.94.A8)

---
### OS X v10.9
*Mavericks*

- 游明朝体 M
- 游明朝体 DB
- 游ゴシック体 M
- 游ゴシック体 B

[参考リンク：OS X Mavericks：字游工房のOpenType Pr6フォント「游明朝体 M/DB」「游ゴシック体 M/B」が追加された]
(http://www.macotakara.jp/blog/mac_os_x/entry-21555.html)

---
### OSX v10.11
*El capitan* 

- クレー
- 筑紫A丸ゴシック
- 筑紫B丸ゴシック
- 游明朝体+36ポかな
- ヒラギノ角ゴシック W0
- ヒラギノ角ゴシック W1
- ヒラギノ角ゴシック W2
- ヒラギノ角ゴシック W3
- ヒラギノ角ゴシック W4
- ヒラギノ角ゴシック W5
- ヒラギノ角ゴシック W6
- ヒラギノ角ゴシック W7
- ヒラギノ角ゴシック W8
- ヒラギノ角ゴシック W9

[参考リンク：【El Capitan】Macに新たな「日本語」フォントが仲間入り！デザインを美しくしよう(CSS指定方法有)] (http://dblog.hrgrweb.com/osx-new-fonts)  

[参考リンク：Wikipedia ヒラギノ#Mac での使用]
(https://ja.wikipedia.org/wiki/ヒラギノ#Mac_.E3.81.A7.E3.81.AE.E4.BD.BF.E7.94.A8)

---
### macOS v10.12
*Sierra*  

- 凸版文久ゴシック Pr6N R
- 凸版文久ゴシック Pr6N DB
- 凸版文久見出しゴシック StdN EB
- 凸版文久見出し明朝 StdN EB
- 凸版文久明朝 Pr6N R
- 游教科書体 ミディアム
- 游教科書体 ボールド
- 游教科書体 横用 ミディアム
- 游教科書体 横用 ボールド
- 游明朝体 エクストラボールド
- 游明朝体+36ポかな エクストラボールド

[Apple、macOS 10.12 Sierraに「凸版文久ゴシック」や「游教科書体」などの11フォントを追加。](http://applech2.com/archives/macos-10-12-sierra-jp-font.html)
Django1.9 で表示される言語を切り替える

#環境
Ubuntu 14.04.4 LTS
Python 3.5.1
Django 1.9.7

#前提条件
- [Django 1.9 で国際化対応](http://qiita.com/gsd/items/5cddb2b1a205702bd8a9)が完了していること


以下の手順を行うことで、
`http://hoge.com/ja/huga` で日本語
`http://hoge.com/en/huga` で英語
等の切替を行うことができます。

#手順

##urls.pyの変更

- path/to/project/project/urls.pyに以下を追記

    ```python:urls.py
    from django.conf.urls.i18n import i18n_patterns
    ```

    ```python:urls.py
    urlpatterns += i18n_patterns('',
        # admin ページの言語を切り替えたい場合
        url(r'^admin/', include(admin.site.urls)),

        # myapp という app の言語を切り替えたい場合
        url(r'^myapp/', include('myapp.urls', namespace='myapp')),
    )
    ```

これだけで、言語の切替ができるようになります。
railsでgithubみたいな確認ダイアログを簡単に設定する方法

railsで`data: {confirm: "本当に削除しますか？"}`と指定すると、chromeの場合、こんな感じの確認ダイアログが表示されます。
<img width="422" alt="スクリーンショット 2016-06-22 17.45.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/93394/a9453b8d-22a4-5b15-9d18-7a206c70e5e3.png">

これにgithubみたいな確認ダイアログを簡単に適用する方法です。
<img width="572" alt="スクリーンショット 2016-06-22 17.53.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/93394/0f1533b6-d77d-e5c5-ddc9-228af76b78f0.png">

# bootstrap適用

そもそもbootstrapが使えないといけないので、`bootstrap-rails`gemを使います。

```rb:gemfile
gem 'bootstrap-sass'
```

```bash
$ bundle install
```

`application.css`を`application.css.scss`に名前を変更します。

```rb:app/assets/stylesheets/application.css.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

###もしくは

下記のコードをapplication.html.erbのheadタグ内に挿入するだけでもいけます。
<a href="http://getbootstrap.com/getting-started/" target="_blank">Bootstrap CDN</a>

```html+erb:app/views/layouts/application.html.erb
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
```

# gemのdata-confirm-modal適用

確認ダイアログにbootstrapを適用するgemの設定をしていきます。

```rb:gemfile
gem 'data-confirm-modal'
```

```bash
$ bundle install
```

```rb:app/assets/javascripts/application.js
// = require data-confirm-modal
```

application系のファイルを編集したので、サーバー再起動をしましょう。

```bash
# ctrl + c
$ rails s
```

# viewの設定

viewで設定していきます。というか何も設定しなくても適用されます！

```html+erb
<%= link_to 'Delete', product, method: :delete, data: {confirm: 'Are you sure?'} %>
```

<img width="646" alt="スクリーンショット 2016-06-22 18.05.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/93394/e4b10f79-324e-b8f9-6055-bf2a335f9fd8.png">

#オプション

titleで確認ダイアログのタイトルの文字列を指定できます。
cancelではキャンセルボタンの文字列を指定できます。
commitでは削除ボタンの文字列を指定できます。
varifyとvarify_textで、githubのようにvarify_textで削除するための条件文の記載、削除する場合にはvarifyで指定した文字列の入力をしなければ、削除できないような設定ができます。

```html+erb:hoge.html.erb
<%= link_to 'destroy', product, method: :delete, data:
   { confirm: "本当に<strong>#{product.title}</strong>を削除してよろしいですか？",
　   verify: "#{product.title}",
　   verify_text: "削除する場合は商品名を入力してください",
　   cancel: "やめる",
　   commit: "削除する"}, title: "削除の確認" %>
```

<img width="692" alt="スクリーンショット 2016-06-22 18.03.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/93394/94634bac-fee8-2cce-869e-be9cef47b9d7.png">

これだけで設定できるなんて簡単ですね！
【論文シリーズ】ウェーブレット分解とRNN

## 原文
[ウェーブレット分解による高度に動的な時系列の長期予測のための混合RNN (Composite Recurrent Neural Networks for Long-Term Prediction of Highly-Dynamic Time Series Supported by Wavelet Decomposition)](http://goo.gl/YD8TSK)
Pilar Gomez-Gil, Angel Garcia-Pedrero* and Juan Manuel Ramirez-Cortes (2011)


## 1. 要約／背景
* HWRN(Hybrid and based-on-Wavelet-Reconstructions Network)という混合モデルは、56ステップ先の時系列予測まで耐えうる学習能力を持つ。
* ウェーブレット理論が、NNの修正(活性化関数として)と、学習データの前処理に使われる。

## 2. 骨子の理論
(1)基本のRNN
小規模な全結合RNN(SRNN)が使われる。

```math
\frac{dy_i}{dt}=-y_i + \sigma(x_i) + I_i
```
ここで、$x_i$は、他の$m$個の出力層からの再帰的インプットを表す。
$I$は、外部入力を表す。
この式を以下の形に近似する。

```math
y_i(t + \Delta t) = (1 - \Delta t)y_i(t) + \Delta t \sigma(x_i(t)) + \Delta tI_i(t)
```

![151201002949_3.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/e39611fc-04e7-9f4b-a16a-529b42950947.jpeg)


(2)学習ステップの外観
１学習次系列の前処理と(Wavelet分解された)信号の再構成の生成
２SRNNの学習
３HWRNの学習

前処理については、シグモイド関数の適用のために、[0,1]の範囲に正規化、ないし線形変換する必要がある。

```math
z_t = lb + \frac{x_t - \min({\bf x})}{\max({\bf x}) - \min({\bf x})}(ub - lb)
```

(3)Wavelet関数
複雑な時系列を、離散的な規則性のある関数に分解する。入力ベクトルをFilter Bankとよばれる分解フィルタに通して、様々な再帰頻度(frequency)の関数に分解する。
低頻度の規則性は、いわば長期周期とも解釈できるので、このような関数の特定が、長期予測の特徴策定に繋がる。



## 3. モデル適用例
NN5とよばれる複雑時系列モデルを使って、予測精度を比較した。
NN5は、ベンチマークとしてよく使われるモデルである。
誤差の計算は、対称的絶対平均値誤差百分率(SMAPE)とよばれる指標を使った(もちろん低いほうが精度がいい)。
全結合RNNが61%, 順伝播型NNが49%なのに対し、HWRNは26%という高い精度を叩きだした。
ロールバックしたオブジェクトをもっかいsaveしようとした話

タイトル通り、はっきり言って特殊なケースの話。

もっかいはうまくいかない

```rb
piyo2 = nil
ActiveRecord::Base.transaction do
  piyo1 = Piyo.find_by(id: 1)
  piyo1.name = 'hoge'
  piyo1.save!
  piyo2 = Piyo.find_by(id: 2)
  piyo2.name = 'foo'
  piyo2.save!
  raise ActiveRecord::Rollback
end
piyo2.save! # ログをみるとBEGIN COMMITは発行されているがSQLが発行されてない
piyo2.name # fooのままだが、DBはfooになってない
```

もっかい`find_by`からやりなおし

```rb
piyo2 = nil
ActiveRecord::Base.transaction do
  piyo1 = Piyo.find_by(id: 1)
  piyo1.name = 'hoge'
  piyo1.save!
  piyo2 = Piyo.find_by(id: 2)
  piyo2.name = 'foo'
  piyo2.save!
  raise ActiveRecord::Rollback
end
piyo2_retry = Piyo.find_by(id: piyo2.id) # もっかい取り直そう
piyo2_retry.update!(name: piyo2.name)
```
Accord.NETによる線形回帰の実装

# 線形回帰
* 予測式はy=ax+bの形
* 一つの説明変数と一つの目的変数の関係を予測する。
* 式の形の通り、説明変数と目的変数の間に一次関数の関係があると仮定して予測を行う

# Accord.NETによる実装
double[] inputs = {80, 60, 10, 20, 30};
double[] outputs = {20, 40, 30, 50, 60};
var regression = new SimpleLinearRegression();
regression.Regress(inputs, outputs);
var y = regression.Compute(85);
var a = regression.Slope;
var b = regression.Intercept;

# 実行結果
![image](https://qiita-image-store.s3.amazonaws.com/0/13817/4a8361e7-8397-401a-ca49-aacd9ee84f04.png)
[PDCAアプリを作る] ②PDCAアプリの定義とデータ構造


スマホでPDCAサイクル実行を目的としたアプリです。
「pocketPDCA」:https://openlist.sakura.ne.jp/cord/
iTunes : https://itunes.apple.com/jp/app/pocketpdca/id1175913707?mt=8
youtube:https://www.youtube.com/watch?v=IXzjpDS4K7c&t=2s
![screen696x696.jpeg](https://qiita-image-store.s3.amazonaws.com/0/118986/c1183b64-aa97-f4b1-a0c5-83fc1e2cda30.jpeg)

（当ドキュメントについて)
ionicでのアプリ作りをqiitaに書きながら開発しようとしていたPDCAアプリですが、アジャイル的にtry&errorでの開発を行ったため、開発段階を順序良く書くことができませんでした。
ionicの情報が少なかったのでqiitaに書こうと思っていましたが、
個人的な開発出会った都合や、ドキュメント化できず残念です。

今回「pocketPDCA」にはかなり工夫して様々なionicのUIを実装しました。
また当然cordovaやjavascriptの様々なライブラリを使っています。(AIは未搭載)　

しかしマテリアルUIは初版は放棄しましたし、AI,音声系、まだまだできることが色々あります。googleのアプリなどを見ているとionicのuiは古いなーとも思っています。
一応形にした結果、ionicやスマホアプリの世の中の情勢について複雑な心境です。

ionicは優秀なライブラリです。ハイブリッドでは間違いなく一番でしょう。
しかしangularのバージョンupに合わせて、ionicはv2を超えv3,v4とバージョンレスへと移行してします。なんとなくV1が一番理解が容易ですが、やはり日本語の情報がないだけ日本には利用者の母数が極端に少ないのでしょうか。
日本人はハイブリッドは欲張りなことを嫌いがちなのでしょうか?英語のせいでしょうか？

とりあえずこの「PDCAアプリを作る」ドキュメントは一旦終結しようと思います。

========================
:one: PDCAとは以下の略語です。
>P : plan　計画
D : do　実行
C : check　　検証
A : action　再実行

世の中は常に変化しています。人生もビジネスも一回性です。
常に新しいものを吸収してゆくエンジニアの仕事は定常的なサイクルで行うものではない、という考えの方が違和感がないと思います。
一方、世の中には「もっといいクルマ作ろうよ」のTOYOTAの「改善」に代表されるように、一定の役割の中で仕事のやり方を変えてよい方法を実行して行こう、という考え方も多くあります。PDCAの定義や使い方は人それぞれ意見が分かれるところですが、言葉は知っていてもうまく利用しずらいフレームワークかも知れません。
しかし私自身もそうですが、日常的に「またやってしまった」のような同じ悩み、同じ考え方を繰り返して困っている人も多いと思います。どれだけイメージしてもどのように受け止められるかはわかりません。ただあまりそういうアプリが見当たらないが為に、「とりあえず気軽にPDCAを回せるアプリを作ってしまおう」、ということです。 :sunglasses: 

:two: PDCAのフロー

今回PDCAアプリを作るにあたり、次のようなアプリと定義して進めて行きます。
(行き詰ったら変更します)

[考え方]
>1.target : 目的、目標を設定する。
いついつまでにこういう状態にする。

>2.plan : targetを実現するための実施計画を立てる。
   期限付きのtodoリストのようなものか。

>3.do : doボタンでサイクル実行。planに沿って実行する

>4.check : planの終了日が来たら、振り返りを施すアラートを出す。結果と改善点を記入する。

>5.action : 結果や改善点を取り入れた、新しいプランにプランを修正する。pdcaの２サイクル目を実行する。

>上記、2〜5が繰り返す。PDCAサイクルをサポートする。

:three: PDCAの画面と機能
1.target 
>ターゲット一覧（実行中、終了）
ターゲット作成、修正
メール送信

2.plan
>プラン一覧（実行中、終了）  →  プラン詳細,プラン作成、修正
メール送信

3.action
>今日実施すべきプラン(todoリストのようなもの)
メール送信

4.スライドメニュー項目
>target -> target一覧
plan -> plan一覧
action -> 今日の実施項目
アプリについて -> 使い方,バージョン,サポート情報

とりあえず、この程度の画面と機能を持ったアプリでプロトタイプを作ってみよう。(結局、コーディングしてプロトタイプを見せないと文書でイメージは伝わらないと思いますが）

:four: PDCAのデータ構造
一見、P,D,C,Aそれぞれテーブルを持つのかと思っていましたが、
データ構造を具体的に考えたところ、targetと従属するplanの２テーブルで実現できそうでした。planテーブルにサイクル回数を持たせることでcheckの機能を内包します。
(面倒なのでER図は書きません)

1.target
>id : targetid
 タイトル : title
 内容 : targettext
 開始日 : startday
 終了日 : endday
 予備1 : reserve1
 予備２ : reserve2
 タイムスタンプ : timestamp

2.plan
>id : planid
ターゲットid : targetid
タイトル : title
内容 : plantext
開始日 : startday
終了日 : endday
カテゴリ（仕事、個人、家庭、、）　: category

●check時に２サイクル目にあたる新しいplanレコードを作り、改善点などを入力する。
元のplanidと内容を引き継ぎ、idsycleを増やして区別する。

>サイクル数 : sycleid
結果 : checktext1
良かった点 : checktext2
課題、改善点 : checktext3
予備1 : reserve1
予備２ : reserve2
タイムスタンプ : timestamp

テーブルの内容はとりあえず、こんなところで良いだろうか。？
アジャイルなのでプロトタイプを作って動かすまでわかりません。

以上、②PDCAアプリの定義とデータ構造　でした。次は実装です。
ngRepeatで複数選択削除を実装する


・レコード一覧画面があります
・テーブル行のそれぞれにチェックボックスがあります
・選択されたものを一括削除します

っていうのをAngularJSでやろうとしたらハマったのでメモ。
なおソースは必要な部分だけ掻い摘んで書いてるのでコピペしても動きませんよろしく。

``` js:controller.js

$http({
	method : 'POST',
	url : 'hoge/list',
	data : {
		
	}
}).success(function(data, status, headers, config) {
	$scope.hogeList=data.hogeList;
}).error(function(data, status, headers, config) {

});

```

``` php:HogeController.php

class HogeController extends AppController
{
	public function list(){
		$hogeList=Set::extract('/Hoge/.',$this->Hoge->find('all'));
		return json_encode(compact('hogeList'));
	}
}

```

``` php:Hoge.php

class Hoge extends AppModel
{
	public $virtualFields = array(
		// これ
        'checked' => 0
	);
}

```

ﾊﾞｰﾁｬﾙﾌｨｰﾙﾄﾞでcheckedとか一個追加します。
これを書くとng-repeat内でcheckedが利用できるようになります。

``` html:view.html

<tr ng-repeat="hoge in hogeList">
	<input type="checkbox" ng-model="hoge.checked" />
</tr>

```

CakePHPのいつものノリで`checked[]`とか作ろうとしたら動かなくて動かなくて、`checked[$index]`とかでも動かないのでハマってました。
ngModelの動的作成はできないってことですかねえ……上記ソースで動かすと$scope.hogeList配列のhogeレコードのcheckedに反映されます。
全件削除は結局このhogeListをまるごとPHPにぶん投げて実装する形にしてその後仕様変更で消えました。南無。

あとngChecked使って全件チェックを実装しようとしたらngCheckedで切り替えた個別チェックボックスの値はモデルに反映されなくてここでもハマってたんですが上記の通り仕様変更で消えました。
【論文シリーズ】Lyapunov型学習アルゴリズム

## 原文
[複合系の適用制御のためのLyapunov型動的NN (Lyapunov-Based Dynamic Neural Network for Adaptive Control of Complex Systems)](http://www.scirp.org/journal/PaperDownload.aspx?paperID=18569)
Farouk Zouari, Kamel Ben Saad, Mohamed Benrejeb (2012)

## 1. 要約／背景
* 複合的かつ動的なデータ系において、入力データによる重みの調整がすぐに行われるような学習プロセスを開発した。
* Lyapunov型学習アルゴリズムをRNNに応用した。


## 2. 骨子の理論
(1)想定しているRNNモデル
隠れ層への入力データは次の6パターン
１. 前ステップの教師データ
２. $n_a$ステップ前の教師データ
３. $(n_a + 2)$ステップ前の隠れ層
４. $(n_a + n_b + 1)$ステップ前の隠れ層
５. １ステップ前の出力値
６. $n_c$ステップ前の出力値

入力層のデータの次元を$n_r$とすると、
$$n_r = n_a + n_b + n_c$$

![151130234406_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/127228/7b8d2516-b708-d0da-dc6c-e44575291cb3.jpeg)


(2)Lyapunov型学習アルゴリズム
重みの更新は次の式に基いて、行う。

```math
w(k+1) = w(k) + \frac{\lambda}{\gamma} \Bigg(\frac{1}{1 + \frac{\beta}{\gamma}||\frac{\partial \hat y(k)}{\partial w(k)}||^2}\Bigg) e(k)\frac{\partial \hat y(k)}{\partial w(k)}
```
ただし、

```math
0 < \lambda \leqq \gamma \leqq \beta \\
e(k) = y(k) - \hat y(k)
```

パラメータ$\lambda$、$\beta$、$\gamma$は、系のNNが安定化するように決定される。
安定化は、モデルと実際の値の誤差を元に評価する。評価関数は**Lyapunov関数**と言われ、

$$V(t) = \frac{1}{2}(e(t))^2$$

と表される。

(3)重みの"調整"式

```math
w(k+1) =  \Bigg(1-\frac{1}{2\big(1 + ||\frac{\partial \hat y(k)}{\partial w(k)}||^2\big)}\Bigg)w(k) \\
+ \frac{1}{2\big(1 + ||\frac{\partial \hat y(k)}{\partial w(k)}||^2\big)}e(k)\frac{\partial \hat y(k)}{\partial w(k)}
```

(4)モメンタムを加える場合は、次の式になる。

```math
\begin{align}
w(k+1) &=  \Bigg(1-\frac{\alpha}{2\big(1 + ||\frac{\partial \hat y(k)}{\partial w(k)}||^2\big)}\Bigg)w(k) \\
&+ \frac{\alpha}{2\big(1 + ||\frac{\partial \hat y(k)}{\partial w(k)}||^2\big)}e(k)\frac{\partial \hat y(k)}{\partial w(k)} \\
&+ (1-\alpha)\Delta w(k)
\end{align}

```

(5)複合系におけるパラメータの調整

```math
\begin{align}
wc(k+1) &= \Bigg(1-\frac{\alpha}{2\big(1 + ||\frac{\partial \hat y(k)}{\partial wc(k)}||^2 + ||\frac{\partial u(k-1)}{\partial wc(k)}||^2\big)}\Bigg)wc(k) \\
&+  \frac{\alpha}{2\big(1 + ||\frac{\partial \hat y(k)}{\partial wc(k)}||^2 + ||\frac{\partial u(k-1)}{\partial wc(k)}||^2\big)} e_c(k)\frac{\partial \hat y(k)}{\partial wc(k)} \\
&+ (1-\alpha)\Delta wc(k)
\end{align}
```

$wc$は、各層のニューロンをコントロールする重みベクトルである。

```math
wc = [wc_{11}^1,...,wc_{n_hn_r}^1,wc_{11}^2,...,wc_{n_h1}^2,\\
wc_{11}^3,...,wc_{1n_h}^3,wc_{11}^4,wc_{11}^5,\\
...,wc_{1n_r}^5,wc_{11}^6,...,wc_{n_hn_r}^6,wc_{11}^7]^T
```
React（JSX）をES6で書くときに気をつけること

React初心者がJSXで開発するときに気づいたことを五月雨に…。
ドキュメントを読んだり、いろんな記事を読んだりするなかで、
自分なりに解釈したので、間違っていることも多数あるかと思いますが備忘録的に。


## コンポーネントのライフサイクル

DOM要素が読み込まれる（更新する）前は、componentWillMount（componentWillUpdate）、
DOM要素が読み込まれた（更新された）後は、componentDidMount（componentDidUpdate）。

* **コンポーネントがマウントされたとき**
componentWillMount → componentDidMount

* **コンポーネントのpropsが変更されたとき**
componentWillReceiveProps  

* **コンポーネントのstateが変更されたとき**
componentWillUpdate → componentDidUpdate  

* **コンポーネントがアンマウントされるとき**
componentWillUnMount

参考: [Component Specs and Lifecycle](https://facebook.github.io/react/docs/component-specs.html)

## propsとstate
数字、文字列、配列等結構なんでも代入できます。便利。
使い分けについて、様々な意見があるかとは思いますが、
stateは、変更されたら自動的にrenderが走り、DOMが再描画される。
propsは、変更されても自動的にrenderが走ることはない。という点で使い分けてみています。

#### props
propsは、コンポーネントがマウントされていないときに、コンポーネントに対して値を設定できる。
設定していたpropsを変更する場合、componentWillReceiveProps で、props変更後の処理を記述できる。

#### state
stateは、コンポーネントがマウントされているときに、
イベント等によって、コンポーネントの状態を変化させ、自動的にrenderを再読み込みする。



## render

### renderの中でif文
カッコが多いのでコピペ用

```
{(() => {
　　if(this.state.view === 'top') {
     return (
       <Top/>
     );
 }
})()}
```

### イベントを定義するときは、bind(this)
onClickなどイベントを定義するときは、constructor内でbind(this)で定義する

```
constructor(props, context) {
 super(props, context);
 this._clickItemHdl = this._clickItemHdl.bind(this);
}
```
参考: [Refactoring React Components to ES6 Classes](http://www.newmediacampaigns.com/blog/refactoring-react-components-to-es6-classes)

### classはclassName
理解してはいるものの、つい忘れがち…。

```
<li>
  <a href="javascript: void(0);" onClick={this._clickItemHdl}>テスト1</a>
</li>
```

### styleはキャメルケースで{{}}2つずつ
とはいえ、Material-uiのインラインスタイル以外は、classNameでクラスを定義して、
CSSで記述する方が無難かと思います。

```
<li style={{fontSize: '20px',
            color: 'pink',
            marginBottom: '20px'
}}>
  <a href="javascript: void(0);" onClick={this._clickItemHdl} >テスト2</a>
</li>
```

### renderで返すことができるのはDOM1つだけ
renderに定義できるテンプレートは、DOM要素1つだけです。

たとえば、コンポーネントが複数並列に並ぶような、次のようなコードは動きません。

```
render() {
    return (
      <Header />
      <Main />
      <Footer />
    );
  }
```

回避するためには、これらを何かの要素（div）等で囲むことが必要です。

```
render() {
    return (
　　　　　　　　　　　　<div>
        <Header />
        <Main />
        <Footer />
     </div>
    );
  }
```


### 閉じタグを忘れずに
img要素で忘れやすいです。

```
<img src="hoge/hoge.jpg" />
```


##Reactで開発してよかったなと思ったこと
### 1つのJSXにDOMテンプレートと、機能を両方まとめてかける
HTMLとjQueryを使用して実装する場合、HTMLにDOM要素を記述し、JavaScriptで機能を定義する必要がありました。
Reactの場合、読み込まれるDOMと、それに付与される機能を1つのJSXにまとめられるため、コンポーネントのカプセル化できました。
FlashAir から ftp を使ってアップロードするときのftp serverのモードについて

# 概要

[FlashAir Developers - Lua機能 - FTPを使ったファイルのアップロード](https://flashair-developers.com/ja/documents/tutorials/lua/4/) を使ってファイルをftp でアップロードしようとしたが、できなかったので、原因を調べた

# 結論

PASVモードならうまくいった。

# 調査の過程

ftpサーバーには、コマンドラインからアクセスできることは確認していた。
次にftpのサンプルで作られた、アドレスをブラウザに入力してもアクセスできなかった。

# 現在の状況

これを使った


* [m-creations/docker-openwrt-ftp: An ftp container based on OpenWRT (http://openwrt.org)](https://github.com/m-creations/docker-openwrt-ftp)


```
docker run -p 21:21 -it --rm -e FTP_USER=ftpuser -e FTP_PASS=ftppass -e HOST=yourhost -p 65000-65004:65000-65004  -e PASV_MIN_PORT=65000 -e PASV_MAX_PORT=65004 mcreations/ftp
```

今後はこっちのほうがよいかもしれない

* [10MBのftpd (vsftpd)イメージを改良した - Qiita](http://qiita.com/tukiyo3/items/a81353fa6862727bf8a6)

# 今後の課題

volume をホスト側にだせるかをテストする。

# 参考

* [FlashAir Developers - Lua機能 - Lua関数リファレンス](https://flashair-developers.com/ja/documents/api/lua/reference/#FTP)
intra-mart(resin)のjmx情報をモニタリングする。logstashで。

# 概要

intra-martが動いているResinのjmx情報をモニタリングしたい。

resin-adminやJConsoleがあるじゃないか、という意見を振り切って、敢えてLogstashでやる例。

試した環境は以下の通り。

|アプリケーション|バージョン|
|---|---|
|Resin|4.0.48|
|Logstash|2.3.3|

# Logstashの準備

Logstashをelastic社のサイトからダウンロードしておく。インストールそのものの手順は簡単なので割愛。

## logstash-input-jmxのインストール

標準では入っていないようなので、jmxを取得するプラグインをインストールします。

```
logstash-plugin install logstash-input-jmx
```

## jmxを取得する用の設定ファイルの準備

任意の場所にフォルダを作って、適当にファイルを作ります。

面倒なので、binフォルダ以下にjmx というフォルダを作り、server_a.jmx　としました。
hostやport、usernameなどは適当に読み替えてください。


もし、複数台のサーバを監視するのであれば、server_b.jmx, server_c.jmx・・・server_x.jmxなどと複数のファイルを設定したフォルダの下においてください。

portの値は後述するresin.propertiesの中で指定した値になります。
今回はメモリとRuntimeの値を取ってみることにします。
取得できる値の種類は、resin-adminなどで、java.langの下を見ながらやると良いと思います。OperatingSystemとかを見るとCPUの値もとれます。（それは、metricbeatでいいじゃん、という話もあります）

```
{
  "host" : "192.168.1.1",
  "port" : 9999,
  "username" : "",
  "password": "",
  "alias" : "innova-20x",
  "queries" : [
  {
    "object_name" : "java.lang:type=Memory",
    "object_alias" : "Memory"
  }, {
    "object_name" : "java.lang:type=Runtime",
    "attributes" : [ "Uptime", "StartTime" ],
    "object_alias" : "Runtime"
  }]
}
```

## logstash用設定ファイルの準備

logstash用の設定ファイルを作成します。
ここは、シンプルに標準出力に取得した値を出すようにしてみます。

jmxの中でpathを指定していますが、ここに先に用意したjmxを取得する用の設定ファイルがある**フォルダ**を指定します。
ファイルパスを直接指定するとエラーとなるので注意してください。

```
input {
    jmx {
	path => "./jmx"
	polling_frequency => 15
	type => "jmx"
	nb_thread => 1
    }
}

output {
    stdout { codec => "rubydebug" }
}
```

# resinの準備

## resin.propertiesの編集

resin.propertiesに外からjmxの値を取れるように穴をあけます。
開発用途として、認証もsslも外しています。

|設定|値|
|:--|--:|
|com.sun.management.jmxremote| |
|com.sun.management.jmxremote.port | 9999 (jmxの設定ファイルで使用する)|
|com.sun.management.jmxremote.local.only | false （外部からつなぐので）|
|com.sun.management.jmxremote.authenticate| false (今回は認証をつけていない) |
|com.sun.management.jmxremote.ssl|false|

記載例はこちら。

```
# Arg passed directly to the JVM
jvm_args  : -Xmx6144m -XX:MaxPermSize=1536m -Xloggc:log/gc.log -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
jvm_mode    : -server
# jvm_args  : -Dfile.encoding=UTF-8
```

resin.propertiesの編集後は、resinを再起動しておきます。


# logstashの起動

logstashを起動して、jmxの値をコンソールに出してみます。指定間隔（今回は15秒間隔）でコンソールが流れていれば成功！

```
logstash -f <作成したlogstashの設定ファイル>
```

![logstash.png](https://qiita-image-store.s3.amazonaws.com/0/111676/57e5d2a3-2c37-7398-6bfb-cbb902a6169d.png)


# おまけ

outputにelasticsearchを入れて、kibanaで見てやると、ダッシュボードもすぐ作れる予感。

![Kibana.png](https://qiita-image-store.s3.amazonaws.com/0/111676/67b18143-b086-3b07-99fa-0e7aa187e5e4.png)

Heapのサイズをグラフにしてみる例。

![jmx   Kibana.png](https://qiita-image-store.s3.amazonaws.com/0/111676/a1f1d3d2-5feb-54df-691f-a95ce6fa2e50.png)


jmxの数値と、ユーザのアクションログを組みあわせて可視化すると、夢が広がりんぐ。

お後がよろしいようで。
PHPの挙動メモ

自分用で、挙動確認とかしたやつのメモ。

## array_intersect

[https://3v4l.org/8ig5r](https://3v4l.org/8ig5r)

```php
<?php
$a = [1,2,2,3,3,3,4,4,4,4];
$b = [2,3,5];

var_dump(
    array_intersect($a, $b), // [2,2,3,3,3] 
    array_intersect($b, $a)  // [2,3]
);
```

## filter_

```php
<?php
var_dump(filter_var_array(
    ['a' => 0],
    [
        'a' => [
            'filter' => FILTER_VALIDATE_INT,
            'options' => [
                'default' => 1,
                'min_range' => 1
            ],
        ],
        'b' => [
            'filter' => FILTER_VALIDATE_INT,
            'options' => [
                'default' => 0,
                'min_range' => 0,
            ],
        ],
    ]
));
/*
array(2) {
  ["a"]=>
  int(1)
  ["b"]=>
  NULL
}
*/
```

## if文の式が、代入の式

[https://3v4l.org/v4TYG](https://3v4l.org/v4TYG)

```php
<?php

if ($t = true) { // 入る
    echo 'true assignment '.PHP_EOL;
}
if ($f = false) {
    echo 'false assignment'.PHP_EOL;
}
if ($zeroString = '0') {
    echo 'string "0" letter '.PHP_EOL;
}
if ($zeroAStringCastToInt = (int)'0a') {
    echo 'cast to int witch string "0a"'.PHP_EOL;
}
if ($zeroA = '0a') { // 入る
    echo 'string "0a" letters'.PHP_EOL;
}
if ($oneAStringCastToInt = (int)'1a') { // 入る
    echo 'cast to int witch string "1a"'.PHP_EOL;
}
```
magitの差分表示で行内の違いを色付けする

magit で差分表示したときに、今いる hunk 内で行内の違い（空白の違いも含め）に色付けする設定

```el
;; 今居るhunkの行内の差分に色付けする
(setq magit-diff-refine-hunk t)
;; 空白の差を無視しない
(setq smerge-refine-ignore-whitespace nil)
```

![magit-diff-refine-hunk.png](https://qiita-image-store.s3.amazonaws.com/0/64323/177b1747-53cf-47f9-4d88-f58991c1b192.png)


上の設定だとカーソルが居るhunkのみ色付けされることに注意。magit-diff-refine-hunk に 'all を指定すれば全てのhunksに色付けが適用される。
rails normal hash to  ActiveSupport::HashWithIndifferentAccess

```rb
Loading development environment (Rails 3.1.1.rc1)
1.9.3-p551 :001 > a = {"a" => 1, "b" => 2}.with_indifferent_access
 => {"a"=>1, "b"=>2} 
1.9.3-p551 :002 > a[:a]
 => 1 
1.9.3-p551 :003 > a[:n]
 => nil 
1.9.3-p551 :004 > a[:b]
 => 2 
1.9.3-p551 :005 > a.class
 => ActiveSupport::HashWithIndifferentAccess 
1.9.3-p551 :006 > exit
```

也就是通过string或者symbol都可以访问hash的value了
何度も忘れちゃうAWSアカウントIDをawscliで確認する方法

アカウントIDって覚えてないですよね・・・確認のためにManagement Consoleへアクセスするのはダルい。
ましてやMFA有効にしてたら余計に・・・

毎回ググッてしまうこのコマンドを忘れないように書いておきます。

```
$ aws sts get-caller-identity

{
    "UserId": "xxxxxxxxxxxxxxx",
    "Arn": "arn:aws:iam::012345678901:user/test",
    "Account": "012345678901"
}
```

そして、またググッてこの記事がヒットすることを祈る。

## update 2017/12/20
[awscli-aliases](https://github.com/awslabs/awscli-aliases)というものを使うともっとシンプルになります！

```
$ aws whoami
{
    "UserId": "xxxxxxx",
    "Account": "xxxxxxx",
    "Arn": "arn:aws:iam::xxxxxx:user/foo"
}
```

profileにも対応してます。

```
$ aws whoami --profile demo
{
    "UserId": "xxxxxxx",
    "Account": "xxxxxxx",
    "Arn": "arn:aws:iam::xxxxxx:user/bar"
}
```
R・Pythonコーディングルールのリンクまとめ

## Rコード規約
* Rコーディングルールについて

http://rstudio-pubs-static.s3.amazonaws.com/85463_ab84b5964c4c4c129d8601dc495b4e51.html

## pythonコード規約　
* Pythonコーディングルールについて

http://pep8-ja.readthedocs.org/ja/latest/
* Pythonコーディングチェックツールのインストールについて(sublimeで対応している?)

http://goo.gl/uBSxRx
rails源码 让new method变成私有方法

```rb
class Test
  private_class_method :new
  
  def self.test
  	new(1,2,3,4)
  end

  private
  def initialize(*a)
  	puts a
  end
end

Test.test
```

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/schema_dumper.rb#L9

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/schema_dumper.rb#L21

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/schema_dumper.rb#L44-L48
Cookieとかセッションとか【メモ】

# Cookie
* クライアント側にデータを送信して、ブラウザに保存させる
* 大きなデータは保存できない(大体8kb)
* クライアントから見える→第三者による書き換えが簡単
* クライアント側のみに保存するため、サーバのメモリやディスク消費はない
* 同じドメインのサイト単位で送信するので、ページ間でのデータ共有が実現できる
* 有効期限がある(設定可能)
* 有効期限がない場合はブラウザを閉じると失くなる(**セッションCookie**)
* 有効範囲が設定できる

## 仕組み
サーバからクライアントへ、`Set-Cookie:名称=データ`というヘッダ情報を送信する。
次のそのサーバへアクセスした場合に、Cookieを送信データに追加してアクセスする。

# セッション
* サーバ側にデータを保存する
* ユーザーごとに用意されるサーバ上のデータ保存領域
* クライアントから見えない→第三者による書き換えが難しい
* 大量のデータを保存できるが、メモリやディスク容量によってはパフォーマンスが悪化する
* 一定時間利用されなかった場合、保存領域を開放する(時間は設定可能)→DBのように永久的に保存するわけではない

## 仕組み
アクセスしてきたクライアントごとに**セッションID**というランダム文字列を渡して、クライアントを識別
セッションIDごとにデータの保存領域を割り当てる。

# Cookieとセッションの使いみちはどうすべき？？
両方とも一時的な保存領域なので、重要な情報はなるべく持たせない(消えても影響度が低い情報を持たせる)のがいいのかな……？
tsharkとawkでパケット数とペイロード総量を算出

こういう小技は普段使わないせいですぐ忘れてしまうからメモ。

たとえば、`xx.xx.xx.xx:xxx -> 192.168.0.20:12345`というUDPトラフィックをざっくりキャプチャしてあるとして、この中から特定のフロー`192.168.0.10:xxx -> 192.168.0.20:12345`について、そのパケット数とペイロードを算出したい、という場合の手順。

### 手順

```
# tcpdump -s0 -w /tmp/udp.pcap udp port 12345

# tshark -r /tmp/udp.pcap -T fields -e data.len "ip.src==192.168.0.10"|awk '{pkts+=1; bytes+=$1} END {print "packets=", pkts, "bytes=", bytes}'
packets= 21734 bytes= 22255616
```

### 仕組みのメモ

やっていることは単純。`-T fields -e XXX`で特定のフィールドだけを表示させることができる。たとえば

```
# tshark -r /tmp/udp.pcap -T fields -e data.len -c 3
1024
1024
1024
```
とか

```
tshark -r /tmp/udp.pcap -T fields -e ip.src_host -c 3
192.168.0.10
192.168.0.11
192.168.0.10
```
regtest環境をリセットするスクリプト

Mac環境の場合です。
Linux環境の場合は、rmするファイルパスを変更してください。


```zsh:bitcoin-reset-reg.sh
#!/bin/sh

bitcoin-cli -regtest stop
sleep 1

rm -rf ~/Library/Application\ Support/Bitcoin/regtest

bitcoind -regtest -daemon

echo "wait 5 sec | generate blocks..."
sleep 5
bitcoin-cli -regtest generate 101
echo "done."
```
jQuery スクロールに合わせ画像表示(eachで複数一括設定)

🍺🍺🍺
はてなブログはじめました。
http://sudara-bluse.hatenablog.com/entry/2017/10/27/013435
🍺🍺🍺


画面を下にスクロールしていくと、
ちょうど良いところでふわっと要素が表示されるよくあるやつ。

いちいち一つ一つ

```js:hoge.js
// スクロール値が400超えたらfadeIn
if($(window).scrollTop() > 400){
  $("#img").fadeIn();
}
```

のように指定するのは大変なので、
eachを使って、良い感じのとこでfadeInする一括指定コードメモ。


```js:hoge.js
// ターゲットを非表示にしとく
$(".target").css("visibility","hidden").css("opacity","0");

// .targetのついた画像をスクロールに合わせfadeIn
$(window).on("load scroll resize", function(){
    $(".target").each(function(){
        var imgPos = $(this).offset().top;
        var scroll = $(window).scrollTop();
        var windowHeight = $(window).height();
        if (scroll > imgPos - windowHeight + windowHeight / 5){
            // ここに処理を書く
            $(this).css("visibility","visible")
            $(this).animate({opacity: 1}, 300);  
        }
    });
});
```

便利
[nginx] ngx_mruby で html 内の http を https に置換

サイトを SSL 化した後で、コンテンツ内の URL を全部 https に置換するのってめんどくさいですよね。
ngx_mruby の mruby_output_filter 使えば一括置換できます。

```rb:ssl_filter.rb
# このスクリプトが動くミドルウェアのチェック
if server_name == "NGINX"
  Server = Nginx
elsif server_name == "Apache"
  Server = Apache
end

# アクセスされたホスト名と送信する content type を取得
v = Server::Var.new
host = v.http_host
ctype = v.sent_http_content_type

# content type が text/ ならば http://{サーバ名}/ を https://{サーバ名}/ に置換
if ctype =~ /^text\//
  f = Server::Filter.new
  content = f.body
  f.body = content.gsub /http:\/\/#{host}\//, "https://#{host}/"
end
```

```text:*.conf
server {
  -- snip --

  location / {
    -- snip --

    # ngx_mruby により text/ 内の http を https に置換
    mruby_output_body_filter /path/to/ssl_filter.rb cache;
  }
}
```
現行バージョンの ngx_mruby には [chunked で送られてくるレスポンスに対するバグ](https://github.com/matsumoto-r/ngx_mruby/issues/172#issuecomment-227674821)があるので注意
Git for Windows だってきれいな差分を見たい

## うらやましい
[Git2.9のキレイなdiffを出すためのconfig](http://qiita.com/takyam/items/d6afacc7934de9b0e85e)

## Git for Windowsでも(無理やり)やりたい

1. [Git for Windows](https://git-for-windows.github.io/) を2.9へアップデート

1. githubからdiff-highlightのソースを落としてくる
https://github.com/git/git/tree/master/contrib/diff-highlight

1. %USERPROFILE%AppData\AppData\Local\Programs\Git\usr\bin に diff-highlight として保存

1. [Git2.9のキレイなdiffを出すためのconfig](http://qiita.com/takyam/items/d6afacc7934de9b0e85e) に従って .gitconfig の設定

## 問題
- なんかdiffが重い
- 次回Git for Windowsを更新したら…

公式の対応待ちが吉ですかねぇ
React + flux + gulp の開発環境を作ってみた

今まで使っていたgulp環境に、React+fluxで開発する環境を構築したので、まとめておきます。
Material-uiを利用することで、高速でWebアプリケーションが構築できるようになりました。

## 主要なJavaSctipt/CSSフレームワーク
* [React](https://facebook.github.io/react/)
* [React Router](https://github.com/reactjs/react-router)
* [flux](http://facebook.github.io/flux/)
* [Material-ui](http://www.material-ui.com/#/)

## JS/CSSの記述を行う
* ES6
* [Stylus](http://stylus-lang.com/)

## ビルド環境
* [gulp](http://gulpjs.com/)
* [Babel](https://babeljs.io/)

## 文法・構文チェック
* [ESLint](http://eslint.org/)
* [Stylint](https://www.npmjs.com/package/stylint)
* [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript)

## 参考
[10年のツケを支払ったフロント界隈におけるJavaScript開発環境（2016年4月現在）。 - 日々、とんは語る。 (id:tomoya / @tomoyaton)](http://d.hatena.ne.jp/tomoya/20160403/1459665374)
React + OnsenUI for Reactの基本コンポーネント① (Page・Button編)

# 概要

* OnsenUIはアシアル社が開発している、パフォーマンス向上 + スマホUIの提供を行うハイブリットアプリ制作のフレームワーク。

* 今までOnsenUIでハイブリットアプリを開発する際は、OnsenUI 1.x(AngularJS 1.xベース)で開発していましたが、Reactでも書きたかった為、OnsenUI 2.x(OnsenUI for React)の各種ReactComponentの使い方についてまとめる。 

* Reactの復習も含め、丁寧に理解したかった為、2,3個のComponent毎に記事を作る。

![fully-independent.png](https://qiita-image-store.s3.amazonaws.com/0/129216/1b9a3b85-f4d7-c3d7-39b4-fa2f9fd84b8d.png)


# Component

まずは、今回作成したソースです。

```js:src/button.jsx

import React from 'react';
import ReactDOM from 'react-dom';
import { Page, Button } from 'react-onsenui';

export default class TodosApp extends React.Component {
  render() {
    return (
      <Page>
        <Button
          modifier="material"
        >
        Tap Me!
        </Button>
      </Page>
    );
  }
}
```


## Page Component

OnsenUI 1.x の\<ons-page>にあたるコンポーネントです。
\<Navigator>, \<Splitter>, \<Tabbar>などの画面の構成を行うコンポーネントの子コンポーネントとして存在します。

Pageコンポーネント内で、&lt;ToolBar&gt;を利用したい場合は、
Pageコンポーネントのpropsとして、renderToolbar(fn)を記載します。
(モーダルバージョンのrenderModal(fn)も存在します。)

```js:page.jsx
...
  render() {
    return (
      <Page
        renderToolbar={() =>
          <Toolbar>
            <div>Title</div>
          </Toolbar>
        }
      >
      </Page>
    );
  }
...
```

### Props

PageComponentはイベントドリブンで、ページ変化にともなってイベントを取ることが可能です。
イベントの記述もPageコンポーネントのpropsに記載します。

|Props|Description|
|-----|-----------|
|modifier|Props値を変更して見た目を変更する。|
|renderToolbar={fn}|PageにToolbarをrenderする。|
|renderModal={fn}|PageにModalをrenderする。|
|onInit={fn}|PageがDOMに生成された後に一度だけ発火。|
|onShow={fn}|Pageが画面に現れた後に発火。|
|onHide={fn}|Pageが画面から消えた後に発火。|

各Componentには**[modifier]**というpropsが存在します。
modifierを変更すると、OnsenUIにpresetで入っているスタイルなどが反映されます。
大抵のmodifierはOptionalですが、上手くつかえばiOSとAndroidの切り替えなど、
イメージ通りのUIがすぐに作ることができます。

### Modifier

|Modifier|Description|
|--------|-----------|
|material|マテリアルデザイン風にページを変更|


## Button Component

次はButtonコンポーネントです。
OnsenUI 1.xの\<ons-button>にあたるComponentになります。

### Props

|Props|Description|
|-----|-----------|
|modifier|Props値を変更して見た目を変更する。|
|disabled|Disabled状態に変更する。|
|ripple|waveEffectを掛ける。|
|onClick={fn}|クリックした際にコールバックを実行する。|

### Modifier
modifierを変更する事で、様々なボタンを表現する事が可能です。

|Modifier|Description|
|--------|-----------|
|outline|外の線のみの背景が透明のボタン|
|light|目立たないボタン|
|quiet|外の線もなく、背景も透明なボタン|
|cta|目立つボタン(明度が上がります)|
|large|大きなボタン|
|large--quiet|大きく、外線もなく、背景も透明なボタン|
|large--cta|大きく、目立つボタン|
|material|マテリアルデザインのボタン|
|material--flat|外の線もなく、背景も透明なマテリアルデザインのボタン|


# 終わり

ReactNativeに感度がありましたが、もう少し仕様が固まってからにしようと思い、
OnsenUI 2.xに先に取り掛かりました。

AngularベースのOnsenUI 1.xでのアプリ開発を経験している人であれば、
OnsenUI 2.x自体にはスムーズに入っていく事が可能だと思います。

続きは次回。

-P.S.-
OnsenUIのOnsenの由来は、
【Onsen -> SPA(スパ) -> Single Page Application】
から来ているそうです。
なかなかの尖り具合で、おもしろいです。

# リンク

* [【本家】Onsen UI for React](https://onsen.io/v2/docs/guide/react/index.html)
* [【本家】PageComponent](https://onsen.io/v2/docs/react/Page.html)
* [【本家】ButtonComponent](https://onsen.io/v2/docs/react/Page.html)