OmniAICreator/Qiita-1.07M huggingface dataset:
【用語メモ】Gitの基本操作と用語メモ

#Gitとは
バージョン管理システム。グループ開発には必須。

##リポジトリ
ファイルやディレクトリの__状態を保存する場所__のこと。

###リモートリポジトリ
インターネット上にあるリポジトリのこと。複数人で開発するときにはここで管理する。

###ローカルリポジトリ
名前の通りローカルのPCで使う。普段はこっちで開発し、それをリモートリポジトリにアップロードする。


##ブランチ・マージ
###ブランチ
プロジェクトを分岐させること。__分岐した環境__のこと。

###マージ
分岐させた__ブランチを統合__すること。


##ワークツリー
__Gitで管理__されているファイルやディレクトリのこと。

##インデックス
ローカルリポジトリにコミットする前段階の場所。ステージともよばれる。

##基本コマンド
- __Git init__
リポジトリを__新規作成__するコマンド。コマンドを走らせたディレクトリ上に __.git__ というディレクトリが作成され、Gitで管理できるようになる。

- __Git clone__
リポジトリを__複製__するコマンド。コマンドを走らせたディレクトリ上に指定したリポジトリが複製される。

- __Git add__
ディレクトリをインデックスに追加するコマンド。
`Git add .`
とすることで、前回から変更があったすべてのディレクトリを__add__できる。

- __Git remote -v__
リモートリポジトリ名を確認するコマンド。

- __Git commit__
インデックスに上がった内容を__ローカルリポジトリに追加__するコマンド。

- __Git push__
ローカルリポジトリの内容を__リモートリポジトリに追加__(アップロード)するコマンド。

- __Git pull__
リモートリポジトリの内容を__ローカルリポジトリに取り込んで__同期するコマンド。

- __Git branch__
プロジェクトを分岐させるコマンド。

- __Git rebase__
コミット履歴を__移動__したり__修正、削除__したりするコマンド。__maege__をする前に、コミット履歴をきれいにするためのものらしい。

- __Git marge__
分岐したブランチを__統合__するコマンド。

##使えると便利なコマンド

- __Git show__
最新のコミット内容を表示するコマンド。

- __Git diff__
何かを変更する前と後の__差分を比較__して表示するコマンド。

- __Git log__
今までの__コミット履歴__などを表示するコマンド

- __Git stash__
作業を__一時保存__できるコマンド。別ブランチで作業する必要が出てきたが、まだコミットはしたくない場合などに使われるらしい。
ESP32マイコンとPCでTCP/IP通信する方法

# TL;DR
- M5StackとPCでUDP通信をするサンプルはあったがTCP/IP通信をするサンプルがなかった（見つからなかった）ので作った．
- ESP32ならどれでも動くと思いますが，筆者はM5Stackを使用しています．
- プログラムはあくまでも一例かつ適当なクオリティですので，悪しからず．

# M5Stackのプログラム
- TODOとコメントのある行は適切に値を入れてください．
  - SSID, passはそのまま文字列として入れてください．
  - IPは3桁ずつ区切って数値として(例：192, 168, 1, 100)入れてください．
- これをマイコンに書き込んでください
    - ArduinoIDEで書き込めます
    - 環境構築等についてはここでは省略

```C++
#include <WiFi.h>

const char ssid[] = "****"; // TODO
const char pass[] = "****";  // TODO
const int port = 11411; 

const IPAddress local_ip(***, ***, ***, ***);  //TODO
const IPAddress server_ip(***, ***, ***, ***);  //TODO
const IPAddress subnet(255, 255, 255, 0); 

WiFiClient client;

void setup() {
  Serial.begin(115200);

  WiFi.softAP(ssid, pass);       
  delay(100);               
  WiFi.softAPConfig(local_ip, local_ip, subnet);

  Serial.print("AP IP address: ");
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP);

  WiFi.begin(ssid, pass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500);  
  }  

  Serial.print("Local port: ");
  Serial.println(port);
  client.connect(server_ip, port);
}

void loop() {
  if (client.available()) {
    int val = client.read();
    Serial.printf("%c\n", val);
  }
  if (Serial.available()) {
    Serial.read();
    char write_data[1];
    write_data[0] = 'a';
    Serial.printf("write\n");
    client.write(write_data, 1);
  }
}
```

## Pythonスクリプト
sock_server.pyなどと名前をつけて保存してください．

```python

import socket
import time

def main():
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  sock.bind(("", 11411))
  sock.listen(1)

  print "waiting for socket connection"
  (clientsocket, address) = sock.accept()
  print("Established a socket connection from %s on port %s" % (address))
  s = clientsocket
  s.settimeout(0.5)

  cnt = 0
  while True:
    try:
      send_data = ['a', 'b', 'c']
      s.send(send_data[cnt % 3])
      cnt +=1
      try:
        rcv_data = s.recv(1, socket.MSG_DONTWAIT)
        print(rcv_data)
      except socket.timeout as e:
        pass

      time.sleep(1)
    except:
      s.close()

if __name__ == '__main__':
  main()
```

## 実行方法

- 1. マイコンのシリアルポートを開く（ArduinoIDEのシリアルモニタ等．ボーレートは115200．）
- 2. `$ python sock_server.py`とターミナルで実行
- 3. マイコンの電源を入れる（すでに電源が入っていたらリセット）
- 4. シリアルモニタに`a, b, c`と順に送られていたらPC→マイコンへの通信が成功している
- 5. シリアルモニタでエンターキーを入力するとターミナルに`a`が送られる
[2020Dec] HTTP と HTTPS のサイト転送を AWS で

# はじめに

http / https のサイト転送が必要になったので、試してみました。

URL 転送といえば最近では短縮 URL の活用がメジャーで、日本でも一般的に利用されていると思います。でも欲しいのはサイト転送です。
日本にも短縮しない URL 転送やサイト転送のサービスはありますし、海外では無料プランのあるサービスも見かけますが、せっかくなので AWS でやることにしました。

AWS で実現する方法の説明書は日本語情報も見かけるので、後発の本書としては劣化コピー感もありますが、それらの情報と少し違う操作をしたので、メモを残す次第です。


# 大まかな仕組み

- S3 の静的ウェブサイトホスティングの HTTP 転送機能で転送する
- CloudFront の Alternate Domain Names 機能で名前付け、および、暗号化する
- DNS の CNAME or ANAME で（間接的に） IP Address 付けする


# 手順概略

1. ACM 証明書作成
1. S3 バケット作成
1. S3 バケット設定
1. CloudFront ディストリビューション作成
1. DNS 設定


# 手順詳細

### ACM 証明書作成

us-east-1 にて、転送元ドメインの証明書を作成。


### S3 バケット作成

デフォルトからの変更点は下記。

- 「ブロックパブリックアクセスのバケット設定」は「ブロックしない」！　笊！


### S3 バケット設定

「プロパティ」の「静的ウェブサイトホスティング」で、選択肢は上から「有効にする」「オブジェクトのリクエストをリダイレクトする」「なし」を。
「ホスト名」には転送先ドメインの FQDN を記入。URL じゃないよ。
↓こんな感じ。
![s3_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150857/8a6b4b05-a9c0-4660-5cd5-e35c078cf86f.png)


### CloudFront ディストリビューション作成

delivery method は Web で。
Origin Domain Name は S3 バケットの静的ウェブサイトホスティングのバケットウェブサイトエンドポイントの FQDN を記入。プルダウンから選べるものはエンドポイントの FQDN じゃないよ！
Alternate Domain Names に転送元ドメインの FQDN を記入。
SSL Certificate は Custom SSL Certificate を選択し、ACM で作っておいた証明書を選択。


### DNS 設定

Route53 だったら CNAME じゃなくて A の Alias を使うのが正解でしょう。Zone Apex に対しても使えます。


# トラブルシュート

CloudFront の Origin Domain Name にエンドポイントではなくて S3 バケットの FQDN が入っていると S3 が 403 を XML で返しますよ。
↓こんなやつ。
![s3_403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150857/d2007cf0-52b3-e49f-d163-211fd23b3287.png)


CloudFront に Alternate Domain Names が設定されていないまま DNS 的に到達可能になると CloudFront が 403 を返しますよ。
↓こんなやつ。
![cf_403.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150857/d52f934c-8783-29d1-40d0-9eeafabaed42.png)


# おわりに

最近は ANAME が使える DNS も増えてきたっぽいですね。IIJ とか。
みんな Zone Apex 好きだなぁ。
Get Component Boundsについて

#Get Component Bounds
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367001/8d0c521f-ee49-b81a-4d5d-59f3f104ec33.png)

コンポーネントのバウンズの原点と最大位置を返す。
origineとBoxExtentがなにを返すのかぱっと分からなくなりがちなので検証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367001/bf5494f6-1a7b-6ee7-da84-798ea956dfa6.png)


画像のように三つのスタティックメッシュを含んだBlueprintで検証
Cube >> 黄Cube
origine >> 赤Sphere
Extent >> 青Sphere

##よく使用する感じのBP
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367001/ea6d6536-0d7c-1e58-be3a-20831b6ae08c.png)

Construction Scriptで位置を設定。
CubeからGet Component BoundsしてOrigineの位置とBoxExtentの位置を割り出す。

# 結果
## Origine
Cubeの原点位置のワールド座標を返す。

## Box Extent
Cubeの原点から相対的なバウンディングボックスの大きさを返す
ワールド座標ではなく、あくまで原点からの座標なので固定
位置を保持し続けたかったら画像のようにOrigineと足してあげればよい。

Sphere Radiusは試してないけど、たぶんComponentをBounding Sphereで覆った時の半径が返ってくるんじゃないかと思います。
JDLA G検定 合格体験記

# はじめに

[Qiita Advent Calendar 2020](https://qiita.com/advent-calendar/2020) の記事の1つとして執筆していますが、内容は以前から私が執筆したかった内容です。

# 受験した資格

* [JDLA G検定 (JDLA Deep Learning for GENERAL)](https://www.jdla.org/certificate/general/)
* 主催: [一般社団法人日本ディープラーニング協会](https://www.jdla.org/)
* 費用: 13,200円（税込) ※ 一般の区分

# 内容

[G検定概要](https://www.jdla.org/certificate/general/#general_No01)にあるとおり、

> ディープラーニングの基礎知識を有し、適切な活用方針を決定して、事業活用する能力や知識を有しているかを検定する。

という内容です。[シラバス](https://www.jdla.org/certificate/general/#general_No03)に試験範囲の項目が載っていますが、シラバスでは項目のみなので、後述する書籍（テキスト）等を読んで内容の詳細を把握します。エンジニア（技術者）向けの資格はE資格という別の資格となっており、G検定は「事業活用する人材（ジェネラリスト）」向けの資格となっています。

# 受験方法

* 試験時間 120分
* 多肢選択方式
* オンラインでの受験（私は自宅で自分のPCのWebブラウザで受験しました）

**受験日と時間帯が指定されています**（年3回。[試験日程](https://www.jdla.org/certificate/#certificate_No02)を参照）。また、**受験申込可能な期間も限られているので、事前によくスケジュールを確認してください**。

その他の詳細は[G検定概要](https://www.jdla.org/certificate/general/#general_No01)をご確認ください。

# 受験のきっかけ・目的

今までインフラエンジニア（アプリの実行基盤に関するソフトウェアエンジニア）として活動しており、人工知能（AI）やディープラーニングには詳しくなかったが、将来的にAIやマシンラーニング（機械学習）、ディープラーニングの知識・スキルがエンジニアにとって必須となるだろうと思い、まずAIやマシンラーニング、ディープラーニングに関する基本的な知識を身に付けたかった。また、G検定合格後は実装技術（例えば、E資格の内容や機械学習ライブラリ）やクラウド・サービスのAI関連サービスのスキルを身に付けたかったため、その基礎を身に付けたかった（**基礎ができていないと応用はできないため**）。

# 学習方法

学習期間は2ヶ月程度。以下の2冊の書籍を一通り学習した。

* [深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト](https://www.amazon.co.jp/dp/4798157554)
* [徹底攻略 ディープラーニングG検定 ジェネラリスト問題集](https://www.amazon.co.jp/dp/4295005665)

また、以下の書籍も参考にした。

* [AI白書 2020](https://www.amazon.co.jp/gp/product/4049110342)

G検定向けのテキストや問題集は上述のもの以外もありますので、自分にあったものを使用してください。

# 結果

**合格**
（G検定の2020年の第1回目（2020 #1））

# 所感

[G検定概要](https://www.jdla.org/certificate/general/#general_No01)に「220問程度」とありますが、[G検定の例題](https://www.jdla.org/certificate/general/issues/)のところにあるように、1つの設問に複数回答する箇所（穴埋め）がある形式等で出題され、その回答箇所をそれぞれ1問とカウントしているようです。そのため、思ったほど問題は多いとは感覚的には思いませんでしたが、それでも問題の数は多いです。<font color="Blue">**きちんと自分の頭の中に知識として入れて取り出せるような状態にしておかないと、全ての問題に制限時間内に回答できないと思います**</font>。私が全ての問題を解き終わったのは、終了時刻の3分前でした。解き終わったという安心感から、不覚にも回答の見直しを行なうことができず（恥ずかしい...）、そのまま試験が終了してしまいましたが、何とか合格できました。

合格して良かったと思った点は、やはりAIやマシンラーニング、ディープラーニングに関する歴史や基本的な用語、理論や手法が理解でき、説明できるようになったことです。これで、今後、詳しい実装技術を身に付ける準備ができたと思いました。また、CDLEという合格者のコミュニティがあり、そこで<font color="Red">**合格者を対象にした勉強会やセミナがあり**</font>([connpassのページ](https://jdla.connpass.com/)参照)、合格後も継続的に研鑽ができるというのも非常に良い点だと思っています。

# 最後に

最近、ある大学の先生が近年の第3次AIブームと2000年頃のインターネット・バブルは似ている（共通点がある）と言っているのを聞きました。インターネットはプロトコルとしてTCP/IPを利用しているネットワークです。インターネットが普及する前には、プロトコルとしてはSNA([Systems Network Architecture](https://ja.wikipedia.org/wiki/Systems_Network_Architecture))、[IPX/SPX](http://e-words.jp/w/IPX-SPX.html)などのプロトコルが用いられているシステムもあり、TCP/IPを用いていないシステムも多くあったのですが、最近はネットワークに接続されているシステムのほとんどはTCP/IPを用いているのではないでしょうか。そういう意味で現在ではITエンジニアにとってTCP/IPは必須のスキルとなっていると思います。マシンラーニング、ディープラーニングについても、今はそれらを担当するエンジニアが割り当てられるという状況だと思いますが、<font color="Red">**マシンラーニング、ディープラーニングが普及するにつれて、それらがエンジニアにとってTCP/IPのような必須の知識・スキルになるのではないでしょうか**</font>。
そのため、未来を見据え、今の内から必須となるマシンラーニング、ディープラーニングのスキルを身に付けるべきではないでしょうか。JDLA G検定の受験を皆様に強くお薦めします。


※ 2020年12月現在の情報に基づいて記載しております。受験の際は必ず公式サイト等で最新の情報をご確認ください。
C++ 参照渡し サンプルコード

C++ 参照渡し サンプルコード
C++をウェブ上で実行できるサイト：paiza C++
https://paiza.io/projects/0qe-WRfPMHzDToM0P0bLUg?language=cpp

```C++
#include <iostream>
using namespace std;

void aa(int& a){
    cout << a << endl;
    a++;
    cout << a << endl;    
}

int main(void){
    // Your code here!
    int a = 10;
    aa(a);
    cout << a << endl;
    
}
```

出力結果

```
10
11
11
```
CircleCIでLambdaのデプロイを改善した話

# はじめに
この記事は[CircleCI Advent Calendar 2020 - Qiita](https://qiita.com/advent-calendar/2020/circleci)の3日目の記事です。

自分のチームではLambdaを使って、バッチなどを動かしています。
LambdaはAWS SAMで管理していましたが、デプロイを自動化しておらず、手動で反映していました。 

そんな状況をCircleCIを使って改善した話をしていきます。

# 改善前
改善前のデプロイフローが下記になります。

![改善前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39671/177ccb4c-249a-75f1-8022-46b7b73d1bd0.png)


このデプロイは下記のような課題を抱えていました。

* ローカル上で依存解決して実行しないといけない
* 変更セットをレビュアーが隣で確認しないといけない

このような作業を行っているため、環境変数の書き換えがミスがあったりし、ダブルチェックに緊張感がある状態でした。
開発中はこの状態で進めていましたが、本番運用を始める前にはなんとかしたいという思いがあり、自動化の構築を始めました。

AWS SAMとLambdaという構成なので、AWS Code系のサービスにするか迷いましたが、下記2点からCircleCIを選定しました。

* 他のシステムでCircleCIを使っており、使い慣れている
* ツールの統一

# 改善後

改善後のデプロイフローは下記になります。
GitHubでリリースタグを作成したら、CircleCIがデプロイを動かす仕組みです。  

![改善後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39671/0a44b57a-a403-8e4d-505f-ea51b0e1be66.png)
 
意識したポイントをいくつか紹介していきます。

## 意識したポイント

### 依存解決をできるようにする
Node.jsを使っていたのですが、元々CDを想定しておらず、CircleCI化するに当たって対応が必要でした。

具体的には下記のように、アプリと環境変数のディレクトリに区分がなく、アプリが入っているディレクトリ内ごとに `package.json` が入っていました。
勿論monorepoにはなっていません。

```
├── アプリ1
    └── package.json
├── アプリ2
    └── package.json
└── 環境変数のディレクトリ
```

ここは下記のようにディレクトリ構造の変更と、シェルでディレクトリに `cd` してアップデートすることで解決しました。

```
├── apps
    └── アプリ1
        └── package.json
    └── アプリ2
        └── package.json
└── 環境変数のディレクトリ
```

monorepoも検討しましたが、時間の都合でシェルで解決することにしました。

### 変更セットを確認できるようにする
CloudFormationで `--no-execute-changeset` を付け加えると、事前に変更セットの確認ができます。
それは `sam-cli` でも同じでしたので、 `--no-execute-changeset` を事前に変更セットを見れるようにしました。

これにより、レビュアーに何が変更されるかわかりやすくなり、デプロイ承認のドキドキを減らすことができました。

```
sam deploy (略) --no-fail-on-empty-changeset
```

デプロイはワークフローを組んでおり、[approval](https://circleci.com/docs/ja/2.0/workflows/#%E6%89%8B%E5%8B%95%E6%89%BF%E8%AA%8D%E5%BE%8C%E3%81%AB%E5%87%A6%E7%90%86%E3%82%92%E7%B6%9A%E8%A1%8C%E3%81%99%E3%82%8B%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%95%E3%83%AD%E3%83%BC)の前に実行するようにしています。
これにより、承認前に変更セットを確認することができました。

ここは今回の改善で一番うまくできたと思っています。

# まとめ
いくつかの工夫を取り入れ、Lambdaのデプロイを改善することができました。
どなたかの参考になれば幸いです。

# 参考

* [ワークフローを使用したジョブのスケジュール - CircleCI](https://circleci.com/docs/ja/2.0/workflows/)
* [CircleCIでSAMをデプロイする](https://juve534.hatenablog.com/entry/2020/02/18/202336)
NDIを使ってちょっと幸せになった話

この記事は、 [大阪工業大学 Advent Calendar 2020](https://adventar.org/calendars/5332)の2日目の記事です。

こんにちは、けやっこです。某所でWebフロント周辺を触ってるOBです。
今回はGoogleのMeet等でたまに利用しているNDIについて、メモがてら記事に残そうと思います。


## NDIとは
> NDI(ネットワークデバイスインターフェイス)は、米国NewTek社によって開発されたIP利用における新しいライブビデオ制作ワークフロー支援プロトコルです。このNDIテクノロジーを活用することで、一般的なギガビットイーサネット環境においても、映像、音声、メタデータを、NewTek社TriCasterやIPシリーズなどのシステム間だけでなく、NDI互換のさまざまなシステム、デバイス、PCなどとのリアルタイムによる相互伝送を可能とします。

https://tricaster.jp/ndi-central/

似た様なものにRTSPがありますが、NDIでは必ずしもソースのIPアドレス・ポート番号を把握して受信側に設定する必要がないので
高度なことをしないのであれば、これで十分だなと思っています。


## 利用例
個人的によくやるのはiPadの画面共有です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478491/7dd3afad-58f1-8cba-c237-a62e752e9d88.png)
まずはiPad上でアプリを利用して、ディスプレイの映像をNDI経由で配信。
その映像はPCで`NDI Virtual Input`を利用して受信し、仮想のカメラデバイスの映像として利用できるようにします。
あとは通常のカメラと同じように仮想デバイスを選択すれば、画面共有の完了です。
（画面をキャプチャする`NDI HX Capture`のみ有料）

メモやちょっとしたスケッチを共有したいときに重宝しています。

## さいごに
GStreamerにNDIのプラグインもあるみたいなので、ラズパイカメラの映像を使ったり、PTZカメラの映像の変換をしてソースにすることもできそうですね。（未検証ですが...）
その映像も`NDI Virtual Input`の仮想カメラ経由でOBSに取り込むこともできるので、使い方によっては色々遊べそう。
本番環境でsudo yum updateしてサービスが動かなくなった

# 環境

- EC2 (Amazon Linux)
- Apache
- php7.1

# 私がやってしまったこと

この事件が起きたのは2020年6月。既に稼働しているWebサービスでとあるデータ取得の処理が止まってしまっているので調査してほしいと頼まれました。また、サービスに影響が出るものだからなるべく早めに対処してほしいと言われました。

マネージャー 「**今日の夕方まで**にはお願いね。もし難しそうだったら午後イチで一旦MTGしよう。14時までに連絡をください。」

わたし　「任せてください！」


・・・・ とは言ったものの、本番サーバーで起きている障害の調査は今までやったことがありませんでした(**もちろん本番サーバーにログインしたこともない**)し、進め方も全く思いつきませんでした。しかも、対応する**サービスの開発には携わったことがなく**、sshログインの設定から行う次第でした。 

まあ、今まで頼まれたタスクを期限内に終えられなかったことないし大丈夫！という**謎の自信**で**本番環境に対する緊張感も持たず**乗り切りろうとしていました。そして、

わたし　「とりあえずログインできた！まずログを見たいな〜ええと、あれ、なんか警告出てるな。**sudo yum update** か。よし、やっておこう。」

この時**自分が何をしたのかわかっていませんでした**。

調査は結局先輩に手伝っていただくことにはなりましたが、なんとかデータ取得も再開され無事にタスクを終えたと思っていました。

翌日

先輩 「すみません、どなたか昨日**sudo yum update**というコマンド叩きましたか？パッケージのアップデートによって動かなくなってしまった処理があり、エラーが多発してます。。。。」

この時、ようやく自分がしたことの重大さに気がつき、血の気が引いていくのがわかりました。ああ、めちゃくちゃ怒られる、どうしよう、と思いました。
しかし、私が思っていたように怒る人は誰もおらず、どうしたらこういう事故が起こらなくなるか一緒に考えようと言ってくれました。この時心から安心して、気持ちもだいぶ楽になったことをよく覚えています。

実際動かなくなってしまったのは、curlコマンドを使う処理(Guzzle使ったAPI系もろもろの処理)で、原因としてはcurlのバージョンが上がったことでSSLの中間証明書がうまく働かなくなってしまったためでした。こちらの問題も先輩が対応してくださり、そこまで大ごとにはなりませんでした。

# 惨劇はなぜ起こってしまったのか
私がやってしまったこと、の中の太字部分が原因だと考えています。

- 本番サーバーにログインしたこともないのに緊張感を持たずに作業してしまった
- 慣れないことなのに期限が短く焦っていた
- できなかったことがないせいか、謎に自信だけあった
- できなかったことがないせいか、謎にプレッシャーを感じていた
- プロジェクトに参加していたわけではないので、わからないことを誰に聞けば良いのかわからなかった。長期プロジェクトで、自分以外の人は割と親密だったことも聞きにくかった原因

# 二度と惨劇を起こさないためにどうしたのか
**自分がどうしたのか** と **プロジェクトとしてどうしたのか** に分けて書きます。

### 自分がどうしたのか
- 本番環境がどういうものなのか意識する(この事件以降、自然に緊張するようになりましたw)
- 自分一人でなんでもできるなんて思わない(調子に乗りすぎてました。。)
- 時間がないからといって焦らない。焦ってもいいことない。

こう書いてみると、エンジニア職に限らず必要なことだと思いますね。

### プロジェクトとしてどうしたのか
- sshログインできるユーザーが実行できるコマンドを制限する
- 障害にどう対応したのか、チケットに細かくコメントを残す

プロジェクトメンバーの誰もが管理者権限で本番環境にログインできる、という状況はやめた方がいいと考えています。ただ、やり方を変えるのはとても難しいことで時間がかかります。少しずつ、安全な環境になっていってほしいものです。

# 最後に
ここまで読んでくださり、有難うございます。この事件以降インフラ周りの作業を半年くらい続けて、今は新しい人に引き継ぐ作業をしていますが、この事件のおかげか以前より良い緊張感を持てていて、セキュリティに対する意識が高くなったと感じています。
明日は[nobu0605](https://qiita.com/nobu0605)さんによる[本番でTableを1つDeleteしてしまいON DELETE CASCADEでさらに4つTable dataが消えた話](https://qiita.com/nobu0605/items/75793a4db539f054b28d)、楽しみですね。自分がやってしまったら1週間くらい立ち直れなそう。。笑
# VS Codeショートカットキー

## VS Codeで使うショートカットキー

`⌘`→command
`⇧`→shift
`⌥`→option
`⌃`→controll
 
## 1.頻繁に使うもの
|  目的  |  ショートカットキー  |
| ---- | ---- |
|  範囲選択  |  ⇧ + 上下左右  |
|  端に移動  |  ⌘ + 左右 |
| 単語移動　| ⌥ + 左右 |
|  元に戻す  | ⌘ + Z   |
|  やり直す  |  ⌘ + ⇧ +  z  |
|  複数範囲選択  |  ⌘ + D  |
|  ファイル内検索  | ⌘ +  F   |
|  横断検索  | ⌘ + ⇧ +   F   |
|  定義元を参照  |  F12  |
|  ピークで定義元を参照  |  ⌥ + F12  |
|  リファレンスを表示  |  ⇧ + F12  |
|  クイックフィクス(修正)  | ⌘ + .   |
|  ファイル検索  |  ⌘ +  P  |
|  ファイルを閉じる  |  ⌘ + W  |

## 2.そこそこ使うもの
|  目的  |  ショートカットキー  |
| ---- | ---- |
|  行の入れ替え  | ⌥ +  上下   |
|  ファイル移動  | ⌘ + ⌥ +   左右  |
|  コメントアウト  |  ⌘ + /  |
|  コマンドパレット表示  | ⌘ + ⇧ + P   |
|  新しいウィンドウ  |  ⌘ + ⇧ + N  |
|  フォルダを閉じる  | ⌘ + K → F   |
|  新しいタブ  |  ⌘ + N  |
|  別名で保存  |  ⌘ + ⇧ + S  |
|  直前に閉じたタブを再度開く  |  ⌘ + ⇧ + T  |
|  シンボル名を変更  | F2   |
|  シンボル名を横断検索  |  ⌘ + T  |
## 3.覚えておくと便利
|  目的  |  ショートカットキー  |
| ---- | ---- |
|  問題タブを表示  | ⌘ + ⇧ + M  |
|  カッコの始まり・終わりに移動  | ⌘ + ⇧ + \   |
|  複数行コメントアウト  | ⌥ + ⇧ + A  |
|  ファイル内の文字列置換  |  ⌘ + ⌥ +   F  |
|  編集履歴表示  | ⌃ + Tab   |
|  直前の編集ファイル開く  |  ⌃ + -  |
|  ファイルを開く  |  ⌘ + O |
|  ズームイン  |  ⌘ + ⇧ + -  |
|  ズームアウト  |  ⌘ + -  |
|  行削除  | ⌘ + ⇧ + K   |
|  インデント  | ⌘ + ]  |
|  アウトデント  | ⌘ + [  |
|  下に一行インサート  |  ⌘ + Enter  |
|  上に一行インサート  | ⌘ + shift + Enter   |
|  サイドバー消す  | ⌘ + B  |
Notionでドキュメントを検索するときは⌘ + Kショートカットを使おう

アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これは[Notion Advent Calendar 2020](https://qiita.com/advent-calendar/2020/notion) 1日目のエントリです。

# Quick Find

NotionにはQuick Findというドキュメントを検索する機能があります。
参考: [Quick Find](https://qiita.com/pictiny/items/65bff63a81a0592af761#quick-find)

<img width="470" alt="検索1" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/e147fa2b-cb5f-eaec-63a8-f584aa236171.png">

Quick Findは画面左のサイドバーから利用できますが、この機能が⌘ + Kのショートカットで呼び出せるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427952/b1913e8c-072d-fc35-11b6-1ec598fadad5.png)

# まとめ
⌘ + KはSlackのクイックスイッチャーを開くショートカットと同じです。
最近のQuick Findは性能が向上していることもあって、このショートカットはとても便利ですね！

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Okay, we give in 🏳️<br><br>Now you can pull up Quick Find with ⌘ + K! (Or Ctrl if you&#39;re on Windows) ⌘ + P still works too if you&#39;re used to that. <a href="https://t.co/S9wJLtETcx">pic.twitter.com/S9wJLtETcx</a></p>&mdash; Notion (@NotionHQ) <a href="https://twitter.com/NotionHQ/status/1333490586779668480?ref_src=twsrc%5Etfw">November 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ChucKによるオーディオプログラミング例

ChucK
===

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

# 概要

https://chuck.cs.princeton.edu/

マルチメディア用のオープンソースのビジュアルプログラミング言語。並行処理や処理実行中の変更（オンザフライ）が特徴。作曲、研究、教育、ライブコーディングなどに使用される。IDEとしてminiAudicleが用意されている。ライセンスはGPL。

プリンストン大のGe Wang（現在はスタンフォード大、Smule社）が2003年に開発。


# 実装例

## サイン波生成

ChucKの最大の特徴は多目的に使用されるChucK演算子=>です。この例でもオーディオグラフの連結、値の変数への代入、時間制御にChucK演算子を使っています。

```cpp

SinOsc sine => Gain g => dac;

440 => sine.freq;
0.5 => g.gain;

1::second => now;
```

## Delayエフェクト

ループ構造もChucK演算子を使って簡潔に表現できます。

```cpp

// read wav file
me.dir() + "/../voice.wav" => string filename;
SndBuf buf;
filename => buf.read;

// setup audio graph
buf => Gain delayLoop => dac;
delayLoop => Gain feedback => Delay delay => delayLoop;

// setup parameters
400::ms => delay.max => delay.delay;
0.5 => feedback.gain;
0.5 => delay.gain;

// play sound
buf.length() * 2 => now;
```


# 感想

ChucK演算子など、あまり他の言語に似ていない独自性の高い仕様ですが、言語設計として非常に洗練されており、素直にシンプルに書くことができます。ライブコーディングパフォーマンス用言語としては、予想外の音というより想定通りの音を出しやすい印象です。統合環境miniAudicleの完成度も高く、軽快に動作するので全体として非常に使いやすいです。

モバイル対応ChiP(ChucK for iPhone)やUnity用アセットもあり、応用先は広いように思います。（これらはGPLではありません）

[オーディオプログラミング言語 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/audiolang)
（FusionPCB-2020版）KiCadで部品実装基板をおこしてみた

本記事は[Seeed UserGroup Advent Calendar 2020](https://qiita.com/advent-calendar/2020/seeed_ugs)の4日目の記事です．

[FusionPCB](https://www.fusionpcb.jp/)とは，Seeed studio社が提供する基板製造サービスです．先月，自身で設計した部品実装基板を再発注したところ，前回（[1年半前](https://qiita.com/nobu_e758/items/3a4ea1fa68601a07594e)）とは少し状況が違うところがありましたので，そちらを中心に紹介します．

# できたもの

2年ほど前から大学の先生と一緒に開発しているプログラマブルゲームパッド ["GameControllerizer"](https://sites.google.com/view/gamecontrollerizer)のセカンドロットです（奥の赤がファーストロット）．設計はKiCadでやりました．
明日から開催の [Ogaki Mini Maker Faire](https://www.iamas.ac.jp/ommf2020/) でも展示しますので，ご来場の方はお立ち寄りいただければ幸いです．

![PXL_20201201_131333650.PORTRAIT_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/7d2b512b-6d01-52d0-dfe1-c6f171023ef8.jpeg)

# 変わっていたところ

わずかに回路を変更したとはいえ再製造なので，発注かけて待つだけです．ですが，FusionPCBのほうも，いろいろと状況が変わっていました（主に良いほうに）．

## ①選択できる部品が凄く増えた（10k→150k）

FusionPCBに部品実装基板を発注する場合，基板発注ページにある[**定番部品リスト** ](https://www.fusionpcb.jp/opl.html)の中から部品を選べば，実装時によろしく調達してもらえます．"自分で購入して送る"といったことは不要で，大変楽です．

前回発注したとき，リストには10,000種ほどの部品が掲載されていたのですが，**いつの間にか150,000種まで増えていました．** 私のような週末電子工作レベルならば，ほぼ間違いなく調達できるではと思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/e29c2042-87d4-092e-de55-8a67bb305570.png)

## ②発注後に確認できる製造進捗画面がいい感じになった

「基板製造のこの工程」というレベルまで表示してくれます．別に，わかったからといってどうにかなるものではありませんが，**実装上がりを待つのがちょっと楽しくなりました．**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/a8e4c396-9632-9732-e306-6952d9ff335c.png)

## ③基板設計審査サービスがイケてる！

正直このために記事を書きました．10月末に基板発注したとき，費用項目の中に「基板設計審査サービス」なるものが増えていることに気づきました．ただ，「費用ゼロ円だし，形だけのサービスなんだろうな～」と思い，気にもしていませんでした．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/5104615e-4024-7f17-4b0f-8c9a4d96baf7.png)

が，発注の翌日，さっそくFusionPCBより「審査がおわったので，結果を確認してね」とメールが届きました．審査結果らしきExcelファイルを開くとこんな感じでした．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/90a1686e-e0e6-4a5e-d67f-9666637fa42f.png)

曰く **「部品のフットプリントがデータシートと合っていないので，基板パターンの修正よろしく」** との指摘です．**ありがたい！！ と思いました．** 

基板設計のお仕事を同僚や先輩とやっているような場合とは異なり，**素人が個人でやっている場合，デザインへの不安が大きかったとしても誰かが確認してくれるわけではありません．そんな時，よく知る誰かが製造前に最低限チェックをしてくれるというのはめちゃめちゃ安心感があります**．特に部品実装基板の場合額が大きくなるので，追加費用なしでこういったサービスがあるのは本当にありがたいと思いました（ゼロ円なのは一時的なものかもしれませんが）．

※ところで，この指摘[1]は "Groveコネクタのフットプリント間違い" なんですが，フットプリントライブラリはFusionPCBから配布されているものを使ったんですよね．．．どうしたもんでしょう？ Pull request送るとかしたらよいのでしょうかね？

## その後

修正後のデザインを再Uploadしたあとは，何事もなかったように進みました．発注時の予想生産時間は26営業日となっていましたが，23日ほどで手元に届きました．

|  日付  | 状況 |
|:------:|:----|
| 2020/10/28 | 発注 |
| 2020/10/29 | 設計審査結果が届く．急ぎデザインを修正＆再提出． |
| 2020/10/30 | 基板製造開始． |
| 2020/11/15 | 基板製造完了． |
| 2020/11/18 | 部品実装完了．「発送したよ」 とFusionPCBからメールが来る．|
| 2020/11/20 | 受け取り．受け取り時に通関費用（10000円強）が必要でした |

小型基板100枚のわりに大きな段ボールだな，と思ったら，基板1枚ずつプチプチで包んでくれていました．

![DSC_0048.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/ce76d3cf-13cd-0f61-2c72-8b253c57bcb8.jpeg)

# まとめ

**FusionPCBの基板設計審査サービスはイケてる！**

# おまけ

発注の数日後，「この（コロナで）難しい時期に発注してくれてありがとう！ささやかだけど New Year giftsを送るよ！」なんてメールがFusionPCBから届き，こんなものをいただきました．感謝．

![PXL_20201202_040639869.PORTRAIT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156705/d6c2f166-c347-0dc2-00f3-49c6f6009a1c.jpeg)
yumでphp8をインストールしよう!!!

# 概要
php8.0をamazon linux 2を使っインストールする。

awsのcloud9を利用して開発する。

# 前提
#### cloud9の設定
* Create a new EC2 instance for environment (direct access)
* t2.micro (1 GiB RAM + 1 vCPU)
* Amazon Linux 2 (recommended)
* After 30 minutes (default)

# 内容
phpもともと入ってました。

```:Linux
$ php -v
PHP 7.2.24
$ amazon-linux-extras list php
```

PHP 8.*は存在しませんでした。

```:Linux
$ sudo amazon-linux-extras install epel
$ sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
```

epelとremiを使ってphp8系をインストールします

```:Linux
$ sudo yum -y install php80 php80-php php80-php-mbstring php80-php-pdo php80-php-xml php80-php-fpm php80-php-mysqlnd php80-php-gd
```
```:Linux
$ php80 -v
PHP 8.0.0 (cli)
```
##### やったね〜
でも....まだphpのversionは7.2です

##php72の削除
```:Linux
$ sudo yum remove php-*
$ php -v
bash: /usr/bin/php: No such file or directory
```
##php80をphpとして設定する
```:Linux
$ sudo alternatives --install /usr/bin/php php /usr/bin/php80 1
```
##php8、最高w
```:Linux
$ php -v
PHP 8.0.0 (cli) (built: Nov 24 2020 17:04:03) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
```

## 関連記事
* <a href="https://dev.classmethod.jp/articles/php-new-version8/">https://dev.classmethod.jp/articles/php-new-version8/</a>
* <a href="https://blog.pinkumohikan.com/entry/how-to-install-php74-to-centos8">https://blog.pinkumohikan.com/entry/how-to-install-php74-to-centos8</a>

#最後に
初投稿でした。
1日目：VキャスでVCI開発環境を整え、背景をRoomに反映する

この記事はアドベントカレンダー「[【VCI】テーマパークを作ろう](https://adventar.org/calendars/5855) 」の1日目の記事です。

#はじめに
今回のアドベントカレンダーではVirtualCast(Vキャス)内で用いられるVCIの作成方法を、テーマパークを作りながら実際に学んでいこうという内容となります。25回完了時にテーマパークが完成していることが目標です。

基本的に他に書かれてそうなことは流れだけ説明して細かい説明はしない予定です。
(内容にプログラムが少なくなるかもなのでもしかしたら別サイトに移行するかもしれません)


VキャスとVCIについては詳しい説明は省略します。以下のサイトを御覧ください
　・ Vキャス：https://virtualcast.jp/
　・ VCIとは：https://virtualcast.jp/wiki/doku.php?id=vci:top
簡単に言えばVirtualCastはVRで多人数で交流しながら遊べるサービスでVCIはその中で使える(自作できる)アイテムの規格です。

# 今回の内容

* 最低限必要なソフトセットアップ及びサイトのアカウント作成
* サンプルVCIを背景としてアップロードし、Roomに設定する

# 使用するソフト
* virtualcast：アプリそのもの。後述のseedOnlineと連携することでVCIが使えるようになる。
* Unity：有名なゲームエンジン。Vキャスではここにいろいろな３Dモデルなどを集めて配置し、それをVCIにするために使用
* UnityHub：unityのバージョンを切り替えたりできるようにするソフト。入れておけばunityを別途インストールする必要はなくなります。
* seedOnline(サイト)：VCIやアバターなどを各種VRサービスと連携するためのサービス。作成したVCIはここにアップロードする。
VCI作成をすすめていくと他にもいろいろなソフトなどをつかいますが、そちらは出てきた際に都度紹介します

# セットアップ
基本的には以下のサイトに則って行えば問題ないかと思います。

1. [\[ガイド\]初めてVCIを作成する](https://virtualcast.jp/wiki/doku.php?id=vci:guide:beginner)
  
以下、手順を進めル際に気になった部分だけ以下に記載します.

* UnityHubでプロジェクトを作成する前に認証が必要
* UnityHubからインストールするUnityのバージョンは2019のもので大丈夫(記事作成時点)
* インポートするUniVCIのバージョンは3.0以上のもの
* プロジェクト作成後にランタイムを.Net4に変更するとの記載があるが、該当の項目がなかったため作業をスキップ
* 作成したVCIをseedにアップロードする際に「ロケーション」を選択する

#RoomにVCI背景を反映
#### Roomを作成する(ブラウザでの作業)
1. https://virtualcast.jp/ の右上のメニューからルーム一覧ページへ遷移
2. 遷移後のページから右上のCONNECTを選択
    この作業でSeedOnlineのアカウントと連携されます

1. ログイン後に右上にアイコンが表示されるので、そこからマイルームを選択
2. ルームを新規作成する
    下に色々権限設定がありますがとりあえずデフォルトの設定のままで大丈夫です（あとあと説明予定です）

#### Roomに作成した背景を反映する
以下の公式の手順で背景を切り替えます。(作業前にVキャスのアプリの右上からSeed連携する必要があります)
　・[ルームのロケーションの変更方法](https://virtualcast.jp/wiki/doku.php?id=virtualcast:room:bgchange)

不要なアイテムが残っていますが、これは後で削除します。

#おわりに
今日はまずルームの設定までやりました。
明日からは実際にテーマパークを作成していきます
C++のcv::FileStorageで出力したXMLファイルをPythonのOpenCVで読み込む

# はじめに
C++のOpenCVでキャリブレーションした結果を、[XMLファイルとして出力しました。](https://qiita.com/noueezy/items/4d719ba9935b3a989315)
そのファイルをPythonで使いたかったのですが、C++とPythonではcv::FileStorageの読み込みの勝手が違かったので、備忘録として書いておきます。

# 読み込むファイル
次のような、C++のOpenCVで出力したファイルがあったとします。

```xml:omnidirectionalCalibrate.xml
<?xml version="1.0"?>
<opencv_storage>
<RMS>3.2860994656014744e+00</RMS>
<K type_id="opencv-matrix">
  <rows>3</rows>
  <cols>3</cols>
  <dt>d</dt>
  <data>
    1.0891482187714628e+03 3.4148746667908486e-01 1.6082218600862714e+03
    0. 1.0872430597310340e+03 1.2048174008443893e+03 0. 0. 1.</data></K>
<Xi type_id="opencv-matrix">
  <rows>1</rows>
  <cols>1</cols>
  <dt>d</dt>
  <data>
    5.9766312514988507e-01</data></Xi>
<D type_id="opencv-matrix">
  <rows>1</rows>
  <cols>4</cols>
  <dt>d</dt>
  <data>
    -2.1131777151998019e-01 2.6371490472846541e-02
    -7.7007784809701241e-04 2.6734126945072976e-03</data></D>
</opencv_storage>
```

# 読み込みサンプルコード
```python:sample.py
import cv2
import numpy as np

xmlpath = 'omnidirectionalCalibrate.xml'
fs = cv2.FileStorage(xmlpath, cv2.FileStorage_READ)
K = fs.getNode('K').mat()
D = fs.getNode('D').mat()
Xi = fs.getNode('Xi').mat()
RMS = fs.getNode('RMS').real()

print(K)
print(D)
print(Xi)
print(RMS)
```

FileStorageで読み込んだあと、getNodeで各タグの要素にアクセスします。
RMSのようにタグに囲まれただけの値はreal()で、他のK、D、Xiのようにtype_id = opencv-matrixがついている行列はmat()で値を取得します。

出力結果

```
[[1.08914822e+03 3.41487467e-01 1.60822186e+03]
 [0.00000000e+00 1.08724306e+03 1.20481740e+03]
 [0.00000000e+00 0.00000000e+00 1.00000000e+00]]
[[-0.21131777  0.02637149 -0.00077008  0.00267341]]
[[0.59766313]]
3.2860994656014744
```

以上です。
Firebase Cloud Firestore セキュリティルール設定まとめ ＠随時更新

#Authと一緒に使う（Auth.uid）
#`match`と`allow`
##`match`
どのドキュメントとコレクションに対してルールを適用するかの範囲
ドキュメントに対して`match`は1つのみしか使用不可
##`allow`
オペレーションに対してどのようなアクセス制御を行うかの条件式
#オペレーション
##write
- create : ドキュメントの作成
- update : ドキュメントの更新
- delete : ドキュメンの削除

##read
- get : 単一ドキュメントの取得
- list : クエリとコレクションの取得

##許可する範囲は小さくする
`write`は`read`使用せずに、それぞれ別で記述する
##オペレションは許可制
#カスケードしない
下層にルールは適用さてない
#ドキュメントへのルールは、基本的にワイルドカードで指定する
ドキュメントIDの指定も可能ではある
#カスタム関数を定義できる

```javascript
fun 関数名() {
    // 処理
    return
}
```
引数の型は不要で引数名のみで良い
引数は0個以上7個まで、`return`は必須
関数内の処理は`let`から、関数の定義は10個まで

```javascript
fun 関数名(0個以上7個まで) {
    let 変数名 // 10個まで
    return // 必須
}
```
##関数はステートメント内に書かなくて良い
同じ関数名の場合、ネスタした`match`ステートメント内の関数が有線されて呼び出しされる
トップレベルにも定義可能で、全範囲で呼び出しできる
#`resource`と`request.resource`
- `resource`
    - `resource`は要求されたドキュメントを参照
    - `resource.data`はドキュメントのフィールドを`map`で返す
- `request.resource`
    - 変更後のデータにバリデーションを掛ける場合に使用
    - 整合性を保つデータの際に使用（値の変わらないフィールド）
    - リクエストが処理された後（DBに更新される前）のデータを示す

#三項演算子を使用できる
#`in`と`is`
特殊なオペレーターが使用可能
##`in`
a in b : bの配列にaがあるか
##`is`
a is int : aがint型かどうか
#基本的に下層の`match`ステートメントにはカスケードされない
一括で下層の`match`ステートメントに適応したい！
→再帰ワイルドカード構文`{document=**}`を使用する
match users/{user}
match users/{document=**}
#ルールの競合
再帰ワイルドカード構文`{document=**}`使用した場合に発生し得る
競合したルールは、AND評価ではなくOR評価される
#`{allChildren=**}`
再帰ワイルドカード`{document=**}`の下層に異なるセキュリティルールを適用したい場合に使用する
例えば、Aというルールの下層の`match`ステートメントにはBというルールを適用する
#コレクショングループに対する`match`ステートメント
version=2 の場合のみ、コレクショングループに対してセキュリティルールが書ける
match /{paths=**}/users/{ワイルドカード名} のような場合
teams/{}/users/ や　products/{}/users 等に対してルールが適用される
#アクセス制御
以下のよにアクセス制御を意識する
- だれが所有者なのか
- だれが見ることができるのか（read）
- だれが書き込みできるのか（write）
#値の妥当性
書き込む値が妥当かどうかのバリデーションをかける
もちろん、サービス側でもバリデーションは必要（2重チェックさせる）
ansibleでml用のpythonでgpuを利用できる環境を自動設定する

# ansibleでml用のpythonでgpuを利用できる環境を自動設定する

下記で公開。
https://github.com/notfolder/ml-ansible

下記で環境を構築します。
```terminal
$ ansible-playbook -i investory playbook.yml
```

ubuntu 18.04を想定し、下記環境を構築します。

- pyenvをansible_userに設定
- nvidia/cuda:11.1-cudnn8-devel-ubuntu18.04とほぼ同じセットアップでnvidiaドライバ環境構築
- nvidia-doker2環境を構築

## nvidiaのdokcerイメージと同じ環境を作る方法

下記の様に目的のイメージハッシュのページを開くと、```IMAGE LAYERS```ごとにコマンドを確認できる。
これをansible化しただけ。
https://hub.docker.com/layers/nvidia/cuda/11.1-cudnn8-devel-ubuntu18.04/images/sha256-c5bf5c984998cc18a3f3a741c2bd7187ed860dc6d993b6fb402d0effb9fe6579?context=explore
うんこちんこゲームを作ったよ

「クソアプリ2 Advent Calendar 2020」、12月2日参加作品です。
https://qiita.com/advent-calendar/2020/kuso-app2

**うんこちんこゲーム**を作成いたしました。
https://unkochinkogame.nankakaku.com/

# 概要

### タイトル画面

![S__37003266.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/9e619c67-3d27-2f45-a309-f04849b9e2a6.jpeg)
タイトル画面です。背景のうんこちゃんたちはアニメーションします。可愛いですね。
お上品ではないサウンドが流れますので、会議中などではサウンドオフにすることをオススメします。

### ゲーム画面

![S__37003269.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/693ba463-f120-526a-209d-81fbe910b55e.jpeg)
ゲームの内容はシンプルで、3文字目に入る文字を選んでいきます。
意外と結構難しいですが、何回かやってるとコツを掴めてくるのでぜひリトライしてください。

### シェア機能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471221/6dbe5c4b-ffb0-6acf-7b0b-74e4c09257cd.png)
Twitterへのシェア機能も備えております。ぜひみんなに自慢してね。


# 音声再生について

開発当初はaudioタグを使用していましたが、iOSのSafariでは音声を重ねて再生できないなど、動作に難がありました。
そのため、[howler.js](https://howlerjs.com/)を使用しました。
使い方はとても簡単。CDNでjsをロードし、JavaScriptで音声ファイルを読み込んで再生させるだけです。

```html:index.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/howler/2.2.1/howler.min.js"></script> 
```

```JavaScript:unko.js
seYeah = new Howl({
    src: [
        '/se/yeah.mp3'
    ]
});
seYeah.play();
```

# 最後に

この場を借りて、制作・発表の機会の機会を設けていただいたあんどさん（@ampersand）に感謝申し上げます。
自分の好きなゲームを作れてとても楽しかったです。ありがとうございました！

よければ、私のTwitter（[@SanjiMonica](https://twitter.com/SanjiMonica)）もフォローしてください！
たくさんの方に遊んでもらえると嬉しいです！

それでは、明日以降のみなさんの投稿も楽しみにしております！
condaコマンドでCondaHTTPEエラーが出るのはproxy設定を追加で行えば解決するかも？

#この記事は・・・
Anacondaで```conda update --all```や、モジュールのインストールを実行するときに、通信エラーが発生しました。
結構困っている方も多いのではないかと思い、対処法について記録します。

#環境
Windows10
Anaconda3（2020.03）
勤務先の社内ネットワークから

#エラー内容
前述の通り以下のようなエラーが出ます。

```
(base) C:\Users\user>conda update --all
Collecting package metadata (current_repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.

If your current network has https://www.anaconda.com blocked, please file
a support request with your network engineering team.

'https://repo.anaconda.com/pkgs/main/win-64'
```
AnacondaパッケージのURLへの接続エラーのようです。
「メッセージの下の方にはネットワークエンジニアのチームにサポートを依頼してください」と記載もあります。親切なのか何なのか・・



#対処法
色々と調べたところ、```.condarc```というファイルを作って、プロキシの設定を記載する必要がありそうです。
インストールしたらAnaconda3のルートディレクトリにデフォルトで作成されるらしいのですが、私の環境では作成されていませんでした。

ルートディレクトリは、インストール時に使用可能とするユーザーを選択するが、それによって場所が変わります。
特に変更していない場合は以下の場所だと思われます。
・インストール時に「All Users」を選択した場合
```C:\ProgramData\Anaconda3```

・インストール時に「自分だけ」を選択した場合
```C:\Users\[ユーザー]\Anaconda3```

また、```.condarc```は拡張子だけのファイルなので、直接作成しようとするとシステムからエラー出るかもしれません。
適当に```a.txt```を作成してから、コマンドプロンプトで```ren a.txt .condarc```を実行します。
これで```.condarc```が作れました。

#.condarcの記載内容

問題のファイル、```.condarc```には以下を記載しました。

```
Ssl_verify: false
channels:
  - defaults
proxy_servers:
    http: http://[ユーザ名]@[ホスト名]:[ポート番号]
    https: http://[ユーザ名]@[ホスト名]:[ポート番号]
```

ここのホスト名やポート番号は組織のネットワーク管理者に問い合わせるのが一番早いです。
私も問い合わせたらすぐに教えてくれました。
これで解決です。

さすが情報システム部。いつもお世話になっています。

##参考にした記事とか
https://qiita.com/penguinz222/items/6efa624e763e5308b10e
https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#ssl-verification-ssl-verify
【就労移行支援事業所でITを学ぶ】カレンダー作成の趣旨について

#はじめに
この度、Qiita Advent Calendar 2020に参加したいと思い右も左も分からぬままカレンダーを作成しました。
記事の投稿自体が初めてなので、まだMarkdown記法の基本的なことも分かっていませんが精一杯頑張りたいと思います。
どうぞよろしくお願いいたします。
（アドベントカレンダーに紐づけた投稿記事を後日修正することはルール違反じゃないですよね…？）

###書いている人について
・発達障害：ADHD【注意欠陥・多動性障害】当事者
・現在34歳
・ITエンジニア（Web制作・フロントエンド志向）を目指し始めたのは昨年9月から
・以前は大手通信系企業のコールセンターで電話営業の職に就いていた
・これまでに学んだこと：HTML5/CSS, JavaScript, Ruby(Rails), Vue.js (それぞれ少しづつ)



##このカレンダーを作成しようと思った動機・趣旨

ITエンジニアになるには多くの学習時間が必要と言われているのは皆さんもご存じの通りであると思いますが、障害者手帳を取得した人が退職等で職を失うと（前職の勤務年数等にもよりますが）最大300日（10ヶ月₊α）の失業給付を受けられる期間が発生することがあります。通常の方が自己都合による退職等で職を失った場合は90日（3ヶ月）であることを踏まえると、かなりの長期間に渡って働かずに生活出来る時間を得られるため、この期間を上手くIT技術・知識の修得に当てれば、障害のために一般企業で『普通に』働くことが難しい障害当事者が、ITを学び人生を新たな軌道に載せる事も決して夢ではありません。
実際にそうした経験を持つ方や、現在IT系の業種へ再就職を目指している方の知識の集約の場になればと思い、このカレンダーを作成しました。


##就労移行支援事業所とは
・身体障害・精神障害（発達障害含む）当事者（障害者手帳の交付を受けた人）が、社会復帰や長期の安定就労を目指し職業訓練や生活訓練、就職に必要なスキル修得・資格取得のための自学自習を（生活支援員・就労支援員の指導の元で）行う場所
福祉サービスの一環であり、利用には自己負担が発生する場合もあるが基本的には低額もしくは無料で利用できる（社会福祉事業者による事前の計画支援相談とサービスの受給申請が必要）
通常、軽作業や一般企業での社会人マナー、データ入力や事務作業などの職業訓練を行う支援事業所が中心的であったが、近年ITスキルを学ぶことのできる支援事業所が増えている
TypeScript導入済みのミニマムなNext.jsのテンプレートを作った

レッドインパルスのたかけんです。
REDIMPULZ Advent Calendar 2020 の2日目のエントリーです。

## ReactとNext.jsの解説動画

弊社のYouTubeチャンネルでは、ReactとNext.jsの解説動画を公開しています。

<a href="https://www.youtube.com/playlist?list=PLGqNraLKYNVdJgHZfey5c2pEw6_z8mIto" target="_blank">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71453/27c7d108-62c7-019d-3a26-d96a4067df83.jpeg" width="700" />
</a>

https://www.youtube.com/playlist?list=PLGqNraLKYNVdJgHZfey5c2pEw6_z8mIto

動画では、Next.jsの公式のチュートリアルをベースに解説をしています。
また型情報についても解説した方が理解が深まると思い、TypeScriptを導入しています。

しかし、公式のチュートリアル手順で作成されたプロジェクトにTypeScriptやESLint等のツールを導入するのが若干手間なので、設定を加えたNext.jsのテンプレートを作成しました。

今回は、その作成したテンプレートの紹介になります。

## [nextjs-typescript-starter](https://github.com/redimpulz/nextjs-typescript-starter)

### 導入済みの設定

* TypeScript
* ESlint
* Prettier
* VScode Extentions

TypeScriptの設定以外に、ESlintやPrettier、VScodeの拡張機能の設定も入れています。
テンプレートからプロジェクトを作成し、VScodeで開けば、TypeScriptやESlintで快適に開発できるようになっています。

### 注意点

元々の公式のテンプレートにあまり手を加えていないシンプルな設定になっています。
これらの設定に加えて、haskyやjestなどが導入されているテンプレートからプロジェクトを作成したい方は、他に有志の方が公開しているテンプレートがあるので、そちらの利用も検討してみてください。

#### 参考

* https://github.com/lightsound/nexst

## テンプレートの使い方

Next.jsの公式のチュートリアルと同じように使えます。
以下、create-next-appでプロジェクトを作成し、開発サーバーを起動する手順です。


```bash
$ npx create-next-app app --example "https://github.com/redimpulz/nextjs-typescript-starter"
$ cd app
$ yarn dev
```


## まとめ

TypeScript導入済みのシンプルなNext.jsのスターターテンプレートを紹介しました。

設定の記述量も最低限にしているので、分かりやすいかと思います。
TypeScriptでNext.jsのチュートリアルをやりたい人などは、ぜひ使ってみてください！
30代からのプログラミング勉強　7日目【Udemyコース/Ruby on Rails】

本日は比較的短めのコース視聴を実施。
分からないなりにはなりますが、コースレビューの様なものを書いていきます。

##学習内容

####【3日でできる】はじめての Ruby on Rails 4 入門（Rubyから学べる）

今回はこちらのUdemyコースを視聴。
率直な感想としては「自分にはまだ早かったけど見る価値はあった」です。


1から10まで丁寧に、というよりはwebアプリケーションが出来るまでの流れを簡単な解説を挟みつつ見ていくといった印象でした。


またRuby、Railsの導入についてはターミナルへの入力を真似していけばいいだけなので分かりやすいですが、動画内で解説されているバージョンは最新のものではないので注意が必要かもしれません。


説明は
「○○という記述には××という効果があり、例えばこんな時に使います」
ではなく
「××したいので○○と書きます」
というものが多く完全に知識がない状態だと聞き慣れない単語も多かったので、ある程度勉強した後に見るといいかもしれません。


##所感
はじめての、とはありますが説明少なめでサクサク進んでいく感じの講座なので（フォーラムで質問しながらやる様説明はありますが）、個人的には超入門編を完了後にもう一度流れを見て復習する為に活用したいなと思いました。


ただ、Webアプリケーションがどんどん出来上がっていく様を見るのは面白かったので、あまり理解は出来なくともプログラミングってこんな感じで組み上げられていくんだなぁ〜って言うのをサラッと流し見していくのも最初の一歩としてはアリなのではないでしょうか。
RDSでの1⇄NチャットアプリDB設計

# 目的
ユーザと店舗とのチャットアプリを実現するDB設計を行います。

1対1のメッセージアプリではなく、以下のような**1対Nの特徴があるチャットアプリ**を考えたいと思います。

![スクリーンショット 2020-12-02 0.18.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/c906bccb-8a4b-90fb-83d7-c0223c3ce8a1.png)


ユーザーは商品を通した店舗ごとにメッセージをやりとりすることができ、店舗は商品ごとに別れたチャットでユーザーとやりとりができます。
なお、ここでは全てRDS上で完結する構成で考えます。

# ER図の作成
## 登場人物を考える
ユーザと店舗とのチャットアプリを考える上で、最低限、必要な登場人物は以下になりそうです。

- 店舗
- ユーザー

### 店舗
ここでは、名前, アイコン を持たせます。
**▼shops（店舗テーブル）**
![スクリーンショット 2020-12-01 23.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/0d8b3ccd-a0c0-7fde-dafe-a94ef788d763.png)


### ユーザー
同様に、名前, アイコン を持たせます。
**▼users（ユーザーテーブル）**
![スクリーンショット 2020-12-01 23.34.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/27ffdbfb-db87-630f-b805-47ad95785474.png)


## 他に必要なEntityを考える
チャットアプリというからには、メッセージとトークルームも必要そうです。
そして、今回は「商品ごとに説明を聞ける部屋」があるため、商品も必要になります。

- 商品
- メッセージ
- トークルーム

### 商品
商品名, 画像, 店舗ID があれば良さそうです。
**▼items（商品テーブル）**
![スクリーンショット 2020-12-01 23.36.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/c6e06df3-3128-46b5-2dcc-372314b82fd9.png)


### メッセージ
チャットを通じてやりとりを行うメッセージです。
「誰が誰に送信したか」「どの部屋で、どの商品についてのやりとりか」が必要になるため、以下のようなカラムが必要になりそうです。

- ユーザーID, 商品ID, 店舗ID. 部屋ID, メッセージ本文, 送信元, 送信先

ここで送信元/送信先に注目すると、今回は店舗とユーザーのチャットアプリなので、ユーザー同士・店舗同士のチャットは不要そうです。
あえてカラムを2つにする理由もないため、**送信元/送信先は番号（1:ユーザー, 2:店舗）**で持たせます。

**▼messages（メッセージテーブル）**
![スクリーンショット 2020-12-01 23.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/a8a9d192-7fa4-bada-1fe1-9bc1aaf2ae78.png)

### 部屋
部屋名, 商品ID, ユーザーIDが必要になりますが、
**「店舗は、個別の商品ごとにユーザーとやりとり」を行える必要がある**ため、「**ユーザーが利用する部屋**」と、「**店舗が利用する部屋**」とで異なるEntityを作成したいと思います。

また、ここではLINEのように**メッセージごとの状態を持たせ**、 **既読/未読/返信済 のステータス**を持つものとして考えます。
ステータスはメッセージごとに存在するため、一見メッセージに持たせようと考えましたが、**実運用としてトークルームごとの最新メッセージに状態があれば良い**ため、チャットルームごとに持たせる設計としました。

**▼rooms（ユーザー視点のチャットルームテーブル）**
![スクリーンショット 2020-12-01 23.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/06aba2d9-e55a-a6e2-39df-ade6041f7394.png)

**▼shop_room（店舗視点のチャットルームテーブル）**
![スクリーンショット 2020-12-01 23.44.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/b9c88139-d995-5571-d2e2-ac1b30ba9b93.png)

# ER図
最後に、これらをまとめると以下のような設計となります。
![スクリーンショット 2020-12-01 23.45.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191919/681a2b5c-7d74-2055-7aaf-a8303a1a15fb.png)

以上、1対Nの特徴があるチャットアプリでのDB設計についてでした。

ユースケースとしてユーザーと店舗での利用の仕方はどうなるかを考えつつ作成したため、こうした方が良い等あれば是非コメント頂けると嬉しいです。
そもそも、メッセージ自体RDSに保存させるのは負荷になるという点も懸念ではあるため、合わせてご指摘頂けると幸いです。
google-research の vision_transformer を動かすdockerイメージを作成した件

# google-research の vision_transformer を動かすdockerイメージを作成した

なぜ：
google-research の vision_transformerを動かすのにjaxが必要だが、gpu対応のjaxバイナリが提供されておらず、ビルドが必要かつ、ビルドにものすごい時間がかかったため、vision_transformerを動かすためのdockerイメージを作成した。

https://hub.docker.com/r/notfolder/vision_transformer

下記でvision_transformerを実行できる

``` terminal
$ docker run --name vision_transformer --gpus all notfolder/vision_transformer --help
```

ウチのGTX2070だとメモリが8GBしかないので下記コマンドでやっとこさ動く。

``` terminal
docker run --name vision_transformer --gpus all -v /home/notfolder/work/:/work notfolder/vision_transformer --name ViT-B_16-cifar100_`date +%F_%H%M%S` --model ViT-B_16 --logdir /work/vit_logs --output /work/vit_output/ViT-B_16-cifar100_`date +%F_%H%M%S` --total_steps=10000  --warmup_steps 100 --dataset cifar100 --accum_steps=1 --batch 4 --batch_eval 128
```

このdockerイメージをビルドするためのリポジトリが下記。
直接作るとビルドのためのいろいろなモジュールが入って大きくなりすぎるため、
一旦jaxlibのビルド環境を作り、その上でいったん```jaxlib-0.1.58-cp36-none-manylinux2010_x86_64.whl```を作ってそれを使ってdockerコンテナをビルドする。
https://github.com/notfolder/vision_transformer-docker

pretrainデータを自動ダウンロードする機能付きentorypointも作りました。
Visual Basic 2020年の振り返り

# はじめに
これは、[Visual Basic Advent Calendar 2020](https://qiita.com/advent-calendar/2020/vb)の1日目の記事となります。
この記事は私のQiitaでの200記事目になります。

# 2020年の出来事
## 良かったこと
今年は 2020年11月10日に「.NET 5」を正式リリースしました。これにより Visual Basicで「.NET 5」でサポートされるようになりました。
Microsoft Visual Studio Community 2019 Version 16.8.1 で確認するとプロジェクトテンプレートに「Windows Forms App(.NET)」があります。

![VBorCsharpIDEテンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/58c8c915-5765-4106-3df3-e21f8722c8f8.png)

Microsoftの「The Visual Basic Team」のブログでは、2020年3月11日に久しぶりに更新がありました。ただこれ以降の更新はありません。
https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/

## 有志の踏ん張り
C# 9.0ではレコード型、パターン連結子('is not null' や 'is >= 10 and <= 20'）が追加されています。
[Visual Basicで「.NET 5.0 で使える C# 9.0の新機能」について調べてみた](https://qiita.com/tfukumori/items/3c7a3bd02271b0c0ddd4)

Visual Basicの言語仕様に関する議論はここで行われています。
https://github.com/dotnet/vblang/issues

直近では、Visual Basicでレコード型を実装する試みがされています。
[I hate C# records. Please don't ever bring them to VB!](https://github.com/dotnet/vblang/issues/584)

## 悪かったこと
### WPF対応
プロジェクトテンプレートに「WPF App (.NET)」がありませんでした。C#にはあるんですがね。
WPFのVBはサポート予定だったと思ったのですが、今回は間に合わなかったのか、サポート対象から外したかですね。

【2020/12/5追記】
この件については、@tfukumoriさんからコメントを頂いているので、コメントを見てください。

### 言語として進化は中止
>Visual Basicを使用する主な利点の1つは、言語が非常に長い間安定していることです。Visual Basicを使用している多くのプログラマーは、その安定性と記述スタイルが重要であることを示しています。今後、Visual Basicを言語として進化させる予定はありません。
[Visual Basic support planned for .NET 5.0](https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/)

.NET 5.0以降もVisual Basicのサポートはされるのですが、Visual Basicの言語として進化はやめてしまうようです。
[Visual Basic .NET 5 blog post #497](https://github.com/dotnet/vblang/issues/497)

[【.NET】Microsoft、Visual Basicの進化やめるってよ](https://qiita.com/yaju/items/4d8c64c3cb075e619ce9)

### 自然言語処理NLSバージョンアップによる影響
Windows 10 バージョン 2004 で、OS の自然言語処理を担う NLS (National Language Support) バージョンが6.3に更新されたことにVisualBasicではStrConv関数などが影響を受けています。
[【Visual Basic】Windows 10 ver 2004(20H1)/20H2以降の日本語固有不具合について](https://qiita.com/yaju/items/2df7114da828e45fceac)

これにともない合字データ (㋿ や ㍻) のソート順も変更されていますので、VBにかかわらずC#でも影響はあります。

|OS バージョン|合字の昇順例|
|:--|:--|
|1909|㋿ ㍻ ㍾ ㍼|
|2004 (20H1) / 20H2|㍾ ㍼ ㍻ ㋿|


# 来年は30周年を迎える
2021年05月20日は、Visual Basicの30周年となります。
1991年にVB 1.0がリリースされました。ただ日本では発売されませんでした。

25周年の記事
https://devblogs.microsoft.com/dotnet/happy-25th-birthday-vb/
https://developers.srad.jp/story/16/05/21/1943233/

# 最後に
残念なのは.NETでも「今後、Visual Basicを言語として進化させる予定はありません。」って公式に宣言されたことです。
もっとも、VBAは二十数年近く何の改善もされなてないですから。でも、.NETの場合は有志の方が頑張れば、機能は追加できるんです。

来年は、Visual Basicの30周年ですし、.NET 6もリリースされるので、みなさん頑張りましょう。
Power Platform デザインパターン 観測する系


Power Platform で仕組みを作成するにあたり「自分だったらこうするかなー」というパターン、皆さん持っていませんか？そんな「自分だったらこういう設計にする！」という、所謂「デザインパターン」みたいなモノを記録しておこうかと思ったのでチャレンジする企画です。今回は「定期的に特定対象の状況を観測する」という要件に対するアプローチです。

当記事は [Microsoft Power Apps Advent Calendar 2020](https://qiita.com/advent-calendar/2020/powerapps) に参加しています。

# ユーズケース
「定期的に特定対象の状況を観測する」とは？？？

例えば、サーバーの死活監視。特定の間隔、仮に5分毎としたら、5分毎に対象のサーバーから応答があるか？をチェックする、といったようなパターンです。

とは言え、優秀な死活監視ソリューションみたいなものは世の中に存在していますので、Power Platform でわざわざ作る必要もありません。もっと身近な例で考えると・・・。例えば、会議室の空き状況を一目で確認できる「会議室の利用状況アプリ」等でしょうかね。5分間隔で、指定した会議室が「今空いてるか？」を Exchange Online の予約状況から把握する、みたいなアプリはいかがでしょう。

# アーキテクチャ
「当方だったらどうするか？」です。

まず、会議室の状況をパッと観て把握したい、と考えると画面は Power Apps で提供するのが良さそうです。（実は Power BI でも良いのですが Direct Query の説明がアレなので割愛！）

次に「5分間隔で会議室の空き状況を調べる」にはどうするか？です。直接、Power Apps のアプリからタイマーでデータ取得することも可能です。しかし、その場合は、下記のようなコトに苦労すると想定されます。

- 画面遷移をともなった場合のタイマー処理
- 取得したデータの管理（いちいち Collection 管理？めんどくさい…）
- Web API でしか取得できない対象に対するアプローチ（カスタムコネクター作るの？）

ちょっとメンドクサイ感じがしますね。カスタムコネクターとか、あんまり作りたくないです。とは言え、画面が Power Apps である以上、どこかのデータソースなりからデータを読み出す必要があります。

残念ながら Exchange Online の会議室メールボックスが保持している予定は、Power Apps、Power Automate ともにアクションで取得することが記事投稿時点ではできません。「会議室の予定を取得する」というステキなアクションは提供されていないのです。残念。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/e1177a39-7621-8784-8436-aee7f292dfe4.png)
前置きが長くなりましたが、状況を把握する箇所は、Power Automate を利用します。そして、会議室の状況（予定）を取得するには Graph API を利用します。つまり、HTTPアクション ＝ Premium コネクターを利用せざるをえません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/995e1f35-a33a-d417-fae4-855b2d80ebb5.png)
上イメージで、定期的に情報を取得している箇所が Graph API になります。定期的に情報を取得してデータソースへ格納。画面（アプリ）は、そのデータソースから情報を取得するように当方は考えます。

# フローがわかれている理由（補足）
Power Automate を実行するユーザーが限定できるから、です。1つ、フロー実行用のユーザーが存在すれば問題ありませんよね。つまり、Premiumコネクター ＝ 有償ライセンスの購入範囲も限定することができるのです。

勿論、Premiumコネクター（HTTP）を利用せずに利用できる対象（例えば SPO 等）であれば有償ライセンスは不要です。


Graph API で予定データを取得する手順は [りなたむサン](https://twitter.com/R_t_A_n_M) の下記の記事が参考になると思います。

■参考URL
　[Microsoft Graph を使って、会議室の予定表を取得する](https://qiita.com/rnakamuramartiny/items/8556bbc3f3b54fe3ea65) 


# まとめ
設計＝アーキテクチャを練ることで、

- 仕組みが”シンプル”になる
- ランニングコストも限定（＝極小化）できる
- シンプル ＝ 拡張も容易（なハズ

と、嬉しいコトばかりになります。

「システム開発」や「アプリ作成」という単語になると、何でもかんでも１つのシステム、アプリで完結させようとする方がいますが、それは多くの場合は間違いだと個人的に考えています。巨大で冗長なシステム・仕組みは誰も幸せにせず、悲しみしかもたらしません。

『小さくて鋭いツール』で生産性をUpして、楽して業務をたのしみましょう。

それでは、皆さま、素晴らしい Power Platform Life を！
【Ruby on Rails初心者向け】ログインユーザーの最新投稿を取得する方法

本のレビューアプリ作成中、ログインユーザーの最新投稿を取得する方法が複数あったので、それぞれの簡単な使い方と違いについて備忘録としてまとめました。

## 【前提】
- rails_6.0.0_
- mysql2
- gem 'devise'を使用してログイン機能を実装済み


## 【目的】
- current_userの最新投稿を取得すること
- ビューで最終投稿日時を表示すること



## 【結論】 ： current_userに紐づく投稿を配列取得し、「.last」で取り出す


```contoroller.rb

@last_review = Review.where(user_id: current_user.id).last
```
whereメソッドでcurrent_userに関連する投稿を取得して、lastメソッドで最後の投稿のみを切り出します。


```html.erb
<%= @last_review.created_at %>
```
コントローラーで定義したインスタンス変数@last_reviewに対して、created_atカラムの情報を表示させます。


正直、自分が考えうる方法ではこの方法が最も記述が少なく、処理も早いので、今後これ以外使うことはなさそうです。
それでは、時系列順にこの結論に至った経緯を記載します。（１〜３まで）

### １ : 配列のまま取得して、eachで１周だけ回す

はじめに思いついたのがこの方法です。


```controller.rb
@last_reviews = Review.where(user_id: current_user.id).order(created_at: :desc).limit(1)
```


whereメソッドで投稿者がcurrent_userである投稿を配列で取得
.order(created_at: :desc)の部分で降順(新しい順)に並べ替え
.limit(1)で配列の先頭１つに限定
という流れです。

```html.erb
<% @last_reviews.each do |last-review| %>
　<%= last_review.created_at %>
<% end %>
```
取得した配列をeachで一覧表示します。今回は中身が一つだけなので、一回の繰り返しです。


.limit(1)で最新の投稿を取得するこの方法だと、配列ごと取得する形になるので、ビューファイルでeach文を使う必要があります。
最新の投稿5件を表示させたい時などはこの方法を使う事になりそうですが、今回は1件だけなので正直、長い＆読みにくいと感じました。

### 2 : .sliceを使用して、配列から投稿を１つだけ切り取る
```controller.rb
@last_review = Review.where(user_id: current_user.id).order(created_at: :desc).slice(0)
```
先ほどの.limit(1)の部分を.slice(0)に変更して、配列から先頭の1要素を切り出します。
配列ではなく最新の投稿情報のみをインスタンス変数に定義しており、これならばeach文を用いる事なく投稿情報をビューファイルに表示する事ができます。

```html.erb
<%= @last_review.created_at %>
```
先ほどよりはスッキリしましたが、「引数に、切り出す配列の要素の番号や範囲を指定する」というsliceの性質上、配列の中身を降順に並べ替える必要があります。

### 3 : .lastを使用して、配列の末尾の要素を取り出す
```controller.rb
@last_review = Review.where(user_id: current_user.id).last 
```
.lastを用いる事で配列の末尾の要素のみを取り出す事ができます。
.slice(0)との違いとして、要素の範囲指定をしないので降順に並べ替えるが必要がなく、より短い＆読みやすい記述になります。
(先頭の要素を取り出したい場合は.firstを使用します）

```html.erb
<%= @last_review.created_at %>
```
ビューファイルは先ほどと同じです。

##【まとめ】

ログインユーザーの最新投稿を取得して表示させる方法を３つご紹介しました。
1. 配列のまま取得して、eachで１周だけ回す
2. sliceを使用して、配列から投稿を１つだけ切り取る
3. lastを使用して、配列の末尾の要素を取り出す

今回は最新投稿の1件以外は不要、且つ、並べ替えの記述を省くために、最後に紹介した.lastを採用しました。(私が思いつかなかっただけで他にも方法は様々あると思います... )

## 【最後に】
個人的な感想ですが、いろいろなやり方がある中でも自分なりに最適な方法を選ぶ過程はプログラミングの楽しみの一つだなと実感しました。今後も、何か発見できたらその都度アウトプットしていきたいと思っています。

ここまでお付き合いいただき、ありがとうございました。
don't use underscores in Go names;の簡易的な対処法(初学者向け)

# はじめに
Goを最近勉強していて変数宣言で"don't use underscores in Go names"が出たのでメモ書き。


# 事象
bool型の変数を定義して、結果と型を出力させるという簡単なコードです。

```Go
package main

import (
	"fmt"
	"reflect"
)

func main() {
	a := 1
	b := 5
	var num_bool bool = a > b //ここに　"don't use underscores in Go names;"が出てる

	fmt.Println(num_bool)
	fmt.Println(reflect.TypeOf(num_bool))
}
```
そのままでも以下のようにビルドは通りますが何か気持ちが悪いので対処します。

```
PS C:\pg\Go\study> go build main.go
PS C:\pg\Go\study> ./main
false
bool
```


# 対処
don't use underscores in Go names;
雑に和訳すると、"名前にアンダーバー入れないでね"って言われてますね、
つまり、`num_bool` を `numBool` にしてやればいいですね。

```Go
package main

import (
	"fmt"
	"reflect"
)

func main() {
	a := 1
	b := 5
	var numBool bool = a > b

	fmt.Println(numBool)
	fmt.Println(reflect.TypeOf(numBool))
}
```
以上

# 最後に
変数の命名はスネークケースって手癖になってたので、この辺は言語ごとに慣れていきたいなーと感じたこの頃。