OmniAICreator/Qiita-1.07M huggingface dataset:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' 

# はじめに
PHPからMySQLサーバーへアクセスしようとした際、以下のようなエラーが発生しました。
> SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/tmp/mysql.sock' 

**「ソケット'_/tmp/mysql.sock_'を通してローカルのMySQLサーバへアクセスができません。」**といった内容です。

MySQLは起動時に_mysql.sock_というソケットファイルを作成します。そしてPHPや他のプログラムはこのソケットファイルを通してMySQLへアクセスを行うことができます。
どうやらここが怪しそうです。


# 調査
といことで、このPHPエラーが_/tmp/mysql.sock_へアクセスしようとしていたということなので、まずは_/tmp/mysql.sock_があることを確認してみます。

```bash:確認1(mysql.sock)
$ ls /tmp/mysql.sock
ls: /tmp/mysql.sock にアクセスできません: そのようなファイルやディレクトリはありません
```

おぉ、そもそもアクセスしようとしている場所に_mysql.sock_がないみたいです。。。
ではどこにあるのでしょうか？？？
_my.cnf_を見てみます。

```bash:確認2(mysql.sock)
$ grep mysql.sock /etc/my.cnf
socket          = /var/lib/mysql/mysql.sock
socket          = /var/lib/mysql/mysql.sock
```
ここで設定されているのは_/va/lib/mysql/mysql.sock_です。
ちなみに2つ存在するのは**[client]**と**[mysqld]**で設定されているからです。
では、確かめてみます。

```bash:確認3(mysql.sock)
$ ls /var/lib/mysql/mysql.sock
/var/lib/mysql/mysql.sock
```
ありました。

# 原因
これでわかったのが、
**「MySQLはソケットを_/var/lib/mysql/mysql.sock_に用意して待ち構えているけれど、PHPは_/tmp/mysql.sock_にソケットがあると思ってアクセスしにいっているためエラーが発生している。」**
ということです。

# 対策
なので今回は_my.cnf_を修正してソケットを_/tmp/mysql.sock_へ作成するように変更します。
まずはmysqlを停止しておきましょう。

```bash:mysql停止
$ sudo service mysqld stop
Shutting down MySQL. SUCCESS!
```

それでは修正します。

```bash:my.cnf修正
$ vi /etc/my.cnf
$ grep mysql.sock /etc/my.cnf
socket          = /tmp/mysql.sock
socket          = /tmp/mysql/mysql.sock
```

起動します。

```bash:mysql起動
$ sudo service mysqld start
Starting MySQL. SUCCESS! 
```

それではソケットが作成されたか確認しましょう。

```bash:確認
$ ls /tmp/mysql.sock
/tmp/mysql.sock
```
無事、指定した場所に作成されました。

```bash:
$ tail -f /var/log/mysql/mysql.log
		     30 Connect     hogehoge@localhost on hogehoge
		     30 Quit       
		     32 Connect     hogehoge@localhost on hogehoge
		     31 Connect     hogehoge@localhost on hogehoge
		     32 Quit       
		     31 Quit
```
アクセスログも正常に出力されているみたいです。

以上で、エラーは解消されました。


# おわりに
今回は受け手となるMySQL側のソケットデフォルト位置と送り手となるPHP側MySQLのデフォルトソケット位置が異なるために発生したエラーでした。
念のため対応後、PHP側の設定(php.ini)を確認したところ、MySQLソケットを指定する箇所に指定がありませんでした。

```bash:
$ grep socket /etc/php.ini
; Default timeout for socket based streams (seconds)
default_socket_timeout = 60
; Default socket name for local MySQL connects.  If empty, uses the built-in
mysql.default_socket =
; Default socket name for local MySQL connects.  If empty, uses the built-in
mysqli.default_socket =
```
なのでこちらでMySQLのソケット位置を設定してあげても良かったかもです。

ということで、とりあえず今回は、MySQL側の設定(_my.cnf_)を指定することで対応しましたが、PHP側の設定(_php.ini_)で対応しても解決できたと思われます。
var_dumpとechoの違い

### ・var_dump
詳細な情報が出る

```php:入力
$txts = ['タロー', 'ジロー'];
var_dump($txts);
```
```php:表示
array(2) { [0]=> string(9) "タロー" [1]=> string(9) "ジロー" }
```

### ・echo
ざっくり出る

```php:入力
$txts = ['タロー', 'ジロー'];
echo $txts;
```

```php:表示
Array
```


echoの方が入力は簡単だが、debugする際はvar_dumpが適切
Amazon Linuxがコンテナ化されたので、Macで動かしてみた。


cloudpack大阪の佐々木です。

Amazon Linuxがコンテナ化され、ECSでもオンプレのDockerでも動かせるようになったようです。
https://aws.amazon.com/jp/blogs/aws/new-amazon-linux-container-image-for-cloud-and-on-premises-workloads/

早速やってみます。

AmazonLinuxコンテナはECR上に保存されているので、ECRへのログインコマンドを取得します。リージョンは`ap-northeast-1`でも取得できました。

```bash:
$ aws ecr get-login --region ap-northeast-1 --registry-ids 137112412989   
```
出力されたコマンドを貼り付けて、ログインします。

```bash:
$ docker login -u AWS -p XXXXXXXXXXXXX -e none https://137112412989.dkr.ecr.ap-northeast-1.amazonaws.com
Flag --email has been deprecated, will be removed in 1.13.
Login Succeeded
```

どんなイメージがあるのか見てみます。

```bash:
$ aws ecr list-images --region ap-northeast-1 --registry-id 137112412989 --repository-name amazonlinux | jq -r '.imageIds[].imageTag'
2016.09.0.20161028-with-sources
2016.09-with-sources
latest-with-sources
latest
2016.09
2016.09.0.20161028
```
2016.09からみたいです。

ローカルにPullします。

```bash:
$ docker pull 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest            
latest: Pulling from amazonlinux
e2daa1633485: Pull complete
Status: Downloaded newer image for 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest
```

```bash:
$  docker images                                                                             
REPOSITORY                                                      TAG                 IMAGE ID            CREATED             SIZE
137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux   latest              feee9aea7094        3 days ago          328.3 MB
```

ありました。328Mだそうです。

runします。

```bash:
$ docker run -it 137112412989.dkr.ecr.ap-northeast-1.amazonaws.com/amazonlinux:latest /bin/bash
bash-4.2#
bash-4.2# cat /etc/os-release
NAME="Amazon Linux AMI"
VERSION="2016.09"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2016.09"
PRETTY_NAME="Amazon Linux AMI 2016.09"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2016.09:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
bash-4.2# uname -a
Linux ca1a801fcf3b 4.4.14-moby #1 SMP Wed Jun 29 10:00:58 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```

動いてます。
インストールされているパッケージはコンテナ用なのか、だいぶ少なくlessやviなんかもインストールされていませんでした。

```bash:
bash-4.2# rpm -qa | wc -l
103
```

EC2で動いているアプリケーションもECSなんかのDockerサービスに楽に移行できるようになりそうです。
AWS以外のサービスにも持っていけそうです。

# 参考
http://docs.aws.amazon.com/AmazonECR/latest/userguide/amazon_linux_container_image.html
独自のfmt.Formatterを実装する

[fmt.Formatter](https://golang.org/pkg/fmt/#Formatter) interfaceを実装すると独自で定義した型が`fmt.Sprintf`や`fmt.Fprintf`に渡されたときのverb（verbとは例えば`%s`や`%v`など）ごとの出力をカスタマイズすることができる．

これを実装しているのは以前 [Golangでエラー時にスタックトレースを表示する](http://qiita.com/deeeet/items/dacc71932393ab35d9f8)で紹介した[pkg/errors](https://github.com/pkg/errors) パッケージである．`pkg/errors`で生成したエラーは`%s`verbを使うと通常の表示，`%+v`verbを使うとスタックトレース形式の表示という切り替えが可能になっている．これは`fmt.Formatter`を実装することで実現している．実装は以下のようになっている．

```golang
type StackTrace []Frame

func (st StackTrace) Format(s fmt.State, verb rune) {
	switch verb {
	case 'v':
		switch {
		case s.Flag('+'):
			for _, f := range st {
				fmt.Fprintf(s, "\n%+v", f)
			}
		case s.Flag('#'):
			fmt.Fprintf(s, "%#v", []Frame(st))
		default:
			fmt.Fprintf(s, "%v", []Frame(st))
		}
	case 's':
		fmt.Fprintf(s, "%s", []Frame(st))
	}
}
```

実装は単純でswitchを使ってverbごとの出力を定義しているだけである．

最近自分では[go-httpstat](https://github.com/tcnksm/go-httpstat)というHTTPリクエストの各ステップのレイテンシ情報をトレースするパッケージを書いている（詳しくは [Tracing HTTP request latency in golang](https://medium.com/@deeeet/trancing-http-request-latency-in-golang-65b2463f548c#.xqblpgjtb)）．これはもともと以下のように各レイテンシ情報をそれぞれPrint関数に渡して出力する必要があった．

```golang
fmt.Printf("DNS lookup: %d ms", int(result.DNSLookup/time.Millisecond))
fmt.Printf("TCP connection: %d ms", int(result.TCPConnection/time.Millisecond))
fmt.Printf("TLS handshake: %d ms", int(result.TLSHandshake/time.Millisecond))
fmt.Printf("Server processing: %d ms", int(result.ServerProcessing/time.Millisecond))
fmt.Printf("Content transfer: %d ms", int(result.ContentTransfer/time.Millisecond))
```

これは使う側としてはめんどくさいので`fmt.Formatter`を実装して`%+v`を指定すれば良いだけにした．

```golang
fmt.Printf("%+v\n", result)
```
```
DNS lookup:         461 ms
TCP connection:     163 ms
TLS handshake:      427 ms
Server processing:  165 ms
Content transfer:     0 ms
...
```

具体的な実装は https://github.com/tcnksm/go-httpstat/blob/master/httpstat.go#L84-L139 を参照．

## fmt.Stringer

`fmt.Fromatter`を使う人はあまりいないと思う．それよりもよく使うのは[fmt.Stringer](https://golang.org/pkg/fmt/#Stringer)だろう．これは単純に独自の型が`fmt`の関数に渡ったときの出力をカスタマイズできる．

例えば`net/http`パッケージには以下のような実装がある．

```golang
type contextKey struct {
    name string
}

func (k *contextKey) String() string { 
    return "net/http context value " + k.name 
}
```

これを`fmt.Println`に渡すと出力は以下のようになる．

```golang
fmt.Println(&contextKey{"http-server"}) // net/http context value http-server
```

（ちなみに`contextKey`は`ServerContextKey`や`LocalAddrContextKey`の実装に使われている）
UI > link > CONFIGURE MAILING LISTS

複数のMailing listsを扱うソフト開発時のUI参考。

探しているものは以下。

- 複数のメーリングリストの一覧
- 各メーリングリストの設定もできる
- 各メーリングリストごとにテキストボックス、チェックボックス、ボタンなどを扱う

http://knewsplugin.com/configure-mailing-lists/
 
- 表形式
- 1行目に項目の説明
- 2行目以降に入力・設定項目
Ansible 2.2 CHANGELOG

US時間の2016/11/1にリリースされたので忘れない内にメモっとく。

# 参照元

* https://github.com/ansible/ansible/blob/devel/CHANGELOG.md
* Ansible-Project ML
* https://www.ansible.com/press/ansible-22-delivers-new-automation-capabilities-for-containers-networks-and-cloud

## 全体
* **listen** モジュールにより複数Notifyが簡単に仕掛けられるようになった（ここ見たほうがはやいhttp://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change）
* パフォーマンスが2.1/2.0よりも**2-3X**にとのこと。
* リストみたいにシリアルバッチをしていできるようになった
* meta タスクにコンディションつけれるようになった
* **raw**は ``changed: true `` だがfalseにもできるようになった
* **meta** オプション追加：end_play , Playの終わりまでスキップ
* **include_role** 追加（taskのなかでロールが呼び出せる、ループとかコンディションつけれる）
* service モジュール変更（systemdモジュールも本バージョンから追加）
* 権限昇格にksu（Kerberos su：ケロベロ**スー**！？）追加
* **loop_control** に label や pause オプション追加
* New Callbackにforeman追加
* **Python 3**サポートは本バージョンでTechPreview

## Windows サポート関係
* **async** をサポート（長いタスクなんかあるとき便利）
* ``environment:``をサポート（playやtaskにて）
* MSSQL モジュール

## モジュール関係
追加はたくさんあるので、個人的に気になったもの。

* Windows 幾つか追加（コマンド系 shell/command/robocopy）
* Network , たくさん
* Storage , NetApp の E-Series関係追加
* AWS , 多い
* IPMI
* WAKEONLAN
* RHEVM
* Univention

## Deprecated

いくつか。使ってて気になったらみる。以前からWARNINGで警告されたりもするから、確認に留める。
Kubernetesのおすすめニュースサイト

* [Kubernetes Blog](http://blog.kubernetes.io/)
  * Kubernetes公式ブログ
  * Google始め、Kubernetesコミュニティからの寄稿(CoreOSさんとか)
  * ここで紹介されて初めて、Kubernetes界隈のCutting-Edgeな機能、ソフトウェア、サービスの認知度がぐっと上がるイメージ
* [KubeWeekly](https://kubeweekly.com/)
  * １週間のKubernetes界隈のトピックのまとめサイト
  * 各種SNSやスライドシェアサイト、ブログ、GitHubレポジトリなどが紹介される
  * 毎日Twitterに貼り付く、みたいな情報収集方法よりは効率的・網羅的に情報収集できるイメージがあり、愛読してます
* [RedditのKubernetes Subreddit](https://www.reddit.com/r/kubernetes/)
  * 当事者や第三者が気軽にKubernetes関連のリンクをポストしたり、コメントしたりできる場
  * 最新情報が集まりやすい
  * 毎日読むならこれかな?
* [KubeRocks](http://www.kube.rocks/)
  * Kubernetes界隈の最新・人気リンク集サイト
  * Kubernetes限定、コメントなしのRedditみたいなイメージ
laravel5.3　bootstrap-sassでglyphiconsが読み込めない対応

laravel5.3の環境になります。

デフォルトのgulpfileに以下を追加

```
.copy('node_modules/bootstrap-sass/assets/fonts/bootstrap/','public/fonts/bootstrap')
```

全体的にはこんな感じ

```
const elixir = require('laravel-elixir');

require('laravel-elixir-vue-2');

/*
 |--------------------------------------------------------------------------
 | Elixir Asset Management
 |--------------------------------------------------------------------------
 |
 | Elixir provides a clean, fluent API for defining some basic Gulp tasks
 | for your Laravel application. By default, we are compiling the Sass
 | file for our application, as well as publishing vendor resources.
 |
 */

elixir(mix => {
    mix.sass('index.scss')
        .copy('node_modules/bootstrap-sass/assets/fonts/bootstrap/','public/fonts/bootstrap')
        .webpack('app.js');
});

```
技術英語 > they all go [hand in hand].

@ Code Complete (No. 17387 / 36077)

> You don't have to choose between quality, cost, and time -- they all go hand in hand.

http://ejje.weblio.jp/content/hand+in+hand
> 手に手を取って、協力して、相伴って

上記の例文では「相伴って」という意味で使われているようだ。

<hr>
関連して思い出したのは

会社では見ない方がいい動画。すごく綺麗だと思う。
[【ウユニ塩湖で】Hand in Hand 踊ってみた【没テイク＋おまけ！】](https://www.youtube.com/watch?v=z7IztP8tsWw&index=4&list=LLyaPKuly9idxmlWDPmaYrpg)

- Spherical Harmonicsのcacheで扱えない動的なもの
  - 踊っている人
  - 水面の動き
- Spherical Harmonicsのcacheで扱える(ほぼ)静的なもの
  - 背景 (徐々に変化する)

[意訳 > The science of Spherical Harmonics at Weta Digital](http://qiita.com/7of9/items/c04b08c5e719dc6f8593 )
シェルって何なのって人たちへ＃００１

#対象
環境問わず(winは仮想ね)、上司、先輩に「シェル勉強しなさい。」と脅された、または諭された人たち。（負けんな）

##はじめの一歩　
```1.sh
#!/bin/bash
echo "Hello sh!"
exit 0
```

作業フォルダを作成し、セーブしたら　
bash 1.sh

簡単ですね。
Redmine のセレクトボックスを Select2 と View Customize Plugin で強化する

# 対象

* Redmine : 3.3.1
* チケットの作成フォーム
* チケットの編集フォーム
* チケットのフィルタ条件のフォーム
* クライアント : Linux, Firefox 49

# 問題

セレクトボックスの選択肢が増えてくると、目的の選択肢を選ぶのが大変になる。

# 解決策

Select2 (https://select2.github.io/) と View Customize Plugin を使ってセレクトボックスを強化する。

## プラグインのインストール

Redmine で Select2 を使えるようにしてくれるプラグインをインストールする。
下記の二つがある。

* Redmine base_select2 plugin (https://github.com/jbbarth/redmine_base_select2)
* Redmine Select2 Plugin (https://github.com/Undev/redmine__select2)

Redmine base_select2 plugin の方が同梱の Select2 のバージョンが新しくて 4.0.0 なので、こちらをインストールすることにする。

View Customize Plugin をインストールする。

* https://github.com/onozaty/redmine-view-customize

## View Customize Plugin に設定する JavaScript



```js
// /issues(/(\d+|new))?$

// フィルタ条件のフォーム用
(function() {
    var field;

    $(function() {
        $('#add_filter_select').change(function() {
            field = $(this).val();
        });
    });

    $(window).load(function() {
        $("#values_cf_1_1").select2({ width: '100%' });
        $("#values_cf_2_1").select2({ width: '100%' });

        $('#add_filter_select').change(function() {
            if (field === 'cf_1') {
                $("#values_cf_1_1").select2({ width: '100%' });
            } else if (field === 'cf_2') {
                $("#values_cf_2_1").select2({ width: '100%' });
            }
        });

        $('#filters-table').on('click', '#values_cf_1_1 ~ .toggle-multiselect', function() {
            $(this).siblings('select').select2({ width: '100%' });
        });
        $('#filters-table').on('click', '#values_cf_2_1 ~ .toggle-multiselect', function() {
            $(this).siblings('select').select2({ width: '100%' });
        });
    });
})();

// 作成、編集のフォーム用
$(function() {
    $("#issue_custom_field_values_1").select2({ width: '100%' });
    $("#issue_custom_field_values_2").select2({ width: '100%' });
});
```

## 適用した状態のスクリーンショット

以下はチケットの作成、編集のフォーム。

![edit.png](https://qiita-image-store.s3.amazonaws.com/0/38075/36bd21f0-7461-5e39-2cc0-8eaecd221d16.png)

以下はチケットのフィルタのフォーム。

![filter.png](https://qiita-image-store.s3.amazonaws.com/0/38075/8c50bac3-ea85-4057-c477-2edf73fe72c7.png)

# TODO

* 簡単に確認しただけなので気づいていない問題があるかも。
* チケット一括編集のページが未対応。
Reactでリアルタイム株価表示のページを作る

## 概要
* YahooのYQLを利用して、アメリカに上場している株式のリアルタイム価格を取得
* reactのstate管理を使って、表示させる

## サンプル
![11月-02-2016 04-42-22.gif](https://qiita-image-store.s3.amazonaws.com/0/53581/d685e389-a31f-0f4d-a9f6-1aff5509678a.gif)

* http://bl.ocks.org/kiyo-e/raw/f7da3db580f00dd6326c891cbaddc3a6/

## 実際のコード

```html:index.html
<!doctype html>

<html>

<head>
  <meta charset="utf-8">
  <title>react study</title>
  <script
  src="https://code.jquery.com/jquery-3.1.1.min.js"
  integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
  crossorigin="anonymous"></script>

</head>

<body>
  <div id="content"></div>
  <script src="build.js"></script>
</body>

</html>

```

```javascript:app.js
/*global $*/

import React from "react";
import ReactDOM from "react-dom";

var TextBox = React.createClass({
    render: function() {
        return (
            <div>
            <h2>{this.props.symbol}</h2>
            <h3>現在値：{this.props.price}</h3>
            <li>ask：{this.props.ask}</li>
            <li>bid：{this.props.bid}</li>
            </div>
        )
    }
});

var TextData = React.createClass({
    loadPriceData: function() {
        $.ajax({
            url: "https://query.yahooapis.com/v1/public/yql?format=json&diagnostics=true&callback=",
            data: {
                q: "select * from yahoo.finance.quotes where symbol in ('MSFT', 'AAPL')",
                env: "store://datatables.org/alltableswithkeys"
                
            },
            dataType: "json",
            cache: false,
            success: function(data) {
                this.setState({
                    data: data.query.results.quote
                });

            }.bind(this)
        });
    },
    getInitialState: function() {
        return {
            data: [{
                "symbol": "",
                "Ask": "",
                "Bid": "",
                "LastTradePriceOnly": ""
            }]
        };
    },
    componentWillMount: function() {
        this.loadPriceData();
        setInterval(this.loadPriceData, 1000);
    },

    render: function() {
        var quotemap = this.state.data.map(function(quote) {
            return (
                <TextBox symbol={quote.symbol} ask={quote.Ask} bid={quote.Bid} price={quote.LastTradePriceOnly} key={quote.symbol}/>
            );
        });

        return (
            <div>
              {quotemap}
            </div>
        );
    }
});
// id='content'に<UserBox />を埋め込む
ReactDOM.render(
    <TextData />,
    document.getElementById('content')
);

```

## 参考
* [jQuery + YQL で株価情報取得](http://mix-juice001.hatenablog.com/entry/2014/06/16/192519)
* [Cloud9環境でReactの検証⑤ -Ajax、state管理-](http://qiita.com/tomine3/items/f817c62aa88d8a21df7d)
文字の連結


string.joinで可能  
任意の繋ぎで連結可能  
nullや""など空白の場合は繋ぎなしで連結可能  
いちいちStringBuilderを使って連結していたがそれ以外の方法が分かった
速度は知らん
この程度の量なら問題ないと思うが

サンプル
```csharp
var str1 = string.join("-",Enumerable.Range(1, 10));
//出力:1-2-3-4-5-6-7-8-9-10
var str2 = string.join("",Enumerable.Range(1, 10));
//出力:12345678910
 var str3 = string.Join(null, Enumerable.Range(9, 10).Select(v => v.ToString("X2")));
//出力:090A0B0C0D0E0F101112
```
Python機械学習プログラミング 第2章 分類問題 - 機械学習アルゴリズムのトレーニング まとめ 

# 前回のお話
[Python 機械学習プログラミング 第1章 まとめ](http://qiita.com/tackey/items/7a6a1e2315528c8d735f)

---

# はじめに
- 本章で扱うもの
    - 初期の機械学習アルゴリズム
        - パーセプトロン
        - ADALINE
- 学習内容
    - 機械学習アルゴリズムに対する直感を養う
    - データの読み込み、処理、可視化
    - 線形分類のアルゴリズムをPythonで実装

- サンプルコード
    - [python-machine-learning-book/code/ch02/ch02.ipynb](https://github.com/rasbt/python-machine-learning-book/blob/master/code/ch02/ch02.ipynb)
    - なお以下のまとめでは、コード、数式は記載しておりません。申し訳ございません。

---

# 2.1 人工ニューロン
- 歴史
    - McCulloch-Pittsニューロン(1943)
        - 生物学上の脳の仕組みを解明することを目的
        - 簡略化された脳細胞に関する初めての概念
    - パーセプトロンの学習規則に関する最初の概念(1957)
        - Frank Rosenblatt
        - 最適な重み係数を自動的に学習したのち、入力信号と掛け合わせ、ニューロンが発火するかどうかを判断するもの
        - 二値分類タスク
- キーワード
    - 総入力
    - 活性化関数
- 学習規則
    1. 重みを0または値の小さい乱数で初期化する
    2. トレーニングサンプルごとに以下の手順を実行する
        1. 出力値 yを計算する
        2. 重みを更新する
- パーセプトロンの収束可能性
    - 条件
        - 線形分離可能か
        - 学習率が十分小さいか
    - 収束しない場合
        - エポック、誤分類の最大数を設定

---

# 2.2 パーセプトロンの学習アルゴリズムをPythonで実装する
- テキスト参照

---

# 2.3 Irisデータセットでのパーセプトロンモデルのトレーニング
- Irisデータでの2値分類
- 多クラス分類の場合は一対全（One-vs-all)の手法
- テキスト参照

---

# 2.4 ADALINEと学習の収束
- パーセプトロンアルゴリズムの改良
- コスト関数の定義とその最小化に関する概念を具体的に示す
- パーセプトロンとの違い
    - 重みの更新方法
        - 線形活性化関数に基づいて重み更新
    - 量子化器
        - クラスラベルの予測
    - モデル誤差の計算と重みの更新に用いるもの
        - パーセプトロン
            - 二値のクラスラベル
        - ADALINE
            - 線形活性化関数からの連続値の出力

---

# 2.5 勾配降下法によるコスト関数の最小化
- 目的関数
    - 教師あり機械学習のアルゴリズムを構成する主な要素の1つ
    - 学習過程で最適化される
    - コスト関数
        - 重みの学習に用いる
        - 誤差平方和
    - この連続値の線形活性化関数の利点
        - 微分可能
        - 凸関数
            - 勾配降下法

---

# 2.5.1 ADALINEをPythonで実装する
- テキスト参照
- 学習率
    - 大きすぎる
        - 誤差平方和が増えて行く
    - 小さすぎる
        - 収束するのに相当な数のエポックが必要
- 標準化
    - 特徴量のスケーリング手法の1つ
    - 各特徴量の平均を0に
    - 標準偏差を1にする

---

# 2.6 大規模な機械学習と確率的勾配降下法
- バッチ勾配降下法
    - トレーニングデータセット全体
    - データセットが大きすぎると計算コストがかなりつく
- 確率的勾配降下法(逐次的勾配降下法、オンライン勾配降下法)
    - 1つのデータサンプルに基づく
    - 浅い極小値をより抜け出しやすい
    - データをランダムに並び替える
    - 新しいデータが届いた時にその場でモデルがトレーニングできる(オンライン学習）
- ミニバッチ学習
    - トレーニングデータの一部(例えば50)にバッチ勾配降下法を適用するもの

---

# 参考書籍
- [Python 機械学習プログラミング](http://amzn.to/2eOmjpP)

---

# ありがとうございました。
[Unity] uGUIのボタン押し下げ時にオーバーレイのテキストも一緒に下げる

#内容
押し下げ時にボタンの画像を変えるような仕様で
さらにボタン上にダイナミックフォントでテキストを描画しているとする。
例えば以下のようなボタン。

![image](https://qiita-image-store.s3.amazonaws.com/0/36154/214bd61d-3bac-223f-e16b-8040d28cf294.png)

左が通常の状態でボタンを押すと、押し下げを表現してボタンの高さが変わる。
このときボタン上のテキストも追従して移動してほしい。

ButtonのTransitionをAnimationにして、ボタンと同じレイヤにImageを置き、
そのImageを表示/非表示する方法も考えられるが、なんだか面倒。

プログラマ視点で簡単な実装を探る。


#実装内容

uGUIはオープンソースなので実装内容を確認することができる。
https://bitbucket.org/Unity-Technologies/ui

Buttonの実装でオーバライドできるような処理で使えるものはないか調査しました。
実装としては以下のようになりました。

```csharp:MyButton.cs
using UnityEngine;
using UnityEngine.UI;

public class MyButton : Button
{
    const float POSITION_Y_DISABLE = -6.7f;

    [SerializeField]
    RectTransform _rectTransformTextRoot;

    Vector2 _positionDisable = new Vector2(0f, POSITION_Y_DISABLE);

    protected override void DoStateTransition(SelectionState state, bool instant)
    {
        base.DoStateTransition(state, instant);

        switch(state)
        {
            case SelectionState.Highlighted:
            case SelectionState.Normal:
                _rectTransformTextRoot.anchoredPosition = Vector2.zero;
                break;
            case SelectionState.Pressed:
                _rectTransformTextRoot.anchoredPosition = _positionDisable;
                break;
            case SelectionState.Disabled:
                _rectTransformTextRoot.anchoredPosition = _positionDisable;
                break;
        }
    }
}
```

ButtonのTransitionをSpriteSwapにして、通常のように各状態にSpriteを設定する。
DoStateTransition()は状態変更時にコールされるので、この関数をオーバライドしてハンドリングする。

ButtonをカスタマイズするとSerializeFieldが表示されないので
エディタ拡張してインスペクターの表示を変更する。
ここは手抜きでベースのものを利用して、追加分だけを定義する。

```csharp:MyButtonEditor.cs
using UnityEditor;
using UnityEditor.UI;

[CustomEditor(typeof(MyButton))]
public class MyButtonEditor : ButtonEditor
{
    MyButton _target;
    SerializedProperty _propertyRectTransformTextRoot;

    protected override void OnEnable()
    {
        base.OnEnable();

        _target = target as MyButton;
        _propertyRectTransformTextRoot = serializedObject.FindProperty("_rectTransformTextRoot");
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        EditorGUILayout.Space();

        serializedObject.Update();
        EditorGUILayout.PropertyField(_propertyRectTransformTextRoot);
        serializedObject.ApplyModifiedProperties();
    }
}
```

Buttonの代わりにカスタマイズしたButtonをアタッチする。

以下のようにボタンの押し下げと連動してテキストも移動する。

![Screencast-2016-11-02a3.gif](https://qiita-image-store.s3.amazonaws.com/0/36154/3db4b98f-af01-1147-cae0-d10f0cabcff2.gif)

##注意
uGUIのテキストのアンカーなどの設定によっては実装が異なることもあります。
適時、実装を変えてください。


#あとがき
IPointerClickHandlerなどのインタフェースを実装して
押し下げのイベントをハンドリングすることはできる。

しかし、イベントインタフェースを調べてみても無効の状態へ遷移したことをハンドリングするものがない。
今回のボタンでは無効のときも押し下げにして押せないことを表現したかったので
このような実装になりました。

もし押し下げ、押し上げ、ハイライト、ノーマルの状態のみであれば
IPointerClickHandler系のインタフェースを実装することで対応することは可能です。

また今回のような手抜きではなく、Transitionするときにアニメーションしたり等
もっと仕様を盛り込みたいときは一からボタンクラスを作ることも可能です。
WriteableBitmapを更新する方法

# WriteableBitmapを更新する方法

WPFでLivetとかでWriteableBitmapをバインドしているときに
表示画像を書き換える方法

手順としては
1. 画像を作成
　　既存を更新する場合は省略可
2. 画像データを更新
　　BackBufferでポインターを受け取って中身を直接更新
3. 更新箇所の通知
　　AddDirtyRectを呼んで更新箇所を設定  
   サンプルは画面全体を更新


サンプル

```csharp

//1.適当に画像を作成
var image= new WriteableBitmap(width, height, 96, 96, PixelFormats.Gray8, BitmapPalettes.Gray256);            
image.Lock();
unsafe
{
    //2.この辺で画像をいじる
    byte* dp = (byte*)image.BackBuffer;
  　省略
}
//3.ここで入れたサイズの領域が更新される。ここがないと真っ黒。
image.AddDirtyRect(new System.Windows.Int32Rect(0, 0, image.PixelWidth, image.PixelHeight));
image.Unlock();
```
UniRx入門シリーズ 目次

 * [UniRx入門 その1](http://qiita.com/toRisouP/items/2f1643e344c741dd94f8)
 * [UniRx入門 その2 -メッセージの種類/ストリームの寿命](http://qiita.com/toRisouP/items/851087b4c990d87641e6)
 * [UniRx入門 その3 -ストリームソースの作り方](http://qiita.com/toRisouP/items/86fea641982e6e16dac6)
 * [UniRx入門 その4 -Updateをストリームに変換する方法とメリット-](http://qiita.com/toRisouP/items/30c576c7b0a99f41fb87)
 * [UniRx入門 その5 -コルーチンとの併用-](http://qiita.com/toRisouP/items/c4b9c5701dd6c991b481)

----

[過去に書いた記事一覧](http://qiita.com/toRisouP/items/48b9fa25df64d3c6a392)
UITableView内のタッチイベントをViewControllerに渡す方法

UITableView内のタッチイベントをViewControllerに渡す方法

# 1. 困っていたこと

### TableViewCell内のTextFieldを選択後、他の場所をタップしてもキーボードが消えない…
![キーボードが消えない](https://racooma.com/qiita/20161102/IMG_9981.PNG "他の場所をタップしてもキーボードが消えない")

UITablelView内のタップイベントはUIViewControllerへ伝わらないため、どうしても消せなかった…



# 2. どうしたいか

### キーボードを消したい。

![キーボードを消したい](https://racooma.com/qiita/20161102/IMG_9980.PNG "他の場所をタップしたらキーボードを消したい")


# 3. どのように解決したか

UITableViewを継承したCustomTableViewを作り、touchesBeganをオーバーライドし、UIViewControllerへtouchesBeganを繋げた。

```CustomTableView.swift

import Foundation
import UIKit

class CustomTableView: UITableView {

    override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("chain to the next responder")
        // touchesBeganを次のResponderへ
        self.next?.touchesBegan(touches, with: event)
    }
    
    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        print("touches ended")
    }

}
```



![CustomeTableViewをセット](https://racooma.com/qiita/20161102/screenShot_2016-11-02 01.24.17.png "CustomeTableViewをセット")


UITexFieldDelegateを追加、touchesBegan()をオーバーライドし、self.view.endEditing(true)を記述する。

```SettingsViewController.swift

import UIKit

class SettingsViewController: UITableViewController, UIPickerViewDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate {

  // code
  
  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        print(event!)
        self.view.endEditing(true)
        
        if (useridTextField.isFirstResponder) {
            useridTextField.resignFirstResponder()
        }
        if (usernameTextField.isFirstResponder) {
            usernameTextField.resignFirstResponder()
        }
        if (postalcodeTextField.isFirstResponder) {
            postalcodeTextField.resignFirstResponder()
        }
        if (addressTextField.isFirstResponder) {
            addressTextField.resignFirstResponder()
        }
    }
```

TableView内のCellとしてTextFieldを配置し、他の場所を選択した場合に編集終了としてキーボードを閉じる記述は以上のようになります。

当初は、Extension UITableVlewとしていたのですが、そうすると既存のUITableViewクラスを使用している任意のパーツにおいて意図しない動作をさせてしまうため、カスタムクラスを作成することをお勧め致します。

少しでも参考になりましたら幸いです。
ActiveResourceでRedmine REST触る

今更だけどActiveResource使ってみた．

ActiveResourceっていうのは，Railsのレールに完全に乗っかったモデルがあってREST APIが定義されていたら，別RailsアプリからでもActiveRecordみたいに触れる機能らしい．

ActiveResource越しにRedmineを触ることがあったのでメモがてらまとめ．

[https://github.com/rails/activeresource]

参考サイトは以下

[http://qiita.com/shibabuki_yuta/items/f6ed81d3f8f548651097]


# 使い方
今回はRails5でためす，Rails5で使う際には，masterのを使う必要があるみたいなのでGemfileに指定．
```
gem 'activeresource', github: 'rails/activeresource', branch: 'master'
```

参考サイト通りRedmineとつなげる．

```rb
class RedmineBase < ActiveResource::Base
  self.site = 'https://redmine.example'
  self.headers['X-Redmine-API-Key'] = 'hogee'
  self.format = :xml
end
```

あとは，同名のモデルを作ればいい(migrateなどは不要なのでおもむろにmodelを追加する形でもいい)

```rb
class Project < RedmineBase
end

Project.find(:all)
```

ここで罠がある．
unicornだと何故か `self.headers['X-Redmine-API-Key']` の中身が消失し，認証に失敗し続けるという事があったので，何とかして回避させる．

```rb
class RedmineBase < ActiveResource::Base
  self.site = 'https://redmine.example'
  self.headers['X-Redmine-API-Key'] = 'hogee'
  self.format = :xml

  def self.configure
    self.site = 'https://redmine.example'
    self.headers['X-Redmine-API-Key'] = 'hogee'
    self.format = :xml
  end
end
```

こうした上で，`application_controller.rb`に

```rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :configure_redmine_base

  private
  def configure_redmine_base
    RedmineBase.configure
  end
end
```

こうやって書くと毎回セットアップされるようになるので良さそう．

モデル名とRESTのPathが一致しない場合には，`prefix`を設定する．

```rb
class Membership < RedmineBase
  def self.set_project(project_id)
    self.prefix = "/projects/#{project_id}/"
  end
end
```

`Project.find(:all)`で一度に取れるプロジェクト数などがxml apiの関係でデフォルト25件になっている．((allってついているのにややこしいな...))

全件取りたいときはこんな感じ

```rb
@projects = []

page_index = 1
loop do
  projects = Project.find(:all, params: {page: page_index})
  page_index = page_index + 1

  break if projects.count == 0
  @projects = @projects.concat(projects)
end
```

`limit`は最大100件なので，paramsにlimit: 100とすればもう少しリクエストを少なくできる．クエリーにつけるオプションなどもparamsに引っ付ければいい．

# 使ってみて
whereなどが使えないのでActiveRecordかと思いきやそうでもないので意外と使いにくい．今回の利用では問題なかったけどこれで思いっきり何かをするというのは意外と使えなさそう．
Rails本家からパージされて別プロジェクトとかで管理されているので今後どうなるかわからない(純粋に分離しただけ説もありますが)

全件取るときなどは非常に時間がかかるので，結局mysqlに直繋ぎしたほうが早そうという気持ちもある．

# 罠
Project.findでIssue(この場合はチケット)で取れるカラムと直接Issue.findで取れるカラムが少し違うことがあって困った．今回はredmine pluginを作って必要なカラムを足すことで回避した．

その時の話はここ 

http://qiita.com/programmerMOT/items/8ceb57bddbdcf76b4f1d
RedmineのREST APIを拡張する話

RedmineのREST APIは良く出来てるんだけど，このカラムがほしいでも無い，みたいなときにはどうすればよいのか．

結構かんたんな話で，api viewを作ればいい．

[http://qiita.com/miminashi/items/8577877a5ad794b4d00f]

この通りに拡張したい*.api.rsbを持ってきて，追記すれば良い．

たとえば今回issueの拡張がしたかったので，`app/views/issues/index.api.rsb`を持ってきて

```rb
api.array :issues, api_meta(:total_count => @issue_count, :offset => @offset, :limit => @limit) do
  @issues.each do |issue|
    api.issue do
      api.id issue.id
      api.project(:id => issue.project_id, :name => issue.project.name) unless issue.project.nil?
      api.tracker(:id => issue.tracker_id, :name => issue.tracker.name) unless issue.tracker.nil?
      api.status(:id => issue.status_id, :name => issue.status.name) unless issue.status.nil?
      api.priority(:id => issue.priority_id, :name => issue.priority.name) unless issue.priority.nil?
      api.author(:id => issue.author_id, :name => issue.author.name) unless issue.author.nil?
      api.assigned_to(:id => issue.assigned_to_id, :name => issue.assigned_to.name) unless issue.assigned_to.nil?
      api.category(:id => issue.category_id, :name => issue.category.name) unless issue.category.nil?
      api.fixed_version(:id => issue.fixed_version_id, :name => issue.fixed_version.name) unless issue.fixed_version.nil?
      api.parent(:id => issue.parent_id) unless issue.parent.nil?

      api.subject     issue.subject
      api.description issue.description
      api.start_date  issue.start_date
      api.due_date    issue.due_date
      api.done_ratio  issue.done_ratio
      api.is_private  issue.is_private
      api.estimated_hours issue.estimated_hours
      # ここに追記したりする

      render_api_custom_values issue.visible_custom_field_values, api

      api.created_on issue.created_on
      api.updated_on issue.updated_on
      api.closed_on  issue.closed_on

      api.array :relations do
        issue.relations.each do |relation|
          api.relation(:id => relation.id, :issue_id => relation.issue_from_id, :issue_to_id => relation.issue_to_id, :relation_type => relation.relation_type, :delay => relation.delay)
        end
      end if include_in_api_response?('relations')
    end
  end
end
```

あとは空気を読んで生やすだけ，このrsbって仕様よく知らないんですけどまあ気合で．

あとはplugin入れるだけですね．かんたん．

# 参考記事のActionView::Template::Errorについて

http://www.redmine.org/issues/13924

その後の議論を見ているとエラーが出ないように修正されたらしいのでそこそこ新しいRedmineなら大丈夫っぽい．

# 今回のハマり
plugin名(init.rbに書くやつ)とpluginとして配置したときのディレクトリ名が異なるとうまく動かない．気をつけよう．
Xamarin.iOS で NSDate を DateTime に変換する

なんで ``NSDate`` ってこんなにわけわからんの？
こんなもの ``System.DateTime`` に変換してやる、えーい！


```csharp:
using System;
using Foundation;

namespace YourNameSpace
{
    public static class NSDateExtensions
    {
        public static DateTime ToDateTime(this NSDate date)
        {
            DateTime reference = TimeZone.CurrentTimeZone.ToLocalTime(
                new DateTime(2001, 1, 1, 0, 0, 0));
            return reference.AddSeconds(date.SecondsSinceReferenceDate);
        }
    }
}

```

参考は↓だけど、使いやすいように Extension Method にしました。

* [I code therefore I am. - NSDate to DateTime and Back](http://sourcerer.tumblr.com/post/502919332/nsdate-to-datetime-and-back)
全文検索エンジンElasticsearchで日本語を使えるようにする(IBM Bluemix編)

##概要
IBM BluemixでElasticsearchを使う場合、Kuromojiプラグインで日本語を使えるようにする方法を解説。まずCompose for Elasticsearchサービスを作っておく。そもそもComposeっていうのは、IBMが買収してBluemixに統合したDBaaSです。なのでElasticsearchの管理画面が別にあります。そこでKuromojiプラグインをオンにします。

##Compose for Elasticsearchサービス
まずCompose for Elasticsearchサービスを作っておく。
https://console.ng.bluemix.net/catalog/services/compose-for-elasticsearch/

##Composeの管理画面にログイン
Composeの管理画面にログインする。
https://app.compose.io
初めてログインする場合は、BluemixのIDを入れて、'Forgot your password?' からパスワードリセットしてログインする。

##Kuromojiプラグインの有効化
ログインできたらElasticsearchの管理画面からplug-inを選ぶ。デフォルトのplug-inはHeadとKopfのみなので、画面からKuromojiのスイッチをオンにする。'Set Active Plugins'ボタンをクリックして再起動させる。

![IMG_0563.PNG](https://qiita-image-store.s3.amazonaws.com/0/75507/a5eadda2-86dc-7d81-403f-32ffcb057d39.png)
##他にどんなプラグインが使えるのか？
どんなプラグインが使えるのか？は、ココに記述があります。
https://help.compose.com/docs/elasticsearch-faq
heroku上のプロセスをkillする


#### コマンド

```
heroku ps:stop <process id from heroku ps>
```

#### 用法

heroku ps
コマンドでプロセスIDを取得して、

```
$ heroku ps
=== run: one-off processes (1)
run.4872 (Free): up 2016/11/02 01:16:08 +0900 (~ 4s ago): bundle exec rake fetch:series
```

上記のような状態であれば、下記コマンドで停止できる。
```
heroku ps:stop 4872
```


[参考](http://stackoverflow.com/questions/7743039/killing-abandoned-process-on-heroku)
webpack2でresolve.rootが使えなくなった

webpackのresolve.rootを使うと、Reactなどの相対パスを書く箇所などで、webpack.config.jsに設定したルートからのパスに置き換えができて編集が楽になると教えてもらいました。
早速自分のプロジェクトにも使ってみようと設定してみたらプロジェクトが動かなくなってしまいました😱
原因はwebpack2を使っていたからでした。

## 対処法

modulesの配列に入れる。
（vue2のサンプル）

```js:webpack.config.js
  resolve: {
    modules: [
      path.resolve(__dirname, "src"),
      "node_modules"
    ],
    alias: {
      getters: "./src/store/getters.js",
      vue: 'vue/dist/vue.js'
    }
  },

```
aliasは今まで通り動くようです。

※ここでmodulesを設定する場合、modules内にnode_modulesを設定しないとnode_modules以下を読み取ってくれませんので注意が必要です。
（modulesを設定しない場合、modules: ["node_modules"]になるようなイメージでnode_modules以下を読み取ってくれます。）

webpackに依存してしまいますが、相対パス地獄から抜け出したい場合非常に楽にコードを書くことができます。

## 参考
[What's new in webpack 2](https://gist.github.com/sokra/27b24881210b56bbaff7)

上記ページがwebpack2の変更部分をわかりやすく解説してくれています。
現在webpack2のドキュメントがなさそうなので、webpack2を取り入れたい場合、上記ページを参考にすることで解決策が見つかるかもしれません。
AWS SESでメールを受信してS3へ保管してみる

「メールを受信したら何かしら処理をする」をやってみたくてAWS SESを触ってみました。

# AWS SESとは
Simple Email Serviceの略で、Eメールを受信したり送信したりするAWSのサービスです。
また、受信したメールをルール分けしてS3に保管したり、AWS SNSに通知したりも可能です。

今回はひとまずメールを受信してS3へ保管したいと思います。

# AWS SES利用開始
![20160613200840.png](https://qiita-image-store.s3.amazonaws.com/0/142489/0e494c7b-fa21-0c53-8c8c-4ef2d3fc2f78.png "20160613200840.png")

残念ながら東京リージョンはまだダメらしい。（対応されるのだろうか）

# MXレコードの追加
今回はRoute53にドメインを登録して受信します。
私の場合すでにRoute53にドメインを登録しているので、サブドメインとしてMXレコードを追加し、そこにメールが来たらS3へ保管します。

```
10 inbound-smtp.us-west-2.amazonaws.com
```

![20160613205533.png](https://qiita-image-store.s3.amazonaws.com/0/142489/a44854ee-6c39-47de-d374-d6a017f3a291.png "20160613205533.png")
mail.hoge.comみたいな感じですね。

オレゴンに設置予定なのでus-west-2にしていますが、向き先は必要に応じて変更してください。

# SESへのドメインの設定
SESでメールを受信するためにドメインを設定していきます。
先ほどRoute53でMXレコードを作ったので、Use Route 53を選びます。

![20160617012758.png](https://qiita-image-store.s3.amazonaws.com/0/142489/67b2dc7e-ed0f-e3b9-8257-49723a7900fd.png "20160617012758.png")

# Rule Setsの設定
メールを受信した際にどのような挙動を取るかをRuleとして設定し、それらを束ねたものがRule Setsになります。
また、Ruleの中にはActionを複数セットすることが可能です。
Actionとは、実際に何を行うかという設定で、Lambdaを動かしたり、S3にアップロードなどいくつかあります。

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/142489/9022ec14-9c5a-2d29-f820-ff43b1536c1c.png "p1.png")

今回はS3へ保管しますが、LambdaやSNSなど、AWSの他のサービスへ流すことも可能です。

# テスト受信
該当のメールアドレスへメールを送信してみると・・・・

![p2.png](https://qiita-image-store.s3.amazonaws.com/0/142489/6478b117-9eec-c21d-16a2-1b635d1c4b33.png "p2.png")

無事S3へ保管されました。
R-treeの実装のベンチマークテスト（Boost.Geometry と libspatialindex）

こんにちは。
[R-tree](https://en.wikipedia.org/wiki/R-tree)[^1] の実装（[Boost.Geometry](http://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/index.html) と [libspatialindex](https://libspatialindex.github.io/)）のベンチマークテストを見つけました。走らせてみると、その通りに Boost.Geometry は速いですね。

[^1]: R*-tree アルゴリズム採用

- 
[spatial_index_benchmark](https://github.com/mloskot/spatial_index_benchmark)

> Simple non-academic performance comparison of available open source implementations of R-tree spatial index using linear, *quadratic and R-star balancing algorithms as well as bulk loading (Sort-Tile-Recurse or combined methods).


```console
$ brew install boost
$ brew install spatialindex
 :
 :
$ cd spatial_index_benchmark
$ mkdir -p build
$ cd build
$ cmake ..
$ make
$ ./bgi_rstar_blk
```
flexboxを団子に喩える

flexboxのプロパティの意味を文章で説明されてもわかりにくかったので、団子にした。

# flex-direction

串の向き。reverseがつくと順番がひっくり返る。

![direction.png](https://qiita-image-store.s3.amazonaws.com/0/104070/11c8ea6c-f962-6371-9907-fa2c4fa517eb.png)

- row
- row-reverse
- column
- column-reverse

# justify-content

団子同士のくっつけ方。

![justify1.png](https://qiita-image-store.s3.amazonaws.com/0/104070/67a9438a-f006-4d14-e2a4-5fb1e8941951.png)

- flex-start
- flex-end
- center
- space-between
- space-around: 団子の両端に均等に空白ができる

# align-items

団子に串を刺す位置。

![items.png](https://qiita-image-store.s3.amazonaws.com/0/104070/9aa57a2a-2f41-c0f4-d65e-264c8f0b0603.png)

- flex-start
- flex-end
- center
- baseline
- stretch: 団子を串と垂直方向に引っ張る

# align-content

串同士のくっつけ方。

![content1.png](https://qiita-image-store.s3.amazonaws.com/0/104070/c5dd250e-347d-2e4d-e05a-904554f7a948.png)

- flex-start
- flex-end
- center
- space-between
- space-around: 串の両側に均等に空白ができる
- stretch
svnでコミットできない問題の解消 | svn ci コマンド失敗 | .profile作成で解決

# svn ci コマンドが出来ない

svnでコミットしようとする

```
$ svn ci
```

しかし、エラーメッセージが表示されコミットができない。

```
MacPro:branche n$ svn ci
svn: E205007: Commit failed (details follow):
svn: E205007: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options
svn: E205007: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found
```

内容をみると、コミットの際にメッセージを記載するのに必要なエディタが指定されていないとこが書かれている。

下記のように、オプションをつけ、メッセージを入れることも可能ではあるが、、、

```
svn ci -m 'コミットメッセージ'
```

毎回このオプションが必須になってしまうし、次回以降のことも考え、根本から解決することにした。

今回は、「 .profile 」を作成してみよう。

# .profile 作成

ホームディレクトリに移動

```
cd
```

新規に作成 (ls -la などで、現在のdotfileを確認しても良いかもしれません)

```
vi .profile
```

ファイルの中身は下記の1行のみでOK

```
VISUAL=vi; export VISUAL
```

確認 (環境変数を設定したので、その確認)

```
env
```

envコマンドを実行して出力されたなかで、下記が出ていればOK
VISUAL=vi

いったんバッシュを閉じて、新しいターミナル(コマンドプロンプト)を出して、
もう一度、コミットしてみる

```
svn ci
```

これで、コミットのメッセージで、viが立ち上がってくれる。
(viがもし、pcにインストールされていない場合は、インストールしていないと難しいと思います)

### .profileに記載してもenvが反映されない場合

bashの設定ファイルには読み込まれるタイミングや優先順位や細かく決められています。

/etc/profile
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc
~/.bash_logout

`~/.profile`でenvが反映されない場合は、`~/.bash_profile`で試してみてください。

ちなみに、envはコマンドライン(ターミナル)を再起動しないと、反映されないので、新しいコマンドの画面を立ち上げて確認してください。


##余談

git だと、こういった環境変数の設定をしなくても、デフォルトで、コミットする際にviが立ち上がっていると思います。
ubuntu16.04にansibleをインストールする

少しずつ地道に記録していきます。

今日のお題：ubuntu16.04.1にansibleをインストールする

### 前提条件
- virtualbox
 - ネットワーク設定 NAT
 - ネットワーク設定 ホストオンリーアダプタ
 - ネットワーク設定 内部ネットワーク
- OS Ubuntu 16.04.1
- それ以外
 - 外部ネットワークに繋がること
 
*uname結果*

```
openstack@Ubuntu16041Server:~$ uname -a
Linux Ubuntu16041Server 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:07:12 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
```
* * * 

### 実施手順

pipでインストールした所、理由は不明だが設定ファイル「ansible.cfg」等が存在しなかった。普通は「ansible --version」を打ったら「config file」にファイルのパスが表示される。
そのため、[公式ドキュメント](http://docs.ansible.com/ansible/intro_installation.html#latest-releases-via-apt-ubuntu)を見て今度はapt-getでインストールした所、無事configファイルが生成された。
内容としては必要なパッケージを導入し、リポジトリを追加、ansibleをインストールする。それだけです。

```
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt-get update
sudo apt-get install ansible
```

### 実施後確認
バージョン確認が出来たのでまずは入ったと思われる。
次は設定回りと実際モジュールを実行してみよう

```
ansible --version
ls -lrta /etc/ansible
```

```
openstack@Ubuntu16041Server:~$ ansible --version
ansible 2.2.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
openstack@Ubuntu16041Server:~$
openstack@Ubuntu16041Server:~$ ls -lrta /etc/ansible/
total 32
-rw-r--r--  1 root root  1016 Nov  1 12:43 hosts
-rw-r--r--  1 root root 14396 Nov  1 12:43 ansible.cfg
drwxr-xr-x  2 root root  4096 Nov  1 12:47 roles
drwxr-xr-x  3 root root  4096 Nov  3 00:14 .
drwxr-xr-x 92 root root  4096 Nov  3 00:15 ..
```

次のお題：ansibleでモジュールを実行する
【Swift】YouTube動画検索＆動画再生のサンプルコード（youtube-ios-player-helper）

# 概要
YouTubeの動画検索と動画再生のサンプルコードです。

動画の検索は[YouTube Data API (v3) のSearch:list](https://developers.google.com/youtube/v3/docs/search/list?hl=ja)を利用しています。

動画の再生は[YouTube Helper Library](https://developers.google.com/youtube/v3/guides/ios_youtube_helper) ([youtube-ios-player-helper](https://github.com/youtube/youtube-ios-player-helper))
を利用しています。（非常に簡単です！）

[PureLayout](https://github.com/PureLayout/PureLayout)を利用し、今回もStoryboardは未使用です。

# github
https://github.com/menomoto/Sample_Apps/tree/master/youtubeSearch
* 利用する場合は[APIキーを作成](https://developers.google.com/youtube/registering_an_application?hl=ja)して[apiKey](https://github.com/menomoto/Sample_Apps/blob/master/youtubeSearch/youtubeSearch/Components/ApiClient.swift#L5)を変更してください。

# 動画再生のコード
```
// import YouTube Helper Library
import YouTubeiOSPlayerHelper

// view Element
let playerView: YTPlayerView

// initialize
self.playerView = YTPlayerView.newAutoLayoutView()

// addsubview
view.addSubview(playerView)

// Video load
playerView.delegate = self
playerView.loadWithVideoId(video.videoId, playerVars: ["playsinline":1])

// Auto Layout
playerView.autoPinEdgeToSuperviewEdge(.Top)
playerView.autoPinEdgeToSuperviewEdge(.Left)
playerView.autoPinEdgeToSuperviewEdge(.Right)
playerView.autoSetDimension(.Height, toSize: 380)
```

# 結果
![サンプル](http://i.imgur.com/J9zkGDx.gif)
Alamofireでアプリが再起動したらダウンロードを再開する

※2018/8/18 Githubのコードをswift4に変更。iOS12 betaで動作するように修正。

ダウンロード最中にアプリが終了したとき、アプリを再起動したらダウンロードを途中から始める。という機能をAlamofireを使用して実装してみました。
# 環境
Xcode10.0 beta 6
Swift4.0

# ライブラリ
[Alamofire](https://github.com/Alamofire/Alamofire)

# SessionManagerの初期化
URLSessionConfigurationを作成します。identifierはセッションを識別するためのユニークな識別子です。[URLSessionConfiguration](https://developer.apple.com/reference/foundation/urlsessionconfiguration)にはタイムアウトやキャッシュポリシーなどを設定することができます。
configurationでSessionManagerを初期化することでアプリが終了されても前回のタスクを取り出すことができます。
```
let configuration = URLSessionConfiguration.background(withIdentifier: identifier)
self.manager = Alamofire.SessionManager(configuration: configuration)
```

# 前回終了したタスクを取り出す
getAllTaskでセッションに登録されているタスクを取得します。前回終了したときのタスクはエラー扱いでコードがNSURLErrorCancelled(-999)として取得できます。このerror.userInfoにはData型で前回終了したタスクを再開するためのplistが格納されています。今回は一度キャッシュディレクトリに保存してから利用する形にしました。

```
self.manager.session.getAllTasks(completionHandler: {[weak self] tasks in
    guard let wself = self else {
        return
    }
    
    for task in tasks {
        guard let error = task.error else {
            continue
        }
        
        //エラーコードがキャンセル
        if (error as NSError).code == NSURLErrorCancelled {
            //リクエストのクエリからtag名を取得する
            let query = task.originalRequest!.url!.query!
            let queryAr = query.components(separatedBy: "&")
            for keyParam in queryAr {
                let keyParamAr = keyParam.components(separatedBy: "=")
                if keyParamAr[0] == "tag" {
                    let id = Int(keyParamAr[1])!
                    do {
                        //plistを保存する
                        let resumeData = (((error as NSError).userInfo) as NSDictionary)["NSURLSessionDownloadTaskResumeData"] as! Data
                        let cacheURL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0]
                        let fileUrl = cacheURL.appendingPathComponent(String(format : DownloadService.resumeFileFormat, id))
                        try resumeData.write(to: fileUrl)
                        
                        //ビュー更新のためのクロージャー        
                        if let prevDownloadClosure = wself.prevDownloadClosure {
                            prevDownloadClosure(id)
                        }
                        
                        //ダウンロードを再開する
                        wself.resumeDownload(id: id, url: task.originalRequest!.url!.path)
                    } catch {
                        print("plist write error")
                        continue
                    }
                }
            }
        }
    }
})
```

# 作成したプロジェクト
[github](https://github.com/h-shiraishi/BackgroundDownload)

#最後に
ついこの間までiOS10で動きませんでした。OS側のバグでcancelByProducingResumeDataで出力されるデータが正しくないようです。[StackOverflow](http://stackoverflow.com/questions/39346231/resume-nsurlsession-on-ios10)に助けられました。

※2017/3/28 追記
iOS10.2でキャンセル処理をしたときに取得できるデータからダウンロードの再開は正常に行えるようになりましたが、データの中のoriginalRequest(リクエスト先)とcurrentRequest(リダイレクト先)がnilになっている問題がありました。
iOS10.3では以前と同じようにoriginalRequestとcurrentRequestがURLRequestがData型にキャストされたものを取得できるように修正されていることを確認できました。
Serverless FrameworkでS3Bucketを作成する


Serverless Frameworkの`resources`を使えば、CloudFormationを利用してS3などのリソースを作成できます。
で、その書き方はおおよそこんな感じ。

```serverless.yml
resources:
  Resources:
    ExampleLogs:
      Type: AWS::S3::Bucket
      Properties:
        BucketName: example-logs
  Outputs:
    RdsLogs:
      Description: "Example Log Bucket"
      Value:
        Ref: "ExampleLogs"
```

`Outputs`の`Ref`の値と、`Resources`で設定した名前（今回は`ExampleLogs`）は同じにしましょう。

成功すれば、Serverless FrameworkのOutputsに出力されます。

![スクリーンショット 2016-11-02 0.04.23.png](https://qiita-image-store.s3.amazonaws.com/0/23936/6749fad8-4dab-ba89-9492-75c140409067.png "スクリーンショット 2016-11-02 0.04.23.png")

ちなみにCloudFormationの記法に従えば以下のようにOutputsの値を使用できます。

```serverless.yml
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - "s3:GetObject"
        - "s3:PutObject"
      Resource:
        - {
          "Fn::Join": [
            "",
            [
              "arn:aws:s3:::",
              {
                "Ref": "ExampleLogs"
              }
            ]
          ]
          }
```
Azure Application InsightsにLogbackでログ出力する



# 概要
Azure App ServiceにデプロイしたJavaアプリケーションからLogbackを使用してログ出力します。
Application InsightsというAzureのアプリケーション診断機能を出力先とします。

下記の内容を最小限の構成で導入したものになります。
[Application Insights を使用した Java トレース ログの探索](https://azure.microsoft.com/ja-jp/documentation/articles/app-insights-java-trace-logs/)

Application Insights SDK for Javaの導入が前提となっているので、下記の手順の一部も実施します。
[Java Web プロジェクトで Application Insights を使う](https://azure.microsoft.com/ja-jp/documentation/articles/app-insights-java-get-started/)

# 準備
## Application Insights
Application Insightsが無い場合は作成します。
App ServiceのApplication Insightsを選択すると作成するよう促されます。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/134356/44e6b48b-2789-163b-af80-4bb90305c98f.png)

## 環境変数
Application Insightsの概要に表示されているインストルメンテーションキーを環境変数に設定します。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/134356/53d92cb2-20c2-c2ca-fbf0-b86e0457b589.png)

App Serviceのアプリケーション設定→アプリ設定に下記のキーの値にインストルメンテーションキーを入力します。

```
APPLICATION_INSIGHTS_IKEY
```

![04.png](https://qiita-image-store.s3.amazonaws.com/0/134356/23630250-c608-97f2-a7bc-ce6ae379cae1.png)

## Maven
依存情報に以下を追加します。

```xml:pom.xml
<dependency>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>applicationinsights-logging-logback</artifactId>
  <version>1.0.6</version>
</dependency>
```

Application Insights SDK for Javaとして、下記のいずれかの依存情報が必要となります。

```
applicationinsights-core
applicationinsights-web
```

単純にログ出力するだけであれば、coreのみで可能です。
applicationinsights-logging-logbackがcoreに依存しているので、前述の依存情報のみで充足します。

## logback.xml
logback.xmlにApplication Insights用のAppenderを定義します。

```xml:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
  <appender name="aiAppender"
    class="com.microsoft.applicationinsights.logback.ApplicationInsightsAppender">
  </appender>
  <root level="trace">
    <appender-ref ref="aiAppender" />
  </root>
</configuration>
```

# 実装
あとはLogbackとして通常のログ出力するだけです。

```java
Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.trace("Logback to Application Insights");
```
# 実行結果
Application Insightsの概要→検索にトレースとして表示されるようになります。
私の環境では反映されるまでにタイムラグがありました(1分くらい？)。
![06.png](https://qiita-image-store.s3.amazonaws.com/0/134356/6ebe563d-938c-415c-b64c-b6bcc820ac89.png)

# まとめ
Azure App ServiceでJava使ったログ出力の情報が少ないです。
ASP.NETだとSystem.Diagnosticsを使ってアプリケーション診断に記録できるとかあるのですが。
Application Insightsを使うのが妥当なのかは不明ですが、とりあえずログ出力するという目的は達成できました。

# 参考
[Application Insights を使用した Java トレース ログの探索](https://azure.microsoft.com/ja-jp/documentation/articles/app-insights-java-trace-logs/)
[Java Web プロジェクトで Application Insights を使う](https://azure.microsoft.com/ja-jp/documentation/articles/app-insights-java-get-started/)
[Azure App Service の Web アプリの診断ログの有効化](https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-enable-diagnostic-log/)