OmniAICreator/Qiita-1.07M huggingface dataset:
【VRChat】Panelの上にオブジェクトを規則的に並べる

# 1. この記事は

VRChat上のワールドにて、Panelの上にボタンやテキスト等のオブジェクトを規則的に並べる方法を説明します。

![359.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/37b716ee-b992-4654-131a-d71699113a80.jpeg)


# 2. 方法

## 2-1 構成

オブジェクトの構成は下記の内容になっています。
![360.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/48304219-6e84-d643-9233-1d91ed428ba6.jpeg)


## 2-2 作り方

空のオブジェクトを作ります。
![361.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/40cfca3d-b2f9-b100-5bc9-218c5e8c675c.jpeg)

オブジェクトをAssetsフォルダの任意のフォルダの中に移動しprefabにします。
![362.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/f651a03a-1a31-00fc-ad6a-de489ba1a28b.jpeg)

Canvasオブジェクトを挿入します。Canvasのparameterを編集します。VRCUiShapeを追加するのは忘れない。
![364.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/de1cd9e8-051f-2094-ac88-14552478e8e8.jpeg)

PanelオブジェクトPanel_Topを挿入し、各種パラメータを入力します。
![365.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/874e4554-e084-6090-6c84-892b323a748f.jpeg)

PanelオブジェクトPanel_Columnsを挿入し、各種パラメータを入力します。
![366.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/7fcfda5f-16ba-389c-989f-b16b181c9cf5.jpeg)

PanelオブジェクトPanel_Gridを挿入し、各種パラメータを入力します。
![367.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/2cca2763-a4da-20b6-fcc4-4d01234cb007.jpeg)

PanelオブジェクトPanel_Gridの下にTextオブジェクトとPanelオブジェクトPanel_Profileを挿入します。
![368.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/3ee1522b-914e-6747-9655-86cede693a7c.jpeg)

PanelオブジェクトPanel_Profileのparameterを編集します。Panel_Profileの下にButtonを複数個配置するため、各ボタンの大きさをCell Sizeの項目で設定する。
![370.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/6e3c7e8e-ea32-4e77-0bd3-13cdfee461ea.jpeg)

Buttonオブジェクトを必要個数ほどコピーする。
![371.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/8412f29c-24e8-3651-6382-4131fe4f7438.jpeg)

TextオブジェクトのFont Sizeを調整することでTextオブジェクトがサイズに合わせて大きくなる。
![372.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/4812fc48-dd60-c1f6-0888-b1fb971aec9f.jpeg)

次にPanelオブジェクトPanel_Controlのparameterを設定する。配下にButtonを配置するためCell size等を設定する。
![373.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/d770ee2d-7c19-9cca-39ea-0732f62091e7.jpeg)

Buttonを配置する。
![374.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/cca296f9-fad5-ce1f-08d1-8463e781eca0.jpeg)

![375.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/38da4b55-b8b0-4dda-b045-9a285f829b5b.jpeg)
Git pushが失敗（SourceTree）→Gitのバージョンをあげて解決

SourceTreeを使ってpushしようとしたら下記エラーになった。

```
git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks push -v --tags yLineGame master:master
Logon failed, use ctrl+c to cancel basic credential prompt.
Pushing to https://github.com/cicular/yLineGame.git
エラー終了しました。エラーの内容は上記をご覧ください。

```

ローカルへのコミットは成功するが、プッシュができない。
**つい1時間半前まではできていたのに。。**

上記エラーメッセージとともに認証を求めるポップアップが表示されて、正しいログイン情報を入力しているのにダメ。何回やっても変わらない。

SourceTreeで「ツール」->「オプション」->「認証」を確認しても、しっかりアカウント情報は登録されている。

# 対応

Gitのバージョンが古そうなのでアップデート。

```
C:\Users\circu>git --version
git version 2.28.0.windows.1


git update-git-for-windows

C:\Users\circu>git --version
git version 2.37.1.windows.1
```

SourceTreeから再度pushを試みると、認証許可を求められた。

![git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180727/05deeb31-8abf-a293-51cc-309005b794af.png)

「Authorize…」を押すと、push成功した。
AWS CDK deploy時 fail: No ECR repository が発生した

## 発生した事象

```sh
cdk deploy --no-path-metadata --no-asset-metadata --debug
```

を実行した際に

```
Failed to publish one or more assets. See the error messages above for more information.
```

として失敗した.
内容を確認すると
```
fail: No ECR repository named 'cdk-hnb659fds-container-assets-***-***' in account ***. Is this account bootstrapped?
```
といったエラーも発生していた.


## 解決方法

1. `cdk bootstrap` をすると作成されるCloudFormation スタック: `CDKToolkit` を削除する
    ※ 必要に応じて, アセットを出力するS3バケットを削除する
1. `cdk bootstrap` を実行する



## 環境

- CDK version: 2.32.1 (build 79cbe95)
- /cdk-bootstrap/hnb659fds/version: 13
- OS: Ubuntu 20.04.4 LTS


## 参考

https://github.com/aws/aws-cdk/issues/12076#issuecomment-1099705770
[Windows] update が失敗する -> `Reset this PC` が効果的だった




# 概要

`Windows 10`の`Reset this PC` をしてみた ( =「このPCを初期状態に戻す」

私のPCマシン(マイナーな中国ブランド)と updateの相性
もあってか?、
Windows update が頻繁に失敗して、(自動)再起動後にkernel panic に
なることもあったため、できる限り updateは止めて
場合によっては、手動でupdate でinstall した分をuninstall した。

# 不安定な `Windows update`.. 失敗

->
すると、以降 `Windows update` 自体が失敗するようになった。
いろいろ調べて
解決法を試しても、結局 KBファイルのcatalogueとかから
自分でDLしてinstall とかするしかない?ようなため

https://www.catalog.update.microsoft.com/Search.aspx?q=Windows+10++x64+2004


# `Reset this PC` する (=「このPCを初期状態に戻す」
->
結果として、当リセットに挑戦することになった。。 
( 実際は、`windows feature` 設定が空になって変更できず、 
dockerとかの再install も失敗したので、仕方なく..


# 結論からいうと

`Reset this PC` は よさそう
(基本的に 思ってよりほとんどのファイルを残してくれたため、)

無理に自分で Windows update 不具合を直そうとするよりも
`reset`利用して、Windows入れなおすほうが
速いし安全かもしれない


( -> 基本的に `C:\program files` 以外のdirは保持するため
開発用に適当に`C:\vagrant` とかdir 作成していても
残っていた

https://superuser.com/questions/1097218/what-files-does-windows-10-reset-this-pc-keep

->
念の為、外部HDD にbackup しておいたが、(<-そっちはそっちでIO遅くて、restore時間かかりすぎ..)

`C:\Windows.old` というdirに Users 配下の消えた一部が残されているため `C:\Users\user\AppData`
そこから、大抵のものは復元できた。
( 例: Chrome の設定やsession、開発用IDE の設定とか..

( `C:Windows.old`は 隠れファイル? なので直アクセス必要 C:\Windows.old

# 結論

`Windows update` 失敗し どうしようもなくなったら、
`Reset this PC` は 試すのはよい ( HDD backupしてから..



# 参考?

https://superuser.com/questions/1097218/what-files-does-windows-10-reset-this-pc-keep

https://www.youtube.com/watch?v=AJ0XWK7e_X4
Angular 指定エリアの表示/非表示をコントロールする

入力フォームなどを作成している際に、ユーザが選択した条件に応じて表示・非表示をコントロールしたい場合があると思います。
今回は、条件に応じてエリアの表示を切り替える方法を記述していきます。

# 条件指定
*ngIfを指定することで、エリアの表示を切り替えることができます。

かなりざっくりとした例ですが
チェックボックスにチェックを付けると、*ngIf="isShowArea"が発動します。
```
// checkbox.component.html

// checkboxを設置
<input type="checkbox" [checked]="isChecked" (click)=isShowArea(isChecked)>

// 表示・非表示エリア
<div class="sub-title" *ngIf="isShowArea">
  <h1>チェックが付いたら入力欄を表示！</h1>
  <input matInput type="text">
</div>
```
```
// checkbox.component.ts
public isShowParentArea: boolean = false;

isShowArea(checked: boolean) {
  // チェックされたらtrueで表示。チェックが外れたらfalseで非表示。
  this.isShowParentArea = checked;
}
```

# 参考
https://angular.jp/api/common/NgIf
【C++】基礎を学ぶ㉑～テンプレート～

# テンプレート
**テンプレート**とは、構造体や関数の**型**を一般化するための仕組み
**関数テンプレート**は処理の内容の**ひな型**を作って、それを**異なるデータ型**に当てはめる

## 関数テンプレートの構文
```cpp
template <typename テンプレート引数>
返り値の型 関数名(引数の型 引数名...){
  // 処理内容
}
```
## サンプルプログラム
```cpp
#include <iostream>
using namespace std;

template <typename T>
T square(T x){
  return x * x;
}

int main() {
  cout << square(3) << endl;
  cout << square(1.5) << endl;
  return 0;
}
```
```
9
2.25
```

## クラステンプレート
**クラステンプレート**とは、メンバ変数の**型を一般化**して作成するクラスのこと

## クラステンプレートの構文
```cpp
template <typename テンプレート引数>
class クラス名{
  // クラスの内容
}
```

## サンプルプログラム
```cpp
#include <iostream>
using namespace std;

template <typename T>
class Point {
  public:
    T x;
    T y;
    Point(T arg1, T arg2){
      x = arg1;
      y = arg2;
    }
    void print() {
      cout << "(" << x << ", " << y << ")" << endl;
    }
};

int main() {
  Point<int> point1(1,2);
  Point<double> point2(1.2,3.4);
  point1.print();
  point2.print();
  return 0;
}
```
```
(1, 2)
(1.2, 3.4)
```
## 次の記事
[【C++】基礎を学ぶ㉒～STL～
](https://qiita.com/rapirapi/items/5fa91936a4a0f5c79dba)
[その6]AWS-SAA-躓いたメモ

## スループット最適化HDD(st1)かプロビジョンドIOPS SSD(io1)どちらを選ぶか問題

- プロビジョンドIOPSは`データベース`として使う
- スループット最適化HDDは`log・DWH・ビックデータ`


## AutoScalingのライフサイクル
1. インスタンス起動(`Pending`)
1. AutoScalingGroupに追加(`Pending`)
1. 起動完了(`InService`)
1. AutoScalingGroupから除外(`Terminating`)
1. インスタンス削除(`Terminating`)
1. 完全削除(`Terminating`)


## ELBの`SpilloverCount`は拒否されたリクエスト数
リクエストが最大の`SuergeQueueLength`を超えると`SpilloverCount`が拒否されたリクエストの測定を開始する

## 特定のIPアドレスからのアクセスを拒否したい場合は、`ACL`

SGは許可ルールのみサポートなのでIPアドレスからアクセス拒否することはできない。


## ELBヘルスチェックに引っかかってマークされているのに、インスタンスが終了していない。

AutoScalingGroupにELBヘルスチェックを追加する



## AMIの起動許可について

- パブリック
    - 全てのAWSアカウントに対して起動許可
- 明示的
    - 特定のAWSアカウントに対して許可
- 暗示的
    - AMIの暗示的起動許可がある。


## DynammoDBに格納できるテーブルサイズは制限がない。

## EBSの暗号化オペレーション
暗号化はEc2をホストするサーバー上で実行される


## EBS-backedインスタンス
running → stopping → stoppedの順

## SnowballとSnowmobileどっちがでかいんじゃい問題
Snowball→ペタバイトのデータ転送
snowmobile→エクサバイト
snowmobileは`トラック`使う。


## Amazon EBS-backed AMIはインスタンス終了時削除
→ `DeleteOnTermination`を`false`

## EBSの暗号化はアタッチができるものが決まってる。


## `Instance Store` Backedのルートデバイスは停止できない。
EBS-Store-Backedは停止できる

## IAMコンソールでユーザー名は変更不可


## cloudwatchエージェントで見れるもの
- メモリ使用率
- ディスクスワップ
- ログ収集
部分分数分解 「15年 関西学院大 理系 2月1日 1(3)」をwolframalphaとsympyでやってみた。

(2*x^3-7*x^2+11*x-16)/(x*(x-2)^3)
オリジナル

https://kamelink.com/blog/2022/07/14/1-1-15-kannseigakuinndai-rikei-2gatu1niti-1-3/

# wolframalphaで

https://www.wolframalpha.com/calculators/partial-fraction-calculator

(2 x^3 - 7 x^2 + 11 x - 16)/(x (x - 2)^3)

以下、実行結果の順番は気になりますけど,ありました。

https://www.wolframalpha.com/input?i2d=true&i=Divide%5B2Power%5Bx%2C3%5D-7Power%5Bx%2C2%5D%2B11x-16%2Cx*Power%5B%5C%2840%29x+%E2%88%92+2%5C%2841%29%2C3%5D%5D

# できませんでした。 wolframalphaのsolveを使って

solve((2*x**3-7*x**2+11*x-16)/(x*(x-2)**3)=a/x+b/(x-2)+c/(x-2)**2+d/(x-2)**3,[a,b,c,d])

https://www.wolframalpha.com/input?i=solve%28%282*x**3-7*x**2%2B11*x-16%29%2F%28x*%28x-2%29**3%29%3Da%2Fx%2Bb%2F%28x-2%29%2Bc%2F%28x-2%29**2%2Bd%2F%28x-2%29**3%2C%5Ba%2Cb%2Cc%2Cd%5D%29&lang=ja

solve((2x^3-7x^2+11x-16)/(x(x-2)^3)=a/x+b/(x-2)+c/(x-2)^2+d/(x-2)^3,[a,b,c,d])

https://www.wolframalpha.com/input?i=solve%28%282x%5E3-7x%5E2%2B11x-16%29%2F%28x%28x-2%29%5E3%29%3Da%2Fx%2Bb%2F%28x-2%29%2Bc%2F%28x-2%29%5E2%2Bd%2F%28x-2%29%5E3%2C%5Ba%2Cb%2Cc%2Cd%5D%29&lang=ja


# sympyで(1)apartを使って
これも実行結果の順番は気になりますけど、ありました。

```python
from sympy import *
var('x')
f=(2*x**3-7*x**2+11*x-16)/(x*(x-2)**3)
print (      f )
print (apart(f))
pprint(apart(f))
# (2*x**3 - 7*x**2 + 11*x - 16)/(x*(x - 2)**3)
# 5/(x - 2)**2 - 3/(x - 2)**3 + 2/x
#    5          3       2
# ──────── - ──────── + ─
#        2          3   x
# (x - 2)    (x - 2)  
```

# sympyで(2)solveを使って
WolfMoon様のコメントより
```python
from sympy import *
var('x a b c d')
print("#",solve(Eq((2*x**3-7*x**2+11*x-16)/(x*(x-2)**3), \
                     a/x+b/(x-2)+c/(x-2)**2+d/(x-2)**3), \
                [a,b,c,d]))
# {a: 2, b: 0, c: 5, d: -3}
```

# sympyで(3)数値代入法のsolveを使って
4元連立方程式でした。
xに1,3,4,5を代入しました。xに2を代入すると,Falseがでました。

```python
from sympy import *
var('x a b c d')
myEq=Eq((2*x**3-7*x**2+11*x-16)/(x*(x-2)**3),a/x+b/(x-2)+c/(x-2)**2+d/(x-2)**3)
print("#",solve([myEq.subs({x:1}),myEq.subs({x:3}),myEq.subs({x:4}),myEq.subs({x:5})],[a,b,c,d]))
# {a: 2, b: 0, c: 5, d: -3}
```

# sympyで(4)係数比較法を使って
(勉強中)
[Vagrant][Plugin] package.rb:440:in `initialize': Permission denied @ rb_sysopen - winnfsd.exe (Errno::EACCES) 解決法


# 概要

Windows で`vagrant up` とかでVM起動しようとすると
(or `vagrant plugin xxx` の操作とかすると..)
`winnfsd.exe` がpermission denied でエラーになる
ことがある


https://github.com/winnfsd/winnfsd

# 原因


恐らく、(admin(root)権限で起動している) `winnfsd.exe` が`使用中` のため
意図する変更が加えられない


# 解決法

->
Windows とかの`task manager`で `Nfs server for windows`
というプロセス があるので
それをkill する ( admin(root)権限で

->
このエラーは解消する はず


# 参考?


https://github.com/winnfsd/winnfsd
M1Macでgulp-sassが使えなくなっていた

以下のエラーがでました。

```gulpinstall.sh
$ npx gulp
Error: Node Sass does not yet support your current environment: OS X Unsupported architecture (arm64) with Unsupported runtime (102)
For more information on which environments are supported please see:
https://github.com/sass/node-sass/releases/tag/v4.12.0
Node
```
調査するとgulp-dart-sassというものが
M1に対応してくれるとのことでした。

# gulp-sassをアンインストール
まずはgulp-sassをアンインストールします。

npmで管理している場合は
```uninstall.sh
$ npm uninstall gulp-sass --save
```

yarnで管理している場合は
```yarnuninstall.sh
$ yarn remove gulp-sass --save
```

ちなみにpackage.jsonのないディレクトリで実行すると以下のようなメッセージが表示されます。
```fail.sh
$ npm uninstall gulp-sass --save
up to date, audited 1 package in 164ms
found 0 vulnerabilities
```

# gulp-dart-sassをインストール
gulpのプロジェクトディレクトリ、package.jsonがある階層で以下のコマンドを実行します。
```install.sh
$ npm install gulp-dart-sass --save
```

saveオプションを付けることでpackage.jsonへの記述も自動でやってくれるようになります。

https://www.npmjs.com/package/gulp-dart-sass

yarnなら

```install.sh
$ yarn add gulp-dart-sass
```

今回は開発者用ファイルには追記が必要ないのでオプションは空にします。

# gulpfile.jsを編集します
```gulpfile.js
- var sass = require('gulp-sass');
+ var sass = require('gulp-dart-sass');
```

これでnpx gulpなどを実行するとsassがコンパイルされるようになります。
[Windows][Vagrant] 遅い/不安定 VM is too slow 解決法


# 概要

Windows update(Windows 10 20H1-> `20H2`) したら、
Vagrant(最新ver. `2.2.19`  CentOS7) が `vagrant up`とか遅すぎる
SSHしても VMが遅くて不安定 (SSHが切れたり、再起動したり..)

(関連してか、いろいろVMの不具合でた..)

# 解決法

`Windows features` で `hyper-V` (hypervisor) をturn on する。(名称が20H2 前後でやや違う..

(WSL(`Windows Subsystem for Linux`) +   `Virtual Machine Platform` はturn on 済み)

->
(以前のように)速くなった


# 参考?

https://qiita.com/hibohiboo/items/c17459e0af84d2059d21

https://github.com/hashicorp/vagrant/issues/11853

https://docs.microsoft.com/en-us/virtualization/community/team-blog/2017/20170706-vagrant-and-hyper-v-tips-and-tricks
【Swift】Codableで動的なキーを持つJSONをパースする

# はじめに
SwiftでJSONをパースする方法はいくつかあると思いますが、
標準で使えて動作も速いのはCodableだと思います。
CodableでパースするにはJSONのキーに対応した構造体を作成する必要があります。

しかし、稀に動的なキーを持つJSONに出会うことがあります。
動的なキーでは事前に構造体を作成することができません。

ではどのようにパースするのでしょうか

# 該当するJSON
TwitterのWebAPIに動的キーを持つJSONがありました。
キーがツイートIDになっているので事前に定義しておく事は不可能です。
(関係ないキーは省略してます。)
![スクリーンショット 2022-07-18 19.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/ffcb2f4b-88c0-28a6-1a2b-3bec0df34395.png)

# 対策
動的キー部分だけ辞書型にします。
```swift
import Foundation

// MARK: - SearchAdaptive
struct SearchAdaptive: Codable {
    let globalObjects: GlobalObjects
}

// MARK: - GlobalObjects
struct GlobalObjects: Codable {
    let tweets: [String: Tweet]
}

// MARK: - Tweet
struct Tweet: Codable {
    let fullText: String

    enum CodingKeys: String, CodingKey {
        case fullText = "full_text"
    }
}
```
動的キーの部分だけ辞書型で読み込みます。
```swift
let tweets: [String: Tweet]
```

# 使い方
```swift
import SwiftUI
import Alamofire

struct ContentView: View {
    // 省略...
    @State var searchResult: SearchAdaptive = SearchAdaptive(globalObjects: GlobalObjects(tweets: [:]))
    var body: some View {
        List {
            ForEach(Array(searchResult.globalObjects.tweets.keys), id: \.self) { key in
                Text(searchResult.globalObjects.tweets[key]?.fullText ?? "")
            }
        }
        .onAppear() {
            requests()
        }
    }
    // 省略...
}
```

下記の部分で`searchResult.globalObjects.tweets`から`keys`を配列で取得します。
取得された配列は先頭から順に`key`に格納します。
```swift
ForEach(Array(searchResult.globalObjects.tweets.keys), id: \.self) { key in
 
}
```

`key`を`searchResult.globalObjects.tweets`に指定することで動的キーの内に入る事ができます。
```swift
Text(searchResult.globalObjects.tweets[key]?.fullText ?? "")
```


# おわり
https://dev.classmethod.jp/articles/swift_codable_dynamic_key/

上記のリンクのようなやり方もあるようですが、
私には難しくてよく理解できませんでした笑
Creative Coding環境におけるプロジェクションマッピングツール 

この記事は、クリエイティブコーディング環境において、MadMapperなど有料ライセンス製品を使わずにプロジェクションマッピングをするためのライブラリ、アドオンのメモです。

**調査したクリエイティブコーディング環境**
- Processing
- P5js
- openFrameworks
- Unity
- Touch Designer


# Processing
[keystone](https://github.com/davidbouchard/keystone)
Processing3には対応してそう。

https://github.com/davidbouchard/keystone

https://fh-potsdam.github.io/doing-projection-mapping/processing-keystone/#keystone-reference


# p5js
[p5.mapper](https://github.com/jdeboi/p5.mapper)

https://github.com/jdeboi/p5.mapper

# openFrameworks
[ofxQuadWarp](https://github.com/julapy/ofxQuadWarp/tree/master)

https://github.com/julapy/ofxQuadWarp/tree/master


# Unity
[RoomAliveToolkit](https://github.com/Microsoft/RoomAliveToolkit)

https://github.com/Microsoft/RoomAliveToolkit


そもそもUnityなら投影物を3D空間に作ってしまえば良いのか

https://cgworld.jp/regular/201904-codelight-unity07.html

# Touch Designer
[kantanMapper](https://docs.derivative.ca/Palette:kantanMapper)

https://docs.derivative.ca/Palette:kantanMapper


# 最後に
メモ、まとめ、として使ってるので情報量少なくてすみません。
もし他におすすめのツールやライブラリなどありましたら、教えていただけると幸いです。
分点公式「21年 三重大 後 教育・工 1(2)」をsympy でやってみた。

オリジナル

https://kamelink.com/blog/2022/07/15/4-1-21-miedai-kou-kyouiku%e3%83%bbkou-1-2/

# sympyで
求点3点で、2次元3条件なので6元連立方程式で解けるはず。
ばらさなくても、解ける方法を教えて下さい。
分点公式?だそうです。分点公式を確認予定。

```python
from sympy import *
var('a1 a2 b1 b2 c1 c2')
A=Point(a1,a2)
B=Point(b1,b2)
C=Point(c1,c2)
G=(A+B+C)*Rational(1,3)
M=(A+B)  *Rational(1,2)
N=B+(C-B)*Rational(1,5)
ans=solve([G.x-1,G.y-1,
           M.x-3,M.y-0,
           N.x-1,N.y-3],
          [a1,a2,b1,b2,c1,c2])
print("# ",A.subs([(a1,ans[a1]),(a2,ans[a2])]))
print("# ",B.subs([(b1,ans[b1]),(b2,ans[b2])]))
print("# ",C.subs([(c1,ans[c1]),(c2,ans[c2])]))
#  Point2D(4, -3)
#  Point2D(2, 3)
#  Point2D(-3, 3)
```
go の知らなかった仕様

# これは何？

まあタイトルのとおり。
知らなかった文法・仕様・書き方がいくつかあったのでメモ。

# 型の別名定義

下記の、 `newNameOfString`。

```go:go1.18
// = があると、C の typedef 相当。別名。
type newNameOfString = string

// = が無いと、同じ内容の別の型。
type somethingLikeString string

func (s *newNameOfString) fuga() {} //invalid receiver type *string (basic or unnamed type)

func (s *somethingLikeString) fuga() {}

func piyoFunc() {
	s := "hoge"
	var nns newNameOfString = s
	var sls somethingLikeString = s // cannot use s (variable of type string) as somethingLikeString value
	// 以下略
}
```

こんな機能あったっけ。

[[Go] Defined type（Named type）とType aliasを使い分ける ](https://budougumi0617.github.io/2020/02/01/go-named-type-and-type-alias/) によると、go 1.9 かららしい。私が初めて触った辺りかな。

`=` 無しだと新しい型なのでメソッド生やしたりできる。`=` 有りだと単に別名なので元の型と混ぜて使える。

# ビルドタグ

従来

```go:古いgo
// +build ignore
```

だったんだけど、いつの間にか

```go:go1.18とか
//go:build ignore
```

と書くように変わった模様。
vscode で書いていたら、format on save で急に修正されてびっくりした。

私としてはコメントであることをやめるべきだと思ってるんだけど、そこは変えないのか、と思った。

# メンバを持っている匿名構造体

こういうやつ。

```go:go1.18
func anostructReceiver(ano struct{ a int }) {
}

func anostructSender() {
	anostructReceiver(struct{ a int }{a: 100})
}
```

これはまあ、メンバー無しではよく使うから言われてみればああそうかという感じだけど、使えるかもしれないと思ったことがなかった。

`struct{}` 以外の匿名構造体を使いたいと思う場面に遭遇していないから気づいていなくても仕方ない。

そう思うと。
`interface{}` に `any` という名前がついているように、`struct{}` にもなんか名前つけたらいいんじゃないかなと思う。

# Defined Type の挙動

`time.Duration` などで慣れている通り、defined type に対しても演算子による演算は普通にできる。

しかし構造体のメソッドは

```go:go1.18
type EmbeddedType struct{}

func (*EmbeddedType) Embedded() {}

type OriginalStruct struct {
	EmbeddedType
	hoge int
}
type AnotherStruct OriginalStruct

func (*OriginalStruct) Foo() {}

func structUser(o *OriginalStruct, a *AnotherStruct) {
	o.Foo()
	o.Embedded()
	someFunc(o.hoge)
	a.Foo() // a.Foo undefined (type *AnotherStruct has no field or method Foo)
	a.Embedded() // これは OK
	someFunc(a.hoge) // これも OK
}
```

Defined type からは呼べない。
元の型に埋め込まれている型へのメソッドとかは OK。

じゃあ interface はと思うと

```go:go1.18
type OriginalIF interface{ Bar() }
type AnotherIF OriginalIF

func ifUser(o OriginalIF, a AnotherIF) {
	o.Bar()
	a.Bar() // これは OK
}
```

と defined type でもメソッドが使える。

# 評価順序

C / C++ なんかだと

```c:c_or_c++
foo(bar(),baz());
```

の `bar` と `baz` が呼ばれる順序が曖昧で最適化オプションを変えると順序が変わったりする。

go の場合どうなのか知らなかったんだけど [The Go Programming Language Specification - Order of evaluation](https://go.dev/ref/spec#Order_of_evaluation) を見ると

```go:go
a := 1
f := func() int { a++; return a }
x := []int{a, f()}            // x may be [1, 2] or [2, 2]: evaluation order between a and f() is not specified
```

などとなっていて、不定らしい。

気をつけないとね。

# goto

[あるらしい](https://go.dev/ref/spec#Goto_statements)。

私は書かないと思う。

# `type(...)`

こう書いてもいいらしい。

```go:go1.18
type (
	OriginalStruct struct {
		EmbeddedType
		hoge int
	}
	AnotherStruct OriginalStruct
)
```

見たこと無いから知らなかった。

これも書かないかな。他の人が書いていても驚かないようにしよう。


# まとめ

キャッチアップちゃんとしなきゃね、と思った。
Vue Axiosで複数のAPIを同時に叩いて取得する方法

殴り書きなので不正確な内容はご了承を。

Vue AxiosなんかでAPIからデータを取得する関数なんかを作って．．．

```Javascript:functions.js
getUserList () {
  return this.axios.get('https://hogehoge.net/getUserList')
  .then(resnponse => {
    return response.data
  })
  .catch(error => {
    console.log(error)
  })
}

getScore () {
  return this.axios.get('https://hogehoge.net/getScore')
  .then(response => {
    return response.data
  })
  .catch((error => {
    console.log(error)
  })
}
```

一つずつ取得するのであれば、

```javascript:single.vue
(略)
import functions from './functions'

const single = {
  data () {
    return {
      myUserList: [],
      myScore: []
    }
  },
  async created () {
    this.myUserList = await this.getUserList()
  },
  watch : {
    async myUserList () {
      this.myScore = await this.getScore()
    }
  },
  methods: {
    ...functions
  }
}

export default single
```

とすればいいが、同時に取得したいのであれば、

```javascript:multi.vue
(略)
import functions from './functions'

const multi = {
  data () {
    return {
      myUserList: [],
      myScore: []
    }
  },
  created () {
    Promise.all([
      this.getUserList(),
      this.getScore()
    ])
    .then(response => {
      this.myUserList = response[0]
      this.myScore = response[1]
    })
    .catch(error => {
      console.log(error)
    })
  },
  methods: {
    ...functions
  }
}

export default multi
```
と、Promise.all()を使えばOK。
async / await に慣れていると、この方法にたどり着けなかった。
WSL2のUbuntu(genieインストール済み)にSSHで接続した場合のエラー対応

## はじめに
UbuntuにSSHで接続する際に`genie: already inside the bottle; cannot proceed`
というエラーが発生した場合の対処方法


## 現象
```bash
$ ssh ubuntu
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.10.102.1-microsoft-standard-WSL2 x86_64)

# 中略

*** System restart required ***
Last login: Mon Jul 18 17:58:00 2022 from 172.23.176.1
Starting genie:
genie: already inside the bottle; cannot proceed
Connection to 172.23.182.158 closed.
```

## 原因
genieを起動時に実行するスクリプト(.bashrcに追加)が、SSH経由で実行時に重複して実行されているようです。

`if [[ ! -v INSIDE_GENIE ]]; then`で2重起動しないようにチェックしていますが・・・・ 
SSH経由では、環境変数にセットされていない模様

```bash
# Are we in the bottle?
if [[ ! -v INSIDE_GENIE ]]; then
  echo "Starting genie:"
  exec /usr/bin/genie -s
fi
```
<dl>
  <dt>if [[ ]] ;</dt>
  <dd>bashの条件判断</dd>
  <dt>!</dt>
  <dd>否定</dd>
  <dt>-v</dt>
  <dd>変数が定義されていた</dd>
  <dt>INSIDE_GENIE</dt>
  <dd>GENIEが実行時に定義される変数</dd>
</dl>


## 対応方法

下記ページを参考に.bashrcを修正
https://github.com/arkane-systems/genie/issues/101

SSHから接続した場合`export $(systemctl show-environment)`を実行して、不足している環境変数を取り込む。

```bash
if [[ -v SSH_CLIENT ]]; then
  export $(systemctl show-environment)
fi

# Are we in the bottle?
if [[ ! -v INSIDE_GENIE ]]; then
    echo "Starting genie:"
    exec /usr/bin/genie -s
fi
```
endroid/qr-codeを用いてphpでQRコード画像を生成する

## 実現したいこと
phpのController内で任意の情報を持たせたQRコード画像を生成・保存する。

## インストール
```console
composer require endroid/qr-code
```

## 実装
```$qrData```にはQRコードの中に保持させたいデータを入れておく。

```php
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\Label\Alignment\LabelAlignmentCenter;
use Endroid\QrCode\Label\Font\NotoSans;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;
use Endroid\QrCode\Color\Color;

~~
$qrCode = Builder::create()
          ->writer(new PngWriter())
          ->writerOptions([])
          ->data($qrData)
          ->encoding(new Encoding('UTF-8'))
          ->errorCorrectionLevel(new ErrorCorrectionLevelHigh())
          ->size(200)
          ->margin(10)
          ->roundBlockSizeMode(new RoundBlockSizeModeMargin())
          ->build();
                    
$qrCode->saveToFile('filepath/qrCode.png');


```
AtCoder Beginner Contest 260 E問題 At Least One解説

# 問題

https://atcoder.jp/contests/abc260/tasks/abc260_e

$N$個の整数の組 $(A_1,B_1), (A_2,B_2),..., (A_N,B_N)$ の$A_i$か$B_i$の少なくとも片方を含むような連続部分列を考えます。
考えられる連続部分列の長さをそれぞれ出力する問題。

# 観察

最初の例の場合で観察します。
 - $N = 3$
 - $M = 5$
 - $(A_i, B_i) = (1,3), (1,4), (2,5)$

良い数列を列挙したものは以下のようになります。

 - $(1,2)$
 - $(1,2,3)$
 - $(1,2,3,4)$
 - $(1,2,3,4,5)$
 - $(2,3,4)$
 - $(2,3,4,5)$
 - $(3,4,5)$

ここで、連続部分列の先頭の数字を$L$とおきます。
よく観察すると以下の点に気づくことができます。

## 気付き1

観察から、各$L$に対して数$R$が存在し、
$R$以降$M$を最後尾とする連続部分列が$S$になるということができそうです。
上記の例の場合だと $(L_i,R_i) = (1,2), (2,4), (3,5)$です。

今回は$(A,B)$のうち**少なくとも片方**選べばよいので、確かに成り立ちます。
(連続部分列を伸ばしても選ぶ数字は増えることはあっても減ることはないので)

## 気付き2

$L$の最大値は$B$の最小値になっています。
全ての$B$を含んでいれば題意の条件を満たすので、$L$が$B$の最小値の場合はギリギリ成立します。

ただ、それよりも1大きくなってしまうと、
$(A,B)$のどちらも選ばれない組が出てしまうために成立しません。

## 気付き3

$L$が1のとき、$R$は$A$の最大値となっています。
これも気付き2と似ていますが、全ての$A$を含んでいれば題意の条件を満たすので、$R$が$A$の最大値の場合はギリギリ成立します。

ただ、それよりも1大きくなってしまうと、
$(A,B)$のどちらも選ばれない組が出てしまうために成立しません。

## 気付き4

$L$が $j$ から $j+1$ に遷移するとき、$R$は $A_i = j$ を満たす $i$ のうち、 $MAX(B_i)$に遷移する。
もともと$A_i$を選択していたので、**必ず**$B_i$を選択しなければなりません。

なので、$B_i$のうちの最大値を$R$とすることで引き続き題意の条件を満たすことができます。

# まとめ

上記の気付きといもす法を使うことで答えをだすことができます。

 - $A$のとりうる値 - $B$の最大値を管理しておく(*)
 - $L$を0から$B$の最小値まで探索
 - $R$の初期値は$A$の最大値、遷移は(*)の値の方が大きければ更新する
 - $L$と$R$の値を使っていもす法でそれぞれの長さを更新して求める

通常の尺取り法と比べて、不要な遷移を行わない分たいがいの場合はより高速に動作します。
アルゴリズムもシンプルなので実装量も比較的少なくなってると思います。

# 回答

https://atcoder.jp/contests/abc260/submissions/33326712

```Rust
use itertools::Itertools;
use proconio::{fastout, input, marker::Usize1};

#[fastout]
fn main() {
    input! {
        n:usize,m:usize,
        ab:[(Usize1,Usize1);n],
    }
    let mut ans = vec![0; m + 1];
    let mut least = vec![0; m];
    let mut maxa = 0;
    let mut minb = m;
    for (a, b) in ab {
        maxa = maxa.max(a);
        minb = minb.min(b);
        least[a] = least[a].max(b);
    }
    let mut r = maxa;
    for l in 0..=minb {
        ans[r - l] += 1;
        ans[m - l] -= 1;
        r = r.max(least[l]);
    }
    for i in 1..=m {
        ans[i] += ans[i - 1];
    }
    ans.remove(m);
    println!("{}", ans.iter().join(" "));
}
```
属性列挙法でシステム改善

## はじめに
「システムの改善点出して」...と言われても、そんなすぐにアイデア出ないっす！

と悩んでいるそこのあなた。
もしかしたら、属性列挙法を使えばアイデアが出しやすいかもです！

この記事では、システムの改善に属性列挙法を活用する方法を解説します。

:::note warn
属性列挙法は製造業の商品開発で用いられるビジネスフレームワークです。
本記事では、属性列挙法をIT開発に活かせるように独自にアレンジして解説しています。
そのため、本来と異なる部分もありますが、ご了承ください。
:::
## 対象者
この記事は下記のような人を対象にしています。

- 駆け出しエンジニア
- プログラミング初学者
- 既存システムの改善をしたい人

## 結論

## 属性列挙法とは

:::note
1. 名詞的特性(部品・材料・製法)
1. 形容詞的特性(色・形・性質)
1. 動詞的特性(機能・動作)
:::

## 1. 名詞的特性
**部品・材料・製法**を改善するための視点です。
システム開発で言うと、**技術選定やインフラ設計**に当たるでしょう。
具体的な例で言うと、下記のような要素があります。

:::note
名詞的特性の例
- 開発言語
- フレームワーク
- ライブラリ
- 仮想環境
- サーバー構成(クラウド/オンプレ)
- データベース構造
- 開発方式(アジャイル/ウォーターフォール)
:::

上記のような要素を、他の技術で代替できないか、を検討します。
入れ替えに手間がかかるものが多いので、設計段階or大幅なリプレースが該当するでしょう。
具体的な例でいくと...

:::note
- Laravel Mixが重すぎるので、Laravel Viteを導入したい。
- Javascriptはメンテナンスコストが高すぎる。TypeScriptを導入したい。
- Docker重すぎ。Mutagenに変えたい。
:::

## 2. 形容詞的特性
**色・形・性質**を改善するための視点です。
システム開発でいくと、**フロントエンド,UI**が該当するでしょう。

:::note
形容詞的特性の例
- UIデザイン
- カラーテーマ
- ターゲットデバイス
:::

具体的な例でいくと...(フロント苦手なので、スカスカの例で恐縮です)

:::note
- ボタンの文字が見づらいので、太字にしたほうが良い。
- 飲食店向けサービスなので、赤・黒・ゴールドを使用したカラーテーマにしたい。
- PC向けの画面しかないが、スマホ向けにレスポンシブ対応させたい。
- ダークモード対応させたい。
:::

## 3. 動詞的特性
**機能・動作**を改善するための視点です。
システム開発では**バックエンド**の要素が該当します。

:::note
動詞的特性の例
- ログイン機能
- 通知機能
- 決済機能
- シェア機能
- お気に入り機能
- ヘッダー/フッターの表示項目
:::

具体的には...

:::note
- ログイン機能にSNSログインを追加したい。
- 決済機能にpaypayを追加したい。
- SNSでシェアできるようにしたい。
:::

こんな感じでしょうか。

## 属性列挙法は簡単な分、落とし穴も...
3つの要素(名詞、形容詞、動詞)から改善案を出す属性列挙法ですが、簡単すぎるので欠点もあります。
それは**だいたい見たことあるようなアイデアになりがち**という点です。
あまり奇抜なアイデアは出てこないのは仕方ないですね。

ちょっと違った視点のアイデアが欲しい場合はSCAMPERやオズボーンのチェックリストを活用すると良いでしょう。

https://qiita.com/YutaManaka/items/89ea6ef41a25ef925c35

## おわりに
属性列挙法についてまとめました。
【VSC】git pushでつまづいたところまとめ【Mac】

# はじめに
Visual Studio CodeでGitHubにpushした時に、下記のエラーが発生した。
```言語名:ターミナル
git push -u origin master                                        
fatal: cannot run /private/var/folders/35/363l43cj7sl60j9xw34_rbdw0000gn/T/AppTranslocation/DF6474BE-4462-425E-BADD-011ACAF41F89/d/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh: No such file or directory
```
これを解決するために色々行なったことを以下に記していく。
途中、ssh-agentなど今回の問題とは関係のないものも出てくるが、ついでに書き留めておく。

# SSH確認とSSH追加方法を公式で確認する。
まず、下記のリンクからGitHubのSSHキーが使用中のOSに登録しているか確認し、登録していないのであれば、登録方法を確認する。
[GitHub　SSH確認、SSH追加方法](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)

# SSHキーの確認
```言語名:ターミナル
ls -al ~/.ss
```
下記のようなものがあれば設定済みだ。
id_rsa.pub
id_ecdsa.pub
id_ed25519.pub
今回そういったものは表示されなかったため、追加していく。

# SSHキーの追加
https://pan-shoku.com/ed25519-github/#toc1

```言語名:ターミナル
$ ssh-keygen -t ed25519 -C "<GitHubに登録しているメールアドレス>"  
Generating public/private ed25519 key pair.
Enter file in which to save the key(<キーが保存されるディレクトリ>): # ここでエンターを押す
Enter passphrase (empty for no passphrase): # パスワードを入力
Enter same passphrase again: # パスワードを再度入力
```
これで完了した。
もう一度確認してみる。
```言語名:ターミナル
$ ls -al ~/.ssh
-rw-------   1 <username>  <groupname>   464  7 17 16:34 id_ed25519
-rw-r--r--   1 <username>  <groupname>   100  7 17 16:34 id_ed25519.pub
```
上記のファイルが作成されたことを確認した。

# ssh-agentに鍵を追加する
https://zenn.dev/naoki_mochizuki/articles/ce381be617cd312ffe7f

パスワード入力を省略するため
```言語名:ターミナル
$ eval "$(ssh-agent -s)"
Agent pid 7138
```

```言語名:ターミナル
# configファイルがある場合はｔｏｕｃｈする必要なし
$ touch ~/.ssh/config
$ open ~/.ssh/config 
```
```~/.ssh/config 
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519.pub
```
SSH 秘密鍵を ssh-agent に追加して、パスフレーズをキーチェーンに保存する。
```言語名:ターミナル
ssh-add -K ~/.ssh/id_ed25519
```

# publicキーをGitHubに登録する
[SSH keys](https://github.com/settings/keys)の『New SSH Key』からPublicキー（id_ed25519.pubの中身）を登録する。

# vscodeとgithubを連携させる
もしかしたら、これを最初からやっていればできていた？

https://qiita.com/y-tsutsu/items/2ba96b16b220fb5913be#%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%81%99%E3%82%8B

上記を参考に連携した。
shift+command+Pで開いたところに『gitaddremote』と打ち、出てきたものを選択する。VScodeのversionが古い場合はインストールし直して、アプリを開き直す。
これで連携が完了し、再度push してみる。
```言語名:ターミナル
$ git push
Enumerating objects: 530, done.
Counting objects: 100% (530/530), done.
Delta compression using up to 4 threads
Compressing objects: 100% (468/468), done.
Writing objects: 100% (477/477), 55.76 KiB | 2.66 MiB/s, done.
Total 477 (delta 364), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (364/364), completed with 40 local objects.
To https://github.com/<username>/<repository>.git
   423a5ed..9a69dce  master -> master
```
これでpushできた。
実際にgithubに行ってデータが反映されているか確認し、問題なく反映されていた。

# 用語説明
**SSHキーとは**
公開鍵暗号方式と共通鍵暗号方式を組み合わせたもので、httpsから始まるウェブサイトは、SSLが適用されている。
**ls -alとは**
『ls -a』によって、カレントディレクトリの下にぶら下がっているファイルやフォルダを全て表示する。　
『ls -l』によって、左から
アクセス権、リンク数、所有者名、グループ名、サイズ、最終更新日時、名前の詳細
の順に表示する。
上記を組み合わせたコマンドである。

https://do-zan.com/mac-terminal-ls/#-l

# 参考
https://qiita.com/greencoffeemaker/items/54ad17d8ad6797d720a1
lavend

![_DSF7449.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136290/2d3e6da7-33ff-7881-b420-0598d46da6d7.jpeg)
![_DSF7425.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136290/bd0b3a24-05ce-3a4a-7f79-2e41f40e3495.jpeg)
![_DSF7225.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136290/30e3ef01-4211-2e6c-8655-07f454c0d95d.jpeg)
![_DSF7073.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136290/8d2d2bbe-2f74-25cd-3bb3-b824b20a1d8d.jpeg)
![_DSF7238.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136290/d7e268f1-1956-7eca-4ab5-deda9d74e407.jpeg)
![_DSF7249.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136290/d46807c0-1627-60eb-d4f2-f9a779779de4.jpeg)
スクロールバーを非表示にするCSS

## 実現したいこと
```overflow-y: scroll;```を設定した場合に表示されるスクロールバーを非表示にした上でスクロール可能な状態にする。

## 実装
クラス名は```overflow-y: scroll;```を付与したクラスを指定する。
```css
.[クラス名]::-webkit-scrollbar {
    display: none;
}
```
シェルスクリプトで数値を0埋めありで出力する際のメモ

シェルスクリプトで数値を0埋めありで出力する際のメモです

以下のようにすればOK

```shell:do.sh
#!/bin/bash                                                                                                                         

for i in `seq 1 90`
do
   # 3桁の0埋めありで出力する例
   printf "%03d\n" "${i}"
done
```

実行

```
$ bash do.sh
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
```

#### `mkdir`をする場合は以下のようにすればOK

```shell
#!/bin/bash
 
for i in `seq 1 90`
do
   #echo $i
   DIR_NAME=`printf "%03d\n" "${i}"`
   mkdir -p $DIR_NAME
done
```

# 参考

https://genzouw.com/entry/2019/03/06/080354/1087/

https://www.server-memo.net/shellscript/for.html
Angularのコンポーネントを作成

[Angularのチュートリアル](https://angular.jp/tutorial/toh-pt1)を参考にしています。

# コンポーネントの作り方
コンポーネントを作成したいディレクトリの下で下記のコマンドを実行します。
```
ng generate component heroes
```
src/app/heroes/配下に下記のファイルが作成されます。
- heroes.component.ts
- heroes.component.spec.ts （これは触らない）
- heroes.component.html
- heroes.component.css

# Serviceファイルの作り方
```
ng generate service heroes
```
component が service に変わっただけですね。


# エラー
エラー文を記録しておくのを忘れてしまいました😭
解決方法としては、「--module app.module」を付けることでことなきを得ました。
```
ng generate component heroes --module app.module
```
WSL2上のUbuntuに立ち上げたDockerコンテナ内のRuby SDKをIntelliJのWSLプロジェクトでProject SDKとして扱うことは出来ません！

# 概要と対策
## 概要
めちゃくちゃ長いタイトルになってしまいました、タイトル通りです。
どうやら以前はタイトルの様な事が出来ていたみたいなのですが、現在は
- 新規のRubyプロジェクトを作成する際のRuby SDKとしてWSL2上のDockerコンテナ内のRuby SDKを選択すること
- 既存プロジェクト内でSDKとして登録したWSL2上のDockerコンテナ内のRuby SDKをProject SDKとして選択すること

の二点が、技術的な要因により出来なくなっているようです。

## 対策
**WSL上のDockerコンテナ内のRuby SDKはProject SDKには設定できませんが、Module SDKとしては設定することが出来ます。**

よって既存プロジェクトに設定する場合は、`Project Structure > Project Settings > Modules > Ruby SDK and Gems`からDockerコンテナ内ののRuby SDKを登録、または登録したSDKをModule SDKとして設定することで問題を回避することが出来ます。
新規プロジェクトの場合は、一度何らかの方法でプロジェクトを作成してから既存プロジェクトとして開き、上記の手順を踏むことで同様に問題を回避するのが現状の対策の様です。

## 公式の今後の対応

現在開発リクエストとして、新規プロジェクトの際にRemote SDKをProject SDKとして選択出来る様に

https://youtrack.jetbrains.com/issue/RUBY-18210/Ability-to-select-remote-interpreter-for-new-projects

が挙がっています。
私と同じ様に困った方は、是非投票をお願いします！

***
タイトルの問題については上記の内容で全てですが、以下に私がこの問題に直面するまでの詳細な経緯とModule SDKとしての設定の手順を記載します。


# やりたくて出来なかったこと
WSL2上のUbuntuにDockerを利用してRailsの環境を作成、ホストのIntelliJからプロジェクトを開いてSDKとしてDockerコンテナ内のRubyを読み込むことでRuby自体やGemの補完等を効かせてもらいたかった。

### だめだったSDK設定の流れ
1. Dockerの設定
`Settings > Build,Execution,Development > Docker`にて一覧上部の`+`を押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418787/f8f55705-f1d8-8c83-8289-73dc9d299619.png)
どうやらデフォルトでいい感じにしてくれるみたいで、設定をいじらずとも設定フォーム下部の左側に接続が成功している旨のメッセージが出ました。


2. SDKの登録
`Project Structure > Platform Settings > SDKs`のSDK一覧上部の`+`から`Add Ruby SDK... > Remote Interpreter or Version Manger...`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418787/21fa94ac-6033-a961-32be-28db7cf520c8.png)
設定用ウィンドウが出てくるので、Docker Composeを選択するとほとんどの欄が埋まっているので`Service`の欄だけ任意のものを選択し、OKを押します。
するとしばらく読み込みが行われ、完了すると一覧に先ほど登録したものが追加されると思います。

3. Project SDKとして選択
`Project Structure > Project Settings > Project`からSDKを選択することで先ほど登録したSDKがこのプロジェクトで使えるようになるはずなので、選択したいのですが利用可能なSDKの一覧に並んでいません。　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418787/fcb1ccac-257e-4493-65c7-9e135359be4a.png)


:::note warn
本来であれば下の画像の様に先ほど追加したSDKが選択できるようになっている状態を想定していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418787/df806bad-110d-10d6-3a31-7f4520e65660.png)
上記の画像はWSL上ではないホスト側に適当なプロジェクトを作って読み込んでいる画像で、WSL上のプロジェクトでなければWSL2上のDockerコンテナ内のRuby SDKでも読み込める様です。
:::

この様にDockerコンテナ内のRuby SDKは登録してもProject SDKとしては読み込めないようになっており、このままでは補完すら効かず、IntelliJの恩恵をほとんど受けることが出来ません。

# 対策：Module SDKとして読み込む
登録したRuby SDKはProject SDKとしては読み込むことが出来ませんでしたが、`Project Structure > Project Settings > Modules`を確認すると先ほど登録したRuby SDKが表示されています。（SDKの名前が変わっていますが、上記の手順で登録したものです。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418787/83ec5d33-2398-5288-46dc-6e8dcdf01ad3.png)
こちらを選択することでModule SDKとしてWSL2上のDockerコンテナ内のSDKを設定することができ、IntelliJの恩恵を最大限受けることが出来るようになりました。

# 謝辞
当初のこの記事ではModule SDKとして設定する対策に行き着いておらず、TwitterにてJetBrainsのCountry ManagerであるMasaru Horioka様にご教示いただき対策まで記載することが出来ました。
また最初に問い合わせたJetbrainsのサポートの方からも補足の連絡を頂き、詳細な確認にご対応頂きました。

この度は手厚いサポートを頂きまして、誠にありがとうございました。
Android Studioの日本語化と「could not find main class com/intellij/idea/main」でハマった場合の対処法

　<strong>Android Studioを日本語化する方法をご紹介します。</strong>（JetBrains使用）
　Pleiades日本語化の際、「could not find main class com/intellij/idea/main」というエラーでハマってしまったので、対処法も記載します。
　
※Windows10環境での方法になります。ご了承ください。
※Android Studioのインストール方法は以下サイトを参考にしました。</strong>
　<strong>Android Studioの環境構築 for Windows【スマートフォン向けアプリ開発】
　https://breezegroup.co.jp/202101/androidstudio/

<h1>もくじ</h1>

1.pleiadesではなくJetBrainsのサイトから日本語言語パックをダウンロードしよう
2.JetBrainsの導入方法（日本語化）
3.「could not find main class com/intellij/idea/main」の対処
4.追記

# 1.pleiadesではなくJetBrainsのサイトから日本語言語パックをダウンロードしよう
　<strong>Android StudioをPleiadesで日本語化するとエラーが発生する場合があります。
</strong>（実際にエラーが発生してハマりました）
 　<strong>JetBrains</strong>をダウンロードし、プラグインを適用する方法がエラーもなくおすすめです。
# 2.JetBrainsの導入方法（日本語化）
 <strong>①Android Studioを起動してビルド番号を確認する</strong>
　起動→左下歯車マーク→About（バージョン情報）
![77071802.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/4b95c527-4947-3787-b420-27566c2ae321.png)
　赤枠の部分のビルド番号を確認する（今回は212）
![22071804.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/ae5f78c3-34b2-f475-1cd7-da02299b09f8.png)
 <strong>②JetBrainsのサイトからビルド番号に対応した日本語言語パックをダウンロードする</strong>
　https://plugins.jetbrains.com/plugin/13964-japanese-language-pack------/versions
　確認したビルド番号に対応する最新のファイルをダウンロードする（赤枠部分）
　<strong>※ダウンロードした.zipファイルは解凍しなくてよい</strong>
![22071805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/d858d03d-2799-91da-b9d1-32e130b6a239.png)
 <strong>③Android Studioでプラグインをインストール</strong>
　Android Studioのプラグイン→ディスクからプラグインをインストール
　Plugins→歯車マーク→Install Plugin form Disk…
![22071806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/2d80bbef-e2a5-eadb-bb4d-78083cd9879e.png)
　ダウンロードした.zip ファイルを指定する。
　![22071807.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/83bb5a0d-751d-9aac-6587-8d45651404a8.png)
　Restart IDE→Restart（Android Studioの再起動）
![22071808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/ab4c7f72-fe39-bc37-ef6e-776ed28ccba5.png)
 日本語化されたことを確認します
![22071809.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/037a3f8c-e741-87dc-47b0-2e0ed7ebc374.png)

# 3. 「could not find main class com/intellij/idea/main」の対処
![22071801.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2608303/a66a553f-6ded-b9aa-e4af-165ec6e38f22.png)
　「could not find main class com/intellij/idea/main」は、Pleiades日本語化に失敗した後Android Studioの再インストールを行った時、Pleiades導入済のAndroid Studioを更新した時などに起きてしまうようです。
　下記の手順を行うことで対処することができます。

　<Strong>①C:\Users\＜ユーザ名＞\AppData\Local\Google\AndroidStudio2021.を削除する</Strong>
　<Strong>②C:\Users\＜ユーザ名＞\AppData\Roaming\Google\AndroidStudio2021.2を削除する</Strong>

# 5. 追記
　Android Studioをアンインストールしてやり直したい場合は、以下のサイトを参考にしてみてください。
　<strong>Android Studioの手動アンインストール</strong>
　https://qiita.com/ydty/items/0a328021172a8f3d6dae
基本情報技術者の問題のメモ

### 疑問 ピクセルとは?
画像入出力装置においてカラー画像を表示するための```最小の単位```を指します。
```1画素＝1ドット```
ドットは```白黒もしくは単色```しか表現できないの対して、下のリンゴの図にあります様に一つのピクセルはフルカラーを表現できます。
ピクセルとは、カラー画像を表すための最小単位ですので、どうしても```赤青緑の三つを組み合わせたもの(1ピクセル＝3ドット)```
ピクセルの説明文の中で```1画素＝1ドット```と言っていながら、次の文で”は必ずしも1画素＝1ドットというわけにはいかない。
出典 https://article.photo-cafeteria.com/DotAndPixel.html

### 疑問　フレームとは?
動画のもとになる静止画像の1コマ1コマのこと
出典 https://kotobank.jp/word/%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%20%28%E5%8B%95%E7%94%BB%29-13981#:~:text=ASCII.jp%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%94%A8%E8%AA%9E%E8%BE%9E%E5%85%B8,%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%20(%E5%8B%95%E7%94%BB)%E3%80%8D%E3%81%AE%E8%A7%A3%E8%AA%AC&text=%E5%8B%95%E7%94%BB%E3%81%AE%E3%82%82%E3%81%A8%E3%81%AB,30fps%E3%81%A7%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82

### 転送速度
コンピューターと周辺機器、またはコンピューター内部の回路における```単位時間あたりのデータ転送量```。一般的に、```1秒あたりに何ビット転送または処理されるか```を表す。```単位はbps```で、キロ（記号はk）・メガ（記号はM）・ギガ（記号はG）・テラ（記号はT）
出典 https://kotobank.jp/word/%E8%BB%A2%E9%80%81%E9%80%9F%E5%BA%A6-6543

### 最高周波数
インバータが出力する周波数の最大出力値。
出典 https://www.fa.omron.co.jp/guide/glossary/meaning/3830.html#:~:text=%E8%A7%A3%E8%AA%AC&text=%E3%82%A4%E3%83%B3%E3%83%90%E3%83%BC%E3%82%BF%E3%81%8C%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E5%91%A8%E6%B3%A2%E6%95%B0%E3%81%AE%E6%9C%80%E5%A4%A7%E5%87%BA%E5%8A%9B%E5%80%A4%E3%80%82

### 最大振幅
振動の“強さ”または“高さ”を振幅と呼びます
出典 https://www.emf-portal.org/ja/cms/page/home/technology/general
### 再生周波数
再生周波数帯域はある条件で測定可能な音声信号の範囲を意味しています。
出典 https://www.jas-audio.or.jp/headphone-earphone/headphone-ability#:~:text=%E5%86%8D%E7%94%9F%E5%91%A8%E6%B3%A2%E6%95%B0%E5%B8%AF%E5%9F%9F%E3%81%AF%E3%81%82%E3%82%8B,%E3%81%8C%E4%BF%9D%E8%A8%BC%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

#### 気づき
最大周波数、最大振幅、再生周波数の説明を聞いても腑に落ちない。
これからまたでできたらしっかりと調べてみようと思う。

# 演習を解いての気づき
* 一つのドットを１６進数で表現している。それを全てのビットをかける。ビットをバイトへ変換する。
* 最低限の必要な帯域幅を求めるからちょうどじゃなくていい。
* サンプリング間隔を逆数にすると回数になる。ことを計算をしていて理解した。
* 計算が気に食わなかったら自分で計算をして確かめる。
* ビット数しかあとはデータ量が変化しない。


* 転送速度を求め、そこで1秒当たりのデータ量をバイトに戻し、割り算をする。
resourcesのネスト

resourcesのネストをするケース

• モデル間で関連付けが設定されており、親子両方の情報をURLに含めたい場合

routes.rb

```ruby
resources :boards do
  resources :comments
end
# => /boards/:board_id/comments/:comment_id といったURLが得られる
```

このようにする場合

```ruby
#model/board.rb
has_many :comments

#model/comment.rb
belongs_to :board
```

と関連付けてある必要がある。
SwiftUIで円形プログレスバーを作成する

# 環境
- macOS Monteley(12.4)
- Xcode(13.4.1)
- Swift(5.6.1)

# 実装
執筆時点で標準では用意されていないようなので、Circleを利用して実装してみました。
あまり一般的ではないと思いますが、逆回転にも対応している実装になります。
~~~ CirclarProgress.swift
struct CirclarProgress: View {
    let progress: Int
    let color: Color
    let isInserve: Bool
    let strokeWidth: CGFloat
    var lineCap: CGLineCap = .butt
    var angle: Double = -90
    private var from: Double {
        if isInserve {
            return 1 - Double(progress) / 100
        } else {
            return 0.0
        }
    }
    private var to: Double {
        if isInserve {
            return 1
        } else {
            return Double(progress) / 100
        }
    }
    private var offset: CGFloat {
        strokeWidth / 2
    }

    var body: some View {
        Circle()
            .trim(from: from, to: to)
            .stroke(color, style: StrokeStyle(lineWidth: CGFloat(strokeWidth), lineCap: lineCap))
            .rotationEffect(Angle(degrees: angle))
            .padding(offset)
            .aspectRatio(1, contentMode: .fit)
            .animation(.easeOut, value: progress)
    }
}
~~~

### 動作イメージ
※背景は別途配置しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/926798/bba8bd4e-f85b-6c9a-ec52-5bd020004fcf.gif" width="25%">


# 備考
- strokeの描画はCircleの縁から内と外に向かって広がるため、Circleに設定したsizeで表示を収めたい場合は、strokeで設定した幅の半分のpaddingが必要になります。
- strokeの描画が3時の方向から始まるため、90度傾けることで0時の方向から始まるようにしています。(ソースではカスタマイズ可能にしています。)
- バーの背景は単純に透過カラーであったり、ゲージを入れたいこともあると思うので、あえて含めていないです。
- colorの部分にGradientを渡すことでグラデーションをつけることも可能です。
- アニメーションはお好みで

# 参考
Circle: https://developer.apple.com/documentation/swiftui/circle
stroke: https://developer.apple.com/documentation/swiftui/shape/stroke(_:style:)
配列を連想配列に変換する (JavaScript)

## 概要
キーとなるプロパティを持つオブジェクトの配列を連想配列に変換する場合、`Array.prototype.reduce()`と`Object.defineProperty()`を使って以下のように書ける。

``` index.js
const hash = array.reduce((p, c) => Object.defineProperty(p, c.key, { value: c }), {}); 
```
補遺：[コメントで頂いた方法がコンパクトなのでそちらも参照](https://qiita.com/kago/items/516cdb53e71d778bf55e#comments)

## サンプルコード
配列を連想配列に変換し、キーを使って値を取り出すサンプルコード。

``` sample.js
const array = [
  { code: 'F001', name: 'Apple', price: 250 },
  { code: 'F002', name: 'Banana', price: 200 },
  { code: 'F003', name: 'Cherry', price: 500 },
  { code: 'F004', name: 'Durian', price: 5000 },
];

const hash = array.reduce((p, c) => Object.defineProperty(p, c.code, { value: c }), {}); 

console.log(hash['F003'].name); // Cherry
```
MATLABの作業環境を整える（レイアウト, ドックからの出し入れ）

私の記念すべき最初の記事となります。

本記事は1回目のMATLAB記事です。

そもそもQiitaにはMATLAB初心者向けの記事がPython、Java、C言語などに比べて少ないように感じました。

そこで、そんな記事を少しでも増やそうと思いMATLAB記事の連載を始めました。

今回は「レイアウト」と「ドックからの出し入れ」についてです。

前者はMATLAB作業画面のデザイン、後者は編集中のmファイルをドックから出し入れする方法について解説します。

初心者の方はそもそも知らなかったり、あるいはあまり意識しないかもしれませんね。
ただこういう細かい情報を知っていると作業中の無駄なストレスを無くすことができます。

# レイアウト

まずは一つ目のレイアウトについてです。

MATLABの上側にある「ホーム」をクリックすると下の画像のように色んな項目が出てきます。
その中で「レイアウト」をクリックするとMATLABのターミナルの見た目を変更できます。

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/864bd879-a341-da8e-6355-db7f7a83a57c.png)

今は「既定の設定」になっています。試しに「３列」を選択してみましょう。
すると下の画像のようになります。

![fig1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/d97d8883-51b9-beaa-8ad2-522446af2d1c.png)



先ほどまで左下にあったワークスペースが右側に移動していますね。
ワークスペース欄にはプログラムを実行した際に作られた変数が全て表示されます。

長い、あるいは大規模なプログラムを実行するとたくさんの変数が作られます。
左下のワークスペースにそれらを表示されると、ただでさえ枠が小さいのにたくさんあって把握しにくいことがあります。

そこでワークスペースを右側に移動させることで、明らかに把握しやすくなりました。

他にも様々なレイアウトがあるので、作業しやすいお気に入りのレイアウトを見つけてみてはいかがでしょうか。

:::note info
ポイント：「ホーム」の「レイアウト」からMATLAB作業画面の見た目を変更できる。
:::


# ドックからの出し入れ

次にmファイルをドックから出し入れする方法についてです。

インストールした最初の状態だとmファイルは下の画像のような場所（ドック）に出てきます。

画像では新規mファイル(untitled)を出してそのことを示していますが、既存mファイルの開いた時も同様です。

![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/ca97b1db-ffd0-63a6-a41d-d082f799b508.png)


ここで、ファイル名のところをクリックしたまま外側へ持っていって（ドラッグアンドドロップして）みましょう。

するとmファイル青枠で囲まれまた後、下の画像のようにドックからmファイルを出すことができました。

![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/c449d160-f6bb-a439-7507-e5d67a4a8d90.png)


これを元に戻したい、つまりドックへ入れたい時は右上の×マークのすぐ下にある「⤵」みたいな記号をクリックしましょう。

ドックから出すメリットとして下の画像のようにコマンドウィンドウとプログラムを同じ画面に並べることができます。


![fig5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2736302/443087d3-4476-0b7c-39f5-3060875723c0.png)

実行したプログラムとその実行結果を同時に見ることができるのです。

また、単純にプログラム（mファイル）全体を見たい時にも便利です。

適宜、取り出すと作業が捗るかもしれません。


:::note info
ポイント：mファイルをドックから出し入れすることができる。
:::



# 終わりに

私はノベルゲームが好きでゲーム内のオプション設定から自分のプレイしやすい環境を整えます。

そのオプション画面を開くと作中キャラクターの誰かがしゃべるのですが、ある台詞がすごく印象に残っています。

”細部までこだわるのが美徳というものです”

どうでもいい事かもしれないが、それでもこだわりたいものなんですよね。

※本記事に対する改善点や修正点、またはこんな事が知りたいといったご意見がありましたらぜひご連絡ください。

# 参考HP

https://jp.mathworks.com/?s_tid=gn_logo
ブログまたは記事ページに貼り付ける構造化データのJson記述方法の備忘録

# 記事ページの構造化データコード

```
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BlogPosting",
  "mainEntityOfPage": {
    "@type": "WebPage",
    "@id": "https://abcd.com"
  },
  "headline": "見出しなどを記載(seoで自社サイトの検索結果の表示範囲を限りなく広げる方法とは？実践しただけでクリック率120%UPした事例などを紹介)",
  "description": "自社サイトの検索結果に質疑応答ページが追加されてクリック率 UPした件",
  "image": "https://thumnail-img.com",  
  "author": {
    "@type": "Organization",
    "name": "abcdcorporation",
    "url": "https://abcdcorporation.com",
    "sameAs": "https://twitter.com/abcdcorporation",
    "honorificPrefix": "デザイナー",
    "jobTitle": "代表取締役"
  },  
  "publisher": {
    "@type": "Organization",
    "name": "abcdcorporation",
    "logo": {
      "@type": "ImageObject",
      "url": "https://sunnycorporation-logo-Icon-120x120.png"
    }
  },
  "datePublished": "2022-07-06",
  "dateModified": "2022-07-18"
}
</script>
```

※type: "BlogPosting",　⇨こちらは、NewsArticleでもOK
※authorが2人いた場合は2名分書きましょうとGoogleが推奨。書き方は以下配列で書きます
```
"author": [{
    "@type": "Person",
    "name": "Jane Doe",
    "url": "http://example.com/profile/janedoe123"
  },{
    "@type": "Person",
    "name": "John Doe",
    "url": "http://example.com/profile/johndoe123"
}]
```
※"sameAs"はsnsのIDやwikiなど記載(異なる媒体で顔となっているプロフィールがあれば記載)


以上です。
間違っている、ここはこうした方がいいかも？等々ございましたらご指摘いただけますと幸いです。
最後まで見ていただいた方、ありがとうございました。
【AWS】運用支援/監視ツール

# CloudWatch
多くのAWSサービスはCloudWatchによる監視に対応しており、対応しているAWSサービスから情報（監視対象のパフォーマンス項目、例えばCPU使用率など）が収集される。
ちゃんとした言葉で表すと「AWSリソースの状態（メトリクス）を定期的に取得するもの」である。
AWSが標準で定義しているメトリクスについては以下に記載されている。これらはCloudWatchでデフォルトでログ収集が可能。ここにないものも独自に定義することが可能。（カスタムメトリクスと呼ぶ）


標準メトリクスにメモリ使用率は含まれていない。（※2022年7月時点）

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/aws-services-cloudwatch-metrics.html

## CloudWatch Logs
ひたすらログ収集を行うもの。独自のエージェントをインストールする必要がある。
特定の文字列を検出するといったことが可能。例えば「ERROR」や「WARN」といったログが一定期間内に3回以上検出されたときにアラームを動作させるといったことが想定される。


## CloudWatch Events
収集された情報をもとにトリガーを設定し、何らかのアクションを実行するもの。
例えば、
>・Webサーバー用のEC2インスタンスのCPU使用率が80%を上回ったとき
・定期実行するLambda関数が一定期間に3回異常エラーを出した時




# CloudTrail
AWSに関する操作ログを自動的に取得するサービス。具体的にはログインなどのユーザーアクティビティとAPI操作を指す。「誰が」「いつ」「どのような操作をしたか」といった監査ログを残しておくことで、重大な障害やインシデントが起きてしまった時に分析をすることができる。
イメージとしては飛行機のフライトレコーダーと同じ。墜落してしまった時に事故原因の分析に利用されるやつ。
デフォルトでは管理イベントの取得のみが有効となっており、過去90日分のログをコンソール上で確認可能。設定を変えればデータイベントについても確認可能となる。

>管理イベント：マネジメントコンソールへのログイン、EC2インスタンスの作成、S3バケットの作成など
データイベント：S3バケット上のデータ操作、Lambda関数の実行など

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2665477/cb35ddc5-b67c-f46a-882b-5fdef9f20839.png)
画像引用：[Wikipediaより](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9_%28%E8%88%AA%E7%A9%BA%29)

## CloudTrailとCloudWatch Logsとの連携
CloudTrailだけでも各ユーザの操作を追跡することができて意味があることではある。ただ、事後検証に役立つツールとしてだけではなく、できれば事前に異常を検知してほしいものである。
そこでCloudWatch Logsと連携をしてやることで、とあるユーザが不正な操作をしている場合に（「WARN」のログがやたら発生している等）にアラートを出したりすることが可能となる。

# 参考
https://www.acrovision.jp/service/aws/?p=2222