OmniAICreator/Qiita-1.07M huggingface dataset:
【Excel】関数を使って条件に合うデータを抽出する

##前提
あくまで備忘録として書き記るす
また自身に分かるやすいように記載する。
[ ]で囲まれた個所を該当の内容に置換する

##スペック
OS：Windows10 Pro
SoftWear：MicrosoftOfiice Professional Plus 2016

##INDEX関数とMATCH関数を使って指定データを取得する

##①表示させたい対象列が1つの場合
####<font color="RoyalBlue">=INDEX([表示させたい範囲],MATCH([指定値],[指定値の検索範囲],0))</font>
　
　
##②表示させたい対象列が複数の場合
####<font color="RoyalBlue">=INDEX([表示させたい範囲1]&[表示させたい範囲2]...etc,MATCH([指定値],[指定値の検索範囲],0))</font>
　
　
##③検索対象列が複数の場合
####<font color="RoyalBlue">=INDEX([表示させたい範囲],MATCH([指定値1]&[指定値2]...etc,[指定値の検索範囲1]&[指定値の検索範囲2]...etc,0))</font>
　
　
##④指定値と同じ行の対象セルが複数の場合(検索値が1つの場合)
####<font color="RoyalBlue">=INDEX([表示させたい範囲],MATCH(LARGE(<font color="Crimson">([指定値の検索範囲]=[指定値])*1</font>/ROW([表示範囲の対象列]),ROWS([入力セル(絶対セル)]:[入力セル(列を絶対)])),1/ROW([表示範囲の対象列]),0,COLUMNS([入力セルの項目(絶対セル)]:[入力セルの項目(行を絶対)])),"")
　
　
##⑤指定値と同じ行の対象セルが複数の場合(検索値が複数の場合)
####<font color="RoyalBlue">=INDEX(表示させたい範囲],MATCH(LARGE(<font color="Crimson">([指定値の検索範囲]=[指定値])*([指定値の検索範囲]=[指定値])</font>/ROW([表示範囲の対象列]),ROWS([入力セル(絶対セル)]:[入力セル(列を絶対)])),1/ROW([表示範囲の対象列]),0,COLUMNS([入力セルの項目(絶対セル)]:[入力セルの項目(行を絶対)])),"") 


<font color="Crimson">
**※指定値が変更がある場合は赤字で書かれた個所を変更する**
**※指定値以外の場合は赤字で書かれた箇所の「 = 」を「<>」に書き換える**
**※②～④は配列数式の為、 セル確定させるときに [ctrlキー] + [Shiftキー] + [Enterキー]で確定する。
→確定後式が{ }で囲まれる**
※[Enterキー]のみの場合エラーとなる。
</font>

##補足
ExcelにはFilter関数が存在する。
しかし、今回使用したExcelのバージョンには現在(2020/12/11)では対応していない。
使用するにはOffice365のExcelを使用する必要があるので注意
Azure構築で楽をしましょう！

この記事は [**セゾン情報システムズ Advent Calendar 2020**](https://qiita.com/advent-calendar/2020/sisco) 12日目の記事です。
# はじめに   
社内で実施しているワークショップには参加したことはあったのですが、今回初めてMicrosoft主催Azureワークショップに参加。
そして、Qiitaにも初投稿。

なので、記載レベルは大目に見てください:sweat_smile:
# 内容   
「IaC(Infrastructure as Code) 」について
# Infrastructure as Codeとは？
Azure初心者の私にとっては、まずこの言葉の意味が分かりませんでした。

Azureでインフラ環境等を構築する方法は主に下記の３つの方法があります。
　　　1.ポータルで地道にクリックしてリソースを作っていく方法
　　　2.Powershell・CLIで作成する方法
　　　3.ARM(Azure Resource Manager)テンプレートで構築する方法

上記3.がコードを使用してインフラを構築・管理していく方法でIaC(Infrastructure as Code)と呼ばれています。

# Azure Resource Managerとは？   
「Azure Resource Manager」はAWSの「CloudFormation」に該当する機能であり、「インフラストラクチャビルド」ツールに分類される機能です。

「Azure Resource Manager」の主な機能は下記の通りです。
　　　● アプリリソースをデプロイする
　　　● リソースを整理する
　　　● リソースへのアクセスを制御する

下の図はAzure要求の処理において「Azure Resource Manager」が果たす役割を示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/896269/1c902db4-4632-ed75-3511-3d84bc5b7dd6.png)
ポータルで利用できるすべての機能は、PowerShell、Azure CLI、REST API、およびクライアント SDK からも利用できます。 API を介して最初にリリースされた機能は、最初のリリースから 180 日以内にポータルに表示されます

この機能を有効に活用するために用意されているテンプレートが「Azure Resource Manager テンプレート」です。

# Azure Resource Manager テンプレートとは？   

◼ 展開するAzure リソースを定義したJSON ファイル
　● 展開するAzure リソースと、それらリソースのプロパティを指定
　● 仮想マシンだけでなく、ネットワーク、ストレージ、その他リソースも展開可
◼ 常に一貫性のある方法でリソースを展開
　● 同じリソースの種類を何度でも同じ状態で作成
　● 相互に依存するリソースの展開を調整、正しい順序でリソースを展開
◼ PowerShell またはBash スクリプトを利用した設定機能の拡張
　● スクリプトは外部ソースに格納してテンプレート内で参照することも可
◼ Visual Studio Code, Visual Studio へのテンプレート作成機能の提供
　● Intellisense, 構文の強調表示、インラインヘルプ等、多くの言語機能を提供
◼ 継続的インテグレーションと継続的配置（CI/CD）ツールに統合
　● リリースパイプラインの自動化

JSON形式なのでリソース定義のテンプレートだとこんな記載になります。

```JSON:test.json
"resources": [
  {
    "type": "Microsoft.Storage/storageAccounts",
    "apiVersion": "2020-12-12",
    "name": "teststorageaccount",
    "location": "westus",
    "sku": {
      "name": "Standard_LRS"
    },
    "kind": "StorageV2",
    "properties": {}
  }
]
```
# Azure Resource Manager テンプレートの管理
テンプレート自体がJSON形式であるため、Visual Studio Codeをしてしてテンプレートを作成し、GitHubを使用してテンプレートを管理したりと様々な作成や管理方法があります。
ワークショップでも色々な管理方法を学んだのですが、ハンズオンについていくのが精一杯だったので頭の中を整理して自分で理解ができるレベルの到達したら今後投稿していきます。

# 今後の活用
アプリケーション開発が伴う環境構築の場合には「本番環境」「検証環境」「開発環境」と言った複数の環境構築及びそれぞれの環境に対するアプリケーションリリース等の作業が発生することになります。
まだまだAzureの世界では初心者ですが、この機能を使って環境構築やデプロイ作業の反復作業のミスを少なくすることや、複数のテンプレートを作成することでより短時間で環境構築ができる方法を考え生きたいと思っています。

# 参考   
　　 ● MS公式サイト「[Azure Resource Manager とは](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/overview "Azure Resource Manager とは")」
　　 ● MS公式サイト「[ARM テンプレートとは](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview "「ARM テンプレートとは」")」
テーブルの外部キーによる参照関係を表示する

直接の参照関係


```sql
select 
	REFERENTIAL_CONSTRAINTS.* ,
	BASE_TABLE.TABLE_SCHEMA as BASE_TABLE_SCHEMA,
	BASE_TABLE.TABLE_NAME as BASE_TABLE_NAME,
	REFERENCE_TABLE.TABLE_SCHEMA as REFERENCE_TABLE_SCHEMA,
	REFERENCE_TABLE.TABLE_NAME as REFERENCE_TABLE_NAME
from 
	INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
	inner join INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as BASE_TABLE
		on REFERENTIAL_CONSTRAINTS.CONSTRAINT_SCHEMA = BASE_TABLE.CONSTRAINT_SCHEMA
		and REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME = BASE_TABLE.CONSTRAINT_NAME
	inner join INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as REFERENCE_TABLE
		on REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA = REFERENCE_TABLE.CONSTRAINT_SCHEMA
		and REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME = REFERENCE_TABLE.CONSTRAINT_NAME
order by 
	BASE_TABLE.TABLE_SCHEMA,
	BASE_TABLE.TABLE_NAME,
	REFERENTIAL_CONSTRAINTS.CONSTRAINT_SCHEMA,
	REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME,
	REFERENCE_TABLE.TABLE_SCHEMA,
	REFERENCE_TABLE.TABLE_NAME
;
```

参照関係パスの表示

```sql
WITH cte_path  AS (
	select 
		BASE_TABLE.TABLE_SCHEMA as BASE_TABLE_SCHEMA,
		BASE_TABLE.TABLE_NAME as BASE_TABLE_NAME,
		REFERENCE_TABLE.TABLE_SCHEMA as REFERENCE_TABLE_SCHEMA,
		REFERENCE_TABLE.TABLE_NAME as REFERENCE_TABLE_NAME,
		cast(REFERENCE_TABLE.TABLE_NAME + '/' + BASE_TABLE.TABLE_NAME as varchar(256)) as DEPENDENCY
	from 
		INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
		inner join INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as BASE_TABLE
			on REFERENTIAL_CONSTRAINTS.CONSTRAINT_SCHEMA = BASE_TABLE.CONSTRAINT_SCHEMA
			and REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME = BASE_TABLE.CONSTRAINT_NAME
		inner join INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as REFERENCE_TABLE
			on REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA = REFERENCE_TABLE.CONSTRAINT_SCHEMA
			and REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME = REFERENCE_TABLE.CONSTRAINT_NAME

  UNION ALL

  	select 
		BASE_TABLE.TABLE_SCHEMA as BASE_TABLE_SCHEMA,
		BASE_TABLE.TABLE_NAME as BASE_TABLE_NAME,
		REFERENCE_TABLE.TABLE_SCHEMA as REFERENCE_TABLE_SCHEMA,
		REFERENCE_TABLE.TABLE_NAME as REFERENCE_TABLE_NAME,
		cast(cte.DEPENDENCY + '/' +  BASE_TABLE.TABLE_NAME as varchar(256)) as DEPENDENCY
	from 
		INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
		inner join INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as BASE_TABLE
			on REFERENTIAL_CONSTRAINTS.CONSTRAINT_SCHEMA = BASE_TABLE.CONSTRAINT_SCHEMA
			and REFERENTIAL_CONSTRAINTS.CONSTRAINT_NAME = BASE_TABLE.CONSTRAINT_NAME
		inner join INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE as REFERENCE_TABLE
			on REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_SCHEMA = REFERENCE_TABLE.CONSTRAINT_SCHEMA
			and REFERENTIAL_CONSTRAINTS.UNIQUE_CONSTRAINT_NAME = REFERENCE_TABLE.CONSTRAINT_NAME


    INNER JOIN cte_path cte
      ON REFERENCE_TABLE.TABLE_NAME = cte.BASE_TABLE_NAME
)
SELECT
  *
FROM
  cte_path
order by
	DEPENDENCY
```

外部キー制約で削除がうまくできない、なんていう場合は `DEPENDENCY LIKE '%/Foo' みたいな条件で検索し、パスの逆順で並べて上から削除すればいいと思う。
Ruby : 変数と定数について

# 最初に

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

## 変数と定数について

これはデータを取り扱う時に重要な役割をしてくれるものです！

### 変数

>箱という表現は良くないと指摘頂いたのでたとえ話は参考にしないでくださいm(_ _)m
[こういう捉え方だそうです](https://qiita.com/scivola/items/2775fce84ff911fde36f)

~~簡単にいうと箱に名前をつける名札みたいなイメージです。~~  

名付けをするのにルールが少しあり、「小文字から始める事」「英字のみ」となっています。
変数には種類があり「ローカル変数」「インスタンス変数」「クラス変数」「グローバル変数」などたくさんあります。
それぞれが違う働きをするので状況に合わせて使うととても便利みたいです（まだインスタンス変数しか使ったことない^^;）
調べてみるとこんな使い方できるのか！って思うので調べてみると良いかと！

~~箱に名札？って思ったかもしれないので実例を使って説明をしますね。~~

```ruby:demo.rb
ruby = "name"
puts ruby
```

~~`ruby`という名前の箱の中に`name`と入れた状態~~

```terminal
$ ruby demo.rb
name
```

~~`ruby`は箱の名前なので出力はされないでその中に入っているものがデータなのでそれが出力されます。~~

~~散らばっているデータを関連するもの同士を箱に入れて整理するのが変数の働きになります。~~
変数の名前が何でも良いです！
しかし、他の人が見た時に中身が連想できるような命名をするのが良いとされています。

*例えば、「今月誕生日関連の情報を入れている」なら`this_month_birthday`と変数名としてつけるとなんとなくでもこの変数の中には今月の誕生日が入ってそうというのが伝わりませんか？このように名前をつけると良いでしょ！*

変数を使う際に出てくる「=（イコール）」ですがこれは「等しい」という意味ではなく**「代入する」**という意味になります。
上記のを言葉でいうと
「"name"をrubyに代入する」となります。

### 定数

変数と同じで名前をつけるという点、使い方は一緒です。
違いは、

1. 変更しない数値やデータであること（後から書き換えることは非推奨）
2. 名前は大文字から始めること

非推奨と書いているのは書き換えようと思えば警告文が出るが実際書き換える事はできるという意味です。


## 最後に

変数の勉強もっとしないとな、、、と書いて思いました^^;
また、まとめられたら良いな！と思います。なにせまだ使ったことがないから説明が誰かの受け売りになってしまうので今回はこのへんで終わります、、、
[PowerShell] Google Cloud Text-to-Speechでテキストから音声ファイルをつくる

## やりたいこと
テキストから自然な音声を生成したい。無償のソフトなりwebサービスなどがあるが不自然なものばかり。
そのなかでも、GoogleのText to Speechは最も自然に発音してくれた。
GoogleのText to Speechを使って、wavファイルを生成する。PowerShellを使ってやってみる。

Cloud Text-to-Speech
[https://cloud.google.com/text-to-speech/?hl=ja](https://cloud.google.com/text-to-speech/?hl=ja)

## Google Cloud Platformの設定
Googleのチュートリアルに従えばほぼできる。
[https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja](https://cloud.google.com/text-to-speech/docs/quickstart-protocol?hl=ja)

- Google Cloud Platformの利用登録
- Cloud プロジェクトの作成
- Cloud Text-to-Speech API を有効。
- 認証の設定 (ここで、.jsonファイルが生成されるのであとで使う)
- Google cloud SDKのインストール

## PowerShellのスクリプト
ほぼこれを使用させてもらった。
~~[https://www.mitabou.com/2020/05/ai.html](https://www.mitabou.com/2020/05/ai.html)~~
(リンク切れ)

そのままでは変換できなかったのと、wavファイルがほしかったので、2点スクリプトは変更している。

- Googleのチュートリアルに書かれているように、認証設定のところで生成された.jsonのパスを、スクリプトに入れておく必要がある。

```powershell
$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\xxxxx\xxxxxx\xxxxxx.json"
```

- もとのスクリプトは、mp3に変換するものだった。wavにしたいときは、mp3をwavに書き換えるだけでよい。

```powershell
certutil -decode -f synthesize-output-base64.txt synthesized-audio.wav
```

- 食わせるjsonファイル(request.json)は、同じフォルダに置いておく。Cloud Text-to-Speechのサイトで、喋らせたい言葉を入力しし、show jsonを押して、表示されたRequest Bodyのところをそのままコピペする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252335/a2444f46-afa9-aeed-7840-29ba4ff63a1b.png)

- request.jsonは、UTF-8にして保存しないとだめ。(保存するときにUTF-8を選択)

## スクリプト

```powershell
$env:GOOGLE_APPLICATION_CREDENTIALS = "C:\xxxxx\xxxxx\xxxx.json"

$cred = gcloud auth application-default print-access-token

$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -InFile request.json `
  -Uri "https://texttospeech.googleapis.com/v1/text:synthesize" | Select-Object -Expand Content > lf_synthesize-output-base64.txt
[string]::Join("`r`n",(Get-Content .\lf_synthesize-output-base64.txt)) | Set-Content .\crlf_synthesize-output-base64.txt
findstr /r "audioContent" crlf_synthesize-output-base64.txt > find_lf_synthesize-output-base64.txt
$audioline = [string]::Join("`r`n",(Get-Content .\find_lf_synthesize-output-base64.txt))
$wqcontent = $audioline.split(":")
$noaudioline = $wqcontent[1]
$wqcontent = $noaudioline.trim()
$content = $wqcontent.trim('"')
$content > .\lfcontent_synthesize-output-base64.txt
[string]::Join("`r`n",(Get-Content .\lfcontent_synthesize-output-base64.txt)) | Set-Content .\synthesize-output-base64.txt
certutil -decode -f synthesize-output-base64.txt synthesized-audio.wav
```

## 参考

- Googleのチュートリアルより細かくかかれている。

[https://blog.apar.jp/web/9893/](https://blog.apar.jp/web/9893/)

・Google Cloud SDK のインストールについて

[https://cloud.google.com/sdk/docs/install?hl=JA](https://cloud.google.com/sdk/docs/install?hl=JA)
Aura Componentを使い込む2(受発注システムで使う)

# はじめに

[前回](https://qiita.com/Keiji_otsubo/items/e747ab95f3e686267f22)は検索画面をコーディングし、詳細画面は標準機能を使いました。今回紹介するのは、CSVファイルを読み込んでSalesforceのデータとマッチング処理する機能です。画面自体はlightning:datatableでの表示がメインとなります。

前回にない機能はCSVファイルの読み込みです。従来はCSVファイルを何らかのオプジェクトに添付して、その添付ファイルを読んで処理していました。[^1]今回は添付対象となるオブジェクトが無かったのでCSVファイルを添付させずに直接処理させます。


# 開発のポイント

1. CSVファイルはWindows OSで作成されていることが多いと思うので文字コードに注意です。 Windowsでは通常CP-932なので、Salesforceに取り込むためにはUTF-8にする必要があります。ApexにはCP-932からUTF-8への変換メソッドはないですし、1文字ずつ変換する方法ではループ回数が多くなって制限に抵触します。よってjsのコントローラ内でJava Scriptの関数を使って変換させます。具体的には以下を利用します。
 var reader = new FileReader();
 reader.readAsText(file, "Shift_JIS");

2. 前回の開発方針ではAura Componentだけを組み合わせて開発するとしていましたが、残念ながらUIがありませんので独自に作りました。
3. CSVファイルはカンマ区切りで、セパレータ文字が全てない、あるいはすべてダブルコーテーションで囲むを想定しています。ただし、Excelで数値項目を3桁ごとにカンマ付にした場合は、その項目だけダブルコーテーションで囲まれるという困った仕様があります。この対応には苦慮しました。[^2]

#業務用の画面(CSVファイルで発注残をマッチングして、入荷処理を行う)

前回の例では目視で発注残を探して、入荷処理を行いましたが。優しいメーカーさんは入荷予定データをCSVファイルとして提供してくれるので、今回は自動でマッチングして入荷処理をしたいと思います。

![20201210-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/88aba655-cfad-06be-bf63-0ce0b81c9f0e.png)

CSVファイルのフォーマットを選択して、CSVファイルを選びます。

![20201210-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/cb5d4238-01ae-90f9-624a-e939b6a489c2.png)

取込ボタンをクリックしてファイルを読みます。(変換作業も行います）

![20201210-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c914c593-baf6-073c-2e3a-ec5e9fb39cb9.png)

取り込めると、右上に照合ボタンが表示されるのでクリックします。私の手抜きで今表示されているデータだけを処理対象とするので、たくさんデータがある時は、1ページの表示数を変えて対象件数を増やします。この例の場合はページャーが表示されていないので全てのデータが対象です。

![20201210-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/fbf2f58a-2e26-411a-1345-967a9a71a9d1.png)

あるキーを元にマッチングさせて、CSVファイルからのデータと発注残データと一致すると行の色を変えています。処理して問題なければ、左のチェックボックスで処理対象を選択します。

![20201210-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/deea7160-3850-1ce8-c38d-0eccb7f36fa0.png)

選択すると、右上に更新ボタンが表示されるのでクリックして更新します。[^3]

# 最後に

今回はCSVファイルを読み込むところで独自のUIを作ってしまいましたが、その他は予め用意されているUIを組み合わせて作成しています。行の色を変える部分もlightning:datatable に変数を渡して CSS ソースだけで対応しています。こういう柔軟に動的な対応ができる点がAura Componentのいいところだと思います。今回も参考にしたいという方がいらっしゃれば、公開できる範囲で具体的なソースコードも披露できればと思います。どんどん、コーディングにもチャレンジして欲しいと思います。

[^1]: 添付ファイルを読んで処理しても文字コードの変換は付きまといます。何かしら文字コードの変換をしないといけません。

[^2]: [csv.js: ES5 規定の JSON と同じインターフェースを持つCSVパーサ](https://gist.github.com/think49/009a8744c147a7013f14ea8913bd9027)を参考にフィールドが空白でも読み飛ばさないようにしたものを使っています。

[^3]: 今の画面では更新したら、帳票の仕入合計が表示されます。でも考えたらデータを選択した時点の合計が見たいと言われそうです。ボチボチ修正しておきます。
ESP32-WROOM-32Dにプログラムを書き込む

# 問題
Arduino IDEにて作成したプログラムをUSB接続したESP32開発ボードに書き込めない。

# 環境
- Ubuntu 20.04
    - Arduino IDE
- ESP32-WROOM-32D

# 解決策
## ESP32用のドライバがインストールされていない場合
"ファイル" -> "環境設定" で追加ボードマネージャのURLに
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
を入力し、"OK"を選択。

"ツール" -> "ボード:"Arduino Uno"" からボードマネージャを選択。
スクロールメニューから"ESP32"を見つけ、インストールを選択。

## ドライバをインストールしたが、書き込みができない場合
### シリアルポートを確認
"ツール" -> "シリアルポート" から書き込み先を選択できる。(私の場合:/dev/ttyUSB0)

### 書き込み時にPermission deniedとなってしまう場合

```shell
sudo chmod a+rw /dev/ttyUSB0
```
で読み込み・書き込み権限を付与する。

### Connecting......._____ ... A fatal error occurred ... となってしまう場合

プログラムの書き込み中、ESP32ボードのBootボタンを押しつづける必要がある。
![IMG_0002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291089/4db0fe84-8e22-266d-56a5-beb316db40c2.jpeg)
【3D OD Stereo】Pseudo-LiDAR : StereoDepthでPoint Cloudの生成

<h1>Pseudo-LiDAR from Visual Depth Estimation: Bridging the Gap in 3D Object Detection for Autonomous Driving</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/674774f8-4240-f3bd-24c8-444540ae3d35.png)

Depth MapからPseudo LiDARはただの座標変換で計算できるので、今回はどうやってPseudo LiDARとImageで3D Object Detectionが出来るのかどうか見ていきたい。

<h1>新規性</h1>
<h2>3D Object Detection</h2>
LiDARで使われていたModelなら何でも良いらい
この論文で2種類のモデルを試した。
・Frustum-PointNet
・AVOD


<h2>Frustum-PointNet</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/3746d818-d157-333b-718f-04359cff1f93.png)
2D Object DetectionされたROIのPoint Cloudに対してPointNetを行う事で3次元BBを推定する方法。


<h2>AVOD</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/dbb938aa-f28d-5fe6-fe25-6ff3b929d2da.png)
Imageと3D Anchor GridとBEVのpoint cloudを入力にして、物体を検出する2Stage Detector
詳細は別の記事書きます。

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/57c5c6bb-325f-d1a0-b748-64018755b953.png)
もちろんLiDARを使ったNetworkより精度はかなり落ちるが、改善の余地はある。

1. Instance Segmentationを行いPoint CloudのFilteringをより正確に
2. Stereo Depthの精度を高める

StereoDepthがLiDARの精度を超える事は考えにくいが、点密度が高い事が貢献してくれればと思う。

<h1>結論</h1>
・Stereo Cameraでもそこそこの精度で3次元物体検出は出来る。

<h1>参考文献</h1>
Pseudo-LiDAR from Visual Depth Estimation:Bridging the Gap in 3D Object Detection for Autonomous Driving
https://arxiv.org/pdf/1812.07179.pdf
テンセントクラウドのバケット（COS）に静的サイトをServerless Framework経由でデプロイする

# まえがき

こちらのほぼ続きです。

**テンセントクラウドのバケット（COS）をServerless Framework経由で作成する**
<https://qiita.com/antk/items/4f1787304101f2e667a6>

上記で作成したバケットに静的サイトをデプロイします。

## ディレクトリ構成

必要最低限の構成としてはこんな感じ。

```
my-homepage
├── src
│   └── index.html
├── .env
└── serverless.yml
```



## デプロイ

`.env` の中身は↑の記事と同じでOK。
`serverless.yml` はこんな感じ。

```yml:serverless.yml
app: tencent-website
name: my-homepage
component: website

inputs:
  src:
    root: ./
    src: ./src
    index: index.html
    websitePath: ./
  region: ap-tokyo
  bucketName: 上記の記事で作ったバケット名
  protocol: http
```

htmlしかないような構成ならこれでいけるはず。

```terminal
serverless ⚡framework
Action: "deploy" - Stage: "dev" - App: "tencent-website" - Instance: "my-homepage"

region:  ap-tokyo
website: http://デプロイできたリンク

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

177s › my-homepage › Success
```

できました。
至らない部分もかなりありそうですが[ドキュメント](https://intl.cloud.tencent.com/jp/document/product/1040/36748)を読んで補完していただけると嬉しいです（ご指摘のコメントいただけるともっと嬉しいです）。
分析環境をシュッと用意する

# 概要
Jupyterのコマンドを覚えるのはだるいけど、職業上すぐに立ち上げて確認したい！ってことが多々あるので、コマンド表を用意していましたが、コマンドをコピペするのもだるくなってきたので、`alias`でシュッと立ち上がるコマンドを用意しようと思いました。

ローカルで使ってね。（公開した環境で使うのはもうちょっと考えてください）

# 環境　

- bashでもzshでも
- Mac OS Catalina

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H15
```

# で、できたのがこれ

```
$ launch_jupyter
[I 01:47:03.028 NotebookApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/notebook_cookie_secret
[W 01:47:03.338 NotebookApp] All authentication is disabled.  Anyone who can connect to this server will be able to run code.
jupyter_http_over_ws extension initialized. Listening on /http_over_websocket
[I 01:47:03.408 NotebookApp] JupyterLab extension loaded from /opt/conda/lib/python3.7/site-packages/jupyterlab
[I 01:47:03.408 NotebookApp] JupyterLab application directory is /opt/conda/share/jupyter/lab
[I 01:47:03.411 NotebookApp] Serving notebooks from local directory: /app
[I 01:47:03.411 NotebookApp] The Jupyter Notebook is running at:
[I 01:47:03.411 NotebookApp] http://6f0d7f19461f:8888/
[I 01:47:03.411 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[W 01:47:03.420 NotebookApp] No web browser found: could not locate runnable browser.
```

`pbcopy`と組み合わせているので、クリップボードには`http://localhost:xxxx`が乗っていて、ブラウザ開いてURLバーにペーストしたらjupyter画面が表示されるようになっています。


# 作り方

`~/.bashrc` か `~/.zshrc`へ下記コマンドを用意します。

```
alias launch_jupyter='export DPORT=$(expr $RANDOM % 100 + 10000); echo "http://localhost:${DPORT}" | pbcopy; docker run --rm -v $(pwd):/app -p ${DPORT}:8888 -it hoto17296/anaconda3-ja jupyter notebook --notebook-dir=/app/ --ip=0.0.0.0 --port=8888 --allow-root --NotebookApp.token='''
```

沖縄のDockerおじさんの @hoto17296 のDocker imageを使わせてもらっています。 `hoto17296/anaconda3-ja`

また、ホストとフォワードするポート番号は適当にランダムで出すようにしています。たまに使用しているポートにぶつかりますが、もう一度実行すれば大丈夫です（？）

あ、ちなみにDockerを使っているのは、ホストの環境を汚したくないからです。

# 雑感

aliasの名前はもうちょい短くてもいいかな〜って思っている
Tableau Dashboardをwebに埋め込む技術(Tableau Javascript APIとか)

この記事は[ちゅらデータアドベントカレンダー](https://qiita.com/advent-calendar/2020/churadata)の10日目の記事です。

# 概要
皆さんはTableauでデータ可視化ダッシュボードを作ったことなどありますか？
Tableauだけでダッシュボードを作成することはもちろん可能なのですが、複数間での画面遷移や、tableauの機能にはない実装をしようとすると、web上にtableau Dashboardを配置し、webからコントロールする必要が出てきます。
本記事では、webにTableau Dashboardを埋め込む際に必須なTableau Javascript APIの紹介及び、webに埋め込む際のTipsを紹介いたします。
また筆者環境ではVue.js環境にtableau dashboardを埋め込んでいます。

※ ここで言うTableau Dashboardとは、tableau server上やTableau Onlineに実装しているDashboardのことを想定していて、URLからアクセスできるものを想定しています。

# Tableau Javascript APIの紹介とwebへの埋め込み

tableau javascript apiはwebに描画したtableau dashboardをjavascriptからコントロールできるようにするためのapiで以下のような機能があります。

* Dashboardの描画
* Filter条件の変更
* PDF、画像、クロス集計表、データの出力
* パラメータの更新
* ワークブックタブの切り替え
* ユーザがtableau dashboardを操作した際のイベント定義

上記などの機能があります。

詳しくは以下チュートリアルを御覧ください。

https://help.tableau.com/current/api/js_api/en-us/JavaScriptAPI/js_api.htm

## チュートリアルで紹介されているwebに埋め込むコード
実際にwebに埋め込む際は以下のように実装していきます。

``` javascript
function initializeViz() {
  
  var placeholderDiv = document.getElementById("tableauViz");
  var url = "https://public.tableau.com/views/WorldIndicators/GDPpercapita";
  var options = {
    width: placeholderDiv.offsetWidth,
    height: placeholderDiv.offsetHeight,
    hideTabs: true,
    hideToolbar: true,
    onFirstInteractive: function (obj) {
      // 受け取った値に応じてsize変更する
      obj.$viz.setFrameSize(viewsize[0], viewsize[1]);
      workbook = obj.$viz.getWorkbook();
      activeSheet = workbook.getActiveSheet();
      // ダッシュボード全体のパラメータを変更
      workbook.changeParameterValueAsync(
        "year_set_parameter",
        targetyear_to
      ).then(console.log('parameter set with' + filters.targetyear_to))
      // filter定義の変更
      activeSheet.applyFilterAsync(
        "Year", year_arr, tableau.FilterUpdateType.REPLACE
      ).then(function(res){console.log(res)}, function(err){console.log(err)})
    }
  };
  this.viz = new tableau.Viz(placeholderDiv, url, options);
}      
```

上記のコードは初期表示だけに対応しますが、webからTableauのfilterやパラメータなどを更新したい場合もあるかと思います。
そのためvizオブジェクトは後から更新できるように、ダッシュボードごとに管理しておく必要があります。
また筆者環境ではVue.jsを使用しているため、コンポーネントごとで管理しています。

# webにダッシュボードを配置する際のTips集
## webに複数のダッシュボードを同時に貼り付けたのですが、いくつかのダッシュボードが全く表示されない
以下のように、setFrameSizeを実行することで筆者環境では解決されました。

``` javascript
obj.$viz.setFrameSize(viewsize[0], viewsize[1]);
```

## Tableau Dashboard上では横に並べてDashboardを作っているが、webに埋め込むとレイアウトがずれてグラフが縦に並んでしまう
表示するURLに明示的に```:device=desktop```というオプションをつけることで解決しました。
【変更前】https://public.tableau.com/views/WorldIndicators/GDPpercapita?:language=ja&:display_count=y&:origin=viz_share_link
【変更後】https://public.tableau.com/views/WorldIndicators/GDPpercapita?:language=ja&:display_count=y&:device=desktop&:origin=viz_share_link

# まとめとか、所感とか
webにTableauを埋め込むということをここ２ヶ月ほどやっておりますが、正直あまりおすすめできるものではありません。
Tableau Javascript APIも開発時のエラーとしてほとんど何の情報も出ないのでデバッグ作業がしんどかったり、そもそもTableauがgit管理などできるようなものではないので管理が大変だったりします。
おすすめはしないですが、必要に迫られた場合は参考にしていただければ幸いです。
Git GUIでファイルを指定して変更を破棄する


Git GUIでファイルを選んで変更を破棄したい。
Git GUIでファイル名毎の変更差分を見ていらなかったら、そこで変更をなかったことにしたい。
コマンドだとこんな感じのこと

```bash:やりたいこと
$ git checkout HEAD {変更をなかったことにしたいファイル名}
```

SourceTreeだとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/5b226f2c-94f1-d9b7-160d-1382dda77779.png)

# コミットしていない変更を全部破棄したい
1. [ブランチ] > [リセット・・・]

# ファイルを指定して破棄したい
コマンドについて書いた後に知った・・・メニューにあった・・・しかも`Ctrl + J`のショートカット付き

1. ファイルを選択 > [コミット] > [変更を元に戻す]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/bc4efb4f-8402-068f-cf7c-68076892b763.png)

## 破棄コマンドを設定する(メニューにあるから不要)
参考 : [git — Git Guiでファイルの変更を破棄するにはどうすればよいですか？](https://www.it-swarm-ja.tech/ja/git/git-gui%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%9B%B4%E3%82%92%E7%A0%B4%E6%A3%84%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1042850028/)

1. Git GUIを起動
2. [ツール] > [追加]でダイアログ表示
3. コマンドに`git checkout $REVISION -- $FILENAME`を設定する
4. 後は手ごろに設定する
5. [追加]ボタンで追加する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/5615d006-f3ca-749f-12e7-fb451418bbfe.png)

### 変更を破棄する
1. [コミット予定に入っていない変更] > ファイル選択
2. 変更差分を確認、うん、いらない
3. [ツール] > 設定したコマンド > 破棄される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/2359d3b4-9e4c-9806-abbf-9877af2dcbaa.png)
自前EDR その6

#概要

vistaにedrを構築する。
集めた情報で、ウィルスを特定する。
合わせて、削除方法を収集する。

#ipa

２０１４年まで、あった。
https://www.ipa.go.jp/security/isg/zha.html


#MicroSoft

https://www.microsoft.com/en-us/wdsi/threats

#TRENDmicro

https://www.trendmicro.com/vinfo/jp/threat-encyclopedia/malware

#Kaspersky

https://threats.kaspersky.com/ja/


#Broadcom

https://jp.broadcom.com/support/security-center/a-z


#Symantec

https://www.symantec.com/ja/jp/security-center

#Mcafee

https://www.mcafee.com/enterprise/ja-jp/threat-center.html

以上。
【3D OD Stereo】Realtime 3D : TraditionalなCluteringを使った3D 物体検知

<h1>Realtime 3D Object Detection for Automated Driving Using Stereo Vision and Semantic Information</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/0b329dc7-5f89-9148-6ab5-75d9643c3f99.png)
画像による3次元物体認識を見つけたので、読んでみたいと思う。


<h1>Pipeline</h1>
・DisparityをLeft Right ImageからBlock MAtchingで推定する
・Semantic Segmentationと2D Object Detectionを左の画像から行う
・2D BB + semantic info + Disparityを使いClusteringする
・3次元に変換し、Grid Mapの解像度にdownsampleする。
・得た3次元pointのclusterから3D BBを推定する

<h2>clusteringの方法</h2>
あまり詳細は書いていなかったが、2D BB内にあるpixelに対してDisparityの連続性とSemantic Mapの物体のConfidence ScoreをThresholdにしてFilterlingしてるらしい。そうすると物体だけがClusterされるはず。

<h2>3D BBの推定</h2>
Orientationとサイズはどうやら得たCluster内のPointを普通にTraditionalな方法でShape Fittingしているらしい。
例えばOpencvのFuctionのMinAreaRect()や車等であればL-shape fittingも使える。

<h1>結論</h1>
・DeepLearningを使った3D Object Detectionを期待していたのだが、筆者が決めたThreshold等を決めてFilteringとFittingを行っていただけであった。
・10Hzで動くのは素晴らしい

<h1>参考文献</h1>
・Realtime 3D Object Detection for Automated Driving　Using Stereo Vision and Semantic Information
https://www.mrt.kit.edu/z/publ/download/2019/Koenigshof2019Objects.pdf
MySQLのユーザ一覧を表示する

# 目的

- MySQLのユーザ一覧を表示する方法をまとめる

# 前提条件

- MySQLのrootユーザの認証パスワードがわかること。(MySQLのrootユーザのパスワードを失念してしまった方はこちら→[Mac ローカル環境の MySQL 8.x のrootパスワードを忘れた時のリセット方法](https://qiita.com/miriwo/items/1880e9d2ebcfd3c0e60d))

# 前提情報

- 筆者はMacに立てたMySQLで本記事の内容を検証している。（rootユーザのパスワード入力を求められたら入力しEnterを押下する。）

# 詳細

1. 下記コマンドを実行してターミナルからMySQLにログインする。

    ```terminal
    $ mysql -u root -p
    ```
1. 下記SQLを実行する。

    ```sql
    select User from  mysql.user;
    ```
Amazon Lookout for Equipmentについて調べてみた

# はじめに

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

今回はAWS が開催する re:Invent 2020 で発表された Amazon Lookout for Equipmentについてどんなサービスなのか調べてみました。

#  Amazon Lookout for Equipmentとは
今回のre:InventではAmazon Monitronなど多くの産業や製造業界で特に活躍が見込めるサービスが多く発表されました。
その中で今回はAmazon Lookout for Equipmentに焦点をあてて紹介したいと思います。
Amazon Lookout for Equipmentは API ベースの機械学習 (ML) サービスで機器の異常な動作を検出する事が可能です。
モデルごとにセンサーやアクチュエータといったコンポーネントから、データタグを最大300個まで設定できるようです。

また分析した結果を既存のモニタリングソフトウェアやAWSIoT SiteWise Monitorに統合して、リアルタイム出力を視覚化したり、アラートを受信することもできます。

![Product-Page-Diagram_Amazon-Lookout-for-Equipment@2x.63a83a31ba33f62411a5b58821b0ebacf3a252eb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323405/bfd3b3c8-b871-675b-ed9a-2bc33993e98a.png)



# 使い方
Lookout for Equipment は下記の5つのステップで利用できます。

1.S3 バケットにデータをアップロードする
2.データセットを作成する
3.データを取り込む
4.モデルを作成する
5.推論をスケジュールする (リアルタイム分析が必要な場合)

Amazon Lookout for Equipmentのプレビュー版は、2020/12/10時点で米国東部 (バージニア北部)、アジアパシフィック (ソウル)、および欧州 (アイルランド) のリージョンで利用可能です。

# 料金体系
Lookout for Equipment の費用は取り込んだデータ量、モデルをトレーニングした時間、作成したモデルを使用した時間で発生します。

Data Ingestion	$0.20 per GB
Model Training	$0.24 per training hour
Scheduled Inference　$0.25 per inference hour

【参考URL】
https://aws.amazon.com/jp/lookout-for-equipment/pricing/


# おわりに
専門家知識なしで機械学習モデルを作成することができるので敷居がぐっと下がった気がしますね。
その他新しいサービスアップデートも発表されているので今後も動向が気になります。
jQueryがデプロイ後（AWS）反映されていないとき

#はじめに

転職活動用のポートフォリオを作成中です。非同期いいね機能をjQueryを用いて実装し、ローカル環境で正常に作動したため、本番環境にデプロイしたところ、非同期にならない事象が発生しました。

##前提

Rails '6.0.0'
AWSのACMを使用して、https接続を実装済み

##仮説

はじめにデプロイの方法が間違っているのかと思い、EC2の再起動などを行いましたが、結果は変わらず。しかしここで同期でいいね機能は稼働していたため、非同期の役割をになっているjQueryの読み込みが本番環境ではできていないものと検討をつけました。

##結論

httpsによるSSL暗号通信下の環境でjQueryの読み込みができていなかった。

修正前

```ruby:app/views/layouts/application.html.erb
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
```

修正後

```ruby:app/views/layouts/application.html.erb
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
```

上記のように修正前はjQuery読み込みのURLをhttpにて記述していたため、反映されていなかった。

##その他の対処法

後々調べてみると、一般的で汎用性が高い方法は、httpの部分（プロトコル）を指定しない方法でした。

```ruby:app/views/layouts/application.html.erb
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
```
アクセシビリティ対応はじめの一歩

※この記事は 「[Webアクセシビリティ Advent Calendar 2020](https://adventar.org/calendars/5001)」 11日目の記事です。

## はじめに
「アクセシビリティ対応に関心はあるけれど、何からはじめて、どうやって実践していけばいいんだろう？」という人は多いのではないでしょうか。
かくいう私もその一人なのですが、「取り合えず分からないなりに準備したこと・やってみたこと」をまとめてみました。

もし「こうしたほうがいいよ」「こんなこともするといいよ」「このプラグインおすすめ！」などのご意見がありましたら、ぜひコメントで教えてください！

## ①普段のマークアップを振り返る
普段から注意を払っていたことではありますが、「どのタグを使うか？」「文書構造と見た目の順序の折り合いをどうつけるか？」など、改めて考えるようにしました。
特に文書構造と見た目の順序は、flexbox や grid の登場でかなり融通がきくようになったので、最近は見た目のために自然な文書構造を諦める場面が減りました。頑張ればIE対応もできますし……。いい時代になりましたね。
また、長年何を設定するべきか模索していた alt についても、自分の中で何となく結論が出ました。ざっくりとですが、今のところ下記のようなオレオレガイドラインでやっています。

- 「バナー：」「写真：」「イラスト：」などの接頭辞をつける
- 画像内のテキストは基本的に全て盛り込むが、順序には配慮する（重要な情報はなるべく先頭へ）
- 空altにするのは「そこに画像が存在する」という情報自体が無くても支障がない場合のみに限る

## ②NVDAを導入する
読み上げソフトを利用している場面は動画等で見たことがありますが、自分が書いたコードがどうなるのかは知らなかったので、実際に使ってみました。
支離滅裂だったらどうしようと不安でしたが、マークアップがしっかりしていれば問題なさそうで安心しました。
しかし、ハンバーガーメニューやアコーディオンなどの操作ありきの箇所や、もう少し補足説明が欲しい部分など、今まで通りでは少し足りない箇所はいくつかありました。プレーンに組んだ table の読み上げなんかは想像以上にしんどくて、実際に使ってみないとわからないものです。
一度でもいいので、自分が作ったサイトの読み上げは体験したほうが良いと思いました。

## ③簡単なところから支援技術を使ってみる
②で浮き彫りになった課題を解決する方法は、きっとたくさんあると思います。
ただ、それらを「調べる」という最初のフェーズだけでも大変です。毎回全部実践するのも、相当なパワーが必要です。

なので、まずは「すぐ理解 / 実践できそう・覚えられそうなもの」を実践するようにしています。
例えば装飾のための英単語の部分に `aria-hidden="true"` を付けるとか、複雑な table を組んだときは scope 属性を付ける[^※]とか……。
そうやって少しずつ「わかる・使える技術」を増やすのが良いのかなと思います。

## ④上手にプラグインを頼る
モーダルウィンドウのような自力での対応が困難なUIや、ブラウザの対応状況が芳しくないプロパティなどは、プラグインを使うことで対応が楽になります。

個人的によくお世話になっている（なっていた / これからお世話になる）のは以下のプラグインです。

**[what-input](https://github.com/ten1seven/what-input)**
クリックやタップ時はフォーカスインジケータを非表示に、キーボード操作をしているときは表示するように、みたいなことができるようになるプラグインです。
導入方法などについては、少し古い記事ですが下記が分かりやすいです。
[もうoutlineを消さない。クリック・タップ・キーボードのイベントを判定してくれるJSライブラリ「what-input」](https://www.tam-tam.co.jp/tipsnote/html_css/post16551.html)

**[modaal](https://humaan.com/modaal/)**
モーダルウィンドウのプラグインです。
オプションが結構充実しており、スタイルがある程度用意されていて便利だったのですが、随分長い間更新が止まっているようです。jQuery依存、かつ新しいバージョンでのテスト状況に不安が残っているなど、今オススメできるかというと……うーん……（こういうところがプラグインの怖いところですね）。なので、参考程度に捉えていただければと思います。
代わりにと言ってはなんですが、[5日目担当のTAKさんの記事](https://zenn.dev/tak_dcxi/articles/f958e96888ee47) で紹介されていた **[Micromodal.js](https://micromodal.now.sh/)** が良さげな雰囲気なので、今後はこっちを使っていこうかなと思っています。

## 次の一歩はどうするか？
この「じゃあ次どうする？」が今いちばん感じている課題です。
常日頃から情報を追っていくのは当然として、知見のある人に教えてもらう・ノウハウを共有してもらう場や、同じ初心者でライトに話し合える場があると良いなあと思っています（それゆえこうしてQiitaに記事として書いているわけですが）。
あるいは、身近にそういう人を増やすべくアクセシビリティへの興味関心を持ってもらえるようにアクションしていくのが良いのか……。

道のりはまだまだ険しそうですが、ひよっこなりに今後もアクセシビリティ対応を頑張っていきたいと思います。

[^※]: 参考：https://developer.mozilla.org/ja/docs/Web/HTML/Element/table#Accessibility_concerns
Sequel Pro/AceでテーブルをフォーマットしてコピーするBundle

#　はじめに
macOS 用の MySQL クライアントとして Sequel Pro/Aceを業務上よく使っています。
テーブルをコピーして貼り付けたときにテキストテーブルとして整形できなくて不便だったので、きれいに整形するようにBundle（プラグインのようなもの）を作りました。
Sequel ProのContributed Bundlesにも同様のBundleがありますが、日本語対応していません。
等幅フォントであればテーブルの罫線がズレずにきれいに整形できます。
罫線が少しずれますが、SlackやTrelloへの貼り付けにも使えます。

##　使用手順
こんな感じでテーブルを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631893/f570c9df-7168-658e-20e5-528dab6a50f9.png)

BundleはBundleエディットから自分で作成するか、インポートできます。
今回作成したBundleは[Github](https://github.com/kobayashi-masayuki/SequelProCopyAstextile.git)にて公開しておきますので、ダウンロードしてお使い頂けます。

インストールは簡単で、CopyAsTextile.spBundleをダブルクリックするだけで、Bundleに追加されます。 

テーブルや検索結果を選択し、メニューから「バンドル > CopyAsTextile> 」を選択するとコピーされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631893/0e4ee3bd-c9a8-3dd9-f61f-0d0d777f7b1f.png)

BundleからコピーしてVim等の等幅フォントのテキストエディットに貼り付けると、以下の例のように整形できます。
テキスト表として整形して残したい時に便利です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631893/5a832291-c6c4-2a0a-ab6b-62047d97d7bd.png)
PHPの基本関数！別ファイルを呼び出す方法[修正が楽になる]

##はじめに
WEBサイトを製作する際、複数ページありますよね。
同じコードを何度もベタ書きしてないですか？

例えば
「ヘッダー」や「メニュー」や「サイドバー」や「フッター」とかとか、、、

他でも使いまわせる部分は「example.php」とかにして
それを別ファイルに読み込んでくるようにすると

修正があっても
「example.php」ファイルを編集するだけで読み込んでいる全ページに反映されます。

##PHP関数
主に下記の２通りの方法があります。

「include」or「require」関数を使います。

###include関数

```php:php
<?php include("ファイルのパス"); ?>
```
###require関数

```php:php
<?php require("ファイルのパス"); ?>
```



ファイルパスのところは
ご自身の環境に合わせて下さい。


以上！！
ではよきエンジニアライフを！
SubstanceDesignerからPhotoshopにテクスチャを送る

この記事は[Takumi Akashiro ひとり Advent Calendar 2020](https://qiita.com/advent-calendar/2020/takumi_akashiro "ひとり Advent Calendar 2020")の11日目の記事です。

[昨日 (PythonからCOMオブジェクトを扱う - Qiita) ](https://qiita.com/takumi_akashiro/items/6fcb03934b649e444888)に引き続き、
今日はSubstance DesignerからPhotoshopへ出力したテクスチャを送ります。

昨日と同じネタを擦るな！と灰皿が飛んでくるかもですが、
便利そうで、出来そうなことはなるべくやるのが私のモットー(?)なのでやります。

それに、今後の仕事で必要な瞬間が来る予感がしますし。

## とりあえず作る

テクスチャをtempフォルダに書き出して、
Photoshopで開き、開いているドキュメントのレイヤーにコピーして、閉じるだけです。

特にそれ以外は技術的に解説することはないので、とりあえず作ります。

```python
import gc
import pathlib
import tempfile

import sd
from PySide2 import QtWidgets

# 拡張モジュール。詳細は昨日の記事参照。
import comtypes.client

def get_photoshop_client():
    client = comtypes.client.GetActiveObject("Photoshop.Application")
    if client:
        return client
    else:
        return comtypes.client.CreateObject("Photoshop.Application")

def is_exist_document(client):
    return bool(len(list(client.documents)))

# def get_output_size():
#     出力するテクスチャ解像度を取得する
#     NOTE:
#           当初はテクスチャ解像度を取得して、ドキュメントがなければ生成、
#           既に開かれていれば、Photoshopの開いているドキュメントのサイズと比較、
#           違ったらconfirmDialogを出すとかやりたかった。倍解像度で送ってリサイズ…とかする人もいるので不要かもだが。
#           だが、テクスチャ解像度をピクセル単位で取得するすべが分からない……ので断念。
#           Relativeの元の値はどこに格納されてンだよ…
#     pass

def export_texture_to_temp_folder(sd_graph):
    export_path = tempfile.gettempdir()
    sd.tools.export.exportSDGraphOutputs(sd_graph, export_path, 'png')
    path = str(pathlib.Path(export_path) / (sd_graph.getIdentifier() + "_output_0.png"))
    return path

def send_texture_to_photoshop(ps_client, path):
    document = ps_client.activeDocument
    ps_client.open(path)
    ps_client.activeDocument.artLayers[0].duplicate(document)
    ps_client.activeDocument.close()

def main():
    ps_client = get_photoshop_client()

    sd_app = sd.getContext().getSDApplication()
    sd_uimgr = sd_app.getQtForPythonUIMgr()
    sd_graph = sd_uimgr.getCurrentGraph()

    # sd_size = get_output_size()

    if is_exist_document(ps_client) is False:
        print(is_exist_document(ps_client))
        sd_mainwindow = sd_uimgr.getMainWindow()
        message = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning, "TextureSender", "Photoshopでドキュメントを開いてから実行してください", parent=sd_mainwindow)
        message.show()
        return

    texture_path = export_texture_to_temp_folder(sd_graph)
    send_texture_to_photoshop(ps_client, texture_path)

    del ps_client
    gc.collect()


main()
```

![11_01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294868/158b6fb1-6f55-c4e8-3937-1411af8ec216.gif)

結構いい感じですね！

## 締め

SubstanceDesingerのPythonモジュールは叩いて2日ぐらい[^1]でしたが、どうにかそれっぽくはなりましたね！

……Outputノードが複数あるときの挙動とか、OutputNodeの名前を直書きしてるとか、
前に送った奴はレイヤー名とかロック状態とか参照して消したいとか、いろいろ思うところはありますが、
時間が全く足りないので今回はここまでで！

では！

## 参考
[【SubstanceDesigner】Pythonでテクスチャを出力｜三味松ブログ](https://shamimatsu.com/substance-designer-texoutput/)

[^1]: 正味6時間ぐらい？先人のおかげで10分ぐらいでテクスチャは出力出来て、内4時間ぐらいはテクスチャサイズの取得に使ってた。<br>SDPropertyが理解できたのは収穫だった。
ml5.jsを知っているかい？


# はじめに

@makky0620 くんが [ビデオツールなどの背景機能をReactとTensorflow.jsで再現してみる](https://qiita.com/makky0620/items/ff3a709fef8887225de0) という記事を書いていました。
まぢすごい:relaxed:まぢ尊敬:relaxed:と思うような内容でしたが、
ちょっと僕には量子？モデル？よく分からん!というところも…

![スクリーンショット 2020-12-10 19.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314548/377a40fe-3e1e-7bbd-e7c2-e10ed884c365.png)

# そんな私にml5.js

> ml5.jsはアーティストやクリエィティブ・コーダー、学生などの幅広いユーザーが機械学習を親しみやすく触れるられるように作られたライブラリです。TensorFlow.js がベースになっています。また、p5jsからの影響を受けて制作されています。

https://ml5js.org/

つまりはTensorFlow.jsをさらに使いやすくしてくれたライブラリ。

# 実際に使ってみる

今回はml5.jsが提供している機能の中でも、体の部位の座標を取得してくれる **poseNet** を使ってみます。

ml5.jsを利用するにはCDNを書くだけ。

```html
<script src="https://unpkg.com/ml5@latest/dist/ml5.min.js"></script>
```

## 実装してみる
### モデルのロード

```js
function setup() {
  createCanvas(windowWidth, windowHeight);
  video = createCapture(VIDEO);
  video.hide();
  picture = loadImage('./sample.png');

  poseNet = ml5.poseNet(video, modelReady);
  poseNet.on('pose', gotPoses);
}

function modelReady() {
  console.log('model ready');
}
```

今回は画面の描画にp5.jsを使っています。
`ml5.poseNet()`の引数に対象のVideo Element とロード後に実行される関数を渡しています。
`poseNet.on('pose', gotPoses);`で新しいポーズが検出されるたびに`gotPoses()`が実行されます。
`gotPoses()`で取得したオブジェクトを利用していきます。

### 座標の取得
```js
function gotPoses(poses) {
    if (poses.length > 0) {
        let pose = poses[0].pose;
        eyelX = pose.leftEye.x;
        eyelY = pose.leftEye.y;
        eyerX = pose.rightEye.x;
        eyerY = pose.rightEye.y;
    }
}
```

poseオブジェクトを取得したらそれぞれの体の部位のオブジェクトの（x,y）座標を取得します。今回は右目と左目の座標を取得してみます。
取得したオブジェクトは下記のような構造をしています。
`leftEye`などの利用できる体の部位は17種類あるみたいです。

```text
[
  {
    pose: {
      keypoints: [{position:{x,y}, score, part}, ...],
      leftAngle:{x, y, confidence},
      leftEar:{x, y, confidence},
      leftElbow:{x, y, confidence},
      ...
    }
  }
]
```

### 描画する
```js
function draw() {
    d = dist(eyerX, eyerY, eyelX, eyelY) / 100;
    image(video, 0, 0);

    image(picture, eyelX - widthOfPicture() / 2, eyelY - heightOfPicture() / 2, widthOfPicture(), heightOfPicture());
    image(picture, eyerX - widthOfPicture() / 2, eyerY - heightOfPicture() / 2, widthOfPicture(), heightOfPicture());
}
```
`image()`の第２引数と第３引数に表示したい画像の座標(x,y)を渡すので、ここに取得した目の座標を渡します。(画像の中心に目が来るように画像の幅・高さの半分をずらすように書いてます)

## 完成物
![dsem4-gxb3y.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314548/fc10099c-ab14-48cb-7590-e47ad331a2d2.gif)
サンプル
https://ta9ma0k.github.io/

簡単にできた:hugging:おためしを！

# 参考
https://www.youtube.com/watch?v=EA3-k9mnLHs
サーバ上の GitHub ログインを VSCode にて行う

# サーバ上の GitHub ログインを VSCode にて行う

サーバ上で個人アカウントにより `git pull` などを行う必要があったのでその対応です。

## [個人アクセストークンを使用する](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token)

自分のアカウントは 2 段階認証が行われており、 [個人アクセストークンを使用する](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) 必要があります。

しかしアクセストークンはパスワードのように使用しますが、以下のような値であり、
![personal-access-token.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116435/c27914b3-1f81-40e2-b734-bace8ddefb51.png)
実際に使用するとなるとどこかに保存しておき、都度コピペを行うような形になってしまいます。
(いい方法があるのかもしれませんが)

※画像は [個人アクセストークンを使用する](https://docs.github.com/ja/free-pro-team@latest/github/authenticating-to-github/creating-a-personal-access-token) の切り抜きです。

## VSCode で Remote Development を使用してログイン

これまでの作業においてサーバ上での操作には VSCode の [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack) を使用していました。

そのターミナル上で `git pull` を行ったところ、以下のような表示が
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116435/f028cb5a-589a-9c72-2ad8-e96fd4a88343.png)

`Allow` をクリックするとブラウザにて以下の画面に
ここは GitHub でのログイン状態などで変わるかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116435/c36a8cf2-9a82-620a-be52-b7c7f7ab55ca.png)

さらに `Continue` をクリックで以下の画面に
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116435/a06f4c77-6850-c0bd-6b04-b201ca7b1d85.png)

`Visual Studio Code を開く` をクリックで VSCode に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116435/ecb41681-c4fb-ff81-29c7-fd3e74d744cd.png)

上記のダイアログにて `Open` をクリックして `git pull` を行ったところ、

```bash:git-pull
～$ git pull origin master
From https://github.com/リポジトリ
 * branch            master     -> FETCH_HEAD
Already up to date.
～$ 
```

やったぜ。
アクセストークンなどを指定することなく `git pull` ができました。
CentOS8にインストールしたRcloneでGoogleDriveに対してダウンロードとアップロードなど

#前の記事
[CentOS8にRcloneインストールしてGoogleDriveの特定フォルダの中身表示するとこまでやるん](https://qiita.com/waokitsune/items/2d1efe540d8209432808)


#まずはダウンロードしてみるぞい
GoogleDriveの『test』フォルダーの中身を、CentOSの『/share/yurukyan/』にダウンロードするコマンドです。
（『GoogleDriveSync』はあたいがrcloneの接続設定を作る時に付けた任意の名前です）

```sh:コマンド
rclone copy GoogleDriveSync:/test/ /share/yurukyan/
```
『test』内にあるサブフォルダ内のファイルもダウンロードされます。
ただし、空のフォルダーはダウンロードされません。

ダウンロード先に同名ファイルがあった場合は **上書き** されます。


#お次はアップロードです
ダウンロードコマンドの『元』『先』を **てれこ** させただけです。

```sh:コマンド
rclone copy /share/yurukyan/ GoogleDriveSync:/test/
```
挙動もダウンロードの時と同じです。


#同期もやってみよう
同期の前に注意点！
例えばGoogleDrive側がこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/90612c4f-dc2e-8255-ab9b-1797333acf5c.png)
CentOS側がこう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/dc99ec69-af2f-fa13-0f4d-8b2aef1cbfd4.png)
この状態で下記の同期コマンドを実行したらどうなるか…

```sh:コマンド
rclone sync GoogleDriveSync:/test/ /share/yurukyan/
```
こうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/45bd9562-c02b-8c69-cf5e-77668d2c8634.png)
『hogeee』フォルダーと『unyaa』ファイルが **消えました** 。

```sync``` はこんなことをします。
1. 同期 **元** と同期 **先** を比較
2. 同期 **元** に無いファイルやフォルダーは同期 **先** から **削除**

大事なファイルを消さないようにテストフォルダー作って試しましょい！


#パスに日本語（2バイト文字）が含まれる時は
シングルクオテーションで囲うのです。

```sh:コマンド
rclone sync GoogleDriveSync:'/ゆるきゃん/' /share/yurukyan/
```


#蛇足
接続設定さえ作ってしまえば、比較的簡単なコマンドでGoogleDriveとファイルのやりとりができまする。
インストールも含めてこういった手軽さがrcloneの魅力かなと思いまする。

下記と組み合わせれば『おうちのファイルサーバーをGoogleDriveに自動バックアップ』とかできまする。
[CentOSで定期（繰り返し）実行したいさー](https://qiita.com/waokitsune/items/6197d4f74098ecd9280c)


#バージョン
CentOS Linux release 8.2.2004 (Core)
rclone v1.53.3
フォルダの一覧を取得


## 概要

- [VBA フォルダの一覧を取得](https://www.tipsfound.com/vba/18022)をもとに階層が深くなるごとに`>`を増やしていくようにアレンジした。
- フォルダ名を出力して、そのセルにハイパーリンクを付与する
- `検索対象フォルダパス`に検索対象のフォルダパスを貼って実行する
- `出力列`,`タイトル行`の設定もお好みで

出力結果はこんな感じ
![スクリーンショット 2020-12-11 054206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/00eee030-7573-8e3e-df67-0893075d28d8.png)


## コード
``` vb

Option Explicit

Dim cnt As Long
Const 出力列 = 1
Const タイトル行 = 1
Const 検索対象フォルダパス = "C:\Users\R\Desktop\新しいフォルダー"
  
Sub Test()
  Cells.Clear
  cnt = 0
  Call フォルダの一覧を取得(検索対象フォルダパス, 0)
End Sub

Sub フォルダの一覧を取得(Path As String, n As Long)
    
  Dim fso As FileSystemObject
  Set fso = New FileSystemObject ' インスタンス化
  
  Dim pfl As Folder
  Set pfl = fso.GetFolder(Path) ' 親フォルダを取得
  
  With ActiveSheet.Hyperlinks
    Dim fl As Folder
    Dim buf As String
    For Each fl In pfl.SubFolders ' サブフォルダの一覧を取得
        cnt = cnt + 1
        'メイン処理：フォルダ名の出力とハイパーリンクの付与
          buf = WorksheetFunction.Rept(" >", n) & " " & (fl.Name) ' フォルダの名前 (TipsFolder) など
          Cells(cnt + タイトル行, 出力列) = buf
          .Add Anchor:=Cells(cnt + タイトル行, 出力列), Address:=(fl.Path)
        'サブフォルダがなくなるまで繰り返す
          Call フォルダの一覧を取得(fl.Path, n + 1)
    Next
  End With
  
  ' 後始末
  Set fso = Nothing
End Sub

```
Flutterアプリがクラッシュした時にエラー内容をSlackに投稿する仕組みを実装する

この記事は[Flutter #1 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/flutter)の9日目の記事...の予定で書いてたのですが、公開が間に合わず他の方が9日目の記事を書いてくださっていたので、Advent Calendarは関係なくなりました😇

私が開発に関わっているAndroidアプリでは、開発版アプリでクラッシュが起きた際に、エラー内容や端末情報を特定のSlackチャンネルに投稿する仕組みをよく作ります。
Androidアプリであれば、`Thread.setDefaultUncaughtExceptionHandler`等を使ってアプリがクラッシュした際それをハンドリングして、任意の処理を行う実装ができます。
その辺の詳細については、「[Androidアプリ開発で例外の発生した場所を特定する](https://dev.classmethod.jp/articles/android-app-exception/)」の記事などを読むといいかと思います。

今回は、これと似たものをFlutterアプリで実装する方法を紹介します。
サンプルコードをGitHubで公開していますので、合わせてどうぞ。
https://github.com/operando/send_fultter_error_to_slack

## そもそもなぜクラッシュをハンドリングして、エラー内容をSlackに投稿するのか

開発版アプリは社内の色んなメンバーが日々触るので、誰かの手元で起きたクラッシュのエラー内容を見逃さない仕組みが必要だと思ってます。
Slackに投稿すれば、私はそれなりに気づくことができるので、そんな感じの仕組みをアプリに実装して運用しています。


## Flutterのエラーハンドリングを理解する

以下 2つの公式ドキュメントが参考になりました。

- [Handling errors in Flutter](https://flutter.dev/docs/testing/errors) 
- [Report errors to a service](https://flutter.dev/docs/cookbook/maintenance/error-reporting) 

クラッシュが起きた時に、それをハンドリングして任意の処理を実行することができそうなのがわかりました。

## エラーハンドリングして、エラー内容をSlackに投稿する

以下のようにmain関数でエラーハンドリングの実装し、クラッシュが起きた時にそれをハンドリングしてエラー内容をSlackに投稿します。

```dart
void main() {
  runZonedGuarded<Future<void>>(() async {
    WidgetsFlutterBinding.ensureInitialized();
    FlutterError.onError = (FlutterErrorDetails details) async {
      FlutterError.dumpErrorToConsole(details);
      if (kDebugMode) {
        await sendError(details.exceptionAsString());
      }
      exit(1);
    };
    runApp(MyApp());
  }, (dynamic error, StackTrace stackTrace) async {
    if (kDebugMode) {
      await sendError(error.toString());
    }
    exit(1);
  });
}

Future<void> sendError(String text) async {
  final response = await http.post('https://slack.com/api/chat.postMessage?channel=XXXXX&text=$text',
      headers: { "Authorization": "Bearer XXXXXX" });
  print('Response status: ${response.statusCode}');
  print('Response body: ${response.body}');
}
```

`kDebugMode`を使って、アプリがデバッグモードで動作してる時だけエラー内容をSlackに投稿するようにしてます。
今回の実装では送っているエラー内容は簡素なものですが、実装次第では端末情報などもっと詳細な内容を含めることもできると思います。

ちなみに、エラーハンドリングの実装自体がわかれば、Slack以外のサービスにに投稿したりなど、色んなことができると思います。
例えば、GitHubにエラー内容のissueを作るとかもできると思います。


## 実際に動かしてみる

アプリにエラーハンドリングを実装し、ボタンを押すとクラッシュが起きるようにして実際に動かしてみます。
以下のようにアプリがクラッシュすると、エラー内容がSlackに投稿されます。

![send_flutter_error.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43637/0901bb7a-3b6d-279a-6cd1-5c537fd59c67.gif)


## おまけ : Catcher

今回紹介したようなエラーハンドリングをして、エラー内容をなんか色々する[Catcher](https://github.com/jhomlala/catcher)というライブラリを見つけました。
このライブラリを使うと自前でエラーハンドリングする実装が省けます。
また、ハンドリングしたエラー内容を様々な方法でレポーティングする仕組みがライブラリで用意されています。
例えば、[Slack Handler](https://github.com/jhomlala/catcher#slack-handler)があったりするので、これを使えばSlackに投稿する実装はライブラリに任せることができるので、実装がとても楽になります。
【Java】文字リテラル

# Javaの文字リテラル

についてまとめました。

## 文字列リテラルと文字リテラルの違いとは？

簡潔にまとめると以下の違いです。

### 文字リテラル

- char 型で使用する
- シングルクォーテーション「 ’」で囲む
- 1 文字を表現する

### 文字列リテラル

- String型を使用する
- ダブルクォーテーションで囲む
- 複数の文字のまとまりを表現する

## 【文字リテラルとは】

文字リテラルは一つの文字の値です。「a」や「あ」などが文字リテラルになります。

### 文字リテラルの書き方

文字リテラルを表すにはシングルクォーテーション(')で囲んで表現します。

```java
char a = 'a';
char b = 'あ';
```

以下のようにシングルクオートの中が空っぽであったり、文字列だったり、nullが入力されているとエラーになる。

```java
char a = '';
char a = 'あいうえお';
char a = null;
```

## Unicode

コンピュータ内部では文字ひとつひとつに数値が割り当てられていて、この文字に対して割り当てられた数値のことを文字コードと呼んでいる。

文字コードには色々な業界規格があり、Javaはそれら規格の中でUnicodeを使っている。

### Unicodeとは

Unicodeは「符号化文字集合」と言われ、世界中の文字に対して、番号が割り当てられ管理されている集合体のこと。ここで割り振られている番号のことをコードポイントと言います。コードポイントは符号位置（文字集合内の文字の位置）であって、符号化方式ではありません。コードポイントは16進数表示で頭にU+を付けて用いられる。

Javaでは以下のように「\u」の接続詞の後ろに16進数4桁をつけシングルクォートで囲って表現する。

```java
public class Main {
    public static void main(String[] args) {
        char d = '\u30A2';
        System.out.println(d);
    }

}
```

```java
ア
```

## char型を変数に数値を代入する

上記のような特性から、char型を変数には0 ~ 65535までの数値を代入できます。下記はアルファベットのAを表示するプログラムです。

```java
public class Main {
    public static void main(String[] args) {
        char e = 65;
        System.out.println(e);
    }

}
```

```java
A
```

## プリミティブ型にnullの代入は不可

nullは参照型変数が何も参照しないことを表現するためのデータのため、char のようなプリミティブ型の変数は値を保持するものであるため、参照を保持できない。

つまり nullを格納することが出来ないということ。

## 【まとめ】

Silver試験の対策としては以下を抑える。

- charは 1文字を表現する
- char型の変数にはダブルクォーテーションで囲った文字リテラルは代入できない
- 文字リテラルにnullは代入できない
- char型を変数には0 ~ 65535までの数値を代入できる

## 参考文献・記事

[Java 基礎知識( データ型 )【 Okapi Project 】](http://www.okapiproject.com/java/java_ref/foundation/manual_02.htm#a4)

[Javaの文字コードについてのまとめ](https://eng-entrance.com/java-text-code)

[https://www.javadrive.jp/start/num/index3.html](https://www.javadrive.jp/start/num/index3.html)
UnityでWebXR(WebVR)対応したWebページをつくる


# 概要
Unityで、アプリをVRに対応させるなら、
PackageManagerから、VR関連のパッケージをいれたりすれば、対応自体はかんたんにできる（調整難しい）
しかし、
UnityでWebGL履くときにVR対応させるのはちょっと面倒なのである。
環境整備がめっちゃ面倒なのである。
なので、今現在、VR対応WebGL出力する方法を共有します。

# 環境
ビルド環境
・Windows10Pro
・Unity2019.3.9

ターゲットVR
・OCulust Quest2(1201840.9760.0)
・OculusBrowser


# 環境の整え方
1: WebXR Exporterをダウンロード
https://github.com/MozillaReality/unity-webxr-export
のマスターブランチをダウンロード

※配布されているパッケージだと、Questでうごかず、真っ黒になる

2: １でダウンロードしたものをUnityで開き、UnityPackageを吐く
WebGLTemplates
WebXR
をエクスポート

3: こりんさんのスライドの方法でプロジェクト準備
https://speakerdeck.com/korinvr/challenge-to-use-unity-webxr-exporter-for-vr-sashimi-tanpopo?slide=9
ただし、インポートするWebXRExporterのパッケージは、２でつくったもの。

4:通常のブラウザで、マウス、キーボードで操作できるようにする
WebXRシーンのWebXRCameraSetを参考にして、スクリプトをはめる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/d0d79797-3740-93ac-4eef-c8458b04ca82.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/06b73579-7d8d-15a6-4d35-8512766e45f4.png)






# 動いているサイト
https://service.sysken.tokyo/webxrtest1/

* PCで見た場合(Firefox)
https://youtu.be/z8Rpv1-lRuE
![webxr1 — Mozilla Firefox 2020-12-09 02-44-37_1_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/30dbcd7a-2f9e-9ec2-992e-b7ee139ccd3d.gif)

* OculusQuest2のOculusBrowserで見た場合
https://www.youtube.com/watch?v=0NTLyKoH7lI

![Oculus Developer Hub — Device Casting 2020-12-10 02-28-07_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24266/d1527b23-f0c1-2e6d-4986-fce1be72c858.gif)


5:以上



# 参考文献
こりんさんのスーパーいいスライド
https://speakerdeck.com/korinvr/challenge-to-use-unity-webxr-exporter-for-vr-sashimi-tanpopo

トマシープさんのスーパーいい記事
https://bibinbaleo.hatenablog.com/entry/2020/12/08/223954

@PolymerSoftさんのスーパーいいツイート
https://twitter.com/PolymerSoft/status/1316022330401845255?s=20