OmniAICreator/Qiita-1.07M huggingface dataset:
Rails5を入れる

# 導入環境
ruby 2.3.3
OS:Mac(Sierra)

# 手順
rubyのバージョンを確認

```sh 
$ ruby -v 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin16]
```

rails5用のプロジェクトを作成する

```zsh
$ mkdir rails_5_demo
$ cd rails_5_demo
```

bundle initする

```zsh
$ bundle init
Writing new Gemfile to /Users/hiromichi.ema/development/myApps/rails_5_chat/Gemfile
```

Gemfileでraisのバージョンを指定する。
（今回は5.0.0.rc1を利用）

```zsh
$ emacs Gemfile
source "https://rubygems.org"
gem 'rails', '>= 5.0.0.rc1', '< 5.1'
```

bundler を使ってrailsプロジェクトを生成!

```zsh
$ bundle exec rails new . # ← 対象ディレクトリに入れるので. をつける。
 exist
 create  README.md
 create  Rakefile
 create  config.ru
 create  .gitignore
 conflict  Gemfile
Overwrite /Users/hiromichi.ema/development/myApps/rails_5_chat/Gemfile? (enter "h" for help) [Ynaqdh] Y # Gemfileを上書きしてもいいので、Yを選択
 force  Gemfile
 create  app
 create  app/assets/config/manifest.js
 create  app/assets/javascripts/application.js
 create  app/assets/javascripts/cable.js
 create  app/assets/stylesheets/application.css
 create  app/channels/application_cable/channel.rb
 create  app/channels/application_cable/connection.rb
 create  app/controllers/application_controller.rb
 create  app/helpers/application_helper.rb
 create  app/jobs/application_job.rb
# ...略
Installing sass-rails 5.0.6
Bundle complete! 15 Gemfile dependencies, 62 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted # 完了

```

rails server起動

```zsh
$ bundle exec rails s
=> Booting Puma
=> Rails 5.0.0.1 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.6.2 (ruby 2.3.3-p222), codename: Sleepy Sunday Serenity
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

localhost:3000にアクセス！

![test](https://gyazo.com/1a5d7951732504dc198867016664d0ca.png)

できた！
Mackerel駆動開発のすすめ

[Mackerel Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mackerel) の20日目です。

#Mackerel駆動開発とは
「Mackerel駆動開発」なんて大きく書いてますが、端的に言うとシステムを新しく開発する時にはまずMackerelでサービスとロールを作ってから始めましょう。どうせ監視するんだしMackerelに合わせちゃおう、という話です。


Mackrelのサービスとロールについては以下を参照してください。
[サービス、ロールを作成する](https://mackerel.io/ja/docs/entry/howto/create-services-and-roles)


#まずはサービスを作る
サービスはホストをまとめる単位ですので、作ろうとしているシステムの名前などにすると良いです。``例:ECsystem``

#次にロールを作る
次にサービスの中にロールを作りましょう。ロールはその名の通りでサービス内でホストを役割ごとにまとめて管理することができます。``例:app,db``

#そして開発を始める
開発を進めていく過程でサーバが出来たらMackerel-agentをインストールしてサービスとロールをどんどん設定していきます。こうすることで開発が進んでいくとMackerel上でホストが増えていき進捗具合が整理できます。またシステムに必要なモノをシンプルなサービスとロールの概念に落とし込んで構成を考えることができるのでオススメです。
selenium-java-3.0.1でFireFoxが動かなったときにやったこと（geckodriver）

##環境
OSX 10.１１.6
Eclipse neon

##事象
Selenium WebdriverのEclipse環境を構築するため、[こちら](http://qiita.com/keigo1450/items/77db6df3845c991dc346)の記事が非常にわかりやすかったので難なく環境は出来たのですが、いざFireFoxを動かそうとするとエラーが発生して困りました。

##エラー内容

```
Exception in thread "main" java.lang.IllegalStateException:
 The path to the driver executable must be set by the webdriver.gecko.driver 
system property; for more information, see https://github.com/mozilla/geckodriver. 
The latest version can be downloaded from https://github.com/mozilla/geckodriver/releases
・・・
```

##対処
「geckodriverないぞ」とのことなので、geckodriverなんて聞いたことないけどまあそう言われてるんだから素直に探そうということで、下記に行き着き素直にMac用のをダウンロードしました。

[https://github.com/mozilla/geckodriver/releases](https://github.com/mozilla/geckodriver/releases)

そしてJavaのシステムプロパティでPATHを通します。

```
System.setProperty("webdriver.gecko.driver", "/（geckodriverの格納場所）/geckodriver");
```

そして再実行すると、、、

##結果
無事動きました。
素直って大切ですね。
今更はじめる無償版開発環境 Visual Studio Community 2015

# てっとり早く知りたい方へ
今現在（2016/12/22）```Visual Studio 2015 Update 3```(```Version 14.0.25431.01 Update 3```) が最新版のようです。
以下よりダウンロードできます。
https://www.visualstudio.com/ja/downloads/
（~~```"vs_community_JPN__1054620396.1482116048.exe"```がダウンロードされるかと思います。~~失礼しました。環境によって違うようですね(12/23)）

Professionalなどエディションの比較を知りたい方は、上記リンクの一つ手前のページであるこちらへ
[Visual Studio Community - Visual Studio](https://www.microsoft.com/ja-jp/dev/products/community.aspx)

isoイメージをダウンロードしたい場合、以下よりダウンロードできるようです。
[Download Microsoft Visual Studio Community 2015 from Official Microsoft Download Center](https://www.microsoft.com/ja-JP/download/details.aspx?id=48146)
<font color=red>※注：試行錯誤していた途中で見つけたものですので、実際にこちらからのインストールは試していません</font>


なぜか英語版の画面が表示されるという方は、urlに ja が付いているかを確認してください。（英語で表示されるのでurlにjaは付かないと思いますが、重要なポイントです）

また、インストール途中で「セットアップパッケージが欠落しているか、破損しています」が表示された場合、気にせず「パッケージをスキップする」を選択してください。（原因や解決方法はまだわかっていませんが、その後しっかりと使えています）

# インストールに失敗したなどの場合
以下の記事で自分の環境で発生した問題についての対処を記載しています。
（はてなブログ）[Visual Studio Community 2015 のインストールがうまくいかない](http://rrryutaro.hatenablog.com/entry/2016/12/18/233835)

とにかく、うまくインストールできなければ旧バージョンのVisual StudioやRedistributableと付くものをアンインストールして上記よりダウンロードしたファイルからインストールすればうまくいくはずです。
それなりに時間がかかるのでご注意ください。

# インストールが完了したら
無事インストールできれば、Visual Studioを起動してヘルプの「Microsoft Visual Studio のバージョン情報」で次のような感じでひょうじされているかなと思います。
```バージョン：Version 14.0.25431.01 Update 3```
![alt](https://cdn-ak.f.st-hatena.com/images/fotolife/r/rrryutaro/20161222/20161222154051.png)

以上
GitHubやBitbucketのユーザー名を変更する方法とその後やること

なんとなく決めたユーザー名を長年使っていたものの、気に入らなくなってきたので変えました。変更自体は簡単ですが、その後の処理はやはり大変です。

githubは少し親切で、旧ユーザ名が別のユーザーに取得されるまではリポジトリをリダイレクトしてくれます。bitbucketはそれがないため、すべてのローカルリポジトリに対して変更を行う必要があります。

# githubユーザー名の変更
プロフィール写真 -> settings -> account -> change username（環境が英語のため）
### 本当に良いの？
<img width="480px" src=https://qiita-image-store.s3.amazonaws.com/0/98466/de595a4e-ab0b-25aa-0a8f-846fb3e304ba.png>
### 変更画面
<img width="480px" src=https://qiita-image-store.s3.amazonaws.com/0/98466/8cdc8207-be7e-15d1-bbe5-5f2d1b3e0a2c.png>

# Bitbucketユーザー名の変更
プロフィール写真 -> Bitbucket settings -> Bitbucket profile settings -> Username (change)
### 変更画面
<img src=https://qiita-image-store.s3.amazonaws.com/0/98466/c39de4ec-85b1-e4f4-694e-26ed49ee858c.png>

# 変更後にやること
old_nameからnew_nameに変更したとして

```shell-session
# これを
$ git remote get-url origin
git@bitbucket.org:old_name/repository.git

# こうして
$ git remote set-url origin git@bitbucket.org:new_name/repository.git

# こうなる
$ git remote get-url origin
git@bitbucket.org:new_name/repository.git
```

当然この他にも色々やることや不具合が起こる可能性があります。変更は自己責任で！
[WordPress]メディア挿入時にalt以外を削除する

投稿画面で画像挿入すると、しこたま余計なのが入るので消す。

```php:functions.php
add_filter('image_send_to_editor', 'rm_img_attr', 10);
add_filter('post_thumbnail_html', 'rm_img_attr', 10);
function rm_img_attr($html) {
	$html = preg_replace('/(width|height)="\d*"\s/', '', $html);
	$html = preg_replace('/(class|title)=[\'"]([^\'"]+)[\'"]/i', '', $html);
	$html = preg_replace('/<a href=".+">/', '', $html);
	$html = preg_replace('/<\/a>/', '', $html);
	return $html;
}
```
ちなみにalt入れても消えなかった。

[[WordPress]画像挿入時に、自動で付与されるclass、title、リンクを削除する方法](http://height25.com/2015/05/img-attribute/)
【Ruby on Rails】【JavaScript】静的ファイルのダウンロードが出来ない。

#静的ファイルのダウンロードが出来ないんだけど！！！
Rubyの`send_file`ってのを使ってる時に、こんな事が発生しました。

**【結論】**
JavaScriptの理解不足。
( 'ω')ﾊｽﾞｶｼｲ...

#こんな恥ずかしい事をしてました。
~~っていうのをまとめるのが面倒なんですけど、~~
Teratailで質問を投げました。
[【Ruby on Rails】静的ファイルのダウンロードが出来ない。](https://teratail.com/questions/59712?whotofollow=)


**回答者Aさん**
>`$.ajax`でリクエストを飛ばした場合、結果はJavaScriptに届くので、ブラウザ側が直接反応するわけではありません。
GETでダウンロード可能として、`<a href>`でリンクさせるか、POSTが必要ならダミーのフォームを作成して、それを送信する形にするなど、ブラウザのHTMLでアクションを起こすのがいちばんスッキリします。

**回答者Bさん**
>JavaScriptでRequestを投げて、そのResponseを受け取ったのもJavaScriptですので。 
最終的にJavaScript側でファイルに保存するなりの処理をしなければメモリ上にしか展開されませんよ。 
ブラウザの機能を使ってダウンロードさせるのであれば、ajaxでRequestを投げるのではなく、ブラウザにそのURLを開かせた方が楽だと思います。

つまりは、
**僕のJavaScriptの挙動に対する理解不足。**


とても悲しい。

#結果的に、
ダミーのform作って、submitさせる事で上手くいきました。

```js:dummy_form.js

$('<form/>', {action: 'download', method: 'post', name: "tmp"})  // jsでform作って
  .appendTo(document.body)  // 既存のbodyにくっつけて
  .submit();  // 送信

// 要素を消しておかないと延々とformが増え続けるので消しておく
$('[name="tmp"]').remove();
```
TerraformでLambdaのScheduled Eventを使う

AWSのLambdaをcronで定期的に実行する場合は、CloudWatchのScheduled Eventを使います。
それをTerraformを使って実現する場合は、下記のように記述します。

```zsh
resource "aws_lambda_function" "output_report" {
    filename      = "output_report.zip"
    function_name = "outputReport"
    role          = "arn:aws:iam::XXXXXXXXXXXX:role/YYYYY"
    handler       = "index.handler"
}

resource "aws_cloudwatch_event_rule" "every_month" {
    name                = "every_month"
    description         = "Fires every month"
    schedule_expression = "cron(0 0 1 * ? *)"
}

resource "aws_cloudwatch_event_target" "output_report_every_month" {
    rule      = "${aws_cloudwatch_event_rule.every_month.name}"
    target_id = "output_report"
    arn       = "${aws_lambda_function.output_report.arn}"
}

resource "aws_lambda_permission" "allow_cloudwatch_to_call_output_report" {
    statement_id  = "AllowExecutionFromCloudWatch"
    action        = "lambda:InvokeFunction"
    function_name = "${aws_lambda_function.output_report.function_name}"
    principal     = "events.amazonaws.com"
    source_arn    = "${aws_cloudwatch_event_rule.every_month.arn}"
}
```

これで毎月1日0時(GMT)に、`outputReport`のLambdaが実行されます。
Mrubyとは(簡潔にまとめてみた）

初投稿です。✨
間違っている部分がかもしれませんが暖かく見守ってください・・・(； ･`д･´)

Ruby会議で話されててMrubyってなんじゃ？？てなっていたのでこの機会に調べたことを書いていきます。


Mrubyとは

省エネルギーで使えるRubyのことです。
製作者様　Matzさん

特徴
・単体で使うのではなく、何かのアプリケーションに読み込めれるときに使う。
・クラスとメソッドが少ない。
・プラットフォームに依存しないように設計。（UNIX)
・除算の結果は必ずFloatになる。
・RubyGemsに似ているmrbgemsの仕組みを標準で搭載。
   mrbgemesとは CRubyの拡張ライブラリ　＋　RubyGems　の使用を合わせたもの。　
　　　　　　　　　・特徴：起動時にコンパイルして全て読み込まれる。
　　　　　　　　　　　　　　　　　：CRubyにありmrubyにない機能が公開されている。


具体例
Apache　・・・　サーバへのアクセスを見てエラーを返すようなサンプルを提示されている。
MobiRuby・・・iPhoneやiPad向けアプリにRubyが使える。
Mod mruby・・・Apache機能をRubyで拡張する。
mruby on Android ・・・　AndroidアプリでRubyが使える。
　　　　　

利点
・省メモリ（550kb)
・別のアプリに読み込みやすい(MV)

欠点
・制限されている
・精度問題（Fixunmを越えるとFloatになる。）


参考サイト様　　　ありがとうございました！
http://itpro.nikkeibp.co.jp/article/COLUMN/20120622/404824/
Tillerをマスタノードにスケジュールする他

helmというKubernetes用のパッケージマネージャがあります。helmはhelmというクライアントと、tillerというKubernetesクラスタ側で稼働するサーバで構成されています。
この記事では、tillerをデフォルトとは異なる特別な設定でデプロイする方法を解説します。

## 変更点

* rescheduler対応
* マスタノードにスケジュールする
* ローリングアップデート中もサービス停止しない

## TL;DR;

以下を`kubectl create -f ファイル名`する

```yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ''
    scheduler.alpha.kubernetes.io/tolerations: '[{"key": "node.alpha.kubernetes.io/role", "value": "master", "effect": "NoSchedule" }, {"key":"CriticalAddonsOnly", "operator":"Exists"}]'
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 10%
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: helm
        name: tiller
    spec:
      containers:
      - image: gcr.io/kubernetes-helm/tiller:v2.1.2
        imagePullPolicy: IfNotPresent
        livenessProbe:
          httpGet:
            path: /liveness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        name: tiller
        ports:
        - containerPort: 44134
          name: tiller
        readinessProbe:
          httpGet:
            path: /readiness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
```

## 基本的な流れ

```
helm init --dry-run --debug
```

を実行すると、tillerのDeploymentのためのmanifestが部分的に出力される。

```
metadata:
  creationTimestamp: null
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: helm
        name: tiller
    spec:
      containers:
      - image: gcr.io/kubernetes-helm/tiller:v2.1.2
        imagePullPolicy: IfNotPresent
        livenessProbe:
          httpGet:
            path: /liveness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        name: tiller
        ports:
        - containerPort: 44134
          name: tiller
        readinessProbe:
          httpGet:
            path: /readiness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        resources: {}
      serviceAccountName: ""
      volumes: null
status: {}
```

これにapiVersionとtype等を追加して完全なmanifestにして、

```
apiVersion: extensions/v1beta1
kind: Deployment
```

`kubectl create -f ファイル名`を実行してDeploymentを作成する。

## カスタマイズ内容

加えて、reschedulerで他のpodより優先的にスケジュールさせたい場合は、以下を追加するが、

```
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ''
    scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
```

今回はマスタノードにスケジュールするためのtolerationも必要なので、tolerationsは以下のようにする。

```
[{"key": "node.alpha.kubernetes.io/role", "value": "master", "effect": "NoSchedule" }, {"key":"CriticalAddonsOnly", "operator":"Exists"}]
```

ついでに、今後のtillerアップデート中に一時的にtillerがサービス停止してしまうことを防ぐためには、以下を追加。

```
spec:
  strategy:
    rollingUpdate:
      maxSurge: 10%
      maxUnavailable: 0
```
BIG-IPのnpath構成

#背景
BIG-IPのnpath構成を構築してみました。
使用機器はLTM2000になります。

#構築
・npath構成するための四つのステップが必要
-fastL4 profileの作成
-poolの作成（省略）
-virtual serverの作成
-サーバーのLoopbackアドレスの設定

fastL4 profile設定例

```
# list ltm profile fastl4 fastL4_Qiita
ltm profile fastl4 fastL4_Qiita {
    app-service none
    defaults-from fastL4
    hardware-syn-cookie enabled
    idle-timeout 300
    ip-tos-to-client pass-through
    ip-tos-to-server pass-through
    keep-alive-interval disabled
    link-qos-to-client pass-through
    link-qos-to-server pass-through
    loose-close enabled
    loose-initialization disabled
    mss-override 0
    pva-dynamic-client-packets 2
    pva-dynamic-server-packets 2
    pva-offload-dynamic enabled
    reassemble-fragments disabled
    reset-on-timeout enabled
    rtt-from-client disabled
    rtt-from-server disabled
    server-sack disabled
    server-timestamp disabled
    software-syn-cookie disabled
    tcp-close-timeout 5
    tcp-generate-isn disabled
    tcp-handshake-timeout 51
    tcp-strip-sack disabled
    tcp-timestamp-mode preserve
    tcp-wscale-mode preserve
}
```

*Loose Close設定を有効にすると、TCPプロトコルフローは、TCP FINパケットが見つかるとすぐに失効します（FINパケットは、 これまでの接続の切断を指示します）*

virtual serverの設定例

```
# list ltm virtual
ltm virtual vs_Qiita {
    auto-lasthop enabled
    destination 10.1.35.21:http
    ip-protocol tcp
    mask 255.255.255.255
    pool pool_Qiita
    profiles {
        fastL4_Qiita { }
    }
    source 0.0.0.0/0
    translate-address disabled
    translate-port disabled
    vs-index 2
}
```
*通常のLBでは、VIP宛てのパケットをリアルサーバのIPアドレス宛てに書き換えてパケットを流します。ただ、npath構成ではリアルサーバのアドレスに書き換えないので、translate-addressとtranslate-portを無効にする*

**サーバーのLoopbackアドレスの設定**
npathの構成ではLBから流すパケットのDestination IPがVIPになるため、リアルサーバーのloopbackアドレスに設定必要があります。

httpモニターを例にする（destinationをloopbackに設定、transparent　enabled）
L2 nPath Routingでサーバーのループバックインターフェースの生死監視

```
# list ltm monitor http http_Qiita
ltm monitor http http_Qiita {
    defaults-from http
    destination 10.1.35.21:http
    interval 5
    ip-dscp 0
    recv OK
    recv-disable none
    send "GET /health.html\r\n"
    time-until-up 0
    timeout 16
    transparent enabled
}
```
OKという文字列を含まれると、モニターアップ
30 Days of React を意訳していく Day2 - What is JSX?

# はじめに

[Fullstack React: 30 Days of React](https://www.fullstackreact.com/30-days-of-react/) の意訳です。

ちょいちょい読んでるのでせっかくなので訳そうと思った次第。飽きるまで続きます。かなり意訳です。

- [Day1 \- What is React?](http://qiita.com/eiei19/items/933870b8a1d746a279f7)

ぼく自身はjQueryおじさんで、あんまりJSまわりへの理解も深くないのでなんか間違っていたら指摘よろしくです。

# 本編

https://www.fullstackreact.com/30-days-of-react/day-2/

Day1ではReactでなんであるかを説明した。Day2では、Reactエコシステムの一部、ES6とJSXを見ていくよ。

## JSX/ES5/ES6 WTF??!

Reactのことをネットで調べてるとJSXとかES5,ES6とかって用語出てきて、なんじゃこりゃってなると思います。

ES5というのは、ECMAScriptのバージョン5(2009年)です。いわゆる"通常のJavaScript"。ほとんどのブラウザでサポートされてます。

ES6はJavaScriptの新しいバージョン（2015年）で、いろんな機能や構文が追加されてます。 ES6は、主要なブラウザすべてでほぼ完全にサポートされてますが、毎度の如くIEの一部のバージョンでサポートされてなかったりします（IE11はES6をサポートしてないが、マーケットシェアが11%ある）。

ES6ではいろいろ便利な機能が追加されてますが、これらをより多くのブラウザで使えるようにするには次のことをしないといけません。

1. ES6 => ES5 への変換
2. ES6の機能がブラウザ側に実装されてないときに、代わりに同じ動きをする機能を追加する（ include a shim or polyfill）

> この30 Days of Reactの書かれているコードは簡単にES5に変換できます。ES6を使う場合はまずはじめにその機能を説明してから、その機能を使うから安心してね

すでに見たように、すべてのReactコンポーネントは```render```メソッドを持ちます。JSX（JavaScript eXtension）はHTMLライクにJavaScriptをかけるようにしてくれるReactの拡張です。

> 以前はJavaScript内にHTMLを書き込むのはダメなこととされてましたが、機能とビューをあわせることでビューに対して見通しのよいコードが書けるようになりました

H1要素をレンダリングするReactコンポーネントを例に見てみましょう。JSXでは、HTMLのように要素を書くことができる。

```
class HelloWorld extends React.Component {
  render() {
    return (
      <h1 className='large'>Hello World</h1>
    );
  }
}
```

HelloWorldコンポーネントの ```render（）``` 関数はHTMLを返すように見えますが、実際に返すのはJSXになります。 JSXは実行時に次のような通常のJavaScriptに変換される（要はJSXを使わないでReactを使おうとする以下のように書かないといけない）。

```
class HelloWorld extends React.Component {
  render() {
    return (
      React.createElement(
        'h1',
        {className: 'large'},
        'Hello World'
      )
    );
  }
}
```

JSXはHTMLのように見えますが、実際は ```React.createElement（）``` をわかりやすくするためのものです。実際に出力されるHTMLは以下のようになります。

```
<h1 class='large'>Hello World</h1>
```

> ところで最初の```extends```はES6の構文です。オブジェクト指向っぽい書き方ができるようになっていた、ES5では次のように変換されます。```
var HelloWorld = function() {}
Object.extends(HelloWorld, React.Component)
HelloWorld.prototype.render = function() {}
```

JSXはJavascriptなので```class```や```new```のような予約語を使えません。

Reactでは```className```とアトリビュートがあります（H1のクラス名を指定するのに使ってるやつ）。他に```for```はhtmlForを使います（forが予約語のため）。

```React.createElement()``` を使うことで、JSXを使わないピュアなJavaScriptだけで記述することもできますが、以下の例のようにネストを表現できないので、JSXを使うほうが良いと思います。

```
<div>
  <img src="profile.jpg" alt="Profile photo" />
  <h1>Welcome back Ari</h1>
</div>
```

これをJSX抜きで書こうとすると以下のようになる。

```
React.createElement("div", null, 
  React.createElement("img", {src: "profile.jpg", alt: "Profile photo"}),
  React.createElement("h1", null, "Welcome back Ari")
);
```

JSXを理解したのでDay3では最初のReactコンポーネントを作ってみます。
シンボリックリンクの参照先より上階層にある.htaccessは無視されるので注意

Webサーバーが以下のようなディレクトリ構成だとする。


```
var
└ www
   └ html
      │
      ├ project
      │   │
      │   ├ .htaccess ←社外IPアドレスからのアクセスを拒否
      │   │
      │   └ htdocs ←ルートにしたいディレクトリ
      │      ├ index.html
      │      └ ...
      │
      └ project.com -> project/htdocs ←ルートへのシンボリックリンク
```

その際、Apacheでドキュメントルートを以下2通りで設定したとする。
1. `/var/www/html/project/htdocs`のようにルートを直接指定
2. `/var/www/html/project.com`のようにルートへのシンボリックリンクを指定


このどちらも、`http://ドメイン名/`でindex.htmlを表示することができる。

しかし、2に関しては問題があり、ルートより上の階層にある`/var/www/html/project/.htaccess`が効かない。
（1は社外からアクセスできないが、2はアクセスできてしまう）

なので2の場合、htdocs以下に.htaccessを設置しなければいけない。

ちなみに、シンボリックリンクのある`/var/www/html/`直下にも.htaccessを設置してみたが、こちらも効かなかった。
Ruby AWS SDK v2でディレクトリ階層をlistする


# Goal

* s3で以下のように保存されているログを取得したい
* instance-idごとにディレクトリが切られ、ログが保存される
* instanceは常に起動したり破棄されたりするためinstance-idが不明なので、多重ループでスキャンする必要がある

```
- (bucket)blog
  - app
    - config
    - logs
      - instance-id-1
        - nginx-access-log-2016-12-01.gz
        - nginx-access-log-2016-12-02.gz
        - nginx-access-log-2016-12-03.gz
        - nginx-error-log-2016-12-01.gz
        - nginx-error-log-2016-12-02.gz
        - nginx-error-log-2016-12-03.gz
        - php-error-log-2016-12-01.gz
        - php-error-log-2016-12-02.gz
      - instance-id-2
      - instance-id-3
      - instance-id-4
    - tools
    - ...
  - api
    - ...
  - batch
    - ...
```

# Solution

http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html

- list_objectsメソッドでprefixの末尾をスラッシュで指定する
- delimiterに"/"を指定する
- common_prefixesでサブフォルダ一覧を取得できる

```rb
require "aws-sdk"

client = Aws::S3::Client.new(
  access_key_id: "***",
  secret_access_key: "***",
  endpoint: "https://s3.amazonaws.com"
)

instance_list = client.list_objects(
  bucket: "blog",
  prefix: "app/logs/",
  delimiter: "/"
)

instance_list.common_prefixes.each do |instance|
  puts instance.prefix
  logs = client.list_objects(bucket: "blog", prefix: instance.prefix)
  logs.contents.each do |content|
    puts content.key
  end
end
```

## Environment

```
% ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

% gem list aws-sdk

*** LOCAL GEMS ***
aws-sdk (2.6.41, 2.2.24)
aws-sdk-core (2.6.41, 2.2.24)
aws-sdk-resources (2.6.41, 2.2.24)
```
ridgepoleでエラー！`default: nil` is ignored when `null: false`.


## なんか出た:fearful:

`$ bundle exec ridgepole --apply` (オプションは省略)を実行。
以下のようなWARNINGメッセージがいくつかズラズラと発生し、Schemafileには差分がないのにchange_columnが走る

```
[WARNING] Table `tags`: `default: nil` is ignored when `null: false`. Please apply twice
-- change_column("tags", "updated_at", :datetime, {:null=>false, :comment=>"更新日時", :default=>nil})
   -> 0.0104s
```

## 原因は…？
```
create_table "tags", force: :cascade do |t|
  (略)
  t.datetime "updated_at", null: false, comment: '更新日時'
end
```
カラムにcommentを指定しているのが原因でした。

## なぜ？
```
CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(191) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `index_tags_on_name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8mb4;
```
上記はridepoleで作成したmysqlのテーブル情報。ここにコメント文は反映されていない。
そのため、永遠にカラムに差分が発生し続ける。
すでに存在するカラムにNOT NULL制約を付けようとする場合、defaultが必要となるが、
default値を記述していないためridgepoleがdefault値をnilで埋めようとするので表題のエラーが発生する模様。

## 解決方法

試しにmysqlで直接カラムにCOMMENTを登録してみたが、ridepoleが取得しているスキーマはCOMMENTを取得しないようなので、Schemafileでcomment文を使うのは諦めてmysqlに直接登録することで解決した。

## まとめ
エラー文の内容的にはdefaultの設定周辺が原因かと思ってだいぶ時間がかかったが、
rake db:schema:dump で取り出したスキーマと差分をくらべることで解決したので、
comment文にかぎらず、差分がないのに差分があるように振る舞う時はschema.rbを見比べるとあっさり解決しそうです。
JavaScriptのオブジェクトのキーを配列に変換する方法

たとえばJSONデータなんかをあつかっていて、その形式がオブジェクト形式で完結しているばあい、HTMLにリストで出力するのとかが大変になりがちです。元のデータを配列にしてしまえば困ることもないと思いますが、APIなどの仕様でオブジェクトで扱わなくてはならない場合、下記のようにオブジェクトのキーを配列に変換する方法があります。

```js:hoge.js
var hoge = {
    "pageid1": {
        "title": "Any title here",
        "content": "Any content here",
        "type": "Any type here"
    },
    "pageid2": {
        "title": "Any title here",
        "content": "Any content here",
        "type": "Any type here"
    }
};

var keys = Object.keys(hoge);
```
```js:実行結果
console.log(keys);

// ["pageid1","pageid2"]
```
配列にしてしまえば、ループで回すときにもi番目という処理がかませられるので安心ですね。

オブジェクトの方が見通しがよかったりするので、いちいち処理をはさむという手間をふむのか、元データの扱いやすさを優先するのかを考慮して選択してもいいですね。いずれにせよ処理できるということですから。
New Relic Insights: ブラック背景のスタイリッシュなダッシュボードの表示方法

New Relic アドベントカレンダー21日目。昨日に続き New Relic Insights について。今日は超小ネタです。

New Relic Insights で黒背景のダッシュボードに表示方法を解説します。

通常ダッシュボードは以下のように、グレー背景のダッシュボードです。

![nr_insights_light_01.png](https://qiita-image-store.s3.amazonaws.com/0/46003/8f359a67-cb42-7c94-ebe3-1ceab62444a7.png)

画面右上のフルスクリーンボタンを押します。すると、下のようにメニューが消えて、ダッシュボード部分がフルスクリーンになります。

![nr_insights_light_02.png](https://qiita-image-store.s3.amazonaws.com/0/46003/fbfa7605-d304-7099-0884-b935afe6dfab.png)

画面右上のフルスクリーンボタン横の、電球マークを押します。すると、黒背景のダッシュボードに切り替わります。再度電球ボタンを押せば元に戻ります。

![nr_insights_light_03.png](https://qiita-image-store.s3.amazonaws.com/0/46003/c7c60c2c-5734-c335-7cc4-bcfa70b26c7d.png)

以上、小ネタでした。
Erlangで浮いたプロセスを調べる方法

```erlang
% erl
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]

Eshell V8.1  (abort with ^G)

%% 1) まずプロセス数を調べる
1> Before = processes().
2> length(Before).
26

%% 2) 次に調べたい処理をする（通常はもっと複雑な処理）
3> Loop = fun(F) -> timer:sleep(100), F(F) end.
4> LeakPid = spawn(fun() -> Loop(Loop) end).
<0.62.0>

%% 3) もう一度プロセス数を調べる
5> After = processes().
6> length(After).
27

%% 4) 2回調べたプロセス数の差分を取る
7> Delta = After -- Before.
[<0.62.0>]

%% 5) 詳細を見る
8> [{Pid, erlang:process_info(Pid)} || Pid <- Delta].
[{<0.62.0>,
  [{current_function,{timer,sleep,1}},
   {initial_call,{erlang,apply,2}},
   {status,waiting},
   {message_queue_len,0},
   {messages,[]},
   {links,[]},
   {dictionary,[]},
   {trap_exit,false},
   {error_handler,error_handler},
   {priority,normal},
   {group_leader,<0.50.0>},
   {total_heap_size,1363},
   {heap_size,987},
   {stack_size,10},
   {reductions,6574},
   {garbage_collection,[{max_heap_size,#{error_logger => true,
                                         kill => true,
                                         size => 0}},
                        {min_bin_vheap_size,46422},
                        {min_heap_size,233},
                        {fullsweep_after,65535},
                        {minor_gcs,20}]},
   {suspending,[]}]}]                     
```
ElixirとPhoenixでスケールする対戦マッチングシステムを設計する

[Elixir Advent Calendar 2016](http://qiita.com/advent-calendar/2016/elixir) の22日目です。
[mixiグループ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/mixi) の22日目も記載しているのでよければそちらもどうぞ
## マッチングとは
ゲームにおいて、プレイヤーとプレイヤーを何らかの条件で（同程度の強さなど）によって結びつけることです。プレイヤーにとって面白いと考えられる対戦を作るのが目標になります。

良い対戦相手を見つけるには待ち時間が必要になります。キューに入ってきた順ではなく、同じ条件のユーザが揃うまで待つ必要があるからです。
そのため、クライアントには非同期で結果を返す必要があります。

## Phoenix Channels
![match.png](https://qiita-image-store.s3.amazonaws.com/0/11027/b12073af-f6b4-9ad4-fcf2-34c99672f174.png)


クライアントへ非同期に結果を返すために、Phoenix の Channels を活用します。WebSocket を抽象化しており、アプリケーション側から容易にメッセージパッシングを行えます。
また、Phoenix では WebSocket を扱うのに十分速いため実用として利用できます。

[Phoenix Channels vs Rails Action Cable](https://dockyard.com/blog/2016/08/09/phoenix-channels-vs-rails-action-cable)

## Matching Server
![matching_server.png](https://qiita-image-store.s3.amazonaws.com/0/11027/02e0e03c-6f9d-cc5b-11cb-9f0600fe0051.png)

Game Server はクライアントと WebSocket を繋いだあと、Matching Server に登録します。
Matching Server では、Matching Board に書き込むまでを行い、Game Server にはすぐにレスポンスを返してしまいます。
Game Server と Matching Server は別の Phoenix Application となってます。

## Matching Worker
![matching_worker.png](https://qiita-image-store.s3.amazonaws.com/0/11027/354f91d0-bf88-b528-d7ca-90215100b9e2.png)
Workerは、Matching Board から、古いレコードを探してきて、別のマッチングポイントと結びつけます。結びつけが成功した場合、アプリケーション登録時に指定した Callback URL へ結果をPOSTします。結果が返ってきた Game Server は、さらに結果を WebSocket を通してクライアントへ通知します。

複数台の Game Server がある場合は、どのサーバに結果を POST しても問題無いように、Pub/Sub サーバを別途用意する必要があります。

Elixirを使うと、このWorkerもプロセスとして容易に実装できます。

## 多段 Worker
Worker は複数並べることができ、性格の異なる Worker を持てます。
今回の実装にあたっては、 Matching Board に登録したけど、なかなか相手が見つからないような場合、条件を緩和してマッチングを行うような Worker を追加しています。

## スケールアウト戦略
一番難しい問題は、このシステムをどのようにスケールアウトさせるかです。
大量のユーザがマッチングを行うことを考えるとスケールアウトできる設計であることが重要です。
今回実際にマッチングを行う Worker は容易に横に並べることが可能です。
そのため、データベースである Matching Board をどのように横に並べるか、横に並べても問題ないように実装するかを考える必要があります。

### DB を横に分割する
DB を横に分割する場合、競合が問題となります。今回のシステムで問題となる競合は2点あります。
* マッチングさせるべき起点ユーザを取得する
* 起点ユーザと結びつけるユーザを取得する

複数の DB に Transaction をかけることは（スケールアウトの観点から）できないため、レコード自体に State (Lock/Unlock) をもたせる必要があります。

今回説明は省きますが、マッチングの解除などユーザに対しての操作などがあるため、Transactionをかけやすいように DB はユーザのID単位でシャーディングしています

### マッチングさせるべき起点ユーザを取得する
マッチング時間をなるべく減らしたいため、 Worker に触られていない時間が長いレコードを探してきます。
*State が Unlock かつ、updated_at が一番古いレコードを見つけ、State を Lock に変更します。*
複数の DB から一番古いレコードを見つけるのは難しいため、複数の DB からランダムに1台選び、単一DBの Transaction で上記の操作を行います。
厳密には一番触られていないレコードではないですが、複数の Worker でバランスされ実用上問題ないため許容しています。

### 起点ユーザと結びつけるユーザを取得する
複数の DB を触る必要があるため、単純に Transaction をかけることは出来ません。しかしながら、一番古いユーザを探す場合と比較して、競合自体は少ないと思われます。
レコードに lock_version を導入し楽観的ロックで実装します。（レコードの更新時に lock_version の値を調べ、他から更新が行われていないことを保証する)

### Worker が死んだ場合
StateをLockにしたまま、Workerが死んでしまう可能性があります。その場合、このレコードは他から永遠に見つけられることがなくなります。

そのためZombieとなってしまうレコードを救う、Exorcist Workerを追加します。
Lockのまま、update_atが更新されないレコードはworkerが死んで放置されたと判断し、UnlockしていくWorkerです。

## まとめ
以上の設計でマッチングシステムの実装を行いました。
Phoenix Channels や、 Elixir のプロセスを用いて容易に実装が行えます。
皆さん [Phoenix](http://www.phoenixframework.org/) 使っていきましょう！
機械学習論文読みメモ_22


[Bidirectional Helmholtz Machines](http://www.jmlr.org/proceedings/papers/v48/bornschein16.pdf), ICML2016
Variational autoencoderなどのモデルは、トップダウンの生成モデルとボトムアップの推論モデルで成り立っている。
本論では、特に両モデルに対してconvert可能なモデルを提案する。
このモデルでは、さらに生成、推論モデルを近似する２つの近似モデルを用い、両モデルは互いに似た分布構造を持つようにして、さらにこの2つのモデルの幾何平均が実際に定義した提案モデルの分布に一致するようにする。
このモデルの尤度関数の下界は求められ、この下界に関して最適化を行う事で２つの分布間のBhattacharyya distanceを最小化するような正則化を行う事になる。

[Partition Functions from Rao-Blackwellized Tempered Sampling](http://jmlr.org/proceedings/papers/v48/carlson16.pdf), ICML2016
複雑でマルチモーダルな分布に対する分配関数を求める手法を提案する。
その手法はsimulated temperingを応用し、補助変数(inverse temperature) をパラメータに確率分布の谷を超えた別のモードへの遷移を確率的に可能にした事で、複雑な分布でも効率良くサンプリングする事が出来る。
この時、その遷移確率をパラメタライズする補助変数が多変量正規分布で表現出来る事を利用すれば、この変数は条件付き確率を用いたサンプリングに基づく平均値によって効率よく求める事が出来る。
この条件付き確率に基づくサンプリングはRao-Blackwellizedの定理に基づいた考え方を利用可能で、通常の確率分布を利用するMCMCよりも分散が小さく効率よく計算が出来る。
本論ではこのサンプリング手法を提案し、Rao-Blackwellized Tempered Samplingと呼ぶ。

[Binary embeddings with structured hashed projections](http://jmlr.org/proceedings/papers/v48/choromanska16.pdf), ICML2016
疑似ランダム写像とsign関数を組み合わせて構築するバイナリハッシュ関数について考える。
ここで擬似ランダム写像とは、行列で示され、全ての要素が独立である必要はないが、ある一定量に渡っては独立な要素が分布している事（fixed budget of randomness) を満たす。
そのような行列は一般に、準二次、あるいは線形空間で表現可能で、写像の表現に必要なランダム変数の数を減らす事が出来る（次元削減的な考え？）。
本論では、様々な構造を持った写像とsign関数の組み合わせにおいて、高次元入力空間の角度を保持する事を示した。
この事実はJohnson-Lindenstrauss lemma、ユークリッド空間における高次元から低次元の写像において距離をほぼ保存したままにできるものがある、を一般化でき、いくつかのヒューリスティクスとしてしか情報の保存が知られていない写像構造についても説得力をもたせる事が可能になる。
またこれら構造的な写像はまた情報圧縮にも応用する事ができる。
jenkinsのバックアップをThinBackupプラグインで実装

2/23追記：
　移行するにはworkspace以外全部うつすといいっぽい。
　（部分バックアップしたらシステム設定が移らなかったりしました）
　参考：http://snickerjp.blogspot.jp/2013/10/migrate-JenkinsCI.html

tarアーカイブしてS3転送のスクリプト書いてもよかったけど、
ThinBackupプラグインをつかったほうが楽な感じだったので。

### ThinBackupプラグインの設定をする

Jenkinsの管理＞ThinBackup＞Settings

・Backup directory
/var/lib/jenkins/backup

※ディレクトリは読み書きできる場所に自分で作っておく

・Backup schedule for full backups
H 12 * * 1-5

・Max number of backup sets
2

・Files excluded from backup (regular expression)

`(builds|disabled)/.*$`

・Wait until Jenkins/Hudson is idle to perform a backup
初期値でチェック有
Force Jenkins to quiet mode after specified minutes	120

・とっておきたいBackup～にチェックを入れる
Backup next build number file
Backup plugins archives
Backup additional files
 	Files included in backup (regular expression) 
`^(\.ssh|config|id_rsa.*|authorized_keys|\.gitconfig)|^(secrets|[a-zA-Z.-_]*)`

Move old backups to ZIP files

以上でSAVE。

### 動作確認

Backup Nowを押す
すると、
/var/lib/jenkins/backup/に日時フォルダができる。
目的の内容がバックアップされたか等を確認
（特に正規表現まわりのinclude/excludeな指定が間違ってないか）

### ローカルバックアップだと心もとないのでS3に送るジョブを作る

・upload-jenkins-backup-to-S3
　定期的に実行　H 14 * * *
　Mask passwords (and enable global passwords)
　　AWS_ACCESS_KEY_IDとAWS_SECRET_ACCESS_KEYなどを変数化

　シェルの実行

```
cd /var/lib/jenkins/backup
aws s3 sync ./ s3://${S3BUCKET}/${URI} --delete --acl private
```

ビルド実行して問題なくupされてたので完了。

参考：
http://sue445.hatenablog.com/entry/2013/12/08/005317
http://yoshio.velvet.jp/blog/archives/4149
https://wiki.jenkins-ci.org/display/JENKINS/thinBackup
http://qiita.com/tq_jappy/items/3654059d09a4896ae598
https://jenkins.io/blog/2010/02/10/keeping-your-configuration-and-data-in-subversion/
DevOps について改めて(社内LT用)

![Devops-toolchain.svg.png](https://qiita-image-store.s3.amazonaws.com/0/78250/c4f18554-de2b-8bc3-83e4-a4ab22fc657c.png)

***

## 概要
DevOps について、今さら感たっぷりではありますが、改めて何がどう美味しいのかを社内LT用に簡単にまとめます。

***

## DevOps とは
開発者と運用者が、円滑に業務に取り組めるための仕組み。あるいは考え方

***

## なぜ、DevOps が生まれたか
- 開発者(Dev)と運用者(Ops)の衝突
- 素晴らしい解説がありました。https://geechs-magazine.com/tag/tech/20160325

***

![20160324_4.png](https://qiita-image-store.s3.amazonaws.com/0/78250/c30a25dc-7180-a7f8-e0ca-1089cbc0582f.png)

***

![20160324_5.png](https://qiita-image-store.s3.amazonaws.com/0/78250/2d2f0ebc-a117-5630-cb36-bf9ddbde9c74.png)

***

![20160324_6.png](https://qiita-image-store.s3.amazonaws.com/0/78250/e3263e3e-d5c5-5e77-41c7-d7a63c1ae2a0.png)

***

![20160324_7.png](https://qiita-image-store.s3.amazonaws.com/0/78250/79efad47-ec8a-f4da-7904-9eb766037ac2.png)

***

![20160324_8.png](https://qiita-image-store.s3.amazonaws.com/0/78250/0d432014-3bfe-1b73-6e63-abe32d84512a.png)

***

- 開発部門は「どんどん機能を追加していきたい。」
- 対して運用部門は「安定したシステムに手を加えたくない」
- という矛盾。

***

## じゃあどうすればよいか?(当方の理解)
端的には、あらゆるものを自動化してしまう。

***

## あらゆるものを自動化する
- チームがブレイクスルーを起こすためには、Dev の「どんどん機能追加を」のスピード感を損ねてはならない
- では Ops にて、あらゆるものを自動化して、両者の衝突を回避すればよい
- 具体的には「継続的インテグレーション(Continuous Integration)」。つまりは CI。

***

以下、インフラ込みの CI フローの一例です。ちなみにアプリケーションより上は予測で書いてます！

***

- Dev が新機能のソースコードをバージョン管理に Commit。
- Commit をトリガーに、Jenkins 等の CI ツールが起動。

![Jenkins_logo-title.png](https://qiita-image-store.s3.amazonaws.com/0/78250/734aad54-72b0-4cce-903b-ca95cf3f6579.png)

***

- Jenkins にて、AWS などクラウド上の仮想サーバを作成。
- Chef/Ansible 等のサーバプロビジョニングツールにて、OS/MW の構築を自動で実行。

![chef_logo.png](https://qiita-image-store.s3.amazonaws.com/0/78250/bf26bd89-7b0d-2889-b904-8273d5b70ad6.png)

***

- Serverspec 等のサーバテストフレームワークにて、インフラのテストを自動実行。

![serverspec_logo.png](https://qiita-image-store.s3.amazonaws.com/0/78250/3000ed3e-e8cb-077a-7558-861c7448df94.png)

***

- Git 等のバージョン管理リポジトリから、最新のソースコードを Checkout。
- デプロイツールにて(Java で言うところの Ant)、アプリケーションデプロイを実施。
- CI ツールにて、アプリケーションのテストを流す。

***

- アプリケーションテストが通れば、BlueGreen Deployment にて本番適用。
- BlueGreen Deployment とは、新規にデプロイした仮想サーバ・アプリケーション群に、トラフィックの流れを切り替える手法。

***

![BlueGreen-Deployment_EzVYul3GfKXW330RpgBE9A.jpeg](https://qiita-image-store.s3.amazonaws.com/0/78250/8fafc7f4-91aa-a68c-1a9e-5327815dbc6a.jpeg)

***

- 切り替えは、DNS もしくはロードバランサでやる。
- 既存のサーバ群は破棄。捨てることが簡単、これぞクラウドインフラの真髄である。

***

という一連の流れを、CI ツールを軸にすべて自動オペレーションにしてしまう。

Dev がアプリケーションのソースコードを Commit しただけで本番適用まで一気通貫となる。
という仕組み・フローを Ops が提供する。

***

## その結果。。
- 「どんどん機能を追加していきたい。」を、一連の自動化でスピード感を損なわず！
- 「安定したシステムに手を加えたくない」では、BlueGreen Deployment にて既存サーバに手を加えず！

が、いわゆる1つの DevOps と理解してます。

***

## DevOps を GLODIA でどう活かす?
Gitバケット と Jenkins は社内にあるので、Web開発が今後あればぜひ アジャイル/DevOps にて！

以上。
URL の Query 文字列でスペースを「%20」とするか「+」とするか論争

（個人的に）長年もにょっていた掲題の件について、まとまったのでメモ。

# Query 文字列とは？

URL の `?` 以降の部分。よく GET パラメータと言っているやつですね。

```
http://domain/path/to/document.html?foo=bar
```

という URL があったとしたら、 `?` 以降の `foo=bar` の部分です。

# Query 文字列内でのスペースの扱い

「`%20`」でもいいし、「`+`」でもいける。
可能だったら後者が望ましい（という結論に至った）。

# URL で利用可能な文字

URI の RFC で規定されてます。スペースは利用できないので `%20` に URL エンコードする必要があります。なので Query 文字列内のスペースももちろん `%20` とエスケープする必要あります。

# あれ？ 「`+`」の話は？

URI の RFC では Query 文字列で「`+`」をスペースとして扱うというくだりは見当たりません。
これは URI のサブセットである URL で規定されていました。

> Within the query string, the plus sign is reserved as shorthand notation for a space.

あくまで Query 文字列内だけってことなんですね。納得しました。

HTML の Form もこれにしたがって、スペースは「`+`」に置換されてリクエストが送信されます。
気になる人は以下 HTML で試してみましょう。

```html
<form path="./">
<input name="foo bar" value="baz qux">
<input type="submit">
</form>
```

# `encodeURIComponent()` ってスペースを「`+`」に置換してくれないよね？

はい。あれは **URI のエンコード** ってことで、サブセットである URL に関してはノータッチってことなんでしょう。

# JavaScript で GET パラメータを構築する時ってどうすればいいの？

URI として valid なんだから、 `encodeURIComponent()` でも別にいいんじゃないかと思った。
言語の標準ライブラリやビルトイン関数に Query 文字列内のスペースを「`+`」として扱ってくれる関数があればそちらを使うべきですよね。
（ブラウザのJavaScriptでは見当たらないので頑張らなくてもいいんじゃないかという方針）

# まとめ

Stack Overflow の回答コメントから引用。

> In theory I think you should have %20 before the ? and + after:

# 参考文献

RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax
https://tools.ietf.org/html/rfc3986

W3C による URL に関するドキュメント
https://www.w3.org/Addressing/URL/uri-spec.html

フォームの URL エンコード処理に関するドキュメント
https://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

Stack Overflow の URL 中のスペースをどうエンコードするかの質問
http://stackoverflow.com/questions/1211229/in-a-url-should-spaces-be-encoded-using-20-or
Unicornで完全勝利する

この記事は、[MKAK Advent Calendar 2016](http://www.adventar.org/calendars/1985)の22日目の記事です。

# はじめに

**unicorn**と**完全勝利**というキーワードで元ネタが思い浮かばなかった人にとってはタイトル詐欺かもしれません。
この記事は、Railsなどで馴染み深いRackサーバのunicorn (https://github.com/defunkt/unicorn) ではなく、私の作ったunicornというアプリについて説明したいと思います。
ソースコードはこちら (https://github.com/gembaf/unicorn) です。
元ネタは**完全勝利した淫夢くんUC** (https://youtu.be/oYNjUqpOaRM) です。

Rackサーバの方のunicornを期待していた方も、息抜きだと思って、最後まで読んで頂ければ幸いです。

# 背景

試験、就職活動、ライブのチケット、etc……
長い人生の中では、結果を通知される機会が数多く存在すると思います。
結果を見るには踏ん切りが付かないような気持ちも、一度は味わったことがあるのではないでしょうか。

そんな時！Unicornを使うことで、流れに身を任せて結果を確認することができます！！

# Unicornとは

ざっくりと説明すると、音楽が流れて、結果の通知にむけてテンションを高めるためのものです。
とりあえず、まずは使い方を紹介したいと思います。

こちらのページ (http://gembaf-unicorn.herokuapp.com) で動いているので、興味のある方は実際に使ってみて下さい。
少なくともChromeでの動作は確認しています。
**※ 音が流れるので注意して下さい**

# トップページ

**フルバージョン**と**短縮バージョン**を選択することができます。
まずは**フルバージョン**について説明します。

![image](https://qiita-image-store.s3.amazonaws.com/0/152449/3817946b-5088-c6c6-4d91-d72e2e67e37a.png)

# フルバージョン

フルバージョンを選択すると、前奏が流れ始めます。
前奏が終わるまでは、ボタンを押すことは出来ないので、来るべき結果の確認に向けて、テンションを高めていきましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/152449/51920313-acaa-3667-68d7-b5fc987b9e69.png)

## 前奏終わり

少し分かりづらいかもしれませんが、前奏が終わるとボタンが押せるようになります。
**このタイミングで結果の確認をして下さい。**
結果を確認したら、**完全勝利**だったのか**完全敗北**だったのかを選択して下さい。

![image](https://qiita-image-store.s3.amazonaws.com/0/152449/9d2dd646-8ea7-d0c1-fb04-7623c610c089.png)

## 完全勝利だった場合

愛らしいキャラクターのガッツポーズと共に、勇壮なBGMが流れます。
勝利を噛み締めて下さい。

![image](https://qiita-image-store.s3.amazonaws.com/0/152449/3690530e-d923-f2b0-f20e-fc8a8efd1613.png)

## 完全敗北だった場合

愛らしいキャラクターの落ち込んでいる姿と共に、悲壮なBGMが流れます。
とりあえず忘れましょう。いいことありますよ、きっと。

![image](https://qiita-image-store.s3.amazonaws.com/0/152449/70a53823-8214-d273-3ce1-8fb71b1c75ac.png)

# 短縮バージョン

最初の頃は楽しみながら使っていたのですが、前奏が40秒近くあるせいで、だんだんと聴くのが面倒になってきました。
そのため、短縮バージョンも用意しました。
せっかちな方や、短時間で何度も試したい方はどうぞ。

トップページで短縮バージョンを選択すると、前奏が流れず、最初から完全勝利か完全敗北かを選択することが出来ます。

# おわりに

PC上で使う場合にはよいのですが、なぜかスマホ上で開くと音が飛ぶことが多いです。
色々と試したのですが、結局原因はわかりませんでした。
むしろスマホ上で使うことを想定して作っていたので、結構ショックが大きかったです……
WindowsでFileMakerProのアプリケーションエラーが出たらプロセスを自動killする

## 前置き
自ブログに投稿した記事の転載です。
本日の投稿は、冬休み前にやっておきたいことベストワンな、エラー時の自動復旧ネタです。

当協会では、Windows7のタスクスケジューラ機能と合せ技で、FileMaker Proの定時タスクを実行させています。

もちろん、FileMaker Serverでタスク実行をおこなっているものもあるのですが、どうしても、スクリプトの互換性の関係によって、とか、クライアントのWindows端末に入れているあれやこれやとの連携をおこなうために、とかで、FMPで実行しないといけないタスクというものが出てきてしまいます。

基本的には、問題なく動いてくれているのですが、時折、クラッシュしてくれることがありまして（時折、というか、結構な頻度……）
そういう時、人間側が能動的に察知してFMPのプロセスをkillしてあげたりする必要があるのですが、冬休みに入るとそんなこともやっていられないですよね、というお話。

いや、冬休みじゃなくてもエラーからの手動復旧なんて嫌なので、自動化できる限りで自動化を試みましょう。


## FileMakerProがクラッシュしたときのエラーログを見る
まず、FileMakerProがクラッシュしたときに、どんなエラーログが出ているのかを見つけます。  
以下の通りです。

* イベントビューアー
  * Windows ログ
      * アプリケーション
          * エラーが出ている行

その行の中を見てみると、

* 全般タブ
  * 例外コード
      * 0xc0000005
  * 障害オフセット
      * 0x0005168a
* 詳細タブ
  * EventData
      * FileMaker Pro.exe

となっているはずです。
たぶん、FMPがクラッシュした時の例外コードと障害オフセットは全部これのはず、たぶん……


## FileMaker Pro.exeプロセスをkillするbatを作る
問題は、クラッシュすると、 FileMaker Pro.exe というプロセスが居残ってしまって、次の新しい指令をタスクスケジューラが実行しようとしても、何も起こらなくなる……ということなので、何はともあれこやつめをkillすることが必要です。

任意のディレクトリにbatファイルを作成します。
中身は、

``` sh
taskkill /im "FileMaker Pro.exe" /F
```

です、 /F つけて強制終了にしましょう。


## Windowsでアプリケーションエラーを感知する
Windows Vita以後だと、タスクスケジューラに、システムログをトリガ設定できるようになっているようなので、それを利用します。

* タスク スケジューラ
  * タスクの作成

で、まずはタスクを作ります。  
続けて、

* 全般タブ
  * 任意の名前を入れる

で、タスク条件を、 トリガータブ > 新規 > トリガーの編集 の後で、

* タスクの開始 : イベント時
* 設定 : カスタム
  * イベント フィルターの編集
      * フィルター
          * ログの日付 : 指定なし
      * イベント レベル : エラー
      * ログごと : イベント ログ
          * Windows ログ
              * Application

最後に、実行タスクとして作成したbatを指定。
操作タブ > 新規 で、

* 操作
    * プログラムの開始
* 設定
    * プログラム/スクリプト
        * 作ったbatファイルのpath
    * 開始(オプション)
        * 作ったbatファイルを置いているディレクトリのpath

これで完了です。エラーが出たらプロセスを自動killしてくれるようになりました。
安穏として休暇を過ごせるはずです。

……しかし、世の中そんなに甘くはない。


## エラーも吐かずにプロセスが居残ってしまう場合の対応
万が一、エラーログを吐かずにor通常終了したのに、FileMaker Pro.exeプロセスが不本意に居残り続けてしまったら、どうしたらいいでしょう。

そんなことがあるのかって？
残念ながらあるんです、本当に残念ながら、ええ……

そんなのどうしようもない？
諦めたらそこで試合終りょｒｙ

相手がそんなわけのわからない強引なことをしてくるのであれば、こちらも強引に対応しましょう。スケジューリングに問題のないタイミングで、上記作成のプロセス強制killのbatを実行してあげればよいのです。

当協会ではとりあえず、毎日、00:58、12:58というタイミングで、一日二回、実行するように設定してあります。万が一居残ってしまっても、最悪、このタイミングでリフレッシュはしてくれます。

もうちょっと良い状態監視ができるとよいのですが……この点についてのベストプラクティスをお持ちの方がいらしたら、是非、教えてください。

それでは皆様、どうぞよいお年をお迎えください。
adb backupで 全てのアプリをAPK毎にバックアップする。

#adb backupの問題点
※今回adbのバックアップについては言及しません。

adbを使って全てのアプリをバックアップするには `-all` オプションを指定する事で可能(2016/12/22時点)ですが、この方法だと、install済みのアプリが多い場合は特に、backupfileが巨大なファイルになりえます。

`-apk`オプションを使えば個別にバックアップ可能ですが、package名を指定する必要があり、一つ一つ手動で指定するには億劫です。

-------------------------

#書いてみた
[backup_package.sh](https://gist.github.com/do9iigane/79ef36cc8ec4b6b02585757a3ca7490c)

```bash
FILENAME="packages.txt"

adb shell pm list package > ./$FILENAME;
echo "packages list output to ./$FILENAME";

cat ./$FILENAME | sed -e 's/package://g' | while read LINE;do
 APKNAME=`echo ${LINE} | tr -d '\r'`
  
if [ ! -e $APKNAME.ab ]; then

  echo "backup start : ${APKNAME}";
  adb backup -apk $APKNAME -shared -f $APKNAME.ab;
  echo "backup complete :  ${APKNAME} \n";

else

  echo "$APKNAME.ab is already backup. skip this line.";

fi

done
```

簡単なフローですが、
`adb shell pm list package` とするとintall済みアプリのpackege名一覧が取得できるようなので、カレントディレクトリに packages.txtとして出力します。
その一覧を元に、{package}.abとしてカレントディレクトリに出力していきます。

-------------------------


#今後改善したい点
`  adb backup -apk $APKNAME -shared -f $APKNAME.ab;` が呼ばれる度に端末側で
backup承認画面が表示され[BACK UP MY DATA]を押す必要があります。
`-f` 等でこの承認skipできればいいのですが、最適解は見いだせていません。

-------------------------

#おまけ
端末に依存すると思いますが、よくbackupができていないのか 46byteのファイルが生成されるケースが確認できました。
そんな時は再度adb backup を走らせたいので、以下のように50byte以下のファイルを消しています。

`find . -maxdepth 1 -size -50c | xargs  ls -la`

`find . -maxdepth 1 -size -50c | xargs  rm -f`
Redmineの無料版Easy Ganttへ自由に祝日を表示する方法

[Easy Gantt](https://www.easyredmine.com/redmine-gantt-plugin)は、Redmineに高機能なガントチャート機能を追加するプラグインで、プロ版の他に無料版も用意されている。この無料版でもかなりの機能が使える為、たいへん重宝している。

![easy-gantt.gif](https://qiita-image-store.s3.amazonaws.com/0/48238/6f0a240d-322d-f734-cd99-95d8ce370f5b.gif)

おおむね好評に導入されたのだが、導入後に一番要望として上がってきたのが**祝日をガントチャート上に出したい**というものだった。

## 隠されたEasy Ganttの祝日機能

実は、Easy GanttにはRedmineの環境設定で設定した休日以外にも、カスタムの休日を設定する機能がある。この機能はEasy Redmine社のカスタマイズ版Redmineとの連携を想定しているため、通常は(おそらくプロ版であったとしても)使えない。

また、Easy Ganttの表はJavaScriptを使ってcanvas要素として生成されている為、[RedmineのView Customize pluginでカレンダーに祝日表示 - Qiita](http://qiita.com/kn5/items/4f0d5f2b86527f5f3a1d) のようにHTML/CSS要素レベルでの対応は不可能だった。

そこでcanvas要素を生成しているJavaScriptを解析したところ、すべてのデータと関数が`window.ysy`というグローバル変数に格納されている、昔ながらの実装であることが分かった。さらに、休日をグレーに塗るためのデータが`ysy.settings.holidays`という名前の配列内に[Moment.js](http://momentjs.com/)で解釈できる文字列の形式で格納できる実装となっていた。

**つまり、この配列へEasy Ganttの初期化よりも前にデータを入れておけば、思い通りに祝日を操作できるということになる。**

## View Customizeでグローバル変数をいじる

直接プラグイン内のコードを改変しても良いが、Easy GanttのJavaScriptコードはオープンソースではないライセンスで提供されているため、厳密にはEULA違反となる可能性がある。(RubyコードはGPL)

しかし、View Customizeプラグインで間接的に改変するのであれば問題ないだろう。
View Customizeプラグインとは、Redmineの管理画面から任意のCSS/JavaScriptを追加できる非常に便利なプラグインだ。

### 参考サイト：
* [View Customize - Plugins - Redmine](https://redmine.org/plugins/redmine_view_customize)
* [Redmineのプラグイン「view customize plugin」のカスタマイズ例 - Qiita](http://qiita.com/wfigo7/items/f13a89e1d3522f4a73b6)

## View Customizeで祝日データを入力

以下のような設定をView Customizeに追加することで、任意に祝日を追加できる。下の例では2017年の日本の祝日を設定している。

#### Path Pattern:

`/projects/.*/easy_gantt`

#### Type:

`JavaScript`

#### Code:

```js
// 休日をガントチャートにプロット
window.ysy = { settings: { holidays: [
// 2017年の日本の祝日
"2017-01-02",
"2017-01-09",
"2017-02-11",
"2017-03-20",
"2017-04-29",
"2017-05-03",
"2017-05-04",
"2017-05-05",
"2017-07-17",
"2017-08-11",
"2017-09-18",
"2017-09-23",
"2017-10-09",
"2017-11-03",
"2017-11-23",
"2017-12-23"
]}};
```

### 楽しい祝日ライフを送ろう!

こうして図のように3連休などがガントチャートに反映されるようになった。これで**うっかり祝日にタスクを引かれる**というブラックなアクシデントを回避できるようになった。

![image](https://qiita-image-store.s3.amazonaws.com/0/48238/4db34360-db0d-2c9c-69a1-6e6bb4f47fb5.png)

## こちらもどうぞ!

* [決めておいた方が良いRedmine運用ルール - Qiita](http://qiita.com/y_hokkey/items/3267f7f9b1ced05e0cc0)
* [僕がredmineに入れてる便利なプラグインとデザインの格好良いテーマ - Qiita](http://qiita.com/y_hokkey/items/7c02a3af319b353136d5)
Route 53 でS3のエンドポイントを選択しようとしても「No Targets Available」ターゲットがありません と出てしまう


# ▪️ 本日のお悩み

Route 53 でS3のエンドポイントを選択しようとしても「No Targets Available」ターゲットがありません と出てしまう
(S3での公開のための設定は問題なく終了済み)


<img width="410" alt="Route53" src="https://qiita-image-store.s3.amazonaws.com/0/32215/55de7f50-ff9e-1ebb-1fee-88dbbb4cb148.png">


# ▪️ 結果

1時間くらいしたら、ターゲットが出てきた・・・。時間の問題だったのか。。というところで落ち着きました。


## > 焦って色々調べました

Amazonには上記のようになった場合のトラブルシュートが書かれています。

- [Amazon Route 53 エイリアスリソースレコードセットを作成する際に「No Targets Available」と表示される場合のトラブルシューティングを教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/route-53-no-targets/ )
 
> 既に作成しているオブジェクトが [Alias Target] リストに表示されない場合は、[Alias Target] リストに適切な名前を手動で入力します。
> 
> ウェブサイトエンドポイントとして設定されている Amazon S3 バケット – Amazon S3 ウェブサイトエンドポイントのドメイン名を以下の形式で入力します。
>      s3-website-region.amazonaws.com
> region 値は、バケットがホストされている Amazon S3 リージョンを表します (たとえば、us-east-1)。


- [エイリアスリソースレコードセットの値 - Amazon Route 53 ](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-values-alias.html#rrsets-values-alias-alias-target)

- [amazon s3 - Hosting static website with AWS S3 and Route 53 - Stack Overflow ](http://stackoverflow.com/questions/11711781/hosting-static-website-with-aws-s3-and-route-53)
    - S3の設定に間違いがないか確認しておくのも大事です。
    

## ▪️ S3をWebホストとして公開する手順

### > ポイント

この手順についてはたくさんのっています。のでそちらを参考に。

- [例: 独自ドメインを使用して静的ウェブサイトをセットアップする - Amazon Simple Storage Service ](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/website-hosting-custom-domain-walkthrough.html#website-hosting-custom-domain-walkthrough-domain-registry)

**ちょっとはまるかなと思ったポイントだけ。**

- バケットポリシーの付与
    - Principalの値は「*」
    - Actionは「s3:GetObject」
    - Resourceは「arn:aws:s3:::{自分がつけたs3バゲット名}/*」で「/*」を忘れないように！

```
{
  "Version":"2012-10-17",
  "Statement":[{
	"Sid":"AddPerm",
        "Effect":"Allow",
	  "Principal": "*",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::example.com/*"
      ]
    }
  ]
}
```


## ▪️ 静的コンテンツ配信パターン

この解説が一番役に立ちました。

cloudfrontは独自ドメインのSSLで使うとなると高いので料金表に注意です。

- [AWSにおける静的コンテンツ配信パターンカタログ（アンチパターン含む） ｜ Developers.IO ]
(http://dev.classmethod.jp/cloud/aws/static-contents-delivery-patterns/)
リリースノートを作るRubyスクリプト

# リリースノートを作る

こんなかんじです
![スクリーンショット 2016-12-22 13.32.08.png](https://qiita-image-store.s3.amazonaws.com/0/108235/d92d1bb0-af31-db6d-bcea-e75e896df2d0.png)

# 使い方

## 1. **chrome-cli**
次のコマンドでインストールしてください
Google Chromeをコンソールから操作できるようになります

```
brew install chrome-cli
```
 
## 2. master=>developのプルリクエストURLを作成
GoogleCromeで**一番上で**開いておきます

## 3. 次のコードを実行します

```
rails c
pry > load "Desktop/note.rb"
```

```rb:Desktop/note.rb
require 'nokogiri'

s=3

# MergeコミットのPRのURLを取得
pull_urls = Nokogiri::HTML.parse(`chrome-cli source`).css('a').map { |m| m.attr(:href) }.grep(/pull\/\d+\Z/).uniq.compact

puts pull_urls.count
idx = 0

# PRのURLから、IssueのURLを取得
issues_urls = pull_urls.map { |m|
  puts idx+=1
  `chrome-cli open #{m}`
  sleep(s)
  url= Nokogiri::HTML.parse(`chrome-cli source`).css('a').map { |m| m.attr(:href) }.grep(/issues\/\d+\Z/)
  `chrome-cli close`
  url
}.flatten.uniq.compact

idx=0

# IssueのURLからタイトルとURLと、ひも付けられているPRのURLを取得
issue_describe = issues_urls.map{ |m|
  puts idx+=1
  url = m[0] == '/' ? "https://github.com#{m}" : m
  `chrome-cli open #{url}`
  sleep(s)
  doc = Nokogiri::HTML.parse(`chrome-cli source`)
  items = doc.css(".discussion-item-rollup-ref")
  merge_pull = items.map do |item|
    item.css("span").text =~ /Merged/ ? item.css("h4 > a").map{ |e| "[#{e.text}](#{e.attr(:href)})" } : []
  end
  arr = [doc.title, url, merge_pull.uniq.compact.join('<br>')]
  `chrome-cli close`
  arr
}

$issue = issue_describe

# マークダウンのテーブル形式で表示する

puts "| Title | Issue | Pull-request |"
puts "|:---:|---|---|"
puts $issue.map{ |m|
  next if m.first =~ /Pull Request #\d{1,5}/
  "| #{m.map{ |s| s.gsub(/\s/,'') }.join(' | ')} |"
}.compact
機械学習におけるクラス分類問題の各関数の意味解説

# クラス分類問題の関数
* 機械学習系のクラス分類問題の関数にはSoftmax関数やCross Entropy関数が使用されている

* 調べると「情報量が～、エントロピーとは～」となり、どういう働きをしているのか理解が困難

* 今回は数学的な難しさは置いておいて、どういう嬉しさがあるのかを簡単に説明


![image](https://qiita-image-store.s3.amazonaws.com/0/134368/1f3ac2a0-88c9-ec6d-44c0-bf328f20b160.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/056c0b76-ec99-4e37-365a-a9a7ecf3959f.png)

# クラス分類CNNの流れ

* 説明に入る前に全体の流れを復習

* 𝑁クラス分類器学習時の処理の流れは以下

1. 画像入力
2. N次元のベクトルを答えとして生成
3. Softmax関数で正規化
4. Cross Entropyで誤差計算
5. 逆誤差伝播法で誤差最小化

# N次元ベクトルを出力

* N個のクラスがある分類問題を解かせる場合、画像を一枚入力して、N次元のベクトルを出力

* 別に1次元のベクトル(数値？)にして、最適化してもよかったはず・・・。（うまくいくかはわからない）
* なぜN次元にしたか＝答えがOne-hotで示せる

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/22b48149-c665-dad8-f496-d1e59a28656c.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/e2158976-9b32-f757-bbd7-5626ee4baad7.png)

# 答えをOne-hotにする嬉しさ
答え𝒚をOne-hotベクトルとすることで、Cross Entropyに入れたとき、和の部分が消え、logだけの簡単な関数になる

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/dc0dcb2a-d8c8-9f2f-ccd8-71ec9f465541.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/134368/c847d7b8-e272-a5cf-b2d3-7bf8f3968f1f.png)


# Softmax関数

* やってることは単に正規化
* 正規化とは数値を0～1の範囲に収めること
* これができるのもＮ次元ベクトルのおかげ
* eを使っているのは誤差伝播のときに微分する必要があるため

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/af359147-0196-19e0-1072-4d1ca4aa7388.png)

# クラス分類問題で正規化する嬉しさ

* 正規化することで𝑥_𝑖 は0～1になっている
* さらに総和が1になる
* これは各クラスに属する確率と考えられる

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/0214f789-e9bb-0f0b-2aca-e7c1cdbc132b.png)

# 誤差伝播

* 誤差伝播時は誤差関数を微分し、その傾きに比例して更新値を決定する
* logのグラフをみると正解クラスに属する確率𝑥_𝑖が0に近いほど微分したときの傾きは大きくなり、1に近いほど傾きは小さくなる
* logの形は誤差関数に最適！

![image](https://qiita-image-store.s3.amazonaws.com/0/134368/f1c439d4-a9e4-7236-28f6-78cdf2d2fcdb.png)

# まとめ

* N次元出力、Softmax関数、Cross Entropy関数、逆誤差伝播について解説した
* logの関数の形(0～1範囲の勾配)が肝
* クラス分類問題以外の問題を解くときも誤差関数の形をきちんと設計することが大切

# 正確には（発展）
* 正確には微分するのは𝑥についてではなく、畳み込みなどの重み𝑤についてだと考えるべき
* だが誤差関数の重みについての微分は𝑥についての微分と出力𝑦との積で求まる
* よって誤差関数を考える際は𝑥についての微分について議論すればよい

参考： http://qiita.com/Ugo-Nama/items/04814a13c9ea84978a4c

スライド版：http://www.slideshare.net/ssuser6e1346/ss-70327136