OmniAICreator/Qiita-1.07M huggingface dataset:
aws configureに、消去したAWSアカウントがdefaultになっていたので修正してみた

## 概要
事の発端に気づいたのは、ECRにログインするコマンドを叩いた際、現在使っている情報とは異なるアカウントに接続しに行っているのに気づき、何故こんな事になっているのか原因が全然分からなかった為、調査を行いました。
最初に、`aws configure list`で`aws configure`の設定情報を調べた際、かなり昔に消去したアカウントの情報が`default`で設定されている事に気付きました。話は前後しますが、`profile`　を使えば問題なくAWS CLIのコマンドは動作しますが、この方法は結構面倒な事が多い事を業務で知っていたので、なんとしても、`aws configure`の`default`設定を今使っているアカウントにしたくて、調査しまくり修正を行いました。
同じ問題で悩んでいる皆様に、修正方法をお伝えできればと思い記事に残しました。

## 原因調査と修正方法
いろいろ設定を直しても全然上手くいかない為、`aws configure list`をずっと眺めていると、`Type` に`env`が付いている事に気づきました。
<small>(`profile`の`Value`に`test`が付与されているのは、私がいろいろ設定してた際に、付けてしまいました。)</small>
```sh
$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                     test              env    ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key     *******************4              env    
secret_key     *******************d              env    
    region           ap-northeast-1      config-file    ~/.aws/config
```    

何故、`Type` に`env`が付いているか気になり凄く調査を行なっていると、有力な記事(参考記事に記載)を見つけ、その記事を読んでいると`~/.zshrc`に原因があると分かり、直ぐに`cat`コマンドで中身を見ました。

```shell
$ cat ~/.zshrc         

.zshrcの入力内容(個人情報がある為、一部中身を省略しています)
# Fig pre block. Keep at the top of this file.

export AWS_ACCESS_KEY_ID='****************4'
export AWS_SECRET_ACCESS_KEY='********************************d'

# Fig post block. Keep at the bottom of this file.
```
恐らく、プログラミングを始めた頃に設定したであろうAWSの設定情報が記載されており、この記述が悪さをしていた原因でした。
まず、その悪さをしていた部分を消去。
 (私は、`$ vim ~/.zshrc`で編集を行い、不要部分を消しました)
次に、下記のコマンド入力して、以前の`default`値を消去。

```sh
$ unset AWS_DEFAULT_REGION
$ unset AWS_ACCESS_KEY_ID 
$ unset AWS_SECRET_ACCESS_KEY
$ unset AWS_DEFAULT_PROFILE
```

改めて`aws configure list`のコマンドをターミナルで叩くと、新しく`aws configure`で登録した内容が反映されました。

```sh
$ aws configure list 
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     *******************W shared-credentials-file    
secret_key     *******************f shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

## 感想
結構どハマりして、なかなか原因が分からず何日間か悶え苦しみましたが、無事解決出来てよかったです。

## 参考記事
- [<font color="Red">[公式]</font> AWS CLI を設定する環境変数](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html)
- [aws configure profileはenvの前に無力](https://qiita.com/takepan/items/2ab771f578fc031a78f3)
- [AWS CLIで使える認証情報とオプションの設定方法まとめ](https://dev.classmethod.jp/articles/how-to-configure-aws-cli/)
与えられた文字列の全ての空でない部分文字列からなるリストを返す

# はじめに

「[Pythonプログラミング入門](https://utokyo-ipp.github.io/index.html)」という、東京大学 数理・情報教育研究センターさんが作成された教材でPythonを学習しています。

Pythonの学習を進めつつ、同じ内容を[Elixir](https://elixir-lang.org/)で置き換えてみたらどうなるだろう？　という視点でも眺めています。
私はどうしようもなく[Elixir](https://elixir-lang.org/)が好きなのです。

今日は、「与えられた文字列の全ての空でない部分文字列からなるリストを返す」をやってみます。

# Python

お手本は

https://utokyo-ipp.github.io/6/6-1.html

に書いてあります。

```python
def allsubstrings(s):
    return [s[i:j] for i in range(len(s)) for j in range(i+1,len(s)+1)]
```

実行してみます。

```python
>>> allsubstrings('abc')
['a', 'ab', 'abc', 'b', 'bc', 'c']
```

:tada::tada::tada: 

# [Elixir](https://elixir-lang.org/)

[Elixir](https://elixir-lang.org/)で書いてみます。

```elixir
iex> allsubstrings = fn s -> 
  for i <- (0..(String.length(s) - 1)), j <- (i..(String.length(s) - 1)), do: String.slice(s, i..j)
end

iex> allsubstrings.("abc")
["a", "ab", "abc", "b", "bc", "c"]
```

:qiitan::rocket::rice::rocket::rice::rocket::rice::qiitan: 


# おわりに

「与えられた文字列の全ての空でない部分文字列からなるリストを返す」処理を楽しみました。
AppCodeとInjectionIIIを使ってホットリロードを有効にするときにハマったこと

## 前提

```
AppCode, swift素人
入門書読まず、Generateされたコードを触って初日の人
```

## やりたいこと

AppCodeが公開している方法でInjectionIIIを使ってシミュレータをホットリロードしたい
https://pleiades.io/help/objc/create-a-swiftui-application.html#interactive_preview

## 結論

`struct ContentView_Previews` を `class ContentView_Previews` に書き換える
![スクリーンショット 2022-09-19 19.18.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182779/ba7d0817-3022-2f6d-2c6c-f91ae1fe07c3.png)

### 詳細

Before
```swift
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```

After
```swift
class ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
    #if DEBUG
    @objc class func injected() {
        let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
        windowScene?.windows.first?.rootViewController =
                UIHostingController(rootView: ContentView_Previews.previews)
    }
    #endif
}
```

`#if DEBUG`の範囲内だけ追記するかと脳死して、IDEに怒られて`@objc`消したりして実行してた。
公式ドキュメントが古いと思い込んでいた。

### エラー出て調べたこと

#### エラー１

読み込んでもよくわからなかった。
Xcode起動してホットリロードできるか試してたら、エラー２に変わった
```
Could not locate compile command for /Users/xxx/ContentView.swift.
```

- https://github.com/johnno1962/InjectionIII/issues/396
- https://github.com/johnno1962/InjectionIII/issues/401

#### エラー２

`Other Linker Flags` に追記してるけどエラー出て納得行かない。
リンク先見ててもラバーダックで自己解決してた。
```
⚠️ Injection may have failed. Have you added -Xlinker -interposable to the "Other Linker Flags" of the executable/framework? ⚠️
```

- https://bytemeta.vip/repo/johnno1962/InjectionIII/issues/399
PostgreSQL: レコードの更新時間を自動に更新

こちらを参考にしました。
[PostgreSQL アップデート時のタイムスタンプ自動更新](https://timesaving.hatenablog.com/entry/2020/08/29/210000)

次のようなテーブルを作成します。

```text
  id   |  name  | population |         created_at         |         updated_at         
-------+--------+------------+----------------------------+----------------------------
 t3461 | 広島   |      72814 | 2022-09-19 19:23:43.7412   | 2022-09-19 19:23:43.7412
 t3462 | 福山   |      98000 | 2022-09-19 19:23:43.758681 | 2022-09-19 19:27:36.90104
 t3463 | 東広島 |      92513 | 2022-09-19 19:23:43.792644 | 2022-09-19 19:23:43.792644
 t3464 | 呉     |      93167 | 2022-09-19 19:23:43.81396  | 2022-09-19 19:23:43.81396
 t3465 | 尾道   |      95419 | 2022-09-19 19:23:43.847149 | 2022-09-19 19:23:43.847149
 t3466 | 竹原   |      99000 | 2022-09-19 19:23:43.880524 | 2022-09-19 19:31:31.430859
 t3467 | 三次   |      76152 | 2022-09-19 19:23:43.91381  | 2022-09-19 19:23:43.91381
 t3468 | 大竹   |      37541 | 2022-09-19 19:23:43.936111 | 2022-09-19 19:23:43.936111
 t3469 | 府中   |      97000 | 2022-09-19 19:23:43.969167 | 2022-09-19 19:27:16.580888
(9 rows)
```

## データの用意

```bash:go_exec.sh
export PGPASSWORD=tiger123
psql -h localhost -U scott -d city
```

```bash
./go_exec.sh < create_trigger.sql
./go_exec.sh < postgre_insert.sql
```


```sql:create_trigger.sql
drop table if exists hiroshima;
drop function set_update_time;

CREATE FUNCTION set_update_time() RETURNS trigger AS '
  begin
    new.updated_at := ''now'';
    return new;
  end;
' LANGUAGE plpgsql;

CREATE TABLE public.hiroshima (
  id varchar(10) primary key,
  name text,
  population integer,
  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

CREATE TRIGGER update_tri BEFORE UPDATE ON public.hiroshima FOR EACH ROW EXECUTE PROCEDURE set_update_time();
```

```sql:postgre_insert.sql
insert into hiroshima values ('t3461','広島',72814);
insert into hiroshima values ('t3462','福山',41738);
insert into hiroshima values ('t3463','東広島',92513);
insert into hiroshima values ('t3464','呉',93167);
insert into hiroshima values ('t3465','尾道',95419);
insert into hiroshima values ('t3466','竹原',82314);
insert into hiroshima values ('t3467','三次',76152);
insert into hiroshima values ('t3468','大竹',37541);
insert into hiroshima values ('t3469','府中',46518);
```

## データの更新

```text
city=> update hiroshima set POPULATION =99000 where id='t3466';
```

## データの確認

```bash
./go_exec.sh < postgre_read.sql
```

```sql:postgre_read.sql
select * from hiroshima order by id;
```
DockerでメインフレームOSを動かす(タイムゾーン変更)


https://sdl-hercules-390.github.io/html/
https://sdl-hercules-390.github.io/html/hercconf.html
を参考にメインフレームOSのタイムゾーンを変更します。

``docker-compose.yml``でTZ変数をUTCにします(gitリポジトリは変更済)。上記ホームページの記載に従うなら、これを基準に、日本なら+9時間すればよいはずなのですが、なぜか+8時間でないと意図した時間にならなかったです。

## TZOFFSEET変数の設定
次のコマンドでコンテナに入ります。
```
docker-compose run --rm --service-port turnkey4 bash -p
```

viエディタで`` /opt/turnkey4/local_conf/01``ファイルにTZOFFSET変数の設定を記述します。
``local_conf``ディレクトリ以下の01から10までのファイルはカスタマイズ用のファイルなので、ここに記述します。

```
vi ./local_conf/01
TZOFFSET   +0800
```

## メインフレームOSを起動し、TSOユーザで画面表示し右上の日付を確認する
``docker-compose up -d``でメインフレームOSを起動し、``./tso_user.sh``でTSOユーザでログオンして、日付が変わったか確認します。
右上のDateとTimeが意図したものになっていればOKです。

```
 Terminal  CUU0C1                                                 Date  19.09.22
 System    TK4-                                                   Time  19:26:12
 TSO User  HERC02

 Option ===> 1

               The MVS 3.8j Tur(n)key System
        TK4- Version 1.00 Update 08 -- MVS PUT 8505

                      TSO Applications


      1  RFE        "SPF like" productivity tool
      2  RPF        "SPF like" productivity tool
      3  IM         IMON/370 system monitor
      4  QUEUE      spool browser
      5  HELP       general TSO help
      6  UTILS      information on utilities and commands available
      7  TERMTEST   verify 3270 terminal capabilities

                    Enter X to Terminate

  PF3=Terminate
```
kintoneで承認フローを実現したい。担当者申請→課長承認→部長承認

# 本稿の目的
kintoneにて業務システムを構築する際にプロセス管理機能を使用して承認フローを実現したい。そんな時に発生する**課題や解決方法について記載**していこうと思います！
解決方法についても**標準機能でできる範囲**や**カスタマイズでできる範囲**に軽く触れて行こうと思います。

主に以下のようなkintone初心者向けの記事となります。
● kintoneの導入予定/検討中の方。
● kintoneにて承認フローを作成する予定がある方。
● 自社でkintoneを導入している情報システム室の方。
● 外部へkintone開発(プロセス管理を含む)を委託する担当者の方。

cybozuヘルプにもプロセス管理設定で気を付けることの記載があります。
https://jp.cybozu.help/k/ja/user/app_settings/process/design_process.html

# 承認フローで必要な要件とは？
タイトルにもあるような「担当者が申請し、課長と部長の承認が必要」な承認フローを考えてみます。
例えば備品購入申請だった場合は以下のような手順となる。※1~4はkintoneで実施する。
1. 購入申請情報を入力する。
2. 担当者から課長へ申請する。
3. 課長が承認したら部長へ申請される。
4. 部長が承認したら承認済みとなる。
5. 購入手続き。
![アプリ画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/ba9998c4-5515-6be6-3a69-a1a79d9dd479.png)

ただし他にも以下のような要件が必要となる。
## アクションボタンの表示　要件
**【課題】**
アクションボタンとはプロセス管理にて次のステータスへ進めるためのボタンのことである。
レコードにて承認者が設定される前にアクションボタンが表示されることは好ましくないので
承認者が設定されている時だけアクションボタンが表示されるようにしたい。

**【解決策】**
kintoneの標準機能で実現が可能である。
設定方法としては承認者フィールド対して「次のいずれかを含む」設定と「Everyone」設定をすることである。
「Everyone」とはkintoneユーザーのすべてであるため、「次のいずれかを含む」設定をすることで
「承認者フィールドにユーザーが設定されていたら―」という条件となる。
![承認者条件.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/769a4be4-b648-bcfc-0bf1-749959159312.png)
↓承認者未設定時は「申請する」アクションが表示されない。
![承認者未設定_合体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/48be35bb-f357-b925-5488-43ff0494f423.png)
↓承認者設定時は「申請する」アクションが表示される。
![承認者設定済み_合体.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/724e00df-e8ec-2b3d-2bc6-0363c4cbef38.png)

## 差し戻し 要件
**【課題】**
課長や部長が申請を否認したい場合や申請情報の不備として差し戻しをしたい場合がある。
差し戻しとされた場合は申請者が申請情報を修正し、再度申請をすることができる。
否認とされた場合は以後そのレコードで申請処理はできない。

**【解決策】**
kintoneの標準機能で実現が可能である。
プロセス管理にて以下のような設定をすることで実現する。
1. ステータスに「差し戻し」を追加する。(作業者は申請者とする。)
2. 承認時のアクションに「差し戻し」を追加し、実行後ステータスを「差し戻し」とする。
3. ステータスに「取消」を追加する。(作業者の設定はなし。)
4. 申請時のアクションに「取消」を追加し、実行後ステータスを「取消」とする。

否認の際の手順は承認者(課長や部長)から差し戻しを受けた申請者が確認した後で申請者本人が取消をする方針としている。
承認者が一方的に申請を否認する場合はあまり無い？と思いますので。

## 代理承認　要件
**【課題】**
承認者(課長や部長)が不在であり、業務が滞ってしまわないように代理者が承認したい場合がある。

**【解決策】**
**「現在の作業者を変更」ボタンより作業者に代理者となる方を追加することによって実現が可能**である。(kintone標準機能)
ただし、[「現在の作業者を変更」ボタンが表示されるユーザーは「cybozu.com共通管理者」または「アプリ管理権限を持つユーザー」だけ](https://jp.cybozu.help/k/ja/id/040573.html#process_requiredsettings_process_3010)である。これらのユーザーは大概の会社では情報システム室等が保持しているアカウントであるため、現場だけで代理者に作業させることはkintone標準機能だけで実現することはできない。(情報システム室に連絡し代理者を作業者にしてもらう作業が必要。)
**現場だけで承認者不在時のプロセスを進める(課長が不在の際に部長が課長の分の承認もする)ようなことを実現する場合はカスタマイズが必要**となる。例えば、公開されている[作業者を更新するAPI](https://developer.cybozu.io/hc/ja/articles/208243696-%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BD%9C%E6%A5%AD%E8%80%85%E3%81%AE%E6%9B%B4%E6%96%B0)を使用する等が考えられます。

# まとめ
承認フローを実現する際の課題と解決策についてお客様が漏れがちな観点を中心に記載してみました。
今回、ユースケースとした「担当者申請→課長承認→部長承認」の承認フローをプロセス管理で設定した例を公開します。
参考にして頂ければと思います。
![プロセス設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850653/c4053ca5-d181-7188-72c4-5b34e94318f6.png)

他にも「こういう要件で苦労した」「こんな解決方法もあるよ」みたいなのがありましたら追記していこうと思います！

最後に個人的に作成した[プラグインを販売](https://idepenshop.stores.jp/)しておりますので是非ご覧になっていただければと思います。
試用版も用意しております！
【Vim/Neovim】colorschemeについて

# カラースキームの一覧確認
まず、すぐに使えるcolorschemeの一覧を表示してみる。

```
:colorscheme(スペースを押してCtrl+dを押す)
```

![Screen Shot 2022-09-19 at 18.41.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/e8a7e058-c412-49b2-3913-f730c1b3b936.png)

デフォルトだとこんな感じだろう。

# インストールされているカラースキームをブラウズ


ScrollColorsというプラグインを導入して、
インストールされているスキームを試しにみてみる。
https://github.com/vim-scripts/ScrollColors

vim-plugなら、
```:init.vim
Plug 'https://github.com/vim-scripts/ScrollColors'
```
で
```
:PlugInstall
```
みたいな感じでインストールできる。

SCROLLと打つと、
実行できる。

```
:SCROLL 
```

![Screen Shot 2022-09-19 at 18.52.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1290117/a25ea39c-914f-63c7-e051-e2d48a7c4f8d.png)

# カスタムコマンドでカラースキームを入れ替える

vimとかでコマンドエイリアスを定義したいときは、

```:init.vim
command! SS :so ~/.config/nvim/init.vim
```

というふうにする。

上記の定義は、
```
:so ~/.config/nvim/init.vim
```
というコマンドを
```
:SS
```
とするだけで実行できるエイリアスである。
※ちなみに:soは:sourceの短縮形である


vimでは、
下記のコマンドでスキームを変えられる

```
:colorscheme evening "eveningスキームを適用する
```
※ "はコメントである

これをエイリアスとして、
登録すれば容易に変更できそうだ。

```:init.vim
command  Eve :colorscheme evening
```

これでEveと打てば、
colorschemeが変わる


そして、めちゃくちゃお気に入りのスキームを
見つけたら、init.vimに定義していまえばいいだろう。


カラースキームの入れ替えについては、
もっと工夫して本格的な関数とかにしてみても
面白いかも。

デフォルト以外のcolorschemeは、
このあたりで探すと良いだろう
https://vimcolorschemes.com/
【PHP/SQL】SELECT count(*) 実行時の戻り値パターンと条件分岐

現在エンジニアを目指してPHPを学習中です。
SQL実行結果の分岐を正しく記述できるようになるべく、
戻り値を確認したので、メモ。

※2022.10.2追記
内容の誤りをご指摘いただき、修正しました。
@takaram さんありがとうございました！


## 前提
以下のコードを実行しました。
DBカラム名等の細かい部分は本筋と関係ないため略します。

```php
$dbh = new PDO(hoge);
$sql = 'SELECT count(*) FROM table WHERE column = hogehoge';
//DBのオプションは下記（正直PDOオブジェクトをはじめ、下記設定の意味はまだよく分かってません、、）
PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true

//SQL実行、結果を$resultに
$stmt = $dbh->prepare($sql);
$stmt->execute;
$result = $stmt -> fetch (PDO::FETCH_ASSOC);

//結果を測定
var_dump($result);
error_log(print_r($result,true));
error_log(print_r($result));
```

## 先に結論：false値と文字列型の値による分岐が◎
改めて今回の目的は、__SQL実行結果の分岐の正しい記述方法__。
処理フローとしては以下のかたちがよさそうです。

```php
if($result === false){
    //パターン3,SQLエラー
}
if(array_shift($result) === '0'){
    //パターン2,該当レコードなし
}else{
    //パターン1,該当レコードあり
}
```

## パターン別実行結果

※2022.10.2追記
以下記載の`print_r($result)`について、戻り値がtrueになるのは仕様です。
```php
//公式より
print_r(mixed $value, bool $return = false): string|bool
//return パラメータが true の場合は、 この関数は string を返します。
//それ以外の場合の戻り値は true です。
```
参照：https://www.php.net/manual/ja/function.print-r.php

### 1.SQL実行、合致するデータが1つ
・var_dump($result)の値：
>クエリ成功：
array(1) { ["count(1)"]=> string(1) "1" } Array ( [count(1)] => 1 )

・print_r($result,true)の値：
> [count(1)] => 1

・print_r($result)の値：
>1

### 2.SQL実行、該当データがない
・var_dump($result)の値：
>クエリ成功：
array(1) { ["count(1)"]=> string(1) "0" } Array ( [count(1)] => 0 )

・print_r($result,true)の値：
> [count(1)] => 0

・print_r($result)の値：
>1

### 3.クエリにミスがありエラー
・var_dump($result)の値：
>false：
bool(false)

・print_r($result,true)の値：
>（記載なし）

・print_r($result)の値：
>1

## 考察
まず、$resultの結果は以下のような分岐らしい。

~~~
SQL実行
└---true---string(1) "1（該当データ数）"（パターン1）
        └--string(1) "0"（パターン2）
└---false（パターン3）
~~~

SQLが実行された後の結果がstring型として返ってくることも踏まえ、
考えた処理フローが冒頭のもの。

```php
if($result === false){
    //パターン3,SQLエラー
}
if(array_shift($result) === '0'){
    //パターン2,該当レコードなし
}else{
    //パターン1,該当レコードあり
}
```

## 考察2(おまけ)
※本題からはやや逸れるので少しダラダラ書きます。

今回試したいずれのパターンでも
`error_log(print_r($result))の結果は '1'`になりました。
分岐の条件に用いることができないのはもちろんですが、
値がないはずの実行結果 false の場合でも 1 が表示されるのはおかしいはず、、、


※2022.10.2追記
__ここから先の内容は全て誤りです。1が表示されるのは、仕様です。
下記記載のPDO::ERROMODEはSILENCEのままで分岐に問題ありません。__


~~ということで、確認してみました。~~
```php
var_dump(print_r($result));
//結果：どのパターンでも 'bool(true)'
```

~~`error_log(print_r($result))`の`1` は`true`を表しているようです。
booleen型ということは、SQL実行の成否のことでは？？
だとしたら、false の場合でも true になっているのはなぜ？？~~

~~はい、怪しいヤツ見つけました。~~
```php
PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT
```
~~この設定は、エラーメッセージを出力しないらしい。
情報は持ってるのに、「聞かれてないから」とか言って共有しないタイプのヤツ。~~

~~発生したエラーがスルーされている
（本来 false なのに true として処理されている）
ということではなかろうか。
なので、以下の設定に変更。~~

```php
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
```
~~結果~~
```
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax
```
```
SQLSTATE[42S02]: Base table or view not found
```
~~エラーメッセージが出てくるようになりました。
こういうことですよね？~~


※内容や考え方に間違い、補足等ありましたらぜひ教えていただけますと幸いです！
ソリューションアーキテクト対策_IAM篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## IAMポリシーの種類
まず、2つに分かれる。

・管理ポリシー
・インラインポリシー

管理ポリシーがさらに2つに分かれる。

・管理ポリシー
　・AWS管理ポリシー
　・カスタマー管理ポリシー
・インラインポリシー

AWS管理ポリシーはReadOnlyAccessみたいないつもデフォルトで使ってるリソースのこと。
カスタマー管理ポリシーは自分でジェネレータとか使って作るいつものやつ。

この2つは複数のプリンシパルエンティティ(IAMユーザー、グループ、ロール)にアタッチできる。

管理ポリシーはポリシーのアタッチ/デタッチが自由にできる。
インラインポリシーはプリンシパルエンティティと1:1の関係であるため、複数のアタッチはできない。

いっつも忘れるけどプリンシパルは主な、とかそういう意味。


## IAMデータベース認証とは
EC2インスタンスからRDSにセキュアに接続したい時とかに使う。
この認証方式ではID/Passwordではなく一時的な認証トークンを使用する。
IAMユーザーまたはロール、それに認証トークンを加えてRDSへ接続を行う。

## IAMでSSL証明書を管理する
基本はACMを推奨。ただしACMがサポートされていないリージョンがあるため、その際はIAMにSSL証明書をインポートして管理する。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_server-certs.html

## IAMを利用したベストプラクティス
まず、ユーザーの適切なアクセスレベルに応じたIAM権限を設定することが必要。
よって必要なアクションのみの実行に必要な最小限の権限が付与されていること。そしてそれをモニタリングし定期的に確認する。

上記以外にもまだまだある。以下の通り。

・AWSアカウントルートユーザーのアクセスキーをロックする
・個々のIAMユーザーを作成する
・IAMユーザーへのアクセス許可を割り当てるためにユーザーグループを使用する
・最小限の特権を認める
・AWS管理ポリシーを使用したアクセス許可の使用開始
・ポリシーの検証
・インラインポリシーではなくカスタマー管理ポリシーを使用する
・アクセスレベルを使用して、IAMのアクセス許可を確認する
・ユーザーのために強度の高いパスワードポリシーを設定する
・MFAの有効化
・EC2インスタンスで実行するアプリケーションに対し、ロールを使用する
・ロールを使用してアクセス許可を委任する
・アクセスキーを共有しない
・認証情報を定期的にローテーションする
・不要な認証情報の削除
・追加セキュリティに対するポリシー条件を使用する
・AWSアカウントのアクティビティのモニタリング


## おわりに
引き続き追記します。

簡単ですが以上です。
PHPで「csrf_token」と「session」について

これから、sessionとcsrf対策について
sessionとは、webページ上でサーバーが生き続け、履歴やパワスードが、
保持し続ける状態のこと
その対策で、csrf_tokenを作成し、webページを移動するごとにcsrf_tokenを発行し、
外部からの悪意のある第三者からの侵入を防ぐためにcsrf_tokenが生成される。


```php

<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']?>">
```
formで$_SESSION['csrf_token']を送る。
これで、次の〜.phpへtokenを移動できる。


```php
session_start();  
require_once('common/function.php');  
if(!isset($_SESSION['csrf_token'])) {  
  $_SESSION['csrf_token'] = random();  
}
```
sessionスタート
commonファイルのfunction.phpから接続する
csrf_token変数に値が入っているかどうかを確認するためのisset関数
ランダムにsessionが変わるごとにcsrf_tokenが発行される。（function.phpから取り出す）



```php

function random($length = 16) {
    return substr(bin2hex(random_bytes($length)), 0, $length);
}

```





```php
if(isset($_POST["lid"]) || isset($_POST["lpw"]) || isset($_POST["csrf_token"])) {  
    if($_POST['csrf_token'] !== $_SESSION['csrf_token']) { 
        echo "このサイト以外からのアクセスは禁止しています。";  
        exit;
    }
```
変数に値が入っているかどうかを確認するためのisset関数
（POSTされた、「lid」「lpw」「csrf_token」があるか確認）
todoに入ったcsrf_tokenとsessioncsrf_tokenが一致しないなら
このサイト以外からのアクセスは禁止しています。を出力する。
終了
サービスタグ「VirtualNetwork」が含むアドレス範囲

# サービスタグ「VirtualNetwork」とは
サービスタグ「VirtualNetwork」はNetwork Security Group（以下、NSG）で使えるサービスタグです。
NSGを作成した際に自動生成されるデフォルトルールにも含まれているので、NSGを使うと必ず使うことになります。
「VirtualNetwork」という名前からは仮想ネットワークのアドレス範囲のみを含むように想像できますが、実際にはより広範囲のアドレス範囲を含みます。
正しく仕組みを理解していないと、想定していないところからの通信が許可されたり、逆にブロックされたりということが起こります。

# サービスタグ「VirtualNetwork」が表す範囲
Microsoft公式ドキュメントに定義が記載されています。
[仮想ネットワーク サービス タグ](https://learn.microsoft.com/ja-JP/azure/virtual-network/service-tags-overview)
> 仮想ネットワーク アドレス空間 (仮想ネットワークに対して定義されているすべての IP アドレスの範囲)、すべての接続されたオンプレミスのアドレス空間、ピアリングされた仮想ネットワーク、仮想ネットワーク ゲートウェイに接続された仮想ネットワーク、ホストの仮想 IP アドレス、およびユーザーが定義したルートで使用されるアドレス プレフィックス。 このタグには、既定のルートも含まれる場合もあります

ひとつひとつ見ていきましょう。

> 仮想ネットワーク アドレス空間 (仮想ネットワークに対して定義されているすべての IP アドレスの範囲)

これはまさに名前通りです。

> すべての接続されたオンプレミスのアドレス空間、ピアリングされた仮想ネットワーク、仮想ネットワーク ゲートウェイに接続された仮想ネットワーク

VPNやExpressRoute、ピアリングで接続された先のネットワークも範囲に含む、ということですね。プライベートな扱いのネットワークはVirtualNetworkに含む、と解釈すれば納得できます。

> ホストの仮想 IP アドレス

AzureデフォルトのDNSサーバやDHCPサーバ等で使われる 168.63.129.16 のことを指すようです。

> ユーザーが定義したルートで使用されるアドレス プレフィックス

一番のハマリポイントです。ユーザ定義ルートで指定した宛先がなんとVirtualNetworkサービスタグに含まれてしまいます。ユーザ定義ルートでパブリックIPアドレスを宛先として指定しているとその宛先も含まれてるということです。これを知っていないとユーザ定義ルートで定義したものがうまく通信できない、といったトラブルにはまります。

# サービスタグ「VirtualNetwork」の具体的な値の確認方法
NSGが適用されているサブネット内に起動状態の仮想マシンが存在する必要がありますが、以下の方法で「VirtualNetwork」の具体的なアドレス範囲を確認できます。

1. 確認したいNSGの管理画面を開く
1. [有効なセキュリティルール]をクリック
1. 関連付けているサブネット内に起動状態のVMが存在すればNSG名が表示されるので、クリック
![nsg01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/577548b1-3727-fb84-5b04-bcee55ab30a2.png)

1. NSGのルールが展開されるので、サービスタグ「VirtualNetwork」を含む行をクリック
1. アドレスのプレフィックスペインが開き、具体的なアドレスレンジを確認できます。
![nsg02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2850747/ce8e4d55-6d6f-697d-8510-37c9140e76ed.png)

余談ですが、この方法を使えばサービスタグ「Internet」の具体的なアドレスレンジを確認することができます。
ESLint


## eslintの設定例

```
$npx eslint --init

You can also run this command directly using 'npm init 
@eslint/config'.
Need to install the following packages:
  @eslint/create-config
Ok to proceed? (y) y
✔ How would you like to use ESLint? · style
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · react
✔ Does your project use TypeScript? · No / Yes
✔ Where does your code run? · browser
✔ How would you like to define a style for your project? · guide
✔ Which style guide do you want to follow? · standard-with-typescript
✔ What format do you want your config file to be in? · JavaScript
```
→.eslintrc.jsが作成される。以下の設定が反映されているか確認

```
...
  parser: '@typescript-eslint/parser',
  plugins: ['react', '@typescript-eslint'],
```


使用するreactのバージョン設定
```.eslintrc.js
  ...
  rules: {
  },
  settings: {
    react: {
      version: 'latest'
    }
  }
```
  必要なルールを追加していく
```
  rules: {
    'react/react-in-jsx-scope': 'off',
  },
```


eslintを適用しないファイル

```.eslingignore
.next
next-env.d.ts
node_modules
yarn.lock
package-lock.json
public
```


## prettierの設定

インストール
```
$npm i --save-dev prettier
$npm i --save-dev eslint-config-prettier
→eslintのフォーマッターを上書きしてprettierにフォーマットを任せるために必要
```

```.prettierrc
{
    "endOfLine": "lf",
    "printWidth": 80,
    "tabWidth": 2,
    "trailingComma": "es5",
    "singleQuote": true,
    "jsxSingleQuote": true,
    "semi": true
  }
```
```.prettierignore
.next
next-env.d.ts
node_modules
yarn.lock
package-lock.json
public
```

## vscodeの設定
 Default Formatter
→ Prettier - Code formatter

Format on sage 
→ true


## huskyの設定
```
$ npx husky-init
```
.husky/pre-commit例
```
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# bash echo color
RED='\033[1;31m'
GREEN='\033[1;32m'
BLUE='\033[1;36m'
BOLD='\033[1;37m'
NC='\033[0m'

echo "\n 🚧🏗️  ${BOLD}Checking format, lint and types in your project before committing${NC}"

# Check Prettier standards
npm run check-format ||
(
    echo "\n ❌🟨 Prettier Check ${RED}Failed${NC}. 🟨❌\n Run ${BLUE}npm run format${NC}, add changes and try commit again.\n";
    false;
)

# Check ESLint Standards
npm run check-lint ||
(
    echo "\n ❌🟪 ESLint Check ${RED}Failed${NC}. 🟪❌\n Make the required changes listed above, add changes and try to commit again.\n"
    false;
)

# Check tsconfig standards
npm run check-types ||
(
    echo "\n ❌🟦 Type check ${RED}Failed${NC}. 🟦❌\n Make the changes required above.\n"
    false;
)

# If everything passes... Now we can build
echo "🔥🚀 ${BOLD}All passed... Now we can build.${NC} 🚀🔥"

npm run build ||
(
    echo "\n ❌🟩 Next build ${RED}Failed${NC}. 🟩❌\n View the errors above to see why.\n"
    false;
)

# If everything passes... Now we can commit
echo "✅✅ ${GREEN}Build is completed... I am committing this now.${NC} ✅✅\n"
```
package.json追記
```
"scripts":{
...
    "check-types": "tsc --pretty --noEmit",
    "check-format": "prettier --check .",
    "check-lint": "eslint . --ext ts --ext tsx --ext js",
    "format": "prettier --write .",
    "test-all": "npm run check-format && npm run check-lint && npm run check-types"
}
```
今年の新人に贈る３つの言葉

学生と企業の技術者の方とそれぞれ勉強会をしていると、　
どちらも、１０人以上集まれば、２割の人は私よりプログラミング能力が高い。

１０歳からプログラミングしていれば、２０歳で、ベテランのプロになっている。　
５歳からプログラミングしていれば、１５歳で、ベテランのプロになっているはず。　

10代、20代にお勧めの資格

https://qiita.com/kaizen_nagoya/items/4e0eb6e5d30c0237469d

企業の技術者の勉強会の場合は、私が一番プログラミング能力が低いこともしばしば。

# 得意なことを伸ばそう　

世界一の企業がお客様の場合に、聞かれるのは、あなたが世界一の技術は何ですか？　
新人の方でも１０人に１人か２人くらいは、世界一のプログラムを書いた人に出会うことがある。　

知り合いで学校出て、IT企業を興した人たちは、たいていそんな感じ。　

得意なことを伸ばして、世界一になってお客様に喜んでもらえれば、こんな幸せなことはない。　

# 楽しいことをやろう　

仕事でお金をもらっているのだから、楽しく仕事をするのはとんでもないって言う人がいるかもしれない。　

お客様との意思疎通がうまくいかなかったり、上司との間の意思疎通がうまくいかなかったりすることがあるかもしれない。　

プログラマであれば、プログラミング言語以外で意思疎通することは断念するとよいかもしれない。　

音楽家の方が、音楽を奏でるだけで、まわりの方に意思疎通をお願いするように、プログラマがプログラムを書く以外の意思疎通をまわりの方にお願いしていけないことはない。　

お客様も、楽しく仕事をしていると、何か面白いことをやっているのではと興味を持ってくださるかもしれない。


# 好きなことをやろう　
プログラムが好きでプログラマになったら、プログラムを書こう。　

必要なプログラムが書けなかったり、システムの制約でメモリが足りなかったり、速いコンピュータを買うお金がなかったり、目標を達成できない要因はいくつもあるかもしれない。　

ありとあらゆる制約条件の隙間を縫って、問題を解決するのが技術者なのだろう。　

好きでやっていることなら、解決方法が見つかる確率が高いと思い込もう。　

新人(学生)を指導するよりも新人(学生)に指導してもらった方が効率的。仮説（139）

https://qiita.com/kaizen_nagoya/items/db993b1536055029f7c8
[Ruby]二重ハッシュからの特定の値の取得方法

プログラミング初心者です。
自身の備忘録として、記事を投稿していきたいと思います。

## 二重ハッシュからの特定の値の取得方法について


まずハッシュから特定の値を取得するには

```ruby	
ハッシュ[取得したい値のキー]
```

で取得できます。

次にハッシュが二重になっている場合は

```ruby	
ハッシュ[取得したい値のキー][取得したい値のキー]
```

で取得できます。

よって　以下のハッシュから「John」を取り出すには
```ruby
user_data = {user: {name: 'John'}}
puts user_data[:user][:name]
```

となります。
typescriptでデザインパターン(Abstract Factory)


## やりたいこと
デザインパターンのAbstract Factoryパターンを理解するため、[TECSCORE](https://www.techscore.com/tech/DesignPattern/AbstractFactory)*(1)にJavaで記載されたコードを参考にtypescriptでAbstract Factoryを実装する。

## AbstractFactoryのクラス図
キムチ鍋と水炊き鍋を作るためのファクトリーをabstractFactoryで抽象化します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2193053/3668bebb-3b2d-6d58-d405-c0deb6731010.png)

## 実装したコード
```typescript
// abstract Factory
abstract class AbstractFactory {
    abstract getSoup(): Soup;
    abstract getProtein(): Protein;
}


// ConCreate Factory
// 水炊き鍋
class MizutakiFactory extends AbstractFactory {
    getSoup(): Soup {
        return new MisoSoup();
    }
    getProtein(): Soup {
        return new Chikin()
    }
}
// キムチ鍋
class KimuchiFactory extends AbstractFactory {
    getSoup(): Soup {
        return new KimutiSoup();
    }
    getProtein(): Soup {
        return new Chikin()
    }
}


// abstract Product
// スープ
abstract class Soup { }
// メインディッシュ（タンパク質）
abstract class Protein { }


// concreate Product
// ミソスープ
class MisoSoup extends Soup {
}
// キムチスープ
class KimutiSoup extends Soup {
}
// 鶏肉
class Chikin extends Protein {
}


// 鍋（容器）
class Pot {
    constructor() {
        return 'pot'
    }
}


// なべ
class HotPot {
    pot: Pot;
    soup: Soup;
    protein: Protein;

    constructor(pot: Pot) {
        this.pot = pot;
    };

    public addSoup(soup: Soup) {
        this.soup = soup;
    };

    public addProtein(protein: Protein) {
        this.protein = protein;
    };

}


// 鍋を作ります
class Sample {
    static makeHotPot(type: 1 | 2) {
        const factory: AbstractFactory = this.createFactory(type);
        const hotPot = new HotPot(new Pot());
        hotPot.addSoup(factory.getSoup());
        hotPot.addProtein(factory.getProtein());
        return hotPot;
    }


    static createFactory(type: 1 | 2): AbstractFactory { //1: 水炊き鍋、2: キムチ鍋
        if (type == 1) {
            return new MizutakiFactory()
        }
        else {
            return new KimuchiFactory()
        }
    }
}


// 実行
function main() {
    // 水炊き鍋を作る
    const mizudakiHotpot = Sample.makeHotPot(1);
    console.log(mizudakiHotpot);

    // キムチ鍋を作る
    const kimuchiHotpot = Sample.makeHotPot(2);
    console.log(kimuchiHotpot);
}

main();


    
```

## 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2193053/35b005a4-7e73-1f91-7068-28a65a1db2eb.png)

## 参考文献
* (1) [TECSCORE](https://www.techscore.com/tech/DesignPattern/AbstractFactory)
FlaskをGunicornで稼働させてみた

# はじめに
こちらの記事の続きで書いてます。
Gunicornメインで、Flaskにはほぼ触れない内容かも。

https://qiita.com/Nats72/items/793330ae2f1a82102fca

# 本番サーバーで稼働させる
本番稼働させるには、**gunicorn**や**uWSGI**といったWEBサーバーを使います。
今回は、**gunicorn**を使ってWEB公開してみます。

## gunicornをインストール
gunicornはpipでインストールできます。
```
# pip install gunicorn
```

## gunicornで起動させる
実行させたいflaskのファイルがあるディレクトリで、以下のコマンドを実行します。
-wは、--workersの省略形で、ワーカープロセス数を指定できる。
-bは、--bindの省略形で、gunicornのアドレスと待受け(Listen)ポートを指定できる。
index.pyのappというアプリケーションを実行します。
```
# gunicorn -w 1 -b 0.0.0.0:80 index:app
2022-09-18 15:52:49 +0000] [30] [INFO] Starting gunicorn 20.1.0
[2022-09-18 15:52:49 +0000] [30] [INFO] Listening at: http://0.0.0.0:80 (30)
[2022-09-18 15:52:49 +0000] [30] [INFO] Using worker: sync
[2022-09-18 15:52:49 +0000] [31] [INFO] Booting worker with pid: 31
```
バックグラウンド起動（デーモン起動）させる場合はこちら
※dockerfileのCMDやENTRYPOINTでこれを実行させる場合は、`--daemon`は書かないこと。
　原因追求まで出来てないですが、CMDやENTRYPOINTでデーモン起動させるとコンテナが落ちます。
　(restart設定にしている場合は、restartingを繰り返します)
```
# gunicorn --workers 1 --bind 0.0.0.0:80 --daemon index:app
```

なんかまだ書き足りてない気がするので、気が向いたときに追記します。
プログラミングスクール探し

はじめまして
ゆーふぉーちゃんといいます
わたしは最近プログラミングに興味を持ちまして、独学よりも教室とかで集中的に学んでみたいなとおもいました

プログラミングスクールを探しているときにみつけた、このスクールとか良さそうだなと思いました
エスワイシステムさんという会社がやっているIT道場といいます！

https://sy-it-dojo.studio.site/

なんと料金は就職してからの支払いなので今お金に余裕がなくても大丈夫そうです
費用は40万円ということで、比較的安いのでしょうか

しかも15年以上開発経験のあるエンジニアでなおかつ元教師という経歴の方が指導してくださるそうです
これは期待できますね

こちらのカリキュラムのページに塾長さんの経歴が載っています

https://sy-it-dojo.studio.site/curriculm

あれ？？？

測量設計事務所ってなんですか？

https://141-survey.studio.site/

上のリンクの設計事務所のようですね


![Screenshot_20220919-145556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515097/7d27d3f5-dce7-d4aa-d46f-7ea10b3f76fa.png)

LINEにリンクを張ってみたら2つのサイトの画像が同じですね！
測量設計事務所とプログラミングスクールになにか関係があるのでしょうか
どちらもやっているとしたら、すごい多角経営ですね！

HTMLに詳しくないので調べてみました
リンクをシェアしたときの画像や説明文は<head>タグの中に以下のように書くと設定できるようです

```
<meta data-n-head="ssr" data-hid="ogTitle" property="og:title" content="ゆーふぉーちゃん道場">
<meta data-n-head="ssr" data-hid="ogImage" property="og:image" content="https://ゆーふぉーちゃん画像">
<meta data-n-head="ssr" data-hid="ogDescription" property="og:description" content="ゆーふぉーちゃんの道場だよ">
```

IT道場のサイトと、測量設計事務所のサイトを比べてみると、og:imageの部分が同じになっているようです

![141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515097/8c36387e-b850-f40d-cec1-05373dd860a7.png)


![ITDJ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515097/d42a70f2-bd7c-1876-5265-93763df73798.png)


こちらのURLは測量設計事務所の画像のようですね

https://storage.googleapis.com/production-os-assets/assets/d2406138-2399-4bc9-b20d-9386bcdd93c0

なぜプログラミングスクールのサイト内に測量設計事務所の画像があるのでしょうか
運営会社のサイトをみても、関連会社に測量設計事務所はなさそうですね

https://www.sysystem.co.jp/jp/company/organizationchart.html
https://www.syshd.co.jp/jp/company/organizationchart.html







もしかして、ソースをパクったのでしょうか
他所のサイトをパクるようなプログラミングスクールでは絶対勉強したくないですね







余談ですがスマホからIT道場のサイトをみると右上のメニューの動作がおかしいですね


2022/10/20 追記
ヘッダの情報もメニューの挙動も修正されたようです。デザインも少し良くなっていますね。




https://megalodon.jp/2022-0919-0203-12/https://sy-it-dojo.studio.site:443/
AWS Lambda + Node.jsの実行環境でローカルタイムを扱いたいが、とりま日本時間JSTに甘んじる（JavaScript）

## やりたいこと
AWS Lambdaで時間を扱うのに、日本時間JSTが欲しい。（本当はローカルタイムが欲しい。）
だけど、Lambdaではローカルタイムという概念がないらしく、全てUTCになってしまう。
日本時間JSTが欲しいと思っていると、9時間ずれた値が返ってきたり、表示が`19/9/2022`となって欧米か！とツッコミたくなったり、してしまう。

ちなみに、なんでそんなことしたいかというとコレです↓ :frog: 

https://qiita.com/kakudaisuke/items/18681418cebc3bee93b5

## 実装！
色々調べたが簡単に済ませたかったので、とりま+9時間してJ、日本的なフォーマットに自力でした。

```js:index.js
let dateTime = new Date();

// JSTにする
time.setHours(dateTime.getHours() + 9);

// 2022/9/19の形にする
const year = dateTime.getFullYear();
const month = dateTime.getMonth()+1;
const day = dateTime.getDate();
const targetDate = `${year}/${month}/${day}`
```

参考：https://www.sejuku.net/blog/22925

これでやりたいことはできましたが、なんかめんどくさい。
もっと簡潔にできないのかなーと思いつつ。

## うまくいかなったもの
### Lambda環境変数TZ
環境変数で`TZ`をセットするといいよーという記事がたくさんありますが、予約語なので悪手らしい。実際に試してないので、動くのかもわからない。

>定義されたランタイム環境変数
Lambda ランタイムは、初期化中にいくつかの環境変数を設定します。ほとんどの環境変数は、関数またはランタイムに関する情報を提供します。これらの環境変数のキーは予約済みであるため、関数設定では設定できません。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime

というリストの中に`TZ`入っています。

### toLocaleXXXString()系

Date.prototype.toLocaleDateString()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

Date.prototype.toLocaleTimeString()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString

Number.prototype.toLocaleString()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString

```js
// 引数でローカルを指定してもダメ
new Date().toLocaleDateString('jp-JP');

new Date().toLocaleString({ timeZone: 'Asia/Tokyo' });
```

## 最後に
これだとアプリが日本でしか使えないので、本当はローカルタイムを取れるようにして世界中で使えるようになりたい。
ま、そんなことは海外にdistributionするときに考えるか。

その他参考にしたもの。

https://nju33.com/notes/javascript/articles/%E6%97%A5%E6%9C%AC%E6%99%82%E9%96%93%E3%82%92%E5%8F%96%E5%BE%97#par--SlNUJTIwJUUzJTgxJThDJUU5JTgxJUI4JUU2JThBJTlFJUUzJTgxJUE3JUUzJTgxJThEJUUzJTgxJUFBJUUzJTgxJTg0JUUzJTgzJTlFJUUzJTgyJUI3JUUzJTgzJUIzJUUzJTgxJUFFJUU1JUEwJUI0JUU1JTkwJTg4
思いつき駆動執筆 v.s. 与件駆動執筆

９月は忙しく、Qiitaの記事を書く時間が確保できない。　

そうであれば、これまでの記事の書き方と違う書き方をするか、　
違う題材を探して、新しい試みを行うことにする。　



# 思いつき駆動執筆 
ボールペンとメモ帳は、寝るときも、電車の中でも、遊びに行くときも、食事に行くときも持ち歩いている。　

スマフォでは、Qiitaの下書きに、単語をいくつか記録するようにしている。　

大きな題材は１０とか１００とかの連載にするかもしれない。　

そんな思いつきの集合が、題材としては記事数にして１０００くらいあるかもしれない。　

それらを淡々と書くのみいいが、少し体系的な記述を試みようと思った。 

## mixi, researchmap, amazon, booklog, bookmeter

本の感想を10,000記事書こうと思ったときの話。　

自動車用ソフトウェアの事業の教育担当をしていた。　

機械系で１０００冊、電気系で１０００冊、ソフトウェアで１０００冊、本の感想を書こうとした。　

技術書の感想は、ほとんど誰も読まない。　

たまため、かこさとしという化学の技術士の方が、絵本を書いていることを知り、　
絵本を１０００冊読もうと思った。

人生で影響を受けた本100冊。

https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

の４番に登録した本。
## 4. だるまちゃんとてんぐちゃん
1967/11 [加古里子（かこさとし）](https://ja.wikipedia.org/wiki/%E3%81%8B%E3%81%93%E3%81%95%E3%81%A8%E3%81%97)
<img width="200" alt="5115MFWKGVL._SY352_BO1,204,203,200_.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/60410b5b-481d-38a7-b7cb-07d09c4e454a.jpeg">

https://www.amazon.co.jp/dp/4834001245/

https://bookmeter.com/books/550529

https://booklog.jp/item/1/4834001245

>  日本の物語らしい「だるまちゃん」と「てんぐちゃん」の物語。
ほのぼのとした雰囲気と、ゆったりとした進行。
自分で読むなら、小学校進学前の子供によい。
読み聞かせには、０歳から３歳くらいまでがお勧め。
p.s.
小坂井大輔が名古屋駅前で開催していた読書会で取り上げた方がおみえになった。
自分で読んだことがあったが、何気なく奥付を見たら「技術士」と書いてあった。
自分の知っている技術士で、一番たくさん本を書いた人だと思った。

技術士の書いた本1000冊 researchmap 資料一覧（かこさとしの３００冊以上を含む）
https://qiita.com/kaizen_nagoya/items/02286b43bfc9799f394b



また、技術士の方が書いた本の感想も１０００冊書こうと思った。　

技術士1000冊。 researchmap 資料一覧（一部欠損）

https://qiita.com/kaizen_nagoya/items/02286b43bfc9799f394b


この辺りの展開は、出会いと思いつきである。　


栗本薫が、赤川次郎、西村京太郎が売れる本を書いてくれるから、他の作家が売れるかどうかわからなくても出版できるという話をある本の解説で書いていた。　

それじゃ、赤川次郎と西村京太郎を読もうと思った。それぞれ５００冊くらい当時は出していた。二人で１０００冊。

角川、新潮社、講談社などが、夏の１００冊という企画をしていた。　
３社、３年つきあえば、ほぼ１０００冊。

企業の技術者の教育を３年ほど担当させていただいた。７人の年と６人の年と５人の年とがあった。毎週、ひとりづつ、本の紹介をプレゼンの練習としてしてもらった。　

年５０週で３００冊。３年で９００冊。

そして、芥川賞、直木賞を全作品読むことにした。　

そんな、こんなで１００００冊になった。

これを思いつき駆動執筆の例とする。

# 与件駆動執筆

今回は、別の方法を検討する。　

## 第一段階
データサイエンティストの気づき!「勉強して仕事に役立てない人。大嫌い!!」『それ自分かも?』ってなった!!!

https://qiita.com/kaizen_nagoya/items/d85830d58d8dd7f71d07

の記事で参照している自己記事のviewsを合計したら、1,000,000 viewsを超えていた。　

このように、自己参照記事のviewsが1,000,000を超える記事を６つ探し出すか作り出すかする。

## 第二段階　

記事が６つたまったら、自己参照記事のviewsが1,000,000を超える記事を１つ書く。　
その記事の自己参照記事がかぶらないで、なおかつ自己参照記事のviewsが1,000,000を超える記事をもう１つ書く。　

## 第三段階
そうしたら、今度は自己参照記事のviewsが2,000,000を超える記事を１つ書く。

その記事の自己参照記事がかぶらないで、なおかつ自己参照記事のviewsが1,000,000を超える記事をもう１つ書く。　

この時点で、自己参照記事のviewsが1,000,000views以上の記事が１０本になる。　
かつ、重複しないようにしていれば、合計は4,000,000viewsになっているはずである。　

もうすぐ記事数が5000になる。全記事、１日1viewsであれば、年間、1,825,000あり、２年と70日で4,000,000viewsになる計算になる。　

そんなに非現実的な計算ではないだろうと予測してみr。　

第一段階の目標は、2023年3月末とする。　
第二段階の目標は、2024年3月末とする。　
第三段階の目標は、2025年3月末とする。　

この計画ならいけるかもしれない。　


# 参考文献駆動執筆　

２つの方法で、うまくいかなければ、伝家の宝刀「参考文献駆動執筆」を持ち出せばよい。　
　
一番得意な方法を取らずに、なにかやっていって、いざとなれば、得意な方法をとる。　

読書感想で絵本を持ち出したときがそれにあたるかもしれない。　

赤川次郎と西村京太郎を持ち出したときがそれにあたるかもしれない。　

直木賞、芥川賞を全部読むのを取り組みはじめたのがそれにあたるかもしれない。　

自分の得意な技を磨くのは、いいことだ。　

いざという時のためにとっておくのも戦略の一つだと思う。　

なぜ、こんなことを思いついたかというと、今年の言語目標は、TypeScriptかJavaScriptで、Qiitaのデータを処理するプログラムを一つ書くことだった。　
具体的に何を書くか、必要に迫られないとやらない方かもしれない。
Blender奮闘記⑥

# 初めに
yukiさんの動画を見ながらBlenderの知識をつける回第3弾です。
今回は初のアニメーションについて勉強します。

参考にした動画はこちらです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/PtjQfjaWsyE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 作成過程
オブジェクトの作成自体はある程度慣れてきましたので、そこまで時間はかかりませんでした。
![オブジェクトのみ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/d733bb64-0f94-fae0-3f28-4d3fb41582cd.png)

ここまで10分くらいといったところでしょうか？

![animation_1f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/01c0a393-f04c-1894-f6b1-bdc3feedb449.png)

問題はレンダリングの時間。とりあえずもともとsample数4096→1024としましたが、それでも50fですべて完了するまでに1時間かかりました。フルHDの1/4設定のはずなのにそれだけ時間がかかるのは予想外でした。

# 復習
復習も行いました。
![スクリーンショット 2022-09-19 172521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2782192/f028f513-b095-1ad1-c877-eccff40a01f0.png)

今度はsample数を128に設定しました。今回は10分程度で50fのレンダリングが完了しました。

フルHDサイズの高画質なCGアニメ10分とかをレンダリングすると何時間かかるんでしょうね……？

ひとまず復習までは簡単に終わりました。

# 終わりに
今回はくるくる回るアニメーションの作成法を勉強しました。
特に応用も思い浮かばないので、次はyukiさんの動画の続きを行おうと思います。
【MySQL】view（ビュー）の作成

## view（ビュー）とは
SQLによる`SELECT文などで問い合わせを行うことで派生的に生成される仮想的な表`のこと。
表に対して複数の表を内部結合や外部結合で連結した表や
WITH句などの処理のためにシステム内に一時的に作成される表なども含まれる。
ビューは`導出表`とも呼ばれる。


## viewの作成
```sql
CREATE VIEW viewの名前 AS ビューの定義（SELECT hoge, fuga FROM テーブル名など）
```

# 動作検証
## 一つのテーブルからviewを作成

テーブルからいくつかのカラムを抽出してviewを作成してみる。
データは下記のsampleテーブルを使う。
![スクリーンショット 2022-09-19 10.15.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/72b059c0-5aaf-016b-efd7-4f2251ccd9a3.png)

### viewの作成
```sql
CREATE VIEW view_sample AS SELECT id, name, point, type FROM sample;
```
### 作成したviewの確認
```sql
SELECT * FROM view_sample;
```
viewが作成されてSELECT文で参照できることが確認できた！
![スクリーンショット 2022-09-19 10.13.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/f0eada5d-4f28-2de7-dcb5-fab6adc70f40.png)

# ちなみにviewの削除方法は...
```sql
DROP VIEW view_sample;
```


## 複数のテーブルからviewを作成
先ほどは1つのテーブルから作成したが、今度は複数のテーブルを結合したviewを作成する。

### 事前準備
テーブルを3つ用意する。
◆itemsテーブル
```sql
CREATE TABLE items (id int AUTO_INCREMENT, name varchar(50), price int, PRIMARY KEY(id);

INSERT INTO items (name, price) VALUES
('chocolate', 120),
('candy', 100),
('gum', 100),
('potato chips', 200),
('jelly', 170);
```

◆shopsテーブル
```sql
CREATE TABLE shops (id int AUTO_INCREMENT, name varchar(50), area varchar(50), PRIMARY KEY(id));

INSERT INTO shops (name, area) VALUES
('葛飾区', '東京都'),
('福岡市中央区', '福岡県'),
('上京区', '京都府'),
('札幌市', '北海道');
```

◆salesテーブル

```sql
CREATE TABLE sales (id int AUTO_INCREMENT, item_id int, shop_id int, soldItems int, PRIMARY KEY(id));

INSERT INTO sales (item_id,  shop_id, soldItems) 
VALUES 
  (1, 1, 5), 
  (1, 3, 2), 
  (2, 1, 1), 
  (2, 2, 2), 
  (2, 4, 3), 
  (3, 1, 1), 
  (3, 3, 2), 
  (3, 4, 2), 
  (4, 2, 6), 
  (4, 3, 2);
```


### viewを作成

```sql
CREATE VIEW view_sales (
  sales_id, item_name, item_price, shop_name, 
  shop_area
) AS (
  SELECT 
    sa.id, 
    i.name, 
    i.price, 
    sh.name, 
    sh.area 
  FROM 
    sales sa 
    LEFT JOIN items i ON sa.item_id = i.id 
    LEFT JOIN shops sh ON sa.shop_id = sh.id
);
```

### viewを確認
`SELECT * FROM view_sales;`でviewが参照できること確認できた！
![スクリーンショット 2022-09-19 12.22.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/38edfadd-cee3-19b4-a94d-fc51d7e160bf.png)
Laravel9で位置情報検索を行う時は

Laravel9で位置情報検索を行う時、laravel-mysql-spatialをおすすめしている記事が多いですが、
このライブラリは2年ほどメンテされてなくLaravel9では動きません。

[https://github.com/grimzy/laravel-mysql-spatial/issues/186](https://github.com/grimzy/laravel-mysql-spatial/issues/186)

Laravel Eloquent Spatialが対応しているようです。
[https://github.com/MatanYadaev/laravel-eloquent-spatial](https://github.com/MatanYadaev/laravel-eloquent-spatial)
クロスサイトスクリプティング（XSS）についてとその対策方法


クロスサイトスクリプティング対策について勉強したため共有します。


クロスサイトスクリプティング対策とは
SNSや掲示板を投稿した時、悪意のある第三者がウイルスを攻撃し、
自分のSNSや掲示板を使用されることを防ぐための対策をクロスサイトスクリプティングと言います。
手法としては下記を行います。
```javascript

function h($str) {
    return htmlspecialchars($str, ENT_QUOTES|ENT_HTML5, "UTF-8");
}

```


PHPのhtmlspecialchars関数を使うことによってXSSの対策を行うことができます。
PHPのhtmlspecialchars関数は、 HTMLタグ(例：「&」、「”」、「’」、「<」、「>」)
などに使われる特殊文字をエンティティに変換し対策を行います。

関連用語
・エスケープ処理とは、マークアップ言語やプログラミング言語、スクリプト言語等で文字列を扱う際に、
その言語にとって特別な意味を持つ文字や記号を、別の文字列に置き換えることです。

・サニタイズは主にWeb上で行う処理のことで、サイバー攻撃につながるような文字を無効化することを指します。

・phpのhtmlspecialchars関数は、 HTMLタグ(例：「&」、「”」、「’」、「<」、「>」)
などに使われる特殊文字をエンティティに変換します。
シェルスクリプトで`a~z`のディレクトリを作成する

シェルスクリプトで`a~z`のディレクトリを作成する際の備忘録です

## （2022.9.19追記）

以下で十分です！！

```sh
$ mkdir {a..z}
$ ls
a	d	g	j	m	p	s	v	y
b	e	h	k	n	q	t	w	z
c	f	i	l	o	r	u	x
```

## 以下は余計な手順を含んでおります。すみません。

以下のようにすると`a~z`が出力されるので、、

```sh
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
```

以下のようにすればOKです

```sh:test.sh
for ii in `echo {a..z}`
do
    mkdir -p $ii
done
```

実行してディレクトリが作成できていることを確認

```sh
$ bash test.sh
$ ls 
a       d       g       j       m       p       s       u       x
b       e       h       k       n       q       t       v       y
c       f       i       l       o       r       w       z
```

# 参考

https://kaworu.jpn.org/kaworu/2014-07-11-1.php

https://shellscript.sunone.me/for.html
ソリューションアーキテクト対策_VPN篇

## はじめに
試験勉強した際のメモを自分用に記事化。
内容は公式やBlack Beltの写経ですので目新しいことはありません:pray:

## VPNに関連したAWSのサービス
### AWS サイト間VPN(AWS Site to Site VPN)
オンプレミス環境とVPC間でIPsec VPNを構築し、相互のLAN同士の通信を可能にするVPCの機能。
グローバルに分散されたアプリケーションの場合、AWS Global Acceleratorと連携することで、サイト間VPNの高速化オプションはさらに優れたパフォーマンスを提供する。

### AWS VPN CloudHub
複数のカスタマーゲートウェイを使って仮想プライベートゲートウェイを作成し、サイト間接続をすることができるサービス。

### AWS Client VPN
ユーザー需要に合わせて自動的にスケールアップ・スケールダウンする、フルマネージド型で伸縮自在なVPNサービス。
クライアント端末からAWSにアクセスする際にVPNを構成して安全に接続する際に利用するVPNサービスとなっている。

### (参考)AWS DirrectConnect
専用線接続サービスとしてAWS側とオンプレ側を接続することが可能。
ただしVPNによる接続方法ではない★

## おわりに
引き続き追記します！

簡単ですが以上です。
【PowerAppsメリット集(その１）】参照列を利用するとコードが短くなる

参照列を利用した場合、ID連携に比べて、そもそも参照しているので連携（LookUp）する必要がない

例えば以下のようなモデルの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/c691fa57-a47e-fd6c-31b3-66da38b29565.png)

すでに参照されているので、以下のように記載すればデータを取得できる
```
ClearCollect(cart_and_product_cal,ForAll
    (cart_tbl,
        {
            count_products:ThisRecord.count_products,
            product_name:ThisRecord.product_tbl.product_name,
            category:ThisRecord.product_tbl.category,
            price:ThisRecord.product_tbl.price
        }
    )
);
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/67f45f71-8b41-2ce4-311e-2d8a680d0fda.png)

上記コレクションに対して各種処理　GropByなりSumなりすればよい
すごくシンプルである。

参考文献：https://m365powerapps.kagoyacloud.com/ ←　よくまとまってます
KMSカスタマー管理型キーの設定内容まとめ

# KMSとは
データの保護に使用される暗号化キーの作成と管理を行うマネージドサービス。資格においてもAWS SCSでも頻出だが、キーのタイプで「対称/非対称」といった馴染みのないワードが出てきて混乱しやすいサービスであるため、今回はカスタマー管理型キーのパラメータの設定内容がどういうものかに焦点を当ててまとめていきたい。

# 設定内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/bce09f2a-6faa-7b13-53a0-a73f5936bbac.png)
対称/非対称と書くとわかりづらいが、[[アップデート] KMS で非対称キーペア（公開鍵暗号方式）が利用できるようになったのでデジタル署名を試してみました！](https://dev.classmethod.jp/articles/key-management-service-supports-asymmetric-keys/)によると、要するに「公開鍵暗号化方式」と「共通鍵暗号方式」のことらしい。
基本情報を勉強した人なら上記の方式でピンとくるだろうが、そうでない人は[共通鍵暗号と公開鍵暗号とは](https://www.infraexpert.com/study/security4.html)を参考にしつつ、「共通の鍵を使う＝共通鍵暗号方式＝対称」、「暗号化と復号化で別の鍵を使う＝公開鍵暗号化方式＝非対称」と覚えるとわかりやすいだろう。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/42671ee3-8984-c15f-4b16-4165ac9ba407.png)
HMACは、`公開鍵、秘密鍵、ハッシュを組み合わせることで、ハッカーが情報を解凍できないようにするメッセージ認証の暗号化技術`で、例えばJSON Webトークン(JWT)、トークン化されたクレジットカード情報、送信されたパスワードなどのメッセージの信頼性を判断するために使用されるするもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/00d6e770-cf95-1389-bf1f-fd14a157645f.png)
キーマテリアルは`暗号化アルゴリズムで使用されるビット単位の文字列`で、KMSを選択すれば、そのままKMSがキーマテリアルを作成する。
独自のキーを使いたい場合は外部やAWS CloudHSMクラスターを使用したい場合カスタムキーストアを使用する。
リージョンではマルチリージョンを選択すると、1つのAWSリージョン でデータを暗号化し、再暗号化やAWS KMSへのクロスリージョン呼び出しを行うことなく、異なるAWSリージョンで復号できる。この設定をすることでディザスタディカバリが可能になったり、マルチリージョンでデータ管理ができるメリットが生まれる。

※その他はキーの表示名やタグなどなので省略。

# 参考
https://aws.amazon.com/jp/kms/

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/overview.html

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/hmac.html

https://www.okta.com/jp/identity-101/hmac/

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/importing-keys.html

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/concepts.html#key-material

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/multi-region-keys-overview.html

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/multi-region-keys-overview.html
【PowerAppsデメリット集(その3）】参照列が２階層以上になるとデータが取得できない

以下のような参照例をつかったモデルの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/31534b71-839d-7602-6b27-d0a20ec3119f.png)



この階層を１コレクションに全て展開させようとすると、１階層目は展開できるが、２階層目が展開できない　2022/09/19時点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783140/02ccbebf-2a7f-33ec-a1b4-bc0bfd5b9eba.png)


２階層以上のデータモデルを利用する場合は、参照列でなくID連携する必要がある。
参照列を利用する場合はこの制限を理解した上で利用する必要あり
Node.js忘備録 ~WEBサーバーの建て方

NodeJSを用いたWEBサーバーの作り方について忘備録です。
# 環境について
Replit.comというオンラインIDEを用いています。
全ての言語使えるので便利です。
https://replit.com

# WEBサーバー
## ファイル構成
|
|ーーindex.js
|ーーindex.html
## コード (index.js)
```javascript
//---------------------------------
// HTTPサーバー (express)
//---------------------------------
// ライブラリインポート
const express = require('express');
const app = express();
const http = require('http').createServer(app);

// "/"にアクセスがあったらindex.htmlを返却
app.use('/', express.static(__dirname + '/'));
app.get("/", (req, res)=>{
  res.sendFile(__dirname + "/index.html");
});

// 3000番でサーバーを起動する
http.listen(3000, ()=>{
  console.log("listening on :3000");
});
```
同じ階層のindex.htmlを返します。
index.htmlの中身は好きに書いてください:angel:
【GIT】"xcode-select: Failed to locate 'git', requesting installation of command line developer tools."の対処法

# はじめに
久しぶりにMacを使って個人開発をしようとしたところ、gitコマンドを叩くとタイトルにあるようなエラーが発生したので、その原因と対処法を備忘録も兼ねて簡単にまとめておきます。

# 原因
このエラーが出たときに、原因として考えたことは以下の２つです

1. xcode command line toolsがインストールできていない
1. xcode command line toolsはインストールできているが、パスが間違っている

# 対処法

まず1の「xcode command line toolsがインストールできていない」は既にインストールしてあるので、今回は該当しません。

もしインストールできていない場合は次のコマンドでインストールしてください

```
$ sudo xcodebuild -license
```

次に2の「xcode command line toolsはインストールできているが、パスが間違っている」についてです。
今回はこちらが該当しました。

まずは次のコマンドでパスを確認してみましょう。

```
$ xcode-select -p
```

/Applications/Xcode.app/Contents/Developer
このようなパスが返ってきた場合、パスが正しくないことが原因です。
なので次のコマンドで正しいパスを指定し直す必要があります。

```
$ sudo xcode-select -switch /Library/Developer/CommandLineTools
```

もう１度パスを確認し、/Library/Developer/CommandLineToolsと返ってきたら
gitは使えるようになっているはずです。
FlutterのiOSデバッグ起動時に Null check operator used on a null value

`Flutter`のデバッグ作業中、アプリ起動時に`FirebaseAuth.instance.currentUser`の部分で`Null check operator used on a null value`のエラーが出てどうにもいかなかった時の対処法です。`flutterfire_cli`で`flutterfire configure`を試したり、`XCode`のキャッシュを削除したりする前に、

- `firebase login`で確認しても`user`の確認が取れている。
- デバッグのシュミレータでなく実機での検証は成功する。
- 周りでは動いていてコードには問題がなく、アプリケーション内部のクラッシュと判断できる。

上記に該当するのであればまず、試して頂きたいのが。![スクリーンショット 2022-09-19 16.23.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134006/4753a43e-3cf1-91de-926a-6583dd7daaca.png)
`Simulator`->`Device`->`erase all content and settings...`でシュミレーター上の全ての設定/コンテンツを消去してリセットしてみましょう。