OmniAICreator/Qiita-1.07M huggingface dataset:
ASIOを利用してUnityで4チャンネルから別々の音を出す


Windows、Unity（Low-latency Multichannel Audio for Unity）、Yamaha Steingberg UR44（ASIO） を利用して、
4チャンネル別々の音源を再生するコンテンツ開発を行いました。
ASIOを利用することができる Asset がおそらくこの一択のため、記事にしてみました。

# ASIO とは
オーディオデバイスのドライバの一つです。
Windows環境のデフォルトでは、低遅延、高スループットを可能とする2チャンネル以上のサウンドドライバが存在していないので、ASIOを使用するのがデファクトスタンダードになっているとのことらしい。

使用するために専用の機器（ハードウェア）とASIOを操作することができるソフトウェアが必要になります。
おそらく標準的なDAWソフトウェアであれば、ASIOを利用したマルチチャンネル再生は可能ですが、
Unityの場合デフォルトで操作することができず、Asset を利用して再生することになりました。

## [ASIO - Wikipedia](https://ja.wikipedia.org/wiki/ASIO)
```
ASIOは、ドイツのスタインバーグによりオーディオを入出力するためのアプリケーション用APIとして提供された規格であり、
販売されている高級オーディオカードの多くがこの規格に準拠し、Windows用およびmacOS用のドライバも存在し、
ほぼ業界標準として採用されている。Mac OS XのCore Audioはこれと同等の技術とされる[1]。

WindowsやMac OS上にもサウンドドライバは存在するが、ASIOはそれよりも低遅延、高同期性、高いスループットを実現している。
開発された理由としては従来のオペレーティングシステム (OS) に搭載されているサウンドドライバでは
2以上のマルチチャンネル入力が考慮されていなかったためである。ASIOではマシンの処理速度が許す限りはあらゆるチャンネル数、
標本化周波数、量子化ビット数のデータを扱うことができる。
```

# 構成
## Hardware
PC（Windows） -> Yamaha Steinberg UR44 -> Speaker 4 channel

## Software
Name                                     | Version
-----------------------------------------|---------------------------
Windows                                  | 10 Pro
Unity                                    | 2019.2.15f1
Yamaha Steinberg USB Driver              | 2.0.4
Low-latency Multichannel Audio for Unity | 1.4

# Low-latency Multichannel Audio for Unity の注意点
バージョン1.4の時点で、以下の制限があるようでした。

* チャンネル毎の同期をとる機能が存在していません。そのためある程度（20-100ms）のずれが生じることがありました。自分の場合は、4チャンネルのそれぞれに、異なる背景音を流していることから大きな問題にならず、そのまま使うことにしました。
* 1つの音源ファイルの各トラックを別々のチャンネルに流すような分割することができませんでした。自分の場合は、4つの音源にあらかじめ分割しておいて、それぞれのチャンネルでそれぞれの音源を流す形をとりました。
* フェードインはあるのですが、フェードアウトがありません。自分の場合は、オレオレで作りました。
* 大きい音楽データの場合、Play の際に時間がかかります。ただ下のサンプル用に非同期（並列処理）にして実行することであるていど緩和できます。

```C#
        for (var i = 0; i < 4; i++)
        {
            var channel = (uint) i;
            UniTask.Run(() =>
            {
                var stream = AudioManager.Asio.Play(audioIds[i], new[] {channel}, volume);
                streams.Add(stream);
            });
        }
```

# その他
* [REAPER](https://www.reaper.fm/) : Windows からそもそも ASIO が正常に動作して、マルチチャンネルで再生できるのかわからなかったときに使用したDAWです。無料でかつシンプルな構成となっているので、確認しやすく使いやすかった。
* [Audacity](https://ja.wikipedia.org/wiki/Audacity) : 音楽ファイルの内部構成などを確認するために使用しました。無料にもかかわらず、分割などもできて非常に便利です。
* [AudioStream [PCM audio in Unity]](https://assetstore.unity.com/packages/tools/audio/audiostream-pcm-audio-in-unity-65411) : 更新頻度も高く、フォーラムの対応もよいのでこちらも候補にしたのですが、ASIOには対応してないと回答をもらいました。
GitHubのactionsを試してみる【actions】

GitHub が提供する CI/CD ツール、Actions。このツールを使いこなせればこのブログのテーマのデプロイが簡略化出来そうなので、どんなものか試してみた。

## ゴール

自前で用意した Dockerfile を使用してワークフローを実行する。 公式にてアクションの作成サンプルがあるのでそちらを参考にしながらカスタムアクションを作成してみる。

[Docker コンテナのアクションを作成する](https://docs.github.com/ja/free-pro-team@latest/actions/creating-actions/creating-a-docker-container-action#write-the-action-code)

## 準備するもの

ワークフローを定義するためにmain.ymlを作成、 Docker コンテナで実行するためにaction.ymlを作成し、 Dockerfileと entrypoint.shでアクションコードを作成する。

### ディレクトリ構造

今回作成する設定ファイルを含めたディレクトリ構造。ワークフローを記述したファイルは .github/workflows に配置した。 ファイル名は main.yaml にしたが、特に指定はない。

```
.
├── .github
│   └── workflows
│       └── main.yaml
├── Dockerfile
├── README.md
├── action.yml
└── entrypoint.sh
```

### ワークフローファイル(main.yml)の中身

今回はこのファイルがあるリポジトリでタスクを実行するので checkout を実行する。

```yaml
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
    # To use this repository's private action, you must check out the repository
    - name: Checkout
      uses: actions/checkout@v1
    - name: Hello world action step
      id: hello
      uses: ./
      with:
        who-to-greet: 'Mona the Octocat'
    # Use the output from the `hello` step
    - name: Get the output time
      run: echo "The time was ${{ steps.hello.outputs.time }}"
```

***jobs.<job_id>.steps.uses***

このプロパティでは`action.yml` または`Dockerfile`のディレクトリを指定する。直接ファイル名を指定するとエラーになる

```
##[error]Can't find 'action.yml' or 'Dockerfile' under '/home/runner/work/actions/actions/.github/action.yml'.
```

### アクションファイル(action.yml)の中身

Docker コンテナで実行するのでruns.usingに dockerを指定する。

```yaml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  time: # id of output
    description: 'The time we greeted you'
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.who-to-greet }}
```

### Dockerfileの中身

entrypoint.shを実行するだけの内容。

```docker
FROM alpine:3.10

COPY entrypoint.sh /entrypoint.sh

ENTRYPOINT [ "/entrypoint.sh" ]
```

### entrypoint.shの中身

引数をうけとり出力する。

```bash
#!/bin/sh -l

echo "Hello $1"
time=$(date)
echo ::set-output name=time::$time
```

## いざ実行

上記のファイルを用意してpushすればワークフローが実行される。実行が成功すると下記のような感じで各タスクにチェックマークがつく
![actions-result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780549/b0cbdfc0-0c56-89b7-0461-1c20b730b7d8.png)


## Refference

[GitHub Actionsのワークフロー構文](https://docs.github.com/ja/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions)

[GitHub Actionsのメタデータ構文](https://docs.github.com/ja/free-pro-team@latest/actions/creating-actions/metadata-syntax-for-github-actions)
ローカルのkubernetesからgcrのイメージを取得する

json key file を認証情報として docker desktop の kubernetes で gcr から image を pull 出来るようにする。

## json key file の作成

サービスアカウントの json key file は有効な認証情報なのでこちらを gcp console からダウンロードする。

[Setting up OAuth 2.0](https://support.google.com/cloud/answer/6158849?hl=ja#serviceaccounts)

## secretの作成

gcr から docker image を pull するとき、認証情報として json key file を使用することを secret名 gcr-json-key として kubernetes に教える。

```bash
kubectl create secret docker-registry gcr-json-key \
	--docker-server=<your-registry-server> \
	--docker-username=<your-name> \
	--docker-password=<your-pword> -\
	-docker-email=<your-email>
```

オプションは下記の通り:

- `<your-registry-server>`:private docker registry のFQDN
- `<your-name>`: docker username
- `<your-pword>`: docker password
- `<your-email>`: docker email

gcrの場合は下記のようになる

- `<your-registry-server`: [https://gcr.io](https://gcr.io/)
- `<your-name>`: __json_key 固定値
- `<your-pword>`: json key file を cat した文字列
- `<your-email>`: サービスアカウントのメールアドレス

例：

```bash
kubectl --namespace=$NAMESPACE create secret docker-registry gcr-json-key \
	--docker-server=https://gcr.io \
	--docker-username=_json_key \
	--docker-password="$(cat $PATH_TO_JSON)" \
	--docker-email="$MAIL_ADDRESS" \
```

作成したsecretの確認

```bash
> kubectl get secret --namespace=$NAMESPACE
NAME                  TYPE                                  DATA   AGE
gcr-json-key          kubernetes.io/dockerconfigjson        1      19d
```

## serviceaccountから認証用secretを参照

デフォルトのサービスアカウントに ``ImagePullSecret`` として secret に登録する。

```bash
kubectl --namespace=$NAMESPACE patch serviceaccount default -p '{"imagePullSecrets": [{"name": "gcr-json-key"}]}'
```

## 単一のpodからsecretを参照する

特定のpodだけ使用したい場合はyamlファイルにsecret参照を追加する

```yaml
apiVersion: v1
kind: Pod
metadata:
  name: empty-debian
spec:
  containers:
  - name: empty-debian-container
    image: eu.gcr.io/lian-empty-project/empty-debian-container
  imagePullSecrets:
  - name: gcr-secret
```

## Refference

[Pull an Image from a Private Registry](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)
PowerAutomateは最高だ

そう言えばFlow時代からPowerAutomate使いです。
[Microsoft Power Automate Advent Calendar 2020](https://qiita.com/advent-calendar/2020/powerautomate "Microsoft Power Automate Advent Calendar 2020")２０日目です。
#Flowから使い続けてもやめられない
Flowから使ってましたよ。
PowerAutomateは一番簡単なのかもしれませんね。
ノーコードの帝王クラスですね。
特に言えばWebのプログラミングを学びたい人も一回使ってみればわかると思います。
自動化簡単にできますよ。
FacebookやLINEの連携やFacebookやSlackの連携も簡単です。
#PowerAutomateDesktopは興味津々ですね。
そろそろ入れてやらねばね。
PowerAutomateDesktop。
MicrosoftのRPA初のリリースです。
どうなんでしょうね。
Windows８から１０に関してのフォント問題って解決できてるのか。
これがすごく興味ありますね。
あとはWebを使ったフローを作れるんだろうかだなというところですね。
#Microsoftの作ったRPAを待っていた
MicrosoftのはじめてのRPAです。
本当に待ち焦がれていた人多いと思います。
いろんなRPAで起きた問題が解決できるのはやっぱMicrosoftなんです。
言えるのはみんなフォント問題・WebのHTMLのIDやCLASS・NAME問題も解決してくれていることを祈っています。
こっそり職場でつかちゃおうかな。
#Flow時代から良かったのはインターフェース
あのインターフェースはわかりやすかったような気がする。
PowerAutomateも引き継いでくれました。
PowerAutomateDesktopも引き継いでくれてることを祈ってます。
早く使ってみたいです。

今日はこんなところで。

明日は空いてます。
誰か書いちゃいませんか。
VBAでインタフェースを実装する

VBAにはクラスの継承は存在しないがインターフェースを定義・実装することができる。

## インターフェースを定義する

### クラスモジュールにインターフェースを定義する

インターフェースを定義するにはクラスモジュールに定義したいプロパティまたはメソッドを記述する。 ここでは``MessageInterface.cls``というクラスファイルを使用する

### プロパティとメソッドを定義する

``MessageInterface.cls``に記載

```vb

'プロパティを定義する
 Public MessageMode As String

'空のメソッドを定義する
Public Sub Output(str)

End Sub
```

## クラスでインターフェースを実装する

### インターフェースを継承する

``MessageInterface``を継承したクラスとして``DebugPrintLog``を作成する。 クラスモジュール内にimplentsキーワードを使用して``MessageInterface``インターフェースを継承する

```vb
'DebugPrintLog.cls

'Implementsキーワードの後に継承するインターフェース名を記載する
Implements MessageInterface
```

### プロパティを実装する

インターフェースでプロパティを定義したならば``Getter``と``Setter``でインターフェースで定義したプロパティの設定・取得を実装する必要がある

```vb
Public Property Get MessageInterface_MessageMode() As String

    MessageInterface_MessageMode = mode

End Property

Private Property Let MessageInterface_MessageMode(ByVal RHS As String)

    mode = RHS
    
End Property
```

### メソッドを実装する

インターフェースで定義したメソッドを実装するためにはメソッド名が``インターフェース名_メソッド名``の形になる

```vb
'DebugPrintLog.clsファイル

'MessageInterfaceのOutput()を実装する
Public Sub MessageInterface_Output(str)
    
    Debug.Print "{ 型=> " & VarType(str) & ", 値=> " & str & " }"

End Sub
```

### クライアント側での利用

インターフェースで定義したメソッドをクライアント側で呼び出すにはインターフェースで定義したメソッド名・プロパティ名で呼び出す

```vb
Public Sub Main()

    Dim log As MessageInterface
    Set log = New DebugPrintLog

    log.Output ("success")
    '出力:
    '{ 型=> 8, 値=> success }

End Sub
```

## サンプルコード

```vb
'MessageInterface.clsファイル

Public MessageMode As String

Public Sub Output(str)

End Sub
```

```vb
'DebugPrintLog.clsファイル

Implements MessageInterface

Private mode As String

Public Property Get MessageInterface_MessageMode() As String

    MessageInterface_MessageMode = mode

End Property

Private Property Let MessageInterface_MessageMode(ByVal RHS As String)

    mode = RHS
    
End Property

Public Sub MessageInterface_Output(str)
    
    Debug.Print "{ 型=> " & VarType(str) _
        & ", 値=> " & str & " }"

End Sub

Private Sub Class_Initialize()

    mode = "DebugPrintMode"

End Sub
```

```vb
'Client.basファイル

Public Sub Main()

    Dim log As MessageInterface
    Set log = New DebugPrintLog

    log.Output ("success")

End Sub
```
IchigoKamuyで応用情報技術者試験の信号機制御

[こどもパソコン IchigoJam](https://ichigojam.net/)の互換機の一つに、[IchigoKamuy](https://www.ichigokamuy.net/)がある。
これは、パソコンにUSBで直結できるので、別にUSB-シリアル変換器を用意しなくていいという特徴がある。
なお、ディスプレイとキーボードを接続するためのパーツは[別売り](https://shop.ichigokamuy.net/items/29775769)である。

そのIchigoKamuyとともに売られているものに、
[IchigoKamuy 教材基板シリーズ L-01｜LED しんごうき](https://shop.ichigokamuy.net/items/26135167) というのがあった。
信号機といえば、[応用情報技術者試験](https://www.jitec.ipa.go.jp/1_11seido/ap.html)の過去問にあったなあ…
ということで、今回はこれを実装してみた。

※IchigoJamはjig.jpの登録商標です。

# 実装したもの

今回は、[令和元年度秋期試験](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mondai_kaitou_2019h31.html#01aki)の午後の問8で定義されている信号機制御システムを実装した。
具体的には、問題文で定義されている夜間の主道路信号および歩行者信号の状態遷移を実装した。
存在のみ示唆されている従道路信号と昼間の動作、および信頼性設計(故障時の動作)は今回は対象外とした。

今回の主道路信号は、赤15秒→青60秒→黄3秒→赤1秒→右10秒→黄3秒→赤15秒→…という動作をする。
ただし、ボタンが押された時は青の時間が短くなることがある。
また、「右」とは右折信号のことである。
今回の歩行者信号は、ボタンが押されるまでずっと赤であり、
ボタンが押された後主道路信号の赤15秒が始まったら、3秒後に青8秒→青点滅3秒→赤となる。

# 実装

今回実装したプログラムは、以下のものである。

```
10 ' AP R1ｱｷ ﾄｲ8 ｼﾝｺﾞｳ
20 C=1:W=1:S=2:H=2:LET[1],15,0,0,0,0,0,0,0,0
30 T=0:CLT:P=TICK():GOTO 270
40 N=TICK():D=N-P:P=N:IF D<0 D=D+32000+768
50 X=0:T=T+D:IF T<60 GOTO 90
60 FOR I=1 TO 9:IF[I]>0 [I]=[I]-1:X=1
70 NEXT
80 T=T-60
90 OUT (S=0)+2*(S=1)+4*(S>1)+8*(S=3)+32*(H=0 OR (H=1 AND T%30<15))+16*(H=2)
100 B=BTN():Y=C:Z=W
110 IF C=1 AND [1]=0 C=2:S=0:[2]=60
120 IF C=2 AND [2]=0 C=3:S=1:[3]=3
130 IF C=3 AND [3]=0 C=4:S=2:[4]=1
140 IF C=4 AND [4]=0 C=5:S=3:[5]=10
150 IF C=5 AND [5]=0 C=6:S=1:[3]=3
160 IF C=6 AND [3]=0 C=1:S=2:[1]=15
170 IF C=1 AND B C=11
180 IF C=11 AND [1]=0 C=12:S=0:[6]=10
190 IF C=2 AND B C=12:[6]=10
200 IF C=12 AND ([2]=0 OR [6]=0) C=3:[2]=0:[6]=0:S=1:[3]=3
210 IF W=1 AND B W=2
220 IF W=2 AND C=1 W=3:[7]=3
230 IF W=3 AND [7]=0 W=4:H=0:[8]=8
240 IF W=4 AND [8]=0 W=5:H=1:[9]=3
250 IF W=5 AND [9]=0 W=1:H=2
260 IF X=0 AND Y=C AND Z=W GOTO 40
270 CLS:FOR I=1 TO 9
280 ?"[";I;"] ";CHR$(#20+(#10+[I]/10)*([I]>9));[I]%10;"  ";
290 IF I%3=0 ?CHR$(10);
300 NEXT
310 ?CHR$(#43-C/10);"-";C%10;" W-";W
320 GOTO 40
```

`C`で主道路信号の状態を表す。1～6がそれぞれ状態C-1～状態C-6を、11が状態B-1を、12が状態B-2を表す。
`W`で歩行者信号の状態を表す。1～5がそれぞれ状態W-1～状態W-5を表す。
`S`で主道路信号の表示を表す。0が青、1が黄、2が赤、3が右を表す。
`H`で歩行者信号の表示を表す。0が青、1が青点滅、2が赤を表す。
配列`[1]`～`[9]`でそれぞれタイマ1～タイマ9の残り秒数を表す。

10行目は、`FILES`用のタイトルである。
20行目で、開始時の処理(S1、R1)を行う。各信号の状態と表示を設定し、各タイマを初期化する。
30行目で、タイマおよび青点滅の制御用の時刻を初期化し、最初の状態の出力に移る。
40行目で、時刻の増分を計算する。
50行目で、時刻を更新し、タイマを更新するべきかの判定を行う。
60行目～70行目で、タイマを更新する。
80行目で、次のタイマの更新に向けて時刻を更新する。
90行目で、信号の表示を管理する変数の値を実際の表示(出力)に反映させる。
100行目で、ボタンの入力を取得し、変化したかの判定のために状態を保存する。
110行目～250行目で、問題文に定義された状態遷移の処理を行う。
260行目で、状態が更新されたかの判定を行う。
270行目～320行目で、各タイマの残り秒数および各信号の状態を画面に出力する。

# 実行結果

YouTube動画 (6:00)

[![IchigoKamuyで応用情報技術者試験の信号機制御 - YouTube](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/bbe6233b-0b89-028c-c149-7835d8f02a3b.jpeg)](https://www.youtube.com/watch?v=PiputzR983Q)

# 応用

実行結果より、設問1 (2) の答え (主道路信号がC-6 (黄) になった直後にボタンを押した時、
何秒後に歩行者信号が最初に青になるか) は「6(秒後)」であるとわかる。

220行目を

```
220 IF W=2 AND S=2 W=3:[7]=3
```

とすると、設問2 (1) の状況を再現できる。
すなわち、遷移の条件を「主道路信号が状態C-1に遷移」ではなく「主道路信号が赤」とすることができる。
このとき、例えば主道路信号が青のときにボタンを押すと、
主道路信号が右のときに歩行者信号が青になってしまうことが確認できる。

# 結論

問題文の通りに状態遷移を実装することで、
応用情報技術者試験で出題された信号機制御システムを実装することができた。
さらに、この実装を用いて、いくつかの問題の答えを確かめることができた。
停止中のEC2インスタンスを終了してしまいデータを消してしまった話

年の瀬にやらかしてしまったので備忘録のためにメモしておきます。
結果からいうと
<h3>バックアップしていない制作中のアプリのデータが入ったEC２インスタンスを消してしまいました</h3>
もう頭が真っ白です。
理由はcloud9の仕様をわかっていなかった事
AWSの公式（https://aws.amazon.com/jp/cloud9/faqs/）
を見ると以下のような事が書いてあります
AWS Cloud9 EC2 環境 – 
Cloud9 が接続する新しい Amazon EC2 インスタンスを起動できます。既定では、これらのインスタンスは IDE を終了して 30 分後に<h5>停止し</h5>、IDE を開いたときに自動的に起動します。
そう停止するのである。詳しく見ていないが恐らく余計な料金等がかからないように停止しているのだと思います。
それを知らずに昨日私がした最悪な行動は
<h3>インスタンスが増えてきたから停止している使っていないものを終了しよう</h3>
でした。何も確認せずバンバン消していきました。
そして知らず農地にcloud9で開発していたアプリのインスタンスも終了してしまいました。
顔面蒼白。それからバックアップをとっていない際の復元方法などを探しましたが見つからず結局１からの開発となりました。
バックアップをとっていなかった事はもちろん、何も考えずに重要なデータを消すのはあってはならない事だと思います。
私のような方が二度と現れない様この記事が役に立つことを願います（良い意味で）
<br>
追伸
今回の件で一緒に開発してくれているプロジェクトのメンバーには多大な迷惑をかけました。
何も言わずに復旧作業をしてくれるメンバーには本当に頭が上がりません。
有難うございます。
問合フォーム作成に挑戦中

 業務改善のために作ってみたいアプリ
　法律事務所特有の利害関係確認機能付きの問合せフォームが欲しい…

そこで、学習の備忘録として不束メモ

```terminal
% rails new contact
```
 少し時間がかかった後にディレクトリ間違ったなと後悔…

```terminal
% cd contact
```
gemfile に連携したいキントーンをこのように

```ruby
gem 'kintone'
```
記載して、bundle install。お次は問合コントローラー作成

```terminal
% rails generate controller inquiries
```

app/config/routes.rbに

```ruby
Rails.application.routes.draw do
  
  get '/inquiries', to: 'inquiries#new'　#キントーン連携用に
  post '/inquiries', to: 'inquiries#create' # kintone連携用に
  resources :inquiries  #7つのアクション使える
  root 'inquiries#new'  #top_page
end
```
と記載。　HPからの編集もしたければ、editのフィールドコード作成すればいけるのかしら？？試す時間作れたら更新しよう‼︎
HPのマイページからデータ添付できたらいいもの！
でも、営業妨害きたら嫌だなww

残りカタカタ問合せフォームを打ち込みながら
郵便番号から住所反映させたいこと、ユーザー管理機能ほしいこと、選択式プルダウン入れたいことに思いだし,
下記追加したいが、不具合でないか心配なのでdeviseのみbundle install.

```ruby
gem 'active_hash'
gem 'jp_prefecture'
gem 'jquery-rails'
gem 'devise'
```
その後、kintone連携のためのアプリ作成し、
app>controllers>inquiries_controller.rb

```ruby


require 'kintone'
class InquiriesController < ApplicationController

  def new
  end

  def create
    @user = User.new(inquiry_params)
    if @user.save
      # Use token authentication
      api = Kintone::Api.new("subdmain.cybozu.com", "APItoken")
      app = appId

      # Record register(single record)
      # Use Hash
      record = {"company" => {"value" => inquiry_params[:company]},
                "last_name" => {"value" => inquiry_params[:last_name]},
                "first_name" => {"value" => inquiry_params[:first_name]},
                "kana_last_name" => {"value" => inquiry_params[:kana_last_name]},
                "kana_first_name" => {"value" => inquiry_params[:kana_first_name]},
                "email" => {"value" => inquiry_params[:email]},
                "phone_number" => {"value" => inquiry_params[:phone_number]},
                "postal_code" => {"value" => inquiry_params[:postal_code]},
                "prefecture" => {"value" => inquiry_params[:prefecture]},
                "city" => {"value" => inquiry_params[:city]},
                "street" => {"value" => inquiry_params[:street]},
                "other" => {"other" => inquiry_params[:other]}
                }
      api.record.register(app, record)
      redirect_to root_path
    else
      render 'new'
    end
  end
  
  private
    def inquiry_params
      params.require(:user).permit(:company,
        :last_name, 
        :first_name, 
        :kana_last_name, 
        :kana_first_name,
        :email,
        :phone_number,
        :postal_code,
        :prefecture, 
        :city,  
        :street, 
        :other
        )
    end
end
 
```
これでいけるか…
あぁ…viewがエラー
続きは後日
なでしこでPICマイコン制御

日本語プログラミング言語「なでしこ」を使って制御できるPICマイコンボードがあります。これを使うと，センサ入力の仕方を勉強したり，Lチカやモータドライブの制御等ができます。ひょっとしたら，「なでしこ」で制御をしたいと思っている人が（一人くらいは…）いると思うので，そんな万が一のためにメモをまとめます。

この記事は、**なでしこv1 Windows版**で実行できるようにしています。他のバージョンでは動きません。

# なでしこで計測・制御

## 制御ボードの準備
まだ１つしか出ていませんが（それでも貴重ですが…），PICマイコンボードと，それに添付するDLLファイルがあれば，なでしこで制御ができます。
![nadesiko-board-1s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942750/ecb3fa16-dee3-a9d5-9c5f-d17fa32f243b.png)
入力は，センサ入力ポートが３つ。
出力は，ボード上のLEDとスピーカ(ブザーが鳴ります)，出力端子4つ(約5V)，モータドライブ１個です。

## とりあえずLチカ！
制御ボードを使うときの「Hello, World!」みたいなものですが，とりあえずLEDをON/OFFさせます。

```board1.nako
オンの間
　　ＬＥＤオン。
　　１秒待つ。
　　ＬＥＤオフ。
　　１秒待つ。
ここまで。
```

これで，ボード上のＬＥＤを点灯・消灯させることができます。
出力１端子にＬＥＤを差しこんで，Ｌチカもできます。

```board2.nako
オンの間
　　出力１オン。
　　１秒待つ。
　　出力１オフ。
　　１秒待つ。
ここまで。
```

![ltika.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942750/4fc0b2af-3bf3-28e7-ec22-ed5dc7b9c073.gif)

## 明るさによって反応を変える
ボードの入力端子１にCdS(光センサ)を差しこんで，`センサ１測定`という命令を使うと，CdSの測定値を取得できます。このボードは明るいと最小値0，暗いと最大値1023で測定値を返します。

```board3.nako
明るさラベルとはラベル。

オンの間
　　明るさ＝センサ１測定。  // #1
　　明るさラベルのテキスト＝明るさ。

　　もし，明るさ＞６００ならば  // #2
　　　　ＬＥＤオン。
　　違えば
　　　　ＬＥＤオフ。
　　ここまで。
　　0.5秒待つ。
ここまで。
```

**#1**では，変数`明るさ`に，測定値を代入しています。**#2**で，明るさ>600（周囲が暗い）ならば，ＬＥＤを点灯させるようにしています。これは，夜間に自動点灯するライトの動作に似ています。

## より細かく反応を変える

もちろん別のセンサも使えますが，CdSが一番単純で分かりやすいので，これを応用して，自動車の衝突防止アラームを作ってみます。

```board4.nako
明るさラベルとはラベル。

オンの間
　　明るさ＝センサ１測定。
　　明るさラベルのテキスト＝明るさ。
　　0.1秒待つ。
	
　　もし，明るさ＞６００ならば          // #1 とても近いとき
　　　　ＬＥＤオン。
　　　　音長（１）。発音（２）。
    違えば，もし，明るさ＞２００ならば  // #2 やや近いとき
　　　　ＬＥＤオン。
　　　　音長（１）。発音（１）。
    違えば                           // #3 離れているとき
　　　　ＬＥＤオフ。
　　　　１秒待つ。
    ここまで。
ここまで。
```

動作している様子は[こちらの動画](https://oza-jv.github.io/nakoboard.html)で。

`音長（ｎ）`で，ブザーが鳴る長さをｎ秒にしています。`発音（ｎ）`で，ブザーの音の高さをｎにしています。**#1**のときはやや高い音が，**#2**の時はやや低い音が鳴ります。

こうすることで，

- 離れているとき（**#3**）は，ＬＥＤは消灯し，音も鳴らない。
- やや近づいたとき（明るさが600～200のとき，**#2**）は，ＬＥＤが点灯して低い音が鳴る。
- とても近いとき（明るさが600～1023のとき，**#1**）は，ＬＥＤが点灯して高い音が鳴る。

という動作になります。

## モータドライブを制御する
出力端子２はモータドライブになっています。外部の回路（3V程度)までならON/OFF制御できます。
試しに，外部回路としてLEDとオルゴールICを出力端子２につないで制御してみました。
![nadesiko-board-2s.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/942750/865a7925-00ef-aaf0-0a4b-26b66017dbb4.png)

```board5.nako
明るさラベルとはラベル。

オンの間
　　明るさ＝センサ１測定。
　　明るさラベルのテキスト＝明るさ。
　　0.1秒待つ。

　　もし，明るさ＞５００ならば
　　　　出力２オン。    // #1
　　　　２秒待つ。
　　違えば
　　　　出力２オフ。
　　ここまで。
　　１秒待つ。
ここまで。
```

動作している様子は[こちらの動画](https://oza-jv.github.io/nakoboard.html)で。`出力２オン`と`出力２オフ`で，モータドライブを制御しています。

## 最後に
こうやってサンプルを並べると，やっぱり命令が分かりやすいなー。さらに，あるサンプルの一部の命令を置きかえるだけで，次のステップへ進むことができます。プログラムの構造が変わらないことが，ひと目で分かる。日本語で作る「なでしこ」ならではの分かりやすさのような気がします。

このボートは，残念ながらボードのメモリにプログラムを記憶できないため，常にパソコンとボードを接続している必要がありますが，それでも日本語で制御できるボードがあるのは，とても面白いと思います。

## 参考

- [なでしこボード](https://www.yuryo.co.jp/t41-311-312.html)
電源回路の「しくみ」と「基本」3章 (1)ツェナーダイオードによる安定化回路


# 安定化回路
前回の電源回路（変圧・整流・平滑）だけでも出力電圧を作ることはできる。
ただ、リプル成分が含まれていたり、負荷の抵抗値によって出力電圧が変動してしまう。
よって出力電圧を一定化するために安定化回路が必要となる。

やり方としては、一定電圧を発生させる素子（ツェナーダイオード）を用いる方法と、
制御によって安定化させる方法がある。
ここでは簡単な前者の方を解説する。

#ツェナーダイオード
ダイオードは、電流を一方向にしか流さない性質をもつ。
ある種のダイオードの逆方向に電圧をかけると、一定電圧を越えた場合、急に電流が流れ出すという現象が発生する。
この急に電流が流れ出すときの電圧を降伏電圧という。
このとき、ダイオードの両端電圧は降伏電圧のまま一定になっている。

この特性を活かし、一定電圧を得る目的で使われるダイオードのことを「ツェナーダイオード」という。

##ツェナーダイオードの動作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/2e69d3b5-91ee-8312-1f4f-c0f3723295eb.png)

電圧は、ツェナーダイオードに逆方向電流が流れている場合、
VI = VRD + VD1 となる。
ここで、ツェナーダイオードの電圧は一定なので、
VRD = V1 - VD1 としてすぐ算出することができる。

電流は、オームの法則より、VRD / RDの抵抗値 で簡単に求まる。

##ツェナーダイオードによる安定化回路
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/1a1e86c7-55ee-8ca4-9de3-8253331b3f49.png)
ツェナーダイオードによって電圧が一定になるのだから、出力を取り出してみようと負荷RLをつけた回路。
負荷RLにどれだけの電流が流れようが、出力電圧（RDの電圧）は一定でなければならない。
これが安定化回路の基本となる。

電圧は、DZとRLの並列回路部分は、ツェナーダイオードの降伏電圧で固定される。
したがって、RDの電圧はRLの抵抗値に関わらず一定となる。
また、RDに流れる電流も、（電圧と抵抗値が決まっているため）RLの抵抗値に関わらず一定となる。
[Python] DI(Dependency Injection/依存性注入)コンテナーどれにしよう？

Pythonのmockは簡単にモンキーパッチができます。使えばDIコンテナなしでもユニットテストできます。
でも、DIコンテナに慣れた体がIoCを求めるので、DIコンテナーを探すことにしました。

# DIコンテナーの要件

こんなDIコンテナが欲しいです。

* タイプヒントから、コンクリートクラスを探して自動的に注入してくれる
* シングルトンか、毎回生成かを選べる
* インスタンス生成ファクトリを使用できる
* コンストラクタインジェクションかプロパティインジェクション（クラスがコンテナに依存しない）

# DIコンテナを探す旅

[PyPiでDI Containerを検索すると10,000以上ヒット](https://pypi.org/search/?q=di+container&o=)します。
え、まさか、これ全部？

[ぐぐると152件ヒット](https://www.google.com/search?client=firefox-b-d&q=site%3Apypi.org+%22dependenciy+injection+container%22)しました。
それでも多過ぎ！

ここは先達に頼りましょう。



# [Injector](https://pypi.org/project/injector/)

紹介されていた記事です。

* [PythonでのDependency Injection 依存性の注入](https://qiita.com/mkgask/items/d984f7f4d94cc39d8e3c)
* [PythonでDI(Dependency Injection)](https://qiita.com/YasuhiroKimesawa/items/eb486cab53bc297afd8f)
* [Python3.7でCrean Architectureを実現する](https://qiita.com/Makkyo/items/82615d72444eb3fe59f4#dependency-injection)

コンストラクタインジェクションになります。
要件を全て満たしているようで、これがよさげかもしれません。

# [PInjector](https://test.pypi.org/project/pinjector/)

紹介されていた記事です。

* [PythonでのDependency Injection 依存性の注入](https://qiita.com/mkgask/items/d984f7f4d94cc39d8e3c)

上記Injectorの再実装っぽく見えます。
タイプヒントではなく、引数名で依存性を解決しているのかな？


# [autocontainer](https://pypi.org/project/autocontainer/)

タイプヒントで依存性解決してくれます。
シングルトンかどうかは、デコレータではなく、コードで指定します。
シンプルで必要にして十分かも。





# その他

コンテナへ自前で登録しなければいけなかったり、別途設定が必要だったりで、要件にあわなかったライブラリです。

* [di-container](https://pypi.org/project/di-container/)
* [python-simple-di](https://pypi.org/project/python-simple-di/)
* [typedi](https://pypi.org/project/typedi/)
* [lagom](https://pypi.org/project/lagom/)
* [nanoinject](https://pypi.org/project/nanoinject/)
* [dependency-injector](https://pypi.org/project/dependency-injector/)
RenderでStatic Siteをデプロイする

# Renderとは

[Render](https://render.com/)は、アプリケーションを簡単にかつ瞬時にデプロイすることができるクラウドプロバイダーです。単純な静的サイトやcronジョブ、データベースやDocker化されたサービスまで、Renderにデプロイすることができます。
また、Githubのリポジトリと連携することによってpushしただけでサービスを自動的に更新することも可能です。

# サポートしてる言語,フレームワークなどについて

2020/12/6時点

- Node.js
  - Express
  - hapi
  - Puppeteer

- Python
  - Django
  - Flask
  - Celery

- Go
  - Gin
  - Beego
  - Pgweb
 
- Rust
  - Rocket
  - Actix
  - GraphQL

- Ruby
  - Ruby on Rails
  - Sidekiq worker

- Elixir
  - Phoenix
  - Elixir Cluster
  - Phoenix Distillery

- PHP
  Laravel

- Static Sites
  - React
  - jekyll
  - Gatsby.js

- Docker
  - Redis
  - Elasticsearch
  - MySQL
 
# 料金プラン

Static Sites: $0
Services: $7
Databases: $7
Cron Jobs: $4

# Static Sitesを実際にデプロイする

1. まず、RenderのサイトからGithubアカウントでログインを行う。

2. [New+]から`Static Site`を選択。

3. そうするとGithubのリポジトリ一覧が表示されるので、事前に用意したreactのリポジトリを選択

4. デプロイ設定画面が出るので、Build Commandを`yarn build`, Publish directoryを`build`でデプロイ

5. デプロイしてIn progressからLiveになればデプロイ成功です。

# Static Sites向けのその他機能

1. リダイレクトの設定、書き換え
2. HTTPヘッダーの設定

以上
Railsでfaviconを設定する手順

＜この記事について＞
自作のアプリ製作中にfaviconをつけたいと思い、意外と簡単にできたので備忘録として投稿します！

[環境]
・Ruby 2.6.5
・Rails 6.0.0
・macOS

まずは、事前準備としてfavicon用の画像を準備しましょう！
準備については任意ですが、個人的には以下のサイトが手軽にできてオススメです。

・ファビコン favicon.icoを作ろう!（https://ao-system.net/favicon/）
・icons8 | アイコン無料ダウンロード（https://icons8.jp/icons/set/favicon）

① assets/assets/images配下にfavicon.icoファイルを設置

```
assets/assets/images/favicon.ico
```

② faviconを読み込むために、「app/views/layouts/application.html.erb」内に以下を記述
※headタグ内です！

```
<html>
  <head>
<!--(省略) -->

    <%= favicon_link_tag('favicon.ico') %>

<!--(省略) -->
  </head>
```

③ ローカルサーバーを再起動

```
$ bundle exec rails s
```
これで完了です！
チャットツール乱立問題にお悩みのあなたへ

## チャットツール一元管理ツールを導入しよう！

日々増えていくビジネスチャットツール、プロジェクトごとに分かれていくアカウント、、、

チャットツールだけでアプリのウィンドウやブラウザのタブがいくつも立ち上げられている状況は常々億劫に感じてはいましたが、サブモニターがあればまぁなんとかなると思い適当にやりくり。

ところが、コロナの影響でリモートワークになってサブモニターがない環境がしばらく続き、ここにきてようやくこの状況を打破しようとチャットツール一元管理ツールの導入を検討。
有名どこの[Franz](https://meetfranz.com/)や[station](https://stationhq.com/)を使ってみたものの、いまいちしっくりこなかったのでマイナーなものをいくつか検討。その中で一番しっくりきた[Biscuit](https://eatbiscuit.com/)を中心にご紹介。

## [Biscuit](https://eatbiscuit.com/)とは?

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151693/9f0bf26f-cdf0-3565-ae38-779c59044afc.png)

> Bisucitは普段よく使うアプリを登録して利用するアプリ統合型のブラウザです。登録されたアプリはサイドバーに常時表示され、クリックすることで素早くアプリを呼び出して利用することができます。

とのこと。他のチャットツール一元管理ツールと同様に、よく使うチャットツールを登録することでクイックアクセスできるようにする、という点は変わらず。

他のチャットツール一元管理ツールとBiscuitの大きな違いは、Biscuitのサイドバーに表示されているアプリ (登録したアプリ) の扱いは、セッションを別々に管理しているただのWebブラウザである、という点です。これが非常にシンプルでわかりやすい。他のチャットツール一元管理ツールですと、チャットツールごとに表示されるアプリは1つのみ (同一チャットツールを複数アカウントごとに分けて登録するといった使い方ができない) であったり、そもそもチャットツールが対応していないと登録できない、ということがありましたが、BiscuitはWebアプリケーションとして動作するサービスであればほぼ登録することができます。具体的に使い方を見ながらご説明しましょう。

## [Biscuit](https://eatbiscuit.com/)の使い方例

![img2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151693/7db9e834-e7f8-1404-8d4e-75b9b1c958b4.jpeg)

まずは筆者の現状のBiscuit。ポイントとしては、

- 同一チャットツールをアカウントに応じて複数登録している
- 登録したアプリの表示名を変更できるので、同一チャットツールでもアカウントごとにわかりやすく表示している
- Google Calender や Google Keep など、チャットツール以外のアプリも登録することができる
- デフォルトとして選択できないアプリでもカスタムでURLを指定することでアプリ登録することができる

アプリの追加は左下の"アプリを追加"からすることができます。

![img3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151693/2aa5f505-72c6-8730-b262-4e324a38b91b.jpeg)

デフォルトでもかなりの数のアプリが用意されています。

![img4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151693/091b7ff7-f2a5-b629-5523-5a5a4637b2ee.png)

## [Biscuit](https://eatbiscuit.com/)を使って業務効率を爆上げしよう！

チャットツールをひとつにまとめることで、意識を分散せずに済みます。また、Biscuitなら新着メッセージがあった場合などはサイドバーの各チャットツールのアイコンにバッジがつくので、確認漏れも少なくなります。簡単に導入でき効果も高いので、是非チャットツール乱立問題にお悩みの方は試してみてください。
コロナ時代のホテルの受付システムを作った話

やあ、ジョージー。タイトルの通りなんだけど、コロナ以降の旅館やホテルが非接触型のチェックインを実現できないかという実証実験をやっているというお話です。バックエンドでは通訳を兼ねたオペレーターがリモートで待機しています。

![スクリーンショット 2021-01-20 13.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/0b3dd4ab-4dc9-1b45-9e68-6043a0dff3b4.png)

フロントの端末からチェックインを開始します。

![スクリーンショット 2020-12-20 19.13.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/c3c80157-88a7-7291-bc5d-d46ed4bee28e.png)

多言語対応です。

![スクリーンショット 2020-12-20 19.14.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/c1f3213e-633f-0981-fce2-a386ceed2506.png)

ワクワク。

![スクリーンショット 2020-12-20 19.15.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/47744590-dfbf-5f8b-1730-efa53b186307.png)

あ、受付の人が来た！

![スクリーンショット 2020-12-20 19.17.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/798b7ca5-306f-68cc-eb15-32c6dfaf32a7.png)

間違えてたたかうマヌカハニーを出してしまったけど、大丈夫、音声案内でオペレーターの人が教えてくれるよ！

![IMG_3010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/5e7edefa-d21d-48a5-7f42-539356c0a1bb.jpeg)

これが実際の様子だよ！

実は画面の遷移はオペレータ（この場合ペニーワイズ）がやってくれているので、お客さんは指示に従ってパスポートを見せたりするだけです。またカメラは複数の機器をオペレータ（ペニーワイズ）がリモートで切り替えてくれるので、体温計を設置しているところではそちらの映像を確認することができます。

![スクリーンショット 2021-01-20 13.23.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/d17a37da-fc9b-11db-fd7f-58cd56da2aca.png)

![スクリーンショット 2021-01-20 13.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1782/bbca8aa6-47b5-0986-9813-0295f020bb97.png)

このようにオペレーター（ペニーワイズ）は自分の手元の画面でお客さんの画像を保存してくれるので（あ、もうペニーワイズはお客さんの方に瞬間移動してしまいましたね。お客様はご無事でしょうか）、パスポートのチェックもバッチリです。ビデオ通話はE2EEで保護されており、ここでTwilio Videoが活用されています。お客さん画面とオペレータの画面の操作は互いにWebsocketで通信し合っています。

もうすぐ本格的に利用され始めるので、どうなるか楽しみです。
【Kotlin】inner classからouter classのインスタンス（Qualified this）を取得する

# TL;DR
- `this@${outer classの名前}`で取得できる

# 本文
`inner class`はそれを定義するクラス（便宜上記事中では`outer class`と呼称）のインスタンスからのみ初期化できます。
ここで、`this@${outer classの名前}`とすることで、`inner class`の中からそのインスタンス（`Qualified this`）を参照することができます。

なお、インスタンス関数としての拡張関数や、スコープ関数`run`の中のように、「外側の`this`を参照したい」場合は全てこのやり方でできます。

# 参考文献
- [This expressions \- Kotlin Programming Language](https://kotlinlang.org/docs/reference/this-expressions.html#qualified)
Co2レーザー加工機の出力特性について

# はじめに
最近ではどこの家庭にもレーザー加工機が導入されているかと思います。
我が家も2年程前に、AliexpressからSP-320という40WのCo2レーザー加工機を導入しMDFやアクリル板等の加工にバリバリと活躍してもらっています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/2eb534e3-11b8-a546-5ae4-21291c05eb1d.jpeg" width=60%>

この手のレーザー加工機は、フロントパネルの制御版からレーザーの出力を0～100%まで調整することができますが、なぜか我が家のやつは70%以上に設定しても切れ味がよくならないという不思議な現象が起こっていました。ということで、このレーザー加工機の出力特性を測ってみました。

**※Co2レーザー加工機は40W機で15kVの高電圧と20mAの電流供給能力がありますので、本記事と同様な改造を行われる場合は自己責任でお願いします。**

# パワー測定方法
40WのCo2レーザー加工機では、最大出力時にレーザー管に約15kVの高電圧をかけ約20mAの電流が流れます。入力が約300W、能率が十数パーセントで出力が40Wということになります。
今回は、この電流を測定することでレーザー加工機の出力を簡易的に測定します。
実際は放電開始時の電圧が15kVで、連続放電時には電圧が下がるようなので、本当は電圧も測定したいところですが、15kVを測定するのはちょっと怖いので今回は電流のみの測定としました。
電流計は、Aliexpressから以下の安物を購入しました（こんなに安くて大丈夫か？？？）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/67ab319e-2efb-4d0d-2ab3-f1dd57435b90.png" width=60%>

# 電流計の追加箇所
電流計は、レーザー加工機の電源の高圧側に直列に入れる必要があります。電流は、電源のプラス側からレーザー管と100kΩのバラスト抵抗を介して電源に戻ります。プラス側（高電圧側）に余計な配線を入れるのはリークや感電等の発生リスクがあるので、電圧の低い100kΩのバラスト抵抗と電源のマイナス側の間にアナログ電流計を入れることにします。

![Laser_Power.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/345b9e3a-4ad4-da7f-4dc7-1b588cc1fdcf.png)

フロントパネルは、電流計を取り付けられるようにMDF材を加工して作りました。残念ながらロゴが半分隠れてます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/ad46998f-a160-ece9-f4e8-0825f4ef315b.jpeg" width=60%>

# 測定結果
以下のグラフの青い線が、パネルの設定値と測定した電流の関係です。
予想通り、パネルの7セグLEDが65%を超えたあたりから電流が下がり始め、75%あたりからサチっていています。
こうなる原因は、電源か、電源を制御している制御基板だと思いますが、詳細は不明です。
グラフのオレンジの線は、インチキ計算の想定（相対？）出力です。

- レーザー管の仕様から、15kV、20mAの地点が40W出力とし、これからレーザー管の負荷抵抗を750kΩと仮定
- P = I^2Rで、電流からレーザーパワーを推定

本当は電圧をちゃんと測定したいですね。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337553/909927e6-4899-b455-42f5-497c31a700fc.png" width=80%>

# まとめ
- 安物Co2レーザー加工機の制御パネルの設定数値はあてにならない
- 私の個体では、設定値65%までが比較的リニアに出力が調整できる範囲
- レーザー管の寿命を考えると最大出力ではなく定格出力（80%程度？）で使用したいところです。私の個体では、設定値の最大を55%程度に抑えた方がよいことになります。
- そのうち電圧も測定して、ちゃんとパワー（レーザー管への入力）を測定したい！
Mac買ったらとりあえずセットアップしたこと

# Google IME導入
[Google IME(Google 日本語入力)](https://www.google.co.jp/ime/)

# 入力ソース設定
https://youtachannel.com/mac-input-source-setting/

# Google Chrome導入
[Google Chrome](https://www.google.co.jp/chrome/)

# docker desktopを導入
https://hub.docker.com/editions/community/docker-ce-desktop-mac/

# Homebrewのインストール
[Homebrewのインストール](https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)

# Homebrew経由でnodenvを導入
https://qiita.com/alice37th/items/989af6749264de50bb85

# Homebrew経由でyarnを導入
https://classic.yarnpkg.com/en/docs/install/#mac-stable

# nodenvでnode.jsのバージョンを変更する
https://joppot.info/2018/11/07/4226
以前のコミットに後からファイルの追加/修正を行う

# はじめに

開発中に「あ、ここ修正するの忘れてた！」ってなること結構ありますよね。そして、その追加修正分は、できれば3つとか4つ前のコミットに含めたいことが結構あります。
そんな時、自分は一々`git reset`してコミットを作り直していたのですが、そんなことをしなくても以前のコミットに後から修正を加えることができることが分かったので、メモしておきます。


# やり方

現在のコミットログが以下のようになっているとします。この時`memo.txt`に修正漏れがあった時を想定します。

```
commit dc3baf27713ea6ade5f61fe6dc4e94c3befca653 (HEAD -> master)
Author:
Date:   Sun Dec 20 19:01:26 2020 +0900

    todo.txtを修正

commit 50461e0ec0822cd21873c262f8322d203d6dc0a6
Author:
Date:   Sun Dec 20 19:01:07 2020 +0900

    memo.txtを修正

commit efe706a19014573c06666a88a1251069b8ce7763
Author:
Date:   Sun Dec 20 18:54:39 2020 +0900

    memo.txtを追加
    todo.txtを追加
```

まずは、いつも通り`memo.txt`に追加の修正を行い、`git add`を行います。そして、コミットを作成するときに`git commit --fixup <修正したいコミットID>`というコマンドを利用します。今回の場合は`memo.txt`に修正を加えたいので、コミットIDは`50461e0ec0822cd21873c262f8322d203d6dc0a6`になります。

すると、「fixup! memo.txtを修正」というコミットメッセージがついたコミットが作成されます。

```
git add memo.txt
git commit --fixup 50461e0ec0822cd21873c262f8322d203d6dc0a6

[master db42469] fixup! memo.txtを修正
 1 file changed, 1 insertion(+)
```

そして最後に、`git rebase -i --autosquash <修正したいコミットの1つ前のコミットID>`というコマンドを実行します。今回の場合は`efe706a19014573c06666a88a1251069b8ce7763`が対象になります。見慣れない画面が立ち上がりますが、`:wq`で上書き保存してOKです。すると、「memo.txtを修正」以降のコミットIDが変わり、後から加えた修正がちゃんと加わっているのがわかります！

# 最後に

原理はまだ完全には理解できていないですが、とても便利だと思ったので備忘録として残しました。詳しい仕組みはこれから理解して行こうと思います。
全人類は Brave を使うべき理由

# はじめに

皆さんはブラウザは何を使っていますか？

Chrome?
Safari?
Firefox?
IE?

そろそろ，Brave 使わないか？

# Brave とは

![Brave_icon_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298787/faa19a89-a0b2-f7a6-4ce2-883ba5c50877.png)

画像引用元 https://ja.wikipedia.org/wiki/Brave_(%E3%82%A6%E3%82%A7%E3%83%96%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6)


> ユーザに力を取り戻していただくことが必要です。広告トラッカーをブロックすることで、最高のスピードとセキュリティを実現、プライバシーを保護します。さらにプライバシーを重視した新しい広告モデルで報酬を得ていただき、パブリッシャーがフェアな収益を得られる仕組みを提供します。
Brave 公式より https://brave.com/ja/

Brave とは 2015 年に JavaScript の開発者であるブレンダン・アイク氏が開発を始めた Chromeum ウェブブラウザになります．広告を削除し，より安全により高速にネットへアクセスすることができます．

2019年11月にはダウンロード数が4000万を超え，更に注目を集めているブラウザになります．

# Brave を使うべき理由

## 広告が表示されない

Brave にはアドブロックが標準装備されており，広告の表示がされません．

そのため，サードパーティクッキーによる余計なトラッキングも，広告分の余計な通信量もかかりません．

これにより，より安全で高速な通信が可能となります．

## 広告を見るだけで仮想通貨がもらえる

基本的に Brave は広告をブロックします．しかし，設定を変えて Brave が用意した広告を見ることで，仮想通貨の BAT をもらえることができます．日本では資金決済法により BAT の取引ができず BAP(BATポイント) が付与されます．BAT はアメリカでは Amazon や Uber でギフトカードに交換できるサービスが始まっており，一般への普及が始まっています．

また，広告は「控えめな」を自称しており，個人のトラッキングは行わず，通信量に影響を与えない程度の広告らしいです．(どこまでホントかわかりませんが…)

Chrome でよくわからない広告を垂れ流されるくらいなら Brave で将来のお小遣い稼ぎしませんか？

## Chrome からの移植が簡単

「えぇ…でも Chrome に拡張機能追加しすぎて今更ブラウザ変えられない…」とお困りの方も多いと思います．

安心してください．Chrome は Chromium ベースのブラウザになるため，拡張機能をそのまま使うことができます．

そのため，拡張機能に依存している人でも簡単に乗り換えをすることができます．

# デメリット

次に個人的に Brave の気になる点をまとめます．

- ~~Linux での動作が安定しない~~
- 起動に若干時間がかかる気がする
- ゆうて BAP がイケてない

個人的に「Linux での動作が安定しない」が結構気になります．Linux で使用すると URL から飛んだ際にブラウザが落ちるたり，アドブロックがいまいち動作しないが結構痛いため，Linux では Firefox をデフォルトブラウザにしています．

# 終わりに

Brave のメリットデメリットをつらつらと書きました．

個人的な運用としては Mac，スマホでは Brave を使い，Linux では Firefox を使うようにしています．

これからどんどん開発が進みこれからどんどん使い勝手が良くなることを期待しています．

この記事を呼んで少しでも Brave がいいと思ったら以下からダウンロードできます．
https://brave.com/ja/
MacBook Air (M1) セットアップ備忘録

# セットアップ方針
intelバイナリは極力入れない方向で頑張ります。

## システム環境設定とか
旧Macを横に置いてだいたい同じような感じに設定！

## スクリーンショットの影を消す

```sh
% defaults write com.apple.screencapture disable-shadow -boolean true
% killall SystemUIServer
```

## Xcode
App Storeからインストールします。

## Homebrew
```sh
% cd /opt
% sudo mkdir homebrew
% sudo chown $USER homebrew
% curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

# PATHを通す
% cd
% vim .zshrc

export PATH=/opt/homebrew/bin:/usr/local/bin:$PATH

% source .zshrc
% which brew
/opt/homebrew/bin/brew

# Xcodeのライセンスにagree
% sudo xcodebuild -license accept
```
## Rosetta2
念の為いれておきます( ；∀；)

```sh
% sudo softwareupdate --install-rosetta
```

## Karabiner-Elements
```sh
% brew install karabiner-elements
```

`brew cask`じゃなくて良くなったんですよね(o・ω・o)
![Screen Shot 2020-12-20 at 15.02.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301047/9c3ce03e-6b8c-cdbe-fb4a-9393c0b65581.png)
USキーボード必須の設定です。

## iTerm2
定番のターミナルアプリですね(o・ω・o)

```
% brew install iterm2
```

### ターミナルカスタマイズ
```sh
# かわいいプロンプト
setopt PROMPT_SUBST     # allow funky stuff in prompt

if [ "$USER" = "root" ]; then
    color="red"         # root is red, user is blue
else
    color="cyan"
fi;


local ok_yuno="%F{yellow}✘╹◡╹✘%f"
local bad_yuno="%F{red}✘>﹏<✘%f"
local command_line="
%F{green}%B%*%b%f %F{$color}%B%n@%m%b%f %F{green}%B%~%b%f
%(?.${ok_yuno}.${bad_yuno}) %F{yellow}%B%#%b%f "

export PROMPT="${command_line}"

# lsに色をつける
alias ls='ls -G'
```
![Screen Shot 2020-12-20 at 15.13.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301047/2906a887-fb89-8930-1ddc-bc8c31492eac.png)
かわいい！

## Visual Studio Code
insiders buildを入れます。

https://code.visualstudio.com/insiders/

`.zshrc`にエイリアスを追加しておくと便利そうですね(o・ω・o)

```sh
alias code='code-insiders'
```

## TeX
```sh
% brew install mactex-no-gui
```

`/opt/homebrew/Caskroom/mactex-no-gui/2020.0407`にパッケージがダウンロードされるのでインストールします。

インストールが終わったら、
http://www.tug.org/mactex/aboutarm.html
から`MacTeX-2020-Universal.pkg`をダウンロードしてインストールします。

```sh
% lipo -archs $(which tex)
x86_64 arm64
```

## Google Chrome

```sh
% brew install google-chrome
```

## Node.js

```sh
% brew install -s nodebrew
```

`nodebrew`を編集

```nodebrew
sub system_info {
    my $arch;
    my ($sysname, $machine) = (POSIX::uname)[0, 4];

    if  ($machine =~ m/x86_64|arm64/) {
        $arch = 'arm64';
```

ビルドします。

```sh
% nodebrew compile v15.4.0
```

時間がかかるので気長に待ちましょう。

```sh
% nodebrew use v15.4.0
use v15.4.0

% node -v
v15.4.0

% npm -v
7.0.15

% lipo -archs $(which node)
arm64
```
BitVisorのソースコードをGitHub Code Scanningにかけてみた

はい，タイトルそのまんまです．最新のBitVisorのソースコードを，最近publicレポジトリならタダで使えるようになったGitHub Code Scanningにかけてみました．コードをスキャンして，脆弱性などを自動的にみつけて報告してくれます．

![github-release.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/0f1002c9-65f4-1a89-1e27-d786033ed0e4.jpeg)

![github-community.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/67c59fd4-f264-850e-4eb1-722d1cedea54.jpeg)

![github-scanning.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/d91e0a70-3977-6010-d0ed-932db87014f4.jpeg)

まだよく調べていませんが，スキャンの処理と，脆弱性の報告などの他の処理を組み合わせてワークフローを構築するための機構も充実しているようです．

さあチェック！

![analyze.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/e477af69-6565-2668-cfdf-5b7b3f705677.jpeg)

結果は以下の通りです．

![bitvisor-result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/92710055-574e-9ed6-1fd7-84420dc06c63.jpeg)

多くのソースコードを含むBitVisorのレポジトリ全体をスキャンしても，出たアラートは5つだけ．他と比較したわけではありませんが，BitVisorのコードは予想よりもかなりセキュアだと思いました．

![bitvisor-result-overview.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/eedeef1f-29e3-a289-8495-cb0bb6be8247.jpeg)

出たアラートは具体的には以下の通り．潜在的に危険な関数の使用と，乗算結果の大きな型への変換です．

警告されている潜在的に危険な関数はgmtimeとlocaltimeです．すごく危ない関数ではないような．

乗算については3つとも，乗算結果がintにはいらずあふれるかもしれないよという警告です．対応する部分のソースコードを見てみたんですが，あふれることはなさそうに思いました．

![bitvisor-result-alert.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/9598ba83-557d-31d3-af3c-1329c40f6048.jpeg)

セキュリティアドバイザリの個数は0ですので，そこを見ても何も出てきません．

![bitvisor-result-advisory.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105071/26a76977-9d27-6433-08b9-d71e0b7ba951.jpeg)

「セキュアVM」という単語を久しぶりに思い出しました．

- INTERNET Watch  2016/10/11: [インテルと筑波大学、政府主導の次世代OS環境「セキュアVM」開発で協力](https://internet.watch.impress.co.jp/cda/news/2006/10/11/13576.html)
Rubyでは任意の名前でメソッドを定義できる


この記事はRuby その2 Advent Calendar 2020 の20日目の記事です。
https://qiita.com/advent-calendar/2020/ruby2

---


Rubyでは任意の名前でメソッドを定義できます。
……と言うと、「いやいや、`def $%^&*`とか書けないじゃないか」「`||`は再定義できない演算子じゃないか」といった声が聞こえてきそうです。これはどちらも正しいのですが、それでいてRubyでは任意の名前でメソッドを定義できます。


ではそれはどういうことなのか、詳しく見ていきましょう。


# `def`構文


Rubyでメソッドを定義するには`def`構文を使います。

```ruby
# fooメソッドの定義
def foo
end

# メソッド名の後ろには!や?をつけられる
def foo!
end
def foo?
end

# =終わりのメソッド名を定義するとセッターのように使える
def foo=(value)
end

# 大文字もok
def FOO
end

# ひらがななどもok
def ほげ
end

# キーワードもok
def def
end

# 一部の演算子は再定義できる
class Integer
  # 42 - 3 が 42 + 3 に化ける！
  def -(right)
    self + right
  end

  # 単項+メソッドの定義
  def +@
  end
end
```

そして、冒頭の例に挙げたコードはどちらもSyntax Errorとなります。

```ruby
# Syntax Error
def $%^&*
end

# Syntax Error
def ||
end
```

ところが、これらの名前でメソッドを定義する方法があります。それは`define_method`メソッドです。

# `define_method`メソッド

まずは簡単に`define_method`メソッドの説明をしましょう。

`define_method`メソッドは、その名の通りメソッドを定義するためのメソッドです。
メソッド名を動的に組み立てたり、同じようなメソッドを複数同時に定義したりするためによく使うでしょう。

```ruby
`name`を大文字にしたメソッド名を定義
define_method(name.upcase) {}

# foo, bar, baz を一度に定義
%i[foo bar baz].each do |name|
  define_method(name) { name }
end
```


# 任意の名前でメソッドを定義する

そして`define_method`は任意の名前を受け付けます。つまり、`$%^&*`や`||`といった名前のメソッドも定義できます。
これらのメソッドは`.`を使ったメソッド呼び出しではSyntax Errorになって呼び出せませんが、`__send__`メソッドを使うと呼び出せます。

```ruby
# メソッドの定義
define_method('$%^&*') { puts 'method name is $%^&*' }
define_method('||') { puts 'method name is ||' }

# 呼び出し
__send__ '$%^&*' # => method name is $%^&*
__send__ '||' # => method name is ||
```

ですが、たとえ`||`メソッドを定義したとしても、`||`演算子の挙動が変わるわけではありません。

```ruby
class FalseClass
  # 再定義しても false || something の結果が変わるわけではない
  define_method('||') do
    false
  end
end

p false || true # => true
```



もちろん次のようないかにも定義できなさそうなメソッド名でも大丈夫です。


```ruby
define_method('') { puts '空文字列もok' }
__send__ '' # => 空文字列もok

# 0x00から0xffまでのどのバイトでもok
# (class Cの中に入れているのは、Kernel.#p を再定義しないため)
class C
  (0x00..0xff).each do |n|
    define_method(n.chr) { pp n.chr }
  end
end
C.new.__send__ 0x00.chr # => "\x00"

# ランダムなバイト列でメソッドの定義を試しても大丈夫
require 'securerandom'
class C2
  10.times do
    define_method(SecureRandom.random_bytes(10)) do
    end
  end
end
p C2.instance_methods(false)
# => [:"4(c\xF4\xBDQ\xD7\xB6\xA0l", :"J&q\xEEZ\x0E\xE3\x9F\"\xC1", :"}\x9F\xCF\x1C\x90\x06o\xFD\x84\xD6", :"U\x8Bc02'\xB4\xF0\xA0\xC4", :"\xEE\x88v\x14\xBA&j\xBE<\x10", :"\a+,\xCD\"\xF4\x83\x80\xE5\xCA", :"4\xC8\xAB/2\x06\f\xF1\xFB\xFA", :"\xBA\xE2E;\xCE\xBC\xB8\xB0b\xD0", :"u [l^q%\xC9\x03\xA2", :"q\xC5O\xAF\xDB\x05t\x86!\x88"]
```

# まとめ

Rubyでは`define_method`メソッドを使うと、任意のメソッド名でメソッドを定義できる、という話でした。
あまり使うことのないテクニックだと思いますが、覚えておくとどこかで役に立つかもしれません。
What's new in .NET 5

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

----
本記事では、「.NET 5」の概要と変更点について、ご紹介したいと思います。

元記事: [What's new in .NET 5 | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/core/dotnet-five/?WT.mc_id=AZ-MVP-5001601)

## .NET 5 概要

* .NET 5.0 は、3.1 に続く.NET Core の次のメジャーリリース
* 次の2つの理由から、.NET Core 4.0 ではなく.NET 5.0 という名前を付けている
    * .NET Framework 4.xとの混同を避けるため
    * これが今後の .NET の主要な実装であることを強調するために、名前から「Core」を削除

つまり、.NET 5 が目指したものは .NET（.NET Framework および .NET Core） の統合になります。
この統合により、.NET 開発者は、動作するプラットフォームに関わらず、シンプルな選択肢として「.NET 」を選ぶことができるようになります（とはいえ、Xamarin との統合は .NET 6 に見送りになっていいます）。

他にも以下の要素が更新されています。

* C# updates
* F# updates
* Visual Basic updates
* System.Text.Json new features
* Single file apps
* App trimming
* Windows ARM64 and ARM64 intrinsics
* Tooling support for dump debugging
* The runtime libraries are 80% annotated for nullable reference types
* Performance improvements:
    * Garbage Collection (GC)
    * System.Text.Json
    * System.Text.RegularExpressions
    * Async ValueTask pooling
    * Container size optimizations
    * Many more areas

## .NET Framework 4.x から .NET 5.0 への移行の際に推奨されている代替テクノロジー

| テクノロジー | 推奨される代替テクノロジー |
|------------| --------------------- |
| Web Forms | ASP.NET Core Blazor or Razor Pages |
| Windows Workflow (WF) | Open-source CoreWF|
RaspberryPiをWindowsPCで操作（無線）

# 1. はじめに
目的：RaspberryPiをPCで操作したい
参考サイト：[ラズパイへWinPCからリモートデスクトップ接続する手順](https://toriyaru.com/2020/06/05/%e3%83%a9%e3%82%ba%e3%83%91%e3%82%a4%e3%81%b8winpc%e3%81%8b%e3%82%89%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%83%87%e3%82%b9%e3%82%af%e3%83%88%e3%83%83%e3%83%97%e6%8e%a5%e7%b6%9a%e3%81%99%e3%82%8b/)


# 2. RapberryPi側の設定
　
<ol><li> 設定から `VNC` を有効にする

<li> `ファイル` >> `/etc/dhcpcd.conf`を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/d78545fc-cc20-c21d-cd15-71fa28f48915.png)
<li> 次のコードを追加してIPアドレスを固定


```
interface wlan0
static ip_address=192.168.11.10/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1
```

<li> 再起動

<li> `ターミナル` >> `ifconfig`で確認(wlan0の部分)

<li> 設定から`VNC`を有効にする

<li> `ターミナル` >> `sudo raspi-config`
`2 Display Options`
`01 Resolution`
`DMT Mode 16 1024×768 60Hz 4:3`
（ここは少し自信ない...）
</ol>

# 3. Windows側の設定
<ol><li>ここからVNC Viewerをインストール
https://www.realvnc.com/en/connect/download/viewer/windows/

<li>VNC Viewerを起動

<li>上の部分に`IPアドレス`または`raspberrypi.local`を入力
</ol>

接続完了！！

# 4. その他
・動きが遅かったので `右クリック` >> `Properties` >> `Options` >> `Picture quality` >> `Medium` に変更（初回以降はこの設定なしでもスムーズに動くようになった）
・LANケーブルでつなぐと上手くいかない（有線接続は[この記事](https://qiita.com/bouningen98/private/74b7fb157d85aa9fabb4)を参照してください）

# 5. VNC Viewerがつながらないとき
1.  `Tera Term` でSSH接続
<li> `ifconfig` でIPアドレスを取得
<li> VNC Viewerに取得したIPアドレスを入力
</ol>

一度接続したことのあるWiFiなら、これでいけるはず。
コロナ禍における新卒研修をオンラインで受けた話

#背景
今年の4月から大学院を卒業して、通信業界の会社へ入社しました。
ただ今年は例年と違い、コロナウイルスによって様々なことが現地や対面で行うことが難しくなり、
新卒研修も例外ではなく、研修はオンラインで受けることになりました。
__今年の新卒がコロナ世代と言われる中、コロナ禍の中でどのような研修を受けたのか、新入社員目線で良かったこと・悪かったことをまとめておきたいと思います。__


##研修の振り返り
4月から７月末までオンラインで様々な研修を受けました。オンライン研修の流れその内容を時系列順に振り返ります。
##3月
入社予定者に対して、4月の研修はオンラインで行うので、オンラインで研修を行えるようPC調査(環境やOS, IPアドレスなど)を行う旨のメールが飛んできた。元々は4月の研修は泊まり込みで行い、配属決定後に引っ越す予定となっていたが、一旦実家へ荷物を戻し、実家で研修を受けることになった。

##4月
4月1日の入社式はもちろんオンライン。新入社員は自宅で社長のお話や今後の研修の説明を受けた。
研修は新入社員全員で主に社会人としての心構えや会社のこと、ビジネスマナーの研修で、５人〜６人のチームで課題(ディスカッション)をしたり、個々人でオンライン講座や送付されたテキスト(IP入門など)を勉強した。
1日の流れとしては、
9:00 ~ 朝礼
9:30 ~ 16:30 チーム課題や個人課題
16:30 ~ 夕礼
17:00 ~ 17:30 残りの作業
こんなタイムスケジュールだった気がする
4月の最後に事務系か技術系かの配属発表があり、技術系の配属になった。まだ実家での研修は続くことに。。。

##5月
5月は主にスイッチやルータの勉強、「コロナ禍を受け今後の世の中がどのようになったらいいか」というテーマでチーム課題が与えられた。
やり方やタイムスケジュールは4月とあまり変わらず、基本チーム課題と個々人でオンライン講座を受ける。
5月の最後に開発を行う部署（ちゃんとコードを書く）の配属を受けるが、まだ引っ越しはなし。

##6月
6月はN予備でNode.JSの講座やUdemyでDockerの講座を受けて、アプリ開発についての研修を受けた。。
他にもデザインシンキングやAWSの講師からAWSの主要なサービスについてオンライン講義を受けることもあった。
ここでは８人くらいの人数での研修だったので、基本Discordで通話を繋ぎながら(カメラは自由)、疑問があったり、雑談などはすぐに話せるような環境だった。
ここで7月までに引っ越しするようにとのお達しがきたので、中旬に引っ越しをようやく行う。

##7月
7月はチームでアジャイルでの開発の研修を行った。
チュータの先輩社員をペルソナとして、ペルソナのもつ課題を引き出し、その課題を解決するためのアプリを開発する研修でした。
実際の開発の仕事に近いやり方で、モブプロしながら新入社員同士で「あーでもこーでもない」言いながら開発した。
使った技術としてはNode(Express)とAWS(EC2・Dynamo・Route53・Cognitoなど)を使い、使ったサービスはDiscord(通話)、Miro(ホワイトボートと付箋)、VSCode(LiveShareで共同でコードを編集)を使った。
研修中で会社へ出社した回数はなんと__１回__!!!


##8月
ここから現在まで実際の仕事としてチームに加わり、サービスの開発業務を行っている。
今もほとんどオンラインで業務を行っている。




#オンラインで良い点・悪い点
##良い点
- __精神衛生がとても良い__
- __自分のペースで学習や復習ができる__
- チャットなど使えば質問しやすくなる
- メモなどをPCで残せる
- いろんなサービスを使えばコミュニケーションや資料や考えの共有は割と可能

##悪い点
- __学んでことが身についているか不安になる__
- __顔すら知らない同期が多くなる__
- 会社のフロアについて全然知らなくなる
- 上司や先輩社員との交流がなくなる
- 通信環境によって画質や音質が左右される
- 人数が多すぎると通話でのコミュニケーションは大変（5,６人位が限度な気がする）


#まとめ
研修をオンラインで行ったことで、良かったこと・悪かったことはそれぞれあるが、__個人的にはオンラインで受けるメリットの方がデカく感じた。__（通勤がないことや自分の部屋で勉強・業務することでの精神衛生がとても良い）
しかし、人との交流やコミュニケーション(特にプライベートの話など)は現地じゃないとわざわざ会話をしなかったり、
初対面からオンラインで距離感や雰囲気を掴みづらいところもあるので、オンラインだけだと厳しいところもあるように感じた。
これからはオンラインと現地のそれぞれのメリットを生かした研修や働き方になればと思った。
__急にオンラインでも研修を実施できるように準備して下さった先輩社員・スタッフさんがとても凄い。。。__


#終わりに
__今回が初めてQiita投稿ということで、諸々見にくい点はご容赦ください__