OmniAICreator/Qiita-1.07M huggingface dataset:
AWS資格を6冠達成できたので、振り返ってみた

#はじめに
先日、AWS認定試験の6個目の資格を取得することができました。
ちょうど資格コンプまで折り返し地点となったので、振り返りの記事を書いてみようと思います。

#私の経歴
2018年の1月にインフラエンジニアとして、未経験でスタートしました。
はじめは、未経験者採用をしている会社で、3か月のインフラエンジニア研修を実施後、様々な企業へ派遣され、色々揉まれました。
2021年の1月に、現在の会社へ入社し、現在に至る。
(エンジニア歴：約4年)

#AWS試験　受験履歴

|資格名称|受験日|点数|合格点|合否|
|:---|:---|:--|:--|:--|
|AWS Certified Solutions Architect - Associate|2019-05-01|695|720|不合格|
|AWS Certified Solutions Architect - Associate|2019-06-09|700|720|不合格|
|AWS Certified Solutions Architect - Associate|2019-10-19|788|720|合格|
|AWS Certified SysOps Administrator - Associate|2019-12-21|763|720|合格|
|AWS Certified Developer - Associate|2020-06-14|827|720|合格|
|AWS Certified Solutions Architect - Professional|2021-02-23|789|750|合格|
|AWS Certified Security - Specialty|2021-04-04|777|750|合格|
|AWS Certified DevOps Engineer - Professional|2021-10-31|852|750|合格|

↓追記
|資格名称|受験日|点数|合格点|合否|
|:---|:---|:--|:--|:--|
|AWS Certified Database - Specialty|2022-05-29|792|750|合格|

出だしのSAA資格で、2回も落ちたことで、自信を失ってしまいましたが、なんとか立ち直ることができ、3回目の受験で見事に合格しました。
最初に大きく躓いたことで、AWS資格は甘くないことを実感し、念入りに勉強をしてから受験するようになりました。


#自分が勉強した勉強法

##(1)AWS Certified Solutions Architect - Associate

**書籍**

* 徹底攻略AWS認定ソリューションアーキテクト: アソシエイト教科書(黒本)

　=>徹底攻略の本は、AWSサービスを全体を知るうえで役にたった。

* 合格対策 AWS認定ソリューションアーキテクト: アソシエイト

　=>合格対策の本は、あまり役に立たなかった。

**サイト**

* Udemy　「これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座」

　=>これのおかげで合格できた。これはほんとわかりやすかった。



##(2)AWS Certified SysOps Administrator - Associate

**書籍**

なし

**サイト**

下記サイトのみで、合格することができた。
https://aws.koiwaclub.com/


##(3)AWS Certified Developer - Associate

**書籍**

なし

**サイト**

下記サイトのみで、合格することができた。
https://aws.koiwaclub.com/

##(4)AWS Certified Solutions Architect - Professional

**書籍**

* AWS認定ソリューションアーキテクト-プロフェッショナル ~試験特性から導き出した演習問題と詳細解説

**サイト**

下記サイトの問題を3,4周した。
https://aws.koiwaclub.com/

**社内の対策講座**
自社内で実施していたSAP資格対策講座や問題集などが大きく役に立った。

##(5)AWS Certified Security - Specialty

**書籍**

* 要点整理から攻略する『AWS認定 セキュリティ-専門知識』

**サイト**

今回も下記サイトを活用。
https://aws.koiwaclub.com/

##(6)AWS Certified DevOps Engineer - Professional


**書籍**

なし

**サイト**

今回も下記サイトを活用。ほんと神サイト。
https://aws.koiwaclub.com/

#AWS資格の難しさランキング

今まで受験してきた中で、難しさの順にランキング形式でまとめていこうと思います。
(私個人の所感でランキングしたものなので、必ずしもそうとは限らないです。)

|順位|資格名称|理由
|:---|:---|:--|
|1位|AWS Certified Solutions Architect - Professional|問題文や問題数が多く、鬼畜な資格。<br>正直、二度と受験したくないトラウマ資格|
|2位|AWS Certified DevOps Engineer - Professional|1位と同じく問題数が多い。ただ、文章量は多くないので比較的楽。<br>また、同じような問題が多数でるので、要点を抑えとけばラク。<br>(試験中に仮眠をする余裕があった。)|
|3位|AWS Certified Solutions Architect - Associate|過去に2度も落ち、トラウマがあるのでこの順位。<br>出題範囲が意外と広いので、結構覚えることが多い|
|3位|AWS Certified Developer - Associate|開発者向けのサービスがほとんどの為、イメージがしづらく苦戦した。|
|5位|AWS Certified Security - Specialty|出題範囲が狭く、1か月程度、勉強すれば取れた。<br>ただ、対策問題には乗っていない問題が多数出たので、難しさはあった。|
|6位|AWS Certified SysOps Administrator - Associate|SAAの延長の問題が多数あったので、そんなに難しさは感じなかった。|


#最後に

来年もいくつかAWS資格を受験しようかと考えています。
ゆくゆくはコンプ出来たらいいなと思います。頑張ります(。-`ω-)
【Rails】form_withについて

##form_withとは
railsで情報を送信するためのヘルパーメソッド。 form_withを使うことにより、簡単に入力フォームに必要なHTMLを作成することができる。

##form_withの使い方

```
<%= form_with(モデル or URL(パス),[スコープ],[オプション]) do |f| %>
  フォームの中身
<% end %>
```
``モデル``
@userや@postなどモデルオブジェクトを入れる場合に使う。

``URL``
URLを指定する場合に使う。

``スコープ``
formのフィールド名にスコープを追加する場合に使う。

``オプション``
送信先のurlやタグの設定（クラスをつけたり、MIMEタイプを指定したり）

**モデルとurlの使い分け**
・モデル：　データベースに保存する時（登録フォームなど）
・URL：　入力された情報をデータベースに保存しない時（ログインフォームなど）

##form_withメソッドの便利な機能
form_withには、モデル（:model）で記述した場合の便利な機能がある。

引数として渡されたモデルクラスのインスタンスに``中身が入っているか否かで、フォーム送信後のアクションを create か update に自動的に振り分けてくれる``。

インスタンスに中身が入っていない場合はcreateアクションへ、中身が入っている場合はupdateアクションへ処理を振り分けてくれる非常に便利な機能。

**簡単に言うとモデルは中身が入っていると自動でeditメソッドを呼び出される。**

##form_withでよく使われるメソッド

| メソッド名| 役割 |
|:-:|:-:|
|  label  |  ラベルテキスト |
| check_box  | チェックボックス  |
|  password_field |  パスワード入力フィールド |
|  submit |  送信ボタン |
|  text_area |   複数行入力テキストエリア|
| text_field  |  テキスト入力フィールド |

**localオプション**
上記の表以外にもまだオプションはあるが、よく使うlocalオプションだけ少し違うので補足。

``:local``はリモート送信（Ajax通信のような非同期通信）によるフォームの送信の有効・無効を設定するオプション。

JavaScriptでAjax通信によるフォームの送信を実装する場合などは、何も記述しなくてOK。

逆に、ブラウザの読み込みをするような同期通信を実装する場合は、local: trueと記述して、リモート送信をオフにする。

##記入例

・URLを指定する場合

```
<%= form_with url: users_path do |f| %>
  <%= f.label :name, '名前' %>
  <%= f.text_field :name %>
  <%= f.submit "送信" %>
<% end %>
```

・モデルを指定する場合

```
<%= form_with model: @user do |f| %>
  <%= f.label :name, '名前' %>
  <%= f.text_field :name %>
  <%= f.submit "送信" %>
<% end %>
```

・スコープを設定する場合

```
<%= form_with url: users_path, scope: :scope1 do |f| %>
  <%= f.label :name, '名前' %>
  <%= f.text_field :name %>
  <%= f.submit "送信" %>
<% end %>
```

・オプションを設定する場合

```
<%= form_with url: users_path, class: "form_class", local: true do |f| %>
  <%= f.label :name, '名前' %>
  <%= f.text_field :name %>
  <%= f.submit "送信" %>
<% end %>
```

##参考記事
[【Rails】 form_withの使い方を徹底解説！](https://pikawaka.com/rails/form_with)
[Rails：form_withのオプションや特徴について整理](https://qiita.com/yamaday0u/items/a3689bc48a7eff55929b)
[form_withでのmodelとurlの指定の違いは？](https://qiita.com/kajikaji/items/5b5687fbb8ad287560fc)
[Ruby on Railsでform_withを使う方法を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/37888)
Flutterエラー忘却録


#開発環境
発生したエラー毎に記載する


#内容
何回も同じエラーを検索するのが大変なので記録として残しておく。
エラーが発生するたびに追加していく予定。

#発生したエラー

###●インポートしているのにlocalizationsエラーが発生する

####開発環境

PC:macOS Big Sur
エディター：Visual Studio Code



```
Target of URI doesn't exist: 'package:flutter_gen/gen_l10n/gallery_localizations.dart'.
```

###解決策
エディターを閉じて、ディレクトリも閉じる。もう一度エディターを開く。で解決した。

https://stackoverflow.com/questions/64574620/target-of-uri-doesnt-exist-packageflutter-gen-gen-l10n-gallery-localizations

###●Xcodeのビルドが失敗する

```
Undefined symbol: _FlutterMethodNotImplemented
Undefined symbol: _OBJC_CLASS_$_FlutterMethodChannel
```


####開発環境

PC:macOS Monterey
エディター：Visual Studio Code

###解決策
[.Net Core]AssemblyLoadContextの利用で困った話



## そもそもAssemblyLoadContextとは

https://docs.microsoft.com/ja-jp/dotnet/core/tutorials/creating-app-with-plugin-support

プラグインを用意して後から機能を足したいという場合にアセンブリを動的に読み込ませたい場合があると思います。
.NET FrameworkではAppDomainを分けて別々にロードすることができましたが、.Net CoreではAssemblyLoadContextが別であれば別アセンブリとして認識されるようになっており、AssemblyLoadContextを分けることで本体アプリが参照しているライブラリと同じものを利用するがバージョンが違うといった場合に読み込めないエラーを回避できます。

https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.loader.assemblyloadcontext?view=net-6.0

## 背景

私のプロジェクトでも後からプラグインとして機能を差し込めるように動的に読み込む口を用意していたのですが、読み込ませるプラグイン同士で連携するような構想が出てきたためにAssemblyLoadContextが分かれているのに同じ参照をさせたい。困ったぞということがありました。

もう少し詳細な困りごとを説明すると、各プラグインで提供するサービスを実装する上で必要となる本体のサービスはDI登録されているため、DIより取得するような仕組みを構築していたのですが、各プラグイン同士で定義されたサービスも連携させるために各プラグイン同士も参照させて取得したいケースが発生しました。

結論から言えば、開発者側が仕込むプラグインのことをモジュールを呼んでいるのですが、モジュールを読み込む場合のAssemblyLoadContextは分けずにデフォルトのAssemblyLoadContextにすべて読み込ませて、外部利用者向けのプラグインはAssemblyLoadContextを分ける方式で動的読み込みの仕組みを2つに分けて実現する方針が良さそうでした。


外部利用者向けのプラグインの話は一旦先送りとして、今まで分けていたモジュールのAssemblyLoadContextを1つに統合した場合に発生した問題があります。

## 問題

AssemblyLoadContextをデフォルトの1つとしてすべてのモジュールを読み込み、アプリケーションを起動した際に以下のようなエラーが発生しました。

```
System.IO.FileNotFoundException: 'Could not load file or assembly "**読み込んだモジュール**".resources.dll'. 指定されたファイルが見つかりません。'
```

## 解決法

以下の記事の手法を試したところ解消しました。

https://github.com/dotnet/runtime/issues/36053#issuecomment-984498651

>Workaround is to specify <NeutralLanguage>en-US</NeutralLanguage> in a Directory.Build.props. I guess [assembly: NeutralResourcesLanguage("en-US")] would work as well.

csprojに"\<NeutralLanguage>ja-JP\</NeutralLanguage>"を指定することが必要でした。

なぜこれが原因であったのか、ちょっと調べましたがよくわからなかったので私の想像ですが、Assembly.LoadFrom(path) を使用して読み込む際にCurrentCultureは特に設定していなかったので何も設定されていないかen-USあたりが設定され、カルチャ情報を取得しにいく際にエラーが出ていた？上記の対応でカルチャ情報が揃うことになり、解消された？

解決はしましたが、原因についてはちょっと納得していないためまた今度調査してみようと思います。
Googleアナリティクス導入方法（旧タグ併用、タグマネ）

##1. Googleアナリティクスでサイトに対するアカウントを作成し、GAタグと旧タグ（UA-）を発行する
1. googleアナリティクスにログインして表示された状態から、管理メニューをクリック
1. 左上のアカウントを作成(この時、詳細設定から旧タグを併用にチェックを入れることに注意)、必要情報を入力
1. プロパティを作成
1. プロパティの上のバーから旧タグ、GAタグ選択できるので、<br>
旧タグ：トラッキングコード<br>
GAタグ：データストリーム<br>
よりGA-...とUA-...のコードを取得し、メモ

##2. タグマネージャーに入って旧タグとGAタグのタグを仕込む

●まず右上のボタンからアカウントを作成する

####1. 旧タグ用
タグメニューから、Googleアナリティクス ユニバーサル・・・を選択、変数設定より新しく変数を作成し、旧タグのUAー・・・を入れる（トリガーはページビュー）

####1. GAタグ用
タグメニューより、GoogleアナリティクスGA4を選択、GA...タグを入れる（トリガーはページビュー）

:::note warn
作成後、コンテナのホーム画面で右上の公開を押すことに注意してください
:::


##3. タグマネージャーの指示通りに<head>の上と<body>の直後に生成されたコードを入れる

タグマネージャーで管理する場合、これを一式入れておくだけでタグマネージャーの管理パネルから新しくトリガーやタグを追加することができる。できれば全ページに仕込む


##3. Googleサーチコンソールを連携する

1. Googleアナリティクスの集客>SerchConsole>検索クエリ
1. データを・・・ボタン押す
1. プロパティでSerchConsoleを調整し追加
1. ドメインではなくURLの方で連携させる
1. 所有権を確認する、Googleタグマネージャー
udemy は玉石混合なり

この記事は [IT資格取得をテーマに学びをシェアしよう！【PR】Udemy Advent Calendar 2021](https://qiita.com/advent-calendar/2021/udemy) の 23 日目の記事です。

# udemy とは

ざっくりというと、オンラインで動画見て勉強してねっていうプラットフォームです。
自分のアカウントがいつごろかあるのか確認してみたら、少なくとも 2014/05/07 より前って感じですね。
その当時は、日本語のコンテンツなんて何もなく、英語ばかりでした。

## さっそく本題

udemy がIT系の資格取得に役立つかどうか？って話です。

### プロの先生かどうかはわからない

IT系の資格取得の仕方を教えてくれるような教材は udemy 上にもいっぱいあります。
資格を持ってる人が教えているものも多いです。
ただ、そのどれでもいえることですが、教えるプロが教えているわけではないのです。

これは、こういうラーニングプラットフォーム共通の話ですが、必ずしもプロが教えているわけではないってことですね。

### 日本語だと聞けるけど、英語だとやばいのもある

日本語の教材だと、理解できないほど聞きづらいものっていうのは少ないと思います。
ただ、英語（他の言語もそうかもだけど）の教材は気を付けないと結構苦労します。
インドの英語とか結構くるものがあります。

### 無料で見られる教材をまず見ろ

ってことで、当たり前ですが、プレビューで無料で見られる部分を積極的に見ていきましょう。
先生と合うかどうかもありますし、英語とかならちゃんと理解できるかどうかも把握できます。

自分なんかは、何も見ずに買って、全然理解できない英語だった時がありますｗｗｗ

### IT資格試験ならどんな教材がいいのか

IT資格試験の教材で気を付けたいのは、本体の資格の内容自体が結構こまめに新しくなっていることです。
udemy では、出したまま更新されていない教材も結構あるので、そのあたり更新されてるか確認も必要です。
買ってみたけど、アップデートされておらず、あまり役にたたなかったということもあるかもしれません。

### 星をあてにしすぎるな

udemy では評価基準に星がつけられているのですが、これも信頼しすぎてはいけません。
無料で配って、レビューにいい評価をつけてということもできるからです。
ですので、自分でしっかり確認してから購入しましょう。

とはいえ、星が多い方がいいのは確かです。

### 実際問題 udemy だけで合格できるか

これは、何にでも言えることだと思うのですが、やる気さえあれば合格はできるんじゃないでしょうか。
何もやらずに合格できる人は素地があるからでしょうし、受からない人は努力不足なんだと思います。
udemy も見ただけではなかなか合格は難しいと思います。
見たうえで、きちんと勉強をしていけば、知識の整理には役立つと思います。

資格によっては、テスト問題もついているものがありますし、そういうものも活用できると思います。

### という私は。。。

この業界に２０年以上いますが、資格持ってないんですよね。。。
資格に関しては、無神論者に近いかもしれません。

ただ、最近は、クラウド系の資格を取ろうかなとは思ってきたので、udemyで教材漁りをしたいと思います。

## まとめ

udemy 以外にも学習プラットフォームが出てきて、日本語に限定するなら udemy でなくともいい感じはあります。
ただ、udemy はキャンペーンとかもやっていて安くなることもままあるので、そういう時に購入するとよいと思います。

色々正直に書きすぎて、udemy に嫌われそうですけど、とりあえずさっき見たら、教材８００個くらい買ってるので許してください。

## 参照リンク

- [udemy](https://www.udemy.com/)

## おまけ

今日は、自分の誕生日・・・祝日じゃなくなったけどｗ
メモリに乗り切らない巨大配列のシリアライズにCBORフォーマットを採用した


## TL;DR

- 要素数が分からず、メモリに乗り切らない可能性がある配列をシリアライズする必要があったので、フォーマットとして CBOR を採用した。
- Protocol Buffers[^protobuf] や Ion, MessagePack, BSON などの主要なバイナリフォーマットで配列を扱う場合、要素数またはバイト長を先頭などに記述する必要があるため、メモリに乗り切らず要素数が簡単には分からない配列を（単純には）シリアライズすることができない
- CBORは要素数不明の配列を表現する手段が[ある](https://www.rfc-editor.org/rfc/rfc8949.html#name-indefinite-length-arrays-an)
- Java/Kotlinの場合、jackson の [jackson-dataformats-binary](https://github.com/FasterXML/jackson-dataformats-binary)を利用してストリームパーサ等を実装することにより、データすべてをメモリに乗せずにシリアライズ・デシリアライズすることができる
   - jackson-dataformats-binary ではシリアライザ等の実装を JSON と共通化しているため、 CBOR のシリアライザ・デシリアライザを実装すると、JSON 向け実装が自動的に出来上がっていて便利
- 巨大データの永続化やデータのストリーミングなどには、シリアライズフォーマットとして CBOR が使えることを知っておくと役立つかも

[^protobuf]: 厳密には、Protocol Buffersで配列に当たる `repeated` 要素自体は、 `packed` 形式にしない限りバイナリ中に要素数を含まないのですが、`repeated` 要素は必ず `message` に内包されなければならず（i.e. JSONのように配列をルートにすることができない）、 `message` のバイナリエンコーディングは必ずペイロード長を持たなければならないため、結果的に配列のサイズをデータの先頭に書かなければならないことになります（そもそもProtocol Bufdfersは、1MBを超えるデータのシリアライズに用いるべきではないと公式に[明言されています](https://developers.google.com/protocol-buffers/docs/techniques#large-data)）。

## 始めに
担当しているプロジェクトが多忙になってしまい、この1年半ほど本テックブログをまったく更新できていませんでした。
アドベントカレンダーの時期[^advent]ですし、前回記事を書いてから1年経ってしまいましたし、そろそろ何か記事を書かないとという気になってきたので、先日お仕事で遭遇したちょっと興味深い話を記事にします。

[^advent]: 弊社も[アドベントカレンダー](https://qiita.com/advent-calendar/2021/advent-works-hi)をやっておりますが（宣伝）、今年はエントリー時期に多忙を極めており参加する機会を逃してしまいました……。

## 前提
現在書いているプロダクトで、メモリに乗り切る想定であったデータがメモリに乗り切らない状況が発生したため、メモリ上のデータを急遽ディスク上に退避させる必要が生じました。そのため、速やかにデータのシリアライズフォーマットを決定し、シリアライザ・デシリアライザを実装する必要に迫られました。

実装すべき機能やシリアライズすべきデータの特徴として、以下の点が挙げられました。

- 1要素あたり数KB程度のデータがネットワーク越しに逐次的に渡されて来るので、それを加工して次の処理に投げるようなよくある処理
- 諸事情により、受け取ったデータを一旦すべてバッファする必要がある
- 受け取るデータは全体として数十GBを超える大きさになり、メモリに乗り切らない恐れがある
- データ受け取り順を保存し、受け渡し時に再現しなければならない
- SQSのようなマネージドなキューイングサービスは利用できない
- 実装言語は Kotlin/JVM

## 選定の経緯
今回はライブラリとしてjacksonを使用し、データフォーマットにCBORを使用することに決定しましたのですが、その際に考慮した主な点が以下の通りです。

- 実装速度や今後の拡張性、メンテナンスコスト等を考えると、独自フォーマットの策定は当然なし
- データは人間が読む必要はない上、スループットやファイルサイズに多少気を配らなければならない状況であるため、バイナリフォーマットのほうが望ましい
    - 文字列が多くを占めるデータをシリアライズするため、バイナリフォーマットの採用によるデータサイズの削減効果は正直期待していませんでしたが、実装後の測定で、CBOR でシリアライズしたデータは JSON の場合に比べてデータサイズを 20% から 30% 程度減らすことができていることを確認しました。
- Protocol BuffersやIon, MessagePack, BSON等のメジャーなバイナリフォーマットは、どれもデータの中に配列長やペイロード長を記述しなければならないため、ストリーム処理に向かない
- CBORというデータフォーマットは、不定長の配列をストリームミングするための表現形式がある
- Kotlinの準標準的な扱いのシリアライザライブラリである [kotlinx-serialization](https://github.com/Kotlin/kotlinx.serialization) では、 CBORはまだ Experimental 扱い
- jackson-dataformats-binary ならば、`JsonParser` や `JsonGenerator` を利用することで CBOR をストリーム処理することができる


## 最後に
CBORは Wikipedia 日本語版に記事がないなど、日本国内では他と比べてまだマイナーである印象を拭えないフォーマットです。しかしながら、データをストリーミングしたり、巨大データをシリアライズしたりするようなケースでは、他のフォーマットに比べて有利になる場合がある、という事を今回の案件を通じて学ぶことができました。
[AWS / RDS] 「IP」だと効果がなく、「インバウンドルール」なら効果があった（ERROR 2003 (HY000): Can't connect to MySQL serverの対策）

# 症状

RDSのセキュリティグループが設定できていない時って、こういうエラーが出ますよね。

```bash
$ mysql -u username -p -h hoge-hoge.123456abcdefg.ap-northeast-1.rds.amazonaws.com -P 3306
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on 'hoge-hoge.123456abcdefg.ap-northeast-1.rds.amazonaws.com:3306' (110)
```

でもですね～。
セキュリティグループのインバウンドルール、ソース部分に**パブリックIPアドレスを設定していてもこのエラーが出た**んですよね～。
なんなんですかね～( ˘·ω·˘ ).。oஇ

# 解決策

と思っていたら、たまたま見つけた記事に、

:::note info
インバウンドルールの「ソース」として、
「セキュリティグループ」を設定。

その結果、RDSへのアクセスに成功。
:::

という話が書かれていました。

その記事に倣って、インバウンドグループのソースに、「パブリックIPアドレス」ではなく「セキュリティグループ」を設定したところ、RDSへアクセスできるようになりました。

## 方法

ソースへのセキュリティグループ設定ですが、
セキュリティグループの「インバウンドのルールを編集」から編集できますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/192f9e67-95c4-8e6b-2f07-8034719863b8.png)

そして、以下の画像を見てわかる通り、

![2021-12-23_17h55_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/0d3163e2-80d6-8fab-dfaf-169761bdf229.png)

ソースのプルダウンボックスでは、既存EC2のセキュリティグループも選べるようになっています。
しかも、ボックス内に文字を入力するとEC2の名前で絞り込みがかかるようになっているんですね。便利。

RDSにアクセスさせたいEC2のセキュリティグループを選んで、ルールを保存すると、

```bash
$ mysql -u username -p -h hoge-hoge.123456abcdefg.ap-northeast-1.rds.amazonaws.com -P 3306
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 630847
Server version: 5.7.33-log Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

無事アクセスできました^^

# これを書いた人の気持ち

IPアドレスでもセキュリティグループでも問題なく動作するはずではあるのですが、、、「セキュリティグループによる設定でうまくいく場合もあるよ」ということが伝えたくて記事にしておきました。

# 補足

「最初に設定したIPアドレスが間違っていたんじゃないの？」
と思うかもしれませんが、インフラ担当者と私の2人で確認して、それでも「合っている」ように見えたので、IPアドレスの設定ミスではないと考えています。（多分ね^^;）

もし、ソースにIPアドレスを設定していて、「どう見てもうまく設定しているのにRDSに接続できない」、、、という場合は、ダメ元でセキュリティグループの設定を試してみてもいいかもしれません。

# 参考記事

インバウンドルールのソースにセキュリティグループを設定するようにと書いていた記事はこちら。

https://suzutukiblog.com/index.php/2021/05/14/cant-connect-to-mysql-server-on/
Draw.ioのレイヤー機能の挙動をまとめた

# はじめに
Draw.ioを使っていて、レイヤーの挙動に悩まされることが多かったので、自分なりにまとめてみました。


# 環境
2021/12/23 時点
VSCode Ver1.62.2
Drawio Integration Ver1.6.3

# レイヤー機能
Draw.ioでは図形を各層ごとに分ける機能（レイヤー機能）が備わっており、この機能を上手に使うことで複雑なモデルの作成が容易になります。
こちらにレイヤー機能について詳しく載っています。
[カキノタblog](https://zukai.kakinota.net/how-to-zukai/appli/draw.io/basic/layer/)


# 他のレイヤーから図形を複製した時
複製された図形は選択先のレイヤーに配置されます。
この挙動はまだ直感的に理解しやすいですね。

![複製.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393232/57b01ad3-3edf-3559-ca47-31e0c7aade8a.gif)


# レイヤーの異なる図形を接続した時
線や矢印などのコネクタは、異なるレイヤー配置の図形に接続することができます。
接続先の図形が非表示になるとそれに連動してコネクタも非表示になります。
コネクタが見当たらないと思ったら一度すべてのレイヤーを表示させて確認すると良いでしょう。

コネクタはレイヤーがロックされた状態でも接続先として参照してしまいます。
図形のプロパティを開いてConnectableのチェックを外すことでコネクタが接続しないようにできますが、関係ないレイヤーはレイヤーごと非表示にするほうが手っ取り早いです。


![接続.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393232/8ddbf4a8-ab01-39c8-0e8e-01686c05085b.gif)



# レイヤーの異なる図形をグループ化した時
レイヤーの異なる図形は[配置]-->[グループ化]でグループ化できないようになっていますが、あらかじめ作ったグループにドラッグ&ドロップすることでグループに追加することができます。
うっかりグループに追加してしまうと図形がグループ元のレイヤーに移動してしまうのでとても厄介です。
作業する際は必ず関係ないレイヤーがロックされているか確認しましょう。

また、一度グループ化した図形はドラッグ&ドロップでグループから除外すると選択先のレイヤーに配置されます。

コンテナも処理的にはグループと同じなため、コンテナの中に入れた図形はコンテナのレイヤーに配置されます。

![コンテナ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2393232/2f014586-571d-8817-d52c-fc3fc5824979.gif)


# 最後に

レイヤーが複雑にならないようにするために、以下のことに気を付けましょう。

1. 使わないレイヤーは必ずロックする。
1. コネクタを使う時は関係ないレイヤーを非表示にする。
1. 極力コンテナは使わない。
1. もし使う場合はコンテナの中身はシンプルにするよう心掛ける。

# Appendix
[Draw.io Integration - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio)
[VSCodeでDraw.ioが使えるようになったらしい！ - Qiita](https://qiita.com/riku-shiru/items/5ab7c5aecdfea323ec4e)
[レイヤー - draw.io - カキノタblog](https://zukai.kakinota.net/how-to-zukai/appli/draw.io/basic/layer/)
Flutter on the Webでつくった「ウマ娘」サイトをFirebase Hostingで公開した

# Flutter Advent Calendar 2021
この記事は、[「Flutter Advent Calendar 2021」](https://qiita.com/advent-calendar/2021/flutter)への投稿です。
半分くらいまでひとつの記事で書いていたのですが、（特にFirebase Hosting以降）長くなったので項目毎に分割してお届けします。

# Flutter on the Web
Flutter 2から正式サポートされたweb supportでウェブアプリを構築して、Firebase Hostingで公開しました。
既に公開から7ヶ月経っているのですが、その基本的な手順をまとめてみました。

ゴールデンウィークに時間があったので作って公開しました。

https://umadiagram.com/

はい「ウマ娘」です。
ウマ娘、それぞれの元となった競走馬の生涯が気になってレースを追うと、同じ時代に活躍した他のウマ娘との縁が気になってきます。
出場したレースで勝った場合は2着馬、負けた場合は勝利馬は「netkeiba」等でも一覧でわかるのですが、それ以外にも多くのウマ娘が同じレースで走っていることがあります（走っていない場合も多いですけど）。
それをタイムラインで見ることができれば楽しいだろうなと作ったのがこのサイトです。
ちょうど仕事でflutterスマホアプリを作っていたので、じゃあ試しにwebもこいつでと作ってみました。

基本的な手順は公式ドキュメントに沿っています。

https://docs.flutter.dev/deployment/web

# ガワを作る

5月に作成した時はまだ2.0系と古かったのですが、現在適用しているSDKバージョンは以下の通りです。

```sh
% flutter --version
Flutter 2.8.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 77d935af4d (4 days ago) • 2021-12-16 08:37:33 -0800
Engine • revision 890a5fca2e
Tools • Dart 2.15.1
```
アプリを生成します。
アプリ名以外、特にオプションはありません。

```sh
$ flutter create myapp
$ cd myapp
```

## ローカルでのテスト

```sh
$ flutter run -d chrome --web-renderer html
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4668/ceeaa908-13c8-fd06-9e57-272609f150bd.png" width="512px">

chromeが立ち上がって動きました。
`--web-renderer` のオプションは不要なのですが、CanbasKitレンダラーが重いと感じることが多かったので、明示的にhtmlを選択しています。ただの好みです。

| web renderer | 説明 |
|:---------------|:------------|
| auto           | レンダリング時に自動選択される。モバイルブラウザではhtmlが、デスクトップブラウザではcanvaskitが選択されるとのこと。 |
| html           | HTML、CSS、SVGで構築される。ダウンロードサイズ少なめ。 |
| canvaskit      | CanvasKitでレンダリングされる。より高速だがダウンロードサイズは2Mほど増える。 |

Web renderers - Flutter
https://flutter.dev/docs/development/tools/web-renderers

# タイトル属性を設定

TitleウィジットでHTMLの`<title>`属性を動的に設定します。

https://qiita.com/hidea/items/b21bad32e3cc23123811

# index.htmlやOGPを変更

`web/index.html`をカスタマイズします。

https://qiita.com/hidea/items/4c003c6941a9b795c318

# beamerでルーティングを定義

`beamer`パッケージでURLのルーティングを制御します。

https://qiita.com/hidea/items/c3fe2a536388a4261778

# URL形式を変更

デフォルトだとハッシュリンクになっているURLパスを通常のパス形式に変更する。

https://qiita.com/hidea/items/d8141eef0da6093282f3

# Flutterでレスポンシブ

Flutter on the Webに限らない話ですが、使われる環境の幅が広いWebだからこそレスポンシブの需要も大きいかと思います。

https://qiita.com/hidea/items/3eca1f88d57b903d18f5

# Firebase Hostingで公開する

GitHub Actionを利用してデプロイする仕組みを構築します。

https://qiita.com/hidea/items/bb1428ff17bc93aeb2f4

# Firebase Functions

Twitter Card等のクローラー等に対応する為に、Firebase Functionsを利用してタイトルやOGPを変更します。

https://qiita.com/hidea/items/bda1b029aeb78f410ca5

# その他

なるべく、Flutter on the Webの公開に依存した話を抜粋してまとめてみました。

今回は静的ホスティングにこだわってみました。
競走馬のデータはローカルでnetkeibaからスクレイピングしてDBに記録しています。
新しいウマ娘が公開、育成やサポートカードになって属性に変更があった時に情報を設定し、Flutterの`assets`下にjsonファイルで出力してそれを参照して表示する造りになっています。

```yaml:pubspec.yaml
  assets:
    - assets/bg.jpg
    - assets/lastmodified.json
    - assets/horse/
    - assets/race/
    - assets/series/
```

馬、レース、過去のレースとページ毎に必要なデータはひとつのJSONにまとめました。

この辺りや表示周りで利用したパッケージは、また別の機会で記事にしようと思います。
N+1問題

##N+1問題とは
N + 1問題とは、必要以上にSQLが発行されてしまい、動作が悪くなってしまう問題のこと。
必要以上にSQLが発行されると時間が掛かり、これが数回なら特に動作に影響はないが、何万回と回数が増えると動作が重くなってしまう。

##N+1問題を実際に見てみる
※ここではテーブルのアソシエーションについての説明は省く。

ネコの飼い主のテーブルがownersテーブル、ネコの名前を扱うテーブルがcatsテーブルの２つのテーブルを例にN +1 問題を確認していく。

「全ての飼い主の猫の一覧」をviewで表示したい場合、controller側で全ての飼い主をallメソッドで取得し、view側で飼い主の持つcatsをアソシエーションによって下記の様に記述。

```
# controller
@owners = Owner.all

# view
@owners.each do |owner|
  owner.cats.each do |cat|
    cat.name
  end
end

結果：
# controller
SELECT `owners`.* FROM `owners`

# view
SELECT `cats`.* FROM `cats`  WHERE `cats`.`owner_id` = 1
SELECT `cats`.* FROM `cats`  WHERE `cats`.`owner_id` = 2
SELECT `cats`.* FROM `cats`  WHERE `cats`.`owner_id` = 3
SELECT `cats`.* FROM `cats`  WHERE `cats`.`owner_id` = 4
```

その結果、catsテーブルに対して、4回のアクセスが行われている事がわかる。
このように``ownersテーブルへのアクセス１回に対して、関連するテーブルがN回発行されている``1+Nの状況を「N+1問題」と言う。

この問題を解決すれば、ownersテーブルにアクセスする際に、関連するcatsテーブルのレコードを取得する事が出来れば、発行されるSQLも4回から1回にまとめる事が出来る。

##includesメソッドを使ってN+1問題を解決
includesメソッドで指定された関連付けが最小限のクエリ回数で読み込まれるため、これによってN+1問題を解決する事が出来る。

``includesメソッド``
includesメソッドは、引数にアソシエーションで定義した関連名を指定して定義。(**※テーブル名ではない**)

```
モデル名.includes(:関連名)
```

先程の飼い主と猫のテーブル例にincludesメソッドを入れると、viewのアクセス数が``4回→1回``に減っている。

```
# controller
@owners = Owner.includes(:cats)

# view
@owners.each do |owner|
  owner.cats.each do |cat|
    cat.name
  end
end

結果：
SELECT `owners`.* FROM `owners` 
SELECT `cats`.* FROM `cats`  WHERE `cats`.`owner_id` IN (1, 2, 3, 4...)
```

このように、includesメソッドを使うと関連するテーブルのレコードをまとめて取得させる事によって必要以上のSQLを発行する事なく済むようになる。

##参考記事
[【Rails】 N+1問題をincludesメソッドで解決しよう！](https://pikawaka.com/rails/includes)
vue3.js 外部コンポーネントを読み込む、使う

top.vue に HogeComponentを読み込む

```HogeComponent.vue

<template>
    <div>
        ほげコンポーネント
        {{message}}
    </div>
</template>
<script>
    export default {
        data(){
            return {
                message:'マイ・ドリーム',
            }
        },
    }
</script>


```


```top.vue

<template>
    <div>
        <HogeComponent></HogeComponent>
    </div>
</template>


<script>

    import HogeComponent from './HogeComponent'

    export default {

        components: {
            'HogeComponent': HogeComponent//この書き方が大事
        },

        data(){
            return {
                name:'ひでき',
            }
        },

    }

</script>

```
C#でGitHubを操作するOctokit.netを使って色んな情報を取得する

# はじめに

C#でGitHubのリポジトリブラウザーみたいなのを作りたいと思い、C#でGitHubを操作できるライブラリであるoctokit.netでどんな情報が引っ張れそうか調べました。
octokit.netのリポジトリは[こちら](https://github.com/octokit/octokit.net#octokit---github-api-client-library-for-net)。
公式ドキュメントは[こちら](https://octokitnet.readthedocs.io/en/latest/)。

# 事前準備

個人アクセストークンの発行が必要です。取得方法は[こちら](https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)を参照してください。
トークンに付与する権限はrepoのみでいいと思います。
また、プロジェクトにOctokit.netのNugetPackageをインストールする必要があります。
詳しくは[こちら](https://github.com/octokit/octokit.net#getting-started)。

# 色々情報を取得する

## リポジトリ内のすべてのファイルを取得する

リポジトリブラウザーを作りたいので、まずは、指定したリポジトリファイルやフォルダ構造を閲覧できるよう、ファイルやフォルダを取得する必要があります。
以下のサンプルプログラムで説明します。

```cs


// GitHubクライアントを作成
var tokenAuth = new Credentials("ここに個人アクセストークンを指定する");
var client = new GitHubClient(new ProductHeaderValue("my-cool-app"),
new InMemoryCredentialStore(tokenAuth));

// ブランチをすべて取得
var branches = await client.Repository.Branch.GetAll("リポジトリのオーナー名", "リポジトリ名");

// リポジトリにあるファイルやフォルダの情報を取得

// リポジトリの直下のファイルまたはフォルダをすべて取得できる
// 第3引数にブランチ名を指定することもできる。
var contents = await client.Repository.Content.GetAllContents("リポジトリのオーナー名", "リポジトリ名");

// 上記で取得したフォルダのトップレベルのファイル・フォルダを取得する。
// フォルダまでのパスを指定すれば、そのフォルダ直下のファイルやフォルダが取得できる
var folderContents = await client.Repository.Content.GetAllContents("リポジトリのオーナー名", "リポジトリ名", 
    contents.FirstOrDefault(c => c.Type == ContentType.Dir).Path);
```

## 指定したファイルのコミット履歴を取得する

リポジトリブラウザでは、特定のコミット時点でのファイルを取得したい場合もあると思います。そのため、コミット履歴を取得してこようと思います。
以下のサンプルプログラムで説明します。

```cs

// 今回はリポジトリ直下の一番最初にあるファイルを指定
var contentPath = contents.FirstOrDefault(c => c.Type == ContentType.File).Path;
var commitRequest = new CommitRequest()
{
    Path = contentPath;
};

// 新しい順に10件だけ取得する
// 次の10件を取得したい場合はStartPageの指定を＋1する
var apiOptions = new ApiOptions()
{
    PageCount = 1,
    PageSize = 10,
    StartPage = 1
};
var commits = await client.Repository.Commit.GetAll("リポジトリのオーナー名", "リポジトリ名", commitRequest, apiOptions);

```

## 指定したファイルを取得する

リポジトリのファイル一覧からファイルや、そのコミットを選択し、そのファイルを取得しようと思います。
以下のサンプルコードで説明します。

```cs

// ファイルのデータを取得する
// refernce引数にはファイルのブランチ名や、コミットハッシュを指定できる
// 今回は上の章で取得してきた、リポジトリの直下の一番最初にあるファイルの一番最初のコミットを指定
var reference = commits.FirstOrDefault().
var rawContent = await client.Repository.Content.GetRawContentByRef("リポジトリのオーナー名", "リポジトリ名", contentPath, reference);

```

バイト文字列が取得できます。
ContentPathからファイルの拡張子を取得してローカルフォルダに保存するなどすれば、ファイルを開くことができます。

# さいごに

[公式ドキュメント](https://octokitnet.readthedocs.io/en/latest/)にはなぜか今回書いたようなリポジトリの中身を取得するみたいなのが書いてなかったのもあり、今回まとめてみました。
ライブラリの[リポジトリ](https://github.com/octokit/octokit.net)を見ると、ライブラリでGitHubから柔軟に情報を取得できるみたいでした。
データ構造をバイナリイメージにしてプロセス間共有する

## Memory Mapped File

Memory mapped file は仮想メモリのしくみをつかったファイルアクセスの方法です。

現代的な OS では仮想アドレス空間と物理アドレス空間を分離することで、実メモリよりもおおきなアドレス空間をあつかうことができます。ページングをつかった仮想メモリシステムでは図[^1]のように仮想アドレス空間と物理アドレス空間をページ単位にわけて、仮想アドレス空間上で必要になったページのみを物理アドレス空間に割り当てることで効率よくメモリを利用します。

![paging.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2370833/8e46f0fa-3187-a717-aba3-7fefbd4324e6.png)

[^1]: M. K. McKusick and G. V. Neville-Neil (2004), The Design and Implementation of the FreeBSD Operating System, Addison-Wesley, p. 137, Fig. 5.2 から改変

Memory mapped file ではこの仕組みをつかってプロセスの仮想アドレス空間にファイルをマッピングします。`read(2)`による固定長のバッファをつかった細切れのアクセスにくらべ、簡単に連続したメモリとしてアクセスできるようになります。仮想メモリの仕組みにより必要になったときに物理アドレス空間に (ページ単位で) 読み込まれるので自動的に遅延読み込みをおこなうことができます[^2]。

[^2]: 不要になったときはカーネルがページを物理アドレス空間から追い出し、別の仮想アドレス空間に割り当てます。

書き込み時は copy-on-write が適用され、書き込みのないページは物理アドレス空間上でプロセス間共有されます。

## データ構造をバイナリイメージのまま利用する

[Sudachi](https://github.com/WorksApplications/Sudachi) では辞書ファイルの読み込みにこの memory mapped file の仕組みを利用しています。Java 版では [MappedByteBuffer](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/MappedByteBuffer.html)、[Sudachi.rs](https://github.com/WorksApplications/sudachi.rs)/SudachiPy では [memmap2](https://docs.rs/memmap2/latest/memmap2/) を通じて辞書ファイルを直接メモリ上にマッピングします。これによって比較的おおきな辞書ファイルを効率よく読み込むことができ、またプロセス間で共有することでメモリ消費をおさえることができます。

一方で、ファイルイメージを直接メモリ上にマッピングしてしまうため、通常ファイル読み込み時におこなうような読み込みながらバイナリデータをオブジェクトに変換していくことができなくなります。

そこで Sudachi 辞書では TRIE や連接表などは int や short の配列だけでデータ構造をつくり、バイナリイメージのまま利用できるようにしています。またオブジェクトの作成が必要な `WordInfo` などはできるだけ生成を遅延し、文字列も Java の char 配列でダンプするようにしています。

これらのテクニックは[茶筌](https://ja.osdn.net/projects/chasen-legacy/)や [MeCab](https://taku910.github.io/mecab/) でつちかわれてきたものです。昨今ではこういった工夫が必要な場面もすくなくなりましたが、ときには古い技術を見直すのもいいかもしれません。

ではよい Sudachi life を。
ラベルプリンターの設定をバッチファイルで設定する

小林クリエイトのラベルプリンターの設定をバッチファイルでやりたかったので、下記のバッチファイルでやりました。
対象ドライバーは、
https://k-cr.jp/download/ip-70/index.php

#前提
ドライバーに付属してくる「ImportExportTool.exe」を使います。
使い方は

```ImportExportTool.exe
ImportExportTool.exe <Printer_name> <File_name> <import|export> <current|default>
```

最後の引数はユーザですね。


#設定のエクスポート
例によってexportを引数にします。

```export.bat
@echo off

call ImportExportTool.exe printer_name sample export current
```

すると、「sample.drx」というファイルが出来上がります。


#設定のインポート
引数をimportにします。


```import.bat
@echo off

call ImportExportTool.exe printer_name sample.drx import current
```

シンプルでした。

#追記
プリンター自体のインストールは通常どおりでした。

```pinterinstall.bat
rundll32 printui.dll,PrintUIEntry /if /b sample /f SatoJpnNG2.inf /r sample
```
Flutterでレスポンシブ

この記事は、[「Flutter Advent Calendar 2021」](https://qiita.com/advent-calendar/2021/flutter)に投稿した「Flutter on the WebをFirebase Hostingで公開した」の一部となります。

# レスポンシブ、デスクトップとスマホで出し分ける

デスクトップの時は左側に選択メニューを出しっぱなしに、スマホの時はドロワーメニューで出し入れできるようにしたいと考えて調べたところ、Flutterの公式ギャラリー自体がそれらしき実装をしていました。

https://gallery.flutter.dev/#/

公式ギャラリーにある以下のコードをそのまま引っぱってきて使っています。
`adaptive_breakpoints`のウインドウタイプを見ているので厳密には、デバイスの種類ではなく画面幅です。

``` dart:
import 'package:adaptive_breakpoints/adaptive_breakpoints.dart';
import 'package:flutter/material.dart';

/// Returns a boolean value whether the window is considered medium or large size.
///
/// Used to build adaptive and responsive layouts.
bool isDisplayDesktop(BuildContext context) =>
    getWindowType(context) >= AdaptiveWindowType.medium;

/// Returns boolean value whether the window is considered medium size.
///
/// Used to build adaptive and responsive layouts.
bool isDisplaySmallDesktop(BuildContext context) {
  return getWindowType(context) == AdaptiveWindowType.medium;
}
```

https://github.com/flutter/gallery/blob/master/lib/layout/adaptive.dart

以下のように、`Drawer`と`Scaffold`の組み合わせを画面幅に応じて出し分けています。

``` dart:frame_widget.dart
final isDesktop = isDisplayDesktop(context);
return Title(
  color: Colors.white,
  title: mytitle,
  child: isDesktop
      ? Row(children: [
          Drawer(
              child: HorsesWidget(
            listView: true,
            horseListJsonData: horseListJsonData,
          )),
          const VerticalDivider(width: 1),
          Expanded(
              child: Scaffold(
                  appBar: AdaptiveAppBar(
                    pagepath: pagepath,
                    title: mytitle,
                    isDesktop: true,
                  ),
                  body: Column(children: [
                    Expanded(flex: 1, child: body),
                    SizedBox(height: adHeight)
                  ])))
        ])
      : Scaffold(
          appBar: AdaptiveAppBar(pagepath: pagepath, title: mytitle),
          drawer: Drawer(
              child: HorsesWidget(
                  listView: true, horseListJsonData: horseListJsonData)),
          body: Column(children: [
            Expanded(flex: 1, child: body),
            SizedBox(height: adHeight)
          ])));
```

デスクトップの時、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4668/2515a7b5-0958-26c1-ae46-3f2c1a000a54.png" width="512px"/>
スマホの時、
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4668/d4c7ffc5-4941-2932-2fe8-12356eef9fb1.png" width="320px"/><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4668/e9d309d1-a818-003d-c8d7-400ef152a3a6.png" width="320px"/>

以上です。
【React】Material-UI: The `fade` color utility was renamed to `alpha` to better describe its functionality.の対処法

<h2>症状</h2>
ReactでSPA開発をしている際に、以下のwarnがでました。
翻訳すると、「Material-UI：機能をわかりやすく説明するために、 `fade`カラーユーティリティの名前が` alpha`に変更されました。
'@ material-ui / core / styles'`から `import {alpha}を使用する必要があります」でした。

```terminal:error
Material-UI: The `fade` color utility was renamed to `alpha` to better describe its functionality.

You should use `import { alpha } from '@material-ui/core/styles'`
```

<h2>解決策</h2>
パッケージの次バージョンをインストールすることで解決しました。
特にimportする必要はなかったですが、＠mui/labは見つからなくなっていたので再度追加したりはしました。

```terminal:solution
npm install @material-table/core@next
```

<h2>参考</h2>

https://githubmemory.com/repo/marmelab/react-admin/issues/6490

https://stackoverflow.com/questions/69783973/mui-the-fade-color-utility-was-renamed-to-alpha-to-better-describe-its-func
情シス的 Microsoft との付き合い方

この記事は[ 【初心者優先枠】corp-engr 情シスSlack（コーポレートエンジニア x 情シス）#3](https://adventar.org/calendars/6180 "adventar.org") 23日目の記事です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249707/4de3944f-12fc-93d6-2def-383deefc995d.png)

[1.はじめに](#1-はじめに)
[2.何を検討したらよいか](#2-何を検討したらよいか)
[3.契約形態の検討](#3-契約形態の検討)
[4.営業担当を見つける](#4-営業担当を見つける)
[5.Microsoft Partner Network の活用](#5-Microsoft Partner Network の活用)
[6.認定資格の活用](#6-認定資格の活用)
[7.支援プログラムの活用](#7-支援プログラムの活用)
[8.まとめ](#8-まとめ)

#1. はじめに
世の中のほとんど情シスのみなさんにとって、Microsoft という会社は切っても切れない存在だと思います。

- Windows のバージョン管理したり・・・
- Microsoft365 をみんなが使えるようにしたり・・・
- Intune で MDM したり・・・
- Power Automate でデータ収集を自動化して、PowerBI でレポート作ったり・・・
- AzureAD のユーザ管理したり・・・
- Azure の利用料をまとめたり、環境作成したり・・・
- そしてこれら全ての問い合わせ対応したり、ライセンス管理したり・・・

などなど。
会社や担当範囲によって様々な関わり方があるとは思いますが、**「MS 製品なんてもう使いたくない！」**って思ってもそうはいかないことの方が多いですよね？

**「せっかくならちゃんと MS と向き合って仲良く生きていこうぜ！！」**ってことで今回は記事を書いていこうと思います。

#2. 何を検討したらよいか
**MS 製品を使っててよかった！MS 製品を使ったおかげで仕事がうまくいった！！**くらい言えるとハッピーですよね。

ただ、**ベンダーロックインするような方針を取ってしまうとそれはそれでリスクが生まれます。**

もう少しライトに、社内で自由に振る舞えるくらいの範囲で以下のようなことを意識していくのがよいでしょう。

**1. サポートの向上**
**2. コストの削減**

#3. 契約形態の検討

みなさん、Office や Azure などはどのように契約しているでしょうか。
MOSP,EA,CSP など様々な形態がありますが、どれを選択するかによって大きく価格が変わってくる可能性があります。

それぞれの特徴は以下記事が分かりやすく説明されています。（TEDさんの回し者ではないです）

https://esg.teldevice.co.jp/iot/azure/column/column10.html

もっとも手軽にコストカットできるのはCSPへの移行でしょう。
Office や Azure の利用料を数%カットできる可能性があります。
またプロバイダによっては手厚いサポートが付帯するなど、業務を助けてくれる新しい相談役として使うこともできます。

**注意:**
- Azure の場合、EAや従量課金サブスクリプションをまたいだリソース移行ができないものがあったり、コスト管理を一元化できないなどのデメリットが発生する可能性があります
- Office系 においても、即時のライセンス購入ができず、数日のリードタイムが必要になります。

#4. 営業担当を見つける
あなたがすでに Azure をそれなりの金額使うような企業に勤めている場合、すでに営業担当が付いているかもしれません。

また、MNP に参加することで新規にアサインされた営業担当から連絡が来るかもしれません。

彼らは、MPN を始めとするパートナー支援のプロフェッショナルです。
本記事の内容をマルっとサポートしてくれたり、新たなお得情報を教えてくれるかもしれません。

また、困ったことがあればエンジニアを交えた相談会を開いてくれるなど、よりよくMS製品を利用するための手助けをしてくれるはずです。

サポートに問い合わせて「うちって担当ついてないですか？」なんて聞いてもいいかもしれないですね。

#5. Microsoft Partner Network の活用
MPN (Microsoft Partner Network) は、MSがユーザ企業を支援するための中心となるプログラムです。
概要については下記にまとめています。とりあえず登録しよう！

正直、この MPN 登録が全てとも言えるかもしれません。
**Microsoft365 E3 が 100ライセンス付いてきて、Visio も Power BI Pro もたっぷり使えて、Azure のクレジットも付いてくる・・・**
なんて言ったら興味湧きません？

https://qiita.com/mizumaki/items/04a6bc94f7fac8cad500

#6. 認定資格の活用

MSP の効果を最大化するには社内の有資格者を増やすことが不可欠です。
MS 製品を使っててよかった！と言うためには社内の仲間作りも重要です。ぜひ認定資格などの仕組みの活用を検討しましょう。

https://qiita.com/mizumaki/items/d7f270bff28d3665d2c2

https://qiita.com/mizumaki/items/17a613ad260c4994026c

#7.　支援プログラムの活用

スタートアップや専門領域の支援など、様々なプログラムが存在します。
合致するものがあればどんどん使っていきたいところ。

ただし、全てのプログラムを把握するのは困難なので、やはり営業担当に任せてしまうのがよさそうです。

https://www.microsoft.com/ja-jp/biz/startups/default.aspx

https://www.microsoft.com/ja-jp/biz/cloud-platform/inhousedevelopment.aspx

#8.　まとめ

上記の他にも、MS との関係性が深まっていくことで、自社プロダクトのマーケットプレース公開や、事例記事の公開、Co-sell（販売連携）などの支援が得られます。

現在の MS 製品の利用度が高いほど、本記事の施策によるコスト削減効果も高くなり、サポートなどにかかる負荷も減っていくでしょう。

とはいえ、これらをフル活用するためには社内の協力を得ていかないといけないので結構大変かもしれません。

**しかし、社内を巻き込んでこそ情シス！
みんなでハッピーになる仕事場を作っていきましょー！！**
Pythonで【バケたん】をシミュレートするbot

【バケたん】の機能をソフトでシミュレートし結果をtweetするbot-> <[@6thSensor](https://twitter.com/6thSensor/status/1473609420387282947?s=20)>
をフォローすると、下記コードのテスト運用を確認できる。
(ここで示すコードはバケたんの動作原理をguessするもので完全にシミュレートするものではない。）

###【バケたん】とは？
【バケたん】とは「お化け探知機」という玩具の略称で、その原理は↓こちらのサイトが詳しい。
https://www.j-dowsing.com/goods/baketan/

お化けだけでなく地震の予知にも使っている人が大勢いるようだ。お化けの場合は調べたい場所でボタンを押し、青なら良いスピリッツが、赤ならお化けがいるということになるらしい。
ボタンを押さなくても10分ごとに自動でチェックしているらしく、ときどき、赤や青に点滅したり、BEEPしたりする。

　上のサイトによると「サイコロを、8回振り、特定の数字に偏りが出ると赤、ランダムに全ての目が出れば、青が光る様に作られています。」ということなので、賽（さい）の目を0-5にし、サイコロを8個にしたものをPythonで書いてみた。
　本家「ばけたん」の場合は近くにないとき点滅してもわからないが、ソフトばけたんの場合はタイムスタンプが残るので、あとでいつ反応したかがわかる。


###ランダムネスとは？

　ランダムネスの究極の定義はグレゴリー・チャイティンによってなされたそうだが<[チャイティン](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%83%BC%E3%83%BB%E3%83%81%E3%83%A3%E3%82%A4%E3%83%86%E3%82%A3%E3%83%B3)>、圧縮できるほどランダムネスの率が低く、圧縮率が低いほどランダムであると、ここでは強引に解釈させていただく。
　そこで、ここではランダムに生成した数値をgzip関数で圧縮して、そのデータサイズが小さいほどランダムでない、つまり、"珍しい"ということになり、お化けや地震の発生可能性が高いと警告することにした。

gzipの結果で圧縮率=非ランダムネスを測るのはいささか乱暴だが、とりあえず、それらしく動くことをここでは優先した。


下のコードで、
'consumer_key'
'consumer_secret'
'access_token_key'
'access_token_secret'

のところは、それぞれ、twitterのデベロッパーポータルから、https://developer.twitter.com/en/portal/dashboard
keyとsecretを取得して書き換える。

(以下のコードでは乱数生成は10分ごとではなく、60秒ごとになっている）

```
###ソフトばけたんのコード
import gzip
import sys
import os
import random
import datetime
#import winsound
import time
import threading

import tweepy

consumer_key = 'consumer_key'
consumer_secret = 'consumer_secre'
access_token_key = 'access_token_key'
access_token_secret = 'access_token_secret'

def worker():
    nw = str(datetime.datetime.now())
  
    s_in = ""
    for n in range(8):
        s_in += str(random.randint(0, 5))
    ss = bytes(s_in, encoding='utf-8', errors='replace')
    s_out = gzip.compress(ss)
    b = sys.getsizeof(s_out)
    #  56 < b < 61
    #print(nw[2:19]," ", b, s_in)
    if b < 59:
        col = "黄色"
        if b < 58:
            col = "赤"
        #twt = nw[2:19] + " " + str(b) + " " + s_in
        twt = nw[2:19] + " " + col
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token_key, access_token_secret)
        api = tweepy.API(auth)
        api.update_status(twt)
        #winsound.Beep(800,1000) 
    time.sleep(1)

#thanks to
#https://qiita.com/montblanc18/items/05715730d99d450fd0d3

def scheduler(interval, f, wait = True):
    base_time = time.time()
    next_time = 0
    while True:
        t = threading.Thread(target = f)
        t.start()
        if wait:
            t.join()
        next_time = ((base_time - time.time()) % interval) or interval
        time.sleep(next_time)

tnow = str(datetime.datetime.now())
print(tnow[2:19])
scheduler(60, worker, False)

```
【Ruby のまずいコード】文字列を文字種で分割

# お題

文字列を文字種で分割するメソッドを書いてください。
つまり，

```rb
p divide_by_script("Rubyは楽しい") # => ["Ruby", "は", "楽", "しい"]
```

となるような。
漠然と「文字種」と書きましたが，Unicode の仕様でいう「スクリプト（script）」のことであるとしましょう。
script という単語は多義語ですが，ここでは「漢字」「平仮名」「片仮名」「ラテン文字」「アラビア文字」「チベット文字」といったもののことです[^script]。
Unicode では，各文字に script プロパティーという値が割り当てられていて，たとえば以下のようになっています：

[^script]: この意味の script には「用字系」とか「文字体系」という訳語もあります。

* 「亜」などの漢字：`Han`[^han]
* 「あ」などの平仮名：`Hiragana`
* 「ア」などの片仮名：`Katakana`
* 「a」などのラテン文字：`Latin`
* 「α」などのギリシャ文字：`Greek`

[^han]: `Kan` じゃなくて `Han` なのは中国語だからでしょう。

「!」などの記号類は，文字学的には何のスクリプトにも含まれませんが，Unicode では script プロパティーを持っており，`Common` という値が割り当てられています。

文字のスクリプトは，[unicode-scripts](https://rubygems.org/gems/unicode-scripts) という gem で知ることができます。
まず

```
gem install unicode-scripts
```

で gem をインストールしておけば

```rb
require "unicode/scripts"

p Unicode::Scripts.script("あ") # => "Hiragana"
```

のようにして使えます。
もちろん Gemfile と Bundler を使っても構いません。

# コード

```rb
require "unicode/scripts"

def divide_by_script(str)
  last_script = nil
  result = []
  str.each_char do |char|
    script = Unicode::Scripts.script(char)
    if last_script == script
      result.last << char
    else
      result << char
      last_script = script
    end
  end
  result
end
```

少しだけ説明を加えると，

```rb
result.last << char
```

は，配列の最後の要素である String オブジェクトの末尾に破壊的に文字列 `char` を結合しています。
一方，

```rb
result << char
```

は配列の末尾に文字列 `char` を追加しています。
同じ演算子 `<<` を使っていますが，レシーバーのクラスが違うので，全く別のメソッドです。やっていることは違います[^ap]。

[^ap]: とはいえ，「末尾にくっつける」という点が共通しているので同じ演算子にしているのでしょう。

# 改善

Ruby の [Enumerable](https://docs.ruby-lang.org/ja/3.0.0/class/Enumerable.html) モジュールには，要素の並びを〈要素から算出される値が等しいものの連なり〉に分解する専用メソッド[Enumerable#chunk](https://docs.ruby-lang.org/ja/3.0.0/method/Enumerable/i/chunk.html) があります[^chunk]。

[^chunk]: 英単語の chunk は塊というような意味ですね。

これを使うと処理が 1 行で書けてしまいます：

```rb
require "unicode/scripts"

def divide_by_script(str)
  str.chars.chunk{ |char| Unicode::Scripts.script(char) }.map{ |script, chars| chars.join }
end
```

ここで，`map` のブロックパラメーター `script` は使っていないので，`_` とかでいいのですが，読者に「スクリプトだよ」と分かっていただきやすいように書きました。

Ruby 2.7 以降なら番号指定ブロックパラメーターを使って

```rb
require "unicode/scripts"

def divide_by_script(str)
  str.chars.chunk{ Unicode::Scripts.script(_1) }.map{ _2.join }
end
```

とも書けますね。
ABCD2021Winter参加レポート

#　ご挨拶
こんにちは！もうすぐクリスマス🎄ですね！
dip株式会社でAndroidエンジニアをしながら、日本Androidの会にも所属している古川守加と申します！
日本Androidの会活動の一環でイベントの運営にも携わっております！
中でもABC、ABCDはAndroidの祭典として毎回大盛り上がりしています🎉
ぜひこの熱気を伝えるべく記事にしました！!お楽しみくださいっ

#　概要
2021年12月11日(土)に開催されたAndroid Bazaar and Conference Diverse 2021 Winterの参加レポートです！

![スクリーンショット 2021-12-23 17.09.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/1d995fe4-c776-9ee0-cd6a-8377e08c5f0d.png)

コロナ前は大学などをお借りして現地開催されていましたが、今年も前回のABC/ABCD同様オンラインでの開催となりました！
` ABCD2020Autumn 参加レポートはこちら！
https://qiita.com/hayashidamoka/items/0bd098f41a225ee531e2` 

今回のテーマは　「I ＆ roid」～エンジニアは先進技術と伊豆大島で活躍できる～

ABCDは毎回各地にスポットを当てて開催されているのですが、今回の開催地は東京都の離島 伊豆大島でした！

公式サイト ▶️ https://abc.android-group.jp/abcd2021w/
アーカイブ(YouTube) ▶️ https://www.youtube.com/watch?v=Grb1udA6Bmg

#　セッションのご紹介
どの公演もめちゃくちゃ面白かったので本当は全部を紹介したいところですが、
流石にそういう訳にもいかないので一部だけご紹介させてください！
気になったセッションがあればYouTubeでいつでもご覧になれますのでぜひ！！！


## ①開会宣言&閉会宣言　実行委員長 杉山由朗
初っ端からセッション...?と思われたかも知れませんが衝撃的だったので紹介させてください！
ABCD2021Winter実行委員長の杉山さんは、今回の開催地である伊豆大島に住んでリモートワークをされています！
現地の超のどかな場所からの開会宣言(小鳥のさえずりがBGMでした！！)、絶景の閉会宣言(鐘も鳴らしちゃいます!!)最高でした！
イベント始まったばかりでも伊豆大島の魅力が詰まっていて、行ってみたくなりました🏝
![スクリーンショット 2021-12-23 17.33.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/791e39f7-86fe-0d10-ab99-1f3d4102f268.png)
![スクリーンショット 2021-12-23 17.38.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/458bd2c1-bbe7-b8c1-4551-37db02737630.png)

## ②COCOA 1.4.0 障害はなぜ起きたのか　デジタル庁Android（アプリ）エンジニア／有限会社シーリス代表　有山圭二氏
あの超有名な接触確認アプリ「COCOA」の障害のお話でした！
なぜ障害が起きて、どうやって解決したのかをデジタル庁の有山さん自らご講演いただきました！
障害の発生報告からリリース完了、再発防止策まで、「え、こんなに詳しく話しちゃって大丈夫なの！?」ってくらい全てを語っていただきました!!!
非エンジニアの人でも楽しめるくらい分かりやすい解説でしたが、エンジニアの人なら現場感がもろに伝わり自分も参画してたっけ...?と思えるくらい楽しめます!
![スクリーンショット 2021-12-23 17.42.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/8462ed55-571a-7e47-e5d1-13a64e5bbf04.png)

## ③バイトルアプリ開発チームの チーム改善〜コミュニケーション不足を改善してみた〜 ディップ株式会社 Androidエンジニア 堀田奈津実氏
我らがdip株式会社のAndroidエンジニア 堀田奈津実さんのセッションです！
私がぜひ登壇してください！と依頼させていただいたのですが、ひいき目なしにめちゃくちゃいいセッションでした！！！
コロナ禍でリモートワークをしているチームは大抵直面されているだろうコミュニケーション不足の課題を、バイトルのアプリチームは如何にして改善したのかを紹介してくださいました！
具体的な改善策としては、①バーチャルオフィスの導入②Slackの雑談チャンネルの導入 です
導入した意味や運用の方法などを分かりやすく解説してくださっているので、
これを見ればあなたのチームのコミュニケーション課題を解決できること間違いなしです！！

![スクリーンショット 2021-12-23 18.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394720/28c813b3-958b-5925-f80f-10d601c4278b.png)

#　最後に
今回ご紹介させていただいたセッション以外にも、
高校生が地域復興のために会社とアプリを作った話や、
携帯を大量に持っているコレクターの方が博物館を作りたい話などなど
おもしろいセッションばかりでした！ぜひともアーカイブを見てくださ〜い！！

ちなみに私は今回も、司会進行を担当させていただきました！🎤
だんだん噛む回数が減ってきた気がしてます...!

最後まで読んでくださってありがとうございました！！
dip株式会社も日本Androidの会も仲間を絶賛募集中です💫
p5.jsで地図を描く

この記事はMIERUNE Advent Calendar 2021 4日目の記事です。

地理データの規格のひとつであるGeoJSONをp5.jsで描画してみます。

今回は座標系の話はしません。あくまでも"お絵かき"です。

![atlas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/91e05031-fbf1-1e1c-f4ca-629e771313a5.png)

## GeoJSONの準備

地図のデータとなるGeoJSONを準備します。
[geojson.io](https://geojson.io/#map=2/20.0/0.0)というwebサービスを使ってgeojsonファイルを作成します。
今回はニュージーランドをトレースしてみました。画面右側のテキストエディタに表示されるjsonをnz.geojsonというファイル名で保存しておきます。

![geojson_nz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/5ca320c8-7530-ee8a-a524-9e7fd057be4b.png)


```json:nz.geojson
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [172.705078, -34.270835],
            [174.638671, -37.509725],
            [173.891601, -39.061849],
            [175.429687, -41.310823],
            [178.242187, -37.579412],
            [172.705078, -34.270835]
          ]
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {},
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [172.353515, -40.713955],
            [166.596679, -45.521743],
            [168.706054, -46.739860],
            [171.694335, -43.897892],
            [174.155273, -41.442726],
            [172.353515, -40.713955]
          ]
        ]
      }
    }
  ]
}
```

JavaScriptでファイルを読み込むために、nz.geojsonのテキスト全体をブラケットで囲っておきます。

```json:nz.geojson
[
  {
      "type": "FeatureCollection",
      "features": [...]
  }
]
```

これで地図データの用意は完了です。

## sketch.jsを書く

### GeoJSONの読み込み

p5.jsの`preload()`を使ってGeoJSONを読み込んでおきます。

```js:sketch.js
let boundary;

function preload(){
    boundary = loadJSON("nz.geojson");
}
```

### 地理データをキャンバスに描画する

1. 読み込んだGeoJSONを解析し、各ポリゴンの頂点の経緯度座標を取得します。
1. ニュージーランドは経度160から180度、緯度-50から-30度の範囲にあるので、`map()`を使ってキャンバスの範囲と調整します。
1. `beginShape()`と`endShape()`を使って形状を描画します。

```js:sketch.js
let padding = 20;

function setup(){
    createCanvas(windowHeight, windowHeight);
    background('#67a5da');

    let geom;
    let polygons;
    let coords;
    let features = boundary[0].features;

    fill('#81b214');
    stroke('#fff');
    for (let i = 0; i < features.length; i++) {
        geom = features[i].geometry;
        polygons = geom.coordinates;
        coords = polygons[0];

        beginShape();
        for (let j = 0; j < coords.length; j++) {
            let lon = coords[j][0];
            let lat = coords[j][1];
            let x = map(lon, 160, 180, 0+padding, width-padding);
            let y = map(lat, -50, -30, height-padding, 0+padding);
            vertex(x,y);
        }
        endShape(CLOSE);
    }
}
```

ニュージーランドの絵が描けました！

![p5js_nz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303239/c47aeb6d-9fb7-5527-9fe4-701c448bc9c8.png)
VRChatプレイヤーによるParticle System解説 ～Collision Module編～

:::note warn
この記事はUnity 2019.4.29f1の記事です
:::
[External Forces, Noise Module編](https://qiita.com/abcde_kind/items/f9702c960b3d25db7d35) <<  ここ  >> [Triggers, Sub Emitters Module編](https://qiita.com/abcde_kind/items/114842bfda2de4d2f649)
# はじめに
この記事は**ちょっとParticle System触れるようになったけどまだまだ知らないパラメーターだらけで抵抗感がある人向け**にじゃあ全項目解説しようという記事です。

**パーティクル？シェーダー？憧れるけどよくわかんない…**という人は最近は[VRCUnity勉強会][link-1]などで初歩の初歩から解説してくれる講座などが解説されているのでそこに参加してみたりするといいでしょう。
[link-1]:https://discord.gg/mtvTTyM
その他にこの記事はアドベントカレンダーにしてParticle Systemの記事を増やしてパーティクルへの抵抗感を減らしてやろうという企みもあります。

##Collision Moduleってどこ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/89fb76a3-160f-bf6d-d1db-0e3f017e3568.png)
こ
##Collision
パーティクルがコライダーに衝突した時にどういう反応をするか決めるパラメーター
###Type
デフォルト Planes
**パーティクルがどこのコライダーにぶつかるか設定するパラメーター**
<font color=red>ワールドのコライダーに反応させたいことが殆どだと思うのでその場合はWorldにする</font>
****
####Visualization
デフォルト Solid
TypeがPlaneの時のみ弄れる
**コライダーがどういう見え方をするか決めるパラメーター**
####Scale Plane
デフォルト 1 (0~3.402823e+38)
**コライダーの見え方の大きさを決めるパラメーター**
あくまでどういう見え方になるかと言うだけなので実際の判定は無限にある
****
**<font color=red>以下はWorld前提で解説</font>**
###Mode
デフォルト 3D
2Dに切り替えれば2Dコライダーで扱えるようになるけど…そもそも3D前提の話なのでスルー
###Dampen
デフォルト 0 (0~1)
単位 割合
**パーティクルが衝突した際にどれくらいパーティクルのスピードが減るか決めるパラメーター**
1にすると衝突したとこに留まる
###Bounce
デフォルト 1 (0~2)
**パーティクルがどれくらいの強さで跳ね返るか決めるパラメーター**
0にすると衝突した表面を滑っていく
###Lifetime Loss
デフォルト 0 (0~1)
単位 割合
**パーティクルが衝突した際にどれだけ寿命が減るか決めるパラメーター**
1にすると衝突した瞬間に消えるしLifetimeを長くしたパーティクルに0.2とか設定すれば4~5回跳ねて消えるパーティクルが作れる
###Min/Max Kill Speed
デフォルト 0/10000
単位 m/s
**パーティクルが衝突した際にこの数値より遅い/速いパーティクルは消される**
Maxを0にしとけば衝突した瞬間に消えるしMinを設定すれば遅いパーティクルだけ消したりできる
###Radius Scale
デフォルト 1 (0.0001~3.402823e+38)
単位 倍
**パーティクル1つ1つの衝突判定の大きさ**
下の方にあるVisualize Boundsで判定を見えるようにしながら調整するといい
###Collision Quality
デフォルト High
**パーティクルが動的なコライダーに衝突するかどうか決める設定**
<font color=red>アバターにパーティクルを入れるならHighじゃないと何にも衝突しない</font>
ワールドに入れてアバターに衝突させたいってのもHigh
ここではHighの場合のみ解説する
####Collide With
デフォルト Everything
**パーティクルがどのレイヤーに衝突するか指定するパラメーター**
基本デフォルトでいいが19番目のレイヤーがメニューのレイヤーなのでそこを外すとメニューに当たらなくなる
####Max Collision Shapes
デフォルト 256 (0~2,147,483,647)
**同時に認識できる最大のコライダー数**
まあデフォルトでいいけど増やすと負荷の原因になる
####Enable Dynamic Colliders
デフォルト ON
**動的なコライダーにパーティクルが衝突するか決めるパラメーター**
Dynamic Boneは関係ない、デフォルトでいい
###Collider Force
デフォルト 0 (0~3.402823e+38)
**パーティクルがどれくらいの力でオブジェクトを押しのけるか決めるパラメーター**
Rigidbodyが適用されてるオブジェクト(転がったりするやつ)を動かせる
####Multiply by Collision Angle/Particle Speed/Particle Size
デフォルト ON/OFF/OFF
**オブジェクトを押しのける力を衝突した角度/速度/サイズに比例させるパラメーター**
速度はONのほうがよさげ
###Send Collision Message
デフォルト OFF
**パーティクルが衝突したことで何か起こるオブジェクトに対して衝突したサインを送るかどうか決めるパラメーター**
これ入れてると対策してないギミック勝手に起動したりできちゃう
###Visualize Bounds
デフォルト ON
**パーティクルの衝突判定を可視化するかどうか決めるパラメーター**
ONにしててもUnity上でしか見えないから困らない
##おわり
ということでCollision Moduleでした
レイヤー周りの仕様は最近変わったのであんま詳しくないです:no_good:
次はTriggers, Sub Emitters Moduleです
****
[External Forces, Noise Module編](https://qiita.com/abcde_kind/items/f9702c960b3d25db7d35) <<  ここ  >> [Triggers, Sub Emitters Module編](https://qiita.com/abcde_kind/items/114842bfda2de4d2f649)