OmniAICreator/Qiita-1.07M huggingface dataset:
EMUIで最近のアプリ一覧の表示が消えるバグを対処する（非Root環境）

##背景
サードパーティランチャー環境下でマルチウインドウで2つのアプリを表示させる
→マルチウィンドウを解除する
→最近のアプリ（バックグラウンドタスク）を表示しようとしてもアプリ一覧が表示されないバグに遭遇
（これ以外にもたまに表示されなくなることがある）

どうやら公式のコミュニティにもEMUI10にて[似たような報告](https://consumer.huawei.com/en/community/details/Honor-10%3A-Can%26apos%3Bt-view-the-%26apos%3Bopened-apps%26apos%3B-screen--since-updating-to-EMUI-10/topicId_83363/)がある模様（微妙に違うけど）

##環境
・HUAWEI P20 lite (ANE-LX2J)，非Root
→　EMUI自体のバグみたいなのでこの端末に限らないはず

・EMUI 9.1.0.336 (C635E5R1P1)　
→　EMUI 9.0.0以降のバージョンで発生するみたい
ただし自分の環境ではEMUI10以降の検証はできてないのであしからず

・Nova Launcher 6.2.12
→　サードパーティランチャー全般で発生するのであまり関係ない

##対処法
XDA-devフォーラムの[ここ](https://forum.xda-developers.com/mate-20-pro/themes/how-to-enable-android-oreo-style-t3864229)と[ここ](https://forum.xda-developers.com/mate-20-pro/help/recent-apps-annoyance-t3861235)とかRedditでも[色々](https://www.reddit.com/r/Huawei/search/?q=recent%20apps&source=recent&restrict_sr=1)出てくる
サードパーティランチャーがデフォルトに設定されていることが前提

####1.PCと端末を接続して，以下のADBコマンドを実行する

```shell
adb shell pm uninstall -k --user 0 com.huawei.android.launcher
```

これにより，デフォルトランチャーを無効にできる&タスク一覧のUIがEMUI8.0.0のものに戻る（縦形のやつから横形のやつになる）

※PCにはADBをインストールして，端末は開発者向けオプションからUSBデバッグをオンにして，adb devicesでオンラインになってることを確認すること．Huwaei端末はここらへんの挙動が特に怪しい

####2.(ジェスチャーナビゲーションを使っている場合)Fluid Navigation Gesturesを入れる
Google Playより[Fluid Navigation Gestures](https://play.google.com/store/apps/details?id=com.fb.fluid)を入れる
（権限とか設定方法とかはアプリに従ってやればいい）

デフォルトランチャーを消すと，ジェスチャーナビゲーションでホーム画面&タスク一覧画面が出せなくなるので別のジェスチャーアプリで代用する必要があるため
デフォルトのジェスチャーもラップしてくれるみたいなので推奨

『3つのキーによるナビゲーション』の場合そのまま動く

####補足
adb shellで消したやつは，

```shell
adb shell cmd package install-existing com.huawei.android.launcher
```

で戻すことができる
EMUI10以降ではHuwaeiホームがないと表示されなくなる報告（前述のフォーラム）もあるようなので一応
[こっちのやり方](](https://www.reddit.com/r/Huawei/comments/ebwibe/recent_apps_disappeared_after_android_10_update/))でも戻せる

##考察とか（読まなくていい）
EMUI8.0.0⇒9.0.0更新時に，バックグラウンドタスク一覧のUIが変化&ジェスチャーナビゲーションに対応したが，Huwaeiホーム以外動作が不安定みたいで，マルチウィンドウ起動時にHuwaeiホームが呼び出される仕様
なので今回みたいにでデフォルトランチャーを変えるとバグるっぽい

なおデフォルトランチャーでもタスク一覧画面を表示させようとしても反応しなくなるバグがあったので，そもそもちゃんとマルチウィンドウとかジェスチャーナビゲーションに対応してない気がする...

というより日本語の情報がなかった時点で日本市場のHuawei端末って絶滅危惧種なのでは...？
シンプルなReact用JSONエディター

この記事で作っていたJSON Editorを（だいぶ整えて）npmに公開しました。
[Reactでデバッグに使う用のテキストエディタを作った](https://qiita.com/nariakiiwatani/items/f24925098335953c67d9)

npm: https://www.npmjs.com/package/react-plain-json-editor
GitHub: https://github.com/nariakiiwatani/react-plain-json-editor

※npmへの公開にあたってはこちらの記事を大いに参考にさせていただきました。
[初めてのnpm パッケージ公開](https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2)

## インストール

`npm i react-plain-json-editor`

もしくは

`yarn add react-plain-json-editor`

# できること

Component(`<PlainJsonEditor />`)とhooks(`useJsonEditor`)のどちらでも使用可能。
基本的にはコンポーネント版の方が高機能（コンポーネント版は中でhook版を使用している）

大雑把に言えば、teaxtarea要素に打ち込んだテキストがJSONにパースした結果を何かに利用するためのライブラリということになる。

使い方はGitHubのreadmeもしくはデモページを参照。
このデモページでは入力されたJSONデータをそのままそのページ自体のCSS Propertiesとして使用している。
[デモページ](https://nariakiiwatani.github.io/react-plain-json-editor/)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Reactでシンプル(by Plain Text)なJSON Editorを作ったデモ。<br>入力された文字列をそのページ自体のCSS Propertiesとして使用している。<a href="https://t.co/lLXlXGmCzO">https://t.co/lLXlXGmCzO</a><a href="https://t.co/pYLba2zmTS">https://t.co/pYLba2zmTS</a><a href="https://twitter.com/hashtag/react?src=hash&amp;ref_src=twsrc%5Etfw">#react</a> <a href="https://twitter.com/hashtag/react?src=hash&amp;ref_src=twsrc%5Etfw">#react</a>-hooks <a href="https://twitter.com/hashtag/jsoneditor?src=hash&amp;ref_src=twsrc%5Etfw">#jsoneditor</a> <a href="https://twitter.com/hashtag/json?src=hash&amp;ref_src=twsrc%5Etfw">#json</a> <a href="https://twitter.com/hashtag/npm?src=hash&amp;ref_src=twsrc%5Etfw">#npm</a> <a href="https://t.co/mOIawqyiTi">pic.twitter.com/mOIawqyiTi</a></p>&mdash; 岩谷成晃 (@nariakiiwatani) <a href="https://twitter.com/nariakiiwatani/status/1292824028332224515?ref_src=twsrc%5Etfw">August 10, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

他にも、独自のデータ構造を持ったprops受けるコンポーネントへのテストデータの生成や
単にJSON文字列のバリデータとしてなど、使い道はいくつかありそう。
【Google HTML  CSSスタイルガイド】を初めて読んだので、一言で分かるようにまとめてみた -基本・HTML編-

# どうも7noteです。フロントエンジニア4年目です。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/technique/styleguide_html/
AWS IoT CoreのShadowをPHPのSDKを用いて取得

AWS IoT CoreのShadowはIotDataPlaneClientのGetThingShadow()で取得できます。

公式サイトには以下サンプルが記載されています。
https://docs.aws.amazon.com/ja_jp/aws-sdk-php/v3/api/api-data.iot-2015-05-28.html#getthingshadow

```php
$result = $client->getThingShadow([
    'shadowName' => '<string>',
    'thingName'  => '<string>', // REQUIRED
]);
```

しかし、$clientのオブジェクトの生成方法が書いていない。。。

$clientのオブジェクト生成方法は以下です。

```php
        $client = new IotDataPlaneClient(
            array(
                'version'  => 'latest',
                'region'   => 'ap-northeast-1',
                'endpoint' => 'https://xxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com'
            )
        );
```

以上
深層学習とかでのTensorflowエラー「ImportError: DLL load failed: 指定されたモジュールが見つかりません。 」への対処

#目的
tensorflowの関連で以下のエラーが出ることがある。

```
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

もう少し手前から示すと、以下のようなエラー。

```
ImportError: Traceback (most recent call last):
  File "C:\Users\XYZZZ\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 64, in <module>
    from tensorflow.python._pywrap_tensorflow_internal import *
ImportError: DLL load failed: 指定されたモジュールが見つかりません。
```

対処方法を示す。

#対処
## 前提
エラーが出たときのtensorflowのバージョンは以下。

```
tensorflow               2.3.0
```
個別の問題ではないので、直接は関係ないが、エラーが出たのは、
以下のgithubのコードを実行した場合（XLNET関連）。
https://github.com/zihangdai/xlnet

##具体的な対処
（経験的にtensorflowのバージョンの問題のような気がしたので。。。）


以下のコマンドで、tensorflowのバージョンを2より小さくした。

```
python -m pip install "tensorflow<2.0.0"
```


上記のコマンドで、tensorflowのバージョンは、

```
tensorflow               1.15.3
```

になった。

以下のPYPIをみると、
https://pypi.org/project/tensorflow/#history
2.0.0より小さいバージョンは、1.15.3になっているので、通常、こうなるのだろう。

（引用：PYPIの上記URLの画面）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/e1053d6b-2385-a8a9-073c-b694d339f561.png)

⇒　**エラーは、無事消えた。**

#補足
* 環境を分けて、複数のバージョンをインストールすることができるのだろうけども、昔、それを実行して、嫌な感じになったので、最近は、後先考えずに、バージョンを変更している。当然、tensorflowが2以上でないと動作しないものもあるので、
それを実行する場合は、バージョンを上げる（頻繁に作業されている方は、さすがに、このやり方は、まずいかも。。。。）
* もしかすると、今回のエラーは、2.3より少しバージョンを下げるだけでも良かったのかもしれないが、この場合は、たぶん、これで正解。別途、また、確認します。

#まとめ
コメントなどあればお願いします。:candy:
[Oracle Cloud] Oracle SQL Developer で Autonomous Database に接続

# はじめに

Oracle SQL Developer を使って、Autonomous Database に接続する手順を紹介します。単純に接続して SQL を発行する程度だったら、Service Console 画面に有る Web 版の SQL Developer Web の方がシンプルです。ではなぜ、Oracle SQL Developer を使って接続するかというと、Oracle SQL Developer には AWR SQL Report を初め、基本機能で提供されていないものが利用できます。Deep な作業をしていく際には、Oracle SQL Developer の方が便利だと思います(個人的な意見)

では、接続方法をシンプルに紹介していきます。



# Oracle SQL Developer で Autonomous Database に接続

Autonomous Database の詳細画面で、DB Connection を選択します

![1597065519236.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/f7a2f69e-124e-38f1-140e-cb0bb0cce55b.png)



Download Wallet を選択して、Wallet File をダウンロードします

![1597065643511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/cf73e874-cfd9-859a-73c5-376559853931.png)



Autonomous Database を作成した時に指定したパスワードを入れて、Download します。

![1597065667187.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/53f84f76-88a7-5f77-0514-ac11788814fe.png)



Oracle SQL Developer で New Connection を選択します

![1597029304960.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/c5ea9ed9-ba67-f5d0-2a2a-f2992b197991.png)



各種パラメータを入力して、Test を押します。左下に[Status : Success] の表示を確認したのちに、Save を押して保存します。その後、Connect で接続を行います

![1597066323982.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/2cb9ac67-ac50-4b84-3266-8dabc9ceb7f1.png)



無事接続されているか確認するために、SQLを実行します

```
SELECT TO_CHAR (SYSDATE, 'MM-DD-YYYY HH24:MI:SS') "NOW" FROM DUAL;
```



正常に Response が返ってきて、接続出来たことがわかりました。

![1597067455920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/d4f36604-c633-f475-387e-b659af9e0cb4.png)



# 参考URL

https://itport.cloud/?p=46

https://technology.amis.nl/2019/10/07/connect-local-sql-developer-to-oracle-cloud-autonomous-database-always-free-tier/
ドメインの参加方法

中々忘れがちになっていることだったのでメモ的な意味で投稿

ドメインの設定を触れるのは、コントロールパネルから
「システムとセキュリティ」
　　　↓
「システム」
　　　↓
「コンピューター名、ドメインおよびワークグループの設定」
　　　↓
「設定の変更」
ここから詳細の画面へ行けます。


管理者権限が必要なので、必要ならコンピューターの管理から「Administrators」に権限を追加しておくこと。


システムのプロパティ画面で「コンピューター名」のタブ。
その中でコンピューターの名前を変更する項目があり、
クリックするとようやくドメインをいじれる画面に来ます。

基本的にワークグループにラジオボタンがあり、「WORKGROUP」と記載されていると思います。

ここを所属するドメイン名に変更する。
もちろん変更するためにそのドメインが使われている回線につなげておくこと。

変更完了したらそのドメインでログインできることを確認したらOK
BigQueryでテーブル結合(Join)した上でDELETE文を実行したい時の対応方法

# はじめに
皆様、こんにちは！
佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです。

私は現在、携わっているRailsアプリケーションの一部でBigQuery(以下：BQ)を用いており、データ管理を行っています。
先日、BQのDELETE文実行時に別テーブルと結合した上で抽出したデータを削除したいというケースが出てきました。
その際に調べたことをまとめました。

# BQでのDELETE文の仕様
BQの公式ドキュメントにあるようにDELETE文内で結合することはできません。
公式ドキュメント：
https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax?hl=ja#delete_statement

つまり、MySQLのような下記のSQLは発行できません。

```sql
DELETE table_a
FROM 
  table_A AS table_a
INNER JOIN 
  table_B AS table_b
ON
  table_a.id = table_b.table_a_id
WHERE 1=1
AND table_b.type = 'XXXXX';
```

しかし、今回は別テーブルのカラムを条件として削除したいため、結合する必要がありました。

# BQのDELETE文で結合したい時の解決方法①：EXISTS句を使用する
解決策の1つ目がEXISTS句を使用することです。
(NOT EXISTS句の場合も同様です。)
先程のSQLと同じことをBQで行おうとすると下記のようになります。

```sql
DELETE table_a
FROM table_A AS table_a
WHERE 1=1
AND EXISTS
(
SELECT
 1
FROM
 table_B AS table_b
WHERE 1=1
AND table_a.id = table_b.table_a_id
AND table_b.type = 'XXXXX'
)
```

もし冗長に書こうと思うとこう書けます。
(冗長に書く必要はないですが、わかりやすく書くとこんなことしていますという意図です。)

```sql
DELETE table_a
FROM table_A AS table_a
WHERE 1=1
AND EXISTS
(
SELECT
 1
FROM
 table_A AS table_a_2
INNER JOIN
 table_B AS table_b
ON
AND table_a_2.id = table_b.table_a_id
AND table_b.type = 'XXXXX'
WHERE 1=1
AND table_a_2.id = table_a.id
)
```

# BQのDELETE文で結合したい時の解決方法②：WHERE句でサブクエリを使用する
解決策の2つ目がWHERE句内でサブクエリを使用することです。
最初のSQLは下記のように書くことができます。

```sql
DELETE table_a
FROM table_A AS table_a
WHERE 1=1
AND table_a.id = 
(
SELECT
 table_b.table_a_id
FROM
 table_B AS table_b
WHERE 1=1
AND table_b.type = 'XXXXX'
)
```

ただ、こちらの方法だと`table_B`をtypeで絞った結果を求めてから、その集合と`table_A`と結合という形になります。
そのため、もし`table_B`全体が15万件ありtypeで絞っただけの結果が10万件・結合によって1000件程度になるといった、検索条件での絞り込みで件数がそこまで絞られない場合は性能的にEXISTS句を使用した方が速いです。
EXISTS句の場合は結合→絞り込みの順番になるので、結合によって`table_B`のデータが大幅に絞られた後に、typeという検索条件で絞られるためです。

# おわりに
BQのStandardSQLは通常のRDBと同様の構文でほぼ同じ事ができますが、随所で異なる部分があります。
そのため、各BDの特徴をしっかり捉えて、システム構築することを心掛けて行きたいです。
python jupyter notebook へのスニペット設定

# スニペットとは
- 使用頻度の高いコード、定型的なクラス宣言等を、簡単に入力できるようにしたもの。
- 単純な入力や、ループ作業がごく少ない入力で済むため効率的。
- Extensionとして提携のものを導入する、自分で作成するの2パターンがある

※ ちなみに。
>スニペットとは、一般的には「切れ端」「断片」という意味の英語である。 IT用語としては、プログラミング言語の中で簡単に切り貼りして再利用できる部分のこと。

---

# ターミナルで拡張機能のDL、インストール
### 1. コマンドプロンプト等で拡張機能をダウンロード

```terminal:pip
pip install jupyter_contrib_nbextensions
```
### 2. 上記DLが成功したら、以下のコードで拡張機能をインストール
```terminal
jupyter contrib nbextension install --user
```
### 3. Jupyter notebookの起動（再起動）
```terminal
jupyter notebook
```
### 4.Nbextensionsタブの設定
デフォルトでは以下のチェックがついているが、これを解除する。
>disable configuration for nbextensions without explicit compatibility
>(they may break your notebook environment, but can be useful to show for nbextension development)

**Extensonの設定で以下を選択する。**

- Nbextensions dashboard tab(必須;Extensionsのタブ表示)
- Snippets (オリジナルのスニペット作成・活用可能)
- Snippets Menu(スニペットを利用)
- ExecuteTime(セルごとの実行時間を表示)


# 参考URL
[@_snow_narcissusさんのエントリ;オリジナルスニペットの登録方法も説明されている](https://qiita.com/_snow_narcissus/items/647a6d3cec0a9bdb8980)


[よちよちpythonさんのエントリ](https://chayarokurokuro.hatenablog.com/entry/2019/11/02/015051#JupyterNotebook%E3%81%A7%E3%82%B9%E3%83%8B%E3%83%9A%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
Jupyter Lab環境構築

# インストール

```bash:
conda install -c conda-forge jupyterlab
```

# 拡張機能をつかう

Node.jsがないと動かない->以下を参考に入れました。
https://qiita.com/Hide-Zaemon/items/cbb4497237843a729994

## インストールした機能
こちらの方々のお勧めも参考にしました。
https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c
https://qiita.com/canonrock16/items/d166c93087a4aafd2db4
https://www.forcia.com/blog/001172.html

- `@jupyterlab/toc` markdownの目次を自動表示してくれる
- `@jupyterlab/git`
- `@jupyterlab/juptext`
- `@lckr/jupyterlab_variableinspector` 変数のなかみをprintしなくても表示してくれる
- nbdime-jupyterlab
- @jupyterlab/shortcutui

# 便利機能
ドラッグすると画面が分割できる！すごい！
https://cyberagent.ai/blog/research/10260/

## ターミナルのフォント&背景変更
デフォルトがあまりにもださい。
**Advanced Settings Editor**でUser Preferencesを変更。

```json:
{
    "fontFamily": "Monaco",

    // Theme
    // The theme for the terminal.
    "theme": "dark"
}
ROS2 勉強会 #1 環境セットアップ

## Step1 Ubuntuを立ち上げる


### Step1-1 Virtual BoxにUbuntuをインストール

WindowsにVirtual BoxをUbuntuをインストールします。
次の記事に従ってセットアップを行ってください。

[Windows10にVirtualBoxとUbuntuをインストール](https://qiita.com/pyon_kiti_jp/items/0be8ac17439abf418e48)

### Step1-2 Ubuntuの環境をupdate & upgradeする

ターミナルを立ち上げて(ctl + alt + t), ubuntuの環境を更新します

```bash
$ sudo apt update
$ sudo apt upgrade
```

### Step1-3 画面サイズを変更する
VirtualBoxにインストールしたUbuntuの画面サイズは640×480になっています。
このままでは不便なので、画面サイズを1980x1260などにしておくと使いやすいです。
設定→デバイス→ディスプレイ→解像度にて変更ができます。
<img width="600" alt="スクリーンショット 2020-08-10 16.34.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239786/302eba72-014f-a3b9-c159-caab16e9934c.png">

### Step1-4 ホームディレクトリの中身を英語にする
Ubuntuで日本語を選択すると、ホームディレクトリに日本語のディレクトリが作られます。
CLIを利用する際に、日本語のディレクトリでは操作が不便のため、英語表記に変更します。

[Ubuntuでホームディレクトリの中身を英語にする](https://qiita.com/taiko19xx/items/d1a001bfc25245b91354)

### Step1-5 VirtualBox上ゲストOSにssh接続設定
VirtualBox上OSで作業すると、ホストOSとの画面の切り替えがめんどくさかったり、ゲストOS内でブラウザの処理が遅かったり、手間が多いです。そこで、VirtualBoxからはバックグラウンドでOSを立ち上げ、sshでゲストOSに接続できるようにします。

[[VirtualBox] Windowsから、UbuntuにSSH接続する方法]
(https://qiita.com/Gotcha/items/e82eb6c2d4d289e5bcd1)
[Virtualbox上のubuntuにssh接続する](https://qiita.com/morinco/items/9a9f47f87a6dc405cfee)

### Step1-6 関係ライブラリをインストール

- Git
- Vim


## Step2 ROS2インストール

ROS2が動かせるようにセットアップしていきます。

### Step2-1 パッケージのリポジトリを設定

リポジトリのGPG鍵を許可する

```bash
$ sudo apt update
$ sudo apt install curl gnupg2 lsb-release
$ curl http://repo.ros2.org/repos.key | sudo apt-key add 
```

リポジトリからパッケージを受容するように下記の実行でリポジトリを登録

```bash
$ sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list'
```

### Step2-2 ROS2パッケージをインストール

```bash
$ export CHOOSE_ROS_DISTRO=dashing
$ sudo apt update
$ sudo apt install ros-${CHOOSE_ROS_DISTRO}-desktop
```

### Step2-3 Colton buildインストール

```bash
$ sudo apt install python3-colcon-common-extensions
```

### Step2-4 ROS2コマンドの補完を設定

```bash
$ sudo apt install python3-argcomplete
```

### Step2-5 環境変数を設定する

```bash
$ echo "source /opt/ros/${CHOOSE_ROS_DISTRO}/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```


### Step2-6 ワークスペースの設定

```bash
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
$ colcon build
$ echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
```

### Step2-7 動作テスト
１つ目ののターミナルで１秒毎にメッセージがPublish(送信)されます。

```bash:Terminal1
$ ros2 run demo_nodes_cpp talker

[INFO] [talker]: Publishing: 'Hello World: 1'
[INFO] [talker]: Publishing: 'Hello World: 2'
```

２つ目のターミナルで１秒毎にメッセージがsubscribe(受信)されます。

```bash
$ ros2 run demo_nodes_cpp listener

[INFO] [listener]: I heard: [Hello World: 1]
[INFO] [listener]: I heard: [Hello World: 2]
```

[Ubuntu LinuxでROS 2のインストール](https://gbiggs.github.io/rosjp_ros2_intro/computer_prep_linux.html)
[Ubuntu 18.04にROS2 Dashingをインストール](https://qiita.com/k-koh/items/838c70004119c329c617)
Status barを透明にする方法

直近の案件でStatus Bar部分にもコンテンツを表示したいという要件が合った際に使用したコードを、自分への備忘録も兼ねて記載します。

# 実装方法
XMLではなくコードから指定します。

```
// このコードでStatus Barを非表示にし、レイアウトを全画面に表示する
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

// レイアウトの上部にStatus Barの高さの分Paddingを入れることで、Status Barの領域を再確保
findViewById<View>(R.id.root).setPadding(0, getStatusBarHeight(), 0, 0)

// Status Barの部分を透明に塗りつぶす
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
window.statusBarColor = Color.TRANSPARENT

// Status Barに表示されるアイコンが見えるよう調節する
var systemUiVisibility = window.decorView.systemUiVisibilitysystemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
window.decorView.systemUiVisibility = systemUiVisibility
```
ROS2 tutorialsのmemo

ROS2のtutorialsで誤記が散見されてるらしいので(official Git pull requestより)ここにmemo

##Building an Action
````
# Source our workspace
# On Windows: call install/setup.bat
. install/setup.bash
# Check that our action definition exists
ros2 interface show action_tutorials/action/Fibonacci
````



正しくは最終行は下記

````
ros2 action show tutorials/action/Fibonacci
````
list-style-type: 🥺

## list-style-typeとは

リスト項目要素のマーカーのことですね。

- 👈これとか
  - 👈これとか

`hiragana-iroha`や`cjk-earthly-branch`など、使い所があまりないけれど、知識としては面白いプロパティもあるので、ドキュメントを読んでみることをオススメします。

[MDN list-style-type](https://developer.mozilla.org/ja/docs/Web/CSS/list-style-type)


## 🥺が出るようにしたい
さて、本題ですが、`list-style-type`は規定値として`disc`が設定されています。
そのため、デフォルトのスタイルでは`●`がでることでしょう。

これを🥺に変えるには、値に`Unicode`を設定します。

🥺は`U+1F97A`のため、次のようにします。

```HTML:HTML
<ul>
  <li>ぴえん</li>
  <li>ぴえん</li>
</ul>
```
```CSS:CSS
ul {
  list-style-type: "\1F97A";
}
```

これで🥺を`list-style-type`で使うことができます。

ちなみに💩は`U+1F4A9`ですので、💩を出したいは次のようにします。

```CSS:CSS
ul {
  list-style-type: "\1F4A9";
}
```

また、HTML上で🥺や💩を文字として使いたい場合は、`数値文字参照`を使うことでデバイス間による文字化けを防ぐことができます。

```HTML:HTML
<!--ぴえん-->
<p>&#x1f97a;</p>
<!--うんち-->
<p>&#x1f4a9;</p>
```

## 参照

絵文字のUnicodeと数値文字参照がまとめられていて、分かりやすかったです。
[https://lets-emoji.com/](https://lets-emoji.com/emojilist/emojilist-1/)
Julia で時系列データをリアルタイム（お気持ち程度）に描画する

# はじめに

実験やデモをしたい時，取得した信号をその場で可視化したいニーズがあると思います．
例えば Arduino IDE のシリアルプロッタなど，いい感じの描画ソフトウェアが既にあります．
今回は csv ファイルで保存した時系列データを描画したかったので，簡単なスクリプトを作りました．

タイトルに「お気持ち程度」と断りを入れたのは，
「デッドタイムを超えないことを保証する」リアルタイム性は全く考慮していないためです．

~~でも，こういう用途のスクリプトを調べようとすると，結局「リアルタイム 描画」で検索しますよね~~

# 出来たもの


![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528369/2868b6e0-051d-d371-b508-f1e372575610.gif)


## 試した環境

Mac book 上の Ubuntu 20.04 (Virtual Box) + Julia 1.41

## こだわったところ

+ プロット点が一定数を超えても描画し続ける
+ プロット点の移動に合わせて x 軸（時刻）も動く


## 描画スクリプト

+ 適宜必要なパッケージを Pkg.add() してください．
+ 利用環境で qt5 のインストールが必要です．

```Julia:SignalPlot.jl

using Plots
using CSV

gr(show = true)

function main()

    # graph setting
    Title = "time-series data"
    Label = "random data"
    XLabel = "time (s)"
    YLabel = "number"
    # sampling time
    dt = 0.1
    # graph width(number of plotting point)
    width = 100
    # declear x, y
    x = dt:dt:dt*width
    y = zeros(width,1)
    x_offset = 0

    for i in 1:500
        data = CSV.read("tmp.csv",header=false)
        datalen = length(data.Column1)
        if datalen <= width
            y[1:datalen] = data.Column1
        else
            y = data.Column1[end-(width-1):end]
            x_offset = dt*(datalen-width)
        end
        display(plot(x + x_offset*ones(width,1),y,title = Title,label = Label,xlabel=XLabel,ylabel=YLabel))
    end
end

```

## おまけ：デモに用いた乱数生成スクリプト

上記描画スクリプトの実行前にバッググラウンド実行してください．
100 以下の整数がサンプリング周期 0.1 秒ごとに csv ファイルに保存されます．

```shell:GenerateSignal.sh

#! /bin/bash
FILE=tmp.csv

if [ -e $FILE ]; then
	rm $FILE
fi

while true
do
	echo $(($(od -vAn -N1 -tu < /dev/urandom) % 101 )) >> $FILE
	sleep 0.1s
done

```

# おわりに

+ 仮想マシン上でも描画速度は良好で満足しています．
+ csv ファイルで時系列データを保存できる機器，アプリケーションに大体適用できそうです．
+ 描画処理を無限ループにしても良いですが，強制終了できないためお勧めしません．
+ 大規模データを扱いたい or より高速に描画したい場合は，
時系列データをバイナリファイルとして扱うと良いかと思います．

# 参考

+ [CSV Tutorial](https://juliadata.github.io/CSV.jl/stable/)
+ [Plots Tutorial](https://docs.juliaplots.org/latest/tutorial/)
+ [グラフの描画方法](https://stackoverflow.com/questions/44281135/real-time-plotting-with-julia)(stack overflow)
+ [乱数の生成方法](https://orebibou.com/ja/home/201702/20170224_001/)(俺的備忘録 様)
SDカードの容量や書き込みスピードを測るソフト

Windowsだと結構いろいろとあるのですが、linuxではCapacityTesterというソフトがあるので使ってみました。

CapacityTester
GitHub - c0xc/CapacityTester
https://github.com/c0xc/CapacityTester

インストール方法

~~~~
sudo apt update ;
sudo apt upgrade -y ;
~~~~

qt5のインストール

~~~~
sudo apt install -y qtbase5-dev qttools5-dev-tools qt5-default ;
~~~~

ソフトのインストールと起動

~~~~
cd ;
wget https://github.com/c0xc/CapacityTester/files/120941/CapacityTester_Debian7.tar.gz ;
tar xvf CapacityTester_Debian7.tar.gz ;
cd bin ;
./CapacityTester ;
~~~~

SDカードがフォーマットされて、マウントされている必要があります。この辺が面倒かなと

最近は海外のSDカードが簡単に手に入るので、一度試してみて容量や速度に問題がないかチェックしてみると良いでしょう。
ArduinoにおけるATtiny1616とATtiny1617のボードタイプは何だろう？

### ATtiny1616 , ATtiny1617 のボードタイプは？

ArduinoでCPUによって、コンパイル条件を変更する時に、#if defined 〜 #endif文を使用して

```c++
  #if defined(__AVR_MEGA__)
    Serial.println("MEGA");
  #endif
```

と記述します。
ATtiny1616 , ATtiny1617　のボードタイプは何になるのかなと調べてみました。

###結果
ATtiny1617は、

```c++
  #if defined(__AVR_ATtinyxy7__)
    Serial.println("hello ATtiny1617");
  #else
    Serial.println("etc");
  #endif
```
で行けます。

追加情報として、これも真になってしまい、ATmega系と同じ扱いされてしまいます。分けたいときはパッチが必要です。

```c++
  #if defined(__AVR_MEGA__)
    Serial.println("MEGA");
  #endif
```
ATtiny1616は、

```c++
  #if defined(__AVR_ATtinyxy6__)
    Serial.println("hello ATtiny1616");
  #else
    Serial.println("etc");
  #endif
```
###ネット情報より１
https://gcc.gnu.org/onlinedocs/gcc-8.3.0/gcc/AVR-Options.html#AVR-Built-in-Macros
が役に立ちました。

____AVR_Device____
設定 -mmcu = デバイスデバイスの名前を反映するこの組み込みマクロを定義します。例えば、-mmcu = atmega8内蔵マクロ定義__AVR_ATmega8__、-mmcu = attiny261a定義 __AVR_ATtiny261A__など

組み込みマクロの名前は、AVRユーザーマニュアルにあるように、Deviceがデバイス名であるスキームに従います。差 デバイス組み込みマクロでデバイスに __AVR_Device__-mmcu = デバイス 後者は常に小文字です。

場合は、デバイスは、デバイスが、 'のような唯一のコアアーキテクチャではありませんavr51'、このマクロは定義されていません。

![スクリーンショット 2020-08-10 21.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/ff213849-e0fb-d25c-26fc-7761a814a974.png)

-mmcu=aattiny1617 ってありますね。でもうまくいきませんでした。

```c++
  #if defined(__attiny1617__)  
    Serial.println("ATtiny1617");
  #else
```
ATtiny1617がシリアルに出力されません。

###ネット情報より2
https://stackoverrun.com/ja/q/3740654
![スクリーンショット 2020-08-10 22.03.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111210/f239c08d-c24b-885c-dc60-ce9077352f4d.png)

MegaTinyCore系のファイルが入っているフォルダに定義ファイルとかのヒントがありそう。
railsでページをリロードしないとJSが機能しない件

タイトル通りJSのイベントが起きるためにリロードが必要な状況を改善したい。

検索すると以下の参考記事があったので、素直にgemfileとapprication.jsを変更し対応しようとしたがうまくいかない。
https://qiita.com/Terunaga/items/19d4f49f3abd3316f098

別の記事で以下のようにjsのリロードが必要なページに追記することで解決できた。
http://taremimi.hatenablog.jp/entry/2018/06/06/085030

```<body data-turbolinks="false">```
画像処理プログラミング環境

#出来るようになること
- 様々な画像処理が使えるようになる。
 - 画像の拡張子を自由に変えられる
 - リサイズ
 - モザイク
- RAW画像を変換
 - pgm画像
 - ppm画像
- Exif情報を取得できる

ubuntuがインストールされている前提で説明を進める。

#VcXsrv
Linux環境でGUIを使用したい場合に必要。以下で紹介するImage MagicでDisplayを使用する際にも必要なる。
①インスト―ル
[インストール先](https://sourceforge.net/projects/vcxsrv/)

②設定の保存
XLaunchを起動してSave Configurationで設定を保存する。

#Image Magic
①インストール
sudo apt install imagemagic-6.q16


②環境変数の設定
ubuntuのホームディレクトリはデフォルトでは以下のパスになっている。
C:\Users\UserName\AppData\PackageCanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home
このフォルダ内にある.bashrcの最終行にexport DISPLAY=localhost:0.0と書き加える。

③ファイルを再読み込み
source .bashrcでファイルを読み込ませる。

④起動する
コマンドラインでdisplayを入力すると起動できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680528/57f8a1bc-8d63-a28d-7467-b155ce4662f0.png)

⑤便利なコマンド
[日本語マニュアル](https://imagemagick.biz/)

|  内容  |  コマンド  |
| ---- | ---- |
|  画像の拡張子の変更  |  convert ファイル名.拡張子(png/bmp/gif/jpeg) 新ファイル名.拡張子|
|  画像の表示  | dispaly ファイル名.拡張子  |
| リサイズ  | convert before.jpg -resize 100×100 after.jpg |

#Exiftool
画像のExif情報を取得することができる。
Exif(エグジフ/イグジフ)：写真用のメタデータ。データのデータ情報。使用されたカメラ、レンズ、絞り、シャッター速度、ホワイトバランス情報などが載っている。

①インストール
sudo apt install libimage-exiftool-perl

②コマンド
exiftool ファイル名.jpg(拡張子)

#Dcraw
①インストール
sudo apt install dcraw

②RAW画像の変換

|  内容  |  コマンド  |
| ---- | ---- |
|  ppm画像に変換  |  dcraw ファイル名.ARW|
| pgm画像に変換  | dcraw -D -4 ファイル名.ARW  |
【HTML】シンプルな申し込みフォームを作った

HTMLやCSSを勉強として、シンプルな申し込みフォームを作りました。
どんなフォームをどのように作ったかを簡潔にまとめました。

# 成果物
<img width="975" alt="スクリーンショット 2020-08-10 21.37.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/92998f4b-4d8b-e531-afca-2c78e180d128.png">

作ったものはこんな感じ。
会員制サイトにありそうなシンプルな申し込みフォームを作りました。

# HTML
```
<div class="content">
   <h1>入会申し込み</h1>
   <p>入会するには、次のフォームに必要事項をご記入ください。</p>
   <div class="controll">
      <label for="myemail">メールアドレス <span class="required">必須</span></label>
      <input id="myemail" type="email" name="email">
   </div>
   <div class="controll">
      <label for="mypassword">パスワード <span class="required">必須</span></label>
      <input id="mypassword" type="password" name="password">
   </div>
   <div class="controll">
      <button type="submit">登録する</button>
   </div>
</div>
```
フォームのタイトルはh1タグで、タイトル直下の注釈をpタグで出力。
フォームの送信項目であるメールアドレスとパスワードはinputで出力して、
buttonタグがクリックされた時に、inputタグの入力値が送信される想定。

でもフォームって言うからにはformタグを使った方が良かったなぁ・・・
formタグで書き換えたやつがこんな感じ↓↓

```
<form class="content">
   <h1>入会申し込み</h1>
   <p>入会するには、次のフォームに必要事項をご記入ください。</p>
   <div class="controll">
      <label for="myemail">メールアドレス <span class="required">必須</span></label>
      <input id="myemail" type="email" name="email">
   </div>
   <div class="controll">
      <label for="mypassword">パスワード <span class="required">必須</span></label>
      <input id="mypassword" type="password" name="password">
   </div>
   <div class="controll">
      <input class="submit" type="submit" value="登録する">
   </div>
</form>
```

全体を囲っていたdivタグがformタグになって、「登録する」ボタンのタグがinputタグになる感じですね。
本来であればformタグには送信先等を定義してあげます。


# CSS
個人的にcssは苦手です。
まだお洒落なアニメーションを作るなんてことはできませんが、とにかくシンプルな見た目にすること意識しました。

```
.submit {
    width:100%;
    background-color: #2096f3;
    color:#fff;
    padding:15px;
    border: 0;
    border-radius:5px;
    box-shadow: 0 0 8px rgba(0,0,0,.4);

}

.required {
    color:#f33;
    font-size: .9em;
    padding: 3px;
    background-color: #fee;
    font-weight: bold;
}
```
要点だけ。

「.submit」では「登録する」ボタンのデザインを当てています。
色とか枠はいいとして、box-shadowの各設定値は注意です。
x軸、y軸、影の濃さ、影の色（r,g,b,不透明度）をそれぞれ設定します。

# まとめ
今回は簡単な申し込みフォームを作りました。
cssの色付けで原色は使わない方が良さそうですね。
色使いなんかはこれから色々と作っていく中で学んでいきます。

応用としてフォームの送信先を作成して、DBに送信内容を登録して、、、なんてところまで作れるようになると良さそう。



### 参考
[[HTML/CSS/JavaScript] フロントエンドエンジニアになりたい人の Webプログラミング入門
](https://www.udemy.com/course/html-css-js/)
Python初心者によるDjango超入門！その２ テンプレートの便利な機能を使ってみた

# 本記事について
UdemyでDjangoについて学習した結果のアウトプットページです。
<a href=https://qiita.com/sw1394/items/78ee99c203165173c87f>前の記事</a>の続きになります。
今回は、Djangoの機能の1つであるrenderを使ってみようと思います。

# urls.py
ulrs.pyは前回と同じです。

```first\myapp\urls.py
from django.urls import path
from . import views

app_name = 'myapp'

urlpatterns = [
    path('', views.index, name='index'),
]
```

# views.py
views.pyを以下のように変更します。

```first\myapp\views.py
from django.shortcuts import render

def index(request):
    context = {
        'names':['鈴木','佐藤','高橋'],
        'message':'こんにちは。',
    }
    return render(request, 'myapp/index.html', context)
```

まず``from django.shortcuts import render``でrenderをインポートします。

つづいて、def indexを編集します。
def indexに、contextというdictionaryを追記します。
contextには、namesとmessageというKeyがあります。
namesには複数の値を登録しておきましょう。

最後に``return render(request, 'myapp/index.html', context)``でmyapp/index.htmlにcontextを渡します。
これで、myapp/index.htmlでcontextのKeyと値が利用できるようになります。

# テンプレートファイルの置き場所の設定
Djangoでは、テンプレートファイルの置き場所が決められています。

この辺がDjangoを学び始めだとかなり混乱するのですが、
結論から言いますと、myapp/index.htmlは以下の場所になります。
first\myapp\templates\myapp\index.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/e596100e-d7ab-f657-d608-2c69d390991d.png)

具体的に手順を追って説明します。
１．first\myappの下に、templatesというフォルダを作成します。
２．さらにその下にアプリ名と同じフォルダ(今回はmyapp)を作成します。
３．そのmyappフォルダにindex.htmlを作成します。
４．urls.pyでmyapp/index.htmlにアクセスがあると、このindex.htmlファイルにアクセスされます。
５．↓のようなルールで保存されると覚えると良いかもしれません。
　　<プロジェクト名>/<アプリ名>/templates/<アプリ名>

# index.html
index.htmlには以下のように記述します。

```first\myapp\templates\myapp\index.html
<p>{{ names.0 }}さん。{{ message }}</p>
<p>{{ names.1 }}さん。{{ message }}</p>
<p>{{ names.2 }}さん。{{ message }}</p>

<hr>

{% for name in names %}
    <p>{{ name }}さん。{{ message }}</p>
{% endfor %}
```

DjangoのHTMLファイルに書く記述はPythonと似ているようで微妙に記法が異なります。
変数は``{{ }}``で囲い、forなどのプログラム命令は``{% %}``で囲みます。
また、HTML内にはインデントという概念が無いため、forやifの終わりに``{% endfor %}``などで明示的と表現してあげる必要があります。
Pythonに慣れていると、かなり面倒に感じますが、慣れるしかありません。

最初の3行から解説します。

contextのnamesには、3つの値が登録されていました。
``names.0``とは、namesの1番目の値を引っ張ってくるという意味になります。
``names.1``は、namesの2番目の値です。
``message``は1つしか値が無いので、添字は不要です。

続いて、最後の3行について説明します。
``{% for name in names %}``でnamesから1つずつ値を取り出します。
この辺はPythonと表記が同じなので分かりやすいですね。
最後は``{% endfor %}``で閉じるのを忘れずに。

# 動作確認
開発用サーバーを、py manage.py runserverで起動して、index.htmlにアクセスしてみましょう。以下のように表示されていれば問題ありません。
上の3行が添字での値表示で、下3行がfor分による値表示になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242659/f79e8877-a3a8-9b7c-903a-fce9902adf49.png)


# 次回の記事
https://qiita.com/sw1394/items/4bc6349dd3a32938dcaf
WebREPLをコマンドラインから使う

#免責
この記事に従って発生した如何なる損害も筆者は負うことができません。ご免なさい。

#目的
MicroPythonの[WebREPL](http://micropython.org/webrepl/)は、ウェブブラウザから使うのが一般的です。
FBtermやxtermといった、コンソールからも使いたいので、とても便利な[uPydev](https://github.com/Carglglz/upydev)を導入しました。
詳しいことは、[こちら](https://github.com/Carglglz/upydev/blob/master/DOCS/Documentation.md)を読んでください。SSLにも対応しています。

#インストールの仕方
ほとんど、サイトの説明のままです。

```shell-session:upydevインストール
$ pip3 install --user --upgrade upydev
```

#接続先のアドレスとパスワードを設定する
これまた説明通りです。
<font color="Red">この方法だとパスワードはプレーンテキストで保存されるようなので注意。</font>

```shell-session:upydev設定
$ upydev config -t 192.168.XXX.XXX -p パスワード -g
```

#WebREPL(プロンプト)を使ってみる
プロンプトにつなぎます。切断するには<font color="Blue">CTRL-x</font>です。

```shell-session:webrepl接続
$ upydev wrepl
```

#WebREPL(ファイルアップロード)を使ってみる
ファイルをアップロードします。<font color="Blue">-rst f</font>を付けないと自動的にリブートします。

```shell-session:ファイルアップロード
$ upydev put -rst f -f hello.py
```

#アンインストールの仕方
削除の仕方です。

```shell-session:upydevインストール
$ pip3 uninstall upydev
```

#参考

###MicroPython WebREPL
http://micropython.org/webrepl/

###uPydev
https://github.com/Carglglz/upydev
vscodeでフラッターウィジェットを囲むショートカットキー

#vscodeでウィジェットを囲む
これめっちゃ便利です。

ウィジェットにカーソルを合わせて
`CMD + .`（MacOS）
`CTRL + .`（Windows）
<img width="328" alt="スクリーンショット 2020-08-09 23.47.01.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/30969485-83dd-54cc-e3b7-bbb4dfbe1580.jpeg">

恐らくだが、初期設定から何もいじっていなければこれでウィジェットを囲むショートカットになる！

#右クリックでもできる
<img width="349" alt="スクリーンショット 2020-08-10 21.35.37.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/69f56615-aabf-2b09-e992-df122beed928.jpeg">

`右クリック→Refactor`でもできる。
ラズパイ4B用Debian 11 Bullseyeの現状（ときどき更新）

Raspberry Pi 4B 用Debian (RaspbianやRaspberry Pi OSではない）のSDカードイメージは長らく存在せず[ブートできない事情説明](https://wiki.debian.org/RaspberryPi#Raspberry_Pi_4) があるだけであったが、ついに[ラズパイ4B用イメージ](https://raspi.debian.net/tested-images/) が出てきた。その現状は

* Youtubeの再生のスムーズさは Xfce4 ＞ Gnome Wayland ＞ weston の順番になっていて Wayland を使う意味は無い。これはラズパイに限らずインテルGPUを積んだ普通のノートパソコンでも同じであった。比較するときに、FirefoxはWayland を使うように `MOZ_ENABLE_WAYLAND=1', `GDK_BACKEND=wayland` の環境変数を設定して起動した（Xfce4以外）
* ~~[4K解像度を認識できない](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=968188)~~  `config.txt` に `hdmi_enable_4kp60=1` を書くことで 4K出力できることもある。Linux 5.10 の vc4.ko で4K出力できる。
* 無線LANのファームウェアである `firmware-brcm80211` のバージョンが201219以前だと2.4GHzとbluetoothが干渉し、20210207以降だと5GHzが使えない。この問題は `/lib/firmware/brcm/brcmfmac43455-sdio.bin` と `/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob` を https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm にあるものに置き換えると治る…
* DRI/DRM対応が、`drivers/gpu/drm/vc4.ko` のラズパイ対応により実現された。vc4.koを使うほうが使わない場合にくらべてYouTubeの再生がはるかにスムーズになる。
* 解像度やフレームレートが高いディスプレイをhdmiにつなぐと、無線と干渉して無線LAN経由で ping が通らなくなることがある。2.4GHzと5Ghzのどちらか通るほうを使う。vc4.koの読み込みを `module_blacklist=vc4` を `cmdline.txt` に書くことで阻止すれば5GHzが使える。`vc4.ko` を使う場合でも、この問題は `/lib/firmware/brcm/brcmfmac43455-sdio.bin` と `/lib/firmware/brcm/brcmfmac43455-sdio.clm_blob` を https://github.com/RPi-Distro/firmware-nonfree/tree/master/brcm にあるものに置き換えると治る…
* ~~vc4.koをロードと出てくるALSAデバイスにHDMI線がつながっていないのにアクセスするとカーネルが固まったりする。pulseaudioを入れると必要の無いALSAデバイスまですべてを頻繁にアクセスするため、`/etc/paulseaudio/default.pa` の中の `load-module module-udev-detect` と `load-module module-detect` をコメントアウトして、`load-module module-alsa-card device_id=数字` でpulseaudioで用いるALSAデバイスを明示的に指定する。「数字」のところは `cat /proc/asound/cards` で調べる。~~ この原因は、 `snd_bcm2835.ko` と `vc4.ko` が同時にHDMI音声出力をしようとするのが問題なので、別の解決法としてどちらかを `module_blacklist` すると解決する。
* Linux 5.9では可能だった[USBからの起動がLinux 5.10でできなくなっている](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=977694)。この症状は `reset-raspberrypi.ko` をinitramfsでロードすると治るため `reset-raspberrypi` を `/etc/initramfs-tools/modules` に追記してから `update-initramfs -u -k all` すればよい。 https://github.com/emojifreak/debian-rpi-image-script にあるスクリプトを用いるとUSB起動できるようにUSBにインストールしてくれる
* 上記スクリプトで作ったイメージファイルは https://drive.google.com/drive/folders/1-L5pT4tn7wfxp9urjnIDL2SvAbxO8Vl6 にある
* [`udisks2` がインストールされると`udev`が発狂してCPUを消費することがある](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=980980)ので、それが困る場合は `systemctl mask udisks2` とする。これはラズパイの問題ではなくてUSB MSDのほうの問題で、そこらへんのノートパソコンにUSBを指しても起こることがある
Firestoreのsetメソッド基本の使い方

# 1. addメソッドとは
- データベースに追加するときに使う
- firesroreのaddメソッドは自動でIDを採番してくれるので単純にデータを渡せば良い

```
const itemRef = db.collection('items')
const data = {
  name: name,
  price: parseInt(price, 10)
}

return itemRef.add(data)
  .then(() => {
    dispatch(push('/'))
})
```

# 2. setメソッドとは
- idを指定して登録できる
- 何も指定がないと自動で設定される（addと同じ）

```
return itemRef.doc().set(data)
```

- 事前に割り振られるIDを取得できる

```
const ref = itemRef.doc();
const id = ref.id;
data.id = id
return itemRef.doc(id).set(data)
```

- 変更部分のみmargeできる

```
return item.Ref.doc(id).set(data, {marge: true})
```
初期設定

##素早くcloud9で環境構築したいときの手順(自分用)

何か実験したい時などに新しく環境を構築する

```
$ gem install rails -v 5.1.6
```

```
rails _5.1.6_ new お好きな名前
```

gemfile

```
source 'https://rubygems.org'

gem 'rails',        '~> 5.1.6'
gem 'puma',         '~> 3.7'
gem 'sass-rails',   '~> 5.0'
gem 'uglifier',     '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'jquery-rails'
gem 'turbolinks',   '~> 5'
gem 'jbuilder',     '~> 2.5'

group :development, :test do
  gem 'sqlite3'
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows環境ではtzinfo-dataというgemを含める必要があります
# Mac環境でもこのままでOKです
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

```
$ bundle
```

 ```
$ rails s
```

以上
相関係数行列の対角成分と片方の非対角成分を0に変換

```
def corr_zero_pad(corr):    
    len_corr = len(corr)
    for i in range(len_corr):
        for j in range(len_corr):
            if i>=j:
                corr.iloc[i,j]=0
    return corr
```
GAS で掲示板をこしらえる

きょうび、自鯖に掲示板を用意したいと思っても、CGI や PHP のプログラムを配布しているサイトは軒並み停止していて、スマホ対応なんて望むべくもなく、もはや自作するしかない……ということで、なぜか Google Apps Script でスレッド式掲示板を作ってみました。

そんで、出来上がったものが[こちら](https://script.google.com/macros/s/AKfycbwNXn4xKQR2irDAxnf5aCgUGSHAi7Z-yNIxI6eWJz5nxoi5fmT1/exec)

ソースコードは GitHub に上げました。
[GAS-BBS](https://github.com/PANDAKO-GitHub/GAS-BBS)
GitHub 使うの初めてなので、全ファイルサイト上でコピペしてリポジトリ作りました🤤

かなり簡素な作りですので、利用したいという奇特な方は、いい感じに改造してからご利用ください。

## 苦労した点
ぶっちゃけあんまないけど、HTML テンプレート経由だと勝手にエスケープしちゃって br 要素を出力することもできないので、仕方なく本文を CSS で white-space:pre-line して改行が反映されるようにしています。

そんなことより全然使い込んでないので、後々問題が出てくる気はしますが、もはや若人には「え？ビービーエ…なんて？」とか言われちゃう掲示板を作りたい方はチャレンジしてみるのも良いかと思います。
見栄えがいいなと思った無料のUnityアセット三点のご紹介

小一の子供向けの漢字を学ぶゲームを作ってみました。
![kanji.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/d2e3442c-73ba-d7f1-bafc-2576ea5b655f.gif)

今回使った Unity Asset で、最初から知っていたら良かったのになと思った、見栄えの良くなる無料アセットを紹介します。この gif だと、背景、ボタン、コイン、パーティクル、にあたります。

もし他にも見栄えがよくなるアセットがあったらぜひ教えてください。

# [LowPoly Environment Pack](https://assetstore.unity.com/packages/3d/environments/landscapes/lowpoly-environment-pack-99479)
![スクリーンショット 2020-08-10 21.05.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c9b8cc68-9a96-4d71-ca09-a8c0c8f801b3.png)

今回の背景のほとんどはこれです。山、木、草など色々含まれているので、もっと丁寧に作り込むことも可能です。適度な優しい雰囲気のアセットで使い勝手が良かったです。

# [POLYGON - Starter Pack](https://assetstore.unity.com/packages/3d/props/polygon-starter-pack-156819)
![スクリーンショット 2020-08-10 21.06.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/c586d633-7bc6-9327-658e-33960dfb1fbc.png)

今回の空、コイン、手で触っているボールなどは、細いものが結構これです。ローポリのオブジェクトをたくさん作っている会社さんの一つです。これだけ無料で、有料だと各テーマに沿って出来上がった感じになっていて、それはそれでレゴみたいな雰囲気感があります。まずはこの無料版を使ってみて、良かったら有料版を必要に応じて購入すると、みんなハッピーになれる気がします。

# [Cartoon FX Free](https://assetstore.unity.com/packages/vfx/particles/cartoon-fx-free-109565)（パーティクル）
![cartoonfxfree.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/15616ab9-9bcc-cf90-7773-4c848c24dc29.gif)

今回の

* ニワトリの出現じの怪しい煙
* ニワトリが飛んでいくときのタツマキ
* 風船が割れるときの爆発

など、全部これで賄っています。

他にも炎や砕けるパーティクルなど、使えそうなのがあって、便利だなと思いました。このアセットのデモを実行すると、５０種類あるパーティクルを順次実行していけるので、確認して使えそうなのを入れると良いかと思います。

そして今回のゲームは Oculus Quest で実行しているので、もちろん VR で使えますし、パフォーマンス的にも問題ないです。
liタグで作成したリンクの下線がtext-decorationで消せない

#はじめに
前提条件
railsでのアプリケーション作成

#エラー？
下記のように確かに`li`タグに対して`text-decoration`を設定しているのに適用されない

```application.html.erb
<ul class="lists">
 <li class="list"><%= link_to "エクササイズ", "#" %></li>
</ul>
```

```application.scss
.lists {
  display: flex;
  align-items: center;
  list-style: none;
}

.list {
  padding: 1px 20px;
  border-right: 1px solid black;
  text-decoration: none;
  color: #433f3f;
}
```

#解決方法

`li`タグではなく`link_toメソッド`にclassを設定

```application.html.erb
<ul class="lists">
 <li><%= link_to "エクササイズ", "#", class: "list" %></li>
</ul>
```

scssは特に変更する必要なし

これで`li`タグ内のリンクの下線を消せるようになると思います。
fields_forをeachで回す

# この記事でやること

- rails6
- fields_forをeachで回す

```ruby
  <%= form_with model: @post, url: posts_path do |form| %>
    <%= form.text_area :name, id: "name" %>
    <%= form.text_area :user_id, value: @current_user.id %>
    <% @post.events.each do |event| %>
      <%= fields_for "events[]", event do |event_form| %>
          <%=  event_form.date_field :date, id: "event_date" %>
      <% end %><!--form-->
    <% end %><!--each-->
    <div class="hoge">
      <%= form.submit "登録する" %>
    </div>
  <% end %>
```

- fields_forの引数は[]をつけると各formのnameにitems[id]という形式で展開される。

# 参考資料

「Rails4、fields_forを使って一括更新する処理のベストプラクティスは何だろう」
http://j-caw.co.jp/blog/?p=1590

railsドキュメント
https://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for

「複数モデル、複数レコードの一括更新(Rails)」
https://qiita.com/tktcorporation/items/7ba7d67b8de970a91bba
has_manyとbelongs_toの関係


has_many 　と　belongs_toは
一夫多妻制！！！

これに尽きます！！

そもそもこの役割があるのは、
データベースとデータベースを紐づけるためにあります！

たとえば "user" と　"memos"というデーターベースがあります。
"user"（単数形）なので一人しかいません（一夫）
”memos"（複数形）なのでたくさんのデータがあります（多妻）

”user”→”memos”　は”has_many”
”memos→”user"  は”belong_to”です。

この紐付けを行うことでA夫は、B妻C妻・・・の籍を入れており
（日本ですと犯罪なのでそんなことはしないように笑）
B妻C妻・・・・はA夫の籍を入れていることになります！

では紐付けないとどうなるかというと、
浮気・不倫になってしまいます＞＜

A夫とB妻は籍を入れているのに、
C妻にA夫がいると”その関係はなんなの！？！？”
と世間（パソコン）に怒られてしまい揉め事（エラー）になってしまいます！

なのでA夫B妻C妻・・・・・の関係はなんですか？
と世間（パソコン）に聞かれたときに”一夫多妻”という名前があれば
世間（パソコン）は”あーなるほど”と解釈できるわけです！


もっとも、世間で受け入れられるかどうかはわからないので
そういう意味ではプログラムは感情もなく受け入れてくれる存在ですね笑
引数に最小値（min）最大値(max)を入れるとランダムな整数を返してくれる関数

# ランダムな整数が欲しい！
そんなときはこの処理を使おう！
自分がよく使っている関数です。

```js
const rand = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
```

なんのこっちゃない処理ですが
ブラウザゲーム作成時によく使います。



```js
rand(1, 10) //1〜１０までのランダムな整数を返してくれます
```

いろいろと応用が効くので使いやすい。
DOM操作時でも、例えばランダムに画面外からやってくる感じを演出するときにも使えます。

```js
element.style.transform = `translate(${rand(-100, 100)}%, ${rand(-100, 100)}%)`
```

とかってしてやると
縦軸、横軸ランダムな位置に配置することができるので、
css animationと組み合わせてやると
ランダムな位置に発生して所定の位置へ移動してくる動きを要素に与えることができます。

```js
const els = document.querySelectorAll('[class^=devicon-]')
      els.forEach(el => {
        el.style.transform = `translate(${rand(-100, 100)}%, ${rand(-100, 100)}%)`
        el.classList.add('icon-move')
        setInterval(() => {
          el.style.zIndex = this.rand(-1, 1)
        }, this.rand(4000, 8000))
      })
```

4秒から８秒のうちランダムな秒数後にz-indexを上げ下げすることで表示、非表示をコントロールしています。
実際に私のポートフォリオの「study」ページにて使用していますので
ぜひ動きをみてにきてください。
自分的tailwindcss導入時スタイルガイド

# この記事の目的

個人的な開発をするときのcssのルール。考え方とかもまとめるのでcss設計を考える際の実例として読んでもらえると。

# 条件

- tailwindcss導入
- rails6
- railsのviewを利用

# 基本方針

- SMACSSをベースに
- できるだけ保守性を上げたいので抽象度を上げて使い回しできるようにしたい
- オリジナルのカスタマイズもできるようにしたい

# ルール

- SMACSSのルールを踏襲し、下記に分ける
    - ベース
    - レイアウト
    - モジュール
    - ステート
    - テーマ
- レイアウト
    - class名にl-をつける
    - コンテンツの横幅調整はtailwindcssの[container](https://tailwindcss.com/docs/container/#app)で行う
- 単語は_で区切る
- モジュール：部品をここで定義していく
    - btn
@Builderと@NoArgsConstructor一緒に使える方法

# 課題
以下のように@Builderと@NoArgsConstructorを一緒に使うとエラーが発生する。

```java

@Builder
@NoArgsConstructor
public class MyName {
    private String first;
    private String last;
}
```

# 解決
@AllArgsConstructorアノテーションも入れるかすべてのフィールドを持つコンストラクタを追加すればできる。

```java

@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MyName {
    private String first;
    private String last;
}

  .. または ..


@Builder
@NoArgsConstructor
public class MyName {
    private String first;
    private String last;

    MyName(String first, String last) { ... }
}
```
【Docker】docker-composeコマンド早見表




|コマンド|できること|
|:---|:---|
|docker-compose build|イメージを構築する|
|docker-compose up|イメージの構築・コンテナの構築・起動|
|docker-compose start|既存のコンテナの起動|
|docker-compose run|イメージの構築・コンテナの構築・起動・コンテナ内でのコマンドの実行|
|docker-compose exec|コンテナ内でのコマンドの実行|


#イメージの構築

```shell
# 初回の構築
docker-compose build

# Dockerfileを更新後の構築
docker-compose build --no-cache
```

<details><summary>キャッシュ</summary>
キャッシュという一度ビルドすると作成される、2回目以降のビルド処理を速やかにしてくれる機能がある。
Dockerfile更新時には、キャッシュを用いてビルドされるの更新内容が反映されない可能性があるので、2回目以降は**キャッシュを無効にする**必要がある。
</details>




#コンテナ起動

###起動

```shell
# フォアグラウンドで起動
docker-compose up

# バックグラウンドで起動
docker-compose up -d
```

###再起動（コンテナはそのまま、ソースコードの変更を反映）

```shell
# フォアグラウンドで起動していた場合
docker-compose up

# バックグラウンドで起動していた場合
docker-compose restart
```


###再起動（コンテナの再構築、ソースコードの変更を反映）

```shell
# フォアグラウンドで起動
docker-compose up

# バックグラウンドで起動
docker-compose up -d
```


###再起動（Dockerfileの変更を反映）

```shell
# フォアグラウンドで起動
docker-compose up --build

# バックグラウンドで起動
docker-compose up -d --build
```

#コンテナ構築後の開発開始と終了

```shell

# 開始
$ docker-compose start

# 終了
$ docker-compose stop
```


#後片付け

```shell
# 停止と削除（コンテナ・ネットワーク）
docker-compose down

# 停止と削除（コンテナ・ネットワーク・イメージ）
docker-compose down --rmi all

# 停止と削除（コンテナ・ネットワーク・ボリューム）
docker-compose down -v

# 全てを無に返す
docker-compose down --rmi all --volumes
```


#コンテナ内での実行

```shell
# そのまま実行する
docker-compose run --rm bundle install

# コンテナ内のターミナルに入って実行する
docker-compose exec サービス名 sh
>bundle install
```


#参考記事

>https://qiita.com/tegnike/items/bcdcee0320e11a928d46

>https://qiita.com/okyk/items/a374ddb3f853d1688820
職場や研究室のPC(グローバルIPなし)に自宅からssh接続する方法

# はじめに
職場や研究室のPCにグローバルIPが割り当てられるケースはまれで、1つのグローバルIPを共有するNAPT(NAT)の傘下にあることがほとんどです。
この記事では、そのようなPCに対してもリモートポートフォワーディングを使用して自宅からssh接続できるようにする方法を紹介します。

なお、個人利用であればTeam Viewerなどのリモートデスクトップ系のソフトの方が楽かも知れません。
この記事はTeam Viewerが重くてやだ/商用利用できない、端末さえ叩ければ十分なのに、という人向けの記事です。

## 必要なもの
- 職場/研究室のPC(※常時電源ON)
    - 固定グローバルIPがないLinux PCを想定
- 自宅PC
- 自宅PCからssh接続可能な、固定グローバルIPをもったLinuxサーバー(VPSなど)
- ネットワーク管理者の許可 ← 重要

## イメージ図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192805/b4aa33f8-90b1-95ff-6e05-77cd65af2a19.png)

## 大まかなやり方
大まかには以下のような手順となります。

### 1. 職場PCで`ssh -fNR 12345:localhost:22 vps`を打っておく
### 2. 自宅PCから`ssh vps`→`ssh localhost -p12345`で多段ssh接続して職場PCに接続

## 詳しいやり方
### 職場で準備としてやっておくこと
あらかじめ、職場PCの`~/.ssh/config`にVPSへの接続情報を書いておきます(新規作成の場合は`chmod 600 ~/.ssh/config`しておくことを忘れずに)。

```:職場PCの「~/.ssh/config」にVPSへの接続情報を書いておく
Host vps  ←任意の名前を指定
User username  ←適宜変更
HostName xxx.xxx.xxx.xxx  ←適宜変更
Port 22
ServerAliveInterval 60
ExitOnForwardFailure yes
TCPKeepAlive no
```
`Host`,`User`,`HostName`,`Port`の行は適宜書き換えてください。また、(普通そうだと思いますが)VPSへのssh接続が鍵認証の場合で、職場PCのデフォルトの鍵とは異なるものを使用する必要がある場合は`IdentityFile`などの情報も足してください。

なお、`TCPKeepAlive`をyesにしてしまうと、少しでも接続が切れると通信が閉じられてしまうのでnoのままにしておくことをお勧めします。

`~/.ssh/config`の準備ができたら、職場PCから以下のコマンドを叩きます。ポート番号は適当に12345にしています。

```:VPSにトンネルを掘りつつ常時ssh接続しておくコマンド
$ ssh -fNR 12345:localhost:22 vps
```

各オプションの意味は、

- `-f`: バックグラウンド実行
- `-N`: ssh先のシェルを開かない
- `-R`: リモートポートフォワード(リモート側のポートをローカルのポートに繋ぐ)

です。

このコマンドによって、VPS側の12345番ポートに職場PCの22番ポートが常時フォワードされた状態になります。
つまり、VPS側でlocalhostの12345番ポートにssh接続を飛ばせば、職場PCの22番ポートにssh接続を飛ばしたことと同じになります。

このsshコマンドは、`-fN`オプションが付いているおかげで、実行するとバックグラウンドでプロセスが残り続けます。
実行したシェルを閉じてもsshのプロセスは残り続けるので、実行した後は`exit`で端末を閉じて大丈夫です。
(もしこのプロセスを終了したい場合は`ps`コマンドでプロセスIDを調べた上で`kill [プロセスID]`を叩いてください。)

### 動作確認: VPSから職場PCへ接続できることを確認しておこう
そのまま帰宅すると上手くいくか不安なので、帰る前にVPSからssh接続できることを確認しておきましょう。
VPSからの接続確認を行うために、まず職場PCからVPSに対して(常時接続のものとは別に)普通にssh接続します。

```:職場PCから普通にVPSへ接続
$ ssh vps
```

先ほど述べたとおり、VPS側でlocalhostの12345番ポートにssh接続を飛ばせば、職場PCの22番ポートにssh接続を飛ばしたことと同じになります。
すなわち、VPS上で以下のコマンドを叩けば職場PCにssh接続できます。

```:VPSから職場PCへのssh接続
$ ssh username@localhost -p12345
```

`username`は職場PCでの自分のユーザー名に変更してください。

これで職場PCへssh接続できた場合は成功です。帰りの支度を始めましょう。

## 自宅からの使い方
使う時は多段階でsshしてあげれば良いだけです。

1. 自宅PCからVPSへssh接続(※自宅PCの`~/.ssh/config`にもvpsという名前で接続先が登録されてる想定)
    
    ```
    $ ssh vps
    ```
    
2. VPSから職場PCへssh接続
    
    ```
    $ ssh username@localhost -p12345
    ```

おわり。

一発で自宅PCから職場PCまでssh接続を通したい場合は、以下の記事を参考に`~/.ssh/config`を書いてみてください。
→ 「[多段SSHやポートフォワーディングを '.ssh/config' に書く - Qiita](https://qiita.com/lasta/items/41e95a2fdded18c34dae)」

## 参考記事
- 「[SSHポートフォワード（トンネリング）を使って、遠隔地からLAN内のコンピュータにログインする - ククログ](https://www.clear-code.com/blog/2014/9/12.html)」
    - だいたいこの記事で説明されている内容と同じです
- 「[sshポートフォワーディングについて図示してみる](https://qiita.com/fkshom/items/844a1be031ae3eb4bcea)」
    - リモートポートフォワードのイメージ図が載ってます
Docker-ComposeでMySQL8をセットアップする時に若干はまったこと


## はじめに
Gitbucketの組み込みDBである`H2Database`はたまに壊れる事があるとのことで、ちゃんと運用するにはMySQLかPostgreSQLサーバを建てた方がよいとのこと。
GitbucketもMySQLも公式Dockerイメージから構築しようとした時に、ややハマった部分と対応作を備忘録する。

## 結論
一端、これでうまいこといっているので、良しとする。

```yaml
# Docker-Composeのバージョンが低いのは、Portainerがまだバージョン２までしか対応していないため。特に意味はない
version: '2'
services:
  #MySQLの設定
  mysql:
    image: mysql
    container_name: gitbucket_mysql
    ports:
      - 3306:3306
      - 33060:33060
    environment:
      MYSQL_ROOT_PASSWORD: your_password
      MYSQL_DATABASE: gitbucket
      MYSQL_USER: gitbucket
      MYSQL_PASSWORD: gitbucket
    volumes:
      - mysql:/var/lib/mysql
    # ポイント１ キャラクタセットの設定、ポイント２ 認証プラグインの変更
    command: ["--character-set-server=utf8mb4",  "--collation-server=utf8mb4_unicode_ci", "--default-authentication-plugin=mysql_native_password"]

  gitbucket:
    image: gitbucket/gitbucket
    container_name: gitbucket
    depends_on:
      - mysql
    ports:
      - 8080:8080
    environment:
      GITBUCKET_DB_URL: jdbc:mysql://gitbucket_mysql:3306/gitbucket?useUnicode=true&characterEncoding=utf8
      GITBUCKET_DB_USER: gitbucket
      GITBUCKET_DB_PASSWORD: gitbucket
    volumes:
     - gitbucket:/gitbucket
    # ポイント３ MySQLが立ち上がるのをちょっとだけ待つ
    command: ["sh", "-c", "sleep 10 && java -jar /opt/gitbucket.war"]
    
volumes:
  mysql:
    driver_opts:
      type: none
      device: /PATH/TO/MOUNT/DIR/mysql
      o: bind
  gitbucket:
    driver_opts:
      type: none
      device: /PATH/TO/MOUNT/DIR/gitbucket
      o: bind


```

## ポイント１ MySQL キャラクタセットの指定
```yaml
command: ["--character-set-server=utf8mb4",  "--collation-server=utf8mb4_unicode_ci", "--default-authentication-plugin=mysql_native_password"]
```

別にはまったわけではないが、MySQLのサーバ側のキャラセットを設定ファイル（`my.cnf`)なしで変更したかったので、起動パラメータでUTF8に指定した。

## ポイント２ MySQL 認証プラグインの変更
```yaml
command: ["--character-set-server=utf8mb4",  "--collation-server=utf8mb4_unicode_ci", "--default-authentication-plugin=mysql_native_password"]
```
MySQL8以降、標準の認証方式がRSA認証になったようなので、旧式のパスワード認証に変更する。新式の認証方法はGitbucket側が対応していなければならないが、現段階でWikiを見る限りまだ未対応？の模様。（ただ、ブログを見る限りMySQL8対応をされているようだが）

## ポイント３ Gitbucket起動時にウェイトタイム設ける
```yaml
command: ["sh", "-c", "sleep 10 && java -jar /opt/gitbucket.war"]
```
これが、一番はまった。

MySQLの初回立ち上がり時、まだデータベースがないので起動後すぐには接続できない。Docker-Composeで立ち上げるとGitbucket起動後もまだMySQLが準備中の段階。そのため、Gitbucket側で接続エラーになってしまう。

MySQLのDockerHubのDescribeにも記載されているが、こういった場合はシェルなどで接続リトライをするようにしている。

ちょっとダサいのはやむを得ないが、接続リトライとか面倒なので、てっとり早くウェイトタイム１０秒をいれた。（１０秒もいらんかも）
Pythonのargparseで「'required' is an invalid argument for positionals」が出たら、requiredを消せばいい

ドキュメントが少し分かりづらかったのでメモ。

# 起動時の引数を便利に扱えるargparseモジュール
Pythonには、起動時の引数を便利に扱える[argparseモジュール](https://docs.python.org/ja/3/library/argparse.html)があります。

## 位置引数とオプション引数
argparseで扱う引数には以下の2種類があります。

- 位置引数(infile1など)
- オプション引数(-fや--barなど)(=フラグ)
([公式ドキュメントのargparseの「name または flags」](https://docs.python.org/ja/3/library/argparse.html#name-or-flags)に書かれています)

## add_argument()メソッド
どんな引数を指定できるかを`add_argument()`メソッドで指定できますが、位置引数が必須だからと

```
argument.add_argument(
    'infile1',
    required=True,
    help='input file'
)
```
のように書いてしまうと、実行時に「`'required' is an invalid argument for positionals`」とエラーになり実行できません。

## 「`required`」はオプション引数のみに指定できる
「`required`」はオプション引数に対する指定なため、位置引数に指定するとエラーになります。
もともと位置引数は必須なため、該当オプションの「required=True」を消せば、想定した動作になります。