OmniAICreator/Qiita-1.07M huggingface dataset:
SQLでの年度と四半期の変換方法(SQLserver)２

月補正関数
この関数では0,13や14などの月として不適切な値を月に置き換える処理を行います。
方法論としては12の余剰を返し、かつ余剰なしの場合は12を返すということでございます。
```sql:dbo.MonthCorretion
CREATE FUNCTION dbo.MonthCorretion(@Month int)
returns int
as
begin
declare @innermonth as int;
set @innermonth = @Month % 12;
if(@innermonth = 0)
set @innermonth = 12;
return @innermonth;
end
```
以下は説明すると
DATE(入力された値),年度(int),四半期(int),漢字表記粘度四半期を返すテーブル値関数でございます。

```sql:dbo.fiscalyear
 CREATE FUNCTION dbo.fiscalyear(
					@Date Datetime2,
					@ClosingMonth int = 3)
returns @FiscalElements table
(
	date Datetime2 Not null,
	fiscalyear int Not null,
	quarterpart int Not null,
	quarterparthanji char(18) Not null
)
as
begin

declare @innermonth as int;
declare @inneryear as int;
set @innermonth = month(@Date);

--This part sets fiscalyear of @Date.
--この部分で会計年度をセット
if(@innermonth > @ClosingMonth)
set @inneryear  = year(@date);
else
set @inneryear = year(@date) - 1;
--This part sets quarterpart  of @Date.
--この部分で四半期をセット
declare @repeatmonth as int;
set @repeatmonth = 0;
declare  @relativemonth as int;
set @relativemonth =  dbo.MonthCorretion(@ClosingMonth +@repeatmonth + 1);
declare @quarterpart int;
while @repeatmonth < 13
	begin
	if (@relativemonth = @innermonth)
		begin 
			set @quarterpart = cast((@repeatmonth  / 3) as int)+1;
			break;
		end
	else
		begin
			set @repeatmonth = @repeatmonth + 1;
			set @relativemonth = dbo.MonthCorretion(@relativemonth + 1);
			continue;
		end
	end

--this part sets japanese quaterpart in character.
--この部分では文字列四半期を設定する。
declare @qparthanzi char(2);
if (@quarterpart=4) set @qparthanzi = '肆'
if (@quarterpart=1) set @qparthanzi = '壱'
if (@quarterpart=2) set @qparthanzi = '弐'
if (@quarterpart=3) set @qparthanzi = '参'

insert  @FiscalElements(date,fiscalyear,quarterpart,quarterparthanji)
values (@Date,@inneryear,@quarterpart,cast(@inneryear as char(4)) + '年度第' + @qparthanzi + '四半期')
return 
end

```
さくらのモノプラのファームをセルフビルドしてターゲットボードで実行

## 概要
今年の3月に正式リリースされたさくらインターネットのモノプラットフォーム(モノプラ)で使用されるLTE搭載マイコンのファームウエアをビルドして書き込んでみました。
さくらインターネットさんから提供されてい評価ボードを使う場合は、ファームに手を入れる必要がなければ自分でビルドする必要はないので、あまり需要があるかわかりませんが、メモとして残したいと思います。
(私の場合は少し機能を追加したかったのでソースからビルドしました)

なお、nRF9160の実機への書き込み・デバッグにはJ-LINKアダプタが必要ですが、開発キットであるnRF9160-Dkで代用可能です。 (Digikey/mouserで購入可能)
同社のnRF52840-DK等もJ-LINKアダプタとして使用できますが、ARMv8に対応していないため、nRF9160のデバッグには使えませんでした

## 環境
- ターゲットボード:
  - さくらのモノプラットフォーム(β)評価用 M5Stack対応LTEモジュール cat.M1 nRF9160 (SCO-M5SNRF9160)
- デバッガ(J-LINKアダプタ):
  - nRF9160-DK
- SDK:
  - nRF Connect SDK v.1.7.1
  - nRF Connect for Desktop v.3.11.0
  - Programmer v.3.0.0
- OS:
  - Windows 10

## nRF Connect SDKのインストール
後で追記予定…

## nRF9160-DKをJ-LINKアダプタとして使用する(動作確認)
nRF Connect for Desktopを起動し、表示されるアプリからProgrammerというプログラムを探してインストールします。
実行すると左上の"SELECT DEVICE"から接続するボードやアダプタを選択できます。
手順としては

1. nRF9160-DKのDebug OUT端子とターゲットボードのJ-LINKコネクタをケーブルで接続
1. デバイスの一覧からnRF9160-DKを選択
1. 左側の操作メニューからResetやReadでターゲットを読み書きできることを確認

でよいのですが…ここで少し注意点があります。
今回のターゲットボードのIO電圧は3.3Vなので、 **nRF9160-DKのVDDIOをデフォルトの1.8Vから3Vに変更**してやる必要があります。
これはSW9で切り替えることができます。

これまで使ったことのあったnRF52系のDKでは特に意識せずに接続しただけでターゲットとして認識されていたのですが、なぜかUnknown Targetとエラーが発生して半日ほどはまった末にドキュメントをよく読むと

> Note: The voltage supported by external debugging/programming is the VDD voltage. This voltage can be selected to 1.8 V or 3 V using slide switch SW9. For optimal performance of the nRF9160 radio, it is recommended that only 1.8 V is used. Make sure the voltage level of the external board matches the VDD of the nRF9160 DK.

とありました。
やっぱりドキュメントはよく読みましょう。


## ファームウエアのビルドと書込み

追記予定…
(github参照 https://github.com/sakura-internet/sipf-std-client_nrf9160)

## まとめ

モノプラではハードウエアおよびファームウエアがオープンソースとして公開されており、これらを使うことで端末側でのHTTPやMQTTといった通信処理を自分で実装することなくインターネット上のサービスとIoT機器間でデータを送受信することができます。
比較的小規模で開発工数をかけずにサービスを立ち上げるにはとても使いやすいサービスだと思います。
一方でリファレンスとして使用されているnRF9160は結構高性能なマイコンなので、アプリケーションによってはnRFのファームウエアを変更すれば外部のMCU等を使用せずに単体で機能すものが作れてしまうので、うまく活用することでコストを抑えつつ手早く開発することができそうです。
# WindowsでDockerDeskTopをインストールする（Vagrantと共存）

Hyper-V有効でVagrantとDocker共存できるようになったようなので、Vagrant用のPCにDockerをインストールしてみる。

OS:Windows10Pro
VirtualBox:6.09
Vagrant:2.2.9

## 準備
・バージョン確認
```cmd
winver
```

> 21H2(19044)

・Hyper-Vが有効化されているか確認する
[設定]-[Windowsの機能の有効化または無効化]にある`Hyper-V`にチェックが入っている事
> OK

・Ubuntsu v20をインストールする
```cmd
# Windows10だとwslはインストールされているので、ディスとリビュージョンをインストールする
# OnlineInstall可能なディスとリビュージョンのリスト表示
wsl --list --online
# Ubuntsu(LTS最新)をインストール
wsl --install -d Ubuntu-20.04
```

・Docker DeskTopをインストール
https://docs.docker.com/desktop/windows/install/

## 起動エラー
DockerforDeskTop起動時にエラーが発生する。
```
Hardware assisted virtualization and data execution protection must be enabled in the BIOS. See https://docs.docker.com/desktop/windows/troubleshoot/#virtualization
```
### 各項目確認
`https://docs.docker.com/desktop/windows/troubleshoot/#virtualization` の確認項目をチェックしたが、問題はなさそう。
* Bios-Security-Virtual関連が有効化されているか確認
* [設定]-[Windowsの機能の有効化または無効化]にある下記項目が有効化されていることを確認
・仮想マシン プラットフォーム
・Hyper-V
・Linux用Windowsサブシステム
* [タスクマネージャ]-[パフォーマンス]-[仮想化]が`有効`となっていることを確認

### 対策
稀にHyper-Vが壊れることがあるらしく、[設定]-[Windowsの機能の有効化または無効化]の下記項目を一旦無効化 -> 再起動 -> 有効化 -> 再起動にて正しく起動するようになった

・仮想マシン プラットフォーム
・Hyper-V
・Linux用Windowsサブシステム

## Vagrantが起動しない
Dockerインストール後にVagrantの起動を確認したら、下記のエラーが発生した。
```
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole
```

* Vagrant + VirtualBoxのアップデート
VagrantとVirtualBoxをアップデートしたら、正しく起動するようになった。
Vagrant:2.2.9 -> 2.2.19
VirtualBox:6.09 -> 6.1.3

## 検証
・DockerDeskTopのチュートリアルコンテナを起動できることを確認:OK
・以前作成していたVagrantファイルがVagrant upできること確認:OK


## 参考
・WLS2のインストール
https://docs.microsoft.com/ja-jp/windows/wsl/install#manual-installation-steps

・VagrantとDockerの共存
https://qiita.com/jerfareza/items/b2deefe86a950f91aafd

・WindowsにDockerをインストール
https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/

・DockerのWindowsインストーラー
https://docs.docker.com/desktop/windows/install/
SpringBootのトレース情報をSentryで確認する

SpringBootのトレース情報をSentryで確認する際の調査メモ

## 初期設定

``` build.gradle
implementation 'io.sentry:sentry-spring-boot-starter:5.7.3'
```

開発環境用のプロパティファイル
``` application-develop.properties
# Sentry
sentry.dsn={SentryUrl}
sentry.traces-sample-rate=1.0
sentry.send-default-pii=true
sentry.environment=develop
```
「sentry.traces-sample-rate」は、送信する割合ということで、本番環境では割合を減らすことが推奨されている。
「sentry.send-default-pii」は、trueにすることで送信元IPをセットできる。
「sentry.environment」は、どの環境の情報か判別できるようにするために設定する。

## SentrySpanアノテーションの付与

メソッドでも良いが、クラス単位で付与するとクラス内のメソッド全てが対象となる。
``` SampleController.java

@Controller 
@RequestMapping("sample")
@SentrySpan
public class SampleController {
  // 省略
}
```
``` SampleServiceImple.java

@Service
@SentrySpan
public class SampleServiceImpl implements SampleService {
  // 省略
}
```

``` SampleRepository.java
@Mapper
@SentrySpan
public interface SampleRepository {
  // 省略
}
```

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10978/f5f86e63-c200-f93f-0681-0af481c4a6d1.png)

アノテーションを付与するだけで、トレースが容易になりました。
【PHP】閏年判定プログラム

# コード
1・4で割り切れる年は閏年
2・400で割る切れる年はうるう年
3・100で割り切れる年は閏年ではない(※400で割る切れる年は除く)

↓上級者向け
```PHP
<?php
$uru_year =  DateTimeImmutable::createFromFormat('Y', 1900)->format('L');
echo $uru_year ? '閏年です。':'平年です。'; 
```

[image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/e54bb727-8241-dc62-e4eb-87d0394994ba.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954863/684a4d12-5d21-f123-088b-f9545b9e8569.png)




↓初級者向け
```PHP
<?php
$uru = '閏年です。';
$normal = '平年です。';
$year = 1600;

if($year % 400 === 0){
     echo $uru;
}else{
    echo ($year % 4 === 0 && $year % 100 != 0) ? $uru:$normal;
}
```
【Excel VBA】A1保存

# 目的
以下の条件を達成したい
* すべてのシートでA1セルが選択される
* 一番前のシートに移動
* 上書き保存をしてExcelを閉じる

# コード
A1セルを選択する関数と、上書き保存して閉じる関数を作成する。
作成した関数をそれぞれ呼び出す。

## A1保存関数
```
Function A1保存()
    Dim sht As Worksheet '処理中のワークシート
    Dim shtVisible '表示可能なワークシート
    Dim iRow, iCol '縦横座標
    Dim oFilterStatus As AutoFilter 'オートフィルタ状態
    Dim oRngeFilter As Range 'オートフィルタ設定

    For Each sht In Sheets
        If (IsEmpty(shtVisible) = true) And (sht.Visible <> xlSheetHidden) And (sht.Visible <> xlSheetVeryHidden) then
            Set shtVisible = sht
        End If

        'シートが表示されている場合
        If (sht.Visible <> xlSheetHidden) And (sht.visible <> xlsheetVeryHidden) Then
            sht.Select
            
            'ウィンドウ枠の固定がされている場合
            If ActiveWindow.FreezePanes = True Then
                iRow = Active.Window.SplitRow + 1
                iCol = Active.Window.SplitColumn + 1
                Cells(iRow + 1, iClo + 1).Active
            End If

            Set oFilterStatus = sht.AutoFilter
            'オートフィルタが設定されている場合
            If Not oFilterStatus Is Nothing Then
                'フィルタがかかっている場合
                If oFilterStatus.FilterMode = True Then
                    'フィルタがかかっている行の先頭を選択
                    Set oRngeFilter = Range("A1").CurrentRegion
                    Set oRngeFilter = Application.Intersect(oRngeFilter, oRngeFilter.Offset(1, 0))
                    Set oRngeFilter = oRngeFilter.SpecialCells(xlCellTypeVisible)
                    Range("A" & CStr(oRngeFilter.row)).Select
                End If
            End If

            sht.Range("A1").Select
        End If
    Next

    shtVisible.Select
End Function
```

## 上書き保存からの閉じる関数
```
Function 上書き保存からの閉じる()
    Application.DisplayAlerts = False
    ActiveWorkBook.Save
    ActiveWorkBook.Close
    Application.DisplayAlerts = True
End Function
```

## A1上書き保存
上記二つの関数を呼び出す。
個人用マクロブックに作成して、ショートカットを設定するなどすると使いやすいです。
```
Sub A1上書き保存()
    Call A1保存
    Call 上書き保存からの閉じる
End Sub
```
PythonのBlackフォーマッタがVSCodeの拡張機能として利用できるようになった

# 2022/07/29 追記
本稿で紹介する**Black Formatter**と、importの序列をフォーマットする**isort**を併せて紹介した記事をはてなブログに投稿しました。

https://nujust.hatenablog.com/entry/2022/07/24/114715

# 概要
最近人気のPythonのコードフォーマッタの[Black](https://black.readthedocs.io/en/stable/)が、VSCodeの拡張機能としてリリースされました。

# VSCodeの拡張機能 Black Formatter
2022年5月のVSCodeのリリースにおいて、PythonのコードフォーマッタのBlackが拡張機能としてVSCodeのマーケットプレイスで公開されたとMicrosoftからアナウンスがありました。

https://devblogs.microsoft.com/python/python-in-visual-studio-code-may-2022-release/

拡張機能のBlack Formatterはこちらです。

https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter

2023/02/04現在はプレビュー版ですが、通常の拡張機能と同様にマーケットプレイスからインストールが可能です。

![black_formatter_insatll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591150/f6db3f29-2ad9-6378-b22b-0a2d7d3f4152.png)

VSCodeの拡張機能として利用できるようになるまでは、BlackはPythonの外部ライブラリとして `pip install black` によりインストールする必要がありました。この拡張機能のリリースにより、仮想環境を使用している場合などでそれぞれの環境でインストールする必要がなくなり、より手軽に利用できるようになりました。

# Black Formatterに関する設定
設定ファイルに記載する内容がpip版を利用する場合と少し異なります。設定例を下記に示します。

```setting.json
{
    "[python]": {
        // 拡張機能のBlack Formatterを使う場合には必ず指定する
        "editor.defaultFormatter": "ms-python.black-formatter",

        // ファイルの保存時にフォーマットを自動実行する場合
        "editor.formatOnSave": true
    },

    // 最大文字数などのオプション引数を指定する場合
    "black-formatter.args": [
        "--line-length=120"
    ]
}
```

:::note warn
プレビュー版ということもあるので、設定方法などは今後変更があるかもしれないことには注意です。
:::

# 参考文献
Blackの概要や、pip版のBlackをVSCodeで使う方法については、こちらのページがわかりやすいです。

https://maku.blog/p/4oybku6/
Railsのdeviseでパスワードリセット時にメールアドレス以外の値もチェック項目として使用する

# はじめに
こんにちは。
Rails書き始めて4ヶ月になりました。

今回はdeviseを使用したユーザ認証基盤において、パスワードリセット時にメールアドレス以外の値もチェック項目として追加してみました。

参考になれば幸いです:bow:

# 結論
以下では、emailとusernameの2つの値でチェックしています。

```ruby:user.rb
class User < ApplicationRecord
  devise reset_password_keys: %i[email username]
end
```

あとは、formでusernameもPOSTされるようにすればOKです:ok_hand:

# 解説
パスワードリセット時のkeyは以下で`email`がデフォルトで設定されています。

https://github.com/heartcombo/devise/blob/main/test/rails_app/config/initializers/devise.rb#L135

こちらを上書きすることでkeyを増やすことができます。

上書きはconfigで指定もできますし、いくつかのユーザモデルを保持している場合、それぞれで変更したい場合はモデルでの記載がおすすめです。

モデルでconfigの上書きをする場合は、以下に記載の通り、deviseメソッドでハッシュで渡すことができます

https://github.com/heartcombo/devise#configuring-models


# おわりに
devise便利ですね。認証基盤が簡単にできるのは素敵です:pray:

以下記事を参考にさせていただきました。こちらでは、クラスメソッドを生やしていますが、本記事のようにconfigで設定が可能です。

https://qiita.com/merotan/items/2f641b688e61b8061887

それでは！
VScodeでvimのプラグイン入れたはいいが長押しが効かないときの処方箋


vscodeにvimのプラグインを入れた。
幸せになったのもつかの間、長押しが効かない。

## 結論

```
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false
defaults write com.microsoft.VSCodeInsiders ApplePressAndHoldEnabled -bool false
```

こちらのコマンドをターミナルで叩いて、vscodeを再起動することで解決しました。
めでたしめでたし。
4.18 (標準) 二次元確率変数の変数変換9 極座標変換

## 方針

(1)は見るからに極座標変換．(2)は同時密度が

```math 
f_{W,Z}(w,z)=f_W(w)f_Z(z)
```

の形で書けることを示し，周辺密度を全確率1になるように構成する．Wがベータ分布であることに気づくので，Wの周辺分布からZの周辺分布もわかる．

## 答案

![4.-26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/dc6d75f5-05d2-99b5-f785-c9b8a3b7f792.jpeg)
![4.-27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/b7071d33-76b8-9e50-b63a-e2188e74a7d1.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
言語共通のきれいな書き方

どの言語でも共通なきれいな書き方を紹介します
-
・注意・
これは、あくまでも一例です。
なお、これはjavascriptで書いてありますが、書き方のルールは大体一緒です。

1 カッコ`() {}`や、演算子(`==`など)のきれいな書き方
```javascript:if文のきれいな書き方
if (1 == 1) {
//↑  ↑  ↑  ↑
//if・for、数値、カッコの間にスペース開けると読みやすい
}
```
for文も同じです
```javascript:for文も同じ
for (let i = 0; i < 5; i ++) {
//            ↑このセミコロンは開けても開けなくてもどっちでもよい
}
```


2 変数の宣言はきちんとしよう。
```javascript:変数の宣言
let x = 100;
//変数の型まで宣言しましょう。
x = 120;
//いきなりこんな感じに宣言なしでもいい言語(pythonなど)はありますが、
//宣言できる言語は宣言しておきましょう
const y = 200;
//これの「const」は一回宣言したら、値を途中で変えることができない宣言方法です。

var z = 300;
//今の主流(?)はletなので、varはあまり使いませんが一応覚えておきましょう。
```

3 インデントもちゃんとつけよう

どっちが読みやすいですか？
```javascript:1
if (1 == 1) {
    console.log("1 = 1です");
}
```

```javascript:2
if (1 == 1) {
console.log("1 = 1です。");
}
```
明らかに1のほうが読みやすいと思います。
字下げを徹底しましょう。
・
・
・
もしかして、メモ帳でプログラム書いてないでしょうねぇ？？
もしメモ帳で書いていたら、それはいいことではありません。

コードを書くのは全然サボっていいことなのです。
そんな貴方には、「VScode(visual studio code)」という無料のコードエディターをおすすめします。
詳しくはgoogleなどで調べてね。


以上、今回はこれで終わります。
ご視聴、ありがとうございました！
vimの使い方

# 記事の内容
　**vim**(テキストエディタ)の使いかた、インストール手順,使い方について記載する。

# 記事作成背景
- linuxにて開発環境構築を行う際、vimを使って設定ファイルを変更することが多いため。
- nanoエディタを使用しても良いが、vimで仕事をこなしてきたため今回はvimを取り上げる。

# vimとは
- vimとは<strong>ターミナル(端末)から操作するテキストエディタ</strong>のことである。
- ターミナルからコマンドを打ち込むことで、vimというテキストエディタを操作可能。

# vimのインストール手順
1. 以下のコマンドを実行する。
``` 
sudo apt install vim
```

<img alt="install_vim.png" vspace="0" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655303/3732b305-bfbd-2213-3648-159768e535f8.png">

# vimの使い方
## モードについて
- vimには<strong>「モード」</strong>という概念が存在し、各モードにより出来ることが変わる。

    |モード|機能|
    |---|---|
    |ノーマルモード|カーソルの移動や文字の移動、削除等を行う<br> vim起動時はノーマルモード|
    |インサートモード|ファイル編集を行う|
    |コマンドモード|変更内容の保存、vimの終了などを行う<br>|
    |ビジュアルモード|範囲選択などを行う|

## モードの切り替え方
- vimはモードを切り替えながらファイル編集を行う。
- 切り替え方は以下となる。

    |モード|入力|
    |---|---|
    |ノーマルモード|esc、ctrl-c|
    |インサートモード|i、I、a、A、s、S|
    |コマンドモード|:|
    |ビジュアルモード|v、V、ctr-v|

# モード別コマンド一覧
- モード別にコマンドを説明する。
  - <strong>ノーマルモード</strong>
  
    |コマンド|機能|
    |---|---|
    |h|カーソルを左に移動|
    |j|カーソルを下に移動|
    |k|カーソルを上に移動|
    |l|カーソルを右に移動|
    |e|単語の末尾に進む|
    |w|単語の先頭に進む|
    |b|単語の先頭に戻る|
    |$|ノーマルモードのまま行の末尾に移動|
    |M|画面の真ん中に移動|
    |]] or L or G|一番下に移動|

 - <strong>インサートモード</strong>
   - 特になし
     - インサートモードの場合は一般的な操作方法でファイルの編集が行える。
       - カーソル移動は矢印キーにて可能
       - 文字削除はDELTEキーにて削除
 
 - <strong>コマンドモード</strong>
 
   |コマンド|機能|
   |---|---|
   |:w|保存する|
   |:wq|保存して画面を閉じる|
   |:q|保存せずに画面を閉じる|
   |:wq!|(保存して)画面を強制的に閉じる|
   |:set number|行番号を表示する|
   |:set nonumber|行番号を非表示にする|
   |:vsp name|名前(name)指定でwindow(画面)分割|
   |control w + h or l(エル)|(画面分割した状態で)hで左に移動、lで右に移動|
   |:clo|カレントウインドウを閉じる|
   |:on|カレントウインドウ以外を閉じる|
   |:tabnew name|名前(name)指定で新しいタブを作る|
   |gt, gT|次のタブ(前のタブ)に移動

 - <strong>ビジュアルモード</strong>
   - 使用する場面が今までになかったので省略(もし今後あれば更新する)

# 最後に
  - vimエディタの操作を習得するためのツール<strong>「Vimtutor」</strong>があるみたいなので<br>気になる方はやってみると良いかもしれません。
USBVistion激闘編

macamに[USBVision](https://qiita.com/yamori813/items/5c8a92c823f19763e69f)を追加してみました。

https://github.com/yamori813/macam/commit/58dcc104e352e06416be6838646d65f418023b5b

とりあえず一通りの処理が流せるだけで、まだいろいろ調整が必要です。

ディスクリプタに500mAとありますが、実質は130mAくらいです。古いデバイスなので、けっこう大きいです。バスパワーのハブにつなぐと上手く動かないので、セルフパワーのハブにつなぎました。

以前は見つからなかったような気がするのですがNT1003-1のデーターシートがネットで手に入りました。

このチップはコントロール用のパイプ(1)と転送用のアイソクロナスなパイプ(2)があります。アイソクロナスなパイプは9つのインターフェースがあり、それぞれ転送バイト数が違います。

コントロール用のパイプはレジスタへのアクセスになり設定やステータス確認に使います。アイソクロナスなパイプはフレームデーター受信用で、ホスト側でバッファを用意してコミットするとデバイスがデータを送り始めます。

SAA7111の設定はI2Cでおこない、I2Cもコントロール用のパイプを使って処理を行います。

hxrさんのGenericDriverを継承して作ります。

SAA7111からNT1003はYUV422で16ビットでデータが送られます。それをNT1003はYUV422,yuv420,Compressのフォーマットでホストに送ります。

SAA7111はいきなり初期化したりするとおかしな状態になって動かなくなりました。

これのデバッグはstatusレジスタ(0x1f)が正しく変化しているかで確認しました。NTSCが入っていれば、CODE,FIDTが1でHLCKが0になります。また入っていなければ逆になります。

あとNT1003のstatusレジスタ(5)は0が有効なのですが、確認するタイミングで1だったりして、ちょっと待つ必要があります。参考にしたLinuxのコードはstatusレジスタのチェックがバグっていました。&としなければいけないところが&&になってます。!=で判定するのもよくないです。

ミスオペでコードを一行消してしまって、動かなくなって半日くらい悩みました。動くようになったら、ともかくgit commitすることですね。

デバイス回りのプログラミングでは綺麗にしてからcommitしようとか考えると動かなくなってる事もよくあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bc86539c-bd02-5c2b-9fac-6009b0051154.png)

これをやってて気がついたのですが、[echoFX](https://www.echofx.com/)さんというアメリカの会社がこのデバイス用の以前は売り物だったソフトを、昨年末にフリーにされていました。

ページの写真をみるとまったく同じモジュールがターゲットのようです。いろいろなところでOEMされていたのかもしれません。

以前こちらがmacamに突っ込んだ[em28xx](https://qiita.com/yamori813/items/7e26a57e37b2fb8bdd30)のソフトもあるようです。

なかなか動く動くようにならなくて、モジュールが壊れてるかとも思ったのですが、このソフトで動作確認できたので、結構助かりました。

おそらく最近のMacOSでは動かなくなっていたのでフリーにしたのかもしれません。またどうやら、会社をたたんだような感じです。

こちら同様に最近のAppleには愛想が尽きたのかもしれません。
Excelによる0埋め(zero padding)

前職ではExcelで0埋めをする場面がちょいちょいあったので、備忘録を兼ねて。

# そもそも0埋めとは
(桁数を揃えるため)、桁数に足りない部分を0で埋めること。一般的には数値に適用することが多いが、アルファベット交じりの文字列に使うケースもある。気持ち悪いけど。

# 0埋めの方法
## 方法1.TEXT関数を使用
### 1-1.ノーマルな方法
一番手っ取り早いのは、TEXT関数で強制的に書式変換してしまう方法。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656619/fc15df35-f3db-1ca2-92de-610d432244ec.png)

TEXT関数の第1引数に0埋めしたい数値を指定して、第2引数に0埋めした後の桁数だけ0を並べる。(ダブルクォーテーションで囲むのを忘れずに!!)

### 1-2.ノーマルな方法+α(REPT関数の使用)
ノーマルな方法は簡単だが、桁数が多くなると0を何回打ったかがよくわからなくなる。
また、後からファイルを見た後に「あれ、これ何桁だっけ?」とぱっと見でわからなくなることがある。
それを改善する方法が**REPT関数**。

REPT関数は、文字列を複数回繰り返せる（REPeaTだからREPT関数なんでしょう）。具体的にはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656619/689b973e-1d5d-a4f0-690f-7194f521a2b3.png)
上の関数だと「やっほー」を3回繰り返すようになっている。

これを1-1の第2引数に使うことで、「0を何回繰り返したか」が一目瞭然となり、可読性が上がる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656619/94a60c0e-7db1-68c0-c305-f1c31b7808f7.png)

### 方法2.RIGHT関数を使う方法
方法1のほうがスマートだが、方法1では「アルファベット交じりの文字列」に使うと正しく処理されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656619/413e973a-c975-7aa5-f162-5dec347c2feb.png)
TEXT関数の書式設定は、上記の場合だとあくまで「数値」の書式を変換するものなので、「文字列」だと何も起こらないことになる。

この場合は発想を変えて、「頭に0を埋められるだけ埋めて、必要な桁数を取り出す」という処理を行うことで解決する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656619/9b30ba90-bdf0-6871-61b2-086a8f24dda2.png)
n桁の文字列にしたい場合は、(空白の場合も想定して)0をn個並べた文字列を左から結合することで、必ずn桁以上の文字列になるので、それをRIGHT関数で右からn桁取り出すことによって0埋めした文字列が作られる。

もちろん、0をn個並べるのは1-2で使ったREPT関数を使ってもOK。
【小ネタ】vim の :set paste でインデント崩れしない貼りつけ


# vim で コピーしたコード貼りつけすると、インデントが崩れる
vim でコピペしたコードをペーストすると、インデントが崩壊することがある。
以下は「[AMIやスナップショットを AWS CLI で一気に削除する](https://qiita.com/emiki/items/aff90225cded4423d5cb)」で使用したシェルスクリプトの例だが、

```shell:sakujo_AMI.sh
#!/bin/bash
# 設定ファイル
ami_list=sakujo_AMI_list.txt
# 日付時刻を文字列にする
jikan=`date +"%Y-%m%d-%H%M-%S"`

# profile
profile_name=<設定したプロファイル名>
# 意図したIAMユーザか確認
aws sts get-caller-identity --profile $profile_name

while read row
do
  echo ":::::::::::::::::::::::::::delete this ami ${row}" >> log/ami_all_log_$jikan.txt 2>&1
  aws ec2 deregister-image --image-id ${row} --profile $profile_name >> log/ami_all_log_$jikan.txt  2>&1
  if [ $? -ne 0 ]; then
    echo ${row} >> log/ami_error_${jikan}.txt
  else
    echo ${row} >> log/ami_ok_${jikan}.txt
  fi
  echo ":::::::::::::::::::::::::::end" >> log/ami_all_log_$jikan.txt  2>&1
sleep 3
done < ${ami_list}
```
これをコピーし Vim で貼りつけすると、以下のようにインデントが崩れてしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/a408e5a2-8eea-406a-cf85-93602f9f38cf.png)

# `:set paste` でインデント崩れしないで貼りつける
ノーマルモードから`:set paste`で貼りつけモードにすることで、インデント崩れしないで貼り付けできる。

ノーマルモードで`:set paste`↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/0f15eb7a-8366-a06b-4e96-4ddace7efb64.png)

`i` をクリックして編集モードに移行する。  

コピーしておいたコードを貼り付ける↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b5fd61fd-3371-78b4-ee8d-1c3a75959b89.png)

`esc`でノーマルモードに戻る↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/e2c7325f-d474-005f-b6fc-c31632f3407e.png)

`:wq`で保存して閉じる↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/63c3ace8-9397-9676-714c-c86dc9c39bf6.png)

# 参考
https://reasonable-code.com/vim-set-paste/

https://qiita.com/gorilla0513/items/e8ccb15bfc87e7ed8d5b
雪豹でgithub

以前ビルドした[雪豹のgitコマンド](https://qiita.com/yamori813/items/cff6a8d9dedcd9edcced)で、githubにpushできなくなっていたので、対応しました。

```
$ /usr/bin/ssh -T git@github.com
no matching mac found: client hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96 server hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512,hmac-sha2-256
```

現在のgithubはsshでの処理しか出来なくなっており、今回はsshが対応から外れてしまったようなので、opensshもビルドしました。これに合わせて、opensslを1.1系にしました。

現在の構成は

openssl-1.1.1o
curl-7.83.0
openssh-9.0p1
git-2.16.2

です。

opensslのヘッダーとライブラリのパスが変わっていましたが、とくに問題なくビルドできました。

/use/localの古いファイルはinstall前に消しておいたほうが良いです。

本来この作業はAppleのエンジニアがやるべき事です。Appleさんお駄賃くれませんか？

ちゃんとgit pushできました。私はgithubはバックアップだと考えています。

ed25519キーも使えるようになります。

雪豹のccはgcc 4.2.1です。

まだまだ雪豹現役です。
Mac で Homebrew を使わずに FFmpeg を使う

以前「Mac で Homebrew を使わずに ImageMagick を使う」という記事を書いたが、今回はそれの FFmpeg 版。
やっていることは同じ。

https://qiita.com/hoto17296/items/2a89ac94ca9128b70a51

## 初期設定
FFmpeg が使える Docker イメージを作る。

``` Dockerfile:Dockefile
FROM debian

RUN apt-get update && apt-get -y install ffmpeg

ENTRYPOINT ["ffmpeg"]
```

``` console
$ docker build -t ffmpeg .
```

適当に `ffmpeg` という名前でビルドしているがそこはお好きに。

## 使う
例として、wav ファイルを mp3 ファイルに変換してみる。

``` console
$ docker run --rm -v "$(pwd)":/mnt -w /mnt ffmpeg \
    -i input.wav -vn -ac 2 -ar 44100 -ab 192k -acodec libmp3lame -f mp3 output.mp3
```

注意点として、ホストの作業ディレクトリをマウントしているので、ホストの親ディレクトリのパス指定や絶対パス指定は使えない。

## エイリアスを設定する
毎回 docker コマンドのオプションを入力するのは面倒なのでエイリアスを設定して簡単に使えるようにする。

``` sh:~/.zshrc
alias ffmpeg='docker run --rm -v "$(pwd)":/mnt -w /mnt ffmpeg'
```

エイリアスを設定すると、先ほどの例はこのように実行できる。

``` console
$ ffmpeg -i input.wav -vn -ac 2 -ar 44100 -ab 192k -acodec libmp3lame -f mp3 output.mp3
```
ID を持つエンティティにはIdentifiableを積極的に採用

## before
```
struct User: Decodable { 
  let id: Int
}

struct UserDataSource {
  // 引数はIntであればなんでも受け入れるように見えてしまう。 
  func loadUser(for id: Int) -> User {
  // 本来はDBなどから取得したものを返すなど
   } 
}
let user = UserDataSource().loadUser(for: 1)
```

## after
```
struct User: Decodable , Identifiable { 
  let id: Int
}

struct UserDataSource {
   func loadUser(for id: User.ID) -> User {
          // DBなどから取得したものを返すなど
   } 
}
alter tableで項目の属性を変更する

## 環境
Ubuntu 20.04
PostgreSQL 9.5.25

## はじめに
システムを稼働させて約３年。いままで大きなトラブルに見舞われることなく安定稼働し続けていた。そして、これからも安定稼働し続けるものだと思われた。が、しかし、突如！、テーブルの更新時に、項目の桁数が少ないといったエラーが発生した。テーブル設計時に想定していた項目の桁数よりも、桁数の大きいデータが発生したのが原因であった。そこで、ALTER TABLEコマンドを利用して、桁数を変更することにしたため、やったことを記事にしました。やったことはいたって簡単なことです。ALTER TABLEコマンドを１つ実行するだけです。psqlコマンドを利用せずに、pgAdminを使っても、項目の修正はおこなえます。しかし、今回は、psqlコマンドを利用することにしました。

## やったこと
PostgreSQLにログインします。カーソルが、**#** に変化すれば、ログイン成功です。
```
$psql -h [サーバーのIP] -d [データベース名] -U [ユーザー名]
```

テーブルの一覧を表示させて、修正をおこなう対象のテーブルを確認します。
```
\dt
```

現在のテーブル定義を確認します。テーブル名はダブルコーテーションで括らないといけないところが注意点です。
```
\d "テーブル名"
```

修正する対象の項目定義は、**character varying(20)** になっていました。20桁では少なかったようです。30桁に拡張します。
```
#ALTER TABLE "テーブル名" ALTER COLUMN "項目名" TYPE character varying(30);
```

psqlを終了します。
```
\q
```
Spring Security備忘録2

# 20220503
bcrypt
lombok
セキュリティ設定
	antMatcher("/**").permitAll()…一項目で指定したパスに関してすべてのアクセスを許可
	anyRequest().authenticated()…↑以外のすべてのアクセスを制御する
	defaultSuccessUrl("/**")…ログイン成功後、/**に遷移する
	logoutRequestMatcher(new AntPathRequestMatcher("/**")…ログアウト後遷移画面のURLを/**にする
userDetailsのフィールド名はgetterにしたがう。（getUsername->username）

###### 〇userDetailsService実装クラスで、クライアントからリクエストされたユーザ情報について
DBから情報探して、userDetails実装クラスに格納する。実際にユーザ情報を探してくるのはloadUserByUsernameメソッド
ちなみにuserDetails内に格納されたデータをモデル化するuserクラスは実装不要？
DaoAuthenticationProviderは自動的に実装されるとのことだったのでこいつも？

###### 〇RequiredArgsConstructor
Lombokアノテーション？
コンストラクタにfinalフィールドを自動セット

###### 〇発生エラー
DBアクセス権限の拒否
【対応策】
・コマンドプロンプトにてアクセスユーザーの削除、再作成
・application.propertiesにてjdbcドライバーの記述を追加
・MapperのXML記法からLombokのアノテーション記法へ変更

シンタックスエラー
【対応策】
・INSERT文の末尾に;追加

DBの抽出データ重複
【対応策】
・CREATE文の前にDROP TABLE文記述してTABLEを初期化
これについては、DBのアクセス回数の増加等、改善の余地あり（別の書き方）


###### 〇GetMappingとRequestMappingの挙動について
ログイン後画面についてGetMappingによるセキュリティ有画面遷移がうまく作動しなかった
→RequestMappingに変更したところ正常作動確認。

# 20220504
###### 〇そもそも論、XML記法同様、MapperにLombokのアノテーション付与してSqlべた書きでServiceで呼び出せば使えるんじゃ？

MapperにSerectアノテーションからのSQL文記述でデータ抽出可能
さらに抽出したデータをList形式で格納し、コントローラでビューに渡して、th:eachで回すと
いつも通り表示させれる。

###### 〇schemaに書いたCREATE　TABLEについて
新たにTABLE作成したい場合は随時書き足していく感じ？
セキュリティを効かせる必要のないTABLEはコマンドプロンプトべた書きでよい？

###### 〇GetMapping→PostMappingではURLの認識がなされず。。。
むしろGetMappingで認証成功！
RequestMappingにおけるmethod=RequestMethod.GETなので当然RequestMappingでも動く

###### 〇schema.sqlでユーザ、パスワード以外の要素を追加。以下に対応できるような要素を追加。
1.簡単な計算をさせる
2.取得した日付を表示（加工も？）
→
→
2.登録した日付を表示することに成功。
気づきとして、いままでXMLとMapperで抽出したデータをドメインパッケージクラスのInfoに格納する
際にInfoのフィールドはDBと同等のフィールド名を記述しておけば問題なかった。
しかしLombokアノテーション記法でsqlをXMLを使わずMapperに直接記述する方法では、
フィールド名とDBのカラム名を100％一致させる必要がある模様。
特にDBのカラムは一般的にアンダーバーを使用するためフィールド名＆Getter等の命名に注意。
フィールド名にアンダーバー使用するのは違和感があるけど個人開発の面では特に気にする必要はない？
アンダーバー使用の違和感とXMLとmybatisの設定記述の手間を考慮するとLombokのが楽。


# 20220505
###### 〇login中のユーザー情報を取得するには、Authenticationクラスのgetter？を使用
getName
getPassword
など

###### 〇configでのLogout実装
logout()またはlogoutUrl("任意のURL")を定義すると、
/logoutまたは/任意のURLがマッピングされた段階で自動でログアウト。
ボタン押下での画面遷移を実装したい場合は、ボタンsubmitでth:formactionでマッピングさせたいURLを定義する

例）Controller -> @RequestMappig(value="list",params="regist")
    Themeleah -> <input type="submit" th:formaction="@{/list}" name="regist"/>
MacOS Montereyでesp32に書き込みできない問題

# MacOS Monterey以上でesp32に書き込みできない問題

## はじめに

macOS Montereyではpythonが標準でインストールされていないためArduinoIDEを利用してのesp32への書き込み時にエラーが発生するようになってしまいました。
元々python2系が入ってたMacOSをアップデートしたなら今まで通り書き込みできるはずですが、新しくMacを購入してArduinoIDEを入れてesp32への書き込みでエラーが起きた人向けの記事です。

ただこの方法でApple SiliconのMacでも問題が解決できるかは検証していないのでその辺は適宜自分の環境に合わせて変換して読んでください。

### 自分の環境

MacBook Pro（15-inch, 2016）
macOS Monterey バージョン12.3.1
Python 3.9.7
ArduinoIDE 1.8.19

## エラー内容

esp32系のチップを積んだマイコンに書き込みを行う、またはesp32系のチップをボードで選択した状態で検証を行うと

exec: "python": executable file not found in $PATH
ボードM5Stack-ATOMに対するコンパイル時にエラーが発生しました。

というエラーが発生する。
直訳すると実行可能なpythonファイルがパスに存在しませんというエラーを伝えてくれてる。
これはmacOS Montereyからpython2系がデフォルトインストールされなくなったからこんなエラーが起きてしまっている。
おそらくpython2が2020年1月でサポート終了したことでこうしてるんだと思うが、それを知らずに標準の設定で書き込もうとするとpython2系をコンパイルに使用しているArduinoIDEとしてはこのままでは困るので設定を変更していきます。

# 設定

ターミナルからArduinoに入る
大抵の人はアプリケーションに入れてると思うので以下を実行
```
cd ~/Library/Arduino15/packages
```
入ったら以下を実行
```
ls
```
すると追加したボードの一覧が出てくるのでコンパイル時にエラーの出てたボードに移動。
今回の例ではｍ5stackを使いますがesp32でもやることは変わりません。
esp32　dev Moduleとかに設定したい人はm5stackの部分をesp32に替えて実行すること
```
cd m5stack/hardware/esp32/2.0.2
```
もし2.0.2ってディレクトリがesp32内に存在していない場合追加のボードマネージャーのURLが古い可能性があるので最新のものを追加してください。最新のにしたらボードマネージャーでの更新も忘れずに
2.0.2のディレクトリに入ったら、以下を実行
```
nano platform.txt
```
するとエディタが開いて
```
tools.gen_esp32part.cmd=python "{runtime.platform.path}/tools/gen_esp32part.py"
```
という行があると思うのでこれを
```
tools.gen_esp32part.cmd=python3 "{runtime.platform.path}/tools/gen_esp32part.py"
```
とpython3を参照するようにしてあげる。
編集が終わったらcontrol＋ｘで編集を終了してｙで保存。nanoエディターの使い方がわからない人はちょっと調べれば終了方法、保存方法が出てくるので調べてみてください。

ここまでできたら　ArduinoIDEを再起動して再度コンパイルしてみるとさっきまでエラーのでてたボードに書き込みができるようになってると思います。

# おわりに
もらったMacBookでesp開発して遊ぼうと思ったら、書き込みが出来なくて放置して他ので同じような問題でハマってた人の参考になれば
意味わからんとこあったらコメントください。
Xcode13でipaファイル作成時にビルド番号が勝手に変更される。

Manage Version and Build Numberという機能が追加されており、ipaファイル作成時にビルド番号が勝手に採番され、App Store Connectにアップロードする際齟齬が起こらないようにしてくれる。ただ、デフォルトでONになっているので、知らないと、なぜかビルド番号が勝手に変更されていることになり混乱することになる。

参考：

[【Xcode 13】アーカイブ後にバージョンとビルド番号を更新できるようになってた](https://goropocha.hatenablog.com/entry/2021/12/20/210000)
[Apple Xcode13 Release Note](https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes)
> When uploading an app to App Store Connect, the distribution assistant in Xcode detects whether your app has a valid build number (CFBundleVersion). If your app has an invalid number (like one that was used previously, or precedes your current build number), the distribution assistant provides an option to automatically increment it to a valid number. In addition, the distribution assistant ensures that the build numbers of all embedded content in your app (such as app extensions, App Clips, or watchOS apps) are in sync with your app. Note that this doesn’t modify your source code or your archive; Xcode updates the build number in a staged copy of your app before packaging and uploading it to App Store Connect. (59826409)

### OFFにするには
#### 手動
以下のManage Version and Build Numberのチェックを外す。
![スクリーンショット 2022-05-06 16.42.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392332/76eb5696-b55e-8e61-826b-e665a3ff3244.png)
#### 自動
xcodebuildコマンドを使っている場合は、`xcodebuild -h`に記載がある通りで、export optionsに以下を渡す。
`manageAppVersionAndBuildNumber`: `NO`
StripeのPayment Linksで、メールアドレスを事前入力できるようにする

通販やメディアサイトなど、会員機能を持つアプリケーションで決済機能を組み込む場合、Payment Linksを利用すると「メールアドレスの二重入力」が発生します。

StripeのPayment Links / Checkoutでは、メールアドレスの入力が必要です。
が、会員システムを持つアプリケーションでは、顧客はすでにメールアドレスをアカウント作成時に入力しています。

そのため、Payment Linksを利用した支払いリンクをそのまま組み込むと、決済時にもう一度メールアドレスの入力を要求されてしまいます。

この状況を解決するのに利用できるのが、`prefilled_email`クエリパラメータです。

## 支払いリンクに`prefilled_email`クエリでメールアドレスを追加する

通常の支払いリンクは、`https://buy.stripe.com/test_xxx`のような形です。

ここに`prefilled_email`クエリを追加しましょう。

`https://buy.stripe.com/test_xxxx?prefilled_email==test%40example.com`

このアドレスにアクセスすると、決済ページのメールアドレスが入力済みの状態に変わります。

![スクリーンショット 2022-05-06 16.37.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/b0d11ba0-4d67-f794-a5ba-2c54cd8abe02.png)

これによって、顧客に再度メールアドレスの入力を求める必要がなくなります。

## メールアドレスはエンコードして渡そう

JavaScriptなどでリンクを動的に生成する場合、メールアドレスはエンコードして設定しましょう。

```js
    console.log({
      url: `https://buy.stripe.com/test_xxxx?prefilled_email=${encodeURIComponent('test+123@example.com')}`
    })
```

## メールアドレスは変更できることに注意

Webhookなどを利用して、メールアドレスから顧客データを取れるようにしたい場合、「顧客がメールアドレスを変更する可能性がある」ことに注意しましょう。

事前に入力`prefill`するだけのクエリですので、クエリに設定したアドレスで注文されるとは限りません。

もし追跡を行いたい場合は、`client_reference_id`クエリを追加で設定することをおすすめします。

https://qiita.com/hideokamoto/items/f4dc308337b0ba6e57bd


# [PR] Stripe開発者向け情報をQiitaにて配信中！

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について週に２〜３本ペースで更新中です。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)


https://stripe.com/docs/payments/payment-links#url-parameters
【COBOL】COBOLでFIZZ BUZZ

# コード
久々にCOBOLを書いてみました。やっぱり冗長ですね
```php
IDENTIFICATION DIVISION.
PROGRAM-ID. HELLO.
DATA DIVISION.
  WORKING-STORAGE SECTION.
    01 CNT PIC 9(3)                  VALUE 0.
    01 DUMMY PIC 9(01)               VALUE 0.
    01 AMARI05 PIC 9(03)             VALUE 0.
    01 AMARI03 PIC 9(03)             VALUE 0.
PROCEDURE DIVISION.
    PERFORM 100 TIMES
        ADD  1 TO CNT
        DIVIDE 5  INTO CNT GIVING DUMMY REMAINDER AMARI05
        DIVIDE 3  INTO CNT GIVING DUMMY REMAINDER AMARI03
        EVALUATE TRUE         
            WHEN AMARI05 = 0 AND AMARI03= 0      
              DISPLAY "FIZZ BUZZ"
            WHEN AMARI03 = 0                
              DISPLAY "FIZZ"
            WHEN AMARI05 = 0                
              DISPLAY "BUZZ"
            WHEN OTHER                
              DISPLAY CNT
        END-EVALUATE
    END-PERFORM.
```
```php
IDENTIFICATION                   DIVISION.
PROGRAM-ID.                      TEST.
DATA                             DIVISION.
WORKING-STORAGE                  SECTION.
01 CNT PIC 9(3)                  VALUE 0.
01 FIZZ PIC 9(01)                VALUE 0.
01 BUZZ PIC 9(01)                VALUE 0.
PROCEDURE                        DIVISION.
    PERFORM 100 TIMES
        ADD 1 TO CNT
        COMPUTE FIZZ = FUNCTION MOD(CNT 3)
        COMPUTE BUZZ = FUNCTION MOD(CNT 5)
        EVALUATE TRUE         
            WHEN FIZZ = 0 AND BUZZ = 0              
              DISPLAY "FIZZ BUZZ"
            WHEN FIZZ = 0                
              DISPLAY "FIZZ"
            WHEN BUZZ = 0                
              DISPLAY "BUZZ"
            WHEN OTHER                
              DISPLAY CNT
        END-EVALUATE
    END-PERFORM.
```
有限な無限スクロールページをスクレイピングしたかった

### あらすじ
今回スクレイピングしたいサイトがスクロールバーを
ある程度下まで下げると、まだ読み込まれていない
コンテンツが出力される無限スクロールページだった。

対象データは約3万件。
最下端まで手動で手動でたどってHTMLから抜き出すのも
良いといえば良いけどそんなにヒマではない……

そんなこんなで、Google先生に伺ったところ
下記がヒットしたので備忘で押さえておきたいと思った次第。

### 下端が存在する無限スクロールを自動化
```Python:有限な無限スクロール対策
def endlessScroll():
    # 対象ページにアクセス
    driver.get(targetURL)

    # アクセスできたらとりあえず、全部スクロール
    sleep(3)
    # 現在のウィンドウの高さを取得
    winHeight = driver.execute_script("return window.innerHeight")

    # スクロール開始位置の初期化
    lastTop = 1

    # 無限スクロールページの最下部までループ
    while True:
        # スクロール前のページの高さを取得
        lastHeight = driver.execute_script("return document.body.scrollHeight")

        # スクロールの開始位置を設定
        top = lastTop

        # 最下部まで徐々にスクロールする
        while top < lastHeight:
            top += int(winHeight * 0.8)
            driver.execute_script("window.scrollTo(0, %d)" % top)
            sleep(1)
        
        # スクロール後のページの高さを取得
        sleep(1)
        newLastHeight = driver.execute_script("return document.body.scrollHeight")

        # スクロール前後で高さに変化がなくなったら終了
        if lastHeight == newLastHeight:
            break

        # ループが終了しなければ現在の高さを再設定して次のループ
        lastTop = lastHeight
```

流れとしては、
1. 起動しているブラウザのスクロールバーの長さを取得
1. 現在の下端付近(サンプルでは80％地点)までスクロールを実施
1. サイト側で無限スクロールのメソッドが実行される
1. 1-3を繰り返すと最下端に到達するので、到達した時点で終了

あとはいい感じに情報をいただいてミッションコンプリート……
わざわざ張り付いてENDキーを延々と押し込む作業から解放されました……
良かったよかった( ˘ω˘ )
※ 都度sleepとか入れてるけど、丸コピだと動かないので
　 必要なモジュールは都度importしようね。

### 感謝
[見てみて！Python＋Selenium で無限スクロールページを自動スクロールする](https://www.sukerou.com/2021/09/pythonselenium.html)
めっちゃ助かりました。感謝です。
パスの指定の仕方

基本的な知識。
なんだかんだ忘れそうな気もするのでメモ書き投稿。

<h3>パスの指定について</h3>
何かの理由でパスを指定するとき三種類の指定の仕方が存在する。
<h4>①相対パス</h4>
これは一般的に開発現場では使われない。
なぜなら、何らかの理由で自身のディレクトリ構造が変更となった場合、プログラムのソースも変更しなければならず、手間がかかってしまう。


<h4>②絶対パス（フルパス）</h4>
「https://～末尾まで」すべて記述するやり方。
これなら、上述したディレクトリ構造の変更に影響を受けない。
ただし、やや冗長になってしまうという部分はある。

<h4>③絶対パス（ドメイン省略）</h4>
これが最も有効な手段。
ドメイン名を省略することで、例えばドメイン名の変更があっても影響を受けず、
さらに②と比較すると文字量も減る。

<hr>

以上。
PHPでStannumを使って超簡単にValue Objectを作る

おはようこんにちはこんばんは。

さて、今回は自作したライブラリの宣伝にはなってしまいますが、Stannumというライブラリを使って、便利に使える値オブジェクト(Value Object)を簡単に作る方法を紹介したいとおもいます。

ライブラリ本来の使い方からは少し逸れますが、ライブラリのクラスでスカラー型をラップするという性質を利用して、そのクラスを継承してValue Objectとして活用しました。

## 導入
他のライブラリ同様、いつも通りcomposerから入れてあげます。

```bash
composer require tumugin/stannum
```

https://speakerdeck.com/tumugin/phpfalsesukaraxing-wokurasuderatupusitebian-li-nishi-eruyounisururaiburari-stannum-wozuo-tutahua

Stannumの紹介については、上のスライドを見ていただけると分かりやすいと思います！

## Value Objectを作る
今回は試しにユーザの苗字(Last Name)を表現するValue Objectを作ってみます。

```php
use Tumugin\Stannum\SnString;

class UserLastName extends SnString
{
}
```

必要があれば `byString` 関数などをオーバーライドすることで、中身を検証してからインスタンスを生成するようにしましょう。

```php
use Tumugin\Stannum\SnString;

class UserLastName extends SnString
{
    public static function byString(string $value)
    {
        if (SnString::byString($value)->trim()->equals('')) {
            throw new \RuntimeException('苗字は空に出来ません');
        }
        return parent::byString($value);
    }
}
```

生の値からのインスタンスの生成は、継承元のクラスに生えている`byString`,`byInt`,`byFloat`関数が使えるので、そちらを使います。

```php
UserLastName::byString('藤宮');
```

## 数値型ももちろん...?
```php
use Tumugin\Stannum\SnInteger;

class UserReactionCount extends SnInteger
{
}
```

文字列型と同様に作ることが出来ましたね！
Datadogのイベント監視の仕様変更のためのterraformテンプレート更新

表題の通りの備忘録です。

詳しい内容は以下(日本語情報は古いので英語をブラウザ翻訳推奨）
https://docs.datadoghq.com/events/guides/migrating_to_new_events_features/

新しいイベントエクスプローラーと分析にアクセスできるようになるがそれに伴いイベント監視のクエリの書き方が変わるため、APIで監視テンプレートでリポジトリ管理してる、要はTerraform使ってるとqueryの修正が要るという話です。
4月末にはdatadog側が勝手に更新してくれるようなのでテンプレート修正は6月末までに対応してねという感じの通知内容だったかと思います。

#### 修正方法
１．モニタ詳細のWeb画面の歯車マークからExportを押してjsonを表示させて見比べてterraformテンプレート側に修正を入れる（この時モニタのIDが新しいものになってるはずなので控えておく）

２．stateファイルから古い管理情報を`state rm`サブコマンド指定で消して、さっき控えておいた新しいIDを用いて新しいモニタの管理情報を`import`サブコマンドを使って取り込む

```shell:参考
$ terraform state rm 'datadog_monitor.event_monitor_die'
$ terraform import -var-file=terraform.tfvars datadog_monitor.event_monitor_die 68602xxx
```
※対応した環境のterraformのバージョンは1.04

３．planを打ちながらエラーが出なくなるまで差分を吸収するようterraformテンプレート側を修正してNo changesが出たらリポジトリにコミットして完了（applyはしない）

参考までに修正した一部の画像が以下。
![image-dd-mon-oom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25031/60e482b5-1f39-2df9-c3be-f6b414d65341.png)

以上です。
HTTPS に対応している vue-cli のバージョンアップで沼にハマった

# 概要
10年ぶりくらいに、フロントエンドに専念することになって、新規サービスを立ち上げた当初の vue-cli をバージョンアップしたら見事に沼にはまったので、備忘録がてらハマった内容と対応策を記事にまとめておく

# vue-cli のバージョンアップ
vue-cli を 4.5.0 → 5.0.4 に upgrade した
ドキュメントどおりに素直に
```
$ vue upgrade
```
を実施

# 何が起きたか
## 1. https options は deprecated だぜって言われる
アプリケーション起動時に下記のようなメッセージが表示された
```
(node:73202) [DEP_WEBPACK_DEV_SERVER_HTTPS] DeprecationWarning: 'https' option is deprecated. Please use the 'server' option.
```

アプリケーションは動作しているが、deprecated なのは気になるので対応したい
その時の vue.config.js はこんな感じ
```js
module.exports = {
  ...,
  devServer: {
    https: {
      key: fs.readFileSync('/path/to/key.pem'),
      cert: fs.readFileSync('/path/to/cert.pem'),
    },
  },
};
```

## 2. server option に移行させると insecure な WebSocket だって言われる
`use the 'server' option.` って言われているので、server option に https 対応を移行させる
```js
module.exports = {
  ...,
  devServer: {
    server: {
      type: 'https',
      options: {
        key: fs.readFileSync('/path/to/key.pem'),
        cert: fs.readFileSync('/path/to/cert.pem'),
      },
    },
  },
};
```
これで、アプリケーションを起動すると 1. と同じようにアプリケーションは起動するが、ブラウザ側で下記のようなエラーメッセージが出力されて何も動かない状態に。。
![スクリーンショット 2022-05-06 16.17.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55420/9db71c1c-a598-2f71-3180-133baa130395.png)

WebSocket なんて聞いてないぞ。。

## 3. WebSocket の client option を追加
分からなすぎて、vue-cli の migration guide を一通り読んで見たところ、WebSocketに関連する option を発見したので追加してみた
https://github.com/webpack/webpack-dev-server/blob/master/migration-v4.md

```js
module.exports = {
  ...,
  devServer: {
    host,
    port,
    server: {
      type: 'https',
      options: {
        key: fs.readFileSync('/path/to/key.pem'),
        cert: fs.readFileSync('/path/to/cert.pem'),
      },
    },
    client: {
      webSocketURL: {
        hostname: host,
        port,
        pathname: '/ws',
      },
    },
  },
};
```
host, port は devServer と同じものを指定
この client option を追加することで、WebSocket の問題も解決し、https option の deprecation も解決した :tada:
Oracle PDBは利用時にはOPENする必要がある

# 現象
Oracleを起動したはずなのに、Sqldeveloperから接続しようとすると「データベースをオープンされていません」「database not open」とエラーが出てしまい接続できないとエラーが出ることがある。
接続の対象がPDBで会った場合には以下の手順でデータベースをオープンすることで現象が解決する。

```bash:エラーメッセージ
リクエストされた操作の実行中にエラーが発生しました:
 
ORA-01109: データベースがオープンされていません。
01109. 00000 -  "database not open"
*Cause:    A command was attempted that requires the database to be open.
*Action:   Open the database and try the command again
ベンダー・コード1109
```

# 解決法
上記のようなエラーが出た場合、PDBをホストするCDBが起動してPDBをマウントだけしている状態である。
まずは、Oracleのホストサーバーを開きDBA権限で接続しよう。

```bash:DBAで接続
sqlplus <user>/<password> AS SYSDBA
```

ここで、PDBのステータスを確認するために以下のコマンドを実行する。

```bash:PDBステータス確認
show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 <PDBNAME>                      MOUNTED
```

読み書きを可能にするには状態を変更する必要があるので、以下のコマンドを実行する。
```bash:alter pdb
alter pluggable database <PDBNAME> open;
```

あるいは、特定のPDBのみを変更するには
```bash:alter specific pdb
alter pluggable database <PDBNAME> open;
```

あらためてステータスを確認して、以下のようになっていればOKである。
```bash:PDBステータス確認
show pdbs
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 <PDBNAME>                      READ WRITE NO
```
Julia: GitLab API の使い方

トークンとプロジェクトID の設定

```text:.env
PERSONAL_ACCESS_TOKEN=glpat-xxxxxx
PROJECT_ID="35195199"
```

プロジェクトのメンバーの取得

```jl:get_members.jl
#! /usr/bin/julia
#
#	get_members.jl
#
#						May/06/2022
# --------------------------------------------------------------------
import Pkg; Pkg.add("HTTP")
using HTTP
using JSON
using DotEnv
# --------------------------------------------------------------------
println(stderr,"*** 開始 ***")
#
DotEnv.config()
token = ENV["PERSONAL_ACCESS_TOKEN"]
project_id = ENV["PROJECT_ID"]
#
limit="?page=1&per_page=10"
url=string("https://gitlab.com/api/v4/projects/",project_id,"/members",limit)
#println(url)
#
headers = Dict()
headers["Content-Type"] = "application/json"
headers["PRIVATE-TOKEN"] = token
#
rr = HTTP.request("GET", url,headers)
println(stderr,rr.status)

array_aa = JSON.parse(String(rr.body))
println(length(array_aa))
for unit_aa in array_aa
	print(unit_aa["id"],"\t",unit_aa["username"],"\t")
	print(unit_aa["name"],"\t",unit_aa["web_url"],"\t")
	println(unit_aa["created_at"])
end
println(stderr,"*** 終了 ***")
# --------------------------------------------------------------------
```

プロジェクトのブランチの取得

```jl:get_branches.jl
#! /usr/bin/julia
#
#	get_branches.jl
#
#						May/06/2022
# --------------------------------------------------------------------
import Pkg; Pkg.add("HTTP")
using HTTP
using JSON
using DotEnv
# --------------------------------------------------------------------
println(stderr,"*** 開始 ***")
#
DotEnv.config()
token = ENV["PERSONAL_ACCESS_TOKEN"]
project_id = ENV["PROJECT_ID"]
#
limit="?page=1&per_page=10"
url=string("https://gitlab.com/api/v4/projects/",project_id,"/repository/branches",limit)
#println(url)
#
headers = Dict()
headers["Content-Type"] = "application/json"
headers["PRIVATE-TOKEN"] = token
#
rr = HTTP.request("GET", url,headers)
println(stderr,rr.status)

array_aa = JSON.parse(String(rr.body))
println(length(array_aa))
for unit_aa in array_aa
	print(unit_aa["name"],"\t",unit_aa["merged"],"\t")
	print(unit_aa["commit"]["author_name"],"\t")
	println(unit_aa["commit"]["created_at"])
end
println(stderr,"*** 終了 ***")
# --------------------------------------------------------------------
```
EC2(Windows Server2019)のホスト名をNameタグの値で起動させる

EC2コンソールでNameタグを設定しても、OS起動してホスト名を変更にしないとサーバのホスト名はEC2のデフォルト値になってしまいます。都度サーバを立てるたびに変更するのは面倒なので、Nameタグ＝サーバーホスト名になる起動テンプレートを作成してみます。ちょっとしたAD設定の検証などでWindowsの方が使うことは多いかもしれませんね。

# 今回のゴール
起動テンプレートを利用して、以下環境が設定済み状態でEC2起動を起動できるようにする


### AWS環境

 ・指定VPC内の所定のサブネットにデプロイ
 ・グローバル（パブリック）IPを付与
 ・指定AMI（Windows Server2019 JPN）を利用
 ・インスタンスタイプをスポットインスタンスに指定

### OS環境

 ・ホスト名をNameタグに設定した内容に変更する
 ・タイムゾーン、言語を日本仕様に設定
 ・"administrator"ユーザのパスワードを指定したものに設定



# 作業の流れ


①VPCとサブネットおよびセキュリティグループを作成
②起動テンプレートを作成
③EC2の起動・デプロイ
④設定の確認

# 実際の設定
まず①ですが、この作業は各所に詳しい記事がありますので、本記事では割愛します。一般的にEC2をデプロイして、SSHで接続できる環境であれば問題ありません。起動テンプレートの設定もこの記事（https://qiita.com/u-bayashi/items/a5ab6c7e045cad0f5948） とほぼ同じ設定でOKです。
一部違うところがあるので、以下のようにしてください。


■AMIを選択する際に、「クイックスタート」の「Windows」を選択するとＯＳが英語版になるので、「その他AMI」から日本語版を選択してください。
![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/9cf4871d-4290-b642-4e8f-80e5ef9d96f1.png)

![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/c11603fe-316b-0606-cde2-1e852b76b981.png)

■「メタデータのタグを許可する」を有効化してください。なんとなく分かりにくい表現ですがEC2からタグデータ参照する許可を設定しています。

![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655033/54360188-42aa-7c10-5a4f-b1af2a627857.png)

■「ユーザデータ」のところに以下のスクリプトを記述してください。先頭と最後にスクリプトがpowershellであると宣言を入れるのを忘れずに。

記載するスクリプト内容は以下になります。

     <powershell>

     #administratorのパスワード変更
     net user "administrator" "XXXXXX（administratorのパスワード）"

     #タイムゾーンを日本時間の設定
     Set-TimeZone -id "Tokyo Standard Time"

     #ロケーションを日本に設定
     Set-WinHomeLocation -GeoId 122

     #インスタンスメタデータを使って「タグ」の設定値を参照する
     $token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
     
     #インスタンスメタデータを使って「タグ」の設定値を参照し、変数(compname)に設定する
     $compname = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/tags/instance/Name

     #ホスト名を変更（強制）
     Rename-Computer -NewName $compname -Force

     #再起動
     Restart-Computer

     </powershell>

最後の④ですが「テンプレートから起動」でEC2を起動させればOKです。通常ならリモートログインする初期パスワードは秘密鍵を複合しないといけなかったですがスクリプト内でadministratorのパスワードを変更しているので、秘密鍵の複合なして、指定パスワードでログインできます。

ついでに初期起動時にGoogle chromeもインストールしておきたい場合は上記スクリプトの中に以下を追記してください。

    $Path = $env:TEMP; $Installer = "chrome_installer.exe"; Invoke-WebRequest "https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26browser%3D0%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26brand%3DGTPM/update2/installers/ChromeSetup.exe" -OutFile $Path\$Installer; Start-Process -FilePath $Path\$Installer -Args "/silent /install" -Verb RunAs -Wait; Remove-Item $Path\$Installer


# おわりに
自動化、テンプレート化の大切さが身にしみる（笑）不慣れな人でも一発で環境を作れるのは素晴らしいd(`・ω・’)

# 参考にしたページ

[[アップデート] EC2のインスタンスメタデータから「タグ」の設定値を参照できるようになりました！](https://dev.classmethod.jp/articles/get-ec2-instance-tag-from-instance-metadata/)
[【PowerShell】10秒で終わるWindowsの地域やタイムゾーンの設定変更](https://blog.serverworks.co.jp/powershell-change-timezone-and-region)
[コマンドでWindowsにChromeをインストールする](https://qiita.com/Arahabica/items/04f8469842f29550b831)
SQL Server LocalDBを利用する

# LocalDBとは？
SQL Server LocalDBはSQL Server Expressのオプションとしてインストール可能なコンポーネントで、ローカルでのテスト用にインストールすることが可能である。

# SQL Server Expressとの違いは？
単一のDBしか動かすことができないが、実行時にデータベースファイル(mdfファイル)を指定することができるため、単体テスト用のDBを配布できることが特徴。

# インストール方法
前述したとおり、SQL Server Expressのオプションとしてインストールするほか、Visual Studio 2019のインストール時に「 ASP.NET と Web 開発」のワークロードを選択していれば、機能の一部としてインストールされる。

追加でインストールする場合は、以下のようにVisual Studioインストーラーから個別コンポーネントとして選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/d5449fc7-8bf9-d9de-5661-28482f7788c9.png)

また、以下の場所からインストーラーをダウンロードすることも可能。
https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/sql-server-express-localdb?view=sql-server-ver15

# 接続方法
SQL Server Management Studio(SSMS)から接続可能。有効なインスタンス名はコマンドプロンプトでsqllocaldb infoと打ち込むと確認することができる。以下の例ではMSSQLLocalDB

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/fb7d156f-8726-1917-9831-b22d8043edeb.png)

SSMSの接続画面では、(SQL認証を利用する場合)上記のインスタンス名を用いて以下のように指定すればよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/c5762248-53d3-e8d5-0e01-c0581363bdc8.png)

なお、最初はsaユーザーが無効になっている場合があるので、saユーザーを利用する場合は「セキュリティ」→「ログイン」でsaユーザーを選択し、ログインを有効化する必要がある場合がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/484026/6ff5b1fa-201d-4030-1a18-47c9c16034a3.png)

# DBのデタッチとアタッチ
LocalDBで利用しているデータベースをSQL Serverからデタッチしたい場合は、SSMSでデータベースを右クリックから「タスク>デタッチ」で行うことができるが、再度アタッチする場合にはSSMSからだとデータベース名をうまく復旧できないケースがあるので、以下のコマンドラインをSSMSで実行したほうが確実である。

```sql:デタッチアタッチ
CREATE DATABASE MyAdventureWorks  
    ON (FILENAME = 'C:\MySQLServer\AdventureWorks_Data.mdf'),  
    (FILENAME = 'C:\MySQLServer\AdventureWorks_Log.ldf')  
    FOR ATTACH;
```
この際、ログファイルの指定はなくても大丈夫である。
AWS Amplifyを利用した自動デプロイ【CI/CD】

CI/CDという単語をよく聞くようになって概念から便利なのは想像つくけど、実際どう便利なのか知りたくてAWSのAmplifyを利用して自動設定をしてみました。

あとは備忘録兼ねてね

# 設定方法

Amplifyで新規アプリケーション作成をする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/2ce2cda6-6fff-e37a-4041-5058ab6a50a8.png)

次に対象のリポジトリを選択するのですが、「私はあれこれあってCodeCommite」にしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/14a78100-cf4f-47b4-c33a-4824140d9b59.png)

リポジトリ・ブランチを選択して(既にテストしたリポジトリなので怒られました。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/6994fa40-805e-2149-2295-2bef64edb082.png)

構成の設定、ここは特にいじってないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/24ba7a55-d3cb-3f14-25a1-22de0f3254a1.png)

確認画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/a37aaf6d-17db-bae8-ab5d-f26a06242460.png)

あとは放置したら完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269756/bdd7cbcb-ee0c-9a78-3055-d789b7c7648d.png)

# この後
あとは、gitで対象のブランチにプッシュするだけでドンドン更新されていきます。

# 使ってみて
非常に便利になりました。ちょっとした運用の手数が減った感じです。
Amplifyはこれからも使う予定があるので、便利にしていきたいなと思います。