OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript 基礎講座

<h1>目次</h1>
１.変数について
２.間違った記述
３.コメントについて
4.Hallowという文字を出してみよう。

<h2>変数とは何か</h2>
変数とはデータを入れる入れ物のことであり、データと必ずセットしなければ何の意味もありません。

```
let sum;
sum = 5;
```
説明すると、まず最初に　sumという入れもを用意しています。
次にその入れ物に５という値を入れています。

<h2>間違った記述</h2>

```
let sum
sum = 5;

```
この場合の間違いは　最初のsumの後ろを見てください。
;がないのがわかるでしょうか。これはエラーの原因になります。
初学者さんはよくありがちなミスだと思うので確認の際は気おつけてください。

<h2>JavaScriptのコメント記述方法</h2>
１行だけコメントアウトするばいはす//と打ってあげることあげることでその行だけがコメントアウトになります。

複数の行をまとめてコメントアウトする場合は、したいところの最初には/*と書いてください
コメントアウトしたい最後の一番後ろには*/と書くことによりまとめてできます。
TTGO T-Display ESP-IDF (w/VSCode) で TFT ライブラリーをビルドする

ソリッドなESP-IDFでTFTと一緒に使いたい。

http://pdacontrolen.com/review-module-esp32-ttgo-t-display-1-14/
https://github.com/nopnop2002/esp-idf-st7789
https://youtu.be/6-AOjyevRcc

これらのページではあっさりできているのだけど，

- そもそも ESP-IDF がうまくインストールできない。
- python3 のインストールもつまづいている模様...

おそらく自分の Mac が Mojave であることも原因なのだろう。力不足ですみません...

格闘すること数日...

# VSCodeでビルドできるようになった

まずは環境の整理 出発点から

- macOS Mojave 10.14.6
- VSCode 1.60.2

- pythonは本家ページから安直にインストール
-- `python-3.9.7-macosx10.9.pkg`

- VSCode の拡張機能 ESP-IDF をインストール v1.2.0 だった。
- ESP-IDF 拡張機能が有効になると，ESP-IDFツールチェインのインストールを促される。そのままインストール。v4.3.1となったようだ。

- 上記にもあるTFTライブラリーを Download zip でもらってくる。
-- https://github.com/nopnop2002/esp-idf-st7789

- 解凍すると `esp-idf-st7789-master` フォルダーが出来上がるので，`esp-idf-st7789` にリネーム。

- `~/esp/esp-idf/examples/` フォルダーに放り込む。 `~/esp/esp-idf/examples/esp-idf-st7789` となる。

- VSCodeでこのフォルダーを開き，`ESP-IDF: Open ESP-IDF Terminal` を実行する。

- 開いた ESP-IDF のターミナルで，以下を順に実行。

```bash:
bash-3.2$ idf.py set-target esp32
bash-3.2$ idf.py menuconfig
```

- ST7789の設定は，上記 github の説明にある通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/e41e5086-27d2-aa38-a7f9-9e8d28092295.png)

- ターミナルに戻ったら以下を実行。ビルドと書き込みが行われる。TTGOが接続されているポートを指定する。

```
bash-3.2$  idf.py flash --port /dev/cu.SLAB_USBtoUART 
```

# 補足
`idf.py menuconfig` じゃなくて `make menuconfig` を実行し，
Serial flasher config に入り，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/5e3a90fb-44d2-e068-4e0f-264826cc88db.png)

TTGO を接続して，接続されたシリアルポートを指定すると，
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/06c8d638-17cf-a7fd-6b74-b7fbfcd271b0.png)

次回からは ポート指定せずに `make flash` だけで書き込みが行える。

# 最後に

やっと出発点に立てた感じ。esp-idf のライブラリーを少しずつ試していこうと思う。

2021/9/30 一部修正しました

2021/10/3 追記

たまたま Mojave をクリーンインストールした別 Mac で試してみた。やはり python3 でつまずく。VSCodeのESP-IDF拡張機能で、idfのインストールで失敗してしまう。

とにかく python3 をなんとか入れて、esp-idfのフォルダーで

```bash
$ python3 tools/idf_tools.py install
$ python3 tools/idf_tools.py install-python-env
```

とすると、VSCode上でビルドできるようになった。

ヘタレですみません...
【Github】のReadmeを修正した話


## 今回使ったReadMe
[Before](https://github.com/kitutune/mypf-random-word/blob/b53d67b3069a10136db631959ad1b90e0e27b068/README.md)
[After](https://github.com/kitutune/mypf-random-word/blob/main/README.md)

#1. はじめに

[【GitHub】README.mdをカッコ可愛くデザインしてアプリの魅力を120%にする](https://qiita.com/aocattleya/items/5f836e9c65ba3eb3af03)
全力でこちらの記事を参考にさせていただきました！　@aocattleya様に感謝

上記の記事を見ていただいた方が勉強になると思います

#2. 経緯
ポートフォリオのReadMeを作ったところ、読みにくいと言われたので色々調べて作り直すことにした

その前後に調べたことをまとめて備忘録として残す・・・のは[次回](https://qiita.com/kitutune/items/81abd4abe612f460a9e7)です

今回は自分のPFを修正した部分だけに焦点当ててます
#3. わかりにくさ？
[変更前の自分の Read Me](https://github.com/kitutune/mypf-random-word/blob/b53d67b3069a10136db631959ad1b90e0e27b068/README.md)

わかりやすいように画像を使い矢印を配置し端的に作った！・・・つもり

ただし、何人かに聞いたところ評価は読み辛いだった

くどいのかな？

あと、誤字・・・`使用`と`仕様`はOUT!
#4. わかりやすさ？
絶対にいるよねって項目は置き

説明はできるだけ簡潔に、なんなら動画でもいいのかもしれない
#5. 今回の例
つまるところ自分のPF

正直な話ペラ・・シンプルな内容のアプリです

だから余計な説明は必要なく最低限にしようねってことで

- メイン（動画）
    - 画像はまとめて動画（中に説明要素も込めた）にし目につくよう一番最初に正面で＋２倍速
- Title 
    - タイトルは必須
- サブ (Package画像)
    - 目玉になる技術は画像で並べる
- Description
    - 説明はほんの少し興味を持ってもらえた場合は読んでもらえそうな量に
- Play here
    - アプリのURLは`Usage` にしていたけどもっとわかりやすくていいよねってことで`PlayHere`
- Package
    - ここは無くてもいいかもしれない、画像で載せたし、でも、typescript って書きたかった・・・
- Note 
    - ここは備考欄　作る上で意識したこと
- Reference Links
    -  　参考リンク　のこと　全部別ページに避け１行に
  


  [修正後の自分の Read Me](https://github.com/kitutune/mypf-random-word/blob/main/README.md)


  結構書かれているように見えるけど実物を見ると

マウスホイール一回分くらにも満たないかと

（ホイールの設定色々あるけど）・・・

とはいえスッキリしたんじゃないかな！？
#6.　まとめ　
項目数はコンテンツのボリューム（重さ）に合わせるべき

恐らくここじゃないかと

簡易なアプリやコンテンツであれば余計な説明は不要！
内容のみっちり詰まったものなのであれば,
それに合わせて説明文はしっかり入れるべき、端折られると使い方がわからない

#7. おわりに
修正しましたがこれが良い例かはわかりません
ただ、見やすくするという意味では
前より短くアイコン・画像が多いので読むというより流し見れる
のでうまくいったのではと
ただちょっとgif動画の画面大きすぎるかもしれない
ご意見あれば宜しくお願い致します
カレンダーの日付をタップ時に処理をさせる (FSCalendar)

#今回の内容

* カレンダーの日付をタップ時に処理をさせる

#コード

* `func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {}`内でタップされた時の処理を働かせることが出来ます。

```Swift:
    func calendar(_ calendar: FSCalendar, didSelect date: Date, at monthPosition: FSCalendarMonthPosition) {
     
       //タップされた時の処理

    }
```

#終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
EC2インスタンス同士の通信を簡単に許可する方法

複数のEC2インスタンスを使ってクラスタを組む場合など、EC2インスタンス同士で通信を許可したい時があると思います。
セキュリティグループと呼ばれる仮想ファイアウォールの設定が必要ですが、送信元にセキュリティグループを設定すると簡単に設定ができます。

# 1. セキュリティグループを作成する

まずはセキュリティグループを作成します。サービス検索窓に「セキュリティグループ」と入力し、「セキュリティグループ」をクリックします。

![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/5481a860-f4de-ea58-e348-6f7f66e030f1.png)

次に「セキュリティグループを作成」をクリックします。

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/9c559bf7-b379-faf4-a87a-092752e1be24.png)


必要な項目を入力していきます。「セキュリティグループ名」と「説明」に何か入力しましょう。今回は`TestGroup`としました。
次にインバウンドルールを設定していきますが、実はこの時点では目的のルールは設定できません。
ソースつまり送信元にこのセキュリティーグループ自身を設定したいのですが、まだこのセキュリティグループは作成されていないためです。
なので、そのルールはいったん作成せず、接続確認用のSSHのポート(22)だけルールを設定しておきましょう。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/67c7650d-9106-aaba-f3da-ce2fa5dddcdf.png)

「セキュリティグループを作成」をクリックしていったん作成してしまいます。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/cae63f30-6c26-1688-2012-f7bb8dc69d47.png)

そして、作成したこのセキュリティグループを編集しましょう。
「アクション」をクリックします。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/3cd0bc7e-3490-7266-2d65-2289afd89458.png)

そして「インバウンドルールを編集」をクリックします。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/a5851e5d-9e52-7c8b-1347-ff2882166db3.png)

さて、やっとこさ目的のルールの作成です。
送信元に自分自身を指定します。検索窓をリクックすると候補が選べるようになるのですが、`TestGroup`を選択します。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/66938b0d-a124-5718-946d-3b5e6ea650ad.png)

このルールによって、このセキュリティグループをアタッチしたEC2インスタンスは、相互に通信が許可された状態になります。

送信元にIPアドレスやその範囲等を設定するよりずっと簡単ですね。
設定ミス等も防止できそうです。

「ルールを保存」をクリックして編集を完了させましょう。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/5904895d-9f8e-6f86-1466-e6f09858307c.png)

# 2. EC2インスタンスを作成する

先ほど作成したセキュリティグループを使ってみましょう。
EC2インスタンスを2つ作って接続できるか確認してみます。
EC2インスタンスの作成画面で、「インスタンス数」を２にセットします。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/26ff5b6c-66a9-424f-8da0-dd9855002a5a.png)

先ほどのセキュリティグループをアタッチしましょう。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884434/af20773a-63c1-ed79-08ea-783e81aaf8e5.png)

設定はこれで終わりなので「確認と作成」をクリックし、設定を確認したらEC2インスタンスを起動してください。

# 3. 接続確認する

通信が許可されたか確認しましょう。
片方のインスタンスでポート8080をLISTENさせます。

```bash
ubuntu@ip-172-31-46-224:~$ nc -l 8080
```

次にもう片方のインスタンスからアクセスしてみましょう。

```bash
ubuntu@ip-172-31-47-167:~$ nc -v -w 1 172.31.46.224 8080
Connection to 172.31.46.224 8080 port [tcp/http-alt] succeeded!
```

無事接続確認できました！

ちなみに、今回の設定では全ての通信を許可していますので、他のポートでも接続できます。

# 参考
- [公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/security-group-rules-reference.html)
公式のUnity2D入門をv2020.3でやってみる(3)



[前](https://qiita.com/DiveMasakazu/items/51cb35348f06c0c07a43)



## ワールドとのインタラクション　ダメージジーンと敵キャラクター

* アイテムと同じように敵を作成
* 無敵時間の設定
* スプライトの大きさ変更 + Box Collider 2D の Auto Tiling
* 動く敵

OnTriggerEnter2Dはエリアに入った時、OnTriggerStay2Dがエリアにいるとき。書いてないけどonXXXExitが離れた時。
常に判定させるにはスリープをさせない設定が必要
プログラム的には難しくない

敵の動きを自分で書いてみて、反転に
`x *= -1;`
をやってたけど、サンプルは
`x = -x `
になってた。多分どっちでもよさそう。（若干コストが違うか）

コライダー同士の衝突にはトリガーではなく
OnCollisionEnter2D
を利用。
`もう一つの変更点は、other.GetComponent ではなく、other.gameObject.GetComponent を使用することです。`
急にコライダーじゃなくてCollisionが出てきたけど、あまり説明はない。
Collision型にはGameObjectやらTransformやらの衝突相手のオブジェクトの情報の集合っぽいという事は分かった。


## スプライトアニメーション

* コンポーネントにアニメーター追加
* プロジェクトにアニメーターコントローラ追加
* アニメーションWindowを開いてスプライト設定

アニメメーターは「2Dアニメーション」じゃなくて「その他」の中にある。

順番のせいなのか、「４．スプライトの変更」がいまいち分からなかった。
`Samples を 4 に設定`の方法も書いていないし、早い動きを見ただけで終わった。
検索して[ここ](https://tsubakit1.hateblo.jp/entry/2019/11/12/192948)を見ると
`以前は現在のフレーム数の下あたりにありましたが、現在は表示されなくなっています。サンプルレートは何故か現在は非表示になっており、オプションから表示に切り替える必要があります`
らしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2081290/f06c4f34-2d6a-3f58-2060-25dab5f1e4df.png)
あと、Flipで左右反転のさせ方も読んでて分かりづらかった。

* アニメーターコントローラ設定
* スクリプトからコントローラーへの送信

ブレンドツリーというものを使う。これは覚えていられなさそうだけど、とりあえず設定・・・
スプライトの大きさが違うのを調整する方法が分からないが、アニメーターそのものは少し分かったのでスルー

最後自キャラのアニメ設定で
`NullReferenceException: Object reference not set to an instance of an object`
が出て時間を食った。
結局Unityを再起動したら大丈夫になったので原因は不明。


Dommuneのマイブラ特集聴きながらやってたので少ないけどここまで。
基本的なブログサービスを構築する

-----
この記事はAWS初学者を導く体系的な動画学習サービス
「CloudTech」の課題カリキュラムで作成しました。
https://kws-cloud-tech.com

------

## はじめに
AWS CloudTechに登録し、ただいま勉強中のものです。
以下に記した基本的なAWSのサービスを使用して、ブログサービスを立ち上げるまでの方法に関してまとめました。ブログサービス立ち上げに関しては、EC2にWordpressをインストールして立ち上げます。
・VPC
・EC2
・RDS
・IAM
![スクリーンショット 2021-09-26 15.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006791/975c939c-1c10-0d47-b0cf-23ee043179b8.png)


## 手順
①VPCを作成し、AZ 1aにpublic subnetとprivate subnetを配置
②クライアントがインターネットからアクセスできるように、Internet Gatewayを配置
③EC2がインターネットと通信するためにRoute tableを設定する。
④RDSを作成するために、シングル構成であってもサブネットグループが必要となるので、AZ 1cにpublic subnetとprivate subnetを配置
⑤RDSをAZ 1aのRDSに配置
⑥Wordpressをインストールする。
⑦EC2のpublic IPアドレスをアドレスバーに貼り付けつけると、Wordpressの初期設定画面になり設定完了。

## 引っ掛かった所
### セキュリティグループ変更時にエラーが出た
ソース設定を0.0.0.0/0からセキュリティグループID(sg-xxxxxx)に変更する時にエラーに引っかかりました。
下記のサイトを参考に試したらエラー解決ができました。
参考：
https://dev.classmethod.jp/articles/aws-you-may-not-specify-a-referenced-group-id-for/
## モック図作成について
モック図の作成に関しては下記のサイトを参考にdraw.ioを使用しました。
https://ferret-plus.com/8408
## 終わりに
AWSについてほとんど知識がない所からはじめましたが、だんだんイメージが掴めるようになってきました。
基礎を振り返りつつ、少しずつ知識定着をしていきたい。
Windows　イベントログの採取方法とその見方

###自分のメモとして


###イベントログの採取方法
イベントログは，レンダリングオプションをインストールしているレンディション変換用PCのイベントビューアから採取できます。

採取手順を次に示します。]
1:左下の検索バーで「管理ツール」と入力
2:「イベントビューア」を選択します。
3:ログ情報のうち，アプリケーションログ情報を表示します。
4:「名前を付けて保存」を実行して保存します。



####参考サイト
https://laboradian.com/find-out-event-using-event-viewer/
WindowsでCtrl + qでアクティブウィンドウを終了する方法（AutoHotKey）

## 状況
MacのCommand + qみたいな感じでアプリを終了したく（alt + F4ではなく）、また他でCtrl + qも特に使ってないのでこのコマンドに割り当てたい状況でした。

## 結論
これをAhk2Exeでexeにコンパイルしてスタートアップフォルダにショートカットを置いて自動起動するようにしました。

```CloseActiveWindow.ahk
^q::WinClose,A
    Return
```

参考：[AutoHotkeyでウィンドウ表示方法変更](http://autohotkey.s365.xrea.com/window_show.html#:~:text=%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E6%9C%80%E5%B0%8F%E5%8C%96,%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A7%E3%81%99%E3%80%82)
【Vue.js】axiosで受け取ったエラーメッセージを表示する

#表示する方法

errorsという空のデータオブジェクトを用意して、そこにaxiosで受け取ったエラーを格納して表示します。

#実際のコード

```sample.vue
<template>
    <div class="sample">
        <!-- 複数のエラーもv-forで表示する -->
        <p class="error" v-for="error in errors" :key="error.id">{{ error[0] }}</p>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                keyword: '',
                baths: {},
                errors: {} // 空のオブジェクトを用意
            }
        },
        methods: {
            searchBath() {
                const url = '/post/search';
                this.errors = ''; // 描画する度にエラーを空にする
                axios.post(url, {
                    keyword: this.keyword,
                })
                .then(response => {
                    this.baths = response.data;
                })
                // 以下、エラーメッセージの受け取り
                .catch(e => {
                    this.errors = e.response.data.errors;
                })
            },
        }
    }
</script>
```
Bookmarklet で String.replace() ができない・効かない【Edge】

## はじめに

　タイトルは「できない」としましたが、けっして Edge に何か不具合や落ち度があったわけではありません。この記事では「できない事態が起きたときに、コードの何を疑うべきか。どう対処したか」について記します。

　Edge で発生しました。他のブラウザではまだ確認していません。

## 発生した事象

　Bookmarklet を作成していて、その中に以下のような処理がありました。

```js
var a = b.replace(' ', '%20');
```

　お察しの通り、URL エンコードした文字列をいろいろと操作する処理の一部です。

　これが Edge の Bookmarklet にしたとたん、何も replace されないということがおきました。

　しばらくハマったのですが、原因は、作成した Bookmarklet のコードをブックマークに登録した瞬間、以下のようなコードに書き換えられてしまったことです。

```js
var a = b.replace(' ', ' ');
```

　こりゃ replace されませんわ。

　どうも Edge はブックマークを登録する瞬間に、文字列リテラルの中の `%20` を空白に置き換えちゃうみたいですね。

## 回避方法

　以下のようにして回避しました。

```js
var a = b.replace(' ', '%' + '20');
```

## 第一引数もあやしい

　作成したコードをブックマークレットに変換するために、以下のサイトを利用していました。

[Website Tools：ブックマークレット変換（成形）](http://websitetools.biz-box.jp/js_bookmarklet.php)

　こっちにもトラップがあって（いや自分が迂闊だっただけで、上記サイト様には落ち度はありませんが）、「空白を%20に変換」というチェックボックスを気づかずに作業していました。そしたら、しばらく以下のように変換されていました。

```js
var a = b.replace('%20', '%' + '20');
```

　こりゃ replace されませんわ。

## さらに回避方法

　チェックボックスには気づきましたが、もう念のため、以下のように変更しました。

```js
const spc = String.fromCharCode(0x0020);
var a = b.replace(spc, '%' + '20');
```

## おわりに

　コンソールでうまく動くのに、ブックマークレットにした途端ちがう動きをして、さらに躓くポイントが二箇所もあったためにハマってしまいました。

　上記対処で無事ブックマークレットは作成できました。
【NestJS】Module間でDIを実装する方法

#はじめに
前回の記事でModule内のServiceとRepositoryのDIについて触れたので、今回はModule間でのDIについてまとめました。

https://qiita.com/suzuki0430/items/894e2da2b44156a2a437

#実装
以下のように複数のModuleで構成されたアプリケーションがあった場合、別のModuleからServiceを呼び出すためにどのような実装をすればよいかを考えます。
![スクリーンショット 2021-09-27 22.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d8aa55c5-e9de-ca84-3002-27343fc8893e.png)

##プロジェクト作成
プロジェクトおよび今回必要となるModule、Service、Controllerを作成します。

```
$ nest new di
```

```
$ nest g module computer
$ nest g module cpu
$ nest g module disk
$ nest g module power
```

```
$ nest g service cpu
$ nest g service disk
$ nest g service power
```

```
$ nest g controller computer
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/2e9e7576-759e-2c80-38ba-37654f38d54b.png" width="300">

##Module間でのDI
Module内のServiceとRepository間のDIは、それぞれに`@Injectable()`デコレータを付加して、Moduleの`providers`にServiceとRepositoryを登録するだけで実装することができました。

一方、別のModule間のService同士でDIを行うには、別の手順を踏む必要があります。
下図を例にすると以下のようになります。

![スクリーンショット 2021-09-28 21.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/d67c5dae-09b2-7484-b0a4-473a3a21324f.png)

###1. 呼び出される側のModule(PowerModule)の`exports`にService(PowerService)を登録する

```ts:power.module.ts
import { Module } from '@nestjs/common';
import { PowerService } from './power.service';

@Module({
  providers: [PowerService],
  exports: [PowerService],
})
export class PowerModule {}
```

###2. 呼び出す側のModule(CpuModule)の`imports`に1のModule(PowerModule)を登録する

```ts:cpu.module.ts
import { Module } from '@nestjs/common';
import { PowerModule } from 'src/power/power.module';
import { CpuService } from './cpu.service';

@Module({
  imports: [PowerModule],
  providers: [CpuService],
})
export class CpuModule {}
```

###3. 呼び出す側のService(CpuService)のconstructorで呼び出される側のService(PowerService)を定義する

```ts:cpu.service.ts
import { Injectable } from '@nestjs/common';
import { PowerService } from 'src/power/power.service';

@Injectable()
export class CpuService {
  constructor(private powerService: PowerService) {}

  compute(a: number, b: number) {
    console.log('Drawing 10 watts of power from Power Service');
    this.powerService.supplyPower(10);
    return a + b;
  }
}
```
PowerModuleとCpuModuleのDIコンテナを図にすると以下のようになります。

![スクリーンショット 2021-09-28 21.51.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/070a5abd-74b8-715a-cfbf-e6fcf54055af.png)

CpuModuleでPowerModuleをインポートすることで、PowerModuleのDIコンテナに登録されたリスト(ServiceやServiceとdependencyの関係)がCpuModuleのDIコンテナに登録されます。
NestではModule間のDIがこのようにして行われます。

#参考資料

https://www.udemy.com/share/104SA43@Qu0RYtO1djmJjvoPEphvZF-RJi7fBmPp2Skao_yWST3rrvqN9Xe3m0DJAGIi9fw_/
Azure Synapse Analyticsワークスペースリソース作成時のマネージドリソースグループにタグをつける方法

## 注意点

2021/9時点の情報です。最新情報は別途ご確認ください。

## はじめに

Synapse Analyticsのワークスペースリソースを作成したときに同時に作成されるコレ

![s0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2446dc59-fbfb-7c3c-f0f5-9739dd19e596.png)

自動生成したときの例
![s00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/e675666b-b5e3-cc6c-fba4-6b93aa98fd96.png)

このマネージドリソースグループはユーザで変更ができないリソースグループなので、タグ付けができません。
リソースグループにタグをつけて管理するような運用をしている場合にはちょっと困ります。
（しかも、名前を自動生成にまかせるとどのワークスペースリソースと紐づいているのかもぱっと見わからない）

## タグ付けの方法

Synapse Analyticsのワークスペースリソースにタグをつけることで、マネージドリソースグループにもタグがつきます

### 確認

どのワークスペースと紐づいているのかを識別するために、「synapse workspace」という名前のタグで、値をリソース名にしました。

![s1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/9f11a9f1-e09a-931f-2fff-a67488b6d9f4.png)


マネージドリソースグループにタグがつきます。

![s2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/2c03984f-7b13-bb98-0b2b-adc92df421eb.png)
UPnP とは

## 勉強前イメージ

wifiの設定であったから調べてみる
なんかの頭文字なんだろうけどよくわからん

## 調査

### UPnP とは

Universal Plug＆Play の略で、ユニバーサル プラグ アンド プレイ と読みます。
ネットワークプロトコルのひとつで、機器をネットワークに接続すると
設定作業を行わなくてもすぐに他の機器と通信したりと利用できるプロトコルになります。

### 接続までの流れ

- ネットワークに接続

UPnP対応の機器がネットワークに繋がった際は、DHCPでIPアドレスを自動的で設定されます。
IPアドレスが割り当てられると、LAN上の他の機器に接続されたことがUDP:1900で通知されます。

- 他の機器との接続

LAN上の他の機器に通知された後、httpで情報のやり取りを行います。
フォーマットはXMLを使用され、構造化やタグの拡張が可能なため細やかな設定を送ることも出来ます。
他にもSOAPを使うこともあるようです。

### よく使われているところ

よく使われるのは、UPnP対応のルーターやモデムなどになります。

## 勉強後イメージ

使ってる技術はよく見るやつ。
いろいろ組み合わせてこのプロトコルになってるのね

## 参考

- [UPnP 【Universal Plug and Play】 ユニバーサルプラグアンドプレイ](https://e-words.jp/w/UPnP.html)
- [「LANにつなげばすぐに使える」―― UPnPの正体ってなに？](https://xtech.nikkei.com/it/members/NNW/NETHOT/20020531/1/)
- [デジタル家電のネットワーク ～ UPnPとは ～](https://www.yamanjo.net/knowledge/internet/internet_32.html)
Hololens2でKnownFolders.DocumentsLibraryを扱おうとしたら「index out of range of ToggleList: 0」エラーが出た

## 現象
Hololens2のエミュレータの段階で、タイトルのようなエラーがでました

### 再現コード

```c#
string UWP_DIR_NAME = "myDir";
string FILE_NAME = "obj_info.json";

string jsonString = "{\"objs\":{\"x\":100,\"y\":200,\"z\":300}";

await Task.Run(async () =>
{
	try
	{
		var readFolder = await KnownFolders.DocumentsLibrary.GetFolderAsync(UWP_DIR_NAME);
		var readFile = await readFolder.GetFileAsync(FILE_NAME);
		using (var stream = await readFile.OpenStreamForReadAsync())
		{
			var bytes = new byte[stream.Length];
			await stream.ReadAsync(bytes, 0, bytes.Length);
			var text = System.Text.Encoding.UTF8.GetString(bytes);
			jsonString = text;
		}
	}
	catch (Exception e)
	{
		var folder = await KnownFolders.DocumentsLibrary.CreateFolderAsync(UWP_DIR_NAME, CreationCollisionOption.OpenIfExists);
		var file = await folder.CreateFileAsync(FILE_NAME, CreationCollisionOption.ReplaceExisting);
		using (var stream = await file.OpenStreamForWriteAsync())
		{
			var bytes = System.Text.Encoding.UTF8.GetBytes(jsonString);
			await stream.WriteAsync(bytes, 0, bytes.Length);
		}
	}
});
```

あるフォルダ内のファイルを見に行って、なければダミーのjsonファイルを作るというもの

実際のコードではないけど、var多いし、もっときれいに書きたいやつです

### 発生したエラー

catchのほうでもエラーが出てしまってこの後の処理がうまく通っていなかった

エラー内容は「index out of range of ToggleList: 0」

エラー箇所はそのあとたくさん`Debug.Log`を使って`var readFolder = await KnownFolders.DocumentsLibrary.GetFolderAsync(UWP_DIR_NAME);`らへんだと判明

### ちなみにエミュレータでDebug.Logを見る方法

参考：https://zenn.dev/fumiyahr/articles/a97842e3954560

いちいちダウンロードがめんどうですが、できました

## 環境

* Unity: v2019.4.18f1
* MRTK: v10.0.19041
* Hololens2エミュレータ: v10.0.20348
* Visual Studio 2019

## 解決した方法

参考
* https://docs.microsoft.com/en-us/uwp/api/windows.storage.knownfolders?view=winrt-20348
* https://www.fixes.pub/program/379935.html
* https://www.fixes.pub/program/270850.html
* https://qiita.com/miyaura/items/75ec7f3d6ab0500ccf72
* https://blog.kaorun55.com/entry/2017/03/04/203152

## エミュレータでの簡単な手順

1. Unity上でUWP向けにビルド
1. `Package.appxmanifest`をテキストエディタなどで開き、`<uap:Capability Name="documentsLibrary" />`を追加
1. VisualStudioでエミュレータのプロジェクトを開いて`Package.appxmanifest`を探して開き、宣言追加
1. エミュレータ実行

## 実機での簡単な手順

1. `Package.appxmanifest`をテキストエディタなどで開き、`<uap:Capability Name="documentsLibrary" />`を追加
1. VisualStudioでエミュレータのプロジェクトを開いて`Package.appxmanifest`を探して開き、宣言追加
1. Unity内でMRTKのビルド
sshpassをインストールしたら秘密鍵認証で繋がらなくなった....

## TL;DR
私「Ansibleでsshpass使って通信するかぁ（Ansible機までは公開鍵認証で、その先のマシンにパスワードで）...テストだから鍵交換メンドクセ」
ましん「sshpass入れまーす（ガコッ」
私「あー、楽ちんなんじゃ^^...一旦切断して切り替えて...戻るか...あれ？」
ましん「Permission denied(publickey)」
私「どうして...」

## 環境
今回そこまで環境が問題ではなかったので割愛

- Server
  - ArchLinux(5.14.8-arch1-1)
    - 標準のOpenSSHサーバ

- クライアント
  - Windows 11
    - Rlogin(2.26.3)

## 起こったこと
ものすごいシンプルに書くと。sshpassをインストールしたら公開鍵認証でSSHつながらなくなっただけのお話です。
自分はSSH-FSをcode-serverに入れて使っていて、そこから接続できねぇって気がついたのが発端ですが、なんでつながらないのか...と悩みました。

## 原因

今の所不明です...対応方法だけ見つけました。分かり次第書きます。


## 対処

`/etc/ssh/sshd_config` に以下の内容を追記してください。  
（ここでは既にPubkeyAuthenticationがyesになっている前提です）

```
# PubkeyAuthentication yes の下くらいに入れるといいかも...
PubkeyAcceptedKeyTypes ssh-rsa
```
記述したら

```
sudo systemctl restart sshd 
```
してあげてください。

## 結論
sshpass怖い....sshpass怖い...便利だけど怖い....
Chromebookに外部のアプリストアからAndroidアプリをインストールできるようにする（F-Droid等）

# 概要
ChromebookはPlayストアからAndroidアプリをインストールできるが、
F-DroidやEpic Games StoreといったPlayストア以外のアプリストアからアプリをインストールすることは出来ない。
アプリストアからapkファイルを取得できる場合はLinux機能を使って個別にadbインストールが可能だが、
アプリストアの機能を使ってインストールやアップデートを行うことは出来ないというのが現状である。

この状況を改善できることが確認できたので記事にする。
（ChromeOSのデベロッパーモードへの切替は不要）



# 現状
外部のアプリストアからアプリをインストールしようとすると、下記画像のような警告文が表示され、
アプリのインストールやアップデートが出来ない。
例：F-Droidアプリを使ってTermuxをインストール
![Screenshot 2021-09-28 19.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/535f4911-632a-c4a9-0d1b-9e8a113b0ba7.png)
この警告が表示されないようにする。



# 対応手順
## ①パッケージインストーラのapkファイルを手に入れる
私はAPKMirrorからダウンロードした。ChromebookのAndroidバージョンに合ったものを選ぶ。
（今回確認した機種のAndroidバージョンは9）
[Latest Uploads - APKMirror](https://www.apkmirror.com/uploads/?q=package-installer)
 → [Package installer 9-6794505 (Android 9.0+) APK Download by Google LLC - APKMirror](https://www.apkmirror.com/apk/google-inc/package-installer/package-installer-9-6794505-release/package-installer-9-6794505-android-apk-download/)


## ②パッケージインストーラをインストールする
パッケージインストーラはLinux機能を使ってadbインストールする。
参考：[ChromebookにapkファイルからAndroidアプリをインストールする（デベロッパーモード不要） - Qiita](https://qiita.com/htnk/items/26fa3272bfdd488af8d3)
![Screenshot 2021-09-28 19.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/4fa489ba-3ce4-f34f-61f5-39b3be84cb16.png)


上記手順によりアプリインストール画面に表示される警告文が表示されなくなり、
外部アプリストアから直接アプリのインストールとアップデートが出来るようになる。
また、ファイルアプリからapkをダブルクリックでインストールすることも可能になっている。


# 確認
F-Droidアプリを使ってTermuxをインストールする。
![Screenshot 2021-09-28 19.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/50ac67ed-6bf9-49cd-3475-64d75b01bef1.png)
警告文が表示されずにインストール工程が進む。初回は権限の許可が必要なため、設定ボタンを押す。
![Screenshot 2021-09-28 19.59.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/74cdb88c-e5eb-43b9-5523-248ed5ef4647.png)
F-Droidアプリによる提供元不明アプリのインストールを許可する。
![Screenshot 2021-09-28 20.00.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/b41365df-aabe-562f-cb06-bea811c7a546.png)
インストール準備が整ったのでインストールボタンを押す。
![Screenshot 2021-09-28 20.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/c119bd8d-b7ff-1712-effb-49c85f1a53e6.png)
F-DroidアプリからTermuxをインストールし起動できることを確認。
![Screenshot 2021-09-28 20.18.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/169404/a2411c22-a31c-4ab1-d619-59af73ac68c0.png)



# 注意
軽くテストした限りではChromeOSやAndroidの動作に影響は無いが、Androidアプリが全て起動しなくなる等の問題が発生する可能性が無いこともないので自己責任で。
また、OSアップデート等によってパッケージインストーラが上書きされ、元に戻る可能性がある。



# 参考
[Installing APKs and third party app stores without developer mode : chromeos](https://www.reddit.com/r/chromeos/comments/pvjrrr/installing_apks_and_third_party_app_stores/)



（バージョン: 93.0.4577.85（Official Build） （64 ビット）にて確認）

以上
【iOS】続 AssetCatalogの素材をXcodeを使わなくてもいい感じに見る

[【iOS】AssetCatalogのColorSetを閲覧できるツールを作ったお話](https://qiita.com/MYamate_jp/items/a0c1404dedac6957e1ad)
こちらの記事の続きです。

# 背景
業務中のデザイナーさんとのやり取りで、「今、リリースされているアプリに含まれている素材一覧をください」と言われるシーンが何回か発生したことがありました。
もちろん、元データの管理はなされているもののマスターデータの整理をされる際にリリース済みのアプリに含まれている素材を知れると便利ということでした。
最初からしっかり素材の命名規則であったり管理方法を決めた上で運用することができていれば良いのでしょうが、実際には担当者の移動や退職による引継ぎがうまくなされなかったり、ルールがあってないような状態に陥ってしまうとどの状態が最新の素材なのか管理しきれなくなってしまいます。
そういった時にリリース済みの最新の素材の利用状況を把握するためにAssetCatalog内のデータを全て欲しいということは割とあるのかなと感じました。

デザイナーさんにXcodeを入れてもらってXcode上からAssetCatalogをGUI上で見てもらうことも負担になりますし、最新のソースコードをクローンするためにGitHubのアカウントをデザイナーさん向けに発行することも管理上のコストにもなります。
かといって、AssetCatalogをzipで圧縮して受け渡しても1つ１つのデータを確認するのに各素材名のディレクトリを深掘り確認する必要がありそれも手間です。

なので理想は、

- 1つの画面で全ての素材名とスケール、ライトモード、ダークモードに割り当てられた素材・カラーコードを確認できる
- Xcodeなどのアプリを追加でインストールしなくても簡単に閲覧できる
- 受け渡しが簡単

の3つを満たしていることが必要かと思いました。

# AssetCatalogの中身を見てみる
AssetCatalogは、拡張子が``.xcassets``のディレクトリです。
ディレクトリ配下に、素材名のディレクトリがあり更にその中に実際の素材と設定情報が記載されている``Contents.json``というjsonファイルが配置されています。
なので極端な話、jsonをうまく扱うことができれば加工して何らかの形で表示することができます。

```
Assets.xcassets/
│  └hoge.imageset
│       ├hoge@x1.png
│       ├hoge@x2.png
│       ├hoge@x3.png
│       └Contents.json
└Contents.json
```

# 続・作ってみた
前回は、ローカルでサーバーを立ててWebページとして表示していました。
ただこれだと砂場みたいな環境が必要になるので気軽に利用することが出来ませんでした。
(ニーズは満たせていただけど運用面で難ありだったということです)

今回はローカルにあるiOSプロジェクトで利用できて、Markdownファイルで結果を出力するように変更しています。

## 使ってみる
まず下記リポジトリをクローンします。
[AssetCatalogViewer](https://github.com/MasamiYamate/AssetCatalogViewer)
クローン後、AssetCatalogViewerのディレクトリまで移動します。

```sh
$ cd ./AssetCatalogViewer
```

AssetCatalogを一覧化したいプロジェクトのディレクトリパスを用意しておきましょう。
下記コマンドを実行します。

```sh
$ npm run build -- -p 【iOSプロジェクトのディスプレイパス】
```

実行後distディレクトリ配下に出力結果の``asset.md``と、Markdownで利用する元画像が配置される``images``ディレクトリが生成されています。

VSCodeのプレビューなどでみると下記のようにColorSetの一覧とImageSetの一覧がそれぞれリストで表示されます。
![スクリーンショット 2021-09-28 20.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114168/2bf07dec-5bb4-1c0f-b9e3-3cd37384aa1d.png)

Markdown形式なので、アプリのリポジトリに含めることでGitHub上でも気軽に見れるようにすることができます。
Markdown上に表示される画像は、同時に生成されたimagesディレクトリ配下に置いた画像に対してパスを指定しているので、リポジトリに追加する場合は、imagesディレクトリも合わせて含めるようにしてください。
![スクリーンショット 2021-09-28 20.45.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114168/0175b387-bb27-0fdf-68c7-6960ebab5efc.png)

## まだバグもあります
ColorSetをsrgbで色指定してしていると、RGBAがうまく表示されない不具合があります。
今後改修予定です。

# 終わりに
やってることは非常にシンプルですが、かゆいところに手が届きそうなツールになったかなと思います。
実装等は急ぎ試しで書いたものなので雑な部分ありますが今後ちまちまと改修していきたいと思います。
STM8とWS2812B(3個)でランダムに光らせる。


x STM8S-Discovery ボード
x ws2812bがなぜ3個なのかと言うと2,3個で電流が超えるらしい
x 割り込みを止めないと誤作動する
x NOP (ノップ?)やループでタイミングを取らずにダイレクト
x 遅い

目的
GPIOのテスト


![o_con27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/57d34295-73bb-954f-ae49-2717514af3b5.jpeg)



```c++



#define L_NUM 3

char l[L_NUM*3]; //max3 led

#define PD_ODR *(volatile uint8_t *)0x500F

// 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 
void bit_off1(){
   //0.3us 800khz

    PD_ODR = 0b00000001; //1 0.125
    PD_ODR = 0b00000000; //2 0.250
    PD_ODR = 0b00000000; //3 0.375
    PD_ODR = 0b00000000; //4
    PD_ODR = 0b00000000; //5

    PD_ODR = 0b00000000; //1
    PD_ODR = 0b00000000; //2
    PD_ODR = 0b00000000; //3
    PD_ODR = 0b00000000; //4
    //PD_ODR = 0b00000000; //5

}//bit_off1

// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
void bit_on1(){
   //1us 800khz

    PD_ODR = 0b00000001; //1
    PD_ODR = 0b00000001; //2
    PD_ODR = 0b00000001; //3
    PD_ODR = 0b00000001; //4
    PD_ODR = 0b00000001; //5

    PD_ODR = 0b00000001; //1
    PD_ODR = 0b00000001; //2
    PD_ODR = 0b00000000; //3 0.375
    PD_ODR = 0b00000000; //4 0.250
    PD_ODR = 0b00000000; //5 0.125

}//bit_on1


//RGB_LEDにデータをn回分送る
void ws_led()
{
  disableInterrupts();
  //num1で指定された分だけループする
  for(char ii=0;ii<(L_NUM*3);ii++){

      if( l[ii] & 0b10000000 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b01000000 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b00100000 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b00010000 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b00001000 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b00000100 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b00000010 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

      if( l[ii] & 0b00000001 ){
        bit_on1(); //ビットが1 
      } else {
        bit_off1(); //ビットが0
      }//endif

  }//for
  enableInterrupts();
}//ws_led


//RGB_LEDに0データをn回分送る
void ws_led_cl()
{
  disableInterrupts();
  //num1で指定された分だけループする
  for(char ii=0;ii< (L_NUM*3)  ;ii++){
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0

    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
    bit_off1(); //ビットが0
  }//for
  enableInterrupts();
}//ws_led

void setup() {

   randomSeed( micros() ); //乱数の初期化

  //GPIOの初期化
  pinMode(PD0, OUTPUT);

}//setup

void loop() {

    for(int ii=0;ii<9;ii++){
      l[ii] = random(32);
    }//for

    //ws2812bへデータを送る
    ws_led();


  //0.1秒待つ
  delay(100);

}//loop




```
【Git】git rmでファイルを削除してみよう（初心者向け）

#はじめに
今回は、`git rm`を使って、ファイルを削除してみましょう。
`rm`とは、`remove`の略です。

#git rm
`git rm`を使うと、指定したファイルが完全に削除されるので、リポジトリだけではなく、ワークツリーからも削除されます。
つまり、ファイル（やディレクトリ）がもういらなくなったというときに`git rm`を使います。

```git:ターミナル
git rm <ファイル名>
git rm -r <ディレクトリ名>
```

ここで、`git status`を実行して差分を確認してみると、指定したファイルがリポジトリから削除され、その削除された状態がステージ（インデックス）に記録されていることが分かります。

```git:ターミナル
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    <ファイル名>
```

#git rm --cached
`git rm --cached`を使うと、リポジトリからはファイルを削除しますが、ワークツリーにはファイルを残すことができます。
間違ってGit管理下にあげてしまったからGit管理対象からは外したいが、ファイルは残したいというような場合に使います。

```git:ターミナル
git rm --cached <ファイル名>
```

ここで、再び`git status`を実行して差分を確認してみると、`git rm`と同様、リポジトリからはファイルが削除されており、Git管理下には同ファイルが存在しないのに、ワークツリーからは同ファイルを削除していないため、同ファイルがステージに追加していない未追跡ファイルとして認識されています。
つまり、リポジトリからは削除されているけれど、ワークツリーからは削除されていないということが分かりますね。

```git:ターミナル
git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    <ファイル名>

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        <ファイル名>
```

#おわりに
ファイルを削除するのってなんかちょっと怖いですよね。
でも、ちゃんとファイルを元に戻すコマンドもあるので、安心して削除しましょう。
Windows10でPythonが動かない

不具合現象

Pythonのプログラムを起動しようとして
コマンドプロンプトで

$ python xxx.py

と入力すると

Python

とだけ出力して、何もウインドウや結果が出ない。

原因

Windows組み込みのPythonが呼ばれている

C:\Users\{User}\AppData\Local\Microsoft\WindowsApps\python.exe

自分がインストールしたpython.exeが呼ばれるように　PATH環境変数を設定する
私の場合は
C:\Users\{User}\AppData\Local\Programs\Python\Python39\python.exe
Discordにおける文字数などの各種制限

Discordにおける文字数などの上限を、網羅的に扱った記事です。
一部複数の項目で重複する上限が記載されている場合があります。

# 文字数の制限
Discordでは半角英数でも全角文字でも、全て1文字としてカウントします。
ただし、絵文字や特殊な記号は2文字以上とカウントされる場合があります。

||最小文字数|最大文字数|
|-|-:|-:|
|ユーザー名|2|32|
|ニックネーム|1|32|
|カスタムステータス|0|128|
|アクティビティステータスのゲーム名|0|128|
|自己紹介 [※1](#注釈)|0|190|
|メモ|0|256|
|メッセージ|1|2,000|
|メッセージ(Nitro) [※2](#注釈)|1|4,000|
|メッセージ中の絵文字 [※3](#注釈)|0|198|
|TTS読み上げ文字数|1|200|
|メッセージの検索|1|512|
|サーバー名|2|100|
|ロール名|1|100|
|絵文字名 [※4](#注釈)|2|32|
|ウェブフック名|1|100|
|カテゴリー名|1|100|
|テキストチャンネル名 [※5](#注釈)|1|100|
|アナウンスチャンネル名 [※5](#注釈)|1|100|
|スレッドチャンネル名|1|100|
|ボイスチャンネル名|1|100|
|ステージチャンネル名|1|100|
|チャンネルトピック|0|1,024|
|バニティURL [※6](#注釈)|2|25|
|サーバーテンプレートのタイトル|2|100|
|サーバーテンプレートの概要|0|120|
|コミュニティサーバーの概要|0|120|
|メンバースクリーニングの概要|0|300|
|メンバースクリーニングのルール|1|300|
|ようこそ画面の概要|0|140|
|ようこそ画面のチャンネル説明|1|42|
|キックの理由|0|512|
|BANの理由|0|512|
|イベントの場所|1|100|
|イベントのトピック|1|240|
|イベントの概要|0|1000|

埋め込み内における文字数の制限は、こちらをご覧ください。
https://discord.com/developers/docs/resources/channel#embed-object-embed-limits

###### 注釈
※1 プロフィール上に表示できるのは6行まで。
※2 Nitro Classicでは2,000文字のままとなる。
※3 実際には199個まで使用できるが、199個目の絵文字以降の文字が表示されなくなる。
※4 使用できる文字は半角英数と半角アンダーバー(_)のみ。
※5 大文字の半角アルファベットは小文字に変換される。
※6 使用できる文字は半角英数と半角ハイフン(-)のみ。

# ユーザーの各制限
||通常|Nitro Classic|Nitro|BOT|
|-|-:|-:|-:|-:|
|メッセージの文字数|2,000|2,000|4,000|2,000|
|添付ファイルのサイズ上限|8MB|50MB|100MB|8MB|
|サーバー数 [※1](#注釈-1)|100|100|200|100|
|画面共有の画質|720p / 30fps|1080p / 60fps|4K / 60fps|-|

###### 注釈
※1 BOTのサーバー数は、認証によって150,000サーバーまで引き上げられます。

# サーバー内の各制限
特に指定が無い場合、上限。

||通常|ブーストLv1|ブーストLv2|ブーストLv3|
|-|-:|-:|-:|-:|
|サーバーメンバー数|250,000|250,000|250,000|250,000|
|サーバー同時接続数|25,000|25,000|25,000|25,000|
|ロールの数|250|250|250|250|
|絵文字の数|50|100|150|250|
|アニメーション絵文字の数|50|100|150|250|
|スタンプの数|0|15|30|60|
|チャンネルの数 [※1](#注釈-2)|500|500|500|500|
|カテゴリー内のチャンネルの数|50|50|50|50|
|アクティブスレッド数|1,000|1,000|1,000|1,000|
|アーカイブスレッド数|∞|∞|∞|∞|
|スレッドのアーカイブ期限|1日|3日|7日|7日|
|チャンネルのピン止め|50|50|50|50|
|添付ファイルのサイズ|8MB|8MB|50MB|100MB|
|ボイスチャンネルの音質|96kbps|128kbps|256kbps|384kbps|
|ボイスチャンネル接続数|∞|∞|∞|∞|
|1回あたりのロールメンバー追加上限|30|30|30|30|
|イベントの数|100|100|100|100|
|タイムアウトの最大日数|28日|28日|28日|28日|

###### 注釈
※1 カテゴリーを含めた全種のチャンネル合計の上限となる。

# 各操作のレート制限
レート制限とは、Discordの過負荷や不正操作などを防ぐために設けられる、一定時間（リセット時間）内にある操作を行える回数の制限のことです。

執筆中

# 最後に
この記事上に記載された上限値に誤りがございましたら、コメントにてお伝えください。
【Chakra UI】コンポーネントをフォーカスした時のアウトラインの色の変更方法


# 使用環境
​
- macOS BigSur 11.6
- VScode  1.60.2
- Next.js "^11.1.2"
- "@chakra-ui/react": "^1.6.5",
- "@chakra-ui/icons": "^1.0.14",
​
# 今回やりたいこと
​
私が参加しているチームのアプリ開発で、ChakraUIのコンポーネントの要素にフォーカスをあてた時の水色のアウトラインの色を変更したい。
​
# 参考記事
​
[Chakra UI：ボタンなどデフォルトのブルーのアウトライン（フォーカスポイント）を消したい - Qiita](https://qiita.com/hirochan/items/3bb0d80df59992cb7201)
​
こちらの記事を参考に今回、Button、CheckBox、Radioのコンポーネントのアウトラインの変更を実装出来たので共有します。
​
上記参考記事にもあるとおり、ChakraUIでボタンコンポーネントなどを押したりしてフォーカスをあてると水色のアウトラインがデフォルトで設定されています。
​
今回記事を投稿した背景として、このスタイリングが簡単そうで難しかった　＆　ニッチな内容で関連記事すらほとんどみつからない状態だったので書こうと思った次第です。
​
# 実装方法
​
実装方法としては2つあります。
​
1. グローバルで初期値を定義する
2. 適用したいコンポーネントのタグ内に記述する
​
...が、2.に関してはgithubのissueから見つけた方法をそのまま記述する以外自分では見つけられなかったのでわかる方いれば教えて下さい。
​
## 1.グローバルで初期値を定義する方法
​
※ChakraUIの基本的な使い方は[公式ドキュメント](https://chakra-ui.com/docs/getting-started)でお願いしますm(_ _)m

```jsx

export const theme = extendTheme({
​
components: {
    Button: {
      baseStyle: {
        _focus: {
          boxShadow: "0px 0px 0px 2px #色の指定",
        },
      },
    },
    Checkbox: {
      baseStyle: {
        control: {
          _focus: {
            boxShadow: "0px 0px 0px 3px #色の指定",
          },
        },
      },
    },
    Radio: {
      baseStyle: {
        control: {
          _focus: {
            boxShadow: "0px 0px 0px 3px #色の指定",
          },
        },
      },
    },
  },
});
```

​
こんな感じでcomponentsの中のそれぞれの要素にアクセスして定義する。
​
注意点として、Buttonはfocusが当たるのが要素全体なので簡単だがRadioボタンやCheckBoxはfocusがコンポーネントの要素の一部なので該当の子要素にアクセスしてから定義しないとスタイリングが適応されないです。
​
Radio、Checkboxはcontrolという要素がアウトラインが適応される要素です。
​
コンポーネントによっては名前がちがうかもなので、私が参考にしたgithubのリンクを貼っておきます。（公式にも載っているものです）
​
[chakra-ui/packages/theme/src/components at main · chakra-ui/chakra-ui](https://github.com/chakra-ui/chakra-ui/tree/main/packages/theme/src/components)
​
## 2.適用したいコンポーネントのタグ内に記述する
​
こちらに関しては先で述べた通り、githubのissueを抜粋したものでしか動かすことが出来なかったので、あまり参考にならないかと思いますが一応載せておきます。
​

```jsx
<Checkbox
  size="sm"
  colorScheme="primary"
  defaultIsChecked
  css={`
    > span:first-of-type {
      box-shadow: unset;
    }
  `}
  >
  Random text
</Checkbox>
```

​
抜粋したgithubの[リンク](https://github.com/chakra-ui/chakra-ui/issues/2234)
​
boxShadowの値に上記と同じ値を渡せば適応されます。
​
ただ、1.で定義したような書き方だと私の力では動かせなかったです（汗）
​
# 実装結果
​
【before】
​
![スクリーンショット 2021-09-27 8.13.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947215/01e2314e-5460-e927-45de-b16162a7294a.png)

​
【After】

![スクリーンショット 2021-09-27 8.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/947215/249c2d78-dbd3-5153-6a72-888526d1beaf.png)


​
こんな感じでスタイリングすることが出来ました。
​
なかなか細かい部分ですが、こんな感じで細かい部分もスタイリング出来るとデザインの幅が増えていいかもしれないですね。
デザインで使ってみたい方はぜひ参考にしてみて下さい。
apt update & upgrade を実行してもアップデートされない場合の解決法

# 結論
```shell:Shell
sudo apt -y update
sudo apt -y upgrade
sudo apt -y dist-upgrade
sudo apt -y install <保留中のパッケージ> # 必要に応じて
sudo reboot
```



# 環境
Ubuntu 20.04.3 LTS



# 問題
Ubuntu Server にログインすると、以下のように利用可能なパッケージのアップデートについてのメッセージが表示される。

```
17 updates can be applied immediately.
1 of these updates is a standard security update.
To see these additional updates run: apt list --upgradable
```

それに対し、以下のようにアップデートをして再起動する。

```shell:Shell
sudo apt -y update
sudo apt -y upgrade
sudo reboot
```

しかし、再起動後、再びログインしてもアップデートされていないときがある。

```
17 updates can be applied immediately.
1 of these updates is a standard security update.
To see these additional updates run: apt list --upgradable
```



# 原因
`apt -y upgrade` を実行した際に、以下のように表示される。

```
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
```

`not upgraded` と書かれている通り、アップデートされなかったパッケージがある。そのため、アップデート情報のメッセージが変わらなかった。



# 解決方法
まずは以下のコマンドを実行する。

```shell:Shell
sudo apt -y dist-upgrade
```

この際、`The following packages have been kept back:` と表示され、その下にパッケージ一覧が表示された場合は、それらのパッケージをインストールする。

```shell:Shell
sudo apt -y install <保留中のパッケージ>
```

上記のメッセージが表示されない場合はこの手順はスキップする。

最後に再起動する。

```shell:Shell
sudo reboot
```

これにより、アップデートされなかったパッケージの問題が解決する。

```
0 updates can be applied immediately.
```

でめたしでめたし。



# 参考サイト
* [29 packages can be updated - How? [duplicate]](https://askubuntu.com/questions/449032/29-packages-can-be-updated-how#answer-621709)
* ["The following packages have been kept back:" Why and how do I solve it?](https://askubuntu.com/a/602)
* [Ubuntuのupgradeで保留（not upgraded）されたときの解決法](https://blog.goo.ne.jp/takuminews/e/eca67b95214d55f788dfcd2b94ef5677)
さくっとDockerでLinux OSを試す（Ubuntu, Fedoraなど）

# 前提条件

Dockerインストール済み。
ホストOSはMacです。

# さくっと試す

`Docker image ubuntu`などで検索。

以下のようにdocker hubのサイトが出てくるのでクリック。

![スクリーンショット 2021-09-28 19.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344711/70294725-d2e7-c67f-ab01-a361edb03af5.png)

こだわりがなければ画面右のコマンドをコピペして実行。
特定バージョンが欲しければTagsから欲しいもの探してコピペ。

![スクリーンショット 2021-09-28 19.39.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344711/2b0451ad-4f40-432e-d7ee-b2da084400f0.png)

```
# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:xxx
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest

# docker images
REPOSITORY TAG     IMAGE ID       CREATED     SIZE
ubuntu     latest  fb52e22af1b0  4 weeks ago  72.8MB

# docker run -it ubuntu:latest
root@1ce9df42add1:/#
```

インストールされていないコマンドが多いので、好きなコマンドをインストールする

```
root@1ce9df42add1:/# apt update
root@1ce9df42add1:/# apt install bc
```
colcon buildにて"〜〜〜〜に対する定義されていない参照です。"と出た


# 症状
以下のようなエラーがでた

```
CMakeFiles/pointcloudfilter.dir/src/pointcloudfilter.cpp.o: 関数 `rclcpp::create_subscription_factory<nav_msgs::msg::Odometry_<std::allocator<void> >, std::_Bind<void (PointCloudFilter::*(PointCloudFilter*, std::_Placeholder<1>))(std::shared_ptr<nav_msgs::msg::Odometry_<std::allocator<void> > >)>, std::allocator<void>, nav_msgs::msg::Odometry_<std::allocator<void> >, rclcpp::Subscription<nav_msgs::msg::Odometry_<std::allocator<void> >, std::allocator<void>, rclcpp::message_memory_strategy::MessageMemoryStrategy<nav_msgs::msg::Odometry_<std::allocator<void> >, std::allocator<void> > >, rclcpp::message_memory_strategy::MessageMemoryStrategy<nav_msgs::msg::Odometry_<std::allocator<void> >, std::allocator<void> > >(std::_Bind<void (PointCloudFilter::*(PointCloudFilter*, std::_Placeholder<1>))(std::shared_ptr<nav_msgs::msg::Odometry_<std::allocator<void> > >)>&&, rclcpp::SubscriptionOptionsWithAllocator<std::allocator<void> > const&, rclcpp::message_memory_strategy::MessageMemoryStrategy<nav_msgs::msg::Odometry_<std::allocator<void> >, std::allocator<void> >::SharedPtr)::{lambda(rclcpp::node_interfaces::NodeBaseInterface*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&)#1}::operator()(rclcpp::node_interfaces::NodeBaseInterface*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, rclcpp::QoS const&) const' 内:
pointcloudfilter.cpp:(.text._ZZN6rclcpp27create_subscription_factoryIN8nav_msgs3msg9Odometry_ISaIvEEESt5_BindIFM16PointCloudFilterFvSt10shared_ptrIS5_EEPS7_St12_PlaceholderILi1EEEES4_S5_NS_12SubscriptionIS5_S4_NS_23message_memory_strategy21MessageMemoryStrategyIS5_S4_EEEESK_EENS_19SubscriptionFactoryEOT0_RKNS_32SubscriptionOptionsWithAllocatorIT1_EENT4_9SharedPtrEENKUlPNS_15node_interfaces17NodeBaseInterfaceERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_3QoSEE_clESY_S16_S19_[_ZZN6rclcpp27create_subscription_factoryIN8nav_msgs3msg9Odometry_ISaIvEEESt5_BindIFM16PointCloudFilterFvSt10shared_ptrIS5_EEPS7_St12_PlaceholderILi1EEEES4_S5_NS_12SubscriptionIS5_S4_NS_23message_memory_strategy21MessageMemoryStrategyIS5_S4_EEEESK_EENS_19SubscriptionFactoryEOT0_RKNS_32SubscriptionOptionsWithAllocatorIT1_EENT4_9SharedPtrEENKUlPNS_15node_interfaces17NodeBaseInterfaceERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNS_3QoSEE_clESY_S16_S19_]+0x34): `rosidl_message_type_support_t const* rosidl_typesupport_cpp::get_message_type_support_handle<nav_msgs::msg::Odometry_<std::allocator<void> > >()' に対する定義されていない参照です
```

# 原因
だいたいCMakefileの記述漏れ 
今回の場合は```ament_target_dependencies```にnav_msgsを追加していなかった
WordPress ERR_TOO_MANY_REDIRECTS 302

#対象
```
https://（WORDPRESSのURL）/wp-login.php
```
「https」を設定した場合にリダイレクトループする。
「http」を設定すると安全に接続できない。が、ループしない。

#現象
`ERR_TOO_MANY_REDIRECTS`
繰り返しリダイレクトが行なわれました、的な画面が出て全然進めない

#結論
`wp-config.php` の末尾

```
$_SERVER['HTTPS'] = 'on';
```
を追加する。で、解決する。


##参考リンク
https://wp-doctor.jp/blog/2016/07/18/wordpress%E3%83%AF%E3%83%BC%E3%83%89%E3%83%97%E3%83%AC%E3%82%B9%E3%81%AE%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88-%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AE%E5%8E%9F%E5%9B%A0%E3%81%A8/
Db2 on CloudのデータベースにEXPLAIN表を作成する

# 経緯

Db2 on CloudはSYSTOOLSスキーマにデフォルトでEXPLAIN表が作られていますが、その他のスキーマに作りたい場合があったとします。しかしEXPLAIN表を作ろうとすると、下記のエラーが発生する場合があります。

```
$ db2 -tvf ~/sqllib/misc/EXPLAIN.DDL
...
SQL20054N  操作に関して表が無効な状態にあるため、この操
作は実行されませんでした。表名: "lob options prohibited with
blocknonlogged enabled"。 理由コード: ""。  SQLSTATE=55019
```

# 原因

Db2 on CloudはHADR構成のとき、DB構成パラメータ``BLOCKNONLOGGED=YES``が有効になっているためです。一方、EXPLAIN.DDLで作成するテーブルで一部``NOT LOGGED``を使用しているものがあるため、エラーとなります。

https://www.ibm.com/support/pages/asnclp-command-fails-sql-error-20054-when-executing-%E2%80%9Ccreate-control-tables-apply-server%E2%80%9D

# 対応

実はEXPLAIN.DDLにコメントで書かれていました。

```
-- -*- sql -*-
--
-- Sample DDL to create Explain tables
--
--   -> assumes db2start issued
--   -> assumes connection to a database exists
--   -> assumes called by "db2 -tf EXPLAIN.DDL"
--   -> ALTERNATIVELY, ONE CAN EXECUTE THE FOLLOWING: ;
--   -> db2 "CALL SYSPROC.SYSINSTALLOBJECTS('EXPLAIN','C',NULL,CURRENT SCHEMA)"
--
--   -> uses NOT LOGGED option for LOB columns
--      If database configuration parameter BLOCKNONLOGGED is set to yes, then
--      stored procedure SYSPROC.SYSINSTALLOBJECTS should be used as shown above
```

従って、DDLを流すのではなく、プロシージャを実行すれば大丈夫です。

```
$ db2 "CALL SYSPROC.SYSINSTALLOBJECTS('EXPLAIN','C',NULL,'任意のスキーマ名')"

  リターン状況 = 0

$ db2 list tables

表/ビュー                       スキーマ        タイプ 作成時刻
------------------------------- --------------- ----- --------------------------
ADVISE_INDEX                    ********        T     2021-09-28-10.29.31.635468
ADVISE_INSTANCE                 ********        T     2021-09-28-10.29.31.005224
ADVISE_MQT                      ********        T     2021-09-28-10.29.32.121570
ADVISE_PARTITION                ********        T     2021-09-28-10.29.32.397225
ADVISE_TABLE                    ********        T     2021-09-28-10.29.32.645619
ADVISE_WORKLOAD                 ********        T     2021-09-28-10.29.31.921469
EXPLAIN_ACTUALS                 ********        T     2021-09-28-10.29.35.619534
EXPLAIN_ARGUMENT                ********        T     2021-09-28-10.29.28.663631
EXPLAIN_DIAGNOSTIC              ********        T     2021-09-28-10.29.30.185193
EXPLAIN_DIAGNOSTIC_DATA         ********        T     2021-09-28-10.29.30.465548
EXPLAIN_INSTANCE                ********        T     2021-09-28-10.29.28.134085
EXPLAIN_OBJECT                  ********        T     2021-09-28-10.29.28.853695
EXPLAIN_OPERATOR                ********        T     2021-09-28-10.29.29.031548
EXPLAIN_PREDICATE               ********        T     2021-09-28-10.29.29.333072
EXPLAIN_STATEMENT               ********        T     2021-09-28-10.29.28.430820
EXPLAIN_STREAM                  ********        T     2021-09-28-10.29.29.908820
OBJECT_METRICS                  ********        T     2021-09-28-10.29.30.721547

  17 レコードが選択されました。
```
Google I/O 2021 Material Youについて

# 前身となったMaterial Design
- Googleが推しているデザインのガイドライン
- ユーザエクスペリエンスを向上、統一させるためのもの
    - Androidだけではなく、WebやiOSなど様々なプラットフォーム向けにライブラリが用意されている
    - どのサービスでもユーザエクスペリエンスを共通にすることで、ユーザが直感的に操作できるようになる
    - 同じくGoogleが提供しているクロスプラットフォーム開発に用いられるFlutterもUIパーツはMaterial Designに準じたものになっている

Material DesignはWebサイトにてガイドラインが公開されているため、誰でも学ぶことができるものになっている。
詳しくは[こちら](https://material.io/design/introduction)！

# Material You
GoogleI/Oにて発表されたMaterial Designの流れを汲んだ新しいデザインフレームワーク。
今後全てのGoogle製品で採用されていくらしい。

Android12からMaterial Youが標準搭載されるため、beta版のAndroid12と既存のAndroid1０を比べてみた。

## Material Youの特徴①：デザインの一新
- 全体的に丸みのあるデザインに変更されている
- Android10だとフォントサイズや調整バーなどが細いのに対して、太めに設定されている
- クイック設定もボタンの大きさや通知のサイズが全体的に大きくなっている

![新規事業エンジニア勉強会_20210624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645987/f202c1a6-5952-21e4-584e-4d91d437d394.png)


## Material Youの特徴②:パーソナライズ
- UIのカラー、デザインをパーソナライズすることができる
    - ユーザが使用している壁紙から色を抽出し、色調を設定することができる
        - サービス横断で色調を統一することで、端末のデザインがパーソナライズされる
- 色だけでなく、UIそのものの調整（カスタマイズ?）も可能になるらしい

## Material Youの特徴③: UIをあらゆる画面に対応
- 様々な画面サイズのデバイスに合わせてUIを変えることができる
- Android１２のヴィジェットはサイズによってデザインを変えられるようになった

<img width="500" alt="2021-09-28 19.19.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/645987/52c47f4c-c5f0-386c-c35c-a3766748c13d.png">

# Material You全体の感想
- UIのカラー、デザインのカスタマイズがユーザ側からどれくらいの自由度で変えることができるのかが気になる
    - OSシステムだけ？　アプリ側はどの程度適用される?
- ウィジェットのデザインも結構自由に変わってる
    - Android12からヴィジェットの新機能が色々と出ているので、Googleさん的には推しだったりするのだろうか...

- 全体的に丸みのあるデザインに変更されいる
    - アプリ側もこのデザインで統一するとOS側とのユーザエクスペリエンス差が少なくなりそう...


# お試し
MDC-Androidに『[Material 3](https://github.com/material-components/material-components-android/releases/tag/1.5.0-alpha03)』が追加されていました。どうやらこれがMaterial Youみたいです...
サンプルアプリも見ることができるため、気になる方はチェックしてみてください
【Unity】効果音を簡単に再生できる SEManager と SEClip の紹介

# SEManager v2 を作りました
v2 の方がシンプルかつ柔軟に実装できます。
https://qiita.com/Yamara/items/91f19eef6297d9c8fc87

# ⚙️SEManager
SEManager は、AudioSource を意識しないで効果音を再生できる便利なパッケージです。
SEManager をプロジェクトに導入し、下記のようなコードを書くだけで、効果音を再生できます。
[SEManager のリポジトリはこちら](https://github.com/0105takuyayamada/SEManager)

``` サンプルコード.cs
[SerializeField] AudioClip clip;

// 再生
clip.Play();
// 音量,優先度を設定して遅延再生
clip.Play(1f, 127, 0.5f);
// 複数の効果音,音量,ピッチ,ピッチのブレ幅,優先度を設定して再生
new SEClip(clips, 0.5f, 1f, 0.1f, 127).Play();
```

## 🧮関数

|関数名|説明|
|-|-|
|audioClip.Play()<br>audioClip.Play(float volume, byte priority, float delay)<br>seClip.Play()<br>seClip.Play(float delay)|再生|
|seClip.Play(AudioSource audioSource)<br>seClip.Play(AudioSource audioSource, float delay)|AudioSourceを指定して再生|
|SEManager.Stop()|全ての効果音を停止|
|SEManager.Pause()|全ての効果音の一時停止|
|SEManager.UnPause()|全ての効果音の一時停止解除|
|SEManager.VolumeToDecibel(float volume)|値（範囲:0～1）をデシベル（範囲:-80～0）に変換|
|SEManager.DecibelToVolume(float decibel)|デシベル（範囲:-80～0）を値（範囲:0～1）に変換|

## 📝備考

SEの再生に使用するAudioMixerGroupと最大同時再生数の設定は SEManager / Resources / SEManagerSettings.asset から行えます。

# 💿SEClip
SEClip は、効果音を単調にしないための ScriptableObject です。複数の AudioClip とピッチのブレ幅を設定して再生すると、ランダムな AudioClip とピッチで効果音が鳴ります。これにより、銃弾や足音などにバリエーションを持たせられます。再生は SEManager 上で、AudioClip と同じように行えます。

|変数|説明|
|-|-|
|clips|複数のAudioClip|
|priority|優先度|
|volume|音量|
|pitch|ピッチ|
|pitchRange|ピッチのブレ幅|

# 🧰便利コンポーネント
パッケージには、SEManager や SEClip に関する便利なコンポーネントが含まれています。unitypackage で圧縮しているので利用する際は展開してください。

|コンポーネント名|説明|
|-|-|
|SEVolumeSlider|Slider と AudioMixer と EventTrigger を指定して、効果音の音量調整スライダーを作成できます。サンプルは SEManager / Prefabs / SEVolumeSlider.prefab にあります。|
|SEClipPlayer|SEClip を再生|
|SEClipPlayerForAudioSource|AudioSource を指定して SEClip を再生|
|SEPlayer|インスペクタ上で SEClip を設定して再生|
|SEPlayerForAudioSource|インスペクタ上で SEClip を設定し、AudioSource を指定して再生|
|AudioClipLoader|Preload Audio Data と Load in BackGround が無効になっている AudioClip を読み込み|