OmniAICreator/Qiita-1.07M huggingface dataset:
AML 機械学習における訓練

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AML 機械学習における訓練] (https://www.techcrowd.jp/machinelearning/training/)

# [訓練用データと評価用データ] (https://www.techcrowd.jp/machinelearning/training/)

訓練用のデータだけを使っていたのでは、訓練用データだけに対応する機械学習システムとなってしまので、訓練用のデータだけではなく評価用のデータも使って訓練が行われるのが一般的です。

Amazon Machine Learningでモデルの訓練を行う際は、
・訓練用データは7割
・評価用データは3割
に分割されます。


# [訓練に関する設定] (https://www.techcrowd.jp/machinelearning/training/)

訓練の内容は自動と手動での設定が可能で、手動で設定する場合はrecipe画面にて詳細な設定が出来ます。

学習パラメータについても、
・モデルの最大サイズ
・パス数の設定
・正則化に関する設定
・評価の設定
などを設定する事が可能です。

これらの設定を行ってから、学習用のモデルの訓練が行われます。


# [訓練結果の評価] (https://www.techcrowd.jp/machinelearning/training/)

Amazon Machine Learningでは訓練が終了すると、評価が行われます。

訓練の評価は、
・二項分類
・多項分類
・回帰
などの評価指標に基づいたものです。

各評価指標を使って、学習モデルの目的や用途に応じた評価を行う事が出来ます。
AMLにおける学習モデルの構築方法

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AMLにおける学習モデルの構築方法] (https://www.techcrowd.jp/machinelearning/model-2/)

# [学習や前処理などについての設定] (https://www.techcrowd.jp/machinelearning/model-2/)

Amazon Machine Learningで学習モデル構築の際には、使用するデータソースを選んでから、学習設定の方針を選択します。

学習の設定については、
・推奨設定
・手動での設定
のどちらかを選べます。

手動で設定する場合はrecipe画面にて、
・データの前処理
・変換処理
・特徴量の抽出
などを設定して行きます。


# [学習パラメータの設定] (https://www.techcrowd.jp/machinelearning/model-2/)

recipe画面での設定の後は、
・モデルの最大サイズ
・パス数
・正則化
などの学習パラメータの設定を行います。

モデルの最大サイズ
・データパターンを保持する量を設定します
・最大サイズを超えたパターンについては廃棄されます
・大きなサイズを設定すると、処理する時間が増えて料金負担が大きくなります

パス数
・データパターンを検索する時のパス数を設定します
・パス数を大きくすると予測精度を向上させる事が出来ますが、コストも増加します

正則化
・過学習を防ぐために、学習モデルの自由度などを制限します
・適切に正則化を利用しないと、訓練用データに特化されてしまいます


# [評価の設定] (https://www.techcrowd.jp/machinelearning/model-2/)

評価の設定では、評価するためのデータソースを選択する事が出来ます。

評価用データソースとして、
・専用の評価用データソース
・訓練用データソースを分割して使用
などを選ぶ事が可能です。
Visual Studio / WPF > XAML > 属性構文 / プロパティ要素の構文

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.1138 / 9985

オブジェクト要素のプロパティの設定方法として、以下の２つを具体例とともに紹介されている。

- 属性構文
- プロパティ要素の構文

自分でもButtonについて上記2つを実装してみた。

```xml:XAML
<Window x:Class="_170423_t1540_buttonStyle.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_170423_t1540_buttonStyle"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left"
                Background="Black"
                Margin="80,74,0,0" VerticalAlignment="Top" Width="75">
            <Button.Foreground>
                White
            </Button.Foreground>
        </Button>
    </Grid>
</Window>
```

![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8cc37a9e-e062-898d-9976-f8f2afa04e4f.png)

`Background`の設定が「属性構文」で`Foreground`の設定が「プロパティ要素の構文」。


「プロパティ要素の構文」のほうはオブジェクトを扱うのに良いとのこと。

@ WPF 4.5入門 by 大田一希さん
No.1222 / 9985
> プロパティの型がオブジェクトの場合、この記法が役に立ちます。

### その他リンク

MSDN: https://msdn.microsoft.com/ja-jp/library/dd638655(v=vs.95).aspx#why_property_element_syntax_versus_attribute_syntax

.NETな日々-EX-さん: http://d.hatena.ne.jp/kazutoex/20100427/1272370518
Spring Boot context が立ち上がったら自動的にブラウザを開く / Open browser for spring-boot

エンジニアじゃ無い人向けのツールを、ローカルで起動できる Jar + 実際の操作は Web 経由、でやろうと思ったときに。

ポート8080固定→ 困りそう
ポート任意→ ログからポート見つけてブラウザ開くとか無理そう

なので、上手く自動割り当て済みのポートでブラウザ勝手に開く方法無いかと探していた。

以下の用にして解決。

```java:BrowserStartupSupport.java

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;

import org.springframework.boot.context.embedded.EmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;

@Service
public class BrowserStartupSupport {
    @EventListener
    public void openBrowserOnServletContainerInitialized(
            final EmbeddedServletContainerInitializedEvent event) throws IOException {
        final EmbeddedServletContainer embeddedServletContainer = event.getEmbeddedServletContainer();
        final int port;

        if (embeddedServletContainer instanceof TomcatEmbeddedServletContainer) {
            port = ((TomcatEmbeddedServletContainer) embeddedServletContainer)
                    .getTomcat().getConnector().getPort();
        } else {
            port = embeddedServletContainer.getPort(); // Maybe
        }

        Desktop desktop = Desktop.getDesktop();
        desktop.browse(URI.create("http://localhost:" + port));
    }
}
```

これを、

```yaml:application.yml
server.port: 0 # Search random available port.
```

と組み合わせて使うと、実行時に空いてるポートで Tomcat 起動&ブラウザでその画面が開く。

参考
===
* https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-discover-the-http-port-at-runtime
* http://d.hatena.ne.jp/Kazzz/20080617/p1
AMLによる機械学習の作業手順

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[AMLによる機械学習の作業手順] (https://www.techcrowd.jp/machinelearning/proces/)

# [予測が取得できるまでの具体的な作業の流れ] (https://www.techcrowd.jp/machinelearning/proces/)

Amazon Machine Learningでの機械学習においては、

・訓練で使うためのデータソースの作成
・学習モデルの構築
・学習モデルの評価
・データを使って予測した結果の作成

といった作業を行って、予測を行います。


# [訓練で使うためのデータソースの作成] (https://www.techcrowd.jp/machinelearning/proces/)

機械学習で訓練に使うデータは、Amazon Machine Learningで使えるフォーマットに変換する必要があります。

・訓練用データを、S3やRedshiftなどから読み込みます
・読み込んだデータを、どのようなフォーマットに変換するか指定します
・データソースを使って機械学習するために、ターゲットの指定をします
・予測した結果をIDと関連付けたい場合は、ID項目を指定します


# [学習モデルの構築] (https://www.techcrowd.jp/machinelearning/proces/)

データソースを使って、学習モデルを構築します。

・モデルを構築するためのデータソースを指定します
・学習に関する設定を、推奨設定にするか手動設定にするか選択します
・手動で学習設定をする場合、どのような前処理をするか指定します
・モデルの最大サイズやパス数の設定などの学習パラメータに関する設定を行います
・評価についての設定をします


# [学習モデルの評価] (https://www.techcrowd.jp/machinelearning/proces/)

構築した学習モデルの評価が、評価エンティティに保存されます。

・二項分類
・多項分類
・回帰

などの学習モデルに種類に応じた評価指標が使われます。


# [データを使って予測した結果の作成] (https://www.techcrowd.jp/machinelearning/proces/)

学習モデルを構築して評価が済んだ後は、実データを入力して予測を行う事が出来ます。

予測結果を取得する方法には、
・複数の予測結を一度に行うバッチ予測
・AWS APIを使って一つずつデータを入力して、予測結果を問い合わせるリアルタイル予測
が利用出来ます。
【サクラエディタマクロ】自分用に残しておくマクロ集

#はじめに
パソコンがお無くなりになったときとかに
マクロが無くなってしまって作り直すことも増えて来たので以前作ったものをここに置いていく。
いずれは全部置けると良いんだけど、ソースを忘れてしまったものも数知れず。。。

#マクロ一覧

##重複カウント用マクロ
・行単位に同じ文字が現れた際にカウントするマクロ。
　出力先はサクラエディタのアウトプットに出てくる。
　「NNN<タブ区切り>文字列」の形式で出力される。NNNは重複数。

```js:count.js
var Count = function(){
	var m_strResult;
	var m_aryLineList;
	this.Init();
	this.Main();
	this.Dest();
}

Count.prototype.Init = function(){
	this.m_strResult = "";
	this.m_aryLineList = new Array();
}
Count.prototype.Main = function(){
	var nMaxLineCount = Editor.GetLineCount(0) + 1;
	for(var i=1;i < nMaxLineCount;i++){
		var line =  Editor.GetLineStr(i);
		if(this.m_aryLineList[line] == undefined){
			this.m_aryLineList[line] = 1;
		}else{
			this.m_aryLineList[line]++;
		}
	}
}
Count.prototype.Dest = function(){
	
	for(var line in this.m_aryLineList){
		this.m_strResult += this.LPadding(this.m_aryLineList[line],3,"0") + "\t" + line;
	}
	Editor.TraceOut(this.m_strResult,0);
}
Count.prototype.LPadding = function(num,len,strParam){
	var Padding = function(nLength){
		var str = "";
		for(var i=0;i < nLength;i++){
			str += strParam;
		}
		return str;
	}
	return (Padding(len) + num).slice(-len);
}

new Count();
```
## 文書インデント整形マクロ
特定の記号単位に、階層を作るマクロ。要するに記号単位にタブでインデント階層を作れる。
打ち合わせのメモを取るときとかに一括でタブインデントを揃えたいときに利用する。
順序が考慮されていて、【、■、□、・の４つだけ使用しているが変更可能。（上部のPREFIX_LISTを変更すれば良い。）
F11キー押下時のテキストトピックツリーと相性が良い。

```js:docmentFormat.js
var  PREFIX_LIST = (function() { return ["【","■","□","・"] }());
var DocmentFormat = function(aryStart){
	this.Init(aryStart);
}
DocmentFormat.prototype.Init = function(aryStart){
	this.aryStart = {}
	for(var i=0;i < aryStart.length;i++){
		this.aryStart[aryStart[i]] = i;
	}
	this.count = 0;
	this.strResult = "";
}
DocmentFormat.prototype.GetBlank = function(cnt){
	var str = "";
	for(var i=0;i < cnt;i++){
		str += "\t";
	}
	return str;
}

DocmentFormat.prototype.Count = function(strLine){
	var strBlank = this.GetBlank(this.count);
	var strPrefix = strLine.substring(0,1);
	if(this.aryStart[strPrefix] != undefined){
		this.count = this.aryStart[strPrefix];
		strBlank = this.GetBlank(this.count);
	}else{
		strBlank = this.GetBlank(this.count + 1);
	}
	this.strResult += strBlank + strLine;
}
DocmentFormat.prototype.GetResult = function(){
	return this.strResult;
}

var Format = function(){
	this.Init();
	this.Main();
	this.Dest();
}

Format.prototype.Init = function(){
	this.m_x = Editor.ExpandParameter("$x")
	this.m_y = Editor.ExpandParameter("$y")
}
Format.prototype.Main = function(){
	var nMaxLineFormat = Editor.GetLineCount(0) + 1;
	var objCnt = new DocmentFormat(PREFIX_LIST);
	for(var i=1;i < nMaxLineFormat;i++){
		var line =  Editor.GetLineStr(i);
		objCnt.Count(line.replace(/^[ \t]+/g,''));
	}
	Editor.SelectAll();
	Editor.InsText(objCnt.GetResult());
	Editor.MoveCursor(this.m_y,this.m_x,0);
}
Format.prototype.Dest = function(){
}

new Format();
```
#最後に
随時、思いついたら更新する予定。
機械学習モデルの構築プロセス

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[機械学習モデルの構築プロセス] (https://www.techcrowd.jp/machinelearning/model/)

# [学習プロセスの構成] (https://www.techcrowd.jp/machinelearning/model/)

機械学習プロセスは、
・データの分析　　　
・学習モデルのトレーニング　　　
・評価
から構成されますが、Amazon Machine Learningには各ステップの作業に役立つツールが用意されています。


# [データの分析] (https://www.techcrowd.jp/machinelearning/model/)

データ分析では、学習モデルのトレーニングに使用するデータの内容を検討して、より適切な予測が可能となるようにデータを変換します。

・変数の値とデータの特徴の関係性
・各変数とターゲットの相関関係
などに注意をしてデータ分析を行います。

データを変換する必要がある時は、
・意味のない値を有効な値に置き換える
・数値変数をカテゴリに変換する
などの特徴抽出処理を行いますが、Amazon Machine Learningでは入力データに対して自動的にデータ変換のアドバイスが行われます。


# [学習モデルのトレーニング] (https://www.techcrowd.jp/machinelearning/model/)

Amazon Machine Learningの機械学習アルゴリズムが訓練データを使って学習を行い、有効な学習モデルを構築します。

構築された機械学習モデルに新しいデータを入力すると、学習した内容に従って適切な予測を行れるようにトレーニングが行われます。


# [評価] (https://www.techcrowd.jp/machinelearning/model/)

構築した学習モデルは予測の正確性について評価しなくてはなりませんが、Amazon Machine Learningには、品質メトリックスを評価してモデルの動作を可視化するツールが用意されています。

Amazon Machine Learningの評価ツールによって、学習モデルを詳細に評価する事が可能となり、予測をどのように調整すれば良いのか調査するのに役立ちます。
Amazon Machine Learning

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[Amazon Machine Learning] (https://www.techcrowd.jp/machinelearning/amazon-machine-learning/)

# [Amazon Machine Learningとは] (https://www.techcrowd.jp/machinelearning/amazon-machine-learning/)

Amazon Machine Learningとは、機械学習に関する技術やアルゴリズムを十分に理解していない人でも、簡単に利用出来るサービスです。

Amazon Machine Learningは、
・エンドツーエンドのモデル作成ツール
・モニタリングツール
などの開発環境が全て提供されるマネージドサービスなので、訓練用のデータなどの用意が整っていれば、直ぐに機械学習モデルを構築する事が出来ます。

機械学習システムの構築と維持するために、労力と費用を使う必要がなくなります。


# [使いやすいAPIが用意されている] (https://www.techcrowd.jp/machinelearning/amazon-machine-learning/)

Amazon Machine Learningは利用可能なアルゴリズムが限定されているものの、モデル可視化ツールやインタラクティブなデータの遣り取りなどを使う事で、機械学習モデルの構築と調整を効率的に行えます。

構築した学習モデルを使って予測をする場合も、Amazon Machine Learningの予測APIを使うと、即座に予測結果を取得する事が可能です。

APIは、
・多数の予測を一度にリクエスト出来るバッチ予測API
・個別の予測を取得出来るリアルタイムAPI
の2種類が用意されていますので、用途に合った使い方が出来ます。


# [低コストで機械学習モデルの構築が可能] (https://www.techcrowd.jp/machinelearning/amazon-machine-learning/)

低コストで機械学習モデルを構築出来る事も、Amazon Machine Learningの特徴です。

・初期費用は不要
・従量制の料金体系
なので、用途に合わせた機械学習モデルを構築出来ますし、必要に応じてスケールを拡大したり縮小する事も簡単です。
機械学習ライブラリMahout

機械学習に関する基本的な内容をまとめてみたものです。機械学習に関する、Web上にすでにある解説コンテンツをまとめたサイトの抜粋です。
[機械学習ライブラリMahout] (https://www.techcrowd.jp/machinelearning/mahout/)

# [Mahoutの概要] (https://www.techcrowd.jp/machinelearning/mahout/)

Mahoutとは、Apache Software Foundationにより公開されているオープンソースソフトウェアの機械学習ライブラリです。
Mahoutを使えば、ビッグデータの分散処理を可能とするApache Hadoopのメリットを活かして、機械学習システムを構築する事が出来ます。

無料で使えるライブラリでありながら、クラスタリングやレコメンドなどの機械学習アルゴリズムがMapReduceで実装されていて、ドキュメント類も整備されていますので、本格的な機械学習アプリケーションを構築する事が可能です。


#[Mahoutに実装されている機能] (https://www.techcrowd.jp/machinelearning/mahout/)

Mahoutには、
・レコメンデーション（Recomendation）
・クラスタリング（Clustering）
・分類（Classification）
を中心とした機能が実装されています。

Hadoopプロジェクトで実装された分散プログラミング用APIである Map-Reduceを使って実装されているので、簡単に利用出来るのが特徴です。

具体的な機能として以下のようなものが用意されています。

### K平均法、ファジィK平均法、Canopy、ディリクレ、平均シフトなどのMap-Reduce に対応するクラスタリング実装
### 分散型と補完型の単純ベイズ分類器
### 進化的プログラミングに使用する分散型適応度関数
### 行列とベクトルに関するライブラリ


# [Mahoutの利用方法] (https://www.techcrowd.jp/machinelearning/mahout/)

Hadoopが使える環境でJava1.6以上が環境変数JAVA_HOMEに設定されていれば、バイナリ配布版を入手して展開するだけで、Mahoutを利用出来ます。

Mahoutをコマンドラインで使う場合は、mahoutシェルスクリプトに対して、
・コマンド
・パラメータ
・入出力ディレクトリ
などを指定するだけです。

Javaなどのプログラムからも、ドライバでAPIを使えば簡単にMahoutの機能が利用出来ます。
Emacsの--loadと--scriptで指定したファイルはどちらが先に実行されるか?

<!---


--->

# Emacsの--loadと--scriptで指定したファイルはどちらが先に実行されるか?

ちょっとわからなかったのでやってみた。備忘録として残しておく。

```
$ emacs --version
GNU Emacs 25.1.1
Copyright (C) 2016 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of GNU Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
```

やったのはこんな感じ。

```lisp:script.el
(print (format "script: %s" (current-time)))

```

```lisp:load.el
(print (format "load: %s" (current-time)))

```

実行する。

```
$ emacs -nw -q -l load.el --script script.el

"script: (22780 20842 88910 0)"

"load: (22780 20842 90294 0)"
```

`--script` の方が先に読まれていそう。
Visual Studio / WPF > コントロールテンプレート / データテンプレート

@ WPF 4.5入門 by 大田一希さん
No.830 / 9985

> ここで特に重要なのは、Contentプロパティにコントロールが設定された場合は、そのまま表示できることと、その他のオブジェクトが設定された場合はデータテンプレートという仕組みを使って表示されることです。

「その他」としては、上のほうで色々な例が挙げられている。

関連しそうなものとして以下を見つけた。
[WPFコントロールテンプレートとデータテンプレートの違い @ tocsworldさん](https://tocsworld.wordpress.com/2014/09/28/wpf%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC/)

> `3`. どちらを使うか
uGUIでサイドパネルを作る

# サイドパネルとは

テレビ放送などで画面の左右に表示される黒帯（ピラーボックス）のことです。今回はこのサイドパネルみたいなUIをuGUIで設定する方法を解説します。

![tideji.png](https://qiita-image-store.s3.amazonaws.com/0/47146/fcf6f155-eb80-e259-e7ac-e8732159e999.png)
（画面の左右に帯を出してそこにUIを表示するこの画面の作り方を紹介します）

#やり方

## 1.Canvasを設定する

Canvasをシーン上に新しく作成し、[Canvas Scaler]の[UI Scale Mode]を **Scale With Screen Size** に設定します。
また、Rederense Resolutionも設定しCanvas上の基準となるピクセル数を決定します。（今回は1920x1080に設定）

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/a545c417-4e52-c948-a9f0-d35e501c4120.png)

## 2.空のGameObjectをCanvas上に作成

名前は適当に「MainPanle」にしておきます。 
作成したらRect Transformを調整して画面全体にフィットするサイズに変更します。

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/0d22a01a-6b9b-b771-2946-18237c87b3de.png)

## 3. MainPanelの下に空のGameObjectを3つ生成

それぞれ上から「Left」「Center」「Right」という名前にして配置します。
RectTransformは初期値のままで変更しなくて大丈夫です。

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/e5c84eec-e0a5-d09d-b291-b0e84a1113c9.png)

## 4. 3つのオブジェクトを等間隔で配置させる

MainPanelにHorizontal Layout Groupコンポーネントを追加します。
また、[Control Child Size]のWidthとHeighの両方にチェックを入れます。

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/aa0c7e87-3bfa-24d3-ce94-39806ec3af64.png)

これを設定することで先程の「Left」「Center」「Right」が自動的に等分割されて画面上に配置されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/b58e8ff5-6aff-dfad-e42b-03153f76d8f1.png)
（Horizontal Layout Groupにより等分割されて配置される）

## 5. Centerパネルのサイズを上書きする

このままだとCenterパネルの領域が狭いのでLayoutElementコンポーネントを使ってサイズを上書きします。

「Center」の名前のGameObjectにLayout Elementコンポーネントを設定し、[Preferred Width]にチェックを入れて必要な分の横幅のピクセル数を設定します。
ここのピクセル数は最初にCanvas Scalerで設定したピクセル数に依存して変化します。

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/7e40a553-5b91-fed2-4c3c-58e81f8c0407.png)
（上の図の場合はCenterPanelの横幅が1000ピクセルで固定されサイドパネルがそれぞれ460ピクセルになる）

## 6. Left、Rightパネルから要素がはみ出ないようにする

このままUI要素をサイドパネルにおいてしまうと、描画された際にオブジェクトがサイドパネルからはみ出てしまうのでMaskを設定してしまいます。

Right、LeftそれぞれにRect Mask 2Dコンポーネントを追加します。
![image](https://qiita-image-store.s3.amazonaws.com/0/47146/41170f62-b79f-5fdc-3b9f-bf6c2f54c57f.png)



## 7. Left,RightパネルにそれぞれUIを配置する

ここまでで設定はできたので後はLeftとRightパネルの下にそれぞれ必要なUI要素を配置すれば完成です。

![image](https://qiita-image-store.s3.amazonaws.com/0/47146/9ebb9602-3164-40da-d2b1-a74abd9718e8.png)

# 最後に

画面のアスペクト比が固定の場合でしかこの方法は試してないのでアスペクト比が可変の場合は上手く行かない可能性があります。

# おまけ

Layout Elementのパラメータを動的に変更することで収納・展開アニメーションが作れます。

![move.gif](https://qiita-image-store.s3.amazonaws.com/0/47146/6e92b17f-05c9-1bf5-77a7-afa6ddf2eb3f.gif)
MySQL5.7が起動できない。



MySQLをクリーンインストールしてローカル環境でMySQL立ち上げようと思ったら、いきなり以下のエラーが出てちょっと詰まったのでメモ。

##エラー内容
```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
```

前にもこんなんあったなーと思い、とりあえず該当箇所に行くとmysql.sockがなかったので、以下のコマンドで作成。

```
$ sudo touch /var/lib/mysql/mysql.sock
```

これでMySQL再起動

```
$ mysql.server start
```

でいけるかなーと思いきや

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (38)
```

2から38て。

/var/lib/mysqlディレクトリの権限が_mysqlになっていたので、権限を自分に。

```
$ sudo chown username /var/lib/mysql
```

再度MySQL再起動

```
$ mysql.server start
```

しかし、まだしつこく出てくる

```
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (38)
```

結構調べてこれでみんないけててなんやねんと思ってましたが、そんなときは素直にログを。いや始めから見ろって話ですね。
ログを見ると以下の文言が。

```
[ERROR] Unix socket lock file is empty /var/lib/mysql/mysql.sock.lock.
```

lockファイルがいるからかと思い、こいつらを削除（一応バックアップとりました。）

その後、

```
$ mysql.server start
```

SUCCESS!!!!!
きたーーーーー！

MySQL 5.7.5からはmysql.sock.lockというのを作るようになったそうですね。知らんかった。
参考: https://yoku0825.blogspot.jp/2015/05/mysql-575mysqlsocklock.html
デバッグとリリースでログ出力変える

最初のタイトルからあんまりパッとしないのもわかるのですが、多めにみてください。やりたいことわからないことが多すぎてとりあえず理解できたことからやる。そんな感じで進めています。
って無駄話はこの辺にしといて今回はタイトルの通りデバッグとリリースでログの出力を変えるです。:blush:

今回参考にさせていただいた記事です。

デバッグとリリースを切り替える(リリースとデバッグでログが出るか出ないかの確認のため)
http://qiita.com/nakamurau1@github/items/d12a63c4f06d1a70a53d

prefix.pchファイルの追加を行う(マクロの記述を一箇所にするために)
http://d.hatena.ne.jp/MoonMtLab/20141113/1415823778

DEBUGマクロを使う
http://d.hatena.ne.jp/k2_k_hei/20120511/1336750473

※この3つの記事はとてもわかりやすく感謝の気持ちが沢山でした。

では早速
:shamrock:prefix.pchを作成
New File →　ios →　other →　PCHFile →　Next →　ファイル名を <プロジェクト名>-Prefix.pch　→　create

:shamrock:prefix.pchファイルの中身を全てコメントアウト、以下記述
<pre>
<pre>#</pre>ifdef DEBUG
<pre>#</pre>define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
<pre>#</pre>else
<pre>#</pre>define DLog(...)
<pre>#</pre>endif
</pre>

:shamrock:ログをはかせたいところに以下記述
<pre>DLog(@"test!!!");</pre>

:shamrock:prefix.pchファイルを使えるようにする。
project → TARGETS → Build Settings → ALLとLevelsを選択してから検索部分でPrefixHeaderを検索します。 → Prefix Header出てきたらダブルクリック、空白の部分に<プロジェクト名>-Prefix.pchと記述 →　enter

:shamrock:ログを出してみる
普通にビルドする。

:shamrock:リリースの時にログが出ていないかの確認をする
<img width="333" alt="スクリーンショット 2017-04-23 14.58.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/e16e0a3c-6133-f99a-968a-c7a374bb0f07.png">

<img width="871" alt="スクリーンショット 2017-04-23 14.59.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/472704f3-5854-7575-db6a-5ab109503b9c.png">

Edit Scheme → Build configuration →　Release に変更してから再度ビルドする。ログはかれていなければ成功！！

:seedling:最後に
とりあえず実行できるように記事を書かさせていただきました。マクロで使える種類など、書き方など紹介してあるURLのところなどみるととても丁寧に書いてくださっているので詳しくはそちらをみていただけると色々納得できると思います。よろしくお願いします。

わからないことが多すぎますが、なるべく早くわかるようになれるようにコツコツやっていきたいと思います！！:hatching_chick:
Visual Studio 2017 > App.g.csの場所 @ ソリューションエクスプローラ

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community (以下VS2017)
Sublime Text 2
```

@ WPF 4.5入門 by 大田一希さん
No.540 / 9985

`App.g.cs`というファイルをソリューションエクスプローラで表示している。

表示している場所が

- HellowWorld
- Properites
- 参照設定
- bin
- obj
   - Debug
       - TempPE
       - App.g.cs

上記はVS2012, 2013をベースに記載されている。

VS2017では上記の場所には見当たらない。

「フォルダービュー」に変更した上で、以下の場所に見つかった。
![work.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c391a781-d1a2-2fb3-d1db-d97743efde14.png)
入門者のlinux

# "入門者のlinux"を読んだ. 

>
入門者のＬｉｎｕｘ　素朴な疑問を解消しながら学ぶ (ブルーバックス) 
奈佐原顕郎 
固定リンク: http://amzn.asia/gci3tnR
特設サイト: http://bluebacks.kodansha.co.jp/special/linux

これまでなんとなくraspiとかcentos, ubuntuを触ってきたけど, 知らないことが多くあるのでこちらを. 
本書に書いてある内容は本当に入門で, どれも簡単なものばかり. しかし, 私にとっては知らないことが多くあったので勉強になった. 
なにより恐ろしく丁寧. 
私は数日に分けて読んでしまったが, 真面目な人なら1日で読めると思う. 

# メモ

ひまわりの衛星写真
http://www.cr.chiba-u.jp/databases/GEO/H8_9/FD/index_jp.html
ftp://hmwr829gr.cr.chiba-u.ac.jp/gridded/FD/latest/201704/TIR/

Yosemiteのwebcam
https://www.nps.gov/yose/learn/photosmultimedia/webcams.htm

# 気になったcommands

## text mining

### 英文
speech: リンカーンのスピーチ
`cat speech | sed 's/[,|.|:|;|"| ]/\n/g' | tr A-Z a-z | sort | uniq -c | sort -n -r`

### 和文
wagahai: 吾輩は猫である
`cat wagahai | nkf -e | mecab | nkf -w | grep 名詞 | sort | uniq -c | sort -n`

# ひまわり衛星写真をダウンロードしてにビデオ作成
## 準備
### ダウンロード
`wget ftp://hmwr829gr.cr.chiba-u.ac.jp/gridded/FD/latest/201704/TIR/2017042[0-1]*.tir.09.fld.geoss.png`

### imagemagickのconvert
resize
`convert 201704211540.tir.09.fld.geoss.png -resize 1000x1100! resize.jpg`

crop
`convert -crop 400x400+250+0 resize.jpg crop.jpg`

resize > crop
`convert 201704211540.tir.09.fld.geoss.png -resize 1000x1100! resize.jpg | convert -crop 400x400+250+0 resize.jpg crop.jpg`

## 全部一気にconvert
`ls 2*png | awk '{printf "convert %s -resize 1000x1100! resize.jpg | convert -crop 400x400+250+0 resize.jpg crop%0.5d.jpg\n",$1,NR}' | sh`

## jpg達のvideo化
`avconv -r 24 -i crop%05d.jpg -r 24 -vcodec libx264 himawari20170422crop.mp4`

## result
https://youtu.be/Oy8Uve8B7fY

# Yosemiteのwebcamを自動的にダウンロードしてvideo化
## 準備
ダウンロード
`wget https://pixelcaster.com/yosemite/webcams/turtleback.jpg`

curlなら
`curl -O https://pixelcaster.com/yosemite/webcams/turtleback.jpg`
ですかね

dateでrename
```mv turtleback.jpg `date -r turtleback.jpg +%Y%m%d_%H%M%S_ElCapitan.jpg` ```

## 実施
### 処理をまとめたbashを作成 
```webcamget.sh
#!/bin/sh
cd /home/pi/linux_test/webcam
wget https://pixelcaster.com/yosemite/webcams/turtleback.jpg
mv turtleback.jpg `date -r turtleback.jpg +%Y%m%d_%H%M%S_ElCapitan.jpg`
sleep 30
wget https://pixelcaster.com/yosemite/webcams/turtleback.jpg
mv turtleback.jpg `date -r turtleback.jpg +%Y%m%d_%H%M%S_ElCapitan.jpg`
```

### 実行権限を与える
`chmod +x webcamget.sh`

### crontabで自動実行
開く
`crontab -e`

code
```crontabの最後の行に追加
* * * * * /home/pi/linux_test/webcam/webcamget.sh
```

### video化
撮影後は上記と同様にvideo化する. 
このときはconvertで欠番(01531.jpg)がなぜか出てしまったため, avconvでerrorが出た. 
しょうがないので, `cp 01530.jpg 01531.jpg` して対応した. 

## result
https://youtu.be/NRv6JSM_sBE
Visual Studio / WPF > link > イベントの種類 > バブル / トンネル / 直接

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

WPFのイベントのリストを見ているとPreviewXXXというイベントが見つかる。
http://blog.okazuki.jp/entry/2014/08/22/211021
> WPFでは、バブルイベントの他にトンネルイベントという形のイベントも提供しています。一般的にPreviewという命名規則で始まるイベントがそれになります。

イベントの種類としては上記のリンク先に以下の紹介がある。

- バブルイベント
- トンネルイベント

同じ人?の[別のBlog](http://blogs.wankuma.com/kazuki/archive/2008/02/24/124598.aspx)
には以下の記載がある。

>バブル：イベント発生元から親へ親へ上がっていく。
トンネル：要素ツリーのルートから子へ下がっていく。
直接：普通のCLRのイベントと同じく発生もとの人のみ。
Rails consoleメモ

#Rails console

##Rails consoleとは？

- rails console(コンソール)とは、rails の環境を読み込んだ状態でrubyコードを実行できるツール。
- Railsコンソールはirb (IRB: Interactive RuBy) を拡張して作られているため、
Rubyの機能をすべて使うことができる。
- rails アプリケーション内で定義したメソッドや読み込んでいる gem も実行することができる。


##Rails　consoleの起動

ターミナルでrails アプリケーションがあるフォルダ（ディレクトリ）に移動したあとに以下のコマンドを打ち込む

```
$ rails console
```

終了させたい時は以下を打ち込む

```
$ exit
```
JavaScriptの定数(const)は「変更できない」わけではない。

*実行環境*
*・OS：Windows*
*・ブラウザ：Google Chrome*

##JavaScriptの定数(const)は「変更できない」わけではない。

*const* 宣言は格納された値に読み取り専用の参照を作りますが、JavaScriptの定数(*const*)は**再代入できない**だけで必ずしも**変更できない**わけではありません。

変数の正体とはアドレスです。
定数が制限するのはアドレス変更、つまり再代入です。
参照型ではアドレス変更をせずに値を変更できるため、定数でも値の変更ができます。

##格納された値が基本型の場合

```JavaScript:JavaScript
const maxNum = 1234;
maxNum = 1000;  // エラー
```

*maxNum*に値を再び代入できないためエラーとなります。


##格納された値が参照型の場合

```JavaScript:JavaScript
const arr = ['A', 'B', 'C'];
arr = ['あ', 'い', 'う'];  // エラー
arr[1] = 'い';  // ←---???
```


*const*は**再代入できない**ため配列*arr*に配列を再代入しようとするとエラーとなります。
しかし *arr[1] = 'い'* はエラーとはなりません。
参照型*(Array, Objectなど)*では、値を格納している参照値を変更せず格納された値を変更できます。
例では参照値はそのままに、その中身だけ書き換えています。

```JavaScript
console.log(arr);  // (3) ["A", "い", "C"]
```

これがJavaScriptの**定数が再代入できないだけで変更できないわけではない**と言われる理由です。
Raspberry Pi用docker-distributionの構築

# Raspberry Pi用docker-distributionの構築
## 1. ラズパイ用のdocker-distribution
　Raspberry Pi3でもdockerを使用することができるのですが、docker-distributionはありません。同様にdocker-composeもないので、これについては別記事を書いています。

[Rasuperry Pi用docker-composeの構築](http://qiita.com/tkyonezu/items/ceaaf41924df39254058)

　 [docker-compose](https://github.com/docker/compose)の場合は、公式リポジトリにあるDockerfile.armhfを利用したのですが、docker-distribution用のものが存在していないので自分で書いてみました。
## 2. Dockerfile.armhfの作成
　Raspberry Pi3用のDockerfileをDockerfile.armhfとして書いたものが以下になります。

```Dockerfile
FROM armhf/debian:jessie

ENV GOROOT /usr/local/go
ENV GOPATH $GOROOT/bin

ENV DISTRIBUTION_DIR $GOROOT/src/github.com/docker/distribution
ENV DOCKER_BUILDTAGS include_oss include_gcs

RUN apt update && apt upgrade -y && \
    apt install -y make git curl

RUN cd /var/tmp; \
    curl -O https://storage.googleapis.com/golang/go1.8.1.linux-armv6l.tar.gz; \
    tar -C /usr/local -xzf go1.8.1.linux-armv6l.tar.gz; \
    rm go1.8.1.linux-armv6l.tar.gz

ENV PATH $PATH:$GOPATH

RUN mkdir -p $GOROOT/src/github.com/opencontainers; \
    cd $GOROOT/src/github.com/opencontainers; \
    git clone https://github.com/opencontainers/go-digest

WORKDIR $DISTRIBUTION_DIR
COPY . $DISTRIBUTION_DIR
COPY cmd/registry/config-dev.yml /etc/docker/registry/config.yml

RUN make PREFIX=$GOROOT clean binaries

VOLUME ["/var/lib/registry"]
EXPOSE 5000
ENTRYPOINT ["registry"]
CMD ["serve", "/etc/docker/registry/config.yml"]
```

　このファイルは、公式リポジトリを[フォーク](https://github.com/tkyonezu/distribution)して`raspberrypi`ブランチとして置いてあります。一応、dockerにもプルリクエストあげてみたのですが、お作法が良くわかってないので、どうなりますことやら。

　内容としては、公式リポジトリにある`Dockerfile`をラズパイ用にしたものとなっています。ただし、`alpine`ではなく`docker-compose`の`Dockerfile.armhf`にあわせてベースイメージを`armhf/debian:jessie`として、`Go`も公式にあるLinux用の[インストール手順](https://golang.org/doc/install)で、現在の最新版である`go1.8.1`を[ダウンロード](https://golang.org/dl/)しています。

## 3. rpi-docker-registryのビルド

　以下のようにしてラズパイでビルドします。どこかにdocker-distributionをクローンして、上記の`Dockerfile.armhf`がある前提です。

```bash
docker built -t rpi-docker-registry -f Dockerfile.armhf .
```

　やはり、ラズパイ用としてタグには`rpi-`をつけています。これでコンテナが作成されますが、ビルドの所要時間は約30分ほどでした。

## 4. rpi-docker-registryの起動

　`Dockerfile`にも書かれているように 5000/tcpを Exposeして、`/var/lib/registry` をよしなにマウントして起動します。

```bash
docker run -d -p 5000:5000 --name docker-registry -v /var/lib/registry:/var/lib/registry rpi-docker-registry
```

　あと、サーバ運用するために`docker run`の`--always`を使用するなり、`systemd`対応するなどはよしなに。

　公式で`registry`が`distribution`に変わってきたりしていることもあり、名前がちぐはぐですが...

　それにしても、ラズパイでdocker-distributionを使用する需要はあるんだろうか（笑
継承の階層について(初心者)

#継承の階層について(初心者)

##目的

モデルクラスやコントローラーがどのような形で基本クラスを継承しているのかまとめておきたいと思ったから

###モデルクラスの継承

ActiveRecord::Baseという基本クラスを継承することによって、作成したモデルオブジェクトは
データベースにアクセスできるようになり、データベースのカラムをあたかもRubyの属性のように扱えるようになる。

![スクリーンショット 2017-04-23 14.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/174860/e03db0b0-b875-7f1a-0f50-f4cbe6e322d2.png)


###コントローラの継承

コントローラの継承構造も、モデルの継承構造と本質的には同じ。
このクラスは、RailsのAction Packというライブラリが提供しているコントローラの基本クラス。

![スクリーンショット 2017-04-23 14.15.23.png](https://qiita-image-store.s3.amazonaws.com/0/174860/bf69cf4c-83c8-3dbd-4284-5db103f1b405.png)
ターミナル学習まとめ【第2弾】

#ターミナル学習メモ

##1.指定のファイルを編集

vi ファイル名 
→編集画面に切り替わる
※javacommonsさんに感謝。

##1.1 編集終了(はじめにescキーを押してから下記のコマンド入力)

| 操作内容       |       コマンド |   
|:-----------------|------------------:|
| 内容を破棄して終了   | :q! | 
| 保存して終了       |            {:wq!} or {ZZ} or {:x} |  
| viを終了      |            :q  |  

ターミナルで編集から保存までできるようになりました。
これでhtmlやcssやjsもかけるんですかね。それともテキストエディタにターミナルで作成した文書を貼り付けるのでしょうか。

みなさんが知ってるコアなコマンドがあったら是非教えてください。
特定のプロトコルに準拠し、特定のクラスを継承しているクラスを返す


```swift

class Hoge: PiyoObject, FooProtocol {}
class Fuga: PiyoObject, FooProtocol {}
```

PiyoObjectクラスを継承しつつ、FooProtocolに準拠している２つのクラスがある。
これを両方返すfactory methodを作りたい。

```swift
func makePiyoFoo<T: PiyoObject>() -> T where T: FooProtocol { 
 switch self {
   case .hoge: return Hoge() as T
   case .fuga: return Fuga() as T     
 }
}
```

Tで一回型のジェネリクスを取りつつ返り値でプロトコル準拠を保証すればOK
Visual Studio / WPF > DataGrid > データ行の削除を禁止する > CanUserDeleteRowsをfalseに

```txt:動作環境
Windows 7 Pro (32bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

WPFのDataGrid ではデフォルトではDelキーにてデータ行を削除することができる。

~~ユーザによるデータ行削除を禁止するには`AllowUserToDeleteRows`を設定するようだ。
参考: http://dobon.net/vb/dotnet/datagridview/allowdeleterow.html~~

~~`AllowUserToDeleteRows`をXAMLにてfalseに設定できないか調べたが、
https://msdn.microsoft.com/nl-nl/library/azure/system.windows.forms.datagridview.allowusertodeleterows(v=vs.85)~~
> XAML
> Not applicable.

~~という記載がある。CS(C# script)側で設定することになりそう。~~

AllowUserToDeleteRowsはDataGridViewのプロパティであるが、WPFのDataGridにはこのプロパティはない。CanUserDeleteRowsというプロパティを使うようだ。
https://msdn.microsoft.com/ja-jp/library/system.windows.controls.datagrid_properties(v=vs.110).aspx

以下のようにすることで、行削除を禁止できた。

```MainWindow.xaml.cs
dataGridView1.CanUserDeleteRows = false;
```

XAMLでも設定可能。

```xml:XAML
       <DataGrid x:Name="dataGridView1" HorizontalAlignment="Left"
                  CanUserDeleteRows ="False"
                  Height="211" Margin="10,10,0,0" VerticalAlignment="Top" Width="497">
 
```
メモ: Route 53 で Privacy Protection がなかなか有効にならないときには、ドメインのロックを有効にして Don't hide にしてから hide にするといいよ

[Amazon Route 53で汎用JPドメインを申請してみた
](http://qiita.com/maru3/items/0801755aec6c01e20e78#whois%E3%81%AB%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%82%8B%E6%83%85%E5%A0%B1)

の方法を参考にしつつ、自分も Privacy Protection を有効化しました。

とても些細なハマりどころなのですが、
 1 日ほど待っても WHOIS 情報が自分の住所のまま、ということがありました。

ワークアラウンドで解決したのでやり方を書いておきます。

# 1. Privacy Protection を有効化するにはドメインのロックが必要

> 連絡先情報を非表示にできるのは、移管できないようにドメインがロックされている場合のみです。ドメインを Amazon Route 53 に移管する場合または から移管する場合は、WHOIS クエリでお客様の連絡先情報が表示されるように、プライバシー保護を無効にする必要があります。移管が完了したらプライバシー保護を再度有効にすることができます。

http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/domain-privacy-protection.html

わすれがちです。ドメインのロックを有効にしましょう。

Registered Domains > ドメインを選択 > Transfer lock で (enable) をクリックすると有効になります。

# 2. ドメインのロックと Privacy Protection を有効にする順番

ここが私の躓きのポイントでした。

ドメインのロックを有効化しても、その前に既に Privacy Protection が有効化されている状態だと、自動的に WHOIS 情報は更新されることはないようです。

一度 Privacy Protection を無効にしてから有効にすることで強制的に更新する、というワークアラウンドが必要になります。

つまり

1. ドメインのロックを有効化
2. Privacy Protection を無効化 (Edit contacts からラジオボタンを Don't hide contact information と選んで Save)
3. (無効化処理が完了するまで数十秒ほど待つ)
4. Privacy Protection を有効化 (Edit concats からラジオボタンを Hide contact information if ... と選んで Save)

という手順になります。

ここに気が付かないと「おかしいな、ちゃんと有効化にしてるのにな〜、すぐには反映されないのかな〜」と何度も Edit contacts したり、何時間か反映を待ってみたり、無駄な時間を過ごす羽目になります……。
【Splunk】1つのイベントで複数の時刻情報を持つ場合の時間差分取得方法

以前Splunkを使っていて困ったことがあったので、備忘投稿。

SplunkはHTTPアクセスログなどの1データに1つの時刻情報を持つデータを分析することには長けていますが、
処理の開始時刻と終了時刻が1つのデータにまとまった場合はちょっと工夫する必要があります。

ちょっと具体的にしますと、次のようなデータの場合は結構簡単に時間差分を出すことができます。

```
処理ID, 時刻, 処理内容
1001, 2017/04/01 12:00:00, 開始
1002, 2017/04/01 13:00:00, 開始
1002, 2017/04/02 10:00:00, 終了
1003, 2017/04/02 11:00:00, 開始
1001, 2017/04/02 13:00:00, 終了
1003, 2017/04/03 15:00:00, 終了
```
こんな感じのデータを「sample_data_1」というインデックスでSplunkに放り込んで、
次のようなサーチ文で処理することで、処理ID毎の時間を出力することができます。
※ 「duration」は秒(sec)表示なので、3600で割って時間(hour)表示にしときます

```
index="sample_data_1"
| transaction 処理ID
| eval dhour=duration/3600
| table 処理ID, dhour
```
ですが、冒頭で触れたような次のデータだとこの手法が使えません。(インデックスを「sample_data_2」とします)

```
処理ID, 開始時刻, 終了時刻
1001, 2017/04/01 12:00:00, 2017/04/02 13:00:00
1002, 2017/04/01 13:00:00, 2017/04/02 10:00:00
1003, 2017/04/02 11:00:00, 2017/04/03 15:00:00
```
durationはtransactionでまとめた２つ以上のイベントの差分時間を抽出したものであるため、
上記データでそれをやると「0」時間が抽出されます。(そもそもイベントが１つで差分を出せないため)

そんなときは次みたいにやるとうまいこと差分時間を出すことができます。
※ 「開始時刻」「終了時刻」とフォーマットで記号（「'」と「"」）が違うので注意

```
index="sample_data_2"
| eval _time=strptime('開始時刻', "%Y/%m/%d %H:%M:%S"), t_data="start"
| append [ search index="sample_data_2"
| eval _time=strptime('終了時刻', "%Y/%m/%d %H:%M:%S"), t_data="end"]
| transaction 処理ID
| eval dhour=duration/3600
| table 処理ID, dhour
```
何をやってるかというと、１つのイベントの中の時刻情報ごとに「_time」を再定義し、
１つのイベントを複数のイベントに分割してます。
これによりtransactionでイベント間の時間差分を抽出することができます。

Splunkはメジャーなデータ書式には予め対応していますが、
ローカルなデータになると利用者側で色々と定義する必要があります。
そんなときはサーチリファレンスとかSplunk Answerとかで調べてみるといいと思います。
#MVCの挙動~RESTアーキテクチャについて(初心者)

#MVCの挙動~RESTアーキテクチャについて(初心者)

##目的
RAILSチュートリアルの勉強をしていてMVCの挙動〜RESTアーキテクチャについてまとめておきたいと思ったから

##MVCの挙動
![スクリーンショット 2017-04-23 13.35.32.png](https://qiita-image-store.s3.amazonaws.com/0/174860/40204cd6-ac1b-4b81-a184-2a0cd218cb99.png)



前提：scaffoldでUsersリソースのコードを生成

1. ブラウザから「/users」というURLのリクエストをRailsサーバーに送信する。
2. 「/users」リクエストは、Railsのルーティング機構 (ルーター) によってUsersコントローラ内のindexアクションに割り当てられる。
3. indexアクションが実行され、そこからUserモデルに、「すべてのユーザーを取り出せ」(User.all)と問い合わせる。
4. Userモデルは問い合わせを受け、すべてのユーザーをデータベースから取り出す。
5. データベースから取り出したユーザーの一覧をUserモデルからコントローラに返す。
6. Usersコントローラは、ユーザーの一覧を@users変数 (@はRubyのインスタンス変数を表す) に保存し、indexビューに渡す。
7. indexビューが起動し、ERB (Embedded RuBy: ビューのHTMLに埋め込まれているRubyコード) を実行して HTMLを生成 (レンダリング) する。
8. コントローラは、ビューで生成されたHTMLを受け取り、ブラウザに返す

**詳細メモ**
最初にブラウザからのリクエストを確認。
このリクエストは、アドレスバーにURLを入力したりリンクをクリックした時に発生。
リクエストはRailsルーティングに到達し (②)、ここでURLに基づいて適切なコントローラのアクションに割り当てられる (ディスパッチ)。ユーザーからリクエストされたURLをUsersリソースで使用するコントローラのアクションに割り当てる (マッピングする) コードは、routes.rbに記載。 (マッピングするコードはRailsのルーティング設定ファイル (config/routes.rb) に書く)Railsではconfig/routes.rbで、URLとアクションの組み合わせ を効率よく設定していく。

##RESTアーキテクチャについて

**REST** : REpresentational State Transfer

Usersリソースが提供するRESTfulなルート

|HTTPリクエスト   |URL|アクション|用途|
|:----------------|:----|:------|:-------------------|
|GET	|/users	|index	|すべてのユーザーを一覧するページ|
|GET	|/users/1|	show|	id=1のユーザーを表示するページ
|GET	|/usersnew|	new|	新規ユーザーを作成するページ
|POST	|/users |create|	ユーザーを作成するアクション
|GET	|/users/1/edit|	edit|	id=1のユーザーを編集するページ
|PATCH	|/users/1|	update|	id=1のユーザーを更新するアクション
|DELETE	|/users/1|	destroy|	id=1のユーザーを削除するアクション



REpresentational State Transferの略。 RESTは、インターネットそのものやWebアプリケーションなどの、分散・ネットワーク化されたシステムやアプリケーションを構築するためのアーキテクチャのスタイルの1つ。
RailsアプリケーションにおけるRESTとは、アプリケーションを構成するコンポーネントを「リソース」としてモデル化することを指す。 これらのリソースは、リレーショナルデータベースの作成/取得/更新/削除 (Create/Read/Update/Delete: CRUD) 操作と、4つの基本的なHTTP requestメソッド (POST/GET/PATCH/DELETE) の両方に対応している。

Rails開発者にとっては、RESTfulなスタイルを採用することで、作成すべきコントローラやアクションの決定が楽になる。
作成(C)・取得(R)・更新(U)・削除(D)を行うリソースだけでアプリケーション全体を構成することも可。
blogdownで数式がうまく表示されない場合の対処

多分，今後つまづくパターンがありえると判断したのでここでメモ。

### blogdownとは

省略します。blogdownが何かという説明については以下の資料を参照してください:

- http://qiita.com/masato_t/items/7bbfa74f8de0dc06c91c
- http://blog.hoxo-m.com/2017/03/29/hello-world/
- https://kazutan.github.io/blog/2017/04/blogdown-tips/

### きっかけ

先日，blogdownで生成する記事内にtex形式の数式を入れようとしたところ，うまく表示されませんでした。まだCDN閉鎖までは時間があるはずなのになんでだろうと思い，ちょっと調べてみることにしました。rmarkdownとmathjaxのCDN閉鎖に関しては，以下の資料を参照してください:

https://kazutan.github.io/blog/2017/04/mathjax-cdn-rmd/

### 原因と対応

要するに，mathjaxを読み込んでなかったということが原因でした。自分のブログで生成された記事をチェックしたところ，確かにmathjaxを読み込むscriptがありません。

このレベルなら，さすがに誰か何か言及しているだろうと探したところ，以下のissueが引っかかりました:

https://github.com/rstudio/blogdown/issues/36

最後にYihui氏が言及していますが，対応がちょっと厄介です。私の解釈ではこんな感じです:

- 各記事にmathjaxを読みこませる(埋め込む)必要がある
- これをやるならfooter.htmlあたりに差し込んでいくのがベターかも
- ただし，これは設定しているテーマの範疇でblogdownとしてはちょっとやりにくい
- blogdownのデフォルトテーマには対応するよう埋め込んでるんだけどね…

というわけで，**テーマを自分で設定していたり自作していたりすると，うまく出てこない場合がある**，ようです。そこでHugoの公式ドキュメントを調べたら，以下の記事がヒットしました:

[Hugo - MathJax Support](https://gohugo.io/tutorials/mathjax/)

ここに書いてありますように，`layout/partials`ディレクトリ内で，毎度利用するようなもの(`footer.html`あたりがおすすめ)に，まずはmathjaxを読み込むようなスクリプトを記述すればとりあえず動きます。ただHugoのドキュメントではもうすぐ廃止になるCDNへのurlが記入してあるので，そこを差し替えます:

```html
<script type="text/javascript"
  src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
```

私の場合，それほど複雑な数式ではなかったので，これで動きました。ただテーマによってはうまく動かない場合も考えられます。その場合は先程のHugoドキュメントや，issueであがっていたような対応が必要になるかも知れません。その際はコメントいただけると助かります。

**Enjoy!**
Python でコールバック形式の非同期APIを async/await に変換する

# 概要
Python 3.5 から非同期プログラミングに async/await が使えるようになっています。
しかし、既存のライブラリは従来のコールバック型の非同期APIを持っているものが多く、そのままでは async/await を適用できません。そこで、そのようなコールバック型のAPIを async/await で使える形に変換します。

# コールバック型の非同期APIの例

別のスレッド上で引数 a と 引数 b を加算し、結果をコールバックで返す
下記の async_add メソッドを考えます。

~~~ python3
import time
import threading

def async_add(a, b, callback):
    def run():
        time.sleep(1)
        callback(a + b)
    thread = threading.Thread(target=run)
    thread.start()
~~~

これを使用して 1 + 2 + 3 の計算を行ってみましょう。次のようになります。

~~~ python3
async_add(1, 2, lambda result1: \
        async_add(result1, 3, lambda result2: \
                print(result2)))
~~~

コールバックが入れ子になっていて複雑ですね。これをラップし、await を使って以下のようなイメージで書けるようにしたいと思います。

~~~ python3
result1 = await awaitable_async_add(1, 2)
result2 = await awaitable_async_add(result1, 3)
print(result2)
~~~

# 実装

コード

~~~ python3
import time
import threading
import asyncio

def async_add(a, b, callback):
    def run():
        time.sleep(1)
        callback(a + b)
    thread = threading.Thread(target=run)
    thread.start()

def awaitable_async_add(a, b, loop):
    f = asyncio.Future() # (1)
    def callback(result):
        loop.call_soon_threadsafe(
                lambda: f.set_result(result)) #(2)
    async_add(a, b, callback) # (1)
    return f # (1)

async def exec(loop):
    result1 = await awaitable_async_add(1, 2, loop)
    result2 = await awaitable_async_add(result1, 3, loop)
    print(result2)

loop = asyncio.get_event_loop() # (3)
loop.run_until_complete(exec(loop)) # (3)
loop.stop()
~~~

実行結果

~~~
6
~~~

# 解説

(1) awaitable_async_add メソッドが呼び出されると、async_add メソッドの実行を開始し、即座に asyncio.Future オブジェクトを返します。この時点で計算処理はまだ完了していません。

(2) 計算処理が完了するとコールバックが呼び出されます。処理結果を引数として asyncio.Future オブジェクトの set_result() メソッドを呼び出すことで、asyncio.Future オブジェクトに処理の完了を通知するとともに、計算結果を返します。

(3) イベントループを取得し、非同期処理が完了するまで処理を実行します。

ここで注意が必要なのが (2) の loop.call_soon_threadsafe です。試しに下記のように直接 f.set_result を呼び出してみると、エラーが発生します。

~~~ python
    def callback(result):
        f.set_result(result)
~~~

実行結果

~~~
RuntimeError: Non-thread-safe operation invoked on an event loop other than the current one
~~~

このエラーは set_result メソッドが (3) で実行しているイベントループとは別のスレッド上で呼び出されていることが原因です。asyncio.Future はスレッドセーフではないため、set_result メソッドは必ずイベントループと同じスレッドで呼び出す必要があります。そこで、イベントループの call_soon_threadsafe メソッドにコールバックとして処理を渡すことによって、イベントループ内で set_result を呼び出させています。

# 参考

https://docs.python.org/3.6/library/asyncio.html
WebAssembly環境構築 on macOS

WebAssemblyの開発環境をmacOS上に構築し、作成したバイナリをブラウザ上で動かしてみました。基本的に公式サイトのドキュメント「[Getting Started](http://webassembly.org/getting-started/developers-guide/)」の通りです。

まずcmakeをインストールします。

```
$ brew install cmake
```

次にEmscripten SDKでEmscriptenをソースコードからビルドします。

```
$ git clone https://github.com/juj/emsdk.git
$ cd emsdk
$ ./emsdk install sdk-incoming-64bit binaryen-master-64bit
$ ./emsdk activate sdk-incoming-64bit binaryen-master-64bit
```

installはすごい時間がかかります。私の手元では2時間近くかかりました。コマンドだけ打ってランチにでも行きましょう。

最後に下記コマンドで環境変数やその他の設定を行います。今後も常用するのであれば.bashrcなどに追記しましょう。

```
$ source ./emsdk_env.sh
```

# Hello world

では、次にHello worldしてみましょう。

```
$ mkdir /tmp/hello
$ cd /tmp/hello
$ vi hello.c
$ emcc hello.c -s WASM=1 -o hello.html
```

`hello.c`の内容は次の通りです。

```c:hello.c
#include <stdio.h>

int main(int argc, char ** argv) {
    printf("Hello, world!");
}
```

コンパイルすると、`hello.html`、`hello.js`、`hello.wasm`の3ファイルが作られます。この3ファイルを同じディレクトリに配置すればCプログラムがブラウザ上で動くというわけです。

生成されたHTMLは現状ChromeかFirefoxで確認できます。同じものをGitHub Pagesにアップロードしておきました。

- https://hnw.github.io/hello-wasm/hello.html

# iconv(3)を使ってみる

もう少し難しいCプログラムも動かしてみましょう。Emscriptenはasm.jsおよびWebAssembly環境むけのlibcとしてmuslを採用しているようです。muslでは`iconv(3)`を提供しているようなので、これを使って文字コード変換をしてみましょう。

stdinから入力を受け取り、UTF-8を1文字ずつUTF-32に変換してコードポイントを表示する、というプログラムを書いてみました。

- https://hnw.github.io/hello-wasm/iconv.html

入力ダイアログが複数回出てくるので、1回目は適当に入力して2回目はキャンセルを押してみてください。「 🍺 」などを入力しても正しく動くのが意外でした。

# 感想など

現状だとasm.jsと大差ない気もしますが、全ブラウザで高速に動くというのは夢がありますよね。SafariとEdgeで動くのはいつになるんでしょうか。楽しみに待ちましょう。
True/Falseを含むデータフレームをcsv形式でPythonからRへと引き渡す (pd.DataFrame -> tbl_df)

大したことではないですが，pandas.DataFrameをcsvで保存してRのreadr::tbl_dfで読もうとしたらハマったので回避策をメモ．

小中規模のデータフレームを扱う場合，Pythonではpandas，Rではdata.frame系を使うことが一般的だと思います．

また，Python <=> R間でのデータフレームの受け渡しは，SQLを仲介する場合もあるでしょうが，楽にやるならcsvがベターだと思います．

## csvによる受け渡しの問題点

ところがboolを含むpandas.DataFrameをそのままcsvに吐くとread\_csvでlogicalとして読めないっぽいです．こんな感じ↓

```py3
from datetime import datetime
import pandas as pd

df = pd.DataFrame({
    'A': ('a1', 'a2', 'a3'),
    'B': (True, False, True),
    'C': (0, 1, 2),
    'D': [datetime.now()] * 3
})

df.to_csv('sample.csv', index=False, encoding='utf-8')
```

```r
library(readr)

read_csv('sample.csv', col_types = 'cliT', locale = locale(encoding = 'UTF-8'))
```

![スクリーンショット 2017-04-23 11.39.05.png](https://qiita-image-store.s3.amazonaws.com/0/174322/037ce1b7-9644-b755-dcd6-b7c1873b368d.png)

エラーを見ると，T・FやTRUE・FALSE，0・1しかlogicalとして受け付けてくれないっぽいです．

## 回避策

```py3
# df.to_csv('sample.csv', index=False, encoding='utf-8')
(df * 1).to_csv('sample.csv', index=False, encoding='utf-8')
```

とすれば良いです．True/Falseを1/0にしてくれます．
文字列に対する\*は，「"hoge" \* 2」を「"hogehoge"」とするような処理ですから，今回のように「\* 1」しても何も変わりません．

![スクリーンショット 2017-04-23 11.44.25.png](https://qiita-image-store.s3.amazonaws.com/0/174322/1ae7691c-a853-a04a-980c-227519169aa1.png)

01であれば，read\_csvで読み込めます．

![スクリーンショット 2017-04-23 11.53.09.png](https://qiita-image-store.s3.amazonaws.com/0/174322/8e24ae19-73b2-48d5-f03c-30726711729c.png)

## 失敗例

ちなみに以下のような方法は失敗します．

```py3
df.astype(int)  # str等がある場合失敗する
```

```py3
df.replace({True: 1, False: 0})  # 何も起こらない
```

```py3
df.replace({True: "TRUE", False: "FALSE"})  # 1/0が全部文字列に (下図)
```

![スクリーンショット 2017-04-23 11.50.58.png](https://qiita-image-store.s3.amazonaws.com/0/174322/f825507d-13a4-fb6c-fe11-1dc42b0dc9a6.png)


(他に良い方法があれば教えてください)
C99のint32_t型などをprintfに渡す方法

C99からサイズ固定の整数型が定義できるようになったわけですが、そのあたりの整理。

# 前提

Cは伝統的に`int`や`long`が何バイトかの保証がありません[^1]。これらの整数型に対してはCPUアーキテクチャごとに最適なサイズが割り振られるので、Cプログラマはintが何バイトだろうと動くコードを書かねばなりません[^2]。

とはいえサイズを明示したいこともあるよね、ということでC99からサイズ固定の型が登場しました。

- int8_t
- int16_t
- int32_t
- int64_t
- uint8_t
- uint16_t
- uint32_t
- uint64_t

符号あり・符号なしの8,16,32,64bitの整数型が明示的に使えます。やりましたね！

これらの型は`<inttypes.h>`で定義されています。

# printfで使いたい

これらサイズ固定の整数型をprintfで使いたいときのために、適切な指示子に展開するマクロが存在します。

```c
#include <stdio.h>
#include <inttypes.h>

int main(void) {
    int32_t i = 32;
    printf("%"PRIx32"\n", i); // 20
    return 0;
}
```

普段なら`%x`と書くはずのところで、マクロ`PRIx32`を利用しています。このうち`x`の部分は普段の指示子と同様`d`（符号あり10進）、`X`および`x`（16進）、`o`（8進）、`u`（符号なし10進）が利用できます。最後の数字は整数型のサイズを指定します。

# 参考URL

* [C data types - Wikipedia](https://en.wikipedia.org/wiki/C_data_types)
* [C11ドラフト](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)(PDF)

[^1]: Cの仕様上、char <= short <= int <= long <= long longというサイズの関係が成り立つ必要があるのと、型ごとの最低サイズが決められている（char 8bit, short 16bit, int 16bit, long 32bit, long long 64bit）という2点の縛りはあります。

[^2]: 実際には対象アーキテクチャを絞って書かれるCソースコードの方が多いと思います、念のため
Goで3Dをサクッと試してみたら、サクッと粉砕されたよ。@Go合宿

ここ↓で発表したやつです：）
https://go-beginners.connpass.com/event/47481/

急ぎで作ったので、超雑ですが、ご勘弁を。。。

---

##自己紹介

- @afroscriptといいます。
- teratailのDevRelやってます
- 仕事としてプログラムを書いたことはないです
- Go入門ハンズオンとGo入門者LT大会の運営してます
- 運営にもかかわらず、合宿に4時間くらい遅刻したことあります
- おかげで、僕の席は後ろの端っこのほうで、しかも1人席でした
- GO暦
    - 2015年10月にハンズオン
    - 11月に入門LT大会で発表(←このときも粉砕されてます)
    - 1年半以上触ってなかったです、すみません

---

##今回はここを元に進めてみました。
http://blog.yucchiy.com/2015/11/10/hello-opengl-with-golang/

---

まずは必要なパッケージのインストール

```
$ go get github.com/go-gl/gl/v3.3-core/gl
$ go get github.com/go-gl/glfw/v3.1/glfw
$ go get strings
```
go-glは、GoでOpenGLを使うためのpackage。
詳しくは[元ネタ](http://blog.yucchiy.com/2015/11/10/hello-opengl-with-golang/)を見てください。

---

`go_3d/src/main`にmain.goを作成。

まずはウィンドウを立ち上げてみます

---
##方法
[元ネタ](http://blog.yucchiy.com/2015/11/10/hello-opengl-with-golang/)からコピー&ペースト＼(^o^)／

("strings"だけまだ使わないので、スコープアウトしました。)

```main.go

package main

import (
	"fmt"
	"runtime"
	//	"strings"

	"github.com/go-gl/gl/v3.3-core/gl"
	"github.com/go-gl/glfw/v3.1/glfw"
)

const windowWidth = 800
const windowHeight = 600

func init() {
	runtime.LockOSThread()
}

func main() {
	//init glfw
	if err := glfw.Init(); err != nil {
		panic(err)
	}

	defer glfw.Terminate()

	glfw.WindowHint(glfw.Resizable, glfw.False)
	glfw.WindowHint(glfw.ContextVersionMajor, 4)
	glfw.WindowHint(glfw.ContextVersionMinor, 1)
	glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile)
	glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True)

	// make an application window
	window, err := glfw.CreateWindow(windowWidth, windowHeight, "Hello", nil, nil)
	if err != nil {
		panic(err)
	}
	window.MakeContextCurrent()

	// init gl
	if err := gl.Init(); err != nil {
		panic(err)
	}
	fmt.Println("OpenGL version", gl.GoStr(gl.GetString(gl.VERSION)))

	gl.ClearColor(1.0, 1.0, 1.0, 1.0)
	for !window.ShouldClose() {
		gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
		window.SwapBuffers()
		glfw.PollEvents()
	}
}
```

---
##コードを追ってみて分かったこと

ここでWindowをCreateしてるんだ〜：）
```
window, err := glfw.CreateWindow(windowWidth, windowHeight, "Hello", nil, nil)
```

ここでデフォルトのWindowの色決めてるんだ〜：）

```
gl.ClearColor(1.0, 1.0, 1.0, 1.0)
```



---

##あとよく分かんない。／(^o^)＼

---

##図形を描画してみよう

---

#方法

[元ネタ](http://blog.yucchiy.com/2015/11/10/hello-opengl-with-golang/)からコピー&ペースト＼(^o^)／

---

##実行してみます

---

##図形ができた！！＼(^o^)／


---
##コードを追ってみて分かったこと

↓ここで頂点を決めてる。

```
	points := []float32{
		-0.5, -0.5,
		0.5, 0.5,
		0.5, -0.5,
		-0.5, 0.5,
	}
```

↓ここで描画する座標の順番決めてる。

```
	vertices := []uint32{
		0, 2, 1, 3,
	}
```

---
##あとは、OpenGL読めないと分からない＼(^o^)／
---
##まとめ

- Goで3Dは[go-gl](https://github.com/go-gl)からOpenGLを扱うことで実現可能
- ほぼほぼ書いてる内容はOpenGLと同じ感じ(推定)
- だからOpenGL勉強してないと無理だと悟った
- ありがとう、コピー&ペースト

---
##結論

---
##やっぱ3Dはthree.jsが楽！
KUSANAGIでプロビジョン済みのプロファイルをLet's EncryptでSSL化する

# はじめに
KUSANAGIで建てたサイトを、後からSSL化する場合のメモです。
以前はKUSANAGIではLet's Encryptに対応していませんでしたが、現在では標準で対応しています。KUSANAGIもLet's Encryptもとても便利ですね。

# 作業の前に
/etcを色々と変更するので、ロールバックできるようにGit化しておくと便利です。
/etcをGit(や他のVCS)で管理することに特化した etckeeper の利用がおすすめです。

サーバの/etcを自動的にgitとかにコミットプッシュしてくれるetckeeperを使う
http://qiita.com/yousan/items/91dfc187f8345d299068

etckeeperではなくともGit化して置くだけでも便利です。

```bash
$ cd /etc
$ sudo git init
$ sudo git add -A
$ sudo git commit -m 'first commit'
```

バックアップとアップデートも必要に応じて行っておきます。
特に kusanagi コマンドはアップデートでどんどん便利になってコマンドが追加されているので最新版を使います。

```bash
$ sudo yum update -y --skip-broken

...略
```



# 現在のプロファイルの確認
現在プロビジョンされているプロファイルを確認します。
`/etc/kusanagi.d/profile.conf`にphp.ini形式で保存されています。

```bash
$ sudo less /etc/kusanagi.d/profile.conf
[example.com]
PROFILE="example.com"
KUSANAGI_TYPE="WordPress"
KUSANAGI_FQDN="example.com"
KUSANAGI_DIR="/home/kusanagi/example.com"
KUSANAGI_DBNAME="kusanagi_wordpress"
KUSANAGI_DBUSER="kusanagi"
KUSANAGI_DBPASS="password"
WPLANG="ja"
OPT_WOO=""
````

# 配置し直してSSL化

現在のドキュメントルートなどを一旦退避してプロファイルを削除します。
ファイル、DBの削除が入るのでバックアップの確認などを必ずしてください。

```bash
$ cd ~kusanagi;
$ sudo mv exmaple.com example.com_
$ sudo kusanagi remove example.com
Remove example.com config files ? [y/n] y
Remove /home/kusanagi/example.com ? [y/n] n
Remove example.com database ? [y/n] n
Done.
```

Let's Encryptを有効にしつつプロビジョンします。

```bash
$ sudo kusanagi provision --WordPress \
 --wplang ja --fqdn example.com \
 --email user@example.com \
 --dbname kusanagi_wordpress --dbuser kusanagi --dbpass password \
 example.com
```


# nginxの転送設定

httpにつながれた場合にはhttpsへ転送するようにしておきます。

```conf:/etc/nginx/conf.d/example.com_ssl.conf
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;

... 後略 ...
}
```

nginxを再起動します。

```bash
$ sudo sh -c 'nginx -t && systemctl restart nginx.service || systemctl status nginx.service -l'
```
> CentOS7でnginxのコンフィグテスト、サービス再起動、エラーログ表示をワンライナーで
> http://qiita.com/yousan/items/10ef2b8c20f744b6eeb0

> nginx で http でのアクセスを https にリダイレクト
> http://qiita.com/kga/items/e30d668ec1ac5e30025b

リダイレクトされているか接続試験を行います。

```bash
$ curl -D - -s  -o /dev/null http://example.com | grep -e HTTP -e Location

HTTP/1.1 301 Moved Permanently
Location: https://example.com/
```

ステータスコードが301に、Locationがhttpsになっていれば良いです。

> cURLコマンドでレスポンスヘッダのみを取得する
> http://qiita.com/yousan/items/fcc15e1046939c465ab7

# ブラウザで確認
必ずブラウザで確認しましょう。

<img width="138" alt="Screen Shot 2017-04-23 at 11.10.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/f142da52-f831-7502-e6c6-f1e105a3e463.png">

よいSSLライフを！