OmniAICreator/Qiita-1.07M huggingface dataset:
Fastfileのafter_allにちゃんとif文書こうと思った

Fastfileの話、

```ruby:Fastfile
  after_all do
    reset_modified_files
  end
```

とかやっていると思います。

laneを増やしていく過程で、reset_modified_filesをしたくないlaneを追加したい時は

```ruby:Fastfile
  after_all do |lane|
    if lane.include?(:generate_task) do
    else
      reset_modified_files
    end
  end
```

とかしていくと思いますが、違和感があります。
というのも、after_allしたくないのにわざわざafter_allしないというのを記述しないといけないという点。

これはafter_allのデフォルトの挙動を`reset_modified_files`にしたことにあります。
なので、after_allを使いたいlaneがafter_allを記述するのが正しく本来after_allは

```ruby:Fastfile
  after_all do |lane|
    lanes_to_say_foo = [:test, :build, :other]
    if lanes_to_say_foo.include?(lane)
      reset_modified_files
    end
  end
```

のような感じで常にif文が存在するべきなのでは、と思った次第です。[^1]

[^1]: discordで突っ込んで頂いた気づきです
Windows(10 pro)でGitlabを運用したいのでDocker for Windowsで環境を作ってみたけど運用できなかった話

<a href="https://qiita.com/nomurasan/items/5197100a1ae3e5a30f4c">レベル０のDockerプレイヤーが可能な限りシンプルな状態から勉強したい時の話</a>という記事を書いたんですが、その続きみたいなものです。

# WindowsでもGitlabを運用出来た話

# 補足
今回から注釈記法に対応しました。
注釈数字のリンクをマウスオーバーで参照することを目的に書いているので、他の方とちょっと使い方が異なる事があります。[^1][^2]
[^1]: Qiitaの注釈記法について：凡例（何に対して？：対象の解説、注釈）という書き方をしています。この場合は（注釈記法について：私はこうやってつかってます）みたいな感じです。
[^2]: 【リンク有】Qiitaの注釈記法について・補足：http://blog.qiita.com/post/105484781374/qiita-markdown-supporting-footnotes

# Windows(10 pro)でGitlabを運用したいのでDocker for Windowsで環境を作ってみた。

ということで、google先生に色々聞いてみたんですが、よく分からんかったです。

**ここではVMだとかVagrantだとかVirtual Boxなどは使っていません。**
私がよく分からん事になるので、使用は避けました。
ただ、管理まで考える場合はあった方がいいらしい、という事は何となく認識しているんですが…。
ちょっと理解が追い付いてない状態です。

# 本題

* Docker for Windows入れて、[^3]
* Docker for WindowsをGUIチックに操作できるようにKitematic入れて[^4]
* Gitlab CEを探して入れる[^5]

と、かなり簡単に入れられました。

[^3]: 【リンク有】<a href="http://docs.docker.jp/windows/step_one.html">Docker for Windows ダウンロードページ</a>が私にとっては分かりにくかったのですが、今後のためにちゃんと英語内容も読んでもらった方がいいと思ったのでここでは解説しません。
[^4]: Kitematic：インストールして再起動が完了したらアイコンを右クリック→Kitematicでダウンロードできる
[^5]: Gitlab CEのインストール：Kitematicの画面上からどうぞ

## 注意

Docker for Windowsを動かすところが一番のヤマだと思うので、Hyper-V使えるかどうかは確認しておいたほうがいいです。
例によって例のごとく、Bash on Ubuntu on Windowsに入れようとしたんですが、こっちはgitlabを入れる前段の環境構築で結構面倒くさい事になってしまった[^6]ため、いったん取りやめました。
→<a href="">やってみました。</a>
[^6]: 環境構築が面倒くさい：元々他でも使っている環境なので、変な競合を起こしてしまったらしく…原因はまだ分かっていません。

誤解を恐れずに言うと、私がやりたい用途という意味では、Docker for Windowsでも結局はBash on Ubuntu on Windowsと似たような事をやっているので、今回はあくまで「gitlabを運用したい！」という点だけに絞って話を進めさせていただきたい。

# やること
上にも書いてますが、本当に３ステップ。
途中でハマったのは、他の端末でもファイルを共有したかったので、ブラウザのダウンロード先をネットワークストラテジにしていたため、CドライブのProgram FilesにKitematicを置こうとしたら怒られたぐらい。
普通に使っていたらハマらないです、きっと。

# 構築完了

gitlabのインストールは結構時間が掛かるっぽいです。寝て起きた頃に終わったのでそこまでではないでしょう。

# 問題
多分環境自体は出来てると思うんですが、実際にgitlabを使おうとするとこれがうまくいかない。
gitlabの構築は完了していると思うんだけど、Container logを見ても何をすればいいのか分からない。
試しにexecからpower shellを開いてみるんだけど、何のログを見ればいいとか、恐らくgitlabの根本的な知識がないので調べようがない。
出来る状態にはなってると思うけど、今出来るか？というとちょっと疑問。
要調査ですね…。

# 参考
http://docs.docker.jp/windows/step_one.html

# 類似記事
<a href="https://qiita.com/nomurasan/items/a4291f5a18f3b6cc1525">Windows(10 pro)でGitlabを運用したいのでVagrant+VirtualBoxで環境を作って運用できた話</a>
【ココ】Windows(10 pro)でGitlabを運用したいのでDocker for Windowsで環境を作ってみたけど運用できなかった話
<a href="https://qiita.com/nomurasan/items/b725c9ee9179bcac2b22">Windows(10 pro)でGitlabを運用したいのでBash on Ubuntu on Windowsで環境を作ってみたけど運用できなかった話</a>

# 注釈
前進,後進消去過程,pivot選択諸々のコード

概要：

`Ax=b`を解く際の

1 `Gauss(1+2)`
2 前進消去過程`(Forward_sub)`
3 後進消去過程`(Backward_sub)`
4 `Pivot`(最大成分)を選ぶやつ(`Pivot`)
5 `Pivot`がm行目にあるとして,今いるk行目と行ごと交換するやつ,ベクトルb版(`swapVec`)
6 `Pivot`がm行目にあるとして,今いるk行目と行ごと交換するやつ,行列A版(`swapMat`)
7 `PivotGauss`


※Eclipseで自作したものをそのまま貼り付けました.mainの中にGaussが放り込んであります.間違ってるかも知れません.
※詳しい理論は載っていません.ググるか文献を参照してください.よろしくお願いします.

コード全部　↓↓↓↓↓↓↓

```Java
	public static void main(String[] args) {
		// Gauss消去(前進+後進)
			int N = c.length;
			//コピーする
			double [][]A = new double[N][N];
			double []b = new double[N];
			A = copyMat(a);
			b= copyVec(c);
			double [] d = Forward_sub(A,b);
			double[] x = Backward_sub(A,d);
			return x;
		}

		//前進消去過程
		public static double[] Forward_sub(double A[][] ,double b[]){
			int N = A.length;
			double alpha = 0.0;
			for(int k=0 ; k<N-1;k++){
				for(int i= k+1; i<N; i++){
					alpha = A[i][k] / A[k][k];
					for(int j=k+1;j<N;j++){
						A[i][j] = A[i][j] - alpha * A[k][j];
						A[i][k] = 0.0;
					}
					b[i] = b[i] - alpha * b[k];
				}
			}
			return b;
		}

		//後退代入過程
		public static double[] Backward_sub(double A[][],double y[]){
		int N = A.length;
		for(int k=N-1; k>=0;k--){
			for(int p=k+1; p<N; p++){
				y[k] =y[k] - A[k][p] * y[p];
			}
		y[k] = y[k] / A[k][k];
		}
		return y;
		}

		//k列目に対して絶対値最大値をpivotに選ぶ
		public static int Pivot(int k , double[][]A){
			int n = A.length;
			double [] a = new double[n];//空の配列
			double max =0.0;
			int pivot = k;
			for(int i=0;i<n;i++){//i行k列目の要素を配列に入れる([0][3],[1][3],[2][3],…)
				a[i]= A[i][k];
			}
			for(int j=k;j<n;j++){//配列の要素を順に見て最大値を見つける
				if(Math.abs(a[j])>Math.abs(max)){
					max=a[j];
					pivot=j;
				}
			}
			return pivot;
		}

		//ベクトルbのk行目とm行目を入れ替える
		public static double[] swapVec(double[] b0,int m,int k){
			double[]b = new double[b0.length];
			b = copyVec(b0);
			double temp = b[k];
			b[k] = b[m];
			b[m] = temp;
			return b;
		}

		//行列Aのk行目とm行目を入れ替える
		public static double[][] swapMat(double[][] A0,int m,int k){
			double[][]A = new double[A0.length][A0[0].length];
			A = copyMat(A0);
			double []temp = new double[A.length];
			for(int i=0;i<A.length;i++){
				temp[i] = A[k][i];
				A[k][i] = A[m][i];
				A[m][i] = temp[i];
			}
			return A;
		}

		//ピボット選択付きGauss消去
		public static double[] pivotGauss(double J[][] ,double[]f){
			int n = J.length;//ベクトル要素数
			double [][] J2 = new double[n][n];//pivot後のヤコビ行列
			double [] f2 = new double[n];//pivot後の右辺項
			double [] del = new double[n];
			for(int k=0;k<n-1;k++){
			int m =Calc.Pivot(k, J);//k列目に対して絶対値最大値をmに選ぶ
			J2 = Calc.swapMat(J,m,k);
			f2 = Calc.swapVec(f, m, k);
			del = Calc.Gauss(J2, f2);
			}
			return del;
		}
```
感想：
数値解析って有限要素法がメジャーなのか未だ踏み込めておらずいつか理解できるようにしたいです.
また、掃き出し法は時間がかかるため,別の解法も試さなければとも思いました.
pdfcropで任意の範囲を切り抜く

pdfデータの一部を切り抜いて使いまわしたいというとき、手っ取り早くこれまで作成したpdfファイルから切り抜く場合にpdfcropで処理する方法です。

## inkscapeの場合

inkscapeにpdfをインポートしてクリップやドキュメントの範囲指定でクリップすることが可能です。
![inkscapeで切り抜く.png](https://qiita-image-store.s3.amazonaws.com/0/60438/9b1e9035-ee54-9d1b-eb5c-a2aab838dbc9.png)


しかし、なぜかこの方法がうまくいかないケースがあります。
この場合、右側のラスタ画像が消えています。
（左はベクタ画像）

![消えちゃった.png](https://qiita-image-store.s3.amazonaws.com/0/60438/e458e831-f0c0-cdca-c6dd-ee473dfff0e0.png)


## pdfcropを使う
pdfcropは自動的に余白を切り抜いてくれるコマンドラインのアプリケーションですが、オプションでクロップ範囲を手動で設定することができます。

pdfcropの--marginsオプションで余白を指定します。
--marginの引数にマイナスを指定すると任意の範囲を切り抜くことができます。

![切り抜きの考え方.png](https://qiita-image-store.s3.amazonaws.com/0/60438/6fb4a9d2-0839-3397-ccda-e1224bcfe45d.png)

上のように切り抜きたい場合には下記のように--marginsを指定します。
余白の指定は左、上、右、下の順になります。

```
pdfcrop --margins '-10 -370 -15 -103' input.pdf output.pdf
```
実際には試行錯誤で少しずつ数値を調整していくことになりますが、下のようなpdfファイルを切り出すことができました。

![pdfcropで余白を切り抜く.png](https://qiita-image-store.s3.amazonaws.com/0/60438/c57cfa51-4180-9165-dfdf-28eb34d0337b.png)
React の dangerouslySetInnerHTML を使用する際に最低限気にするべきこと


**注意: 使わなくていいなら使わないほうが良いです。**

ドキュメントにもそう書いている。
https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml

クロスサイトスクリプティング(XSS) の可能性が出ます。とだけ書かれていて具体的にどうやってエスケープするべきなのか全然出てこないので、僕の思う方法をまとめてみました。
最低限なのでエスケープ漏れは起こると思っている。

また、React でレンダリングする場合、基本的にはエスケープが自動で行われるので普通は気にしなくていいです。[[参照]](https://reactjs.org/docs/introducing-jsx.html#jsx-prevents-injection-attacks)

# 使いたい動機とか

何処かからhtmlが送られてきてそれを表示したい。。。的な時ぐらいしか使用用途が思いつかないですが、やる必要が出てくることもあるかと思います。
要件を変えてもらえるほうが圧倒的に良いです。
実際プロダクトには使わなかった。


# クロスサイトスクリプティングへの対策

## ヘッダー

* X-XSS-Protection: 1; mode=block とりあえず有効にしておく[[参照]](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-XSS-Protection)
  * 攻撃されてるっぽいときにレンダリングしないでくれる可能性を残しておく(気休め)

## エスケープ

[ここ](http://nootropic.me/site/web/xss.html)に上がっているものすべてに対応したほうが良さそうだけれども全部対応するのはつらすぎるので下記ぐらいでどうにか。。。

* escape-html を使ってエスケープしてから HTML String に組み込む
* `<a>` の href や `<iframe>` の src に入れるときは追加で `javascript:` のスキームを拒絶する(気休めかもしれない)

```javascript
import React from 'react';
import * as escape from 'escape-html';

class Sample extends React.Component {
  render() {
    const escapedData = escape(this.props.data);
    const escapedUrl = escape(this.props.url).replace(/javascript:/g, '');
    const html = `
      <div data-attr="${escapedData}">
        <a href="${escapedUrl}">Link</a>
      </div>
    `;

    return <div dangerouslySetInnerHTML={{__html : html}} />;
  }
}
```

# まとめ

気合でエスケープするとなるとつらいので一部対応といった形に...

気休めばかりなので、もっとこうした方が良いとかあればコメントください！
初心者がVuexの公式ガイドを勉強するメモ 入門編

# Vuex 入門
## 今日のお題はこちらです。
### https://vuex.vuejs.org/ja/guide/
* Vue.js を先に学んでからこちらを参照してください。

### インストール
* npm install vuex --save
* vue-cliでnode環境を作って試して下さい。
  * [よくわからない方は,Vue.js の環境編を参照して下さい。](https://qiita.com/atoris/items/8a1d67b4df01ee1bf90d)

## シンプルなストア例
* これだけでは動きませんが

* src/main.js

``` js
import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'
Vue.use(Vuex)

new Vue({
  el: '#app',
  render: h => h(App)
})

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

store.commit('increment')
console.log(store.state.count)
```
* インストールは簡単なので、さっとインストールして、Vuexを有効にします。
* 状態管理編で、データとデータの書き込みを一元管理するやり方は学びましたね。
* storeのstateへの書き込みは、すべてmutationsを通すみたいですね。

![actions_1.png](https://qiita-image-store.s3.amazonaws.com/0/131175/f2ff8c55-46f4-3627-c15b-c0142421d3ae.png)

### Vuex を使った最も基本的なカウンターアプリの例
* 自分の環境で試してみます

* cssフレームワークBULMAをいれましたので、index.htmlにlinkをいれてもらうと見やすくなるかと思います.

index.html

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <title>08</title>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.2/css/bulma.min.css">

    <link href="https://cdn.jsdelivr.net/npm/animate.css@3.5.1" rel="stylesheet" type="text/css">
    <script defer src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>
  </head>
  <body>
    <div id="app"></div>
    <script src="/dist/build.js"></script>
  </body>
</html>
```

* src/store.js

``` js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment: (state) => {
      state.count++
    },
    decrement: state => state.count--,
  }
})
export default store

```
* App.vue

``` html
<template lang="pug">
  #app
    .box.has-text-centered
      .columns
        .column
          p.notification.is-size-3  {{ count }}
        .column
          button.button.is-info(@click="increment")
            span.icon
              i.far.fa-plus-square.fa-2x
          button.button.is-danger(@click="decrement")
            span.icon
              i.far.fa-minus-square.fa-2x

</template>

<script>
import Vue from 'vue'
import store from './store.js'

export default {
  name: 'app',
  data: () => ({
    privateState: {},
  }),
  computed: {
    count () {
      return store.state.count
    }
  },
  methods: {
    increment () {
      store.commit('increment')
    },
    decrement () {
      store.commit('decrement')
    }
  }
}

</script>


```
* store をmain.jsではなく、新たにstore.jsを作り移動しました。
* 状態管理編では、表示に一旦data property にshardStateを作っていましたが、Vuexがリアクティブということなので、computedで処理しています。
* 書き換えは、Vuexのメソッドである、mutationsを介して書き換えています。
* es6の省略記法等は、慣れれば特に問題無くなります。

* 入門編は、これで終了です。
* 次回は、コアコンセプト編です。


* 話はかわりますが、このVuexのマニュアルは、gitbookで管理されているみたいです。
  * markdown と git での種類管理を便利にするツールみたいです。
  * ローカルでも動くみたいなので、これで自分のマークダウンファイルも管理しようかと思います。 色々便利なツールありますね。
[JavaScript] オブジェクト/Mapのキーの列挙順は保証されるのか

# TL;DR

* オブジェクト: 保証される**こともある**が、混乱を招くので保証されないものとして扱うべきである。
* `Map`: 挿入順。

ちなみに、この記事ではわざわざ触れないが、`Set`、`WeakMap`、`WeakSet`も挿入順で列挙される。

[仕様](https://www.ecma-international.org/ecma-262/8.0/index.html)のレベルで保証されているかを議論しているのであって、ある特定の実装では順番が保証されていることもある。

# `Map`のキーの列挙順は保証される

まずは素直な方から行く。

```javascript
const map = new Map();
map.set("a", 1);
map.set("b", 2);
map.set("c", 3);
map.set("b", 4);
console.log([...map.entries()]); // => [["a", 1], ["b", 4], ["c", 3]]
```

キーの順番は挿入順になることが保証されている。
同一のキーで上書いた場合、キーの順番に関しては変化せず、値だけが書き換わる挙動になる。
この挙動は[仕様](https://www.ecma-international.org/ecma-262/8.0/index.html#sec-map.prototype.set)で保証されている。

さらにもう一つ補足しておくと、コンストラクタからキーと値を一気に流し込んだ場合も、`set`を順番通りに複数回呼んだときと同じ挙動になる。
この挙動は[仕様](https://www.ecma-international.org/ecma-262/8.0/index.html#sec-map-iterable)で保証されている。

```javascript
const map = new Map([["a", 1], ["b", 2], ["c", 3], ["b", 4]]);
console.log([...map.entries()]); // => [["a", 1], ["b", 4], ["c", 3]]
```

# オブジェクトのプロパティの列挙順は保証される**こともある**

正確に言うと、保証されるメソッドとされないメソッドがある。
保証される場合も、直感的とは言い難い順番で列挙される。
したがって、オブジェクトのプロパティの列挙順に依存するコードを書くべきではない。

## 列挙順が保証されるメソッド

* `Object.assign`
* `Object.defineProperties`
* `Object.getOwnPropertyNames`
* `Object.getOwnPropertySymbols`
* `Reflect.ownKeys`

## 列挙順が保証されないメソッド

* `Object.keys`
* `for-in`（正確にはメソッドではないが）
* `JSON.parse`
* `JSON.stringify`

## 列挙順が保証される場合の列挙順

次の順に列挙する。

1. $0$〜$2^{32}-2$[^1]の整数として解釈可能な文字列であるプロパティを、整数として解釈した場合の昇順で列挙する
2. $0$〜$2^{32}-2$の整数として解釈できない文字列であるプロパティを、挿入順に列挙する
3. シンボルであるプロパティを、挿入順に列挙する

[^1]: $2^{32}-2$は配列のインデックスとして解釈可能な最大値。配列の要素数の最大値が$2^{32}-1$であるためこうなる。

## なぜこんなことになっているのか

ECMAScript 5以前は、オブジェクトのプロパティの列挙順は（少なくとも仕様レベルでは）全く保証されていなかった。
ここに動きが出たのがECMAScript 2015である。
ECMAScript 2015では、オブジェクトのプロパティについても列挙順を保証しようということになった。

しかし、ある特定の列挙順を仕様で決めてしまうと、互換性が崩れかねない問題がある。
たとえば、実装依存のある特定の列挙順を前提としているコードが壊れてしまわないだろうか？
ECMAScript、ひいてはWebの技術は、仕様の明快さよりも今あるものが動くことを大事にする哲学を持つ。
そういうことで、ECMAScript 5以前からあるメソッドは、あえて列挙順を保証しないままとすることになった。

# まとめ

オブジェクトのプロパティの列挙順に依存するコードを書くべきではない。
この目的では`Map`を使うべきである。
`Map`のキーは挿入順で列挙される。

# 参考リンク

[Does JavaScript Guarantee Object Property Order?](https://stackoverflow.com/a/38218582/5688192)
乱数行列をPivotGauss消去法とGauss消去法で解き、精度比較する際のコード

学校の課題を提出したので、コードを記事にして保存しました.
肝心のPivotGauss消去法とGauss消去法のコードは別記事です.
条件:
・`ax=b`を解く.
・`a`は500*500の乱数行列(成分は1~9)
・`(b-ax)`の2ノルムを誤差として`err1(Gauss)`,`err2(PivotGauss)`に放り込む.
・言語はJava.
ソース全体

```Java
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

		long t0;
		long time;
		int n =500;
		int m=100;
		double [][]a =new double[n][n];
		double []b =new double[n];
		double []x1 =new double[n];
		double []x2 =new double[n];
		double err1=0.0;
	//	double []err2 =new double[n];
	//	double []err1 = new double[n];
		double err2 =0.0;
		//err1をだす
		t0 = System.currentTimeMillis();
		for(int s=0;s<m;s++){
			for(int j=0;j<n;j++){
				for(int i=0;i<n;i++){
					a[i][j]=Math.abs((Math.random()));	
					b[i]  =Math.abs((Math.random()));
				}
			}
		
			x1 =Calc.Gauss(a, b);
			err1 = Calc.vecNorm2(Calc.subVec(b,Calc.matVec(a, x1)));
			x2 =Calc.pivotGauss(a, b);
			err2 =Calc.vecNorm2(Calc.subVec(b,Calc.matVec(a, x2)));
			System.out.println(err1);
			System.out.println(err2);
		//System.out.println("\n"+err2);
		}
		//System.out.println(Math.abs((Math.random())));
		time = System.currentTimeMillis()-t0;
		System.out.println("\n処理時間:"+time);
		//Calc.printVec2(err1);
	}
```
Laravel 5.5 にてロードバランサ配下のアプリケーションにHTTPS通信を適用させる

# 前提

案件でLaravelを使っており、開発サーバー上でのURL生成をhttpsにしたいのにもかかわらず、httpになっていたので、解決策を調べていました。 

# 結論
https://readouble.com/laravel/5.5/ja/requests.html#configuring-trusted-proxies

ここ見ておけばOKでした。

## 手順まとめ
- `App\Http\Middleware\TrustProxies`　を使う
- `TrustProxies.php` を編集する

以上！

## コードの編集

- `protected $proxies = '**';`にする

理由はAWS等を使うとIPがわからないため。IPが分かる場合はここを編集しましょう

```TrustProxies.php
<?php

namespace App\Http\Middleware;

use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */

    protected $proxies = '**'; 



    /**
     * The current proxy header mappings.
     *
     * @var array
     */
    protected $headers = [
        Request::HEADER_FORWARDED => 'FORWARDED',
        Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
        Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
        Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
        Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
    ];
}
```
Pythonでお手軽にかっこよくlogging

複数にソースファイルがあったときのロギングを簡単にかっこよくする方法ないかなと探していました。コツはlogging.basicConfigのformatにありました。

「Python ログ」で検索すると、[この記事](https://qiita.com/amedama/items/b856b2f30c2f38665701)が上位に出てくるのですが、loggingに親でも殺されたかのような書き回しで正直わかりづらい。逆に以下の記事が参考になりました。
**logging入門**
https://qiita.com/knknkn1162/items/87b1153c212b27bd52b4
**pythonのloggingモジュールでログ出力をする時に付加的な情報を出力する方法**
https://qiita.com/podhmo/items/efb65ed90871ba2ac544

ちょっと書くぐらいだったら数行でそれなりにかっこよく見えるものが欲しいですよね。**ユーザー側（メイン側）のlogging.basicConfigでformatを設定させること**です。以下のような階層でファイルがあったとしましょう（本当はフォルダをパッケージ化すべきかもしれませんがあえてしません）。

```
- main.py #スタートアップファイル
- mylib.py #モジュールその1
+ hoge #フォルダ
  - mylib2.py #モジュールその2
```

各モジュールについて

```py3:mylib.py
import logging

logger = logging.getLogger(__name__)

def do():
    logger.error("mylib do")
```

```py3:hoge\mylib2.py
import logging

logger = logging.getLogger(__name__)

def do():
    logger.warn("mylib2 do")
```

##デフォルトの場合
特になにも設定しないでメインプログラムを実行。

```py3:main.py
import logging
import mylib
import hoge.mylib2

def main():
    logging.info("started")
    mylib.do()
    hoge.mylib2.do()
    logging.info("end")

if __name__ == "__main__":
    logging.basicConfig(filename = "hoge.log", level = logging.INFO)
    main()
```

結果：

```
INFO:root:started
ERROR:mylib:mylib do
WARNING:hoge.mylib2:mylib2 do
INFO:root:end
```

悪くはないけど少しもやもやする。時間の情報はほしい。

##改良版
main.pyのオプションに少し書き足しただけです。

参考：http://docs.python.jp/3/library/logging.html#logrecord-attributes

```py3:main.py
import logging
import mylib
import hoge.mylib2

def main():
    logging.info("started")
    mylib.do()
    hoge.mylib2.do()
    logging.info("end")

if __name__ == "__main__":
    logging.basicConfig(filename = "hoge.log", level = logging.INFO,
                       format='[%(asctime)s] %(module)s.%(funcName)s %(levelname)s -> %(message)s')
    main()
```

結果

```
[2018-03-07 11:11:49,269] main.main INFO -> started
[2018-03-07 11:11:49,269] mylib.do ERROR -> mylib do
[2018-03-07 11:11:49,270] mylib2.do WARNING -> mylib2 do
[2018-03-07 11:11:49,270] main.main INFO -> end
```

1行付け足しただけで結構かっこよくなりました。モジュール名や関数名をつけると、デバッグがやりやすくなると思います。好みでformatの引数を追加すればいいだけです。

[公式ドキュメント](https://docs.python.jp/3/howto/logging.html)にも書いてありますが、logging.getLoggerは最低限つけるべきです。階層構造が重要なので。

> ロガーに名前をつけるときの良い習慣は、ロギングを使う各モジュールに、以下のように名付けられた、モジュールレベルロガーを使うことです:
>
> logger = logging.getLogger(&#95;&#95;name&#95;&#95;)
> これにより、ロガー名はパッケージ/モジュール階層をなぞり、ロガー名だけで、どこでイベントのログが取られたか、直感的に明らかになります。
乱数行列をPivotGauss消去法で解く際のコード

学校の課題を提出したので、コードを記事にして保存しました.
条件:
・`ax=b`を解く.
・`a`は500*500の乱数行列(成分は1~9)
・`(b-ax)`の2ノルムを誤差として`err1`に放り込む.
・言語はJava.
ソース全体

```Java
	public static main {
		long t0;
		long time;
		int n =500;
		int m=100;
		double [][]a =new double[n][n];
		double []b =new double[n];
		double []x2 =new double[n];
		double err1 =0.0;
		//err1をだす
		t0 = System.currentTimeMillis();
		for(int s=0;s<m;s++){
			for(int j=0;j<n;j++){
				for(int i=0;i<n;i++){
					a[i][j]=Math.abs((Math.random()));
					b[i]  =Math.abs((Math.random()));
				}
			}
			x2 =Calc.pivotGauss(a, b);
			err1 =Calc.vecNorm2(Calc.subVec(b,Calc.matVec(a, x2)));
			System.out.println(err2);
		}
		time = System.currentTimeMillis()-t0;
		System.out.println("\n処理時間:"+time);
	}
```
Automator で pull request メッセージ作成のサービスを作る

# 問題

<img width="768" alt="GitHub PR message" src="https://qiita-image-store.s3.amazonaws.com/0/59430/7643246a-4329-910b-577b-9d5ae7672fa9.png">


社内で GitHub の issues より Backlog を使うため、Backlog チケットと GitHub の PR はほとんど 1:1 関係になってますから、普段 PR を開ける時、こういう形で Backlog へのリンクを書きます：

```
Backlog: [チケット番号](チケットのリンク) Backlog のチケットのタイトル
```

毎回いちいちチケットのリンクとタイトルをコピーするのがややこしかったですから、[サービス](http://macwiki.osdn.jp/wiki/index.php/%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC)を作りました。

# スクリプト

まずは CLI から PR メッセージを作成できるようにしました。

```pr_message.sh
#!/usr/bin/env bash

API_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

function usage(){
  echo "Usage: $0 <issue_id>" 1>&2
  exit 1
}

function unknown_issue(){
  echo "Unknown issue: $1" 1>&2
  exit 2
}

issue_id=$1
[ -z ${issue_id} ] && usage

issue_summary=$(curl -s https://company.backlog.jp/api/v2/issues/${issue_id}?apiKey=${API_KEY} | jq -r '.summary')
if [[ ${issue_summary} = null ]]; then
  unknown_issue ${issue_id}
fi

issue_url=https://company.backlog.jp/view/${issue_id}

echo "Backlog: [${issue_id}](${issue_url}) ${issue_summary}"
```

`API_KEY` は Backlog で生成された API キーです。
Backlog のチケット ID をパラメータとして読んで、 API を使ってこのチケットの情報を取得して、jq で情報から `summary` を読みます。
チケットの URL は決まってますから、 ID だけ置き換えたら十分です。
最終的に PR メッセージを出します。

どこからも実行ができるため、ファイルに許可を与えて `bin` にコピーしました：

```bash
chmod 755 pr_message.sh
mv pr_message.sh /usr/local/bin/pr_message
```

実行してみれば、メッセージがちゃんと作られています：

```bash
$ pr_message C-1234
Backlog: [C-1234](https://company.backlog.jp/view/C-1234) Backlog チケットのタイトル
```

# Automator でサービスを作る

Automator で新しいサービスを選択します。

<img width="564" alt="automator_new_service.png" src="https://qiita-image-store.s3.amazonaws.com/0/59430/57c7d507-1c2e-1f32-a810-c1a6088c231e.png">

左側の `ライブラリ` メニューから `テキスト` を選択して、 `テキストの入力を求める` を右側にドロップします。

<img width="994" alt="Ask for text" src="https://qiita-image-store.s3.amazonaws.com/0/59430/ee93217d-099a-f5eb-e590-a9a46dcf4ee4.png">

左側から `ユーティリティ` > `シェルスクリプトを実行` をこの下にドロップして、入力の引き渡し方法を `引数として` にする。ここで、前のステップでもらった入力をスクリプトに渡します。    
**注意:** この shell は `.bash_profile` などを読まないため、自分で PATH を設定する必要あります。

<img width="996" alt="Shell script" src="https://qiita-image-store.s3.amazonaws.com/0/59430/82a22f8d-8691-d444-ef0b-2ba28848850c.png">

出力をクリップボードにするため `ユーティリティ` > `クリップボードにコピー` を下に追加します。

<img width="993" alt="Copy to clipboard" src="https://qiita-image-store.s3.amazonaws.com/0/59430/87085c3d-5782-ada1-b4cb-8bac9930a452.png">

`ライブラリ/サービス` フォルダーの中に保存して再起動します。

# 実行

サービスはトップメニューから実行されます。

<img width="574" alt="Services menu" src="https://qiita-image-store.s3.amazonaws.com/0/59430/35638289-e0db-1fcb-57b1-703e8b883ccb.png">


実行すれば、ダイアログが開けます。

<img width="462" alt="Dialog" src="https://qiita-image-store.s3.amazonaws.com/0/59430/b633efce-f61d-24f3-660f-8ddf91e4c178.png">

入力・確認したら、後は ⌘V だけで終わります。

<img width="693" alt="PR message" src="https://qiita-image-store.s3.amazonaws.com/0/59430/4bf598ad-31f3-32f7-d1e3-e5fd18bc74f6.png">



# 結論

Automator とサービスでできることはいくつでもあって、よく行う作業をかなりやりやすくできます。今回のサービスの改善として、メッセージをクリップボードにコピーするより、ブラウザーの中のコピーにした方が使いやすくなります。
プログラミング用フォントRictyをMacにインストールする

# はじめに
プログラミング用フォントRictyをMacにインストールしてみました。

以下の記事を参考にさせていただきました。詳しくは以下をご覧ください。
[プログラミング用フォント『Ricty』を導入してみよう](http://vdeep.net/ricty-font)

#### 2019/06/16 追記
Windows用の記事も書きました！Windowsの方はこちらをご参照ください。
[プログラミング用フォントRicty DiminishedをWindowsにインストールする](https://qiita.com/segur/items/e733f8bb03c5f1ee1205)


# Rictyとは
Rictyは、プログラミングに特化したフォントです。

- l, I, 1, | みたいな見分けづらい文字の区別がつきやすくなります。
- 等幅フォントです。全角文字の幅が半角文字の2倍にきちんとなります。
- 全角スペースが可視化されます。

ライセンス上の問題で、使用者が自分で生成する必要があります。

Rictyの公式サイトはこちらです。
[プログラミング用フォント Ricty](https://rictyfonts.github.io/)


# RictyをMacにインストールする
homebrewを使うと簡単です。

```bash
# sanemat様のリポジトリにタップします
brew tap sanemat/font

# rictyをインストールします
brew install ricty
```

これでHomebrewでのインストールは完了です。
インストール結果として、以下のようなコマンドが表示されると思います。

```bash
To install Ricty:
  $ cp -f /usr/local/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/
  $ fc-cache -vf
```

これらのコマンドを実行すると、フォントがインストールされます。
このコマンドはRictyのバージョンによって異なるようですので、ご注意ください。

fc-cacheコマンドは時間がかかります。
以下の文章が表示されれば終了です。

```bash
fc-cache: succeeded
```

これでインストール完了です。ターミナルとかのフォントでRictyが指定できるようになっているはずです。

# おわりに
ターミナルやAtom EditorのフォントをRictyにしてみましたが、とても見やすくなりました！変えてみて良かった！
javascriptでのダブルクリック制御

ググって出てきたコードがどうも納得いかないので書き換えた
dblclickの動きを確認したけど、あの挙動だと使い道がわからない

１回ならシングルクリック
2回以上ならダブルクリックとして扱う

```js
            $('.hoge').on('click', function (e) {

                var obj = this;

                console.log('click!');

                // クリック監視中なら現在のタイマを停止
                var timer_id = -1;
                if (!(isNullOrUndefined($(this).data('timer_id'))) ) {
                    timer_id = Number($(this).data('timer_id'));
                    if (timer_id >= 0) {
                        clearInterval(timer_id);
                    }
                }

                // クリック回数を加算
                var click_count = 0;
                if (isNullOrUndefined($(this).data('click_count'))) {
                    click_count = 0;
                } else {
                    click_count = Number($(this).data('click_count'));
                }
                click_count++;
                
                timer_id = setTimeout(function () {

                    // 連続クリックイベントが終了するとここにくる
                    var count = Number($(obj).data('click_count'));

                    if (count == 1) {
                        console.log('single click!');
                    } else {
                        console.log('double click!');
                    }
                    $(obj).data('timer_id', -1);
                    $(obj).data('click_count', 0);

                }, 250);

                $(this).data('timer_id', timer_id);
                $(this).data('click_count', click_count);
            });
```
Part2　Part II. Getting Startedの進め方　Spring Boot Reference Guide覚え書き①

#マニュアルの進め方

今回はPart2。
ちなみにPart1は概要なので読み飛ばしてもOK。
[Part2　Part II. Getting Started](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#getting-started)

##Mavenとgradle

どちらを選択してもよいのだが、マニュアルを読むことだけを考えるとMavenがおすすめ。
基本的にmaven中心で解説が行われる。
ただし、記事等を探すと今後はgradleがメインになるようでもあるのでどちらも試すのが一番。
少なくともgradleの箇所も読み飛ばさないのがよいでしょう。

##ファイルの作成場所
[10.2.6 Quick-start Spring CLI Example](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#getting-started-cli-example)
上記項目をやっていて疑問に感じたところを残しておく。
ファイルの作成場所が書かれていないが、こちらはWindowsならユーザーフォルダ内がよい。
`spring run app.groovy`の実行もファイルを作成したフォルダまで`cd フォルダ名`で
移動後に実行すること。（コマンドプロンプト立ち上げの時点でユーザフォルダ内にいるなら移動の必要はなし）

`@RestController`のアノテーションを付けたものは、文字列などのデータを返すものなのでこちらでは基本的に簡易的に「Hello, World!」を返すプログラムを作成している。

##POMファイルの作成
[Creating the POM](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#getting-started-first-application-pom)
###専用のフォルダを作成すべし
「Creating the POM」以降はMavenを利用してフォルダ構成を作ったり、ライブラリを読み込んだりしていくのだがユーザーフォルダ内に作ると複数のフォルダなどが作られごちゃごちゃすることになる。この段階でユーザーフォルダ内に「spring-sample」などの名前のフォルダを作り、`cd spring-sample`でフォルダ内に入って作業をするのがよいでしょう。
C > function > return early | nest | terminate関数のコール | 優先度付き分岐でのif | 関数ポインタ配列テーブル使用

```txt:動作環境
組込みC
```

https://ideone.com/dZJaG1

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

void process_return_early(bool *flag1, bool *flag2, bool *flag3)
{
    if (*flag1) {
        *flag1 = false;
        printf("flag1\n");
        // 手仕舞い処理
        return;
    }

    if (*flag2) {
        *flag2 = false;
        printf("flag2\n");
        // 手仕舞い処理
        return;
    }
    
    if (*flag3) {
        *flag3 = false;
        printf("flag3\n");
        // 手仕舞い処理
        return;
    }
}

void process_nest(bool *flag1, bool *flag2, bool *flag3)
{
    if (*flag1) {
        *flag1 = false;
        printf("flag1\n");
    } else {
        if (*flag2) {
            *flag2 = false;
            printf("flag2\n");
        } else {
            if (*flag3) {
                *flag3 = false;
                printf("flag3\n");
            }
        }
    }
    // 手仕舞い処理
 }

int main(void) {
    bool flags[] = { false, true, true };
    
    process_return_early(&flags[0], &flags[1], &flags[2]);
    process_nest(&flags[0], &flags[1], &flags[2]);
    
    return 0;
}
```

```txt:run
flag2
flag3
```

### 備考

- 手仕舞い処理をどのように実装するかで、どちらの方法が読みやすいコードになるか
    - return earlyはflagsが増えると縦に伸びる
    - nestはflagsが増えると横に伸びる
    - 一覧性が高いのはどちらか?
    - 1つのフラグに対する処理が見やすいのはreturn earlyかもしれない
    - ifの優先順位を変更しやすいのはreturn early
        - nestの場合、インデントの変更が必要
- 条件の数によっても読みやすさは異なる
- decision tableなどの使用も要検討
    - 違うだろうか

### code > terminate関数のコール


https://ideone.com/Bh4w1e

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

void terminate_clearing_flag(bool *flag)
{
    *flag = false;
    // 手仕舞い処理
}

void process_call_terminate_func(bool *flag1, bool *flag2, bool *flag3)
{
    if (*flag1) {
        printf("flag1\n");
        terminate_clearing_flag(flag1);
        return;
    }
    if (*flag2) {
        printf("flag2\n");
        terminate_clearing_flag(flag2);
        return;
    }
    if (*flag3) {
        printf("flag3\n");
        terminate_clearing_flag(flag3);
        return;
    }
}

int main(void) {
    bool flags[] = { false, true, true };
    
    process_call_terminate_func(&flags[0], &flags[1], &flags[2]);
    process_call_terminate_func(&flags[0], &flags[1], &flags[2]);
    
    return 0;
}
```

flag1などの命名はポインタ変数と分かる名前の方がいいかもしれない。
(例: pflag1, flag1ptr, flag1Ptr)

### 謝辞

@tenmyo さんに優先度付き分岐時の良い実装例を教えていただきました。

情報感謝です。

@mt08さんに関数ポインタの配列テーブル使用例を教えていただきました。

情報感謝です。
Macのg++でifstream::readが2GB以上のファイルを一度に読めない

# はじめに

Linuxでちゃんと走るコードがMacでバグったので調べたところ、`std::ifstream::read`で2GB以上のファイルを読み込もうとすると読めないことが理由だったのでメモ。

うちの環境。

* 再現環境[^1]
  * macOS High Sierra 10.13.3
  * g++ (Homebrew GCC 7.2.0) 7.2.0
  * clang++ (Apple LLVM version 9.0.0 (clang-900.0.39.2))

# 再現手順

まず2GBのファイルを作る。

```shell-session
$ gdd if=/dev/zero of=test.dat bs=1G count=2
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 3.37816 s, 636 MB/s
$ gstat -c "%s" test.dat 
2147483648
```

2GB(2147483648バイト)のファイルが作成された。

これを`std::ifstream`で一括で読み込んで見る。

```test.cpp
#include <iostream>
#include <cstdlib>
#include <fstream>

int
main(int argc, char** argv){
  const char *filename=argv[1];
  long len = atol(argv[2]);
  char *buf = new char[len];
  std::cout << len << std::endl;
  std::ifstream ifs(filename);
  ifs.read(buf,len);
  if(ifs){
    std::cout << "OK" << std::endl;
  }else{
    std::cout << "NG" << std::endl;
  }
  delete [] buf;
}
```

後でいじるため、コマンドラインからファイル名とファイルサイズを与えている。

コンパイル、実行してみる。

```shell-session
$ g++ test.cpp
$ ./a.out test.dat 2147483648
2147483648
NG
```

失敗した。

# その他の条件

## clang

clang++で同じことをするとちゃんと読める。

```shell-session
$ clang++ test.cpp
$ ./a.out test.dat 2147483648
2147483648
OK
```

## 2GB -1 

2GBより1バイトだけ小さく読み込むとg++でも読める。

```shell-session
$ g++ test.cpp
$ ./a.out test.dat 2147483648
2147483648
NG

$ ./a.out test.dat 2147483647 # ← 1バイト減らした
2147483647
OK
```
## Linux

Linuxでは同じバージョンのg++でもうまくいく。

```shell-session
$ dd if=/dev/zero of=test.dat bs=1G count=2
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 1.69692 s, 1.3 GB/s

$ g++ --version
g++ (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ g++ test.cpp

$ ./a.out test.dat 2147483648
2147483648
OK
```

SUSEとRedhatで試した。

# まとめ

Macとg++の組み合わせでは`std::ifstream`で一度に2GB以上のファイルを読み込もうとすると失敗する。Macでもclang++なら大丈夫だし、Linuxなら同じバージョンのg++でも大丈夫。

# 追記

clangでも、以下のようにしてlibstdc++を使わせると同じことがおきる。

```shell-session
$ clang++ -stdlib=libstdc++ test.cpp 
clang: warning: libstdc++ is deprecated; move to libc++ [-Wdeprecated]

$ ./a.out test.dat 2147483648
2147483648
NG

$ ./a.out test.dat 2147483647 
2147483647
OK
```

libc++　なら大丈夫なので、処理系ではなく、ライブラリの問題なのは間違いないっぽい。
Spring Bootの学習手順

#マニュアルの学習手順
##まずはSpring Boot Reference Guide
Spring Bootの学習はまず「Spring Boot Reference Guide」というページから
Spring BootのページからReferenceを選択すればよい。
![sp.jpg](https://qiita-image-store.s3.amazonaws.com/0/240587/95b5a237-f66f-b6c1-8b5c-d96df08e7a6d.jpeg)

直接ページに行く場合は、
[Spring Boot Reference Guide](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/)
上記リンクから。

くれぐれも[GUIDES](https://spring.io/guides)のページから始めないことである。こちらはReferenceが理解できて具体的な機能の作り方を確認するためのページ。

ReferenceのPart1はガイドについての概要なのでメインはPart2　Part II. Getting Startedから。
ec2のPHPのバージョンを5.3→7.2に無停止でアップする

## 前提
```
$hoge = [];
```
って書いたらエラーが出たのでもう我慢なりませんでした。
タイトルは5.3だけど、beforeのバージョンはなんでもいい。

## 手順

### 現行EC2のコピーを作る
丸コピです。
AWSのEC2コンソールのインスタンス画面より、

* アクション＞イメージ＞イメージの作成

で、現在のEC2のイメージを作成。（場合によっては１時間くらいかかりますのでお茶を入れます）
作成できたら、イメージ＞AMI　から、イメージより作成を行います。
その際に、いい機会なのでインスタンスタイプを見直すのもいいかも。


## 新EC2でPHPバージョンアップ
以下、旧EC2のIPをXX.XX.XX.1
新EC2のIPをXX.XX.XX.2
とする。（ElasticIPで設定済とする）

新EC２にアクセスし、PHPのバージョンをアップする。
旧EC2でやったら死ぬのでご注意！！！！

```
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
yum remove ImageMagick
yum remove php*
yum install --disablerepo=amzn-main --enablerepo=remi-php72 \
php php-opcache php-devel php-mbstring php-mcrypt \
php-phpseclib-crypt-blowfish php-pecl-apc php-gd php-mysqlnd php-xml
yum install ImageMagick
```

###　テストテストテストー
旧EC2のapacheだにnginxだのの自動起動がちゃんとされていれば、hosts設定で新EC2は
アクセス可能なはずなので、ローカルPCのhostsに設定を行う

```
vi /etc/hosts
XX.XX.XX.2 hoge.co.jp hoge.jp fuga.jp
```

てすとてすとてすとーー


##　移行中に更新されたコンテンツの移行
今回移行したのがRDS接続のWordPressが大量に乗ったWEBサーバだったので
移行作業やらテスト中に更新された画像等のデータを移行する必要があります。
今回は　/var/www/html以下にすべて集約されていたので、そこ以下をrsyncすることでOK

旧EC2の.ssh/configを設定します。

```
Host new-server
  Hostname XX.XX.XX.2
  User ec2-user
  IdentityFile ~/.ssh/XXX.pem
```

rsyncします。

```
テスト用（デバッグ用パラメータnをつける）

/usr/bin/rsync -rltDvzn --omit-dir-times -e "ssh " \
 --exclude '.svn' \
 --exclude '.git' \
 --exclude '.env' \
 --exclude 'autoptimize' \
 --exclude 'cache' \
 --exclude 'log' \
 /var/www/html/ new-server:/var/www/html/

本番用（nなし）

/usr/bin/rsync -rltDvz --omit-dir-times -e "ssh " \
 --exclude '.svn' \
 --exclude '.git' \
 --exclude '.env' \
 --exclude 'autoptimize' \
 --exclude 'cache' \
 --exclude 'log' \
 /var/www/html/ new-server:/var/www/html/

```
↑パラメータが多いのは、パーミッションが違うファイルが結構あって
それを差分に出さないため。パラメータaで置き換えても大丈夫です。


##　IPの移行
テストで満足できたら、移行作業です。
移行は簡単で、新EC2のIPを旧EC2のIPに付け替えるだけ。

EC2コンソールの　ネットワーク＆セキュリティ＞ElasticIP　画面で

* 新EC2に設定済のIPを外す（XX.XX.XX.2）
* 旧EC2のIP（XX.XX.XX.1）を新EC2に割り当てる
* 新EC2が旧EC2のIPを引き継ぐので、各ドメインのAレコード設定は不要。

いーーじょーー
ExcelVBA // 更新を止めたり再開したり

マクロの処理中に画面の更新や再計算が入ると処理が重くなったりするので、
画面の切り替わりを見る必要ないプロシージャにはこれを仕込むようにしてます

```excel:更新停止.vba
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
```
```excel:更新再開.vba
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
```
Spring bootでCSVダウンロード

# はじめに
SpringbootでCSVダウンロード機能を実装しようとするといくつか方法が見つかったのですがSpringで実行する仮想のTomcatではうごいたのに、実際にサーバに持って行ってTomcatに乗せてみると動かなかったりしたのでまとめてみました。

# 環境
* apache Tomcat
* Spring-Boot 1.5.9
* Java 8

# ソースコード
* HTML, javaScript(ボタン押すだけです)

```.html
<form id="csvform" method="post">
    <button type="button" onClick="downloadCSV();"><img id="MORDAL_OKBUTTON_ICON"></img>確定</button>
</form>
<script>
function downloadCSV(){
	var date = new Date();
	var file_title = addzero(date.getFullYear())+addzero(date.getMonth()+1)+addzero(date.getDate())+addzero(date.getHours())+addzero(date.getMinutes())+addzero(date.getSeconds());
	url= "csvdownload";
	$('#csvform').attr('action', url);
	$('#csvform').attr('method', "GET");
	$('#csvform').submit();
}

function addzero(text){
	text = String(text);
	if(text.length==1){
		text = "0"+text;
	}
	return text;
}
</script>

```

* java

```.java

import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class CsvController {

	@RequestMapping(value = "/csvdownload/csv", method = RequestMethod.GET)
	public ResponseEntity<byte[]> download(
    		@RequestParam("csvsearchname") String csvsearchname) throws IOException {
	    HttpHeaders h = new HttpHeaders();
	    h.add("Content-Type", "text/csv; charset=MS932");
	    String  filename = csvsearchname;
	    h.setContentDispositionFormData("filename", filename + ".csv");
    	String CSVData = null;
    	try{
	    	StringBuilder CSV = new StringBuilder();

	    	CSV.append("ssss");
	    	CSV.append("aaaa");
	        CSVData =CSV.toString();

    	}catch(Exception e){
    		System.out.println(e);
    		CSVData = null;
    	}
	    return new ResponseEntity<>(CSVData.getBytes("MS932"), h, HttpStatus.OK);
	}
}

```


# 終わりに

CSVダウンロード機能は様々なシステムに入っており、よく使われる機能ですが、
* 一度ファイルを生成して、ダウンロードさせる
* byteデータのまま返却する(今回の方法)
* etc
と様々な方法があると思うので、開発環境とやりたいことにあった方法を選択していきたいですね。
深層機械学習のブロック図の意味？

こんにちは

![YOLO-Architecture.jpg](https://qiita-image-store.s3.amazonaws.com/0/242282/5a275de6-5a1b-b0b2-4ab3-5ab1d883f337.jpeg)

上はYOLOのlayar図ですけれども、
Q1: 各立方体の下に付いてる数値： 3,192,256, 512, 1024,..は
filterの種類個数と考えて良いのでしょうか。

Q2: 前後各立方体のdimensionが全然違うんで、
    前後各立方体の間にどんな関係を持つでしょうか。

どうぞ宜しくお願いします
Git初心者によるGitまとめ

#参考になったサイト

[サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)
[GitHub社員による講演](https://schoo.jp/class/2449)
[ProGit](https://progit-ja.github.io/)
他SoftwereDesignのGit入門とか

サルでもわかるGitはドリルのような感覚で実際に自分の手にコマンドをなじませる感覚で練習できた。
「なぜGitを使用するのか」の「なぜ」の部分を理解するためにGitHub社員の講演を聞いたりProGitで補完するといい感じに学習できる。

#Gitとは

分散型VCS(Version Control System)である。
昔はTimeMachineの様が集中VCSで開発が行われていたが

- 分散型なのでサーバーがダウンしても開発がストップしない
- 開発を"スナップショット"のように保存していく

主に上記の２点から開発の主流がGitに移行した。

#基本の5コマンド

```
git init <repository or branch name>
```

GitによってVersion管理する場所を作成する。
自動でディレクトリーを作成してくれるので/workspaceから行うと良い。

```
git status
```

現在のディレクトリー内の状態を教えてくれる。
これをすればgit pushまで何をしなければならないかも教えてくれるので最初はgit statusを連打すればだいたい分かる。

```
git add <file name>
```

"ワークツリー"から"インデックス"まで作業したファイルのステージを上げる。
このgit addがGitを理解するための要であることを全てのGit入門サイトで繰り返し見たのでここが馴染むまでgit addを繰り返したい。
[参考URL](https://backlog.com/ja/git-tutorial/intro/intro1_4.html)

```
git commit -m "<message>"
```

インデックスに登録したものをレポジトリーに記録する。commitするためには必ずcommentを付与しなければならず開発において論理的な意味のあるまとまりとしてアップロードする必要がある。

```
git push <repository or branch name>
```

Gitをremote repositoryにアップロードする。これにより始めて他人と開発状態を共有することになる。


#他重要コマンド

```
git branch
```
gitのbranchを確認する "git branch -r"でremote　repositoryにも存在するbranchを確認できる。

```
git branch -b <branch name>
```

git のブランチを新たに作成して新しいブランチに移動する。

```
git checkout <branch name>
```
\<branch name>で指定したbranchに移動する。

\<branch name> + <~任意の数字>で指定すると任意の数字だけcommitを遡って移動することができる。この時改めてcheckoutすれば元の状態に戻すことができる。

```
git fetch <branch name>
```
remote repositoryに変更があるか確認してローカルに存在するremote repositoryの情報を更新する

```
git merge <branch name>
```
ローカルに存在するremote repositoryの情報からローカル現在にbranchと統合する。

mergeした際に競合(他人と自分が同じ場所を編集した状態)が発生すると
>\<<<<<<< HEAD
ブランチA
\=======
ブランチB
\>>>>>>> branchB

といいた状態になる。問題が無いように自分で編集した後にcommitすると２つのbaranchが統合する形で新たにcommit　ligが作成される。

```
git pull <branch name>
```
上記２つの作業を同時に行う。基本的にfetchでかくにんしてからmergeする癖をつけたほうがいっぽい。

#その他便利コマンド

```
git merge <branch name> —no-ff
```
git でmergeする際にmergeの履歴をgitに残すことができるコマンド
チームの方針によって使い分けるかもしれない。

```
git config --global alias.graph "log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
```
gitのbranchの状態をいい感じに表示してくれる。コマンドを登録するエイリアスコマンド
<img width="930" alt="スクリーンショット 2018-03-07 9.20.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/229617/9e2c5f03-8d97-44be-32b5-7a7eec1fcc9f.png">
一回登録すれば以降は "git graph"で表示してくれるのでかなり便利。

```
git tag <tag name>
```

GitHub上からタグ検索することができたのでチームでtagを残すルールを決めれば活用できるかもしれない。

commit履歴にtag情報を残すことができる。
#まとめ
一日で学習した範囲ではそこまで難しい概念は出てこなかったのでもう少し早めにやっておけばよかった。「独習Git」等の更に分厚い本を読めばまた奥が深いと感心できることもあるかもしれないが実際使っていて足りないと思った時にまた勉強したいと思う。
レンタルサーバ xrea に opencvをインストールする

レンタルサーバ xrea は ssh が使える数少ないレンタルサーバの１つ。
pythonも入っている、2も3も使える
無料サービスで1GBも使えるので試すのには十分なサービスです。

手順（記載の中のhogeは、自分のアカウントID）
ソースのダウンロード

```shell:
cd ~
wget https://github.com/opencv/opencv/archive/2.4.11.zip
unzip 2.4.11.zip
```
展開後、ccmakeでconfigure

```shell:
cd opencv-2.4.11/
mkdir build
cd build/
ccmake 
```

画面が出るので、Press [c] to configure の c を押す
以下をデフォルトのONからOFFへ修正する

```shell:
BUILD_DOCS      OFF
WITH_FFMPEG     OFF
WITH_CUDA       OFF
WITH_LIBV4L     OFF
```

以下を修正する

```shell:
EXECUTABLE_OUTPUT_PATH          */virtual/hoge/opencv-2.4.11/build/bin
CMAKE_BUILD_TYPE                 Release
CMAKE_INSTALL_PREFIX             /virtual/hoge/local
OPENCV_CONFIG_FILE_INCLUDE_DIR  */virtual/hoge/opencv-2.4.11/build
```

修正が終わったら
Press [g] to generate の g を押す
その後、コンパイルしてインストールします。

```shell:
make
mkdir /virtual/hoge/local
make install
```
インストールに成功すると以下のようにコマンドがあるはずです。

```shell:
bash-4.2$ ls -1 ~/local/bin/
opencv_annotation
opencv_createsamples
opencv_haartraining
opencv_performance
opencv_traincascade
```

インストール後の設定

以下を実行

```shell:
printenv PKG_CONFIG_PATH
```
もし printenv で PKG_CONFIG_PATHがある場合は、以下のように設定します。

```shell:
setenv PKG_CONFIG_PATH printenvで確認できた元の値:~/local/lib/pkgconfig
```

なければ以下のように設定します。

```shell:
setenv PKG_CONFIG_PATH ~/local/lib/pkgconfig
```


同様に LD_LIBRARY_PATH も設定します。

```shell:
setenv LD_LIBRARY_PATH printenvで確認できた元の値:~/local/lib
```
もしくは

```shell:
setenv LD_LIBRARY_PATH ~/local/lib
```
まとめて.bashrcに記載しておきます。

```shell:
cat ~/.bashrc
export PATH=/virutal/hoge/local/bin:$PATH
export LD_LIBRARY_PATH=/virtual/hoge/local/lib
export PKG_CONFIG_PATH=/virtual/hoge/local/lib/pkgconfig
````
動作確認

```shell:
bash-4.2$ python

Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> import sys
>>> sys.path.append("/virtual/hoge/local/lib/python2.7/site-packages")
>>> import cv
>>> import cv2
>>> cv2.__version__
'2.4.11'
````

うまく表示されたら .bashrc に以下も入れておく

```shell:
export PYTHONPATH=/virtual/hoge/local/lib/python2.7/site-packages:$PYTHONPATH
```
エクセルのシート名を取り出す パスに"]"を含む場合に対応

エクセルのシート名を取り出す関数は有名だが、ファイルパス中に]が複数あるとうまく取り出せない。
]が複数合っても取り出せるよう対応した版が以下。

=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND(CHAR(13),SUBSTITUTE(CELL("filename",A1), "]", CHAR(13), LEN(CELL("filename",A1)) - LEN(SUBSTITUTE(CELL("filename",A1),"]","")))))

### 解説
1. "]"を空文字に置換して置換前のパスとの文字数差分を出す（＝"]"が何個あるか分かる）
2. フルパス中の最後の"]"をCRに置換する（＝CRより後の文字列がシート名になる）
3. CRの右側を取りだす
PHP7.2で実装されたLibsodiumのサンプルコードまとめ

#Libsodiumとは？
PHP7.2に追加されたモダーンな暗号処理ライブラリです。実際使う時のサンプルコードをまとめてみました。

##Password Hash
```php5
$password = 'secret password';
$hash = sodium_crypto_pwhash_str(
    $password,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

echo $hash . PHP_EOL;
if (sodium_crypto_pwhash_str_verify($hash, $password)) {
    sodium_memzero($password);
    echo 'valid password' . PHP_EOL;
    if (sodium_crypto_pwhash_str_needs_rehash($hash,
        SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
        SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE)) {
            echo 'save new password hash' . PHP_EOL;
    }
} else {
    sodium_memzero($password);
    echo 'invalid password!' . PHP_EOL;
}
```

##Generic Hash
```php5
$hash = sodium_bin2hex(sodium_crypto_generichash('message'));
echo $hash . PHP_EOL;

$key = random_bytes(SODIUM_CRYPTO_SHORTHASH_KEYBYTES);
$hash = sodium_bin2hex(sodium_crypto_shorthash('message', $key));
echo $hash . PHP_EOL;
```

##Secret Key
```php5
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$key = random_bytes(SODIUM_CRYPTO_SECRETBOX_KEYBYTES);

$message = 'secret message';
$cipher_text = sodium_bin2hex(sodium_crypto_secretbox($message, $nonce, $key));
sodium_memzero($message);
echo $cipher_text . PHP_EOL;

$plain_text = sodium_crypto_secretbox_open(sodium_hex2bin($cipher_text), $nonce, $key);
echo $plain_text . PHP_EOL;
```


##Public Key
```php5
$key_pair = sodium_crypto_box_keypair();
$public_key = sodium_crypto_box_publickey($key_pair);

$message = 'secret message';
$cipher_text = sodium_bin2hex(sodium_crypto_box_seal($message, $public_key));
sodium_memzero($message);
echo $cipher_text . PHP_EOL;

$plain_text = sodium_crypto_box_seal_open(sodium_hex2bin($cipher_text), $key_pair);
echo $plain_text . PHP_EOL;
```
Python > random > BookRecommendation_180307.py > random.choice(), 標準ライブラリのrandom.choiceとnumpy.random.choiceは仕様が違う

```txt:動作環境
ideone Python 3 (3.5)
```

### code v0.1

https://ideone.com/IPQUbg

```py
from numpy.random import rand

langs = [ 'Python', 'JavaScript', 'C#', 'Java', '.NET Framework' ]
langs += [ 'JQuery', 'Unity', 'Raspberry Pi', 'Arduino', 'FPGA']
idx = int(rand() * len(langs))
print('%sのおすすめの本を教えてください。' % langs[idx])

val = rand()

postfix = 'あなたが興味が持てそうで2割程度分からない本がおすすめです'

if val < 0.9999/2:
    print('本屋で本をかたっぱしから見て、%s' % postfix)
elif val < 0.9999:
    print('図書館で本をかたっぱしから見て、%s' % postfix)
else:
    print('')

```

```txt:run
JavaScriptのおすすめの本を教えてください。
本屋で本をかたっぱしから見て、あなたが興味が持てそうで2割程度分からない本がおすすめです
```

```txt:run
Unityのおすすめの本を教えてください。
図書館で本をかたっぱしから見て、興味が持てそうで2割り程度分からない本がおすすめです
```

(実行ごとに結果が変わる)

### 背景を知らない

「おすすめの本」を聞いてくる人の背景（学習歴、興味）を質問を受けている人は知らない。

### 背景を知らないアドバイス

背景を知らない状況でのアドバイスは間違ったアドバイスになる。

そのアドバイスを受けた人は、アドバイスの内容に合点がいかず、「xxxさんのアドバイスは不適当だった」と思う。

それは当然と思われる。

### 自分自身が背景を知っている。

自分の背景を一番よく知っているのはその人自身。

あとは興味が持てそうな本を探して読めばいいと思われる。

by ウォルト・ディズニー
> 好奇心はいつだって、新しい道を教えてくれる。

### 別の質問方法

「xxxさんはこれまでどんな本を読まれましたか？参考程度に知りたいと思います。」

その本のリストを作って、本屋で内容を確認する。
「これはすごい」と思うような本があれば、購入して、買った日から読み進める。
1冊読みきるのに85日(例: [計算幾何学 by 杉原厚吉さん](https://qiita.com/7of9/items/884005453ca7bd9e8bfb/revisions))かかるかもしれない。それが本当に良さそうであれば、その日数は無駄にはならない。


### 参考

- [Numpyによる乱数生成まとめ](https://qiita.com/yubais/items/bf9ce0a8fefdcc0b0c97)


### 謝辞

@shiracamus さんにrandom.choice()とその関数の仕様違いについて教えていただきました。

情報感謝です。
多項式回帰

多項式回帰のプログラムを作成してみました。

```{r}

#polynomial regression(only dim=1,2)

library(dplyr)
data=data.frame(num=1:20,y=c(167,167.5,168.4,172,155.3,151.4,163,174,168,160.4,164.7,171,162.6,164.8,163.3,167.6,169.2,168,167.4,172),x1=c(84,87,86,85,82,87,92,94,88,84.9,78,90,88,87,82,84,86,83,85.2,82),x2=c(61,55.5,57,57,50,50,66.5,65,60.5,49.5,49.5,61,59.5,58.4,53.5,54,60,58.8,54,56))

data=data[,c(2,4)]
value=data$x2
dim=2
vec=ans=rep(1,nrow(data))
for(j in 1:dim){
  vec=vec*value
  ans=cbind(ans,vec)

}
X=t(matrix(ans,ncol=ncol(ans),nrow=nrow(ans)))

a=(svd(X%*%t(X))$u%*%diag(1/svd(X%*%t(X))$d)%*%t(svd(X%*%t(X))$v)
)%*%X%*%data$y
y=t(X)%*%a
result=data.frame(num=1:nrow(data),y=data$y,predict=y)
V=nrow(result)
result=result%>% dplyr::mutate(error=(y-predict)^2/V)

plot(result$num,result$y,xlim=c(1,nrow(data)),ylim=c(min(result$y,result$predict),max(result$y,result$predict)),xlab="sample number",ylab="values",type="o",col=2)
par(new=T)
plot(result$num,result$predict,xlim=c(1,nrow(data)),ylim=c(min(result$y,result$predict),max(result$y,result$predict)),xlab="sample number",ylab="values",type="o",col=3)

print(paste0("sum of errors is ",sum(result$error)))
```
DockerでSMTPサーバを30秒で構築する

##はじめに
ローカルでメール通知のテスト等を確認したい際に、自前でSMTPサーバを構築するのは面倒だったりするが
[catatnight/postfix](https://hub.docker.com/r/catatnight/postfix/)
を利用すれば、docker起動時の環境変数に値を設定するだけでpostfixの設定をよしなにしてくれ、dockerコンテナとしてSMTPサーバを関単に立ち上げることができる。


##コンテナの起動

dockerインストール済み環境で以下コマンドを実行するのみ！

```bash
$ docker run -d -p 25:25 \
  --name mailserver \
  -e maildomain=example.com \
  -e smtp_user=username:password \
  catatnight/postfix
```

dockerイメージがない場合はpullされる（場合は30秒で終わらないやん）。
最低限、二つの環境変数
**maildomain**
**smtp_user**
に任意の値を設定する。


##接続確認
具体的なSMTPサーバへの接続方法は割愛するが、例としてtelnetで接続するならば

```bash
$ telnet localhost smtp
```

と入力し、コンテナに環境変数として渡したドメイン、ユーザ情報を利用してメール送信ができればおｋ。


##おわりに
ちょっとしたアプリケーションでメール通知機能を実装させたかったときに、自力でpostfixの設定をするのは面倒だが、これなら労力を割かずにセットアップできる。使うときだけコンテナを起動して、必要なくなれば破棄すればいいだけ！