OmniAICreator/Qiita-1.07M huggingface dataset:
オリジナル Rviz Plugin をつくってみる 3. ROS2で .ui ファイルを使ってオリジナルパネルをつくる

# はじめに
本記事は，下記記事のシリーズ記事です．
関連記事等気になる方は是非下記記事から飛んでください！

https://qiita.com/RyodoTanaka/items/eadfb81bd52404dabdb4

前回は，ROS1で`.ui`ファイルでレイアウト指定したパネルを Rviz Plugin にする方法を紹介しました．
本記事では，ROS2（foxy）ではどうすれば良いかを紹介しますが，ほとんど ROS1 と変わらないです．
なので，差分部分だけ説明しょうと思います．
ソースコードは下記にて公開しています（Apache2.0）

- melodic : https://github.com/RyodoTanaka/rviz_plugin_examples/tree/foxy-devel

環境については，DockerでROSの環境ベースを作っているので，興味のある方は是非使ってみてください...！

- https://github.com/RyodoTanaka/ubuntu

# 動作説明
ROS1と動作の様子は変わらないので，同じものを載せておきます．
画像の中では ROS1 環境のものですが， ROS2 (foxy) で動作しますので，是非やってみてください．
ソースコードはこちらです．

- https://github.com/RyodoTanaka/rviz_plugin_examples/tree/foxy-devel

[![rviz-panel.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110699/6de4cffa-e3bc-b50f-72bb-f69e3ba74a70.gif)](https://youtu.be/xL5g6bMIP3w)


# コード解説
前述の通り，差分部分だけ解説します．

- https://github.com/RyodoTanaka/rviz_plugin_examples/compare/foxy-devel...noetic-devel

## `dial_panel.h`
https://github.com/RyodoTanaka/rviz_plugin_examples/compare/foxy-devel...noetic-devel#diff-f5d929e81dc50ffa656257028b3e24bc07bff17a4f05a548a0e8ce636037661cL4-R4

- インクルードヘッダをROS2対応のものに変更．
- ノードハンドラをROS2対応に変更．
- PublisherをROS2対応に変更．


## `dial_panel.cpp`
https://github.com/RyodoTanaka/rviz_plugin_examples/compare/foxy-devel...noetic-devel#diff-2f49cbb364cd10486128a8e6a56b669393ce621077f287f36c35a8395af602fb

- `#include <pluginlib/class_list_macros.h>`を`#include <class_loader/class_loader.hpp>`に変更
- デバッグ用にロガーを設定
- ROS2用にNodeのアロケーションを行う
- ROS2対応のPublisher設定に変更
- プラグインの登録を` CLASS_LOADER_REGISTER_CLASS(rviz_plugin_examples::DialPanel, rviz_common::Panel) `に変更

## `plugin_description.xml`
https://github.com/RyodoTanaka/rviz_plugin_examples/compare/foxy-devel...noetic-devel#diff-0aeb8d00de9bbaadd72e3b0d6a29f6fc55845d9fc328b23d15d40bb71c523df9

- ライブラリ名の頭に`lib`をつけないように変更（Windows対応のためらしい）
- 継承元クラス名の変更（`rviz::Panel` -> `rviz_common::Panel`）

## `CMakeLists.txt`
https://github.com/RyodoTanaka/rviz_plugin_examples/compare/foxy-devel...noetic-devel#diff-1e7de1ae2d059d21e1dd75d5812d5a34b0222cef273b7c3a2af62eb747f9d20a

- `catkin`から`ament`対応に変更
- `plubinlib`のエクスポート設定が必要なので追記．
  (`pluginlib_export_plugin_description_file(rviz_common plugin_description.xml)`）

## `package.xml`
https://github.com/RyodoTanaka/rviz_plugin_examples/compare/foxy-devel...noetic-devel#diff-37a67ff78eb7260214b323353263b9af40a2fa98719a1e81937fae0159df87a3

- colcon ament 対応の`package.xml`に変更

# おわりに
というわけで，特筆すべき変更点を Githubのdiffとともに記しました．
なんだか雑なコミット履歴みたいになってしまいましたが，下手に説明を増やすよりわかりやすいかと考えたため，このようにしました．
diffからもわかるとおり，ROS1とほとんど変わりません．
Qt 部分の説明は[前記事](https://qiita.com/RyodoTanaka/items/4924af4f7b1e91f3a5b9)でしっかり行っているので，是非そちらと合わせてご覧ください！

というわけで，次回は`rviz::Display`（ROS2なら`rviz_common::Display`）を使うプラグインを作ろうと思います！
【超簡単！】直感的にGLSLを学ぶ。(3)

# 赤い点滅を描く

とりあえず、何も考えずこれをエディタに入力してみましょう。
→[glslエディタへ飛ぶ。](http://jp.wgld.org/js4kintro/editor/#precision%20mediump%20float%3B%20%2F%2F%20%E8%AC%8E%0Auniform%20float%20t%3B%20%2F%2F%20t%E3%81%AB%E3%81%AF%E6%99%82%E9%96%93%E3%81%8C%E5%85%A5%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0Auniform%20vec2%20%20r%3B%20%2F%2F%20%E7%94%BB%E9%9D%A2%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%89%E3%81%97%E3%81%84%E3%80%82%0A%0A%2F%2F%20%E6%8F%8F%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%84%E3%81%A4%0Avoid%20main(void)%7B%0A%09%2F%2F%20sin()%E3%81%A7sin%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%09%20%2F%2F%20abs()%3A%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%81%B8%E3%81%AE%E5%A4%89%E6%8F%9B%E3%80%82%0A%09%20float%20red%20%3D%20abs(sin(t))%3B%20%2F%2F%20*1%0A%20%20%20%20gl_FragColor%20%3D%20vec4(red%2C%200%2C%200%2C%201.0)%3B%0A%7D)
第3回は終了です。

```glsl
precision mediump float; // 謎
uniform float t; // tには時間が入ります。
uniform vec2  r; // 画面サイズらしい。

// 描くためのやつ
void main(void){
	// sin()で、sinに変換します。
	 // abs():絶対値への変換。
	 float red = abs(sin(t)); // *1
    gl_FragColor = vec4(red, 0, 0, 1.0);
}
```

赤い点滅が出力されます。終わり。
![text.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276138/52668234-bcf8-eb93-0954-0c8e40668235.gif)


【色々学ぶより、まず実行して瞬間的に学びたい人用に、既に偉大な方々が書かれた入門用のコードをもっと簡単に紹介していきます。】
今回はdoxasさんが書かれたコードを元にしています。：https://qiita.com/doxas/items/7e830faefdf14189a7a4
Windowsのsystem関数でLinuxの/dev/nullを実現する

windowsのsysytem関数で、exeから他のexeを呼ぶ際に以下を実現したかったのでメモ

- 呼びだすexeの標準出力を表示させない
- 呼びだすexeの戻り値だけ利用したい

```c++
#include <iostream>
#include <process.h>

int main()
{
    int result;

    //「> nul」で標準出力を表示させません。
    result = system("Test.exe > nul"); 
    printf("-------------------------\n");
    printf("result : %d\n", result);
}

```
オリジナル Rviz Plugin をつくってみる 1. Rviz Plugin の仕組みと種類

# はじめに
本記事は，下記記事のシリーズ記事です．
関連記事等気になる方は是非下記記事から飛んでください！

https://qiita.com/RyodoTanaka/items/eadfb81bd52404dabdb4

# Rviz と Qt の簡単な仕組み
Rvizは Qt（キュートって読んでるんですがあってますかね...？） というクロスプラットフォームGUIライブラリを使って実装されています．
ゆえに，そのプラグインも Qt に沿ったものになります（というかそのものです）．

QtでGUIを設計するにはQtの仕組みがわかっている必要があるのですが，下記がわかっていれば良いと思います．
理解間違いや，その理解では今後まずいことになるよ...！という場合は，是非コメントにて教えてくださいm(_ _)m

- Qt独自のスレッドがメインプログラム（ここではROSと繋がってるところ）とは別に回ってる．
- ROSとつながる方のプログラムが走ってるスレッドとQtのスレッド分けたりはライブラリが良きに設定してくれてる．
- Qtは `SIGNAL` -> `SLOT` という流れで処理を繋いでいる．

最後のやつだけもうちょっと詳しく説明します．
Qtは前述の通り，独自のスレッドが回っているのですが，その際何かしらの `SIGNAL`，例えば「ボタンをクリック」が発生した場合，`SLOT`例えば「TopicをPublish」する処理を実行します．
要は，

- `SIGNAL`で割り込みが発生 -> `SLOT`がコールバック関数

というイメージです．
このイメージがあれば，なんとなく中で何をやっているのかわかった気になれると思います．

# Rviz Plugin の種類
Rviz Plugin と一口に言っても，作る際に継承するクラスが下記のようにいくつかあります．
もちろんこれだけではないですが，本記事では下記３つを実装できるようになりたいので，ひとまずこれだけ紹介します．

- [`rviz::Panel`](https://github.com/ros-visualization/rviz/blob/noetic-devel/src/rviz/panel.h)：画面左上の`Panels`から追加可能なプラグイン．`Display`もパネルのひとつ．
  ![rviz_panel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110699/d1136a58-94cf-edcb-a735-a5ea941c53eb.png)
- [`rviz::Display`](https://github.com/ros-visualization/rviz/blob/noetic-devel/src/rviz/display.h)：RvizのDisplay部分のプラグイン．
  ![rviz_display.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110699/13f6fa73-cb40-3338-650a-6a43e5dace5b.png)
- [`rviz::Tool`](https://github.com/ros-visualization/rviz/blob/noetic-devel/src/rviz/tool.h)：画面上のツールバーに追加できるようになるプラグイン．
  ![rviz_tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110699/93e327f0-aff1-36e3-962f-0f48b3254140.png)

というわけで，次回から`rviz::Panel`を追加する方法を紹介しようと思います．
次記事 -> https://qiita.com/RyodoTanaka/items/4924af4f7b1e91f3a5b9
オリジナル Rviz Plugin をつくってみよう 0. 概要

# メタ情報
ROS Advent Calender 2020 に空きが結構あるなぁ...ということで，
前から勉強したかったRviz Plugin の作り方についてまとめ直し，共有できればと思います．
昨年までにROS Advent Calender登録詐欺をしてしまっている :sob: ので，贖罪のためにも記事を頑張って書こうと思います．
よろしくお願いします！

# はじめに
ROSをいじっていると，Rvizがめっちゃ便利だなぁ...ってなりますね！
それと同時に，なんかカッチョ良いRviz Plugin作りたいな or 既にあるPluginでどうやって作ってんの...？ってなると思います．

というわけで早速ネットで調べてみれば，いろんな素晴らしい記事がヒットします．
他にもたくさんの記事があります．挙げきれていないです...！

- [RvizPlugin作成入門](https://www.slideshare.net/Takahashi1/rvizplugin)
- [ROS講座74 twistを送るrviz panel pluginを作る](https://qiita.com/srs/items/da3b65ca365644783068)
- [RvizのパネルをQtで開発する方法 Part1【C++】【ROS Kinetic】](https://www.asrobot.me/entry/2018/12/21/030959)
- [ROS可視化最先端](https://github.com/garaemon/201510-rosjp/blob/master/rosjp_201510/ueda_rosjp.pdf)
- [ROSにおけるrqtを使用したGUIアプリの作成方法](https://myenigma.hatenablog.com/entry/20140330/1396182802)
- [RViz Plugin Tutorials](http://docs.ros.org/en/indigo/api/rviz_plugin_tutorials/html/index.html)

ここまでは，おそらくこの記事にたどりついた方ならなんとなくご覧になったことがあると思います．
だいたいまとめると，

- 大概の機能は自分で作らなくてもいろんな便利なPluginがあるぽい
- オリジナルのやつをつくるとして，Qtが使えれば良いぽい

という感じかと思います．一方で，

- Qtのオブジェクト配置って全部ソースコードでやんの...？
- MoveItのパネル（下記参照）とか，まさかあれも全部ソースコードにレイアウト直書きなの...？
- qtcreatorってのやってみたけど，そっからROSにつなぐのは結局よくわかんねぇ...！
- ROS1ならできそうなことはわかったROS2は...？

![rviz_moveit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110699/053d9e2b-37d4-4973-9c8e-ce4b692296ae.png)


という不満を持つようになるかと思います．
基本的な説明や概念，枠組み等はこれまでに挙げてきた記事をご覧になれば十分わかると思います．
本記事では，私がわかっていなかった内容を中心に書いていこうと思います．
まだ勉強途中なので，リストが更新されると思います．よろしくお願いします．

- [オリジナル Rviz Plugin をつくってみる 0. 概要](https://qiita.com/RyodoTanaka/items/eadfb81bd52404dabdb4)
- [オリジナル Rviz Plugin をつくってみる 1. Rviz Plugin の仕組みと種類](https://qiita.com/RyodoTanaka/items/9cf53f153b694b9abc21)
- [オリジナル Rviz Plugin をつくってみる 2. ROS1で .ui ファイルを使ってオリジナルパネルをつくる](https://qiita.com/RyodoTanaka/items/4924af4f7b1e91f3a5b9)
- [オリジナル Rviz Plugin をつくってみる 3. ROS2で .ui ファイルを使ってオリジナルパネルをつくる](https://qiita.com/RyodoTanaka/items/4ca117672ad171472578)
【超簡単！】直感的にGLSLを学ぶ。(2)

# グラデーションを描く

とりあえず、何も考えずこれをエディタに入力してみましゅ。
→[glslエディタへ飛ぶ。](http://jp.wgld.org/js4kintro/editor/#precision%20mediump%20float%3B%20%2F%2F%20%E8%AC%8E%0Auniform%20float%20t%3B%20%2F%2F%20t%E3%81%AB%E3%81%AF%E6%99%82%E9%96%93%E3%81%8C%E5%85%A5%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0Auniform%20vec2%20%20r%3B%20%2F%2F%20%E7%94%BB%E9%9D%A2%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%89%E3%81%97%E3%81%84%E3%80%82%0A%0A%2F%2F%20%E6%8F%8F%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%84%E3%81%A4%0Avoid%20main(void)%7B%0A%09%2F%2F%20gl_FragCoord.x%E3%81%AF%E3%80%81%E7%94%BB%E9%9D%A2%E3%82%B5%E3%82%A4%E3%82%BA(512px)%E3%81%8C%E5%85%A5%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%09%2F%2F%20%E3%81%AA%E3%81%AE%E3%81%A7a%E3%81%AB%E3%81%AF%E3%80%810~1%E3%81%AE%E6%95%B0%E5%80%A4%E3%81%8C%E5%85%A5%E3%82%8B%E3%80%82%0A%20%20%20%20float%20a%20%3D%20gl_FragCoord.x%20%2F%20512.0%3B%0A%20%20%20%20%2F%2F%20vec3()%E3%81%A7%E5%A4%89%E6%8F%9B%E3%80%82%0A%20%20%20%20%2F%2F%20%E3%81%A4%E3%81%BE%E3%82%8A%E7%BF%BB%E8%A8%B3%E3%81%99%E3%82%8B%E3%81%A8%20gl_FragColor%20%3D%20vec4(a%2C%20a%2C%20a%2C%201.0)%3B%0A%20%20%20%20gl_FragColor%20%3D%20vec4(vec3(a)%2C%201.0)%3B%0A%7D)
第2回は終了です。

```glsl
precision mediump float; // 謎
uniform float t; // tには時間が入ります。
uniform vec2  r; // 画面サイズらしい。

// 描くためのやつ
void main(void){
	// gl_FragCoord.xは、画面サイズ(512px)が入っている。
	// なのでaには、0~1の数値が入る。
    float a = gl_FragCoord.x / 512.0;
    // vec3()で変換。
    // つまり翻訳すると gl_FragColor = vec4(a, a, a, 1.0);
    gl_FragColor = vec4(vec3(a), 1.0);
}
```

グラデーションが出力されます。終わり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276138/d1781107-8031-a11f-f748-79b86e39b041.png)

【色々学ぶより、まず実行して瞬間的に学びたい人用に、既に偉大な方々が書かれた入門用のコードをもっと簡単に紹介していきます。】
今回はdoxasさんが書かれたコードを元にしています。：https://qiita.com/doxas/items/f34325520d1aa5af4692
【超簡単！】直感的にGLSLを学ぶ。(1)

# 黄色い背景を描く

とりあえず、何も学ばず、web上のエディタにこれを入力してみましょう！
→[glslエディタへ飛ぶ。](http://jp.wgld.org/js4kintro/editor/#precision%20mediump%20float%3B%20%2F%2F%20%E8%AC%8E%0Auniform%20float%20t%3B%20%2F%2F%20t%E3%81%AB%E3%81%AF%E6%99%82%E9%96%93%E3%81%8C%E5%85%A5%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0Auniform%20vec2%20%20r%3B%20%2F%2F%20%E7%94%BB%E9%9D%A2%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%89%E3%81%97%E3%81%84%E3%80%82%0A%0A%2F%2F%20draw()%20%E7%9A%84%E3%81%AA%E3%82%84%E3%81%A4%0Avoid%20main(void)%7B%0A%09%2F%2F%20css%E3%81%AE%E3%80%81rgba()%E3%81%A8%E4%B8%80%E7%B7%92%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20gl_FragColor%20%3D%20vec4(1.0%2C%201.0%2C%200.0%2C%201.0)%3B%0A%7D)
第1回は終了です。

```glsl
precision mediump float; // 謎
uniform float t; // tには時間が入ります。
uniform vec2  r; // 画面サイズらしい。

// 描くためのやつ。
void main(void){
	// cssの、rgba()と一緒。
    gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);
}
```

黄色い面が出力されます。終わり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276138/8dbad92c-56cf-5526-7514-28e280520ec4.png)



【色々学ぶより、まず実行して瞬間的に学びたい人用に、既に偉大な方々が書かれた入門用のコードをもっと簡単に紹介していきます。】
今回はdoxasさんが書かれたコードを元にしています。：https://qiita.com/doxas/items/b8221e92a2bfdc6fc211
リモートワーカーのための健康維持ガイド１

#はじめに
コロナの影響で多くの方が在宅で仕事をすることになったと思います。
しかし、慣れないリモートワークに不健康な生活習慣であったり、体に何らかの悪影響が起きた方もいらっしゃるでしょう。
そこで、そんなリモートワーカーに向けて健康維持ガイドを海外の記事を翻訳していこうと思います。

#導入
リモートでの作業、または自宅での作業。ますます現実になりつつあるみんなの理想。家で仕事するとなると、遅く起きたり、パジャマで作業したり、交通渋滞などを心配したりする必要がないとほとんどの人は、考えます。基本的に、やりたいことを何でもします。しかしそれは部分的に正しいかもしれませんが、リモートで作業することは身体の健康に影響を与える可能性があります。そのため、リモートの開発者がアクティブで健康を保つことは重要であり、それが今回の話す内容です。

確かに、自分を大切にし、健康的でアクティブなライフスタイルを楽しむ開発者もたくさんいます。もしあなたが彼らのような人なら、この記事の残りをスキップしても構いません。なぜならば、より健康なライフスタイルから利益を得ることができる私のような開発者に役立つためにこの記事を書いたからです。自分のキャリアに完全に集中していて、健康的なライフスタイルを気にする十分な時間がない人でも、健康的であることは生産性も高めることに忘れないでください。

新しい家やすでに自宅で仕事をしていて、仕事をしていないときは別のことしていたい人のために、4年間リモートで働いてきた私がリモートワークのコツをいくつかご紹介します。これから述べることはすべて、個人的な経験と私が学んだことと覚えておいてください。私は医者でもトレーナーでもありません。

##ルーチンはリモートワーカーにとって重要
リモートで作業することの肝心なことは、退屈な９時から５時までのオフィスルーチンを実行する必要がないとことだと思います。ただし、整理された状態を維持し、勤務時間とリラックスする時間を分けるための何らかの仕組みは必要です。
###朝でも夜でも仕事をしたい場合は、すべてのリモートワーカーは自分のためにルーチンをこだわる必要がある。

あなたは夜型ですか？日中の勤務時間中に会議に出席する必要がない場合は、たとえば午後7時から午前3時まで働き、正午まで寝ることは何の問題もありません。また、午前9時から午後6時まで働くことを好む人もいたり、会社がそういう働き方を要求するのも結構でしょう。

つまり、あなたが働いているべき時間とあなたが好きなことをするのに自由である時間を覚えておく必要があると言うことです。もちろん、特に他の国のクライアントやリモートチームと協力する必要がある場合は、ある程度の柔軟性が必要になります。現地時間より7時間早い時刻で作業しているため、その週は通常より少し遅く作業します。

調整する必要がありますが、同時に、作業時間と遊ぶ時間の間に明確な線を引くようにしてください。

###自分のために時間を作る
ルーチンをちゃんとコントロールし、仕事以外の時間を含めることを確認しましょう。時間は好きなだけ楽しむことができるあなたのものです。日の出で毎日ビーチを散歩したいですか？キャンディークラッシュで遊んでみませんか？それもいいでしょう。

リモートで作業する場合、仕事以外のスケジュールされた時間は非常に重要です。それは精神衛生を保ちます。仕事で悩むのはとても簡単です。日中の仕事でフリーランスのビジネスやサイドプロジェクトを持っていない開発者に会ったことはありませんか？私は会ったことがないです。




#参考文献
[A Remote Worker's Guide To Staying Healthy](https://www.toptal.com/remote/staying-healthy-while-working-remotely)
アドベントカレンダー14日目：SREを読んでみた「分散システムのモニタリング」編④

前回の内容では、モニタリングシステムがユーザーに伝えるべきこととモニタリングシステムにおいて、重要なシグナルの種類について、学びました。
今回は、今まで学んだ原則のまとめを行います。

## 原則のまとめ
モニタリングやアラートのルールを作成する際は、以下の質問を自分にしてみると、誤検知やページャーによる燃え尽き症候群を避けることに役立ちます。（ページャーとは、人間が即対応が必要なタスク、ページは人間が即対応が必要なことを示すアラートです。）

* ルールによって、検出された状況は、そのルールによって検出される状況であり、緊急対応可能か？また、ユーザーに影響を与えることはあるか？
* そのアラートは、無害なものだとして、対応せずにおけるか？そのような状況が生まれないようにするにはどうすればいいのか？
* アラートは確実にユーザーに悪影響を与えるものなのか？
* アラートにアクションを取ることができるか？緊急で対応する必要があるか、明日まで待てるか、安全に自動化できるか、長期的な対応か、短期的な暫定対応か？
* ページで問題を受ける人が他にいるか？ページが不要となることはないか？

### ページに対する基本哲学

* ページのたびに緊急対応という感覚を持つ。ただし、緊急対応が多すぎると疲弊していう。疲弊はミスを生む。
* すべてのページは、具体的な対応が可能でなければならない。
* ロボット的なレスポンスを返せばいいだけのページは、ページとすべきではない。
* ページは、新たな問題に関することであるべきである。

### 長期にわたるモニタリング
モニタリングシステムはモニターするシステムの進化に伴って、進化する必要があります。今日起きたエラーは、非常に稀なエラーであったとしても、将来的には頻発するエラーになるかもしれません。そうならないためには、根本原因を見つけるべきです。
根本的な解決ができないなら、対応を自動化すべきです。今日発生している問題に対処するということは、明日システムの改善に当てる時間が無くなることになります。そのため、システムの長期的な運用に向けて、短期の可用性やパフォーマンスの低下を受け入れる必要が出てきます。
長期的な改善と短期の可用性はトレードオフです。
重要なことは、ページを独立したイベントをとらえるのではなく、そのページがシステム全体に与える影響を考え、長期に持続可能なシステムを目指すことです。

##まとめ
* モニタリングルールの原則、基本哲学を学んだ。
* モニタリングは、システムを長期的に持続可能にするために行う。
* 短期の可用性と狂気的な改善はトレードオフ

#### 参考文献
1. Betsy Seyerほか　SRE サイトリライアビリティエンジニアリング　オライリー　66-69
マンガでわかるおんぼろ煙突化ミニアンチパターン

![7D3999A4-F605-4622-8B46-FAFFE019A279.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11525/f9f51687-6ee6-efd6-8a1d-ee684255f480.png)
http://wiki.c2.com/?AutogeneratedStovepipeAntiPattern

薪ストーブというのは燃焼時の腐食物質のせいで、使っているとすぐに修理が必要になります。場当たり的なつぎはぎ修理を繰り返してボロボロになった煙突にたとえて、その場しのぎの対応を積み重ねたソフトウェアを、ストーブパイプと呼ぶことがあります。

ストーブパイプのアンチパターンは複数あり、これは英語名で Autogenerated が頭に付いているバージョンです。当時は、自動生成ウィザードが生成したコードからアプリケーションを作ろうとするブームがありました。そうして作られたものは、プロトタイプ段階での単独動作はうまくいきますが、実際にリアルな要求にさらされると、当然、手作業であちこちにつぎはぎのようなコーディングが必要になります。アーキテクチャ設計をもとにした計画に沿ってではなく、具合の悪い場所を見つけるたび無計画にコードが追加されることになるため、プロダクトはおんぼろ煙突になります。

現代ではこの自動生成を、安易なフレームワーク信仰に置き換えて読むことができるでしょう。もしかすると、自分たち固有の問題と、聞きかじって採用したフレームワークが想定している状況との間に、本当は致命的な相性の悪さがあるかもしれません。フレームワークが暗黙的にやってくれている処理は、フレームワーク作者がこれでいいだろうと考えた、最大公約数でしかありません。

また多くの場合、人気のあるフレームワークプロダクトは、デモアプリを作るのには非常に長けている、という点が、自動生成コードとの類似点として挙げられます。デモが魅力的であることが、人気を得た理由なのです。魅力的なデモにとって都合のいい暗黙の動作が、それぞれ固有の問題を抱えた開発者にとっても都合の良いものであるのかどうかは、十分に検討するべきです。

アンチパターン本では、この種のストーブパイプ化を避けるには、より普遍性の高い安定したインターフェースに依存したアーキテクチャが大切だと説明されています。複数のスケールに対応できる共通基盤を安定抽象とすることで、後から都合の悪い箇所に醜いパッチを当てるようなコーディングを避けることができるという考えかたです。
react-infinite-scrollerで、loadMoreが２度動く場合の対処法

## 発生した事象
react-infinite-scrollerで無限スクロールを実装していると、
loadMoreが２度動いてしまい、表示するデータを格納するstateに重複データが格納されるという挙動に悩まされました。
## 対処法
[こちらのIssue](https://github.com/danbovey/react-infinite-scroller/issues/143#issuecomment-736507748)に対処法がありました。

1. データをFetch中かどうかを判定するstateを追加

    ```typescript
const [isFetching, setIsFetching] = useState(false);
```

2. 追加したstateを判定条件に加える

    ```typescript
    <InfiniteScroll
      pageStart={0}
      loadMore={fetchData}
      hasMore={!isFetching && hasMoreTracks} // isFetchingを判定条件に追加
      initialLoad={true}
      loader={<div key={0}>Loading ...</div>}
      useWindow={false}
    >
      {items}
    </InfiniteScroll>
    ```
 
3. loadMoreに設定するデータ取得処理で`isFetching`のstateを操作

  ```typescript
  const fetchData = async () => {
    try {
      setIsFetching(true);
      {
        /* データ取得処理 */
      }
    } finally {
      setIsFetching(false);
    }
  };
  ```

## まとめ
画面の一番下までスクロールした場合に、loadMoreが実行される機構なので、
初回のDOM生成時に誤作動を起こす可能性があるとのこと。

同じ問題にハマった人の助けになると嬉しいです。
enebularが提供するHeroku上のNode-RED実行環境

# はじめに

enebularは、フローエディタで作成したNode-REDのフローを、RaspberryPiやHeroku、AWS Lambdaなどにデプロイして実行する機能を提供しています。
[enebular-agentで何かを作る改め紹介＆使い方](https://qiita.com/jksoft/items/8974bbecf578239bb76f)の記事では、RasperryPiなどのデバイスでenebularで作成したフローをデプロイ、実行するときにデバイスにインストールして利用するenebular-agentが紹介されています。
この記事では、Heroku環境にフローをデプロイ、実行するときに必要となるenebular-agent-herokuについて紹介しようと思います。

# enebular-agent-herokuとは

enebular-agent-herokuは、enebularがフローをHerokuにデプロイするときに、デプロイ先のHeroku環境に予めデプロイしておく必要があるアプリです。

enebularでフローのデプロイ先のHeroku環境を選択するダイアログに`Deploy to Heroku`ボタンがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380472/9a94fb6e-171e-1127-1128-7d610f38e87c.png)

これがHerokuにenebular-agent-herokuのデプロイを行うボタンです。

`Deploy to Heroku`ボタンを押すと、以下のようなHerokuの画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380472/caf2d53e-aa87-7a4d-b5be-021b754e075b.png)

App name、USERNAME、PASSWORDを入力し、`Deploy`ボタンを押すとデプロイが開始します。
**注意: AGENT_HEROKU_VERSIONという項目もありますがこの値は変更しないでください**

# enebular-agent-herokuの仕組み

enebular-agent-herokuをHeroku環境にデプロイすると、`Heroku Postgres`add-onも追加されます。
enebularからフローをデプロイすると、デプロイしたフローはPostgreSQLに保存します。

通常のNode-REDの場合フローをファイルに保存しますが、Herokuの場合デプロイしたアプリでファイルを利用できないため、PostgreSQLに保存します。

# デバッグ

フローの開発・デバッグは通常以下のような流れになります。

1. enebularのフローエディタでフローを開発する
2. フローエディタ上でフローを実行して動作確認する
3. 不具合があればフローエディタでフローを修正する
4. 不具合がなくなったらHerokuにフローをデプロイする
5. Heroku上で動作確認する
6. 不具合があったら3に戻る

上記の流れでは、5のHeroku上での動作確認において不具合が見つかった場合に3に戻るため少々手間がかかります。
Herokuでのデバッグが頻繁に発生するような開発の場合は、直接Heroku上でフローを編集することもできます。

編集するには、デプロイ先のHerokuの以下のURLにWebブラウザでアクセスします。App nameはenebular-agent-herokuデプロイ時に指定したApp nameです。
`https://<App name>.herokuapp.com/red/`

以下の画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380472/9609686f-eaba-4dd3-bfcc-bab24c8f9481.png)

ユーザ名とパスワードに、enebular-agent-herokuのデプロイ時に指定したUSERNAME/PASSWORDを入力してログインするとフローエディタが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380472/6e464957-9024-4271-8416-a9a0d7b1d48b.png)

ここでフローを編集し、右上のデプロイボタンで保存・実行することができます。

実行環境であるHeroku上で直接フローを編集できるためデバッグが効率化できます。

**ただし、ここで保存したフローはこのHeroku環境のPostgreSQLにのみ保存します。つまり、enebularに保存されているデプロイ元のフローは変更されません。デバッグが終わったらenebularに登録されているフローにも変更内容を反映するようにしてください。**

# まとめ

簡単ではありますが、enebular-agent-herokuについて紹介しました。
enebularを使うと、クラウド(Heroku)上にNode-REDの開発・実行環境を簡単に構築できますので、クラウドでNode-REDを運用したい場合にお試し頂けると幸いです。
Herokuの優位性とユースケース(初・中級者向け)

こんにちは。リゾルバの[ 佐伯(yonyonsaeki) ](https://mobile.twitter.com/yonyonsaeki)です。

Heroku Advent Calendar 17日目を担当します。
[弊社](https://www.re-solver.co.jp/)の[白石が15日目](https://qiita.com/naoya-shiraishi/items/99d5b14f76263db8f75a)、[齋藤が16日目](https://qiita.com/shunsaito/items/589fb31eab3da117d789)、と共に3日間思い思いのテーマで書いています。
宜しければそちらもどうぞ。


僕自身はHerokuにはプリセールスのレイヤーで関わっていくことが多いため
今日は、技術的に深い話を考える前の段階で

そもそも「Herokuへの期待や価値・ユースケース」というのがどのように訴求されて
採用され、Engineerの皆さんへ案件として届くことがあるのか、

をざざっとご紹介していきたいと思います。


技術や細部の話ではなく恐縮ですが、
年の瀬ですし、ベーシック系の記事にも一定量の需要があると信じて書きます。


#Herokuに求められていること・ユースケース
##1. アプリケーションサービスの素早い立ち上げ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391944/f3cc583f-02a0-232e-f728-12af544d6cd9.png)

HerokuはAWSインフラサービス上に展開されたコンテナ型のアプリケーションプラットフォームで
各種の事例が証明するように(後述します)、本番レベルのスパイクでもスケール可能な足回りを
サービスとして利用することができるため
展開を考えているアプリケーションの構築のみに集中しやすくなります。

アイディアをすぐ形に、といった耳障りの良い言葉はよく聞きますが

実際、PMF前のスタートアップサービスや、大企業の新規事業など、
市場との対話(テストマーケなど)による段階的投資が前提となるようなフェーズとは
非常に相性が良いです。

ビジネスのスケールやサービス拡張の構想を見越したインフラ構成や技術選定、
といった部分はしっかりとCTO/VPoEを据えてエンジニアチームを組成できる頃には重要になってくるテーマですが
MVP展開や1stローンチの段階をいかに早く迎えるか、は優先度の高いビジネスニーズです。

###事例
少し前のものになりますが、当時高校生CEOでも話題になった
レシート買取アプリ"ONE"もHerokuを活用してローンチされた、という記事を見ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391944/e46d5eb0-b114-4498-3334-3756f95129e1.png)


構想して、作り切るまでのスピードの速さ、
全く読めないリリース直後のスパイクもスケールアップで乗り切る、
こうした事例が多い印象です。

引用URL:
https://www.salesforce.com/content/dam/web/ja_jp/www/documents/customer_stories/onefinancial.pdf
https://japan.zdnet.com/paper/20013025/30003073/#dl_start

(当時の記事なので、社名が違いますが現在はリリースから数年経ち現在のWED株式会社に社名変更されています。)


##2. CRMと繋がるサービス基盤
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391944/f618a513-dec7-afbb-5a0e-ec1c2ff52728.png)

提供側は当然サービスをローンチするだけでなく、グロースをしていかなければいけません。

そのために、機能をスピーディに追加していくだけでなく、その間離反を防止し、
ロイヤルになってもらうよう、提供サイドはユーザのことを理解し、
様々なサポートやマーケティング・コミュニケーションを適切に打っていく必要が出てきます。

サービスの提供システムとは別に、
バックエンドには必ず何らかのシステムや人が介在してそうした顧客接点側の
業務が構築される必要があります。

ここが滑らかに繋がるというのがSalesforceファミリーとしてのHerokuを活用する価値の高い部分です。


### 実体験、デモイメージ交え(Herokuじゃないですが)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391944/e57f1647-b073-4457-62d1-c7980fd348ab.png)

こんなサイクルを回すことをイメージします。

実体験例として、個人的には乗り物のシェアリングサービスを手掛けた際の経験をよく思い出します。

乗車/返却といったコンバージョンがユーザ的にも提供サイド的にも主要な記録として残りますが
ログをよーく解析すると、特定エリアで常連利用してくれてる人が、
いつもの場所に車がないことが続いた結果離脱したことをみかけたり、
返却場所が埋まっていてできずに翌日高い料金を払わされていたり、
といったことが分かってきます。

運営側のリソースの配置先を最適化することや、近所の新規開設ステーションの案内、
1dayクーポンの配布などフォローコミュニケーションが適切です。


![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391944/d0fa3481-d42d-a149-5f3b-409cc75abdec.gif)
(gif動画は、Herokuからサービスの利用データが飛んできてる、というところからの
イメージでデータから分析かけてフォロー対象の抽出、Salesforceでの施策アサイン、裏でMAが走る、というイメージ)

CRMが繋がっていることで、
対象の分析、抽出、施策立て、配信までを統合的にオペレーションできる、という点は非常に有用でした。


#さいごに

近年はDX文脈でのD2C、デジタルサービス化への取り組みも活発になってきました
メーカー系などで卸や小売を介在していたビジネスのお客様も
顧客接点をダイレクトにもちたいという、新しい取り組みは益々増えていくと思いますので
そんな時代にも役立つ、Herokuの良いところを少しでも好きになって貰えたら幸いです。

技術的なことをほぼ記載せずな回になってしまいましたが以上です。
デフォルトの名前空間でxmlをデシリアル化するには？

下記のコードで次のようなエラーが出てしまう。

~~~c#:sample.cs
[XmlRoot("feed")]
public class MyType {...}


public static MyType FromXml(string xml)
{
    XmlSerializer serializer = new XmlSerializer(typeof(MyType ));
    return (MyType) serializer.Deserialize(new StringReader(xml));
}
~~~

~~~text:error
System.InvalidOperationException: <feed xmlns='http://www.w3.org/2005/Atom'> was not expected.
~~~

属性に名前空間を指定することで解決できる。

~~~c#:result.cs
[XmlRoot("feed", Namespace = "http://www.w3.org/2005/Atom")]
public class MyType {...}
~~~

参照：stackoverflow
https://stackoverflow.com/questions/1232311/how-can-i-deserialize-xml-with-a-default-namespace
Next.jsで認証済みの場合のみアクセスできるページの制御

## 概要
Webアプリケーションを作成するときに、認証が必要となるケースもあるでしょう。その際に、ログインページなど未認証の状態で通すページと認証済みではないとアクセスできないページが出てくると思います。
今回はNext.jsを使用した場合の、ページの認証制御をどう実装するかについて書いてみます。

## 対応方法
認証が必要なページに個別にチェック処理を入れていっても良いのですが、もう少し効率の良い実装方法がないかと探してみました。参考になりそうなのが、[How to Implement Authentication in Next.JS to Protect your Routes](https://www.mikealche.com/software-development/how-to-implement-authentication-in-next-js-without-third-party-libraries)のページで、`ProtectRoute`というコンポーネントを別途作成して、実際に表示するコンポーネントの親として定義して認証のチェックを行っています。
この実装でも良いと思いますが、もう少し簡易的にチェックを実装する方法を以下に記します。


## 実装サンプル
### ＜前提＞
* 上記で紹介した記事の`AuthProvider`は使用しません。ログイン処理は別途ログインページで実装するものとします。
* 認証情報はRecoilを使ってグローバルステートで管理します。Next.jsでRecoilを使用する実装は[How to Use Recoil.js Library in Next.js Framework](https://medium.com/swlh/how-to-use-recoil-js-library-in-next-js-framework-33af174dae68)を参考にして頂ければと思います。
* 認証が必要なページのみ、`ProtectRoute`を親コンポーネントに設定します。未認証の場合はルートのパスに遷移させるようにします。
* 本実装のサンプルではログイン・ログアウトの処理は割愛しています。ログイン時は`loginUserState`に情報をセットされていることを前提とします。（2020/1/5追記）

```ProtectRoute.js
import Router from "next/router";
import { useRecoilState } from "recoil";
import { loginUserState } from "../../atoms/LoginUser";

export const ProtectRoute = ({ children }) => {
  const [user, setUser] = useRecoilState(loginUserState);
  if (!user || !user.loginUser) {
    if (typeof window !== "undefined") {
      Router.push("/");
    }
  }
  return children;
};
```

```samplePage.js

import Header from "../../components/common/Header";
import { ProtectRoute } from "../../components/auth/ProtectRoute";
import Sample from "../../components/sapmle/Sample";

const SamplePage = () => {
  return (
    <div>
      <ProtectRoute>
        <Header />
        <Sample />
      </ProtectRoute>
    </div>
  );
};

export default SamplePage;
```
はじめてのLogiX

#はじめに

みなさんNeosVR、楽しんでますか？

日々いろんなものがユーザによって制作されて、公開されているので、最初は遊んでいるだけだった人も、自分でも何か作ってみたいってなぁなんて、考えてる人いますよね？

僕もその一人で、LogiXを学んで何かやりたいなぁと思ったものの、半年ぐらい放置していたら、気が付けば、カジノができていたり、麻雀が遊べるようになっていたりして、ビックリしています。
しかもこれ、他のユーザのみなさんが自分で作ってるんですよね！

そこで、何か作ってみたいと思ってしまった貴方の「LogiXの初心者が何から始めたら良いの？」っていう疑問にお答えするために、
つい１週間ぐらい前までは、なんもわかっていなかった@Garyumaruが、
どうやってLogiXを学んだのか、ご紹介していきます。

#オレンジさん(@mikan3134)の動画を見よう
【Neos VR】3分でできちゃうLogiXの作り方！
https://www.youtube.com/watch?v=Bhg2zbBQUoY&feature=youtu.be

まずはこれを見てみましょう。
とにかく３分間、わからなくても良いので、流して最後まで見てみましょう。

「。。。ま、待ってくれ！！！なんだコレは！早すぎて何もわからんｗ」って、なってますよね？僕も最初、そう思いました。

でも安心してください。いまはわからないから、そう思うだけで、理解ができたら、全部必要なことなので、自然にできるようになります。たぶん。。。

#LogiXを学ぶ前に
さて、みなさんは、NeosVR内でのコントローラーの操作をしっかり覚えていますか？
なんとなくでも遊んでいるだけなら大丈夫なのですが、LogiXを学ぶのであれば、どのボタンがどういう名前でどういう機能なのかは、覚えておきましょう。

他の人から説明してもらうときもVRの世界では、名前で説明されちゃうので、それどれだっけ？ってなってもNeosVRの世界では貴方が間違ったボタンを押しているのかどうか相手に伝わりません。（わかる方法というか、オブジェクトはあるのですが、ここではこれ以上、深堀りしません）

下記はOculus RiftS/Quest/Quest2のコントローラになります。
自分の使っているVRデバイスのコントローラの各ボタンと名前の対応を憶えておきましょう。

・プライマリ（トリガー）
・グラブ
・セカンダリ（スティックやパッドの押し込み）
・コンテキストメニュー
・ダッシュメニュー（左手） / ワールドスイッチャー（右手）
![6pRyOK7w4Z.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35434/932ef65f-04a2-3c9f-6e1c-479e191bd776.jpeg)
画像：NeosVR日本語Wikiより


#オレンジさんの動画を解析してみた
orangeさんの「【Neos VR】3分でできちゃうLogiXの作り方！」の動画の中には、
次のような20のステップがあります。

###使うToolの説明
1) DevToolTip / LogixTipの準備（Inventory > Essential Toolsから取り出す）

###BOXオブジェクトを作る
2) BOXを作成する（コンテキストメニューから新規作成、３Dモデル - BOXを選択する）
3) 作成したBOXを選択する（プライマリボタンでレーザーを出して、BOXに向けて、セカンダリボタンで選択する）
4) BOXのインスペクタを開く（コンテキストメニューボタンで、リングメニューを出して、インスペクタを選択する）
5) BOXのインスペクタからマテリアルウィンドウを開く

###カラーが変化するLogiXを作る
6) ノードセレクターを開く
7) ノードセレクターからColor - FromHSVのノードを選択、空間に置く
8) FromHSVのノードの左側からパラメータのノードをひっぱり出す
9) FromHSVのノードの右側からカラーを確認するノードをひっぱり出す
10) ノード間をつなぐケーブルの削除の仕方
11) ノードセレクターからInput - Tのノードを選択、空間に置く
12) ノードセレクターからMath - Sinのノードを選択、空間に置く、
13) TノードとSinノードとFromHSVノードを繋ぐ
14) TノードとSinノードの値を確認する方法
15) マテリアルウィンドウからマテリアルのインターフェイスノードを開く
16) FromHSVからマテリアルのインターフェイスノードのEmissiveColorにつなぐ

###LogiXをBOXオブジェクトにパックする
17) Boxのインスペクタウィンドウで、子のスロットを作成する
18) このスロットをパッキングルート（Logixを保存する場所にする）
19) 作成したカラーが変化するLogiXをパックする。

###カラーが変化するBOXを保存する
20) インベントリに保存する
![2020-12-15 06.53.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35434/fefea80a-0d29-3aa4-cb7d-7437552a2bd5.jpeg)

###まとめ
以上の20ステップを、動画を見ながら、ひとつひとつ順番にやっていけば、初心者でも簡単にできちゃいます！わからなくなったら、何度も巻き戻して、見ながら進めましょう。

普段３分でやることって、カップ麺にお湯入れてぼーっとしてるだけだから、20もの工程がつまってるなんて、夢にも思わないですもんねｗ

この20ステップでLogiXの基本的な操作を覚えたら、
@FRICK さんの
NeosVR reso Advent Calendar 2020の
https://qiita.com/advent-calendar/2020/neosvr_reso
2日目の投稿
https://qiita.com/FRICK/items/5ba9c07c31df844f84c7
も、サクッとできちゃうはず！
![2020-12-15 06.12.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35434/96d474be-3d2e-499e-52ca-a5511d56f070.jpeg)


みなさんもNeosVRのLogiXで面白ガジェットを作ってみてください。
unityで予測変換が出ないときの解決法

unityでVisual Studioは開くが、予測変換が出てこないという人向けの記事です。

##①ダウンロードの確認

**まず、Visual StudioにUnityのアセンブラが入っているか確認します**

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/7806f988-5ce9-b613-9674-a089ba478040.png)

**まず、Visual Studioを起動すると、上記の画面になるので、**
**「新しいプロジェクトの続行」を押します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/8479774b-2a9e-5efd-d731-f54a0c554a20.png)

**すると、上のような画面になり、右側のリストの下の方にある
「さらにツールと機能をインストールする」を押します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/3ce37501-85bd-7fcf-de54-bce83a5e9eb0.png)

**Visual Studio Installerが開くので、「変更」を押します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/b0d3deed-e267-2f23-a7b5-e1dc42060140.png)

**タブが開くので、下の方へ行き、このUnityのマークがあるボックスへチェックを
入れて、ダウンロードします。
（すでにチェックがついている場合は、すでにダウンロードできているので、
　次の手順へ進みましょう）**

##②Unity側で開くアプリの設定

**次に、Unity側の設定を行います。
デフォルトでは間違ったアプリを開くので、気を付けましょう。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/a626d1ce-e614-7ab9-e1f1-da933a42a6f2.png)

**Unityを起動し、「Edit」->「Preferences」を選択します。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/850380/26832ac3-0b77-61d2-62e7-96ec4fc07c14.png)

**このようなタブが開くので、「External Tools」を選択し、
一番上のプルダウンの項目を、Visual Studio に変更すると、
予測変換が出るようになります。**

（**デフォルトでは、Open by Extensionになっています**）


以上で設定は終了です。
お疲れさまでした！
DataPortal: 新機能さかのぼり（Google マップの凡例）

DataPortalのまだ知らない使えそうな機能を求めて、新機能の一覧を遡ってみました。

[Google マップの凡例](https://support.google.com/datastudio/answer/9713352#legend)
> 凡例を追加すると、閲覧者が Google マップ内のデータをより正確に把握できます。凡例を設定するには、地図のスタイル プロパティを編集します。

早速試してみます。

![スクリーンショット 2020-12-17 1.19.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/885ed74c-01b3-8bc2-d19a-edbe64156de0.png)

![スクリーンショット 2020-12-17 1.20.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/deb3ad9a-fb89-02ec-5120-a5e03177736e.png)

Google マップの下部にバブルや塗りつぶしの凡例が表示されるようになりました。
わかりやすいですね。
【Rails 】rails newによる新規プロジェクト作成

#はじめに
毎回オプションの付け方やバージョンの指定方法を忘れてググることになっているため、rails new周りに関して備忘録も兼ねてまとめます。


#新規プロジェクト作成
####①インストールされているrailsのバージョン確認

```
$ gem search ^rails$ -l

*** LOCAL GEMS ***

rails (6.0.3.4, 6.0.3.2, 6.0.2.1, 6.0.0)

```

こちらに表示されたバージョンを使ってRailsアプリケーションを作成をすることができます。

####②新規プロジェクトを作成する

```
$ rails new 作成するプロジェクト名
```
`rails new`コマンドを入力することで新しいプロジェクトを立ち上げることができます。


####③作成したプロジェクトに移動
```
$ cd プロジェクト名
```

`cd` コマンドを使って作成したプロジェクトのディレクトリに移動します。

####④ローカルサーバーを起動
```
rails server
 もしくは 
rails s
```
ローカルサーバーを立ち上げることができます。

```
=> Booting Puma
=> Rails 6.0.3.4 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 3.12.6 (ruby 2.6.5-p114), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

という表示が出たら立ち上げの成功です。

####⑤デフォルトページを表示
ブラウザでhttp://localhost:3000/
にアクセスし、
You’re on Rails!! の画面 が出ればOK!


#プロジェクトの削除
####①データベースの削除

```
$ rails db:drop
```

データベースを作成している場合は、まずこちらのコマンドで削除する必要があります。



####②ディレクトリを削除

```
rm -r ディレクトリ名
```
こちらのコマンドで削除できます。
ファインダーで消してもOKです。






#よく使うオプション
####データベースの指定

```
(Mysql指定の場合)
Rails new プロジェクト名 -d mysql
もしくは
Rails new プロジェクト名 —database=mysql
```
デフォルトのデータベースはSQLite3です。
Mysqlやpotgresqlに変更したいときには先に指定してしまうとラクです。





####バージョンの指定

```
Rails _6.0.0_ new プロジェクト名
```
デフォルトではインストールされている最新バージョンのrails が起動されます。バージョン指定が必要な場合は、先に指定しましょう。
Flash Advent Calendar 16日目 - 修飾子対応 -

Flashのクラスは通常のプログラミングと同様に修飾子が存在します。

| 修飾子 | アクセス可能範囲 |
|:-----------|:------------|
| public | どこからでもアクセス可能 |
| private | 同じクラス内からのみアクセス可能 |
| protected | 同じクラス、及び子クラス(継承クラス)からアクセス可能 |
| internal | 同じパッケージ内からのみアクセス可能 |

でも、JavaScriptにはpublicしか存在しない。。。

どうやって制御したものか・・・

swf2jsのクラスにはFlashが定義した関数とそれを実現する為の関数が存在してます。
packageクラスの変数や関数を追加すると混沌としたクラスになってしまうので、まずは別空間を準備しようと思います。

[ActionScript3.0仕様書](https://www.adobe.com/content/dam/acom/en/devnet/pdf/avm2overview.pdf)

仕様書を見る限り、変数や関数はtraitに格納されています。
別空間として、traitを格納先として利用しようと思います。
そして、必要になったタイミングでクラスの別空間に格納して利用すれば実現できるのではないかと思いました。

# 別空間を準備する

各クラスが拡張されてもいいようにObjectクラスに
`variables` という空間を準備してMapクラスのkey-valueで管理をする。

| 修飾子 | アクセス可能範囲 |
|:-----------|:------------|
| public | そのままの名前を利用 |
| private | クラスにナンバリングを行い、id_名前で管理する |
| protected | クラス===JSのクラスか、クラス instanceof JSのクラスで判定して通過すればそのままの名前で管理 |
| internal | namespaceが存在するので、namespace_名前で管理する |


# public



```javascript
// 取得
variables.get(name);

// 配置
variables.set(name, value);
```

# private

```javascript
// 取得
if (package.id === scope.packageId) {
    variables.get(package.id +"_"+ name);
} 

// 配置
if (package.id === scope.packageId) {
    variables.set(package.id +"_"+ name, value);
} 
```

# protected

```javascript
// 取得
const package = getPackage(namespace);
if (scope instanceof package) {
    variables.get(name);
} 

// 配置
if (scope instanceof package) {
    variables.set(name, value);
} 
```


# internal

```javascript
// 取得
if (scope.namespace === trait.namespace) {
    variables.get(trait.namespace +"_"+ name);
} 

// 配置
if (scope.namespace === trait.namespace) {
    variables.set(trait.namespace +"_"+ name, value);
} 
```

サクッと書いたのですが、思いつくまでが凄く大変だったのですが
思いついてしまえば、とてもシンプルな構成になりました。

ただ、public以外は判定式が入るので、どうしてもオーバヘッドが発生してしまいます。
ここは今も頭を抱えてるポイントです...。
何かいい案がある方は是非、コメントいただければ嬉しいです:bow:


明日は紀平さん(@tkihira)の「知られざる globalCompositeOperation テクニック」です！！
凄く楽しみにしていたので、是非一読頂ければと思います！！
ruby on rails 文字コードの指定方法　reset cssの適用方法

#はじめに
html&cssの勉強から始めると、raby on railsに入った際に、今まで記述していたものはどこに行ったの？と感じることがあります。その代表が文字コードの指定`utf8`や`reset.css`だと思います。
自分の備忘録としても

+ 文字コードの指定方法
+ reset.cssの適用方法

以上の2つを解説していきたいと思います。

##文字コードの指定方法
よくよく忘れがちになりますが、こちらは以下のファイルを開いて、`encoding`を`encoding: utf8`に書き換えるだけで完了になります。
htmlのときは、毎回文字コードを指定する記述をしていたのに、これだけで全てのファイルに適用されるなんて、とても便利ですよね！
config/database.yml

```databese.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: original_news_development
```

##reset.cssの適用方法
実はこちら、reset.cssのファイルをapp/assets/stylesheetの配下に作成してしまえばそれだけで、適用されるようになっています。これもとても便利！！
どういう仕組みでそうなっているのか、簡単に見てみましょう。
app/assets/stylesheets/application.css

```application.css
/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, or any plugin's
 * vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope.
 *
 *= require_tree .
 *= require_self
 */
```
こちらは、下から3行目に ` *= require_tree .`という記述があります。
これによって、stylesheets以下の全CSSファイルを読み込むという意味になります。
また、
app/views/layouts/application.html.erb
![スクリーンショット 2020-12-16 18.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956316/5297e9de-c94b-f42b-e145-4c7125d2af4a.png)
の9行目の記述に`'application'`という記述がありますが、これはapplication.cssを指しています。
つまり、ここに記述されることによって、全てのhtml.erbファイルにcssが適用されることになります。
よって、reset.cssも自動的に適用されることになります。
今回説明したファイルや、コードは元々記述されているため、何もしなくても、cssが適用される仕組みができています。
railsってめっちゃ便利！！

##終わりに
今日紹介した２つは、カリキュラムに沿ってアプリの制作を行っていると、なかなか意識しづらいところだと思います。
ただ、自分で一からアプリの制作を行う際に、自分は疑問に思ったので紹介させていただきました。
この記事が誰かのお役に立てると幸いです！！
コードレビューでチームの状態を健全に保つ

# はじめに

コードレビューは、チーム開発をしていると避けて通れないプロセスです。

レビューしてもらう立場は「コードの意図が伝わるだろうか」とか「厳しいコメント返ってきたらどうしよう」といった不安があると思いますが、レビュアーの立場では、「コメントの意図が伝わるだろうか」とか「コメント読んで凹まれたらどうしよう」といった不安があります。

チームに軋轢を生むことなく、コメントをポジティブに受け止めてもらえるように心がけていることを紹介します。


# よい書き方の根拠を示す

コメントにはその根拠を添えると理解、納得をしてもらいやすいです。
「IDEがコードインスペクションで別の書き方を提案している」「書籍の〇〇ページにこう書かれている」といった情報はコメントの妥当性を補完してくれますし、角が立ちにくくなります。


# できるだけポジティブな言い回しを使う

改善の余地があるときは、「ダメ」「違う」などのストレートなネガティブワードは避けながら伝えます。

(例)

* 「無駄な処理」→「処理コストを下げられる」
* 「この条件の考慮が足りない」→「この条件も考慮するとよりよくなる」


# 口頭で補足する

文字だけだと厳しい伝わり方になりそうであれば、コメント画面を一緒に見ながら指摘事項について説明します。大抵の場合空中戦を回避できます。



## 好き嫌いのコメントは相手に選択の余地を残す

書き方の良し悪しではなく、好き嫌いを伝えたくなるときもあるでしょう。
レビュアーが自身の好みを反映させようとしているコードは、書いた人が好ましいと思って書かれたものかもしれません。
「自分はこういう書き方のほうがいいと思うが、あなたはどう思いますか？」という伝え方をすれば、「自分はこのままがいいと思う」とレビュアーの意見を却下するハードルも下がりますし、レビュアーは却下されても精神的ダメージが少なくて済みます。


# よいところは伝える

よいと思ったところは、どんな点がよかったかを伝えると、同じような書き方を続けてもらえます。
コメントの指摘を受けてよくなったところは、よくなったと伝えると、同じような指摘が減ります。


# おわりに

コードは後からでも修正できますが、一度悪くなったチームの雰囲気を修復するのは容易ではありません。
チームのパフォーマンスにも影響しますので、レビューコメントの書き方に少しだけコストをかけるのも一つの手段ではないでしょうか。

他者のアウトプットには敬意を払い、意見を述べるときは謙虚にいきたいものです(自戒)。
今年のフルリモートでのチーム開発について課題と工夫についてまとめてみる

## この記事で書くこと　:camping: 
自分の所属している会社はコロナウイルスの影響によって4月からエンジニアは基本的にフルリモートでの作業となった。
後に他の部署のメンバーも一部をのぞきリモートでの勤務になったという状態でどんな工夫をしているのか、そして課題は何か、をまとめる。

## 元々の体制について :feet: 
もともと、業務を一人でもこなせるようなメンバーは入社から一定期間作業の進め方やコミュニケーションなど見た上で週に1営業日〜2営業日のリモート勤務が認められていた。
Google meetで、ずっと繋げている状態でオフィスにいるメンバーといつでも話ができる状態を維持していた。
ただし、オフィスに残るのが1人だけになってしまわないように、基本２名はオフィスにいることを意識して曜日などをずらして運用していた。

## フルリモート以前に既にあったチームでのコミュニケーション機会 :speech_balloon:  
- 週に一度の定例（KPTを行う）
- 開発チームでの朝会（今日やることやつまってることを相談する時間）

## 出てきた課題とそれに対する対応策  :thinking: :pill: 
いくつかの課題が出てきたので、それをチームでどう解決したか？

### 課題１　タスクに詰まったときにどうするか :thinking: 
質問ができるような関係性をチームで作れていないと、初心者の開発者のタスクが進まず、ずっと止まったまま時間が過ぎる

質問するというのは実はなかなかにハードルの高い行為。関係性が作られていない状態のままフルリモートになってしまうと、質問へのハードルが高いメンバーは一人でタスクを抱え込んでしまい、結局週を超えてしまう、ということが結構起きていた。

### 課題１に対して行ったTRY
#### 朝会から昼会までの間にメンバーで進捗確認をする時間をとることにした。 :pill: 

朝会から定時までずっと詰まってることが無いように、間に拾えるような機会を設定した。
自分たちの場合は、朝会が10:00(始業)、昼会（15:00） で行っていた。（後に朝会は12:00に移動した）

#### times(分報)チャンネルをslackに開発メンバーの一人一人が作った。 :pill: 

昼会の追加だけだと解決できなかった為、気軽に詰まってる時や、疑問、状況をつぶやける
個人のtimesを作ることにした。
そのtimesに書き込んだ呟きに別のメンバーが反応して、解決する、といった方法が取れるようになった。
テキストコミュニケーションな為、コードのイメージなどを伝えやすくなった。
少なくとも、詰まってる時に、詰まってるんだな、とわかりやすくはなったので効果があったように思う。

### 課題2　プランニングポーカー、カード無くなったけど、どうする？ :thinking: 
ポイントの見積もりに、自分たちのチームはポイントの書かれた物理カードを使用していた。
でも、フルリモートではそのカードがオフィスに残されてしまったので使えなかった。

### 課題2に対して行ったTRY
#### meetでポイントを書き込む :pill: 
同時に出す、というのは出来なくなったが、それに対しての弊害のようなものは感じていないのでこれで一旦なんとかなってるように思う。


### 課題3　DMまたはslackの電話で届く仕事の依頼がますますチーム内で見えにくくなった :thinking: 
同じオフィスにいる時は、他のメンバーと直接なんか隣で話してるなーとふんわり掴めてた状況が、全く見えなくなった。逆もまた然り。

### 課題3に対して行ったTRY
#### DMは徹底的になくす必要性について全社的にアナウンスをする :pill: 
generalで、DMによって仕事を伝えることについてのリスクについて全社的に伝えた。
すぐに無くなることはなかったが、来るたびに「DMではなく開発のチャンネルで依頼をして欲しい」と開発者全員で
返事をし続けることを意識するうちに、少しづつ事態は解決していった。


### まとめ

ここまで、実際にチーム全体で取り組んだことを書いた。
人数にもよるだろうしこれが全ての対策では無いことはわかり切ったことだが、
今年の特殊な状況でフルリモート、をした経験をここに残し、誰かの参考になったら嬉しいです。 
読んでいただいてありがとうございました。 :bow:
pwn.collegeについて

日本Androidの会秋葉原支部ロボット部 Advent Calendar 2020 19日目です。
勉強会の出席率はイマイチですが、セキュリティとかでネタないの？ということで、セキュリティ＋教育ということで、pwn.collegeの紹介です。


# pwn.collegeとは

pwn.college とは、アリゾナ州立大学の Zardus こと Yan Shoshitaishvili氏と kanak こと Connor Nelson氏によって作成された、オープンソースの教育プラットフォームです。
サイバーセキュリティの概念について実践的に学び、それを実践（手を動かす）することによって初心者の白帯レベルから黄色帯レベルに上げていこうというのがコンセプト。

[https://pwn.college/](https://pwn.college/)
![pwnC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882635/f9da3273-a9a6-607e-c6ea-1ead68124790.png)


作成者の一人、アリゾナ州立大学の准教授でもあるYan氏は、知る人ぞ知る？DEFCONのCTF(Capture The Flag=サイバーセキュリティをテーマにした競技）の現在の運営であるOOO(Order of the  Overflow)のリーダーを務めています。それ以前のカリフォルニア大学サンタバーバラ校（UCSB)では強豪CTFチーム[Shellphish](https://twitter.com/shellphish)を率い、2016年にはDARPAの運営するCyberGrandChallenge（全自動で攻撃、防御を行う競技）で3位の成績を収めるなどの輝かしい経歴があります。


そんな彼が2019年12月に台湾で開催されたカンファレンスHITCONにて、pwn-college betaとしてリリースをアナウンス、今年の8月に正式なバージョンとして公開されました。
[DEF CON CTF主辦人在HITCON CTF論壇，首度公開PWN College開源課程 | iThome ](https://www.ithome.com.tw/news/134838
)


#何が出来るの？

pwn.collegeでは、主に以下のような環境で学ぶことができます。

- [講演動画 on YouTube](https://www.youtube.com/c/pwncollege)：アリゾナ大学の2020年秋の情報セキュリティコースの講義動画
- [講演動画 on Twitch](https://www.twitch.tv/pwncollege/)：アリゾナ大学の2020年秋の情報セキュリティコースの講義動画。授業がある時はライブ配信される
- [CTF環境](https://cse466.pwn.college/)：実際にCTFの課題に挑戦が出来る環境
- [サポート１](https://discord.com/invite/68x4ADt)：Discordによるサポート
- [サポート２](https://groups.google.com/g/pwn-college-users)：メーリングリスト(GoogleGroups)によるサポート


まずはベース知識を得るために[Introモジュール](https://pwn.college/modules/intro)から始めましょうとのこと。この辺を見ると、ベースとなる知識としてコンピュータアーキテクチャからアセンブリ、Linuxのプロセスといったテーマが並び、これらを学んでおきましょうとなっています。




#CHALLENGES登録方法

実際に動いている問題環境へのアクセスは以下で登録をします。
[https://cse466.pwn.college/](https://cse466.pwn.college/)
![cse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882635/99dc1061-fc70-7625-a502-cc632af75068.png)


登録にあたっては特に難しいことは無く、ユーザ名、メールアドレス、パスワードで登録が出来ます。
Challenges から問題を選択。「Run Challenge」ボタンを押すと問題が有効になります。
![chall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/882635/f3b427e5-c8b5-2022-b753-3800bb0decba.png)


スコアサーバの「Terminal」タブから問題サーバにアクセス（挑戦）が出来るほか、設定で公開鍵を登録しておくことで、 直接サーバに接続をすることも可能です。
`ssh cse466@cse466.pwn.college`

記事執筆時点では367問が公開されており、全問クリアをしているのは12人です。



#番宣
番宣するならもう少し余裕みて早めな投稿にするべきでした(笑)。
本日（12/19）開催される[SECCON2020電脳会議](https://www.seccon.jp/2020/ep201219.html)　にて、pwn.collegeの紹介講演があります。
実際にpwn.collegeを作成、運営してる2人を迎え、日本からはCTFを教育に実際に活用されたり教育的価値を考察されたことがある小出先生、中矢さんとの対談になっています。

時差と通訳の関係もあり事前録画での配信ではありますが、翻訳音声入りのチャンネルもありますので、よかったら登録をして見てみてください。
[https://www.seccon.jp/2020/ep201219.html](https://www.seccon.jp/2020/ep201219.html)



# 余談
白帯、黄色帯などの帯の色による階級システム、Yan氏の説明の「wax on, wax off」…そうThe Karate Kid （邦題：ベスト・キッド）の空手の階級、修行の仕組みが取り入れられています。
リアルな[ベルト表彰システム?](https://pwn.college/belts)もあり、Exploitationの6つのモジュールをクリアすると黄色帯レベル、出題されている全部の問題をクリアすると青帯レベルとして、申請をすると物理ベルトが提供されるようです（現在製作中とのこと）。
[https://pwn.college/belts](https://pwn.college/belts)

あと、現在はpwn（問題を攻略してサーバの権限を取得する）カテゴリの問題だけですが、今後は他のカテゴリも対象にしていきたいとのことでした。
TouchDesignerによるオーディオプログラミング例

TouchDesigner
===

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)

# 概要

https://derivative.ca/

インタラクティブにマルチメディアコンテンツを作成するためのノードベースビジュアルプログラミング言語。クリエイティブコーディングに使用される。

開発はDerivative社(カナダ)。もともとOmnibus社でHoudiniの前身PRISMSを開発していたGreg HermanovicとKim DavidsonはSideFXを設立して1996年にHoudiniをリリースする。その後、2000年にGreg HermanovicはSideFXを離れ、Derivative社を設立しTouchDesignerを開発。そのためTouchDesignerはHoudiniと設計思想に共通点が多い。


# 実装例

## サイン波生成

TouchDesignerのオーディオ関連ノードはCHOPカテゴリーにまとまっています。CHOPのAudio OscillatorとAudio Device Outを接続すると音が出ます。周波数はAudio Oscillatorのプロパティから設定、音量はConstantをAudio Device Outに接続して調整するようにしました。

![sine.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/ba925141-61a0-6e9e-b87e-1bd64fe195af.png)


## Delayエフェクト

CHOP Delayノードは音声信号を遅らせるだけでフィードバック機能がないので別の方法でフィードバックループを作成しました（参考： https://www.youtube.com/watch?v=80leysTaskg )

wavファイル再生はAudio File In、そこからディレイ用に分岐した音声を下段のMathノード(Mix1)につなぎます。後続のTrailノードが遅延用に信号を記憶するバッファです。  

フィードバックディレイは本来Trailが想定している使い方とは異なるらしく、バッファをLookupノードで読むには少し工夫が必要になります。どこからどこまでどのようにという情報をPatternノードで与えてやります（Type:Ramp、Sample Rate:44100、Length:735、Amplitude:735）。LookupのWindow LengthはTrailのデフォルトバッファサイズである176400、Index Rangeを0～176400とします。(176400 = 44100 * 4、つまり4秒)  
後続のFeedbackはOutput:Previous Channels at Current Timeとします。

ここからが理解しづらいのですが、その後ろに何も設定しないAudio Para EQを接続しています。これを接続しないと正常な音になりません。一旦正常な音が出たら外してもかまいません。今回は説明用に外さずにそのままにしてあります。  

中段右のMathはFeedback Levelです。プロパティで0.5倍になるよう設定して入力側に再接続しています。TouchDesignerのフィードバックループは、接続やパラメータを間違えると不安定になることもあるので注意して接続してください。  
下段右のMathはWet Levelで、こちらもプロパティで0.5倍にしています。

中段左のConstant(DelayTime)はディレイタイム設定用です。右隣のMath(Sec2Sample)で44100をかけて秒からサンプル数に変換して、さらに右隣のNullからExpressionでPetternのOffsetにつないで制御できるようにしています。

下段右のWet Levelの出力を上段右のMathでDry信号とミックスすれば完成です。

![delay.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22455/f1e377db-98b1-44f7-0068-9d575594fa36.png)


# 感想

TouchDesignerはエディタ画面の操作が気持ちよくできるように考えられている印象です。拡大縮小やスクロール、入れ子構造の行き来だけでも他のビジュアル言語にはない快適さがあります。各ノードを追加するのも一覧がすぐ出てくるので、記憶をたどったり、詳細マニュアルを見たりせずにどんどんプログラミングできます。各ノードのビジュアル表現や背景のビジュアル設定なども派手で楽しいので、エディタ画面をそのまま投影してパフォーマンスすることもあるようです。

オーディオプログラミングに関しては、パフォーマンスや作品制作用途に必要な基本的な部品は大体そろっています。ディレイに関しては今回のフィードバックディレイはやりすぎで、普通にDelayノードの機能の範囲で使うのが良いと思います。  

常時動かしながらノードを接続していくのがTouchDesignerのスタイルだと思いますが、今回のフィードバックディレイのようにサンプル単位で複雑なオーディオプログラミングをすると、プログラムのバグや設定ミスでアプリが固まってしまうこともあります。そういった作業をするときは実行を止めて一旦セーブしてから接続するような慎重さが必要かもしれません。

あとは、各ノードのプロパティで設定しているパラメータが重要であることが多く、スクリーンショットだけではプログラム内容が伝わりづらいということを感じました。

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)
Ginkgoコマンド Tips

## よく使うオプション

|  やりたいこと  |  オプション  |  備考 |
| ---- | ---- | ---- |
|  実行するSpecとそのSpecのファイル行番号を表示する  |  -v  | |
|  指定したディレクトリ配下のSpecを再帰的に実行  |  -r  | |
|  特定のSpecだけを実行  |  -focus <regexp>  | Describeのtextベースのフィルタリング |
|  カバレッジ出力  |  -cover  |  |

### 例
#### 普通にテスト実行

```bash
ginkgo
```

### 指定したディレクトリ配下の全Spec実行
```bash
ginkgo -r <path>
```

<path>は省略可能です。省略するとカレントディテクトリを指定した扱いです。

## 一部のSpecだけ実行

```bash
ginkgo -v -focus ".*Foo.*"
```

これでDescribeのtextに"Foo"を含むSpecだけ実行されます。

## テストカバレッジ生成

```bash
ginkgo -v -cover -coverprofile=./cover.out -r
go tool cover -html=cover.out -o cover.html #カバレッジファイルをhtml形式に変換
```

## 自前のテスト実行時引数を渡す

テスト実行コマンド

```bash
ginkgo -- foo
```

"--"の後に、自前の実行時引数を指定します。
Goのプログラムからは、flag.Args()で取得できます。

```go
import flag

flag.Parse()

for _, v := range flag.Args() {
    switch v {
    case "foo":
        // TODO ここでテスト実行の仕方を変える。
    }
}
```

Ginkgoの公式ページを見ると、値付き引数も渡せるようなことが書かれていますが、渡す方法は分かりませんでした。
[NestJS] POSTリクエスト時にPayloadTooLargeError: request entity too large と表示された場合の対処法

## はじめに
`NestJS`を利用しているプロジェクトでちょっと大きめのサイズ(100kb以上)の画像ファイルをアップロードした際に`PayloadTooLargeError: request entity too large`というエラーが発生し、画像をうまく保存できないという問題が発生しました。

知っていればすぐ解決できる問題ですが、知らないと解決までに時間がかかりそうな問題だったので、備忘のために対応内容をまとめます。

## 解決したい問題
`NestJS`を利用しているプロジェクトで100kb以上のファイルをPOSTリクエストでアップロードすると`PayloadTooLargeError: request entity too large`というエラーが発生し、リクエストがうまくサーバーサイドで処理されない。

**エラーログ**

```error.log
PayloadTooLargeError: request entity too large at readStream (/webpack:/node_modules/raw-body/index.js
// 省略
index.js  message: 'request entity too large',  expected: 151470,  length: 151470,  limit: 102400,  type: 'entity.too.large'
```

## 原因
`NestJS`が内部的に利用している`express`(正確には`body-parser`)のデフォルト設定の値が原因でした。

expressはリクエストのパースに`body-parser`を利用していますが、`body-parser`はリクエストボディの最大値は`100kb`がデフォルト値として設定されています。

そのため、明示的に`body-parser`のlimitを設定してやらないと100kb以上のリクエストはエラーとなります。

## 対処法
明示的に`body-parser`のlimitを設定することでエラーなく処理できるようになります。

```main.ts
import { NestFactory } from '@nestjs/core';
import * as bodyParser from 'body-parser';
import { AppModule } from './app.module';

async function bootstrap() {
  const app: any = await NestFactory.create(AppModule);
  app.use(bodyParser.json({limit: '50mb'})); // jsonをパースする際のlimitを設定
  app.use(bodyParser.urlencoded({limit: '50mb', extended: true}));// urlencodeされたボディをパースする際のlimitを設定
  await app.listen(3000);
}
bootstrap();
```

## おわりに
NestJSでもexpressと同様にPOSTで大きめのデータを送信する際はきちんと`body-parser`の`limit`で受け取れるbodyのサイズを設定しないといけないというのは忘れがちなので、NestJSで実装する際には今後、気をつけようと思います。

## 参考
* [body-parser > API > limit](https://github.com/expressjs/body-parser#limit)
* [Error: request entity too large](https://stackoverflow.com/questions/19917401/error-request-entity-too-large)
* [NestJS > Platform](https://docs.nestjs.com/first-steps#platform)
変数の中に変数を入れたい!! 可変変数ってなんやねん!!

#可変変数ってなんやねん!!

##めちゃくちゃ端的に
`$example1`
↓
`${"example".$i}`
思い出すだけなら、これでわかるかな？？



##活用例
例えば、以下のような変数があった時、

```
$example1 = "例1です";
$example2 = "例2です";
$example3 = "例3です";
$example4 = "例4です";
$example5 = "例5です";
$example6 = "例6です";
```
if文で判定しながらechoさせようとすると、以下のようになる。

```
if (isset($example1)) {
    echo $example1;
}
 
if (isset($example2)) {
    echo $example2;
}
 
if (isset($example3)) {
    echo $example3;
}
 
以下略
```
めっちゃめんどくさいし、同じコードを書くのはかっこ悪いですよね！！
なので、**「可変変数」**を使います。
例に挙げた変数 $example1 の数字部分を変数化してfor文などで扱えるようにします。

##説明
```
${"変数名".$連番変数}
```
って言われてもよーわからんと思うので、
以下、

```
for ($i=1; $i<=7; $i++) {
    if (isset(${"example".$i}) && !empty(${"example".$i}) ) {
        echo ${"example".$i};
    }
}
```
めちゃくちゃスッキリしましたね！！

##参考
https://nodoame.net/archives/5813

#筆者
2020年1月ごろからプログラミング学習し始めました。
日々の学習についてあげています。
麻雀点数計算アプリを作成中！！！
Laravelでマイグレーションに必要なMySQLアカウントの権限 個人メモ

# 目的

- Laravelアプリがマイグレートを実行する事のできるMySQLアカウントの権限設定方法をまとめる

# ご注意

- 本来もっとセキュアな権限設定が必要になるので本記事はあまり参考にならない。
- しかしall権限を付与すれば必ずマイグレーションをする事ができるのでMySQLアカウントの権限周りで詰まった時に問題の切り分けとして使用できるかもしれない。
- 環境構築が済んだらセキュアな権限設定をしよう

# 権限設定方法

- ターミナルからrootユーザでMySQLにログインする。
- 下記SQLを実行する。

    ```sql
    grant all on *.* to 権限を与えたいMySQLユーザ名@ホスト名;
    ```