OmniAICreator/Qiita-1.07M huggingface dataset:
AtCoderログ：0118 - ABC 219 A

# 問題

https://atcoder.jp/contests/abc219/tasks/abc219_a

## 問題文
> AtCoder 王国では、競技プログラミングの実力を測る検定試験が実施されています。
> 試験は $100$ 点満点であり、点数が高ければ高いほど、高いランクが認定されます。
> ランクは以下のように定められています。
> ・$0$ 点以上 $40$ 点未満のとき、初級
> ・$40$ 点以上 $70$ 点未満のとき、中級
> ・$70$ 点以上 $90$ 点未満のとき、上級
> ・$90$ 点以上のとき、エキスパート
> 高橋君は、この検定試験を受験し、$X$ 点を取りました。
> 高橋君が認定されたランクより一つ高いランクとなるためには最低であと何点必要か求めてください。ただし、高橋君がエキスパートと認定された場合、それより高いランクは存在しないため expert と出力してください。

## 制約
> ・$0 \le X \le 100$
> ・$X$ は整数

# 回答
## 回答1 (AC)
高橋君が初級ならば、つまり $X<40$ ならば、中級になるにはあと $40-X$ 点が必要です。同様に、高橋君が中級ならば、つまり $40\le X<70$ ならば、上級になるにはあと $70-X$ 点が必要です。高橋君が上級ならば、つまり $70\le X<90$ ならば、エキスパートになるのはあと $90-X$ 点が必要です。これらのことを順番にコードに置き換えていけば良いでしょう。コードは以下のようになりました。

```C++:abc219a-1.cpp
#include <bits/stdc++.h>
using namespace std;

int main(){
  int x;
  cin >> x;

  if ( x<40 ) {
    cout << 40-x << endl;
  } else if ( x<70 ) {
    cout << 70-x << endl;
  } else if ( x<90 ) {
    cout << 90-x << endl;
  } else {
    cout << "expert" << endl;
  }  
}
```

# 調べたこと
## [AtCoder の解説](https://atcoder.jp/contests/abc219/tasks/abc219_a/editorial) → [公式解説](https://atcoder.jp/contests/abc219/editorial/2655)
回答1と同じ方針でした。

# リンク
## 前後の記事
- 前の記事 → [AtCoderログ：0117 - ABC 219 に参加しました](https://qiita.com/RoadLynton/items/ddb3da1fa2aefd1449a4)
Security Operation Center とは

## 勉強前イメージ

365日24時間セキュリティ見守る人？

## 調査

### Security Operation Center とは

Security Operation Center 略して SOC、
サイバー攻撃の検出、分析を行いアドバイスを行う専門組織です。
通常時はネットワーク・デバイスの監視を行います。
背景としては、システムの環境もクラウドとの連携も行われることが多い昨今、
サイバー攻撃も多種多様になり、あらゆる手段で狙われるようになりました。
そういった中で各企業から需要が高まっています。
社内で行う場合もあれば、外部に委託する場合もあります。

### SOCの主な業務

- アラート監視

アラートの検知を行います。
firewallやIDS/IPS、WAF、ADの認証サーバやwebフィルタリングなど
多岐にわたるデバイスのログをSIEMというシステムに集約し、検知を行います。

- 分析

検知したアラートの分析、攻撃内容にして特定します。

- 調査

外部機関からのセキュリティ情報についての調査などを行います。

- 定期報告

発生したインシデントの日時や対応方針などをまとめてCSIRTに報告します。

- インシデント管理

SOAR(セキュリティインシデントの監視などを効率的に行えるようにする技術)などでのステータス管理

- 監視体制の維持

監視メンバーのローテーションや定期的な教育

- SIEMの機能管理

サイバー攻撃に関する情報や外部機関からの脅威情報から
検知ロジックやブラックリストなどをチューニング

## 勉強後イメージ

24時間365日、ログなど見たり検知したりしてくれるサービスってことだね？？
そういうサービスあるって知らなかったー
セキュリティに特化したアラート検知の人たち。。。
導入するにしても、ログ集約させるシステムとか構築させるのは大変そうだなー
細かい単語までは調べられてないから、今度にする

## 参考

- [SOCとは何か？その仕組みについて解説します。](https://www.shadan-kun.com/blog/glossary/1039/)
- [SOC（Security Operation Center）](https://www.nri-secure.co.jp/glossary/soc)
REST APIを実装して遊ぶ

# はじめに

最近Goしている。
RESTで遊んでいる。
OpenAPIで自動生成でやる。
書いてられない......
さて、どうしよう......

# 解決案

ざっくり案だけど、JavaのSpringdocみたいに自動で仕様書書くのはどうだろう。
Goだと割と楽にコード解析ができる。
そこで、go自体でIDLっぽく、インタフェースを書いて、自動生成する。

```go
package idl

// 適当に構造体を宣言→componentsに入れる。
type NewPet struct {
	Name string
	Tag  string `idl:"制約条件"`
}

type Pet interface {
  	// (GET /pets)→pathとmethodに使う。
	Find(params FindPetsParams) Pet
	// -> paramsクエリの情報。Pet 200の応答。
}
```

こんな感じで、定義書いておいて、go:generateでキックして、OpenAPI spec＆コード生成できるといいんかなと。
rex0220 計算式プラグインでテーブルの連続日付

計算式プラグインでテーブル内日付項目に連続した日を設定出来ないかということで、やってみました。
![2021-09-20_11h33_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/96911b56-af49-5b3d-9cc8-40e4519ff152.png)

# テーブル行の追加、日付変更操作例

テーブル行追加や１行目の日付を変更すると、自動計算されます。

![2021-09-20_11h02_56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/984693ba-3a9c-e0a4-c7e4-4de6edc78baa.gif)


# アプリ設定

テーブル内に数値項目（番号用）と日付項目を配置。
ラジオボタンは、テーブル行追加時に全体の動きが分かるように配置。

![2021-09-20_11h06_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b6a2cb49-6fd3-31c9-3278-bc3428b4e667.png)

# 計算式プラグインの設定

- 「循環参照を許可」をチェック
    - 計算式内で、自項目を参照する場合にチェックします。
- 番号：<br>
ROWNO(行番号)+1<br>
※ROWNO関数は、指定されたテーブル項目の０から始まる行位置を返します。
- 日付：「編集」をチェック<br> 
IF(ROWNO(テーブル)==0,日付,<br>
DATE_ADD(SUBTABLE(日付,ROWNO(テーブル)-1), 1, "day"))<br>
※1行目は、指定された日付のまま。２行目以降は、前行日付＋1日

![2021-09-20_11h09_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/4105d3c0-2ade-08b7-294b-7bfec62e15ff.png)

# テーブル２行目以降の日付を入力不可に

[項目検証プラグイン](https://qiita.com/rex0220/items/be20fd879f5e1bc9e035)で、自動設定されるテーブル２行目以降の日付を入力不可にしてみます。

![2021-09-20_11h25_16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/53e93c6f-4d97-5fa5-7c2c-7e50a6ef67f8.gif)

# 項目検証プラグインの設定

- 日付の入力不可：<br>
ROWNO(テーブル)>0<br>
※2行目以降が真になる

![2021-09-20_11h28_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b074c4da-fec6-ba79-a1ee-d404a71cf5d0.png)
swaggerの各機能を使ってみた

# swagger editor
## github
* https://github.com/swagger-api/swagger-editor

## install

```
git clone https://github.com/swagger-api/swagger-editor.git
cd swagger-editor
npm install
npm run dev
```

## 画面表示
* ブラウザに http://localhost:3200 へアクセス


# openapiドキュメント
* [OpenAPI Specification \- Version 3\.0\.3 \| Swagger](https://swagger.io/specification/)
* [Swagger Blog](https://swagger.io/blog/)

# swagger generate
* swagger-editor画面からクライアントとサーバーのコードを生成できる
![スクリーンショット 2021-09-20 11.04.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13451/164af321-776b-ec5d-e90a-202c4edaec4b.png)

* [GitHub \- swagger\-api/swagger\-codegen: swagger\-codegen contains a template\-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition\.](https://github.com/swagger-api/swagger-codegen)




# swagger UI
* [swagger\-ui/installation\.md at master · swagger\-api/swagger\-ui](https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/installation.md)
* swagger uiを導入して、サーバ側に作成されたAPIよりswagger.jsonを自動的に生成できる
* swagger.jsonよりクライアント側のAPI通信コードも自動的に生成できる





# swagger hub
* https://app.swaggerhub.com/
* API開発プラットフォームでSwaggerフレームワークを使ってAPIを設計、構築、ドキュメント、デプロイできます。
Herokuの無料プランで、独自ドメインにて擬似的ではなく完全なSSLを使う方法

# 概要
この記事で解説する内容は「DNSをCloudFlareにして暗号化モードをフレキシブルにすることで擬似的にHTTPS化が可能」と言ったものではありません。  
herokuでは通常、有料プラン(7$/month)に入らないとSSL証明書を発行できませんが、いつかの仕様変更でDNSにAPPNAME.herokuapp.comに向けたCNAMEレコードを設定することで、herokuが発行した証明書を利用できるようになっていました。
(2021/09/20の時点での情報です)

#前提
これを始める前に、herokuからまずはSSLなしの状態でドメインを追加して下さい。

# 手順
この記事ではDNSにCloudFlareを使用しています。
それ以外のDNSをご利用の方は適宜読み替えて下さい。

## 1. APPNAME.herokuapp.com形式のURLを取得
APPNAMEの部分はHerokuの"App Name"です。
そのURLでアプリにアクセス出来るか確認して下さい。

## 2. DNSにCNAMEレコードを追加
対象のドメインのCNAMEレコードを追加します。
ターゲットは1.で取得したAPPNAME.herokuapp.comのURLにして下さい。
サブドメインである必要はありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731740/55af05fd-26bb-33ce-46f3-338514ca6bac.png)

## 3. (CloudFlareを利用している人のみ) 暗号化モードを「フル」に変更
Herokuが発行しているSSL証明書が利用可能になったので、CloudFlareの"SSL/TLS"タブから暗号化モードを「フル」に変更します。
既にこの設定の場合は変更しなくて大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731740/e9d0bf4d-7b8f-56de-6793-ef3aec589a35.png)

# まとめ
いかがだったでしょうか。
またHerokuの仕様が変更される可能性もあるので、もし出来なかったらコメントで教えて下さい。
誰かのお役に立てると幸いです。
WSL ubuntu にFreeFEMをインストール

# WindowsでFreeFEMで遊ぶ
WSLでFreeFEMを使おうとした時にインストールで詰まったのでメモ


# 環境
Windows 10
WSL
ubuntu 20.04
FreeFEM++ 4.6
ParaViwe 5.9.1

WSL、ubuntuのインストールはできている前提

#FreeFEMインストール
公式のinstration guideを参考に進めていく
https://doc.freefem.org/introduction/installation.html

LINUX版インストーラー(.debファイル)をダウンロード
https://doc.freefem.org/introduction/download.html
インストーラーを作業ディレクトリに格納する


ubuntuのパッケージを最新に更新しておく
作業ディレクトリに移動

```upgrade
$ sudo apt-get update
$ sudo apt-get upgrade
$ cd mnt/C/FreeFEM
```

公式に従って周辺のパッケージとFreeFEMをインストール

```install
$ sudo apt-get install libgsl-dev libhdf5-dev liblapack-dev libopenmpi-dev freeglut3-dev

$ sudo dpkg -i FreeFEM_4.6_Ubuntu_withPETSc_amd64.deb　//4.6の数字は使うバージョンによって変える
```

追加でg++をインストールする

```packageinstall

$ sudo apt install g++

```

FreeFEMを実行するとlibfortran.so.4がないと怒られるのでインストールする

```erorr
$ FreeFem++
FreeFem++: error while loading shared libraries: libgfortran.so.4: cannot open shared object file: No such file or directory

$ sudo apt install libgfortran4
```

FreeFEMがインストールできた。

```FreeFEM
$ FreeFem++
FreeFem++ - version 4.6 (Thu Apr  2 15:47:38 CEST 2020 - git v4.6) 64bits
License: LGPL 3+ (https://www.gnu.org/licenses/lgpl-3.0.en.html)
Usage: FreeFem++ [FreeFEM arguments] filename [script arguments]

```

インストールしたFreeFEMは以下のディレクトリに入っている。
サンプルコードも入っている。

```
/usr/local/share/FreeFEM/4.6　
```

#実行
サンプルコードを実行する

```
$ cd　/usr/local/share/FreeFEM/4.6/examples/examples　
$  FreeFem++-nw Heat.edp
 
```

計算結果はParaviewで確認する。
UdemyのForbidden対処 特定サイトのCookies キャッシュ消し方

Udemyのサイトが「Forbidden」しか表示されない時が度々ある
サーバーが落ちているとき以外でも
原因はわからなかったが対処法をメモ

#検証ツールで特定サイトのみ消す
検証ツールで、
右クリック＞検証＞Application＞Strage内にある、
「Clear site data」をクリック


#すべてのサイトのCookiesが消えてもいい場合
ブラウザの3点ドット＞設定＞閲覧履歴データの削除＞データの削除
AWS SAAに実際に合格した勉強方法とAWS SAAの資格をとったほうが良い理由


普段バックエンドエンジニアとしてフリーランスをしている[revenue-hack](https://twitter.com/tagaranoko1014)です！


今日は実際にAWS SAAを取得した方法について解説します。

この方法でやれば未経験者でもAWS SAAを取れます。

結論は

- AWS公式の模擬試験はやらなくても良い(もちろん心配な人はやっても良いです)
- ブラックベルトは読まくて良い
- ホワイトペーパーは読まなくて良い
- AWS Well-Architectedフレームワークは読まなくて良い
- Udemy動画で勉強すればOK
- 心配な人はAWS認定ソリューションアーキテクト問題集をやる

です。
僕はこれで合格しました。
:point_down:実際の詳しい勉強法やAWS SAAの試験対策については以下の記事を参照してください！:point_down:

2分程度で読み終わります！

https://technolog.jp/aws-saa-study/


## AWS SAAの資格を勉強すると意外と細かいことを知らないことに気づけた

AWS SAAをやる前は一応Web周りのリソースは色々と使っていました。
例えば

- VPC,IAMなど
- EC2(ALBも含む)
- ECS(Fargate,ECR)
- RDS(MySQL, Postgres Aurora)
- API Gateway
- Lambda
- S3


など、Web構築をする上では定番のリソースです。


なのでAWS SAAの資格もそんなに勉強しないでも取れるかもなーと思って、とりあえずUdemyがわかりやすそうだったので、Udemy動画を購入して、各リソースの小テストを試しにやってみたら全然出来なくて、普段使っているものでも全然わからないことに気づきました。


例えば

- S3のストレージクラスの種類やその役割、使うタイミング
- S3のマルチレプリケーションについて

など普段は全然使わないような機能に関しては全然わからなかったです。

なので一応AWSは多少は使っていましたが、ちゃんとAWS　SAAの勉強を０からやりました。

詳しいやり方や対策はこちらの記事を参照してください:point_down:

https://technolog.jp/aws-saa-study/


## AWS　SAAの資格は他の資格と違って勉強するだけで実務で使える

エンジニアの資格って全然役にたたないものとそうでないものがあると思っています。

例えば基礎情報や、応用情報などは取ったところで実務では役に立たずせいぜい会社から一時金をもらえる程度かなと思います。
資格の必要性に関してはこちらの記事が現役エンジニアの支店でわかりやすいです。

https://technolog.jp/engineer-qualification-need/


その点AWS SAAは試験の性質上実務で使える知識になります。

なぜなら試験では実際にありそうなユースケースでこの場合はどういう対応をすればよいのか？という、知識があってそれを応用していく問題のみが出るからです。

例えばS3のストレージクラスの種類を覚えても試験では回答できず、試験ではS3のストレージクラスの種類の知識を使って、このユースケースの場合はどうするのか？という問題が出ます。

```
実務で使えるためAWS SAAの資格は取るだけでとても有用なので勉強する価値があります。
```

実際に試験の例などはこちらの記事に書いてあるので参考にしてください:point_down:

https://technolog.jp/aws-saa-study/


## AWS SAAの資格を持っていて実際に役に立ったこと

- 実務に役立つ
- 経歴として書ける
- エージェントがAWS案件振ってくれやすくなる

などがあります。

### AWS SAAの資格は実務に役立つ

これは実際に仕事で役に立ちます。

例えば実際仕事ではAWS SAAの知識があるとWell Architectedなシステムを構成することが出来ます。

これによってベターなWebのAWSのシステム構成を構築することが出来、Web開発をしているエンジニアにとってはインフラを構築出来る知識になります。

### AWS SAAの資格は経歴として書ける

AWSに特化した資格として認識してもらえるのでAWSの仕事を任せてくれたりします。

転職時は多少給料が変わったりすると思います。


### AWS SAAの資格があるとエージェントがAWS案件を振ってくれやすくなる

これは実際に登録しているエージェントからAWS SAAを取る前と後で比較すると、実際にAWSの案件を振られるようになったという実体験です。

エージェントにもある程度はよると思いますが、僕自身はAWSのみの案件もよく振られるようになりました。


## まとめ

「AWS SAAの資格をとったほうが良い事について」、実際に資格と取った現役エンジニアとして利点を説明しました。

詳しい内容はこちらの記事に書かれているのでこちらを参考にしてください:point_down:

https://technolog.jp/aws-saa-study/
[ESP32] 新しいESP32-H2 登場

ESP32, ESP32-C, ESP32-Sなどいろいろありますね。
今回ESP32-Hが出ました。

## まとめ
1．ZigbeeとBLEを使えるみたいです。
2．32-bit RISC-Vです。クロックレートは96 MHz、26 programmable GPIOsがある。
3．Thread 1.x, Zigbee 3.x. 

## ソース
- https://www.espressif.com/en/news/ESP32_H2

## Blogの内容

### 1
Espressif Systems (Shanghai) Co., Ltd. (SSE: 688018.SH), announces today the upcoming release of ESP32-H2 with IEEE 802.15.4 and Bluetooth 5 (LE) connectivity, operable in the 2.4 GHz band. ESP32-H2 enhances Espressif’s SoC portfolio far beyond Wi-Fi and Bluetooth connectivity by adding IEEE 802.15.4 connectivity as well. This SoC comes with an integrated DC-DC converter that enables ultra-low-power, energy-efficient operation. 

Espressif Systems（Shanghai）Co.、Ltd。（SSE：688018.SH）は本日、2.4GHz帯域で動作するIEEE802.15.4およびBluetooth5（LE）接続を備えたESP32-H2の次のリリースを発表しました。 ESP32-H2は、IEEE 802.15.4接続も追加することにより、Wi-FiおよびBluetooth接続をはるかに超えてEspressifのSoCポートフォリオを強化します。 このSoCには、超低電力でエネルギー効率の高い動作を可能にするDC-DCコンバータが統合されています。

### 2

ESP32-H2 combines two important connectivity technologies. IEEE 802.15.4 radio connectivity has been important to the supported mesh architecture with low power consumption. The availability of Thread and Zigbee protocols address a variety of application use-cases. Bluetooth LE supports point-to-point, broadcast and mesh communication topologies, while it also enables a direct communication between the smartphone and the device.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/9e30fb1b-8f46-22ea-b8a2-8d7dd4148158.png)


### 3

ESP32-H2 will support Thread version 1.x and Zigbee 3.x. Espressif, as an active member of CSA, will continue to develop and support the Matter protocol on ESP32-H2 for as long as the standard progresses. ESP32-H2 will be supported through Espressif’s mature IoT Development Framework (ESP-IDF), so that our customers can benefit from their familiarity with our field-proven platform that already powers millions of connected devices.

ESP32-H2は、スレッドバージョン1.xおよびZigbee3.xをサポートします。 Espressifは、CSAのアクティブなメンバーとして、標準が進歩する限り、ESP32-H2でMatterプロトコルを開発およびサポートし続けます。 ESP32-H2は、Espressifの成熟したIoT開発フレームワーク（ESP-IDF）を通じてサポートされるため、お客様は、すでに数百万の接続デバイスに電力を供給している実証済みのプラットフォームに精通しているというメリットを享受できます。

## Thread? 
- https://openthread.io/

グーグルが発表しOpenThreadはのオープンソース実装である®スレッド。 GoogleはOpenThreadをリリースし、Google Nest製品で使用されているネットワーク技術を開発者がより広く利用できるようにして、接続された家庭用および商業用の建物向けの製品の開発を加速しました。

狭いプラットフォーム抽象化レイヤーと小さなメモリフットプリントを備えたOpenThread（OT）は、移植性に優れています。システムオンチップ（SoC）とコプロセッサー（RCP、NCP）の両方の設計をサポートします。
openpyxl チートシート

![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411052/05dc66e4-8ff3-871a-259a-9c5cfc510f0b.jpeg)


日付：2021/09/17
分類：Python

openpyxlの使い方をよく忘れるので、チートシートにしました
（以下wb:ワークブック、sh:ワークシート）

#インポート
	import openpyxl

#ファイルを開く　読み込み
	wb = openpyxl.load_workbook(r'xxx.xlsx')

#シートを開く
	sh = wb.worksheets[0]	#シート番号
	sh = wb["Sheet1"]		#シート名指定
	sh = wb.active			#アクティブシート（保存したときトップ）

#シートのコピー
	sh2 = wb.copy_worksheet(sh)

#書き込む
	wb.save(r'xxx.xlsx')

wbを開くとメモリ上に展開されるので、データを作成、修正したものを書き込んでいきます。ただし、ここまでだとデータはまだメモリ上にあるので、最後にwb.save()でファイルに保存するというイメージになります。


#最大行数
	R = sh.max_row						#最終行

#最大列数
	C = sh.max_column						#最終列


#セル読み込み
	x = sh.cell(row=gyo, column=retsu).value	#１セルずつ
	ar = sh["B2:F5"]　			#２次元配列にまとめて読める

#セル書き込み
	sh.cell(row = gyo, column = retsu, value = x)
セル書き込みと言っても、この段階ではデータはメモリ上にあるので、最後にファイルに保存が必要です。

#行削除
	sh.delete_rows(gyo)

#列削除
	sh.delete_cols(retsu)

#行挿入
	sh.insert_rows(2, 1)

#列挿入
	sh.insert_cols(2, 1)

#複数のファイルに保存するときは
　以下wb:ワークブック、sh:ワークシート

①wbを開く（読み込みでもOK）
②wbからshを開く
③メモリ上で作成、修正
④wbをxxx.xlsxとしてファイルに保存
⑤wbをyyy.xlsxとしてファイルに保存

#複数のシートとして保存するときは
①wbを開く（読み込みでもOK）
②wbからwsを開き、メモリ上で作成、修正
③wsをws2などとしてコピー（メモリ上）　
④wbをxxx.xlsxとしてファイルに保存

##サンプルプログラム
たとえば、以下のようなデータあるとします
（ファイル名"Book1.xlsx"、シート名"Sheet1"）
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411052/8defab57-f7f2-541a-31ae-b0ac2090af5a.jpeg)

２行２列のセル（B2セル）のデータを読み取って表示するサンプルです

```py:test.py
import openpyxl
wb = openpyxl.load_workbook(r'Book1.xlsx')
sh = wb["Sheet1"]       #シート名指定
x = sh.cell(row=2, column=2).value 
print(x)
```
この例だと「山田」と表示されます

[replit](https://replit.com/@bkh4149/WideeyedSoulfulNumber#main.py)で試す


#セルの連結（セルの結合）

```py:merge.py
import openpyxl

def merge():
    wb = openpyxl.load_workbook(r'Book1.xlsx')
    sh = wb["Sheet1"]       #シート名指定
    
    # セルの結合
    sh.merge_cells("A2:A4")
    sh["A2"] = "merged"
    
    # 任意の名称で保存
    wb.save('test.xlsx')
```

![merge.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411052/4fbd751a-0010-2cd4-2047-fc1a63b233e2.jpeg)
UnitV2 自動起動アプリの停止

# １．はじめに

UnitV2ではプリインストールの画像認識アプルが自動起動しており、常にカメラが動作している状況です。
一方で、小さな筐体にハイスペックなCPUが動作している故に発熱問題が避けられません。
今後の利用方法として独自の画像処理を動かしたい、継続して動作させたい、という場合には発熱対策が必要になると思われるので、まずはこのプリインストールの画像認識アプリを停止したいと思います。

# ２．プリインストールアプリの停止
自動起動する画像認識アプリの構成と停止方法はこちらのサイトを参考にしました。
[M5Stack UnitV2でロボットを動かす（下準備）：ししかわの二足ロボ研修 Part.4](https://rt-net.jp/humanoid/archives/3933)

まず、画像認識アプリが動いている状態の負荷状況をTopコマンドで確認してみます、、のつもりでしたが、Jupyterからteminalを起動したので、「画像認識アプリは停止してJupyterNotebookが動いている状態」が以下です。
jupyter-notebookプロセスでCPU処理を消費していることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/32fd75ea-f7a6-c922-7373-a8fd705c85fa.png)

次に、参考サイトで紹介されている画像認識アプリの起動スクリプトを移動して自動起動しないようにして再起動してみます。
※jupyternotebookから起動するterminalでrootで実行しています。

```
mv /etc/init.d/S85runpayload /home/m5stack
```

再起動後、再度Topコマンドで負荷状況を確認。
高負荷なプロセスは動いていないように見えます。（これで発熱が下がることを期待）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/41a88f75-6c50-8cda-94f4-ab749d2b1540.png)

# ３．プリインストールアプリの手動起動

画像認識アプリはUnitV2の性能を披露するには見栄えもよくわかりやすいのでデモをする際などは再度起動したいケースもあるかと思います。
頭部ボタンを押しながらで起動したらプリインストールアプリも起動する、というようなこともやってみたかったのですが、ボタン押下起動はファームウェアップデート操作と被るので断念。
コマンドで手動起動する手順としました。

移動した起動スクリプトを引数：startで実行することで起動できます。
sudoを実行する際/dev/nullに権限がないとエラーになるので事前に実行しておくことに注意。
参考：[M5Stack UnitV2を弄るための備忘録](https://zenn.dev/blkcatman/articles/89a2d54a77f020)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/1e7ac974-a32a-1761-6e7c-f4dfabee7ee4.png)

これで起動できているように見えるが、実はエラーが発生していて起動できていなかった模様。
画像認識アプリのログは以下を参照
/tmp/payload.info

改めてsudoで実行。これで正常起動でき、unitv2.pyにもアクセスすることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/41d5e711-963f-bbc7-38f0-285a6d995464.png)

画像認識アプリ起動後、Topコマンドで負荷状況を確認。
デフォルト選択されている camera streamのプロセスの負荷が高そうです。
使わないのに常時起動していたら発熱の一因になりそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/3808e03a-784b-d450-97cc-7a460ff6ab7a.png)

# ４．その他

[前回Firmwareをアップデート](https://qiita.com/dsari/items/7733031580290e545db4)しましたが、Firmwareのバージョン的なものはどこでわかるのでしょうか？
とりあえず、今回の作業の過程で起動スクリプトの一覧を確認することはできました。
20210907版のFirmwareアップデートで更新されたと思われる、Sep 6更新スクリプトが確認できます。
とりあえずはこちらで判断するしかないのでしょうか。。。？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2042441/2044b9db-1332-1aef-fbb2-be137522b43d.png)
新しい言語を習得するコツ

# どんな外国語でも半年でマスターしてしまう方法
https://www.youtube.com/watch?v=d0yGdNEWdn0

## 5つの原則
1. 自分にかかわるところに集中 (生きろ！クマをみたら逃げろ！)
2. 新言語を1日目からコミュニケーションの道具として使う (赤ちゃんがやるように！)
3. 伝達内容はあらかじめ理解すると自然と身につく (前に聞いたことがある！)
4. 肉体的にトレーニングする (口の筋肉を動かせ！)
5. 心理状態が重要 (リラックス、楽しい！)

## 7つの実践法
1. たくさん聞く (パターン、リズム)
2. 意味を最初につかむ (ボディランゲージなどで) 
3. MIXする 10 x 10 x 10 = 1000通りになる
4. コアの3000語のみでOK
5. 親の役割を見つけよ (間違っても大丈夫)
6. 顔、口の動きをまねよ。
7. イメージを結びつけよ (fireで炎のイメージが浮かぶように) 

# 新しい言語を学ぶための秘訣
https://www.youtube.com/watch?v=o_XVt5rdpFY
## 4つの秘訣
1. 本人が楽しんでできるための工夫をすること
2. 長期記憶できるよう繰り返しできるアプリなどを用いる
3. 早起きする、隙間時間にできるなどの仕組みをつくる
4. あ！わかった！と成功体験ができるまで辛抱する
プロダクトオーナー（概要・イメージ）

![PO-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955975/a0d7b608-e7af-7d42-2a48-1b997d289d45.png)

スクラム開発のプロダクトオーナーって、聞いたことある人は多いかもしれませんが、
何を実施すれば良いか具体的なイメージって湧かないですよね！

プロダクトオーナーのざっくり説明すると、
プロダクトオーナーとは、プロダクト価値を最大化することを考える人のことです。
簡単にいうと「何を開発するか決める人」のことです。

顧客にとって最も価値があるプロダクトを作成するためには、ニーズを正確にキャッチし、
スクラムチームへプロダクトのビジョンを明確に共有する必要があります。

![POの役割.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955975/ec19656e-9426-ecbe-1d69-dea51836e7fc.png)

図のように、POは以下4つを実施します。
・顧客への課題、ニーズのヒアリング
・関連部署との調整
・スクラムチームへ顧客の要望やプロダクトビジョンの共有
・プロダクトバックログの作成及び、スクラムチームへの説明

プロダクトオーナーはプロダクト価値の最大化に、プロダクトやスクラムチーム、ステークホルダーと常に向き合い、コミュニケーションが取れる必要があります。
そのため、他業務との兼業は必ず避けてください！

また、スクラムマスターとの兼務もするべきではありません。
スクラムマスターはPOと開発者の架け橋となり、チーム全体のサポートを実施します。役割的にPOと兼務するには立ち位置的に難しいです。

長くなるので、続きは以下でまとめてます。

https://do-scrum.com/po/
Microsoft Teamのメンバーの名前・所属・役職をPowerShellを使ってCSVに出力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/2fe298d7-e8c5-f735-d9d1-c34649275068.png)
チームのメンバーを棚卸したいという要望を受けてPowerShellスクリプトを作成しました。

https://github.com/wataruf01/Microsoft365/blob/main/PowerShell/GetTeamMembers/GetTeamMembers.ps1

#背景
該当のチームは社内の全ての部署の社員が参加するチームであり、会社に対する要望や意見について情報交換をすることを目的にしたチームです。

このチームは会社の役員（社長と執行役員）を含めないルールとしています。そのため、チームの棚卸のときにはメンバーの抜け漏れのチェックだけでなくルール上追加されてはいけない社員を追加していなかのチェックを行う必要があります。

このチームメンバーの棚卸を行ういい方法はないかという質問をうけて、メンバー一覧を役職名を含めて出力するスクリプトを作成しました。

#そもそもTeamsのメンバ一覧は標準機能で出力できないのか？
2021年9月現在、該当する機能は無いです。「こんな機能がリリース予定のようです」等の情報がもしあれば共有いただけると嬉しいです。

#ではどうやってメンバー一覧を出力するか
PowerShellを使います。
まずは、スクリプトを実行するために必要なモジュールをPCにインストールします。管理者権限で下記コマンドを実行してください。

```powershell:モジュールのインストールコマンド
Install-Module MicrosoftTeams
Install-Module AzureAD
```

モジュールのインストールが完了したら、下記スクリプトを使います。
以下の2箇所はテナントによって置き換えてください。
・実行アカウントのID/パスワード
・対象チームのID

```powershell:チームメンバーをCSVに出力するスクリプト
$adminUserName  = "XXX@XXX.onmicrosoft.com"
$securePassword = "XXX" | ConvertTo-SecureString -AsPlainText -Force
$credentials = New-Object System.Management.Automation.PSCredential($adminUserName, $securePassword)

Connect-AzureAD -Credential $credentials
Connect-MicrosoftTeams -Credential $credentials

#全ユーザーを取得
$azureADAllUser= Get-AzureADUser -All $true

#チームのメンバーをCSVに出力
$teamMembers =  Get-TeamUser -GroupId "XXXX-XXXX-XXX-XXXX-XXXX"
$members = @()
foreach($member in $teamMembers)
{
    $currentUser = $azureADAllUser | where ObjectID -EQ $member.UserId

    $obj = New-Object PSObject
    $obj | Add-Member -MemberType NoteProperty -Name DisplayName -Value $currentUser.DisplayName
    $obj | Add-Member -MemberType NoteProperty -Name Mail        -Value $currentUser.UserPrincipalName
    $obj | Add-Member -MemberType NoteProperty -Name Department  -Value $currentUser.Department
    $obj | Add-Member -MemberType NoteProperty -Name JobTitle    -Value $currentUser.JobTitle
    $members += $obj
}

$members | Export-Csv -Path .\TeamMember.csv -Encoding UTF8 -NoTypeInformation

```

テナントによって置き換える対象は以下の2つです。

ひとつめ。実行アカウントのID/パスワード。<font color="Red">
$adminUserName  = "XXX@XXX.onmicrosoft.com"
$securePassword = "XXX" | ConvertTo-SecureString -AsPlainText -Force
</font>

ふたつめ。対象チームのID。<font color="Red">
 #チームのメンバーをCSVに出力
$teamMembers =  Get-TeamUser -GroupId "XXXX-XXXX-XXX-XXXX-XXXX"
</font>

チームのIDは「チームへのリンクを取得」から入手できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/2c683440-050b-aa25-f430-276ff0720e5b.png)

ポップアップで表示されたリンクをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/cec25207-8480-94f7-1481-dc89a2971325.png)

メモ帳に貼り付けます。「groupID」がチームのIDなのでこの部分をコピーして先ほどのスクリプトで使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357828/fd63d8a3-0a85-c98c-1dcf-62ab1b339af1.png)

以上です。
[Python] 動的計画法　ABC219D

#[ABC219D](https://atcoder.jp/contests/abc219/tasks/abc219_d)

動的計画法で解く。



動的計画法による外部設計は次のようになります。

dpの定義：

```math
dp[i][j][k]=(i番目までの弁当で、たこ焼きはj個、たい焼きはk個食べる最小の個数)
```

dp漸化式の定義：

```math
dp[i+1][j+A_{i+1}][k+B_{i+1}] = min(dp[i][j+A_{i+1}][k+B_{i+1}], dp[i][j][k] + 1)\\
dp[i+1][j][k] =min(dp[i][j][k],dp[i+1][j][k])\\
```
ただし、$j+A_{i+1}>X$ でこの弁当を購入するとたこ焼きが $X$ 個を超える場合は $j+A_{i+1}$ の代わりに $X$、$k+B_{i+1}>Y$ でたい焼きが $Y$ 個を超える場合は $k+B_{i+1}$ の代わりに $Y$ にします。

dp初期条件：

```math
dp[0][0][0] = 0\\
dp[i][j][k] = ∞
```
求める解： $dp[N][X][Y]$
最後に $dp[N][X][Y]=∞$ なら、すべての弁当を買っても目標を達成できないので、`-1` を出力します。

計算量は、計算量は $O(NXY)$ です。

```python:サンプルコード(PyPy3)
def main():
    INF = 1000
    N = int(input())
    X, Y = map(int, input().split())
    dp = [[[INF] * (Y + 1) for _ in range(X + 1)] for _ in range(N + 1)]

    mat = []
    for _ in range(N):
        a, b = map(int, input().split())
        mat.append((a, b))

    dp[0][0][0] = 0

    for i in range(N):
        x, y = mat[i]
        for j in range(X + 1):
            jj = min(j + x, X)
            for k in range(Y + 1):
                dp[i + 1][j][k] = min(dp[i + 1][j][k], dp[i][j][k])
                kk = min(k + y, Y)
                dp[i + 1][jj][kk] = min(dp[i + 1][jj][kk], dp[i][j][k] + 1)

    print(dp[N][X][Y] if dp[N][X][Y] < INF else -1)


if __name__ == '__main__':
    main()
```

本番では解法と外部設計までほぼ模範解答出来たのだが、そこまでに時間を掛け過ぎたこともあり、実装する時間が足りなかった。
Proxmox  Backup Server 2への上げ方

https://pbs.proxmox.com/wiki/index.php/Upgrade_from_1.1_to_2.x

## version 1 から 2へ上げる手順

```sh
apt update
apt dist-upgrade

sed -i 's/buster\/updates/bullseye-security/g;s/buster/bullseye/g' \
  /etc/apt/sources.list

echo "deb http://download.proxmox.com/debian/pbs bullseye pbs-no-subscription" \
  > /etc/apt/sources.list.d/pbs-enterprise.list

sed -i 's/buster/bullseye/g' /etc/apt/sources.list.d/pbs-repo.list

apt update

systemctl stop proxmox-backup-proxy.service proxmox-backup.service

apt update
apt dist-upgrade
```

```sh
reboot
```
テーブルの変更（INSERT,UPDATE,DELETE）の更新前後の差分を確認するSQL

# サンプル
テーブル T1 に対して更新を行い

T1

| ID   | VALUE |
| :--- | :---- |
| 1    | aa    |
| 2    | bb    |
| 3    | cc    |
| 4    | aa    |
| 5    | dd    |

更新後の状態を T2 とした場合
T2

| ID   | VALUE |
| :--- | :---- |
| 1    | aa    |
| 3    | kk    |
| 4    | aa    |
| 5    | dd    |
| 6    | ee    |

更新内容は以下の通り
ID=2のレコードは削除されている
ID=3のレコードは値が更新されている
ID=6のレコードは追加されている



更新内容を一覧で確認できるSQLです。

```SQL
SELECT
  ID
, VALUE
, SUM(FLG) AS CHK
, CASE SUM(FLG) WHEN 1 THEN '旧' WHEN 2 THEN '新' END AS 新旧
FROM 
  (
  SELECT * , 1 AS FLG FROM T1
  UNION
  SELECT * , 2 AS FLG FROM T2
  ) AS T
GROUP BY
  ID
, VALUE
-- GROUP BYには、テーブルのすべてのカラムを指定します
HAVING SUM(FLG) <> 3
ORDER BY ID
```


結果

| ID   | VALUE | CHK  | 新旧 |
| :--- | :---- | :--- | :--- |
| 2    | bb    | 1    | 旧   |
| 3    | cc    | 1    | 旧   |
| 3    | kk    | 2    | 新   |
| 6    | ee    | 2    | 新   |

CHK列が
1のみのレコード⇒削除されたレコード
1,2のレコード⇒いずれかの値が更新されたレコード（1が更新前、2が更新後）
2のみのレコード⇒追加されたレコード
3のみのレコード(HAVING句で対象外としているので表示されない)⇒変更のなかったレコード
となります。



WINDOW関数が使えるなら、より分かり易く以下のようにすることも可能です。

```sql
WITH SUB AS (
SELECT
  ID
, VALUE
, SUM(FLG) AS CHK
FROM 
  (
  SELECT * , 1 AS FLG FROM T1
  UNION
  SELECT * , 2 AS FLG FROM T2
  ) AS T
GROUP BY
  ID
, VALUE
-- GROUP BYには、テーブルのすべてのカラムを指定します
)

SELECT
  ID
, VALUE
, CHK
, CASE CHK 
  WHEN 1 THEN
    -- PARTITION BY にはテーブルのKEYを指定する(複数列の指定も可)
    CASE WHEN COUNT(CHK) OVER(PARTITION BY ID) = 2 THEN '更新前' ELSE '削除' END
  WHEN 2 THEN
    CASE WHEN COUNT(CHK) OVER(PARTITION BY ID) = 2 THEN '更新後' ELSE '追加' END
-- WHEN 3 THEN
--  '変更なし'
  END AS 変更
FROM SUB
 WHERE CHK <> 3
ORDER BY 
  ID
, CHK
```
結果

| ID   | VALUE | CHK  | 変更   |
| :--- | :---- | :--- | :----- |
| 2    | bb    | 1    | 削除   |
| 3    | cc    | 1    | 更新前 |
| 3    | kk    | 2    | 更新後 |
| 6    | ee    | 2    | 追加   |


# 応用記事

https://qiita.com/takahasinaoki/items/46ce702120ff1795541a
フリーランスエンジニアがモチベーションを上げるには？

## はじめに
フリーランスエンジニアとして働いているけど、モチベーションが上がらずに仕事が捗らない……。なんてことはよくあると思います。

なんとかモチベーションを上げなければいけないのですが、その方法がわからないと生産性に大きく影響します。

しかし、ズバリ言ってしまえばモチベーションは幻想です。

モチベーションで左右されないためには、自分なりの仕事を進める上での仕組み化が必要になってきます。

そこで、ここではモチベーションが上がらない要因や、生産性を上げるために必要なことについて解説していきます。

※この記事は個人で仕事を請け負っているフリーランスエンジニア向けに書きました。

## フリーランスのモチベーションが上がらない原因は？

モチベーションが上がらない原因はさまざまですが、ここでは下記3つについて見ていきます。

- 長時間労働が常態化している
- マルチタスク気味
- 仕事環境が悪い

### 長時間労働が常態化している
毎日夜遅くまで働いているのなら、仕事内容を見直すべきです。

特にフリーランスエンジニアは納期の関係や予期せぬトラブルで、セルフブラック化しやすいです。長時間仕事ばかりしていては、モチベーションが下がって生産性がガタ落ちします。

ストイックになれるならまだしも、人間それほど集中力が持続しません。

ふとした瞬間に集中力が切れてしまって仕事が手につかなくなる…。なんてことにならないよう注意が必要です。

こちらの記事では、フリーランスはつらいと感じる4つの原因について解説しています。合わせて参考にしてください。

[フリーランスはつらいと感じる4つの原因と3つの解決法](https://www.furikatu.com/free-hard/)

### マルチタスク気味
マルチタスクとは、さまざまな仕事を同時にこなすという意味ですが、集中力が散漫になると生産性は上がりません。

あれもこれもやらなければいけないというプレッシャーから、モチベーションが低下することは十分にあり得ます。

また、集中力を要するクリエイティブな仕事をしているときに、メールやチャットツールなどから通知が頻繁に来るような状態も好ましくありません。

注意力が散漫で作業中によそ見しがちな人は、集中力を上げるための環境を作る必要があります。

モチベーションを上げるためには1つの作業に集中する工夫が必要です。

### 仕事環境が悪い
仕事をする環境ですが、机や部屋が散らかっていると、それだけで注意力が散漫となり集中力の妨げになります。

すぐ使わないものはしまっておいたり、誘惑の元となるものは、目の届かない場所に移動しておきます。

整理整頓をしっかりやっておくことで、仕事中に余計なことに気を取られることなく、集中して作業ができます。

PCのデスクトップ上も同様に、不要なアイコンは置かずにすっきりとさせておきましょう。

また、エンジニアは長時間椅子に座って作業するので、腰痛対策も大切です。私が使っている「スタイルアスリート」は座るだけで骨盤を安定させて正しい姿勢をサポートするので、おすすめです。

下手に高級なオフィスチェアを買うよりは「スタイルアスリート」を強くおすすめします。スタイルアスリートを使った感想はこちらの記事で解説しています。

[スタイルアスリートを2年間使った感想と実感した効果](https://www.furikatu.com/style-athlete/)


## モチベーションは幻想！習慣を変えればうまくいく
### 習慣を変えるためには
冒頭で少し触れましたがモチベーションは幻想です。集中して作業を続けるためには「習慣化」することが何よりも大切です。

習慣化してどうしても作業をやらざるを得ない状況を作れば、モチベーション関係なく仕事でパフォーマンスを発揮できます。まずは自分の仕事を見える化しましょう。

そのためにはタスク管理が重要です。タスクを管理するためにはさまざまなツールがありますが、使いこなせている人は少ないのでは？

仕事を期限までひと目でわかるようにするには、Googleカレンダーがおすすめです。

Googleカレンダーを使えば、何をいつまでにやらなければいかないかがひと目でわかるようになり、タスクのメンテも楽なのでぜひ使用してみてください。

また、仕事の難易度によって作業する時間帯を決めておくことも大切です。たとえば、午前中に集中したい仕事をこなして、午後はルーチン作業など集中力を要しない仕事に充てるなど。

休憩するタイミングも大切で、2時間働いたら30分の休憩を取る、ポモドーロテクニックを利用して30分ごとに5分の休憩を取るなどメリハリも必要になってきます。

そして、集中して作業ができたら、どういう状態なら作業に集中できたかを覚えておきましょう。そうすることで、次回集中力を要する仕事をするときに前回集中できたときと同じ環境を作ればよいだけなので。

### 仕事を楽しむ工夫も必要
その仕事は、自分のキャリアアップのためになっていますでしょうか？

せっかくフリーランスエンジニアになったのなら、ただお金を稼ぐだけの仕事はしないで、自分を高めるための仕事をしましょう。

仕事を楽しむためには休暇も計画的にとる。これだけ働いたら、稼いだら連休を取ってやりたいことをやるなど、目標を作れば、さらに仕事に対する意欲も増してきます

## 気分転換も大事
人間どうしても気分に波があって、モチベーションが下がって仕事が手に付かないときは誰にでもあります。

絶不調のときはいったん仕事を中断して、出かけてみたり、昼寝する、好きなことをするなど、仕事以外のことをして気持ちを切り替えるなど工夫が必要です。

だいたい2時間くらい外出すれば、いつもどおり仕事ができることも多いです。

なかなか仕事が手に付かない状況に陥ってしまった場合、お金に余裕があるならクライアントと相談してしばらく休んでなにもしないことも大切です。

## まとめ
ここではフリーランスのモチベーションを上げる方法について紹介しました。モチベーション上げるためには習慣化するための環境をつくることが大切です。

モチベーションというものはそもそも幻想なので、どうすれば効率よく仕事ができるか？を考えて仕組み化・習慣化することで、モチベーションが下がって仕事が捗らない……。なんて状態を防ぐことができます。

とくに働き詰めの状態が続くと、仕事自体が嫌になって何も手を付けられなくなる…。なんて状態に陥りやすいので、ここで紹介したように仕事も休みも計画的に取れるような工夫が必要です。
【AWS】初心に戻って1からVPCを構築してみた　ルートテーブル構築編

#はじめに
昨日の記事の続きです。VPCとパブリックサブネット、プライベートサブネットを構築しました。本日はルートテーブルを構築します。

ネットワークにデータを流すにはルーティング情報が必要です。
ルートテーブルは「宛先IPアドレス(住所)がAの時には、あの子ネットワークに流し、Bの時にはその子のネットワークに流すのだ」といった仕分けをするものです。

郵便局で年賀状の郵便番号箇所を機械が自動で読み取り、仕分けていくといった感じに似ていますね。

ここまでの過去の手順は以下にありますのでご参考ください。

https://qiita.com/hirockio2206/items/303f7f4ac993f7dabdb8

https://qiita.com/hirockio2206/items/f6060486fc6ec0f2c904

#構成図
今回は以下のルートテーブルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/2fd8e466-9b91-01db-0ebf-c9ff4b4bcd6e.png)


#手順
VPCを作成したタイミングで、デフォルトのルートテーブルが構築されています。
またサブネットを作成した時にこのデフォルトのルートテーブルが適用されています。
![スクリーンショット 2021-09-20 7.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/762d254a-2ecc-913c-d2df-f8efb55b4a1f.png)

ルートテーブルをクリックしてどんなルートテーブルができているか確認します。
rtbから始まる[ルートテーブルID]をクリックします。

[10.0.0.0/16]に含まれるIPアドレスがあればlocalに転送する設定になっています。
localとは自分の所属しているネットワークのことです。
この設定しかないので、[10.0.0.0/16]以外のパケット、例えば[192.169.1.0/16]などは破棄されます。
![スクリーンショット 2021-09-20 7.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/44c70be7-f39b-3199-9021-f087e24ed0c7.png)

今回は、パブリックサブネット[10.0.0.0/16]をインターネットに接続したいので[10.0.0.0/16]以外のパケットをインターネットゲートウェイに転送する設定を入れます。
具体的には[0.0.0.0/0]の範囲の宛先パケットはインターネットゲートウェイに転送する設定です。
[0.0.0.0/0]は全てのIPアドレスを指します。

1.左側のメニューペインから[ルートテーブル]を選択し、[ルートテーブルを作成]をクリックします。
![スクリーンショット 2021-09-20 7.59.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/9c32f55a-cbb2-76da-6b5a-055a7d518cae.png)

2.今回はパブリックサブネットに適用したいので、名前は[パブリックルートテーブル]に設定します。
VPCは今回作成したVPCを選択します。その後[ルートテーブルを作成]をクリックします。
![スクリーンショット 2021-09-20 8.02.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/c099d4b6-05a2-6be0-85b1-27f16ce571e9.png)

3.作成したルートテーブルを選択します。[ルート]タブから[ルートを編集]をクリックします。
![スクリーンショット 2021-09-20 8.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/97d1bb3b-5169-8b25-b8ba-e9dcd4a86da2.png)

4.[ルートを追加]をクリックし、送信先に[0.0.0.0/0]を選択します。ターゲットはインターネットゲートウェイを選択すると、作成したインターネットゲートウェイが選択できるのでクリックします。[変更を保存]をクリックします。
![スクリーンショット 2021-09-20 8.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/aff2a49d-e901-bafb-9130-4e3e360f1366.png)

5.サブネットを関連付けます。左側のメニューペインから[ルートテーブル]を選択し、[パブリックルートテーブル]を選択し、[サブネットの関連付け]を選択し、[サブネットの関連付けを編集]をクリックします。
![スクリーンショット 2021-09-20 8.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/09472152-078b-e949-5159-c8c1e0751bb3.png)

6.[パブリックサブネット]を選択し、[関連付けを保存]をクリックします。
![スクリーンショット 2021-09-20 8.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/38390691-7cb4-4c97-1b09-8b01ef2dabcd.png)

設定は以上で完了です。
左側メニューペインの[サブネット]から作成した[パブリックサブネット]を選択し、[ルートテーブル]タブのルートテーブルに[パブリックルートテーブル]の記載があることと、ルートのターゲットにigw-から始まるゲートトウェイが設定されていることを確認してください。
![スクリーンショット 2021-09-20 8.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1966337/72caea6e-6391-0eb6-e5cf-a9ba0a247afa.png)

#最後に
いかがでしたでしょうか。ルートテーブルはできましたでしょうか。
次回は仮想サーバを配置して疎通確認をしていきたいと思います。
ご参考になれば幸いです。
【Git】GitHubの草が生えないときにチェックするべきこと

![スクリーンショット 2021-09-20 7.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/f180baf2-63dd-0414-24a8-f10c279c4869.png)

#対象者

* GitHubの草を毎日生やそうとしている人
* GitHub初心者


#目的

* 毎日草を生やして、継続力の指標にする

#実際の手順と実例
##1.コントリビューション（草）とは

![スクリーンショット 2021-09-20 7.56.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1681213/0392799b-1e67-d96a-566e-83334928ef31.png)

* GitHubのマイページで閲覧できる上記の図のこと
* GitHubにどれだけ貢献したかという指標
* 就職活動時に見られることがある


##2.コントリビューションにカウントされる条件

###1.コミット

####必須条件（全てに該当しないとダメ）

#####1. コミットに使用されたメールアドレスが、GitHubアカウントに関連付けられている場合

ローカル環境のTerminalで下記のコマンドを実行する必要があります。

````Terminal.
$ git config --global user.email GitHubに登録したアドレス
$ git config --global user.name GitHubに登録したUser名
````

######2.　コミットが、フォークではなくスタンドアロンのリポジトリで行われた場合

フォークに関してはGitHubのヘルプページを参考にしました。

> フォークはリポジトリのコピーです。リポジトリをフォークすると、元のプロジェクトに影響を与えることなく、変更を自由に試すことができます。

https://docs.github.com/en/get-started/quickstart/fork-a-repo

スタンドアロンリポジトリとは他のリポジトリからコピー(フォーク)して作ったものではなく、誰かが自分自身で作ったリポジトリのことです。

簡単に言うと**ネットワークから切り離された状態**のことみたいです。

スタンドアロンは下記のサイトを参照させて頂きました。

https://wa3.i-3-i.info/word1255.html




これらを踏まえて条件をまとめると

* コピーしたリポジトリでは草は生えない
* 自分自身で作ったリモートリポジトリじゃないと草が生えない


#####3.コミットが以下で行われた場合

○　リポジトリのデフォルトブランチ内
○　 gh-pages ブランチ内

gh-pageは公式で調べましたが、自分にはまだ分かりませんでした、、、、

> GitHub Pages は、GitHub のリポジトリから HTML、CSS、および JavaScript ファイル を直接取得し、任意でビルドプロセスを通じてファイルを実行し、ウェブサイトを公開できる静的なサイトホスティングサービスです。 GitHub Pages サイトの例については、GitHub Pages サンプル集で見ることができます。

https://docs.github.com/ja/pages/getting-started-with-github-pages/about-github-pages

条件をまとめると

* デフォルトのブランチじゃないと草が生えない（切って作ったブランチでは草が生えない）


####最低条件（少なくとも１つ該当しないといけない）

1. リポジトリのコラボレーターであるか、またはリポジトリを所有する Organization のメンバーであること。
  チーム開発で作成したOrganization のメンバーから脱退した場合、そのリポジトリへのactionで発生していたコントリビューションの表示は消える
2.リポジトリをフォークしたこと。
3.リポジトリでプルリクエストまたは Issue を開いていること。
4.リポジトリに Star を付けたこと。

####２.Issue およびプルリクエスト

Issue及びプルリクエストは、「スタンドアロンのリポジトリ」で開かれた場合、コントリビューショングラフに表示されます。

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

* [GitHubに草が生えない時の対処方法](https://ryu-webstudy.com/2020/12/01/github-grass/)
* [新人ではないがGit初心者であるエンジニアが「このリポジトリをフォークしてローカルで開発できるようにしておいて！」と言われた時にやること](https://qiita.com/sky0621/items/8b6e88f4327b42ade5d7)
*
Youtube Data APIで動画をアップロードする

## 初めに

Youtube Data APIを使って動画をアップロードできたので手順をメモします。
既存の記事（私が見た範囲）では書かれていなかったところがあったりしたので誰かの参考になれば。
https://qiita.com/ny7760/items/5a728fd9e7b40588237c


## Youtube Data APIを利用するにあたりの概念理解

Youtube Data APIってどう使うのか分からない時、そもそもどういった構成になるかもイメージできなかったのでアップロードできた今、私のイメージで説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996214/5caaf4ef-20b1-c604-4e61-6d37703633c5.png)
この画像については参考程度にしてください。

Youtube Data APIはGoogle Cloud Platform（GCP）から利用することができるのでGCPへの登録が必要になります。あとはアップロード先のYoutubeチャンネル、そしてアップロードするPC（Pythonインストール済み）が必要です。

## 手順

以下が大まかな手順です。

1. GCP登録及びプロジェクトの作成
1. APIの承認情報作成
1. Youtube Data APIの有効化
1. PCへのPython3系のインストール
1. google-api-python-clientのインストール
1. アップロード用ソースの作成
1. アップロード実行

上記は事前準備含めたもろもろの手順といった感じです。おおまかな所は既存記事（ https://qiita.com/ny7760/items/5a728fd9e7b40588237c ）様と変わらないのですが細かいところで現在（2021/9/20）と差分があったので本記事ではそこに焦点を当てて説明します。

### APIの承認情報作成

作成手順は変わりないのですが作成された情報をJSON形式でダウンロードできる機能が追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/996214/eb2c8534-3277-7b88-b15b-9743a3b494df.png)
メモの手間が省けます。
ダウンロードしたものが以下です。

```json:client_secret_XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com.json
{
    "installed": {
        "client_id": "XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com",
        "project_id": "XXXXXXXXXXX-324613",
        "auth_uri": "https://accounts.google.com/o/oauth2/auth",
        "token_uri": "https://oauth2.googleapis.com/token",
        "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
        "client_secret": "SVrT4PWT_a1mc2qxjuTNhnwn",
        "redirect_uris": [
            "urn:ietf:wg:oauth:2.0:oob",
            "http://localhost"
        ]
    }
}
```

既存記事のclient_secret.jsonとはフォーマットが異なります。ダウンロードしたまま使えるかどうかわからないので既存記事のフォーマットに直しました。

### ソースコードのPython3系への修正対応
https://developers.google.com/youtube/v3/guides/uploading_a_video?hl=ja#Sample_Code
上記の公式サンプルコードは現時点（2021/09/20）ではPython2系用のコードになっています。
ですので既存記事様が行っているようにコードの修正が必要なのですが、私の場合記載箇所よりも修正する箇所が複数あったのでそこを説明します。

#### http.client
Python3は`httplib`から`http.client`に移行しているのでインポートライブラリを修正する必要があるのですがそれだけだと実行時に`httplib`が無いよと怒られてしまいます。なので以下のように私は直しました。

```python
import http.client as httplib  # httplibはPython3はhttp.clientへ移行
```

多分上記が一番楽です。

#### print
`print`の引数は（）で加工用にしましょう。

```python
# 例
print "Uploading file..." # 修正前
print("Uploading file...") # 修正後
```
コード検索ですべての`print`に対して修正をしてください。

#### except
`except`に関してもPython3では記載方法が変わっているので以下のように修正。

```python
except HttpError, e: # 修正前
except HttpError as e: # 修正後
```

### 終わりに
終わってみればなんてことなく終わったYoutube Data APIの利用。初めて利用するものってどこまで何をしないといけないかわからないので諦めてしまいがちですが今回は成し遂げられてよかった。
これを上手く使ってApexの動画を自動で自分のチャンネルに上げて好きな時に見られるようにしたい。
firebase Cloud Functions のコールドスタートを minInstances で回避してみる

# 概要

firebase の Cloud Functions のコールドスタートが遅すぎて、nuxt の ssr 側でエラーが発生する(原因はテキトー)ことを回避するために以下の記事を書きましたが、公式が推奨している minInstances も試してみました

[firebase Cloud Functions のコールドスタートを cloud schedule (cron実行) で回避してみる](https://qiita.com/gosshys/items/6c6ec9fd6a560f6696c4)

## 参考

- [関数のデプロイとランタイム オプションを管理する  |  Firebase](https://firebase.google.com/docs/functions/manage-functions?hl=ja#min-max-instances)
- [Cloud Functions に新たに導入されたインスタンスの最小数がサーバーレスのコールド スタートを削減 | Google Cloud Blog](https://cloud.google.com/blog/ja/products/serverless/cloud-functions-supports-min-instances)
- [Googleがコールドスタート低減のために最小インスタンスを導入](https://www.infoq.com/jp/news/2021/09/cloud-functions-min-instances/)

# やり方

簡単です。Cloud Functions の定義に `.runWith({minInstances: 1})`を足すだけ

```
exports.ssr = functions
  .runWith({
    minInstances: 1,
  }).https.onRequest(async (req, res) => {
  await nuxt.ready()
  return nuxt.render(req, res)
})
```

公式のガイドだと、`.https.onCall`の例でしたが、`https.onRequest`でもいけました
また、`minInstances`は、5となってましたが、ケチって1にしてみました

これで初回10秒の遅延 + ssr のエラーが無くなりそうです

# 注意

料金が $6 (659.94円) かかるとあります。無料枠内かしら...

```
注: 実行状態を維持する最小インスタンス数を設定すると、アイドル状態のレートで課金が発生します。通常、アイドル状態の関数インスタンスを 1 つウォーム状態に保つための料金は、月額 $6.00 未満です。Firebase CLI では、関数のデプロイ時に最小数のインスタンスを予約した場合の費用を見積もることができます。費用を計算するには、Cloud Functions の料金をご覧ください。
```
CypressでGitHub ActionsでのE2Eテストの状況をSlack動画通知する

# 結論

[Cypress Screenshot & Video Upload to Slack](https://github.com/marketplace/actions/cypress-screenshot-video-upload-to-slack)をよくみてクレメンス

## ハマりどころ

```
Inputs
token
Required Slack app token. See Internal app tokens

Create an app
Under Bot Token Scopes, add files:write and chat:write permissions
Install the app into your workspace
Invite the bot to whatever channels you want to send the videos and screenshots to /invite <botname>
Grab the Bot User OAuth Token from the OAuth & Permissions page
Add that token as a secret to your Github repo's Actions Secrets found under Settings -> Secrets (in the examples below we call it SLACK_TOKEN)
```

以下３点
- Under Bot Token Scopes, add files:write and chat:write permissions
- /invite botname
- Grab the Bot User OAuth Token from the OAuth & Permissions page

ここはGitHubの設定
- Add that token as a secret to your Github repo's Actions Secrets found under Settings -> Secrets (in the examples below we call it SLACK_TOKEN)



## いざ実行

```.github/workflows/e2e.yml
name: E2E Test

on:
  pull_request:
    branches: [ master ]

jobs:
  e2e-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: 'Run tests'
        uses: cypress-io/github-action@v2

      - name: 'Upload screenshots and videos to Slack'
        uses: trymbill/cypress-slack-video-upload-action@v1.3.0
        with:
          token: ${{ secrets.SLACK_TOKEN }}
          channels: 'proj-...'

      - name: 'Upload screenshots and videos to Slack'
        uses: trymbill/cypress-slack-video-upload-action@v1.3.0
        if: failure()
        with:
          token: ${{ secrets.SLACK_TOKEN }}
          channels: 'proj-...' 
          message-text: 'Cypress tests failed! They have been placed in this thread, good luck.'
```

![スクリーンショット 2021-09-20 7.21.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/09d48e5b-30e4-6fb8-590f-e7bf70a8529a.png)

![スクリーンショット 2021-09-20 7.22.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133718/81d95474-a542-9d88-06b5-287283f413d3.png)

## 参照

- [Cypress Screenshot & Video Upload to Slack](https://github.com/marketplace/actions/cypress-screenshot-video-upload-to-slack)
pwnの練習問題 その4



#概要

pwnの練習問題、やってみた。

#参考にしたページ。

https://qiita.com/hidenaka824/items/c64a681ed38096fdb7ea

#サンプルコード

```
# coding: utf-8
import subprocess
import os

def gcc():
	c_file = 'test.c'
	test_c = """
#include<stdio.h>

char *str_copy(char *d,const char *s){
  char *t=d;
  while(*d++=*s++);
  return t;
}

int main(void) {
  char str[4] = "ABC";
  char tmp[4];
  printf("str='%s' ", str);
  scanf("%s", tmp);
  printf("コピーするのは='%s'", tmp);
  //str_copy(str, tmp);
  puts(" コピーしました。");
  printf("str='%s' ", str);
  return 0;
}
"""
	with open(c_file, 'w') as f:
		f.write(test_c)
	os.system("gcc -fno-stack-protector test.c")
	os.system("./a.out")

if __name__ == '__main__':
    gcc()




```

#成果物

https://paiza.io/projects/H8B9tAn6RzDMXso4kaFLfw

以上。
Qiita VS Stack Overflow

# Qiita VS Stack Overflow
普段stackoverflowしか使うことはないが，しばしばQittaを使用せざるを得ないことがある．ここでは私なりのQiitaの存在意義と日本のディベロッパーに対する考えを綴らせていただこうと思う．

1. ___概要/比較___
2. ___Qiitaの存在意義___
3. ___おまけ___

## 概要/比較
Wikipediaによる両者の概要
>Qiita（キータ）は、Incrementsが運営するエンジニアに関する知識を記録・共有するためのサービス。2020年現在で日本最大級のエンジニアコミュニティの一つである．

>Stack Overflow（スタックオーバーフロー）はStack Exchange Networkの一つで、コンピュータや情報技術、特にプログラミング技術に関するナレッジコミュニティである．

つまりは双方ディベロッパー向けのナレッジコミュニティであり，フィーチャー的には大きく違いはないものの，利用者のダイバーシティには大きな違いがある．

利用者数については，Qiitaの50万人に対してStack Overflowは1400万人の利用者を誇る．
## Qiitaの存在意義
単純に利用者が多ければ新しい情報が頻繁に入るわけで，利用者が多い方がいいのは衆知であるが，なぜQiitaが使われるのか．


####日本語．．．
最も大きな理由として"日本語"の存在があるだろう．日本でパブリッシュするプロダクトには日本語での制作が不可避であり，その情報は日本国外のディベロッパーにとっては需要のないものばかりである．そのコアな情報を扱うには日本人ディベロッパーのコミュニティがあっても不思議ではない．

それに加え日本人ディベロッパーがStack Overflowを使わない/使えないのは紛れもなく"英語"という壁だろう，そもそも日本では高校の時点で文系と理系という風な分けられ方をされ，多くのディベロッパーは理系の道を歩んできたことだろう．そもそも日本人は外国語に長けた人材が少ないにもかかわらず理系の中では，よりその割合が減るのは疑う必要もない．


## おまけ
私個人の意見ではあるが，英語の壁というのは我々ディベロッパーにとって大きな弊害になっていると考え，英語の学習は，プログラミング言語に匹敵するほど優先度は高いと考える．そもそも世間一般に使われている言語は基本的に英語を軸に作られていることが多く，単純にライブラリの使用に関しても英語がわかれば感覚的に使えるように作られており，その点日本人は学習スピードが落ちると考える．また，日本が世界に比べ遅れているように感じるのは情報のパブリッシュから翻訳というワンクッションを挟むため，情報はネットに転がっているのにもかかわらず，実際に人々に届くまでの時間距離が長くなっているからであろう．
npx react-native run-android ⇒ settings.gradleでCompileエラーが出た時の対処法

# 前提
作者: アプリ開発初心者(半ヶ月)、初Qiita投稿
使用PC:Macbook air M1 chip
OS: macOS Big Sur ver:11.5.2
参考文献: ・https://stackguides.com/questions/58293436/could-not-compile-settings-gradle-react-native
・https://reactnative.dev/docs/environment-setup
# 本文
## 序論
はじめまして。
Web開発歴半ヶ月かつQiita初投稿という超未熟者ですが、少しでも参考になれば嬉しいです。
React Nativeで開発しようとした際、run-androidで早速コンパイルエラーが出て、だいぶ時間を浪費しましたが、解決したので共有します。

```terminal:エラー内容
:'エラー文はコピーし忘れたのですが、大体こんな感じでした'
FAILURE: Build failed with an exception.

Settings file 'C:\Users\user_name\Desktop\Study\TestReactNative\android\settings.gradle'
```

SDKのバージョンを変えてみたり、settings.gradle内の構文をいじってみたりと奮闘しましたが、どれもだめでした。
しかし、この記事を参考にしたらうまくいきました。
https://reactnative.dev/docs/environment-setup
内容をまとめます。
## 対処法
以下のコードをターミナルに打ち込んでみてください。

```terminal
cd /Library/Java/JavaVirtualMachines
sudo rm -rf *
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -rf ~/Library/Application\ Support/Oracle/Java
brew install --cask adoptopenjdk/openjdk/adoptopenjdk8
:'ここで、Warning:Cask 'adoptopenjdk8' is already installed などと出るが無視'
brew reinstall adoptopenjdk8
```

エラーの理由は、異なるバージョンのjdkが衝突してたから(?)。
とにかくこの記事で、読者の環境構築がうまくいけば幸いです。
iOSDC Japan 2021楽しかった！！🎉 💝

今回は技術というより、iOSDC Japan 2021に参加してみて
単純に楽しかった！！🎉 💝 😄
というので記事を書こうと思います。

一応登壇させて頂いたのですが、

https://fortee.jp/iosdc-japan-2021/proposal/f4eeade3-e50b-4a49-91dc-22bbba321ecb

そんなことより、iOSDCの多くの方の参加者・スタッフ・スポンサー・スピーカー(4つのS)によって
こんなに楽しい雰囲気になるんだなと思いました。

イベントも色々あり、実行委員長が突然セグウェイに乗って登場したり、

![スクリーンショット 2021-09-20 3.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/9b2dd259-4693-dbc1-5076-a25c9516c93f.png)

LTで機器トラブルか何かで接続が切れてしまった、[ころころ](https://twitter.com/corori_22) さんの
再チャレンジをみんなで応援したり、

![スクリーンショット 2021-09-20 3.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/909db998-0566-9287-6d5b-5c5c97e1ff2d.png)

最後はエンディングで泣きそうでしたw

![スクリーンショット 2021-09-20 3.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308423/facc82c1-2b06-14fb-e478-e973bc021857.png)

初めてスピーカーとして参加して、iOSDCというイベントにわずかながら寄与させて頂いて、作り手の一部となれることが
こんなに楽しいことなのだなと初めて実感しました。
今回は自分にとっても一生の思い出になりました！！！🎉 💝

また来年も参加できるように頑張ります🙇‍♂️

皆様、お疲れ様でした！！ありがとうございましたーーーーー！！！！
PAYJPで入力されたクレジットカード情報を取得する（iOS,Swift）

PAYJPを導入したiOSアプリで入力されたクレジットカード情報を取得する方法を見つけるのに苦戦した。

## PAYJPで入力されたクレジットカード情報が必要になる機会

・CardFormViewControllerに入力された名前をバリデーションする
・SDKのUIを使わずに直接トークンを生成する
・カードフォームを利用せずトークン化してバリデーションを行う

といった場合に必要になる。

## PAYJPで入力されたクレジットカード情報を取得するコード(Swift)

決済処理を行うファイルにて「import PAYJP」をして以下のコードを記述。
＊CardFormViewControllerの実装コードは省略しています。

```swift

func cardFormViewController(_ formController: CardFormViewController, didProduced token: Token, completionHandler: @escaping (Error?) -> Void) {

    print(token.card.id)// car_e3ccd4e0959f45e7c75bacc4be90 カードID
    print(token.card.last4)// 4242 クレジットカード番号の下四桁
    print(token.card.exp)// 2/2020 クレジットカードの有効期限
    print(token.card.name)// TAROU YAMADA クレジットカードの名義

}

```

カードIDとはcar_で始まり一意なオブジェクトを示す、最大32桁の文字列を指す。


## 参考情報

https://pay.jp/docs/mobileapp-ios

https://pay.jp/docs/api/#token-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
値レシーバとポインタレシーバの違いについての備忘録（new UserとUser{}を使った場合について）


Go初心者で躓いたのでメモとして残します。
`type User struct { Name string }` があるとする。
`u := new(User)`と、`u := User{}`では、値レシーバとポインタレシーバを使う際どう異なるのかを、暗黙の変換に着目してまとめてみた。

```go
package main
 
import "fmt"
 
type User struct {
	Name string
}

// メソッド（値レシーバ）
func (u User) setValueName() {
	u.Name = "gopher"
}

// メソッド（ポインターレシーバ）
func (u *User) setPointerName() {
	u.Name = "gopher"
}

func main() {
	// 値レシーバ
	u1 := new(User) // uは*User型
	(*u1).setValueName()
	fmt.Println("u1.Name:", u1.Name, "*u1:", *u1, "&u1", &u1)
	// u1.Name:  *u1: {} &u1 0xc0000b8018
	u2 := User{} // u2はUser型
	p2 := &u2
	(&u2).setValueName()
	fmt.Println("u2.Name:", u2.Name, "*u2(p2):", *p2, "&u2:", &u2)
	// u2.Name:  *u2(p2): {} &u2: &{}

	// ポインタレシーバ
	u3 := new(User) // u3は*User型
	(*u3).setPointerName()
	fmt.Println("u3.Name:", u3.Name, "*u3:", *u3, "&u3", &u3)
	// u3.Name: gopher *u3: {gopher} &u3 0xc0000b8028
	u4 := User{} // u4はUser型
	p4 := &u4
	(&u4).setPointerName()
	fmt.Println("u4.Name:", u4.Name, "*u4(p4):", *p4, "&u4:", &u4)
	// u4.Name: gopher *u4(p4): {gopher} &u4: &{gopher}
}
```

ちなみに、直接 `*u2`(または`*u4`)とすると以下のエラー文が出てくる：
`invalid operation: cannot indirect u2 (variable of type User)`

これは、直接`u2`のポインタにアクセスしようとしたため起きたエラーである。
したがって、どうしても`u2`経由で`u2`のポインタを取得したい場合、以上のように一旦`u2`へのポインタを変数`p2`に格納して利用すれば良い。

---
参考記事
[Goのstructやレシーバについての備忘録](https://qiita.com/tikidunpon/items/2d9598f33817a6e99860)
線形回帰モデル　vol.4

#前記事
https://qiita.com/yudaiyamashita/items/55dcd075d4d8965c0932

#参考書

多変量解析入門　小西貞則著

#AIC
$AIC$は元はAn information criterion, Akaike's information criterionである.

情報量基準AICとは情報の尤度が低いものを貴重とする考え方で以下の式で与えられる。

$$AIC = -2(モデルの最大対数尤度)+2(モデルの自由パラメータ数)$$

つまりAICが低い方が尤度が高く、その時の変数の組が最も適切なモデルとされる.

これは第一項のみでいいように一見思える。

（注：対数関数は増加関数である。繰り返しになるが尤度は確からしさのこと。）

ただし、観測したデータに対して当てはまりの良いモデルを求めるには多数のパラメータを含む複雑モデルのほうが良いが、複雑すぎるモデルは将来の現象予測には有効に働かない。

これは多項式からなる関数において、問題によっては局所近似(マクローリン展開)して2次以上の項を無視するのと同様、なるべく“項の数”を減らした方が考えやすいという発想である。特にパラメータの数が多すぎると偶発的な要因もモデルに組み込まれてしまう。

将来予測の観点から最適なモデルを選択するには、モデルのデータへの適合度とモデルの複雑さを適切に制御する必要がある. 

第一項はモデルの当てはまりの良さを最大対数尤度で測り、第二項は自由パラメータ数がモデルの複雑さに対するペナルティとして機能しているといえる。

# ちなみに

変数の取り方によってモデルの有り様は変わる。

$$F = X_1 + {X_2}^2$$

と表される関数$F$が、$(X_1, X_2)=(時間t, 質量m)$とするのか
$(X_1, X_2)=(長さl, 質量m)$とするかで指し示すものは異なる。

# 前回の内容を引き継ぐ

ガウス型線形回帰モデルに対する最大対数尤度とは, 対数尤度関数にパラメータベクトル$\boldsymbol \beta$と誤差分散$\sigma^2$の最尤推定値式(ハット記号$\hat{}$を付けたもの)を代入した

$$l(\hat{\boldsymbol \beta}, {\hat{\sigma}}^2)= -\frac{n}{2}\log{2\pi\hat{\sigma}^2}-\frac{n}{2}$$
である. 

自由パラメータの数については回帰係数の数が添え字$0$から$p$までとしたら$p+1$個、誤差分散の数で1個、計$p+2$個である. 

よって先ほどの式に代入すると

$$AIC = -2 (l(\hat{\boldsymbol \beta}, {\hat{\sigma}}^2)- (p+2)) $$
$$=n\log{2\pi \hat{\sigma}^2}+ n + 2(p+2)$$

例
セメントの発熱量予測、など。

vol.5へ続く。

https://qiita.com/yudaiyamashita/items/dffc1faee61a34df6fa7