OmniAICreator/Qiita-1.07M huggingface dataset:
linux(ubuntu)メモ

#そもそも何？
[公式] (https://www.ubuntulinux.jp/ubuntu)参照
要するにlinuxとお友達なOSのイメージ
今回はver18.04の設定で

# bash
基本はlinux系のだと思う備忘録兼ねて

| 説明               | cmd($省略)                 |
| ---------------- | ------------------- |
| シャットダウン          | shutdown -h now     |
| ファイルをエクスプローラーで開く | xdg-open filename   |
| OS info                          | cat /etc/os-release |
| パッケージチェック                 | sudo apt-get check  |
|パッケージ依存関係修復|sudo apt-get -f install|
|絶対パス取得|readlink -f hoge.sam|
|環境パス確認|printenv|
|インストールしたもの確認|dpkg --get-selections|
|パスワード変更|sudo passwd `<username>`|
|パスワード変更|sudo passwd `<username>`|
|画面録画|Alt+Ctrl+Shift+R|


# bash command

### zipファイルの中身確認(zcat)
圧縮ファイル中身を表示

```bash

zcat <圧縮ファイル名>
```

### ファイルを探す(find)
ファイル検索

```bash

## 完全一致
find --name <ファイル名>

## 部分一致
find --name "*<ファイル名一部>*"
```

### mv
ファイル移動とか

```bash
mv <対象ファイル> <移動先>
```

### rm
ファイルの削除とか

```bash
#単一ファイル削除
rm <file name>

#ディレクトリ削除
rm -r <dir name>
```

### pwd
現在ディレクトリの表示

```bash
pwd
/hogehoge
```
### cp
ファイルコピー

```bash
#普通のファイル複製
cp <ファイルA> <ファイルB>

#ディレクトリコピー
cp -r <dirA> <dirB>
```

### ls
階層内の情報を確認

```bash
# 通常
ls 

# 詳細情報付き
ls -ltar

# 検索条件制限したい場合は
ls -ltar *.csv

```

## 小技

```bash 
#一括移動(cpでもok)
mv * ../
```



# Extension
手間がかかったもの、使えそうなものをメモ

## slack
Ubuntuのversionが18.04だと脳死でインストールすると日本語打てないらしいので
[公式](https://slack.com/intl/ja-jp/downloads/linux)から圧縮ファイルとって
[こちらの記事](https://qiita.com/akjgskwi/items/a65d396e353e31f235d2)を参考にインストールすれば
解決した



## Albert
エンジニアさんに教えてもらったツール
便利。使いこなすためにまずはインストールから
[この記事](https://www.virment.com/how-to-setup-albert-ubuntu/)がわかりやすくておすすめでした。

## Tweaks
ubuntuの見た目が結構お手軽に変更できる拡張機能
[この記事](https://www.virment.com/customize-ubuntu-looks/)から読んで色々設定しました。
dataloaderで日付が空の項目をフィルターする

Dataloaderを使う時に日付のフィルターでタイムロスが多い私です。

日付が空かどうか判定するときの書き方を忘れがちなのでメモ。

DataloadderのSOQLで日付が空かどうか判定するときは、シンプルにNULLを入力すればOK

例：

```
Select Id, Name FROM Contact WHERE filterDate != NULL 
```

以上。

NULL使うのなんて当たり前だけど、Salesforceの画面でやるときは""でフィルターかかるからつい間違えるんですよねぇ。。
【UE4】UE4.25.0のNiagaraが絶妙にバグっている件

※ UE4.25.1でほぼ同じやり方で修正されているようです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275100/a483068e-fad1-a637-dbe8-b4a569d5a573.png)


|ω・｀)ﾉ ﾔｧ

UE4.25になってNiagaraがついに正式リリースしたわけだけど
なんか作ってると勝手にループになったりすることが無いかい？

俺は有る

調べてもそのへん突っ込んでる人居なくて不安なんだけど
自分の方での回避方法置いておきますNE

ちなみにどんなバグっぽいものが起きてるかというと
EmitterStateでOnceにしてるのにループになったり、パーティクルは全部発生し終わったのにメモリに乗っかり続けたり
まぁ　ようするに状態更新がバグってる感じね

##回避方法

Niagara/Functions/EmitterのEmitterChangeStateを以下のように修正
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275100/7eadf632-9b23-8176-056d-9790b5a64e3f.png)

原因？　はこのローカルのパラメーターに値がちゃんと代入されていなくて
エミッターの状態更新が上手く行っていない様子

このパラメーターのデフォルト値をCustomにするとピンがちゃんと繋がるんだけど
そうやっても何故か直らなかったので直接比較している感じ

---
4.24まではちゃんと動いてたのに　ベータ外れて正式リリース！ってタイミングでこんなバグってなんかなぁ・・・


コレが正しい修正方法かどうかはわからないので自己責任でお願いします！
んでは　ノシ
Raspberry Pi 公式カメラモジュールV2のピントの調整方法

#はじめに
　Raspberry Pi財団の公式のPiカメラモジュールV2は、Sony 製の IMX219PQ 画像センサ（8メガピクセル）を採用し、高画質な静止画やHD動画の撮影に最適です。パッケージには、カメラモジュールと白いリングがあります。「なんだろう？」と思われる白いリングは、実は「**小型フォーカス調整工具**」なのです。この工具を利用して接写時などにおいて、ピントを合わせることができます。
![Img_2388.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/3f731b18-1746-0544-9d77-364d3c21ea55.jpeg)


#ピントの調整方法
 写真のように小型フォーカス調整工具をPiカメラモジュールのレンズにはめます。工具は一般的なレンズにおけるフォーカスリングの役目をします。工具を反時計回りに回すと近距離にピントが合います。時計方向に回転させると遠距離にピントが合います。なお、反時計方向に回し続けると、ネジ式レンズが外れますので注意してください。また、フォーカスの調整には、rapistillコマンドで画像をディスプレイに表示させて、作業すると良いでしょう。コマンドのオプションの-t(タイムアウト)に0とすると、連続表示になります。「Ctrl」+「c」で、終了します。個人的には、工具のエッジの溝がクッキリした方が滑らず、作業しやすいように感じます。蛇足ですが、[コインのエッジについて興味深い話](https://fujitaku.typepad.jp/blog/2015/05/%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%AE%E7%B8%81%E3%81%B5%E3%81%A1%E3%81%AE%E3%81%8A%E8%A9%B1.html)があります。

![IMG_2391.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/6d986101-a8c3-4405-132c-51e8625d82fb.jpeg)


```
$ raspistill -t 0

```



#撮影実験
##距離３０ｍｍ

　白色LEDの照明下で撮影しました。レンズのフォーカスを調整して、下記のコマンドで撮影しました。約3㎝の近距離でも、付箋カバーの文字はクッキリとしています。

```
$ raspistill -o Img30.jpg

```
![30(2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/29ea2de1-c43d-11fa-42db-c67340ef215c.jpeg)

##距離１２０ｍｍ
次には、約12cmの距離です。フォーカスを調整して、付箋カバーの文字はクッキリしていますが、後方右側にある書籍の表紙の文字はボケています。書籍はPiカメラから約50cmの距離にあります。
![120(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/f58d5a44-5f35-a530-0e5c-027af1699642.jpeg)


##距離５００ｍｍ
最後に、約50cmの距離で、フォーカスを調整しました。画像は、文字の部分が見るように拡大してトリミングしています。先ほどのは、本の表紙の文字はボケていましたが、フォーカスの調整により、文字がクッキリしました。付箋カーバーの方は、色あせたように白っぽくなりました。raspistill コマンドオプションの「明るさ」、「コントラスト」、「ホワイトバランス」等の調整で改善の余地はあると思います。
![500(1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631966/df6cf6df-15ba-eec3-2ed1-02949d489367.jpeg)


#終わりに
小型フォーカス調整工具を利用した調整作業には多少の慣れが必要と感じました。Piカメラモジュールはデリケートなので、調整するときは力み過ぎないように注意してください。
##Reference
- Camera Module　[https://www.raspberrypi.org/documentation/hardware/camera/README.md](https://www.raspberrypi.org/documentation/hardware/camera/README.md)
- 菊池達也,"[C言語ではじめるRaspberry Pi徹底入門](https://gihyo.jp/book/2020/978-4-297-11299-8)",技術評論社,pp25-26,(Apr.2020)

 
以上。
haskell-ide-engine

毎回失敗するので備忘の為に書き残す

1)環境変数設定
以下コマンドと同等の設定を「システムの詳細設定」で保存しておく事

[共通]
set PATH=%PATH%;C:\Users\ueki5\AppData\Roaming\local\bin
set STACK_ROOT=c:\sr
※PATHはログインユーザに依存。STACK_ROOTは任意

[proxyあり]
set HTTP_PROXY=http://userid%40xxx.com:password@proxy.xxx.com:8080
set HTTPS_PROXY=http://userid%40xxx.com:password@proxy.xxx.com:8080
※URLエンコード @→%40

[proxyなし]
set HTTP_PROXY=
set HTTPS_PROXY=

2)gitのインストール
インストールディレクトリはデフォルトでよい
proxyは環境変数でも動作するが、以下の個別コマンドでも可（ただし、HTTP_PROXYが設定されていると、unsetしてもproxyサーバ経由で接続に行く)
# proxy経由
git config --global http.proxy http://userid%40xxx.com:password@proxy.xxx.com:8080
git config --global https.proxy http://userid%40xxx.com:password@proxy.xxx.com:8080
git config --global url."https://".insteadOf git://
# 直接接続
unset HTTP_PROXY
unset HTTPS_PROXY
git config --global --unset http.proxy
git config --global --unset https.proxy

2-1)PATHへ設定
set PATH=%PATH%;"C:\Program Files\Git\cmd"

3)VSCodeのインストール
インストールディレクトリはデフォルトでよい

4)stackのインストール
Windowsの場合、公式HPよりインストーラをダウンロード
URL:
https://docs.haskellstack.org/en/stable/README/#how-to-install

4-1)resolverの変更
[ファイル]
C:\sr\global-project\stack.yaml
[追加]
resolver: lts-14.27 # ghc-8.6.5

4-2)longpathを有効にする（Windows10の場合）
・gpedit.msc
・Local Computer Policy -> Computer Configuration -> Administrative Templates -> System -> Filesystem set Enable Win32 long pathsをenableに
・管理者でgit bash実行
git config --system core.longpaths true

5)hieのリポジトリクローン
git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules hie
cd hie
※Win10以外の場合も考慮し、pathは短くしています

6)hieのビルド（コマンドプロンプトから）
chcp 65001 # 文字コード回りのエラーを回避する invalid argument (invalid character)
stack ./install.hs hie-8.6.5 # ghc-8.6.5
stack ./install.hs data # hoogle docs

???)stack exec hie-wrapper -- --lsp --debug
試行錯誤。LSPのデバッグモード（？)起動


???)resolv

LTS Haskell 13.15 ((ghc8.6.4) → 2019/03/31リリース(？)
LTS Haskell 13.4 (ghc-8.6.3) → ビルドがハングアップする(×)
LTS Haskell 12.13 (ghc-8.4.3) → ビルドは成功する(◎)

[コマンドで指定する場合]
stack config set resolver lts-13.15
→以下のファイルに追加されるはず
C:\sr\global-project\stack.yaml

???)なんで？
$ stack ./install.hs hie-8.6.5
・・・中略・・・
<stderr>: commitAndReleaseBuffer: invalid argument (invalid character)
Progress 4/159
$ stack ./install.hs hie-8.6.5
・・・中略・・・
<stderr>: commitAndReleaseBuffer: invalid argument (invalid character)
Progress 4/158
Postfix SMTP設定例 メモ

Postfixで

受信用:25ポートで受信して、そのままユーザがいれば保存するだけ。自ドメインでなければ拒否。
送信用に587ポートを開けておき、ユーザのパスワード認証通ればそのまま外部のSMTPリレー鯖に転送。
リレー鯖も認証あるので、/etc/postfix/sasl_passwd.db が存在する必要がある。

あとでちゃんと書くかもしれない。

```
# grep -v "^#" /etc/postfix/main.cf  | uniq

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = example.com
mydomain = example.com
myorigin = $myhostname
inet_interfaces = all
inet_protocols = all
mydestination = mail.$mydomain, $myhostname, localhost.$mydomain, localhost
unknown_local_recipient_reject_code = 550
mynetworks = 172.16.0.0/12, 127.0.0.0/8
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5

sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES

#############################################################################################################
relayhost = [relay.smtp.example.com]:587
smtpd_sasl_auth_enable = yes
smtpd_sasl_tls_security_options = noanonymous

smtp_sasl_auth_enable = yes
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_recipient_restrictions= permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

smtp_tls_CApath = /etc/pki/tls/certs/ca-bundle.crt
```
pivot_longerメモ

いつも縦横変換を忘れてしまうので、メモ

```
name.data <- c(2000, 2001, 2002)
age.data <- c(124, 1324, 542)
data <- data.frame(year=name.data, value=age.data)

data_wider <- data %>%
  pivot_wider(names_from = "year", values_from = "value")
data_wider <- as.data.frame(data_wider)

data_wider_longer <- data_wider %>%
  pivot_longer(col = -country, names_to = "year", values_to = "amount")

```
jQuery 連続でイベント発生したときに、イベント発生が落ち着いてから実行する

#概要
テキストボックスや、スライダーなどで、```.on('input')``` などとinputイベントをとると、入力中、ドラッグ中に大量にイベント発火します。軽い処理であればリアルタイムに処理できて便利ですが、重い処理が多重発生するのは避けたい、ただ、操作時にすぐに実行したい、というときのスクリプトです。

#CodePen
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="tsunet111" data-slug-hash="mdegKzE" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Run after many events have fired">
  <span>See the Pen <a href="https://codepen.io/tsunet111/pen/mdegKzE">
  Run after many events have fired</a> by Tsuneaki Hasekura (<a href="https://codepen.io/tsunet111">@tsunet111</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

イベントは連続で発火していますが、アラートがでるのは操作が終わった後です。

##コード
1000msecごとにチェックのカウントを行い、カウントが2になったら実際の処理を実行します。

```html
<h1>Run after many events have fired</h1>
<p>Event fire count : <span id="txt_count">0</span></p>
<p>
<input type="range" min="0" max="100" />
</p>
<p>
<input type="text" />
</p>
```

```javascript
var num = 0;

var waitingTimer,waitCount;
var waitingFlg = false;
var waitMsec = 1000;
var waitNum = 2;

function wait_start(){
  waitCount = 0;
  waitingFlg = true;
  waitingTimer = setTimeout(wait_countup,waitMsec);
}

function wait_countup(){
  if(waitingTimer){
    clearTimeout(waitingTimer);
  }
  if(waitingFlg){
    waitCount++;
    if(waitCount==waitNum){
      waitingFlg = false;
      do_action();
    }else{
      waitingTimer = setTimeout(wait_countup,waitMsec);
    }
  }
}


function do_action(){
  alert('do action');
}

$(function(){
  $('input').on('input',function(){
    num++;
    $('#txt_count').html(num);
    wait_start();
  })
});

```
c++のint main(int argc, char* argv[]) とは何か？

コマンドラインから実行可能ファイイルを起動する場合は、

./helloworld

オプションを渡すときは、 ./helloworld 123

argcには、1が、
argv[0]には起動したファイル名
argv[1]には、123が入ります。	

半角スペースで区切り複数のオプションを渡した場合は、 ./helloworld123 abc

argcには、２が、入ります。

つまり、argcは引数の個数、argvには引数の値が入る。
Javaのクラス定義とインスタンスの生成

###クラス定義とインスタンスの生成
クラスからインスタンスを生成するには「new クラス名()」を使います。
【例】

```Mainjava
class Main {
  public static void main(String[] args) {
  new Person();  //Person(今回は人)クラスのインスタンスを生成します
  }
}
```

```Person.java
class Person{
}
```
####変数にインスタンス
変数にインスタンスを代入するには「クラス型 変数名 = new クラス名()」を使います。
インスタンスの代入ではクラス型を指定し、クラス名がそのままクラス型になります。
【例】

```Mainjava
class Main {
  public static void main(String[] args) {
  Person person = new Person();
  }
}
```

```Person.java
class Person{
}
```
####インスタンスメソッド
インスタンスメソッドは「public 戻り値の型 メソッド名()」を使います。

```Main.java
class Main {
  public static void main(String[] args) {
    Person person = new Person();  //voidは戻り値の型です
    person.hello();
  }
}
```

```Person.java
class Person {
  public void hello() {
  System.out.println("おはよう");
  }
}
```
####インスタンスフィールドの定義
インスタンスフィールドの定義は「public データ型 変数名」というように、変数定義の前にpublicを付けます。
【例】

```Person.java
class Person {
  public String name;
}
```
String nameで名前を入れる定義を定義しています。
インスタンスフィールドには、「インスタンス名.フィールド名」を使います。
【例】

```Main.java
〜省略〜
    Person person = new Person();
    person.name("佐藤");
    System.out.println(person.name);  //person.nameでnameの値を取得しています
〜省略〜
```

【例】

```Main.java
class Main {
  public static void main(String[] args) {
    Person person = new Person();
    person.hello();
    person.name = "佐藤";
    System.out.println(person.name); 
    }
}
```

```Person.java
class Person {
  public String name;
  public void hello() {
    System.out.println("おはよう");
  }
}
```
####this
メソッド内でインスタンスフィールドにアクセスするためには「this」の変数を用います。
thisはクラス内のメソッドの定義の中でのみ使用できます。
thisはメソッドが呼ばれた時に、そのメソッドを呼び出しているインスタンスに置き換えられます。
【例】

```Main.java
class Main {
  public static void main(String[] args) {
    Person person = new Person();
    person.hello();  //personがthisを呼び出します
    person.name = "佐藤";
    System.out.println(person.name); 
    }
}
```

```Person.java
class Person {
  public String name;
  public void hello() {
    System.out.println("おはよう" + this.name);  //this.(今回は)helloメソッドのnameフィールド
  }
}
```
TensorFlow.jsのfacemeshで顔向き推定を試してみた その２

これはTensorFlow.jsの[facemesh](https://github.com/tensorflow/tfjs-models/tree/master/facemesh)で3D座標から顔向き推定の実証実験。

[前回](https://qiita.com/otmb/items/d6fd55cf0a10b88ed07f)はOpenCVのSolvePnPとRodriguesで回転行列(rotation matrix)を求めました。
今回はアプローチを変えてfacemeshの3D座標から直接回転行列を求めます。

[元ネタはこちら](https://github.com/1adrianb/face-alignment/issues/120)、[コード](https://gist.github.com/zalo/71fbd5dbfe23cb46406d211b84be9f7e)


## 回転行列の求め方（コード紹介）

行列演算はTensorFlow.jsを利用しました。
TensorFlow.jsでは演算子をサポートしていないのでとても見辛いです。
[TensorFlow.js API](https://js.tensorflow.org/api/latest/#Operations)
※ [使ったメモリはdisposeやTidyで解放が必要です](https://www.tensorflow.org/js/guide/tensors_operations)

参考までに

- div .. 割り算
- sub .. 引き算
- mul .. 掛け算



コードでは、顔の適当な3D座標（元コードでは全ての座標、今回は適当に選択した座標：輪郭のみ）と輪郭の端の4点と目の位置の引数からスケールを取得し、中心を求めています。

```javascript

let fecePoints = tf.tensor(faces);
let eye1 = tf.tensor1d(rightEye);
let eye2 = tf.tensor1d(leftEye);

let scales = fecePoints.div(tf.norm(eye1.sub(eye2))).mul(0.06);
let centered = scales.sub(scales.mean(axis=0));

let c00 = centered.slice(0,1).as1D();
let c09 = centered.slice(9,1).as1D();
let c18 = centered.slice(18,1).as1D();
let c27 = centered.slice(27,1).as1D();
```

3x3のrotation matrixを求めます。

```javascript

let rotate0 = c18.sub(c00).div(tf.norm(c18.sub(c00)));
let rotate1 = c09.sub(c27).div(tf.norm(c09.sub(c27)));
let rotate = tf.concat([rotate0, rotate1]).arraySync();

let m00 = rotate[0];
let m01 = rotate[1];
let m02 = rotate[2];

let m10 = rotate[3];
let m11 = rotate[4];
let m12 = rotate[5];

// cross product
let m20 = m01*m12 - m02*m11;
let m21 = m02*m10 - m00*m12;
let m22 = m00*m11 - m01*m10;
```

rotation matrixが解れば、[Rotation Matrix to Euler Angles](https://www.learnopencv.com/rotation-matrix-to-euler-angles/)で変換します。


## 製作物

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">顔向き推定のオンラインデモを公開しました。良ければお試しください。<br>あと、今回の実装について簡単にまとめました。<a href="https://t.co/OXEvQENpCm">https://t.co/OXEvQENpCm</a><a href="https://t.co/jnKMpUnFIS">https://t.co/jnKMpUnFIS</a><a href="https://twitter.com/hashtag/facemesh?src=hash&amp;ref_src=twsrc%5Etfw">#facemesh</a> <a href="https://twitter.com/hashtag/TensorFlow?src=hash&amp;ref_src=twsrc%5Etfw">#TensorFlow</a> <a href="https://t.co/ZjgDfwzocg">pic.twitter.com/ZjgDfwzocg</a></p>&mdash; o2 (@mb_otsu) <a href="https://twitter.com/mb_otsu/status/1265094126178979840?ref_src=twsrc%5Etfw">May 26, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## オンラインデモ

https://infocom-tpo.github.io/facevrm/v0.2/

## おわりに

facemeshの三次元座標で顔の向きを推定しました。
AIで三次元座標が解ることで、簡単に顔の向きが推定出来るようになり、よく使われるSolvePnPの手法が必須ではなくなりました。
これまで当然として使われていた処理が使われなくなるのは感慨深いものがあります。
今後も、定期的に自身の情報をアップデートしていければと思います。
数値に対応するひらがなの言葉を辞書からリストアップするコード

与えられた数値に対応するひらがなの言葉を辞書からリストアップするコードを書いてみました。
日本語の辞書は、ひらがなで、\nで区切られた辞書ならばよいです。
関連：<a href="https://qiita.com/fygar256/items/03dbf7e5372807ce7110">Qiita:かなを数値に換算して和を求めるコード</a>
文字の合計の求め方は、shiracamusさんのコードを参考にしました。

```kl.py
#!/usr/bin/python3
import sys
table = "　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやいゆえよらりるれろわゐうゑをん＠＠＠＠がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽっゃゅょー"

v=int(sys.argv[1])
words = [ x for x in open("jm.txt") ]
for a in words:
    total = sum(table.index(kana) for kana in a if kana in table)
    if total==v:
      print(a,end='')

```
2020年5月におけるPython開発環境の選択肢

# はじめに
インストールすればすぐに書けて動かせるのが魅力のPythonですが、
実際に業務などでキチンと書こうと思ったら

- Pythonのバージョン管理ツール
- パッケージマネージャー
- エディター(IDE)
- リンター
- フォーマッター
- 型チェッカー

くらいは最低限用意する必要があります。
しかしこの界隈、怒涛の勢いで日々新しいものがリリースされていて一概に「これがベストプラクティス」を提示するのが難しいんですよね。そこで今回は上記それぞれのツールについて「こんなものがあるよ」というのをご紹介したいと思います。

# TLDR
- バージョン/パッケージ管理はpyenv + Pipenvがスタンダードだった時代は終わった
- VS CodeかVimを使うなら型解析にPyrightを導入するとよい
- [テンプレートを用意しました](https://github.com/ikumi-rai/Python-VSCode-Template) 

# 1. バージョン/パッケージマネージャー
プロジェクトごとに異なるPythonのバージョンおよびパッケージを使い分けるためのツールです。
長らくpyenv + Pipenvが新時代のスタンダードと言われてきましたが、今はまた群雄割拠の時代に戻ってしまいました。

- pyenv + Pipenv
- pyenv + Poetry
- pyenv + DepHell
- pythonloc
- Pyflow
- など…

日本語のドキュメントが充実しているのは上2つでしょうか。個人的にはpyenv + Poetryが好きです。
詳しくは↓の記事が素晴らしいのでこちらをお読みください。

**[2020 年の Python パッケージ管理ベストプラクティス](https://qiita.com/sk217/items/43c994640f4843a18dbe)**

なおPython3.8では[**PEP 582**](https://www.python.org/dev/peps/pep-0582/)という「仮想環境もうやめない？」的な提案があり、
これが正式に取り込まれるとこの辺りの管理はもっと楽になると予想されます。
Windows(NTカーネル)に光を。


# 2. エディター(IDE)
コードを書くための便利機能がいっぱい付いたメモ帳です。
選択肢は書ききれないので割愛します。
特にこだわりがなければ[VS Code](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)をおすすめしますが

- コード補完が効く
- デバッグできる
- リンター/フォーマッター/型チェッカーが動く

の3つを満たしていればどのエディタを使ってもいいと思います。
逆に言うとこれらを満たしていないエディタ(×××とか○○とか)を業務で使用するのはやめましょう。

# 3. リンター
書いたコードがコーディングルールに反していないか確認するためのツールです。
これは[flake8](https://gitlab.com/pycqa/flake8)を自分の使うフォーマッターに合わせてカスタマイズするの一択だと思うので
他に良いものをご存じの方は教えてください。

なおflake8はつい1月ほど前まで依存パッケージの問題でpycodestyleをGitHubからアップデートしないと
[セイウチ演算子](https://docs.python.org/ja/3/whatsnew/3.8.html#assignment-expressions)でエラーが出ていたのですが、今確認したら解決していました。

# 4. フォーマッター
書いたコードをコーディングルール通りに自動整形するツールです。
昔はautopep8使っとけみたいな風潮だったような気がするのですが、今は

- autopep8
- yapf
- black

と3つの選択肢があります。それぞれの特色については以下の記事に詳しいです。

[**これで決まり！最強自動コード整形ツール3選！**](https://www.kimoton.com/entry/20181223/1545540702)

私はとある宗教上の理由によりblackのフォーマットが受け入れられなかったためyapfを使っています。

# 5. 型チェッカー
Pythonを静的型付け言語っぽく書くためのツールです。
選択肢は

- エディタにVS CodeかVimを使うなら[Pyright](https://github.com/microsoft/pyright)
- 使わないなら[mypy](https://github.com/python/mypy)
- mypyの遅さに耐えられなかったら[Pyre](https://github.com/facebook/pyre-check)

の3つでしょうか。pytypeは使いどころが分かりません…

Pyrightはmypyよりもチェックが速く(MS曰く5倍)、大規模なプロジェクトでもストレスなく型チェックが行えます。
正直これだけでVS Codeを使う理由になるくらい良いです。
mypyはVim、Emacs、Sublime Text、Atom、PyCharm、VS Codeと連携が取れます。
PyreもPyrightと同じくmypyより高速に動くことを売りにした型チェッカーですが、
使い方が他とは違う(ファイルの変更をサーバーに通知する)のでしっかり[公式ドキュメント](https://pyre-check.org/docs/overview.html)を読みましょう。


# おわりに
というわけで各ツールについてのご紹介でした。
私は現在

1. pyenv + Poetry
2. VS Code
3. flake8
4. yapf
5. Pyright

の構成で、[Poetryの設定](https://python-poetry.org/docs/configuration/)を`virtualenvs.in-project = true`にして開発を行っています。
[**テンプレートリポジトリを用意した**](https://github.com/ikumi-rai/Python-VSCode-Template)ので、プロジェクト内に置くべき設定ファイルの書き方など参考にしていただけたらと思います。

あと加えて上記のblackでも使われているGit Hooksの管理ツール[**pre-commit**](https://pre-commit.com/)もチーム開発では**必須級**なので
こちら↓の記事も併せてどうぞ。
[Git HooksはPython(など)で書いてPythonで管理しよう](https://qiita.com/nicco_mirai/items/b1818efd4d9516b42e40)
CentOS 6でTorqueのセットアップ

ジョブスケジューラとしてtorqueを使用します。
torqueをyumから利用するにはEPELレポジトリの追加が必要です。
下記のようにインストール、設定します。

```shell
$ su -
$ rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ yum install --enablerepo=epel torque-server torque-client torque-mom torque-scheduler
$ /usr/sbin/create-munge-key
$ hostname > /etc/torque/server_name
$ pbs_server -t create
```

この後、qmgr.txtを次のように編集します。

```text
create queue L0 queue_type = execution
set queue L0 enabled = true
set queue L0 started = true
set server default_queue = L0
set server scheduling = true
set queue L0 resources_max.ncpus = 12 # ←12コアの場合
set queue L0 resources_max.nodes = 1
```

続けて、以下のように操作します。

```shell
$ service trqauthd start
$ qmgr < qmgr.txt
$ echo `hostname` "np=12 num_node_boards=1" > /var/lib/torque/server_priv/nodes
$ sed -i.bak s/localhost/`hostname`/g /var/lib/torque/mom_priv/config
$ echo "nodes=1" > /var/lib/torque/mom_priv/mom.layout
$ service pbs_server restart
$ service pbs_mom restart
$ service pbs_sched restart
$ chkconfig pbs_mom on
$ chkconfig pbs_sched on
$ chkconfig pbs_server on
$ chkconfig munge on
$ chkconfig trqauthd on
```
dockerの覚書

##Dockerとは
dockerとは自分のパソコンのカーネルを使って、あたかも自分のパソコンにもう一つ別のパソコンがあるようにするものと認識しています。
もう一つ別のパソコンがあるようにしている技術のことをコンテナと呼ぶと認識しています。
これの何が良いかというと、共同開発していく上で、バージョンの違いや、各々のPCの環境に左右されないことです。

##Dockerをインストールする
公式ページからインストールします
https://www.docker.com/
ダウンロードするとdocker-composeも一緒インストールされます。

##docker-composeとは
dockerを使って複数のコンテナを作ることが可能です。この複数のコンテナをいちいち、設定を書いたりするのは面倒なので、一括で管理できるものがdocker-composeです
参考
https://knowledge.sakura.ad.jp/16862/

composeをインストールするときに使うコマンド

```
# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```
【EC2】エラー：Non-ASCII character '\xe8'の対処法

#【EC2】エラー：Non-ASCII character '\xe8'の対処法

EC2でpythonのファイルを実行しようとしたときに発生したエラー（seleniumのwebdriverを実行する途中）

##エラー内容

```
SyntaxError: Non-ASCII character '\xe8' 
in file ファイル名.py on line 行番号, 
but no encoding declared; 
see http://python.org/dev/peps/pep-0263/ for details
```

ファイル内に日本語など、デフォルトで読み込めない文字が使われている場合に発生するエラー。
（ローカルでは発生しなかったが、EC2上で発生。）



##対処法
ファイルの１行目に下記を記述。（文字コードがutf-8であることを宣言）

```
#-*- coding: utf-8 -*-
```


<br>
再度実行し、無事完了。
MVC理解メモ

#MVCとは
* アプリケーション全体のコードをキレイに管理する為の考え方。また、数あるデザインパターンの一つ

##デザインパターンとは
* 過去のソフトウェアエンジニア(賢人達)によって作られた、コードをキレイに書く為のテンプレート

##MVCの「M」
* 「Model」の頭文字Mを取ってる

### M(Model)が行なっていること
* データベースとの通信を制御している
* データベースの操作(取得、作成、更新、削除)
* データの加工・整形(Modelで持っているデータを、求めているデータ形式に加工したり、整形したりしてくれる)

※他の2つ(View・Controller)にデータ管理(通信・操作・加工/整形)のコードを置かないことにより、データ管理で問題があった場合は、Modelを疑えるようになります。

##MVCの「V」
* 「View」の頭文字Vを取っている

※UI(ユーザーインターフェース)と同様

### V(View)が行なっていること
* 表示/入力周りの管理・制御を行なっている。

　※Controllerで定義したデータをModel経由で取得して、表示を行うなど

##MVCの「C」
* 「Controller」の頭文字Cを取っている

### C(Controller)が行なっていること
* クライアントとModelとViewへの橋渡し
* クライアントからのリクエストを受け取って、内容に応じて処理を行う。
* 必要な時にデータベースからデータの受け渡しを行う。
* Viewを生成する時に、Modelから受け取ったデータを必要な時にViewに受け渡す。

###メリットに感じる部分
* それぞれが機能(データベース管理/入力表示管理/橋渡し)を独立して行なっているから、バグや問題が発生したら特定しやすい


参照：デザインパターン
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)
STM32F3のADCとDMAでアナログ値をポーリングする


## ハード周り

Nucleo-F303REを使っている。

### ADC周りの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/d89406ab-14a3-cd1e-e3f6-ea751ea3b330.png)

Continuous Conversion ModeとDMA Continuous RequestをENABLEに設定する。

### DMA周りの設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/d2dd2557-7e24-e391-8437-cd4e52b1fbb3.png)

優先度は適当に。Circularモードで、Half Word幅。ペリフェラル側はインクリメントせず、メモリ側はインクリメントする。

## ソフト周り

### バッファ

適当な場所で宣言しておく。

```c
uint16_t ADC_buff[3];
```

スタックに置く際はオーバーフローやCCMRAMに注意(グローバルに置くのが無難)。
HAL_ADC_Start_DMAの引数がuint32_t*だからといって、決して32bitで宣言してはいけない。特別の理由がない限り、必ずDMAで設定した幅に従うように。

### mainの後半付近(値読み出し処理)

```c
/* USER CODE BEGIN 2 */

HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED);

static uint16_t ADC_buff[3];
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_buff, sizeof(ADC_buff) / sizeof(ADC_buff[0]));

hdma_adc1.Instance->CCR &= ~(DMA_IT_TC | DMA_IT_HT);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
    printf("ADC %3hu %3hu %3hu\n", ADC_buff[0], ADC_buff[1], ADC_buff[2]);

    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
    HAL_Delay(100);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
```

HAL_ADC_Start_DMAでADCとDMAを開始できる。ただ、バッファの長さが短く、DMA転送完了割り込みが頻繁に発生すると通常の処理もままならなくなるので、Transfer CompleteとHalf Transferを無効にしてある。

DMA転送で常時ADC変換が行われているので、好きなときにバッファを読めば最新のアナログ値を知ることができる。

## 感想

ADC+DMAはかなり悪い食い合わせ。せめてTIMも一緒にお召し上がりください。
Windows Sandbox を導入するとCOPPが無効になるかもしれない

## 概要
因果関係は不明だが、何か役に立つことがあるかもしれないのでメモしておく。イベントビューアーにもそれらしいエラーはなく調べ方がよく分からない。

1. Windows Sandbox を導入した
2. 動画再生で不具合
  * 地デジチューナーのチェッカーで COPP が無効と表示された
  * 動画再生で映像が表示できなくなった
3. 1日前のバックアップで復元した後、現象が解消した
Laravel Homestead + PhpStormでXdebugを有効化する

# 環境
- MacBook Pro
- Vagrant 2.2.9
- Laravel Homestead 9.5.1
- PHP 7.4.5
- Xdebug 2.9.3
- PhpStorm 2020.1.2 Preview

# 事前確認
Homestead環境なら入っている筈だが、一応確認する。
phpinfoを見て、Xdebug拡張が含まれているかを見る。
![FireShot Capture 030 - PHP 7.4.5 - phpinfo() - likekeshi.test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/388dd3b0-0889-9499-4658-596dbfd41afd.png)

# ホスト設定
Vagrant上で実行します。

```bash

# Xdebugの設定ファイルを確認
vagrant@homestead:~$ php --ini | grep xdebug
# デフォルトでモジュールが無効のため、何も表示されない

# モジュールを有効化
vagrant@homestead:~$ sudo phpenmod xdebug

# もう一度確認
vagrant@homestead:~$ php --ini | grep xdebug
/etc/php/7.4/cli/conf.d/20-xdebug.ini, # ← 設定ファイルが追加された

# 設定ファイルを編集
vagrant@homestead:~$ sudo vim /etc/php/7.4/cli/conf.d/20-xdebug.ini
```

以下の内容に書き換える。
xdebug.remote_portが9000だと動かなかったので、9001にする。
php-fpmのデフォルトポートが9000なので、それと競合するっぽい。


```ini:/etc/php/7.4/cli/conf.d/20-xdebug.ini

zend_extension=xdebug.so
xdebug.remote_enable = 1
xdebug.remote_host = 10.0.2.2
xdebug.remote_port = 9001
xdebug.remote_autostart = 1
xdebug.idekey = PHPSTORM
xdebug.remote_log = /tmp/xdebug.log
xdebug.show_error_trace = 1
xdebug.max_nesting_level = 512
```

再起動して設定を反映します。

```bash

vagrant@homestead:~$ sudo service php7.4-fpm restart
```

# IDE設定
1. 設定を開く
1. 「言語&フレームワーク > PHP > デバッグ」でXdebugのデバッグ・ポートを9001に設定
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/b49f0a1d-2f1d-bcf5-cc68-bd807e8016e1.png)
1. OKボタンを押して設定を閉じる
1. 右上にあるPHPデバッグ接続のリッスンボタンを押す
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/614178cd-628c-3702-cc82-09f51ee472e1.png)
1. Vagrant上のサイトにアクセスする(例: http://homestead.test/ )
1. PhpStormで「Incoming Connection From Xdebug」というダイアログが現れるので、public/index.phpを選択し、受諾ボタンを押す
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/2f824607-6f92-15b1-4ea8-f02c7de024cd.png)
1. 「言語&フレームワーク > PHP > サーバー」を見ると設定が追加されている。しかし間違った設定がなされているため修正する。（/publicの絶対パスを削除してルートディレクトリの絶対パスを設定する）
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/a1fe4b15-51b6-9ca7-2071-80ac5243efe7.png)
↓修正
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/730c5079-657c-9202-9fd8-abf463526147.png)

これで設定は完了です。
好きなところにブレークポイントを貼って、サイトにアクセスしてみましょう。
<img width="1440" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117180/d57ad342-8794-7db2-a1d2-0e7761d5f001.png">

処理が停止して変数の一覧が見れるようになりました。
F9キーを押すと次のブレークポイントまで処理をすすめることができます。便利ですね。

# 補足
`xdebug.remote_autostart = 0`に設定すれば、デバッグの自動実行を止めることができます。
その場合、サイトにアクセスする際に`XDEBUG_SESSION_START=PHPSTORM`のパラメータを明示的に付与する必要があります。
[Xdebug helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc)というChrome拡張を使うと、URLに勝手にパラメータを付けてくれるのでオススメです。


# 参考リンク
- https://laracasts.com/discuss/channels/laravel/how-to-setup-xdebug-for-homestead-in-phpstrom?page=1
- https://www.erickpatrick.net/blog/xdebug-with-homestead-and-phpstorm
- https://medium.com/@mohsinyounas05/how-to-enable-xdebug-for-laravel-with-vagrant-and-phpstorm-df5403c9e793
- https://qiita.com/haruna-nagayoshi/items/99fa041e884c2c3975d2
- https://qiita.com/castaneai/items/d5fdf577a348012ed8af
processingで作る簡単な障害物レースfor Java

#prossesingはプログラミング初心者におすすめ
prossesingはデザインアートを作ることができる環境です。
言語はJavaベースで作ってありますが、Pythonなど他の言語で書くことも可能です。
また、文の構造なども他のものに比べて見やすいので、まず簡単に動くプログラミングを作りたい！という方にはおすすめです。
ここでは、prossesing初心者の僕が1日で作れた簡単なゲームを紹介していきます。
コードの読みにくさはあるかもしれませんが、ご了承ください(汗

#今回作るゲーム
今回は、向かってくる障害物を避けるゲームを作っていきたいと思います。
機能としては、ジャンプ・衝突判定で作ることができます。
ここでは、コードと簡単な流れをご紹介します。
不明点があれば、コメントして頂けたらお答えします。

#コード紹介
簡単な流れだけご紹介します。
今回は棒人間を走らせるようにします。
まず必要な画像をダウンロードし、繰り返し表示するものはリストに格納していきます。

次に棒人間をジャンプさせるために、yの更新式を工夫します。
クリックした瞬間に上方向に速度を持たせ、重力に見立てた力を働かせることで落下させています。
簡単な物理計算をしています。

また、向かってくる障害物は一定の速度でこちらに向かってくるものと考えて、速度をv、位置をxとして、位置に関する更新式を書いています。

最後に、衝突判定はAND演算子(2つの条件を満たしたときに衝突したと判定)を用いて判定してます。
判定条件は、画像下の部分が障害物よりも下の位置に来た時にループを停止するようにしています。

以下にコードを載せておきます。
画像は自分のPCにある画像を使っているため、直接のコピペでは動きません。
棒人間の動きをずらした画像を8枚と、河野大臣の画像が1枚必要です。笑

```ruby:prossesing-for-java
int numFrames = 8;  // The number of frames in the animation
int currentFrame = 0;
PImage[] img = new PImage[numFrames];
PImage img2;
float y,vy,Fy,x,z,vx;

void setup() {
  frameRate(24);
  size(600, 600);
  y = 0;
  vy = 0;
  Fy = 0;
  x = 570;
  z = 570;
  vx = 5;
  // The image file must be in the data folder of the current sketch 
  // to load successfully
  img2 = loadImage("kouno-tarou.jpg");
  img[0] = loadImage("stick0.png");  // Load the image into the program  
  img[1] = loadImage("stick1.png");
  img[2] = loadImage("stick2.png");
  img[3] = loadImage("stick3.png");
  img[4] = loadImage("stick4.png");
  img[5] = loadImage("stick5.png");
  img[6] = loadImage("stick6.png");
  img[7] = loadImage("stick7.png");
}

void draw() {
  background(255);
  
  vy = vy +Fy;
  
  y = y + vy;
  
  x = x - vx;
  
  if(y > 0){
  vy = 0;
  Fy = 0;
  y = 0;
  }
  
  if(x < 0){
    x = 570;
  }
  currentFrame = (currentFrame+1) % numFrames;
  image(img[currentFrame], 0, 450 + y);
  
  fill(0);
  rect(x,z,30,30);
  
  if ( ((0<x) && (x<100)) && (600+y > 570)){
  fill(253);
  rect(0,0,600,600);
  image(img2,0,0);
  noLoop();
  }
}

void mouseClicked(){
  Fy =1.2;
  vy = -20;
}
```
【AWS】IAMロールとIAMポリシーの違いが分かり難かったのでまとめてみた

SAA受験に向けてAWSについて学習中です。

IT未経験からエンジニアになりましたが、英語多すぎ…カタカナ多すぎ…というのが最初の感想です。

恐らく同じような感想を持たれているIT未経験→エンジニアの方もいらっしゃるのではないでしょうか。

そんな中で、自分なりに噛み砕いて理解していっております。

とても単純で簡単な例なのですがIAMのロールとポリシーが理解し難かったので、まとめてみました！


#IAMとは？(Identify and Access Management)

IAMには4つのサービスが有ります。

・グループ
・ユーザー
・ロール
・ポリシー

今回は、ロールとポリシーについてまとめていこうと思います。

##◆IAMロール

AWSリソースにリソースに付与するもの。
IAMロールにIAMポリシーが付与される。


##◆IAMポリシー

IAMロールに内包されるもの。
AWSリソースにアクセスする為の権限設定であり、AWS側で用意がされているもの。

##図で表してみた

こんな感じです！
IAMロールという大きい入れ物に、IAMポリシーという各リソースへの権限を選択して入れてあげるイメージです。

ロール=包むモノ と覚えると個人的にわかりやすかったです！

<img width="945" alt="スクリーンショット 2020-05-26 8.15.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/626101/1f9e9df8-9670-3a30-850f-ae74bf01a4d6.png">

#最後に

IT未経験からエンジニアになっているので、カタカナや英語が多すぎてわけわからない…

というのが正直な最初の感想です。

しかし、1つ1つ調べていくと初見のイメージほど難しい内容でもないことがほとんどです。

一見して難しそうなIT用語にモチベーションを失ってしまわないようにするとインプットも捗るかと思います。

今回は簡単な内容ですが、自分なりに分解して簡単に理解できるようにした１つの例としてあげておきました。
RTX1210設定Howto記事まとめ

RTX1210について投稿した記事をまとめました。
今後もRTX1210の設定方法などをアップしていく予定です。
基本的には[__YAMAHA公式__](https://network.yamaha.com/products/routers/rtx1210/setting#tab)ページの設定例をベースに掲載していきます。

### 環境
* 初期化したRTX1210
* OS:MacOS
* terminal:iTerm2

※私の環境で動作確認を行ってはいますが、お使いの環境ですべての動作を保証するものではありませんのでご注意ください。

## Howto記事一覧

|やりたいこと|タイトル|
|:--|:--|
|初期化|[RTX1210の初期化（工場出荷状態）に戻す方法](https://qiita.com/2480230/items/9dd82c532318fe722061)|
|コンソール接続|[RTX1210の設定をするためのコンソール接続](https://qiita.com/2480230/items/4b5a650ef19907ad30aa)|
|telnet接続|[コンソールケーブルがなくても大丈夫！RTX1210にtelnet接続する方法](https://qiita.com/2480230/items/8b67e5df3a47069f0f8f)|
|パスワード設定|[RTX1210のパスワード設定をする](https://qiita.com/2480230/items/ebdf0c80b4121fc9245a)|
|pppoeの設定|[RTX1210 PPPoEでインターネットを利用する](https://qiita.com/2480230/items/440515902df31bb29620)|
かなを数値に換算して和を求めるコード

ひらがなを引数にとり、数値に換算して和を求めるコードを示します。
かな数値対応は、以下の表を参考にしています。<img width="800" alt="romaji-hyou" src="https://i.imgur.com/nTuAKPF.png">

```kanacnt.py
#!/usr/bin/python3
import sys

kana = "　あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやいゆえよらりるれろわゐうゑをん＠＠＠＠がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽっゃゅょー"

a = sys.argv[1]
cnt = 0
for i in range(len(a)):
    if (a[i] in kana):
        cnt += kana.index(a[i])
print(cnt)

```

実行例

```
$ ./kanacnt.py ありす
56
$ ./kanacnt.py ねこ
34
$ ./kanacnt.py ひらがな
145
```
【EC2】chromedriverをコマンドラインでインストール＆ダウンロードする方法

#【EC2】chromedriverをコマンドラインでインストール＆ダウンロードする方法。

pythonのseleniumを使うためにEC2インスタンスにchromedriverをインストールする。

<br>
<br>
**＞この記事は[こちらに移転しました。](https://prograshi.com/platform/aws/ec2-chromedriver/)**
windowsでiverilog その5

# 概要

windowsでiverilogやってみた。
8bitシフトレジスタ、書いてみた。

# サンプルコード


```
module sr8(input _in, clk, output _out);
	reg b1;
	reg b2;
	reg b3;
	reg b4;
	reg b5;
	reg b6;
	reg b7;
	reg b8;
	assign _out = b8;
	always @(posedge clk)
	begin
		b8 <= b7;
		b7 <= b6;
		b6 <= b5;
		b5 <= b4;
		b4 <= b3;
		b3 <= b2;
		b2 <= b1;
		b1 <= _in;
	end
endmodule
```

# テストベンチ


```
module test;
	reg i,
		c;
	output o;
	sr8 u(i, c, o);
	initial
	begin
		$dumpfile("sr8.vcd");
		$dumpvars(0, u);
		$display("i c o");
		$monitor("%b %b %b", i, c, o);
		i = 0;
		c = 0;
		#10;
			i = 1;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			i = 0;
			c = 0;
		#10;
			i = 0;
			c = 1;
		#10;
			$finish;
	end
endmodule



```

# 結果


```

VCD info: dumpfile sr8.vcd opened for output.
i c o
0 0 x
1 1 x
0 0 x
0 1 x
0 0 x
0 1 x
0 0 x
0 1 x
0 0 x
0 1 x
0 0 x
0 1 x
0 0 x
0 1 x
0 0 x
0 1 1
0 0 1
0 1 0
0 0 0
0 1 0


```
# 写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c5ebfdce-b8d6-23d4-fb75-226d440b1403.png)


以上。
AWS EC2インスタンスのlocalhostにアクセスする

[この記事](https://qiita.com/jesuissuyaa/items/bd27ad173ecbc4f76ba0)で、AWSのEC2のインスタンスからコードを編集するように環境構築したんですけど
`yarn dev`したときにGoogle Chromeからlocalhostにつながらない問題が発生

同じ人がいたら:arrow_down:をやれば一瞬で解決するのでやってみてください〜

## 手順

:one:  AWS EC2のコンソールを開く

:two: localhostに接続したいインスタンスの行の"Security Group"をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/2deac0cd-14dd-b24e-ea52-2f68e7b60517.png)

:three: すでにあるSecurity Groupのinbound rulesを編集する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/17cdd31d-57b3-e412-0051-8fcabb891793.png)

:four: "Add rule"ボタンを押して:arrow_down:のruleを追加

画像は`localhost:3000`に接続したい場合
8000番に接続したいとか、3000と3004に接続したいとかだったら、Port rangeのところに`8000`とか`3000-3004`とか入れる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/db1d62a3-b8e6-d18a-6b35-d4e3dc6310a5.png)

:five: "Save rules"を押して終了
ブラウザでインスタンスのIPv4 Public IPに接続すればいける
（SSHを接続し直す必要はない）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430849/86a32988-51cf-ddb8-9cc4-f7afbdcc7e60.png)

例: `localhost:3000`にWebアプリが立ち上がってる→`18.217.xxx.xxx`:3000をブラウザに入れる



参考: https://stackoverflow.com/questions/55729337/how-can-i-connect-to-a-http-localhost4200-using-browser-which-is-a-aws-ec2/55740099
無制限にア、ハイbot

```javascript
client.on('message',message=>{
```
これでメッセージ判定あったら反応





```javascript
if(message.author.bot===){return;
```
これ意外にコードを追加する場合
もしBotが発言したならもとに戻るを追加

```javascript
if(message.content!=='ア、ハイ'){
```

これでア、ハイ以外ならば

```javascript
message.reply('ア、ハイ');
 return;
}
});

```

ア、ハイとコメントして処理を繰り返す
不具合が出るとしたら動かないかア、ハイを無制限に高速で繰り返すので危険
【ミライトデザイン社内勉強会#1】文字コードについて

## 1ビットとは？

- 0か1を表す単位

[ビット - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88)
> ビット(bit)は、情報理論、コンピューティング、デジタル通信における情報の基本単位（英語版）である。二進数の1桁のことであり、その名前はbinary digitの2語の一部を組み合わせた語（かばん語）である

## 1バイトとは？

- [1バイトが8bitに定まったのは2008年](https://qiita.com/yaju/items/c5da6df2221d5c3611e0)
- 8ビットを1つの単位とする
- 1バイトは256通り表現できる（2<sup>8</sup>）
  - 0〜255

### 2バイト

1バイト = 8ビット
2バイト = 16ビット

1ビット = 2種類（2<sup>1</sup>）
8ビット = 256種類 （2<sup>8</sup> → 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 = 256）
16ビット = 65536種類 （2<sup>16</sup>)


## 文字コードとは？
[文字コードとは何？ Weblio辞書](https://www.weblio.jp/content/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89)

> **文字コードとは、文字をコンピュータで扱うために個々の文字や記号に割り当てられた、固有の番号のことである。**


- 文字と番号の対応表みたいなもの

## 文字を表現する仕組み

- ASCII
    - 米国規格協会（ANSI）によって定められた、基本的な文字コード
    - [ASCIIコード表](http://www3.nit.ac.jp/~tamura/ex2/ascii.html)

- unicode
    - [IT用語辞典 e-Words | Unicodeとは - IT用語辞典](http://e-words.jp/w/Unicode.html)

- シフトJISコード(S-JIS)
    - 日本語の文字コード
    - 2バイト
    - [文字コード表](http://charset.7jp.net/sjis.html)

- 押すとキーコードが表示されるサイト
    - https://keycode.info/

### 文字化けが起こる理由

- 文字化けは文字コードの違いによって起こる

[文字化け - Wikipedia](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91)

## たいていの Unix系OS上のシェルでできるバイナリ体験例

```
$ echo "hoge" > test.txt
$ echo "fuga" >> test.txt
$ cat test.txt
hoge
fuga
$ od -c test.txt
0000000   h   o   g   e  \n   f   u   g   a  \n
0000012
$ od test.txt
0000000 067550 062547 063012 063565 005141
0000012
 

$ echo "hoge" > test.txt
$ od -tx1 test.txt
0000000 68 6f 67 65 0a
0000005
$ od -tu1 test.txt
0000000 104 111 103 101  10
0000005
```
[od コマンド | コマンドの使い方(Linux) | hydroculのメモ](https://hydrocul.github.io/wiki/commands/od.html)

## UTF-8などを進数に変換

### VScodeで16進数に変換
- [hexdump for VSCode
](https://marketplace.visualstudio.com/items?itemName=slevesque.vscode-hexdump)

### 8〜16進数を2進数(8、10進数も可)に変換
- Mac : Command + Space => 計算機と検索 => 表示をクリック => プログラマに変更
AWSのサービス語句まとめ

###試験で覚えるためのAWSサービスのまとめ

1.API GAteway
2.Aurora
3.Auto Scaling
4.CloudFront
5.CloudTrail
6.CloudWatch
7.Data Pipeline
8.Direct Connect
9.DynamoDB
10.EBS(Elastic Block Store)
11.EC2(Elastic Comppute Cloud)
12.ElasticCache
13.ELB(Elastic Load Balancing)
14.EMR
15.Glacier
16.IAM(Identity and Access Management)
17.Kinesis
18.Kinesis Data Firehose
19.Kinesis Data Streams
20.Lambda
21.RDS(rekational Database Service)
22.RedShift
23.Route 53
24.S3(Simple Storage Service)
25.SNS(Simple Notification Service)
26.SQS(Simple Queue Service)
27.VPC(Virtual Private Cloud)
Xcode：ケーブルを使わずに（遠隔で）物理デバイス上でアプリを実行しデバッグしましょう

## ストーリー

アプリをテストするときは、デバイスをすべてコンピュータに繋げていました。ご想像の通り、私の机はケーブルだらけでした。

しかし、デバイスとコンピュータが同じWi-Fiネットワークに接続されている場合、Xcode はデバイスにリモート接続できるのです。その方法は次のとおりです。

## デバイスをリモート接続する

### まず、トップメニューのプログラムターゲットの名前をクリックし、デバイスメニューを開き、追加のシミュレーターを追加をクリックします

<img width="851" alt="スクリーンショット 2020-05-25 16.07.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/f4bcab01-b041-cead-ba85-0b9abf8233ee.png">

### するとシミュレーターのリストが表示されるので、トップの `Device` タブをクリックし、全てのデバイスを表示させます。リモート接続を設定するには、まずデバイスをケーブルでコンピューターに接続する必要があります。

そして、`Connect via Network` のオプションを選択します

<img width="795" alt="スクリーンショット 2020-05-25 16.09.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/671aa906-bb58-4535-5365-3254dd5dd770.png">

### ケーブルを抜きます。これで、お使いのデバイス名の横にネットワークアイコンが表示されるはずです。今すぐプログラムを実行してみてください。ケーブルなしで実行することができるはずです。

<img width="249" alt="スクリーンショット 2020-05-25 16.09.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/635330/4936317d-109f-fb75-d9e4-5515b7a43e95.png">

---

:relaxed: [Twitter @MszPro](https://twitter.com/MszPro)

:sunny: [私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。](http://mszpro.com/ioskiji/)
<img width="150" src="https://cdn.mszmagic.com/static-web-content/AppClipImage_small.png">
【AWS】S3(Simple Storage Service)とは？

# はじめに
AWS SAA取得に向けて学習を進めています。
今回はS3とは何か？ということをアウトプットしていきたいと思います。

# S3とは？

**別名:Amazon Simple Storage Service(S3)**

インターネット経由で利用できるオブジェクトストレージサービス

2006年からサービスを開始していて、安価で高い耐久性をもっているAWSの代表的なサービスの一つ。

# S3の特徴

- **イレブンナイン(99.999999999%)の耐久性**
保存されたファイルをリージョン内の3か所以上のアベイラビリティーゾーンにあるデータセンターに自動的に複製して保持している。
イレブンナイン(99.999999999%)というのは、S3に1万個のオブジェクトを保存したとして、そのうちの1つが障害によって失われるのに**平均で1000万年**ほどかかるレベルとのことです。
　　

- **結果整合性モデル**
データを更新・削除した際に順次データが更新されていく仕組み。
**「一つの更新はそのうち全体に反映される」**という考え方。
データの更新直後など読み取りのタイミングによっては古いデータを読み込む可能性がある。
  

- **容量無制限**
S3に保存できるデータ容量やファイル数には制限がない。
初期費用は**0円**で使用した分のみ支払う従量課金制。
  
- **安価**
S3の標準ストレージの利用料金(東京リージョンの場合)は、最初の50TBまでが**「月額3円($0.025)/GB」**。
次の450TBも**「月額3円($0.024)/GB」**である。

# 参考
[この１冊で合格！　AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集](https://www.amazon.co.jp/gp/product/B07VFFX6V1/ref=ppx_yo_dt_b_d_asin_title_o00?ie=UTF8&psc=1)
[Amazon S3の耐久性は99.999999999％。こんなに高い耐久性がいらない人向けのオプションが登場](https://www.publickey1.jp/blog/10/amazon_s399999999999.html)
[Amazon S3 の結果整合性と読み取り一貫性](https://dev.classmethod.jp/articles/amazon-s3-eventually-consistent-and-consistent-read/)
[Amazon S3 の料金](https://aws.amazon.com/jp/s3/pricing/)
Python tutorial

#variables

https://docs.python.org/3/library/ 参照

```python

a = 1
b = "Text"
c = None
d = True
# list
days = ["Sat", "Sun"]

print("Sat" in days) # 出力結果　True
print("Mon" in days) # 出力結果　False

```
list is sequence and mutable # days = ["Sat", "Sun"]
tupple is immutable  # days = ("Sat", "Sun")
dict me={ "name":"zomggang",
"age" : "secret"}


#Flask
host=0.0.0.0
means all IPV4 address で0.0.0.0にアクセスすることになったらlocal hostの全てのhostにアクセスできるということ
テーブルのデータが全て表示されてしまう問題の解決

# 問題
投稿だけを表示したいのに、テーブルに入れた情報が全部ブラウザ上に出てきてしまう。
![スクリーンショット 2020-05-25 22.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/a0451ddd-316e-01a7-d7b3-097fbf1ceb5a.png)

# エラー原因
```ruby
= @posts.each do |post|
```
`=`がまずかった。

# 解決方法
```ruby
# before(表示される)
= @posts.each do |post|
# after(表示されない)
- @posts.each do |post|
```
Rubyでは`=`だと表示されて、`-`だと表示されない設定でした。
かなり単純なところでつまずいていました。
初心者によるプログラミング学習ログ 326日目

#100日チャレンジの326日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。
100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。
326日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>326日目 2h<br>・架空LP模写13日目1h（<a href="https://twitter.com/ririru_123?ref_src=twsrc%5Etfw">@ririru_123</a>）<br>・架空LP模写：お問い合わせ部分を作成<br>・ポートフォリオ作成1h：cssアニメーション導入<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1265010628885798912?ref_src=twsrc%5Etfw">May 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
よく見かけるよく使うボタンエフェクト

webサイト上でよく見かけるボタンを３つにまとめてみた。

##私的よく見かけるボタンエフェクト3種
**・通常のhoverボタン**
　一番よく使われているであろうhoverを使ったボタン
**・hoverスライドボタン**
　hoverすると背景色がスライドしてきて色が変わるボタン
**・activeを使った押せるボタン**
　ポチッと押せるボタン

##Code Pen
<p class="codepen" data-height="402" data-theme-id="light" data-default-tab="html, css, result" data-user="gb-sweep" data-slug-hash="vYNMdEq" style="height: 402px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="buttons">
  <span>See the Pen <a href="https://codepen.io/gb-sweep/pen/vYNMdEq">
  buttons</a> by taka (<a href="https://codepen.io/gb-sweep">@gb-sweep</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

##まとめ
正直単なるhoverだけのボタンがダントツで一番使われているが、他の２つも見かけるので覚えておいて損は無いし、何よりものすごく簡単に実装できてなんか凝ってる感が出てよい
【Nokogiri】RSSニュースをRubyで扱ってみよう！

こんにちは！
今回は、RSSのニュースをNokogiriで解析して、Rubyで扱うまでをまとめてみようと思います。

このまとめでは、Nokogiriというgemを使用して、RSSニュースをRubyで扱えるようにしていきます。
RSSニュースをRubyで扱う事が出来れば、自作キュレーションメディアを作れたりして面白いのでやってみましょう。



# 今回作るもの
以下のゲーム情報を配信しているRSSから、自動でニュースのタイトル部分を取ってきて配列に入れてみようと思います。
https://automaton-media.com/feed/

とりあえず今回は、簡単なもの作ってまとめる事にします。
(気が向いたら、キュレーションメディアをRailsで作る！みたいな大掛かりな記事を書こうかな)


# XMLデータの簡単な説明
RSSニュースのデータを扱う前にXMLについて簡単に説明します。

![ゲームRSSオリジナル説明用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343136/f87154f1-c2b2-0306-bc08-5172bdd6b0f4.png)
## XML宣言
一番先頭の```<?xml version="1.0" 〜```と書かれている部分は、このファイルがXMLファイルである事を表し、必ず先頭に記述する事になっています

## channelの定義
XML宣言の次の```<channel>```から始まるブロックは、このRSSのチャンネル名を定義したものです。

## imageの定義
channelのロゴなどが設定されてます。

# Nokogiriをインストール
まずはNokogiriをインストールしてみましょう。

```rb
gem install nokogiri
```
Railsで使う場合は、Gemfileにnokogiriを追加して下さい。

```rb
gem 'nokogiri'
```

Gemfileに追加したらbundle installしましょう。

```rb
bundle install
```


# プログラム作成
Nokogiriがインストール出来たところで、実際にプログラムを作って行きましょう。

## 使用ライブラリをrequireする

まず、nokogiri.rbというファイルを作って、先頭に以下の2行を追加して下さい。

```nokogiri.rb
require 'open-uri' # 引数にURLを渡すとURLのデータを取得出来るopenメソッドを使いたいので読み込みます。
require 'nokogiri' # openメソッドで取って来たデータを、nokogiriで取り扱うため読み込みます。
```

## openメソッドでニュース記事を読み込もう



```nokogiri.rb
require 'open-uri'
require 'nokogiri'

url = 'https://automaton-media.com/feed/' # 今回読み込むニュースを設定します。

charset = nil # 読み込んだニュースが文字化けしないよう一度nilにして再設定します。
titles = open(url) do |file| # openメソッドでデータを取得し、ブロックに渡して操作します。
  charset = file.charset # charsetに読み込んだファイルのcharsetを設定します。
end
```

## openメソッドで取って来たニュースをNokogiriで検索しよう

```nokogiri.rb
require 'open-uri'
require 'nokogiri'

url = 'https://automaton-media.com/feed/'

charset = nil
titles = open(url) do |file|
  charset = file.charset
  doc = Nokogiri::XML(file) # openメソッドで取って来たファイルをNokogiriのオブジェクトにします。
  channel = doc.at_xpath('//channel') # ファイル内のchannel部分を取得します。
  title = channel.xpath('//title') # channel内にあるtitleを全て取得します。
  title.map { |title| title.text } # titleのNodeSetからテキスト部分だけ配列に集めます。
end

puts titles # タイトルを出力してみましょう。
```
**Nokogiriのメソッド説明**

- at_xpath 指定したxpathに一致する最初のひとつの要素を返します。(要素をNodeと呼びます)
- xpath    指定したxpathに一致する全ての要素を返します。(要素をNodeSetと呼びます)

## 実行してみよう

作ったファイルを実行してみます。

```rb
ruby nokogiri.rb
```

以下のように配列にまとめたニュースタイトルが出力出来たでしょうか？

<img width="944" alt="スクリーンショット 2020-05-24 4.39.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343136/9b41f416-8e6e-16ce-9120-55b0f4c2f3ba.png">


## よく使うNokogiriの検索メソッド
Nokogiriの検索メソッドは、抜き出したいニュースの要件に合わせてその都度メソッドをググれば良いのですが、よく使うメソッドを以下にまとめときます。

### at
```rb
doc.at('//title') # 最初に検索ヒットしたNodeを返します。
```

### at_xpath
```rb
doc.at_xpath('//title') # xpathで検索して最初にヒットしたNodeを返します。
```

### xpath

```rb
doc.xpath('//title') # xpathでの検索にヒットするNodeSetを返します。
```

### at_css

```rb
doc.at_css('title') # cssで検索して最初にヒットしたNodeを返します。
```

### css

```rb
doc.css('title') # cssでの検索にヒットするNodeSetを返します。
```

## 感想
今回、RSSニュースのタイトルをRubyで配列に集めましたが、ここまで出来れば後はDBに入れてみたり、SlackやLINEに通知してみたり色々出来ると思います。
自分用でまとめサイトを作ってみるというのも面白いかもしれませんね。
VSCodeでマークダウンプレビューのキーバインドが重複していたので整理してみた

# VSCodeでマークダウンプレビューのキーバインドが重複していたので整理してみた

## 前置き
永らく、[Markdown All in One](https://marketplace.visualstudio.com/items?itemName=yzhang.markdown-all-in-one#github-flavored-markdown) を愛用して気に入っていたのだが、diagram を埋め込みたい時にひと手間必要なのが不満だった。（先に画像にしていたり、別途 PlantUML などの拡張機能を使ったり）

最近、[Markdown Preview Enhanced](https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced) がいい感じに diagram を描かせてくれることを知り導入した。

![マークダウン拡張機能](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/76f04b84-3c8d-3a25-d5c2-f9ee201e86be.png)

これで、編集時のコンプリートやショートカットは All in One で、プレビューは Enhanced でよきに計らってもらえるぜひゃっはーの予定だった。のだが…

双方のプレビューを表示するショートカットキーがいい感じ（笑）に重複してしまって、微妙に使いづらい。

## 重複しているショートカットを調べる

コマンドパレットからキーボードショートカットの一覧を開き、重複してしまっているショートカットを調べる。

![キーボードショートカット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/a1401f28-21b0-d8ab-afaa-e200dcd2e057.png)
![重複したショートカット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/ed5c8e2e-1f32-834a-81b4-35d99901e32a.png)

見事に重複している。

この一覧画面から、要らないバインドを無効に設定できれば楽なのだが、どうもそういう機能はないらしい。

よろしい。本腰だ。

先のコマンドパレットにキーボードショートカットを定義している JSON を直接開けそうなものがリストされていた。
早速開いてみる。

![既定のショートカット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/6ccc4918-2a98-3464-0ff9-fba6e0fe6096.png)
![既定のショートカット(JSON)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/33397b2a-dbb3-98de-ecc8-0a6c513e4205.png)

捕捉！

## 重複しているショートカットを無効に設定する

コマンドパレットから、User 定義のキーボードショートカットを記述する JSON を開く。

![Userのショートカット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/d7ce635f-a746-fce8-d95b-dbc5ff50910e.png)
![Userのショートカット(JSON)](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/9eea2921-4f10-7613-4255-a2c3121d1c50.png)

ここに不要なショートカットを列挙して、`"command"` キーの値の先頭に、`"-”`（ハイフン）を追加する。

![ショートカットの無効化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87370/601f16af-8f33-ec40-68ae-9e9f3aa589f1.png)

※無効化するだけなので、`"when"` キーは不要

スッキリした。

## 参考
[VSCodeのキーボードショートカットのキーバインディングを削除する方法](https://qiita.com/hogesuke_1/items/b9745495e7c6c71ecf42)