OmniAICreator/Qiita-1.07M huggingface dataset:
WordPress (AMIMOTO) で 502 Bad Gateway が表示されたので、調べてみたら php-fpm.sock failed (2: No such file or directory) とのエラーメッセージが…

# ０．はじめに

AWS EC2 AMIMOTO で WordPress サイトを構築していたんですが、

* [AMIMOTO AMI を使って、WordPress を立ち上げて、接続先を RDS に変更してみる \- Qiita](https://qiita.com/kusokamayarou/items/58d550b82b960c321c3a)

CloudFront やら ALB を適用し、

* [SSL 化済みの WordPress サイトに CloudFront を適用してみる \- Qiita](https://qiita.com/kusokamayarou/items/21e4bcdaa7c8dd8523ab)
* [CloudFront 適用済みの WordPress サイトに ALB を適用してみる \- Qiita](https://qiita.com/kusokamayarou/items/1229bed12462eee48e68)

ALB - EC2 間を HTTPS(443) から HTTP(80) で通信する様に変更しようとしたところ、

* [CloudFront 適用済みの WordPress サイトに ALB を適用後、ALB \- WordPress 間を HTTP\(80番\) で通信させてみる \- Qiita](https://qiita.com/kusokamayarou/items/edffa0f1159f60a2ce82)

「502 Bad Gateway」 が表示されました。

# １．Nginx のアクセスログを確認する。
1. Nginx のアクセスログを確認したところ、以下の様なエラーメッセージが見つかりました。
    * `2019/04/25 19:23:05 [crit] 2617#2617: *75 connect() to unix:/var/run/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: ***.***.***.***, server: _, request: "GET / HTTP/1.0", upstream: "fastcgi://unix:/var/run/php-fpm.sock:", host: "***.***.***.***"`

# ２．php-fpm について色々と確認すると…。
1. php-fpm について色々と確認してみたところ、そもそもサービスが動いていないことが判明。
    * $ `chkconfig`
    * $ `php70-php-fpm  	0:off	1:off	2:off	3:off	4:off	5:off	6:off`
1. php-fpm を自動起動する様に chkconfig on を実行。
    * $ `chkconfig php70-php-fpm on`
    * $ `chkconfig`
    * $ `php70-php-fpm   0:off   1:off   2:on    3:on    4:on    5:on    6:off`

# ３．php-fpm の www.conf を変更する。
1. 以下の手順に従って、php-fpm の www.conf を変更します。php70-php-fpm では、/etc/opt/remi/php70/php-fpm.d 配下にありました。
<ul>
<li>$ `cd /etc/opt/remi/php70/php-fpm.d/`</li>
<li>$ `sudo cp -fp www.conf www.conf.ORG`</li>
<li>$ `ls -la`</li>
<li>$ `sudo vi www.conf`</li>
<ul><li><pre><code>
38c38
< listen = 127.0.0.1:9000
---
> listen = /var/run/php-fpm.sock
48,50c48,50
< ;listen.owner = nobody
< ;listen.group = nobody
< ;listen.mode = 0660
---
> listen.owner = nginx
> listen.group = nginx
> listen.mode = 0660
</pre></code></li></ul>
</ul>
   * ※参考
       * [nginxでphpのパッケージを追加したら’502 Bad Gateway’になってしまったときの対処法 \| かわたま\.net](http://kawatama.net/web/1352)
       * [Saba note \| nginx \| nginxのphp\-fpmでハマる](https://saba.omnioo.com/note/2088/nginx%E3%81%AEphp-fpm%E3%81%A7%E3%83%8F%E3%83%9E%E3%82%8B/)
       * [NGINXでエラーが出た時の対処法 \| ハックノート](https://hacknote.jp/archives/38587/)
1. 設定変更後、サーバーを再起動します。

# ９９．ハマりポイント

* そこまでハマった訳ではないですが…。
<br><br>
* 最初、www.conf を変更しても何も変わらず…、ちょっとうんうん唸っていたら、php-fpm が起動していないことに気づきました。
* 盲点でした…。

# ＸＸ．まとめ

とりあえず、ご参考になれば♪
Rubyで begin ... end と ( ... ) にwhile修飾子を適用したときの違い

`begin ... end` と `(...)` は例外処理の可否を除いて同じ動作だと思っていたが違った。

きっかけは、C言語でいう `do { ... } while(0);` （ブロックを1回だけ実行）をRubyで試したこと。

```ruby
puts "example 1" while false

(
	puts "example 2"
) while false

begin
	puts "example 3"
end while false
```

```text:output
example 3
```

Rubyにおいては例1,2の動作が自然だと思っていたので、C言語の例のようなことはできないと思っていたが、例3の通り `begin ... end` なら問題なく中身が実行された。

## 文法の仕様確認
[JIS X 3017](https://kikakurui.com/x3/X3017-2013-01.html) を確認してみたところ、意外なことに**処理系定義**だった。

> ### 12.5 while 修飾文
> 
> 構文規則
> 《while修飾文》 ::
> &ensp;&ensp;&ensp;&ensp; 《文》  ［《行終端子》禁止］  “while”  《式》
> 
> 意味規則
> &emsp; S “while” E という形式の《while 修飾文》（ここで，S は《文》，E は《式》とする。）は，次の手順で評価する。
> a)  **S が《begin 式》の場合，動作は処理系定義とする。**
> b)  “while” E “do” S “end”  という形式の《while 式》を評価する。 
> c)  評価結果の値を，《while 修飾文》の値とする。

処理系定義の場合は動作をドキュメントに書かなければならないらしい。[Rubyリファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html)を見たら、確かに明記されていた。



> ### while 修飾子
> 
> 例:
> 
> ```ruby
sleep(60) while io_not_ready?
```
> 
> 文法:
> 
> ```ruby
式 while 式
```
> 
> 右辺の式を評価した値が真の間、左辺を繰り返し実行します。
> 
> **左辺の式が begin 節である場合にはそれを最初に一回評価してから繰り返します。**
> 
> 例:
> 
> ```ruby
send_request(data)
begin
  res = get_response()
end while res == 'Continue'
```
> 
> while 修飾した式は nil を返します。 また、引数を伴った break により while 修飾した式の戻り値をその値にすることもできます。

## 他の場合
仕様を見たら明らかだが、

* until修飾子も `begin ... end` に対しては処理系定義
* if修飾子、unless修飾子は特別扱いなし（これは当然だろう）
VBAでオブジェクトを戻り値としてセットする方法。

備忘録として残します。

#■やり方
`Set 関数名 = オブジェクト`で戻り値にセットできます。

```vb
Private Function testFunc() As Object 'または　As Variant
    Set obj = CreateObject("Scripting.Dictionary")
    'testFunc = obj 'NG
    Set testFunc = obj 'OK
End Function
```
関数の呼び出し元も戻り値はSetで受け取らないといけません。

```vb
Private Function main()
    Set returnObj = testFunc()
End Function
```
#■余談
Setなくてもフレキシブルに渡してやれとか受け取ってくれとか思いますが、もうVBにキレるのは疲れました。
【今日使えるどうでもいい雑学】エクセル(xlsx)を解凍、圧縮してみる(XML)

# はじめに
普段何気なくつかっているエクセル(xlsx)ですが、作りについて
ちょっとだけ書いてみようと思います。
今日の飲み会のネタくらいにしてください。


```
$ file test.xlsx
test.xlsx: Microsoft Excel 2007+
$
```

いきなり結論を書きますが、実はxlsxはzipされたファイルなんですね。
なんでunzipコマンドで解凍することが可能なんです。
※逆も可能

中身はxmlの集合体なんですね。

## 解凍

```
$ unzip test.xlsx
Archive:  test.xlsx
  inflating: [Content_Types].xml
  inflating: _rels/.rels
  inflating: xl/_rels/workbook.xml.rels
  inflating: xl/workbook.xml
  inflating: xl/sharedStrings.xml
  inflating: xl/theme/theme1.xml
  inflating: xl/styles.xml
  inflating: xl/worksheets/sheet1.xml
  inflating: docProps/core.xml
  inflating: docProps/app.xml
$
```


## 再圧縮

※解凍の時に自分自身(test.xlsx)が残ってしまうので
どっかにmvしておきましょう

```
$ mv test.xlsx  ../.
```

`-r` つけないと圧縮後ファイルが開けないので注意

```
$ zip -r ~/aaa.xlsx *
  adding: [Content_Types].xml (deflated 71%)
  adding: _rels/ (stored 0%)
  adding: _rels/.rels (deflated 60%)
  adding: docProps/ (stored 0%)
  adding: docProps/app.xml (deflated 49%)
  adding: docProps/core.xml (deflated 48%)
  adding: xl/ (stored 0%)
  adding: xl/workbook.xml (deflated 58%)
  adding: xl/worksheets/ (stored 0%)
  adding: xl/worksheets/sheet1.xml (deflated 93%)
  adding: xl/styles.xml (deflated 61%)
  adding: xl/theme/ (stored 0%)
  adding: xl/theme/theme1.xml (deflated 80%)
  adding: xl/_rels/ (stored 0%)
  adding: xl/_rels/workbook.xml.rels (deflated 66%)
  adding: xl/sharedStrings.xml (deflated 17%)
$
```

## 中身の確認

`xl/worksheets/` 配下なんかは知っている感じの名前がでてきますよね。
ちなみに中身はこんなかんじです(フォーマットしています)

```xml
   <sheetViews>
        <sheetView tabSelected="1" workbookViewId="0">
            <selection activeCell="A2" sqref="A2"/>
        </sheetView>
    </sheetViews>
    <sheetFormatPr baseColWidth="10" defaultRowHeight="20"/>
    <sheetData>
        <row r="2" spans="2:28">
            <c r="B2" t="s">
                <v>0</v>
            </c>
            <c r="C2" t="s">
                <v>0</v>
            </c>
(略)
```

<v>0<v>はsharedStrings.xmlの0番目の要素ってことです。

```xml
    <si>
        <t>aaaa</t>
        <phoneticPr fontId="1"/>
    </si>
(略)
```

ここだと、C2セルとかの値はaaaaだということですね。

## 注意点

※エクセルの仕様はなかなか複雑で、このxmlたちを組み合わせて色やセル操作をしています。
（私自身エクセルの仕様に明るいわけではないので間違っていたらご指摘ください）

常人はそこまで理解する必要はまったくないし、xmlをparseしてなにかしようとすると、高確率で挫折するのでやめましょうw

※実はkotlinでxmlをparseするコード書いたんですが、全然網羅できなくて諦めました...w


飲み会のネタ程度にどうぞ。

それでは良い エクセル ライフを！
Agilent MicroArray(1色法)解析備忘録２

グラフ作る

#データフレーム化
1列目が遺伝子名、2列目が発現量の平均、3列目以降が各群の発現量とします。
そして最終列に比較したい群間の発現量の差を置きます。

```R
coe <- fit$coefficients
gene <- fit$genes$GeneName
ame <- fit$Amean

x <- cbind(cbind(gene,ame),coe)
x <- as.data.frame(x)
for (i in 2:ncol(x)){
x[,i] <- as.numeric(as.character(x[,i]))
}
x$contrast <- x$KO-x$WT
```

#散布図
###黒一色
```R
xlim=c(0,20)
ylim=c(-5,5)
plot(x[,2],x[,ncol(x)],col="black",
     xlab="Mean",ylab="Difference",main="WT vs KO",xlim=xlim,ylim=ylim)
```

main：グラフタイトル
xlab, ylab：軸ラベル
xlim, ylim：軸範囲

###発現量に応じて色分け
```R
xlim=c(0,20)
ylim=c(-5,5)

plot(x[x$contrast<(-1),2],x[x$contrast<(-1),ncol(x)],col="blue",
     xlab="",ylab="",xlim=xlim,ylim=ylim)
par(new=T)
plot(x[x$contrast>1,2],x[x$contrast>1,ncol(x)],col="red",
     xlab="",ylab="",xlim=xlim,ylim=ylim)
par(new=T)
plot(x[x$contrast<1 & x$contrast > -1 ,2],x[x$contrast<1 & x$contrast > -1 ,ncol(x)],col="black",
     xlab="Mean",ylab="Difference",main="WT vs KO",xlim=xlim,ylim=ylim)
```
xlim, ylimは3色全てで同じになるように指定する必要あり

###特定遺伝子をプロット
上記のものに追記する形で表示できます。今回はシンボルから指定します。

```R
par(new=T)
gene_name="Gapdh"
plot(x[tolower(x[,1])==tolower(gene_name),2],x[x[,1])==tolower(gene_name),ncol(x)],col="Green", pch=19, cex=1.5, 
     xlab="",ylab="",xlim=xlim,ylim=ylim)
```

pch：点の形状
cex：点のサイズ
1遺伝子に対し、プローブが複数あるので、複数プロットされることがあります。

###遺伝子セットのプロット
GSEA(http://software.broadinstitute.org/gsea/index.jsp) からダウンロードしたtxtファイルを想定してます。

```R
target <- read.table("geneset.txt",header=F,skip=2)
target <- target$V1
cols <- rainbow(length(target))

for (i in target){
par(new=T)
plot(x[tolower(x[,1])==tolower(i),2],x[tolower(x[,1])==tolower(i),ncol(x)],col=cols[col_num], pch=19, cex=1.5, 
     xlab="",ylab="",xlim=xlim,ylim=ylim)
col_num <- col_num+1}
```

遺伝子ごとに色を変えるようにしたんですが、遺伝子数が多いと却って分かりにくくなってしまった感

#おわり
かなり強引にやってしまった感が強いので、スマートな方法知ってる人いたら教えてください
Zabbix Jenkinsのビルド失敗監視

#Zabbix
 - アイテムで下記のshをキック
 - トリガーでリターン値判定

#/usr/lib/zabbix/externalscripts/jenkins_lastbuild.sh
return 1:fail 0:success

```bash
#!/bin/bash

str=`curl -s "http://jenkins.domain.com:8080/job/{プロジェクト名}/lastBuild/api/json?pretty=true" \
     | jq .result \
     | sed -e 's/"//g'`

ret=1

if [ "$str" == "SUCCESS" ]
then
  ret=0
fi

echo $ret
```


#メモ
ビルド失敗を担当に通知できるようになった。
伝言ゲームの１つが減った。
ABC - 034- A&B&C

#AtCoder ABC 034 A&B&C
[AtCoder - 034](https://atcoder.jp/contests/abc034)

**2019/05/14追記**
　C問題の満点解法を追記

#A問題

```java
	private void solveA() {
		int x = nextInt();
		int y = nextInt();

		out.println(x < y ? "Better" : "Worse");
	}
```

#B問題

 - 奇偶判定

```java
	private void solveB() {
		int numN = nextInt();

		out.println((numN & 1) == 1 ? numN + 1 : numN - 1);
	}
```

#C問題：満点解法/逆元の利用(2019/05/14追記)

 - **参考サイト**

解法の考え方と、その実装方法

 - [高1スタンダードレベル数学ⅠAⅡB最短経路]( https://studysapuri.jp/contents/high/article/subject/math00024.html)
 - [順列と組み合わせの違い・カンタンな見分け方を教えます！](https://www.studyplus.jp/371#%E9%A0%86%E5%88%97%28Permutation%29%E3%81%A8%E3%81%AF)
    - そもそもの解法の意味が分からない場合は上記二つで。。。年取ると物忘れが激しい。

 - [「1000000007 で割ったあまり」の求め方を総特集！ 〜 逆元から離散対数まで 〜](https://qiita.com/drken/items/3b4fdf0a78e7a138cd9a)
    - 解法がわかっても逆元がわからないと実装しても桁あふれする
 - [よくやる二項係数 (nCk mod. p)、逆元 (a^-1 mod. p) の求め方](http://drken1215.hatenablog.com/entry/2018/06/08/210000)
    - こちらの実装も試したが、現時点では実装した内容が理解範囲外だったためjavaのライブラリで実装
 - [合同式の証明や問題の解き方を解説！大学受験で使いこなそう！](https://www.studyplus.jp/430)


**逆元の求め方ですが、javaだとBigIntegerがそのものずばりの#modInverse()を持っているので其方を利用**


```java
	/*
	 * 経路組み合わせ
	 *
	 */
	private void solveC() {
		final long CONST_MOD = (long) (Math.pow(10, 9) + 7);

		int w = nextInt() - 1;
		int h = nextInt() - 1;

		long mole = 1;
		for (int i = 1; i <= w + h; i++) {
			mole *= i;
			mole %= CONST_MOD;
		}
		long deno = 1;
		for (int i = 1; i <= w; i++) {
			deno *= i;
			deno %= CONST_MOD;
		}
		for (int i = 1; i <= h; i++) {
			deno *= i;
			deno %= CONST_MOD;
		}
		/*
		 * mod 100000007における denoの逆元を求める
		 * deno^-1(mod CONST_MOD)
		 */
		BigInteger denoModInverse = new BigInteger(Long.toString(deno))
				.modInverse(new BigInteger(Long.toString(CONST_MOD)));

		out.println(new BigInteger(Long.toString(mole)).multiply(denoModInverse)
				.mod(new BigInteger(Long.toString(CONST_MOD))));
	}
```


#C問題：MLEのため100点です。101点解法ではありません。

 - メモ化再帰で書いたけど、、、解説の101点解法が理解できない。。。。
    - DPではないけれど、メモ化すれば100点は取れた。

```java
/*
	 * MLE version
	 */
	private void solveC2() {
		int w = nextInt();
		int h = nextInt();

		long[][] memo = new long[w + 1][h + 1];

		out.println(dfsC2(w, h, 1, 1, memo) % CONST);
	}

	private long dfsC2(int w, int h, int currentW, int currentH, long[][] memo) {

		if (w == currentW && h == currentH) {
			return 1;
		}
		if (memo[currentW][currentH] != 0) {
			return memo[currentW][currentH];
		}

		long val1 = 0;
		if (currentW < w) {
			val1 = dfsC2(w, h, currentW + 1, currentH, memo) % CONST;
		}
		long val2 = 0;
		if (currentH < h) {
			val2 = dfsC2(w, h, currentW, currentH + 1, memo) % CONST;
		}

		return memo[currentW][currentH] = (val1 + val2) % CONST;
	}
```

#C問題：DP・・・これもMLE

```java
	/*
	 * DP version
	 */
	private void solveC() {
		int w = nextInt();
		int h = nextInt();

		long[][] memo = new long[w + 2][h + 2];
		memo[1][1] = 1;

		for (int i = 1; i <= w; i++) {
			for (int j = 1; j <= h; j++) {
				memo[i + 1][j] = (memo[i + 1][j] + memo[i][j]) % CONST;
				memo[i][j + 1] = (memo[i][j + 1] + memo[i][j]) % CONST;
			}
		}
		out.println(memo[w][h]);
	}
```
redlockでレースコンディションを解消する

## 背景
```shell
Rails version             5.0.3
Ruby version              2.3.3-p222 (x86_64-darwin18)
RubyGems version          2.5.2
Rack version              2.0.3
JavaScript Runtime        therubyracer (V8)
Database adapter          mysql2spatial
```

Sidekiqのワーカーが並列実行する時に、レコードが重複に生成されて、そのレースコンディションを解消するために、Redlockを使ってみました。

## 前提
- 必要な概念
 - Segment
 - Location
 - Place
 - User

```ruby
segemnt : location => m : n
place : location => 1 : n
user : location => 1 : n
segment : user => m : n
```

- segment作成
  - segment workerの中でplace_idとuser_idを使って、locationを生成する　

## 起因
同じplaceを使って、同時に複数のsegmentを作成しようとすると、複数のlocationを作られてしまう。同じplace_idとuser_idに対して、唯一のlocationを作られるのは望ましいですが、そうではなかった。

## 検討
原因はDatabaseのlocationテーブルにそういう制御を入れなかった。

```ruby
add_index :locations, %[place_id user_id]
```

もし↑の制御があれば、レコードを作成する時に、テーブルをロックされるので、重複作成はないはず。

## 対応
### 案A: Databae layer
- 重複レコードを削除し、インデックスを貼る

既に重複のレコードを作られてしまって、運用も始めているため、削除するなら、全てのリレーションを直さないといけないので、ほぼ不可能です！

削除しないとインデックスを貼れないので、この案は見送り！

### 案B: Application layer
- pessimistic lockを使って、レースコンディションを解消

ちょうどredisを使っているので、redisをそのまま使って制御したいので、[PatrickTulskie/redis\-lock: Pessimistic locking for ruby redis](https://github.com/PatrickTulskie/redis-lock/) を使ってみた

実装的には意外に簡単でした。

```ruby

def lock_manager
    Redlock::Client.new(
      [
        ENV['REDIS_ENDPOINT']
      ],
      retry_count: 3,
      retry_delay: 1000, # milliseconds
      retry_jitter: 50, # milliseconds
      redis_timeout: 5 # seconds
    )
end

lock_manager.lock!(resource, 4000) do
  find_or_create_location(user_id, place_id, feature)
end
```

- 4000 
    - 4秒以内lockを取れなかったら、タイムアウトする
- retry_count: 3
    - lockを取るまで、三回リトライする
- redis_timeout: 5 # seconds
    - redisとの接続は５秒タイムアウトする

## 感想
初期にDatabaseにインデックスをちゃんと追加すればこんなことが起きないはずです。

DBの仕事をDBに任せるべき。アプリケーションレイヤで頑張るとちょっと大変！
[React]setState は state の変更リクエストを出すだけ

## 概要
機会があって React をいじっていたときのことです。

**「`setState()` したのに `state` が更新されていない！なぜ！？ホワイ！？」**

という出来事がありました。そのときの失敗談を共有したいと思います。

## 詳細
サンプルコードです。
注目してほしいのは `componentDidMount` のところです。`setState` を呼んだ直後に `state` をコンソールに出してみたところ値が変わっていません。(この時点で、**「ん？それの何がおかしいの？」** という賢明な識者の方は特にこの記事から得るものは何もないと思いますのでブラウザバックでおｋです)

```js
class MessageBox extends React.Component {
  constructor() {
    super()
    console.log("Called constructor")

    //初期値
    this.state = {
      message: "なんでもしますから"
    }
  }

  componentDidMount() {
    console.log("Called componentDidMount")

    //state を更新(した気になる...がしかし)
    this.setState({message: "なんでもするとは言ってない"})

    console.log("Called setState in componentDidMount")

    //state が変わってない！！
    console.log("state.message => " + this.state.message) // => "なんでもしますから"
  }

  render() {
    console.log("Called render")

    //ここでようやく setState で予約した state の変更を確認
    console.log("state.message => " + this.state.message) //=> "なんでもするとは言ってない"
    return (<p>message: {this.state.message}</p>)
  }
}

React.render(<MessageBox />, document.getElementById('app'));
```

`componentDidMount` で `setState` を呼ぶという状況があったんですが、その直後に `state` から値を取得したら古いもののままでした。`componentDidMount` 内ですぐ更新後の値を使いたい、という場面があったためちょっとハマりました。


## 答え
公式ドキュメントに載ってました
https://reactjs.org/docs/react-component.html#setstate

> Think of setState() as a request rather than an immediate command to update the component.

**`setState()` は即コンポーネントの更新をするコマンドではない** ことがはっきり書かれています。`setState()` を呼んだ段階では `state` の変更リクエストを出したにすぎず、その時点で即時反映されるわけではないんですね。 **仕様通りやん＼(^o^)／** ここでは `componentDidMount` の処理がまだ続いているため再レンダリングは行われていません。なので `state` の変更リクエストはまだ処理されていないということなのでしょう。

言われてみればそうしないと、`componentDidMount` 内で `setState` を何度も呼んだ場合は、その度に再レンダリングが行われてしまいそうです。なるほど、そう考えると理に適ってます。でも名前がちょっと紛らわしいのでいっそのこと `setChangeStateRequest()` みたいな名前でもよかったようなｗ

## `console.log` での確認
`console.log` を節目に仕込んでみましたので出力からも挙動を確認できます。
このサンプルコードを実行すると以下のような状態になります。(見やすくするため、メソッドごとに改行は入れてます)

```js
"Called constructor"
"Called render"
"state.message => なんでもしますから"

"Called componentDidMount"
"Called setState in componentDidMount"
"state.message => なんでもしますから" //まだ setState する前と値が変わってない!!

"Called render"
"state.message => なんでもするとは言ってない" //ここでようやく setState が反映される
```

## 今日の教訓
**`setState()` しても `state` の更新を予約するだけで、すぐには `state` は更新されません。**`render()` が呼ばれる前に更新後の値をすぐ使いたい、という場合はご注意ください。(あまりないとはおもいますが)

## おまけ
検証に使ったコードを CodePen に残してみました。興味のある方はお立ち寄りください。
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="jpsern" data-slug-hash="PgxjpY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="React at CodePen">
  <span>See the Pen <a href="https://codepen.io/jpsern/pen/PgxjpY/">
  React at CodePen</a> by TOMMY a.k.a. Jpsern, Jps. (<a href="https://codepen.io/jpsern">@jpsern</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
RedmineとSlackの連携（三度目の正直）

#これまでの経緯
https://qiita.com/asuzuki2008/items/1a310d66959e06376911
https://qiita.com/asuzuki2008/items/71a800e0a356ce59b914

上記の投稿でRedmineとSlackの連携を図ってきた。
ところがついこの間、Slackに連絡がこないことに気づく。

デバッグすると送られる。
しかし、トリガー（GASを1分毎に実行するように設定したもの）から実行されるときには、メールだけ届かない。


．．．．．．．．．．．．Σ(￣ロ￣lll)ｶﾞｰﾝ
？・・・そもそもGASで色々書けるんだから、直接Slackに投げれんじゃね？

ということで今回は、GASから直接Slackに投げる方法でスクリプトをつくりなおした。
なんかあほらしいな。。。

#事前準備

##Slack側

### Incoming Webhookをインストール
https://openwave-co.slack.com/apps/A0F7XDUAZ--incoming-webhook-?next_id=0

インストールした後、どのチャンネルに受信するかみたいな設定をすると、**Webhook URL**が与えられる。

##Gmail側

RedmineにGmailユーザに入れて、プロジェクトで必ずメール受け取る設定にしておく。

#GAS作成

```
var FindSubject = 'subject:(件名で引っ掛けたい文言) label:inbox -in:starred';
 
function getMail(){
 
  //指定した件名のスレッドを検索して取得 
  var myThreads = GmailApp.search(FindSubject, 0, 10); 
  //スレッドからメールを取得し二次元配列に格納
  var myMessages = GmailApp.getMessagesForThreads(myThreads);
 
  for(var i in myMessages){
    var count = 0;
    for(var j in myMessages[i]){
      count++;
      var strSubject = myMessages[i][j].getSubject();
      var strMessage = '';
      strMessage += AutoLink(myMessages[i][j].getBody());
      strMessage += myMessages[i][j].getPlainBody().slice(0, 200);
      // メッセージのスレッドは、過去の返信履歴なども持っているため、最後のメールにだけ反応させる
      if(count == myMessages[i].length){
        sendSlack(strSubject, strMessage);
      }
      
      //処理済みのメッセージをスターをつける
      myMessages[i][j].star(); 
    }
  }
}
function AutoLink(str) {
  var regexp_url = /((h?)(ttps?:\/\/[a-zA-Z0-9.\-_@:/~?%&;=+#',()*!]+))/g; // ']))/;
    var regexp_makeLink = function(all, url, h, href) {
        return '<a href="h' + href + '">' + url + '</a>';
    }
    link = '\n\n' + str.match(regexp_url)[0]
    return link;
}

function sendSlack(strSubject, strMessage){
  // Make a POST request with a JSON payload.
  var data = {
    'text': strMessage,
    'pretext': strSubject,
  };
  var options = {
    'method' : 'post',
    'contentType': 'application/json',
    // Convert the JavaScript object to a JSON string.
    'payload' : JSON.stringify(data)
  };
  UrlFetchApp.fetch("Webhook URLを記述", options);
}

```

あとはGASのトリガーを設定。以下と同じ。
https://qiita.com/asuzuki2008/items/1a310d66959e06376911

#最後に
三回も作り直すのは想定外だったな。。
ほんとにこれを最後にしたい。

因みに、textの中にメンション書いてみたりしたけど有効にならない。
多分この辺は色々テクニックあるのだろうな。
だけど、Webhookの説明にはその辺のことあまり詳しく書かれていない。（ように見えた）
underscoreをprepack 


-prepackは関数の再計算と再配置をしてcodeの最適化をする。内部はconst let varも全てvarとなる。
-ECMA6まで対応しようとしている。async await はエラーを吐く。
-demo https://codepen.io/gnjo/pen/jRXYpz?editors=1010
underscoreをprepack 

```js
//core
 let result = Prepack.prepackSources(sources, options)////
 //console.log(result)
 ;
 let r=document.querySelector('#ret')
 r.textContent=result.code
```
```html
//pug
script(src="https://gnjo.github.io/prepack.min.js")
#ret(contenteditable="plaintext-only")
```
MacのターミナルをeDEX-UIでかっこよくする

アイアンマンやトロンなどのSF映画で見るかっこいい画面
Rainmeterとか使ったらめっちゃかっこよく出来るけどMacのターミナルもかっこよくしたくなったから調べて構築してみた

# そもそも eDEX-UI ってなに
超かっこいいコンピューターインターフェイスを実現するnode/JavaScript製オープンソース・ソフトウェア
<img width="1439" alt="スクリーンショット 2019-04-26 9.40.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354659/d36bfcbf-a9f7-1a1e-b1c4-f30c5c0d1775.png">

Vimも起動できちゃう
<img width="1440" alt="スクリーンショット 2019-04-26 9.40.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354659/8857d266-163e-5a9c-95ce-f4be203018cf.png">
厨ニ感満載だけど最高にかっこいい
特に起動時の音がめちゃくちゃかっこいい。。

# 構築方法
Nodeは導入済みを想定
以下3つのコマンドで起動準備は完了
めっちゃ簡単。。

```
$ git clone https://github.com/GitSquared/edex-ui.git
$ cd edex-ui
$ npm run install-linux
$ npm start
```

ファイアウォールを有効にしている場合はアクセスを許可する
<img width="416" alt="スクリーンショット 2019-04-26 9.57.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354659/110ce11b-5474-38ff-58b1-6fa5902e4a78.png">

これで基本的には機能するはずだが
僕の場合はディレクトリが見つからないとエラーが出たので少し編集

起動した際に自動で
/Users/[username]/Library/Application Support/eDEX-UI
に各種設定ファイルたちが作られるので、その中の **settings.json** を開いてcwdという項目に書いてあるパスを/Users/[username]に書き換えた

編集後に再起動すると起動した際に表示されるディレクトリがユーザーホームディレクトリになっていると思う

ファイルアイコンもしっかり作り込まれているし
周りに出るインフォメーションも正確な値を出しているのは驚いた

意外に使えるかも…？
C言語でマルチプロセスの排他制御のやり方

# 概要

C言語にて、実行ファイルが異なる場合のマルチプロセスでの排他を行ったときのメモ

## コード

[GitHub](https://github.com/maruwo/mutex.git)


## 処理の流れ

1. 共有メモリのkeyを作成
2. 共有メモリを作成
3. 共有メモリ上にmutexオブジェクトを作成
4. 共有メモリ上のmutexでロック/アンロック

### 1. 共有メモリのkeyを作成

あまり気にしない場合、shmgetで使用する key は IPC_PRIVATE としていたが、マルチプロセスだとそれぞれで共有メモリを作成してしまう。
その状態だと、mutex作成後のforkではうまくいくが、実行ファイルが異なるとうまく排他できない。

そのため、shmget で key を指定することで、別の実行ファイルでも同じ共有メモリを使用できるようになる。

ftok は、存在するファイルパスと 0 以上の proj_id で key を作成してくれる。


### 2. 共有メモリを作成

作成した key を使い、shmget する。

IPC_CREAT | IPC_EXCL を指定すると、key に対する共有メモリが存在しない場合には作成し、すでに存在する場合はエラーとなる。
これによって、この後の初期化関連の処理をするかしないかを判断できる。


### 3. 共有メモリ上にmutexオブジェクトを作成

通常と変わらず、mutexオブジェクトを作成する。


### 4. 共有メモリ上のmutexでロック/アンロック

通常と同じく、必要な箇所でロック/アンロックする。


# まとめ

- 実行ファイルが異なる場合には共有メモリの key を指定しなくてはならない。
- 実行ファイルが一つなら pthread_mutexattr_setpshared のみで大丈夫そう。
    - IPC_PRIVATE が使える。

## 懸念点

- ftok が衝突する確率の確認
Finding words in scripts over folders

# Issue
You have a lot of scripts in a folder (or folders), and you want to find the ones containing specific words.

Here is an example.
I have a lot of python scripts, and I want to find the ones uses a specific functions, say "ImageDataGenerator".
<img width="1110" alt="Screen Shot 2019-04-25 at 5.41.41 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345318/efe68167-1ec1-fc9e-3968-15261a9173b8.png">

# Solution
```terminal
C:\Windows\system32>d:
D:\>findstr "ImageDataGenerator" *.py
```

You can change the drive by simply input ```d:```. 
Use ```findstr "<TARGET STRING>" <PATH NAME>``` to find the scripts containing *TARGET STRING*.

That's it.
typescript+vueで独自プラグインを実装する方法

こんにちわgakuです。
最近、また、vue+firebase欲が出てきてしこしこ勉強している今日この頃でございます。

さて、久しぶりにvue-cliをupdateすると、「TypeScript」周りがかなり強化されていることに気づきました。
今まで、「TypeScript+vueは人類には早すぎる」と思っておりましたが、そろそろ言い訳もできない感じになってきましたので、こちらも習得中でございます。

そんな中、Vue+TypeScriptを触っていると、独自プラグインの実装で結構ハマった点があったので、今回はそんな話を記載しようかと思います。

# 動かない独自プラグイン
firebaseをvueに組み込む際、component内で触りやすくするために独自プラグインを実装し使用するとちょっとだけ楽になります。
具体的には以下のように記述することで、どのcomponentでも「this.$auth.・・・」、「this.$firestore.・・・」みたいな形でアクセスすることができ、importを毎度行わなくてよくなります。

```typescript:src/firebase/index.ts
import firebase from 'firebase/app';
import 'firebase/firestore';
import 'firebase/auth';
import config from './config';

export default {
  install(Vue: any, options: any) {
    const firebaseApp = firebase.initializeApp(config);

    // instance propertyの登録
    Vue.prototype.$firestore = firebaseApp.firestore();
    Vue.prototype.$auth = firebaseApp.auth();
  },
};
```

```typescript:src/firebase/config.ts
export default{
    apiKey: '***',
    authDomain: '***',
    databaseURL: '***',
    projectId: '***',
    storageBucket: '***',
    messagingSenderId: '***',
};
```

で、こんな感じで実装したら、main.tsで以下を追記することで、vue+jsの時はすんなり動きました。

```typescript:src/main.ts
import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import './registerServiceWorker';
import firebase from './firebase'; // 追記

Vue.use(firebase); //追記
Vue.config.productionTip = false;

new Vue({
  router,
  store,
  render: (h) => h(App),
}).$mount('#app');
```

が、TypeScriptだとErrorが出て死にます。(カナシミ(´・ω・｀)

```text
ERROR in /Users/gaku/src/bitbucket.org/gakussolution/esetwitter/app/src/views/Signup.vue
23:10 Property '$auth' does not exist on type 'Signup'.
    21 | 
    22 |   public signUp() {
  > 23 |     this.$auth.createUserWithEmailAndPassword(this.username, this.password)
       |          ^
    24 |         .then((data: firebase.auth.UserCredential) => {
    25 |           if (data.user !== null) {
    26 |             this.$router.push({name: 'home'});
ERROR in /Users/gaku/src/bitbucket.org/gakussolution/esetwitter/app/src/views/Signup.vue
34:10 Property '$firestore' does not exist on type 'Signup'.
    32 |   }
    33 |   public insert() {
  > 34 |     this.$firestore.collection('test').add({
       |          ^
    35 |       name: 'test',
    36 |       disp: 'testtest',
    37 |     });
```

# 対処法
TypeScriptの場合、こういったプラグインの実装には新たに型定義情報を追加してあげる必要があるみたいです。
なので、型定義を以下のように記述し配置してあげます。

```typescript:src/firebase-type.d.ts
import Vue from 'vue'
import firebase from 'firebase/app'

declare module 'vue/types/vue' {
  interface Vue {
    $auth: firebase.auth.Auth,
    $firestore: firebase.firestore.Firestore
  }
}
```

これで先程出力されたerrorがなくなり、めでたくcomponent内で「this.$auth.・・・」でアクセスできるようになります(´・ω・｀)b

# おわりに
vue+TypeScriptはかなり人類に優しくなりましたね。
vue-cli3.6だと、component内で「vue-property-decorator」を呼び出すテンプレートが記述されており、かなり迷いなく実装することができるようになったのではないかという印象です。
(2018年の終わり頃の段階では、このライブラリはテンプレート内に記述されておらず、実装者が選定するものであったと記憶しています。

また、最近、エディタをvimからVSCodeに最近変更しました。
VSCodeだと、設定ほぼ無しで補完がばっちばちに効いてくれるのでTypeScriptは良い感じだなと思っております。
鉄道(4) ToicaとManacaは統合できないのか

交通カードで地域に複数あると手間。

定期券は、１枚で、終点どおしが接続しているものは購入できる。

しかし、それぞれの終点で接続していない定期券は購入できない。

結果、２枚持ちになる。

しょっちゅう、改札で間違えて、タッチして、取り消してもらっている。

この無駄を省くには、統合するか、終点ではない接続の定期を発行してもらうかのどちらか。

# 終点で接続していない定期券発行

なぜ発行しないかのシステム上の理由を調査中。

# Toicaとmanacaの統合
manacaは、名鉄と名古屋市営地下鉄という運営主体が異なる組織で共通に使えるのが便利。

JRも一緒になると嬉しい。

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
print() を使う前に PySnooper

前提: [ログ出力のための print と import logging はやめてほしい](https://qiita.com/amedama/items/b856b2f30c2f38665701)

どの行を実行しているかをとりあえず `print()` でばらまくのは論外として、デバッグ時に `logger.debug()` ぶちまくと言うのも不本意です。

そこでちょっとおもしろいライブラリを教えてもらったので共有します

https://github.com/cool-RR/PySnooper

とりあえず使ってみます。フィボナッチの実装面は目をつぶってください。

```python

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        fib1 = 1
        fib2 = 0
        for i in range(2, n):
            fib = fib1 + fib2
            fib2 = fib1
            fib1 = fib
        return fib


if __name__ == '__main__':
    import pysnooper
    fib = pysnooper.snoop()(fib)
    print(fib(5))
```

```
$ python /tmp/fib.py
Starting var:.. n = 5
09:27:24.164992 call         1 def fib(n):
09:27:24.165538 line         2     if n == 0:
09:27:24.165567 line         4     elif n == 1:
09:27:24.165589 line         7         fib1 = 1
New var:....... fib1 = 1
09:27:24.165650 line         8         fib2 = 0
New var:....... fib2 = 0
09:27:24.165695 line         9         for i in range(2, n):
New var:....... i = 2
09:27:24.165755 line        10             fib = fib1 + fib2
New var:....... fib = 1
09:27:24.165814 line        11             fib2 = fib1
Modified var:.. fib2 = 1
09:27:24.165845 line        12             fib1 = fib
09:27:24.165894 line         9         for i in range(2, n):
Modified var:.. i = 3
09:27:24.165952 line        10             fib = fib1 + fib2
Modified var:.. fib = 2
09:27:24.165995 line        11             fib2 = fib1
09:27:24.166032 line        12             fib1 = fib
Modified var:.. fib1 = 2
09:27:24.166064 line         9         for i in range(2, n):
Modified var:.. i = 4
09:27:24.166121 line        10             fib = fib1 + fib2
Modified var:.. fib = 3
09:27:24.166178 line        11             fib2 = fib1
Modified var:.. fib2 = 2
09:27:24.166234 line        12             fib1 = fib
Modified var:.. fib1 = 3
09:27:24.166290 line         9         for i in range(2, n):
09:27:24.166311 line        13         return fib
09:27:24.166333 return      13         return fib
Return value:.. 3
3
```

`write()` を実装しているStream風味オブジェクトに吐き出せるようです。`Logger` と連携させる簡便な方法は今の所ないようです（PRしろ)。 

本家の例のようにデコレータ `@pysnooper.snoop()` を関数に付けてもよいのですが、恒久的に使うのでなければ上記のように単に関数をラップして使う方が取り外しが楽で良いんじゃないかなと思ったので本例ではそうしています。

実際に開発している際には（バグが見つかったとして）

```python

if __name__ == '__main__':
    print(fib(5))
```

を

```python

if __name__ == '__main__':
    import pysnooper
    print(pysnooper.snoop()(fib)(5))
```

とするだけで全ダンプが得られ、また同2行を元に戻すだけで元の挙動に戻ります。デコレータだと修正箇所が局所にとどまらないのと、同じ関数を呼び出している他のコードに影響が出るので、その意味でも実践で使いづらいんじゃないかなと思いました。

使い勝手がわかってきたらまた書きます。
Androidの「レイアウト範囲を表示」でどのようにUIが設計されているかを知る

弊社デザイナーとの会話に役立ったのでメモです。

# 「レイアウト範囲を表示」とは？
Android端末には「開発者向けオプション」というものがあり、そこからON/OFFできる機能です。
「レイアウト範囲を表示」をONにすると、こんな感じの画面になります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/ebd131b8-e1c0-6b11-fe77-3a19e12f84d2.png" width=400">

見ての通り、各Viewの境界に線が入り、どのように画面が構成されているかがわかります。

ドキュメントを探しても見当たらなかった（見つけきれなかった）のですが、ピンクで塗りつぶされているところはmarginだと思います。

この機能を活用することで、エンジニア←→デザイナー間で「この画像の左端は、このテキストの左端に合わせています」といった会話がしやすくなります。

実際、弊社デザイナーとの会話の中で「なるほど。ここの端はこの要素に合わせてるけど、一律で左から◯％のところに合わせたい」といった会話ができました。

> 一律で左から◯％のところにテキストを置きたい

といった要望を叶えるには、ConstraintLayoutのGuideLineを使えば実現可能です。
そのような会話ができるようになったのも、「レイアウト範囲を表示」のおかげです。

# どうやって設定するの？
まとめると「開発者向けオプションを有効にしてから、レイアウト範囲を表示をONにする」です。
ほとんどのAndroid端末で設定可能です。

まずは端末の設定アプリから `ビルド番号` を探します。
機種によって異なりますが、Pixel3XLだと「端末情報」の中にありました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/22862a4e-d039-8250-bb86-643a41661650.png" width="400">

このビルド番号を連打します！すると開発者モードがONになり、開発者向けオプションを設定できるようになります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/5d62bb52-9c80-04b2-c356-9feab8f90c81.png" width="400">


開発者モードがONになると、設定アプリのどこかに `開発者向けオプション` という項目が増えています。
Pixel3XLだと、「システム＞詳細設定」の中にありました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/e59cbb2b-0cdb-9139-3eb7-e948004f6f58.png" width="400">

「開発者向けオプション」の中で下の方にスクロールすると「レイアウト境界を表示」とありますので、これをONにします！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/84307/aac3b76a-f9c0-405d-e319-08cc091039ee.png" width="400">

これで画面がどのように構成されているかが見れるようになりました！

# まとめ
この機能は、エンジニアとデザイナーがコミュニケーションを取るのに非常に良いツールだと思います。
ただ、この機能の存在を知っているのはエンジニアだと思います。
積極的に伝えていきましょう！
ランダム行列の円板上に分布する固有値

とあるランダム行列の固有値は円板状に分布するらしい。正しくはこう

> 円則
> n×n 実正方行列(または複素正方行列)において各行列要素を独立同一分布で平均ゼロ $E(X_j,k)=0$、分散 $E(|X_{j,k}|^{2})=1/n$ のように規格化すると、行列のサイズを非常に大きくしていく(n → ∞)に従い固有値は複素平面上の単位円盤上で一様に分布するようになるというもの。
> 引用元: [ランダム行列#円則](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E8%A1%8C%E5%88%97#%E5%86%86%E5%89%87)

早速実装して実験みた。
使用言語は[Haskell](https://www.haskell.org/)、線形代数ライブラリは[hmatrix](http://hackage.haskell.org/package/hmatrix)、可視化ライブラリには[Chart](http://hackage.haskell.org/package/Chart)を使った。

```hs
import Graphics.Rendering.Chart.Easy
import Graphics.Rendering.Chart.Backend.Diagrams
import Numeric.LinearAlgebra

-- | 複素数x+iyを(x, y)型のタプルに変換
toPoint :: Complex a -> (a, a)
toPoint c = (realPart c, imagPart c)

main = do
    let n = 1000 -- 正方行列のサイズ
    m <- (sqrt (1 / fromIntegral n) *) <$> randn n n -- 行列要素が平均値0分散1/nの正規分布に従う行列をサンプリング
    let es = map toPoint . toList . fst $ eig m -- 行列の固有値を求めて[(Double, Double)]型に変換
    toFile (def {_fo_size = (600, 600)}) "output.svg" $ -- プロットしてファイルに書き出す
        plot $ points "Eigenvalues" es
```

実験に使う関数は以上。
hmatrixでランダム行列を計算する方法について解説しておくと、まずは

```hs
randomVector :: Seed          -- シード値
             -> RandDist      -- 値が従う分布
             -> Int           -- 生成するベクトルの長さ
             -> Vector Double
```

というランダムなベクトルを計算する関数が最も基本的な関数になる。

```hs
type Seed = Int

data RandDist = Uniform
              | Gaussian
```
となっており `randomVector` は値が一様分布もしくは正規分布に従うランダムなベクトルを生成できることが分かる。

ランダム行列を生成する場合は `randomVector` を利用した簡便な関数が用意されている。

```hs
-- | 行列要素が[0,1]区間の一様分布に従うようなランダム行列を生成する
rand :: Int -> Int -> IO (Matrix Double)

-- | 行列要素が標準正規分布に従うようなランダム行列を生成する
randn :: Int -> Int -> IO (Matrix Double)
```

さらにこれらの行列を変形してより一般的な行列を得られる関数も存在する。

```hs
uniformSample :: Seed               -- シード値
              -> Int                -- 行数
              -> [(Double, Double)] -- 各列が従う一様分布の区間
              -> Matrix Double

gaussianSample :: Seed          -- シード値
               -> Int           -- 行数
               -> Vector Double -- 平均値ベクトル
               -> Herm Double   -- 分散共分散行列
               -> Matrix Double
```

`uniformSample`は[0,1]区間に限らない一様分布に従う行列要素をもつランダム行列、 `gaussianSample` は各列が自明でない平均値と分散共分散構造をもつ多変量正規分布に従うようなランダム行列を計算する。

## 実験
行列のサイズを大きくしていきながら固有値の振る舞いを観察する。

### n = 10
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17134/8f0318e1-7f95-6ea3-c683-322b40bb8a2d.png" width=400 />

### n = 100

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17134/0fde0d6f-6867-6048-571e-3fc367dbae81.png" width=400 />

### n = 500

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17134/42aa21e1-051a-33bd-293b-2d8f557f1a09.png" width=400 />

### n = 1000

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17134/ebda5395-c0de-cfdd-6f5b-b602ac0cd0d2.png" width=400 />

固有値が綺麗に円板状に分布していく様子が見て取れる。すごい。今回は実数を行列要素に持つ正方行列で実験したので、よく見ると固有値の分布がx軸に対して線対称になっていることが分かる。円則の証明は [Terence Tao, Van Vu "Random Matrices: The circular Law"](https://arxiv.org/abs/0708.2895) に載っているらしい。
Nextcloud 16 がリリースされました。

# はじめに
Nextcloud 15 が 2018年12月10日にリリースされてから4ヶ月半、2019年4月25日に Nextcloudの最新メジャーアップデートとして Nextcloud 16 がリリースされました！

# 今回のアップデートの特徴
[Nextcloud社公式Blog](https://nextcloud.com/blog/) によると、大きく以下のような改善が盛り込まれているとのことです。

* 機械学習を利用したセキュリティ、生産性の向上
* グループフォルダへのアクセスコントロール設定
* 複数の Nextcloud リソースをプロジェクトとしてリンク
* 新しいコマンド、ユーザーエクスペリエンスの向上が図られたアプリ `Talk6`

個々の詳細は改めて記事に起こそうと思います。

# とりあえずアップデートしてみました
早速、Nextcloud 15 系の最新版である `15.0.7` のバージョンからアップデートをやってみました。
※アップデートの方法などは改めて記事に起こそうと思います。  
## 画面の見た目
Nextcloud 15 から大きな変化はないように感じられます。Nextcloud はかなり短期間でアップデートが繰り返され、見た目も少しずつ変化してきていますが、ここにきて成熟してきた感じでしょうか。
## プラグインアプリ  
よく使われるものや公式系のものはほぼ Nextcloud 16 に対応してきております。  
ざっと全体を見回したところで、現時点(=2019年4月26日 8:00時点)でまだ対応できていないもので使われていそうなものだと `"SSO & SAML authentication"` あたりはまだ対応が追いついていないようです。
## 日本語対応
新機能に関するところはこれからですが、普通に使う分には問題のない範囲で日本語対応ができております。これまで Nextcloud を利用されている方は問題なく使い続けることができると思われます。  

# まとめ
2016年9月に初版である Nextcloud 9 がリリースされてからわずか2年半ですが、もう Nextcloud 16 まで アップデートされ、機能も追加され、どんどん使いやすくなってきております。
「自前のサーバで運用できるオンラインストレージ」が特徴の Nextcloud これからもどんどん加速進化が期待されます。

**★この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/) の [Nextcloudブログ](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております！**
Amazonが過去最高利益を更新

米Amazonが過去最高益を更新したそうです。
とりわけ伸びが大きいのがAWSだそうで、前年の41%増の770万ドルの売上を叩き出しました。
<a href="https://www.nikkei.com/article/DGXMZO44229660W9A420C1000000/">米アマゾン、純利益2.2倍　1～3月最高益更新 </a>
<a href="https://edition.cnn.com/2019/04/25/tech/amazon-q1-earnings/index.html">Amazon posts a record quarterly profit of $3.6 billion</a>

少し前の資料ですが、AWSの利益と成長率を示したものがありました。（2019/02の資料）
<a href="https://qz.com/1539546/amazon-web-services-brought-in-more-money-than-mcdonalds-in-2018/">Amazon Web Services brought in more money than McDonald’s in 2018</a>

![atlas_HycLk--VV@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388313/13d002ae-c2ca-9a6e-4d0e-dfe5b94027fe.png)

クラウドという言葉やサービスが流行り始めたと2015年頃に急激に伸び、その後緩やかな下降をしていますがこの下降は普通のことかと思われます。
とはいえ、45%前後を常にキープしています。いずれは市場が成熟してこの成長率も鈍化していくでしょうが、まだまだ開拓の余地がありそうな数字です。

日本でのクラウド導入率の統計を総務省がとっています。（httpsではないのか…）
<a href="http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h30/html/nd252140.html">企業におけるクラウドサービスの利用動向</a>
![n5201190.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388313/b580167b-9b06-5e68-4440-540ded18ebdf.png)
2017年までの統計しかありませんが、全社的に導入しているのが2016年に24.4％、2017年に29.4％になっています。
単純に計算すると20％の伸びを見せているので2018年は約35％程度と考えるとすると、日本市場では開拓の余地がまだまだ大いにありそうです。

####意見
クラウドサービスによって、これまでインフラエンジニアが専門で担当していたような作業（物理的なサーバー構築やOS、ミドルウェアの構築）が一部なくなったり、アプリケーションエンジニアにも求められるようになってきたかと思います。
もちろん、インフラエンジニアの専門的な知識や技術はクラウドに移行しても重要だと思いますが、例えばAWSであればEC2を立ててアクセスするのはあっという間にできます。
おそらくですがまだクラウド市場は伸びていきますので、アプリケーションエンジニアもインフラの知識がますます求められるのかなぁと思いました。

AWSであれば、アカウントを取得してから1年間は1部機能は学習のため無料で使えます。触っていると面白いですよ。
DockerでVue.jsの環境を作る


#環境
* Ubuntu18.04
* docker 18.09.5
* docker-compose 1.20.0
* vue.js 3.6.3 

#環境構築
作業用のディレクトリを作成し、そこでdocker-compose.ymlとDockerfileを作成します。
###docker-compose.yml

```
version: "3"
services:
  app:
    build:
      context: ./
    privileged: true
    volumes:
      - "./:/usr/share/nginx/html"
    ports:
      - 1234:8080
      - 3000:3000
    container_name: "vuecontainer"
```

###Dockerfile
```
FROM ubuntu:18.04

RUN apt -y update

RUN apt -y upgrade
RUN apt -y install curl
RUN apt -y install nginx

RUN apt install -y nodejs npm
RUN npm install n -g
RUN n stable
RUN apt purge -y nodejs npm

RUN npm install -g @vue/cli

ENV HOST 0.0.0.0

CMD ["nginx", "-g", "daemon off;"]

WORKDIR /usr/share/nginx/html

```

###サービス構築
今回のサービスの名前は「app」になる
```docker-compose.yml```のservicesの```app```のところがサービス名となる

```
$ sudo docker-compose build
```

###コンテナ起動
コンテナを作成し、起動します。

```
$ sudo docker-compose up -d
```
-dをオプションでつけることでバックグラウンドで実行することができます。

###コンテナに入る
以下のコマンドを使うことで指定のコンテナ内に入ることができます。

```
$ sudo docker-compose exec サービス名 実行コマンド
```
今回の場合では以下のコマンドでコンテナ内に入ることができます。

```
sudo docker-compose exec サービス名 実行コマンド
```

コンテナ内で以下のコマンドを入力することでvue.jsのプロジェクトを作成できる。

```
vue create プロジェクト名
cd プロジェクト名
npm run serve 
```

これで http://localhost:1234 にアクセスするとデフォルト画面が表示されれば環境構築終了

#参考文献
[Dockerでローカル環境を汚さずにNuxt.jsを始めてみる](https://qiita.com/ProjectEuropa/items/d9ee1b8c96084e3bab55)
[Ubuntuに最新のNode.jsを難なくインストールする](https://qiita.com/seibe/items/36cef7df85fe2cefa3ea)
OpenVINOを使ってNeural Compute Stick 2(NCS2)の速さを確認する

#目的
OpenVINOを使ってNeural Compute Stick 2(NCS2)の速さを確認する

#検証環境

パソコン：ideapad 320S
CPU: Intel Core i3-7100U CPU @ 2.40GHz
GPU: Intel HD Graphics 620
アクセラレータ：Neural Compute Stick 2(NCS2)
フルサイズUSB：USB2.0、USB3.0

OS: Microsoft Windows 10 Home

利用したソフト:openvino_2019.1.087
 デモソフト名：demo_security_barrier_camera,demo_squeezenet_download_convert_run


※OpenVINOを使う理由は、Neural Compute Stick 2(NCS2)の性能がある程度引き出せるのではないかと考えたため。

#検証結果
inference(推論）の部分のみ。2回実行し、各々のfpsを示している。
CPU、GPUの部分は、関連記事に提示済みの数値を引用。
一部、10回測定のデータを追加。10回測定の場合、最も速い値に*印。

--demo_security_barrier_camera
NCS2 FP16  　　16.2, 　16.8fps　//今回測定(これは、USB2.0)
NCS2 FP16(USB2.0)
　　16.4, 15.9, *16.7, 16.4, 16.3, 16.6, 16.6, 16.3, 16.5, 16.5
NCS2 FP16(USB3.0)
　　19.9, 20.0, 19.9, 21.4, 22.9, 21.2, *23.8, 20.4, 20.8, 21.0
CPU FP32   　　22.6, 　17.3fps
GPU FP16   　　16.2, 　13.9fps
GPU FP32   　　11.5, 　14.1fps

--demo_squeezenet_download_convert_run
NCS2 FP16  　　65.4, 　68.8fps　//今回測定(これは、USB2.0)
NCS2 FP16(USB2.0)
　　74.6, 72.2, 73.8, *80.4, 64.3, 72.2, 71.5, 69.3, 65.3, 68.8
NCS2 FP16(USB3.0)
　　98.9, 93.3, *109.6, 95.9, 96.0, 97.5, 97.2, 94.2, 97.1, 101.3
CPU FP32   　　34.6, 　62.0fps
GPU FP16   　　75.4, 　83.7fps
GPU FP32   　　65.5, 　59.2fps

#参考情報
デモプログラムのREADME抜粋

---
Classification Demo Using SqueezeNet

The demo illustrates the general workflow of using the Intel(R) Deep Learning Deployment Toolkit and performs the following:

  - Downloads a public SqueezeNet model using the model_downloader\downloader.py script

・・

Security Barrier Camera Demo

The demo illustrates using the Inference Engine with pre-trained models to perform vehicle detection, vehicle attributes and license-plate recognition tasks. 
As the sample produces visual output, it should be run in GUI mode. 
・・

実行時出力抜粋

---



    [ INFO ] Loading plugin CPU

        API version ............ 1.6
        Build .................. 22443
        Description ....... MKLDNNPlugin

    [ INFO ] Loading plugin GPU

        API version ............ 1.6
        Build .................. 22443
        Description ....... clDNNPlugin
        
     [ INFO ] Loading plugin

        API version ............ 1.6
        Build .................. 22443
        Description ....... myriadPlugin

#まとめ
Neural Compute Stick 2(NCS2)は、
GPU(Intel HD Graphics 620)やCPUとの比較で、それなりの速さである。
USB3.0で測定し直すと、かなり、速くなった。

#今後
また、何か関連する検討ができれば。
記載が、デモプログラムの名称を示しているだけなので、これでは条件がよくわからないあたりも、改善できれば。
このdemoで測定するにしても、もう少し、測定方法に工夫があるべきとも思う（特別、この方法での数字に意味は
ないにしてもバラつきとかがデータの整理方法として気になる）。

#関連
[OpenVINOを使ってCPU内蔵GPUの速さを確認する](https://qiita.com/enoughspacefor/items/c0eb9314d65fdc1d9fd9)

#改定内容
2019/4/27 使用しているPCのUSBは、2.0と3.0があることに気づいたため、USB3.0での測定結果を追加。
VSCodeにAnacondaの仮想環境を適用

#CentOSにインストールしたVSCodeに、anacondaで作成した仮想環境を適用する方法メモ
どうやるんだ？と思いgoogle先生に聞いても、探し方が悪いのか出てこない。
※Windowsばかり引っかかる…

そこで色々試したところ、仮想環境切替が実行できた。
参考になれば幸いです。

---
#手順
##1.現在の環境を確認
VSCodeの左下に、現在の環境が表示されているのでクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389667/e509bfa3-0e16-0cab-6f94-e406fc39c279.png)

##2. 適用環境の選択
すると、画面上部に選択可能な環境が表示される。<br>この中から、適用したい環境をクリック。<br>※この例では、あらかじめcondaコマンドで作成した「py3.7」という環境を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389667/fb44c9aa-badc-96fe-d6df-cad986152bab.png)

##3. 適用環境の確認
選択後、VSCode左下の表示が切り替わっているはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389667/cc7afd35-6587-e5db-938b-51ef6a6724e8.png)

 - 本当に切り替わったのかを確認。<br>波線で構文エラーを通知してくれているので、3系に切り替わっている。<br>が、ターミナルのpythonは2系。<br>この状態でpython test.py とすると、2系で稼働するのでエラーはない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389667/f5d94f48-cadc-5508-d9b1-71a693e29989.png)

 - F5キーでデバック走らせると、仮想環境の3系で稼働するのでエラーが発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389667/9745b45e-4db3-ca93-8095-db40c79a1a46.png)

 - 紛らわしいので、ターミナルも```conda activate py3.7```と入力し<br>ターミナルの環境も統一するとよい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389667/6fa5d86c-434a-991a-0ef3-cb8dfd0fba78.png)
Coder + Nodejs の Docker レシピ

## Coder
* VSCode がサーバで動いてブラウザで操作できる => [公式](https://coder.com/)
* [いま4/26時点でQiitaに11記事しかHitしないから５分で雰囲気つかんで欲しい](https://qiita.com/search?q=tag%3Acoder)

## この記事のおいしい所
* 公式とおりに Docker で起動するのは それはそれでいい感じに手軽ですが
    > docker run -it -p 127.0.0.1:8443:8443 -v "${PWD}:/home/coder/project" codercom/code-server --allow-http --no-auth

* Coder イメージに 開発環境を足していくのは 違う気がする
* 開発環境に Coder を導入したい

## 開発環境に Coder を導入する case nodejs
```Dockerfile:Dockerfile
FROM node:slim
EXPOSE 8443
ENTRYPOINT ["code-server"]
RUN apt-get update && apt-get install -y --no-install-recommends net-tools
COPY --from=codercom/code-server:latest /usr/local/bin/code-server /usr/local/bin/code-server
```

```sh:ビルド
docker build -t coder-node .
```

```sh:起動
docker run -p 8443:8443 -w /opt coder-node
```

## ポイント解説
* `FROM node:slim`
    * node 公式イメージをベースにする、ここを適当な言語にできる swiftとか
* `COPY --from=codercom/code-server:latest`
    * codercom/code-server 公式イメージを使い マルチステージビルド

## 以上
Craft CMS でダッシュボードにエントリの数を表示する - 2

Craft CMS のダッシュボードにエントリの数を表示させたい時は下記のプラグインが便利。

Content Stats
https://plugins.craftcms.com/content-stats

このプラグインをインストールすると、ダッシュボードにウィジェットが追加される。

ウィジェットの設定で、表示したいエントリを選んだり、表示したいステータスの種類を選んだりもできるので便利。

その他、エントリの一覧画面にエントリ数を表示させたい場合は下記を参照。

Craft CMS でダッシュボードにエントリの数を表示する - Qiita
https://qiita.com/mersy/items/a296fa28261fa979d8f4
＜メモ＞Kivyで作成したPythonアプリケーションをAndroidパッケージ化する

## KivyとBuildozerについて

  * Kivyとは
    - PythonのNUIアプリケーション開発用のOSSライブラリ
    - https://kivy.org/

  * Buildozerとは
    - Pythonアプリケーションをモバイルアプリケーションとして簡易にパッケージングするツール
    - AndoroidやiOSアプリを作成できる
    - https://github.com/kivy/buildozer

## 試した環境
  本検証は以下の環境で行った。LinuxあるいはMacで実行する必要がある。

  * Ubuntu 18.04.2 LTS
  * Python 3.7.3
  * Android 9

## 必要なライブラリのインストール

```
sudo apt-get install -y \
    python-pip \
    build-essential \
    git \
    python \
    python3 \
    python-dev \
    python3-dev \
    ffmpeg \
    libsdl2-dev \
    libsdl2-image-dev \
    libsdl2-mixer-dev \
    libsdl2-ttf-dev \
    libportmidi-dev \
    libswscale-dev \
    libavformat-dev \
    libavcodec-dev \
    zlib1g-dev \
    automake \
    autoconf \
    libltdl-dev \
    openjdk-8-jdk \
    aidl
```

## Python 関連のライブラリのインストール

```
pip install pygame cython
pip install kivy
```

## Buildozerのインストール

```
git clone https://github.com/kivy/buildozer
cd buildozer
python setup.py build
pip install -e .
```

## Python サンプルコード

[アプリケーション用ディレクトリ ex:myapp]/main.py
※ ファイル名はmain.pyとしなければならない模様
※ このディレクトリ名は、後述するBuildozer設定ファイルに、パッケージ名として記載しなければならない模様

```
import kivy

from kivy.app import App
from kivy.uix.label import Label

class HelloWorldApp(App):

    def build(self):
        return Label(text='Hello World!')

if __name__ == '__main__':
    HelloWorldApp().run()
```

## Buildozerの設定ファイルを作成する

アプリケーション用ディレクトリ内でBuildozerを実行し、設定ファイル「buildozer.spec」を作成する。

```
cd [アプリケーション用ディレクトリ]
buildozer init
```

設定ファイル「buildozer.spec」を編集する。
最低限、以下の項目は変更しなければならない模様。

```
package.name = myapp ※ main.pyを格納したディレクトリ名
package.domain = jp.sample.test  ※ デフォルトの値から変更しなければならない模様
requirements = python3,kivy,android,plyer
```

## Android端末の設定
  * Android 端末をデベロッパーモードに設定する
    - [設定] > [システム] > [端末情報]
    - ビルド番号を連打するとデベロッパーモードとなる

  * 開発者オプションとUSBデバッグの有効化
    - [端末情報] > [システム] > [開発者向けオプション]
    - 開発者向けオプション : ON
    - USBデバッグ : ON

  * PCにAndroid端末をUSB接続し、「ファイルを転送」を選択

## PythonコードからAndoroidパッケージを作成し、USBデバッグする

Linuxで以下を実行すると、Android側でデバッグ実行される。

```
buildozer android debug deploy run
```


# 参考サイト
  以下のサイトを参考にさせて頂きました。ありがとうございます。

  * https://qiita.com/gotta_dive_into_python/items/82ee13ebac44719adad6
  * https://qiita.com/dario_okazaki/items/4f6373051afb70b794d9
  * http://invasivecat.hatenablog.com/entry/2019/01/06/221322
MariaDBが「unknown option '--mysqld'」とほざく件

先程、以下のエラーを吐いてsystemdのmariadb.serviceがさっぱり起動しなくなりました。Gentooのパッケージがユニットファイルの由来ですが、恐らくはどのディストリビューションでも変わりないと思います。

```console
sh[*****]: my_print_defaults: [ERROR] unknown option '--mysqld'
```

これ、エラーメッセージを読んで`my_print_defaults(1)`コマンドのオプションと葛藤してもさっぱり問題は解決しません。
ではどうするかというと、あるファイルを削除（退避）します。

```bash
cd /var/lib/mysql
mv aria_log_control aria_log_control.moved
```

このあと`# systemctl start mariadb.service`して、起動できたら`/var/lib/mysql/aria_log_control.moved`は削除して構いません。

# 参考資料
https://help.directadmin.com/item.php?id=702
Node.js,Expressメモ⑤の2

エンドゲーム見たいけど予約でいっぱいですね。こんにちは。

Part5はいろんなページにいって知っといてね！って感じなので
いろいろなページをやる2回目です。

https://developer.mozilla.org/ja/docs/Learn/Server-side/Express_Nodejs/Displaying_data

サブぺージをこなしたらすすんでる？？
ははーん、さては`async.waterfall`方式だな。

今回はテンプレートのページを見ます。
前回からいきなり日本語翻訳かましてます。

翻訳したらビューが2つになって左右に原文と翻訳が並んでくれたらいいのに。。


#Pug

このチュートリアルで使うテンプレートエンジンです。
Nodeテンプレートの中で最も人気のあるテンプレートだそうです。
テンプレート言語は大きく以下の2つに分かれていてPugは後者だそうです。
・レイアウトを定義するためにHTMLを使うもの
・HTMLにコンパイルできるマークアップ言語


# syntax
Pugは典型的なHTMLファイルの構造をマップしていてインデントは入れ子になった要素を示すために
使われます。

```
doctype html
html(lang="en")
  head
    title=title
    script(type="text/javascript").
  body
    h1=title

    p this is a line with #[em some emphasis] and #[strong strong text] markup.
    p this liine has un-escaped data: !{"<em> is enphasised</em>} and escaped data: #{"<em> is not emphasised</em>"}.
    | this line follows on.
    p= "Evaluated and <em>escaped expression</em>:" + title

    p A line with a link
      a(href="/catalog/authors")Some link text
      | and some extra text.

    ul
      each val in [1, 2, 3, 4, 5]
        li=val
※一部抜粋
```

ぜんぜんルールがわかりません笑

要素属性は関連付けられている要素の後ろのカッコ内に定義。
`link(rel="stylesheet", href="/stylesheets/style.css")`
`meta(name="viewport" content="width=device-width initial-scale=1")`

タグの後に等号が付く場合は次のテキストをjavaScriptとして扱われる。。
`h1= title`
`p= "Evaluated and <em>escaped expression</em:>" + title`

!{} #{}などを使って生のHTMLを埋め込むこともできます。

`p This is a line with #[em some emphasis] and #[strong strong text] markup. `
`p This line has an un-escaped string: !{'<em> is emphasised</em>'}, an escaped string: #{'<em> is not emphasised</em>'}, and escaped variables: #{title}.`
`

などなど、、
これは、、。テキストで拡張性を持たせる方法はめちゃくちゃ工夫しなきゃいけないから
慣れるまでものすごいハード。

ただExpressからの変数とかは、構文にのっとってやるんだよ！それがテンプレートだよ！
ということがわかったのでこのページはさらっと飛ばします笑

丸写ししても仕方がないので。。。
つづく