OmniAICreator/Qiita-1.07M huggingface dataset:
WP KUSANAGIプラグインをアップデートする

# はじめに
WordPressのサーバにKUSANAGIを使っています。とても早くて便利です。
KUSANAGIのシステムの一部としてWP KUSANAGIプラグインがあるのですが、そのプラグインをバージョンアップした時のメモです。

# ざっくりまとめ

1. 公式のやり方あります。でも今回は動かなかったです。
2. yumのパッケージを更新します。
3. `/usr/lib/kusanagi/resource/DocumentRoot/wp-content/mu-plugins`から上書きします。

# KUSANAGIの名前と構成について
KUSANAGIは「超高速WordPress仮想マシン」ということで、WordPress用のサーバ構成をVPS、クラウドサーバなどで手軽にデプロイできるサービス名、となっています。

KUSANAGI: サービス名の総称。イメージ名。
KUSANAGIコマンド: プロファイル（ドメイン）の追加、HHVMの切り替えをCUIで実行するためのツール
WP KUSANGI: プラグイン（今回はこのアップデート）

# アップデートの参考情報
[公式サイト](https://kusanagi.tokyo/archives/3384/)からアップデートのための手順が公開されていました。
しかし残念ながら自分の環境では動かせず、手動でアップデートを行いました。

<img width="266" alt="Screen Shot 2017-04-17 at 16.21.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/5ca82b6b-a934-a1e4-b79b-9b769f10ba3e.png">

`--debug`や`--verbose`的なオプションが見つからなかったので手動で行いました。

動くのであれば公式の手順で行ったほうが無難かと思います。

# プラグインの確認
今回はWP KUSANAGIプラグインをアップデートします。
プラグインのバージョンについてはWordPressの管理画面から確認できます。
KUSNAGI環境では必須プラグインとなっていますので、「プラグイン＞インストール済みプラグイン＞必須」から確認します。

<img width="998" alt="Screen Shot 2017-04-17 at 16.18.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/c6915e5a-d3b8-3f8d-03ba-96fe04acb427.png">

配布されているプラグインの最新バージョンについては確認方法が不明でした。

# パッケージ全体のアップデート
KUSANAGIではアップデートにyumを使っていて、専用のkusanagiリポジトリを参照しており、そこからアップデートパッケージを取得しています。
こちらをアップデートすることでkusanagiコマンド、インストールされるWP KUSNAGIプラグイン、その他諸々のミドルウェア群がアップデートされるようです。
kusanagiパッケージのバージョンについてはログイン時にfortuneとして表示されています。

<img width="442" alt="Screen Shot 2017-04-17 at 16.35.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/bdfd4f37-a49e-96bb-c6f1-cb3421d5076f.png">

まずは`yum update`でこのパッケージ群などをアップデートします。

```zsh
$ yum update -y
```

<img width="563" alt="Screen Shot 2017-04-17 at 16.37.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/d159438a-e89f-6a76-86d7-77b0d40aab07.png">

システム側のパッケージをアップデートしたくない場合にはkusanagiのみを指定すれば良いかなと思います。

```zsh
$ yum update kusanagi
```

パッケージをアップデートすると内包するプラグインもアップデートされます。置いてある場所は下記の通りです。
`/usr/lib/kusanagi/resource/DocumentRoot/wp-content/mu-plugins`

KUSANAGIのサービスによっては場所によって違うかもしれないです。
locateコマンドで場所を確認しました。

```zsh
$ locate kusanagi-core
```

対象ファイルのバージョンを確認しておきます。

```zsh
$ grep Version /usr/lib/kusanagi/resource/DocumentRoot/wp-content/mu-plugins/wp-kusanagi.php
```

<img width="559" alt="Screen Shot 2017-04-17 at 16.22.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/a7413bb2-7702-9664-6234-d9af810fdd9b.png">


ちゃんと新しいですね。

このディレクトリを実際のWordPressへコピーします。既存バージョンのプラグインを退避し、ファイルコピーをkusanagiユーザで実行します。

```zsh
$ cd ~kusanagi/www.l2tp.org/DocumentRoot/wp-content/
$ sudo -u kusanagi sh -c 'mv mu-plugins mu-plugins_; cp -Rp /usr/lib/kusanagi/resource/DocumentRoot/wp-content/mu-plugins ./'
```

WordPressの管理画面でバージョンを確認しておきます。
<img width="1040" alt="Screen Shot 2017-04-17 at 16.18.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/1435d90b-c8ce-7623-9272-a9336167be74.png">


上がってますね。

キャッシュ系のphpファイルも更新しておくようにします。

<img width="337" alt="Screen Shot 2017-04-17 at 16.45.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/fa72c0cf-6bd9-ffe6-ca92-f16111d8db18.png">


公式の手順とは違うので間違ってるかもしれませんが、以上の手順でバージョンアップできたようです。
Windows ServerのFlash Playerを使えるようにする

#はじめに
Windows ServerでFlash Playerを使えるようにするには、デスクトップエクスペリエンスのインストールが必要です。その手順をここに示してみようと思います！

#サーバーマネージャーの起動
まずサーバーマネージャーを起動します。
![マネージャー.png](https://qiita-image-store.s3.amazonaws.com/0/141025/0cac513e-db3f-dc14-cdbe-2bf5d14a2280.png)

#サーバーマネージャー
2の「役割と機能の追加」を選択します。
![ローカルサーバーの構成.png](https://qiita-image-store.s3.amazonaws.com/0/141025/fed48138-30c7-73ef-89e3-5413bbe34619.png)

「役割ベースまたは機能ベースのインストール」をクリックします。
![役割ベース.png](https://qiita-image-store.s3.amazonaws.com/0/141025/bf1cf55c-feed-8423-493e-f11e30a79d6e.png)

「機能」ー「User Interfaces and Infrastructures」ー「Desktop Experience」を選択します。
（画像はインストール済みのものです。）
![デスクトップ.png](https://qiita-image-store.s3.amazonaws.com/0/141025/82d45662-0669-2965-ef5c-ca365392bab9.png)

あとはガイドに従ってインストールして、Flash Playerを使う操作で動作を許可すればFlashが動くようになるはずです！


#参考
Windows Server 2012 の IE10 には Flash Player が同梱されてるけど デスクトップ エクスペリエンス をインストールしないと使えないんだよねっ
http://unsolublesugar.com/20130211/002147/
例外処理小史

先日の達人プログラマー輪読会で社内でt_wadaさんが語ってくれた話をまとめました。

# 例外以前

例外以前はreturnで表現してた。

```c
int result = hoge();
if (result < 0) {
  // result の値が負の値だったら例外として扱う
}
```

returnだと呼び出し側で評価しなくても例外のキャッチをサボれてしまい、サボりやすくなる。

```c
// 戻り値を検証しないだけで例外をサボれる
hoge();
```

# try-catch

この問題に対処するために例外をtry-catchで受け取るパターンが生まれてくる。

```c
try {
  hoge();
} catch (e) {
  // 例外処理
}
```

ただ今度はこれだとthrow例外はtry句内ではどこでもcatch節に飛べてしまいlong jumpになる。

```c
try {
  //
  for (...) {
    hoge(); // throw error
  }
  //
} catch (e) {
  // forループの状態を無視してここに来る
}
```

またこの他にもtry-catch特有の問題としては、

- リソースの解放がやりにくくなる(try-with-resourceが必要になる)。
- 非同期呼び出しでスレッドを跨いでしまうと例外をうまく補足できない。

という問題がある。このため、

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">例外はマルチコア時代にそぐっていないという話、非常に面白かった。</p>&mdash; Yosuke FURUKAWA (@yosuke_furukawa) <a href="https://twitter.com/yosuke_furukawa/status/852815211077672960">April 14, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

という発言に繋がる。

# 最近の言語

これを最近のモダンな言語では、try-catchを使っていないことが多い。

例えば　Golangでは結局タプルをreturnで表現した上で値が使われていないとコンパイラが怒る。また、非同期呼び出しでは例外はchannelを使って渡すことも多い。

この他にも戻り値を表現する時にResult(Rust)やPromise(JavaScript)などの値を抽象化したクラスで例外を表現するというやり方が出てきている。

JavaScriptに関して言えば過去にはイベントとしてエラーを表現するStreamもあり、さらにES2017ではasync-awaitが入って、非同期もキャッチできるtry-catchが増えている、このように同期と非同期の垣根は少なくなってきている。やり方は定まりきっていないが、JavaScriptはTIMTOWDIな言語なので一旦これで良いとしよう。

# 達人プログラマー輪読会の話の中で語っていた重要な点

重要なのは言語やライブラリ、アプリケーションによって例外とかエラー処理をハンドリングする方法も、また何を例外として捉えるかの考え方が違うので、あまり一様な扱いはできない、逆に言うと別文化圏から来るとこの辺の書き方は慣例に習っていく必要がある。
初級Vimmerから中級Vimmerになるために


# 背景
私はこれまでにちょっとした文章編集が出来る程度にはVimを使ってきました。しかし、最低限の使い方しか覚えていませんでした。今回は、初級Vimmerからもう一歩成長するためにこれは覚えておきたい、と思うものをまとめてみました。


# 初級Vimmer
これさえ覚えてればなんとかなる、というのをまずは紹介します。

## モードの切り替え
Vimにはいくつかのモードがあり、それを切り替えていく必要があります。最低限、コマンドモードと入力モードの切り替えが出来ればなんとかなります。
### コマンドモード→入力モード ```i```
Vimを開いたときはコマンドモードになっています。しかしそのままでは文字を入力出来ません。そこでまずは、```i```を入力することで入力モードに切り替えます。入力モードへの切り替え方はいくつかありますが、```i```を押せば最低限なんとかなります。
### コマンドモード→入力モード ```Esc```
文章編集が終わって保存するためにはコマンドモードから入力モードに切り替えなければなりません。そんなときは```Esc```を押せば切り替えられます。

## 保存と終了
### 保存 ```:w```
コマンドモードで、```:``` + ```w```で保存できます。
### 終了 ```:q```
コマンドモードで、```:``` + ```q```で終了できます。
### 強制的に保存 ```:q!```
ファイル編集しちゃったけど保存せずに終了したいときは、コマンドモードでこれを使います。
### 保存+終了 ```:wq```
保存してそのまま終了もしたいときは、コマンドモードでこれを使います。


# 中級Vimmer
ここからが本番です。上記で紹介したことが分かって入れば、とりあえずなんとか文章編集することは出来ます。しかし、プロVimmerからするとめちゃくちゃ効率悪いし、便利な機能を何一つ使ってないんだと思います(反省・・・)。これから紹介するのを使いこなせるようになれば、中級とまではいかなくても脱初心者くらいは出来るのではないかと思います。

## カーソル移動
コマンドモードにて、矢印キーを使えばカーソルを移動することが出来ます。しかし、それは初級Vimmerのやることです。Vimにはカーソル移動を素早く行える方法がいくつもあります。少しずつ使いこなせるようになりましょう。
### 一つずつ移動 ```kjhl```(```↑↓←→```)
Vimでは上下左右 ```↑↓←→``` が、 ```kjhl``` に対応しています。初めは矢印キーの方が使いやすいですが、 ```kjhl``` に慣れることでホームポジションから手を動かすことなく一つずつの移動を行うことが出来ます。脱初心者の第一歩ですね。

|初級|中級|
|---|---|
|↑|k|
|↓|j|
|←|h|
|→|l|
### 行移動 ```^``````$```
コマンドモードにてこれらを使えば、行の先頭と末尾へ一発で移動することが出来ます。

|||
|---|---|
|行の先頭へ|^|
|行の末尾へ|$|
### ファイル移動 ```gg``````shift+g```
コマンドモードにてこれらを使えば、ファイルの先頭と末尾へ一発で移動することが出来ます。

|||
|---|---|
|ファイルの先頭へ|gg|
|ファイルの末尾へ|shift+g|

## コピー&ペースト
### 1行コピー ```yy```
コマンドモードにて、コピーしたい行にカーソルを移動し、```yy```と入力するとその行をコピーすることが出来ます。
### n行コピー ```nyy```
例えば、その行から5行コピーしたい場合は```5yy```と入力すればよいです。
### 1行ペースト ```p```
コマンドモードにて、```p```を入力することで、カーソルがある行の下の行にコピーしたものを1つ分ペーストすることが出来ます。
### n個ペースト ```np```
例えば、コピーしたものを3つ分ペーストしたい場合は```3p```と入力すればよいです。

## 削除
*コメントにより追記（4/20）させていただきます*
### 1文字削除 ```x```
コマンドモードにて、消したい文字にカーソルを合わせて、```x```を入力すると1文字削除することが出来ます。
### 1行削除 ```dd```
コマンドモードにて、消したい行にカーソルを合わせて、```dd```を入力すると1行削除することが出来ます。


## 戻る ```u```
直前の編集を取り消したい場合は、```u```を使いましょう。いわゆる ```command + z``` 的な感じです。



# まとめ
Vimにおいて便利な機能はまだまだありますが、今回は初級Vimmerが次に取り込みやすそうなものをいくつか紹介しました。よく使いそうなあたりから身につけて、だんだんとVimを効率よく使いこなせるようになりましょう！
GitHubアカウントの取得方法

###GitHubアカウントの取得方法を案内します。  

こちらからGitHubページに進んでください。
**https://github.com/**

##１、ユーザー名・メールアドレス・パスワードを入力します。


![手順１.png](https://qiita-image-store.s3.amazonaws.com/0/175357/d2d436c4-de85-4487-da78-6260980aa740.png)


##２、プランを指定します。
（フリー（無料）で利用するを選択します。）

![手順２.png](https://qiita-image-store.s3.amazonaws.com/0/175357/b5878e85-0abc-9187-27f3-ed6d5385724f.png)


##３、アンケート画面です。
ご自由に選択ください。(スキップも可能です。)


![手順3.png](https://qiita-image-store.s3.amazonaws.com/0/175357/9dbfe3b1-194d-7877-0a02-eaec64740b5e.png)


##４、Start画面がでます。
（※この後にメールアドレスの登録があります。）
![手順4.png](https://qiita-image-store.s3.amazonaws.com/0/175357/e03816a3-eace-ecc1-7c3d-c08ed8d9918c.png)
下の画面が表示されたら、メールを確認してください。
![手順5.png](https://qiita-image-store.s3.amazonaws.com/0/175357/3d05ef85-26a1-8dd7-3ce7-3d85e8fe2f7f.png)



##５、GitHubより登録用のメールが届きます。
（件名：[GitHub] Please verify your email address.）  

メール文章にある**Verify email address** の文字をクリックします。  
 

Your email was verifiedと表示された画面がでたら、
メールアドレスの登録が完了となります。

※登録完了のメールが届きます。  
![start_mail.png](https://qiita-image-store.s3.amazonaws.com/0/175357/8397bd09-1d36-c43b-7709-445dbce878a6.png)



以上、取得方法でしたm(_ _)m

※GitHub公式ページにて取得方法に変更がある場合があります。
wordpressで独自ドメイン設定したのにパーマリンクのドメインが初期ドメインのままだったのを修正したった


メニュー
->設定
->一般
->wordpressURLとサイトURLを独自ドメインに変更
->変更を保存
->強制ログアウトされてwordpressのログイン画面になる
->ログインして今まで通り利用可能
->サイトで確かめるとパーマリンクもちゃんと変わっている♫

(参考)
http://weeklyprowrestling.com/broadcast/wordpressdomain/#wordpress-3
apache2.4 httpsでhtaccessを有効化するときハマった

## 訂正

サーバーコンフィグ内で

```apache
<Location />
RewriteEngine On
...
</Location>
```

こんな感じでLocationに `RewriteEngine On` 書いていたのが原因だった模様。
除去したら通常通り動きました。
この状態で下記のようにVirtualHost内に `RewriteOptions Inherit` を書くと、ドキュメントルート内の.htaccessがLocation内に書いてあるのと同じような挙動をするようになってしまう。
`RewriteRule (.*)index\.html test.html_$1 [R,L]`
とかかいて実験してみた。
`/index.html` にアクセスすると、 `/test.html_/var/www/html` にリダイレクトした。要注意。
**Locationディレクティブにリダイレクトを書くのはやめましょうということですね。**

### ~~tldr;~~

~~`<VirtualHost>` セクション内に~~

```
RewriteEngine On 
RewriteOptions Inherit
```

~~を記述すること。~~

### ~~解説~~

~~apache2.2では上記の記述がなくてもいいっぽい。(試してない)~~
~~`<Directory>` セクションを別の場所で書いていて、そこでAllowOverride Allをしていた場合にはまることがある。~~


### 参考

http://moruho.cocolog-nifty.com/blog/2011/04/virtualhostmod_.html
Android 版 Chrome でソースコードを表示する方法

## view-source:をURLに追加

URLの頭に`view-source:`を追加するとソースコードを表示できます。

```:URL
view-source:http://qiita.com/halpas/items/b08307ca287fc0e2be05
```

### iOS版はできない

iOSのウェブブラウザはChromeでもApple独自仕様となるため、この方法は使用できません。
[JAWS-UG CLI] S3: #19 バケットの削除

AWS CLIでS3バケットを削除してみます。

前提条件
========


S3への権限
----------

S3に対してフル権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.28

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.70 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.33

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <s3のフル権限を許可されているプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      <s3のフル権限を許可されているプロファイル>

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='<s3のフル権限を許可されているプロファイル>'
```


0.2. リージョンの指定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


最終確認
--------------

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <s3のフル権限を許可されているプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1


1. 事前作業
===========


1.1. バケット名の指定
---------------------

削除するバケット名を指定します。

```bash:変数の設定:
S3_BUCKET_PREFIX='<削除するバケット名を特定する文字列>'
```

```bash:コマンド:
S3_BUCKET_NAME=$( \
        aws s3api list-buckets \
          --query "Buckets[?contains(Name,\`${S3_BUCKET_PREFIX}\`)].Name" \
          --output text \
) \
        && echo ${S3_BUCKET_NAME}
```

結果(例):

      <削除するバケット名>


1.2. バケットのリージョン確認
-----------------------------

バケットのリージョンを確認します。

```bash:コマンド:
aws s3api get-bucket-location \
        --bucket ${S3_BUCKET_NAME}
```

結果(例):

      {
        "LocationConstraint": "ap-northeast-1"
      }


1.3. バケットの中身の確認
-------------------------

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      (戻り値なし)

もしオブジェクトが存在する場合は、削除します。

```bash:コマンド:
aws s3 rm s3://${S3_BUCKET_NAME} \
        --recursive
```

結果(例):

      delete: s3://<削除するバケット名>/<削除するオブジェクト名>


2. バケットの削除
=================

```bash:コマンド:
aws s3api delete-bucket \
        --bucket ${S3_BUCKET_NAME}
```

結果(例):

      (戻り値なし)


3. 事後確認
===========

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist


完了
====
[JAWS-UG CLI] S3: #18 ソースコード用バケットの作成


.. 事前作業2. S3バケットの作成 (ソースコード保存用)


前提条件
========


S3への権限
----------

S3に対してフル権限があること。


STSへの権限
-----------

STSに対してget-caller-identityサブコマンドの実行権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.28

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.70 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.33

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        AWS_ID               (0.3) ${AWS_ID}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <s3にフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      AWS_ID               (0.3) XXXXXXXXXXXX

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      <s3にフル権限のあるプロファイル>

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='<s3にフル権限のあるプロファイル>'
```


0.2. リージョンの指定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.3. AWS IDの取得
-----------------

```bash:変数の設定:
AWS_ID=$( \
        aws sts get-caller-identity \
          --query 'Account' \
          --output text \
) && echo ${AWS_ID}
```

結果(例)

      XXXXXXXXXXXX


最終確認
--------------

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        AWS_ID               (0.3) ${AWS_ID}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <s3にフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      AWS_ID               (0.3) XXXXXXXXXXXX


1. 事前作業
===========


1.1. バケット名の指定
---------------------

```bash:変数の設定:
S3_BUCKET_NAME="source-${AWS_DEFAULT_REGION}-${AWS_ID}" \
        && echo ${S3_BUCKET_NAME}
```

同名バケットが存在しないことを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist


2. バケットの作成
=================

```bash:変数の確認:
cat << ETX

        S3_BUCKET_NAME:     ${S3_BUCKET_NAME}
        AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}

ETX
```

```bash:コマンド:
aws s3api create-bucket \
        --bucket ${S3_BUCKET_NAME} \
        --create-bucket-configuration "LocationConstraint=${AWS_DEFAULT_REGION}"
```

結果(例):

      {
        "Location": "http://source-northeast-1-XXXXXXXXXXXX.s3.amazonaws.com/"
      }


3. 事後確認
===========


3.1. バケットの存在の確認
-------------------------

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      (戻り値なし)

エラーが出なければOKです。


3.2. バケットのリージョンの確認
-------------------------------

```bash:コマンド:
aws s3api get-bucket-location \
        --bucket ${S3_BUCKET_NAME}
```

結果(例):

      {
        "LocationConstraint": "ap-northeast-1"
      }


完了
====
AptanaStudio3の設定手順の覚書

#AptanaStudio3の設定手順の覚書
環境構築時にやったことを記しておく。環境はWindows10　構築したのは2017/4　
###ダウンロード
[Aptana公式ページ](http://www.aptana.com/index.html)のPRODUCTSからAptanaStudio3のインストーラを落とす
今回はWindows10に単体でインストールするのでWindowsを選択しStandalone Versionにチェックを入れメールアドレスを入力しダウンロードする
###インストール
落としたインストーラを起動すると
Failed to correctly acquire installer_nodejs_windows.msi file:CRC error.
というエラーが発生しインストールすることができなかった
そのためコマンドラインからオプションをつけてインストールを行った
**手順**
1.コマンドプロンプトを立ち上げインストーラのある場所に移動する
2.Aptana_Studio_3_Setup_3.6.1 /passive /norestartを入力しエンターを押す
(Aptana_Studio_3_Setup_3.6.1はインストーラのファイル名)
###日本語化
Aptanaはそのままでは全て英語なので日本語化する
**手順**
1.[Pleiades 本体ダウンロードページ](http://mergedoc.osdn.jp/)より最新版のPleiadesプラグイン を落としてくる
2.落としたZIPファイルを解凍し中にある「features」と「plugins」フォルダと「eclipse.exe-clean」をコピーし「Aptana Studio 3」のフォルダにペーストする
3.「Aptana Studio 3」のフォルダ内にある「AptanaStudio3.ini」ファイルをテキストエディタで開き最後の行に
「-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar」
を追記する
3.1ついでにコンソールの文字化け対策に文字コードをUTF-8に変更する
「AptanaStudio3.ini」ファイルの最後の行にさらに「-Dfile.encoding=utf-8」を追記する
4.「eclipse.exe-clean」内の
「start /d ”start /d "%~dp0" .\eclipse.exe -clean %\*」を
「%~dp0" .\AptanaStudio3.exe -clean %\*」に書き換える
5.「eclipse.exe-clean」を実行する
以上で日本語化ができているはずである
日本語化を行うとインストール時にデスクトップに作成されるAptanaStudio3が実行できなくなることがある
その時はインストール先のｅｘｅファイルへのショートカットと置き換えるといいだろう
###デバッグ
デバッグの設定で「php.ini」を変更する必要があると調べたら出てきたが書き換えるべき[XDebug]の項目がファイル内に存在しなかった。
「php.ini」内の末尾に下記のものを追加したところデバッグが可能になった
***
[XDebug]
zend_extension = "C:\xampp\php\ext\php_xdebug.dll"
xdebug.remote_autostart=on
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_mode=req
xdebug.idekey="netbeans-xdebug"
***
テスト環境用 お手軽zabbix server

ふとした切っ掛けから作ってみたHyper-V用のZabbix Serverです。
https://drive.google.com/file/d/0BwNMG_0zZ-yxNE5zcGNWRWFxY0k/view
（Google driveに置いています、容量は510MBほど）
誰かの手助けに成れば幸いです。

# ・どんなものか
Hyper-V上に構築したCentOS7ベースのZabbix Server 3.0.8です。
圧縮ファイルを解凍後（64GBの容量が必要となりますので、HDD等の容量は注意して下さい。）
Hyper-Vマネージャーでインポートをしてから起動して下さい。
無事起動しましたら、ブラウザ上で http://192.168.1.126/zabbix と入力すればLogin画面が出て来ます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/150917/683a081d-496d-9340-bb4d-ceea9cce0f56.png)

Username  admin
Password  zabbix
です。　（書き抜かっていました。）

基本としてはWindowsしか使った事が無い人がZabbixを触る為の物として、起動さえしてしまえばCentOSを触る事無くブラウザ上の操作から始められる様にしました。
又、クラスCの固定IPアドレスを割り振ってますのでその点は注意をお願いします。

# ・環境について
Host serverは次のスペックで動かしてます。
・CPU Pentium G6950
・RAM 16GB
・HDD OS用に1台 VHD用に1台

この環境で CPU2コアリソース45%　RAM3GB VHD固定64GB NIC1基で構成をしています。
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/150917/6ce4ce9d-0553-4f85-8cb3-e7d072c96abe.png)

又、私がこの4年間に身に付けたノウハウも落とし込んでおりますので
小規模（ホスト数30 アイテム数2000 1秒あたりの監視項目数45程度）の運用にも耐えられるかと思っています。
ですが「Windowsしか使った事が無い人がZabbixを触る為の物」としてのテスト用ですから
正直セキュリティは甘くなっておりその点は十二分にご確認の上で実運用に反映する様にお願いします。

#・次にZabbixサーバーで登録しているID&Pass等の設定は
次の通りなります。
rootID:		root
rootPass:	root

userID:		user
userPass:	user

mysqlへアクセス用のユーザー
userID:		zabbix
userPass:	zabbix

CentOS上のネットワーク
IPアドレス	192.168.1.126
サブネット	255.255.255.128
ゲートウェイ	192.168.1.1
DNS		8.8.8.8
この通りですので必要応じて、書き換える様にお願いします。


#・最後に
感想や何かありましたらTwitterの次のアカウントまで、教えて頂けると助かります。
@Toshihiro_SKK　　榊 俊裕
[JAWS-UG CLI] S3: #17 アーティファクト用バケットの作成


前提条件
========


S3への権限
----------

S3に対してフル権限があること。


STSへの権限
-----------

STSに対してget-caller-identityサブコマンドの実行権限があること。


AWS CLIのバージョン
-------------------

以下のバージョンで動作確認済

- AWS CLI 1.11.28

```bash:コマンド:
aws --version
```

結果(例):

      aws-cli/1.11.70 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.33

バージョンが古い場合は最新版に更新しましょう。

```bash:コマンド:
sudo -H pip install -U awscli
```


0. 準備
=======

まず変数の確認をします。

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        AWS_ID               (0.3) ${AWS_ID}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <s3にフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      AWS_ID               (0.3) XXXXXXXXXXXX

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を
行います。


0.1. プロファイルの指定
-----------------------

プロファイルの一覧を確認します。

```bash:コマンド:
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'
```

結果(例):

      iamFull-prjz-mbpr13
      <s3にフル権限のあるプロファイル>

```bash:変数の設定:
export AWS_DEFAULT_PROFILE='<s3にフル権限のあるプロファイル>'
```


0.2. リージョンの指定
---------------------

```bash:変数の設定:
export AWS_DEFAULT_REGION='ap-northeast-1'
```


0.3. AWS IDの取得
-----------------

```bash:変数の設定:
AWS_ID=$( \
        aws sts get-caller-identity \
          --query 'Account' \
          --output text \
) && echo ${AWS_ID}
```

結果(例)

      XXXXXXXXXXXX


再確認
--------------

```bash:変数の確認:
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        AWS_ID               (0.3) ${AWS_ID}

ETX
```

結果(例):

      AWS_DEFAULT_PROFILE: (0.1) <s3にフル権限のあるプロファイル>
      AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
      AWS_ID               (0.3) XXXXXXXXXXXX


1. 事前作業
===========


1.1. バケット名の指定
---------------------

```bash:変数の設定:
S3_BUCKET_NAME="artifact-${AWS_DEFAULT_REGION}-${AWS_ID}" \
        && echo ${S3_BUCKET_NAME}
```

同名バケットが存在しないことを確認します。

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist


2. バケットの作成
=================

```bash:変数の確認:
cat << ETX

        S3_BUCKET_NAME:     ${S3_BUCKET_NAME}
        AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}

ETX
```

```bash:コマンド:
aws s3api create-bucket \
        --bucket ${S3_BUCKET_NAME} \
        --create-bucket-configuration "LocationConstraint=${AWS_DEFAULT_REGION}"
```

結果(例):

      {
        "Location": "http://artifact-northeast-1-XXXXXXXXXXXX.s3.amazonaws.com/"
      }


3. 事後確認
===========


3.1. バケットの存在の確認
-------------------------

```bash:コマンド:
aws s3 ls s3://${S3_BUCKET_NAME}/
```

結果(例):

      (戻り値なし)

エラーが出なければOKです。


3.2. バケットのリージョンの確認
-------------------------------

```bash:コマンド:
aws s3api get-bucket-location \
        --bucket ${S3_BUCKET_NAME}
```

結果(例):

      {
        "LocationConstraint": "ap-northeast-1"
      }


完了
====
WindowsPowerShellでJavaプロセスをPID指定で強制停止

#環境
Windows Server 2012R2
PowerShell 4.0

#背景
Javaプロセスの停止が途中でハングし後続ジョブに進めないことに備え、スクリプトでプロセス停止後に強制停止を仕込むことがあります。
Windowsで同一OS内にJavaプロセスが複数存在する場合、名前(java.exe)指定でtaskkillすると全てのJavaプロセスを落としてしまいます。
特定のJavaプロセスを停止させたい場合はプロセスID(PID)で識別しますが、ここではPIDファイルを利用した強制停止を試しています。

#Java強制停止のコマンドレット

Java停止コマンドの実行後に、下記を追加します。

```ps1:javakill.ps1
# PIDファイルパス -IBM WASでの例-
$pid_file = "${install_root}/profiles/${profile_name}/logs/${server_name}/${server_name}.pid"
 
if(test-path $pid_file){
    # プロセスがまだ残っていたらkillしてpidファイルも削除
    write-output "Kill process:${server_name}"
    $pid = get-content $pid_file
    stop-process $pid -force
    remove-item $pid_file
}else{
    # プロセスが既に正常停止していたら何もしない
    write-output "process:${server_name} was already stopped:"
} 
```
JavaのPIDファイルは、製品によって出力場所も異なりますのでご注意ください。
IBM WASベースの製品では、PIDファイルはJavaプロセス起動時に生成され、停止時に削除される仕様のため、次回起動時に影響しないよう、強制停止時にもPIDファイルも削除しておきます。

#参考
http://qiita.com/opengl-8080/items/bb0f5e4f1c7ce045cc57
http://labunix.hateblo.jp/entry/20121108/1352378556
https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014801453#77777777-0000-0000-0000-000014810269
bluewindにゴミ箱を登録する


Windows7前提。

## ①「ファイル名を指定して実行」の特殊フォルダ呼び出すやつを利用
「ファイル名を指定して実行」で`shell:RecycleBinFolder`と入力するとゴミ箱を開くことができる。

こうした`shell:*`系のショートカット？エイリアス？なんつーの？は　bluewindからも利用できる。同様に、`shell:startup`とか`shell:desktop`とか、`calc`とかも登録可能。

`shell:*`だとリンク切れ表示が出るのがちょっとだけ気になるが、今回はこちらを採用。

## ②ゴミ箱内のデータが保存されているパスを直接指定する
ゴミ箱内のデータは`C:\$Recycle.Bin`に保存されている。ただし、フォルダーオプションで「保護されたオペレーティング システム ファイルを表示しない」のチェックを外さないと、内容が表示されない。（「このフォルダーは空です」と表示される。）

チェックを外してアクセスしてみると、日付ごとのフォルダが表示される。復元ポイント作ったときかなんかにバックアップが取られているのだろうか？

![画像](http://i.imgur.com/O3YC80k.png)

## アイコンを指定
ゴミ箱を含むシステムフォルダのアイコンは`C:\Windows\System32\imageres.dll`に格納されている。

bluewindの通常コマンド設定画面でctrl+iを押しアイコンの変更画面を呼び出し、「参照」から上記パスを指定すれば一覧が表示され選択可能。

![画像](http://i.imgur.com/4lD7jjc.png)

## 参考
- [「ファイル名を指定して実行」コマンド一覧表 \| check\*pad\.jp](http://www.checkpad.jp/list/show/981136)
- [Windowsの「ごみ箱」の中身はどこに保存されている？ \- 道すがら講堂](http://michisugara.jp/archives/2013/trash_can.html)
- [Microsoft Windows 7 \- コンピューターやごみ箱などのアイコンを変更する方法 \| HP®カスタマーサポート](https://support.hp.com/jp-ja/document/c01981567)
bashで「あの変数どこで定義されてるんだああああウギギギギギ」って時の対処法

以下のスクリプトを実行する。

```bash:log.sh
#!/bin/bash

# via. http://qiita.com/kawaz/items/65cdbeaa739c4e6b7776
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME:+$FUNCNAME(): }'

bash -lx -c 'echo 1' 2> xtrace.log
```

```shell-session
$ ./log.sh
```

後は、`grep export xtrace.log`するなり何なり。

```
$ grep export xtrace.log
+(/etc/profile:4): eval 'PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/takumiabe/.rbenv/shims:/Users/takumiabe/.rbenv/bin:/Users/takumiabe/go/bin:~/dot_files
/bin:/usr/local/sbin:/usr/local/opt/coreutils/libexec/gnubin";' export 'PATH;'
++(/etc/profile:4): export PATH
+(/Users/takumiabe/.bash_profile:4): export 'PS1=[ \[\e[32m\]\u@\h:\w\[\e[0m\] ]\[\e[0;31m\]$(__git_ps1)\[\e[0m\] \n\$ '
+(/Users/takumiabe/.bash_profile:11): export HISTCONTROL=ignoredups:ignorespace
+(/Users/takumiabe/.bash_profile:13): export HISTSIZE=2000
...
```


参考:
PS4の設定でシェルスクリプトのデバッグが捗る http://qiita.com/kawaz/items/65cdbeaa739c4e6b7776
VirtualBoxにおいて、ホストOSとゲストOS (Ubuntu) 間の共有フォルダを作成する方法

VirtualBoxにおいて、ホストOSとゲストOS間の共有フォルダを作成する方法をゲストOSがUbuntuの場合についてまとめます。

#共有フォルダの作成
ホストOS上で以下の手順を行います。

1. 共有フォルダを作成します(共有フォルダ名は英数字にします)。
1. VirtualBoxマネージャーで設定したい仮想マシンを選択し、[設定]をクリックします。
3. `共有フォルダー`をクリックします。
4. プラスボタンをクリックします。
5. `フォルダーのパス`の三角のようなボタンをクリックし、`その他`をクリックします。
6. 手順1で作成したフォルダを指定します。
7. `自動マウント`と`永続化する`にチェックをつけ、[OK]をクリックします。
8. [OK]をクリックします。

これで、ゲストOSの`/media/sf_{共有フォルダ名}`がホストOSとの共有フォルダになります。

#共有フォルダのマウント
共有フォルダを`/media/sf_{共有フォルダ名}`以外でマウントしたい場合は、ゲストOS上で以下の手順を行います。

1. `sudo ln -s /opt/VBoxGuestAdditions-4.3.10/lib/VBoxGuestAdditions /usr/lib/VBoxGuestAdditions`コマンドを実行し、mount.vboxsfへのシンボリックリンクを作成します。
1. `sudo chmod u+x /etc/rc.local`コマンドを実行し、スクリプトを実行可能にします。
2. `sudo nano /etc/rc.local`コマンドを実行し、`exit 0`よりも前に以下の記述を追加します。

```
mount -t vboxsf {共有フォルダ名} {マウント先のディレクトリ名}
```

1. 再起動します。

#共有フォルダにアクセスできるユーザの設定
(自分自身を含む) あるユーザを共有フォルダにアクセスさせたい場合には、ゲストOS上で以下の手順を行います。

1. `sudo gpasswd --add {ユーザ名} vboxsf`コマンドを実行し、ユーザを`vboxsf`グループに追加します。

#関連記事
* [VirtualBoxにおいて、ホストOSとゲストOS (CentOS) 間の共有フォルダを作成する方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/fb2d3c8141ba82d16801)

#参考文献
* [VirtualBox - 【Virtual Box】共有フォルダを介して、ホストOS(Windows 7) と ゲストOS(Debian/ MathLibre)でファイルやりとりするための設定 - Qiita](http://qiita.com/HirofumiYashima/items/6044cfc64cfa3e84f97c)
* [VirtualBox (Windows) 上に CentOS 7 をインストールする - Qiita](http://qiita.com/100/items/80a899fbaeb1e82b3f67)
* [VirtualBox4.3.10で共有フォルダのマウント失敗 - 会者定離で以降](http://d.hatena.ne.jp/murase_syuka/20140516/1400168497)
Lubuntu tips タッチパッドの機能を制限

Lubuntu の[タッチパッド機能変更](https://help.ubuntu.com/community/Lubuntu/Mouse#Touchpad_settings)です。

* Disable touchpad while typing

```
syndaemon -d -t
```
すると、間違って触れても大丈夫みたい。気のせいかもしれませんが、
Qdmailで簡単メール送信（PHP）

# Qdmailとは
スポック(spok)さんが配布しているPHPメールライブラリ

http://hal456.net/qdmail/

Qdsmtpを利用することで、SMTPメール送信にも対応できる

http://hal456.net/qdsmtp/

使い方は簡単だし、手軽に利用できるのが吉。

# 使った経緯

どなたかが作ったPHPメールフォームプログラムを改修するにあたり、SMTPでのメール送信が必要だったのだが、サーバの詳細が不明だし、PEAR::Mailもインストールできるかちょっと不明だったため、色々と物色したところQdmailに突き当たったしだい。
ライブラリとして単独で完結しているので、PHPを使える環境であれば大丈夫そうだったのでDLして使ってみる

# インストール
DLした
・qdmail.php
・qdsmtp.php
をインクルードパスの通った場所におく。まあ、無難に呼び出しプログラムと同じ場所におく。

# プログラム改修
mb_send_mail関数でメール送信していた箇所を、Qdmailのサンプルどおりに改修

```php

require_once('qdmail.php');
require_once('qdsmtp.php');

$mail = new Qdmail();

$mail -> errorDisplay( false );
$mail -> smtp( true );

$param = array(
    'host' => 'xxx.xxx.xxx.xxx'    // メールサーバのIPなど
    'port' => 587                  // SMTPポート（25,　587 ...）
    'from' => 'hogehoge@neko.com'  // Return-path: に設定されるメルアド
    'protocol' => 'SMTP_AUTH'      // 認証が必要なければ 'SMTP' でよし
    'user' => 'hogehoge'           // SMTP認証ユーザ
    'pass' => 'nekosan'            // SMTP認証パスワード
);
$mail -> smtpServer($param)

$mail->to('neko@nyan.com', 'inu@kyan.com');    // 宛先
$mail->from('hogehoge@neko.com');              // 送信元
$mail->subject('明日の集会について');           // 件名
$mail->text('明日は中止です');                  // メッセージ

if ( $mail->send() ) {
    print 'mail send OK';
} else {
    print 'mail send NG';
}
```

# 使った印象
一発でメール送信完了
特に難しい呪文やら、依存するライブラリなど、面倒な環境に依存するものもなし
簡単にPHPでメール送信するプログラムを作るのであれば、非常に使いやすいライブラリかも
フォームリクエストへのAfterフックを追加 (Laravel5.1)

Laravel5.4では以下の様に、フォームリクエストへのAfterフックを追加する方法がドキュメントで紹介されている。
参考：https://laravel.com/docs/5.4/validation#form-request-validation

```php
/**
 * Configure the validator instance.
 *
 * @param  \Illuminate\Validation\Validator  $validator
 * @return void
 */
public function withValidator($validator)
{
    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });
}

```

Laravel5.1でも同じ機能を使いたかったので以下のように実装した。

```php
public function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();

    $validator->after(function ($validator) {
        if ($this->somethingElseIsInvalid()) {
            $validator->errors()->add('field', 'Something is wrong with this field!');
        }
    });

    return $validator;
}

```
技術書読書会 #2 Infrastructure as Code

# 技術書読書会 #2 Infrastructure as Code

## 技術書読書会とは
なぜ技術書を読みたいんだい？それは、そこに技術書があるから！！と、偉大なる登山家が言っていました。

技術書を最後まで読み切る事は意外と大変です。一人なら無理だけどみんなの力があればできるかも・・・。
そんなことを誰が思ったのか、そんな気持ちに賛同したメンバーが１冊の技術書を読み込むという結構ハードルの高いことにチャレンジをしていきます。メンバーのスキルレベルはまちまちですが、それはそれで面白いかと。どうぞ暖かく見守ってください。

## 技術書読書会の進め方
eXtreme Readingの方式で進めていきます。

### 技術書読書会の実施方法
以下の要領で読書をしていきます。

```
1. 0分～5分間で、今回読み進める章/節を発表する
2. 15分～30分間で、読書
3. 5分～10分間で、ディスカッション
4. 1～3を時間分繰り返す。。。
5. まとめ
```

今回の読書会は、所要時間1時間で以下の配分で行いました。

```
1. 5分間で、今回読み進める章/節を発表する
2. 15分間、読書
3. 5分間、ディスカッション
4. 1～3を2回繰り返す。。。
5. 10分間、まとめ
```


### 利点
eXtreme Readingの利点です。

- 事前の準備がいらない。
- ディカッションをすることにより理解を深める事ができる。参加者全体の理解度の底上げが期待できる。
- 時間を区切って進行するので、読書の進捗が一定となり本の読み終わり時期を予測することができる
- みんなでやればなんとかなる


## 今回読む書籍
[Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス](
https://www.amazon.co.jp/Infrastructure-Code-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E3%81%AE%E5%8E%9F%E5%89%87%E3%81%A8%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B9-Kief-Morris/dp/4873117968/ref=sr_1_1?ie=UTF8&qid=1491455639&sr=8-1&keywords=Infrastructure+as+Code)

## 参加人数
4人

## 所要時間
1時間

## 進捗
1.5 - 2.3

## ディスカッション

### 1.5.1 定義ファイルの利用
峯　今回のプロジェクトでは、AWS Cloud Formationを利用している。

### 1.5.2 事故記述システムとプロセス
飯　資格の枠で囲まれたドキュメントの自動生成が重要かなと思いました。ドキュメントと最新のコードとの差を自動生成で埋めていこうということが書いてあったと思ったので
岡　似たような感じですね。
峯　AWS Cloud Formationを利用してるって言ったけど、構成定義ファイルにコメントが少ないかなと思いました。構成定義ファイルにコメントを書いておけば、ドキュメントとしても成り立つんだなと、一石二鳥ですな。

### 1.5.3 あらゆるものをバージョン管理する
飯　相関関係の管理というところが、よくわからなかった。
岡　例えばgitのタグからansibleの定義ファイルが何を使用されたか分かるようにしたり、その他関連するものも含めて繋がりが探し出せるようにするイメージかと
桑　サーバーにインストールするモジュールなどの関連性かと思いました。
岡　そういうのも含まれると思う

### 1.5.４ 継続的テストシステム、プロセス
峯　インフラのテストか、面白い、ちょっと考えてみようかな。

### 1.5.5 一斉変更ではなく小刻みな変更
森　小刻みな変更のイメージが付かなかった
岡　最小限の機能を実装してリリースしてしまう。必要な機能を後から一つずつ実装していくスタイル。例えば必要な機能はＡ、Ｂ，Ｃあるが、とりあえずＡができた時点でリリースして、ＢとＣはできたらリリース
森　機能の単位がわからない。おっきいのもある。
森　なにか指針みたいなものはあるんですか？
飯　それってサービスにもよるし

### 1.5.6 継続的にサービスを利用可能状態に保つ
飯　広い意味でのデータ管理は、以前より難しくなるかもしれない。の意味が分からなかった
峯　これは、下に書いてあるけど、データというのが設定・構成ファイル、ログファイルなども含めて管理していかなければならないことを指しているのかと思います。以前は、サーバーさえ守っておけば、その中のデータはなくならなかったが、クラウドだと永続的にこういったデータを残すのに気を使う。

### 1.6 アンチフラジャイル：「堅牢」を越えて
峯　再発防止策の次の一手を考えられるようにしていく。いい発想だと思いました。

### 1.7 まとめ
峯　この箇条書きは大事にしたい。こないだ読んだ[『アポロ13』に学ぶITサービスマネジメント ~映画を観るだけでITILの実践方法がわかる! ~](https://www.amazon.co.jp/%E3%80%8E%E3%82%A2%E3%83%9D%E3%83%AD13%E3%80%8F%E3%81%AB%E5%AD%A6%E3%81%B6IT%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88-~%E6%98%A0%E7%94%BB%E3%82%92%E8%A6%B3%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7ITIL%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%96%B9%E6%B3%95%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B-~-%E8%B0%B7-%E8%AA%A0%E4%B9%8B/dp/4774184926)でMTTRとMTBFについて触れていたが、ここら辺サービスとしてあったら面白そう。

### 2.1ダイナミックインフラストラクチャプラットフォームとは何か？
飯　アロケートってどういう意味ですか？
森　配分　割り当てるという意味です。
飯　コミュニティークラウドってどういう意味ですか？
飯　ベアメタルクラウド？
岡　これ物理でしょ！

### 2.2.1 プログラマブル
桑　ツールを利用した場合のツールのテストってできるの？

### 2.2.2 オンデマンド
桑　これすごく耳が痛いんだよね
岡　ハードを購入する際は、長期的なリソース計画を立てるけれどCloudベースだと時間単位というところが結構重要なところだと思う

### 2.2.3 セルフサービス
桑　これ苦しい

## 気づき

## まとめ

* 1週間期間が空くと、前回の内容を忘れてしまう。来週からは、毎日30分の時間をとって進めていく予定。
RxSwiftに新しく追加されたSingle, Maybe, Completable

RxSwift 3.3.0でRxJavaにインスパイアされた `Single`、`Maybe`、`Completable` が追加されたので、使い所をかんがえて見た。

##  Single
### 性質
> The 2.x Single reactive base type, which can emit a single onSuccess or onError has been redesigned from scratch. 

**1度だけ** `onSuccsess` または `onError` が流れる。 `onComplete` 、 `onNext` は流れない点に注意


```swift:RxSwift
public enum SingleEvent<Element> {
    /// One and only sequence element is produced. (underlying observable sequence emits: `.next(Element)`, `.completed`)
    case success(Element)

    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)
    case error(Swift.Error)
}
```

### 使い所
* レスポンスのあるAPIリクエスト
* プロミス的な使い方
* FirebaseのsingleEvent

## Completable

### 性質

**1度だけ** 、`onComplete` または `onError` が流れる。

```swift:RxSwift
public enum CompletableEvent {
    /// Sequence terminated with an error. (underlying observable sequence emits: `.error(Error)`)
    case error(Swift.Error)

    /// Sequence completed successfully.
    case completed
}
```

### 使い所

* レスポンスボディの無いAPIリクエスト

## Maybe
### 性質
> Conceptually, it is a union of Single and Completable providing the means to capture an emission pattern where there could be 0 or 1 item or an error signalled by some reactive source.

SingleとCompleteが合わさったような性質。
1度だけ、アイテムかerrorが流れるか、または全くイベントが流れない。
(実装の際にはイベントが流れてこないことがある点も考慮が必要)

### 使い所
* 1回だけ表示したいイベントの条件とか？

# 所感
今までは1度しか流れてこないイベントもObservableで流しっぱなしで、
Sigle、Completableと1回しか流れてこないように明示的にできるのはとても良いなー( ˘ω˘)

# 参考
[Release Hashimoto · ReactiveX/RxSwift](https://github.com/ReactiveX/RxSwift/releases/tag/3.3.0)
[What's different in 2.0 · ReactiveX/RxJava Wiki](https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#single)
[ReactiveX - Single](http://reactivex.io/documentation/single.html)
Rails5.0.xでeach_valueがwarningになる

ActionController Parametersでeachしてvalueを取ろうとするときにwarningになった

## 環境
Ruby 2.3.0
Rails 5.0.0.1

## 問題
```rb
object.each_value do |value|
     # 処理
end
```
を5.0.0.1でやるとwarningが出る

## 解決
```rb
object.transform_values do |value|
     # 処理
end
```
transform_valuesを使おう！

## 参考
- http://api.rubyonrails.org/classes/ActionController/Parameters.html
Xamarinでカスタムコントロールを作成


# iOS

- Custom Controls in the Xamarin Designer for iOS
https://developer.xamarin.com/guides/ios/user_interface/designer/ios_designable_controls_overview/

- Walkthrough - Using Custom Controls with the Xamarin Designer for iOS
https://developer.xamarin.com/guides/ios/user_interface/designer/ios_designable_controls_walkthrough/

## クラス定義の例

UIButtonを継承して、枠線ありのボタンを作ってみる。

```csharp:BorderButton.cs
using System;
using System.ComponentModel;
using Foundation;
using UIKit;
using CoreGraphics;

namespace MyApp.iOS
{
	[Register("BorderButton"), DesignTimeVisible(true)]
	public class BorderButton : UIButton
	{
		[Export("BorderRadius"), Browsable(true)]
		public nfloat BorderRadius { get; set; }

		[Export("BorderWidth"), Browsable(true)]
		public nfloat BorderWidth { get; set; }

		[Export("BorderColor"), Browsable(true)]
		public UIColor BorderColor { get; set; }

		public BorderButton() : base() { }
		public BorderButton(IntPtr handle) : base(handle) { }

		public override void Draw(CGRect rect)
		{
			this.Layer.CornerRadius = this.BorderRadius;
			this.Layer.BorderWidth = this.BorderWidth;
			this.Layer.BorderColor = this.BorderColor.CGColor;
			base.Draw(rect);
		}
	}
}
```

## 各行の解説

```csharp:
[Register("BorderButton"), DesignTimeVisible(true)]
```

Registerを設定すると、Classにカスタムコントロールのクラスを指定できるようになる。

![identity.png](https://qiita-image-store.s3.amazonaws.com/0/169798/cbf81220-6bc0-da8f-ba56-97783f36eac4.png "identity.png")

DesignTimeVisibleを設定して、かつコンストラクタを定義すると、ツールボックスに"Custom Components"が出現する。

```csharp:
public BorderButton() : base() { }
public BorderButton(IntPtr handle) : base(handle) { }
```

![toolbox.png](https://qiita-image-store.s3.amazonaws.com/0/169798/eae5cbb9-3548-3843-9372-13ca6489fa97.png "toolbox.png")


Exportを設定すると、カスタムプロパティが出現する。

```csharp:
[Export("BorderRadius"), Browsable(true)]
public nfloat BorderRadius { get; set; }

[Export("BorderWidth"), Browsable(true)]
public nfloat BorderWidth { get; set; }

[Export("BorderColor"), Browsable(true)]
public UIColor BorderColor { get; set; }
```

![custom_prop.png](https://qiita-image-store.s3.amazonaws.com/0/169798/720b6812-ac2e-f994-05eb-4d018b55ad43.png "custom_prop.png")


drawRectの代わりに、Drawをオーバーライドして領域を描画する。

```csharp:
public override void Draw(CGRect rect)
{
	this.Layer.CornerRadius = this.BorderRadius;
	this.Layer.BorderWidth = this.BorderWidth;
	this.Layer.BorderColor = this.BorderColor.CGColor;
	base.Draw(rect);
}
```

XamarinではdrawRectの代わりにDrawが呼ばれる模様。
> DrawRect never called for custom view:
> https://forums.xamarin.com/discussion/60934/drawrect-never-called-for-custom-view

と、ここまでやるとstoryboardでカスタムコントロールを配置可能になる。

![border_button.png](https://qiita-image-store.s3.amazonaws.com/0/169798/0fa2c0bc-3e9e-4894-5bbe-22f4b44341e8.png "border_button.png")


こちらを参考にしました。
http://qiita.com/hatapu/items/99e6a8b19f890f0fec9f


# Android

まだ。
ディレクトリ内ファイルの一括 latin1→ UTF8 文字コード変換

linux 初心者なのでもっといいやり方あるかもしれません。いや、あるでしょう。ないわけがない。

latin-1 で書かれていた古い c ソースを保存しようとするとUTF-8 化が走って文字化けが発生してしまうので、先回りして全部 BOM付きUTF-8 化してやるぅ！

というワンライナー。


```
$ find ./src/ -name "*.c" -or -name "*.h" -exec \
sh -c 'iconv -f WINDOWS-1252 -t UTF-8 {} | \
nkf -W8 -w8 > temp.txt && \
mv temp.txt {}' \;

```

latin1 から utf8 への変換は 0x80-0xff 領域の変換が nkf じゃうまくいかないので、iconv を使用。

iconv だと BOM をつけてくれないので nkf で付加。

結果を temp.txt に保存して、mv で元のファイルに上書き移動。

以上。
LinuxMint18でのDPI設定

備忘録的なものです。

最近4K液晶を使いはじめたのでDPI設定しました。なぜか、細かい指定が出来ないし、場所がディスプレイ設定ではなく【設定 -> 一般】のところにあります。

![Screenshot from 2017-04-17 14-45-11.png](https://qiita-image-store.s3.amazonaws.com/0/130210/a31d0171-2c7c-385f-2d9c-9be2ba2332d5.png)

ちなみにDPIの設定がありそうな、【設定 -> Display】のところでは解像度とマルチディスプレイの設定が出来ます。

![Screenshot from 2017-04-17 14-48-30.png](https://qiita-image-store.s3.amazonaws.com/0/130210/bb2bb85e-059e-3613-7f17-44eaad048d1b.png)

リフレッシュレートが出ていません。それを見るコマンドは下記です。

```bash
$ xrandr

Screen 0: minimum 8 x 8, current 3840 x 2160, maximum 32767 x 32767
DP1 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 697mm x 392mm
   3840x2160     60.00*+  29.98  
   1920x2160     59.99  
   3840x1080     59.97  
   2560x1600     59.97  
   2560x1440     59.95  
   1920x1200     59.88  
   1920x1080     60.00    59.94    30.00    29.97  
   1600x1200     60.00  
   1680x1050     59.95  
   1600x900      60.00  
   1280x1024     60.02  
   1280x800      59.81  
   1280x720      60.00    59.94  
   1024x768      60.00  
   800x600       60.32  
   720x480       60.00    59.94  
   640x480       60.00    59.94  
   720x400       70.08  
DP2 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

```
Cognosレポートのドリルスルーで名称ではなくコードでドリルスルーする

##概要
Cognos BI&Analyticsで、以下のような感じに、左のグラフのレポートから、右のリストのレポートにドリルスルーしたい時に、グラフのX軸に配置された「製品ライン名」ではなく、製品ライン名に紐づく「製品ラインコード」でドリルスルーを行うための実装方法です。
簡単にできそうに思いきや、ちょっと迷う方も多い実装になりますので、投稿しておきます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5724d1b6-f5a5-c959-67c5-8cf6fe2a360b.png)

##内容
まずドリルスルーのソース側のレポート(グラフのレポート)の、グラフのクエリーに「製品ラインコード」を入れます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/83d7804a-b013-2d7d-be7a-35800b0c333f.png)

そして、グラフ及びX軸を右クリックして、ドリルスルー定義をそれぞれ設定しますが、引き継ぐデータアイテムの値として「製品ラインコード」を指定します。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8ac17989-812c-a60a-377e-6ababba81f72.png)

さて、これでできるのではないかと思ってしまいがちですが、次の手順も必要です。

X軸に配置した「製品ライン」というメンバーを選択し、プロパティーのデータ→プロパティーで、図のように「製品ラインコード」にチェックを入れます。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a362b59f-6bb1-dcc8-3e21-7fe198f17636.png)

これで無事に、グラフを選択しても、X軸ラベルを選択しても、名称ではなくコードでドリルスルーを行う事ができるようになります。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a093a3c9-38d5-823e-623d-a88d99fd9082.png)
Slackでかんたんに画面のキャプチャを貼り付けられる

#概要
取得したキャプチャ、スクリーンショットやコピーした画像を、Slack上でそのままペーストできるようです。
今までは [Gyazo](https://gyazo.com/ja) を使っていましたが、
編集などをする必要が無い場合は、Gyazoを使わなくても良くなりそうです。

#Macで画面キャプチャを貼り付ける方法
##キャプチャを取る
`Command + Shift + control + 4` 
を押して、スクリーンショットを取る。

##Slackに貼り付ける
Slack上で `Command + V` で貼り付け。


これだけで完了です。
【はじめての kubernetes】オリジナルイメージをデプロイする。（ yaml 編）

オリジナルのイメージをつくるための Dockerfile はこちらです。[php -S するだけの小さな Docker イメージ](http://qiita.com/mochizukikotaro/items/958afc74593719035e5c)

[【はじめての kubernetes】オリジナルイメージをデプロイする。（コマンド編）](http://qiita.com/mochizukikotaro/items/d45b9a22b411f6c6593c) の続きです。

# 前提

- kubectl
- gcloud
- レジストリにイメージアップ済み（冒頭のサンプルイメージを push しておく）


# 方針

- ReplicationController
- Service

の２つの yaml ファイルを用意して、それを走らせることでデプロイしたいと思います。

最終的には、IPアドレスにアクセスしてサイトが見れるようにします。


# レシピ

レジストリにイメージアップまで済ませておいてください。`image: gcr.io/<PROJECT-ID>/<IMAGE>:v1` で使います。

```yaml:rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
  name: rc1
spec:
  replicas: 3
  selector:
    app: hoge
  template:
    metadata:
      labels:
        app: hoge
    spec:
      containers:
      - name: container1
        image: gcr.io/<PROJECT-ID>/<IMAGE>:v1
        ports:
        - containerPort: 7788
```



```yaml:service.yml
apiVersion: v1
kind: Service
metadata:
  name: service-yml
spec:
  type: LoadBalancer
  ports:
  - port: 7788
  selector:
    app: hoge
```

```bash
$ kubectl create -f rc.yml
$ kubectl create -f service.yml
```

以上で調理は終わります。しばらく待つと IP を確認できます。

```bash
$ kc get services
NAME          CLUSTER-IP    EXTERNAL-IP      PORT(S)          AGE
service-yml   10.3.243.17   35.187.198.199   7788:31948/TCP   1m
```


![スクリーンショット 2017-04-17 14.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/45822/0150ab36-b2e7-2223-de1b-deeed146efd9.png)


できました。

# あとかたづけ

```bash
$ kubectl delete services service-yml
$ kubectl delete rc rc1
```

レプリケーションコントローラーを削除して、ちょっとすると pod も削除されます。

以上です。 🙂
IE11 で overflow を切り替えた場合にクリックできなくなるバグの解決法

`overflow: hidden;` の要素を JavaScript で `overflow: scroll;` に切り替えた場合に、
その画面以下にスクロールすると、画面内の要素に対してクリックやホバーなどが効かなくなります。

`overflow` を切り替える要素に `position: relative;` を設定すると解決します。
機械学習論文読みメモ_62


[TOWARDS PRINCIPLED UNSUPERVISED LEARNING](https://arxiv.org/pdf/1511.06440.pdf), ICLR2016
一般的な教師なし学習の実現は機械学習において長い間続く問題である。
教師あり学習は特定タスクに対応した損失関数を最小化する事を目指せば良いが、教師なしの場合はそうした特定タスクとは関係がないため、学習結果が特定タスクへ役に立たない。
本論ではoutput distribution matching (ODM)コストを提案する。
ODMはラベルの分布と予測分布との間の差異をコストにする。
この時、教師ありではデータとラベルの１対１セットが要求されるため調達コストが高いが、データ分布とラベル分布に関するデータをそれぞれ別々に手に入れる事は難しくない、事がポイントになる。
ここで任意の教師ありコストを最小化する事は、結局ODMのコストを最小化するに繋がるため、教師なし学習結果が特定タスクに対して有効になる。

[WHY ARE DEEP NETS REVERSIBLE: A SIMPLE THEORY, WITH IMPLICATIONS FOR TRAINING](https://openreview.net/pdf?id=q7kqBKMN2U8LEkD3t7Xy), ICLR2016WS
生成モデルはデータの理解、及び少ないラベル数のデータにおける学習において有効である。
最近の研究では、生成モデルを用い、いくつか深い層の値を与えた際にそれに対応する入力を生成するアプローチが提案されている。
しかしながらそうして生成された入力が与えた隠れ層の値を生成するかどうか、proof of correctness、は保証されていない。
本論で提案するRELUベースの構造は、そのフィードフォワード構造のreverseが生成モデルとなる、つまり重み行列はその転置行列を用いる事で逆変換を達成できる。
これはdenoising autoencoderにおけるtied weight、エンコーダで使われる重み行列の転置行列でデコードがされる構造、と同じである。
この事は、edgeweightsは確率変数のように振る舞うと仮定すれば証明可能である。

[Stochastic Convex Optimization](https://www.cs.cornell.edu/~sridharan/convex.pdf)
オンライン凸最適化問題におけるregret boundは一般的に問題設定に適用可能なレベルになってきている。
このboundはonline to batch conversionを行う事でstochastic batch settingにも適用可能になる。
本論では、このようなboundがより一般的なuniform convergenceの文脈で得られるかどうかを考える。
結果、例えonline to batch conversionにより(PAC)学習可能であっても、一般的にuniform convergenceを満たす事はなく、empirical risk minimization(ERM)は上手くいかない可能性がある事が分かった。
結局鍵となるのは、オンライン手法と（バッチ）全体最適化手法との間の違いよりも、損失関数の凸性の強さ、また正則化である。
stabilityの文脈から考える事で、強い凸性がある事によりERMにより学習可能になる事が分かる。
また弱い凸性を持つ場合に正則化を行う事で学習可能にしていく事ができるかを解析した。
さらにオンライン学習を正則化の文脈に理解する。
機械学習論文読みメモ_61


[ScribbleSup: Scribble-Supervised Convolutional Networks for Semantic Segmentation](https://arxiv.org/pdf/1604.05144.pdf)
segmentationタスクのためのデータ作りは高コストである。
一方、正確ではない走り書きのようなアノテーション（scribble）は良く使われる低コストなラベル方法である。
本論ではそうしたラベル方法をsegmentationデータラベリングへ応用し、そんもデータによりCNNの学習を行う。
提案手法は物体の一部へ走り書きでアノテーションされた部分より、グラフモデルに基づいてピクセルレベルのラベル伝搬をラベルされていないピクセルへ行っていく。
また草原、水、空といった明確な境界が定義されていない物体に関しても効果的に働く。

[ReSeg: A Recurrent Neural Network-based Model for Semantic Segmentation](https://arxiv.org/pdf/1511.07053.pdf)
Structured prediction問題において、局所的な関係をCNNで、遠い関係においてRNNを用いて学習するモデルを提案する。
このモデルはReSegと呼び、最近提案されているReNetをベースにしている。
ReNetは４つのRNNから成り立ち、画像の縦と横において双方向に走査する事で、全所的な特徴を抽出している。
本論ではこのReNetをCNNによる特徴抽出の上に導入する事で、さらにCNNで得られる局所特徴を活用する。
このモデルは様々なsegmentation問題において有効である。

[An Infinite Restricted Boltzmann Machine](https://arxiv.org/pdf/1502.02476.pdf)
隠れ層の次元数を設定する必要のないRBMモデルを数学的に構築する。
実際は、隠れ層の次元数は適応的に増えていくように設計している。
これは各隠れ因子をどのような並べるかに関してsensitiveのした事による。
またエネルギー関数を慎重に選択した事で、無限次元においてもwell-definedにできた。
機械学習論文読みメモ_60


[Fast ConvNets Using Group-wise Brain Damage](https://arxiv.org/pdf/1506.02515.pdf)
本論ではbrain damageと呼ばれる、neural networkの枝刈りを応用する事で、どのように挙動がかわり、また学習速度の向上に繋がるかを示す。
この手法は、効率的なネットワークは畳み込みを行列積にreductionしていく事実を利用する。
提案するbrain damage手法は、convolutional kernel tensorをグループ毎に枝刈りしていく。
このような枝刈りにより、convolutionがthinned dense maticesの積にreductionされていく、これが速度向上へ繋がる。
本論ではいくつかのグループ毎枝刈り手法を考え、その中でもgroup-sparsity正則化を使う事でより良い速度向上を実現出来た。

[Instance-aware Semantic Segmentation via Multi-task Network Cascades](https://arxiv.org/pdf/1512.04412.pdf)
Semantic segmentationは良く研究されている分野だが、instance-awareなものは相対的に少ない。
本論ではmulti-taskなネットワーク構造を提案し、それによりinstance level segmentationを行うモデルを提案する。
このネットワークは、３つのカスケードで成り立っており、それぞれinstance-levelの分離、それらへのマスクを推定、そして分類、に別れる。
それらの構造はそれぞれ同じCNN特徴を共有し、またカスケードでつなげる事で１つ前のタスク結果を利用する。
このモデルはFaster/Fast RCNNよりも高性能を出す事が出来た。

[Feature Space Optimization for Semantic Video Segmentation](http://abhijitkundu.info/Publications/VideoFSO_CVPR16.pdf), CVPR2016
Semantic video segmentationにおけるlong-rangeなspatio-temporal regularizerを提案する。
こうしたregularizationはカメラやシーンが動いているため、単純な時空間次元におけるユークリッド距離などを利用しただけでは誤差が生じてくるため、簡単ではない。
本論ではピクセルからユークリッド空間へ写像を学習によって最適化する事により、誤差を最小化する。
予測はCRFに基づいたモデルにより行う。
機械学習論文読みメモ_59


[Training Region-based Object Detectors with Online Hard Example Mining](https://pdfs.semanticscholar.org/7764/4db569db7c21a7784943ace56941d820402b.pdf), CVPR2016
物体検出性能はregion based CNNの登場により飛躍的に向上した。
しかしながらこのモデルは未だヒューリスティクスに支えられているためそのチューニングコストは高い。
本論では学習コスト低減のための手法として効率的なonline hard example mining(OHEM)手法を提案する。
ここでの動機は、物体検出にデータは従来ほとんどが簡単なサンプルで、難しいサンプルは少ないという事である。
OHEMではそれら難しいサンプルを自動選択する事で学習効率を向上させる。
従来のヒューリスティクスに頼る必要はなく、またより高効率な学習を実現する事が可能である。

[Traffic-Sign Detection and Classification in the Wild](http://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Zhu_Traffic-Sign_Detection_and_CVPR_2016_paper.pdf), CVPR2016
道路標識検出と分類はそれぞれにおいて高い性能を出してきているが、それらを同時に行う手法は少ない。
本論では、まず様々な条件で獲得された道路標識に関するデータ作成を行った。
またそのデータを用いてCNNによるendtoendな道路標識検出、分類モデルを学習した。
従来手法のような、標識が画像の大部分を占めていなければ上手く働かないモデルとは違い、提案モデルは標識が小さい領域にある場合でも上手く働く。

[CNN-RNN: A Unified Framework for Multi-label Image Classification](https://pdfs.semanticscholar.org/6f32/1e268990e3e1a792d4bcf829600caab41e1e.pdf)
従来のCNNによる分類タスクは画像を単一のクラスに分類してきた。
しかし本来画像は背景などを含めると複数のラベルが付与可能である。
従来は物体に対してそれぞれ別々に分類を行ってきた。
しかしそれでは画像内物体間の相関関係を考慮に入れる事ができない。
本論ではRNNを用いてこの問題を解決する。
今回提案するCNN-RNNモデルは、画像内の複数ラベルを同時に埋め込みそれらの間の相関、あるいは画像対ラベル間相関を特徴づける事を可能にする。
このモデルはまたendtoendな学習が可能である。