OmniAICreator/Qiita-1.07M huggingface dataset:
Cypress + reg-cli さくっと！ ビジュアルリグレッションテスト

# Cypress + reg-cli <br>さくっと！ ビジュアルリグレッションテスト

UIの崩れや文言の誤りがないか
本番と開発の差分を確認したい時があります。

例えば
- 既存は変えずにソースのリファクタリングを行ったとき
- フロント側のソースに固定で書いていた情報をバックエンドへ管理するようにしたとき
- 想定外の場所に影響させてないか確認したい時

そんな時にCypress + reg-cli を使った
ビジュアルリグレッションテストが役立ったので紹介します。


## ビジュアルリグレッションテスト とは

画面をキャプチャして、見た目の比較を行うテストを指します。

今回使用するライブラリ(reg-cli)では比較した結果がhtmlでレポートされます。
差分が赤く表示されるので、想定している箇所のみが差分として出ているかを確認できます。

![スクリーンショット 2023-04-14 13.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2475731/ae2523c3-0f56-2e6c-bd6a-4b6c7fc35918.png)


## Cypress とは
https://www.cypress.io/

CypressはE2Eテストツールです。

JavaScriptで書かれたオープンソースのエンドツーエンドテストフレームワークで、
Webアプリケーションの機能テスト、パフォーマンステスト、セキュリティテストを自動化することができます。

今回はCypressでキャプチャを自動取得させます。

## reg-cli とは
https://github.com/reg-viz/reg-cli

ビジュアルリグレッションテストを実行するためのコマンドラインツールです。
Webアプリケーションの変更がビジュアル的に影響を与えていないかどうかを確認するために使用します。

今回はCypressで取得したキャプチャをreg-cliで差分比較します。

# 手順

①cypress / reg-cliをインストール

```
yarn add cypress 
yarn add reg-cli 
```
②cypressで自動的にキャプチャ取得するテストを記載

e2eフォルダ配下にテストを書きます。

※この場合は特定の1ページしか取れませんが、
ループさせていろんなページに飛んだり、
ドメインを切り替えて本番とテスト環境をそれぞれ取得したりしてください。

```get_capture.cy.js
describe('get_capture', function() {
    /* 遷移するURL */
    const url = 'https://test/'
    
    /* ファイル名(キャプチャ前後で画像名を合わせます) */
    const file_name = 'test'
    
    /* urlに遷移します */
    beforeEach(() => {
        cy.viewport('macbook-16')
        cy.visit(url, {failOnStatusCode: false,}).wait(3000)
    })
    
    /* screenshots/dev/ フォルダに格納されます */
    it('take screenshot', function() {
        cy.screenshot('dev/' + file_name, {
            capture: "fullPage"
        })
    })
})
```
③cypressのキャプチャ取得を実行

```
cypress run --spec cypress/e2e/get_capture.cy.js
```

④reg-cliで差分を取得
/cypress/screenshots/devフォルダと、/cypress/screenshots/prdに
比較したいキャプチャ画像ファイル(同じ名前)が入ってるとして
下記を実行します。(長いですが1コマンド)

```
./node_modules/.bin/reg-cli ./cypress/screenshots/dev ./cypress/screenshots/prd ./cypress/screenshots/diff -R ./cypress/screenshots/report/index.html
```

⑤差分が出力されます

- diffフォルダには差分が出たキャプチャ(差分が赤く表示されます)
- レポートフォルダにはhtmlが吐き出されており、ブラウザで比較結果のリストが確認できます。

# 終わりに
一番大変なのは運用に乗せることだと思います。
特にキャプチャを自動取得する際には、浮かせているヘッダーやフッター、スクロールによる挙動で
キャプチャがうまく取得できない場合があります。

また、サービスのページ数/コンポーネント数によってはどこまでチェックが必要か
決める必要も出てきます。

しかし、品質やテスト効率の向上が見込めるビジュアルリグレッションテストは
苦労しても導入した甲斐がきっとあると思います。
PHP csvファイルを Shift-JIS => UTF-8 へ変換

### ■ 完成
・ファイル名：Change_Character_code.php
![スクリーンショット (692).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478380/de9597bb-dc6b-7255-ac49-c2be3b5d5793.png)

![スクリーンショット (691).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478380/9ab0a929-29f0-f460-04a1-a41e078d9148.png)

### ■ ソースコード

```php Change_Character_code.php
<?php 

// フォルダのパスを指定
$folder_path = "./";


// フォルダ内のファイルを取得
$files = scandir($folder_path);
var_dump($files);

foreach ($files as $file_val) {
  // ファイル名が".csv"で終わるかどうかを確認
  if (substr($file_val, -4) == '.csv') {
    // ファイルを開く
    $content = file_get_contents($folder_path . $file_val);

    // Shift-JISからUTF-8に変換
    $content = mb_convert_encoding($content, 'UTF-8', 'Shift-JIS');

    // ファイルを保存
    file_put_contents($folder_path . $file_val, $content);
  }
}


?>
Amazon CodeWhispererを導入してみた

# 前置き
Amazon CodeWhispererという、GithubCompilotのAWS版が出てきました。AmazonもAIに本格参入するということなので、ほかのAIサービスも期待しましょう。
このAmazon CodeWhispererはGithubCompilotと違い、個人ならば無料ということで、導入してみました。
まんま公式のパクリです。

## 導入方法
### 前提条件
メアドを持っていることが条件です。
大抵のIDEはサポートされています。
今回はVSCode前提です。
現在対応している言語はこれです。※2023/4/14現在
Java, Python, JavaScript, C# , TypeScript, C, C++, Go, Rust, PHP, Scala, Kotlin, Ruby, Shell and SQL

### 拡張機能導入

この拡張機能に一緒に入っています

https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.aws-toolkit-vscode

拡張機能を入れて、次にここから開始します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/24a7751a-f4da-0fed-3c84-5e68132ecfb2.png)

一番上のやつを選びます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/65beab27-e4e7-19ab-8391-ebea19fd72c0.png)

このポップアップのCopy Code and Proceedをクリックし進めます。
これで次で必要なコードは勝手にクリップボードにコピーされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/809d86fe-acea-eadf-07d4-fece777d76c9.png)

その後VSCodeがウェブサイトを開こうとするので開かせます。
こんな画面になると思いますので、CodeをCtrl+Vでペーストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/156c1ed2-8991-9834-9b80-6f6811b25b22.png)

こんな画面になるので、サインインかサインアップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/85187a52-0dca-8bc4-4031-0998c3abbd6a.png)

サインアップ手順などは割愛して、サインアップなどが成功すると、変なことをしなければこの画面に跳びます。
Allowを押して認証します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/7d73dff3-2dac-3423-daa2-34f0f6dbac5f.png)

すると、VSCodeがいつの間にかこうなっています。
上はCodeWhispereだけこのアカウントにしてあとはデフォルトのまま、
下は全部このアカウントにするとなっています。
私は上にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/e9fc5565-dd0b-83a8-5d31-8d603facea00.png)

すると、ペインが分割されて説明が出てきます。これで導入は終了です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/73b140b9-539d-dda6-499a-c66a8f99c692.png)

## 簡単な使い方
右矢印と左矢印で提案を移動し、タブで確定。
何か打つかエスケープキーで現在の提案は消えます。
WindowsならAlt+C、MacならOption-Cで提案を出させることが可能です。
内容をまんま説明するような関数名で関数を作成すると、内部をいい感じに補完してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/61291c57-09b6-9b4b-480b-81670ded9a57.png)
この状態でAlt+Cを打つと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/890310/cacad9e9-a2e1-9fad-f41d-c96c4f059514.png)
こんな風に補完してくれたりします。
ショトカを打たなくても勝手に補完されることも多いです。

# 終わりに
みなさんがHello World with AIできるように祈っておきます！！
AWS RDS: 東京リージョンで日次バックアップを取得し、大阪リージョンにコピーしてリストアする方法

# AWS RDS のバックアップとクロスリージョンリストア

この記事では、東京リージョン (ap-northeast-1) で日次バックアップを取得し、大阪リージョン (ap-northeast-3) にコピーしてリストアする方法について説明します。

## バックアップ要件
- 東京リージョン(ap-northeast-1)で稼働するRDSを日次でバックアップする・維持する期間は仕様上の最大値とする。
- 東京リージョン(ap-northeast-1)でバックアップしたデータを日次で大阪リージョン(ap-northeast-3)へコピーし、維持する期間は1年とする。

### 東京リージョン(ap-northeast-1)でのRDSバックアップ
- 自動バックアップ機能を無効にする
バックアップウィンドウが明示的に設定されていない場合、AWSはランダムな30分間の期間を選択し、その期間内に自動バックアップを開始します。今回、AWS BackupプランでRDSバックアップをスケジュールするので自動バックアップ機能は無効にしておくことをお勧めします。これにより、2回バックアップが取得されることを防ぐことができます。
```db.tf
resource "aws_db_instance" "example" {
  # ...
  backup_retention_period = 0 // Controlled by backup plan
```

### 東京リージョン(ap-northeast-1)から大阪リージョン(ap-northeast-3)へのバックアップデータのコピー
- 東京リージョンと大阪リージョンの両方で、バックアップデータを格納するための AWS Backup Vault を作成します。

```main.tf
provider "aws" {
  alias  = "tokyo"
  region = "ap-northeast-1"
}
provider "aws" {
  alias  = "osaka"
  region = "ap-northeast-3"
}
```
```vault.tf
resource "aws_backup_vault" "tokyo" {
  provider = aws.tokyo
  name = "vault-tokyo"
}

resource "aws_backup_vault" "osaka" {
  provider = aws.osaka
  name     = "vault-osaka"
}
```
- 東京リージョンでバックアップし、そのデータを大阪リージョンへコピーするためにCrossRegionCopyを有効化します

```backup.tf
resource "aws_backup_plan" "multi_region" {
  name = "multi-region-backup"

  rule {
    rule_name         = "multi-region-backup-rule"
    target_vault_name = aws_backup_vault.tokyo.name
    schedule          = "cron(00 14 * * ? *)" // 23:00UTC+9

    lifecycle {
      delete_after = "35"
    }

    copy_action {
      destination_vault_arn = aws_backup_vault.osaka.arn
      lifecycle {
        delete_after = "365" // 1年
      }
    }
  }
}
```
```iam-role.tf
data "aws_iam_role" "awsbackupservicerolepolicyforbackup" {
  name = "AWSBackupServiceRolePolicyForBackup"
}

resource "aws_iam_role" "example_backup" {
  name = "example-backup"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "backup.amazonaws.com"
        }
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "example_backup" {
  policy_arn = data.aws_iam_role.awsbackupservicerolepolicyforbackup.arn
  role       = aws_iam_role.example_backup.id
}
```

### リストアについて注意点
1. RDSのリージョン間コピーを使用した場合、コピー先リージョンでリストアする際には、AWSマネージド型キー（aws/rds というデフォルトのマネージドキー）しか使用できません。そもそも、データ暗号化で使用するKMSキーはリージョン固有なので、東京リージョンで使用したKMSキーを他リージョンでは使用できません。
2. コピー元リージョンで使用しているインスタンスタイプがコピー先リージョンでは提供されておらず、使用できないこともあります。

### まとめ
この記事では、東京リージョンで日次 RDS バックアップを取得し、大阪リージョンにコピーしてリストアする方法について説明しました。AWS Backup を使用することで、異なるリージョン間でのデータの移動やリストアを簡単に行うことができます。これにより、災害復旧やデータの可用性が向上し、ビジネスの継続性が確保されます。
AWSでhttp通信からSSL化してhttps通信にする方法

<h1>AWSでSSL証明書を取ったのにhttpsにならない。</h1>
<p>AWSの勉強を始めて一ヶ月、https通信にならず、これじゃセキュリティに問題ありだな〜なんて考えてSSL証明書を取ったのに、https通信にならない。
なんでかな〜と思っていたところに。ごく当たり前のことに気づく、http通信からhttps通信にリダイレクトさせればええんや。
そんなことを思ったので、<a>https://qiita.com/nakanishi03/items/3a514026acc7abe25977</a>こんな記事を見つけたのでさっそくロードバランサーまで設定して、httpsを許容。よし！と思ったがこのままではリダイレクトできないので。
ロードバランサー→リスナー→http:80の設定をリダイレクトに変更し、リダイレクト先をhttps:443に設定。
そしたら見事にリダイレクトされた！<br>
https通信にしたらCSSが効かなくなったけど、検証モードのコンソールで確認したらhttp::〜でcssやjsが読み込まれてたので、httpsに記載を変更。これで完了。見事にSSL化ができた〜！！！
在庫分類とは?

効果的な在庫管理は、あらゆるビジネスの成功に不可欠です。最適な在庫レベルを維持することを目的とするビジネスは、コストを最小限に抑えながら顧客のニーズに迅速に対応するのに役立ちます.過剰または在庫切れの在庫は、会社にとって有害で​​す。過剰在庫はコストを増加させますが、在庫が不足すると収益が減少します。これらは両方とも、ビジネスの収益性に影響を与えます。したがって、在庫を最適なレベルで管理する必要があります。在庫管理の重要な側面は、在庫の分類です。

在庫分類の概念をもう少し追ってみましょう。

在庫分類とは何ですか？
在庫分類とは、さまざまなパラメーターに基づいて在庫品目をグループ化することを意味します。これは、在庫タイプ、収益への貢献度、販売頻度、在庫金額などです。

これらの標準分類パラメータを理解しましょう。

広告枠の種類で並べ替え:
どのビジネスでも、主な在庫分類はタイプ別です。ビジネスには、次の 3 種類の在庫があります。

材料
進行中の作業
完成品

これらの用語は理解しやすいですが、簡単に説明しましょう。

材料: 材料は、人々が最終製品を作成するための不可欠な製品です。これらの製品は、産業や家庭に販売されています。原材料は主に天然資源から得られます。いくつかの例は、紙の木材、靴の革、キャンディーのミルクなどです。
仕掛品: これらは原材料から作られた半製品です。そのような在庫品目は、最終販売のために未完成のままです。
完成品: これらは、人々が顧客に販売する完成品です。

収益への貢献度で並べ替え:
いくつかの在庫品目は、売上に大きく貢献しています。多くの場合、このような在庫品目には高い優先度が与えられ、その管理により多くのリソースが割り当てられます。また、それらは綿密に監視されています。これは、そのようなことがビジネスの収益性を大幅に高めるためです。

このような在庫分類は、ABC 分析に似ています。このタイプの分析では、在庫品目は次の 3 つのカテゴリに分類されます。

カテゴリ A には、収益の 80% を占める品目の 20% が含まれます。カテゴリ B には、売上に 15% 貢献する品目の 30% が含まれます。カテゴリ C には、売上高の 5% しか残っていない 50% のアイテムが含まれます。

このような分類は、売り手がさまざまなパラメーターを決定するのに役立ちます。彼は、収益を増やしてコストを削減するために、各項目に割り当てる時間とリソースを決定します。

販売頻度で並べ替え:
すぐに売れてしまう在庫商品もあれば、ゆっくりと売れていく商品もあります。その結果、売り手は販売頻度に基づいて在庫品目を分類できます。

たとえば、サムは自動車ディーラーです。彼はさまざまなブランドの車を販売しています。彼の荷物の中には、メルセデスとトヨタの車がありました。メルセデス・ベンツの車はあまり売れません。しかし、販売されると、収益に最大の貢献をします。トヨタブランドの車はよく売れますが、価格は比較的低いです。そのため、販売への貢献度はメルセデスほど高くない。

別の例としては、サプライ ストアがあります。ここでは、牛乳、パン、ケーキなどの生鮮食品がよく売れています。これらは、安定した需要を生み出す消費財です。

ただし、シリアルのような商品は、生鮮食品ほど早く売れません。そのようなものはより長い貯蔵寿命を持っています。そのため、購入後は適度な期間保管することができます。

上記以外にも需要予測が困難な品目がございます。それらはさまざまなカテゴリに分類できます。

販売頻度は、製品の在庫配置を決定するのに役立ちます。セール品はよりアクセスしやすくなります。売り手は、販売頻度に基づいて在庫を補充することもできます。

在庫金額で並べ替え:
ここでは、アイテムを高価値アイテムと低価値アイテムに分類します。したがって、人々はこれらの項目に時間とリソースを割り当てます。

在庫分類を実行するには、完全な在庫をマッピングする必要があります。すべての棚に明確にラベルを付ける必要がある、さまざまな製品カテゴリ専用のセクションを作成する必要があります。これにより、必要に応じて商品を迅速に移動できます。また、従業員へのガイダンスを提供し、エラーを減らします。

続きを見る: https://nhatvietlogistics.com.vn/dich-vu-cho-thue-kho/
サクラエディタのマクロでgdbのbtをツリー化


# gdbでバックトレースしたものをサクラエディタでツリー化したい場合

以下のスクリプトを[適当な名前.js]的な名前をつけて
`%appdata%\sakura` 内に保存する。

<details>
<summary>スクリプト</summary>

```javascript
var s = Editor.GetSelectedString(0);

var lines = s.split(/\n/);
var obj = [];

function getfuncs(obj, lines){
	var lnum = lines.length;
	for(var i=0;i<lnum;i++) {
		var matches = lines[i].match(/^#([0-9]+)\s/);
		if (matches) {
			var cols = lines[i].split(/\s+/);
			if (cols[1].match(/^0x/)) {
				obj.push(cols[3]); 
			} else {
				obj.push(cols[1]); 
			}
		}
	}
}

function maketree(obj) {
	var s =  "";
	var l = obj.length;
	var boxline = "";
	var padding = "";
//	Editor.MessageBox("" + l);
	for(var i=l-1;i>=0;i--) {
		s += padding + boxline + obj[i] + "\n";
		if (boxline.length > 0) 
			padding += "  ";
		boxline = "\u2514";
	}
	return s;
}
try {
	getfuncs(obj, lines);
	var aft = maketree(obj);
	if (aft.length < 10) {
		throw new Error("");
	}
	Editor.InsText(aft);
} catch(e) {
	Editor.MessageBox("Error" + e, 0);
}
```
</details>


これを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/7ee386fa-c0d2-c1d0-17a7-3e79472297ae.png)

サクラエディタにコピー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/6df4625c-89a7-36c4-92dd-85f7dc5c3e96.png)



変換したい部分を選択して、ツール->名前を指定してマクロを実行
![Animation.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2383810/341ea0d4-b0d3-a869-8494-114dfb268742.gif)

途中から作成したい場合は選択部分を絞るかShift+F6などで修正してください。
Djangoスタートアップ その0～仮想環境作成編～

# 仮想環境の作成
```shell
python -m venv <venv_name>
```

# 仮想環境有効化(activate)
仮想環境下のディレクトリにいることを仮定する
## widows
```shell:コマンドプロンプト
Scripts/activate
```

## linux/mac
```shell
source ./bin/activate
```

# 仮想環境無効化
```
deactivate
```

# Djangoのインストール
```shell
pip install django
```

# Djangoが正常にインストールされたか確認
```shell
django-admin --version
```

# 仮想環境下で`pip`で管理されているパッケージを確認
```shell
pip list
```
Java SE11 silver を取得した話

こんにちは。

java silverを取得したのでその話を書こうと思います。

# 総評
しっかり黒本を勉強すれば合格点は取れる！！

# スペック
しがない女性文系エンジニア。
業務歴としては
java6(のはず)を4年ほど → php7(のはず)を3年ほど → ベンダーコントロール(プログラムとのふれあいなし)を3年ほど → イマココ
将来の夢はイケメン。

# 取得理由
業務で使うから。
現在の業務ではjava SE17を使用しておりますが、以前使っていたjavaはse6でして…
まぁ別世界のように違う！色々増えてる！
そして改めて考えると「javaについてプログラムを組めと言われればできるけど、そのものについては詳しくないな」と思い知識習得のために取得しようと思いました。

# 勉強時間
2023年初めから始めましたが、本腰入れて勉強したのは試験前2週間
平日は1〜2時間、土日は3〜4時間、試験日の前日は6時間ほど勉強しました。
当日も試験時間を午後にして午前中に最終確認をしました。

# 勉強方法
黒本：
5、6周しました。だんだん問題と答えを覚え始めたので根拠も含めて解答するようにしました。
[ウズカレテスト](https://test.uzuz-college.jp/home)：
問題と解答に誤植が多く、ほぼ黒本の数字違い問題なので移動中とかの確認用に使用。
[SE8のサンプル問題](https://www.oracle.com/jp/education/certification/ocjp-silver-se8-3494542-ja.html)：
SE8に出る問題はSE11でも出るでしょーということで最後の1日で解きました。
問題に慣れるためにはよかったと思います。
youtubeのオラクルが出しているSE8のセミナー動画：
SE8に出る問題はSE11にも(以下略)ということで見ました。バージョン関係なく出そう、というか普通に勉強になることが多かったです。
私はこの動画でポリモーフィズムを理解しました。

# 試験の申込
[oracleのページ](https://www.oracle.com/jp/education/certification/1z0-815-jpn-48261-ja.html#exam) に従って申し込みました。
受験チケットについては楽天で購入したのでちょっと安かったです。
受験はテストセンターで行いました。
テストセンターの予約はやっぱり土日が人気でなかなか予約しずらかったです。
テストセンターの検索じゃなくて受験日付で検索できればいいのに…

# 試験当日
何よりも電車が止まるのが怖かったのでかなり早めに行きました。
当日の持ち物として身分証明書が2点必要です。
私は免許証と保険証を持っていきました。必ずお財布に入れているので特段準備はしなかったですが、普段持ち歩いてないよという方はお気をつけください。
ちなみに申込で書いた氏名はローマ字、身分証は日本語表記で大丈夫なのかしら…と思いましたが大丈夫でした。
受付時に自著でローマ字氏名と日本語氏名を書いて、写真付き身分証で顔の確認をされました。
また受付時に試験結果に表示する顔写真の撮影もありました。
ビジュアル気にする方はコンディションを整えてから受付することをおすすめします。

## テストセンターについて
かなり多くの人が居ました。荷物を預けるための空いているロッカーを探すのが大変でした。

花粉症の時期だったのでティッシュを試験室に持ち込みたかったのですが、自分のポケットティッシュは持込不可でした。
案内の人に申告して受付の近くにある箱ティッシュから数枚取って持ち込むのはOKでしたので、ティッシュを持っておきたい人はまず係の人に聞いてみることをおすすめします。

また試験室入室前にカンニング防止のチェックがあります。
マスクの裏やメガネをかけている人はメガネまで見られていました。
そんなところにカンニング用のもの仕込む人いるのかしら…

メモ用のボードとペン2本も入室前に配られます。
ラミネート加工されたボードにペンでメモを書く感じでした。
消せないのがなんとも…
ペンは2本もらっていて本当によかったです。
配られたうちの1本がインク切れしていました。

試験室も多くの人が居るので静かですが環境音は結構しました。
特にパソコンが古めでマウスのクリック音がかなり響いていました。
騒音防止用にイヤーマフが準備されていましたので、気になる人はそれを使用する感じでした。
メモ用のボードの追加やペン交換等をする方の対応や受験の案内など、常に係員さんが試験室を動き回っていました。

パソコンが古めと書きましたが、反応も遅くてドキドキしました。
特に試験開始時に数秒画面がブラックアウトした時は「大丈夫かこのPC」と不安になりました。
マウスも反応が悪くクリックしてもボタンが反応しない時もあってドキドキでした。
そのおかげで見直しはしっかりできたという効果もありました。

# 試験内容
7割くらいが黒本の演習問題の類題でした。
出題としては
・黒本の問題そのまま
・問う部分がちょっと違う(黒本では「どの行でコンパイルエラーが発生しますか」という問いに対して本番では「コードを実行しようとするとどうなりますか」の問いになっているなど)
・問題文のクラスがちょっと違う
という内容が多かったです。
はじめましての問題も黒本で解いた問題から答えを導き出せそうな問題が多かったです。
私の場合、1問目からスーパー長文コードが表示されて心が折れました。(突然数学のテストの大問5が来た感じ)
あとで確認するみたいなチェックボタンがあったのでさっと飛ばして他の問題を解いた後戻ってきて解くという解き方をしました。

試験時間は3時間ありますが、私は1時間半ほどで解き終え終了しました。
最後の「採点する」ボタンを押すときの緊張感すごかったです。

# 試験結果
85%で合格しました！
![IMG_0692.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281045/de06756b-984d-9d51-ba8a-d25c4019ddf8.jpeg)
(人に見せることができる点数でよかった)

# 合格できた要因
・黒本をやりこんだ
これに尽きます。
特に「根拠も含めて解答」したことで理解を深め応用もきいたのかなと思います。

# これから
java goldも取りたいなとは思うのですが今(2023年4月現在)行われているリテイクキャンペーンに間に合いそうにないので、次のリテイクキャンペーンを狙って受けようかなと思います。
おらくるさん りていくきゃんぺーん たくさんやって！
なんぼあっても いいですからね！

# 余談
取得理由を「業務で使うから」と書き、取得を決意したときは業務でjava使っていたのですが、さまざま都合がありまして現在の業務ではvue、typescriptを使用したフロントエンド開発をしております。
…
…
あれ？
[AWS Q&A 365][WAF]AWSのよくある問題の毎日5選 #29

# 1. API Gatewayとは何ですか？また、AWS WAF、AWS Firewall Manager、およびAWS Shield Advancedとどのように連携して動作しますか？
回答：API Gatewayは、開発者が任意のスケールでAPIを作成、公開、維持、監視、および保護することが容易になるようにする完全マネージドサービスです。AWS WAF、AWS Firewall Manager、およびAWS Shield Advancedと連携して、一般的なWeb攻撃やDDoS攻撃から保護を提供します。

# 2. API Gatewayの利点は何ですか？
回答：API Gatewayには、APIの簡単な作成、管理、および展開、他のAWSサービスとのシームレスな統合、APIトラフィックの自動スケーリング、および組み込みのセキュリティ機能など、さまざまな利点があります。

# 3. API Gatewayを設定する方法は？
回答：API Gatewayを設定するには、APIを作成し、リソースとメソッドを定義し、バックエンドサービスとの統合を設定し、セキュリティとスロットリングの設定を構成する必要があります。 AWS Management Console、AWS CLI、またはAWS SDKを使用して、API Gatewayを設定できます。

# 4. API Gatewayをカスタムドメイン名と使用できますか？
回答：はい、API Gatewayでカスタムドメイン名を使用できます。API Gatewayが提供するデフォルトのドメイン名を使用するか、カスタムドメイン名とSSL / TLS証明書を設定して、独自のドメイン名を使用することができます。

# 5. API Gatewayは認証と承認をどのように処理しますか？
回答：API Gatewayは、AWS Identity and Access Management（IAM）、Amazon Cognito、およびカスタムオーソライザーなど、認証と承認のさまざまなオプションを提供します。これらのオプションを使用して、APIおよびリソースへのアクセスを制御することができます。
[AWS Q&A 365][WAF]Daily Five Common Questions #29

# 1. What is API Gateway and how does it work with AWS WAF, AWS Firewall Manager, and AWS Shield Advanced? 
Answer: API Gateway is a fully managed service that makes it easy for developers to create, publish, maintain, monitor, and secure APIs at any scale. It works with AWS WAF, AWS Firewall Manager, and AWS Shield Advanced to provide protection against common web exploits and DDoS attacks. 

# 2. What are the benefits of using API Gateway? 
Answer: API Gateway provides various benefits such as easy API creation, management, and deployment, seamless integration with other AWS services, automatic scaling of API traffic, and built-in security features. 

# 3. How do I set up API Gateway? 
Answer: To set up API Gateway, you need to create an API, define resources and methods, set up integrations with backend services, and configure security and throttling settings. You can use the AWS Management Console, AWS CLI, or AWS SDKs to set up API Gateway. 

# 4. Can I use API Gateway with custom domain names? 
Answer: Yes, you can use custom domain names with API Gateway. You can either use the default domain name provided by API Gateway or use your own domain name by setting up a custom domain name and SSL/TLS certificate. 

# 5. How does API Gateway handle authentication and authorization? 
Answer: API Gateway provides various options for authentication and authorization such as AWS Identity and Access Management (IAM), Amazon Cognito, and custom authorizers. You can use these options to control access to your APIs and resources.
文学部卒社会人が大学院で人工知能研究に挑戦〜はじまり〜

# はじめに
　文学部卒のド文系の社会人ですが、仕事の関係で地域でのAI利活用を進めるプロジェクトにアサインされてしまいました。AIを活用したサービスなどは日ごろの生活なかで触れるものについてはなんとなくわかるものの、どのような仕組みで成り立っているのかは詳しくはわからない状態でした。
　過去3ヶ月間のPythonプログラミング講座に励んだだけでしたが、会社の支援が得られることもあり、もっと学んでみたいという軽いノリで大学院に入学してしまいました。
（仕事をしながら平日夜間と土曜日に授業をうけ、2年で卒業の予定です。）

　自身の復習はもちろん、この軌跡がこれから同様の経験をする人や検討されている方々の参考になればと考えて記録をすることにしました。
また、仕事をしながら家庭と勉学を両立させてサイクルをうまく回せるのかという意味でも参考となればと思っています。
※量や質を抑えてでも記録の継続を優先するスタンスでいこうと思います

## 本人バックグラウンド・スペック等
- 経歴：私大文学部卒（社会学専攻）＝　文学学士
    - 高校での数学Ⅲ・Cの履修なし（関連の数式の記号の意味すらよく分からないレベル）
    - Ⅲ・C以前に数学はいつも赤点をギリギリ免れるレベルだったため、高校数学からして怪しい感じ
- 職歴：通信キャリア勤務、社会人歴１０年（営業職）
    - 職業柄ICT関連の知識は一般的な社会人よりはあります※もちろんエンジニアや理系卒の詳しい人未満の知識
    - 感覚任せのデータサイエンスとは程遠い脳筋の営業スタイルが特徴
- 家庭：妻と息子（もうすぐ2歳）
    - 妻もバリバリ仕事したい派なので家庭へのコミットは重要となります
- その他：小学校から社会人になってもサッカーを継続
    - 仕事以外の題材での技術活用としてはサッカーネタが多めになるかもしれません

## ライフサイクル等

### ⚫︎１日の感じ（平日）
07時：起床、息子ご飯〜保育園送り
08時：業務開始
18時：業務終了、息子保育園迎え〜ご飯
19時：授業開始
20時半：授業終了、息子お風呂手伝い〜寝かしつけ
21時半：自由時間

### ⚫︎時間割（春学期）
- 月：①人工知能社会実装
- 火：②機械学習（概要）
- 水：③Python（入門）
- 木：なし
- 金：④データサイエンス（概要）⑤人工知能（概要）
- 土：⑥数理科学（入門）、⑦⑧機械学習演習（入門）
- 日：なし


## その他
 入学式とオリエンテーションに参加しました。当然ですが、文系社会人は少数派です。他に社会人がいても基本的には現業でデータ分析など関連業務を行っているような方達であるため、間違いなく最下層でしょう（泣）
 ですが、現業でビジネスを作ってきた私には社会実装などきっと強い部分もあるはずだと信じて前向きに頑張っていきます。

上級者の方はご指導お願いします！
初級者の方は支え合って一緒に頑張りましょう！

それでは！！
インスタンス最適化におけるややこしい用語達

## はじめに
SOAを勉強する中で、インスタンスのコスト最適化におけるベストプラクティスの問題を解く際、内容が似た用語に躓いたので調べてみました。

### 記事の目的

インスタンスのコスト削減に使われる用語がなんとなく理解でき、思い出せるように図を多めで書きました。

これらを理解する上で意識するべきは、「適用範囲」「柔軟性」「割引率」です。

## 具体的に
### AWS Compute Savings Plans

1年から3年という長期において1時間あたりの使用料を先に支払うことで割引を得られるプランです。
設定した金額が1時間内で超過した場合は、オンデマンドの料金で請求されます。

簡単な例を見てみましょう。
先に支払う設定を
1時間あたり20ドル。1年間とします。
この時の割引は5割とします。

ここで、以下のインスタンスを3つ作成します。（内容は分かり易いように適当にしています）
OS:Amazon Linux2
インスタンスファミリー:t2.micro
料金:10ドル/1h

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/c7813286-f3f7-0d7f-11a5-65af5f3daddc.png)


普通はこれを1時間起動させると10ドルx3個で30ドルの請求が発生します。

但し、今回はCompute Savings Plansを設定していますので、
1時間のうち20$分は5割の割引が適用されます。
そのため以下のように割引が適用されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/8c0d9faa-0e5e-aded-a4ef-ada5eb67cc38.png)


20ドル分のインスタンスには5割引が適用され、残りの10ドル分はそのままという形です。
合計は5+5+10で20ドルになり、オンデマンドの料金に比べると10ドルお得です。

では元々1時間で30$分の割引にすればもっと得するじゃないかと思いますが、
仮に1時間に1つのインスタンしか立ち上げない時間があると、10$分の割引(先払い分)が損となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/1c0a6ad9-8732-8428-65de-a8987aa145c6.png)

### リザーブドインスタンスとの違い

ここで間違いやすいのが、リザーブドインスタンスとの違いです。

リザーブドインスタンスでは、インスタンスファミリー、リージョン、OSを先に決めて1年 or 3年契約することで割引を受けられます。インスタンスに対して先に料金を支払うので、インスタンスをいくら使用しても料金が追加されることはありません。

ここで決めたインスタンス、リージョンについては後から変更はできません。
（ただし、コンバーチブルリザーブドの場合は上記の変更も可能になる。もちろん割引率は減ってしまう。）

図にするとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/bed0f0fe-d2e1-abd6-08ef-cf6a440f68f5.png)


適用範囲、柔軟性、割引率の観点で見るとこのような感じになります。

|  | Compute Saving | リザーブド |
| --- | --- | --- |
| 適用範囲 | 広い | 狭い |
| 柔軟性 | 高い | 低い |
| 割引率 | 普通 | 高い |

### ****EC2 Instance Savings Plans****

Compute Savings Plansに似ていますが、こちらはインスタンスファミリーのみに適用されるパターンです。

例えば、
Amazon Linux のt2.microから Windowsのt2.microに変更しても割引は適用されます。
Amazon Linux のt2.microから Windowsのm5a.xlargeに変更すると割引は適用されません。

Compute Savings Plansに比べてインスタンスファミリーという限定されたものに条件をつけることでさらに割引が大きくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/880800/e4537ad6-d692-693d-bf91-aae52b6c32b9.png)

## まとめ
全体を通して、条件を厳しくすればするほど割引率が上がるという感じです。

重要なのは各プランを網羅的に理解するのではなくしっかり要件を定義、理解してその上でコスト削減を行う際に、そういえばこんなプランあったな〜と思い出せることが大切かと思います。

でも資格試験では覚えておかないといけないですが…
間違っている等あればご指摘下さい。
量子化学計算の結果をparseしたい

# はじめに
量子化学計算は化合物の物性や化学反応を解析するために広く使われています。
多くの計算用パッケージが公開されていますが、```Gaussian```を用いて計算をされている方がほとんどだと思います。
しかし、```Gaussian```のlogファイルの中身は少し読みづらく、ほしい情報を引き出すためにファイル処理用のスクリプトを用意しなければなりません。
本記事ではPythonの```cclib```というライブラリを用いて、```Gaussian```をはじめとする量子化学計算ソフトの計算結果をparseする方法を記します。
cclibのgithubリンクは[こちら](https://github.com/cclib/cclib)です

## インストール方法
pipを用いて簡単にインストールすることができます。
```python
pip install cclib
```

## 使い方
```python:読み込み
import cclib

filename = "gaussian.log"
data = cclib.io.ccread(filename)
```
これでdataにlogファイルの情報を格納します。
```python:計算結果のparse例
#原子数
natom = data.natom
#電子数
nelectrons = data.nelectrons
#基底関数の数
nbasis = data.nbasis
#原子の電荷
atom_charges = data.atomcharges
#原子番号
atom_no = data.atomnos
#全体の電荷
mol_charge = data.charge
#最適化構造
converged_structure = data.converged_geometries
#エンタルピー
enthalpy=data.enthalpy
#エントロピー
entropy = data.entropy
#自由エネルギー
free_energy = data.freeenergy
#ゼロ点振動エネルギー
zpve = data.zpve
#gradient
grad = data.grad
```
取得できる結果は計算手法や計算ソフトによって異なります。
詳しい解説は[こちら](https://cclib.github.io/data.html)にあります。
鋭意開発中みたいなので今後の発展に期待です。


## 最後に
```cclib```を用いることで簡単に計算結果を取得することができるようになります。
研究室内で車輪の再開発を防ぐためにもぜひご利用ください。
ちなみに、筆者が```cclib```について知ったきっかけは```chatGPT(GPT-4)```でした。
chatGPTが出してきたときはそんなライブラリないだろうと思っていたのですが、実際にあったので驚きました。
これからはググるではなくジピる(chatGPTに聞くこと)が一般的な世界になるのかなと思いました。
ローカルとリモートのブランチを削除する方法

業務でローカルとリモートのブランチの削除を行ったため、備忘録として残します。

# ローカルのブランチ削除方法
```
①　削除対象外のブランチに移動する。
git checkout <ブランチ名>

②　以下のコマンドを実行
git branch -d <削除したいブランチ名>

```

# リモートのブランチ削除方法
```
git push --delete origin <削除したいブランチ名>
```
Go言語における競合状態（Race Condition）の理解と対処法

## はじめに
Go言語（golang）は並行処理を簡単に扱えることで有名ですが、その分、競合状態（race condition）に注意する必要があります。
Go言語での競合状態を具体的なサンプルコードを用いて解説し、その対処法について説明します。

## 競合状態（Race Condition）とは？
競合状態は、複数の並行処理が同時に共有データにアクセスする際に発生する可能性があり、これが原因で不具合や意図しない動作が発生することがあります。

例えば、下記の競合状態です。
```go
package main

import (
	"fmt"
	"sync"
)

var sharedCounter int

func main() {
	wg := &sync.WaitGroup{}
	mu := &sync.Mutex{}

	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()

			mu.Lock() // コメントアウトして、競合状態を発生させる
			value := sharedCounter
			value++
			sharedCounter = value
			mu.Unlock() // コメントアウトして、競合状態を発生させる
		}()
	}

	wg.Wait()
	fmt.Println("sharedCounter:", sharedCounter)
}
```

`sharedCounter`という共有変数に1000個のゴルーチンがアクセスし、インクリメント操作を行います。`sync.Mutex`を使ってアクセスをロックしていますが、`mu.Lock()`と`mu.Unlock()`の行をコメントアウトすると、競合状態が発生します。

## 競合状態の発生理由
競合状態が発生する理由は、複数のゴルーチンが同時に`sharedCounter`にアクセスし、その値を読み書きしているためです。これにより、一部のインクリメントが上書きされ、期待した結果と異なるカウント値が出力されることがあります。

## 対処法
競合状態を回避する方法として、`sync.Mutex`を使用して、同時に共有データにアクセスすることを制限します。この例では、`mu.Lock()`でロックを取得し、`mu.Unlock()`でロックを解放しています。これにより、一度に1つのゴルーチンだけが共有データにアクセスでき、競合状態が回避されます。

## その他の対処法
競合状態への対処法としては、`sync.Mutex`の他にも、`sync.RWMutex`（読み込み専用のロックを許可）やチャネルを使用する方法もあります。チャネルは、ゴルーチン間でデータの送受信を行う仕組みで、明示的なロックを使わずに競合状態を回避できる場合があります。

```go
package main

import (
	"fmt"
	"sync"
)

var sharedCounter int

func incrementCounter(wg *sync.WaitGroup, ch chan<- int) {
	defer wg.Done()

	ch <- 1
}

func main() {
	wg := &sync.WaitGroup{}
	ch := make(chan int, 1000)

	go func() {
		for i := 0; i < 1000; i++ {
			wg.Add(1)
			go incrementCounter(wg, ch)
		}
		wg.Wait()
		close(ch)
	}()

	for value := range ch {
		sharedCounter += value
	}

	fmt.Println("sharedCounter:", sharedCounter)
}
```

このコードでは、1000個のゴルーチンがチャネル`ch`に1を送信し、メインゴルーチンがチャネルから受信して`sharedCounter`をインクリメントします。この方法では、競合状態が発生せず、期待通りの結果が得られます。

## 競合状態の検出
Go言語には、競合状態を検出するためのツール`go run -race`が付属しています。このツールを使うことで、コード内の競合状態を検出し、修正することができます。

## まとめ
Go言語での競合状態は、複数のゴルーチンが同時に共有データにアクセスする際に注意が必要です。対処法としては、`sync.Mutex`やチャネルを利用することで、競合状態を回避できます。また、`go run -race`を用いることで、競合状態を検出しやすくなります。これらの手法を使って、安全な並行処理を実現しましょう。

https://www.educative.io/answers/what-are-race-conditions-in-golang

https://betterprogramming.pub/how-to-avoid-race-conditions-in-golang-5e343146ed61

https://go.dev/doc/articles/race_detector
超初心者向け Pythonコードの書き方 パイソンの基礎を学ぶ 3

関数
引数
複数の引数
引数の初期値
名前を受け取る
出す手を選べるようにする
戻り値
returnの性質

## 関数
### 関数
関数とは、ある処理をまとめたプログラムの塊で、`print`も関数の1つ。
関数は`def 関数名():`のように定義する。
関数の処理の内容は、インデントして書いていく。

```python:例
def hello():
    print('Hello World')
```

`関数名()`のように`()`をつけて呼び出します。
```python:例
def hello():
    print('Hello World')

hello()
```
```text:出力結果
Hello World
```

### 引数
関数を呼び出す際に、関数に値を渡すことができる。
この値のことを引数といい、引数を渡すと関数の中でその値を利用することができるようになる。
関数に引数を渡すために関数の定義部分で、引数を受け取る変数`仮引数`を指定する。

```python:例
def 関数名(仮引数):
    実行する処理
```
```python:例
def hello(name):
    print('Hello', name)
```

関数に引数を渡すには、`関数名(引数)`として関数を呼び出す。渡された引数は、関数の仮引数に代入され、その値を関数の処理の中で用いることができる。

```python:例
def hello(name):
    print('Hello', name)

hello('John')
hello('Kate')
```
```text:出力結果
Hello John
Hello Kate
```
変数には、その変数が使える範囲が存在する。その範囲のことを`スコープ`と呼ぶ。その変数を関数の外で使うことはできない。

### 複数の引数
仮引数を`,`で区切って引数を複数渡すこともできる。

```python:例
def hello(name, message):
    print(name + 'さん、　' + message)
```

```python:例
def hello(name, message):
    print(name + 'さん、　' + message)

hello('John', 'こんにちは')
```
```text:出力結果
Johnさん、　こんにちは
```

#### 引数の初期値
引数には初期値を設定することもでき、初期値が与えられていれば代わりの値として初期値が使われる。

```python:例
def hello(name, message='こんにちは'):
    print(name + 'さん、　' + message)

hello('John', 'こんばんは')
hello('Kate')
```
```text:出力結果
Johnさん、　こんばんは
Kateさん、こんにちは
```

#### 戻り値
戻り値を使うと関数の結果によって処理を変えることができる。

下記の例では、関数validateは`1`を受け取ると、処理結果の`True`を呼び出し元に返す。この`True`にあたるのが戻り値。`return 戻り値`と書くことで戻り値を呼び出し元に返すことができる。

```python:例
def　validate(hand)
    if hand < 0 or hand > 2:
        return Fales
    else:
        return True
```

編集中。。。　under construction
Googleデータアナリティクス：複数のソースからのデータクリーニング

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b583930d-fecb-13ad-85a2-3f44e309d8a5.png" width="800">

# 複数のソースからのデータクリーニング

データアナリストにとって 2 つ以上のソースから取得したデータを クリーニングすることは よくありますが、課題も伴います。 例として、組織合併を考えてみましょう。 

今回は、物流協会の例で どのような影響があるか見ていきましょう。 

- [国際物流協会の会員資格][1]
- [世界物流協会][2]

[1]:https://docs.google.com/spreadsheets/d/1lEntuIuojjjMPeV5JGzCsI4GFIh3gULxtbYEjwfGfQU/template/preview

[2]: https://docs.google.com/spreadsheets/d/13lamfXXEjcEaSuPVLjmT951PtiyDYH7RmyR04G2Xi0c/template/preview

このスプレッドシートには、 協会の会員 ID 番号、 氏名、住所、 各会員の会費納入額、 会員資格の有効期限、 会員種別が記載されています。 では、もし国際物流協会が 世界物流協会と一緒になることで e コマースの膨大な需要を満たすための 会員支援を行うことになった場合 どうなるでしょうか。 

まず、各組織が持っている すべてのデータを 統合する必要があります。 全く異なる 2 つのデータセットを 結合する場合、情報の矛盾や 不整合がほぼ確実に発生するため この作業は独特の難しさを伴います。 

- たとえば、世界物流協会の スプレッドシートでは、 番地を記載した列が 別々にあります。これに対して 国際物流協会では すべて住所としています。 これを修正し、住所欄の記載を 統一する必要があります。 
- 次に、世界物流協会では 会員 ID としてメールアドレスを 使用しているのに対し、 国際物流協会では数字を使用している点に 着目しましょう。 物流など、特定の業界に属する人は 通常、複数の専門団体に 加入していることがあるため これは大きな問題になります。 これらのデータセットには、 全く同じ人物の会員情報が 異なる表記で含まれている可能性が 非常に高く、そのためこうした重複を 削除することは非常に重要です。 
- また、国際物流協会には もう一方より多い会員種別があり「Student Associate」ではなく 「Young Professional」といった言葉を 使用しています。どちらも、まだ学校に通っているか、 あるいは卒業したばかりの 若手の会員を表しています。 この 2 つのデータセットを統合する場合、 2 つの団体が会員を全く異なる形で 表しているのを修正するために、 チームと協力する必要があります。 
- 組織の統合にはデータの統合が つきものであり、それが 厄介であることは お分かりいただけたかと思います。 データアナリストがデータセットを 統合する理由は他にもたくさんあります。 

データセットの統合は、冗長性を避け、 その互換性を確認するために、 必ず重要な問いかけをすることから 始める必要があります。 データアナリティクスにおける互換性とは 2 つ以上のデータセットがどの程度 うまく連携できるかを表すものです。 

私が最初に問いかけるのは 

- ***<font color="MediumVioletRed">「必要なデータはすべて揃っているか?」 </font>***

ということです。 顧客の購買に関するインサイトを 収集するために、私は顧客と 購入商品、購入場所に関する データがあるかを確認します。 

次に問いかけるのは

- ***<font color="MediumVioletRed">「これらのデータセットに 必要なデータがあるか？」</font>***

です。 これはデータセット全体を 分析的に検討することでもあります。 使用する前にデータに目を通すことで そのデータがどのようなものか、 スキーマはどのようなものか、 顧客の購買に関するインサイトに 関連しているか、 そしてクリーンであるかどうかを 把握できます。 

そこで、次の問いかけが出てきます。 

- ***<font color="MediumVioletRed">「データセットのクリーニングは 必要なのか、それともすぐに 使える状態なのか？」</font>***

複数のソースで作業しているので、 データセットが同じ基準をもって クリーニングされているかも自問します。 たとえば
- ***<font color="MediumVioletRed">「どのフィールドが規則的に 繰り返されているか？」</font>***
- ***<font color="MediumVioletRed">「欠落はどう処理されているか？」 </font>***
- ***<font color="MediumVioletRed">「データはどんな頻度で更新されたか？」 </font>***

これらの答えを見つけ プロジェクト開始時に問題点を 修正する必要があるか 把握することは、データ統合の 非常に重要なステップとなります。
ブラウザで画像がボケる時の対処法

## 画像を2倍ではなく、1.5倍で書き出す
なぜか大きすぎるとボケる謎。

## イラレで、X,Y軸、W,Hを整数値にして書き出す
画像自体がボケている場合に有効

## image-rendaringの値を変えてみる
CSSでimage-renderingが当たってないかチェック
PHP ロードバランサーを利用時のIPアドレスを取得する方法

```
<?php

namespace App\Libs\Server;

/**
 * サーバーの解析を担当
 */
class Analysis
{
    /**
     * アクセスユーザのIPアドレスを取得
     * ロードバランサー対応。
     */
    public static function getClientIpAddress() :string
    {
        $ip = '';
        if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
            $xForwardedFor = explode(",", $_SERVER['HTTP_X_FORWARDED_FOR']);
            if (!empty($xForwardedFor)) {
                $ip = trim($xForwardedFor[0]);
            }
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = (string)$_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
}
```
SQL Server Management Studioのコメントアウトのショートカット

**コメントアウト**
Ctrl + K → Ctrl + C (Ctrlは押しっぱなし)
**コメント解除**
Ctrl + K → Ctrl + U (Ctrlは押しっぱなし)
### 参考サイト
https://learn.microsoft.com/ja-jp/sql/ssms/sql-server-management-studio-keyboard-shortcuts?view=sql-server-ver16

https://gawa-blog.com/59/
AWS IAM

# 個人的リマインド用
参考
[くろかわこうへいのAWS講座IAM編#1【IAMロール、ポリシー、アクセスキー、ユーザー、グループ】](https://www.youtube.com/watch?v=uMB1toQ9Z7A)

## ルートユーザー
クレジットカード登録して作成したアカウント。振る権限を持ち、請求情報閲覧可能でパス変更が可能。これで作業してはいけない。

## IAMユーザー
ルートユーザーで作業しちゃダメだから、これを作って作業する。組織では管理者に作ってもらって、それで作業する。

### IAMユーザーの認証情報
作成する際にアクセスの種類のチャックボックスを選択する。
1.プログラムによるアクセス(アクセスキーID、シークレットアクセスキーの2種類が発行される。この情報があればどこからでもAWSが操作できる。これをGithubにpush使用ものなら、不正利用されて請求がエグいことになる)
2.AWSマネジメントコンソールへのアクセス(AWSの管理画面にログインすることを許可するためのパスワードを有効にする)

### IAMグループ
IAMグループは正式な「認証情報」ではない。複数のIAMユーザーのまとまりである。
複数のユーザーに1度に権限を付与できる便利なもの。ユーザーは複数のグループに所属できる。
IAMユーザーはそれぞれに認証情報を持っていて、認証情報にはパスワードかアクセスキー、もしくは両方を持つケースがある。

### IAM Policy
AWSで操作できる権限を表したもの。JSON形式で記述された設定ファイルで認証主体(プリンシパルともいうらしい)にアタッチして使用。
ポリシーは権限のこと？もとからある**AWS管理ポリシー**と自分で作る**カスタマー管理ポリシー**(より詳細に設定できて、自分でJSONを書き換える感じ)の2種類がある。

**ポリシーの流れ**
IAMユーザーやロールなどのPrincipalがAWSリソースなどの操作をリクエストする。そのリクエストをAWSがJSONのドキュメントとつきあわせて、許可されていないか、されているかを判断し、許可されていたらprincipalが出したリクエストを許可する。(例：EC2インスタンスをデリートするとかストップするとか)

詳細：


### IAM ロール
ポリシーを複数アタッチして権限をひとまとめにしたもの。
ロールにはポリシーをアタッチすることが出来る。
信頼関係(誰がこのロールにスイッチできるのか)と権限(このロールで何ができるのか)の2つがあるらしい
Stormworksでノイズフィルタを作成してみる

# はじめに
本記事はStormworksやLua，および数学に対し簡単な理解がある方に向けた記事です．初歩的なLuaについては同じQiita内で[yukimaru73](https://qiita.com/yukimaru73)氏や[零時 秋雨](https://qiita.com/akisame_rage)氏が初心者向けの記事を書いておられますので，そちらをご覧ください．数式等についても極力難しい表現を避けるようにしているつもりです．
Stormworksのレーダーはノイズを多分に含んでおり，これは距離に対して±1%，方位に対して±0.02π[rad]であることがわかっています([参考](https://docs.google.com/spreadsheets/d/1D2BunHQygAc63XtP5GeSYbf7me8dArpElxwSWWWHvo8/edit?usp=sharing))．本記事では，移動平均フィルタ(MAF)，一次遅れローパスフィルタ(LPF)の2種類を紹介します．

# 移動平均フィルタ
原始的なノイズフィルタの一つに，移動平均フィルタ(MAF)があります．これは，過去から現在までのある一定期間のデータの単純平均を取りフィルタリングを行うものです．例えば，"ある一定期間"が過去2tickの場合を考え，以下のようなデータが得られていたとします．

|時刻|n-2|n-1|n|
|:-:|:-:|:-:|:-:|
|データ|4|2|3|

ここで，これらの単純平均は
```math
\frac{4+2+3}{3} = 3
```
となります．しかし，実際のデータは刻々と(Stormworksでは1秒間に60回)変化していて，これまでのデータを記憶しておかないと平均を取ることが出来ません．そこで，いくつかのデータを配列に保存し，それらの単純平均を取るプログラムを書けば，MAFの完成ということになります．擬似コードは以下のとおりです．

1. 記憶するのは過去n回分
1. 配列にデータを格納する
1. もし配列がnより大きかったら，一番古い要素を削除
1. 配列内の数字の総和を求め，要素数で割る

以上の動作を毎tick行う(onTick内に記述する)ことができれば問題ありません．しかし，このフィルタには弱点があり，それが遅延です．以下の画像では過去30tick分の単純平均を取っていますが，ある程度の遅延が生じてしまっています．加えて，参照するデータが多いほど配列も大きくなってしまい，負荷も多少大きくなります．
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330654/88a4d7aa-98bc-ec70-f948-63d1f60a2fed.png">

# ローパスフィルタ
ローパスフィルタ(LPF)はMAFと比べるとアドバンスなフィルタですが，それでも仕組みは単純です．ローパスフィルタの考え方は以下のような式(**LPF方程式**と呼ぶことにします)で表されることが多いです．

```math
Out[n] = (1-2k)Out[n-1] + k(In[n] + In[n-1])
```

Outは出力値，Inは入力値，nは今回，n-1は前回という意味です．つまり，上式の意味するところは，

```math
今回出力値 = (1-2k) \times 前回出力値 + k \times (今回入力値 + 前回入力値)
```

となります．今回出力値がフィルタリングされたデータとなります．また，kは0~1の範囲で，小さければ小さいほどフィルタの効果が大きくなり，遅延も大きくなります．擬似コードは以下の通りです．

1. kを設定する
1. **前回出力値と前回入力値を初期化する**
1. LPF方程式を適用する
1. 前回出力値と前回入力値をバッファに記憶する

:::note warn
2.の処理に注意
:::
3.と4.の動作を毎tick行う(onTick内に記述する)ことができれば問題ありませんが，特に2.については注意してください．ここでの初期化とは，onTick外で適当な数値を代入しておくことを表します．このコードを実行した最初のtickにコンピュータがこの処理を行ったときに，「前回出力値や前回入力値が存在しない」という問題が生じます．これを解決するのが変数の初期化です．また，このフィルタにはMAF同様遅延がありますが，それでも配列を使用せず直近の数値のみでフィルタリングを行うため，MAFに比べると動作は軽量です．

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330654/66bd05e3-adfd-7600-1c83-ae99add1cf54.png">

# さいごに
今回紹介したフィルタの他にも，α-βフィルタやカルマンフィルタといたより高度な(高性能な)フィルタもありますが，今回はあくまで初心者向けの解説ということで原始的なフィルタの紹介をしました．何かわからないことや，間違っていると思われる部分があればコメントをしてくだされば分かる範囲で対応します．
Pandasによる日付の計算

Pythonで日付の計算はほかの言語と比較してライブラリー多く存在するため、ローカルルール部分があるので、使う時に注意が必要
主にPure Pythonで使い場合とPandasで使う場合が多いので、この章はPandasでまとめたい。
ただし、すべて賄うことは無理なので、とりあえず、よく使われるもののみ取り上げる

### タイムスタンプの生成
```Python
import pandas as pd

# pandasから直接生成する場合
# 任意の日付/時刻を表すオブジェクトを生成します。
res_01 = pd.Timestamp('1900/1/1 01:01:01.123456')
# タイムスタンプを生成する（date + time)
print(type(res_01))
print(res_01)
# 直接シリアル値への変換は不可（下記はエラーとなる）
# print(str(int(res_01)))
```
```
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
1900-01-01 01:01:01.123456
```
### タイムスタンプ(本日は指定する場合)
```python
# タイムスタンプ(本日は指定する場合)
res_02 = pd.Timestamp.today()
print(res_02)

# dateのみ取得
res_03 = pd.Timestamp.today().date()
print(res_03)

# timeのみ取得
res_04 = pd.Timestamp.today().time()
print(res_04)
```
```
2023-04-14 11:09:37.108559
2023-04-14
11:09:37.108559
```
### 時間をずらす場合
```python
# 時間をずらす場合(3日前)
base_day = pd.Timestamp.today().date() - pd.Timedelta(days=3)
print(base_day)

# 時間をずらす場合(3日後)
base_day = pd.Timestamp.today().date() + pd.Timedelta(days=3)
print(base_day)
```
```
2023-04-11
2023-04-17
```
### リスト生成する場合
```python
# リスト生成する場合(月末の日がセットされる)
list_day = pd.date_range('2022/04/01','2023/03/31',freq='M')
print(list_day)
for li in list_day:
    # タイムスタンプ
    print(li)
    # 日付のみ
    print(li.date())
    # 文字列型変換
    print(li.strftime('%Y-%m-%d'))
    break

# リスト生成する場合(月始めの日がセットされる)
list_day = pd.date_range('2022/04/01','2023/03/31',freq='MS')
print(list_day)
```
※DBへ書き出しする場合、str型またはタイムスタンプ型なのかによってSQL文検索結果が変わる場合があり、<b>気をつける必要！</b>
※DBから読み込みだとobject型であれば、タイムスタンプへの変換が必要（または読み込み時に指定する方法もある）
```
DatetimeIndex(['2022-04-30', '2022-05-31', '2022-06-30', '2022-07-31',
               '2022-08-31', '2022-09-30', '2022-10-31', '2022-11-30',
               '2022-12-31', '2023-01-31', '2023-02-28', '2023-03-31'],
              dtype='datetime64[ns]', freq='M')
2022-04-30 00:00:00
2022-04-30
2022-04-30
DatetimeIndex(['2022-04-01', '2022-05-01', '2022-06-01', '2022-07-01',
               '2022-08-01', '2022-09-01', '2022-10-01', '2022-11-01',
               '2022-12-01', '2023-01-01', '2023-02-01', '2023-03-01'],
              dtype='datetime64[ns]', freq='MS')
```
三点リーダーまとめ

# はじめに

アウトプットの練習のために投稿してみました！

三点リーダーを自分なりにまとめてみましたので間違ったところなどがあれば、どんどん指摘お願いします。(間違い多いと思いますが、優しくお願いします。。。)

---

## [参考コード](https://codesandbox.io/s/suspicious-gauss-w0nqre?file=/src)

- codesandbox で demo を書いて見ました。

---

## 一行の時の三点リーダー(詳しくが上記の参考コードの[FirstLine](https://codesandbox.io/s/suspicious-gauss-w0nqre?file=/src/FirstLine.tsx) を見てください。)

- 一行の際の三点リーダー

```html
<div className="normal">
  この文章は三点リーダーを試すものです。この文章は三点リーダーを試すものです。この文章は三点リーダーを試すものです。この文章は三点リーダーを試すものです。この文章は三点リーダーを試すものです。この文章は三点リーダーを試すものです。
</div>
```

```css
/* はみだし部分の隠す。 */
overflow: hidden;
/* 省略部分の省略記号を設定する。 */
text-overflow: ellipsis;
/* 一行で書くため、折り返さないようにする。 */
white-space: nowrap;
```

---

## 複数の時の三点リーダー(詳しくが上記の参考コードの[MultipleLine](https://codesandbox.io/s/suspicious-gauss-w0nqre?file=/src/MultipleLine.tsx) を見てください。)

- 複数の時は webkit を使用する。

```css
/* はみだし部分の隠す。 */
overflow: hidden;
/* -webkit-boxに指定 */
display: -webkit-box;
-webkit-box-orient: vertical;
/* 行数 */
-webkit-line-clamp: 3;
```

---

## min-width:0 の三点リーダー(詳しくが上記の参考コードの[MinWidth](https://codesandbox.io/s/suspicious-gauss-w0nqre?file=/src/MinWidth.tsx) を見てください。)

- flex、grid 等で自動的に幅が確保されてはみ出してしまう時に使用する。

---

## まとめ

- 基本的にブロック要素に使用する。
- 先頭だけ、後ろだけを三点リーダーする時は、width を当てる方が良さそう。
- 複数行の時は webkit を使用する。(色々変化はありそう。)
- min-width: 0 は flex がネストした時やはみ出してしまう時に使用する。
B2C Commerce のその他 Salesforce 製品との接続 - B2C-CRM-SYNC


※ これから記載する事項は、私が所属する会社とは切関係のない事柄です。


今回は[「B2C Commerce のその他 Salesforce 製品との接続」シリーズ](https://qiita.com/syunyama/items/366fcbc315be5e5c252f)として B2C Commerce と Salesforce Platform との間で顧客データをやり取りする方法について紹介したいと思います。

![Cross Cloud (8) (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/d7b278a3-b0e1-01f2-d1c1-6f878acc6deb.jpeg)



## 接続内容とポイント

基本的な内容は以前作成した記事「[Salesforce B2C CommerceのB2C CRM Sync(機能内容編)](https://qiita.com/syunyama/items/75d5c15a968bce8a076a)」をご覧ください。ここでは記事作成時から追加された機能紹介します。

Salesforce Platform 上から顧客のパスワードリセットが行える
![スクリーンショット 2023-04-07 16.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/202004e0-6cd4-90c1-5f95-9f78e3d5d7b3.png)



B2C Commerce のプロモーション情報を Salesforce Platform 上から確認できる
![スクリーンショット 2023-04-07 16.25.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/a54ebe6e-01e7-7169-4fcc-0819c09ee6d5.png)




## 接続方法

接続方法は以前作成した記事「[Salesforce B2C CommerceのB2C CRM Sync(実装手順編)](https://qiita.com/syunyama/items/b0c92a21ae90f5481fac)」をご覧ください。



## 接続データとポイント

* B2C Commerce とSalesforce Platform のオブジェクトのマッピングについては Github の「[Data mapping between B2C Commerce and the Core Platform](https://github.com/SalesforceCommerceCloud/b2c-crm-sync#data-mapping-between-b2c-commerce-and-the-core-platform)」をご覧ください
* 取引先として「取引先・取引先責任者（base）」か「個人取引先（personaccounts）」を選択することができます
* すでに顧客データが存在していた場合に重複を防ぐために重複ルールを利用します（「[Create and Deploy Your Duplicate Rules](https://github.com/SalesforceCommerceCloud/b2c-crm-sync#create-and-deploy-your-duplicate-rules)」参照）



## リソース

* [CRM Sync の Github](https://github.com/SalesforceCommerceCloud/b2c-crm-sync)
* [CRM Sync のポータル](https://salesforcecommercecloud.github.io/b2c-crm-sync/)
GitLabでSSH接続し、かつ、リポジトリごとにSSHの鍵を変える、そしてWSLのなかでやる

プライベートでも開発をしたりしていると、会社とプライベートで GitHub などのアカウントを使い分けたくなります。ぼくは結構プライベートアカウントで仕事の開発もしてしまっていたんですが、あまりよくないので、重い腰を上げてユーザを切り変えることにしました。SSH でアクセスしているので SSH の鍵をリポジトリ事に替えることがゴールです。

実は GitHub でそれをやる記事は既にたくさんあって、 *GitLab であってもやり方は GitHub と別に変わらない* ですけれど、こういう記事はなんぼあってもいいですからね。

# キーを作成して両方に配置

SSH のキーペアを作って、公開鍵を GitLab に登録します（キーの作り方とか形式がいろいろありますが、今回は pem で置きました）。

## ローカルに秘密鍵をおく

秘密鍵はローカルに置きます。WSL を使っているひとは（ぼくですが）、Windows のユーザホームと WSL のユーザホームと違うところにあるので間違えないようにしましょう。ただコピーして置いただけだとパーミションがゆるゆるなので

```
Permissions 0644 for 'sample_key.pem' are too open.
```

みたいにおこられます。なので、

```
chmod 600 ~/.ssh/sample_key.pem
```

しておきましょう。

## GitLab に公開鍵をおく

設定は、ユーザ設定のここです。

![screencapture-gitlab-profile-keys-2023-04-14-10_45_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16728/08ff4abb-1962-7de9-1b3e-979d23240c1d.png)

上のキーの所に ssh-rsa とかではじまる公開鍵を登録します。「-----BEGIN PUBLIC KEY-----」みたいなヘッダ付きのフォーマット（このへんがよくわかってないが、ssh-rsa ではじまるのは OPENSSH の形式の一つ……で良いのかな……）は読んでくれません。読んでくれても良いのにね。


## リポジトリごとの設定を作成

~/.ssh/config を編集します。

```
Host gitlab-main
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/key_main.pem
    TCPKeepAlive yes
    IdentitiesOnly yes
Host gitlab-sub
    HostName gitlab.com
    User git
    IdentityFile ~/.ssh/key_sub.pem
    TCPKeepAlive yes
    IdentitiesOnly yes
```

GitLab のリモートURLって（GitHubもそうですが）こういう形式していると思いますが、これ謎だったんですよね。

```
git@gitlab.com:[group-name]/[repository-name].git
```

git@gitlab.com ってなんだ？ gitじゃなくて自分のユーザ名じゃ無くて良いのか、と思ってたんですが、git が便宜的にユーザ名になっているので普通に正しいみたいですね。ここはいまだにどういう理屈でこうなってるのかよくわかりません。

で　gitlab.com のところは、ホスト名で、実際のホスト名というかホスト設定名がきます。なので上の設定だと

```
git@gitlab-sub:[group-name]/[repository-name].git
```

こうなるようです。すでにクローンしてしまってるリポジトリであれば、リモートリポジトリのURLを変更しましょう。

## ユーザをリポジトリ事に設定

さいごに、このリポジトリアクセス時に使うユーザ名をリポジトリに設定します。これはこれで必要みたいですね。リポジトリのルートでやりましょう。

```
git config --local user.name [user-name]
git config --local user.email [user-mail-address]
```
Googleデータアナリティクス：データクリーニング（ダーティデータ）

# はじめに

本記事は、Googleデータアナリティクスのプロフェッショナル認定証のプログラムより、参照させて頂いています。興味を持った方は、是非受講してみてください。

https://www.coursera.org/professional-certificates/data-analytics-japanese

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b583930d-fecb-13ad-85a2-3f44e309d8a5.png" width="800">

# データクリーニングをしましょう

不正確、不適切なデータで企業が毎年 どれほど損失を出しているかご存じですか？  

***『IBM によると 質の悪いデータのコストは、米国だけで 年間 3 兆 1,000 億ドルにのぼるそうです。 』***

では、データの質を低下させる 原因の第 1 位は何だと思いますか？

それは、新しいシステムの導入でも コンピュータの技術的不具合でもありません。 

***『最も一般的な要因は、実は ヒューマンエラーなのです。 』***

# ダーティデータの例

***<font color="MediumVioletRed">『ダーティデータは、不完全で不正確、 または解決したい課題とは 無関係なデータ』</font>***

### <font color="MediumBlue">データの一部の誤入力</font>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/02952236-02af-b243-8be2-6ff12832254a.png" width="700">

### <font color="MediumBlue">一貫性のないフォーマット</font>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3b072952-0c5d-13d9-f6b5-ffcf78c02d01.png" width="700">

### <font color="MediumBlue">空白のフィールド</font>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/77d4cd1c-89f7-d699-3c8e-91cf7ebf43ea.png" width="700">

### <font color="MediumBlue">同じデータを複数回入力して生じる 重複</font>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/f00ff0a3-0fc9-5f87-cf27-c59651db7136.png" width="700">

ダーティデータで作業してしまうと 結果が正しいかどうかわからなくなります。 むしろ、間違っていると言えるかもしれません。 信頼性の高いデータ分析結果を 得るためにはデータ完全性が 重要であり、データ完全性には クリーンなデータが必要です。クリーンなデータで作業すれば プロジェクトはよりスムーズに進むでしょう。

***<font color="MediumVioletRed">『クリーンなデータは、完全かつ正確で、 解決したい課題に関連したデータ』</font>***


効果的な分析には クリーンなデータが重要です。 表計算ソフトやデータベースで データの入力が間違っていたり 重複して入力されていたり フィールドが空白になっていたり データ フォーマットに一貫性が なかったりすると、結果的に ダーティなデータになってしまいます。 小さなミスが、最終的には 大きな問題につながります。 

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/b3cc0340-5c4f-7a8b-84db-9f65f34266e5.png" width="700">

:::note warn
クリーンデータは、スペルや 句読点のガイドラインなど、 組織にあるデータ完全性のルールに 大きく左右されます。 例えば、ある飲料メーカーでは データベースで作業する全員に 容量に関するデータをカップではなく オンスで入力するよう指示するかもしれません。 ルールがあれば、データクリーニングの 手間を省くことができ、非常に便利です。 しかしそれでも、完全にエラーを 削除することはできません。 ヒューマンエラーの可能性は常にあります。
:::

:::note warn
不要なデータを削除する前に、 必ずデータセットのコピーを 取っておくとよいでしょう。 そうすれば、将来的に必要なデータを 削除したとしても、すぐにアクセスして データセットに戻すこともできます。 
:::

:::note warn
データクリーニングを効率化するのに大事なことは、もとのデータ格納場所でデータをクリーニングすることです。それにより、何度もプロセスを繰り返す必要がなくなり、チーム全体の効率化を図ることができます。たとえば、特定のフォルダーに保存されているスプレッドシート ファイルの単語数をカウントするプログラミング スクリプトを作成するなどです。データが格納されている場所で使えるツールを活用すれば、クリーニングの手順を繰り返す必要がなく、チームの時間とエネルギーを節約することができます。   
:::
角度の平均の計算方法

角度の平均を計算するためにはオイラー角を使うのではなくクオータニオンでやると良い。

```
protocol QuaternionProtocol {
    var quaternion: simd_quatd { get }
}

extension Collection where Element: QuaternionProtocol {
    func average() -> simd_quatd {
        self.map {
            $0.quaternion}.reduce(simd_quatd(ix: 0,iy: 0,iz: 0,r: 0),+).normalized
        
    }
}

```

気持ちの説明

矢印が複数あるとして、それらの角度の平均を計算したいなら、それらを数珠つなぎにして最初と最後の点を結んだ矢印の角度を測ればいい。

simd_quatd = 矢印

Reduce + = 全部足す

Normalized = 矢印の長さが１になるように拡大縮小

1の長さの矢印をオイラー角に変換する。


オイラー角ではなくクオータニオン計算すると何がいいのか？

オイラー角で計算すると、 360度をまたいだときに面倒。（ジンバルロック）
並列に計算できない。
誤差が大きい。

オイラー角でのコード　長いのがわかります。
https://qiita.com/koyo-miyamura/items/37d555ae150047ebefde
IBM Cloudのポータルで操作するアカウントを手動で切り替える

# はじめに
IBM Cloudのポータル画面で操作するアカウントを切替える記事に何の意味がと思われるかもしれません。
下図のように、ポータル画面右上から、例えば現在 `アカウントA` になっている場合、 `アカウントB` 部分を選択することでアカウントが切り替えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/f8cba077-e312-02ef-d2cf-ed0ff114b0bb.png)
では、この記事では何を紹介するのでしょうか？

# 想定されるシチュエーション
- IBM Cloudを使ってみたいからアカウントを作成したけど、クレジットカード登録が求められるし面倒
- すでに利用可能なアカウントに招待されると、クレジットカード登録していなくても使えるみたい
- とある関係で、招待してもらえることになったからIBM Cloudを使ってみよう
- さぁログイン！

情報登録のポップアップが出てきて、アカウント切替が押せない・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/e5ebb8c0-e761-3b87-a6b9-52ae70abdf22.png)
ポップアップを閉じるとログアウト処理が動いてしまう

# この状態からの切替手順
## 必要なもの
- 招待先/切替先のアカウントID

切替先のアカウントで、画面上部の「管理」から「アクセス(IAM)」を選んで頂き、出てきたメニューから「アカウント設定」選択するとアカウントIDが表示されるので、そのIDを用意します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/c294f87f-e1de-e50f-fbbc-e6e8aab2885b.png)

## 手順
ポップアップが表示されている画面でURLを表示します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/dd8a7f5a-6617-76d8-66d0-085d4b8c5fdf.png)
URLの末尾に `?bss_account=アカウントID` を追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/b3c8257d-f839-a5dd-72f6-7f55dbd2a7d3.png)
これでポップアップが表示されない切替先のアカウントが表示されるようになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/609c0a56-13e9-697d-c674-6819dbaa8045.png)
※アカウントを切替えた状態でログアウトすると、次にログインする時は切替先のアカウントが最初に表示されます

この方法で、うまくアカウント切替わらないんだけど！という状況から抜け出すことが可能です。

# 余談：力業で解決する
先ほどのポップアップが表示される画面ですが、記載しているようにポップアップを閉じるとログアウト処理が走ってしまい、そのままだとログアウト画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/651598/e5ebb8c0-e761-3b87-a6b9-52ae70abdf22.png)
ログアウト処理が完全に走るまで2秒程度かかるので、ポップアップを閉じた瞬間に、最初に紹介したアカウント切替の操作を実行すると、うまく切り替わるか、切り替わった後でログアウトしたと認識されるので、もう1度ログインすると切替先アカウントが表示できるケースがあります。
マウスの動きをシミュレーションしつつ、試してみるのも早いかもしれません
DBFluteというO/Rマッパーについて

# 参考サイト
http://dbflute.seasar.org/ja/introduction/index.html

https://gihyo.jp/dev/feature/01/dbflute/0001

https://taktos.hatenablog.com/entry/2014/08/15/DBFlute%E3%82%92%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%A0%E3%81%91%E7%B0%A1%E5%8D%98%E3%81%AB%E8%AA%AC%E6%98%8E%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B

https://qiita.com/yossiia0531/items/ea2ef4333e75e402ff24
エラーが出るって有り難い

# 概要

プログラマーやシステムエンジニア等が、ある程度の実力を得た頃に思い始める、「エラーが出るって有り難い」ということについて書いていきます。

# 前座: 数学の証明

突然ですが皆さん、中学校・高校の数学で、証明問題は得意でしたでしょうか？
恐らくですが、答えを導出する問題よりは苦手だったという人が多いと思います。

私は大学では数学を専攻していたのですが、大学数学科では、証明問題と導出問題の難易度が逆転します。

導出問題が、答えを挙げた上に、それが答えであることを証明することになるのです。

プログラムの修正についても似たようなことが言えます。

# エラーの有り難さ

一通りの機能を実装したプログラムに対して、実行結果から修正が必要だと判断するものには2パターンあると思われます。
「エラーが出て動かない」か、「動いているけども挙動がおかしい」のどちらかでしょう。

エラーが出た場合は、エラーが起きた場所と、それを呼び出した場所と……というのが表示されるので、問題が起こった場所を特定するのは、後者に比べれば、まだやりやすい方です。

一方、挙動がおかしいことの修正は、そもそもその挙動に影響している箇所の内どこがおかしいか、というのを探すところから始まります。そして、それはエラーが出たときに調べる範囲に比べてかなり広い範囲、場合によってはプログラム全体になりかねません。

このように、エラーが出るのは、まだ有り難い話なのです。
スプレッドシートのツールバー拡張でサブメニューを作るテンプレ

# \| 概要
スプレッドシートにスクリプトを追加(?)する方法は割愛してます。
毎回調べたりするのが面倒なので、コピペ用コードを記載。
解説などはありません。

# \| コピペ用コード

```javascript
// onOpen()は、ツールバーにメニューを追加するご作法
function onOpen() {
  const customMenu = SpreadsheetApp.getUi()
  customMenu.createMenu('メインメニュー')// ツールバーに表示されるトップの階層名
      .addItem('名前1', 'function1') //1個目のメニューアイテムを追加
      .addItem('名前2', 'function2')  //2個目のメニューアイテムを追加
      .addItem('名前3', 'function3')  //3個目のメニューアイテムを追加
      
        .addSeparator()  //線引くやつ
        .addSubMenu(//サブメニューを追加
          customMenu.createMenu('サブメニュー') 
          .addItem('サブ名前1', 'function4')//1個目のサブメニューアイテムを追加
          .addItem('サブ名前2', 'function5')//2個目のサブメニューアイテムを追加 
          
         )
      .addToUi()
}
```

# \| こんな感じになる
![spreadsheet_add_menu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504100/685532a7-3523-ec2f-caf1-dac158e75557.gif)