OmniAICreator/Qiita-1.07M huggingface dataset:
Scalaを使う人のJavaアップデート


## 動機

定期的なバージョンアップはしないと...というのと、
Java11以上への更新はどうやら魅力的なパワーアップが多いようだった。(もちろんバージョンアップは毎回魅力的だけどね!)
[Java 11 に移行する理由 - Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/java/fundamentals/reasons-to-move-to-java-11)


## 環境
1. アプリケーションはScalaを書いてJVMで動かしている。
2. Scalaは2.13.1を使っている。
3. AdoptOpenJDKを利用している。
	* 今回アップデートしたいのはアプリケーションランタイムのバージョン。


## ScalaとJVMバージョンの組み合わせ確認
まずはここでScalaとJVMのバージョン
https://docs.scala-lang.org/overviews/jdk-compatibility/overview.html
`We generally recommend JDK 8 or 11 for /compiling/ Scala code. `
とありますが、今回はアプリケーションランタイムのバージョンが目的なのでとくに気にせず。

Scalaのバージョン的には11,12,13, 14 (15もあるが当時はまだ未リリース) で利用ができそうなコトがわかった。

## 目指すJavaバージョン

巷にはJava8 -> Java11への移行の情報が溢れていたので今回のアップデートではひとまずJava11を目指すことにした。

いろんな記事やブログを読んで回ったが
[Java 8 から Java 11 への移行 - Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/java/fundamentals/transition-from-java-8-to-java-11)
が参考になった。

Scalaを利用しているのでアプリケーションから直接JavaのAPIを利用することは少ないのでほとんどなにもしなくても良かったがいくつか対応があったので以下でピックアップ

## GCオプションの確認
下にある通りです。
[Java 8 から Java 11 への移行 - Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/java/fundamentals/transition-from-java-8-to-java-11#explicitly-set-garbage-collection)
今回アップデートしたアプリケーションはG1GCだとパフォーマンスがParallel GCより劣るような、ヒープサイズとCPU数、アプリケーション特徴の場合は見逃していると性能下がって驚いてしまうので必ず確認しよう。

## 利用していたライブラリから `An illegal reflective access operation has occurred`

利用していたライブラリから
`An illegal reflective access operation has occurred`
が発生してログが出ていた。
私はJavaの起動オプションに`--illegal-access*=warn`とつけてwarnログとして残すことにした。
[Java 8 から Java 11 への移行 - Azure | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/developer/java/fundamentals/transition-from-java-8-to-java-11#warning-an-illegal-reflective-access-operation-has-occurred)

## Jetty ALPN Agent からの卒業

作業中に以下に遭遇した
[Jetty-alpn 8.1.13 is incompatible with the latest jdk8u252-ga build · Issue #30 · jetty-project/jetty-alpn · GitHub](https://github.com/jetty-project/jetty-alpn/issues/30)

issueに導かれ以下の記事と出会った。
[Jetty, ALPN & Java 8u252 – Webtide](https://webtide.com/jetty-alpn-java-8u252/)
どうやらjetty-alpn-agentはもう指定しなくていいらしい。

もともとhttp/2対応のために jetty-alpn-agentをjava-agentとして利用したが以下アップデートでJava本体で対応がされたため必要なくなった。
[JEP 244: TLS Application-Layer Protocol Negotiation Extension](https://openjdk.java.net/jeps/244)


## java.securityファイルの位置変更への対応
もともと `$JAVA_HOME/jre/lib/security/java.security`
もあったファイルがJava11では
`$JAVA_HOME/conf/security/java.security`に場所が変更さた。

[Java Security Overview](https://docs.oracle.com/en/java/javase/11/security/java-security-overview1.html#GUID-25BF3893-E577-4C96-9A4A-BEA39555CA72)
をみるとファイルの位置が書いてある。


## 最後に

私たちのアプリケーションはScalaから利用していたのと利用しているライブラリで問題がおきなかったので、幸いあまり多くの対応を必要としなかった。

アップデートによりGCの回数が落ち着きを見せたり、Java Flight Recorderの利用やJava 11であることを前提とした便利ツールを利用することが叶った。
MACを使っていて使える気がするショートカットキー達

# 最初に

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

## 自分が見直すようにショートカットキー一覧を作ってみた

ショートカットキーをすべて覚えきるのは大変かもしれないですが、1つでも多く覚えておくとキーボードとマウス間の行き来がなくなるので作業スピード上がります。
たった数秒ですがこれが積み重なると意外と大切な気がしたので3か月前にプログラミングの勉強と同じタイミングで少しずつ覚えていきました。

私はMACで覚えた為、Windowはちょっと分からないです^^;（共通なものもあるので少しは参考になるかな？）

## いろんなところで使えた全般編

command = ⌘

|キー|機能|
|:-:|:-:|
|⌘+x|選択した場所を切り取る|
|⌘+c|選択した場所をコピー|
|⌘+v|切り取り、コピーしたものを貼り付ける|
|⌘+z|1つ前に戻る（Wordなどの戻るボタンと同じ）|
|shift+⌘+z|⌘+zの取り消し|
|⌘+a|項目すべて選択|
|⌘+o|選択した項目（ファイル）を開く|
|⌘+p|現在の書類をプリントする|
|⌘+s|現在の書類を保存する|
|⌘+t|新しいタブを開く|
|⌘+w|ウインドウを閉じる|
|⌘+m|ウインドウを最小化|
|option+⌘+m|すべてのウインドウを最小化|
|⌘+d|選択したファイルを複製|
|⌘+f|画面内の文字検索|

## Google Chromeで使った編

上記にないもの

|キー|機能|
|:-:|:-:|
|⌘+d|タブをブックマークする|
|⌘++|拡大|
|⌘+-|縮小|
|⌘+[|戻る（前のページを表示）|
|⌘+]|進む（次のページを表示）|
|⌘+r|ページを再読み込み|
|option+⌘+i|デベロッパーツールを開く|
|option+⌘+f|検索入力へカーソルがいく|

## ショートカットキーか分からないけど

|キー|機能|
|:-:|:-:|
|shift+矢印キー|カーソルを基準に矢印方向に選択できる|
|⌘+矢印キー|最端に移動（↑は最上へ、↓は最下へ、←は最右へ、→は最左へ）|

これを知ってから本当マウスの出番が激減^^

## 最後に

今はこんな感じかな？
覚えると一気にマウスの出番がなくなるのでとても楽です。
マウス無しでトラックパッド？ノートパソコンの手前にあるマウスの代わりをしてくれるやつ
ネットサーフィンの時は便利ですが、作業になるとショートカットキーには勝てない気がします！
safariは今使い始めたので使えるやつで上記にないものがあれば更新していきたい。
【UE4：C++】BPで関数を呼び出すときのデフォルト引数を設定する

```:コード
UFUNCTION(BlueprintCallable, meta = (WorldContext = "context", sample = "-1"))
void SetSample(UObject const* context, int32 sample);
```

metaで設定してあげればいいらしい

contextの定義は主にBlueprintLibraryとかアクターじゃないクラスの関数に対していちいちselfとかピンに紐づけるの面倒だから楽になった

int32とか普通の変数はなんかそれっぽく試しにやってみたらできた
こういう情報探してもなかなか見つからない

上記コードを見ての通り、代入の仕方が統一されてなくてキモイ
seeds.rbを本番環境に反映させる方法

###はじめに
開発環境から本番環境に移行する際に、seeds.rbの内容は本番環境のデータベースに引き継がれないので、本番環境でseeds.rbをデータベースに反映させる操作が必要になります。

###環境
* Rails 5.2.3
* AWS ( RDS : MySQL 5.7.22 ）


###手順
1.EC2にログインする。
2.作成したアプリ上に移動する。

```
　cd アプリ名
```

3.currentディレクトリに移動する。

```
　cd current
```

4.railsコマンドを実行。

```
　rails db:seed RAILS_ENV=production
```

以上

###終わりに
初学者＋Qiita初投稿のため、分かりにくい記事かもしれないですが、何かのお役に立てれば幸いです。
VSCodeで1行JSONを整形+Unicodeをデコードして見やすくする

# はじめに
APIから受け取ったJSONをコピペしてVSCodeで確認したいと思った時に、JSONが1行で返ってきたり、StringがUnicodeにエンコードされていてどんな値が入ってるか分からない、ということがあったため備忘録として投稿

# 前提
Unicodeのデコードは **Encode Decode** というVSCodeの拡張機能を用います

# 手順
### 1行のJSONを整形する方法
1. 新しいファイルを作成(Mac: `cmd` + `n` またはタブのところを2回クリック)
2. コピーした1行JSONを貼り付け
3. 右下の言語モードをJSONにする(Mac: `cmd` + `k` 押した後 `m`)
4. 右クリックで『ドキュメントのフォーマットを選択』(Mac: `option` + `shift` + `L`)


### Unicodeをデコードする方法
1. VSCode検索機能で、正規表現をONにして`\\u.{4}`と検索
2. `alt` + `enter` (Mac: `option` + `return`)を押して検索された部分を選択する
3. `ctrl` + `alt` + `c` (Mac: `cmd` + `option` + `C`)、もしくは `ctrl` + `shift` + `P` (Mac: `cmd` + `shift` + `C`)でコマンドパレットを開き、**convert selection**を選択すると、Encode Decodeのメニュー開く
4. **Unicode to String** を選択する


# 参考
https://yukushige.com/blog/?p=511
https://qiita.com/westhouse_k/items/60c6afdb8cf6bc417bd3
[Encode Decode](https://marketplace.visualstudio.com/items?itemName=mitchdenny.ecdc)
Power BIのスモール マルチプル（小さな多数）

## はじめに
　あるカテゴリー等毎に小さなグラフで並べたい、ということありますよね。これまではカスタムビジュアルで対応するものを探してきて、、、ということでしたが、2020/12の最新ではプレビューで提供開始されました。

[Power BI の新機能と予定されている機能 (2020 年リリース サイクル 2) - Power Platform Release Plan | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-platform-release-plan/2020wave2/power-bi/planned-features)

### 設定

 [ファイル]/[オプションと設定]/[オプション]より[グローバル]/[プレビュー機能]の[スモール マルチプル]をオンにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/25461320-59c2-37a3-abf8-a5459a86a275.png)

## 積み上げ横棒グラフの場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/8a884b4a-caf0-2330-a8a6-5116830ee135.png)

丸で囲った部分に、分けたいフィールドを持ってきます。


試しに地域で分けました（合わせて店舗名を凡例で色分けしました）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/b375b6cb-c3f2-0b1b-a4ed-aa2091b4e9a4.png)

タイトルの位置の他に「グリッドレイアウト」で何行何列にするかを指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419691/ac82be3f-4e36-835d-59bd-c637add4e70a.png)


## おわりに
　手軽に使えて便利です～ 詳細はこちらもご参照を [Announcing Small Multiples (preview) | Microsoft Power BI Blog | Microsoft Power BI](https://powerbi.microsoft.com/en-us/blog/announcing-small-multiples-public-preview/)
ワコムのタブレットをubuntu20.04で使おうとしたら認識しなっかった件


製品名は`One by Wacom`っていう、いわゆる板タブ。
![wacomstore_ctl-672-k0-c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/1ef5702b-5662-1e9b-3bd1-1f8c68289d7d.jpeg)
ワコムのはUSB挿すだけで認識すると言われていたが、そんな甘いことは無かった。
まあ、壊れたり修復したりしてるので、システムが色々良くない感じにはなっているのだけれど。

で、全然認識してないの？って思ったら

```console
$ lsusb
Bus 002 Device 002: ID 8087:8000 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8008 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 002: ID 1bcf:0005 Sunplus Innovation Technology Inc. Optical Mouse
Bus 003 Device 008: ID 056a:037b Wacom Co., Ltd CTL-672 [One by Wacom (M)]
Bus 003 Device 004: ID 04c5:1007 Fujitsu, Ltd 
Bus 003 Device 003: ID 04c5:1008 Fujitsu, Ltd Fujitsu USB Comfort Keyboard Hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
認識してるじゃん・・・。
![Screenshot from 2020-12-25 16-59-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/fe87fdc6-e732-8933-a108-09fe00e55571.png)
必要なライブラリは一通り入っていたのだけれど
`kde-config-tablet`っていうのが入っていなかったのが原因らしい。
なので、入れた。

![Screenshot from 2020-12-25 17-01-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/944ae2d5-e6f5-4408-a4f6-cd264bc14b96.png)
入った

![Screenshot from 2020-12-25 17-05-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/dbdaf0e0-ce90-896e-c34a-880b1fcce772.png)
ちゃんと認識してる

![Screenshot from 2020-12-25 17-06-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356086/62b739c5-481d-f991-3ba9-d4a58ff0f42c.png)
設定画面にも`ワコムタブレット`の項目出てきた。

めでたしめでたし。
【3D OD LiDAR編】Fast Point R-CNN : 2stage 3D Object Detection


<h1>Fast Point R-CNN</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ee150172-614d-ca9b-c30f-b4affa055471.png)

<h1>新規性</h1>

<h2>VoxelRPN</h2>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/be5440d6-cd82-ee49-bee6-71c73ade78c2.png)

VoxelNetではVoxel化する時に1つのVoxelのPointを35個までと制限したが、6個で十分な結果が出るらしく、高速化された。
高さをChannelに畳み込むから、高さの情報を失わないようにする必要がある。そこでzのkernelサイズを2にするのがミソらしい(ちょっと詳細は理解できませんでしたm(_ _)m)。


<h2>RefinerNet</h2>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8da809a3-dea4-4aa3-4ac1-1cf53291d7e9.png)

VoxelRPNのFeatureとRaw Point CloudのFeatureを結合し、PointNetに入力することで、Bounding BoxをRefineする事が出来る。

さらに図にあるように、Element-wise MultiplicationをすることでAttentionという結果に寄与しやすい特徴に重みが付けられる。


<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/2832035f-8c5d-3826-caca-2f0f30b91e97.png)
PointRCNNより速くはなってるが、使ってるGPUが違うやん！そんなのなんの比較にもならん(T_T)

<h1>結論</h1>
・Voxelの中のPoint35個もいらないよ〜って所は使えそう

<h1>参考文献</h1>
Fast Point R-CNN
https://arxiv.org/pdf/1908.02990.pdf
第六回：変数とメソッド



# 変数

Rubyでは型宣言の必要がない(適当に型が定められる)．代入は次のように行う．

```
name = 'Ruby'
```

受け取った引数をnameという変数に代入し，Hello Rubyと表示されるコードを作成する．

引数を変数に代入するには

```ruby
name= ARGV[0]
```

である．

次に，Hello Rubyと表示されるコードだが，Rubyは引数となるので，nameという変数をコード内に入れればよいが，

```ruby
puts "Hello name"
```

とすると，実行したときに

```
Hello name
```

と表示されてしまう．そこで，

```ruby
puts "Hello #{name}"
```

とする. 

以上より，作成するコードは以下の通りである．

```ruby
name = ARGV[0]
puts "Hello #{name}"
```

上記を

```
$ emacs name_variable.rb
```

を実行し，emacsで作成する．

そうすることで

```
$ ruby name_variable.rb Ruby
```

を実行すると，以下のように表示される．

```
Hello Ruby
```


# メソッド

次に，引数をnameという変数に代入した後に，Hello Rubyと出力されるメソッドを作成する．

メソッドは以下のように作成される．

```ruby
def メソッド名(引数)
  処理
end
```

ここでは，メソッド名をhellonameとする．Hello Rubyと出力されるメソッドは以下のようになる．

```ruby
def helloname(name)
   puts "Hello #{name}"
end
```

これで，hellonameとコード内に入力したら，「Hello Ruby」と出力されるようになった．あとは，引数をnameという変数に代入すればよいので，コードは以下のようになる．

```ruby
def helloname(name)
   puts "Hello #{name}"
end
name = ARGV[0]
helloname(name)
```


# 参考

参考にしたサイトは以下の通り．

-   <https://qiita.com/daddygongon/items/c51f3e0695174bb3c508>



------
 - **source** ~/grad_members_20f/members/yuhsuzu/r6.org
スマホから記事投稿する方法

#Qiitaの記事をスマホで投稿する方法

スマホでQiitaの記事を書けたらアウトプットも捗るのでは、
と思い新規作成のようなところがなく困っていたところ、
スマホからでも記事を作成できる便利技を紹介しているページを見つけました。

```

https://qiita.com/drafts/new

```

これに直接アクセスするだけ。
記事作成ページにジャンプします。
PCからでもこの方がストレスなく記事が書けそうです。




誰かのお役に立てば幸いです。
続・こんな人は伸びない！プログラミング初学者がやりがちなダメ勉強法について



前回の記事
[こんな人は伸びない！プログラミング初学者がやりがちなダメ勉強法について
](https://qiita.com/shimajiri/items/dcd90203422dd7185bdb)の続編です。
※この記事には私の独断と偏見が含まれています。

##5.勉強が習慣化出来ていない
三日坊主という言葉もあるように人間の意志というのは非常に脆いので、
勉強するモチベーションを維持するために、勉強するための時間や環境をしっかり調整しましょう。
あまり時間かけてズルズルやっても効率悪いので、最低でも1週間に**大体25~30時間**ぐらいは確保できるようにした方がいいかなと思います。(この確保する時間は、人によって差が出ると思います)

ちなみに私はどちらかというと、プログラミングの**「勉強」**を自発的にしてきたというよりかは、作りたいアプリを作りながらプログラミングの**「学習」**をしてきたので、プログラミング自体は趣味みたいな感じなのですが、それでも平日は2時間、休日は土曜のみOKで日曜は別のことをするなど、プログラミングの時間を確保するためにスケジュール調整はしていました。
※**「勉強」**と**「学習」**は似ていますが違います。

##6.頭の悪い質問の仕方をしている
私の主観ですが、プログラミングを教えているとこれがかなり多いです。

頭の悪い質問がどんなものかというと、
**「問題を解決するために必要な適切な情報が得られない質問」**のことです。

ちなみに前の記事にも書きましたが、そもそも質問できる人がいない場合は、
質問できる人を見つけてください。聞けない状況だと大半の人はそもそも厳しいのと効率も全然違います。
[teratail](https://teratail.com/)とか利用してもいいかもしれませんね。

その上で頭の悪い質問をしている人は勿体無いですし、
相手をしてもらう方にも失礼ですので、
質問の仕方が分からない方はググりましょう。
**[質問 テンプレート プログラミング]**とかでたくさん見つかると思います。

個人的に大金を払って教えてもらっているとかであればいいのかもしれませんが、
業務で頭の悪い質問ばかりしていると、そのうち教える側から相手にされなくなってしまいます。

[こちらの記事](https://qiita.com/seki_uk/items/4001423b3cd3db0dada7)がめちゃくちゃ参考になりますので是非。

##7.一つの成果物に執着する
例えば、頑張って一つ成果物を作ったとします。
そして次の成果物を作ろうとした際に、同じような成果物を作るのはあまりオススメ出来ないです。

長時間かけてやっと完成した成果物に愛着が出てくるのは分かりますが、
同じような仕組みで同じようなものを作っても、同じことをなぞっているだけなので、
あまり多くは学べません。

別言語または別のフレームワークとか、システム構成自体をガラッと変えるとかするのであればいいかなと思います。

その過程で自分の好き嫌いや得意不得意が見えてくるかと思います。

あとチーム開発も大事ですが、なるべく成果物は一人で作りましょう。
複数人で作業すると、完成した際に自分だけの成果物として見せられないのと、出来る人がいた場合に色々と頼ってしまいがちになってしまうので問題解決力が身に付かないのが理由です。

##まとめ
コロナ過という状況もあり、
私がプログラミングを始めた４〜５年前と比べ、現在は未経験でIT関連企業に入るのも非常に難しくなってきていると感じます。
人よりも+aで頑張らないと中々厳しいかなと思いますので、効率良く勉強して素早く成長していきましょう。
vscodeでopencvやmatplotlibが表示されない。エラーも出てない。

# 環境
Ubuntu20.04
Python 3.9
vscode 1.52.1
anaconda 4.8.3

# 経緯
以下のようなopencvのコードをvscode上で実行させたのですが、、、

```python
import numpy as np
import cv2
import os

image_dir = "Data/train_images/"
annotation_dir = "Data/train_annotation"

def show_image(num_str: str):
    image_path = os.path.join(image_dir, f"train_{num_str}.jpg")
    img = cv2.imread(image_path)

    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == "__main__":
    show_image("0001")
```

エラーも吐かずに正常終了。しかし、画像は表示されないという状態でした。


#解法
vscodeのターミナルで以下のように打つと表示できるようになりました。

```shell
$ export DISPLAY=:0
```
どうも、DISPLAYが見つからずにheadlessモードになっていたので、エラーが出ずに正常終了になっていたようです。

そもそも、vscodeのターミナルにおいてはxeyesが`xeyes -display :0`としなければ表示できませんでした。加えて、通常のターミナルにおいては、特に対策を行わなくてもxeyes表示はできていたので、vscodeのターミナル実装に問題があるようです。

# なんで解法がわかったか。
まず、他の描画系のライブラリであるmatplotlibが動作するかを以下で試しました。
すると同様に、エラー無しで無表示でした。

```python
import matplotlib

import matplotlib.pyplot as plt
import numpy as np


# グラフとして描画するデータ
x = np.array([1,2,3,4])
y = np.array([2,3,4,5])

# グラフを描画
plt.plot(x, y)
plt.show()
```
次に、描画プラグインを指定するよう、以下のようにコード編集しました。

```python
import matplotlib
matplotlib.use('TkAgg') # <- Added

import matplotlib.pyplot as plt
import numpy as np


# グラフとして描画するデータ
x = np.array([1,2,3,4])
y = np.array([2,3,4,5])

# グラフを描画
plt.plot(x, y)
plt.show()
```

すると、以下のエラーが出ました。

```
Exception has occurred: ImportError
Cannot load backend 'TkAgg' which requires the 'tk' interactive framework, as 'headless' is currently running
  File "/home/user/Programs/fish/test.py", line 6, in <module>
    import matplotlib.pyplot as plt
```

tkってそもそもpythonにほぼ同梱されているよな？と思い、試しに以下を実行させました。

```python
import tkinter as Tk

la = Tk.Label(None, text='Hello World!', font=('Times', '18'))
la.pack()
la.mainloop()
```

すると以下のようなエラーが。

```
Exception has occurred: TclError
couldn't connect to display ""
  File "/home/user/Programs/fish/test2.py", line 3, in <module>
    la = Tk.Label(None, text='Hello World!', font=('Times', '18'))
```

以前[この記事](https://qiita.com/bunnyhopper_isolated/items/8457471fb3fffaf3ed7c)で同様なエラーが出ていたので、同じように`DISPLAY=:0`対応したら、解決出来ました。
Excel 2019 for Mac ファイル関連関数の挙動について

#Excel 2019 for Mac ファイル関連関数の挙動について

ExcelのVBAを利用されている方の大半はシート上の操作だけでなく、他のブックやCSVデータを参照したり、ファイル操作を行う事が多いと思います。[前回](https://qiita.com/EugenesWorks/items/0fc4dabf2d61554fe236)はDir関数について書きましたが、今回はWindowsとMacではどの程度、差があるのかここで表にしてみたいと思います。

環境はMacOS Catalina , Excel2019です。

|関数名|Windows|Mac|
|:---:|:----:|:---:|
|Application.GetOpenFilename()|OK|OK|
|GetOpenFilename(FileFilter:=“CSV Files (*.csv), *.csv”)|OK|NG|
|FileDialog(msoFileDialogFolderPicker)|OK|NG|
|Name BEFOREPATH As AFTERPATH|OK|OK|
|Workbooks.Open filename:=PATH|OK|OK|
|FileCopy ORIGINALPATH, COPYPATH|OK|OK|
|Kill PATH|OK|OK|
|Application.DefaultFilePath|OK|OK|
|ThisWorkbook.path|OK|OK|
|MkDir (NEWPATH)|OK|OK|
|RmDir (PATH)|OK|OK|
|FileDateTime(PATH)|OK|OK|
|FileLen(PATH)|OK|OK|
|Open PATH For Output As #1|OK|OK*|

基本的に使用可能ではありますが、ワイルドカードのあるGetOpenFilename()とFileDialog(msoFileDialogFolderPicker)は使用できません。
ワイルドカードのあるGetOpenFilename()では以下のエラーが表示されます。
![openfilename_mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/f9560e7f-f444-800b-160f-1cf8bcf4fabd.png)

FileDialog(msoFileDialogFolderPicker)では以下のエラーが表示され、コードのチップを見てみるとNothingと表示されています。
![folderdialog1_mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/f750616b-2732-5212-c66c-706704405af5.png)

![folderdialog2_mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/965663/1d5d4dc1-7dc1-6c97-9958-27451c6ac0ed.png)

特に気を付けなくてはならないのが、Openステートメントです。指定したパスに日本語のフォルダが入っているとエラーが発生し、ファイルの保存に失敗します。回避する為には共有フォルダに保存するかAppleScriptで実装するしかありません。

また、初めてアクセスするファイルやフォルダには[アクセス権の付与](https://qiita.com/EugenesWorks/items/a96ce032919d4af483d9)が必要になります。他のブックの参照をする際、初めて参照するブックを開く場合はアクセス権の付与ダイアログが表示され、マクロが停止します。

Workbooks.Openでは参照先がマクロブックの場合はセキュリティによって、マクロ許可ダイアログでマクロが停止します。Windows版ではマクロ許可バナーになっているので問題ありません。尚、Mac版ではマクロを個別で許可することはできません。

詳しいことは[ブログ](https://the-forme.net/note/spreadsheet/)にも書いています。
俺の身に何かあってみろ！的なアレをM5ATOMとenebularで作ってみる。

この記事は[enebular Advent Calendar 2020](https://qiita.com/advent-calendar/2020/enebular)の12/12に公開されるはずの内容でした。
####すみません、大幅に遅れまくってます。

コロナ禍による引きこもり生活ですっかり物を作るモチベーションが下がってました。
なんとかモチベーション上げていこうと本件引き受けたんですが、うまく進まずご迷惑をおかけしています。
とりあえずできたところまで記事にして、後ほど完成した際に改めて更新します。

#やりたかったこと
見たことありませんか？昔の刑事ドラマやスパイ映画なんかのワンシーン。
「俺の心臓が止まった瞬間、例の書類は警察に届くことになる」みたいなの。
そこから始まって自分の心臓が止まったら自宅PCのハードディスクを初期化する物を作ろうと思ったのですが
テストが大変って思ったのでちょっとだけ方向修正して、有料Webサービスの解約を信頼できる友人に解約してもらう仕組みを作ろうと思い直しました。

・心拍センサー
・enebular
・Gmail
![service_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115904/32b00d35-feb3-3776-764c-172f19310ef2.png)

##心拍センサー
さてと、どんなセンサー使おうかなと各ショップのサイトを巡っているとこんなものを見つけました。
[脈波センサ（M5ATOM用） -PULSE10](https://www.switch-science.com/catalog/6339/)
![pluse_sensor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115904/b7c47030-fc8d-10a5-3656-c9de7ee509ec.png)
おお良さそうじゃんってことで強制的にデバイスもM5ATOMに決定です。

###プログラム
[本製品のサンプルプログラム](https://drive.google.com/drive/folders/1pFD63MkxRDBbHd9sdOVcUcV0E4FZgs-Z)
大変だ、ソースにコメントがない。。。（続く）
iCloudで不要なフォルダを同期させないための設定を行うBashスクリプト

主に個人用。

```
#!/bin/bash

DIR=${1///}
mv $DIR $DIR.nosync
ln -s $DIR.nosync $DIR
```

たとえば node_modules、vendor、_siteなど。

```
/usr/local/bin/nsync
```

とかに設置しておけば、

```
nsync node_modueles
```

で node_modulesがnode_modules.nosyncになって、そのリンクがnode_modulesになる。
[Rails]BulmaフレームとVanillaJavaScriptでモーダルを実装

####はじめに
BulmaというCSSフレームワークはJavascriptファイルは付属していないため 
処理は自身のJavascriptでかく必要があります。
jQueryで実装している記事が多いのですが、初学者のため練習も兼ねて素のJavaScriptで実装してみました。

####前提と環境
Rails 6.0.3
mySQL 8.0
Dockerformac 
######Bulmaは導入済みということにします。Bulma導入方法は他に記事がたくさんありますのでそちらを確認いただければ。

##Bulmaのモーダルを用意
>[Bulmaのモーダル](https://bulma.io/documentation/components/modal/ "Bulmaのモダール")
他にも色々便利なフレームがあります。
基本的にやり方は同じです。

```ruby:_form.html.erb
<div class="modal">
  <div class="modal-background"></div>
  <div class="modal-card">
    <header class="modal-card-head">
      <p class="modal-card-title">Modal title</p>
      <button class="delete" aria-label="close"></button>
    </header>
    <section class="modal-card-body">
      <!--ここにモーダルに入れたい内容を記述 -->
    </section>
    <footer class="modal-card-foot">
      <button class="button is-success">Save changes</button>
      <button class="button">Cancel</button>
    </footer>
  </div>
</div>
```
上記とは別にトリガーとなるボタンを置きたい場所に適当に設置

```
<button type="button is-success" id="button">この商品のレビューをかく</button>
```
このボタンに``id="button"``としてidを付与する

同様に``_form.html.erb``のmodalクラスと真ん中ほどにある表示を消す×ボタンのにidをつけます。

```ruby:_form.html.erb
<div class="modal" id="page-modal">
.
.
.
<button class="delete" aria-label="close" id="hide"></button>
```
##JavaScriptの作成
JavaScriptのファイルを作成します。

```JavaScript:modal.js
//先ほどのidを定義
var buttton = document.getElementById('button'); 
var modal = document.getElementById('page-modal');
var close = document.getElementById('hide');

//ボタンを押すとモーダルが表示させる処理
buttton.onclick = function(){
    modal.style.display = 'block';
//×を押すとモーダルを非表示にする処理
close.onclick = function(){
  modal.style.display = 'none';
```

実際ここまでで、モーダルを表示、非表示にさせる機能が完成なのでOKですが、モーダルが表示されている時に×印までカーソルを合わせなくともバックグラウンドのグレー部分のどこかをクリックするだけでモーダルを消せる、よくみるあの機能も追加したいと思います。

```JavaScript:modal.js

//ウィンドウをクリックしたらディスプレイを非表示にするという処理
window.onclick = function(event){
  if (event.target.className == 'modal-background'){
      modal.style.display = 'none';
  }
```
if分の中身はモーダルのバックグラウンドのclassNameをデベロッパツールで確認するといいです。
これでついに実装完了です。

こちらのyoutubeは大変参考になりました。
>[JavaScript For Bulma - Modals  
Travis Media](https://youtu.be/h11FMQ2lPGI)

初学者のため至らない点や間違いのご指摘などありましたら、ご連絡いただきますようお願いします。どなたかの参考になれば幸いです。
Advance Custom fields(ACF)の出力方法まとめ

#Advance Custom fields(ACF)とは
wordpressでカスタム投稿が出来るプラグインで一番有名だと思います。
[Advance Custom fields](https://ja.wordpress.org/plugins/advanced-custom-fields/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/24d526b7-8a88-1e81-fbb5-b36ff361c5ca.png)

管理画面での設定方法は簡単なのですが、出力が少し難しいので覚書しておきます。

#テキスト出力例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/26967f91-4ec2-b40a-eb08-7d7e08151c0d.png)


```php

<?php
$field_name = get_field('name');
$field_kana = get_field('kana');

//nameの値が空でなければ
if($field_name){echo '<p>'.$field_name.'</p>';}
//kanaの値が空でなければ
if($field_kana){echo '<p>'.$field_kana.'</p>';}
?>
```

#ラジオボタン・選択肢出力例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/caa55f59-0342-6127-9c1f-1849aa249445.png)


```php
<?php
$select_sex = get_field('sex');
$select_birthplace = get_field('birthplace');

//sexが空でなければ
if($select_sex){
	{echo '<p>'.$select_sex.'</p>';}
}
//birthplaceが空でなければ
if($select_birthplace){
	{echo '<p>'.$select_birthplace.'</p>';}
}
?>
```

#選択肢が複数回答可の場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/28821321-b8e7-1deb-cbd3-47d61f1da85f.png)

1.foreachを利用して、select_scaleの値をchildに代入
2.childが配列（＝2個以上の値が選択）だったら、child['label']で値を1つずつ出力
3.それ以外(=選択肢1個)の場合、childをそのまま出力
しています。

```php
<?php
$select_scale = get_field('scale');

if($select_scale){
	echo '<ul>';
	foreach($select_scale as $child){
		echo '<li>';
		if(is_array($child)){
			//bothの場合、ラベルを出力
			echo $child['label'];
		}else{
			//単独の返り値の場合の出力
			echo $child;
		}
		echo '</li>';
	}
	echo '</ul>';
}
?>
```

#画像

```
<?php the_field('img'); ?>
```


#まとめ
値を取得する時はget_filedで変数に代入

```php
$field_ラベル名 = get_field('ラベル名');

```

出力する時は、値が空かどうか判断してから出力すると良い

```php
if($field_ラベル名){echo '<p>'.$field_ラベル名.'</p>';} 
```
nlコマンドの開発に参加する

nlコマンドの開発に参加するための入り口となる情報をまとめます。

# GNU coreutils

このページを読めば一通りのことはわかるはずです。
[Coreutils - GNU core utilities](https://www.gnu.org/software/coreutils/)

## メーリングリスト

coreutilsの開発に関する議論は基本的にメーリングリスト上で行なわれます。
主に3つのメーリングリストがあります。投稿するにはまず購読しないといけません。購読するには、件名を「subscribe」だけにしてcoreutils-request@gnu.orgに空メールを送信します。

### coreutils@gnu.org

アーカイブはこちらから閲覧と検索ができます。
[coreutils Archive](https://lists.gnu.org/archive/html/coreutils/)

一般的な質問や議論が行なわれるメインのメーリングリストです。新機能の要望などもここに投稿して大丈夫です。「迷ったらまずはこのメーリングリストから」というのがこのリストの運用の方針のようです。私は議論の余地があるパッチなどもこちらに投げてしまいます。バグトラッカーで追跡できないので、内部的には嫌われるやり方かもしれません。

眺めてみると結構いろんな話が投稿されていておもしろいです。例えば自分の研究内容を書いて「困ってるんだけど助けて！」みたいに聞いちゃう学生さんなどもたまに見かけます。そして意外とアドバイスがちゃんともらえます。しかし内容にによっては「まずはソースを読んでみようね？」という感じで質問の仕方について厳しく指導される場合もあり、きちんとやるべきことはやった上で尋ねるべきです。少なくともソフトウェアの発展に寄与する内容であれば、快く回答してくださる親切な方がいらっしゃると思います。

### bug-coreutils@gnu.org

アーカイブはこちらから閲覧と検索ができます。
[bug-coreutils Archive](https://lists.gnu.org/archive/html/bug-coreutils/)

バグトラッカーと連携するためのメーリングリストです。この内容はcoreutilsのリストの方にも流れます。

### coreutils-announce@gnu.org

お知らせ用のメーリングリストで、リリース情報が送られてきます。

## バグトラッキング

[GNU bug report logs: bugs in package coreutils](https://debbugs.gnu.org/cgi/pkgreport.cgi?pkg=coreutils)

このシステムは追跡と検索だけです。レポートははbug-coreutilsのメーリングリストから投稿します。
問題を報告する前に既存の報告をきちんと調べるようにしましょう。

## ソースコード

公式のgitリポジトリはGNUのサーバにありますが、GitHubにもミラーがあります。

[公式GNU savannahサーバ(cgit)](https://git.savannah.gnu.org/cgit/coreutils.git)
[公式GNU savannahサーバ(gitweb)](https://git.savannah.gnu.org/gitweb/?p=coreutils.git)
[GitHub（ミラー）](https://github.com/coreutils/coreutils)

手元にダウンロードするなら、次のようにします。

```console
$ git clone git://git.sv.gnu.org/coreutils
```

パッチも議論もメーリングリストで行なうのが基本ですが、GitHubにプルリクエストを送っても対応はしてもらえるようです。

## 設計資料

[Decoded: GNU coreutils](http://www.maizure.org/projects/decoded-gnu-coreutils/)
coreutilsにはちゃんと開発ドキュメントがあります。（し、知らなかったー！）
設計だけでなくGNUのライブラリの使い方などについても触れられていているので、ソースを読む上でとても参考になると思います。

# BusyBox

基本的な流れはcoreutilsと同様です。

##メーリングリスト
[メーリングリストの購読](https://www.busybox.net/lists.html)
購読だけでなく、アーカイブの検索もできます。

##ソースコード
[アクセス方法の説明](https://www.busybox.net/source.html)
[公式gitサーバ](https://git.busybox.net/busybox/)
[GitHub（ミラー）](https://github.com/mirror/busybox)

##バグトラッキング
[バグトラッキングシステム](https://bugs.busybox.net/)
Bugzillaです。

##パッチの投稿
[パッチ投稿の方法](https://busybox.net/developer.html)
基本はメーリングリストへの投稿ですが、Morrisアカウントを作れば直接gitサーバへ`push`できるようになるようです。

# NetBSD

[NetBSD Advent Calendar 2020](https://qiita.com/advent-calendar/2020/netbsd)、23日目の記事としてこちらに書きました。
　→[NetBSDのnlコマンドとProblem Reports](https://qiita.com/Carol_815/items/c81a278788978b5901d0)

# FreeBSD

（TBD）FreeBSDの`nl`は十分調査できていないため、修正等の必要が生じたら加筆します。

----
最新版のNode-REDだと動くけど、enebularのNode-REDだとノードが表示されなかった話


自作ノードをたまに作ってますが、改行しようと思い、`\n`を入れたらノードが消えるという現象がありました。

ちなみに作ってるノードはこちらです。(LINE BOTぜひ作ってね)

> https://flows.nodered.org/node/node-red-contrib-line-messaging-api

## 表示名の改行をしたい

ノードの表示名が`ReplyMessage`などなのですが、絶妙な場所で改行されるので`Reply`と`Message`の間に`\n`を入れて改行してみようと思いました。

> ![スクリーンショット 2020-12-17 5.26.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/cfdc094a-2fde-e23a-8cde-9bec54b562e2.png "スクリーンショット 2020-12-17 5.26.51.png")

## enebularのNode-REDだとノード消えた?!

おっと... 表示されない...?!

![スクリーンショット 2020-12-17 5.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/d9933880-7622-c8a3-25ed-67bb29ab0be7.png "スクリーンショット 2020-12-17 5.25.59.png")

改行してないNotifyノード以外が消えてしまいました。

ちなみに現時点のenebular上のNode-REDのバージョンは **v1.0.5 α12** です。

## 通常だと問題なし

手元で利用していたNode-RED **v1.2.6**だとこんな感じ

> ![スクリーンショット 2020-12-25 15.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/159ee958-d8e7-ca12-55b6-10a65dbc36ec.png "スクリーンショット 2020-12-25 15.55.37.png")

## まとめ

原因はいまだに不明です。

バージョンの違いなんですかね。

とりあえず改行無しにして再デプロイしたので解決してないです。

分かる人いたらコメント頂けますと幸いです。
【3D OD LiDAR編】3D IoU Loss : 3D IoUをlossに足すと精度が上がる話

<h1>IoU Loss for 2D/3D Object Detection</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/47519a48-9e81-73de-d2c4-d713c55c814e.png)

3D Object DetectionでIoUをLossにこれまで使っていなかったらしい。
まさか〜と思って調べてみると、ホンマや！

IoUをLossに加えるのなんて簡単な事だと思うのだが、何故誰もやってこなかったんだろう？！
回転ありのIoU計算するの面倒くさいからかな?

<h1>結果</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/8ccb3d73-7e0a-d9c4-80c0-57463a9a265f.png)
IoUもGIouも無いより精度が上がってる

<h1>結論</h1>
・当たり前のようだけどIoU Lossを加えると精度が上がっている

<h1>参考文献</h1>
IoU Loss for 2D/3D Object Detection
https://arxiv.org/pdf/1908.03851.pdf
RustでHashMapの値を更新したい

###何したい？
HashMapのキーに対する値が入っていたら更新、入っていなかったら初期値を入れたい。

###やってみた
entryとor_insertを組み合わせる。

```rust:example
use std::collections::HashMap;

fn main() {
    let mut map:HashMap<String,i32> = HashMap::new();
    map.insert("a".to_string(), 1);

    *map.entry("a".to_string()).or_insert(0)  += 1;
    *map.entry("b".to_string()).or_insert(0)  += 1;

    println!("{:?}", map);
    println!("{:?}", map.get("b"));
    println!("{:?}", map.get("c"));
}
```

```sh:結果
{"a": 2, "b": 1}
Some(1)
None
```
macOS Big Surでfish shell v3.1.2の補完が遅いのを修正するワークアラウンド

### 追記

fish v3.2.0 がリリースされているので、この対処は現在不要です。

fish v3.2.0で「空エンター入力でfish_preexecが反応しない」という別の問題が発生しているので、そちらの対処は以下の投稿を見てください。

https://qiita.com/geekduck/items/1b49f9c889b65f1001d3

### この投稿で使用している言語、ライブラリのバージョン

* macOS Big Sur 11.1
* fish shell v3.1.2

### 事象

Big Surにアップデートしてからfishのタブでコマンドを補完すると1秒程度待たされるようになりました。
この事象は下のPull Requestで修正されておりv3.2.0としてリリースされるっぽいですが、
3.2.0はまだリリースされていないので3.1系でのワークアラウンドを調べました。

https://github.com/fish-shell/fish-shell/pull/7365


### ワークアラウンド

上記Pull Requestのコードを `~/.config/fish/functions/` に配置します。

```bash
curl https://raw.githubusercontent.com/folke/fish-shell/e89b95f476e427419071141d6aac536777b9e782/share/functions/__fish_apropos.fish > ~/.config/fish/functions/__fish_apropos.fish
curl https://raw.githubusercontent.com/folke/fish-shell/e89b95f476e427419071141d6aac536777b9e782/share/functions/__fish_complete_man.fish > ~/.config/fish/functions/__fish_complete_man.fish
curl https://raw.githubusercontent.com/folke/fish-shell/e89b95f476e427419071141d6aac536777b9e782/share/functions/__fish_describe_command.fish > ~/.config/fish/functions/__fish_describe_command.fish
```

これでタブの補完が高速になりました。

### v3.2.0がリリースされたら

たぶんワークアラウンドは不要になるので消しましょう

```bash
cd ~/.config/fish/functions
rm __fish_apropos.fish __fish_complete_man.fish __fish_describe_command.fish
```
IEEE829から学ぶテストドキュメント～⑥テストログ編～

#1．概要

IEEE829から学ぶテストドキュメントの第6回目として、テストログについて記載いたします。

テストログを一言でいうと、**テスト中に起きた出来事をまとめたドキュメント**、になります。
ただ、テスト中に起きた出来事はテストケースに記載することが多く、テストログという別のドキュメントを作成することはほとんどありません。
（そのため、テストケースとかぶる項目が多いです…）

しかしながら、例えば自動テストを実施した場合、その履歴をテストログということがあります。そのため、現場ではテストログ　＝　自動テストの結果　となっていることもあります。


#2．IEEE829のテストログについて

以下がIEEE829に記載されているテストログに記載する項目となります

- テストログ識別番号
- 説明
- アクティビティとイベントの記述

テストログは「アクティビティとイベントの記述」さえ記載されていればよく、それ以外は特に記載しなければならない項目はありません。

ただ、IEEE829のテストログは項目が大雑把ですので、詳細は事象で詳しく記載いたします。


#3．アクティビティとイベントの記述について

テストログに記載するアクティビティとイベントは、**「ログを残すことで後々役に立つこと」**、が記載されていれば問題ありません。

例として、

- 不具合の原因を追究しやすくなるような情報
- テスト完了後の振り返り会で役立つ情報
- テスト実施管理に使える情報

などが該当します。そのため、ログを残しても誰も見ない、使わないのであれば各情報を記載する必要はありません。

##テストログとして残すべき項目

上記を詳細にまとめると、以下のような項目がログに記載した方がいい内容になります。

- テスト実施順序

テストケースに記載されている実施手順が該当。自動テストなどではテストしたコードの履歴でもいい
⇒不具合が発見された際、再現確認や原因追及のため利用する

- テストケースの説明

順序だけでは何をテストしたかわからない場合、説明文を記載する
⇒どんなテストを実施したのか確認の際に利用（管理もしくは振り返りに使うこともある）

- テスト結果

テストを実施した結果、どのような結果となったか記載する。
テストの網羅率や表示されたエラー内容（エラーコード、エラーメッセージ）なども該当する
⇒テストケースに誤りがなかったか、別の問題が起きていないか確認ため利用（主に管理）

- テスト実施中に起きた問題ある事象（「備考欄」に記載することが多い）

テスト実施中に気になる動作があればそれを記載する。（特に非機能要件が該当しやすい）
例えば、
・ボタンを押してからの動作が遅く感じる
・特定の環境だけテスト結果が異なる
・ボタン押下が多く使いづらい
・データを保存すると仕様にない部分も変更されている…など
⇒テストケース外の問題を把握するために記載する（主に管理）


- 日付、開始時間、終了時間

テストを行った日程を記載する
⇒のちにテスト実施者の生産性を算出したり、スケジュール管理に利用したりする。


- テスト環境

テストを実施した際の環境を記載する（特に不具合の影響範囲を特定できる情報があるといい）
・テスト対象システムのバーション
・テストしたブラウザ名、ブラウザのバージョン
・OSの名前バージョン　など
⇒不具合の原因追及の際に利用します


上に記載した項目を全て利用する必要はなく、ログとして残しておいた方がいいものだけ
を決めて記載すればいいです。


#4．まとめ

テストログは、テスト中に起きた出来事をまとめたドキュメント、です。ただ、上記はテストケースに記載する項目とかぶっているので、必ずしも作成しなければならないドキュメントではありません。

そのため、ログとして残した置いた方がいい情報を決めてテストログをどう使うか、を決めた上で必要な項目を検討した方がいいと思います。
30代おっさんが高校生に囲まれながらITパスポートを受験した話

##経緯
これまでハードウェアの研究開発ばっかやってきた自分にとっては、ソフトウェアの職場に来て「こいつら何いってんだ？」くらいのギャップに苛まれていました。
さすがに言葉が通じないのは、1人海外に行ってボディーランゲージでどうにかしよう！と同じことだしこれから先、仕事にならないと思ったので30代になって受けようと思った次第。

##試験までの学習方法
※自分の学習法であるため参考程度

**参考書**
・[栢木先生のITパスポート教室](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C02%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8-%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E6%A0%A2%E6%9C%A8%E5%85%88%E7%94%9F%E3%81%AEIT%E3%83%91%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E6%95%99%E5%AE%A4-%E6%A0%A2%E6%9C%A8/dp/429711013X)

**参考サイト**
・[ITパスポート過去問道場](https://www.itpassportsiken.com/ipkakomon.php)

**使ったツール**
・[anki](https://apps.ankiweb.net/)

**学習方法**
1. スケジュール作成
12/20に目標を定め、11月序盤から勉強開始（参考書読み込み）12月に入ったらITパスポート過去問道場で問題やりこみといった予定をざっくり立てる。

2.参考書読み込み~~（すぎた）~~
上記にある栢木先生のITパスポート教室を読み込む。
せっかくだし新しい勉強法取り入れてみよう！と何故か思ってしまい[ジャーゴンノート](https://www.itmedia.co.jp/bizid/articles/1108/18/news032.html)を作る。
~~これが、outputの短縮に繋がる~~

反省点
さらっと読んで、とっとと問題集に取り組むべきだった。
問題集に取り組んだうえでジャーゴンノートを作れば良かった。

3.output! output! output!
気づいたら試験1.5週間前！（あっ・・・）
ジャーゴンノートをテクノロジ分野で時間を取りすぎたせいで、ストラテジ・マネジメント系の学習が疎かになっていた。
焦ったところでどうしようもないので、気持ちを切り替えてITパスポート過去問道場の門を叩いて1.5週間で5年分を3回通りやる。
正解パターンを掴むがアルファベット3文字略称が多すぎてそこに苦労する。

4.分からない用語をankiで覚える
アルファベット3文字略称が苦手だなーと思って、ankiに単語帳っぽく入れる。
残り5日間でひたすらanki。


##試験当日
当日の作戦としては、
・歩いて試験会場まで行く
（足の筋肉を動かすことで脳血流を上げる）
・試験時間はなるべく午後の時間帯を選ぶ
（Outputをする時間帯は午後の方が良い）
くらいです。

直前に学習は不要。
~~個人的には試験会場にきて参考書読んでる奴がマジで嫌いです。~~
それでも不安になる人はいると思うので、A3用紙1枚持って行って、今持っている力を試験前にOutputしまくる方法も効果的。

試験会場にはギリギリ着きましたが会場に入ってみると、

高校生ばかりやんけ・・・
（まぁ大学のときに一回受けようと思ってたし大体の年齢層はそんなもんか）
と思いつつ、いざ試験スタート。

試験内容的には「ITパスポート過去問道場」をやりまくって正解でした。
時間測りつつ、テクノロジ・ストラテジ・マネジメント分野がランダムで出される分本番に近い環境下でやれるいいサイトだなぁと思いました。

合格するだけなら、参考書はそんなに読み込まなくてもいいかも。

##試験結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436294/aa1e0440-f267-49d9-e222-884fff955300.png)

（ ＾ω＾）・・・

ギリギリやんけ！！

試験前に神社で祈っといて良かったと思います。

##おまけ
さすがに試験中に強烈な尿意に襲われた時にはもうダメかと思いました。
手を挙げればトイレに行けれる試験でよかったです。

それではこれにて。
[備忘録]Docker for windowsで急にビルドできなくなった。

#ビルドできない

いつも通り、Docker for windowsでDockerfileを使ってUbuntuを使おうと思ったら、
エラーが出てビルドできなかった。
調べるが、あまり出で来なかったので、備忘録として残しておきます。
大雑把な環境は以下の通りです。
・Windows 10 pro
・WSL2 (ubuntu18.04)
・Docker for windows


###ビルド

```
docker build -f ./Dockerfile -t test .
```

###エラー

```

failed to solve with frontend dockerfile.v0: failed to create llb definition: failed to authorize: rpc error: code = unknown desc = failed to fetch anonymous token: get https://auth.docker.io/token?scope=repository%3alibrary%2fubuntu%3apull&service=registry.docker.io: dial tcp: lookup auth.docker.io on [::1]:53: read udp [::1]:37977->[::1]:53: read: connection refused

```

##解決
Docker for windowsを開き、
設定のDocker Engineの中を以下のように変更し、dockerをrestartしたら治りました。

```　:変更前
{
  "registry-mirrors": [],
  "insecure-registries": [],
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  }
}
```


```　:変更後
{
  "registry-mirrors": [],
  "insecure-registries": [],
  "debug": false,
  "experimental": false
}
```


参考にした記事は、[こちら](https://www.toradex.com/community/questions/58055/docker-failure-when-attempting-create-cc-applicati.html)です。
【docker ECS】docker compose up の詳細設定


## 最初に

最近使えるようになった docker compose up コマンドでの細かい設定の方法を記載しています。

基本的なことはこちらの記事を参考にしてください。
[【Docker × ECS 入門】docker compose up で ECS デプロイ](https://qiita.com/Rubyist_SOTA/items/1ead200bf602569804ea)

## 設定方法

docker-compose ファイルに描き込めばokです。大体は参照ページのとおりです(細かい部分は違うようです)。

```yml
version: "3"
services:
  front:
    image: [AWS_ID].dkr.ecr.ap-northeast-1.amazonaws.com/front:latest
    # ーーーAWS設定ーーー
    deploy:
      x-aws-autoscaling:
        min: 2
        max: 10
      resources:
        reservations:
          memory: 300Mb
    # ーーーAWS設定ーーー
    command: bash -c "yarn run build && yarn start"
    ports:
      - "3000:3000"
    depends_on:
      - back
  back:
    image: [AWS_ID].dkr.ecr.ap-northeast-1.amazonaws.com/back:latest
    command: rails s -p 3001 -b 0.0.0.0
    ports:
      - "3001:3001"
```
ちなみにvpcを指定したいときは以下のようにすればok。こうすればRDSやelasticacheなどなどは事前に作成可能です。

```yml
version: "3"
x-aws-vpc: [VPC_ID]
services:
  front: # 略
  back: # 略
```

## 参考ページ

- [設定例](https://github.com/docker/compose-cli/blob/main/docs/ecs-compose-examples.md)
- [設定可能項目](https://github.com/docker/compose-cli/blob/main/docs/ecs-compose-features.md)
Pythonバージョン出力のプチ迷走

# 要約
pythonのバージョンによって、「python -V」コマンド実行による出力はstdoutで出力する場合とstderrで出力する場合に別れるよ....

# 詳細
Pythonのバージョンを確認する際、下記のようなコマンドを打つでしょう。

```
python -V
python2 -V
python3 -V
```
コマンドラインで表示されるバージョンをみんなは読み取るわけで。
ただ、この出力をShellゲーで取ろうとした時、プチ罠にハマった....。
Pythonはバージョンによってこのバージョン出力の方式が違うのである。
STDOUTで出力かSTDERRで出力かのふた通りがある

```
※python2 の確認
python2 -V 2>stderr

※python3 の確認
python3 -V 2>stderr
```

上記でコマンド実行時にコマンドライン上の出力にバージョン情報が出ていれば標準出力stdoutでバージョン情報を出しているpythonバージョン

```
cat stderr
```

でバージョン情報が見られるならstderrでバージョン情報をだすpythonバージョン


# 感想
複数の環境またいでいると、Shellゲーで地味にイラっとくるよ！


##### 同じコマンドで結果が欲しいなら？
まぁ、面倒なので下記でいいのでは...?

```
python2 -V 1 > std  2>&1 & cat std
python2 -V 1 > std  2>&1 & cat std
```


参考：　https://bugs.python.org/issue18338#msg192122
Python リスト要素を複数のインデックス（何番目か）で取得　シンプルな方法

Pythonのリストから複数のリストを取り出す時、連続している場合はスライスで簡単に取り出せますが、ランダムな場合の方法がなかなか見つからなかったので記事にします。


###環境
Python 3.7.3


タプルで指定

```
list = ['banana', 'apple', 'lemon', 'grape', 'kiwi']
[list[i] for i in (1,4)]  #['apple', 'kiwi']
```

もしくはリストで指定


```
list = ['banana', 'apple', 'lemon', 'grape', 'kiwi']
list2=[2,3]
[list[i] for i in list2]　#['lemon', 'grape']
```

Numpyなどのモジュールを利用する記事はあったのですが、シンプルに記述できました！

[この英語のサイトを参照しました](https://stackoverflow.com/questions/40694528/how-to-know-which-is-running-in-jupyter-notebook)
【Ruby on Rails】Bcryptとはなんなのか？

#はじめに
Bcryptとはなんぞや？

#Bcrypt
パスワードをハッシュ化するための関数を提供するgemのこと。
※bcryptのハッシュは復号化できないようになっている。
最初からgemfileに記載されていて`ハッシュ(#)`を外せば使えるようになります。

```ruby:Gemfile
# gem 'bcrypt', '~> 3.1.7' 
```
↓`ハッシュ(#)`を外して、**bundle install**を実行する。

```ruby:Gemfile
gem 'bcrypt', '~> 3.1.7' 
```
#Bcryptをインストールしてできること
・`has_secure_password`メソッドが使える。
・`authenticate`メソッドが使える

※二つのメソッドについて以下の記事で解説してます。
【Ruby on Rails】has_secure_passwordについて
https://qiita.com/iittaa/items/71ac74c0672c77f5723a


#Bcrypt::password.create("○○○○")
文字列（○○○○にはいる値）をハッシュ化した値を返す。

```terminal
:001:0> BCrypt::Password.create("foobar")
=> "$2a$12$W0qW0H5M2YRx2kyGdlBeMOS5cK11hbF8sT4.oKgWF6Aq43E6bjr0C"
```
Cypress+Cucumberのテスト結果を良い感じに出力する

# Cypress＋Cucumberのテスト環境
Cypressだけでもテストは書けるのですが、直感的にどういうテストを行っているのか理解しやすくなるので、Cucumberと組み合わせて使っています。
導入方法は [TypeScript \+ Cypress \+ CucumberでE2Eテストをやる](https://qiita.com/Ki-da/items/f8a69312f81c372b47de) が分かりやすく参考になりました。

# mochawesomeが使える・・・？
テストのレポートを出力したいと思って調べたところ、
[Cypress で html テストレポート \(mochawesome\) を出力する \- Qiita](https://qiita.com/kobanyan/items/11c67118051c152fdb69)　がヒットしました。
こちらの記事もわかりやすくまとまっていて参考になります。

mochawesomeでHTML出力すること自体は簡単にできましたが、出力される内容はCucumberのシナリオまでで、各シナリオでどのようなステップを実行しているのかが分からない状態でした。

それでもいいよ！って方はmochawesomeを利用するのも良いと思います。

# cucumber-html-reporterが良い！
せっかくCucumber使っているんだし、ステップの内容まで見たいですよね。
というわけで、さらに調べてみるとまさに同じ悩みを抱えている方を発見。
 [cucumber \- Can I generate cucumbur html report in cypress? \- Stack Overflow](https://stackoverflow.com/questions/60036258/can-i-generate-cucumbur-html-report-in-cypress) 

やることはAnswerに書いてある通りなんですが、もう少し補足しつつメモしておきます。

#### 1. cypress-cucumber-preprocessorの設定を追加
CypressとCucumberを組み合わせて使う場合、package.jsonにcypress-cucumber-preprocessorの設定を記載していると思います。
そこに下記を追記します。

```json:package.json
"cypress-cucumber-preprocessor": {
  "cucumberJson": {
    "generate": true,
    "outputFolder": "cypress/cucumber-json",
    "filePrefix": "",
    "fileSuffix": ".cucumber"
  }
}
```

この設定を行うことで、テスト実行後に結果のjsonファイルがoutputFolderに指定しているフォルダへ出力されるようになります。

#### 2. cucumber-html-reporterをインストール
手順1で出力したjsonをもとにhtmlを生成してくれるライブラリ [cucumber-html-reporter](https://www.npmjs.com/package/cucumber-html-reporter) をインストールします。

```shell
$ yarn add --dev cucumber-html-reporter
```

#### 3. html生成するためのjsファイルを作成
cucumber-html-reporterの設定を記載しつつ、実行するためのJSファイルを書きます。任意の場所に作成すれば良いです。

```javascript:cucumber-html-reporter.js

const reporter = require('cucumber-html-reporter');

const options = {
  theme: 'hierarchy',
  jsonDir: 'cypress/cucumber-json', // 手順1で指定したcucumberJsonの出力先
  output: 'reports/report.html', // 任意の出力先
  reportSuiteAsScenarios: true,
  scenarioTimestamp: true,
  launchReport: true,
  ignoreBadJsonFile: true,
  metadata: {
    ... // アプリのバージョンなどご自由に
  }
};

reporter.generate(options);
```

#### 4. htmlを生成
手順3のjsファイルを実行すると指定した内容がhtmlとして出力されます。

```shell
$ node ./cucumber-html-reporter.js
```

実際は、いちいち手動で実行せずにCypress run実行後に生成までしたいので、npmスクリプトを活用しています。
【Ruby On Rails】入力したテキストを改行させて表示させたい場合に用いるsimple_formatの使い方

備忘録です。

# simple_formatを用いない場合

```ruby:show.html.erb
  <% @hoges.each do |hoge| %>
    <%= hoge.text %>
  <% end %>
```




# simple_formatを用いた場合

```ruby:show.html.erb
  <% @hoges.each do |hoge| %>
    <%= simple_format(hoge.text) %>
  <% end %>
```

# ポイント
simple_format()という形の括弧内に表示させたい対象コードを記述する。
Flutter - AppBarのTitleを左寄せ、中央寄せにする

# AppBarの作成
まず、シンプルなAppBarを作成します。
コードは以下のとおりです。

```dart
appBar: AppBar(
  title: Text(
    "AppBar Sample",
  ),
),
```
次にその挙動を確認してみましょう。
機種は以下のとおりです。
iOS：iPhone12ProMax
Android：sdk gphone x86 arm
# 挙動(左:iOS 右:Android)
![reios.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/980010/501c207f-459c-a6fa-94a7-8b480c5c915c.png)![reandroid.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/980010/791421e7-1cfd-b51c-d1a6-469b249a3b6e.png)
# 挙動の共通化
おわかり頂けましたか？
iOSではタイトルが中央揃いになっていて、Androidではタイトルが左寄せになっています。
このように、位置を指定していない初期の状態では、挙動に違いが生まれます。
これらの挙動を共通化するためにはcenterTitleというプロパティを設定します。
コードは以下のとおりです。
# 左寄せ
```dart
appBar: AppBar(
  centerTitle: false,  // 中央寄せを解除
  title: Text("AppBar Sample"),
),
```
# 中央寄せ
```dart
appBar: AppBar(
  centerTitle: true,  // 中央寄せを設定
  title: Text("AppBar Sample"),
),
```
# まとめ
位置を指定していないAppBarのTitleは、iOS-Android間で挙動に違いが生まれる。
共通化するためには、AppBarにcenterTitleというプロバティを指定する。
# 最後に
ここまでご覧頂きありがとうございます。(^^)
もし記事の内容に不備がございましたら、ご指摘いただけると幸いです！
1年間専門学校の先生として学生にUE4を教えて感じた事

#〇 はじめに
みなさんメリークリスマス:evergreen_tree:
アドベントカレンダーに急遽空きが出来たと言う事で、
代打として12月25日当日で恐縮ではありますが記事を投稿させていただきます。

本来であれば技術的なTipsを投稿した方が良いとは思うのですが、
アドベントカレンダーを完成させるまでに時間がないと言う事で、他の方とは少し違う角度からUE4関連についての記事を投稿させていただきます。
最後までお付き合い頂ければ幸いです。


[「Unreal Engine 4 (UE4) Advent Calendar 2020 その2」](https://qiita.com/advent-calendar/2020/ue4_due
 "「Unreal Engine 4 (UE4) Advent Calendar 2020 その2」")の25日目の記事になります。

# 〇 自己紹介
コンシューマー開発をメインにプログラマーとしてフリーランスで活動している「トクナガ」と申します。
また週1でゲーム専門学校の先生としてUE4を学生に教えております。

# 〇 概要
2020年は新しい試みとして、専門学校の講師として学生達にUnrealEngine4(以下:UE4とする)を教えてきました。
業務をしていく中で感じた事をまとめさせていただきます。
※主観的な意見もあると思いますがご了承ください。

# 〇 学ぶ上での教材

定番の2冊を元に授業用に内容を少し噛み砕き解説しています。
本当に素晴らしい参考書だと思います。

[Unreal Engine 4で極めるゲーム開発](https://www.amazon.co.jp/dp/B0876RW7Z6
"Unreal Engine 4で極めるゲーム開発")
[Unreal Engine 4 マテリアルデザイン入門](https://www.amazon.co.jp/dp/4798050555
"Unreal Engine 4 マテリアルデザイン入門")

# 〇 UE4を起動させグレイマンを歩かせるまでの遠く険しい道のり

<img width="1000" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/980013/3c8e5421-05ac-e296-0211-50a2c0c3bb21.png">

>LauncherからUE4を起動、ThirdPersonTemplateを選択した状態でプロジェクトを作成。
ゲームをプレイする事でグレイマンが操作可能になります。

UE4を触った事がある人なら恐らく一度は行った事がある手順だと思います。
所要時間はおよそ3分。

ただしこの手順を30人同時に行うと...
全員が起動するまでおよそ60分ほどかかってしまいます。

30人も集まると様々な問題が発生します。
普段は滅多に遭遇しないバグやエラー、学生によってPCの環境も少しづつ違うため発生するエラーも異なってきます。
ほとんどは業務内で発生するバグのため瞬時に解決する事が出来ますが、稀に原因がわからないバグと遭遇した時はPCを預かり調査を行ったりもします。

#〇 学生がUE4を学ぶメリット・デメリット

## メリット 
自分達が表現したいと思う見た目や動きに近づける事が出来るため、
就職作品を作っていく上でモチベーションを継続する事が出来ているのかなと思います。

またUnityに比べれば情報はまだまだ少ないかもしれませんが、公式チュートリアルや有志の方のブログが豊富にあるため、調べれば何か情報があるという環境が構築されており、意欲的に学生自身がわからない事を調べて実装するという流れが出来ていると感じました。

さらにプログラマー志望以外の職種にもエディターを触ってもらう事で、レベルデザイン・バランス調整・シーケンサーによるカットシーン制作など、どの職種にも対しても就職として有利になる要素がたくさんある感じました。

## デメリット 
私が授業を教えている中で私自身の課題にもなっている事ではありますが、
ブループリント(以下:BPとする)でしかゲームを作る事が出来ない学生が出てきてしまいます。

授業でUE4とC++を混ぜ合わせて授業を教えればいいだけの話ではあるのですが、
初めてゲームエンジンを触る難易度が一気に上がってしまうため授業ではBPをベースに教えるいるのが現状です。

趣味や同人であればそれで問題ありませんが、会社で仕事する場合は少なからずC++を書く必要が出てきます。
外部ツールとUE4のプラグイン拡張、最適化、エンジン改造、etcあげればキリがありません。

簡単な機能であればチェックボックスにチェックつけるだけで実現する事が出来ますが
だいたいの場合は中のソースコードを確認しながらプロジェクト用に改造される事が多いと思います。

ゲーム制作において(特にコンシューマー)はC++を切りたくても切り離す事が出来ない
「動いている風なゲーム」は作れても「きちんと動いているゲーム」を作るのは中々難しいなと思いました。

# 〇 UE4と就職活動において
学生からUE4でゲームを作れたら就職は出来ますか？
本当によく聞かれる内容です。

私はその場合「Yes」と答えています。
ただし、上記に記載した「デメリット」をきちんと学生達が理解した上になります。

書類審査をされている方であればよく見る作品ではないかなと思いますが、キャラクターが自由に動き回り、足場が崩れる先を進んでいくアスレチックゲームを作っているだけでは書類選考を突破するのは難しいと思います。

コンシューマ会社を目指している学生には、
自分達がsteamでお金を払ってでもやりたいと思うゲームを目標に作らないと就職は難しいと伝えています。

私が教えている学生には下記2点を用意すればコンシューマ会社への内定はぐっと近づくと伝えています。
・DirectXを使用してC++ベースで書かれた作品 → 設計・ゲーム技術・ゲーム数学の理解度を伝える
・UE4を使用した面白いゲーム → 自分達が表現したい遊び、DirectXでは表現できなかった部分

# 〇 まとめ
ブログを記事を書いたの本当に久しぶりで読みずらい部分が多々あったと思いますが
最後までお付き合いありがとうございます。

これを気に技術発信も出来ればいいなと思いましたのでぜひよろしくお願いいたします。
MCMCのためのRStan環境構築 [mac, JupyterLab]

## 目的

* 確率的プログラミング言語である[Stan]()をRから利用するためのライブラリである「RStan」をインストールします。

## 動作確認環境

* macOS Big Sur (version 11.1)
* Jupyter Core : 4.6.3
* Jupyter Lab : 2.2.8
* R : 4.0.3

## 前提条件

* Rがインストールされていること

JupyterLab環境へのRのインストール手順については[こちら](https://qiita.com/roki18d/items/eae1f90d92f062f0b627)にまとめています。

## インストール手順

基本的には[公式リポジトリ](https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started-(Japanese))に記載されている手順に従います。
ただし本記事では、RStudioやRコンソールではなく、JupyterLabのRカーネル上で実行・動作確認しています。

JupyterLabを起動し、Rカーネルを起動します。

```
% jupyter lab
```

### 0. 古いRStanの削除

古いRStanがインストールされている場合には安全のため、以下の手順で既存のRStanパッケージを削除した方がよい場合があります。必要な場合のみ実施してください。

```r:In
remove.packages("rstan")
if (file.exists(".RData")) file.remove(".RData")
```

### 1. RStanのインストール

以下を実行することでRStanライブラリをインストールできます。

```r:In
install.packages('rstan', repos='https://cloud.r-project.org/', dependencies=TRUE)
```

筆者の環境で起きたエラーの回避策を示しておきます。

#### 【回避策1】 依存ライブラリ `igraph` のインストールエラー

macOSのバージョンに起因するclang errorが発生しました。
XCodeを再インストールすることで回避できました。

```
% sudo rm -rf /Library/Developer/CommandLineTools
% sudo xcode-select --install
```

#### 【回避策2】 依存ライブラリ `V8` のインストールエラー

`v8.h` がないからインストールできない、というエラーが発生しました。
HomebrewでV8をインストールすることで回避できました。

```
% brew install v8
```


### 2. C++コンパイラ

C++コンパイラがインストールされているかチェックするため、以下を実行します。
インストールされていれば `TRUE` が返ってきます。

```r:In
pkgbuild::has_build_tools(debug = TRUE)
# TRUE
```

### 3. インストールの確認

正常にインストールされていれば、次を実行することで以下のような出力が得られます。

```r:In
library(rstan)
```
```:Out
Loading required package: StanHeaders

Loading required package: ggplot2

rstan (Version 2.21.2, GitRev: 2e1f913d3ca3)

For execution on a local, multicore CPU with excess RAM we recommend calling
options(mc.cores = parallel::detectCores()).
To avoid recompilation of unchanged Stan programs, we recommend calling
rstan_options(auto_write = TRUE)
```

## 参考

* [stan-dev/rstan - GitHub](https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started-(Japanese))
* [[mac] pyenv+Jupyter-Lab環境にRをインストールする - Qiita](https://qiita.com/roki18d/items/eae1f90d92f062f0b627)
Docker Desktop for WindowsでWSL2ではなくHyper-Vで起動する方法

Windows10 Proでdockerを使おうとしたところ、WSL2を使って起動しようとしてエラーになっていたため備忘録。

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463831/2035a707-c8d9-ed0b-ac55-d0c1f4381d26.png)

## 解決策
![image (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463831/3eb8b072-c65c-ca92-48fc-183182776f3b.png)

設定画面から「Use the WSL 2 based engine」のチェックを外すだけ。
docker初めてだったこともあり、これを解決するのに1時間くらいかかりました。
AutoML Vision EdgeでTensorFlow.js用のモデルをexportしてみた


# 1. はじめに

IT業界にいるエンジニアにとって、機械学習は取り組んでみたい技術の代表格なのではないかと思いますが、実際に触ってみると、ものすごくハードルが高い技術であることを痛感させられます。
機械学習のハードルの高さを考えると、システムに機械学習の機能を組み込もうとする場合、特殊なものでない限りはAIベンダーが作成したプロダクトをそのまま、もしくはカスタマイズしてシステムに組み込むというアプローチが今後一般的になっていくのではないかと思います。
今回紹介するAutoML Vision EdgeはGoogleが提供しているプロダクトで、GCP上で(比較的)簡単にモデルを作成出来て、そのモデルをTensorFlow.jsなどを用いてEdgeデバイス上で動作させる事が出来る為、今のうちに使い方を覚えておくと今後役に立つかと思い、今回入門してみました。

※本記事はGCPが提供しているAutoML Vision Edgeで作成したモデルを、Edgeデバイスで実行してみる事が目的の検証記事の為、作成したモデルの精度面での検証は対象外としています。



## AutoML Vision

AutoML Visionは、機械学習の専門的な知識が無くても独自の画像分類を行える学習モデルを構築できるサービスと紹介されることが多いようです。個人的にはGCPで転移学習が出来るプロダクトぐらいの理解だったのですが、[この記事](https://cloud.google.com/blog/ja/products/gcp/automl-vision-in-action-from-ramen-to-branded-goods)によると、転移学習だけではなくネットワーク自体の最適化のアプローチも組み込まれているようです。
GCPに画像ファイルをアップロードした後、いくつかボタンを押すだけでモデルの生成まで出来ます。

## AutoML Vision Edge

AutoML Visionで生成したモデルをEdgeデバイス向けにエクスポートする機能です。
エクスポートされたモデルは、TensorFlow.jsやTensorFlowLiteなどから読み込んで実行する事が出来ます。※要するにGCP上に専用のサーバーを立てる必要が無い。

# 2. Edgeデバイス向けのモデル作成とエクスポート

今回は公式のチュートリアルの手順に従って、画像分類のモデルを作成してみました。
https://cloud.google.com/vision/automl/docs/edge-quickstart

上記のチュートリアルの通りに作業を進めると、5種類の花を分類するモデルが作成出来ます。
※学習データはサンプルをコピーして使う事になるので、自分で用意する必要はありません。

このチュートリアルを実施するにあたり、注意点を以下に記載します。

#### モデルのトレーニング時間

チュートリアルには1時間と記載されていますが、私が実施した時は約2時間半かかりました。
なので、最大で3時間ぐらいはかかるつもりでいた方が良いかもしれません。

#### モデルのエクスポート

チュートリアルでは、Tensorflow Lite用にエクスポートする記載となっています。
TensorFlow.js用にエクスポートする場合は、「TensorFlow.js」オプションを選択する必要があります。

#### GCPの利用料
GCPの利用料は大体1000円ぐらいかかりました。※当日は利用料が0円のままだったので反映までにタイムラグがあるようです。

# 3. TensorFlow.jsからモデルを読み込む

こちらも基本的に公式のチュートリアルの手順に従えば、問題なく動作しました。
https://cloud.google.com/vision/automl/docs/tensorflow-js-tutorial

ただ一点だけ、作成したアプリをブラウザで表示したところ、以下のエラーが表示されました。ネットで調べたところ、imgタグにwidthとheightを設定すれば良いと書かれてたので追加したらエラーが出なくなりました。

```cronsole
Requested texture size [0x0] is invalid. error when i am loading image in browser
```
※しかし上記のエラーを再現する為に、widthとheightを削除してもエラーが再現せず。。何故だ。。

## (おまけ) TensorFlowLiteからモデルを読み込む

こちらも公式のチュートリアルですが、TensorFlow.jsのチュートリアルと比べるとちょっと端折ってる印象。
https://www.tensorflow.org/lite/guide/python

以下に作業手順の概要を記載します。

#### モデルのエクスポート

Tensorflow Lite用なので、「TF Lite」オプションを選択する。

#### モデルのダウンロード

TensorFlow.jsのチュートリアルの手順でやればOK。

#### サンプルプログラムのコピー

チュートリアルからサンプルプログラムが置いてあるGithubページに飛べるので、そのファイルをコピーしてくる。

#### サンプルプログラムの修正

チュートリアルの記載に従ってサンプルプログラムを修正する。
※チュートリアルに記載されている箇所以外でもエラーが出るが、エラーメッセージを見ながら修正する。

#### サンプルプログラムの実行

以外に盲点だったのですが(GithubのReadMeには書いてあったけど)、サンプルプログラムを実行する時に、引数として上記でダウンロードしてきたモデルを指定しないとデフォルトのモデルを参照しようとしてエラーとなります。

# 4. さいごに

以上で、AutoML Vision で作成したモデルのエクスポートと、ブラウザ上で動作出来る事まで確認出来ました。
ただ、肝心の学習データを作るところはサンプルデータをコピーして済ませてしまったので、学習データの作り方については別途入門が必要そうです。