OmniAICreator/Qiita-1.07M huggingface dataset:
VonageのVerify APIで柔軟なWorkflowsを使ってみる

この記事はVonageのVerifyAPIの柔軟なWorkflowsを使い方を説明します

概要説明
---------------------------------------
Vonage Verify APIは、ユーザーがPINコードを送信して入力を求めることにより、ユーザーが正確で有効な電話番号を入力したことを確認できるように設計されています。

デフォルトでは、これは最初にPINコードを含むSMSを送信しますが、SMSで二要素認証が完了しない場合は続いてPINを含む音声メッセージを含む電話に移行します。電話については二要素認証が完了しない場合は、最大2回実施されます。

これらのWorkflowsによるマルチステップが実装されいる事で、ユーザーの電話番号での二要素認証の成功率が大幅に向上します。しかしながら、、これが全てのユーザーにとって最適のワークフローではないケースがある事から柔軟なWorkflowsが実装されました。

ワークフローを制御
---------------------------------------
ワークフローは、APPの設計やビジネスユースケースにより「適切な」ワークフローが異なる場合があります。そのため、Verify APIでは、API呼び出しを行うときにworkflow_idを指定できるようになりました。指定可能なワークフローパターンは５種類あり、いずれからも選択できるようになりました。

追加のパラメーターが既存のパラメーターと一緒に追加されるため、API呼び出しは次のようになります（Node.js記述）

```nexmo.verify.request({
  number: RECIPIENT_NUMBER,
  brand: BRAND_NAME,
  workflow_id: WORKFLOW_ID
}, (err, result) => {
  if (err) {
    console.error(err);
  } else {
    const verifyRequestId = result.request_id;
    console.log('request_id', verifyRequestId);
  }
});
```


このコードスニペットは、Vonage開発者ポータルで他の言語でも見つけることができます。

WorkFlowsの指定方法
---------------------------------------
Workflow_idには、1〜5の任意の整数を指定できます。これらの数値が表すワークフローは、次のとおりです。


Workflow 1 (Default Workflow): SMS -> TTS -> TTS
---------------------------------------
こちらはデフォルトの動作となり、SMSによるテキストメッセージでPINコードを送信し、リクエストがまだ認証されない場合は、2回の後続の音声通話でフォローアップされます。広く一般的に利用されているワークフローとなる事から、Workflows選択に困った場合はこちらをお勧めします。

Workflow 2: SMS -> SMS -> TTS
---------------------------------------
テキストメッセージで1回目及び2回目にPINコードを送信し、リクエストが認証されない場合は最後に音声通話を送信します。 SMSでの対応がが音声通話よりも望ましい地域やユーザー向けのワークフローとなります。

Workflow 3: TTS -> TTS
---------------------------------------
1回目および2回目ともユーザーに電話してPINコードを音声で伝え認証を促すワークフローとなります。SMSが届き難い等の理由から電話での対応が最適である場合に最適なワークフローとなります。

Workflow 4: SMS -> SMS
---------------------------------------
1回目および2回目ともユーザーにテキストメッセージでPINコードを送信し認証を促すワークフローです。電話が苦手なミレニアル世代等を多くにユーザーを持つサービスには最適なワークフローです。

Workflow 5: SMS -> TTS
---------------------------------------
Workflow　1のデフォルトワークフローと同じですが、電話での認証は1回PINコードを送信し認証を促します。テキストとスピーチの両方を提供しますが、それぞれを1回だけ試行するだけなので2回の電話が煩わしい場合に最適なワークフローです。

参照記事
---------------------------------------
https://learn.vonage.com/blog/2019/10/02/flexible-workflows-for-verify-api-dr/

上記の内容について不明な点がありましたら、以下までご連絡下さい。
連絡先
---------------------------------------
Vonage Japan合同会社
Mail: sales-japan@vonage.com
URL: https://www.vonagebusiness.jp/communications-apis/
RHEL8のdnfコマンドで Cannot download repomd.xml エラー

# 概要
仮想マシン上のRHEL8で、パッケージマネージャdnfを実行すると以下のエラーが発生することがある。

```
# dnf install -y iproute-tc
Updating Subscription Management repositories.
Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)                                                                                                                                                     431  B/s | 364  B     00:00
Errors during downloading metadata for repository 'rhel-8-for-x86_64-appstream-rpms':
  - Status code: 403 for https://cdn.redhat.com/content/dist/rhel8/8/x86_64/appstream/os/repodata/repomd.xml (IP: 10.210.6.254)
エラー: repo 'rhel-8-for-x86_64-appstream-rpms' のメタデータのダウンロードに失敗しました : Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
```

どうもスナップショットの取得・リストアを行う際に発生する模様。
https://stackoverflow.com/questions/59857492/dnf-broken-all-mirrors-were-tried
にあるように、/etc/yum.repos.d/を掃除するなどしたが、解決しない。

# 環境
- ESXi 6.5上の仮想マシン
- RedHat Enterprise Linux 8.4 (Ootpa)

# 対策
subscription-managerでマシンを再登録後、サブスクリプションを割り当て直す。


```
# subscription-manager register --force
登録の解除中: subscription.rhsm.redhat.com:443/subscription
UUID が XXX のシステムの登録は解除されました
ローカルデータがすべて削除されました
登録中: subscription.rhsm.redhat.com:443/subscription
ユーザー名: hoge
パスワード:
このシステムは、次の ID で登録されました: XXXX
登録したシステム名: fuga

# subscription-manager subscribe
インストール済み製品の現在の状態:
製品名: Red Hat Enterprise Linux for x86_64
状態:   サブスクライブ済み
```

dnf再実行

```
dnf install -y iproute-tc
Updating Subscription Management repositories.
Red Hat Enterprise Linux 8 for x86_64 - BaseOS (RPMs)                                                                                                                                                        5.6 MB/s |  37 MB     00:06
Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)                                                                                                                                                      17 MB/s |  32 MB     00:01
依存関係が解決しました。
=============================================================================================================================================================================================================================================
 パッケージ                                           アーキテクチャー                                 バージョン                                              リポジトリー                                                            サイズ
=============================================================================================================================================================================================================================================
インストール:
 iproute-tc                                           x86_64                                           5.9.0-4.el8                                             rhel-8-for-x86_64-baseos-rpms                                           459 k

トランザクションの概要
（略）

インストール済み:
  iproute-tc-5.9.0-4.el8.x86_64

完了しました!
```

どうもスナップショットのリストアでデータが不整合になっている感じ？
この辺はCentOSの方が楽で良いかも。
2021年のエンジニア新人研修

自分のメモとして



###参考サイト
https://mixi-developers.mixi.co.jp/21-technical-training-a0bcdbf9bca0

https://blog.recruit.co.jp/rtc/2021/08/20/recruit-bootcamp-2021/

https://tech.pepabo.com/2021/09/21/newbie-training-2021/

https://blog.cybozu.io/entry/2021/07/20/100000
【js】ハンバーガーメニューでうまくいかんかったやつ

自分用メモ

ハンバーガーメニューの表示非表示に下記のコードを入れてた。
けど、PCで普通のメニューが表示されてる状態からウィンドウ幅をうにうにするとハンバーガーボタンが出てるのに押せない。

```js:だめ.js
$(window).on("load", function() {
    var w = $(window).width();
    var x = 1024;
    if (w <= x) { //1024px以下
       
$(function(){
	console.debug('ハンバーガー開始');
	$('.ハンバーガーボタン').click(function(){
	$('.ハンバーガーメニュー,.ハンバーガーボタン,body').toggleClass('f_js-open'); 
	});
	console.debug('ハンバーガー終わり');
    });
    } else { //1024px以上
	console.debug('PCでちゅわ');
    }
});
```

修正したやつ。$(window).on("load", function() {もいらないかも。
jsはページ読み込んだ時にだけ読まれるから、ウィンドウ幅変わっても横幅取得しなくてずっと「PCでちゅわ」になってるんだべと先輩に教えてもらいました。
CSSと同じとおもったらだめだべ雑魚まんじゅう〜。

```js:いい.js
$(window).on("load", function() {
    // var w = $(window).width();
    // var x = 1024;
    // if (w <= x) { //1024px以下
       
$(function(){
	console.debug('ハンバーガー開始');
	$('.ハンバーガーボタン').click(function(){
	$('..ハンバーガーメニュー,.ハンバーガーボタン,body').toggleClass('f_js-open'); 
	});
	console.debug('ハンバーガー終わり');
    });
 //    } else { //1024px以上
	// console.debug('PCでちゅわ');
 //    }
});
```
Macでnpmパッケージのインストールに失敗した時の解決方法【一撃です】

# 対象者

- Macを使っている人
- 初めてnpmのパッケージをグローバルでインストールした人
- 1のコードを実行した人

1:

```bash
npm install -g <パッケージ名>
```

- 2のエラーに遭遇した人

2:

```bash
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! syscall access
npm ERR! path /usr/local/lib/node_modules
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  [Error: EACCES: permission denied, access '/usr/local/lib/node_modules'] {
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules'
npm ERR! }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.
```

# 解決方法

- ３のコードをターミナルで実行します

3:

```bash
sudo chown -R $USER /usr/local/lib/node_modules
```

もう一度 、1のコードを実行すると、4（例）のメッセージが表示され、インストール成功です。

4（例）:

```bash
/usr/local/bin/reload -> /usr/local/lib/node_modules/reload/bin/reload
+ reload@3.2.0
added 52 packages from 52 contributors in 5.123s
```

# それでもうまくいかない場合

インストール先のディレクトリ名が６と同じか、確認してください。

異なる場合は、ディレクトリ名を変更後、ふたたびインストールしてください。

6:

```bash
/usr/local/lib/node_modules
```

[さらに詳しく知りたい方は「How to fix the "Missing write access" error when using npm」をよんでください。](https://flaviocopes.com/npm-fix-missing-write-access-error/)
PHP Conference Japan 2021に登壇しました。

## はじめに

[PHP Conference Japan 2021](https://phpcon.php.gr.jp/2021/)というイベントに参加・登壇してきました！
僕が所属している[Hamee株式会社](https://recruit.hamee.co.jp/)は本イベントのスポンサーをしており、弊社からも何名か登壇しておりました。
（茶室のCMの会社です！）

## 登壇

以前にbuilderscon tokyo 2019にて飛び込みLTの発表はしたことがありましたが
プロポーザル採択による登壇は初めてでした。
（ﾎﾟｺﾝ プロポーザル採択による登壇の実績を解除しました٩( 'ω' )و）
社内での勉強会でも散々登壇しているのでそこまで緊張することはなかったですが、LTの控室zoomで待ってる間はさすがにちょっと緊張しました。
発表資料はこちらです。

https://speakerdeck.com/yamamotohiroya/kanhuarensuhahuidobatukugada-shi

フィードバックの大切さを伝えるために登壇してきました。
実行委員長が発表順を意図的に最後にしたようで、大トリという大役でさらに緊張しました。
発表後にdiscordやtwitterを見る感じ、結構刺さっていたようで良かったです。
↓は登壇時の様子です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67471/dd2a318d-02c2-4159-014e-f0ed8e29585e.png)

https://www.youtube.com/watch?v=7oQkc9YdOY8
ここからアーカイブ視聴ができます。
（8:07:00付近です。）

## 良かった点

* LT登壇できた！
* 発表テーマについてdiscordで盛り上がることができた
* 業務で悩んでることに関して、他社でも同様のことで悩んでいることが知れた

## 悪かった点

* OP,EDが盛り上がりに欠けた
* discord盛り上がりすぎて本編聞いてなかった
* セッションテーマに偏りが見られた？
    * 　今回は静的解析、MySQLインデックスがやや多かったか？
* 　自身の発表直前のセッションは集中して聞けない

## まとめ

やはり勉強会参加は楽しいですね！
明日から業務に活きる知識っていうのは正直なかなかないが、意識とモチベが上がるのが大変良かったです。
今回はプロポーザル採択でLT登壇という目標も達成できました。
ただ実はレギュラーセッションにもプロポーザルを投げていて、そっちは採択されませんでした。
次はレギュラーセッション登壇を目標に頑張りたいと思います！
[Rails] Rspec基礎 system spec

Rspecについて勉強した時のメモです。

# System Specとは
プログラムによってブラウザを操作し想定通りに動作するのかを確認するテストのことです。

system specの具体的な流れは、
①画面が正しく表示されているかを確認したい
②画面の表示に必要なデータの作成
③プログラムによってブラウザが想定通りに表示されているかを確認する

# 準備
system specはブラウザを操作してテストするのでchromdriverというソフトフェアをインストールする必要があります。

※Google Chromeを元々使用しているのが前提です。

```ruby:ターミナル 
$ brew cask install chromedriver 
``` 

```ruby:ターミナル 
chromedriver was successfully installed! 
``` 
と出たらインストール完了です。

# 実装
前提として前回同様`User`が`title`と`content`カラムを持つ`Article`モデルを投稿できるシンプルなCRUDアプリを想定しています。

テストするフォルダとファイルを作ります

```ruby:ターミナル
$ mkdir spec/system
$ touch spec/system/article_spec.rb
```

まずは動作確認がてら簡単なテストを書いていきます。

```ruby:spec/system/article_spec.rb
require 'rails_helper'

RSpec.describe 'Article', type: :system do
  it '記事一覧表示' do
    visit root_path
  end
end
```
Railsには元々Capybaraというgemがインストールされていて、このCapybaraを使うとRubyでブラウザを操作するためのメソッドを使用できます。
今回の`visit`というのはこのCapybaraから提供されたメソッドで、この`visit`を使うことでプログラムで指定したパスを開いてくれます。

テスト実行

```ruby:ターミナル 
$ bundle exec rspec:spec/system/article_spec.rb

.

Finished in 4.2 seconds (files took 4.26 seconds to load)
1 example, 0 failures
```

一瞬ブラウザが立ち上がりテスト成功できてればOKです。

ではダミーデータを入れて実際にテストしていきましょう！

### have_content

```ruby:spec/system/article_spec.rb
require 'rails_helper'

RSpec.describe 'Article', type: :system do
  let!(:user) { create(:user) }
  let!(:articles) { create_list(:article, 3, user: user) }

  it '記事一覧表示' do
    visit root_path
    articles.each do |article|
      expect(page).to have_content(article.title)
    end
  end
end

```

`have_content`を使うと今回で言う`article.title`が存在するかしないかをテストしてくれます。
それを`each`を使って繰り返すことでダミーデータ分全てをテストすることができます。

### click_on

`click_on`は指定した文字列のaタグをクリックしてくれるメソッドです。
今回は`article.title`をaタグにしているので、クリックして記事詳細画面へ遷移します。
そして記事詳細ページで`title`と`content`がきちんと表示されているかをテストしています。


```ruby:spec/system/article_spec.rb
it '記事詳細表示' do
    visit root_path

    article = articles.first
    click_on article.title

    expect(page).to have_css('.article_title', text: article.title)
    expect(page).to have_css('.article_content', text: article.content)
  end
```

それではコード全体を確認して、テストしていきましょう！

```ruby:spec/system/article_spec.rb
require 'rails_helper'

RSpec.describe 'Article', type: :system do
  let!(:user) { create(:user) }
  let!(:articles) { create_list(:article, 3, user: user) }

  it '記事一覧表示' do
    visit root_path
    articles.each do |article|
      expect(page).to have_css('.article_title', text: article.title)
    end
  end

  it '記事詳細表示' do
    visit root_path

    article = articles.first
    click_on article.title

    expect(page).to have_css('.article_title', text: article.title)
    expect(page).to have_css('.article_content', text: article.content)
  end
end

```

記事一覧ページから詳細ページに遷移している挙動を確認できてテストが成功してればOKです。

```ruby:ターミナル 
$ bundle exec rspec:spec/system/article_spec.rb

..

Finished in 4.48 seconds (files took 2.1 seconds to load)
2 example, 0 failures
```

基礎編は以上です。
次は実際にポートフォリオで実装したテストを解説して行こうと思います！
One message DB設計

# users ユーザー
| カラム名  | 型  | 主キー| 説明  | 外部キー | オプション | NULL許容 | 
|---|---|---|---|---|---|---|
| id | UUID | ○ | ID |  | | |
| name | varchar(32) |  | ユーザーネーム |  | | |
| email | varchar(255) |  | メールアドレス |  | | |
| password | varchar(255) |  | パスワード |  | | |
| accountLocked | boolean |  | ユーザーロック |  | | |
| createAt | datetime |  | 作成日時 |  | | |
| updateAt | datetime |  | 更新日時 |  | | |

#twitterAccounts Twitterアカウント情報
| カラム名  | 型  | 主キー| 説明  | 外部キー | オプション | NULL許容 | 
|---|---|---|---|---|---|---|
| id | int | ○ | ID |  | | |
| userId | UUID |  | ユーザーID | users:id | | |
| accessToken | varchar |  | twitterのアクセストークン |  | | |
| secretKey | varchar |  | twitterの秘密鍵 |  | | |
| create_at | datetime |  | 作成日時 |  | | |
| update_at | datetime |  | 更新日時 |  | | |

#lineAccounts LINEアカウント情報
| カラム名  | 型  | 主キー| 説明  | 外部キー | オプション | NULL許容 | 
|---|---|---|---|---|---|---|
| id | int | ○ | ID |  | | |
| userId | UUID |  | ユーザーID | users:id | | |
| channelToken | varchar |  | チャンネルトークン |  | | |
| create_at | datetime |  | 作成日時 |  | | |
| update_at | datetime |  | 更新日時 |  | | |
Linux各ディレクトリの役割

## 一般的なLinuxのディレクトリ構造
```
 root/
 　├ bin/
 　├ dev/
 　├ etc/
 　├ home/
   │   ├ test1
   │   └ test2
   ├ sbin/
   ├ tmp/
   ├ usr/
   │  ├ bin
   │  ├ lib
   │  └ local
   └ var/
```
一番上の「/」というディレクトリはルートディレクトリと呼びます。すべてのファイルとディレクトリは、その親をたどっていくとこのルートディレクトリにたどり着きます。

## 各ディレクトリの役割

- /bin
       - 一般ユーザーおよび管理者ユーザの両方が利用するコマンドの、実行ファイルを置くためのディレクトリ。実行ファイルはLinuxの様々な場所に配置されているが、/binはその中でも特にLinuxシステムの動作に最低限必要な、重要度の高いコマンドを格納している
- /dev
    - デバイスファイルを格納するディレクトリ。デバイスファイルとはディスクやキーボードなどのハードウェアをファイルとして扱えるように用意された、特殊なファイル
- /etc
    - 設定ファイルを置くためのディレクトリ。Linuxで動作する様々なアプリケーションの設定のためには、通常はテキスト形式の設定ファイル（コンフィグファイル）が使用される。
- /home
    - ユーザごとに割り当てられる、ホームディレクトリが配置されるディレクトリ。ホームディレクトリとは、Linuxのユーザごとにそれぞれ割り当てられる個人用ディレクトリのことで、ユーザ名がそのままディレクトリ名になっている。例えばユーザtestのホームディレクトリは、/home/testになる。ユーザはこのホームディレクトリ内に、自由にファイルやディレクトリを作成して作業を行うことが出来る。
- /sbin
    - /binと似ており、これも実行ファイルを置くためのディレクトリ。しかしこちらは管理者ユーザ向けのコマンドが置かれている。
- /tmp
    - 一時的なファイル（テンポラリファイル）を置くためのディレクトリ。アプリケーションの実行中に作業途中の結果などを一時的にファイルとして保存する際には、このディレクトリの下に作成するのが一般的。
- /usr
    - 各種アプリケーションと、それに付随するファイルを置くためのディレクトリ。追加アプリケーションをインストールした際に、実行ファイルやドキュメント、ライブラリなどがこのディレクトリの下に配置されます。/usrディレクトリは、そのサブディレクトリとして、binやsbin,etcなどを持ち、内部にルートディレクトリは以下と似た構造を持つ。
- /var
    - 変化する(variable)データを置くためのディレクトリ。アプリケーションを動作する上で作成されたデータやログ、電子メールなどがこのディレクトリに格納される。/varはたくさんのファイルが書き込まれ、容量もひっ迫することが多いため、システム管理の上で注意が必要なディレクトリ。
MySQL8のrootでログインできない謎を解決

# エッ、rootログインできんだけど・・・
* いやいやほんとに勘弁してください

```
aaaaaa@aaaaa1001:~/bin$ mysql -uroot
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
```

# 結論
* Debian/Ubuntu系でのMySQL8からauth_socketというプラグインが使われる
* LinuxのアカウントがそのままMySQLでも適用される
* hogehoge_userではrootログインできない
* rootユーザになってからmysql -uroot すれば解決

これだけですけど、まじでわからなくて焦りました・・・
MikTexへのjlisting.styの導入 (Windows)

備忘録です．

## 手順

- `jlisting.sty`を手に入れる
- `C:\Program Files\MiKTeX\tex\latex\listings`に`jlisting.sty`を入れる
- 管理者権限でPowerShellを立ち上げて`C:\Program Files\MiKTeX\tex\latex\listings`に移動する

```terminal
cd "C:\Program Files\MiKTeX\tex\latex\listings"
```

- 次の2つのコマンドを実行する


```terminal
initexmf --admin -u
initexmf --admin --dump
```

## 参考文献
https://tex.stackexchange.com/questions/64133/sty-file-not-found
ファイヤウォールについて

#はじめに

この記事はファイヤウォールについての学習メモです。
間違いなどありましたらご指摘いただけると大変嬉しいです。

#使用しているサーバーOS

・CentOS7

#ファイヤウォールの役割

ファイヤウォールの役割は、HTTPなど提供したいサービスの通信プロトコルはオープンにし、使わないサービスはブロックしてくれます。

ファイヤウォールは和訳すると「防火壁」という意味です。イメージとしては使っているサービスの蓋は開けといて、使っていないサービスの蓋は閉じておくようなイメージです。

#プロトコルとポート番号

httpやhttpsといったサービスにはそれぞれプロトコルとポート番号が割り当てられています。
プロトコルにはTCPとUDPがあり、それぞれにポート番号の概念があります。http（TCP ポート番号８０）やhttps（TCP ポート番号４４３）、ssh（TCP ポート番号２２）など私たちがよく使うサービスはTCPのサービスが多いです。

TCPとUDPの違いは大まかに言うと、

・信頼性が求められる通信はTCP
・信頼性よりも、大量のデータをやりとりしたい場合はUDP

というように分けられます。

#ファイヤウォールコマンド（firewalld）

firewalld（ファイヤウォールディー）で使うコマンドはfirewall-cmdです。

・firewallが起動中か確認するコマンド

```
# firewall-cmd --state
```

起動中の時は「running」、停止中の時は「not running」と表示されます。

・現在のファイヤウォール設定を確認するコマンド

```
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: dhcpv6-client http https ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

"services"の行が現在有効になっているサービスです。現在はhttp、https、sshが有効になっています。

#参考文献

・[ネコでもわかる！さくらのVPS講座 ～第七回「ファイアウォール”firewalld”について理解しよう」](https://knowledge.sakura.ad.jp/10583/)
PandasでExcelからCSVに変換するときにゼロ埋め数値を維持する


ゼロ埋めした数字が読み込むと同時に消える現象が発生。
型指定して読み込もうとしたが、dtype='object'のオプションをつけるのでも対応できる。


```
xlsx = pd.read_excel(excel_path + fileName + '.xlsx', dtype='object')
```



[Python: Keep leading zeroes when converting from excel to CSV with pandas](https://stackoverflow.com/questions/53496494/python-keep-leading-zeroes-when-converting-from-excel-to-csv-with-pandas)
AWS CLIでパラメータストアからパラメータを削除するコマンド

AWS CLIの操作が得意では無いので、備忘として残しておきます。
なお、すべてのコマンドが知りたい場合は公式資料を見るのが一番確実です。

https://docs.aws.amazon.com/cli/latest/reference/ssm/delete-parameter.html

## AWS CLIコマンドの基本
AWS CLIコマンドの基本形は以下です。
[options]には大体サービス名の略称が入ります。

```
aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
```

パラメータストアで言うとSystems Managerが対象のサービスなので、optionsはssmになります。
公式ドキュメントでもoptionsは確認できるので、以下の画像の部分を参考にしてみてください。

![options.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2055433/5c6a60fe-f63f-cf0c-8cff-ea662fb8fe0b.png)
https://docs.aws.amazon.com/cli/latest/reference/ssm/delete-parameter.html


## DELETEコマンド

```shell
aws ssm delete-parameter --name "parameter-name"
```

複数のAWSアカウントを管理している場合、profileパラメータにprofile名を入れる。

```shell
aws ssm delete-parameter --name "parameter-name"  --profile "profile-name"
```

## GETコマンド

```shell
aws ssm get-parameter --name "parameter-name"
```
[Go言語] Golang + AWS Lambdaを実行するとfork/exec /var/task/main: exec format error: PathError

## 概要
Serverless FrameworkやSAMやbuildしたものをそのまま上げてみるなどして、AWS LambdaにGoをデプロイするとどのケースでも以下のエラーがCloudWatchに出力されていた。筆者はM1　Macを使っていることで詰まった。

```
fork/exec /var/task/main: exec format error: PathError
null
```

## 解決策

### 一般的な解決法
go buildがなんかしらおかしいはずです。以下のようにgo buildはしましたか？
生成したバイナリのディレクトリ位置も確認してみたください。

```
$ GOOS=linux go build .
```

### M1 Macユーザー
go build時にLambdaで指定しているアーキテクチャに合わせていますか？
デフォルトはx86_64のため設定を変更をしていなければ以下のようにamd64でbuildするようにする

```
$ GOARCH=amd64 GOOS=linux go build .
```
[React]useReducerでネスト・入れ子されたオブジェクトを格納

https://www.reddit.com/r/reactjs/comments/d1psi2/react_reaching_nested_state_items_w_reducer/

https://zenn.dev/tetzng/articles/b406f2291b799a

```Form_nexted_objects.js]

export const initialState = {
  postDetail: { 
       postContent: ""
       comments: [{
          commentContent: ""
       }] 
   },
};
    case COMMENT_INPUT_TEXT:
      return { 
        ...state, 
        postDetail: {
          ...state.postDetail,
          comments: [
            ...state.postDetail.comments.slice(0, action.index),
            { ...state.postDetail.comments[action.index], [action.field]: action.payload },
            ...state.postDetail.comments.slice(action.index + 1),
          ],
        }
      };


  const handleCommentChange = (event) => {
    postDispatch({ 
      type: COMMENT_INPUT_TEXT,
      field: event.target.name,
      payload: event.target.value
    });
  };

  <input
    label="comment"
    multiline
    rows={6}
    name="commentContent"
    value={comments.commentContent}
    onChange={handleCommentChange}
  /> <br />

```
Logstash を WSL2（Ubuntu）にインストールする

# はじめに
業務で Logstash の導入検討を行ったので、自分のPCにも環境構築をしてみた。その手順を備忘録を兼ねて記事にしておく。なお、基本的に公式のwebページの手順通りにインストールを行った。
https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

また基本的には「[Elasticsearch を WSL2（Ubuntu）にインストールする](https://qiita.com/ryamamoto0406/items/3067e69286cecafb6e5a)」と同じ手順を行っている。

# インストール手順
前半のコマンドについての詳細は「[Elasticsearch を WSL2（Ubuntu）にインストールする](https://qiita.com/ryamamoto0406/items/3067e69286cecafb6e5a)」を参照との事。

```bash
$ wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
$ sudo apt-get install apt-transport-https
$ echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list
```

これで apt-get でインストールする準備が整う。

```bash
$ sudo apt-get update && sudo apt-get install logstash
```

# Logstash の起動&停止 (systemd)
起動、停止するには以下のコマンドを実行する。

```bash
sudo systemctl start logstash.service
sudo systemctl stop logstash.service
```

# おわりに
Elasticsearch でインストールしていたのと同じ方法で Logstash も導入することができた。その使用方法についても記事にしていければと思う。
[新機能]Githubのissueで求人できるようにしました

みなさんがお使いのGithubのissueで簡単に求人できるようにしました！
[このGithubApp](https://github.com/apps/issue-github-app)をリポジトリにインストールすると、issueを投稿できるようになります。

# 今回作ったGithubApp
https://github.com/apps/issue-github-app

## サンプルはこちら
https://github.com/resource-inc-dev/issue-github-app-lp/issues/2

# 仕組み
![image](https://user-images.githubusercontent.com/19757050/135707009-aff2ef05-d4fc-47ec-99d7-2db160f15f60.png)

このGithubAppをOrgnazationで所有するリポジトリにインストールすることで、
Githubからissueを簡単に「ISSUE」に投稿できるようになります。

# できること
### 開発をブーストします🔥
今月中にリリースしたい機能があるけど、社内の開発チームが別のタスクに取り組んで手が離せない時に便利です。必要なエンジニアを急募できます。

### 特定分野の技術力をスポットで獲得💡
データポータル、OGP画像生成サーバの構築、ElasticSearchへの移行、ページパフォーマンスの改善のような特定分野の知見が欲しい場合に便利です。ピンポイントで経験したことがあるエンジニアを急募できます。

### そのまま継続してもらうことも👍
作業完了後、継続して仕事してもらうこともできます。
技術力があるか、相性がいいか最初にチェックできる点が好評です。

# 使い方
1. Organazationを選択する
2. インストールしたいリポジトリを選択する
3. 投稿したいissueのタイトルに[ISSUE]を追加すると、issueが投稿される
4. 応募が来ると、issueにコメントが届く


![image](https://user-images.githubusercontent.com/19757050/135707852-8600983e-9fc4-431d-b336-cb13ff99d450.png)


# ▼ 1. GithubAppをOrganazationにインストール

![image](https://user-images.githubusercontent.com/19757050/135705064-bfbbb8a5-915a-41c5-9600-1d4be75e979b.png)

# ▼ 2. リポジトリを指定して、issueを投稿できるようにする

![image](https://user-images.githubusercontent.com/19757050/135705218-fe53760c-f368-4d2e-96f3-524255f62e9b.png)

# ▼ 3. 投稿したいissueのタイトルに[ISSUE]を追加すると、issueが投稿される
![image](https://user-images.githubusercontent.com/19757050/134761160-cec5bcf3-b895-4dbe-8802-ffbef05ce1cc.png)

# ▼ 4. 応募が来ると、issueにコメントが届く
![image](https://user-images.githubusercontent.com/19757050/135705322-3c6e03e7-5843-4ced-8179-d05f30f11fe6.png)


# インストールはこちら
* [インストール画面](https://github.com/apps/issue-github-app)
* [ISSUE](https://i-ssue.com/)




[@issueissue4](https://twitter.com/issueissue4)で情報発信しています。
ぜひフォローしてみてください！フォローすればいち早くissueに応募できます。
【初心者向け】IoTからIoBへの変移

##`はじめに`
IT社会化の具体例としてよく挙げられるIoTだが、
近年では次のステップとして、IoBへと発展している傾向にある。

#■IoTとは
##`「モノのインターネット」`
>"Internet of Things"

情報伝達のための機能をモノに組み込み、インターネットを経由することで
モノからデータ取得したりモノそのものを遠隔操作する仕組みのこと。

##`IoTのもたらす効果`
・`監視`
　　離れた場所にあるモノの状態を遠隔からモニタリングできる状態
　　例：医療機器の状態を監視して、異常が発生した場合に看護師に通知するなど。
・`制御`
　　通信を介した外部からの指示でモノを操作できる状態
　　例：スマートフォンのアプリを通じて帰宅前にエアコンのスイッチを入れておく
　　　（リモコンのように、「電源を入れる」という情報がエアコン本体に送信される）
・`最適化`
　　監視と制御によって得られたデータを基に、
　　人間が与えた基準に準じた状態を自ら見つけ、モノの状態を最適に保つことのできる状態
　　（=条件指定してあげれば、最適解を求めてくれる）
　　例：工業機械に異常が発生した際、蓄積されたデータおよび指定した条件を基に
　　　　故障原因を自動的に分析して作業員にアラート検知する。

・`自律化`
　　目標値などの最低限の指示のみ与えれば、人間による細かな条件や基準がなくても
　　自律的に最適な状態を判断し、モノ同士が協調して動作できる状態
　　（=自動で条件を見つけ、最適解を求めてくれる）
　　例：自動車の自動運転システム。
　　　　目的地を設定しておくだけで、車に搭載された各種機器が周囲の地形や交通状況を監視／蓄積し、
　　　　走行に必要なハンドル操作やアクセル／ブレーキを自動的に行う。


#■IoTからIoBへ
##`「身体のインターネット」`
>"Internet of Bodies"

人間の体とインターネットをつなげる技術のこと。
例えば、医療分野における心臓ペースメーカーも、
体の中にデバイスを埋め込むという意味でIoBに含まれる。

※ただし、IT業界におけるトレンドとして取り上げられているのは
　こちらの意味ではなく、後述の意味の方である。

https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20201112?_fsi=WHYf4x93

##`「行動のインターネット」`
>"Internet of Behaviors"

ひとの動作、すなわち位置情報、運動履歴、購買履歴などをデバイスから取得し、
快適な生活を実現するために活用する技術のこと。

例えば、以下の接触確認アプリは
アプリを導入したデバイスの位置情報を追跡し、サーバに転送している。
得られたデータから濃厚接触のリスクを判定した上で
次に取るべき対応（医療機関への受診など）を案内している。

https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/cocoa_00138.html



#■余談
IoTについては基本情報技術者試験で度々出題される。
近年のトレンドに則り、今後はIoBについても問われる可能性があるかも。

https://www.fe-siken.com/kakomon/30_haru/q71.html

https://www.fe-siken.com/kakomon/28_haru/q65.html

応用情報ではIoTの概念を知っている前提で、その役割について問われている。

https://www.ap-siken.com/kakomon/30_aki/q71.html

#■参考文献

https://persol-tech-s.co.jp/hatalabo/mono_engineer/559.html

https://blogs.itmedia.co.jp/itsolutionjuku/2016/10/iot4.html
Julia: BigIntがらみのコツのメモ

JuliaのBigIntがらみのコツをまとめた自分用メモ。

# BigIntと文字列表現との相互変換

整数と文字列表現との相互変換は、↓にまとめられている。

* <https://qiita.com/mametank/items/fa265ed3aa40825ea8e2>

その方法は、BigIntでも基本的に使える。

# BigIntとBitArrayとの相互変換

## BigIntをBitArrayに変換

下記は、BigIntに限らず、通常の整数にも使える。

例: x::BigIntをBitArrayに変換。ビット数は、xを表現するのに必要十分なビット数になる。

```
BitArray(digits(x,base=2))
```

例: x::BigIntをBitArrayに変換。ビット数を256に指定する。xが小さい値の場合、上位ビットが0で埋められる。

```
BitArray(digits(x,base=2,pad=256))
```

注: 戻り値をar::BitArrayとしたとき、xの最下位ビットがar[1]、最上位ビットがar[end]としたビット配列になる。

## BitArrayをBigIntに変換

変換するための標準の関数は用意されていないみたい。
自力で書く。
それでも大したことはない。

参考: 
<https://discourse.julialang.org/t/parse-an-array-of-bits-bitarray-to-an-integer/42361>

例: BitArrayをBigIntに変換する関数to_bigint

```
to_bigint(ar::BitArray) = sum(((i, x),) -> big(x) << ((i-1) * 8sizeof(x)), enumerate(ar.chunks))
```

ビット単位ではなく、`ar.chunks`してInt単位で変換しているので速い。

注: ar[1]を最下位ビット、ar[end]を最上位ビットとしたBigIntになる。
ECSのtask definitionで複数フィールドでクエリしたいとき

jqのドキュメントと照らし合わせながら見つけました

## 方法

以下のようにやれば、`taskDefinitionArn`と`containerDefinitions`が両方取れます。
もっといい方法がある気もしますが、、

```
$ aws ecs describe-task-definition --task-definition task \
--query 'taskDefinition | {
taskDefinitionArn: taskDefinitionArn,
containerDefinitions: containerDefinitions
}'

{
    "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:xxxxx:task-definition/task:12",
    "containerDefinitions": [
        {
--- 略 ---
```

配列ぽくとりたいとき

```
aws ecs describe-task-definition --task-definition task --query 'taskDefinition | [taskDefinitionArn, containerDefinitions]'
```

## おまけ

もともと以下のようにtaskDefinitionを取得してgithub actionsに突っ込んでいたのですが、 `resource is not in the state servicesStable` というエラーが出ていました。

```
$ aws ecs describe-task-definition --task-definition task \
--query taskDefinition
```

以下のようにクエリすることで回避できました。

```
$ aws ecs describe-task-definition --task-definition task \
--query 'taskDefinition |
{
        ipcMode: ipcMode,
        executionRoleArn: executionRoleArn,
        containerDefinitions: containerDefinitions,
        placementConstraints: placementConstraints,
        memory: memory,
        taskRoleArn: taskRoleArn,
        family: family,
        pidMode: pidMode,
        requiresCompatibilities: requiresCompatibilities,
        networkMode: networkMode,
        cpu: cpu,
        inferenceAccelerators: inferenceAccelerators,
        proxyConfiguration: proxyConfiguration,
        volumes: volumes
}' > task-definition.json
```
まだWebページをピクセル単位でデザインしますか？

# 初めに

筆者はバリバリのデザイナーではなく、web経験が浅いことを断っておきたい。そのため、内容は現場の実情に合わない、空虚な理想論に終始してしまうだろう。その際はお気軽にコメントください。

# ピクセル単位デザインが必要な場合

記事のタイトルはかなり挑発的だが、ピクセル単位のデザインが必要な場面は確かに存在する。
例えば動画。動画は配信フォーマットが決まっているので、そのサイズに収まるように文字を配置しなければならない。そのためにはピクセル単位できっちり文字サイズを決めて、何文字まで入れるとか文字の幅を狭めるとか調整する必要があるだろう。
また、ゲームもSwitchではよくてフルHD、PS5やXBOX Series Xなら最大4Kとハードごとに使用できる解像度が絞られるので、使用する解像度に合わせて文字サイズや表示位置、ドット絵の場合はドットの大きさなどを指定することになるはずだ。PCゲームも、アセットの解像度などの問題で、表示サイズは固定になる。

これらの環境でピクセル単位の調整が必要なのは、フォーマットが定まっているからだ。しかし、動画を扱うからと言って、動画サイト自身はピクセルに縛られる必要は無いというのが筆者の持論である。

# なぜWebページでもピクセル単位でデザインするのか

そもそも論として、どうしてデザイナーはWebページをピクセル単位でデザインしたがるのか。その理由は、本のデザインの影響ではないだろうか。

印刷物はA4、B5といった具合に紙のサイズが決まっており、その中に文字を収めるにはcmやポイント（ないし号数）単位の設計が必須だった。実物なのだから当然である。

そして、そのことに慣れっこなデザイナーは、Webをデザインする際にも、ディスプレイの最小単位であるpxを基準にデザインするようになったのではないか。

# pxは「絶対単位」とは言えない理由

しかし、PCディスプレイのピクセルの大きさはまちまちだ。同じフルHDディスプレイでも16インチと27インチでは当然ピクセルの大きさが変わる。後者の方がピクセルが大きくなる。ウィンドウのサイズもユーザーが自由に変更できるため、メディアクエリによっては不適切な表示になってしまうかもしれない。

それだけではない。画面自体の解像度もどんどん上がっている。最新ゲーム機を堪能すべく4Kディスプレイを買って、それをPCと共用する人も少なくないだろう。それで表示したサイトは小さい。世の中こんなに狭かったのかという思いにふけってしまう。

スマフォやタブレットも、機種ごとにピクセル数がまちまちで、新機種が出るたびにデバイスの横幅に合わせたメディアクエリを書き直さなければならなくなる。

さらに、デバイスピクセル比という概念が存在し、デバイス側で例えば画面の2pxを1px分として扱うということもある。iPhoneのRetinaディスプレイなど、サイズの割に高精細ディスプレイを備えるスマフォがよく取り入れているが、Windowsだって画面設定の「拡大縮小とレイアウト」から同様の設定をすることができる。

また、根本的な問題として、ページのpxを厳密に設定したとして、その中の文字数を計算するのは面倒である。例えばページ内の検索結果を300pxのカード形式で表すとして、中身の文字を16pxでデザインした場合、`300 ÷ 16 = 18.75`だから18文字くらい入る、といちいち計算しなければならない。そのため、計算を楽にするためだけに文字サイズが決定されてしまう事態が発生する。それは果たしてユーザー中心主義と言えますか？

ちなみにCSSにもcmなどの実物に即したように思われる単位があるが、[例えばcmは`96px/2.54`という値で定義されたものであり、実際の単位とはいずれも関係が全く無い](https://developer.mozilla.org/ja/docs/Web/CSS/length#%E5%8D%98%E4%BD%8D)。`1インチ = 96px`とされていた過去の時代の遺物であり、いつ廃止されてもおかしくは無い無用の長物である。厳密にはMacは長い間`1インチ = 72px`だったりもするが、話が長くなるので割愛する。

# Webデザインは「文字の大きさ」を旨とすべし

この事態に対する一つの解決方法として、**文字の大きさを単位としてデザインを決める**という方法がある。CSSの単位系で言えば`em`、`rem`、`ex`などがそれにあたる。特に`em`はフォントサイズなので、日本語などの幅が決まった文字とは相性が抜群である。ちなみに「水」という文字の大きさを単位とする`ic`という単位系も検討されているが、**基本的に`em`で十分**なためか[どのブラウザも実装しておらず](https://caniuse.com/mdn-css_types_length_ic)、影が薄い。

つまり、Webデザインにおけるコペルニクス的転回が発生しているわけだ。先ほどの検索結果カードの場合、結果に入れる文字数でサイズを決めればデザインが楽だし、フォントサイズ変更も問題なく行える。

ちなみに、筆者はBootstrapよりもFoundation派だが、それはメディアクエリを`em`ベースで書いているからである。真のレスポンシブを達成するためには`em`と`rem`の使用が欠かせない。つまり、サイト全体のサイズを`rem`で設定し、各要素のサイズは`em`で決めるのが現代のWebページデザインだ。

# まとめ
これからのWeb設計は、pxではなく、文字数を基準に作るといいはずだ。これから増えるであろう高解像度への対応も楽になる。4K対応のホームページが増えてほしいものである。
【Python】コードの実行時間を計測するためのストップウォッチを作る

```python
class StopWatch:
    """
    実行時間計測クラス
    ブロックを抜けたときに、ブロック全体の実行時間を表示する（例外発生時を除く）

    <使用例>
        with StopWatch('なんかの機能'):
            do_something()
    <表示例>
        なんかの機能
        実行時間： 01:23:45
    """
    # with ブロッックに入った時に呼び出される
    def __enter__(self, title=''):
        # 計測対象の名称
        self._title = title
        # 開始時間
        self._start_time = datetime.now()

    # with ブロッックを抜けた時に呼び出される
    def __exit__(self, exc_type, exc_value, traceback):
        # 例外が発生していないか
        if exc_type is None:
            # 終了時間
            end_time = datetime.now()
            # 処理時間 = 終了時間 - 開始時間（小数点切り捨て）
            exe_time = str(end_time - self._start_time).split('.')[0]
            # 計測対象の名称表示
            print(self._title)
            # 処理時間表示
            print('実行時間： ' + exe_time)

```
Vue3　deep watcher(ディープウォッチャー)に詰まったので備忘録

#はじめに
こんにちは！
業務上でvueのwatchを利用して監視させようと思ったら、なぜか監視してくれなかったのでその備忘録になります。
個人的にはドキュメントがわかりにくく、解決するのに苦労しました。

同様に悩まれている方の少しでも助けになれたらと思います。

ではいきましょう。

#ウォッチャとは
まずはwatchオプションについてです。
公式から抜粋したものが下記になります。

>ほとんどの場合、算出プロパティの方が適切ですが、カスタムウォッチャが必要な場合もあります。そのため Vue は、データの変更に反応するためのより汎用的な方法を、watch オプションによって提供しています。これはデータを変更するのに応じて非同期処理や重い処理を実行したい場合に最も便利です。

[引用元：vue.js公式ドキュメントより](https://v3.ja.vuejs.org/guide/computed.html#%E7%AE%97%E5%87%BA-setter-%E9%96%A2%E6%95%B0)

要は、watchで監視対象のデータを指定してあげて、
そのデータに何かしらの変更が加えられたときに予め用意されていた関数を実行するオプションになります。

個人的に、超便利なんで算出プロパティより多用してしまっています・・・

参考の書き方は以下になります。

```vue:公式ドキュメントより
<script>
  const watchExampleVM = Vue.createApp({
    data() {
      return {
        question: '',
        answer: 'Questions usually contain a question mark. ;-)'
      }
    },
    watch: {
      // question が変わるたびに、この関数が実行される
      question(newQuestion, oldQuestion) {
        if (newQuestion.indexOf('?') > -1) {
          this.getAnswer()
        }
      }
    },
    methods: {
      getAnswer() {
        this.answer = 'Thinking...'
        axios
          .get('https://yesno.wtf/api')
          .then(response => {
            this.answer = response.data.answer
          })
          .catch(error => {
            this.answer = 'Error! Could not reach the API. ' + error
          })
      }
    }
  }).mount('#watch-example')
</script>
```

watchで指定している `question`に変更が加えられるたびにwatchで登録している関数が実行される仕組みになっています。

#deep watcherについて
上記の説明でwatchの使い方はなんとなくわかったと思います。
ただ、watchで監視対象がオブジェクトの場合、特殊な宣言を入れなければならない点に注意してください。

それが、deep（それとhandler）を追加することです。

dataをオブジェクトに変更した場合の処理を記述します。

```vue
<script>
  const watchExampleVM = Vue.createApp({
    data() {
      return {
        books: [
            { id: 1, title: '坊っちゃん' },
            { id: 2, title: '人間失格' },
            { id: 3, title: 'ノルウェイの森' }
        ],
      }
    },
    watch: {
      books: {
        handler: function ()  //handlerプロパティ内に処理を記述
             console.log("変更")
         },
         deep: true　　　//deepをtrueへ変更
       }
     },
  }).mount('#watch-example')
```

上記のように、`handler`内に監視対象が変更された際実行したい処理を記述し、
`deep`をtrueに変更すればオブジェクトでも監視対象となります。

#最後に
これでまた一歩前進しましたね！
素のJavaScriptでローカルのXMLを読み込んで、新規のXMLを書き出す話

大本はRide with GPSからダウンロードした.gpxをGarminのOregonやeTrexで読める.gpxに変換するというお話です。

詳しい解説、実際に必要な箇所をユーザーが編集して動かせるサンプル…… そもそも何故こんなことをすることになったかの経緯はTicketnoteに書いてあります。よかったらあわせてどうぞ。
https://ticketnote.dev/ticket/DUpAHv85tU3vuFNuKE3v

---

Qiitaなので手短に。
HTMLとJavaScriptだけでローカルのXML（今回は.gpx）を読み込んで、読み込んだ内容から新規のXMLを書き出すというサンプルです。

<p class="codepen" data-height="300" data-default-tab="js,result" data-slug-hash="gORyNyN" data-user="kaitou1192" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kaitou1192/pen/gORyNyN">
  素のJavaScriptでローカルのXMLを読み込んで、新規のXMLを書き出す</a> by Kaitou (<a href="https://codepen.io/kaitou1192">@kaitou1192</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 1.ローカルのファイルの取得

```js
const setFile = (event) => {  
  const fileObject = event.target.files[0];
  
  const rwgGpx = new FileReader();
  rwgGpx.addEventListener('load', (event) => loadedFile(event));
  rwgGpx.readAsText(fileObject);
}
inputFile.addEventListener('change', (event) => setFile(event));
```
FileReader()
https://developer.mozilla.org/ja/docs/Web/API/FileReader/FileReader

# 2.ファイルの中の文字列を取り出し、DOMとして扱えるように変換

```js
  //ファイル内の文字列の取り出し
  const loadedGpx = event.target.result;

  //DOM準備
  const parser = new DOMParser();
  const temporaryGpx = parser.parseFromString(loadedGpx, 'application/xml');
```
DOMParser.parseFromString()
https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString

# 3.DOMの操作
ここでは詳しくは書きませんが、この時点で temporaryGpx.documentElement としてあげればDOMツリーとして扱えるようになり、querySelector や getElementById とかでHTMLを操作するのと同じ感覚でできます。

具体的なサンプルが見たい方は、こちらの最後の方にあるので確認してください。
https://ticketnote.dev/ticket/q1zKjfMRReQpbml4tyGy

# 4.DOMから文字列に変換
文字列に変換というかシリアライズしてファイルに出力する準備をしています。

```js
  const outputGpx = new XMLSerializer();
  let outputGpxText = outputGpx.serializeToString(temporaryGpx);
```
XMLSerializer
https://developer.mozilla.org/ja/docs/Web/API/XMLSerializer

# 5.blob経由でファイルに出力
先ほどのシリアライズしたものからblobを作成し、それをwindow.URL.createObjectURL経由でユーザーにダウンロードさせます。

```js
  const blob = new Blob([outputGpxText], {type: 'application/xml'});

  //ファイルをダウンロードさせる
  const a = document.createElement('a');
  a.href = window.URL.createObjectURL(blob);
  a.textContent = 'ダウンロード';
  a.download = 'output.gpx';

  download.appendChild(a);
```
Blob
https://developer.mozilla.org/ja/docs/Web/API/Blob
【Vue.js】VueCLIの導入

#はじめに
こんにちは。
Vue.jsのVueCLIについてアウトプットしていきます！

##VueCLIとは
Vue.jsを使ったアプリケーション開発を行う開発者をサポートするための、公式コマンドラインインタフェース。本格的なアプリ開発をする際、環境セットアップを簡単に行うことができる。

<br>

##開発環境の構築
ターミナルによりVueCLIに必要なバージョンを確認し、バージョンの表示がなければインストールを行う。

```
node -v        //Node.jsのバージョン確認
npm -v         //npmのバージョン確認
vue --version  //vueのバージョン確認
```

<br>

VueCLIのインストールは下記のコマンドで実行する。（バージョン指定可能）

```
npm install -g @vue/cli
```

<br>

新規プロジェクトの作成は、`vue create`で作成することができる。プロジェクト名は任意のものに設定が可能。
プロジェクトに必要なソフトウェアをそれぞれ選択する。

```
vue create プロジェクト名
```

<br>

cdで作成したディレクトリに移動。
`npm run serve`でプロジェクトを実行して、Localのリンクからページを表示することができる。

```
cd プロジェクト名
npm run serve
```

<br>


#最後に
ここまでVueCLIの導入についてまとめました。
用語だったりファイルがどう連携されているのかなども整理しながら進めていきます！
Zoom時代のプレゼンテーション

対面での学会や研究会がほとんどなくなり，オンラインの授業や講義が主体となったことから，ZoomやMeetなどのウェブ会議で発表することが多くなりました。スライドショーを開始すると，発表者用画面が共有されてしまったり，Zoomなどのウィンドウが見なくなったりすることがよくあります。全画面を共有すると，見せたなくないデスクトップやアプリケーションが見えて不都合です。Zoomなどのウィンドウが見えるようにしたまま，よく使われるプレゼンテーションアプリケーションでスライド本体を共有する方法についてまとめました。

PowerPointやKeynoteのスライドは発表用にウィンドウで表示することができます。これは編集用のウィンドウとは異なります。発表用のウィンドウをZoomなどで共有します。

# PowerPoint

[プレゼンテーションを開始してノートを発表者ビューで見る](https://support.microsoft.com/ja-jp/office/%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E9%96%8B%E5%A7%8B%E3%81%97%E3%81%A6%E3%83%8E%E3%83%BC%E3%83%88%E3%82%92%E7%99%BA%E8%A1%A8%E8%80%85%E3%83%93%E3%83%A5%E3%83%BC%E3%81%A7%E8%A6%8B%E3%82%8B-4de90e28-487e-435c-9401-eb49a3801257)

画面はWindowsですが，Macでも同じです。

[スライド]タブで[スライド ショーの設定]をクリックして表示します。[種類]から[出席者として閲覧する（ウィンドウ表示）]をクリックします。Macの場合はメニューバーの[スライド ショー]にも[スライド ショーの設定]が呼び出せます。

![スクリーンショット 2021-10-03 150811.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/558c8ff3-0711-1b64-dbea-45b97bfac7ea.png)

スライドを開始すると，ウィンドウが表示されます。
[追記] ウィンドウ表示では発表者ツールが使えず，レーザーポインタが使えないようです。

# Keynote


[MacでKeynoteプレゼンテーションを再生する](https://support.apple.com/ja-jp/guide/keynote/tan72233051/mac) ウインドウで再生する


既定では[再生]メニューで[フルスクリーン表示]が選択されていると思います。
[ウインドウ表示]を選択するとスライドがウインドウに表示されます。

![スクリーンショット 2021-10-04 8.26.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/f80c1114-7f99-1cb2-cfcf-022865048eb3.png)

フルスクリーンも使う場合は，メニューバーをカスタマイズして[ウインドウで再生]ボタンを表示しておくといいでしょう。ツールバー右クリックして[ツールバーをカスタマイズ...]を選びます。表示されたボタンの中から[ウインドウで再生]をドラックしてツールバーに追加します。[再生]の隣がいいかと思います。

![スクリーンショット 2021-10-04 8.23.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/876453ae-c3a8-0a3f-d818-fe76597bf2ec.png)


# Googleスライド

[プレゼンテーションを開始する](https://support.google.com/docs/answer/1696787?hl=ja&co=GENIE.Platform%3DDesktop)

[プレゼンテーションを開始]の右にある[▼] をクリックして[プレゼンター表示]を選択します。

![スクリーンショット 2021-10-03 150524.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130247/eebe6b8e-f0ef-4813-b1fc-a18aaca152ac.png)
【JavaScript】スコープの学習の振り返り①　スコープとは


#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。


#目的

* スコープについての理解を深める

#本題
###1.スコープとは

**実行中のコードから値と式が参照できる範囲のこと**
→５種類ある


###グローバルスコープとスクリプトスコープ

```javascript
// 変数をそれぞれ定義
// スクリプトスコープ
let a = 0;
// グローバルスコープ
var b = 0;
function c(){}
// railsのbyebugみたいなやつ
debugger;
```

ここでデベロッパーツールを使うと処理がdebuggerの部分で止まっています。

Sourcesをクリックした際に、右側のWindowでScriptと書かれた欄とGlobalと書かれた欄があります。

* letやconstで宣言されるとScriptの欄で表示されます。
* varやfunction()はWindowオブジェクトのプロパティとしてGlobalの方で表示されます。

Windowオブジェクト　=　グローバルスコープ
使い勝手が変わらないので、一般的にはスクリプトスコープもグローバルスコープと呼ばれます。

###関数スコープとブロックスコープ

```javascript
// 関数スコープ
// 以下の｛｝に囲まれたスコープのこと
function a(){
  // 変数宣言
  let b = 0;
  // 出力する値を定義
  console.log(b);
}
// 関数で定義した値を出力
a();


// ブロック　=　｛｝のこと　=　ブロックスコープ
// 関数は宣言が前にきているので関数スコープと呼ぶ
{
    // 　変数宣言にvarは使えない　
    let c = 1;
    // cを取得するにはスコープ内でconsole.logで出力しないとエラーになる
    console.log(c);

    // 変数dに関数の値を代入
    let d = function(){
        console.log("d");
    }
    // ブロックスコープ内であれば、関数宣言では関数の外でも呼び出せる
    d();
}

// 基本的には{}だけで使用されることはなく、if文などで使われる

```

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
XLOOKUPを使おう

Office365では新しい関数**「XLOOKUP」**が使えるようになりました。

これまでのVLOOKUP関数は指定範囲の一番左の列の値だけが検索対象になることが使いにくい一つの理由でした。
（次の場合、VLOOKUP関数はエラー(#N/A)になります）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/1c205768-c875-5a54-ca98-bd031ec0e346.png" width=85%>


この場合、検索対象の列を範囲の一番左に移動するとエラーは解消されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/2fbe592e-d755-d908-5f3e-6c901765ab16.png" width=85%>

**XLOOKUP関数**は1 つの列で検索語を検索し戻り列が検索対象列の右側、左側にあるかに関係なく、別の列の同じ行から結果を返すことができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22308/45d14db9-5e7c-366f-ffe5-151189edddc4.png" width=85%>

VLOOKUPより使い勝手がよいので試してみてください。
prototypeの拡張をTypeScriptで書いてみる

# はじめに

最近 ReactNative で個人アプリ作っていて、
Array に shuffle や clone 等の拡張を追加したくなった。  
プライベートでは JavaScript で prototype を拡張していたことはあるが、
業務では使ってこなかったし、TypeScript で書く場合、型周りをどう書くのか良く分からなかったので、
prototype 拡張 を TypeScript で実際に書いてみた。

# リポジトリ

https://github.com/alternacrow/prototype-with-typescript

shuffle, clone, unique 等追加してます。

# 実装例

Array を任意の長さで分割する `chunks` というメソッドを追加してみます。

```typescript
interface Array<T> {
  chunks(size: number): Array<Array<T>>;
}

if (Array.prototype.chunks === undefined) {
  Array.prototype.chunks = function <T>(
    this: Array<T>,
    size: number
  ): Array<Array<T>> {
    if (this == null) {
      throw new TypeError("Array.prototype.chunks called on null or undefined");
    }

    return [...Array(Math.ceil(this.length / size))].map((_, index) => {
      return this.slice(index * size, (index + 1) * size);
    });
  };
}
```

まず、Array が chunks メソッドを持っていることを TypeScript に認識させるために、
Array の interface に chunks の型を定義します。

```typescript
interface Array<T> {
  chunks(size: number): Array<Array<T>>;
}
```

型定義はこれだけです。

次は実際に chunks メソッドを実装している箇所を見てみます。

```typescript
...
  Array.prototype.chunks = function <T>(
    this: Array<T>,
    size: number
  ): Array<Array<T>> {
...
```

第一引数には Array 自体が、第二引数以降には chunks の引数が入ってきます。
あとは、破壊的、非破壊的の性質に注意しながら、書いていけば良いかと思います。

# おわりに

業務では prototype 拡張は使いたくないと思っているんですが、
良い運用方法とかあればコメントもらえると嬉しいです。
AI Deep Learning：LSTMでFXを分析する;その１

#目的
時系列的変化予測をするのにLSTMは好ましいと思われるが、実際のアプリケーションでその効果が期待できるものにFXが考えられる。　実際にどの程度の予測が可能か検証してみる。



#まず先行する検討を調査

https://youtu.be/-i8B0oO0Fl4
LSTN＋CNN Average Daly Profit : 14.3 pips

https://youtu.be/OD8NTtnl2qo
RNNの論文が多いですね、、

https://youtu.be/RPUvYXoA3pc
FXのマーケットボリュームはやはり大きいですね、、再認識しました
ほぼ全てのシナリオでプロフィットが出ており、さらに優れたものは、、という議論に展開していますが、LSTM-CorrCNNでとりあえず利益の出るものを実践しつつ改善するのが良いかも、、です。


CNN-LSTM;
https://youtu.be/lmk_EYG0vDI?t=347

https://youtu.be/BMvzfHDimYg
やっぱりCNN-LSTMのコンビネーションかなああ〜

#方法
CNN-LSTMに関してはKerasを用いて分析しよお。

https://stackoverflow.com/questions/66545781/how-to-implement-a-cnn-lstm-using-keras


#To Be Continue
個別の金融系AI分析とシステムも制作しているので、ご興味あれば下記にDMて連絡頂きたい。
https://twitter.com/shota_r55
「進める」ための会議のルール、Markdownテンプレート

物事を決めたり、進めたりするために会議をする時に、これだけ共通認識にしたいぞ、というテンプレート。


```markdown:Markdown

## 会議前

会議開催前に下記のものが配布されているか。

- [ ] 会議目的
    - 定期開催の場合、期間を決め、見直すタイミングを予め設ける
    - Slackなどでは代替できないか考える
- [ ] アジェンダ
- [ ] 会議時間
- [ ] 意思決定者
- [ ] 資料

## 会議中

- 開始時間、終了時間を守る。
    - 例: 1時間ではなく、50minの会議にする。
    - 例: 30minではなく、25minで休憩を入れる。
        - タイマーなどで強制的に会議を終了する仕掛けを入れる。
        - その空いた5分、10分の時間で、ノートや議事メモを見返して物事を整理したり、ストレッチしたり、頭の切替をする時間にする。
- 発言は、提案、リクエスト、事実確認にフォーカスする。
- 最後に決定事項と、TODOの確認を行う。


## 会議後

- 議事録へのフィードバックは終了後、迅速におこなう。
- 欠席した会議で決定した議論に対して、後から反対しない。

```



## 議事録

https://github.com/gong-sh/minutes-of-meeting-markdown/blob/master/minutes.md


## タイマー

[プレゼンテーションのタイマーとして使えるオンラインツール｜Colorless Green Ideas](https://id.fnshr.info/2017/02/19/timer/) にいくつか紹介があるので、オンライン会議でも使えるかもしれない。

http://maruta.github.io/timekeeper/

https://www.timer-tab.com/


## 参考

https://note.com/shuheikoyama/n/n69c2c3e123fc

https://note.com/tsukamoto/n/n9a1b21a7bf29


以上、ヒントになればさいわいです。
ExcelVBA便利汎用メモ_「最終行取得」

#はじめに
ExcelVBAで汎用的に使えて便利な関数などを掲載していこうと思います。
下に掲載していくか、この記事を更新していくかは検討中。。。

##最終行取得
```vb
Dim MaxRow,MaxCol As Long
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = Cells(1, Columns.Count).End(xlToLeft).Column
```
コマンドプロンプトでファイルとか色々と開く

# 概要

batを配る機会があり、そこから色々開きたかったというモチベーションです。

# まとめ

まずはこれを試してみます。
動かなかったら個別に方法を考えます😋

```:sample.bat
rem start "" "開きたいもの"と書きます。

rem フルパス。
start "" "C:\test\sample.gif"
start "" "C:\test\sample.html"

rem batと同じフォルダのもの。
start "" %~dp0"sample.txt"
start "" %~dp0"sample.png"

rem ブラウザも。
start "" "https://qiita.com/h1day"

rem (参考)URIスキームやプログラムの実行
start ms-settings:appsfeatures
start calc

```

# 説明

ファイルをダブルクリックしたことになります。
exeじゃなくてファイル名でも動くというのがポイントです。（知らなかった）

* コマンドプロンプトでは`""`を入れるのを忘れずに。  
最初の`""`は新しく開くコマンドプロンプトのタイトルバーの表示になります。見えませんが。  
なのでパスを""で囲わなければ`""`も要りません。しかし、パスに空白が混ざっていると動かなくなります。  

```:コマンドプロンプト
start ”” ”開きたいファイルのフルパス”
start 開きたいファイルのフルパス
```
http://ss-dev.jp/dev01/2016/07/18/open_file_from_command_prompt/

* ちなみにPowerShellでは`""`を入れると動きません。

```:powershell
start ”開きたいファイルのフルパス”
```
* batファイルのパス

 `%~dp0` が表します。batファイルのフルパスを`""`で囲ったもの`%0`から`~`で`""`を取り除きます。
フルパスのうちのドライブレター`d`と(ファイル名を除いた)パス`p`を表示しています。

`C:\test\exp.bat`の場合

|入力|出力|
| ----- | ----- |
| %0 |"C:\test\exp.bat"|
| %~0 |C:\test\exp.bat|
| %~p0 |\test\|
| %~d0 |C:|
| %~dp0 |C:\test\|

https://www.bnote.net/windows/bat_tips_cd.html
【Selenium】VBAでもWebDriverを自動で更新したい！


# はじめに

とうとう自分の職場にもIE終了の波がやってきました。
ソフトウェアのインストールが原則禁止の職場ではVBAからIEを自動操作するのは便利だったのですが、これからはそうもいきません。

GoogleChromeやMicrosoftEdgeはCOM経由でVBAから直接操作することができず[^1]、基本的にはSeleniumというソフトウェアを中継して操作することになるとのこと。
しかし、Seleniumを利用するにはインストールが必要。弊職場ではちょっと厳しい。
SeleniumのインストールをせずともChromeやEdgeの操作ができないかとネットで調べたところ、こちらの記事を見つけました。

https://qiita.com/uezo/items/66e20b064ffd5f239b9a

>ピュアVBAなSeleniumクライアント「TinySeleniumVBA」

https://github.com/uezo/TinySeleniumVBA

WebDriverの実行ファイルは必要ですが、これは実行ファイルさえ手に入れればインストールは不要です。さっそくこちらを試してみたところ、非常に簡単にChromeの自動操作ができました。


# WebDriverのバージョン問題
SeleniumBasicを使うにしてもTinySeleniumVBAを使うにしても問題になるのが、WebDriverのバージョン問題。
SeleniumBasicやTinySeleniumVBAはWebDriverを介してブラウザを操作しますが、WebDriverとブラウザのバージョンが適合していなければなりません。
しかし、ブラウザのアップデートによりバージョンがずれ、プログラムが動作しなくなることがあります。

職場でマクロ作って人に渡したところ、ある日突然「なんか動かないんだけど！」って連絡が飛んでくる、という光景が容易に想像できます。zipをダウンロードして中身のexeを指定のフォルダに放り込むだけですが、マニュアルを作ってもわからん！って人は多そうだし、何よりめんどくさいですよね。

PythonではWebdriver Manager for PythonというWebDriverのバージョンを自動でブラウザに合わせてくれる便利なライブラリがあるそうで。いいな。VBAにもそういうの欲しいな。

# というわけでWebDriverManager-for-VBA作ってみたよ


https://github.com/yamato1413/WebDriverManager-for-VBA


## インストール

TinySeleniumVBAを使ってる人は```WebDriverManager4TinySelenium.bas```を、SeleniumBasicを使っている人は```WebDriverManager4SeleniumBasic.bas```をインポートするだけです。


gitが分かる人は
```
git clone github.com/yamato1413/WebDriverManager-for-VBA
```
でダウンロードしてもらえればいいですし，分からない人は右上の「Code」という緑のボタンからZIPでダウンロードしてください。

## SafeOpen関数
ブラウザを開く処理を```SafeOpen```に書き換えることで、WebDriverのバージョンを一切気にする必要がなくなります。

```VB
'//TinySeleniumVBA
Dim Driver As New WebDriver
Driver.Edge "WebDriverへのパス"
Driver.OpenBrowser
'   ↓
SafeOpen Driver, Edge [,"WebDriverへのパス"] '// 第3引数は省略可
```
```VB
'// SeleniumBasic
Dim Driver As New Selenium.ChromeDriver
Driver.Start 
'   ↓
Dim Driver As New Selenium.WebDriver
SafeOpen Driver, Chrome
```

ブラウザを開く前にWebDriverの存在・バージョンをチェックします。
WebDriverが存在しない、またはバージョンがブラウザと異なる場合にWebDriverのダウンロード・展開を開始します。

存在しない時にもダウンロードを行うので、バージョンアップ時だけでなく、マクロ配布時にWebDriverを同梱したりWebDriverの入れ方マニュアルを作らなくてよくなります。

以下はSampleコードです。

```VB:TinySeleniumVBA
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Sub Sample()
    Dim Driver As New WebDriver
    SafeOpen Driver, Edge
    Driver.Navigate "https://www.google.co.jp/?q=selenium"
    Sleep 3000
    Driver.ShutDown
End Sub
```
```VB:SeleniumBasic
Public Sub Sample()
    Dim Driver As New Selenium.ChromeDriver
    SafeOpen Driver, Chrome
    Driver.Get "https://www.google.co.jp/?q=selenium"
    Driver.Wait 3000
    Driver.Quit
End Sub
```

よいスクレイピングライフを！
---
# 注釈
[^1]: 1. 一応直接操作するやり方はあるらしい ↑ 。

https://www.ka-net.org/blog/?p=14131
Railsのhas_manyのデフォルトの挙動

↓以下のコードを例にします。

```ruby
class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
end
```
**「has_many :microposts, dependent: :destroy」**とすると**Userモデル**と**Micropostモデル**を１対多の関係に紐づけてくれますが、特に**「Micropost」**という記述がなくても動作します。これはデフォルトの挙動のおかげです。

デフォルトでは、「:microposts」の部分を**「{モデル名}s」**と推測します。
つまり**「:microposts」⇨ 「{Micropost}s」**としMicropostモデルと紐づければいよいとrailsが理解してくれます。

紐づけるキー、つまりforeign_keyに関しても**「{モデル名}_id」**がforeign_keyであると推測してくれます。
今回だと、**「user_id」**がforeign_keyであると推測します。

```ruby
class User < ApplicationRecord
  has_many :microposts, dependent: :destroy
  #Default: class_name: "Micropost"
  #Default: foreign_key: "user_id"
end
```
これがデフォルトの挙動です。
####反対に、has_manyの第一引数が「{モデル名}s」でない場合やforeign_keyが「{モデル名}_id」でない場合はrailsに明示的に伝える必要があります。↓

```ruby
class User < ApplicationRecord
  has_many :active_relationships, class_name:  "Relationship",
                                  foreign_key: "follower_id",
                                  dependent:   :destroy
end
```
ちなみにdependent: :destroyとすると、userモデルのデータが削除されると紐付けられているデータも一緒に削除してくます。

##belogn_toのデフォルトの挙動は？

下のコードを例にします。

```ruby
class Micropost < ApplicationRecord
  belongs_to :user
 #:user → UserモデルのidとMicropostモデルのuser_idを紐づける
end
```
↑デフォルトではシンボルで書いた引数名（:user）から紐づける先のモデル名と、そのモデルと紐づけるカラムを推測します。
:userであれば、
Userクラスのidとuser_idを紐づけてくれます。

####シンボルで書いた引数名とモデル名が一致しなければ、クラス名を書く必要があります。

```ruby
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
end
```
↑この場合、Userモデルとfollower_idを紐づけてくれます。
Gmailをpythonを使って送信したい

#Gmailをpythonを使って送信したい
##動機
趣味でflaskとSQLiteでSNSチックなものを作っているのですが、

そこで、IDを忘れたときとパスワードを忘れた時用に再設定用メールのようなものを送信したいと考えています。

調べるとMIMEによる送信ができるそうです。基本情報技術者の試験を受けたことがある人は通信技術のあたりで聞いたことがあるかもしれません。

https://www.python.ambitious-engineer.com/archives/2034#i-2

こちらのサイトを参考に実装できました。

また、メールの送信にはアカウントとパスワードが必要になります。

しかし、ここで使用するパスワードは普段使っているものではダメで、特別な操作が必要になります。

https://qiita.com/eito_2/items/ef77e44955e43f31ba78

こちらを参考に実装できました。
ここに書いてあるものだけでできるかもしれません。