OmniAICreator/Qiita-1.07M huggingface dataset:
astahファイルをgitで管理する方法

## なんでastahファイルgitで管理するの？
複数人でモデリング図を管理することになったので、更新が入った際の共有で時間をかけたくなかったから。

## 管理方法
バニラのastahで管理できるようにしたかったので、XMLで管理します。
XMLであれば容量が大きくなりますが文字で管理したかったのでしょうがないですね。

## やり方
### 保存(出力)
- astahの``` ツール ```->``` XML入出力 ```から``` XMLプロジェクトファイル出力 ```を選択します。
<img width="904" alt="スクリーンショット 2019-05-23 19.38.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/4d42747a-9308-d6de-97cd-213095b35e73.png">

- git管理されているフォルダ内に保存(or 上書き保存)
<img width="551" alt="スクリーンショット 2019-05-23 19.41.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/da393d87-3450-12ed-580e-b179d9d99e34.png">

- git管理されているフォルダで以下を実行して変更を確定します。
    - git add ``` [ファイル] ```
    - git commit
    - git push

### 読み込み（入力）

- 他の人が読み込むときはgit管理されているフォルダで下記を実行して、ファイルの情報を更新します。
    - git pull  

- astahの``` ツール ```->``` XML入出力 ```から``` XMLプロジェクトファイル入力 ```を選択します。

<img width="764" alt="スクリーンショット 2019-05-23 19.43.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182036/6abb1edb-aec9-e0c9-93a8-26b49ddb88aa.png">

- 読み込みたいXMLファイルを指定して、読み込みます。

## 終わりに
とりあえず、プラグインとか入れないでやってるので、容量が悪いですがみんなで一斉に変更することはあんまりないので、コンフリクトとかは大きく考えなくてもいいかな。
もっといい方法があればぜひぜひ〜
PHPでXML形式のAPIレスポンスを受け取る際の注意事項

XML形式でレスポンスを返却するAPIに対して、PHP側で連想配列への変換を行う際には、通常

```php
// curlの実行
$url = 'http://www.xxxxxxxxxx.yy.zz/getFruits/';
$curl = curl_init($url);
$xml = curl_exec($curl);

// 受け取ったXMLレスポンスをPHPの連想配列へ変換
$xmlObj = simplexml_load_string($xml);
$json = json_encode($xmlObj);
$response = json_decode($json, true);
```

このようなフローを踏むことになるが、上記処理を行うとXMLの特性である`同名要素を複数持てる`という性質に対応した際に問題が発生する。

パターン1:

```
<?xml version="1.0" encoding="utf-8"?>
<data>
    <fruits>
        <name>apple</name>
        <price>100</price>
    </fruits>
</data>

// PHP変換後
$response = array('fruits' => array('name' => 'apple',
                                    'price' => '100'
                              )
            );
```

パターン2:

```
<?xml version="1.0" encoding="utf-8"?>
<data>
    <fruits>
        <name>apple</name>
        <price>100</price>
    </fruits>
    <fruits>
        <name>orange</name>
        <price>80</price>
    </fruits>
</data>

// PHP変換
$response = array('0' => array('fruits' => array('name' => 'apple',
                                                 'price' => '100'
                                           )
                         ),
                  '1' => array('fruits' => array('name' => 'orange',
                                                 'price' => '80'
                                           )
                         )
            );
```

パターン1のように、同名要素が存在しない場合は、連想配列に変換されるが
パターン2のように、同名要素が複数存在する場合は、配列が作られた上でその配下に格納されてしまい、参照の仕方が変わってきてしまう。

したがって自分は以下のような対応を行い、データが1種類しか返却されないパターンでも必ず配列になるように対応をした

```php

function addNumberToArray($arr)
{
    // 連想配列の時は配列へ変更
    if (!empty($arr) && array_values($arr) !== $arr) {
        $arr = array($arr);
    }

    return $arr;
}

$fruits = addNumberToArray($response['fruits']);

foreach ($fruits as $fruit) {
    echo $fruit['name'] . 'は' . $fruit['price'] . '円です';
}
```

こうすることで同名要素が一つの場合でも複数の場合でも同様の対応を行うことができた
[Node-RED]複数のカスタマイズノードを1つのモジュールにパッケージ化

# 概要
　複数のカスタマイズノードを、別のNode-RED環境にローカルに渡して使いたいことがありました。
その際各ノードごとにリンクするのが面倒なので、1つのモジュールにパッケージ化した備忘録です。
今回は最低限の設定をしていますので、用途に応じてpackage.jsonを編集してください。

筆者はJavaScript初心者です🔰

# 環境
・OS：Windows10 64bit版
・コマンド実行環境：PowerShell
・Node-RED バージョン: v0.19.6
・Node.js  バージョン: v11.10.1

# 準備
今回説明しているディレクトリ構成は次の通りです。

```
D:
　- practice
　　- node-red-contrib-my-node　パッケージ化するフォルダ
　　- node-red-contrib-node1　　カスタマイズノード１
　　- node-red-contrib-node2　　カスタマイズノード２
　　- node-red-contrib-node3　　カスタマイズノード３
```

# パッケージ化手順
###### １．カレントディレクトリを`node-red-contrib-my-node`にする
PowerShellを起動し、カレントディレクトリを移します。

###### ２．コマンド`npm init`を実行
package.jsonを生成するために`npm init`を実行します。
最初の設定`package name`をパッケージ化後のモジュール名にします。
今回はnode-red-contrib-my-nodeです。
後の項目はお好みで設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/2e54f93e-e0e9-2231-a7b5-65da2e7f2827.png)

実行後、node-red-contrib-my-nodeフォルダ下に`package.json`ファイルが生成されます。

##### ３．package.jsonの編集
生成された`package.json`を開くと次のようになっています。

```json:package.json
{
  "name": "node-red-contrib-my-node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```

ここに次のような`nodes`オブジェクトを追記します。
このオブジェクトのメンバを、カスタマイズノードのランタイムで実行される処理を記述したjsファイルとします。

```json:
"node-red": {
    "nodes": {
        "node1": "node1.js",
        "node2": "node2.js",
        "node3": "node3.js"
    }
},
```

追記すると次のようになります。

```json:
{
  "name": "node-red-contrib-my-node",
  "version": "1.0.0",
  "description": "",
  "node-red": {
    "nodes": {
        "node1": "node1.js",
        "node2": "node2.js",
        "node3": "node3.js"
    }
  }, 
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```
##### ４．各ノードのhtmlファイルとjsファイルをパッケージ化するファルダに配置
配置後のディレクトリ構成は次のようになります。

```
D:
　- practice
　　- node-red-contrib-my-node
        - node1.html
        - node1.js
        - node2.html
        - node2.js
        - node3.html
        - node3.js
　　- node-red-contrib-node1
　　- node-red-contrib-node2
　　- node-red-contrib-node3
```

##### 5.パッケージ化したモジュールを、パレットに追加
カレントディレクトリを`D:\practice\node-red-contrib-my-node`に移し、
コマンド`npm link`を実行します。
warningが出ていますが、動作に影響ない範囲なのでそのまま進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/64cd7646-bccb-4348-1f88-ab3975c283ca.png)

その後、カレントディレクトリを`C:\Users\ユーザ名\.node-red`に移し、
コマンド`npm link node-red-contrib-my-node`を実行します。

##### ６．Node-REDを起動してパレットに追加されていることを確認
ブラウザでNode-REDエディタ画面を開くと、次のようにカスタマイズノードが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/3a2b2ae4-5a57-999a-97dc-6e1f27d9b130.png)

# 参考
Node-RED 日本ユーザ会
https://nodered.jp/docs/creating-nodes/packaging

# おわりに
　javascript初心者なので用語や使い方等間違いがあるかもしれません。
気になった点などアドバイスいただけると幸いです。
ABC - 015 - A&B&C

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

#A - 高橋くんの研修

 - 変数名って会社毎に独特のルールあるよね

```java
	private void solveA() {
		String a = next();
		String b = next();

		out.println(a.length() > b.length() ? a : b);
	}
```

#B - 高橋くんの集計

 - 0ではない数を数えて母数とする
 - 少数は切り上げ

```java
	private void solveB() {
		int n = nextInt();
		double base = 0;
		double total = 0;
		for (int i = 0; i < n; i++) {
			int wk = nextInt();
			if (wk != 0) {
				base++;
				total += wk;
			}
		}

		out.println((int) Math.ceil(total / base));
	}
```

#C - 高橋くんのバグ探し

 - 結構典型的なDFSでした

```java
private void solveC() {
		int n = nextInt();
		int k = nextInt();

		int[][] wk = IntStream.range(0, n).collect(() -> new int[n][k],
				(t, i) -> {
					for (int j = 0; j < k; j++) {
						t[i][j] = nextInt();
					}
				},
				(t, u) -> {
					Stream.concat(Arrays.stream(t), Arrays.stream(u));
				});

		out.println(recursiveC(wk, 0, 0) ? "Found" : "Nothing");
	}

	private boolean recursiveC(int[][] wk, int currentI, int currenXor) {

		/*
		 * 最後の質問までいったので、今までのXORの結果を確認する
		 */
		if (currentI >= wk.length) {
			return currenXor == 0;
		}
		boolean res = false;
		/*
		 * currentI番目の質問のi番目の選択を選んだ場合のXORを確認していく
		 */
		for (int i = 0; i < wk[currentI].length; i++) {
			res = res || recursiveC(wk, currentI + 1, currenXor ^ wk[currentI][i]);
		}

		return res;
	}
```
背景画像を薄暗くするには

背景画像を薄暗くする方法を忘れがちなので、メモとして記載します。

・方法

[HTML]

```
<div class="bg-img">
  <img src="#" alt="背景画像">

</div>
```

[CSS]

```
.bg-img{
  width:100%;
  height:100%;
  position: relative;
}

.bg-img img{
  /*背景画像のCSSを指定*/
}

.bg-img::before{
  background-color: rgba(0,0,0,0.3);
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  content: ' ';
}
```

擬似要素を使えば楽勝。
これくらいさっさと覚えよwww
Java Network 基礎 (通信)

# Socketについて
Socketは**サーバやクライアントと通信をとりもつ窓口**にあたる。
ソケット通信をする上でServerSocketとSocketを使います。
ServerSocketのパッケージ情報： https://docs.oracle.com/javase/jp/7/api/java/net/ServerSocket.html
Socketのパッケージ情報: https://docs.oracle.com/javase/jp/7/api/java/net/Socket.html

``ServerSocket 変数名 = new ServerSocket(port番号);``
``Socket 変数名 = new Socket();``

これらを定義し通信を行います。
**********

#Socket通信方法
簡単な通信を行うには

- ServerSocketのインスタンスを作成
- Socketの通信接続
- 通信開始

を基本操作とします。

```java:
// ServerSocketのインスタンス
ServerSoket 変数名_server_socket = new ServerSocket(port_number);

// Socket通信接続
Socket 変数名_socket = new Socket();
変数名_socket = 変数名_server_socket.accept();

// 通信開始
~~ 任意の処理 ~~
変数名.close();
```
<br>
以下は通信する上でのサンプルコードです。

```java:Server.java
import java.io.*;
import java.net.*;

public class Server{
    private final int port;

    // constructor
    public Server(int port){
        this.port = port;
    }
    public static void main(String[] args){
        Server server = new Server(8080);
        server.start();
    }

    public void start(){
        try{
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("waiting for connection in this port now.");

            Socket socket = new Socket();
            socket = serverSocket.accept();
            System.out.println("connection completed.");

            socket.close();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}
```
![ezgif-2-c46a66d542f8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/9cd77fec-aa34-9155-ae6c-c7140c1e8dbe.gif)
C++ Builder 10.2 Tokyo > はまりポイント > TStringList > DelimitedText使用時に \"は消える

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

### 概要

- JSON文字列を置換する処理を実装中、エラーに遭遇
- 調査の結果、`\"`が消えていることが分かった
- TStringListをDelimitedTextで分割したときに消える

### 再現コード

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <memory>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String astr = L"\"AAA\",\"BBB\",\"CCC\"";

    Memo1->Lines->Add(astr);

	std::unique_ptr<TStringList> wrkSL(new TStringList);
	wrkSL->StrictDelimiter = true;
	wrkSL->Delimiter = ',';
	wrkSL->DelimitedText = astr;

	String res = L"";
	res += wrkSL->Strings[0];
	res += L",";
	res += wrkSL->Strings[1];
	res += L",";
	res += wrkSL->Strings[2];

    Memo1->Lines->Add(res);
}
//---------------------------------------------------------------------------
```

### 結果

![2019-05-23_19h37_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/e3fd4490-a03c-2b24-1f7a-ae2d026932c3.png)


### 備考

- JSON文字列の処理をする場合、先に`\"`を消して、処理後に付けるなどの工夫が必要になるのだろう
- JSON文字列に対して処理した時に下記の事例も見つかった
    - 一つ目のKeyには`\"`が付いている
    - 二つ目以降のKeyには`\"`が付いていない
    - こちらの実装によるミスかもしれないが

下記の一つ目はDelimitedTextを使わない場合。
二つ目はDelimitedTextを使った場合。
ともに、文字列置換をしているが、片方で失敗している。

```
{ u"{\"name\":\"John Smith\",age,:\"33\",place,:\"Sydney\"}" }
{ u"{\"name\":\"7of9\",\"age\":\"79\",\"place\":\"Sydney\"}" }
```

一つ目について、nameは(")で囲われており、ageとplaceは囲われていない。
PyTorch で複数の画像を同じ角度でランダムに回転する方法

## 動機
画像系の深層学習において、画像データの増強（data augmentation）が必要であります。その中、画像セグメンテーションのend-2-end学習において、入力画像と教師画像を同じ角度でランダムに回転する必要があります。それを実現するために、random変数を用いる方法をまとめます。
## 実現方法
```python
from torchvision import transforms
import random
from PIL import Image
import os
from matplotlib import pyplot as plt

# 画像を読み込む
d = '../data/homes/test_input/'
img0 = Image.open(os.path.join(d, '352.jpg'))
img1 = Image.open(os.path.join(d, '95.jpg'))

# ランダム変数を生成
s = random.randint(0, 2 ** 32)

# 同じランダム変数を設定して画像を同じ角度に回転することが可能
random.seed(s)
img0 = transforms.RandomRotation(180)(img0)
plt.imshow(img0)
plt.show()

random.seed(s)
img1 = transforms.RandomRotation(180)(img1)
plt.imshow(img1)
plt.show()
1分でvimでPythonを書きやすくする

Pythonコードを書いてるが、私はエディターはvim以外はまともに使えない。Pythonでちょっとした変更を確かめるためにいちいちVimを閉じるのはいや。normal mode でuでUndoできなくなるのでいや。


そこでいっかいVimを開いたら、Shellには帰りたくないので、Vimに帰らずにいられるVimrcを書きましたのでよかったら参考にしてください。
##できるようになること
1. spaceとwの同時押しで保存
2. .pyの拡張子のファイルを開くと、自動でタブが4スペースに
3. 開いているファイル名のpythonコードをspaceとrで実行

##メリット
1. Vimを開いたまま使えるので、undoができる。
2. 数タッチで保存、実行できてコードを書いたら即フィードバックできて開発の効率化

##実装
自分のhomeディレクトリの.vimrcに以下を張り付ければいい。


```vimscript
" spaceとwの同時押しでバッファをカレントファイル名で
" ファイルに書き出す。通常の:wと同じ
" <C-u>は範囲指定を防ぐため
nnoremap <Space>w :<C-u>write<CR>

" tabの設定とspaceとrの同時押しでカレントファイル名
" のpythonコードを実行できる 
augroup python_set
    autocmd!
    autocmd BufNewFile,BufRead *.py setlocal tabstop=4 softtabstop=4 shiftwidth=4
    autocmd BufNewFile,BufRead *.py nnoremap <Space>r : <C-u>!python %<CR>
augroup END
```
もしホームディレクトリに　.vimrcがない場合は

```bash
vim .vimrc
```
として上のvimスクリプトを張り付けて保存してください。
##使い方

1. vimでpythonコードを書く
2. Escキー押してノーマルモードになる
3. Spaceとwを同時押しで保存
4. Spaceとrの同時押しでpython実行
5. Sellに結果が表示させる
6. EnterでVimに戻る

これを繰り返す。
value を変えずに input に3桁カンマを振る

# value を変えずに input に3桁カンマを振る

「数値に3桁カンマを振りたい」って要望は結構あって、ググると js で value 自体をゴリゴリいじる実装が多いですが、今回はちょっと違ったアプローチをしてみます。

## コード

```html
<html lang="ja">
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>

<style>
    /* number-input と number-overlap をまとめるコンテナ */
    .number-container {
        position: relative;
    }

    /* カンマ区切りにしたい input 要素 */
    .number-input {
        position: relative;
    }
    /* 普段は z-index:1 で number-overlap の後ろに居る。色は被ってしまうので transparent */
    .number-input:not(:focus) {
        z-index: 1;
        color: transparent;
    }
    /* フォーカス中は z-index:3 で number-overlap の前に来る。色も戻す */
    .number-input:focus {
        z-index: 3;
        color: #555;
    }

    /* number-input に覆い被さる要素。 pointer-events:none でクリックを透過させる */
    .number-overlap {
        position: absolute;
        top: 1px;
        left: 0px;
        display: inline-block;
        background: transparent;
        width: 100% !important;

        pointer-events: none;
        z-index: 2;
    }
</style>
<script>
    $(function () {
        // フォーカスを抜けたり値が変わったりしたら覆い被さっているテキストをカンマ区切りにする
        $('#hoge').on('blur change input', function () {
            const $this = $(this);
            if ($this.val() !== '') {
                $this.next().text((+$this.val()).toLocaleString());
            }
        });
    });
</script>

<form class="form-inline">
    <div class="form-group">
        <div class="number-container">
            <input type="text" id="hoge" name="hoge" class="form-control number-input" placeholder="自動でカンマが付きます">
            <span class="number-overlap form-control"></span>
        </div>
    </div>
</form>

</body>
</html>
```

殴り書きしたのでかなり荒いですが、コメントを読めば何をしているかは分かると思います。
一応説明を加えると下記のような感じです。

### .number-container

`position` で要素を重ね合わせる必要があるので、そのためのコンテナです。
それ以上の意味は特にありません。

### .number-input

`input` に付与します。
普段は `z-index` で後述の `.number-overlap` の後ろに隠れていますが、フォーカスすると前面に出てきます。

### .number-overlap

実際に3桁カンマの文字列が設定される要素です。
普段は `z-index` で前述の `.number-input` に被さっていますが、フォーカスされると後ろに引っ込みます。
`pointer-events:none` なので**クリックを透過します**。これが今回のキモです。これによって「被さっているんだけど後ろの要素がクリック（フォーカス）できる」が実現できます。

### javascript

フォーカスとか見え方とかは css だけで完結しますが、「カンマを振る処理そのもの」はどうしても js の力を借りる必要があるのでそれをしています。
できれば html + css だけでやりたい・・・。

## 注意点

ただし上記はかなりサボっています。実際はいろいろ調整しないと使い物になりません。

まず `.number-overlap` のスタイルは `number-input` に完全に合わせる必要があります（padding や font-size など多岐にわたる。合わせないとすぐズレる）。
上記は bootstrap を使っていますが `form-control` は `input` に限定されないので流用してるだけです。しっかりやろうとすると結構めんどくさいです。
実際、上記は chrome で確認しましたが、他のブラウザではズレたりします。そういった微調整が必須になります。

また、個人的に数値入力は `type=number` を使うことが多いです。さらに右寄せにしたいですが、スピンボタンがくっつくのでブラウザごとの調整が必要です（幅がブラウザごとに全く異なります）。
正直かなり大変なので、いっその事スピンボタンは消したほうが良いです。

js サイドも上のコードだと数値以外を入れると NaN になるので、もっといろいろな分岐が必要です。
NaN は `type=number` でサボったり出来ますが `e` の罠があったりして、正直「ロケール指定ができる `type=number` があればいいのに・・・」と思います。

## まとめ

注意点で記載した所が調整・クリアできれば変換の面倒をまったく見なくて済むようになるので結構有用だと思います。
（js で値をゴリゴリいじるのはなんか好かん）。
YouTubeをモーダル表示させる

自分用です

[Magnific Popup](https://dimsemenov.com/plugins/magnific-popup/)
上記サイト内の「Popup with video or map」の部分が該当
ローカルでは再生できないようなので、サーバーに上げて確認をする。

```html:HTML(head内）
<link rel="stylesheet" href="css/magnific-popup.css">
<script src="js/jquery.magnific-popup.min.js"></script>
<script>
  $(document).ready(function() {
   $('.popup-youtube').magnificPopup({
    disableOn: 700,
    type: 'iframe',
    mainClass: 'mfp-fade',
    removalDelay: 160,
    preloader: false
   });
});
</script>
```

```html:HTML（body内）
<a class="popup-youtube" href="http://www.youtube.com/watch?v=SAMPLE">Open YouTube video</a>
```

```css:CSS
/**
 * Simple fade transition,
 */
.mfp-fade.mfp-bg {
	opacity: 0;
	-webkit-transition: all 0.15s ease-out; 
	-moz-transition: all 0.15s ease-out; 
	transition: all 0.15s ease-out;
}
.mfp-fade.mfp-bg.mfp-ready {
	opacity: 0.8;
}
.mfp-fade.mfp-bg.mfp-removing {
	opacity: 0;
}

.mfp-fade.mfp-wrap .mfp-content {
	opacity: 0;
	-webkit-transition: all 0.15s ease-out; 
	-moz-transition: all 0.15s ease-out; 
	transition: all 0.15s ease-out;
}
.mfp-fade.mfp-wrap.mfp-ready .mfp-content {
	opacity: 1;
}
.mfp-fade.mfp-wrap.mfp-removing .mfp-content {
	opacity: 0;
}
```
PHPで非同期+プロセス管理？ PHP-FPMより15倍速いというPHP-PMというモノを知った（PHP-fpmじゃないよ！）

![An example of how PHP Process Manager helps handling requests](https://tsh.io/wp-content/uploads/2018/10/2.png)
ref: https://tsh.io/blog/php-pm-guide-getting-started-with-the-process-manager/

先日、色々調べ物をしていたら、ReactPHPという変なのを見つけました。
https://reactphp.org/

ここで言うReactはJavascriptのReact.jsじゃないです。Reactパターン？スタイル?のReactです。（ReactJSも元はPHPのHTMLコンポーネントライブラリのXHPがベースらしいんですが https://qiita.com/ytake/items/2ee2c0e10c6ef6f040fa ）
PHPで非同期でマルチプロセスでってやつです。驚いたことにPHPで書かれています。
正直、「*コレPHPで書くか？*」って思ったんですが、面白そうだったので色々調べたらPHP-PMというものを見つけました。

# PPM - PHP Process Manager
https://github.com/php-pm/php-pm
PPMと略すみたいです。
ReactPHPを使って、SymfonyやLaravelが動くPHPのmiddleware（PSR-15）として実装されている感じです。SymfonyのHttpKernelのAdapterとして動作するとのことです。なので、nginxはPPMのプロキシとして動作します。
PPMは実行されると8080番ポートとかでずっとListenし続け、PPMがPHPを子プロセスとしてcliで動かしてプロセス管理をするとの事で、利用するphp.iniはcli用の設定になります。

なので、利用するためにはPCNTLが必要であり、configureオプション``--enable-pcntl``が必要になります。
https://www.php.net/manual/ja/book.pcntl.php

## Nginx + PHP-fpmの15倍速いらしい
![PHP Process Manager in faster than Apache and FMP](https://tsh.io/wp-content/uploads/2018/10/Wykres1.png)

## メモリリークは健在
公式ページでは、主な課題に「**メモリリーク！メモリリーク！メモリリーク！ まあ、プロセス再起動されるからきっと大丈夫だよ**」的な事が書いてあり、引用元の記事でも
> PHP-PM could cause big memory leaks (there’s probably some issue with restarting workers); it consumed all of my memory and crashed my PC; it happened twice,

と「メモリリーク凄くてPCクラッシュしたわ」的な事が書いてあるので、ここは注意が必要そうです。

# まとめ
正直、「えー！？本当に速くなんの？」という疑念が振り払えないし、PHPでプロセス制御するってのに感覚的な恐怖を覚えます。
メモリリークもPCクラッシュするほどって話だし、まだまだ発展途上なのかなぁという感じです。

が、きちんと検証せずに感情だけで判断してはダメなので、近いうちに色々試してみようと思います。

ちなみに、PHPで非同期処理ってのだと[Swoole](https://www.swoole.co.uk/)ってのがあり、こっちはC++で書かれていてPECLモジュールにもなっているので、感覚的にはこっちの方が安心できる。
https://qiita.com/gorogoroyasu/items/44119f8b2ba725859018
Cognosレポートのチャートの軸の項目を動的に変更する方法

Cognosのグラフ表示するときに、レポートを見る側がその時々によって表示に使用する軸の項目を選択したいというリクエストが来ることがあります。
今回はその軸の項目を選択するやり方についてまとめようと思います。

まず、以下のようなグラフがあるとします。
四半期ごとの製品ラインそれぞれの販売数量のグラフです。
同じグラフでY軸の「数量」を別の項目（今回は「収益」「総利益」とします）に変更できるようにしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/11d18fa9-28de-49c7-7a03-c1f216cef4b9.png)

まず値のプロンプトを左に配置します。今回はパラメーター名をY1とします。
また、値のプロンプトのプロパティから自動送信も「はい」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/f4f76077-0f1d-25c9-e088-9bce4b60c8e4.png)
また、「数量」以外にも「収益」「総利益」をY軸に指定できるようにするため、プロパティの固定値の選択で以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/2eec4627-d315-7217-b4c6-682d5f3ef80f.png)

次に、クエリー１に、ツールボックスからクエリー計算（データアイテム）を追加して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/c0448d73-a376-5894-db29-4c19083093fe.png)
データアイテムの名前を「Y1軸」とします。
式には、以下のようにcase文を使用して値のプロンプトの結果によってデータアイテムの指定が変わるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/e673600e-bea5-8902-872d-25e5392301e1.png)
次に、もう一つデータアイテムを追加して以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/ad7d582b-cc94-7db6-c2dc-3f2ef08cd46a.png)


作成したデータアイテムをグラフのY軸に設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/eddd18e0-f3fd-69dd-932b-33454b33c2ba.png)

次に選択した時に軸ラベルも変更できるようにします。
軸のタイトルのプロパティからデフォルトのタイトルを「いいえ」にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/b29257df-05c4-210d-1ebb-7380f3103710.png)

軸ラベルのテキストソースのソースのタイプを「データ・アイテムの値」、データ・アイテムの値に「Y軸名」と設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/7c6c799c-7760-9379-c15a-1bb4d270d90e.png)

レポートを実行して、値のプロンプトでアイテムを選択できることとY軸ラベルが変わることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148873/2b876861-c9c5-822a-9274-f6755a0aca42.png)



以上

#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
Ruby最新版の挙動をRSpec+Guardで試した時の環境構築メモ


# はじめに

Rubyのバージョンが上がったときなどにサクッと挙動を確かめられるよう書いた自分用のメモです
(ちなみにbrewやRubyをインストールする時間を除けば3分で構築できました)

## 今回利用したツールの各バージョン

* macOS 10.13.6
* brew 2.1.3
* rbenv 1.1.2

# 最新Rubyインストール

## インストールできるRubyのバージョンリストを最新にする

```
brew update && brew upgrade ruby-build
```

## インストール可能な一覧を見てバージョンを決める

```shell
rbenv install -l
```

```shell
...
2.7.0-dev
...
```

## 指定したバージョンのインストール

```shell
rbenv install 2.7.0-dev
```

## 作業場所用意

ここで「sample」という作業ディレクトリを作り
以下の作業はこの中で行います

```shell
mkdir ~/sample
cd ~/sample
```

## インストールしたバージョンに切り替える

```shell
rbenv local 2.7.0-dev
ruby -v #=> ruby 2.7.0dev (2019-05-22 trunk ca435ed04a) [x86_64-darwin17]
```

# RSpec + Guardインストール

## まずはbundlerインストール

```shell
gem install bundler
bundler -v #=> Bundler version 2.1.0.pre.1
```

## Gemfile新規作成

```shell
bundle init # Gemfileが生成される
``` 

## Gemfileに必要なgem追記

```ruby:Gemfile
# 以下追記
gem "rspec"
gem "guard"
gem "guard-rspec"
```

## gemインストール

`.bundle/` にインストールすることにします

```shell
bundle config set path .bundle # ちなみに --path .bundleは非推奨になるらしい
bundle install
```

今回は以下のバージョンがインストールされました

* rspec (3.8.0)
* guard (2.15.0)
* guard-rspec (4.7.3)

## RSpec準備

```shell
bundle exec rspec --init
```

## Guard準備

```shell
bundle exec guard init
```

# テストコード作成

```shell
> spec/my_spec.rb
```

```ruby:spec/my_spec.rb
require 'spec_helper'

RSpec.describe 'MySample' do
  describe 'methodメソッド' do
    subject { 123.method(:to_s) }
    it { expect(subject.class).to eq(Method) }
    it { expect(subject.call).to eq('123') }
    it { expect(subject.()).to eq('123') }
  end

  describe 'メソッド参照演算子' do
    subject { 123.:to_s }
    it { expect(subject.class).to eq(Method) }
  end
end
```

## Guard起動

```shell
bundle exec guard
```

とりあえずenter押せば全テストケースを実行してくれます。
あとはlib/my_spec.rbを保存するたびにテストコードが走るはずです。
エクセルでシーケンス図書くのやめませんか？mermaidが便利ですよ

初投稿にして煽り。すみません。

# この記事をおすすめする対象の人
チームでの開発時に、シーケンス図にExcelやPowerPointを使っている人が対象です。

# エクセルの何がいけないのか
エクセルというだけで吐き気がする人もいるかと思いますが、個人的には以下が気に入りません :(

- ファイルがでかい
- 仕様書を書くときにバージョン管理用シート(笑)が必須
- 差分が分かりづらい(winMerge等使えば差分がわかるけど嫌だ・・・)
- 注釈に描画オブジェクトを使ってしまうと文字列が検索にひっかからない

# mermaidを使って！
そこで私は[mermaid](https://mermaidjs.github.io/)をオススメします。
## なにそれ？

- markdown形式で記述するシーケンス図
  - 差分がわかりやすい
  - 軽い
  - gitlabでは標準搭載(Readme.mdで使える)

# 書き方/見え方
markdown形式で記述すると、シーケンス図として解釈してくれます。
## 記述例

```mermaid
sequenceDiagram
    A->>B: request;
    Note right of A: note of arrow;
    B->>A: reponse;
    A->>C: notify;
```

`sequenceDiagram`がシーケンスであることの宣言になります。
`->>`がシーケンス図上の矢印の方向になります。
`Note right of A`でAの右に注釈を配置することになります。
で、実際の表示は以下のようになります。
![スクリーンショット 2019-05-23 18.31.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55118/9520e3b7-99d7-ba84-06cf-5c6d28636b04.png)

どうでしょう、少ない記述でシーケンス図が書けちゃいました！

## 環境に依存せず見たい(ブラウザで見たい)場合
[mermaid live editor](https://mermaidjs.github.io/mermaid-live-editor/#/edit/eyJjb2RlIjoiZ3JhcGggVERcbkFbQ2hyaXN0bWFzXSAtLT58R2V0IG1vbmV5fCBCKEdvIHNob3BwaW5nKVxuQiAtLT4gQ3tMZXQgbWUgdGhpbmt9XG5DIC0tPnxPbmV8IERbTGFwdG9wXVxuQyAtLT58VHdvfCBFW2lQaG9uZV1cbkMgLS0-fFRocmVlfCBGW2ZhOmZhLWNhciBDYXJdXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ)というWebアプリが公開されているので、試してみたい方はこちら。

これとは別に、javascriptライブラリをインポートすれば、ブラウザで見ることもできます。
あまりこの使い方することは無いかもしれませんが、[こちら](https://mermaidjs.github.io/usage.html)を見るとわかります。

## githubで使う場合
サポートはされていないみたいです。強引に対応はできるようです。別記事で書き起こしたい。
## gitlabで使う場合
上記のような記述をmdファイル形式で置いておけば、Gitlab/Github上で見れます。あー便利。
https://docs.gitlab.com/ee/user/markdown.html#mermaid
## エディタから見たい場合
Atom/Visual Studio Codeに拡張機能があります。
Visual Studio Codeの場合は以下の拡張が一番人気のようです。
https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid
Atomはこっち
https://atom.io/packages/atom-mermaid

## 資料をお客さんと共有したい
別の方が画像としての出力方法を公開しています。
「図が大きくてスクショ取れない」という場合に使えるかと。
https://qiita.com/orange5405/items/9baebdb09b40da86da65
git log で月ごとのリリース回数を数える

# 前提条件

- リリースごとに何らかのルールで `git tag` 打ってる
    - ここでは `release/v1.0.0` みたいなタグを打ってることにする

# コマンド

```sh
git log --all --pretty='%ad %d' --date=format:%G-%m |
grep "tag: release/v"|
cut -d " " -f 1|
awk '{arry[$NF] += 1;} END{for(i in arry){print i "," arry[i]}}'|
sort
```

```csv
2019-04,5
2019-05,2
```

こんな感じの出力が得られます

# 解説

- `git log --pretty='%ad %d' --date=format:%G-%m`
    - `2019-05 (tag: release/v2.100.0)` こんな出力得るためのフォーマット整え
- `grep`
    - 特定のタグ名だけにする
- `cut`
    - `2019-05` の部分だけにする
- `awk`
    - 月ごとにカウント
Javascriptにおける 論理演算子 || の動きについて

### 本記事について

おそらく初心者向けですが、
Javascriptで、a || b
という記述があった時の論理演算子の動きについて共有します。

Javascriptの開発の中で、下記のような記述を読み解くのに少し時間がかかったので、自分用のメモとしても残しておきます。

※こちらはService Worker+Cache APIを実装した際のコードですが、Service Workerについては別の機会にまた解説したいと思います。

```javascript

self.addEventListener('fetch', (event) => {
  event.respondWith(
    caches.open(CACHE_NAME)
    .then(function(cache) {
      return cache.match(event.request)
      .then(function (response) {
        return response || fetch(event.request)
        .then(function(response) {
          cache.put(event.request, response.clone());
          return response;
        });
      });
    })
  );
});
```

### Javascriptの処理
この処理を順番に整理すると
・```caches.open(CACHE_NAME)```でCACHE_NAMEと一致したかどうかを確認し、Promiseを返す（成功していればthen内部の処理へ）
・```cache.match(event.request)```でcacheの中身がevent.requestにマッチしていればPromiseを返す（そして2つ目のthen内部の処理へ）

```javascript
return response || fetch・・・・
```

と続いていくわけですが、

ここの処理は、

**レスポンスを返すか、fetchでリクエストを送るか**
ということになります。（当たり前だ）

### a || bの処理の仕様

・・・なのですが、処理の中で
```a || b```（aまたはb）となった時に

え、じゃあ結局どっちの処理をするの？

ということを疑問に思う方もいるかもしれません。

この「または」を表す || という論理演算子の考え方としては

処理a || 処理b

となっている場合は

**処理aがtrueの場合、処理aのみを実行**
**処理aがfalseの場合、処理bを実行**

となります。

なんか、if文でやたらと

```javascript
if(a || b) {
  //aまたはbなら処理
}
```
と刷り込まれてしまっていると、「あれ？aかbかが実行されると書いてあるけど、それって何で決まるんだっけ？」
とふと思ったのでググって自分なりにコードの意味を噛み砕いていくことができました。

一応先ほどのコードの意味を順番に書いておきます。
・```caches.open(CACHE_NAME)```でCACHE_NAMEと一致したかどうかを確認し、Promiseを返す（成功していればthen内部の処理へ）
・```cache.match(event.request)```でキャッシュの中身がevent.requestにマッチしていればPromiseを返す（そして2つ目のthen内部の処理へ）
・```return response```がtrueならばそこでブラウザに処理を返す
・```return response```がfalseならばfetchの処理に進む
・```response.clone()```でレスポンスをクローンして、```cache.put()```キャッシュを更新する

という感じになります。

a || bをちゃんと調べてまとめてみましたとさ。

参考：[MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Logical_Operators)
AWS SSM でコピー＆ペーストが遅くなる場合の解消法

# 現象

SSMでセッションマネージャーを利用する際、100文字以上のコピー＆ペーストを行うと100文字以降からのペーストが遅くなる。
🐢🐢かなーりおそい🐢🐢

# 解決方法

**session-manager-pluginを1.1.17.0へアップデートする**（現状バージョンの指定方法がわからないですが。。。）

アップデートはリファレンス( https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html )のインストール手順をそのまま行えばできます。(Ubuntuで確認済み)

`session-manager-plugin --version`でバージョン確認できます。
ちなみに手元のUbuntu18.04LTSのでやったログは以下。

```bash
$ session-manager-plugin --version
1.0.37.0
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 2918k  100 2918k    0     0   899k      0  0:00:03  0:00:03 --:--:--  899k
$ sudo dpkg -i session-manager-plugin.deb
(データベースを読み込んでいます ... 現在 168528 個のファイルとディレクトリがインストールされています。)
session-manager-plugin.deb を展開する準備をしています ...
Stopping session-manager-plugin
Removed /etc/systemd/system/network-online.target.wants/session-manager-plugin.service.
Preparing for install
session-manager-plugin (1.1.17.0-1) で (1.0.37.0-1 に) 上書き展開しています ...
session-manager-plugin (1.1.17.0-1) を設定しています ...
新バージョンの設定ファイル /usr/local/sessionmanagerplugin/VERSION をインストールしています ...
Starting session-manager-plugin
Created symlink /etc/systemd/system/network-online.target.wants/session-manager-plugin.service → /lib/systemd/system/session-manager-plugin.service.
rm: '/usr/local/bin/session-manager-plugin' を削除できません: そのようなファイルやディレクトリはありません
ureadahead (0.100.0-21) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
$ session-manager-plugin --version
1.1.17.0
```


# 参考資料

https://github.com/aws/amazon-ssm-agent/issues/149
↑ちょっと荒れててワロタ
【Sass】導入と使い方

#はじめに
ポートフォリオを作るにあたりcssを書こうと思ったのですが、
sassというものがあると知ったので導入しました。
途中、エラーが出たところもまとめます。

#sassとは何か

#sassの導入

私はmacを使っているのでRubyの導入では何もしてません。

####sassインストール
[Sassを使ってCSSを爆速コーディング！Sassの導入方法と使いかた。](https://qiita.com/saison/items/472ff5a398fceefaa85c)に書いてある通り、
下記コマンドを実行するが

```bash
$ gem install sass

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```

エラー...

[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150)
こちらの記事の**現状確認**と同じコマンドを実行すると、全く同じ結果が返ってきました。

なので私も**rbenv**というやつを入れます。（rubyのバージョン管理をしてくれるものなのかな..）
記事の通り、最新版のrubyをインストールしたので、私の場合は**2.6.3**です。

```bash
$ rbenv install 2.6.3

$ rbenv versions
* system (set by /Users/hoge/.rbenv/version)
  2.6.3
```

**この後からは先ほどの記事とは違うことを行いました！**

記事では、rbenvでインストールしたrubyのバージョンをglobalにしていますが、
他のアプリに影響を与えたくないので今回はlocalで利用します。

```bash
$ cd ver2.6.3のrubyを使いたい作業ディレクトリ
$ rbenv local 2.6.3

$ rbenv versions
  system (set by /Users/hoge/.rbenv/version)
* 2.6.3
```

その後パスを通します。
~/.bash_profileに`eval "$(rbenv init -)"`を追記します。

パスを更新したいので、

```bash
$ source ~/.bash_profile
$ ruby -v
  ruby 2.6.3
```

できました！

今回はglobalでなくlocalにしているので、
`rbenv local 2.6.3`コマンドを実行したディレクトリ下でのみこのバージョンが適応されます。


#今度こそSassインストール

```bash
$ gem install sass
```

できた...

#使い方
[Sassを使ってCSSを爆速コーディング！Sassの導入方法と使いかた。](https://qiita.com/saison/items/472ff5a398fceefaa85c)
こちらの記事の**実際に使ってみる**を参考にしました！
私はscssにしました。

##参考にしたサイト（ありがとうございます><）
[これからはcssはSassで書こう。](https://qiita.com/m0nch1/items/b01c966dd2273e3f6abe)
[Sassを使ってCSSを爆速コーディング！Sassの導入方法と使いかた。](https://qiita.com/saison/items/472ff5a398fceefaa85c)
[gem installでpermissionエラーになった時の対応方法](https://qiita.com/nishina555/items/63ebd4a508a09c481150)
[rbenvでバージョンがうまく切り替わらなかった時にやったこと](https://qiita.com/akatsuki174/items/c0384b9903b4b5cbbdaf)

#使ってみて
cssで書くよりもきれいに書けるのと、みやすいのでこれからもガンガン使っていきたいです！
参考になるサイトがたくさんあって助かりました。ありがとうございます。

[ポートフォリオサイト](https://gudanago.github.io/gud/)を少しだけ更新しました。
FontAwsomやtwitterタイムラインを載せたので、手順やメモをまた投稿しようと思います。
Raspberry Piで学ぶdocker入門

# はじめに
本文書を参照頂きありがとうございます。
この文書は社内勉強会に向けた文書である為、一部期待値と異なる表現、記載がある場合がありますので、ご利用になられる際はその辺りも加味して頂いてご利用下さい。

# 勉強会お題
- 第01回（2019.05.22）：[Raspberry Piのセットアップ、Docker環境のセットアップ](https://qiita.com/takanobu_kawaguchi/items/f403d391720485b106cb)
- 第02回（2019.06.05）：[Dockerイメージの導入、各種コマンド等の学習](https://qiita.com/takanobu_kawaguchi/items/25b0a7a1f17c1d8b5205)
- 第03回（2019.06.19）：[複数のDockerイメージを稼働させる](https://qiita.com/takanobu_kawaguchi/items/f899866c454c98b126db)
- 第04回（2019.07.03）：Kubernetes登場
- 第05回（2019.07.17）：（ちょっと脱線）Raspbian Buster
- 第06回（2019.07.31）：社内発表会に向けた検討課題精査
- 第07回
- 第08回
- 第09回
- 第10回

# よく使うRaspberry Pi コマンド
- シャットダウン

```
$ sudo shutdown -h now
```

# Special Thanks
※貴重な技術文書の参照先の皆様、リンク先等のご紹介
＜公式ドキュメント等＞
公式ブログ：https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/
Docker：https://docs.docker.com/install/linux/docker-ce/debian/

＜@kotaro-drさん＞
・[【図解】Dockerの全体像を理解する -前編-](https://qiita.com/kotaro-dr/items/b1024c7d200a75b992fc)
・[【図解】Dockerの全体像を理解する -中編-](https://qiita.com/kotaro-dr/items/88ec3a0e2d80d7cdf87a)
・[【図解】Dockerの全体像を理解する -後編-](hhttps://qiita.com/kotaro-dr/items/40106f13d47bfcbc2572)

＜@yuyakatoさん＞
・[Raspberry Pi 3 Model B(Raspbian)にDockerをインストールする](https://qiita.com/yuyakato/items/1cdc7fa511f7767c95ac)

＜@nimusukerokuさん＞
・[Dockerコマンド一覧](https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2)

＜@tananさん＞
・[Dockerfileについて](https://qiita.com/tanan/items/e79a5dc1b54ca830ac21)

＜@y_hokkeyさん＞
・[docker-composeを使うと複数コンテナの管理が便利に](https://qiita.com/y_hokkey/items/d51e69c6ff4015e85fce)

＜@MahoTakaraさん＞
・[今さら人に聞けない Kubernetes とは？](https://qiita.com/MahoTakara/items/85096f8b2632c802ab22)
after用にaiデータをパーツごとレイヤーに分ける

#いままで手作業でやっていた
新規レイヤーを作成してコピー。
新規レイヤーを作成してコピー。
新規レイヤーを作成してコピー。
新規レイヤーを作成してコピー。
・・・簡単にできそう。

#「サブレイヤーに分配」!?

一発解決でした。
レイヤーのメニューをクリックして
<img width="289" alt="スクリーンショット 2019-12-12 13.37.49.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/4014dc93-6545-ad99-62ec-aff95ec0e6b5.jpeg">
サブレイヤーに分配(シーケンス)
<img width="229" alt="スクリーンショット 2019-05-23 18.23.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/63ead68a-7905-133b-026b-7e43cb683e8c.png">


#取り込むときの設定
フッテージじゃなくて「コンポジション」で！
<img width="378" alt="スクリーンショット 2019-12-12 13.49.32.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168611/8d3cb56a-1c87-482e-fb55-a7117d569505.jpeg">
【機械学習】練習用データセットの作成【身長・体重】

# はじめに
教師あり学習について知人に教える機会があり、タイタニックをベースに教えようと思ったのですが、
身近でもなく、解りやすいデータでもないため、正直使いづらいなと思いました。[^1]
そこで身長・体重のそれっぽいデータを作ってみました。

# 1.目的
身長、体重、性別のcsvデータを生成する。

|height|weight|sex|
|---|---|---|
|165.5|66.4|male|
|174.5|74.2|male|
|156.3|54.9|female|
|161.4|52.2|female|

# 2.データ参照元様
[政府統計の総合窓口 e-stat 平成２７年国民健康・栄養調査](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00450171&tstat=000001041744&cycle=7&year=20150&month=0&tclass1=000001098375) から表番号12,13の資料より
20~29歳のBMIと身長の平均と標準偏差を参考にさせていただきました。

※BMIの標準偏差はそのまま使うと予測時の精度が低くなるので、今回は変えます。

# 2.考え方
numpyの***randam.normal***を使い、身長とBMIの正規乱数を生成します。
そのあと、生成した身長とBMIから体重を計算します。(身長[m]の二乗 * bmi)

```python

height = numpy.random.normal(身長の平均,身長の標準偏差,データ数)
bmi = numpy.random.normal(BMIの平均,BMIの標準偏差,データ数)
weight = (height * 0.01) ** 2 * bmi

```
# 3.コード
BMIの標準偏差を2にしていますが、これは予測時の精度を上げるためです。

```python
import numpy as np
import pandas as pd

male = pd.DataFrame()
female = pd.DataFrame()

m_height = np.random.normal(171.7,6.6,1000)
f_height = np.random.normal(158.3,5.7,1000)

# m_bmi = np.random.normal(23.12,4.24,1000)
# f_bmi = np.random.normal(20.82,3.42,1000)
m_bmi = np.random.normal(23.12,2,1000)
f_bmi = np.random.normal(20.82,2,1000)

male["height"] =np.sort(m_height)
male["weight"] = (male["height"] * 0.01) ** 2 * m_bmi
male["sex"] = "male"

female["height"] = np.sort(f_height)
female["weight"] = (female["height"] * 0.01) ** 2 * f_bmi
female["sex"] = "female"

df = pd.concat([male,female])
```

生成したデータをグラフ化するとこんな感じになります。
(当たり前ですけど)線形データっぽくなります。
![male_female.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/31be2629-376e-8583-a1e0-8d6d08446987.png)

ちなみに資料通りの標準偏差で生成するとこうなります。
分散が大きく、性別、身長、体重だけでの予測は難しそうです。
![def_male_female.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131499/1c09f973-c634-cff6-1889-418a37e4b883.png)



[colabのリンク](https://colab.research.google.com/drive/1z3Hh1sHRxpCEUXaD5G-N2b3lwBNWlAXB)
実行すると、標準偏差2で生成されるcsvデータをダウンロードします。

# 終わりに
身長・体重という面白みに欠けるサンプルデータですが、
学習目的で雑に扱えるデータとしては、使いやすいんじゃないかなと思います。

# 参考にさせていただいたサイト様
BMIについて：https://keisan.casio.jp/exec/system/1161228732
正規乱数について：https://note.nkmk.me/python-numpy-random/

[^1]: タイタニックはデータクレンジングや特徴量エンジニアリングが必要になるという点で、チュートリアル的にいいものだと思います。
Excel2013/2016で特定条件下でファイルが壊れる不具合と回避方法

## ファイルが壊れる事象

あるファイルを編集し、問題なく保存できるが、次に開いたときに下記の「一部の内容に問題が見つかりました。可能な限り内容を回復しますか?」のエラーが発生する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27443/630fda37-eb1d-c244-fdb1-512fd4ccb226.png)

「はい」を選択すると、下記の修復内容が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27443/bcc66755-8963-6021-1ddd-a12bf7f71d8d.png)

/xl/sharedStrings.xmlの差分を取ってみると、Excelが自動で設定するフリガナのタグ構成に問題があるようです。

## 再現手順
1. Excelを起動、空白のブックを作成する
2. 任意のセルを選択し、「データ」タブメニューから「データの入力規則」->「データの入力規則」を選択する
3. 「設定」タブの入力の種類で「リスト」を選択し、元の値に「a,b,c」（任意の文字）と入力
4. 「エラーメッセージ」タブで「無効なデータが入力されたらエラーメッセージを表示する」のチェックを外す
5. 「OK」ボタンでデータの入力規則ダイアログを閉じる
6. データの入力規則を設定したセルを右クリックして「セルの書式設定」を開く
7. 「保護」タブの「ロック」のチェックを外し、「表示しない」にチェックを入れる
8. 「OK」ボタンでセルの書式設定ダイアログを閉じる
9. 「校閲」タブメニューから「シートの保護」を選択
10. 「シートの保護」のチェックはそのままで「OK」ボタンにより保護を実行する
11. データの入力規則を設定したセルに任意の半角＋漢字（例：2019年）を入力
12. Enterで確定後、再度同じセルに対して任意の半角＋漢字（例：2019年）を入力（同じ文字でも別でも構いません）
13. ファイルを任意の場所に保存し、ファイルを閉じる
14. 上記で保存したファイルを開くと壊れた状態となっている

## 確認環境
* Windows 10 Pro 1709 64bit, Office 365 1803 (Excel 2016) 32bit
* Windows 10 Pro 1709 64bit, Office Professional Plus 2013 32bit
* Windows 7 Professional SP1 32bit, Office Professional Plus 2013 32bit

## 回避方法
どれかの条件が外れればOKなので、一番影響の無い「保護」タブの「表示しない」のチェックを外せば発生しなくなります。
そもそもこれは数式バーに数式を表示しないための設定なので、文字入力する箇所にこの設定は不要でした。
YAML基本文法まとめ

# YAMLとは
YAMLとは、配列や連想配列などの構造化されたデータを表現できるテキストフォーマットの1つです。
似た目的で使われるものにJSONやINI、XMLなどがありますが、
YAMLはその中でもインデントが必須であったり、文字列のクォートが不要であったりと、読み書きのしやすいフォーマットです。

---

# YAMLのいいところ
・コメント書ける(JSONは書けない)
・文字列のクォートが不要(数値や真偽値などとして判定されない文字列なら)
・インデントが強制されるので読みやすい

# YAMLの文法
YAMLは自由度が高くいろいろな書き方ができますが、基本だけまとめます。

---

## 基本

- **ハッシュ**  
基本はキーバリュー(連想配列)の形  
属性名(キー)と値をコロンで区切る

```yaml
key01: value01
key02: value02
```

- **配列**  
頭にハイフン + スペース

```yaml
list:
 - element01
 - element02
 - element03
```

---


- **ネスト**  
要素の入れ子はスペース2つ

```yaml
parent:
  child:
    child_attr01: 100
    child_attr02: 200
```

- **コメント**  
先頭に"#"で一行コメント  
インラインコメントも可能

```yaml
# This is comment.
name: john
age: 22        # This is comment too.
```

---


## データ型
YAMLの値はいくつかの型を表現できます。(この他にも日付型等もある)

- 文字列
- 数値
- 真偽値
- NULL

---

- **文字列**  
通常は文字列扱い

```yaml
string: hello!
```

- **数値**  
数字のみの場合は数値として扱われる

```yaml
number: 3
```

---

- **真偽値**  
true or false(全て小文字)で真偽値

```yaml
bool01: true
bool02: false
```

- **NULL**  
null(全て小文字)でNULL

```yaml
null: null
```

---

- **数値のみや"null"などの文字列**  
クォート(シングル or ダブル)で囲うことで文字列であることを明示

```yaml
not_number: "3"
not_null: "null"
```

---


## もう一つの書き方
JSONっぽい書き方もあります。これを「フロースタイル」といいます。
(通常の書き方は「ブロックスタイル」)
※本当はJSONは全てブロックスタイルで書いたYAMLなので、YAMLが先

---


- **配列(フロースタイル)**  

```yaml
[element01, element02, element03]
```

- **ハッシュ(フロースタイル)**  

```yaml
{key01: value01, key02: value02, key03: value03}
```

---


ブロックスタイルとの混在も可

```yaml
  list01:
    - element01
    - element02
  list02:
    [element01, element02, element03]
  hash01:
    key01: value01
    key02: value02
  hash02:
    {key01: value01, key02: value02, key03: value03}
```

## Return
:point_down: Dockerコンテナ構築手順② Docker Compose編
https://qiita.com/aminosan000/private/6f1d1b1e730e01907fbc
初めまして、基本設計

##目的
システム開発のV字モデルを学んで、要件定義書から基本設計書ができるのは分かったけど、いざ現場にでると実は様々な種類があって、自分の目的（仕事）を達成する為に「何を見ればいいのか？」が分からず時間が掛かってしまった経験があります。

####・基本設計とは、どういうものなのかをざっくり把握し
####・プログラミングをする時にどの基本設計書を見ればいいのか分かるようになり
####・最後は自分で基本設計ができるようになる

ために基本設計についてまとめてみました。現場経験の少ない方にも役に立つ思います。

##基本設計とは
情報システムを作る工程の一つで、情報システム全体を機能単位に分割して

・それぞれの機能がどういうものか
・どういうことができるものか
・機能同士がどうつながるのか

を決めていく作業のことです。

入力→処理→結果の一連の「流れ」を重視し、処理の詳細までは踏み込ません。（初めまして、詳細設計参照→https://qiita.com/mikimaromomose/items/3c6e0f675331d48f5a64）
##何を決めるのか
・情報システムの画面や帳票、バッチ処理などの作るべき機能を全て洗い出す

・それぞれの機能が、どういうことをする機能か明確にする

・機能の間の関係性、特に入出力するデータを明確にして、情報システム全体で業務をどう行うか決める

・情報システムで持つデータを、どういう形式・項目として扱うか決める

・連携先の既存情報システムとどんなデータをやり取りするかを決める

・どんなハードウェアやミドルウェアを組み合わせれば、要件が実現できるか考える


##二つの観点
###外向けの設計
お客様が理解できるところ/UIユーザーインターフェース

例えば画面のデザインや画面間の遷移、出力される帳票のレイアウト、関連する情報システムとのデータのやり取り、そして情報システムを使った業務の流れです。ですから、情報システムが形になった後、お客様がこういうように使えるようになるはずだ、というものでもあります。

###内向けの設計

内から眺めたものとは、情報システムの作られ方に関係するものです。お客様が使う画面の裏には、画面を表示するためのプログラムやデータを保存するデータベース、そしてシステムとしてそれらがどう組み合わさるかという、いわゆる「アーキテクチャ」があります。基本設計はそれを決めるものでもあります。

###誰向けのアウトプットか
基本設計は、要件定義の内容を情報システムの言葉に置き換えたものであり、どういう情報システムになるかを決めるものです。ですので、お客様が出来上がる情報システムを確認するためにも使いますし、エンジニアがどういうシステム構成にするかを明確にするものでもあるのです。

##主なアウトプット

###方式設計（アーキテクチャ設計） 
「何を使って」
ハードウェア、ソフトウェア構成など
使用言語、プラットフォームの指定

「どのような工程で」
開発体制
開発スケジュール

「どのようなシステムを」
製造するのかを順番に設計するイメージ

###機能設計（アプリケーション設計）
システムをモジュール単位に分割し、各モジュールの外部仕様を設計する。
・画面遷移図
・画面レイアウト(UI)設計図
・シナリオ
・ビジネス・ロジック
・機能一覧表
・データベース設計
・ER図
・テーブル定義書

###その他、基本設計で作成される設計書
・性能/信頼性設計
・セキュリティ設計
・移行設計
・運用設計

##まとめ
良い基本設計をするには、プログラミングの知識だけでなく、システム全体の知識、業務知識など幅広い知識が必要だということです。プログラミングをしている時にも自分が作っている機能はどこから値を受け、どこへ出力し、それらの値はどんな意味を持っているのか？を意識すれば、顧客の業務の理解も深まりますし、自分に何が足りないからプログラミングが出来ないのかも分かるようになってきます。何が足りないのか分かり、それぞれの基本設計には何が書かれているか分かれば、みるべき設計書も見えてくるはずです。
WP User Frontend で作ったフォームを別サイトに簡単に引っ越す方法

ローカル環境で作った「WP User Frontend」の特定のフォームを、サーバーのWPに移行したかった時に、簡単にできないかなーって色々試したらすごく簡単にできたのでメモ。

# 移行元の環境からexport（ファイル出力）
1. まず、ローカル環境の管理画面にいき、左側管理画面のメニュー「User Frontend → Tools」へ
2. すると「Tools / import / export」というタブがそれぞれあるので、exportをクリック
3. 画面下段「Form Export」の欄から「Select individual」を選択。（「All」のままだと全てのフォームを出力することになる）
4. 該当のフォームを選択し、Exportボタンを押す。
5. json形式のファイルがダウンロードできたら成功

# 移行先へのimport（ファイルのアップロード）
1. 先ほどと同様、今度は移行先のWPの管理画面にいき、左側管理画面のメニュー「User Frontend → Tools」へ
2. 今度はimportタブをクリック
3. 画面下段にファイルをアップするところがあるので、ファイル選択画面から先ほどダウンロードしたjsonファイルを選択。
4. 選択できたら、「Import」ボタンを押して、完了（ちなみに、フォームに付与されていた４桁のIDは変わるので、注意）
HTMLとユーザービリティとは

文字の行間が広い。これはメールでよくあること。個人ブログではおなじみで、見やすいタテ読みという評価もある。

人の目の動きはタテに読むと言われている。横に動かさずにタテに見る傾向があるからだ。一文字ずつ読む人は少数派。多くの人はタテに流し読みする。<a href="https://ja.wikipedia.org/wiki/%E4%BB%95%E4%BA%8B%E4%B8%AD%E6%AF%92" >うつのWIKIより</a>人からすると、このように機械的な判断とは違う。人はストレスを感じるもので、人間からすることと機械的な処理との決定的な違いがある。ユーザーは読まない、見ないという根源的な問題から解決しきれない。

サイト制作では行間がつまりすぎると悪いという話もある。HTMLではCSSでレイアウトを整える。いっぽい腕行間が空きすぎて読みにくいというユーザーの声もある。

どちらをとるかは運営者次第。法人サイトほど行間にゆとりを出したレイアウトが人気になりつつある。悩んでしまうという結果に・・・。ユーザーは多数派に合わせるか、想定ユーザーに合わせるかの2つに1つ。想定ユーザーも決まっていないならプロジェクトを考え直さないといけない。

UXというと一般の運営者にとってはなじみがない。UIは当然の課題として残っているが、CSSレイアウトに正解はないのだ。
【Processing】で【Arduino】を動かす

#概要
Arduinoを用いてLチカ，サーボモータの制御についてメモ程度に記載します。

#実践
####Lチカ
LEDを0.5[s]間隔で点滅します。

```Processing:led.pde
import processing.serial.*;
import cc.arduino.*;
import org.firmata.*;

Arduino arduino;

int pin = 13; //pin番号

void setup()
{
  size(100,100);

  arduino = new Arduino(this, Arduino.list()[0], 57600);

  arduino.pinMode(pin, Arduino.OUTPUT);
}

void draw()
{
  arduino.digitalWrite(pin,Arduino.HIGH);
  delay(500);
  arduino.digitalWrite(pin,Arduino.LOW);
  delay(500);
}
```
####サーボモータ
サーボモータが0~180°を行った来たします。

```Processing:servomoter.pde
import processing.serial.*;
import cc.arduino.*;
import org.firmata.*;

Arduino arduino;

int pin = 13; //pin番号

void setup()
{
  size(100,100);

  arduino = new Arduino(this, Arduino.list()[0], 57600);

  arduino.pinMode(pin, Arduino.SERVO);
}

void draw()
{
  arduino.servoWrite(pin, 90);
  delay(1000);
  arduino.servoWrite(pin, 0);
  delay(1000);
  arduino.servoWrite(pin, 90);
  delay(1000);
  arduino.servoWrite(pin, 180);
  delay(1000);
}
```
【jupyter-notebook】Ubuntuにjupyterを入れた時にとりあえずすること。【Ubuntu】

#1 テーマの変更

通常のままだと白くて大変眩しい。黒っぽいテーマに変更する。

```
pip3 install jupyterthemes
```

これでテーマがインストールできる。

```
jt -l #テーマ一覧の確認
jt -t chesterish # テーマ「chesterish」に変更
```

細かいテーマの確認はか割愛

#2 「jupyter-notebook」コマンド長すぎる事件

最も短くしてしまおう。

```
cd
sudo vi .bashrc
```

ホームディレクトリから、.bashrcを開いて、末尾に

```
alias ju='jupyter-notebook'
```

と付け足せば、コマンドのaliasを設定できる。
このあと、この設定を有効にする必要があり、

```
source ~/.bashrc  
```

とのコマンドにて設定完了
【MNIST】【Pytorch】CNNをPyTorchのSequentialを使って実装する

PytorchのチュートリアルにはSequential Modelというものがあり、Kerasのように層を作るだけでネットワークを構成できる。

https://qiita.com/daikiclimate/items/80309935d66f44f0c572
にて全結合層のみのネットワークを作った
今回はCNN（Conv層のある）を作ろうと思ったが、
torch.nnにはFlattenのような関数がなくConv->Linerにネットワークがつながらない

そのため、Flattenというクラスをnn.moduleに継承させて無理やり追加させる。

```
import torch
import torchvision
import torchvision.transforms as transforms
import numpy as np
import torch.optim as optim
import torch.nn as nn
import numpy as np
batch_size = 128

class Flatten(nn.Module):
    def forward(self, input):
        return input.view(input.size(0), -1)

#トレインデータ、テストデータのロード
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, ), (0.5, ))])
trainset = torchvision.datasets.MNIST(root='./data', 
                                        train=True,
                                        download=True,
                                        transform=transform)
trainloader = torch.utils.data.DataLoader(trainset,
                                            batch_size=batch_size,
                                            shuffle=True)

testset = torchvision.datasets.MNIST(root='./data', 
                                        train=False, 
                                        download=True, 
                                        transform=transform)
testloader = torch.utils.data.DataLoader(testset, 
                                            batch_size=batch_size,
                                            shuffle=False)

#モデルの定義
model = torch.nn.Sequential(
    nn.Conv2d(1, 8, 5),  # 28 * 28 * 16-> 24 * 24 * 16
    nn.ReLU(),
    nn.MaxPool2d(2), #24 * 24 *16 -> 12 * 12 * 16    
    nn.Conv2d(8, 16,  5), # 12* 12 * 16 -> 8* 8 * 32
    nn.ReLU(),
    nn.Dropout2d(),
    Flatten(),
    nn.Linear(8 * 8 * 16, 128),
    nn.Linear(128, 10)
)

#勾配法
optimizer = optim.SGD(model.parameters(), lr=0.01)
#誤差関数
criterion = nn.CrossEntropyLoss()

training_loss = []

#モデルの学習
model.train()
for i in range(10):
    runnning_loss = 0.0
    for j, data in enumerate(trainloader):
        inputs, teacher_labels = data
        model.zero_grad()
        outputs = model(inputs)    
        
        #lossの計算逆伝搬
        loss = criterion(outputs,teacher_labels)
        loss.backward()
        optimizer.step()
        
        runnning_loss += loss.data.item()
        
        #途中結果の表示
        #バッチサイズに合わせて変更する必要あり
        if j % 100 == 99:
            print("[{:d}, {:d} loss : {:.3f}]".format(i, j+1, runnning_loss/2000))
            runnning_loss = 0.0
    training_loss.append(loss)
      
count_when_correct = 0
total = 0

for data in testloader:
  #テストデータのロード
  test_data, test_labels = data
  
  #テストデータの推論
  outputs = model(test_data)
  _, predicted = torch.max(outputs.data, 1)
  #正答率の算出
  total += test_labels.size(0)
  count_when_correct += (predicted == test_labels).sum()
    
print('正解率：%d / %d => %.1f'% (count_when_correct, total, int(count_when_correct)/int(total)*100 ),"%")
```
【JavaScript】Stringの数字をNumberに変換方法

## Stringの数字をNumberに型変換したい時

```javascript
const num = "12345";

console.log(typeof(num)) // String

console.log(typeof(Number(num))) // Number

console.log(typeof(parseInt(num,10))) // Number 第二引数は10進数ということ

console.log(typeof(+num)) // Number
```

いろんなやり方がありますね。
ただ、主流は`+num`をよく使うみたいです。

その前に、typeScriptで型を定めたほうがいいってことか。
git管理最初の作成

git管理最初の作成


社内共通アカウントでログイン
（誰でもアクセスできるように）
＋から　チーム作成
プロジェクト内から、プロジェクト作成。
リポジトリ　から　リポジトリの作成

半角英数字（”-”ハイフン可）

メンバー追加
メンバー　チームの管理　ユーザーグループ内のDevelopers
メンバーの中にメールアドレスを入れて　追加


GIT使い方イメージ
https://qiita.com/mint__/items/bfc58589b5b1e0a1856a
HTMLの基礎知識

Webページを作るために最低限必要なのがHTML。

## HTMLはコンテンツを構造化するための言語
テキストなどを「タグ」で囲むことでそのタグによっての役割をweb上で表現できる。

- 「開始タグ」
開始タグにはタグ名と複数の属性が含まれる。全て半角。

- 「終了タグ」
終了タグには/をつける

- 「空要素」
タグの中には、終了タグがないものもある。imgタグやinputタグなど。
[例]
```<img src="photo.jpg" alt="画像">```
- 「コメント分」
HTMLドキュメントの中にコメントを残す。コメント分はブラウザ上には表示されない。「<!--」と「-->」の間に書かれたテキストがコメント分になる。
[例]
```<!---これがHTMLのコメント--->```
VueでJsの中に静的と動的に外部Jsを読み込む書き方

Vueプロジェクトを開発する際に、利用中のJsの中で、そのたのJsについてのファンクションやオブジェクトをインポートして利用することがよくあります。外部のJsをインポートするときには、静的にと動的に二つの方法があります。以下で簡単に説明してみます。

#例文

~~~html:index.vue
<template>
  <div>
  <p>{{ msg }}</p>
  </div>
</template>
<script>
import { t3m1 } from './t3'
export default {
  name: 'test',
  data () {
    return {
      msg: 'you are ok.'
    }
  },
  mounted () {
    t3m1()
  }
}
</script>
~~~

~~~javascript:t1.js
const t1m1 = function () {
  console.log('t1m1 ok')
}
function t1m2 () {
  console.log('t1m2 ok')
}
export { t1m1, t1m2 }
~~~

~~~javascript:t2.js
const t2 = {}
t2.t2m1 = function () {
  console.log('t2m1 ok')
}
t2.t2m2 = function () {
  console.log('t2m2 ok')
}
export default { t2 }
~~~

~~~javascript:t3.js
// 外部Jsを静的に読み込む書き方
import t2 from './t2'
function t3m1 () {
  console.log('t3m1 ok')
  // 外部Jsを動的に読み込む書き方
  import('./t1.js').then((t1) => {
    t1.t1m1()
  })
  t2.t2.t2m1()
}
export { t3m1 }
~~~

#実行結果
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229009/bcafe28a-3426-9495-5e7a-d076c412e803.png)