OmniAICreator/Qiita-1.07M huggingface dataset:
【Dockerfile】Hyper-V→WSL2へ移行時にハマったところのメモ

いろいろ古くて、そもそもビルドすら通らず苦労したのでメモを残す。

<h2>移行手順</h2>
以下に従う。

https://qiita.com/KoKeCross/items/a6365af2594a102a817b

<h2>躓いた個所
<h3>EPEL(Extra Packages for Enterprise Linux)のインストール先のパス変更</h3>
<h5>【該当箇所】</h5>`RUN dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm`
<h5>【エラー内容】</h5>ビルド時にエラーが発生。
`executor failed running [/bin/sh -c dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm : exit code: 1`
<h5>【対応方法】</h5>
`dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm`

↓（バージョンは適宜合わせる必要あり）

`dnf install https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/e/epel-release-8-6.el8.noarch.rpm`
<h5>【参考URL】</h5>https://w.atwiki.jp/sanosoft/pages/137.html
<h3>Docker Windows (WSL2) で CentOS6等の古いコンテナが Exited (139) で起動しない</h3>
<h5>【該当ファイル】</h5>`%USERPROFILE%/.wslcofig`
<h5>【対応方法】</h5>以下の設定を追加後、PC再起動

```txt:%USERPROFILE%/.wslconfig
[wsl2]
kernelCommandLine = vsyscall=emulate
```

<h5>【参考URL】</h5>

https://qiita.com/nakat-t/items/271071eeb0c0c9143396

https://github.com/microsoft/WSL/issues/4694

<h3>フレームワークのサポート切れ</h3>
<h5>【該当ファイル】Dockerfile</h5>
<h5>【エラーの内容】</h5>
`The specified framework can be found at:- https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=2.2.0&arch=x64&rid=debian.10-x64`
<h5>【対応方法】</h5>
.NetFramework2.2→.NET5へバージョンアップし、イメージの取得方法を変更
※上記バージョンアップした後はソースの修正も必要になるので注意が必要。

`FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base`
→
`FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base`

<h3>dotnetのcopyの記載方法が変更</h3>
<h5>【対応方法】</h5>
`COPY 〇〇/△△.csproj 〇〇/`
`RUN dotnet restore 〇〇/△△.csproj`
↓
`COPY 〇〇/*.csproj . `
`RUN dotnet restore`
<h5>【参考URL】</h5>
https://github.com/dotnet/dotnet-docker/blob/main/samples/dotnetapp/README.md
<h2>
2021/10　エンベデッドシステムスペシャリスト試験一発合格に向けて（逐次更新）

###2021年10月に行われる、IPAの情報処理技術者試験「エンベデッドシステムスペシャリスト」試験の一発合格を目指します。

##１．目的
##２．試験内容
##３．参考書
・[情報処理教科書 エンベデッドシステムスペシャリスト 2021～2022年版](https://www.amazon.co.jp/gp/product/B08DXD4LCY/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)

・エンベデッドシステムスペシャリスト　「専門知識＋午後問題」の重点対策　第５版 (重点対策シリーズ)
##４．勉強スケジュール
■2021/9/8(水),2021/9/9(木)
参考書10章（午前2対策）
1.コンピュータ構成要素
1-26
2.システム構成要素
27-30
3.ソフトウェア(os,メモリ)
物理メモリ、論理メモリ、ページング
31-52
4.ハードウェア
53-74
5.ネットワーク
75-77
6.セキュリティ
78-80
7.システム開発技術
81-92
8.ソフトウェア開発管理技術
93-96
9.ビジネスインダストリ
97-100
■2021/9/10(金)〜2021/9/12(日)
午前２対策（参考書）
　4章：ハードウェア
参考書11章（午後対策）
参考書12章（午後1,2対策）
実績
9/11
午前2：フリップフロップ、スイッチ、エンコーダー
午後1対策：H31問2
9/12
午後1対策：H30問1
■2021/9/13（月）〜2021/9/15（水）
参考書12章（午後1,2対策）
午前１対策（参考書、過去問）
午前２対策（参考書、過去問）
 実績
 9/13
 午前1対策：R2/10 20/30
 間違えた問題：5,10,14,16,19,22,23,24,27,30
 午後1対策：H30問2
 9/14
 午後1対策：H29問1 6/11 H29問2 12/20
 9/15
 午前1対策：
 午後1対策：R2問1 10/13
 午後2対策：H30問1 1/16
■2021/9/16(木)～2021/10/1(金)
午前１対策（https://www.ap-siken.com/）
午後１対策（過去問）
午後２対策（過去問）
実績
 9/16
 午前1対策：ストラテジ系
 午後1対策：H31問1 1/2（計算問題のみ）
 午後2対策：
 9/17
 午前1対策：
 午後1対策：H30問2 1/2（計算問題のみ）H29問2 設問1(1) 1/1
 午後2対策：
 9/18
 午前1対策：テクノロジ系（ハードウェア）
            マネジメント系（システム監査 11/63 間違えた問題:6,7,11）
 午後1対策：H29問2 設問3 4/3
 午後2対策：
 9/19
 午前1対策：テクノロジ系（ハードウェア）
            マネジメント系（）
 午後1対策：R2問2 設問3 間違えた問題:(1),(3)
 午後2対策：
 9/20
 午前1対策：テクノロジ系（ソフトウェア、ハードウェア）
            マネジメント系（）
 午前2対策：H31/10 18/25
 間違えた問題：1,5,12,13,14,21,25
 午後1対策：
 午後2対策：
 9/21
 午前1対策：
 午前2対策：
 午後1対策：H28問2 6/11
 午後2対策：
 9/22
 午前1対策：
 午前2対策：H28 17/25
 午後1対策：H28問1 1/11
 午後2対策：
 9/23
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：H30問2
 9/24
 午前1対策：
 午前2対策：H30 21/25
 午後1対策：
 午後2対策：H30問2 (2),(3) 6/11
 9/25
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：H31問1 9/11
 9/26
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：H29問2 0/12
 9/27
 午前1対策：
 午前2対策：
 午後1対策：H31問2 (3)
 午後2対策：
 9/28
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：H31問2 (1)
 9/29
 午前1対策：
 午前2対策：
 午後1対策：H29問1
 午後2対策：
 9/30
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：
 10/1
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：H30問2 2(1)(2) 2/4

■2021/10/2(土)～2021/10/9(土)
過去問演習
 10/2
 午前1対策：
 午前2対策：
 午後1対策：
 午後2対策：
 10/3
 午前1対策：
 午前2対策：
 午後1対策：H24問1
 午後2対策：
 10/4
 午前1対策：
 午前2対策：
 午後1対策：H24問1 11/13
 午後2対策：H29問2
 10/5
 午前1対策：
 午前2対策：
 午後1対策：H26問1 7/9
 午後2対策：
 10/6
 午前1対策：R2 10月 22/30
 午前2対策：
 午後1対策：
 午後2対策：H28問2
 10/7
 午前1対策：R3 4月 18/30 
 午前2対策：
 午後1対策：
 午後2対策：H23問2
 10/8
 午前1対策：
 午前2対策：H29 4月 20/25
 午後1対策：H30問2
 午後2対策：H25問2
 10/9
 午前1対策：H29 4月 25/30
 午前2対策：
 午後1対策：
 午後2対策：

###午前１対策
分野

###午前２対策
分野
1.コンピュータ構成要素
2.システム構成要素
3.ソフトウェア(os,メモリ)
4.ハードウェア
5.ネットワーク
6.セキュリティ
7.システム開発技術
8.ソフトウェア開発管理技術
9.ビジネスインダストリ
###午後１対策
分野

###午後２対策
分野

##令和3年試験を終えて
昨年より、易しかったのではないか？
Win11最低動作スペックについて（無理やり動作させたときの）

## Win11最低動作スペック

* 3ケタ台のCore i3などは 起動途中でOSシャットダウンされる。
* 4ケタ台のCore i3などは 動作しました。
    * メモリ3GBでも遅いながらに動作しました。

## win10からのアップグレード

* Windows 11 TPM2.0 / SecureBootチェック回避レジストリ

```vb
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\Setup\LabConfig]
"BypassTPMCheck"=dword:00000001
"BypassSecureBootCheck"=dword:00000001
"BypassRAMCheck"=dword:00000001
```
【TypeScript】"同じkeyがありますよ"エラーの解消

# keyが重複していますよ問題
とある開発をする中で、ずっと出現していたエラー。

```
Warning: Encountered two children with the same key, `d437cb80-1b43-4e2b-8009-6e08eddee864`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.
```
超初歩的なものですが、解決法が見つかったのでシェアいたします。

# mapメソッドの引数にindexを渡す
該当箇所に、下記のように`post.id`を渡していたのですが、これだと新しいデータを作成したときに、その`id`が重複してしまっていたみたいです。

```sample.tsx
  {posts.map((post: any) => (
            <span key={post.id}>
              <PostItem post={post} />
              <Divider component="li" />
            </span>
          ))}
```
これを、下記のように`index`を渡したところ、

```sample.tsx
  {posts.map((post: any, index) => (
            <span key={index}>
              <PostItem post={post} />
              <Divider component="li" />
            </span>
          ))}
```
無事にエラーは消えました。

# まとめ
mapメソッドに関する初歩的なエラーだと思うのですが、やはり基礎的な勉強が足りていない気がします。

現在取り組んでいる開発を進めつつも、今一度しっかり基礎から学ぶ必要性がありそうです。


# 参考記事
https://sentry.io/answers/defining-proper-key-in-props/
sklearn.datasets.openmlの仕様

#sklearn.datasets
datasetsの中には様々なデータセットが用意されている。詳細は次のリンクを参照。
[scikit-learnのサンプルデータセットの一覧と使い方](https://note.nkmk.me/python-sklearn-datasets-load-fetch/)

#datasets.fetch_openml
`return = datasets.openml(parameters)`でデータセットを取得することが可能。parameterでどのデータを取得するのか、どのような形式で取得するのかを指定する。
以下は公式ドキュメントの解説
[sklearn.datasets.fetch_openml](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_openml.html#sklearn.datasets.fetch_openml)
##parameters
*sklearn.datasets.fetch_openml(name: Optional[str] = None, *, version: Union[str, int] = 'active', data_id: Optional[int] = None, data_home: Optional[str] = None, target_column: Optional[Union[str, List]] = 'default-target', cache: bool = True, return_X_y: bool = False, as_frame: Union[str, bool] = 'auto')[source]¶*

__name：str, default=None__
データセットの名前を文字列で与える。同じ名前のデータセットが存在するので、その場合はIDで指定する。IDと名前で同時に指定してはいけない。

__version：int or ‘active’, default=’active’__
nameが指定されている場合のみ与えることができる。データセットのバージョン。activeにすると最も古いバージョンが指定される。

__data_id：int, default=None__
データセットID。データセットに対し1対1で対応している。nameとversionを指定するか、IDを指定するかをえらぶ。

__return_X_y：bool, default=False__
このオブジェクトは戻り値としてデフォルトでBunchを返す。Bunchは辞書型のようなものらしい。この変数をTrueにすると、データと目的変数を別で戻り値として設定する。それはnp.arrayやpd.Seriesなどで返すことができる。
【忙しい人のための】Azureの基礎第6部【AzureのコストとSLAについて】

AzureについてMS Learnで勉強される場合、第5部は1時間10分のラーニングパスになっています。
ここでは、自身の勉強の復習も兼ねて、MS Learn Azureの基礎第6部の要点をまとめておきますので、Azureの情報を素早く知りたいという方の参考になれば幸いです。
自身の勉強の力点を踏まえて記述するので、詳細な情報を得たい方はMS Learnにアクセスください。

本家様

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-azure-cost-management-service-level-agreements/

第5部はこちら

https://qiita.com/enurinri/items/9d814e6a5f661d6bc3ba

# Azureのコスト計画と管理
## TCO計算ツール
[TCO計算ツール](https://azure.microsoft.com/ja-jp/pricing/tco/)を使うと、オンプレミス環境から移行してAzureソリューションを運用した場合の時間経過に伴うコストの削減を見積もり可能。
使用する際は、

1. ワークロードの定義：サーバ・データベース・ストレージ・ネットワーク etcの選択
1. 前提条件の調整：電気料金・賃金・メンテコスト etcの設定
1. レポートの表示

の手順

## Azureサービスの購入手段
#### エンタープライズアグリーメント(EA)
主に大企業向けで、Microsoftと直接契約。
３年間Azureサービスに対して所定の金額を支払い、年間での最低使用量を約束するが、利用料金の割引サービスも存在。

#### Webダイレクト
従量課金制に従って利用料金を支払う。

#### クラウドソリューションプロバイダ(CSP)
主に中小企業向けで、Azure上でのソリューション構築を支援するMicrosoftのパートナー(=CSP)を経由して購入。
支払いや割引もCSPに依存。

## コストに影響を与える要因

- リソースの種類：サービスの種類・パフォーマンスレベル・アクセス層
- 使用状況
- Azureサブスクリプションの種類：無料使用版 or 従量課金制プラン or メンバープラン
- リソースをデプロイ・プロビジョニングするリージョン
- ネットワークトラフィックの課金ゾーン

## Azureのコスト削減
コスト削減の方法として、

- 使用率の低いVMのサイズを変更
- 業務時間外でVMの割り当てを解除：この時間VMには課金されないが仮想ディスクには課金発生
- 使用されていないリソースを削除
- IaaSサービスをPaaSサービスに移行
- ライセンスコストを節約：効率のいいOSを使用・Azureハイブリッド特典(Microsoft製品に紐づくライセンス)

などが存在。
これを実現する上で有用なツールとして

- **Azure Advisor**：使用率の低いリソースを明らかにする and 削除可能な未使用リソースを推奨
- Azureサブスクリプションに対して使用制限を課す
- **Azure Reservations**：利用料金を１年または３年分前払いすることで、従量課金料金を最大72％削減するサービス
- **Azure Cost Management**：Azureの利用コストの計画・分析・最適化を行うツール

が存在。

# AzureのSLAとサービスライフサイクル
## SLA(サービスレベルアグリメント)
SLAとは、サービス提供者と利用者の間の合意事項であり、Azureにおいては稼働時間や接続などに関するサービスを保証するものでMicrosoftと利用者間の契約。
特に、**月間稼働率**は最も一般的なSLAであり、Azureにおいては

- ２つ以上の可用性ゾーンに複数台のVMを配置 →99.99%
- 同じ可用性セットに複数台のVMを配置 →99.95%

を保証。
アプリケーション設計の際には、その安定性を保証するためSLAを考慮する必要。
複数のSLAから複合SLAを算出する時は、各SLAを掛け合わせる。

## サービスライフサイクル
Azureサービスのリリースは、
開発→**パブリックプレビュー**→一般提供(GA)
のフローに従う。
パブリックプレビューは、全てのユーザに対してサービスや機能に対する評価や改善要求を得るため、無料もしくは安価で新機能を提供する。
パブリックプレビューはAzure Portalから利用可能だが、SLAが設定されていない為、運用環境でパブリックプレビュー中の機能を利用することは非推奨。
【rails】stylesheets直下の全てのCSSが読み込まれる原因

## railsのCSSの読み込みについて
railsでCSSは`stylesheets/application.scss`に記述するが、
上記以外の```stylesheets```直下のCSSファイルが自動で、
読み込まれていることがあり疑問に思った

## 原因
```stylesheets/application.scss
 *= require_tree .
 *= require_self
```

上記の記述により、stylesheets直下のCSSファイルはすべて読み込まれるようになっていた。
さらに詳しく言うと、

```
 *= require_tree .
```
この部分が```application.scss```自身の読み込むという記述。

```
 *= require_self
```
この部分が```stylesheets```直下のCSSファイルを順番に読み込むという記述。

そのため、slickなどを読み込む際に、
わざわざ```application.html.erb```に以下のように記述せずとも、
自動で読み込まれる。

```
<link rel="stylesheet" type="text/css" href="slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="slick/slick-theme.css"/>
```
さくらのクラウドでSorryサーバ

# さくらのクラウドでSorryサーバ
ロードバランサを使ってSorryサーバを実装してみた。
## 構成
構成はこんな感じ
![構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85550/4b7d26d7-9bf2-2190-8205-53ccc22de0c6.png)
上から

*  rtsw01 - ルータ+スイッチ
*  vpcrt01 - VPCルータ
*  switch01 - スイッチ
*  websv01 - WEBサーバ(centos8)
*  sorry01 - sorryサーバ(centos8)
*  lb01 - ロードバランサ

## ロードバランサ設定
ロードバランサに設定するものは、

* ロードバランサのIPアドレス - 今回は192.168.1.250
* ロードバランサの仮想IP(VIP) - 今回は192.168.1.10
* 実サーバのIPアドレス - 今回は192.168.1.1
* sorryサーバのIPアドレス - 今回は192.168.1.2

### ロードバランサ - [VIP]
ここでは仮想IPとsorryサーバのIPアドレスを指定する。

![VIP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85550/b777e18f-847e-98c1-24e3-c16004e5301d.png)

### ロードバランサ - [実サーバ]
ここでは監視する実サーバのIPアドレスやパスを指定する。
ここで設定した実サーバが全てDOWNするとsorryサーバへとアクセスが切り替わる。

![実サーバ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85550/01e206c0-b69e-6d91-d902-a148e7e2fa64.png)

### VPCルータ - [NAT] - [スタティックNAT]
今回はVIPをNAT変換して外部からアクセスする。

![NAT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85550/b09e1f63-bea1-e274-2592-2d3e71bd23bd.png)

## 実サーバ、Sorryサーバの設定
### 実サーバ、Sorryサーバ共通の設定

#### sysctl.confの設定追加

``` /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.al.arp_announce = 2
```

#### ダミーインターフェース(cent8)、ループバックアドレス(cent6/7)の設定

##### ダミーインターフェース

```
nmcli connection add type dummy ifname dummy0 ipv4.method manual ipv4.addresses 192.168.1.10/32 ipv6.method ignore
```

##### ループバックアドレス `/etc/sysconfig/network-scripts/ifcfg-lo:0`

``` 
DEVICE=lo:0
IPADDR=192.168.1.10
NETMASK=255.255.255.255
```

詳しくは割愛、以下を参照
> ロードバランサ - 導入設定
> https://manual.sakura.ad.jp/cloud/network/load-balancer.html#id13

### Sorryサーバの設定

#### httpd.confの設定
末尾に以下を追記

``` /etc/httpd/conf/httpd.conf
ErrorDocument 503 /index.html

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{REQUEST_URI} !=/index.html
  RewriteRule ^.*$ - [R=503,L]
</IfModule>

<IfModule mod_headers.c>
  Header set Retry-After "Mon, 1 Dec 2014 9:00:00 GMT"
</IfModule>
```

詳しくは割愛、以下を参照
> 【TIPS】ロードバランサにソーリーサーバを追加 - 3.ソーリーサーバの構築
> https://cloud-news.sakura.ad.jp/2016/04/14/loadbalancer-add-sorry/
【Python】macOSでcronを自動実行し続けたら意外と電気代高かかった

#はじめに
昨日以下の記事を書きました。

https://qiita.com/hirockio2206/items/5055c44246ca5239d3da

私は1時間に1回Pythonを自動実行しLineへ通知していましたが、しばらくすると通知が止まっていました・・・。

初心者あるあるかもしれませんが、macOSがスリープモードになっていたのです。
cronはスリープ状態だと定期実行してくれません。

そこで今回はcronを自動実行し続けるためのmacOSの省電力設定をご紹介します。
また24時間使い続けるとどれくらい電気料金がかかるのかも計算してみました。

#環境
Python3.9
macOS Catalina10.15.7

#方法
アップルマーク　＞　システムの環境設定　をクリックします。

![スクリーンショット 2021-09-14 10.29.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/5b8a47d6-92e5-57fb-f325-37e89f4ddbd4.png)

省エネルギー　をクリックします。
![スクリーンショット 2021-09-14 10.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/9f6ae5b0-0db8-3d59-27b2-85085329fe27.png)

コンピューターのスリープを　10分　→　しない　に設定します。
![スクリーンショット 2021-09-14 10.32.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/406ff7ad-5085-9020-f864-ad73b43b3a0e.png)

この設定にすると、コンピュータの消費電力が増加する可能性があります。
OKをクリックします。（Appleさんの優しさ・・・）

![スクリーンショット 2021-09-14 10.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/3df42f54-a7e1-b3cc-0fbd-17d10c52c44c.png)

以上で設定完了です。

#消費電力
どれくらい消費するのか計算してます。
まず私のmacのスペックですが、以下となります。

![スクリーンショット 2021-09-14 10.49.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/e90a29b2-d09d-b8e3-8c4f-64b2b89ac885.png)

待機中として80Wで計算します。
計算式は以下ですね。

```
1時間あたりの消費電力（kW）×使用時間（時間）×料金単価（円/kWh）
```

＜我が家の条件は以下＞
　1時間あたりの消費電力（kW）=0.08kW (80W)
　使用時間（時間）=24時間
　料金単価（円/kWh）= 21円　(利用明細から算出※1)

 ※1 基本料金、朝晩時間、夜間時間などがありますが、今回は平均で21円としています。

```
0.08kW　×　24時間　×　21円　= 40円
```

え？？1日40円かかる!?1ヶ月で約1,200円!?

正直、高いですね。
常に0.08kWかどうかはわかりませんが、試算上は間違ってないかと存じます。。。
むしろもっと消費電力は高い可能性もありますね。

####どうすれば電気代を下げれるか。
実行環境をクラウドにする方がいいかもですね。
先日、HP運用に関して以下の記事を書きました。

https://qiita.com/hirockio2206/items/41402fddc4cf017d4822

AWSでS3+Route53の利用で月額181円程度です。(初年度)

Pythonを定期実行するなら、AWS Lambda＋Amazon CloudWatch
を利用する方が安く済むかと存じます。

早くAWS移行しようと思った一日でした・・・。

ご参考になれば幸いです。
Node.jsでJsonを操作する

Nodebrewで入れた`Node.js 14.x`です。

できるだけ環境に依存しないような標準のモジュールで頑張ろうと思ってる。

NodeでJson（文字列）から特定の値を取り出す方法
以下はstatusキーの２００を文字列として取り出す方法。


```jsonobj.js
    //API Response sample
    let apiresult = '{"header": {"status": "200","error_message": ""},"response": {}}'

    let json_obj = JSON.parse(apiresult)

    console.info("オブジェクトすべて:", json_obj)
    // パターン１
    // 型チェック
    console.info(typeof(json_obj.header.status));
    // 出力
    console.info(json_obj.header.status);

    // パターン２
    // 型チェック
    console.info(typeof(json_obj["header"]["status"]));
    // 出力
    console.info(json_obj["header"]["status"]);

```


```bash
$ node jsonobj.js
オブジェクトすべて: { header: { status: '200', error_message: '' }, response: {} }
string
200
string
200

```


Nodeって難しいですね。
書き方色々あるし、いまいち基本的な使い方が解らない。
なのでそういうナレッジを書き溜めていこう
STM32G031をVSCのcubeideでLチカ


目的
軽量化
物凄く雑な方法で非推奨
初期ブート環境で無理やりLチカさせる。

mainは下記の内容

適当にコピー
main.h
stm32g0xx_hal_conf.h
stm32g0xx_it.h

ヘッダー

https://os.mbed.com/users/caa45040/code/f303_h_p1/


![h_con70.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f0e08ac6-1d12-d958-77b2-3e3f388569a6.jpeg)



```c++


#include"main.h"

int main() {

  __HAL_RCC_GPIOA_CLK_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

//HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);


    while(1) {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET);
        
        for(int ii=0;ii<10000;ii++) for(int jj=0;jj<100;jj++){}

        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
        
        for(int ii=0;ii<10000;ii++) for(int jj=0;jj<100;jj++){}

    }

}



```
.com Master ADVANCE 試験対策備忘録 (5/5)

備忘録No.5です。

# ICTの活用と法律

## 電子書籍のフォーマット

|フォーマット名|内容|拡張子|
|---|---|---|
|EPUB|IDPFが2007年9月に策定したフォーマット。XMLベースで構造化データを持つことが可能。|.epub|
|PDF|アドビシステムズが開発したフォーマットで原稿のイメージをかなり正確に表現可能。|.pdf|
|AZW|アマゾンのKindle用フォーマット|.azwなど|
|DAISY|デイジーコンソーシアムが開発を行っているフォーマットで視覚障害者向けの国際規格|.smiなど|
|ebi.j|イーブックイニシアティブジャパンが開発したフォーマットでeBookと呼ばれることが多い|.ebi|

## 著作権の制限

|許可される行為|説明|
|---|---|
|ミラーリング|負荷分散のためのミラーサーバへのミラーリング|
|バックアップ|故障に備えたデータのバックアップ|
|キャッシュ|データを直接持つサーバと異なる、ユーザに近い位置でのキャッシュとしてのデータ保持(フォワードキャッシュ)|

## 検索サービスと著作権

|許可される行為|説明|
|---|---|
|ストレージ|検索サービスのストレージ内に検索結果の一部を複製可能|
|インデックス|コンテンツの一部を説明する説明文を加工して蓄積|
|スニペット|検索結果画面に表示される検索対象を紹介する(文章の抜粋)|
|サムネイル|検索結果画面に表示される画像(一覧表示しやすい様に解像度を小さくした画像)|
|プレビュー|検索結果画面に表示される動画(一覧表示用に数シーンだけ切り出した動画)|

# Referece
* [.com Master教科書 .com Master ADVANCE 第3版 (2019年;翔泳社)](https://www.shoeisha.co.jp/book/detail/9784798161389)
.com Master ADVANCE 試験対策備忘録 (4/5)

備忘録No.4です。

# セキュリティ

## 情報セキュリティの3要素

|要素|説明|対策|
|---|---|---|
|機密性(Confidentiality)|情報が定められたルール通りに保護され、アクセス権を持っている人のみが情報にアクセス出来ること。|ユーザ認証<br>暗号化|
|完全性(Integrity)|情報の改竄を防ぎ、そのまま正しい状態で維持されること。|電子署名<br>改竄検知|
|可用性(Availability)|必要に応じて情報にアクセス可能なこと。|負荷分散<br>冗長構成|

## 共通鍵暗号方式

|アルゴリズム|説明|
|---|---|
|DES|DES(デス:Data Encryption Standard)は1976年に米国の国家暗号企画に最小されたアルゴリズム。鍵長が56bitと短く、現在では暗号強度がやや弱い。DESを3回繰り返すことで強度を高める3DESも有る。|
|RC4|RC4(Ron's Code 4)はWEPやWPAなどで利用されている。鍵長は様々。|
|IDEA|IDEA(International Data Encryption Algorithm)はPGPなどで利用されている。鍵長は128bit。|
|AES|AES(Advanced Encryption Standard)は米国の新暗号規格として2001年採用された暗号アルゴリズム。鍵長256bit。WPA2などで利用。|

## ストリーム暗号とブロック暗号

|#|ストリーム暗号|ブロック暗号|
|---|---|---|
|暗号化の単位|1bytもしくは1bitごと|64bitや128bitなどの固定長|
|アルゴリズム|RC4|AES, DES|
|特徴など|暗号化前と暗号化後のデータサイズが同じ<br>音声通信などリアルタイム性が必要なものに利用。|実装が比較的容易で、多数のアルゴリズムが研究されている。<br>伝送誤りが有った場合、ブロック全体に影響が及ぶ。|

## IPsec

|プロトコル|説明|
|---|---|
|AH(Authentication Header)|認証ヘッダ。IPパケットの認証と改竄を防ぐ機能を持つ。|
|ESP(Encapsulating Security Payload)|暗号ペイロード。IPパケットの認証と改竄防止及び暗号化機能を持つ。|
|IKE(Internet Key Exchange)|自動鍵交換プロトコル。IPsecのネゴシエーションを自動化し、暗号化するために必要な鍵を安全に交換する。|

## HTTPにおける認証

|認証|説明|
|---|---|
|ベーシック認証|平文による認証|
|ダイジェスト認証|チャレンジ・レスポンス方式による認証|

## ソーシャルエンジニアリング

|手口|対策|
|---|---|
|管理者の振りをしてして偽電話を掛ける|電話での問い合わせで認証情報を教えない。|
|パスワード入力を覗く|パスワード入力時には背後に気を付ける。|
|席を離れた際にPCを操作する|ログオフや画面ロックをして席を立つ。|
|ゴミ(メモやCDなどのメディア)を漁って情報を探す|シュレッダーを使用。|
|廃棄コンピュータのHDDから情報を復元する|市販の専用ソフトウェアでデータを完全に消去する。|

## 脆弱性情報提供サイト

|サイト|説明|
|---|---|
|US-CERT Vulnerability Notes Database<br>(http://www.kb.cert.org/vuls)|米国のUS-CERTが発表している脆弱性情報データベース|
|NVD(https://nvd.nist.gov/)|米国のMITRE社が発表している脆弱性情報データベース。CVE番号という脆弱性の識別IDで有名。|
|JVN(http://jvn.jp/)|JPcertコーディネーションセンターとIPAが共同で運用している脆弱性対策のための情報サイト)|
|Microsoft Security Response Center|MS製品のセキュリティ対策情報サイト|

## WPA/WPA2における認証

|認証モード|説明|
|---|---|
|Enterpriseモード|IEEE 802.1X規格である。ユーザ認証に専用認証サーバ(RADIUS)が必要。|
|Personalモード(PSK)|パスフレーズという文字列をアクセスポイントとクライアントに設定することで認証。家庭内LANではこちらを利用するのが良い。|

## メールプロトコルの暗号化

|規格|ポート番号|特徴|
|---|---|---|
|POPS|TCP 995|POP3をSSL/TLSで暗号化|
|IMAPS|TCP 993|IMAP4をSSL/TLSで暗号化|
|SMTPS|TCP 465|SMTPをSSL/TLSで暗号化|
|STARTTLS|TCP 25(SMTP)<br>TCP 110(POP3)|SMTPやPOP3の通信を平文で開始し、双方がSTAARTTLSに対応していた場合は暗号化通信に切り替え。|

## メールの暗号化

|暗号化方法|説明|
|---|---|
|PGP|認証局を利用せず、「信用の輪」によって信頼性が担保された公開鍵を使用する暗号化規格。認証局を利用しないため無料で利用できるが、「信用の輪」の仕組みは不特定多数が参加するコミュニティには適さない。|
|S/MIME|CA(認証局)による電子証明書を利用したメール本文の暗号化規格。基本的には有料の電子証明書を購入する必要が有る。最近では一部サービスで無償の電子証明書を発行するものも有る。|

# Referece
* [.com Master教科書 .com Master ADVANCE 第3版 (2019年;翔泳社)](https://www.shoeisha.co.jp/book/detail/9784798161389)
Node.js/Express+TypeScriptでWeb API作成

# はじめに

Node.js + Express + TypeScript を使用して Web API を作成する。Express を扱うのは始めてのため、[公式サイト](https://expressjs.com/)を参考に進める。実行環境は以下。

- Node.js: 14.17.6
- npm: 6.14.15
- Express: 4.17.1
- TypeScript: 4.4.3

# TypeScript 環境の作成

まず TypeScript 環境を作成する。

```bash
$ npm init -y
$ npm install -D typescript @types/node ts-node
$ npx tsc --init
```

# Express のインストール

つづいて Express とその型定義をインストールする。

```bash
$ npm install express
$ npm install -D @types/express
```

# Hello World Example

以下コードで簡単な実行を試すことができる。

```typescript:app.ts
import express from 'express';

const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})
```

# 実行確認

上記で作成した `app.ts` を実行する。

```bash
$ npx ts-node app.ts
Example app listening at http://localhost:3000
```

別のターミナルを立ち上げて以下コマンドを実行すると、`Hello, World!` が返ってくることが確認できる。

```bash
$ curl http://localhost:3000
```

# おわりに

公式チュートリアルにしたがって、Express の実行を確認した。より詳細な理解を行うため、上記で作成したプログラムではなく、すでにひな形として準備されている [express-generator](https://github.com/expressjs/generator) や TypeScript 用に作成されている [express-generator-typescript](https://github.com/seanpmaxwell/express-generator-typescript#readme) も試してみたい。
データサイエンティスト検定を受験してきた！

## はじめに
ども。見習いデータサイエンティストです。
皆さんデータサイエンティスト検定ってご存知ですか？

先日新しく始まった、「データサイエンティストってなんだ？」「そもそも何を勉強したらいいんだ？」という疑問を解決してくれる試験です！

今回はその第一回目試験を受講してきたので、勉強法や感想などを書いていこうと思います。

#1 そもそもデータサイエンス検定(DS検定)とは
昨今では、数理・データサイエンスを必修化する大学が現れるほど、データサイエンスは今後の社会に必要だと認識されています。

このデータサイエンス教育のカリキュラムの作成や必須スキルのチェックリストを作成しているのがデータサイエンティスト協会です！

データサイエンティスト協会は、作成したスキルチェックリストをもとに、データサイエンティストの否ライトしての技術があることを示すための検定を始めました。
https://www.datascientist.or.jp/dskentei/

データサイエンティスト検定では、ビジネス力・データサイエンス力・データエンジニア力の３つを軸に習熟度を判定します。![スクリーンショット 2021-09-14 10.16.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1136943/9aa1f7f4-adb9-4243-abb7-6dc3c3227009.png)

より詳しい説明は、協会のホームページやVtuberのAlica Solidさんが動画にしてくださっています。
https://www.youtube.com/watch?v=FxJnDJP2jNg

現在は第一回目の申込みを締め切っています；；
興味のある方は公式ページの第二回のお知らせを待ちましょう！

#２ 自分の資格とテストの結果
自分は現在資格として、G検定2021#2・python3エンジニア認定試験などの資格を保有しています。
そのためデータサイエンス分野については、かんたんな復習のみで試験に向かいましたが、どの程度の知識が必要かは後ほど記そうと思います。

またテスト結果については、
1. データサイエンス分野 88%
2. データエンジニアリング 76%
3. ビジネス分野 95%
で総合86%でした！これで合格点90%以上とかだったら泣くしかない、恥。

#3 どんな勉強をしたか
この章では、DS検定ではどの程度の知識が必要か・私がやったことの２つに分けて書こうと思います

###DS検定に必要な知識量
DS検定の範囲はかなり広いです。
データサイエンス分野だけでも、統計検定３級・行列入門書１冊・分析準備(データ加工・データ量削減)・機械学習手法(言語・画像・時系列分析 etc...)
これそれぞれで資格試験あるぐらいなので範囲の広さがわかりますね。範囲が広いので範囲を参考にそれぞれの試験を受けるのも手だと思います。

ですが実際にDS検定に受かるためだけであれば、範囲の単語の意味さえ説明できれば合格できます。
たとえば、分散の公式かけますか？クラスタリングと分類問題の違いがわかりますか？程度で大丈夫です。

DS協会が参考問題を提示しています。
https://www.datascientist.or.jp/common/docs/practice_v1.1.pdf

###どんな勉強をしたか
まずは範囲の把握をします。
githubにスキルチェックリストがあるのでこちらが参考になると思います。
https://the-japan-datascientist-society.github.io/skills-checklist-viewer/#

自分は時間がなかったため、DS協会の公式テキストを購入し一通り流し読みしました。
この中の項目でわからないところ、忘れているところを一通りメモします。
※G検定取得者が注意するのは、データエンジニアリング・ビジネス・AIについての倫理の部分はG検定のは範囲にはないので調べたほうがいいでしょう

公式テキスト買ってない方はチェックリストの星１を一通り確認しましょう

メモの内容をひたすら検索していきます。神様仏様qiita様です。

公式テキストには模擬問題があるので、これを用いて知識の確認をしました。一度しか説いてないので案の定苦手なエンジニアリングはボロボロでした；；



#4　感想
DSに必要な知識が体系的に得られるのは最高すぎますね。
自分はエンジニアリングが苦手で、どういうふうに分析して行くか思いついても、どんな構成で実装すべきかなどはわからないので、その学習の手がかりがこの検定で得られたと思います。
概要はつかめたのでガリガリ勉強していきます！！
Github コマンド　基本中の基本　初期化とアップロード

Githubコマンドの基本中の基本である初期化からアップロードまでのコマンドです。



###初期化
```
git init 
```
###ステージング
```
git add .
```
###コミット
```
git commit -m "メッセージ"

//コミットメッセージなしのコマンド
git commit -a --allow-empty-message -m ''
```

###初めての場合アップロードURLを指定する
```
git remote add origin URL
```

###二回目移行の場合はこのコマンド
```
git push origin master
```
Githubコマンド SSH接続する方法

# GithubコマンドでSSH接続する方法


##ユーザーを設定
```
git config --global user.name [アカウントののユーザ名]
git config --global user.email [アカウントのメールアドレス]
```
登録されているか確認

```
git config --list
```

##.sshディレクトリに移動 (ファイルがない場合は作成)
```terminal
shigurechan@shigurechan-System-Product-Name:~$ ls -a
.              .bashrc   .gitconfig  .java   .mozilla  .sudo_as_admin_successful  .vimrc.swp  snap          ドキュメント  公開
..             .cache    .gnupg      .local  .pki      .vim                       .vscode     ダウンロード  ビデオ
.bash_history  .config   .gradle     .m2     .profile  .viminfo                   .wget-hsts  テンプレート  ピクチャ
.bash_logout   .emacs.d  .groovy     .mozc   .ssh      .vimrc                     program     デスクトップ  ミュージック
shigurechan@shigurechan-System-Product-Name:~$ cd .ssh
shigurechan@shigurechan-System-Product-Name:~/.ssh$ ls
known_hosts
```
##鍵を生成
```
ssh-keygen -t rsa -b 4096 -C "hogehoge@fuga.com" #自分のメールアドレスを指定
 # -t 暗号化方式を指定
 # -b 暗号化強度を指定
 # -C コメントを設定 

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ts/.ssh/id_rsa): id_rsa_github # 秘密鍵の名前を指定
Enter passphrase (empty for no passphrase):  #パスワードを入力
Enter same passphrase again:  # もう一度入力
Your identification has been saved in github_rsa.
Your public key has been saved in github_rsa.pub.
```
##生成した鍵を確認
```
shigurechan@shigurechan-System-Product-Name:~/.ssh$ ls
id_rsa  id_rsa.pub  known_hosts
```
##configファイルを作成
```
shigurechan@shigurechan-System-Product-Name:~/.ssh$ vim config
```
Insertキーを押してvim等のコマンドでファイルを作成して以下の文字をコピペして保存 
※保存方法(ESCキーを押して　：ｗｑ)

```
Host github
HostName github.com
IdentityFile ~/.ssh/id_rsa
User git
```

##Githubに公開鍵を登録
catコマンドを使って表示されている文字をコピー

```
shigurechan@shigurechan-System-Product-Name:~/.ssh$ cat id_rsa.pub
ssh-rsa 文字列　文字列　文字列　文字列　文字列　
文字列　文字列　文字列　文字列　文字列　文字列　文字列　文字列　
文字列　文字列　文字列　@gmail.com

```
SSH設定ページ：　https://github.com/settings/keys
上記のサイトに移動してnew SSH Keyをクリックして名前を設定して コピーした文字列を貼り付け
![Screenshot from 2021-09-14 10-45-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521308/9234da13-8217-e654-1b54-9f29bd65c74e.png)

###接続確認
```
$ ssh -T git@github.com
Hi Shigurechan! You've successfully authenticated, but GitHub does not provide shell access.
```
という文字が出たら完了

###SSH鍵を登録する
```
shigurechan@shigurechan-System-Product-Name:~/.ssh$ ssh-add <秘密鍵名>
Enter passphrase for <秘密鍵名>:   <= パスワードを入力
Identity added: <秘密鍵名> (<秘密鍵名>) 
```

#以上で完了あとはプッシュするだけ

```
git init 
git add .
git commit -m 
git remote add origin URL
git push origin master
```
【初心者向け】Bootstrapの導入方法

#はじめに
Bootstrapってどうやって使うの？って思っている方向けにBootstrapの導入方法を説明します。
といっても、とても簡単なので、あっさり終わります。

#Bootstrapの導入方法
1) [Bootstrap公式HP](https://getbootstrap.jp/)にいき、ダウンロードボタンをクリックします。
2) ダウンロードページに飛ぶので、もう一度ダウンロードボタンを押します。
3) ダウンロードが終了したら、Zipファイルを解凍し、自分が作成したフォルダに移動させます。
4) それと同列にindex.htmlを作り、Bootstrap公式HPに載っているスターターテンプレートをコピペします。

#おわりに
導入はとても簡単ですよね。
難しいレスポンシブ対応もされているのでぜひ使ってみてください。
PowerToysでCapsLockをIME ON/OFFに置き換える(US配列)

## 人類の敵 CapsLock
この世にキーボードというものが誕生して以来忌み嫌われてきた存在、七つの大罪の一つ、人類の敵、そうCaps Lock。
Aキーの横にあり誤操作により入力不能になるこのいらない存在にIME ON / OFFの大役を与えてあげることにします。
## やりたいこと
US配列のキーボードでCapsLockでIME ON OFFを切り替えたい
### 使うツール
Microsoftの純正拡張ソフト"PowerToys"を使う
[PowerToysダウンロード](https://docs.microsoft.com/ja-jp/windows/powertoys/)
### 使用キーボード(参考)
自分が使用しているキーボードはUS配列の[Ducky One 2 SF](https://www.fumo-shop.com/ducky-one-2-sf-rgb-65-version.html)の静音赤軸(ピンク軸)
CapsLockは赤丸の位置にあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/59188501-a154-f301-67da-006e2347a4bc.png)


## PowerToys
Win10のアプデによりMS IMEのバージョンが変わってホットキーのカスタマイズがしづらくなった。旧バージョンに戻すこともできるがPowerToysのKeyboard Managerで同じことができた。
### Keyboard Manager
Remap a Keyで[Caps Lock]とUS配列での[Alt + \` \]を入れ替える。キーの再マップで下記の画像のように割り当てる。マップ先の[IME Kanji]は[ \` ]のこと。これだけでOK、ただし大文字固定になるCapsLock本来の機能は使えなくなるので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/899bc003-61c0-1131-79f3-0239451ecab3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/f6cc3d57-7f55-d173-fdde-eaf3ebdca13a.png)
## MS IME
### 別幅スペース
この設定によりUS配列キーボードなどで\[Ctrl+Space]や\[Shift+Space]が使えるようになる。MS IMEは別幅スペースという機能があってそれがとても便利です。

Windows設定の中の"キーとタッチのカスタマイズ"に設定項目があります。

日本語入力時に半角スペースを打つ時いちいちIMEをOFFにすることなく[Shift + Space]で半角、[Space]で全角と任意で打つことができるので便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/0751fdd5-f8c8-69a1-e8f8-623315738354.png)
### クラウド候補
Google日本語入力ほど固有名詞に強くはありませんが、かなりマシになる設定があります。日本語IME設定の全般の中の"クラウド候補"という項目をオンにします。これでBignを使用することになるのでかなりまともになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/eccff83b-3fe1-a913-d3c5-acd30112e54f.png)
## Google日本語入力で別幅スペース
### ※2021-09-14 追記
上でMS IMEの別幅スペースが便利と書いたけど、Google日本語入力でも同じことができました。
下記画像のように[ Shift Space ]に「半角空白を入力」に割り当てれば同じ機能になりますね、気づきませんでした。

※MS IMEは変換を確定した文字を再変換できるという優位性はあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686943/d8e3ea8d-9fac-2ed2-cfbb-2342905f885c.png)
[paiza]スキルチェック見本問題 Java 数値演算結果で分岐/ 0 が含まれていないか判定 return sc.closeとは

<h2>初めに</h2>
今回もpaizaの見本問題（ランクD）に２問挑戦しました。
新たに、「return」 「sc.close」について学べましたので、
まとめていきます。（記事の後半）

<h2>易:relaxed:数値演算結果で分岐 (paizaランク D 相当)</h2>

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__simple_step3

```
整数 A, B, C が与えられます。
式 A × B ≦ C が成立している場合はYESを、
そうではない場合はNOを出力してください。
```
<h2>解答コード</h2>

```java:
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        if(a*b<=c){
            System.out.println("YES");
        }else{
            System.out.println("NO");
        }
    }
}
```

<h2>難:fist:0 が含まれていないか判定</h2>

https://paiza.jp/works/mondai/conditions_branch/conditions_branch__simple_boss

```
長さ N の数列Aが与えられます。
Aの中に 0 が含まれていない場合はYESを、 
0 が含まれている場合はNOを出力してください。
```


<h2>正解のコード</h2>

```java:
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
//配列に格納します
            a[i] = sc.nextInt();
        }
//拡張for文を使用し配列の中身を取り出します。
//0を見つけたら、sc.closeでスキャナーを閉じます。＝0見つけたら終わる
//returnで呼び出し元に処理を戻す
        for (int x : a) {
            if (x == 0) {
                System.out.println("NO");
                sc.close();
                return;
            }
        }
        System.out.println("YES");
        sc.close();
    }
}
```
この場合、出力結果は以下のようになります。
NO

<h3>sc.closeとreturnがなかったらどうなる？</h3>
出力結果は以下のようになります。
NO
YES

<h2>:point_up:returnとは？</h2>

メソッドから呼び出し元に値を返します。さらに、return文が実行されると、
それ以降の処理は行いません。


https://www.javadrive.jp/start/method/index7.html

https://www.sejuku.net/blog/22842

<h2>:point_up:sc.closeとは？</h2>
スキャナを閉じてくれます。


<h2>参考記事</h2>

https://qiita.com/ki_87/items/21d55872566fcab3dd60

<h2>終わりに</h2>
拡張for文が苦手です。
osを作る その14

#概要

osを作る。
ソフトウェア割り込み、やってみた。

#サンプルコード

```

const byte LED = 13;
const byte PIN = 2;

void int0() {
	if (digitalRead(PIN) == HIGH)
		digitalWrite(LED, HIGH);
	else
		digitalWrite(LED, LOW);
}

void setup() {
	pinMode(LED, OUTPUT);
	attachInterrupt(0, int0, CHANGE);
}

void loop() {
	delay(800);
	digitalWrite(PIN, LOW);
	delay(800);
	digitalWrite(PIN, HIGH);
}




```


以上。
slackの通知音が鳴らない！

## やりたいこと
ある日気づいたら、Slackの「ｺｺｺｯ」というあの通知音が鳴らなくなっていた・・・！
Slackでお仕事をやっているので、通知音は鳴ってほしい。。:frowning2:

## 環境
Windows 10 Pro


## ためしたこと
①Windowsの通知の設定
→OFFになっていたため、ONにしたが改善されない。

②Slackの環境設定、通知の設定
→ONになっており、問題なし。

②Windowsの集中モードがONになっている
→原因はこれだった。ということで以下の手順へ。


## 手順（Windowsの集中モードをOFFにする）
Windows画面右下の吹き出しマークをクリック
↓
`オン　重要な通知のみ`
になっているところをオフにする
↓
完了！

## テスト
通知が鳴るかテストをしたい方へ

Slack右上の自分のアイコンをクリック
↓
環境設定
↓
通知
↓
サウンド＆表示の項目より、`例を表示する`をクリック
↓
鳴る！！

## まとめ
Slack公式の[トラブルシューティング](https://slack.com/intl/ja-jp/help/articles/360001559367-Slack-%E9%80%9A%E7%9F%A5%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#h_60215489841550189674699)には集中モードの記載がなく困っていました。。
Slackの環境設定で、↓のエラー文が出ていたことにより発覚。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/628630/9ceb71a2-de2a-db10-e824-3b60be1cef34.png)



今回はWindowsのありがた迷惑により通知が鳴らなくなっていた、という結果でした。
どなたかのお役に立てば幸いです:relaxed:


## 引用
[Windows公式トラブルシューティング](https://support.microsoft.com/ja-jp/windows/windows-%E3%81%A7%E9%9B%86%E4%B8%AD%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AE%E3%82%AA%E3%83%B3%E3%81%A8%E3%82%AA%E3%83%95%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B-5492a638-b5a3-1ee0-0c4f-5ae044450e09)
[Slack公式トラブルシューティング](https://slack.com/intl/ja-jp/help/articles/360001559367-Slack-%E9%80%9A%E7%9F%A5%E3%81%AE%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0#h_60215489841550189674699)
Basic認証のかけ方【備忘録】

#はじめに
特定のサイトへのアクセス時にユーザー名とパスワードを用いた簡単な認証をかけることができる、Basic認証の使い方をまとめた記事。

#目次
- 全体の流れ
- 項目別の詳細
- 注意点

#全体の流れ
1. .htaccessファイル、.htpasswdファイルを作成
1. パスワードのハッシュ化 
1. サーバーに設置

#項目別の詳細
####.htaccessファイル、.htpasswdファイルを作成・記述
　Basic認証は、認証をかけたいファイルのディレクトリにこの二種類の設定ファイルを設置するだけで実現する。

　まずは作成。.htaccessと.htpasswdはそれぞれ拡張子を持たないのでtouchコマンドを使うのが最適。

```terminal:コマンドプロンプト
touch .htaccess
touch .htpasswd
```

　続いて記述。

```:.htaccess
AuthUserfile /フルパス/.htpasswd
AuthGroupfile /dev/null         
AuthName "message"
AuthType Basic
require valid-user
 //改行
```
　AuthUserfile：.htpasswdの場所をフルパスで記述。
　AuthGroupfile：requireで使用するグループファイルのパスを記述するが、要らない場合は/dev/nullでよい。
　AuthName：ダイアログに表示される文章。
　AuthType：認証タイプを指定。今回はBasic認証なので「Basic」。
　require：認証後にアクセスを許可するユーザー（グループ）を指定する。グループを指定する場合は、読み込んだグループファイルに記述したグループ名を書く。特に無ければvalid-userでよい。

```:.htpasswd
user:ハッシュ化したパスワード
```
　ユーザー名とハッシュ化したパスワードを書くだけ。

####パスワードのハッシュ化 
　.htpasswdに書く内容は、ユーザー名とパスワードさえ決まっていればほぼ一意に決定する（おそらく）。
　なので、ハッシュ化を含めたコード生成を自動で行ってくれるサイトを使わせてもらうのが確実。
　[.htaccess による認証用　パスワード暗号化ツール](https://www.luft.co.jp/cgi/htpasswd.php)

####サーバーに設置
　作成した二つのファイルを、認証させたいファイルのあるディレクトリに設置する。そのディレクトリ下のすべてのファイルにBasic認証がかかる。

#注意点
サーバーのプログラムが読み込むファイルなので、ちょっとした記述の違いなどでエラーが頻発する。
以下、エラーが出た時、特に注意したい点。
####パーミッション
　.htaccessと.htpasswdのパーミッションは604か644にする。

```terminal:コマンドプロンプト
　chmod 604(644) ファイル名
```
####ファイルの最後に空行を入れる
　空行により構文の終端が認識されるらしい。

####Apache再起動
　基本的に何かを変えたら再起動。

####Apacheの設定ファイルを変更する
　サーバー側の設定でBasic認証を有効する必要がある可能性がある。

```httpd.conf
AllowOverride None  //削除
AllowOverride All   //追加
```
tailwindcssのPurgeをいろんなテンプレートで使う

[公式のページには](https://tailwindcss.jp/docs/controlling-file-size)

* `.html` 
* `.vue`
* `.jsx` 

の例しか載ってないが、他のPHP、Ruby、Python、PerlなどのWebフレームワーク等で使われているテンプレートエンジンのテンプレートファイルでも使えるっぽい。

PerlのMojoliciousならできた。

`tailwind.config.js` で`.html.ep`のファイルを指定。

```js
module.exports = {
  purge: ['templates/**/*.html.ep'],
  darkMode: false,
  theme: {
    extend: {},
  },
  variants: {
    extend: {},
  },
  plugins: [],
}
```

ビルドする。

```
$ NODE_ENV=production npx tailwindcss build -i assets/css/style.css -o templates/css/tailwind.css.ep
```

でかくない。ちゃんとそれなりのファイルサイズになってる。


```
$ ls -lha templates/css/tailwind.css.ep                                                      
-rw-r--r--  1 yusuke  staff    13K  9 14 10:03 templates/css/tailwind.css.ep
```

で、`html.html.ep`を編集して、

```html
    <main class="md:container md:mx-auto py-4 mt-4 mb-10">
```

なんかこういうのを足してから、またビルドすると、cssのファイル容量が増えて、CSSが適応されている。

```
MacBook@yusuke $ ls -lha templates/css/tailwind.css.ep                                                      
-rw-r--r--  1 yusuke  staff    14K  9 14 10:23 templates/css/tailwind.css.ep
```

これなら、他のPHPのTwig（？）とか、他のテンプレートエンジンでも使えそう。それとtailwindcssのこの機能はPurgeCSSなんで、PurgeCSS単体でもいける。

ちなみに、なんで、CSSをテンプレートっぽいファイル名（tailwind.**css.ep**）にしているかというと、HTMLのテンプレート内で`include`で呼んでHTMLに展開してAMP Validにしたいからです。
Protocol Buffers を用いた Objective-C のコード生成後の型対応表

## 概要
Protocol Buffers 公式の変換後の型一覧に Objective-C の項目がなかったので記載します。
Protocol Buffers のバージョンは proto2 を用いています。
https://developers.google.com/protocol-buffers/docs/proto#scalar
https://developers.google.com/protocol-buffers/docs/proto3#scalar

## 対応表

| .proto Type | Objective-C Type |
|-|-|
| double | double |
| float | float |
| int32 | int32_t |
| int64 | int64_t |
| uint32  | uint32_t |
| uint64  | uint64_t |
| sint32  | int32_t |
| sint64  | int64_t |
| fixed32  | uint32_t |
| fixed64  | uint64_t |
| sfixed32  | int32_t |
| sfixed64  | int64_t |
| bool  | BOOL |
| string  | NSString |
| bytes  | NSData |
eb cliでAWSアカウント切り替え、選択

# 前提
複数のAWSアカウントを1つのPCから操作している時に
eb cliが現在どのアカウントを向いているかを確認したい状況でした。
新しいAWSアカウントで新しいBeansTalk環境を作成した時に確認した方法です。

# AWSアカウントは複数の要素から判定されます
以下優先度の高い要素から書いていきます。基本的にはAWS CLIと同じ構成ですが後述する注意点もあります。

### コマンドオプション
ebコマンドを実行する際に--profileオプションを付けることでアカウントを指定することができます。このオプションは後述するローカルPCのファイルに書いてある情報を見てアカウントを判断します。

```init.sh

$ eb init --profile account1

```

### 環境変数
AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEYを設定することで使用できます。

```export.sh

#環境変数設定
$ AWS_ACCESS_KEY_ID=EBCLIEBCLIEBCLIEBCLIEBCLIEBCLI
$ AWS_SECRET_ACCESS_KEY=BCLIEBCLIEBCLIEBCLIEBCLIEBCLIBCLI

#環境変数削除
$ unset AWS_ACCESS_KEY_ID
$ unset AWS_SECRET_ACCESS_KEY


```

### AWS 認証情報ファイル
ローカルmacに保存されている設定ファイルです。
テキストエディタで編集もできます。

```~/.aws/credentials

[default]
aws_access_key_id = EBCLIDEFAULTEBCLIDEFAULTEBCLIDEFAULT
aws_secret_access_key = EBCLIDEFAULTEBCLIDEFAULTEBCLIDEFAULTEBCLIDEFAULT

[account1]
aws_access_key_id = EBCLITESTEBCLITESTEBCLITEST
aws_secret_access_key = EBCLITESTEBCLITESTEBCLITESTEBCLITEST

```

**eb-cli｜注意点**
eb-cli独自の仕様として以下どちらか記述がある場合

```~/.aws/credentials

[eb-cli]
aws_access_key_id = EBCLIEBCLIEBCLIEBCLIEBCLIEBCLI
aws_secret_access_key = BCLIEBCLIEBCLIEBCLIEBCLIEBCLIBCLI

```

```~/.aws/config

[profile eb-cli]
aws_access_key_id = EBCLIEBCLIEBCLIEBCLIEBCLIEBCLI
aws_secret_access_key = BCLIEBCLIEBCLIEBCLIEBCLIEBCLIBCLI

```

以下のデフォルトより優先される動きになります。

```~/.aws/credentials

[default]
aws_access_key_id = EBCLIEBCLIEBCLIEBCLIEBCLIEBCLI
aws_secret_access_key = BCLIEBCLIEBCLIEBCLIEBCLIEBCLIBCLI

```

注意したいのはconfigにeb-cliの記述があった場合
credentialsのデフォルトより優先される動きです。

### AWS CLI 設定ファイル
AWS CLIの設定ファイルでも設定ができます。

```~/.aws/config

[profile eb-cli]
aws_access_key_id = EBCLIEBCLIEBCLIEBCLIEBCLIEBCLI
aws_secret_access_key = BCLIEBCLIEBCLIEBCLIEBCLIEBCLIBCLI

```

### レガシー EB CLI 設定ファイル
自分で使用していないので項目だけ紹介します。詳細は参考ページをご確認下さい。

### インスタンスプロファイルの認証情報
自分で使用していないので項目だけ紹介します。詳細は参考ページをご確認下さい。

# 運用中のローカルディレクトリで確認する場合
現在運用中のプロジェクトディレクトリ（eb init済みのディレクトリ）では
以下のコマンドで現在ebコマンドが見ているAWSアカウントのBeansTalk環境一覧が見れます。

```eb.sh
$ eb list
```

# 参考ページ
[構成設定と優先順位](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html#eb-cli3-credentials)
TypeScriptでDocker上に構築したPostgreSQLに接続

# はじめに

DB からのデータ取得などの動作を含む簡単な Web アプリを試したい。PoC レベルでバックエンド側の API 作成まで行うのは時間がかかりすぎるため、本記事では TypeScript から PostgreSQL に接続し、データ取得を行う。また PostgreSQL 環境自体も容易に作成・破棄できるよう Docker コンテナ上に構築している。詳細は [Dockerコンテナ上のPostgreSQLにデータベースを作成](https://qiita.com/honda28/items/fcfb7ce2786d72d98e46)を参照。実行環境は以下。

- Windows 10 Pro (WSL2: Ubuntu-20.04)
- pg 6.14.15 
- @types/pg 6.14.15 

[公式ドキュメント](https://node-postgres.com/)を参考にした。

# ライブラリのインストール

まず PostgreSQL に接続するためのライブラリ `pg` をインストールする。今回は TypeScript で扱いたいので、合わせて型定義 `@types/pg` もインストールしておく。

```bash
$ npm install pg
$ npm install @types/pg
```

# DB 接続プログラム

続いて、pg を用いて DB に接続する。公式ドキュメントを参考に作成したプログラムは以下。Client 内の設定は [Dockerコンテナ上のPostgreSQLにデータベースを作成](https://qiita.com/honda28/items/fcfb7ce2786d72d98e46)と同様のものとしている。

```typescript:dbOpe.ts
const { Client } = require('pg');

const client = new Client({
  user: 'postgres',
  password: 'postgres',
  host: '[host address]',   // 詳細は後述
  database: 'test_db',
  port: 5432
});

client.connect();
console.log('connected')

client
  .query('select now()')
  .then((res: any) => console.log(res.rows))
  .catch((err: any) => console.error('connection error', err.stack))
  .then(() => client.end())
  .then(() => console.log('disconnected'));
```

ここで `host` は Docker コンテナにアクセスすることで確認できる。

```bash
$ docker exec -it [container id] /bin/bash
root:/# hostname -i
```

たとえばこの際に `172.17.0.2` が得られたとする。しかし、このアドレスをそのまま指定しても接続することはできなかった。詳細は理解できていないが、`172.17.0.1` のように同じネットワークアドレスかつホストアドレスが `1` のアドレスを指定するとアクセスできた。デフォルトゲートウェイ（？）が原因のようだが、わかっていないので詳しい方がいたらぜひ教えて下さい。

上記 ts ファイルをトランスパイルして、実行すると以下のような出力が得られる。

```bash
$ tsc dbOpe.ts && node dbOpe.js
connected
[ { now: 2021-09-10T05:03:25.955Z } ]
disconnected
```

DB にアクセスし、データ取得できたことが確認できる。

# おわりに

pg ライブラリを使用して、DB に接続した。API なしでフロントエンドから直接 DB を参照できるかと考えたが、[こちら](https://github.com/brianc/node-postgres/issues/892#issuecomment-159345934)によると pg は Node.js でしか実行できないようだ。PoC レベルでもフロントエンドと DB を接続するには Web API を作成するしかないか。
AWSアーキテクチャの設計原則

<h2> はじめに </h2>
AWSアーキテクチャの設計原則について学習したので、その内容をまとめたいと思う。

<h2> Well-Architected Framework </h2>
まずAWSアーキテクチャの設計原則は上記のWell-Architected Frameworkに支えられている。
このフレームワークは以下の3つの内容で構成されている。
・Well-Architected Framework ホワイトペーパー
・AWSのSAまたは認定パートナーによる支援制度
・Well-Architected Tool

これらを順に詳細に見ていくことで、Well-Architected Framework、ひいてはAWSアーキテクチャの設計原則を理解していく。

<h2> Well-Architected Framework ホワイトペーパー </h2>
開発工程の流れから話すと、
要件定義→設計→構築→運用
という順で開発工程は存在する。この設計について5つの要素に分解して、（必ずではないが）準拠することを推奨しているというものだ。5つの分解要素とは以下のとおりである。
・Reliability（信頼性）
・Performance Efficiency（パフォーマンス効率性）
・Security（安全性）
・Cost Optmization（コスト最適化）
・Operational Excellence（運用上の優秀性）

である。
例えば、AZの選択時に信頼性（災害への対応）を上げたければ、1つのリージョンにつき2つのAZを利用（マルチAZという）すればよい。またRoute53を介してのマルチリージョン設計をすれば、同じシステム構成をフェイルオーバーすることでも信頼性は担保される。

ここで、設計時のみ着目するという言い方を上ではしているが、どのフェーズでもホワイトペーパーを確認してAWSを設計することで、5つの要素をより強固にしていく。

<h2> AWSのSAまたは認定パートナーによる支援制度 </h2>
これとWell-Architected ToolはWell-Architected Frameworkdのような根本の設計原則ではない。
Well-Architected Frameworkにどれくらい準拠しているかの程度のチェックの話だ。
そして、題名の通り、Amazonのサポート社員やAmazonにパートナーだと認められた社員にチェックさせることによって、程度を調査される支援制度のことをいう。

<h2> Well-Architected Tool </h2>
上記は人がやるのに対して、こちらはAWS自身で調べる、いわばセルフチェック機能だ。
構築・運用中のアプリケーションがベストプラクティスになってるかを検証してくれる機能である。
大きく4つの流れで検証してくれる。
ワークロードの定義→レンズ載せ一定→マイルストーン→レビュー

である。ワークロードの定義ではアプリケーションのビジネス価値を定義する。大それたことを言っているが、業種・業界の選択など、基本的な情報の入力である。
次に、レンズの設定では、アプリケーションの評価を行う。
次に、マイルストーンでは、アプリの変更内容を表示してくれる。(Gitのような機能がAWSにもついているというイメージ)
最後に、レビューでは、5つの構成要素に沿った質問を50～60問程度答えていけば、Well-Architected Frameworkに則るにはこうした方がよい、という改善案がでてくる

という流れでセルフチェックを行うのである。

<h2> おわりに </h2>
頭の整理がてら、AWSプラクティショナーに必要なのでしてみた。
次は、VPCを勉強しようと思うが、思ったより頭への入りが悪く、時間がかかりそう、、、
/etc/resolv.confが自動的に更新されるので原因を調べてみた

# はじめに

ネットワーク境界に設置しているゲートウェイサーバーで、dnsmasqを運用していて、内部ネットワークのDNSサーバーとして利用しています。
ついでのこのゲートウェイ自身の/etc/resolv.confで、自分のIPアドレスを記載し、dnsmasqを利用しています。起動時の状態によってはDNSにアクセスできない可能性もありますが、nameserver行を複数記入することで、タイムアウトまでの時間はかかると思いますが、致命的な状態は回避しています。

ネットワークの状況が動的に更新されると問題になるので、クライアント環境でよく利用されている``network-manager`` や ``resolvconf`` などのパッケージは削除していますが、それでもある日突然に/etc/resolv.confが更新されていることに気がつきました。

このゲートウェイサーバーに静的にIPアドレスを割り当てていれば問題なかったのですが、こちらの都合でMACアドレスからIPアドレスを割り当てているためにDHCPクライアントとしても動作しているために問題が発生していたことが分かりました。

これらの原因追跡の過程と、対応についてまとめておきます。

# 参考資料

* [StackExchange :: Is it possible to find out what program or script created a given file?](https://unix.stackexchange.com/questions/6068/is-it-possible-to-find-out-what-program-or-script-created-a-given-file)

# 環境

* Xubuntu Desktop 20.04 LTS (x86_64版)

## sysdigによるファイル・システムの観察

参考資料のとおりに、sysdigを利用していきます。

```bash:sysdigの出力を確認
## /etc/resolv.confが書き変わるまでsysdigを実行
$ sudo sysdig -w /tmp/fsdump.scap
^C

## fsdump.scapに保存したデータの解析
$ sudo sysdig -r /tmp/fsdump.scap | grep /etc/resolv.conf
....
409322 11:39:23.933925251 1 rm (17739) < execve res=0 exe=rm args=-f./etc/resolv.conf.dhclient-new.17733. tid=17739(rm) pid=17739(rm) ptid=17733(dhclient-script) cwd= fdlimit=1024 pgft_maj=0 pgft_min=16 vm_size=408 vm_rss=4 vm_swap=0 comm=rm cgroups=cpuset=/.cpu=/system.slice/ifup@ens224.service.cpuacct=/system.slice/ifup@ens... env=requested_domain_name_servers=1.requested_broadcast_address=1.new_network_num... tty=0 pgid=786(dhclient) loginuid=-1
....
```

このログから、dhclientが/etc/resolv.confを更新しているらしい事が分かりますので、ここからもう少し確認していきます。

# dhclientによる/etc/resolv.conf更新の抑制

/sbin/dhclient-script に問題の処理が含まれていることは、少し調べると分かります。
ログファイルの中にあるユニークな文字列が含まれるファイルを探すことができます。

```bash:
$ apt source isc-dhcp-client
$ cd isc-dhcp-4.4.1
$ find . -type f -exec grep dhclient-new {} \; -print 2>/dev/null
        new_resolv_conf="${resolv_conf}.dhclient-new.$$"
        new_resolv_conf="${resolv_conf}.dhclient-new.$$"
./debian/dhclient-script.linux
...

関連しそうなコードが dhclient-script.linux に含まれていそうなので、配置されている場所を確認します。

$ locate dhclient-script
/sbin/dhclient-script
/snap/...
...
```

このスクリプトの中のmake_resulv_conf関数の中で実際の処理は行なわれています。

SHELL関数の ``make_resolv_conf`` は、頻繁に呼ばれていて、設定でresolv.confファイルの置き換えを行なわない手段はなさそうです。
動作を変更する手段は、/sbin/dhclient-scriptを直接編集しないと難しい状況になっています。
あるいは、``isc-dhcp-client`` パッケージ以外のクライアントを利用することしか良い方法はなさそうです。

最終的にはansibleを利用して、定期的に行なっている変更作業の中に、スクリプトの編集作業を含めることにしました。

```makefile:ansibleによる/sbin/dhclient-scriptへのパッチ作業
setup-dhclient:
        ansible all -m replace -b -a "path=/sbin/dhclient-script regexp='(^[ \t]+)make_resolv_conf$$' replace='\1echo _make_resolv_conf'"
```

make_resolv_conf自体を削除してしまうと、構文的にエラーになる箇所があるので、echoコマンドに置き換えています。

とりあえず、この方法で回避することにしました。

以上
python：型指定して変数を定義するときに：を使用する

pythonで型指定した変数を定義することができます。

```basic.py
>>> val_initial : int = 2
```

この型指定された変数の値の変更の仕方には癖があります。


```sample1.py

>>> thickness: int = 2
>>> print(thickness)
2
>>> print(type(thickness))
<class 'int'>
>>> name: str = 'hello'
>>> print(type(name))
<class 'str'>

```

下記のように数字を入れた変数xをint型指定されたvalに代入したときに

その変数xの値を変更したときに、valは自動では書き換わりません。

```sample2.py
>>> x = 2      
>>> val:int = x
>>> print(val)
2
>>> x = 12
>>> print(val)
2
>>> val:int = x
>>> print(val)
12
```

型指定の変数を宣言できますが、
そこに型が決まってない変数を代入することはできません。


```sample3.py
>>> val2:int
>>>
>>> val3:int = y
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
```
AWSに複数環境で自動デプロイの権限設定


# 背景
* AWS上にECRとECSでバックエンドサービスを構築している
* one clickでコードデプロイを実施したい
* 開発環境と本番環境は別のAWSアカウントになる

# 内容
## AWS CodeBuildとは
* 完全マネージド型のビルドサービス
* ソースコードをコンパイルする
* 単体テスト
* デプロイ

## buildspec.yml
* 単体テスト実施
* docker image build
* ECRへpush

## 問題

![deploy_aws.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/aae6b466-78fb-203f-18cf-fe9799d55eb9.png)

* 開発アカウントのCodeBuildから本番アカウントのECRへプッシュする時に、権限設定が必要


## 対策
### 本番アカウントの側
* ECRリポジトリにアクセス許可を追加する
    * 開発アカウントのputimage権限を許可する

```
{ 
  "Version": "2008-10-17", 
  "Statement": [ 
    { 
      "Sid": "AllowPushPull", 
      "Effect": "Allow", 
      "Principal": { 
        “AWS”: “arn:aws:iam::開発アカウントID" 
      }, 
      "Action": [ 
        ......
        "ecr:PutImage", 
        "ecr:UploadLayerPart" 
      ] 
    } 
  ] 
} 


```

### 開発アカウントの側
* ビルドプロジェクトのサービスロールに、STSとECR操作権限を追加する

```
sts-policy:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
        { 
            "Sid": "VisualEditor1", 
            "Effect": "Allow", 
            "Action": [ 
                "sts:AssumeRole" 
            ], 
            “Resource”: “arn:aws:iam::開発アカウントID:role/service-role/ロール名" 
        } 
    ] 
} 


ECRへpush権限:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
        { 
            "Sid": "VisualEditor0", 
            "Effect": "Allow", 
            "Action": [ 
                ....
                "ecr:PutImage", 
                ......
            ], 
            “Resource”: “arn:aws:ecr:ap-northeast-1:本番アカウントID:repository/リポジトリ名" 
        }, 
        { 
            "Sid": "VisualEditor1", 
            "Effect": "Allow", 
            "Action": "ecr:GetAuthorizationToken", 
            "Resource": "*" 
        } 
    ] 
} 



```
Flipper で Install Plugins の項目が空になってしまう

Flipperで pluginを検索しても何も表示されないので調べた。pluginを保存するためのフォルダがないといけないみたいなので作成する。

```zsh
mkdir ~/.flipper/installed-plugins
```

- https://github.com/facebook/flipper/issues/1818#issuecomment-758095689

これで表示されるようになった。
添付ファイルとしてレポートを送信する

最終的にはこれと同じようなことを実現したい。


+ [メールテンプレートにレポートを埋め込む](https://ideas.salesforce.com/s/idea/a0B8W00000GdVTFUA3/embed-report-in-email-templates)
+ [リンクだけでなくメールでレポートを送信する](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A7h4wSAB)

関連する資料を集める

1. レポートを添付ファイルとしてメールに添付して送信する。メール送信用のクラスは他でも使えそう。
   実装してみたら、動いた。
[SENDING REPORT AS ATTACHMENT IN SALESFORCE](https://salesforcecodex.com/salesforce/sending-report-as-attachment-in-salesforce/)

2.この方法は？

2つの方法が紹介されてます
Salesforce Report as attachment using Apex

1. CSV Format
2. Printable View Format<-- 1番目の方法と同じだった。

[Send Salesforce Report as Attachment using Apex](https://salesforcescool.blogspot.com/2021/06/send-salesforce-report-as-attachment.html)


+ [Send reports in Email body through Apex in Lightning](https://salesforce.stackexchange.com/questions/325422/send-reports-in-email-body-through-apex-in-lightning)
+ [How to send Reports via email to a group of users on an hourly basis](https://www.forcetalks.com/salesforce-topic/how-to-send-reports-via-email-to-a-group-of-users-on-an-hourly-basis/)

# メールで送信されるレポートもきれいに埋め込むことができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/120234d8-41db-0c9e-1dc3-4df1226e584e.png)

レスポンシブルになっていますよ。
これなら見栄えもいいんで大丈夫でしょう。

ReportControllerというApexクラスを書きました。

# 制限事項など

[Lightning Experience でのレポートへのユーザ、グループ、ロールの登録](https://help.salesforce.com/s/articleView?id=sf.reports_subscribe_lex.htm&type=5)

+ 各ユーザは最大 5 つのレポートの登録を設定できます。
+ 登録の受信者はレポートの登録メールに表示されません。
+ Platform ユーザの場合、システム管理者が登録を有効にする必要があります。
+ ユーザ、グループ、またはロールをレポートに登録するには、レポートが含まれるフォルダをユーザ、グループ、またはロールと共有する必要があります。
+登録ごとに最大で 500 件の受信者がサポートされます。各受信者は単一のユーザ、ロール、ロール & 下位ロール、またはグループです。ロール、ロール & 下位ロール、およびグループはそれぞれ 500 を超えるユーザを含むことができますが、登録で送信されるメールの最大数は 500 件です。受信者のロール、ロール & 下位ロール、またはグループに 500 を超えるユーザが含まれる場合、一部のユーザは登録メールを受信しません。

登録に受信者として 500 を超えるユーザが含まれる場合、ユーザはロールよりも優先され、ロールはロール & 下位ロールよりも優先され、ロール & 下位ロールはグループよりも優先されます。登録でメールが送信されるたびに、メールを受信するロールとグループのユーザが再度選択されるため、登録メールが送信されるたびにユーザが異なる可能性があります。

たとえば、登録に 100 件の受信者が含まれるとします。その内訳は、98 件のユーザ、1 件のロール (500 件のユーザを含む)、1 件のグループ (400 件のユーザを含む) です。登録に関連付けられているユーザの総数は 998 です。登録メールが送信されると、ロール内の 98 件のユーザは登録メールを受信せず、グループ内の 400 件のユーザは誰もメールを受信しません。

+ 各 Salesforce 組織は、特定の曜日の特定の時間 (月曜日の午前 9:00 など) に最大 500 件のダッシュボード登録と 500 件のレポート登録をスケジュールできます。
+ Lightning Experience のレポート登録では、以下の機能はサポートされません。
 1. 履歴追跡レポート
 2. 結合レポート
 3. 条件付き強調表示 (条件付き強調表示を含むレポートを登録できますが、条件付き強調表示は登録メールに表示されません)。