OmniAICreator/Qiita-1.07M huggingface dataset:
OpenSSL　opensslで自己署名SSL証明書をPromptとのやり取りなしに発行する方法

## 自己署名SSL証明書の発行コマンド

以下の項目が揃っていれば、一発で発行できます。

```
openssl req -newkey rsa:4096 \
            -x509 \
            -sha256 \
            -days 365 \
            -nodes \
            -out nginx_selfsigned.crt \
            -keyout nginx_selfsigned.key \
            -subj "C=JP/ST=Tokyo/L=Minato/O=42Tokyo/CN=localhost"
```

### 各フラグの意味

name | description
--- | ---
-newkey rsa:4096 | Creates a new certificate request and 4096 bit RSA key. The default one is 2048 bits.
-x509 | Creates a X.509 Certificate.
-sha256 | Use 265-bit SHA (Secure Hash Algorithm).
-days 365 | The number of days to certify the certificate for. You can use any positive integer.
-nodes | Creates a key without a passphrase.
-out example.crt | Specifies the filename to write the newly created certificate to. You can specify any file name.
-keyout example.key | Specifies the filename to write the newly created private key to. You can specify any file name.
-subj | User Information

### -subjフラグの詳細

name|description
--- | ---
C= | Country name. The two-letter ISO abbreviation.
ST= | State or Province name.
L= | Locality Name. The name of the city where you are located.
O= | The full name of your organization.
OU= | Organizational Unit.
CN= | The fully qualified domain name.

※The fully qualified domain name.とは、完全修飾ドメイン名。ホスト名が省略されていないドメイン名のこと

## おまけ　SSL証明書関係の拡張子一覧

拡張子 | 示すもの | description
---|--- | ---
.der | エンコーディング方式 |鍵や証明書をASN.1というデータ構造で表し、それをシリアライズしたバイナリファイルです。
.pem | エンコーディング方式 | DERと同じASN.1のバイナリデータをBase64によってテキスト化されたファイルです。
.crt | ファイルの中身 | Certificate 証明書
.cer | ファイルの中身 | Certificateの略、つまり証明書です。マイクロソフトが使っている拡張子の取り決めで使われています。
.key | ファイルの中身 | 公開鍵、あるいは秘密鍵であることを表しています。


<!--

# 用語集

## SSL (Secure Sockets Layer)とは？

インターネット上でや報を暗号化して送受信するための仕組みです。

[SSLとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word116.html)

## SSL証明書とは？

> SSLサーバ証明書は、ウェブサイトの「運営者の実在性を確認」し、ブラウザとウェブサーバ間で「通信データの暗号化」を行うための電子証明書で、グローバルサインなどの認証局から発行されます。
SSLサーバ証明書には、ウェブサイトの所有者の情報や、暗号化通信に必要な鍵、発行者の署名データが含まれています。

[SSLサーバ証明書とは｜GMOグローバルサイン【公式】](https://jp.globalsign.com/ssl-pki-info/ssl_beginner/sslcerts.html)

## 自己署名SSL証明書 (a Self-Signed SSL Certificate)

> Typically, the self-signed certificates are used for testing purposes or internal usage.

[Creating a Self-Signed SSL Certificate | Linuxize](https://linuxize.com/post/creating-a-self-signed-ssl-certificate/)


通常、自己署名証明書は、テスト目的または内部使用のために使用されます。

[SSLサーバ証明書とは｜GMOグローバルサイン【公式】](https://jp.globalsign.com/ssl-pki-info/ssl_beginner/sslcerts.html)

## openssl

> OpenSSLとは、インターネット上で標準的に利用される暗号通信プロトコルであるSSLおよびTLSの機能を実装したプログラムの一つ。他のソフトウェアに組み込んで使用するライブラリ（プログラム部品）となっており、オープンソースソフトウェアとして公開されている。

[OpenSSLとは - IT用語辞典 e-Words](http://e-words.jp/w/OpenSSL.html)

-->

## 参考

[/docs/man1.0.2/man1/openssl-req.html](https://www.openssl.org/docs/man1.0.2/man1/openssl-req.html)

[Creating a Self-Signed SSL Certificate | Linuxize](https://linuxize.com/post/creating-a-self-signed-ssl-certificate/)
配列の全組み合わせ

いくつか記事を見かけますが・・・・forで回すのが多い。
ですが、簡単に


```
.reduce((zs, xs) => zs.flat().map(z => xs.map(x => [x, z].flat()))).flat()
```

これだけで全組み合わせができます


関数で

```js
const combineArrays = (arrays) => arrays.reduce((zs, xs) => zs.flat().map(z => xs.map(x => [x, z].flat()))).flat()
```

```bash
> combineArrays([[1, 2], [3, 4]])
[ [ 3, 1 ], [ 4, 1 ], [ 3, 2 ], [ 4, 2 ] ]

> combineArrays([[1, 2], [3, 4], [5, 6]])
[
  [ 5, 3, 1 ],
  [ 6, 3, 1 ],
  [ 5, 4, 1 ],
  [ 6, 4, 1 ],
  [ 5, 3, 2 ],
  [ 6, 3, 2 ],
  [ 5, 4, 2 ],
  [ 6, 4, 2 ]
]

```


ぱっと出てこなかったので、自分のメモ書き程度に。
checkstyleのSuppressionCommentFilterとSuppressWithNearbyCommentFilter

- SuppressionCommentFilter
  - offCommentFormatのコメント～onCommentFormatのコメントの間の警告を無視する
  - https://checkstyle.sourceforge.io/config_filters.html#SuppressionCommentFilter

- SuppressWithNearbyCommentFilter
  - commentFormatのコメントが書いてある行の警告を無視する
  -  https://checkstyle.sourceforge.io/config_filters.html#SuppressWithNearbyCommentFilter
ROSについてまとめてみる #3

この記事は、[ROSについてまとめてみる #2](https://qiita.com/hatt_takumi/items/df27461a662a122b450b)の続きです。
＊重複している部分もありますが、ひとまずこのまま公開します。
＊この記事の記載内容はROS1に関するものです。

#アーキテクチャ
##コンピュテーショングラフ
こちらの書籍を参考にまとめているのですが、この書籍では、コンピューティンググラフ、という項目で解説されていました。

ROSプログラミング(森北出版株式会社)
https://www.morikita.co.jp/books/book/3010

コンピュテーショングラフというのが何なのか、調べてみてもよくわからなかったのですが…。おそらく演算、処理(computing)の仕組みがどうなっているのか？という部分のことだという理解でいいと思います。
ROSの処理は、以下のような要素からなります。

 - ノード
 - roscore
   - マスター
   - パラメーターサーバー
 - メッセージ
   - トピック
 - サービス
 - バッグ

これらの要素を用いて、ROSのシステムは、数理的なグラフで表すことができます。
＊大きな四角はネームスペース、その中の小さな四角はトピック、丸はノード。
![snap_rqt_graph_moveit_demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467051/b7809d4c-e27a-8fb4-aae7-4323f2f597b0.png)


###ノード
ROS1ではプロセスのことです。基本的には単一の処理をします。
パッケージはノードが集まったものです。

###roscore
####マスター
マスターはroscoreの提供する機能です。
トピックやノード、サービスの登録、検索などの管理を行うROSのコア機能です。
ノードは、起動時にマスターに自分の配信(**publish**)するトピックと、購読(**subscribe**)したいトピックを登録します。
あとはマスターが相手のピアを見つけてくれるので、それ以降はノード同士のピアツーピアの通信となります。
後からノードを追加した場合なども、マスターがよしなにやってくれます。

####パラメーターサーバー
こちらもroscoreの機能です。トピックのようにPub/Subでイベント的にメッセージを飛ばすのとは違い、こちらは値を保持するような場合に使われます。分散システム内の各ノードから見えるグローバル変数を保持するといったような感じでしょうか。複数ノード起動時の、ノードのコンフィグレーションなどに使われます。

###メッセージ
ノード間の通信におけるデータ単位のひとつ。
メッセージのデータ型は、標準的なものは用意されており、複数言語での実装でも問題のないように取り決められています。これらのデータ型は独自に設定が可能な上、headerにタイムスタンプやフレームIDを持たせることもでき、メッセージの時系列的な管理もできます。

####トピック
ノード間で通信を行う際に、配信者、購読者がお互いに参照する場所。
データパス。メッセージの流れてくる場所。
**トピック**や**メッセージ**のまわりに関しては、用語が混乱しやすいのですが、トピックを公開して、そこにメッセージを配信する。という解釈が一番近いと思います。
本に例えると、トピックは漫画や雑誌のタイトル(またはそれ自体)、メッセージは中の文章といった感じでしょうか。"トピックを配信する"といったような表現も時々見ますが、"トピックを公開してメッセージを配信する"の方が理解しやすいかなと思います。

###サービス
ROSでは、上記のメッセージのようなPub/Sub型の通信のみでなく、Req/Rep型(クライアント-サーバ型)の通信も提供しています。サービスとは、あるノードが提供する関数(サービス)を、他のノードが利用する仕組みのことです。
使用頻度が高くなく、短い時間で処理が終わるものに適しています。
センサーのスイッチを入れたり、シャッターを押したりといったような操作などです。

###バッグ
**rosbag**のことです、メッセージの記録、再生を行うことができるツールです。
現状では対応しているのはメッセージのみで、サービスに関しては記録されtないですが、将来的には対応予定だそうです。(ほんとかな)

\#4へつづく
#参考
ROS
http://wiki.ros.org/

プログラミングROS(O'Reilly Japan)
https://www.oreilly.co.jp/books/9784873118093/

ROSプログラミング(森北出版株式会社)
https://www.morikita.co.jp/books/book/3010
CSSでつまづいたこと


##やっぱりfloatが分からん


なんかfloatを無効化するのにclearfixなるものがあるらしい。
[clearfixの最新版 -フロート関連やマージン相殺の不具合を解決するモダンブラウザ用clearfix]
(https://coliss.com/articles/build-websites/operation/css/css-latest-clearfix.html)

「.clearfix」というクラスを、floatプロパティを使用している親の要素に指定して以下のCSSを設定すると親要素の中に子要素がおさまる……というわけです。

```
.clearfix:after {
  content: '';
  display: table;
  clear: both;
}
```

clearfixをやる前にclearをキチンとやっておいた方がいいですね。

[clear](https://developer.mozilla.org/ja/docs/Web/CSS/clear)
`left
要素は先行する 左の フロートと切り離され、下に移動します。
right
要素は先行する 右の フロートと切り離され、下に移動します。`

うーんclearは子要素同士で使えるんだね。

clearfixの歴史を知るには以下を読み込むのがいいでしょう。
[floatを解除する手法のclearfix と 次世代のレイアウトの話]
(https://kojika17.com/2013/06/clearfix-2013.html)

そしてその進化版の`display: flow-root;`というのもあるとのこと。

この記事↓がわかりやすかった。
[CSSのマージンが効かない時の解決法（marginの縮小・折りたたみ）]
(https://lpeg.info/html/css_margin.html)
第8回 :: rake,ruby_fourth

\![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) \![ruby-2.7.1p83$](<https://img.shields.io/badge/ruby-2.c7.1p83-brightgreen>)


# rake

rakeとはmakeやantのruby版．rakeファイルに書かれていることを自動で処理する．

今までやったことなかったけど結構便利やった．

典型的な例は

```ruby
task :default do
  system 'rake -T'
  exit
end

desc 'hello NAME'
task :hello do
  name = ARGV[1]
  puts "Hello #{name}!"
  exit
end
```

これをRakeファイルに入力

    > rake

上記のようにコマンドを入力して実行すると，

    rake hello  # hello NAME

って出力される．

Rakeファイルの詳しい記述法

-   descの後にはrake -Tとした時の説明文(description)
-   :defaultはrakeが引数なしで呼ばれた時の動作，
-   それ以外はoptionで呼ばれるtaskの名前
-   taskの中には標準のruby言語で，動作を記述


# Rakeを実用的に使う

gitであげたり(push)引っ張ってきたりする(pull)ときのコマンドっていちいち打つのが面倒くさい．やから自動化しよう

```ruby
desc 'git push'
task :push do
  p comm = "git add -A"
  system comm
  p comm = "git commit -m \'hoge\'"
  system comm
  p comm = "git pull origin main"
  system comm
  p comm = "git push origin main"
  system comm
  exit
end
```

こんな感じで，Rakefileに覚えさせると楽．

もうちょっときれいに書いたほうがいいらしい以下のコードは下記のサイトを参照[チャート式ruby-appendix-rake](https://qiita.com/daddygongon/items/1c2d6d2895333ccf5e62)

```ruby
desc 'git push'
task :push2 do
  ["git add -A",
   "git commit -m \'hoge\'",
   "git pull origin main",
   "git push origin main"].each do |comm|
    p comm  #puts comm.green after require 'colorize' 
    system comm
  end
  exit
end
```

これめっちゃ便利やけど上のコードやと毎回コミットメッセージがhogeになるからARGVとか使ってメッセージを自由に変更したりできたらかなり実践でも使えると思う．今回はやらないけど毎回コミットメッセージが同じはちょっとね…



------
 - **source** ~/grad_members_20f/members/okamoto0910/article/c8.org
コード書く時に気をつけたいこと


##スペースを入れる
悪い例
{table: table}
良い例
{ table: table }

##最終行は空白にする

最終行は空白にしましょう。

##デバック行は残さない

デバック行は残しちゃダメです。

##要素の数字などは大きめに入れておく

悪い例
`hoges: {
    order: 1,`
良い例
`hoges: {
    order: 1００,`
C言語　文字を重複なしで出力するプログラム

# 渡された文字列から、文字を重複なしで出力する

- 一度出力した文字は出力しない
- 出てきた順に出力する
- 引数が2つ以外は改行を出力
- 使用可能な関数はwriteのみ

※コメントで指摘いただきましたので、コードを訂正しました。ありがとうございます。

## コード

```c
#include <unistd.h>
#include <limits.h>

void ft_union(const char *s)
{
	static _Bool use_char[UCHAR_MAX + 1];

	if (!s)
		return;
	while (*s)
	{
		if (use_char[(unsigned char)*s] != 1)
		{
			write(1, s, 1);
			use_char[(unsigned char)*s] = 1;
		}
		s++;
	}
}

int main(int ac, const char **av)
{
	if (ac == 3)
	{
		ft_union(av[1]);
		ft_union(av[2]);
	}
	write(1, "\n", 1);
	return 0;
}
```


## 感想

一度、文字をフラグとして扱うアルゴリズムを理解してしまうと、他の書き方は冗長に思えて、書く気が起きない。
【数学】ConvolutionとCross Correlationの違い

<h1>ConvolutionとCross Correlationの違い</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/90dcac20-156c-1a66-e957-570e6456394f.png)
式から見ると符号が違いますね
なるほどFilterがReverseしているのか

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a46b7fd5-07aa-b4a5-3302-0f45b6ec2f63.png)
水色がCross Correlation
紫色がConvolution

じゃあなんでConvolutionは逆になってるんだろう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/fde60575-1cfb-c9a7-d025-123dd4c6df34.png)
fが入力データでgがfilter。
面積を計算しているのか。
図を見るとなんとなく分かると思うが、Cross-correlationの方がfとgの相関性(似ているか)を見ているのに対して、Convolutionの方だとgがfilterの働きをしているように見える。

まあ実際DeepLearningで学習させたら勝手にtuningしてくれるのだけど笑

<h1>結論</h1>
・Cross Correlationを逆さまにしたものがConvolutionでした。

<h1>参考文献</h1>
Convolution vs Cross Correlation
https://www.youtube.com/watch?v=C3EEy8adxvc
A Comprehensive Introduction to Different Types of Convolutions in Deep Learning
https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215
IoTピザ窯の深淵に挑戦せしもの

##IoTピザ窯DELiveでもしお店をやるならベルトコンベア付けたかった
この記事は
[IoTピザ窯、または巨大災害レジリエンスで娘に怒られたこと](https://qiita.com/nanbuwks/items/0bb92acf7f7ee075a6b5)
に感銘を受けて作られた記事です。
11月の中旬から下旬にかけて@nanbuwksさんに教えを請い、IoTピザ窯を完成させることが出来た。
![IMG_5457.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257077/d21c9c56-137b-4a0e-2aaa-53a2e7eba1fa.jpeg)
開放式
![IMG_5361.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257077/542758ff-cb7d-0027-de9c-578ccd8becde.jpeg)
406度なのでナポリ式の定義から外れちゃう。
（ナポリ式は500度が最低条件、その他諸々条件あり。）
![IMG_5462.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257077/a809311c-2825-75a0-f733-73c39a0ecaac.jpeg)
素ピザだけど上手に焼けているのでは無いでしょうか？
（この窯で3分ほど）

なぜこの窯の横が空いているのか・・・・。
それはもし一人でお店のようなオペレーションを行う場合、チェーン店のピザ屋にあるような
ベルトコンベア式が良いと思ったからです！！


##ベルトコンベアをつけるとおそらく窯内の温度は下がるだろう
ベルトコンベアをホームセンターに買いに行ったのですが売ってなかったです。
とりあえず、モノタロウで色々買って作りました。
[動画](https://photos.app.goo.gl/S2dgw19KqxvUJMgo6)
12VをRaspberryPi Habuから取ってONOFFだけ出来ます。
おそらくちゃんとした技術者の方はスピードの制御など出来ると思いますが私は全然出来ません。
とりあえずは動いたなと行った感じです。

これの中に溶岩プレートを入れて、溶岩プレートを温めてコンベアの上のピザを焼くことを夢想しています。

##ペレットバーナーを自作せしめる
ベルトコンベアの上のピザを焼くのはかなりの熱量が要るので

上から
・溶岩プレート
・シースヒーター　1100W
・ピザ
・ステンレスベルトコンベア（行き）
・溶岩プレート
・ステンレスベルトコンベア（帰り）
・ペレットバーナー
この構成で行こうと思います。

ペレットバーナー単体で5000Kwほどの出力があるので
その熱量を溶岩プレートにぶつけて輻射熱
ペレットの直火の風でコンベクションオーブンやピザ窯を再現し
シースヒーターの赤外線で焼くオーブンになります。

溶岩プレートをずらして設置することにより、熱の対流を促しきれいに焼けるオーブンを目指しています。

##完成するのか・・・
あとは外側を鉄で覆うのかステンレスで覆うのか、初心に帰り耐火煉瓦で覆うのかを決めて実施すれば完成です。
完成後の写真は後ほどアップいたします。

##一連の流れの気づき
・何かものを自分で作るときに個人で工場機能やスキルを取得するのは大変だなと感じました。
・近赤外線による外部の焦げ、遠赤外線による内部の調理を見極める必要がある。
・電気窯を作れた。
・ベルトコンベアが作れた。1.2mで3万円くらい
・スクリューコンベアが作れた。50センチで1万円くらい　[動画](https://www.youtube.com/watch?v=DEi5i-DInrY)
・ペレットにヒートガンの最高出力を当てると燃える。（ステンレスフレキ管で伸ばして当てても燃える）

##作ったものの材料と費用
金額的にこれくらいでこれが作れるんだとつたえたい。

テスト窯　¥56,142

|品名|値段|個数|値段|
|:----|:----|:----|:----|
|蓄熱体（溶岩プレート）|¥9,856|1|¥9,856|
|電熱体（ニクロム線）|¥2,800|1|¥2,800|
|耐火煉瓦|¥4,150|2|¥8,300|
|鉄板|¥2,640|2|¥5,280|
|断熱材|¥4,554|1|¥4,554|
|安全ブレーカ|¥777|1|¥777|
|RaspberryPi|¥6,875|1|¥6,875|
|RaspberryHAUB|¥2,000|1|¥2,000|
|RaspberryAMP|¥800|1|¥800|
|リレー|¥1,500|2|¥3,000|
|リレー台|¥800|2|¥1,600|
|K型熱電対|¥600|2|¥1,200|
|露出コンセント|¥800|1|¥800|
|追加のチップ類|¥2,000|1|¥2,000|
|ACアダプタ|¥2,000|1|¥2,000|
|天井上下機能|¥4,300|1|¥4,300|

ステンレスベルトコンベア　¥31,446

|品名|値段|個数|値段|
|:----|:----|:----|:----|
|ローラー|¥900|5|¥4,500|
|ギアドモーター|¥1,600|1|¥1,600|
|グリースその他|¥4,824|1|¥4,824|
|モノタロウで買ったアタッチメント付きチェーン|¥17,522|1|¥17,522|
|ステンレス網|¥3,000|1|¥3,000|


スクリューコンベアペレットフィーダー　¥10,440

|品名|値段|個数|値段|
|:----|:----|:----|:----|
|一斗缶や鉄パイプやギア|¥4,966|1|¥4,966|
|アースドリルの刃|¥5,474|1|¥5,474|

加工のために買った機材類　¥14,623

|品名|値段|個数|値段|
|:----|:----|:----|:----|
|高速切断機|¥8,581|1|¥8,581|
|ヒートガン|¥3,000|1|¥3,000|
|ボードカッター|¥2,043|1|¥2,043|
|バーナー|¥999|1|¥999|
|ディスクグラインダー|¥4,000|1|¥4,000|

##まとめ
ピザ（パン）の歴史は長いし、火を使った調理は人間の証明である。
焚き火を見ると安心する、ソロキャンプ等の人気が出てきたのは、人間の本能に訴えるものがあるからだろうと思う。現代社会に疲れた人々の癒しになるように小さな灯火から初めたいと思う・・・。

IoTピザ窯の深淵はまだまだ遠い。
【備忘録】WordPressで管理者権限で新規投稿を作成しようとした際"公開"ボタンがあるべきところが"レビュー待ちとして送信"ボタンとなっており投稿できない

## 前提
* 新サイト立ち上げ時、構造のよく似た別WordPressサイトからDBをコピー、プレフィックスだけ変更してまるっとクローン
* 新規投稿を作成しようとすると、タイトル通りの挙動
* "レビュー待ちとして送信"ボタンを押すとエラー(文言は忘れた)
* 各種プラグインを停止しても状況変わらず

## 解決方

今回のケースではこの記事に書いてある方法で解決した
[Wordpress admin is seeing “Submit for Review” instead of “Publish”, how do I fix that? | fjorge](https://fjorgedigital.com/insights/blog/wordpress-admin-is-seeing-submit-for-review-instead-of-publish-how-do-i-fix-that/)
実際にやったことは下記

1. 新規サイトのためprefix_postsテーブルとprefix_postmetaテーブルの中身をすべて削除
1. prefix_postsテーブルのIDにAUTO_INCREMENTを付加

1.をしなくても2.だけでも解決したかもしれない
根本的にはphpmyadminからクローン元をエクスポートする際に各テーブルIDのAUTO_INCREMENTが外れていたことが原因
テンセントクラウドのバケット（COS）をServerless Framework経由で作成する

# 前提

- テンセントクラウドのアカウントを作成しておく
- Cloud Access ManagementのAPI KeysからシークレットID、シークレットキーを作成しておく

## 作成する

まずドキュメントをそのまま読んで実行してもうまくいかずに唸っていたところ、[FAQs](https://intl.cloud.tencent.com/jp/document/product/1040/33158)に、どうも中国以外の国では `.env` に追記する必要があることを見つけた。**"How do I deploy if my development environment is outside Mainland China?"**の部分。自分はchromeの翻訳機能で読んだ。
これを踏まえて `.env` はこういう感じに書く。

```:.env
SERVERLESS_PLATFORM_VENDOR=tencent
TENCENT_SECRET_ID=xxxxxxxxxx
TENCENT_SECRET_KEY=xxxxxxxxxx
```

ドキュメントを参考にしつつ `serverless.yml` に必要最低限の項目のみ記載してデプロイしてみる。

```yml:serverless.yml
component: cos
name: serverless-cos

inputs:
  bucket: 作りたいバケット名
  region: ap-tokyo
```

`sls deploy` コマンドを実行。

```terminal
$ sls deploy

中略

前往控制台查看应用详细信息: https://serverless.cloud.tencent.com/xxxxxxxxxx

10s › serverless-cos › Success
```

うまくいった。
テンセントクラウドのServerless Framework上で確認できる（上記のような成功後に出てくるターミナルのリンク）。
もしかすると反映に時間がかかるかもしれないが、テンセントクラウドのCloud Object Storageのコンソールにもちゃんとバケットが作られたのが確認できる。
nodenvでnodeのバージョン管理をする

## brew で nodenv インストール

```
$ brew install nodenv
```

## `~/.bash_profile` なり `~/.zshrc` に以下追記

```zsh:~/.zshrc
# nodenv
[[ -d ~/.nodenv  ]] && \
  export PATH=${HOME}/.nodenv/bin:${PATH} && \
  eval "$(nodenv init -)"
```

## 設定反映

```
$ source ~/.bash_profile
```
or

```
$ source ~/.zshrc
```

## nodenv にパスが通ったことを確認

```
$ nodenv -v      
nodenv 1.3.2
```

## nodenv でインストール可能なバージョン確認

```
$ nodenv install -l     
0.1.14
0.1.15
0.1.16
.
.
.
```
※欲しいバージョンがなかったら `$ brew upgrade nodenv node-build` でアップデートする

## お好みのバージョンインストール

```
$ nodenv install 10.16.0
```

## リフレッシュ

```
$ nodenv rehash
```

## インストールしたバージョンを使うよう設定

```
$ nodenv global 10.16.0
```

## 指定したバージョンが有効になったことを確認

```
$ nodenv versions           
  system
* 10.16.0 (set by /Users/mishiwata1015/.nodenv/version)
```

```
$ node -v
v10.16.0

$ which node
/Users/mishiwata1015/.nodenv/shims/node
```
Widgetを特定のサイズにのみ対応させる方法

先日個人開発アプリにウィジェットを追加しました。その時に一番小さな大きさのウィジェットのみ対応させる方法について調べたので、備忘録として残します。

```Swift
struct WidgetofColorDesignApp: Widget {
    let kind: String = "WidgetofColorDesignApp"

    var body: some WidgetConfiguration {
        IntentConfiguration(kind: kind,
                            intent: ConfigurationIntent.self,
                            provider: Provider()) { entry in
            WidgetofColorDesignAppEntryView(entry: entry)
        }
        .supportedFamilies([.systemSmall])//ここ
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
    }
}
```
`.supportedFamilies([.systemSmall])`というモディファイアを追加し、指定する大きさを引数の配列に格納します。
管理画面はもういらない!？SlackとChatbotを連携する

この記事は　[ZOZOテクノロジーズ #3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/zozo_tech3) 10日目の記事になります。

昨日は[edm17](https://qiita.com/edm17)さんの[CALayerのrender(in:)がやっているであろうことをUIViewのdraw(_:)で再現してみる](https://qiita.com/edm17/items/2e31c5e0ba3deea07c94)でした。自分は最近Swiftいじってないのでまたはじめようかな。。。

# はじめに

多くのシステムで、管理画面というアプリケーションを作る必要があると思います。
内部で使うシステムなので、まあまあ画面も適当で動けばよかったり（そして使用するメンバーに怒られる・・・）、運用開始してから作成されたり、というのはあるあるですね。

また作成したらしたでメンバーに展開し、使い方を説明したり、不具合修正が多かったりとまあ負債になりがちなのも管理用のシステムかと思います。

であるならば、もっと使い勝手良く、なんなら普段やり取りしているSlackオンリーで全て完結できたらいいのに。。。ということで試してみました。AWS Chatbot!

使い方の入り口の入り口のみですが試してみたので連携方法をご紹介しようかと思います。

# AWS Chatbotを試す
## チャットクライアントの設定
![blog1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/74e035b8-5cb1-5b05-b760-fcf5b4e2d1e5.png)

まずは、ここでSlackを選択し、クライアントを設定します。
そして、Slackアクセスの権限を許可します。

![blog2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/868092dc-de82-5452-052b-6ad08bb547e9.png)

## 新しいチャネルを設定

新しいチャネルを設定をクリックして、設定項目を埋めます。
特段難しい設定はないかと思います。
ロールには、Lambdaを呼び出すためLambdaInvokeの権限を追加しています。

![blog3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/3193092b-7a31-7508-4858-73c00d7a0a9a.png)


![blog4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/af00e927-b25c-cdf4-b15d-32111e3bf941.png)

こんな感じで設定もそれほど難しくないですね。
必要に応じてSNSの設定もできます。

## 呼び出すLambdaを作成

今回はこんなコードで、関数名はSampleChatbotにしています。(あくまでサンプルです)。

``` python
import json

def lambda_handler(event, context):
    print(event['new_customer'])
    new_customer = event['new_customer']
    return {
        'statusCode': 200,
        'body': json.dumps('Add New Customer!{}'.format(new_customer))
    }

```

## Slack側の設定

登録したチャネルにAWSのアカウントを招待します

![blog5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/0da54a46-9ac8-40ac-0e1a-5c11d3abf467.png)

これでSlackからLambdaを叩けるようになります。

![blog6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/fd6e5944-da74-6cb0-ef4e-f70addca40c2.png)

実行するか聞かれた後、Yesを選択するとレスポンスが返ってきます。

![blog7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150455/8b122a30-0232-8718-ab02-0fbe23f70e90.png)

## Slackのワークフローを作成する

ここまでできたら後はSlackのワークフローに登録すれば完了です。
（Slackのワークフローの機能はSlackの有料版の機能です）

Slackのワークフロービルダーから自由にフォームを作成し、最後にLambdaを実行するようにします。

## 終わりに

これらの機能を活用すれば、例えば検索や一覧を出すこともできると思います。
普段使用しているSlackから管理側の機能を呼び出すこともできるでしょう。

管理用のアプリというのはとかく後回しにされがちで使いにくくても仕方ないというケースが多いと思います。
Slackから利用できる便利さと、さっと作れる便利さを得られるをAWS Chatbotぜひご活用ください。

明日は[koiwai2020](https://qiita.com/koiwai2020)さんです！
昨日のedm17さんと明日のkoiwai2020さんでiOSのプロフェッショナルに囲まれましたね。。。
【Stereo Depth】CRL(Cascade Residual Learning) : 2Stage Depth Estimation

<h1>Cascade Residual Learning: A Two-stage Convolutional Neural
Network for Stereo Matching</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/1a0e2e06-4d83-aa75-c740-c746828ea548.png)

どうやってネットワークを早くしようかと考えていたら、2stageにするが良いという結論になったそうです。

<h1>新規性</h1>
<h2>DispFullNet</h2>
従来研究と同じで、Correlation(相関性)を見るためにInner Product(内積)でMatching Scoreを計算し、いくつかの解像度でDisparityを推定し、それぞれの解像度でlossを計算している。

<h2>DispResNet</h2>
DispFullNetで得たDisparity MapからLeft Image ReconstructionしてEorrorも計算して、それらを入力にしてるのが図からわかりますね。

図がごちゃごちゃしててわかりにくいですが、ようはReconstruction Errorを使ってDisparityをRefinementしようということ。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/72969d32-9f6a-78c7-a57a-8d318ba3f22c.png)
GC-Netより早い！

<h1>結論</h1>
・1stageより2stageの方が効率的だったりもする。


<h1>参考文献</h1>
Cascade Residual Learning: A Two-stage Convolutional Neural Network for Stereo Matching
https://arxiv.org/pdf/1708.09204.pdf
Snowflakeの稼働状況のステータス・過去の障害を確認する方法

## 概要
スノーフレークステータスというサイトにて、Snowflakeの稼働状況のステータス・過去の障害を確認することができます。

[スノーフレークステータス (snowflake.com)](https://status.snowflake.com/#)

スノーフレークステータスでは、下記が可能です。稼働状況の通知が可能であるため、Microsoft TeamsやSlackへの通知登録等をおすすめします。

- 現在の稼働状況の確認
- 稼働状況の通知
- 過去の障害の確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d6ae9551-bb6c-7d4b-bdbe-d7634ff8d48c.png)
引用元：[スノーフレークステータス (snowflake.com)](https://status.snowflake.com/#)

## 現在の稼働状況の確認
Snowflake内のサービスごとの稼働状況の確認が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5f2699e2-d5f1-067d-1b80-533511a3b48a.png)
引用元：[スノーフレークステータス (snowflake.com)](https://status.snowflake.com/#)

## 稼働状況の通知
サイト右上にて通知登録をすることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/46d01b39-e474-5410-6ff2-0072df44c043.png)
引用元：[スノーフレークステータス (snowflake.com)](https://status.snowflake.com/#)

## 障害の確認
サイトの下部で過去の障害を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2d471b62-acc5-6205-62ce-ead426cdf5ff.png)
引用元：[スノーフレークステータス (snowflake.com)](https://status.snowflake.com/#)

### 障害一覧のページ
障害一覧のページが別途あります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/3486ccfe-85d4-b54e-eaa7-3a3c45766b1d.png)
[スノーフレークステータス-インシデント履歴 (snowflake.com)](https://status.snowflake.com/history)

フィルター設定も可能であり、URLでのフィルター設定となるため利用しているリージョンのリンクをブックマークしてもいいかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2986a8d3-1571-4991-36fd-4a8ce927d144.png)
引用元：[スノーフレークステータス-インシデント履歴 (snowflake.com)](https://status.snowflake.com/history?filter=pkrzt59vb1cm,b96r20d6p5g7,xjvzhg4llmqt)

### 障害への対応状況のアナウンス
個別の障害について、随時状況がアナウンスされるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/18842364-0aac-2bc9-bb16-dd60338e2e19.png)
引用元：https://status.snowflake.com/incidents/y8d30ydl4k8x

### 障害の詳細
障害の詳細について、記事として投稿されて共有されるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8051e7e2-336b-c8a9-2fc4-ca3419bcda00.png)
引用元：[SI-20201027 (snowflake.com)](https://community.snowflake.com/s/article/SI-20201027)
値がセットされていないパラメータをURLから消し去るブックマークレット

# はじめに
使われていないパラメータがURLに存在すると美しくないので、それらを削除してスッキリさせたい時に使うブックマークレットです。引用する時に使うと力を発揮するやつです。

実行例は、こうなります。

__使用前__
`https://www.google.com/search?source=hp&ei=&q=朗報&oq=&gs_lcp=&sclient=psy-ab&ved=&uact=5
`

__使用後__
`https://www.google.com/search?source=hp&q=朗報&sclient=psy-ab&uact=5
`

#ブックマークレット

``` js
javascript:(()=>{const e=location.href,a=new URL(e),r=new URLSearchParams(a.search);let n=new URLSearchParams;for(const[e,a]of r)a.length>0&&n.set(e,a);Array.from(n).length>0&&(n="?"+n),location.href=a.origin+a.pathname+n})();
```

上記のコードは、次のコードを短縮したものです。

``` js
(() => {
//　----------------------------------------------
const url = location.href;

// str => url obj
const url_obj = new URL(url);
// search parameters
const search_params = new URLSearchParams(url_obj.search);

// valid parameters
let valid_params = new URLSearchParams();
for (const [key, value] of search_params) {
    if (value.length > 0) {
        valid_params.set(key, value);
    }
}

// location.href
if (Array.from(valid_params).length > 0) valid_params = '?' + valid_params;
location.href = url_obj.origin + url_obj.pathname + valid_params;
//　----------------------------------------------
})();
```

# 解説

大体の流れは次の通り。

+ 文字列であるURLからURLオブジェクトを作り、そこから検索パラメータを取得。
+ 有効なパラメータを保存するvalid_paramsを用意。後ほど使う。
+ 検索パラメータはkeyとvalueの組になっており、これを順に見ていく。その際、値の有無を長さ（length）で判断して場合分けする。
+ 値を与えられているパラメータについては、そのkeyとvalueを先ほどのvalid_paramsに追加していく。値を与えられていないパラメータのことは、何も考えずに忘れてしまっていい。
+ 最後にURLを組み立てて、読み込んで完結。

# あとがき

今回は、こちらの記事に触発されて書きました。ありがとうございました。

+ https://qiita.com/okayurisotto/items/d6e2cda01a9daed7cada


# 参考

2. https://developers.google.com/web/updates/2016/01/urlsearchparams
3. https://developer.mozilla.org/ja/docs/Web/API/URL/URL
4. https://developer.mozilla.org/ja/docs/Web/API/URLSearchParams
textViewの枠線の設定について

#開発環境
Swift5 xcode12.2
#概要
textViewの枠線のレイアウトをコードを書くことで変更する方法です。ここでは枠のカラー、幅の変更、枠を角丸にする方法を紹介します。また、今回のカラー指定ではtextFieldの枠線の色と同じ色に設定しています。ここの部分は自分が変更したい色に設定してみてください！

##枠のカラー変更
```
// 枠のカラー
        textView.layer.borderColor = UIColor(red: 0.9, green: 0.9, blue: 0.9, alpha: 1.0).cgColor
```
##枠の幅の変更
```
 // 枠の幅
        textView.layer.borderWidth = 5.0
```

##枠を角丸にする
```
// 枠を角丸にする
        textView.layer.cornerRadius = 20.0
        textView.layer.masksToBounds = true
```

##ソースコード
```
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 枠のカラー
        textView.layer.borderColor = UIColor.blue.cgColor
        
        // 枠の幅
        textView.layer.borderWidth = 5.0
        
        // 枠を角丸にする
        textView.layer.cornerRadius = 20.0
        textView.layer.masksToBounds = true
    }
}
```
#まとめ
今回はtextViewの枠のレイアウト変更についてまとめました。参考にして頂けたら幸いです。
ビルド時に~ is not a class, struct or unionと言われたら

## 経緯
realsenseからのdepthデータとrgbデータを同期させたくて、ROSの[message_filters](http://wiki.ros.org/message_filters)を使っていたのですが、catkin buildしたときにエラーが発生し、結構ハマったので共有しておきます。

## エラー時の状態
最初下のようなスクリプトを書いていました。rgbとdepthのトピックのmsgのタイムスタンプが同じ場合、sammpleFunctionクラスのメンバ関数であるcameraCallback関数を呼び出すという感じです。

```sample.cpp
void sampleFunction::init()
{
    ~その他の処理~
    // message_filtersの処理
    message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nodeHandle_, cameraTopicName, cameraQueueSize);
    message_filters::Subscriber<sensor_msgs::Image> depth_sub(nodeHandle_, depthTopicName, depthQueueSize);
    typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::Image> MySyncPolicy;
    message_filters::Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), rgb_sub, depth_sub);
    sync.registerCallback(&sampleFunction::cameraCallback);
}
```
これでcaktin buildすると次のようなエラーメッセージが発生しました。

```
/usr/include/boost/bind/bind.hpp:75:37: error: ‘void (sample::sampleFunction::*)(const boost::shared_ptr<const sensor_msgs::Image_<std::allocator<void> > >&, const boost::shared_ptr<const sensor_msgs::Image_<std::allocator<void> > >&)’ is not a class, struct, or union type
     typedef typename F::result_type type;
```
boost関係でエラーが起こっているのかなと思いましたが、[こちら](https://murasame-labo.hatenablog.com/entry/2017/02/01/134046)の記事で原因がわかりました。

## 解決策
原因としてはsync.registerCallback()でかcameraCallbackというメンバ関数を設定しているのですが、このときにthisポインタを渡してあげないといけませんでした。なので、スクリプトの最後の行を下のように変更してあげれば大丈夫です。

```
sync.registerCallback(&sampleFunction::cameraCallback, this);
```

## thisポインタについて
[こちら](http://wisdom.sakura.ne.jp/programming/cpp/cpp15.html)の記事を参考にして少しthisポインタについて触れておきます。
thisポインタとは、メンバ関数が実行された時の**オブジェクトのポインタ**を指します。thisポインタはメンバ関数内で自分のオブジェクトを操作する時に必要になります。例えば、メンバ関数から他の関数に自分のオブジェクトを渡す時などに使用されます。自分の場合だと、メンバ関数のInit()からcameraCallback()にオブジェクトを渡しているので、thisポインタを渡す必要がありました。

## まとめ
thisポインタの存在をすっかり忘れていました。でも、やはりC++は奥深くて面白いなと感じました。

**間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。**
AWS Cloud9で環境を立ち上げてみた

AWS Cloud9立ち上げたことないよっていう方が雰囲気つかめたらいいなっていう程度のゆるい記事です。

## Cloud9にアクセスして環境たちあげる

![cloud9-initpage.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/7b8ddcb2-19f2-2d5f-fc68-bb5f7730eac4.jpeg)

わたしはもうすでに環境立ち上げてますが、新規の場合は、Create environmentをクリックします。

## 設定🔨

まずは環境に名前をつけます

![new-env.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/38d357d0-02fb-319b-9fbf-c271b33f9a02.jpeg)

そして、基本設定をいれます。

![configure.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/a06f586c-a1e4-4e49-48c8-166547742615.png)

Environment Typeの上二つはEC2を使うタイプ、一番したのやつはオンプレサーバをつかうタイプです。
EC2を使うタイプの場合は、AmazonLinux2を使っておけばいいでしょう。
Cost-savingで、何分間触らなかったらEC2を停止する、という設定ができます。停止しないこともできます。

![review.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/2e6c5166-fb0a-e334-493a-83434da1db5f.png)

あとは、レビュー画面で設定を確認して、Create Environmentを押すだけです。

## 実際の環境

![env.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/a4aa98b8-aedc-3ce0-6efa-ba351fa9c18d.jpeg)

ダークモードだとこんな感じです。
Cloud9とCodePipeline、CodeCommitなどCodeSeriesを連携させれば、開発からCI/CDまでクラウド上で完結できますね。

ちなみに、EC2が眠っているときは、以下のように立ち上げ中画面が出ます
![starting-instance.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/141e4bbf-398d-1c8b-ab87-cb6e1d4b0ff3.jpeg)

## その他

Preferenceのところで、
![pref.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/f8eb920e-aac3-56dd-48f4-8444fa944715.jpeg)

themeを選ぶと、カラーリングを変更できます。
ホワイト基調や、ダークモードなど選べます。
![themes.png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580420/1c0ef428-6ed7-0f69-6809-5dc8d1ef7036.jpeg)
cscの作法 その45 録音

# 概要

cscの作法、調べてみた。
dllimportやってみた。
録音してみた。

# サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Media;
using System.Diagnostics;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

class form1: Form {
	[DllImport("winmm.dll", EntryPoint = "mciSendStringA", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
	private static extern int record(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
	private SoundPlayer player = null;
	private void PlaySound(string waveFile) {
		if (player != null) StopSound();
		player = new System.Media.SoundPlayer(waveFile);
		player.Play();
	}
	private void StopSound() {
		if (player != null)
		{
			player.Stop();
			player.Dispose();
			player = null;
		}
	}
	form1() {
		Text = "sound";
		ClientSize = new Size(400, 400);
		Button btn0 = new Button();
		btn0.Location = new Point(50, 20);
		btn0.Text = "rec";
		btn0.Click += btn0_Click;
		Button btn1 = new Button();
		btn1.Location = new Point(150, 20);
		btn1.Text = "stop";
		btn1.Click += btn1_Click;
		Button btn2 = new Button();
		btn2.Location = new Point(250, 20);
		btn2.Text = "play";
		btn2.Click += btn2_Click;
		Controls.AddRange(new Control[] {
			btn0,
			btn1,
			btn2
		});
	}
	void btn0_Click(System.Object sender, System.EventArgs e) {
		record("open new Type waveaudio Alias recsound", "", 0, 0);
		record("record recsound", "", 0, 0);
	}
	void btn1_Click(System.Object sender, System.EventArgs e) {
		record("save recsound c:\\tmp\\mic.wav", "", 0, 0);
		record("close recsound", "", 0, 0);
	}
	void btn2_Click(object sender, System.EventArgs e) {
		PlaySound("c:\\tmp\\mic.wav");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
【Stereo Depth】StereoNet : Refinementでネットワークの高速化

<h1>StereoNet: Guided Hierarchical Refinement for
Real-Time Edge-Aware Depth Prediction</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/6bc5592b-ea20-aec9-c1a0-232430c2cef3.png)

stereo depthが遅いので早いネットワークを作ろう！って事でStereoNetが提案された。
お〜早いのか。どうやって早くしたんじゃ？

ちなみに[GC-Net](https://qiita.com/minh33/items/8f3ce0ad64035d994af6) likeな構成になってる。

<h1>新規性</h1>
<h2>Hierarchical Refinement: Edge-Aware Upsampling</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/0c5685f5-9d5f-5ca8-b9f2-41bb238d1619.png)
低解像度で求めたDisparityを入力画像サイズまでBiliner interpolationしてupsampleする。

このネットワークの入力はUpsampleしたDisparity Mapと入力画像である。そうする事で、物体の境界線などを参照する事が出来、鞣しみたいな効果が得られる。

そもそも最初のDisparityが間違っていればそれを参考に鞣すだけなので精度はあがらない。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/1316f4f2-c661-3889-eba1-bdb625804469.png)
0.015sって早っ！

<h1>結論</h1>
・Refinementを使うことで低解像度(1/4)画像サイズでもそこそこの精度と同時に計算コストを大幅に下げられる。
さすがGoogleさｎ!

RefinementするならReconstruction Errorを使った方が良いと思うのだが。



<h1>参考文献</h1>
StereoNet: Guided Hierarchical Refinement for Real-Time Edge-Aware Depth Prediction
https://openaccess.thecvf.com/content_ECCV_2018/papers/Sameh_Khamis_StereoNet_Guided_Hierarchical_ECCV_2018_paper.pdf
Ruby：文字列型と整数型をそれぞれ型変換してみる

# 最初に

**カレンダー企画2020の10日目**
プログラミングの勉強を始めて3ヵ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、誤解されるような言葉があったら教えてください^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。

## 文字列型と整数型をそれぞれ型変換する

### 1. 整数型→文字列型に変換してみる

変換をする際に使うメソッドは `to_s` です！

早速やってみます

```ruby:demo.rb
puts "Yutaの年齢は" + 27 + "です"
```

こんな感じに文字列型と整数型を混ぜてみます！

```Terminal:ターミナル
$ ruby demo.rb
Traceback (most recent call last):
        1: from demo.rb:1:in `<main>'
demo.rb:1:in `+': no implicit conversion of Integer into String (TypeError)
```

おそらくエラーになると思います。
`Yutaの年齢は27です`
こんな風にできると思ったらこれでは出来ないみたい、、、

#### エラーが出た理由

文字列型同士であると " + " は「つなぐ」という意味
整数型同士であると " + " は「足し算をする」という意味
なのですが、今回は
文字列型と整数型をつなごうとした為に「そんなこと出来ないよ〜」というエラーが起きたということです！

### 解決策は？？

`Yutaの年齢は27です`のようにしたいなら
「27」が文字列型になれば良さそうですよね！！

ここで`to_s`の出番というわけです。

```ruby:demo.rb
puts "Yutaの年齢は" + 27.to_s + "です"
```

27のところに付け加えるだけで

```Terminal:ターミナル
$ ruby demo.rb
Yutaの年齢は27です
```

となります！
27の部分が文字列型に変換されたので上記のような結果が出力されたのです。


### 2. 文字列型→整数型へ変換してみる

使うメソッドは `to_i` です！

使い方は一緒です。
文字列になっているところを整数型にしたい場合は対象に `.to_i` をつけるだけです！

```ruby:demo.rb
puts "12" + 1
```

足し算なので13と出力されたいのですがこのままではエラーが起きるので

```ruby:demo.rb
puts "12".to_i + 1
```

```Terminal:ターミナル
$ ruby demo.rb
13
```

狙いどおりに出力されます。

このようにそれぞれの型を別のものに変換できます。

## 最後に

アプリケーションを作成していく中で金額を取り扱う時にこの知識があると便利でした。
計算したい時は整数型、文字と連結させたい時は文字列型となる。ここを理解してなかった時は混乱してうまく出来なかったです^^;
""で囲むと文字列型になる！だけでも覚えて置くといいかも！！
あとは少しずつ^^

[こちらでも整数型、文字列型を説明しているので良かったらどうぞ！](https://qiita.com/yutas-8/items/856b9644c1ae18ab4635)
デザインツールは結局SketchとXDどちらがいいか問題について(end of 2020ver)

### はじめに
デザイナー間で度々議論となるタイトルの問題ですが、両方を使ってみての感想を各機能ごとにまとめていきたいと思います。
なお完全に個人的な趣味嗜好が入っておりますので結局どちらが優れているか、というのはその人次第かと思います。
下記機能に関しては「いや○○でもその機能あるよ」ということもあるかもしれませんが
「いや直感的にわかんない○○が悪いよ」という強気の姿勢で望みたいと思います。よろしくお願いいたします。

### まず個人的な結論
下記機能比較の結果、XDが勝利。
やはりAdobe先生の呪縛から逃れることはできません。

### 各性能比較
どちらも良い点、悪い点があるので決めきれないところが辛いです。
ですがお互い高め合う(パクリ合う)ことでどんどん良いものになっていくのでしょう。
それでは各機能を詳しく比較していきたいと思います。

##### ・UIUX、おしゃれ感
引き分け。どちらもそこまで違いがある訳ではないがやはりデザインツールなので共にオシャレさんである。
そしてサクサク動きます。（ほんとにわずかな差でXDの方が軽い印象）

##### ・価格
XDの勝利。無料のプランもあるし（制限は多い）そもそも普通に企業のデザイナーとして働いていれば
アドビ製品はなにかしら使っていると思うのでコンプリートプランならそのまま使える。
Sketchも一年間で99$なのでCADとかに比べるとそこまで高いわけではない。

##### ・カスタマイズ性、プラグイン
Sketchの勝利。スケッチはヘッダーでツールのカスタマイズも色々できる上プラグインがとにかく多い印象。
こちらはやはり先発優位だと感じる。

##### ・バージョン管理
Sketchの勝利。どちらも単体でバージョンを管理する方法はないが
Sketch:Abstract(有料外部サービス)と連携しバージョン管理が可能。
またページ機能によりバージョン分けみたいなことがスケッチ単体で可能。
XD：とくに方法なし、ファイルを分けるしかない。個人的にはページ機能が一番XDに追加してほしい機能です。

##### ・シンボル（同じパーツの使い回し機能）
引き分け。こちらは特に差がないように感じました。わかりやすいです。
（ただSketchのオーバーライドという発想は好きです）

##### ・レスポンシブ対応
勉強中の為比較不可。いろいろガチャガチャやってますがよくやり方がわかりません。
ただ共に設定をうまくやればかなり時間短縮できる印象です。

##### ・フォント周り
Sketchの勝利。なぜならばSketchはカーニングができる為。
ここはお互い弱い印象。

##### ・プロトタイピング
引き分け。どちらもバリバリ動きをつけるようなことをしないのであれば難なく実装可能。
なお私は
Sketch：Sketch上では作らずinvisionと連携、invision上で作成（画面遷移のみ）
XD:単体でプロトタイプ作成
しておりました。
余談ですが2020年以降のネオデザイナーはProtoPieでモリモリ動きを作れるようになることがマスト、と感じております。

##### ・共有、コメント機能
XDの勝利。単純な使い勝手の部分もそうですがSketchで致命的な問題だと思ったのが
アートボード名を変えて再度あげるとうまく反映されてなかったりすることが多かったことです。
XDはその辺が上手でアートボード名を変えて再度あげてもいい感じに処理してくれるのが好きです。

##### ・終わりに
以上、メイン機能の比較でした。(レイヤーや図形など他にも色々ありますが)
どちらも素晴らしいツールですが個人的にはXDがいいんじゃないのかなぁという結論になっております。
今記事を見直したらSketch勝利の方が多いのにXD選んでました。

少し話は逸れますがフォントも「このフォントありますか？」や「このフォント買っていいですか」と
会社が変わる度に確認するのは面倒なのでそこはもうAdobe fontでいいじゃん、と。
どこ行ってもXD＋Adobe fontでいくんだ！と決めておけば環境に左右されないのでストレスが減るんじゃないかなぁと思う次第です。
この記事がツール選びの上でなにか参考になれば幸いです！
アンケート回答者が改変した回答フォーマットのゆらぎを集計してみる

機械学習エンジニア・データサイエンティストの[muraokaz](https://qiita.com/muraokaz)です。[VISITS Advent Calendar 2020](https://qiita.com/advent-calendar/2020/visits) 10日目の記事です。今回はニッチな内容ですが、**アンケートのフリーテキストで複数要素を答えさせた場合の回答フォーマットのゆらぎ**について書きたいと思います。

# テキスト解析では、いつも綺麗なデータを解析できるとは限らない

テキスト解析（データ分析）の基本は、諸々の解析にかける前に、その材料（テキスト）が分析したい内容のものとなっていることです。例えば、商品レビューページの感情分析をしたいのであれば、まずはページ中の「レビューが記載されている箇所」を抽出することから始まります。更に、「デザインについてのレビュー」「機能についてのレビュー」が別々のセクションに分かれているのであれば、それぞれのセクションを抜き出してくる処理が必要になると思います。ソースがHTMLファイルであれば、スクレイピング＋DOM解析＋タグからのテキスト抽出が該当します。

ところで、世の中のテキストデータは、常にこのように構造を持った形で存在しているわけではありません。例を上げると、企業が過去に収集したアンケート結果がExcelデータとして存在する、しかし複数の設問に対し、回答データは1つのカラムに結合されてしまっている、というような場合があるかもしれません。このような場合、カラムの中はフリーテキストであるとみなされるので、ここからいくつかの設問要素を切り出すという作業が必要になります。

![](https://github.com/KazumaMurao/qiita_visits/blob/master/fig/4.png?raw=true)

# 回答フォーマットのゆらぎ分析

単純に考えると、フリーテキストから必要な箇所を抽出するスクリプトを書いたら良いと思われるかもしれません。しかし、実際のデータを覗いてみると、設問で回答フォーマットが指定してあった場合においても、一定の割合で回答にゆらぎが発生していることが分かりました。つまり、フォーマットを微妙に（ときには大きく）変更して回答する回答者が存在するようです。従って、抽出作業においてはこういったゆらぎを考慮するスクリプトを書く必要がありますが、今回の投稿ではそもそもどういったゆらぎがあるのか、私が実際に遭遇したいくつかのパターンについて、その例と割合を書いてみたいと思います。

（注）実際のデータは公開できないため、上記で書いた架空のアンケートを例に、パターンを示したいと思います。

## 改行の追加

上記の例では、次のような回答フォーマットを設問で指定しました。

```
①購入した理由：
②満足度：
③上記のように回答した理由：
```

このような設問では、コロン（：）に続いて回答が始まることを期待していると思われますが、回答が長くなりそうな場合、回答の見た目を気にした場合など、回答者がフォーマットに改行を追加する場合がありました。

```
①購入した理由：
XXXXXXXXXXXXXXXXXXXXX ← コロンに続けて回答をスタートせず、改行を挟んでいる

②満足度：普通

③上記のように回答した理由
YYYYYYYYYYYYYYYY ← 改行の追加に加え、コロンが不要と判断して削除している
```

割合は、

* 改行を挟んだ回答：約9〜19%
* 改行を挟んだ回答＋コロンの削除：約0.7〜4.3%

となりました。ちなみに、以下のように回答フォーマットに回答例も併記して説明することで、このような回答ゆらぎは約3%以下にまで抑えられるようです。

```
①購入した理由：大掃除で収納用品が必要になり、部屋の雰囲気にも合いそうだったので購入した
②満足度：満足
③上記のように回答した理由：商品画像と実際の商品の色合いが一致していて、イメージ通りのものが届いたため
```

## 設問ラベルの除去

回答者によっては、ナンバリングがされていれば設問ラベルは不要と感じ、ラベリング部分（例えば「購入した理由」）は削って回答することがありました。具体的には次のような回答になります。

```
①XXXXXXXXXXXXXXXXXXXXX
②普通
③YYYYYYYYYYYYYYYY
```

このような回答パターンは約3.3〜11%見受けられました。ラベリング部分が長いほど、削られる確率が高い傾向にあり、逆にラベリング部分が短ければ（例「①理由：」）そのまま回答に使われる確率が高いようです。

## 設問ラベルの修正

頻度としては低いですが、設問ラベル部分について、指定された回答フォーマットから修正・加筆された回答もありました。その中では（具体的すぎるためここでは取り上げられませんが）タイポだと思われるものもあり、フォーマットをコピペせずに打ち直した過程でこうした事象が起きているのではないかと思われます。パターンとしては次の通りです。

| 回答フォーマット | 回答 | 割合 |
| :--- | :--- | ---: |
| ①理由（一言で） | ①理由 | 約2.1% |
| ①理由/背景： | ①理由／背景： | 約0.4% |
| ①理由/背景： | ①理由・背景： | 約0.4% |
| ②理由： | ②その理由： | 約0.2% |
| ①具体的な理由： | ①理由： | 約0.1% |

## 回答フォーマットに従わない回答

こうした回答フォーマットに従わず、型化されていないフリーテキストで（設問に対して全般的に）回答されたデータも存在します。さらにこれらは、

* 回答フォーマットには従っていないが、段落や改行によって、回答要素は分割されている場合：約0.4〜0.7%
* ひとつのパラグラフで回答しており、回答要素が改行などによって分割されていない場合：約4〜18%

に分かれるようです。後者の場合の例を上げるとこのようなものになります。

```
今回の商品の購入に至ったのは、在宅勤務が続き、仕事道具としての椅子が必要になったためです。まずオフィスで使っていたものを見たのですが予算が合わず、無理なく購入できるものを選んだのですが、結果的にはソファと比較すると格段に良くなり、値段の割には高価格帯のものと遜色ない効果がありそうで、たいへん満足しています。
```

# まとめ

最初に書いたように、テキスト解析の観点から言うと、一要素一カラムとなったデータ、そのようなデータが収集できるアンケートツール等を用意したいものです。ですが実際には、クライアントが持っている過去アンケートの集計データを扱うような場合など、フリーテキストから抽出・解析をかけなければいけない場合も存在します。こうしたとき、どんな回答ゆらぎがどのくらいの頻度であるのか、頭の片隅にでもあると、もしかしたらデータを見る心構えとなるかもしれません。本投稿がテキスト解析に携わるどなたかの役に少しでも立てば嬉しく思います。
Swagger記法まとめのまとめ

※この記事は[Swaggerの記法まとめ](https://qiita.com/rllllho/items/53a0023b32f4c0f8eabb)を受けた、自分用のまとめです。

#Swaggerのオブジェクト

●Swaggerは3種の必須オブジェクト"swagger", "info", "paths"をはじめとした、
15種類のオブジェクトからなる。

#3つの必須オブジェクト

●必須オブジェクト3種類についての概要は以下の通り。

##１．swagger
  Swaggerのバージョンを記述する
	
##２．info

そのAPIについての情報を記載する。
必須フィールド2種をはじめ、以下の情報を記述できる。	

###version(string)
APIのバージョン。必須

###title(string)
ドキュメントのタイトル。一番上に表示される。必須

###description(string)
ドキュメントについての説明

###termsOfService(string)
利用規約

###contact(contact object)
APIについての問い合わせ先

###license(license object)
APIのライセンス


##３．paths

APIのエントリポイントを記載する。
(※エントリポイント：APIにアクセスする「入口」)
必須フィールド"responses"をはじめ、以下の情報を記述できる。
	

###responses(response object)
返ってくるレスポンス。必須

###parameters(parameter object)
リクエストのパラメーター

###tags(array)
swaggerオブジェクトで定義するどのtagに紐付けたいかを記述

###summary(string)
エントリポイントの概要（120文字以内）

###description(string)
エントリポイントの説明

###consumes/produces(array)
MIME Type

###schemes(array)
APIの通信プロトコル。http, https, ws, wssの4種類のどれかを記述する。

###security(security requirement object)
適用するセキュリティ

###externalDocs(external docs document)
外部リンク

###deprecated(boolean) 
Deprecatedかどうかをtrueかfalseで記述。デフォルトはfalse。

##その他のオブジェクト
	
●その他のオブジェクトは以下の通り。
host(string):
API通信を行うサーバーのホスト。無記載であればドキュメントが動いているサーバーのホストとなる。

###basePath(string)
ホストに続くパス。スラッシュ（/）から始まる必要がある。無記載の場合、ホストの直下になる。

###schemes(array)
APIの通信プロトコル。http, https, ws, wssの4種類のどれかを記載する。

###produces(array)
APIが提供できるMIME Typeの指定

###consumes(array)
APIが使用するMIME Typeの指定

###definitions(definitions object)
レスポンスやパラメータに使用するデータ定義を記載する

###parameters(parameters definitions object)
パラメーター定義。pathsの下に直接パラメーターを書くことも
できるが、複数回同じパラメーターを使う場合に便利

###responses(responses definitions object)
レスポンス定義。pathsの下に直接レスポンスを書くことも
できるが、複数回同じレスポンスを使う場合に便利

###securityDefinitions(security definitions object)
セキュリティに関する定義

###security(security requirement object)
securityDefinitionsにて定義したセキュリティの中で
何を適用するかを指定

###tags([tag object])
タグの名前と説明を定義

###externalDocs(external documentation object)
外部リンクを定義。ドキュメントに貼りたいリンクがある場合、
ここに記載することでリンクが作成される。

##参考

改めて、参考にした記事は[こちら]
(https://qiita.com/rllllho/items/53a0023b32f4c0f8eabb)。
Kubernetes 上でイベント駆動処理を実現する KEDA のご紹介！

この記事は、[求ム！Cloud Nativeアプリケーション開発のTips！【PR】日本マイクロソフト Advent Calendar 2020](https://qiita.com/advent-calendar/2020/azure-cloudnative) の 4 日目です（後から追っかけで書いています）。

----

[KEDA](https://keda.sh/) についてご紹介します。

## What is KEDA ?

KEDA は Kubernetesに導入可能なコンポーネントの名前です。語源である「Kubernetes Event-driven Autoscaling」の通り、Kubernetes 上でイベント駆動のオートスケールを実現します。

https://github.com/kedacore/keda

2020年4月に CNCF(Cloud Native Computing Foundation) の sandbox project に採用されて[ニュース](https://cloudblogs.microsoft.com/opensource/2020/04/06/kubernetes-event-driven-autoscaling-keda-cncf-sandbox-project/
)になっていました。

## KEDA の使いどころは？

語源である「Kubernetes Event-driven Autoscaling」にもあるイベント駆動（Event-driven）とは何かのイベントに応じて処理を行う仕組みのことなのはご存知の通りです。

不定期に大量メッセージを受け取る Web システムを例にしてご説明します。

イベント駆動（Event-driven）で構築せず、Web サーバで構築した場合を考えてみましょう。

常時メッセージを待ち受けていると、ほとんどの時間は処理するものが何も無いため、リソースが無駄になってしまいます。一方、無駄にするリソースを最小限になるように構築してしまうと、いざ大量のメッセージが来た時に処理しきれなくなってしまいます。

キューにメッセージが無い状態は何も動かず、キューにメッセージが大量に投入されれば、そのメッセージ数に応じて処理を並列に動かすこと（＝イベント駆動（Event-driven））が求められます。イベント駆動（Event-driven）にすれば、リソースを無駄にせず、有効活用できます。

こういった処理の代表的なパターンとして、Azure なら ServiceBus と Azure Functions、AWS なら 
 SQS と Lambdaなどがあげられます。

このようなイベント駆動の処理を Kubernetes 上で実現するものが、今回ご紹介している KEDA になります。

## KEDA の使い方

KEDA は Kubernetes 上にインストールして使います。

詳細は[公式サイト](https://keda.sh/)をご覧ください。

[公式サイト](https://keda.sh/)を見ると、Scaler という見慣れない言葉を見ると思いますが、これはスケールの元情報となっているものになります。Scaler は拡張可能な仕様になっていて様々なサービス、コンポーネントに対応しており、記事執筆時点でも以下のサービスに対応しています。

これをご覧になれば、KEDA が特定のサービスに依存したものではなく、汎用的に利用できるものであることがおわかりになるかと思います。

もちろん、[Azure Kubernetes Service (AKS)](https://docs.microsoft.com/ja-jp/azure/aks/?WT.mc_id=AZ-MVP-5001601) でも利用可能です。

* ActiveMQ Artemis
* Apache Kafka
* AWS CloudWatch
* AWS Kinesis Stream
* AWS SQS Queue
* Azure Blob Storage
* Azure Event Hubs
* Azure Log Analytics
* Azure Monitor
* Azure Service Bus
* Azure Storage Queue
* CPU
* Cron
* External
* External Push
* Google Cloud Platform‎ Pub/Sub
* Huawei Cloudeye
* IBM MQ
* Liiklus Topic
* Memory
* Metrics API
* MySQL
* NATS Streaming
* PostgreSQL
* Prometheus
* RabbitMQ Queue
* Redis Lists
* Redis Streams

**5 日目は @changeworld の「[What's new in .NET 5](https://qiita.com/changeworld/items/ff6ebaebe0c5cf71ba20)」です。引き続きお楽しみください。**
Amazon Comprehend で AirPods Maxに関するツイートの感情を分析してみた

# はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [Amazon AI by ナレコム Advent Calendar 2020](https://qiita.com/advent-calendar/2020/knowcom-amazonai)の 10日目にあたる記事です！

# Amazon Comprehend 

>Amazon Comprehend は、機械学習を使用してテキストから洞察を見つける自然言語処理 (NLP) サービスです。 Amazon Comprehend では、キーフレーズ抽出、感情分析、実体認識、トピック形成、言語検出 API を提供し、自然言語処理を簡単にお使いのアプリケーションに統合できます。

引用元：https://aws.amazon.com/jp/comprehend/features/

2019年11月に日本語に対応、2020年2月に東京リージョンに対応しました。

# 今回やること

先日発表されたApple初のオーバーイヤーへッドホン、「AirPods Max」に関するツイートの感情分析を行います。

# 手順

手順はざっくりと以下の3つです。

1. Twitter APIでツイートの収集
2. S3にツイートデータアップロード
3. Amazon Comprehendで感情分析

## 1. Twitter APIでツイートの収集

### 1-1. Twitter APIの利用申請→APIトークン取得

[Developerサイト](https://developer.twitter.com/en/portal/projects-and-apps)にて英語で申請→うまくいけば１日で使えるようになります。
申請内容が不十分だと、メールが来て改めてAPIの使用用途を聞かれます。

APIの申請方法、APIキーの取得方法については、以下リンクが参考になるかと思います。

参考リンク：https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/

### 1-2. Pythonで「AirPods Max」を含むツイートを収集

以下の記事を参考にし、AirPods Max発表時間～12月9日17:00までのAirPods Maxに関連するツイートを約１万件集めました。

参考リンク：https://qiita.com/nomotom/items/de1bc00ef350edc21624

## 2. S3にアップロード

S3バケットを新規に作成し、用意したデータをアップロードします。

## 3. Amazon Comprehendで感情分析

### 3-1. Analysis jobを作成

[Amazon Comprehend ダッシュボード](https://ap-northeast-1.console.aws.amazon.com/comprehend/v2/home?region=ap-northeast-1#welcome)にいき[Launch Amazon Comprehend]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/14baaefc-9f58-68bb-26e6-1e18239a2b44.png)

サイドバーから[Analytics jobs]を選択し、[Create job]をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/737a4d8c-9f21-8aa4-cb23-cf43ecbc5525.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/c46506a3-4f65-f745-4107-88dd7d6af9c7.png)

ジョブ名入力、入力データや出力データの保存先、出力を許可するロールなど選択し、[Create job]でジョブを作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/57dc1c33-cab6-913c-27db-3950b4ec7fec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655635/858ba5a2-79f4-d274-a625-417e069f5a45.png)

StatusがSubmitted 、In Progress から Completedになるのを待ちます。
目安として、450794文字のデータで8分かかりました。

### 3-2. 結果を見る

結果は以下のようなjsonで返ります。

```markdown
{"File": "元データファイル", "Line": 8, "Sentiment": "NEUTRAL", "SentimentScore": {"Mixed": 4.2057734390255064e-05, "Negative": 0.03868779540061951, "Neutral": 0.9604883193969727, "Positive": 0.0007818673038855195}}
```

全10024件のツイートから、判定されたセンチメントのはそれぞれ以下の数となりました。

|  センチメント  |  数  |
| ---- | ---- |
|  Positive  |  1348  |
|  Negative  |  1743  |
|  Mixed  |  299  |
|  Neutral  |  6634  |

# おわりに

結果から、肯定的なツイートよりも否定的ツイートが少し多いことが分かりました。
次回はエンティティやキーフレーズの抽出もしてみたいです。
【Stereo Depth】PSMNet : 超基本的ネットワーク

<h1>Pyramid Stereo Matching Network</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/710550a7-3988-09e7-bee4-ab6b020c7cc9.png)

皆な大好きPSMNet。Stereo Depthを代表するネットワークと言っても過言ではないだろう。
よく精度比較に引用される事が多い。

まだStereo Depthあまりわからないという人がいたら[SGM](https://qiita.com/minh33/items/55717aa1ace9d7f7e7dd)、[MC-CNN](https://qiita.com/minh33/items/6b0ed63e7c23afb16ed9)や[GC-Net](https://qiita.com/minh33/items/8f3ce0ad64035d994af6)あたりみると良いと思う。


<h1>新規性</h1>
従来研究と同じで4step
1. Feature Extraction(左右からマッチングする為の特徴を取り出す)
2. Cost Volume(取り得るすべてのDisparityに対して特徴量をwarpさせて重ねていく)
3. 3D CNN(Matching Costが一番高いDisparityを探す)
4. Regression(SoftArgMaxを使ってDiaparity(i)である確率を正規化して、重み付け平均でDisparity Mapを出力する)

ここまでは従来と同じで、精度を上げる為にSPP Moduleの導入とStacked hourglassという手法を提案した。
<h2>Spatial Pyramid Pooing Module</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f53a963d-6314-e3c4-ab7e-de08aa1ed30f.png)
2015年くらいに提案されたSPP　Moduleを使い画像全体を参照出来るように導入。
High Resolutionの特徴を失わないようにConv2_16がconcatされている。

<h2>Stacked hourglass</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/e1e377c3-59a2-d1c4-5fb0-ed006cdf6e28.png)
ResNet likeな単純なネットワークをbasicとして定義しています。Skip Connetionをすることで消失購買を回避することが出来ますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/41b1b548-2509-f6ef-62ac-7de4d2bf9922.png)
BasicからUpdateとしてはEncoder Decoderモデルが導入された事でより広い範囲を参照することが出来るようになった。おまけみたいな感じで3箇所でDisparityを推定出来るようにしている。そうすることで学習が安定しやすいメリットがあるのでいろいろな場面で良く使われている。

*上の矢印は見ると混乱するのであんまり気にしない方が良いかもしれないですね笑。大した事してないので無視無視

<h1>結論</h1>
・Feature ExtractionにSPP Moduleを導入する事で画像参照範囲を拡大
・3D CNNにStacked hourglassを導入する事で精度が向上


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/35d65855-44e8-8f29-1464-93d012e2c3ee.png)
精度があがったけど速度が遅いね。2018年時点では最速でも0.12[s]か。Real Timeシステムにはちょっと使えないな〜。実際に使う時って、論文に書いてある計算速度より遅くなるし、0.05[s]くらいで動いてくれると嬉しい。

PSMNet以上のの精度で0.05[s]以内で動くモデル探すぞ！

<h1>参考文献</h1>
Pyramid Stereo Matching Network
https://arxiv.org/pdf/1803.08669.pdf
Two component files resolving to the same nameの解消

# Two component files resolving to the same name
発生上状況
* nuxt version 2.13+
* component配下に同名ファイルが存在

デフォルト時では起きないですが、nuxt.configのcomponentsがtrueになっていると発生します。

```nuxt.config.ts
components: true,
```

## 上記エラーに遭遇したら

```nuxt.config.ts
components: false,
```

components: false,にすればwarningは出なくなりますー。


The components Property
https://nuxtjs.org/docs/2.x/configuration-glossary/configuration-components