OmniAICreator/Qiita-1.07M huggingface dataset:
【日記】OpenCVで画像の透明ピクセルだけを変換する

画像から1ピクセルずつ取り出してアルファチャンネルをチェックし、完全に透明だったらその画素を真っ白なピクセルで置き換えます。

```.py
import cv2
import numpy as np

        img = cv2.imread(image_file_path, cv2.IMREAD_UNCHANGED)
        # 画像から透明ピクセル（アルファチャンネルが0）を抜き出し、白ピクセルで置き換える
        # np.where使いたかったけど使い方がわからんかったのです
        for y in range(img.shape[0]):
            for x in range(img.shape[1]):
                if img[y, x, 3] == 0:
                    img[y, x] = [255, 255, 255, 255]

        # jpg保存をもってアルファチャンネル削除に替える
        cv2.imwrite(dst_file_path, img)

```

結果は下記のようになりました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">アルファ付きpngからいい感じにjpgに生まれ変わらせました。クロブチレトロみたいな半透明ピクセルは上手く処理しきれてない感じがありますけどここは妥協しましょう <a href="https://t.co/5ywuhIiLsq">pic.twitter.com/5ywuhIiLsq</a></p>&mdash; ヒト🏃‍♀️速バラ撒きおじさん/あつし (@Anaakikutsushit) <a href="https://twitter.com/Anaakikutsushit/status/1154602964318707714?ref_src=twsrc%5Etfw">July 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ソートアルゴリズムをC++で実装してみた

# はじめに

ソートに関する記事が時々Qiitaにアップされますが、自分で実装したことはなかったなと思い作ってみました。
実装では、テンプレートを使い、STLと同様にイテレータを受け取る関数として作りました。
今のところは
- バブルソート
- 選択ソート
- 挿入ソート
だけですが、気が向いたら追加します。

Rangeにも対応したいけど、Rangeオブジェクトを受け取るようにするにはどうすればいいのか…

# 実装

## ランダムアクセスイテレータの判定

ソート関数はランダムアクセスイテレータのみを受け取るので、ヘルパークラスを作成しました。

```cpp
template <typename Iterator>
struct is_random_access_iterator
    : std::is_same<typename std::iterator_traits<Iterator>::iterator_category,
                   std::random_access_iterator_tag> {};
```

## バブルソート

```cpp
template <typename RandomIt,
          typename std::enable_if_t<is_random_access_iterator<RandomIt>::value,
                                    std::nullptr_t> = nullptr>
void bubble_sort(RandomIt first, RandomIt last) {
  while (first < last) {
    auto it1 = first;
    auto it2 = first + 1;
    while (it2 < last) {
      if (*it1 > *it2) std::swap(*it1, *it2);
      ++it1;
      ++it2;
    }
    --last;
  }
}
```

## 選択ソート

```cpp

template <typename RandomIt,
          typename std::enable_if_t<is_random_access_iterator<RandomIt>::value,
                                    std::nullptr_t> = nullptr>
void selection_sort(RandomIt first, RandomIt last) {
  for (auto it = first; it < last; ++it) {
    auto min = std::min_element(it, last);
    std::swap(*it, *min);
  }
}
```

## 挿入ソート

```cpp
template <typename RandomIt,
          typename std::enable_if_t<is_random_access_iterator<RandomIt>::value,
                                    std::nullptr_t> = nullptr>
void insertion_sort(RandomIt first, RandomIt last) {
  auto insert = [](RandomIt first, RandomIt last) {
    auto it1 = last - 1;
    auto it2 = last;
    const auto tmp = *last;
    while (it1 >= first && *it1 > tmp) {
      *it2 = *it1;
      --it1;
      --it2;
    }
    *it2 = tmp;
  };

  auto it1 = first;
  auto it2 = it1 + 1;
  while (it2 < last) {
    if (*it1 > *it2) insert(first, it2);
    ++it1;
    ++it2;
  }
}
```
Windows Time サービスが記録するデバッグ ログの時刻表記形式を確認してみた

# はじめに

Windows をドメイン環境で利用していると、時刻同期に関するトラブルに直面することがあります。
こうした状況では、Windows Time サービスが出力する デバッグ ログの解析に迫られることもあります。
しかし、Windows Time サービスの既定のデバッグ ログの時刻形式は特殊で可読性が低く、非常にハードルが高いです。
この記事では、このハードルをさげ、デバッグ ログの解析の手助けとなることを目的としています。


# Windows Time サービスのデバッグ ログを出力する方法

Windows Time サービスは、既定では出力されません。
まずは以下の記事を参照し、デバッグ ログを有効にしましょう。

[Windows タイム サービスのデバッグ ログを有効にする方法 (support.microsoft.com)](https://support.microsoft.com/ja-jp/help/816043/how-to-turn-on-debug-logging-in-the-windows-time-service)


# 出力されたデバッグ ログの既定の時刻表記を確認する

上記で設定した値に従い出力されたデバッグ ログを早速見てみましょう。

```
152877 02:25:25.7174188s - (ログの内容)
```

このように、時刻同期サービスのログだというに、時刻が読めません。

# 時刻を読めるようにする方法

## その 1: 出力フォーマットを指定する

読めないのなら読めるようにすれば良いじゃない。
ということで、出力フォーマットを指定しましょう。
以下のレジストリを指定してください。

|項目|内容|
|:---|:---|
|キー|HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config|
|値の名前|FileLogFlags|
|型|REG_DWORD|
|値|0 (既定値)、1、2|

値に応じて時刻表記が以下のように変化します。

|値|表記|意味|
|:---|:---|:---|
|0|152877 02:25:25.7174188|可読しやすい (と表現されている) 時刻形式|
|1|132085815257174188|NT タイム エポック形式|
|2|2019/07/26 11:25:25|ロケーションに合わせた形式|

こんなことで悩むのは勘弁なので、とにかく 2 を指定しましょう。

## その 2: 頑張って解読する

もうログを取得してしまった…という状況では、改めてログを取得するのも困難です。
必殺の変換方法を伝授します。

PowerShell でこんな感じのコードを実行してみましょう。

```PowerShell:PowerShell
　[datetime]::FromFileTime(((((152877*24+2)*60+25)*60+25)*10000000+7174188).ToString("0"))
```

すると、`2019年7月26日 11:25:25` という結果が得られたと思います。
実は、デバッグ ログで確認できる既定の時刻形式は簡単に NT タイム エポックに変換できます。
デバッグ ログの既定の時刻表記を `AAAAAA B:C:D.EEEEEEE` と定義すると、以下の式で NT タイム エポックに変換できます。

```
(((AAAAAA*24+B)*60+C)*60+D)*10000000+EEEEEEE
```

というわけで、頑張って計算しましょう!

# おわりに

これで Windows Time サービスが記録するデバッグ ログの時刻の読み方についての理解が深まったと思います。
これでようやく解析ができますね。

具体的なログの解析方法は、こちらの記事が非常にわかりやすいですので、参考にしてください。

[最終回　NTP時刻同期サービスのトラブルシューティング (2/3) (atmarkit.co.jp)](https://www.atmarkit.co.jp/ait/articles/1301/24/news105_2.html)

# 参考文献

[第3回　w32tmコマンドとレジストリによるWindows Timeサービスの制御 (4/4) (atmarkit.co.jp)](https://www.atmarkit.co.jp/ait/articles/1207/12/news146_4.html)

[Windows時間(NT タイムエポック)を相互変換する方法 (qiita.com)](https://qiita.com/tsubasaxZZZ/items/ca95ecb129acabb7fba8)

[NTタイムエポック値 (wiki.suikawiki.org)](https://wiki.suikawiki.org/n/NT%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E5%80%A4)
ALBでのパスベースルーティング

#1.ターゲットグループの作成#

ターゲットグループを2つ作成しておく。ここでは、alb1 と alb2 と作成。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9a282bb0-8ecf-def4-6061-86d58614cd2c.png)


#2.ALBの作成#

ターゲットグループに alb1 を指定し、普通に作成する。

ここまでは通常のalbの作成方法と一緒。


#3.リスナーの編集#

「リスナー」で対象のリスナー の「ルールの表示/編集」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/dc33d639-5f05-23c4-75c2-770932710e3f.png)

「+」から「ルールの挿入」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2f8c12a9-222c-7bc7-210d-414bb86270f5.png)

「条件の追加」で「パス」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/4ff0cca6-4d1a-7087-00f4-693aef2101d5.png)


 /img/* がある場合、ルールは /img/picture.jpg のリクエストを /img/picture.jpg のリクエストとして、指定されたターゲットグループに転送するようにします。
[パスの条件](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/load-balancer-listeners.html#path-conditions)
/img/*　を入力し、チェックマークアイコンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ab304c33-5728-44b0-353b-41d1f3f8acd8.png)

「アクションの追加」から「転送先」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d8535770-7afd-31f5-a58c-a146bacb71bd.png)

alb2 の方を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7518f35c-72d9-3467-1b6a-b1f4d2c0d743.png)

設定はこれで完了です。


#4.テストしてみる#

/txt/txt.html → alb1
/img/img.html → alb2
のようにアクセスして、ターゲットグループのモニタリングからカウント数などを確認してみましょう。
Ubuntu18.04をインストールしたRaspberryPi 3 Model B+でGPIOを使う

#最初に投稿するときに検証まで済ませておけ
まっことその通りであります。[前の記事](https://qiita.com/frafrakki/private/3b14b0a318039e51dadd)

##1.shellでGPIOに指示を出す
###検証用ボード
まずはGPIOに指令が出せるのか。やってみましょう。
今回はラズパイマガジン2019年6月号のてんこ盛りボードを使うので、あしからず。一応写真載せときます。
![DSC_2891.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267917/3643c4da-b99f-de95-655e-f6fc6efe68f3.jpeg)


###操作
shell、つまりターミナル上で操作します。今回はちょうどいいところにRGB-LEDが乗っかってるので、いじってみましょうか。なんでもいいんですが、赤く光らせてみます。17番ピンがRにつながってるぽいのでそこに出力してみます。

```shell:
gpio -g mode 17 out
gpio -g write 17 1
```
これでLEDが輝いているはずです。

```shell:
gpio -g write 17 0
gpio -g mode 17 down 
```
使った後はしっかり片付けておきましょう。
これでデジタル出力が使えることは確認できました。

##2.Lチカする
要するにプログラムを書く。調べていくうちにpythonモジュールのwiringPiがかなりArduinoライクに書けるっぽくてそっちのほうがとっつきやすいかとも思ったけどRPi.GPIOでやっていきます。やるったらやるんです。

```python:led_blink.py
#led_blink.py

import sys
import RPi.GPIO as GPIO
import time

def main():
    # pin setup
    GPIO.setmode(GPIO.BCM)
    
    GPIO.setup(17,GPIO.OUT)
    
    # main loop
    while(1):
        GPIO.output(17,1)   # turn pin 17 on
        time.sleep(1)       # wait 1 sec
        GPIO.output(17,0)   # turn pin 17 off
        time.sleep(1)       # wait 1 sec 

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        print("program closing...")
        GPIO.cleanup()      # close all port
        sys.exit()
```
これで1秒おきにLEDが点滅するプログラムができました。`Ctrl-c`でプログラムが止まるようにもなっています。
一応解説すると

```python:
GPIO.setup(17,GPIO.OUT)
```
で17番ピンを出力に設定。
その後`while`ループの中で

```python:
GPIO.output(17,1)

GPIO.output(17,0)
```
を繰り返すことでLEDの点滅を行っています。
注意しなければならないのが、RPiのiは小文字です。
これで一回躓きました（核爆）

---
以上で、Ubuntu18.04でもRaspberryPiのGPIOが使えるようになったかと思います。
以降は自分で調べていっていただけると幸いです。
また何か書きたくなったら追記しますね。

## 参考にしたサイト
[WiringPi gpio コマンドの使い方](http://www.e-ark.jp/2013/05/06/wiringpi-gpio-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
[wiringPiの使い方](https://sugarsugar.conf.jp/wiringpi%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)
[Raspberry PiでPythonのRPi.GPIOを使ってLチカする](https://qiita.com/masato/items/715e28e0c0c945a54297)
SSH 接続情報をメニュー選択するシェルを作成したみた

# ０．はじめに

サーバーへの SSH 接続に、Chrome 使ったり、Cyberduck 使ったりしてたんですが…、

* [Chrome で SSH 接続してみた \- Qiita](https://qiita.com/kusokamayarou/items/2475fc527ca626f0e784)
* [Mac で Cyberduck のブックマーク \(接続先情報\) をバックアップする \- Qiita](https://qiita.com/kusokamayarou/items/81dfa2a7638305d13ccf)

Chrome のキャッシュが飛んで、接続情報が無くなってしまったり…、
Cyberduck がたまに使えなくなったりと…、
何か色々と困った事が起きたので…、基本に戻ってシェル使おうかなと思って作ってみました。

# １．事前準備

※特に無し。

# ２．プログラム

1. SSH 接続プログラム (.command)

```sh:SshConnect.command
#!/bin/bash

MyBase=`dirname ${0}`

# bashのshellで2次元配列を使ってHTMLのテーブルを作る方法 - Qiita
# https://qiita.com/ponsuke0531/items/86df8752d8a4c4e9ca92

dataArray=(
#TiTle             #Host                       #Port    #User       #Identifier                             #Password
"'タイトル'        'ホスト'                    'ポート' 'ユーザー'  '鍵ファイルパス'                        'パスワード'"
"'XXXXXXXX'        'XXX.XXX.XXX.XXX'           'XXXXX'  'XXXXXXXX'  '/XXXX/XXXX/XXXX.pem'                   'XXXXXXXX'"
)

OLDIFS=${IFS}

IFS=$'\n'
for i in "${dataArray[@]}"; do
  IFS=$'\''
  DATA=(${i[@]})
  TITL=${DATA[1]}
  HOST=${DATA[3]}
  PORT=${DATA[5]}
  USER=${DATA[7]}
  FILE=${DATA[9]}
  PSWD=${DATA[11]}
  REC=`printf "%-24.24s %-32.32s %-8.8s %-16.16s %s" ${TITL} ${HOST} ${PORT} ${USER} ${FILE}`
  LIST="${LIST}\n${REC}"
done

IFS=$'\n'
PS3="What do you use ? >"
select ANS in `echo  -e "${LIST}"`
do
  IFS=${OLDIFS}
  if [ -z "${ANS}" ]; then
    continue
  else
    break
  fi
done
echo

IFS=$'\''
DATA=(${dataArray[$((REPLY-1))]})
TITL=${DATA[1]}
HOST=${DATA[3]}
PORT=${DATA[5]}
USER=${DATA[7]}
FILE=${DATA[9]}
PSWD=${DATA[11]}

IFS=${OLDIFS}
PS3="SSH or SFTP ? >"
select ANS in "SSH" "SFTP"
do
  if [ -z "${ANS}" ]; then
    continue
  else
    break
  fi
done
echo

CMD=""
case "${REPLY}" in
  "1" ) CMD="ssh -oStrictHostKeyChecking=no -oPort=${PORT}" ;;
  "2" ) CMD="sftp -oStrictHostKeyChecking=no -oPort=${PORT}" ;;
esac
if [ -n "${FILE}" ]; then
  CMD+=" -oIdentityFile=\"${FILE}\""
fi
CMD+=" ${USER}@${HOST}"

# Linuxコマンド【 sftp 】安全なファイル転送 - Linux入門 - Webkaru
# https://webkaru.net/linux/sftp-command/

# シェル以外からexpectしててハマったメモ - blog::wnotes.net
# https://blog.wnotes.net/posts/expect-other-programs/

expect -c "
set timeout 5
spawn env LANG=C ${CMD}
expect -re \"Enter passphrase for key\" {
  send \"${PSWD}\r\"
} expect -re \".* password:\" {
  send \"${PSWD}\r\"
}
interact
"
```

# ３．設定

2. .bash_profile

```sh:.bash_profile
alias sshconnect='〜〜〜/SshConnect.command'
```

# ９９．ハマりポイント

* シェルでの文字列の扱いでちょっと困ったぐらいかな。

# ＸＸ．まとめ

これで、コマンド打てばシェルに登録されているホストへ、SSH も SFTP のどちらでも接続できる様になりました。

セキュリティ的に不安があれば、以下のコマンドを利用してキーチェーンからパスワードを取得するのもいいんじゃないかと思います。

* [ついついソースにパスワード書いちゃいのでKeyChainsをsecurityコマンドで使う \- それマグで！](https://takuya-1st.hatenablog.jp/entry/2014/07/05/202343)

良かったら使ってみて下さい。

それでは♪
Vuetify 1.x to 2.0 ココだけ直せばとりあえずは動く

[jsdelivr](https://cdn.jsdelivr.net) から`vuetify@latest`をロードしている自前のWebページが、今朝見たら全滅ではないですか。

何事かと思ったら [Vuetify 2.0](https://vuetifyjs.com) がリリースされていたんですね。

# ココだけ直せばとりあえずは動く
## Vuetifyインスタンス
```javascript:1.x
Vue.use(Vuetify);
new Vue({
    ...
});
```
```javascript:2.0
new Vue({
    vuetify: new Vuetify(),
    ...
});
```
これが一番大きな変更じゃないかなぁ。

Vuetifyを適用させる場合、1.xでは`Vue.use()`グローバルメソッドで`Vuetify`オブジェクトを展開していました。

2.0からは`new Vue()`コンストラクタのオプション`vuetify`プロパティに`new Vuetify()`コンストラクタでインスタンスを代入するよう変更されました。

## v-toolbar
```html:1.x
<v-toolbar app>
    <v-toolbar-title>たいとる</v-toolbar-title>
</v-toolbar>
```
```html:2.0
<v-app-bar app>
    <v-toolbar-title>たいとる</v-toolbar-title>
</v-app-bar>
```
今まで`<v-toolbar app>`としてきたアプリケーションバーは廃止されました。
2.0からは`<v-app-bar app>`とする事で動くようになります。

ちなみに`<v-toolbar>`自体は廃止された訳ではなく、コンテンツ内のツールバーは従来通りこちらを使います。

なお、バー内の部品に関してはどちらも共通で、引き続き`<v-toolbar-title>`や`<v-toolbar-items>`などを使います。


## v-btn
```html:1.x
<v-btn flat>ぼたん</v-btn>
```
```html:2.0
<v-btn text>ぼたん</v-btn>
```
フラットスタイルを適用させる際の`<v-btn flat>`は廃止され、`<v-btn text>`となりました。

なお`<v-btn>`以外の部品をフラット化させるのには従来通り`flat`属性を使用するので、一括置換でうっかり変えてしまわないように。


## v-menu
```html:1.x
<v-menu>
    <v-btn slot="activator">ぼたん</v-btn>
    <v-card>おーぷん</v-card>
</v-menu>
```
```html:2.0
<v-menu>
    <template #activator="activator">
        <v-btn v-on="activator.on">ぼたん</v-btn>
    </template>
    <v-card>おーぷん</v-card>
</v-menu>
```
`<v-btn>`から`slot`属性が削除されたことにより、`<template>`タグでラップし`activator`を明示的にバインドさせる事が必要になりました。

## v-list
```html:1.x
<v-list>
    <v-list-tile>
        <v-list-tile-content>
            <v-list-tile-title>たいとる</v-list-tile-title>
            <v-list-tile-subtitle>さぶたいとる</v-list-tile-subtitle>
        </v-list-tile-content>
    </v-list-tile>
</v-list>
```
```html:2.0
<v-list>
    <v-list-item>
        <v-list-item-content>
            <v-list-item-title>たいとる</v-list-item-title>
            <v-list-item-subtitle>さぶたいとる</v-list-item-subtitle>
        </v-list-item-content>
    </v-list-item>
</v-list>
```
リスト内の欄を構成する`<v-list-tile-***>`系は全部`<v-list-item-***>`へ変更されました。

ただし、構文が変わっただけで内容はほとんど変わっていません。


## iconfont
```html:1.x
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Material+Icons">
```
```html:2.0
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css">
```
デフォルトのアイコンフォントがGoogleの物からMDIの物に変更されています。
これに伴い`<v-icon>`で指定していたアイコン名について`mdi-`プレフィクスが必要なケースが発生します。

```html:例1.x
<v-icon>home</v-icon>
```
```html:例2.0
<v-icon>mdi-home</v-icon>
```


# 備考
2019/07/26時点で、自プロジェクトの修正をしてて気付いた所はこの辺ですが、他にも見つけたら追記します。
SFDC：String.isEmptyとString.isBlankの違い

https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_methods_system_string.htm

isBlank(inputString)
指定した string が空白、空 ('')、または null の場合は true、それ以外の場合は false を返します。
isEmpty(inputString)
指定した string が空 ('') または null の場合は true、それ以外の場合は false を返します。

Open Execute Anonymous Windowで検証しました。

String key = null; // null
System.debug('isEmpty(null) = ' + String.isEmpty(key));  
System.debug('isBlank(null) = ' + String.isBlank(key)); 

key = ''; // 空 
System.debug('isEmpty(空) = ' + String.isEmpty(key));  
System.debug('isBlank(空) = ' + String.isBlank(key)); 

key = ' '; // 半角空白 
System.debug('isEmpty(半角空白) = ' + String.isEmpty(key));  
System.debug('isBlank(半角空白) = ' + String.isBlank(key)); 

key = '　'; // 全角空白 
System.debug('isEmpty(全角空白) = ' + String.isEmpty(key));  
System.debug('isBlank(全角空白) = ' + String.isBlank(key));

key = '　 '; // 半角全角混在空白 
System.debug('isEmpty(半角全角混在空白) = ' + String.isEmpty(key));  
System.debug('isBlank(半角全角混在空白) = ' + String.isBlank(key));

<img width="335" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469887/428dd2e1-79ea-d24f-6110-5e406ae8b5a6.png">
SDN(色々試してみた)（編集中）

# SDN(Software Defined Network)
SDNは多岐にわたるソリューションだが、今回はベンダーロックインされない。OSSで手軽に検証できるものを紹介しよう。
発端は、HCIで利用するためのSDNを色々試しているうちにちょっと詳しくなってしまったので、備忘録として残しておこうと思った。
有名どころで言えば、OpenFlowやNSXだろう。これらのソリューションは確かに有能だがCloud全盛期の時代にはあまり向かないソリューションではないだろうか。もっと手軽に試せて、かつCloudに類似した環境を作るのに良いものとして以下のものを紹介しよう。

* Calico
* bird
* quagga
* VyOS

# 背景
HCIと組み合わせて、利用可能なお手軽SDNはないものかと探す日々。Kubernetesで完結できればいいなと思いつつ、Calicoから調べ始める。当然、KubernetesのフロントのNetworkはKubernetes外なので何かしらなNetworkが必要になる。最初はLBだけあれば別にIngressに渡せばいいだけと思っていたが、MetalLBなるものに出会い。Cloudで利用するようなService Type Load Blancerにしたいという思いから、深みにはまっていってしまった。MetalLBについて、IPVS Mode出現で色々事情が変わってしまったが、Balancingを最適にするためにECMP Baseで考えていたのBGPが利用可能なSDNを色々試すことになってしまった。どの道、拡張性、可用性を兼ね備えたiBGPを考えていたので、気軽に考えていたのだが、、、甘かった。

## Calico
https://docs.projectcalico.org/v3.8/introduction/
Kubernetes Backend Networkとしてよく利用されるCalico中身はbirdでKubernetesなどでAPI連携できるIFを持たせたもの。試したことはないけどOpenStack等でも使えるらしい。BGPを利用してここの通信制御を行なっているらしい。
開発が活発で記事掲載時点でVersion 3.8が最新
基本Kubernetes上で動かすので独立したものを検証する意味はなかった。BackendがbirdなのでBirdを検証すれば良いと思いつつ、Kubernetes内でのCalicoのカスタマイズの仕方についてはどこかで検証し記載する予定。特にMultipassがどのようにすれば実現できるのか悩み中。

##bird
https://bird.network.cz/
CalicoのBackendで利用されるSDN。軽い。JSONでConfigできる。
詳細な検証を記載予定。


## quagga
https://www.quagga.net/
古き良きSDN。CiscoやJuniperライクに作られているのでNetwork出身の方には使いやすい。
詳細な検証を記載予定。

## VyOS
https://vyos.io/
quaggaの派生、どうやらECMPのマルチパスができるらしい。上記のものはできなかったので検証中。
詳細な検証を記載予定。
JuliaでAtCoderのpractice contestをやってみた（１）

# はじめに
`Julia`言語の練習をしているのですが，`AtCoder`のbeginnerあたりならば手頃なのかなと思って，やってみました。こういうのって，コードを載せていいのかどうかわからないので，問題があればご連絡ください。

`AtCoder`

# 使用環境
`Julia`は`Jupyter Notebook`で使っています。バージョンは`1.1.1`です。

`AtCoder`の方の`Julia`のバージョンは`0.5.0`なので，若干違うのかな。。。とも思いましたが，とりあえずやってみることにしました。

PCはあまり関係ないかもしれませんが，`MacBook Pro`です。

# practice contest

`AtCoder`のpractice contestです。

https://atcoder.jp/contests/practice

## A - Welcome to AtCoder

最初の問題です。

後半に，他の言語はサンプルプログラムが載っています。残念ながら`Julia`はありません。。。

<img width="1170" alt="スクリーンショット 2019-07-26 11.36.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426542/0aa3e02b-3068-7e68-3cd3-ae5f36e2429e.png">

とりあえず，何をみながらやるかということで，

Juliaをはじめる
https://hshindo.github.io/julia-doc-ja-v0.6/manual/getting-started.html
をみながらやってみました。

入出力など参考にしました。 
- https://goropikari.hatenablog.com/entry/julia_input_keyboard
- https://myenigma.hatenablog.com/entry/2018/05/21/075654


``` Julia:A-WelcometoAtCoder
a=parse(Int,readline())
x=split(readline())
s=readline()
b=parse(Int,x[1])
c=parse(Int,x[2])
print(a+b+c," ",s)
```
最初，`print(a+b+c," ",s)`を`println(a+b+c," ",s)`としていてエラーになっていました。

なんでかわからず，ちょっと悩みました。

まあ，とりあえず，うまくいったのですが，次のB - Interactive Sortingでむっちゃ悩むことになります。。。。（続く）
Visual Studio Codeでコメント文を削除してかつ空白行を詰める

RailsでGemfileのコメントを消したい時など用の自分用メモ

1. VSCodeに`Remove Comments`をインストール

2. Command + Pでコマンドパレットを開き`> Remove All Comments`を選択

3. 正規表現で`^\n`を置換文字列を空白にして置換

ただし、
```git_source(:github) { |repo| "https://github.com/#{repo}.git" }```
のような記述があった場合、`#`の後の部分もコメントと認識して削除されてしまうので、使うのはかなり限定的な場面のみになる。

もっと良い方法絶対いっぱいある。
CloudWatch Container Insights Preview を本番に導入してみた

streampack の Tana です。

今日のネタは ECS Container メトリックスモニタリングについてです。
ちょっと前までのECSのメトリックスでは、

* CPU Utilization
* Memory Utilization

のみしか取得できませんでしたが、つい先日Preview版が発表され
より詳細なメトリックスが取得できるようになりました。

https://aws.amazon.com/about-aws/whats-new/2019/07/introducing-container-insights-for-ecs-and-aws-fargate-in-preview/

## 何が取得できて便利なの？

実際に取得できるメトリックス情報をみていきましょう。

CloudWatch の画面へ遷移し、
トップに表示されている CloudWatch: Overview のプルダウンから
Container Insights を選択すると下記のような情報が表示されます。

**Service情報**
![insights-service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/745179ea-821f-4289-f860-84cbe1550698.png)

Number of Pending Task や Number of Desired Task から何かしらの理由で
アプリケーションが落ちたり、立ち上がらなかったことがグラフから読み取れそうです。

**Task情報**
![insights-tasks.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/d30dc533-35c5-9d58-3a70-4f80530d38af.png)

タスクごとの平均メモリ使用率を参考にし、タスク毎のメモリ割り当ての検討材料になりそうです。


## どうやって設定するの？

クラスター作成時に Enable にするだけです。

![スクリーンショット 2019-07-25 17.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/91a03f0e-edb1-3281-b042-755b55806398.png)

既に動いている場合は、適用できないようなので、
もし適用したい場合は新規クラスターが必要です。

設定されたら、*Default Monitoring* ではなく *Container Insights* と表示されます。

![ecs-insights-check.p![uploading-0]()
ng](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232803/bc7236e7-85b7-5774-ecd3-067ac1a54fbc.png)

## 結論

既存クラスターに適用できない点は不便に感じましたが、
新規にクラスター作って、ALBに新旧クラスターにぶら下げて、
古いクラスターを削除すれば、サービスダウンなく移行は簡単でした。
今後はより詳細な情報が取得でき、より便利な方向になっていくと思われますので、
今後のアップデートに期待です。
labelIimgをmacに導入する

MacOS Mojaveで自作アノテーションデータセットを作成する際に，利用できるLabelIｍｇを導入したので手順を記す．

利用目的：YoLov3やSSDの学習において自作のデータセットで学習をさせようと考えたため．

参考文献は下に記述しています．ありがとうございます．

各バージョン
Mac 10.14.5
Python: 3.6.8

```
$ git clone https://github.com/tzutalin/labelImg.git
$ cd labelImg
$ sudo pip3 install -r requirements/requirements-linux-python3.txt
$ pip install pyqt5
$ make qt5py3
```

## 参考文献
URL: https://demura.net/misc/14350.html
Android ContentResolver query DISTINCT

SDカード内のaudioファイルを検索する場合

```
String[] projection = {"DISTINCT " + MediaStore.Audio.Media.ARTIST};
String selection = null;
String[] selectionArgs = null;
String sortOrder = null;

ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(
                MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                projection,
                selection,
                selectionArgs,
                sortOrder);
```
TypeScript: readonlyなプロパティはObject.assignで無理やり変更できる

TypeScriptでは、`readonly`修飾子をつけたオブジェクトプロパティを変更することができない。

例えば、次の例のように`readonly bar`で型アノテーションされた場合、`bar`に値を代入しようとするとコンパイル時のチェックでエラーになる。

```ts
const foo: { readonly bar: number } = { bar: 1 };
foo.bar = 2; // Cannot assign to 'bar' because it is a read-only property.
```

しかし、`Object.assign`を使うとこのコンパイル時のチェックを回避することができる。

```ts
const foo: { readonly bar: number } = { bar: 1 };
Object.assign(foo, { bar: 2 });
console.log(foo); //=> {bar: 2}
```

TypeScriptのコンパイラ(v3.5)が、現状では`Object.assign`までチェックしていないためだと思われる。これがわざとなのか、ただ未対応なのかは深く追ってないので分からない。

## 型のチェックも回避できる

ちなみに、`Object.assign`を使うと互換しない型も代入することができる。

```ts
const foo: { readonly bar: number } = { bar: 1 };
Object.assign(foo, { bar: 'hello' });
console.log(foo); //=> {bar: "hello"}
```

`readonly`をやぶるだけでなく、型も変えられるので、用法用量には注意しよう。

## どういうときに使う？

`Object.assign`を濫用すると、型安全が脅かされるため、基本的に避けたほうがいいが、場合によっては安全性を高めるために使える場面がある。

たとえば、フレームワークを作るときなんかが考えられる。

typeormの例を見てみよう。TypeScript製のORマッパーだ。typeormの`Connection`クラスには、DBに接続済みかのフラグ`isConnected`プロパティがある。これは`readonly`で宣言されている。typeormのユーザは書き換えることができない。ユーザがうっかり値を上書きするような事故が防げ、安全性が高くなっている。

```ts
/**
 * Connection is a single database ORM connection to a specific database.
 */
export class Connection {
    //...

    /**
     * Indicates if connection is initialized or not.
     */
    readonly isConnected: boolean;
```

しかし、typeorm自身は接続後に`isConnected`を`true`にしなければならない。そこで、内部的に`Object.assign`を使って上書きしている。

```ts
export class Connection {

    //...

    async connect(): Promise<this> {
        // ...接続する処理...

        ObjectUtils.assign(this, { isConnected: true });
```

※`ObjectUtils`はtypeorm独自実装のオブジェクトだが、やってることは`Object.assign`とほぼ同じ。
Raspberry Pi 4とNVIDIA Jetson Nano、どちらを選ぶに値する

Raspberry Foundationは、開発者に興奮しているRaspberry Pi 4をリリースしました。これは、パフォーマンスが全面的にアップグレードされただけでなく、価格も35ドルから旧バージョンと変わりません。 では、誰がこのオタクによく使われるNVIDIA Jetson Nano Developer Kitより優れているのでしょうか。

Raspberry Piには素晴らしい機能がたくさんあり、最近リリースされたRaspberry Pi 4には素晴らしいアップグレードがいくつかあります。
![raspberry-pi-4-1gb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/ee93bf7a-d286-9bde-b30e-6a4abf0cd199.jpeg)


以前のRaspberry Pi 3B+ と比較して、Raspberry Pi 4B は、次のアップグレードが含まれます。

- 高速プロセッサ：クアッドコアCortex-A72（ARM v8）64ビットSoC @ 1.5 GhzへのCPUのアップグレード。

- より多くのメモリ：LPDDR4-2400 SDRAMは1GB、2GBおよび4GB RAMモデルで利用可能です。

- デュアル4Kグラフィックスカード：2つのマイクロHDMIポート、両方ともデュアルモニタでも4Kビデオを出力できます。

- 2 USB 3および2 USB 2ポート：このバージョンには、周辺機器への高速接続用に2 USB 3ポートがあり、2 USB 2ポートもあります。

- USB-C電源：ボードの電源コネクタは、micro-USBからUSB-Cコネクタにアップグレードされています。

- I / O：40ピンGPIOコネクタ（I2C、SPI、およびUARTをサポート）。

上記は、新しいRaspberry Pi 4と古いラズベリーパイ3の主な違いです。マザーボードの古いバージョンと比較して、Raspberry Pi 4 の新しいバージョンは高い処理能力と他の利点を持っています。

NVIDIAはさまざまなIoTマザーボードをリリースしました。そのうちNVIDIA Jetson Nanoが最新のマザーボードです。 このボードは、プロトタイプを設計するときにIoTソリューションが必要とするすべての入力と接続を提供する開発キットとして機能します。

![微信图片_20190606175850.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/14462124-76f4-e168-5a92-488d91226070.jpeg)


以下は、NVIDIA Jetson Nano Developer Kitのコア構成です。

- CPU：クアッドコアARM Cortex-A57 MPCoreプロセッサ

- GPU：NVIDIA Maxwell w / 128 NVIDIA CUDAコア

- メモリ：4 GB 64ビットLPDDR 4

- グラフィックカード：HDMIおよびDisplayPort出力

- USB：4つのUSB 3ポート

- I / O：Raspberry Piと互換性のあるI2C、SPI、UART、およびGPIOコネクタ

NVIDIA Jetson Nano Developer Kitは、プロトタイプを設計するときにIoTソリューションが必要とするすべての計算能力（および統合されたGPU）を提供します。
![微信图片_20190606175908.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/878b4cd4-f63b-bd05-3063-f4239cd6ca03.jpeg)


Raspberry Pi 4とNVIDIA Jetson Nanoの主な機能はよく似ています。両者の最大の違いは、NVIDIA Jetson Nanoには高性能と強力なGPU（グラフィックプロセッサ）が含まれているのに対し、Raspberry Pi 4には低消費電力のVideoCoreマルチメディアプロセッサがあることです。 強力なMaxwell GPUを考えると、NVIDIA Jetson Nanoの価格はもっと高いですが、この部分の価格は妥当です。

Raspberry Pi 4のCortex-A72は、NVIDIA Jetson NanoのCortex-A57よりも1世代だけ先のことです。 新しいA72は、A57よりもクロック速度が速く、消費電力が20％少なく、性能が90％向上しています。

一般的に、あなたのニーズに最も合うマザーボードを選ぶとき、あなたはそのようなハードウェア仕様と価格のような基本的な要因を参照するでしょう。 もちろん、オペレーティングシステムとソフトウェアの機能についても考慮する必要があります。 どちらのマザーボードもLinuxを実行しており、ほぼ同じ機能を提供します。 すべての比較要素が近い場合は、次に検討する必要があるのは、ボードのプログラミングとSDKのサポートです。

2つのマザーボードのどちらが好きですか。

次回のGoogle Edge TPUの紹介,開発ボードとUSBアクセラレータ,お楽しみに。

![微信图片_20190624110650.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/ec1997ff-f3b8-d190-aa3b-daaba7f6d9cc.jpeg)

ちなみに，日本でも購入できます。（海外の代理店から購入しました-Gravitylink：https://store.gravitylink.com）
【Laravel】ユーザのオンライン状態をチェックする

ログインして操作をしているオンライン状態 :grinning: と、そうでないオフライン状態 :sleeping: を簡単に
判定できる仕組みを実装する。
WebRTCとかを使ったチャット :speech_balloon: とかと併用すると良いかもしれない。

# 1.新しいプロジェクトを作る
作り方は[ここら辺](https://qiita.com/nekyo/items/523d798652b26af9460d)を参照。以下のコマンドまでは終わらせておく。

```
php artisan migrate
```

# 2.ミドルウェアを作る。 
このコマンドで LastUserActivity というミドルウェアを作る。

```
php artisan make:middleware LastUserActivity
```
ユーザがオンラインかを判断するコードを加える。

App\Http\Middleware\LastUserActivity .php

```
<?php

namespace App\Http\Middleware;

use Closure;
use Auth;
use Cache;
use Carbon\Carbon;
class LastUserActivity
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check()) {
            $expiresAt = Carbon::now()->addMinutes(1);
            Cache::put('user-is-online-' . Auth::user()->id, true, $expiresAt);
        }
        return $next($request);
    }
}
```
# 3.カーネルにクラスを追加する
カーネルファイルの middlewareGroups にクラスを追加する。
\App\Http\Middleware\LastUserActivity::class,

```
protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,

+             \App\Http\Middleware\LastUserActivity::class,
        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];
``` 
# 4.ユーザモデルに関数を追加する。
```
use Cache;
   :

public function isOnline()
{
    return Cache::has('user-is-online-' . $this->id);
}
```
# 5.ララベルアプリケーションでユーザがオンラインかオフラインかをチェックする。

```
@if($user->isOnline())
    user is online!!
@endif
```

仕組みとしては、

- ミドルウェアを通るとキャッシュが更新される。
- キャッシュがあるうちはオンラインとして判断する。
- サンプルは１分を目安に設定しているので、１分以上操作がないとオフラインになる。

# キャッシュを使ったステータス管理は他にも応用できそう。
有効期限のチェックとかをする場合、

- 方法１  
テーブルに有効期限フィールドを追加して、書き込み、読み込み、判定、更新しても良いけれど・・・
- 方法２  
有効期限までのキャッシュを書き込み、それの有無を判断すれば、  
フィールド追加も要らないし、CRUDは書かなくて済むし、  
キャッシュは勝手にキャッシュコントローラーが消してくれるので、スッキリしそう。


参考：[How to Check User online or not in Laravel](
https://www.codermen.com/blog/94/how-to-check-user-online-or-not-in-laravel)
PHPStormをアップデートしたらUndefined class XXXになって別クラスにジャンプできなくなった

# 現状
PHPStormをアップデートしたら、全部のクラスがUndefined class XXXになって別クラスにジャンプできなくなりました。
PHPStrom 2018.1.Xから2019.1.28? (ここからさらにアップデートしてしまったため詳しいバージョンは失念🙏)

<img width="724" alt="スクリーンショット 2019-07-26 11.14.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/1780e113-423e-c095-0655-5e7539e9b603.png">


# 対処方法

具体的な原因はわかりませんが、以下の手順で解決できました。

再起動しても治らなかったので、 `File->Invalidate Caches / Restart...`を開き
![スクリーンショット 2019-07-26 11.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/62473dba-bb93-dbe3-17b4-7d6ae0321477.png)

`Invalidate and Restart...`を実行してみたら治りました。
![スクリーンショット 2019-07-26 11.15.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/da46b9e1-6165-c17c-86e7-7e03f83ac7fa.png)

この操作をすると、PHPStromの再起動後にIndexが再作成されます。
10分くらいすると、Index作成が完了し、ナビゲーション機能（ジャンプ機能）が有効になりました。

# 参考

https://qiita.com/taikai_m/items/549b3bded2d961f93cd7
Pythonの多次元Dictionary(辞書型）のキー、値の検索・存在確認

Alexaスキルを作っていると、多次元の辞書型を扱うことが多いのですが、

キーの存在確認をする際に、2次元以上、多次元のケースは扱っている文献が見つからなかったので、メモ程度ですが残しておきます。

辞書型の文法については、巷のページで十分カバーされていますので、省略します。


``` Python:dict.py
#辞書型の宣言
dict = { 'key1' : 'value1' , 'key2' : 'value2' }
dict['key1'] = { 'key1_1' : 'value1_1' , 'key2_1' : 'value2_1' }

'''
#構成はこんな感じ
dict{
    'key1': {
        'key1_1' : 'value1_1',
        'key2_1' : 'value2_1'
    },
    'key2':'value2'
}
'''
print( 'key1_1' in dict )
#2次元目にあるキーは見つからない (False)

print( 'key1_1' in dict['key1'] )
#これで見つかる(True)

dict_key1 = dict['key1']
#2次元目を切り出しても良い
print( 'key1_1' in dict_key1 )
#これでも見つかる(True)

print( 'value2_1' in dict_key1.values() )
#Valueも同じく見つかる(True)

print( 'key2' in dict_key1 )
#当然ながら1次元目のキーは見つからない(False)

```
Access SQL 追加と更新を1回でやる UPDATE RIGHT JOIN

今までは、INSERT　と　UPDATEで2回SQLを実行していました。

```
'Partsへ更新　品番一致 受入データからの新規品番
    'strSQL = "UPDATE t_complete INNER JOIN MT_Parts ON t_complete.hinban = MT_Parts.部品名称 SET MT_Parts.最小梱包単位 = [t_complete].[suryo];"
    'db.Execute strSQL
    
    '梱包単位からMT_PartsへUPDATE
    'strSQL = "UPDATE MT_Konpo INNER JOIN MT_Parts ON MT_Konpo.[05_品番] = MT_Parts.部品名称 SET MT_Parts.最小梱包単位 = [MT_Konpo].[梱包単位];"
    'db.Execute strSQL
```


　　　　　　　　　　　　　　　　　　　　↓


```
'更新と追加を１回でやる
    strSQL = "UPDATE MT_Parts AS T1 "
    strSQL = strSQL & "RIGHT JOIN tmp_Parts AS T2 ON T1.部品名称 = T2.部品名称 "
    strSQL = strSQL & "SET T1.[部品名称] = T2.部品名称, T1.[ﾗｲﾌﾞﾗﾘ] = T2.[ﾗｲﾌﾞﾗﾘ] , "
    strSQL = strSQL & "T1.[部品説明] = T2.部品説明 , T1.[形状ｺｰﾄﾞ] = T2.形状ｺｰﾄﾞ ,"
    strSQL = strSQL & " T1.[供給ｺｰﾄﾞ] = T2.供給ｺｰﾄﾞ ,  T1.[最小梱包単位] = T2.最小梱包単位 "
    strSQL = strSQL & " WHERE T1.[最小梱包単位] Is Null ;"
```

こりゃラクだわ

MySQLとかPostgresのSQLとは書き方が違うから大変。。。
C#を使う人はLINQを覚えるべき

##はじめに
LINQとは、「Language INtegrated Query」の略で、C#やVB.netで、SQLのようなクエリ構文を記述する事で、複雑なデータ操作を簡単に実現できる構文とライブラリのセットの事です。
個人的にはLINQがあるからC#以外の言語に移行できないと考えるほど便利な機能だと思います。
しかし今までのC#開発プロジェクトではLINQが浸透しておらず、すごく勿体ないと感じています。
今回は簡単な例を使用してLINQの便利な一面を紹介します。

##何が便利なのか？

実際に使用している例を見たほうが早いと思います。
**パス「C:\temp」の子フォルダの中のファイルのうち、拡張子「txt」と「log」ものを全て列挙する**

###LINQを使用しないパターン

```
//判別したい拡張子
var extensions = new[] { ".txt", ".log" };
var files = new List<string>();
//ディレクトリ取得
foreach (var directory in Directory.GetDirectories(@"C:\temp"))
{
    //ディレクトリ内のファイルを取得
    foreach (var file in Directory.GetFiles(directory))
    {
        //拡張子で判別してファイル名追加
        if (extensions.Contains(Path.GetExtension(file)))
            files.Add(file);
    }
}
```

まず「C:\temp」直下のフォルダ群をforeachで列挙して、そのフォルダでGetFilesしたファイルをforeachで列挙。拡張子が関係ないものif文で弾く処理になります。
foreachが入れ子になっていて、インデントが深くなるところがコードを見にくくしています。

###LINQを使ったパターン

```
//判別したい拡張子
var extensions = new[] { ".txt", ".log" };

var files = Directory.EnumerateDirectories(@"C:\temp")
                     .SelectMany(d => Directory.EnumerateFiles(d))
                     .Where(f => extensions.Contains(Path.GetExtension(f)))
                     .ToArray();
```

EnumerateFiles(Linqが使えるディレクトリ取得関数)で「C:\temp」内のディレクトリを取得します。
SelectManyで入れ子になったディレクトリ内のファイルをEnumerateFilesで取得します。
Whereで拡張子を判別して、最後に配列化します。
foreachを使う例に比べると、かなりあっさりした感じの実装になります。行数で言えば2行になります。

####どこが便利なのか？
上記2パターンを比べてもピンとこない人がいると思います。

 - インデントが深くなるくらい大したことはない
 - コメントを入れるスペースがなくなった
 - そもそもforeachの方が馴染みがあるから見やすい

今までにLINQの説明をして返ってきた内容です。
####インデントが深くなるくらい大したことはない
インデント・入れ子の構造・行数は少なければいいということは無いと思いますが、多すぎると途端に読みにくいコードになってしまいます。
上記例では簡潔な内容ですが、フォルダ名の判別やファイルの属性の判別を追加すると、foreachの例ではさらにインデントが深くなってしまいます。
LINQの例ではメソッドチェーンで構成されているため変更・追加に対して簡単に実装が可能で、基本的にはインデント・行数ともに変化はありません。

####コメントを入れるスペースがなくなった
これはその通りかもしれません。
しかし、LINQ では処理の内容ごとに決まったメソッドが用意されているので、書いたコードが何をやっているのかが明確になります。
そのため、foreachでは処理に目的性が少ないためコメントが必要でしたが、LINQではコードで目的が分かるためコメント量が少なくて済むという考えができるかもしれません。

####そもそもforeachの方が馴染みがあるから見やすい
この考えがあるとなかなか新しいことに挑戦できなくなってしまいます。
効率的な書き方や新機能などを取り入れて、良いコードとは何かということを考えながら開発をしていきたいです。

##便利に思えましたか？
LINQは最初の印象で敬遠される人が多く、とてもとっつきにくい印象のある機能かもしれません。
処理の考え方も従来のfor文で回して考えるのではなく、集合で捉えると分かりやすいかもしれません。
また、SQLが得意な人でもコードに落とす段階になるとSQL的な考えをせずにロジックで考えてしまったり、意識的に考えを変える必要があります。

一度でも使って覚えてしまえばコーディング効率は飛躍的に上がると思うので、まだ使ったことが無いという人は是非使ってみてください。


##LINQで使用できる演算子

- フィルタ Where
- 射影（別のクラスに入れ替えたりする） Select, SelectMany
- ソート OrderBy, OrderByDescending, ThenBy, ThenByDescending
- 結合 Join, GroupBy, GroupJoin, Concat, Union, Zip
- 集合演算 Intersect, Subtract, Exclude, Distinct
- 判定 Count, Any, All
- 切り出し First, FirstOrDefault, Last, LastOrDefault, Single, ElementAt, Take, Skip
- 固定化 ToList, ToDictionary
- 演算 Aggregate, Sum, Average, Max, Min


##説明が出来なかった内容

- リンクの歴史
- 遅延評価
- LINQに使われている機能
 - 型推論」「匿名クラス」「ラムダ式」

---

- [kekyoの丼](https://www.kekyo.net/linq)
- [はじめての LINQ](https://qiita.com/nskydiving/items/c9c47c1e48ea365f8995)
- [LINQ好きはLINQを書く時にどう考えているのか？](https://qiita.com/koba-a-koba/items/57639feadb54139f6cb9)
Access の VBA で複数行をコメントアウト　「表示 > ツールバー > 編集」



なんでデフォルトで表示していないのか？

![vba_toolbar.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208182/ab43a829-202a-8b43-c334-b7109363b261.png)
STM32CubeIDEで学ぶFreeRTOS (番外編) - Linuxコマンドライン開発をあえてやる

[ここまでの記事](https://qiita.com/imagou)では、IDEをWindowsにインストールして遊んでいました。

しかし実際の開発現場では、Linuxコマンドラインでの開発が多いかなと思います。
ということで今回は以下を紹介します。

* Ubuntu 16.04を使用
* 最初だけIDEを使う
* **（あえて）**ビルドはコマンドラインでやる
* **（あえて）**F/W書き込みもコマンドラインでやる

実際のところ
**IDE立ち上げてどうのこうのは、デバッグ時以外はやらない**
と思うので、理に適っているかと。。。

# 本編

## 1. 準備

まず、Ubuntuはご用意ください。笑

### 1-1. STM32CubeIDEのインストール

以下からどうぞ。

**STM32CubeIDE - Integrated Development Environment for STM32 - STMicroelectronics**
https://www.st.com/ja/development-tools/stm32cubeide.html

**STM32CubeIDE installation guide - User manual**
https://www.st.com/content/ccc/resource/technical/document/user_manual/group1/31/8b/03/27/25/c5/4d/ae/DM00603964/files/DM00603964.pdf/jcr:content/translations/en.DM00603964.pdf

### 1-2. GCC ARM Toolchain / ST-Link

@fireflower0 様の記事を参考にさせていただきました。感謝。
https://qiita.com/fireflower0/items/ce6695e4f0911d3165d7

### 1-3. プロジェクト設定とか

[前回記事](https://qiita.com/imagou/items/ffdd774145610059af8e)までの仕込みは済んでいるものとします。
（ビルドが通らないとか、まともに動かんとかのトラブル発生時に、改めて見返すことでもOKかと）

## 2. やってみよう！

### 2-1. 仕様

仕様というより要件ですが。

1. UARTでコマンドを受ける。デリミタは改行。
2. "hello"コマンドで"world"を返す。
3. 数値が入力されたら、その値でLEDのトグル時間を更新する。 

### 2-2. 最初はIDEで開発

#### 2-2-1. 実装

今回も[user.c](https://github.com/imagou/QiitaSource/blob/master/user.c)を用意してあります。楽ですね。笑

使用上の注意は以下です。

- myTask03をCode Generation - As Weakで追加する必要あり
- （当然ですが）user.cをコピペなりダウンロードなりでIDEに取り込む

#### 2-2-2. ビルド・動作確認

STM32CubeIDEでビルドが通ること、LEDが点滅することを確認してください。
基本的にはWindows版と同じです。[こちらの記事](https://qiita.com/imagou/items/8af2ad999b2a80009c6f)参照。

### 2-3. 以降はコマンドラインで開発

いよいよ本題です！

#### 2-3-1. ビルド

これも最初から書くのは面倒くさかろう。という親心から、スクリプト[clean_build_bin.sh](https://github.com/imagou/QiitaSource/blob/master/clean_build_bin.sh)を用意しました。
（中身はクリーンビルドし、ビルドバイナリを作成するだけ）

実行例は以下：

```console
$ ./clean_build_bin.sh ~/workspace/STM32CubeIDE/TestRTOS/ Debug
```

#### 2-3-2. 書き込み

以下を入力するだけであっさり焼けます：

```console
$ st-flash write 190726_TestRTOS.bin 0x08000000
```

### 2-4. 改めて動作確認

以下が確認できるかと思います。

* "hello"コマンドで"world"が返る
* 数値入力でLED点滅間隔が変わる

私はWindows / Tera Termを使いました・・・慣れているので。

## 3. かんたんな解説

今回は特にありません（雑）。

# おわりに

何かとCUI開発は喜ばれることが多いと思います。

しかしながら、**IDEを使わないと超絶面倒くさい**のは間違いないので、うまく組み合わせながら進めていきたいですね。


# 参考

## 環境

- IDE: [STM32CubeIDE](https://www.st.com/ja/development-tools/stm32cubeide.html)
- 評価用ボード: [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) - 型番はB-L475E-IOT01A
PHPStormのメジャーアップデートPhpStorm 2019.2が来た

詳しいアップデートの内容はこちらにあります https://www.jetbrains.com/phpstorm/whatsnew/

# 概要

JetBrainsからのメールによると以下の機能が推しのようなので、それらについて軽くメモっておきます。

- PHP 7.4の型付きプロパティのサポート。
- 正規表現ハイライトと確認。
- オンザフライでの重複検索。
- 20言語以上のシンタックスハイライト。
- すぐに使えるEditorConfigとシェルスクリプトのサポート。

# PHP 7.4の型付きプロパティのサポート。
PHP7.4から入ったType Propertyがサポートされています。プロパティの型定義に合わない値を代入するとエラー表示されます。自社ではElasticBeanstalkを使っているという制約があってPHPのバージョンがまだ7.2なのですが、Typed Property早く使いたい。

![PHP 7.4の型付きプロパティのサポート](https://www.jetbrains.com/phpstorm/whatsnew/img/2019.2/typed-properties-inspection.png)

# 正規表現ハイライトと確認。
正規表現の実行結果をPHPStorm上で試せるようになります。めちゃ便利。
![正規表現ハイライトと確認。](https://www.jetbrains.com/phpstorm/whatsnew/img/2019.2/regexp_check.png)


# オンザフライでの重複検索。
プロジェクト内で重複するコードがあると教えてくれるようになります。コピペコードが見つかってしまう…。怖いw
![オンザフライでの重複検索。](https://www.jetbrains.com/phpstorm/whatsnew/img/2019.2/duplicate_on-fly_actions.gif)


# 20言語以上のシンタックスハイライト。
Ruby、Python、Goなどを含む20以上の異なるプログラミング言語のシンタックスハイライトが使えるとのこと。
メインでPHP書いているけど、他にも色々書いているという時に便利かも？

# すぐに使えるEditorConfig
EditorConfigがプラグインを入れなくても使えるようになったのかな？
https://qiita.com/naru0504/items/82f09881abaf3f4dc171 こちらの記事にあるようにプラグイン入れれば前から使えたはず。

![すぐに使えるEditorConfig](https://www.jetbrains.com/phpstorm/whatsnew/img/2019.2/editorconfig_cut.gif)

# その他にもたくさんアップデートがある
その他にも、たくさんアップデートがあったようです。

個人的に嬉しいのは

- 1行の配列を複数行に変換
- switch文をよりかんたんに書ける

あたりの地味に便利そうなやつです。

Docker、Database、HTTP Client、VSC辺りのサブのツールも機能追加されているようですが、そこら変は個人的には全然使っていないので…。

更に詳しくはこちらを御覧ください。https://www.jetbrains.com/phpstorm/whatsnew/
【JavaScript】bindと部分適用について学ぶ


最近わからないことが芋づる状に出てきました。
カリー化？→部分適用？→バインド..?
一個一個勉強するしかないです、急がば回れです。

`this`に関する振る舞いはわかる前提で進みます。
この辺がthisの参考にいいかも。
https://qiita.com/takeharu/items/9935ce476a17d6258e27

##bindって？

参考サイト：https://techacademy.jp/magazine/14652
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
`bind`・・・thisや引数を指定することができる。

？

```:bind構文
function.bind(thsiArg[,arg1[arg2[, ...]]]
```
`thisArg`・・・ターゲット関数にthis引数として渡される値。
`arg`・・・ターゲット関数を呼び出すとき、バインドされた関数に与えられる引数の前に付けてターゲット関数に渡す引数。

ぼんやりとしかわからんです。実例をみてみましょう。


```javascript
function greeting(){      //上で言うところのターゲット関数
   console.log(this + 'world');
}
var hello = greeting.bind('hello ');    //上で言うところのバインドされた関数
hello();
```

結果は`hello world`です。

greetingの`this`を華麗に`hello `に変えています。

```javascript
function sum(x, y, z){
 return x + y + z;
}
var test = sum.bind(null, 10, 20, 30);
console.log(test());
```

`this`に何も渡さないときは`null`を渡します。
x=10,y=20,z=30にバインドしているので、結果は**60**になります。

上の例のhelloもtestも関数として実行されているので、
`bind`は戻り値として新しい関数を生み出しているようですね。

##bind利用の行先

・thisを束縛できる！
これについては今回知りたいことじゃないのですっ飛ばします。
https://www.deep-rain.com/programming/javascript/807
この辺がわかりやすかった。

・部分適用が簡単にかける！
https://qiita.com/hosomichi/items/e11ad0c4ea79db2dee84
https://ja.javascript.info/currying-partials

まずは**部分適用**が何かを知らないといけないです。

```javascript:部分適用
function greeting(x,y){
    if(typeof y === 'undefined'){
        return function(y){
            return console.log(x+y);
        };
    }
}

let test = greeting('こんにちは');
test('太郎');
```

結果は`こんにちは太郎`です。
yに指定がなかった場合、という書き方でxだけを先に代入することができています。
このように、部分的に引数を定義することを部分適用と言うみたいです。

そして`bind`版がこちら。

```javascript:bindの部分適用例javascript
function mul(a,b){
    return a * b;
}
let double = mul.bind(null,2);
console.log(double(3));
console.log(double(2));
```

スッキリして超みやすい！
`bind`によってaを先に定義していますね！

次回は本題のカリー化について調べたいと思います。
Nuxtの環境準備

技術的にハマったり新しいことにチャレンジしたりすることは日常茶飯事ですけど、プロジェクトの立ち上げだけはその時にしかしないからなかなか覚えられないです。

# パッケージで導入
yarnを使います。
yarnはnpmからインストールできます。

```bash
$ npm install yarn
$ yarn create nuxt-app
```

色々聞かれますが、Enter連打で問題ないです。
初期設定をやってくれているだけで後から変更効きます。
でも使いたいモジュールとかが決まってるなら、ここで選択しておいた方が楽です。

* ? Project name
* ? Project description
* ? Author name
* ? Choose the package manager

    npm / yarn

* ? Choose UI framework

    * None
    * Bootstrap
    * Vuetify
    * Bulma
    * Tailwind
    * Element UI
    * Ant Design Vue
    * Buefy
    * iView
    * Tachyons    

* ? Choose custom server framework

    * None (Nuxt default server)
    * Express
    * Koa
    * Hapi
    * Feathers
    * Micro
    * Fastify
    * Adonis (WIP)

* ? Choose Nuxt.js modules
* ? Choose linting tools
* ? Choose test framework

    * None
    * Jest
    * AVA

* ? Choose rendering mode

    Universal(SSR) / SPA

# スクラッチで導入
なんか勝手に環境作られると気持ち悪い。
自動化を受け入れられない。
詳細が分かってないと怖くて触れない。
っていう私みたいな人は、上みたいに雛型をダウンロードするんじゃなくて、地道に自分の手でインストールすることもできます。


## 作業場所の作成
```bash
$ mkdir プロジェクトディレクトリ
$ cd プロジェクトディレクトリ
```
nuxtの起動スクリプトをpackage.jsonに記入します。
起動時の引数とかここに記述しておくと後々幸せになれます。

```json:package.json
{
  "name": "my-app",
  "scripts": {
    "dev": "nuxt"
  }
}
```

## nuxt のインストール

```shell
$ yarn add nuxt
```

## pages ディレクトリ
```bash
$ mkdir pages
```

## とりあえず起動
```bash
$ yarn dev
```
PhpStormのファイル編集中の変更をタブに表示させる設定方法

最近PhpStormを使用しているが
ファイルを編集している時に、タブに編集中か保存済みかが表示されず、
強迫観念にかられて「Command + S」（Ctrl + S）を連打するという謎対応をしていた。
だが、設定を発見したのでメモする。

## タブにファイル変更を表示させる
- 「メニュー」→「環境設定」
- 「エディター」→「一般」→「エディター・タブ」
![スクリーンショット 2019-07-26 10.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/5c4da478-a2a1-7a64-6873-1fdfc8531419.png)
- 「変更をマーク(*)」にチェックを入れる
![スクリーンショット 2019-07-26 10.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/803a0bcc-5a6b-fb8b-609b-d0ab5c394731.png)

すると、保存してないファイルはタブの部分に*が付く
![スクリーンショット 2019-07-26 10.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/6e1987ee-c7b5-22ef-2935-5782ddeb7c37.png)
が
![スクリーンショット 2019-07-26 10.30.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/91a9d0b5-50db-ec88-49f0-480f6b131aaf.png)
になる

大抵のエディタはこの形式のものが多いのでこの設定に慣れた私としては便利


## タブのファイル制限数を設定する
あと、タブを複数開いている時に
なんか勝手に閉じられるファイルがあるなーと思っていたら
同じ設定場所に「閉じるポリシー」の設定があった
![スクリーンショット 2019-07-26 10.24.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/2bb3c1ed-ba15-941d-7d05-8905cf281d33.png)

開けるタブ数の制限を定義できる
開いているタブの上限を超えたら

- 未変更を閉じる
- 未使用を閉じる
から選択できる

地味に便利
Android Pの切り欠きを検証する方法

Androidの切り欠き(ディスプレイカットアウト)を検証する方法です。

iPhoneではノッチと呼ばれているものです。

## 公式ドキュメント

https://developer.android.com/guide/topics/display-cutout

## 切り欠きの検証

切り欠き表示ではないGalaxy S9(SC-02K)で検証します。

「開発者オプション」に「ディスプレイカットアウトシミュレート」という項目があります(機種によって日本語訳は異なるかと思います)。

<img width="320" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125224/d59d72bf-24ef-adf3-b6ab-c4ce4e3e1583.jpeg">

ここを選択すれば切り欠き表示となります。

## 変更後

<img width="320" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125224/ce0b8539-06b0-d943-c9f1-23631b87cd61.jpeg">

普通のスクリーンショットでは切り欠き表示が含まれません。

### 画面隅のディスプレイカットアウト

<img width="320" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125224/640a9a8d-d6d2-789c-2502-8fb630a56418.jpeg">

### ダブルディスプレイカットアウト

<img width="320" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125224/bf1f3432-9d99-adf6-4985-b073acf7f40f.jpeg">

### 縦長のディスプレイカットアウト

<img width="320" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125224/95d58098-ff2b-8257-3cb7-c3ddf806b1a1.jpeg">
Ansible：AnsibleTowerインストール方法

## 構成
- CentOS7.6

## Towerインストールの前にAnsibleのインストール

https://qiita.com/tanaman/items/8e73dee6d25facf000c6

## Towerのインストール
+ 以下より個人情報を入力すればダウンロード可能

http://www.ansible.com/tower-trial


## ダウンロードしたファイルを展開

```shell:command
tar zxvf ansible-tower-setup-3.5.0-1.tar.gz
```
## 各種パスワードの設定
+ <ファイル展開先>/inventory を修正  

```shell:inventory 
admin_password='パスワードを設定'
pg_password='パスワードを設定'
rabbitmq_password='パスワードを設定'
```
## インストール実行
```shell:command
<ファイル展開先>/setup.sh
```
## AnsibleTowerにアクセス
+ 自動で起動しているはずなので、アクセスする。

https://インストールマシンのIPaddress
user：admin
pass：admin_password='パスワードを設定'

## ライセンスの登録
+ 初回アクセス時はライセンスの入力を求められるので、取得して設定してあげる
+ ライセンス取得URLは初回アクセス時に表示される
+ 個人情報を入れると後からメールで送付されてくる
+ けっこう時間がかかる。というか自分の場合は返信が来なかった
+ 偉い役職にして申し込むと1時間で返信が来るが、RedHatから営業の電話もかかってくる
【機械学習】社内輪講はじめました

## ミッション
- 社内の輪講で得た知見をQiitaを通じて発信
- 機械学習を学ばれる方の一助に

## 題材
- スタンフォード大学 Andrew Ng氏による機械学習の講義動画
    - https://www.coursera.org/learn/machine-learning?action=enroll

## 本記事のポイント
- 翻訳ではない
- weekごとに記事化
- 各講義の学びポイントを解説

## なぜ記事にするのか
- 身につけた知識が定着する
- 人に説明する表現力が身に付く
- ferixの広報活動

## 進め方
1. Qiitaに投稿できるような状態で輪講に挑む
2. 輪講後、輪講で出た意見や疑問も踏まえた内容を記載


------
## アジェンダ
### [【機械学習】社内輪講 Week1 〜 線形単回帰 〜](https://qiita.com/yyyokoy/items/3cd7caa3c2ee8ed74f3d)
- Introduction
- Linear Regression with One Variable
- Linear Algebra Review

### [【機械学習】社内輪講 Week2 〜線形重回帰〜](https://qiita.com/i-chida/items/c88abb4520b5e1eb6765)
- Linear Regression with Multiple Variables
- Octave/Matlab Tutorial

### [【機械学習】社内輪講 Week3 〜ロジスティック回帰・正規化〜](https://qiita.com/aoki-k/items/9c4214d6b5c955b91591)
- Logistic Regression
- Regularization

### [【機械学習】社内輪講 Week4 〜ニューラルネットワーク: 基本的な仕組み〜](https://qiita.com/yyyokoy/items/f570ae621aff645c0d6b)
- Neural Networks: Representation

### [【機械学習】 社内輪講 Week5 〜 ニューラルネットワーク: 誤差逆伝播法 〜](https://qiita.com/myjm/items/74cb498b4291c876ef4d)
- Neural Networks: Learning

### [【機械学習】社内輪講 Week6 〜モデルの評価と改善〜](https://qiita.com/i-chida/items/aaa84836e425e33d78c8)
- Advice for Applying Machine Learning
- Machine Learning System Design

### [【機械学習】社内輪講 Week7 〜サポートベクターマシン〜](https://qiita.com/aoki-k/items/ad15a38f8f3ad566192a)
- Support Vector Machines

### [【機械学習】社内輪講 Week8 〜教師なし学習: 特に固有値問題〜](https://qiita.com/yyyokoy/items/4bec0f7aa1800da9e4f8)
- Unsupervised Learning
- Dimensionality Reduction

### [【機械学習】社内輪講 Week9 〜 異常検知 〜](https://qiita.com/myjm/items/9fc666819777e716f777)
- Anomaly Detection
- Recommender Systems

### [【機械学習】社内輪講 Week10 〜大量のデータセットの扱い〜](https://qiita.com/i-chida/items/98ea71559f2f138d0cd5)
- Large Scale Machine Learning

### [【機械学習】社内輪講 Week11 〜写真OCR〜](https://qiita.com/aoki-k/items/0328ecaac77db870dc0b)
- Application Example: Photo OCR
Laravel5.4から5.8にmigrateしたときにハマったところ

# Laravel5.4から５．８にアップデートしたときにハマったところ
Laravel5.4では発生しなかった Access denied for user エラーが出た。
微妙にハマったのでメモ。

## .envに # 含まれると #以降がコメントと解釈された
.env
DB_PASSWORD=pass#word ← DB接続にpassの部分しか使われない。このため Access denied for user が発生する。

DB_PASSWORD="pass#word"
のようにダブルクォーテーションでくくらないとダメ。


## MySQL接続で環境変数が優先された
環境変数DATABASE_URLが存在すると .envの設定より優先されて 環境変数の接続が行われた。

DATABASE_URL=mysql://homestaed:mypassword@localhost/mydatabase
↑こんな環境変数があると Access denied for user や Unknown database になる。

Laravel5.4で.envのパスワードに＃があっても繋がったし、環境変数も優先されなかった。地味な問題だが発見が難しい。要注意。
業界標準ではないタイルに分割したいという問いに対するいけ好かない答え


# 問い
かなりの分量とファイル数がある地理空間情報を独自のメッシュに切り分けたい。

# 第一回答: おやめなさい
独自のメッシュに切り分けたい、というのは、顧客が本当にやりたかったことではないことが多いです。

例えば、データを処理しやすい単位に分割したいということであれば、既存のよくできたツール、例えば Tippecanoe で、現在最良の知恵が反映された方法でベクトルタイルに分割するのが正しい答えになります。

ベクトルタイルというのは、いわばジュラルミンのようなものです。そういったものが既に市場で売られているわけです。それがある中で独自のメッシュに切り分けるというのは、ジュラルミンを隣に見ながら、布張りを始めるようなものです。

例えば、そのメッシュでデータを集計したいから切り分けるのだ、という場合には、もっと良い方法があります。ベクトルタイルに切り分けた上で、集計プログラムのほうにそのお望みのメッシュを持っておいて、集計の処理を行う中でメッシュでジオメトリを切るのです。

# 第二回答: やるなら MapReduce 的に
それでもどうしてもやりたい、やらなければならないのであれば、最良の方法は MapReduce です。

幾何をシリアルに読みながら、一つの幾何をメッシュで切ります。多分、１つのままだったり、4つにわかれたり、もっと多数に分割されたりするでしょう。その分割された幾何に対して、メッシュの識別子をキーとして振るのです。これが、MapReduce の Map 処理です。

Map されたデータの列が、キーによってソートされ、同じキーに対応する幾何がまとめられます。そのまとめられた塊が、メッシュごとのデータです。それを出力すれば終了。

自分の手で出力ファイルを開けたり閉じたりすると、データ量が小さい場合にはまあそれほど問題になりませんが、データ量が多い場合にはどんどん遅くなります。

騙されたと思って、汎用の MapReduce フレームワークのシンプルなやつを使うと良いです。

## 具体的に?
私だったら、いまならが言語処理系に Node.js を選定して、幾何データの切り分けをするのに turf.js を使うと思います。BBOX をとって、かかるメッシュを算出して、それぞれのメッシュごとにその幾何を切って、メッシュ番号と幾何のペアをアウトプットする。それが Map 処理になります。

MapReduce のフレームワークは、Node.js で選んだことはありませんが、[2014年の私によると](http://hfu.hatenablog.com/entry/2014/09/24/222730)、次のいずれかを選ぶと思います。

1. UNIX の sort
2. Hadoop Streaming

# 第三回答: それ、ベクトルタイルでできるはず
第二回答のように、素直に MapReduce のコードを書き始めるのではなく、まずは Tippecanoe でベクトルタイルに変換した上で、タイルから地物を取り出してタスクを実行するという最もひねくれた方法です。

仕事の最終目的が仮に独自のメッシュに切り分けるということだった場合、それぞれのメッシュ番号ごとに、それが当たるタイルを適当な順番に取り出して、その中から地物を取り出して、メッシュ境界で切って、切れた地物を元どおりにして、出力ファイルに書き出すという方法です。

こうすると、あなたが書くコードは、タイルからファイルを書き出す部分だけになるので、MapReduce のような概念を理解する必要がありません。

# 考察
タイル分割というのは、処理の順番を間違えるとすごく時間がかかるのです。そういう面倒臭いことを全部引き受けてピカピカに磨き上げた Tippecanoe というツールがオープンソースで既に世の中にあります。車輪を再発明する必要はありません。

第二回答というのは、車輪をできるだけいい形で再発明する方法で、第三回答というのは既成の車輪を組み合わせて車輪を作る方法ですね。第三回答の方法が、もう少しよく試されるべきだと思います。

第三回答のアプローチが現実的になったのは、ogr2ogr が GeoJSONS をサポートするようになった Version 2.4.0 以降です。これから、だんだんとよくなっていくでしょう。

でも、本当に正しい回答は、第一回答である場合が多い気がします。

理屈は分かったしもういいから、君が結果をすぐに出してみろ、と言われたら、今ならどうするでしょう。多分、データが20GBを超えない程度であるのであれば、第二回答の MapReduce で、 MapReduce エンジンには UNIX の sort を使うと思います。 sort の底力を見てみたいと感じるからです。
マクロを組まずにコマンド入力の自動化！

#隠れた機能!?「繰り返しコマンド」
マクロを組まなくても、コマンドの定期的な入力を自動化できちゃうんです！！
TeraTermのツールバーの設定に「繰り返しコマンド」という機能がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/dc133f4f-962a-f0ef-9c5e-333734d67bfe.png)
これを開くと，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/957ff92d-eba5-ef49-79d2-316a4bd607d4.png)
こんな画面が出てきます。
"間隔"にはコマンドを実行したい間隔を秒で入力、
コマンドを書いてから"改行を追加"をCheckedにします。

最後に"有効"にチェックを入れてからOKを押すと、指定した秒ごとに同じコマンドが実行されます。

##使い方の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331782/e624d029-3cf7-5723-81c1-50c7c05f52e4.png)
こんな感じで仕掛けておけば、30秒ごとにCPUの温度が出ます。

//いやー，これは便利。