OmniAICreator/Qiita-1.07M huggingface dataset:
複数台サーバーを踏み台経由で #ssh で多段認証し SOCKS proxy で local から #https アクセスすることは可能なのか？可能みたいだ。( 秘密鍵を利用) ( #Mac OS で検証 )

# config 

`~/.ssh/config` の設定例
鍵は local にあることが前提

```
Host server1
  HostName xxx.xxx.xxx.xxx
  User user
  IdentityFile ~/.ssh/foo.pem

Host server2
  User server2-user
  HostName yyy.yyy.yyy.yyy
  ForwardAgent yes
  ForwardX11 yes
  ProxyCommand ssh -W %h:%p server1
  IdentityFile ~/.ssh/bar.pem
```

# SOCKS Proxy を起動

```
ssh -vND 8888 server2
```

# Mac OS の設定例

```
sudo networksetup -setsocksfirewallproxy <NETWORK_SERVICE_NAME> localhost <PORT>
sudo networksetup -setsocksfirewallproxystate <NETWORK_SERVICE_NAME> on
```

```
sudo networksetup -setsocksfirewallproxy Wi-fi localhost 8888
sudo networksetup -setsocksfirewallproxystate Wi-fi on
```

# httpsアクセスしてみる

https://httpbin.org/ip など、自分のIPアドレスが確認できるサービスにアクセスしてみて、 Server2 の IP アドレスが確認できたらok

# 関係ないけど curl を叩く例

こちらは mac os での設定は不要

```
https_proxy=socks://127.0.0.1:8888 curl -v https://httpbin.org/ip
```


# 参考

[多段SSHの設定を.ssh/configにまとめる - Qiita](https://qiita.com/ik-fib/items/12e4fab4478e360a82a1)

[socks yumainaura - Google Search](https://www.google.com/search?q=socks+yumainaura&oq=socks+yumainaura&aqs=chrome..69i57j69i60l3.2294j0j4&sourceid=chrome&ie=UTF-8)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2758








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Stetho導入

# はじめに
AndroidStudioでProfilerがあり、そこでNetworkの通信内容を見ることが可能ですが、業務でAirWatchに対応した際に実機でProfiling出来なくなってしまったので如何に通信内容を調べようかと思案していた。
パケットキャプチャ出来ればいいんですが、社内のソフト管理が厳しく申請通すのが~~ひどくめんどくさく~~時間を要するので何かいいのがないかなーと調べていたところ、Stethoを見つけて使ってみたのでその時の記録を残すものである。

# 環境
Mac Catalina

# Stethoとは
一時期仮想通貨でニュースを賑わせていたFacebookが公開しているオープンソースなライブラリ。
ライセンスはBSDなので厳しくない。
パースしている内容はChromeで見る。
今回はNetworkだけをターゲットにしているけどRealmとかViewのヒエラルキーとか色々見ることが可能。
同じようなライブラリでFlipperなるものもあるけどFlipperのアプリをPCに入れる必要がある。
ちなみにFlipperは昔Sonarって名前だったみたいです。(DAWと被ってややこしいから名前変わったのかな)
[Stethoリンク](http://facebook.github.io/stetho/)
[Flipperリンク](https://fbflipper.com)

# 導入
まずはapp/build.gradleのdependenciesに追記するところから。

```gradle
  dependencies { 
    implementation 'com.facebook.stetho:stetho:1.5.1'
    implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
  } 
```
これで一回gradleビルドしておく。
成功したらApplicationクラスを継承したクラス(ここではAppクラスとしておく)のonCreate()でStethoの初期化を行う。

```kotlin
class App: Application {
  override onCreate() {
    super.onCreate()
    Stetho.initializeWithDefaults(this)
  }
}
```
あとは通信時にOkHttp3のClientのInterceptorにStethoのInterceptorを追加してあげれば準備OK。

```kotlin
OkHttpClient.Builder()
    .addNetworkInterceptor(StethoInterceptor())
    .build()
```

通信内容を見たい時はあらかじめChromeのDev Toolを起動しておいて対象端末のアプリのパッケージ名の下に表示されているInspectをクリックしてあげればOK。

# おわりに
AndroidStudioのProfilerが使えれば便利なんですけどね。
そうもいかない時にはこういうライブラリを使うしかないですね。
もしAirWatch対応してても実機でAndroidStudioのProfilerが使える方法があれば教えてほしい。
Mac でシフトキーがずっと押されたような状態になったときの対処法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25846/06c0386f-0c2d-6d1d-0529-fbe4f715dd52.png)

Mac の設定画面を開きます。

一度 Enable Sticky Keys にチェックを入れます。

その後、 Enable Sticky Keys のチェックを外します。

これで解消されました。


環境は、 macOS Mojave Version 10.14 でした。

Chrome でウェブサイト閲覧中、 リンクをクリックして新しくウインドウが開いたところから現象が続いていました。
最初の、 "Enable Sticky Keys" の設定値はオフだったのですが・・・。
mp4 の回転情報を削除する (ffmpeg)

スマートフォンで撮影した mp4 の動画ファイルなどで、PC 上で編集しようとしたときに回転角度が間違って扱われ、出力時に動画サイズなども壊れることがあります。
これは、mp4 動画ファイル内に回転情報を扱うメタデータがあるのですが、それに対応しているアプリケーションとそうでないアプリケーションがあるからです。
そこで、`ffmpeg` コマンドを使用して回転情報を削除し、解決することにしました。

主に以下の記事を参考にしましたが、ここではターミナル上だけで操作することを目的とし、それに加えていくつかのコマンドのオプションを変更・追加しました。説明文も補足します。

参考「[スマホで撮影した映像をffmpegで正しい向きに変換する（＋縮小変換） - Qiita](https://qiita.com/naga3/items/639da87ad56c67549eee)」

# 1. mp4 の回転情報を確認 (`ffprobe`)

```bash:コマンド
ffprobe -show_streams -print_format flat input.mp4 2>/dev/null | grep '\.tags\.rotate='
```

```:出力の例
streams.stream.0.tags.rotate="270"
```

(ここでは出力を `grep` コマンドで取り出せるように出力形式を `flat` に変更。)

(ここで何も表示されない場合、おそらくメタデータによる回転ではないです。)

参考「[4 Writers - ffprobe Documentation](https://ffmpeg.org/ffprobe.html#Writers)」

`ffprobe` コマンドは、本質的な出力でない情報を標準エラー出力 (stderr) に出力しています。
エラーというよりログに近い内容なのですが、標準出力と分けて表示されるため、ここでは非表示にするために null デバイス `/dev/null` に出力しています。

# 2. mp4 の回転情報を削除 (`ffmpeg`)

```bash:コマンド
ffmpeg -i input.mp4 -c copy -metadata:s:v:0 rotate=0 output.mp4
```

前述の参考記事では `-vf` オプション (`-filter:v` のエイリアス) により FFmpeg Filters を使用して回転変換をしていますが、ここでは回転情報を削除することのみを目的として、各ストリームはコピーするだけにしました。

参考「[5.4 Main options - ffmpeg Documentation](https://ffmpeg.org/ffmpeg.html#Main-options)」
参考「[5.11 Advanced options - ffmpeg Documentation](https://ffmpeg.org/ffmpeg.html#Advanced-options)」(`-map_metadata`)
参考「[5.1 Stream specifiers - ffmpeg Documentation](https://ffmpeg.org/ffmpeg.html#Stream-specifiers)」

`-c copy` で、各ストリームを再エンコードせずにコピー。
`-metadata` でメタデータを変更。`:s` でストリーム単位、`:v` でビデオ、`:0` で初めのインデックス。
#Slack のリッチテキストフォームでショートカットを使ってコードブロックを適用してみる

# 選択範囲の全ての行を コードブロックで囲う

![image](https://user-images.githubusercontent.com/13635059/69469508-9c04a780-0dd4-11ea-9a84-e675777d8c43.png)


# 選択範囲の全ての行を 1行単位でコード記法にする

![image](https://user-images.githubusercontent.com/13635059/69469522-b179d180-0dd4-11ea-9222-045b630a0b9e.png)


# せっかくなので

ウィスギーなフォームにも慣れておいた方が良いかな。

テキスト入力の 巨塔の、片方がウィスギーで片方がMarkdown。

ウィスギー共通規格でもできればよいのだけど。


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2757








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bundle installの際に『An error occurred while installing nokogiri』エラーが発生した時の対処法【 Homebrew】

bundle installを行った際に、以下のエラーが発生したので、解決法を備忘録として残します。

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
An error occurred while installing nokogiri
```

##環境

Rails 5.2.3
ruby 2.5.1
MacOS Catalina 10.15.1

##brew doctorでHomebrewの状況を確認

原因を調べたところ、Homebrewに問題がありそうでした。
なのでまずはHomebrewの状況を確認。

参考：https://qiita.com/SonoT/items/060c21e9866d5d9603e3

```
$ brew doctor
```

すると以下のWarningが返ってきました。

```
Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun


Warning: Broken symlinks were found. Remove them with `brew cleanup`:
```

##Warningを一つずつ解消していく

Warningの内容を一つずつ潰していきます。
と言っても、Warningに書いてある通りのコマンドを実行しただけです。

###Warning: No developer tools installed.

一つ目のWarning

```
Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

「developer tools がインストールされていないので、the Command Line Toolsをインストールしなさい」と書いてあります。
その下に入力すべきコマンドも表示されています。

これをそのままターミナルで入力

```
$ xcode-select --install
```

ポップアップが出てくるのでインストールをクリックします。

インストールにはだいぶ時間がかかるので注意してください。
僕は一度インストールに失敗しましたが、２回目で成功しました。

###Warning: Broken symlinks were found.

二つ目のWarning
参考：https://qiita.com/6592sho/items/b24766e203fb7a48b056

```
Warning: Broken symlinks were found. Remove them with `brew cleanup`:
```

「壊れたsymlinksがあるので、それらを取り除いてください」と書いてあります。
こちらも一緒に表示されているコードをそのままターミナルで入力します。

```
$ brew cleanup
```
このコマンドでHomebrewの古いformula（パッケージ）を削除しているようです。
参考：https://qiita.com/vintersnow/items/fca0be79cdc28bd2f5e4

これで上記二つのWarningが解消されました。

```
$ brew doctor
```

二つのwarningが消えているはずです。

ターミナルを一度閉じて、bundle installを行ったら無事コマンドが通りました。

##まとめ

bundle installで『An error occurred while installing nokogiri』エラーが発生した時の対処法をまとめるとこうなります。

①＄ brew doctorでHomebrewの状況を確認
②出力されたWarningの内容を確認
③表示されたコマンドを入力してWarningを一つずつ解消
find コマンドのよく使う式まとめ

CentOS 7 で確認。find のバージョンは 4.5.11。

### ファイル・ディレクトリ名で検索
```
-name '<ファイル名>'
```

ワイルドカード（`*`、`?`、`[]`）を使用できる。その際は引用符を忘れずに。
`-iname` は大文字と小文字を区別しない。

### パスを正規表現で検索
```
-regex '<パターン>'
```

`-iregex` は大文字と小文字を区別しない。

### ファイル種別で検索
```
-type <タイプ>
```

タイプは、通常ファイルなら `f`、ディレクトリなら `d`。
 
### 過去 n 分以内に変更されたファイルを検索
```
-mmin -n
```

### 過去 n*24 時間以内に変更されたファイルを検索
```
-mtime -n
```

### 見つかったファイルのそれぞれに対してコマンドを 1 度ずつ実行
```
-exec <コマンド> \;
```

コマンドの中に `{}` と記述すると、ファイルのパスに置き換えられる。

### 見つかったファイルのすべてに対してコマンドを 1 度だけ実行
```
-exec <コマンド> {} +
```

`{}` がファイルのパスに置き換えられる。
#Slack の新しいリッチなテキストエリアは ウィジウィグ = 「 WYSIWYG - （What You See Is What You Get）見たまんまのものを得られる」というらしい。

技術仕様とかじゃなくてフォーマットの言い方みたいだ。

# 読み方

無理でしょ。素で読むの。

>読み方は、ウィジウィグ WYSIWYGは、What You See Is What You Get の接頭語をとった言葉で、ウィジウィグと読みます。

[WYSIWYG (読み方は、ウィジウィグ) とは？フリーなHTMLエディターってある？ | urashita.com 浦下.com (ウラシタドットコム)](https://urashita.com/archives/20312)

# ということは bitbucket は

ウィシウィグだ。

![image](https://user-images.githubusercontent.com/13635059/69469267-48de2500-0dd3-11ea-8ec3-213347d8cb82.png)

# チャットワークは

ウィシウィグではない。

![image](https://user-images.githubusercontent.com/13635059/69469331-8d69c080-0dd3-11ea-854a-b1745de09ba7.png)


# おなじみのGuthubは Markdown

ウィシウィグではない。

でもSlackを使ってから戻ると「なぜリッチテキストじゃないんだ？」という違和感が、逆に生まれた。

# Markdownは古い

これも時代の流れか。

# 必要なのはWYSIWYGとプレーンテキストの親和性では？

あと入力のUI。

とりあえずテキストコピペで情報が失われないようにしておいてほしい。

Markdownをコピペしても、なにこれってなるじゃないですか。

![image](https://user-images.githubusercontent.com/13635059/69469403-023cfa80-0dd4-11ea-9880-08d1b48dfa87.png)
![image](https://user-images.githubusercontent.com/13635059/69469405-02d59100-0dd4-11ea-80ae-41b93286ce88.png)


# Ref


[Slackの新リッチテキストエディタ―は、皆がMarkdownを怖がってることを示してる - ニュースな英語のホンヤクコンニャク](https://eigo-no-jikan.hatenablog.com/entry/2019/11/22/slacks-new-rich-text-editor-shows-why-markdown-still-scares-people)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2756








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Python Input Note in AtCoder

# introduction
標準入力の備忘録です。こっちのほうがもっといいよ！ってのがあったらぜひ教えてください。

## Inputs
### line: 1行
#### input: 1つのみ (str/int)
```python:input.py
S = input()
N = int(input())
```
```terminal:console
string
9999
```

#### input: 2以上 (str/int)
```python:input.py
S1, S2 = input().split()
S = input().split()
N1, N2 = map(int, input().split())
N = list(map(int, input().split())
```
```
Sunny Rainy
Sunny Rainy Cloudy => ["Sunny", "Rainy", "Cloudy"]
9999 8888
7777 6666 5555 => [7777, 6666, 5555]
```

### line: 2行以上
#### input: 改行系複数入力 (str/int)
```python:input.py
N = int(input())
S = [input() for _ in range(N)]
N = [int(input()) for _ in range(N)]
```
```
3 ... N(行数)
aa
bc
io => ["aa", "bc", "io"]
3
2
9 => [3, 2, 9]
```

#### input: 行列
```python:input.py
N = int(input())
S = [input().split() for _ in range(N)]
```
```
3
aa bc 82 00 2w
oe jj ed 2s pw
12 de co 99 jd 
 => [['aa', 'bc', '82', '00', '2w'], ['oe', 'jj', 'ed', '2s', 'pw'], ['12', 'de', 'co', '99', 'jd']]
```

#### input: 改行系複数数値入力 out: 2次元配列
```python:input.py
N = int(input())
S = [[int(i) for i in input().strip()] for _ in range(N)]
```
```
3
123456
789012
345678
 => [[1, 2, 3, 4, 5, 6], [7, 8, 9, 0, 1, 2], [3, 4, 5, 6, 7, 8]]
```
Raspberry PiでMackerelを使うのが楽になったよ！

mackerel-agent v0.64.1より、Raspberry Piで使える32bit ARM用Debianパッケージが自動ビルドされるようになりました。

これまでも32bit ARM用のバイナリファイルを含むtar.gzは自動ビルドされていたのですが、バイナリファイル以外の部分は自分で頑張る必要がありました。

一方、今回から作られるようになったDebianパッケージにはsystemdによる自動起動の設定も含まれるので、手持ちのRaspberry PiをシュッとMackerel管理下に置けるようになります。

Raspberry Piは画面無しで運用することが多いと思います。そんなときでも、Mackerel管理しておくとトラブルシューティングが楽になるのでオススメです。

## 動作例

筆者のRaspberry Pi Zeroでの動作例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/44c6eba8-d55a-89b4-7c48-a401ade38bc4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46856/2c681fb9-9fdf-8aaf-b307-c4fc88906aaa.png)

メモリ512MB[^1]のマシンでもちゃんと動いているのがわかります。

[^1]: 512MBのメモリのうち64MBをGPUに割り当てているのでCPUから見えるメモリは448MBのはずなんですがMackerelの表示と少しズレてますね…。

## インストール手順

[mackerel-agentのリリースページ](https://github.com/mackerelio/mackerel-agent/releases)に行き、最新版の `mackerel-agent_*_armhf.deb` のURLをコピーします。

そしてRaspberry Piにログインして `*.deb` をダウンロード、インストール、設定します。

```
$ wget https://github.com/mackerelio/mackerel-agent/releases/download/v0.64.1/mackerel-agent_0.64.1-1.systemd_armhf.deb
$ sudo apt install ./mackerel-agent_0.64.1-1.systemd_armhf.deb
$ sudo vi /etc/mackerel-agent/mackerel-agent.conf
$ sudo systemctl start mackerel-agent
```

詳しくは公式マニュアル「[Ubuntu / Debian にインストールする \- Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/howto/install-agent/deb)」をご覧ください。

## 注意点

ARM版バイナリは公式サポートではないので、トラブっても泣かない精神が必要です。トラブったらPull Requestを投げましょう。

## 補足

ちなみに筆者はPull Requestを送っただけの一般人です。

- [Add armhf Debian package to release by hnw · Pull Request \#599 · mackerelio/mackerel\-agent](https://github.com/mackerelio/mackerel-agent/pull/599)

これを取り込んでもらったおかげで家庭内で稼働しているRaspberry Piが増えました。ありがとうございました。
ArchLinuxにおけるVirtualBoxなしのGenymotion

# やりたいこと
公式リポジトリからVirtualBoxを入れるとなぜか正常に起動できないため私は必ず公式サイトのインストーラーからVirtualBoxをインストールしています。さっき、ちょっとした用事でGenymotionを入れようとしたところ依存関係にVirtualBoxがありエラーでインストールできませんでした。その時の対処方法を書いておきます。

# やり方
依存関係を削除してビルドし直すため、yay等は使用しません。
##PKGBUILD等を取得

```bash
git clone https://aur.archlinux.org/genymotion.git
```

## 依存関係を削除

```bash
cd genymotion
sed -i s/"depends=('libpng' 'net-tools' 'protobuf' 'qca-qt5' 'qt5-script' 'qt5-webkit' 'virtualbox')"/"depends=()"/ PKGBUILD
```

## ビルドとインストール

```bash
makepkg
sudo pacman -U *.pkg.tar.xz
```
あとは通常と同じようにGenymotionを起動してログインしてください。


## ごみの削除
インストール後は作成したファイルは不要なので削除してください。

```bash
cd ..
rm -rf genymotion/
```
VBScriptで可変個引数の関数を作る方法

VBでは関数宣言の引数の前にOptionalをつけることによって、その引数を省略可能にすることが出来ますが、VBScriptにはその機能が実装されていません。

[Optional Parameters (Visual Basic)
](https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/procedures/optional-parameters)

VBScriptでこれと同等なことをしようとした場合は、例えば関数を呼び出すときに後半の引数を `Null` にするなどして対応します。

```vb
Function Func(hoge, fuga, piyo)
  If piyo = Null
    piyo = "default value"
  End If

  ' Body
End Function

Call Func(hoge, fuga, Null)
```

しかし、この方法ですと引数を省略するための `Null` なのか、それとも `Null` という値を関数の引数にしたいのかが曖昧です。

# 解決策

Array関数を使う。
[Array関数](https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc410203(v=msdn.10))

Array関数はVBscriptの組み込み関数の中でも特殊な関数で、可変個の引数を渡すことが出来ます。
そのため、Array関数を上手く使うことによって、関数を呼び出す側の引数リストに `Null` を書かなくても良いようになります。

しかし、関数定義がかなりキモい感じになる上に、関数シグニチャから引数に関する情報を得ることができなくなってしまします。

メリットとデメリットを比較するとあまり積極的に使いたくはないですが、もしものときのテクニックとしてご参考までに。

```vb
Function Func(arrArgs)
  Dim hoge, fuga, piyo
  piyo = "default value"

  Select Case UBound(arrArgs)
    Case 1
      hoge = arrArgs(0)
      fuga = arrArgs(1)
    Case 2
      hoge = arrArgs(0)
      fuga = arrArgs(1)
      piyo = arrArgs(2)
    Case Else
      ' エラー処理
      Exit Function
  End Select

  ' Body
End Function

Call Func(Array(hoge, fuga))
```
Mirakurun in CentOS7 ドハマリしたチューナー設定

####マイ環境
CPU: Core-i7 8700
マザー: ASUS PRIME B360-PLUS
メモリ:16G
ライザーカードでPT2の２枚刺し

インストール等は参考になるサイトがたくさんあるのでそちらを。
同じミスで苦しんでいる人のためになれば幸いです。
こんなミスする人ほかにいるとは思えんけど笑

#####チューナー設定コマンド

```console
$ sudo mirakurun config tuners
```

```text
- name: PT2-S1
  types:
    - BS
    - CS
  command: recpt1 --device /dev/pt1video0 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-S2
  types:
    - BS
    - CS
  command: recpt1 --device /dev/pt1video1 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-S3
  types:
    - BS
    - CS
  command: recpt1 --device /dev/pt1video4 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-S4
  types:
    - BS
    - CS
  command: recpt1 --device /dev/pt1video5 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-T1
  types:
    - GR
  command: recpt1 --device /dev/pt1video2 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-T2
  types:
    - GR
  command: recpt1 --device /dev/pt1video3 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-T3
  types:
    - GR
  command: recpt1 --device /dev/pt1video6 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false

- name: PT2-T4
  types:
    - GR
  command: recpt1 --device /dev/pt1video7 <channel> - -
  decoder: arib-b25-stream-test
  isDisabled: false
```
チューナー番号の順番
S1 - ptvideo0
S2 - ptvideo1
S3 - ptvideo4
S4 - ptvideo5
T1 - ptvideo2
T2 - ptvideo3
T3 - ptvideo6
T4 - ptvideo7

0: 1: 4: 5: 2: 3: 6: 7 -> 正解
0: 2: 4: 6: 1: 3: 5: 7 -> どっかのサイトを参考に設定？勘違いかも。-> エラー多発でどハマり。
Hamlの基本箇所についての復習③（%p.class）

#はじめに
引き続きHamlの記事を書いていきます。
今回は、私が地味に悩んだクラスの付け方です。

#実行

例えばhtmlで下記のようなコードがあるとします。

```html
<p>私は伊藤です</p>
```

これをHamlで書き換えると次のようになります。

```haml
%p 私は伊藤です
```

pの前に`%`をつけるのがポイントです。

では次の場合はどうでしょうか？

```html
<p class ="name">私は伊藤です</p>
```

タグにクラスをつける場合です。
これは次のように書き換えます。

```haml
%p.name 私は伊藤です
```

`%p`の後に`.name`を追加します。
これでHamlでもpタグにクラスをつけることができます。
これは他のタグでも同様です。
[SwiftUI]リストのアイテム内のボタンが使えない件について

# 詳細
ほとんどタイトルのまんまです。
`SwiftUI`で`List`に複数ボタンを設置した時、`List`のタップイベントが優先されてしまいアイテム内の全てのボタンが同時多発的に作動してしまう。というなんとも使えない状態になってしまうのを見つけたので、解決法をメモ

## どんなふうになるのか
とりあえず簡単にサンプルコードを作成
ビルド&ランしてみる

```ContentView.swift
var count: Int = 0

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                HStack(alignment: .center) {
                    Button("+1するよ") {
                        count += 1
                        print("+1したよ count = \(count)")
                    }

                    Button("-1するよ") {
                        count -= 1
                        print("-1したよ count = \(count)")
                    }
                }
            }
        .navigationBarTitle("\(count)")
        }
    }
}
```

とりあえずこんな感じのができる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363545/aea8ffac-f987-08c6-de4c-a28d767a59fb.png" width=250>

で、`+1ボタン`を押したら、、、

```
+1したよ count = 1
-1したよ count = 0
```

全部起爆しちゃった xD

# 解決法
ってことで解決法がこちら

```ContentView.swift
var count: Int = 0

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                HStack(alignment: .center) {
                    Text("+1するよ")
                    .onTapGesture {
                        count += 1
                        print("count = \(count)")
                    }

                    Text("-1するよ")
                    .onTapGesture {
                        count -= 1
                        print("count = \(count)")
                    }
                }
            }
        .navigationBarTitle("テスト")
        }
    }
}
```

変更部分は、`Button()`を`Text()`にしたのと、`Text()`に`onTapGesture()`と付け加えただけ

これで普通に+1ボタンを押せば、カウントは`1`になるし、-1ボタンを押せば`0`とそれぞれのボタンの動作だけを走るようになる。

# あとがき
SwiftUIで遊んでいたところ、たまたまこの不具合(はたまた仕様?)を発見してタップジェスチャーに処理を書くことで対処したけどなんかもっと他にいい方法あったら是非教えてください:)
RDKitで反応パターンをSMARTSで定義し反応物を生成する

# はじめに
RDKitで、SMARTSで反応パターンを定義し、そのパターンに基づき反応物から生成物を生成してみたい。

# 環境
- Windows 10 
- RDkit 2019.03.3.0

# 方法
参考文献を参考にしてほしい。

# 今回ためしてみた反応
今回は炭素原子の水酸化反応を試してみたい。SMARTSのパターンでいうと以下のようなものになる。

```
[C:1]>>[C:1][OH]
```

反応物は以下の化合物を試してみた。

![query.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/fb31bbea-1d33-a0a7-911a-51500286ad0d.png)


# ソース
ソースは以下の通りだ。反応により生成された生成物を全て画像に出力してみた。

```python
from rdkit.Chem import AllChem
from rdkit.Chem.Draw import rdMolDraw2D
from io import BytesIO
from cairosvg import svg2png
from IPython.display import SVG
from rdkit import Chem

# 画像出力
def generate_image(mol, size, path, name):

    image_data = BytesIO()
    view = rdMolDraw2D.MolDraw2DSVG(size[0], size[1])
    tm = rdMolDraw2D.PrepareMolForDrawing(mol)

    view.DrawMolecule(tm)
    view.FinishDrawing()
    svg = view.GetDrawingText()
    SVG(svg.replace('svg:', ''))
    print(path + "/" + name)
    try:
        svg2png(bytestring=svg, write_to=path + "/" + name + ".png")
    except:
        pass


def main():
    reactant_1 = Chem.MolFromSmiles('COc2ccc1cccc(CCNC(C)=O)c1c2')
    reaction_pattern = '[C:1]>>[C:1][OH]'
    rxn = AllChem.ReactionFromSmarts(reaction_pattern)
    x = rxn.RunReactants([reactant_1])
    for i, mol in enumerate(x):
        print(mol[0])
        try:
            Chem.SanitizeMol(mol[0])
            generate_image(mol[0], (300, 300), "tmp", "metablite_{0}".format(i))
        except:
            print("Error")
            print(Chem.MolToMolBlock(mol[0]))


if __name__ == "__main__":
    main()
```

# 確認
生成物は4つ得られた。1つはサニタイジングする際に電荷の関係でエラーになった。
結果を画像で確認してみよう。

## 生成物1
![metablite_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/fd3981d1-02b0-f0bc-5a4a-4b5205c01cfa.png)

## 生成物2
![metablite_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/28fb7d01-cdc9-1995-8c3d-a9e94d59731a.png)

## 生成物3
![metablite_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/f4e5cf95-89df-eea3-9912-2941edbfd975.png)

## 生成物4
![metablite_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/66408400-f297-55e0-9bc8-4457c105b4e4.png)

## 生成物5(サニタイジング処理で電荷エラーになったもの)
![error_metabolite.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329816/366a0c85-124f-ace0-e7a4-cf27ef838027.png)

#考察
- 生成されたものは予想通りの結果である。
- 芳香環のC原子に対する反応はなかったが、その理由はよくわからない。仕様の確認が必要である(今後の課題）
- いずれにせよ、生成された反応物が、妥当な化合物などうかの判定は必要になりそうだ。

# 参考文献
- [RDKitで化学反応：ケモインフォマティクスにおける反応式の扱い方](https://future-chem.com/rdkit-chemical-rxn/#Reaction_SMILES-2)
- [SMARTS記法とRDKitの化学反応で遊んだ話](https://magattaca.hatenablog.com/entry/2019/02/10/194853)
SQLSTATE[HY000] [1045] Access denied for userの解消

## はじめに
laravelの環境を5.6系から6.0系へバージョンアップした途端、
DBにユーザとパスワード、権限を正しく設定しているにもかかわらず、
phpからphp artisan migrateなどを行っても、下記のエラーでmysqlに接続できない人向けの記事です。

### 動作環境
-laravel 5.6 → 6.0.4へバージョンアップ
-PHP 7.3.12 

```console:エラーコード

In Connection.php line 665:
                                                                                                                                                                            
  SQLSTATE[HY000] [1045] Access denied for user 'host名'@'ip' (using password: YES) 

In PDOConnection.php line 31:
                                                                                                         
  SQLSTATE[HY000] [1045] Access denied for user 'host名'@'ip' (using password: YES) 
                                                                                                         

In PDOConnection.php line 27:
                                                                                                         
  SQLSTATE[HY000] [1045] Access denied for user 'host名'@'ip' (using password: YES) 
                                                                                                         
```

## 解決方法
下記２通りのどちらかの方法により、解決可能です。
１.DBのユーザパスワードに"#"が含まれている可能性が高いので、#がないパスワードを新たに設定し直す。

2.ダブルクォーテーションでパスワードを囲む

````console:.env
DB_CONNECTION=mysql
DB_HOST=ホスト名
DB_PORT=3306
DB_DATABASE=DB名
DB_USERNAME=DBユーザ名
DB_PASSWORD="hoge#"←ダブルクォーテーションで囲む。
````


### 解説
laravel5.8以降、.envファイル内の#は値として認識されないそうです。
そのため、もし.envファイルに記載したDBパスワードに#が含まれていると、値として認識されないせいでパスワードエラーとなり、アクセス出来なかったと考えられます。

参考記事
https://github.com/laravel/ideas/issues/1540
身体に覚えさせよ！ショートカットの忘備録(Excel編)

#Excelのショートカットを書いていく！！


###データの入力
| 反映効果 | コマンド |
| :--- | :--- | 
| セル内のデータを編集する | F2 |
| 同じデータを複数のセルに入力する | Ctrl＋ Enter |
| 上のセルのデータをコピーする | Ctrl＋ D |
| 左のセルのデータをコピーする | Ctrl＋ R |
| 上のセルの値をコピーする | Ctrl＋ Shift＋ 2 |
| 上のセルの数式をコピーする | Ctrl＋ Shift＋ 7 |
| 同じ列のデータをリストから入力する | Alt＋ ↓ |
| フラッシュフィルを利用する | Ctrl＋ E |
| 日付を入力する | Ctrl＋ ； |
| 現在時刻を入力する | Ctrl＋ ： |


###数式の入力
| 反映効果 | コマンド |
| :--- | :--- | 
| 合計を入力する | Alt＋ Shift＋ ＝ |
| セル範囲の名前を入力する | F3 |


###セルの挿入と削除
| 反映効果 | コマンド |
| :--- | :--- | 
| セルを挿入する | Ctrl＋ Shift＋ ＋ |
| セルを削除する | Ctrl＋ ー |


###セルの移動
| 反映効果 | コマンド |
| :--- | :--- | 
| セルA1に移動する | Ctrl＋ Home |
| 表の最後のセルに移動する | Ctrl＋ End |
| 表の端のセルに移動する | Ctrl＋ ↑↓←→ |
| 指定したセルに移動する | Ctrl＋ G |



###セル範囲の選択
| 反映効果 | コマンド |
| :--- | :--- | 
| 一連のデータを選択する | Ctrl＋ Shift＋ ↑↓←→ |
| 表全体を選択する | Ctrl＋ Shift＋ ： |
| 「範囲選択に追加」モードにする | Shift＋ F8 |
| 「選択範囲の拡張」モードにする | F8 |
| 表の最後のセルまで選択する | Ctrl＋ Shift→ End |
| 列全体を選択する | Ctrl＋ Space |
| 行全体を選択する | Shift＋ Space |


###行と列
| 反映効果 | コマンド |
| :--- | :--- | 
| 行、列を非表示にする | Ctrl＋ 90 |

###罫線
| 反映効果 | コマンド |
| :--- | :--- | 
| 外枠罫線を引く | Ctrl＋ Shift＋ 6 |
| 罫線を削除する | Ctrl＋ Shift＋ ＼ |


###文字の書式
| 反映効果 | コマンド |
| :--- | :--- | 
| 文字に取り消し線を引く | Ctrl＋ 5 |


###セルの書式
| 反映効果 | コマンド |
| :--- | :--- | 
| ［セルの書式設定］を表示する | Ctrl＋ 1 |


###表示形式
| 反映効果 | コマンド |
| :--- | :--- | 
| パーセント（％）の表示形式にする | Ctrl＋ Shift＋ 5 |
| 通貨の表示形式にする | Ctrl＋ Shift＋ 4 |
| 桁区切り記号を付ける | Ctrl＋ Shift＋ 1 |
| 標準の表示形式に戻す | Ctrl＋ Shift＋ ^ |



###操作の繰り返し
| 反映効果 | コマンド |
| :--- | :--- | 
| セルに対する操作を繰り返す | F4 |


###数式の表示
| 反映効果 | コマンド |
| :--- | :--- | 
| セルの数式を表示する | Ctrl＋ Shift＋ @ |


###テーブル
| 反映効果 | コマンド |
| :--- | :--- | 
| 表をテーブルに変換する | Ctrl＋ T |


###ピボットテーブル
| 反映効果 | コマンド |
| :--- | :--- | 
| ピボットテーブルを作成する | Alt→ N→ V |


###グラフ
| 反映効果 | コマンド |
| :--- | :--- | 
| グラフを作成する | Alt＋ F1 |


###クイック分析
| 反映効果 | コマンド |
| :--- | :--- | 
| クイック分析を使う | Ctrl＋ Q |


###フィルター
| 反映効果 | コマンド |
| :--- | :--- | 
| フィルターを設定する | Ctrl＋ Shift＋ L |


###グループ化
| 反映効果 | コマンド |
| :--- | :--- | 
| 行、列をグループ化する | Alt＋ Shift＋ → |


###セル範囲の名前
| 反映効果 | コマンド |
| :--- | :--- | 
| 選択範囲の名前を作成する | Ctrl＋ Shift＋ F3 |
| セル範囲の名前を管理する | Ctrl＋ F3 |


###検索と置換
| 反映効果 | コマンド |
| :--- | :--- | 
| データを検索・置換する | Ctrl＋ FH |


###コメント
| 反映効果 | コマンド |
| :--- | :--- | 
| コメントを挿入する | Shift＋ F2 |
| コメントがあるセルを選択する | Ctrl＋ Shift＋ O |


###ワークシート
| 反映効果 | コマンド |
| :--- | :--- | 
| ウィンドウ枠を固定する | Alt→ W→ F→ F |
| 前後のワークシートに移動する | Ctrl＋ PageUpPageDown |
| シートを左右に移動する | Alt＋ PageUpPageDown |
| ワークシートを追加する | Shift＋ F11 |
| ワークシートの名前を変更する | Alt→ H→ O→ R |
| ワークシートを削除する | Alt→ H→ D→ S |
Symfony4のdoctrineでmake:migrationしても変更を検知しない場合

# はじめに

symfony4.4のdoctrineの説明をみながらマイグレーションを操作した。

[Migrations & Adding more Fields](https://symfony.com/doc/4.4/doctrine.html#migrations-adding-more-fields)で追加したdescriptionカラムの変更を、doctrineは検知をせず、以下のように無情な回答。

```bash
php bin/console make:migration

 [WARNING] No database changes were detected.
```

操作した内容をどこかに記録していると予想していたけど、調査したら、var配下のCacheに保存をしている模様。

以下のようにキャッシュをクリアしたら。。。

```bash
php bin/console doctrine:cache:clear-metadata

 // Clearing all Metadata cache entries


 [OK] Successfully deleted cache entries.
```

正常にマイグレーション用のファイルを作成しました！！

```bash
php bin/console make:migration
 
  Success! 
 
 Next: Review the new migration "src/Migrations/Version20191123063407.php"
 Then: Run the migration with php bin/console doctrine:migrations:migrate
 See https://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html
```

# おまけ

参考文献にある、以下のコマンドを実行したら、強制的にDBにカラムが追加をされていました。


```bash
php bin/console doctrine:schema:update --force

 Updating database schema...

     1 query was executed
```

こちらはEntityからSQLを作成して、即実行をするコマンドでした。

```bash
php bin/console doctrine:schema:update --help 
・・・
  Alternatively, you can execute the generated queries:
  doctrine:schema:update --force
```

# 参考文献

* [Symfony entities are not updated in database after changes](https://stackoverflow.com/questions/54653958/symfony-entities-are-not-updated-in-database-after-changes)
イニシャライザ(init)について

イニシャライザについて勉強したため、備忘録としてここに記す。

#initとは
イニシャライザとは、インスタンスを生成するときに呼び出されるinitメソッドのことである。イニシャライザの中でプロパティ値を設定すれば、プロパティを宣言すると同時に値を代入しなくても良くなる。

#メリット１、複数回使用する引数の場面
クラスに数多のメソッドがあり、どの場面でも同じような引数がある時に何度も同じ引数を使うのは面倒ですよね？
initを使うことでインスタンス生成時に値を入れてあげるだけで済むのでコードが冗長的にならなくスッキリしたコードを書くことができる

```swift

// 呼び出し側
func sa() {
        let a = CsutomView.init(storeDate: "a", storeName: "a")
        let g = a.test()
        let to = a.test1()
       }

```


```swift

let storeDate: String
let storeName: String
    
    init(storeDate: String, storeName: String) {
        self.storeDate = storeDate
        self.storeName = storeName
    }
    

func test() -> String {
        let a = storeName
        let b = storeDate
        return a
    }
    
    func test1() -> String {
        let a = storeName
        let b = storeDate
        return b
    }
```

#メリット２、絶対必要なプロパティを漏れがなく一目で確認できる
クラス内で複数のメソッドが存在し全ての引数を確認するのは面倒ですよね？
上部で確認できれいてばちゃんと値を渡せているか明確なので分かりやすい。

#メリット３、まとめて初期化したい場合
値が決まっていない時やまとめて初期化したい時は便利ですし、完全に初期化されてることが保証できます。


随時更新
[python]リスト内の文字列を含むツイートをしたユーザのリストを作成する


#目的
 薬剤名のリストが用意してあります。このリストに含まれる薬の名前を含むツイートを検索します。リストに含まれる全ての薬剤について、繰り返し処理します。
検索結果のツイートをしたユーザーのユーザーID(screen_name)を、リストに取得するのがゴールです。

ちなみに、薬のリストはこんな感じです。

```python:medicine_list
medicine_list=['アミトリプチリン', 'イミプラミン', 'スルモンチール', 'アナフラニール', 'アモキサン', 'アンプリット', 'プロチアデン', 'ルジオミール', 'クロンモリン', 'マプロミール', 'テトラミド', ...(中略)...,'リフレックス', 'レメロン', 'スルピリド', 'ドグマチール', 'ミラドール', 'アビリット', 'マーゲノール', 'ベタナミン']
```

また、今回はできるだけbotを避けたいと考え、screen_nameに文字列'bot'を含むアカウントは、取得しないことにしました。

#準備
・ツイッターAPIを登録する。
　　参考：https://qiita.com/kngsym2018/items/2524d21455aac111cdee
　こちらの記事にお世話になりました。

#特定ワードを含むツイートの取得
```python:使用コード
import json
from requests_oauthlib import OAuth1Session


CK = "*******" #API key
CS = "*******" #Consumer_secret
AT = "*******" #Access_token
ATS = "*******" #Access_secret
twitter = OAuth1Session(CK, CS, AT, ATS)

url = 'https://api.twitter.com/1.1/search/tweets.json' #ツイート検索用

users = [] #検索したscreen_nameを格納するリスト

#関数の作成（入力が薬剤名リスト、出力がユーザー名のリスト）
def screen_name_from_medicine(medicine_list):
    for i in range(len(medicine_list)):
        medicine = medicine_list[i] #薬剤名リストから薬剤名を取り出す
        params = {'q': medicine, #この薬剤名を含むツイートを検索
                  'result_type':'mixed', #ツイート検索はランダム（新しい順などではない）
                  'count': 20, #一つの薬剤名あたり取得するツイートの数
                  'lang':'ja' #日本語のツイートを検索
                 }

        req = twitter.get(url, params = params)

        if req.status_code==200: #もしresponseが成功なら、req.status_code=200である
            res = json.loads(req.text)
            for line in res['statuses']:
                screen_name=line['user']['screen_name']
                if ('bot' not in screen_name) and (screen_name not in users):
                 #screen_nameに'bot'を含む物はusersリストに含めない
                 #usersリストに重複がないようにする
                    users.append(screen_name)

#関数の使用
screen_name_from_medicine(medicine_list)
#作成したリストを出力
print(users)
```

#使用環境
・jupyter-notebook
・macOS Catalina

#参考記事
https://qiita.com/tomozo6/items/d7fac0f942f3c4c66daf
sh上で動くスタック指向言語を作った

shの戻り値が貧弱すぎる問題ついて考えているうち、[shにスタック指向言語らしきもの](https://github.com/opiliones/oyster)を埋め込んでいた。後半見るように文字列の戻り値を返す方式さえあれば、shにコレクション型もレコード型も後から追加可能である。

## コード例

```
$ , 1 , 2 p
, 1 , 2
$ plus , 3 , 1 p
, 3 , 3 , 1
$ minus mul p
, 6
```
## 説明

* "," は次の値をスタックにプッシュすることを表す。
* "p" はforthの "." のようにスタックの状態を表示する。
* "plus" はスタックを2つ取って和をスタックに積む。"minus" (差), "mul" (積)も同様。

## 仕組み

いきなり残念なお知らせだが、shは適用型言語なので行の最初はコマンドであり、データではない。何が言いたいかというとforthのような以下のコードはかけない。

```
1 2 + 3 1 - *
```
しかも、shellには型がないのでコマンドと文字列を判別する方法がない。そのため、引数をデータだとみなす関数を一つ作成する。

```
$ func 1
$ p
, 1
```
要するにこれはpushである。プッシュが行われるとスタックの1番目を表す変数STACK1に1がセットされる。push関数に対しaliasを張り "," コマンドを作成する。

```
$ , 1
$ p
, 1
```
あとは改行なしにコマンドを繋げることができればよい。

```
$ , 1 , 2
```
上記のコードでは "," コマンドの第２引数以降に残りのコマンドが渡るので、第２引数以降をevalすればよい。

```
$ , 1 , 2 plus , 3 , 1 minus mul p
      ---------------------------- この部分をeval
```
## コレクション型
コレクション型をスタックするコマンド ",[" を追加する。

```
$ ,[ apple , "'apple'" , "red apple" ] p
, apple \'apple\' 'red apple' 
$ , 1 index p
, 'apple'
$ unit p
, \'apple\' 
$ , orange cons p
, orange \'apple\' 
$ , banana add p
, orange \'apple\' banana 
$ , 2 drop p
, banana 
```

mapもfilterもある。
※"cmd1" は引数にスタックを1つ分加えて実行する。

```
$ ,[ apple , "'apple'" , "red apple" ] , 'dup cmd1 echo' map
apple
'apple'
red apple
$ ,[ apple , "'apple'" , "red apple" ] , 'dup , "* *" match' filter p
, 'red apple' 
```

以下のコードは連想リスト的なものを作成してlookupする。

```
$ ,[[ apple , 150 ] ,[ orange , 98 ] ,[ banana , 100 ]] , orange lookup p
, 98
```

## レコード型
レコード型を定義する関数 "data" を追加する。

```
$ data human name age blood_type
```
これにより、human型データをスタックするhuman関数が作成される。
※"var_" はスタックを引数に代入するコマンドである。

```
$ , taro , 18 , A human
$ var_ human1
$ , "$human1" name p
, taro
$ pop , "$human1" , jiro set_name p
, human jiro 18 A
```
別のレコード型で同一フィールド名を使用しても適切にディスパッチされる。

```
$ data animal type weight length
$ data bird weight length
$ , snail , 50 , 10 animal var_ snail
$ , 1000 , 25 bird var_ bird
$ , "$bird" weight p
, 1000
$ pop , "$snail" weight p
, 50
```


##適用型スタイル
いちいちスタックに置くのもまどろっこしいものは引数として渡せる。
通常の関数は最後に "_" をつけると適用型スタイルで呼び出せる。

```
$ , 1 + 1 x 3 p
, 6
$ unit add_ A map_ 'dup cmd1 echo'
6
A
$ popall
$ human_ taro 18 A  set_age_ 19 p
, human taro 19 A 
```
##関数合成
aliasで関数合成ができる。

```
$ alias sqrt='dup mul'
$ , 2 sqrt p
, 4
```

##再帰
再帰用にlinrec、tailrec、binrecを用意している。

###階乗

```
$ , 5 , 'dup le_ 1' , '' , 'dup - 1' , mul linrec p
, 120
```
###フィボナッチ数列

```
$ , 6 , 'dup le_ 2' , 'pop , 1' , '- 1 dup - 1' , plus binrec p
, 8
```
## ただし
速度は20分の1になる。
SDLアプリコンテスト 2019 エントリーを振り返って

## はじめに

ひょんなことからご縁をいただき、SDLハッカソンの運営を主催したり、お手伝いさせていただきながら、２回目のSDLアプリコンテストが終わりました。

クルマとスマホを仲良くするSDLアプリコンテスト  2019
https://sdl-contest.com/

SDLとは、SmartDeviceLink の略で、クルマの車載機（ナビっぽい画面）に、スマホからアプリを再生できたり、車両情報（スピードやオイル残量などなど!）をアプリでとりあつかえる仕組みです。


## つくったものは、こちら。

### SDLratch 〜 クルマはでっかいおもちゃなのだ 〜 

[![sdlratch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/b9e6acef-4edf-749a-e21f-2e8fa3cfe659.png)](http://hisayan.com/prototypes/sdlratch/)

**SlideShow**
http://hisayan.com/prototypes/sdlratch/

**PDF**
http://hisayan.com/prototypes/sdlratch/sdlratch_with_note.pdf

子どもたちがワクワクしながら、クルマと遊ぶ仕組みです。

速報記事にしていただいたのはこちら。

https://k-tai.watch.impress.co.jp/docs/news/1220346.html

どうやら、当日夜の、ワールドビジネスサテライトでも、一部、放映されていたようだ。

■ 結果は、特別賞！！

![表彰状](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57516/f33b843f-970a-b8fc-d8c4-1bf300888fb3.jpeg)

結果はというと、特別賞の3作品のひとつに選んでいただきました。いぇ〜い！！

昨年おこなわれた1回目のSDLアプリコンテストは記念参加、、、は失礼な表現かもしれませんが。そういう感じでした。
ですが、この2回目は、わりと真面目にとりくんでいたので、グランプリほしかったな〜。ちょっと残念。

でも、まぁ、しかたないや。

グランプリに選ばれた作品も、とてもよかった。

ただひとつ反省点というか、
ぼくの作品に、やっぱり評価しづらいポイントがあったかなぁと思ったのは、
「安心・安全」に関しては、疑わしきは罰せず、ではなく、『疑わしきは予め罰せねば』
な、業界であり時代であることを、甘く見ていたということでしょうか。

運転事故って、命に関わりますもんね。

うっかりはすべて排除しなければならない。うん。大事だ。

具体には、新法律で、スマホながら運転はもちろんNGで厳罰化されたのだけど、ナビ画面のちら見程度を、ぼくははオッケーと理解していて、今回の作品はセーフだろうと思っていた。

とはいえ、チラ見も、それは凝視にも通づるかもしれない。と判断するほうが、より安全ってことを最認識できた。

整理整頓してみると、運転手がナビ画面をチラ見したくなるかも？な作品にもかかわらず、特別賞をいただけたということで、その判断に感謝しなければいけないくらいなのかもしれないなぁ、とも感じております。

本当に、評価いただき、ありがとうございました。

※ なにかしらリーズナブルな、チラ見防止のアイデアないかしら？


## つくろうと発想に至った観点や経緯

・大きな声では言えませんが、現時点の SDL SDK および SDL開発キットは、びっくりするほど煩雑です。
　それを活用してアプリつくるひとたち、すごいよ！ ほんとに。
　そんな状況を、なんとかして、超簡単にしたかった。
　SDLデベロッパーコミュニティーの底上げを担う！とかいうとおこがましいですが、なんだかそんな、へんてこな使命感が芽生えていたような気がします。

・そもそも、こどもたち＆プログラミングという領域に、興味があった。

・傾向と対策として、応募作品は、ビッグデータ系や、とにかく地図に表示してみたり、安心・安全を追求するようなものが、ほとんどになるだろうなぁ。とは予測していた。まったく違う発想で、たった一台からでも使えて、だれとも被らなさそうなものをつくりたかった。

・技術的に遠き未来（といっても１年先とかだけど）のことじゃなく、明日にでもリリースできるようなアプリをつくりたかった。自動車メーカーさんが、一歩踏み出してくれれば、、、という注釈はつきますが、それは全作品おなじだし。（決勝にのこった全１０作品で、明日からでも、ほんとうの意味で使える・動く仕組みなものは、数作品ではなかったかしら。でも、そこは応募要件にも「動くこと」は重要視されていないから、まぁ、うん）

・とにかく、ワクワクするものをつくりたかった。


## まとめ

クルマをいじるのは、物理系でも、電脳系でも、おもしろいよ。

第３回もSDLアプリコンテストが開催されるらしい。

SDL開発環境はほんとうに煩雑で大変なんだけど、第１回より、第２回のほうが、開発環境もぐっとよくなってはきたし、仕上がってきた作品レベルも、とっても高くなっていた。

もっともっと、たのしくなっていく気配は十二分にある。

第３回目のSDLアプリコンテストに、みんな興味を持って、応募しよう！

クルマをいじるのは、物理系でも、電脳系でも、おもしろいよ。

大事なことなので、２回。


## 実現したい！

ほんとうに、なんとか応援していただけないかしら。自動車メーカーさま。m(..)m

次のSDLアプリコンテストは、SDLratchでキッズ部門つくろうよ！！


## 謝辞

めっちゃプレゼン中の動画がたすかった。
おかげさまで、伝えたいものを、伝えられた気がします。

出演者さんたちと、撮影班に感謝。
そして、撮影を見守りながら、その脇でワイン飲んでたひとたちにも、なんとなく感謝。

もちろん、今回のコンテストを開催いただいた、すべての方にも、貴重な機会をつくっていただき、ありがとうございました。

## 小ネタ

プレゼン直前に「プレゼンで気をつけることメモ」みたいなの書いてみたんですね。
https://qiita.com/hisayan/items/40c01b0061903a825f02
そしたら、プレゼン中、せっかくの動画がフリーズしやがるんですよ。
まいったよ。
長いプレゼン人生（ってなんだ？）で、ほぼ初じゃないかしら。

フラグの神様って、やっぱりいるんだなぁと思ったのでした。

おしまい。
これからUE4を学ぶのに良さそうなサイト　【UE4】

公式
-------------
[UE4を始めよう](https://docs.unrealengine.com/ja/GettingStarted/index.html?utm_source=launcher&utm_medium=ue&utm_campaign=uelearn)
[アンリアルエンジン用語](https://docs.unrealengine.com/ja/GettingStarted/Terminology/index.html)
[Unity 引っ越しガイド](https://docs.unrealengine.com/ja/GettingStarted/FromUnity/index.html)
[UE4コミュニティ](https://answers.unrealengine.com/index.html)

参考になる記事
---------------
[ブループリント入門](http://unrealengine.hatenablog.com/entry/2014/05/05/204403)
[スライド](https://www.slideshare.net/masahikonakamura50/1ue4?ref=http://mugenvr.hatenablog.com/)

2019年初心者おすすめの参考書
--------------
[作れる！学べる！Unreal Engine 4 ゲーム開発入門](http://uebeginner.jp/)

その他
--------------
[UE4 でログ出力を確認する](https://qiita.com/maprog/items/4e1765567bbe0e23d894)
[UE4 ゲームジャムおすすめアセット！](http://unrealengine.hatenablog.com/entry/2017/01/18/000336)
[弾丸を発射するブループリント](http://yumadogidogi.hatenablog.com/entry/2015/12/26/173753)
随時更新していく


公式で一つづつこなしていくのが良さそう。
AKBONE 2019年版 開発環境設定

STM32やESP32を使って、教育用コンテンツを作っていますが、Arduino開発環境としてポータブル環境化したAKBONEを使うことにしました

# AKBONEについて
AKBONEは、日本Androidの会秋葉原支部ロボット部が開発しているトレーニングキットです。
オリジナルバージョンの Ardublock [http://blog.ardublock.com](http://blog.ardublock.com)を使い、Portable環境として配布しています。

ほぼ毎年毎に使用ボードを更新していて、2019年版は以下の構成になっています。

AKBONE Release7 (ターゲットボード：STM32 Cleaner／STM32F103VBT6 + ST-LinkV2)

この記事では、AKBONE 2019 年版である Release7 の開発環境について説明します。

# インストールしたもの

- Arduino 1.8.10
- STM32-Arduino

## ライブラリ
- Adafruit GFX Library
- GxEPD2 (GoodDisplay e-Ink ディスプレイ用ライブラリ)


USBCompositeはしなくてもいいみたい。

# 設定方法

Arduino 1.8.10版
以下からダウンロード。
https://www.arduino.cc/en/Main/Software
Windows/Mac/Linux のいずれか。なお、Wndows要ははZIP版を用いる。

ダウンロードしたものを展開する。
フォルダ名 Arduino−1.8.10_AKBONE に格納する。
このフォルダの中に以下のようなものがあるようにする。


```

 lib        revisions.txt
arduino                  hardware    libraries  tools
arduino-builder          install.sh  tools-builder
...

```


## portable設定

portableフォルダをArduino−1.8.10_AKBONE内に作成。
Macの人は巻末の「Macでポータブル環境設定」を参照してください

## 起動する

Arduino−1.8.10_AKBONEフォルダ内 Arduinoをダブルクリックして起動


## STM32_Arduino を設定

https://qiita.com/lowlevel/items/0fd3402e0dd4584de65f

## ライブラリを設定

https://qiita.com/nanbuwks/items/25ccb1ac38ebb237f94a

# おまけ1  トラブルシュート


https://create.arduino.cc/example/library/tft_1_0_6/tft_1_0_6%5Cexamples%5CArduino%5CTFTDisplayText/TFTDisplayText/preview

これをしようとしたらいろいろエラーになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c97eba97-2a47-7e92-4037-094814e9108a.png)


```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/15e53d2f-54b7-8b02-209d-93810c84fe8d.png)
/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.10_AKBONE/libraries/TFT/src/utility/Adafruit_ST7735.h:30:26: fatal error: avr/pgmspace.h: No such file or directory
compilation terminated.
```

と出る。

```

https://github.com/SodaqMoja/Sodaq_DS3231/issues/5
```

これを参考にして、

```

#if (defined(__AVR__))
#include <avr\pgmspace.h>
#else
#include <pgmspace.h>
#endif
```
と設定した。

```

/home/nanbuwks/Downloads/ardublock/arduino/linux64/arduino-1.8.10_AKBONE/libraries/TFT/src/utility/glcdfont.c:3:20: fatal error: avr/io.h: No such file or directory
compilation terminated.
```
更にエラーが続くので同様に直していくこと。


# おまけ２ Macでポータブル環境設定


（以下のようにしましたがうまくいきませんでした。以下デバッグのために残しておきます）

``

cd ~/...(フォルダを作った場所に移動).../arduino-1.8.10_AKBONE
cp -r /usr/local/arduino ./
```

次に、以下のシェルスクリプトを作成、実行する

```

touch arduinoportable.command
chmod arduinoportable.command
```


```

#!/bin/bash
export PATH_Backup=$PATH
export PATH=(...):$PATH
~/...(フォルダを作った場所に移動).../arduino-1.8.10_AKBONE
./arduino

```
身体に覚えさせよ！ショートカットの忘備録(windows編)

#良く使うショートカットの忘備録(windows編)

###スタート画面
| 反映効果 | コマンド |
| :--- | :--- | 
| スタートメニューを表示する | Windows |
| デスクトップを表示する | Windows＋ D |
| Cortana（コルタナ）を起動する | Windows＋ S |
| 設定画面を表示する | Windows＋ I |
| アクションセンターを表示する | Windows＋ A |
| Windows Ink Workspaceを起動する | Windows＋ W |

###アプリの起動
| 反映効果 | コマンド |
| :--- | :--- | 
| タスクバーからアプリを起動する | Windows＋ 1～ 0 |

###画面の切り替え
| 反映効果 | コマンド |
| :--- | :--- | 
| アプリやウィンドウを切り替える | Alt＋ Tab |
| タスクビューを表示する | Windows＋ Tab |

###仮想デスクトップ
| 反映効果 | コマンド |
| :--- | :--- | 
| 仮想デスクトップを追加する | Windows＋ Ctrl＋ D |
| 仮想デスクトップを切り替える | Windows＋ Ctrl＋ ←→ |
| 仮想デスクトップを閉じる | Windows＋ Ctrl＋ F4 |

###基本操作
| 反映効果 | コマンド |
| :--- | :--- | 
| 操作を元に戻す | Ctrl＋ Z |
| 元に戻した操作をやり直す | Ctrl＋ Y |
| すべての項目を選択する | Ctrl＋ A |
| 複数の項目を選択する | Shift＋ ↑↓←→ |
| 選択した項目を切り取る | Ctrl＋ X |
| 選択した項目をコピーする | Ctrl＋ C |
| 切り取り、コピーした項目を貼り付ける | Ctrl＋ V |
| クリップボードの履歴を表示する | Windows＋ V |
| 新規ウィンドウを開く／ファイルを作成する | Ctrl＋ N |
| ファイルを保存する | Ctrl＋ S |
| ファイルを開く | Ctrl＋ O |
| ファイルを印刷する | Ctrl＋ P |
| ショートカットメニューを表示する | Shift＋ F10 |

###ファイルとフォルダー
| 反映効果 | コマンド |
| :--- | :--- | 
| エクスプローラーを起動する | Windows＋ E |
| アイコンの表示形式を変更する | Ctrl＋ Shift＋ 1～ 8 |
| 前のフォルダーに戻る | Alt＋ ← |
| 戻る前のフォルダーに進む | Alt＋ → |
| 親フォルダーに移動する | Alt＋ ↑ |
| ファイルやフォルダーの名前を変更する | F2 |
| 新しいフォルダーを作成する | Ctrl＋ Shift＋ N |
| ファイルやフォルダーを検索する | Ctrl＋ F |
| リボンを表示にする | Ctrl＋ F1 |
| 離れている複数の項目を選択する | Ctrl＋ ↑↓←→→ Space |
| ファイルやフォルダーを完全に削除する | Shift＋ Delete |
| ウィンドウを閉じる | Alt＋ F4 |
| プロパティを表示する | Alt＋ Enter |
| プレビューパネルを表示する | Alt＋ P |
| アドレスバーに履歴を表示する | F4 |


###ウィンドウの操作
| 反映効果 | コマンド |
| :--- | :--- | 
| ウィンドウのメニューを表示する | Alt＋ Space |
| ウィンドウを最大化・最小化する | Windows＋ ↑↓ |
| ウィンドウを左半分・右半分に合わせる | Windows＋ ←→ |
| すべてのウィンドウを最小化する | Windows＋ M |
| ウィンドウを閉じる	Ctrl＋ W |


###画面
| 反映効果 | コマンド |
| :--- | :--- | 
| 画面の表示モードを選択する | Windows＋ P |
| スクリーンショットを撮影する | PrintScreen |
| スクリーンショットを撮影して保存する | Windows＋ PrintScreen |
| 指定した範囲のスクリーンショットを撮影する | Windows＋ Shift＋ S |


###システム
| 反映効果 | コマンド |
| :--- | :--- | 
| ［ファイル名を指定して実行］を表示する | Windows＋ R |
| ［タスクマネージャー］を表示する | Ctrl＋ Shift＋ Esc |
| パソコンをロックする | Windows＋ L |
| クイックリンクメニューを表示する | Windows＋ X |
Fragmentでの遷移（スタック積む）してバックキー制御について

*学習メモです。

#FragmentからFragmentへ（スタックをつむ）

そもそもスタックを積むとは
フラグメントの上にフラグメントがくるようなイメージです。
画面（Fragment）を重ねる感じです。

```sample.kt
fragmentManager: FragmentManager  = getFragmentManager()
// BackStackに積む
fragmentManager.addToBackStack(null)
// １つ前に戻る。
fragmentManager.popBackStack()
```

#バックキー制御について
Androidについてるバックキーの制御方法

利用にはandroidxのappcompat:1.1.0以上、activity:1.0.0以上が必要です。

```app/build.gradle
dependencies {
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'
    implementation 'androidx.activity:activity:1.0.0-alpha06'
}
```

##使い方
今までの書き方は省略します。
以下のようにします。


```Fragment.kt

class EndFragment : Fragment() {
    val mainActivity: MainActivity
        get() = (activity as MainActivity)
    var isOverrideBack = false

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        mainActivity.onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback {
            override fun handleOnBackPressed(): Boolean {
                if (isOverrideBack) {
                    //tureを返すとなにもしないので、バックの制御など書いたりできる。
                    //isOverrideBackをどこかの処理でtrueにして、バックキーが押されたタイミングでアラートを表示とかもできそう。
                    return true
                }else {
                    // 先ほど積まれたスタックがあれば１つ戻る。
                    return false
                }
            }
        })
    }
}

```

工夫できる点ありましたら、コメントいただけると幸いです。

参考記事
https://qiita.com/tarumzu/items/d6b18447ad24b5b5bfa2
http://androhi.hatenablog.com/entry/2019/01/31/201235
PostgreSQL UPSERT　重複時更新or Insertしない

MySQLで`on duplicate key update`というinsertしようとしてデータ存在したらupdataする便利な機能あります。
`UPSERT`といって同じデータあったら（制約ではじかれたら）`UPDATE`するとか、`エラー出さないで終了させる`とか。

いちいちpythonとかの条件式で書く必要もなく、SQLでやれるのでスマート。


Pyhonで`Postgresql`に保存しようとして同じような機能がないかなと思いメモします。

ついでにMySQLだとこんな感じ
[MySQL INSERT重複あるならUPDATEかIGNORE](https://qiita.com/Bashi50/items/1ec2e4556c7c04189b96)

# テーブル構造

CREATE TABLE sampletable
(
facility_no character varying(20) NOT NULL,
date_time timestamp with time zone NOT NULL,
error character varying(20),
CONSTRAINT upsert_pk PRIMARY KEY(facility_no, date_time)
);

今回`upsert_pk`という制約名を付けています。
つけない場合調べましょう。


# 制約名調べ
```
SELECT table_name, constraint_name, constraint_type
FROM   information_schema.table_constraints
WHERE  table_name='sampletable';
```

PGAdminでの表示

![upsert.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260345/5b80ebae-99d1-1239-bb80-67f580c6141d.png)


今回は`upsert_pk`とつけたのでこれを使います。

# SQLでInsert

```upsert.sql
INSERT INTO sampletable VALUES ('machine1','2019-11-15 12:00:00', NULL)
ON CONFLICT ON CONSTRAINT upsert_pkey
DO UPDATE SET error='重複';
```

1行目は普通のINSERT。
2行目`upsert_pkey`のエラー出たら
3行目errorカラムに`重複`と登録

# Insertで重複起きたらError起こらなければいい場合

```upsert.sql
INSERT INTO sampletable VALUES ('machine1','2019-11-15 12:00:00', NULL)
ON CONFLICT DO NOTHING;
```

1行目は普通のINSERT。
2行目エラー出たら何もしない


# Pythonで


```upsert.py
import psycopg2
from psycopg2  import extras

# accountに情報入れていること想定
connection_info = f'''host={account['hostname']}
        port={account['port']} dbname={account['database']}
        user={account['username']} password={account['password']}'''

conn = psycopg2.connect(connection_info)
cur = conn.cursor()

sql = "INSERT INTO public.sampletable VALUES %s ON CONFLICT DO NOTHING;"
extras.execute_values(cur, sql, insert_list)
conn.commit()
cursor.close()
conn.close()
```
ゲームに登場するオブジェクトをリストで管理すると人生が楽になる 【Unity】

### ゲームに出てくるオブジェクトの時間を全て止めたい時などに便利です

1.リストに登録削除を命令するスクリプトをリストに登録したいオブジェクトに取り付ける

    public class GameComponent : MonoBehaviour
    {
        protected void Awake()
        {
            // リストへ登録
            GameComponentManager.AddList(this);
        }

        protected void OnDestroy()
        {
            // リストから削除
            GameComponentManager.RemoveList(this);     
        }
    }


2.オブジェクトを管理するリストを作る。(シングルトンで作りましょう)

     public static class GameComponentManager 
     {
        static List<GameComponent> m_gameComponents = new List<GameComponent>();

        public void OnUpdate()
        {
            for (int i = 0; i < m_gameComponents.Count; i++)
            {
                m_gameComponents[i].OnUpdate();
            }
        }

        public void OnLateUpdate()
        {
            for (int i = 0; i < m_gameComponents.Count; i++)
            {
                m_gameComponents[i].OnLateUpdate();
            }
        }

        public void AddList(GameComponent component)
        {
            m_gameComponents.Add(component);
        }

        public void RemoveList(GameComponent component)
        {
            m_gameComponents.Remove(component);
        }
    }


####  これでオブジェクトを管理するリストの基盤ができました。
上手く拡張していけば色々なことに使えそうです。
Vue.js、ElementUIで作ったページをモバイルで開いてデザイン崩れた話。

# 背景
サーバーレスで自分用の家計簿的なwebサービスを勉強も兼ねて開発中。[前の投稿](https://qiita.com/silverbox/items/c97b29deca10988737d4) で編集ダイアログの開発が終わった。が、問題発覚。

# 問題
自分のPCで開発している時には何の問題もなし（ちょっとデザイン改善したいけど）。
![dialog_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530376/2636b296-2d72-abc7-1dc4-cbf92a66cc45.png)

が、デプロイして、自分のモバイルで見た時に問題発覚。デザインだだ崩れ。
![dialog_mobile_pickup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530376/09414ce8-bfd1-a422-245c-bec99bbdeb71.png)

データの編集自体は出来る。が、自分が使うだけという条件を加味してもこの崩れは許容しがたい。ポイントは２つ。

- ボタンが2列になってる。
- 日付入力の幅が変

# 対策開始

- 日々の入力、更新はモバイルになる予定(将来PCメインで使用する色々分析画面付けるかもしれないが)。
- モバイルに合わせるとPC側が寂しいのでデバイスによって分けたい。
- 理想的にはPC用とモバイル用で別ページ作ってしまう事。
- 操作性までPC用とモバイル用で分ける程の画面ではない。

という事を考えていたら、**レスポンシブWEBデザイン**、**メディアクエリ**という技術を知る。デバイスの種類、画面幅によってcssなどを切り替えられるらしい。

#### 変更ポイント探り

画面サイズによって切り替えるとしても、コンポーネントで指定されている値を修正するので、その上書きポイントを探る。ChromeだとF12の開発者モード。

開発者モードのエリアの左上にあるボタンでモバイル表示モード。画面上部でサイズ指定。モバイルボタン横にある要素指定モードにしてからダイアログのDOM要素を探し、そのデザインcssを右エリアで確認。
![dialog_mobile_developer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530376/7749f783-b8c9-07c7-cfae-43a340cbd4ac.png)

index.css にて、 el-dialog クラスに**width:50%** が指定されているのが原因。
同様に、日付入力コンポーネントの幅指定をしているものを探す。
index.css にて、**.el-date-editor.el-input, .el-date-editor.el-input__inner**に、 **width: 220px;**が指定してあるのが原因。

モバイルの場合、ダイアログ幅は280px程度、その状態で、日付入力が160px程度がよさそう。切り替えは、画面サイズ640px以下としようと思います。

#### 実装
**style scoped**タグ配下に書けば行けるかと思ったけど、どうも他コンポーネントを直接指定するのは出来ないっぽい。多分コンパイル対象から外れる。しかも、el-dialogは、DOM構成がtemplateと実際とで変わる様子。とはいえグローバルのcssで指定するのは避けたい。色々調べてみたら、どうやら**>>> コンビネータ**を使うとよいらしい。ネストダイアログも無いので大丈夫そう。

ダイアログTemplateの一番外のタグにclass属性追加。

```vue
<template>
  <el-dialog title="入力" :visible.sync="slipDialogVisible" class="slipinputdlg">
  <!-- 中略 -->
  </el-dialog>
</template>
```

そのクラスの配下、という形で指定。**\<style scoped\>**タグ配下で、以下指定。

```css
@media (max-width:640px) {
  .slipinputdlg >>> .el-dialog {
    width: 280px;
  }
  .slipinputdlg >>> .el-date-editor.el-input, .el-date-editor.el-input__inner {
    width: 160px;
  }
}
```

参考ページ
[Vue Componentのstyleを上書きするには](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html)
[スコープ付き CSS](https://vue-loader-v14.vuejs.org/ja/features/scoped-css.html)

# 結果
![dialog_mobile_aft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530376/b6e1130b-f3b4-0d18-03af-ae5f7529fc84.png)
直りました！ちゃんとこのダイアログ中のel-dialogクラスだけ幅指定されるようになってますね。

# 感想
- このダイアログに限らないが、ちょっと複雑な事をしようとすると、 javascriptとか html とか css とかの webページ基本知識が必要になってくる（と思う）。
- Element.uiはモバイルの画面幅は考慮されてなさそう。とはいっても、下手に考慮しようとしてもかえってカオスになるか・・