OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】同じ値が正しくソートされない【Chrome】

## 概要
業務で数百件のデータをソートした時、IEとChromeによって結果が異なっていたので原因をメモ。

## 現象
Chromeで`Array.prototype.sort()`を実施したとき、同じ値の順番が変更されていた。

## 原因
・v8エンジン詰んでる`Chrome`は、要素数によってソートロジックが変わる。

>参照：http://kakts-tec.hatenablog.com/entry/2016/12/18/153845


具体的には要素数が10より大きい値をソートする場合は、クイックソートを実行している。[jsfiddle](https://jsfiddle.net/HagaSpa/me3cbzp6/)

```js
let array = [
    {'number': 1, 'value': 1},
    {'number': 2, 'value': 1},
    {'number': 3, 'value': 1},
    {'number': 4, 'value': 1},
    {'number': 5, 'value': 1},
    {'number': 6, 'value': 1},
    {'number': 7, 'value': 1},
    {'number': 8, 'value': 1},
    {'number': 9, 'value': 1},
    {'number': 10, 'value': 1},
    {'number': 11, 'value': 1}
];

// ソート対象の要素数が10より大きければ、v8エンジンはクイックソートを行う
array.sort((a,b) => {
    return a.value > b.value ? 1 : -1; 
});

console.log(array);
```


クイックソートは[安定ソート](https://ja.wikipedia.org/wiki/%E5%AE%89%E5%AE%9A%E3%82%BD%E3%83%BC%E3%83%88)ではないので、順序が担保されないらしい・・・
今回はIE対応のみなので、無視でよかった・・・
Chromeで同値の順序を担保するなら、
別の配列に順序を別のプロパティとして保存 → 同値なら順序を考慮してソートを実施。[jsfiddle](https://jsfiddle.net/HagaSpa/cuos1Ly3/)


```js

let array = [
    {'number': 1, 'value': 1},
    {'number': 2, 'value': 1},
    {'number': 3, 'value': 1},
    {'number': 4, 'value': 1},
    {'number': 5, 'value': 1},
    {'number': 6, 'value': 1},
    {'number': 7, 'value': 1},
    {'number': 8, 'value': 1},
    {'number': 9, 'value': 1},
    {'number': 10, 'value': 1},
    {'number': 11, 'value': 1}
];

// ソート対象の要素数が10より大きければ、v8エンジンはクイックソートを行う
array.sort((a,b) => {
	// 同値なら格納した順番を考慮
  if (a.value === b.value) {
		return a.number > b.number ? 1 : -1; 
	}
	return a.value > b.value ? 1 : -1; 
});

console.log(array);
```
[keras]中間層の出力


研究でCNNの中間層の出力を取得したいので，抽出する．

今回は学習済みモデルがあると仮定してCNNモデルのロードを行う．

* cnn_model.json : 学習モデルの構成
* cnn_model_weight : 学習モデルの重みデータ

過去記事 : [KerasでCNNを簡単に構築](https://qiita.com/sasayabaku/items/9e376ba8e38efe3bcf79)

# モデルのロード

```py
from keras.models import model_from_json

json_string = open('./keras_data/cnn_model.json').read()
model = model_from_json(json_string)

model.load_weights('./keras_data/cnn_model_weight.hdf5')

```

# モデルの確認

## 画像として保存

```py
from keras.utils.vis_utils import plot_model
plot_model(model, show_shapes=True)
```

## コンソールに出力

`model`インスタンスから`summary`メソッドを呼び出す

```py
model.summary()
```

# 中間層モデル

`plot_model`, `summary()`で確認した，レイヤ名を出力層にするモデルを再構築する．

```py
from keras.models import Model
layer_name = 'activation_4'
hidden_layer_model = Model(inputs=model.input, outputs=model.get_layer(layer_name).output)
```

# 出力層の確認

作成した，モデルが中間層の出力を行なっているか確認

```py
import cv2
import numpy as np

img = cv2.imread('./keras_data/face.jpg')
img = cv2.resize(img, (100, 100))
target = np.reshape(img, (1, img.shape[0], img.shape[1], img.shape[2])).astype('float') / 255.0

hidden_output = hidden_layer_model.predict(target)

hidden_output.shape

# (1, 1024) ← 中間層のサイズ
```

# Layerの更新を制限する
大体，中間層の出力をする場合は転移学習(fine-tuning)をすると思うので，追加でfitした場合に重みの更新をしないように制限する．

`layer.trainable`でその層が学習可能か設定できる．

```py
# 現在のモデル構成を確認
for i in range(len(new_model.layers)):
	print(i, new_model.layers[i], new_model.layers[i].trainable)
	
for layer in model.layers[:12]
	layer.trainable = False
```


# 参考
[kerasで処理の途中の値を取り出す - ぱたヘネ](http://d.hatena.ne.jp/natsutan/20170219/1487515186)
Windowsメモ

#IPv6無効
コントロール パネル->ネットワークとインターネット->ネットワークと共有センターのイーサネットのプロパティでIPv6を無効化
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241693/61d4f988-ee57-b3e5-51fb-0c59b9028e83.png)


ISATAP インタフェース無効化

```console
>netsh interface ipv6 isatap set state disabled
OK
```

6to4 インタフェース無効化

```console
>netsh interface ipv6 6to4 set state disabled
OK
```

Teredo インタフェース無効化

```console
>netsh interface teredo set state disabled
OK
```

インターフェース確認

```console
>netsh interface ipv6 show interface

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
```

参考：https://blogs.technet.microsoft.com/jpntsblog/2010/06/16/ipv6-ipv6-3/
Gethにおけるコントラクトのデプロイ、実行

gethとsolcをインストールしておく。
solcのパスを通す。

```:commandprompt
set PATH=%PATH%;(solc.exeが存在するフォルダのパス)
```

デプロイするコントラクトは以下。

```solidity:addition.sol
contract Addition{
  int num = 0;

  function add(int a){
    num += a;
  }

  function get() returns(int){
    return num;
  }
}
```

コンパイルする。

```:commandprompt
echo var additionOutput= >>addition.js
solc --optimize --combined-json abi,bin,interface addition.sol >> addition.js
```

gethを起動

```:geth
geth --networkid '33' --nodiscover --datadir ../ --rpc --rpcaddr "localhost" --rpcport "8545" --rpccorsdomain "*" console 2>> err.log
```

スクリプトを読み込む

```:geth
loadScript('addition.js')
```

abiを取り出す

```:geth
var additionContractAbi = additionOutput.contracts['addition.sol:Addition'].abi
```

contractオブジェクトを作成

```:geth
var additionContrat = eth.contract(JSON.parse(additonContractAbi))
```

binの頭に0xを追加(コンパイル済みであることを示す）

```:geth
var additionBinCode = "0x"+additionOutput.contracts['addition.sol:Addition'].bin
```

マイニングの開始とコントラクトを送信するアカウントのアンロック

```geth
miner.start()
personal.unlockAccount(eth.accounts[0])
```

コントラクタの送信、コントラクタインスタンスが返ってくる

```:geth
var deployTransactionObject = {from:eth.accounts[0],data:additionBinCode,gas:1000000}
var additionInstance = additionContract.new(deployTransactionObject)
```

コントラクトのアドレスを取り出し　コントラクトオブジェクトにセット

```:geth
var additionAddress = eth.getTransactionReceipt(additionInstance.transactionHash).contractAddress
var addition = additionContract.at(additionAddress)
```

コントラクトの実行
getは読み込みのみなのでcall()
addは状態を変化させるのでsendTransaction()

```:geth
addition.get.call()
addition.add.sendTransaction(36,{from:eth.accounts[0],gas:1000000])
```

[参考](https://medium.com/@gus_tavo_guim/deploying-a-smart-contract-the-hard-way-8aae778d4f2a)
ネットワーク変更後にインターネットに接続できない…

<h1>イーサネットをプチッと</h1>
普段使用してる有線のLinuxPC用ネット環境が１日だけ使えないとの事で、
その日は無線LANにてインターネットを接続することに。

しかし、Wi-Fi接続はしたもののインターネットに繋がらない。
インターネットに繋がらない時にまず確認する物理層から順に調査していましたがなかなか原因が掴めない。

どうすっかなーと何気なくpingを打ったら気にも止めていなかった部分が目についた。

<h1>ネットワークを変更したのにデフォルトゲートが変更前のネットワークになっていた</h1>
pingの送信元がネットワーク変更前のネットワークアドレスになっていた。
ふむ。そりゃ繋がらんわな。
普通ネットワークが切り替わればこの辺も自動でやってくれるんだろうけど
あいにくこの時使っていたPCは誰かがネットワーク設定も含め色々いじってあったので何かがいたずらしたんだろう。
`route`コマンドで調べたら、新しいネットワークのゲートウェイと変更前のネットワークのゲートウェイが両方定義されていた。
元のデフォルトゲートが削除されないまま残ってしかも優先度が高かったと判明。

というわけでサクッと変更

```command
$ sudo route del default gw 元のゲートウェイIP
```

これでデフォルトゲートウェイが新しいネットワークのものだけになり、
無事インターネットに繋がりました。

そして次の日、またネットワークを変更した際に同じ現象が起きて同じ対応で解決。
誰だ、ネットワーク設定したの（知らんがな）

<h1>まとめ</h1>
いつも意識しないで使えてる部分に不具合が起きると本当にハマる。
そこは問題ない、って思い込み怖いね。

こんな現象もあるんだなーと勉強になりました。
underscoreからdebounce と throttleだけ切り出す。

### underscoreは15kB. lodashは70kとそれぞれ通信サイズがある。debounceとthrottleだけ使いたい場合には少し重い。
### 数十行でそのまま切り出せる。
```js
(function(root){
  if(root._) return;
  var _={}; 
/*original by underscore.js*/
//line 1457
  _.now = Date.now || function() {
    return new Date().getTime();
   };
//line 850
 _.throttle = function(func, wait, options) {
    var context, args, result;
    var timeout = null;
    var previous = 0;
    if (!options) options = {};
    var later = function() {
      previous = options.leading === false ? 0 : _.now();
      timeout = null;
      result = func.apply(context, args);
      if (!timeout) context = args = null;
    };
    return function() {
      var now = _.now();
      if (!previous && options.leading === false) previous = now;
      var remaining = wait - (now - previous);
      context = this;
      args = arguments;
      if (remaining <= 0 || remaining > wait) {
        if (timeout) {
          clearTimeout(timeout);
          timeout = null;
        }
        previous = now;
        result = func.apply(context, args);
        if (!timeout) context = args = null;
      } else if (!timeout && options.trailing !== false) {
        timeout = setTimeout(later, remaining);
      }
      return result;
    };
  };
 //line 883
  _.debounce = function(func, wait, immediate) {
    var timeout, args, context, timestamp, result;

    var later = function() {
      var last = _.now() - timestamp;

      if (last < wait && last >= 0) {
        timeout = setTimeout(later, wait - last);
      } else {
        timeout = null;
        if (!immediate) {
          result = func.apply(context, args);
          if (!timeout) context = args = null;
        }
      }
    };

    return function() {
      context = this;
      args = arguments;
      timestamp = _.now();
      var callNow = immediate && !timeout;
      if (!timeout) timeout = setTimeout(later, wait);
      if (callNow) {
        result = func.apply(context, args);
        context = args = null;
      }

      return result;
    };
  };
  
  root._ =_;
})(this)  

```
Rhel7.4にWordpressを導入する

#1.はじめに
どうもこんにちは、こむぎです。今回は構築したWebサーバにWordpressを導入していこうと思います。
Wordpressを入れれば、誰でも簡単にホームページやブログを自分好みに作ることができます。


#2.この記事のゴール
Apacheを導入したRhel7.4に、wordpressを導入し、wordpressの画面を表示させるところまで。

#3.環境
Server：AmazonEC2
OS:Red Hat Enterprise Linux Server release 7.4(Maipo)

#4.主な導入パッケージ
**PHP**
PHP 5.4.16
**Mariadb**
10.1.31-1.el7
**wordpress**
wordpress-4.8-1

#5.手順

##5-1.root権限になる
以降のコマンド入力はroot権限で行う。

```
$sudo su 
```

##5-2.PHPの導入
###5-2-1.php php-mysqlのインストール

```
$yum install -y php php-mysql
```
###5-2-2.PHPのバージョン確認

```
$php -v
```

###5-2-3.PHP初期設定(タイムゾーンの変更)

```
$cp /etc/php.ini /etc/php.ini.org
$vi /etc/php.ini
```

```conf:php.ini
date.timezone= 
→date.timezone= "Asia/Tokyo"
```

##5-3.MariaDB 導入
###5-3-1.MariaDBのリポジトリを追加

```
$vi /etc/yum.repos.d/mariaDB.repo
```

```conf:mariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

###5-3-2.MariaDB-server MariaDB-clientのインストール

```
$yum install MariaDB-server MariaDB-client
```

###5-3-3.MariaDBの起動・有効化

```
$systemctl start mariadb
$systemctl enable mariadb
```

###5-3-4.mariadbパスワード変更
```
$mysql -u root
```

```sql:
mysql> update mysql.user set password=password('Password') where user = 'root';
mysql> flush privileges;
mysql> exit;
```

###5-3-5.設定したパスワードでログインできるか確認
```
$mysql -u root -p
```

###5-3-6.database(wp)の作成

```sql:
mysql> create database wp;
mysql> show databases;
```

##5-4.wgetインストール(入っていなければ）
```
$yum install wget
```

##5-5.Wordpressの導入
###5-5-1.wordpressを[http://ja.wordpress.org/](http://ja.wordpress.org/)からwgetして解凍する
```
$wget http://ja.wordpress.org/wordpress-4.8-1-ja.tar.gz`
$tar -zxvf wordpress-4.8.1-ja.tar.gz -C /var/www/`
```

###5-5-2. /var/www配下のディレクトリの所有者・グループをApacheに変更
```
$cd /var/www
$chown -R apache:apache *
```
###5-5-3.httpd.confのバックアップを取ったうえでコンフィグ編集
```
$cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
$vi /etc/httpd/conf/httpd.conf
```

```conf:httpf.conf
DocumentRoot "/var/www/html"
↓
DocumentRoot "/var/www/wordpress"


><Directory "/var/www/html">
 AllowOverride All
</Directory>
↓
<Directory "/var/www/wordpress">
 AllowOverride All
</Directory>
```
###5-5-4.httpdの再起動
```
$systemctl stop httpd
$systemctl start httpd
```


##5-6.Wordpressにアクセス
http://XXX.XXX.XXX/
(http.confでDocumentrootの変更により、上記アクセスで自動的に/wordpressにアクセスするようになっている)

#6.まとめ
今回はWordpressの画面を表示させるところまでの手順でした。次回は、Databaseについて触れていければと思います。
Wordpress上でDBのデータを表示させる方法や、wordpress上からDBにデータを追加する方法に触れていきたいです。

お疲れさまでした！
降圧チョッパ回路にPID制御を組み込む(Runge-Kutta法)

### C言語で降圧チョッパ回路における負荷電圧を数値解として算出する
まず、降圧チョッパ回路の負荷電圧波形を取り出せるプログラムをC言語で記述します。
数値解を求める手法は、Runge-Kutta法を使用します。降圧チョッパ回路では、負荷電圧がスイッチングのDuty比に依存します。よって、PID制御では、このDuty比を制御します。初期のDuty比を0.75とし、150[V]に整定した時点で、PID制御を行いDuty比が0.375つまり、負荷電圧が75[V]となる様に各変数を決定しました。比例ゲイン及び、積分ゲイン、微分ゲインは適性制御のゲインを特定しました。これらの数値解は、Gnuplotで出力します。

### 数値解算出
```C:DCDC_PID.c
#include<stdio.h>
#include<math.h>    //ライブラリの選択

#define L 7.7e-6
#define C 1
#define R 2.27e-3
#define end 1.0		//マクロ変数の定義

//各ゲインの値

//適正制御
#define kp 10000
#define ki 0.005
#define kd 50000


double func_IL(double Vo, double E) {

	return (E - Vo) / L;

}	//　インダクタ電流算出用関数

double func_Vo(double IL, double Vo) {

	return (IL - (Vo / R)) / C;

}	//　負荷電圧算出用関数

double func_U(double Vo, double f, double h, double Vn_1, double Vn_2) {

	double e = 75 - Vo;
	double e1 = 75 - Vn_1;
	double e2 = 75 - Vn_2;

	return (kp * e) + (ki * (f + (e * h))) + (kd*((e - e1) - (e1 - e2)));

}	//　PID制御算出用関数


int main() {

	int i, p, error;
	double E, Vo, Io, IL, t, U,Vn_1,Vn_2;
	double k, k1, k2, k3, k4;
	double e, e1, e2, e3, e4;
	double freq, h;
	double f;
	FILE *fp1;											// 変数の定義

	freq = 500;
	h = 1.0 / freq / 100.0;
	Vo = 0.0;
	Vn_1 = 0.0;
	Vn_2 = 0.0;
	Io = 0.0;
	IL = 0.0;
	U = 0.0;
	f = 0.0;
	p = 1;												//　各変数の初期化

	if ((error = fopen_s(&fp1, "DCDC_PID.txt", "w")) != 0) {

		printf("\nThis file can't opened \n\n");

		return 0;

	}									// データププロット用ファイル作成(負荷電圧)

	for (t = 0.0, i = 1; t < end; t = t + h, i++) {		// ルンゲクッタ法による演算

		if (t < 0.1) {									//150Vまで挙げる時のDuty比

			if (i >(100 * p - 25) && i < (100 * p)) {

				E = 0;

			}
			else {

				E = 200;

			}

			f = 0;

		}
		else {											//PI制御にかける際のDuty比

			if (i > (((100 * p) - 25) + (100 * U)) && i < (100 * p)) {

				E = 0;

			}
			else {

				E = 200;

			}

			f += (75 - Vo) * h;							//積分計算

		}

		if (i % 100 == 0) {

			p++;

		}

		k1 = func_IL(Vo, E);
		e1 = func_Vo(IL, Vo);							// 1回目の傾き算出

		k2 = func_IL(Vo + (h / 2)*e1, E);
		e2 = func_Vo(IL + (h / 2)*k1, Vo + (h / 2)*e1);	// 2回目の傾き算出

		k3 = func_IL(Vo + (h / 2)*e2, E);
		e3 = func_Vo(IL + (h / 2)*k2, Vo + (h / 2)*e2);	// 3回目の傾き算出

		k4 = func_IL(Vo + (h*e3), E);
		e4 = func_Vo(IL + (h*k3), Vo + (h*e3));			// 4回目の傾き算出

		k = (k1 + (2.0*k2) + (2.0*k3) + k4) / 6;
		e = (e1 + (2.0*e2) + (2.0*e3) + e4) / 6;		// 数値解導出用の傾き算出

		Vn_2 = Vn_1;
		Vn_1 = Vo;										// 微分計算用

		IL = IL + k*h;									// インダクタ電流算出
		Vo = Vo + e*h;									// 負荷電圧算出

		U = func_U(Vo, f, h,Vn_1,Vn_2);					//	Duty比の偏差算出

		fprintf(fp1, "%lf %lf\n", t, Vo);				//ファイルに負荷電圧を書き込む


	}

	return 0;											//プログラムの終了

}
```

### グラフ出力
グラフのデータは上記のプログラムにおいて、テキストファイルとして出力させます。
出力させたプログラムは、Gnuplotに渡し、波形を出力させます。

```ruby:PLOT.c
se grid
se xrange [0:1.0]
se yrange [0:170]
se xlabel "s[sec]"
se ylabel "Vr[V]"
plot "DCDC_PID.txt" using 1:2 with lines title "PI"
```
降圧チョッパ回路にPI制御を組み込む(Runge-Kutta法)

### C言語で降圧チョッパ回路における負荷電圧を数値解として算出する
まず、降圧チョッパ回路の負荷電圧波形を取り出せるプログラムをC言語で記述します。
数値解を求める手法は、Runge-Kutta法を使用します。降圧チョッパ回路では、負荷電圧がスイッチングのDuty比に依存します。よって、PI制御では、このDuty比を制御します。初期のDuty比を0.75とし、150[V]に整定した時点で、PI制御を行いDuty比が0.375つまり、負荷電圧が75[V]となる様に各変数を決定しました。比例ゲイン及び、積分ゲインは適性制御、不足制御、過制御の3つの組み合わせのゲインを特定しました。これらの数値解は、Gnuplotで出力します。

### 数値解算出
```C:DCDC_PI.c
#include<stdio.h>
#include<math.h>    //ライブラリの選択

#define L 7.7e-6
#define C 1
#define R 2.27e-3
#define end 1.5		//マクロ変数の定義

//各ゲインの値

//適正制御
#define kp 10000
#define ki 0.005

////不足制御
//#define kp 0.0009
//#define ki 0.05

////過制御
//#define kp 4
//#define ki 500


double func_IL(double Vo, double E) {

	return (E - Vo) / L;

}	//　インダクタ電流算出用関数

double func_Vo(double IL, double Vo) {

	return (IL - (Vo / R)) / C;

}	//　負荷電圧算出用関数

double func_U( double Vo,double f,double h) {
	
	return (kp * (75 - Vo)) + (ki * (f + ((75 - Vo) * h)));

}	//　PI制御算出用関数


int main() {

	int i, p, error;
	double E, Vo, Io, IL, t,U;
	double k, k1, k2, k3, k4;
	double e, e1, e2, e3, e4;
	double freq, h;
	double f;
	FILE *fp1;											// 変数の定義

	freq = 500;
	h = 1.0 / freq / 100.0;
	Vo = 0.0;
	Io = 0.0;
	IL = 0.0;
	U = 0.0;
	f = 0.0;
	p = 1;												//　各変数の初期化

	if ((error = fopen_s(&fp1, "DCDC_PI.txt", "w")) != 0) {

		printf("\nThis file can't opened \n\n");

		return 0;

	}									// データププロット用ファイル作成(負荷電圧)

	for (t = 0.0, i = 1; t < end; t = t + h, i++) {		// ルンゲクッタ法による演算

		if (t < 0.1) {									//150Vまで挙げる時のDuty比

			if (i > (100 * p - 25) && i < (100 * p)) {

				E = 0;

			}
			else {

				E = 200;

			}

			f = 0;

		}
		else {											//PI制御にかける際のDuty比

			if (i > (((100 * p )-25 ) + (100 * U)) && i < (100 * p) ){

				E = 0;

			}
			else {

				E = 200;

			}

			f += (75 - Vo) * h;							//積分計算

		}
	
			if (i % 100 == 0) {

				p++;

			}

		k1 = func_IL(Vo, E);
		e1 = func_Vo(IL, Vo);							// 1回目の傾き算出

		k2 = func_IL(Vo + (h / 2)*e1, E);
		e2 = func_Vo(IL + (h / 2)*k1, Vo + (h / 2)*e1);	// 2回目の傾き算出

		k3 = func_IL(Vo + (h / 2)*e2, E);
		e3 = func_Vo(IL + (h / 2)*k2, Vo + (h / 2)*e2);	// 3回目の傾き算出

		k4 = func_IL(Vo + (h*e3), E);
		e4 = func_Vo(IL + (h*k3), Vo + (h*e3));			// 4回目の傾き算出

		k = (k1 + (2.0*k2) + (2.0*k3) + k4) / 6;
		e = (e1 + (2.0*e2) + (2.0*e3) + e4) / 6;		// 数値解導出用の傾き算出

		IL = IL + k*h;									// インダクタ電流算出
		Vo = Vo + e*h;									// 負荷電圧算出

		U = func_U(Vo,f,h);								//	Duty比の偏差算出

		fprintf(fp1, "%lf %lf\n", t, Vo);				//ファイルに負荷電圧を書き込む


	}

	return 0;											//プログラムの終了

}
```

### グラフ出力
グラフのデータは上記のプログラムにおいて、テキストファイルとして出力させます。
出力させたプログラムは、Gnuplotに渡し、波形を出力させます。

```ruby:PLOT.c
se grid
se xrange [0:1.0]
se yrange [0:170]
se xlabel "s[sec]"
se ylabel "Vr[V]"
plot "DCDC_PI.txt" using 1:2 with lines title "PI"
```
cloud9で作ったrailsアプリケーションをherokuへデプロイする方法

#やりたいこと
cloud9で作成したrailsアプリケーションをherokuへデプロイして本番環境へ移行すること。初めてやった時に若干苦戦したのでその時の気持ちを思い出しながらメモ。

#デプロイ前に必要な変更

herokuではsqlite3が使用できないので下記の変更をする必要がある。

Gemfileのgem 'sqlite3'のところを下記に変更

```ruby:Gemfile

# Use sqlite3 as the database for Active Record
gem 'sqlite3', :group => [:development, :test]
# Use postgreSQL as the database for Active Record
gem 'pg', :group => :production

```

次にconfig/database.ymlを下記に変更

```ruby:config/database.yml
default: &default
  adapter: sqlite3
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  adapter: postgresql
  database: db/production.postgresql

```

#手順

1. githubでNew repositoryを作成。

2.（cloud9のターミナルで）

```lynx
$ git add .
```

3.（cloud9のターミナルで）

```lynx
$ git init
```

4.（cloud9のターミナルで）

```lynx
$ git commit -m "first commit"
```

5.（cloud9のターミナルで）

```lynx
$ git remote add origin https://〇〇...
```

6.（cloud9のターミナルで）

```lynx
$ git push -u origin master
```

7.（cloud9のターミナルで）

```lynx
$ heroku login
```

8.（cloud9のターミナルで）

```lynx
$ heroku create
```

9.（cloud9のターミナルで）

```lynx
$ git push heroku master
```

10.（cloud9のターミナルで）

```lynx
$ heroku run rake db:migrate
```

多分これでできるはずです。
PowerShellを使ってメッセージボックスを出力

##Powershellのメッセージボックス出力をやってみた件
沢山の変数を作成して、編集しやすいようにまとめておいた。
メッセージ以降は、どういう処理がいいか人それぞれだと思い、適当に記述を行った。

```posh
#-----------------------------------------------------------------------------
#■変数名
# $CHESEN = 確認ダイアログ内の確認文言
# $CHETIT = 確認ダイアログのタイトル
# $CHEKIN = メッセージボックスの種類  ("AbortRetryIgnore","OK","OKCancel","RetryCancel","YesNo")
# $CHEICO = メッセージボックスアイコン  ("None","Information","Warning","Error")
# $CHEBUT = デフォルトのフォーカス  ("button1","button2","button3")
# $result = メッセージボックスの結果確認格納変数
#---------------------------------------------------------------------------

#■変数格納箇所
$CHESEN = "テストを行います。"
$CHETIT = "最終確認"
$CHEKIN = "OKCancel"
$CHEICO = "None"
$CHEBUT = "button1"

#-----------------------------------------------------------------------------

#メッセージボックスを出力します。
Add-Type -Assembly System.Windows.Forms
$result = [System.Windows.Forms.MessageBox]::Show("$CHESEN","$CHETIT","$CHEKIN","$CHEICO","$CHEBUT")

#メッセージボックスのハンドリング
if($result -eq 'OK'){
                   $result = "処理を開始します。"
                  } else {
                          [System.Windows.Forms.MessageBox]::show("処理を終了します。","最終確認","OK","None","button1")
                          $result = "処理終了を確認しました。"
                         }
Write-Output $result
```
bitflyerストリーミングAPI(自分用メモ)

##やったこと
仮想通貨FXの自動取引ツールを使おうという発想のもとに、ストリーミングAPIが使えるのではないかということで使ってみた記録です。

bitflyerのストリーミングAPIは[pubnub](https://www.pubnub.com/)を使って配信しています。そこで、レファレンスにもある通りにログインし、bitflyerのアカウントを追加し、登録し、視聴するという手順をとります。

```python

import logging
import pubnub
import requests
 
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub, SubscribeListener
 
pubnub.set_stream_logger('pubnub', logging.DEBUG)
 
pnconfig = PNConfiguration()
 
pnconfig.subscribe_key = 'sub-c-52a9ab50-291b-11e5-baaa-0619f8945a4f'
 
pubnub = PubNub(pnconfig)
 
pubnub.add_listener(SubscribeListener())
pubnub.subscribe().channels("lightning_ticker_BTC_JPY").execute()


```

情報量が多すぎて処理が大変かつ、そこまでの量はいらないと判断したので、
REST_APIもかなりの頻度で叩けるのでそちらを使うことにした。
Tinkercad > UI > ルーラー > オブジェクトのサイズと位置を取得する | 変更できる

ブラウザ動作するAutoDeskのTinkercad。

ルーラーによりオブジェクトのサイズと位置を取得できる。

1. ルーラーを配置する
2. オブジェクトを選択する
    - オブジェクトのWidth, Depth, Heightが表示される (青色)
        - 右側の1.00はDepth (z軸方向の大きさ)
    - ルーラー原点からのオブジェクトの位置が表示される (緑色)
        - 画面外、右側にz軸の位置も表示される

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/e9b8c51b-38eb-fe4f-54a6-f5c31e937ca9.png)

ルーラー表示の状態ではオブジェクトのサイズが表示されたままのため、３方向のサイズ変更作業がしやすくなる。
さらに、Tabキーと組み合わせると、サイズ変更がしやすい。
グラデーションのボーダーを表現するCSSテクニック

# 問題提議

<p data-height="265" data-theme-id="dark" data-slug-hash="paBGEw" data-default-tab="css,result" data-user="toshifumi" data-embed-version="2" data-pen-title="Qiitaサンプル｜グラデーションのボーダーを表現するCSSテクニック" class="codepen">See the Pen <a href="https://codepen.io/toshifumi/pen/paBGEw/">Qiitaサンプル｜グラデーションのボーダーを表現するCSSテクニック</a> by toshifumi.imanishi (<a href="https://codepen.io/toshifumi">@toshifumi</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

上図のようなグラデーションのボーダーをCSSで表現する場合、`border-image`でグラデーションを表現しようかと思いますが、`border-image`と`border-radius`の併用ができません。

背景画像とコンテンツ用のHTML要素を2つ用意する方法もありますが、同様の考え方でなるべく無駄なマークアップを避けた方法を紹介します。

# 解決法

```html:HTML
<button class="button" type="button">CLICK ME</button>
```

用意していただくHTML要素は上記のみです。
`background`で白塗りとグラデーションの複数指定し、`background-clip`でそれぞれ異なる値を指定します。`border-color`は透過をあらわす`transparent`を指定しましょう。また背景はデフォルトでパディングボックスの左上を基準に配置されるので、`background-origin`でボーダーボックスに基準を合わせましょう。※便宜上、Sassを使用してます。

```scss:Sass
$color-white: linear-gradient(white, white);
$gradation: linear-gradient(90deg, rgb(194,107,163) 0%, rgb(142,114,155) 53%, rgb(108,92,140) 100%);
$width: 150px;
$height: 44px;
$boder-width: 2px;

.button {
  background: $color-white, $gradation;
  background-clip: padding-box, border-box;
  background-origin: border-box;
  border: $boder-width solid transparent;
  border-radius: #{$height/2} / 50%;
  width: $width;
  height: $height;
}
```
いかがでしたでしょうか？今回紹介したテクニックのようなマークアップとスタイルが混在しないコーディングを目指しましょう。

# 参考文献
[CSSシークレット ―47のテクニックでCSSを自在に操る](https://www.oreilly.co.jp/books/9784873117669/)
How to use PyCharm with X11 forwarding on CentOS7

# Overview

## Server settings

### Install X Window System

```
# sudo yum groupinstall -y "X Window System"
```

### Enable X11 forwaring

```
# vi /etc/ssh/sshd_config
 X11Forwarding yes
 X11DisplayOffset 10
 X11UseLocalhost no
# systemctl restart sshd
```

### Install fonts

```
# sudo yum install -y ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

### Install PyCharm

1. Download tar.gz from the Website
2. Unpack the tar.gz file
3. Run pycharm script (*)

```
 $ cd bin
 $ sh pycharm.sh
```
*) Run the script on a mosh terminal.

## Client Setting

### Install mobaXterm

- https://mobaxterm.mobatek.net/

Then connect to the server.

That's it !!
Carthageが途中で止まってしまう時の対処法メモ

# 状況
この状態のまま一時間たっても二時間たっても動かない・・・
<img width="488" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/48a9a133-7acc-9f09-40fa-a82f0fa061f9.png">
会社のPCだったら出来るのに自宅だとどうしてできないんだろうと思ってました

# 原因
SSH接続させてるgitのパスフレーズを自動で入力させる状態ではなかったから
(carthageではinput passphraseできないため)
会社でははるか昔にパスフレーズをキーチェーンに登録してたのを忘れてました

#　対処法
```
$ ssh-add -K ~/.ssh/id_rsa
```

.ssh/configで以下のように追加で設定しました

```
AddKeysToAgent yes
UseKeychain yes
```

## 追記
しばらくするとまたパスフレーズを入力する必要があるようになった
Carhageが途中で止まってしまうように

### 調査

```
$ ssh-add -l
The agent has no identities.
```
おや　いない・・

一回削除する

```
$ ssh-add -D
All identities removed.
```

登録する

```
$ ssh-add -K ~/.ssh/id_rsa
Identity added: /Users/{ユーザー名}/.ssh/id_rsa (/Users/{ユーザー名}/.ssh/id_rsa)
```

```
$ssh-add -l
◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯◯ /Users/{ユーザー名}/.ssh/id_rsa (RSA)
```

もう一回updateしてみる

```
carthage update --no-use-binaries --use-ssh --platform iOS
```

無事にできた

#　参考文献
https://h2ham.net/macos-sierra-use-keychain
https://parashuto.com/rriver/tools/setting-up-ssh-key-to-connect-to-github
SPAなCRUDアプリを作った際の5つの知見

# 目的
ReactもReduxもあんまり知らない状況から、50時間くらいかけて、みっちりReact+Material-UIなアプリを作った。忘れないように知見をまとめ、また共有する。想定読者は、「React+Reduxを触ったことがある」くらいな人とか、「1回だけReact+Reduxアプリを作ったことがある」くらいな人。

# 技術スタック

- サーバ側
  - Node
  - Express (Webフレームワーク)
  - FeathersJS (Expressで動作するRESTサーバ作成ライブラリ)
  - Passport (Expressで動作する認証ライブラリ)
- クライアント側
  - React
  - Redux
  - Material-UI v.1
- 開発環境
  - GCP t1.micro (開発マシン, 無料枠)
  - ssh + vim (コード書く用)
  - chrome (閲覧用, 開発ツール)
  - create-react-app (Reactのスターターキット)  

# 作るもの

シンプルなCRUDアプリ。百人一首を覚えたいなーというモチベーションがあったので、それを管理するアプリ。機能は以下: 

- CRUD機能
 - 百人一首の一覧、作成、編集、削除
- ログインユーザ用機能
 - お気に入り追加・削除
 - お気に入りの歌のみ一覧機能

スクリーンショット:

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/127424/ee9faeeb-adc5-f79d-ae7b-b1f8e74afeee.png)


アプリのうりはこんな感じ。技術スタックを反映したものなので、これといった独自性はない。

- リアクティブ
 - 画面遷移なし
 - SPA
- モバイルフレンドリー
 - ナビゲーションバー等
 - PWA ready

# 知見01: Material-UIは v1を使う

Material UI は、ver 0.x と ver 1.x がある。npmのデフォルトで入るのは ver 0.x であり、 ver 1.x は現時点(2018-Mar)ではベータだが、ver 1.x はもう1年以上開発してるし、オフィシャルでも使うよう推奨しているし、使い勝手がかなりよくなっているので、新しく使う場合は（商用での利用も含めて）、ver 1.x を採用しない理由がない。

私は最初、ver 0.x を使っていたのだが、ver 1.x にしてやっぱ断然書きやすいわーと思った。

インストールは

```
npm install --save material-ui@next
```

ドキュメントは https://material-ui-next.com

# 知見02: ReduxのDocは穴が開くほど読む

最近Qiita上では Redux が使いづれーわ みたいな論調があるが、どう考えてもRedux使わない方がつらい（まあ別の状態管理ライブラリを使えば？という異論はあるとおもう）。

Reduxが使いづらいと感じるのは Reduxの示す思想が身に染みてないからだと思う。公式ドキュメントをがっつり読んで、サンプルの ToDo アプリを穴が開くほど眺めて、どうしてこのような構成になっているのかを100%理解してから、自分のアプリの設計を始めるのが、急がば回れでいいと思う。自分はこの作業に20時間くらいはかけた。おかげで redux, react-redux に関してはかなり自信がついた。

ただ、redux-saga はいらないかなー。少なくとも非同期処理をしたいがために導入するのはちょっと大げさな気がする。実際今回は入れなかった(後述)。

# 知見03: CUD はまとまる/まとめろ 

SPAに限ったことじゃないんだけど、Create/Update/Delete は一つの View/Component にまとめるのが吉。ロジックもビューも似てるからね。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/127424/436efc41-61e4-ee96-c690-c164943a099b.png)

Createでは ID を空欄にしてdisable にするとか、Deleteではすべてのフィールドを disable にするとか、多少の味付けはしよう。

# 知見04: REST発行と状態同期

「RESTを発行してサーバの状態を変更し、成功したらローカルの状態を変更する」というのは非常に多くみられるパターンだ。サーバ状態の変更は、どうしても非同期になるので、非同期処理が挟まる状態管理になる。Redux Middleware を使わなくても、うまくいく。

具体的には、`mapDispatchToProps` で、propsに混ぜ込む関数を非同期にして、なかで `await` して結果を得たら `dispatch`する。サンプルコードではこんな感じ。お気に入り登録関数 `addFav(id)` を props に混ぜ込む。


```js
const mapDispatchToProps = (dispatch, ownProps) => ({
  addFav: async (id) => {
      await addFavToServer(id)
      dispatch(addFavToLocal(id))
    },
})
```

`addFavToServer()` がREST呼び出しをする非同期関数で、`addFavToLocal()`が Action Creator。


# 知見05: ファイルを分けすぎない

React+Redux で基本に忠実にアプリを書こうとするとファイル数がめっちゃ多くなる。さて、Reduxに関連する考え方に Ducks というのがある。Qiitaでも記事あるし、適当にググればいくらでも例があるので見てほしいが、要は密結合なのに別々の場所に格納するのはおかしいだろう、というのが発想の中心で、大いに賛同できる。

作ったアプリでは、以下を一つのファイル `mylogic.js` にまとめた。それでも100行に満たないサイズ。分ける必要なんてなかったんや。

- Action (そもそも定数定義すらしてない)
- Action Creator 9個
- Reducer 3つとそれを combine するコード
- createStore とサーバに状態の初期値を取りに行くコード
- exportするのは createStore した store 


# 最後に

はじめてSPA作ったけど、というかJavaScriptを本格的に触ったのも最近なんだけど、ほんとこの辺の技術の進化がすごすぎる。もうサーバサイドでごりごりアプリを書く時代は終焉するんだろうなーという予感をバリバリ感じた。
CodePenを使ってQiita上での表現をリッチにする - テーブルをソート

Qiitaの投稿でMDでテーブルを組んでいたんですが、ソートとかできると良いのになぁと思い、CodePenならできるやんと閃きました。


あまり外部のソースを使いたくなかったのでバニラのJSで書いてみました。
めっちゃ久しぶりです。

JSON部分を置き換えるだけで使えるようになっています。
良かったら是非どうぞ！

他にもCodePenを使えばQiitaの機能を拡張できそうです。

以下codepenでテーブル表現

# 仕事で覚えた単語ザックリ

<p data-height="1500" data-theme-id="0" data-slug-hash="oEVZJm" data-default-tab="html,result" data-user="kshimoji" data-embed-version="2" data-pen-title="oEVZJm" class="codepen">See the Pen <a href="https://codepen.io/kshimoji/pen/oEVZJm/">oEVZJm</a> by k.shimoji (<a href="https://codepen.io/kshimoji">@kshimoji</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>



# 感想
本来CodePenは書いたコードを実際に動かせる状態で共有するためのものだと思うのですが、埋め込みすることにより共有というよりも機能の拡張として使用することが出来そうです。

CodePenメチャ便利です。
PyQt5でGUIアプリをEXE化しようとしたらつまった話

# PyQt5 + Pyinstaller + Python2.x GUIアプリのビルド

##実行環境
- windows
- anaconda 2.x
- pyinstaller

##エラー
pyqt5を利用して作成したファイルをpyinstallerの以下のコマンドを利用して実行します。

```
pyinstaller {YOUR_SRIPTNAME}.py --onefile --noconsole -p "C:\Users\{YOUR_USERNAME}\Anaconda2\lib\site-packages\PyQt5\plugins\platforms"
```

ビルドされたexeファイルを実行しようとすると。。

```
This application failed to start because it could not find or load the Qt platform plugin "windows"
in "".
```

上記のエラーが出て動かない。。。なんでや。。。

##解決策
とりあえず必要なdllをexeと同じフォルダに入れることで解決しました。
- `\platforms`をexeの入ったフォルダの`/dist`以下にコピーする。
- `C:\Users\{YOUR_USERNAME}\Anaconda2\lib\site-packages\PyQt5`内のlibEGL.dllを`/dist`以下にコピーする。

exeにしたものの実行できなくて困っている方の参考になれば。

##参考
https://qiita.com/kanjirz50/items/930e9056076d04eecaec
https://stackoverflow.com/questions/17695027/pyqt5-failed-to-load-platform-plugin-windows-available-platforms-are-windo
【作りたいもの】golangでLCSVパーサ

メモ

LCSV (Labeled-CSV) のパーサがほしい
できればstruct tagのパースできるやつ

使い方は2種類あって、CSVパーサみたいに各行パースするやつと、JSON的にワンライナーの文字列をパースするやつ。

## イメージ（csvと同じ感じで）

```golang
values := `name: John, country: US, sex: male
name: Hana, country: JP, sex: female
name: Kim, country: CH`

var datum map[string]string
var err error
reader := lcsv.NewReader(strings.NewReader(values))
for err == nil {
    datum, err = reader.Read()
    fmt.Println(datum)
}
/* Output:
map[name:John country:US sex:male]
map[name:Hana country:JP sex:female]
map[name:Kim country:CH]
*/
```

## イメージ（jsonな使い方）

GoのStruct Tagは、`tagName:"HOST_NAME,required,default=example.com"`みたいな書かれ方しがち。
`tagName` をキーに `HOST_NAME,required,default=example.com` はカンタンに取得できるけど、
中身は各々勝手にルール決めてパースしてる感じ。
でも要はこれLCSVだよねと思うので、"クォーテーションできない(`Unquoted`)"、"値とラベルの区切り文字が`=` (`LabelSeparator('=')`)とかオプション指定できれば、json.Decoderみたいにやれそう。

```golang
var key string
var options map[string]string
tagValue := `required,default=example.com`
decoder := lcsv.NewDecoder(lcsv.Separator(','), lcsv.Unquoted(), lcsv.LabelSeparator('='))
if err := decoder.Decode(tagValue, options); err != nil {
    panic(err)
}
fmt.Println(options)
/* Output:
map[required: default:example.com]
*/
```

## メンドクサポイント

エスケープシーケンス。
CSVのあれは控えめに言ってうんこだから実装したくない。
`\ (backslash)` でいいじゃん。
備忘録

# ASP.NET Core
* [.NET Core で 実行ファイル（.exe）を作成する](http://kagasu.hatenablog.com/entry/2017/04/16/192117)
* [ASP.NET CoreにおけるDI(Dependency Injection)](http://ryuichi111std.hatenablog.com/entry/2016/07/17/102129)

# 非同期
* [Taskを極めろ！async/await完全攻略](https://qiita.com/acple@github/items/8f63aacb13de9954c5da)

# IoT
* RasbianのNodeをアンインストール

アンインストールを実行
```
$ sudo apt-get autoremove nodejs
```

コマンドの場所を確認する
```
$ which node
$ which npm
```

node_modulesの場所も確認
```
$ ls /usr/local/lib/node_modules/
```

削除実行
```
$ sudo rm -rf /usr/local/bin/node /usr/local/bin/npm /usr/local/lib/node_modules/
```
manなど残るけど気にしない。

その他設定ファイルも削除
```
$ sudo rm -rf ~/.npm/ ~/.nvm/
```

# その他
* [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d#format-text---%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E8%A3%85%E9%A3%BE)
Python matplotlib 凡例の位置とアルファ値の変更

まずは作例を．

![fig_hs_bc4.png](https://qiita-image-store.s3.amazonaws.com/0/129300/eaa50bd2-a8f7-512c-afe8-4c34db08719a.png)

凡例のアルファ値（透明度）の指定は下の記事からいただきました．

[https://qiita.com/hnii2006/items/2db5312fe4a4365734d0](https://qiita.com/hnii2006/items/2db5312fe4a4365734d0)

凡例の位置は```bbox_to_anchor=(xl,yl),loc='center'```で調整可能．
ただし，グラフの左下が（０，０），右上が（１，１）の座標系なので，それを考慮した座標計算が必要．作例の図では，下のコードのように，凡例描画のｘ座標をグリッドの真ん中に持ってくるようにしている．


```python:
    xl=(0.5*(np.min(x)+np.max(x))-xmin)/(xmax-xmin)
    yl=(0.5*(np.min(y)+np.max(y))-ymin)/(ymax-ymin)
    plt.legend(bbox_to_anchor=(xl,yl),loc='center').get_frame().set_alpha(1.0)
```

以　上
統計学入門(東京大学出版会)第二章　要約

・分析を始めるとき最初に行うのはヒストグラムをプロットする。
→その理由はデータによって峰が2つ以上ある分部(**双峰型**)は性質の異なるデータが混じりあっていることが多いため、何かでグループ分け(**層別**)をすると、峰が一つの分布(単峰型)が現れることが多く、**現象の基礎にある本質**が発見しやすいからである。
・「左・右に歪んだ分布」という表現だと何が歪んでいるのかわからないため、**裾が左・右に歪んだ**と覚えたほうがよい。裾の意味は「物の下方の部分」という意味で、例えば山のふもとを「裾野」という。
・間隔尺度→間隔のみが意味を持つ
・比尺度→倍の意味を持てる

##ヒストグラム・度数分布のルール
階級数は**スタージェスの公式**が参考になる。
ただし**データ数が100以下**に限って有効である。データ数が100以上だと少なすぎる階級数が算出されるため。

分布の両端に近いところで、中心付近と比較して度数が極端に小さい場合、階級の幅を広げることがよく行われる。
ヒストグラムで柱が分離している図は、階級幅が各階級で著しく異なっているか離散型(カテゴリー分け)データである。

##ローレンツ曲線とジニ係数
2つの異なるデータが与えられていて、、各データに対して累積相対度数を計算してそれぞれのカラムを縦軸・横軸でとってやると**ローレンツ曲線**が出来上がる。対角線から離れれば離れるほど、xにとってyは不平等・不均衡という意味を持つ。
**縦軸・yの累積相対度数が全て同じであれば対角線がプロットされる**。
また、三日月面積を三角形で割った値が**ジニ係数**である。

##平均・中央値・最頻値
###平均の種類
**算術平均**:日常でよく使う平均

```python
sample=[3,4,5]
mean=sum(sample)/len(sample)
```

**加重平均**:離散的なデータであり、同じ観測値をとる個体が複数存在する場合に使う。
各観測地に対して**度数をかけて**データの個数で割って算出する。

```python
df=pd.DataFrame({
                 '食事回数':[1,2,3,4,5],　#度数
                 '人数'    :[43,179,238,38,2]
                })

#加重平均
num=sum(df['人数'])
W_mean=(1*43+2*179+3*239+4*38+5*2)/num
```

**幾何平均**:%・率の平均を算出したいときにつかう。たとえば年平均気温とか。

```python
#幾何平均
import functools
import operator

rate=[1.218,1.305,1.536,1.500,1.129]

mul=functools.reduce(operator.mul,rate)
print(mul**(1/5))

#functools.reduceは引数の function(operator.mul) を iterable(rate) の要素に対して左から右に累積的に適用し、
#イテラブルを単一の値に縮約する。
#今回のreduceについて、reduce(lambda x, y: x*y, [1, 2, 3, 4, 5]) は ((((1*2)*3)*4)*5) という計算をする。
#左引数 x は累計の値で、右引数 y は iterable から取り出した更新値です。
```

**調和平均**：往復の平均時速などについて知りたいときに使う。

###平均・中央値・最頻値の大きさ
辞書順で
Mean>Median>Mode
と覚える。
裾が右に歪んでいるとき、峰は左に位置するので最頻値が一番小さいので
Mean>Median>Mode
である。

##平均偏差と標準偏差
平均偏差と標準偏差はともに分布の散らばらり程度を示す指標であるが、標準偏差がほとんど使われる。
理由は理論的に扱いやすいからである。
##変動係数
例えば40・20年前の所得平均をそれぞれ26・117万円・標準偏差を7.5・23.8万円とする。
標準偏差についてみると、およそ3倍の差があるので格差が増えていると言いいたいが平均も4.5倍くらい増えているのでその場合、**標準偏差/平均**という指標が使われる。これを変動係数と呼ぶ。平均を考慮したうえで、標準偏差を相対的に比較することができる。

##ジニ係数とエントロピーのpythonプログラム

```py
#問題2.2：平均差・ジニ係数を求めよ　　39ページ

def Dmean(a):
    sigma=0
    num=len(a)**2
    sigma_list=[]
    
    for i in range(len(a)):
        sigma=sum(abs(a[i]-a[:]))
        sigma_list.append(sigma)
        
    mean_diff=(sum(sigma_list))/num
    print('平均差: '+str(mean_diff))
    
    Gini=mean_diff/(2*np.mean(a))
    print('ジニ係数: '+str(Gini))

```

```py
#エントロピー
#式中のlogの底として何を選んでも、情報量の値が定数倍変わるだけなので、本質的な差はないものの、底としては2を選ぶことが多い。
#今回は10
import math
def Entropy(a):
    sigma_list=[]
    for i in range(len(a)):
        relative_freq=a[i]/100
        log=math.log(relative_freq,10)
        sigma_list.append(-relative_freq*log)
    ans=sum(sigma_list)
    print('エントロピー: '+str(ans))
    print(sigma_list)

```
検証用にAWSでプロキシ用のサーバを作ってみた話



## 目的 ##
検証用にプロキシサーバを用意する必要があったの調べてAWS上に作ってみたときの備忘録


## プロキシ用のサーバを作成 ##
※今回はAMI：Amazon Linux を使用
→無料の範囲内だったから。


### 大体の流れ ###
**○VPCの作成**
コンソールにて[VPCウィザードで作成]を選択
・VPCウィザードの起動
・[1個のパブリックサブネットを持つVPC]を選択
→VPC名、サブネット名を任意で入力


**○インスタンスの作成**
コンソールにて[インスタンスの作成]を選択
AMIはAmazon Linux AMI を選択
インスタンスタイプ：プロキシの確認だけなら無料枠のやつでいいと思われる
ストレージ容量もちょっとでOK
VPCで作成したネットワークやセキュリティグループを選択してインスタンスを作成
※秘密鍵を使用してSSH接続することになるのでDLしておく


**〇consoleにてサーバの設定**
セキュリティグループのインバウンドにSSH接続用の22とプロキシを使用する端末のIPとプロキシ用ポートを設定(今回は60088番ポートとした)
ここまでの作業完了後にSSHで接続できればOK

**SSH接続**
適当なツール(Teratermなど)をDLし、SSHで接続

以下あたりを参考にでもしてください。
http://dev.classmethod.jp/cloud/aws/aws-beginner-ec2-ssh/
デフォルトユーザ：ec2-user
IPとID(ec2-user)を入力し、AWSのコンソールからDLした秘密鍵(xxxx.pem)を指定するとログインできる
※パスワードではなく秘密鍵で認証になるのでコンソールからDLしたものを無くさないように。

## SSH接続後：プロキシの設定を行う：ここからがメイン ##

１． スーパーユーザに変更

    sudo su -

２．squidのインストール

    yum install squid -y

３．設定変更(Confの編集)

    vi /etc/squid/squid.conf

以下の部分を変更する
<pre>
# And finally deny all other access to this proxy
http_access allow all　←追加
http_access deny all
</pre>

<pre>
# Squid normally listens to port 3128
#http_port 3128　←先頭に#を追加
http_port 60088　←追加
</pre>
※注意点
・プロキシ用のポートを60088としている
・テスト環境なのでhttp_access allow allとしているが、本番の場合は固定IPを指定すること([した方がよい]ではなく[すること])

４．チェック

    squid -k parse
ワーニングが出ないように。
※ただし、今回は検証だったので hostname うんぬんのワーニングは無視した。

５．squidの再起動

    service squid start

ファイアーウォールなどについては今回は設定しない(セキュリティグループである程度はじけるし)


## 確認 ##
＜プロキシで隠蔽したい側のインスタンス＞
- リモートログインし、ブラウザなどでプロキシの設定を行う
- 適当なサイトで、プロキシサーバのIPが表示されることを確認
AmazonEC2(Rhel7.4)にApache(Webサーバ）を導入する

#1.はじめに
どうもこんにちは、こむぎです。Webサーバを構築する手順はいろいろ転がっていますが、記録のために自分も残しておこうという魂胆で記載しています。ですので参考になるかどうかは不明です。同じ環境の方なら参考になるかも。
まず始めは、Apacheを導入してrhelのページを表示させるところまで。

#2.この記事のゴール
Rhel7.4にApacheをインストールし、ブラウザでサーバのGrobal IPでアクセスしてRhelのページを表示させる。

#3.環境
Server：AmazonEC2
OS:Red Hat Enterprise Linux Server release 7.4(Maipo)

#4.主な導入パッケージ
**httpd**
httpd.x86_64               2.4.6-67.el7_4.6    @rhui-REGION-rhel-server-releases
httpd-tools.x86_64         2.4.6-67.el7_4.6    @rhui-REGION-rhel-server-releases
**firewalld**
firewalld.noarch           0.4.4.4-6.el7       @rhui-REGION-rhel-server-releases
firewalld-filesystem.noarch
#5.手順
####5-1. root権限になる
以降のコマンド入力はroot権限で行う。

```
$sudo su
```

####5-2. Apacheのインストール

```
$sudo yum -y install httpd
$systemctl enable httpd
$systemctl start httpd
```

#####5-2-1. StatusがActiveになっていることを確認

```config
$systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active:active (running) since Sun 2018-02-25 13:33:25 UTC; 5 days ago
```


####5-3.firewalldインストール・起動

```config
$sudo yum -y install firewalld
$systemctl enable firewalld
$systemctl start firewalld
```

#####5-3-1.StatusがActiveになっていることを確認

```config
$systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-02-24 17:14:18 UTC; 6 days ago
```

####5-4.firewallのゾーンにサービスを追加
```
$firewall-cmd --add-service=http --zone=public --permanent
```
####5-5.firewall設定の更新

```
$firewall-cmd --reload
```

####5-6.SELinuxの設定
SELinuxは細かいレベルで通信を遮断することができるが、他のサービスと競合する可能性が高く
想定の動作にならないことが多いため、無効化させる。
#####5-6-1.SEinuxの確認
```
$getenforce
```
Enforcing:有効状態
Permissive:無効状態

#####5-6-2.SElinuxの無効化
```
$setenforce 0
```
####6-7.iptables停止
```
iptables -F
```
####5-8.AmazonEC2のセキュリティグループ設定
インバウンドの設定でhttpとhttpsを許可する。

####5-9.ブラウザでアクセス
http://XXX.XXX.XXX.XXX/ ←GlobalIP

#6.まとめ
今回は、AmazonEC2のRhel7.4にApacheを入れ、Webサーバを構築するところまででした。ここまでは簡単ですね。他の方の記事を参考にして構築してみましたが、特に迷うことなく構築できました。次回は、構築したサーバにphpを導入してphpを動かすところまでやってみたいと思います。
お疲れさまでした。
active_adminのCSS/JavaScript置き場

active_admin は便利なんだけど、assets がアプリケーション全体に影響を与えてしまうのが困りもの。

その回避策としてよく見るのは、

app/assets/stylesheets/
├ public/
│├ application.css
│└ ...
└ admin/
　└ active_admin.css

みたいなファイルレイアウトにしてごにょごにょするというものなんだけど、ちょっとかっこ悪いので、

vendor/assets
├ stylesheets/
│└ active_admin.scss
└ javascripts/
　└ active_admin.js.coffee

というファイルレイアウトにして、

config/application.rb で

```
config.assets.paths << config.root.join("vendor/assets/javascripts")
config.assets.paths << config.root.join("vendor/assets/stylesheets")
```

config/initializers/active_admin.rb で

```
config.clear_stylesheets!
config.register_stylesheet 'active_admin.css'

config.clear_javascripts!
config.register_javascript 'active_admin.js'
```

という感じにしてみた。

うむ、悪くない (｡◉ᆺ◉)
[iOS] iOSアプリのアプリアイコンのリサイズを一度に行う

#[iOS] iOSアプリのアプリアイコンのリサイズを一度に行う
Mac OSX で、ImageMagickというツールを利用し、
コマンドで一度に画像のリサイズを行う方法です。

ImageMagickのダウンロードは以下から
https://www.imagemagick.org/script/download.php#macosx

以下でインストール

```
cd $HOME
tar xvzf ImageMagick-x86_64-apple-darwin17.2.0.tar.gz
```

必要なコマンドを書いたシェルスクリプト

```sh:iosappiconcreate.sh
export MAGICK_HOME="$HOME/ImageMagick-7.0.7"
export PATH="$MAGICK_HOME/bin:$PATH"
export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib"

mkdir iosappicon

magick $1 -resize 40x40 iosappicon/iPhone20pt2x_40px.png
magick $1 -resize 60x60 iosappicon/iPhone20pt3x_60px.png
magick $1 -resize 58x58 iosappicon/iPhone29pt2x_58px.png
magick $1 -resize 87x87 iosappicon/iPhone29pt3x_87px.png
magick $1 -resize 80x80 iosappicon/iPhone40pt2x_80px.png
magick $1 -resize 120x120 iosappicon/iPhone40pt3x_120px.png
magick $1 -resize 120x120 iosappicon/iPhone60pt2x_120px.png
magick $1 -resize 180x180 iosappicon/iPhone60pt3x_180px.png
magick $1 -resize 20x20 iosappicon/iPad20pt1x_20px.png
magick $1 -resize 40x40 iosappicon/iPad20pt2x_40px.png
magick $1 -resize 29x29 iosappicon/iPad29pt1x_87px.png
magick $1 -resize 58x58 iosappicon/iPad29pt2x_58px.png
magick $1 -resize 40x40 iosappicon/iPad40pt1x_40px.png
magick $1 -resize 80x80 iosappicon/iPad40pt2x_80px.png
magick $1 -resize 76x76 iosappicon/iPad76pt1x_76px.png
magick $1 -resize 152x152 iosappicon/iPad76pt2x_152px.png
magick $1 -resize 167x167 iosappicon/iPadPro83_5pt2x_167px.png
magick $1 -resize 1024x1024 iosappicon/AppStore1024pt_1024px.png
```

以下で実行

```
iosappiconcreate.sh xxx.png(元になる画像)
```
Xcodeでinjectionforxcodeを使って見た

##はじめに
- [try! Swift 2018 in Tokyo](https://www.tryswift.co/events/2018/tokyo/jp/)の[開発者ツールと経験への時間投資](https://www.tryswift.co/events/2018/tokyo/jp/#tools)のセッションの中で取り上げられた[johnno1962/injectionforxcode](https://github.com/johnno1962/injectionforxcode)を試して見ました

## injectionforxcodetとは
> Runtime Code Injection for Objective-C & Swift

- アプリを実行中に動的にコードを追加できるツールです

## 環境
```
Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
Target: x86_64-apple-macosx10.9
Xcode Version 9.2 (9C40b)
```

## 導入方法
1. [johnholdsworth.com/injection](http://johnholdsworth.com/injection.html)からXcode9に対応したものをダウンロードする
2. ダウンロードしたzipを解凍し、インストールする
3. システム環境設定→ キーボード　→ ショートカットで`inject　Source`のショートカットキーを有効にする
<img width="652" alt="スクリーンショット 2018-03-03 9.41.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/63985/5ea57547-211e-729d-2082-ea6ed00b994c.png">

## 実装
1. runtime時に動的に追加したいUIViewControllerに`@objc func injected()`あるいは`INJECTION_BUNDLE_NOTIFICATION`をnameにしたNotificationCenterを追加
2. アプリを起動させる
3. 追加したいコードを追加
4. 変更したファイルを保存する
5. `Control + =`のショートカットキーを押すと動的に追加したコードが実行される

## サンプルコード
- [takuchantuyoshi/Inject-Sample](https://github.com/takuchantuyoshi/Inject-Sample)

## 参考リンク
- [johnno1962/injectionforxcode](https://github.com/johnno1962/injectionforxcode)
- [Code Injection for XcodeOrta Therox@orta](http://artsy.github.io/blog/2016/03/05/iOS-Code-Injection/)
- [Quick Start: Hot reloading in Swift](https://karlbowden.com/quick-start-hot-reloading-in-swift/)
- [How To Be The iOS Team Hero: Add Hot Reloading to Xcode 9](https://medium.com/@robnorback/the-secret-to-1-second-compile-times-in-xcode-9de4ec8345a1)
DjangoRESTFrameworkのCurlテストをシェルスクリプトでコマンド一発で終わらせる方法

（この記事は自分のブログの転載になります）
[DjangoRESTFrameworkのCurlテストをシェルスクリプトでコマンド一発で終わらせる方法 - まわ](http://k-mawa.hateblo.jp/entry/2018/03/03/104302)


DjangoRESTFrameworkでWebAPIが段々増えてくると、curlテストが面倒になってきませんか？？　それをシェルスクリプトで一気にやってしまおうというと思い下記のようなシェルスクリプト運用をしてみて、便利だったので誰かの役に立つかもしれないのでお伝えします〜^^ （シェルスクリプト初チャレンジなので記載コードの要領が悪いかもしれませんが、そのあたりはすみません）

以下の要領でシェルスクリプトを作っておきます

curltest.shというファイル名にします

```sh
#!/bin/sh

BASEURL="http://127.0.0.1:8000"; #ローカルでDjangoのrunserverのurl
HEAD="Content-Type:application/json";
DIR=".";
SETDT=`date "+%Y%m%d%H%M"`
TITLE="curl_test"

echo "curl_test start\n" >> $DIR/$SETDT$TITLE.txt;
sleep 1;

#以下、テスト項目をエンドポイント別にAPIを作るごとにどんどん書いていく

#例
#get test
ENDPOINT="/api/hogefuga/list";
echo "curl_test endpoint:${ENDPOINT}" >> $DIR/$SETDT$TITLE.txt;
curl -X GET -H $HEAD ${BASEURL}${ENDPOINT} >> $DIR/$SETDT$TITLE.txt;
echo '<===リスト一覧がでていれば成功です！' >> $DIR/$SETDT$TITLE.txt;
echo "curl_test end\n" >> $DIR/$SETDT$TITLE.txt;


#PUT POSTでデータを付加する場合の例
DATA='{"email":"info@hoge.com","password":"HogeFUGa1111"}';
#curl のところに　-d $DATA を追加でできます
```
できましたら、実行コマンドを打ちます

```sh

$chmod 755 curltest.sh

で、
$ ./curltest.sh

もしくは
$ sh curltest.sh
```
で、シェルスクリプトの配置ディレクトリにテスト結果のtxtファイルが日付つきで保存されます。

###参考文献

[初心者向けシェルスクリプトの基本コマンドの紹介](https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337)
どこにいても大丈夫！リポジトリURLをpecoって開く

# デモ

![gh-open.gif](https://qiita-image-store.s3.amazonaws.com/0/36122/831d87ac-6e13-170d-bbaa-fbc549307399.gif)

# 必要なもの

- [peco](https://github.com/peco/peco)
- [Go](http://golang-jp.org/)
- [ghq](https://github.com/motemen/ghq)
- [gh-open](https://github.com/typester/gh-open)

# 設定

次の記述を `~/.zshrc` に追記します。他のシェルだと少し記述が異なると思います。

```~/.zshrc
function peco-gh () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="gh-open ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-gh
bindkey '^[' peco-gh
```

ショートカットはお好みで変更することが可能です。追記後に反映します。

```
$ source ~/.zshrc
```

# 動作

`Ctrl+[` で clone したプロジェクトが一覧表示されるので、開きたいものを選択して `Enter` キーを押すとブラウザからそのリポジトリが開きます。

これはどのディレクトリから実行してもOK。
Sympyによる因数分解

まず、文字式が使えるように文字x,y,zを準備する

```python
>>> import sympy
>>> x,y,z = sympy.symbols('x,y,z')
```

sympyのfactor関数を使えば、整式を因数分解してくれる。


```math
x^2-y^2=(x-y)(x+y)\\
x^2+3x=x(x+3)\\
2x^2+3x+1=(x+1)(2x+1)
```



```python
>>> A1=x**2-y**2
>>> sympy.factor(A1)
(x - y)*(x + y)
>>> A2 = x**2+3*x
>>> sympy.factor(A2)
x*(x + 3)
>>> sympy.factor(2*x**2 + 3*x + 1)
(x + 1)*(2*x + 1)
```

難しめの因数分解もしてくれる。

```math
(2x-1)(x+4)-(x-6)(x-2)=(x - 1)(x + 16)\\
x^3+y^3+z^3-3xyz=(x+y+z)(x^2-xy-xz+y^2-yz+z^2)
```

```python

>>> A3=(2*x-1)*(x+4)-(x-6)*(x-2)
>>> sympy.factor(A3)
(x - 1)*(x + 16)
>>> sympy.factor(x**3+y**3+z**3-3*x*y*z)
(x + y + z)*(x**2 - x*y - x*z + y**2 - y*z + z**2)
```




ただし、

```math
x^2-5=(x+\sqrt{5})(x-\sqrt{5})\\
x^2+5x+1=(x- \frac{-5+{\sqrt{21}}}{2})(x- \frac{-5-{\sqrt{21}}}{2})

```

のような無理数を含む式には因数分解してくれない。

```python
>>> sympy.factor(x**2-5)
x**2 - 5
>>> sympy.factor(x**2+5*x+1)
x**2 + 5*x + 1
```

複素数の範囲での因数分解も然り。

```python
>>> sympy.factor(x**3+1)
(x + 1)*(x**2 - x + 1)
>>> sympy.factor(x**2+1)
x**2 + 1
```

また分数が入った式を展開すると、分数が計算されて小数表記になる。
（sympyのexpand関数を使えば、整式を展開してくれる。）
しかし、その式を因数分解すると挙動がおかしくなる。
何故かわからないが・・・

```math
(x+\frac{1}{2})(x+1)=x^2+1.5x+0.5\\
x^2+1.5x+0.5=1.0(0.5x-0.5)(1.0x+0.5)

```


```python
>>> sympy.expand((x+1/2)*(x+1))
x**2 + 1.5*x + 0.5
>>> sympy.factor(x**2 + 1.5*x + 0.5)
1.0*(0.5*x + 0.5)*(1.0*x + 0.5)
```

これを解消するためにはRational関数を使って分数を有理数として表現する。

```math
(x+\frac{1}{2})(x+1)=x^2+\frac{3}{2}x+\frac{1}{2}\\
x^2+\frac{3}{2}x+\frac{1}{2}=\frac{(x+1)(2x+1)}{2}

```



```python
>>> A1=(x+sympy.Rational(1,2))*(x+1)
>>> A1
(x + 1/2)*(x + 1)
>>> sympy.expand(A1)
x**2 + 3*x/2 + 1/2
>>> A2=x**2 + sympy.Rational(3,2)*x + sympy.Rational(1,2)
>>> A2
x**2 + 3*x/2 + 1/2
>>> sympy.factor(A2)
(x + 1)*(2*x + 1)/2
```
スマートスピーカーが理解できるおすすめ動画

# 1. はじめに
スマートスピーカーが理解できるおすすめ動画をまとめてみました。
少し長めの動画もありますが、これからのスマートスピーカー市場を理解できる内容でおすすめです。
ぜひ、ご覧ください。

# 2. GoogleHome Googleアシスタント開発について
- [YouTube：スマートスピーカー勉強会②（Google Home対応アプリを作ろう）](https://youtu.be/eBxAgIxDJ5w)
内容：[がおまる](https://twitter.com/gaomar)先生による、[SmartHacks](https://smarthacks.jp/) 様主催の スマートスピーカー勉強会 の動画、Googleアシスタント 音声アプリの基礎、概念解説です！ちょっとだけ、[ちょまど](https://twitter.com/chomado)さんが出演されております。|ω・)

- [YouTube：スマートスピーカー勉強会③（Google Homeアプリ作成ハンズオン）](https://youtu.be/PseJhHzjgnk)
内容：[スマボス](https://twitter.com/smaboss)さんによる、Googleアシスタント 音声アプリの作成解説です！Actions on Google、Dialogflow、Webhookの使い方を惜しみもなく披露した、神動画です。

# 3. GoogleHome Dialogflow について
- [YouTube：Google Homeを遊びたおす会③（Dialogflow tips by Fish）](https://youtu.be/ZnQWgnxg_kE)
内容：[fish](https://twitter.com/canoefishing)先生による、[Google Homeを遊びたおす会](https://kotodama.connpass.com/event/79768/presentation/) での動画。GoogleHomeアプリ開発にかかせない、Dialogflowの基礎、学べます。

# 4. Google Assistant SDK について
- [YouTube：Google Assistant on Raspberry Pi](https://youtu.be/tt-gOQSYbcQ)
内容：Raspberry PiでGoogleアシスタントを動かす動画（英語）。

# 5. Amazon Echo Alexaスキルの開発について
- [第1回 初めてのスキル開発](https://youtu.be/oy87jElcrAU)
- [第2回 対話モデルとAlexa SDK](https://youtu.be/W4CndeuW58Q)
- [第3回 音声ユーザーインターフェースの設計](https://youtu.be/2inokuKmrEA)
- [第4回 データの保存](https://youtu.be/orq3UsFNRc4)
- [第5回 アカウントリンクとホームカード機能](https://youtu.be/vVIXablTgLg)
- [第6回 スキルの審査と公開](https://youtu.be/a-Bhthx8HRQ)
[参考：Alexaスキル開発トレーニング](https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill#%E7%AC%AC1%E5%9B%9E %E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E9%96%8B%E7%99%BA)  

  

- [YouTube：Alexaスキルを作ろう！開発ハンズオン](https://youtu.be/8Q7pxHRSNl8)
内容：わたしによる、Alexaスキルの解説動画です。Alexaの基礎、インテント、スロットについて60分の動画でまなべます。

# 6. スマートスピーカー市場について
- [YouTube：スマートスピーカー勉強会①（スマートスピーカー市場の今）](https://youtu.be/Kv2jlnoA7l4)
内容：[SmartHacks](https://smarthacks.jp/) 様主催の スマートスピーカー勉強会 の動画、2018年3月時点のスマートスピーカー市場について理解できます！
- [スマートスピーカー勉強会④（ちょまどさんインタビュー）](https://www.youtube.com/watch?v=2hwzjIglXIs)

# 7. おわりに
いかがでしたか、みなさまからのおすすめ動画がありましたら、ぜひコメント欄にご記入をおねがいします。