OmniAICreator/Qiita-1.07M huggingface dataset:
Exam AI-900: Microsoft Azure AI Fundamentalsベータ試験の受験記録

####AI-900受験の動機
業務中に、AZ-900: Microsoft Azure Fundamentalsのオンライン研修を受講させていただきました。休憩時間にAZ-900の合格体験記を読んだり、[Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/)を少し進めていたところ、あるサイトを見つけました。

Microsoft Learn Blog > [Show off your AI and machine learning skills with exam AI-900](https://techcommunity.microsoft.com/t5/microsoft-learn-blog/show-off-your-ai-and-machine-learning-skills-with-exam-ai-900/ba-p/1469420#.XyQ6GJJh71k.twitter)

>The first 300 people who take exam AI-900 (beta) on or before August 7, 2020, can get 80% off market price!
2020年8月7日までにAI-900（ベータ版）を受験した最初の300人は、市場価格から80％オフになります！

[【合格体験記】Azure AI Engineer Associate になりました！](https://qiita.com/torisankanasan/items/55a51993d2959f7cad1f)を拝見していて、「AzureにはAIの資格があるんだ」とは知っていたのですが、雲の上の話だなとは正直感じていました。

しかし、ベータ試験で受験料が安いし、これも何かの縁だと思い、AZ-900はまだ合格していないのに深夜テンションでAI-900の申し込みを済ませました。
(AZ-900はバウチャーコードが届いたら、受験します)

<img width="398" alt="日程.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/3a3478c6-f27c-b1e9-10af-88cfcc967bc0.png">
・Microsoft Learn Blogには他にも[PL-100](https://techcommunity.microsoft.com/t5/microsoft-learn-blog/are-you-a-power-platform-app-maker-now-s-the-time-to-get/ba-p/1512993)や[DP-900](https://techcommunity.microsoft.com/t5/microsoft-learn-blog/working-with-data-in-the-cloud-prove-your-skills-with-exam-dp/ba-p/1469419)のベータ版試験の記事がありました。DP-900の方は人数制限に達していて割引がなかったので申し込みませんでした。

####AI-900ベータ版の受験料
<img width="519" alt="az-900.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/5eec29d9-dd4f-5d13-d12a-5866d638c2c6.png">
1万2500円のところ、ブログ記事にあるプロモーションコードの割引で、2750円で申し込みできました。

####勉強の方法

試験名で検索すると、Microsoft MVPの方でしょうか英語で書かれたページがヒットします。

[Preparation Guide for AI-900 Microsoft Azure AI Fundamentals Certification](https://stanislas.io/2020/07/01/preparation-guide-for-ai-900-microsoft-azure-ai-fundamentals-certification/)

[AI-900 EXAM STUDY GUIDE (MICROSOFT AZURE AI FUNDAMENTALS)](https://ravikirans.com/ai-900-azure-exam-study-guide/)

またMS Learnの日本語だと表示されませんが、英語だと画像のようにラーニングパスが表示されたので、これを進めていきます。

[Microsoft Certified: Azure AI Fundamentals](https://docs.microsoft.com/en-us/learn/certifications/azure-ai-fundamentals?tab=tab-learning-paths)
<img width="456" alt="0801.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/c1a1e2d0-a61c-5b4d-840e-0e50d9294a0f.png">

Fundamentalsレベルと言えど、英語のみかつ未知の分野なので、厳しいでしょうがこの土日に取り組みます。

この資格試験の勉強を通して、機械学習や人工知能の基礎部分を少しでも理解したいと考えています。

---------------
2020/08/03 更新しました。
~~受験後に、次の内容を更新します。~~

####試験結果
583/1000 で700点を超えなかったので不合格でした。
![20200803_AI-900.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155894/d209fab4-33a8-8eca-2335-125e1dfdfd92.jpeg)

####感想
英語が苦手なので意味を理解するのに時間一杯かかりましたが、素直で短い問題文が多かった印象です。
準備不足なのが明らかになった試験結果でした。

コロナ対策で、試験中もマスク着用する必要がありました。
Fundamentalsなので試験時間は60分間だったのでなんとか我慢できました。

今回で出題形式など体験できたので再挑戦したい所ですが、通常の試験料だと小遣い的に厳しいので、次回はいきなり上位レベルの[Microsoft Certified: Azure AI Engineer Associate](https://docs.microsoft.com/ja-jp/learn/certifications/azure-ai-engineer)に挑戦するかもしれません。
【PHP】Trying to get property 'methods' of non-object  in 〜　のエラー解決方法

##はじめに
エラーログで`Trying to get property 'methods' of non-object in 〜`って出てきたことはありませんか？
存在しない変数のプロパティやnullの値を参照した時にこのエラー発生するもので、私たまに出てくるんですが大概の場合はすぐ解決できます。
今回は実務でこのエラーが出てきて（配属されてすぐなので人のコードの修正でした...）その修正でした。

##issetを用いてエラーを解決
`Trying to get property 'methods' of non-object in 〜`のエラーなのですが、存在しない変数のプロパティやnullの値を参照した時にこのエラー発生するの、issetやisnullなどの関数を使うとチェック出来ます。
今回はissetで解決したのですが、前の部分で実装していた`foreachループ`が効いていて後続の処理でエラーが起きていました。
なので今回の対象の部分に

```php:
isset($hoge)
```

と実装すると解決します。

##おわりに
ちゃんと実装できているかの確認は画面の動作確認と、`storage/logs`配下のエラーログで特に何も出てこなくなれば大丈夫だと思います。
PHPのBoolean型で利用する、true, falseという単語は「定数」

# TRUE, FALSEとはなんなのか
Boolean型の変数において格納する true, false というキーワード。
TRUE, True, true のように様々に書くことができます。私は true, false 派です。
馴染み深いものですが、よくよく考えるとこれは何なんでしょうか。

> boolean リテラルを指定するには、定数 TRUE または FALSE を指定してください。 両方とも大文字小文字に依存しません。
https://www.php.net/manual/ja/language.types.boolean.php

というわけで、定数でした。

# 大文字小文字を気にせず使えるのは、定数だから

true, false は大文字小文字を気にせず使えます。

```php
$flag = TRUE;
$flag = True;
$flag = true;
```

これは、`define()` で定義された定数についてPHPが大文字小文字を区別しないことから、このような挙動になっていると推測されます。
参考：[Q. PHPは大文字小文字を区別するか？#定数](https://qiita.com/tadsan/items/6c6329eeb43929271119#%E5%AE%9A%E6%95%B0)

# 定義を確認する

ドキュメントに記載があります。

> TRUE (boolean)
Booleans も参照ください。
FALSE (boolean)
Booleans も参照ください。
https://www.php.net/manual/ja/reserved.constants.php

「定義済みの定数」としてドキュメントに記載されていることが確認できました。

実際に、`get_defined_constants()`という関数で確認してみます。

```
$ php -r 'var_dump(get_defined_constants());'
  ... (省略) ...

  'TRUE' =>
  bool(true)
  'FALSE' =>
  bool(false)

  ... (省略) ...
```

定義されてるのが確認できました！！

# true, falseは真偽値そのもの (Booleanリテラル) ではない

というわけで、

|                     |                          |
|---------------------|--------------------------|
| TRUE, True, true    | 定数                     |
| FALSE, False, false | 定数                     |
| bool(true)          | 真偽値 (Booleanリテラル) |
| bool(false)         | 真偽値 (Booleanリテラル) |

という感じになります。true, false の定数はあくまで定数であり、真偽値そのものではありません。

例えば、 `$a = true;` と定義したときの流れとしては、

1. 定数`true`が、`bool(true)` に展開される
2. `$a`に、`bool(true)` が格納される

と考えるとよさげです。

# 補足
NULLも同様でした。同様の方法で確認できます。
ラズパイ＆OpenCVで顔検知

#カメラ
使ったカメラはラズパイ用のカメラ
使い方は
https://www.itmedia.co.jp/news/articles/1907/13/news009.html
などを参考にしました。

#ラズパイにOpenCVをインストール

```
sudo apt-get update
sudo apt-get install libopencv-dev python-opencv
```

#Python用のライブラリをインストール
```
sudo pip install picamera
sudo pip3 install opencv-python
```


# OpenCV git
https://github.com/opencv/opencv

```
git clone https://github.com/opencv/opencv.git
```
でダウンロードしたファイルの中にhaarcascadesというフォルダがあるので、それを今から作るpythonファイルと同じフォルダ内に移動させておく




#こんなコードを書いてみた
```py
import picamera
import time
import cv2 as cv


while True:
    with picamera.PiCamera() as camera:
        camera.resolution = (512,384)
        time.sleep(2)
        camera.capture('test.jpg')
        print('capture')
        img = cv.imread('test.jpg')
        grayimg = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
        
        face_cascade = cv.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
        facerect = face_cascade.detectMultiScale(grayimg,scaleFactor=1.2,minNeighbors=2,minSize=(1,1))
        print(facerect)
        
        if len(facerect)>0:
            print('face')

        time.sleep(2)
```

ラズパイのカメラモジュールは逆光に弱いようで、逆光をさけるようにすれば、カメラに顔が写れば'face'と反応しました。
Analog入出力内蔵の威力

# Analog入出力があると便利
温度センサー（MCP9700）を題材に、ArduinoのAnalog入力とADコンバータとを比較してみた。

## 使ったもの
温度センサー（MCP9700）：データシートは[こちら](https://switch-education.com/datasheets/mcp9700.pdf)。
ADコンバーター（MCP3008）：データシートは[こちら](https://cdn-shop.adafruit.com/datasheets/MCP3008.pdf)。Arduino IDEで用いたライブラリは[こちら](https://github.com/adafruit/Adafruit_MCP3008)。

## ソースコードと結果
温度センサー（MCP9700）のデータシートを読み解く。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b502488e-c0b8-3c7e-b2bd-14e89c159117.png", width=110%>
温度が0度のときは500mVの出力、温度が1度上がると10mV出力が上がることがわかる。

ArduinoのAnalogおよびMCP3008の分解能は、いずれも1024(0-1023)。

### Analog入力利用
```c++:TempSensor_Analog_.ino
const int analogInPin = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int read_val = analogRead(analogInPin);
  float voltage = read_val * 5.0f / 1024.0f; // V
  
  // MCP9700 spec: 500 mv at 0 degree and 10 mv / degree
  float temperature = (voltage - 0.5) / 0.01;
  Serial.println(temperature);
  
  delay(3000); 
}
```
![1st.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b36be3db-9ef7-f0f0-024d-73d06114ae12.png)

### ADコンバーター利用
```c++:TempSensor_MCP3008.ino
#include <Adafruit_MCP3008.h>

Adafruit_MCP3008 adc;
const int mcp3008_ch = 0;

void setup() {
  Serial.begin(9600);
  
  // (sck, mosi, miso, cs);
  adc.begin(13, 11, 12, 10);
}

void loop() {
  int read_val = adc.readADC(mcp3008_ch);
  float voltage = read_val * 5.0f / 1024.0f; // V
  
  // MCP9700 spec: 500 mv at 0 degree and 10 mv / degree
  float temperature = (voltage - 0.5) / 0.01;
  Serial.println(temperature);
  
  delay(3000); 
}
```
![2nd.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b5431cf7-286b-0515-1b92-b2f6fc8dcb01.png)


対して違いはないように見えるが、、。

## 本当の比較
### 配線図
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/91d41572-65fb-d997-8cca-f9c8a4f0daca.png", width=80%>
ブレッドボードの左にあるものがAnalog入力に接続されている温度センサー、中央にあるものがADコンバーター(ArduinoとはSPI接続)、中央下にあるものがADコンバーターに接続されている温度センサーである。

### 写真
Analog入力ではこうなる。すっきり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/9560e7f4-3770-6d0b-c04a-5e4cd88910c8.jpeg", width=70%>

ADコンバーターではこうなる。少々カオス。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/3dc338e8-fff0-02e1-571a-3c2f3cb9a432.jpeg", width=70%>

### ADコンバーターMCP3008ライブラリ
TempSensor_MCP3008.inoで使っているadc.begin()とadc.readADC()とが[ライブラリ](https://github.com/adafruit/Adafruit_MCP3008)で何行あるか調べると、
- adc.begin()   20行
- adc.readADC()   56行

通常はライブラリを利用するであろう。ただ、スクラッチから作ると、ADコンバーターのデータシートとSPIとを理解する必要がある。それになりに面倒。

## 感想
あるものは使ったほうがいい。Analog入力があるのは便利。
簡単！メロディICでハッピーバースデーを鳴らす！

#概要
勢い！！
音を鳴らしたい！！！

#仕組み

1. ICに電圧かけて波形出力
2. トランジスタで電力増幅してスピーカーを動かす

#必要な物 (秋葉で買おう)
メロディIC： 三端子メロディIC　ハッピーバースデー(秋月電商)
コンデンサ： 適当0.1μFぐらい！！つかったのは101(秋月)
ジャンプワイヤ： サンハヤト　ジャンプワイヤ付きスピーカーMODEL SBS-P02(千石電商)
電池：　電圧＝＞3Vぐらいで適当に　CR2032使いました。
トランジスタ：　2SC1815

ブレボ
ジャンパ線

##あったから使うもの
LED
タクトスイッチ


#配線図
メロディICの仕様書通りです！（Fig.2
こんな感じ（Nのほうがトランジスタです
![メロディIC_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67904/f625d772-777a-5808-3bb8-132ec168e0fc.png)



#実物

https://twitter.com/starswirl_k/status/1214167275143495680
第3回　今週のRPA関連ニュース　7/27(月)〜7/31(金)

こんにちは！
Peaceful morning社でインターンをしている川内です。

普段RPA HACKでは、Twitterアカウント(https://twitter.com/NewsRpa)
にて、毎日RPAのニュースを紹介しています！

そこで先週に引き続き今週も川内が気になった**RPA関連ニュース**を独断で紹介いたします！この記事を見ていただければ、この1週間でおきたRPAの周りでおこった主な出来事がサクッと理解できます！

**第1回目はこちら↓**
https://qiita.com/RPAHACK/items/e63242fd9604a9908cd8

**第2回目はこちら↓**
https://qiita.com/RPAHACK/items/33e9177d9cef29e76d17



記事の形式としては、**「記事の題名」「記事のリンク」「記事の要約」**を各曜日で順に書いていきます。



##月曜日 7/27
###UiPath、ソフトウェアテストの自動化プラットフォーム「UiPath Test Suite」を国内で販売開始
https://cloud.watch.impress.co.jp/docs/news/1267506.html

UiPath株式会社は27日、ソフトウェアテストの自動化を支援する「UiPath Test Suite」の日本語版を販売開始し、日本のソフトウェアテスト市場に参入すると発表した。UiPath Test Suiteは、UiPathがRPA領域におけるソフトウェアテストの設計・管理・実行の効率化で培ったテクノロジーを生かして、RPA以外の各種アプリケーションテストにも対応するソフトウェアテスト用プラットフォームであり、ソフトウェア開発におけるテストチームをコストセンターからバリューセンターへと変革させることができる。

UiPathに関する記事はRPA HACKにも多数あります！
**・UiPath StudioXの基本をマスター！～画面構成/カード/アクション**
https://rpahack.com/uipath_studiox_1

**UiPath StudioXでCSV/Word/Outlookメールを自動化！**
https://rpahack.com/uipath_studiox_4

**UiPathの新製品StudioXとは？ 特徴～勉強方法まで解説！**
https://rpahack.com/uipath-studiox

##火曜日　7/28
###3万5783時間の業務削減　茨城県、ロボットで自動化　19年度
https://ibarakinews.jp/news/newsdetail.php?f_jun=15958531307996

茨城県は業務の生産性向上や働き方改革を図るために昨年度に始めたRPAについて、1年間で職員の業務時間3万5783時間(見込み)の大幅な削減効果があったと発表した。県は昨年度、県立学校や知事部局などの予算令達など20業務を対象にRPAを導入した。本年度もさらに20業務でRPA導入を予定である。


##水曜日　7/29
###「現場が使いこなせるAIを」──UiPath、AIとRPAを自由に接続できるプラットフォーム「AI Fabric」

https://www.itmedia.co.jp/news/articles/2007/29/news116.html

UiPathは7月29日、既存のRPAソフトにAIモデルを組み合わせられるプラットフォーム「AI Fabric」を発表した。AIの中身を知らなくても、現場の作業者がAIを使って業務を効率化できるようになるという。「AI Fabric」はRPAツール「Studio」にAIモデルを組み込むための運用・管理プラットフォーム。使用例としては、Pythonで開発したイヌとネコの画像を分類するプログラムをAI Fabricに登録し、指定フォルダ内にあるイヌの画像は「イヌ」フォルダに、ネコの画像は「ネコ」フォルダに分けるようにStudio上で指定し実行すると、自動で分類とフォルダ分けが行われる。

##木曜日　7/30
###IFTTTとつながるRPA。クラウド型RPA「クラウドBOT®」iPaaS連携を拡充

https://prtimes.jp/main/html/rd/p/000000011.000049789.html


株式会社C-RISEは、クラウド型RPAサービス「クラウドBOT®」の連携機能として新たにIFTTTに対応した事を発表した。
クラウドBOT®は、Webブラウザ操作を記録するだけでWeb自動操作BOTを作成できるクラウド型RPAサービスであり、今回、クラウドBOT連携機能の対応iPaaSにIFTTTを加える事で、新たに約400のサービス連携が可能となる。


**iPaaSのツール一覧はRPA HACKに掲載されています！**
**今話題のiPaaSとは？ツール一覧を紹介**
https://rpahack.com/ipaas

##金曜日　7/31
###ヒューマンリソシア　ウィズコロナの「新しい働き方」で期待されるRPAの 活用促進に向け、無料オンラインサービスを拡充

https://www.jiji.com/jc/article?k=000001055.000005089&g=prt

人材サービス事業を運営するヒューマンリソシア株式会社は、ウィズコロナの新しい働き方で必要とされる自動化・デジタル化の推進に向け、オンラインでのRPA活用サービスを拡充している。RPAを実際に操作できる無料オンラインセミナーの開催や、7月より、RPA化のノウハウが学べる動画コンテンツ「WinActorライブラリ 457本ノック！」をYouTubeで無料公開するなど、オンラインサービスの充実を図る





##RPA HACKについて
RPA HACKではRPA・AI・Power Automateに関する記事が100本以上掲載されています！すべて無料でご覧いただけます！

RPAのツールを触ってみたい！という方におすすめ↓
・UiPath StudioXの基本をマスター！～画面構成/カード/アクション
https://rpahack.com/uipath_studiox_1

RPAエンジニアとして働いてみたいという方におすすめ↓
・事務職から転職したRPAエンジニアが語る仕事の2つの魅力
https://rpahack.com/attraction-of-rpa

Power Automateの使い方を学んで見たい方におすすめ↓
・Power Automateの便利な使い方をカテゴリーごとに紹介
https://rpahack.com/powerautomate-2

RPA HACKのtwitterのフォローもよろしくお願いします！
(URL：https://twitter.com/home)
node.jsの標準のhttpsモジュールでAPIへのリクエストを実行する

## やりたいこと
node.jsの標準のhttpsモジュールでAPIへのリクエストを実行したい。
node.jsでHTTPリクエストを行う際には、[requestモジュール](https://github.com/request/request)が使われるケースが多かったようだが、[2020/2/11でdeprecated](https://github.com/request/request#deprecated)になったようなので、代わりにnode.jsの標準モジュールで実行したい。

## 実装

以下のような実装でリクエストを実行できた。
APIは、[zipcloud 郵便番号API](http://zipcloud.ibsnet.co.jp/doc/api)を試しに叩いている。

```js
const https = require('https'); // 1: 標準のhttpsモジュールを使用

https.get('https://zipcloud.ibsnet.co.jp/api/search?zipcode=1000000', (res) => {
    if (res.statusCode !== 200) { // 2: status codeが200以外の場合はエラーとする
        console.error("failed to get data. status code: %d", res.statusCode);
        return;
    }

    let rawData = '';
    res.on('data', (chunk) => { // 3: res.on('data', callback関数) で、responseのbodyデータをストリーム形式で処理してくれる。ここではchunkという変数にstreamデータを追加式に格納している。
        rawData += chunk;
    });
    res.on('end', () => { // 4: res.on('end', callback関数) で、responseのbodyデータを読み終わった後の処理を定義。
        try {
            const parsedData = JSON.parse(rawData); // 5. 今回はレスポンスデータがjson形式なのでJSON.parseして、それをログ出力している
            console.log(parsedData) ;
        } catch (e) {
            console.error(e.message);
        }
    });

}).on('error', (e) => {
    console.error(e)
});
```

### コードの説明
#### 1. 標準のhttpsモジュールを使用
標準のhttpsモジュールをrequireしています

#### 2: status codeが200以外の場合はエラーとする
一応、status code（`res.statusCode`）が200以外の場合はエラー扱いしてログを出力しています。

#### 3: res.on('data', callback関数) で、responseのbodyデータを処理
res.on('data', callback関数) で、responseのbodyデータを処理できます。bodyデータはストリームデータの形式でcallback変数の引数（ここでは`chunk`）に細切れで渡されてくるため、事前に用意しておいた結果格納用変数（`rawData`）に、細切れごと（ループ内の1回処理ごと）に追加で格納していくという処理を行っています。
node.jsのストリームデータに関しては、[こちらのブログ記事](http://jxck.hatenablog.com/entry/20111204/1322966453)や[Qiitaここちらの記事](https://qiita.com/koshilife/items/634799bb57872ce0a169)などが参考になります。

#### 4: res.on('end', callback関数) で、responseのbodyデータを読み終わった後の処理を定義
res.on('end', callback関数) で、responseのbodyデータを読み終わった後の処理を定義できます。

#### 5. 今回はレスポンスデータがjson形式なのでJSON.parseして、それをログ出力している
今回はレスポンスデータがjson形式なのでJSON.parseして、単純にそれをログ出力しています。

## 実行結果
上記のファイルをindex.jsという名前で保存して、nodeコマンドで実行する。
APIの実行結果が出力される。

```sh
$ node index.js
{
  message: null,
  results: [
    {
      address1: '東京都',
      address2: '千代田区',
      address3: '',
      kana1: 'ﾄｳｷｮｳﾄ',
      kana2: 'ﾁﾖﾀﾞｸ',
      kana3: '',
      prefcode: '13',
      zipcode: '1000000'
    }
  ],
  status: 200
}
```

## 感想
標準のhttpsモジュールを使用した場合、responseのbodyデータを処理する際に、わざわざstreamデータを取り出す処理を実装しないといけないのが少し面倒だと思った。
requestモジュールなサードパーティのモジュールどを使うと、この辺の処理はモジュール内で良い感じで処理してくれていて呼び出し側では意識する必要がないのは良い。
とはいえ、それ以外はそれほど複雑な実装は必要ないので、上記のような処理を定形処理として覚えてしまっておけば、（わざわざ追加のモジュールを入れずに）標準モジュールだけでサクッとHTTP requestを実装できて便利そう。

## 参考
公式サイトに記載のサンプルコードを参考にしました。

[node.js公式 httpsモジュールのgetメソッドの解説](https://nodejs.org/api/https.html#https_https_get_options_callback)
[node.js公式 httpモジュールのgetメソッドの解説](https://nodejs.org/api/http.html#http_http_get_options_callback)　※httpsモジュールのhttp（非SSL）版
【PyMC3】Compilation Failedエラーを解決する

# はじめに
この記事は[Pythonで体験するベイズ推論](https://www.morikita.co.jp/books/book/3155)で使用するPyMC2の構文をPyMC3に記載し直したときに起きたCompilation Failedエラーについて、
私の症状に当たるものがあまり見つからなかったのでここに共有しておこうと思います。

Pythonで体験するベイズ推論のコードをPyMC3で書き直したものは[Githubに上がっています。](https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers)

# 環境

- Windows 10 Home 64bit
- Anaconda 4.8.3
- Python(conda) 3.8.3
- theano(pip) 1.0.5
- pymc3(pip) 3.9.3
- numpy(conda) 1.18.5


# エラー内容

[PyMC3で書き直したChapter1](https://github.com/CamDavidsonPilon/Probabilistic-Programming-and-Bayesian-Methods-for-Hackers/blob/master/Chapter1_Introduction/Ch1_Introduction_PyMC3.ipynb)の「メッセージ数に変化はあるか？」にて

ここの実行は問題なし。

```python
import pymc3 as pm
import theano.tensor as tt

with pm.Model() as model:
    alpha = 1.0/count_data.mean()  # Recall count_data is the
                                   # variable that holds our txt counts
    lambda_1 = pm.Exponential("lambda_1", alpha)
    lambda_2 = pm.Exponential("lambda_2", alpha)
    
    tau = pm.DiscreteUniform("tau", lower=0, upper=n_count_data - 1)
```


次のこの部分にて、下記エラーが起きました。

```python
with model:
    idx = np.arange(n_count_data) # Index
    lambda_ = pm.math.switch(tau > idx, lambda_1, lambda_2)
```



```python:エラー内容

Exception: ('Compilation failed (return status=1): C:\\Users\\user\\AppData\\Local\\Temp\\ccq4MDSW.s: Assembler messages:\r. C:\\Users\\user\\AppData\\Local\\Temp\\ccq4MDSW.s:270: Error: invalid register for .seh_savexmm\r. ', '[Elemwise{gt,no_inplace}(<TensorType(int64, (True,))>, TensorConstant{[ 0  1  2 ..71\n 72 73]})]')

```


# 解決方法


- [MinGW-w64をインストールし、環境変数を設定](https://www.javadrive.jp/cstart/install/index6.html)(こちらを参照しました)


- 新たに仮想環境を作り直す

```:ターミナル
conda create -n env_name
conda install numpy
conda install scipy
conda install cython
pip install git+https://github.com/theano/theano
pip install git+https://github.com/pymc-devs/pymc3
conda install jupyter
```

一度、theano,PyMC3もcondaでインストールしたのですが、その場合は全く同じエラーが出て解決しませんでした。
が、[pipとcondaを混ぜると、動作的にあまりよろしくない](http://onoz000.hatenablog.com/entry/2018/02/11/142347)ので、独立した環境を作るのがいいかと思います。

- 再度実行する

```python
import pymc3 as pm
import theano.tensor as tt

with pm.Model() as model:
    alpha = 1.0/count_data.mean()  # Recall count_data is the
                                   # variable that holds our txt counts
    lambda_1 = pm.Exponential("lambda_1", alpha)
    lambda_2 = pm.Exponential("lambda_2", alpha)
    
    tau = pm.DiscreteUniform("tau", lower=0, upper=n_count_data - 1)

with model:
    idx = np.arange(n_count_data) # Index
    lambda_ = pm.math.switch(tau > idx, lambda_1, lambda_2)
```

で、通りました。
このあと、condaでmatplotlib,seabornも入れましたが、今の所不具合はないです。


もし同じ症状の人がいたら、これが役に立ったらいいな・・・
ReactiveProperty と ReactivePropertySlim ってどれくらい違うの？

ReactivePropertySlim のほうが早いよ。という説明はしましたが、どれくらい早いのか見てみましょう。
こういうとき便利なのが [BenchmarkDotNet](https://github.com/dotnet/BenchmarkDotNet) ですね。

ReactivePropertySlim の高速化のポイントの 1 つにインスタンス作成時のメモリアロケーションを最低限におさえるというのがあるように見えます（作ったの @neuecc さんなのでコード見てる雰囲気で…）。一方 ReactiveProperty はインスタンス作成時にちょっとした処理をしていたりします。では、どれくらい違うのか以下のようなベンチマークを書いてみました。

```csharp
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Reactive.Bindings;
using System;
using System.Reactive.Subjects;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            BenchmarkRunner.Run<ReactivePropertyBehcnmark>();
        }
    }

    public class ReactivePropertyBehcnmark
    {
        [Benchmark]
        public ReactiveProperty<string> ReactivePropertyDefaultConstructor() => new ReactiveProperty<string>();
        [Benchmark]
        public ReactivePropertySlim<string> ReactivePropertySlimDefaultConstructor() => new ReactivePropertySlim<string>();
    }
}
```

実行結果は以下の通りです。

```
|                                 Method |      Mean |     Error |    StdDev |
|--------------------------------------- |----------:|----------:|----------:|
|     ReactivePropertyDefaultConstructor | 90.127 ns | 1.2563 ns | 1.1752 ns |
| ReactivePropertySlimDefaultConstructor |  5.383 ns | 0.1262 ns | 0.1181 ns |
```

はい。平均で 18 倍ほど ReactiveProperty のほうが new しただけで遅いですね。これでも ReactiveProperty も早くなるように努力したのですが、これ以上は今の自分だと Slim に迫ることはできませんでした。

この他にもスレッドのディスパッチとかしてないのもあって値の設定とかでも Slim のほうが早いはずです。興味のある方は試してみるといいかも。

## まとめ

早い。
【Mac】MacのOSアップデートを実施する

<< [【Mac】MacOSの基本操作を覚える](https://qiita.com/hiroyuki-eguchi-0731/items/99a0d771fda18adac9f0)

# MacOSを最新版にする

WindowsUpdateと同じくMacもしっかりとバージョンアップしておかないとね。
インターネットに接続できたら最初に実施しましょう。

## 現状のバージョンを把握する

まずは現状のバージョン把握を行いますかね。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/ed97bd63-a4b0-8057-1b84-f708ce0af067.png)

[アップルマーク（っていうのかな？）] - [このMacについて] をクリックします。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/39863ed9-b4b0-2e69-1a8d-43df0739e806.png)

[システムレポート...]をクリックして、関係しそうなところを確認してみましょう。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/97eefe2e-3ddc-5a6a-f6be-2d41b5e004b7.png)

ソフトウェアが関係しそうなので確保しました。

## アップデートを実施する

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/3f75bf84-60c6-c593-e30a-073109dff178.png)!

先ほどの画面の[ソフトウェア・アップデート...]をクリックします。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/1f947f73-121a-c64b-c625-291d31b965ad.png)

アップデートがあることが表示されるので、[今すぐアップデート]をクリックします。

[Macを自動的に最新の状態に保つ]のチェックを有効にするかどうかは任意ですよねー。

今回は個人で勉強がてら利用するつもりなのでアップデートも意識しながら作業したい。
そんなわけでチェックはつけずにすすめることにします。

![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/89b26169-554e-4e3c-8b06-5c41db1b0d69.png)

始まりそうな問いかけがきました。
[ダウンロードして再起動]をクリックするとアップデートが始まります。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/ee1a177d-d362-3b90-aa4c-90a980b05c23.png)

時間がそこそこかかるので別作業していると、OS再起動する瞬間を見逃しました（笑）

## 最新のバージョンを確認する

改めてバージョン情報を確認してみましょう。

![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406574/09c7cfb5-2b58-0ea3-1859-915d3976a4eb.png)

あがってますね。

| 項目 |アップデート前 |アップデート後|
|:-----------------|:------------------|:------------------|
| システムのバージョン| macOS 10.15.1(19888)| macOS 10.15.6(19G73)|
| カーネルのバージョン| Darwin 19.0.0 | Darwin 19.6.0|

他に確認すべき項目があるのかしら？気づけば追々追加しましょうかね。

お疲れ様でした。

---

2020-08-01 初稿
[ js ] [ jQuery ] 外部リンクがクリックされた時、モーダルウィンドウをアラートとして表示させる

結局、[先達の知恵をお借りして実装](https://qiita.com/mnbdyunan/items/7f41b09677fc1b2aaa26)しましたが、そこに辿り着くのに手間取り、それまでは自分で実装していました。

なぜこれが採用されなかったのか、それはie11で機能しなかったからです。どうしても原因を見つけることができず、お蔵入りとなりました。

サイト内にある外部リンクがクリックされた時、モーダルウィンドウが立ち上がって、「本当に出ていきますか？否か？」を迫るプログラムです。

```
<a class="modalexternal-open" href="https://www.example.com/">サンプル</a>

<div class="modalexternal">
  <div class="modalexternal__bg modalexternal-close"></div>
  <div class="modalexternal__content">
    <div class="modalexternal__content__txt">外部サイトへ遷移します。本当にいいですか？</div>

    <div class="modalexternal__yesno">
      <a id="modalexternal__link" target="_blank">遷移する</a>
      <a class="modalexternal-close" href="">遷移しない</a>
    </div>
  </div>
</div>
```

```
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
$(function(){
    $('.modalexternal-open').on('click',function(){
        var index = $('.modalexternal-open').index(this);
        var elements = document.querySelectorAll('.modalexternal-open');
        var elementsArray = Array.from(elements);
        var target = document.getElementById('modalexternal__link')
        target.href = elementsArray[index].getAttribute('href');

        $('.modalexternal').fadeIn();
        return false;
    });
    $('.modalexternal-close').on('click',function(){
        $('.modalexternal').fadeOut();
        return false;
    });
});
</script>
```

```
.modal{
    width:100%;
    height: 100vh;
    background: rgba(0,0,0,0.8);
    position:fixed;
    top: 0;
}
.modal_bg{
	background: rgba(0,0,0,0.8);
	height: 100vh;
	position: absolute;
	width: 100%;
}
.modal_area{
    background: #fff;
    left: 50%;
    padding: 40px;
    position: absolute;
    top: 50%;
    transform: translate(-50%,-50%);
    width: 60%;
}
.modal_area p{
    padding:15px;
}
.modal_area button{
    display:block;
    color: #8586AE;
}
.modal_area button:hover{
	opacity: 0.6;
}
```

参考URL
[JavaScriptでURLのパラメータやアンカーを判断して処理を変更する方法 ｜ Tips Note by TAM](https://www.tam-tam.co.jp/tipsnote/javascript/post9911.html)
[JavaScriptでモーダル（ポップアップ）を表示させる方法 | Tech dig](https://tech-dig.jp/js-modal/)
[これなら簡単！JavaScriptでポップアップ表示・入力する方法を解説 | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト](https://www.sejuku.net/blog/95030)
Elmのコメント記法について調べてみた

# はじめに
個人としてElmを書く上でどのような記法でコメントを書いたり、使い分けたりするべきかわからず、また開発チームとしてもそのルールが統一されていなかったので、社内の勉強会で発表した内容を改めてまとめました。
参考：[Documentation Format](https://package.elm-lang.org/help/documentation-format)


# Elmが大切にしていること
**「シンプルさ」と「規律」** 

なぜこれが大事か？
コード内で統一されたルールを基に、読み手がファイルを**ちらっと見ただけで**必要な情報を閲覧できるようになるから。

>The goal is to have consistency across all codebases, so readers can glance through easily and writers do not need to argue about style. 

そして、開発者はフォーマットをどうするこうする話し合う時間は極力減らし、もっと重要な解決すべき問題に時間を使おうぜというスタンスと理解しました。これはElm-formatにも通ずる考え方だなと思いました。

# 3種類の記法と使い方を紹介
## 1. シンプルな単行コメント
使い所：基本どこでも。(ex: let文内, Modelの各フィールド, etc...)

```elm
func hoge =
let
-- 単行のコメント
fuga = "fuga"
in
hoge
```

```elm
type alias Model =
    { name : String -- hogehoge
    , age : Int -- hogehoge
    }
```

## 2. 複数行コメント
```elm
{-
復
数
行
の
コ
メ
ン
ト
-}
```

## 3-1. 関数やモジュールに対するコメント
### 関数へのコメント記法
```elm
{-| ここに関数に関する記述をする。
複数行に渡って記述できます。

    使用例も記載します。

-}
```
### 注意ポイント
```markdown
1. マークダウンが使用可能。
2. {-| の直後に必ずスペースを挿入する。(formatterも効かない)
3. 次行は左からノースペースで記載する。
4. 使用例を記載する。
5. 使用例は4つのスペースを空けて記載する。
6. 関数に型シグネチャを明示する
```
サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340452/b7f7b3b5-c34d-8da2-6e31-107443589dc5.png)

★お手本にすべき完璧なドキュメント
[elm/core](https://github.com/elm/core/blob/master/src/Maybe.elm)

## 3-2. モジュールへのコメント
### モジュールへのコメント記法
```elm
{-| ここに関数の説明と同様に、モジュールの概要やサマリーを記載します。
モジュール内で記載されている関数等に関しては以下にカテゴライズして記載します。

# カテゴリー1

@docs func1


# カテゴリー2

@docs func2 func3

-}
```

### 注意ポイント
```markdown
1. モジュールの宣言文の後、かつimport文の前に記載する。
2. @docsでグループ化できる。
3. グループ名を書いて、その下にどういう関数がまとめられているのか説明を入れてもよい。
4. 情報の優先度を考えて記載順序を決定する。先に知るべきものや重要なものが始めに来る。
    - 例： Maybe.elmだとMaybe型の定義(先に知るべきもの)や Maybe.WithDefault(重要な関数)が該当する。
５. マークダウンが使用可能。
6. {-| の直後に必ずスペースを挿入する。(formatterも効かない)
7. 次行は左からノースペースで記載する。
```
サンプル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340452/a807b1cc-746c-0510-16e3-425ecd6ada88.png)


## 関数やモジュールに対するコメントを記載するメリット
### 1. チーム開発効率が最適化される
複数人で開発しているとどうしても、「この関数ってなんのためのもの？」 「このモジュールは何のために作られたの？」といった疑問を持つ人が出てきてしまいます。特に新しく開発チームに入った人の学習コストも下げることができ、チーム開発をより良い方向へと導いてくれます。 
### 2. exposingが自動で並び替えられる
１つのモジュールの中に関数が多い場合は特に重宝するはずです。 `@docs` でカテゴライズした関数ごとに行を分けて、順序を自動で並び替えてくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/340452/2da762b5-cb8c-a542-b089-423ba6271798.png)

### 3. Editorで関数やモジュールのホバー時にコメントがでる！！（感動）
他のモジュールで作業を進めているときに元の関数定義やコメントを見に行かずとも、ホバーするだけで該当の関数やモジュールに記載されたコメントを表示してくれます。これはめちゃくちゃ便利！


# まとめ
Documentation Formatに基づいて、Elmのコメント機能を使いこなすことは、チーム開発にとってとても強力だと思いました。
コメントを書くこと自体なかなか優先度が上がりにくい性質があるのかなと思いますが、チーム開発を円滑に進めたり、先人と後継を紡ぐ上ではかなり有効な手法なのではないかと思います。
2020.07 振り返り

7月の開発期間を終了しての振り返りです。

## 振り返るにあたって

開発チームでは1か月毎に振り返りを行い、

- 失敗
- 問題、改善点
- そして成功、良かった点

を皆で前向きに発表して次に生かすということを行っています。


## 成功

障害対応の多い月でした。

- [障害対応時の情報管理のコツ](https://qiita.com/e99h2121/items/3c7b170a5725c7c0d0e5)

でも、久しぶりの開発らしいことも、胃を痛めながらやれました。Fargateについては別途またまとめたい。

- [WindowsローカルのAWS SDKでJavaプログラムを動かすまで](https://qiita.com/e99h2121/items/7b153c12f61470ffdf48)
- [AWS SDK for Java 1.11.x と 2.x](https://qiita.com/e99h2121/items/2dd857fc5bc20796d691)
- [AWS SDK で出会った例外](https://qiita.com/e99h2121/items/21cd273ac3b880e6b6ab)


## 失敗

- [がんばるあなたがプロジェクトを殺す](http://kiroh.hateblo.jp/entry/2013/08/09/134507)

主に障害対応に関して、これを肝に銘じたいです。一人で頑張るのは自己満足。障害対応アーカイブ集を社内に作りました。


## 改善したい点

[先月書いたこと(Qiitaの会とか読書会とか)を踏まえてなのですが](https://qiita.com/e99h2121/items/ae4f480cb074b3905749)

### 気軽なレビュー会

- [コードレビューしよう](https://qiita.com/e99h2121/items/aa87405e7acf9ba416b6)

### LightningTalk文化

- [Slack仕草](https://qiita.com/e99h2121/items/6a6f06cfaf4a74fca0f3)

等。オンラインでも横と繋がれる仕掛けを増やしたい。


## まとめ

そろそろ日常が定着してきた。
生活ペースを整えつつ8月も頑張ります。


## 履歴

2020.04 [2020年、（3歳1歳と）私のリモートワーク](https://qiita.com/e99h2121/items/c8878d027603745a6426)
2020.05 [在宅育児（と勤務）を支える技術](https://qiita.com/e99h2121/items/475045cabd005a7add57)
2020.05 [子連れで在宅育児（と在宅勤務）を開始して１か月が経ちました](https://qiita.com/e99h2121/items/cb7471fd833b086b7233)
2020.06 [緊急事態宣言が解除されてリモートワークはどうなるのか](https://qiita.com/e99h2121/items/086822c3f74ebca75364)
2020.07 [新しい開発様式](https://qiita.com/e99h2121/items/ae4f480cb074b3905749)
WScript のVBScriptやJScriptをVisual Stuioを使ってデバッグする方法

# はじめに

VBScriptをデバッグしようと以下の記事を参考に作業したのですが、うまくいかずハマったので最後にステップ実行までたどり着いた方法を紹介します。
[VBSをVisualStuioで編集＆デバッグする方法](https://qiita.com/yukimat/items/015f6c6be27a7238fbd8)
[Visual StudioでClassic ASP（VBScript）をデバッグする](https://qiita.com/hmsnakr/items/5fefef1028d56b575182)

以降この記事はVBScriptについて記載しますがJScriptでも同様にデバッグが行えます。



# 手順１

1.　テストしたいVBScriptを作成します

2.　Visual Stuioを~~<font color=RED>管理者権限</font>で~~起動します
~~管理者権限で実行しないとデバッグ出来ませんでした。~~
2020.08.01 追記
管理者権限でなくても実行できるようです。
うまくいかない時は、管理者権限で実行してみてください。

3.　作成したVBScriptを開きます
Visual Stuio2019では起動直後の画面で「ローカルフォルダを開く」を選択し、テストしたいスクリプトファイルのフォルダを選択後、「ソルーションエクスプローラー」でテストしたいスクリプトファイルを選択。

4.　以下のバッチファイルを作成
テキストエディタで以下の内容を編集し、拡張子batで保存する
Z:\test.vbsの部分はテストするスクリプトファイル名に変更してください。
 
```
wscript.exe Z:\test.vbs //x
```
理由は、デバッグオプション/x をつけて実行させるためです
wscriptのオプションについては以下のサイトを参照ください。
https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/wscript

5.　作成したバッチファイルを実行
以下の画面が表示されたら、先に起動させたVisual Stuioを選択し、[OK]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/8703c05d-5236-5d20-745a-254949c6fd00.png)
6.　Visual Stuioのソースの先頭行でコードがブレークすればデバッグＯＫ



# 手順２（プロセスにアタッチする方法）

こちらの方法は、万一手順１でうまくいかなかった場合にお試しください。

1.～4. までは手順１と同様

5.　ファイルの先頭に以下のコードを追加し保存、また、直後の行にブレークポイントを設定

```vb
WScript.Echo("")
'JScriptの場合は
WScript.Echo("");
```
理由は、デバッグ時にプロセスにアタッチ出来るようにコードを終了させずに待機させるためです。

6.　先に作成したバッチファイルを実行
以下の画面で［Cancel］をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/bf6eae70-b662-56a7-bf3f-7c1015038953.png)
7.　プロセスにアタッチする
Visual Stuioのメニューから[デバッグ]→[プロセスにアタッチ]
次の画面でプロセスからwscript.exeを選択し、[アタッチ]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411106/366a6b74-ca56-3188-0bea-ee67e03ee57f.png)
8.　WScript.Echo("")　によってポップアップしているダイアログを閉じる
9.　Visual Stuioに設定したブレークポイントでコードがブレークすればデバッグＯＫ
R(shiny)でplot_lyのevent_data("plotly_click", source = "A")で取得したクリックイベントを削除する方法

- 参考記事はこちら
  - https://stackoverflow.com/questions/42996303/removing-plotly-click-event-data
- 上記リンクは英語なので日本語で説明します。下記のようにshinyのserver.Rにevent_data("plotly_click", source = "A")でクリックイベントを取得してshinyアプリの画面にevent_data("plotly_click", source = "A")の内容を表示させるコードがあるとします。

```R
  output$plotVal <- renderPrint({
    e <- event_data("plotly_click", source = "A")
  })

```
この場合、event_data("plotly_click", source = "A")にNULLを代入したい場合に
event_data("plotly_click", source = "A") = NULL
としてもデータの型が合わなかったりshinyのsessionの情報がevent_data()に含まれている為、代入できません。
そこでNULLを代入するためには下記のように上記コードを書き換える方法があります。


```R
  data <- reactiveValues(e=NULL)

  observe({
    data$e <- event_data("plotly_click", source = "A")
  })

  output$plotVal <- renderPrint({
    e <- data$e
    if (is.null(e)) {
      NULL
    } else {
      e
    }
  })

  observeEvent(input[["clearEvent"]], {
    data$e <- NULL
  })
```
この場合、書き換える前と同様に画面にはevent_data("plotly_click", source = "A")の内容が表示されるはずです。event_data("plotly_click", source = "A")の中身をNULLにする場合は、input[["clearEvent"]]の値を画面上で変更することで、data\$eにNULLが入り、output\$plotVal関数内のdata$eもNULLとなり、event_data("plotly_click", source = "A")に直接NULLを代入したわけではないですが結果的にevent_data("plotly_click", source = "A")にNULLを代入したことになります。
input[["clearEvent"]]は例えば、shinyアプリの画面上で任意のボタンを押したり、任意のセレクトボックスの値を変更することで動きます。あなたがevent_data("plotly_click", source = "A")の中身をNULLにしたいタイミングをinput[["clearEvent"]]に当てはめるとよいと思います。
以上、ご参考まで
【Python】データサイエンス100本ノック（構造化データ加工編） 017 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/3dhUuiD97_0)もしています。

##問題
P-017: 顧客データフレーム（df_customer）を生年月日（birth_day）で高齢順にソートし、先頭10件を全項目表示せよ。

##解答
```:コード
df_customer.sort_values('birth_day', ascending=True).head(10)
```

##出力
|  | customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd |
|--:|:--|:--|--:|:--|:--|--:|:--|:--|:--|--:|:--|
| 18817 | CS003813000014 | 村山 菜々美 | 1 | 女性 | 1928-11-26 | 90 | 182-0007 | 東京都調布市菊野台********** | S13003 | 20160214 | 0-00000000-0 |
| 12328 | CS026813000004 | 吉村 朝陽 | 1 | 女性 | 1928-12-14 | 90 | 251-0043 | 神奈川県藤沢市辻堂元町********** | S14026 | 20150723 | 0-00000000-0 |
| 15682 | CS018811000003 | 熊沢 美里 | 1 | 女性 | 1929-01-07 | 90 | 204-0004 | 東京都清瀬市野塩********** | S13018 | 20150403 | 0-00000000-0 |
| 15302 | CS027803000004 | 内村 拓郎 | 0 | 男性 | 1929-01-12 | 90 | 251-0031 | 神奈川県藤沢市鵠沼藤が谷********** | S14027 | 20151227 | 0-00000000-0 |
| 1681 | CS013801000003 | 天野 拓郎 | 0 | 男性 | 1929-01-15 | 90 | 274-0824 | 千葉県船橋市前原東********** | S12013 | 20160120 | 0-00000000-0 |
| 7511 | CS001814000022 | 鶴田 里穂 | 1 | 女性 | 1929-01-28 | 90 | 144-0045 | 東京都大田区南六郷********** | S13001 | 20161012 | A-20090415-7 |
| 2378 | CS016815000002 | 山元 美紀 | 1 | 女性 | 1929-02-22 | 90 | 184-0005 | 東京都小金井市桜町********** | S13016 | 20150629 | C-20090923-C |
| 4680 | CS009815000003 | 中田 里穂 | 1 | 女性 | 1929-04-08 | 89 | 154-0014 | 東京都世田谷区新町********** | S13009 | 20150421 | D-20091021-E |
| 16070 | CS005813000015 | 金谷 恵梨香 | 1 | 女性 | 1929-04-09 | 89 | 165-0032 | 東京都中野区鷺宮********** | S13005 | 20150506 | 0-00000000-0 |
| 6305 | CS012813000013 | 宇野 南朋 | 1 | 女性 | 1929-04-09 | 89 | 231-0806 | 神奈川県横浜市中区本牧町********** | S14012 | 20150712 | 0-00000000-0 |

##解説
・PandasのDataFrame/Seriesにて、データをソートする方法です。
・情報を昇順あるいは降順に並べ替えて見たい時に使用します。
・**'sort_values(<文字列>)'は、指定した文字列を昇順あるいは降順に並べ替える関数**です。
・今回の場合、birth_day を昇順に並べ替える（=高齢順に並べ替える）ため、'sort_values('birth_day',ascending=True)'と記載しています。

※sort_valuesの参考記事は[こちら](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html)です。
e-Stat 政府統計の総合窓口

コロナウイルス対応の文書をまとめている中で、~~脂肪率~~ 死亡率を調べていたら、なかなかデータにたどり着けなかった。最終的には何度も検索結果に出ていた、e-Statでデータが見つかった。
e-Statがすごく使えそうなので、備忘録として記録。

# e-Stat:政府統計の総合窓口
探していたデータを、以下のURLで見つける

[人口動態調査 / 人口動態統計 確定数 死亡](https://www.e-stat.go.jp/stat-search/database?page=1&query=%E4%BA%BA%E5%8F%A3%E5%8B%95%E6%85%8B%E7%B5%B1%E8%A8%88%E3%80%80%E4%B8%8D%E6%85%AE%E3%81%AE%E4%BA%8B%E6%95%85&layout=dataset&statdisp_id=0003214741)

DBをクリックすることでデータそのものが見られる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/1842d3e9-0cfb-8414-5453-53400452c866.png)

APIも良さそうなので、きっといつか調べる。きっと。
[開発者向けページ](https://www.e-stat.go.jp/developer)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/900a7f1f-cede-29c6-bb8e-a2da39f62533.png)

国で作った統計データがDB化されているので、膨大なデータにアクセスできる。刹那的に調べたので理解が足りず、検索がうまくできないが、極めて利用価値が高い。

このようなエラーが出た場合でも、ダウンロードは問題なく行えた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/06acf307-c271-7b7c-b224-8be704a28a46.png)


# e-Statに至った経緯
コロナウイルス感染拡大下にあっても、リスクはそれだけではないという内容を書きたかった。そういえば、一番死亡率が高い場所は自宅ということを思い出して検索してみると、こんな記事が見つかる。

[交通事故死の約3倍！ 本当は怖い家庭内事故死と寒さの関係](https://www.renovation-labo.net/4-%E4%BA%A4%E9%80%9A%E4%BA%8B%E6%95%85%E6%AD%BB%E3%81%AE%E7%B4%843%E5%80%8D%EF%BC%81-%E6%9C%AC%E5%BD%93%E3%81%AF%E6%80%96%E3%81%84%E5%AE%B6%E5%BA%AD%E5%86%85%E4%BA%8B%E6%95%85%E6%AD%BB%E3%81%A8/)

記事の中に、こんなグラフが出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/36842ce5-cf96-df71-adc0-d5ea8949c865.png)

これこれ、このデータが欲しいと、データソースとして記載されている「厚生労働省平成28年人口動態統計」を調べてみる。
[平成28年（2016）人口動態統計（確定数）の概況](https://www.mhlw.go.jp/toukei/saikin/hw/jinkou/kakutei16/index.html)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/2c41c5f2-b102-c54a-1a2b-4d9c41376749.png)

第7表がそれかと思ってみてみると、場所に関しては記載されていない。Excel形式のデータもダウンロードしてみるが、ここにも記載されていない。
ここから、遠い旅が始まる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/1dd1439f-c3e7-d8e4-40cc-420070e84c1e.png)


色々調べてみるが、同様のデータが掲載されているのは古いデータ(20世紀）が多く、そのままでは使えない。
検索キーワードを色々変えているうちに、このページにたどり着いた。

[人口動態調査 / 人口動態統計 確定数 死亡](https://www.e-stat.go.jp/stat-search/database?page=1&query=%E4%BA%BA%E5%8F%A3%E5%8B%95%E6%85%8B%E7%B5%B1%E8%A8%88%E3%80%80%E4%B8%8D%E6%85%AE%E3%81%AE%E4%BA%8B%E6%95%85&layout=dataset&statdisp_id=0003214741)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/4f1c65a0-32c3-973e-cc49-c8014684d2a1.png)

文章をみると、まさしく探していたデータなのだが、データそのものが見つからない。統計表表示 ID（0003214741）で検索して、またこのページに戻るということを何回かしているうちに、最初に書いた DBのアイコンに気付いた。

さらに、落ち着いてページをみると、検索の仕方が用意されていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/dc8dcc36-3121-aedb-20d1-2af23d7336a0.png)

とにかく充実している雰囲気、これは使ってみる価値が高そうだ。
[e-Stat 政府統計の総合窓口](https://www.e-stat.go.jp/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529969/892b2730-a7af-90b7-8b61-14b1bea98714.png)
情報系資格まとめ

#情報系資格

###日本のみで認められる資格
・基本情報技術者試験
・応用情報技術者試験
・

###シスコ技術者認定


####セキュリティ・ネットワーク系

| 資格名 | レベル | 受験料 | 試験時間 |
|:-:|:-:|:-:|:-:|
|  CCENT |  登竜門 |  19,958円 | 90分  |
|  CCNA Security | アシスタント  | 36,288円  |  90分 |
| CCNP Security  | 業務内容を網羅  | 19,958円  |  90分 |
| CCIE Security  | エキスパート  | 54,432円  | 8時間  |





#Web系向けの資格
☑︎AWS

#Webデザイナー向けの資格

☑︎ウェブデザイン技能検定（※国家資格）
☑︎Webデザイナー検定
☑︎Webクリエイター能力認定試験
☑︎アドビ認定エキスパート
☑︎Photoshop®クリエイター能力試験
☑︎Illustrator®クリエイター能力認定試験
☑︎色彩検定
☑︎HTML5プロフェッショナル認定資格
【Rails】マイグレーションファイルを削除する

#参考対象者

- マイグレーションファイルの操作の仕方を知りたい方


#環境

```
$ rails -v
Rails 6.0.3.1
```
```
$ ruby -v
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]
```

```
$ mysql --version
mysql  Ver 14.14 Distrib 5.7.29, for osx10.15 (x86_64) using  EditLine wrapper
```

#マイグレーションファイルを削除する

Add column to usersというファイルを削除したかったとします

- 削除したいファイルのマイグレーションIDを確認する

```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200618162841  Create tweetposts
   up     20200620004226  Change tweetposts to tweets
  down    20200621075518  Create posts
  down    20200623102444  Change posts to chats
  down    20200627042358  Create users
   up     20200627080839  Create users
   up     20200627083356  Add column to users
  down    20200627220915  Change datatype content of chats
  down    20200710035709  Add user id to tweets
```

- ID指定して、downさせる

```
$ rails db:migrate:down VERSION=20200627083356
```

- downさせたファイルをゴミ箱へ

```
$ rm db/migrate/20200627083356_add_column_to_users.rb
```


#downさせる前に、マイグレーションファイルを削除してしまったとき

```********** NO FILE **********```というファイルで、up状態のファイルを削除したい

- 削除したいファイルのマイグレーションIDを確認する

```
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200618162841  Create tweetposts
   up     20200620004226  Change tweetposts to tweets
  down    20200621075518  Create posts
  down    20200623102444  Change posts to chats
  down    20200627042358  Create users
   up     20200627080839  Create users
   up     20200627083356  Add column to users
  down    20200627220915  Change datatype content of chats
   up     20200703201452  ********** NO FILE **********
  down    20200710035709  Add user id to tweets
```

- 削除したマイグレーションファイル名と同名のファイルを作成する

```
$ touch db/migrate/20200703201452_add_column_to_users.rb
```

```20200703201452_add_column_to_users.rb
class AddColumnToUsers < ActiveRecord::Migration
  def change
  end
end
```

* downさせて、作成したマイグレーションファイルを削除する

```
$ rails db:migrate:down VERSION=20200703201452
```

```
$ rm db/migrate/20200703201452_add_column_to_users.rb
```
Oracle Cloud Infrastructureのアイコン集が新しくなっていた

# 作図に便利なアイコン集
PowerPointやVisioで構成図を書くときに便利なアイコン集。以前からPowerPoint用とVisio用はあったが、知らぬ間に新しくなっていた。

[Graphics for Topologies and Diagrams](https://docs.cloud.oracle.com/en-us/iaas/Content/General/Reference/graphicsfordiagrams.htm)
![oci_graphics01.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266049/2d170c09-d4c0-2c66-0566-a6c60e749b87.jpeg)
「**[Cacoo](https://cacoo.com/ja/)**」と「**[draw.io](https://www.diagrams.net/)**」はオンライン作図ツール。「**OmniGraffle**」はmacOS/iOS用ダイアグラム作成ツール。

Cacooはブラウザ環境によっては日本語ページに案内され、正しくナビゲーションされないことがあるので注意を。正しくは、こちらのURL。
https://cacoo.com/templates/oracle-cloud-infrastructure-template

# draw.ioがdiagrams.netへ
**draw.io**は、ときどき使っているのだけれど、**diagrams.net**に変わっていてビックリ！ Atlassianうんぬん、なんていう出来事があったらしい。ということで無料で使いたい方は**[diagrams.net](https://www.diagrams.net/index.html)**へ。

**[Open source diagramming is moving to diagrams.net, slowly](https://www.diagrams.net/blog/move-diagrams-net)**
> draw.io will slowly transition to become diagrams.net during 2020 for security reasons. Nothing will change for you, apart from seeing a different URL and logo. www.draw.io will continue to serve the application correctly, we won’t even redirect you.
> The Atlassian integrations are not affected, they will continue to be branded as draw.io.
【npm】package, scriptsを利用した開発の際の知見や心得

## 概要
- JavaScriptでの開発において、npmを利用して得た知見や心得等のまとめ。
- 今回は、packageやscriptsに絞って記載。

## package

### package.json内の情報はできるだけ記述する
- こちらのメタ情報によって、Documentにもなりえる他、特定環境指定等、より多くの機能を与えることができるため。
- 例として下記のように指定することで、環境を制限して開発環境を統一することができる。

```json
{
  "engines": {
    "node": ">=10",
    "npm": "~5.0.0"
  }
}
```

### package.json内へのコメントは、フィールドを利用する
- JSON形式でありコメントの対応が無いため、記述する場合は下記のようにフィールドを利用する形で情報を与える。
  - `comment`と記述しておくことで、検索が容易。

```json
"comment": "...."
```

### ロックファイルは常にリポジトリにコミットする
- `package-lock.json`や`yarn.lock`等のロックファイルは、リポジトリにコミットする必要がある。
- 理由として、全開発者間で同一のバージョンと依存関係を維持するため。

### 本番環境へはnpm ciで行う
- 本番へのデプロイの際には、`npm ci`コマンドでインストールを行う。
- 理由として、lockファイルに適した依存関係のクリーンインストールを行い、正確なバージョンを利用する必要があるため。

### 依存関係を適切かつ最新のものに保つ
- 脆弱性を防ぎ安全に保つため、常に依存関係を確認する。
- 下記のような手動・自動ツールを利用して、早期に調整する。
  - [npm-check-updates](https://github.com/raineorshine/npm-check-updates) : 依存関係の確認・更新ツール
  - [npm-audit](https://docs.npmjs.com/cli/audit): 依存関係の自動修正コマンド。npm v6以上に内包。
  - [Dependabot](https://dependabot.com/) : 脆弱性チェックの自動化ツール。無料。Github社。
  - [Snyk](https://snyk.io/) : 脆弱性チェックの自動化ツール。有料。

## scripts

### クロスプラットフォームを意識する
- 自身の環境だけではなく、「Windows,Linux,MacOS」で利用できるスクリプトを作成する。
  - scripts内での`rm`等のUNIXコマンド利用は、Windowsでは対応が難しいため。
- UNIXコマンドを利用したスクリプトを作成する場合、下記のようなパッケージを利用する。
  - 削除系(rm) : [rimraf](https://github.com/isaacs/rimraf)
  - コピー系(cp) : [cpx](https://github.com/mysticatea/cpx)
  - 汎用系 : [shx](https://github.com/shelljs/shx)
- 下記、記述例

```json
"scripts": {
  "remove": "rimraf ./dist",
  "copy": "cpx -C public/** dist"
},
```

### 複数コマンド実行は可能なものは並列で実行する
- 複数コマンド実行の場合、可能なものは並列で実行して、終了速度を上げる。
- 並列実行は、下記のようなパッケージを利用することで容易に可能。
  - [concurrently](https://github.com/kimmobrunfeldt/concurrently) : 複数コマンド実行CLIツール
  - [npm-run-all](https://github.com/mysticatea/npm-run-all) : 複数コマンド実行CLIツール

### 同一コマンドで用途が違う場合、コロンで分ける
- ビルドや監視等、環境やファイルごとにコマンドを使い分ける場合は、下記のようにコロンをつけて分割してまとめる。
  - **※下記の`run-s`コマンドは上記記載の`npm-run-all`のショートカット**

```json
{
  "scripts": {
    "build"     : "run-s build:sass build:ts",
    "build:sass": "sass input.scss output.css",
    "build:ts"  : "tsc main.ts",
    "watch"     : "run-s watch:sass watch ts",
    "watch:sass": "sass --watch input.scss output.css",
    "watch:ts"  : "tsc -w main.ts"
  }
}
```

- 補足として、上記の`build`や`watch`コマンドは下記のように簡略化できる。
  - **個人的にはアスタリスクよりも波括弧の方が、明示的かつ柔軟。**

```json
{
  "scripts": {
    "build"     : "run-s build:*",
    ...
    "watch"     : "run-s watch:{sass,ts}",
    ...
  }
}
```

## 参考
- https://github.com/goldbergyoni/nodebestpractices
- https://medium.com/openclassrooms-product-design-and-engineering/guide-to-managing-npm-packages-in-your-package-json-d315fe2ccab0
【自分用メモ】VSCode Extensions

VScodeに導入しているExtensionsの個人用のメモです。
常時追加しています。

##導入必須

- 日本語化プラグイン：[Japanese Language Pack](https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-ja)
- カッコに色付けして管理：[Bracket Pair Colorizer](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer)
- 行末のスペースを強調表示：[Trailing Spaces](https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces)
- 全角カッコを強調表示：[Evilinspector](https://marketplace.visualstudio.com/items?itemName=saikou9901.evilinspector)
- インデントを色付け：[Indent-Rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)

##HTML / CSS 用プラグイン
- 開始タグを修正したときに終了タグも自動修正：[Auto Rename Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)
- 対応するタグを黄色い下線で強調表示：[Highlight Matching Tag](https://marketplace.visualstudio.com/items?itemName=vincaslt.highlight-matching-tag)
- Sassをコンパイル：[Live Sass Compiler](https://marketplace.visualstudio.com/items?itemName=ritwickdey.live-sass)
- カラーコードをその色でマーキング：[Color Highlight
](https://marketplace.visualstudio.com/items?itemName=naumovs.color-highlight)

##Git 用プラグイン
- [Git Lends](https://gitlens.amod.io/)
- [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory)

##Setting.json

```Setting.json
{
    "workbench.startupEditor": "newUntitledFile",
    "files.autoSave": "onFocusChange",
    "files.trimTrailingWhitespace": true,
    "files.insertFinalNewline": true,
    "window.zoomLevel": 0,
    "[json]": {


        "editor.quickSuggestions": {
            "strings": true
        },
        "editor.suggest.insertMode": "replace"
    }
}
```
webpでページの読込時間を短縮する

# はじめに
Webサイトの読込時間の長さが気になる時、どのような対処を検討しますか？
・ファイルを並行して読み込む
・キャッシュを利用する
・DOMツリーの階層を減らす
・etc...

比較的簡単な対処方法としてはjpegやpngといった画像をwebpに置き換える方法があります。

# webpとは？
webp（ウェッピー）とはGoogleが開発した次世代の静止画フォーマットです。
拡張子は「.webp」、ライセンスは「BSD」。
jpegやpngと比較するとファイルサイズが約30%前後、減少します。

1つ注意点として、IEはサポートされていません。

# 公式サイト
https://developers.google.com/speed/webp/

# webpの仕組み
隣接するピクセルブロックの値(色)から次のピクセルブロックの値(色)を予測し、その差分をエンコードすることで全体のファイルサイズの縮小を実現しています。

# jpegとwebpの比較
jpegとwebpの画像を比較してみます。
（画像は、[ぱくたそ](https://www.pakutaso.com/)様より拝借させていただきました。）

## 画質
![image47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/1dd786cd-4077-7e60-f4b2-310e2fd48660.png)

左がjpeg、右がwebpです。
パッと見、画質に違いがありません。

![image49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/f5a786e4-623e-cdfe-43c8-497071b265ee.png)

画像を拡大してみても劣化はほとんどありません。

## ファイルサイズ
![image50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122485/9176db13-81cd-f740-5ea3-b8a44d1bcec5.png)

jpegが372KB、webpが118KB
今回の検証だと約1/3のサイズダウンとなりました。

# まとめ
webpを利用することでファイルサイズが小さくなり、
結果として読込速度の改善、[LCP](https://web.dev/lcp/)の改善が見込めます。

IEをサポートしないページであればwebpを使用してみてはいかがでしょうか？
Multiple Monitors in VR!（Oculus Quest + Immersed VR）

##今回やること

今回は、最近Macに対応した**バーチャルデスクトップ**の**Immersed**で複数ディスプレイを実現する方法を共有します。

必要なものは、**Oculus Quest + Immersed VR**です。

Mac環境下で検証していきますので、Windowsの方は具体的な手順は別記事を読んでみてください。
（Immersed公式サイトによると、Linuxバージョンも今後、順次リリースされるようです。）

<img width="1158" alt="スクリーンショット 2020-08-01 4.49.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/0b1b80cc-3e83-f898-7442-edc59f365c45.png">

##最初に確認すること

料金プランが**Eliteプラン**になっているかどうか。

そもそも無料枠だとマルチディスプレイの設定ができないので、14日間無料のEliteプランを試していただくことを勧めます。

<img width="989" alt="スクリーンショット 2020-08-01 4.54.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/fe13b682-1a99-31aa-3777-8cecf23cd848.png">

上記が出来たら次はマルチディスプレイの設定をしていきます。

バーチャル空間上ではなく、モニター上の右上のバーにある**「Settings」**の**「Configure Virtal Displays」**を選択する。

<img width="465" alt="スクリーンショット 2020-08-01 5.06.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/07e0b07b-06b2-4499-dd91-966391d36161.png">

下記の画面にVirtual Display1とか2、３、4などと書かれている。

<img width="446" alt="スクリーンショット 2020-08-01 5.07.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/0dbf6325-93f0-ff51-612e-4396509cfc95.png">

左のチェックがついていれば、マルチディスプレイの設定は出来ています。

以上で伸縮自在な5枚のディスプレイが使えるので、ぜひご活用ください。


##落とし穴

手順自体は簡単なのですが、実際に触ってみると盲点となる部分があります。

特にImmersedでマルチディスプレイの設定で落とし穴になってくるのが、ディスプレイの大きさや距離などは、Oculusのコントローラで直感的に操作できるところが、なぜかマルチディスプレイにするときは、しっかりとMacのタブの設定から操作していく必要があった点です。

Oculusコントローラで行えるディスプレイの大きさや距離などの設定は、わかりやすいチュートリアルが用意されていますが、マルチディスプレイの設定は、なぜか用意されていなく、Oculusコントローラでも出来ませんでした。

##最後に

下記のような活用の仕方も出来ます。

<img width="817" alt="スクリーンショット 2020-08-01 5.20.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/08770824-8c5c-f21f-17a6-31be61f2d6f5.png">

<img width="1038" alt="スクリーンショット 2020-08-01 5.20.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300592/3fcdbe87-1a46-430c-afba-52fab5e2c978.png">

- 伸縮自在な複数ディスプレイが使える
- ホワイトボードを自由に使える
- 大自然や宇宙空間の中で作業ができる

ぜひ自分らしいバーチャル作業環境を整えてみてくださいね。

最後まで読んでいただきましてありがとうございます。

**参考リンク**
https://blog.immersed.team/creating-a-sustainable-future-for-the-future-of-work-90b084655f26
https://ver-1-0.net/2019/08/25/oculus-quest-immersed
https://blog.immersed.team/multiple-monitors-in-vr-6896e59087a4