OmniAICreator/Qiita-1.07M huggingface dataset:
raspberry pi 1でtensorflow lite その14

#概要
raspberry pi 1でtensorflow liteやってみた。
マイク入力を扱うので、alsaを叩いてみた。

#写真

![CIMG2821.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/b1124707-a77d-ad6d-1ca1-d0a3dc7836fb.jpeg)

#Makefileを書く。

```
.PHONY: all clean

all: main

main: pcm4.c
	gcc pcm4.c -o test -lasound -lm
clean:
	rm -f test


```

#サンプルコード
マイク入力をそのまま、スピーカー出力。

```
#include <stdio.h>
#include <alsa/asoundlib.h>

#define OUT_FREQ 			44100
#define IN_FREQ 			44100
int main(int argc, char * argv[])
{
	int err;
	int i;
	snd_pcm_t * in_handle;
	snd_pcm_t * out_handle;
	snd_pcm_sframes_t frames;
	char * device = "default";
	short in_buffer[IN_FREQ * 5];
	short out_buffer[OUT_FREQ * 5];
	if ((err = snd_pcm_open(&in_handle, device, SND_PCM_STREAM_CAPTURE, 0)) < 0)
	{
		fprintf (stderr, "Capture open error: %s\n", snd_strerror(err));
		return 1;
	}
	if ((err = snd_pcm_set_params(in_handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 1, IN_FREQ, 1, 1000 * 1000)) < 0)
	{
		fprintf (stderr, "Capture open error: %s\n", snd_strerror(err));
		return 1;
	}
	if ((err = snd_pcm_open(&out_handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0)
	{
		fprintf (stderr, "Playback open error: %s\n", snd_strerror(err));
		return 1;
	}
	if ((err = snd_pcm_set_params(out_handle, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2, OUT_FREQ, 1, 1500 * 1000)) < 0)
	{
		fprintf (stderr, "Playback open error: %s\n", snd_strerror(err));
		return 1;
	}
	while(1)
	{
		frames = snd_pcm_readi(in_handle, in_buffer, IN_FREQ);
		if (frames < 0)
		{
			frames = snd_pcm_recover(in_handle, frames, 0);
		}
		if (frames < 0)
		{
			fprintf (stderr, "snd_pcm_readi failed: %s\n", snd_strerror(frames));
		}
		fprintf(stderr, "%d  ", frames);
		for (i = 0; i < frames; i++)
		{
			out_buffer[2 * i] = in_buffer[i];
			out_buffer[2 * i + 1] = in_buffer[i];
		}
		frames = snd_pcm_writei(out_handle, out_buffer, OUT_FREQ);
		if (frames < 0)
		{
			frames = snd_pcm_recover(out_handle, frames, 0);
		}
		if (frames < 0)
		{
			fprintf(stderr, "snd_pcm_writei failed: %s\n", snd_strerror(frames));
		}
	}
	snd_pcm_close(in_handle);
	snd_pcm_close(out_handle);
	return 0;
}



```

以上。
QiiTa ScraPboX 情報リテラシの高いユーザーが一斉移動マイグレーションを起こさないか心配な1ユーザーとQiitaに託したい未来

- 最近QiitaにScrapBoxの記事を書いているのが@yumainauraほぼ一択である件について https://qiita.com/tags/scrapbox
- 何故みんなこの素晴らしいサービスをもっと称えないのか？
- Qiitaのタグ1000個ぐらい@yumainauraが記事を書きたい気持ちなのだけど
- あ、ScrapBox好きな先鋭的なユーザーはScrapBox使いますよね‥？そっちで情報発信しますよね分かりました。
- UI/UXを理由としてリテラシの高いユーザーが大移動、マイグレーションを起こしていないだろうか
- 愛すべき我らがQiita大丈夫？最強のUI/UXを作ってモダンさ爆上げにしてほしい！
 しかし、はてなブログにせよ、どのサービスにせよ、いちどサービスリリースしてしまうとUI- UXを大幅に変えるのは難しいのかもしれない、Mediumでさえもう古く感じられるし
- こうしてサービスの歴史と世代交代はおこなわれてゆくのだろうか‥
- あ、ScrapBoxがエンジニア専用じゃないと今思い出したぞ
- コードを書くにはやはりQiitaが現状最適な選択肢？
- システムエンジニア+爆速UIなWebソーシャルサービスとしてQiitaを使いたい、自分的に、Qiitaに今足りないものは「ScrapBoxのような」UI/UXだと感じている
- いや、単に自分が文系のエンジニア記事ばかりを書いていて、ScrapBoxが合っているだけという説もある
- QiitaのUI/UXに皆さん満足していますか？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/62ca21b2-7eaa-8bef-f0e2-87683abf397a.png)




![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/edd52a8e-4fb9-65cc-920a-733a1457faa8.png)

https://scrapbox.io/yumainaura/%E6%9C%80%E8%BF%91Qiita%E3%81%ABScrapBox%E3%81%AE%E8%A8%98%E4%BA%8B%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%AE%E3%81%8C@yumainaura%E3%81%BB%E3%81%BC%E4%B8%80%E6%8A%9E%E3%81%A7%E3%81%82%E3%82%8B%E4%BB%B6%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
react-cache API は何を追うべきなのか！？

### react-cache Apiを追ってみた
##### 本来やりたかったことが全くまとまっていないので、`react-cache`について皆さんへの質問です！
react-advent 17th のGenkiです！
本日は皆さんに聞きたいことがあります！Suspenseなどのサンプルコードで良く出てきていた`createCache` って使ってる？

もしかしてこれからは`createResource`だけでいいのではないのか？
とにかく皆さんにはどちらを使っているか教えてほしいです！ :) 

以下の
`react-cache 16.6.0 alpha canary` - これまでSuspenseとかのデモとかで使われたりしてたやつ
`react-cache 2.0.0 alpha` - Latestで使われているやつ

```
import { createCache, createResource } from 'react-cache'
```
`Suspense`を使う上で、良くこれまで出てきていたのが `react-cache`を インポートしてしたいただろう

**しかし**現在のlatest codeからは `createCache`がごっそりいなくなっていて
resource側は **unstabe_**がくっついていた！
参考: https://github.com/facebook/react/blob/master/packages/react-cache/src/ReactCache.js
![Screen Shot 2018-12-16 at 9.52.30 PM.png](https://qiita-image-store.s3.amazonaws.com/0/94541/d152b167-d56a-b693-063f-ed18ffe77161.png)

それでは違いが起きてからのコードを紹介しよう！

## createCacheを使ってみよう！(たぶんよく見てきたやつ！) ver.16.6.0 canary 
参考: CodeSandBox https://codesandbox.io/s/ym411978lv
ポケモンAPI: https://pokeapi.co/api/v2/pokemon/

必要なとこだけPickUp... {*ちょっとsnipetの切り出し方が下手かもだけど。。*}

```
import { createCache, createResource } from "react-cache";
let cache = createCache();
// FetchしたデータをポケモンResourceとして作成
let PokemonCollectionResource = createResource(() =>
  fetch("https://pokeapi.co/api/v2/pokemon/").then(res => res.json())
);

const PokemonList = () => {
  return (
    <ul>
      {PokemonCollectionResource.read(cache).results.map(pokemon => (
        <PokemonListItem key={pokemon.name}>{pokemon.name}</PokemonListItem>
      ))}
    </ul>
  );
};
```

## createResourceのみを使ってみよう！(並列的に開発されているやつ) ver.2.0.0  
参考: CodeSandBox https://codesandbox.io/s/z31182nxxl

```
// ここでは unstable_createResource を createResource として読み込む
import { unstable_createResource as createResource } from "react-cache";

// 3. FetchしたデータをポケモンResourceとして作成
let PokemonCollectionResource = createResource(() =>
  fetch("https://pokeapi.co/api/v2/pokemon/").then(res => res.json())
);

const PokemonList = () => {
  return (
    <ul>
      {PokemonCollectionResource.read().results.map(pokemon => (
        <PokemonListItem key={pokemon.name}>{pokemon.name}</PokemonListItem>
      ))}
    </ul>
  );
};
```

## みなさんに聞きたいこと！
ここのソースをみても本当にcreateCacheはいなくなってしまっていますが、皆さんはどっちを追っていっているなどありますか？
もしよければ教えてください！
https://github.com/facebook/react/blob/master/packages/react-cache/src/ReactCache.js


ちなみにここで英語にはなってしまいますがReact Adventがやっています！
おそらく今年中には日本語でまとめたものを公開しますが、早めに見たいという方はメーリングリストに登録すると**ほぼ毎日**最新のニュースが送られてきます！
https://react.holiday/

ありがとうございます！
ScrapboXに学ぶUI/UXデザイン。タイトルも見出しの境界線も必要としないフラットな世界がやってくるのでは？

- 見出しをつけるのがダサい
- タグを付けるのが面倒くさい
- カテゴリ付けをするのが人権を持つ人間がやることじゃない
- 人間がやることじゃないことを人間がやると、面倒くさくて爆速アウトプットができない
- 必要なのはアイディアや思いつきを流れるようにストリームで形にしていくこと
- じゃないとこのジョーホーカシャカイニオイツケナイヨ！ウソダケド。
- だから箇条書きのリストぐらいで良いのだ
- ScrapBoxは本当に箇条書きがしやすいUIになっている、もうこれだけで十分
- 箇条書きのハイフン入力と日本語の切り替えコストが国内GDPの20％を削減してしまっている
- QiitaのMarkdownも最初は素晴らしいと思ったけどもっと優れたUI/UXの世界があるはずなのだ、僕らのUIにはまだ人権はなくて赤ん坊のよちよち歩きのままだ


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a3b55392-071c-698b-7441-4b9b41983566.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ScrapBoxに学ぶUI/UXデザイン、サービスの新規投稿ボタンってプラスボタンだけで伝わるし、モダンだよね？ Youtube Twitter など

ScrapBoxに学ぶUI/UXデザイン、サービスの新規投稿ボタンってプラスボタンだけで伝わるし、モダンだよね？ Youtube Twitter など
言葉がなくても伝わるものはどんどん言葉を失わせよう

Scrapbox

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c20a4ccd-2a14-8ea1-f907-d1c2c2aa5880.png)


Youtube

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/eda970f4-ee97-3515-9b94-beae46dcc845.png)


Twitter

スマホ版はプラスだけ、PCWeb版は文言あり

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5c7f2a8c-2435-a0b2-3002-16b8433dcc5a.png)



はてなブログ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f5c7a588-c1a0-0b24-10a4-1d3defd48801.png)

Qiita

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/3694ad7f-951f-ace1-730c-592b38ead9a6.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
軽い気持ちでモブプログラミングを行ったら失敗した話

# 前置き

[モブプログラミング Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mobprogramming) 21日目の記事です。

# はじめに

今勤めている会社でモブプログラミングを行ったことがありますが、結果的に空中分解してしまったのでその経過と原因を書きたいと思います。

# 会社およびメンバーは？

発達障がい者を戦力として雇用している、テレビに取り上げられた特例子会社です。
発達障がい者の力を活用できる新たな業務としてのソフトウェア開発をはじめてから1年経つか経たないかというところです。
ただ、それなりに経験のある定型発達者のシニアエンジニアがリーダーとして入っている状態でした。
なお、ソフトウェア開発に関わるチーム全員ではなく、一部のメンバーは新規開発のプロダクトの保守の対応をしており、リーダーのシニアエンジニアは両方のチームを見る必要がありました。

# どんなプロジェクトだったの？

9年前にローンチした情報系システムで、

- 設計書こそあれど一部分しか渡されず
- SQL直書きによる修正が必要だったけど、みんな手探り状態
- 自動化されたテストなんてしてないよ
- 改修前のコードはコメントアウトして残してね

というすごいレガシーシステムの保守開発を行うプロジェクトでした。
そのシステムを初めて触る人だけで構成されたチームで対応する状態です。
発達障がい者を中心に組まれているチームで、モチベーションにもコミュニケーションスキルにもその人の得意不得意が如実に表れるという状態でした。

# なぜモブプログラミングをやろうと思ったのか

モブプログラミングは1メンバーである私からの提案でした。

提案した理由としては

- 初めて使うシステムであり、勝手がわからない
- 技術レベルもばらつきがあり、均一化を図りたい
- 心理的安全を確保したかった
  - 技術だけではなく、「ホウ・レン・ソウ」やコミュニケーションの面でも
- いろいろな先進的なことに挑戦してみたかった

といったところです。

で、実際に行われることは決まったのですが、マネージャーやリーダー層の参加がなく、「ホウ・レン・ソウ」に対する解決策にはなりませんでした。
また、メンバーのほとんどが何らかの発達障がいを抱えていますが、当然のことながらコミュニケーションやチームワークが苦手な人がいたということも見落としてしまいました。
しかも、勉強会でさらっと体験したことのある私以外は全員モブプロ未経験のメンバーでした。
私ですら勉強会でさらっと体験した程度だったので、モブプロのすべての要素を実行できなかったことが痛手でした。

# モブプロはいかに行われたのか

会議室を借りて、マネージャーとリーダーを除くチームメンバーで集まって進めました。
普通のモブプログラミングのように短い時間で交代せずに、集中の続く限りで一人がコーディングして、残りのメンバーが見ているという形式でした。
大体、一人2時間ぐらいはドライバーをしていたかと思います。
また、ナビゲーターもナビゲーターでコミュニケーションを取ることが上手でない人たちで、自分の担当箇所ではない以上、何もすることはないと思い込んでいるメンバーもいる状態でした。
で、結局1日に6〜7時間はモブプロにつぎ込んでいたような気がします。

# モブプロはいかに瓦解したのか

きっかけは、自分の担当箇所ではない以上、何もすることはないと思い込んでいるメンバーがいたことに他のメンバーが怒り出してしまったことが原因でした。
まあ、チームワークが求められる場面で他の事してたらそりゃ怒るメンバーが出てくるのも当然だと思います。

このトラブルによって、他のメンバーから怒られてしまったメンバーはマネージャーの判断で一人で作業をする事になってしまいました。
のみならず、メンバーの中にもいろいろな不信感が広がり、最終的には全員が一人で作業をすることになってしまいました。
とりわけ、リーダーやマネージャーがこのプラクティスに対する理解がなかったというのも痛いところです。
しかも、メンバーはほぼ発達障がい者で、コミュニケーションの不得手さ以外に疲れやすさというところもありました。
そんなメンバーが1日7時間も皆で顔つき合わせてしてたわけですから、疲れてしまうのは当たり前のことでしょう。
さらに、マネージャーやリーダーが加わっていないことも痛手で、「ホウ・レン・ソウ」のコミュニケーションコストは別途発生する状態でした。

この状態では、うまくいかないことも仕方が無かったと思います。

# 今では

個人のペースで一人ひとりでやってます。
わからないところは聞きに行けるのでなんとかなっている感じですが、私一人が席が離れている状態なので、コミュニケーションコストはややかかっている状態です。

# うまくいくにはどうすれば良かったのか

今になって考えれば、モブプログラミングは下手すると我々には難しい方法だったのかもしれません。
私からは、以下の作戦をとれば、少しはましだったのではないかと思っています。

- モブプログラミングを行う時間を長くても4時間以内にして、集中力の減退を抑える
- チームが一丸になれるようにチームビルディングを行う
- でも、たまには一人の時間も作り、その他の雑務にも対応できるようにする
- マネージャー、リーダーも参加して、「全員」で問題を解決できる体制を作る
- モブプログラミングのほうが効果が大きい局面でのみモブプログラミングを行う
- チームワークをうまくできそうなメンバーでモブプログラミングを行う

まあ、何事にも適する場合と適さない場合があって、その見極めが大事かと思っています。
いつかはモブプログラミングが有効な局面が出てくることを信じつつ、日々技術力とコミュニケーション能力と人間力を磨いていきたいと思っています。

# 最後に

明日の執筆者は martin-d28jp-love さんです。
アジャイル開発だけじゃない！ KPTふりかえりのKは感謝状のK! 勝手に心理的安全性ガイドライン。



- 人見知りなエンジニアは褒め言葉が苦手
- どうしても問題解決ばかりに注目してしまう悪い習慣
- 褒め言葉が大事なのは分かるけれど実践しないでしょ、どうにか対策する必要がある
- 親に普段感謝は伝えられなくても、結婚式の感謝状であれば普段言わないことを言うことが出来る
- 白々しい褒め言葉じゃなくてチームやメンバーへの愛情表現が必要
- アジャイル開発チームだけの話ではなく、チームは家族なので愛情表現が足りないと家族が死んでしまう、あなただってそうでしょう？

[https://www.youtube.com/watch?v=R7DDRS12Gxk]








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
マルチカーソル位置に連続する整数/ビットフィールド/アルファベットを挿入するVSCode Extensionを書いた

初めてVSCodeの拡張機能を作成し、公開するに至ったので、ここに記録します:beginner:

# 作ったもの :package:

https://marketplace.visualstudio.com/items?itemName=yo-C-ta.insert-multiple-rows
今回作った拡張機能は、マルチカーソル位置に連続する 10進の正の整数 / 16進数ビットフィールド / アルファベット を挿入するものです。

コードはこちら。
https://github.com/yo-C-ta/insert-multiple-rows/blob/master/src/extension.ts

## 10進(正整)数挿入 :1234:

複数カーソルを挿入して、コマンドを実行すると入力窓が現れます。そこに連番の開始値を入力すると、**カーソルの挿入順に**連番が挿入されます。
下行から上方向にカーソルを挿入していると、値を下から挿入します。

また、設定値 `insertDecimalToMultipleRows.paddingChar` を変更することで、桁数合わせのためのパディング文字を設定することができます。
例えば3行分カーソルを挿入し、開始値を `8` でパディング文字を `'0'` とすると、

```
08
09
10
```

開始文字が `' '` の場合は

```
 8
 9
10
```
となります。

## ビットフィールド挿入 :ten:

10進数挿入と同じように入力窓に`0x`形式で開始値を入力すると、そこからのビットフィールドを挿入します。
桁数は 1/2/4byte までの対応で、カーソル数に応じて自動的に決まります。
`0x80000000`を超えるとロールオーバーします。

同様に3行分カーソルを挿入し、開始値を `0x80`とすると、

```
0x0080
0x0100
0x0200
```

となります。

## アルファベット挿入 :capital_abcd:

使い方は:point_up_tone3:の2つと同じで、窓に入力するとそこからのアルファベット文字を挿入します。こちらも桁数が自動的に上がっていきますが、その際 A ~ Z の26進数として桁上がりします。
`A=0`なので、3行選択して`CA`から始めると`CA` `CB` `CC`となりますが、AAからはじめても0と判断し、単に`A` `B` `C`となります。

同様に3行分カーソルを挿入し、開始値を `Z`とすると、

```
AZ
BA
BB
```

となります。

余談ですが、エクセルはZの次AAになるけど単に26進数だとそうならないので、はたしてどういう実装になってるんだろうか:thinking:

# 〆 :ramen:

VSCode拡張機能開発には前々から興味を持っていてローカルに貯めていたんですが、いろんな人に使ってほしいなと思い、稚拙ながら公開に至りました。
手順としてはほかの方も書かれている通り、思ったより簡単ですが、公開の仕組みやMSのサービスの依存関係がさっぱりわからなかったので、少し勉強してみようかなと思います。

データ作成するときのサンプル名ラベリングとか、組み込み開発するときのビットフィールド定義などなど、本機能がどこかで誰かのお役に立てれば幸いです:rocket:

最後に、拡張機能の作成に関して以下の記事を参考にさせていただきました。
ありがとうございます:relaxed:

- 公式
  - [Example - Hello World](https://code.visualstudio.com/docs/extensions/example-hello-world)
  - [Publishing Extensions](https://code.visualstudio.com/docs/extensions/publish-extension)
  - [Extending Visual Studio Code](https://code.visualstudio.com/docs/extensions/overview)
- 疲れて日本語記事を探し始める...
  - [Visual Studio Code はじめての拡張機能開発](https://qiita.com/rma/items/8c53077d1355ab8fa4c6)
  - [Visual Studio Code 拡張の開発～公開までの流れをザックリ説明してみる](https://yoshinorin.net/2018/05/23/vscode-extension-develop/)
rails console -s が便利な件[Rails]

#**はじめに**
開発をするに当たって、データの流れを確認することは必須ですよね。
その際、モデルクラスの挙動を確認することが多々ありますが、コンソールを立ち上げると簡単に確認できます。
ここでは、railsでコンソールを扱う際の便利なティップスを２つ取り上げます。


#**2つのティップス**

##**rails console --sandbox**

まずは、サンドボックスオプションを使った方法です。

```
rails console --sandbox
```
これは、`rails c -s`と短縮して表現できます。
こちらのコマンドと`rails c`との違いは、**コンソール終了時にデータベースに対する全ての変更をロールバックできる点です**。
ですので、`rails c -s`を使い、試したいモデルの挙動を気軽に確かめることができます。

##**reload!**

次に、コンソール立上げ中に使うコマンドです。
通常、何かデータベースに対して差分が生じた時は`exit`して再度コンソールを起動させる必要がありますが、`reload!`コマンドを実行することによって、一旦エグジットすることなく、差分を読み込むことができます。

```
[3] pry(main)> reload!
Reloading...
=> true
```

#**補足**

テスト、開発、本番、それぞれの環境でコンソールを起動するには、下記のコマンドを実行します。

```
$ rails c -e test
$ rails c -e development
$ rails c -e production
```

#**まとめ**
少しでも役にたったという方は、いいね、お願いします(^^)

# **Rails関連記事**
[正規表現まとめ（基礎）[Ruby編]](https://qiita.com/takuyanin/items/2918ffb3151dcfa88565)
[配列で利用できる主なメソッドをまとめてみた[Ruby編]](https://qiita.com/takuyanin/items/3ca4cd7067b7b9e7e9b6)
[Mysql2::Error: Duplicate entry for key.. エラーを撃退した話(validationの設定)](https://qiita.com/takuyanin/items/b28d5111447d4dedc39d)
[Rails5でJqueryを利用しようとして少しハマった件（Uncaught ReferenceError: $ is not defined）](https://qiita.com/takuyanin/items/24444ec3005098471f3b)
[change_columnでの設定はrollbackできない話(This migration uses change_column, which is not automatically reversible.)[Rails: migration]](https://qiita.com/takuyanin/items/6d51ffb4078a417fed35)
[sessionに保存されたHashを別アクションで利用しようとした際にデータ型の変更によりハマった件[Rails]](https://qiita.com/takuyanin/items/e794e8bdb46287a2a269)
[Railsでfacebookログイン認証機能を実装してみた + エラーの原因はバリデーションだった](https://qiita.com/takuyanin/items/5ebd5d9ac8a0baaa1a8e)
[csvファイルを作成し、初期データを挿入しよう[Rails]](https://qiita.com/takuyanin/items/fd183288d54d2b601df9)
[ArgumentError in ********Controller#send [Rails]](https://qiita.com/takuyanin/items/a14865fda34ff48f5e5a)
[Render and/or redirect were called multiple times in this action...の罠[Rails]](https://qiita.com/takuyanin/items/8aa7a3978a2bb344da59)
PHP 7.3で追加されたis_countableでcountにハマらなくなった話

# はじめに
現在[ユアマイスター株式会社](http://corp.yourmystar.jp/)でインターンをしている@masaki-ogawaです。
以前、[PHP7.2のcountにハマった話](https://qiita.com/masaki-ogawa/items/1671d110b2286ececd09)というQiitaを書かせていただきました。
2018年12月6日に正式にPHP7.3がリリースされました。その中で、新たに`is_countable`関数が追加され、以前の自分で書いた記事よりもスマートに判定できるようになったので、記事を書こうと思いました。

## 今回の記事を書くにあたって
[PHP7.2のcountにハマった話](https://qiita.com/masaki-ogawa/items/1671d110b2286ececd09)は自分へのメモのつもりで書いていましたが、今年の8月ごろから徐々にアクセスが増え色々な方にみていただけるようになりました。
今年で、PHP7.0以前のバージョンのサポートが切れるということで、多くの方がPHP7.2以降のバージョンでのcountのwarningで戸惑ったと思います。(自分もその一人です・・・)
※ちなみに`php 7.2 count`と検索するとトップでヒットします。ありがとうございます。

今回PHP7.3で良さそうな関数が追加されたので記事を書きたいと思います。

## そもそもなぜ、count関数に関する記事を書いたのか？
[PHP7.2のcountにハマった話](https://qiita.com/masaki-ogawa/items/1671d110b2286ececd09)でも書いたように、[ユアマイスター株式会社](http://corp.yourmystar.jp/)では、今年の春にサイトスピード向上のために**PHP5.6からPHP7.2にバージョンアップ**を行いました。詳しい経緯は以下の記事にまとまっています。

[PHP5.6 + CakePHP3 + Apache2.2のECサービスからAMP並のTTFBを実現するまで](https://qiita.com/rintaro-ishikawa/items/d6445cce8c047bc474d8)

その際に、大量のwarningが出るようになり、そのwarningを調べるにあたり、PHP7.2からに`count`関数の扱いがそれ以前バージョンと異なっていることが判明しました。
その際をまとめる上で、上記の**PHP7.2のcountにハマった話**を書きました。

```
Warning (2): count(): Parameter must be an array or an object that implements Countable in file名　line 〇〇
```

※発生したwarning

## 原因はなんだったのか？
`countの引数には配列、もしくはカウントすることができるオブジェクトでなければならない`
という理由で、warningが発生しました。
しかし、今まで、PHP7.2以前ではそんなwarningは発生しませんでした。
以前は

```php
count(NULL); // NULL
count(1); // int
count('I love PHP'); // string
```

これらに対しても0を返していました。


よくよく考えると、NULLって数えられるものではないので違和感があります。

[PHP:count](http://php.net/manual/ja/function.count.php)を確認すると、PHP7.2からは以下の変更が加えられています。

```php
In PHP 7.2.0
count(NULL) returns a warning:
Warning: count(): Parameter must be an array or an object that implements Countable

In previous versions:
count(NULL) returned 0 without any warnings.
```

`countの引数には配列、もしくはカウントすることができるオブジェクトでなければならない`となりました。
この条件に当てはまらない場合は、warningが発生しました。

## 以前の解決法

```php

if (is_array($hoge)) {
    count($hoge);
}
```
でやっていました。
これは`countの引数には配列`という部分をチェックするために、その変数が配列かどうかいうチェックをしていました
配列だった場合、countで要素を数えていました。

## PHP7.3から追加されたis_countableを使ってみる
使い方は簡単で、変数の中身が数えられる値かどうかをチェックするというものです。

```php
if (is_countable($hoge)) {
    count($hoge);
}
```
これで変数の中身が数えられるものであれば、`true`を返し、中の処理に入って行きます。

公式の[is_countable](http://php.net/manual/ja/function.is-countable.php)の中では

`引数が、数えられる値かどうかを調べる`とあり

```php
if (!function_exists('is_countable')) {
    function is_countable($var) {
        return (is_array($var) || $var instanceof Countable);
    }
}
```

このような、関数の中身は上記のようになっています。
単純に引数に渡されたものが、`array`か`countable`かどうかをチェックします。

**PHP7.3ありがとう**

# まとめ
countが使えるかどうかは正直、`is_array`でも`is_countable`を使っても判別できます。
それでも、なんのためにチェックしているのかというのを明確にするために`is_countable`を使った方が良いと個人的には思います。
そのチェックが**配列かどうか知りたい**ということがメインなのか、**countできるのか知りたい**なのかを関数を使い分けることで、コードを読んだ際に明確になると思います。
なので、これからはcountできるか判別する際には、積極的にis_countableを使って行きたいと思います。

# 最後に
現在、エンジニア用Twitterアカウント[@gawa2101](https://twitter.com/gawa2101)を開設しました。
今後、自身のアウトプットを積極的にしていこうと考えているのでフォローしていただけると幸いです。
職種としてのスクラムマスターを調べてみた


# 職種としてのスクラムマスターを調べてみた

スクラムなどは色々日本でも導入が進んでるみたいなので
ちょっとスクラムマスターの職種や募集要項などを調べてみた。  

### 日本とUSの求人数
| サイト         | 検索ワード  | 求人検索結果  |
|:--------------|:---------------|:------------|
| jp.indeed.com | スクラムマスター  | 179         |
| jp.indeed.com | プロジェクトマネージャー  | 12595|
| indeed.com    | ScrumMaster    | 367         |
| indeed.com    | project manager    | 14383         |


### 日本のスクラムマスター推定年収
| 年収 | 検索件数 |
|:---|:---|
|400万円|111|
|500万円|97|
|600万円|70|
|700万円|45|
|800万円|24|

### 日本のプロジェクトマネージャー推定年収
| 年収 | 検索件数 |
|:---|:---|
|200万円|18310|
|300万円|14865|
|400万円|11573|
|600万円|6604|
|700万円|4457|

### USのScrumMasterの推定年収
| 年収 | 検索件数 |
|:---|:---|
|$91,400|156|
|$100,500|129|
|$105,700|114|
|$115,000|63|
|$125,000|33|

### USのprojectManagerの推定年収
| 年収 | 検索件数 |
|:---|:---|
|$65,000| 29190|
|$80,000| 23793|
|$90,000| 18299|
|$100,000| 12508|
|$110,000| 7369|


## まとめ
ある程度予想していた通り一応はPMよりは上位な職種にはなりそう  
ただUSの仕事内容を見ると日本とは違う雰囲気を感じる。 

- 日本ではスクラムを求められる。(XPやリーン、KANBANなどの記載が少ない)
- 海外ではアジャイルの中のスクラムという位置なる。
- SAFeってのが大規模アジャイルでよく出てきたワードだった。

SAFeってのがよく出てきたので今後調べてみたい。

てか日本のPMの２００万ってのが低すぎてこっちもある意味気にはなる。
【PHP】cCRL関数でAPIを叩く

前にも調べた気がする…と思ったら案の定だったので、手元に残しておこうと思った次第。

```php:
<?php

/**
 * APIを叩く(POST)
 *
 * @param string $url
 * @param array $params
 * @return array|bool
 */
function curl_post($url, $params) {
    $ch = curl_init($url);
    if (!$ch) {
        return false;
    }

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);// 証明書の検証をしたくない場合
    curl_setopt($ch, CURLOPT_TIMEOUT, 180);// 3分間待ってやる
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8'));
    curl_setopt($ch, CURLOPT_POST, true);// GETの場合→curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);

    $result = curl_exec($ch);
    if (!$result) {
        curl_close($ch);
        return false;
    }

    if (curl_errno($ch)) {
        curl_close($ch);
        return false;
    }

    $http_code = curl_get_info($ch, CURLINFO_HTTP_CODE);

    curl_close($ch);

    if ($http_code != 200) {
        return false;
    }

    return json_decode($result, true);
}

?>
```

参考
[PHP: 基本的な curl の使用法 - Manual](http://php.net/manual/ja/curl.examples-basic.php)
[PHP: cURL 関数 - Manual](http://php.net/manual/ja/ref.curl.php)
Send json post using php - Stack Overflow https://stackoverflow.com/questions/6213509/send-json-post-using-php
WebAPIを叩く(curl) https://qiita.com/re-24/items/bfdd533e5dacecd21a7a



※この記事は、[アウトプットネタ棚卸し Advent Calendar 2018](https://dosomething.hatenablog.com/entry/2018/12/01/000000) 17日目の記事です。
Keras sequentail の layer addのバージョンによる差

## はじめに
最近、jupyter notebook環境を新しくしたところ、以前動いていたコードが動かなくなりました。
kerasでsequentialでVGG16をaddしたところ、VGG16の中のlayerをget_layerできる、できないの差があるようなので比較してみました。

## やりたかったこと
```python
from keras.applications import VGG16
from keras import models
from keras import layers

conv_base = VGG16(weights='imagenet',
                 include_top=False,
                 input_shape=(128, 128, 3))

model = models.Sequential()
model.add(conv_base)
model.add(layers.Flatten())
model.add(layers.Dense(256, activation = 'relu'))
model.add(layers.Dense(6, activation='softmax'))
```

imagenetの転移学習するためSequenailでVGG16をaddしてmodelを作っていました。

```python
model.summary()
```
summary見ると、こうです。

```
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
vgg16 (Model)                (None, 4, 4, 512)         14714688  
_________________________________________________________________
flatten_1 (Flatten)          (None, 8192)              0         
_________________________________________________________________
dense_1 (Dense)              (None, 256)               2097408   
_________________________________________________________________
dense_2 (Dense)              (None, 6)                 1542      
=================================================================
Total params: 16,813,638
Trainable params: 16,813,638
Non-trainable params: 0
_________________________________________________________________
```

### versionによる差分
#### keras 2.0.4

```python
model.get_layer('block5_conv3')
```

2.0.4ではlayerがとれます

```
<keras.layers.convolutional.Conv2D at 0x7fa995f64710>
```

#### keras 2.2.4
```python
model.get_layer('block5_conv3')
```

2.2.4だとこう出ます

```

ValueErrorTraceback (most recent call last)
<ipython-input-5-511150cd16ae> in <module>
----> 1 model.get_layer('block5_conv3')

/usr/local/lib/python3.5/dist-packages/keras/engine/network.py in get_layer(self, name, index)
    356                 return layer
    357 
--> 358         raise ValueError('No such layer: ' + name)
    359 
    360     @property

ValueError: No such layer: block5_conv3
```

vgg16の中のlayerという取り出し方はできるみたいなんですが。

```python
model.get_layer('vgg16').get_layer('block5_conv3')
```

```
<keras.layers.convolutional.Conv2D at 0x7fc973acb080>
```

Grad-CAMのためにlayerを取り出して勾配をもとめたかったんですが、上記のような取り出し方をしても結局うまく行きませんでした。

おとなしくFunctionalでやります。

version差を確認したjupyter notebookをこっちにいれてあります。

- [keras 2.0.8](https://github.com/hirosemi/penguins_classfications/blob/master/sequential_model_get_layer_keras2_0_8.ipynb)
- [keras 2.2.4](https://github.com/hirosemi/penguins_classfications/blob/master/sequential_model_get_layer_keras_2_2_4.ipynb)
フローチャートで事象を整理しよう

この記事は[Civic Tech お役立ちツールキット Advent Calendar 2018](https://qiita.com/advent-calendar/2018/tk4ct)の17日目の記事です。

CODE for GIFUではIT技術のちょっとした相談事を受け付ける「小さなIT相談室」を月１回程度の不定期で開催しています。2018年12月のテーマがフローチャートだったので、そちらを紹介いたします。

![46922646_1890614737659162_8114327127869882368_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/151569/f2ac8a43-718c-df9e-31a8-6f26ab2e7359.jpeg)

[小さなIT相談室 フローチャートの書き方編](https://www.facebook.com/events/606392869816253/)

## フローチャートとは？
・図形でコードのビジネスロジックを可視化すること
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151569/b1512e91-b7e6-9acf-baae-bd2136b99cbd.png)

主な活用シーン
・プログラム作成前の計画
・プログラム作成後、仕様書として残す

## なぜフローチャートが役立つのか？
本当にエンジニアを目指したいのなら、絶対、フローチャートを学ぶべきです！

例えば、お風呂のお湯を沸かすフローチャートとか、オムレツをつくるフローチャートとか書けるほうが、中途半端なサンプルアプリを動かして満足するより余程役に立ちます。プログラム言語は生ものなのでドンドン新しい言語はでてくるけど、アルゴリズムは不滅だからです。

いまのエンジニアは動くプログラムを書くのは簡単にやってのけますが、設計になると途端に応用が利かなくなることがあります。アルゴリズムより、ライブラリや関数に依存してしまうからです（それはそれで幸せだけど、どこかで頭打ちになります）

また、フローチャートを書くことによって、実現したい事象が整理され、プログラムが整い変更に強いコードを書くことにもつながります。

## フローチャートの書き方
現役のエンジニアがExcelを使った書き方の基本編の資料をつくってくれたので参照してください。

・[フローチャートの書き方編](https://docs.google.com/presentation/d/1P6AnkHRAJsoa573LVtRV9xFHq0Jv5sEbtt9PtfYgeEE)

![48398481_1915348468519122_8474433403763032064_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/151569/8ef89fa2-f391-98e4-f5a1-9d920d4d6f18.jpeg)

イベントでは、いきなりExcelで書き始めるのではなく、まず紙とボールペンで「朝食の準備」のフローチャートを書きました。手で書いてみると処理の粒度がそろっていないことや分岐の条件の設定があいまいなことがよくわかりました。

## いろいろなアルゴリズムを学ぶ

再帰的なアルゴリズムもフローチャートにできます。
https://qiita.com/HMMNRST/items/18a206d56a3425e7717b

考え方を整理するのにきっと役に立つと思いますよ。
GKEからCloudSQLにprivte ipで接続する



## 前置き

Google Cloudのマネージドな YES SQL データベースサービス、CloudSQL。

> CloudSQL
https://cloud.google.com/sql/


WEBサービス自体は Google Cloudのマネージドなkubernetesである、GKE上で動作させるとして

> GKE
https://cloud.google.com/kubernetes-engine/

恒久的に保存すべきデータ、かつYES SQLはCloudSQLを使うのが常道だと思われます。
Spannerというのもありますが、MySQLやPostgreSQL使いたいですよね。よね？

そんなわけでPostreSQLの同時接続数アップ(できればAWS Auroraと同じくらい景気良く)、そしてバージョン11への対応お待ちしております。
テーブルのパーティショニング使いたいんです。

はい。
そんなわけでCloudSQLを使うとして、心情的なハードルとなるのがその接続方式。
なんとCloudSQLはエンドポイントがGlobal IP持っちゃってるんですよ。
接続をきちんと限定すればセキュリティは確保できるとはいえ、AWS RDSに慣れ親しんだ身からすると、そうじゃなくても常識的に考えて、結構衝撃的な仕様だと思います。
本来ネットワークの奥深くに隔離されているべきもの。そういう認識ですよね。

そのエキセントリックな仕様のCloud SQLに Private IP接続機能が追加されました。ベータですけれども。

![gke.png](https://qiita-image-store.s3.amazonaws.com/0/74328/063075e8-489a-2dc4-ffd1-535b4dff010a.png)



接続がグローバルじゃなくなる以外にも、**ネットワークレイテンシが短縮される**という、DBにとって超嬉しい特典もあります。
これはベータだろうが絶対使わねばならん、ということで検証しましたが、どうにもGKEから接続するノウハウが見つからない、ということでまとめてみました。


## VPCを作成する

GKEクラスタを作成するVPCを作成します。変数になっている部分は適切な値を入れてください。
このVPCを通してCloudSQLにアクセスするわけですが、firewall的に特別なポートを開ける必要はありませんでした。(3306とか)

```sh

gcloud compute networks create $NETWORK_NAME --subnet-mode custom

gcloud compute networks subnets create $SUBNNET_NAME \
    --network $NETWORK_NAME \
    --region $REGION \
    --range $RANGE

gcloud compute firewall-rules create ${NETWORK_NAME}-rule01 --network $NETWORK_NAME --allow tcp:80,icmp

```

## GKEクラスタをつくる

コンテナの足回りであるクラスタを構築します。変数になっている箇所は以下同文。
プリエンティブはお好みですが、クラスタをVPC-Nativeにする必要があります。


> Connecting from Google Kubernetes Engine
https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine

そのために以下の設定が必要です。

```sh
    --enable-ip-alias \
    --cluster-ipv4-cidr=/16 \
    --services-ipv4-cidr=/22 \
```

ここテストに出ます。

```sh
gcloud container clusters create $CLUSTER_NAME \
    --zone=$ZONE \
    --cluster-version=1.11.2-gke.18 \
    --network=$NETWORK_NAME \
    --subnetwork=$SUBNNET_NAME \
    --enable-ip-alias \
    --cluster-ipv4-cidr=/16 \
    --services-ipv4-cidr=/22 \
    --num-nodes=$NUM_NODES \
    --machine-type=$CLUSTER_MACHINE_TYPE \
    --no-enable-basic-auth \
    --no-issue-client-certificate \
    --metadata disable-legacy-endpoints=true \
    --preemptible

```

## DBをつくる

CloudSQL上にDBを構築します。変数になっている箇所は以下同文。
なんとおそるべきことに gcloudからPrivate IPをONにする方法は見つかりませんでした...。
DBを作成した後、Google Cloud Console上からPrivate IP接続に切り替える必要があります。
その際に、GKEクラスタが載っているVPCを指定してください。
わかりやすいので迷わないとは思いますが、それなりに時間がかかります。


もし**gcloudコマンドから private IP接続を有効にする方法**をご存知の方がいましたら、ぜひコメントください！


```sh
gcloud sql instances create $INSTANCE_NAME \
    --async \
    --availability-type=zonal \
    --database-version=POSTGRES_9_6 \
    --region=$REGION \
    --cpu=$DB_CPU \
    --memory=$DB_MEMORY \
    --storage-size=$DB_STORAGE_SIZE \
    --storage-type=$DB_STORAGE_TYPE

```

あとは、発行されたPrivateIPアドレスを指定してコンテナからDBに接続するだけです。
このIPもgcloudで取得できたらいいんですが、まだやりかたわかっておりません。



## 注意

ベータゆえ注意書きにも書いてあるのですが、ここで使用したVPCは削除できなくなります。
私は調子こいて何度も再作成を繰り返していたのですが、6回目の試行でVPC作成上限(Global quotaで5)にひっかかり、プロジェクトごと再作成するハメになりました🤣
Object detection実装：anchor decoder実装

前回までは、学習が最低限開始できるまでの学習パイプラインを実装した。

今回の[コミット](https://github.com/festa78/objdet-tf/commit/67d20ea6fdc8d57c9e12b9195c8c0d3d7fbe0568)では、
学習結果の評価及び可視化のために必要な処理の一つとして、anchor regression結果のdecoderを実装した。

anchor regressionは与えられたboxテンプレート群であるanchor priorから、
真値であるanchor targetのbox位置への変分を予測したものである。
従って、anchor regressionの真値であるanchor regression targetをanchor targetから作成（encode）する際に利用した
同じanchor priorを利用して、予測結果であるanchor regressionから画像原点から見たbox位置へ復元する。

この時、encode時に利用した変換ルールを用い、逆に適用する事でencodeとdecodeで可逆性を持った処理を行えるようにする。
SlackとZoomを使ったロケーションに依存しないふりかえり方法

この記事は[TIS Advent Calendar 2018](https://qiita.com/advent-calendar/2018/tis)の 16日目です :santa:

どうも、@tenten0213 です。

私が所属する開発チームは、東京5名、大阪1名で構成されています。
タイトルに`ロケーションに依存しない`と書いているのですが、東京、大阪のロケーションの違いを意図しています。

弊社はリモートワークOKなのですが、開発チームのメンバーは出社していることがほとんどです。
MacBook Pro メモリ32GB, Core i9を買ってもらったので、家より快適っていうのもあるのかもしれませんが…:sweat_smile:

ただ、家でメールや事務処理を片付けてから出社したり、この日はリモートワークすると決めて働いているメンバーもいます。特に縛りはなく、各人の裁量で行っています。(ルール上会社のPCにRDPして働くことが求められているため、開発するのは厳しく、事務作業やドキュメント作業などがメインになりがち…)

私のチームは、開発プロセスにスクラムを採用しています。
ロケーションが離れたなかで、どうコミュニケーションを取っているか、特にふりかえりについて書きたいと思います。

![slack_zoom.png](https://qiita-image-store.s3.amazonaws.com/0/6092/6a4582ba-a189-865a-458f-6745273a5bfb.png)


## 通常のふりかえり

スクラムでは1スプリント毎にふりかえり(レトロスペクティブ)を行います。
ふりかえり方法は特に規定されていませんが、自身はKPTで行うことが多いです。KPTは、Keep, Problem, Tryの略です。Keepは良かったこと、続けたいこと、Problemは悪かったこと、問題だと感じていること、Tryは次に試したいことをあげます。

KPTやふりかえりの具体的な方法については以下が参考になります。

* [これだけ! KPT](http://amzn.asia/d/hyTCR1M)
* [ふりかえりガイド](http://objectclub.jp/download/files/pf/RetrospectiveMeetingGuide.pdf)

ロケーションが離れていない場合は、模造紙と付箋を利用してKPTを行っていました。
各人が付箋にKeepを書き、内容を共有、Problemを付箋に書き、共有…といった流れです。

## ZoomとSlackを使ったロケーションに依存しないふりかえり

冒頭で書いたとおり、開発メンバーが東京、大阪とロケーションが別れています。
では、普段どうやってコミュニケーションを取っているかというと、SlackとZoomを使っています。全社にZoomが導入されたので、毎朝のデイリースクラムもZoomを利用して行っています。タスク管理はJIRAを使っているのですが、Zoomで画面共有しながら話せるのでかなり便利です。

ふりかえりは、ロケーションが離れているため模造紙や付箋を使うことができません。

そこで、普段利用している　SlackとZoomを利用してふりかえりを行ってみました。

### やりかた

ふりかえり方法は変更せず、KPTです。

後からの見返しやすさを考慮し、SlackにKPT用のチャンネルを用意しました。
また、Zoomで画面や音声、ビデオを共有して行っています。

まず、今回のスプリントを思い返しながら「こんなことやったよね」と共有します。1週間だと割と覚えているのですが、2週間以上のスプリント期間だと実施したことを忘れがちなので…
私のチームはJIRAを使っているので、JIRAの画面を共有しつつスプリントで実施した内容を簡単にふりかえりました。

次に、以下のようにSlackでKeepをあげていきます。
付箋を使ってふりかえりを行う際は、書ききった後にチームで共有することが多かったのですが、Slackではドンドン書き込んでもらうようにしました。この時、絵文字でリアクションすると盛り上がって良いです。先に書かれちゃったなって時もリアクションすると参加している感がでます。

<img width="653" alt="kpt_k.png" src="https://qiita-image-store.s3.amazonaws.com/0/6092/d17adb48-a62e-90ae-58af-6660b9f9cf12.png">

Keepをあげきった後に、自分が書いた内容をチームに共有します。この時、ファシリテーターはZoomで繋いでいる先にも声をかけるのを忘れないようにしましょう。(1度忘れました…)

後は同様の流れでProblem、Tryを実施していきます。

<img width="651" alt="kpt_p.png" src="https://qiita-image-store.s3.amazonaws.com/0/6092/1d90c4ae-6b48-a3f2-116c-4703117b9d97.png">

### 良い点

* 物理的に距離が離れていてもチームでふりかえりを行える
* 絵文字でのリアクション便利
  * 積極的じゃない人もリアクションなら付けやすい
* 見返しやすい

### 悪い点

* その場でグルーピングできない(付箋なら簡単)
* タイピング速度重要
  * スマホでZoom繋ぐと大変そう
* すぐ目につくとこに置くようなことができない(物理じゃないので)
* 表情や仕草など文字以外の情報が読み取りづらい
  * Zoomで繋いでいるとはいえ、全員映せなかったり…

## その他(おまけ？)

プロダクトバックログアイテムの見積もりもSlackとZoomを使って行っています。プロダクトバックログアイテムはJIRAで管理しています。

見積もりはプランニングポーカーで行っており、プロダクトバックログのタイトルをコピーしSlackに貼り付け、絵文字リアクションの数字で見積もっています。
…意外と便利です。

<img width="538" alt="planning.png" src="https://qiita-image-store.s3.amazonaws.com/0/6092/48c4affa-6b3e-1df3-599c-f37f3de0076c.png">

## まとめ

昨今リモートワークが当たり前になりつつあり、弊社のようなSIerも実施をはじめています。
しかし、アプリケーション開発はチームで行うことが多く、密にコミュニケーションを取る必要があります。

SlackやZoomのようなツールによって、ロケーションが離れているメンバーとのコミュニケーションの敷居が急速に下がってきています。このようなツールを便利に使い、効率よく効果的なコミュニケーションを取っていきたいです。

くれぐれもツールを使うことが目的にならないように！(自戒)
素人がReact Nativeに入門しようとして辞めた理由

# はじめに
私は職業プログラマではありませんし、React Nativeとかを技術面で評価できるようなアプリ開発実践経験も特にありません。
いろいろ情報を漁って、まあ今からやらなくてもいいか、となった経緯をつづります


# AirBnB、React Native辞めるってよ
* [2018 年 6 月の React Native 事情とポエム](https://qiita.com/janus_wel/items/f3640c7d7ca4c4fc388a)
  * AirBnB OUT, Microsoft IN.
  * Facebook: 「React Native は大幅な再設計をする」  
* [一部の企業でReact Native離れが始まる](https://tech.nikkeibp.co.jp/it/atcl/idg/14/481709/082000458/)
  * AirBnB、Udacityが利用撤退
  * Discordは不具合あるものの利用継続 

特に、AirBnBの[撤退記事和訳](https://github.com/react-native-jp/react-native-at-airbnb-jp-translation/blob/master/3-building-a-cross-platform-mobile-team.md#react-native%E3%81%AFnative)の
> React NativeはNative
よくある思い違いはReact NativeがあればNativeコードを一切書かなくても良いという思い込みです。...

の部分が私としては厳しいです。Nativeコードを書きたくないから興味を持ったので。

# PWAでよくなか？
* [ネイティブアプリ と Progressive Web Apps ( PWA ) のどちらを選択するか](https://qiita.com/chanuu/items/1296a85df4f11e19e494)
* [iOSの11.3からのPWA対応でできるようになったこと](https://medium.com/@takeshiamano/ios%E3%81%AE11-3%E3%81%8B%E3%82%89%E3%81%AEpwa%E5%AF%BE%E5%BF%9C%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8-313f638a172b)
    * 環境差はもちろんPWAでもありますよね 
* [PWAがもたらすこれからのwebの姿](https://mya-ake.com/slides/pwa-will-provide-future-web) 
    * これ読んでると少なくとも将来にはPWAで十分なんじゃと思いました 
    * ハードウェアアクセスも大体できそう

という訳で、React Nativeへの入門は辞めました。
Serverless framework と Lambda + API Gateway でサーバーレスな動的サイトをつくる

Serverless Framework と Lambda + API Gateway でサーバーレスな動的サイトを構築する方法を紹介します。

いろいろと試行錯誤が必要でしたが、できあがってみれば意外と簡単でした。

あと、この方法ではローカルでも動作確認ができるのでサクサクと開発できると思います。

## セットアップ

なにはともあれ `npm init`。

その後、以下のモジュールをインストールしてください。

```
$ npm install serverless serverless-offline --save-dev
```

`serverless-offline` というモジュールは Serverless Framework のプラグインで、これを使用するとローカルでアプリを実行することができます。

あと、`package.json` の `scripts` に、以下のような感じの項目も追加。

```
  "scripts": {
    "start": "sls offline start",
    "deploy": "sls deploy --stage dev",
    "deploy:prod": "sls deploy --stage prod",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
```

テストはお好みでどうぞ。

## Serverless Framework の設定

必要最小限な構成は以下の通り。意外と簡単！

```
service: serverless-cms
frameworkVersion: ">=1.29.2 <2.0.0"

plugins:
- serverless-offline

provider:
  name: aws
  runtime: nodejs8.10
  memorySize: 512
  region: ap-northeast-1

functions:
  api:
    handler: handler.app
    events:
      - http:
          path: /
          method: get
      - http:
          path: /{any+}
          method: get
```

この例では、Lambda Proxy を使っていて、すべての URL に対するリクエストを `handler.app` でキャッチしています。

あとは、`handler.app` でレスポンスヘッダーやコンテンツをゴニョゴニョする感じです。

## ラムダ関数の例

以下のソースを `handler.js` というファイル名で保存してください。

```
'use strict';

module.exports.app = (event, context, callback) => {
  callback(null, { 
    statusCode: 200, 
    body: `<html><head><title>Hello World</title></head><body>
            <h1>Hello World!</h1>
            <pre>${JSON.stringify(event, null, 2)}</pre>
            </body></html>`, 
    headers: { 
        "Content-Type": "text/html" 
      } 
    }
  );
}
```

`callback()` の第二引数に渡している連想配列で、ブラウザで表示するためのコンテンツを定義しています。

スタータスコードとHTMLコンテンツ、あとレスポンスヘッダーを指定できるので、必要なことはなんでもできそうですね。

この例では、どんな URL にアクセスがあっても 200 を返していますが、実用的なウェブアプリにするには、`event.path` で判別してレスポンスヘッダーを適切にコントロールする必要があります。

## ローカル環境での動作確認

上で、`package.json` に `npm start` 用のコマンドを追加していればそれを叩くだけです。

```
$ npm start
```

ローカルでの開発環境が手軽に立ち上がるのはかなりうれしいですね。

## AWS へのデプロイ

以下のような感じで、AWS のクレデンシャルを環境変数として設定。

```
$ export AWS_ACCESS_KEY_ID=xxxx
$ export AWS_SECRET_ACCESS_KEY=xxxx
```

僕はプロジェクトディレクトリごとに `direnv` で設定する方法がお気に入りです。

以上が終わったらデプロイ用のコマンドを実行しましょう。

```
$ npm run deploy
```

コマンド出力の最後に以下のような出力があるので、その URL にアクセスすればオッケーです。

```
Service Information
service: serverless-cms
stage: dev
region: ap-northeast-1
stack: serverless-cms-dev
api keys:
  None
endpoints:
  GET - https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
  GET - https://xxxx.execute-api.ap-northeast-1.amazonaws.com/dev/{any+}
functions:
  api: serverless-cms-dev-api
layers:
  None
```

上で紹介した `package.json` の記述例ではステージングと本番を切り替えてデプロイすることも想定しています。

本番にデプロイするには、以下のような感じです。

```
$ npm run deploy:prod
```

## サンプル

今回紹介したサンプルのリポジトリは以下です。

https://github.com/miya0001/serverless-webapp
Windows10 + Tensorflow + GPU環境構築の個人記録

#インストールに必要な情報

参考にしたサイトとか手順をメモ

[Keras & Tensorflow (GPU有)の環境構築 on Windows with Anaconda](https://ossyaritoori.hatenablog.com/entry/2018/03/27/Keras_&_Tensorflow_(GPU%E6%9C%89)%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89_on_Windows_with_Anaconda)
全部ここに従えば大丈夫です。
ただ、僕が知識なさ過ぎてミスがあったりして躓いただけです…

Anaconda3はもともと入れてあった。
バージョンについては、よくわからなかったので参考サイト準拠
ただし、cuDNNは7.4.1 for CUDA9.0があったのでそれを使った。

環境変数は、「システムのプロパティ＞環境変数」で、~~システム環境変数に新規でcudnnを追加し、cudaのbinを追加した。~~
ユーザー環境変数のPathにcudaのbinを追加した。
こういうのGUIでできるのは手軽でいいですね。

Anaconda PromptでTensorFlowをインストールする際、ドライブの書き込みが終わってるのに終了表示ないなーと思ってたら、Enter一回売ったら出ました。
これってどういう仕様なんだろう…

あと、Bash on Windowsもインストール。
BashからもPython叩きたいなーと思ったんだけど、デフォルトだと起動しなかったのでこちらを参照
[Git bash 上から Python インタプリタを起動する](https://qiita.com/cointoss1973/items/a0da81df10f8cc04c83e)
今回は、Anacondaで作ったtensorflow用の仮想環境を直接叩きたかったので、
`~/.bashrc`に、
`alias python='winpty H:/Anaconda3/envs/tf35/python.exe`
のように書いた。


## ダサい失敗メモ
同じ轍を踏む人がいないように。
先に結論を言っておくと、環境変数の設定をミスっていた。
> 環境変数は、「システムのプロパティ＞環境変数」で、ユーザー環境変数のPathにcudaのbinを追加した。

ここをはじめは「システム環境変数に新規でcudnnを追加し、cudaのbinを追加」にしていたのが原因です。


さていよいよtensorflow動かしてみようと思ったら、importでエラー発生。
`ImportError: DLL load failed: The specified module could not be found.`だったと思う。
必要なモジュールが読み込めないとかなんと出て、エラー内容に従うままにリンクをたどった。
[Win10: ImportError: DLL load failed: The specified module could not be found #22794](https://github.com/tensorflow/tensorflow/issues/22794)

同じようなエラーの人たちがいて、「俺はこれで解決したぜ」みたいな情報もちょこちょこあった。
基本的にはCUDAのバージョンとか初めのリンクにあった通りで全然わからなかった。
ただ、tensorflowのバージョンを1.12.0で動いたぜって人のほかに、1.10.0で動いた人もいたので試してみることに。
`pip install tensorflow-gpu==1.10.0`
で、再びimportを試してみたら、エラーが変わって、
`cudnn64_7.dllが見つからないよ！`（正確に覚えてないので意訳）というメッセージになった。
さすがにこうなると、「環境変数の設定違ってたんじゃね？」ということでここを見直したら無事起動しました。

で、「そもそも環境変数が悪かったのが原因なら、tensorflowのバージョンも1.12.0でいいのでは？」となって再びバージョンを戻したら無事に行けた、という感じです。

結局のところ、
[Keras & Tensorflow (GPU有)の環境構築 on Windows with Anaconda](https://ossyaritoori.hatenablog.com/entry/2018/03/27/Keras_&_Tensorflow_(GPU%E6%9C%89)%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89_on_Windows_with_Anaconda)
の情報をありのまま再現できれば大丈夫だった。というダサい失敗でした。


やっとこさ構築ができたので、ちょっとずつ触っていきたいですね。
[android-architecture] Clean Architectureを読んでみる

# はじめに

この記事は、[以前の記事](https://qiita.com/tak-wisteria/items/fe5674568bc68bec72cd)の続きです。
[GoogleSamples（android-architecture）](https://github.com/googlesamples/android-architecture)を斜め読みして筆者が印象に残った内容を書きます。

### バックナンバー
[1. Model-View-Presenter(MVP)+αを読んでみる](https://qiita.com/tak-wisteria/items/fe5674568bc68bec72cd)
[2. Clean Architectureを読んでみる](https://qiita.com//tak-wisteria/items/c0f42fff98eef169f641)
[3. MVVM & DataBindingを読んでみる](https://qiita.com//tak-wisteria/items/6c9e2e41ea01c8d63f89)
[4. MVVM & LiveDataを読んでみる](https://qiita.com/tak-wisteria/items/419cc117cdcf94909430)

# [MVP - Clean Architecture](https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/)

「Clean Architecture」のキモとして「UseCaseパターン」が使われています。
MVPは[以前の記事](https://qiita.com/tak-wisteria/items/fe5674568bc68bec72cd)と同じなので、異なる部分だけ要約します。

```java:パッケージ構成
com.example.(...).xxx;
com.example.(...).xxx.domain;
com.example.(...).xxx.domain.model;
com.example.(...).xxx.domain.usecase;
...
domain パッケージにビジネスロジックを集約する感じ。
```

google samplesのユースケースは通信を主体にしたロジックの様なので、RequestValue, ResponseValueというinner classを定義しています。
汎用的に考えると、各ユースケースの in / out のベースクラスを定義して高い抽象化を実現したいのだと思います。

```java:UseCase
public abstract class UseCase<Q extends UseCase.RequestValues, P extends UseCase.ResponseValue> {
    public interface RequestValues { /* 空定義 */}
    public interface ResponseValue {/* 空定義 */}
    public interface UseCaseCallback<R> {
        void onSuccess(R response);
        void onError();
    }
}
```

ユースケースの対象となるモデルを定義し、ユースケース毎にモデルの処理を定義していきます。
サンプルコードでは、モデルを「Task（やるべき作業）」として、ユースケースは「Get, Add, Complete」等としています。

Task + Get = GetTask　→　タスクを取得する
Task + Add = AddTask　→　タスクを追加する
Task + Complete = CompleteTask　→　タスクが完了した

分かりやすいですね。
車なら「モデル：Car、ユースケース：Ignite（エンジン点火）、Run（走る）、Idling（アイドリング）、Fueling（給油）」
人なら「モデル：Person、ユースケース：Sleep（寝る）、Eat（食べる）、Work（働く）、Vacation（休暇）」

プログラムとしては、以下の構造になっています。分かりやすいよう、独自のコードで表現します。

```java:モデル
package com.example.(...).xxx.model;
public class Car {}
```

```java:ユースケースの実態クラス
package com.example.(...).xxx.usecase;
public class IgniteCar extends UseCase<IgniteCar.InputValues, IgniteCar.OutputValue> {
    public static final class InputValues implements UseCase.InputValues {...}
    public static final class OutputValue implements UseCase.OutputValue {...}
}
```

# いかがでしたでしょうか
UseCaseパターンはビジネスとの親和性が高く、ビジネスの良し悪しがパッケージ / クラス構成の良し悪しに出てきそうですね。
（ソースや設計がイケてない　→　ビジネスモデルがイケてない！？）
Pepperに赤鼻のトナカイを歌わせてみる

前にPepper標準搭載の音声合成だけで赤鼻のトナカイをおうたを歌わせてみた時の内容です。

## Say boxの中身
歌っているパートは３つのSay boxに分割して実装しています。

```
\rspd=72\\vct=137\マッッカぁ菜\rspd=84\\vct=125\オォッ\vct=182\ハァッ\vct=140\ナァァッッ\rspd=60\\vct=138\ノォーーーーーォっっ、
```
```
\rspd=70\\vct=144\とぉ仲ぁいサぁぁ\rspd=95\\vct=180\ンーーー\rspd=70\\vct=160\ワァーーーーーぁぁッッ、
```
```
\rspd=76\\vct=115\いッッ\vct=120\ツーーもみーーィ\vct=164\ンンッ\vct=145\なーーぁ\vct=127\のーーーーーぉォッっ、\rspd=79\\vct=125\ワーぁァ\vct=149\ラーぁァ\vct=136\イーぃィ\vct=145\モーぉォ\vct=110\のーーーーーーぉォッッ、、
```
```
\rspd=80\\vct=170\メリーーぃぃぃクリ酢魔ーーーーーーァス、
```


## 完成品

[![赤鼻のトナカイ](https://qiita-image-store.s3.amazonaws.com/0/65230/40d1ccd5-bea5-8f54-c975-7cc530808b43.png)](https://youtu.be/2pXNIae0W3c)
※ノリで[SoftBank Robot World 2017](https://www.softbank.jp/robot/special/robot-world/)の出展コンテンツに忍ばせた時のものです。

## Sayで歌わせる時のポイントとか
### 選曲は音域狭めのもので
Pepperには声の高さを調整するタグ「vct」がありますが、パラメータが50~200の間でしか使えません。
感覚的にはだいたい１オクターブちょっとの音域に収まるくらいの曲であればPepperでも歌える印象です。
ただしPepperの音域で出せる音に合わせてあげる必要があるため、実際の曲の音程に合わせるのは難しい場合が多いです。

音声調整用タグの詳細については[公式ドキュメント](http://doc.aldebaran.com/2-5/naoqi/audio/altexttospeech-tuto.html)を参照してみてください。

### boxはワンフレーズずつboxを分ける
Pepperの声は前後の文字が変わるとイントネーションが変わったり、想定していない間が出現したりします。
文字数・調整タグ数が増えるほどSayが不安定で調整が難しくなるため、可能な限りboxは小分けにして、１box内の文字数を減らすと前後の文字に影響されにくくいい感じに調整できます。

<img width="768" alt="akahanaSay.png" src="https://qiita-image-store.s3.amazonaws.com/0/65230/f040ecaf-a295-09a4-b9e3-0a30dacc5094.png">


### 長音調整は長音符と小さい文字と「、」で
長音調整はPepperの音声調整で一番クリエイティブかつ経験値が出やすい作業です。
「お鼻の〜♪」の「の〜」とか、「トナカイさんは〜♪」の「は〜」とか、この辺を色々組み合わせることで微妙な長短や音の下がり具合を調整することができます。

・長音符「ー」
・小さい「ぁぃぅぇぉゃゅょ」「ァィゥェォャュョ」
・小さい「っ」「ッ」
プラス最後は絶対「、」。


私の鉄板パターンはこれです。
`　長音府「ー」＋ひらがなの小さい文字＋カタカナの小さい文字＋カタカナの「ッ」(2つ以上)＋「、」　`
`　例）のーーーーーーぉォッッ、`

これの組み合わせがいちばん一定の音程を保っていつまででも伸ばせるので
これを基本形にしてちょっとずつ「ッ」と「っ」の組み合わせやカタカナひらがなの比率を変えて調整することが多いです。

ちなみに最後が「。」でも「！」でもないのは、「、」が一番イントネーションや前後の発音に影響を与えないためです。
歌でなく普通に喋らせる場合も、同様の理由で「、」以外の句読点は使用しないことオススメします。

※短いものであれば調整タグvctを使いまくる手もありますが、使いすぎると変な間ができて不安定になったり、１個vctの値を変えると他のvctタグも全て調整し直したりする必要があるため、個人的にはオススメしません。


　
　
それでは素敵なX'masを。
Node.js v11.4.0リリースノート

https://nodejs.org/en/blog/release/v11.4.0/

##console,util
- console functions now handle symbols as defined in the spec.
    - '%d'、'%f'、'%i'にSymbolを渡すと'NaN'が返ってくるようになった
- The inspection depth default is now back at 2.
    - util.inspect()のオブジェクト表示のデフォルトの深さが20から2に戻った

##dgram,net
- Added ipv6Only option for net and dgram.
    - net、dgramにipv6Onlyという、ipv6だけを受け入れるオプションが追加された

##http
- Chosing between the http parser is now possible per runtime flag.
    - v11.2.0でサポートされたllhttpというhttp parserと、今までのものを実行時オプションで指定できるようになった

##readline
- The readline module now supports async iterators.
    - readlineモジュールがasync iteratorに対応した

#repl
- The multiline history feature is removed. 
    - replからmultilineHistoryを削除？

##tls:
- Added min/max protocol version options. 
    - TLSのプロトコルバージョンの最大、最小を指定できるようになった
- The X.509 public key info now includes the RSA bit size and the elliptic curve.
    - TLSの公開鍵証明書にRSA bitサイズとECC暗号化に使う楕円曲線の情報を載せるようになった

##url:
- pathToFileURL() now supports LF, CR and TAB.
    - url.pathToFileURL()が\n、\r、\tに対応した

##Windows
- Tools are not installed using Boxstarter anymore.
    - PythonやVisualStudio等のWindows用インストーラーがBoxstarterではなくChocolateyを使用するようにした
- The install-tools scripts or now included in the dist.
    - Windows用インストーラーのスクリプトをzip形式で配布するようになった？
合成数列の和アドベントカレンダーTypeScript編

これは、[合成数列の和 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/composite-number) の第18日目の記事です。

今回は `TypeScript` 編になります。

# ルール
* 入力として正の整数 N を与えたら 4 から始まる [合成数](https://ja.wikipedia.org/wiki/%E5%90%88%E6%88%90%E6%95%B0) の数列の 1 番目から N 番目までの合計を出力してください
* N は最大で 100 とします

上記から、

* 4以上の偶数は合成数なので足す
* 2以外の素数は合成数ではないので足さない

ということがわかるので、これを考慮したコードを書けば良い。

# 実装（TypeScript）

```ts:TypeScript
// 素数判定
function isPrime(n: number): boolean {
   if (n < 2) return false;
   if (n === 2) return true;
   if (n % 2 === 0) return false;

   for (let i = 3; i*i <= n; i += 2){
      if (n % i === 0) return false;
   }
   return true;
}

// 合成数の取得
function getCompositeNumber(indata): number {
   const num = 4;
   let composites = 0;
   let sum = 0;
   while (composites < indata) {
      if (!isPrime(num)) {
         composites++;
         sum += num;
      }
      num++;
   }
   return sum;
}

// 入力された値を取得
const indata = process.argv[2];
// 合成数の表示
console.log(getCompositeNumber(indata));
```
まぁ、あの、ね…はい。ほぼほぼ `JavaScript` ですよね…自分でも自覚してます…
一応これを `JavaScript` に変換したものも載せておきます。

```js:JavaScript
// 素数判定
function isPrime(n) {
    if (n < 2)
        return false;
    if (n === 2)
        return true;
    if (n % 2 === 0)
        return false;
    for (var i = 3; i * i <= n; i += 2) {
        if (n % i === 0)
            return false;
    }
    return true;
}
// 合成数の取得
function getCompositeNumber(indata) {
    var num = 4;
    var composites = 0;
    var sum = 0;
    while (composites < indata) {
        if (!isPrime(num)) {
            composites++;
            sum += num;
        }
        num++;
    }
    return sum;
}
// 入力された値を取得
var indata = process.argv[2];
// 合成数の表示
console.log(getCompositeNumber(indata));
```

（変換したものをそのまま貼っつけたので、改行とか整形されてます）

`TypeScript` の実行環境を用意するのが面倒な方、サクッと試してみたい方は、無料の `Playground` を使ってみると良いです。参考までに、２つリンクを載せておきます。

* [Playground・TypeScript](https://www.typescriptlang.org/play/)
* [TypeScript playground](https://agentcooper.github.io/typescript-play/)

# 出力

```bash

$ node composite_number.js 2
10
$ node composite_number.js 4
27
$ node composite_number.js 10
112
$ node composite_number.js 100
7059
```

# 参考

- [スタート記事](https://qiita.com/tbpgr/items/971f006b62621a44d7f2)
- [JavaScript編](https://qiita.com/ariaki/items/bb4c8cff9a994f8e148e)
- [TypeScript公式サイト](https://www.typescriptlang.org/)
Node.js v11.3.0リリースノート

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V11.md#11.3.0

#deps
- Upgrade to OpenSSL 1.1.0j, fixing CVE-2018-0734 and CVE-2019-0735
    - OpenSSL更新
    
#http
- Headers received by HTTP servers must not exceed 8192 bytes in total to prevent possible Denial of Service attacks. Reported by Trevor Norris. (CVE-2018-12121 / Matteo Collina)
    - HTTPサーバーが受信するヘッダーが最大8KBに制限された
- A timeout of 40 seconds now applies to servers receiving HTTP headers. This value can be adjusted with server.headersTimeout. Where headers are not completely received within this period, the socket is destroyed on the next received chunk. In conjunction with server.setTimeout(), this aids in protecting against excessive resource retention and possible Denial of Service. Reported by Jan Maybach (liebdich.com). (CVE-2018-12122 / Matteo Collina)
    - HTTPヘッダー受信に40秒のタイムアウトが設定され、それを過ぎた後にチャンクを受け取るとソケットが破棄されるようになった

#url
- Fix a bug that would allow a hostname being spoofed when parsing URLs with url.parse() with the 'javascript:' protocol. Reported by Martin Bajanik (Kentico). (CVE-2018-12123 / Matteo Collina)
    - url.parse()のホストネームが偽装できたバグを修正
Node.js v11.2.0リリースノート

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V11.md#11.2.0

#deps
- A new experimental HTTP parser (llhttp) is now supported.
    - llhttp(HTTP parser)をサポート


#timers
- Fixed an issue that could cause setTimeout to stop working as expected.
    - timersのremoveAtのバグ修正

#Windows
- A crashing process will now show the names of stack frames if the node.pdb file is available. 
    -  node.pdbがある場合クラッシュ時にスタックトレースの情報が詳細に
- Continued effort to improve the installer's new stage that installs native build tools. 
    - インストール用スクリプトを改善？

#child_process:
- On Windows the windowsHide option default was restored to false. This means detached child processes and GUI apps will once again start in a new window.
    -  Windowsが子プロセスのコンソールウィンドウを作成した時、デフォルトではそれを非表示にしないように変更
Node.js v11.1.0リリースノート

https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V11.md#11.1.0

#deps
・Updated ICU to 63.1.
　unicode関連のライブラリ更新

#repl
・Top-level for-await-of is now supported in the REPL.
　REPLでfor-await-ofが使用可能に

#timers
・Fixed an issue that could cause timers to enter an infinite loop.
　timersで無限ループが発生するバグの修正