OmniAICreator/Qiita-1.07M huggingface dataset:
Xcodeで `git rebase master` するときの手順

Xcodeで共同開発している時に、作業ブランチの`master`が変更されてしまい、**fast-forward(早送り)マージできない状態**になったときに今の自分はこうやっています的メモです。（もっといい方法あるはず）

# 作業ステップ

>**T** = ターミナル
**X** = Xcode

1. **T** : ローカルの`master`を最新にする
2. **T** : 作業ブランチに切り替える `git checkout feature`
3. **T** : 分岐点をつけ替える `git rebase master`
4. **X** : コンフリクトを修正する
5. **T** : 作業したファイルをステージングに追加する `git add .`
6. **T** : `rebase`を完了させる `git rebase --continue`
7. **T** : 変更を反映する `git push --force-with-lease origin feature`


# 参考にした記事
- [git push \-f をやめて \-\-force\-with\-lease を使おう \- Qiita](https://qiita.com/wMETAw/items/5f47dcc7cf57af8e449f)	
- [fast\-forwardマージから理解するgit rebase \- Qiita](https://qiita.com/vsanna/items/451b42f886c599a16a55)
同期出来なくなったリモートリポジトリをローカルのリモートリポジトリリストから削除する

# 困ったこと
 - AWS codecommitを実験的に使っていたら、同期できなくなったリモートリポジトリがリストから消えずに困った

# 対処したこと
 - リモートリポジトリの確認: `git branch --remote`
 - 同期しなくなったリモートリポジトリをリストから削除: `git branch -dr <remote-repository-name>`

# 参考リンク
 - [gitで、リモートブランチを削除する方法。](http://www-creators.com/archives/2018)
Oracleを使っているWebシステムでTomcatのバージョンアップ時に気を付けること

# お断り書き
ググっても英語しかヒットしなかったのでメモ書きレベルの記録です。

# 前提
- データベースはOracle
- 今使っているサーバーはTomcat7以下
- 今使っているJDBCドライバはojdbc6.jar

# やりたいこと
Tomcatを7から8.5、または9.0にバージョンアップしたい

# 出るエラーメッセージ

```
java.lang.AbstractMethodError: oracle.jdbc.driver.T4CConnection.getSchema()Ljava/lang/String; 
```

# 原因
- Tomcat 8からJava 7以上が必須になっている。
- Java 7でConnectionクラスにgetSchema()メソッドが増えてて、そちらをTomcatのコネクションプール(dbcp2)が使用している
- Java 7に対応したjdbcドライバはojdbc7.jar

# 対応
tomcatのlibフォルダにojdbc7.jar（あるいはより最新のjdbcドライバ）を放り込みましょう
12 Factor App - 設定

# この章の話はずばり

---

# 環境変数

---

# これにつきます

---

# つまり

---

# アプリケーションの設定とは、デプロイ（ステージング、本番、開発環境など）の間で異なり得る唯一のものである

---

# 具体的には

---

- データベース、Memcached、他のバックエンドサービスなどのリソースへのハンドル
- Amazon S3やTwitterなどの外部サービスの認証情報
- デプロイされたホストの正規化されたホスト名など、デプロイごとの値

など

---

# ポイント

---

1. 設定はコードから厳密に分離されていること。定数ではもたない
2. 秘匿情報を漏洩しない。OSSにできるかどうか
3. アプリケーション内部の設定は、ここでの "設定" の定義には含まれない。Railsの `config/routes.rb` とか
4. `dev`, `stg`, `production`のように環境ごとの管理は新しい環境ができたときにスケールしづらいので、そのようにグルーピングして設定を分けたりしないほうがよい

---

# 環境変数を使うのは粒度の細かい管理だが、言語やOSには依存しない良い方法です

---

# ありがとうございました
Cloud Datastore を利用する際に気をつけること


# 気をつけるポイント
Datastoreを利用する上で見逃しがちだが重要なポイントがある。
実際に運用上で発生した問題を下記にまとめた。

### エンティティの最大サイズ
1エンティティに登録できる最大サイズは「1,048,572 バイト」。
このサイズを超えるデータを登録しようとすると、エラーとなり書き込みができなくなる。

### commit制限
CloudDatastoreAPIで、Commitオペレーションに渡せるエンティティの最大数は「500件」である。
つまり、書き込みや更新、削除対象のエンティティが一度に500件分処理しようとするとエラーとなり処理ができなくなる。

### その他
それ以外にも[公式情報](https://cloud.google.com/datastore/docs/concepts/limits?hl=ja)で様々な制限が記載されている。
利用する際は、制限を正確に把握した上で長期運用にも耐えうるデータ設計を検討することを薦めます。
[tensorflow]label_image.pyのtf.Sessionでエラー発生

# 環境
・centos6.5
・レンタルサーバ
・python3.6

# エラー内容
label_image.pyを実行すると、tf.Session()のところで以下のエラーが出てしまう。

```
terminate called after throwing an instance of 'std::system_error'
  what():  Resource temporarily unavailable
Aborted
```

# 対応
```
config = tf.ConfigProto()
config.intra_op_parallelism_threads = 1
config.inter_op_parallelism_threads = 1


sess = tf.Session(config=config)
```
pillow で テキストを画像に変換

Arch Linux で必要なライブラリーをインストール

```bash
sudo pacman -S python-reportlab
yay otf-takao
```

## プログラム

```py:text_to_png.py
#! /usr/bin/python
#
#	text_to_png.py
#
#					Mar/24/2023
#
# ------------------------------------------------------------------
import sys
from PIL import Image, ImageDraw, ImageFont
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# ------------------------------------------------------------------
def text_to_png_proc(lines_in,png_out):
	height = 16
#	width = 1200
	width = 100
#
	lines_out = limit_length_proc(lines_in)
	llx = len(lines_out)
	sys.stderr.write("llx = %d\n" % llx)
	yy_height = height * llx + 50
	sys.stderr.write("yy_height = %d\n" % yy_height)
	text_canvas = Image.new('RGB', (width, yy_height), (255, 255, 255))
	draw = ImageDraw.Draw(text_canvas)
#
	font_ttf = "/usr/share/fonts/OTF/TakaoPMincho.ttf"
	draw.font = ImageFont.truetype(font_ttf, height)
#	
	font_ttf = "/usr/share/fonts/OTF/TakaoPMincho.ttf"
	draw.font = ImageFont.truetype(font_ttf, height)
#
	xx = 20
	yy = 20
	color = (0,0,0)
	for line in lines_out:
		pos = (xx,yy)
		draw.text(pos, line, color)
		yy += height
#
#	text_canvas.show()
	text_canvas.save(png_out)
# ------------------------------------------------------------------
def limit_length_proc(lines_in):
	lines_out = []
	for line in lines_in:
		if len(line) <= 80:
			lines_out.append(line)
		elif len(line) <= 160:
			lines_out.append(line[:80])
			lines_out.append(line[80:])
		else:
			lines_out.append(line[:80])
			lines_out.append(line[80:160])
			lines_out.append(line[160:])
#
	return lines_out
# ------------------------------------------------------------------
```

## 使用方法

```bash
./text_to_png.py in01.txt out01.png
```

```text:in01.txt
AAA
```

out01.png
![out01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b0ddbff5-0bef-3482-9d90-a144664797df.png)

## 確認したバージョン

```text
$ python --version
Python 3.10.10
```
コードの可読性・保守性・堅牢性にフォーカスしたリファクタリング集

# エラーをはやめに返す

- コードを読む量を減らせる
- `else` を省略できるので正常系のネストがなくなる

```swift
// before
if error == nil {
  // 正常系の処理が続く...
}
else {
  Alert("error!")
}

// after
if error != nil{
  Alert("error!")
  return
}
// 正常系の処理が続く...
```

# 戻り値を必要としない配列ループの修正

- 戻り値を意識させなくなるので、安心できる（`map`だと「もしかして戻り値を扱う場合もあるのかも？」とおもわせてしまう）

```swift
// before
let _ = array.map { ... }

// after
array.forEach { ... }
```

# forを使わずに要素の探索

- 条件式のミスを減らせる（`if "any" == file` だと意図していない結果になる）
- `if A != B`（AとBは等しくない） よりも説明的。 `!A.contains(B)`（BはAに含まれていない）


```swift
// before
for file in fileNames {
  if "any" != file {
    return
  }
}
// after
if !fileNames.contains( "any" ) {
  return
}
```
主成分分析と因子分析の違いメモ

# 概要

どちらも多変量データの要約という目的には変わりないが、要約へのモチベーションとアプローチが異なる。

数式的には大きな違いはないが、因子分析は得られる結果が人によって異なりうるが、主成分分析は同じになる。

# 主成分分析

#### アプローチ
偏差の平方和が最大になるような座標軸を順々に定義していく(例：$x,y,z$)。
基本的にその数は十分な累積寄与率になった時点で決まる。

#### モチベーション
主成分分析では元のデータに対する損失が平方和として発生するが、寄与率が高ければ、つまり全体的に特徴を捉えられていれば良い。

#### その他
誰が分析しても同じ結果になる。そのため**客観性があり、物理/化学/医学などの分野**で利用される。

# 因子分析
#### アプローチ
事前にデータに潜在する共通因子と呼ばれる変量とその数を仮定する(例：$f_1, f_2$)。
その後、仮定した共通因子の変量とその重み、そして損失を独自因子を求める。

#### モチベーション
因子分析においても損失が独自因子として発生するが、因子分析では元データに潜在する共通因子自体を発見することに主眼が置かれる。

#### その他
因子についての仮定が分析者によって異なるため、同じ分析結果にならない。つまり分析の仕方に自由度があるということでもあり、**分析者の意図を表現するためにマーケティングや心理学**などで利用される。


# 参考
+ 意味がわかる多変量解析
Modern Javascript Tutorial

Hello,

Please take a look at the Modern Javascript Tutorial, it was recently translated to Japanese at https://ja.javascript.info ;).

The tutorial is free and open-source, has theory and tasks with tests to practice.

As the author of the original English version, I'm not speaking Japanese.

Right now, the site is totally unknown to Japanese public, that's why I post here. Please tell me, how's the quality of the translation? 

If you consider this a valuable resource, please help to spread the word about it.
配列代入殺すマン IDEの正規表現でPHPの配列への順次代入を一括宣言に書き換える手伝いをする正規表現

そんなタイトル(前半部)の古いメモが整理中のローカルで見つかったのでWebに保存です。

言うほど殺せないのはご愛嬌。
配列代入という呼び方も謎。


```:search
\$(?:.*?)\[(.*?)\]\s*=\s*(.*);
```

```:replace
$1 => $2,
```

# 使い方

たとえば、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/eaf4569a-9f82-abc6-7c01-087807e2d91b.png)
(**Calss**になってる！！)


PhpStormでこんなコードを見かけたとする。
配列の宣言方法が文化的なお作法になっており、かつコードの編集権限があり自分の美意識に反するとき(どんなときだ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/92caed4a-b410-ae4f-d351-39431d59993a.png)

<kbd>Ctrl + R</kbd>

で置換機能を呼びだしReplace allすると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/046acc96-5889-6d89-af9e-3c91442ff4c9.png)

ここまで置換されるので、後は`$a = [];`の`];`を切り取って貼り付けて自動整形にかければ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/62354/705e0fd0-480b-fea7-6847-b97d9b8ec6d3.png)

ここまで持ってこれる。

# 関連

[PHPの配列の作成は初期化と代入のどちらが速いのか - Qiita](https://qiita.com/khsk/items/fe80d7668ed6cd53eb73)

書き換える理由付けとして速度を計測しました。

***

`array(.*)`を`[.*]`のショートハンド化する正規表現もどこかに書いた気がするが、自動整形で変換できるので需要はない。

***

今なら静的解析で自動で変換できないものか。

***

pushや上書きなどに対してセーフティでは無いはずなので、使うなら選択範囲を置換でご安全に。
Sublime Text 3 私的オススメプラグイン

定番の当たり前に入れているもの以外で、かゆいところに手が届くようなプラグインを集めてみました。
一応リンクを入れてはありますが、大抵のプラグインは`Package Install`で入れられます。

## 表示系

### [GitGutter](https://github.com/jisaacks/GitGutter)

前回コミットとのdiffを行番号の横に表示してくれたり、作業中の行の最終コミット担当者を表示してくれたり。

### [TrailingSpaces](https://github.com/SublimeText/TrailingSpaces)

行末の余計なスペースをハイライト表示して消し残しなどがないようにする。		
settingsで全角スペースも含めておけばさらに安心。

```json
{
    "trailing_spaces_regexp": "　|[ \t]+"
}
```

これで行末のタブと半角スペース、及び各所に紛れ込む全角スペースがわかりやすくなります。

### [Color Hilighter](https://github.com/Monnoroch/ColorHighlighter)

CSSやSCSSのカラー値の右に実際の色を表示する。		
ただ変数まで追って表示してくれたりはしない。。。。

### [WordCount](https://github.com/titoBouzout/WordCount), 及び バイト数表示

[Sublime Text3でバイト数を表示するプラグイン作った](http://kaerouka.hatenablog.com/entry/2014/04/02/004113)

ステータスバーにワード数、バイト数の表示を追加する。

## 操作・入力補助系

### [AutoFileName](https://github.com/BoundInCode/AutoFileName)

HTMLのsrc属性やjsのrequireなど、パスを辿るべき場所で入力候補を出してくれる

### [Color Convert](https://github.com/zhouyuexie/ColorConvert)

RGB16進数、Hex値、HSL値など色々な色の表現形式を相互に変換できる。


### [InputSequence](https://github.com/kazu1107/InputSequence)

様々な連番入力方式に対応できる。			
Package Controlからインストールできないのでgithubからインストールする。
https://github.com/kazu1107/InputSequence

## ツール

### [Codecs33](https://github.com/seanliang/Codecs33) 及び [ConvertToUtf8](https://github.com/seanliang/ConvertToUTF8)

ShiftJISを表示・編集するために使用。

### [OmniMarkupPreviewer](https://github.com/timonwong/OmniMarkupPreviewer)

Markdownファイルをライブリロードでブラウザでブレビューできる。		
HTMLファイルとして保存することも可能。			
レイアウトはGithubを踏襲しているがCSSを変更したりしてカスタマイズすることも可能。

### [Pandoc](https://github.com/jgm/pandoc)

ドキュメント変換ツールであるPandocの操作をSublime上でできるようにする。		
セッティングをいじればFilterを通した独自の変換なども可能。		
使用にはPandoc本体が必要。

[Pandoc](https://pandoc.org/)

### [Pretty JSON](https://github.com/dzhibas/SublimePrettyJson)

JSONのソートや整形、バリデーションなどを行うことができる。

### [SideBarEnhancements](https://github.com/SideBarEnhancements-org/SideBarEnhancements)

サイドバーのプロジェクトエリアでコピーや移動などを行えるようにする拡張ツール

### SublimeLinter

Sublime上で各種のLintを表示するためのツール。		
動作には各Linter本体と、それぞれのプラグインが必要。

[Sublime Linter](http://www.sublimelinter.com/en/stable/)
[Sublime Text3 lintエラーをリアルタイム表示してjavascriptの実装を少しだけ効率化](https://qiita.com/etet-etet/items/3c939ed07d22474e4f28)

### Sublimerge 3

Sublime上で差分表示を行う。		
現在開いているファイル同士、あるいはgitやsvnのリビジョンでも比べられる。

http://www.sublimerge.com/

### [TerminalView](https://github.com/Wramberg/TerminalView)

Sublime上でターミナルを動かせるツール。		
VSCodeの同機能と比べるとちょっと痒いところに手が届かない感じ…

### [View In Broser](https://github.com/adampresley/sublime-view-in-browser)

HTMLファイルなどをブラウザーでプレビューできる。

## その他おすすめカスタマイズやTips

### タイムスタンプをショートカットキーで出す。

https://b.hishitu.net/4658.html
ログなどを残す時重宝します。

### ステータスバーに文字コード、改行コードを表示しておく

特にShiftJISなど扱う人には便利
https://beadored.com/sublime-text-3-character_code/

### Emmetは思った以上に便利

定番のEmmetですが、実は画像パスをBase64化する機能や、選択した数式を結果に変換する機能など色々な変換機能がショートカットキーで呼び出せる。

### なんかプロジェクトエリア灰色でダサい…

と思った方は一旦「Material Theme」をインストール＆反映してから、		
`Preferences > Color Scheme`でハイライト表示だけ元のものに戻してしまえば良い。

https://qiita.com/saltyshiomix/items/15ebd75205a5334f6efc
tcpdumpでICMPv6のtypeを指定する方法

###Typeの指定

```bash:ICMPv6
sudo tcpdump -i eth0 "ip6[40] == 'type number' (or ...) && icmp6"

```

IPv4までのICMPパケットは

```bash:ICMP
sudo tcpdump -i eth0 "icmp[0] == 'type' "
```
であった。

ちなみに "[ ]" はヘッダのバイトオフセットを指定する。ip6[40]はIPv6ヘッダの40バイト目(ICMPv6 type)の値だ。

###ファイルに保存＋標準出力
hoge.pcapというファイルに保存する。

```bash:write_and_stdout
sudo tcmpdump -w - | tee hoge.pcap | tcpdump -r -
```

-w -　で標準出力にpcapバイナリを吐き出す
-r - で標準入力から読み込む(ここではpcapバイナリを読んでいる)
tidalcycles0.9 on ubuntu16.04(xenial)

この間DOMMUNEでalgoraveやってたので、またtidalcyclesをセットアップしようと思いました。
以前セットアップしたPC（GPD　Pocket1）のOSをubuntu16.04から18.04にあげたらちゃんと動かなくなってしまって、、
泣く泣くクリーンインストールしたことで消えてしまっていたので、、


#supercollider インストール

```
apt install supercollider-ide
```

だと、3.66しか入りません。。(tidal 0.9はsupercollider3.8からでないと使えません)
調べてみるとubuntu16.04(Xneial)は、3.66までしかないようです。
仕方ないのでソースからビルドすることにしました（前は入れれた気がするのですが、、）

下記からソースをダウンロードします
最新は3.10ですが3.9でないとビルドできません。qt関係のパッケージで対応できていないのがあるようです
3.93をダウンロードします

https://github.com/supercollider/supercollider/releases/download/Version-3.9.3/SuperCollider-3.9.3-Source-linux.tar.bz2

ここの通りに進めていきます

https://github.com/supercollider/supercollider/blob/develop/README_LINUX.md

####必要なパッケージをインストール

```shell
sudo apt-get install build-essential cmake libjack-jackd2-dev libsndfile1-dev libfftw3-dev libxt-dev libavahi-client-dev
sudo apt-get install git libasound2-dev libicu-dev libreadline6-dev libudev-dev pkg-config
```

QT関係はOSによって違うみたいなのでUbuntu16.04(xenial)だと下記のパッケージをインストール

```shell
sudo apt-add-repository ppa:beineri/opt-qt-5.11.0-xenial
sudo apt-get update
sudo apt-get install qt511base qt511location qt511declarative qt511tools qt511webchannel qt511xmlpatterns qt511svg qt511webengine qt511websockets
```

####ビルドしてからインストールまで

ダウンロードしてきたファイルを展開して出来たディレクトリに移動して下記のようにbuildディレクトリを作って
buildをカレントディレクトリにします

※emacsが必要になるかもしれません

```
mkdir build
cd build
```

ビルドしてからインストールまでいきます

```
cmake -DCMAKE_PREFIX_PATH=/opt/qt511 ..
make
make install
```

cmakeにインストール場所を指定しないと下記の場所にインストールされます



```
usr/local/bin
```

上記のディレクトリにあるscideを起動するとIDEが立ち上がります。
そこで

```
include("SuperDirt")
```
と打ってその行でCTL＋ENTER

その後一旦IDEを終了させて再起動して

```
SuperDirt.start;
```
と打ってその行でCTL＋ENTERでSuperCollider側はOK

tidalの方は下記の通りで（エディタはvimを使ってます。Dirtの所は飛ばしてください）

https://qiita.com/skyfish20ch/items/3bc148b94ed3407c8ce3

この記事では、「￥ーS」としていますが、ctrl+eでした
ESP-32にFreeRTOSをインストールしてAWS IoT につなぐ

###はじめに
ESP-32は純正のESP-IDF以外にもArduino-IDEやMicropythonなど複数のプログラミング環境がありますが、今回はAWSが公開しているFreeRTOSをインストールしてawsIoTに繋いでみます。

###必要なモノ
- windows がインストールされているPC （今回はwindows7で確認）
- ESP32-DevKitC （スイッチサイエンス社の[ESPr Developer 32]
(https://www.amazon.co.jp/gp/product/B0756VKNKH/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)を使用）
- USB2.0 (TypeA - microB) 通信ケーブル
- WiFi環境

###FreeRTOSのインストール手順
手順は[AWSに公開](https://docs.aws.amazon.com/freertos/latest/userguide/getting_started_espressif.html
)されています。
全文英語です。
単語を拾って進めていきます。

####UARTドライバ
通信するために、「CP210x USB to UART Bridge VCP drivers」をインストールします。
PCのUSBポートにESP32を接続して、デバイスマネージャーのポートの項目に接続されているCOMポートが表示されるので、それを控えておきましょう。

####Toolchainのインストール
Espressifから[ESP-IDF library](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/windows-setup.html) をダウンロードしてきます。
ESP-IDFの説明通り、C:ドライブに「msys32」フォルダを作ってそこに入れておきます。

####Amazon FreeRTOSのダウンロード
windows版のFreeRTOSは[GitHub](https://github.com/aws/amazon-freertos)よりダウンロードしてきます。
今回はzipでダウンロードしてきて、適当な場所に解凍します。

####プロジェクトを構成
toolchainのあるmsys32にフォルダにあるmingw32.exeを開きます。
Python 2.7.10以降をインストールします。Python 3.xではありません。
easy_install awscliを使用してAWS CLIをmingw32環境にインストールします。
aws configureを実行して、AWS CLIを設定します。詳細については、[「AWS CLIの設定」](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/installing.html)を参照してください 。
boto3 Pythonモジュールをインストールするには、*easy_install boto3*を使用します。
Amazon FreeRTOSには、Espressifボードのセットアップを簡単にするスクリプトが含まれています。
Espressifスクリプト ＜BASE_FOLDER＞/tools/aws_config_quick_start/configure.json を開いて、下記の設定します。
＜BASE_FOLDER＞FreeRTOSを解凍したフォルダのパスです。(toolsやdemosが子フォルダでいます。)

- afr_source_dir：
Amazon FreeRTOSディレクトリへの完全なパス。＜BASE_FOLDER＞のこと。
- thing_name：
この名前でawsIoTにモノが追加されます。
- wifi_ssid：
Wi-FiネットワークのSSID。
- wifi_password：
Wi-Fiネットワークのパスワード。
- wifi_security：
Wi-Fiネットワークのセキュリティの種類。
有効なセキュリティタイプは次のとおりです。
 - eWiFiSecurityOpen （オープン、セキュリティなし）
 - eWiFiSecurityWEP （WEPセキュリティ）
 - eWiFiSecurityWPA （WPAセキュリティ）
 - eWiFiSecurityWPA2 （WPA2セキュリティ）

####構成スクリプトの実行
mingw32.exeを開きます。
＜BASE_FOLDER＞/tools/aws_config_quick_start ディレクトリに移動して 、次のコマンドを実行します。
*python SetupAWS.py setup*
詳細は＜BASE_FOLDER＞/tools/aws_config_quick_start ディレクトリのREADME.mdを参照してください 

####Amazon FreeRTOSサンプルのビルドと実行
ESP32をPCに接続して。mingw32.exeを開きます。
＜BASE_FOLDER＞/demos/espressif/esp32_devkitc_esp_wrover_kit/make へ移動して、次のコマンドを入力します。
*make menuconfig*
「Espressif IoT Development Framework Configuration」メニューで、「Serial flasher config」に移動し、「 Default serial port」に移動して シリアルポートを設定します。

Windowsでは、シリアルポートは **COM1** のような名前が付いています。
ここで設定するシリアルポートは、デモアプリケーションをESP-32に書き込むために使用します。
選択を確定するには、ENTERを選択します。設定を保存するには、保存を選択し、終了を選択します 。
他の項目は弄りませんでした。

ファームウェア（ブートローダとパーティションテーブルを含む）をビルドして書き込みます。
＜BASE_FOLDER＞\demos\espressif\esp32_devkitc_esp_wrover_kit/make に移動して次のコマンドを実行します。
*make flash*
シリアルコンソール出力を監視するには、次のコマンドを実行します。
*make flash monitor*

コンパイル出力の最後に、ぞろぞろとMQTTが表示されれば成功です！
livedoorブログからエクスポートしたデータから画像ファイルの取得とURLを一括変換する

# livedoorブログからWordPressへ移行したい
livedoorブログからWordPressへ移行する場合、通常はlivedoorブログからデータをエクスポートして、WordPressへインポートします。詳しい手順はネットを探せばいろいろ出てきますので、[こちら](https://gazocustomize.xyz/livedoorblog-wordpress-migration/)のブログなどを参考にしていただくとして、面倒なのが画像の取得と画像URLの変換です。今回簡単なツールを作ってみました。

# 変換プログラム
このプログラムはエクスポートしたファイルから&lt;IMG&gt;タグと&lt;A HREF&gt;タグを探して、画像ファイルを片っ端からダウンロードしていくものです。&lt;A HREF&gt;も参照しているのは、livedoorブログでは画像の拡大をする場合にリンクしているためで、&lt;A HREF&gt;タグの場合はJPEG/PNG/GIFのみダウンロードします。

```ldblog_img_convert.php
#!/usr/bin/php
<?php
$outdir = "imgs";
$new_baseurl = "https://YourBlogURL/wp-content/uploads/".$outdir;

$infile = $argv[1];
if(! is_dir($outdir)) mkdir($outdir, 0755);
if(! is_file($infile)) die("no file\n");

foreach (explode("\n",file_get_contents($infile)) as $line) {
	$line = preg_replace_callback('/(<img [^>]+>)/i', function($m){
		return preg_replace_callback('/src=(["\'])([^"\'?]+)\??[^"\']*(["\'])/i', function($mm){
			return 'src='.$mm[1]. downloadimg($mm[2]) .$mm[3];
		}, $m[1]);
	}, $line);
	$line = preg_replace_callback('/(<a [^>]+>)/i', function($m){
		return preg_replace_callback('/href=(["\'])([^"\'?]+)\.(jpg|jpeg|png|gif)\??[^"\']*(["\'])/i', function($mm){
			return 'href='.$mm[1]. downloadimg($mm[2].'.'.$mm[3]) .$mm[4];
		}, $m[1]);
	}, $line);
	echo $line."\n";
}
exit;

function downloadimg($url) {
	global $outdir, $new_baseurl;
	if(preg_match("~\Ahttps?://~", $url)) {
		$buff = @file_get_contents($url);
		if(strlen($buff) > 0) {
			for ($i=0; $i<100; $i++) {
				$newname = (($i>0) ? $i.'_' : '') . basename($url);
				$outpath = $outdir.'/'. $newname;
				if(! is_file($outpath)) {
					file_put_contents($outpath, $buff);
					$url = $new_baseurl.'/'.$newname;
					break;
				}
			}
		}
	}
	return $url;
}

?>
```
#使い方
はじめに $new_baseurl をWordPressの画像を置くURLに書き換えてください。
変換するにはコマンドラインから実行します。

```
$ ./ldblog_img_convert.php backup.txt > backup_new.txt
```

ダウンロードした画像ファイルは img/ フォルダに保存されるので、WordPressのディレクトリにコピーしてください。backup_new.txtの中の画像のURLは、新しいWordPressでのURLに書き換わっています。もしURL古いままだった場合は、ファイル名がうまく認識できなかったのかもしれません。ダウンロードに失敗した場合はURLは変換しません。

まだ数個の記事でしか動作テストしていないので、バグや改良点がありましたらご指摘ください。
リアルタイムチャットアプリもどきの作成１[メモ用]

#初めに
　プログラミング初心者が勉強のために書いたものです。実用目的よりも，使い方を勉強するためのものなので，コードがかなりひどいです()。一応メモ用。

#目標
　環境構築をする。

#目次
- 環境構築
- Djangoのセットアップ
- dockerからredisを起動

##環境構築
　だいたいpipでインストールするか，Pycharmいれて，どうぞ。
　requirements.txtで一括インストールが楽だと思います。ただ，多分かなりいらないものが入っているかもしれないです。

```text:requirements.txt
aioredis==1.2.0
asgiref==2.3.2
asn1crypto==0.24.0
async-timeout==3.0.1
attrs==18.2.0
autobahn==18.10.1
Automat==0.7.0
certifi==2018.10.15
cffi==1.11.5
channels==2.1.5
channels-redis==2.3.1
chardet==3.0.4
constantly==15.1.0
cryptography==2.3.1
daphne==2.2.2
Django==2.1.2
docker==3.5.1
docker-pycreds==0.3.0
h2==3.0.1
hiredis==0.2.0
hpack==3.0.0
hyperframe==5.1.0
hyperlink==18.0.0
idna==2.7
incremental==17.5.0
msgpack==0.5.6
numpy==1.15.4
opencv-python==3.4.3.18
priority==1.3.0
pyasn1==0.4.4
pyasn1-modules==0.2.2
pycparser==2.19
PyHamcrest==1.9.0
pyOpenSSL==18.0.0
pytz==2018.7
requests==2.20.0
service-identity==17.0.0
six==1.11.0
Twisted==18.9.0
txaio==18.8.1
urllib3==1.24
websocket-client==0.53.0
zope.interface==4.6.0
```

```shell
$ pip install -r requirements.txt
```

　必要なものは基本的に，Djangoとchannels，redisなどを入れれば大丈夫だと思います。redisについては，僕はdockerでredis-serverを立ち上げてやっていました。

##Djangoのセットアップ
[Django channelsチュートリアル](https://channels.readthedocs.io/en/latest/tutorial/part_1.html)
　このチュートリアルにほとんど書いてあるので，この通りにやったらセットアップできると思います。Djangoのチュートリアルはそのまんまでだいたい動くからとてもいい。

```shell
$ django-admin startproject mysite
$ python3 manage.py startpap chat
$ python3 manage.py runserver
```
　とりあえず，Djangoが動くか確認したい場合は，上のコマンドを脳死で打てば多分大丈夫だと思います。ちなみにファイル階層はmysiteを作った時点で

```shell
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
```
こんな感じになってるはずです。さっきのコマンドの下２行はmysiteのディレクトリ内で打って貰えば大丈夫です。

```shell
$ python3 manage.py runserver
```
上記のコマンドを打った時に，

```shell
Performing system checks...

System check identified no issues (0 silenced).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

February 18, 2018 - 22:08:39
Django version 1.11.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```
だいたいこんな出力がでればおそらく大丈夫だと思います。

##dockerからredisを起動
　dockerについての理解がほとんどないので，ここはチュートリアル通りに，

```shell
$ docker run -p 6379:6379 -d redis:2.8
```
　こんな感じで，redisのサーバーを立ててる感じです。ちなみに-dはバックグラウンドで動かすオプション，-pはポートを指定するオプションです。
　-dをつけないとredisのかっこいいロゴが出ます()。

#最後に
　環境構築がめちゃくちゃ大事なのに，ものすごく適当に書いてしまった。備忘録として既にアウトな気がする，，，
ARKitとBlenderの力でうさぎのラヴィを召喚する

#導入
こんにちわ。

村山 公啓と申します。
ダーツが趣味の人はTwitterでもFaceBookでもいいので連絡ください。一緒にやりましょう。

ぐるなびウエディングのマスコットキャラクター、うさぎのラヴィを召喚してみたく
BlenderとXcode(ARkit)の力を借りて実行してみました。
↓ラヴィ
![iOS の画像 (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/234908/40b0caf9-9601-f970-ad84-34483ff19d0a.jpeg)


Blender(3Dモデリング)、Xcode(ARkit)、どちらとも経験がほとんどないためワクワクです。
それではご覧ください。

#完成品
どーん！
![iOS の画像.png](https://qiita-image-store.s3.amazonaws.com/0/234908/cf2e2c0c-c0f2-bfc3-abd2-58bf82460617.png)

ラヴィが！そこに！いる！

作成した流れを書いていこうと思います。

#ARkitでHelloWorld
まずはARkitを軽く触ってみようと思いました。
どうやら最近のバージョンのXcodeでは、ARがとりあえず試せるプロジェクトがある模様。
早速試してみました！

##Project作って
<img width="454" alt="スクリーンショット 2018-11-26 9.53.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/9c24a1df-5655-db7b-e7f9-918a9757efd9.png">
##Argumented Reality Appを選んで
<img width="709" alt="スクリーンショット 2018-11-26 9.56.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/7dd5bde6-fddd-fa53-0eb7-103885763998.png">
##ビルドして実機でテスト！
![iOS の画像 (1).png](https://qiita-image-store.s3.amazonaws.com/0/234908/0d846d36-ca05-9a1e-08df-4f04f82f9c77.png)


すごい！たったこれだけでジョ◯ョのエアロ◯ミ◯みたいなやつが出てきました！
これをラヴィに置き換えることで作っていこうと思います。

#Blenderを学ぶ
3Dモデル作成のためにBlenderを学びました。
Blenderにした理由はなんとなくです。
学ぶにあたっては以下の動画をみつつ、実際にイッヌを作ることで学びました。
基本操作が丁寧に説明されており、非常にわかりやすい動画でした。ありがとうございます！
https://www.youtube.com/watch?v=pkvMiEeJGro

動画で基本操作を覚えたところで作成していきました。

##ボディを作って
<img width="1440" alt="スクリーンショット 2018-11-26 10.21.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/1264b466-8980-45cd-adee-f23517f8904b.png">
##各部パーツを作り
<img width="1440" alt="スクリーンショット 2018-11-26 10.24.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/d9e17b7c-8b3c-e4a2-5766-eae4d579ff9c.png">
##細かい箇所を追加、修正して
<img width="1440" alt="スクリーンショット 2018-11-26 10.26.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/f351b65b-b3f7-f8d1-431d-d74879f58a05.png">
<img width="1440" alt="スクリーンショット 2018-11-26 10.31.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/63f04b09-e992-f5d2-931d-0477e1c71086.png">
##できた！
<img width="1440" alt="スクリーンショット 2018-11-26 14.58.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/234908/015ec26e-8f0b-4102-261c-ae4c2332bdce.png">



耳のところの花がない？
こまけぇこたぁいいんだよ！

#ARkitで召喚！
いよいよ召喚フェーズです。
エアロス◯スの代わりにラヴィが表示されるようソースを書き換えて...

どーん！
![ravi.gif](https://qiita-image-store.s3.amazonaws.com/0/234908/479f9aa8-4571-3551-1f8e-4fd170296832.gif)


カワイイヤッター！
無事召喚に成功しました。

#おわり
ARkitとBlender、どちらも未知の領域でしたが、スムーズに作成することができました。
便利なツールに感謝するとともに、より深みを知れるよう学び続けて行きたいです。

明日は、豊濱さんのカレンダーですよ〜。お楽しみに〜。
ngrokでグローバル環境にしてLINEbotをcloud9で動かすための手順

自分の復習用に書きます。

GoogleCrome
↓
ngrokのサイトへアクセス
↓
DOWNLOAD
↓
Linux
↓
https〜以下を全部コピー
↓


setting.py
↓
ALLOWED_HOSTS = ['*']





コマンド入力
↓
$ wget（スペース）https〜以下を全部コピーしたやつを貼り付ける
↓
$ unzip（スペース）ngrok-stable-li〜を貼りつける
↓
$ ./ngrok http 8080
↓
黒い画面が出る
↓
一番下の
Forwarding    https://より下を.ioまでコピー
↓
LINEDevelopのWebhook URL に貼りつける＋ngrok.io/bot/callbackを後ろに追加する
アプリケーションを触る時のストレスはユーザー体験の勉強時間にしよう (UI/UXデザイン)

# お題 Slack+iPhoneで絵文字テキストが打ちにくい！

もうこれは莫大なるストレス。

# ユーザー体験への影響

- Slackの「絵文字テキスト」を使いたくなくなっている自分に気づく
- OS依存の絵文字を使い始めているユーザーis自分に気づく
- iPhoneでOS絵文字を使い始めると、MacでもOS絵文字統一したい

# ストレスが波紋を呼ぶ

- MacのIMEでうまく絵文字が変換できないことに気づく
- MacとiPhoneの絵文字と日本語の対応がマバラであること気づく
- 絵文字とは一体何なのか、俺は一体何のために苦労しているのか

# アプリケーション設計の洞察

- そういえば絵文字規格というものがあることを思い出す
- アプリケーションにいかに絵文字が重要であるかを理解する

# 全てのアプリケーションを使っている時間が勉強になる

- 自分自身は最高のユーザーサンプルだ
- UI UX のボトルネックに「意識的」「非無意識的」になることで、個人的にも問題解決の糸口が見えやすくなる
- 絵文字について何か新しい洞察が得られるかもしれない
- 「俺だったらこんなアプリケーションがほしい！」という「不満アプリケーション開発術」につながるかもしれない。

# 結論

- 俺たちはユーザーサンプルだ
- いつでもサンプルとしての自覚を持つのだ
- マインドフルネスで自己洞察力を高めておこう








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PaaSとサーバレス

似て非なるもの
今更ですが自分的によくわからないので整理のために

## PaaSとは
PaaS(Platform as a Service)、ソースコードをデプロイするだけで
アプリケーションが動く
メリット：今までサーバ立ててミドルインストールして・・・という手間がなくなる
　　　　　サーバ構成を意識する必要がない
デメリット：動作する言語に制約がある場合がある

・AWS Elastic Beanstalk
・Azure App Service
・Google App Engine

## サーバレスとは
大きく分けて下記2つ

FaaS(Function as a Service)
起動しない限りコストが発生せず、関数が使われた時間や起動数で課金される
・AWS Lambda
・Azure Functions
・Google Cloud Functions

BaaS(Backend as a service)
アプリケーション構築に必要な機能を提供
・Google FireBase
・AWS Mobile Hub

メリット：
デメリット

## で、結局どちらを選べばいいの？
※あくまで目安として

PaaSを選択する場合
→アプリケーションを長時間で動かす必要がある
　支出パターンの変動を避けたい場合

サーバレスを選択する場合
→短期間で不定期なタスクが多い場合
 インフラ管理から解放されたい場合
RecyclerView.ViewHolderでKotlin Android Extensionsを利用する

## 基本的には `findViewById` と同じ

以下のようなレイアウトファイルを使った場合、
ViewHolderの `itemView` に生えている対象のビューを捕まえてあげるだけです。

```view_text.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:gravity="center"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>
```

```Kotlin
holder.itemView.apply {
    textView.text = context.getString(R.string.app_name)
}
```

`findViewById` を使った場合は以下のようになるので、
同じことをやっていると考えればとくに難しいことはないでしょう。

```
holder.itemView.apply {
    findViewById<TextView>(R.id.textView).text = context.getString(R.string.app_name)
}
```

そのため、レイアウトファイルをincludeしたものも同じように扱えばよいです。
Cursesで作るROSのメッセージモニター

まだ製作途中ですが、コードは以下のリポジトリにあるので、興味があれば見てみてください。
https://github.com/nakano16180/ros_control

##きっかけ
ROSでメッセージを確認したいとき、```rostopic echo```を使っていました。
しかし、複数メッセージを確認したいときに```rostopic list```をしてから```rostopic echo```をすると、echoで確認したメッセージで端末が埋まってしまい、その前の```rostopic list```の結果が流れてしまう

なんとかできないかと調べていると、こんな記事を見つけました。
[コンソールへの出力を上書きしてゆく方法](https://qiita.com/airtoxin/items/bb445529c94d3cd871f3)

これだ！でもこれ、1行しかだめじゃん（泣）
複数行上書き出来る方法はないかと思い、もう少し調べているとCursesというライブラリを見つけました。

##Cursesとは
Pythonの標準ライブラリで、組み込み関数のinputやprintを使うより高度なCUIアプリケーションを作成できます。

とりあえずコードを見てみる

```sample.py
#!/usr/bin/env python3

import curses
import time

if __name__ == "__main__":
    try:
        stdscr = curses.initscr()
        curses.noecho()

        for t in range(0, 10):
            stdscr.clear()
            stdscr.addstr(0, 0, 'Program will be terminated after %s seconds' % (10 - t))
            stdscr.refresh()
            time.sleep(1)
    except:
        # Exception by Ctrl + C
        pass
    finally:
        curses.echo()
        curses.endwin()
```

コードはここから→[Python:cursesライブラリの使い方](https://www.hiroom2.com/2016/09/27/python-curses%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)

コード中のstdscr.addstr(y, x, string)という形で、指定した座標に文字を表示させることができます。
stdscr.addstr()のx,yを変更しながら追加していけば表示させる内容も増えるので、割りと使いやすいのではないかと思いました。

実行結果は以下の通り
![curses_sample1.gif](https://qiita-image-store.s3.amazonaws.com/0/263384/be44331a-78df-cf07-1d08-49e08d3dd7b0.gif)


##おわりに
今回紹介したCursesを調べている途中で、TUI(Text User Interface)というものを知りました。ちょっとしたコマンドや小さなツールでもUIなどにこだわってみると開発も楽しくなるのではないかと思いました。

今後の目標として、topicのリストとtopic内容の表示を同時にできたらいいなと思います。
LightGBMについて

#概要理解
LightGBMとは、以下と捉えることができる。

**LightGBM = GBDT(Gradient boosting decision tree) + GOSS(Gradient-based One-Side Sampling) + EFB(Exclusive Feature Bundling)**

#GBDTの問題点
従来GDBTの問題点の1つとして、学習時間があげられる。
そしてその学習時間の多くが、分岐点を探す際にかかる時間である。

#改善Point
上記の問題点を踏まえ、改善観点として大きく2つ考えられる。
###1.データ量を減らす(GOSS)
データをサンプリングして学習する。
ただし、以下2点に注意。
・勾配が小さいデータに関しては学習しなくてもよい。(勾配が小さい=よく学習できている)
・単にサンプリングするだけでは精度への影響が懸念されるため、元データとの変更がないようにわり割り戻して整合性を保つ
###2.特徴量を減らす(EFB)
疎なデータ(データがNULLだらけな様子。スパースともいう。)に関してはデータをいくつかにまとめ、そのまとめた単位毎に学習をおこなう。(データ1つ1つ学習するより速そう、というのか感覚的にも理解できる。)

#結果
論文の結果からすると精度も速度もLightGBMが1番良かったっぽい
<img width="762" alt="qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/318521/0cdfafea-8a32-6f34-6fc4-150caef857d2.png">

#今後理解が必要な箇所
・GOSS/EFBのアルゴリズム理解
・P/NP/NP-Hard/NP-Completeについての理解



*[参考]*
https://www.slideshare.net/tkm2261/nips2017-lightgbm-a-highly-efficient-gradient-boosting-decision-tree
http://developer.hatenastaff.com/entry/ml_reading_party_201804#LightGBM-A-Highly-Efficient-Gradient-Boosting-Decision-Tree
https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html
(論文)
https://papers.nips.cc/paper/6907-lightgbm-a-highly-efficient-gradient-boosting-decision-tree.pdf
Slack分報は何故開発効率・生産性を上げるか？ PDCAお好きですか？

# 理由. ラバーラッキングだから。

以上。

このことに気づいて「なるほど！」と本当に腑に落ちた。

ほんとーーーうに。

# ラバーダッキングとは

- 人としゃべると開発が進む。
- ゴムのアヒルに話しかけても話が進む。
- 自分と対話する技術だよ

# 他のメソッド

- 小さく小声で喋りながら開発。
- 自分向けDMとかを分報チックに使う。他の人の注意を逸らさない、本当に雑な自分向けの分報が良いなら。
- ディスプレイを指差し確認しながら考える。

# 爆速になろうぜ！

分報がお前の味方になる。だぜ。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[st2]RabbitMQのmsg_store_persistentが溜まって処理が遅くなる

## 困ってたこと
* StackStormがだんだん遅くなっている気がした（ジョブ制御のみにかかるオーバーヘッドが増している）
* RabbitMQのmsg_store_persistentが数GB以上たまっている

上記の課題をどうしたものか調べた。

## 調査
### RabbitMQのmsg_store_persistentとは？
永続Queueがここに貯まるとのこと。

### msg_store_persistentの削除方法
```terminal:rootで実行
$ st2ctl stop
$ rabbitmqctl stop_app
$ rabbitmqctl reset
$ rabbitmqctl start_app
$ st2ctl start
```

上記実施後にworkflowを流したところ、ジョブ制御の時間だけで25秒以上かかっていた処理が3〜6秒程度改善された。

## 残課題
* resetが他の情報も消してないか怪しいので継続して確認した方がいいかも
    * RabbitMQの設定はquick installのデフォルトなので、設定変更している場合resetで消される情報があるかも？
* メッセージ全消しなので再起動運用しないといけないのつらい
(メモ)micro:bitで温湿度・気圧を測定してAmbientで可視化

# はじめに
業務でAIを扱っているのですが、
AIと言ったらIoTと切っても切れない関係に今後なっていくので、
IoTに触れてみようと思いました。
社内の詳しい方からmicro:bitを勧められ、
以下の構成で可視化を試みました。

# やろうとしたこと
シリアル通信を使用してデータを拾い、
IoTデータ可視化サービス「Ambient」にデータを送信します。
まずWindowsでうまくいったので、Linux(Ubuntu)上のDockerコンテナから
実施できるように設定していきます。
Windowsでの手順は省略。

# 手順
## デバイスの準備
以下を参考にさせて頂きました。
[[参考]GROVEモジュールをmicro:bitにつなぐ拡張ボード](https://mb.d-side.info/2018/04/21/grove%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92microbit%E3%81%AB%E3%81%A4%E3%81%AA%E3%81%90%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89/)
![microbit.png](https://qiita-image-store.s3.amazonaws.com/0/240903/074047bf-c5cd-6c3e-8b2b-a7fae1e9528c.png)
温湿度・気圧センサーはスイッチサイエンスで購入した[BME280](https://www.switch-science.com/catalog/3374/)、
GROVEシールドは品切れだったため、秋葉原の千石電商で購入してきました。
電池ボックスは使用しません。
もともと別用途で使用していて、抜けなくなったのでそのままですw

## micro:bitのプログラム
以下を参考にさせて頂きました。
[[参考]weatherbit 0.0.12 (sparkfun/pxt-weather-bit)](https://makecode.microbit.org/pkg/sparkfun/pxt-weather-bit)
![program.png](https://qiita-image-store.s3.amazonaws.com/0/240903/d0a8f838-8d86-3213-a52e-f5bf08befe5b.png)
プログラムはmicro:bitに書き込んでおきます。

## 実行環境の準備
一部、以下を参考にさせて頂きました。
[[参考]LinuxPCでserial通信をしようとした話](https://qiita.com/sttn/items/567c9f49b88ff275b51a)
先頭の(ホスト)／(コンテナ)で、ホスト側／コンテナ側の作業が分かるようにしています。

### (ホスト)シリアルポートの確認
Linuxマシンにmicro:bitをUSB接続し、以下のコマンドを実行してシリアルポートを確認します。

```
ll /dev/serial/by-id/
```
>合計 0
>drwxr-xr-x 2 root root 60 11月 26 13:26 ./
>drwxr-xr-x 4 root root 80 11月 26 13:26 ../
>lrwxrwxrwx 1 root root 13 11月 26 13:26 usb-ARM_DAPLink_CMSIS-DAP_XXXX -> ../../**ttyACM0**

XXXXの部分は長いので省略しています。
これで**ttyACM0**と確認でき、dev配下にシンボリックリンクがあることが分かります。

### (ホスト)権限付与
```
chmod 666 /dev/ttyACM0
```

### (ホスト)コンテナ起動
```
nvidia-docker run --rm -it -v /mnt/hdd/share:/tmp/share --device=/dev/ttyACM0:/dev/ttyACM0 myDockerImage:Tag bash
```
nvidia-dockerじゃなくてももちろん大丈夫です。

### (コンテナ)cuのインストール
```
apt install cu
```

### (コンテナ)cuでシリアル通信の確認
```
cu -s 115200 -l /dev/ttyACM0
```
>temperature:27.549999999999998
>humidity:31.218750000000001
>pressure:1060.3858593750001
>\-

確認が取れたので、pythonで実行する準備をします。

### (コンテナ)python仮想環境の準備
```
conda create -n env_name python=3.6.7
```

### (コンテナ)仮想環境をactivate
```
source activate env_name
```

### (コンテナ)パッケージのインストール
以下を参考にさせて頂きました。
[[参考]AmbientDataInc/ambient-python-lib(GitHub)](https://github.com/AmbientDataInc/ambient-python-lib)

```
pip install pyserial
pip install git+https://github.com/AmbientDataInc/ambient-python-lib.git
```

### (コンテナ)プログラムの実行
プログラムの詳細は省略します。
以下を参考にさせて頂きました。
[[参考]micro:bitとAmbientで社内の温度、環境光を可視化した](https://qiita.com/m_ryusei/items/ec7b6c97f5f4929b43be)
[[参考]Pythonでシリアル通信](https://qiita.com/kosystem/items/0023cfee941fdf099087)

```
cd tmp/share/workdir
python main.py
```

# 結果
![ambient.png](https://qiita-image-store.s3.amazonaws.com/0/240903/6ba60017-279b-5374-efdc-c883bf04a0ea.png)

# さいごに
割と簡単に出来ました。
近くに置いてあった温度計と精度以上の差があってはじめは驚きましたが、
安定するまで5～10分程度かかるそうなので、しばらくしたら精度の範囲内になりました。
さて、これをキッカケに今後どう活かしていくか。
nRF52 の printf/NRF_LOG_INFO で float を使う (SEGGER Embedded Studio)

センサーの値が0のままで、あれれーと思っていたら整数値だと思っていた変数がfloatでした。 %f を表示しようと思いましたがあれこれしないといけませんでした。

# 環境

- SEGGER Embedded Studio
- Nordic SDK15.2

# printf / scanf

floatは標準では使えなくなっている。

「Project」-「Options...」で「Common」を選び、左側の上下矢印でSolutionのOptionにします。「Code」-「Printf・Scanf」の「Printf Floating Point Supported」を「No」から変更します。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/3258075a-de0f-9238-dedc-348451203a7e.png)

この設定をした後ビルドしようとすると下記のエラーが出ますが「OK」とします。

![image](https://qiita-image-store.s3.amazonaws.com/0/139524/4768ce7f-1939-bf8e-a630-6e3f94ce0c17.png)

# NRF_LOG_INFO

```

        NRF_LOG_INFO("TWI ACC XYZ:  %f %f %f.", accel_X,accel_Y,accel_Z);

```
としたら、値が0で出力されました。ここでfloatを使うには、上記printf/scanfとは別のやりかたが必要になります。

```

        NRF_LOG_INFO("TWI ACC Float accel XYZ: " NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(accel_X));

```

これでOK.

ちなみに、以下のようにすると１行に2つの float を表示できましたが、

```

        NRF_LOG_INFO("TWI ACC Float accel XYZ: " NRF_LOG_FLOAT_MARKER " "  NRF_LOG_FLOAT_MARKER,  NRF_LOG_FLOAT(accel_X),NRF_LOG_FLOAT(accel_Y));
```

同様にして 3つの float を含ませるとコンパイルできませんでした。
jqのハイフン(-)を含むkeyでフィルタ出来ない件の対応

偉大なる元記事: [jqでハイフン(-)を含むkeyでフィルタできないときの対処法](https://qiita.com/keigo1450/items/84e696f8be0761ed0e04)

> $ cat test.json | jq '.["foo-bar"]'

これが動かなかったので調べ直しになってしまった。
MacbookProに入れたjqが新しい、もしくは古いので非サポートになったのかな？

```bash
$ jq --help
jq - commandline JSON processor [version 1.5]
```

> 詳しくは
[Github: Cannot select field if field name has dashes #38](https://github.com/stedolan/jq/issues/38)

元記事にリンクが張ってあるので確認、

> hexsel commented on 25 Mar 2016
Just for posterity, the following seems to work:
`jq .\"a-b\"`
Seems like the shortest working query string with a hyphen.

どれどれ、実際にjqの1.5で確かめてみたところ、
`'."key-of-path"'`で値を抜き出す事に成功。
1.5以降のバージョンの人はこちらも試してみてね。
[Rails]データベースと連動しないモデルでactive_model_serializersを使いたい

```app/models/hoge.rb
class Hoge
  include ActiveModel::Serialization
  include ActiveModel::Model
  include ActiveModel::Attributes

  # attributes :name とか
end
```

```app/serializers/hoge_serializer.rb
class HogeSerializer < ActiveModel::Serializer
end

```

こんな感じにしてあげるとちゃんと動く。ポイントは`ActiveModel::Serialization`を`include`すること。
JAWSUG金沢の激熱勉強会にOpsJAWSがお邪魔しました


# イベントはこれ
[JAWS-UG金沢 #36 x OpsJAWS！ AWS運用・監視についてのクロスイベント！](https://jawsug-kanazawa.doorkeeper.jp/events/80275
)と称して金沢で開催しました！
DMMGAMESさんのとってもおしゃれな会場をお借りしての開催。3連休初日にも関わらず20名もくらいの方が集まりました。
![DsqQ6PbU0AAZCeV.jpg large.jpg](https://qiita-image-store.s3.amazonaws.com/0/53287/36aa94cf-8aae-f28a-40ed-81d3d85522ee.jpeg)


## 開催の経緯
JAWSUG金沢側で運用に関する話ってできる人いないっすか？とAWSのコミュニティマネージャの沼口さんに相談したところ、OpsJAWSをつなげていただき、OpsJAWS側もコラボを模索していたため、Win-Winで即決！早速やろうとなって開催したのが今回。せっかくなのでとお誘いいただき、OpsJAWSが出張することに！！！！
無類の鰤好きの私としては、開催時期をしっかり旬を狙って調整したというのはオフレコでwww。

## セッショメモ
### 1. 初心者向け大規模運用と今回の経緯
DMM出村さん
`資料探し中`

### 2. CloudWatch Logs 設計Tips
OpsJAWS会澤（私w）　https://t.co/14oJEBTYCS

資料ご確認いただき、ご不明点や問題があればご指摘くださいwww

### 3. AWSで実現するChatOps
DMM @t11a さん　https://t.co/aDvvnKqoZz

* ChatOps導入前
    * Code Deployとか使ってるけどマネジメントコンソール手作業
    * 作業に4時間
    * ヒューマンエラーは避けられない
    * リリース頻度は2week/回

* slashコマンド便利
* slashコマンドは3sec以内の応答が必須なので、多段lambdaは非同期化
* たまにデプロイが失敗する。Code Deployのイベントトリガーで通知

* ChatOps導入後
    * slack完結
    * 作業に1時間
    * ヒューマンエラー激減
    * 作業履歴が1か所に
    * 作業状況がオープンに
    * リリース頻度は1week/回に!


### 4. AWSの既存サービスを活用して、障害検知・復旧を迅速化するカラクリ
DMM松下さん　https://speakerdeck.com/kentarom/jaws-ug-kanazawa-x-opsjaws

* 通知する内容に意味を持たせる（全件通知と閾値通知）
* 通知対象毎にアラームを作成することで、通知時に何のエラーかをわかるように設計
* slackを活用して初動を早める。ChatOpsでスマホでも対応可能!!
* 事例
    * 検知から通知まで1-2min
    * やるべきリスト整理に30sec
    * スモークテストで動作確認
    * 3min以内に対応完了!!


### 5. Systems Manager Update
OpsJAWS園部さん

`資料確認中`

### 6. 登壇者トークセッション


* クライアントからエンドポイントまでのレイテンシの管理ってしてるか？というのは興味深い  
    * いわゆるURL監視でステータスをとるのは鉄板だけど、例えば複数のキャリア・複数の地域からのレイテンシを計測し、閾値超えたらアクセス先を変える（AWSからAzureに、とか）をやってもいいのでは？

正直、予算とか運用者のスキルレベルによってしまうなーと思った。


## 所感
### 参加者として
DMMさんでは、`DevとOpsは同一チームで行っているので、当たり前のようにDevOps`が回っていました。
自分達が楽になれれば、それが売上や利益の向上につながるため、とても積極的に前向きに取り組まれているな、と感じました。何より、2,3年前は「AWSこれから使います」というステージだったのに、もうここまで来ているか！？と思うほどの活用っぷりで、正直ビビりました。
また、個人的には、`今までChatOpsのメリットがなかなかよくわからなかったのですが、何かあったときにPCなくても確認・コミュニケーションが取れるというのは、なるほどなと思いました`。slashコマンドを活用することで、出来ることを増やしている工夫は、当事者ならではのアイディアでとても参考になりました。
### 運営者として
休憩時間を1時間もとっているのは印象的でした。なかなか皆の前で質問しづらかったりという配慮もあるのですが、`ネットワーキングするためにという理由で長い休憩時間をとった`とのこと。これは東京だとなかなかないなーと思いました。

## さいごに
勉強会後、懇親会を開いていただきました。
蟹、鰤、さしこ、金沢おでん、などなど、おいしいものをたくさん食べながら交流を深めました。
こういった機会はなかなかあるものではないので、とても貴重な時間となりました。
今後もこういったコラボ勉強開催していけたらなーと思っています。OpsJAWSはどこへでも出没します。他支部の方、ご連絡お待ちしておりますー笑
金沢アツい！！！

※会場の様子
![20181123_183821_2180_original.jpg](https://qiita-image-store.s3.amazonaws.com/0/53287/73d78dd2-1e3d-559e-339a-a760f0fd162d.jpeg)


※AWS沼口さんのご挨拶
![20181123_183712_7830_original.jpg](https://qiita-image-store.s3.amazonaws.com/0/53287/2821cdbb-6f3b-0924-9408-75dd606ba34e.jpeg)
mix docs で生成されるドキュメントの見た目をカスタマイズする

## 独自のスタイルシート

`mix docs` コマンドは `mix.exs` に定義された `project/0` の `:docs` エントリーに設定を書くことができる。`:assets` オプションと `:before_closing_head_tag` オプションを組み合わせることで、独自のスタイルシートを追加できる。

```elixir
def project do
  [
    apps_path: "apps",
    build_embedded: Mix.env() == :prod,
    start_permanent: Mix.env() == :prod,
    aliases: aliases(),
    deps: deps(),

    # Docs
    name: "MyProject",
    docs: [
      assets: "etc/assets",
      before_closing_head_tag: &docs_before_closing_head_tag/1
    ]
  ]
end
```

`etc/assets/doc.css` を配置し、`docs_before_closing_head_tag/1` 関数は以下のように定義する。

```elixir
defp docs_before_closing_head_tag(:html) do
  ~s{<link rel="stylesheet" href="assets/doc.css">}
end
defp docs_before_closing_head_tag(_), do: ""
```

各オプションの詳細は [`mix docs` コマンドのリファレンス](https://hexdocs.pm/ex_doc/Mix.Tasks.Docs.html)を参照してほしい。

## HTML 要素のクラスや属性のカスタマイズ

ExDocs はデフォルトで [pragdave/earmark](https://github.com/pragdave/earmark) を Markdown レンダラに使っており、独自拡張を使うと任意のブロック要素にクラスや属性を指定できる。たとえば、以下の例では、コードブロックの `pre` 要素に `class="diagram"` を指定している。

<pre>
&#96;&#96;&#96;
Code text
&#96;&#96;&#96;
{: .diagram }
</pre>
「 const { } = 」が出てきて？？？となった人へ、分割代入

#概要
題名にある通り、 `const { } =` についての説明をしようと思います。
自分は勉強していく中でこれが出てきてどういうこと？ってなったので調べた結果を書こうと思います。

#分割代入
この `const { } =` は分割代入と言われます。
この{}はオブジェクトを参照していて分割代入は配列でも使うことができます。

#使い方
実際にコードを書いてみたほうがわかりやすいと思います。

```javascript: 
const obj = {a: 100, b: 200};

const { a, b } = obj;

console.log(a, b); //100, 200
```

上記のコードは下記のコードと同一の意味です。

```javascript
const obj = {a: 100, b: 200};

const a = obj.a;
const b = obj.b;

console.log(a, b); //100, 200
```

分割代入を使うことで綺麗に書くことができます。
また、関数も用いることができます。

```javascript
function f() {
  return {a: 100, b: 200};
}

const { a, b } = f();

console.log(a, b); //100, 200
```
また関数の引数にも当てることができ、入れ子になったオブジェクトも下記のように参照できます。

```javascript
function user() {
  return {
    name: "Bob",
    like: {
      food: "curry",
      sport: "soccer"
    }
  };
}

function practice({name, like: {food}}) {
  console.log(name, food);
}

practice(user()); //Bob, curry
```

上記で行ってきた分割代入を配列の場合でも同様に行うことができます。

#感想
疑問に思ったJavascriptの記法について書いてみました。
今後も疑問に思ったことは書いていきたいです。

以上です。参考になれば幸いです。
site24x7 を導入するまでの辛み

この記事は　[Site24x7 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/site24x7) の1日目の記事です

# site24x7  とは？

読み方はたぶん　「サイトトゥエンティフォーバイセブン」です。
所謂外形監視サービスです。
いろいろ監視出来るようですが、弊社ではWebサイトに関しての外形監視で利用しています。

この投稿では、自作の監視サービスを作る苦難とそれを一発で解決してくれるsite24x7について書きます。

# 自作の監視ツール

当初、会社の先輩が書き上げたサーバ監視ツールがありました。
登録されたURLが閲覧できる状態か確認する物です。
4xx,5xx系エラーの場合に、メール、Chatworkに通知してくれると言う物でした。
SSL証明書の期限切れ、設定ミスでサイトにアクセスできない自体になると
すぐに通知してくれる優れものでした。


ところがある日の事、一斉にサイトが閲覧できなくなったという通知を自作監視ツールから受け取りました。
通知を元にアクセス出来ないと言われるサイトにアクセスすると、**なんと不思議！普通にサイト**は生きています。
どうやら誤検知のようです。
誤検知の原因を調べたところ、なんと監視ツールがインストールされているサーバと、サイトが収容されているサイト間の経路（インターネット）が輻輳しており一時的に監視サーバが他のサーバにアクセスできない状態でした。
サイトが正常かどうか監視していたら、**監視ツールが異常状態になり、正常が異常**と扱われてしまった。という事象です。

他にも
Chatwork →通知見ないことがある
メール　→見落とす事がある

という問題が有りました。

通知に関しては
メール →　sendgrid →　webhook → 自作スクリプト → Twilio → 電話をかける
と言うスクリプトを書いた事も有りました。正直面倒くさいです。

そんなこんなで、site24x7に乗り換える事にしました。

# Site24x7 に乗り換えてどうなったのか

まず、**監視ツールのネットワーク次第で誤検知が発生する問題**です。
これはsite24x7を導入することですぐに解決出来ました。
site24x7では、**複数の拠点から外形監視**を行ってくれます。
日本で2拠点、海外から3拠点のような感じです。
これで例えば日本の東と西でネットが切断されても外形監視が続行できます
（他の問題が発生するでしょうが）

他にも site24x7では**電話**や**SMS**でのアラート通知を行ってくれます。
これで通知を見落とす可能性がなくなりました。
Swift基礎構文のメモ（初心者向け） part3

#【経緯】
社内もくもく会にてSwiftが始まったので復習がてら。[この記事](https://qiita.com/siroykht/items/10d391f072e488cbd133)のpart3です。

#【基礎構文】
__■関数と引数（初期値あり）__

~~~Swift:
func printPrice(price: Int = 0, productString: String = "この商品") {
    print("\(productString)は\(price)円です")
}

printPrice(price: 150, productString: "PC")
printPrice(price: 6300)
~~~
~~~:出力
PCは150円です
この商品は6300円です
~~~

__■関数と戻り値__

~~~Swift:
/* 戻り値のある関数 */
func valueResult(value: Int = 0) -> Int {
    return value / 2
}

/* 戻り値のない関数（省略可能） */
func valueNoneResult(value: Int = 0) -> () {
    print("\(value)\nNot return value.")
}
func valueNoneRes(value: Int = 0) {
    print("\(value)\nNot res value.")
}

/* 複数のreturnがある場合 */
func numberResult(number: Int) -> Int {
    if number > 0 {
        return number * 2
    }
    return number + 10
}

print(valueResult(value: 300))
valueNoneResult(value: 6300)
valueNoneRes(value: 1200)
print(numberResult(number: 5))
print(numberResult(number: -6))
~~~

~~~:出力
150
6300
Not return value.
1200
Not res value.
10
4
~~~

__■スコープ__
ローカル：関数や制御構文毎のブロックで使用可能
グローバル：関数や制御構文毎のブロックを超えて利用可能

__■外部引数名__
引数を関数内で別の引数名を用いて値を渡すことが出来る。
また、「_」を使用することで、呼び出し時に引数名を省略することが出来る

~~~Swift:
func printPrice(num1 price: Int = 0, str1 productString: String = "この商品") {
    print("\(productString)は\(price)円です")
}

func add(_ price: Int = 0, _ productString: String = "この商品") {
    print("\(productString)は\(price + 100)円です")
}

printPrice(num1: 150, str1: "Windows")
add(150, "Mac")
~~~
~~~:出力
Windowsは150円です
Macは250円です
~~~

__■関数のオーバーロード__
関数名は変更せずに、引数のデータ型のみ異なる関数を作成したり、引数名や引数の個数が異なる関数を宣言したりすることで実現可能。
上記のように、関数名を変更せずに引数の種類や名前を変更して、同名の関数を呼び出せるようにすることをオーバーロードと言います。

~~~Swift:
func clAverage(_ a: Int, _ b: Int) -> Int {
    return (a + b) / 2
}

func clAverage(_ a: Double , _ b: Double) -> Double {
    return (a + b) / 2.0
}

print(clAverage(23, 65))
print(clAverage(23.3, 65.2))
~~~
~~~:出力
44
44.25
~~~

__■可変長引数の関数__
可変長引数は引数の個数を指定しないような関数のこと。可変長引数で宣言された引数は配列として扱われる。

~~~Swift:
func average(_ numbers: Int...) -> Int {
    var sum:Int = 0
    
    for number in numbers {
        sum += number
    }

    return sum / numbers.count
}

print(average(60, 95, 77, 83, 52))
~~~
~~~:出力
73
~~~

# 【所感】
関数をメインに。AndroidやiOSと言ったアプリ系の言語だから当然かもしれないですが、スコープの概念にローカルとグローバルがある方が好きです。第三回までやってきて思いますが、個人的にSwiftはかなり良い所取りしてる扱いやすい言語じゃないかなあと思います。

# 【参考】
・https://qiita.com/makopy_inside/items/e3e73ff10b946be0a1c2
bash: 標準出力、標準エラー出力、標準出力＋標準エラーをファイル、画面それぞれに出力する方法

# はじめに
Qiita記事である[bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法
](https://qiita.com/laikuaut/items/e1cc312ffc7ec2c872fc)の[標準エラー出力⇒ファイル1、標準出力⇒画面(標準出力)、標準エラー出力⇒ファイル2、標準エラー出力⇒画面(標準エラー出力)](https://qiita.com/laikuaut/items/e1cc312ffc7ec2c872fc#%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB1%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B%E7%94%BB%E9%9D%A2%E6%A8%99%E6%BA%96%E5%87%BA%E5%8A%9B%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB2%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B%E7%94%BB%E9%9D%A2%E6%A8%99%E6%BA%96%E3%82%A8%E3%83%A9%E3%83%BC%E5%87%BA%E5%8A%9B)を応用してみた。

備忘録を兼ねて共有。

# コマンド
```
$ { { { bash stdout_and_stderr.sh | tee stdout.log; } 3>&2 2>&1 1>&3 | tee stderr.log; } 3>&2 2>&1 1>&3; } 2>&1 tee stdout_stderr.log

```
Gitで最後にコミットしたコミットのハッシュ値をクリップボードにコピー

Gitで最後にコミットしたコミットのハッシュ値をクリップボードにコピーします。`git log`から取得できますがいちいち面倒くさいのでPowerShellを使ってコピーまでしてしまいました。

ネットで探しても意外と情報がないのですが、みんな`git log -1`で表示される内容を手作業でコピーしているのか、それともSourceTreeなどの右クリックメニューを使っているのか…。

```powershell
> (git log -1) -match "commit \w+" -replace "commit " | CLIP
```
はい。これだけです。commit…ではじまる行を正規表現で抽出し、commitという文言を削除してからクリップボードに突っ込みます。

これで多少はGithubやBitbucketのイシューを報告するのが楽になる？
PythonのグラフのType3フォント回避

# PythonのグラフのType3フォント回避
Pythonの`matplotlib`によるデフォルトのフォントには, **Type3**が使われています.
学会などでは, **Type3**フォントを避けるように指示される場合があります.
以下のようにすることで, **Type3**フォントを回避できます. 
(**CID True Type**というフォントになるようです. )

```python
import matplotlib
matplotlib.rcParams['pdf.fonttype'] = 42
matplotlib.rcParams['ps.fonttype'] = 42
```

また, 以下のようにすることで, **Type1**フォントにできます.

```python
import matplotlib
matplotlib.rcParams['text.usetex'] = True
matplotlib.rcParams['text.latex.preamble'] = '\usepackage{sfmath}'
```

参考文献

- [Avoiding Type 3 fonts in matplotlib plots
](http://phyletica.org/matplotlib-fonts/)
配列に使える便利メソッド flat_map/collect_concatについて

# はじめに
配列に使用できる便利なメソッドを探していた際に、`flat_map`とそのエイリアスメソッドである`collect_concat`を見つけたので忘備録として残します。

# flat_map/collect_concatとは？
>flat_map -> Enumerator[permalink][rdoc]
collect_concat -> Enumerator
flat_map {| obj | block } -> Array
collect_concat {| obj | block } -> Array
各要素をブロックに渡し、その返り値を連結した配列を返します。
ブロックの返り値は基本的に配列を返すべきです。
ブロックを省略した場合は、ブロックを受けとり 上で説明した評価をし、その結果の配列を返す Enumerator オブジェクトを返します。 *(参照先はページ下記)*

#### Example

```flat_map/collect_concat.rb
pry(main)> arry
=> [[1, 2, 3,"z"], ["a",4], ["b",5]]

pry(main)> arry.flat_map { |a| a.grep(Integer) }
=> [1, 2, 3, 4, 5]

pry(main)> arry.collect_concat { |a| a.grep(Integer) }
=> [1, 2, 3, 4, 5]
```

イメージとしては`map`と`flatten`が合体したようなものです。
ネストしている配列をなくしてくれる上に、その結果を新たにフラットな配列として返してくれます。



```flatten.rb
pry(main)> arry
=> [[1, 2, 3, "a"], ["a", 5], ["b", 3]]

pry(main)> arry.flatten
=> [1, 2, 3, "a", "a", 5, "b", 3]
```



```map.rb
pry(main)> arry
=> [[1, 2, 3, "a"], ["a", 5], ["b", 3]]

pry(main)> arry.map { |a| a.grep(Integer) }
=> [[1, 2, 3], [5], [3]]
```
(参考)
[flattenメソッド](https://ref.xaio.jp/ruby/classes/array/flatten)
[mapメソッド](https://ref.xaio.jp/ruby/classes/array/map)
[オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/2.2.0/class/Enumerable.html#I_COLLECT_CONCAT)

##おわりに
以上、ご一読ありがとうございました。
何かご指摘ございましたら、コメントいただけると幸いです。