OmniAICreator/Qiita-1.07M huggingface dataset:
Githubことはじめ（１）：ユーザ登録と自己紹介文の登録

# この記事の内容
![Github_0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871511/2ecabb03-5fa8-7657-b46f-9c8f019f41f7.jpeg)
Githubの簡単な紹介、基本的な用語、ユーザ登録、自己紹介の登録、について書いています。

以下については、別記事を参照ください（書き次第リンクはります）。
・Githubの基本的な使いかた
・GithubでのWebpageの作り方

# はじめに
Githubの意味や使い方が最近ようやく分かってきたので、記録しておきます。
「リポジトリって、場所でしょ？　場所をクローンするって、何？？」
「コミットとプッシュ、フェッチとプルの違い」
「ファイルの取得方法が分からず、全部手作業でzipダウンロードして解凍していた、、めんどくさい、、」
「コピーしてきたプログラムの使い方が分からない」
そういうことが分かると、できることが急にふえて、ちょっと楽しくなりました。
誰かのお役に立てば幸いです。

# Githubとは何か
https://github.com/
自分のプログラムをバージョン管理したり
（時系列：旧バージョンの保管や遡り・切り替えが簡単にできる）
（種類：一つのプロジェクトに対し複数のバリエーションを並列で保持できる）
他人とコードを共有し共同作業することができるプラットフォーム。
大きいサイズのファイルでも授受が簡単にできるので、ここにプログラムを置いてURLを教えれば手間なく共有できる。


#基本的な用語
##リポジトリ（repository）
プログラム・設定情報・説明書などの保管場所のこと。
リポジトリは、基本、プロジェクトごとに分かれている。
「場所」と言われるとパスのことか？と思って混乱してしまうが、
その保管場所に置かれている、「プロジェクト単位のプログラム等一式」のことと考えたほうが分かりやすいかもしれない。

以下の2種類のリポジトリがある。
リモートリポジトリ：インターネットまたはどこかのネットワーク上のリポジトリ。ここで他人とプログラムを共有・公開する。
ローカルリポジトリ：自分のローカル環境上のリポジトリ。自作の場合もあれば、他人のリポジトリをクローンしてきた場合もある。
　
Githubでは、
https://github.com/fikuegc/hello-world　というリモートリポジトリであれば
fikuegcがアカウント名で、hello-world がリポジトリ名を表す。

## クローン（clone）
リモートリポジトリからリポジトリのコピーをローカルに取得すること。

## ブランチ（branch）
同じプロジェクトをリポジトリ内で複数のバージョンに分け、並列で作業を進めることができる。
その各バージョンのこと。
「master」という名前のブランチが、メインのブランチ（決定版）となる。
例えば、お店屋さんプロジェクトのリポジトリ内で、品出し作業ブランチ、レジ作業ブランチ、のように、複数人で同じプロジェクトの作業を行ったり
お試しでコードをちょっと書いてみるためのブランチなど、自由にブランチを追加できる。
ブランチの内容が確定して、そのプロジェクトに必要な内容だと判断されれば、そのブランチをmasterブランチ（または、メインとなるブランチ）に統合する。

## コミット（commit）
作業中のリポジトリ（基本的にはローカルリポジトリ）にプログラムの変更を反映・記録すること。
github上で自分のリポジトリに対し直接作業する場合（リモートリポジトリ上での作業）は、コミットしたらリモートリポジトリに変更が反映・記録されることになる。

## プッシュ（push）
リモートリポジトリにプログラムの変更を反映・記録すること。
ローカルで作業している場合は、コミットしただけでは自分の手元でしか変更が反映されないので注意。

## フェッチ（fetch）
リモートリポジトリの内容をローカルリポジトリに取り込むこと。
pushの対。

## プル（pull）
リモートリポジトリの内容をローカルリポジトリに取り込み、
現在ローカルのブランチに対して、それに対応するリモートのブランチをマージすること。

## マージ（merge）
統合すること。取り込んだリポジトリの内容を手元のリポジトリに統合したり、複数のブランチを統合したりする。

# GitHubにユーザ登録する
ユーザ登録は無料
・ブラウザで https://github.com/ を開く。
・画面右上の「Sign up」から新規登録。
→　ユーザ登録完了

#Githubに自己紹介のREADMEを登録
自分のGithubのスペースに自分のアカウント名のリポジトリを作り、そこに自己紹介を書くことが推奨されています。
自分のGithubのトップページにそれが表示されます。
README.mdという、通常はリポジトリの説明を書くファイルで自己紹介する、というのがかわいいですね。

1. ユーザ登録後に https://github.com/を開いてログインすると、「All activity」のところに
「Introduce yourself」というお誘いが表示される。
![20210809_0.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1871511/861724a7-889b-c464-305f-62d9672e57a9.jpeg)

2. 緑の「Continue」ボタンをクリックして、表示されたページで自己紹介文を書く。
サンプル文が入力されているので、それを書き換えるとよい。
まずは、行頭の - が箇条書きを表すので、その後に続けて自己紹介文を書く。
ちなみにここでは、https://github.com/（自分のユーザ名）/（自分のユーザ名）/README.md のファイルを編集していることになる。
mdファイルはMarkdownという形式で書かれるファイルなので、Markdownの書式を調べれば、絵やリンクなどを自由に追加できる。
Markdown：タグなしでhtmlのような見た目に表示できる書式

3. 「Commit changes」ボタンを押したら登録される。

4. トップ（https://github.com/（自分のユーザ名））に今書いた自己紹介文が表示されていることを確認する。

# おわり
以上です。
続き（Githubの使い方、取得したプログラムの使い方、など）は別記事になります。
今日の学習　markdown 

| タグ   | 書き方                        |     | タグ       | 書き方             |
| ---- | -------------------------- | --- | -------- | --------------- |
| 見出し  | #見出しh1                     |     | ナンバリング   | 文字前に数字とピリオドをつける |
| 強調   | ＊＊文字＊＊                     |     | 引用       | 引用の前に＞をつける      |
| 斜体   | ＊文字＊                       |     | リンク      | ［リンク］（URL)      |
| 改行   | 半角スペースを２個                  |     | 画像       | ！［画像］（URL)      |
| 水平線  | アスタリスク・ハイフン・アンダーバーを３つ以上並べる |     | チェックボックス | ー［　］チェックボックス    |
| 箇条書き | 文字の前にアスタリスク                |     | 打ち消し線    | 〜〜テキスト〜〜        |
【AWS】Amazon RDS

#はじめに
AWS認定試験取得に向けてAWSの知識を整理するためのまとめです。
今回はAmazon RDSについてまとめます。

#RDSとは
RDSは「Relational Database Service」の略です。
フルマネージドなリレーショナルデータベースなので、パッチ適用やOSの保守、
スケーリングなどもAWSの管理になるので運用負荷が軽減されます。

# RDSの特徴
## RDSのデータベースエンジン
6種類から選択可能
・Amazon Aurora
・PostgreSQL
・MySQL
・MariaDB
・Oracle
・SQLServer

##可用性、耐久性
### 自動バックアップ
RDSは自動バックアップ機能を持っています。
自動スナップショット＋トランザクションログをS3に保存します。
保存期間内の任意の時点（最大５分前まで）に遡ってインスタンスを復元ができます。
自動バックアップの保持期間は最大35日になっています。

### スナップショット
ユーザが任意のタイミングでスナップショットを作成することも可能です。
その場合は明示的に削除するまで保持されます。
必要に応じてスナップショットから新しいインスタンスを作成することも可能です。


### マルチAZデプロイメント
マスターRDSとは異なるAZにスタンバイインスタンスを構築し、データを複製します。
インスタンスやハードウェアで障害が発生したときに自動でフェイルオーバーされます。
データベースの可用性と持続性を高め、プロダクションデータベースに適しています。
（スタンバイ状態の時はアクセス不可）

## ストレージ
汎用(GP2)、プロビジョンドIOSPから選択可能です。
汎用(GP2)は幅広いデータベースワークロードに適していて、
より、大規模な場合(高性能、高速が求められる場合)は、プロビジョンドIOSPを選択します。

## スケーラビリティ

### スケールアップ
コンソールやAPIからインスタンスタイプの変更が可能です。
(インスタンスタイプ変更時は再起動が必要)
(スケールダウンも可能。ストレージサイズは拡張はできるが、縮小はできない)


### リードレプリカ
DBインスタンスのレプリカを複数作成するものになります。
読み取り頻度の高いデータベースに対しては、
全体の読み込みスループットを向上させることができます。

## セキュリティ
### 暗号化
インスタンス（DBインスタンス、リードレプリカ）とスナップショットの暗号化が可能です。
KMSで鍵管理が可能です。

### アクセス制御
デフォルトではDBインスタンスに対するネットワークアクセスはオフになっています。
セキュリティグループによりアクセスを制御します。

#料金
基本的に使用した分のみ料金が発生し、初期費用はありません。
DBエンジン毎に料金が異なります。

### リザーブドインスタンス
1年または3年契約でDBインスタンスを予約でき、オンデマンドインスタンスに比べて大幅な割引を受けられます。
最大 69%割引となります。

# 参考サイト
https://aws.amazon.com/jp/rds/
https://d1.awsstatic.com/webinars/jp/pdf/services/20180425_AWS-BlackBelt_RDS.pdf
【画像処理解説】チャネルの入れ替え（Javaソース付き）

#はじめに
画像処理を簡単に解説していきます。
下部にはJavaでのソースコードも載せているのでぜひご参照ください。
不定期にはなりますが、随時更新していく予定です。

#チャネルとは？
一般的なデジタル画像はRGB（赤、青、緑）の3色から構成されています。
詳しく知りたい方は光の三原色で調べると良いかと思います。

要するに、ほとんどのカラー画像はRGBの3層から構成されているということです。
この各層のことを画像処理ではチャネルと呼びます。
以下の図のように3色の画像が重なっているのを想像するとよいかと思います。

なお、ここでは説明しませんが、アルファチャネルという透明度を表す層も使用することがあります。
その場合、チャネル数は4層となります。

　<img width="500" alt="チャネル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655420/79272858-302e-5bba-2740-0ffb7f9233ab.png">

#画素値とは？
デジタル画像は複数の点（画素）の集まりで構成されています。
デジカメやスマホのカメラの性能で、何百万画素という言葉を聞いたことがあると思います。
これは、そのカメラで撮った写真は何百万もの点から構成されているという意味です。
一般に画素数（点の数）が多ければ多いほど鮮明な写真となります。

今主流のデジタル画像の画素値は各色0~255の256階調で表現されています。
チャネル数はRGBの3つなので、256^3 = 16,777,216色を表現することができます。

下の図は各画素のRGBに値が入力されている様子を示した図です。
各インデックスごと、各色ごとに値がセットされていることが理解できれば十分です。

　<img width="500" alt="画素値.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655420/d575aeae-cd69-ee40-2a8b-3ec960638f59.png">

#チャネル入れ替えってどうやるの？
前節で説明した通り、各画素にはRGBの値がセットされています。
先頭から8bitずつR、G、Bの要素が並んでいるとイメージできていれば十分です
チャネル入れ替えでは、各画素値内のRGBの並び順の入れ替えをすることになります。

以下のソースコードでは、画素を順に読み込み（ラスタスキャン）ながら、RGBをBGRに並び替えることでチャネルを入れ替えています。
RGBを配列で取得できるように作成しているので、比較的理解しやすいのではないかと思います。

#アルゴリズム
1. 画像をラスタスキャンして、各画素に対して2から4の処理を行う。
2. 画素のR, G, Bのそれぞれの値を取得する。
3. RGBの値の並び順をBGRの順に並び変える。
4. 画素に対して3で並び変えたBGRの値を設定する。

#チャネル入れ替えの例
元画像（RGB画像）
![imori_256x256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655420/b4290185-30a0-2672-ed9c-91d0632b278c.png)

結果画像（BGR画像）
![out001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/655420/8518af7f-4934-da73-e70f-eb6e0d347cef.png)

#ソースコード
私が作成したSImageクラスを使用しています。
中身がわからなくても、直感的に読めるように実装したつもりです。
詳細を知りたい方は以下のリンクをご覧ください。

https://github.com/Sigmay495/SimpleImage

```Color.java
public static SImage rgb2gbr(SImage rgbImg) {
    // カラー画像でない場合、そのまま返す
    if (rgbImg.channel == 1)
        return rgbImg.copy();

    // アルファチャネルを持つ場合
    if (rgbImg.channel == 4) {
        var bgrImg = new SImage(rgbImg.width(), rgbImg.height(), 4);

        // 画像をラスタスキャン
        for (int x = 0; x < rgbImg.width(); x++)
            for (int y = 0; y < rgbImg.height(); y++) {
                // ARGB配列を取得
                int[] argb = rgbImg.getARGB(x, y);

                // 並び変えてABGR配列を取得
                int[] abgr = new int[]{argb[0], argb[3], argb[2], argb[1]};

                // ABGR配列を画像にセット
                bgrImg.setARGB(x, y, abgr);
            }
        return bgrImg;
    }

    // カラー画像の場合
    var bgrImg = new SImage(rgbImg.width(), rgbImg.height(), 3);

    // 画像をラスタスキャン
    for (int x = 0; x < rgbImg.width(); x++)
        for (int y = 0; y < rgbImg.height(); y++) {
            // RGB配列を取得
            int[] rgb = rgbImg.getRGB(x, y);

            // 並び変えてBGR配列を取得
            int[] bgr = new int[]{rgb[2], rgb[1], rgb[0]};

            // BGR配列を画像にセット
            bgrImg.setRGB(x, y, bgr);
        }
    return  bgrImg;
}
```
【Oracle】これってバグだよね？【TO_CHAR】

## 前文
他愛もない話だけど、たまたま気が付いたので備忘録として残す。

## 前提
本文の実行環境は Oracle Database 19c だけど、 多分どのバージョンでも同じ。
`TO_CHAR` を使用した日付の書式化例は以下。

```SQL
SQL> SELECT
	  TO_CHAR(SYSDATE, 'YYYY/MM/DD') 日本式
	, TO_CHAR(SYSDATE, 'DD-MM-YYYY') 英国式
	, TO_CHAR(SYSDATE, 'MM-DD-YYYY') 米国式
FROM DUAL
;
  2    3    4    5    6  
日本式     英国式     米国式
---------- ---------- ----------
2021/08/02 02-08-2021 08-02-2021
```

区切り文字の `/` や `-` 等は予約語で、任意の文字は `"` で囲めば使える。以下は `"年"` `"月"` `"日"` を埋め込んだ例。
 
```SQL
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日"') FROM DUAL;

TO_CHAR(SYSDATE,'
-----------------
2021年08月02日
```

## 文法エラーについての考察
閉じ`"` が抜ていれば当然文法エラー。以下は `年` の閉じ`"` が抜ているケース。

```SQL
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY"年MM"月"DD"日"') FROM DUAL;
SELECT TO_CHAR(SYSDATE, 'YYYY"年MM"月"DD"日"') FROM DUAL
                        *
行1でエラーが発生しました。:
ORA-01821: 日付書式コードが無効です
```

ところが、最後の `日` の閉じ`"` が抜ていてもエラーにならない。

```SQL
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY"年"MM"月"DD"日') FROM DUAL;

TO_CHAR(SYSDATE,'
-----------------
2021年08月02日
```

どうやら、閉じ`"` が出てくる前に、書式化文字列の終端に達すると、終端までが `"` で囲まれていると解釈される模様。

```SQL
SQL> SELECT TO_CHAR(SYSDATE, 'YYYY"年MM月DD日') FROM DUAL;

TO_CHAR(SYSDATE,'
-----------------
2021年MM月DD日
```

`"` で囲んで埋め込む文字は複数文字列でも構わないし。

```SQL
SQL> SELECT TO_CHAR(SYSDATE, '"All your base are belong to us "YYYY') INTERNET_MEME FROM DUAL;

INTERNET_MEME
-----------------------------------
All your base are belong to us 2021
```

因みに、前出の `年` の閉じ`"` が抜ているケース `'YYYY"年MM"月"DD"日"'` だけど、結果として `"年MM"` が文字リテラルと解釈され、続く `月` が書式文字と解釈され、そんな予約語無いからエラーになっていると思われ。

「閉じ`"` が出てくる前に、書式化文字列の終端に達すると」については、[公式](https://docs.oracle.com/cd/E16338_01/server.112/b56299/sql_elements004.htm "書式モデル") からはそんな仕様は読み取れないけど、色々と動きを確認すると、そんな感じ。

それにしても閉じ`"` が抜けているのに文法エラーにならないって一種のバグだよな。
Oracle の `TO_CHAR` ってぐぐると、不審な動きの報告が色々と挙がっているようだし。謎が多いよ。
【Git初心者】基本コマンド集

# はじめに
Gitを使う上での基本的なコマンドを自分なりにまとめました。

最低限これらを知っていればGitを使うことができるので、初心者の方のチートシートになれば良いなと思います。

# コマンドまとめ
## ローカルリポジトリの新規作成
```
git init
```

## Gitリポジトリのコピーを作成
```
git clone [リポジトリ名]
```

## 全ての変更をステージに追加
```
git add .
```

## 変更を記録
```
git commit .

git commit -m "[メッセージ]"
```

## 現在の変更状況を確認
```
git status
```

## 変更履歴を確認
```
git log

# １行で表示
git log --oneline
```

## リモートリポジトリ（GitHub）を新規追加
```
git remote add [リモート名] [リモートURL]

# 例
git remote add origin [URL]
```

## リモートリポジトリ（GitHub）へ送信
```
git push [リモート名] [ブランチ名]

# 例
git push origin main
```

## リモートから取得
```
git fetch [リモート名]
git merge [リモート名]/[ブランチ名]

# マージまでを１度にやりたいとき
git pull [リモート名] [ブランチ名]
```

## リモートを削除
```
git remote rm [リモート名]
```

## 新しいブランチを作成
```
git branch [ブランチ名]
```

## ブランチの一覧を表示
```
git branch
```

## ブランチを切り替える
```
git checkout [既存ブランチ名]

# ブランチを新規作成 & 切り替え
git checkout -b [新ブランチ名]
```

## ブランチを削除
```
git branch -d [ブランチ名]
```

## 変更履歴をマージする
```
git merge [ブランチ名]
```
docker runでvolumeにカレントディレクトリを割り当てる記述法(Git Bash for Windows)

**※2021/08/10 Dockerfileでvolumeした場合も追記**

Docker初心者です。コンソールはGit Bash for Windowsを使用しています。
Dockerでvolumeマウントをするときにエラーが出過ぎて困ったので、どの表記法であればエラーが出ないか自身の備忘録としてまとめます。ちなみに理由はよく分かっていません。。。

ホストPC側(自分のパソコン側)のディレクトリの階層構造や名前は適当に付けているので気にしないでください。
httpdのDockerイメージを使用しているため、Docker側のvolume場所は`/usr/local/apache2/htdocs`となっています。こちらは使用するイメージによって変わってくるので(とはいえどこでもいい？この辺よく分かってないです)
## エラーが出ない記述法
###絶対パス

```
$ docker run -v C:/User/hoge/dir:/usr/local/apache2/htdocs httpd
$ docker run -v C:\\User\\hoge\\dir:/usr/local/apache2/htdocs httpd
$ docker run -v //C/User/hoge/dir:/usr/local/apache2/htdocs httpd
$ docker run -v //C\\User\\hoge\\dir:/usr/local/apache2/htdocs httpd
```
* Cは大文字でも小文字でもOK。
* /(スラッシュ)は\(バックスラッシュ)でも代用可能。ただし、バックスラッシュが一つだとただのエスケープと認識されるので、2回記述する必要あり。

### 相対パス

```
$ docker run -v /$(pwd):/usr/local/apache2/htdocs httpd
```
* pwdは大文字でも小文字でもOK
* こっちは\(バックスラッシュ)はだめ

## エラーの出る記述法
組み合わせは無限なので、いくつかのみ紹介します。
### 絶対パス

```
$ docker run -v /C/User/hoge/dir:/usr/local/apache2/htdocs httpd ←スラッシュ一つ
```
### 相対パス

```
$ docker run -v .:/usr/local/apache2/htdocs httpd
$ docker run -v /($pwd):/usr/local/apache2/htdocs httpd
$ docker run -v $(pwd):/usr/local/apache2/htdocs httpd
$ docker run -v \\$(pwd):/usr/local/apache2/htdocs httpd
$ docker run -v ${pwd}:/usr/local/apache2/htdocs httpd
$ docker run -v %cd%:/usr/local/apache2/htdocs httpd
```

## Dockerfileからrunした場合
さっきは上手くいっていたパスではエラーが出ました。
### エラーの出る記述法

```
$ docker build -t ex22_original /$(pwd)
$ docker build -t ex22_original /$(pwd)/
```
### エラーの出ない記述法

```
$ docker build -t ex22_original $(pwd)
$ docker build -t ex22_original .
```
絶対パスは何度試してもダメなので、正解が分かったらまた書き足します。

## 参考サイト
[docker run の時 volume が割り当てられない(Git For Windows使用)](https://qiita.com/Sa_Ru/items/f8841a9d1b969a0c64bd)
定期的に生成されるファイルがきちんと生成されているかをチェックして、生成されていない場合はメールを送信するという仕組みを作ってみる

# はじめに

最近、小さなサービスを作りすぎていて、気が付いていたら停止しているなんてことが時々あり、中には数時間、数日放置してしまったとかいうことがあって、少し困っている。

ということで、これらのファイルの更新日をチェックして、1時間以上ファイルが更新されていなかったら通知する仕組みを作ってみる。

# 条件

- 通知のメールはGMailを使用
- 生成されるファイルは[年月日].[拡張子]という形式
- スクリプトはホームディレクトリ直下に作成

# スクリプト作成

以下の通り作成。
GMailのアカウントとパスワード、メール送信先は各自のものを使用。

```py:check.py
#!/usr/bin/env python3

import requests, os, smtplib, ssl
from glob import glob
from datetime import datetime, timedelta
from email.mime.text import MIMEText

# メール送信関数
def send_info(name, subject, body):

    gmail_account = "*****@gmail.com"
    gmail_password = "*****"
    mail_to = "*****@*****.com"

    msg = MIMEText(body, "html")
    msg["Subject"] = "[{}] {}".format(name, subject)
    msg["To"] = mail_to
    msg["From"] = gmail_account

    server = smtplib.SMTP_SSL("smtp.gmail.com", 465,
        context=ssl.create_default_context())
    server.login(gmail_account, gmail_password)
    server.send_message(msg)
    
# 更新日取得関数
def get_ctime(f):

    t = os.stat(f).st_ctime
    return datetime.fromtimestamp(t)

# ファイル更新確認関数
def isFileUpdated(f, hour):
    
    t = get_ctime(f)
    flg = True
    
    if datetime.now() - t > timedelta(hours=hour):
        flg = False
        
    return flg
    
# 時間間隔
hour = 1

# データ保存先
dir = "/var/www/html/[myservice]/data/"

# 確認対象のファイル
types = [
    "*.csv",
    "*.jpg",
    "*.txt"
]

for tp in types:

    print(tp)

    files = glob(dir + tp)
    files.sort()
    
    f = files[-1]

    rs = isFileUpdated(f, hour)
    
    if rs == False:
        send_info(
            "myservice", 
            "file is not updeted",
            "Check a script."
        )
        print("mail send.")
```

# 実行

スクリプトに実行権限を付与。

```sh:
chmod a+x check.py
```

試しに実行。

```sh:
./check.py
```

## GMailが送信できない場合の対処

GMailが送信できない場合は以下のURLをご参照下さい。

https://www.gocca.work/python-mailerror/

# 自動実行

cronに登録し、営業時間中（8時〜19時）に１時間ごとに確認して更新されていない場合にメールを送信する。

```sh:
10 8-19 * * * /home/[ユーザー名]/check.py
```

できた！
RaRCTF writeup


# RaRCTF 2021 Writeup
今回は適当に出場してみましたがチーム数が1200弱ありすげーーーと気圧されてましたが
結果は 126位でほぼcryptoだけでこれたので満足です．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810405/0853f4ad-50b5-b468-0a47-9d2fa5a29435.png)


## 解けた問題

* 解けた問題
    * sRSA (100 points)
    * unrandompad (150 points)
    * Shamir's Stingy Sharing (200 points)
    * babycrypt (200 points)
    * PsychECC (400 points) 


##sRSA (100 points)
$e,n,ct$が与えられ$ct = flag*e \ \ mod(n)$
よって$ct*e^{-1} = flag*e*e^{-1} \ \ mod(n)$とできるので$flag = ct*e^{-1} \ \ mod(n)$を求めれば答えが出る．```rarctf{ST3GL0LS_ju5t_k1dd1ng_th1s_w4s_n0t_st3g_L0L!_83b7e829d9}```


##unrandompad (150 points)

ある素数を2つ取ってきてRSAの準備を行い*pad*関数でpaddingしているみたい...いや、encryptoで使ってねーのかよ!!という突っ込みが入りました．

閑話休題

なので、ただ単純に平文$m$を渡せば$c = m^{e}\ \ mod(n)$を返してくれます．
これを用いてHåstad's Broadcast Attackというものを行います．
$e=3$なので3個の$c,n$のペアがあれば行えるはずなのでnetcatを3回行い取ってきて中国人剰余定理で$flag$を復元していきます．

```
rarctf{https://cdn.discordapp.com/attachments/751845431063085160/866641917714235392/unknown.png_8538853c64}
```
## Shamir's Stingy Sharing (200 points)
問題は大まかに2つのパートに分けられます．
*1.bxor
*2.polyを用いた多項式

解き方の手順としては2でpoly[0]の値を求めて1の乱数を再現しbxorで$flag$を求めます．

問題の2の部分を見る限り多項式の係数は与えれるものの不定元はこちらで与えられることができます．よって，$2^{129}$進数としてxに$2^{129}$を与え$mod($2^{129}$)$を行えばpoly[0]を取り出すことができます．
これで2の部分が終わです．

1の部分はnetcatの初めに与えられる文字列をbytesに変換しbxorの片方に入れます．もう一方は，2でわかってるpoly[0]を乱数のシードとして桁数のbitを指定して放り込みます．
ぶっちゃけ桁数を求めるのがなんとなくだるかったので試してダメなら1桁増やすみたいなことをしてました．よって$flag$は以下となる．
```rarctf{n3v3r_trust_4n_1nt3g3r}```
## babycrypt (200 points)

pubkeyが$e,n$,privkeyが$p,q$となって，$c = m^{e} \ \ mod(n)$となる
これだけでは厳しいところがあるのでhintとして$hint = n\ mod (q - 1)$が与えられている．問題のプログラムの条件より$pq=(p+1)(q-1)+p-(q-1)$と一意に定まるため$hint = p-(q-1)$と読み替えることができる．
これは基本対称式と呼ばれるもので構成される式(詳しくはググってもらって...)より簡単に$p+q$を算出することができ秘密鍵の$d$を導出することができる
よって以下のflagを得ることができる．```rarctf{g3n3r1c_m4th5_equ4t10n_th1ng_ch4ll3ng3_5a174f54e6}
```

## PsychECC (400 points) 

ある与えられた楕円曲線において有理点$(x_1,y_1)$を入力とし，あるスカラー倍算された有理点$(x_2,y_2)$を出力とするプログラム．さらに、有理点を入力して出力された有理点と同じならflagがもらえるみたいです．
ECの攻撃はanomalous曲線やsupersingular等があるみたいです(あまり詳しくない)が今回は有理点が楕円曲線上のに乗っているかチェックされていないのでinvalid curve attackが成立します．
どういう攻撃かというと別の楕円の有理点を与えてそれを計算させる⇒それの答え合わせを行うというまぁ単純なものです．
なので今回与える有理点は$(79238730022396037033643944491844772521873745954229361958773910554826830893621,62628993809527930529233211427211299031131458459128039437787214582616587965475)$として，出力の方の有理点は
$(69473202296790888221989641114439625856056410065759153429712028574142323887235,27224964365716519755044877081930694306533217160896231828903674165207513413426)$です．
ちなみに今回与えた有理点の位数は113なので，何回か(300回程度)netcatして攻撃することになります．攻撃が成功すると以下のflagが手にはいります．
```rarctf{w0ah_str4ight_cl41r0v0y4nc3!!_8119733d69}
```

##感想
本格的参加して3回目?のCTFでここまで解けてうれしかったですが，rotoRSAが多分惜しいところまで解けているはずなので解きたかったかなぁ...と
どちらによ今回のCTFはPsychECCが19番目に解けて満足です．

誤字脱字，訂正等ありましたらお知らせください...
孤独を避けてレガシーコードに立ち向かうための人的アプローチ

https://qiita.com/e99h2121/items/47857957fd549c83b5cb


https://qiita.com/e99h2121/items/f4c5856734d136f672b7

等などで愚痴を披露しているようにいわゆる「レガシーコード」と対峙するに下のような問題があると思っている。

1. 暗黙知が多すぎる問題
2. 自分でやったほうが早い病を誘発する問題
3. 自走を全く促せない問題

結果、レガシーコードに関して後世に何も引き継がれず問題に取り組んでも手応えを感じられず誰も得しないかなしみ。結論として以下が処方箋だよ、というお話。

1. 形式知化
2. ペアプログラミング/モブプログラミング

レガシーコードへ、「人的アプローチとしてどう立ち向かうか」の考察を軽めにまとめたもの。




## 1. レガシーコード、暗黙知が多すぎる問題

「担当になった者がソースコードを読んで気合と根性でなんとかする」で引き継がれてきたから。
それができたのはまだその「レガシーコード」が本流だった頃の話。

時が進んで複数バージョンと合わせて見るなどという状況ではかけられる時間も異なる。よってドキュメントももう一度、形式知として改善していく必要がある。そして読んでもらえるようにする。

https://qiita.com/e99h2121/items/ea5822922d83d00ebc4a

https://qiita.com/hiraike32/items/f0a211cceb0ecc516b6c

https://zenn.dev/qnighy/articles/b39ff132777758


## 2. レガシーコード、自分でやったほうが早い病を誘発する問題

1 に伴って、「自分がやったほうが早い」状況がしばしば発生する。


### 「自分でやった方が早い病」を克服したい。

https://liginc.co.jp/549508

> 「自分が介入し過ぎることでメンバーの思考力を奪ってしまっていたのだな」
> 自走するチームを作り大きな成果を達成することを阻害する因子

> チームとして大きな成果を生み出せなければ、自分はさらなる高みにいけない

### 自分でやった方が早い病

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

その弊害は以下とまとめられている。

> 中長期的な視点で物事を考えるのが苦手
> 長時間労働が苦ではない
> ムダな完璧主義者になる


## 3. レガシーコード、自走を全く促せない問題

また2 に伴って「自走」という言葉が流行り言葉として語られる。

https://medium.com/pinnacles-techblog/self-drive-engineer-510b3c567bfd

> 「もしメンバーに自走してほしいなら、個人のメンタリティに期待するのではなく、組織で相互にアドバイスし合うプロセスを構築したほうがいい」という話

> 1. issue
> 2. Design Doc
> 3. times channel
> 4. ペア/モブプログラミング
> 5. draft pull request


### どうやったら「自走できる人」になれるのか

https://note.com/nacam403/n/n6f503bc0a791


### 自走できるエンジニアとは

https://zenn.dev/erukiti/articles/self-running


「自走」できないほうに責任があるわけではないんだよなあと思う。


## まとめ

結論、上に書いたような問題に対して

1. 形式知化
2. ペアプログラミング/モブプログラミング

が有効に考えられるという現時点でのメモ。ともかく同じ方向を向いて目線を合わせる点でこれらがツールとなりそうだぞ、と取り組み始めているところ。

https://qiita.com/kojimadev/items/c211207ede652c2abeb0

https://qiita.com/hirokidaichi/items/27c757d92b6915e8ecf7

これらっておよそ「孤独」をどうやって避けるかのアプローチなのだなとおもう。

より具体的なペアプログラミング技法等などは研究しながらまたまとめたいと思うが、まずはスタート地点での考察の意味で、以上参考になればさいわいです。
VSCodeのステータスバーの色を変更する

VSCodeの設定ファイルを開く

```text:settings.json
{
    // 以下を追加
    "workbench.colorCustomizations": {
        "statusBar.background": "#1C1C1C",
        "statusBar.foreground": "#848484"
    },
}
```

変更後のステータスバー
背景色をエディタ部分の背景と合わせ、文字色を主張が弱い色に変更した

![スクリーンショット 2021-08-10 3.14.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145075/47c708fb-41d1-5b85-4541-1e19ea06af5e.png)

参考
https://code.visualstudio.com/api/references/theme-color#status-bar-colors
YouTubeっぽいサイドバーを実装する【CSS】【JavaScript】

##したいこと
- 開閉可能なサイドバー
- メインのコンテナーはサイドバーにぶつかるまで画面(ブラウザー)に対して左右中央

## コード
###HTML

````html
<body>
    <aside class="sidebar">いろいろ</div>
    <div class="container">いろいろ</div>
</body>
````

###SCSS

````scss
$container-width: 1140px;

$sidebar-width-open: 250px;
$sidebar-width-close: 50px;

$main-margin: 10px;

.sidebar {
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;

    &.m-open {
        width: $sidebar-width-open;
    }

    &.m-close {
        width: $sidebar-width-close;
    }
}

.container {
    &.m-open {
        width: $container-width + 2*$main-margin;
        margin: 0 auto;

        @media (max-width: $container-width+2*$sidebar-width-open+2*$main-margin) {
            width: 100%;
            padding-left: $sidebar-width-open + $main-margin;
        }
    }
    
    &.m-close {
        width: $container-width + 2*$main-margin;
        margin: 0 auto;
        
        @media (max-width: $container-width+2*$sidebar-width-close+2*$main-margin) {
            width: 100%;
            padding-left: $sidebar-width-close + $main-margin;
        }
    }
}
````
要はサイドバーを浮かせて、コンテナーの左にサイドバーの幅分paddingを追加してる

###JavaScript
````javascript
let layouts = [$('.sidebar'), $('.container')];

$('#menu-button').on('click', () => {
    layouts.forEach(layout => {
        layout.toggleClass('m-open');
        layout.toggleClass('m-close');
    });
});
````
\#menu-buttonをクリックしてサイドバーの幅の大きさを切り替え
Laravelのインストール後にすべきたった一つのこと(IE非対応ページの作成)

#はじめに
あなたはIEが好きですか？
私は嫌いです。ということで滅ぼしましょう。

※IEでアクセスしたらエラーページに飛ばすって話です

#手順

`NonSupportedBrowsers.php` を新規作成して下記コードをコピペします。

```app/Http/Middleware/NonSupportedBrowsers.php
<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Str;

class NonSupportedBrowsers
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     *
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Str::contains($request->userAgent(), ['Trident', 'MSIE'])) {
            return response()->view('errors.non_supported');
        }

        return $next($request);
    }
}
```

`Kernel.php` の `$middlewareGroups` に1行追加します。

```app/Http/Kernel.php
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\NonSupportedBrowsers::class, // この行を追加
```

IEでアクセスしたときに表示するページを作成します。

```resources/view/errors/non_supported.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>IEは死にました</title>
</head>
<body>
<div>
  <h1>OOPS!</h1>
  <div>あなたが利用しているブラウザ(Internet Explorer)はサポート対象外です。</div>
</div>
</body>
</html>

```

#結果

IEでアクセスするとこうなります。
![IE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122701/2bd4d9cf-6ed3-97f9-394c-4cfcd4633666.png)

めでたしめでたし❗️✊😸
Javaのエラー「エラー: この文字(0x92)は、エンコーディングwindows-31jにマップできません」を直す

#JavaをVScodeで記述し，実行する際のエラーを解消した備忘録(CodeRunnerを利用している方向け)
###エラー: この文字(0x92)は、エンコーディングwindows-31jにマップできません
このような不快なエラーメッセージが出た．
これはどうやらfilename.javaの中に全角文字が記述されている場合発生するようだった．filename.javaはUTF-8で保存されていた．
####UFT-8ではなくShift-Jisで保存すると問題なく同じ動作で実行される(解決策の一つ)
個人的にUFT-8を使いたかったので，どうにかしてそのまま動くようにする．
このとき，使うコーディングに特にこだわりが無い方は，.javaの規定コーディングをShift-Jisに変更することで解決すると思います．
同様のエラーを起こしている人を見つけ対処法が解説されていたのでそのとおりにしてみても消えないが，ターミナルで「javac -encoding UFT-8 filename.java」とすると正常に動作する．
####CodeRunnerが元凶
これらから，コンパイルにエラーが発生していることがわかった．このとき，Java Test Runnerの機能の方で実行すると正常に動作する．
これが何を意味するのかというとCodeRunnerがえらっているということ．自分は，cでの実行にShift+ctrl+Nを利用していたため，JavaでもCodeRunnerを使ってコンパイル&実行をしていた．
これらから，setting.jsonの，
```
"code-runner.executorMap": {
    "java": "cd $dir && javac $fileName && java $fileNameWithoutExt",
  }
```
↓
```
"code-runner.executorMap": {
    "java": "cd $dir && javac -encoding UTF-8 $fileName && java $fileNameWithoutExt",
  }
```
とする．`-encoding UTF-8`を`javac`の後に設定する．
これによりShift+ctrl+Nによる正常な実行を実現できた．
【1章】Javaを学ぼう

今回の記事は私自身が学んだプログラミング言語、「Java」の基礎について書いていきたいと思います！
内容としては本当に基礎的な部分になりますので、アウトプットの場と思っていただけると幸いです。

##Javaで文字を表示させる
まずは文字を表示させてみます。Main.javaというファイルのSystem.out.println()の()の中に文字を書くと、コンソール画面にその文字が表示されます。

```ruby:Main.java
System.out.println("Hello World");
```

出力結果↓

```ruby:コンソール
Hello World
```

文字をコンソールに出力することができました。
文字列はダブルクォーテーション（"）で囲んであげる必要があります。" "で囲んでいないと、コードが動かなくなってしまいますので忘れないように注意しましょう！

数値は文字列と違い、ダブルクォーテーションで囲みません。文字列と数値は異なるものです。例えば文字列の"3"と数値の3（" "で囲まない）は別物として扱われます。

```ruby:Main.java
System.out.println(4 + 3);
System.out.println("4 + 3");
```

出力結果↓

```ruby:コンソール
7
4 + 3
```

4 + 3は7になりますが、"4 + 3"はそのまま「4 + 3」という文字列として出力されます。
補足ですが、**掛け算は「*」(アスタリスク)、割り算は「/」(スラッシュ)を用います。また「%」（パーセント）で、割り算の余りを計算することができます。**

##文字列の連結
文字列を「足し算」すると、文字列を連結することができます。

```ruby:Main.java
System.out.println("Nakamura" + "Taro");
System.out.println("6" + "3");
System.out.println(6 + 3);
```

出力結果↓

```ruby:コンソール
NakamuraTaro
63
9
```

##変数から値を取り出す

Javaで変数を定義するためには、**①変数にいれる値のデータ型を指定する、②変数の名前を決める、**という2つが必要です。変数を定義したら変数に値を入れます。これを**代入**と呼びます。「変数名 = 値」とするだけで代入することができます。

```ruby:Main.java
int number;
number = 7;
System.out.println(number);

String name;
name = "Taro";
System.out.println(name);
```

出力結果↓

```ruby:コンソール
7
Taro
```

##自己代入
変数xに2が入っているとき、xの値に4を足して6に上書きしたい場合はどうすればよいでしょうか。変数xと4を足して、また変数xに代入します。
このような代入を自己代入と呼びます。
実際に行っていきたいと思います。

```ruby:Main.java
int x = 2;
System.out.println(x);
x = x + 4;
System.out.println(x);
```

出力結果↓

```ruby:コンソール
2
6
```

自己代入には省略した書き方があります。

```ruby:Main.java
  基本形              省略形
x = x + 10;　　　　　　➡︎     x += 10;
x = x - 10;　　　　　　➡︎     x -= 10;
x = x * 10;　　　　　　➡︎     x *= 10;
x = x / 10;　　　　　　➡︎     x /= 10;
x = x % 10;　　　　　　➡︎     x %= 10;
```

変数に1を足す、もしくは1を引く場合は、さらなる省略が可能です。
よく使うので、覚えておきましょう！

```ruby:Main.java
  基本形            省略形
x += 10;　　　　　　　　　　➡︎      x++;
x -= 10;　　　　　　　　　　➡︎      x--;
```


今回はここまでとします！
次章に続きますので、よろしくお願いいたします。
最後までご覧いただきまして、ありがとうございました！
スマートホーム目指してラズパイ触ってみた(4) 〜Amazon S3 (AWS CLI)連携編〜

##今回の目標
SenseHatの測定結果をテキストファイルに保存して、Amazon S3に送る。

他の記事はこちら
[ラズパイ触ってみた(1) 〜ラズパイ４+SenseHatセットアップ編〜（Qiita）](https://qiita.com/keilog/items/78dfb492790997fa16b7)
[ラズパイ触ってみた(2) 〜Macからリモートデスクトップ接続編〜（Qiita）]
(https://qiita.com/keilog/items/76117db977ce5096ac19)
[ラズパイ触ってみた(3) 〜LINE連携＆温度通知編〜（Qiita）]
(https://qiita.com/keilog/items/b0ef6161628c544ed6c3)
[ラズパイ触ってみた(5) 〜Amazon S3 + QuickSight連携編〜
（Qiita）]
(https://qiita.com/keilog/items/c1d0b69c3892904e48eb)

##Step1:測定結果をテキストファイルに保存させる
前回温度を表示させるPythonコードを作成したので、温度をテキストメモに保存させるようにします。
テキストファイルを別で作成し、以下のコードを実行します。

```temp_log.py
from sense_hat import SenseHat

sense = SenseHat()
sense.clear()
temp = sense.get_temperature()
temp2 = "{0:.1f}".format(temp)+"℃"

import datetime
date = datetime.datetime.now().strftime("%Y/%m/%d,%H:%M")

print(date,temp2)

fw = open("作成したファイル名", "at", encoding='utf-8', newline='\n')
fw.write("\n")
fw.write(date)
fw.write(" ")
fw.write(temp2)
fw.close()
```

うまくいけば、以下のように作成したファイルに日付、時間、温度が保存されます。
（コードを実行するたびに、追記されていきます）
2021/08/08,18:23 32.1℃
2021/08/09,22:22 32.0℃

※自動で定期的に測定結果を保存させたい場合は、前回記事に記載したcrontabコマンドを利用する方法で実行可能です。
[ラズパイ触ってみた(3) 〜LINE連携＆温度通知編〜（Qiita）]
(https://qiita.com/keilog/items/b0ef6161628c544ed6c3)


#Step2:Amazon S3でバケットを作る
AWSのコンソールにログインし、S3のバケットを作成します。

■　AWSアカウント作成手順（AWS公式サイト）
https://aws.amazon.com/jp/register-flow/

■　AWS S3バケット作成 (AWS公式サイト)
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/creating-bucket.html

今回S3バケットのアクセス設定はIAMユーザーだけに制限しています。
※パブリック公開設定だと他の人からもアクセスできるため、アクセス設定には要注意です。

S3連携のためにアクセスキーとシークレットキーが必要になるので、IAMにて取得します。
参考：S3のアクセスキーとシークレットキーを作る方法
https://off.tokyo/blog/s3-aws/


#Step3:ラズパイからS3に連携させる

ラズパイのターミナルで以下コマンドを実行します。

```
sudo pip3 install awscli --upgrade
```
下記コマンドでインストールされたことを確認できます。
```aws --version
```

以下コマンドを打つとアクセスキーやシークレットキーの入力を求められるので、先ほど発行したキーを入力します。

```
aws configure
```
AWS Access Key ID →発行したアクセスキー
AWS Secret Access Key →発行したシークレットキー
Default region name　→ 東京であれば"ap-northeast-1"
Default output format →　今回は"None"としました

下記コマンドでバケットが確認可能です。
```aws s3 ls
```

Step1で作成したテキストファイルをS3に送信します。

```
aws s3 cp /home/pi/[ファイルが入っているディレクトリ名]/[ファイル名] s3://[設定したバケット名]
```

S3のコンソール画面にアクセスして更新されていたらOKです（更新日時が変わっていないようであれば、更新ボタンを押します）
![スクリーンショット 2021-08-10 1.29.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1863184/ca356477-eb88-39c1-8fa3-a5b2210c2e72.png)


##その他参照記事

https://qiita.com/ekzemplaro/items/b5b42ce90fbe2fb05cd2

https://dev.classmethod.jp/articles/unauthorized-use-of-aws-access-keys-due-to-leakage/
別名の外部キーで紐付けたテーブルを結合する

調べてもぱっとわかる情報が見つからなかったので備忘録用に。

### 例えば
````user.rb
has_many :own_groups, 
         class_name: "Group",
         foreign_key: "owner_id",
         dependent: :destroy
````
````groups.rb
belongs_to :owner, class_name: "User"
````
というのがあったとする。

### コード
しかしjoinsするだけだとuserの情報を返してくれないのでselectする

````groups.rb
scope :with_owners_info, -> () do
    <query>
    .joins(:owner)
    .select("
        groups.id,
        groups.name,
        groups.desc,
        groups.updated_at,
        users.id AS owner_id,
        users.name AS owner_name,
    ")
end
````
最後に.to_jsonなり.to_aなりする。
JSで連想配列の配列を任意のキーで並び替える【JavaScript】【Rails】

##したいこと
データベースから取ってきたデータをフロント(JS)で任意のカラムで並び変えて表示したい(APIに何回もアクセスしたくないため)

##コード
### JS
````JavaScript
export let sortItems = (items, sortType, order) => {
    return items.sort((a, b) => {
        if (order == "ASC") {
            return (a[sortType] < b[sortType] ? 1 : -1)
        } else { // DESC
            return (a[sortType] > b[sortType] ? 1 : -1)
        }
    })
}
```
itemsは連想配列の配列。sortTypeはカラム名(連想配列のキー)。orderは"ASC"か"DESC"。
ただこのままだと更新日時で並び変えた場合に昇順と降順が逆になってしまうので、データを加工する
###Rails
Railsの場合

```` Ruby
<Active Recode>
&.map {|g| 
    {
      **g.attributes, 
      updated_at_in_ms: (Time.now - g.updated_at).to_f * 1000
    }
}
````
数値に変換して符号を逆にしている(現在時刻から引く必要はとくにない)

### おまけ
Vueコンポーネントで使う

sortTypesは {キー: 表示用文字列, ...}の形にしてselect要素で選択できるようにする

````js
{name: "Name", updated_at_in_ms: "Updated"}
````

````vue
<template>
    <select v-model="sort">
        <option v-for="(value, key) in sortTypes" :value="key">{{value}}</option>
    </select>
    <select v-model="order">
        <option value="ASC">Asc</option>
        <option value="DESC">Desc</option>
    </select>
</template>

<script>
export default {
    props: {
        sortTypes: {
            type: Object,
            default: () => ({}),
        }
    },
    data: () => ({
        sort: "updated_at_in_ms",
        order: "DESC"
    }),
    watch: {
        sort: function () {
            this.$emit("changeSort", this.sort);
        },
        order: function () {
            this.$emit("changeOrder", this.order);
        }
    }
}
</script>
````
親コンポーネントで使うにはcomputedで冒頭のを返すように、かつ子と同じようにdataにsortとorder、sortTypesを設定して

````vue
<Sort
    @changeSort="sort = $event"
    @changeOrder="order = $event"
    :sortTypes="sortTypes"
/>
````
たった1日で基本が身につく!Docker/kubernetes超入門6章Jenkins関連でつまづいたところのメモ

# はじめに

今勉強している「たった1日で基本が身につく!Docker/kubernetes超入門」の6章ではじめて**Jenkins**を利用して、色々と躓いたので、解決方法と一緒にまとめていきます。

書籍に若干の説明不足や2021年8月現在には想定通りにいかない箇所があったので、誰かの参考になればと思います。

# 問題1

Jenkinsのコンテナを起動した後に、初回起動をしてプラグインをインストールすると「OWASP Makup Fromatter」と「Mailer」以外がすべてインストールエラーになりました。

以下はネットから同じような画像をみつけてきたものです。私はMailerもインストールできていました。

![20200309034055.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/69eb6a4c-33a1-c70e-9aa4-862a9b4889de.png)

# 解決方法

これはDockerイメージが古いために起きています。
このまま先に進めることはできますが、先に進めてもJob作成でパイプラインが作れません。
もちろん追加でプラグインをインストールすることもできませんでした。

Dockerfileの内容を変える必要があります。

```
From jenkins/jenkins:2.190.1-centos
```
1行目の内容を以下に変更します。

```
From jenkins/jenkins:centos7
```

もとのイメージは2年前のイメージであまり使われていないようなので変更しました。

また、私の環境ではちょくちょくエラーが起きてたのですが、イメージ変更して起きたのか？と思いましたが、ネットワークの問題でうまくインストールができなかったりしていたようでした。なんどかbuildしていくとキャッシュが効いてインストールできるようになりました。

# 問題2

1度`Jecnkins`コンテナを起動してしまうと、一番初めのパスワードの設定の画面に行くことができません。

![https___qiita-image-store.s3.amazonaws.com_0_230436_c2b66460-e26c-9576-2d12-697289beff37.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/109db0ce-400d-4de9-92d4-2a6c93b50309.jpeg)

(ここにいってパスワード設定したいのに、ログイン画面にいってしまう、この画面になったときにタブを消してしまいサインイン設定していないのにログイン画面に行ってしまって困った)

# 解決方法

パスワードを忘れたときの対処法がありました。

まずは`Jenkins`コンテナに入ります。

```
$ docker-compose exec -it jenkins sh
```

そのあと、以下のフォルダに移動します。

```
$ cd /var/lib/jenkins_home
```

jenkins_homeはdocker-compose.ymlでマウントをその名前にしています。jenkinsの可能性もあります。
本書通りならこれで大丈夫です。

```
vi config.xml
```

Viでxmlファイルのを以下のように修正します。

```
<useSecurity>true</useSecurity>
↓
<useSecurity>false</useSecurity>
```

これで、パスワードなしでログインできるようになります。

そのあと、アクセスしてパスワードの再設定ができます。

# 問題3

Jenkinsコンテナを動かしている仮想環境で、ほかの仮想環境2つのSSH接続を行った後の以下のコードでエラーとなります。

```
$ docker container exec -ti jenkins ssh root@192.168.1.86
(中略)
# この次でエラー
$ docker container exec -it jenkins ssh docker login
```

このエラー行を飛ばしてしまうと、パイプラインのPre CheckでDockerHubにアクセスできずパイプラインがエラーになります。

# 解決方法

ここはかなりコードが間違っています。以下が正しいです。

```
$ docker container exec -it jenkins ssh root@192.168.1.86
(中略)
$ exit
$ docker container exec -it jenkins docker login
```

これでDockerHubのログインが可能です。

# 問題4
この問題は私だけかもしれませんが、いろいろやっていたらJenkinsにアクセスできなくなりました。
`ip a`で調べたIPにアクセスしているのですが、なぜかアクセスができません。
(前までできてたのに......)

Jenkinsの仮想環境のIPもなぜか変わっていました。

そのあと、仮想環境を再起動したりしてみましたが、アクセスできず。
Dockerfileを元に戻しましたが、ダメでした。

# 解決方法

パソコン自体を再起動したら治りました。
IPも最初のものに変わっていました。再起動試してみる価値ありですね。

ちなみにJenkinsfileの環境変数の設定も忘れないようにしましょう。

# おわりに
1単元1時間というテーマですが、6章は5時間ほどかかりました。
おかげですこしJenkinsと親しくなれた気がします。いままで触ったこともなかったのでデプロイやパイプラインについてなんとなくわかるようになったのでやった価値はありました。

やっと次はKubernetesです。待ってました。

# 参考
[Jenkinsのdockerイメージは、Docker公式とJenkins公式の２つあるのか…](https://www.kwbtblog.com/entry/2020/03/09/035048)
バッチ処理環境の構築（汎用機からの離脱）

# はじめに
　前回作成したコード変換プログラムを使用して，汎用機（COBOL環境）及びWindows（COBOL環境）から新システム基盤へ環境を移し，新しいバッチ処理環境を構築します。そのためのテスト環境として，以下のような環境を機能要件として検討します。

* MySQLサーバを立ち上げる
* Python実行環境を立ち上げる
* 各種ファイルを移行する
* telnetサーバを立ち上げる
* telnet接続で処理実行，結果表示（文字表示）が正しく行える

# 環境
　MySQLが依存関係のチェックをしてくれるので，以下の順番でインストールしておくと，後から遡ってインストールする手間が省けます。

* Windows 2012 R2
* Microsoft Visual Studio 2015
* .Net Framework 3.5
* Python 3.6 
* MySQL Installer 8.0.26（以下の機能が選択でインストールできます）
 * MySQL Community Server 8.0.26
 * MySQL Shell 8.0.26
 * MySQL Workbench 8.0.26
 * Connector/Python 8.0.26

　その他，Python及びC#のサーバ上での開発環境として，VSCode及び.Net Coreも同時にインストールしています。

# 工数
　調査及び構築で以下のとおりです。

* 総工数 ２人日
 * 調査及び文字環境検証（１人日）
 * 構築（１人日）

# 背景
　以下の理由で，社内システムの若返りを図りたいと考えています。

* COBOL技術者が足りないため，過去から引き継いだ資産が保守できない
* 環境の選択肢が非常に狭い（COBOL実行環境がベースになるため）
* データの利用が難しい（必ず難解な文字コード変換を挟むことになる）

# 今回用意したもの
　各種サーバ及び環境系の整備を以下のとおり実施しました。

![新環境系.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423321/7d0b2ec0-4ce7-69b6-0f35-254e5a378a67.png)

# 作業詳細
#### 1　オリジナル文字コード to UTF-16(CSV)
　以前，作成した以下の文字コード変換ツールを用いて，UTF-16に変換します。
　詳細については，「[オリジナル文字コードからユニコード（UTF-16）へ変換する文字コード変換プログラム](https://qiita.com/segiori/items/efb9370a6c0e39d43289)」を参照。

#### 2　メーカー独自文字コード to UTF-16(CSV)
* ***1*** に習い，テーブルだけを変更して，メーカー独自コードから，UTF-16に変換します。その際，以下の手順を踏みます。
  * 2-1 FTPでデータ取得（ASCIIモードでデータ取得することでEBCDICからJISに文字コード変換される）。[RFC:385](https://datatracker.ietf.org/doc/html/rfc385)を参照。
  * 2-2 メーカー独自JISからUTF-16に変換（その際，***1*** のプログラムをそのまま利用できる。）。

#### 3　UTF-16 to UTF-8
　PowerShellでUTF-16からUTF-8に変換する。「[Powershellでファイルの文字コードを変換](https://qiita.com/tworks55/items/b7884c4bb6ec84e73e57)」を参照。ただし，リンク先の説明と少し齟齬し，必ずBOMが入ってしまうようなので，先頭３バイトをtruncateします。

#### 4　インポート
　通常のMySQLコマンドを使用し，DB及びテーブル作成を行う。

* 本番DB（手動クリア）及びテストDB（自動クリア）を作成する
* テーブル名はファイル名と共通にする（ファイル名に***　.（ドット）***が含まれる場合，***　_（アンダーバー）***に変更）
* 事前に各ファイル項目定義の用意をお願いし，数値及びテキストに変換する

#### 5　Python及びC#でのデータ参照
　PythonからMySQL connectorを通して，特定の DB にアクセスできるかを確認します。
　「[PythonからMySQLへ接続する](https://qiita.com/a_t_a/items/680ed657c4dbeab40a28)」を参照。

#### 6  遠隔端末での処理実行及び文字表示
　コマンドプロンプトでUTF-8で文字表示がされることを確認する。本環境では，独自フォント及び独自コード体系を使用しているため，コマンドプロンプトで確認できる範囲に制約がある。そのため，正確にデータを確認したい場合は，以下のコマンドで外部出力し，確認する。

~~~sql:外部出力先確認
select @@secure_file_priv;
~~~

~~~sql:外部出力
SELECT 列１, 列２, 列３ 
FROM テーブル名 
INTO OUTFILE 'ファイル名（外部出力先確認した配下）'
~~~

# 課題
* UTF-16のみで環境構築するつもりでしたが，コマンドプロンプトがUTF-8にしか対応していなかったため，以下のとおりになっています。
 * 入力データはUTF-16からUTF-8に変換しています
 * UTF-8ベースでデータベースへロードしています
 * UTF-8で文字データを扱っています
* Unicodeの独自フォントを表示させたかったができなかった。具体的には，「[cmd.exe のフォントを変更する](https://qiita.com/ykiu/items/4f853cb58c2f993dbe2c)」にある方法を試したができなかった（継続検討）。
 * FaceNameの変更では，表示が変わらなかった
 * レジストリ変更では，コマンドプロンプトのタイトルバーの右クリックメニュー→プロパティ→フォントで選択しようとしても，当該フォントが出てこなかった（そのため，選択できなかった。）
～Node-REDの超基礎情報～明日の日付データを作りたい

**超初心者だから超初心者向けの記事を書いています！**
はじめまして。
デジタル超初心者のたなかです。「えっ、そんなことやっているの」という超初心者向けの内容を記載しています。
「え、こんな非効率的なことをしているの⁉」といった内容を見かけたらコメントを頂けると嬉しいです。よろしくお願いいたします！
#明日の日付データを作る方法
自信作、六曜お知らせLINEbotで明日の情報を取得したい！という願望から始まりました。APIに日付データを送るのですが明日の日付データ（yyyymmdd）を取得する必要があります。

#タイムスタンプを使います
**タイムスタンプって何ですか？**
タイムスタンプはUNIX時間（ゆにっくすじかん）といって1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を指すそうです。
このタイムスタンプを操作して日付データを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/9d0693c6-de71-7599-6878-f751b247fa08.png)
このデバッグ情報の”1628521532446”は1970は年1月1日0:00:00から1628521532.446秒経過しているという意味です。

#タイムスタンプを操作します
操作はタイムスタンプに加算(減算)するを行います。
下のコードを使います。

```ruby:
$fromMillis($millis() + 86400 * 1000 * 1)
```
fromMillisは経過ミリ秒nの表示方法を変更、$millis()は現在のミリ秒、86400は1日分、1000はミリ秒、1は1日を表しています。

#ノード選び
使うノードは
injectノート（タイムスタンプ）と
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/1b1794f7-7905-3b44-f5a1-681e811abec7.png)
changeノード（1日を加算する処理を実施）です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/8daf4145-af9f-0b4f-6975-bbb8f7c02212.png)
#フローを作る
ノードの並べ方はこんな感じ
タイムスタンプを出力して1日分を加算する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/00a139f4-b295-dea5-6864-d7ab4537bd85.png)
chengeノードの中身を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/44148893-60fd-c92c-e8cd-b24fd9a29425.png)
#結果発表！！
そして結果、1日加算されました。あれ、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/12a6b0a1-ff6e-dbb4-2175-035939aa9e25.png)
表示は協定世界時表示です。日本時間にあわせたい場合は時差+9時間を考慮しないといけません。
32400秒(時差+9時間)とミリ秒を追加しました。

```ruby:
$fromMillis($millis() + 86400 * 1000 * 1 + 32400 * 1000)
```

これでバッチリです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1811885/d5721b9c-07e3-2ae0-041c-dec6f3dc6591.png)


今回、参考にした記事はこちらです。
この記事を再現したといってもいいでしょう。
@tseigoさんありがとうございます！

https://qiita.com/tseigo/items/e7deb8d6d4902a4aef30

最後まで読んで頂き、誠にありがとうございました。
今後ともよろしくお願いいたします！
M1 MacでLaradockのMySQLが動かない時に対処した方法

M1MacでLaradockのMySQLが動かなかった時に対処した方法です。

##Dockerfileの修正
~\laradock\mysql\Dockerfile

FROM mysql:${MYSQL_VERSION}
この行を下記のように修正
FROM --platform=linux/x86_64 mysql:${MYSQL_VERSION}

##DockerDesktop
設定画面で下記のチェックを外す
![スクリーンショット 2021-08-10 0.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12035/b969b1e6-8dc9-a323-8441-be2e238b8aa1.png)

##参考にした記事
M1Mac環境でDockerのMySQLを動かす
https://qiita.com/toyoyuto618/items/f225e1b2ab22ca5adf33

Mysql not starting in a docker container on MacOS after docker update
https://stackoverflow.com/questions/64146845/mysql-not-starting-in-a-docker-container-on-macos-after-docker-update
Power BI Desktopのスモールマルチプル機能を、生活維持のための「消費支出」データを使って試す


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/66f523f4-ef4f-2684-e978-390a5f2d52d4.png)

##「e-Stat」からデータを取得

Power BI Desktopを使っていて、右パネルに「スモールマルチプル」とう設定枠があるのに気づきました。
元々は2020年12月にプレビュー版として追加され、オプション設定で「オン」にしないと使えない機能でした。
どの時点かのアップデートで標準機能となったようです。

簡単に言うと、カテゴリ毎に複数のグラフを格子状に並べることができる機能です。
以下を参考にしました。

https://www.youtube.com/watch?v=GdUIjlCnYUA

https://qiita.com/ishiayaya/items/a2ae35e2cbd7376474ab

「消費支出」のデータを、[政府統計の総合窓口「e-Stat」](https://www.e-stat.go.jp/)から取得します。
2021年（令和3年）6月分が2021年8月6日に公表されました。
「消費支出」とその内訳の「10大費目分類」（品目分類）を抽出しました。

>消費支出【円】
1 食料【円】
2 住居【円】
3 光熱・水道【円】
4 家具・家事用品【円】
5 被服及び履物【円】
6 保健医療【円】
7 交通・通信【円】
8 教育【円】
9 教養娯楽【円】
10 その他の消費支出【円】


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e76ee682-6a87-1933-2584-a6d521eb2f4d.png)

なお、「e-Stat」ではグラフ作成もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/fa348881-0206-31ed-1e58-62540eb9332c.png)

ダウンロードしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/604b5190-d3b2-ce45-98aa-c99619f82255.png)

不要な行などを外し、Power BI Desktopに取り込みました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/65ce717f-af20-1ac5-8885-d548b8881a19.png)

##データをクレンジング

取り扱いやすいように、消費支出と費目分類の列を1列にまとめます。
「変換」→「その他の列のピボット解除」を実行しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/757ef80b-79a2-6208-4df3-a2656dc673c8.png)

「消費支出」の内訳として「10大費目分類」があるので、各テーブル（クエリー）に分けます。
クエリーをコピーし、元のテーブルではフィルターで「消費支出」だけを指定、コピー先のテーブルでは「品目分類」（10大費目分類）を指定して、テーブルの内容を分けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/de0eb452-b42b-a4ff-a105-dcd4a12ab704.png)

2つのテーブルの複合グラフを作成するために、テーブル間のリレーションシップを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/a7ef4e5a-14c4-e97a-0c7f-0d793d4fa5a1.png)

「消費支出」と各「10大費目分類」の割合を確認するために、積み上げ棒グラフを選択しました。
このままでは、データの「全部入り」状態なので、カテゴリの指定をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/5b22f20b-8d9e-96c7-211c-4a0a9295ca07.png)

「フィルター」パネルで「2021年」を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/2af1bc03-d0bb-4e2f-af41-8558249cee51.png)

##スモールマルチプルを実行

「スモールマルチプル」に「品目分類」（10大費目分類）をドラッグすると、同機能が実行されます。
分類ごとに複数のグラフが並びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/c3e41df1-a385-7d8a-2ead-970f495e9b3a.png)

積み上げ棒グラフなで、縦軸の最大値は「100%」です。
品目分類の割合を見やすいように、「30%」に変更します。
この他、データラベルなども追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/c299f75b-b95b-34f5-d72d-9afaf69aec6b.png)

まだこのままでは各地域の合計値を扱っているので、「スライサー」機能で「地区区分」を指定できるようにします。
「年」のように「フィルター」で指定しなかったのは、グラフを見ながら選択しやすいようにしたかったからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/9e1b2537-2ebc-73a7-ec3c-6235528d22b3.png)

ペイントローラーアイコンの「書式」から、スモールマルチプルの設定を変更します。
「3×3」の格子スタイルに変えてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/62df1f4c-0059-1d2c-9120-cfa8cbe3028e.png)

各Y軸は同一の範囲の設定となるようで、行ごとに変更する機能は見つかりませんでした。
でも、使用頻度が増えそうです。

**了**
【Rails】メモ: Concern内にプライベートクラスメソッドを書く

ActiveSupport::Concernモジュール内にプライベートクラスメソッドを書く際に少し詰まったのでメモしておきます。
`sample_class_method`はプライベートクラスメソッドとして扱うことが出来ます。


```ruby
module Sample
  extend ActiveSupport::Concern

  included do
    private_class_method :sample_class_method
  end

  class_methods do
    def sample_class_method
      puts 'hello world!'
    end
  end

  private

  def private_instance_method
    puts 'hello world!'
  end
end
```
PrologをEmacsで書いてみる

# インストール手順

Debian/busterで検証

```shell
$ sudo apt-get install swi-prolog
$ prolog --version
SWI-Prolog version 8.0.2 for x86_64-linux
```

## Emacsで対話環境起動

参考: [Prologue: Prologを動かすには](https://www.katolab.nitech.ac.jp/lecture/PROLOG/doc/starting.pdf)

- Emacsを立ち上げた状態で「M-x run-prolog」とやると対話環境が立ち上がる
- prologは「?-」がプロンプトらしい

サンプルプログラム

```prolog
?- write(hello).
hello
true.

?- X is 2+2.
X = 4.
```

以下の画像のようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20634/a3200dc1-0e89-5f17-8d59-681e9be366c5.png)

## EmacsでPrologを書く(設定)

* 参考
  * [Using SWI-Prolog with GNU Emacs](https://www.swi-prolog.org/FAQ/GnuEmacs.html)
  * [Prolog Mode for Emacs](https://bruda.ca/emacs/prolog_mode_for_emacs)
  * https://github.com/triska/ediprolog


Debianの場合、すでにprolog-modeは入っていると思われるので、以下のようにediprologを設定してみる

* ~/.emacs

```elisp
;; prolog
(load "~/.emacs.d/prolog")
```

* ~/.emacs.d/prolog.el
  * https://www.metalevel.at/ediprolog/ を参考にしている

```elisp
(autoload 'run-prolog "prolog" "Start a Prolog sub-process." t)
(autoload 'prolog-mode "prolog" "Major mode for editing Prolog programs." t)
(autoload 'mercury-mode "prolog" "Major mode for editing Mercury programs." t)
(setq prolog-system 'swi)
(setq auto-mode-alist (append '(("\\.pl$" . prolog-mode)
                                ("\\.m$" . mercury-mode))
                              auto-mode-alist))

(unless (package-installed-p 'ediprolog)
  (package-refresh-contents) (package-install 'ediprolog))
(require 'ediprolog)
(setq ediprolog-system 'swi)
(global-set-key "\C-c\C-e" 'ediprolog-dwim)
```

## EmacsでPrologを書く

最後に簡単なPrologのプログラムを書いて、ediprologを実行してみる

```prolog
% member(X,List): XはリストLの要素である
member(X, [X|_]).
member(X, [_|L]) :- member(X, L).

?- member(a,[a,b,c]).   <-- 「.」まで打ったら「C-c C-e」と打ち込むと下に結果が出る
%@ true 
```
リーダブルコードを読んでの個人メモ(3)

#メモ

**コメント**
・コードを見れば理解できる内容はコメントには書かない。
・どんな処理をしているか、また今後起こり得そうなことをコメントに残す。
・コメントは短く簡潔に。
・質問されそうなことを書いておく。
・知らないと困る・ハマリそうなこと

**制御フロー**

・条件式

```
//肯定型をなるべく使う
//単純な条件を先に書く
//関心を引く・目立つ条件を先に書く

if(調査対象:変化する == 比較対象:あまり変化しない)
```

・三項演算子

```
//下記は短いから三項演算子で書いてもOK
time_str += (hour >= 12) ? "pm" : "am"

//三項演算子が長ければなるべくif文に変える
return exponent >= 0 ? mantissa * (1 << exponent) : mantissa / (1 << -exponent);

if(exponent >= 0){
        return mantissa * (1 << exponent);
    }else{
        return mantissa / (1 << -exponent); 
    }
```

・関数では早めにReturn

```
public void method() {
    if (よくあるケース/正常なケース) {
        // 通常の処理
    } else if (特殊なケース1) {
        // 特殊な処理1
    } else if (特殊なケース2) {
        // 特殊な処理2
    } else {
        // それ以外の処理
    }
}
```
修正後

```
public void method() {
    if (特殊なケース1) {
        // 特殊な処理1
        return;
    }

    if (特殊なケース2) {
        // 特殊な処理2
        return;
    }

    // 通常の処理
}

```

**ネストを浅くする**
ifやforをできる限り重ねないように書く

```
public int method(){
    if( current_user.id == 1 ){
        // 処理1
        if ( current_user.status == 1){
            // 処理2
        }
        // 処理3
        return 1;
    }else{
        return 2;
    }
}
```
修正後

```
public int method(){
    if( current_user.id != 1){
        return 2;
    }

    // 処理1
    if( current_user.status == 1){
        // 処理2
    }
    // 処理3
    return 1;
}
```



今更だけどめちゃめちゃ綺麗にまとめられている記事があった。。。神かよ。
https://qiita.com/falorse/items/7c0a368f88adf01d3fed
一部そのままパクったけど、自分がわかりやすいと思った記事をパクってメモに残すことは悪いことじゃないよね？笑
K6 VS Gatling 負荷テスト能力を比較するとK6のほうが優れている

## 結論

- 少なくとも、リクエスト時間が十分短い軽量なワークロードでは、gatlingよりも、K6のほうが処理が早い。
- gatlingでは400TPS程度までしか出せず、エラーになる条件でも、K6は1000TPS以上出すことができる。
- Gatlingであれば工夫して複数インスタンス同時実行しなければならない状況でも、K6ならば1インスタンスのみの実行で収まるケースが増えると思われるため、K6のほうが利便性が高い

## ツール

https://k6.io/

https://intuit.github.io/karate/karate-gatling/

https://gatling.io/

## テスト条件

- Azure Container Instance上に公開した、簡単なカウンター加算アプリのエンドポイントに対し、  
  インターネット経由で各負荷テストツールでリクエストを行う。
- ワークロードは、getリクエストとputリクエストが50:50の割合になるようにする
- 各負荷テストツールの実行環境は、gitlab-runner(Docker Executor)。

## アプリコード

https://qiita.com/KO_YAmajun/items/55654a0fd261e156e1c6

## テストコード

- K6

https://qiita.com/KO_YAmajun/items/8f2433d1244a7d886275

- Gatling

https://qiita.com/KO_YAmajun/items/55654a0fd261e156e1c6#%E3%83%86%E3%82%B9%E3%83%88%E8%B2%A0%E8%8D%B7%E3%83%86%E3%82%B9%E3%83%88

## 結果

K6は最大1000TPSに達するまでリクエストしても、エラーが発生しなかった。
また、putリクエストの回数に等しいだけ、カウンターアプリケーションの加算が正常に発生したことを確認できた。　

Gatlingは2回実行したが、いずれも数十秒経過でKOが発生した。
原因は2000msを超過したことによりタイムアウトである。タイムアウトは同様の傾向を示していた。
タイムアウトを外すことは可能ではあるが、原因がレスポンス遅延である。
K6であれば所定時間内にレスポンスできている点やACIメトリクスから、ACI側のボトルネックはないことを確認している。
K6では最も悪いケースで300ms、大半のリクエストが60ms以内に解決できているため、そもそも負荷出し性能に劣ると判断した。


### Gatling(1回目)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/73a4617c-b0f3-1a1d-2816-de2b7a8cbdcf.png)

### Gatling(2回目)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/054bcad5-eeed-9dc2-57a7-03bb54594c28.png)

### K6

件数が一致するかどうかの確認以外は、下記ページに記載。

https://qiita.com/KO_YAmajun/items/8f2433d1244a7d886275

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/cf210147-74ed-eb08-9629-333d7b26e68c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161516/a4604f13-db3b-b155-b7f7-371222d58e4d.png)