OmniAICreator/Qiita-1.07M huggingface dataset:
nodebrewで最新のLTSをインストールする

node.jsのv8.9.0(LTS)がリリースされました。

`nvm`を使っている人は、

```shell-session
$ nvm i --lts
```
でインストールできるらしいです（https://github.com/creationix/nvm#long-term-support ）。素敵です。

でも自分は`nodebrew`派なので`nodebrew`でLTSインストールができるか調べてみました。

結論としては、そんなオプションはありません。悔しい。
参考：https://github.com/hokaccha/nodebrew/issues/47

[こっち](https://github.com/nodejs/Release/issues/54)で「https://nodejs.org/download/release/index.json のバージョンリストに`lts`フラグが立ってるからパースしてよ」て提案があったので、`jq`でパースしてみました。

**(2020/09/26) @yousan さんの改善提案を受けて、記載も修正しました。**

```shell-session
$ curl -s https://nodejs.org/download/release/index.json | jq -r 'map(select(.lts != false)) | .[].version' | sort -V | tail -1
```
まず`curl`でバージョンリストを取ってきて、~~先頭が最新になるように並べ直して（もともとそうなんだろうけど念のため）、~~次に jq で `lts`プロパティが`false`じゃない（LTSのコードネーム、`Argon`とか`Boron`とか`Carbon`とか書いてある）もののバージョン番号だけを抽出し、最後に sort で**バージョン番号として**並び替え、最新~~最初~~の一つのバージョン番号を出力しています。

\# ~~今8系のLTSが出た状態で、この後に6系のLTSのアップデートがリリースされると、日付でソートすると6系が先頭に来るので、意図しないバージョンが取れてしまうかもしれません。~~ 最新の LTS だけが取れるようになりました。


ちょっと長いので、エイリアスにした方がいいかもしれません。

```shell-session
$ alias nodelts="curl -s https://nodejs.org/download/release/index.json | jq -r 'map(select(.lts != false)) | .[].version' | sort -V | tail -1"
$ nodelts
v8.9.0
```

`nodebrew`と組み合わせるとこんな感じでしょうか。

```shell-session
$ # ソースから
$ nodebrew install $(curl -s https://nodejs.org/download/release/index.json | jq -r 'map(select(.lts != false)) | .[].version' | sort -V | tail -1)
$ # エイリアス版
$ # nodebrew install $(nodelts)
```

```shell-session
$ # バイナリを直接
$ nodebrew install-binary $(curl -s https://nodejs.org/download/release/index.json | jq -r 'map(select(.lts != false)) | .[].version' | sort -V | tail -1
$ # エイリアス版
$ # nodebrew install-binary $(nodelts)
```
Link > Compressed Sensing in Python by Robert Taylor

元の画像の10%などの少数の点から元画像を再現する手法としてCompressed Sensingというものがある。
[Wikipedia](https://ja.wikipedia.org/wiki/%E5%9C%A7%E7%B8%AE%E3%82%BB%E3%83%B3%E3%82%B7%E3%83%B3%E3%82%B0)
Sparseな値に対しては有効と言われているようだ。

その説明とPython実装がある。
[Compressed Sensing in Python](http://www.pyrunner.com/weblog/2016/05/26/compressed-sensing-python/) at pyrunner (Robert Taylor)

### キーワード

- compressive sensing
- compressive sampling
- sparse sampling
- L2 norm
    - least squares fitting
    - outliers に弱い
- L1 norm
- [cvxpy](http://www.cvxpy.org/en/latest/)
- simple signal
    - Kutz
- dct()
    - Discrete cosine transform
- idct()
- axis
    - axis = 0 (MATLAB default)
        - keeps the matrix operator in front of the operand
            - dct() Y
    - axis = 1 (SciPy detault)
        - Y dct()
- [numpy.kron](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.kron.html)
    - Kronecker product
- >  The Kronecker-based method, although easy to implement, proves unusable for large images.
    - L-BFGS algorithm
        - its variant OWL-QN
    - [libLBFGS](http://www.chokkan.org/software/liblbfgs/)
    - [PyLBFGS](https://bitbucket.org/rtaylor/pylbfgs)
    
```math
A = \phi\psi
```

### 備考

一次元の信号においてfrequency domainのsparsityを利用して、CS手法で再現している。tが小さい領域の再現がうまくいっていないようだ。

10%のサンプルからCS手法を用いて画像の再現がされている。
ある程度の再現は可能であるが、影の部分などでおかしな結果になっている。
またエッジがぼやけた結果になっているようにも思われる。

CS手法による再現結果をそのまま信用して計算に用いると失敗する場合もありそうだ。

以下の論文などでは再現結果の精度は高いように図示されている。
[Fast analysis of multi-static scattering problems with compressive sensing technique](http://www.sciencedirect.com/science/article/pii/S0022407317300079)
テストのために即時関数の内部関数を輸出する

テストのために即時関数の内部関数を輸出する

#概要
html内の即時関数をどのようにテストするか考え、uni2vec開発中に適用しました。

- 即時関数実行の最後で、テストしたい関数をオブジェクトに詰めて返します(例ではexports for test)。
- 即時関数実行の返却値を変数に設定します(例ではmypackage)。
- テスト用htmlで対象htmlを内部フレームで読み込みます。
- テスト用htmlで対象フレームの輸出された変数を読み込み、実体に詰め込まれた関数を取り出します(例では`onst mypackage = window.frames[0].mypackage;`)。
- リリース時は輸出オブジェクトを返さないようにするか、変数への設定をやめます。

#例

```html:target.html
<!DOCTYPE html>
<html>
<head>
<script defer="defer">
;mypackage=(function(){
"use strict";

function plus(a, b) {
	return a + b;
}

function PlusManager(a) {
	this.a = a;
}
PlusManager.prototype.plus = function(b) {
	return plus(this.a, b);
};

// exports for test
return {
	plus:plus,
	PlusManager:PlusManager,
};
})();
</script>
</head>
<body>
</body>
</html>
```

```html:targettest.html
<!DOCTYPE html>
<html>
<head>
<script defer="defer">
;(function(){
"use strict";
function assertEquals(actual, expected) {
	const a = JSON.stringify(actual);
	const e = JSON.stringify(expected);
	console.assert(a === e, '\nact: ' + a + '\nexp: ' + e);
}
window.addEventListener('DOMContentLoaded', function() {
setTimeout(function() {
	const mypackage = window.frames[0].mypackage;
	
	assertEquals(mypackage.plus(1, 2), 3);
	
	const plusManager = new mypackage.PlusManager(1);
	assertEquals(plusManager.plus(2), 3);

	console.log("done");
}, 3000);
}, false);
})();
</script>
</head>
<body>
<iframe src="target.html" width="100" height="100"></iframe>
</body>
</html>
```
日記アプリのMVP化工程記録・3

# 言うは易く行うは難し
工程化記録って銘打ってるので、上手くいかない時でも投稿しようと思います。
きっと次回の投稿では解決しているでしょう、きっとそうです。

[GitHub](https://github.com/poin-settia/Diary/commit/2f311acc088b77f29e4ae9f6f5ea8acf554a65b3)には現状でプッシュしておきましたが、残念ながら正常に動いていません。
今回は*こう実装しても動かない*っていう記事になります。（なんだそりゃ）
理屈では色々述べられるけど、実際に動かすと上手くいかない良い例ですね。

# RxJava2の導入

[前回の記事](https://qiita.com/poin-settia/items/be18d0ca677efd57c3c7)の最後に

> きっとRepositoryの移管作業らへんでRxJavaを導入しそうな気配。

だなんて書きましたが、気配はすぐそこにありました。
ちなみに導入の方法は

```java:build.gradle
dependencies {
    compile "io.reactivex.rxjava2:rxjava:2.0.1"
}
```
を加えただけです。

## 導入の経緯
Fragmentに書いたDB操作処理をRepositoryに移管する作業の初っ端からRxの導入する機会にぶつかりました。ありがたいことです。
MVP化の順序として
*・１つのイベントを契機に、そのイベントの一連の操作が完了するように実装を修正していく*
という形を取ったのですが、最初のイベントがリストの初期表示でした。
コメントで記載している
> ★リスト初期表示イベント・Presenter

に当たります。
Presenter.initList()が該当しますが、期待する機能は
1. Repository.getFirstList()を実行し、完了の通知を受け取る
2. 初期表示するべきリストデータ(RealmResults)が１つ以上あるならView.showList()を実行してFragmentにリスト描画を依頼する
というものです。

上記の*実行し、完了の通知を受け取る*の部分がRxJavaで実現するべきところかなと。

# Single
まずはRepositoryにRealmDBの検索処理を移管します。

```java:PersonRepository
    public Single getFirstList() {

        return Single.create((SingleOnSubscribe<RealmResults<Person>>) emitter -> {
            try {
                RealmResults<Person> results = mRealmHelper.findAll();
                emitter.onSuccess(results);
            } catch (Exception ex) {
                emitter.onError(ex);
            }
        });
    }
```
戻り値で検索成功ならonSuccessを、失敗ならonErrorが通知される目論見です。

次に通知を受ける側のPresenterの実装です。

```java:PersonPresenter
    public void initList() {
        mRepository.getFirstList()
                .subscribeOn(Schedulers.io())
                .observeOn(Schedulers.single())
                .subscribe(new DisposableSingleObserver<RealmResults<Person>> () {
                    @Override
                    public void onSuccess(RealmResults<Person> results) {
                        if (results.size() != 0) {
                            mView.showList(results);
                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        // error
                    }
                });
    }

```

冒頭に書きましたが、上手くいっていません。
正確に記述するとRepositoryの時点でonErrorが実行され、PresenterのonErrorが通知されてしまいます。
ポジティブに考えれば、少なくとも通知の機能は動いてるようです。

Rxに慣れ親しんだ方が読めば、きっと盛大な間違いや勘違いに気づかれるかと思いますが、
現状分かっているのは
 *emitterがnullの為、RepositoryのonSuccessが実行されない* って事くらいです。

何者なのだ、emitter・・・（要検索案件）

# 次回は
次の記事が投稿される時にはもちろん解決策を提示する予定です。
MVP化が完了する時に、これらの軌跡が参考になれば良いのですが。。
CentOS6でH2Oを利用したphp phalconの設定

via https://qiita.com/inouet/items/0a90314811a379984f9c

#兎に角、インストール
```bash
sudo yum -y install gcc make php php-devel

git clone http://github.com/phalcon/cphalcon.git
cd cphalcon/build
sudo ./install
```

#php.iniの設定

/etc/php.d/phalcon.ini を作成し下記を記述

```
extension=phalcon.so
```
#インストールの確認
```
php -i |grep phalcon
```
下記のように出力されればOK

```
/etc/php.d/phalcon.ini,
phalcon
phalcon => enabled
....
```

#Phalconの環境の設定
```bash
sudo mkdir /var/www/phalcon

git clone git://github.com/phalcon/phalcon-devtools.git
sudo mv phalcon-devtools /usr/local/src
cd /usr/local/src/phalcon-devtools
. ./phalcon.sh 

cd /var/www/phalcon
sudo chmod 777 ./
phalcon create-project sample micro
```
*chmod 777は簡便のためにやっているので各々セキュリティー的に適切なパーミッションを設定してください。
以下のように表示されれば成功。
```
 Success: Project 'sample' was successfully created.
Please choose a password and username to use Database connection. Used default:'root' without password.  
```

#php-fpmの設定
via https://qiita.com/ykyk1218/items/c859870ef8dac79f5e1c
使用しているPHPによってインストールコマンドが変わる（remiのリポジトリを/etc/yum.repos.d/に設定していること）
***をバージョンで指定してください。例：php 5.5だったら55

```bash
sudo yum --enablerepo=remi-php*** install php-fpm

sudo /etc/init.d/php-fpm start
```



#H2Oの設定
via https://qiita.com/thisprogrammer/items/36bd73c600d7518ac974

```bash
sudo chown apache:nobody /var/www/phalcon/sample

sudo nano /etc/h2o/h2o.conf
```

以下の設定ファイルをコピペ

```
user: nobody
access-log: /var/log/h2o/access.log
error-log: /var/log/h2o/error.log
pid-file: /var/run/h2o/h2o.pid

hosts:
 "phalcon-sample":
  listen:
   port: 8080
   host: 0.0.0.0
  paths:
   "/":
    file.dir: /var/www/phalcon/sample/public
    redirect:
     url: /index.php/
     internal: YES
     status: 307

file.custom-handler:
 extension: .php
 fastcgi.connect:
  host: localhost
  port: 9000

```

保存できたらH2O起動
```
sudo /etc/init.d/h2o start
```
NetFlow v5 を fluentd-docker で受け取る方法

OpenvSwitch240 on RaspberryPi2 して、OVS上に定義した Bridge 上を通るトラフィックを Netflow v5で fluentd に飛ばしてみました。fluentd は Docker 上で動かします。
OVS on RasPi と、ElasticSearch + KIBANA は別エントリで。

#####1. fluentd-docker を構築
######・ディレクトリを作成

```
$ mkdir custom-fluentd
$ cd custom-fluentd
$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/VERSION/OS-onbuild/fluent.conf > fluent.conf
$ mkdir plugins
$ curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/Dockerfile.sample > Dockerfile
```
curl は見ての通りサンプルのダウンロードなので要らない場合は省略。

######・Dockerfileとfluentd.confを用意

```docker:Dockerfile
FROM fluent/fluentd
RUN fluent-gem install fluent-plugcin-netflow
RUN fluent-gem install fluent-plugin-elasticsearch
```
```fluentd:fluentd.conf
<source>
  type netflow
  tag netflow.event
  port 24224
</source>
#<match **>
#  @type stdout
#</match>
<match docker.**>
  @type file
  @id   output1
   path         /fluentd/log/dockerdata.*.log
   symlink_path /fluentd/log/dockerdata.log
   append       true
   time_slice_format %Y%m%d
   time_slice_wait   1m
   time_format       %Y%m%dT%H%M%S%z
</match>
<match netflow.event>
  @type file
   path         /fluentd/log/data.*.log
   symlink?path /fluentd/log/data.log
   append       true
</match>
#<match **>
#  type file
#  path /home/fluentd
#</match>
```

######・Dockerコンテナ構築と実行
```
$ sudo docker build -t custom-fluentd:latest ./
$ sudo docker run -d -p 24224:24224 -p 24224:24224/udp -v /home/fluentd/log:/fluentd/log -v /home/fluentd:/fluentd/etc -e FLUENTD_CONF=fluentd.conf custom-fluentd
```

######・確認

```docker:ps_a
CONTAINER ID IMAGE          COMMAND                 CREATED        STATUS                    PORTS  NAMES
324ffa9df98f custom-fluent  "/bin/entrypoint.s..."  23 seconds ago Exited (1) 18 seconds ago        ecstatic_khorana
```
ありゃ、瞬殺されてる。。。
log確認
```
$ sudo docker logs $NAMES
```

fluentd.confのpathが違ってました。 ついでにlogも直しておく。

```
$ sudo docker run -d -p 24224:24224 -p 24224:24224/udp -v /home/hayashi/custom-fluentd/log:/fluentd/log -v /home/hayashi/custom-flunentd:/fluentd/etc -e FLUENTD_CONF=fluentd.conf custom-fluentd
```

```docker:ps_a
CONTAINER ID IMAGE          COMMAND                 CREATED         STATUS        PORTS                                                          NAMES
f29abe9bd870 custom-fluentd "/bin/entrypoint.s..."  10 seconds ago  Up 8 seconds  5140/tcp, 0.0.0.0:24224->24224/tcp, 0.0.0.0:24224->24224/udp   silly_cori
```

OK !

別途用意していたOVS240のNetflow定義を今回のfluentdの環境に合わせる。

```
$ sudo ovs-vsctl -- set Bridge netflowbr netflow=@nf -- --id=@nf create NetFlow targets=\"192.168.0.31:24224\"
```
docker run で、ログディレクトリとして設定していたディレクトリにちゃんとファイルが出来てました。終了。






参考リンク
fluent-docker-image公式
https://github.com/fluent/fluentd-docker-image
Excelでリストを動的に追加させたい

# Excelでリスト（データの入力規則など）使用時

項目が増えたり・減ったり・変わったりした時に、データの入力規則をいじって・・リストに反映して・・・ということや。

同じシートの欄外にリスト用のエリアを設けていたら、いつの間にか壊れていた・・・なんてことはないでしょうか。

或いは、それを回避するためにマスタシートを別に設けてみるも、項目の入れ替わりが多いと管理が面倒になったりなど。

ということで、関数のみで手っ取り早く、リストの管理から開放されましょう。

# 概要

1. マスタシートを設けます。

1. マスタシートに、それぞれマスタとなる項目を入力します。
1. 項目は自由に増やしたり減らしたり変更することができます。

1. __参照元（リストとなるセル）は何もしなくても選択肢が動的に反映されます！__
※項目の変更については、既に入力済みのセルへの反映は行われません（あくまで選択肢のみ）

# 環境

手元にExcelがなかったので、GoogleSpredSheetで書いていますが、Excelで実現してください。
※GoogleSpredSheetでは同じことができません。

# 実装手順

## mstシート

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172884/23c9f390-44fb-4c6b-c534-a4fcf9b14f05.png)

見た目はこのような感じで、マスタ用のシートを設けます。
器として、列は20列、行は50列用意しています。

### 初期設定

マスタシートの初期設定を説明します。

|セル|項目|値|内容|
|:--:|:--:|:--|:--|
|B1|sheet|mst|シート名を入力します。|
|B2|開始行no.|5|マスタの値を入力し始める行番号です。例では天体観測が入力されている行のことです。|

これらは、マスタシートのシート名や、開始行が変更された際に手で変更します。

### 関数セル

#### 列 @2行目

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172884/bcf4db0c-5a17-d0d7-a9d3-7529ff06d3f5.png)

```vbnet
=LEFT(ADDRESS(ROW(),COLUMN(),2), FIND("$",ADDRESS(ROW(),COLUMN(),2))-1)
```

関数のあるセルの行絶対参照（e.g. A$1）の値から、"＄"までの文字列を抜き出す（つまり列名称）。

#### 行数 @3行目

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172884/bbba86a9-2799-2cc0-270b-d208428908e1.png)

```vbnet
=COUNTA(D5:D54)
```

マスタの50項目までの行数をカウントします。

#### 範囲 @4行目

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172884/69060e18-5b5f-5db6-f132-59c01a61aa99.png)

```vbnet
=CONCATENATE($B$1,"!",D2,$B$2,":",D2,$B$2+D3)
```

初期設定値とマスタの入力情報を元に、マスタ項目の範囲を作成します。

### 運用

D列以降の1行目は、マスタの名称を入力します。これはただの見出しです。
そのマスタに対し、同列の5行目からリストの選択肢となる値を入力していきます。

## マスタ参照元シート

1. Excelで、マスタの項目を選択肢としたいセルを選択します。
2. データの入力規則
3. 入力値の種類：リスト
4. 元の値：=INDIRECT(mst!D4)

これで、動的に反映されるリスト指定が完了です。
4.にて、INDIRECT関数を使用することで、対象セルの文字列をセル参照値として扱うので、結果マスタの項目を指定することになります。

例えば、mstシートの好きな歌列に、「カルマ」を追加します。
そうすると、入力規則を設定したセルの選択肢に、「カルマ」が追加されます。

以上、画像で例示できないのが残念ですが・・。
シートは置いておくので、xlsx形式でダウンロードして確認してみてください。

[Excelリストのマスタ化（動的反映）](https://drive.google.com/open?id=0B11Gopa5deyYOERIVGxzSVpHQXc)
Pythonでグラフ作成（散布図）

記録として残していきます。

そのままコピーしてやればできます。

使用したデータ(csvファイル)がうまく掲載できなかったので、写真で貼っておきます。

<img width="847" alt="スクリーンショット 2017-11-01 午前1.38.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/210711/ceec18a5-4624-3701-e0aa-9beab9a09817.png">


```python:statistics.py
import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import scatter_matrix
```


```python:statistics.py
data = pd.read_csv("row_data.csv")
data.describe()
```

```python:statistics.py
plt.scatter(data['age'], data['expenses'])
plt.ylabel('expenses')
plt.xlabel('age')
plt.show()
```
<img width="277" alt="スクリーンショット 2017-11-01 午前1.33.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/210711/8e60b4ae-d196-97c2-13dd-1ae4e67bfef7.png">


```python:statistics.py
plt.scatter(data['smoker'], data['expenses'])
plt.ylabel('expenses')
plt.xlabel('smoke')
plt.show()
```
<img width="279" alt="スクリーンショット 2017-11-01 午前1.33.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/210711/3a0f4e70-7c54-d74f-20f4-d0fd1b51dc8b.png">


```python:statistics.py
plt.scatter(data['bmi'], data['expenses'])
plt.ylabel('expenses')
plt.xlabel('bmi')
plt.show()
```
<img width="285" alt="スクリーンショット 2017-11-01 午前1.33.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/210711/f2a18873-e472-08f9-674a-70ec56e20ba9.png">

```python:statistics.py
plt.figure()
scatter_matrix(data)
plt.show()
```
<img width="269" alt="スクリーンショット 2017-11-01 午前1.33.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/210711/23522a92-db27-87aa-840c-37821d900787.png">
Django template でDate Objectをフォーマットする

```django:python

{{content.start_date | date:'l'}} => 日曜日
{{content.start_date | date:'c'}} => 2017-11-12T15:00:00+09:00
{{content.start_date | date:'D'}} => 日
{{content.start_date | date:'d'}} => 12
{{content.start_date | date:'M'}} => 11月
{{content.start_date | date:'Y'}} => 2017
{{content.start_date | date:'F'}} => 11月
{{content.start_date | date:'j'}} => 12
                          ```
```
Azure AppService証明書をキーコンテナーにインポートする時の注意事項

# キーコンテナーのリソースグループ名はASCIIのみにしておく！！

本当にこれでめっちゃハマりました。日本語のリソースグループにキーコンテナーを作成すると、AppService証明書をキーコンテナーにインポートする時「エラーが発生しました」とだけ表示が出て全く先に進めません。気をつけてください。
ディレクトリ情報をfindコマンドで出力する

ディレクトリのフルパス、パーミッション、所有者：グループを出力したいと思います。ls -lを利用すれば取得できますが、サーバの全階層を出力するなど大量に出力したい場合に利用します。

**例:/home以下のディレクトリ情報を出力する**

```bash
$ find /home -type d -ls
163 0 drwxr-xr-x   5 root     root           43 Sep 18 14:02 /home
536 4 drwx------   7 kusakari kusakari     4096 Oct 31 01:53 /home/kusakari
```

**例:/home以下のディレクトリ情報を出力する（/home/kusakari以下は除外）**

```bash
$ sudo find /home -path "/home/kusakari" -prune -o -type d  -ls
163 0 drwxr-xr-x   5 root     root           43 Sep 18 14:02 /home
```

**例:/home以下のディレクトリ中5分以内に更新されたファイルを出力する**

```bash
$ find /home -mmin -5 -ls
3167    0 -rw-rw-r--   1 kusakari kusakari        0 Nov  1 01:15 /home/kusakari/test
```
Azure AppServiceで、不要なヘッダーを消す

# Serverヘッダーを消す

`wwwroot\web.config`に下記の内容を追記。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    ...
    <security>
        <requestFiltering removeServerHeader="true" />
    </security>
    ...
  </system.webserver>
</configuration>
```

# X-Powerd-By ヘッダを消す

`ASP.NET`と`PHP x.x.x`で消し方が違う。

## `ASP.NET`

`wwwroot\web.config`に下記の内容を追記。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    ...
    <httpProtocol>
        <customHeaders>
            <clear />
        </customHeaders>
    </httpProtocol>
    ...
  </system.webserver>
</configuration>
```

## `PHP x.x.x`

これはどうも最適な消し方が無いらしい。

`expose_php=Off`を`wwwroot\.user.ini`に書いても消えないので、phpスクリプトにini_setを書くか、[このStackOverflowの回答](https://stackoverflow.com/a/28507077)を参考に下記の内容を`wwwroot\web.config`に書く。ヘッダーそのものは消えないが、内容は消えるので最低限の対策にはなる。

ちなみに上2つのヘッダーもこの方法で内容を消すことは出来ますが、ヘッダーの存在そのものを消すことは出来ません。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    ...
    <rewrite>
        ...
        <outboundRules rewriteBeforeCache="true">
            <rule name="Remove X-Powered-By HTTP response header">
                <match serverVariable="RESPONSE_X-Powered-By" pattern=".+" />
                <action type="Rewrite" value="" />
            </rule>
        </outboundRules>
        ...
    </rewrite>
    ...
  </system.webserver>
</configuration>
```
書き込み権限のないディレクトリ下にリダイレクトで出力する

コマンドの結果をリダイレクトするが、書き込み先のw権限がない場合。

```bash
$ /usr/bin/sudo -c "echo 'su do' >> /usr/test" 
To make a usage listing of the directories in the /home partition.  Note that this runs the commands in a sub-shell to make the cd and file redirection work.
# sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
```
CentOS6でシングルユーザーモードに入れなかったのでメモ

オールSSDが売りのVPSサービスである、Conohaで動作中のCentOS6.6のrootパスワードを忘れました。アホですね😂😂
なお、シングルユーザーモードへの入り方などは割愛します。

# 現象
何故かわからないけどいくらKernelオプションに「single」を付けても、
`Enabling /etc/fstab swaps:  [  OK  ]`
で止まる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/37be895f-d064-934a-0a53-6fd4e812d636.png)


# 解決策
Kernelオプションが多すぎたようです。
`console`以下を削除することで無事に起動しました。

__不要部分__
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/1ec893d5-7e18-2833-5a06-c8496580976b.png)

__変更後__
![image.png](https://qiita-image-store.s3.amazonaws.com/0/179223/0fb81b95-6d22-cd3c-4d62-237389bfebd7.png)
Bash on Ubuntu on Windows でSublime Textを起動して日本語入力を可能にする

# 使用環境
* Windows 10 Fall Creators Update (バージョン:1709)


# 手順
Bash on Ubuntu on Windows (BoW,WSL)でSublimeTextの実行及び日本語入力を実現するには，2つ問題点があります． 

* Bash on WindowsからX-Window アプリを起動する
* SublimeTextで日本語入力を可能にする

## Bash on WindowsからX-Window アプリを起動する
まずはSublimeTextをインストールする  
[公式サイト](https://www.sublimetext.com/3)からダウンロードして，解凍すればすぐに実行ファイルができます．  

コマンド例(バージョンは記事執筆時(2017/10/31)最新の物)

    $ wget https://download.sublimetext.com/sublime_text_3_build_3143_x64.tar.bz2
    $ tar xf sublime_text_3_build_3143_x64.tar.bz2
    $ cd sublime_text_3
    $ ./sublime_text

これで実行できるはずですが，GUIアプリを起動するための設定を行わなければSublimeTextは表示されないです．
SublimeTextではエラーメッセージが表示されないので，試しにGeanyで起動してみました

    $ geany
    Geany: cannot open display

このようにDisplayを表示できないとのメッセージが出ます
Bash on Windows はデフォルトではGUIアプリを起動できません

そこで，WindowsにX Serverを立てる必要があります．
[XMing](https://ja.osdn.net/projects/sfnet_xming/)や[VcCsrv](https://sourceforge.net/projects/vcxsrv/files/latest/download)といったX Windows サーバアプリケーションをWindowsにインストールして起動します．

起動すると，タスクトレイに以下のように表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170422/9bd8c91c-b0cd-37c0-acd9-d6a5a987d4bc.png)

この状態で，Bash on Windowsのターミナルから以下を入力します．

    $ export DISPLAY=localost:0.0

これによって，Bash on Windows からGUIアプリが起動できるようになります(例外あり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170422/c13c0409-d4c5-0937-ddab-b8911c2dfca5.png)

しかし，このままでは日本語の入力どころか，日本語表示もできないかもしれません．
日本語が正しく表示されない場合，日本語フォントがインストールされていないので以下を実行します

    $ sudo apt-get install unifont

## SublimeTextで日本語入力を可能にする
ここからは，[UbuntuでSublimeTextをインストールする為のメモ](https://qiita.com/nonNoise/items/3a4e87c04cc59142cdb2)と同様にするとできました．

    $ sudo apt-get install ibus-mozc
    $ sudo apt-get install emacs-mozc

を実行後，SublimeTextを起動して，  

* [Tools]→[Command Palette]を選択
* "Install Package Control" を選択 
* 再度[Tools]→[Command Palette]を選択
* "Package Control: Add Repository"を選択
* 下に出てくるフォームに[https://github.com/yasuyuky/SublimeMozcInput](https://github.com/yasuyuky/SublimeMozcInput)を入力
* [Tools]→[Command Palette]を選択
* "Package Control: Install Package"を選択
* 少し待つと入力フォームが出てくるので"SublimeMozcInput"を選択

これで，(デフォルトでは)Ctrl+\ キーで日本語入力の切り替えが可能になります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/170422/aafec17e-3fd6-f702-bb30-a9f9756537be.png)

# 参考記事
* [UbuntuでSublimeTextをインストールする為のメモ](https://qiita.com/nonNoise/items/3a4e87c04cc59142cdb2)
* [Bash on Ubuntu on Windows + XmingによるGUI
](https://qiita.com/makky0620/items/e31edc90f22340d791ff)
* [bash on Ubuntu on Windowsを試してみる](http://verifiedby.me/adiary/0101)
VSCodeのruby-rubocopでexecutePathがエラーになる

若干ニッチな状況でハマったので備忘録

# エラー状況
VSCodeで.rbファイルを開くと、`[Warn] execute path is empty! please check ruby.rubocop.executePath config`エラーとなり、rubocopが効かない状態になる。

# 環境
- Windows 10
- Ruby 2.3.3（233p222）
- uru 0.8.4
- VSCode 1.17.2
    - ruby-rubocop 0.4.0
- rubocop 0.51.0

----

- uruでrubyのバージョンを管理 `uru 233p222`
- VSCodeに拡張機能の`ruby-rubocop`をインストール
- グローバルのgemにrubocopをインストール

# 原因
ruby-rubocopはruby.rubocop.executePathが空欄の場合、環境変数PATHを参照してrubocopを実行する。[^1]
しかしuruでRubyのバージョンを切り替えている場合、VSCode起動時にはuruでのRubyバージョンが未指定の為、環境変数PATHにrubyのpathが通っていない。

1. VSCode起動
2. rubocopが環境変数を参照 ←この時点でpathが通ってない
3. uruでrubyバージョンを設定
4. 環境変数にpathが通る

# 回避方法
環境変数PATHに`<Rubyのインストールフォルダ>\bin`を設定することでエラーが解消される。

Rubyをインストールする際、「Rubyの実行ファイルへ環境変数PATHを設定する」チェックをオフにしていたのでハマった。

[^1]: 通常は`<Rubyのインストールフォルダ>\bin\rubocop`
ちょっとずつ読むドメイン駆動設計 第三部 より深い洞察へ向かうリファクタリング 第九章 暗黙的な概念を明示的にする2 言葉に耳を傾ける

[前回](https://qiita.com/YasuhiroKimesawa/items/809ac929026daef0b768)の続き

暗黙的な概念を導き出すためのヒントはどこにあるか。
>
1. チームの言語に耳を傾ける
2. 設計のぎこちない点・エキスパートの発言で矛盾すると思われる点を詳細に調べる
3. ドメインに関する文献を読む
4. 大量の実験をする

これらを読んでいきます。

# 言葉に耳を傾ける

ドメインエキスパートの使う言葉に耳を傾ける。

- **複雑なものを簡潔に述べている用語**
- **言葉の選び方を正される**
- **特定のフレーズを使ったときに、困惑の表情が消える**

こういったことがヒントになる。

昔ながらの「名詞がオブジェクトになる」というものではなく、上記のような出来事から拾うことができた言葉をさらに、知識の噛み砕きを続けて、明確で有用な概念を導き出すことが必要です。

なので、これらのヒントはスタート、きっかけであるということですね。

実践しようとするとなかなか難しいですよね。
仕様を把握するだけで精一杯のところ、表情まで気にしなければならないのは。

そこで、ひとつ提案してみたいのが、**その場でモデルを描く、モデルを見ながら話す**こと。
やったことないのですが、やってみたい。

なかなか、クラス図を知らないドメインエキスパートや顧客の前で持ち出すのは困難かもしれないですが、最悪見せなくとも、自分で整理をしながら話しをするというのは一つ手かもしれない。

書籍の例でも図を見ながら話しをしていますよね。
例では、開発者が図の説明をしても、ドメインエキスパートは図の詳細までは理解していないことがわかります。ただ、言葉（ユビキタス言語）の理解はお互いできていて、会話から状況が打開されていく様子が描かれています。

次の機会にやってみようかなと思います。
**議事録書かずにモデルを描け**・・・なんて言える日が来るかも!?

明日に続きます。
HoloLensの開発環境構築(Unity2017.1+VS2017)

[2017/11/17追記]MRTKの[GitHubのReleaseページ](https://github.com/Microsoft/MixedRealityToolkit-Unity/releases)だと、2017.1.2を推奨していました。なのでやっぱり2017.1使ったほうがいいかもしれません。 二転三転してしまい、すみません。

[2017/11/07追記]Mixed Reality(旧Holographic) Academyのプロジェクトサンプルは2017.2以降になっているので、2017.2以降が良いかもです。ただし英語のサイトから、5.6系のプロジェクトファイルを使うことができます。

n番煎じですが、自分用にメモ。VS2017+Unity2017.1の例があまりなかったので書きました。

※HoloLensの開発環境です。 **immersive headsetsの開発環境ではありません。**

### 推奨のバージョン確認
HoloLensはまだまだβ的なデバイスなため、常に推奨されるバージョン等が更新されていきます。その為今後のことも考え、開発に推奨のバージョンを公式が載せているためここにリンクを載せておきます。
https://developer.microsoft.com/ja-jp/windows/mixed-reality/install_the_tools
今回(2017/10/31)は以下のバージョンで環境を構築します。

- Windows 10 1709(FallCreatorsUpdate適応)
	- CreatorsUpdateでも良さそうですが最近のマイクロソフトは最新バージョンしかサポートしていない節(immersive headsets対応等)があるので今後の機能拡張に備え、若干不安ですが最新版を入れておきます。
- Visual Studio2017
	- 一時期ビルドできないバグがあったらしいですが、現在は解消されており公式も今後は2017を推奨と言っているので2017を入れます。
- Unity 2017.1
	- 2017.2でもいいのですが、公式が推奨しているので今回は2017.1を導入します

Windowsのインストールは省略します。

### VisualStudio2017の導入
まずは、VisualStudio2017をインストールします。
DLは以下から
https://www.visualstudio.com/ja/downloads/
![Kobito.sjW3zz.png](https://qiita-image-store.s3.amazonaws.com/0/79241/b5c2a892-e0ad-502e-6bfe-d7460c48cd49.png "Kobito.sjW3zz.png")
今回はVisual Studio Community 2017を導入します。
DLしたらインストーラーを開きます。
注意してほしいのですが、チェックを入れるところが3つあります。
![Kobito.8Vm5hl.png](https://qiita-image-store.s3.amazonaws.com/0/79241/0e58b81f-3a69-d96f-7950-5af1030924e8.png "Kobito.8Vm5hl.png")
左上のユニバーサルWindowsプラットフォーム開発と、それをチェックした時に表示される右側のメニューのWindows 10 SDK(10.0.14393.0)にもチェックを入れます。

次に下にスクロールしていき、
![Kobito.JG4hph.png](https://qiita-image-store.s3.amazonaws.com/0/79241/d50fe826-5dfc-689f-1798-265e71135ab8.png "Kobito.JG4hph.png")
Unityによるゲーム開発にチェックを入れます。
この時気をつけてほしいのですが、右に表示されるオプションのUnityには **チェックを入れないでください** 。今回はたまたま推奨のバージョンがインストールされますが、今後のこと(インストールされるバージョンが合わない時)も考えUnityはあとで単体でインストールします。

後は、インストールボタンを押してインストールを始めてください。
![Kobito.DxS3j7.png](https://qiita-image-store.s3.amazonaws.com/0/79241/8531809e-b786-8d1e-ddf1-ef77fe7f7df1.png "Kobito.DxS3j7.png")
※余談ですが、2017のインストーラー画面は見やすくていいですね。Electron製だと聞きました。

### Unity2017.1の導入
次にUnityをインストールします。
普通に公式サイトからDLしようとすると、2017.2しかDLできないので、パッチリリースのページへ行き、2017.1の最新版をDLします。
DL(※2017.1です)は以下から
https://unity3d.com/jp/unity/qa/patch-releases?version=2017.1
![Kobito.8e8cUu.png](https://qiita-image-store.s3.amazonaws.com/0/79241/f3a72483-6082-ed46-2f9b-3b3f5e7e9844.png "Kobito.8e8cUu.png")
今回はパッチ 2017.1.2p2のUnity エディターのDownload AssistantのWindows版をDLします。
DLしたらインストーラーを開きます。
指示に従って進んでいきます。
![Kobito.To1nKm.png](https://qiita-image-store.s3.amazonaws.com/0/79241/26e2cf80-22a9-5331-cefc-0a362c79b2c4.png "Kobito.To1nKm.png")
↑の画面になったら、スクロールしてWindows Store .NET Scripting Backendにチェックを入れてください。
![Kobito.H2npq1.png](https://qiita-image-store.s3.amazonaws.com/0/79241/f5102255-ebcb-ff4e-8247-9f14c0cc5be3.png "Kobito.H2npq1.png")
公式ではなんにも言ってないのですが、個人的に推奨したいポイントとしてインストール先のフォルダー名をバージョンに合わせて変えておくと良いと思います。これをやっておくと今後も複数のバージョンをUnityを入れた際に楽になります。

後は進めていくだけでインストールは完了です。
お疲れ様でした。
多忙なエンジニアがざっくり知りたい最新技術

# はじめに
「なんとなく使ったことあるけど、最新版ってなにが新しいの？」


「細かいことはいいから概要だけ教えて！」


そんな感じでこの記事を読んで**ちょっとだけ**詳しくなって下さい。

---
 
# 技術ネタ
## Java 9
## Spring Framework 5
## Spring WebFlux
## Spring Boot 2.0
## Kotlin
## JUnit 5

---
# Java 9
- 2017.9.22リリース
- 日付・通貨のデフォルトフォーマットが変更された[JEP252]
- @Deprecatedが拡張され情報量が増えた[JEP277]
- リフレクションの一部が将来的に禁止されるため、代替としてVariable Handles[JEP193]が新登場
-  Project Jigsaw により、一部の著名なクラスがデフォルトクラスパスから除外された[JEP261]
（javax.transaction, javax.rmi.CORBA, javax.annotation）

---
# Spring Framework 5
- Java 8 必須, Java 9 にも対応
- Spring Framework 4 のDeprecatedクラスが削除された
- Java EE 8の一部に対応
（Bean Validation 2.0, JSON Binding APIなど）
- Reactive Programing Modelの一つである Spring WebFluxに対応
- Spring TestContext FrameworkがJUnit 5に対応

---
# Spring WebFlux
- Spring MVCに代わるReactorベースのHTTP API
- Servletを一切利用しない
- 非同期実行
- ノンブロッキング

---
# Spring Boot 2.0
- 2017/11/20リリース予定
- Java 8 必須
- Spring Framework 5 必須
- spring-boot-starter-webflux が追加された
- Actuator エンドポイントが/applicationに集約

---
# Kotlin
- IntelliJ IDEAを開発したJetBrains社が開発した言語
- JVM上で動作し、IntelliJ IDEAも当然対応済み
- IntelliJ IDEAベースのAndroid Studioも対応済み
- Eclipse ではプラグインで対応
- Javaで書けることはKotlinで書ける
- Javaよりシンプルに書ける

---
# JUnit 5（Jupiter)
- Java 8 必須
- JUnit 4以下とのAPI互換性はないため、古いテストコードの実行にはJUnit Vintage を利用する
- アノテーションが変わった

|Junit4以下|JUnit5|
|:--:|:--:|
|`@Before/@After`|`@BeforeEach/@AfterEach`|
|`@BeforeClass/@AfterClass`|`@BeforeAll/@AfterAll`|
|`@Ignore`|`@Disabled`|
PHPでCSRF対策の話

最近PHPを使う機会がありセキュリティについてすこーし気にするようになったので調べてみました。
PHPでCSRF(クロスサイトリクエストフォージェリ)について考えます。

# CSRFとは

攻撃者がウェブページを作成し、訪れたユーザに対してニセのリンクを踏ませ、気づかぬうちに別のサイトへ書き込みを行わせる等の攻撃手法です。

一般化すると、サイトをまたがって（クロスサイト）偽（forgery）リクエストを送信する攻撃手法です。

Aというサイトに書き込もうとしていたのに、実は全然違うBというサイトに書き込まされていたってことが起こり得るのです。

# ざっくり図解

![csrf.png](https://qiita-image-store.s3.amazonaws.com/0/82745/5bad3344-58f6-b931-3e5c-982a33f88c44.png)

# 対策

フォーム生成時にサーバからの認証用のtokenを埋め込み、リクエスト送信時に一緒にサーバに返し、正しいtokenが送られてきているか検証を行う。

# 実装

有名なフレームワークの実装探してパクれば問題無いはず。

今回はLaravelの実装を参考にしました。

`_token` という名前の値がセットされるようです。
https://github.com/illuminate/html/blob/master/FormBuilder.php#L179

```php
	/**
	 * Generate a hidden field with the current CSRF token.
	 *
	 * @return string
	 */
	public function token()
	{
		$token = ! empty($this->csrfToken) ? $this->csrfToken : $this->session->getToken();
		return $this->hidden('_token', $token);
	}
```

```html
<input name="_token" type="hidden" value="QiO0aQwyhcqKBVOUSkeOLlEQaDFay1ICTXGJ0Uh5">
```

生成はこの辺で行っているみたいです。
https://github.com/illuminate/session/blob/master/Store.php#L598

```php
    /**
     * Regenerate the CSRF token value.
     *
     * @return void
     */
    public function regenerateToken()
    {
        $this->put('_token', Str::random(40));
    }
```

Strクラスのrandom関数とかphpにはないので独自拡張を行っているみたいです。
https://github.com/illuminate/support/blob/master/Str.php#L285

```php
    /**
     * Generate a more truly "random" alpha-numeric string.
     *
     * @param  int  $length
     * @return string
     */
    public static function random($length = 16)
    {
        $string = '';
        while (($len = strlen($string)) < $length) {
            $size = $length - $len;
            $bytes = random_bytes($size);
            $string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
        }
        return $string;
    }
```

PHPの標準(7.0〜)の `random_bytes` を利用してbase64エンコードかけて `/`, `+`, `=` を除外する感じになっているようです。

http://php.net/manual/ja/function.random-bytes.php

PHP7未満で5.3以上であれば `openssl_random_pseudo_bytes` を利用するといいみたいです
(出典: [teratail-ベストアンサー](https://teratail.com/questions/60622))
http://php.net/manual/ja/function.openssl-random-pseudo-bytes.php

# よくわからないので知ってる方いたら教えてください

日本語で書かれた記事だとセッションID使ってる例が多い気がするんですが(観測範囲の問題？？？)、セッションIDをハッシュ化したらtokenとして使っていいのだろうか？ランダムじゃなくていいの？

例を出すとこういうやつ

```html+php
<input type="hidden" name="token" value="<?=sha1(session_id())?>">
```

# まとめ

すこしはセキュリティ意識してコード書こう!
人類の英知が詰まったフレームワークの実装読むのいいよ！
lubuntu 16.04LTS へアップグレード

#はじめに

我が家の 「Let's note CF-R4」。
しばらく使っていなかったので何がインストールされているかも不明な状態でした。２、３年前にちょっといじった記憶があったんですが、開けてみると Lubuntu 15.10。こいつこんなに軽快に動くのかというぐらいにサクサク。メモリ1.5GB、ハードディスク：SSD 64GB にアップグレード済み。

```
MEM:PC2-4200 DDR2-533 172Pin MicroDIMM 1GB ETM533-1G/RO
HDD:CSSD-PNM64WJ2
```

バージョンが15.10 でサポートが終了しているようなので、アップグレードしてしまおうと。何も入っていない感じだったので消えてもよろしかと。

#アップグレード開始

で、Lubuntuさん、最新バージョンは何なのよ。16.04 が LTS なのね。んじゃそれで。アップグレードか？クリーンインストールか？アップグレードでダメならクリーンかなと。。。

とりあえず

```bash
sudo apt-get update
````

あれま、無視とエラーの連発。 ネットで検索してみると `/etc/apt/sources.list` を修正しろと。リスト中のホストを `http://old-releases.ubuntu.com` に変更。
https://askubuntu.com/questions/91815/how-to-install-software-or-upgrade-from-an-old-unsupported-release
ここの通りにとりあえず実行。

```bash
sudo sed -i -re 's/([a-z]{2}\.)?archive.ubuntu.com|security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
```

からの

```
sudo apt-get update && sudo apt-get dist-upgrade
```

よしよし、update は上手く行ってる。update は、ほとんど動かず。何か変。まぁアップグレードするので先に進もう。アップグレードコマンドがあるらしく、

```
sudo do-release-upgrade
```

ん？

```
新しくリリースされたものはありません
```

おいおい。
ハマるのか。おい。
さらにネットを探してみると↓これが必要みたい。
そうでしょう、そうでしょ。

```
sudo apt-get install update-manager-core update-manager
```
ん、インストール済？では改めて。

```
$ sudo do-release-upgrade

新しくリリースされたものはありません
```

おいおい。ハマった。
しばらく色々あさって見たところ以下に到着。
https://help.ubuntu.com/community/EOLUpgrades/
これ↓をしろと。

```
sudo perl -pi -e 's/^Prompt=.*/Prompt=normal/' /etc/update-manager/release-upgrades
```

え？ `Prompt=lts` じゃなくて `Prompt=normal` ？

これでアップグレードが開始されました。ちゃんちゃん。
Windows10にTera TermをインストールしてRSA鍵を作る方法

**環境**

- OS : Windows10 Pro 64bit
- Tera Term : Version4.96

![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/cfab53cd-dd32-d2f5-7c46-9a956414222b.png)

### 1. インストールする
1. [OSDNのサイトからダウンロードする](https://ja.osdn.net/projects/ttssh2/)
2. ![image.png](https://qiita-image-store.s3.amazonaws.com/0/159761/6437d5c6-7889-582a-f282-e655efdef42d.png)
3. exeファイルを起動する
4. ![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/006fbac8-fa5e-b67a-6adc-4ca9d54dd4dd.jpeg)![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/084bd6ec-cc77-3cdc-ad36-b34c11f0de73.jpeg)![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/56c4d6f0-bf25-b965-100d-6458c93b88f3.jpeg)![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/85ead6ef-7309-0292-db9e-54df17d36e59.jpeg)![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/4196a5a0-db00-ed21-2af7-78be0a6ba52f.jpeg)![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/3f498213-086e-b975-abfe-e47a48f2c994.jpeg)

### 2. RSA鍵を作る
1. Tera Termを起動する![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/c17f4897-4f47-95a2-95de-f7bf2160984c.jpeg)
2. [キャンセル]ボタンを押下する
3. [設定] > [SSH鍵生成]を押下する ![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/022374c3-0edf-eb7e-cb1e-c67fee161654.jpeg)
4. [生成]ボタンを押下する![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/d39671e6-9c3a-e94e-5c41-94589bba677d.jpeg)
5. [鍵のパスフレーズ]および[パスフレーズの確認]を入力する![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/e9c3855c-91cb-64d7-be2c-3cad8191e1ed.jpeg)
6. [公開鍵の保存]および[秘密鍵の保存]を押下して各鍵を保存する![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/159761/d1597cac-6ab1-5bc5-89d0-c67897a7e42b.jpeg)
Angular Materialでバッジ付きアイコンボタンを作る


小ネタです。
Angular Materialを使ったアプリケーションで、通知件数などを表示するためのバッジを使いたい場面があったのですが、Angular Materialのコンポーネントが用意されていなかったので、既存のコンポーネントとCSSを組み合わせて作ってみました。

イメージ的にはこんな感じです。(画像は[wantedly](https://www.wantedly.com/)のツールバー)

<img width="195" alt="スクリーンショット 2017-10-31 21.50.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/e810337d-3876-67ed-fe43-b5958c2ceb63.png">


最終的にこんな感じになりました。

<img width="272" alt="スクリーンショット 2017-10-31 23.31.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/79414/624eb8e6-d989-7b73-8e35-920a8f401311.png">


# 手順

## HTML

まずは、html側です。
通常の[Icon Buttons]()をマークアップした後に、バッジの件数表示部分をspanとして追加します。ここでは表示を5としていますが、実際にはテンプレートで動的に変更できるようにするかと思います。

```html:app.component.html
  <button mat-icon-button>
    <mat-icon class="icon">notifications</mat-icon>
    <span class="badge">5</span>
  </button>
```

## CSS

次に、バッジをスタイリングするCSS側です。
こんな感じになりました。
地道にCSSを書いていくだけなのですが、バッジサイズに合わせて、 line-heightを指定するのがポイントかと思います。

バッチの

```css:app.component.css
.badge {
  position: absolute;
  top: 0;
  left: 50%;
  font-size: 12px;
  line-height: 13px;
  border-radius: 50%;
  width: 13px;
  height: 13px;
  background-color: #ff0000; 
  border: 4px solid #ff0000;
  color: #ffffff;
  text-align: center;
}
```

# デモ

stackblitzに動くデモを作ってみました。
https://stackblitz.com/edit/angular-material-badge

※ ボタンを押すとバッジのカウントが上がり、バッジ自体をクリックするとカウントがクリアされます。

# 所感
stackblitzめちゃくちゃ便利。

以上です。
Amazon AuroraでR4インスタンスを試してみる

つい最近、Amazon AuroraでR4インスタンスが使えるようになりました。

以前、[R3インスタンスでデータ暗号化時のパフォーマンスを確認](https://qiita.com/hmatsu47/items/574b5ec562777f088beb)しましたが、同じ条件でmysqlslapを使い、R3インスタンスと性能比較してみます。

※上のほう（新たに加わった16xlargeとか）はさすがに試しません…クライアント側もそれ相応の性能が必要そうですし…。

# 1. ベンチマークテストの内容

以前と同じ、mysqlslapコマンドを使い、

 * **暗号化なし／あり**
 * **バイナリログあり／なし**
 * **インスタンスタイプは db.r3.large／db.r4.large、db.r3.xlarge／db.r4.xlarge**

の組み合わせで試してみます。

mysqlslapコマンドのパラメータは前回と同じで、読み書き混在モードで試しています。

```bash:mysqlslap
$ mysqlslap --auto-generate-sql --auto-generate-sql-guid-primary --engine=innodb --number-int-cols=20 --number-char-cols=20 --concurrency=150 --auto-generate-sql-write-number=2000 --auto-generate-sql-execute-number=2000 --auto-generate-sql-load-type=mixed -u 【ユーザ名】 -h 【クラスタエンドポイント】 -p
```

# 2. 結果

単位は秒。3回実行して平均を取りました。

 * **largeインスタンス**

| インスタンスタイプ | 暗号化なし・バイナリログなし | 暗号化なし・バイナリログあり | 暗号化あり・バイナリログなし | 暗号化あり・バイナリログあり |
|:-:|:-:|:-:|:-:|:-:|
|db.r3.large| 57.252 | 66.970 | 57.360 | 68.003 |
|db.r4.large| 51.293 | 62.091 | 48.860 | 57.737 |
| 性能UP率 | 11.6% | 7.9% | 17.4% | 17.8% |

 * **xlargeインスタンス**

| インスタンスタイプ | 暗号化なし・バイナリログなし | 暗号化なし・バイナリログあり | 暗号化あり・バイナリログなし | 暗号化あり・バイナリログあり |
|:-:|:-:|:-:|:-:|:-:|
|db.r3.xlarge| 35.226 | 39.076 | 34.680 | 40.271 |
|db.r4.xlarge| 32.046 | 35.797 | 33.133 | 37.857 |
| 性能UP率 | 9.9% | 9.2% | 4.7% | 6.4% |

# 3. 考察（というほどのものでもない）

程度の差はありますが、**R4インスタンスはR3インスタンス比で性能向上**していました。

但し、暗号化の有無については、以前試したR3もR4も、誤差の範囲でしかありませんでした。
前回同様、「あり」のときの性能が「なし」を上回るケースもありましたが、db.r4.largeでは前回のR3とは違って、バイナリログがあっても「あり」が「なし」を上回りました。

インスタンスが割り当てられたホストや、利用しているストレージの負荷状況が影響したのかもしれません。

結果として、暗号化の有無と性能のUP率がlargeインスタンスとxlargeインスタンスで逆転していますが、これは偶然の可能性が高いと思います（3回繰り返した結果のばらつきはいずれも小さかった）。

また、今回のR3インスタンスとR4インスタンスの結果の差を考えると、割り当てられるホストやストレージによっては結果が逆転する可能性もあります。

**2018/01/08追記：**

2018/01/08になって、もう一度試してみたら…。

 * **[MeltdownとかSpectreとか騒ぎがあったので、Amazon Aurora（MySQL互換）R4インスタンス再テスト（mysqlslap）](https://qiita.com/hmatsu47/items/656ebb6575c31bf1a90e)**

---

**【おまけ】**
Amazon Aurora関連投稿記事へのリンクを集めました。

 * **[Qiitaに投稿したAmazon Aurora関連記事](http://hmatsu47.hatenablog.com/aurora)**
React で facebook のシェアボタンが表示されない時 FB.XFBML.parse を実行して回避する

React で SPA を開発している時に、 facebook シェアボタンを設置しようと試みたが、なんどチュートリアル通りにやっても表示されずに困ったので、備忘録に。

### 確認事項

- [ ] 1. https://developers.facebook.com/apps で facebook appID を取得していること
- [ ] 2. [https://developers.facebook.com/docs/plugins/share-button/?locale=ja_JP](シェアボタン) ページで「コードを取得」して、 `<body>` 直下に sdk を読み込むスクリプトを埋め込んでいること
- [ ] 3. `<div class="fb-share-button">` というクラスのついたボタンのコードを実装していること
- [ ] 4. ローカルファイルの index.html などを直接ブラウザで開くのではなく、 web サーバーで起動させていること

上記でも動かなかった場合、以下で解決できるかも。

### 解決策
- `componentDidMount` 時に `FB.XFBML.parse()` を読み込む

```js
componentDidMount() {
  FB.XFBML.parse();
}

```
FB.XFBML.parse(); を任意のタイミングで読み込むことで、 facebook のシェアボタンなどのソーシャルプラグインを再レンダリングできる。

## ボタン全体のコード
```js
import React, { Component } from 'react';

class FacebookShareButton extends Component {

    constructor(props) {
        super(props);
        this.url = null;
    }

    componentWillMount() {
        this.url = location.href;
    }

    componentDidMount() {
        if(typeof(FB) != "undefined") {
            // @see https://developers.facebook.com/docs/reference/javascript/FB.XFBML.parse/
            FB.XFBML.parse();
        }
    }

    render() {
        return (
            <div
                className="fb-share-button"
                data-href={this.url}
                data-size="small"
                data-layout="button"
                data-mobile-iframe="true"
            />
        );
    }
}

export { FacebookShareButton };

```

## 参考
そもそも、React が原因なのではなく、 SPA 構成で動的に追加した SNS ボタンは表示されないという仕組みだった模様。

- [Ajaxで動的に追加したSNSボタンを表示させる方法と、SNSボタンの再読み込みについて](http://blog.yuhiisk.com/archive/2013/10/01/sns-button.html)
- [FacebookでシェアするURLを動的にする方法](https://qiita.com/tkosuga@github/items/a648a40241cc0ba14e6c)
メタ関数コールバックを使おう

#初めに
SFINAEを使ってメタ関数を書く際、いろいろな方法がありますが**メタ関数コールバック**という技法を使った書き方を推したいのでまとめます

#これまでの書き方
例として任意の型が`func()`をもつかどうかチェックするメタ関数
##初期の書き方

関数のオーバーロードと優先順位を利用した方法

```cpp:SFINAE1
template<class T>
struct HasFunc
{
private:
	template<class U>
	static auto check()->decltype(std::declval<U>().func(), std::true_type{});
	template<class>
	static std::false_type check(...);
public:

	static constexpr bool value = decltype(check<T>())::value;

};
```


##void_tを使った書き方

任意の型が型引数にあるときvoidを返す`void_t`を使い、template特殊化する方法

```cpp
template<class...>
using void_t = void;
```
```cpp:SFINAE2
template<class T,class = void>
struct HasFunc:std::false_type
{};
template<class T>
struct HasFunc < T, std::void_t<decltype(std::declval<T>().func())> > :std::true_type
{};
```
#メタ関数コールバックを使ったこれからの書き方

テンプレートテンプレート引数を利用し、std::void_tの方法をさらにジェネリックにした方法

```cpp
namespace detail
{
	template<class AlwaysVoid, template<class...>class Op, class ...Args>
	struct is_detected_impl :std::false_type
	{};
	template<template<class...>class Op, class ...Args>
	struct is_detected_impl<std::void_t<Op<Args...>>, Op, Args...> :std::true_type
	{};
}
//こいつを使う
template<template<class...>class Op, class ...Args>
using is_detected = detail::is_detected_impl<void, Op, Args...>;
```

`std::is_detected`はまだないので自作すればいい

```cpp:SFINAE3
template<class T>
using HasFuncOp = decltype(std::declval<T>().func());

template<class T>
using HasFunc = is_detected<HasFuncOp, T>;

```

これまでの書き方と比べてだいぶすっきりしたと思う
もっと広まってほしい


#参考
https://ja.wikipedia.org/wiki/SFINAE
http://en.cppreference.com/w/cpp/experimental/is_detected
Bluemix Infrastructure API(SoftLayer.image)

Manager
http://softlayer-api-python-client.readthedocs.io/en/latest/api/client/#getting-started

SoftLayer.image
http://softlayer-api-python-client.readthedocs.io/en/latest/api/managers/image/

(1) パブリックイメージを表示(list_public_imagesメゾッド)

```py
import SoftLayer

from SoftLayer import ImageManager

username = ''
key = ''
    
client = SoftLayer.Client(username=username, api_key=key)

img = ImageManager(client)

img.list_public_images()
```

コメント版

```py
# 前提 sudo pip install softlayerなどでsoftlayerモジュールをインストール済み

# SoftLayer API Overview 
# https://sldn.softlayer.com/article/SoftLayer-API-Overview

# SoftLayer API Python Client Documentation 
# https://media.readthedocs.org/pdf/softlayer-python/v3.0.1/softlayer-python.pdf

import SoftLayer

from SoftLayer import ImageManager

# ポータルにて「アカウント > ユーザ > ユーザー・プロファイルの編集」でAPIアクセス情報を確認し入力
username = 'xxxxxxxx'
key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
    
# 認証情報を渡すことで他のメゾッドで要求されるauthenticate引数を省略可能
client = SoftLayer.Client(username=username, api_key=key)

# テンプレートイメージサービスを扱うためのクラスを作成
img = ImageManager(client)

# パブリックイメージを表示
img.list_public_images()
```
railsにおけるパーシャルという機能について

RubyonRailsには3つの重要事項というものがある。

そのうちの1つである。DRY(Don't repeat Yourself)
要するに同じ記述を繰り返さないということである。

パーシャルという機能を使うことによって似たようなコードを1つにまとめることができる。

なお、パーシャルのファイル名の頭にはアンダースコア(アンダーバー)を付加します。
よくviewで使うことになる。またrenderというメソッドを使用することが多い。
sympyで「Singularity function(特異関数)」を使ってみた

# Doc
Singularity functions are a class of discontinuous functions.

https://docs.sympy.org/latest/modules/functions/special.html#sympy.functions.special.singularity_functions.SingularityFunction

# wikipedia

https://en.wikipedia.org/wiki/Singularity_function

日本語版はありませんでした。(2024/01/31)

# 参考

https://www.google.com/search?q=%E7%89%B9%E7%95%B0%E9%96%A2%E6%95%B0%E3%80%80&sca_esv=772e7fe848126d63&rlz=1CAUHAM_enJP1089&sxsrf=ACQVn0-VZSYGH2p7HKsC7OQ_rzycTns1KA%3A1706594876608&ei=PJK4ZY7mJIrn1e8Povaw2A8&ved=0ahUKEwiO9JSruYSEAxWKc_UHHSI7DPsQ4dUDCBA&uact=5&oq=%E7%89%B9%E7%95%B0%E9%96%A2%E6%95%B0%E3%80%80&gs_lp=Egxnd3Mtd2l6LXNlcnAiD-eJueeVsOmWouaVsOOAgDIGEAAYBxgeMgUQABiABDIFEAAYgAQyBBAAGB4yBhAAGB4YDzIGEAAYBxgeSP4xUIIIWM8jcAF4AZABAJgBf6AB8AaqAQMxLje4AQPIAQD4AQHCAgoQABhHGNYEGLADwgIEECMYJ8ICCBAAGIAEGKIEwgIIEAAYiQUYogTiAwQYACBBiAYBkAYK&sclient=gws-wiz-serp#ip=1

# はり

(参考)sympyで不静定はりを解く

https://qiita.com/tehen_/items/78de14be5de482d84a26

```python
from sympy import *
var('RA,wi,RB')
var('F,M,L,w,x,S')
var('EI,ud,c,u,f,kekka')
w=-RA*SingularityFunction(x, 0, -1) + wi*SingularityFunction(x, L*2, 0)- RB*SingularityFunction(x, L*4, -1)
S=integrate(w, x)
M=-integrate(S, x)
ud=1/EI*(integrate(M, x)+c)
u=integrate(ud, x)
u=u.subs({RA:3, RB: 9,wi:6,L:1})
f=u.subs({x:4})
kekka=solve(f,c)
u=u.subs({c:kekka[0]})
print(u)
pprint(u)
# (-7*x + SingularityFunction(x, 0, 3)/2 - SingularityFunction(x, 2, 4)/4 + 3*SingularityFunction(x, 4, 3)/2)/EI
#           3          4            3
#        <x>    <x - 2>    3⋅<x - 4>
# -7⋅x + ──── - ──────── + ──────────
#         2        4           2
# ───────────────────────────────────
#                  EI
```

#  参考文献
【補足】(2018/02/18)
(参考)材料力学 (JSMEテキストシリーズ) 

https://www.amazon.co.jp/%E6%9D%90%E6%96%99%E5%8A%9B%E5%AD%A6-JSME%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%97%A5%E6%9C%AC%E6%A9%9F%E6%A2%B0%E5%AD%A6%E4%BC%9A/dp/4888981582/ref=pd_sim_14_1?_encoding=UTF8&psc=1&refRID=GJC36FH427BJQBCT8RXE

演習材料力学 (JSMEテキストシリーズ) 

https://www.amazon.co.jp/%E6%BC%94%E7%BF%92%E6%9D%90%E6%96%99%E5%8A%9B%E5%AD%A6-JSME%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%97%A5%E6%9C%AC%E6%A9%9F%E6%A2%B0%E5%AD%A6%E4%BC%9A/dp/4888981981/ref=sr_1_fkmr0_2?s=books&ie=UTF8&qid=1518897655&sr=1-2-fkmr0&keywords=%E6%9D%90%E6%96%99%E5%8A%9B%E5%AD%A6+%2F+%E6%97%A5%E6%9C%AC%E6%A9%9F%E6%A2%B0%E5%AD%A6%E4%BC%9A%E8%91%97


# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)
「Scalaスケーラブルプログラミング」まとめ ~ １章 ~

## この記事は？

[Scalaスケーラブルプログラミング第3版](https://www.amazon.co.jp/Scala%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E7%AC%AC3%E7%89%88-Martin-Odersky/dp/4844381490)を読んで、個人的に気になった箇所や勉強になった箇所のまとめです。
認識誤りなどがあればご指摘いただけると幸いです。

## 第1章 スケーラブルな言語
### Scalaはプログラマーが修正・拡張できるように設計されている
組み込み型(Scalaの中核機能として組み込まれている型)になくても、新しい型を作ることも可能。

### 型同様にScalaでは新しい制御構造も作ることができる
Scala APIのAkkaの```receive```ブロックやメッセージ送信(```!```)はScalaの組み込み演算ではない。

### Scalaはオブジェクト指向言語である
Scalaは純粋なオブジェクト指向言語である。例えばScalaの```1 + 2```はIntクラスの```+```と言うメソッドを呼び出している。

Scalaには**トレイト**(traits)というものがある。トレイトはJavaで言うインタフェースのようなものだが、Javaのインターフェースと違い、メソッドの実装やフィールドを持つことができる。
またクラスにトレイトのメンバーを追加することで*ミックスイン合成*(mixin composition)というテクニックを使うこともできる。

### Scalaは関数型言語である

関数型言語には２つの特徴的な発想がある。

1. 関数を一人前の値(first class value)として扱うことができる。整数や文字列と同様に関数を他の引数に渡したり、処理結果として返すことができる。
1. データはイミュータブル(書き換えができない)ものであるべきという発想。メソッドは副作用(side effect)を持ってはならず。参照透明(referentially transparent)[^1]であるべきという発想がある。




### Scalaを選ぶべき理由

- 互換性
- 簡潔さ
- 高水準の抽象
- 高度な静的型付け

###### 互換性
ScalaはJavaとの相互運用を実現するように設計されている。
ScalaプログラムはコンパイルするとJava仮想マシンバイトコードになる。

###### 簡潔性
極端にいうとScalaのコード量はJavaの10分の1程度に短縮できる。
その理由は2つあり、1つはJavaのように必ず書かなければいけないコードが少ないこと。もう1つはScalaには型推論があり、型情報を反復する必要がないから。という理由があげられる。

###### 高水準の抽象
Javaではループ処理を使った冗長なコードでしか実現できないことをScalaでは述語関数などを用いて簡潔にすることができる。
例えば文字列に大文字が含まれているかを調べる処理はScalaとJavaで以下の違いがある。

```scala
// これはScala
val nameHasUpperCase = name.exists(_.isUpper)
```

```java
// これはJava
boolean nameHasUpperCase = 
     name.chars().anyMatch(
         (int ch) -> Character.isUpperCase((char) ch)
);
```

###### 高度な静的型付け
ScalaにはJavaのような静的型システムを持ちつつ、静的言語によくある冗長性を型推論により取り除き、柔軟性のなさをパターンマッチングと型を記述したり合成できる方法で回避している。

### Scalaのルーツ
Scalaは多くのプログラミング言語の影響を受けている。
表面的にはJavaやC#の構文を採用しているが、オブジェクトモデルはSmalltalk, Rubyから、関数型プログラミングはSML, OCaml, F#に近い。
またアクターベースの並行処理ライブラリであるAkkaはErlangの影響を受けている。


[^1]: 参照透明とはJavaのStringクラスの```replace```メソッドのように元のデータを書き換えない、他の作用を持たないこと
RSpecで試験結果項目に時刻を表示

試験失敗時などに外部のログを照らし合わせたいときは、項目毎に時刻が出力されるよう以下の設定を追加している。

```ruby:spec_helper.rb
RSpec.configure do |c|
	c.format_docstrings { |s| "#{s} (#{Time.now.strftime('%T')})" }
end
```

## サンプル

```ruby:sample_spec.rb
require 'rspec/core'

RSpec.configure do |c|
	c.format_docstrings { |s| "#{s} (#{Time.now.strftime('%T')})" }
end

describe "NaN" do
	subject { Float::NAN }
	it { is_expected.to eq subject } # fails
	it { is_expected.to be subject } # passes
end
```

```text:terminal
$ rspec -fd sample_spec.rb

NaN (04:31:20)
  should eq NaN (04:31:20) (FAILED - 1)
  should equal NaN (04:31:20)

Failures:

  1) NaN should eq NaN
     Failure/Error: it { is_expected.to eq subject } # fails

       expected: NaN
            got: NaN

       (compared using ==)
     # ./sample_spec.rb:9:in `block (2 levels) in <top (required)>'

Finished in 0.0164 seconds (files took 0.1518 seconds to load)
2 examples, 1 failure

Failed examples:

rspec ./sample_spec.rb:9 # NaN should eq NaN
```
ドットファイル(.vimrcなど)をgithubで管理する

# はじめに
そろそろ`.vimrc`などのファイルをGITHUBで管理したくなってきたので、手順をまとめてました。

# 対象者
GITHUBの管理など、もろもろ初級者の方を対象としているので、コマンド等の解説もできる限り補足を入れてまとめています

# ゴール
.vimrcなどのファイルがGITHUBで管理できている状態を目指します

# 作業の大枠
ディレクトリ構造として以下を目指します
[![https://gyazo.com/7e62dbe4748efb176461b904b51279f2](https://i.gyazo.com/7e62dbe4748efb176461b904b51279f2.png)](https://gyazo.com/7e62dbe4748efb176461b904b51279f2)

以下のようにコマンドを実行して管理用のディレクトリとファイルを作成します

```
# dotfilesディレクトリを作成
mkdir ~/dotfiles

# 管理用のファイルを作成
mv  ~/.vimrc ~/dotfiles/vimrc/_vimrc

# シンボルリンクリンクを作成
ln -s ~/dotfiles/vimrc/_vimrc ~/.vimrc
```
※シンボルリンクとは？
http://kazmax.zpp.jp/linux_beginner/symbolic_link.html

GITHUBのリポジトリを管理します

```
#dotfilesをgithubで管理する。
cd ~/dotfiles/vimrc
git init
touch README
git add README
git add _vimrc
git commit -m 'first_commit'
```