OmniAICreator/Qiita-1.07M huggingface dataset:
Java PDFファイルにパスワードを設定とそれを解除

<p><strong>機密情報を扱ったりする方は、セキュリティ保護に気をつかわなくてはならないでしょう？それに時々、PDFをパスワードで保護しよう！ってこと結構ありますよね。従って、今からfree Spire.PDF for Javaという無料のライブラリを使ってPDFファイルにパスワードを設定、そしてパスワードを解除する方法を紹介いたします。</strong></p>
<h4><strong>下準備</strong></h4>
<p><strong>1.E-iceblueの公式サイトから<a href="https://www.e-iceblue.com/Download/pdf-for-java.html">Spire.PDF for Java</a></strong><strong>をダウンロードしてください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210831/20210831153539.png" alt="f:id:lendoris:20210831153539p:plain" width="554" height="188" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong>2.IDEを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire.PDF.jarを参照に追加してください。</strong></p>
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210831/20210831153646.png" alt="f:id:lendoris:20210831153646p:plain" width="268" height="108" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>パスワードを掛ける</strong></h4>
```JAVA
import java.util.EnumSet;
import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfEncryptionKeySize;
import com.spire.pdf.security.PdfPermissionsFlags;

public class EncryptPDF {

	public static void main(String[] args) {
		
        //PdfDocumentオブジェクトを作成します。
        PdfDocument doc = new PdfDocument();
        //PDFファイルをロードします。
        doc.loadFromFile("input.pdf");

        //パスワードをかけます。
        PdfEncryptionKeySize keySize = PdfEncryptionKeySize.Key_128_Bit;
        String openPassword = "e-iceblue";
        String permissionPassword = "test";
        EnumSet flags = EnumSet.of(PdfPermissionsFlags.Print, PdfPermissionsFlags.Fill_Fields);
        doc.getSecurity().encrypt(openPassword, permissionPassword, flags, keySize);

        //保存します。
        doc.saveToFile("Encrypt.pdf");
        doc.close();		
      
	}
}
```
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210831/20210831153724.png" alt="f:id:lendoris:20210831153724p:plain" width="534" height="142" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<h4><strong>パスワードを解除</strong></h4>
```JAVA
import com.spire.pdf.PdfDocument;
import com.spire.pdf.security.PdfEncryptionKeySize;
import com.spire.pdf.security.PdfPermissionsFlags;

public class DecryptPDF {

	public static void main(String[] args) throws Exception {
		
        //PdfDocumentオブジェクトを作成します。
        PdfDocument doc = new PdfDocument();
        //PDFをロードします。
        doc.loadFromFile("Encrypt.pdf", "test");

        //パスワードを解除します。
        doc.getSecurity().encrypt("", "", PdfPermissionsFlags.getDefaultPermissions(), PdfEncryptionKeySize.Key_256_Bit, "test");
        
        //保存します。
        doc.saveToFile("Decrypt.pdf");
        doc.close();
	}

}
```
<p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/l/lendoris/20210831/20210831153734.png" alt="f:id:lendoris:20210831153734p:plain" width="554" height="468" loading="lazy" title="" class="hatena-fotolife" itemprop="image" /></p>
<p><strong> </strong></p>
JavaでTCP通信によるデータ送受信

# TCP通信特徴

* [3ウェイハンドシェイク](https://www.infraexpert.com/study/tcpip9.html)
* クライアントとサーバーでの通信

# データー送信側(クライアント)

Socket クラスでデータ送受信を行う。
`Socket sock = new Socket(IPアドレスまたはホスト名,ポート番号);`


```Client.java
package com.maekawa.base;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = null;
        OutputStream os = null;
        try {
            //1,接続したいサーバーの住所（IP、ポート）
            InetAddress serverIp = InetAddress.getByName("google.com");
            int port = 8080;
            //2,接続作成
            socket = new Socket(serverIp, port);
            //3,ioストリーム送る
            os = socket.getOutputStream();
            os.write("Hello world".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4,接続を遮断する
            socket.close();
            os.close();
        }
    }
}

```

# データ受信側(サーバー)

```Server.java
package com.maekawa.base;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        try {
            //1,接続を受け付けるポート設定
            ServerSocket serverSocket = new ServerSocket(8080);
            //2,接続準備
            Socket socket = serverSocket.accept();
            //3,クライアントからのデータを読み込む
            InputStream io = socket.getInputStream();

            ByteArrayOutputStream data = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len=io.read(buffer))!=-1){
                data.write(buffer,0,len);
            }
            System.out.println(data.toString());

            //4,接続を切断する
            io.close();
            socket.close();
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

```
# 参考記事


https://nompor.com/2018/05/15/post-3731/

https://nompor.com/2018/11/21/post-3737/
Dynamic Parameterにユーザーテーブル型を追加する

## Dapper便利だよね
モデルから直接ストアドの変数にバインドできたりで便利。
ただ、ユーザーテーブル型をバインドするときはググってもなかなか出なかった。

## やり方

``` hoge.cs
var dynamicParameters = new DynamicParameters();
dynamicParameters.Add("@DataTable", DataTable.AsTableValuedParameter("[dbo].[ut_DataTable]"));
```

でOK。
SpringBootAppricationをWarファイル化してサーバーのTomcatにデプロイする方法

##SpringBootAppricationをwarファイル化
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.traditional-deployment.war

|順番|結果|
|----|----|
|extends△△ implements◆◆◆|〇|
|implements◆◆◆ extends△△|コンパイルエラー|

##ポイント
* extends SpringBootServletInitializer
* SpringApplicationBuilder configureメソッドをoverride

```:sampleApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class sampleApplication extends SpringBootServletInitializer implements WebMvcConfigurer {

	public static void main(String[] args) {
		SpringApplication.run(sampleApplication.class, args);
	}

	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(sampleApplication.class);
	}

}
```
##ポイント
* apply plugin: 'war'
* providedRuntime ('org.springframework.boot:spring-boot-starter-tomcat')

```:bulid.gladle
///
///
///

apply plugin: 'war'
//ファイル名を指定する場合は以下を記入
/*war {
 enabled = true
 archiveName 'ファイル名.war'
}*/

///
///
///

dependencies {
///
providedRuntime ('org.springframework.boot:spring-boot-starter-tomcat')
///
}
```
##エラー 
No candidates found for method call providedRuntime.
：providedRuntime を呼ぶ手段の候補が見つからない。

##ポイント
rebuild と Gradleのリフレッシュは別物。

|build|コンピュータ上で実行できる状態にすること|
|----|----|
|gradle|ビルドツール|

bulidのプロセス
https://techacademy.jp/magazne/22261

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/4ab1a007-8e72-0009-2019-3c74b5aa5096.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/ad3bac05-888d-7bab-126b-aa219c081518.png)

##ファイルの吐き出し
ポイント

* gradle>build>build>ダブルクリック
* プロジェクトの「build」フォルダの配下に「libs」フォルダが生成され、その配下にwarファイルが生成される。

![Warファイル作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/d40b4892-dee7-4f2f-b996-5ad63460f38f.png)
![Warファイル作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637823/21af36b8-04c1-f3a1-3a67-ce809c9d74ce.png)
EditorUserBuildSettings.SwitchActiveBuildTarget は今すぐ削除して書き直せ

# tl; dr
`EditorUserBuildSettings.SwitchActiveBuildTargetAsync` これ使え
- https://docs.unity3d.com/ja/current/ScriptReference/EditorUserBuildSettings.SwitchActiveBuildTargetAsync.html

# 概要とか
`EditorUserBuildSettings.SwitchActiveBuildTarget` 使うと、どの環境でビルドするのかの変更をスクリプトで行うことができます。

　単に `変更しておしまい` であれば全然問題ないのですが、実際の運用としては `ビルドターゲット変更` → `変更された状態で何かやる` と言う話になりがちだと思います。このときに問題が発生します。

## 問題のあるシナリオ

　前提: Androidを現在のターゲットとする

1. メニューなどからEditorスクリプトを実行。
1. `EditorUserBuildSettings.SwitchActiveBuildTarget` を使ってターゲットを変更する。例えば Android → iOS のように。
1. 変更したその流れでスクリプトを実行し続ける。
1. このときに Editor としては　Android をターゲットとして実行開始されているので、そのスクリプトとしては `UNITY_ANDROID` のまま実行され続けることになる。
1. つまり `#if UNITY_IOS` とか `#if UNITY_ANDROID` などでプラットフォーム別で処理を振り分けているEditorスクリプトが想定と異なった挙動になりかねないので死ぬ。つまり `EditorUserBuildSettings.SwitchActiveBuildTarget` の呼び出し前と呼び出し後ろで `UNITY_ANDROID` が一貫されるのだけど、これで制御を振り分けているようなスクリプトを呼び出すと事故の原因になりうる。

　なお、ランタイムのスクリプトについては問題なく指定通りにコンパイルされます。そこは大丈夫。

## 解決策

`EditorUserBuildSettings.SwitchActiveBuildTargetAsync` これを使う。
- https://docs.unity3d.com/ja/current/ScriptReference/EditorUserBuildSettings.SwitchActiveBuildTargetAsync.html

`EditorUserBuildSettings.SwitchActiveBuildTargetAsync` を使うと非同期でターゲットの変更がされる。ターゲットが切り替わった後に処理を続けるためには `IActiveBuildTargetChanged.OnActiveBuildTargetChanged` で検知すること。  

- https://docs.unity3d.com/ja/current/ScriptReference/Build.IActiveBuildTargetChanged.OnActiveBuildTargetChanged.html

`EditorUserBuildSettings.SwitchActiveBuildTargetAsync` → `IActiveBuildTargetChanged.OnActiveBuildTargetChanged` この間のデータ連携については、どうすれば良いのかがよく分かっていない……。おそらく static 変数などは使えないはずなので、いい感じに ScriptableObject を使うとか PlayerPrefs を使うとかして連携すればいいはず……。ディスクとかネットワークに対して永続化する必要があるはず。
[JavaScript] const obj = { name, age } と const { name, age } = obj 構文の整理

# 背景

- プログラミングの構文を調べたいときに、検索するのにいつも苦労する
- すぐ検索できるように、構文の名前を憶えておく

# 分割代入（Destructuring assignment）

- 分割代入（Destructuring assignment） と覚えておく
- 配列やオブジェクトの要素を、それぞれ別の変数に代入する

```javascript
const obj = {"name": "Tom", "age": 24};
const { name, age } = obj;

//name: "Tom"
//age: 24
```

```javascript
let a, b, rest;
[a, b, ...rest] = [10, 20, 30, 40, 50];

// a: 10
// b: 20
// rest:  [30, 40, 50]
```

# オブジェクト初期化子（Object Initializer）

- こちらは特別な名前があるわけではく、オブジェクトの初期化のリテラル表記法
- 分割代入の逆と勘違いしてしまい、混乱してしまうことがあるが、分割代入とは関係がない
- オブジェクトを初期化するとき、要素に変数を渡すと、変数の名前がオブジェクトの要素名になる

```javascript
const name = "Tom";
const age = 20;
const obj = { name , age }

//{ name: 'Tom', age: 20 }
```
多分91日後に基本情報技術者試験を受けるFラン私大文系既卒(4日目)

# ヒット率
* ヒット率とは?
 * 必要とするデータがキャッシュメモリに存在している確率

# 実行メモリアクセス時間
* 式

```math
実行メモリアクセス = ヒット率 \times (キャッシュメモリアクセス時間) + (1 + ヒット率) \times (主記憶のアクセス時間)
```

# ライトスルー
* ライトスルーとは?
 * キャッシュメモリと主記憶両方に書き込む制御方式
 
# ライトバック
* ライトバックとは?
 * まずキャッシュメモリから書きデータが溢れたら、主記憶に反映させる制御方式

# メモリインタリーブ
* メモリインタリーブとは?
 * 主記憶そのもののアクセス時間を短縮する仕組み
 * 各バンクに交互にアクセスすることで、主記憶のアクセス時間を短縮します

# SoC(System on Chip)
* SoCとは?
 * CPUと周辺回路を半導体の1チップ上に集積したもの

# リアルタイムOS
* リアルタイムOSとは?
 * 定められた時間内に処理を完成させる機構を持つOS

# スケジューラ
* スケジューラとは?
 * 実行可能状態のタスクを1つ選ぶ機構

# ディスパッチ
* ディスパッチとは?
 * 実行状態に移すこと

# ラウンドロビン
* ラウンドロビンとは?
 * 待ち時間を設定し、持ち時間が経過すると次のタスクに順番を回す方法

# コンテキストの切り替え
* コンテキストの切り替えとは?
 * 実行状態のタスクを切り替えること

# プリエンプティブ方式
* プリエンプティブ方式とは?
 * 持ち時間や、優先度が理由でOSが介入し、タスクを切り替える方式
 * プリエンプションとは、タスクを切り替えるイベントのこと

# ノンプリエンプティブ方式
* ノンプリエンプティブ方式とは?
 * タスクが自らCPUを手放して、タスクを切り替える方式

# 固定区画方式
* 固定区画方式とは?
 * 実記憶空間を一定のサイズの区画に区切り、この区画単位で領域を割り当てる方式
 * 内部フラグメンテーションができる

# 可変区画方式
* 可変区画方式とは?
 * データに合わせて区画を割り当てる方式
 * 外部フラグメンテーションが発生する

# メモリコンパッションと
* メモリコンパッションとは?
 * 外部フラグメンテーションを整理して、領域を確保すること

# メモリオーバレイ
* メモリオーバレイとは?
 * 主記憶よりプログラムの容量が大きいときに、そのプログラムを機能ごとに分割して、その機能ごとに主記憶に読み込む方法
【対処法】protocol is disabled or cipher suites are inappropriate エラーが出た

#目次
[現象の説明](#現象の説明)
[解決手順](#解決手順)
[参考](#参考)
[環境情報](#環境情報)

# 現象の説明
docker-compose up でコンテナを起動します。
その後、ローカル環境でアプリケーションにアクセスしようとしたら以下のエラーが出ました。

```
com.microsoft.sqlserver.jdbc.SQLServerException:
The driver could not establish a secure connection to the server.
Reason: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
```

# 解決手順
<b>ポイント：java.security ファイルを修正するだけ</b>

* docker-compose up した後、まずコンテナに入ります。
`docker exec -it [コンテナ名]  /bin/bash`

* java.security ファイルのあるディレクトリまで移動します。
`cd /etc/java-8-openjdk/security`

* vimコマンドで java.security を編集しましょう。
`vim java.security`
※vimが入ってない場合は以下のコマンド打つ
`apt-get install vim`

* 修正箇所を /tls と打って検索します。探したいコードは以下です。

```
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
 DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
 include jdk.disabled.namedCurves
```

java.securityにはtlsを含む文字列が散らばっているので、一発ではたどり着けないかもしれません。そのときは、/tlsを一度全て消した後、n を押すと次の検索結果に飛べます。
![スクリーンショット 2021-08-31 14.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/a5f1d400-54bb-62b7-3047-5ff07c67376e.png)

* 見つけることができたら、編集モードにして(i を押すだけ) # でコメントアウトしましょう。
![スクリーンショット 2021-08-31 14.47.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/4a1fc2bf-db75-4724-0024-068046de2baf.png)

* 編集が終わったら、escキーを押して、:wq でセーブしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526938/52d84abb-71ba-ddde-a6e0-195a6108c998.png)

* 以上。コンテナを再起動してアプリにアクセスするとエラーが解消されているはず！

# 参考
https://www.youtube.com/watch?v=xSejtYOh4C0

# 環境情報
* Mac OS X Catalina
* Java(docker コンテナ内)

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.7
BuildVersion:	19H1323

$ java -version
openjdk version "1.8.0_302"
OpenJDK Runtime Environment (build 1.8.0_302-8u302-b08-1~deb9u1-b08)
OpenJDK 64-Bit Server VM (build 25.302-b08, mixed mode)
```
Next.jsでAPI取得した日時の表示形式を変更する

今回はMicroCMSから取得した日付が、
[2021-06-09T05:53:07.635Z]
みたいな感じで、見づらかったので、変更方法をメモリます。

(1)```yarn add react-moment```

(2)APIを取得しているファイルで

```tsx:index.tsx
import Moment from 'react-moment'

//(省略)

<div className={styles.contents}>
  <h1 className={styles.title}>{blog.title}</h1>
  <Moment format="YYYY/MM/DD" className={styles.date}>
    {blog.publishedAt}
  </Moment>
  <img src={blog.thumbnail.url} className={styles.thumbnail}></img>
  <div
    className={styles.main}
    dangerouslySetInnerHTML={{
      __html: `${blog.main}`,
    }}
  />
```
ってやれば、変更できる！おっけっけ！
Chatterの投稿でハイパーリンクを使う


どこかで、整理したい

https://salesforce.stackexchange.com/questions/732/create-chatter-post-with-mix-of-hyperlinks-and-text-in-the-body-in-apex-code

https://github.com/smukov/ConnectApiHelper


# 対応してないんですよね

[Process' Post to Chatter Action that posts a hyperlink ends up displaying "_HL_ENCODED_" in the record's feed instead of the proper URL/link](https://trailblazer.salesforce.com/issues_view?id=a1p3A0000003dNKQAY&title=process-post-to-chatter-action-that-posts-a-hyperlink-ends-up-displaying-_hl_encoded_-in-the-record-s-feed-instead-of-the-proper-url-link)
開発系サーバをUS-EAST-1などアメリカに置くメリット 


# 利点
- 東京リージョンに比べ単価が安い
- 開発APIサーバを利用して統合テストをするなら時間短縮に
    - GitHub ActionsなどのマネージドCIは米国のリージョンにあることが多く、距離が近くなると通信速度がup
    - CIに組み込むような開発支援系海外SaaSも同様

# 欠点
- ローカルから開発サーバへの通信は逆に遅くなる
- 日本にある開発サーバへの通信、同サーバからの通信も遅くなる
- 該当サーバに個人情報があると難しい（＊開発サーバでの個人情報保持は避けましょう)

# 折衷案
お金は余計にかかりますが、東京と米国双方に環境を設置しても良いかもしれません
AWSならRDSを利用しないサーバレスアーキテクチャなら、環境を多数作っても費用負担は少ないのでありです。
CI/CDはやや複雑化します
アンダースコアを含むドメインをElasticBeanstalkで運用する際の注意点

結論から言うとRoute53ではアンダースコアを含むホスト名は使用できますが、ElasticBeanstalkのApplicationLoadBalancer用のリスナールールにおいて、HostHeadersを使用する際、アンダースコアを含むホスト名は使用できません。

- リスナールールとは

リクエストがルールのホスト名と一致した場合、ALBはリクエストを指定したプロセスに転送します。

- ホストヘッダーとは

ホストヘッダーのホスト名に基づいてリクエストをルーティングするルールを定義できます。単一のALBを使用して複数のサブドメインおよび異なるトップレベルドメインを運用できます。

- ApplicationLoadBalancer用のリスナールール
![スクリーンショット 2021-08-31 13.48.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/79134df4-f99a-6103-d015-95e91bd9563a.png)


```hcl
  setting {
    namespace = "aws:elbv2:listener:443"
    name      = "Rules"
    value     = "fqdn1,fqdn2"
  }

  setting {
    namespace = "aws:elbv2:listenerrule:fqdn1"
    name      = "HostHeaders"
    value     = "fqdn1-test.xxxx.jp" // OK
  }

  setting {
    namespace = "aws:elbv2:listenerrule:fqdn1"
    name      = "Priority"
    value     = "1"
  }

  setting {
    namespace = "aws:elbv2:listenerrule:fqdn2"
    name      = "HostHeaders"
    value     = "fqdn2_test.xxxx.jp" // NG
  }

  setting {
    namespace = "aws:elbv2:listenerrule:fqdn2"
    name      = "Priority"
    value     = "2"
  }
```

- Route53のホストゾーンとレコード用のドメイン名の形式
![スクリーンショット 2021-08-31 13.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/e777ff1f-bcff-eb9d-b33e-4230bf0efbed.png)


- ホストの条件
![スクリーンショット 2021-08-31 13.50.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58788/0db1d159-60c6-2644-c009-e9852654fc3d.png)
【CloudFormation】AuroraPostgreSQLの作成

#1. はじめに
　4月に入ってからAWS SAMとAWS CloudFormationを用いて自身が作成したリソースをテンプレートに書き起こす作業をしてきました。DB自体は作り直すことがほぼないため後回しにしてきましたが、必要と判断したため、DBを作成するCloudFormationのテンプレートの調査を行いました。
　CloudFormationって？ SAMって？ って人は[こちらの記事](https://qiita.com/N_H_tennis/items/c0e49be8e04c2a201b6f)をとりあえず参考にしてください。

#2. DB設定
　以下のようなDBを作成したいと思います。

####DBクラスターの設定
・使用DB：Aurora PostgreSQL ver 12.4
・サブネットグループを指定
・VPCセキュリティグループの指定

####DBインスタンスの設定
・インスタンスのクラス：db.t3.medium
・アベイラビリティゾーン：ap-northeast-1a（サブネットグループの中から選んでください）
・パブリックアクセス：なし
・マルチAZ配置：なし
・Performance Insights：なし
・拡張モニタリング：なし

#3. テンプレートファイル
　各種設定はMappingsに書きました。任意の設定に書き換えて使用してくださるとありがたいです。また、DBのパスワードはParametersで設定し、デプロイする時に入力するようにしました。NoEcho: trueを指定することで入力した値がみられる心配はありません。
　細かい設定の説明はテンプレートファイル内に記載しております。ご確認ください。

```yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  AuroraPostgreSQL

Parameters:
  Password:
    Type: String
    NoEcho: true

#各種設定
Mappings:
  RDSMap:
    RDSCluster: 
      DBClusterIdentifier: xxxxxxxx
      DBName: xxxxxxxx
      MasterUsername: xxxxxxxx
      DBSubnetGroupName: xxxxxxx
      RdsSecurityGroup: sg-xxxxxxxx
    RDSInstance:
      DBInstanceIdentifier: xxxxxxxx
      DBInstanceClass: db.t3.medium
      AvailabilityZone: ap-northeast-1a

#resource
Resources:
  #DBクラスターの設定
  RDSCluster:
    Type: AWS::RDS::DBCluster
    Properties:
      Engine: aurora-postgresql #DBエンジンの設定
      EngineVersion: 12.4 #PostgreSQLのversion
      DBClusterIdentifier: !FindInMap [ RDSMap, RDSCluster, DBClusterIdentifier ] #DBクラスターの識別子
      DatabaseName: !FindInMap [ RDSMap, RDSCluster, DBName ] #データベースの名前
      MasterUsername: !FindInMap [ RDSMap, RDSCluster, MasterUsername ] #データベースのマスターユーザーネーム
      MasterUserPassword: !Ref Password #データベースのマスタ―パスワード
      Port: 5432 #ポート番号
      DBSubnetGroupName: !FindInMap [ RDSMap, RDSCluster, DBSubnetGroupName ] #サブネットの指定
      VpcSecurityGroupIds: #VPCセキュリティグループの指定
        - !FindInMap [ RDSMap, RDSCluster, RdsSecurityGroup ] 

  #DBクラスター内のインスタンスの設定
  RDSInstance1:
    Type: AWS::RDS::DBInstance 
    Properties:
      Engine: aurora-postgresql #DBエンジンの設定
      EngineVersion: 12.4 #PostgreSQLのversion
      DBClusterIdentifier: !Ref RDSCluster #DBクラスターの識別子 RDSClusterとの紐づけ
      DBInstanceIdentifier: !FindInMap [ RDSMap, RDSInstance, DBInstanceIdentifier ] #DBインスタンスの識別子
      DBInstanceClass: !FindInMap [ RDSMap, RDSInstance, DBInstanceClass ] #インスタンスのクラス 
      DBSubnetGroupName: !FindInMap [ RDSMap, RDSCluster, DBSubnetGroupName ] #サブネットの指定
      PubliclyAccessible: false #パブリックアクセスの有無設定
      AvailabilityZone: !FindInMap [ RDSMap, RDSInstance, AvailabilityZone ] #アベイラビリティゾーンの設定
      MultiAZ: false #マルチAZ配置有無の設定
      EnablePerformanceInsights: false #Performance Insights有無の設定
      MonitoringInterval: 0 #拡張モニタリングの詳細度の設定(0で拡張モニタリング無効)
```

#4. 終わりに
　いかがだったでしょうか。いかがも何もテンプレートファイル張ってあるだけなので感想の何もないと思いますが。。。CloudFormationにはネストされたストックという機能があるので、今度はこれを試してみようかな。
React.jsで同ページ内でScrollアニメーションの追加方法

(1)```yarn add react-scroll```

(2)

```tsx:index.tsx
import { animateScroll as scroll } from 'react-scroll'

const Home: React.FC = () => {
  const scrollToTop = () => {
    scroll.scrollToTop()
  }
  return (
	<div className={styles.container}>
	  <BackButton className={styles.backButton} onBackClick={scrollToTop} />
	</div>
　　　　　...
```

(3)ページ内の特定の場所にスクロールする
SectionQuestionというコンポネントにidというPropsが渡されています。
pagesの呼び出し先で、idを設定します。

scrollToQというreact-scrollの関数を用意し、以下のようにオプションを追加します。
duration:スクロールにかかる秒数
delay: 遅延
smooth: アニメーションスクロール
offset: idのコンポーネントの上端からずらす

スクロールのトリガーにしたいボタンの、onClickにscrollToQを渡すと、SectionQuestionにスクロールする。

``` tsx:index.tsx
import SectionQuestion from '../../components/domains/SectionQuestion'
import { animateScroll as scroll, scroller } from 'react-scroll'
import Footer from '../../components/domains/Footer'

export const Index = () => {
  const scrollToQ = () => {
    scroller.scrollTo('question', {
      duration: 1000,
      delay: 0,
      smooth: true,
      offset: -50,
    })
  }
  return (
    <div>
      <SectionQuestion id="question" />
      <Footer
        onAboutClick={scrollToQ}
      />
    </div>
  )
}
```
オプションの詳細はgithubに載っています。
https://github.com/fisshy/react-scroll
Pythonでストップウォッチを作ってみた

#はじめに
オフラインで使えるGUIのシンプルなストップウォッチが欲しかったのですが、いい感じのがなかったため、自分で作ってみました。また、このストップウォッチは精密な計測を目的としていません。想定している利用方法は、プレゼンテーション時の発表時間計測やある作業時間の計測などです。
作ったストップウォッチは配布しているので、よかったら使ってみてください。

# 実装
GUIの実装には標準モジュールのtkinterを利用します。

## 時刻計測方法
計測開始時のUNIX時刻と現在のUNIX時刻の差分を計算します。

## 時刻表示方法
得られたUNIX時刻の差分の単位は秒であるため、それを時, 分, 秒, ミリ秒の表示に変換します。
表示は見やすさを向上させるため、0埋めを行います。

```python
# [s] to [h]
eth = int(elapsed_time / 3600)
eth_remainder = elapsed_time % 3600

# [s] to [m]
etm = int(eth_remainder / 60)

# what's left at the end is [s]
ets = eth_remainder % 60

# change time display format to look like 00:00:00.000
elapsed_time_str = "{0:0=2}:{1:0=2}:{2:0=6.3f}".format(eth, etm, ets)
```

上記コードについて、@shiracamus さんにコメントいただき、```divmod```を用いた以下のようなコードに変更しました。

```python
_minute, second = divmod(elapsed_time, 60)
hour, minute = divmod(_minute, 60)

# change time display format to look like 00:00:00.000
elapsed_time_str = "{0:0=2g}:{1:0=2g}:{2:0=6.3f}".format(hour, minute, second)
```

# 利用方法
## インストール方法

```
pip install pystopwatch
```

## 起動方法

```
python -m pystopwatch
```

## オプション
計測時間の更新頻度を変更できます。単位はミリ秒です。

```
python -m pystopwatch --interval=1
```


# リンク
[GitHub - PyStopwatch](https://github.com/huwns/pystopwatch)
[PyPI - PyStopwatch](https://pypi.org/project/pystopwatch/)
三項演算子とは

#はじめに#
　今回は三項演算子について備忘録として残していきます。
そんなん常識やろ！と思われるかもしれませんがご容赦ください。

#三項演算子とは#
　三項演算子は一言で言うとif文を簡単に書くことができる演算子のことです。
例えば、

```if.php
if($num1 > $num2){
  echo '$num1は$num2より大きい';
} else {
  echo '$num1は$num2以下である';
}
```

このようなif文があったとしましょう。
これを三項演算子を用いて記述すると下記のようになります。

```example.php
($num1 > $num2) ? '$num1は$num2より大きい' : '$num1$はnum2以下である';
```

if〜else文を1行で書き換えることが出来ました。
　このように一つ目の式には条件式、二つ目の式（?の右隣）には条件が真の場合、三つ目の式（:の右隣）には偽の場合の式が入ります。



　公開、非公開を表すステータスや在庫の有無を確認する条件分岐などで使うと記述が短くなりますし、読みやすくなるかもしれません。
　ぜひ覚えておきましょう！
Next.js & TypeScript & Scss & Storybookでフロントエンドを始める

## 1.Next.jsで始める
(1)
```npm init next-app directory-name```
directory-nameは、任意の名前。

※localhost3000を変えたい場合

``` json:package.json
"script"{
- "dev":"next dev"
+ "div":"next dev -p 1000"
```

(2)```yarn dev```
localhostが立ち上がれば、おっけっけ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369162/1ee0cd6e-8c21-4c5a-7b25-93cdbe99113a.png)


## 2. TypeScript導入
(1)```yarn add --dev typescript @types/node @types/react @types/react-dom```
​
(2)pages内のjsファイルを"tsx"に変更
​
(3)一度、yarn devをCtrl/cmd + Cで終了し、再起動。
tsconfig.jsonファイルが出来きたら、おっけっけ！
​
### 2-1. prettierの設定　(；はいらないので消したいのと、tabの幅を2に)
(1).prettierrc　作成

```js:.prettierrc
{ "semi": false, "trailingComma": "all", "singleQuote": true, "printWidth": 100, "tabWidth": 2 }
```

## 3. Sass 導入
(1)```yarn add sass```

(2)拡張子をscssに。
・pagesのimportパス
・stylesのglobalsとHome.module

## 4. Storybook 導入
(1)```npx sb init```
・stories削除
・以下変更

```js:storybook/main.js
module.exports = {
  stories: ['../components/**/*.stories.@(js|jsx|ts|tsx)'],
  addons: [
    '../components/**/*.stories.@(js|jsx|ts|tsx)',
  ],

  webpackFinal: async (baseConfig) => {
    // scss を読み込む
    baseConfig.module.rules.push({
      test: /\.scss$/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            importLoaders: 1, // 1 => postcss-loader
            modules: {
              localIdentName: '[local]___[hash:base64:2]',
            },
          },
        },
        'sass-loader',
      ],
    })
    return { ...baseConfig }
  },
}
```

(2)@zeit/next-sass インストール

```yarn add @zeit/next-sass node-sass```

(3)CSS Modulesにする
next.config.js作成

```js:next.config.js
const withSass = require('@zeit/next-sass');
module.exports = withSass({
	cssModules: true,
});
```

(4).storybook内追加・変更

```html:preview-body.html
<style>
  body {
    padding: 0;
    margin: 0;
  }
</style>
<link rel="stylesheet" href="styles/globals.scss" />
```

```js:.storybook/preview.js
export const parameters = {
  actions: { argTypesRegex: '^on[A-Z].*' },
  controls: {
    matchers: {
      color: /(background|color)$/i,
      date: /Date$/,
    },
  },
  layout: 'fullscreen',
}
```

(5)画像を表示できるようにする

```json:package.json
"scripts": {
-"storybook": "start-storybook -p 6006",
+"storybook": "start-storybook -s ./public -p 6006",
}
```

(6)```yarn storybook```
で立ち上がるはず！

## 5. おわり！
あとは、Githubで、リポジトリを作成して、案内通りに
```git init```
```git add -A```
```git commit -m "first commit"```
```git branch -M main```
```git remote add origin url```
```git push -u origin main```

これで自分的には再現可能。
Windows資格情報のパスワード●●●●●●●●●が知りたい

お世話になっております。

情シスの方が武漢ウィルスで今週は出社しないので
場当たり的なのですが
ファイルサーバーにアクセスする際の
Windows資格情報のパスワード●●●●●●●●●が知りたい
と思っております……

私のPCにはアクセスする権限があるので
確認しようとしたのですが●●●●●●●●●と分からない状況なのです……

セキュリティ的に分からなくしているのは重々承知なのですが
こちらはどうにかして見る方法は無いのでしょうか？

お忙しい所大変申し訳無いのですが何か情報をお持ちな方はコメント頂けますと嬉しく思います。
呪術廻戦で俺が学ぶMySQL①【PHP】

こんにちは！
今日はMySQLについてアウトプットしていきたいと思います。

# MySQL
データを保管する場所って考えといたらいいんですかね。
パソコンにデータを保存したいときもファイル作ってデータを保存しますが、
そんな感じ。
ただ、ファイルと違ってMySQLは様々な事ができる非常に有能なシステムのようです。
MAMPを利用している場合はphpMyAdminというツールを使ってMySQLを操作します。

じゃ早速MySQLを使用してデータを保管していきたいと思います。


まず、データベースの新規作成ボタンでテーブルを作成します。
今はテーブルのことをフォルダの中にファイルを作るようなものだと思っといたらいいですね。

テーブル名を記述すると、カラム名を記入するページに遷移します。
カラムとは表計算の列にあたるものです。


# テーブルを作成

テーブルを作成するSQL文は以下のようになります。

```sql
CREATE TABLE `magicians` (id INT, name TEXT, magic TEXT);
```

呪術師を表すmagiciansテーブルにid,name, magicを追加することができました！！

![スクリーンショット 2021-08-31 9.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/48562035-2d00-2a15-7b01-33de65b42a1d.png)

データベースのデータを一意性を持たせるためにidにprimary_keyを
設定しなければいけません。
また、データを保存する際に毎回いちいちidの値を記述するのは面倒なので
Auto Incrementを設定して自動的に連番で値を入れてもらうようにします。

![スクリーンショット 2021-08-31 10.09.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/a01d07a0-77d4-f6cc-b7ca-853e12ead2fa.png)

# データを保存

SQL文を使用してデータを保存したいと思います。

```sql
INSERT INTO `magicians` SET id = 1, name = '虎杖悠仁', magic = '逕庭拳';
```
悠仁の術式がいまだにわかっとらんから逕庭拳にしました。

![スクリーンショット 2021-08-31 10.18.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/dfa855dd-321d-0840-aa7c-6d47799bba21.png)

上記のようにphpMyAdminだと挿入ってボタンをクリックしたら
SQL文を使用しなくてもデータを保存することはできちゃうんやけどね。

それを利用して一年ズを完成させました。

![スクリーンショット 2021-08-31 10.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/07ef86eb-c25a-6a21-35e8-7556d5758c56.png)

# データを調べたいとき

恵の術式ってなんやったっけ？？？ってなった時は

```sql
SELECT * FROM `magicians` WHERE id = 2;
```

これで恵の術式を取り出せます。

![スクリーンショット 2021-08-31 10.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1435543/201c2083-8f80-f16d-b255-0239898e39e5.png)
Arduinoを利用しLTE通信にて時刻を取得するお話

#はじめに

最近、自社業務にてArduinoを利用したプロトタイピングする機会ができ、それを元に色々と試験機を作成している今日この頃。
先人の知恵を色々活用させて頂きつつも、わからないことは手探りで解決するのが結構クセになりつつあり、あぁプログラミングって楽しいなぁ…と思えている内が華と思いつつ、色々書かせて頂いております。

さて、今回はLTE-M Shield for Arduinoを利用した環境下においてLTE通信にて時刻を取得し記録及び活用すると言う、非常に需要の無いと思う内容について記載していこうと思います。
WiFi使ってconfigTime()使えばいいんじゃ？とか、そもそもRTCくらい設置しろよ…。思うのが普通だろうしそうしたいのは山々なのですが、まぁ行き当たりばったりも良い所なので、どうにかこうにか時間を取得する事とします。

#開発環境
- Arduino uno
- LTE-M Shield for Arduino
- SORACOM IoT SIM plan-D
- SORACOM Private Garden 
- TinyGSM(通信ライブラリ)
- TimeLib.h(時間関連ライブラリ)

#関数を探す
LET-M Shield for Arduinoの利用に必要なライブラリに`TinyGsmClient.h`と言うファイルがある。
LTE-M Shield for Arduinoに搭載されている通信モジュールはBG96なので、これによって呼び出されるライブラリは`TinyGsmClientBG96.h`となる。
そして、このファイルの中に、`TinyGsmTime.tpp`という、いかにも使えそうな雰囲気を醸し出すファイルがあるため、その内部にある関数をチェック。
すると、時刻合わせがこのライブラリで見事に出来る事が判明し、時間を簡単に呼び出せる`TimeLib.h`と合わせて早速組み立ててみる事に。

#時刻取得
と言う訳で、まずは時刻の取得を行う。

```.c
  modem.getNetworkTime(&year1, &month1, &day1, &hour1, &min1, &sec1, &timezone); // 時刻取得
  setTime(hour1, min1, sec1, day1, month1, year1);  //時刻セット
```

上記のように、`modem.getNetworkTime()`で時刻を取得した後、`setTime()`で時刻を記録する。
こう書けば案外簡単そうだが、この結論に至るまで一夜を明かす位には悩んだ。
NTPとか使わないといけないのかー？とか色々悩み始めるとドツボに嵌るから、解決してみれば簡単な物だけに、うーんとなってしまう。

#時刻表示
さて、格納までしてしまえば後はこちらの物。
とりあえず折角なので月日や時刻は0埋めを行って表示を行うようにしてみようと思う。

```.c
void Pclock() {
  char tb1[20];  
  sprintf(tb1, "%04d/%02d/%02d %02d:%02d:%02d",
    year(), month(), day(),
    hour(), minute(), second());
  Serial.println(tb1);
}
```

まぁ、言ってしまえば普通に年月日時分秒呼び出して良い感じに表記しますよー、と言うだけの関数なんですが。
年月日時分秒に関しては、それぞれ`TimeLib.h`内の関数
`year()`、`month()`、`day()`、`hour()`、`minute()`、`second()`
にて取得が可能なので、それこそここからは表示するなり活用するなり煮るなり焼くなりである。
一度書き込みが終わったらあとは電源断までしっかり時計は働いてくれるので、遠慮なく時刻が活用できると言う寸法である。
スマートかどうかはさておき、とりあえず当初の目的は達成したので一応この文はこれで閉める事とする。

#参考サイト
[vshymanskyy/TinyGSM](https://github.com/vshymanskyy/TinyGSM)
[PaulStoffregen/Time](https://github.com/PaulStoffregen/Time)
[Arduino > Time > 日時設定 > setTime(hh, nn, ss, dd, mm, yyyy);](https://qiita.com/7of9/items/4a611ae804dbe2619466)

#おわりに
Qiitaの利用、実はこれが初めてだったりするのですが、果たしてこの文章が誰かの役に立つのだろうか…？と思ってしまったりはする。
とは言え、個人的な備忘録としても間違いなく機能するだろうし、これから悩んだ事象とかについてはちょくちょくここに残して行けたらなー、と思ってます。
ともあれ、ビギナーもビギナーな人間ではありますが、これから何卒よろしくお願いいたします！
Excel VBAでAccessにアクセス

# 概要
Excelで作成したデータをAccessに反映させるときに作った雛形コードです。
参照設定は不要です。

```vb
Sub サンプル()
    
    Dim DBpath As String 'Accessファイルのフルパス
    Dim DBobject As Object 'Accessへ接続用のオブジェクト
    Dim strSQL As String 'SQL文
    
    '----------------------------------
    'DBに接続
    '----------------------------------
    Set DBobject = CreateObject("ADODB.Connection")
    DBpath = "Accessファイルへのフルパス"
    DBobject.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & DBpath & ";"
    
    '----------------------------------
    'ここにデータ更新部分を作成
    '----------------------------------
    
    '----------------------------------
    '後処理
    '----------------------------------
    DBobject.Close          'DBの切断
    Set DBobject = Nothing  'オブジェクトの開放
    
End Sub
```

## 使い方サンプル
### UPDATEの場合
```vb
    '----------------------------------
    'ここにデータ更新部分を作成
    '----------------------------------
    Dim p As Long
    p = 2
    With ThisWorkbook.Worksheets("Sheet2")
    
    Do While .Cells(p, "A").Value <> ""
        'SQL文の作成
        strSQL = "UPDATE テーブル名 set 変更フィールド名='" & .Cells(p, "B").Value
        strSQL = strSQL & "' where 変更条件='" & .Cells(p, "C").Value & "'"
    
        'SQLの実行
        adoCn.Execute strSQL
    
        p = p + 1
    Loop
    
    End With

```
【AWS】AWSとは？（初心者に向けてわかりやすくまとめます）

# はじめに
今回はプログラミングを学び始めると、よく耳にするAWSの基本についてまとめさせていただきます。
自分自身プログラミングを学び始め１年ほどですが、AWSを学ぶ際に様々な記事を参考にさせていただきましたが、
専門用語などが多く理解するまでに時間がかかったので、今回は専門用語をあまり使わない。
使う場合も難しい言葉にはこまめに解説をつけ、プログラミングを学び始めた初心者の方でも
難しく感じないようにまとめさせていただきます。

今回はAWSの基本的な部分、他の記事ではAWSの始め方など数回に分けてまとめさせていただきます。
皆様の学びの参考になれば幸いです。

AWSのアカウントの作成方法はこちらの記事でまとめさせていただいております。
https://qiita.com/kenta-nishimoto-1111/items/e1a5709c6efc78e00fc2

# そもそもAWSとは？
AWSとはAmazon Web Servicesの略で、
Amazonが提供している100以上のクラウドコンピューティングサービスの総称です。

一般的にAWSを調べると上記のような文言をよく目にしますが、
クラウドコンピューティングサービスが何かわからないと理解が難しいので
クラウドコンピューティングサービスについて解説します。

# クラウドコンピューティングサービスとは？
クラウドコンピューティングサービスは通称「クラウド」という言葉で使われます。
クラウドと聞くとiCloudやGoogleドライブなどでなんとなく耳にしたことがあるかと思います。

では、クラウドとは何かと言うと、
インターネット上のサーバーにあるコンピューターが提供している機能を、
インターネット経由で利用する仕組みのことを指します。

わかりやすいイメージとしてはGmailです。
Gmailはアプリをインストールして自分のPCやスマホにインストールしなくても使用することは可能です。
それはGoogleのサーバー（インターネット上）にGmailの機能やサービスが入っているので、
わざわざインストールしなくても、ネットに繋がっている状態であればGmailを使用することができるのです。


◎インターネットとは？
https://www.soumu.go.jp/main_sosiki/joho_tsusin/security/kids/basic/01.html

◎サーバーとは？
https://it-biz.online/it-skills/server-abc/

# AWSでできること
それではAWSでどのようなことができるのかを見ていきたいと思います。
GoogleがGmailやGoogleドキュメント、スプレットシートなどサービスを提供しているように
Amazonもサービスを提供しています。

AWSが提供しているサービスは上記でも記述しましたが１００以上のサービスを提供しております。
今回はその中でもエンジニアがよく使う代表的なサービスを３つご紹介したいと思います。

①RDS
RDSは仮想のデーターベースを作ることができます。
本来であれば自分のPCの中にMySQLやPostgreSQLなどをインストールし、
データーベースを使用しますが、RDSを使うことでインターネット上に仮想のデーターベースを作ることができます。
詳しくは下記の記事を見ていただければと思います！

https://qiita.com/kenta-nishimoto-1111/items/546990b12d4485a1b843

②EC２
EC2は仮想サーバーを作ることができるサービスです。
詳しくは下記の記事を読んでいただければと思います！

https://qiita.com/kenta-nishimoto-1111/items/4760bc02a6dfa40db035


③S3
S3は大量のデータ（画像など）を保存しておくことができます。
詳しくは下記の記事を読んでいただければと思います！（こちらも後日自分でまとめます！）
https://www.wafcharm.com/blog/s3-for-beginners/

# AWSのメリット
AWSが幅広く使用されているのには下記のようなメリットがあります。

①安い！
初期費用0円で、お金がかかる場合も使った分だけ支払うような仕組みとなっています。
それぞれのサービスによって料金形態も違いますが、無料枠を超えない限りお金がかかることはないので
費用面でのメリットは大きです。

②セキュリティ
ANAや任天堂など有名企業もAWSを使用しており、
それだけの企業が信用できるほどのセキュリティを持っている。
導入企業：https://aws.amazon.com/jp/solutions/case-studies-jp/

③ハードウェアの管理やソフトウェアのアップデートはAWS側がやってくれるのでユーザーが行う必要がない

④すぐに使用することができる
アカウントを作成するとすぐに始めることができます。

、、、などが挙げられます。


# 終わりに／完成形
今回はAWSについて、初心者の方もなるべく難しくなく
どのようなものかイメージできるようにまとめさせていただきました。

他にもAWSの始め方や、各サービスについてもまとめさせていただきます。
ぜひそちらも参考にAWSを学んでいただけたら幸いです。

AWSのアカウントの作成方法
https://qiita.com/kenta-nishimoto-1111/items/e1a5709c6efc78e00fc2
Algorithm | Python3で解説したアルゴリズムまとめ

## アルゴリズム一覧
　
　Qiitaの構造上、記事をまとめてみることができないので、こちらの記事で今まで解説したアルゴリズムを一覧できるようにしてみた。

　まだまだたくさんのアルゴリズムがあるので、随時更新予定だ。よろしければ、ブックマークなどしていただけると幸いだ。

## 二分探索（bisect, めぐる式二分探索）

https://qiita.com/uniTM/items/2f2a38f225f04154df9a

## Union-Find

https://qiita.com/uniTM/items/77ef2412e426cae44586

## 優先度付きキュー（heapq）

https://qiita.com/uniTM/items/9630ed9d51f62b3e35ab

## 区間スケジューリング問題

https://qiita.com/uniTM/items/0dbd7ec962186c005c08

## 最小全域木

https://qiita.com/uniTM/items/a6c5211ce9c9008b74a8
AjaxでDB未接続時にエラーメッセージを出す方法

DB接続時のエラーメッセージを出す方法として、onAjaxErrorを使用するやり方がある。
onAjaxErrorはページ内で発生したAjax通信が失敗した時に指定した関数を実行する。

例では、リストテーブルでAjax通信を行っている。
まず、リストテーブルにonAjaxErrorで実行する関数(この場合onAjaxError)を指定する。


```:list.html
<imart type="imuiListTable" id="listtable" process="jssp"　target="unit_test/list" viewRecords="true"
onAjaxParameterExtend="onAjaxParameterExtend" 　onAjaxError="onAjaxError" height="136">
...
</imart >
```


次に、onAjaxErrorで指定した関数で、エラーメッセージを出す。

```:list.html
//Ajax通信が失敗した際に呼び出される関数
	function onAjaxError() {
		//「データベースに接続できませんでした」とエラーメッセージを出力 
		imuiShowErrorMessage('データベースに接続できませんでした',[],true,0);
	}
```

やり方を知っていれば簡単な方法なので、知らない方はぜひ試してみてほしい。
windowsでiverilog その106

# 概要　

windowsでiverilogやってみた。
JKフリップフロップ、書いてみた。

# サンプルコード

```
module x(input j, input k, output q, output q_);
	reg q,
		q_;
	initial
	begin
		q = 1;
		q_= 0;
	end
	always @(j or k)
	begin
		case ({j, k})
		2'b00: 
		begin
			q <=  q;
			q_ <= q_;
		end
		2'b01: 
		begin
			q <=  0;
			q_ <= 1;
		end
		2'b10: 
		begin
			q <=  1;
			q_ <= 0;
		end
		2'b11: 
		begin
			q <=  ~q;
			q_ <= ~q_;
		end
		endcase
	end
endmodule

module testbench;
	reg a, 
		b;
	x u(.j(a), .k(b), .q(c), .q_(d));
	initial
	begin
		$display("j k q q_ ");
		$monitor("%b %b %b %b ", a, b, c, d);
		a = 0; b = 0; #10;
		a = 0; b = 1; #10;
		a = 1; b = 0; #10;
		a = 1; b = 1; #10;
		a = 0; b = 0; #10;
		a = 0; b = 1; #10;
		a = 1; b = 0; #10;
		a = 1; b = 1; #10;
		$finish;
	end
endmodule





```

# 結果

```


j k q q_
0 0 1 0
0 1 0 1
1 0 1 0
1 1 0 1
0 0 0 1
0 1 0 1
1 0 1 0
1 1 0 1

```

以上。
ROS2におけるQoS

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】

publisher/subscriberにて使用されるQoSは通信品質にかかわる設定である．`create_publicher()`や`create_subscription()`のコンストラクタで呼び出される．

# 使用方法
[create_publisher関数のapi reference](https://docs.ros2.org/foxy/api/rclcpp/classrclcpp_1_1Node.html#ad1dfc9d04d67ab93353e04a7df72bc9a)にて使用例があり，分かりやすいので抜粋する．

```c++
pub = node->create_publisher<MsgT>("chatter", 10);  // implicitly KeepLast
pub = node->create_publisher<MsgT>("chatter", QoS(10));  // implicitly KeepLast
pub = node->create_publisher<MsgT>("chatter", QoS(KeepLast(10)));
pub = node->create_publisher<MsgT>("chatter", QoS(KeepAll()));
pub = node->create_publisher<MsgT>("chatter", QoS(1).best_effort().volatile());
{
  rclcpp::QoS custom_qos(KeepLast(10), rmw_qos_profile_sensor_data);
  pub = node->create_publisher<MsgT>("chatter", custom_qos);
}
```

詳しい使用方法は[公式のQoSのapi reference](https://docs.ros2.org/foxy/api/rclcpp/classrclcpp_1_1QoS.html)を参照のこと．

## QoS(size_t history_depth)
正確には以下のような宣言となる．

```c++
clcpp::QoS::QoS	(size_t history_depth)
```

以下のような使用方法で，`QoS(KeepLast(10))`と同じ．

```c++
QoS(10)
```

## QoS(const QoSInitialization& qos_init, const rmw_qos_profile_t& init)
正確には以下のような宣言となる．

```c++
rclcpp::QoS::QoS(
  const QoSInitialization & qos_initialization,
  const rmw_qos_profile_t & initial_profile = rmw_qos_profile_default
)	
```

`qos_initialization`として`KeepLast()`および`KeepAll()`が使用できる．[QoSInitializationのapi reference](https://docs.ros2.org/foxy/api/rclcpp/structrclcpp_1_1QoSInitialization.html#details)のDetailed Descriptionを参考のこと．
Firebase JS SDK v9 になってimportの記述が変わってた

プログラミング初学者のメモなので、訂正等あればご意見ください。
# Firebase JS SDKがv9.0.0になってた

プログラミングの勉強を始めようと思ってFirebaseを用いたログイン認証を作ろうとしたら、始める前日（2021/8/25)にFirebase JS SDKが v8.10.0 → v9.0.0 になってました。
ここに気づくのに時間がかかった…。
「15分で作れるFirebase Webログイン認証！」を見ながら3日間も格闘したので、その格闘の軌跡を置いておきます。
これからFirebaseを利用する人の為になれれば。

## v8以前のコードをv9で実行すると発生するエラー

v8.10.0以前のFirebaseでは、

```js
import firebase from 'firebase'
import "firebase/auth"
import "firebase/firebstore"
```

の形でライブラリの導入が行われていました。
ですが、v9.0.0では以下のようなエラーメッセージが出るようになります。

```
This dependency was not found:

* firebase in ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader-v16/dist??ref--0-1!./src/components/Signin.vue?vue&type=script&lang=js

To install it, you can run: npm install --save firebase
Error from chokidar (C:\): Error: EBUSY: resource busy or locked, lstat 'C:\DumpStack.log.tmp'
```

私の場合は、vue.js + Firebase Authenticationでログイン認証を作る というのを参考にしていて、このメッセージが出ます。
他にも様々な部分でエラーが出て、「15分でできるって聞いてたのにエラーばっかり何で？！」となりました。
## v9でのimportの記述
v8以前のFirebase公式のドキュメントにも記述がありますが、必要なライブラリ以外は導入すべきでないらしいです。
ファイルサイズがでっかいので。
その志向をより強くしたのがv9.0.0のようで、

```js
import { initializeApp } from 'firebase/app';
import { getAuth } from 'firebase/auth';
import { getFirestore } from 'firebase/firestore';
```

このように、使用するモジュール(?)のみをimportするらしいです。
例えばFirebase SDKの初期化をするコードだと、

```v8_10_0.js
import firebase from "firebase/app";

const firebaseConfig = {
  // ...
};

firebase.initializeApp(firebaseConfig);
```
これが、

```v9_0_0.js
import { initializeApp } from "firebase/app"

const firebaseConfig = {
  // ...
}

const firebaseApp = initializeApp(firebaseConfig);
```
こうなるみたいです。
## compatライブラリで簡単にアップデート

既に書いてたコードをどうv9にアップデートすればよいのか分からない場合等は、とりあえずcompat(互換)ライブラリを使えばいいみたいです。
[公式ドキュメント：バージョン8からモジュラーWebSDKにアップグレードします](https://firebase.google.com/docs/web/modular-upgrade
)

```js
import firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/firestore';
```

ただ、これだとv9の高速化の恩恵を受けられないそうなので、一時的な対処のようです。

## FirebaseUI はv9に対応してないらしい

Firebase UIはv9に対応できていないらしいので、firebase v9環境でFirebaseUIを使用すると

```
 warning  in ./node_modules/firebaseui/dist/esm.js

"export 'default' (imported as 'firebase') was not found in 'firebase/app'
```
と、importがうまく行かないエラーが出ます。
なので、もしFirebase v9のために他の部分をアップデートしたとしてもFirebaseUI部分は結局compatライブラリを使用することになります。

このエラーログのファイルを探して以下のように書き換えました。

```./node_modules/firebaseui/dist/esm.js
import firebase from 'firebase/compat/app'; import 'firebase/compat/auth';
```

FirebaseUIを使用するページでは、以下のようにimportしています。

```js
import firebase from "firebase/compat/app";
import "firebase/compat/auth";
import * as firebaseui from "firebaseui"
import "firebaseui/dist/firebaseui.css";
```

## あとがき
プログラミングを勉強し始めて日が浅く、Qiitaに投稿するのは初めてなので書き方等でアドバイスを頂けると嬉しいです。
数日前にアップデートされたライブラリに突撃する初学者、確実に茨の道ですががんばります。
Contact Form 7 Multi-Step Formsを使用した時のIE対応

#はじめに
WordPressのContact Form7を使って、Googleフォームにみたいなステップ型のアンケートフォームを作りたいとクライアントから要望があったため、サクッと作りたかったので、ステップ分割が出来るContact Form 7のアドオンContact Form 7 Multi-Step Formsを使用して実装しました。

このアドオンの使用方法は以下のサイトが一番詳しく書かれていると思います。
https://www.itti.jp/web-design/contact-form-7-multi-step-forms/


ところが、このアドオンはIEに対応していなかったのです。（Macばかり触ってるとIEのことはよく忘れがち）

Windowsを利用するユーザーのブラウザはほとんどEdgeになりますが、日本国内のブラウザシェア率を見ると、しぶとくもIE11が第5位にいらっしゃいますね。
https://webrage.jp/techblog/pc_browser_share/


今回は時間が無かったためIEを利用した際は、ステップ型を諦めて通常のフォームを表示するようにしました。


#手順
1.ステップ型フォームの固定ページとは別にIE専用の固定ページを作成する。

2.IE専用のフォームページに表示させるフォームをContact Form7で作成する。

3.IE専用の固定ページに2で作成したフォームのショートコードを入力する。

4.ステップ型フォームの固定ページ、IE専用固定ページで使用する共通のテンプレート（formtemplate.php）を作成する。

固定ページのテンプレート作成については以下を参考
https://wordpressmatome.com/%E5%90%84%E5%9B%BA%E5%AE%9A%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E9%81%B8/

5.formtemplate.phpにIEの条件分岐を記入して、IEでアクセスした時はIE専用のフォームが表示させる。


```formtemplate.php
<?php

global $is_IE;

if ( $is_IE ) {
  $page_id = 1234  //IE専用の固定ページのidを入れる;
  $page = get_post($page_id, 'OBJECT', 'raw'); 
  $page_include = apply_filters( 'the_content',$page->post_content); 
  echo $page_include;
}else{
  the_content();  
}

?>
```

$is_IEはブラウザ判定が出来るグローバル変数になります。
詳しくはこちらに書かれていました。
https://wp-kyoto.net/wordpress-global-vars/

#最後に
文章で書くとややこしいですが、単純にIEでアクセスした時は別のIE専用ページの内容を表示させているだけですね。


もっと分かりやすく書けるように頑張ります。。
Fakerで生成したパスワードが原因でテストコードがエラーになる問題

#開発環境
- OS：macOS Big Sur 11.2.2
- Ruby：2.6.5
- Ruby on Rails：6.0.0
- Faker：2.18.0
- テキストエディタ：Visual Studio Code

#発生事象
rspecを利用したテストコード実行で以下のようなエラーが頻発するようになった。
![0b3548791e832ab589c7b7b58035c2eb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1784617/3edc42b4-b8ac-8456-caad-35c13955e03a.png)

まず何をしているかというと、

- deviseモデルであるuser
- userとアソシエーションを持つpresent_order_form

この2つのmodelがあって、``user``モデルの単体テストコードは作成済み・問題なく実行済み。
``present_order_form``モデルの単体テストコードを作成して、実行してみたところ、紐づけている``user``モデルの方でエラーが起きる。しかも何度か再実行すると、ある特定のexsampleで起きるわけではなく発生箇所がランダムになっていることがわかる。

#原因
userインスタンスはFactoryBotとFakerで以下のようなデータを生成していた。

```users.rb
FactoryBot.define do
  factory :user do
    nickname              { Faker::Name.initials(number: 2) }
    email                 { Faker::Internet.free_email }
    password              { Faker::Internet.password(min_length: 6) }
    password_confirmation { password }
  end
end
```

主にパスワードとなる文字列を生成してくれる[Faker::Internet.password](https://github.com/faker-ruby/faker/blob/master/doc/default/internet.md)だが、実は利用できるオプションはとても少ない。

| option             | 内容                   |
| ------------------ | --------------------- |
| min_length 　　　　　　　　　　　　　　　　| 最小文字数の指定         |
| max_length　　　　　　　　　　　　　　　 　| 最大文字数の指定　　　　　　　　　　　　　　　  |
| mix_case 　　　　　　　　　　　　　　　　　　　　| 大文字小文字混合指定　     |
| special_characters | 記号の混合指定           |

見ての通り**英数字混合の指定はできないのである。**
今回userモデルのpasswordには英数字混合フォーマットでバリデーションをかけていたので、実行するexampleが多くなればなるほど、英字もしくは数字を含まないパターンでpasswordを生成してしまったインスタンスが発生しやすくなり上記のようなエラーが頻発する模様。

かゆいところに手が届いていない気もするが無料で利用させていただいて文句は言えないので、諦めてmin_lengthを大きめにとっておくか、Loremでカスタマイズした文字列を生成するようにするか、もしくはそもそもFakerにこだわらず決めの文字列でインスタンス生成するしか解決案はなさそうである。

#余談
とはいえ英字だけ・数字だけの文字列がそんなに頻繁に生成されるものか？
体感としてはやたら多いと感じたので、ざっくり確率を計算してみた。

###6文字の文字列が英数字混合にならない確率
6文字の文字列パターンは36(数字10個とアルファベット26個)の6乗。数字のみの場合は10の6乗、英字のみの場合は26の6乗なので、
**(10の6乗/36の6乗) + (26の6乗/36の6乗) = 14.23%**
思ったより高い・・・deviseモデルのpasswordはデフォルトのmin_lengthが6文字だけど、それに合わせてしまうとエラーが頻発しそう。

###10文字の文字列が英数字混合にならない確率
同じように計算すると、
**(10の10乗/36の10乗) + (26の10乗/36の10乗) = 3.86%**
このあたりでだいぶ安全な範囲かなと思う。

不都合がなければ、最初から10~15桁くらいで設定しておくといいかもしれない。
MySQLサーバの容量が過度に圧迫された話

お仕事の所でのお話。

# 発端

社内で運用が開始されて1年ほど経ったシステムを他の担当社員から引き継ぎました。
その際、DBサーバの容量が不穏なことに気づきました。1TBのSSDの7割ほどが使われている…。

とはいえ、容量が横ばいなら問題ではありません。
しかしそのシステムは1日に数GBずつ増えていっていたので、このままでは持って3-4ヶ月です。

さて困った。

# 環境

- OS：CentOS7
- DB：MySQL
- SSD：約1TB（使用約700GB、日々2−4GB増加中）

これがMASTER-SLAVEの2台構成になっていて、SSDの使用率はどちらもほぼ同じです。

# 事象確認

何はともあれ、幾つかアタリをつけて調べ始めます。

## MySQLのデータが増加している

まずはMySQLのデータそのものの量の増加を疑いました。
これがあまりに増えていたらSSDの増設を急いで行う必要があります。
この確認は以下のSQLを実行しました。

```sql
SELECT table_schema, sum(data_length) /1024/1024/1024 AS GB 
FROM information_schema.tables  
GROUP BY table_schema 
ORDER BY sum(data_length+index_length) DESC;
```

しかし全スキーマを合わせても容量は20GBに満たないくらい。
自動で取られるDB dumpも大体それくらいの容量なので、全く余裕があることが分かりました。

### ログファイルが圧迫している

ここで言うログは、大きくOSのログかMySQLのログかによります。
OSのログであることはほぼ考えていませんでした。
同じOSを積んだ他のサーバは容量が小さく、何らかの異常が発生していても冗長構成の両方というのも変。

ということでMySQLのログを疑いました。
スロークエリログが爆発しているのだとしたら閾値やログ保存日数の見直し。
バイナリログだとしたらローテートの日数を短く取らないとダメか？

#### スロークエリの確認

```sql
SHOW GLOBAL VARIABLES like 'slow_query_log';
```

slow_query_logはOFF。
スロークエリを全く取っていないのも疑問ですが、容量圧迫問題についてスロークエリの疑いは晴れました。

#### バイナリログの確認

```sql
SHOW GLOBAL VARIABLES like 'expire_logs_days';
```

なんとexpire_logs_days=0、つまりログがローテートされていない？
バイナリログが保存されている場所が`/mnt/disks/mysql/data/`とのことなので、以下で確認。

```bash
$ ll /mnt/disks/mysql/data/
```

すると出るわ出るわ、1年前からのバイナリログがゴロゴロ…。
1ファイルが1GBちょっとで、その数600超。

# 対応

上までの調査でバイナリログが今回の犯人であることは分かりました。
しかしバイナリログを一気に全部削除してしまうと、マスターとスレーブでレプリケーションが取れない可能性があります。

念のため、以下のSQLで同期に大きな遅れがないかを確認。
マスター・スレーブともにほぼ同時に実行して、ログファイルとポジションに差が大きくないかを確認。

```sql
SHOW MASTER STATUS;
```

確認した所、遅れも1分以内なので問題なし。

まずはサーバに負荷をかけないため、以下のSQLを実行して徐々にログファイルを消しました。

```sql
PURGE MASTER LOGS TO 'mysql-bin.XXXXXX';
```

SSDだし、一気に消しても負荷はそんなに大きいとは思わないのですが、念の為。

ある程度消し終わったら以下のSQLを実行し、ローテーションを設定。
7日間以上経ったログを削除するよう設定、日数が変わったことを確認します。
※正確には、ログローテート時に7日以上前のログを削除。実行後すぐ削除される訳ではない。

```bash
SET GLOBAL expire_logs_days = 7;
SHOW GLOBAL VARIABLES like 'expire_logs_days';
```

最後にログが切り替わった段階で設定日数より前のログが削除されていることを確認し、作業終了です。

# 参考

- [MySQLのバイナリログ削除タイミング](https://qiita.com/gessy0129/items/e10c9eb2f55eed4dd18c)
- [MySQLバイナリログ保存期間をオンラインのまま変更](http://5net.com/blog/2011/09/change-mysql-binlog-expire-days.html)
【pug】コメントの書き方（1行コメント/ブロックコメント/条件付きコメント）

## はじめに
この記事ではpugにおけるコメントの書き方を紹介する。

参考：pug公式サイト → [Comments - Pug](https://pugjs.org/language/comments.html "Comments-Pug") 

## 1行コメント
### 出力される1行コメント
```pug:pug
// 出力される1行コメント
p foo
p bar
```
```html:html
<!-- 出力される1行コメント-->
<p>foo</p>
<p>bar</p>
```

### 出力されない1行コメント
```pug:pug
//- 出力されない1行コメント
p foo
p bar
```
```html:html
<p>foo</p>
<p>bar</p>
```

## ブロックコメント
### 出力されるブロックコメント
```pug:pug
body
  //
    出力される
    ブロックコメント
```
```html:html
<body>
  <!--出力される
ブロックコメント-->
</body>
```

### 出力されないブロックコメント
```pug:pug
body
  //-
    出力されない
    ブロックコメント
```
```html:html
<body>
</body>
```

## 条件付きコメント
pugでは`<`で始まる行はプレーンテキストとして扱われるため、htmlで書かれた部分はそのまま表示される。

```pug:pug
doctype html

<!--[if IE 8]>
<html lang="en" class="lt-ie9">
<![endif]-->
<!--[if gt IE 8]><!-->
<html lang="en">
<!--<![endif]-->

body
  p コメントを用いてIEの古いバージョンに対応
</html>
```
```html:html
<!DOCTYPE html>
<!--[if IE 8]>
<html lang="en" class="lt-ie9">
<![endif]-->
<!--[if gt IE 8]><!-->
<html lang="en">
<!--<![endif]-->

<body>
  <p>コメントを用いてIEの古いバージョンに対応</p>
</body>

</html>
```
macOSのrailsで"An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue."の対処方法

#環境
macOS Big Sur(11.2)
ruby
rails6.1.4
mysql2

###gemでmysql2インストール時、絶対errorに俺はなる
以前はQiitaに対処方法のエントリがあったのだけど、なんか無くなっちゃったので。

```sh:
Gem::Ext::BuildError: ERROR: Failed to build gem native
extension.
.....
An error occurred while installing mysql2 (0.5.3),
and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source
'https://rubygems.org/'` succeeds before bundling.
```

#解決法

ターミナルで下記を打ち込む。

```sh:
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

Gemfileに下記をかいて、bundle installする。

```sh:Gemfile
gem 'mysql2', '~>0.5.3'
```
以上です。
Firebase Authでカスタムドメインを表示する

![スクリーンショット_2021-08-31_11_11_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32169/e6c76765-2c24-233c-1fdb-2c9c13eecf9f.png)


ここのドメインのこと。

アプリケーションを独自ドメインで動かしていても、デフォルト設定だとここでデフォルトのドメインが表示されてかっこわるいです。

かっこ悪いだけならまだしも、ユーザーから見ても見慣れないドメインが表示されると、ユーザー登録をやめる可能性があります。

## 前提

- firebase hostingを使っている、webアプリケーション
  - 他環境では未確認
  - カスタムドメイン設定済
  

## 方法

大体こちらの通り

https://www.skies.dev/firebase-auth-domain


公式ドキュメントだとここらへんが該当しそうなのですが、SAMLで登録する事になっており、SAMLの登録内容が良くわかりません。

https://cloud.google.com/identity-platform/docs/show-custom-domain


### Authentication設定

FirebaseのAuthenticationの承認済ドメインに、カスタムドメインを追加します。
カスタムドメインの設定済であれば、既にされているはずなので省略。

## メールテンプレートの変更

メールアドレス/パスワードでのログインを許可している場合、firebaseから各種メールが送信されます。

メール内に、認証のリンクが含まれているため、URLを変更しておきます。

`hoge.firebaseapp.com` -> `カスタムドメイン`

![knowledge-basket-stg_-_Authentication_-_Firebase_コンソール_と_Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32169/ce3ac73b-d385-bb84-5779-990134a5f24a.png)


## Redirect URIの追加

GCPの

APIとサービス > 認証情報（credentials） を開きます。

https://console.cloud.google.com/apis/credentials

自動で作られてるのがいくつかありますが、OAuth2の方を編集します。

![スクリーンショット_2021-08-31_11_02_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32169/62d3fcfc-5e03-3576-70fa-99bbffa6d6b0.png)

`承認済のJavascript生成元` にカスタムドメインを追加します。

![スクリーンショット_2021-08-31_11_02_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32169/bbf8dadb-d4f8-1b9a-c969-67a58b86db98.png)

もう1箇所、`承認済のリダイレクトURI`にもカスタムドメインのものを追加します。既存の物をコピって、ドメインだけ変えれば良いと思います。

![スクリーンショット_2021-08-31_11_03_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32169/e744067e-26f0-a5c7-f229-e67dae11c257.png)


## コードを変える

authDomainを、カスタムドメインに変更します。

以上でいけるはず、、、、